[med-svn] [gwyddion] 01/04: New upstream version 2.49

Andreas Tille tille at debian.org
Thu Sep 21 09:04:30 UTC 2017


This is an automated email from the git hooks/post-receive script.

tille pushed a commit to branch master
in repository gwyddion.

commit 603ecfc4616f38e5bc8cfb81050b23d8898c875c
Author: Andreas Tille <tille at debian.org>
Date:   Thu Sep 21 11:02:50 2017 +0200

    New upstream version 2.49
---
 AUTHORS                                            |     4 +
 INSTALL.gwyddion                                   |   165 -
 Makefile.am                                        |     3 +-
 Makefile.in                                        |    27 +-
 NEWS                                               |   219 +-
 README                                             |     1 -
 TODO                                               |     1 +
 app/Makefile.am                                    |    42 +-
 app/Makefile.in                                    |    59 +-
 app/about.c                                        |    75 +-
 app/app.c                                          |   458 +-
 app/authors.h                                      |    95 +-
 app/data-browser-aux.c                             |   296 +-
 app/data-browser.c                                 |   194 +-
 app/data-browser.h                                 |     9 +-
 app/file.c                                         |    11 +-
 app/gwyappfilechooser.c                            |    39 +-
 app/gwyappinternal.h                               |     5 +-
 app/gwyddion.c                                     |   114 +-
 app/gwymoduleutils-file.c                          |    38 +-
 app/help.c                                         |   116 +-
 app/mac_integration.c                              |     3 +-
 app/menu.c                                         |    11 +-
 app/release.h                                      |     3 +
 app/remote-win32.c                                 |     5 +-
 app/splash.c                                       |   849 +-
 app/toolbox-editor.c                               |   116 +-
 app/toolbox.c                                      |   147 +-
 app/toolbox.xml                                    |     5 +-
 app/undo.c                                         |     5 +-
 app/validate.c                                     |    44 +-
 app/wait.c                                         |    95 +-
 app/wait.h                                         |    24 +-
 config.guess                                       |   165 +-
 config.h.in                                        |     3 -
 config.sub                                         |    52 +-
 configure                                          |  1262 +-
 configure.ac                                       |   316 +-
 data/Makefile.in                                   |    16 +-
 data/glmaterials/Makefile.in                       |    16 +-
 data/gradients/Code-V                              |    28 +-
 data/gradients/Gray-inverted                       |     3 +
 data/gradients/Makefile.am                         |     5 +-
 data/gradients/Makefile.in                         |    21 +-
 data/gradients/Spectral-white                      |    13 +
 data/gradients/Viridis                             |    14 +
 data/gwyddion-thumbnailer.schemas.in               |     6 +
 data/gwyddion.1                                    |    41 +-
 data/gwyddion.nsit.in                              |    20 +-
 data/gwyddion.pc.in                                |     2 +-
 data/gwyddion.spec.in                              |   126 +-
 data/gwyddion.vim                                  |    16 +-
 data/gwyddion.xml                                  |    17 +
 data/mingw-gwyddion-libs.spec.in                   |     7 +-
 devel-docs/Makefile.in                             |    16 +-
 devel-docs/libgwyapp/Makefile.in                   |    16 +-
 devel-docs/libgwyapp/html/GwyDataChooser.html      |    32 +-
 devel-docs/libgwyapp/html/GwyPlainTool.html        |    32 +-
 devel-docs/libgwyapp/html/GwyResourceEditor.html   |    18 +-
 devel-docs/libgwyapp/html/GwyTool.html             |    30 +-
 devel-docs/libgwyapp/html/api-index-2-14.html      |     2 +-
 devel-docs/libgwyapp/html/api-index-2-18.html      |     2 +-
 devel-docs/libgwyapp/html/api-index-2-21.html      |     2 +-
 devel-docs/libgwyapp/html/api-index-2-23.html      |     2 +-
 devel-docs/libgwyapp/html/api-index-2-3.html       |     2 +-
 devel-docs/libgwyapp/html/api-index-2-32.html      |     2 +-
 devel-docs/libgwyapp/html/api-index-2-33.html      |     2 +-
 devel-docs/libgwyapp/html/api-index-2-35.html      |     2 +-
 devel-docs/libgwyapp/html/api-index-2-38.html      |     2 +-
 devel-docs/libgwyapp/html/api-index-2-41.html      |     2 +-
 devel-docs/libgwyapp/html/api-index-2-42.html      |     2 +-
 devel-docs/libgwyapp/html/api-index-2-43.html      |     2 +-
 devel-docs/libgwyapp/html/api-index-2-45.html      |     2 +-
 devel-docs/libgwyapp/html/api-index-2-46.html      |     2 +-
 devel-docs/libgwyapp/html/api-index-2-47.html      |     5 +-
 devel-docs/libgwyapp/html/api-index-2-48.html      |    42 +
 devel-docs/libgwyapp/html/api-index-2-49.html      |    33 +
 devel-docs/libgwyapp/html/api-index-2-7.html       |     2 +-
 devel-docs/libgwyapp/html/api-index-2-9.html       |     2 +-
 devel-docs/libgwyapp/html/api-index-all.html       |    18 +-
 devel-docs/libgwyapp/html/index.html               |     6 +-
 .../html/libgwyapp-GwyGLMaterialEditor.html        |     4 +-
 .../html/libgwyapp-GwyGradientEditor.html          |     4 +-
 devel-docs/libgwyapp/html/libgwyapp-Validate.html  |    18 +-
 devel-docs/libgwyapp/html/libgwyapp-app.html       |    16 +-
 .../libgwyapp/html/libgwyapp-data-browser.html     |   274 +-
 .../html/libgwyapp-file-module-utils.html          |    73 +-
 devel-docs/libgwyapp/html/libgwyapp-file.html      |    12 +-
 devel-docs/libgwyapp/html/libgwyapp-filelist.html  |    12 +-
 devel-docs/libgwyapp/html/libgwyapp-funcuse.html   |    18 +-
 devel-docs/libgwyapp/html/libgwyapp-help.html      |    26 +-
 devel-docs/libgwyapp/html/libgwyapp-log.html       |    24 +-
 devel-docs/libgwyapp/html/libgwyapp-logging.html   |    10 +-
 devel-docs/libgwyapp/html/libgwyapp-menu.html      |    38 +-
 devel-docs/libgwyapp/html/libgwyapp-meta.html      |    10 +-
 .../libgwyapp/html/libgwyapp-module-utils.html     |    32 +-
 devel-docs/libgwyapp/html/libgwyapp-settings.html  |    16 +-
 devel-docs/libgwyapp/html/libgwyapp-undo.html      |    42 +-
 devel-docs/libgwyapp/html/libgwyapp-wait.html      |   106 +-
 devel-docs/libgwyapp/html/libgwyapp.devhelp2       |     6 +
 devel-docs/libgwyapp/libgwyapp-docs.sgml           |    42 +-
 devel-docs/libgwyddion/Makefile.in                 |    16 +-
 devel-docs/libgwyddion/html/GwyContainer.html      |   209 +-
 devel-docs/libgwyddion/html/GwyEnum.html           |    20 +-
 devel-docs/libgwyddion/html/GwyFDCurvePreset.html  |     6 +-
 devel-docs/libgwyddion/html/GwyInventory.html      |    72 +-
 devel-docs/libgwyddion/html/GwyNLFitPreset.html    |    26 +-
 devel-docs/libgwyddion/html/GwyResource.html       |    48 +-
 devel-docs/libgwyddion/html/GwySIUnit.html         |   100 +-
 devel-docs/libgwyddion/html/GwySerializable.html   |    40 +-
 devel-docs/libgwyddion/html/GwyStringList.html     |    22 +-
 devel-docs/libgwyddion/html/api-index-2-1.html     |     2 +-
 devel-docs/libgwyddion/html/api-index-2-11.html    |     2 +-
 devel-docs/libgwyddion/html/api-index-2-12.html    |     2 +-
 devel-docs/libgwyddion/html/api-index-2-22.html    |     2 +-
 devel-docs/libgwyddion/html/api-index-2-25.html    |     2 +-
 devel-docs/libgwyddion/html/api-index-2-26.html    |     2 +-
 devel-docs/libgwyddion/html/api-index-2-35.html    |     2 +-
 devel-docs/libgwyddion/html/api-index-2-36.html    |     2 +-
 devel-docs/libgwyddion/html/api-index-2-37.html    |     2 +-
 devel-docs/libgwyddion/html/api-index-2-38.html    |     2 +-
 devel-docs/libgwyddion/html/api-index-2-39.html    |     2 +-
 devel-docs/libgwyddion/html/api-index-2-4.html     |     2 +-
 devel-docs/libgwyddion/html/api-index-2-42.html    |     2 +-
 devel-docs/libgwyddion/html/api-index-2-43.html    |     2 +-
 devel-docs/libgwyddion/html/api-index-2-44.html    |     2 +-
 devel-docs/libgwyddion/html/api-index-2-45.html    |     2 +-
 devel-docs/libgwyddion/html/api-index-2-46.html    |     2 +-
 devel-docs/libgwyddion/html/api-index-2-47.html    |     5 +-
 devel-docs/libgwyddion/html/api-index-2-48.html    |    38 +
 devel-docs/libgwyddion/html/api-index-2-49.html    |    49 +
 devel-docs/libgwyddion/html/api-index-2-5.html     |     2 +-
 devel-docs/libgwyddion/html/api-index-2-7.html     |     2 +-
 devel-docs/libgwyddion/html/api-index-2-8.html     |     2 +-
 devel-docs/libgwyddion/html/api-index-2-9.html     |     2 +-
 devel-docs/libgwyddion/html/api-index-all.html     |    30 +-
 devel-docs/libgwyddion/html/api-index-deprec.html  |     2 +-
 devel-docs/libgwyddion/html/index.html             |     6 +-
 .../libgwyddion/html/libgwyddion-GwyExpr.html      |    28 +-
 .../libgwyddion/html/libgwyddion-GwyNLFitter.html  |    69 +-
 .../html/libgwyddion-GwyRandGenSet.html            |    32 +-
 .../html/libgwyddion-GwySIValueFormat.html         |    14 +-
 .../html/libgwyddion-Math-Fallback.html            |    22 +-
 devel-docs/libgwyddion/html/libgwyddion-Math.html  |   354 +-
 .../libgwyddion/html/libgwyddion-gwyddion.html     |     4 +-
 .../html/libgwyddion-gwyddionenums.html            |     8 +-
 .../html/libgwyddion-gwydebugobjects.html          |    16 +-
 .../libgwyddion/html/libgwyddion-gwyentities.html  |    12 +-
 .../libgwyddion/html/libgwyddion-gwymacros.html    |    36 +-
 .../libgwyddion/html/libgwyddion-gwymd5.html       |     6 +-
 .../libgwyddion/html/libgwyddion-gwyutils.html     |   206 +-
 .../libgwyddion/html/libgwyddion-gwyversion.html   |    10 +-
 devel-docs/libgwyddion/html/libgwyddion.devhelp2   |     9 +
 devel-docs/libgwyddion/libgwyddion-docs.sgml       |    54 +-
 devel-docs/libgwydgets/Makefile.in                 |    16 +-
 devel-docs/libgwydgets/html/DataWindowWidgets.html |     2 +-
 devel-docs/libgwydgets/html/GeneralWidgets.html    |     9 +-
 devel-docs/libgwydgets/html/GraphWidgets.html      |     2 +-
 devel-docs/libgwydgets/html/Gwy3DLabel.html        |    22 +-
 devel-docs/libgwydgets/html/Gwy3DSetup.html        |    60 +-
 devel-docs/libgwydgets/html/Gwy3DView.html         |    54 +-
 devel-docs/libgwydgets/html/Gwy3DWindow.html       |    18 +-
 devel-docs/libgwydgets/html/GwyAdjustBar.html      |   815 +
 devel-docs/libgwydgets/html/GwyAxis.html           |    48 +-
 devel-docs/libgwydgets/html/GwyColorAxis.html      |    36 +-
 devel-docs/libgwydgets/html/GwyColorButton.html    |    22 +-
 devel-docs/libgwydgets/html/GwyCurve.html          |    12 +-
 devel-docs/libgwydgets/html/GwyDataView.html       |    74 +-
 devel-docs/libgwydgets/html/GwyDataViewLayer.html  |    24 +-
 devel-docs/libgwydgets/html/GwyDataWindow.html     |    28 +-
 devel-docs/libgwydgets/html/GwyGraph.html          |    30 +-
 devel-docs/libgwydgets/html/GwyGraphArea.html      |    48 +-
 devel-docs/libgwydgets/html/GwyGraphCorner.html    |     6 +-
 .../libgwydgets/html/GwyGraphCurveModel.html       |    48 +-
 devel-docs/libgwydgets/html/GwyGraphCurves.html    |    12 +-
 devel-docs/libgwydgets/html/GwyGraphData.html      |    12 +-
 devel-docs/libgwydgets/html/GwyGraphLabel.html     |    16 +-
 devel-docs/libgwydgets/html/GwyGraphModel.html     |    56 +-
 devel-docs/libgwydgets/html/GwyGraphWindow.html    |    16 +-
 devel-docs/libgwydgets/html/GwyHMarkerBox.html     |     6 +-
 devel-docs/libgwydgets/html/GwyHRuler.html         |     6 +-
 devel-docs/libgwydgets/html/GwyInventoryStore.html |    16 +-
 devel-docs/libgwydgets/html/GwyLayerBasic.html     |    34 +-
 devel-docs/libgwydgets/html/GwyLayerMask.html      |    14 +-
 devel-docs/libgwydgets/html/GwyMarkerBox.html      |    52 +-
 devel-docs/libgwydgets/html/GwyNullStore.html      |    20 +-
 devel-docs/libgwydgets/html/GwyPixmapLayer.html    |    18 +-
 devel-docs/libgwydgets/html/GwyRuler.html          |    22 +-
 devel-docs/libgwydgets/html/GwySciText.html        |    22 +-
 .../libgwydgets/html/GwySelectionGraph1DArea.html  |     8 +-
 .../libgwydgets/html/GwySelectionGraphArea.html    |     6 +-
 .../libgwydgets/html/GwySelectionGraphLine.html    |     8 +-
 .../libgwydgets/html/GwySelectionGraphPoint.html   |     6 +-
 .../libgwydgets/html/GwySelectionGraphZoom.html    |     6 +-
 .../libgwydgets/html/GwySensitivityGroup.html      |    20 +-
 devel-docs/libgwydgets/html/GwyShader.html         |    32 +-
 devel-docs/libgwydgets/html/GwyStatusbar.html      |    10 +-
 devel-docs/libgwydgets/html/GwyVRuler.html         |     6 +-
 devel-docs/libgwydgets/html/GwyVectorLayer.html    |    44 +-
 devel-docs/libgwydgets/html/WidgetUtilities.html   |     2 +-
 devel-docs/libgwydgets/html/Widgets3D.html         |     2 +-
 devel-docs/libgwydgets/html/api-index-2-1.html     |     2 +-
 devel-docs/libgwydgets/html/api-index-2-11.html    |     2 +-
 devel-docs/libgwydgets/html/api-index-2-14.html    |     2 +-
 devel-docs/libgwydgets/html/api-index-2-16.html    |     2 +-
 devel-docs/libgwydgets/html/api-index-2-22.html    |     2 +-
 devel-docs/libgwydgets/html/api-index-2-23.html    |     2 +-
 devel-docs/libgwydgets/html/api-index-2-26.html    |     2 +-
 devel-docs/libgwydgets/html/api-index-2-29.html    |     2 +-
 devel-docs/libgwydgets/html/api-index-2-3.html     |     2 +-
 devel-docs/libgwydgets/html/api-index-2-34.html    |     2 +-
 devel-docs/libgwydgets/html/api-index-2-37.html    |     2 +-
 devel-docs/libgwydgets/html/api-index-2-38.html    |     2 +-
 devel-docs/libgwydgets/html/api-index-2-39.html    |     2 +-
 devel-docs/libgwydgets/html/api-index-2-41.html    |     2 +-
 devel-docs/libgwydgets/html/api-index-2-42.html    |     2 +-
 devel-docs/libgwydgets/html/api-index-2-43.html    |     2 +-
 devel-docs/libgwydgets/html/api-index-2-45.html    |     2 +-
 devel-docs/libgwydgets/html/api-index-2-46.html    |     5 +-
 devel-docs/libgwydgets/html/api-index-2-48.html    |    70 +
 devel-docs/libgwydgets/html/api-index-2-49.html    |   142 +
 devel-docs/libgwydgets/html/api-index-2-5.html     |     2 +-
 devel-docs/libgwydgets/html/api-index-2-7.html     |     2 +-
 devel-docs/libgwydgets/html/api-index-2-8.html     |     2 +-
 devel-docs/libgwydgets/html/api-index-all.html     |   176 +-
 devel-docs/libgwydgets/html/api-index-deprec.html  |     2 +-
 devel-docs/libgwydgets/html/gwy_3d_base-24.png     |   Bin 1316 -> 1119 bytes
 devel-docs/libgwydgets/html/gwy_arithmetic-24.png  |   Bin 314 -> 250 bytes
 devel-docs/libgwydgets/html/gwy_bold-20.png        |   Bin 282 -> 353 bytes
 devel-docs/libgwydgets/html/gwy_cantilever-24.png  |   Bin 642 -> 558 bytes
 devel-docs/libgwydgets/html/gwy_color_range-24.png |   Bin 426 -> 354 bytes
 .../html/gwy_color_range_adaptive-24.png           |   Bin 674 -> 863 bytes
 .../libgwydgets/html/gwy_color_range_auto-24.png   |   Bin 592 -> 432 bytes
 .../libgwydgets/html/gwy_color_range_fixed-24.png  |   Bin 429 -> 391 bytes
 .../libgwydgets/html/gwy_color_range_full-24.png   |   Bin 334 -> 234 bytes
 devel-docs/libgwydgets/html/gwy_convolution-24.png |   Bin 323 -> 337 bytes
 .../libgwydgets/html/gwy_correct_affine-24.png     |   Bin 1292 -> 721 bytes
 .../libgwydgets/html/gwy_correlation_mask-24.png   |   Bin 0 -> 361 bytes
 devel-docs/libgwydgets/html/gwy_crop-24.png        |   Bin 746 -> 452 bytes
 devel-docs/libgwydgets/html/gwy_cwt-24.png         |   Bin 589 -> 716 bytes
 .../libgwydgets/html/gwy_data_measure-24.png       |   Bin 228 -> 214 bytes
 .../libgwydgets/html/gwy_disconnected-24.png       |   Bin 0 -> 486 bytes
 devel-docs/libgwydgets/html/gwy_distance-24.png    |   Bin 973 -> 316 bytes
 .../libgwydgets/html/gwy_distance_transform-24.png |   Bin 1187 -> 786 bytes
 .../libgwydgets/html/gwy_distribution_angle-24.png |   Bin 689 -> 689 bytes
 .../libgwydgets/html/gwy_distribution_slope-24.png |   Bin 580 -> 654 bytes
 devel-docs/libgwydgets/html/gwy_drift-24.png       |   Bin 1396 -> 1468 bytes
 devel-docs/libgwydgets/html/gwy_dwt-24.png         |   Bin 640 -> 815 bytes
 devel-docs/libgwydgets/html/gwy_edge-24.png        |   Bin 190 -> 190 bytes
 .../html/gwy_enforce_distribution-24.png           |   Bin 647 -> 766 bytes
 devel-docs/libgwydgets/html/gwy_entropy-24.png     |   Bin 305 -> 203 bytes
 devel-docs/libgwydgets/html/gwy_extend-24.png      |   Bin 262 -> 535 bytes
 .../libgwydgets/html/gwy_extract_path-24.png       |   Bin 989 -> 1065 bytes
 devel-docs/libgwydgets/html/gwy_facet_level-24.png |   Bin 1089 -> 1193 bytes
 devel-docs/libgwydgets/html/gwy_favourite-24.png   |   Bin 1219 -> 1146 bytes
 devel-docs/libgwydgets/html/gwy_fft-24.png         |   Bin 484 -> 728 bytes
 devel-docs/libgwydgets/html/gwy_fft_2d-24.png      |   Bin 337 -> 657 bytes
 .../libgwydgets/html/gwy_fft_filter_1d-24.png      |   Bin 0 -> 611 bytes
 .../libgwydgets/html/gwy_fft_filter_2d-24.png      |   Bin 367 -> 300 bytes
 devel-docs/libgwydgets/html/gwy_filter-24.png      |   Bin 1069 -> 311 bytes
 devel-docs/libgwydgets/html/gwy_find_peaks-24.png  |   Bin 539 -> 676 bytes
 devel-docs/libgwydgets/html/gwy_fit_shape-24.png   |   Bin 0 -> 1244 bytes
 devel-docs/libgwydgets/html/gwy_fix_zero-24.png    |   Bin 509 -> 385 bytes
 .../libgwydgets/html/gwy_flip_horizontally-24.png  |   Bin 809 -> 585 bytes
 .../libgwydgets/html/gwy_flip_vertically-24.png    |   Bin 855 -> 567 bytes
 devel-docs/libgwydgets/html/gwy_fractal-24.png     |   Bin 943 -> 710 bytes
 .../libgwydgets/html/gwy_fractal_correction-24.png |   Bin 0 -> 734 bytes
 .../libgwydgets/html/gwy_fractal_measure-24.png    |   Bin 0 -> 698 bytes
 devel-docs/libgwydgets/html/gwy_gl_material-16.png |   Bin 759 -> 829 bytes
 .../html/gwy_gradient_horizontal-24.png            |   Bin 854 -> 615 bytes
 .../libgwydgets/html/gwy_gradient_vertical-24.png  |   Bin 842 -> 613 bytes
 .../libgwydgets/html/gwy_grain_correlation-24.png  |   Bin 1007 -> 732 bytes
 .../html/gwy_grain_exscribed_circle-24.png         |   Bin 964 -> 531 bytes
 .../html/gwy_grain_inscribed_circle-24.png         |   Bin 1023 -> 634 bytes
 devel-docs/libgwydgets/html/gwy_grains-24.png      |   Bin 748 -> 424 bytes
 devel-docs/libgwydgets/html/gwy_grains_edge-24.png |   Bin 1054 -> 492 bytes
 .../libgwydgets/html/gwy_grains_edge_remove-24.png |   Bin 699 -> 1232 bytes
 .../libgwydgets/html/gwy_grains_graph-24.png       |   Bin 989 -> 430 bytes
 .../libgwydgets/html/gwy_grains_measure-24.png     |   Bin 316 -> 573 bytes
 .../libgwydgets/html/gwy_grains_remove-24.png      |   Bin 881 -> 493 bytes
 .../libgwydgets/html/gwy_grains_water-24.png       |   Bin 1172 -> 1055 bytes
 devel-docs/libgwydgets/html/gwy_graph-24.png       |   Bin 330 -> 697 bytes
 devel-docs/libgwydgets/html/gwy_graph_align-24.png |   Bin 503 -> 555 bytes
 devel-docs/libgwydgets/html/gwy_graph_cut-24.png   |   Bin 417 -> 523 bytes
 devel-docs/libgwydgets/html/gwy_graph_dos-24.png   |   Bin 591 -> 1083 bytes
 .../libgwydgets/html/gwy_graph_export_ascii-24.png |   Bin 721 -> 314 bytes
 .../libgwydgets/html/gwy_graph_export_png-24.png   |   Bin 742 -> 314 bytes
 .../html/gwy_graph_export_vector-24.png            |   Bin 803 -> 401 bytes
 devel-docs/libgwydgets/html/gwy_graph_fd-24.png    |   Bin 407 -> 805 bytes
 .../libgwydgets/html/gwy_graph_filter-24.png       |   Bin 497 -> 864 bytes
 .../libgwydgets/html/gwy_graph_function-24.png     |   Bin 534 -> 993 bytes
 .../libgwydgets/html/gwy_graph_halfgauss-24.png    |   Bin 280 -> 473 bytes
 devel-docs/libgwydgets/html/gwy_graph_level-24.png |   Bin 445 -> 986 bytes
 .../libgwydgets/html/gwy_graph_measure-24.png      |   Bin 376 -> 628 bytes
 .../libgwydgets/html/gwy_graph_palette-24.png      |   Bin 529 -> 487 bytes
 .../libgwydgets/html/gwy_graph_pointer-24.png      |   Bin 915 -> 851 bytes
 devel-docs/libgwydgets/html/gwy_graph_ruler-24.png |   Bin 588 -> 611 bytes
 .../libgwydgets/html/gwy_graph_vertical-24.png     |   Bin 330 -> 643 bytes
 .../libgwydgets/html/gwy_graph_zoom_fit-24.png     |   Bin 1287 -> 1126 bytes
 .../libgwydgets/html/gwy_graph_zoom_in-24.png      |   Bin 1285 -> 1123 bytes
 .../libgwydgets/html/gwy_graph_zoom_out-24.png     |   Bin 1242 -> 1105 bytes
 devel-docs/libgwydgets/html/gwy_hough-24.png       |   Bin 719 -> 650 bytes
 devel-docs/libgwydgets/html/gwy_immerse-24.png     |   Bin 279 -> 209 bytes
 .../libgwydgets/html/gwy_iso_roughness-24.png      |   Bin 495 -> 723 bytes
 devel-docs/libgwydgets/html/gwy_italic-20.png      |   Bin 225 -> 258 bytes
 devel-docs/libgwydgets/html/gwy_less-24.png        |   Bin 804 -> 1017 bytes
 devel-docs/libgwydgets/html/gwy_level-24.png       |   Bin 610 -> 290 bytes
 .../libgwydgets/html/gwy_level_flatten_base-24.png |   Bin 636 -> 1237 bytes
 .../libgwydgets/html/gwy_level_median-24.png       |   Bin 564 -> 659 bytes
 .../libgwydgets/html/gwy_level_triangle-24.png     |   Bin 1075 -> 870 bytes
 .../libgwydgets/html/gwy_light_rotate-24.png       |   Bin 1250 -> 1157 bytes
 devel-docs/libgwydgets/html/gwy_line_level-24.png  |   Bin 284 -> 235 bytes
 devel-docs/libgwydgets/html/gwy_load_debug-20.png  |   Bin 1248 -> 1148 bytes
 devel-docs/libgwydgets/html/gwy_load_info-20.png   |   Bin 881 -> 991 bytes
 .../libgwydgets/html/gwy_load_warning-20.png       |   Bin 967 -> 900 bytes
 devel-docs/libgwydgets/html/gwy_local_slope-24.png |   Bin 1457 -> 363 bytes
 .../html/gwy_logscale_horizontal-24.png            |   Bin 111 -> 335 bytes
 .../libgwydgets/html/gwy_logscale_vertical-24.png  |   Bin 124 -> 340 bytes
 .../libgwydgets/html/gwy_mark_outliers-24.png      |   Bin 0 -> 232 bytes
 devel-docs/libgwydgets/html/gwy_mark_scars-24.png  |   Bin 0 -> 246 bytes
 devel-docs/libgwydgets/html/gwy_mark_with-24.png   |   Bin 283 -> 387 bytes
 devel-docs/libgwydgets/html/gwy_mask-16.png        |   Bin 150 -> 184 bytes
 devel-docs/libgwydgets/html/gwy_mask-24.png        |   Bin 154 -> 217 bytes
 devel-docs/libgwydgets/html/gwy_mask_add-24.png    |   Bin 241 -> 246 bytes
 devel-docs/libgwydgets/html/gwy_mask_circle-24.png |   Bin 237 -> 674 bytes
 .../html/gwy_mask_circle_exclusive-24.png          |   Bin 179 -> 541 bytes
 .../html/gwy_mask_circle_inclusive-24.png          |   Bin 175 -> 578 bytes
 .../libgwydgets/html/gwy_mask_distribute-24.png    |   Bin 408 -> 290 bytes
 devel-docs/libgwydgets/html/gwy_mask_editor-24.png |   Bin 387 -> 927 bytes
 .../libgwydgets/html/gwy_mask_exclude-24.png       |   Bin 192 -> 259 bytes
 .../html/gwy_mask_exclude_circle-24.png            |   Bin 264 -> 541 bytes
 .../libgwydgets/html/gwy_mask_extract-24.png       |   Bin 512 -> 268 bytes
 .../libgwydgets/html/gwy_mask_fill_draw-24.png     |   Bin 258 -> 931 bytes
 .../libgwydgets/html/gwy_mask_fill_erase-24.png    |   Bin 292 -> 844 bytes
 devel-docs/libgwydgets/html/gwy_mask_grow-24.png   |   Bin 203 -> 584 bytes
 .../libgwydgets/html/gwy_mask_intersect-24.png     |   Bin 241 -> 270 bytes
 devel-docs/libgwydgets/html/gwy_mask_invert-24.png |   Bin 273 -> 441 bytes
 devel-docs/libgwydgets/html/gwy_mask_line-24.png   |   Bin 307 -> 416 bytes
 devel-docs/libgwydgets/html/gwy_mask_morph-24.png  |   Bin 389 -> 321 bytes
 .../libgwydgets/html/gwy_mask_paint_draw-24.png    |   Bin 331 -> 1239 bytes
 .../libgwydgets/html/gwy_mask_paint_erase-24.png   |   Bin 367 -> 1278 bytes
 .../html/gwy_mask_rect_exclusive-24.png            |   Bin 133 -> 195 bytes
 .../html/gwy_mask_rect_inclusive-24.png            |   Bin 130 -> 193 bytes
 devel-docs/libgwydgets/html/gwy_mask_remove-24.png |   Bin 327 -> 319 bytes
 devel-docs/libgwydgets/html/gwy_mask_set-24.png    |   Bin 0 -> 197 bytes
 devel-docs/libgwydgets/html/gwy_mask_shrink-24.png |   Bin 212 -> 935 bytes
 .../libgwydgets/html/gwy_mask_subtract-24.png      |   Bin 240 -> 272 bytes
 devel-docs/libgwydgets/html/gwy_mask_thin-24.png   |   Bin 321 -> 949 bytes
 .../libgwydgets/html/gwy_measure_lattice-24.png    |   Bin 1484 -> 320 bytes
 devel-docs/libgwydgets/html/gwy_merge-24.png       |   Bin 199 -> 217 bytes
 devel-docs/libgwydgets/html/gwy_more-24.png        |   Bin 778 -> 1028 bytes
 devel-docs/libgwydgets/html/gwy_mutual_crop-24.png |   Bin 884 -> 205 bytes
 .../libgwydgets/html/gwy_neural_apply-24.png       |   Bin 1253 -> 951 bytes
 .../libgwydgets/html/gwy_neural_train-24.png       |   Bin 1250 -> 866 bytes
 devel-docs/libgwydgets/html/gwy_next-24.png        |   Bin 0 -> 493 bytes
 .../libgwydgets/html/gwy_null_offsets-24.png       |   Bin 0 -> 316 bytes
 devel-docs/libgwydgets/html/gwy_palettes-16.png    |   Bin 230 -> 221 bytes
 devel-docs/libgwydgets/html/gwy_palettes-24.png    |   Bin 635 -> 303 bytes
 devel-docs/libgwydgets/html/gwy_path_level-24.png  |   Bin 758 -> 782 bytes
 .../libgwydgets/html/gwy_pointer_measure-24.png    |   Bin 968 -> 695 bytes
 .../libgwydgets/html/gwy_poly_distort-24.png       |   Bin 1500 -> 1033 bytes
 devel-docs/libgwydgets/html/gwy_polynom-24.png     |   Bin 408 -> 942 bytes
 .../libgwydgets/html/gwy_polynom_level-24.png      |   Bin 1033 -> 1046 bytes
 devel-docs/libgwydgets/html/gwy_previous-24.png    |   Bin 0 -> 461 bytes
 devel-docs/libgwydgets/html/gwy_profile-24.png     |   Bin 586 -> 592 bytes
 devel-docs/libgwydgets/html/gwy_pygwy-24.png       |   Bin 932 -> 813 bytes
 .../libgwydgets/html/gwy_remove_under_mask-24.png  |   Bin 369 -> 438 bytes
 devel-docs/libgwydgets/html/gwy_rotate-24.png      |   Bin 1707 -> 835 bytes
 devel-docs/libgwydgets/html/gwy_rotate_180-24.png  |   Bin 1382 -> 1272 bytes
 devel-docs/libgwydgets/html/gwy_rotate_3d-24.png   |   Bin 0 -> 1212 bytes
 .../libgwydgets/html/gwy_rotate_90_ccw-24.png      |   Bin 1071 -> 660 bytes
 .../libgwydgets/html/gwy_rotate_90_cw-24.png       |   Bin 1116 -> 616 bytes
 devel-docs/libgwydgets/html/gwy_scale-24.png       |   Bin 422 -> 377 bytes
 .../libgwydgets/html/gwy_scale_horizontally-24.png |   Bin 1255 -> 614 bytes
 .../libgwydgets/html/gwy_scale_vertically-24.png   |   Bin 1097 -> 577 bytes
 devel-docs/libgwydgets/html/gwy_scars-24.png       |   Bin 276 -> 206 bytes
 devel-docs/libgwydgets/html/gwy_selections-24.png  |   Bin 342 -> 307 bytes
 devel-docs/libgwydgets/html/gwy_shader-24.png      |   Bin 1256 -> 1288 bytes
 devel-docs/libgwydgets/html/gwy_spectrum-24.png    |   Bin 464 -> 990 bytes
 devel-docs/libgwydgets/html/gwy_spot_remove-24.png |   Bin 309 -> 361 bytes
 .../libgwydgets/html/gwy_stat_quantities-24.png    |   Bin 642 -> 316 bytes
 .../libgwydgets/html/gwy_straighten_path-24.png    |   Bin 1142 -> 994 bytes
 devel-docs/libgwydgets/html/gwy_subscript-20.png   |   Bin 382 -> 396 bytes
 devel-docs/libgwydgets/html/gwy_superscript-20.png |   Bin 400 -> 402 bytes
 .../html/gwy_synthetic_ballistic_deposition-24.png |   Bin 1790 -> 1424 bytes
 .../html/gwy_synthetic_brownian_motion-24.png      |   Bin 1348 -> 1352 bytes
 .../libgwydgets/html/gwy_synthetic_columnar-24.png |   Bin 1395 -> 1414 bytes
 .../html/gwy_synthetic_diffusion-24.png            |   Bin 1287 -> 1166 bytes
 .../libgwydgets/html/gwy_synthetic_domains-24.png  |   Bin 1596 -> 1271 bytes
 .../libgwydgets/html/gwy_synthetic_fibres-24.png   |   Bin 0 -> 1178 bytes
 .../libgwydgets/html/gwy_synthetic_lattice-24.png  |   Bin 1398 -> 1212 bytes
 .../html/gwy_synthetic_line_noise-24.png           |   Bin 436 -> 382 bytes
 .../libgwydgets/html/gwy_synthetic_noise-24.png    |   Bin 1841 -> 1490 bytes
 .../libgwydgets/html/gwy_synthetic_objects-24.png  |   Bin 994 -> 958 bytes
 .../html/gwy_synthetic_particles-24.png            |   Bin 1476 -> 1312 bytes
 .../libgwydgets/html/gwy_synthetic_pattern-24.png  |   Bin 766 -> 613 bytes
 .../libgwydgets/html/gwy_synthetic_phases-24.png   |   Bin 0 -> 354 bytes
 .../libgwydgets/html/gwy_synthetic_spectral-24.png |   Bin 1383 -> 1379 bytes
 .../libgwydgets/html/gwy_synthetic_waves-24.png    |   Bin 1665 -> 1259 bytes
 devel-docs/libgwydgets/html/gwy_tilt-24.png        |   Bin 521 -> 1511 bytes
 .../libgwydgets/html/gwy_tip_dilation-24.png       |   Bin 614 -> 839 bytes
 devel-docs/libgwydgets/html/gwy_tip_erosion-24.png |   Bin 585 -> 781 bytes
 .../libgwydgets/html/gwy_tip_estimation-24.png     |   Bin 818 -> 663 bytes
 .../libgwydgets/html/gwy_tip_indent_analyze-24.png |   Bin 778 -> 750 bytes
 .../libgwydgets/html/gwy_tip_lateral_force-24.png  |   Bin 643 -> 1342 bytes
 devel-docs/libgwydgets/html/gwy_tip_map-24.png     |   Bin 1695 -> 899 bytes
 devel-docs/libgwydgets/html/gwy_tip_model-24.png   |   Bin 745 -> 599 bytes
 devel-docs/libgwydgets/html/gwy_tip_pid-24.png     |   Bin 821 -> 767 bytes
 devel-docs/libgwydgets/html/gwy_unrotate-24.png    |   Bin 409 -> 623 bytes
 .../libgwydgets/html/gwy_value_invert-24.png       |   Bin 321 -> 378 bytes
 devel-docs/libgwydgets/html/gwy_volume-24.png      |   Bin 1385 -> 1404 bytes
 .../libgwydgets/html/gwy_volume_calibrate-24.png   |   Bin 1118 -> 1106 bytes
 .../libgwydgets/html/gwy_volume_dimensions-24.png  |   Bin 1281 -> 909 bytes
 devel-docs/libgwydgets/html/gwy_volume_fd-24.png   |   Bin 1425 -> 1630 bytes
 .../libgwydgets/html/gwy_volume_invert-24.png      |   Bin 1612 -> 1056 bytes
 .../libgwydgets/html/gwy_volume_kmeans-24.png      |   Bin 1437 -> 1179 bytes
 .../libgwydgets/html/gwy_volume_kmedians-24.png    |   Bin 1430 -> 988 bytes
 .../libgwydgets/html/gwy_volume_slice-24.png       |   Bin 1575 -> 1359 bytes
 devel-docs/libgwydgets/html/gwy_volumize-24.png    |   Bin 1489 -> 1098 bytes
 .../libgwydgets/html/gwy_volumize_layers-24.png    |   Bin 1702 -> 1252 bytes
 devel-docs/libgwydgets/html/gwy_xy_denoise-24.png  |   Bin 0 -> 243 bytes
 devel-docs/libgwydgets/html/gwy_zero_mean-24.png   |   Bin 579 -> 394 bytes
 devel-docs/libgwydgets/html/gwy_zoom_1_1-24.png    |   Bin 1451 -> 1112 bytes
 devel-docs/libgwydgets/html/gwy_zoom_fit-24.png    |   Bin 1454 -> 1101 bytes
 devel-docs/libgwydgets/html/gwy_zoom_in-24.png     |   Bin 1449 -> 1090 bytes
 devel-docs/libgwydgets/html/gwy_zoom_out-24.png    |   Bin 1408 -> 1084 bytes
 devel-docs/libgwydgets/html/index.html             |     9 +-
 .../html/libgwydgets-GwyGraphBasics.html           |    28 +-
 .../libgwydgets/html/libgwydgets-gwycombobox.html  |    20 +-
 .../libgwydgets/html/libgwydgets-gwydgetenums.html |    79 +-
 .../libgwydgets/html/libgwydgets-gwydgets.html     |     6 +-
 .../libgwydgets/html/libgwydgets-gwydgetutils.html |   225 +-
 .../html/libgwydgets-gwygrainvaluemenu.html        |    24 +-
 .../html/libgwydgets-gwyoptionmenus.html           |    30 +-
 .../html/libgwydgets-gwyradiobuttons.html          |    20 +-
 .../libgwydgets/html/libgwydgets-gwystock.html     |   276 +-
 devel-docs/libgwydgets/html/libgwydgets.devhelp2   |    67 +-
 .../libgwydgets/html/standard-vector-layers.html   |     2 +-
 devel-docs/libgwydgets/libgwydgets-docs.sgml       |    53 +-
 devel-docs/libgwydraw/Makefile.in                  |    16 +-
 devel-docs/libgwydraw/html/GwyGLMaterial.html      |    32 +-
 devel-docs/libgwydraw/html/GwyGradient.html        |    40 +-
 devel-docs/libgwydraw/html/GwySelection.html       |    52 +-
 devel-docs/libgwydraw/html/api-index-2-16.html     |     2 +-
 devel-docs/libgwydraw/html/api-index-2-32.html     |     2 +-
 devel-docs/libgwydraw/html/api-index-2-39.html     |     2 +-
 devel-docs/libgwydraw/html/api-index-2-43.html     |     2 +-
 devel-docs/libgwydraw/html/api-index-2-47.html     |     5 +-
 devel-docs/libgwydraw/html/api-index-2-49.html     |    37 +
 devel-docs/libgwydraw/html/api-index-all.html      |    10 +-
 devel-docs/libgwydraw/html/index.html              |     5 +-
 devel-docs/libgwydraw/html/libgwydraw-GwyRGBA.html |   120 +-
 devel-docs/libgwydraw/html/libgwydraw-gwydraw.html |     4 +-
 .../libgwydraw/html/libgwydraw-gwydrawenums.html   |     6 +-
 .../libgwydraw/html/libgwydraw-gwypixfield.html    |    14 +-
 devel-docs/libgwydraw/html/libgwydraw.devhelp2     |     3 +
 devel-docs/libgwydraw/libgwydraw-docs.sgml         |    14 +-
 devel-docs/libgwymodule/Makefile.in                |    16 +-
 devel-docs/libgwymodule/html/ModuleLibrary.html    |     2 +-
 devel-docs/libgwymodule/html/ModuleTutorial.html   |     2 +-
 .../libgwymodule/html/PluginProxyReference.html    |     2 +-
 devel-docs/libgwymodule/html/api-index-2-1.html    |     2 +-
 devel-docs/libgwymodule/html/api-index-2-18.html   |     2 +-
 devel-docs/libgwymodule/html/api-index-2-25.html   |     2 +-
 devel-docs/libgwymodule/html/api-index-2-32.html   |     2 +-
 devel-docs/libgwymodule/html/api-index-2-36.html   |     2 +-
 devel-docs/libgwymodule/html/api-index-2-38.html   |     2 +-
 devel-docs/libgwymodule/html/api-index-2-45.html   |     5 +-
 devel-docs/libgwymodule/html/api-index-2-48.html   |    42 +
 devel-docs/libgwymodule/html/api-index-2-49.html   |    53 +
 devel-docs/libgwymodule/html/api-index-all.html    |    42 +-
 devel-docs/libgwymodule/html/api-index-deprec.html |     2 +-
 .../html/gwymodule-tutorial-beyond.html            |     6 +-
 .../libgwymodule/html/gwymodule-tutorial-file.html |     4 +-
 .../html/gwymodule-tutorial-graph.html             |     2 +-
 .../html/gwymodule-tutorial-install.html           |     4 +-
 .../html/gwymodule-tutorial-layer.html             |     2 +-
 .../html/gwymodule-tutorial-minimal.html           |     2 +-
 .../html/gwymodule-tutorial-overview.html          |     2 +-
 .../html/gwymodule-tutorial-process.html           |     2 +-
 .../libgwymodule/html/gwymodule-tutorial-tool.html |     2 +-
 devel-docs/libgwymodule/html/index.html            |     6 +-
 .../html/libgwymodule-gwymodule-file.html          |    54 +-
 .../html/libgwymodule-gwymodule-graph.html         |    22 +-
 .../html/libgwymodule-gwymodule-layer.html         |     8 +-
 .../html/libgwymodule-gwymodule-process.html       |    24 +-
 .../html/libgwymodule-gwymodule-tool.html          |     8 +-
 .../html/libgwymodule-gwymodule-volume.html        |    24 +-
 .../html/libgwymodule-gwymodule-xyz.html           |    24 +-
 .../html/libgwymodule-gwymodulebrowser.html        |     4 +-
 .../html/libgwymodule-gwymoduleenums.html          |    10 +-
 .../html/libgwymodule-gwymoduleloader.html         |   391 +-
 devel-docs/libgwymodule/html/libgwymodule.devhelp2 |    20 +
 .../libgwymodule/html/plugin-proxy-dump.html       |     2 +-
 .../libgwymodule/html/plugin-proxy-file.html       |     2 +-
 .../libgwymodule/html/plugin-proxy-overview.html   |     2 +-
 .../libgwymodule/html/plugin-proxy-process.html    |     2 +-
 devel-docs/libgwymodule/html/plugin-proxy-rgi.html |     2 +-
 devel-docs/libgwymodule/libgwymodule-docs.sgml     |    24 +-
 devel-docs/libgwymodule/module-tutorial-beyond.xml |     6 +-
 .../libgwymodule/module-tutorial-install.xml       |     4 +-
 devel-docs/libgwyprocess/Makefile.in               |    16 +-
 devel-docs/libgwyprocess/html/GwyBrick.html        |   193 +-
 devel-docs/libgwyprocess/html/GwyCDLine.html       |    24 +-
 devel-docs/libgwyprocess/html/GwyCalData.html      |    56 +-
 devel-docs/libgwyprocess/html/GwyCalibration.html  |    16 +-
 devel-docs/libgwyprocess/html/GwyDataField.html    |   423 +-
 devel-docs/libgwyprocess/html/GwyDataLine.html     |   155 +-
 devel-docs/libgwyprocess/html/GwyGrainValue.html   |    48 +-
 .../libgwyprocess/html/GwyShapeFitPreset.html      |   131 +-
 devel-docs/libgwyprocess/html/GwySpectra.html      |    58 +-
 devel-docs/libgwyprocess/html/GwySurface.html      |   163 +-
 .../libgwyprocess/html/GwyTriangulation.html       |    22 +-
 devel-docs/libgwyprocess/html/api-index-2-1.html   |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-11.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-12.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-18.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-2.html   |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-22.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-23.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-26.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-29.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-3.html   |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-30.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-31.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-32.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-34.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-35.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-36.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-37.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-38.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-4.html   |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-40.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-41.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-42.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-43.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-44.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-45.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-46.html  |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-47.html  |     5 +-
 devel-docs/libgwyprocess/html/api-index-2-48.html  |    45 +
 devel-docs/libgwyprocess/html/api-index-2-49.html  |   117 +
 devel-docs/libgwyprocess/html/api-index-2-5.html   |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-7.html   |     2 +-
 devel-docs/libgwyprocess/html/api-index-2-8.html   |     2 +-
 devel-docs/libgwyprocess/html/api-index-all.html   |   127 +-
 .../libgwyprocess/html/api-index-deprec.html       |     6 +-
 devel-docs/libgwyprocess/html/index.html           |     6 +-
 .../html/libgwyprocess-GwySpline.html              |   114 +-
 .../html/libgwyprocess-arithmetic.html             |    24 +-
 .../libgwyprocess/html/libgwyprocess-correct.html  |   264 +-
 .../html/libgwyprocess-correlation.html            |    44 +-
 .../libgwyprocess/html/libgwyprocess-cwt.html      |     4 +-
 .../libgwyprocess/html/libgwyprocess-dwt.html      |    16 +-
 .../libgwyprocess/html/libgwyprocess-elliptic.html |   101 +-
 .../libgwyprocess/html/libgwyprocess-filters.html  |   352 +-
 .../libgwyprocess/html/libgwyprocess-fractals.html |    22 +-
 .../libgwyprocess/html/libgwyprocess-grains.html   |   118 +-
 .../html/libgwyprocess-gwyprocess.html             |     4 +-
 .../html/libgwyprocess-gwyprocessenums.html        |   248 +-
 .../libgwyprocess/html/libgwyprocess-hough.html    |     6 +-
 .../html/libgwyprocess-interpolation.html          |    26 +-
 .../libgwyprocess/html/libgwyprocess-inttrans.html |    40 +-
 .../libgwyprocess/html/libgwyprocess-level.html    |    56 +-
 .../html/libgwyprocess-linestats.html              |   228 +-
 .../libgwyprocess/html/libgwyprocess-peaks.html    |    30 +-
 .../html/libgwyprocess-simpleFFT.html              |    30 +-
 .../html/libgwyprocess-stats-uncertainty.html      |    78 +-
 .../libgwyprocess/html/libgwyprocess-stats.html    |   711 +-
 .../libgwyprocess/html/libgwyprocess-tip.html      |    88 +-
 .../libgwyprocess/html/libgwyprocess.devhelp2      |    42 +-
 devel-docs/libgwyprocess/libgwyprocess-docs.sgml   |    70 +-
 gwyddion.spec                                      |   128 +-
 libdraw/Makefile.am                                |     4 +-
 libdraw/Makefile.in                                |    25 +-
 libdraw/gwypixfield.c                              |    52 +-
 libdraw/gwyrgba.c                                  |    67 +-
 libdraw/gwyrgba.h                                  |     7 +-
 libgwyddion/Makefile.am                            |     4 +-
 libgwyddion/Makefile.in                            |    25 +-
 libgwyddion/gwycontainer.c                         |   187 +-
 libgwyddion/gwycontainer.h                         |     7 +-
 libgwyddion/gwyddiontypes.c                        |    56 +-
 libgwyddion/gwyddiontypes.h                        |     6 +-
 libgwyddion/gwyenum.h                              |     4 +-
 libgwyddion/gwymath.c                              |   292 +-
 libgwyddion/gwymath.h                              |    21 +-
 libgwyddion/gwymathfallback.h                      |    12 +-
 libgwyddion/gwynlfit.c                             |    11 +-
 libgwyddion/gwynlfitpreset.c                       |   161 +-
 libgwyddion/gwysiunit.c                            |    51 +-
 libgwyddion/gwysiunit.h                            |     6 +-
 libgwyddion/gwyutils.c                             |   124 +-
 libgwyddion/gwyutils.h                             |    11 +-
 libgwyddion/gwyversion.h                           |     4 +-
 libgwydgets/Makefile.am                            |     7 +-
 libgwydgets/Makefile.in                            |    52 +-
 libgwydgets/gwy3dsetup.c                           |   116 +-
 libgwydgets/gwy3dsetup.h                           |    10 +-
 libgwydgets/gwy3dview.c                            |   440 +-
 libgwydgets/gwy3dwindow.c                          |   551 +-
 libgwydgets/gwy3dwindow.h                          |     4 +-
 libgwydgets/gwyadjustbar.c                         |  1356 ++
 libgwydgets/gwyadjustbar.h                         |    85 +
 libgwydgets/gwyaxisdialog.c                        |   160 +-
 libgwydgets/gwycombobox.c                          |     7 +-
 libgwydgets/gwydataview.c                          |    30 +-
 libgwydgets/gwydgetenums.c                         |    27 +-
 libgwydgets/gwydgetenums.h                         |     7 +-
 libgwydgets/gwydgetmarshals.c                      |     6 +-
 libgwydgets/gwydgets.c                             |     9 +-
 libgwydgets/gwydgets.h                             |     3 +-
 libgwydgets/gwydgettypes.c                         |    21 +
 libgwydgets/gwydgettypes.h                         |     3 +
 libgwydgets/gwydgetutils.c                         |   364 +-
 libgwydgets/gwydgetutils.h                         |    62 +-
 libgwydgets/gwygraphareadialog.c                   |    60 +-
 libgwydgets/gwygraphcurvemodel.c                   |     7 +-
 libgwydgets/gwygraphcurves.c                       |     7 +-
 libgwydgets/gwygraphlabeldialog.c                  |    13 +-
 libgwydgets/gwyradiobuttons.c                      |     9 +-
 libgwydgets/gwystatusbar.c                         |     4 +-
 libgwydgets/gwystock.c                             |   208 +-
 libgwydgets/gwystock.h                             |    26 +-
 libgwymodule/Makefile.am                           |     4 +-
 libgwymodule/Makefile.in                           |    25 +-
 libgwymodule/gwymodule-file.c                      |     4 +-
 libgwymodule/gwymodulebrowser.c                    |    18 +-
 libgwymodule/gwymoduleinternal.h                   |    19 +-
 libgwymodule/gwymoduleloader.c                     |   597 +-
 libgwymodule/gwymoduleloader.h                     |    57 +-
 libgwymodule/gwymoduletypes.c                      |     1 +
 libprocess/Makefile.am                             |    17 +-
 libprocess/Makefile.in                             |    63 +-
 libprocess/arithmetic.c                            |    53 +-
 libprocess/brick.c                                 |   806 +-
 libprocess/brick.h                                 |    19 +-
 libprocess/correct-laplace.c                       |  1592 ++
 libprocess/correct.c                               |  2270 +--
 libprocess/correct.h                               |    16 +-
 libprocess/cwt.c                                   |     3 +-
 libprocess/datafield.c                             |   495 +-
 libprocess/datafield.h                             |   269 +-
 libprocess/dataline.c                              |   133 +-
 libprocess/dataline.h                              |     6 +-
 libprocess/dwt.c                                   |     5 +-
 libprocess/elliptic.c                              |   113 +-
 libprocess/elliptic.h                              |    95 +-
 libprocess/filters-minmax.c                        |  1574 ++
 libprocess/filters.c                               |  2130 +--
 libprocess/filters.h                               |    22 +-
 libprocess/fractals.c                              |     5 +-
 libprocess/grains-disttrans.c                      |   978 ++
 libprocess/grains-values.c                         |  2094 +++
 libprocess/grains-wshed.c                          |  1253 ++
 libprocess/grains.c                                |  4481 +-----
 libprocess/grains.h                                |     3 +-
 libprocess/gwygrainvalue.c                         |     4 +-
 libprocess/gwyprocess.c                            |    49 +-
 libprocess/gwyprocessenums.c                       |    65 +-
 libprocess/gwyprocessenums.h                       |    18 +-
 libprocess/gwyprocessinternal.h                    |   140 +-
 libprocess/gwyprocesstypes.c                       |    19 +
 libprocess/gwyprocesstypes.h                       |     3 +
 libprocess/gwyshapefitpreset.c                     |   118 +-
 libprocess/gwyshapefitpreset.h                     |     9 +-
 libprocess/hough.c                                 |    42 +-
 libprocess/interpolation.c                         |     3 +-
 libprocess/interpolation.h                         |    14 +-
 libprocess/inttrans.c                              |   319 +-
 libprocess/level.c                                 |     3 +-
 libprocess/linestats.c                             |   168 +-
 libprocess/linestats.h                             |     6 +-
 libprocess/monte-carlo-unc.c                       |   156 -
 libprocess/monte-carlo-unc.h                       |    52 -
 libprocess/simplefft.c                             |  1026 +-
 libprocess/spectra.c                               |    47 +-
 libprocess/spline.c                                |    44 +-
 libprocess/spline.h                                |    12 +-
 libprocess/stats-acfpsdf.c                         |  2192 +++
 libprocess/stats-entropy.c                         |  1068 ++
 libprocess/stats-sum.c                             |  1516 ++
 libprocess/stats.c                                 |  4374 +----
 libprocess/stats.h                                 |   519 +-
 libprocess/stats_uncertainty.c                     |    28 +-
 libprocess/surface.c                               |   354 +-
 libprocess/surface.h                               |   120 +-
 libprocess/tip.c                                   |    19 +-
 libprocess/tip.h                                   |     5 +-
 libprocess/triangulation.c                         |     3 +-
 libprocess/wrappers.h                              |    44 -
 m4/Makefile.in                                     |    16 +-
 m4/gwy-enable.m4                                   |     8 +-
 m4/gwy-python.m4                                   |   127 +-
 modules/Makefile.in                                |    16 +-
 modules/file/Makefile.am                           |   215 +-
 modules/file/Makefile.in                           |  1627 +-
 modules/file/accurexii-txt.c                       |     4 +-
 modules/file/aistfile.c                            |    13 +-
 modules/file/alicona.c                             |     4 +-
 modules/file/ambfile.c                             |    34 +-
 modules/file/anfatec.c                             |     4 +-
 modules/file/apedaxfile.c                          |    78 +-
 modules/file/apefile.c                             |     4 +-
 modules/file/asciiexport.c                         |     4 +-
 modules/file/assing-afm.c                          |     4 +-
 modules/file/attocube.c                            |    10 +-
 modules/file/bcrfile.c                             |    13 +-
 modules/file/burleigh.c                            |     4 +-
 modules/file/burleigh_bii.c                        |     2 +-
 modules/file/burleigh_exp.c                        |     4 +-
 modules/file/codevfile.c                           |     4 +-
 modules/file/csmfile.c                             |     4 +-
 modules/file/dektakvca.c                           |  1037 ++
 modules/file/dektakxml.c                           |    41 +-
 modules/file/dimensionfile.c                       |     4 +-
 modules/file/dm3file.c                             |     4 +-
 modules/file/dmefile.c                             |     4 +-
 modules/file/dumbfile.c                            |     4 +-
 modules/file/ecsfile.c                             |     4 +-
 modules/file/ezdfile.c                             |     4 +-
 modules/file/femtoscan-txt.c                       |     4 +-
 modules/file/femtoscan.c                           |     4 +-
 modules/file/file.c                                |   240 +
 modules/file/gdeffile.c                            |     4 +-
 modules/file/gsffile.c                             |    12 +-
 modules/file/gwyfile.c                             |     4 +-
 modules/file/gwytiff.h                             |     5 +-
 modules/file/gxyzffile.c                           |    12 +-
 modules/file/hdf4file.c                            |     4 +-
 modules/file/hitachi-afm.c                         |     4 +-
 modules/file/hitachi-sem.c                         |     4 +-
 modules/file/igorfile.c                            |   387 +-
 modules/file/imgexport.c                           |   625 +-
 modules/file/imgexportpreset.h                     |     6 +-
 modules/file/intelliwave.c                         |     4 +-
 modules/file/intematix.c                           |     4 +-
 modules/file/iso28600.c                            |   238 +-
 modules/file/jeol.c                                |     4 +-
 modules/file/jpkscan.c                             |  1621 +-
 modules/file/jspmfile.c                            |     4 +-
 modules/file/keyence.c                             |     4 +-
 modules/file/leica.c                               |     4 +-
 modules/file/lextfile.c                            |     4 +-
 modules/file/magellan.c                            |     4 +-
 modules/file/mapvue.c                              |     4 +-
 modules/file/metropro.c                            |     4 +-
 modules/file/microprof.c                           |   129 +-
 modules/file/miffile.c                             |     4 +-
 modules/file/mifile.c                              |     4 +-
 modules/file/mulfile.c                             |     4 +-
 modules/file/nanoeducator.c                        |     4 +-
 modules/file/nanomagnetics.c                       |     4 +-
 modules/file/nanonics.c                            |     4 +-
 modules/file/nanonis.c                             |     4 +-
 modules/file/nanoobserver.c                        |  1309 +-
 modules/file/nanoscan.c                            |    93 +-
 modules/file/nanoscope-ii.c                        |     4 +-
 modules/file/nanoscope.c                           |    19 +-
 modules/file/nanotop.c                             |     2 +-
 modules/file/netcdf.c                              |     4 +-
 modules/file/nmmxyz.c                              |     4 +-
 modules/file/nt-mdt.c                              |    49 +-
 modules/file/nxiifile.c                            |     4 +-
 modules/file/oldmda.c                              |     4 +-
 modules/file/ols.c                                 |     4 +-
 modules/file/ometiff.c                             |     4 +-
 modules/file/omicron.c                             |     4 +-
 modules/file/omicronflat.c                         |     4 +-
 modules/file/omicronmatrix.c                       |     4 +-
 modules/file/opdfile.c                             |   140 +-
 modules/file/pltfile.c                             |     4 +-
 modules/file/pnifile.c                             |     4 +-
 modules/file/princetonspe.c                        |     4 +-
 modules/file/psia.c                                |     4 +-
 modules/file/pt3file.c                             |     4 +-
 modules/file/quesant.c                             |     2 +-
 modules/file/rawfile.c                             |     4 +-
 modules/file/rawgraph.c                            |     4 +-
 modules/file/rawxyz.c                              |     4 +-
 modules/file/renishaw.c                            |    13 +-
 modules/file/rhk-sm3.c                             |     4 +-
 modules/file/rhk-spm32.c                           |     4 +-
 modules/file/robotics.c                            |     2 +-
 modules/file/s94file.c                             |     4 +-
 modules/file/sdfile.c                              |     4 +-
 modules/file/seiko.c                               |    36 +-
 modules/file/sensofar.c                            |     2 +-
 modules/file/sensolytics.c                         |     4 +-
 modules/file/shimadzu.c                            |     4 +-
 modules/file/sicmfile.c                            |     4 +-
 modules/file/sis.c                                 |     4 +-
 modules/file/spip-asc.c                            |     4 +-
 modules/file/spmlab.c                              |   627 +-
 modules/file/spmlabf.c                             |     4 +-
 modules/file/stmprg.c                              |     4 +-
 modules/file/stpfile.c                             |     4 +-
 modules/file/surffile.c                            |     4 +-
 modules/file/tescan.c                              |     4 +-
 modules/file/tiaser.c                              |     4 +-
 modules/file/unisoku.c                             |     4 +-
 modules/file/vtkfile.c                             |     4 +-
 modules/file/win_stm.c                             |     4 +-
 modules/file/wipfile.c                             |   575 +-
 modules/file/witec-asc.c                           |     4 +-
 modules/file/witfile.c                             |     4 +-
 modules/file/wsffile.c                             |     4 +-
 modules/file/wsxmfile.c                            |     4 +-
 modules/file/xyzexport.c                           |     7 +-
 modules/file/zeiss.c                               |     4 +-
 modules/file/zeisslsm.c                            |  1552 ++
 modules/file/zemax.c                               |     4 +-
 modules/graph/Makefile.am                          |    54 +-
 modules/graph/Makefile.in                          |   298 +-
 modules/graph/graph.c                              |    52 +
 modules/graph/graph_align.c                        |   101 +-
 modules/graph/graph_cd.c                           |     4 +-
 modules/graph/graph_cut.c                          |    53 +-
 modules/graph/graph_dos_spectrum.c                 |     4 +-
 modules/graph/graph_export_ascii.c                 |     4 +-
 modules/graph/graph_export_bitmap.c                |     4 +-
 modules/graph/graph_export_vector.c                |     7 +-
 modules/graph/graph_fdfit.c                        |    28 +-
 modules/graph/graph_filter.c                       |     4 +-
 modules/graph/graph_fit.c                          |    28 +-
 modules/graph/graph_level.c                        |     4 +-
 modules/graph/graph_logscale.c                     |     4 +-
 modules/graph/graph_peaks.c                        |   112 +-
 modules/graph/graph_stats.c                        |   953 ++
 modules/layer/Makefile.am                          |    44 +-
 modules/layer/Makefile.in                          |   180 +-
 modules/layer/axis.c                               |     4 +-
 modules/layer/ellipse.c                            |     4 +-
 modules/layer/lattice.c                            |     4 +-
 modules/layer/layer.c                              |    38 +
 modules/layer/line.c                               |     4 +-
 modules/layer/path.c                               |     2 +-
 modules/layer/point.c                              |     4 +-
 modules/layer/rectangle.c                          |     4 +-
 modules/process/Makefile.am                        |   174 +-
 modules/process/Makefile.in                        |  1833 ++-
 modules/process/acf2d.c                            |     4 +-
 modules/process/angle_dist.c                       |    22 +-
 modules/process/arithmetic.c                       |    18 +-
 modules/process/averaging.c                        |     4 +-
 modules/process/basicops.c                         |     6 +-
 modules/process/bdep_synth.c                       |    20 +-
 modules/process/calcoefs_load.c                    |     2 +-
 modules/process/calcoefs_new.c                     |     2 +-
 modules/process/calcoefs_simple.c                  |     2 +-
 modules/process/calcoefs_view.c                    |     2 +-
 modules/process/calibrate.c                        |   330 +-
 modules/process/coerce.c                           |    31 +-
 modules/process/col_synth.c                        |    29 +-
 modules/process/convolution_filter.c               |     8 +-
 modules/process/correct_affine.c                   |   771 +-
 modules/process/crosscor.c                         |   171 +-
 modules/process/curvature.c                        |    40 +-
 modules/process/cwt.c                              |    23 +-
 modules/process/deposit_synth.c                    |    83 +-
 modules/process/diff_synth.c                       |    35 +-
 modules/process/dimensions.h                       |   107 +-
 modules/process/domain_synth.c                     |    34 +-
 modules/process/drift.c                            |    60 +-
 modules/process/dwt.c                              |     4 +-
 modules/process/dwtanisotropy.c                    |    57 +-
 modules/process/edge.c                             |    20 +-
 modules/process/entropy.c                          |    31 +-
 modules/process/extend.c                           |    38 +-
 modules/process/extract_path.c                     |     4 +-
 modules/process/facet-level.c                      |     8 +-
 modules/process/facet_analysis.c                   |   121 +-
 modules/process/fbm_synth.c                        |    25 +-
 modules/process/fft.c                              |    30 +-
 modules/process/fft_filter_1d.c                    |     8 +-
 modules/process/fft_filter_2d.c                    |    24 +-
 modules/process/fft_profile.c                      |    49 +-
 modules/process/fft_synth.c                        |    36 +-
 modules/process/fibre_synth.c                      |  1617 ++
 modules/process/fit-shape.c                        |   160 +-
 modules/process/flatten_base.c                     |     4 +-
 modules/process/fraccor.c                          |     7 +-
 modules/process/fractal.c                          |   122 +-
 modules/process/gradient.c                         |     4 +-
 modules/process/grain_cross.c                      |     5 +-
 modules/process/grain_dist.c                       |    34 +-
 modules/process/grain_edge.c                       |    82 +-
 modules/process/grain_filter.c                     |    67 +-
 modules/process/grain_mark.c                       |   101 +-
 modules/process/grain_stat.c                       |     8 +-
 modules/process/grain_wshed.c                      |    38 +-
 modules/process/hough.c                            |   105 +-
 modules/process/immerse.c                          |    37 +-
 modules/process/indent_analyze.c                   |   617 +-
 modules/process/laplace.c                          |     4 +-
 modules/process/lat_synth.c                        |    44 +-
 modules/process/latsim.c                           |    18 +-
 modules/process/level.c                            |     6 +-
 modules/process/level_grains.c                     |     4 +-
 modules/process/linecorrect.c                      |     6 +-
 modules/process/linematch.c                        |    79 +-
 modules/process/lno_synth.c                        |    68 +-
 modules/process/local_contrast.c                   |    20 +-
 modules/process/logistic.c                         |    57 +-
 modules/process/mark_disconn.c                     |    73 +-
 modules/process/mark_with.c                        |    36 +-
 modules/process/mask_distribute.c                  |     8 +-
 modules/process/mask_edt.c                         |   188 +-
 modules/process/mask_morph.c                       |    30 +-
 modules/process/mask_noisify.c                     |   333 +
 modules/process/maskcor.c                          |    24 +-
 modules/process/maskops.c                          |     6 +-
 modules/process/mcrop.c                            |    11 +-
 modules/process/measure_lattice.c                  |   479 +-
 modules/process/median-bg.c                        |    14 +-
 modules/process/merge.c                            |    26 +-
 modules/process/mfm_current.c                      |   923 ++
 modules/process/mfm_field.c                        |   789 +
 modules/process/mfm_findshift.c                    |   404 +
 modules/process/mfm_parallel.c                     |   937 ++
 modules/process/mfm_shift.c                        |   333 +
 modules/process/mfmops.h                           |   435 +
 modules/process/nanoindent_adjust.c                |     9 +-
 modules/process/neural.c                           |    67 +-
 modules/process/noise_synth.c                      |    32 +-
 modules/process/obj_synth.c                        |    76 +-
 modules/process/otsu_threshold.c                   |     8 +-
 modules/process/outliers.c                         |    32 +-
 modules/process/pat_synth.c                        |    15 +-
 modules/process/phase_synth.c                      |   808 +
 modules/process/pid.c                              |   104 +-
 modules/process/polydistort.c                      |    27 +-
 modules/process/polylevel.c                        |    41 +-
 modules/process/presentationops.c                  |    10 +-
 modules/process/preview.h                          |    92 +-
 modules/process/process.c                          |   254 +
 modules/process/psdf_logphi.c                      |    15 +-
 modules/process/psf-fit.c                          |   841 +
 modules/process/psf.c                              |   750 +
 modules/process/rank.c                             |    16 +-
 modules/process/rotate.c                           |    26 +-
 modules/process/scale.c                            |    94 +-
 modules/process/scars.c                            |   100 +-
 modules/process/semsim.c                           |    24 +-
 modules/process/shade.c                            |   177 +-
 modules/process/slope_dist.c                       |    50 +-
 modules/process/sphere-revolve.c                   |   537 +-
 modules/process/stitch.c                           |   800 +
 modules/process/straighten_path.c                  |    33 +-
 modules/process/superresolution.c                  |    61 +-
 modules/process/synth.h                            |    81 +-
 modules/process/threshold.c                        |    37 +-
 modules/process/tilt.c                             |    34 +-
 modules/process/tip_blind.c                        |    77 +-
 modules/process/tip_model.c                        |   137 +-
 modules/process/tipops.c                           |     8 +-
 modules/process/unrotate.c                         |    14 +-
 modules/process/volumize.c                         |     6 +-
 modules/process/volumize_layers.c                  |    25 +-
 modules/process/wave_synth.c                       |   229 +-
 modules/process/wpour_mark.c                       |    36 +-
 modules/process/xydenoise.c                        |    11 +-
 modules/process/xyzize.c                           |     4 +-
 modules/pygwy/Makefile.am                          |    20 +-
 modules/pygwy/Makefile.in                          |    56 +-
 modules/pygwy/README.pygwy                         |    28 +-
 modules/pygwy/extra.defs                           |    25 +
 modules/pygwy/gwy.c                                |    21 +-
 modules/pygwy/pygwy-codegen.py                     |    49 +-
 modules/pygwy/pygwy-console.c                      |   812 +-
 modules/pygwy/pygwy-console.h                      |    16 +-
 modules/pygwy/pygwy-fix-defs-1.py                  |    32 +
 modules/pygwy/pygwy-fix-defs-2.py                  |   603 +
 modules/pygwy/pygwy-fix-defs.py                    |   560 -
 modules/pygwy/pygwy-fix-defs.sed                   |    18 -
 modules/pygwy/pygwy-generate-doc.py                |     7 +-
 modules/pygwy/pygwy.c                              |   277 +-
 modules/pygwy/pygwy.h                              |    26 +-
 modules/pygwy/pygwy.override                       |   140 +-
 modules/pygwy/wrap_calls.c                         |   478 +-
 modules/pygwy/wrap_calls.h                         |   708 +-
 modules/tools/Makefile.am                          |    54 +-
 modules/tools/Makefile.in                          |   325 +-
 modules/tools/crop.c                               |    10 +-
 modules/tools/distance.c                           |    12 +-
 modules/tools/filter.c                             |    32 +-
 modules/tools/grainmeasure.c                       |     4 +-
 modules/tools/grainremover.c                       |     4 +-
 modules/tools/icolorange.c                         |     4 +-
 modules/tools/level3.c                             |    29 +-
 modules/tools/linestats.c                          |     8 +-
 modules/tools/maskedit.c                           |    91 +-
 modules/tools/pathlevel.c                          |    12 +-
 modules/tools/profile.c                            |   681 +-
 modules/tools/readvalue.c                          |   116 +-
 modules/tools/roughness.c                          |    81 +-
 modules/tools/selectionmanager.c                   |     4 +-
 modules/tools/sfunctions.c                         |   240 +-
 modules/tools/spectro.c                            |    91 +-
 modules/tools/spotremove.c                         |     4 +-
 modules/tools/stats.c                              |    26 +-
 modules/tools/tools.c                              |    60 +
 modules/volume/Makefile.am                         |    52 +-
 modules/volume/Makefile.in                         |   265 +-
 modules/volume/volume.c                            |    46 +
 modules/volume/volume_calibrate.c                  |   188 +-
 modules/volume/volume_extract.c                    |   445 +-
 modules/volume/volume_fdfit.c                      |    56 +-
 modules/volume/volume_invert.c                     |    40 +-
 modules/volume/volume_kmeans.c                     |    95 +-
 modules/volume/volume_kmedians.c                   |    27 +-
 modules/volume/volume_linestat.c                   |    72 +-
 modules/volume/volume_slice.c                      |    96 +-
 modules/volume/volume_swaxes.c                     |   716 +
 modules/volume/volume_zcal.c                       |     4 +-
 modules/volume/volumeops.c                         |    89 +
 modules/xyz/Makefile.am                            |    39 +-
 modules/xyz/Makefile.in                            |   132 +-
 modules/xyz/xyz.c                                  |    30 +
 modules/xyz/xyz_drift.c                            |   192 +-
 modules/xyz/xyz_level.c                            |     4 +-
 modules/xyz/xyz_raster.c                           |   323 +-
 perl/Makefile.in                                   |    16 +-
 pixmaps/Makefile.am                                |  1203 +-
 pixmaps/Makefile.in                                |  1466 +-
 pixmaps/gwy_3d_base-24.png                         |   Bin 1316 -> 1119 bytes
 pixmaps/gwy_arithmetic-24.png                      |   Bin 314 -> 250 bytes
 pixmaps/gwy_arithmetic-24.xcf                      |   Bin 8203 -> 0 bytes
 pixmaps/gwy_bold-20.png                            |   Bin 282 -> 353 bytes
 pixmaps/gwy_cantilever-24.png                      |   Bin 642 -> 558 bytes
 pixmaps/gwy_cantilever-24.xcf                      |   Bin 3917 -> 0 bytes
 pixmaps/gwy_color_range-24.png                     |   Bin 426 -> 354 bytes
 pixmaps/gwy_color_range-24.xcf                     |   Bin 12645 -> 0 bytes
 pixmaps/gwy_color_range_adaptive-24.png            |   Bin 674 -> 863 bytes
 pixmaps/gwy_color_range_auto-24.png                |   Bin 592 -> 432 bytes
 pixmaps/gwy_color_range_fixed-24.png               |   Bin 429 -> 391 bytes
 pixmaps/gwy_color_range_full-24.png                |   Bin 334 -> 234 bytes
 pixmaps/gwy_convolution-24.png                     |   Bin 323 -> 337 bytes
 pixmaps/gwy_correct_affine-24.png                  |   Bin 1292 -> 721 bytes
 pixmaps/gwy_correlation_mask-24.png                |   Bin 0 -> 361 bytes
 pixmaps/gwy_crop-24.png                            |   Bin 746 -> 452 bytes
 pixmaps/gwy_crop-24.xcf                            |   Bin 5202 -> 0 bytes
 pixmaps/gwy_cwt-24.png                             |   Bin 589 -> 716 bytes
 pixmaps/gwy_data_measure-24.png                    |   Bin 228 -> 214 bytes
 pixmaps/gwy_direction-24.xcf                       |   Bin 8928 -> 0 bytes
 pixmaps/gwy_disconnected-24.png                    |   Bin 0 -> 486 bytes
 pixmaps/gwy_distance-24.png                        |   Bin 973 -> 316 bytes
 pixmaps/gwy_distance_transform-24.png              |   Bin 1187 -> 786 bytes
 pixmaps/gwy_distribution_angle-24.png              |   Bin 689 -> 689 bytes
 pixmaps/gwy_distribution_slope-24.png              |   Bin 580 -> 654 bytes
 pixmaps/gwy_drift-24.png                           |   Bin 1396 -> 1468 bytes
 pixmaps/gwy_dwt-24.png                             |   Bin 640 -> 815 bytes
 pixmaps/gwy_edge-24.png                            |   Bin 190 -> 190 bytes
 pixmaps/gwy_edge-24.xcf                            |   Bin 3964 -> 0 bytes
 pixmaps/gwy_enforce_distribution-24.png            |   Bin 647 -> 766 bytes
 pixmaps/gwy_entropy-24.png                         |   Bin 305 -> 203 bytes
 pixmaps/gwy_extend-24.png                          |   Bin 262 -> 535 bytes
 pixmaps/gwy_extract_path-24.png                    |   Bin 989 -> 1065 bytes
 pixmaps/gwy_extract_path-24.xcf                    |   Bin 2658 -> 0 bytes
 pixmaps/gwy_facet_level-24.png                     |   Bin 1089 -> 1193 bytes
 pixmaps/gwy_favourite-24.png                       |   Bin 1219 -> 1146 bytes
 pixmaps/gwy_favourite-24.xcf                       |   Bin 2715 -> 0 bytes
 pixmaps/gwy_fft-24.png                             |   Bin 484 -> 728 bytes
 pixmaps/gwy_fft-24.xcf                             |   Bin 5426 -> 0 bytes
 pixmaps/gwy_fft_2d-24.png                          |   Bin 337 -> 657 bytes
 pixmaps/gwy_fft_filter_1d-24.png                   |   Bin 0 -> 611 bytes
 pixmaps/gwy_fft_filter_2d-24.png                   |   Bin 367 -> 300 bytes
 pixmaps/gwy_filter-24.png                          |   Bin 1069 -> 311 bytes
 pixmaps/gwy_filter-24.xcf                          |   Bin 7245 -> 0 bytes
 pixmaps/gwy_find_peaks-24.png                      |   Bin 539 -> 676 bytes
 pixmaps/gwy_fit_shape-24.png                       |   Bin 0 -> 1244 bytes
 pixmaps/gwy_fix_zero-24.png                        |   Bin 509 -> 385 bytes
 pixmaps/gwy_flip_horizontally-24.png               |   Bin 809 -> 585 bytes
 pixmaps/gwy_flip_horizontally-24.xcf               |   Bin 4506 -> 0 bytes
 pixmaps/gwy_flip_vertically-24.png                 |   Bin 855 -> 567 bytes
 pixmaps/gwy_flip_vertically-24.xcf                 |   Bin 5232 -> 0 bytes
 pixmaps/gwy_fractal-24.png                         |   Bin 943 -> 710 bytes
 pixmaps/gwy_fractal_correction-24.png              |   Bin 0 -> 734 bytes
 pixmaps/gwy_fractal_measure-24.png                 |   Bin 0 -> 698 bytes
 pixmaps/gwy_gl_material-16.png                     |   Bin 759 -> 829 bytes
 pixmaps/gwy_gl_material-16.xcf                     |   Bin 1465 -> 0 bytes
 pixmaps/gwy_gradient-24.xcf                        |   Bin 4005 -> 0 bytes
 pixmaps/gwy_gradient_horizontal-24.png             |   Bin 854 -> 615 bytes
 pixmaps/gwy_gradient_vertical-24.png               |   Bin 842 -> 613 bytes
 pixmaps/gwy_grain_correlation-24.png               |   Bin 1007 -> 732 bytes
 pixmaps/gwy_grain_exscribed_circle-24.png          |   Bin 964 -> 531 bytes
 pixmaps/gwy_grain_inscribed_circle-24.png          |   Bin 1023 -> 634 bytes
 pixmaps/gwy_grains-24.png                          |   Bin 748 -> 424 bytes
 pixmaps/gwy_grains-24.xcf                          |   Bin 21806 -> 0 bytes
 pixmaps/gwy_grains_edge-24.png                     |   Bin 1054 -> 492 bytes
 pixmaps/gwy_grains_edge_remove-24.png              |   Bin 699 -> 1232 bytes
 pixmaps/gwy_grains_graph-24.png                    |   Bin 989 -> 430 bytes
 pixmaps/gwy_grains_measure-24.png                  |   Bin 316 -> 573 bytes
 pixmaps/gwy_grains_remove-24.png                   |   Bin 881 -> 493 bytes
 pixmaps/gwy_grains_water-24.png                    |   Bin 1172 -> 1055 bytes
 pixmaps/gwy_graph-24.png                           |   Bin 330 -> 697 bytes
 pixmaps/gwy_graph-24.xcf                           |   Bin 14780 -> 0 bytes
 pixmaps/gwy_graph_align-24.png                     |   Bin 503 -> 555 bytes
 pixmaps/gwy_graph_cut-24.png                       |   Bin 417 -> 523 bytes
 pixmaps/gwy_graph_dos-24.png                       |   Bin 591 -> 1083 bytes
 pixmaps/gwy_graph_export_ascii-24.png              |   Bin 721 -> 314 bytes
 pixmaps/gwy_graph_export_png-24.png                |   Bin 742 -> 314 bytes
 pixmaps/gwy_graph_export_vector-24.png             |   Bin 803 -> 401 bytes
 pixmaps/gwy_graph_fd-24.png                        |   Bin 407 -> 805 bytes
 pixmaps/gwy_graph_filter-24.png                    |   Bin 497 -> 864 bytes
 pixmaps/gwy_graph_function-24.png                  |   Bin 534 -> 993 bytes
 pixmaps/gwy_graph_halfgauss-24.png                 |   Bin 280 -> 473 bytes
 pixmaps/gwy_graph_level-24.png                     |   Bin 445 -> 986 bytes
 pixmaps/gwy_graph_measure-24.png                   |   Bin 376 -> 628 bytes
 pixmaps/gwy_graph_palette-24.png                   |   Bin 529 -> 487 bytes
 pixmaps/gwy_graph_pointer-24.png                   |   Bin 915 -> 851 bytes
 pixmaps/gwy_graph_ruler-24.png                     |   Bin 588 -> 611 bytes
 pixmaps/gwy_graph_vertical-24.png                  |   Bin 330 -> 643 bytes
 pixmaps/gwy_graph_zoom-24.xcf                      |   Bin 6295 -> 0 bytes
 pixmaps/gwy_graph_zoom_fit-24.png                  |   Bin 1287 -> 1126 bytes
 pixmaps/gwy_graph_zoom_in-24.png                   |   Bin 1285 -> 1123 bytes
 pixmaps/gwy_graph_zoom_out-24.png                  |   Bin 1242 -> 1105 bytes
 pixmaps/gwy_hough-24.png                           |   Bin 719 -> 650 bytes
 pixmaps/gwy_immerse-24.png                         |   Bin 279 -> 209 bytes
 pixmaps/gwy_iso_roughness-24.png                   |   Bin 495 -> 723 bytes
 pixmaps/gwy_iso_roughness-24.xcf                   |   Bin 1552 -> 0 bytes
 pixmaps/gwy_italic-20.png                          |   Bin 225 -> 258 bytes
 pixmaps/gwy_less-24.png                            |   Bin 804 -> 1017 bytes
 pixmaps/gwy_less-24.xcf                            |   Bin 4574 -> 0 bytes
 pixmaps/gwy_level-24.png                           |   Bin 610 -> 290 bytes
 pixmaps/gwy_level-24.xcf                           |   Bin 15952 -> 0 bytes
 pixmaps/gwy_level_flatten_base-24.png              |   Bin 636 -> 1237 bytes
 pixmaps/gwy_level_median-24.png                    |   Bin 564 -> 659 bytes
 pixmaps/gwy_level_triangle-24.png                  |   Bin 1075 -> 870 bytes
 pixmaps/gwy_light_rotate-24.png                    |   Bin 1250 -> 1157 bytes
 pixmaps/gwy_light_rotate-24.xcf                    |   Bin 5136 -> 0 bytes
 pixmaps/gwy_line_level-24.png                      |   Bin 284 -> 235 bytes
 pixmaps/gwy_load_debug-20.png                      |   Bin 1248 -> 1148 bytes
 pixmaps/gwy_load_info-20.png                       |   Bin 881 -> 991 bytes
 pixmaps/gwy_load_message-20.xcf                    |   Bin 6909 -> 0 bytes
 pixmaps/gwy_load_warning-20.png                    |   Bin 967 -> 900 bytes
 pixmaps/gwy_local_slope-24.png                     |   Bin 1457 -> 363 bytes
 pixmaps/gwy_logscale_horizontal-24.png             |   Bin 111 -> 335 bytes
 pixmaps/gwy_logscale_vertical-24.png               |   Bin 124 -> 340 bytes
 pixmaps/gwy_mark_outliers-24.png                   |   Bin 0 -> 232 bytes
 pixmaps/gwy_mark_scars-24.png                      |   Bin 0 -> 246 bytes
 pixmaps/gwy_mark_with-24.png                       |   Bin 283 -> 387 bytes
 pixmaps/gwy_markup-20.xcf                          |   Bin 3808 -> 0 bytes
 pixmaps/gwy_mask-16.png                            |   Bin 150 -> 184 bytes
 pixmaps/gwy_mask-16.xcf                            |   Bin 1010 -> 0 bytes
 pixmaps/gwy_mask-24.png                            |   Bin 154 -> 217 bytes
 pixmaps/gwy_mask-24.xcf                            |   Bin 30646 -> 0 bytes
 pixmaps/gwy_mask_add-24.png                        |   Bin 241 -> 246 bytes
 pixmaps/gwy_mask_circle-24.png                     |   Bin 237 -> 674 bytes
 pixmaps/gwy_mask_circle_exclusive-24.png           |   Bin 179 -> 541 bytes
 pixmaps/gwy_mask_circle_inclusive-24.png           |   Bin 175 -> 578 bytes
 pixmaps/gwy_mask_distribute-24.png                 |   Bin 408 -> 290 bytes
 pixmaps/gwy_mask_editor-24.png                     |   Bin 387 -> 927 bytes
 pixmaps/gwy_mask_exclude-24.png                    |   Bin 192 -> 259 bytes
 pixmaps/gwy_mask_exclude_circle-24.png             |   Bin 264 -> 541 bytes
 pixmaps/gwy_mask_extract-24.png                    |   Bin 512 -> 268 bytes
 pixmaps/gwy_mask_fill_draw-24.png                  |   Bin 258 -> 931 bytes
 pixmaps/gwy_mask_fill_erase-24.png                 |   Bin 292 -> 844 bytes
 pixmaps/gwy_mask_grow-24.png                       |   Bin 203 -> 584 bytes
 pixmaps/gwy_mask_intersect-24.png                  |   Bin 241 -> 270 bytes
 pixmaps/gwy_mask_invert-24.png                     |   Bin 273 -> 441 bytes
 pixmaps/gwy_mask_line-24.png                       |   Bin 307 -> 416 bytes
 pixmaps/gwy_mask_morph-24.png                      |   Bin 389 -> 321 bytes
 pixmaps/gwy_mask_paint_draw-24.png                 |   Bin 331 -> 1239 bytes
 pixmaps/gwy_mask_paint_erase-24.png                |   Bin 367 -> 1278 bytes
 pixmaps/gwy_mask_rect_exclusive-24.png             |   Bin 133 -> 195 bytes
 pixmaps/gwy_mask_rect_inclusive-24.png             |   Bin 130 -> 193 bytes
 pixmaps/gwy_mask_remove-24.png                     |   Bin 327 -> 319 bytes
 pixmaps/gwy_mask_set-24.png                        |   Bin 0 -> 197 bytes
 pixmaps/gwy_mask_shrink-24.png                     |   Bin 212 -> 935 bytes
 pixmaps/gwy_mask_subtract-24.png                   |   Bin 240 -> 272 bytes
 pixmaps/gwy_mask_thin-24.png                       |   Bin 321 -> 949 bytes
 pixmaps/gwy_measure-24.xcf                         |   Bin 15275 -> 0 bytes
 pixmaps/gwy_measure_lattice-24.png                 |   Bin 1484 -> 320 bytes
 pixmaps/gwy_merge-24.png                           |   Bin 199 -> 217 bytes
 pixmaps/gwy_more-24.png                            |   Bin 778 -> 1028 bytes
 pixmaps/gwy_more-24.xcf                            |   Bin 5208 -> 0 bytes
 pixmaps/gwy_mutual_crop-24.png                     |   Bin 884 -> 205 bytes
 pixmaps/gwy_neural.svg                             |   347 -
 pixmaps/gwy_neural_apply-24.png                    |   Bin 1253 -> 951 bytes
 pixmaps/gwy_neural_train-24.png                    |   Bin 1250 -> 866 bytes
 pixmaps/gwy_next-24.png                            |   Bin 0 -> 493 bytes
 pixmaps/gwy_null_offsets-24.png                    |   Bin 0 -> 316 bytes
 pixmaps/gwy_palette-24.xcf                         |   Bin 6449 -> 0 bytes
 pixmaps/gwy_palettes-16.png                        |   Bin 230 -> 221 bytes
 pixmaps/gwy_palettes-16.xcf                        |   Bin 1133 -> 0 bytes
 pixmaps/gwy_palettes-24.png                        |   Bin 635 -> 303 bytes
 pixmaps/gwy_path.svg                               |   387 -
 pixmaps/gwy_path_level-24.png                      |   Bin 758 -> 782 bytes
 pixmaps/gwy_pointer_measure-24.png                 |   Bin 968 -> 695 bytes
 pixmaps/gwy_poly_distort-24.png                    |   Bin 1500 -> 1033 bytes
 pixmaps/gwy_poly_distort.svg                       |   301 -
 pixmaps/gwy_polynom-24.png                         |   Bin 408 -> 942 bytes
 pixmaps/gwy_polynom-24.xcf                         |   Bin 3365 -> 0 bytes
 pixmaps/gwy_polynom_level-24.png                   |   Bin 1033 -> 1046 bytes
 pixmaps/gwy_presentation_attach-24.png             |   Bin 1302 -> 0 bytes
 pixmaps/gwy_presentation_edge_canny-24.png         |   Bin 922 -> 0 bytes
 pixmaps/gwy_presentation_edge_harris_corner-24.png |   Bin 1233 -> 0 bytes
 pixmaps/gwy_presentation_edge_hough-24.png         |   Bin 1199 -> 0 bytes
 pixmaps/gwy_presentation_edge_inclination-24.png   |   Bin 1387 -> 0 bytes
 pixmaps/gwy_presentation_edge_laplace_gauss-24.png |   Bin 1231 -> 0 bytes
 ...wy_presentation_edge_local_non_linearity-24.png |   Bin 1396 -> 0 bytes
 pixmaps/gwy_presentation_edge_prewitt-24.png       |   Bin 1452 -> 0 bytes
 pixmaps/gwy_presentation_edge_rms-24.png           |   Bin 1308 -> 0 bytes
 pixmaps/gwy_presentation_edge_rms_edge-24.png      |   Bin 1246 -> 0 bytes
 pixmaps/gwy_presentation_edge_sobel-24.png         |   Bin 1456 -> 0 bytes
 pixmaps/gwy_presentation_edge_step-24.png          |   Bin 1443 -> 0 bytes
 pixmaps/gwy_presentation_edge_zero_crossing-24.png |   Bin 804 -> 0 bytes
 pixmaps/gwy_presentation_extract-24.png            |   Bin 1168 -> 0 bytes
 pixmaps/gwy_presentation_local_contrast-24.png     |   Bin 1330 -> 0 bytes
 pixmaps/gwy_presentation_log-24.png                |   Bin 1233 -> 0 bytes
 pixmaps/gwy_presentation_rank-24.png               |   Bin 1473 -> 0 bytes
 pixmaps/gwy_presentation_remove-24.png             |   Bin 1378 -> 0 bytes
 pixmaps/gwy_presentation_sem-24.png                |   Bin 1345 -> 0 bytes
 pixmaps/gwy_presentation_shading-24.png            |   Bin 1365 -> 0 bytes
 pixmaps/gwy_previous-24.png                        |   Bin 0 -> 461 bytes
 pixmaps/gwy_profile-24.png                         |   Bin 586 -> 592 bytes
 pixmaps/gwy_profile-24.xcf                         |   Bin 1726 -> 0 bytes
 pixmaps/gwy_pygwy-24.png                           |   Bin 932 -> 813 bytes
 pixmaps/gwy_pygwy-24.xcf                           |   Bin 2351 -> 0 bytes
 pixmaps/gwy_remove_under_mask-24.png               |   Bin 369 -> 438 bytes
 pixmaps/gwy_remove_under_mask-24.xcf               |   Bin 2054 -> 0 bytes
 pixmaps/gwy_rotate-24.png                          |   Bin 1707 -> 835 bytes
 pixmaps/gwy_rotate-24.xcf                          |   Bin 6496 -> 0 bytes
 pixmaps/gwy_rotate_180-24.png                      |   Bin 1382 -> 1272 bytes
 pixmaps/gwy_rotate_180-24.xcf                      |   Bin 4363 -> 0 bytes
 pixmaps/gwy_rotate_3d-24.png                       |   Bin 0 -> 1212 bytes
 pixmaps/gwy_rotate_90_ccw-24.png                   |   Bin 1071 -> 660 bytes
 pixmaps/gwy_rotate_90_ccw-24.xcf                   |   Bin 4008 -> 0 bytes
 pixmaps/gwy_rotate_90_cw-24.png                    |   Bin 1116 -> 616 bytes
 pixmaps/gwy_rotate_90_cw-24.xcf                    |   Bin 3972 -> 0 bytes
 pixmaps/gwy_scale-24.png                           |   Bin 422 -> 377 bytes
 pixmaps/gwy_scale-24.xcf                           |   Bin 3472 -> 0 bytes
 pixmaps/gwy_scale_horizontally-24.png              |   Bin 1255 -> 614 bytes
 pixmaps/gwy_scale_horizontally-24.xcf              |   Bin 6895 -> 0 bytes
 pixmaps/gwy_scale_vertically-24.png                |   Bin 1097 -> 577 bytes
 pixmaps/gwy_scale_vertically-24.xcf                |   Bin 8028 -> 0 bytes
 pixmaps/gwy_scars-24.png                           |   Bin 276 -> 206 bytes
 pixmaps/gwy_selection-24.xcf                       |   Bin 1683 -> 0 bytes
 pixmaps/gwy_selections-24.png                      |   Bin 342 -> 307 bytes
 pixmaps/gwy_shader-24.png                          |   Bin 1256 -> 1288 bytes
 pixmaps/gwy_shader-24.xcf                          |   Bin 4787 -> 0 bytes
 pixmaps/gwy_spectrum-24.png                        |   Bin 464 -> 990 bytes
 pixmaps/gwy_spectrum-24.xcf                        |   Bin 1265 -> 0 bytes
 pixmaps/gwy_spot_remove-24.png                     |   Bin 309 -> 361 bytes
 pixmaps/gwy_spot_remove-24.xcf                     |   Bin 2284 -> 0 bytes
 pixmaps/gwy_stat_quantities-24.png                 |   Bin 642 -> 316 bytes
 pixmaps/gwy_stat_quantities-24.xcf                 |   Bin 6556 -> 0 bytes
 pixmaps/gwy_stats-24.xcf                           |   Bin 29299 -> 0 bytes
 pixmaps/gwy_straighten_path-24.png                 |   Bin 1142 -> 994 bytes
 pixmaps/gwy_subscript-20.png                       |   Bin 382 -> 396 bytes
 pixmaps/gwy_superscript-20.png                     |   Bin 400 -> 402 bytes
 pixmaps/gwy_synthetic-24.xcf                       |   Bin 21514 -> 0 bytes
 pixmaps/gwy_synthetic_ballistic_deposition-24.png  |   Bin 1790 -> 1424 bytes
 pixmaps/gwy_synthetic_brownian_motion-24.png       |   Bin 1348 -> 1352 bytes
 pixmaps/gwy_synthetic_columnar-24.png              |   Bin 1395 -> 1414 bytes
 pixmaps/gwy_synthetic_diffusion-24.png             |   Bin 1287 -> 1166 bytes
 pixmaps/gwy_synthetic_domains-24.png               |   Bin 1596 -> 1271 bytes
 pixmaps/gwy_synthetic_fibres-24.png                |   Bin 0 -> 1178 bytes
 pixmaps/gwy_synthetic_lattice-24.png               |   Bin 1398 -> 1212 bytes
 pixmaps/gwy_synthetic_line_noise-24.png            |   Bin 436 -> 382 bytes
 pixmaps/gwy_synthetic_noise-24.png                 |   Bin 1841 -> 1490 bytes
 pixmaps/gwy_synthetic_objects-24.png               |   Bin 994 -> 958 bytes
 pixmaps/gwy_synthetic_particles-24.png             |   Bin 1476 -> 1312 bytes
 pixmaps/gwy_synthetic_pattern-24.png               |   Bin 766 -> 613 bytes
 pixmaps/gwy_synthetic_phases-24.png                |   Bin 0 -> 354 bytes
 pixmaps/gwy_synthetic_spectral-24.png              |   Bin 1383 -> 1379 bytes
 pixmaps/gwy_synthetic_waves-24.png                 |   Bin 1665 -> 1259 bytes
 pixmaps/gwy_tilt-24.png                            |   Bin 521 -> 1511 bytes
 pixmaps/gwy_tip-24.xcf                             |   Bin 13355 -> 0 bytes
 pixmaps/gwy_tip_dilation-24.png                    |   Bin 614 -> 839 bytes
 pixmaps/gwy_tip_erosion-24.png                     |   Bin 585 -> 781 bytes
 pixmaps/gwy_tip_estimation-24.png                  |   Bin 818 -> 663 bytes
 pixmaps/gwy_tip_indent_analyze-24.png              |   Bin 778 -> 750 bytes
 pixmaps/gwy_tip_lateral_force-24.png               |   Bin 643 -> 1342 bytes
 pixmaps/gwy_tip_map-24.png                         |   Bin 1695 -> 899 bytes
 pixmaps/gwy_tip_model-24.png                       |   Bin 745 -> 599 bytes
 pixmaps/gwy_tip_pid-24.png                         |   Bin 821 -> 767 bytes
 pixmaps/gwy_transform-24.xcf                       |   Bin 5131 -> 0 bytes
 pixmaps/gwy_unrotate-24.png                        |   Bin 409 -> 623 bytes
 pixmaps/gwy_unrotate-24.xcf                        |   Bin 2779 -> 0 bytes
 pixmaps/gwy_value_invert-24.png                    |   Bin 321 -> 378 bytes
 pixmaps/gwy_value_invert-24.xcf                    |   Bin 2930 -> 0 bytes
 pixmaps/gwy_volume-24.png                          |   Bin 1385 -> 1404 bytes
 pixmaps/gwy_volume.svg                             |  2277 ---
 pixmaps/gwy_volume_calibrate-24.png                |   Bin 1118 -> 1106 bytes
 pixmaps/gwy_volume_dimensions-24.png               |   Bin 1281 -> 909 bytes
 pixmaps/gwy_volume_fd-24.png                       |   Bin 1425 -> 1630 bytes
 pixmaps/gwy_volume_invert-24.png                   |   Bin 1612 -> 1056 bytes
 pixmaps/gwy_volume_kmeans-24.png                   |   Bin 1437 -> 1179 bytes
 pixmaps/gwy_volume_kmedians-24.png                 |   Bin 1430 -> 988 bytes
 pixmaps/gwy_volume_slice-24.png                    |   Bin 1575 -> 1359 bytes
 pixmaps/gwy_volumize-24.png                        |   Bin 1489 -> 1098 bytes
 pixmaps/gwy_volumize_layers-24.png                 |   Bin 1702 -> 1252 bytes
 pixmaps/gwy_xy_denoise-24.png                      |   Bin 0 -> 243 bytes
 pixmaps/gwy_zero_mean-24.png                       |   Bin 579 -> 394 bytes
 pixmaps/gwy_zoom-24.xcf                            |   Bin 7335 -> 0 bytes
 pixmaps/gwy_zoom_1_1-24.png                        |   Bin 1451 -> 1112 bytes
 pixmaps/gwy_zoom_fit-24.png                        |   Bin 1454 -> 1101 bytes
 pixmaps/gwy_zoom_in-24.png                         |   Bin 1449 -> 1090 bytes
 pixmaps/gwy_zoom_out-24.png                        |   Bin 1408 -> 1084 bytes
 pixmaps/src/Makefile.am                            |   242 +
 pixmaps/src/Makefile.in                            |   805 +
 pixmaps/{ => src}/cd_line.xcf                      |   Bin
 pixmaps/{ => src}/cd_rline.xcf                     |   Bin
 pixmaps/{ => src}/cd_rstep.xcf                     |   Bin
 pixmaps/{ => src}/cd_step.xcf                      |   Bin
 pixmaps/src/gwy_3d_base-24.svg                     |   156 +
 pixmaps/{ => src}/gwy_3d_base-24.xcf               |   Bin
 pixmaps/src/gwy_arithmetic-24.svg                  |   117 +
 pixmaps/src/gwy_bold-20.svg                        |   106 +
 pixmaps/src/gwy_cantilever-24.svg                  |   139 +
 pixmaps/src/gwy_color_range-24.svg                 |   143 +
 pixmaps/src/gwy_color_range_adaptive-24.svg        |   121 +
 pixmaps/src/gwy_color_range_auto-24.svg            |   131 +
 pixmaps/src/gwy_color_range_fixed-24.svg           |   166 +
 pixmaps/src/gwy_color_range_full-24.svg            |   112 +
 pixmaps/src/gwy_convolution-24.svg                 |  1050 ++
 pixmaps/src/gwy_correct_affine-24.svg              |   176 +
 pixmaps/src/gwy_correlation_mask-24.svg            |   180 +
 pixmaps/src/gwy_crop-24.svg                        |   158 +
 pixmaps/src/gwy_cwt-24.svg                         |  1632 ++
 pixmaps/src/gwy_data_measure-24.svg                |   574 +
 pixmaps/src/gwy_disconnected-24.svg                |   178 +
 pixmaps/src/gwy_distance-24.svg                    |   156 +
 pixmaps/src/gwy_distance_transform-24.svg          |   235 +
 pixmaps/src/gwy_distribution_angle-24.svg          |   132 +
 pixmaps/src/gwy_distribution_slope-24.svg          |   139 +
 pixmaps/src/gwy_drift-96.svg                       |   224 +
 pixmaps/src/gwy_dwt-24.svg                         |  1352 ++
 pixmaps/src/gwy_edge-24.svg                        |    99 +
 pixmaps/src/gwy_enforce_distribution-24.svg        |   144 +
 pixmaps/src/gwy_entropy-24.svg                     |   153 +
 pixmaps/src/gwy_extend-24.svg                      |   186 +
 pixmaps/src/gwy_extract_path-24.svg                |   172 +
 pixmaps/src/gwy_facet_level-24.svg                 |   263 +
 pixmaps/src/gwy_favourite-24.svg                   |   199 +
 pixmaps/src/gwy_fft-24.svg                         |   656 +
 pixmaps/src/gwy_fft_2d-24.svg                      |   117 +
 pixmaps/src/gwy_fft_filter_1d-24.svg               |   147 +
 pixmaps/src/gwy_fft_filter_2d-24.svg               |   173 +
 pixmaps/src/gwy_filter-24.svg                      |   895 ++
 pixmaps/src/gwy_find_peaks-24.svg                  |   174 +
 pixmaps/src/gwy_fit_shape-24.svg                   |   205 +
 pixmaps/src/gwy_fix_zero-24.svg                    |   163 +
 pixmaps/src/gwy_flip_horizontally-24.svg           |   121 +
 pixmaps/src/gwy_flip_vertically-24.svg             |   122 +
 pixmaps/src/gwy_fractal-24.svg                     |   128 +
 pixmaps/src/gwy_fractal_correction-24.svg          |   117 +
 pixmaps/src/gwy_fractal_measure-24.svg             |   136 +
 pixmaps/src/gwy_gl_material-16.svg                 |   121 +
 pixmaps/src/gwy_gradient_horizontal-24.svg         |   116 +
 pixmaps/src/gwy_gradient_vertical-24.svg           |   120 +
 pixmaps/src/gwy_grain_correlation-24.svg           |   219 +
 pixmaps/src/gwy_grain_exscribed_circle-24.svg      |    82 +
 pixmaps/src/gwy_grain_inscribed_circle-24.svg      |    82 +
 pixmaps/src/gwy_grains-24.svg                      |   163 +
 pixmaps/src/gwy_grains_edge-24.svg                 |   204 +
 pixmaps/src/gwy_grains_edge_remove-24.svg          |   296 +
 pixmaps/src/gwy_grains_graph-24.svg                |   188 +
 pixmaps/src/gwy_grains_measure-24.svg              |   122 +
 pixmaps/src/gwy_grains_remove-24.svg               |   180 +
 pixmaps/src/gwy_grains_water-24.svg                |   271 +
 pixmaps/src/gwy_graph-24.svg                       |   132 +
 pixmaps/src/gwy_graph_align-24.svg                 |   143 +
 pixmaps/src/gwy_graph_cut-24.svg                   |   142 +
 pixmaps/src/gwy_graph_dos-24.svg                   |   170 +
 pixmaps/src/gwy_graph_export_ascii-24.svg          |   247 +
 pixmaps/src/gwy_graph_export_png-24.svg            |   215 +
 pixmaps/src/gwy_graph_export_vector-24.svg         |   216 +
 pixmaps/src/gwy_graph_fd-24.svg                    |   138 +
 pixmaps/src/gwy_graph_filter-24.svg                |   144 +
 pixmaps/src/gwy_graph_function-24.svg              |   138 +
 pixmaps/src/gwy_graph_halfgauss-24.svg             |   131 +
 pixmaps/src/gwy_graph_level-24.svg                 |   160 +
 pixmaps/src/gwy_graph_measure-24.svg               |  1669 ++
 pixmaps/src/gwy_graph_palette-24.svg               |   118 +
 pixmaps/src/gwy_graph_pointer-24.svg               |   150 +
 pixmaps/src/gwy_graph_ruler-24.svg                 |   181 +
 pixmaps/src/gwy_graph_vertical-24.svg              |   132 +
 pixmaps/src/gwy_graph_zoom_fit-24.svg              |   405 +
 pixmaps/src/gwy_graph_zoom_in-24.svg               |   405 +
 pixmaps/src/gwy_graph_zoom_out-24.svg              |   386 +
 .../html => pixmaps/src}/gwy_hough-24.png          |   Bin
 pixmaps/src/gwy_hough-24.svg                       |   163 +
 pixmaps/src/gwy_immerse-24.svg                     |    87 +
 pixmaps/src/gwy_iso_roughness-24.svg               |    93 +
 pixmaps/src/gwy_italic-20.svg                      |   106 +
 pixmaps/src/gwy_less-24.svg                        |    85 +
 pixmaps/src/gwy_level-24.svg                       |   102 +
 pixmaps/src/gwy_level_flatten_base-24.svg          |   217 +
 pixmaps/src/gwy_level_median-24.svg                |   210 +
 pixmaps/src/gwy_level_triangle-24.svg              |   110 +
 pixmaps/src/gwy_light_rotate-24.svg                |   157 +
 pixmaps/src/gwy_line_level-24.svg                  |   177 +
 pixmaps/src/gwy_load_debug-20.svg                  |   133 +
 pixmaps/src/gwy_load_info-20.svg                   |   144 +
 pixmaps/src/gwy_load_warning-20.svg                |   148 +
 .../html => pixmaps/src}/gwy_local_slope-24.png    |   Bin
 pixmaps/src/gwy_local_slope-24.svg                 |   163 +
 pixmaps/src/gwy_logscale_horizontal-24.svg         |   868 +
 pixmaps/src/gwy_logscale_vertical-24.svg           |   872 +
 pixmaps/src/gwy_mark_outliers-24.svg               |   160 +
 pixmaps/src/gwy_mark_scars-24.svg                  |   149 +
 pixmaps/src/gwy_mark_with-24.svg                   |   119 +
 pixmaps/src/gwy_mask-16.svg                        |    79 +
 pixmaps/src/gwy_mask-24.svg                        |    76 +
 pixmaps/src/gwy_mask_add-24.svg                    |    90 +
 pixmaps/src/gwy_mask_circle-24.svg                 |    76 +
 pixmaps/src/gwy_mask_circle_exclusive-24.svg       |    83 +
 pixmaps/src/gwy_mask_circle_inclusive-24.svg       |    76 +
 pixmaps/src/gwy_mask_distribute-24.svg             |   107 +
 pixmaps/src/gwy_mask_editor-24.svg                 |   122 +
 pixmaps/src/gwy_mask_exclude-24.svg                |    83 +
 pixmaps/src/gwy_mask_exclude_circle-24.svg         |    83 +
 pixmaps/src/gwy_mask_extract-24.svg                |   106 +
 pixmaps/src/gwy_mask_fill_draw-24.svg              |   115 +
 pixmaps/src/gwy_mask_fill_erase-24.svg             |   122 +
 pixmaps/src/gwy_mask_grow-24.svg                   |   175 +
 pixmaps/src/gwy_mask_intersect-24.svg              |   104 +
 pixmaps/src/gwy_mask_invert-24.svg                 |   121 +
 pixmaps/src/gwy_mask_line-24.svg                   |    79 +
 pixmaps/src/gwy_mask_morph-24.svg                  |   102 +
 pixmaps/src/gwy_mask_paint_draw-24.svg             |   114 +
 pixmaps/src/gwy_mask_paint_erase-24.svg            |   121 +
 pixmaps/src/gwy_mask_rect_exclusive-24.svg         |    88 +
 pixmaps/src/gwy_mask_rect_inclusive-24.svg         |    76 +
 pixmaps/src/gwy_mask_remove-24.svg                 |   101 +
 pixmaps/src/gwy_mask_shrink-24.svg                 |   182 +
 pixmaps/src/gwy_mask_subtract-24.svg               |    95 +
 pixmaps/src/gwy_mask_thin-24.svg                   |   103 +
 pixmaps/src/gwy_measure_lattice-24.svg             |   310 +
 pixmaps/src/gwy_merge-24.svg                       |    93 +
 pixmaps/src/gwy_more-24.svg                        |    91 +
 pixmaps/src/gwy_mutual_crop-24.svg                 |    99 +
 pixmaps/src/gwy_neural_apply-24.svg                |   228 +
 pixmaps/src/gwy_neural_train-24.svg                |   216 +
 pixmaps/src/gwy_next-24.svg                        |   112 +
 pixmaps/src/gwy_null_offsets-24.svg                |   703 +
 pixmaps/src/gwy_palettes-16.svg                    |   154 +
 pixmaps/src/gwy_palettes-24.svg                    |   183 +
 pixmaps/src/gwy_path_level-24.svg                  |   133 +
 pixmaps/src/gwy_pointer_measure-24.svg             |   124 +
 pixmaps/src/gwy_poly_distort-24.svg                |   130 +
 pixmaps/src/gwy_polynom-24.svg                     |    94 +
 pixmaps/src/gwy_polynom_level-24.svg               |   129 +
 pixmaps/{ => src}/gwy_presentation-24.xcf          |   Bin
 .../src}/gwy_presentation_attach-24.png            |   Bin
 .../src}/gwy_presentation_edge_canny-24.png        |   Bin
 .../gwy_presentation_edge_harris_corner-24.png     |   Bin
 .../src}/gwy_presentation_edge_hough-24.png        |   Bin
 .../src}/gwy_presentation_edge_inclination-24.png  |   Bin
 .../gwy_presentation_edge_laplace_gauss-24.png     |   Bin
 ...wy_presentation_edge_local_non_linearity-24.png |   Bin
 .../src}/gwy_presentation_edge_prewitt-24.png      |   Bin
 .../src}/gwy_presentation_edge_rms-24.png          |   Bin
 .../src}/gwy_presentation_edge_rms_edge-24.png     |   Bin
 .../src}/gwy_presentation_edge_sobel-24.png        |   Bin
 .../src}/gwy_presentation_edge_step-24.png         |   Bin
 .../gwy_presentation_edge_zero_crossing-24.png     |   Bin
 .../src}/gwy_presentation_extract-24.png           |   Bin
 .../src}/gwy_presentation_local_contrast-24.png    |   Bin
 .../src}/gwy_presentation_log-24.png               |   Bin
 pixmaps/{ => src}/gwy_presentation_ops-24.xcf      |   Bin
 .../src}/gwy_presentation_rank-24.png              |   Bin
 .../src}/gwy_presentation_remove-24.png            |   Bin
 .../src}/gwy_presentation_sem-24.png               |   Bin
 .../src}/gwy_presentation_shading-24.png           |   Bin
 pixmaps/src/gwy_previous-24.svg                    |   114 +
 pixmaps/src/gwy_profile-24.svg                     |   486 +
 pixmaps/src/gwy_pygwy-24.svg                       |   276 +
 pixmaps/src/gwy_remove_under_mask-24.svg           |   111 +
 pixmaps/src/gwy_rotate-24.svg                      |   130 +
 pixmaps/src/gwy_rotate_180-24.svg                  |   151 +
 pixmaps/src/gwy_rotate_3d-24.svg                   |   156 +
 pixmaps/src/gwy_rotate_90_ccw-24.svg               |   200 +
 pixmaps/src/gwy_rotate_90_cw-24.svg                |   214 +
 pixmaps/src/gwy_scale-24.svg                       |   105 +
 pixmaps/src/gwy_scale_horizontally-24.svg          |   176 +
 pixmaps/src/gwy_scale_vertically-24.svg            |   176 +
 pixmaps/src/gwy_scars-24.svg                       |    95 +
 pixmaps/src/gwy_selections-24.svg                  |   147 +
 pixmaps/src/gwy_shader-24.svg                      |    93 +
 pixmaps/src/gwy_spectrum-24.svg                    |   117 +
 pixmaps/src/gwy_spot_remove-24.svg                 |    98 +
 pixmaps/src/gwy_stat_quantities-24.svg             |   157 +
 pixmaps/src/gwy_straighten_path-24.svg             |   631 +
 pixmaps/src/gwy_subscript-20.svg                   |   117 +
 pixmaps/src/gwy_superscript-20.svg                 |   117 +
 .../src/gwy_synthetic_ballistic_deposition-24.svg  |   114 +
 pixmaps/src/gwy_synthetic_brownian_motion-24.svg   |   112 +
 pixmaps/src/gwy_synthetic_columnar-24.svg          |   113 +
 pixmaps/src/gwy_synthetic_diffusion-24.svg         |   110 +
 pixmaps/src/gwy_synthetic_domains-24.svg           |   111 +
 pixmaps/src/gwy_synthetic_fibres-24.svg            |   112 +
 pixmaps/src/gwy_synthetic_lattice-24.svg           |   110 +
 pixmaps/src/gwy_synthetic_line_noise-24.svg        |    96 +
 pixmaps/src/gwy_synthetic_noise-24.svg             |   115 +
 pixmaps/src/gwy_synthetic_objects-24.svg           |   105 +
 pixmaps/src/gwy_synthetic_particles-24.svg         |   112 +
 pixmaps/src/gwy_synthetic_pattern-24.svg           |   100 +
 pixmaps/src/gwy_synthetic_phases-24.svg            |    96 +
 pixmaps/src/gwy_synthetic_spectral-24.svg          |   112 +
 pixmaps/src/gwy_synthetic_waves-24.svg             |   111 +
 pixmaps/src/gwy_tilt-24.svg                        |   177 +
 pixmaps/src/gwy_tip_dilation-24.svg                |  1121 ++
 pixmaps/src/gwy_tip_erosion-24.svg                 |  1121 ++
 pixmaps/src/gwy_tip_estimation-24.svg              |   150 +
 pixmaps/src/gwy_tip_indent_analyze-24.svg          |  1115 ++
 pixmaps/src/gwy_tip_lateral_force-24.svg           |   212 +
 pixmaps/src/gwy_tip_map-24.svg                     |   170 +
 pixmaps/src/gwy_tip_model-24.svg                   |   161 +
 pixmaps/src/gwy_tip_pid-24.svg                     |  1114 ++
 pixmaps/src/gwy_transform-24.xcf                   |   Bin 0 -> 5723 bytes
 pixmaps/src/gwy_unrotate-24.svg                    |   123 +
 pixmaps/src/gwy_value_invert-24.svg                |   111 +
 pixmaps/src/gwy_volume-24.svg                      |   106 +
 pixmaps/src/gwy_volume_calibrate-24.svg            |   186 +
 pixmaps/src/gwy_volume_dimensions-24.svg           |   634 +
 pixmaps/src/gwy_volume_fd-24.svg                   |   126 +
 pixmaps/src/gwy_volume_invert-24.svg               |   153 +
 pixmaps/src/gwy_volume_kmeans-24.svg               |   187 +
 pixmaps/src/gwy_volume_kmedians-24.svg             |   181 +
 pixmaps/src/gwy_volume_slice-24.svg                |   117 +
 pixmaps/src/gwy_xy_denoise-24.svg                  |   149 +
 pixmaps/src/gwy_zero_mean-24.svg                   |   162 +
 pixmaps/src/gwy_zoom_1_1-24.svg                    |   339 +
 pixmaps/src/gwy_zoom_fit-24.svg                    |   290 +
 pixmaps/src/gwy_zoom_in-24.svg                     |   271 +
 pixmaps/src/gwy_zoom_out-24.svg                    |   251 +
 plugins/Makefile.in                                |    16 +-
 plugins/file/Makefile.in                           |    16 +-
 plugins/process/Makefile.in                        |    16 +-
 po/LINGUAS                                         |     2 +-
 po/POTFILES.in                                     |    17 +
 po/cs.gmo                                          |   Bin 262834 -> 275316 bytes
 po/cs.po                                           |  5044 +++---
 po/de.gmo                                          |   Bin 79414 -> 78554 bytes
 po/de.po                                           |  5157 +++---
 po/en_GB.gmo                                       |   Bin 249208 -> 261061 bytes
 po/en_GB.po                                        |  5094 +++---
 po/es.gmo                                          |   Bin 56358 -> 55693 bytes
 po/es.po                                           |  5184 +++---
 po/fr.gmo                                          |   Bin 271255 -> 284096 bytes
 po/fr.po                                           |  5188 +++---
 po/gwyddion.pot                                    |  4977 +++---
 po/it.gmo                                          |   Bin 249846 -> 246962 bytes
 po/it.po                                           |  5169 +++---
 po/ko.gmo                                          |   Bin 38411 -> 37804 bytes
 po/ko.po                                           |  5033 +++---
 po/pt_BR.gmo                                       |   Bin 0 -> 263282 bytes
 po/pt_BR.po                                        | 16060 +++++++++++++++++++
 po/ru.gmo                                          |   Bin 343531 -> 360269 bytes
 po/ru.po                                           |  5338 +++---
 python/Makefile.in                                 |    16 +-
 ruby/Makefile.in                                   |    16 +-
 thumbnailer/Makefile.in                            |    16 +-
 utils/Makefile.am                                  |     3 +-
 utils/Makefile.in                                  |    19 +-
 utils/gen-gwyddion-msvc-sln.py                     |    11 +-
 utils/gen-module-bundle.sh                         |    55 +
 utils/genmarshal.mk                                |     5 +-
 utils/mkenum.mk                                    |     5 +-
 utils/update-api-indices.py                        |     3 +
 utils/update-langs.py                              |    17 +-
 utils/user-guide-modules                           |    24 +-
 1566 files changed, 154148 insertions(+), 52579 deletions(-)

diff --git a/AUTHORS b/AUTHORS
index a22132e..b5abd2f 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -79,6 +79,8 @@ Samo Ziberna <samo.ziberna at aperesearch.com>
     APE DAX import module improvements.
 Antony Kikaxa <antony.kikaxa at gmail.com>
     NanoScanTech format improvements.
+Felix Kling <kling at rybkachess.com>
+    Icons and other graphics.
 
 
 === Translators ===
@@ -98,6 +100,8 @@ François Riguet <francheu at caramail.com>
     Russian.
 Andrés Muñiz Piniella <andresmp at gmail.com>
     Spanish.
+Fellype do Nascimento <fellypao at yahoo.com.br>
+    Brazilian Portugese.
 Jeong Jiseong <stopstar at gist.ac.kr>
     Korean.
 
diff --git a/INSTALL.gwyddion b/INSTALL.gwyddion
deleted file mode 100644
index 3900a14..0000000
--- a/INSTALL.gwyddion
+++ /dev/null
@@ -1,165 +0,0 @@
-
-Contents:
-0. Prebuilt binaries
-1. From sources -- Linux/Unix
-2. From sources -- MS Windows
-3. From sources -- Mac OS X
-4. From Subversion (Linux/Unix only)
-5. Pygwy under MS Windows
-6. Modules and plug-ins
-
-===[ 0. Prebuilt binaries ]==================================================
-
-Binary packages provided by us, i.e. installers from MS Windows, require no
-additional setup after standard package installation procedure.  If you have
-never installed Gwyddion (or other Gtk+ application), you will need to
-install of Gtk+ runtime libraries prior to Gwyddion installation, we
-recommend GladeWin32 packages.
-
-We cannot tell for packages provided for other systems by other entities, but
-do not expect them to require any additional setup either.
-
-
-===[ 1. From sources -- Linux/Unix ]=========================================
-
-See the section Build Dependencies of the Gwyddion user guide for the list
-and description of required and optional packages.
-
-Read generic GNU installation instruction in INSTALL that describe the build
-process, common program arguments, and important environment variables.
-
-Quick instructions:
-Unpack tarball with sources, cd to the created directory, then run:
-  ./configure
-  make
-and as root run:
-  make install
-
-If you have Gtk+ (or other packages, e.g., FFTW) in a nonstandard directory,
-assure PKG_CONFIG_PATH environment variable points to directory where
-gtk+-2.0.pc (e.g.) resides.
-
-If you install to a subdirectory of home, you will probably use option
---enable-home-installation of ./configure to put desktop integration files
-into the right places specified by XDG (i.e. outside the prefix).
-
-To prevent the installation of GConf schemas, even though you have enabled the
-GNOME thumbnailer, run `make install DISABLE_GCONF_SCHEMAS_INSTALL=yes'.  To
-ease packaging, it is automatically disabled when DESTDIR is non-empty.
-
-
-===[ 2. Cross compilation for MS Windows ]===================================
-
-See the user guide.
-
-===[ 3. From sources -- Mac OS X ]===========================================
-
-Essentially, the Unix instructions apply here too.
-
-It's recommended to use Darwinports for installing the dependencies.  You
-need to install ports for gtk2, pkg-config; that should pull all the other
-dependencies.  It is recommended to install gtkglext and libxml2 too.
-
-To make sure headers and libraries are found where Darwinports install them
-you may want to explicitely set:
-
-  CFLAGS='-I/opt/local/include -I/usr/X11R6/include'
-  LDFLAGS='-L/opt/local/lib -I/usr/X11R6/lib'
-
-Also make sure /opt/local/bin is in the PATH so that pkg-config can be found.
-
-Note until Gtk+ Quartz port is finished, it's necessary to start an X11
-server before running Gwyddion.
-
-
-===[ 4. From Subversion (Linux/Unix only) ]==================================
-
-The Subversion repository generally doesn't contain generated files, no
-matter how unusual tools may be needed to generate them.  Consider use of
-nightly snapshot tarballs available at
-
-  http://gwyddion.net/download.php#head
-
-Prerequisities:
-- everything needed for compilation from tarballs
-- GNU autoconf 2.60 or newer
-- GNU automake 1.11 or newer
-- GNU libtool 1.4 or newer
-- Python-2.2 or newer
-- Perl5
-- gtk-doc 1.8 or newer
-- GNU gettext 0.12 or newer, including development stuff
-- who knows what else
-
-First of all run
-  ./autogen.sh
-with any options you'd give to ./configure, note it always adds
---enable-maintainer-mode.  You should add at least --enable-gtk-doc to
-build the API documentation (tarballs cannot be made without it).
-
-You should be able to build executables then with
-  make
-
-At this point that all files that are included in source tarball should be
-created, and
-  make install
-or
-  make dist
-will work as expected.
-
-
-===[ 5. Pygwy under MS Windows ]=============================================
-
-1. Python 2.4.X
-   Get Python sources
-   Unpack it for example to D:\
-   Open workspace $PYTHON_DIR\PC\VC6\pcbuild.dsw in Visual Studio 6
-   Set 'pythoncore' as active project
-   Choose Release configuration using Build/Set Active Configuration menu
-   Build python24.dll
-
-2. Pygobject 2.12.X
-   If GTK is not installed, install its development version.
-   In MSVC 6 check and possibly add in Tools/Options/Directories
-   following Include files directories (GTK directories should already be
-   set in case you allowed the GTK installer to do it):
-        D:\GTK\INCLUDE
-        D:\GTK\INCLUDE\GTK-2.0
-        D:\GTK\INCLUDE\GLIB-2.0
-        D:\GTK\INCLUDE\PANGO-1.0
-        D:\GTK\INCLUDE\CAIRO
-        D:\GTK\INCLUDE\ATK-1.0
-        D:\GTK\INCLUDE\GTKGLEXT-1.0
-        D:\GTK\LIB\GTK-2.0\INCLUDE
-        D:\GTK\LIB\GTK-2.0\INCLUDE
-        D:\GTK\LIB\GLIB-2.0\INCLUDE
-        D:\GTK\LIB\GTKGLEXT-1.0\INCLUDE
-        D:\GTK\INCLUDE\LIBGLADE-2.0
-        D:\GTK\INCLUDE\LIBXML2
-        D:\PYTHON-2.4.4\INCLUDE
-        D:\PYTHON-2.4.4\PC
-   Library files:
-        D:\GTK\LIB
-        D:\PYTHON-2.4.4\PC\VC6
-   Note: Don't forget to use your own path to GTK and Python directories.
-   Get pygobject sources
-   Unpack it for example to D:\
-   Use provided workspace and project file (pygobject.dsp, pygobject.dsw)
-   and put them into pygobject directory.
-   Open workspace $PYGOBJECT_DIR\pygobject.dsw in Visual Studio 6
-   Choose Release configuration using Build/Set Active Configuration menu
-   Build pygobject.dll
-
-3. Gwyddion
-   Set path variables (PYTHON_TOP, PYGOBJECT_TOP) in make.msc to coresponding
-   values and enable pygwy by uncommenting ENABLE_PYGWY variable.
-   Compile & install
-
-Note: to see messages printed by Python interpreter to stdout you can add
-/subsystem:console to LDFLAGS in make.msc and recompile & reinstall Gwyddion.
-
-
-===[ 6. Modules and plug-ins ]===============================================
-
-To be written.
-
diff --git a/Makefile.am b/Makefile.am
index af6019a..dc24d8d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,4 +1,4 @@
-# @(#) $Id: Makefile.am 11681 2010-12-10 07:56:23Z yeti-dn $
+# @(#) $Id: Makefile.am 19685 2017-05-03 13:13:56Z yeti-dn $
 
 SUBDIRS = \
 	m4 \
@@ -21,7 +21,6 @@ SUBDIRS = \
 	devel-docs
 
 EXTRA_DIST = \
-	INSTALL.gwyddion \
 	autogen.sh \
 	gwyddion.spec
 
diff --git a/Makefile.in b/Makefile.in
index 808bb0f..7afb2ed 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -14,7 +14,7 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 11681 2010-12-10 07:56:23Z yeti-dn $
+# @(#) $Id: Makefile.am 19685 2017-05-03 13:13:56Z yeti-dn $
 
 VPATH = @srcdir@
 am__is_gnu_make = { \
@@ -284,10 +284,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -297,6 +294,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -321,7 +320,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -379,6 +380,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -387,17 +389,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -503,7 +501,6 @@ SUBDIRS = \
 	devel-docs
 
 EXTRA_DIST = \
-	INSTALL.gwyddion \
 	autogen.sh \
 	gwyddion.spec
 
@@ -779,7 +776,7 @@ distdir: $(DISTFILES)
 	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
 	|| chmod -R a+r "$(distdir)"
 dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
 	$(am__post_remove_distdir)
 
 dist-bzip2: distdir
@@ -804,7 +801,7 @@ dist-shar: distdir
 	@echo WARNING: "Support for shar distribution archives is" \
 	               "deprecated." >&2
 	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
-	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
 	$(am__post_remove_distdir)
 
 dist-zip: distdir
@@ -822,7 +819,7 @@ dist dist-all:
 distcheck: dist
 	case '$(DIST_ARCHIVES)' in \
 	*.tar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
 	*.tar.bz2*) \
 	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
 	*.tar.lz*) \
@@ -832,7 +829,7 @@ distcheck: dist
 	*.tar.Z*) \
 	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
 	*.shar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
 	*.zip*) \
 	  unzip $(distdir).zip ;;\
 	esac
diff --git a/NEWS b/NEWS
index dd960c1..3a4c4fb 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,205 @@
+2.49 (2017-08-15)
+Application:
+- Dependencies: FFTW ≥ 3.1 is now required on all platforms.
+- Translations updated: Czech, French, Russian.
+- Toolbox: Builtin functions such as 3D view can have keyboard shortcuts and
+  a few more can be added as toolbox buttons.
+- Modules: The program warns on startup if a larger number of modules fail to
+  register.
+
+Libraries:
+- libgwyddion: New functions for 1D maximum refinement and histogram calcuation
+  were added.
+- libgwyddion: gwy_isinf() and gwy_isnan() work regardless of GCC's fast math.
+  So Gwyddion can be compiled with -Ofast and removal of invalid values from
+  imported files still works.
+- libgwyprocess: New fitting preset: Boltzmann bent step.
+- libgwyprocess: gwy_fft_simple() is now just a thin FFTW wrapper; all FFT
+  related code was cleaned up and generally uses FFTW directly.
+- libgwyprocess: Functions for caclulation of row-wise ACF, HHCF and PSDF from
+  masked data were added.
+- libgwyprocess: Functions for calculation of distribution of angles and
+  cumulative distribution angles from masked data were added.
+- libgwyprocess: More efficient functions for data field flipping about the
+  diagonal were added.
+- libgwyprocess: gwy_data_line_correct_laplace() bug adding value offsets to
+  interpolated segments was fixed.
+- libgwyprocess: Efficient functions for row-wise and 2D convolution were
+  added, with image exterior control.
+- libgwyprocess: Function for profile extraction with masking was added.
+- libgwyprocess: Function area scale graph was added.
+- libgwyprocess: Function for preparation of data field affine transform given
+  base vectors was added.
+- libgwyprocess: Functions for copying units to another data object of the same
+  type were added.
+- libgwyprocess: Function for location of local maximum within an elliptic area
+  with subpixel refinement was added.
+- libgwyprocess: Functions for automated estimation and/or refinement of
+  periodic lattice parameters from ACF and PSDF were added.
+- libgwydraw: New functions for conversion between GwyRGBA and pixbuf pixels.
+- libgwydgets: Stock icons were revised, replaced and redrawn in SVG, resulting
+  in a cleaner icon set.
+- libgwydgets: New widget GwyAdjustBar, replacing GtkHScale, was added.
+- libgwydgets: Convenience constructors for adjustment bars were added, mostly
+  allowing drop-in replacement of hscales.
+- libgwydgets: The font size of 3D view labels can be set for all labels at
+  once.  The size and vertical alignment of false colour scale are adjustable.
+- libgwydgets: Table hscale SQRT style works with negative values.
+- libgwydgets: Gwy3DView responds to mouse scroll events by zooming or scaling
+  the value (when Shift is pressed).
+- libgwyapp: Empty borders in 3D view export can be automatically removed.
+- libgwyapp: Cancellation of progress dialogues can be explicitly queried.
+- libgwyapp: Data processing menu items have icons (if enabled in GTK+).
+
+Modules:
+- Graph statistics (new): Calculates simple statistics for graph curves.
+- Volume operations (new): Simple volume data operations, currently extraction
+  of the preview to an image.
+- Volume swap axes (new): Reorganises data to change X, Y, Z axis roles.
+- Fibre synthesis (new): Generates images from randomly placed fibres.
+- Mask noisify (new): Adds salt and/or pepper noise to the mask.
+- Statistical functions tool: Masked one-dimensional ACF, HHCF, PSDF, DA and
+  CDA are available now.  Area scale graph was added.
+- JPK: Crash when QI/force map loading was cancelled during ‘Scanning files’
+  was fixed.
+- Dimensions and Units: A rarely occuring freeze was fixed.
+- Mask editor tool: A CRITICAL error when attemping to use bucket-erase on
+  data with no mask was fixed.
+- PSF estimate, fit: PSF normalisation was corrected to represent sampling
+  of the continous PSF, with image formed by usual continuous convolution.
+- Outliers: Undo works properly also when it just removes an existing mask.
+- Mark disconnected: Settings are remembered also upon cancellation.
+- Mark scars: The mask can be combined with mask already present on the image
+  using union or intersection.
+- Igor file: Export was implemented.
+- Roughness tool: Displays the cut-off wavelength in real-space units.
+- Sphere revolution: True 2D sphere revolution was finally implemented.
+- NanoScan: Import of unfinished images was implemented.  Invalid values (NaN)
+  in the files are handled correctly.
+- Align graph: Random behaviour (and usually no alignment at all) for curves
+  with moderate number of points was fixed.
+- Wave synthesis: Decay parameter was added.  It has a progress bar and is
+  cancellable now.
+- Curvature: Reported position of centre correctly includes origin offset now.
+- Profile tool: Profile directions can be automatically improved to be
+  orthogonal to features.
+- OPD: ASC files in both wavelength and real units are imported correctly.
+- K-means, K-medians: Create curves with normalised abscissa order now.
+- Measure lattice, Affine correction: Horizontal ACF can be replaced with
+  interpolation if individual scan lines contain too much noise.
+- Affine correction: The correction can be applied to all compatible images
+  in the file.  Automated estimation was added.
+- Volume summarize profiles: Minimum and maximum position were fixed for data
+  with z-calibration and their units corrected.
+
+Other:
+- Compilation: New configure options --enable/disable-module-bundling controls
+  the linking of modules of one type to one shared object for smaller packages
+  and faster startup.  Bundling is enabled by default.
+- Compilation: A summary of missing maintainer mode tools is printed when
+  maintainer mode is enabled.
+- Python: Configure tries harder to find a Python 2 (not 3) interpreter.
+- Python: On Unix, the gwy module is no longer linked with libpython.
+- Resources: Three new false colour gradients were added, Gray-inverted,
+  Viridis and Spectral-white.
+
+
+2.48 (2017-04-29)
+Application:
+- New translation: Brazilian Portugese.
+- Translations updated: Czech, French, Russian.
+- Toolbox: Default width was increased to 5 columns (to work around broken MS
+  Windows 10 window management).
+- Command line: New options --disable-modules prevents loading of specified
+  modules.
+
+Libraries:
+- libgwyddion: K-correlated PSDF fitting function was added.
+- libgwyprocess: Positions of minimum and maximum are now available as data
+  field row/column statistics quantities.
+- libgwyprocess: GwyShapeFitPreset has a quick-fit function for rough fitting
+  with reduced number of data points.
+- libgwyprocess: Function for reduction of the number of points in GwySurface
+  was added.
+- libgwyprocess: Mask thinning function was added.
+- libgwydgets: A large number of new stock icons were added.
+- libgwydgets: gwy_data_view_coords_xy_cut_line() cuts also vertical and
+  horizontal lines to nothing when they do not intersect the area at all.
+- libgwymodule: Specific modules can be prevented from registration by
+  gwy_module_register_modules().
+- libgwyapp: Ascending abscissae point order is enforced in graph curves upon
+  file import, with a warning emitted.
+- libgwyapp: Progress dialogues shown by the wait functions can be disabled.
+- libgwyapp: Misbehaving data window size restoration was corrected.
+- libgwyapp: File name filter in the file chooser is now correctly applied only
+  to the actual file name instead of the whole path.
+- libgwyapp: Helper functions for bad data masking and interpolation now use
+  fast Laplace interpolation instead of simple average.
+- libgwyapp: GwyAppFileChooser avoids attempting full preview of huge files.
+
+Modules:
+- Zeiss LSM (new): Imports Carl Zeiss CLSM data.
+- Dektak VCA (new): Import Dektak OPDx (VCA DATA) files.
+- MFM perpendicular (new): Calculates stray field above sample with
+  perpendicular domains.
+- MFM parallel (new): Calculates stray field above sample with parallell
+  domains.
+- MFM shift (new): Transfers the field from one lift height to another.
+- MFM current (new): Calculate stray field above sample with current line.
+- MFM estimate shift (new): Estimates lift height difference between two MFM
+  images of the same structure.
+- PSF estimate (new): Estimates point spread function based on ideal data and
+  measured data using deconvolution with regularisation.
+- PSF fit (new): Estimates point spread function based on ideal data and
+  measured data by fitting an explicit PSF functional form.
+- Phases synthesis (new): Simple generator of data resembling two-state
+  (two-phase) systems studied for instance in MFM.
+- Stitch (new): Merges multiple images based on origin offsets.
+- Pygwy: Standard output from modules and the console is captured (so in the
+  console print works again as expected).  Python modules have new optional
+  registration variables.  Pygwy console remembers recent scripts.  Several
+  more function were added to the Python API.
+- Renishaw, volume slice: Create graphs with ascending abscissae point order
+  now.
+- MicroProf: Files with comment at the beginning are imported correctly now.
+- Summarize Profiles: Now supports minimum and maximum positions.
+- ISO28600: Import of multichannel files was corrected (field separator is
+  specified as comma).  Irregular (XYZ) data import was implemented.
+- WITec Project: Now supports different x axis units for spectra and spectral
+  images.
+- NanoObserver: Support for v1.33 files was added (including spectroscopy).
+- Spectro tool: CRITICAL error when avaraged curves differed in the number of
+  points was fixed.  Subsequent spectra are interpolated onto the range of the
+  first selected now when averaging.
+- Seiko: At least the first image should be imported from XQ?X files now.
+- JPK: Initial support for volume force data (QI) was added.  Single point
+  spectra import was fixed to ascending abscissae.
+- SPMLab: All image layers are now loaded (not just the first one).
+- Slice volume: Working with Z-axis calibrations was fixed.  Initial choice of
+  possible target graphs was fixed.
+- Profile tool: Averaging of thick profiles was fixed (lines close 45 degrees
+  were mostly affected).
+- AMB: Physical dimmensions and scales of the data should be correct now.
+- Image export: False colour bar ticks were corrected for inverted mappings.
+  Rendering of rulers for images with offsets was fixed.
+- Nanoscope: Electrochemistry files are recognised.
+- Distance tool: The exported table is tab-separated now.
+- Mask editor tool: Spurious extra pixels in occurring free-hand drawing were
+  corrected.
+- OPD: Import of ASC files written as XYZ was implemented (assuming regular
+  grid).  Workaround for import error with ‘ImageModificat~0’ was added.
+- Graph function fit, FD curve fit and Shape fit: Fit results can be copied
+  to the cliboard.
+
+Other:
+- OSX/BSD pygwy build: Build failure due to pygwy-fix-defs.sed containing
+  non-standard regexps was fixed (by replacing it with a Python script).
+  Several other problems related to compiler and linker flags and library
+  naming were corrected.
+- Development snapshots: Now display a prominent label ‘Development snapshot’
+  in the splash screen so you know you are running a snapshot.
+
+
 2.47 (2016-11-18)
 Application:
 - Translations updated: Czech, French, Russian.
@@ -43,6 +245,7 @@ Modules:
 - Nano Measuring Machine: Can handle data larger than 4 GB points total on
   64bit systems (but not more than 2 GB per channel).
 
+
 2.46 (2016-10-14)
 Application:
 - Translations updated: Czech, French, Italian, Russian.
@@ -945,7 +1148,7 @@ Modules:
 - Scale: Rouding of scaling ratio to some odd values was fixed.
 - Pixmap export: Bad row padding for some BMP image widths was fixed.
 - RHK SM4: PRM are imported to metadata.
-- IGOR file: Infinities and NaNs in the data are filled with a neutral value
+- Igor file: Infinities and NaNs in the data are filled with a neutral value
   and masked upon import.
 - NanoScan: Files with http://www.nanoscan.ch/SPM namespace are recognised.
 - Merge: Bug causing occassional use of data outside of the operand images was
@@ -1027,7 +1230,7 @@ Modules:
   the image and tip radius for each estimated.
 - Pixmap: Loading of TIFFs on 64bit MS Windows was disabled because the
   system library crashes.
-- IGOR file: Units are correctly derived from channels starting with ‘DAC’.
+- Igor file: Units are correctly derived from channels starting with ‘DAC’.
 - GWYXYZF: Compilation on big endian architectures was fixed.
 - Arithmetic: Aspect ratio setting of result is taken from the first channel
   used in the expresssion.
@@ -1207,7 +1410,7 @@ Modules:
 - APE file: Channel labelling for various modes was corrected.
 - Createc: Dimensions and values of imported data was corrected, all channels
   are imported now.
-- IGOR file: Crash on files that contain no channel titles was fixed.
+- Igor file: Crash on files that contain no channel titles was fixed.
 - Selection manager tool: Chosen selection is shown in the data window.
 - Remove Grain by Threshold: Can also remove grains touching image borders.
 - Grain Statistics: Select Inscribed Discs and Select Excscribed Circles
@@ -1596,7 +1799,7 @@ Modules:
 - Threshold (new): Limit data to specified range by cutting values outside it.
 - Graph DOS spectrum (new): Calculates DOS spectrum from I-V tunneling
   spectroscopy.
-- IGOR: Support for non-Asylum-Research files was improved.
+- Igor: Support for non-Asylum-Research files was improved.
 - Pixmap export: The horizontal ruler always displays units now, even if the
   x-range does not include zero.
 - Mask editor tool: New operation Fill Voids fills holes in masked areas.
@@ -1662,7 +1865,7 @@ Modules:
 - Nanoeducator: I-Z spectra written by newer software are supported.
 - BCR: Files with long header and header size specified within are supported.
 - MI file: Wrong scaling of 32bit files was corrected.
-- IGOR: Support for Asylum Research files was improved.
+- Igor: Support for Asylum Research files was improved.
 - Profile: Wrong application of thickness in profiles different from
   horizontal or vertical direction corrected.
 
@@ -1691,7 +1894,7 @@ Modules:
 - NanoScan (new): Imports NanoScan XML files.
 - PLT (new): Imports Nanosurf PLT files.
 - Raw XYZ (new): Imports XYZ data and regularizes them to a grid.
-- IGOR: Support for Asylum Research files was substantialy improved.
+- Igor: Support for Asylum Research files was substantialy improved.
 - NT-MDT: MDA frame support was improved.
 - NetCDF: Can read GXSM files with data in "FloatField" instead of "H".
 - Statistical quantities: The masked area can also be excluded.
@@ -1732,7 +1935,7 @@ Libraries:
 Modules:
 - Curvature (new): Calculates global curvature of second-order surfaces.
 - RHK-SM4 (new): Imports RHK Technology SM4 files.
-- IGOR (new): Imports IGOR Pro binary waves (highly experimental).
+- Igor (new): Imports Igor Pro binary waves (highly experimental).
 - Nanonics (new): Imports Nanonics NAN files (highly experimental).
 - FFT synthesis (new): Generates random surfaces by spectral synthesis.
 - Object synthesis (new): Generates random surfaces by object placement.
@@ -3040,7 +3243,7 @@ Libraries:
 - libgwyprocess: FFT backend argument was removed from FFT functions.
 - libgwydraw: GwyGradient is based on GwyResource, API reworked.  Gradients
   were un-hardcoded and are distributed as standalone text files now.
-- libgwydraw, libwydgets: GwyGLMaterial was moved from libwydgets to
+- libgwydraw, libgwydgets: GwyGLMaterial was moved from libgwydgets to
   libgwydraw, based on GwyResource, and more or less reimplemented.
   GL materials were unhardcoded.  Material pixbuf samples are nicer.
 - libgwydraw, libgwydgets: Experimental adaptive color mapping mode was added.
diff --git a/README b/README
index dc446d8..cc43721 100644
--- a/README
+++ b/README
@@ -14,7 +14,6 @@ Mailing lists:    gwyddion-users at lists.sourceforge.net
 
 See also:
 User-visible changes between versions: NEWS
-Gwyddion installation instructions:    INSTALL.gwyddion
 Generic GNU installation instructions: INSTALL
 License (GNU General Public License):  COPYING
 More info about developers:            AUTHORS
diff --git a/TODO b/TODO
index 8d5e122..cb14e95 100644
--- a/TODO
+++ b/TODO
@@ -43,3 +43,4 @@ Release checklist:
   info)
 - send e-mail to the mailing lists
 - update the list of supported file formats in the user guide
+- update contributors page using ./utils/gen-authors.py web
diff --git a/app/Makefile.am b/app/Makefile.am
index eea321b..da31c57 100644
--- a/app/Makefile.am
+++ b/app/Makefile.am
@@ -1,4 +1,4 @@
-# @(#) $Id: Makefile.am 19258 2016-11-15 08:25:23Z yeti-dn $
+# @(#) $Id: Makefile.am 20269 2017-08-14 11:21:07Z yeti-dn $
 
 libgwyddion = $(top_builddir)/libgwyddion/libgwyddion2.la
 libgwymodule = $(top_builddir)/libgwymodule/libgwymodule2.la
@@ -51,6 +51,7 @@ noinst_HEADERS = \
 	gwyappfilechooser.h \
 	gwyappinternal.h \
 	gwyddion.h \
+	release.h \
 	toolbox.h
 
 uidata_DATA = toolbox.xml
@@ -59,7 +60,8 @@ bin_PROGRAMS = gwyddion
 lib_LTLIBRARIES = libgwyapp2.la
 
 BUILT_SOURCES = \
-	authors.h
+	authors.h \
+	release.h
 
 if OS_MSWIN
 no_undefined = -no-undefined
@@ -73,7 +75,7 @@ EXTRA_DIST = \
 	README.objdata \
 	toolbox.xml
 CLEANFILES = libgwyapp2.def
-MAINTAINERCLEANFILES = authors.h
+MAINTAINERCLEANFILES =
 
 MKENUM_NAME = gwyapptypes
 MKENUM_ID = GWY_APP_TYPES
@@ -112,7 +114,7 @@ AM_LDFLAGS = $(darwin_ldflags)
 # Any iface change    C++: 0:   A
 # Adding ifaces       C:   R:   A++
 # Changing ifaces     C:   R:   0
-libversion = -version-info 17:0:17
+libversion = -version-info 19:0:19
 #libversion = -release @LIBRARY_RELEASE@
 libgwyapp2_la_LDFLAGS = @GTKGLEXT_LIBS@ @GIO_LIBS@ @BASIC_LIBS@ $(win32_libs) -export-dynamic $(no_undefined) $(export_symbols) $(libversion)
 libgwyapp2_la_CPPFLAGS = -DG_LOG_DOMAIN=\"GwyApp\" $(AM_CPPFLAGS)
@@ -159,7 +161,6 @@ gwyddion_SOURCES = \
 	toolbox-editor.c \
 	toolbox-spec.c
 
-
 gwyddion_LDADD = @COMMON_LDFLAGS@ @GTK_MAC_LIBS@ @GTKGLEXT_LIBS@ @FFTW3_LIBS@ @UNIQUE_LIBS@ @GIO_LIBS@ @BASIC_LIBS@ $(LIBXMU) \
 	libgwyapp2.la \
 	$(libgwymodule) \
@@ -168,28 +169,15 @@ gwyddion_LDADD = @COMMON_LDFLAGS@ @GTK_MAC_LIBS@ @GTKGLEXT_LIBS@ @FFTW3_LIBS@ @U
 	$(libgwyprocess) \
 	$(libgwyddion)
 
-# This is ugly a bit, but uses only very basic sed constructs
-authors.h: ${top_srcdir}/AUTHORS ${top_srcdir}/NEWS
-	$(AM_V_GEN){ \
-		echo '/* This is a GENERATED file */'; \
-		echo '/*< private_header >*/'; \
-		echo 'static const gchar developers[] ='; \
-		sed -n -e '/=== Developers ===/,/^$$/{' \
-			-e 's/^[ =].*//' -e t -e 's/^$$//' -e t \
-			-e 's/ *<.*//' -e 's/.*/    "&\\n"/' -e p -e '}' \
-			${top_srcdir}/AUTHORS; \
-		echo ';'; \
-		echo 'static const gchar translators[] ='; \
-		sed -n -e '/=== Translators ===/,/^$$/{' \
-			-e 's/^[ =].*//' -e t -e 's/^$$//' -e t \
-			-e 's/ *<.*//' -e 's/.*/    "&\\n"/' -e p -e '}' \
-			${top_srcdir}/AUTHORS; \
-		echo ';'; \
-		echo 'static const gchar releasedate[] ='; \
-		sed -n -e '1s/^.*(/    "/' -e '1s/)/"/' -e '1p' -e '1q' \
-			${top_srcdir}/NEWS; \
-		echo ';'; \
-	} >authors.h
+if MAINTAINER_MODE
+authors.h: ${top_srcdir}/AUTHORS $(top_srcdir)/utils/gen-authors.py
+	$(AM_V_GEN)$(PYTHON) $(top_srcdir)/utils/gen-authors.py $(top_srcdir)/AUTHORS header >authors.h
+
+release.h: ${top_srcdir}/NEWS Makefile $(top_builddir)/config.h
+	$(AM_V_GEN)echo '/* This is a 'GENERATED' file. */' >release.h
+	$(AM_V_at)echo '/*< private_header >*/' >>release.h
+	$(AM_V_at)sed -n 1p ${top_srcdir}/NEWS | sed -e 's/^.*(/#define RELEASEDATE 0x/' -e 's/)/u/' -e 's/-//g' >>release.h
+endif
 
 clean-local:
 	rm -f core.* *~
diff --git a/app/Makefile.in b/app/Makefile.in
index 6b79def..5ec4e01 100644
--- a/app/Makefile.in
+++ b/app/Makefile.in
@@ -14,10 +14,10 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 19258 2016-11-15 08:25:23Z yeti-dn $
+# @(#) $Id: Makefile.am 20269 2017-08-14 11:21:07Z yeti-dn $
 
 # Generic glib-mkenum rules.
-# @(#) $Id: mkenum.mk 11705 2011-01-03 08:32:55Z yeti-dn $
+# @(#) $Id: mkenum.mk 20080 2017-07-24 16:05:52Z yeti-dn $
 #
 # Parameters:
 # MKENUM_NAME -- output base name
@@ -300,10 +300,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -313,6 +310,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -337,7 +336,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -395,6 +396,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -403,17 +405,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -544,11 +542,12 @@ noinst_HEADERS = \
 	gwyappfilechooser.h \
 	gwyappinternal.h \
 	gwyddion.h \
+	release.h \
 	toolbox.h
 
 uidata_DATA = toolbox.xml
 lib_LTLIBRARIES = libgwyapp2.la
-BUILT_SOURCES = authors.h $(am__append_2)
+BUILT_SOURCES = authors.h release.h $(am__append_2)
 @OS_MSWIN_TRUE at no_undefined = -no-undefined
 @OS_MSWIN_TRUE at export_symbols = -export-symbols libgwyapp2.def
 @OS_MSWIN_TRUE at win32_libs = -lole32
@@ -558,7 +557,7 @@ BUILT_SOURCES = authors.h $(am__append_2)
 EXTRA_DIST = README.objdata toolbox.xml $(mkenum_built_sources)
 CLEANFILES = libgwyapp2.def $(MKENUM_NAME).c.xgen \
 	$(MKENUM_NAME).h.xgen
-MAINTAINERCLEANFILES = authors.h $(am__append_1)
+MAINTAINERCLEANFILES = $(am__append_1)
 MKENUM_NAME = gwyapptypes
 MKENUM_ID = GWY_APP_TYPES
 MKENUM_HFILES = \
@@ -573,9 +572,6 @@ MKENUM_HFILES = \
 	$(srcdir)/settings.h \
 	$(srcdir)/validate.h
 
-
-# TODO: Detect
-GLIB_MKENUMS = glib-mkenums
 mkenum_built_sources = $(MKENUM_NAME).h $(MKENUM_NAME).c
 @MAINTAINER_MODE_TRUE at mkenum_stamp_files = $(MKENUM_NAME).h.stamp
 @MAINTAINER_MODE_TRUE at mkenum_self = $(top_srcdir)/utils/mkenum.mk
@@ -599,7 +595,7 @@ AM_LDFLAGS = $(darwin_ldflags)
 # Any iface change    C++: 0:   A
 # Adding ifaces       C:   R:   A++
 # Changing ifaces     C:   R:   0
-libversion = -version-info 17:0:17
+libversion = -version-info 19:0:19
 #libversion = -release @LIBRARY_RELEASE@
 libgwyapp2_la_LDFLAGS = @GTKGLEXT_LIBS@ @GIO_LIBS@ @BASIC_LIBS@ $(win32_libs) -export-dynamic $(no_undefined) $(export_symbols) $(libversion)
 libgwyapp2_la_CPPFLAGS = -DG_LOG_DOMAIN=\"GwyApp\" $(AM_CPPFLAGS)
@@ -1316,28 +1312,13 @@ libgwyapp2.def: $(libgwyapp2_la_OBJECTS)
 		| awk -F' ' '($$2=="T" && $$3 ~ /^gwy_/){print "     ",$$3}'; \
 	done | sort >>libgwyapp2.def
 
-# This is ugly a bit, but uses only very basic sed constructs
-authors.h: ${top_srcdir}/AUTHORS ${top_srcdir}/NEWS
-	$(AM_V_GEN){ \
-		echo '/* This is a GENERATED file */'; \
-		echo '/*< private_header >*/'; \
-		echo 'static const gchar developers[] ='; \
-		sed -n -e '/=== Developers ===/,/^$$/{' \
-			-e 's/^[ =].*//' -e t -e 's/^$$//' -e t \
-			-e 's/ *<.*//' -e 's/.*/    "&\\n"/' -e p -e '}' \
-			${top_srcdir}/AUTHORS; \
-		echo ';'; \
-		echo 'static const gchar translators[] ='; \
-		sed -n -e '/=== Translators ===/,/^$$/{' \
-			-e 's/^[ =].*//' -e t -e 's/^$$//' -e t \
-			-e 's/ *<.*//' -e 's/.*/    "&\\n"/' -e p -e '}' \
-			${top_srcdir}/AUTHORS; \
-		echo ';'; \
-		echo 'static const gchar releasedate[] ='; \
-		sed -n -e '1s/^.*(/    "/' -e '1s/)/"/' -e '1p' -e '1q' \
-			${top_srcdir}/NEWS; \
-		echo ';'; \
-	} >authors.h
+ at MAINTAINER_MODE_TRUE@authors.h: ${top_srcdir}/AUTHORS $(top_srcdir)/utils/gen-authors.py
+ at MAINTAINER_MODE_TRUE@	$(AM_V_GEN)$(PYTHON) $(top_srcdir)/utils/gen-authors.py $(top_srcdir)/AUTHORS header >authors.h
+
+ at MAINTAINER_MODE_TRUE@release.h: ${top_srcdir}/NEWS Makefile $(top_builddir)/config.h
+ at MAINTAINER_MODE_TRUE@	$(AM_V_GEN)echo '/* This is a 'GENERATED' file. */' >release.h
+ at MAINTAINER_MODE_TRUE@	$(AM_V_at)echo '/*< private_header >*/' >>release.h
+ at MAINTAINER_MODE_TRUE@	$(AM_V_at)sed -n 1p ${top_srcdir}/NEWS | sed -e 's/^.*(/#define RELEASEDATE 0x/' -e 's/)/u/' -e 's/-//g' >>release.h
 
 clean-local:
 	rm -f core.* *~
diff --git a/app/about.c b/app/about.c
index 227ee1a..23ee7df 100644
--- a/app/about.c
+++ b/app/about.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: about.c 15598 2013-11-11 12:33:32Z yeti-dn $
+ *  @(#) $Id: about.c 20090 2017-07-26 09:11:23Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -20,24 +20,24 @@
  */
 
 #include "config.h"
+#include <string.h>
 #include <gtk/gtk.h>
 #ifdef HAVE_GTKGLEXT
 #include <gtk/gtkgl.h>
 #endif
-#ifdef HAVE_FFTW3
-#include <fftw3.h>
-#endif
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwyversion.h>
 #include <libgwydgets/gwystock.h>
 #include <libgwymodule/gwymoduleloader.h>
 #include "app.h"
-#include "authors.h"
 #include "gwyddion.h"
+#include "authors.h"
+#include "release.h"
 
 static void about_close  (void);
 static void fill_credits (GtkTextBuffer *buffer);
 static void fill_features(GtkTextBuffer *buffer);
+static void construct_datetime_info(GString *str);
 
 static GtkWidget *about = NULL;
 
@@ -48,6 +48,7 @@ gwy_app_about(void)
     GtkTextBuffer *buff;
     GtkTextIter iter;
     GString *str = g_string_new(NULL);
+    const gchar *verextra = "";
     gint size;
 
     if (about) {
@@ -86,10 +87,13 @@ gwy_app_about(void)
     widget = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5);
     gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0);
-    g_string_printf(str, "<big><b>%s %s</b></big>\n",
-                    g_get_application_name(), GWY_VERSION_STRING);
-    /* TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD. */
-    g_string_append_printf(str, _("Released %s\n"), releasedate);
+    /* If we have unset release date but simple (non-date-extended) version
+     * string then we are not compiling from a public tarball. */
+    if (RELEASEDATE == 0 && strlen(GWY_VERSION_STRING) < 9)
+        verextra = "+SVN";
+    g_string_printf(str, "<span size='x-large' weight='bold'>%s %s%s</span>\n",
+                    g_get_application_name(), GWY_VERSION_STRING, verextra);
+    construct_datetime_info(str);
     g_string_append(str, _("An SPM data visualization and analysis tool."));
     gtk_label_set_markup(GTK_LABEL(widget), str->str);
 
@@ -257,15 +261,6 @@ fill_features(GtkTextBuffer *buffer)
                       _("not available\n"), TRUE);
 #endif
 
-#ifdef HAVE_FFTW3
-    s = g_strdup_printf("FFTW %s\n", fftw_version);
-    add_credits_block(buffer, _("Fast Fourier Transform"), s, FALSE);
-    g_free(s);
-#else
-    add_credits_block(buffer, _("Fast Fourier Transform"),
-                      _("built-in SimpleFFT\n"), TRUE);
-#endif
-
     b = FALSE;
 #if (REMOTE_BACKEND == REMOTE_NONE)
     cs = _("not available\n");
@@ -291,4 +286,48 @@ fill_features(GtkTextBuffer *buffer)
                           _("not available\n"), TRUE);
 }
 
+#if (RELEASEDATE == 0)
+static void
+construct_datetime_info(GString *str)
+{
+    GDate *gdate = g_date_new();
+    gchar buf[12];
+
+    g_date_set_parse(gdate, __DATE__);
+    if (!g_date_valid(gdate)) {
+        g_warning("Build date is invalid.");
+        /* Avoid trigraphs. */
+        g_snprintf(buf, sizeof(buf), "%.10s", "????" "-" "??" "-" "??");
+    }
+    else {
+        g_snprintf(buf, sizeof(buf), "%04u-%02u-%02u",
+                   (guint)g_date_get_year(gdate),
+                   (guint)g_date_get_month(gdate),
+                   (guint)g_date_get_day(gdate));
+    }
+
+    g_string_append(str, "<b>");
+    /* TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD. */
+    g_string_append_printf(str, _("Development version, built %s"), buf);
+    g_string_append(str, "</b>\n");
+    g_date_free(gdate);
+}
+#else
+static void
+construct_datetime_info(GString *str)
+{
+    guint year = RELEASEDATE/0x10000u;
+    guint month = (RELEASEDATE/0x100u % 0x100);
+    guint day = RELEASEDATE % 0x100;
+    gchar buf[12];
+
+    g_snprintf(buf, sizeof(buf), "%04x-%02x-%02x", year, month, day);
+
+    g_string_append(str, "<b>");
+    /* TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD. */
+    g_string_append_printf(str, _("Released %s"), buf);
+    g_string_append(str, "</b>\n");
+}
+#endif
+
 /* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/app/app.c b/app/app.c
index f8da9d8..92ef537 100644
--- a/app/app.c
+++ b/app/app.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: app.c 19043 2016-10-08 18:58:43Z yeti-dn $
- *  Copyright (C) 2003-2006,2013-2016 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: app.c 20119 2017-07-31 10:36:59Z yeti-dn $
+ *  Copyright (C) 2003-2006,2013-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -388,6 +388,8 @@ _gwy_app_data_window_setup(GwyDataWindow *data_window)
                              corner_menu);
     g_signal_connect(data_window, "configure-event",
                      G_CALLBACK(gwy_app_data_window_configured), NULL);
+    g_signal_connect(data_window, "size-allocate",
+                     G_CALLBACK(gwy_app_data_window_configured), NULL);
 
     settings = gwy_app_settings_get();
     if (gwy_container_gis_enum_by_name(settings, "/app/default-range-type",
@@ -754,6 +756,8 @@ _gwy_app_graph_window_setup(GwyGraphWindow *graph_window,
                       GUINT_TO_POINTER(prefix));
     g_signal_connect(graph_window, "configure-event",
                      G_CALLBACK(gwy_app_graph_window_configured), NULL);
+    g_signal_connect(graph_window, "size-allocate",
+                     G_CALLBACK(gwy_app_graph_window_configured), NULL);
 }
 
 static gboolean
@@ -828,11 +832,25 @@ _gwy_app_3d_window_setup(Gwy3DWindow *window3d)
 {
     GtkTooltips *tooltips;
     Gwy3DView *view3d;
-    GtkWidget *button;
+    GwyContainer *settings;
+    gboolean autocrop = FALSE;
+    GtkWidget *button, *check, *label;
 
     gwy_app_add_main_accel_group(GTK_WINDOW(window3d));
     tooltips = gwy_3d_window_class_get_tooltips();
 
+    button = gtk_button_new_with_mnemonic(_("Set as Default"));
+    gtk_tooltips_set_tip(tooltips, button,
+                         _("Set the current view setup as the default"), NULL);
+    gwy_3d_window_add_action_widget(window3d, button);
+    g_signal_connect_swapped(button, "clicked",
+                             G_CALLBACK(gwy_app_3d_window_set_defaults),
+                             window3d);
+
+    label = gtk_label_new(NULL);
+    gtk_widget_set_size_request(label, 12, 0);
+    gwy_3d_window_add_action_widget(window3d, label);
+
     button = gwy_stock_like_button_new(gwy_sgettext("verb|Save"),
                                        GTK_STOCK_SAVE);
     gtk_tooltips_set_tip(tooltips, button,
@@ -846,13 +864,14 @@ _gwy_app_3d_window_setup(Gwy3DWindow *window3d)
     g_signal_connect_swapped(button, "clicked",
                              G_CALLBACK(gwy_app_3d_window_export), window3d);
 
-    button = gtk_button_new_with_mnemonic(_("Set as Default"));
-    gtk_tooltips_set_tip(tooltips, button,
-                         _("Set the current view setup as the default"), NULL);
-    gwy_3d_window_add_action_widget(window3d, button);
-    g_signal_connect_swapped(button, "clicked",
-                             G_CALLBACK(gwy_app_3d_window_set_defaults),
-                             window3d);
+    settings = gwy_app_settings_get();
+    gwy_container_gis_boolean_by_name(settings, "/app/3d/autocrop", &autocrop);
+    check = gtk_check_button_new_with_mnemonic(_("_Autocrop"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), autocrop);
+    gwy_3d_window_add_action_widget(window3d, check);
+    gtk_tooltips_set_tip(tooltips, check,
+                         _("Remove white borders from exported image"), NULL);
+    g_object_set_data(G_OBJECT(window3d), "gwy-app-autocrop-check", check);
 
     gwy_app_3d_window_add_overlay_menu(window3d);
     gwy_help_add_to_window(GTK_WINDOW(window3d), "opengl-3d-view", NULL,
@@ -865,6 +884,8 @@ _gwy_app_3d_window_setup(Gwy3DWindow *window3d)
 
     g_signal_connect(window3d, "configure-event",
                      G_CALLBACK(gwy_app_3d_window_configured), NULL);
+    g_signal_connect(window3d, "size-allocate",
+                     G_CALLBACK(gwy_app_3d_window_configured), NULL);
 }
 
 static gboolean
@@ -911,20 +932,19 @@ gwy_app_3d_window_add_overlay_menu(Gwy3DWindow *gwy3dwindow)
               g_quark_to_string(view->data_key),
               4);
     g_strlcat(refkey, "3d/data2ref", sizeof(refkey));
-    if (gwy_container_gis_string_by_name(view->data, refkey, &key)) {
+    if (gwy_container_gis_string_by_name(view->data, refkey, &key))
         data2_ref = g_quark_from_string(key);
-    };
 
     for (nids = ids; *nids != -1; nids++) {
         if (gwy_app_get_data_key_for_id(*nids) == data2_ref) {
             activeid = *nids;
             break;
-        };
+        }
         if (gwy_app_get_data_key_for_id(*nids) == view->data_key
             && activeid == -1) {
             activeid = *nids;
-        };
-    };
+        }
+    }
     g_free(ids);
 
     gwy_data_chooser_set_active(GWY_DATA_CHOOSER(menu), view->data, activeid);
@@ -1003,8 +1023,8 @@ gwy_app_3d_window_set_data2(Gwy3DWindow *gwy3dwindow,
     }
     else {
         gwy_3d_view_set_ovlay(view, ovplay, 1);
-    };
-};
+    }
+}
 
 /* callback for the chooser created by gwy_app_3d_window_add_overlay_menu */
 static void
@@ -1063,7 +1083,43 @@ gwy_app_3d_window_data2_filter(GwyContainer *data2,
 
     return !gwy_data_field_check_compatibility(data_field2, data_field1,
                                                GWY_DATA_COMPATIBILITY_RES);
-};
+}
+
+static GdkPixbuf*
+autocrop_3d_export_pixbuf(GdkPixbuf *pixbuf)
+{
+    gint width, height, stride, bpp, i, j, top, left, right, bot;
+    guchar *data, *row;
+
+    width = gdk_pixbuf_get_width(pixbuf);
+    height = gdk_pixbuf_get_height(pixbuf);
+    stride = gdk_pixbuf_get_rowstride(pixbuf);
+    bpp = gdk_pixbuf_get_n_channels(pixbuf);
+    data = gdk_pixbuf_get_pixels(pixbuf);
+
+    top = height-1;
+    bot = 0;
+    left = width-1;
+    right = 0;
+
+    for (i = 0; i < height; i++) {
+        row = data + i*stride;
+        for (j = 0; j < bpp*width; j++) {
+            if (row[j] != 0xff) {
+                top = MIN(top, i);
+                bot = MAX(bot, i);
+                left = MIN(left, j/bpp);
+                right = MAX(right, j/bpp);
+            }
+        }
+    }
+
+    if (top > bot || left > right)
+        top = bot = left = right = 0;
+
+    return gdk_pixbuf_new_subpixbuf(pixbuf,
+                                    left, top, right+1 - left, bot+1 - top);
+}
 
 static void
 gwy_app_save_3d_export(GtkWidget *dialog,
@@ -1071,9 +1127,11 @@ gwy_app_save_3d_export(GtkWidget *dialog,
                        Gwy3DWindow *gwy3dwindow)
 {
     gchar *filename_sys, *filename_utf8, *s, *filetype = NULL;
-    GdkPixbuf *pixbuf;
+    GdkPixbuf *pixbuf, *cropped_pixbuf;
     GtkWidget *gwy3dview;
     GError *err = NULL;
+    GwyContainer *settings;
+    gboolean autocrop = FALSE;
 
     if (response != GTK_RESPONSE_OK) {
         gtk_widget_destroy(dialog);
@@ -1084,21 +1142,29 @@ gwy_app_save_3d_export(GtkWidget *dialog,
     filename_sys = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
     gtk_widget_destroy(dialog);
 
+    settings = gwy_app_settings_get();
+    gwy_container_gis_boolean_by_name(settings, "/app/3d/autocrop", &autocrop);
+
     pixbuf = gwy_3d_view_get_pixbuf(GWY_3D_VIEW(gwy3dview));
+    if (autocrop)
+        cropped_pixbuf = autocrop_3d_export_pixbuf(pixbuf);
+    else
+        cropped_pixbuf = g_object_ref(pixbuf);
+
     filename_utf8 = g_filename_to_utf8(filename_sys, -1, NULL, NULL, NULL);
     if ((s = strrchr(filename_utf8, '.'))) {
         filetype = g_ascii_strdown(s+1, -1);
-        if (gwy_strequal(filetype, "jpg")) {
+        if (gwy_stramong(filetype, "jpg", "jpeg", NULL)) {
             g_free(filetype);
             filetype = g_strdup("jpeg");
         }
-        else if (gwy_strequal(filetype, "tif")) {
+        else if (gwy_stramong(filetype, "tif", "tiff", NULL)) {
             g_free(filetype);
             filetype = g_strdup("tiff");
         }
     }
-    if (!gdk_pixbuf_save(pixbuf, filename_sys, filetype ? filetype : "png",
-                         &err, NULL)) {
+    if (!gdk_pixbuf_save(cropped_pixbuf, filename_sys,
+                         filetype ? filetype : "png", &err, NULL)) {
         dialog = gtk_message_dialog_new(NULL,
                                         GTK_DIALOG_DESTROY_WITH_PARENT,
                                         GTK_MESSAGE_ERROR,
@@ -1113,6 +1179,7 @@ gwy_app_save_3d_export(GtkWidget *dialog,
     }
     g_free(filetype);
     g_free(filename_sys);
+    g_object_unref(cropped_pixbuf);
     g_object_unref(pixbuf);
     g_free(g_object_get_data(G_OBJECT(gwy3dwindow), "gwy-app-export-filename"));
     g_object_set_data(G_OBJECT(gwy3dwindow), "gwy-app-export-filename",
@@ -1122,15 +1189,20 @@ gwy_app_save_3d_export(GtkWidget *dialog,
 static void
 gwy_app_3d_window_export(Gwy3DWindow *gwy3dwindow)
 {
-    GwyContainer *data;
-    GtkWidget *dialog, *gwy3dview;
+    GwyContainer *data, *settings;
+    GtkWidget *dialog, *gwy3dview, *check;
     const guchar *filename_utf8;
     gchar *filename_sys;
-    gboolean need_free_utf = FALSE;
+    gboolean need_free_utf = FALSE, autocrop;
 
     gwy3dview = gwy_3d_window_get_3d_view(gwy3dwindow);
     data = gwy_3d_view_get_data(GWY_3D_VIEW(gwy3dview));
 
+    check = g_object_get_data(G_OBJECT(gwy3dwindow), "gwy-app-autocrop-check");
+    autocrop = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check));
+    settings = gwy_app_settings_get();
+    gwy_container_set_boolean_by_name(settings, "/app/3d/autocrop", autocrop);
+
     filename_utf8 = g_object_get_data(G_OBJECT(gwy3dwindow),
                                       "gwy-app-export-filename");
     if (!filename_utf8) {
@@ -1168,6 +1240,89 @@ gwy_app_3d_window_export(Gwy3DWindow *gwy3dwindow)
 }
 
 static void
+save_or_restore_object_properties(GObject *object,
+                                  GwyContainer *settings,
+                                  gboolean restore, GString *key)
+{
+    GParamSpec **pspecs;
+    gdouble dblvalue;
+    gboolean boolvalue;
+    gint enumvalue;
+    const guchar *strvalue;
+    const gchar *name;
+    guint len, i, nspecs;
+    GType valtype;
+
+    pspecs = g_object_class_list_properties(G_OBJECT_GET_CLASS(object),
+                                            &nspecs);
+    if (!g_str_has_suffix(key->str, "/"))
+        g_string_append_c(key, '/');
+    len = key->len;
+
+    for (i = 0; i < nspecs; i++) {
+        if (!(pspecs[i]->flags & G_PARAM_WRITABLE)
+            || (pspecs[i]->flags & (G_PARAM_CONSTRUCT_ONLY | G_PARAM_PRIVATE)))
+            continue;
+
+        valtype = pspecs[i]->value_type;
+        name = pspecs[i]->name;
+        g_string_truncate(key, len);
+        g_string_append(key, name);
+
+        if (valtype == G_TYPE_BOOLEAN) {
+            if (restore) {
+                if (gwy_container_gis_boolean_by_name(settings, key->str,
+                                                      &boolvalue))
+                    g_object_set(object, name, boolvalue, NULL);
+            }
+            else {
+                g_object_get(object, name, &boolvalue, NULL);
+                gwy_container_set_boolean_by_name(settings, key->str,
+                                                  boolvalue);
+            }
+        }
+        else if (valtype == G_TYPE_DOUBLE) {
+            if (restore) {
+                if (gwy_container_gis_double_by_name(settings, key->str,
+                                                     &dblvalue))
+                    g_object_set(object, name, dblvalue, NULL);
+            }
+            else {
+                g_object_get(object, name, &dblvalue, NULL);
+                gwy_container_set_double_by_name(settings, key->str, dblvalue);
+            }
+        }
+        else if (valtype == G_TYPE_STRING) {
+            if (restore) {
+                if (gwy_container_gis_string_by_name(settings, key->str,
+                                                     &strvalue))
+                    g_object_set(object, name, strvalue, NULL);
+            }
+            else {
+                g_object_get(object, name, &strvalue, NULL);
+                gwy_container_set_string_by_name(settings, key->str, strvalue);
+            }
+        }
+        else if (g_type_is_a(valtype, G_TYPE_ENUM)) {
+            if (restore) {
+                if (gwy_container_gis_enum_by_name(settings, key->str,
+                                                   &enumvalue))
+                    g_object_set(object, name, enumvalue, NULL);
+            }
+            else {
+                g_object_get(object, name, &enumvalue, NULL);
+                gwy_container_set_enum_by_name(settings, key->str, enumvalue);
+            }
+        }
+        else {
+            g_warning("Unhandled property %s", name);
+        }
+    }
+
+    g_free(pspecs);
+}
+
+static void
 gwy_app_3d_window_set_defaults(Gwy3DWindow *window)
 {
     Gwy3DView *view;
@@ -1185,30 +1340,10 @@ gwy_app_3d_window_set_defaults(Gwy3DWindow *window)
     data = gwy_3d_view_get_data(view);
 
     settings = gwy_app_settings_get();
-    gwy_container_set_boolean_by_name(settings, "/app/3d/axes-visible",
-                                      setup->axes_visible);
-    gwy_container_set_boolean_by_name(settings, "/app/3d/labels-visible",
-                                      setup->labels_visible);
-    gwy_container_set_boolean_by_name(settings, "/app/3d/fmscale-visible",
-                                      setup->fmscale_visible);
-    gwy_container_set_double_by_name(settings, "/app/3d/rotation-x",
-                                     setup->rotation_x);
-    gwy_container_set_double_by_name(settings, "/app/3d/rotation-y",
-                                     setup->rotation_y);
-    gwy_container_set_double_by_name(settings, "/app/3d/scale",
-                                     setup->scale);
-    gwy_container_set_double_by_name(settings, "/app/3d/z-scale",
-                                     setup->z_scale);
-    gwy_container_set_double_by_name(settings, "/app/3d/light-phi",
-                                     setup->light_phi);
-    gwy_container_set_double_by_name(settings, "/app/3d/light-theta",
-                                     setup->light_theta);
-    gwy_container_set_double_by_name(settings, "/app/3d/line-width",
-                                     setup->line_width);
-    gwy_container_set_enum_by_name(settings, "/app/3d/visualization",
-                                   setup->visualization);
-    gwy_container_set_enum_by_name(settings, "/app/3d/projection",
-                                   setup->projection);
+    str = g_string_new(NULL);
+
+    g_string_assign(str, "/app/3d/");
+    save_or_restore_object_properties(G_OBJECT(setup), settings, FALSE, str);
 
     lay = G_OBJECT(window->dataov_menu);
     toggle = GTK_TOGGLE_BUTTON(g_object_get_data(lay, "m"));
@@ -1216,55 +1351,16 @@ gwy_app_3d_window_set_defaults(Gwy3DWindow *window)
                                       gtk_toggle_button_get_active(toggle));
 
     prefix = gwy_3d_view_get_setup_prefix(view);
-    str = g_string_new(NULL);
     for (i = 0; i < G_N_ELEMENTS(labels_3d); i++) {
         Gwy3DLabel *label = NULL;
-        gdouble deltax, deltay, rotation, size;
-        gboolean fixed_size;
-        guint len;
-        gchar *text;
 
         g_string_printf(str, "%s/%s", prefix, labels_3d[i].key);
         gwy_container_gis_object_by_name(data, str->str, &label);
         if (!label)
             continue;
 
-        g_object_get(label,
-                     "delta-x", &deltax,
-                     "delta-y", &deltay,
-                     "rotation", &rotation,
-                     "size", &size,
-                     "fixed-size", &fixed_size,
-                     "text", &text,
-                     NULL);
         g_string_printf(str, "/app/3d/labels/%s/", labels_3d[i].key);
-        len = str->len;
-
-        g_string_append(str, "delta-x");
-        gwy_container_set_double_by_name(settings, str->str, deltax);
-        g_string_truncate(str, len);
-
-        g_string_append(str, "delta-y");
-        gwy_container_set_double_by_name(settings, str->str, deltay);
-        g_string_truncate(str, len);
-
-        g_string_append(str, "rotation");
-        gwy_container_set_double_by_name(settings, str->str, rotation);
-        g_string_truncate(str, len);
-
-        g_string_append(str, "size");
-        gwy_container_set_double_by_name(settings, str->str, size);
-        g_string_truncate(str, len);
-
-        g_string_append(str, "fixed-size");
-        gwy_container_set_boolean_by_name(settings, str->str, fixed_size);
-        g_string_truncate(str, len);
-
-        /* g_object_get() allocates it, gwy_container_set_string_by_name()
-         * consumes it. */
-        g_string_append(str, "text");
-        gwy_container_set_string_by_name(settings, str->str, text);
-        g_string_truncate(str, len);
+        save_or_restore_object_properties(G_OBJECT(label), settings, FALSE, str);
     }
 
     g_string_free(str, TRUE);
@@ -1276,75 +1372,30 @@ _gwy_app_3d_view_init_setup(GwyContainer *container,
 {
     GwyContainer *settings;
     Gwy3DSetup *setup;
-    Gwy3DProjection projection;
-    Gwy3DVisualization visualization;
-    gdouble dblvalue;
-    gboolean boolvalue;
     GString *str;
-    gchar *key;
     guint i;
 
     g_return_val_if_fail(GWY_IS_CONTAINER(container), FALSE);
     g_return_val_if_fail(setup_prefix, FALSE);
 
-    key = g_strconcat(setup_prefix, "/setup", NULL);
-    if (gwy_container_gis_object_by_name(container, key, &setup)
+    str = g_string_new(setup_prefix);
+    g_string_append(str, "/setup");
+    if (gwy_container_gis_object_by_name(container, str->str, &setup)
         && GWY_IS_3D_SETUP(setup)) {
-        g_free(key);
+        g_string_free(str, TRUE);
         return FALSE;
     }
 
     setup = gwy_3d_setup_new();
+    gwy_container_set_object_by_name(container, str->str, setup);
+
     settings = gwy_app_settings_get();
-    if (gwy_container_gis_boolean_by_name(settings, "/app/3d/axes-visible",
-                                          &boolvalue))
-        g_object_set(setup, "axes-visible", boolvalue, NULL);
-    if (gwy_container_gis_boolean_by_name(settings, "/app/3d/labels-visible",
-                                          &boolvalue))
-        g_object_set(setup, "labels-visible", boolvalue, NULL);
-    if (gwy_container_gis_boolean_by_name(settings, "/app/3d/fmscale-visible",
-                                          &boolvalue))
-        g_object_set(setup, "fmscale-visible", boolvalue, NULL);
-    if (gwy_container_gis_double_by_name(settings, "/app/3d/rotation-x",
-                                         &dblvalue))
-        g_object_set(setup, "rotation-x", dblvalue, NULL);
-    if (gwy_container_gis_double_by_name(settings, "/app/3d/rotation-y",
-                                         &dblvalue))
-        g_object_set(setup, "rotation-y", dblvalue, NULL);
-    if (gwy_container_gis_double_by_name(settings, "/app/3d/scale",
-                                         &dblvalue))
-        g_object_set(setup, "scale", dblvalue, NULL);
-    if (gwy_container_gis_double_by_name(settings, "/app/3d/z-scale",
-                                         &dblvalue))
-        g_object_set(setup, "z-scale", dblvalue, NULL);
-    if (gwy_container_gis_double_by_name(settings, "/app/3d/light-phi",
-                                         &dblvalue))
-        g_object_set(setup, "light-phi", dblvalue, NULL);
-    if (gwy_container_gis_double_by_name(settings, "/app/3d/light-theta",
-                                         &dblvalue))
-        g_object_set(setup, "light-theta", dblvalue, NULL);
-    if (gwy_container_gis_double_by_name(settings, "/app/3d/line-width",
-                                         &dblvalue))
-        g_object_set(setup, "line-width", dblvalue, NULL);
-    if (gwy_container_gis_enum_by_name(settings, "/app/3d/visualization",
-                                       &visualization))
-        g_object_set(setup, "visualization", visualization, NULL);
-    if (gwy_container_gis_enum_by_name(settings, "/app/3d/projection",
-                                       &projection))
-        g_object_set(setup, "projection", projection, NULL);
-
-    gwy_container_set_object_by_name(container, key, setup);
+    g_string_assign(str, "/app/3d/");
+    save_or_restore_object_properties(G_OBJECT(setup), settings, TRUE, str);
     g_object_unref(setup);
-    g_free(key);
 
-    str = g_string_new(NULL);
     for (i = 0; i < G_N_ELEMENTS(labels_3d); i++) {
         Gwy3DLabel *label = NULL;
-        gdouble dbl;
-        gboolean flag;
-        guint len;
-        const guchar *text;
-
         g_string_printf(str, "%s/%s", setup_prefix, labels_3d[i].key);
         gwy_container_gis_object_by_name(container, str->str, &label);
         if (label)
@@ -1352,40 +1403,10 @@ _gwy_app_3d_view_init_setup(GwyContainer *container,
 
         label = gwy_3d_label_new(labels_3d[i].default_text);
         gwy_container_set_object_by_name(container, str->str, label);
-        g_object_unref(label);
 
         g_string_printf(str, "/app/3d/labels/%s/", labels_3d[i].key);
-        len = str->len;
-
-        g_string_append(str, "delta-x");
-        if (gwy_container_gis_double_by_name(settings, str->str, &dbl))
-            g_object_set(label, "delta-x", dbl, NULL);
-        g_string_truncate(str, len);
-
-        g_string_append(str, "delta-y");
-        if (gwy_container_gis_double_by_name(settings, str->str, &dbl))
-            g_object_set(label, "delta-y", dbl, NULL);
-        g_string_truncate(str, len);
-
-        g_string_append(str, "rotation");
-        if (gwy_container_gis_double_by_name(settings, str->str, &dbl))
-            g_object_set(label, "rotation", dbl, NULL);
-        g_string_truncate(str, len);
-
-        g_string_append(str, "size");
-        if (gwy_container_gis_double_by_name(settings, str->str, &dbl))
-            g_object_set(label, "size", dbl, NULL);
-        g_string_truncate(str, len);
-
-        g_string_append(str, "fixed-size");
-        if (gwy_container_gis_boolean_by_name(settings, str->str, &flag))
-            g_object_set(label, "fixed-size", flag, NULL);
-        g_string_truncate(str, len);
-
-        g_string_append(str, "text");
-        if (gwy_container_gis_string_by_name(settings, str->str, &text))
-            g_object_set(label, "text", text, NULL);
-        g_string_truncate(str, len);
+        save_or_restore_object_properties(G_OBJECT(label), settings, TRUE, str);
+        g_object_unref(label);
     }
 
     g_string_free(str, TRUE);
@@ -1469,6 +1490,8 @@ _gwy_app_brick_window_setup(GwyDataWindow *data_window)
 
     g_signal_connect(data_window, "configure-event",
                      G_CALLBACK(gwy_app_brick_window_configured), NULL);
+    g_signal_connect(data_window, "size-allocate",
+                     G_CALLBACK(gwy_app_brick_window_configured), NULL);
 }
 
 static gboolean
@@ -1659,36 +1682,42 @@ change_brick_preview(GwyDataWindow *data_window)
         return;
     }
 
-    if (type == BRICK_PREVIEW_MEAN)
+    if (type == BRICK_PREVIEW_MEAN) {
         gwy_brick_mean_plane(brick, preview,
                              0, 0, 0,
                              brick->xres, brick->yres, -1,
                              TRUE);
-    else if (type == BRICK_PREVIEW_MINIMUM)
+    }
+    else if (type == BRICK_PREVIEW_MINIMUM) {
         gwy_brick_min_plane(brick, preview,
                             0, 0, 0,
                             brick->xres, brick->yres, -1,
                             TRUE);
-    else if (type == BRICK_PREVIEW_MAXIMUM)
+    }
+    else if (type == BRICK_PREVIEW_MAXIMUM) {
         gwy_brick_max_plane(brick, preview,
                             0, 0, 0,
                             brick->xres, brick->yres, -1,
                             TRUE);
-    else if (type == BRICK_PREVIEW_MINPOS)
+    }
+    else if (type == BRICK_PREVIEW_MINPOS) {
         gwy_brick_minpos_plane(brick, preview,
-                            0, 0, 0,
-                            brick->xres, brick->yres, -1,
-                            TRUE);
-    else if (type == BRICK_PREVIEW_MAXPOS)
+                               0, 0, 0,
+                               brick->xres, brick->yres, -1,
+                               TRUE);
+    }
+    else if (type == BRICK_PREVIEW_MAXPOS) {
         gwy_brick_maxpos_plane(brick, preview,
-                            0, 0, 0,
-                            brick->xres, brick->yres, -1,
-                            TRUE);
-    else if (type == BRICK_PREVIEW_RMS)
+                               0, 0, 0,
+                               brick->xres, brick->yres, -1,
+                               TRUE);
+    }
+    else if (type == BRICK_PREVIEW_RMS) {
         gwy_brick_rms_plane(brick, preview,
                             0, 0, 0,
                             brick->xres, brick->yres, -1,
                             TRUE);
+    }
     else if (type == BRICK_PREVIEW_CHANNEL) {
         GQuark quark = gwy_app_get_data_key_for_id(cid);
         GObject *field = gwy_container_get_object(cdata, quark);
@@ -1880,6 +1909,8 @@ _gwy_app_surface_window_setup(GwyDataWindow *data_window)
 
     g_signal_connect(data_window, "configure-event",
                      G_CALLBACK(gwy_app_surface_window_configured), NULL);
+    g_signal_connect(data_window, "size-allocate",
+                     G_CALLBACK(gwy_app_surface_window_configured), NULL);
 }
 
 static gboolean
@@ -2462,7 +2493,7 @@ restore_data_window_zoom(GwyDataWindow *data_window)
     gtk_widget_size_request(GTK_WIDGET(data_view), &req);
     scw = gdk_screen_get_width(screen);
     sch = gdk_screen_get_height(screen);
-    newrelsize = MAX(req.width/scw, req.height/sch);
+    newrelsize = MAX(scale*req.width/scw, scale*req.height/sch);
     gwy_debug("restoring data window: "
               "relsize %g, zoom %g, request %dx%d, newrelsize %g",
               relsize, scale, req.width, req.height, newrelsize);
@@ -2542,26 +2573,37 @@ _gwy_app_get_n_recent_files(void)
 void
 gwy_app_init_widget_styles(void)
 {
-    gtk_rc_parse_string(/* data window corner buttons */
-                        "style \"cornerbutton\" {\n"
-                        "GtkButton::focus_line_width = 0\n"
-                        "GtkButton::focus_padding = 0\n"
-                        "}\n"
-                        "widget \"*.cornerbutton\" style \"cornerbutton\"\n"
-                        "\n"
-                        /* toolbox group header buttons */
-                        "style \"toolboxheader\" {\n"
-                        "GtkButton::focus_line_width = 0\n"
-                        "GtkButton::focus_padding = 0\n"
-                        "}\n"
-                        "widget \"*.toolboxheader\" style \"toolboxheader\"\n"
-                        "\n"
-                        /* toolbox single-item menubars */
-                        "style \"toolboxmenubar\" {\n"
-                        "GtkMenuBar::shadow_type = 0\n"
-                        "}\n"
-                        "widget \"*.toolboxmenubar\" style \"toolboxmenubar\"\n"
-                        "\n");
+    static const gchar gwyrcstyle[] =
+        /* data window corner buttons */
+        "style \"cornerbutton\" {\n"
+        "GtkButton::focus_line_width = 0\n"
+        "GtkButton::focus_padding = 0\n"
+        "}\n"
+        "widget \"*.cornerbutton\" style \"cornerbutton\"\n"
+        "\n"
+        /* toolbox group header buttons */
+        "style \"toolboxheader\" {\n"
+        "GtkButton::focus_line_width = 0\n"
+        "GtkButton::focus_padding = 0\n"
+        "}\n"
+        "widget \"*.toolboxheader\" style \"toolboxheader\"\n"
+        "\n"
+        /* toolbox single-item menubars */
+        "style \"toolboxmenubar\" {\n"
+        "GtkMenuBar::shadow_type = 0\n"
+        "}\n"
+        "widget \"*.toolboxmenubar\" style \"toolboxmenubar\"\n"
+        "\n"
+        /* toolbox buttons (XXX: perhaps we would like to inherit the style for
+         * toolbar buttons, but I am unable to extract the right style using
+         * gtk_rc_get_style_by_paths() and gtk_style_get()...) */
+        "style \"toolboxbutton\" {\n"
+        "GtkButton::inner_border = {1, 1, 2, 2}\n"
+        "}\n"
+        "widget \"*.toolboxbutton\" style \"toolboxbutton\"\n"
+        "\n";
+
+    gtk_rc_parse_string(gwyrcstyle);
 }
 
 /**
diff --git a/app/authors.h b/app/authors.h
index 6229e1c..bb0b4dd 100644
--- a/app/authors.h
+++ b/app/authors.h
@@ -1,54 +1,53 @@
 /* This is a GENERATED file */
 /*< private_header >*/
 static const gchar developers[] =
-    "David Nečas (Yeti)\n"
-    "Petr Klapetek\n"
-    "Christopher Anderson\n"
-    "Martin Šiler\n"
-    "Jindřich Bílek\n"
-    "Nenad Ocelic\n"
-    "Rok Zitko\n"
-    "Lukáš Chvátal\n"
-    "Sven Neumann\n"
-    "Jan Hořák\n"
-    "Александр Ковалев\n"
-    "Owain Davies\n"
-    "Rolf Würdemann\n"
-    "Dirk Kähler\n"
-    "Miroslav Valtr\n"
-    "Martin Hasoň\n"
-    "Philipp Rahe\n"
-    "Matthew Caldwell\n"
-    "Андрей Груздев\n"
-    "Даниил Браташов\n"
-    "François Bianco\n"
-    "Luke Somers\n"
-    "Vojtěch Salajka\n"
-    "Anna Campbellova\n"
-    "Lennart Fricke\n"
-    "Jozef Veselý\n"
-    "Gianfranco Gallizia\n"
-    "Sameer Grover\n"
-    "Niv Levy\n"
-    "Vinicius Barboza\n"
-    "Jeffrey J. Schwartz\n"
-    "Christian Bühler\n"
-    "Евгений Рябов\n"
-    "Petr Grolich\n"
-    "Samo Ziberna\n"
-    "Antony Kikaxa\n"
+  "David Nečas (Yeti)\n"
+  "Petr Klapetek\n"
+  "Christopher Anderson\n"
+  "Martin Šiler\n"
+  "Jindřich Bílek\n"
+  "Nenad Ocelic\n"
+  "Rok Zitko\n"
+  "Lukáš Chvátal\n"
+  "Sven Neumann\n"
+  "Jan Hořák\n"
+  "Александр Ковалев\n"
+  "Owain Davies\n"
+  "Rolf Würdemann\n"
+  "Dirk Kähler\n"
+  "Miroslav Valtr\n"
+  "Martin Hasoň\n"
+  "Philipp Rahe\n"
+  "Matthew Caldwell\n"
+  "Андрей Груздев\n"
+  "Даниил Браташов\n"
+  "François Bianco\n"
+  "Luke Somers\n"
+  "Vojtěch Salajka\n"
+  "Anna Campbellova\n"
+  "Lennart Fricke\n"
+  "Jozef Veselý\n"
+  "Gianfranco Gallizia\n"
+  "Sameer Grover\n"
+  "Niv Levy\n"
+  "Vinicius Barboza\n"
+  "Jeffrey J. Schwartz\n"
+  "Christian Bühler\n"
+  "Евгений Рябов\n"
+  "Petr Grolich\n"
+  "Samo Ziberna\n"
+  "Antony Kikaxa\n"
+  "Felix Kling\n"
 ;
 static const gchar translators[] =
-    "David Nečas (Yeti)\n"
-    "Petr Klapetek\n"
-    "Livia Della Seta\n"
-    "Philipp Leufke\n"
-    "Johannes Römer\n"
-    "François Riguet\n"
-    "Даниил Браташов\n"
-    "Andrés Muñiz Piniella\n"
-    "Jeong Jiseong\n"
-;
-static const gchar releasedate[] =
-    "2016-11-18"
+  "David Nečas (Yeti)\n"
+  "Petr Klapetek\n"
+  "Livia Della Seta\n"
+  "Philipp Leufke\n"
+  "Johannes Römer\n"
+  "François Riguet\n"
+  "Даниил Браташов\n"
+  "Andrés Muñiz Piniella\n"
+  "Fellype do Nascimento\n"
+  "Jeong Jiseong\n"
 ;
diff --git a/app/data-browser-aux.c b/app/data-browser-aux.c
index ab1a440..742facf 100644
--- a/app/data-browser-aux.c
+++ b/app/data-browser-aux.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: data-browser-aux.c 19043 2016-10-08 18:58:43Z yeti-dn $
+ *  @(#) $Id: data-browser-aux.c 19329 2016-11-29 15:32:12Z yeti-dn $
  *  Copyright (C) 2006-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -1576,25 +1576,10 @@ _gwy_app_find_ids_unmanaged(GwyContainer *data,
     return (gint*)g_array_free(fidata.ids, FALSE);
 }
 
-/**
- * gwy_app_sync_data_items:
- * @source: Source container.
- * @dest: Target container (may be identical to source).
- * @from_id: Data number to copy items from.
- * @to_id: Data number to copy items to.
- * @delete_too: %TRUE to delete items in target if source does not contain
- *              them, %FALSE to copy only.
- * @...: 0-terminated list of #GwyDataItem values defining the items to copy.
- *
- * Synchronizes auxiliary data items between data containers.
- **/
-void
-gwy_app_sync_data_items(GwyContainer *source,
-                        GwyContainer *dest,
-                        gint from_id,
-                        gint to_id,
-                        gboolean delete_too,
-                        ...)
+static void
+sync_one_data_item(GwyContainer *source, GwyContainer *dest,
+                   gint from_id, gint to_id,
+                   GwyDataItem what, gboolean delete_too)
 {
     /* FIXME: copy ALL selections */
     static const gchar *sel_keys[] = {
@@ -1604,7 +1589,6 @@ gwy_app_sync_data_items(GwyContainer *source,
         "cal_xerr", "cal_yerr", "cal_zerr", "cal_xunc", "cal_yunc", "cal_zunc",
     };
 
-    GwyDataItem what;
     gchar key_from[40];
     gchar key_to[40];
     const guchar *name;
@@ -1613,83 +1597,89 @@ gwy_app_sync_data_items(GwyContainer *source,
     gboolean boolval;
     GObject *obj;
     gdouble dbl;
-    va_list ap;
     guint i;
 
-    g_return_if_fail(GWY_IS_CONTAINER(source));
-    g_return_if_fail(GWY_IS_CONTAINER(dest));
-    g_return_if_fail(from_id >= 0 && to_id >= 0);
-    if (source == dest && from_id == to_id)
-        return;
+    switch (what) {
+        case GWY_DATA_ITEM_GRADIENT:
+        g_snprintf(key_from, sizeof(key_from), "/%d/base/palette", from_id);
+        g_snprintf(key_to, sizeof(key_to), "/%d/base/palette", to_id);
+        if (gwy_container_gis_string_by_name(source, key_from, &name))
+            gwy_container_set_string_by_name(dest, key_to, g_strdup(name));
+        else if (delete_too)
+            gwy_container_remove_by_name(dest, key_to);
+        break;
 
-    va_start(ap, delete_too);
-    while ((what = va_arg(ap, GwyDataItem))) {
-        switch (what) {
-            case GWY_DATA_ITEM_GRADIENT:
-            g_snprintf(key_from, sizeof(key_from), "/%d/base/palette", from_id);
-            g_snprintf(key_to, sizeof(key_to), "/%d/base/palette", to_id);
-            if (gwy_container_gis_string_by_name(source, key_from, &name))
-                gwy_container_set_string_by_name(dest, key_to, g_strdup(name));
-            else if (delete_too)
-                gwy_container_remove_by_name(dest, key_to);
-            break;
+        case GWY_DATA_ITEM_MASK_COLOR:
+        g_snprintf(key_from, sizeof(key_from), "/%d/mask", from_id);
+        g_snprintf(key_to, sizeof(key_to), "/%d/mask", to_id);
+        if (gwy_rgba_get_from_container(&rgba, source, key_from))
+            gwy_rgba_store_to_container(&rgba, dest, key_to);
+        else if (delete_too)
+            gwy_rgba_remove_from_container(dest, key_to);
+        break;
 
-            case GWY_DATA_ITEM_MASK_COLOR:
-            g_snprintf(key_from, sizeof(key_from), "/%d/mask", from_id);
-            g_snprintf(key_to, sizeof(key_to), "/%d/mask", to_id);
-            if (gwy_rgba_get_from_container(&rgba, source, key_from))
-                gwy_rgba_store_to_container(&rgba, dest, key_to);
-            else if (delete_too)
-                gwy_rgba_remove_from_container(dest, key_to);
-            break;
+        case GWY_DATA_ITEM_TITLE:
+        g_snprintf(key_from, sizeof(key_from), "/%d/data/title", from_id);
+        g_snprintf(key_to, sizeof(key_to), "/%d/data/title", to_id);
+        if (gwy_container_gis_string_by_name(source, key_from, &name))
+            gwy_container_set_string_by_name(dest, key_to, g_strdup(name));
+        else if (delete_too)
+            gwy_container_remove_by_name(dest, key_to);
+        break;
 
-            case GWY_DATA_ITEM_TITLE:
-            g_snprintf(key_from, sizeof(key_from), "/%d/data/title", from_id);
-            g_snprintf(key_to, sizeof(key_to), "/%d/data/title", to_id);
-            if (gwy_container_gis_string_by_name(source, key_from, &name))
-                gwy_container_set_string_by_name(dest, key_to, g_strdup(name));
-            else if (delete_too)
-                gwy_container_remove_by_name(dest, key_to);
-            break;
+        case GWY_DATA_ITEM_RANGE:
+        g_snprintf(key_from, sizeof(key_from), "/%d/base/min", from_id);
+        g_snprintf(key_to, sizeof(key_to), "/%d/base/min", to_id);
+        if (gwy_container_gis_double_by_name(source, key_from, &dbl))
+            gwy_container_set_double_by_name(dest, key_to, dbl);
+        else if (delete_too)
+            gwy_container_remove_by_name(dest, key_to);
+        g_snprintf(key_from, sizeof(key_from), "/%d/base/max", from_id);
+        g_snprintf(key_to, sizeof(key_to), "/%d/base/max", to_id);
+        if (gwy_container_gis_double_by_name(source, key_from, &dbl)) {
+            gwy_container_set_double_by_name(dest, key_to, dbl);
+        }
+        else if (delete_too)
+            gwy_container_remove_by_name(dest, key_to);
+        case GWY_DATA_ITEM_RANGE_TYPE:
+        g_snprintf(key_from, sizeof(key_from), "/%d/base/range-type",
+                   from_id);
+        g_snprintf(key_to, sizeof(key_to), "/%d/base/range-type", to_id);
+        if (gwy_container_gis_enum_by_name(source, key_from, &enumval))
+            gwy_container_set_enum_by_name(dest, key_to, enumval);
+        else if (delete_too)
+            gwy_container_remove_by_name(dest, key_to);
+        break;
 
-            case GWY_DATA_ITEM_RANGE:
-            g_snprintf(key_from, sizeof(key_from), "/%d/base/min", from_id);
-            g_snprintf(key_to, sizeof(key_to), "/%d/base/min", to_id);
-            if (gwy_container_gis_double_by_name(source, key_from, &dbl))
-                gwy_container_set_double_by_name(dest, key_to, dbl);
-            else if (delete_too)
-                gwy_container_remove_by_name(dest, key_to);
-            g_snprintf(key_from, sizeof(key_from), "/%d/base/max", from_id);
-            g_snprintf(key_to, sizeof(key_to), "/%d/base/max", to_id);
-            if (gwy_container_gis_double_by_name(source, key_from, &dbl)) {
-                gwy_container_set_double_by_name(dest, key_to, dbl);
-            }
-            else if (delete_too)
-                gwy_container_remove_by_name(dest, key_to);
-            case GWY_DATA_ITEM_RANGE_TYPE:
-            g_snprintf(key_from, sizeof(key_from), "/%d/base/range-type",
-                       from_id);
-            g_snprintf(key_to, sizeof(key_to), "/%d/base/range-type", to_id);
-            if (gwy_container_gis_enum_by_name(source, key_from, &enumval))
-                gwy_container_set_enum_by_name(dest, key_to, enumval);
-            else if (delete_too)
-                gwy_container_remove_by_name(dest, key_to);
-            break;
+        case GWY_DATA_ITEM_REAL_SQUARE:
+        g_snprintf(key_from, sizeof(key_from), "/%d/data/realsquare",
+                   from_id);
+        g_snprintf(key_to, sizeof(key_to), "/%d/data/realsquare", to_id);
+        if (gwy_container_gis_boolean_by_name(source, key_from, &boolval)
+            && boolval)
+            gwy_container_set_boolean_by_name(dest, key_to, boolval);
+        else if (delete_too)
+            gwy_container_remove_by_name(dest, key_to);
+        break;
 
-            case GWY_DATA_ITEM_REAL_SQUARE:
-            g_snprintf(key_from, sizeof(key_from), "/%d/data/realsquare",
-                       from_id);
-            g_snprintf(key_to, sizeof(key_to), "/%d/data/realsquare", to_id);
-            if (gwy_container_gis_boolean_by_name(source, key_from, &boolval)
-                && boolval)
-                gwy_container_set_boolean_by_name(dest, key_to, boolval);
-            else if (delete_too)
-                gwy_container_remove_by_name(dest, key_to);
-            break;
+        case GWY_DATA_ITEM_META:
+        g_snprintf(key_from, sizeof(key_from), "/%d/meta", from_id);
+        g_snprintf(key_to, sizeof(key_to), "/%d/meta", to_id);
+        if (gwy_container_gis_object_by_name(source, key_from, &obj)) {
+            obj = gwy_serializable_duplicate(obj);
+            gwy_container_set_object_by_name(dest, key_to, obj);
+            g_object_unref(obj);
+        }
+        else if (delete_too)
+            gwy_container_remove_by_name(dest, key_to);
+        break;
 
-            case GWY_DATA_ITEM_META:
-            g_snprintf(key_from, sizeof(key_from), "/%d/meta", from_id);
-            g_snprintf(key_to, sizeof(key_to), "/%d/meta", to_id);
+        case GWY_DATA_ITEM_CALDATA:
+        for (i = 0; i < G_N_ELEMENTS(cal_keys); i++) {
+            g_snprintf(key_from, sizeof(key_from), "/%d/data/%s", 
+                       from_id, cal_keys[i]);
+            g_snprintf(key_to, sizeof(key_to), "/%d/data/%s", 
+                       to_id, cal_keys[i]);
             if (gwy_container_gis_object_by_name(source, key_from, &obj)) {
                 obj = gwy_serializable_duplicate(obj);
                 gwy_container_set_object_by_name(dest, key_to, obj);
@@ -1697,50 +1687,104 @@ gwy_app_sync_data_items(GwyContainer *source,
             }
             else if (delete_too)
                 gwy_container_remove_by_name(dest, key_to);
-            break;
-
-            case GWY_DATA_ITEM_CALDATA:
-            for (i = 0; i < G_N_ELEMENTS(cal_keys); i++) {
-                g_snprintf(key_from, sizeof(key_from), "/%d/data/%s", 
-                           from_id, cal_keys[i]);
-                g_snprintf(key_to, sizeof(key_to), "/%d/data/%s", 
-                           to_id, cal_keys[i]);
-                if (gwy_container_gis_object_by_name(source, key_from, &obj)) {
-                    obj = gwy_serializable_duplicate(obj);
-                    gwy_container_set_object_by_name(dest, key_to, obj);
-                    g_object_unref(obj);
-                }
-                else if (delete_too)
-                    gwy_container_remove_by_name(dest, key_to);
-            }
-            break;
+        }
+        break;
 
-            case GWY_DATA_ITEM_SELECTIONS:
-            for (i = 0; i < G_N_ELEMENTS(sel_keys); i++) {
-                g_snprintf(key_from, sizeof(key_from), "/%d/select/%s",
-                           from_id, sel_keys[i]);
-                g_snprintf(key_to, sizeof(key_to), "/%d/select/%s",
-                           to_id, sel_keys[i]);
-                if (gwy_container_gis_object_by_name(source, key_from, &obj)
-                    && gwy_selection_get_data(GWY_SELECTION(obj), NULL)) {
-                    obj = gwy_serializable_duplicate(obj);
-                    gwy_container_set_object_by_name(dest, key_to, obj);
-                    g_object_unref(obj);
-                }
-                else if (delete_too)
-                    gwy_container_remove_by_name(dest, key_to);
+        case GWY_DATA_ITEM_SELECTIONS:
+        for (i = 0; i < G_N_ELEMENTS(sel_keys); i++) {
+            g_snprintf(key_from, sizeof(key_from), "/%d/select/%s",
+                       from_id, sel_keys[i]);
+            g_snprintf(key_to, sizeof(key_to), "/%d/select/%s",
+                       to_id, sel_keys[i]);
+            if (gwy_container_gis_object_by_name(source, key_from, &obj)
+                && gwy_selection_get_data(GWY_SELECTION(obj), NULL)) {
+                obj = gwy_serializable_duplicate(obj);
+                gwy_container_set_object_by_name(dest, key_to, obj);
+                g_object_unref(obj);
             }
-            break;
-
-            default:
-            g_assert_not_reached();
-            break;
+            else if (delete_too)
+                gwy_container_remove_by_name(dest, key_to);
         }
+        break;
+
+        default:
+        g_assert_not_reached();
+        break;
     }
+}
+
+/**
+ * gwy_app_sync_data_items:
+ * @source: Source container.
+ * @dest: Target container (may be identical to source).
+ * @from_id: Data number to copy items from.
+ * @to_id: Data number to copy items to.
+ * @delete_too: %TRUE to delete items in target if source does not contain
+ *              them, %FALSE to copy only.
+ * @...: 0-terminated list of #GwyDataItem values defining the items to copy.
+ *
+ * Synchronizes auxiliary channel items between data containers.
+ **/
+void
+gwy_app_sync_data_items(GwyContainer *source,
+                        GwyContainer *dest,
+                        gint from_id,
+                        gint to_id,
+                        gboolean delete_too,
+                        ...)
+{
+    GwyDataItem what;
+    va_list ap;
+
+    g_return_if_fail(GWY_IS_CONTAINER(source));
+    g_return_if_fail(GWY_IS_CONTAINER(dest));
+    g_return_if_fail(from_id >= 0 && to_id >= 0);
+    if (source == dest && from_id == to_id)
+        return;
+
+    va_start(ap, delete_too);
+    while ((what = va_arg(ap, GwyDataItem)))
+        sync_one_data_item(source, dest, from_id, to_id, what, delete_too);
     va_end(ap);
 }
 
 /**
+ * gwy_app_sync_data_itemsv:
+ * @source: Source container.
+ * @dest: Target container (may be identical to source).
+ * @from_id: Data number to copy items from.
+ * @to_id: Data number to copy items to.
+ * @delete_too: %TRUE to delete items in target if source does not contain
+ *              them, %FALSE to copy only.
+ * @items: List of #GwyDataItem values defining the items to copy.
+ * @nitems: Number of items in @items.
+ *
+ * Synchronizes auxiliary channel items between data containers.
+ *
+ * Since: 2.48
+ **/
+void
+gwy_app_sync_data_itemsv(GwyContainer *source,
+                         GwyContainer *dest,
+                         gint from_id,
+                         gint to_id,
+                         gboolean delete_too,
+                         const GwyDataItem *items,
+                         guint nitems)
+{
+    guint i;
+
+    g_return_if_fail(GWY_IS_CONTAINER(source));
+    g_return_if_fail(GWY_IS_CONTAINER(dest));
+    g_return_if_fail(from_id >= 0 && to_id >= 0);
+    if (source == dest && from_id == to_id)
+        return;
+
+    for (i = 0; i < nitems; i++)
+        sync_one_data_item(source, dest, from_id, to_id, items[i], delete_too);
+}
+
+/**
  * gwy_app_data_browser_copy_channel:
  * @source: Source container.
  * @id: Data channel id.
diff --git a/app/data-browser.c b/app/data-browser.c
index f3c1620..a8a5d1b 100644
--- a/app/data-browser.c
+++ b/app/data-browser.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: data-browser.c 19137 2016-10-31 07:51:16Z yeti-dn $
+ *  @(#) $Id: data-browser.c 20177 2017-08-07 08:31:36Z yeti-dn $
  *  Copyright (C) 2006-2016 David Necas (Yeti), Petr Klapetek, Chris Anderson
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, sidewinderasu at gmail.com.
  *
@@ -5579,7 +5579,7 @@ gwy_app_data_browser_construct_window(GwyAppDataBrowser *browser)
 
     /* Channels tab */
     box_page = gtk_vbox_new(FALSE, 0);
-    label = gtk_label_new(_("Channels"));
+    label = gtk_label_new(_("Images"));
     gtk_notebook_append_page(GTK_NOTEBOOK(browser->notebook), box_page, label);
 
     scwin = gtk_scrolled_window_new(NULL, NULL);
@@ -7420,6 +7420,46 @@ gwy_app_data_browser_get_current(GwyAppWhat what,
     va_end(ap);
 }
 
+static gboolean
+title_matches_pattern(GwyContainer *data,
+                      GwyAppPage pageno,
+                      gint id,
+                      GPatternSpec *pattern)
+{
+    gboolean ok = FALSE;
+    GQuark quark;
+    GObject *object;
+    gchar *title;
+
+    if (!pattern)
+        return TRUE;
+
+    if (pageno == GWY_PAGE_CHANNELS)
+        title = _gwy_app_figure_out_channel_title(data, id);
+    else if (pageno == GWY_PAGE_VOLUMES)
+        title = gwy_app_get_brick_title(data, id);
+    else if (pageno == GWY_PAGE_XYZS)
+        title = gwy_app_get_surface_title(data, id);
+    else if (pageno == GWY_PAGE_GRAPHS
+             || pageno == GWY_PAGE_SPECTRA) {
+        if (pageno == GWY_PAGE_GRAPHS)
+            quark = gwy_app_get_graph_key_for_id(id);
+        else
+            quark = gwy_app_get_spectra_key_for_id(id);
+
+        object = gwy_container_get_object(data, quark);
+        g_object_get(object, "title", &title, NULL);
+    }
+    else {
+        g_return_val_if_reached(FALSE);
+    }
+
+    ok = g_pattern_match_string(pattern, title);
+    g_free(title);
+
+    return ok;
+}
+
 static gint*
 gwy_app_data_list_get_object_ids(GwyContainer *data,
                                  GwyAppPage pageno,
@@ -7430,61 +7470,54 @@ gwy_app_data_list_get_object_ids(GwyContainer *data,
     GwyAppDataProxy *proxy;
     GtkTreeModel *model;
     GtkTreeIter iter;
-    gchar *title;
-    gint *ids;
-    gint n;
+    gint *ids = NULL;
+    gint n, j;
 
     browser = gwy_app_get_data_browser();
     proxy = gwy_app_data_browser_get_proxy(browser, data);
-    if (!proxy)
-        return NULL;
-
     if (titleglob)
         pattern = g_pattern_spec_new(titleglob);
 
-    model = GTK_TREE_MODEL(proxy->lists[pageno].store);
-    n = gtk_tree_model_iter_n_children(model, NULL);
-    ids = g_new(gint, n+1);
-    if (n) {
-        n = 0;
-        gtk_tree_model_get_iter_first(model, &iter);
-        do {
-            gboolean ok = FALSE;
-
-            gtk_tree_model_get(model, &iter, MODEL_ID, ids + n, -1);
-            if (pattern) {
-                if (pageno == GWY_PAGE_CHANNELS) {
-                    title = _gwy_app_figure_out_channel_title(data, ids[n]);
-                    ok = g_pattern_match_string(pattern, title);
-                    g_free(title);
-                }
-                else if (pageno == GWY_PAGE_VOLUMES) {
-                    title = gwy_app_get_brick_title(data, ids[n]);
-                    ok = g_pattern_match_string(pattern, title);
-                    g_free(title);
-                }
-                else if (pageno == GWY_PAGE_XYZS) {
-                    title = gwy_app_get_surface_title(data, ids[n]);
-                    ok = g_pattern_match_string(pattern, title);
-                    g_free(title);
-                }
-                else if (pageno == GWY_PAGE_GRAPHS
-                         || pageno == GWY_PAGE_SPECTRA) {
-                    GObject *object;
-
-                    gtk_tree_model_get(model, &iter, MODEL_OBJECT, &object, -1);
-                    g_object_get(object, "title", &title, NULL);
-                    ok = g_pattern_match_string(pattern, title);
-                    g_free(title);
-                    g_object_unref(object);
-                }
+    if (proxy) {
+        model = GTK_TREE_MODEL(proxy->lists[pageno].store);
+        n = gtk_tree_model_iter_n_children(model, NULL);
+        ids = g_new(gint, n+1);
+        if (n) {
+            n = 0;
+            gtk_tree_model_get_iter_first(model, &iter);
+            do {
+                gtk_tree_model_get(model, &iter, MODEL_ID, ids + n, -1);
+                if (title_matches_pattern(data, pageno, ids[n], pattern))
+                    n++;
+            } while (gtk_tree_model_iter_next(model, &iter));
+        }
+    }
+    else {
+        struct {
+            GwyAppPage page;
+            GwyAppKeyType keytype;
+            GType objtype;
+        }
+        page2key[] = {
+            { GWY_PAGE_CHANNELS, KEY_IS_DATA,    GWY_TYPE_DATA_FIELD,  },
+            { GWY_PAGE_GRAPHS,   KEY_IS_GRAPH,   GWY_TYPE_GRAPH_MODEL, },
+            { GWY_PAGE_VOLUMES,  KEY_IS_BRICK,   GWY_TYPE_BRICK,       },
+            { GWY_PAGE_XYZS,     KEY_IS_SURFACE, GWY_TYPE_SURFACE,     },
+            { GWY_PAGE_SPECTRA,  KEY_IS_SPECTRA, GWY_TYPE_SPECTRA,     },
+        };
+        for (n = 0; n < G_N_ELEMENTS(page2key); n++) {
+            if (pageno == page2key[n].page) {
+                ids = _gwy_app_find_ids_unmanaged(data,
+                                                  page2key[n].keytype,
+                                                  page2key[n].objtype);
+                break;
             }
-            else
-                ok = TRUE;
-
-            if (ok)
-                n++;
-        } while (gtk_tree_model_iter_next(model, &iter));
+        }
+        g_return_val_if_fail(ids, NULL);
+        for (j = n = 0; ids[j] != -1; j++) {
+            if (title_matches_pattern(data, pageno, ids[j], pattern))
+                ids[n++] = ids[j];
+        }
     }
     ids[n] = -1;
 
@@ -7509,11 +7542,7 @@ gwy_app_data_list_get_object_ids(GwyContainer *data,
 gint*
 gwy_app_data_browser_get_data_ids(GwyContainer *data)
 {
-    gint *ids;
-
-    if ((ids = gwy_app_data_list_get_object_ids(data, GWY_PAGE_CHANNELS, NULL)))
-        return ids;
-    return _gwy_app_find_ids_unmanaged(data, KEY_IS_DATA, GWY_TYPE_DATA_FIELD);
+    return gwy_app_data_list_get_object_ids(data, GWY_PAGE_CHANNELS, NULL);
 }
 
 /**
@@ -7531,12 +7560,7 @@ gwy_app_data_browser_get_data_ids(GwyContainer *data)
 gint*
 gwy_app_data_browser_get_graph_ids(GwyContainer *data)
 {
-    gint *ids;
-
-    if ((ids = gwy_app_data_list_get_object_ids(data, GWY_PAGE_GRAPHS, NULL)))
-        return ids;
-    return _gwy_app_find_ids_unmanaged(data, KEY_IS_GRAPH,
-                                       GWY_TYPE_GRAPH_MODEL);
+    return gwy_app_data_list_get_object_ids(data, GWY_PAGE_GRAPHS, NULL);
 }
 
 /**
@@ -7556,11 +7580,7 @@ gwy_app_data_browser_get_graph_ids(GwyContainer *data)
 gint*
 gwy_app_data_browser_get_spectra_ids(GwyContainer *data)
 {
-    gint *ids;
-
-    if ((ids = gwy_app_data_list_get_object_ids(data, GWY_PAGE_SPECTRA, NULL)))
-        return ids;
-    return _gwy_app_find_ids_unmanaged(data, KEY_IS_SPECTRA, GWY_TYPE_SPECTRA);
+    return gwy_app_data_list_get_object_ids(data, GWY_PAGE_SPECTRA, NULL);
 }
 
 /**
@@ -7580,11 +7600,7 @@ gwy_app_data_browser_get_spectra_ids(GwyContainer *data)
 gint*
 gwy_app_data_browser_get_volume_ids(GwyContainer *data)
 {
-    gint *ids;
-
-    if ((ids = gwy_app_data_list_get_object_ids(data, GWY_PAGE_VOLUMES, NULL)))
-        return ids;
-    return _gwy_app_find_ids_unmanaged(data, KEY_IS_BRICK, GWY_TYPE_BRICK);
+    return gwy_app_data_list_get_object_ids(data, GWY_PAGE_VOLUMES, NULL);
 }
 
 /**
@@ -7600,11 +7616,7 @@ gwy_app_data_browser_get_volume_ids(GwyContainer *data)
 gint*
 gwy_app_data_browser_get_xyz_ids(GwyContainer *data)
 {
-    gint *ids;
-
-    if ((ids = gwy_app_data_list_get_object_ids(data, GWY_PAGE_XYZS, NULL)))
-        return ids;
-    return _gwy_app_find_ids_unmanaged(data, KEY_IS_SURFACE, GWY_TYPE_SURFACE);
+    return gwy_app_data_list_get_object_ids(data, GWY_PAGE_XYZS, NULL);
 }
 
 static GtkWindow*
@@ -7986,13 +7998,17 @@ gwy_app_data_browser_set_gui_enabled(gboolean setting)
 
 /**
  * gwy_app_data_browser_find_data_by_title:
- * @data: A data container managed by the data-browser.
+ * @data: A data container.
  * @titleglob: Pattern, as used by #GPatternSpec, to match the channel titles
  *             against.
  *
  * Gets the list of all channels in a data container whose titles match the
  * specified pattern.
  *
+ * The function originally could be used only for data containers managed by
+ * the data browser.  Since version 2.49 it can be used for all file-like
+ * data containers.
+ *
  * Returns: A newly allocated array with channel ids, -1 terminated.
  *
  * Since: 2.21
@@ -8006,13 +8022,17 @@ gwy_app_data_browser_find_data_by_title(GwyContainer *data,
 
 /**
  * gwy_app_data_browser_find_graphs_by_title:
- * @data: A data container managed by the data-browser.
+ * @data: A data container.
  * @titleglob: Pattern, as used by #GPatternSpec, to match the graph titles
  *             against.
  *
  * Gets the list of all graphs in a data container whose titles match the
  * specified pattern.
  *
+ * The function originally could be used only for data containers managed by
+ * the data browser.  Since version 2.49 it can be used for all file-like
+ * data containers.
+ *
  * Returns: A newly allocated array with graph ids, -1 terminated.
  *
  * Since: 2.21
@@ -8026,13 +8046,17 @@ gwy_app_data_browser_find_graphs_by_title(GwyContainer *data,
 
 /**
  * gwy_app_data_browser_find_spectra_by_title:
- * @data: A data container managed by the data-browser.
+ * @data: A data container.
  * @titleglob: Pattern, as used by #GPatternSpec, to match the spectra titles
  *             against.
  *
  * Gets the list of all spectra in a data container whose titles match the
  * specified pattern.
  *
+ * The function originally could be used only for data containers managed by
+ * the data browser.  Since version 2.49 it can be used for all file-like
+ * data containers.
+ *
  * Returns: A newly allocated array with spectra ids, -1 terminated.
  *
  * Since: 2.21
@@ -8046,13 +8070,17 @@ gwy_app_data_browser_find_spectra_by_title(GwyContainer *data,
 
 /**
  * gwy_app_data_browser_find_volume_by_title:
- * @data: A data container managed by the data-browser.
+ * @data: A data container.
  * @titleglob: Pattern, as used by #GPatternSpec, to match the volume data
  *             titles against.
  *
  * Gets the list of all volume data in a data container whose titles match the
  * specified pattern.
  *
+ * The function originally could be used only for data containers managed by
+ * the data browser.  Since version 2.49 it can be used for all file-like
+ * data containers.
+ *
  * Returns: A newly allocated array with volume data ids, -1 terminated.
  *
  * Since: 2.45
@@ -8066,13 +8094,17 @@ gwy_app_data_browser_find_volume_by_title(GwyContainer *data,
 
 /**
  * gwy_app_data_browser_find_xyz_by_title:
- * @data: A data container managed by the data-browser.
+ * @data: A data container.
  * @titleglob: Pattern, as used by #GPatternSpec, to match the XYZ data
  *             titles against.
  *
  * Gets the list of all XYZ data in a data container whose titles match the
  * specified pattern.
  *
+ * The function originally could be used only for data containers managed by
+ * the data browser.  Since version 2.49 it can be used for all file-like
+ * data containers.
+ *
  * Returns: A newly allocated array with XYZ data ids, -1 terminated.
  *
  * Since: 2.45
diff --git a/app/data-browser.h b/app/data-browser.h
index 3f7183e..deeff5d 100644
--- a/app/data-browser.h
+++ b/app/data-browser.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: data-browser.h 18862 2016-08-21 11:15:58Z yeti-dn $
+ *  @(#) $Id: data-browser.h 19329 2016-11-29 15:32:12Z yeti-dn $
  *  Copyright (C) 2006-2015 David Necas (Yeti), Petr Klapetek, Chris Anderson
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, sidewinderasu at gmail.com.
  *
@@ -172,6 +172,13 @@ void   gwy_app_sync_data_items               (GwyContainer *source,
                                               gint to_id,
                                               gboolean delete_too,
                                               ...);
+void   gwy_app_sync_data_itemsv              (GwyContainer *source,
+                                              GwyContainer *dest,
+                                              gint from_id,
+                                              gint to_id,
+                                              gboolean delete_too,
+                                              const GwyDataItem *items,
+                                              guint nitems);
 gint   gwy_app_data_browser_copy_channel     (GwyContainer *source,
                                               gint id,
                                               GwyContainer *dest);
diff --git a/app/file.c b/app/file.c
index 74ae3c1..1310b91 100644
--- a/app/file.c
+++ b/app/file.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: file.c 19229 2016-11-10 16:28:18Z yeti-dn $
+ *  @(#) $Id: file.c 19456 2017-02-07 12:39:07Z yeti-dn $
  *  Copyright (C) 2003-2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -177,7 +177,7 @@ warn_broken_load_func(const gchar *name,
                       GwyContainer *data)
 {
     static const gchar *broken_file_funcs[] = {
-        "ambfile", "dimensionfile",
+        "dimensionfile",
         /*"at present no modules are broken and this is not a file type name",*/
     };
 
@@ -266,6 +266,13 @@ gwy_app_file_load_real(const gchar *filename_utf8,
         gwy_data_validate(data,
                           GWY_DATA_VALIDATE_CORRECT
                           | GWY_DATA_VALIDATE_NO_REPORT);
+        if (_gwy_app_enforce_graph_abscissae_order(data)) {
+            if (!gwy_stramong(name, "gwyfile", NULL)) {
+                g_warning("Module %s did not import file %s with graph curve "
+                          "points in ascending order.  Please fix the module.",
+                          name, filename_utf8);
+            }
+        }
         if (do_add_loaded)
             gwy_app_file_add_loaded(data, filename_utf8, filename_sys);
     }
diff --git a/app/gwyappfilechooser.c b/app/gwyappfilechooser.c
index df20e80..0ce8057 100644
--- a/app/gwyappfilechooser.c
+++ b/app/gwyappfilechooser.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: gwyappfilechooser.c 19043 2016-10-08 18:58:43Z yeti-dn $
- *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: gwyappfilechooser.c 20124 2017-07-31 15:31:21Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -22,6 +22,7 @@
 #include "config.h"
 #include <string.h>
 #include <stdlib.h>
+#include <glib/gstdio.h>
 #include <gtk/gtk.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
@@ -31,6 +32,10 @@
 #include <app/gwyapp.h>
 #include "gwyappinternal.h"
 
+/* Do not try to full-preview files larger than this.  100 MB is an arbitrary
+ * limit but most < 100 MB files seem to be readable fairly quickly. */
+#define MAX_FILE_SIZE_FOR_PREVIEW (96UL*1024UL*1024UL)
+
 enum {
     BLOODY_ICON_VIEW_PADDING = 2*6,
     PADDED_THUMBNAIL_SIZE = TMS_NORMAL_THUMB_SIZE + BLOODY_ICON_VIEW_PADDING
@@ -274,6 +279,10 @@ _gwy_app_file_chooser_get(GtkFileChooserAction action)
                      G_CALLBACK(gwy_app_file_chooser_save_position), NULL);
     gwy_app_restore_window_position(GTK_WINDOW(chooser), chooser->prefix, TRUE);
 
+    /* Does not filter when initially shown without this. */
+    if (action == GTK_FILE_CHOOSER_ACTION_OPEN)
+        enforce_refilter(chooser);
+
     return *instance;
 }
 
@@ -695,9 +704,11 @@ gwy_app_file_chooser_open_filter(const GtkFileFilterInfo *filter_info,
     gboolean ok = TRUE;
 
     if (ok && chooser->glob->len) {
-        gchar *filename_utf8 = g_filename_to_utf8(filename, -1,
+        gchar *basename = g_path_get_basename(filename);
+        gchar *filename_utf8 = g_filename_to_utf8(basename, -1,
                                                   NULL, NULL, NULL);
 
+        g_free(basename);
         if (filename_utf8) {
             if (chooser->glob_casesens)
                 ok = g_pattern_match_string(chooser->pattern, filename_utf8);
@@ -912,6 +923,8 @@ gwy_app_file_chooser_update_preview(GwyAppFileChooser *chooser)
     GdkPixbuf *pixbuf;
     GtkTreeIter iter;
     gchar *filename_sys, *basename_sys, *filename_utf8;
+    gboolean file_too_large = TRUE;
+    GStatBuf st;
 
     gwy_app_file_chooser_free_preview(chooser);
 
@@ -949,6 +962,9 @@ gwy_app_file_chooser_update_preview(GwyAppFileChooser *chooser)
     }
     gtk_label_set_text(GTK_LABEL(chooser->preview_type), "");
 
+    if (g_stat(filename_sys, &st) == 0)
+        file_too_large = (st.st_size > MAX_FILE_SIZE_FOR_PREVIEW);
+
     pixbuf = _gwy_app_recent_file_try_thumbnail(filename_sys);
     g_free(filename_sys);
 
@@ -966,14 +982,19 @@ gwy_app_file_chooser_update_preview(GwyAppFileChooser *chooser)
                  NULL);
     gtk_list_store_insert_with_values(GTK_LIST_STORE(model), &iter, -1,
                                       COLUMN_PIXBUF, pixbuf,
-                                      COLUMN_FILEINFO, _("…"),
+                                      COLUMN_FILEINFO,
+                                      (file_too_large
+                                       ? _("File too large for preview")
+                                       : _("…")),
                                       -1);
     g_object_unref(pixbuf);
 
-    chooser->full_preview_id
-        = g_timeout_add_full(G_PRIORITY_LOW, 250,
-                             gwy_app_file_chooser_do_full_preview, chooser,
-                             NULL);
+    if (!file_too_large) {
+        chooser->full_preview_id
+            = g_timeout_add_full(G_PRIORITY_LOW, 250,
+                                 gwy_app_file_chooser_do_full_preview, chooser,
+                                 NULL);
+    }
 }
 
 static guint
@@ -1353,7 +1374,7 @@ gwy_app_file_chooser_do_full_preview(gpointer user_data)
         if ((n = count_ids(xyz_ids)))
             g_string_append_printf(str, ", %d xyz", n);
         if ((n = count_ids(channel_ids)))
-            g_string_append_printf(str, ", %d ch", n);
+            g_string_append_printf(str, ", %d img", n);
         if ((n = count_ids(graph_ids)))
             g_string_append_printf(str, ", %d gr", n);
         if ((n = count_ids(sps_ids)))
diff --git a/app/gwyappinternal.h b/app/gwyappinternal.h
index f2f9f76..312c88e 100644
--- a/app/gwyappinternal.h
+++ b/app/gwyappinternal.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwyappinternal.h 18922 2016-09-05 10:10:23Z yeti-dn $
+ *  @(#) $Id: gwyappinternal.h 19300 2016-11-21 08:49:18Z yeti-dn $
  *  Copyright (C) 2004-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -177,6 +177,9 @@ void              _gwy_app_log_add_message_to_textbuf   (GtkTextBuffer *textbuf,
                                                          const gchar *message,
                                                          GLogLevelFlags log_level);
 
+G_GNUC_INTERNAL
+guint _gwy_app_enforce_graph_abscissae_order(GwyContainer *data);
+
 /* data-browser-aux functions */
 G_GNUC_INTERNAL
 void _gwy_app_data_merge_gather(gpointer key,
diff --git a/app/gwyddion.c b/app/gwyddion.c
index f98bdae..c5a3802 100644
--- a/app/gwyddion.c
+++ b/app/gwyddion.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwyddion.c 18975 2016-09-20 13:28:39Z yeti-dn $
+ *  @(#) $Id: gwyddion.c 20076 2017-07-15 18:26:38Z dn2010 $
  *  Copyright (C) 2003-2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -62,19 +62,22 @@ typedef struct {
 static gboolean open_command_line_files         (gint n,
                                                  gchar **args);
 static gboolean open_directory_at_startup       (gpointer user_data);
+static void     block_modules                   (const gchar *modules_to_block);
 static gboolean show_tip_at_startup             (gpointer user_data);
 static gint     check_command_line_files        (gint n,
                                                  gchar **args);
 static void     print_help                      (void);
 static void     process_preinit_options         (int *argc,
                                                  char ***argv,
-                                                 GwyAppOptions *options);
+                                                 GwyAppOptions *options,
+                                                 gchar **modules_to_block);
 static void     debug_time                      (GTimer *timer,
                                                  const gchar *task);
 static void     setup_locale_from_win32_registry(void);
 static void     warn_broken_settings_file       (GtkWidget *parent,
                                                  const gchar *settings_file,
                                                  const gchar *reason);
+static void     check_broken_modules            (GtkWidget *parent);
 static void     gwy_app_init                    (int *argc,
                                                  char ***argv);
 static void     gwy_app_set_window_icon         (void);
@@ -97,6 +100,7 @@ main(int argc, char *argv[])
     GtkWidget *toolbox;
     gchar **module_dirs;
     gchar *settings_file, *recent_file_file, *accel_file;
+    gchar *modules_to_block = NULL;
     gboolean has_settings, settings_ok = FALSE;
     gboolean opening_files = FALSE, show_tips = FALSE;
     GwyContainer *settings;
@@ -107,7 +111,7 @@ main(int argc, char *argv[])
     g_unsetenv("UBUNTU_MENUPROXY");
     timer = g_timer_new();
 
-    process_preinit_options(&argc, &argv, &app_options);
+    process_preinit_options(&argc, &argv, &app_options, &modules_to_block);
     gwy_app_setup_logging((app_options.log_to_file
                            ? GWY_APP_LOGGING_TO_FILE : 0)
                           | (app_options.log_to_console
@@ -169,6 +173,8 @@ main(int argc, char *argv[])
     debug_time(timer, "load settings");
 
     gwy_app_splash_set_message(_("Registering modules"));
+    block_modules(modules_to_block);
+    GWY_FREE(modules_to_block);
     module_dirs = gwy_app_settings_get_module_dirs();
     gwy_module_register_modules((const gchar**)module_dirs);
     /* The Python initialisation somehow overrides SIGINT and Gwyddion can no
@@ -190,7 +196,11 @@ main(int argc, char *argv[])
         return !nfailures;
     }
 
-    gwy_app_splash_set_message(_("Initializing GUI"));
+    /* Destroy splash before creating UI.  Opposite order of actions can
+     * apparently lead to strange errors. */
+    gwy_app_splash_finish();
+    debug_time(timer, "destroy splash");
+
     toolbox = gwy_app_toolbox_window_create();
     debug_time(timer, "create toolbox");
     gwy_app_data_browser_restore();
@@ -198,8 +208,6 @@ main(int argc, char *argv[])
     /* A dirty trick, it constructs the recent files menu as a side effect. */
     gwy_app_recent_file_list_update(NULL, NULL, NULL, 0);
     debug_time(timer, "create recent files menu");
-    gwy_app_splash_finish();
-    debug_time(timer, "destroy splash");
 
     /* Win32 does not give programs a reasonable physical cwd.  So try to set
      * something reasonable here.  Do it before opening files from arguments
@@ -228,6 +236,8 @@ main(int argc, char *argv[])
         g_clear_error(&settings_err);
     }
 
+    check_broken_modules(toolbox);
+
     /* Move focus to toolbox */
     gtk_window_present(GTK_WINDOW(toolbox));
     debug_time(timer, "show toolbox");
@@ -281,7 +291,8 @@ main(int argc, char *argv[])
 static void
 process_preinit_options(int *argc,
                         char ***argv,
-                        GwyAppOptions *options)
+                        GwyAppOptions *options,
+                        gchar **modules_to_block)
 {
     int i, j;
     gboolean ignore = FALSE;
@@ -356,6 +367,19 @@ process_preinit_options(int *argc,
                 options->check = TRUE;
                 continue;
             }
+            if (g_str_has_prefix((*argv)[i], "--disable-modules=")) {
+                const gchar *v = (*argv)[i] + strlen("--disable-modules=");
+                if (strlen(v)) {
+                    if (*modules_to_block) {
+                        gchar *s = g_strconcat(*modules_to_block, ",", v, NULL);
+                        g_free(*modules_to_block);
+                        *modules_to_block = s;
+                    }
+                    else
+                        *modules_to_block = g_strdup(v);
+                }
+                continue;
+            }
         }
 
         j++;
@@ -385,6 +409,8 @@ print_help(void)
 "     --no-log-to-file       Do not write messages to any file.\n"
 "     --log-to-console       Print messages to console\n"
 "     --no-log-to-console    Do not print messages to console.\n"
+"     --disable-modules=MODNAME1,MODNAME2,...\n"
+"                            Prevent registration of given modules.\n"
 "     --debug-objects        Catch leaking objects (devel only).\n"
 "     --startup-time         Measure time of startup tasks.\n"
         );
@@ -431,12 +457,11 @@ warn_broken_settings_file(GtkWidget *parent,
 {
     GtkWidget *dialog;
 
-    dialog = gtk_message_dialog_new
-                 (GTK_WINDOW(parent),
-                  GTK_DIALOG_DESTROY_WITH_PARENT,
-                  GTK_MESSAGE_WARNING,
-                  GTK_BUTTONS_OK,
-                  _("Could not read settings."));
+    dialog = gtk_message_dialog_new(GTK_WINDOW(parent),
+                                    GTK_DIALOG_DESTROY_WITH_PARENT,
+                                    GTK_MESSAGE_WARNING,
+                                    GTK_BUTTONS_OK,
+                                    _("Could not read settings."));
     gtk_message_dialog_format_secondary_text
         (GTK_MESSAGE_DIALOG(dialog),
          _("Settings file `%s' cannot be read: %s\n\n"
@@ -451,6 +476,54 @@ warn_broken_settings_file(GtkWidget *parent,
 }
 
 static void
+count_failures(gpointer mod_fail_info, gpointer user_data)
+{
+    GwyModuleFailureInfo *finfo = (GwyModuleFailureInfo*)mod_fail_info;
+    guint *n = (guint*)user_data;
+
+    /* Ignore user's modules. */
+    if (!g_str_has_prefix(finfo->filename, gwy_get_user_dir()))
+        (*n)++;
+}
+
+static void
+check_broken_modules(GtkWidget *parent)
+{
+    GtkWidget *dialog;
+    gchar *moduledir;
+    guint n = 0;
+
+    gwy_module_failure_foreach(count_failures, &n);
+    /* Usually, the number should either be less than 3 or huge. */
+    if (n < 8)
+        return;
+
+    dialog = gtk_message_dialog_new(GTK_WINDOW(parent),
+                                    GTK_DIALOG_DESTROY_WITH_PARENT,
+                                    GTK_MESSAGE_WARNING,
+                                    GTK_BUTTONS_OK,
+                                    _("Many modules (%u) failed to register."),
+                                    n);
+    moduledir = gwy_find_self_dir("modules");
+    gtk_message_dialog_format_secondary_text
+        (GTK_MESSAGE_DIALOG(dialog),
+         _("Most likely Gwyddion was not upgraded correctly.  "
+           "Instead, one installation was just overwritten with another, "
+           "and now it is a mess.\n\n"
+           "Please remove completely the module directory\n\n"
+           "%s\n\n"
+           "and reinstall Gwyddion.\n\n"
+           "See Info → Module Browser for specific errors."),
+         moduledir);
+    g_free(moduledir);
+    /* parent is usually in a screen corner, centering on it looks ugly */
+    gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
+    gtk_window_present(GTK_WINDOW(dialog));
+    gtk_dialog_run(GTK_DIALOG(dialog));
+    gtk_widget_destroy(dialog);
+}
+
+static void
 setup_locale_from_win32_registry(void)
 {
 #ifdef G_OS_WIN32
@@ -615,6 +688,21 @@ check_command_line_files(gint n,
     return nfailures;
 }
 
+static void
+block_modules(const gchar *modules_to_block)
+{
+    gchar **modlist;
+    guint i;
+
+    if (!modules_to_block)
+        return;
+
+    modlist = g_strsplit(modules_to_block, ",", 0);
+    for (i = 0; modlist[i]; i++)
+        gwy_module_disable_registration(modlist[i]);
+    g_strfreev(modlist);
+}
+
 static gboolean
 show_tip_at_startup(G_GNUC_UNUSED gpointer user_data)
 {
diff --git a/app/gwymoduleutils-file.c b/app/gwymoduleutils-file.c
index 322ce1d..2232851 100644
--- a/app/gwymoduleutils-file.c
+++ b/app/gwymoduleutils-file.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwymoduleutils-file.c 18368 2016-02-29 21:23:00Z yeti-dn $
+ *  @(#) $Id: gwymoduleutils-file.c 19624 2017-04-18 13:45:32Z yeti-dn $
  *  Copyright (C) 2007-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -227,8 +227,7 @@ gwy_app_xyz_title_fall_back(GwyContainer *data,
  * Since Gwyddion has no concept of bad data points, they are usually marked
  * with a mask and replaced with some neutral values upon import, leaving the
  * user to decide how to proceed further.  This helper function performs such
- * replacement, using the average of all good points as the neutral replacement
- * value (at this moment).
+ * replacement.
  *
  * Returns: The number of bad data points replaced.  If zero is returned, all
  *          points are good and there is no need for masking.
@@ -239,28 +238,23 @@ guint
 gwy_app_channel_remove_bad_data(GwyDataField *dfield, GwyDataField *mfield)
 {
     GwySIUnit *funit, *munit;
-    gdouble *data = gwy_data_field_get_data(dfield);
-    gdouble *mdata = gwy_data_field_get_data(mfield);
-    gdouble *drow, *mrow;
-    gdouble avg;
-    guint i, j, mcount, xres, yres;
-
-    xres = gwy_data_field_get_xres(dfield);
-    yres = gwy_data_field_get_yres(dfield);
-    avg = gwy_data_field_area_get_avg(dfield, mfield, 0, 0, xres, yres);
+    gdouble *m = gwy_data_field_get_data(mfield);
+    guint i, mcount, n;
+
+    n = gwy_data_field_get_xres(dfield) * gwy_data_field_get_yres(dfield);
     mcount = 0;
-    for (i = 0; i < yres; i++) {
-        mrow = mdata + i*xres;
-        drow = data + i*xres;
-        for (j = 0; j < xres; j++) {
-            if (!mrow[j]) {
-                drow[j] = avg;
-                mcount++;
-            }
-            mrow[j] = 1.0 - mrow[j];
+    for (i = 0; i < n; i++) {
+        if (m[i] <= 0.0) {
+            m[i] = 1.0;
+            mcount++;
         }
+        else
+            m[i] = 0.0;
     }
 
+    if (mcount)
+        gwy_data_field_laplace_solve(dfield, mfield, -1, 0.25);
+
     gwy_data_field_set_xreal(mfield, gwy_data_field_get_xreal(dfield));
     gwy_data_field_set_yreal(mfield, gwy_data_field_get_yreal(dfield));
     funit = gwy_data_field_get_si_unit_xy(dfield);
@@ -316,7 +310,7 @@ gwy_app_channel_mask_of_nans(GwyDataField *dfield,
     if (!mask || !removebad)
         return mask;
 
-    gwy_data_field_correct_average_unmasked(dfield, mask);
+    gwy_data_field_laplace_solve(dfield, mask, -1, 0.25);
 
     return mask;
 }
diff --git a/app/help.c b/app/help.c
index 6dd43c9..40b71a6 100644
--- a/app/help.c
+++ b/app/help.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: help.c 18353 2016-02-24 14:10:42Z yeti-dn $
- *  Copyright (C) 2014 David Necas (Yeti).
+ *  @(#) $Id: help.c 19898 2017-06-11 06:53:55Z yeti-dn $
+ *  Copyright (C) 2014-2017 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -64,7 +64,7 @@ show_uri_win32(G_GNUC_UNUSED const gchar *uri, gboolean complain)
 {
 #ifdef G_OS_WIN32
     static gboolean initialised_com = FALSE;
-    gint status;
+    INT_PTR status;
     gboolean ok;
 
     if (!uri)
@@ -79,11 +79,11 @@ show_uri_win32(G_GNUC_UNUSED const gchar *uri, gboolean complain)
     /* XXX: The first arg is handle to the window.  May want to pass it.
      * Apparenly gdk_win32_window_get_impl_hwnd() can provide it but this is
      * a late addition to Gdk, must check availability properly. */
-    status = (int)ShellExecute(NULL, NULL, uri, NULL, NULL, SW_SHOWNORMAL);
+    status = (INT_PTR)ShellExecute(NULL, NULL, uri, NULL, NULL, SW_SHOWNORMAL);
     ok = status > 32;  /* Otherwise it's the error code. */
     if (!ok && complain) {
         g_warning("Help ShellExecute() for URI `%s' failed with code %d.",
-                  uri, status);
+                  uri, (gint)status);
     }
     return ok;
 #else
@@ -371,58 +371,88 @@ get_user_guide_online_base(void)
     return g_strconcat(UG_ONLINE_BASE, lang, NULL);
 }
 
+#ifdef G_OS_WIN32
+static inline gboolean
+starts_with_drive_letter(const gchar *path)
+{
+    return g_ascii_isalpha(path[0]) && path[1] == ':';
+}
+#endif
+
 /* If an URI points to a local file, check if it exists.  Otherwise just assume
  * it exists. */
 static gboolean
 check_local_file_uri(const gchar *uri)
 {
-    GFile *gfile;
-    gchar *path, *scheme;
-    GFileInfo *fileinfo;
-    GFileType filetype;
-
-    /* If we use g_file_new_for_uri() on a bare path the tests below will not
-     * behave as expected. */
-    gfile = g_file_new_for_uri(uri);
-    if (!(scheme = g_file_get_uri_scheme(gfile))) {
-        const gchar *p;
-
-        g_object_unref(gfile);
-        if ((p = strchr(uri, '#'))) {
-            path = g_strndup(uri, p - uri);
-            gfile = g_file_new_for_path(path);
-            g_free(path);
-        }
-        else
-            gfile = g_file_new_for_path(uri);
+    guint i, j, len, nslashes = 0;
+    gchar *s = NULL, *decoded = NULL;
+    const gchar *p;
+    gboolean retval;
+
+    /* Trim fragment. */
+    if ((p = strrchr(uri, '#'))) {
+        s = g_strndup(uri, p-uri);
+        uri = s;
     }
-    else
-        g_free(scheme);
 
-    /* We used g_file_hash() here but it segfaults under wine.  No idea why. */
-    if (!(path = g_file_get_basename(gfile))) {
-        g_object_unref(gfile);
-        return FALSE;
+    if (strncmp(uri, "file:/", 6) == 0) {
+        for (nslashes = 1; uri[5 + nslashes] == '/'; nslashes++)
+            ;
     }
-    g_free(path);
 
-    if (!(path = g_file_get_path(gfile))) {
-        g_object_unref(gfile);
+    if (!nslashes) {
+        /* Plain local path. */
+        if (uri[0] == '/')
+            goto finish;
+#ifdef G_OS_WIN32
+        if (uri[0] == '\\' || starts_with_drive_letter(uri))
+            goto finish;
+#endif
+
+        /* Is not file: and is not a local path.  Assume non-local, and so we
+         * cannot check it. */
+        gwy_debug("non-local %s, assuming OK", uri);
+        g_free(s);
         return TRUE;
     }
-    g_free(path);
 
-    fileinfo = g_file_query_info(gfile, G_FILE_ATTRIBUTE_STANDARD_TYPE,
-                                 0, NULL, NULL);
-    if (!fileinfo) {
-        g_object_unref(gfile);
-        return FALSE;
+    uri += 5;
+#ifdef G_OS_WIN32
+    if ((nslashes == 1 || nslashes == 3)
+        && starts_with_drive_letter(uri + nslashes))
+        uri += nslashes;
+    else
+        uri += nslashes-2;
+#else
+    uri += nslashes-1;
+#endif
+
+    if (!strchr(uri, '%'))
+        goto finish;
+
+    len = strlen(uri);
+    decoded = g_new(gchar, len+1);
+    for (i = j = 0; i < len; i++) {
+        if (uri[i] == '%'
+            && g_ascii_isdigit(uri[i+1])
+            && g_ascii_isdigit(uri[i+2])) {
+            decoded[j++] = (16*g_ascii_xdigit_value(uri[i+1])
+                            + g_ascii_xdigit_value(uri[i+2]));
+            i += 2;
+        }
+        else
+            decoded[j++] = uri[i];
     }
-    filetype = g_file_info_get_file_type(fileinfo);
-    g_object_unref(gfile);
-    g_object_unref(fileinfo);
+    decoded[j] = '\0';
+    uri = decoded;
+
+finish:
+    retval = g_file_test(uri, G_FILE_TEST_IS_REGULAR);
+    gwy_debug("checking %s: %d", uri, retval);
+    g_free(s);
+    g_free(decoded);
 
-    return filetype == G_FILE_TYPE_REGULAR;
+    return retval;
 }
 
 static gchar*
diff --git a/app/mac_integration.c b/app/mac_integration.c
index cccffe6..1b8120a 100644
--- a/app/mac_integration.c
+++ b/app/mac_integration.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: mac_integration.c 18552 2016-03-29 09:00:59Z yeti-dn $
+ *  @(#) $Id: mac_integration.c 19333 2016-11-30 17:09:57Z yeti-dn $
  *  Copyright (C) 2009 Andrey Gruzdev.
  *  E-mail: gruzdev at ntmdt.ru.
  *
@@ -236,6 +236,7 @@ gwy_osx_set_locale()
         { "fr_FR.UTF-8", "fr" },
         { "it_IT.UTF-8", "it" },
         { "ko_KR.UTF-8", "ko" },
+        { "pt_BR.UTF-8", "pt_BR" },
         { "ru_RU.UTF-8", "ru" },
         { "es_ES.UTF-8", "es" },
 /* @@@ GENERATED LANG OS X END @@@ */
diff --git a/app/menu.c b/app/menu.c
index 0ada098..8905bc3 100644
--- a/app/menu.c
+++ b/app/menu.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: menu.c 18346 2016-02-24 10:26:37Z yeti-dn $
- *  Copyright (C) 2003-2006,2011 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: menu.c 20114 2017-07-30 22:33:28Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -36,9 +36,6 @@
 #include <app/gwyapp.h>
 #include "gwyappinternal.h"
 
-/* Don't use stock icons, many don't look good and/or need disambiguation */
-#define USE_STOCK_ICONS 0
-
 typedef struct {
     const gchar *name;
     const gchar *stock_id;
@@ -334,7 +331,9 @@ gwy_app_menu_create_widgets(GNode *node,
     GtkWidget *menu, *item, *image;
 
     if (!G_NODE_IS_ROOT(node)) {
-        if (USE_STOCK_ICONS && data->stock_id) {
+        /* If images in menus are disabled by the "gtk-menu-images" setting,
+         * Gtk+ will not show them anyway. */
+        if (data->stock_id) {
             item = gtk_image_menu_item_new_with_mnemonic(data->item_translated);
             image = gtk_image_new_from_stock(data->stock_id,
                                              GTK_ICON_SIZE_MENU);
diff --git a/app/release.h b/app/release.h
new file mode 100644
index 0000000..893dfa7
--- /dev/null
+++ b/app/release.h
@@ -0,0 +1,3 @@
+/* This is a GENERATED file. */
+/*< private_header >*/
+#define RELEASEDATE 0x20170815u
diff --git a/app/remote-win32.c b/app/remote-win32.c
index 328ccf4..6c36003 100644
--- a/app/remote-win32.c
+++ b/app/remote-win32.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: remote-win32.c 19272 2016-11-16 16:46:46Z yeti-dn $
+ *  @(#) $Id: remote-win32.c 19429 2017-01-18 12:30:07Z yeti-dn $
  *  Copyright (C) 2007 David Necas (Yeti), Jan Horak.
  *  E-mail: yeti at gwyddion.net, xhorak at gmail.com.
  *
@@ -27,6 +27,7 @@
 #include <string.h>
 #include <gtk/gtk.h>
 #include <gdk/gdkwin32.h>
+#include <windows.h>
 #include <shlobj.h>
 
 struct _GwyRemote {
@@ -164,7 +165,7 @@ void
 gwy_remote_print(GwyRemote *remote)
 {
     if (remote)
-        g_print("%08x\n", (guint32)remote->winid);
+        g_print("%08x\n", (guint32)(UINT_PTR)remote->winid);
 }
 #endif
 
diff --git a/app/splash.c b/app/splash.c
index 596e24d..0a6bba9 100644
--- a/app/splash.c
+++ b/app/splash.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: splash.c 17711 2015-11-05 10:26:08Z pecold $
- *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: splash.c 19386 2016-12-28 08:51:32Z yeti-dn $
+ *  Copyright (C) 2004-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -19,11 +19,8 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-/* XXX: Temporary */
-#include <errno.h>
-#define GDK_PIXBUF_ENABLE_BACKEND 1
-
 #include "config.h"
+#include <string.h>
 #include <stdlib.h>
 #include <gtk/gtk.h>
 #include <libgwyddion/gwymacros.h>
@@ -31,6 +28,12 @@
 #include <libgwyddion/gwyversion.h>
 #include <libgwyddion/gwycontainer.h>
 
+typedef struct {
+    gchar c;
+    gsize len;
+    const guchar *data;
+} SplashDigit;
+
 static void splash_map(void);
 
 static gboolean in_splash = FALSE;
@@ -541,14 +544,563 @@ static const guchar digit_dot_png[] = {
   0x00, 0x00, 0xd8, 0x12, 0x05, 0x19, 0x3a, 0x02, 0xff, 0xdf, 0x00, 0x00,
   0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
 };
+unsigned char development_snapshot_png[] = {
+  0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+  0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x18,
+  0x08, 0x06, 0x00, 0x00, 0x00, 0x91, 0x23, 0x93, 0x23, 0x00, 0x00, 0x09,
+  0x9e, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0x5c, 0x07, 0x90, 0x15,
+  0x35, 0x18, 0x0e, 0x1d, 0xe9, 0x5d, 0x40, 0xc1, 0x82, 0x20, 0x4d, 0x04,
+  0x81, 0xa3, 0x88, 0x08, 0xa8, 0xf4, 0x66, 0xa3, 0x08, 0x23, 0x0a, 0x07,
+  0x08, 0x83, 0x74, 0x38, 0x74, 0x28, 0x3a, 0xa0, 0xd2, 0x95, 0x5e, 0xa4,
+  0x37, 0x95, 0xa2, 0x80, 0x80, 0xa8, 0x28, 0x8c, 0x20, 0x88, 0x85, 0xa2,
+  0x20, 0x1d, 0x94, 0xde, 0x8b, 0xdc, 0x71, 0xb4, 0x23, 0xe6, 0xdb, 0x64,
+  0xdf, 0xe6, 0xed, 0xcb, 0xbe, 0xb7, 0xd9, 0x7b, 0xcf, 0x91, 0x99, 0xcd,
+  0xcc, 0x3f, 0xdc, 0x25, 0xd9, 0x3f, 0x7f, 0xfe, 0x96, 0xff, 0xff, 0x93,
+  0x83, 0x10, 0xbf, 0xf9, 0xcd, 0x6f, 0x7e, 0xd3, 0x68, 0x54, 0x01, 0x7e,
+  0xf3, 0xdb, 0xff, 0x5a, 0x5f, 0x68, 0x18, 0xb8, 0xc9, 0xe0, 0x34, 0x83,
+  0x0d, 0x0c, 0x06, 0x31, 0x28, 0xf0, 0x7f, 0x63, 0x20, 0xfd, 0xc6, 0x02,
+  0xdf, 0xe0, 0xfc, 0x76, 0x37, 0xe8, 0x4b, 0x10, 0x11, 0x26, 0xdc, 0x58,
+  0x4d, 0xe8, 0xa9, 0x4f, 0x09, 0x5d, 0x3f, 0x8a, 0xd0, 0x81, 0xaf, 0x10,
+  0x9a, 0x3f, 0xa7, 0x41, 0xdc, 0x35, 0x06, 0xf1, 0x3e, 0x03, 0xef, 0x9a,
+  0x96, 0x8d, 0x41, 0x59, 0x06, 0x8d, 0x25, 0xf0, 0x0d, 0x2e, 0x76, 0xfa,
+  0xe2, 0x8a, 0xdf, 0x4a, 0x83, 0xb3, 0x43, 0xd2, 0x4a, 0x42, 0x3b, 0xd4,
+  0x0f, 0x10, 0xd9, 0xd1, 0x37, 0xb8, 0xbb, 0x43, 0xc1, 0xb2, 0x66, 0x26,
+  0xb4, 0xcc, 0x03, 0x84, 0x36, 0x8a, 0xf3, 0xf9, 0xf3, 0x1f, 0xe8, 0x8b,
+  0x2b, 0x7e, 0x87, 0x10, 0x91, 0x86, 0xf0, 0x13, 0xad, 0x69, 0x35, 0x7e,
+  0xc2, 0xc9, 0xe3, 0xf1, 0x0d, 0x8c, 0x39, 0xc9, 0x0c, 0x0a, 0xfa, 0x06,
+  0xe7, 0x87, 0x50, 0x3e, 0x3f, 0xf4, 0xf1, 0xab, 0x26, 0x21, 0x57, 0x6b,
+  0x26, 0x72, 0x37, 0x3a, 0xaa, 0xa3, 0x35, 0x7e, 0xed, 0x4b, 0x42, 0xef,
+  0xcd, 0x6d, 0xcc, 0x79, 0x47, 0x7c, 0x5f, 0x9b, 0xc1, 0x1a, 0x06, 0x17,
+  0x84, 0x21, 0x9a, 0xb0, 0x87, 0xc1, 0xdb, 0x0c, 0x3e, 0x54, 0xe4, 0x86,
+  0xbf, 0xda, 0x68, 0x98, 0x64, 0x1b, 0xdf, 0xec, 0x02, 0x6f, 0xfa, 0x08,
+  0x1b, 0x2c, 0xcc, 0x60, 0x14, 0x83, 0xdd, 0x0c, 0x92, 0x6c, 0xb0, 0x5b,
+  0x8c, 0x15, 0x0a, 0x93, 0xc7, 0xae, 0x67, 0x90, 0x28, 0xc1, 0x19, 0x06,
+  0xe3, 0x45, 0xd8, 0xa0, 0x9a, 0x7f, 0x84, 0xc1, 0x55, 0x09, 0x40, 0xfb,
+  0x6b, 0x0c, 0x7e, 0xb1, 0xe1, 0x39, 0x26, 0xf0, 0x64, 0x91, 0x68, 0x75,
+  0xb3, 0x57, 0x27, 0x3a, 0xbf, 0x65, 0x70, 0x45, 0x82, 0x53, 0x0c, 0xa6,
+  0x99, 0xe3, 0x0a, 0xfe, 0x38, 0x29, 0x42, 0x2d, 0x06, 0x4b, 0x19, 0x1c,
+  0x65, 0x70, 0x83, 0x41, 0x8a, 0x04, 0xc9, 0x82, 0xb6, 0x23, 0x1e, 0xe8,
+  0x00, 0xbf, 0x46, 0x33, 0xd8, 0xc4, 0xe0, 0x24, 0x83, 0xeb, 0x12, 0x20,
+  0x45, 0xd9, 0xc6, 0xa0, 0x0b, 0x83, 0x34, 0x1e, 0x65, 0xa1, 0x45, 0xb7,
+  0x82, 0x1f, 0xe1, 0xe8, 0xd6, 0xd1, 0x23, 0xd7, 0xfc, 0x0e, 0xa7, 0xb4,
+  0x60, 0xc2, 0x68, 0x9c, 0x78, 0x5b, 0xc6, 0x59, 0x73, 0x86, 0xb4, 0x35,
+  0xe6, 0x6c, 0x64, 0xd0, 0x9d, 0xc1, 0x9d, 0x5a, 0xe5, 0x08, 0x5d, 0x3d,
+  0x8c, 0xd0, 0xf3, 0x4b, 0xb9, 0x41, 0xfe, 0x39, 0x83, 0xd0, 0xb7, 0x5a,
+  0x11, 0x9a, 0x2e, 0xad, 0x31, 0x6f, 0xc9, 0xd8, 0xce, 0xd6, 0xb7, 0xbf,
+  0x4c, 0x0c, 0xac, 0x51, 0x42, 0xac, 0x01, 0x65, 0x3a, 0x37, 0xb1, 0x1b,
+  0x1f, 0xff, 0xf1, 0xc3, 0x80, 0xc1, 0x45, 0xc4, 0x1b, 0x86, 0x76, 0x08,
+  0xe1, 0x62, 0xa1, 0x3c, 0x84, 0x8e, 0x8c, 0x27, 0x74, 0xd7, 0x74, 0x42,
+  0x13, 0x57, 0x72, 0xc0, 0xcf, 0xe8, 0x2b, 0xc8, 0x9d, 0x06, 0x84, 0x51,
+  0x53, 0x85, 0xe7, 0xd9, 0x0a, 0x84, 0x7e, 0x3f, 0x92, 0xd0, 0xab, 0x2b,
+  0x08, 0x3d, 0xfd, 0x19, 0xa1, 0xe3, 0xba, 0xf0, 0x70, 0x81, 0x8d, 0xad,
+  0xb3, 0xcf, 0x07, 0x7f, 0xfa, 0xb7, 0x20, 0xf4, 0xf0, 0x3c, 0x42, 0xff,
+  0x59, 0xce, 0x69, 0x2e, 0x92, 0x9f, 0xe3, 0x69, 0xf7, 0x1c, 0xa1, 0x3f,
+  0x4f, 0xe0, 0x78, 0x8e, 0x2e, 0xe4, 0x78, 0xee, 0xc9, 0x68, 0x8c, 0x8d,
+  0x10, 0xb4, 0x76, 0x77, 0xb9, 0x57, 0xa5, 0xac, 0xea, 0x94, 0x27, 0xf4,
+  0x9b, 0x0f, 0x08, 0xbd, 0xfc, 0x05, 0xa1, 0x27, 0x3f, 0x21, 0x74, 0x6a,
+  0x8f, 0x00, 0x9d, 0x8e, 0xe9, 0x81, 0xc2, 0xe0, 0xda, 0x82, 0x86, 0xa7,
+  0x19, 0x0d, 0x4b, 0x06, 0x12, 0xfa, 0xf7, 0x02, 0x42, 0xaf, 0xb3, 0x1c,
+  0xfe, 0xf6, 0x5a, 0x4e, 0x0b, 0x68, 0xc2, 0xde, 0xa4, 0xef, 0x74, 0xe8,
+  0x18, 0x63, 0x3a, 0xed, 0x8d, 0x63, 0x09, 0x3d, 0xc1, 0xc6, 0x92, 0x57,
+  0xf1, 0x14, 0xe5, 0xb7, 0x49, 0x84, 0xbe, 0xd1, 0x38, 0x80, 0x37, 0xc1,
+  0x09, 0x77, 0x04, 0x59, 0xc4, 0x92, 0x6e, 0x1d, 0x3d, 0x72, 0xcd, 0xef,
+  0x48, 0xc2, 0x48, 0xcb, 0xe0, 0xa7, 0x56, 0xb5, 0xac, 0x39, 0x3f, 0x8c,
+  0x31, 0xe6, 0xc0, 0xcb, 0xdc, 0x7e, 0xb3, 0x19, 0xa1, 0x29, 0x6b, 0xd5,
+  0x0b, 0x2d, 0x1e, 0xc8, 0xf1, 0x55, 0x2a, 0x11, 0xdc, 0x5f, 0xfc, 0xbe,
+  0xa0, 0x13, 0xb2, 0x11, 0x94, 0xea, 0xec, 0x62, 0x3e, 0xd6, 0xb5, 0x89,
+  0x31, 0xe6, 0x0a, 0xaf, 0x03, 0xed, 0xf0, 0x48, 0x17, 0x21, 0x84, 0x0b,
+  0xcb, 0x9c, 0x99, 0x00, 0x61, 0x3c, 0x55, 0x56, 0xcd, 0x2c, 0x14, 0x89,
+  0x54, 0xdf, 0x7c, 0x3b, 0x5c, 0xbd, 0xee, 0xf4, 0x9e, 0xa1, 0x73, 0x37,
+  0x8c, 0x26, 0x74, 0x4c, 0x67, 0x35, 0x9e, 0xe1, 0x1d, 0x0c, 0x1c, 0x87,
+  0x18, 0x54, 0xd0, 0xd8, 0xeb, 0x73, 0x6e, 0xe9, 0x1c, 0xdd, 0x49, 0xdb,
+  0xe0, 0x0e, 0xb4, 0xa9, 0xe3, 0x4c, 0x83, 0xe2, 0x3b, 0x1d, 0x3a, 0x0e,
+  0x47, 0xaa, 0x13, 0xc0, 0x59, 0xb1, 0x39, 0x7f, 0xe9, 0xe0, 0x36, 0x65,
+  0x11, 0x63, 0xba, 0x75, 0xf4, 0x28, 0x6a, 0x06, 0x87, 0xd6, 0xfa, 0xfe,
+  0x7c, 0xd6, 0x1c, 0x78, 0x19, 0x5c, 0x19, 0x94, 0x2f, 0x46, 0xe8, 0xad,
+  0xaf, 0x78, 0x1f, 0x3c, 0x49, 0xe9, 0xa2, 0x84, 0xc2, 0x1b, 0xe0, 0x94,
+  0x32, 0xe7, 0xc2, 0x3b, 0x01, 0xe7, 0xbe, 0x59, 0x21, 0x27, 0xe4, 0x3e,
+  0x81, 0x7b, 0x51, 0xc3, 0x38, 0xde, 0x7f, 0x73, 0x0d, 0xa1, 0xf9, 0x72,
+  0x10, 0xaa, 0x83, 0x57, 0x41, 0xfb, 0x18, 0xcc, 0x35, 0x99, 0x04, 0x61,
+  0xf4, 0x7b, 0x99, 0xd0, 0x5c, 0x59, 0x39, 0xe0, 0xd4, 0x30, 0x05, 0x04,
+  0x66, 0x09, 0x0f, 0xe5, 0xaa, 0x70, 0x04, 0x68, 0x5d, 0x5b, 0x6f, 0xbe,
+  0x0a, 0x0e, 0xce, 0x31, 0x70, 0xdc, 0x62, 0x30, 0x57, 0x63, 0xaf, 0xd3,
+  0xdd, 0xae, 0x7b, 0x68, 0x6e, 0x58, 0x87, 0xa4, 0x92, 0x71, 0xf2, 0xfe,
+  0xd9, 0xd6, 0x3c, 0x38, 0x80, 0xdc, 0xd9, 0x08, 0x4d, 0x9b, 0x86, 0xff,
+  0x8b, 0x22, 0x40, 0x93, 0xaa, 0xce, 0x8a, 0x1b, 0x81, 0x0e, 0xec, 0x93,
+  0xce, 0xe8, 0x4d, 0x68, 0xbd, 0x4a, 0x7c, 0x6f, 0x38, 0xe1, 0xfb, 0xbc,
+  0x64, 0xcd, 0x3b, 0xc2, 0x4f, 0xa1, 0x14, 0x1d, 0xdc, 0xa6, 0x2c, 0x62,
+  0x49, 0x77, 0x6a, 0xf5, 0xc8, 0x4b, 0x48, 0x69, 0xb6, 0x22, 0x19, 0xd2,
+  0x05, 0x5f, 0x19, 0xc0, 0xe0, 0xe6, 0xf4, 0xb5, 0xfa, 0x5e, 0x7d, 0x36,
+  0x90, 0xc7, 0x6c, 0x6e, 0x5c, 0xc5, 0xea, 0x9f, 0xd6, 0xc3, 0xe8, 0xdf,
+  0x0f, 0x23, 0x33, 0xfb, 0xf6, 0xce, 0x0c, 0xac, 0x53, 0x09, 0xb1, 0xf0,
+  0xc2, 0x01, 0xbc, 0x7f, 0xd5, 0x50, 0xbe, 0x51, 0x0d, 0xbc, 0x2a, 0xda,
+  0xf7, 0xc0, 0x43, 0x99, 0x7d, 0x1f, 0xf7, 0x32, 0xfa, 0xee, 0x30, 0xe8,
+  0x2f, 0xf2, 0xa1, 0x3b, 0xb3, 0xfa, 0x58, 0xe3, 0x08, 0x0b, 0xec, 0x78,
+  0x10, 0xea, 0x34, 0xa8, 0xcc, 0x15, 0xa3, 0x64, 0x11, 0x42, 0x77, 0x4c,
+  0xb1, 0xc6, 0xd6, 0x0c, 0x0b, 0x9d, 0x8f, 0x53, 0x08, 0x0e, 0xa9, 0xec,
+  0x83, 0xc1, 0xfd, 0x08, 0xa1, 0xe0, 0xfd, 0x32, 0x65, 0x20, 0xb4, 0x46,
+  0x19, 0xab, 0x1f, 0x8e, 0xc5, 0xcc, 0xfb, 0x34, 0xf6, 0xba, 0xcd, 0xbe,
+  0xee, 0xb6, 0xc9, 0x84, 0xc2, 0x59, 0x65, 0x66, 0x74, 0xd6, 0x7c, 0x4c,
+  0x89, 0xdf, 0x6d, 0x91, 0x20, 0x19, 0x21, 0x98, 0x39, 0xaf, 0x4a, 0xc9,
+  0xc0, 0x1d, 0xec, 0x3c, 0x06, 0xcf, 0x30, 0x68, 0x2a, 0x01, 0xf1, 0x40,
+  0xc7, 0x4c, 0x09, 0x1a, 0x32, 0xe8, 0x9b, 0x31, 0xbd, 0x35, 0x0f, 0x21,
+  0xa0, 0x93, 0x51, 0x44, 0x92, 0x45, 0x6a, 0xe8, 0x06, 0xae, 0x46, 0x82,
+  0x6e, 0x9c, 0x64, 0x76, 0xba, 0x53, 0xab, 0x47, 0x3a, 0x45, 0x13, 0x7b,
+  0x2b, 0x83, 0xb8, 0xd6, 0x9c, 0x83, 0x78, 0x17, 0x1b, 0x83, 0x47, 0x36,
+  0xfb, 0xcc, 0x9c, 0x05, 0x50, 0xaa, 0x68, 0x30, 0xc3, 0x58, 0xdf, 0x79,
+  0x84, 0x91, 0xf2, 0x3a, 0x15, 0x8b, 0x1b, 0xfd, 0x63, 0x81, 0x17, 0x31,
+  0xb1, 0x74, 0x7a, 0xdc, 0xd0, 0xc0, 0xab, 0xa2, 0xfd, 0x1a, 0xf2, 0x1f,
+  0xdb, 0x3a, 0x33, 0xa4, 0xbd, 0xcc, 0x96, 0x43, 0x5c, 0xc4, 0xe2, 0x76,
+  0x3c, 0x70, 0x2e, 0x42, 0xc1, 0xa1, 0x1c, 0x3b, 0xeb, 0x56, 0x0c, 0x39,
+  0xdd, 0x83, 0xe6, 0xc3, 0xa3, 0xaa, 0x72, 0x4a, 0x91, 0x7f, 0x6d, 0x72,
+  0xca, 0x13, 0x35, 0xf7, 0x7a, 0xde, 0x8e, 0x23, 0x3d, 0xa7, 0x73, 0x3b,
+  0xc2, 0x72, 0x27, 0xef, 0xea, 0xd6, 0xe0, 0x36, 0x7f, 0x14, 0xec, 0x50,
+  0xe7, 0xf6, 0xe3, 0xf9, 0x4d, 0x1a, 0xfe, 0xcd, 0x31, 0xf1, 0xf0, 0x21,
+  0x97, 0x4a, 0x67, 0x5c, 0xd0, 0xd1, 0x83, 0xc1, 0x59, 0xf0, 0x09, 0x4e,
+  0x09, 0x06, 0xf4, 0x42, 0x0d, 0x77, 0x61, 0x5f, 0x24, 0x59, 0xa4, 0x86,
+  0x6e, 0x81, 0x7b, 0xa7, 0xb8, 0x2f, 0x0b, 0xa1, 0x27, 0xb5, 0x7a, 0x94,
+  0x1a, 0x83, 0xeb, 0x59, 0x5a, 0x52, 0x00, 0x84, 0x87, 0x50, 0x16, 0x24,
+  0xa8, 0x91, 0x8e, 0xe7, 0x73, 0x4b, 0x02, 0x5e, 0xc7, 0x28, 0x1e, 0x98,
+  0xfd, 0xc8, 0x6f, 0x58, 0xdf, 0x09, 0xc4, 0xe0, 0xf8, 0x1d, 0x09, 0x71,
+  0x96, 0x4c, 0xda, 0x78, 0x95, 0x06, 0x97, 0xb4, 0xd2, 0xea, 0xcb, 0x91,
+  0x25, 0x70, 0x92, 0x9a, 0xad, 0x32, 0xfa, 0xcc, 0x71, 0x18, 0xbb, 0x03,
+  0x9e, 0x8c, 0x62, 0x7e, 0xbd, 0xbc, 0x39, 0x42, 0xbd, 0x9f, 0x62, 0x7e,
+  0x3a, 0x87, 0xfe, 0xf4, 0xa2, 0xf8, 0xa4, 0x34, 0x38, 0x5d, 0x1e, 0x2a,
+  0x70, 0x64, 0x08, 0x83, 0xdf, 0xad, 0xc1, 0x6d, 0x81, 0x81, 0x43, 0x69,
+  0xec, 0x6b, 0xa3, 0xd0, 0x83, 0x5c, 0x27, 0x67, 0x56, 0xe3, 0xdb, 0x73,
+  0x0c, 0x2a, 0x7a, 0xa1, 0xa3, 0x7b, 0x73, 0x42, 0xcf, 0x2c, 0xd6, 0xcf,
+  0xb3, 0x22, 0xc9, 0x22, 0x0a, 0x74, 0x67, 0x74, 0xa2, 0x3b, 0x4a, 0x7a,
+  0xa4, 0x6d, 0x70, 0xd9, 0x11, 0xe6, 0xf4, 0x78, 0xde, 0x9a, 0x03, 0x2f,
+  0x02, 0x65, 0x81, 0x91, 0x44, 0x52, 0x16, 0x33, 0xfc, 0x44, 0x79, 0xbc,
+  0xa7, 0x84, 0xe3, 0xf8, 0x22, 0xee, 0x85, 0x10, 0x16, 0xe0, 0xf7, 0xf9,
+  0x09, 0xc6, 0xbc, 0x44, 0x4d, 0xbc, 0x4a, 0x83, 0x4b, 0x0c, 0x65, 0x54,
+  0x65, 0x69, 0x3f, 0x71, 0x88, 0xef, 0x35, 0x18, 0x55, 0x0c, 0x21, 0xa1,
+  0xed, 0x74, 0xd7, 0x51, 0x96, 0x70, 0x7c, 0xd6, 0xe5, 0xa1, 0x2e, 0x7e,
+  0xb7, 0x06, 0x57, 0x1a, 0x25, 0x6e, 0x9c, 0x40, 0x38, 0x79, 0xd6, 0xbe,
+  0xcf, 0xc3, 0x3c, 0xf9, 0x5b, 0x14, 0xb5, 0x9e, 0x78, 0xc4, 0xf8, 0xfe,
+  0x67, 0x5d, 0x3a, 0xba, 0x35, 0x0b, 0xe6, 0xf7, 0x82, 0x04, 0x5e, 0x38,
+  0xf2, 0xc0, 0x43, 0x95, 0x2c, 0x6e, 0xc5, 0x8a, 0xee, 0x28, 0xeb, 0x91,
+  0x2b, 0x83, 0xcb, 0xcf, 0xe0, 0xbb, 0x6c, 0x99, 0x79, 0x42, 0x6f, 0xce,
+  0x69, 0x5e, 0x9d, 0x1b, 0x87, 0x1c, 0x4f, 0x3f, 0xf6, 0x50, 0xc4, 0x37,
+  0x99, 0xbd, 0x90, 0x58, 0xca, 0x0c, 0x69, 0x51, 0x93, 0x7b, 0x29, 0xfc,
+  0x5c, 0xbf, 0x92, 0x31, 0x6f, 0x81, 0x26, 0x5e, 0x15, 0xed, 0x49, 0xb2,
+  0xc7, 0xc3, 0xb1, 0xcf, 0xfa, 0x66, 0x49, 0x7b, 0x9a, 0x57, 0x59, 0x2f,
+  0x14, 0x48, 0x78, 0xb8, 0x90, 0x35, 0xb6, 0x7d, 0x4a, 0x54, 0x0d, 0x4e,
+  0x97, 0x87, 0xd1, 0x30, 0xb8, 0x4c, 0x0e, 0x46, 0x87, 0x13, 0xfa, 0x45,
+  0x06, 0x5f, 0xa3, 0x80, 0x51, 0x38, 0x2f, 0x3f, 0x21, 0xe4, 0x0a, 0xdd,
+  0xd6, 0xf1, 0x81, 0xe7, 0x7d, 0x5a, 0x74, 0x20, 0x67, 0x37, 0x7f, 0x47,
+  0xb8, 0x27, 0xee, 0xb0, 0xbc, 0xf0, 0x50, 0x25, 0x8b, 0x2b, 0xb1, 0xa2,
+  0x3b, 0x4a, 0x7a, 0x94, 0xc9, 0x8d, 0xc1, 0x75, 0x12, 0xc8, 0x13, 0x51,
+  0x35, 0x5c, 0x37, 0xc2, 0x1a, 0xdf, 0x39, 0x35, 0x10, 0x1f, 0xef, 0x1c,
+  0xf6, 0x5a, 0x48, 0x88, 0x88, 0xa4, 0x72, 0x24, 0x3c, 0x91, 0x28, 0x79,
+  0x77, 0x94, 0x00, 0x97, 0x83, 0x29, 0x28, 0xe7, 0xca, 0x25, 0x55, 0xfc,
+  0x8b, 0x50, 0x43, 0xe4, 0x3b, 0x0d, 0x34, 0xf1, 0xaa, 0x68, 0xdf, 0x3d,
+  0x22, 0xde, 0xea, 0x9b, 0xd9, 0x3b, 0xf0, 0x3d, 0xee, 0x79, 0x06, 0xe3,
+  0x67, 0x9c, 0xd0, 0x2e, 0x92, 0x5d, 0x38, 0x9b, 0x0e, 0xe0, 0x01, 0xca,
+  0xd6, 0xe6, 0xd8, 0x88, 0xf8, 0xa8, 0x1a, 0x9c, 0x2e, 0x0f, 0xb5, 0x0d,
+  0x4e, 0x0e, 0x59, 0x51, 0xa8, 0x10, 0xc5, 0x84, 0x74, 0x36, 0x1d, 0x98,
+  0x2f, 0x41, 0x17, 0x11, 0x7e, 0x21, 0xf7, 0xb9, 0x88, 0x42, 0x85, 0xfc,
+  0xbc, 0xcf, 0x8b, 0xe2, 0xca, 0x34, 0x88, 0x3b, 0xc8, 0xc1, 0x0e, 0x38,
+  0x2a, 0x78, 0x90, 0xc5, 0x8e, 0x58, 0xd1, 0xed, 0x45, 0x8f, 0xdc, 0xf0,
+  0x3b, 0x68, 0x21, 0x54, 0x6d, 0x70, 0x82, 0x75, 0x6c, 0xc0, 0x17, 0x91,
+  0x43, 0x1e, 0x1c, 0xe1, 0xd8, 0x08, 0xfb, 0xe6, 0x77, 0x06, 0xef, 0xc1,
+  0x18, 0x91, 0xb8, 0x9a, 0x65, 0x53, 0x10, 0x08, 0x0f, 0x84, 0x24, 0x1a,
+  0xa5, 0x53, 0x94, 0xbc, 0xc5, 0x53, 0x30, 0x73, 0x63, 0xeb, 0x5e, 0xaf,
+  0x1b, 0x1a, 0x32, 0x8d, 0xef, 0x6a, 0x8c, 0x9f, 0x15, 0xf9, 0x8e, 0x16,
+  0x5e, 0x05, 0x03, 0x47, 0x16, 0xc8, 0x45, 0xe8, 0x45, 0xa9, 0x9c, 0x0b,
+  0x21, 0x21, 0x96, 0xc7, 0x0b, 0x99, 0x41, 0x6d, 0xdc, 0x97, 0x73, 0x41,
+  0x47, 0xfb, 0x7a, 0x16, 0x0f, 0x70, 0xa9, 0x6d, 0x16, 0x36, 0xa2, 0x64,
+  0x70, 0xba, 0x3c, 0xd4, 0x0e, 0x59, 0x0f, 0xcc, 0x0e, 0x3e, 0x5d, 0x44,
+  0x81, 0xc7, 0x1e, 0xea, 0xd0, 0x79, 0xfd, 0xf9, 0x25, 0x34, 0xc2, 0x2f,
+  0xf0, 0x0f, 0xeb, 0xe3, 0xdf, 0x01, 0x2d, 0xad, 0xef, 0x51, 0xa0, 0xf0,
+  0xa2, 0xb8, 0x72, 0xe9, 0x1e, 0x69, 0x05, 0x72, 0x75, 0xc8, 0x41, 0x9e,
+  0x87, 0x7d, 0x86, 0xbb, 0xca, 0x70, 0x92, 0x45, 0x2c, 0xe9, 0xf6, 0xa0,
+  0x47, 0xae, 0xf8, 0xed, 0xea, 0x6e, 0x62, 0xcf, 0x4c, 0x7e, 0xaf, 0x21,
+  0x8e, 0xf0, 0x52, 0xc2, 0xeb, 0x9c, 0x89, 0x7b, 0xd4, 0x52, 0x18, 0x17,
+  0x09, 0x71, 0x7b, 0xc4, 0xc2, 0x78, 0x69, 0x20, 0x8f, 0x8b, 0x72, 0xee,
+  0x04, 0x29, 0x8c, 0x75, 0x8d, 0x57, 0xb1, 0xce, 0xbd, 0x0c, 0x2e, 0x55,
+  0x2f, 0xed, 0xfd, 0xe2, 0xfb, 0xca, 0x72, 0xeb, 0x6e, 0xcc, 0x04, 0xd0,
+  0xdc, 0xac, 0x9a, 0x31, 0xff, 0x6a, 0x14, 0x0d, 0x4e, 0x97, 0x87, 0xba,
+  0xf8, 0x0f, 0xbe, 0xff, 0xba, 0xab, 0x8b, 0xef, 0x88, 0xf2, 0x07, 0x7d,
+  0xe5, 0x78, 0xc8, 0xbb, 0x45, 0x97, 0x0e, 0xf9, 0xce, 0x4d, 0xce, 0x79,
+  0xec, 0xf2, 0x69, 0x18, 0x17, 0xba, 0xc7, 0x08, 0xb2, 0x88, 0x29, 0xdd,
+  0x1e, 0xf4, 0xc8, 0x15, 0xbf, 0x95, 0x88, 0xc0, 0x10, 0x5c, 0x48, 0xe2,
+  0xc9, 0xcc, 0x2b, 0xb5, 0x03, 0x96, 0xba, 0x57, 0xfc, 0xf9, 0x81, 0xd9,
+  0xaa, 0x40, 0x61, 0xe0, 0x7d, 0x86, 0xb6, 0xe3, 0x31, 0x35, 0x3c, 0x0f,
+  0xf2, 0x32, 0x78, 0x06, 0x94, 0x55, 0x57, 0xbc, 0x1b, 0xb4, 0x60, 0x4e,
+  0xbc, 0xa1, 0x5b, 0x3a, 0xc8, 0x5a, 0x07, 0x1e, 0x41, 0x8c, 0x57, 0xf5,
+  0x82, 0xd7, 0x61, 0x63, 0x4f, 0x9a, 0x4f, 0x72, 0x70, 0x97, 0x02, 0x67,
+  0x01, 0x21, 0x61, 0x4f, 0x7f, 0x4c, 0xe7, 0xa7, 0x48, 0xb8, 0xa7, 0x5d,
+  0x72, 0x15, 0xec, 0xd8, 0x42, 0x5e, 0x24, 0x42, 0x95, 0x56, 0xbc, 0xff,
+  0x6b, 0x1e, 0x45, 0x83, 0xd3, 0xe5, 0xa1, 0x2e, 0xfe, 0x0f, 0x10, 0xc2,
+  0x4d, 0xea, 0xc6, 0x9f, 0x2d, 0x29, 0xee, 0xbc, 0x02, 0xdf, 0x42, 0x26,
+  0xb8, 0x7e, 0x80, 0x82, 0x22, 0x04, 0xc3, 0xbc, 0x4b, 0x9f, 0x13, 0xfa,
+  0x13, 0xcb, 0x7f, 0x06, 0xb7, 0x25, 0x34, 0x4f, 0xf6, 0xc0, 0xeb, 0xa2,
+  0xc7, 0x75, 0xe9, 0x40, 0x0a, 0x92, 0xd0, 0x92, 0xd7, 0x01, 0x70, 0x6f,
+  0x86, 0x07, 0xf1, 0x28, 0xb3, 0x43, 0x51, 0x91, 0xa2, 0x60, 0xaf, 0x58,
+  0x0f, 0x15, 0x6b, 0x4d, 0x59, 0xc4, 0x94, 0x6e, 0x0f, 0x7a, 0xe4, 0x8a,
+  0xdf, 0xe1, 0x12, 0xf5, 0x24, 0xf1, 0xe4, 0x06, 0x8f, 0x43, 0xdb, 0x28,
+  0x62, 0x7f, 0xf3, 0x44, 0x1a, 0x26, 0x62, 0xe9, 0xab, 0xe2, 0x65, 0x81,
+  0x09, 0x97, 0xc4, 0x03, 0xdc, 0x95, 0xd2, 0xfc, 0x65, 0x8a, 0x75, 0x0e,
+  0x7a, 0xc4, 0x1b, 0xee, 0x2f, 0x78, 0x0b, 0x8b, 0xf7, 0x70, 0x7b, 0x6d,
+  0x0f, 0x66, 0xb1, 0xa7, 0x5d, 0x22, 0x4f, 0x2a, 0x14, 0x2e, 0xff, 0x11,
+  0x80, 0xf5, 0x8e, 0x8b, 0xcb, 0xd4, 0x32, 0x61, 0x78, 0x46, 0x22, 0xd0,
+  0x13, 0x6e, 0xcc, 0x2d, 0x0f, 0x75, 0xf1, 0xe3, 0x81, 0xf4, 0x64, 0xf1,
+  0x20, 0x57, 0xee, 0x4f, 0xb1, 0xf1, 0x7a, 0x99, 0xb8, 0xeb, 0x3a, 0x23,
+  0x42, 0x2f, 0xf9, 0x01, 0xf0, 0x65, 0x06, 0x5b, 0x19, 0x0c, 0x61, 0x90,
+  0xd7, 0xe3, 0x3e, 0x07, 0x88, 0x0b, 0x7d, 0xf9, 0x61, 0xf6, 0x06, 0x91,
+  0x9a, 0xdc, 0xb2, 0xad, 0xa7, 0x23, 0x8b, 0x58, 0xd3, 0xad, 0xab, 0x47,
+  0x6e, 0xf9, 0xed, 0xff, 0x19, 0x8b, 0xff, 0x67, 0x2c, 0xbe, 0x2c, 0xfc,
+  0xe6, 0x0b, 0xd9, 0x97, 0x85, 0x2f, 0x0b, 0x5f, 0xc8, 0x7e, 0xf3, 0x65,
+  0xe1, 0xb7, 0x54, 0x0a, 0x99, 0xf8, 0xff, 0xfb, 0x97, 0x2f, 0x8b, 0x18,
+  0xb7, 0x7f, 0x01, 0x6c, 0xbb, 0xd7, 0x06, 0xa1, 0x47, 0x14, 0xbf, 0x00,
+  0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+unsigned char devdigit_0_png[] = {
+  0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+  0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x14,
+  0x08, 0x06, 0x00, 0x00, 0x00, 0xb9, 0xf0, 0xdc, 0x11, 0x00, 0x00, 0x01,
+  0x6a, 0x49, 0x44, 0x41, 0x54, 0x28, 0xcf, 0xbd, 0x93, 0x4b, 0x2f, 0x03,
+  0x51, 0x14, 0xc7, 0x2f, 0x15, 0xf1, 0xe8, 0x86, 0x44, 0x04, 0x51, 0xa5,
+  0x0f, 0x89, 0x0a, 0x61, 0x27, 0x21, 0x51, 0xaf, 0x25, 0x1f, 0x81, 0xd8,
+  0xe1, 0x2b, 0xb0, 0x10, 0x23, 0x6c, 0x24, 0xda, 0xfa, 0x14, 0xed, 0x4c,
+  0x82, 0xe8, 0xc6, 0x92, 0x44, 0xc7, 0x47, 0xd1, 0x69, 0x47, 0xc2, 0xc2,
+  0x8c, 0xcd, 0x75, 0xfe, 0x77, 0x66, 0x9c, 0x76, 0x4a, 0x62, 0xe5, 0x24,
+  0xbf, 0xa4, 0xf9, 0x3f, 0x26, 0x77, 0xe6, 0x9e, 0x0a, 0xf1, 0x9f, 0x93,
+  0x24, 0x0c, 0xe2, 0x35, 0x84, 0xe1, 0x7b, 0x4d, 0x93, 0x22, 0xec, 0xc4,
+  0x90, 0x90, 0xfa, 0x91, 0x90, 0xb6, 0xe1, 0x81, 0xdf, 0xd0, 0xe0, 0xf9,
+  0x99, 0xef, 0xa9, 0x24, 0x87, 0x85, 0xac, 0x53, 0x48, 0xde, 0x37, 0x03,
+  0x0d, 0x1e, 0x32, 0x41, 0x38, 0x4b, 0xc8, 0xa7, 0x4b, 0x2f, 0x50, 0xd3,
+  0x85, 0x9c, 0x8e, 0x0b, 0x99, 0x19, 0x13, 0xb2, 0x5a, 0xf4, 0x34, 0x78,
+  0xc8, 0xf8, 0x59, 0x71, 0xb5, 0x3c, 0xc3, 0x4f, 0xd4, 0x76, 0x94, 0x51,
+  0x27, 0xac, 0x93, 0x6d, 0xd6, 0x91, 0x41, 0x16, 0x85, 0xe7, 0xc2, 0x01,
+  0x1b, 0xab, 0x73, 0xca, 0x38, 0x25, 0xb4, 0xcd, 0x05, 0xd6, 0x91, 0x41,
+  0x16, 0x85, 0x9a, 0x99, 0x67, 0x63, 0x74, 0x40, 0x19, 0x6b, 0xc4, 0x16,
+  0xce, 0x1e, 0xe8, 0xc8, 0x20, 0x8b, 0xc2, 0xa7, 0x55, 0x62, 0xa3, 0xbb,
+  0x53, 0x19, 0x31, 0x7c, 0x95, 0xbe, 0x28, 0xeb, 0xc8, 0x90, 0xe6, 0xaa,
+  0x82, 0x5b, 0x66, 0xa3, 0xcd, 0x7b, 0xb9, 0x1e, 0xa2, 0xbf, 0x23, 0xc2,
+  0xba, 0x53, 0x6e, 0x28, 0x38, 0x3f, 0x17, 0xa2, 0x91, 0x76, 0xd6, 0x3f,
+  0xee, 0xb8, 0xe0, 0x06, 0x9f, 0x2f, 0x74, 0xa4, 0xf1, 0xde, 0x2e, 0xd6,
+  0x5f, 0x8a, 0x4a, 0x77, 0x50, 0xb0, 0x2a, 0xb9, 0x96, 0x97, 0x5e, 0x21,
+  0x36, 0xe2, 0x83, 0xac, 0x23, 0x43, 0x5a, 0x15, 0x05, 0x33, 0xb7, 0xc7,
+  0x46, 0x76, 0x56, 0x19, 0x1a, 0x71, 0xbe, 0x3e, 0xcf, 0x7a, 0x7e, 0x5f,
+  0xe9, 0x26, 0x0a, 0xf9, 0xc5, 0x0c, 0x1b, 0xb8, 0x2c, 0xff, 0xe2, 0xec,
+  0xb3, 0xdd, 0x96, 0x8b, 0x2b, 0xa0, 0xb0, 0x84, 0x6b, 0x7f, 0xb8, 0xe0,
+  0xd5, 0x98, 0x8a, 0x79, 0xeb, 0x11, 0xec, 0x56, 0x78, 0x35, 0x30, 0x8f,
+  0xe9, 0x91, 0xbf, 0x2f, 0x1f, 0x66, 0x12, 0x47, 0x48, 0x51, 0xe9, 0xe6,
+  0x58, 0xc8, 0xb7, 0x6b, 0x6f, 0xbd, 0x4b, 0x87, 0x42, 0x4e, 0xfc, 0xb2,
+  0xde, 0x98, 0x34, 0x71, 0x4b, 0xbc, 0x37, 0x80, 0x3f, 0x90, 0x4e, 0x24,
+  0x82, 0xd0, 0x17, 0x7d, 0xca, 0x43, 0xd6, 0xce, 0xe7, 0x04, 0x20, 0x00,
+  0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+unsigned char devdigit_1_png[] = {
+  0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+  0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x14,
+  0x08, 0x06, 0x00, 0x00, 0x00, 0xb9, 0xf0, 0xdc, 0x11, 0x00, 0x00, 0x00,
+  0x7c, 0x49, 0x44, 0x41, 0x54, 0x28, 0xcf, 0x63, 0x60, 0xa0, 0x02, 0xe0,
+  0x03, 0x62, 0x3f, 0x24, 0x8c, 0x01, 0x58, 0x81, 0xd8, 0x0e, 0x88, 0x9b,
+  0x80, 0xf8, 0x18, 0x10, 0xff, 0xe6, 0xe5, 0x64, 0xf8, 0xef, 0x6b, 0xc1,
+  0xf0, 0x1f, 0xc8, 0xfe, 0x8f, 0x4d, 0xc3, 0x17, 0x16, 0x66, 0x86, 0xff,
+  0xb6, 0x3a, 0x0c, 0xff, 0x1b, 0xe3, 0x18, 0xfe, 0x1f, 0xed, 0x67, 0xf8,
+  0xff, 0x6b, 0x1b, 0xc3, 0xff, 0xff, 0xbb, 0xf0, 0x68, 0xf8, 0xbc, 0x11,
+  0xa2, 0x00, 0x1d, 0xe3, 0xd4, 0xf0, 0x7a, 0x35, 0xc3, 0xff, 0x95, 0xd5,
+  0x0c, 0xff, 0x53, 0x3d, 0x89, 0xd3, 0xf0, 0x06, 0x09, 0x13, 0xa5, 0x81,
+  0x11, 0x09, 0x13, 0xa5, 0x01, 0x19, 0x8c, 0x6a, 0x18, 0x38, 0x0d, 0xff,
+  0x91, 0x31, 0x16, 0x0d, 0xe8, 0x18, 0x7b, 0xc2, 0xc3, 0x97, 0x18, 0x49,
+  0xd7, 0x40, 0x0a, 0x06, 0x00, 0x09, 0xe6, 0xf7, 0x70, 0x7c, 0x8a, 0x96,
+  0x20, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60,
+  0x82
+};
+unsigned char devdigit_2_png[] = {
+  0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+  0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x14,
+  0x08, 0x06, 0x00, 0x00, 0x00, 0xb9, 0xf0, 0xdc, 0x11, 0x00, 0x00, 0x01,
+  0x3d, 0x49, 0x44, 0x41, 0x54, 0x28, 0xcf, 0xbd, 0x92, 0x41, 0x28, 0x83,
+  0x61, 0x1c, 0x87, 0x9f, 0x19, 0xdb, 0x6c, 0x0d, 0x6d, 0x71, 0x5b, 0x94,
+  0x94, 0xe3, 0xc4, 0xcd, 0x8d, 0x8b, 0xab, 0xe5, 0xea, 0x82, 0x93, 0xdb,
+  0x58, 0x72, 0xe3, 0x36, 0x2e, 0x5a, 0x24, 0x07, 0x94, 0x11, 0x45, 0x6d,
+  0x72, 0x21, 0x8b, 0x93, 0x35, 0x17, 0xca, 0x4e, 0x5c, 0x38, 0x9b, 0xc3,
+  0xa6, 0x38, 0x99, 0xfa, 0x39, 0x7c, 0xdb, 0xbe, 0x8f, 0x6c, 0x72, 0xd9,
+  0xbf, 0x9e, 0x7a, 0x0f, 0xbf, 0xa7, 0xfe, 0xef, 0xef, 0x7d, 0xa1, 0x1e,
+  0xb3, 0x06, 0xa4, 0x80, 0x27, 0xa0, 0x00, 0x14, 0x2d, 0xbc, 0x02, 0xd7,
+  0xc0, 0x0c, 0xe0, 0x2a, 0x0b, 0x5a, 0x9d, 0x46, 0xe7, 0x51, 0xf4, 0x18,
+  0x47, 0xf9, 0x04, 0xfa, 0x38, 0x45, 0x85, 0x24, 0xca, 0xc4, 0x50, 0x38,
+  0x84, 0x9c, 0x4d, 0x08, 0xc8, 0x02, 0x7e, 0x00, 0x29, 0x55, 0x9b, 0xbb,
+  0x0d, 0xe4, 0xf3, 0x22, 0x60, 0x0b, 0x40, 0xbb, 0x73, 0x68, 0x72, 0x04,
+  0x05, 0xbb, 0x51, 0x8b, 0x1b, 0x39, 0x1a, 0x8d, 0xf3, 0xd5, 0x8a, 0x29,
+  0x6d, 0x86, 0x11, 0xf0, 0x02, 0xb0, 0x67, 0x61, 0x0a, 0xe8, 0x2b, 0x91,
+  0xee, 0x0d, 0x98, 0x42, 0xee, 0x08, 0x01, 0xef, 0xb5, 0xca, 0x18, 0x70,
+  0x39, 0x4c, 0xe1, 0xed, 0xa4, 0xb6, 0x60, 0x07, 0x2e, 0xfb, 0x7b, 0x4c,
+  0x21, 0x13, 0xab, 0x2e, 0xd8, 0x81, 0x83, 0x06, 0x1b, 0xba, 0x58, 0x36,
+  0x85, 0xd1, 0x41, 0x54, 0xaa, 0xf8, 0xdb, 0x34, 0x03, 0xc7, 0x0d, 0x36,
+  0xb4, 0x3f, 0x6f, 0x86, 0xa3, 0x13, 0x08, 0x10, 0x10, 0xb2, 0x86, 0xdb,
+  0x80, 0xb4, 0xcb, 0x81, 0x92, 0x0b, 0x46, 0xb0, 0x78, 0x86, 0x66, 0xc7,
+  0x2a, 0xe1, 0x25, 0x6b, 0xd8, 0x0f, 0x64, 0x5b, 0x3d, 0x66, 0x95, 0xcf,
+  0x87, 0x68, 0x28, 0x88, 0x80, 0x4f, 0x20, 0x62, 0x0d, 0x7b, 0x80, 0x5b,
+  0x9f, 0xd7, 0x78, 0x20, 0xa5, 0xd0, 0xfd, 0x36, 0xea, 0xec, 0x40, 0x40,
+  0x0e, 0x18, 0xfe, 0xb9, 0x77, 0xdc, 0xed, 0x44, 0x37, 0xeb, 0x46, 0x38,
+  0x9f, 0x40, 0x81, 0x76, 0x04, 0x3c, 0x00, 0x5d, 0xbf, 0xb5, 0xa2, 0x9d,
+  0x88, 0x79, 0xc1, 0xc5, 0xf1, 0xca, 0xce, 0xd5, 0xf8, 0xfb, 0x2f, 0x95,
+  0xa9, 0xa3, 0xf0, 0x1f, 0xbe, 0x00, 0xf0, 0x04, 0x2d, 0x7b, 0x94, 0x44,
+  0xbf, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
+  0x60, 0x82
+};
+unsigned char devdigit_3_png[] = {
+  0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+  0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x14,
+  0x08, 0x06, 0x00, 0x00, 0x00, 0xb9, 0xf0, 0xdc, 0x11, 0x00, 0x00, 0x01,
+  0x86, 0x49, 0x44, 0x41, 0x54, 0x28, 0xcf, 0xbd, 0xd3, 0x3f, 0x6c, 0xcd,
+  0x61, 0x18, 0xc5, 0xf1, 0x0f, 0x8d, 0xb8, 0xe1, 0x2e, 0x82, 0x89, 0x4a,
+  0x34, 0x91, 0x30, 0xb4, 0x1d, 0x88, 0xb1, 0xc5, 0x42, 0x18, 0x58, 0x14,
+  0xab, 0x36, 0x18, 0xea, 0x4f, 0x24, 0x88, 0xea, 0x24, 0xa6, 0x62, 0x11,
+  0x24, 0xe8, 0x4d, 0x89, 0x26, 0x1d, 0x24, 0x08, 0x57, 0x35, 0x1d, 0x74,
+  0x6e, 0x99, 0x48, 0xb4, 0x49, 0x5b, 0x1b, 0xab, 0x56, 0x42, 0xab, 0xd2,
+  0x3e, 0x86, 0xdf, 0x75, 0x7f, 0xbf, 0x5b, 0x6d, 0x6d, 0xde, 0xe4, 0x6c,
+  0xcf, 0xf7, 0x7d, 0x4f, 0xce, 0x73, 0x5e, 0xfe, 0xd7, 0x19, 0xc0, 0x38,
+  0x26, 0xf1, 0x2b, 0xa3, 0x69, 0x8c, 0xa1, 0x80, 0x6d, 0x59, 0x20, 0xde,
+  0x74, 0x88, 0xb1, 0x87, 0x62, 0xe2, 0x99, 0x98, 0xe9, 0x15, 0x53, 0x45,
+  0x31, 0xda, 0x25, 0x3a, 0xcf, 0x8b, 0xad, 0xd5, 0x02, 0x3f, 0xd0, 0x58,
+  0x06, 0xa2, 0x7f, 0x71, 0x7d, 0x7f, 0x21, 0x1a, 0x6a, 0x05, 0xde, 0x95,
+  0x81, 0xe6, 0x7d, 0xa2, 0x76, 0xb3, 0x58, 0x93, 0x17, 0x2b, 0xaa, 0x92,
+  0x5b, 0x7b, 0xaf, 0xa5, 0xd0, 0xdb, 0xdb, 0xa2, 0x64, 0x11, 0xb4, 0x64,
+  0x54, 0x57, 0xf2, 0xfb, 0x7a, 0xe3, 0xba, 0x14, 0x98, 0x2a, 0x56, 0x02,
+  0x0b, 0x9d, 0xb6, 0x7c, 0x2e, 0x05, 0x86, 0x0b, 0x7f, 0x03, 0xcd, 0x38,
+  0x8b, 0xeb, 0x18, 0x42, 0x5c, 0x3e, 0x9a, 0x0c, 0xcf, 0xf6, 0x89, 0xa6,
+  0x06, 0x81, 0x91, 0x8a, 0xa4, 0x8e, 0xef, 0x15, 0x67, 0x0e, 0x89, 0x8e,
+  0x16, 0x31, 0x78, 0x2b, 0x19, 0x1e, 0x29, 0x88, 0xfd, 0x3b, 0x05, 0xe6,
+  0x70, 0xa4, 0x02, 0x98, 0x9f, 0xce, 0x93, 0x76, 0xb1, 0x61, 0xad, 0xc0,
+  0x0c, 0xda, 0xe7, 0x7b, 0x8e, 0x1b, 0x27, 0xc4, 0x9d, 0x56, 0xf1, 0xf2,
+  0xaa, 0xf8, 0xfa, 0x34, 0x81, 0x7e, 0xbe, 0x12, 0x57, 0x8e, 0x09, 0x04,
+  0x4e, 0x65, 0x81, 0x9b, 0xb8, 0x8b, 0x22, 0x26, 0x56, 0xe7, 0x92, 0x65,
+  0xfe, 0x79, 0xed, 0xe4, 0x01, 0x81, 0xe1, 0xc5, 0x12, 0xca, 0x63, 0xa0,
+  0xbe, 0x26, 0x05, 0x3e, 0x76, 0xfe, 0x3b, 0xd6, 0x1d, 0xab, 0x56, 0x2e,
+  0xbc, 0x87, 0xd3, 0x19, 0xed, 0xc1, 0x26, 0xec, 0xc2, 0x87, 0xed, 0x5b,
+  0x52, 0x60, 0xb4, 0x2b, 0x05, 0xa2, 0xf5, 0xa0, 0xd8, 0x5d, 0x2f, 0xaa,
+  0xd7, 0x27, 0xb5, 0xc8, 0xe7, 0x44, 0x63, 0x9d, 0x78, 0x7f, 0x2f, 0x05,
+  0x2e, 0x1c, 0x16, 0xa5, 0xe6, 0x2e, 0x5d, 0xbc, 0xe8, 0x17, 0xf7, 0xcf,
+  0x89, 0xe5, 0xcb, 0x04, 0x2e, 0x42, 0x7c, 0xee, 0x11, 0x93, 0xcf, 0x93,
+  0x08, 0x67, 0xfb, 0x12, 0xbf, 0xe3, 0x8f, 0xc4, 0xe3, 0x4b, 0xe5, 0x96,
+  0x06, 0x1e, 0xa0, 0x0a, 0xbe, 0xe0, 0x5b, 0x69, 0x39, 0x73, 0x19, 0x4d,
+  0xe3, 0x13, 0xba, 0xb3, 0xff, 0xe0, 0x37, 0x1c, 0x29, 0x1b, 0xc9, 0x07,
+  0xdf, 0x9a, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
+  0x42, 0x60, 0x82
+};
+unsigned char devdigit_4_png[] = {
+  0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+  0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x14,
+  0x08, 0x06, 0x00, 0x00, 0x00, 0x56, 0x32, 0xb7, 0x2f, 0x00, 0x00, 0x00,
+  0xc6, 0x49, 0x44, 0x41, 0x54, 0x38, 0xcb, 0x63, 0x60, 0x18, 0x0c, 0xa0,
+  0x02, 0x88, 0xff, 0x63, 0xc1, 0x38, 0x81, 0x1e, 0x10, 0xff, 0x2c, 0x0f,
+  0x67, 0xf8, 0xff, 0x7f, 0x17, 0x02, 0xe3, 0xd3, 0xc4, 0x06, 0xc4, 0x17,
+  0x75, 0x15, 0x19, 0xfe, 0xff, 0xd8, 0x4a, 0xbc, 0xa6, 0x0e, 0x56, 0x66,
+  0x86, 0xff, 0x17, 0xa6, 0xa3, 0x6a, 0xc0, 0xa7, 0xc9, 0x0a, 0x88, 0xff,
+  0xb6, 0x27, 0x41, 0x14, 0x5d, 0x9e, 0x45, 0x58, 0x13, 0x37, 0x10, 0xdf,
+  0xb1, 0xd4, 0x64, 0xf8, 0xff, 0x67, 0x07, 0xc3, 0xff, 0xdf, 0xdb, 0x19,
+  0xfe, 0x9b, 0xaa, 0x11, 0xd6, 0x34, 0x83, 0x8b, 0x9d, 0xe1, 0xff, 0xed,
+  0xf9, 0x10, 0x05, 0x5d, 0x29, 0x10, 0x45, 0xf8, 0x34, 0x79, 0x80, 0x04,
+  0xa6, 0xe7, 0x41, 0x24, 0x6f, 0xce, 0x63, 0xf8, 0xcf, 0xc1, 0x86, 0x5f,
+  0x93, 0x10, 0x10, 0x3f, 0x75, 0x37, 0x81, 0x48, 0xfc, 0x05, 0x3a, 0xcd,
+  0x5a, 0x1b, 0x2c, 0x79, 0x0b, 0x9f, 0xa6, 0x15, 0x82, 0x3c, 0x0c, 0xff,
+  0x9f, 0x2c, 0x83, 0x48, 0x4c, 0xca, 0x02, 0x4b, 0xfc, 0x03, 0x62, 0x1b,
+  0x7c, 0x9a, 0xfe, 0x2f, 0xaf, 0x82, 0x08, 0xde, 0x5b, 0xc4, 0xf0, 0x1f,
+  0xe4, 0x2f, 0xe4, 0x14, 0x80, 0x45, 0x13, 0x58, 0x23, 0x46, 0x7c, 0xe0,
+  0xc3, 0x94, 0x69, 0xc2, 0x87, 0x71, 0x39, 0x0f, 0x1f, 0x20, 0x3a, 0xed,
+  0x0d, 0x90, 0x26, 0x6c, 0x99, 0x10, 0x00, 0x10, 0x35, 0x2e, 0x1a, 0x0e,
+  0xfb, 0x7b, 0x23, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
+  0x42, 0x60, 0x82
+};
+unsigned char devdigit_5_png[] = {
+  0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+  0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x14,
+  0x08, 0x06, 0x00, 0x00, 0x00, 0x5b, 0x2c, 0xc7, 0x68, 0x00, 0x00, 0x01,
+  0x0a, 0x49, 0x44, 0x41, 0x54, 0x28, 0xcf, 0x63, 0x60, 0xa0, 0x25, 0xf8,
+  0x4f, 0x02, 0x66, 0xf8, 0xff, 0x7f, 0x17, 0x61, 0x4c, 0x47, 0xc5, 0x15,
+  0xe1, 0x24, 0xb8, 0x39, 0xcb, 0x17, 0x2c, 0x50, 0x89, 0x37, 0x34, 0x60,
+  0x8a, 0x63, 0x5d, 0xc0, 0x8a, 0x8f, 0x00, 0xf1, 0x74, 0x20, 0x2e, 0x04,
+  0x62, 0x3d, 0x9c, 0x8a, 0x0f, 0xf7, 0x31, 0xfc, 0x9f, 0x96, 0xcb, 0xf0,
+  0xbf, 0x20, 0x90, 0xe1, 0xbf, 0xae, 0x22, 0xdc, 0xea, 0xc3, 0x40, 0xac,
+  0x82, 0xa1, 0x18, 0x1d, 0x1f, 0xea, 0x65, 0xf8, 0xaf, 0x2c, 0x09, 0xd6,
+  0xf0, 0x16, 0x88, 0x15, 0xc1, 0x8a, 0xd5, 0xa4, 0x19, 0xfe, 0x33, 0x33,
+  0x31, 0xfc, 0x17, 0xe0, 0x66, 0xf8, 0x6f, 0xa7, 0xcb, 0xf0, 0x7f, 0x41,
+  0x09, 0x42, 0xc3, 0x9b, 0x35, 0x0c, 0xff, 0x15, 0xc4, 0xc1, 0x1a, 0x96,
+  0x81, 0x14, 0xab, 0x23, 0x61, 0x7b, 0x20, 0x5e, 0x08, 0x32, 0xa0, 0x35,
+  0x11, 0xa1, 0x61, 0x69, 0x05, 0x58, 0xf1, 0x2b, 0x5c, 0x9e, 0x6e, 0x93,
+  0x10, 0x44, 0x28, 0x7e, 0xb9, 0x0a, 0xac, 0xf8, 0x1b, 0x2e, 0xc5, 0x41,
+  0x3c, 0x1c, 0x08, 0xc5, 0x5f, 0x37, 0x21, 0x14, 0x5b, 0x21, 0x61, 0x49,
+  0x20, 0x0e, 0x03, 0x59, 0x19, 0x68, 0x8d, 0x50, 0x7c, 0x7a, 0x0a, 0x42,
+  0xf1, 0x7f, 0x4b, 0x4d, 0x86, 0xff, 0x20, 0x6b, 0xd9, 0x58, 0x18, 0xfe,
+  0xf3, 0x03, 0x3d, 0x19, 0x6a, 0x07, 0xb1, 0x1a, 0x2d, 0xfc, 0xcf, 0x10,
+  0x4c, 0x1b, 0xed, 0x49, 0xf0, 0xf0, 0x8e, 0x03, 0x2b, 0xfe, 0xb4, 0x81,
+  0xe1, 0xff, 0x8f, 0xad, 0x0c, 0xff, 0xff, 0xee, 0x60, 0xf8, 0xff, 0x6b,
+  0x1b, 0xc3, 0xff, 0xc7, 0x4b, 0x19, 0xfe, 0xaf, 0xa8, 0x62, 0xf8, 0x6f,
+  0xa3, 0x0d, 0x57, 0xd8, 0x01, 0xf3, 0xcc, 0x67, 0x20, 0xfe, 0x09, 0xc4,
+  0xff, 0x90, 0xf0, 0x6f, 0x20, 0x7e, 0x02, 0xc4, 0x2b, 0x81, 0xd8, 0x16,
+  0xa6, 0x10, 0x00, 0x2a, 0x24, 0x25, 0x9c, 0x2b, 0xd4, 0x93, 0xd9, 0x00,
+  0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+unsigned char devdigit_6_png[] = {
+  0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+  0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x14,
+  0x08, 0x06, 0x00, 0x00, 0x00, 0x56, 0x32, 0xb7, 0x2f, 0x00, 0x00, 0x01,
+  0xbc, 0x49, 0x44, 0x41, 0x54, 0x38, 0xcb, 0xc5, 0x92, 0x49, 0x28, 0x85,
+  0x51, 0x14, 0xc7, 0x8f, 0x12, 0x9e, 0xe7, 0x49, 0xc6, 0x32, 0x94, 0x6c,
+  0x50, 0x86, 0x8d, 0xc4, 0x82, 0x67, 0x28, 0x19, 0x32, 0x2c, 0xcc, 0x91,
+  0x9e, 0x85, 0x85, 0x05, 0x29, 0x1b, 0x96, 0xa4, 0x6c, 0x58, 0xb0, 0x30,
+  0x3d, 0x91, 0x32, 0x96, 0xc8, 0x10, 0x61, 0x63, 0xd8, 0x93, 0x79, 0x8c,
+  0xf2, 0x64, 0x28, 0xe2, 0x65, 0xf6, 0x38, 0xce, 0xbd, 0xef, 0xfb, 0xde,
+  0xfd, 0x9e, 0x69, 0xeb, 0xd6, 0x6f, 0xf5, 0xff, 0x7e, 0xdf, 0x3d, 0xe7,
+  0xdc, 0x03, 0xf0, 0x5f, 0x27, 0x88, 0x68, 0x27, 0x8e, 0x88, 0x67, 0xc2,
+  0xa4, 0xe0, 0x81, 0xb8, 0xfc, 0x2a, 0x94, 0x12, 0x2f, 0x81, 0xbe, 0x80,
+  0x6d, 0x15, 0x80, 0x87, 0xbd, 0x80, 0x4f, 0x53, 0x80, 0x6f, 0x33, 0x80,
+  0xf7, 0x13, 0x80, 0x17, 0xc3, 0x80, 0x94, 0xa3, 0x52, 0x48, 0x23, 0x3e,
+  0x74, 0x49, 0x80, 0xcf, 0xd3, 0x80, 0x38, 0xf7, 0x33, 0x4a, 0xc9, 0x9e,
+  0x30, 0xa4, 0x46, 0x02, 0xbe, 0xcf, 0x9a, 0x43, 0xc3, 0x00, 0x60, 0x66,
+  0x34, 0xa0, 0xda, 0x01, 0x50, 0x65, 0x07, 0x18, 0xe4, 0x07, 0x98, 0x1b,
+  0x6b, 0x2d, 0x15, 0xda, 0xd9, 0x02, 0x9e, 0xf6, 0x9b, 0x85, 0x17, 0xba,
+  0x29, 0xc4, 0x9f, 0x87, 0x67, 0x44, 0x16, 0x11, 0x4c, 0xe4, 0x29, 0xe0,
+  0x67, 0xb0, 0x20, 0x5e, 0x94, 0x30, 0x54, 0xcb, 0x85, 0x57, 0x22, 0xf4,
+  0xaf, 0x89, 0xed, 0x0d, 0xd4, 0x08, 0xa9, 0x2c, 0x95, 0x4b, 0x47, 0x92,
+  0x28, 0xc3, 0x6e, 0xed, 0x20, 0xbc, 0x64, 0xe9, 0x6e, 0xb7, 0x5b, 0x48,
+  0x39, 0x54, 0x7b, 0x83, 0xce, 0x3c, 0x3d, 0x56, 0x2a, 0xeb, 0xaf, 0xbd,
+  0x12, 0xd0, 0xd3, 0x85, 0xff, 0xec, 0x84, 0xf0, 0x60, 0x92, 0xe9, 0x76,
+  0x4c, 0x48, 0xc6, 0xf1, 0x9f, 0x27, 0x77, 0xdc, 0x07, 0xe8, 0xee, 0xcc,
+  0xc5, 0x56, 0x2e, 0xb1, 0xb7, 0x90, 0xc3, 0xcb, 0x11, 0xc0, 0xf4, 0x28,
+  0x40, 0x27, 0x9a, 0x5c, 0x78, 0x00, 0xe0, 0x6a, 0x9b, 0xc8, 0x5a, 0xca,
+  0x2d, 0xb7, 0x81, 0xe9, 0x4e, 0xf1, 0xf7, 0x3c, 0x2d, 0x0f, 0xae, 0x88,
+  0x0c, 0x62, 0x4d, 0x1b, 0x66, 0x7d, 0x9b, 0xd4, 0x23, 0x18, 0x37, 0x3b,
+  0x45, 0xe0, 0xa2, 0xe6, 0x41, 0xbe, 0xd4, 0x6f, 0x9c, 0x46, 0x25, 0x32,
+  0xd6, 0xa3, 0x2c, 0x6d, 0xf5, 0x54, 0x8b, 0xc0, 0x55, 0x63, 0x25, 0x25,
+  0x38, 0x3b, 0x8a, 0xec, 0x7a, 0x54, 0x48, 0xbd, 0xc9, 0x11, 0xdf, 0xca,
+  0xbb, 0x90, 0x56, 0x6b, 0x23, 0x3e, 0x5c, 0x64, 0xf3, 0x8d, 0x3c, 0xbb,
+  0x61, 0x52, 0x0a, 0x5b, 0x8f, 0xc5, 0x26, 0x73, 0x70, 0x3e, 0x04, 0xc8,
+  0x56, 0x4a, 0x2d, 0x0d, 0x62, 0xbd, 0x43, 0x48, 0xd9, 0x31, 0x5c, 0x5a,
+  0x60, 0x92, 0x0d, 0xb1, 0xe4, 0xed, 0x06, 0xb8, 0xdf, 0xf3, 0xfb, 0xb2,
+  0x76, 0x55, 0x59, 0x76, 0x2f, 0x47, 0x7e, 0x60, 0x1f, 0xe2, 0x80, 0x8d,
+  0xb9, 0xae, 0x04, 0x70, 0x5b, 0x0f, 0xf8, 0x38, 0x09, 0xc8, 0xa6, 0xba,
+  0xdc, 0x0c, 0x58, 0x94, 0x68, 0x11, 0xf4, 0x5f, 0xd7, 0x49, 0x43, 0xd4,
+  0x13, 0x3b, 0xc4, 0x93, 0x02, 0x23, 0xb1, 0x42, 0x14, 0xcb, 0x1f, 0x7e,
+  0x02, 0xc8, 0xc9, 0x55, 0xb9, 0xda, 0x16, 0x80, 0x07, 0x00, 0x00, 0x00,
+  0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+unsigned char devdigit_7_png[] = {
+  0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+  0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x14,
+  0x08, 0x06, 0x00, 0x00, 0x00, 0xb9, 0xf0, 0xdc, 0x11, 0x00, 0x00, 0x00,
+  0xfc, 0x49, 0x44, 0x41, 0x54, 0x28, 0xcf, 0x63, 0x60, 0xa0, 0x07, 0xf8,
+  0x4f, 0x22, 0x66, 0xf8, 0xff, 0x7f, 0x17, 0x71, 0x98, 0x8e, 0x1a, 0x70,
+  0x61, 0x76, 0x56, 0x86, 0xff, 0xb7, 0xe6, 0x43, 0x14, 0x2f, 0xab, 0x44,
+  0x68, 0xc0, 0x06, 0x74, 0x80, 0xf8, 0x57, 0x6b, 0x22, 0x44, 0xf1, 0xe3,
+  0xa5, 0x0c, 0xff, 0x05, 0xb8, 0xc1, 0x8a, 0x97, 0x63, 0x53, 0xcc, 0x08,
+  0xc4, 0xc7, 0xb4, 0xe5, 0x19, 0xfe, 0xff, 0xdc, 0x0a, 0xd1, 0xe0, 0x63,
+  0x0e, 0x56, 0xfc, 0x04, 0x88, 0x05, 0xb1, 0x69, 0xc8, 0x00, 0x59, 0x7d,
+  0xb4, 0x1f, 0xa2, 0x78, 0x4d, 0x2d, 0xdc, 0x29, 0xbe, 0xd8, 0x14, 0x8b,
+  0x03, 0xf1, 0xfb, 0x74, 0x6f, 0x88, 0xe2, 0xef, 0x5b, 0x18, 0xfe, 0xcb,
+  0x8b, 0x81, 0x15, 0xaf, 0xc5, 0xe5, 0xf6, 0xf9, 0x62, 0x02, 0x0c, 0xff,
+  0xdf, 0xad, 0x85, 0x68, 0xe8, 0x4a, 0x01, 0x2b, 0xfe, 0x01, 0xc4, 0x0a,
+  0xd8, 0x14, 0x9b, 0x00, 0xf1, 0xbf, 0x79, 0xc5, 0x10, 0xc5, 0x5f, 0x37,
+  0x31, 0xfc, 0x17, 0xe5, 0x07, 0x6b, 0xe8, 0xc6, 0x65, 0xfa, 0x7e, 0x63,
+  0x55, 0x86, 0xff, 0x7f, 0x77, 0x40, 0x34, 0x4c, 0xcf, 0x03, 0x2b, 0xfe,
+  0x06, 0xc4, 0x62, 0xd8, 0x14, 0xdb, 0x82, 0x3c, 0xb6, 0xaf, 0x0b, 0x11,
+  0x49, 0xfa, 0x4a, 0x60, 0x0d, 0x33, 0x70, 0x99, 0xbe, 0xd4, 0x46, 0x1b,
+  0xa1, 0xf8, 0xc6, 0x5c, 0x78, 0xc8, 0x18, 0x60, 0x53, 0xcc, 0x06, 0xc4,
+  0xdf, 0x97, 0x94, 0x23, 0x34, 0xf4, 0x67, 0x80, 0x15, 0xdf, 0xc4, 0x65,
+  0xba, 0x05, 0x2b, 0x33, 0xc3, 0xff, 0x6f, 0x9b, 0x11, 0x1a, 0x22, 0x1d,
+  0xc1, 0x1a, 0x26, 0xe0, 0xd4, 0x60, 0xae, 0x81, 0x9a, 0xc8, 0x2c, 0x34,
+  0xc1, 0x1a, 0xa2, 0x70, 0x6a, 0xc0, 0x91, 0xf8, 0x2c, 0xb1, 0x29, 0x06,
+  0x00, 0xb2, 0xca, 0xf8, 0x55, 0x80, 0x80, 0x9f, 0xd0, 0x00, 0x00, 0x00,
+  0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+unsigned char devdigit_8_png[] = {
+  0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+  0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x14,
+  0x08, 0x06, 0x00, 0x00, 0x00, 0x56, 0x32, 0xb7, 0x2f, 0x00, 0x00, 0x01,
+  0xbf, 0x49, 0x44, 0x41, 0x54, 0x38, 0xcb, 0xc5, 0x92, 0x49, 0x28, 0x46,
+  0x51, 0x14, 0xc7, 0x8f, 0xf1, 0x33, 0xa5, 0x44, 0x28, 0x32, 0x2c, 0x44,
+  0x08, 0x65, 0xdc, 0xd8, 0x48, 0xf8, 0xac, 0x08, 0xa5, 0x88, 0x95, 0xad,
+  0x59, 0x22, 0x25, 0xd6, 0xc6, 0x52, 0xca, 0x14, 0x32, 0x94, 0x21, 0xb3,
+  0x64, 0x65, 0xa6, 0x28, 0x0b, 0x32, 0x6c, 0xc8, 0x9c, 0x05, 0x42, 0xbe,
+  0xcf, 0x7c, 0x9c, 0x7b, 0x5f, 0x9f, 0xf3, 0x78, 0xf6, 0x5e, 0xfd, 0x16,
+  0xef, 0xfe, 0xff, 0xbf, 0x37, 0x9c, 0x7b, 0x01, 0xfe, 0xe3, 0x0a, 0x22,
+  0xfa, 0x89, 0x0b, 0xe2, 0x55, 0xc5, 0x29, 0x31, 0x49, 0xc4, 0xfc, 0x16,
+  0xa2, 0x09, 0x43, 0xa0, 0x17, 0x60, 0x5f, 0x39, 0xe0, 0xf9, 0x00, 0xe0,
+  0xcb, 0x0c, 0xe0, 0x49, 0x1f, 0xe0, 0x44, 0x0d, 0x60, 0x74, 0x00, 0x20,
+  0xe5, 0x9f, 0x44, 0x86, 0x5a, 0x5a, 0x8c, 0xf2, 0x07, 0x7c, 0x9a, 0x04,
+  0xc4, 0x79, 0x2d, 0x1f, 0x73, 0x80, 0xe9, 0xb1, 0x52, 0x3c, 0x54, 0x4b,
+  0xc6, 0x85, 0x3a, 0x2e, 0xe5, 0xe9, 0x01, 0x6d, 0xad, 0x01, 0x4b, 0xd2,
+  0x79, 0xed, 0xa0, 0x53, 0x4a, 0x86, 0x1f, 0x92, 0x61, 0x8a, 0x0b, 0x3a,
+  0x2b, 0x59, 0x28, 0xb5, 0xd3, 0xf1, 0x9a, 0xf8, 0x0a, 0x8d, 0x74, 0x3b,
+  0xca, 0x85, 0xb8, 0x30, 0x59, 0x38, 0x76, 0x73, 0xe2, 0xb5, 0xf5, 0x66,
+  0xad, 0x74, 0x37, 0x5c, 0xc5, 0x85, 0xa3, 0x5e, 0x40, 0x0f, 0x67, 0xc0,
+  0xda, 0x5c, 0xe5, 0xfe, 0x9d, 0xfe, 0x29, 0x21, 0x5c, 0x4a, 0x1b, 0x6a,
+  0x69, 0xc4, 0xd3, 0x05, 0xf0, 0xac, 0x9f, 0xc5, 0xeb, 0x21, 0x65, 0x00,
+  0xc6, 0x69, 0xc0, 0x9c, 0x78, 0x29, 0x7c, 0x10, 0x89, 0x6a, 0xa9, 0x44,
+  0x8c, 0x34, 0x3f, 0x45, 0x3b, 0xb9, 0xed, 0x56, 0x40, 0xb1, 0x15, 0x94,
+  0xbf, 0x10, 0x05, 0x26, 0x21, 0x99, 0xc0, 0xe2, 0x34, 0xe5, 0xc9, 0xa2,
+  0x38, 0x50, 0x01, 0xa8, 0x1e, 0xcc, 0x33, 0xed, 0x99, 0x78, 0xa0, 0xe8,
+  0x11, 0xd9, 0x42, 0x5a, 0xd1, 0x47, 0x72, 0xa1, 0xb3, 0x58, 0x09, 0xfd,
+  0x3c, 0x00, 0xd7, 0x9a, 0x7e, 0xbe, 0x35, 0x2b, 0x4e, 0x66, 0xbb, 0x42,
+  0x7a, 0x58, 0x6e, 0xe0, 0x20, 0xc8, 0x5b, 0x06, 0x5d, 0xc4, 0xba, 0x85,
+  0x39, 0x60, 0x77, 0x29, 0x67, 0x3b, 0x6d, 0x32, 0x33, 0x4a, 0xe9, 0x7e,
+  0x9c, 0x03, 0x6b, 0x4b, 0x19, 0x04, 0x13, 0x96, 0x44, 0x8f, 0x8b, 0x23,
+  0x67, 0xe2, 0x93, 0xbf, 0xa5, 0x9b, 0x51, 0xcd, 0x9b, 0xd6, 0x88, 0x50,
+  0x62, 0xd9, 0xdb, 0x95, 0xb3, 0xbd, 0x0e, 0x96, 0x6e, 0x7b, 0xca, 0x38,
+  0x58, 0x6d, 0x04, 0x0c, 0xf1, 0x55, 0x4e, 0x45, 0xb0, 0x0f, 0xe0, 0x52,
+  0x3d, 0x67, 0x85, 0xa9, 0x52, 0xda, 0x17, 0x52, 0xaf, 0xd8, 0x79, 0x71,
+  0xb6, 0xfe, 0x3a, 0xac, 0x26, 0xda, 0x8b, 0x00, 0xcd, 0x94, 0xe9, 0x15,
+  0x09, 0xc9, 0x5d, 0x9c, 0x5e, 0x7b, 0x1b, 0xc0, 0x8a, 0x4c, 0xc0, 0xcd,
+  0x16, 0xc0, 0x07, 0xfa, 0xc7, 0xd7, 0x59, 0xc0, 0xcb, 0x41, 0xc0, 0xb1,
+  0x6a, 0xc0, 0xa4, 0x88, 0xef, 0x71, 0x77, 0x10, 0xe6, 0xa6, 0xbd, 0x72,
+  0x20, 0x2a, 0x89, 0x2d, 0xe2, 0x91, 0x78, 0x53, 0x71, 0x45, 0x8c, 0x13,
+  0x7a, 0x53, 0xf9, 0x0b, 0x69, 0x69, 0x6e, 0x35, 0xdd, 0xeb, 0x2e, 0x07,
+  0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+unsigned char devdigit_9_png[] = {
+  0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+  0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x14,
+  0x08, 0x06, 0x00, 0x00, 0x00, 0x56, 0x32, 0xb7, 0x2f, 0x00, 0x00, 0x01,
+  0xbd, 0x49, 0x44, 0x41, 0x54, 0x38, 0xcb, 0xc5, 0x92, 0xd9, 0x2b, 0xc4,
+  0x51, 0x14, 0xc7, 0x8f, 0xd2, 0x98, 0x69, 0x8c, 0x25, 0x59, 0xb2, 0x44,
+  0x79, 0x30, 0x42, 0x94, 0x22, 0x2f, 0x83, 0x79, 0x18, 0xd9, 0x9f, 0xec,
+  0x4a, 0xa3, 0x3c, 0x79, 0x50, 0x3c, 0xc8, 0x2b, 0xe5, 0x41, 0x3c, 0x51,
+  0x76, 0x93, 0x9d, 0x42, 0x22, 0x91, 0x22, 0xcb, 0x1f, 0x60, 0x5f, 0xca,
+  0x4e, 0xb6, 0xb2, 0x97, 0x7d, 0x38, 0xce, 0xbd, 0xbf, 0x19, 0xf7, 0x97,
+  0x86, 0x57, 0xbf, 0xfa, 0xbc, 0xdc, 0xef, 0xf9, 0xfc, 0xce, 0x3d, 0xb7,
+  0x03, 0xf0, 0x1f, 0x5f, 0x3e, 0xb1, 0x48, 0x3c, 0x10, 0x4f, 0x32, 0x36,
+  0x89, 0x2a, 0x42, 0xf3, 0x53, 0x68, 0x27, 0x30, 0x4f, 0x0f, 0xb8, 0x50,
+  0x07, 0x78, 0x3f, 0x0a, 0xf8, 0x38, 0x06, 0xb8, 0xd1, 0x0a, 0x58, 0x59,
+  0x00, 0xe8, 0xa8, 0x04, 0xa4, 0x7c, 0x97, 0xf0, 0xb1, 0x0a, 0x59, 0x4c,
+  0x68, 0x2b, 0x05, 0xc4, 0x69, 0xdb, 0xec, 0x98, 0x00, 0xbd, 0xdd, 0xb8,
+  0x38, 0x4f, 0xd8, 0x31, 0x69, 0x36, 0x53, 0x27, 0x0a, 0x56, 0x9a, 0x00,
+  0x23, 0x02, 0xa5, 0xbf, 0x27, 0x47, 0x01, 0x5e, 0x0c, 0x4a, 0xe7, 0x73,
+  0xb5, 0x5c, 0x62, 0x24, 0x30, 0xe9, 0x76, 0xa6, 0x46, 0x48, 0xf1, 0xe1,
+  0x3c, 0x58, 0x25, 0x52, 0x88, 0xcb, 0x9c, 0x78, 0x91, 0x19, 0x22, 0x79,
+  0x66, 0x62, 0xd2, 0xdb, 0xcd, 0xb0, 0x08, 0x34, 0x2a, 0x1e, 0xe8, 0x2d,
+  0x57, 0xcf, 0x75, 0x73, 0x12, 0x59, 0x47, 0x19, 0xcf, 0xd6, 0xb9, 0xf4,
+  0x3a, 0x21, 0x02, 0xcb, 0xd0, 0xb1, 0x16, 0x29, 0xd3, 0x45, 0x2d, 0xb2,
+  0xb5, 0x16, 0x9e, 0xdd, 0x71, 0xe9, 0xb0, 0x5b, 0x04, 0xba, 0x30, 0x1e,
+  0x2c, 0x13, 0xa9, 0xc4, 0x45, 0x86, 0x6c, 0xde, 0xdb, 0x11, 0x9e, 0x99,
+  0x99, 0x74, 0x54, 0x5f, 0x2c, 0x82, 0xa5, 0x46, 0xc0, 0xd0, 0x00, 0x40,
+  0x35, 0x75, 0x4c, 0x89, 0x06, 0x3c, 0x1f, 0x10, 0xd9, 0xfb, 0xa4, 0x90,
+  0x1a, 0xdc, 0x9d, 0x01, 0x0f, 0xba, 0x6c, 0x3f, 0xf7, 0xc3, 0xa8, 0xed,
+  0x4e, 0x1e, 0xc4, 0xa1, 0xa7, 0x2b, 0x60, 0x73, 0x09, 0xe0, 0x69, 0x3f,
+  0x20, 0x9b, 0x71, 0xaf, 0x13, 0xb0, 0xda, 0x08, 0x98, 0x1d, 0x27, 0xa4,
+  0xad, 0x76, 0x31, 0x13, 0xfb, 0xbc, 0x88, 0x16, 0xe2, 0x8c, 0xcd, 0x28,
+  0x63, 0xbf, 0x28, 0x51, 0x48, 0x3d, 0xe5, 0x5c, 0xda, 0xfe, 0x6b, 0x17,
+  0x43, 0x99, 0xd8, 0x57, 0x21, 0x24, 0xd6, 0x95, 0xce, 0x7a, 0xe5, 0xab,
+  0x64, 0x25, 0x98, 0x48, 0x27, 0x4e, 0x42, 0xfc, 0xa5, 0xab, 0x32, 0xe1,
+  0xb8, 0x17, 0x50, 0x61, 0xcf, 0xa5, 0x1c, 0xab, 0x84, 0x6c, 0x95, 0xb4,
+  0x7e, 0x80, 0x4a, 0x05, 0xa0, 0x8a, 0x48, 0x8b, 0x91, 0x0a, 0x99, 0xf0,
+  0x31, 0x05, 0x98, 0x14, 0xc5, 0x85, 0x13, 0xc2, 0xe1, 0x5b, 0xfa, 0x6d,
+  0x59, 0x5f, 0xa8, 0x93, 0xd1, 0xc0, 0x85, 0x4f, 0x22, 0x59, 0x7e, 0x7f,
+  0xbc, 0x1a, 0x02, 0x7c, 0x1a, 0x07, 0x34, 0x4f, 0x49, 0x85, 0xfb, 0x5d,
+  0xd2, 0x6b, 0x06, 0xf9, 0x72, 0xe1, 0x95, 0x28, 0xfc, 0x39, 0xf4, 0x35,
+  0xf1, 0x4c, 0x7c, 0xc8, 0x60, 0x85, 0x07, 0x96, 0x57, 0xd5, 0xca, 0x8b,
+  0xbf, 0x00, 0xc6, 0xc4, 0x55, 0xb5, 0xfc, 0x00, 0x61, 0x42, 0x00, 0x00,
+  0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
 /* }}} */
 
-static const struct {
-    gchar c;
-    gsize len;
-    const guchar *data;
-}
-digits[] = {
+static const SplashDigit digits[] = {
     { '0', G_N_ELEMENTS(digit_0_png),   digit_0_png,   },
     { '1', G_N_ELEMENTS(digit_1_png),   digit_1_png,   },
     { '2', G_N_ELEMENTS(digit_2_png),   digit_2_png,   },
@@ -562,188 +1114,59 @@ digits[] = {
     { '.', G_N_ELEMENTS(digit_dot_png), digit_dot_png, },
 };
 
-static gint
-format_check(GdkPixbufFormat *format, guchar *buffer, int size)
-{
-    int i, j, ii;
-    gchar m;
-    GdkPixbufModulePattern *pattern;
-    gboolean anchored;
-    guchar *prefix;
-    gchar *mask;
-
-    ii = 0;
-    for (pattern = format->signature; pattern->prefix; pattern++, ii++) {
-        if (pattern->mask && pattern->mask[0] == '*') {
-            prefix = (guchar *)pattern->prefix + 1;
-            mask = pattern->mask + 1;
-            anchored = FALSE;
-        }
-        else {
-            prefix = (guchar *)pattern->prefix;
-            mask = pattern->mask;
-            anchored = TRUE;
-        }
-        for (i = 0; i < size; i++) {
-            for (j = 0; i + j < size && prefix[j] != 0; j++) {
-                m = mask ? mask[j] : ' ';
-                if (m == ' ') {
-                    if (buffer[i + j] != prefix[j])
-                        break;
-                }
-                else if (m == '!') {
-                    if (buffer[i + j] == prefix[j])
-                        break;
-                }
-                else if (m == 'z') {
-                    if (buffer[i + j] != 0)
-                        break;
-                }
-                else if (m == 'n') {
-                    if (buffer[i + j] == 0)
-                        break;
-                }
-            }
-
-            if (prefix[j] == 0) {
-                g_printerr("  Pattern #%d matches the file header (relevance %d).\n",
-                           ii, pattern->relevance);
-                return pattern->relevance;
-            }
-
-            if (anchored)
-                break;
-        }
-    }
-    g_printerr("  No pattern matches the file header.\n");
-    return 0;
-}
+static const SplashDigit devdigits[] = {
+    { '0', G_N_ELEMENTS(devdigit_0_png), devdigit_0_png, },
+    { '1', G_N_ELEMENTS(devdigit_1_png), devdigit_1_png, },
+    { '2', G_N_ELEMENTS(devdigit_2_png), devdigit_2_png, },
+    { '3', G_N_ELEMENTS(devdigit_3_png), devdigit_3_png, },
+    { '4', G_N_ELEMENTS(devdigit_4_png), devdigit_4_png, },
+    { '5', G_N_ELEMENTS(devdigit_5_png), devdigit_5_png, },
+    { '6', G_N_ELEMENTS(devdigit_6_png), devdigit_6_png, },
+    { '7', G_N_ELEMENTS(devdigit_7_png), devdigit_7_png, },
+    { '8', G_N_ELEMENTS(devdigit_8_png), devdigit_8_png, },
+    { '9', G_N_ELEMENTS(devdigit_9_png), devdigit_9_png, },
+};
 
-static void
-sanity_check(const gchar *filename)
+static gint
+composite_pixbuf(GdkPixbuf *base,
+                 const guchar *pngdata, gsize pnglen, gint xpos, gint ypos,
+                 GError **error)
 {
     GdkPixbufLoader *loader;
-    GSList *formats, *l;
-    GError *err = NULL;
-    GdkPixbuf *pixbuf;
-    gchar *buf = NULL;
-    gsize size;
-    FILE *fh;
-    gboolean ok, fileok = TRUE;
-
-    g_printerr("Performing sanity check for %s.\n", filename);
-    fileok &= ok = g_file_test(filename, G_FILE_TEST_EXISTS);
-    g_printerr("Does it exist: %s\n", ok ? "YES" : "NO");
-    fileok &= ok = g_file_test(filename, G_FILE_TEST_IS_REGULAR);
-    g_printerr("Is it a regular file: %s\n", ok ? "YES" : "NO");
-
-    fh = gwy_fopen(filename, "rb");
-    fileok &= ok = !!fh;
-    g_printerr("Can we open it for reading: %s\n", ok ? "YES" : "NO");
-    if (fh)
-        fclose(fh);
-    else
-        g_printerr("gwy_fopen() fails with: %s\n", g_strerror(errno));
-
-    fileok &= ok = g_file_get_contents(filename, &buf, &size, &err);
-    g_printerr("Can we use g_file_get_contents(): %s\n", ok ? "YES" : "NO");
-    if (!ok) {
-        g_printerr("g_file_get_contents() fails with: %s\n", err->message);
-        g_clear_error(&err);
-    }
+    GdkPixbuf *text;
 
-    if (!fileok) {
-        if (buf)
-            g_free(buf);
-        g_printerr("The file does not seem OK.  No point continuing.\n");
-        return;
-    }
-    g_printerr("The file seems OK, continuing checks.\n");
+    loader = gdk_pixbuf_loader_new_with_type("png", error);
+    /* We have already successfully loaded base PNG */
+    g_assert(loader);
 
-    pixbuf = gdk_pixbuf_new_from_file(filename, &err);
-    if (pixbuf) {
-        g_printerr("Apparently we can load the pixbuf (%dx%d) now?!\n",
-                   gdk_pixbuf_get_width(pixbuf),
-                   gdk_pixbuf_get_height(pixbuf));
-        g_printerr("What has changed?\n");
-        g_printerr("This is completely fucked up.\n");
-        g_object_unref(pixbuf);
+    if (!gdk_pixbuf_loader_write(loader, pngdata, pnglen, error)) {
+        g_critical("Cannot load in-line image as PNG.");
+        return G_MAXINT;
     }
-    else {
-        g_printerr("gdk_pixbuf_new_from_file() fails with: %s\n", err->message);
-        g_clear_error(&err);
+    if (!gdk_pixbuf_loader_close(loader, error)) {
+        g_critical("Cannot load in-line image as PNG.");
+        return G_MAXINT;
     }
 
-    g_printerr("Checking the pixbuf loaders.\n");
-
-    formats = gdk_pixbuf_get_formats();
-    for (l = formats; l; l = g_slist_next(l)) {
-        GdkPixbufFormat *pixbuf_format = (GdkPixbufFormat*)l->data;
-        gchar **ext;
-        gchar *fmtname, *desc, *exts;
-
-        fmtname = gdk_pixbuf_format_get_name(pixbuf_format);
-        desc = gdk_pixbuf_format_get_description(pixbuf_format);
-        ext = gdk_pixbuf_format_get_extensions(pixbuf_format);
-        exts = g_strjoinv(" ", ext);
-        g_printerr("Found format %s: %s (%s)\n", fmtname, desc, exts);
-        g_free(exts);
-        g_strfreev(ext);
-        g_free(desc);
-
-        format_check(pixbuf_format, buf, size);
-
-        loader = gdk_pixbuf_loader_new_with_type(fmtname, &err);
-        if (!loader) {
-            g_printerr("  Cannot create loader for %s: %s\n",
-                       fmtname, err->message);
-            g_clear_error(&err);
-            g_free(fmtname);
-            continue;
-        }
-
-        ok = gdk_pixbuf_loader_write(loader, buf, size, &err);
-        if (ok) {
-            g_printerr("  Loader %s accepts the file content.\n", fmtname);
-            ok = gdk_pixbuf_loader_close(loader, &err);
-            if (ok) {
-                g_printerr("  Loader %s accepts the entire file.\n", fmtname);
-                pixbuf = gdk_pixbuf_loader_get_pixbuf(loader);
-                if (pixbuf) {
-                    g_printerr("  Obtained pixbuf %dx%d from the loader.\n",
-                               gdk_pixbuf_get_width(pixbuf),
-                               gdk_pixbuf_get_height(pixbuf));
-                }
-                else {
-                    g_printerr("  Cannot obtain pixbuf from the loader.\n");
-                }
-            }
-            else {
-                g_printerr("  Loader %s fails at close(): %s.\n",
-                           fmtname, err->message);
-                g_clear_error(&err);
-            }
-        }
-        else {
-            g_printerr("  Loader %s does not accept the file content: %s\n",
-                       fmtname, err->message);
-            g_clear_error(&err);
-        }
-        g_object_unref(loader);
+    text = gdk_pixbuf_loader_get_pixbuf(loader);
+    g_assert(text);
 
-        g_free(fmtname);
-    }
+    gdk_pixbuf_composite(text, base, xpos, ypos,
+                         gdk_pixbuf_get_width(text),
+                         gdk_pixbuf_get_height(text),
+                         xpos, ypos, 1.0, 1.0, GDK_INTERP_NEAREST, 255);
+    xpos += gdk_pixbuf_get_width(text);
+    g_object_unref(loader);
 
-    g_slist_free(formats);
+    return xpos;
 }
 
 static GdkPixbuf*
-compose_splash(const gchar *version)
+compose_splash(const gchar *version, const gchar *extraversion)
 {
     gint xpos = 224;
     gint ypos = 36;
-    GdkPixbufLoader *loader;
-    GdkPixbuf *base, *digit;
+    GdkPixbuf *base;
     GError *err = NULL;
     guint i;
     gchar *p, *filename;
@@ -756,14 +1179,12 @@ compose_splash(const gchar *version)
     if (!base) {
         g_warning("Cannot load base splash image: %s", err->message);
         g_clear_error(&err);
-        sanity_check(filename);
         g_free(filename);
         return NULL;
     }
     g_free(filename);
 
     while (*version) {
-        loader = NULL;
         for (i = 0; i < G_N_ELEMENTS(digits); i++) {
             if (*version == digits[i].c)
                 break;
@@ -774,36 +1195,42 @@ compose_splash(const gchar *version)
             continue;
         }
 
-        loader = gdk_pixbuf_loader_new_with_type("png", &err);
-        /* We have already successfully loaded base PNG */
-        g_assert(loader);
-
-        if (!gdk_pixbuf_loader_write(loader, digits[i].data, digits[i].len,
-                                     &err)) {
-            g_critical("Cannot load in-line image for %c as PNG", *version);
-            break;
-        }
-        if (!gdk_pixbuf_loader_close(loader, &err)) {
-            g_critical("Cannot load in-line image for %c as PNG", *version);
-            break;
-        }
+        xpos = composite_pixbuf(base, digits[i].data, digits[i].len,
+                                xpos, ypos, &err);
+        if (xpos == G_MAXINT)
+            return base;
+        version++;
+    }
 
-        digit = gdk_pixbuf_loader_get_pixbuf(loader);
-        g_assert(digit);
+    if (extraversion) {
+        xpos = 7;
+        ypos = 214;
+        xpos = composite_pixbuf(base, development_snapshot_png,
+                                G_N_ELEMENTS(development_snapshot_png),
+                                xpos, ypos, &err);
+        if (xpos == G_MAXINT)
+            return base;
 
-        gdk_pixbuf_composite(digit, base,
-                             xpos, ypos,
-                             gdk_pixbuf_get_width(digit),
-                             gdk_pixbuf_get_height(digit),
-                             xpos, ypos,
-                             1.0, 1.0,
-                             GDK_INTERP_NEAREST,
-                             255);
-        xpos += gdk_pixbuf_get_width(digit);
-        g_object_unref(loader);
+        xpos += 4;
+        while (*extraversion) {
+            for (i = 0; i < G_N_ELEMENTS(devdigits); i++) {
+                if (*extraversion == devdigits[i].c)
+                    break;
+            }
+            if (i == G_N_ELEMENTS(devdigits)) {
+                g_warning("Cannot find image for %c", *extraversion);
+                extraversion++;
+                continue;
+            }
 
-        version++;
+            xpos = composite_pixbuf(base, devdigits[i].data, devdigits[i].len,
+                                    xpos, ypos, &err);
+            if (xpos == G_MAXINT)
+                return base;
+            extraversion++;
+        }
     }
+
     return base;
 }
 
@@ -820,6 +1247,7 @@ gwy_app_splash_start(gboolean visible)
     GtkWidget *image, *vbox, *frame, *lab;
     GdkPixbuf *pixbuf;
     char *p, *version;
+    const gchar *extraversion;
 
     gwy_debug("");
     g_return_if_fail(!in_splash);
@@ -854,7 +1282,14 @@ gwy_app_splash_start(gboolean visible)
     gtk_container_set_border_width(GTK_CONTAINER(vbox), 2);
 
     version = g_strdup_printf("%d.%d", GWY_VERSION_MAJOR, GWY_VERSION_MINOR);
-    pixbuf = compose_splash(version);
+    extraversion = GWY_VERSION_STRING;
+    if (extraversion)
+        extraversion = strchr(extraversion, '.');
+    if (extraversion)
+        extraversion = strchr(extraversion+1, '.');
+    if (extraversion)
+        extraversion++;
+    pixbuf = compose_splash(version, extraversion);
     g_free(version);
     if (pixbuf) {
         image = gtk_image_new_from_pixbuf(pixbuf);
diff --git a/app/toolbox-editor.c b/app/toolbox-editor.c
index b474c8e..ae9d97d 100644
--- a/app/toolbox-editor.c
+++ b/app/toolbox-editor.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: toolbox-editor.c 19043 2016-10-08 18:58:43Z yeti-dn $
- *  Copyright (C) 2016 David Necas (Yeti).
+ *  @(#) $Id: toolbox-editor.c 20258 2017-08-12 08:17:43Z yeti-dn $
+ *  Copyright (C) 2016-2017 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -181,7 +181,8 @@ static void          move_down_in_toolbox            (GwyToolboxEditor *editor);
 static void          width_changed                   (GwyToolboxEditor *editor);
 static void          apply_toolbox_spec              (GwyToolboxEditor *editor);
 static void          reset_toolbox_to_default        (GwyToolboxEditor *editor);
-static GtkListStore* create_function_list            (ForeachFunc foreach_do);
+static GtkListStore* create_function_list            (ForeachFunc foreach_do,
+                                                      GwyAppActionType type);
 static GtkListStore* create_function_list_builtin    (void);
 static GtkListStore* create_gtk_icon_list            (GtkWidget *widget);
 static GtkListStore* create_gwy_icon_list            (GtkWidget *widget);
@@ -405,15 +406,26 @@ add_function_name(const gchar *name, GArray *func_names)
 }
 
 static gint
-compare_func_names(gconstpointer pa, gconstpointer pb)
+compare_func_names(gconstpointer pa, gconstpointer pb, gpointer user_data)
 {
     GQuark qa = *(const GQuark*)pa;
     GQuark qb = *(const GQuark*)pb;
-    return strcmp(g_quark_to_string(qa), g_quark_to_string(qb));
+    GwyAppActionType type = GPOINTER_TO_UINT(user_data);
+    const gchar *namea = g_quark_to_string(qa);
+    const gchar *nameb = g_quark_to_string(qb);
+    /* XXX: Inefficient. */
+    gchar *nnamea = g_strdup(gwy_toolbox_action_nice_name(type, namea));
+    gchar *nnameb = g_strdup(gwy_toolbox_action_nice_name(type, nameb));
+    gint retval = g_utf8_collate(nnamea, nnameb);
+
+    g_free(nnameb);
+    g_free(nnamea);
+
+    return retval;
 }
 
 static GtkListStore*
-create_function_list(ForeachFunc foreach_do)
+create_function_list(ForeachFunc foreach_do, GwyAppActionType type)
 {
     GtkListStore *store;
     GtkTreeIter iter;
@@ -423,7 +435,8 @@ create_function_list(ForeachFunc foreach_do)
     store = gtk_list_store_new(1, G_TYPE_UINT);
     func_names = g_array_new(FALSE, FALSE, sizeof(GQuark));
     foreach_do((GFunc)add_function_name, func_names);
-    g_array_sort(func_names, compare_func_names);
+    g_array_sort_with_data(func_names, compare_func_names,
+                           GUINT_TO_POINTER(type));
     for (i = 0; i < func_names->len; i++) {
         GQuark qname = g_array_index(func_names, GQuark, i);
         gtk_list_store_insert_with_values(store, &iter, G_MAXINT, 0, qname, -1);
@@ -598,7 +611,7 @@ toolbox_cell_renderer_icon(GtkTreeViewColumn *column,
 
     iconset = gtk_icon_factory_lookup_default(id);
     widget = GTK_WIDGET(gtk_tree_view_column_get_tree_view(column));
-    pixbuf = gtk_icon_set_render_icon(iconset, widget->style, GTK_TEXT_DIR_NONE,
+    pixbuf = gtk_icon_set_render_icon(iconset, widget->style, GTK_TEXT_DIR_LTR,
                                       GTK_STATE_NORMAL,
                                       GTK_ICON_SIZE_LARGE_TOOLBAR,
                                       widget, NULL);
@@ -727,7 +740,7 @@ function_cell_renderer_icon(GtkTreeViewColumn *column,
 
     iconset = gtk_icon_factory_lookup_default(id);
     widget = GTK_WIDGET(gtk_tree_view_column_get_tree_view(column));
-    pixbuf = gtk_icon_set_render_icon(iconset, widget->style, GTK_TEXT_DIR_NONE,
+    pixbuf = gtk_icon_set_render_icon(iconset, widget->style, GTK_TEXT_DIR_LTR,
                                       GTK_STATE_NORMAL,
                                       GTK_ICON_SIZE_LARGE_TOOLBAR,
                                       widget, NULL);
@@ -936,7 +949,7 @@ suggest_group_id(GwyToolboxGroupEditor *geditor)
     }
 #else
     for (i = 0; i < name_len; i++)
-        add_unichar_if_ident(suggestion, name_chars[j]);
+        add_unichar_if_ident(suggestion, name_chars[i]);
 #endif
 
     gtk_entry_set_text(GTK_ENTRY(geditor->id), suggestion->str);
@@ -1105,15 +1118,20 @@ create_item_editor_models(GwyToolboxEditor *editor)
 
     stores[GWY_APP_ACTION_TYPE_BUILTIN] = create_function_list_builtin();
     stores[GWY_APP_ACTION_TYPE_PROC]
-        = create_function_list(gwy_process_func_foreach);
+        = create_function_list(gwy_process_func_foreach,
+                               GWY_APP_ACTION_TYPE_PROC);
     stores[GWY_APP_ACTION_TYPE_GRAPH]
-        = create_function_list(gwy_graph_func_foreach);
+        = create_function_list(gwy_graph_func_foreach,
+                               GWY_APP_ACTION_TYPE_GRAPH);
     stores[GWY_APP_ACTION_TYPE_VOLUME]
-        = create_function_list(gwy_volume_func_foreach);
+        = create_function_list(gwy_volume_func_foreach,
+                               GWY_APP_ACTION_TYPE_VOLUME);
     stores[GWY_APP_ACTION_TYPE_XYZ]
-        = create_function_list(gwy_xyz_func_foreach);
+        = create_function_list(gwy_xyz_func_foreach,
+                               GWY_APP_ACTION_TYPE_XYZ);
     stores[GWY_APP_ACTION_TYPE_TOOL]
-        = create_function_list(gwy_tool_func_foreach);
+        = create_function_list(gwy_tool_func_foreach,
+                               GWY_APP_ACTION_TYPE_TOOL);
     sync_remaining_tools_item(editor);
 
     editor->icon_model_gwy = create_gwy_icon_list(editor->dialogue);
@@ -1416,8 +1434,7 @@ add_default_function_icon(GtkListStore *store, GwyToolboxItemSpec *ispec,
     if (!iconset)
         return;
 
-    pixbuf = gtk_icon_set_render_icon(iconset, widget->style,
-                                      GTK_TEXT_DIR_NONE,
+    pixbuf = gtk_icon_set_render_icon(iconset, widget->style, GTK_TEXT_DIR_LTR,
                                       GTK_STATE_NORMAL,
                                       GTK_ICON_SIZE_LARGE_TOOLBAR,
                                       widget, NULL);
@@ -1451,6 +1468,7 @@ toolbox_model_iter_indices(GtkTreeModel *model, GtkTreeIter *iter,
         *j = indices[1];
     }
     else {
+        *i = *j = 0;
         g_return_val_if_reached(0);
     }
 
@@ -1759,7 +1777,7 @@ create_icon_list(GtkWidget *widget, const gchar **stock_ids, guint nicons)
             continue;
 
         pixbuf = gtk_icon_set_render_icon(iconset, widget->style,
-                                          GTK_TEXT_DIR_NONE,
+                                          GTK_TEXT_DIR_LTR,
                                           GTK_STATE_NORMAL,
                                           GTK_ICON_SIZE_LARGE_TOOLBAR,
                                           widget, NULL);
@@ -1818,35 +1836,35 @@ create_gtk_icon_list(GtkWidget *widget)
         "gtk-floppy",
         "gtk-fullscreen",
         "gtk-goto-bottom",
-        //"gtk-goto-first",
-        //"gtk-goto-last",
+        "gtk-goto-first",
+        "gtk-goto-last",
         "gtk-goto-top",
-        //"gtk-go-back",
+        "gtk-go-back",
         "gtk-go-down",
-        //"gtk-go-forward",
+        "gtk-go-forward",
         "gtk-go-up",
         "gtk-harddisk",
         "gtk-help",
         "gtk-home",
         "gtk-index",
-        //"gtk-indent",
+        "gtk-indent",
         "gtk-info",
         "gtk-italic",
-        //"gtk-jump-to",
+        "gtk-jump-to",
         "gtk-justify-center",
         "gtk-justify-fill",
         "gtk-justify-left",
         "gtk-justify-right",
         "gtk-leave-fullscreen",
         "gtk-missing-image",
-        //"gtk-media-forward",
-        //"gtk-media-next",
-        //"gtk-media-pause",
-        //"gtk-media-play",
-        //"gtk-media-previous",
-        //"gtk-media-record",
-        //"gtk-media-rewind",
-        //"gtk-media-stop",
+        "gtk-media-forward",
+        "gtk-media-next",
+        "gtk-media-pause",
+        "gtk-media-play",
+        "gtk-media-previous",
+        "gtk-media-record",
+        "gtk-media-rewind",
+        "gtk-media-stop",
         "gtk-network",
         "gtk-new",
         "gtk-no",
@@ -1867,10 +1885,10 @@ create_gtk_icon_list(GtkWidget *widget)
         "gtk-print-warning",
         "gtk-properties",
         "gtk-quit",
-        //"gtk-redo",
+        "gtk-redo",
         "gtk-refresh",
         "gtk-remove",
-        //"gtk-revert-to-saved",
+        "gtk-revert-to-saved",
         "gtk-save",
         "gtk-save-as",
         "gtk-select-all",
@@ -1881,10 +1899,10 @@ create_gtk_icon_list(GtkWidget *widget)
         "gtk-spell-check",
         "gtk-stop",
         "gtk-strikethrough",
-        //"gtk-undelete",
+        "gtk-undelete",
         "gtk-underline",
-        //"gtk-undo",
-        //"gtk-unindent",
+        "gtk-undo",
+        "gtk-unindent",
         "gtk-yes",
         "gtk-zoom-100",
         "gtk-zoom-fit",
@@ -1913,9 +1931,11 @@ create_gwy_icon_list(GtkWidget *widget)
     GWY_STOCK_COLOR_RANGE_FULL,
     GWY_STOCK_CONVOLUTION,
     GWY_STOCK_CORRECT_AFFINE,
+    GWY_STOCK_CORRELATION_MASK,
     GWY_STOCK_CROP,
     GWY_STOCK_CWT,
     GWY_STOCK_DATA_MEASURE,
+    GWY_STOCK_DISCONNECTED,
     GWY_STOCK_DISTANCE,
     GWY_STOCK_DISTANCE_TRANSFORM,
     GWY_STOCK_DISTRIBUTION_ANGLE,
@@ -1931,16 +1951,23 @@ create_gwy_icon_list(GtkWidget *widget)
     GWY_STOCK_FAVOURITE,
     GWY_STOCK_FFT,
     GWY_STOCK_FFT_2D,
+    GWY_STOCK_FFT_FILTER_1D,
     GWY_STOCK_FFT_FILTER_2D,
     GWY_STOCK_FILTER,
     GWY_STOCK_FIND_PEAKS,
+    GWY_STOCK_FIT_SHAPE,
     GWY_STOCK_FIX_ZERO,
     GWY_STOCK_FLIP_HORIZONTALLY,
     GWY_STOCK_FLIP_VERTICALLY,
     GWY_STOCK_FRACTAL,
+    GWY_STOCK_FRACTAL_CORRECTION,
+    GWY_STOCK_FRACTAL_MEASURE,
     GWY_STOCK_GL_MATERIAL,
     GWY_STOCK_GRADIENT_HORIZONTAL,
     GWY_STOCK_GRADIENT_VERTICAL,
+    GWY_STOCK_GRAIN_CORRELATION,
+    GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE,
+    GWY_STOCK_GRAIN_INSCRIBED_CIRCLE,
     GWY_STOCK_GRAINS,
     GWY_STOCK_GRAINS_EDGE,
     GWY_STOCK_GRAINS_EDGE_REMOVE,
@@ -1948,9 +1975,6 @@ create_gwy_icon_list(GtkWidget *widget)
     GWY_STOCK_GRAINS_MEASURE,
     GWY_STOCK_GRAINS_REMOVE,
     GWY_STOCK_GRAINS_WATER,
-    GWY_STOCK_GRAIN_CORRELATION,
-    GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE,
-    GWY_STOCK_GRAIN_INSCRIBED_CIRCLE,
     GWY_STOCK_GRAPH,
     GWY_STOCK_GRAPH_ALIGN,
     GWY_STOCK_GRAPH_CUT,
@@ -1989,6 +2013,8 @@ create_gwy_icon_list(GtkWidget *widget)
     GWY_STOCK_LOCAL_SLOPE,
     GWY_STOCK_LOGSCALE_HORIZONTAL,
     GWY_STOCK_LOGSCALE_VERTICAL,
+    GWY_STOCK_MARK_OUTLIERS,
+    GWY_STOCK_MARK_SCARS,
     GWY_STOCK_MARK_WITH,
     GWY_STOCK_MASK,
     GWY_STOCK_MASK_ADD,
@@ -2012,6 +2038,7 @@ create_gwy_icon_list(GtkWidget *widget)
     GWY_STOCK_MASK_RECT_EXCLUSIVE,
     GWY_STOCK_MASK_RECT_INCLUSIVE,
     GWY_STOCK_MASK_REMOVE,
+    GWY_STOCK_MASK_SET,
     GWY_STOCK_MASK_SHRINK,
     GWY_STOCK_MASK_SUBTRACT,
     GWY_STOCK_MASK_THIN,
@@ -2021,12 +2048,15 @@ create_gwy_icon_list(GtkWidget *widget)
     GWY_STOCK_MUTUAL_CROP,
     GWY_STOCK_NEURAL_APPLY,
     GWY_STOCK_NEURAL_TRAIN,
+    GWY_STOCK_NEXT,
+    GWY_STOCK_NULL_OFFSETS,
     GWY_STOCK_PALETTES,
     GWY_STOCK_PATH_LEVEL,
     GWY_STOCK_POINTER_MEASURE,
+    GWY_STOCK_POLY_DISTORT,
     GWY_STOCK_POLYNOM,
     GWY_STOCK_POLYNOM_LEVEL,
-    GWY_STOCK_POLY_DISTORT,
+    GWY_STOCK_PREVIOUS,
     GWY_STOCK_PROFILE,
     GWY_STOCK_PSDF_LOG_PHI,
     GWY_STOCK_PSDF_SECTION,
@@ -2034,6 +2064,7 @@ create_gwy_icon_list(GtkWidget *widget)
     GWY_STOCK_REMOVE_UNDER_MASK,
     GWY_STOCK_ROTATE,
     GWY_STOCK_ROTATE_180,
+    GWY_STOCK_ROTATE_3D,
     GWY_STOCK_ROTATE_90_CCW,
     GWY_STOCK_ROTATE_90_CW,
     GWY_STOCK_SCALE,
@@ -2053,12 +2084,14 @@ create_gwy_icon_list(GtkWidget *widget)
     GWY_STOCK_SYNTHETIC_COLUMNAR,
     GWY_STOCK_SYNTHETIC_DIFFUSION,
     GWY_STOCK_SYNTHETIC_DOMAINS,
+    GWY_STOCK_SYNTHETIC_FIBRES,
     GWY_STOCK_SYNTHETIC_LATTICE,
     GWY_STOCK_SYNTHETIC_LINE_NOISE,
     GWY_STOCK_SYNTHETIC_NOISE,
     GWY_STOCK_SYNTHETIC_OBJECTS,
     GWY_STOCK_SYNTHETIC_PARTICLES,
     GWY_STOCK_SYNTHETIC_PATTERN,
+    GWY_STOCK_SYNTHETIC_PHASES,
     GWY_STOCK_SYNTHETIC_SPECTRAL,
     GWY_STOCK_SYNTHETIC_WAVES,
     GWY_STOCK_TILT,
@@ -2082,6 +2115,7 @@ create_gwy_icon_list(GtkWidget *widget)
     GWY_STOCK_VOLUME_SLICE,
     GWY_STOCK_VOLUMIZE,
     GWY_STOCK_VOLUMIZE_LAYERS,
+    GWY_STOCK_XY_DENOISE,
     GWY_STOCK_ZERO_MEAN,
     GWY_STOCK_ZOOM_1_1,
     GWY_STOCK_ZOOM_FIT,
diff --git a/app/toolbox.c b/app/toolbox.c
index e46a491..b2b9f80 100644
--- a/app/toolbox.c
+++ b/app/toolbox.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: toolbox.c 19071 2016-10-14 09:02:41Z yeti-dn $
- *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: toolbox.c 20134 2017-08-02 06:07:07Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -66,40 +66,45 @@ typedef struct {
     const gchar *tooltip;
 } Action;
 
-static GtkWidget* gwy_app_menu_create_info_menu    (GtkAccelGroup *accel_group);
-static GtkWidget* gwy_app_menu_create_file_menu    (GtkAccelGroup *accel_group);
-static GtkWidget* gwy_app_menu_create_edit_menu    (GtkAccelGroup *accel_group);
-static gboolean   gwy_toolbox_fill_builtin_action  (Action *action);
-static void       gwy_app_toolbox_showhide         (GtkWidget *expander);
-static void       show_user_guide                  (void);
-static void       show_message_log                 (void);
-static GtkWindow* create_message_log_window        (void);
-static void       toolbox_dnd_data_received        (GtkWidget *widget,
-                                                    GdkDragContext *context,
-                                                    gint x,
-                                                    gint y,
-                                                    GtkSelectionData *data,
-                                                    guint info,
-                                                    guint time_,
-                                                    gpointer user_data);
-static void       delete_app_window                (void);
-static void       action_zoom_in                   (void);
-static void       action_zoom_out                  (void);
-static void       action_zoom_1_1                  (void);
-static void       action_undo                      (void);
-static void       action_redo                      (void);
-static void       remove_all_logs                  (void);
-static void       toggle_edit_accelerators         (gpointer callback_data,
-                                                    gint callback_action,
-                                                    GtkCheckMenuItem *item);
-static void       toggle_logging_enabled           (gpointer callback_data,
-                                                    gint callback_action,
-                                                    GtkCheckMenuItem *item);
-static void       enable_edit_accelerators         (gboolean enable);
-static void       gwy_app_tool_use                 (const gchar *toolname,
-                                                    GtkToggleButton *button);
-static void       gwy_app_change_default_mask_color(void);
-static void       action_display_3d                (void);
+static GtkWidget*   gwy_app_menu_create_info_menu    (GtkAccelGroup *accel_group);
+static GtkWidget*   gwy_app_menu_create_file_menu    (GtkAccelGroup *accel_group);
+static GtkWidget*   gwy_app_menu_create_edit_menu    (GtkAccelGroup *accel_group);
+static gboolean     toolbox_mapped                   (GtkWidget *toolbox);
+static void         finalise_toolbox                 (GtkWidget *toolbox);
+static gboolean     gwy_toolbox_fill_builtin_action  (Action *action);
+static const gchar* gwy_toolbox_builtin_accel_path   (const gchar *name);
+static void         gwy_app_toolbox_showhide         (GtkWidget *expander);
+static void         show_user_guide                  (void);
+static void         show_message_log                 (void);
+static GtkWindow*   create_message_log_window        (void);
+static void         toolbox_dnd_data_received        (GtkWidget *widget,
+                                                      GdkDragContext *context,
+                                                      gint x,
+                                                      gint y,
+                                                      GtkSelectionData *data,
+                                                      guint info,
+                                                      guint time_,
+                                                      gpointer user_data);
+static void         delete_app_window                (void);
+static void         action_zoom_in                   (void);
+static void         action_zoom_out                  (void);
+static void         action_zoom_1_1                  (void);
+static void         action_undo                      (void);
+static void         action_redo                      (void);
+static void         remove_all_logs                  (void);
+static void         toggle_edit_accelerators         (gpointer callback_data,
+                                                      gint callback_action,
+                                                      GtkCheckMenuItem *item);
+static void         toggle_logging_enabled           (gpointer callback_data,
+                                                      gint callback_action,
+                                                      GtkCheckMenuItem *item);
+static void         enable_edit_accelerators         (gboolean enable);
+static void         gwy_app_tool_use                 (const gchar *toolname,
+                                                      GtkToggleButton *button);
+static void         gwy_app_change_default_mask_color(void);
+static void         action_display_3d                (void);
+
+static gulong toolbox_map_event_id = 0;
 
 /* Translatability hack, intltool seems overkill at this point. */
 #define GWY_TOOLBOX_IGNORE(x) /* */
@@ -279,7 +284,7 @@ static gboolean
 toolbox_start_item(GwyAppToolboxBuilder *builder,
                    const GwyToolboxItemSpec *ispec)
 {
-    const gchar *func = NULL, *stock_id = NULL;
+    const gchar *func = NULL, *stock_id = NULL, *accel_path;
     GtkWidget *button = NULL;
     GwyToolClass *tool_class;
     GType gtype;
@@ -402,6 +407,12 @@ toolbox_start_item(GwyAppToolboxBuilder *builder,
     if (!action.stock_id && stock_id)
         action.stock_id = g_quark_from_string(stock_id);
 
+    if (action.type == GWY_APP_ACTION_TYPE_BUILTIN) {
+        accel_path = gwy_toolbox_builtin_accel_path(func);
+        if (accel_path)
+            gtk_widget_set_accel_path(button, accel_path, builder->accel_group);
+    }
+
     if (!action.stock_id) {
         g_warning("Function %s::%s has no icon set",
                   gwy_toolbox_action_type_name(action.type), func);
@@ -420,6 +431,9 @@ toolbox_start_item(GwyAppToolboxBuilder *builder,
     }
 
     gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
+    GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_DEFAULT);
+    gtk_container_set_border_width(GTK_CONTAINER(button), 0);
+    gtk_widget_set_name(button, "toolboxbutton");
     gtk_table_attach_defaults(GTK_TABLE(builder->group), button,
                               builder->pos % builder->width,
                               builder->pos % builder->width + 1,
@@ -498,7 +512,7 @@ gwy_app_toolbox_build(GwyToolboxSpec *spec,
     guint i, j;
 
     gwy_clear(&builder, 1);
-    builder.width = spec->width ? spec->width : 4;
+    builder.width = spec->width ? spec->width : 5;
     builder.box = vbox;
     builder.tips = tips;
     builder.unseen_tools = g_ptr_array_new();
@@ -596,7 +610,6 @@ gwy_app_toolbox_window_create(void)
 
     spec = gwy_parse_toolbox_ui(FALSE);
     if (spec) {
-        /* TODO: free the spec upon exit so that it does not show as a leak. */
         gwy_app_toolbox_build(spec, vbox, gwy_app_get_tooltips(), accel_group);
         g_object_set_data(G_OBJECT(toolbox), "gwy-app-toolbox-spec", spec);
     }
@@ -611,17 +624,37 @@ gwy_app_toolbox_window_create(void)
     /***************************************************************/
     /* XXX */
     g_signal_connect(toolbox, "delete-event", G_CALLBACK(gwy_app_quit), NULL);
-
+    g_signal_connect(toolbox, "destroy", G_CALLBACK(finalise_toolbox), NULL);
+    toolbox_map_event_id = g_signal_connect_after(toolbox, "map-event",
+                                                  G_CALLBACK(toolbox_mapped),
+                                                  NULL);
     gtk_widget_show_all(toolbox);
 
     gwy_osx_get_menu_from_widget(container);
-    while (gtk_events_pending())
-        gtk_main_iteration_do(FALSE);
 
+    return toolbox;
+}
+
+static gboolean
+toolbox_mapped(GtkWidget *toolbox)
+{
+    g_return_val_if_fail(toolbox_map_event_id, FALSE);
     gwy_remote_setup(toolbox);
-    g_signal_connect(toolbox, "destroy", G_CALLBACK(gwy_remote_finalize), NULL);
+    g_signal_handler_disconnect(toolbox, toolbox_map_event_id);
+    toolbox_map_event_id = 0;
+    return FALSE;
+}
 
-    return toolbox;
+static void
+finalise_toolbox(GtkWidget *toolbox)
+{
+    GwyToolboxSpec *spec;
+
+    if ((spec = g_object_get_data(G_OBJECT(toolbox), "gwy-app-toolbox-spec"))) {
+        gwy_toolbox_spec_free(spec);
+        g_object_set_data(G_OBJECT(toolbox), "gwy-app-toolbox-spec", NULL);
+    }
+    gwy_remote_finalize(toolbox);
 }
 
 void
@@ -663,6 +696,14 @@ gwy_toolbox_get_builtins(guint *nspec)
             N_("Display a 3D view of data"), N_("Display a 3D view of data"),
         },
         {
+            "undo", GTK_STOCK_UNDO, &action_undo,
+            N_("Undo"), N_("Undo last action"),
+        },
+        {
+            "redo", GTK_STOCK_REDO, &action_redo,
+            N_("Redo"), N_("Redo again last undone action"),
+        },
+        {
             "zoom_in", GWY_STOCK_ZOOM_IN, &action_zoom_in,
             N_("Zoom in"), N_("Zoom in"),
         },
@@ -713,6 +754,24 @@ gwy_toolbox_fill_builtin_action(Action *action)
     return TRUE;
 }
 
+static const gchar*
+gwy_toolbox_builtin_accel_path(const gchar *name)
+{
+    static const gchar *paths[] = {
+        "display_3d", "<builtin>/Display 3D",
+        "zoom_in", "<builtin>/Zoom In",
+        "zoom_out", "<builtin>/Zoom Out",
+        "zoom_1_1", "<builtin>/Zoom 1:1",
+    };
+    guint i;
+
+    for (i = 0; i < G_N_ELEMENTS(paths); i += 2) {
+        if (gwy_strequal(paths[i], name))
+            return paths[i+1];
+    }
+    return NULL;
+}
+
 /*************************************************************************/
 static GtkWidget*
 gwy_app_menu_create_info_menu(GtkAccelGroup *accel_group)
diff --git a/app/toolbox.xml b/app/toolbox.xml
index d22d0a3..7343f3b 100644
--- a/app/toolbox.xml
+++ b/app/toolbox.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<toolbox width='4'>
+<toolbox width='5'>
   <group id='view' title='View' translatable='true'>
     <item type='builtin' function='zoom_in'/>
     <item type='builtin' function='zoom_1_1'/>
@@ -26,6 +26,9 @@
   <group id='graph' title='Graph' translatable='true'>
     <item type='graph' function='graph_cd'/>
     <item type='graph' function='graph_fit'/>
+    <item type='graph' function='graph_level'/>
+    <item type='graph' function='graph_align'/>
+    <item type='graph' function='graph_export_ascii'/>
   </group>
   <group id='tool' title='Tools' translatable='true'>
     <item type='tool' function='GwyToolReadValue'/>
diff --git a/app/undo.c b/app/undo.c
index 90555d0..5a722f3 100644
--- a/app/undo.c
+++ b/app/undo.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: undo.c 19043 2016-10-08 18:58:43Z yeti-dn $
+ *  @(#) $Id: undo.c 19322 2016-11-28 11:16:41Z yeti-dn $
  *  Copyright (C) 2003-2006,2014 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -1146,6 +1146,9 @@ gwy_undo_get_enabled(void)
 void
 gwy_undo_set_enabled(gboolean setting)
 {
+    if (undo_disabled == !setting)
+        return;
+
     undo_disabled = !setting;
     /* Remove all data when disabling */
     if (undo_disabled) {
diff --git a/app/validate.c b/app/validate.c
index 1ca809a..b6d3195 100644
--- a/app/validate.c
+++ b/app/validate.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: validate.c 19043 2016-10-08 18:58:43Z yeti-dn $
+ *  @(#) $Id: validate.c 19303 2016-11-21 09:52:59Z yeti-dn $
  *  Copyright (C) 2007-2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -694,6 +694,48 @@ gwy_data_error_desrcibe(GwyDataError error)
     return errors[error];
 }
 
+static void
+enforce_one_graph_order(G_GNUC_UNUSED gpointer hash_key,
+                        gpointer hash_value,
+                        gpointer user_data)
+{
+    GValue *gvalue = (GValue*)hash_value;
+    guint *nfailures = (guint*)user_data;
+    GObject *object;
+    GwyGraphModel *gmodel;
+    GwyGraphCurveModel *gcmodel;
+    gboolean failed = FALSE;
+    guint n, i;
+
+    if (!G_VALUE_HOLDS(gvalue, G_TYPE_OBJECT))
+        return;
+
+    object = g_value_get_object(gvalue);
+    if (!GWY_IS_GRAPH_MODEL(object))
+        return;
+
+    gmodel = (GwyGraphModel*)object;
+    n = gwy_graph_model_get_n_curves(gmodel);
+    for (i = 0; i < n; i++) {
+        gcmodel = gwy_graph_model_get_curve(gmodel, i);
+        if (!gwy_graph_curve_model_is_ordered(gcmodel)) {
+            gwy_graph_curve_model_enforce_order(gcmodel);
+            failed = TRUE;
+        }
+    }
+    if (failed)
+        (*nfailures)++;
+}
+
+/* XXX: Can we get this to public validate API?  And should we? */
+guint
+_gwy_app_enforce_graph_abscissae_order(GwyContainer *data)
+{
+    guint nfailures = 0;
+    gwy_container_foreach(data, NULL, enforce_one_graph_order, &nfailures);
+    return nfailures;
+}
+
 /************************** Documentation ****************************/
 
 /**
diff --git a/app/wait.c b/app/wait.c
index 8cf331f..62689e2 100644
--- a/app/wait.c
+++ b/app/wait.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: wait.c 18678 2016-05-04 11:30:23Z yeti-dn $
- *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: wait.c 19935 2017-06-19 08:39:44Z yeti-dn $
+ *  Copyright (C) 2004-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -28,6 +28,8 @@ static void gwy_app_wait_create_dialog (GtkWindow *window,
                                         const gchar *message);
 static void gwy_app_wait_cancelled      (void);
 
+static gboolean wait_enabled = TRUE;
+
 static GtkWidget *dialog = NULL;
 static GtkWidget *progress = NULL;
 static GtkWidget *label = NULL;
@@ -53,6 +55,9 @@ void
 gwy_app_wait_start(GtkWindow *window,
                    const gchar *message)
 {
+    if (!wait_enabled)
+        return;
+
     if (window && !GTK_IS_WINDOW(window))
         g_warning("Widget is not a window");
 
@@ -84,6 +89,9 @@ gwy_app_wait_start(GtkWindow *window,
 void
 gwy_app_wait_finish(void)
 {
+    if (!wait_enabled)
+        return;
+
     if (cancelled) {
         cancelled = FALSE;
         return;
@@ -153,6 +161,9 @@ gwy_app_wait_create_dialog(GtkWindow *window,
 gboolean
 gwy_app_wait_set_message(const gchar *message)
 {
+    if (!wait_enabled)
+        return TRUE;
+
     g_return_val_if_fail(dialog, FALSE);
 
     while (gtk_events_pending())
@@ -193,6 +204,9 @@ gwy_app_wait_set_message(const gchar *message)
 gboolean
 gwy_app_wait_set_message_prefix(const gchar *prefix)
 {
+    if (!wait_enabled)
+        return TRUE;
+
     g_return_val_if_fail(dialog, FALSE);
 
     if (cancelled)
@@ -230,6 +244,9 @@ gwy_app_wait_set_fraction(gdouble fraction)
     gchar buf[8];
     gdouble t;
 
+    if (!wait_enabled)
+        return TRUE;
+
     g_return_val_if_fail(dialog, FALSE);
 
     t = g_timer_elapsed(timer, NULL);
@@ -282,6 +299,9 @@ gwy_app_wait_cursor_start(GtkWindow *window)
     GdkWindow *wait_window;
     GtkWidget *widget;
 
+    if (!window && !wait_enabled)
+        return;
+
     g_return_if_fail(GTK_IS_WINDOW(window));
     widget = GTK_WIDGET(window);
 
@@ -321,6 +341,9 @@ gwy_app_wait_cursor_finish(GtkWindow *window)
     GdkWindow *wait_window;
     GtkWidget *widget;
 
+    if (!window && !wait_enabled)
+        return;
+
     g_return_if_fail(GTK_IS_WINDOW(window));
     widget = GTK_WIDGET(window);
 
@@ -337,6 +360,74 @@ gwy_app_wait_cursor_finish(GtkWindow *window)
         gtk_main_iteration_do(FALSE);
 }
 
+/**
+ * gwy_app_wait_get_enabled:
+ *
+ * Reports whether progress reporting is globally enabled.
+ *
+ * Returns: %TRUE if progress reporting is enabled, %FALSE if it is disabled.
+ *
+ * Since: 2.48
+ **/
+gboolean
+gwy_app_wait_get_enabled(void)
+{
+    return wait_enabled;
+}
+
+/**
+ * gwy_app_wait_set_enabled:
+ * @setting: %TRUE to enable progress reporting, %FALSE to disable it.
+ *
+ * Globally enables or disables progress reporting.
+ *
+ * This function may not be used when a waiting dialog is currently being
+ * shown.
+ *
+ * By default, progress reporting is enabled.  Non-GUI applications that run
+ * module functions may wish to disable it to avoid GTK+ calls or just showing
+ * the progress dialogs.
+ *
+ * If progress reporting is disabled then functions such as
+ * gwy_app_wait_set_message() and gwy_app_wait_set_fraction() become no-op and
+ * always return %TRUE as nothing can be cancelled by the user.  Functions
+ * gwy_app_wait_cursor_start() and gwy_app_wait_cursor_finish() still work but
+ * may be called with %NULL arguments.
+ *
+ * Since: 2.48
+ **/
+void
+gwy_app_wait_set_enabled(gboolean setting)
+{
+    if (!wait_enabled == !setting)
+        return;
+
+    g_return_if_fail(dialog);
+    g_return_if_fail(cancelled);
+    wait_enabled = !!setting;
+}
+
+/**
+ * gwy_app_wait_was_canceled:
+ *
+ * Checks if a progress dialog was cancelled.
+ *
+ * Calling this function is only meaningful between gwy_app_wait_cursor_start()
+ * and gwy_app_wait_finish().  It returns %TRUE if the computation was
+ * cancelled by the user.  This may be occasionaly useful in complex
+ * multi-level calculations.  Usually, the return values of
+ * gwy_app_wait_set_fraction() and gwy_app_wait_set_message() are sufficient.
+ *
+ * Returns: %TRUE if the currently running calculation was cancelled.
+ *
+ * Since: 2.49
+ **/
+gboolean
+gwy_app_wait_was_canceled(void)
+{
+    return cancelled;
+}
+
 /************************** Documentation ****************************/
 
 /**
diff --git a/app/wait.h b/app/wait.h
index 01260f4..f82f34f 100644
--- a/app/wait.h
+++ b/app/wait.h
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: wait.h 15598 2013-11-11 12:33:32Z yeti-dn $
- *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: wait.h 19935 2017-06-19 08:39:44Z yeti-dn $
+ *  Copyright (C) 2004-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -26,15 +26,17 @@
 
 G_BEGIN_DECLS
 
-void     gwy_app_wait_start              (GtkWindow *window,
-                                          const gchar *message);
-void     gwy_app_wait_finish             (void);
-gboolean gwy_app_wait_set_fraction       (gdouble fraction);
-gboolean gwy_app_wait_set_message        (const gchar *message);
-gboolean gwy_app_wait_set_message_prefix (const gchar *prefix);
-
-void     gwy_app_wait_cursor_start       (GtkWindow *window);
-void     gwy_app_wait_cursor_finish      (GtkWindow *window);
+void     gwy_app_wait_start             (GtkWindow *window,
+                                         const gchar *message);
+void     gwy_app_wait_finish            (void);
+gboolean gwy_app_wait_set_fraction      (gdouble fraction);
+gboolean gwy_app_wait_set_message       (const gchar *message);
+gboolean gwy_app_wait_set_message_prefix(const gchar *prefix);
+void     gwy_app_wait_cursor_start      (GtkWindow *window);
+void     gwy_app_wait_cursor_finish     (GtkWindow *window);
+gboolean gwy_app_wait_get_enabled       (void);
+void     gwy_app_wait_set_enabled       (gboolean setting);
+gboolean gwy_app_wait_was_canceled      (void);
 
 G_END_DECLS
 
diff --git a/config.guess b/config.guess
index dbfb978..2e9ad7f 100755
--- a/config.guess
+++ b/config.guess
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright 1992-2015 Free Software Foundation, Inc.
+#   Copyright 1992-2016 Free Software Foundation, Inc.
 
-timestamp='2015-01-01'
+timestamp='2016-10-02'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -27,7 +27,7 @@ timestamp='2015-01-01'
 # Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
 #
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
 #
 # Please send patches to <config-patches at gnu.org>.
 
@@ -50,7 +50,7 @@ version="\
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright 1992-2015 Free Software Foundation, Inc.
+Copyright 1992-2016 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -168,19 +168,29 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	# Note: NetBSD doesn't particularly care about the vendor
 	# portion of the name.  We always set it to "unknown".
 	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+	    /sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || \
+	    echo unknown)`
 	case "${UNAME_MACHINE_ARCH}" in
 	    armeb) machine=armeb-unknown ;;
 	    arm*) machine=arm-unknown ;;
 	    sh3el) machine=shl-unknown ;;
 	    sh3eb) machine=sh-unknown ;;
 	    sh5el) machine=sh5le-unknown ;;
+	    earmv*)
+		arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+		machine=${arch}${endian}-unknown
+		;;
 	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
 	esac
 	# The Operating System including object format, if it has switched
-	# to ELF recently, or will in the future.
+	# to ELF recently (or will in the future) and ABI.
 	case "${UNAME_MACHINE_ARCH}" in
+	    earm*)
+		os=netbsdelf
+		;;
 	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
 		eval $set_cc_for_build
 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
@@ -197,6 +207,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 		os=netbsd
 		;;
 	esac
+	# Determine ABI tags.
+	case "${UNAME_MACHINE_ARCH}" in
+	    earm*)
+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+		abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+		;;
+	esac
 	# The OS release
 	# Debian GNU/NetBSD machines have a different userland, and
 	# thus, need a distinct triplet. However, they do not need
@@ -207,13 +224,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 		release='-gnu'
 		;;
 	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
 		;;
 	esac
 	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
 	# contains redundant information, the shorter form:
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
+	echo "${machine}-${os}${release}${abi}"
 	exit ;;
     *:Bitrig:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
@@ -223,6 +240,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
 	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
 	exit ;;
+    *:LibertyBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
+	exit ;;
     *:ekkoBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
 	exit ;;
@@ -235,6 +256,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     *:MirBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
 	exit ;;
+    *:Sortix:*:*)
+	echo ${UNAME_MACHINE}-unknown-sortix
+	exit ;;
     alpha:OSF1:*:*)
 	case $UNAME_RELEASE in
 	*4.0)
@@ -251,42 +275,42 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
 	case "$ALPHA_CPU_TYPE" in
 	    "EV4 (21064)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
+		UNAME_MACHINE=alphaev5 ;;
 	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
+		UNAME_MACHINE=alphaev56 ;;
 	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
+		UNAME_MACHINE=alphapca56 ;;
 	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
+		UNAME_MACHINE=alphapca57 ;;
 	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
+		UNAME_MACHINE=alphaev6 ;;
 	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
+		UNAME_MACHINE=alphaev67 ;;
 	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
+		UNAME_MACHINE=alphaev69 ;;
 	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
+		UNAME_MACHINE=alphaev7 ;;
 	    "EV7.9 (21364A)")
-		UNAME_MACHINE="alphaev79" ;;
+		UNAME_MACHINE=alphaev79 ;;
 	esac
 	# A Pn.n version is a patched version.
 	# A Vn.n version is a released version.
 	# A Tn.n version is a released field test version.
 	# A Xn.n version is an unreleased experimental baselevel.
 	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
 	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
 	exitcode=$?
 	trap '' 0
@@ -359,16 +383,16 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	exit ;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
 	eval $set_cc_for_build
-	SUN_ARCH="i386"
+	SUN_ARCH=i386
 	# If there is a compiler, see if it is configured for 64-bit objects.
 	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
 	# This test works for both compilers.
-	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
 	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
 		grep IS_64BIT_ARCH >/dev/null
 	    then
-		SUN_ARCH="x86_64"
+		SUN_ARCH=x86_64
 	    fi
 	fi
 	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
@@ -393,7 +417,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	exit ;;
     sun*:*:4.2BSD:*)
 	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3
 	case "`/bin/arch`" in
 	    sun3)
 		echo m68k-sun-sunos${UNAME_RELEASE}
@@ -618,13 +642,13 @@ EOF
 		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
 		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
 		    case "${sc_cpu_version}" in
-		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
 		      532)                      # CPU_PA_RISC2_0
 			case "${sc_kernel_bits}" in
-			  32) HP_ARCH="hppa2.0n" ;;
-			  64) HP_ARCH="hppa2.0w" ;;
-			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+			  32) HP_ARCH=hppa2.0n ;;
+			  64) HP_ARCH=hppa2.0w ;;
+			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
 			esac ;;
 		    esac
 		fi
@@ -663,11 +687,11 @@ EOF
 		    exit (0);
 		}
 EOF
-		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
 		    test -z "$HP_ARCH" && HP_ARCH=hppa
 		fi ;;
 	esac
-	if [ ${HP_ARCH} = "hppa2.0w" ]
+	if [ ${HP_ARCH} = hppa2.0w ]
 	then
 	    eval $set_cc_for_build
 
@@ -680,12 +704,12 @@ EOF
 	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
 	    # => hppa64-hp-hpux11.23
 
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
 		grep -q __LP64__
 	    then
-		HP_ARCH="hppa2.0w"
+		HP_ARCH=hppa2.0w
 	    else
-		HP_ARCH="hppa64"
+		HP_ARCH=hppa64
 	    fi
 	fi
 	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
@@ -790,14 +814,14 @@ EOF
 	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 	exit ;;
     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
 	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
 	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
 	exit ;;
     5000:UNIX_System_V:4.*:*)
-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
 	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
 	exit ;;
     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
@@ -879,7 +903,7 @@ EOF
 	exit ;;
     *:GNU/*:*:*)
 	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
 	exit ;;
     i*86:Minix:*:*)
 	echo ${UNAME_MACHINE}-pc-minix
@@ -902,7 +926,7 @@ EOF
 	  EV68*) UNAME_MACHINE=alphaev68 ;;
 	esac
 	objdump --private-headers /bin/sh | grep -q ld.so.1
-	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     arc:Linux:*:* | arceb:Linux:*:*)
@@ -933,6 +957,9 @@ EOF
     crisv32:Linux:*:*)
 	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 	exit ;;
+    e2k:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     frv:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
@@ -945,6 +972,9 @@ EOF
     ia64:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
+    k1om:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     m32r*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
@@ -970,6 +1000,9 @@ EOF
 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
 	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
 	;;
+    mips64el:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     openrisc*:Linux:*:*)
 	echo or1k-unknown-linux-${LIBC}
 	exit ;;
@@ -1002,6 +1035,9 @@ EOF
     ppcle:Linux:*:*)
 	echo powerpcle-unknown-linux-${LIBC}
 	exit ;;
+    riscv32:Linux:*:* | riscv64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     s390:Linux:*:* | s390x:Linux:*:*)
 	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
 	exit ;;
@@ -1021,7 +1057,7 @@ EOF
 	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
 	exit ;;
     x86_64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 	exit ;;
     xtensa*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
@@ -1100,7 +1136,7 @@ EOF
 	# uname -m prints for DJGPP always 'pc', but it prints nothing about
 	# the processor, so we play safe by assuming i586.
 	# Note: whatever this is, it MUST be the same as what config.sub
-	# prints for the "djgpp" host, or else GDB configury will decide that
+	# prints for the "djgpp" host, or else GDB configure will decide that
 	# this is a cross-build.
 	echo i586-pc-msdosdjgpp
 	exit ;;
@@ -1249,6 +1285,9 @@ EOF
     SX-8R:SUPER-UX:*:*)
 	echo sx8r-nec-superux${UNAME_RELEASE}
 	exit ;;
+    SX-ACE:SUPER-UX:*:*)
+	echo sxace-nec-superux${UNAME_RELEASE}
+	exit ;;
     Power*:Rhapsody:*:*)
 	echo powerpc-apple-rhapsody${UNAME_RELEASE}
 	exit ;;
@@ -1262,9 +1301,9 @@ EOF
 	    UNAME_PROCESSOR=powerpc
 	fi
 	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
-	    if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
 		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		    (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		    (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
 		    grep IS_64BIT_ARCH >/dev/null
 		then
 		    case $UNAME_PROCESSOR in
@@ -1286,7 +1325,7 @@ EOF
 	exit ;;
     *:procnto*:*:* | *:QNX:[0123456789]*:*)
 	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
+	if test "$UNAME_PROCESSOR" = x86; then
 		UNAME_PROCESSOR=i386
 		UNAME_MACHINE=pc
 	fi
@@ -1317,7 +1356,7 @@ EOF
 	# "uname -m" is not consistent, so use $cputype instead. 386
 	# is converted to i386 for consistency with other x86
 	# operating systems.
-	if test "$cputype" = "386"; then
+	if test "$cputype" = 386; then
 	    UNAME_MACHINE=i386
 	else
 	    UNAME_MACHINE="$cputype"
@@ -1359,7 +1398,7 @@ EOF
 	echo i386-pc-xenix
 	exit ;;
     i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'`
 	exit ;;
     i*86:rdos:*:*)
 	echo ${UNAME_MACHINE}-pc-rdos
@@ -1370,23 +1409,25 @@ EOF
     x86_64:VMkernel:*:*)
 	echo ${UNAME_MACHINE}-unknown-esx
 	exit ;;
+    amd64:Isilon\ OneFS:*:*)
+	echo x86_64-unknown-onefs
+	exit ;;
 esac
 
 cat >&2 <<EOF
 $0: unable to guess system type
 
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite
+config.guess and config.sub with the latest versions from:
 
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
 and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches at gnu.org> in order to provide the needed
-information to handle your system.
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches at gnu.org to
+provide the necessary information to handle your system.
 
 config.guess timestamp = $timestamp
 
diff --git a/config.h.in b/config.h.in
index 881216a..a0d9189 100644
--- a/config.h.in
+++ b/config.h.in
@@ -31,9 +31,6 @@
 /* Define if we have the OpenEXR package. */
 #undef HAVE_EXR
 
-/* Define if we have the FFTW3 package. */
-#undef HAVE_FFTW3
-
 /* Define if the GNU gettext() function is already present or preinstalled. */
 #undef HAVE_GETTEXT
 
diff --git a/config.sub b/config.sub
index 6467c95..7b334f9 100755
--- a/config.sub
+++ b/config.sub
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright 1992-2015 Free Software Foundation, Inc.
+#   Copyright 1992-2016 Free Software Foundation, Inc.
 
-timestamp='2015-01-01'
+timestamp='2016-09-05'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -33,7 +33,7 @@ timestamp='2015-01-01'
 # Otherwise, we print the canonical config type on stdout and succeed.
 
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 
 # This file is supposed to be the same for all GNU packages
 # and recognize all the CPU types, system types and aliases
@@ -53,8 +53,7 @@ timestamp='2015-01-01'
 me=`echo "$0" | sed -e 's,.*/,,'`
 
 usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
 
 Canonicalize a configuration name.
 
@@ -68,7 +67,7 @@ Report bugs and patches to <config-patches at gnu.org>."
 version="\
 GNU config.sub ($timestamp)
 
-Copyright 1992-2015 Free Software Foundation, Inc.
+Copyright 1992-2016 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -117,8 +116,8 @@ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
   linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | \
-  kopensolaris*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
+  kopensolaris*-gnu* | cloudabi*-eabi* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
@@ -255,11 +254,12 @@ case $basic_machine in
 	| arc | arceb \
 	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
 	| avr | avr32 \
+	| ba \
 	| be32 | be64 \
 	| bfin \
 	| c4x | c8051 | clipper \
 	| d10v | d30v | dlx | dsp16xx \
-	| epiphany \
+	| e2k | epiphany \
 	| fido | fr30 | frv | ft32 \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 	| hexagon \
@@ -305,7 +305,7 @@ case $basic_machine in
 	| riscv32 | riscv64 \
 	| rl78 | rx \
 	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
@@ -376,12 +376,13 @@ case $basic_machine in
 	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 	| avr-* | avr32-* \
+	| ba-* \
 	| be32-* | be64-* \
 	| bfin-* | bs2000-* \
 	| c[123]* | c30-* | [cjt]90-* | c4x-* \
 	| c8051-* | clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
+	| e2k-* | elxsi-* \
 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
@@ -428,12 +429,13 @@ case $basic_machine in
 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
 	| pyramid-* \
+	| riscv32-* | riscv64-* \
 	| rl78-* | romp-* | rs6000-* | rx-* \
 	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
 	| tahoe-* \
 	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
 	| tile*-* \
@@ -518,6 +520,9 @@ case $basic_machine in
 		basic_machine=i386-pc
 		os=-aros
 		;;
+	asmjs)
+		basic_machine=asmjs-unknown
+		;;
 	aux)
 		basic_machine=m68k-apple
 		os=-aux
@@ -638,6 +643,14 @@ case $basic_machine in
 		basic_machine=m68k-bull
 		os=-sysv3
 		;;
+	e500v[12])
+		basic_machine=powerpc-unknown
+		os=$os"spe"
+		;;
+	e500v[12]-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=$os"spe"
+		;;
 	ebmon29k)
 		basic_machine=a29k-amd
 		os=-ebmon
@@ -1017,7 +1030,7 @@ case $basic_machine in
 	ppc-* | ppcbe-*)
 		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
 		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
+	ppcle | powerpclittle)
 		basic_machine=powerpcle-unknown
 		;;
 	ppcle-* | powerpclittle-*)
@@ -1027,7 +1040,7 @@ case $basic_machine in
 		;;
 	ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
 		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+	ppc64le | powerpc64little)
 		basic_machine=powerpc64le-unknown
 		;;
 	ppc64le-* | powerpc64little-*)
@@ -1373,18 +1386,18 @@ case $os in
 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
 	      | -sym* | -kopensolaris* | -plan9* \
 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
+	      | -aos* | -aros* | -cloudabi* | -sortix* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -bitrig* | -openbsd* | -solidbsd* \
+	      | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
 	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
 	      | -chorusos* | -chorusrdb* | -cegcc* \
 	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+	      | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
 	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
 	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
@@ -1393,7 +1406,8 @@ case $os in
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
+	      | -onefs* | -tirtos* | -phoenix*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1525,6 +1539,8 @@ case $os in
 		;;
 	-nacl*)
 		;;
+	-ios)
+		;;
 	-none)
 		;;
 	*)
diff --git a/configure b/configure
index db84289..7ac219d 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for Gwyddion 2.47.
+# Generated by GNU Autoconf 2.69 for Gwyddion 2.49.
 #
 # Report bugs to <klapetek at gwyddion.net>.
 #
@@ -650,8 +650,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='Gwyddion'
 PACKAGE_TARNAME='gwyddion'
-PACKAGE_VERSION='2.47'
-PACKAGE_STRING='Gwyddion 2.47'
+PACKAGE_VERSION='2.49'
+PACKAGE_STRING='Gwyddion 2.49'
 PACKAGE_BUGREPORT='klapetek at gwyddion.net'
 PACKAGE_URL=''
 
@@ -773,9 +773,6 @@ GTKGLEXT_CFLAGS
 GTKSOURCEVIEW_DEPENDENCY
 GTKSOURCEVIEW_LIBS
 GTKSOURCEVIEW_CFLAGS
-FFTW3_DEPENDENCY
-FFTW3_1_LIBS
-FFTW3_1_CFLAGS
 FFTW3_LIBS
 FFTW3_CFLAGS
 GTK_LIBS
@@ -797,6 +794,7 @@ X_LIBS
 X_PRE_LIBS
 X_CFLAGS
 XMKMF
+HDRIMAGE_EXTRA_CFLAGS
 GTKDOC_EXTRA_CFLAGS
 PYTHON_EXTRA_CFLAGS
 HAVE_PASCAL_FALSE
@@ -816,13 +814,9 @@ ENABLE_PYGWY_TRUE
 PYGTK_CODEGENDIR
 PYGTK_LIBS
 PYGTK_CFLAGS
+PYTHON_LDFLAGS
 PYTHON_INCLUDES
-PYTHON_LIBS
-PYTHON_SYSCFG_LIBDIR
-PYTHON_SYSCFG_LINKFORSHARED
-PYTHON_SYSCFG_CCSHARED
-PYTHON_SYSCFG_LDFLAGS
-PYTHON_SYSCFG_BASECFLAGS
+PYTHON_CONFIG
 HAVE_PYTHON_FALSE
 HAVE_PYTHON_TRUE
 pkgpyexecdir
@@ -834,6 +828,8 @@ PYTHON_EXEC_PREFIX
 PYTHON_PREFIX
 PYTHON_VERSION
 PYTHON
+PNGCRUSH
+INKSCAPE
 GCONF_SCHEMA_FILE_DIR
 GCONF_SCHEMA_CONFIG_SOURCE
 GCONFTOOL
@@ -843,6 +839,10 @@ DESKTOP_FILE_UPDATE_FALSE
 DESKTOP_FILE_UPDATE_TRUE
 UPDATE_MIME_DATABASE
 UPDATE_DESKTOP_DATABASE
+GLIB_GENMARSHAL
+GLIB_MKENUMS
+MODULE_BUNDLING_FALSE
+MODULE_BUNDLING_TRUE
 MODULE_DEPENDENCIES_FALSE
 MODULE_DEPENDENCIES_TRUE
 XDG_DATA_HOME_DIR
@@ -1008,6 +1008,7 @@ with_html_dir
 enable_gtk_doc
 enable_home_installation
 enable_library_bloat
+enable_module_bundling
 enable_desktop_file_update
 with_gconf_source
 with_gconf_schema_file_dir
@@ -1018,7 +1019,6 @@ with_perl
 with_ruby
 with_pascal
 with_x
-with_fftw3
 with_gtksourceview
 with_gl
 with_zlib
@@ -1065,8 +1065,6 @@ GTK_CFLAGS
 GTK_LIBS
 FFTW3_CFLAGS
 FFTW3_LIBS
-FFTW3_1_CFLAGS
-FFTW3_1_LIBS
 GTKSOURCEVIEW_CFLAGS
 GTKSOURCEVIEW_LIBS
 GTKGLEXT_CFLAGS
@@ -1628,7 +1626,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures Gwyddion 2.47 to adapt to many kinds of systems.
+\`configure' configures Gwyddion 2.49 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1702,7 +1700,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of Gwyddion 2.47:";;
+     short | recursive ) echo "Configuration of Gwyddion 2.49:";;
    esac
   cat <<\_ACEOF
 
@@ -1728,16 +1726,18 @@ Optional Features:
   --enable-home-installation
                           Install desktop integration files into your home
   --enable-library-bloat  Make linking very slow
+  --enable-module-bundling
+                          Bundling modules to one big shared library
+                          [default=yes]
   --enable-desktop-file-update
                           Update Freedesktop databases
-                          [default=][]
+                          [default=yes]
   --disable-schemas-install
                           Disable the schemas installation
   --enable-pygwy          Build Python wrapper to Gwyddion
   --disable-nls           do not use Native Language Support
   --disable-rpath         do not hardcode runtime library paths
-  --enable-plugin-proxy   Build plug-in proxy module
-                          [default=][]
+  --enable-plugin-proxy   Build plug-in proxy module [default=yes]
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -1756,29 +1756,24 @@ Optional Packages:
   --with-gconf-schema-file-dir=dir
                           Directory for installing schema files.
   --with-python           Install Python modules and plug-ins
-                          [default=][]
+                          [default=yes]
   --with-perl             Install Perl modules and plug-ins
-                          [default=][]
+                          [default=yes]
   --with-ruby             Install Ruby modules and plug-ins
-                          [default=][]
+                          [default=yes]
   --with-pascal           Build sample Pascal plug-ins
-                          [default=][]
+                          [default=yes]
   --with-x                use the X Window System
-  --with-fftw3            FFTW3 library [default=][]
   --with-gtksourceview    Better Pygwy console user interface
-                          [default=][]
-  --with-gl               OpenGL 3D view widgets
-                          [default=][]
-  --with-zlib             build with zlib support
-                          [default=][]
-  --with-bzip2            build with bzip2 support
-                          [default=][]
-  --with-libxml2          build with libxml2 support
-                          [default=][]
+                          [default=yes]
+  --with-gl               OpenGL 3D view widgets [default=yes]
+  --with-zlib             build with zlib support [default=yes]
+  --with-bzip2            build with bzip2 support [default=yes]
+  --with-libxml2          build with libxml2 support [default=yes]
   --with-unique           libunique remote control backend
-                          [default=][]
+                          [default=yes]
   --with-kde4-thumbnailer KDE4 thumbnail creator module
-                          [default=][no]
+                          [default=no]
   --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
   --with-libiconv-prefix[=DIR]  search for libiconv in DIR/include and DIR/lib
   --without-libiconv-prefix     don't search for libiconv in includedir and libdir
@@ -1828,10 +1823,6 @@ Some influential environment variables:
   FFTW3_CFLAGS
               C compiler flags for FFTW3, overriding pkg-config
   FFTW3_LIBS  linker flags for FFTW3, overriding pkg-config
-  FFTW3_1_CFLAGS
-              C compiler flags for FFTW3_1, overriding pkg-config
-  FFTW3_1_LIBS
-              linker flags for FFTW3_1, overriding pkg-config
   GTKSOURCEVIEW_CFLAGS
               C compiler flags for GTKSOURCEVIEW, overriding pkg-config
   GTKSOURCEVIEW_LIBS
@@ -1930,7 +1921,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-Gwyddion configure 2.47
+Gwyddion configure 2.49
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2694,7 +2685,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by Gwyddion $as_me 2.47, which was
+It was created by Gwyddion $as_me 2.49, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3050,7 +3041,7 @@ PACKAGE_URL="http://gwyddion.net/"
 
 
 
-ac_config_files="$ac_config_files Makefile m4/Makefile app/Makefile libdraw/Makefile libgwyddion/Makefile libgwyddion/gwyversion.h libgwydgets/Makefile libgwymodule/Makefile libprocess/Makefile modules/Makefile modules/file/Makefile modules/graph/Makefile modules/layer/Makefile modules/process/Makefile modules/pygwy/Makefile modules/tools/Makefile modules/volume/Makefile modules/xyz/Makefile plugins/Makefile plugins/file/Makefile plugins/process/Makefile pixmaps/Makefile po/Makefile.in p [...]
+ac_config_files="$ac_config_files Makefile m4/Makefile app/Makefile libdraw/Makefile libgwyddion/Makefile libgwyddion/gwyversion.h libgwydgets/Makefile libgwymodule/Makefile libprocess/Makefile modules/Makefile modules/file/Makefile modules/graph/Makefile modules/layer/Makefile modules/process/Makefile modules/pygwy/Makefile modules/tools/Makefile modules/volume/Makefile modules/xyz/Makefile plugins/Makefile plugins/file/Makefile plugins/process/Makefile pixmaps/Makefile pixmaps/src/Make [...]
 
 ac_config_headers="$ac_config_headers config.h"
 
@@ -3641,7 +3632,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='gwyddion'
- VERSION='2.47'
+ VERSION='2.49'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3798,8 +3789,8 @@ AM_BACKSLASH='\'
 
 
 GWY_VERSION_MAJOR=2
-GWY_VERSION_MINOR=47
-GWY_VERSION_STRING='"2.47"'
+GWY_VERSION_MINOR=49
+GWY_VERSION_STRING='"2.49"'
 
 
 
@@ -17134,14 +17125,14 @@ fi
 
   if test x$enable_gtk_doc = xyes; then
     if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-doc >= 1.10\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "gtk-doc >= 1.10") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-doc >= 1.12\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gtk-doc >= 1.12") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
   :
 else
-  as_fn_error $? "You need to have gtk-doc >= 1.10 installed to build documentation" "$LINENO" 5
+  as_fn_error $? "You need to have gtk-doc >= 1.12 installed to build documentation" "$LINENO" 5
 fi
   fi
 
@@ -17185,11 +17176,7 @@ fi
 
 
 #############################################################################
-# 64bit (for FFTW 3.0 warning)
-# Unfortunately, AC_CHECK_SIZEOF() is capable only of preprocessor symbol
-# production while we need to know the size now.  We don't care much about
-# the exact model: if pointers are larger than 32bit it can possibly break,
-# and so we will warn.
+# 32bit/64bit
 # The cast to long int works around a bug in the HP C Compiler
 # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
 # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
@@ -17316,7 +17303,7 @@ fi
 
 
 #############################################################################
-# Module symbol resolution.
+# Module symbol resolution and bundling.
 # We try not to link modules with libraries and let symbols resolve through
 # app, because it means faster app startup and much faster compilation.  But
 # on some systems that isn't possible.
@@ -17340,6 +17327,114 @@ else
 fi
 
 
+
+# Check whether --enable-module-bundling was given.
+if test "${enable_module_bundling+set}" = set; then :
+  enableval=$enable_module_bundling; case "${enableval}" in
+     yes|no) enable_module_bundling="$enableval" ;;
+     *) as_fn_error $? "bad value ${enableval} for --enable-module-bundling" "$LINENO" 5 ;;
+   esac
+else
+  enable_module_bundling=yes
+fi
+
+
+ if test "x$enable_module_bundling" = xyes; then
+  MODULE_BUNDLING_TRUE=
+  MODULE_BUNDLING_FALSE='#'
+else
+  MODULE_BUNDLING_TRUE='#'
+  MODULE_BUNDLING_FALSE=
+fi
+
+
+#############################################################################
+# GLib tools
+for ac_prog in glib-mkenums
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_GLIB_MKENUMS+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$GLIB_MKENUMS"; then
+  ac_cv_prog_GLIB_MKENUMS="$GLIB_MKENUMS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_GLIB_MKENUMS="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+GLIB_MKENUMS=$ac_cv_prog_GLIB_MKENUMS
+if test -n "$GLIB_MKENUMS"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_MKENUMS" >&5
+$as_echo "$GLIB_MKENUMS" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$GLIB_MKENUMS" && break
+done
+
+for ac_prog in glib-genmarshal
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_GLIB_GENMARSHAL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$GLIB_GENMARSHAL"; then
+  ac_cv_prog_GLIB_GENMARSHAL="$GLIB_GENMARSHAL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_GLIB_GENMARSHAL="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+GLIB_GENMARSHAL=$ac_cv_prog_GLIB_GENMARSHAL
+if test -n "$GLIB_GENMARSHAL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_GENMARSHAL" >&5
+$as_echo "$GLIB_GENMARSHAL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$GLIB_GENMARSHAL" && break
+done
+
+
 #############################################################################
 # XDG stuff
 for ac_prog in update-desktop-database
@@ -17560,7 +17655,98 @@ fi
 fi
 
 #############################################################################
+# Inkscape, for SVG -> PNG icon rendering
+for ac_prog in inkscape
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_INKSCAPE+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$INKSCAPE"; then
+  ac_cv_prog_INKSCAPE="$INKSCAPE" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_INKSCAPE="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+INKSCAPE=$ac_cv_prog_INKSCAPE
+if test -n "$INKSCAPE"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INKSCAPE" >&5
+$as_echo "$INKSCAPE" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$INKSCAPE" && break
+done
+test -n "$INKSCAPE" || INKSCAPE=":"
+
+for ac_prog in pngcrush
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PNGCRUSH+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$PNGCRUSH"; then
+  ac_cv_prog_PNGCRUSH="$PNGCRUSH" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_PNGCRUSH="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+PNGCRUSH=$ac_cv_prog_PNGCRUSH
+if test -n "$PNGCRUSH"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PNGCRUSH" >&5
+$as_echo "$PNGCRUSH" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$PNGCRUSH" && break
+done
+test -n "$PNGCRUSH" || PNGCRUSH=":"
+
+
+#############################################################################
 # Python
+# Must override the default interpreter list because otherwise it simply tries
+# to use the highest version, which can be python 3.x.
 
 
 # Check whether --with-python was given.
@@ -17580,6 +17766,7 @@ fi
 
 
 
+
         if test -n "$PYTHON"; then
       # If the user set $PYTHON, use it and don't search something else.
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version is >= 2.4" >&5
@@ -17615,7 +17802,7 @@ if ${am_cv_pathless_PYTHON+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
-	for am_cv_pathless_PYTHON in python python2 python3 python3.3 python3.2 python3.1 python3.0 python2.7  python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do
+	for am_cv_pathless_PYTHON in python2 python2.7 python2.6 python2.5 python2.4 python none; do
 	  test "$am_cv_pathless_PYTHON" = none && break
 	  prog="import sys
 # split strings by '.' and convert to numeric.  Append some zeros
@@ -17895,294 +18082,347 @@ fi
 if test "x$enable_pygwy" != xno; then
   if test "$PYTHON" = : -o "x$enable_python" = no; then
     enable_pygwy=no
-    PYGWY_WARN=" (needs python)"
+    pygwy_warn=" (needs python)"
   fi
 fi
 
-if test "x$enable_pygwy" != xno; then
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for python build option BASECFLAGS" >&5
-$as_echo_n "checking for python build option BASECFLAGS... " >&6; }
-if test -n "$PYTHON_SYSCFG_BASECFLAGS"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_SYSCFG_BASECFLAGS" >&5
-$as_echo "$PYTHON_SYSCFG_BASECFLAGS" >&6; }
-  export PYTHON_SYSCFG_BASECFLAGS
-
+if test "x$os_mswin" != xyes; then
+  # This is hopefully enough on Unix.
+  if test "x$enable_pygwy" != xno; then
+    if test "x2.7 2.6 2.5 2.4" != x; then
+  for version in 2.7 2.6 2.5 2.4 ; do
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}python$version-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}python$version-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PYTHON_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-cat >conftest.py <<\_______EOF
-import sys, distutils.sysconfig
-x = sys.argv[1].strip()
-v = distutils.sysconfig.get_config_var(x)
-if not isinstance(v, str):
-    sys.stderr.write('Value of %s is not a string' % x)
-    sys.exit(1)
-print 'PYTHON_SYSCFG_%s="%s"' % (x, v)
-print 'ac_res="%s"' % v
-_______EOF
-
-if $PYTHON conftest.py BASECFLAGS >conftest.file 2>conftest.err && test ! -s conftest.err; then
-  eval `cat conftest.file`
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+  case $PYTHON_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PYTHON_CONFIG="$PYTHON_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PYTHON_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-  cat conftest.err >&5
-  echo "$as_me: failed program was:" >&5
-  sed 's/^/| /' conftest.py >&5
-  eval PYTHON_SYSCFG_BASECFLAGS=
-  enable_pygwy=no
+  ;;
+esac
 fi
-rm -f conftest.py conftest.err conftest.file
+PYTHON_CONFIG=$ac_cv_path_PYTHON_CONFIG
+if test -n "$PYTHON_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_CONFIG" >&5
+$as_echo "$PYTHON_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for python build option LDFLAGS" >&5
-$as_echo_n "checking for python build option LDFLAGS... " >&6; }
-if test -n "$PYTHON_SYSCFG_LDFLAGS"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_SYSCFG_LDFLAGS" >&5
-$as_echo "$PYTHON_SYSCFG_LDFLAGS" >&6; }
-  export PYTHON_SYSCFG_LDFLAGS
-
+fi
+if test -z "$ac_cv_path_PYTHON_CONFIG"; then
+  ac_pt_PYTHON_CONFIG=$PYTHON_CONFIG
+  # Extract the first word of "python$version-config", so it can be a program name with args.
+set dummy python$version-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PYTHON_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-cat >conftest.py <<\_______EOF
-import sys, distutils.sysconfig
-x = sys.argv[1].strip()
-v = distutils.sysconfig.get_config_var(x)
-if not isinstance(v, str):
-    sys.stderr.write('Value of %s is not a string' % x)
-    sys.exit(1)
-print 'PYTHON_SYSCFG_%s="%s"' % (x, v)
-print 'ac_res="%s"' % v
-_______EOF
-
-if $PYTHON conftest.py LDFLAGS >conftest.file 2>conftest.err && test ! -s conftest.err; then
-  eval `cat conftest.file`
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+  case $ac_pt_PYTHON_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PYTHON_CONFIG="$ac_pt_PYTHON_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PYTHON_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-  cat conftest.err >&5
-  echo "$as_me: failed program was:" >&5
-  sed 's/^/| /' conftest.py >&5
-  eval PYTHON_SYSCFG_LDFLAGS=
-  enable_pygwy=no
-fi
-rm -f conftest.py conftest.err conftest.file
+  ;;
+esac
 fi
-
-  if test "x$os_mswin" != xyes; then
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for python build option CCSHARED" >&5
-$as_echo_n "checking for python build option CCSHARED... " >&6; }
-if test -n "$PYTHON_SYSCFG_CCSHARED"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_SYSCFG_CCSHARED" >&5
-$as_echo "$PYTHON_SYSCFG_CCSHARED" >&6; }
-  export PYTHON_SYSCFG_CCSHARED
-
+ac_pt_PYTHON_CONFIG=$ac_cv_path_ac_pt_PYTHON_CONFIG
+if test -n "$ac_pt_PYTHON_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PYTHON_CONFIG" >&5
+$as_echo "$ac_pt_PYTHON_CONFIG" >&6; }
 else
-cat >conftest.py <<\_______EOF
-import sys, distutils.sysconfig
-x = sys.argv[1].strip()
-v = distutils.sysconfig.get_config_var(x)
-if not isinstance(v, str):
-    sys.stderr.write('Value of %s is not a string' % x)
-    sys.exit(1)
-print 'PYTHON_SYSCFG_%s="%s"' % (x, v)
-print 'ac_res="%s"' % v
-_______EOF
-
-if $PYTHON conftest.py CCSHARED >conftest.file 2>conftest.err && test ! -s conftest.err; then
-  eval `cat conftest.file`
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
 
+  if test "x$ac_pt_PYTHON_CONFIG" = x; then
+    PYTHON_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PYTHON_CONFIG=$ac_pt_PYTHON_CONFIG
+  fi
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-  cat conftest.err >&5
-  echo "$as_me: failed program was:" >&5
-  sed 's/^/| /' conftest.py >&5
-  eval PYTHON_SYSCFG_CCSHARED=
-  enable_pygwy=no
+  PYTHON_CONFIG="$ac_cv_path_PYTHON_CONFIG"
 fi
-rm -f conftest.py conftest.err conftest.file
-fi
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for python build option LINKFORSHARED" >&5
-$as_echo_n "checking for python build option LINKFORSHARED... " >&6; }
-if test -n "$PYTHON_SYSCFG_LINKFORSHARED"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_SYSCFG_LINKFORSHARED" >&5
-$as_echo "$PYTHON_SYSCFG_LINKFORSHARED" >&6; }
-  export PYTHON_SYSCFG_LINKFORSHARED
 
+    if test "x$PYTHON_CONFIG" != x; then
+      PYTHON_VERSION=$version
+      break
+    fi
+  done
 else
-cat >conftest.py <<\_______EOF
-import sys, distutils.sysconfig
-x = sys.argv[1].strip()
-v = distutils.sysconfig.get_config_var(x)
-if not isinstance(v, str):
-    sys.stderr.write('Value of %s is not a string' % x)
-    sys.exit(1)
-print 'PYTHON_SYSCFG_%s="%s"' % (x, v)
-print 'ac_res="%s"' % v
-_______EOF
-
-if $PYTHON conftest.py LINKFORSHARED >conftest.file 2>conftest.err && test ! -s conftest.err; then
-  eval `cat conftest.file`
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}python-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}python-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PYTHON_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-  cat conftest.err >&5
-  echo "$as_me: failed program was:" >&5
-  sed 's/^/| /' conftest.py >&5
-  eval PYTHON_SYSCFG_LINKFORSHARED=
-  enable_pygwy=no
+  case $PYTHON_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PYTHON_CONFIG="$PYTHON_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PYTHON_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
 fi
-rm -f conftest.py conftest.err conftest.file
+PYTHON_CONFIG=$ac_cv_path_PYTHON_CONFIG
+if test -n "$PYTHON_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_CONFIG" >&5
+$as_echo "$PYTHON_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for python build option LIBDIR" >&5
-$as_echo_n "checking for python build option LIBDIR... " >&6; }
-if test -n "$PYTHON_SYSCFG_LIBDIR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_SYSCFG_LIBDIR" >&5
-$as_echo "$PYTHON_SYSCFG_LIBDIR" >&6; }
-  export PYTHON_SYSCFG_LIBDIR
-
+fi
+if test -z "$ac_cv_path_PYTHON_CONFIG"; then
+  ac_pt_PYTHON_CONFIG=$PYTHON_CONFIG
+  # Extract the first word of "python-config", so it can be a program name with args.
+set dummy python-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PYTHON_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-cat >conftest.py <<\_______EOF
-import sys, distutils.sysconfig
-x = sys.argv[1].strip()
-v = distutils.sysconfig.get_config_var(x)
-if not isinstance(v, str):
-    sys.stderr.write('Value of %s is not a string' % x)
-    sys.exit(1)
-print 'PYTHON_SYSCFG_%s="%s"' % (x, v)
-print 'ac_res="%s"' % v
-_______EOF
-
-if $PYTHON conftest.py LIBDIR >conftest.file 2>conftest.err && test ! -s conftest.err; then
-  eval `cat conftest.file`
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+  case $ac_pt_PYTHON_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PYTHON_CONFIG="$ac_pt_PYTHON_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PYTHON_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-  cat conftest.err >&5
-  echo "$as_me: failed program was:" >&5
-  sed 's/^/| /' conftest.py >&5
-  eval PYTHON_SYSCFG_LIBDIR=
-  enable_pygwy=no
+  ;;
+esac
 fi
-rm -f conftest.py conftest.err conftest.file
+ac_pt_PYTHON_CONFIG=$ac_cv_path_ac_pt_PYTHON_CONFIG
+if test -n "$ac_pt_PYTHON_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PYTHON_CONFIG" >&5
+$as_echo "$ac_pt_PYTHON_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
-    # Construct the option including -L, to avoid passing empty -L.
-    PYTHON_LIBDIR_FLAG="-L$PYTHON_SYSCFG_LIBDIR"
+  if test "x$ac_pt_PYTHON_CONFIG" = x; then
+    PYTHON_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PYTHON_CONFIG=$ac_pt_PYTHON_CONFIG
   fi
-  if test "x$enable_pygwy" = xno; then
-    PYGWY_WARN=" (failed to obtain Python flags)"
+else
+  PYTHON_CONFIG="$ac_cv_path_PYTHON_CONFIG"
+fi
+
+  if test "x$PYTHON_CONFIG" != x; then
+    PYTHON_VERSION=$(python -c "import sys;print '.'.join(map(str, sys.version_info[:2]))")
   fi
 fi
 
-if test "x$enable_pygwy" != xno; then
-  libpython=python$PYTHON_VERSION
-  if test "x$os_mswin" = xyes; then
-    libpython=`echo $libpython | sed 's%\\.%%'`
-  fi
-  LIBPYTHON_ORIG_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS $PYTHON_SYSCFG_CCSHARED"
-  as_ac_Lib=`$as_echo "ac_cv_lib_$libpython''_PyRun_String" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PyRun_String in -l$libpython" >&5
-$as_echo_n "checking for PyRun_String in -l$libpython... " >&6; }
-if eval \${$as_ac_Lib+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-l$libpython "$PYTHON_LIBDIR_FLAG" $PYTHON_SYSCFG_LDFLAGS $PYTHON_SYSCFG_LINKFORSHARED $LIBS"
+if test "x$PYTHON_CONFIG" != x; then
+  PYTHON_INCLUDES="$("$PYTHON_CONFIG" --includes)"
+  PYTHON_LDFLAGS="$("$PYTHON_CONFIG" --ldflags)"
+  ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+CPPFLAGS="$LIBS $PYTHON_INCLUDES"
+LIBS="$LIBS $PYTHON_LDFLAGS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can link a test Python program" >&5
+$as_echo_n "checking if we can link a test Python program... " >&6; }
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char PyRun_String ();
+#include <Python.h>
 int
 main ()
 {
-return PyRun_String ();
+Py_Initialize();
   ;
   return 0;
 }
+
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  eval "$as_ac_Lib=yes"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
 else
-  eval "$as_ac_Lib=no"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+PYTHON_CONFIG=
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
 fi
-eval ac_res=\$$as_ac_Lib
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
-  PYTHON_LIBS="$PYTHON_LIBDIR_FLAG -l$libpython"
+
+if test "x$PYTHON_CONFIG" != x; then
+
+  :
 else
-  enable_pygwy=no; PYGWY_WARN=" (needs lib$libpython)"
+  PYTHON_INCLUDES=
+  PYTHON_LDFLAGS=
+  enable_pygwy=no
+                      pygwy_warn=" (no usable libpython)"
 fi
 
-  CFLAGS="$LIBPYTHON_ORIG_CFLAGS"
 
-fi
 
-if test "x$enable_pygwy" != xno; then
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for headers required to compile python extensions" >&5
-$as_echo_n "checking for headers required to compile python extensions... " >&6; }
-py_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.prefix.replace('\\\\\\\\','/'))"`
-py_exec_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix.replace('\\\\\\\\','/'))"`
-PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}"
-if test "$py_prefix" != "$py_exec_prefix"; then
-  PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}"
-fi
 
-save_CPPFLAGS="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES"
+  fi
+else
+  # There is no python-config in MS Windows.  Rely on the user to provide
+  # PYTHON_INCLUDES and PYTHON_LDFLAGS.  Normally "-I/some/dir/include" and
+  # "-L/some/dir/lib -lpython27" suffice.
+  if test "x$enable_pygwy" != xno; then
+    if test "x$PYTHON_INCLUDES" = x; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: please set PYTHON_INCLUDES; it is not going to work otherwise" >&5
+$as_echo "$as_me: please set PYTHON_INCLUDES; it is not going to work otherwise" >&6;}
+    fi
+    if test "x$PYTHON_LDFLAGS" = x; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: please set PYTHON_LDFLAGS; it is not going to work otherwise" >&5
+$as_echo "$as_me: please set PYTHON_LDFLAGS; it is not going to work otherwise" >&6;}
+    fi
+    ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+CPPFLAGS="$LIBS $PYTHON_INCLUDES"
+LIBS="$LIBS $PYTHON_LDFLAGS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can link a test Python program" >&5
+$as_echo_n "checking if we can link a test Python program... " >&6; }
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
+
 #include <Python.h>
+int
+main ()
+{
+Py_Initialize();
+  ;
+  return 0;
+}
+
 _ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
+if ac_fn_c_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
 
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-enable_pygwy=no; PYGWY_WARN=" (needs Python headers)"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+enable_pygwy=no
+                         pygwy_warn=" (cannot link with libpython)"
 fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-CPPFLAGS="$save_CPPFLAGS"
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+  fi
 fi
 
 if test "x$enable_pygwy" != xno; then
@@ -18247,9 +18487,9 @@ fi
 
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-                enable_pygwy=no; PYGWY_WARN=" (needs pygtk2)"
+                enable_pygwy=no; pygwy_warn=" (needs pygtk2)"
 elif test $pkg_failed = untried; then
-	enable_pygwy=no; PYGWY_WARN=" (needs pygtk2)"
+	enable_pygwy=no; pygwy_warn=" (needs pygtk2)"
 else
 	PYGTK_CFLAGS=$pkg_cv_PYGTK_CFLAGS
 	PYGTK_LIBS=$pkg_cv_PYGTK_LIBS
@@ -18258,6 +18498,7 @@ $as_echo "yes" >&6; }
 	:
 fi
 
+
   if test "x$PYGTK_CODEGENDIR" = 'x'; then
     PYGTK_CODEGENDIR=`$PKG_CONFIG --variable=codegendir pygtk-2.0`
   fi
@@ -18932,6 +19173,82 @@ else
 
 fi
 
+  # Fallthrough is usually *the* reason for choosing case statements over ifs.
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC knows -Wno-implicit-fallthrough" >&5
+$as_echo_n "checking whether $CC knows -Wno-implicit-fallthrough... " >&6; }
+if ${ac_cv_prog_cc_option_WNO_IMPLICIT_FALLTHROUGH+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ye_PROG_CC_OPTION_cflags="$CFLAGS"
+   CFLAGS="$CFLAGS -Wno-implicit-fallthrough"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_option_WNO_IMPLICIT_FALLTHROUGH=yes
+else
+  ac_cv_prog_cc_option_WNO_IMPLICIT_FALLTHROUGH=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   CFLAGS="$ye_PROG_CC_OPTION_cflags"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_option_WNO_IMPLICIT_FALLTHROUGH" >&5
+$as_echo "$ac_cv_prog_cc_option_WNO_IMPLICIT_FALLTHROUGH" >&6; }
+if test "$ac_cv_prog_cc_option_WNO_IMPLICIT_FALLTHROUGH" = "yes"; then
+  PROG_CC_WNO_IMPLICIT_FALLTHROUGH="-Wno-implicit-fallthrough"
+
+else
+  PROG_CC_WNO_IMPLICIT_FALLTHROUGH=
+
+fi
+
+  # For OpenEXR until they somehow get rid of dynamic exception specification.
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC knows -Wno-deprecated" >&5
+$as_echo_n "checking whether $CC knows -Wno-deprecated... " >&6; }
+if ${ac_cv_prog_cc_option_WNO_DEPRECATED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ye_PROG_CC_OPTION_cflags="$CFLAGS"
+   CFLAGS="$CFLAGS -Wno-deprecated"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_option_WNO_DEPRECATED=yes
+else
+  ac_cv_prog_cc_option_WNO_DEPRECATED=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   CFLAGS="$ye_PROG_CC_OPTION_cflags"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_option_WNO_DEPRECATED" >&5
+$as_echo "$ac_cv_prog_cc_option_WNO_DEPRECATED" >&6; }
+if test "$ac_cv_prog_cc_option_WNO_DEPRECATED" = "yes"; then
+  PROG_CC_WNO_DEPRECATED="-Wno-deprecated"
+
+else
+  PROG_CC_WNO_DEPRECATED=
+
+fi
+
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC knows -fno-trapping-math" >&5
 $as_echo_n "checking whether $CC knows -fno-trapping-math... " >&6; }
@@ -19086,14 +19403,16 @@ fi
   # -Wstrict-protoypes makes gtkitemfactory.h noisy, but they have a
   #    comment there they can't fix it due to compatibility
   # -Wwrite-strings because it makes all struct initializations very noisy
-  WARNING_CFLAGS="-Wall -W -Wshadow -Wpointer-arith -Wno-sign-compare -Wundef $PROG_CC_ERR_IFD $PROG_CC_ERR_RET $PROG_CC_WNO_SYS_HEADERS $PROG_CC_WNO_POINTER_SIGN $PROG_CC_WNO_EMPTY_FMT $PROG_CC_WMIXED_DECL $PROG_CC_WREDUNDANT_DECLS"
+  WARNING_CFLAGS="-Wall -W -Wshadow -Wpointer-arith -Wno-sign-compare -Wundef $PROG_CC_ERR_IFD $PROG_CC_ERR_RET $PROG_CC_WNO_SYS_HEADERS $PROG_CC_WNO_POINTER_SIGN $PROG_CC_WNO_EMPTY_FMT $PROG_CC_WMIXED_DECL $PROG_CC_WREDUNDANT_DECLS $PROG_CC_WNO_IMPLICIT_FALLTHROUGH"
   PYTHON_EXTRA_CFLAGS="$PROG_CC_WNO_UNUSED_PAR $PROG_CC_FNO_STRICT_ALIASING $PROG_CC_WNO_MISSING_FIELD_INITIALIZERS"
   GTKDOC_EXTRA_CFLAGS="$PROG_CC_WNO_UNUSED_PAR"
+  HDRIMAGE_EXTRA_CFLAGS="$PROG_CC_WNO_DEPRECATED"
   PREMISE_CFLAGS="$PROG_CC_FNO_TRAP_MATH $PROG_CC_FNO_MATH_ERRNO $FEXCESS_PRECISION_FAST"
 fi
 
 
 
+
 #############################################################################
 # Base libraries: X, Gtk+.
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5
@@ -20537,22 +20856,7 @@ fi
 
 #############################################################################
 # FFTW3
-# Optional.
-FFTW_WARN=
-
-
-# Check whether --with-fftw3 was given.
-if test "${with_fftw3+set}" = set; then :
-  withval=$with_fftw3; case "${withval}" in
-     yes|no) enable_fftw3="$withval" ;;
-     *) as_fn_error $? "bad value ${withval} for --with-fftw3" "$LINENO" 5 ;;
-   esac
-else
-  enable_fftw3=yes
-fi
-
-
-if test "x$enable_fftw3" != "xno"; then
+# Required.
 
 pkg_failed=no
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FFTW3" >&5
@@ -20563,12 +20867,12 @@ if test -n "$PKG_CONFIG"; then
         pkg_cv_FFTW3_CFLAGS="$FFTW3_CFLAGS"
     else
         if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "fftw3") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3 >= 3.1\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "fftw3 >= 3.1") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_FFTW3_CFLAGS=`$PKG_CONFIG --cflags "fftw3" 2>/dev/null`
+  pkg_cv_FFTW3_CFLAGS=`$PKG_CONFIG --cflags "fftw3 >= 3.1" 2>/dev/null`
 else
   pkg_failed=yes
 fi
@@ -20581,12 +20885,12 @@ if test -n "$PKG_CONFIG"; then
         pkg_cv_FFTW3_LIBS="$FFTW3_LIBS"
     else
         if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "fftw3") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3 >= 3.1\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "fftw3 >= 3.1") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_FFTW3_LIBS=`$PKG_CONFIG --libs "fftw3" 2>/dev/null`
+  pkg_cv_FFTW3_LIBS=`$PKG_CONFIG --libs "fftw3 >= 3.1" 2>/dev/null`
 else
   pkg_failed=yes
 fi
@@ -20605,124 +20909,44 @@ else
         _pkg_short_errors_supported=no
 fi
         if test $_pkg_short_errors_supported = yes; then
-	        FFTW3_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fftw3"`
+	        FFTW3_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fftw3 >= 3.1"`
         else
-	        FFTW3_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fftw3"`
+	        FFTW3_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fftw3 >= 3.1"`
         fi
 	# Put the nasty error message in config.log where it belongs
 	echo "$FFTW3_PKG_ERRORS" >&5
 
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-                enable_fftw3=no; FFTW_WARN=" (needs FFTW3)"
-elif test $pkg_failed = untried; then
-	enable_fftw3=no; FFTW_WARN=" (needs FFTW3)"
-else
-	FFTW3_CFLAGS=$pkg_cv_FFTW3_CFLAGS
-	FFTW3_LIBS=$pkg_cv_FFTW3_LIBS
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-$as_echo "#define HAVE_FFTW3 1" >>confdefs.h
-
-fi
-fi
-if test "x$enable_fftw3" != "xno"; then
-  if test "x$arch_32bit" != "xyes"; then
-
-pkg_failed=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FFTW3_1" >&5
-$as_echo_n "checking for FFTW3_1... " >&6; }
+	as_fn_error $? "Package requirements (fftw3 >= 3.1) were not met:
 
-if test -n "$PKG_CONFIG"; then
-    if test -n "$FFTW3_1_CFLAGS"; then
-        pkg_cv_FFTW3_1_CFLAGS="$FFTW3_1_CFLAGS"
-    else
-        if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3 >= 3.1\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "fftw3 >= 3.1") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  pkg_cv_FFTW3_1_CFLAGS=`$PKG_CONFIG --cflags "fftw3 >= 3.1" 2>/dev/null`
-else
-  pkg_failed=yes
-fi
-    fi
-else
-	pkg_failed=untried
-fi
-if test -n "$PKG_CONFIG"; then
-    if test -n "$FFTW3_1_LIBS"; then
-        pkg_cv_FFTW3_1_LIBS="$FFTW3_1_LIBS"
-    else
-        if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3 >= 3.1\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "fftw3 >= 3.1") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  pkg_cv_FFTW3_1_LIBS=`$PKG_CONFIG --libs "fftw3 >= 3.1" 2>/dev/null`
-else
-  pkg_failed=yes
-fi
-    fi
-else
-	pkg_failed=untried
-fi
+$FFTW3_PKG_ERRORS
 
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
 
+Alternatively, you may set the environment variables FFTW3_CFLAGS
+and FFTW3_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" "$LINENO" 5
+elif test $pkg_failed = untried; then
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
 
-if test $pkg_failed = yes; then
+Alternatively, you may set the environment variables FFTW3_CFLAGS
+and FFTW3_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
 
-if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
-        _pkg_short_errors_supported=yes
+To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.
+See \`config.log' for more details" "$LINENO" 5; }
 else
-        _pkg_short_errors_supported=no
-fi
-        if test $_pkg_short_errors_supported = yes; then
-	        FFTW3_1_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fftw3 >= 3.1"`
-        else
-	        FFTW3_1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fftw3 >= 3.1"`
-        fi
-	# Put the nasty error message in config.log where it belongs
-	echo "$FFTW3_1_PKG_ERRORS" >&5
-
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-                { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: FFTW3 older than 3.1 may cause crashes on 64bit systems.
-        Consider installation of FFTW3 at least 3.1.  Alternatively you can
-        disable FFTW3 with --without-fftw3." >&5
-$as_echo "$as_me: WARNING: FFTW3 older than 3.1 may cause crashes on 64bit systems.
-        Consider installation of FFTW3 at least 3.1.  Alternatively you can
-        disable FFTW3 with --without-fftw3." >&2;}
-      FFTW3_WARN=" (with warnings)"
-elif test $pkg_failed = untried; then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: FFTW3 older than 3.1 may cause crashes on 64bit systems.
-        Consider installation of FFTW3 at least 3.1.  Alternatively you can
-        disable FFTW3 with --without-fftw3." >&5
-$as_echo "$as_me: WARNING: FFTW3 older than 3.1 may cause crashes on 64bit systems.
-        Consider installation of FFTW3 at least 3.1.  Alternatively you can
-        disable FFTW3 with --without-fftw3." >&2;}
-      FFTW3_WARN=" (with warnings)"
-else
-	FFTW3_1_CFLAGS=$pkg_cv_FFTW3_1_CFLAGS
-	FFTW3_1_LIBS=$pkg_cv_FFTW3_1_LIBS
+	FFTW3_CFLAGS=$pkg_cv_FFTW3_CFLAGS
+	FFTW3_LIBS=$pkg_cv_FFTW3_LIBS
         { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
 	:
 fi
-  fi
-  FFTW3_DEPENDENCY=fftw3
-else
-  FFTW3_DEPENDENCY=
-fi
-
-
-if test x$enable_fftw3 != xyes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: FFTW will become a required dependency in a future version." >&5
-$as_echo "$as_me: WARNING: FFTW will become a required dependency in a future version." >&2;}
-fi
 
 #############################################################################
 # GtkSourceView
@@ -20803,9 +21027,9 @@ fi
 
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-                enable_gtksourceview=no; GTKSOURCEVIEW_WARN=" (needs GtkSourceView)"
+                enable_gtksourceview=no
 elif test $pkg_failed = untried; then
-	enable_gtksourceview=no; GTKSOURCEVIEW_WARN=" (needs GtkSourceView)"
+	enable_gtksourceview=no
 else
 	GTKSOURCEVIEW_CFLAGS=$pkg_cv_GTKSOURCEVIEW_CFLAGS
 	GTKSOURCEVIEW_LIBS=$pkg_cv_GTKSOURCEVIEW_LIBS
@@ -20944,7 +21168,7 @@ else
 fi
 
 
-if test x$enable_zlib != xno && test -z "$ZLIB"; then
+if test "x$enable_zlib" != xno && test -z "$ZLIB"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5
 $as_echo_n "checking for inflate in -lz... " >&6; }
 if ${ac_cv_lib_z_inflate+:} false; then :
@@ -20995,12 +21219,12 @@ else
 fi
 
 fi
-if test x$enable_zlib != xno && test -n "$ZLIB"; then
+if test "x$enable_zlib" != xno && test -n "$ZLIB"; then
 
 $as_echo "#define HAVE_ZLIB 1" >>confdefs.h
 
 fi
- if test x$enable_zlib != xno && test -n "$ZLIB"; then
+ if test "x$enable_zlib" != xno && test -n "$ZLIB"; then
   HAVE_ZLIB_TRUE=
   HAVE_ZLIB_FALSE='#'
 else
@@ -21026,7 +21250,7 @@ else
 fi
 
 
-if test x$enable_bzip2 != xno && test -z "$BZIP2"; then
+if test "x$enable_bzip2" != xno && test -z "$BZIP2"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BZ2_bzopen in -lbz2" >&5
 $as_echo_n "checking for BZ2_bzopen in -lbz2... " >&6; }
 if ${ac_cv_lib_bz2_BZ2_bzopen+:} false; then :
@@ -21077,14 +21301,14 @@ else
 fi
 
 fi
-if test x$enable_bzip2 != xno && test -n "$BZIP2"; then
+if test "x$enable_bzip2" != xno && test -n "$BZIP2"; then
 
 $as_echo "#define HAVE_BZIP2 1" >>confdefs.h
 
 else
   BZIP2_WARN=" (needs bzip2)"
 fi
- if test x$enable_bzip2 != xno && test -n "$BZIP2"; then
+ if test "x$enable_bzip2" != xno && test -n "$BZIP2"; then
   HAVE_BZIP2_TRUE=
   HAVE_BZIP2_FALSE='#'
 else
@@ -21172,7 +21396,7 @@ $as_echo "yes" >&6; }
 $as_echo "#define HAVE_MINIZIP 1" >>confdefs.h
 
 fi
- if test x$enable_minizip != xno; then
+ if test "x$enable_minizip" != xno; then
   HAVE_MINIZIP_TRUE=
   HAVE_MINIZIP_FALSE='#'
 else
@@ -21185,7 +21409,7 @@ fi
 # libzip
 # Optional.  Used to load the crazy zip-compressed-bunch-of-XML formats.
 # Alternative to minizip (which is normally preferred).
-if test x$enable_minizip != xno; then
+if test "x$enable_minizip" != xno; then
   enable_libzip=no
 else
   enable_libzip=yes
@@ -21263,7 +21487,7 @@ $as_echo "#define HAVE_LIBZIP 1" >>confdefs.h
 
 fi
 fi
- if test x$enable_libzip != xno; then
+ if test "x$enable_libzip" != xno; then
   HAVE_LIBZIP_TRUE=
   HAVE_LIBZIP_FALSE='#'
 else
@@ -21275,10 +21499,10 @@ fi
 #############################################################################
 # So, at the end, do we have any zip file backend?
 have_any_zip=no
-if test x$enable_minizip != xno || test x$enable_libzip != xno; then
+if test "x$enable_minizip" != xno || test "x$enable_libzip" != xno; then
   have_any_zip=yes
 fi
- if test x$have_any_zip != xno; then
+ if test "x$have_any_zip" != xno; then
   HAVE_ANY_ZIP_TRUE=
   HAVE_ANY_ZIP_FALSE='#'
 else
@@ -21364,7 +21588,7 @@ $as_echo "yes" >&6; }
 $as_echo "#define HAVE_PNG 1" >>confdefs.h
 
 fi
- if test x$enable_png != xno; then
+ if test "x$enable_png" != xno; then
   HAVE_PNG_TRUE=
   HAVE_PNG_FALSE='#'
 else
@@ -21450,7 +21674,7 @@ $as_echo "yes" >&6; }
 $as_echo "#define HAVE_WEBP 1" >>confdefs.h
 
 fi
- if test x$enable_webp != xno; then
+ if test "x$enable_webp" != xno; then
   HAVE_WEBP_TRUE=
   HAVE_WEBP_FALSE='#'
 else
@@ -21467,13 +21691,13 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the C++ compiler is a real thing" >&5
 $as_echo_n "checking if the C++ compiler is a real thing... " >&6; }
 if test "x$CXX" = "xg++" && test "x$GCC_CXX" != xyes; then
-  cxx_is_not_fake=no
+  have_cxx=no
 else
-  cxx_is_not_fake=yes
+  have_cxx=yes
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cxx_is_not_fake" >&5
-$as_echo "$cxx_is_not_fake" >&6; }
- if test x$cxx_is_not_fake != xno; then
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_cxx" >&5
+$as_echo "$have_cxx" >&6; }
+ if test "x$have_cxx" != xno; then
   HAVE_CXX_TRUE=
   HAVE_CXX_FALSE='#'
 else
@@ -21485,7 +21709,7 @@ fi
 #############################################################################
 # OpenEXR
 # Optional.  Used for HDR greyscale OpenEXR pixmap import/export.
-enable_exr=$cxx_is_not_fake
+enable_exr=$have_cxx
 
 pkg_failed=no
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXR" >&5
@@ -21559,7 +21783,7 @@ $as_echo "yes" >&6; }
 $as_echo "#define HAVE_EXR 1" >>confdefs.h
 
 fi
- if test x$enable_exr != xno; then
+ if test "x$enable_exr" != xno; then
   HAVE_EXR_TRUE=
   HAVE_EXR_FALSE='#'
 else
@@ -21645,7 +21869,7 @@ $as_echo "yes" >&6; }
 $as_echo "#define HAVE_CFITSIO 1" >>confdefs.h
 
 fi
- if test x$enable_cfitsio != xno; then
+ if test "x$enable_cfitsio" != xno; then
   HAVE_CFITSIO_TRUE=
   HAVE_CFITSIO_FALSE='#'
 else
@@ -21745,7 +21969,7 @@ $as_echo "#define HAVE_XML2 1" >>confdefs.h
 
 fi
 fi
- if test x$enable_libxml2 != xno; then
+ if test "x$enable_libxml2" != xno; then
   HAVE_XML2_TRUE=
   HAVE_XML2_FALSE='#'
 else
@@ -24222,15 +24446,53 @@ _ACEOF
 ac_config_commands="$ac_config_commands gwyconfig.h"
 
 
+#############################################################################
+# Make msgmerge work on Darwin.  See
+# http://subcommanderblog.wordpress.com/2009/05/16/msgmerge-on-macosx-and-no-such-file-or-directory/
 if test "$os_darwin" = yes; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: fixing msgmerge to work on Darwin" >&5
 $as_echo "$as_me: fixing msgmerge to work on Darwin" >&6;}
-  # Make msgmerge work on Darwin.  See
-  # http://subcommanderblog.wordpress.com/2009/05/16/msgmerge-on-macosx-and-no-such-file-or-directory/
   ac_config_commands="$ac_config_commands osx-chmod"
 
 fi
 
+#############################################################################
+# Create lists of included and exclued optional file formats.
+# This table needs to be kept in sync with modules/file/Makefile.am.
+cat >conftest.out <<EOF
+have_any_zip? NanoObserver
+have_any_zip? NanoScanTech
+have_any_zip? OpenGPS
+have_any_zip? PLUx
+have_any_zip? SPMxFormat
+have_any_zip? JPK force
+enable_libxml2? have_any_zip? APE DAX
+enable_libxml2? enable_zlib? SPML
+enable_exr? have_cxx? OpenEXR
+enable_cfitsio? FITS
+enable_zlib? Createc/zlib
+enable_zlib? NRRD/zlib
+enable_zlib? RHK SM4 PRM meta/zlib
+enable_bzip2? NRRD/bzip2
+enable_png? have_cxx? PNG/16bit
+have_cxx? BigTIFF
+have_cxx? PGM/16bit
+enable_webp? WebP
+EOF
+
+for dep in enable_bzip2 enable_cfitsio enable_exr enable_libxml2 enable_png enable_webp enable_zlib have_any_zip have_cxx; do
+  eval x=\$$dep
+  if test "x$x" != xno; then
+    sed -i "s/$dep? //" conftest.out
+  else
+    sed -i "s/$dep? /#/" conftest.out
+  fi
+done
+
+enabled_formats=`grep -v '^#' conftest.out | sort | sed 's/$/, /' | tr -d '\n' | sed 's/, *$//'`
+disabled_formats=`grep '^#' conftest.out | sort | sed 's/$/, /' | tr -d '#\n' | sed 's/, *$//'`
+rm -f conftest.out
+
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
 # tests run on this system so they can be shared between configure
@@ -24396,6 +24658,10 @@ if test -z "${MODULE_DEPENDENCIES_TRUE}" && test -z "${MODULE_DEPENDENCIES_FALSE
   as_fn_error $? "conditional \"MODULE_DEPENDENCIES\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${MODULE_BUNDLING_TRUE}" && test -z "${MODULE_BUNDLING_FALSE}"; then
+  as_fn_error $? "conditional \"MODULE_BUNDLING\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${DESKTOP_FILE_UPDATE_TRUE}" && test -z "${DESKTOP_FILE_UPDATE_FALSE}"; then
   as_fn_error $? "conditional \"DESKTOP_FILE_UPDATE\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -24881,7 +25147,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by Gwyddion $as_me 2.47, which was
+This file was extended by Gwyddion $as_me 2.49, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -24947,7 +25213,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-Gwyddion config.status 2.47
+Gwyddion config.status 2.49
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -25500,6 +25766,7 @@ do
     "plugins/file/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/file/Makefile" ;;
     "plugins/process/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/process/Makefile" ;;
     "pixmaps/Makefile") CONFIG_FILES="$CONFIG_FILES pixmaps/Makefile" ;;
+    "pixmaps/src/Makefile") CONFIG_FILES="$CONFIG_FILES pixmaps/src/Makefile" ;;
     "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
     "perl/Makefile") CONFIG_FILES="$CONFIG_FILES perl/Makefile" ;;
     "python/Makefile") CONFIG_FILES="$CONFIG_FILES python/Makefile" ;;
@@ -27062,7 +27329,7 @@ _LT_EOF
 
 _______EOF
 
-  if test x$enable_gl = xno; then
+  if test "x$enable_gl" = xno; then
     echo '#undef GWYDDION_HAS_OPENGL' >>$outfile
   else
     echo '#define GWYDDION_HAS_OPENGL 1' >>$outfile
@@ -27207,71 +27474,82 @@ $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
 
 
-enabled_formats=
-disabled_formats=
-
-if test "x$have_any_zip" != xno; then
-  enabled_formats="$enabled_formats, NanoObserver, NanoScanTech, OpenGPS, PLUX"
-  if test "x$enable_libxml2" != xno; then
-    enabled_formats="$enabled_formats, APE DAX"
-  else
-    disabled_formats="$disabled_formats, APE DAX"
-  fi
-else
-  disabled_formats="$disabled_formats, NanoObserver, NanoScanTech, OpenGPS, APE DAX, PLUX"
-fi
-
-if test "x$enable_exr" != xno; then
-  enabled_formats="$enabled_formats, OpenEXR"
-else
-  disabled_formats="$disabled_formats, OpenEXR"
-fi
-
-if test "x$enable_cfitsio" != xno; then
-  enabled_formats="$enabled_formats, FITS"
-else
-  disabled_formats="$disabled_formats, FITS"
-fi
-
-if test "x$enable_zlib" != xno; then
-  enabled_formats="$enabled_formats, Createc zlib compression, NRRD zlib compression, RHK SM4 PRM metadata compression"
-  if test "x$enable_libxml2" != xno; then
-    enabled_formats="$enabled_formats, SPML"
+#############################################################################
+# Print the summary.
+pygwy_hl=
+if test "x$enable_pygwy" = xyes; then
+  if test "x$enable_gtksourceview" = xyes; then
+    pygwy_hl=' (with syntax highlighting)'
   else
-    disabled_formats="$disabled_formats, SPML"
+    pygwy_hl=' (no syntax highlighting)'
   fi
-else
-  disabled_formats="$disabled_formats, SPML, Createc zlib compression, NRRD zlib compression, RHK SM4 PRM metadata compression"
-fi
-
-if test "x$enable_bzip2" != xno; then
-  enabled_formats="$enabled_formats, NRRD bzip2 compression"
-else
-  disabled_formats="$disabled_formats, NRRD bzip2 compression"
-fi
-
-if test "x$enable_png" != xno; then
-  enabled_formats="$enabled_formats, high-depth PNG"
-else
-  disabled_formats="$disabled_formats, high-depth PNG"
 fi
 
-enabled_formats=`echo "$enabled_formats" | sed 's/^, //'`
-disabled_formats=`echo "$disabled_formats" | sed 's/^, //'`
-
 echo "================================================================="
-echo "Configuration:"
-echo "  FFTW3:                             $enable_fftw3$FFTW3_WARN"
+echo "Configuration Summary:"
 echo "  OpenGL 3D widgets:                 $enable_gl$GL_WARN"
 echo "  Remote control:                    $remote_backend"
 echo "  Optional file formats included:    $enabled_formats"
 echo "  Optional file formats excluded:    $disabled_formats"
+echo "  Module linking:                    bundling=$enable_module_bundling, bloat=$enable_library_bloat"
 echo "  Thumbnailers to build:             $THUMBNAILERS"
-echo "  Python interface (pygwy):          $enable_pygwy$PYGWY_WARN"
-if test x$enable_pygwy = xyes; then
-  echo "  Pygwy console syntax highlighting: $enable_gtksourceview$GTKSOURCEVIEW_WARN"
-fi
+echo "  Python interface (pygwy):          $enable_pygwy$pygwy_hl$pygwy_warn"
 echo "  Desktop integration files go to:   $xdg_target"
 echo "================================================================="
 
+#############################################################################
+# Maintainer mode
+if test "x$enable_maintainer_mode" = xyes; then
+  missing_mmode_stuff=
+  if test "x$PYTHON" = x || test "x$PYTHON" = x:; then
+    missing_mmode_stuff="$missing_mmode_stuff, Python 2.x"
+  fi
+  if test "x$GLIB_MKENUMS" = x || test "x$GLIB_MKENUMS" = x:; then
+    missing_mmode_stuff="$missing_mmode_stuff, glib-mkenums"
+  fi
+  if test "x$GLIB_GENMARSHAL" = x || test "x$GLIB_GENMARSHAL" = x:; then
+    missing_mmode_stuff="$missing_mmode_stuff, glib-genmarshal"
+  fi
+  if test "x$INKSCAPE" = x || test "x$INKSCAPE" = x:; then
+    missing_mmode_stuff="$missing_mmode_stuff, Inkscape"
+  fi
+  if test "x$XSLTPROC" = x || test "x$XSLTPROC" = x:; then
+    missing_mmode_stuff="$missing_mmode_stuff, xsltproc"
+  fi
+  if test "x$enable_gtk_doc" != xyes; then
+    missing_mmode_stuff="$missing_mmode_stuff, gtk-doc"
+  fi
+  if test "x$PNGCRUSH" = x || test "x$PNGCRUSH" = x:; then
+    missing_mmode_stuff="$missing_mmode_stuff, pngcrush"
+  fi
+  if test "x$enable_pygwy" = xyes; then
+    if test "x$EPYDOC" = x || test "x$EPYDOC" = x:; then
+      missing_mmode_stuff="$missing_mmode_stuff, epydoc"
+    fi
+  fi
+  missing_mmode_stuff=`echo "$missing_mmode_stuff" | sed 's/^, //'`
+  if test "x$missing_mmode_stuff" != x; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Missing maintainer mode tools.
+*******************************************************************************
+  Maintainer mode is enabled, but some tools used to generate various files
+  are missing:
+
+     $missing_mmode_stuff
+
+  Depending on what you are doing and why you enabled the maintainer mode,
+  this may be OK or things may break horribly.
+*******************************************************************************" >&5
+$as_echo "$as_me: WARNING: Missing maintainer mode tools.
+*******************************************************************************
+  Maintainer mode is enabled, but some tools used to generate various files
+  are missing:
+
+     $missing_mmode_stuff
+
+  Depending on what you are doing and why you enabled the maintainer mode,
+  this may be OK or things may break horribly.
+*******************************************************************************" >&2;}
+  fi
+fi
+
 # vim: set ts=2 sw=2 et :
diff --git a/configure.ac b/configure.ac
index d730938..5793077 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,7 @@
-# @(#) $Id: configure.ac 19287 2016-11-18 10:17:57Z yeti-dn $
+# @(#) $Id: configure.ac 20297 2017-08-15 15:44:34Z yeti-dn $
 dnl Process this file with autoconf to produce a configure script.
 m4_define([gwy_version_major],[2])
-m4_define([gwy_version_minor],[47])
+m4_define([gwy_version_minor],[49])
 m4_define([gwy_version_string],[gwy_version_major.gwy_version_minor])
 AC_INIT([Gwyddion], [gwy_version_string], [klapetek at gwyddion.net])
 # Use -release for unstable version libs instead of -version-info, because
@@ -34,6 +34,7 @@ AC_CONFIG_FILES(\
   plugins/file/Makefile \
   plugins/process/Makefile \
   pixmaps/Makefile \
+  pixmaps/src/Makefile \
   po/Makefile.in \
   perl/Makefile \
   python/Makefile \
@@ -93,14 +94,10 @@ AC_PROG_LIBTOOL
 AC_PROG_INSTALL
 AC_CHECK_PROGS([XSLTPROC],[xsltproc],[:])
 AC_CHECK_PROGS([EPYDOC],[epydoc],[:])
-GTK_DOC_CHECK(1.10)
+GTK_DOC_CHECK(1.12)
 
 #############################################################################
-# 64bit (for FFTW 3.0 warning)
-# Unfortunately, AC_CHECK_SIZEOF() is capable only of preprocessor symbol
-# production while we need to know the size now.  We don't care much about
-# the exact model: if pointers are larger than 32bit it can possibly break,
-# and so we will warn.
+# 32bit/64bit
 AC_CHECK_SIZEOF([void*])
 if test $ac_cv_sizeof_voidp = 4; then
   arch_32bit=yes
@@ -168,7 +165,7 @@ fi
 AC_SUBST(XDG_DATA_HOME_DIR)
 
 #############################################################################
-# Module symbol resolution.
+# Module symbol resolution and bundling.
 # We try not to link modules with libraries and let symbols resolve through
 # app, because it means faster app startup and much faster compilation.  But
 # on some systems that isn't possible.
@@ -183,6 +180,17 @@ if test "x$enable_library_bloat" != xyes \
 fi
 AM_CONDITIONAL([MODULE_DEPENDENCIES],[test "x$enable_library_bloat" = xyes])
 
+GWY_ENABLE([module-bundling],
+           [module_bundling],
+           [Bundling modules to one big shared library],
+           [yes])
+AM_CONDITIONAL([MODULE_BUNDLING],[test "x$enable_module_bundling" = xyes])
+
+#############################################################################
+# GLib tools
+AC_CHECK_PROGS([GLIB_MKENUMS],[glib-mkenums])
+AC_CHECK_PROGS([GLIB_GENMARSHAL],[glib-genmarshal])
+
 #############################################################################
 # XDG stuff
 AC_CHECK_PROGS([UPDATE_DESKTOP_DATABASE],[update-desktop-database],:)
@@ -214,8 +222,16 @@ if test "x$GCONFTOOL" != xno; then
 fi
 
 #############################################################################
+# Inkscape, for SVG -> PNG icon rendering
+AC_CHECK_PROGS([INKSCAPE],[inkscape],:)
+AC_CHECK_PROGS([PNGCRUSH],[pngcrush],:)
+
+#############################################################################
 # Python
+# Must override the default interpreter list because otherwise it simply tries
+# to use the highest version, which can be python 3.x.
 GWY_WITH([python],,[Install Python modules and plug-ins])
+m4_define_default([_AM_PYTHON_INTERPRETER_LIST],[python2 python2.7 python2.6 python2.5 python2.4 python])
 AM_PATH_PYTHON(2.4,,:)
 AM_CONDITIONAL([HAVE_PYTHON],[test "$PYTHON" != : -a "$enable_python" != no])
 AC_CHECK_SIZEOF([pid_t])
@@ -234,49 +250,39 @@ AC_ARG_ENABLE(pygwy, AC_HELP_STRING([--enable-pygwy],
 if test "x$enable_pygwy" != xno; then
   if test "$PYTHON" = : -o "x$enable_python" = no; then
     enable_pygwy=no
-    PYGWY_WARN=" (needs python)"
+    pygwy_warn=" (needs python)"
   fi
 fi
 
-if test "x$enable_pygwy" != xno; then
-  GWY_PYTHON_SYSCFG_VAR([BASECFLAGS],,[enable_pygwy=no])
-  GWY_PYTHON_SYSCFG_VAR([LDFLAGS],,[enable_pygwy=no])
-  if test "x$os_mswin" != xyes; then
-    GWY_PYTHON_SYSCFG_VAR([CCSHARED],,[enable_pygwy=no])
-    GWY_PYTHON_SYSCFG_VAR([LINKFORSHARED],,[enable_pygwy=no])
-    GWY_PYTHON_SYSCFG_VAR([LIBDIR],,[enable_pygwy=no])
-    # Construct the option including -L, to avoid passing empty -L.
-    PYTHON_LIBDIR_FLAG="-L$PYTHON_SYSCFG_LIBDIR"
+if test "x$os_mswin" != xyes; then
+  # This is hopefully enough on Unix.
+  if test "x$enable_pygwy" != xno; then
+    GWY_PYTHON_DEVEL([2.7 2.6 2.5 2.4],,
+                     [enable_pygwy=no
+                      pygwy_warn=" (no usable libpython)"])
   fi
-  if test "x$enable_pygwy" = xno; then
-    PYGWY_WARN=" (failed to obtain Python flags)"
-  fi
-fi
-
-if test "x$enable_pygwy" != xno; then
-  libpython=python$PYTHON_VERSION
-  if test "x$os_mswin" = xyes; then
-    libpython=`echo $libpython | sed 's%\\.%%'`
+else
+  # There is no python-config in MS Windows.  Rely on the user to provide
+  # PYTHON_INCLUDES and PYTHON_LDFLAGS.  Normally "-I/some/dir/include" and
+  # "-L/some/dir/lib -lpython27" suffice.
+  if test "x$enable_pygwy" != xno; then
+    if test "x$PYTHON_INCLUDES" = x; then
+      AC_MSG_NOTICE([please set PYTHON_INCLUDES; it is not going to work otherwise])
+    fi
+    if test "x$PYTHON_LDFLAGS" = x; then
+      AC_MSG_NOTICE([please set PYTHON_LDFLAGS; it is not going to work otherwise])
+    fi
+    GWY_PYTHON_TRY_LINK([],
+                        [enable_pygwy=no
+                         pygwy_warn=" (cannot link with libpython)"])
   fi
-  LIBPYTHON_ORIG_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS $PYTHON_SYSCFG_CCSHARED"
-  AC_CHECK_LIB($libpython, PyRun_String,
-               [PYTHON_LIBS="$PYTHON_LIBDIR_FLAG -l$libpython"],
-               [enable_pygwy=no; PYGWY_WARN=" (needs lib$libpython)"],
-               ["$PYTHON_LIBDIR_FLAG" $PYTHON_SYSCFG_LDFLAGS $PYTHON_SYSCFG_LINKFORSHARED])
-  CFLAGS="$LIBPYTHON_ORIG_CFLAGS"
-  AC_SUBST(PYTHON_LIBS)
-fi
-
-if test "x$enable_pygwy" != xno; then
-  GWY_CHECK_PYTHON_HEADERS([],
-                           [enable_pygwy=no; PYGWY_WARN=" (needs Python headers)"])
 fi
 
 if test "x$enable_pygwy" != xno; then
   PKG_CHECK_MODULES(PYGTK,[pygtk-2.0 >= 2.10.0],[],
-                    [enable_pygwy=no; PYGWY_WARN=" (needs pygtk2)"])
+                    [enable_pygwy=no; pygwy_warn=" (needs pygtk2)"])
   AC_SUBST(PYGTK_CFLAGS)
+  AC_SUBST(PYGTK_LIBS)
   if test "x$PYGTK_CODEGENDIR" = 'x'; then
     PYGTK_CODEGENDIR=`$PKG_CONFIG --variable=codegendir pygtk-2.0`
   fi
@@ -361,6 +367,10 @@ if test "$GCC" = yes; then
   GWY_PROG_CC_OPTION([WMIXED_DECL],[-Wdeclaration-after-statement],,)
   GWY_PROG_CC_OPTION([WREDUNDANT_DECLS],[-Wredundant-decls],,)
   GWY_PROG_CC_OPTION([WNO_MISSING_FIELD_INITIALIZERS],[-Wno-missing-field-initializers],,)
+  # Fallthrough is usually *the* reason for choosing case statements over ifs.
+  GWY_PROG_CC_OPTION([WNO_IMPLICIT_FALLTHROUGH],[-Wno-implicit-fallthrough],,)
+  # For OpenEXR until they somehow get rid of dynamic exception specification.
+  GWY_PROG_CC_OPTION([WNO_DEPRECATED],[-Wno-deprecated],,)
   GWY_PROG_CC_OPTION([FNO_TRAP_MATH],[-fno-trapping-math],,)
   GWY_PROG_CC_OPTION([FNO_MATH_ERRNO],[-fno-math-errno],,)
   GWY_PROG_CC_OPTION([FEXCESS_PRECISION_FAST],[-fexcess-precision=fast],,)
@@ -371,13 +381,15 @@ if test "$GCC" = yes; then
   # -Wstrict-protoypes makes gtkitemfactory.h noisy, but they have a
   #    comment there they can't fix it due to compatibility
   # -Wwrite-strings because it makes all struct initializations very noisy
-  WARNING_CFLAGS="-Wall -W -Wshadow -Wpointer-arith -Wno-sign-compare -Wundef $PROG_CC_ERR_IFD $PROG_CC_ERR_RET $PROG_CC_WNO_SYS_HEADERS $PROG_CC_WNO_POINTER_SIGN $PROG_CC_WNO_EMPTY_FMT $PROG_CC_WMIXED_DECL $PROG_CC_WREDUNDANT_DECLS"
+  WARNING_CFLAGS="-Wall -W -Wshadow -Wpointer-arith -Wno-sign-compare -Wundef $PROG_CC_ERR_IFD $PROG_CC_ERR_RET $PROG_CC_WNO_SYS_HEADERS $PROG_CC_WNO_POINTER_SIGN $PROG_CC_WNO_EMPTY_FMT $PROG_CC_WMIXED_DECL $PROG_CC_WREDUNDANT_DECLS $PROG_CC_WNO_IMPLICIT_FALLTHROUGH"
   PYTHON_EXTRA_CFLAGS="$PROG_CC_WNO_UNUSED_PAR $PROG_CC_FNO_STRICT_ALIASING $PROG_CC_WNO_MISSING_FIELD_INITIALIZERS"
   GTKDOC_EXTRA_CFLAGS="$PROG_CC_WNO_UNUSED_PAR"
+  HDRIMAGE_EXTRA_CFLAGS="$PROG_CC_WNO_DEPRECATED"
   PREMISE_CFLAGS="$PROG_CC_FNO_TRAP_MATH $PROG_CC_FNO_MATH_ERRNO $FEXCESS_PRECISION_FAST"
 fi
 AC_SUBST(PYTHON_EXTRA_CFLAGS)
 AC_SUBST(GTKDOC_EXTRA_CFLAGS)
+AC_SUBST(HDRIMAGE_EXTRA_CFLAGS)
 
 #############################################################################
 # Base libraries: X, Gtk+.
@@ -449,31 +461,8 @@ PKG_CHECK_MODULES(GTK, [$pangoft2 cairo >= 1.2 pango >= 1.10 pangocairo gtk+-2.0
 
 #############################################################################
 # FFTW3
-# Optional.
-FFTW_WARN=
-GWY_WITH([fftw3],,[FFTW3 library])
-if test "x$enable_fftw3" != "xno"; then
-  PKG_CHECK_MODULES(FFTW3, [fftw3],
-    [AC_DEFINE(HAVE_FFTW3,1,[Define if we have the FFTW3 package.])],
-    [enable_fftw3=no; FFTW_WARN=" (needs FFTW3)"])
-fi
-if test "x$enable_fftw3" != "xno"; then
-  if test "x$arch_32bit" != "xyes"; then
-    PKG_CHECK_MODULES(FFTW3_1,[fftw3 >= 3.1],[:],
-      AC_MSG_WARN([FFTW3 older than 3.1 may cause crashes on 64bit systems.
-        Consider installation of FFTW3 at least 3.1.  Alternatively you can
-        disable FFTW3 with --without-fftw3.])
-      [FFTW3_WARN=" (with warnings)"])
-  fi
-  FFTW3_DEPENDENCY=fftw3
-else
-  FFTW3_DEPENDENCY=
-fi
-AC_SUBST([FFTW3_DEPENDENCY])
-
-if test x$enable_fftw3 != xyes; then
-  AC_MSG_WARN([FFTW will become a required dependency in a future version.])
-fi
+# Required.
+PKG_CHECK_MODULES(FFTW3, [fftw3 >= 3.1])
 
 #############################################################################
 # GtkSourceView
@@ -484,7 +473,7 @@ if test "x$enable_pygwy" != xno; then
     PKG_CHECK_MODULES(GTKSOURCEVIEW,[gtksourceview-2.0],
                       [AC_DEFINE(HAVE_GTKSOURCEVIEW,1,
                                  [Define if we have the GtkSourceView package.])],
-                      [enable_gtksourceview=no; GTKSOURCEVIEW_WARN=" (needs GtkSourceView)"])
+                      [enable_gtksourceview=no])
   fi
   if test "x$enable_gtksourceview" != "xno"; then
     GTKSOURCEVIEW_DEPENDENCY=gtksourceview-2.0
@@ -521,34 +510,34 @@ AC_SUBST([GTKGLEXT_DEPENDENCY])
 # Optional.  Used sometimes for data compression, e.g. in Createc, NRRD and
 # MATLAB.
 GWY_WITH([zlib],,[build with zlib support])
-if test x$enable_zlib != xno && test -z "$ZLIB"; then
+if test "x$enable_zlib" != xno && test -z "$ZLIB"; then
   AC_CHECK_LIB(z, inflate,
     [AC_CHECK_HEADER(zlib.h, ZLIB='-lz', [enable_zlib=no])],
     [enable_zlib=no],
     [])
 fi
-if test x$enable_zlib != xno && test -n "$ZLIB"; then
+if test "x$enable_zlib" != xno && test -n "$ZLIB"; then
   AC_DEFINE(HAVE_ZLIB,1,[Define if we have the ZLIB library.])
 fi
-AM_CONDITIONAL([HAVE_ZLIB],[test x$enable_zlib != xno && test -n "$ZLIB"])
+AM_CONDITIONAL([HAVE_ZLIB],[test "x$enable_zlib" != xno && test -n "$ZLIB"])
 AC_SUBST(ZLIB)
 
 #############################################################################
 # libbz2
 # Optional.  Used sometimes for data compression, e.g. in NRRD.
 GWY_WITH([bzip2],,[build with bzip2 support])
-if test x$enable_bzip2 != xno && test -z "$BZIP2"; then
+if test "x$enable_bzip2" != xno && test -z "$BZIP2"; then
   AC_CHECK_LIB(bz2, BZ2_bzopen,
     [AC_CHECK_HEADER(bzlib.h, BZIP2='-lbz2', [enable_bzip2=no])],
     [enable_bzip2=no],
     [])
 fi
-if test x$enable_bzip2 != xno && test -n "$BZIP2"; then
+if test "x$enable_bzip2" != xno && test -n "$BZIP2"; then
   AC_DEFINE(HAVE_BZIP2,1,[Define if we have the BZIP2 library.])
 else
   BZIP2_WARN=" (needs bzip2)"
 fi
-AM_CONDITIONAL([HAVE_BZIP2],[test x$enable_bzip2 != xno && test -n "$BZIP2"])
+AM_CONDITIONAL([HAVE_BZIP2],[test "x$enable_bzip2" != xno && test -n "$BZIP2"])
 AC_SUBST(BZIP2)
 
 #############################################################################
@@ -560,13 +549,13 @@ PKG_CHECK_MODULES(MINIZIP, [minizip],
                   [AC_DEFINE(HAVE_MINIZIP,1,
                             [Define if we have the minizip package.])],
                   [enable_minizip=no])
-AM_CONDITIONAL([HAVE_MINIZIP],[test x$enable_minizip != xno])
+AM_CONDITIONAL([HAVE_MINIZIP],[test "x$enable_minizip" != xno])
 
 #############################################################################
 # libzip
 # Optional.  Used to load the crazy zip-compressed-bunch-of-XML formats.
 # Alternative to minizip (which is normally preferred).
-if test x$enable_minizip != xno; then
+if test "x$enable_minizip" != xno; then
   enable_libzip=no
 else
   enable_libzip=yes
@@ -575,15 +564,15 @@ else
                               [Define if we have the libzip package.])],
                     [enable_libzip=no])
 fi
-AM_CONDITIONAL([HAVE_LIBZIP],[test x$enable_libzip != xno])
+AM_CONDITIONAL([HAVE_LIBZIP],[test "x$enable_libzip" != xno])
 
 #############################################################################
 # So, at the end, do we have any zip file backend?
 have_any_zip=no
-if test x$enable_minizip != xno || test x$enable_libzip != xno; then
+if test "x$enable_minizip" != xno || test "x$enable_libzip" != xno; then
   have_any_zip=yes
 fi
-AM_CONDITIONAL([HAVE_ANY_ZIP],[test x$have_any_zip != xno])
+AM_CONDITIONAL([HAVE_ANY_ZIP],[test "x$have_any_zip" != xno])
 
 #############################################################################
 # PNG
@@ -593,7 +582,7 @@ PKG_CHECK_MODULES(PNG, [libpng],
                   [AC_DEFINE(HAVE_PNG,1,
                             [Define if we have the libpng package.])],
                   [enable_png=no])
-AM_CONDITIONAL([HAVE_PNG],[test x$enable_png != xno])
+AM_CONDITIONAL([HAVE_PNG],[test "x$enable_png" != xno])
 
 #############################################################################
 # WebP
@@ -603,7 +592,7 @@ PKG_CHECK_MODULES(WEBP, [libwebp],
                   [AC_DEFINE(HAVE_WEBP,1,
                             [Define if we have the libwebp package.])],
                   [enable_webp=no])
-AM_CONDITIONAL([HAVE_WEBP],[test x$enable_webp != xno])
+AM_CONDITIONAL([HAVE_WEBP],[test "x$enable_webp" != xno])
 
 #############################################################################
 # C++
@@ -612,22 +601,22 @@ AM_CONDITIONAL([HAVE_WEBP],[test x$enable_webp != xno])
 # hdrimage stuff completely.
 AC_MSG_CHECKING([if the C++ compiler is a real thing])
 if test "x$CXX" = "xg++" && test "x$GCC_CXX" != xyes; then
-  cxx_is_not_fake=no
+  have_cxx=no
 else
-  cxx_is_not_fake=yes
+  have_cxx=yes
 fi
-AC_MSG_RESULT([$cxx_is_not_fake])
-AM_CONDITIONAL([HAVE_CXX],[test x$cxx_is_not_fake != xno])
+AC_MSG_RESULT([$have_cxx])
+AM_CONDITIONAL([HAVE_CXX],[test "x$have_cxx" != xno])
 
 #############################################################################
 # OpenEXR
 # Optional.  Used for HDR greyscale OpenEXR pixmap import/export.
-enable_exr=$cxx_is_not_fake
+enable_exr=$have_cxx
 PKG_CHECK_MODULES(EXR, [OpenEXR],
                   [AC_DEFINE(HAVE_EXR,1,
                             [Define if we have the OpenEXR package.])],
                   [enable_exr=no])
-AM_CONDITIONAL([HAVE_EXR],[test x$enable_exr != xno])
+AM_CONDITIONAL([HAVE_EXR],[test "x$enable_exr" != xno])
 
 #############################################################################
 # CFITSIO
@@ -637,7 +626,7 @@ PKG_CHECK_MODULES(CFITSIO, [cfitsio],
                   [AC_DEFINE(HAVE_CFITSIO,1,
                             [Define if we have the cfitsio package.])],
                   [enable_cfitsio=no])
-AM_CONDITIONAL([HAVE_CFITSIO],[test x$enable_cfitsio != xno])
+AM_CONDITIONAL([HAVE_CFITSIO],[test "x$enable_cfitsio" != xno])
 
 #############################################################################
 # LibXML2.
@@ -649,7 +638,7 @@ if test "x$enable_libxml2" != "xno"; then
                                [Define if we have the libxml2 package.])],
                     [enable_libxml2=no])
 fi
-AM_CONDITIONAL([HAVE_XML2],[test x$enable_libxml2 != xno])
+AM_CONDITIONAL([HAVE_XML2],[test "x$enable_libxml2" != xno])
 
 #############################################################################
 # libunique
@@ -831,7 +820,7 @@ AC_CONFIG_COMMANDS([gwyconfig.h],
 
 _______EOF
 
-  if test x$enable_gl = xno; then
+  if test "x$enable_gl" = xno; then
     echo '#undef GWYDDION_HAS_OPENGL' >>$outfile
   else
     echo '#define GWYDDION_HAS_OPENGL 1' >>$outfile
@@ -871,10 +860,11 @@ _______EOF
   gwy_math_isnan=$gwy_math_isnan
 ])
 
+#############################################################################
+# Make msgmerge work on Darwin.  See
+# http://subcommanderblog.wordpress.com/2009/05/16/msgmerge-on-macosx-and-no-such-file-or-directory/
 if test "$os_darwin" = yes; then
   AC_MSG_NOTICE([fixing msgmerge to work on Darwin])
-  # Make msgmerge work on Darwin.  See
-  # http://subcommanderblog.wordpress.com/2009/05/16/msgmerge-on-macosx-and-no-such-file-or-directory/
   AC_CONFIG_COMMANDS([osx-chmod],
   [
     chmod +a "" po/*.po
@@ -882,73 +872,111 @@ if test "$os_darwin" = yes; then
   ])
 fi
 
-AC_OUTPUT
-
-enabled_formats=
-disabled_formats=
-
-if test "x$have_any_zip" != xno; then
-  enabled_formats="$enabled_formats, NanoObserver, NanoScanTech, OpenGPS, PLUX"
-  if test "x$enable_libxml2" != xno; then
-    enabled_formats="$enabled_formats, APE DAX"
+#############################################################################
+# Create lists of included and exclued optional file formats.
+# This table needs to be kept in sync with modules/file/Makefile.am.
+cat >conftest.out <<EOF
+have_any_zip? NanoObserver
+have_any_zip? NanoScanTech
+have_any_zip? OpenGPS
+have_any_zip? PLUx
+have_any_zip? SPMxFormat
+have_any_zip? JPK force
+enable_libxml2? have_any_zip? APE DAX
+enable_libxml2? enable_zlib? SPML
+enable_exr? have_cxx? OpenEXR
+enable_cfitsio? FITS
+enable_zlib? Createc/zlib
+enable_zlib? NRRD/zlib
+enable_zlib? RHK SM4 PRM meta/zlib
+enable_bzip2? NRRD/bzip2
+enable_png? have_cxx? PNG/16bit
+have_cxx? BigTIFF
+have_cxx? PGM/16bit
+enable_webp? WebP
+EOF
+
+for dep in enable_bzip2 enable_cfitsio enable_exr enable_libxml2 enable_png enable_webp enable_zlib have_any_zip have_cxx; do
+  AS_VAR_COPY([x],[$dep])
+  if test "x$x" != xno; then
+    sed -i "s/$dep? //" conftest.out
   else
-    disabled_formats="$disabled_formats, APE DAX"
+    sed -i "s/$dep? /#/" conftest.out
   fi
-else
-  disabled_formats="$disabled_formats, NanoObserver, NanoScanTech, OpenGPS, APE DAX, PLUX"
-fi
+done
 
-if test "x$enable_exr" != xno; then
-  enabled_formats="$enabled_formats, OpenEXR"
-else
-  disabled_formats="$disabled_formats, OpenEXR"
-fi
+enabled_formats=`grep -v '^#' conftest.out | sort | sed 's/$/, /' | tr -d '\n' | sed 's/, *$//'`
+disabled_formats=`grep '^#' conftest.out | sort | sed 's/$/, /' | tr -d '#\n' | sed 's/, *$//'`
+rm -f conftest.out
 
-if test "x$enable_cfitsio" != xno; then
-  enabled_formats="$enabled_formats, FITS"
-else
-  disabled_formats="$disabled_formats, FITS"
-fi
+AC_OUTPUT
 
-if test "x$enable_zlib" != xno; then
-  enabled_formats="$enabled_formats, Createc zlib compression, NRRD zlib compression, RHK SM4 PRM metadata compression"
-  if test "x$enable_libxml2" != xno; then
-    enabled_formats="$enabled_formats, SPML"
+#############################################################################
+# Print the summary.
+pygwy_hl=
+if test "x$enable_pygwy" = xyes; then
+  if test "x$enable_gtksourceview" = xyes; then
+    pygwy_hl=' (with syntax highlighting)'
   else
-    disabled_formats="$disabled_formats, SPML"
+    pygwy_hl=' (no syntax highlighting)'
   fi
-else
-  disabled_formats="$disabled_formats, SPML, Createc zlib compression, NRRD zlib compression, RHK SM4 PRM metadata compression"
 fi
 
-if test "x$enable_bzip2" != xno; then
-  enabled_formats="$enabled_formats, NRRD bzip2 compression"
-else
-  disabled_formats="$disabled_formats, NRRD bzip2 compression"
-fi
-
-if test "x$enable_png" != xno; then
-  enabled_formats="$enabled_formats, high-depth PNG"
-else
-  disabled_formats="$disabled_formats, high-depth PNG"
-fi
-
-enabled_formats=`echo "$enabled_formats" | sed 's/^, //'`
-disabled_formats=`echo "$disabled_formats" | sed 's/^, //'`
-
 echo "================================================================="
-echo "Configuration:"
-echo "  FFTW3:                             $enable_fftw3$FFTW3_WARN"
+echo "Configuration Summary:"
 echo "  OpenGL 3D widgets:                 $enable_gl$GL_WARN"
 echo "  Remote control:                    $remote_backend"
 echo "  Optional file formats included:    $enabled_formats"
 echo "  Optional file formats excluded:    $disabled_formats"
+echo "  Module linking:                    bundling=$enable_module_bundling, bloat=$enable_library_bloat"
 echo "  Thumbnailers to build:             $THUMBNAILERS"
-echo "  Python interface (pygwy):          $enable_pygwy$PYGWY_WARN"
-if test x$enable_pygwy = xyes; then
-  echo "  Pygwy console syntax highlighting: $enable_gtksourceview$GTKSOURCEVIEW_WARN"
-fi
+echo "  Python interface (pygwy):          $enable_pygwy$pygwy_hl$pygwy_warn"
 echo "  Desktop integration files go to:   $xdg_target"
 echo "================================================================="
 
+#############################################################################
+# Maintainer mode
+if test "x$enable_maintainer_mode" = xyes; then
+  missing_mmode_stuff=
+  if test "x$PYTHON" = x || test "x$PYTHON" = x:; then
+    missing_mmode_stuff="$missing_mmode_stuff, Python 2.x"
+  fi
+  if test "x$GLIB_MKENUMS" = x || test "x$GLIB_MKENUMS" = x:; then
+    missing_mmode_stuff="$missing_mmode_stuff, glib-mkenums"
+  fi
+  if test "x$GLIB_GENMARSHAL" = x || test "x$GLIB_GENMARSHAL" = x:; then
+    missing_mmode_stuff="$missing_mmode_stuff, glib-genmarshal"
+  fi
+  if test "x$INKSCAPE" = x || test "x$INKSCAPE" = x:; then
+    missing_mmode_stuff="$missing_mmode_stuff, Inkscape"
+  fi
+  if test "x$XSLTPROC" = x || test "x$XSLTPROC" = x:; then
+    missing_mmode_stuff="$missing_mmode_stuff, xsltproc"
+  fi
+  if test "x$enable_gtk_doc" != xyes; then
+    missing_mmode_stuff="$missing_mmode_stuff, gtk-doc"
+  fi
+  if test "x$PNGCRUSH" = x || test "x$PNGCRUSH" = x:; then
+    missing_mmode_stuff="$missing_mmode_stuff, pngcrush"
+  fi
+  if test "x$enable_pygwy" = xyes; then
+    if test "x$EPYDOC" = x || test "x$EPYDOC" = x:; then
+      missing_mmode_stuff="$missing_mmode_stuff, epydoc"
+    fi
+  fi
+  missing_mmode_stuff=`echo "$missing_mmode_stuff" | sed 's/^, //'`
+  if test "x$missing_mmode_stuff" != x; then
+    AC_MSG_WARN([Missing maintainer mode tools.
+*******************************************************************************
+  Maintainer mode is enabled, but some tools used to generate various files
+  are missing:
+
+     $missing_mmode_stuff
+
+  Depending on what you are doing and why you enabled the maintainer mode,
+  this may be OK or things may break horribly.
+*******************************************************************************])
+  fi
+fi
+
 # vim: set ts=2 sw=2 et :
diff --git a/data/Makefile.in b/data/Makefile.in
index 0d06e7e..c69835c 100644
--- a/data/Makefile.in
+++ b/data/Makefile.in
@@ -267,10 +267,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -280,6 +277,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -304,7 +303,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -362,6 +363,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -370,17 +372,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/data/glmaterials/Makefile.in b/data/glmaterials/Makefile.in
index 702c187..b67bee8 100644
--- a/data/glmaterials/Makefile.in
+++ b/data/glmaterials/Makefile.in
@@ -199,10 +199,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -212,6 +209,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -236,7 +235,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -294,6 +295,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -302,17 +304,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/data/gradients/Code-V b/data/gradients/Code-V
index 1cffb32..a217e2b 100644
--- a/data/gradients/Code-V
+++ b/data/gradients/Code-V
@@ -1,14 +1,14 @@
-Gwyddion resource GwyGradient
-0 0 0 0 1
-0 0.0196078 0.0196078 0.603922 1
-0.0894632 0 0.141176 0.752941 1
-0.17495 0 0.360784 0.835294 1
-0.264414 0.00392157 0.635294 0.811765 1
-0.355865 0 0.815686 0.65098 1
-0.449304 0.00392157 0.827451 0.329412 1
-0.544732 0.266667 0.839216 0 1
-0.636183 0.615686 0.866667 0 1
-0.727634 0.905882 0.886275 0 1
-0.819085 0.960784 0.635294 0.00392157 1
-0.916501 0.988235 0.356863 0 1
-1 0.913725 0.054902 0.0392157 1
+Gwyddion resource GwyGradient
+0 0 0 0 1
+0 0.0196078 0.0196078 0.603922 1
+0.0894632 0 0.141176 0.752941 1
+0.17495 0 0.360784 0.835294 1
+0.264414 0.00392157 0.635294 0.811765 1
+0.355865 0 0.815686 0.65098 1
+0.449304 0.00392157 0.827451 0.329412 1
+0.544732 0.266667 0.839216 0 1
+0.636183 0.615686 0.866667 0 1
+0.727634 0.905882 0.886275 0 1
+0.819085 0.960784 0.635294 0.00392157 1
+0.916501 0.988235 0.356863 0 1
+1 0.913725 0.054902 0.0392157 1
diff --git a/data/gradients/Gray-inverted b/data/gradients/Gray-inverted
new file mode 100644
index 0000000..1db6574
--- /dev/null
+++ b/data/gradients/Gray-inverted
@@ -0,0 +1,3 @@
+Gwyddion resource GwyGradient
+0 1 1 1 1
+1 0 0 0 1
diff --git a/data/gradients/Makefile.am b/data/gradients/Makefile.am
index 2a2aae9..c51be25 100644
--- a/data/gradients/Makefile.am
+++ b/data/gradients/Makefile.am
@@ -1,4 +1,4 @@
-# @(#) $Id: Makefile.am 16053 2014-03-26 13:28:57Z yeti-dn $
+# @(#) $Id: Makefile.am 19780 2017-05-22 08:57:32Z yeti-dn $
 
 gradientdatadir = $(pkgdatadir)/gradients
 
@@ -18,6 +18,7 @@ gradientdata_DATA = \
 	DFit \
 	Digitalis \
 	Gold \
+	Gray-inverted \
 	Green \
 	Green-Cyan \
 	Green-Stripes-4 \
@@ -50,7 +51,9 @@ gradientdata_DATA = \
 	Sky \
 	Sm2 \
 	Spectral \
+	Spectral-white \
 	Spring \
+	Viridis \
 	Warm \
 	Warpp-mono \
 	Warpp-spectral \
diff --git a/data/gradients/Makefile.in b/data/gradients/Makefile.in
index 8192718..3120468 100644
--- a/data/gradients/Makefile.in
+++ b/data/gradients/Makefile.in
@@ -14,7 +14,7 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 16053 2014-03-26 13:28:57Z yeti-dn $
+# @(#) $Id: Makefile.am 19780 2017-05-22 08:57:32Z yeti-dn $
 
 VPATH = @srcdir@
 am__is_gnu_make = { \
@@ -199,10 +199,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -212,6 +209,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -236,7 +235,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -294,6 +295,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -302,17 +304,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -414,6 +412,7 @@ gradientdata_DATA = \
 	DFit \
 	Digitalis \
 	Gold \
+	Gray-inverted \
 	Green \
 	Green-Cyan \
 	Green-Stripes-4 \
@@ -446,7 +445,9 @@ gradientdata_DATA = \
 	Sky \
 	Sm2 \
 	Spectral \
+	Spectral-white \
 	Spring \
+	Viridis \
 	Warm \
 	Warpp-mono \
 	Warpp-spectral \
diff --git a/data/gradients/Spectral-white b/data/gradients/Spectral-white
new file mode 100644
index 0000000..251f4c3
--- /dev/null
+++ b/data/gradients/Spectral-white
@@ -0,0 +1,13 @@
+Gwyddion resource GwyGradient
+0 1 1 1 1
+0.090909 0.940093 0.141772 0.135225 1
+0.181818 1 0.534417 0 1
+0.272727 0.875059 0.840787 0.022034 1
+0.363636 0.496666 0.898024 0.0742046 1
+0.454545 0.307927 0.782269 0.316396 1
+0.545455 0.281147 0.741558 0.76144 1
+0.636364 0.019608 0.529412 0.819608 1
+0.727273 0.0775921 0.114046 0.778973 1
+0.818182 0.388235 0.007843 0.678431 1
+0.909091 0.664988 0.21297 0.667338 1
+1 1 1 1 1
diff --git a/data/gradients/Viridis b/data/gradients/Viridis
new file mode 100644
index 0000000..4613fd9
--- /dev/null
+++ b/data/gradients/Viridis
@@ -0,0 +1,14 @@
+Gwyddion resource GwyGradient
+0 0.266667 0.00392157 0.329412 1
+0.122137 0.278431 0.168627 0.482353 1
+0.21374 0.247059 0.278431 0.537255 1
+0.316794 0.196078 0.392157 0.556863 1
+0.51145 0.121569 0.576471 0.54902 1
+0.564885 0.117647 0.627451 0.533333 1
+0.60687 0.137255 0.666667 0.513725 1
+0.683206 0.231373 0.733333 0.458824 1
+0.751908 0.364706 0.788235 0.384314 1
+0.824427 0.537255 0.839216 0.278431 1
+0.938931 0.839216 0.886275 0.0980392 1
+0.969466 0.921569 0.898039 0.0980392 1
+1 0.996078 0.905882 0.141176 1
diff --git a/data/gwyddion-thumbnailer.schemas.in b/data/gwyddion-thumbnailer.schemas.in
index ce3ed02..2455d39 100644
--- a/data/gwyddion-thumbnailer.schemas.in
+++ b/data/gwyddion-thumbnailer.schemas.in
@@ -49,6 +49,9 @@
 <schema><key>/schemas/desktop/gnome/thumbnailers/application at x-benyuan-csm-spm/enable</key><applyto>/desktop/gnome/thumbnailers/application at x-benyuan-csm-spm/enable</applyto><owner>gwyddion</owner><type>bool</type><default>true</default><locale name="C"><short>Enable thumbnailing of Benyuan CSM data</short><long>True enables thumbnailing and false disables the creation of new thumbnails</long></locale></schema>
 <schema><key>/schemas/desktop/gnome/thumbnailers/application at x-benyuan-csm-spm/command</key><applyto>/desktop/gnome/thumbnailers/application at x-benyuan-csm-spm/command</applyto><owner>gwyddion</owner><type>string</type><default>@bindir@/gwyddion-thumbnailer gnome2 %s %i %o</default><locale name="C"><short>Thumbnail command for Benyuan CSM data</short><long>Valid command plus arguments for the Benyuan CSM data thumbnailer</long></locale></schema>
 
+<schema><key>/schemas/desktop/gnome/thumbnailers/application at x-dektak-opdx/enable</key><applyto>/desktop/gnome/thumbnailers/application at x-dektak-opdx/enable</applyto><owner>gwyddion</owner><type>bool</type><default>true</default><locale name="C"><short>Enable thumbnailing of Dektak OPDx profilometry data</short><long>True enables thumbnailing and false disables the creation of new thumbnails</long></locale></schema>
+<schema><key>/schemas/desktop/gnome/thumbnailers/application at x-dektak-opdx/command</key><applyto>/desktop/gnome/thumbnailers/application at x-dektak-opdx/command</applyto><owner>gwyddion</owner><type>string</type><default>@bindir@/gwyddion-thumbnailer gnome2 %s %i %o</default><locale name="C"><short>Thumbnail command for Dektak OPDx profilometry data</short><long>Valid command plus arguments for the Dektak OPDx profilometry data thumbnailer</long></locale></schema>
+
 <schema><key>/schemas/desktop/gnome/thumbnailers/application at x-dektak-xml/enable</key><applyto>/desktop/gnome/thumbnailers/application at x-dektak-xml/enable</applyto><owner>gwyddion</owner><type>bool</type><default>true</default><locale name="C"><short>Enable thumbnailing of Dektak XML profilometry data</short><long>True enables thumbnailing and false disables the creation of new thumbnails</long></locale></schema>
 <schema><key>/schemas/desktop/gnome/thumbnailers/application at x-dektak-xml/command</key><applyto>/desktop/gnome/thumbnailers/application at x-dektak-xml/command</applyto><owner>gwyddion</owner><type>string</type><default>@bindir@/gwyddion-thumbnailer gnome2 %s %i %o</default><locale name="C"><short>Thumbnail command for Dektak XML profilometry data</short><long>Valid command plus arguments for the Dektak XML profilometry data thumbnailer</long></locale></schema>
 
@@ -310,5 +313,8 @@
 <schema><key>/schemas/desktop/gnome/thumbnailers/application at x-wsxm-spm/enable</key><applyto>/desktop/gnome/thumbnailers/application at x-wsxm-spm/enable</applyto><owner>gwyddion</owner><type>bool</type><default>true</default><locale name="C"><short>Enable thumbnailing of WSxM SPM data</short><long>True enables thumbnailing and false disables the creation of new thumbnails</long></locale></schema>
 <schema><key>/schemas/desktop/gnome/thumbnailers/application at x-wsxm-spm/command</key><applyto>/desktop/gnome/thumbnailers/application at x-wsxm-spm/command</applyto><owner>gwyddion</owner><type>string</type><default>@bindir@/gwyddion-thumbnailer gnome2 %s %i %o</default><locale name="C"><short>Thumbnail command for WSxM SPM data</short><long>Valid command plus arguments for the WSxM SPM data thumbnailer</long></locale></schema>
 
+<schema><key>/schemas/desktop/gnome/thumbnailers/application at x-zeiss-lsm-spm/enable</key><applyto>/desktop/gnome/thumbnailers/application at x-zeiss-lsm-spm/enable</applyto><owner>gwyddion</owner><type>bool</type><default>true</default><locale name="C"><short>Enable thumbnailing of Carl Zeiss CLSM images</short><long>True enables thumbnailing and false disables the creation of new thumbnails</long></locale></schema>
+<schema><key>/schemas/desktop/gnome/thumbnailers/application at x-zeiss-lsm-spm/command</key><applyto>/desktop/gnome/thumbnailers/application at x-zeiss-lsm-spm/command</applyto><owner>gwyddion</owner><type>string</type><default>@bindir@/gwyddion-thumbnailer gnome2 %s %i %o</default><locale name="C"><short>Thumbnail command for Carl Zeiss CLSM images</short><long>Valid command plus arguments for the Carl Zeiss CLSM images thumbnailer</long></locale></schema>
+
 </schemalist>
 </gconfschemafile>
diff --git a/data/gwyddion.1 b/data/gwyddion.1
index edb6e6f..7c8dc25 100644
--- a/data/gwyddion.1
+++ b/data/gwyddion.1
@@ -1,13 +1,22 @@
 '\" t
 .\"     Title: gwyddion
 .\"    Author: Yeti
-.\" Generator: DocBook XSL Stylesheets v1.75.2 <http://docbook.sf.net/>
-.\"      Date: 01/26/2011
+.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
+.\"      Date: 04/04/2017
 .\"    Manual: Gwyddion
 .\"    Source: gwyddion
 .\"  Language: English
 .\"
-.TH "GWYDDION" "1" "01/26/2011" "gwyddion" "Gwyddion"
+.TH "GWYDDION" "1" "04/04/2017" "gwyddion" "Gwyddion"
+.\" -----------------------------------------------------------------
+.\" * Define some portability stuff
+.\" -----------------------------------------------------------------
+.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.\" http://bugs.debian.org/507673
+.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
+.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.ie \n(.g .ds Aq \(aq
+.el       .ds Aq '
 .\" -----------------------------------------------------------------
 .\" * set default formatting
 .\" -----------------------------------------------------------------
@@ -90,21 +99,36 @@ Instead of running the user interface and opening
 .PP
 \fB\-\-disable\-gl\fR
 .RS 4
-Disables OpenGL entirely, including any checks whether it is available\&. This option, of course, has any effect only if Gwyddion was built with OpenGL support and one of the most visible effects is that 3D view becomes unavailable\&. However, you may find it useful if you encounter a system so broken that even checking for OpenGL capabilities leads to X server errors\&.
+Disables OpenGL entirely, including any checks whether it is available\&. This option, of course, has any effect only if Gwyddion was built with OpenGL support and one of the most visible effects is that 3D view becomes unavailable\&. However, you may find it useful if you encounter a system so broken that even checking for OpenGL capabilities leads to X server errors\&. It can also help when you run Gwyddion remotely using X11 forwarding and the start\-up time seems excessively long\&.
 .RE
 .PP
 \fB\-\-log\-to\-file\fR
 .RS 4
-Redirect messages from GLib, Gtk+, Gwyddion, etc\&. to
+Write messages from GLib, Gtk+, Gwyddion, etc\&. to
 ~/\&.gwyddion/gwyddion\&.log
 or file given in
 \fBGWYDDION_LOGFILE\fR
-environment variable\&. This option is most useful on Unix as on Win32 messages are redirected to a file by default\&.
+environment variable\&. This option is most useful on Unix as on Win32 messages are redirected to a file by default\&. Logging to a file and console are not exclusive; messages can go to both\&.
+.RE
+.PP
+\fB\-\-no\-log\-to\-file\fR
+.RS 4
+Prevents writing messages from GLib, Gtk+, Gwyddion, etc\&. to a file\&. This is most useful on Win32 where messages are written to a file by default\&.
+.RE
+.PP
+\fB\-\-log\-to\-console\fR
+.RS 4
+Print messages from GLib, Gtk+, Gwyddion, etc\&. to the console\&. More precisely, debugging messages are printed to the standard output, errors and warnings to the standard error\&. On Unix messages are printed to the console by default\&. Logging to a file and console are not exclusive; messages can go to both\&.
 .RE
 .PP
 \fB\-\-no\-log\-to\-file\fR
 .RS 4
-Prevents redirection of messages from GLib, Gtk+, Gwyddion, etc\&. to a file\&. This is most useful on Win32 (where messages are redirected to a file by default) provided that stdout and stderr go somewhere you can see them\&.
+Disables printing messages to the console\&. This is most useful on Unix where messages are printed to the console by default\&.
+.RE
+.PP
+\fB\-\-disable\-modules=\fR\fB\fIMODULE,\&.\&.\&.\fR\fR
+.RS 4
+Prevents the registration modules of given names\&. This is mostly useful for development and debugging\&.
 .RE
 .PP
 \fB\-\-debug\-objects\fR
@@ -180,7 +204,7 @@ and some Gwyddion\-specific variables:
 .RS 4
 Name of file to redirect log messages to\&. On MS Windows, messages are always sent to a file as working with the terminal is cumbersome there\&. The default log file location,
 gwyddion\&.log
-in user\'s Documents and Settings, can be overridden with
+in user\*(Aqs Documents and Settings, can be overridden with
 \fBGWYDDION_LOGFILE\fR\&. On Unix, messages go to the terminal by default and this environment variable has effect only if
 \fB\-\-log\-to\-file\fR
 is given\&.
@@ -248,7 +272,6 @@ Directory to place user python modules or scripts to\&.
 .RE
 .SH "SEE ALSO"
 .PP
-
 \fBgwyddion-thumbnailer\fR(1),
 \fBgxsm\fR(1)
 .SH "AUTHOR"
diff --git a/data/gwyddion.nsit.in b/data/gwyddion.nsit.in
index 63d6cc5..53d7f21 100644
--- a/data/gwyddion.nsit.in
+++ b/data/gwyddion.nsit.in
@@ -3,10 +3,9 @@
 ; Delete and RMDir commands (that's why the extension is nsit, not nsi).  It
 ; also expands ARCH to either win32 or win64.
 ; Written by Yeti.  Public domain.
-; Revision $Id: gwyddion.nsit.in 19277 2016-11-16 16:51:18Z yeti-dn $
+; Revision $Id: gwyddion.nsit.in 19995 2017-06-27 14:53:15Z yeti-dn $
 
 !define GTK_BIN_VERSION "2.10.0"
-!define PANGO_BIN_VERSION "1.8.0"
 
 !define PRODUCT_VERSION "@PACKAGE_VERSION at .%ARCH%"
 !define PRODUCT_BIN_VERSION "2.0"
@@ -93,9 +92,11 @@ Function DetectPrevInstallation
     MessageBox MB_YESNOCANCEL|MB_ICONQUESTION \
         "${PRODUCT_NAME} $R1 is already installed in $R2.$\n$\n\
         Do you want to replace it with ${PRODUCT_NAME} ${PRODUCT_VERSION}?$\n$\n\
-        Click Yes to upgrade the previous version, \
-        No to ignore the previous version and proceed, \
-        Cancel to abort the installation." \
+        Yes: Upgrade the previous version.$\n$\n\
+        No: Ignore the previous version and proceed.  \
+            WARNING: This can result in a broken installation!  \
+            Only use if you know what you are doing!$\n$\n\
+        Cancel: Abort the installation." \
         /SD IDYES IDYES uninstall_prev IDNO detect_prev_finished
 
     Quit
@@ -145,8 +146,9 @@ Function ChooseLocale
     !insertmacro GWY_LOCALE_CHOOSER "French" "fr_FR.UTF-8" 60u
     !insertmacro GWY_LOCALE_CHOOSER "Italian" "it_IT.UTF-8" 72u
     !insertmacro GWY_LOCALE_CHOOSER "Korean" "ko_KR.UTF-8" 84u
-    !insertmacro GWY_LOCALE_CHOOSER "Russian" "ru_RU.UTF-8" 96u
-    !insertmacro GWY_LOCALE_CHOOSER "Spanish" "es_ES.UTF-8" 108u
+    !insertmacro GWY_LOCALE_CHOOSER "Portuguese (Brazilian)" "pt_BR.UTF-8" 96u
+    !insertmacro GWY_LOCALE_CHOOSER "Russian" "ru_RU.UTF-8" 108u
+    !insertmacro GWY_LOCALE_CHOOSER "Spanish" "es_ES.UTF-8" 120u
 # @@@ GENERATED LANG NSIS-MENU END @@@
 
     nsDialogs::Show
@@ -239,10 +241,8 @@ Section "Gwyddion (required)"
     GwyExpandFiles "bin\libIexMath-*.dll"
     GwyExpandFiles "bin\libIlmThread-*.dll"
     GwyExpandFiles "bin\libImath-*.dll"
-    GwyExpandFiles "bin\pango-querymodules.exe"
     GwyExpandFiles "bin\zlib1.dll"
     GwyExpandFiles "bin\libminizip-*.dll"
-    GwyExpandFiles "etc\pango\pango.modules"
     GwyExpandFiles "etc\gtk-2.0\gtk.immodules"
     GwyExpandFiles "etc\gtk-2.0\im-multipress.conf"
     GwyExpandFiles "lib\gdk-pixbuf-2.0\${GTK_BIN_VERSION}\loaders.cache"
@@ -252,7 +252,6 @@ Section "Gwyddion (required)"
     GwyExpandFiles "lib\gtk-2.0\modules\*.dll"
     GwyExpandFiles "lib\gwyddion\modules\*.dll"
     GwyExpandFiles "lib\gwyddion\modules\*\*.dll"
-    GwyExpandFiles "lib\pango\${PANGO_BIN_VERSION}\modules\*.dll"
     GwyExpandFiles "share\gwyddion\glmaterials\*"
     GwyExpandFiles "share\gwyddion\gradients\*"
     GwyExpandFiles "share\gwyddion\pixmaps\*"
@@ -275,6 +274,7 @@ Section "Gwyddion (required)"
     GwyExpandFiles "share\locale\fr\LC_MESSAGES\*.mo"
     GwyExpandFiles "share\locale\it\LC_MESSAGES\*.mo"
     GwyExpandFiles "share\locale\ko\LC_MESSAGES\*.mo"
+    GwyExpandFiles "share\locale\pt_BR\LC_MESSAGES\*.mo"
     GwyExpandFiles "share\locale\ru\LC_MESSAGES\*.mo"
     GwyExpandFiles "share\locale\es\LC_MESSAGES\*.mo"
 # @@@ GENERATED LANG NSIS-MO END @@@
diff --git a/data/gwyddion.pc.in b/data/gwyddion.pc.in
index cd7725e..52b3b4f 100644
--- a/data/gwyddion.pc.in
+++ b/data/gwyddion.pc.in
@@ -11,6 +11,6 @@ gwypixmapdir=@datadir@/@PACKAGE@/pixmaps
 Name: Gwyddion
 Description: Gwyddion library
 Version: @VERSION@
-Requires: glib-2.0 >= 2.6.0 gtk+-2.0 >= 2.6.0 pangoft2 @GTKGLEXT_DEPENDENCY@ @FFTW3_DEPENDENCY@
+Requires: glib-2.0 >= 2.6.0 gtk+-2.0 >= 2.6.0 fftw3 pangoft2 @GTKGLEXT_DEPENDENCY@
 Libs: -L${libdir} -lgwyapp2 -lgwymodule2 -lgwydgets2 -lgwydraw2 -lgwyprocess2 -lgwyddion2
 Cflags: -I${includedir}/gwyddion -I${libdir}/gwyddion/include
diff --git a/data/gwyddion.spec.in b/data/gwyddion.spec.in
index f46eacb..52042f1 100644
--- a/data/gwyddion.spec.in
+++ b/data/gwyddion.spec.in
@@ -1,14 +1,11 @@
-# @(#) $Id: gwyddion.spec.in 18763 2016-07-23 12:45:07Z yeti-dn $
-%{expand:%global distro_is_redhat %(test ! -f /etc/redhat-release; echo $?)}
-%{expand:%global distro_is_suse %(test ! -f /etc/SuSE-release; echo $?)}
-
+# @(#) $Id: gwyddion.spec.in 20201 2017-08-08 17:03:21Z yeti-dn $
 Name:          @PACKAGE_TARNAME@
 Version:       @PACKAGE_VERSION@
-Release:       1
+Release:       1%{?dist}
 Summary:       An SPM data visualization and analysis tool
 
 Group:         Applications/Engineering
-License:       GNU GPL
+License:       GPLv2+
 URL:           @PACKAGE_URL@
 Source0:       http://gwyddion.net/download/%{version}/%{name}-%{version}.tar.xz
 BuildRoot:     %{_tmppath}/%{name}-%{version}-%{release}-root-%(id -un)
@@ -16,70 +13,64 @@ Requires(pre):    /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
 
 BuildRequires: gcc-c++
-BuildRequires: gtk2-devel >= 2.14
-BuildRequires: glib2-devel >= 2.14
-BuildRequires: pango-devel >= 1.10
-BuildRequires: cairo-devel >= 1.6
-BuildRequires: gtkglext-devel
-BuildRequires: libxml2-devel
+BuildRequires: pkgconfig(gtk+-2.0) >= 2.14
+BuildRequires: pkgconfig(glib-2.0) >= 2.14
+BuildRequires: pkgconfig(pango) >= 1.12
+BuildRequires: pkgconfig(cairo) >= 1.6
+BuildRequires: pkgconfig(fftw3) >= 3.1
+BuildRequires: pkgconfig(gtkglext-1.0)
+BuildRequires: pkgconfig(libxml-2.0)
 BuildRequires: zlib-devel
-BuildRequires: libwebp-devel
-BuildRequires: ruby >= 1.8
-%if %{distro_is_redhat}
-BuildRequires: rubypick
-%endif
+BuildRequires: pkgconfig(libwebp)
+BuildRequires: pkgconfig(OpenEXR)
+BuildRequires: pkgconfig(cfitsio)
+BuildRequires: pkgconfig(libpng)
+BuildRequires: pkgconfig(unique-1.0)
+BuildRequires: ruby(release) >= 1.8
 BuildRequires: gettext
 BuildRequires: desktop-file-utils >= 0.9
-BuildRequires: pkgconfig
 BuildRequires: findutils
+BuildRequires: pkgconfig(xmu)
+BuildRequires: pkgconfig(gtksourceview-2.0)
+BuildRequires: pkgconfig(minizip)
+BuildRequires: sed
 
-%if %{distro_is_redhat}
-BuildRequires: libXmu-devel
-BuildRequires: pygtk2-devel
-BuildRequires: gtksourceview2-devel
-# minizip would be nice to require everywhere but it does not seem available.
-BuildRequires: minizip-devel
-%define fftw3 fftw
-%define fftw3devel fftw-devel
-%define python2devel python2-devel
-%define configureopts %{nil}
+%if 0%{?suse_version}
+BuildRequires: pkg-config
+%else
+BuildRequires: pkgconfig
 %endif
 
-%if %{distro_is_suse}
-BuildRequires: xorg-x11-Mesa-devel
-BuildRequires: xorg-x11-libXmu-devel
-BuildRequires: python-gtk-devel
-BuildRequires: gtksourceview-devel
-BuildRequires: libzip-devel
-%define fftw3 fftw3
-%define fftw3devel fftw3-devel
-%define configureopts %{nil}
+BuildRequires: perl >= 5.005
+%if 0%{?rhl}
+BuildRequires: perl-podlators
 %endif
 
-# Default the fftw package name to the common name in the hope the distro
-# provides that.  The expansion inside %if is somehow limited, define the
-# test in two steps.
-%define fftwundefined %{?fftw3:0}%{!?fftw3:1}
-%if %{fftwundefined}
-%define fftw3 fftw
-%define fftw3devel fftw-devel
+# Obsolete?  Keep for now...
+%if 0%{?suse_version}
+%define gconf2 gconf2
+%else
+%define gconf2 GConf2
 %endif
+BuildRequires: %{gconf2}
 
-# Ditto for the python development package.
-%define python2undefined %{?python2devel:0}%{!?python2devel:1}
-%if %{python2undefined}
-%define python2devel python-devel
+%if 0%{?fedora} >= 26
+%define python2 python2
+%else
+%define python2 python
 %endif
+BuildRequires: %{python2}
+BuildRequires: %{python2}-devel >= 2.7
 
-%ifarch %ix86
-BuildRequires: %{fftw3devel} >= 3.0
-%else
-BuildRequires: %{fftw3devel} >= 3.1
+%if 0%{?rhl}
+BuildRequires: pygtk2-devel >= 2.10
 %endif
-BuildRequires: %{python2devel} >= 2.2
-# Fedora guarantees these two, other may not
-BuildRequires: perl >= 5.005
-BuildRequires: sed
+%if 0%{?suse_version}
+BuildRequires: python-gtk-devel >= 2.10
+%endif
+# otherwise...?
+
+%define configureopts %{nil}
 
 # The only packaged perl module is private, don't expose it.
 %define __perl_provides %{nil}
@@ -99,24 +90,21 @@ BuildRequires: sed
 %package devel
 Summary:       Headers, libraries and tools for Gwyddion module development
 Group:         Development/Libraries
-Requires:      %{name} = %{version}
+Requires:      %{name}%{?_isa} = %{version}
 # This pulls everything else
-Requires:      gtk2-devel >= 2.8
-Requires:      gtkglext-devel
-Requires:      %{fftw3devel}
-%if %{distro_is_redhat}
+Requires:      gtk2-devel%{?_isa} >= 2.8
+Requires:      gtkglext-devel%{?_isa}
 Requires:      perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version))
-Requires:      python-abi = %(%{__python} -c "import sys ; print sys.version[:3]")
-%endif
+Requires:      python-abi = 2.7
 
 
 %package thumbnailer-gconf
 Summary:         GConf schemas for gwyddion-thumbnailer integration
 Group:           System Environment/Libraries
 Requires:        %{name} = %{version}
-Requires(pre):   GConf2
-Requires(post):  GConf2
-Requires(preun): GConf2
+Requires(pre):   %{gconf2}
+Requires(post):  %{gconf2}
+Requires(preun): %{gconf2}
 
 
 %description
@@ -216,7 +204,7 @@ fi
 %{_bindir}/%{name}
 %{_bindir}/%{name}-thumbnailer
 %defattr(-,root,root)
-%doc AUTHORS COPYING INSTALL.%{name} NEWS README THANKS
+%doc AUTHORS COPYING NEWS README THANKS
 %{pkgdatadir}/pixmaps/*.png
 %{pkgdatadir}/pixmaps/*.ico
 %{pkgdatadir}/gradients/*
@@ -316,3 +304,7 @@ fi
 
 %files thumbnailer-gconf
 %{gconfdir}/*.schemas
+
+%changelog
+* Tue Aug  8 2017 Yeti <yeti at gwyddion.net> - @PACKAGE_VERSION at -1
+- hello rpmlint, this package is partially generated
diff --git a/data/gwyddion.vim b/data/gwyddion.vim
index efb7cd0..42812fd 100644
--- a/data/gwyddion.vim
+++ b/data/gwyddion.vim
@@ -1,7 +1,7 @@
 " Vim syntax file
 " Language: C gwyddion extension
 " Maintainer: David Nečas (Yeti) <yeti at physics.muni.cz>
-" Last Change: 2016-11-18
+" Last Change: 2017-08-15
 " URL: http://gwyddion.net/download/test/gwyddion.vim
 " Generated By: vim-syn-gen.py
 " Options:
@@ -11,15 +11,15 @@
 "    let gwyddion_deprecated_errors = 1
 "       highlights deprecated declarations as Errors
 
-syn keyword gwyddionFunction gwy_2d_cwt_wavelet_type_get_enum gwy_2d_cwt_wavelet_type_get_type gwy_3d_label_expand_text gwy_3d_label_get_text gwy_3d_label_get_type gwy_3d_label_new gwy_3d_label_reset gwy_3d_label_reset_text gwy_3d_label_set_text gwy_3d_label_user_size gwy_3d_movement_get_type gwy_3d_projection_get_type gwy_3d_setup_get_type gwy_3d_setup_new gwy_3d_view_class_disable_axis_drawing gwy_3d_view_get_data gwy_3d_view_get_data_key gwy_3d_view_get_gradient_key gwy_3d_view_get_la [...]
+syn keyword gwyddionFunction gwy_2d_cwt_wavelet_type_get_enum gwy_2d_cwt_wavelet_type_get_type gwy_3d_label_expand_text gwy_3d_label_get_text gwy_3d_label_get_type gwy_3d_label_new gwy_3d_label_reset gwy_3d_label_reset_text gwy_3d_label_set_text gwy_3d_label_user_size gwy_3d_movement_get_type gwy_3d_projection_get_type gwy_3d_setup_get_type gwy_3d_setup_new gwy_3d_view_class_disable_axis_drawing gwy_3d_view_get_data gwy_3d_view_get_data_key gwy_3d_view_get_gradient_key gwy_3d_view_get_la [...]
 syn keyword gwyddionTypedef GdkGLConfig GwyPoint GwyTriangulationPointXY GwyTriangulationPointXYZ
-syn keyword gwyddionConstant GWY_2DCWT_GAUSS GWY_2DCWT_HAT GWY_3D_MOVEMENT_DEFORMATION GWY_3D_MOVEMENT_LIGHT GWY_3D_MOVEMENT_NONE GWY_3D_MOVEMENT_ROTATION GWY_3D_MOVEMENT_SCALE GWY_3D_PROJECTION_ORTHOGRAPHIC GWY_3D_PROJECTION_PERSPECTIVE GWY_3D_VIEW_LABEL_MAX GWY_3D_VIEW_LABEL_MIN GWY_3D_VIEW_LABEL_X GWY_3D_VIEW_LABEL_Y GWY_3D_VIEW_NLABELS GWY_3D_VISUALIZATION_GRADIENT GWY_3D_VISUALIZATION_LIGHTING GWY_3D_VISUALIZATION_OVERLAY GWY_3D_VISUALIZATION_OVERLAY_NO_LIGHT GWY_APP_BRICK GWY_APP_B [...]
-syn keyword gwyddionStruct Gwy3DLabel Gwy3DLabelClass Gwy3DSetup Gwy3DSetupClass Gwy3DView Gwy3DViewClass Gwy3DWindow Gwy3DWindowClass GwyAppDataId GwyAxis GwyAxisClass GwyAxisParams GwyBrick GwyBrickClass GwyBrickPart GwyCDLine GwyCDLineBuiltin GwyCDLineClass GwyCalData GwyCalDataClass GwyCalibration GwyCalibrationClass GwyChannelData GwyColorAxis GwyColorAxisClass GwyColorButton GwyColorButtonClass GwyComputationState GwyContainer GwyContainerClass GwyCurve GwyCurveCalibrationData GwyC [...]
+syn keyword gwyddionConstant GWY_2DCWT_GAUSS GWY_2DCWT_HAT GWY_3D_MOVEMENT_DEFORMATION GWY_3D_MOVEMENT_LIGHT GWY_3D_MOVEMENT_NONE GWY_3D_MOVEMENT_ROTATION GWY_3D_MOVEMENT_SCALE GWY_3D_PROJECTION_ORTHOGRAPHIC GWY_3D_PROJECTION_PERSPECTIVE GWY_3D_VIEW_LABEL_MAX GWY_3D_VIEW_LABEL_MIN GWY_3D_VIEW_LABEL_X GWY_3D_VIEW_LABEL_Y GWY_3D_VIEW_NLABELS GWY_3D_VISUALIZATION_GRADIENT GWY_3D_VISUALIZATION_LIGHTING GWY_3D_VISUALIZATION_OVERLAY GWY_3D_VISUALIZATION_OVERLAY_NO_LIGHT GWY_AFFINE_SCALING_AS_G [...]
+syn keyword gwyddionStruct Gwy3DLabel Gwy3DLabelClass Gwy3DSetup Gwy3DSetupClass Gwy3DView Gwy3DViewClass Gwy3DWindow Gwy3DWindowClass GwyAdjustBar GwyAdjustBarClass GwyAppDataId GwyAxis GwyAxisClass GwyAxisParams GwyBrick GwyBrickClass GwyBrickPart GwyCDLine GwyCDLineBuiltin GwyCDLineClass GwyCalData GwyCalDataClass GwyCalibration GwyCalibrationClass GwyChannelData GwyColorAxis GwyColorAxisClass GwyColorButton GwyColorButtonClass GwyComputationState GwyContainer GwyContainerClass GwyCur [...]
 syn keyword gwyddionUnion GwySerializeValue
-syn keyword gwyddionMacro GWY_3D_LABEL GWY_3D_LABEL_CLASS GWY_3D_LABEL_GET_CLASS GWY_3D_SETUP GWY_3D_SETUP_CLASS GWY_3D_SETUP_GET_CLASS GWY_3D_VIEW GWY_3D_VIEW_CLASS GWY_3D_VIEW_GET_CLASS GWY_3D_WINDOW GWY_3D_WINDOW_CLASS GWY_3D_WINDOW_GET_CLASS GWY_AXIS GWY_AXIS_CLASS GWY_AXIS_GET_CLASS GWY_BRICK GWY_BRICK_CLASS GWY_BRICK_GET_CLASS GWY_CALDATA GWY_CALDATA_CLASS GWY_CALDATA_GET_CLASS GWY_CALIBRATION GWY_CALIBRATION_CLASS GWY_CALIBRATION_GET_CLASS GWY_CDLINE GWY_CDLINE_CLASS GWY_CDLINE_GE [...]
-syn keyword gwyddionEnum Gwy2DCWTWaveletType Gwy3DMovement Gwy3DProjection Gwy3DViewLabel Gwy3DVisualization GwyAppLoggingFlags GwyAppPage GwyAppSettingsError GwyAppWhat GwyAxisScaleFormat GwyByteOrder GwyComputationStateType GwyCorrelationType GwyCurveChannel GwyCurveType GwyDWTDenoiseType GwyDWTType GwyDataCompatibilityFlags GwyDataError GwyDataFieldCached GwyDataItem GwyDataValidateFlags GwyDataViewLayerType GwyDataWatchEventType GwyDebugObjectsDumpFlags GwyDistanceTransformType GwyEx [...]
-syn keyword gwyddionUserFunction GwyAppDataForeachFunc GwyAppDataWatchFunc GwyColorAxisMapFunc GwyCoordTransform2DFunc GwyDataChooserFilterFunc GwyDeserializeFunc GwyFileDetectFunc GwyFileLoadFunc GwyFileSaveFunc GwyGraphFunc GwyMarkerValidateFunc GwyModuleQueryFunc GwyModuleRegisterFunc GwyNLFitDerFunc GwyNLFitFunc GwyNLFitIdxDiffFunc GwyNLFitIdxFunc GwyProcessFunc GwySaveAuxiliaryCreate GwySaveAuxiliaryDestroy GwySelectionFilterFunc GwySerializeFunc GwySetFractionFunc GwySetMessageFunc [...]
-syn keyword gwyddionDefine GWY_APP_DATA_ID_NONE GWY_APP_SETTINGS_ERROR GWY_CONTAINER_PATHSEP GWY_CONTAINER_PATHSEP_STR GWY_EXPR_ERROR GWY_FILE_DETECT_BUFFER_SIZE GWY_GL_MATERIAL_DEFAULT GWY_GL_MATERIAL_NONE GWY_GRADIENT_DEFAULT GWY_ICON_SIZE_ABOUT GWY_MODULE_ABI_VERSION GWY_MODULE_FILE_ERROR GWY_SQRT3 GWY_SQRT_PI GWY_STOCK_3D_BASE GWY_STOCK_ARITHMETIC GWY_STOCK_BOLD GWY_STOCK_CANTILEVER GWY_STOCK_COLOR_RANGE GWY_STOCK_COLOR_RANGE_ADAPTIVE GWY_STOCK_COLOR_RANGE_AUTO GWY_STOCK_COLOR_RANGE_ [...]
+syn keyword gwyddionMacro GWY_3D_LABEL GWY_3D_LABEL_CLASS GWY_3D_LABEL_GET_CLASS GWY_3D_SETUP GWY_3D_SETUP_CLASS GWY_3D_SETUP_GET_CLASS GWY_3D_VIEW GWY_3D_VIEW_CLASS GWY_3D_VIEW_GET_CLASS GWY_3D_WINDOW GWY_3D_WINDOW_CLASS GWY_3D_WINDOW_GET_CLASS GWY_ADJUST_BAR GWY_ADJUST_BAR_CLASS GWY_ADJUST_BAR_GET_CLASS GWY_AXIS GWY_AXIS_CLASS GWY_AXIS_GET_CLASS GWY_BRICK GWY_BRICK_CLASS GWY_BRICK_GET_CLASS GWY_CALDATA GWY_CALDATA_CLASS GWY_CALDATA_GET_CLASS GWY_CALIBRATION GWY_CALIBRATION_CLASS GWY_CA [...]
+syn keyword gwyddionEnum Gwy2DCWTWaveletType Gwy3DMovement Gwy3DProjection Gwy3DViewLabel Gwy3DVisualization GwyAffineScalingType GwyAppLoggingFlags GwyAppPage GwyAppSettingsError GwyAppWhat GwyAxisScaleFormat GwyByteOrder GwyComputationStateType GwyCorrelationType GwyCurveChannel GwyCurveType GwyDWTDenoiseType GwyDWTType GwyDataCompatibilityFlags GwyDataError GwyDataFieldCached GwyDataItem GwyDataValidateFlags GwyDataViewLayerType GwyDataWatchEventType GwyDebugObjectsDumpFlags GwyDistan [...]
+syn keyword gwyddionUserFunction GwyAppDataForeachFunc GwyAppDataWatchFunc GwyColorAxisMapFunc GwyCoordTransform2DFunc GwyDataChooserFilterFunc GwyDeserializeFunc GwyFileDetectFunc GwyFileLoadFunc GwyFileSaveFunc GwyGraphFunc GwyMarkerValidateFunc GwyModuleBundleRegisterFunc GwyModuleQueryFunc GwyModuleRegisterFunc GwyNLFitDerFunc GwyNLFitFunc GwyNLFitIdxDiffFunc GwyNLFitIdxFunc GwyProcessFunc GwySaveAuxiliaryCreate GwySaveAuxiliaryDestroy GwySelectionFilterFunc GwySerializeFunc GwySetFr [...]
+syn keyword gwyddionDefine GWY_APP_DATA_ID_NONE GWY_APP_SETTINGS_ERROR GWY_CONTAINER_PATHSEP GWY_CONTAINER_PATHSEP_STR GWY_EXPR_ERROR GWY_FILE_DETECT_BUFFER_SIZE GWY_GL_MATERIAL_DEFAULT GWY_GL_MATERIAL_NONE GWY_GRADIENT_DEFAULT GWY_ICON_SIZE_ABOUT GWY_MODULE_ABI_VERSION GWY_MODULE_BUNDLE_FLAG GWY_MODULE_ERROR GWY_MODULE_FILE_ERROR GWY_SQRT3 GWY_SQRT_PI GWY_STOCK_3D_BASE GWY_STOCK_ARITHMETIC GWY_STOCK_BOLD GWY_STOCK_CANTILEVER GWY_STOCK_COLOR_RANGE GWY_STOCK_COLOR_RANGE_ADAPTIVE GWY_STOCK [...]
 syn keyword gwyddionDeprecatedFunction gwy_cdline_get_param_default gwy_data_field_area_get_avg gwy_data_field_area_get_median gwy_data_field_area_get_min_max gwy_data_field_area_get_rms gwy_data_field_area_get_stats gwy_data_field_area_get_sum gwy_data_field_area_get_surface_area gwy_data_line_line_rotate gwy_dialog_prevent_delete_cb gwy_get_pango_ft2_font_map
 syn keyword gwyddionDeprecatedConstant GWY_TOOL_SWITCH_TOOL GWY_TOOL_SWITCH_WINDOW
 syn keyword gwyddionDeprecatedStruct GwyTipModelPreset
diff --git a/data/gwyddion.xml b/data/gwyddion.xml
index 4a22f11..d6a0a73 100644
--- a/data/gwyddion.xml
+++ b/data/gwyddion.xml
@@ -153,6 +153,14 @@
   <glob pattern="*.CSM"/>
 </mime-type>
 
+<!-- From module dektakvca.c -->
+<mime-type type="application/x-dektak-opdx">
+  <comment>Dektak OPDx profilometry data</comment>
+  <magic priority="80">
+    <match type="string" offset="0" value="VCA DATA\x01\x00\x00\x55"/>
+  </magic>
+</mime-type>
+
 <!-- From module dektakxml.c -->
 <mime-type type="application/x-dektak-xml">
   <comment>Dektak XML profilometry data</comment>
@@ -231,6 +239,7 @@
   </magic>
 </mime-type>
 
+<!-- Module file.c contains no magic. -->
 <!-- Module fitsfile.c contains no magic. -->
 <!-- From module gdeffile.c -->
 <mime-type type="application/x-gdef-spm">
@@ -542,6 +551,7 @@
   <comment>Nanoscope III SPM data</comment>
   <magic priority="80">
     <match type="string" offset="0" value="\\*File list\r\n"/>
+    <match type="string" offset="0" value="\\*EC File list\r\n"/>
     <match type="string" offset="0" value="?*File list\r\n"/>
   </magic>
 </mime-type>
@@ -1073,6 +1083,13 @@
 
 <!-- Module xyzexport.c contains no magic. -->
 <!-- Module zeiss.c contains no magic. -->
+<!-- From module zeisslsm.c -->
+<mime-type type="application/x-zeiss-lsm-spm">
+  <comment>Carl Zeiss CLSM images</comment>
+  <glob pattern="*.lsm"/>
+  <glob pattern="*.LSM"/>
+</mime-type>
+
 <!-- Module zemax.c contains no magic. -->
 <!-- Module hdrimage.cc contains no magic. -->
 </mime-info>
diff --git a/data/mingw-gwyddion-libs.spec.in b/data/mingw-gwyddion-libs.spec.in
index 339adb0..9129a27 100644
--- a/data/mingw-gwyddion-libs.spec.in
+++ b/data/mingw-gwyddion-libs.spec.in
@@ -1,4 +1,4 @@
-# @(#) $Id: mingw-gwyddion-libs.spec.in 13928 2012-10-11 16:52:39Z yeti-dn $
+# @(#) $Id: mingw-gwyddion-libs.spec.in 20206 2017-08-09 06:26:30Z yeti-dn $
 %{?mingw_package_header}
 
 Name:           mingw-gwyddion-libs
@@ -143,6 +143,9 @@ rm $RPM_BUILD_ROOT%{mingw64_libdir}/*.la
 
 
 %changelog
+* Tue Aug  8 2017  Yeti <yeti at gwyddion.net> - 2.48-2
+- fixed changelog dates
+
 * Sat Aug  4 2012 Yeti <yeti at gwyddion.net> - 2.29-1
 - Update to F17 mingw-w64 toolchain and RPM macros
 - Build Win64 package
@@ -157,5 +160,5 @@ rm $RPM_BUILD_ROOT%{mingw64_libdir}/*.la
 * Thu Jan 27 2011 Yeti <yeti at gwyddion.net> - 2.22-1
 - Updated to build on openSUSE
 
-* Tue Dec 2 2010 Yeti <yeti at gwyddion.net> - 2.21-1
+* Thu Dec 2 2010 Yeti <yeti at gwyddion.net> - 2.21-1
 - Created
diff --git a/devel-docs/Makefile.in b/devel-docs/Makefile.in
index 1d52cbc..eddef2d 100644
--- a/devel-docs/Makefile.in
+++ b/devel-docs/Makefile.in
@@ -229,10 +229,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -242,6 +239,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -266,7 +265,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -324,6 +325,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -332,17 +334,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/devel-docs/libgwyapp/Makefile.in b/devel-docs/libgwyapp/Makefile.in
index 6007241..867a610 100644
--- a/devel-docs/libgwyapp/Makefile.in
+++ b/devel-docs/libgwyapp/Makefile.in
@@ -178,10 +178,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -191,6 +188,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -215,7 +214,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -273,6 +274,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -281,17 +283,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/devel-docs/libgwyapp/html/GwyDataChooser.html b/devel-docs/libgwyapp/html/GwyDataChooser.html
index 0f5c144..100a294 100644
--- a/devel-docs/libgwyapp/html/GwyDataChooser.html
+++ b/devel-docs/libgwyapp/html/GwyDataChooser.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyDataChooser: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-data-browser.html" title="data-browser">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyDataChooser.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -180,7 +180,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyDataChooser.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -303,7 +303,7 @@ one can use:</p>
 <p>The type of data chooser filter function.</p>
 <div class="refsect3">
 <a name="GwyDataChooserFilterFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -395,7 +395,7 @@ gwy_app_data_id_new (<em class="parameter"><code><a href="/usr/share/gtk-doc/htm
 <p>This is mostly useful for language bindings.</p>
 <div class="refsect3">
 <a name="gwy-app-data-id-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -432,7 +432,7 @@ gwy_app_data_id_copy (<em class="parameter"><code><span class="type">GwyAppDataI
 <p>This is mostly useful for language bindings.</p>
 <div class="refsect3">
 <a name="gwy-app-data-id-copy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -461,7 +461,7 @@ gwy_app_data_id_free (<em class="parameter"><code><span class="type">GwyAppDataI
 <p>This is mostly useful for language bindings.</p>
 <div class="refsect3">
 <a name="gwy-app-data-id-free.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -486,7 +486,7 @@ gwy_data_chooser_set_active (<em class="parameter"><code><a class="link" href="G
 <p>Selects a data in a data chooser.</p>
 <div class="refsect3">
 <a name="gwy-data-chooser-set-active.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -527,7 +527,7 @@ gwy_data_chooser_get_active (<em class="parameter"><code><a class="link" href="G
 <p>Gets the selected item in a data chooser.</p>
 <div class="refsect3">
 <a name="gwy-data-chooser-get-active.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -564,7 +564,7 @@ gwy_data_chooser_set_active_id (<em class="parameter"><code><a class="link" href
  is permitted as a request to select the ‘none’ item.</p>
 <div class="refsect3">
 <a name="gwy-data-chooser-set-active-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -599,7 +599,7 @@ gwy_data_chooser_get_active_id (<em class="parameter"><code><a class="link" href
 <p>Gets the selected item in a data chooser as numerical identifiers.</p>
 <div class="refsect3">
 <a name="gwy-data-chooser-get-active-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -642,7 +642,7 @@ gwy_data_chooser_set_filter (<em class="parameter"><code><a class="link" href="G
 external state and that changes.</p>
 <div class="refsect3">
 <a name="gwy-data-chooser-set-filter.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -683,7 +683,7 @@ gwy_data_chooser_get_none (<em class="parameter"><code><a class="link" href="Gwy
 <p>Gets the label of the item corresponding to no data.</p>
 <div class="refsect3">
 <a name="gwy-data-chooser-get-none.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -711,7 +711,7 @@ gwy_data_chooser_set_none (<em class="parameter"><code><a class="link" href="Gwy
 <p>Sets the label of the item corresponding to no data.</p>
 <div class="refsect3">
 <a name="gwy-data-chooser-set-none.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -746,7 +746,7 @@ gwy_data_chooser_get_filter (<em class="parameter"><code><a class="link" href="G
 changes.  However, <a class="link" href="GwyDataChooser.html#gwy-data-chooser-refilter" title="gwy_data_chooser_refilter ()"><code class="function">gwy_data_chooser_refilter()</code></a> is usually more useful.</p>
 <div class="refsect3">
 <a name="gwy-data-chooser-get-filter.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -779,7 +779,7 @@ contains some items then an arbitrary item is selected.  At present, this
 means the first item in the list.</p>
 <div class="refsect3">
 <a name="gwy-data-chooser-refilter.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyapp/html/GwyPlainTool.html b/devel-docs/libgwyapp/html/GwyPlainTool.html
index 66daa8f..2ba16a4 100644
--- a/devel-docs/libgwyapp/html/GwyPlainTool.html
+++ b/devel-docs/libgwyapp/html/GwyPlainTool.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyPlainTool: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="GwyTool.html" title="GwyTool">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyPlainTool.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -140,7 +140,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyPlainTool.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -196,7 +196,7 @@ it sets <em class="parameter"><code>init_failed</code></em>
 initialization and it should not be called again once it fails.</p>
 <div class="refsect3">
 <a name="gwy-plain-tool-check-layer-type.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -243,7 +243,7 @@ sure the <em class="parameter"><code>selection</code></em>
 tool instance once this method was called to set up the selection tracking.</p>
 <div class="refsect3">
 <a name="gwy-plain-tool-connect-selection.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -281,7 +281,7 @@ gwy_plain_tool_ensure_layer (<em class="parameter"><code><a class="link" href="G
 <a class="link" href="GwyPlainTool.html#gwy-plain-tool-connect-selection" title="gwy_plain_tool_connect_selection ()"><code class="function">gwy_plain_tool_connect_selection()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-plain-tool-ensure-layer.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -314,7 +314,7 @@ gwy_plain_tool_set_selection_key (<em class="parameter"><code><a class="link" hr
 <a class="link" href="GwyPlainTool.html#gwy-plain-tool-connect-selection" title="gwy_plain_tool_connect_selection ()"><code class="function">gwy_plain_tool_connect_selection()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-plain-tool-set-selection-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -350,7 +350,7 @@ gwy_plain_tool_add_clear_button (<em class="parameter"><code><a class="link" hre
 yourself add the button with <a href="/usr/share/gtk-doc/html/gtk3GtkDialog.html#gtk-dialog-add-button"><code class="function">gtk_dialog_add_button()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-plain-tool-add-clear-button.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -381,7 +381,7 @@ gwy_plain_tool_get_z_average (<em class="parameter"><code><a href="../GwyDataFie
 (it is simply not counted in), however the intersection have to be nonempty.</p>
 <div class="refsect3">
 <a name="gwy-plain-tool-get-z-average.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -423,7 +423,7 @@ gwy_plain_tool_enable_object_deletion (<em class="parameter"><code><a class="lin
 diplaying them.</p>
 <div class="refsect3">
 <a name="gwy-plain-tool-enable-object-deletion.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -457,7 +457,7 @@ gwy_rect_selection_labels_new (<em class="parameter"><code><a href="/usr/share/g
 <p>The returned object will destroy itself when the table is destroyed.</p>
 <div class="refsect3">
 <a name="gwy-rect-selection-labels-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -498,7 +498,7 @@ gwy_rect_selection_labels_get_table (<em class="parameter"><code><a class="link"
 <p>Gets the table widget of a rectangular selection information.</p>
 <div class="refsect3">
 <a name="gwy-rect-selection-labels-get-table.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -526,7 +526,7 @@ gwy_rect_selection_labels_select (<em class="parameter"><code><a class="link" hr
 <p>Updates selection data using rectangular selection information table.</p>
 <div class="refsect3">
 <a name="gwy-rect-selection-labels-select.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -570,7 +570,7 @@ will be still cleared as there is no way to convert between real and
 pixel coordinates.</p>
 <div class="refsect3">
 <a name="gwy-rect-selection-labels-fill.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -628,7 +628,7 @@ the source and target ids are the same.  In more complex cases you have to
 use <a class="link" href="libgwyapp-log.html#gwy-app-channel-log-add" title="gwy_app_channel_log_add ()"><code class="function">gwy_app_channel_log_add()</code></a> directly.</p>
 <div class="refsect3">
 <a name="gwy-plain-tool-log-add.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -675,7 +675,7 @@ use <a class="link" href="libgwyapp-log.html#gwy-app-channel-log-add" title="gwy
 <p>The type of pending changes that accumulated during tool inactivity.</p>
 <div class="refsect3">
 <a name="GwyPlainToolChanged.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwyapp/html/GwyResourceEditor.html b/devel-docs/libgwyapp/html/GwyResourceEditor.html
index 7388937..365fef4 100644
--- a/devel-docs/libgwyapp/html/GwyResourceEditor.html
+++ b/devel-docs/libgwyapp/html/GwyResourceEditor.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyResourceEditor: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-funcuse.html" title="funcuse">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyResourceEditor.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -86,7 +86,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyResourceEditor.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -144,7 +144,7 @@ gwy_resource_editor_get_edited (<em class="parameter"><code><a class="link" href
 <p>It is an error to call this method when no resource is being edited.</p>
 <div class="refsect3">
 <a name="gwy-resource-editor-get-edited.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -175,7 +175,7 @@ changes some editor property.</p>
 commit a change, call this method and then <a class="link" href="GwyResourceEditor.html#gwy-resource-editor-commit" title="gwy_resource_editor_commit ()"><code class="function">gwy_resource_editor_commit()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-resource-editor-queue-commit.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -204,7 +204,7 @@ resource is deleted, before a resource is renamed. When a resource is newly
 created, it is immediately created on disk too.</p>
 <div class="refsect3">
 <a name="gwy-resource-editor-commit.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -232,7 +232,7 @@ gwy_resource_editor_setup (<em class="parameter"><code><a class="link" href="Gwy
 To be called in particular resource initialization methods.</p>
 <div class="refsect3">
 <a name="gwy-resource-editor-setup.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -256,7 +256,7 @@ gwy_resource_editor_class_setup (<em class="parameter"><code><a class="link" hre
 To be called in particular class initialization methods.</p>
 <div class="refsect3">
 <a name="gwy-resource-editor-class-setup.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -306,7 +306,7 @@ To be called in particular class initialization methods.</p>
 <p>The resource editor class.</p>
 <div class="refsect3">
 <a name="GwyResourceEditorClass.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
diff --git a/devel-docs/libgwyapp/html/GwyTool.html b/devel-docs/libgwyapp/html/GwyTool.html
index f99a2b1..ba2df5f 100644
--- a/devel-docs/libgwyapp/html/GwyTool.html
+++ b/devel-docs/libgwyapp/html/GwyTool.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyTool: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-logging.html" title="logging">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyTool.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -122,7 +122,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyTool.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -173,7 +173,7 @@ for informational-only tools.  In that case Hide should become the default
 dialog button.</p>
 <div class="refsect3">
 <a name="gwy-tool-add-hide-button.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -202,7 +202,7 @@ gwy_tool_show (<em class="parameter"><code><a class="link" href="GwyTool.html" t
 <p>Shows a tool's dialog.</p>
 <div class="refsect3">
 <a name="gwy-tool-show.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -224,7 +224,7 @@ gwy_tool_hide (<em class="parameter"><code><a class="link" href="GwyTool.html" t
 <p>Hides a tool's dialog.</p>
 <div class="refsect3">
 <a name="gwy-tool-hide.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -246,7 +246,7 @@ gwy_tool_is_visible (<em class="parameter"><code><a class="link" href="GwyTool.h
 <p>Checks whether a tool dialog is visible.</p>
 <div class="refsect3">
 <a name="gwy-tool-is-visible.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -277,7 +277,7 @@ to the mode appropriate for <em class="parameter"><code>tool</code></em>
 .</p>
 <div class="refsect3">
 <a name="gwy-tool-data-switched.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -309,7 +309,7 @@ gwy_tool_spectra_switched (<em class="parameter"><code><a class="link" href="Gwy
 as the currently active channel.</p>
 <div class="refsect3">
 <a name="gwy-tool-spectra-switched.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -344,7 +344,7 @@ exists so there is no abiguity which dialog position should be saved and
 restored.</p>
 <div class="refsect3">
 <a name="gwy-tool-restore-screen-position.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -368,7 +368,7 @@ gwy_tool_class_get_title (<em class="parameter"><code><a class="link" href="GwyT
 <p>The title is normally used as a tool dialog title.</p>
 <div class="refsect3">
 <a name="gwy-tool-class-get-title.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -394,7 +394,7 @@ gwy_tool_class_get_stock_id (<em class="parameter"><code><a class="link" href="G
 <p>Gets the icon stock id of a tool class (this is a class method).</p>
 <div class="refsect3">
 <a name="gwy-tool-class-get-stock-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -420,7 +420,7 @@ gwy_tool_class_get_tooltip (<em class="parameter"><code><a class="link" href="Gw
 <p>Gets the title of a tool class (this is a class method).</p>
 <div class="refsect3">
 <a name="gwy-tool-class-get-tooltip.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -483,7 +483,7 @@ and restores them automatically, these values essentially apply only to the
 first use of a tool.</p>
 <div class="refsect3">
 <a name="GwyToolClass.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
@@ -576,7 +576,7 @@ responses from their specific buttons.</p></td>
 are encouraged to use them for consistency.</p>
 <div class="refsect3">
 <a name="GwyToolResponseType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwyapp/html/api-index-2-14.html b/devel-docs/libgwyapp/html/api-index-2-14.html
index 7e636e1..7cec55f 100644
--- a/devel-docs/libgwyapp/html/api-index-2-14.html
+++ b/devel-docs/libgwyapp/html/api-index-2-14.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.14: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="api-index-2-9.html" title="Index of new symbols in 2.9">
diff --git a/devel-docs/libgwyapp/html/api-index-2-18.html b/devel-docs/libgwyapp/html/api-index-2-18.html
index ddf2cb6..87b924b 100644
--- a/devel-docs/libgwyapp/html/api-index-2-18.html
+++ b/devel-docs/libgwyapp/html/api-index-2-18.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.18: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="api-index-2-14.html" title="Index of new symbols in 2.14">
diff --git a/devel-docs/libgwyapp/html/api-index-2-21.html b/devel-docs/libgwyapp/html/api-index-2-21.html
index ef0a43a..ca55ee9 100644
--- a/devel-docs/libgwyapp/html/api-index-2-21.html
+++ b/devel-docs/libgwyapp/html/api-index-2-21.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.21: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="api-index-2-18.html" title="Index of new symbols in 2.18">
diff --git a/devel-docs/libgwyapp/html/api-index-2-23.html b/devel-docs/libgwyapp/html/api-index-2-23.html
index fba5ed8..e147f3f 100644
--- a/devel-docs/libgwyapp/html/api-index-2-23.html
+++ b/devel-docs/libgwyapp/html/api-index-2-23.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.23: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="api-index-2-21.html" title="Index of new symbols in 2.21">
diff --git a/devel-docs/libgwyapp/html/api-index-2-3.html b/devel-docs/libgwyapp/html/api-index-2-3.html
index 9f8970f..a11905d 100644
--- a/devel-docs/libgwyapp/html/api-index-2-3.html
+++ b/devel-docs/libgwyapp/html/api-index-2-3.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.3: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="api-index-all.html" title="Index of all symbols">
diff --git a/devel-docs/libgwyapp/html/api-index-2-32.html b/devel-docs/libgwyapp/html/api-index-2-32.html
index ba4788b..5cc372b 100644
--- a/devel-docs/libgwyapp/html/api-index-2-32.html
+++ b/devel-docs/libgwyapp/html/api-index-2-32.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.32: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="api-index-2-23.html" title="Index of new symbols in 2.23">
diff --git a/devel-docs/libgwyapp/html/api-index-2-33.html b/devel-docs/libgwyapp/html/api-index-2-33.html
index 22de8fe..c25149b 100644
--- a/devel-docs/libgwyapp/html/api-index-2-33.html
+++ b/devel-docs/libgwyapp/html/api-index-2-33.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.33: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="api-index-2-32.html" title="Index of new symbols in 2.32">
diff --git a/devel-docs/libgwyapp/html/api-index-2-35.html b/devel-docs/libgwyapp/html/api-index-2-35.html
index f628a7f..59fe3a8 100644
--- a/devel-docs/libgwyapp/html/api-index-2-35.html
+++ b/devel-docs/libgwyapp/html/api-index-2-35.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.35: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="api-index-2-33.html" title="Index of new symbols in 2.33">
diff --git a/devel-docs/libgwyapp/html/api-index-2-38.html b/devel-docs/libgwyapp/html/api-index-2-38.html
index 226424b..e155e0e 100644
--- a/devel-docs/libgwyapp/html/api-index-2-38.html
+++ b/devel-docs/libgwyapp/html/api-index-2-38.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.38: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="api-index-2-35.html" title="Index of new symbols in 2.35">
diff --git a/devel-docs/libgwyapp/html/api-index-2-41.html b/devel-docs/libgwyapp/html/api-index-2-41.html
index 46e8012..dacccc1 100644
--- a/devel-docs/libgwyapp/html/api-index-2-41.html
+++ b/devel-docs/libgwyapp/html/api-index-2-41.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.41: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="api-index-2-38.html" title="Index of new symbols in 2.38">
diff --git a/devel-docs/libgwyapp/html/api-index-2-42.html b/devel-docs/libgwyapp/html/api-index-2-42.html
index 5a2e708..d3f8423 100644
--- a/devel-docs/libgwyapp/html/api-index-2-42.html
+++ b/devel-docs/libgwyapp/html/api-index-2-42.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.42: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="api-index-2-41.html" title="Index of new symbols in 2.41">
diff --git a/devel-docs/libgwyapp/html/api-index-2-43.html b/devel-docs/libgwyapp/html/api-index-2-43.html
index 4755321..5a8947c 100644
--- a/devel-docs/libgwyapp/html/api-index-2-43.html
+++ b/devel-docs/libgwyapp/html/api-index-2-43.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.43: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="api-index-2-42.html" title="Index of new symbols in 2.42">
diff --git a/devel-docs/libgwyapp/html/api-index-2-45.html b/devel-docs/libgwyapp/html/api-index-2-45.html
index eeef3bd..3fda045 100644
--- a/devel-docs/libgwyapp/html/api-index-2-45.html
+++ b/devel-docs/libgwyapp/html/api-index-2-45.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.45: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="api-index-2-43.html" title="Index of new symbols in 2.43">
diff --git a/devel-docs/libgwyapp/html/api-index-2-46.html b/devel-docs/libgwyapp/html/api-index-2-46.html
index 73f9b59..5d27743 100644
--- a/devel-docs/libgwyapp/html/api-index-2-46.html
+++ b/devel-docs/libgwyapp/html/api-index-2-46.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.46: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="api-index-2-45.html" title="Index of new symbols in 2.45">
diff --git a/devel-docs/libgwyapp/html/api-index-2-47.html b/devel-docs/libgwyapp/html/api-index-2-47.html
index 9baafde..63ffe4c 100644
--- a/devel-docs/libgwyapp/html/api-index-2-47.html
+++ b/devel-docs/libgwyapp/html/api-index-2-47.html
@@ -3,10 +3,11 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.47: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="api-index-2-46.html" title="Index of new symbols in 2.46">
+<link rel="next" href="api-index-2-48.html" title="Index of new symbols in 2.48">
 <meta name="generator" content="GTK-Doc V1.19 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -16,7 +17,7 @@
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
 <td><a accesskey="p" href="api-index-2-46.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><img src="right-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="n" href="api-index-2-48.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="index">
 <div class="titlepage"><div><div><h1 class="title">
diff --git a/devel-docs/libgwyapp/html/api-index-2-48.html b/devel-docs/libgwyapp/html/api-index-2-48.html
new file mode 100644
index 0000000..0ec5ade
--- /dev/null
+++ b/devel-docs/libgwyapp/html/api-index-2-48.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.48: Gwyddion Application Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
+<link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
+<link rel="prev" href="api-index-2-47.html" title="Index of new symbols in 2.47">
+<link rel="next" href="api-index-2-49.html" title="Index of new symbols in 2.49">
+<meta name="generator" content="GTK-Doc V1.19 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxA">A</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="p" href="api-index-2-47.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-49.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h1 class="title">
+<a name="api-index-2-48"></a>Index of new symbols in 2.48</h1></div></div></div>
+<a name="idx"></a><a name="idxA"></a><h3 class="title">A</h3>
+<dt>
+<a class="link" href="libgwyapp-data-browser.html#gwy-app-sync-data-itemsv" title="gwy_app_sync_data_itemsv ()">gwy_app_sync_data_itemsv</a>, function in <a class="link" href="libgwyapp-data-browser.html" title="data-browser">data-browser</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyapp-wait.html#gwy-app-wait-get-enabled" title="gwy_app_wait_get_enabled ()">gwy_app_wait_get_enabled</a>, function in <a class="link" href="libgwyapp-wait.html" title="wait">wait</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyapp-wait.html#gwy-app-wait-set-enabled" title="gwy_app_wait_set_enabled ()">gwy_app_wait_set_enabled</a>, function in <a class="link" href="libgwyapp-wait.html" title="wait">wait</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.19</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/devel-docs/libgwyapp/html/api-index-2-49.html b/devel-docs/libgwyapp/html/api-index-2-49.html
new file mode 100644
index 0000000..b8dad6c
--- /dev/null
+++ b/devel-docs/libgwyapp/html/api-index-2-49.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.49: Gwyddion Application Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
+<link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
+<link rel="prev" href="api-index-2-48.html" title="Index of new symbols in 2.48">
+<meta name="generator" content="GTK-Doc V1.19 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxA">A</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="p" href="api-index-2-48.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><img src="right-insensitive.png" width="16" height="16" border="0"></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h1 class="title">
+<a name="api-index-2-49"></a>Index of new symbols in 2.49</h1></div></div></div>
+<a name="idx"></a><a name="idxA"></a><h3 class="title">A</h3>
+<dt>
+<a class="link" href="libgwyapp-wait.html#gwy-app-wait-was-canceled" title="gwy_app_wait_was_canceled ()">gwy_app_wait_was_canceled</a>, function in <a class="link" href="libgwyapp-wait.html" title="wait">wait</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.19</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/devel-docs/libgwyapp/html/api-index-2-7.html b/devel-docs/libgwyapp/html/api-index-2-7.html
index db27a96..9aa4b0c 100644
--- a/devel-docs/libgwyapp/html/api-index-2-7.html
+++ b/devel-docs/libgwyapp/html/api-index-2-7.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.7: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="api-index-2-3.html" title="Index of new symbols in 2.3">
diff --git a/devel-docs/libgwyapp/html/api-index-2-9.html b/devel-docs/libgwyapp/html/api-index-2-9.html
index 7d6080c..a5cbf98 100644
--- a/devel-docs/libgwyapp/html/api-index-2-9.html
+++ b/devel-docs/libgwyapp/html/api-index-2-9.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.9: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="api-index-2-7.html" title="Index of new symbols in 2.7">
diff --git a/devel-docs/libgwyapp/html/api-index-all.html b/devel-docs/libgwyapp/html/api-index-all.html
index 6f72faf..2905629 100644
--- a/devel-docs/libgwyapp/html/api-index-all.html
+++ b/devel-docs/libgwyapp/html/api-index-all.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of all symbols: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-wait.html" title="wait">
@@ -744,6 +744,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwyapp-data-browser.html#gwy-app-sync-data-itemsv" title="gwy_app_sync_data_itemsv ()">gwy_app_sync_data_itemsv</a>, function in <a class="link" href="libgwyapp-data-browser.html" title="data-browser">data-browser</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwyapp-undo.html#gwy-app-undo-checkpoint" title="gwy_app_undo_checkpoint ()">gwy_app_undo_checkpoint</a>, function in <a class="link" href="libgwyapp-undo.html" title="undo">undo</a>
 </dt>
 <dd></dd>
@@ -792,6 +796,14 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwyapp-wait.html#gwy-app-wait-get-enabled" title="gwy_app_wait_get_enabled ()">gwy_app_wait_get_enabled</a>, function in <a class="link" href="libgwyapp-wait.html" title="wait">wait</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyapp-wait.html#gwy-app-wait-set-enabled" title="gwy_app_wait_set_enabled ()">gwy_app_wait_set_enabled</a>, function in <a class="link" href="libgwyapp-wait.html" title="wait">wait</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwyapp-wait.html#gwy-app-wait-set-fraction" title="gwy_app_wait_set_fraction ()">gwy_app_wait_set_fraction</a>, function in <a class="link" href="libgwyapp-wait.html" title="wait">wait</a>
 </dt>
 <dd></dd>
@@ -808,6 +820,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwyapp-wait.html#gwy-app-wait-was-canceled" title="gwy_app_wait_was_canceled ()">gwy_app_wait_was_canceled</a>, function in <a class="link" href="libgwyapp-wait.html" title="wait">wait</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwyapp-log.html#gwy-app-xyz-log-add" title="gwy_app_xyz_log_add ()">gwy_app_xyz_log_add</a>, function in <a class="link" href="libgwyapp-log.html" title="log">log</a>
 </dt>
 <dd></dd>
diff --git a/devel-docs/libgwyapp/html/index.html b/devel-docs/libgwyapp/html/index.html
index 958febe..c5dd32e 100644
--- a/devel-docs/libgwyapp/html/index.html
+++ b/devel-docs/libgwyapp/html/index.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Gwyddion Application Library Reference Manual: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="next" href="libgwyapp-app.html" title="app">
 <meta name="generator" content="GTK-Doc V1.19 (XML mode)">
@@ -15,7 +15,7 @@
 <div>
 <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">Gwyddion Application Library Reference Manual</p></th></tr></table></div>
 <div><p class="releaseinfo">
-  For Gwyddion 2.47.
+  For Gwyddion 2.49.
   The latest version of this document can be found on-line at
   <a class="ulink" href="http://gwyddion.net/documentation/libgwyapp/index.php" target="_top">http://gwyddion.net/documentation/libgwyapp/</a>.
 </p></div>
@@ -107,6 +107,8 @@
 <dt><span class="index"><a href="api-index-2-45.html">Index of new symbols in 2.45</a></span></dt>
 <dt><span class="index"><a href="api-index-2-46.html">Index of new symbols in 2.46</a></span></dt>
 <dt><span class="index"><a href="api-index-2-47.html">Index of new symbols in 2.47</a></span></dt>
+<dt><span class="index"><a href="api-index-2-48.html">Index of new symbols in 2.48</a></span></dt>
+<dt><span class="index"><a href="api-index-2-49.html">Index of new symbols in 2.49</a></span></dt>
 </dl></div>
 </div>
 <div class="footer">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-GwyGLMaterialEditor.html b/devel-docs/libgwyapp/html/libgwyapp-GwyGLMaterialEditor.html
index 4874e92..ad60a25 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-GwyGLMaterialEditor.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-GwyGLMaterialEditor.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyGLMaterialEditor: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="GwyResourceEditor.html" title="GwyResourceEditor">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-GwyGLMaterialEditor.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-GwyGradientEditor.html b/devel-docs/libgwyapp/html/libgwyapp-GwyGradientEditor.html
index 94ecbd0..4bb6dfc 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-GwyGradientEditor.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-GwyGradientEditor.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyGradientEditor: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-GwyGLMaterialEditor.html" title="GwyGLMaterialEditor">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-GwyGradientEditor.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-Validate.html b/devel-docs/libgwyapp/html/libgwyapp-Validate.html
index ade70cc..2301a88 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-Validate.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-Validate.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Validate: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-file-module-utils.html" title="file module utils">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-Validate.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -67,7 +67,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyapp-Validate.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -117,7 +117,7 @@ corrected.  At present correctable problems are those that can be fixed
 by removal of the offending data.</p>
 <div class="refsect3">
 <a name="gwy-data-validate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -163,7 +163,7 @@ gwy_data_error_desrcibe (<em class="parameter"><code><a class="link" href="libgw
 <p>Describes a data validation error type.</p>
 <div class="refsect3">
 <a name="gwy-data-error-desrcibe.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -194,7 +194,7 @@ gwy_data_validation_failure_list_free (<em class="parameter"><code><a href="http
 <p>Frees a data validation failure list.</p>
 <div class="refsect3">
 <a name="gwy-data-validation-failure-list-free.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -217,7 +217,7 @@ gwy_data_validation_failure_list_free (<em class="parameter"><code><a href="http
 <p>Type of data validation errors.</p>
 <div class="refsect3">
 <a name="GwyDataError.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -301,7 +301,7 @@ gwy_data_validation_failure_list_free (<em class="parameter"><code><a href="http
  is present too.</p>
 <div class="refsect3">
 <a name="GwyDataValidateFlags.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -368,7 +368,7 @@ gwy_data_validation_failure_list_free (<em class="parameter"><code><a href="http
 <p>Note the structure may contain more private fields.</p>
 <div class="refsect3">
 <a name="GwyDataValidationFailure.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-app.html b/devel-docs/libgwyapp/html/libgwyapp-app.html
index 7d1440c..d1d5d0a 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-app.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-app.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>app: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="index.html" title="Gwyddion Application Library Reference Manual">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-app.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -148,7 +148,7 @@ gwy_app_switch_tool (<em class="parameter"><code>const <a href="http://developer
 visible.</p>
 <div class="refsect3">
 <a name="gwy-app-switch-tool.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -189,7 +189,7 @@ gwy_app_add_main_accel_group (<em class="parameter"><code><a href="http://develo
 <p>This includes accelerators for terminating Gwyddion, opening files, etc.</p>
 <div class="refsect3">
 <a name="gwy-app-add-main-accel-group.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -216,7 +216,7 @@ gwy_app_save_window_position (<em class="parameter"><code><a href="http://develo
 is too suspicious, it is not saved.</p>
 <div class="refsect3">
 <a name="gwy-app-save-window-position.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -266,7 +266,7 @@ shown, second time immediately after showing the window.</p>
 size is too suspicious, it is not restored.</p>
 <div class="refsect3">
 <a name="gwy-app-restore-window-position.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -315,7 +315,7 @@ gwy_app_data_view_change_mask_color (<em class="parameter"><code><a href="../Gwy
 possibly taking the initial color from settings.</p>
 <div class="refsect3">
 <a name="gwy-app-data-view-change-mask-color.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -377,7 +377,7 @@ settings loading, and
 module registration.</p>
 <div class="refsect3">
 <a name="gwy-app-init-common.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-data-browser.html b/devel-docs/libgwyapp/html/libgwyapp-data-browser.html
index 0125dfa..78b96df 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-data-browser.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-data-browser.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>data-browser: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-app.html" title="app">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-data-browser.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -345,6 +345,14 @@
 </tr>
 <tr>
 <td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="libgwyapp-data-browser.html#gwy-app-sync-data-itemsv" title="gwy_app_sync_data_itemsv ()">gwy_app_sync_data_itemsv</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
 </td>
 <td class="function_name">
@@ -716,7 +724,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyapp-data-browser.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -794,7 +802,7 @@ only data actually displayed can be ‘current’.</p>
 <p>Type of function passed to <a class="link" href="libgwyapp-data-browser.html#gwy-app-data-browser-foreach" title="gwy_app_data_browser_foreach ()"><code class="function">gwy_app_data_browser_foreach()</code></a>.</p>
 <div class="refsect3">
 <a name="GwyAppDataForeachFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -826,7 +834,7 @@ only data actually displayed can be ‘current’.</p>
 <p>Type of function passed to <a class="link" href="libgwyapp-data-browser.html#gwy-app-data-browser-add-channel-watch" title="gwy_app_data_browser_add_channel_watch ()"><code class="function">gwy_app_data_browser_add_channel_watch()</code></a>.</p>
 <div class="refsect3">
 <a name="GwyAppDataWatchFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -863,7 +871,7 @@ gwy_app_data_browser_add (<em class="parameter"><code><a href="../GwyContainer.h
 yours.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-add.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -885,7 +893,7 @@ gwy_app_data_browser_remove (<em class="parameter"><code><a href="../GwyContaine
 <p>Removed a data container from the application data browser.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-remove.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -907,7 +915,7 @@ gwy_app_data_browser_merge (<em class="parameter"><code><a href="../GwyContainer
 <p>Merges the data from a data container to the current one.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-merge.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -932,7 +940,7 @@ gwy_app_data_browser_get (<em class="parameter"><code><a href="/usr/share/gtk-do
 See its documentation for discussion.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-get.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -968,7 +976,7 @@ does not make sense to store it to the settings or other kinds of permanent
 storage.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-get-number.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1000,7 +1008,7 @@ gwy_app_data_browser_reset_visibility (<em class="parameter"><code><a href="../G
 <p>Resets visibility of all data objects in a container.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-reset-visibility.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1040,7 +1048,7 @@ its finalization.  By setting <em class="parameter"><code>keep_invisible</code><
 made to sit in the browser indefinitely.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-set-keep-invisible.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1072,7 +1080,7 @@ gwy_app_data_browser_get_keep_invisible
 <p>Gets data browser behaviour for inaccessible data.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-get-keep-invisible.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1101,7 +1109,7 @@ and selects <em class="parameter"><code>data_view</code></em>
 's data in the channel list.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-select-data-view.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1126,7 +1134,7 @@ and selects <em class="parameter"><code>graph</code></em>
 's data in the graph list.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-select-graph.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1154,7 +1162,7 @@ container than those of the currently active channel, so do not try that
 for now.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-select-spectra.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1179,7 +1187,7 @@ and selects <em class="parameter"><code>data_view</code></em>
 's volume data in the graph list.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-select-volume.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1204,7 +1212,7 @@ and selects <em class="parameter"><code>data_view</code></em>
 's XYZ data in the graph list.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-select-xyz.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1233,7 +1241,7 @@ release your reference, especially when done as the ‘create output’ step of
 a module function.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-add-data-field.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1279,7 +1287,7 @@ release your reference, especially when done as the ‘create output’ step of
 a module function.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-add-graph-model.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1325,7 +1333,7 @@ release your reference, especially when done as the ‘create output’ step of
 a module function.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-add-spectra.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1374,7 +1382,7 @@ usually you will want to release your reference, especially when done as the
 ‘create output’ step of a module function.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-add-brick.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1431,7 +1439,7 @@ release your reference, especially when done as the ‘create output’ step of
 a module function.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-add-surface.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1489,7 +1497,7 @@ achieve consistency one has to ask for the complete set of current objects
 at once.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-get-current.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1523,7 +1531,7 @@ the data browser.  Since version 2.45 it can be used for all file-like
 data containers.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-get-data-ids.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1552,7 +1560,7 @@ the data browser.  Since version 2.45 it can be used for all file-like
 data containers.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-get-graph-ids.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1581,7 +1589,7 @@ the data browser.  Since version 2.45 it can be used for all file-like
 data containers.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-get-spectra-ids.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1611,7 +1619,7 @@ the data browser.  Since version 2.45 it can be used for all file-like
 data containers.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-get-volume-ids.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1638,7 +1646,7 @@ gwy_app_data_browser_get_xyz_ids (<em class="parameter"><code><a href="../GwyCon
 <p>Gets the list of all XYZ data in a data container.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-get-xyz-ids.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1666,9 +1674,12 @@ gwy_app_data_browser_find_data_by_title
                                 <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *titleglob</code></em>);</pre>
 <p>Gets the list of all channels in a data container whose titles match the
 specified pattern.</p>
+<p>The function originally could be used only for data containers managed by
+the data browser.  Since version 2.49 it can be used for all file-like
+data containers.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-find-data-by-title.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1677,7 +1688,7 @@ specified pattern.</p>
 <tbody>
 <tr>
 <td class="parameter_name"><p>data</p></td>
-<td class="parameter_description"><p>A data container managed by the data-browser.</p></td>
+<td class="parameter_description"><p>A data container.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1704,9 +1715,12 @@ gwy_app_data_browser_find_graphs_by_title
                                 <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *titleglob</code></em>);</pre>
 <p>Gets the list of all graphs in a data container whose titles match the
 specified pattern.</p>
+<p>The function originally could be used only for data containers managed by
+the data browser.  Since version 2.49 it can be used for all file-like
+data containers.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-find-graphs-by-title.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1715,7 +1729,7 @@ specified pattern.</p>
 <tbody>
 <tr>
 <td class="parameter_name"><p>data</p></td>
-<td class="parameter_description"><p>A data container managed by the data-browser.</p></td>
+<td class="parameter_description"><p>A data container.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1742,9 +1756,12 @@ gwy_app_data_browser_find_spectra_by_title
                                 <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *titleglob</code></em>);</pre>
 <p>Gets the list of all spectra in a data container whose titles match the
 specified pattern.</p>
+<p>The function originally could be used only for data containers managed by
+the data browser.  Since version 2.49 it can be used for all file-like
+data containers.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-find-spectra-by-title.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1753,7 +1770,7 @@ specified pattern.</p>
 <tbody>
 <tr>
 <td class="parameter_name"><p>data</p></td>
-<td class="parameter_description"><p>A data container managed by the data-browser.</p></td>
+<td class="parameter_description"><p>A data container.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1780,9 +1797,12 @@ gwy_app_data_browser_find_volume_by_title
                                 <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *titleglob</code></em>);</pre>
 <p>Gets the list of all volume data in a data container whose titles match the
 specified pattern.</p>
+<p>The function originally could be used only for data containers managed by
+the data browser.  Since version 2.49 it can be used for all file-like
+data containers.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-find-volume-by-title.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1791,7 +1811,7 @@ specified pattern.</p>
 <tbody>
 <tr>
 <td class="parameter_name"><p>data</p></td>
-<td class="parameter_description"><p>A data container managed by the data-browser.</p></td>
+<td class="parameter_description"><p>A data container.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1818,9 +1838,12 @@ gwy_app_data_browser_find_xyz_by_title
                                 <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *titleglob</code></em>);</pre>
 <p>Gets the list of all XYZ data in a data container whose titles match the
 specified pattern.</p>
+<p>The function originally could be used only for data containers managed by
+the data browser.  Since version 2.49 it can be used for all file-like
+data containers.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-find-xyz-by-title.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1829,7 +1852,7 @@ specified pattern.</p>
 <tbody>
 <tr>
 <td class="parameter_name"><p>data</p></td>
-<td class="parameter_description"><p>A data container managed by the data-browser.</p></td>
+<td class="parameter_description"><p>A data container.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1860,7 +1883,7 @@ should not be removed because this is likely to make the current tool stop
 working.</p>
 <div class="refsect3">
 <a name="gwy-app-data-clear-selections.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1890,7 +1913,7 @@ gwy_app_data_browser_foreach (<em class="parameter"><code><a class="link" href="
 <p>Calls a function for each data container managed by data browser.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-foreach.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1925,7 +1948,7 @@ changes or its metadata such as the title changes.  If a channel is removed
 it may longer exist when the function is called.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-add-channel-watch.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1962,7 +1985,7 @@ gwy_app_data_browser_remove_channel_watch
 <p>Removes a channel watch function.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-remove-channel-watch.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1990,7 +2013,7 @@ change.  If a graph is removed it may longer exist when the function is
 called.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-add-graph-watch.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2027,7 +2050,7 @@ gwy_app_data_browser_remove_graph_watch
 <p>Removes a graph watch function.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-remove-graph-watch.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2053,10 +2076,10 @@ gwy_app_sync_data_items (<em class="parameter"><code><a href="../GwyContainer.ht
                          <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> to_id</code></em>,
                          <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> delete_too</code></em>,
                          <em class="parameter"><code>...</code></em>);</pre>
-<p>Synchronizes auxiliary data items between data containers.</p>
+<p>Synchronizes auxiliary channel items between data containers.</p>
 <div class="refsect3">
 <a name="gwy-app-sync-data-items.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2100,6 +2123,69 @@ them, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-app-sync-data-itemsv"></a><h3>gwy_app_sync_data_itemsv ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_app_sync_data_itemsv (<em class="parameter"><code><a href="../GwyContainer.html#GwyContainer-struct"><span class="type">GwyContainer</span></a> *source</code></em>,
+                          <em class="parameter"><code><a href="../GwyContainer.html#GwyContainer-struct"><span class="type">GwyContainer</span></a> *dest</code></em>,
+                          <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> from_id</code></em>,
+                          <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> to_id</code></em>,
+                          <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> delete_too</code></em>,
+                          <em class="parameter"><code>const <a class="link" href="libgwyapp-data-browser.html#GwyDataItem" title="enum GwyDataItem"><span class="type">GwyDataItem</span></a> *items</code></em>,
+                          <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> nitems</code></em>);</pre>
+<p>Synchronizes auxiliary channel items between data containers.</p>
+<div class="refsect3">
+<a name="gwy-app-sync-data-itemsv.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>source</p></td>
+<td class="parameter_description"><p>Source container.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>dest</p></td>
+<td class="parameter_description"><p>Target container (may be identical to source).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>from_id</p></td>
+<td class="parameter_description"><p>Data number to copy items from.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>to_id</p></td>
+<td class="parameter_description"><p>Data number to copy items to.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>delete_too</p></td>
+<td class="parameter_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to delete items in target if source does not contain
+them, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> to copy only.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>items</p></td>
+<td class="parameter_description"><p>List of <a class="link" href="libgwyapp-data-browser.html#GwyDataItem" title="enum GwyDataItem"><span class="type">GwyDataItem</span></a> values defining the items to copy.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>nitems</p></td>
+<td class="parameter_description"><p>Number of items in <em class="parameter"><code>items</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-app-data-browser-copy-channel"></a><h3>gwy_app_data_browser_copy_channel ()</h3>
 <pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
 gwy_app_data_browser_copy_channel (<em class="parameter"><code><a href="../GwyContainer.html#GwyContainer-struct"><span class="type">GwyContainer</span></a> *source</code></em>,
@@ -2108,7 +2194,7 @@ gwy_app_data_browser_copy_channel (<em class="parameter"><code><a href="../GwyCo
 <p>Copies a channel including all auxiliary data.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-copy-channel.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2148,7 +2234,7 @@ gwy_app_data_browser_copy_volume (<em class="parameter"><code><a href="../GwyCon
 <p>Copies volume brick data including all auxiliary data.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-copy-volume.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2189,7 +2275,7 @@ gwy_app_data_browser_copy_xyz (<em class="parameter"><code><a href="../GwyContai
 <p>Copies XYZ surface data including all auxiliary data.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-copy-xyz.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2228,7 +2314,7 @@ gwy_app_get_data_key_for_id (<em class="parameter"><code><a href="/usr/share/gtk
 <p>Calculates data field quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-data-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2255,7 +2341,7 @@ gwy_app_get_mask_key_for_id (<em class="parameter"><code><a href="/usr/share/gtk
 <p>Calculates mask field quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-mask-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2282,7 +2368,7 @@ gwy_app_get_show_key_for_id (<em class="parameter"><code><a href="/usr/share/gtk
 <p>Calculates presentation field quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-show-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2309,7 +2395,7 @@ gwy_app_get_graph_key_for_id (<em class="parameter"><code><a href="/usr/share/gt
 <p>Calculates graph model quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-graph-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2337,7 +2423,7 @@ gwy_app_get_spectra_key_for_id (<em class="parameter"><code><a href="/usr/share/
 <p>Calculates spectra quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-spectra-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2365,7 +2451,7 @@ gwy_app_get_brick_key_for_id (<em class="parameter"><code><a href="/usr/share/gt
 <p>Calculates data brick quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-brick-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2393,7 +2479,7 @@ gwy_app_get_surface_key_for_id (<em class="parameter"><code><a href="/usr/share/
 <p>Calculates XYZ surface quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-surface-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2421,7 +2507,7 @@ gwy_app_get_data_title_key_for_id (<em class="parameter"><code><a href="/usr/sha
 <p>Calculates data field title quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-data-title-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2450,7 +2536,7 @@ gwy_app_get_data_range_type_key_for_id
 <p>Calculates data field range type quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-data-range-type-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2479,7 +2565,7 @@ gwy_app_get_data_range_min_key_for_id (<em class="parameter"><code><a href="/usr
 <p>Calculates data field fixed range minimum quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-data-range-min-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2508,7 +2594,7 @@ gwy_app_get_data_range_max_key_for_id (<em class="parameter"><code><a href="/usr
 <p>Calculates data field fixed range maximum quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-data-range-max-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2537,7 +2623,7 @@ gwy_app_get_data_palette_key_for_id (<em class="parameter"><code><a href="/usr/s
 <p>Calculates data field palette quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-data-palette-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2566,7 +2652,7 @@ gwy_app_get_data_meta_key_for_id (<em class="parameter"><code><a href="/usr/shar
 <p>Calculates data field metadata quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-data-meta-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2595,7 +2681,7 @@ gwy_app_get_brick_title_key_for_id (<em class="parameter"><code><a href="/usr/sh
 <p>Calculates data brick title quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-brick-title-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2624,7 +2710,7 @@ gwy_app_get_brick_preview_key_for_id (<em class="parameter"><code><a href="/usr/
 <p>Calculates data brick preview quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-brick-preview-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2653,7 +2739,7 @@ gwy_app_get_brick_palette_key_for_id (<em class="parameter"><code><a href="/usr/
 <p>Calculates data brick palette quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-brick-palette-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2682,7 +2768,7 @@ gwy_app_get_brick_meta_key_for_id (<em class="parameter"><code><a href="/usr/sha
 <p>Calculates data brick title quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-brick-meta-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2711,7 +2797,7 @@ gwy_app_get_surface_title_key_for_id (<em class="parameter"><code><a href="/usr/
 <p>Calculates data surface title quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-surface-title-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2741,7 +2827,7 @@ gwy_app_get_surface_palette_key_for_id
 <p>Calculates XYZ surface palette quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-surface-palette-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2770,7 +2856,7 @@ gwy_app_get_surface_meta_key_for_id (<em class="parameter"><code><a href="/usr/s
 <p>Calculates XYZ surface title quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-surface-meta-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2800,7 +2886,7 @@ gwy_app_get_surface_preview_key_for_id
 <p>Calculates XYZ surface preview quark identifier from its id.</p>
 <div class="refsect3">
 <a name="gwy-app-get-surface-preview-key-for-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2831,7 +2917,7 @@ gwy_app_set_data_field_title (<em class="parameter"><code><a href="../GwyContain
 <p>Sets channel title.</p>
 <div class="refsect3">
 <a name="gwy-app-set-data-field-title.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2870,7 +2956,7 @@ gwy_app_get_data_field_title (<em class="parameter"><code><a href="../GwyContain
 channels with old titles, channels with and without a file, etc.</p>
 <div class="refsect3">
 <a name="gwy-app-get-data-field-title.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2905,7 +2991,7 @@ gwy_app_set_brick_title (<em class="parameter"><code><a href="../GwyContainer.ht
 <p>Sets volume data title.</p>
 <div class="refsect3">
 <a name="gwy-app-set-brick-title.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2943,7 +3029,7 @@ gwy_app_get_brick_title (<em class="parameter"><code><a href="../GwyContainer.ht
 <p>Gets a volume data brick title.</p>
 <div class="refsect3">
 <a name="gwy-app-get-brick-title.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2979,7 +3065,7 @@ gwy_app_set_surface_title (<em class="parameter"><code><a href="../GwyContainer.
 <p>Sets XYZ surface data title.</p>
 <div class="refsect3">
 <a name="gwy-app-set-surface-title.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3017,7 +3103,7 @@ gwy_app_get_surface_title (<em class="parameter"><code><a href="../GwyContainer.
 <p>Gets an XYZ surface data title.</p>
 <div class="refsect3">
 <a name="gwy-app-get-surface-title.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3079,7 +3165,7 @@ gwy_app_get_channel_thumbnail (<em class="parameter"><code><a href="../GwyContai
 <p>Creates a channel thumbnail.</p>
 <div class="refsect3">
 <a name="gwy-app-get-channel-thumbnail.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3131,7 +3217,7 @@ gwy_app_get_graph_thumbnail (<em class="parameter"><code><a href="../GwyContaine
 functions).  It cannot be used in a console program.</p>
 <div class="refsect3">
 <a name="gwy-app-get-graph-thumbnail.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3182,7 +3268,7 @@ gwy_app_get_volume_thumbnail (<em class="parameter"><code><a href="../GwyContain
 <p>Creates a volume thumbnail.</p>
 <div class="refsect3">
 <a name="gwy-app-get-volume-thumbnail.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3232,7 +3318,7 @@ gwy_app_get_xyz_thumbnail (<em class="parameter"><code><a href="../GwyContainer.
 <p>Creates an XYZ data thumbnail.</p>
 <div class="refsect3">
 <a name="gwy-app-get-xyz-thumbnail.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3285,7 +3371,7 @@ or duplicate in the data browser.  Module functions can be only run on
 visible data.</div>
 <div class="refsect3">
 <a name="gwy-app-data-browser-select-data-field.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3321,7 +3407,7 @@ or duplicate in the data browser.  Module functions can be only run on
 visible data.</div>
 <div class="refsect3">
 <a name="gwy-app-data-browser-select-graph-model.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3356,7 +3442,7 @@ to the user.  If it does not exist, it is created.</p>
 <a class="link" href="libgwyapp-settings.html#gwy-app-gl-is-ok" title="gwy_app_gl_is_ok ()"><code class="function">gwy_app_gl_is_ok()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-show-3d.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3386,7 +3472,7 @@ gwy_app_find_window_for_channel (<em class="parameter"><code><a href="../GwyCont
 <p>Finds the window displaying a data channel.</p>
 <div class="refsect3">
 <a name="gwy-app-find-window-for-channel.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3423,7 +3509,7 @@ gwy_app_find_window_for_graph (<em class="parameter"><code><a href="../GwyContai
 <p>Finds the window displaying a graph model.</p>
 <div class="refsect3">
 <a name="gwy-app-find-window-for-graph.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3461,7 +3547,7 @@ gwy_app_find_window_for_volume (<em class="parameter"><code><a href="../GwyConta
 <p>Finds the window displaying given volume data.</p>
 <div class="refsect3">
 <a name="gwy-app-find-window-for-volume.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3499,7 +3585,7 @@ gwy_app_find_window_for_xyz (<em class="parameter"><code><a href="../GwyContaine
 <p>Finds the window displaying given XYZ data.</p>
 <div class="refsect3">
 <a name="gwy-app-find-window-for-xyz.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3558,7 +3644,7 @@ objects and also <a class="link" href="libgwyapp-data-browser.html#gwy-app-data-
 Hence you should do so before loading files or calling module functions.</p>
 <div class="refsect3">
 <a name="gwy-app-data-browser-set-gui-enabled.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3583,7 +3669,7 @@ Hence you should do so before loading files or calling module functions.</p>
 <a class="link" href="libgwyapp-data-browser.html#gwy-app-data-browser-get-current" title="gwy_app_data_browser_get_current ()"><code class="function">gwy_app_data_browser_get_current()</code></a>.</p>
 <div class="refsect3">
 <a name="GwyAppWhat.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -3789,7 +3875,7 @@ Hence you should do so before loading files or calling module functions.</p>
 <p>Data browser page, corresponding to one of possible data types.</p>
 <div class="refsect3">
 <a name="GwyAppPage.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -3850,7 +3936,7 @@ Hence you should do so before loading files or calling module functions.</p>
 <p>Auxiliary channel data type.</p>
 <div class="refsect3">
 <a name="GwyDataItem.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -3942,7 +4028,7 @@ further changes.  It indicates the wish to restore saved visibilities
 and do something reasonable when there are no visibilities to restore.</p>
 <div class="refsect3">
 <a name="GwyVisibilityResetType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -3990,7 +4076,7 @@ and do something reasonable when there are no visibilities to restore.</p>
 <p>Type of event reported to <a class="link" href="libgwyapp-data-browser.html#GwyAppDataWatchFunc" title="GwyAppDataWatchFunc ()"><span class="type">GwyAppDataWatchFunc</span></a> watcher functions.</p>
 <div class="refsect3">
 <a name="GwyDataWatchEventType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-file-module-utils.html b/devel-docs/libgwyapp/html/libgwyapp-file-module-utils.html
index 1ad6174..2b8638d 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-file-module-utils.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-file-module-utils.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>file module utils: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-module-utils.html" title="module utils">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-file-module-utils.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -291,7 +291,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyapp-file-module-utils.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -416,7 +416,7 @@ gwy_get_gboolean8 (<em class="parameter"><code>const <a href="/usr/share/gtk-doc
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-gboolean8.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -445,7 +445,7 @@ gwy_get_gint16_le (<em class="parameter"><code>const <a href="/usr/share/gtk-doc
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-gint16-le.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -474,7 +474,7 @@ gwy_get_gint16_be (<em class="parameter"><code>const <a href="/usr/share/gtk-doc
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-gint16-be.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -503,7 +503,7 @@ gwy_get_guint16_le (<em class="parameter"><code>const <a href="/usr/share/gtk-do
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-guint16-le.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -532,7 +532,7 @@ gwy_get_guint16_be (<em class="parameter"><code>const <a href="/usr/share/gtk-do
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-guint16-be.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -561,7 +561,7 @@ gwy_get_gint32_le (<em class="parameter"><code>const <a href="/usr/share/gtk-doc
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-gint32-le.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -590,7 +590,7 @@ gwy_get_gint32_be (<em class="parameter"><code>const <a href="/usr/share/gtk-doc
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-gint32-be.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -619,7 +619,7 @@ gwy_get_guint32_le (<em class="parameter"><code>const <a href="/usr/share/gtk-do
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-guint32-le.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -648,7 +648,7 @@ gwy_get_guint32_be (<em class="parameter"><code>const <a href="/usr/share/gtk-do
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-guint32-be.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -677,7 +677,7 @@ gwy_get_gint64_le (<em class="parameter"><code>const <a href="/usr/share/gtk-doc
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-gint64-le.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -706,7 +706,7 @@ gwy_get_gint64_be (<em class="parameter"><code>const <a href="/usr/share/gtk-doc
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-gint64-be.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -735,7 +735,7 @@ gwy_get_guint64_le (<em class="parameter"><code>const <a href="/usr/share/gtk-do
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-guint64-le.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -764,7 +764,7 @@ gwy_get_guint64_be (<em class="parameter"><code>const <a href="/usr/share/gtk-do
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-guint64-be.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -793,7 +793,7 @@ gwy_get_gfloat_le (<em class="parameter"><code>const <a href="/usr/share/gtk-doc
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-gfloat-le.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -822,7 +822,7 @@ gwy_get_gfloat_be (<em class="parameter"><code>const <a href="/usr/share/gtk-doc
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-gfloat-be.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -851,7 +851,7 @@ gwy_get_gdouble_le (<em class="parameter"><code>const <a href="/usr/share/gtk-do
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-gdouble-le.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -880,7 +880,7 @@ gwy_get_gdouble_be (<em class="parameter"><code>const <a href="/usr/share/gtk-do
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-gdouble-be.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -909,7 +909,7 @@ gwy_get_pascal_real_le (<em class="parameter"><code>const <a href="/usr/share/gt
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-pascal-real-le.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -938,7 +938,7 @@ gwy_get_pascal_real_be (<em class="parameter"><code>const <a href="/usr/share/gt
 binary data buffer, moving the buffer pointer to point just after the value.</p>
 <div class="refsect3">
 <a name="gwy-get-pascal-real-be.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -970,7 +970,7 @@ Fortunately, most files encoutered in practice have the measure ratio either
 very close to 1, larger or equal than 2.</p>
 <div class="refsect3">
 <a name="gwy-app-channel-check-nonsquare.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1009,7 +1009,7 @@ most cases.  If there already is a title it is left intact, making use of
 this function as a fall-back easier.</p>
 <div class="refsect3">
 <a name="gwy-app-channel-title-fall-back.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1047,7 +1047,7 @@ most cases.  If there already is a title it is left intact, making use of
 this function as a fall-back easier.</p>
 <div class="refsect3">
 <a name="gwy-app-xyz-title-fall-back.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1083,11 +1083,10 @@ gwy_app_channel_remove_bad_data (<em class="parameter"><code><a href="../GwyData
 <p>Since Gwyddion has no concept of bad data points, they are usually marked
 with a mask and replaced with some neutral values upon import, leaving the
 user to decide how to proceed further.  This helper function performs such
-replacement, using the average of all good points as the neutral replacement
-value (at this moment).</p>
+replacement.</p>
 <div class="refsect3">
 <a name="gwy-app-channel-remove-bad-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1132,7 +1131,7 @@ values.</p>
 <a class="link" href="libgwyapp-file-module-utils.html#gwy-app-channel-remove-bad-data" title="gwy_app_channel_remove_bad_data ()"><code class="function">gwy_app_channel_remove_bad_data()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-app-channel-mask-of-nans.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1187,7 +1186,7 @@ gwy_text_header_parse (<em class="parameter"><code><a href="/usr/share/gtk-doc/h
 <p>Lines consisting only of whitespace are ignored.</p>
 <div class="refsect3">
 <a name="gwy-text-header-parse.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1237,7 +1236,7 @@ gwy_text_header_context_get_section (<em class="parameter"><code>const <a class=
 returns <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> then.</p>
 <div class="refsect3">
 <a name="gwy-text-header-context-get-section.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1264,7 +1263,7 @@ gwy_text_header_context_get_lineno (<em class="parameter"><code>const <a class="
 <p>Gets the current header line.</p>
 <div class="refsect3">
 <a name="gwy-text-header-context-get-lineno.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1296,7 +1295,7 @@ gwy_file_channel_import_log_add (<em class="parameter"><code><a href="../GwyCont
 will be set to -1.  The file name will be added to function arguments.</p>
 <div class="refsect3">
 <a name="gwy-file-channel-import-log-add.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1346,7 +1345,7 @@ gwy_file_volume_import_log_add (<em class="parameter"><code><a href="../GwyConta
 will be set to -1.  The file name will be added to function arguments.</p>
 <div class="refsect3">
 <a name="gwy-file-volume-import-log-add.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1396,7 +1395,7 @@ gwy_file_xyz_import_log_add (<em class="parameter"><code><a href="../GwyContaine
 will be set to -1.  The file name will be added to function arguments.</p>
 <div class="refsect3">
 <a name="gwy-file-xyz-import-log-add.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1454,7 +1453,7 @@ domains.</p>
 (they are not restricted to these codes though).</p>
 <div class="refsect3">
 <a name="GwyTextHeaderError.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -1585,7 +1584,7 @@ suitable <em class="parameter"><code>destroy_key</code></em>
  functions must be set.</p>
 <div class="refsect3">
 <a name="GwyTextHeaderParser.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-file.html b/devel-docs/libgwyapp/html/libgwyapp-file.html
index dd8851e..6fccf55 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-file.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-file.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>file: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-settings.html" title="settings">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-file.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -167,7 +167,7 @@ gwy_app_set_current_directory (<em class="parameter"><code>const <a href="http:/
 <p>Warning: This function is probably temporary.</p>
 <div class="refsect3">
 <a name="gwy-app-set-current-directory.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -198,7 +198,7 @@ Upon a successful load all necessary setup tasks are performed.  If the
 load fails, an error dialog is presented.</p>
 <div class="refsect3">
 <a name="gwy-app-file-load.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -260,7 +260,7 @@ gwy_app_file_write (<em class="parameter"><code><a href="../GwyContainer.html#Gw
 If the write fails, an error dialog is presented.</p>
 <div class="refsect3">
 <a name="gwy-app-file-write.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -328,7 +328,7 @@ gwy_app_file_confirm_overwrite (<em class="parameter"><code><a href="/usr/share/
 <p>Asks for file overwrite for a file save chooser.</p>
 <div class="refsect3">
 <a name="gwy-app-file-confirm-overwrite.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-filelist.html b/devel-docs/libgwyapp/html/libgwyapp-filelist.html
index a5837cf..1b8704e 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-filelist.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-filelist.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>filelist: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-file.html" title="file">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-filelist.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -128,7 +128,7 @@ adding it if not present yet.</p>
  should be set.</p>
 <div class="refsect3">
 <a name="gwy-app-recent-file-list-update.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -176,7 +176,7 @@ use <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros
  in that case.</p>
 <div class="refsect3">
 <a name="gwy-app-recent-file-list-load.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -203,7 +203,7 @@ gwy_app_recent_file_list_save (<em class="parameter"><code>const <a href="http:/
 .</p>
 <div class="refsect3">
 <a name="gwy-app-recent-file-list-save.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -237,7 +237,7 @@ gwy_app_recent_file_get_thumbnail (<em class="parameter"><code>const <a href="/u
 <p>Gets thumbnail of a recently open file.</p>
 <div class="refsect3">
 <a name="gwy-app-recent-file-get-thumbnail.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-funcuse.html b/devel-docs/libgwyapp/html/libgwyapp-funcuse.html
index 537ae46..3b22ea9 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-funcuse.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-funcuse.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>funcuse: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-filelist.html" title="filelist">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-funcuse.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -115,7 +115,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyapp-funcuse.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -154,7 +154,7 @@ gwy_func_use_free (<em class="parameter"><code><a class="link" href="libgwyapp-f
 <p>Destroys function use statistics, freeing all associated resourced.</p>
 <div class="refsect3">
 <a name="gwy-func-use-free.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -177,7 +177,7 @@ gwy_func_use_add (<em class="parameter"><code><a class="link" href="libgwyapp-fu
 <p>Adds an use of a function to the statistics.</p>
 <div class="refsect3">
 <a name="gwy-func-use-add.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -207,7 +207,7 @@ gwy_func_use_get (<em class="parameter"><code><a class="link" href="libgwyapp-fu
 <p>Gets the n-th most function from a function statistics.</p>
 <div class="refsect3">
 <a name="gwy-func-use-get.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -242,7 +242,7 @@ gwy_func_use_load (<em class="parameter"><code>const <a href="http://developer.g
 <p>Loads function use statistics from a file.</p>
 <div class="refsect3">
 <a name="gwy-func-use-load.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -271,7 +271,7 @@ gwy_func_use_save (<em class="parameter"><code><a class="link" href="libgwyapp-f
 <p>Saves function use statistics data to a file.</p>
 <div class="refsect3">
 <a name="gwy-func-use-save.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -300,7 +300,7 @@ gwy_func_use_get_filename (<em class="parameter"><code>const <a href="http://dev
 <p>Gets the (preferred) name for a file to store function use statistics to.</p>
 <div class="refsect3">
 <a name="gwy-func-use-get-filename.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-help.html b/devel-docs/libgwyapp/html/libgwyapp-help.html
index 1b9fc4e..5f2b26b 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-help.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-help.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>help: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-undo.html" title="undo">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-help.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -124,7 +124,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyapp-help.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -161,7 +161,7 @@ gwy_help_add_to_proc_dialog (<em class="parameter"><code><a href="http://develop
 currently running function or help is not available.</p>
 <div class="refsect3">
 <a name="gwy-help-add-to-proc-dialog.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -194,7 +194,7 @@ gwy_help_add_to_graph_dialog (<em class="parameter"><code><a href="http://develo
 currently running function or help is not available.</p>
 <div class="refsect3">
 <a name="gwy-help-add-to-graph-dialog.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -227,7 +227,7 @@ gwy_help_add_to_volume_dialog (<em class="parameter"><code><a href="http://devel
 currently running function or help is not available.</p>
 <div class="refsect3">
 <a name="gwy-help-add-to-volume-dialog.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -260,7 +260,7 @@ gwy_help_add_to_xyz_dialog (<em class="parameter"><code><a href="http://develope
 currently running function or help is not available.</p>
 <div class="refsect3">
 <a name="gwy-help-add-to-xyz-dialog.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -293,7 +293,7 @@ gwy_help_add_to_file_dialog (<em class="parameter"><code><a href="http://develop
 currently running function or help is not available.</p>
 <div class="refsect3">
 <a name="gwy-help-add-to-file-dialog.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -327,7 +327,7 @@ gwy_help_add_to_tool_dialog (<em class="parameter"><code><a href="http://develop
 currently running function or help is not available.</p>
 <div class="refsect3">
 <a name="gwy-help-add-to-tool-dialog.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -374,7 +374,7 @@ described in different parts of the guide – but this should be rare.</p>
 such as channel or volume windows.</p>
 <div class="refsect3">
 <a name="gwy-help-add-to-window.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -426,7 +426,7 @@ language versions or changing the user guide base location.</p>
 behaving similarly to built-in modules.</p>
 <div class="refsect3">
 <a name="gwy-help-add-to-window-uri.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -465,7 +465,7 @@ gwy_help_show (<em class="parameter"><code>const <a href="http://developer.gnome
 available.</p>
 <div class="refsect3">
 <a name="gwy-help-show.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -513,7 +513,7 @@ it means help will not work.</p>
 <p>Flags controlling help setup and behaviour.</p>
 <div class="refsect3">
 <a name="GwyHelpFlags.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-log.html b/devel-docs/libgwyapp/html/libgwyapp-log.html
index 873f1fa..7a45fb2 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-log.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-log.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>log: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-help.html" title="help">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-log.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -188,7 +188,7 @@ then can also create secondary outputs.  Note you still need to pass a
 second <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> argument as the option terminator.</p>
 <div class="refsect3">
 <a name="gwy-app-channel-log-add.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -249,7 +249,7 @@ then can also create secondary outputs.  Note you still need to pass a
 second <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> argument as the option terminator.</p>
 <div class="refsect3">
 <a name="gwy-app-volume-log-add.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -309,7 +309,7 @@ then can also create secondary outputs.  Note you still need to pass a
 second <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> argument as the option terminator.</p>
 <div class="refsect3">
 <a name="gwy-app-xyz-log-add.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -362,7 +362,7 @@ running data processing function name and constructs the qualified function
 name from that.</p>
 <div class="refsect3">
 <a name="gwy-app-channel-log-add-proc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -404,7 +404,7 @@ running function volume data processing name and constructs the qualified
 function name from that.</p>
 <div class="refsect3">
 <a name="gwy-app-volume-log-add-volume.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -446,7 +446,7 @@ running function XYZ data processing name and constructs the qualified
 function name from that.</p>
 <div class="refsect3">
 <a name="gwy-app-xyz-log-add-xyz.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -485,7 +485,7 @@ gwy_app_log_browser_for_channel (<em class="parameter"><code><a href="../GwyCont
 and given focus.  Otherwise, a new window is created.</p>
 <div class="refsect3">
 <a name="gwy-app-log-browser-for-channel.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -524,7 +524,7 @@ gwy_app_log_browser_for_volume (<em class="parameter"><code><a href="../GwyConta
 and given focus.  Otherwise, a new window is created.</p>
 <div class="refsect3">
 <a name="gwy-app-log-browser-for-volume.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -563,7 +563,7 @@ gwy_app_log_browser_for_xyz (<em class="parameter"><code><a href="../GwyContaine
 and given focus.  Otherwise, a new window is created.</p>
 <div class="refsect3">
 <a name="gwy-app-log-browser-for-xyz.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -618,7 +618,7 @@ become no-op.  It is possible to run the log viewer with
 was enabled.</p>
 <div class="refsect3">
 <a name="gwy-log-set-enabled.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-logging.html b/devel-docs/libgwyapp/html/libgwyapp-logging.html
index 065dd65..cd6da51 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-logging.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-logging.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>logging: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-log.html" title="log">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-logging.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -60,7 +60,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyapp-logging.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -91,7 +91,7 @@ usually does.  This function may not be useful in Gwyddion-based programs
 unless they try to emulate Gwyddion behaviour closely.</p>
 <div class="refsect3">
 <a name="gwy-app-setup-logging.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -132,7 +132,7 @@ appended to the buffer as they arrive.</p>
 <p>Flags controlling where program messages are written.</p>
 <div class="refsect3">
 <a name="GwyAppLoggingFlags.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-menu.html b/devel-docs/libgwyapp/html/libgwyapp-menu.html
index 180dd6b..ade3930 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-menu.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-menu.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>menu: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-GwyGradientEditor.html" title="GwyGradientEditor">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-menu.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -188,7 +188,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyapp-menu.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -222,7 +222,7 @@ therefore module registration has to be performed first for this function
 to make sense.</p>
 <div class="refsect3">
 <a name="gwy-app-build-process-menu.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -251,7 +251,7 @@ gwy_app_process_menu_add_run_last (<em class="parameter"><code><a href="http://d
 <p>This function is essentially useful only for toolbox construction.</p>
 <div class="refsect3">
 <a name="gwy-app-process-menu-add-run-last.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -276,7 +276,7 @@ gwy_app_run_process_func (<em class="parameter"><code>const <a href="http://deve
 selected.</p>
 <div class="refsect3">
 <a name="gwy-app-run-process-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -303,7 +303,7 @@ gwy_app_run_process_func_in_mode (<em class="parameter"><code>const <a href="htt
 <p>Runs a data processing function on current data in specified mode.</p>
 <div class="refsect3">
 <a name="gwy-app-run-process-func-in-mode.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -335,7 +335,7 @@ therefore module registration has to be performed first for this function
 to make sense.</p>
 <div class="refsect3">
 <a name="gwy-app-build-graph-menu.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -361,7 +361,7 @@ gwy_app_run_graph_func (<em class="parameter"><code>const <a href="http://develo
 <p>Runs a graph function on the current graph.</p>
 <div class="refsect3">
 <a name="gwy-app-run-graph-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -386,7 +386,7 @@ modules, therefore module registration has to be performed first for this
 function to make sense.</p>
 <div class="refsect3">
 <a name="gwy-app-build-volume-menu.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -416,7 +416,7 @@ gwy_app_run_volume_func (<em class="parameter"><code>const <a href="/usr/share/g
 selected.</p>
 <div class="refsect3">
 <a name="gwy-app-run-volume-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -444,7 +444,7 @@ gwy_app_run_volume_func_in_mode (<em class="parameter"><code>const <a href="/usr
 <p>Runs a volume data processing function on current data in specified mode.</p>
 <div class="refsect3">
 <a name="gwy-app-run-volume-func-in-mode.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -477,7 +477,7 @@ modules, therefore module registration has to be performed first for this
 function to make sense.</p>
 <div class="refsect3">
 <a name="gwy-app-build-xyz-menu.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -507,7 +507,7 @@ gwy_app_run_xyz_func (<em class="parameter"><code>const <a href="/usr/share/gtk-
 selected.</p>
 <div class="refsect3">
 <a name="gwy-app-run-xyz-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -535,7 +535,7 @@ gwy_app_run_xyz_func_in_mode (<em class="parameter"><code>const <a href="/usr/sh
 <p>Runs a XYZ data processing function on current data in specified mode.</p>
 <div class="refsect3">
 <a name="gwy-app-run-xyz-func-in-mode.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -567,7 +567,7 @@ gwy_app_menu_recent_files_update (<em class="parameter"><code><a href="/usr/shar
 items, only the maximum number is shown.</p>
 <div class="refsect3">
 <a name="gwy-app-menu-recent-files-update.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -635,7 +635,7 @@ gwy_app_sensitivity_add_widget (<em class="parameter"><code><a href="/usr/share/
 it).</p>
 <div class="refsect3">
 <a name="gwy-app-sensitivity-add-widget.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -668,7 +668,7 @@ gwy_app_sensitivity_set_state (<em class="parameter"><code><a class="link" href=
 it).</p>
 <div class="refsect3">
 <a name="gwy-app-sensitivity-set-state.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -701,7 +701,7 @@ to copy to state.</p></td>
 widgets to become sensitive.</p>
 <div class="refsect3">
 <a name="GwyMenuSensFlags.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-meta.html b/devel-docs/libgwyapp/html/libgwyapp-meta.html
index 449257b..9d08a2e 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-meta.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-meta.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>meta: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-menu.html" title="menu">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-meta.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -86,7 +86,7 @@ gwy_app_metadata_browser_for_channel (<em class="parameter"><code><a href="../Gw
 and given focus.  Otherwise, a new window is created.</p>
 <div class="refsect3">
 <a name="gwy-app-metadata-browser-for-channel.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -125,7 +125,7 @@ gwy_app_metadata_browser_for_volume (<em class="parameter"><code><a href="../Gwy
 raised and given focus.  Otherwise, a new window is created.</p>
 <div class="refsect3">
 <a name="gwy-app-metadata-browser-for-volume.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -164,7 +164,7 @@ gwy_app_metadata_browser_for_xyz (<em class="parameter"><code><a href="../GwyCon
 raised and given focus.  Otherwise, a new window is created.</p>
 <div class="refsect3">
 <a name="gwy-app-metadata-browser-for-xyz.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-module-utils.html b/devel-docs/libgwyapp/html/libgwyapp-module-utils.html
index 7d042c1..56dc16e 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-module-utils.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-module-utils.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>module utils: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="GwyPlainTool.html" title="GwyPlainTool">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-module-utils.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -140,7 +140,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyapp-module-utils.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -169,7 +169,7 @@
 <p>The type of auxiliary saved data creation function.</p>
 <div class="refsect3">
 <a name="GwySaveAuxiliaryCreate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -208,7 +208,7 @@ the same effect as setting it to a negative value.  See
 <p>The type of auxiliary saved data destruction function.</p>
 <div class="refsect3">
 <a name="GwySaveAuxiliaryDestroy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -246,7 +246,7 @@ gwy_save_auxiliary_data (<em class="parameter"><code>const <a href="/usr/share/g
 its description for details.</p>
 <div class="refsect3">
 <a name="gwy-save-auxiliary-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -301,7 +301,7 @@ gwy_save_auxiliary_with_callback (<em class="parameter"><code>const <a href="/us
 <p>Saves a report or other auxiliary data to a user specified file.</p>
 <div class="refsect3">
 <a name="gwy-save-auxiliary-with-callback.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -361,7 +361,7 @@ Sizing of both pixel-wise square and physically square displays is performed
 correctly.</p>
 <div class="refsect3">
 <a name="gwy-set-data-preview-size.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -408,7 +408,7 @@ existing graph, the graph model is added to <em class="parameter"><code>data</co
 be run non-interactively.</p>
 <div class="refsect3">
 <a name="gwy-app-add-graph-or-curves.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -459,7 +459,7 @@ gwy_preview_surface_to_datafield (<em class="parameter"><code><a href="../GwySur
 <p>Renders a preview of a XYZ data surface to a data field.</p>
 <div class="refsect3">
 <a name="gwy-preview-surface-to-datafield.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -510,7 +510,7 @@ the structure is cleared to <a class="link" href="GwyDataChooser.html#GWY-APP-DA
 function returns <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-app-data-id-verify-channel.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -543,7 +543,7 @@ returns <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAP
 the function returns <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-app-data-id-verify-graph.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -577,7 +577,7 @@ returns <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAP
 and the function returns <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-app-data-id-verify-volume.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -611,7 +611,7 @@ returns <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAP
 and the function returns <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-app-data-id-verify-xyz.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -645,7 +645,7 @@ returns <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAP
 the function return <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-app-data-id-verify-spectra.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -674,7 +674,7 @@ refers to existing spectra now.</p>
 <a class="link" href="libgwyapp-module-utils.html#gwy-preview-surface-to-datafield" title="gwy_preview_surface_to_datafield ()"><code class="function">gwy_preview_surface_to_datafield()</code></a>.</p>
 <div class="refsect3">
 <a name="GwyPreviewSurfaceFlags.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-settings.html b/devel-docs/libgwyapp/html/libgwyapp-settings.html
index 8c6902a..8fa4930 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-settings.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-settings.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>settings: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="GwyDataChooser.html" title="GwyDataChooser">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-settings.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -140,7 +140,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyapp-settings.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -216,7 +216,7 @@ gwy_app_settings_save (<em class="parameter"><code>const <a href="http://develop
 filename.</p>
 <div class="refsect3">
 <a name="gwy-app-settings-save.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -250,7 +250,7 @@ gwy_app_settings_load (<em class="parameter"><code>const <a href="/usr/share/gtk
 <p>Loads settings file.</p>
 <div class="refsect3">
 <a name="gwy-app-settings-load.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -285,7 +285,7 @@ gwy_app_settings_create_config_dir (<em class="parameter"><code><a href="/usr/sh
 <p>Create gwyddion config directory.</p>
 <div class="refsect3">
 <a name="gwy-app-settings-create-config-dir.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -364,7 +364,7 @@ When OpenGL is supported, it calls <code class="function">gtk_gl_init_check()</c
 <a href="../libgwydgets-gwydgets.html#gwy-widgets-gl-init"><code class="function">gwy_widgets_gl_init()</code></a> (if the former succeeeds).</p>
 <div class="refsect3">
 <a name="gwy-app-gl-init.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -421,7 +421,7 @@ on error domains.</p>
 <p>Error codes returned by application settings functions.</p>
 <div class="refsect3">
 <a name="GwyAppSettingsError.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-undo.html b/devel-docs/libgwyapp/html/libgwyapp-undo.html
index 882af9b..82b5c1b 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-undo.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-undo.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>undo: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-meta.html" title="meta">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-undo.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -235,7 +235,7 @@ gwy_app_undo_checkpoint (<em class="parameter"><code><a href="../GwyContainer.ht
 of updating application controls state.</p>
 <div class="refsect3">
 <a name="gwy-app-undo-checkpoint.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -271,7 +271,7 @@ gwy_app_undo_qcheckpoint (<em class="parameter"><code><a href="../GwyContainer.h
 of updating application controls state.</p>
 <div class="refsect3">
 <a name="gwy-app-undo-qcheckpoint.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -308,7 +308,7 @@ gwy_app_undo_checkpointv (<em class="parameter"><code><a href="../GwyContainer.h
 of updating application controls state.</p>
 <div class="refsect3">
 <a name="gwy-app-undo-checkpointv.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -359,7 +359,7 @@ if you perform a data operation that can also meaningfully transform the
 corresponding calibration data take care to obtain it before saving undo.</p>
 <div class="refsect3">
 <a name="gwy-app-undo-qcheckpointv.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -403,7 +403,7 @@ gwy_app_undo_undo_container (<em class="parameter"><code><a href="../GwyContaine
 of updating application controls state.</p>
 <div class="refsect3">
 <a name="gwy-app-undo-undo-container.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -428,7 +428,7 @@ gwy_app_undo_redo_container (<em class="parameter"><code><a href="../GwyContaine
 of updating application controls state.</p>
 <div class="refsect3">
 <a name="gwy-app-undo-redo-container.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -453,7 +453,7 @@ gwy_app_undo_container_remove (<em class="parameter"><code><a href="../GwyContai
 care of updating application controls state.</p>
 <div class="refsect3">
 <a name="gwy-app-undo-container-remove.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -485,7 +485,7 @@ gwy_undo_checkpoint (<em class="parameter"><code><a href="../GwyContainer.html#G
 <p>Create a point in the undo history it is possible to return to.</p>
 <div class="refsect3">
 <a name="gwy-undo-checkpoint.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -519,7 +519,7 @@ gwy_undo_qcheckpoint (<em class="parameter"><code><a href="../GwyContainer.html#
 <p>Create a point in the undo history it is possible to return to.</p>
 <div class="refsect3">
 <a name="gwy-undo-qcheckpoint.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -554,7 +554,7 @@ gwy_undo_checkpointv (<em class="parameter"><code><a href="../GwyContainer.html#
 <p>Create a point in the undo history it is possible to return to.</p>
 <div class="refsect3">
 <a name="gwy-undo-checkpointv.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -597,7 +597,7 @@ gwy_undo_qcheckpointv (<em class="parameter"><code><a href="../GwyContainer.html
 <p>Create a point in the undo history it is possible to return to.</p>
 <div class="refsect3">
 <a name="gwy-undo-qcheckpointv.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -639,7 +639,7 @@ gwy_undo_undo_container (<em class="parameter"><code><a href="../GwyContainer.ht
 <p>It must have undo available.</p>
 <div class="refsect3">
 <a name="gwy-undo-undo-container.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -662,7 +662,7 @@ gwy_undo_redo_container (<em class="parameter"><code><a href="../GwyContainer.ht
 <p>It must have redo available.</p>
 <div class="refsect3">
 <a name="gwy-undo-redo-container.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -684,7 +684,7 @@ gwy_undo_container_has_undo (<em class="parameter"><code><a href="../GwyContaine
 <p>Returns whether there is any undo available for a container.</p>
 <div class="refsect3">
 <a name="gwy-undo-container-has-undo.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -710,7 +710,7 @@ gwy_undo_container_has_redo (<em class="parameter"><code><a href="../GwyContaine
 <p>Returns whether there is any redo available for a container.</p>
 <div class="refsect3">
 <a name="gwy-undo-container-has-redo.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -737,7 +737,7 @@ gwy_undo_container_get_modified (<em class="parameter"><code><a href="../GwyCont
 <p>FIXME: it may not work.</p>
 <div class="refsect3">
 <a name="gwy-undo-container-get-modified.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -763,7 +763,7 @@ gwy_undo_container_set_unmodified (<em class="parameter"><code><a href="../GwyCo
 <p>Marks a data container as umodified (that is, saved).</p>
 <div class="refsect3">
 <a name="gwy-undo-container-set-unmodified.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -786,7 +786,7 @@ gwy_undo_container_remove (<em class="parameter"><code><a href="../GwyContainer.
 <p>Removes undo/redo information for a data container.</p>
 <div class="refsect3">
 <a name="gwy-undo-container-remove.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -834,7 +834,7 @@ functions may wish to disable it to conserve resources.</p>
 removes saved undo data of all containers.</p>
 <div class="refsect3">
 <a name="gwy-undo-set-enabled.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyapp/html/libgwyapp-wait.html b/devel-docs/libgwyapp/html/libgwyapp-wait.html
index f7000be..9aa3805 100644
--- a/devel-docs/libgwyapp/html/libgwyapp-wait.html
+++ b/devel-docs/libgwyapp/html/libgwyapp-wait.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>wait: Gwyddion Application Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Application Library Reference Manual">
 <link rel="prev" href="libgwyapp-Validate.html" title="Validate">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyapp-wait.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -95,6 +95,30 @@
 <a class="link" href="libgwyapp-wait.html#gwy-app-wait-cursor-finish" title="gwy_app_wait_cursor_finish ()">gwy_app_wait_cursor_finish</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="libgwyapp-wait.html#gwy-app-wait-get-enabled" title="gwy_app_wait_get_enabled ()">gwy_app_wait_get_enabled</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="libgwyapp-wait.html#gwy-app-wait-set-enabled" title="gwy_app_wait_set_enabled ()">gwy_app_wait_set_enabled</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="libgwyapp-wait.html#gwy-app-wait-was-canceled" title="gwy_app_wait_was_canceled ()">gwy_app_wait_was_canceled</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -166,7 +190,7 @@ gwy_app_wait_start (<em class="parameter"><code><a href="http://developer.gnome.
 <a class="link" href="libgwyapp-wait.html#gwy-app-wait-set-message" title="gwy_app_wait_set_message ()"><code class="function">gwy_app_wait_set_message()</code></a> regularly to leave the GUI responsive.</p>
 <div class="refsect3">
 <a name="gwy-app-wait-start.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -210,7 +234,7 @@ fearing that the program will spend all time updating the GUI and no time in
 the calculation.</p>
 <div class="refsect3">
 <a name="gwy-app-wait-set-fraction.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -240,7 +264,7 @@ usable directly as a callback.</p>
 <p>This function lets the Gtk+ main loop to run.</p>
 <div class="refsect3">
 <a name="gwy-app-wait-set-message.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -255,21 +279,21 @@ usable directly as a callback.</p>
 </div>
 <div class="refsect3">
 <a name="gwy-app-wait-set-message.returns"></a><h4>Returns</h4>
-<p> <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the operation can continue, <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if user cancelled it
+<p> <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the operation can continue, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if user cancelled it
 meanwhile.</p>
 </div>
 </div>
 <hr>
 <div class="refsect2">
 <a name="gwy-app-wait-set-message-prefix"></a><h3>gwy_app_wait_set_message_prefix ()</h3>
-<pre class="programlisting"><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
 gwy_app_wait_set_message_prefix (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *prefix</code></em>);</pre>
 <p>Sets prefix for the messages shown in the progress dialog.</p>
 <p>The prefix will take effect in the next <a class="link" href="libgwyapp-wait.html#gwy-app-wait-set-message" title="gwy_app_wait_set_message ()"><code class="function">gwy_app_wait_set_message()</code></a> call.</p>
 <p>This function lets the Gtk+ main loop to run.</p>
 <div class="refsect3">
 <a name="gwy-app-wait-set-message-prefix.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -297,7 +321,7 @@ gwy_app_wait_cursor_start (<em class="parameter"><code><a href="/usr/share/gtk-d
 <p>This function lets the Gtk+ main loop to run.</p>
 <div class="refsect3">
 <a name="gwy-app-wait-cursor-start.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -324,7 +348,7 @@ it is not restored and has to be set manually.  This limitation is due to
 the nonexistence of a method to obtain the current cursor.</p>
 <div class="refsect3">
 <a name="gwy-app-wait-cursor-finish.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -339,6 +363,68 @@ the nonexistence of a method to obtain the current cursor.</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-3.html#api-index-2.3">2.3</a></p>
 </div>
+<hr>
+<div class="refsect2">
+<a name="gwy-app-wait-get-enabled"></a><h3>gwy_app_wait_get_enabled ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gwy_app_wait_get_enabled (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Reports whether progress reporting is globally enabled.</p>
+<div class="refsect3">
+<a name="gwy-app-wait-get-enabled.returns"></a><h4>Returns</h4>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if progress reporting is enabled, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if it is disabled.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-app-wait-set-enabled"></a><h3>gwy_app_wait_set_enabled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_app_wait_set_enabled (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> setting</code></em>);</pre>
+<p>Globally enables or disables progress reporting.</p>
+<p>This function may not be used when a waiting dialog is currently being
+shown.</p>
+<p>By default, progress reporting is enabled.  Non-GUI applications that run
+module functions may wish to disable it to avoid GTK+ calls or just showing
+the progress dialogs.</p>
+<p>If progress reporting is disabled then functions such as
+<a class="link" href="libgwyapp-wait.html#gwy-app-wait-set-message" title="gwy_app_wait_set_message ()"><code class="function">gwy_app_wait_set_message()</code></a> and <a class="link" href="libgwyapp-wait.html#gwy-app-wait-set-fraction" title="gwy_app_wait_set_fraction ()"><code class="function">gwy_app_wait_set_fraction()</code></a> become no-op and
+always return <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> as nothing can be cancelled by the user.  Functions
+<a class="link" href="libgwyapp-wait.html#gwy-app-wait-cursor-start" title="gwy_app_wait_cursor_start ()"><code class="function">gwy_app_wait_cursor_start()</code></a> and <a class="link" href="libgwyapp-wait.html#gwy-app-wait-cursor-finish" title="gwy_app_wait_cursor_finish ()"><code class="function">gwy_app_wait_cursor_finish()</code></a> still work but
+may be called with <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> arguments.</p>
+<div class="refsect3">
+<a name="gwy-app-wait-set-enabled.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>setting</p></td>
+<td class="parameter_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to enable progress reporting, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> to disable it.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-app-wait-was-canceled"></a><h3>gwy_app_wait_was_canceled ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gwy_app_wait_was_canceled (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Checks if a progress dialog was cancelled.</p>
+<p>Calling this function is only meaningful between <a class="link" href="libgwyapp-wait.html#gwy-app-wait-cursor-start" title="gwy_app_wait_cursor_start ()"><code class="function">gwy_app_wait_cursor_start()</code></a>
+and <a class="link" href="libgwyapp-wait.html#gwy-app-wait-finish" title="gwy_app_wait_finish ()"><code class="function">gwy_app_wait_finish()</code></a>.  It returns <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the computation was
+cancelled by the user.  This may be occasionaly useful in complex
+multi-level calculations.  Usually, the return values of
+<a class="link" href="libgwyapp-wait.html#gwy-app-wait-set-fraction" title="gwy_app_wait_set_fraction ()"><code class="function">gwy_app_wait_set_fraction()</code></a> and <a class="link" href="libgwyapp-wait.html#gwy-app-wait-set-message" title="gwy_app_wait_set_message ()"><code class="function">gwy_app_wait_set_message()</code></a> are sufficient.</p>
+<div class="refsect3">
+<a name="gwy-app-wait-was-canceled.returns"></a><h4>Returns</h4>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the currently running calculation was cancelled.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
 </div>
 <div class="refsect1">
 <a name="libgwyapp-wait.other_details"></a><h2>Types and Values</h2>
diff --git a/devel-docs/libgwyapp/html/libgwyapp.devhelp2 b/devel-docs/libgwyapp/html/libgwyapp.devhelp2
index 5e5baea..14604a7 100644
--- a/devel-docs/libgwyapp/html/libgwyapp.devhelp2
+++ b/devel-docs/libgwyapp/html/libgwyapp.devhelp2
@@ -41,6 +41,8 @@
     <sub name="Index of new symbols in 2.45" link="api-index-2-45.html"/>
     <sub name="Index of new symbols in 2.46" link="api-index-2-46.html"/>
     <sub name="Index of new symbols in 2.47" link="api-index-2-47.html"/>
+    <sub name="Index of new symbols in 2.48" link="api-index-2-48.html"/>
+    <sub name="Index of new symbols in 2.49" link="api-index-2-49.html"/>
   </chapters>
   <functions>
     <keyword type="function" name="gwy_app_switch_tool ()" link="libgwyapp-app.html#gwy-app-switch-tool"/>
@@ -92,6 +94,7 @@
     <keyword type="function" name="gwy_app_data_browser_add_graph_watch ()" link="libgwyapp-data-browser.html#gwy-app-data-browser-add-graph-watch" since="2.41"/>
     <keyword type="function" name="gwy_app_data_browser_remove_graph_watch ()" link="libgwyapp-data-browser.html#gwy-app-data-browser-remove-graph-watch" since="2.41"/>
     <keyword type="function" name="gwy_app_sync_data_items ()" link="libgwyapp-data-browser.html#gwy-app-sync-data-items"/>
+    <keyword type="function" name="gwy_app_sync_data_itemsv ()" link="libgwyapp-data-browser.html#gwy-app-sync-data-itemsv" since="2.48"/>
     <keyword type="function" name="gwy_app_data_browser_copy_channel ()" link="libgwyapp-data-browser.html#gwy-app-data-browser-copy-channel"/>
     <keyword type="function" name="gwy_app_data_browser_copy_volume ()" link="libgwyapp-data-browser.html#gwy-app-data-browser-copy-volume" since="2.32"/>
     <keyword type="function" name="gwy_app_data_browser_copy_xyz ()" link="libgwyapp-data-browser.html#gwy-app-data-browser-copy-xyz" since="2.45"/>
@@ -367,6 +370,9 @@
     <keyword type="function" name="gwy_app_wait_set_message_prefix ()" link="libgwyapp-wait.html#gwy-app-wait-set-message-prefix"/>
     <keyword type="function" name="gwy_app_wait_cursor_start ()" link="libgwyapp-wait.html#gwy-app-wait-cursor-start" since="2.3"/>
     <keyword type="function" name="gwy_app_wait_cursor_finish ()" link="libgwyapp-wait.html#gwy-app-wait-cursor-finish" since="2.3"/>
+    <keyword type="function" name="gwy_app_wait_get_enabled ()" link="libgwyapp-wait.html#gwy-app-wait-get-enabled" since="2.48"/>
+    <keyword type="function" name="gwy_app_wait_set_enabled ()" link="libgwyapp-wait.html#gwy-app-wait-set-enabled" since="2.48"/>
+    <keyword type="function" name="gwy_app_wait_was_canceled ()" link="libgwyapp-wait.html#gwy-app-wait-was-canceled" since="2.49"/>
     <keyword type="constant" name="GWY_APP_CONTAINER" link="libgwyapp-data-browser.html#GWY-APP-CONTAINER:CAPS"/>
     <keyword type="constant" name="GWY_APP_DATA_VIEW" link="libgwyapp-data-browser.html#GWY-APP-DATA-VIEW:CAPS"/>
     <keyword type="constant" name="GWY_APP_GRAPH" link="libgwyapp-data-browser.html#GWY-APP-GRAPH:CAPS"/>
diff --git a/devel-docs/libgwyapp/libgwyapp-docs.sgml b/devel-docs/libgwyapp/libgwyapp-docs.sgml
index d1a6f18..bb914ab 100644
--- a/devel-docs/libgwyapp/libgwyapp-docs.sgml
+++ b/devel-docs/libgwyapp/libgwyapp-docs.sgml
@@ -34,73 +34,81 @@
     <title>Index of all symbols</title>
     <xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-3" role="2.3">
+  <index id="api-index-2-3">
     <title>Index of new symbols in 2.3</title>
     <xi:include href="xml/api-index-2.3.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-7" role="2.7">
+  <index id="api-index-2-7">
     <title>Index of new symbols in 2.7</title>
     <xi:include href="xml/api-index-2.7.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-9" role="2.9">
+  <index id="api-index-2-9">
     <title>Index of new symbols in 2.9</title>
     <xi:include href="xml/api-index-2.9.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-14" role="2.14">
+  <index id="api-index-2-14">
     <title>Index of new symbols in 2.14</title>
     <xi:include href="xml/api-index-2.14.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-18" role="2.18">
+  <index id="api-index-2-18">
     <title>Index of new symbols in 2.18</title>
     <xi:include href="xml/api-index-2.18.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-21" role="2.21">
+  <index id="api-index-2-21">
     <title>Index of new symbols in 2.21</title>
     <xi:include href="xml/api-index-2.21.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-23" role="2.23">
+  <index id="api-index-2-23">
     <title>Index of new symbols in 2.23</title>
     <xi:include href="xml/api-index-2.23.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-32" role="2.32">
+  <index id="api-index-2-32">
     <title>Index of new symbols in 2.32</title>
     <xi:include href="xml/api-index-2.32.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-33" role="2.33">
+  <index id="api-index-2-33">
     <title>Index of new symbols in 2.33</title>
     <xi:include href="xml/api-index-2.33.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-35" role="2.35">
+  <index id="api-index-2-35">
     <title>Index of new symbols in 2.35</title>
     <xi:include href="xml/api-index-2.35.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-38" role="2.38">
+  <index id="api-index-2-38">
     <title>Index of new symbols in 2.38</title>
     <xi:include href="xml/api-index-2.38.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-41" role="2.41">
+  <index id="api-index-2-41">
     <title>Index of new symbols in 2.41</title>
     <xi:include href="xml/api-index-2.41.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-42" role="2.42">
+  <index id="api-index-2-42">
     <title>Index of new symbols in 2.42</title>
     <xi:include href="xml/api-index-2.42.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-43" role="2.43">
+  <index id="api-index-2-43">
     <title>Index of new symbols in 2.43</title>
     <xi:include href="xml/api-index-2.43.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-45" role="2.45">
+  <index id="api-index-2-45">
     <title>Index of new symbols in 2.45</title>
     <xi:include href="xml/api-index-2.45.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-46" role="2.46">
+  <index id="api-index-2-46">
     <title>Index of new symbols in 2.46</title>
     <xi:include href="xml/api-index-2.46.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-47" role="2.47">
+  <index id="api-index-2-47">
     <title>Index of new symbols in 2.47</title>
     <xi:include href="xml/api-index-2.47.xml"><xi:fallback /></xi:include>
   </index>
+  <index id="api-index-2-48">
+    <title>Index of new symbols in 2.48</title>
+    <xi:include href="xml/api-index-2.48.xml"><xi:fallback /></xi:include>
+  </index>
+  <index id="api-index-2-49">
+    <title>Index of new symbols in 2.49</title>
+    <xi:include href="xml/api-index-2.49.xml"><xi:fallback /></xi:include>
+  </index>
   <!-- API INDICES END -->
 </book>
diff --git a/devel-docs/libgwyddion/Makefile.in b/devel-docs/libgwyddion/Makefile.in
index aafe4b9..160d44c 100644
--- a/devel-docs/libgwyddion/Makefile.in
+++ b/devel-docs/libgwyddion/Makefile.in
@@ -178,10 +178,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -191,6 +188,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -215,7 +214,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -273,6 +274,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -281,17 +283,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/devel-docs/libgwyddion/html/GwyContainer.html b/devel-docs/libgwyddion/html/GwyContainer.html
index 8264788..9581618 100644
--- a/devel-docs/libgwyddion/html/GwyContainer.html
+++ b/devel-docs/libgwyddion/html/GwyContainer.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyContainer: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="GwySerializable.html" title="GwySerializable">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyContainer.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -138,6 +138,14 @@
 </tr>
 <tr>
 <td class="function_type">
+<a class="link" href="GwyContainer.html" title="GwyContainer"><span class="returnvalue">GwyContainer</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="GwyContainer.html#gwy-container-duplicate-by-prefixv" title="gwy_container_duplicate_by_prefixv ()">gwy_container_duplicate_by_prefixv</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
 </td>
 <td class="function_name">
@@ -581,7 +589,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyContainer.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -596,7 +604,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyContainer.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -672,7 +680,7 @@ less convenient for casual usage -- each <a href="/usr/share/gtk-doc/html/glibgl
 typecasting.</p>
 <div class="refsect3">
 <a name="gwy-container-duplicate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -705,7 +713,7 @@ gwy_container_get_n_items (<em class="parameter"><code><a class="link" href="Gwy
 <p>Gets the number of items in a container.</p>
 <div class="refsect3">
 <a name="gwy-container-get-n-items.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -734,7 +742,7 @@ gwy_container_value_type (<em class="parameter"><code><a class="link" href="GwyC
 .</p>
 <div class="refsect3">
 <a name="gwy-container-value-type.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -770,7 +778,7 @@ gwy_container_contains (<em class="parameter"><code><a class="link" href="GwyCon
 .</p>
 <div class="refsect3">
 <a name="gwy-container-contains.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -808,7 +816,7 @@ gwy_container_get_value (<em class="parameter"><code><a class="link" href="GwyCo
 .</p>
 <div class="refsect3">
 <a name="gwy-container-get-value.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -843,7 +851,7 @@ gwy_container_gis_value (<em class="parameter"><code><a class="link" href="GwyCo
 <p>Get-if-set a generic value from a container.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-value.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -886,7 +894,7 @@ gwy_container_set_value (<em class="parameter"><code><a class="link" href="GwyCo
 .</p>
 <div class="refsect3">
 <a name="gwy-container-set-value.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -917,7 +925,7 @@ gwy_container_set_value_by_name (<em class="parameter"><code><a class="link" hre
 .</p>
 <div class="refsect3">
 <a name="gwy-container-set-value-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -948,7 +956,7 @@ gwy_container_remove (<em class="parameter"><code><a class="link" href="GwyConta
  from a container.</p>
 <div class="refsect3">
 <a name="gwy-container-remove.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -986,7 +994,7 @@ gwy_container_remove_by_prefix (<em class="parameter"><code><a class="link" href
  can be <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, all values are then removed.</p>
 <div class="refsect3">
 <a name="gwy-container-remove-by-prefix.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1022,7 +1030,7 @@ gwy_container_duplicate_by_prefix (<em class="parameter"><code><a class="link" h
 contained object are physically duplicated too, not just referenced again.</p>
 <div class="refsect3">
 <a name="gwy-container-duplicate-by-prefix.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1049,6 +1057,49 @@ contained object are physically duplicated too, not just referenced again.</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-container-duplicate-by-prefixv"></a><h3>gwy_container_duplicate_by_prefixv ()</h3>
+<pre class="programlisting"><a class="link" href="GwyContainer.html" title="GwyContainer"><span class="returnvalue">GwyContainer</span></a> *
+gwy_container_duplicate_by_prefixv (<em class="parameter"><code><a class="link" href="GwyContainer.html" title="GwyContainer"><span class="type">GwyContainer</span></a> *container</code></em>,
+                                    <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> n</code></em>,
+                                    <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **prefixes</code></em>);</pre>
+<p>Duplicates a container keeping only values under given prefixes.</p>
+<p>Like <a class="link" href="GwyContainer.html#gwy-container-duplicate" title="gwy_container_duplicate()"><code class="function">gwy_container_duplicate()</code></a>, this method creates a deep copy, that is
+contained object are physically duplicated too, not just referenced again.</p>
+<div class="refsect3">
+<a name="gwy-container-duplicate-by-prefixv.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>container</p></td>
+<td class="parameter_description"><p>A container.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>n</p></td>
+<td class="parameter_description"><p>Number of prefixes.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>prefixes</p></td>
+<td class="parameter_description"><p>List of prefixes.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-container-duplicate-by-prefixv.returns"></a><h4>Returns</h4>
+<p> A newly created container.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-container-transfer"></a><h3>gwy_container_transfer ()</h3>
 <pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
 gwy_container_transfer (<em class="parameter"><code><a class="link" href="GwyContainer.html" title="GwyContainer"><span class="type">GwyContainer</span></a> *source</code></em>,
@@ -1062,7 +1113,7 @@ referenced in <em class="parameter"><code>dest</code></em>
 .</p>
 <div class="refsect3">
 <a name="gwy-container-transfer.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1130,7 +1181,7 @@ When it's <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:C
 is returned.</p>
 <div class="refsect3">
 <a name="gwy-container-rename.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1183,7 +1234,7 @@ gwy_container_foreach (<em class="parameter"><code><a class="link" href="GwyCont
 (<a href="/usr/share/gtk-doc/html/glibglib-Quarks.html#GQuark"><span class="type">GQuark</span></a> key, <a href="/usr/share/gtk-doc/html/gobjectgobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value, user_data).</p>
 <div class="refsect3">
 <a name="gwy-container-foreach.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1228,7 +1279,7 @@ gwy_container_keys (<em class="parameter"><code><a class="link" href="GwyContain
 <p>Gets all quark keys of a container.</p>
 <div class="refsect3">
 <a name="gwy-container-keys.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1259,7 +1310,7 @@ gwy_container_keys_by_name (<em class="parameter"><code><a class="link" href="Gw
 <p>Gets all string keys of a container.</p>
 <div class="refsect3">
 <a name="gwy-container-keys-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1295,7 +1346,7 @@ gwy_container_set_boolean (<em class="parameter"><code><a class="link" href="Gwy
 .</p>
 <div class="refsect3">
 <a name="gwy-container-set-boolean.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1332,7 +1383,7 @@ gwy_container_get_boolean (<em class="parameter"><code><a class="link" href="Gwy
 .</p>
 <div class="refsect3">
 <a name="gwy-container-get-boolean.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1367,7 +1418,7 @@ gwy_container_gis_boolean (<em class="parameter"><code><a class="link" href="Gwy
 <p>Get-if-set a boolean from a container.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-boolean.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1411,7 +1462,7 @@ gwy_container_set_uchar (<em class="parameter"><code><a class="link" href="GwyCo
 .</p>
 <div class="refsect3">
 <a name="gwy-container-set-uchar.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1448,7 +1499,7 @@ gwy_container_get_uchar (<em class="parameter"><code><a class="link" href="GwyCo
 .</p>
 <div class="refsect3">
 <a name="gwy-container-get-uchar.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1483,7 +1534,7 @@ gwy_container_gis_uchar (<em class="parameter"><code><a class="link" href="GwyCo
 <p>Get-if-set an unsigned char from a container.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-uchar.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1527,7 +1578,7 @@ gwy_container_set_int32 (<em class="parameter"><code><a class="link" href="GwyCo
 .</p>
 <div class="refsect3">
 <a name="gwy-container-set-int32.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1564,7 +1615,7 @@ gwy_container_get_int32 (<em class="parameter"><code><a class="link" href="GwyCo
 .</p>
 <div class="refsect3">
 <a name="gwy-container-get-int32.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1599,7 +1650,7 @@ gwy_container_gis_int32 (<em class="parameter"><code><a class="link" href="GwyCo
 <p>Get-if-set a 32bit integer from a container.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-int32.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1644,7 +1695,7 @@ gwy_container_set_enum (<em class="parameter"><code><a class="link" href="GwyCon
 <p>Note enums are treated as 32bit integers.</p>
 <div class="refsect3">
 <a name="gwy-container-set-enum.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1682,7 +1733,7 @@ gwy_container_get_enum (<em class="parameter"><code><a class="link" href="GwyCon
 <p>Note enums are treated as 32bit integers.</p>
 <div class="refsect3">
 <a name="gwy-container-get-enum.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1718,7 +1769,7 @@ gwy_container_gis_enum (<em class="parameter"><code><a class="link" href="GwyCon
 <p>Note enums are treated as 32bit integers.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-enum.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1762,7 +1813,7 @@ gwy_container_set_int64 (<em class="parameter"><code><a class="link" href="GwyCo
 .</p>
 <div class="refsect3">
 <a name="gwy-container-set-int64.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1799,7 +1850,7 @@ gwy_container_get_int64 (<em class="parameter"><code><a class="link" href="GwyCo
 .</p>
 <div class="refsect3">
 <a name="gwy-container-get-int64.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1834,7 +1885,7 @@ gwy_container_gis_int64 (<em class="parameter"><code><a class="link" href="GwyCo
 <p>Get-if-set a 64bit integer from a container.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-int64.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1878,7 +1929,7 @@ gwy_container_set_double (<em class="parameter"><code><a class="link" href="GwyC
 .</p>
 <div class="refsect3">
 <a name="gwy-container-set-double.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1915,7 +1966,7 @@ gwy_container_get_double (<em class="parameter"><code><a class="link" href="GwyC
 .</p>
 <div class="refsect3">
 <a name="gwy-container-get-double.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1950,7 +2001,7 @@ gwy_container_gis_double (<em class="parameter"><code><a class="link" href="GwyC
 <p>Get-if-set a double from a container.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-double.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1996,7 +2047,7 @@ gwy_container_set_string (<em class="parameter"><code><a class="link" href="GwyC
 static strings, use <a href="/usr/share/gtk-doc/html/glibglib-String-Utility-Functions.html#g-strdup"><code class="function">g_strdup()</code></a> to duplicate them first.</p>
 <div class="refsect3">
 <a name="gwy-container-set-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2036,7 +2087,7 @@ gwy_container_set_const_string (<em class="parameter"><code><a class="link" href
 strings.</p>
 <div class="refsect3">
 <a name="gwy-container-set-const-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2075,7 +2126,7 @@ gwy_container_get_string (<em class="parameter"><code><a class="link" href="GwyC
 <p>The returned string must be treated as constant and never freed or modified.</p>
 <div class="refsect3">
 <a name="gwy-container-get-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2113,7 +2164,7 @@ gwy_container_gis_string (<em class="parameter"><code><a class="link" href="GwyC
 never freed or modified.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2161,7 +2212,7 @@ incremented.</p>
 of the container.</p>
 <div class="refsect3">
 <a name="gwy-container-set-object.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2202,7 +2253,7 @@ gwy_container_get_object (<em class="parameter"><code><a class="link" href="GwyC
 to exist.</p>
 <div class="refsect3">
 <a name="gwy-container-get-object.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2242,7 +2293,7 @@ increased, use <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-T
  may cease to exist.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-object.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2285,7 +2336,7 @@ gwy_container_serialize_to_text (<em class="parameter"><code><a class="link" hre
 objects is not controllable.</p>
 <div class="refsect3">
 <a name="gwy-container-serialize-to-text.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2312,7 +2363,7 @@ gwy_container_deserialize_from_text (<em class="parameter"><code>const <a href="
 <p>Restores a container from is text representation.</p>
 <div class="refsect3">
 <a name="gwy-container-deserialize-from-text.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2341,7 +2392,7 @@ gwy_container_deserialize_from_text (<em class="parameter"><code>const <a href="
 .</p>
 <div class="refsect3">
 <a name="gwy-container-value-type-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2372,7 +2423,7 @@ gwy_container_deserialize_from_text (<em class="parameter"><code>const <a href="
 .</p>
 <div class="refsect3">
 <a name="gwy-container-contains-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2403,7 +2454,7 @@ gwy_container_deserialize_from_text (<em class="parameter"><code>const <a href="
 .</p>
 <div class="refsect3">
 <a name="gwy-container-get-value-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2435,7 +2486,7 @@ gwy_container_deserialize_from_text (<em class="parameter"><code>const <a href="
 such value in the container.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-value-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2473,7 +2524,7 @@ it is left untouched.</p></td>
 <p>Expands to <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if there was such a value and was removed.</p>
 <div class="refsect3">
 <a name="gwy-container-remove-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2507,7 +2558,7 @@ new name <em class="parameter"><code>nn</code></em>
 <p>See <a class="link" href="GwyContainer.html#gwy-container-rename" title="gwy_container_rename ()"><code class="function">gwy_container_rename()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-container-rename-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2549,7 +2600,7 @@ new name <em class="parameter"><code>nn</code></em>
 .</p>
 <div class="refsect3">
 <a name="gwy-container-set-boolean-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2585,7 +2636,7 @@ new name <em class="parameter"><code>nn</code></em>
 .</p>
 <div class="refsect3">
 <a name="gwy-container-get-boolean-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2617,7 +2668,7 @@ new name <em class="parameter"><code>nn</code></em>
 such boolean in the container.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-boolean-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2653,7 +2704,7 @@ such boolean in the container.</p>
 .</p>
 <div class="refsect3">
 <a name="gwy-container-set-uchar-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2689,7 +2740,7 @@ such boolean in the container.</p>
 .</p>
 <div class="refsect3">
 <a name="gwy-container-get-uchar-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2721,7 +2772,7 @@ such boolean in the container.</p>
 such unsigned char in the container.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-uchar-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2757,7 +2808,7 @@ such unsigned char in the container.</p>
 .</p>
 <div class="refsect3">
 <a name="gwy-container-set-int32-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2793,7 +2844,7 @@ such unsigned char in the container.</p>
 .</p>
 <div class="refsect3">
 <a name="gwy-container-get-int32-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2825,7 +2876,7 @@ such unsigned char in the container.</p>
 such 32bit integer in the container.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-int32-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2862,7 +2913,7 @@ such 32bit integer in the container.</p>
 <p>Note enums are treated as 32bit integers.</p>
 <div class="refsect3">
 <a name="gwy-container-set-enum-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2899,7 +2950,7 @@ such 32bit integer in the container.</p>
 <p>Note enums are treated as 32bit integers.</p>
 <div class="refsect3">
 <a name="gwy-container-get-enum-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2932,7 +2983,7 @@ such 32bit integer in the container.</p>
 such enum in the container.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-enum-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2968,7 +3019,7 @@ such enum in the container.</p>
 .</p>
 <div class="refsect3">
 <a name="gwy-container-set-int64-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3004,7 +3055,7 @@ such enum in the container.</p>
 .</p>
 <div class="refsect3">
 <a name="gwy-container-get-int64-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3036,7 +3087,7 @@ such enum in the container.</p>
 such 64bit integer in the container.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-int64-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3072,7 +3123,7 @@ such 64bit integer in the container.</p>
 .</p>
 <div class="refsect3">
 <a name="gwy-container-set-double-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3108,7 +3159,7 @@ such 64bit integer in the container.</p>
 .</p>
 <div class="refsect3">
 <a name="gwy-container-get-double-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3140,7 +3191,7 @@ such 64bit integer in the container.</p>
 such double in the container.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-double-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3178,7 +3229,7 @@ such double in the container.</p>
 static strings, use <a href="/usr/share/gtk-doc/html/glibglib-String-Utility-Functions.html#g-strdup"><code class="function">g_strdup()</code></a> to duplicate them first.</p>
 <div class="refsect3">
 <a name="gwy-container-set-string-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3216,7 +3267,7 @@ static strings, use <a href="/usr/share/gtk-doc/html/glibglib-String-Utility-Fun
 strings.</p>
 <div class="refsect3">
 <a name="gwy-container-set-const-string-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3254,7 +3305,7 @@ strings.</p>
 <p>The returned string must be treated as constant and never freed or modified.</p>
 <div class="refsect3">
 <a name="gwy-container-get-string-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3289,7 +3340,7 @@ never freed or modified.</p>
 such string in the container.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-string-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3326,7 +3377,7 @@ such string in the container.</p>
 <p>See <a class="link" href="GwyContainer.html#gwy-container-set-object" title="gwy_container_set_object ()"><code class="function">gwy_container_set_object()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-container-set-object-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3366,7 +3417,7 @@ such string in the container.</p>
 to exist.</p>
 <div class="refsect3">
 <a name="gwy-container-get-object-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3403,7 +3454,7 @@ increased, use <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-T
 such object in the container.</p>
 <div class="refsect3">
 <a name="gwy-container-gis-object-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3476,7 +3527,7 @@ user_function (<a class="link" href="GwyContainer.html" title="GwyContainer"><sp
 changed.  The detail is the string key identifier.</p>
 <div class="refsect3">
 <a name="GwyContainer-item-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyddion/html/GwyEnum.html b/devel-docs/libgwyddion/html/GwyEnum.html
index 2a89ef2..2158135 100644
--- a/devel-docs/libgwyddion/html/GwyEnum.html
+++ b/devel-docs/libgwyddion/html/GwyEnum.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyEnum: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="libgwyddion-gwyversion.html" title="gwyversion">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyEnum.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -135,7 +135,7 @@ gwy_string_to_enum (<em class="parameter"><code>const <a href="http://developer.
 .</p>
 <div class="refsect3">
 <a name="gwy-string-to-enum.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -181,7 +181,7 @@ gwy_enum_to_string (<em class="parameter"><code><a href="http://developer.gnome.
 .</p>
 <div class="refsect3">
 <a name="gwy-enum-to-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -230,7 +230,7 @@ gwy_enuml_to_string (<em class="parameter"><code><a href="/usr/share/gtk-doc/htm
 .</p>
 <div class="refsect3">
 <a name="gwy-enuml-to-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -272,7 +272,7 @@ gwy_string_to_flags (<em class="parameter"><code>const <a href="/usr/share/gtk-d
 .</p>
 <div class="refsect3">
 <a name="gwy-string-to-flags.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -325,7 +325,7 @@ gwy_flags_to_string (<em class="parameter"><code><a href="/usr/share/gtk-doc/htm
 .</p>
 <div class="refsect3">
 <a name="gwy-flags-to-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -374,7 +374,7 @@ gwy_enum_sanitize_value (<em class="parameter"><code><a href="/usr/share/gtk-doc
 <p>Makes sure an enum value is valid.</p>
 <div class="refsect3">
 <a name="gwy-enum-sanitize-value.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -415,7 +415,7 @@ gwy_enum_freev (<em class="parameter"><code><a class="link" href="GwyEnum.html"
 itself.</p>
 <div class="refsect3">
 <a name="gwy-enum-freev.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -440,7 +440,7 @@ gwy_enum_inventory_new (<em class="parameter"><code>const <a class="link" href="
 lifetime of the inventory.</p>
 <div class="refsect3">
 <a name="gwy-enum-inventory-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyddion/html/GwyFDCurvePreset.html b/devel-docs/libgwyddion/html/GwyFDCurvePreset.html
index e552213..c64f707 100644
--- a/devel-docs/libgwyddion/html/GwyFDCurvePreset.html
+++ b/devel-docs/libgwyddion/html/GwyFDCurvePreset.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyFDCurvePreset: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="GwyNLFitPreset.html" title="GwyNLFitPreset">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyFDCurvePreset.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -51,7 +51,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyFDCurvePreset.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
diff --git a/devel-docs/libgwyddion/html/GwyInventory.html b/devel-docs/libgwyddion/html/GwyInventory.html
index 3192439..7cef1aa 100644
--- a/devel-docs/libgwyddion/html/GwyInventory.html
+++ b/devel-docs/libgwyddion/html/GwyInventory.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyInventory: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="GwyEnum.html" title="GwyEnum">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyInventory.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -253,7 +253,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyInventory.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -290,7 +290,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyInventory.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -355,7 +355,7 @@ gwy_inventory_new (<em class="parameter"><code>const <a class="link" href="GwyIn
 <p>Creates a new inventory.</p>
 <div class="refsect3">
 <a name="gwy-inventory-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -383,7 +383,7 @@ gwy_inventory_new_filled (<em class="parameter"><code>const <a class="link" href
 <p>Creates a new inventory and fills it with items.</p>
 <div class="refsect3">
 <a name="gwy-inventory-new-filled.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -428,7 +428,7 @@ adaptor for the array <em class="parameter"><code>items</code></em>
 .</p>
 <div class="refsect3">
 <a name="gwy-inventory-new-from-array.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -474,7 +474,7 @@ gwy_inventory_get_n_items (<em class="parameter"><code><a class="link" href="Gwy
 <p>Returns the number of items in an inventory.</p>
 <div class="refsect3">
 <a name="gwy-inventory-get-n-items.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -502,7 +502,7 @@ gwy_inventory_can_make_copies (<em class="parameter"><code><a class="link" href=
 functions like <a class="link" href="GwyInventory.html#gwy-inventory-new-item" title="gwy_inventory_new_item ()"><code class="function">gwy_inventory_new_item()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-inventory-can-make-copies.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -530,7 +530,7 @@ gwy_inventory_is_const (<em class="parameter"><code><a class="link" href="GwyInv
 <a class="link" href="GwyInventory.html#gwy-inventory-get-item" title="gwy_inventory_get_item ()"><code class="function">gwy_inventory_get_item()</code></a> may return pointers to constant memory.</p>
 <div class="refsect3">
 <a name="gwy-inventory-is-const.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -556,7 +556,7 @@ gwy_inventory_get_item_type (<em class="parameter"><code><a class="link" href="G
 <p>Returns the type of item an inventory holds.</p>
 <div class="refsect3">
 <a name="gwy-inventory-get-item-type.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -584,7 +584,7 @@ gwy_inventory_get_item (<em class="parameter"><code><a class="link" href="GwyInv
 <p>Looks up an item in an inventory.</p>
 <div class="refsect3">
 <a name="gwy-inventory-get-item.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -621,7 +621,7 @@ gwy_inventory_get_item_or_default (<em class="parameter"><code><a class="link" h
 inventory item, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> (can happen only when inventory is empty).</p>
 <div class="refsect3">
 <a name="gwy-inventory-get-item-or-default.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -656,7 +656,7 @@ gwy_inventory_get_nth_item (<em class="parameter"><code><a class="link" href="Gw
 <p>Returns item on given position in an inventory.</p>
 <div class="refsect3">
 <a name="gwy-inventory-get-nth-item.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -694,7 +694,7 @@ gwy_inventory_get_item_position (<em class="parameter"><code><a class="link" hre
 <p>Finds position of an item in an inventory.</p>
 <div class="refsect3">
 <a name="gwy-inventory-get-item-position.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -733,7 +733,7 @@ gwy_inventory_foreach (<em class="parameter"><code><a class="link" href="GwyInve
 .</p>
 <div class="refsect3">
 <a name="gwy-inventory-foreach.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -775,7 +775,7 @@ gwy_inventory_find (<em class="parameter"><code><a class="link" href="GwyInvento
 <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.  Its arguments are the same as in <a class="link" href="GwyInventory.html#gwy-inventory-foreach" title="gwy_inventory_foreach ()"><code class="function">gwy_inventory_foreach()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-inventory-find.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -821,7 +821,7 @@ gwy_inventory_set_default_item_name (<em class="parameter"><code><a class="link"
  must already exist in the inventory.</p>
 <div class="refsect3">
 <a name="gwy-inventory-set-default-item-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -850,7 +850,7 @@ gwy_inventory_get_default_item_name (<em class="parameter"><code><a class="link"
 <p>Returns the name of the default item of an inventory.</p>
 <div class="refsect3">
 <a name="gwy-inventory-get-default-item-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -877,7 +877,7 @@ gwy_inventory_get_default_item (<em class="parameter"><code><a class="link" href
 <p>Returns the default item of an inventory.</p>
 <div class="refsect3">
 <a name="gwy-inventory-get-default-item.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -906,7 +906,7 @@ gwy_inventory_item_updated (<em class="parameter"><code><a class="link" href="Gw
 can notify inventory via signals.</p>
 <div class="refsect3">
 <a name="gwy-inventory-item-updated.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -939,7 +939,7 @@ can provide <em class="parameter"><code>watchable_signal</code></em>
 .</p>
 <div class="refsect3">
 <a name="gwy-inventory-nth-item-updated.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -968,7 +968,7 @@ gwy_inventory_restore_order (<em class="parameter"><code><a class="link" href="G
 <p>Assures an inventory is sorted.</p>
 <div class="refsect3">
 <a name="gwy-inventory-restore-order.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -992,7 +992,7 @@ gwy_inventory_forget_order (<em class="parameter"><code><a class="link" href="Gw
 try to insert items in order.</p>
 <div class="refsect3">
 <a name="gwy-inventory-forget-order.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1018,7 +1018,7 @@ gwy_inventory_insert_item (<em class="parameter"><code><a class="link" href="Gwy
 inventory is unsorted, item is simply added to the end.</p>
 <div class="refsect3">
 <a name="gwy-inventory-insert-item.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1055,7 +1055,7 @@ gwy_inventory_insert_nth_item (<em class="parameter"><code><a class="link" href=
 <p>Item of the same name must not exist yet.</p>
 <div class="refsect3">
 <a name="gwy-inventory-insert-nth-item.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1096,7 +1096,7 @@ gwy_inventory_delete_item (<em class="parameter"><code><a class="link" href="Gwy
 <p>Deletes an item from an inventory.</p>
 <div class="refsect3">
 <a name="gwy-inventory-delete-item.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1130,7 +1130,7 @@ gwy_inventory_delete_nth_item (<em class="parameter"><code><a class="link" href=
 <p>Deletes an item on given position from an inventory.</p>
 <div class="refsect3">
 <a name="gwy-inventory-delete-nth-item.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1170,7 +1170,7 @@ gwy_inventory_rename_item (<em class="parameter"><code><a class="link" href="Gwy
 will fail.</p>
 <div class="refsect3">
 <a name="gwy-inventory-rename-item.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1213,7 +1213,7 @@ gwy_inventory_new_item (<em class="parameter"><code><a class="link" href="GwyInv
 already exists.</p>
 <div class="refsect3">
 <a name="gwy-inventory-new-item.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1310,7 +1310,7 @@ plain C structs or something else, you can easily export their data members
 as virtual <a href="/usr/share/gtk-doc/html/gtk3GtkTreeModel.html#GtkTreeModel-struct"><span class="type">GtkTreeModel</span></a> columns by defining traits for them.</p>
 <div class="refsect3">
 <a name="GwyInventoryItemType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
@@ -1427,7 +1427,7 @@ default inventory item name changes or the presence of such an item
 in the inventory changes.</p>
 <div class="refsect3">
 <a name="GwyInventory-default-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1460,7 +1460,7 @@ user_function (<a class="link" href="GwyInventory.html" title="GwyInventory"><sp
 an inventory.</p>
 <div class="refsect3">
 <a name="GwyInventory-item-deleted.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1498,7 +1498,7 @@ user_function (<a class="link" href="GwyInventory.html" title="GwyInventory"><sp
 an inventory.</p>
 <div class="refsect3">
 <a name="GwyInventory-item-inserted.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1536,7 +1536,7 @@ user_function (<a class="link" href="GwyInventory.html" title="GwyInventory"><sp
 is updated.</p>
 <div class="refsect3">
 <a name="GwyInventory-item-updated.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1574,7 +1574,7 @@ user_function (<a class="link" href="GwyInventory.html" title="GwyInventory"><sp
 are reordered.</p>
 <div class="refsect3">
 <a name="GwyInventory-items-reordered.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyddion/html/GwyNLFitPreset.html b/devel-docs/libgwyddion/html/GwyNLFitPreset.html
index db19d85..7b01ff6 100644
--- a/devel-docs/libgwyddion/html/GwyNLFitPreset.html
+++ b/devel-docs/libgwyddion/html/GwyNLFitPreset.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyNLFitPreset: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="libgwyddion-GwyNLFitter.html" title="GwyNLFitter">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyNLFitPreset.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -115,7 +115,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyNLFitPreset.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -193,6 +193,10 @@ fitting parameters from units of fitted data is also available:
 <tr><td><code class="literal">"Smooth bent step"</code></td></tr>
 <tr><td><code class="literal">"Smooth slanted step"</code></td></tr>
 </table>
+<p>The following presets are available since version 2.48:</p>
+<table border="0" summary="Simple list" class="simplelist"><tr><td><code class="literal">"K-correlated (PSDF)"</code></td></tr></table>
+<p>The following presets are available since version 2.49:</p>
+<table border="0" summary="Simple list" class="simplelist"><tr><td><code class="literal">"Boltzmann bent step"</code></td></tr></table>
 <p>The result of the fitting is stored in a normal <a class="link" href="libgwyddion-GwyNLFitter.html#GwyNLFitter" title="struct GwyNLFitter"><span class="type">GwyNLFitter</span></a>, therefore the
 typical use is:</p>
 <div class="informalexample">
@@ -254,7 +258,7 @@ gwy_nlfit_preset_get_value (<em class="parameter"><code><a class="link" href="Gw
 <p>Calculates preset function value in a single point with given parameters.</p>
 <div class="refsect3">
 <a name="gwy-nlfit-preset-get-value.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -298,7 +302,7 @@ gwy_nlfit_preset_get_formula (<em class="parameter"><code><a class="link" href="
  (with Pango markup).</p>
 <div class="refsect3">
 <a name="gwy-nlfit-preset-get-formula.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -325,7 +329,7 @@ gwy_nlfit_preset_get_nparams (<em class="parameter"><code><a class="link" href="
 .</p>
 <div class="refsect3">
 <a name="gwy-nlfit-preset-get-nparams.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -353,7 +357,7 @@ gwy_nlfit_preset_get_param_name (<em class="parameter"><code><a class="link" hre
 <p>The name may contain Pango markup.</p>
 <div class="refsect3">
 <a name="gwy-nlfit-preset-get-param-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -391,7 +395,7 @@ gwy_nlfit_preset_get_param_units (<em class="parameter"><code><a class="link" hr
 ordinate.</p>
 <div class="refsect3">
 <a name="gwy-nlfit-preset-get-param-units.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -451,7 +455,7 @@ estimate.</p>
 values that should not give raise to NaNs and infinities.</p>
 <div class="refsect3">
 <a name="gwy-nlfit-preset-guess.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -507,7 +511,7 @@ gwy_nlfit_preset_create_fitter (<em class="parameter"><code><a class="link" href
 <a class="link" href="GwyNLFitPreset.html#gwy-nlfit-preset-fit" title="gwy_nlfit_preset_fit ()"><code class="function">gwy_nlfit_preset_fit()</code></a> directly with <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> fitter.</p>
 <div class="refsect3">
 <a name="gwy-nlfit-preset-create-fitter.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -543,7 +547,7 @@ gwy_nlfit_preset_fit (<em class="parameter"><code><a class="link" href="GwyNLFit
 <p>See <a class="link" href="libgwyddion-GwyNLFitter.html#gwy-math-nlfit-fit-full" title="gwy_math_nlfit_fit_full ()"><code class="function">gwy_math_nlfit_fit_full()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-nlfit-preset-fit.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyddion/html/GwyResource.html b/devel-docs/libgwyddion/html/GwyResource.html
index 3a601c2..9799c37 100644
--- a/devel-docs/libgwyddion/html/GwyResource.html
+++ b/devel-docs/libgwyddion/html/GwyResource.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyResource: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="libgwyddion-GwyRandGenSet.html" title="GwyRandGenSet">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyResource.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -188,7 +188,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyResource.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -216,7 +216,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyResource.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -231,7 +231,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyResource.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -276,7 +276,7 @@ gwy_resource_get_name (<em class="parameter"><code><a class="link" href="GwyReso
 <p>Returns resource name.</p>
 <div class="refsect3">
 <a name="gwy-resource-get-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -305,7 +305,7 @@ gwy_resource_get_is_modifiable (<em class="parameter"><code><a class="link" href
 <p>Returns whether a resource is modifiable.</p>
 <div class="refsect3">
 <a name="gwy-resource-get-is-modifiable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -332,7 +332,7 @@ gwy_resource_get_is_preferred (<em class="parameter"><code><a class="link" href=
 <p>Returns whether a resource is preferred.</p>
 <div class="refsect3">
 <a name="gwy-resource-get-is-preferred.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -359,7 +359,7 @@ gwy_resource_set_is_preferred (<em class="parameter"><code><a class="link" href=
 <p>Sets preferability of a resource.</p>
 <div class="refsect3">
 <a name="gwy-resource-set-is-preferred.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -391,7 +391,7 @@ gwy_resource_class_get_name (<em class="parameter"><code><a class="link" href="G
 <p>This is an simple identifier usable for example as directory name.</p>
 <div class="refsect3">
 <a name="gwy-resource-class-get-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -418,7 +418,7 @@ gwy_resource_class_get_inventory (<em class="parameter"><code><a class="link" hr
 <p>Gets inventory which holds resources of a resource class.</p>
 <div class="refsect3">
 <a name="gwy-resource-class-get-inventory.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -444,7 +444,7 @@ gwy_resource_class_get_item_type (<em class="parameter"><code><a class="link" hr
 <p>Gets inventory item type for a resource class.</p>
 <div class="refsect3">
 <a name="gwy-resource-class-get-item-type.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -480,7 +480,7 @@ ready-to-use form.</p>
 constructor and <a class="link" href="GwyResource.html#gwy-resource-release" title="gwy_resource_release ()"><code class="function">gwy_resource_release()</code></a> is the destructor.</p>
 <div class="refsect3">
 <a name="gwy-resource-use.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -505,7 +505,7 @@ and returns back to `latent' form.  In addition, it calls <a href="/usr/share/gt
 on it.  See <a class="link" href="GwyResource.html#gwy-resource-use" title="gwy_resource_use ()"><code class="function">gwy_resource_use()</code></a> for more.</p>
 <div class="refsect3">
 <a name="gwy-resource-release.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -528,7 +528,7 @@ gwy_resource_is_used (<em class="parameter"><code><a class="link" href="GwyResou
 <p>See <a class="link" href="GwyResource.html#gwy-resource-use" title="gwy_resource_use ()"><code class="function">gwy_resource_use()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-resource-is-used.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -558,7 +558,7 @@ sets <em class="parameter"><code>is_modified</code></em>
 <p>Mostly useful in resource implementation.</p>
 <div class="refsect3">
 <a name="gwy-resource-data-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -581,7 +581,7 @@ gwy_resource_data_saved (<em class="parameter"><code><a class="link" href="GwyRe
  flag of a resource.</p>
 <div class="refsect3">
 <a name="gwy-resource-data-saved.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -606,7 +606,7 @@ gwy_resource_build_filename (<em class="parameter"><code><a class="link" href="G
 probably loaded from file of the same name.</p>
 <div class="refsect3">
 <a name="gwy-resource-build-filename.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -633,7 +633,7 @@ gwy_resource_dump (<em class="parameter"><code><a class="link" href="GwyResource
 <p>Dumps a resource to a textual (human readable) form.</p>
 <div class="refsect3">
 <a name="gwy-resource-dump.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -660,7 +660,7 @@ gwy_resource_parse (<em class="parameter"><code>const <a href="/usr/share/gtk-do
 <p>Reconstructs a resource from human readable form.</p>
 <div class="refsect3">
 <a name="gwy-resource-parse.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -696,7 +696,7 @@ gwy_resource_class_load (<em class="parameter"><code><a class="link" href="GwyRe
 user directory (marked modifiable).</p>
 <div class="refsect3">
 <a name="gwy-resource-class-load.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -718,7 +718,7 @@ gwy_resource_class_mkdir (<em class="parameter"><code><a class="link" href="GwyR
 <p>Creates directory for user resources if it does not exist.</p>
 <div class="refsect3">
 <a name="gwy-resource-class-mkdir.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -785,7 +785,7 @@ using the functions below.</p>
 <p>Resource class.</p>
 <div class="refsect3">
 <a name="GwyResourceClass.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
@@ -879,7 +879,7 @@ user_function (<a class="link" href="GwyResource.html" title="GwyResource"><span
 <p>The ::data-changed signal is emitted when resource data changes.</p>
 <div class="refsect3">
 <a name="GwyResource-data-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyddion/html/GwySIUnit.html b/devel-docs/libgwyddion/html/GwySIUnit.html
index 637c592..0b831fe 100644
--- a/devel-docs/libgwyddion/html/GwySIUnit.html
+++ b/devel-docs/libgwyddion/html/GwySIUnit.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwySIUnit: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="libgwyddion-GwyExpr.html" title="GwyExpr">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwySIUnit.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -138,6 +138,14 @@
 </tr>
 <tr>
 <td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="GwySIUnit.html#gwy-si-unit-equal-string" title="gwy_si_unit_equal_string ()">gwy_si_unit_equal_string</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">GwySIValueFormat</span> *
 </td>
 <td class="function_name">
@@ -173,7 +181,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySIUnit.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -188,7 +196,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySIUnit.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -242,7 +250,7 @@ formatting functions).  There are several functions computing value format
 typecasting.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-duplicate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -266,7 +274,7 @@ gwy_si_unit_new (<em class="parameter"><code>const <a href="http://developer.gno
 (e. g. "m", "N", "A", etc.)</p>
 <div class="refsect3">
 <a name="gwy-si-unit-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -305,7 +313,7 @@ to <em class="parameter"><code>power10</code></em>
  because 1 km^2 is 1e6 m^2.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-new-parse.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -340,7 +348,7 @@ gwy_si_unit_set_from_string (<em class="parameter"><code><a class="link" href="G
 <p>It must be base unit with no prefixes (e. g. "m", "N", "A", etc.).</p>
 <div class="refsect3">
 <a name="gwy-si-unit-set-from-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -375,7 +383,7 @@ gwy_si_unit_set_from_string_parse (<em class="parameter"><code><a class="link" h
 see <a class="link" href="GwySIUnit.html#gwy-si-unit-new-parse" title="gwy_si_unit_new_parse ()"><code class="function">gwy_si_unit_new_parse()</code></a> for some discussion.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-set-from-string-parse.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -396,7 +404,7 @@ unit).</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>power10</p></td>
-<td class="parameter_description"><p>Where power of 10 should be stored (or <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>).</p></td>
+<td class="parameter_description"><p>Where power of 10 should be stored (or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>).</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -412,7 +420,7 @@ gwy_si_unit_get_string (<em class="parameter"><code><a class="link" href="GwySIU
 <p>Obtains string representing a SI unit.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-get-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -448,7 +456,7 @@ gwy_si_unit_multiply (<em class="parameter"><code><a class="link" href="GwySIUni
 <p>Multiplies two SI units.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-multiply.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -498,7 +506,7 @@ gwy_si_unit_divide (<em class="parameter"><code><a class="link" href="GwySIUnit.
 <p>Divides two SI units.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-divide.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -548,7 +556,7 @@ gwy_si_unit_power (<em class="parameter"><code><a class="link" href="GwySIUnit.h
 <p>Computes a power of an SI unit.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-power.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -599,7 +607,7 @@ gwy_si_unit_nth_root (<em class="parameter"><code><a class="link" href="GwySIUni
 are not representable by <a class="link" href="GwySIUnit.html" title="GwySIUnit"><span class="type">GwySIUnit</span></a>.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-nth-root.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -654,7 +662,7 @@ gwy_si_unit_power_multiply (<em class="parameter"><code><a class="link" href="Gw
 chained when more than two units are to be multiplied.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-power-multiply.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -713,12 +721,12 @@ is simply returned, its reference count is NOT increased.</p>
 <div class="refsect2">
 <a name="gwy-si-unit-equal"></a><h3>gwy_si_unit_equal ()</h3>
 <pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gwy_si_unit_equal (<em class="parameter"><code><a class="link" href="GwySIUnit.html" title="GwySIUnit"><span class="type">GwySIUnit</span></a> *siunit1</code></em>,
+gwy_si_unit_equal (<em class="parameter"><code><a class="link" href="GwySIUnit.html" title="GwySIUnit"><span class="type">GwySIUnit</span></a> *siunit</code></em>,
                    <em class="parameter"><code><a class="link" href="GwySIUnit.html" title="GwySIUnit"><span class="type">GwySIUnit</span></a> *siunit2</code></em>);</pre>
 <p>Checks whether two SI units are equal.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-equal.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -726,7 +734,7 @@ gwy_si_unit_equal (<em class="parameter"><code><a class="link" href="GwySIUnit.h
 </colgroup>
 <tbody>
 <tr>
-<td class="parameter_name"><p>siunit1</p></td>
+<td class="parameter_name"><p>siunit</p></td>
 <td class="parameter_description"><p>First unit.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
@@ -740,11 +748,49 @@ gwy_si_unit_equal (<em class="parameter"><code><a class="link" href="GwySIUnit.h
 </div>
 <div class="refsect3">
 <a name="gwy-si-unit-equal.returns"></a><h4>Returns</h4>
-<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if units are equal.</p>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the units are equal.</p>
 </div>
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-si-unit-equal-string"></a><h3>gwy_si_unit_equal_string ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gwy_si_unit_equal_string (<em class="parameter"><code><a class="link" href="GwySIUnit.html" title="GwySIUnit"><span class="type">GwySIUnit</span></a> *siunit</code></em>,
+                          <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *unit_string</code></em>);</pre>
+<p>Checks whether an SI unit corresponds to given string.</p>
+<p>Any power-of-ten prefixes are ignored.  This function is mostly useful for
+quick comparison with simple units such as "m" and for checking whether a
+unit is non-empty (by comparing with <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> or an empty string).</p>
+<div class="refsect3">
+<a name="gwy-si-unit-equal-string.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>siunit</p></td>
+<td class="parameter_description"><p>An SI unit.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unit_string</p></td>
+<td class="parameter_description"><p>Unit string (it can be <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> for an empty unit).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-si-unit-equal-string.returns"></a><h4>Returns</h4>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the units is equivalent to the given string.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-si-unit-get-format"></a><h3>gwy_si_unit_get_format ()</h3>
 <pre class="programlisting"><span class="returnvalue">GwySIValueFormat</span> *
 gwy_si_unit_get_format (<em class="parameter"><code><a class="link" href="GwySIUnit.html" title="GwySIUnit"><span class="type">GwySIUnit</span></a> *siunit</code></em>,
@@ -759,7 +805,7 @@ gwy_si_unit_get_format (<em class="parameter"><code><a class="link" href="GwySIU
  decimal places.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-get-format.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -816,7 +862,7 @@ gwy_si_unit_get_format_for_power10 (<em class="parameter"><code><a class="link"
 .</p>
 <div class="refsect3">
 <a name="gwy-si-unit-get-format-for-power10.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -874,7 +920,7 @@ gwy_si_unit_get_format_with_resolution
  decimal places.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-get-format-with-resolution.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -883,7 +929,7 @@ gwy_si_unit_get_format_with_resolution
 <tbody>
 <tr>
 <td class="parameter_name"><p>siunit</p></td>
-<td class="parameter_description"><p>A SI unit.</p></td>
+<td class="parameter_description"><p>An SI unit.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -937,7 +983,7 @@ significant digits.</p>
  decimal places.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-get-format-with-digits.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -946,7 +992,7 @@ significant digits.</p>
 <tbody>
 <tr>
 <td class="parameter_name"><p>siunit</p></td>
-<td class="parameter_description"><p>A SI unit.</p></td>
+<td class="parameter_description"><p>An SI unit.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1011,7 +1057,7 @@ user_function (<a class="link" href="GwySIUnit.html" title="GwySIUnit"><span cla
 <p>The ::value-changed signal is emitted whenever SI unit changes.</p>
 <div class="refsect3">
 <a name="GwySIUnit-value-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyddion/html/GwySerializable.html b/devel-docs/libgwyddion/html/GwySerializable.html
index 80050e2..e9be82a 100644
--- a/devel-docs/libgwyddion/html/GwySerializable.html
+++ b/devel-docs/libgwyddion/html/GwySerializable.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwySerializable: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="libgwyddion-gwyddionenums.html" title="gwyddionenums">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwySerializable.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -159,7 +159,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySerializable.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -242,7 +242,7 @@ in most cases performed by <a class="link" href="GwySerializable.html#gwy-serial
 description.</p>
 <div class="refsect3">
 <a name="GwySerializeFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -280,7 +280,7 @@ with serialized object appended.</p>
 description.</p>
 <div class="refsect3">
 <a name="GwyDeserializeFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -324,7 +324,7 @@ object serialization (should you ever need to do it manually), it would
 lead to repeated required buffer size calculations.</p>
 <div class="refsect3">
 <a name="gwy-serializable-serialize.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -365,7 +365,7 @@ a <a href="/usr/share/gtk-doc/html/gtk2GtkObject.html#GtkObject-struct"><span cl
 refcount of 1, etc.</p>
 <div class="refsect3">
 <a name="gwy-serializable-deserialize.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -411,7 +411,7 @@ namely for large objects.</p>
 <p>You can duplicate a <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, too, but you are discouraged from doing it.</p>
 <div class="refsect3">
 <a name="gwy-serializable-duplicate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -445,7 +445,7 @@ gwy_serializable_clone (<em class="parameter"><code><a href="/usr/share/gtk-doc/
 is lost then).</p>
 <div class="refsect3">
 <a name="gwy-serializable-clone.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -475,7 +475,7 @@ gwy_serializable_get_size (<em class="parameter"><code><a href="/usr/share/gtk-d
 <p>Calculates the expected size of serialized object.</p>
 <div class="refsect3">
 <a name="gwy-serializable-get-size.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -506,7 +506,7 @@ gwy_serialize_get_struct_size (<em class="parameter"><code>const <a href="/usr/s
 <a class="link" href="GwySerializable.html#gwy-serialize-pack-object-struct" title="gwy_serialize_pack_object_struct ()"><code class="function">gwy_serialize_pack_object_struct()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-serialize-get-struct-size.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -551,7 +551,7 @@ gwy_serialize_get_items_size (<em class="parameter"><code>const <a href="/usr/sh
 <a class="link" href="GwySerializable.html#gwy-serialize-object-items" title="gwy_serialize_object_items ()"><code class="function">gwy_serialize_object_items()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-serialize-get-items-size.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -638,7 +638,7 @@ described by a single real number foo could look (without error checking):</p>
 
 <div class="refsect3">
 <a name="gwy-serialize-pack-object-struct.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -745,7 +745,7 @@ described by a single real number <em class="parameter"><code>foo</code></em>
 
 <div class="refsect3">
 <a name="gwy-serialize-unpack-object-struct.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -814,7 +814,7 @@ NUL-terminated string, and eventually whether it's equal to <em class="parameter
  is <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, the comparsion is not performed.</p>
 <div class="refsect3">
 <a name="gwy-serialize-check-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -871,7 +871,7 @@ gwy_serialize_object_items (<em class="parameter"><code><a href="/usr/share/gtk-
 .</p>
 <div class="refsect3">
 <a name="gwy-serialize-object-items.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -930,7 +930,7 @@ considerably less sanity checks and even allows several components of the
 same name.</p>
 <div class="refsect3">
 <a name="gwy-deserialize-object-hash.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1019,7 +1019,7 @@ of struct-like objects.</p>
 <code class="literal">'O'</code> for an array of objects.</p>
 <div class="refsect3">
 <a name="GwySerializeSpec.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
@@ -1063,7 +1063,7 @@ otherwise.</p></td>
 non-atomic value.</p>
 <div class="refsect3">
 <a name="GwySerializeValue.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="union_members_name">
 <col class="union_members_description">
@@ -1161,7 +1161,7 @@ serialization or deserialization.</p>
 objects.</p>
 <div class="refsect3">
 <a name="GwySerializeItem.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
diff --git a/devel-docs/libgwyddion/html/GwyStringList.html b/devel-docs/libgwyddion/html/GwyStringList.html
index 8092ebf..ed18041 100644
--- a/devel-docs/libgwyddion/html/GwyStringList.html
+++ b/devel-docs/libgwyddion/html/GwyStringList.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyStringList: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="GwyResource.html" title="GwyResource">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyStringList.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -100,7 +100,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyStringList.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -115,7 +115,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyStringList.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -164,7 +164,7 @@ later as needed.</p>
 typecasting.</p>
 <div class="refsect3">
 <a name="gwy-string-list-duplicate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -198,7 +198,7 @@ gwy_string_list_append (<em class="parameter"><code><a class="link" href="GwyStr
 <p>Appends a string to the end of a string list.</p>
 <div class="refsect3">
 <a name="gwy-string-list-append.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -228,7 +228,7 @@ gwy_string_list_append_take (<em class="parameter"><code><a class="link" href="G
 <p>Appends a string to the end of a string list, taking ownership of the string.</p>
 <div class="refsect3">
 <a name="gwy-string-list-append-take.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -258,7 +258,7 @@ gwy_string_list_get_length (<em class="parameter"><code><a class="link" href="Gw
 <p>Gets the number of strings in a string list.</p>
 <div class="refsect3">
 <a name="gwy-string-list-get-length.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -286,7 +286,7 @@ gwy_string_list_get (<em class="parameter"><code><a class="link" href="GwyString
 <p>Gets a string from a string list by position.</p>
 <div class="refsect3">
 <a name="gwy-string-list-get.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -321,7 +321,7 @@ gwy_string_list_clear (<em class="parameter"><code><a class="link" href="GwyStri
 <p>Clears the contents of a string list, removing all strings.</p>
 <div class="refsect3">
 <a name="gwy-string-list-clear.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -366,7 +366,7 @@ user_function (<a class="link" href="GwyStringList.html" title="GwyStringList"><
 <p>The ::value-changed signal is emitted whenever a string list changes.</p>
 <div class="refsect3">
 <a name="GwyStringList-value-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyddion/html/api-index-2-1.html b/devel-docs/libgwyddion/html/api-index-2-1.html
index bdd1a9c..cea65eb 100644
--- a/devel-docs/libgwyddion/html/api-index-2-1.html
+++ b/devel-docs/libgwyddion/html/api-index-2-1.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.1: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-deprec.html" title="Index of deprecated symbols">
diff --git a/devel-docs/libgwyddion/html/api-index-2-11.html b/devel-docs/libgwyddion/html/api-index-2-11.html
index e18d06c..f1c01f3 100644
--- a/devel-docs/libgwyddion/html/api-index-2-11.html
+++ b/devel-docs/libgwyddion/html/api-index-2-11.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.11: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-9.html" title="Index of new symbols in 2.9">
diff --git a/devel-docs/libgwyddion/html/api-index-2-12.html b/devel-docs/libgwyddion/html/api-index-2-12.html
index e04a3d4..ec1adee 100644
--- a/devel-docs/libgwyddion/html/api-index-2-12.html
+++ b/devel-docs/libgwyddion/html/api-index-2-12.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.12: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-11.html" title="Index of new symbols in 2.11">
diff --git a/devel-docs/libgwyddion/html/api-index-2-22.html b/devel-docs/libgwyddion/html/api-index-2-22.html
index 326bf65..d1c9138 100644
--- a/devel-docs/libgwyddion/html/api-index-2-22.html
+++ b/devel-docs/libgwyddion/html/api-index-2-22.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.22: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-12.html" title="Index of new symbols in 2.12">
diff --git a/devel-docs/libgwyddion/html/api-index-2-25.html b/devel-docs/libgwyddion/html/api-index-2-25.html
index e25426b..acbc47b 100644
--- a/devel-docs/libgwyddion/html/api-index-2-25.html
+++ b/devel-docs/libgwyddion/html/api-index-2-25.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.25: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-22.html" title="Index of new symbols in 2.22">
diff --git a/devel-docs/libgwyddion/html/api-index-2-26.html b/devel-docs/libgwyddion/html/api-index-2-26.html
index 9c01d8a..d228676 100644
--- a/devel-docs/libgwyddion/html/api-index-2-26.html
+++ b/devel-docs/libgwyddion/html/api-index-2-26.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.26: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-25.html" title="Index of new symbols in 2.25">
diff --git a/devel-docs/libgwyddion/html/api-index-2-35.html b/devel-docs/libgwyddion/html/api-index-2-35.html
index b65cdd5..033a894 100644
--- a/devel-docs/libgwyddion/html/api-index-2-35.html
+++ b/devel-docs/libgwyddion/html/api-index-2-35.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.35: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-26.html" title="Index of new symbols in 2.26">
diff --git a/devel-docs/libgwyddion/html/api-index-2-36.html b/devel-docs/libgwyddion/html/api-index-2-36.html
index 1ecbb08..1152f84 100644
--- a/devel-docs/libgwyddion/html/api-index-2-36.html
+++ b/devel-docs/libgwyddion/html/api-index-2-36.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.36: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-35.html" title="Index of new symbols in 2.35">
diff --git a/devel-docs/libgwyddion/html/api-index-2-37.html b/devel-docs/libgwyddion/html/api-index-2-37.html
index 0bcc195..95db634 100644
--- a/devel-docs/libgwyddion/html/api-index-2-37.html
+++ b/devel-docs/libgwyddion/html/api-index-2-37.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.37: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-36.html" title="Index of new symbols in 2.36">
diff --git a/devel-docs/libgwyddion/html/api-index-2-38.html b/devel-docs/libgwyddion/html/api-index-2-38.html
index eeb1b61..8c15f3f 100644
--- a/devel-docs/libgwyddion/html/api-index-2-38.html
+++ b/devel-docs/libgwyddion/html/api-index-2-38.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.38: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-37.html" title="Index of new symbols in 2.37">
diff --git a/devel-docs/libgwyddion/html/api-index-2-39.html b/devel-docs/libgwyddion/html/api-index-2-39.html
index 7334412..9319ae8 100644
--- a/devel-docs/libgwyddion/html/api-index-2-39.html
+++ b/devel-docs/libgwyddion/html/api-index-2-39.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.39: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-38.html" title="Index of new symbols in 2.38">
diff --git a/devel-docs/libgwyddion/html/api-index-2-4.html b/devel-docs/libgwyddion/html/api-index-2-4.html
index a09e2ee..a5a408a 100644
--- a/devel-docs/libgwyddion/html/api-index-2-4.html
+++ b/devel-docs/libgwyddion/html/api-index-2-4.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.4: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-1.html" title="Index of new symbols in 2.1">
diff --git a/devel-docs/libgwyddion/html/api-index-2-42.html b/devel-docs/libgwyddion/html/api-index-2-42.html
index 123fb9c..1a2cd19 100644
--- a/devel-docs/libgwyddion/html/api-index-2-42.html
+++ b/devel-docs/libgwyddion/html/api-index-2-42.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.42: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-39.html" title="Index of new symbols in 2.39">
diff --git a/devel-docs/libgwyddion/html/api-index-2-43.html b/devel-docs/libgwyddion/html/api-index-2-43.html
index 7eb165f..0ba53ce 100644
--- a/devel-docs/libgwyddion/html/api-index-2-43.html
+++ b/devel-docs/libgwyddion/html/api-index-2-43.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.43: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-42.html" title="Index of new symbols in 2.42">
diff --git a/devel-docs/libgwyddion/html/api-index-2-44.html b/devel-docs/libgwyddion/html/api-index-2-44.html
index 97d0c8b..f9ddfea 100644
--- a/devel-docs/libgwyddion/html/api-index-2-44.html
+++ b/devel-docs/libgwyddion/html/api-index-2-44.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.44: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-43.html" title="Index of new symbols in 2.43">
diff --git a/devel-docs/libgwyddion/html/api-index-2-45.html b/devel-docs/libgwyddion/html/api-index-2-45.html
index 6c148dc..c6fba0f 100644
--- a/devel-docs/libgwyddion/html/api-index-2-45.html
+++ b/devel-docs/libgwyddion/html/api-index-2-45.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.45: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-44.html" title="Index of new symbols in 2.44">
diff --git a/devel-docs/libgwyddion/html/api-index-2-46.html b/devel-docs/libgwyddion/html/api-index-2-46.html
index 8be7316..733bc2b 100644
--- a/devel-docs/libgwyddion/html/api-index-2-46.html
+++ b/devel-docs/libgwyddion/html/api-index-2-46.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.46: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-45.html" title="Index of new symbols in 2.45">
diff --git a/devel-docs/libgwyddion/html/api-index-2-47.html b/devel-docs/libgwyddion/html/api-index-2-47.html
index 7fb6c9e..b881bff 100644
--- a/devel-docs/libgwyddion/html/api-index-2-47.html
+++ b/devel-docs/libgwyddion/html/api-index-2-47.html
@@ -3,10 +3,11 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.47: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-46.html" title="Index of new symbols in 2.46">
+<link rel="next" href="api-index-2-48.html" title="Index of new symbols in 2.48">
 <meta name="generator" content="GTK-Doc V1.19 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -16,7 +17,7 @@
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
 <td><a accesskey="p" href="api-index-2-46.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><img src="right-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="n" href="api-index-2-48.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="index">
 <div class="titlepage"><div><div><h1 class="title">
diff --git a/devel-docs/libgwyddion/html/api-index-2-48.html b/devel-docs/libgwyddion/html/api-index-2-48.html
new file mode 100644
index 0000000..f2174a6
--- /dev/null
+++ b/devel-docs/libgwyddion/html/api-index-2-48.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.48: Gwyddion Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
+<link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
+<link rel="prev" href="api-index-2-47.html" title="Index of new symbols in 2.47">
+<link rel="next" href="api-index-2-49.html" title="Index of new symbols in 2.49">
+<meta name="generator" content="GTK-Doc V1.19 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxG">G</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="p" href="api-index-2-47.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-49.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h1 class="title">
+<a name="api-index-2-48"></a>Index of new symbols in 2.48</h1></div></div></div>
+<a name="idx"></a><a name="idxG"></a><h3 class="title">G</h3>
+<dt>
+<a class="link" href="libgwyddion-Math.html#gwy-check-regular-2d-grid" title="gwy_check_regular_2d_grid ()">gwy_check_regular_2d_grid</a>, function in <a class="link" href="libgwyddion-Math.html" title="Math">Math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyContainer.html#gwy-container-duplicate-by-prefixv" title="gwy_container_duplicate_by_prefixv ()">gwy_container_duplicate_by_prefixv</a>, function in <a class="link" href="GwyContainer.html" title="GwyContainer">GwyContainer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.19</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/devel-docs/libgwyddion/html/api-index-2-49.html b/devel-docs/libgwyddion/html/api-index-2-49.html
new file mode 100644
index 0000000..19ceb92
--- /dev/null
+++ b/devel-docs/libgwyddion/html/api-index-2-49.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.49: Gwyddion Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
+<link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
+<link rel="prev" href="api-index-2-48.html" title="Index of new symbols in 2.48">
+<meta name="generator" content="GTK-Doc V1.19 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxG">G</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="p" href="api-index-2-48.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><img src="right-insensitive.png" width="16" height="16" border="0"></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h1 class="title">
+<a name="api-index-2-49"></a>Index of new symbols in 2.49</h1></div></div></div>
+<a name="idx"></a><a name="idxG"></a><h3 class="title">G</h3>
+<dt>
+<a class="link" href="libgwyddion-Math.html#gwy-math-histogram" title="gwy_math_histogram ()">gwy_math_histogram</a>, function in <a class="link" href="libgwyddion-Math.html" title="Math">Math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyddion-Math.html#gwy-math-refine-maximum-1d" title="gwy_math_refine_maximum_1d ()">gwy_math_refine_maximum_1d</a>, function in <a class="link" href="libgwyddion-Math.html" title="Math">Math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyddion-Math.html#gwy-math-refine-maximum-2d" title="gwy_math_refine_maximum_2d ()">gwy_math_refine_maximum_2d</a>, function in <a class="link" href="libgwyddion-Math.html" title="Math">Math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyddion-gwyutils.html#gwy-set-member-object" title="gwy_set_member_object ()">gwy_set_member_object</a>, function in <a class="link" href="libgwyddion-gwyutils.html" title="gwyutils">gwyutils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwySIUnit.html#gwy-si-unit-equal-string" title="gwy_si_unit_equal_string ()">gwy_si_unit_equal_string</a>, function in <a class="link" href="GwySIUnit.html" title="GwySIUnit">GwySIUnit</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.19</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/devel-docs/libgwyddion/html/api-index-2-5.html b/devel-docs/libgwyddion/html/api-index-2-5.html
index 0b2932e..b984363 100644
--- a/devel-docs/libgwyddion/html/api-index-2-5.html
+++ b/devel-docs/libgwyddion/html/api-index-2-5.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.5: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-4.html" title="Index of new symbols in 2.4">
diff --git a/devel-docs/libgwyddion/html/api-index-2-7.html b/devel-docs/libgwyddion/html/api-index-2-7.html
index ab58125..4453e5c 100644
--- a/devel-docs/libgwyddion/html/api-index-2-7.html
+++ b/devel-docs/libgwyddion/html/api-index-2-7.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.7: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-5.html" title="Index of new symbols in 2.5">
diff --git a/devel-docs/libgwyddion/html/api-index-2-8.html b/devel-docs/libgwyddion/html/api-index-2-8.html
index 57b9177..55ca329 100644
--- a/devel-docs/libgwyddion/html/api-index-2-8.html
+++ b/devel-docs/libgwyddion/html/api-index-2-8.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.8: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-7.html" title="Index of new symbols in 2.7">
diff --git a/devel-docs/libgwyddion/html/api-index-2-9.html b/devel-docs/libgwyddion/html/api-index-2-9.html
index 201ccdd..322fb18 100644
--- a/devel-docs/libgwyddion/html/api-index-2-9.html
+++ b/devel-docs/libgwyddion/html/api-index-2-9.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.9: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-2-8.html" title="Index of new symbols in 2.8">
diff --git a/devel-docs/libgwyddion/html/api-index-all.html b/devel-docs/libgwyddion/html/api-index-all.html
index a2e9f45..dc3708b 100644
--- a/devel-docs/libgwyddion/html/api-index-all.html
+++ b/devel-docs/libgwyddion/html/api-index-all.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of all symbols: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="libgwyddion-gwydebugobjects.html" title="gwydebugobjects">
@@ -285,6 +285,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwyddion-Math.html#gwy-check-regular-2d-grid" title="gwy_check_regular_2d_grid ()">gwy_check_regular_2d_grid</a>, function in <a class="link" href="libgwyddion-Math.html" title="Math">Math</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwyddion-gwymacros.html#GWY-CLAMP:CAPS" title="GWY_CLAMP()">GWY_CLAMP</a>, macro in <a class="link" href="libgwyddion-gwymacros.html" title="gwymacros">gwymacros</a>
 </dt>
 <dd></dd>
@@ -313,6 +317,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GwyContainer.html#gwy-container-duplicate-by-prefixv" title="gwy_container_duplicate_by_prefixv ()">gwy_container_duplicate_by_prefixv</a>, function in <a class="link" href="GwyContainer.html" title="GwyContainer">GwyContainer</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="GwyContainer.html#gwy-container-foreach" title="gwy_container_foreach ()">gwy_container_foreach</a>, function in <a class="link" href="GwyContainer.html" title="GwyContainer">GwyContainer</a>
 </dt>
 <dd></dd>
@@ -961,6 +969,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwyddion-Math.html#gwy-math-histogram" title="gwy_math_histogram ()">gwy_math_histogram</a>, function in <a class="link" href="libgwyddion-Math.html" title="Math">Math</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwyddion-Math.html#gwy-math-humanize-numbers" title="gwy_math_humanize_numbers ()">gwy_math_humanize_numbers</a>, function in <a class="link" href="libgwyddion-Math.html" title="Math">Math</a>
 </dt>
 <dd></dd>
@@ -1081,6 +1093,14 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwyddion-Math.html#gwy-math-refine-maximum-1d" title="gwy_math_refine_maximum_1d ()">gwy_math_refine_maximum_1d</a>, function in <a class="link" href="libgwyddion-Math.html" title="Math">Math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyddion-Math.html#gwy-math-refine-maximum-2d" title="gwy_math_refine_maximum_2d ()">gwy_math_refine_maximum_2d</a>, function in <a class="link" href="libgwyddion-Math.html" title="Math">Math</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwyddion-Math.html#gwy-math-sort" title="gwy_math_sort ()">gwy_math_sort</a>, function in <a class="link" href="libgwyddion-Math.html" title="Math">Math</a>
 </dt>
 <dd></dd>
@@ -1325,6 +1345,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwyddion-gwyutils.html#gwy-set-member-object" title="gwy_set_member_object ()">gwy_set_member_object</a>, function in <a class="link" href="libgwyddion-gwyutils.html" title="gwyutils">gwyutils</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwyddion-gwyutils.html#gwy-sgettext" title="gwy_sgettext ()">gwy_sgettext</a>, function in <a class="link" href="libgwyddion-gwyutils.html" title="gwyutils">gwyutils</a>
 </dt>
 <dd></dd>
@@ -1349,6 +1373,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GwySIUnit.html#gwy-si-unit-equal-string" title="gwy_si_unit_equal_string ()">gwy_si_unit_equal_string</a>, function in <a class="link" href="GwySIUnit.html" title="GwySIUnit">GwySIUnit</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="GwySIUnit.html#gwy-si-unit-get-format" title="gwy_si_unit_get_format ()">gwy_si_unit_get_format</a>, function in <a class="link" href="GwySIUnit.html" title="GwySIUnit">GwySIUnit</a>
 </dt>
 <dd></dd>
diff --git a/devel-docs/libgwyddion/html/api-index-deprec.html b/devel-docs/libgwyddion/html/api-index-deprec.html
index 88b4508..887df20 100644
--- a/devel-docs/libgwyddion/html/api-index-deprec.html
+++ b/devel-docs/libgwyddion/html/api-index-deprec.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of deprecated symbols: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="api-index-all.html" title="Index of all symbols">
diff --git a/devel-docs/libgwyddion/html/index.html b/devel-docs/libgwyddion/html/index.html
index c046c7d..a649b12 100644
--- a/devel-docs/libgwyddion/html/index.html
+++ b/devel-docs/libgwyddion/html/index.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Gwyddion Library Reference Manual: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="next" href="libgwyddion-gwyddionenums.html" title="gwyddionenums">
 <meta name="generator" content="GTK-Doc V1.19 (XML mode)">
@@ -15,7 +15,7 @@
 <div>
 <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">Gwyddion Library Reference Manual</p></th></tr></table></div>
 <div><p class="releaseinfo">
-  For Gwyddion 2.47.
+  For Gwyddion 2.49.
   The latest version of this document can be found on-line at
   <a class="ulink" href="http://gwyddion.net/documentation/libgwyddion/index.php" target="_top">http://gwyddion.net/documentation/libgwyddion/</a>.
 </p></div>
@@ -118,6 +118,8 @@
 <dt><span class="index"><a href="api-index-2-45.html">Index of new symbols in 2.45</a></span></dt>
 <dt><span class="index"><a href="api-index-2-46.html">Index of new symbols in 2.46</a></span></dt>
 <dt><span class="index"><a href="api-index-2-47.html">Index of new symbols in 2.47</a></span></dt>
+<dt><span class="index"><a href="api-index-2-48.html">Index of new symbols in 2.48</a></span></dt>
+<dt><span class="index"><a href="api-index-2-49.html">Index of new symbols in 2.49</a></span></dt>
 </dl></div>
 <p>
     This library contains basic classes and interfaces not directly related
diff --git a/devel-docs/libgwyddion/html/libgwyddion-GwyExpr.html b/devel-docs/libgwyddion/html/libgwyddion-GwyExpr.html
index 9d6177b..4379c2a 100644
--- a/devel-docs/libgwyddion/html/libgwyddion-GwyExpr.html
+++ b/devel-docs/libgwyddion/html/libgwyddion-GwyExpr.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyExpr: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="GwyFDCurvePreset.html" title="GwyFDCurvePreset">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyddion-GwyExpr.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -139,7 +139,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyddion-GwyExpr.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -379,7 +379,7 @@ gwy_expr_free (<em class="parameter"><code><a class="link" href="libgwyddion-Gwy
 <p>Frees all memory used by an expression evaluator.</p>
 <div class="refsect3">
 <a name="gwy-expr-free.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -404,7 +404,7 @@ gwy_expr_evaluate (<em class="parameter"><code><a class="link" href="libgwyddion
 <p>Evaulates an arithmetic expression.</p>
 <div class="refsect3">
 <a name="gwy-expr-evaluate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -452,7 +452,7 @@ gwy_expr_compile (<em class="parameter"><code><a class="link" href="libgwyddion-
 arithmetic expressions it's easier to use <a class="link" href="libgwyddion-GwyExpr.html#gwy-expr-evaluate" title="gwy_expr_evaluate ()"><code class="function">gwy_expr_evaluate()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-expr-compile.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -494,7 +494,7 @@ gwy_expr_resolve_variables (<em class="parameter"><code><a class="link" href="li
 <p>Finds positions of variables in an expression.</p>
 <div class="refsect3">
 <a name="gwy-expr-resolve-variables.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -555,7 +555,7 @@ value in <em class="parameter"><code>values</code></em>
 in the array is always reserved and do not correspond to any variable.</p>
 <div class="refsect3">
 <a name="gwy-expr-get-variables.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -597,7 +597,7 @@ gwy_expr_execute (<em class="parameter"><code><a class="link" href="libgwyddion-
 <p>Executes a compiled expression with variables, substituting given values.</p>
 <div class="refsect3">
 <a name="gwy-expr-execute.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -634,7 +634,7 @@ gwy_expr_vector_execute (<em class="parameter"><code><a class="link" href="libgw
 <p>Executes a compiled expression on each item of data arrays.</p>
 <div class="refsect3">
 <a name="gwy-expr-vector-execute.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -685,7 +685,7 @@ gwy_expr_define_constant (<em class="parameter"><code><a class="link" href="libg
 to recompile it (and eventually re-resolve variables).</p>
 <div class="refsect3">
 <a name="gwy-expr-define-constant.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -733,7 +733,7 @@ gwy_expr_undefine_constant (<em class="parameter"><code><a class="link" href="li
 you have to recompile it (and eventually re-resolve variables).</p>
 <div class="refsect3">
 <a name="gwy-expr-undefine-constant.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -767,7 +767,7 @@ gwy_expr_get_expression (<em class="parameter"><code><a class="link" href="libgw
 <p>Gets the expression string.</p>
 <div class="refsect3">
 <a name="gwy-expr-get-expression.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -805,7 +805,7 @@ error domains.</p>
 <p>Error codes returned by expression parsing and execution.</p>
 <div class="refsect3">
 <a name="GwyExprError.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwyddion/html/libgwyddion-GwyNLFitter.html b/devel-docs/libgwyddion/html/libgwyddion-GwyNLFitter.html
index 9b3e5ac..84a227a 100644
--- a/devel-docs/libgwyddion/html/libgwyddion-GwyNLFitter.html
+++ b/devel-docs/libgwyddion/html/libgwyddion-GwyNLFitter.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyNLFitter: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="libgwyddion-Math-Fallback.html" title="Math Fallback">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyddion-GwyNLFitter.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -259,7 +259,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyddion-GwyNLFitter.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -308,7 +308,7 @@ fitted with <a class="link" href="GwyNLFitPreset.html#gwy-nlfit-preset-fit" titl
 <p>Fitting function type for real-valued independent variables.</p>
 <div class="refsect3">
 <a name="GwyNLFitFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -366,7 +366,7 @@ fitted with <a class="link" href="GwyNLFitPreset.html#gwy-nlfit-preset-fit" titl
 variables.</p>
 <div class="refsect3">
 <a name="GwyNLFitDerFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -441,7 +441,7 @@ multiplied by the inverse of the (unsquared) estimated error of the
 default unit weights.</p>
 <div class="refsect3">
 <a name="GwyNLFitIdxFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -498,7 +498,7 @@ multiplied by the inverse of the (unsquared) estimated error of the
 default unit weights.</p>
 <div class="refsect3">
 <a name="GwyNLFitIdxDiffFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -518,7 +518,9 @@ default unit weights.</p>
 <tr>
 <td class="parameter_name"><p>fixed_param</p></td>
 <td class="parameter_description"><p>Which parameters should be treated as fixed (corresponding
-entries are set to <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>).</p></td>
+entries are set to <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>).  It may be <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> is no parameters
+are fixed.  The function must set derivatives by fixed
+parameters to zero.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -564,7 +566,7 @@ as <em class="parameter"><code>diff</code></em>
 numerical differentiation.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -610,7 +612,7 @@ cannot use weighting.  If you want weighting you need to pass your own
 <a class="link" href="libgwyddion-GwyNLFitter.html#gwy-math-nlfit-diff-idx" title="gwy_math_nlfit_diff_idx ()"><code class="function">gwy_math_nlfit_diff_idx()</code></a> helper).</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-new-idx.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -644,7 +646,7 @@ gwy_math_nlfit_free (<em class="parameter"><code><a class="link" href="libgwyddi
 <p>Completely frees a Marquardt-Levenberg nonlinear fitter.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-free.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -667,7 +669,7 @@ gwy_math_nlfit_copy (<em class="parameter"><code><a class="link" href="libgwyddi
 <p>This function is mostly usefil for language bindings.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-copy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -700,7 +702,7 @@ gwy_math_nlfit_fit (<em class="parameter"><code><a class="link" href="libgwyddio
 <p>Performs a nonlinear fit of simple function on data.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-fit.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -778,7 +780,7 @@ values, their <em class="parameter"><code>fixed_param</code></em>
 controls whether all are fixed or all variable.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-fit-full.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -869,7 +871,7 @@ gwy_math_nlfit_fit_idx (<em class="parameter"><code><a class="link" href="libgwy
 <p>Performs a nonlinear fit of function on opaque indexed data.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-fit-idx.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -934,7 +936,7 @@ values, their <em class="parameter"><code>fixed_param</code></em>
 controls whether all are fixed or all variable.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-fit-idx-full.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1006,7 +1008,7 @@ gwy_math_nlfit_get_max_iterations (<em class="parameter"><code><a class="link" h
 .</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-get-max-iterations.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1034,7 +1036,7 @@ gwy_math_nlfit_set_max_iterations (<em class="parameter"><code><a class="link" h
 .</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-set-max-iterations.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1063,7 +1065,7 @@ gwy_math_nlfit_get_approx_geometric (<em class="parameter"><code><a class="link"
 <p>Reports if a non-linear fitter performs approximately orthogonal fitting.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-get-approx-geometric.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1098,7 +1100,7 @@ Furthermore, it is better used only when the fit is already relatively close
 to the minimum.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-set-approx-geometric.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1131,7 +1133,7 @@ for negative return value of <a class="link" href="libgwyddion-GwyNLFitter.html#
 <a class="link" href="libgwyddion-GwyNLFitter.html#gwy-math-nlfit-fit-full" title="gwy_math_nlfit_fit_full ()"><code class="function">gwy_math_nlfit_fit_full()</code></a>.  This function allows to test it later.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-succeeded.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1159,7 +1161,7 @@ gwy_math_nlfit_get_dispersion (<em class="parameter"><code><a class="link" href=
 <p>This function can be used only after a successful fit.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-get-dispersion.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1190,7 +1192,7 @@ gwy_math_nlfit_get_correlations (<em class="parameter"><code><a class="link" hre
 <p>This function can be used only after a successful fit.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-get-correlations.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1228,7 +1230,7 @@ gwy_math_nlfit_get_eval (<em class="parameter"><code><a class="link" href="libgw
 <p>Gets the state of a nonlinear fitter.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-get-eval.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1255,7 +1257,7 @@ gwy_math_nlfit_get_covar (<em class="parameter"><code><a class="link" href="libg
 <p>Gets the covariance matrix of a nonlinear fitter.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-get-covar.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1287,7 +1289,7 @@ by <a class="link" href="libgwyddion-GwyNLFitter.html#gwy-math-nlfit-get-covar"
 <a class="link" href="libgwyddion-GwyNLFitter.html#gwy-math-nlfit-get-correlations" title="gwy_math_nlfit_get_correlations ()"><code class="function">gwy_math_nlfit_get_correlations()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-get-nparam.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1315,10 +1317,11 @@ gwy_math_nlfit_get_sigma (<em class="parameter"><code><a class="link" href="libg
                           <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> par</code></em>);</pre>
 <p>Returns the standard deviation of parameter number <em class="parameter"><code>par</code></em>
 .</p>
-<p>This function makes sense only after a successful fit.</p>
+<p>This function makes sense only after a successful fit and for a free
+parameter.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-get-sigma.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1354,7 +1357,7 @@ gwy_math_nlfit_set_callbacks (<em class="parameter"><code><a class="link" href="
 <p>Sets callbacks reporting a non-linear least squares fitter progress.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-set-callbacks.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1396,7 +1399,7 @@ gwy_math_nlfit_diff (<em class="parameter"><code><a href="/usr/share/gtk-doc/htm
 <p>Numerically computes the partial derivatives of a function.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-diff.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1467,7 +1470,7 @@ gwy_math_nlfit_derive (<em class="parameter"><code><a href="/usr/share/gtk-doc/h
 <p>This is a legacy name for function <a class="link" href="libgwyddion-GwyNLFitter.html#gwy-math-nlfit-diff" title="gwy_math_nlfit_diff ()"><code class="function">gwy_math_nlfit_diff()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-derive.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1543,7 +1546,7 @@ if you need to modify the derivatives somehow, for instance to apply
 weighting.</p>
 <div class="refsect3">
 <a name="gwy-math-nlfit-diff-idx.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1629,7 +1632,7 @@ the fitter state.</p>
 left untouched.</p>
 <div class="refsect3">
 <a name="GwyNLFitter.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
diff --git a/devel-docs/libgwyddion/html/libgwyddion-GwyRandGenSet.html b/devel-docs/libgwyddion/html/libgwyddion-GwyRandGenSet.html
index fadc71c..ae0785d 100644
--- a/devel-docs/libgwyddion/html/libgwyddion-GwyRandGenSet.html
+++ b/devel-docs/libgwyddion/html/libgwyddion-GwyRandGenSet.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyRandGenSet: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="GwyInventory.html" title="GwyInventory">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyddion-GwyRandGenSet.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -148,7 +148,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyddion-GwyRandGenSet.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -218,7 +218,7 @@ gwy_rand_gen_set_new (<em class="parameter"><code><a href="http://developer.gnom
 <p>The generators are initialised to random states.</p>
 <div class="refsect3">
 <a name="gwy-rand-gen-set-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -246,7 +246,7 @@ gwy_rand_gen_set_init (<em class="parameter"><code><a class="link" href="libgwyd
 <p>Initialises a set of pseudorandom number generators using an integer seed.</p>
 <div class="refsect3">
 <a name="gwy-rand-gen-set-init.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -278,7 +278,7 @@ gwy_rand_gen_set_free (<em class="parameter"><code><a class="link" href="libgwyd
 not use them any more after calling this function.</p>
 <div class="refsect3">
 <a name="gwy-rand-gen-set-free.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -306,7 +306,7 @@ number sequence stability will be broken because sampling functions may keep
 persistent information between calls.</p>
 <div class="refsect3">
 <a name="gwy-rand-gen-set-rng.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -353,7 +353,7 @@ is ever returned.  Note if there are no representable real numbers between
 .</p>
 <div class="refsect3">
 <a name="gwy-rand-gen-set-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -403,7 +403,7 @@ pseudorandom number generator set.</p>
 .</p>
 <div class="refsect3">
 <a name="gwy-rand-gen-set-uniform.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -448,7 +448,7 @@ pseudorandom number generator set.</p>
 .</p>
 <div class="refsect3">
 <a name="gwy-rand-gen-set-gaussian.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -493,7 +493,7 @@ pseudorandom number generator set.</p>
 .</p>
 <div class="refsect3">
 <a name="gwy-rand-gen-set-exponential.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -538,7 +538,7 @@ pseudorandom number generator set.</p>
 .</p>
 <div class="refsect3">
 <a name="gwy-rand-gen-set-triangular.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -584,7 +584,7 @@ with values from [1-<em class="parameter"><code>range</code></em>
 ].</p>
 <div class="refsect3">
 <a name="gwy-rand-gen-set-multiplier.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -625,7 +625,7 @@ gwy_rand_gen_set_double (<em class="parameter"><code><a class="link" href="libgw
 pseudorandom number generator set.</p>
 <div class="refsect3">
 <a name="gwy-rand-gen-set-double.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -661,7 +661,7 @@ gwy_rand_gen_set_int (<em class="parameter"><code><a class="link" href="libgwydd
 generator set.</p>
 <div class="refsect3">
 <a name="gwy-rand-gen-set-int.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -703,7 +703,7 @@ gwy_rand_gen_set_choose_shuffle (<em class="parameter"><code><a class="link" hre
 .</p>
 <div class="refsect3">
 <a name="gwy-rand-gen-set-choose-shuffle.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyddion/html/libgwyddion-GwySIValueFormat.html b/devel-docs/libgwyddion/html/libgwyddion-GwySIValueFormat.html
index 2d19097..d550ae1 100644
--- a/devel-docs/libgwyddion/html/libgwyddion-GwySIValueFormat.html
+++ b/devel-docs/libgwyddion/html/libgwyddion-GwySIValueFormat.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwySIValueFormat: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="GwySIUnit.html" title="GwySIUnit">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyddion-GwySIValueFormat.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -111,7 +111,7 @@ as <a class="link" href="GwySIUnit.html#gwy-si-unit-get-format-with-digits" titl
 functions.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-value-format-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -151,7 +151,7 @@ gwy_si_unit_value_format_copy (<em class="parameter"><code><span class="type">Gw
 <p>Copies a value format structure.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-value-format-copy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -179,7 +179,7 @@ gwy_si_unit_value_format_free (<em class="parameter"><code><span class="type">Gw
 <p>Frees a value format structure.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-value-format-free.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -204,7 +204,7 @@ gwy_si_unit_value_format_clone (<em class="parameter"><code><span class="type">G
 that can either modify an existing format or allocate a new one.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-value-format-clone.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -245,7 +245,7 @@ gwy_si_unit_value_format_set_units (<em class="parameter"><code><span class="typ
  fields consistent.</p>
 <div class="refsect3">
 <a name="gwy-si-unit-value-format-set-units.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyddion/html/libgwyddion-Math-Fallback.html b/devel-docs/libgwyddion/html/libgwyddion-Math-Fallback.html
index 1e700a6..6943620 100644
--- a/devel-docs/libgwyddion/html/libgwyddion-Math-Fallback.html
+++ b/devel-docs/libgwyddion/html/libgwyddion-Math-Fallback.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Math Fallback: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="libgwyddion-Math.html" title="Math">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyddion-Math-Fallback.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -109,7 +109,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyddion-Math-Fallback.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -184,7 +184,7 @@ gwy_math_fallback_pow10 (<em class="parameter"><code><span class="type">double</
 <code class="function">pow10</code>.</p>
 <div class="refsect3">
 <a name="gwy-math-fallback-pow10.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -213,7 +213,7 @@ gwy_math_fallback_cbrt (<em class="parameter"><code><span class="type">double</s
 <code class="function">cbrt</code>.</p>
 <div class="refsect3">
 <a name="gwy-math-fallback-cbrt.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -243,7 +243,7 @@ gwy_math_fallback_hypot (<em class="parameter"><code><span class="type">double</
 <code class="function">hypot</code>.</p>
 <div class="refsect3">
 <a name="gwy-math-fallback-hypot.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -281,7 +281,7 @@ gwy_math_fallback_acosh (<em class="parameter"><code><span class="type">double</
 <code class="function">acosh</code>.</p>
 <div class="refsect3">
 <a name="gwy-math-fallback-acosh.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -310,7 +310,7 @@ gwy_math_fallback_asinh (<em class="parameter"><code><span class="type">double</
 <code class="function">asinh</code>.</p>
 <div class="refsect3">
 <a name="gwy-math-fallback-asinh.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -339,7 +339,7 @@ gwy_math_fallback_atanh (<em class="parameter"><code><span class="type">double</
 <code class="function">atanh</code>.</p>
 <div class="refsect3">
 <a name="gwy-math-fallback-atanh.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -368,7 +368,7 @@ gwy_math_fallback_isinf (<em class="parameter"><code><span class="type">double</
 <code class="function">isinf</code>.</p>
 <div class="refsect3">
 <a name="gwy-math-fallback-isinf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -397,7 +397,7 @@ gwy_math_fallback_isnan (<em class="parameter"><code><span class="type">double</
 <code class="function">isnan</code>.</p>
 <div class="refsect3">
 <a name="gwy-math-fallback-isnan.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyddion/html/libgwyddion-Math.html b/devel-docs/libgwyddion/html/libgwyddion-Math.html
index 5165e58..1129b45 100644
--- a/devel-docs/libgwyddion/html/libgwyddion-Math.html
+++ b/devel-docs/libgwyddion/html/libgwyddion-Math.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Math: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="libgwyddion-gwyentities.html" title="gwyentities">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyddion-Math.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -200,11 +200,35 @@
 <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
 </td>
 <td class="function_name">
+<a class="link" href="libgwyddion-Math.html#gwy-math-refine-maximum-1d" title="gwy_math_refine_maximum_1d ()">gwy_math_refine_maximum_1d</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="libgwyddion-Math.html#gwy-math-refine-maximum-2d" title="gwy_math_refine_maximum_2d ()">gwy_math_refine_maximum_2d</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
 <a class="link" href="libgwyddion-Math.html#gwy-math-refine-maximum" title="gwy_math_refine_maximum ()">gwy_math_refine_maximum</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <tr>
 <td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="libgwyddion-Math.html#gwy-check-regular-2d-grid" title="gwy_check_regular_2d_grid ()">gwy_check_regular_2d_grid</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
 </td>
 <td class="function_name">
@@ -221,7 +245,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
 </td>
 <td class="function_name">
 <a class="link" href="libgwyddion-Math.html#gwy-math-median-uncertainty" title="gwy_math_median_uncertainty ()">gwy_math_median_uncertainty</a> <span class="c_punctuation">()</span>
@@ -229,18 +253,26 @@
 </tr>
 <tr>
 <td class="function_type">
-<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
 </td>
 <td class="function_name">
 <a class="link" href="libgwyddion-Math.html#gwy-xlnx-int" title="gwy_xlnx_int ()">gwy_xlnx_int</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
+<tr>
+<td class="function_type">
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="libgwyddion-Math.html#gwy-math-histogram" title="gwy_math_histogram ()">gwy_math_histogram</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
 </tbody>
 </table></div>
 </div>
 <div class="refsect1">
 <a name="libgwyddion-Math.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -281,7 +313,7 @@ implementation.</p>
 <p>Rounds a number to nearest integer.  Use <a class="link" href="libgwyddion-Math.html#GWY-ROUND:CAPS" title="GWY_ROUND()"><code class="literal">GWY_ROUND</code></a> instead.</p>
 <div class="refsect3">
 <a name="ROUND.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -303,7 +335,7 @@ implementation.</p>
 <p>Rounds a number to nearest integer.</p>
 <div class="refsect3">
 <a name="GWY-ROUND.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -322,13 +354,13 @@ implementation.</p>
 <div class="refsect2">
 <a name="gwy-xy-new"></a><h3>gwy_xy_new ()</h3>
 <pre class="programlisting"><span class="returnvalue">GwyXY</span> *
-gwy_xy_new (<em class="parameter"><code><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> x</code></em>,
+gwy_xy_new (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> x</code></em>,
             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> y</code></em>);</pre>
 <p>Creates Cartesian coordinates in plane.</p>
 <p>This is mostly useful for language bindings.</p>
 <div class="refsect3">
 <a name="gwy-xy-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -363,7 +395,7 @@ gwy_xy_copy (<em class="parameter"><code>const <span class="type">GwyXY</span> *
 <p>Copies Cartesian coordinates in plane.</p>
 <div class="refsect3">
 <a name="gwy-xy-copy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -392,7 +424,7 @@ gwy_xy_free (<em class="parameter"><code><span class="type">GwyXY</span> *xy</co
 <p>Frees Cartesian coordinates in plane created with <a class="link" href="libgwyddion-Math.html#gwy-xy-copy" title="gwy_xy_copy ()"><code class="function">gwy_xy_copy()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-xy-free.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -418,7 +450,7 @@ gwy_xyz_new (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibgl
 <p>This is mostly useful for language bindings.</p>
 <div class="refsect3">
 <a name="gwy-xyz-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -458,7 +490,7 @@ gwy_xyz_copy (<em class="parameter"><code>const <span class="type">GwyXYZ</span>
 <p>Copies Cartesian coordinates in space.</p>
 <div class="refsect3">
 <a name="gwy-xyz-copy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -487,7 +519,7 @@ gwy_xyz_free (<em class="parameter"><code><span class="type">GwyXYZ</span> *xyz<
 <p>Frees Cartesian coordinates in space created with <a class="link" href="libgwyddion-Math.html#gwy-xyz-copy" title="gwy_xyz_copy ()"><code class="function">gwy_xyz_copy()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-xyz-free.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -512,7 +544,7 @@ gwy_math_humanize_numbers (<em class="parameter"><code><a href="/usr/share/gtk-d
 <p>Finds a human-friendly representation for a range of numbers.</p>
 <div class="refsect3">
 <a name="gwy-math-humanize-numbers.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -560,7 +592,7 @@ can be a concave, convex or self-intersecting polygon.</p>
 is *exactly* on an edge. </div>
 <div class="refsect3">
 <a name="gwy-math-is-in-polygon.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -613,7 +645,7 @@ gwy_math_find_nearest_line (<em class="parameter"><code><a href="/usr/share/gtk-
 ).</p>
 <div class="refsect3">
 <a name="gwy-math-find-nearest-line.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -682,7 +714,7 @@ gwy_math_find_nearest_point (<em class="parameter"><code><a href="/usr/share/gtk
 ).</p>
 <div class="refsect3">
 <a name="gwy-math-find-nearest-point.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -743,7 +775,7 @@ gwy_math_lin_solve (<em class="parameter"><code><a href="/usr/share/gtk-doc/html
 <p>Solve a regular system of linear equations.</p>
 <div class="refsect3">
 <a name="gwy-math-lin-solve.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -799,7 +831,7 @@ gwy_math_lin_solve_rewrite (<em class="parameter"><code><a href="/usr/share/gtk-
  with intermediate results.</p>
 <div class="refsect3">
 <a name="gwy-math-lin-solve-rewrite.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -852,7 +884,7 @@ gwy_math_tridiag_solve_rewrite (<em class="parameter"><code><a href="/usr/share/
 <p>Solves a tridiagonal system of linear equations.</p>
 <div class="refsect3">
 <a name="gwy-math-tridiag-solve-rewrite.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -913,7 +945,7 @@ gwy_math_fit_polynom (<em class="parameter"><code><a href="/usr/share/gtk-doc/ht
 <p>Fits a polynom through a general (x, y) data set.</p>
 <div class="refsect3">
 <a name="gwy-math-fit-polynom.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -970,7 +1002,7 @@ gwy_math_choleski_decompose (<em class="parameter"><code><a href="/usr/share/gtk
 <p>Decomposes a symmetric positive definite matrix in place.</p>
 <div class="refsect3">
 <a name="gwy-math-choleski-decompose.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1013,7 +1045,7 @@ definite matrix <em class="parameter"><code>a</code></em>
 .</p>
 <div class="refsect3">
 <a name="gwy-math-choleski-solve.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1051,7 +1083,7 @@ gwy_math_choleski_invert (<em class="parameter"><code><a href="/usr/share/gtk-do
 <p>Inverts a symmetric positive definite matrix in place.</p>
 <div class="refsect3">
 <a name="gwy-math-choleski-invert.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1109,7 +1141,7 @@ Cartesian coordinates with origin in a natural centre, for instance centre
 of image or grain.</p>
 <div class="refsect3">
 <a name="gwy-math-curvature.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1168,11 +1200,55 @@ the following order: 1, x, y, x², xy, y².</p></td>
 </div>
 <hr>
 <div class="refsect2">
-<a name="gwy-math-refine-maximum"></a><h3>gwy_math_refine_maximum ()</h3>
+<a name="gwy-math-refine-maximum-1d"></a><h3>gwy_math_refine_maximum_1d ()</h3>
 <pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gwy_math_refine_maximum (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *z</code></em>,
-                         <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *x</code></em>,
-                         <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *y</code></em>);</pre>
+gwy_math_refine_maximum_1d (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *y</code></em>,
+                            <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *x</code></em>);</pre>
+<p>Performs subpixel refinement of parabolic a one-dimensional maximum.</p>
+<p>The central value corresponds to x-coordinate 0, distances between values
+are unity.  The refinement is based by fitting a parabola through the
+maximum.  If it fails or the calculated maximum lies farther than the
+surrounding values the function sets the refined maximum to the origin and
+returns <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.</p>
+<div class="refsect3">
+<a name="gwy-math-refine-maximum-1d.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>y</p></td>
+<td class="parameter_description"><p>Array of length 3, containing the neighbourhood values with the maximum
+in the centre.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>x</p></td>
+<td class="parameter_description"><p>Location to store the refined <em class="parameter"><code>x</code></em>
+-coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-math-refine-maximum-1d.returns"></a><h4>Returns</h4>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the refinement succeeded, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if it failed.  The value
+of <em class="parameter"><code>x</code></em>
+is usable regardless of the return value.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-math-refine-maximum-2d"></a><h3>gwy_math_refine_maximum_2d ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gwy_math_refine_maximum_2d (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *z</code></em>,
+                            <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *x</code></em>,
+                            <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *y</code></em>);</pre>
 <p>Performs subpixel refinement of parabolic a two-dimensional maximum.</p>
 <p>The central value corresponds to coordinates (0,0), distances between values
 are unity.  The refinement is based by fitting a two-dimensional parabola
@@ -1180,8 +1256,56 @@ through the maximum.  If it fails or the calculated maximum lies farther
 than the surrounding values the function sets the refined maximum to the
 origin and returns <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.</p>
 <div class="refsect3">
+<a name="gwy-math-refine-maximum-2d.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>z</p></td>
+<td class="parameter_description"><p>Array of length 9, containing the square 3x3 neighbourhood values in
+matrix order and with the maximum in the centre.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>x</p></td>
+<td class="parameter_description"><p>Location to store the refined <em class="parameter"><code>x</code></em>
+-coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>y</p></td>
+<td class="parameter_description"><p>Location to store the refined <em class="parameter"><code>y</code></em>
+-coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-math-refine-maximum-2d.returns"></a><h4>Returns</h4>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the refinement succeeded, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if it failed.  The values
+of <em class="parameter"><code>x</code></em>
+and <em class="parameter"><code>y</code></em>
+are usable regardless of the return value.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-math-refine-maximum"></a><h3>gwy_math_refine_maximum ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gwy_math_refine_maximum (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *z</code></em>,
+                         <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *x</code></em>,
+                         <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *y</code></em>);</pre>
+<p>Performs subpixel refinement of parabolic a two-dimensional maximum.</p>
+<p>An alias for <a class="link" href="libgwyddion-Math.html#gwy-math-refine-maximum-2d" title="gwy_math_refine_maximum_2d ()"><code class="function">gwy_math_refine_maximum_2d()</code></a>.</p>
+<div class="refsect3">
 <a name="gwy-math-refine-maximum.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1220,6 +1344,97 @@ are usable regardless of the return value.</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-check-regular-2d-grid"></a><h3>gwy_check_regular_2d_grid ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> *
+gwy_check_regular_2d_grid (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *coords</code></em>,
+                           <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> stride</code></em>,
+                           <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> n</code></em>,
+                           <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> tolerance</code></em>,
+                           <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> *xres</code></em>,
+                           <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> *yres</code></em>,
+                           <em class="parameter"><code><span class="type">GwyXY</span> *xymin</code></em>,
+                           <em class="parameter"><code><span class="type">GwyXY</span> *xystep</code></em>);</pre>
+<p>Detects if points in plane form a regular rectangular grid oriented along
+the Cartesian axes.</p>
+<p>Points lying in one straight line are not considered to form a rectangle.</p>
+<p>When the function fails, i.e. the points do not form a regular grid, the
+values of output arguments are undefined.</p>
+<div class="refsect3">
+<a name="gwy-check-regular-2d-grid.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>coords</p></td>
+<td class="parameter_description"><p>Array of <em class="parameter"><code>n</code></em>
+coordinate pairs in plane.  You can also typecast
+<span class="type">GwyXY</span> or <span class="type">GwyXYZ</span> to doubles.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>stride</p></td>
+<td class="parameter_description"><p>Actual number of double values in one block.  It must be at least
+2 if <em class="parameter"><code>coords</code></em>
+contains just alternating <em class="parameter"><code>x</code></em>
+and <em class="parameter"><code>y</code></em>
+.  If you pass an
+typecast <span class="type">GwyXYZ</span> array give stride as 3, etc.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>n</p></td>
+<td class="parameter_description"><p>Number of items in <em class="parameter"><code>coords</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>tolerance</p></td>
+<td class="parameter_description"><p>Relative distance from pixel center which is still considered
+OK.  Pass a negative value for some reasonable default.
+The maximum meaningful value is 0.5, beyond that the point would
+end up in a different pixel.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>xres</p></td>
+<td class="parameter_description"><p>Location where to store the number of columns.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>yres</p></td>
+<td class="parameter_description"><p>Location where to store the number of rows.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>xymin</p></td>
+<td class="parameter_description"><p>Location where to store the minimum coordinates (top left corner).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>xystep</p></td>
+<td class="parameter_description"><p>Location where to store the pixel size.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-check-regular-2d-grid.returns"></a><h4>Returns</h4>
+<p> On success, a newly allocated array mapping grid indices
+(<em class="parameter"><code>i</code></em>
+*<em class="parameter"><code>xres</code></em>
++<em class="parameter"><code>j</code></em>
+) to indices in <em class="parameter"><code>coords</code></em>
+.  <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> is returned on failure.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-math-median"></a><h3>gwy_math_median ()</h3>
 <pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
 gwy_math_median (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gsize"><span class="type">gsize</span></a> n</code></em>,
@@ -1227,7 +1442,7 @@ gwy_math_median (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gl
 <p>Finds median of an array of values using Quick select algorithm.</p>
 <div class="refsect3">
 <a name="gwy-math-median.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1266,7 +1481,7 @@ gwy_math_sort (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glib
 thanks to specialization for doubles.</p>
 <div class="refsect3">
 <a name="gwy-math-sort.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1313,7 +1528,7 @@ are tabulated.  For large arguments the function is evaluated using the
 standard <code class="function">log()</code> function which is of course slower.</p>
 <div class="refsect3">
 <a name="gwy-xlnx-int.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1336,6 +1551,77 @@ standard <code class="function">log()</code> function which is of course slower.
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-44.html#api-index-2.44">2.44</a></p>
 </div>
+<hr>
+<div class="refsect2">
+<a name="gwy-math-histogram"></a><h3>gwy_math_histogram ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a>
+gwy_math_histogram (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *values</code></em>,
+                    <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> n</code></em>,
+                    <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> min</code></em>,
+                    <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> max</code></em>,
+                    <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> nbins</code></em>,
+                    <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> *counts</code></em>);</pre>
+<p>Counts the numbers of values falling into equal-sized bins.</p>
+<p>The value of <em class="parameter"><code>min</code></em>
+ must not be larger than <em class="parameter"><code>max</code></em>
+.  The values may lie outside
+[<em class="parameter"><code>min</code></em>
+,<em class="parameter"><code>max</code></em>
+].  They are not counted in the histogram, nor the returned total.</p>
+<p>Rounding rules for values exactly at the edge of two bins are arbitrary
+and must not be relied upon.</p>
+<div class="refsect3">
+<a name="gwy-math-histogram.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>values</p></td>
+<td class="parameter_description"><p>Values to make histogram from.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>n</p></td>
+<td class="parameter_description"><p>Number of values in <em class="parameter"><code>values</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>min</p></td>
+<td class="parameter_description"><p>Minimum value to consider (left edge of histogram).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>max</p></td>
+<td class="parameter_description"><p>Maximum value to consider (right edge of histogram).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>nbins</p></td>
+<td class="parameter_description"><p>Number of histogram bins (number of <em class="parameter"><code>counts</code></em>
+items), a positive
+number.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>counts</p></td>
+<td class="parameter_description"><p>Array where to store the counts.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-math-histogram.returns"></a><h4>Returns</h4>
+<p> The number of values inside the entire histogram, i.e. at most <em class="parameter"><code>n</code></em>
+but possibly a reduced count.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
 </div>
 <div class="refsect1">
 <a name="libgwyddion-Math.other_details"></a><h2>Types and Values</h2>
diff --git a/devel-docs/libgwyddion/html/libgwyddion-gwyddion.html b/devel-docs/libgwyddion/html/libgwyddion-gwyddion.html
index a0d1f2b..d98e4b7 100644
--- a/devel-docs/libgwyddion/html/libgwyddion-gwyddion.html
+++ b/devel-docs/libgwyddion/html/libgwyddion-gwyddion.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwyddion: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="libgwyddion-gwymacros.html" title="gwymacros">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyddion-gwyddion.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
diff --git a/devel-docs/libgwyddion/html/libgwyddion-gwyddionenums.html b/devel-docs/libgwyddion/html/libgwyddion-gwyddionenums.html
index 51c3165..1200436 100644
--- a/devel-docs/libgwyddion/html/libgwyddion-gwyddionenums.html
+++ b/devel-docs/libgwyddion/html/libgwyddion-gwyddionenums.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwyddionenums: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="index.html" title="Gwyddion Library Reference Manual">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyddion-gwyddionenums.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -69,7 +69,7 @@
 <p>Physical quantity formatting style.</p>
 <div class="refsect3">
 <a name="GwySIUnitFormatStyle.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -126,7 +126,7 @@
 <p>Type of fitting parameter properties.</p>
 <div class="refsect3">
 <a name="GwyNLFitParamFlags.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwyddion/html/libgwyddion-gwydebugobjects.html b/devel-docs/libgwyddion/html/libgwyddion-gwydebugobjects.html
index 6327790..2a24f7c 100644
--- a/devel-docs/libgwyddion/html/libgwyddion-gwydebugobjects.html
+++ b/devel-docs/libgwyddion/html/libgwyddion-gwydebugobjects.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwydebugobjects: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="libgwyddion-gwymd5.html" title="gwymd5">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyddion-gwydebugobjects.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -82,7 +82,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyddion-gwydebugobjects.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -119,7 +119,7 @@ enable it.</p>
 <p>It uses file name and line number as the detail.</p>
 <div class="refsect3">
 <a name="gwy-debug-objects-creation.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -151,7 +151,7 @@ etc., and you usually want to catch all possible means of object creation.</p>
 rules of a particular object, he then calls it just after object creation.</p>
 <div class="refsect3">
 <a name="gwy-debug-objects-creation-detailed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -183,7 +183,7 @@ gwy_debug_objects_enable (<em class="parameter"><code><a href="http://developer.
 already watched ones is still noted.</p>
 <div class="refsect3">
 <a name="gwy-debug-objects-enable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -208,7 +208,7 @@ gwy_debug_objects_dump_to_file (<em class="parameter"><code><span class="type">F
 destruction time (or ALIVE! message with reference count).</p>
 <div class="refsect3">
 <a name="gwy-debug-objects-dump-to-file.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -246,7 +246,7 @@ the very first one, including time counting reset.</p>
 <p>Option flags for <a class="link" href="libgwyddion-gwydebugobjects.html#gwy-debug-objects-dump-to-file" title="gwy_debug_objects_dump_to_file ()"><code class="function">gwy_debug_objects_dump_to_file()</code></a>.</p>
 <div class="refsect3">
 <a name="GwyDebugObjectsDumpFlags.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwyddion/html/libgwyddion-gwyentities.html b/devel-docs/libgwyddion/html/libgwyddion-gwyentities.html
index d45d227..9758f5a 100644
--- a/devel-docs/libgwyddion/html/libgwyddion-gwyentities.html
+++ b/devel-docs/libgwyddion/html/libgwyddion-gwyentities.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwyentities: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="libgwyddion-gwyddion.html" title="gwyddion">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyddion-gwyentities.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -67,7 +67,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyddion-gwyentities.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -115,7 +115,7 @@ gwy_entities_entity_to_utf8 (<em class="parameter"><code>const <a href="http://d
 should not contain the ampersand and semicolon.</p>
 <div class="refsect3">
 <a name="gwy-entities-entity-to-utf8.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -145,7 +145,7 @@ gwy_entities_text_to_utf8 (<em class="parameter"><code>const <a href="http://dev
 <p>Converts entities in a text to UTF-8.</p>
 <div class="refsect3">
 <a name="gwy-entities-text-to-utf8.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -177,7 +177,7 @@ text.</p>
 <p>The type of text entity data.</p>
 <div class="refsect3">
 <a name="GwyTextEntity.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
diff --git a/devel-docs/libgwyddion/html/libgwyddion-gwymacros.html b/devel-docs/libgwyddion/html/libgwyddion-gwymacros.html
index e501234..3e0529f 100644
--- a/devel-docs/libgwyddion/html/libgwyddion-gwymacros.html
+++ b/devel-docs/libgwyddion/html/libgwyddion-gwymacros.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwymacros: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="GwyContainer.html" title="GwyContainer">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyddion-gwymacros.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -148,7 +148,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyddion-gwymacros.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -207,7 +207,7 @@
 in a single statement.</p>
 <div class="refsect3">
 <a name="GWY-SWAP.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -244,7 +244,7 @@ to swap with <em class="parameter"><code>y</code></em>
 <p>Expands to <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if strings are equal, to <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</p>
 <div class="refsect3">
 <a name="gwy-strequal.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -285,7 +285,7 @@ should fall to a known range but may occasionaly fail to due to rounding
 errors and in similar situations.  Under normal circumstances, use <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros.html#CLAMP:CAPS"><code class="function">CLAMP()</code></a>.</p>
 <div class="refsect3">
 <a name="GWY-CLAMP.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -320,7 +320,7 @@ errors and in similar situations.  Under normal circumstances, use <a href="http
 calculated from the type of the pointer.</p>
 <div class="refsect3">
 <a name="gwy-clear.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -356,7 +356,7 @@ calculation!)</p>
 <p>As with <code class="function">memcpy()</code>, the memory blocks may not overlap.</p>
 <div class="refsect3">
 <a name="gwy-assign.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -398,7 +398,7 @@ to the variable.  In all cases <em class="parameter"><code>obj</code></em>
 referenced elsewhere, otherwise it leaks memory.</p>
 <div class="refsect3">
 <a name="GWY-OBJECT-UNREF.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -434,7 +434,7 @@ wrong because you keep and try to disconnect a handler for a non-existent
 object.  A warning may be emitted in the future.</p>
 <div class="refsect3">
 <a name="GWY-SIGNAL-HANDLER-DISCONNECT.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -466,7 +466,7 @@ signal handler id or 0 (must be an l-value).</p></td>
 ).</p>
 <div class="refsect3">
 <a name="GWY-FIND-PSPEC.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -505,7 +505,7 @@ end.</p>
 <p>A useful property of this macro is its idempotence.</p>
 <div class="refsect3">
 <a name="GWY-SI-VALUE-FORMAT-FREE.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -534,7 +534,7 @@ variable.  In all cases <em class="parameter"><code>ptr</code></em>
 <p>A useful property of this macro is its idempotence.</p>
 <div class="refsect3">
 <a name="GWY-FREE.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -562,7 +562,7 @@ line number or time (when possible) and emitted at log level
 <p>The macro expands to nothing if compiled without DEBUG defined.</p>
 <div class="refsect3">
 <a name="gwy-debug.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -588,7 +588,7 @@ modules.</p>
 <a href="/usr/share/gtk-doc/html/glibglib-Message-Logging.html#G-LOG-LEVEL-INFO:CAPS"><code class="literal">G_LOG_LEVEL_INFO</code></a> messages but the default Gwyddion handler does not.</p>
 <div class="refsect3">
 <a name="gwy-info.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -616,7 +616,7 @@ gwy_debug_gnu (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/htm
 <p>To be used via <a class="link" href="libgwyddion-gwymacros.html#gwy-debug" title="gwy_debug()"><code class="function">gwy_debug()</code></a>, should not be used directly.</p>
 <div class="refsect3">
 <a name="gwy-debug-gnu.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -663,7 +663,7 @@ gwy_debug_gnu (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/htm
 <p>Legacy name for <a class="link" href="libgwyddion-gwymacros.html#GWY-OBJECT-UNREF:CAPS" title="GWY_OBJECT_UNREF()"><code class="literal">GWY_OBJECT_UNREF</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-object-unref.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -686,7 +686,7 @@ gwy_debug_gnu (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/htm
 <p>Legacy name for <a class="link" href="libgwyddion-gwymacros.html#GWY-SIGNAL-HANDLER-DISCONNECT:CAPS" title="GWY_SIGNAL_HANDLER_DISCONNECT()"><code class="literal">GWY_SIGNAL_HANDLER_DISCONNECT</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-signal-handler-disconnect.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyddion/html/libgwyddion-gwymd5.html b/devel-docs/libgwyddion/html/libgwyddion-gwymd5.html
index 4a948f6..e2726e2 100644
--- a/devel-docs/libgwyddion/html/libgwyddion-gwymd5.html
+++ b/devel-docs/libgwyddion/html/libgwyddion-gwymd5.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwymd5: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="GwyStringList.html" title="GwyStringList">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyddion-gwymd5.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -74,7 +74,7 @@ produces as output a 128-bit "fingerprint" or "message digest" of
 the input.  For more information see RFC 1321.</p>
 <div class="refsect3">
 <a name="gwy-md5-get-digest.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyddion/html/libgwyddion-gwyutils.html b/devel-docs/libgwyddion/html/libgwyddion-gwyutils.html
index 11b82a4..16e148b 100644
--- a/devel-docs/libgwyddion/html/libgwyddion-gwyutils.html
+++ b/devel-docs/libgwyddion/html/libgwyddion-gwyutils.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwyutils: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="libgwyddion-GwySIValueFormat.html" title="GwySIValueFormat">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyddion-gwyutils.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -255,6 +255,14 @@
 </tr>
 <tr>
 <td class="function_type">
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="libgwyddion-gwyutils.html#gwy-set-member-object" title="gwy_set_member_object ()">gwy_set_member_object</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">FILE</span> *
 </td>
 <td class="function_name">
@@ -274,7 +282,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyddion-gwyutils.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -313,7 +321,7 @@ manipulation (<a class="link" href="libgwyddion-gwyutils.html#gwy-canonicalize-p
 <p>Usually you want to use <a href="../libgwyapp-wait.html#gwy-app-wait-set-fraction"><code class="function">gwy_app_wait_set_fraction()</code></a>.</p>
 <div class="refsect3">
 <a name="GwySetFractionFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -341,7 +349,7 @@ cancelled.</p>
 <p>Usually you want to use <a href="../libgwyapp-wait.html#gwy-app-wait-set-message"><code class="function">gwy_app_wait_set_message()</code></a>.</p>
 <div class="refsect3">
 <a name="GwySetMessageFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -374,7 +382,7 @@ gwy_hash_table_to_slist_cb (<em class="parameter"><code><a href="/usr/share/gtk-
 data to it.</p>
 <div class="refsect3">
 <a name="gwy-hash-table-to-slist-cb.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -412,7 +420,7 @@ gwy_hash_table_to_list_cb (<em class="parameter"><code><a href="/usr/share/gtk-d
 data to it.</p>
 <div class="refsect3">
 <a name="gwy-hash-table-to-list-cb.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -452,7 +460,7 @@ gwy_strkill (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibgl
 ) to get a modified copy.</p>
 <div class="refsect3">
 <a name="gwy-strkill.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -494,7 +502,7 @@ gwy_strreplace (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/ht
 on a <a href="/usr/share/gtk-doc/html/glibglib-Strings.html#GString"><span class="type">GString</span></a>.</p>
 <div class="refsect3">
 <a name="gwy-strreplace.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -540,7 +548,7 @@ gwy_strdiffpos (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/ht
 <p>Finds position where two strings differ.</p>
 <div class="refsect3">
 <a name="gwy-strdiffpos.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -586,7 +594,7 @@ and/or <em class="parameter"><code>startmore</code></em>
 .</p>
 <div class="refsect3">
 <a name="gwy-strisident.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -633,7 +641,7 @@ gwy_ascii_strcase_equal (<em class="parameter"><code><a href="/usr/share/gtk-doc
 function.</p>
 <div class="refsect3">
 <a name="gwy-ascii-strcase-equal.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -672,7 +680,7 @@ gwy_ascii_strcase_hash (<em class="parameter"><code><a href="/usr/share/gtk-doc/
 namely in conjuction with <a class="link" href="libgwyddion-gwyutils.html#gwy-ascii-strcase-equal" title="gwy_ascii_strcase_equal ()"><code class="function">gwy_ascii_strcase_equal()</code></a> comparison function.</p>
 <div class="refsect3">
 <a name="gwy-ascii-strcase-hash.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -701,7 +709,7 @@ gwy_stramong (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html
 <p>Checks whether a string is equal to any from given list.</p>
 <div class="refsect3">
 <a name="gwy-stramong.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -750,7 +758,7 @@ arbitrary memory blocks instead of NUL-terminated strings.</p>
 wrapper.  On other systems it emulates <code class="function">memmem()</code> behaviour.</p>
 <div class="refsect3">
 <a name="gwy-memmem.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -807,7 +815,7 @@ use <em class="parameter"><code>size</code></em>
  to find its end.</p>
 <div class="refsect3">
 <a name="gwy-file-get-contents.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -855,7 +863,7 @@ gwy_file_abandon_contents (<em class="parameter"><code><a href="/usr/share/gtk-d
 <p>Frees or unmmaps memory allocated by <a class="link" href="libgwyddion-gwyutils.html#gwy-file-get-contents" title="gwy_file_get_contents ()"><code class="function">gwy_file_get_contents()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-file-abandon-contents.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -901,7 +909,7 @@ directories is calculated from it.</p>
 <p>To obtain the Gwyddion user directory see <a class="link" href="libgwyddion-gwyutils.html#gwy-get-user-dir" title="gwy_get_user_dir ()"><code class="function">gwy_get_user_dir()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-find-self-dir.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -968,7 +976,7 @@ backslashes to slashes along the way.</p>
 that.</p>
 <div class="refsect3">
 <a name="gwy-canonicalize-path.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -997,7 +1005,7 @@ be normally ignored.  Currently it means backup files (ending with ~ or
 .bak) and Unix hidden files (starting with a dot).</p>
 <div class="refsect3">
 <a name="gwy-filename-ignore.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1023,7 +1031,7 @@ gwy_sgettext (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html
 <p>Translate a message id containing disambiguating prefix ending with `|'.</p>
 <div class="refsect3">
 <a name="gwy-sgettext.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1083,7 +1091,7 @@ returned.</p>
 <p></p>
 <div class="refsect3">
 <a name="gwy-str-next-line.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1127,7 +1135,7 @@ will be inserted at every position in this case.</p>
 substring replacement.</p>
 <div class="refsect3">
 <a name="gwy-gstring-replace.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1184,7 +1192,7 @@ automatically.</p>
 actually performs any conversion at all only on MS Windows.</p>
 <div class="refsect3">
 <a name="gwy-gstring-to-native-eol.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1221,7 +1229,7 @@ More generally, if you want to reverse byte order in groups of size
  is zero, this function reduces to plain <code class="function">memcpy()</code>.</p>
 <div class="refsect3">
 <a name="gwy-memcpy-byte-swap.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1277,7 +1285,7 @@ have more bits than the mantissa of doubles.  All other conversions should
 be precise.</p>
 <div class="refsect3">
 <a name="gwy-convert-raw-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1345,7 +1353,7 @@ gwy_raw_data_size (<em class="parameter"><code><a class="link" href="libgwyddion
 <p>Reports the size of a single raw data item.</p>
 <div class="refsect3">
 <a name="gwy-raw-data-size.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1387,7 +1395,7 @@ requested value, as a consequences notifications are emitted only for
 properties which actually change.</p>
 <div class="refsect3">
 <a name="gwy-object-set-or-reset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1421,6 +1429,140 @@ to defaults.</p></td>
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-set-member-object"></a><h3>gwy_set_member_object ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gwy_set_member_object (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> instance</code></em>,
+                       <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> member_object</code></em>,
+                       <em class="parameter"><code><a href="/usr/share/gtk-doc/html/gobjectgobject-Type-Information.html#GType"><span class="type">GType</span></a> expected_type</code></em>,
+                       <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> member_field</code></em>,
+                       <em class="parameter"><code>...</code></em>);</pre>
+<p>Replaces a member object of another object, handling signal connection and
+disconnection.</p>
+<p>If <em class="parameter"><code>member_object</code></em>
+ is not <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> a reference is taken, sinking any floating
+objects (and conversely, the reference to the previous member object is
+released).</p>
+<p>The purpose is to simplify bookkeeping in classes that have settable
+member objects and (usually but not necessarily) need to connect to some
+signals of these member objects.  Since this function both connects and
+disconnects signals it must be always called with the same set of signals,
+including callbacks and flags, for a specific member object.</p>
+<p>Example for a <span class="type">GwyFoo</span> class owning a <a href="../GwyGradient.html#GwyGradient-struct"><span class="type">GwyGradient</span></a> member object,
+assuming the usual conventions:</p>
+<div class="informalexample">
+  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+    <tbody>
+      <tr>
+        <td class="listing_lines" align="right"><pre>1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23</pre></td>
+        <td class="listing_code"><pre class="programlisting"><span class="keyword">typedef</span><span class="normal"> </span><span class="keyword">struct</span><span class="normal"> </span><span class="classname">_GwyFooPrivate</span><span class="normal"> GwyFooPrivate</span><span class="symbol">;</span>
+
+<span class="keyword">struct</span><span class="normal"> </span><span class="classname">_GwyFooPrivate</span><span class="normal"> </span><span class="cbracket">{</span>
+<span class="normal">    </span><span class="usertype">GwyGradient</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">gradient</span><span class="symbol">;</span>
+<span class="normal">    </span><span class="usertype">gulong</span><span class="normal"> gradient_data_changed_id</span><span class="symbol">;</span>
+<span class="cbracket">}</span><span class="symbol">;</span>
+
+<span class="keyword">static</span><span class="normal"> <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean">gboolean</a></span>
+<span class="function">set_gradient</span><span class="symbol">(</span><span class="usertype">GwyFoo</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">foo</span><span class="symbol">)</span>
+<span class="cbracket">{</span>
+<span class="normal">    </span><span class="usertype">GwyFooPrivate</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">priv </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-Type-Information.html#G-TYPE-INSTANCE-GET-PRIVATE:CAPS">G_TYPE_INSTANCE_GET_PRIVATE</a></span><span class="symbol">(</span><span class="normal">foo</span><span class="symbol">,</span><span class="n [...]
+<span class="normal">                                                      GwyFooPrivate</span><span class="symbol">);</span>
+<span class="normal">    </span><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(!</span><span class="function"><a href="#gwy-set-member-object">gwy_set_member_object</a></span><span class="symbol">(</span><span class="normal">foo</span><span class="symbol">,</span><span class="normal"> gradient</span><span class="symbol">,</span><span class="normal"> GWY_TYPE_GRADIENT</span><span class="symbol">,</span>
+<span class="normal">                               </span><span class="symbol">&</span><span class="normal">priv</span><span class="symbol">-></span><span class="normal">gradient</span><span class="symbol">,</span>
+<span class="normal">                               </span><span class="string">"data-changed"</span><span class="symbol">,</span><span class="normal"> </span><span class="symbol">&</span><span class="normal">foo_gradient_data_changed</span><span class="symbol">,</span>
+<span class="normal">                               </span><span class="symbol">&</span><span class="normal">priv</span><span class="symbol">-></span><span class="normal">gradient_data_changed_id</span><span class="symbol">,</span>
+<span class="normal">                               <a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-CONNECT-SWAPPED:CAPS">G_CONNECT_SWAPPED</a></span><span class="symbol">,</span>
+<span class="normal">                               <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">))</span>
+<span class="normal">        </span><span class="keyword">return</span><span class="normal"> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS">FALSE</a></span><span class="symbol">;</span>
+
+<span class="normal">    </span><span class="comment">// Do whatever else needs to be done if the gradient changes.</span>
+<span class="normal">    </span><span class="keyword">return</span><span class="normal"> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS">TRUE</a></span><span class="symbol">;</span>
+<span class="cbracket">}</span></pre></td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+
+<p>
+The gradient setter then usually only calls
+<code class="function"><code class="function">set_gradient()</code></code> and disposing of the member object again
+only calls <code class="function"><code class="function">set_gradient()</code></code> but with <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> gradient.</p>
+<div class="refsect3">
+<a name="gwy-set-member-object.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>instance</p></td>
+<td class="parameter_description"><p>An object instance.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>member_object</p></td>
+<td class="parameter_description"><p>Another object to be owned by <em class="parameter"><code>instanced</code></em>
+, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>expected_type</p></td>
+<td class="parameter_description"><p>The type of <em class="parameter"><code>member_object</code></em>
+.  It is checked and a critical
+message is emitted if it does not conform.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>member_field</p></td>
+<td class="parameter_description"><p>Pointer to location storing the current member object to
+be replaced by <em class="parameter"><code>member_object</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>...</p></td>
+<td class="parameter_description"><p>List of quadruplets of the form signal name, <a href="/usr/share/gtk-doc/html/gobjectgobject-Closures.html#GCallback"><span class="type">GCallback</span></a> callback,
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gulong"><span class="type">gulong</span></a> pointer to location to hold the signal handler id, and
+<a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#GConnectFlags"><span class="type">GConnectFlags</span></a> connection flags.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-set-member-object.returns"></a><h4>Returns</h4>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>member_field</code></em>
+was changed.  <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> means the new
+member is identical to the current one and the function reduced to
+no-op (or that an assertion faled).</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-fopen"></a><h3>gwy_fopen ()</h3>
 <pre class="programlisting"><span class="returnvalue">FILE</span> *
 gwy_fopen (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *filename</code></em>,
@@ -1436,7 +1578,7 @@ functions like <code class="function">fprintf()</code> or <code class="function"
 <p>See your C library manual for more details about <code class="function">fopen()</code>.</p>
 <div class="refsect3">
 <a name="gwy-fopen.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1474,7 +1616,7 @@ gwy_fprintf (<em class="parameter"><code><span class="type">FILE</span> *file</c
 positional parameters, as specified in the Single Unix Specification.</p>
 <div class="refsect3">
 <a name="gwy-fprintf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1519,7 +1661,7 @@ pitfalls</GTKDOCLINK>
 full type specification.</p>
 <div class="refsect3">
 <a name="GwyRawDataType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -1621,7 +1763,7 @@ full type specification.</p>
 <p>Type of byte order.</p>
 <div class="refsect3">
 <a name="GwyByteOrder.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwyddion/html/libgwyddion-gwyversion.html b/devel-docs/libgwyddion/html/libgwyddion-gwyversion.html
index 3781f0a..ff5858e 100644
--- a/devel-docs/libgwyddion/html/libgwyddion-gwyversion.html
+++ b/devel-docs/libgwyddion/html/libgwyddion-gwyversion.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwyversion: Gwyddion Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Library Reference Manual">
 <link rel="prev" href="libgwyddion-gwyutils.html" title="gwyutils">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyddion-gwyversion.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -67,7 +67,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyddion-gwyversion.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -158,7 +158,7 @@ runs with.</p>
 <hr>
 <div class="refsect2">
 <a name="GWY-VERSION-MINOR:CAPS"></a><h3>GWY_VERSION_MINOR</h3>
-<pre class="programlisting">#define GWY_VERSION_MINOR 47
+<pre class="programlisting">#define GWY_VERSION_MINOR 49
 </pre>
 <p>Expands to the minor version of Gwyddion as a number.</p>
 <p>If the version is 1.99.7.20060604, this macro is defined as 99.</p>
@@ -166,7 +166,7 @@ runs with.</p>
 <hr>
 <div class="refsect2">
 <a name="GWY-VERSION-STRING:CAPS"></a><h3>GWY_VERSION_STRING</h3>
-<pre class="programlisting">#define GWY_VERSION_STRING "2.47"
+<pre class="programlisting">#define GWY_VERSION_STRING "2.49"
 </pre>
 <p>Expands to the full Gwyddion version as a string.</p>
 <p>If the version is 1.99.7.20060604, this macro is defined as
diff --git a/devel-docs/libgwyddion/html/libgwyddion.devhelp2 b/devel-docs/libgwyddion/html/libgwyddion.devhelp2
index 8e43d16..b2f5c00 100644
--- a/devel-docs/libgwyddion/html/libgwyddion.devhelp2
+++ b/devel-docs/libgwyddion/html/libgwyddion.devhelp2
@@ -48,6 +48,8 @@
     <sub name="Index of new symbols in 2.45" link="api-index-2-45.html"/>
     <sub name="Index of new symbols in 2.46" link="api-index-2-46.html"/>
     <sub name="Index of new symbols in 2.47" link="api-index-2-47.html"/>
+    <sub name="Index of new symbols in 2.48" link="api-index-2-48.html"/>
+    <sub name="Index of new symbols in 2.49" link="api-index-2-49.html"/>
   </chapters>
   <functions>
     <keyword type="enum" name="enum GwySIUnitFormatStyle" link="libgwyddion-gwyddionenums.html#GwySIUnitFormatStyle"/>
@@ -82,6 +84,7 @@
     <keyword type="function" name="gwy_container_remove ()" link="GwyContainer.html#gwy-container-remove"/>
     <keyword type="function" name="gwy_container_remove_by_prefix ()" link="GwyContainer.html#gwy-container-remove-by-prefix"/>
     <keyword type="function" name="gwy_container_duplicate_by_prefix ()" link="GwyContainer.html#gwy-container-duplicate-by-prefix"/>
+    <keyword type="function" name="gwy_container_duplicate_by_prefixv ()" link="GwyContainer.html#gwy-container-duplicate-by-prefixv" since="2.48"/>
     <keyword type="function" name="gwy_container_transfer ()" link="GwyContainer.html#gwy-container-transfer"/>
     <keyword type="function" name="gwy_container_rename ()" link="GwyContainer.html#gwy-container-rename"/>
     <keyword type="function" name="gwy_container_foreach ()" link="GwyContainer.html#gwy-container-foreach"/>
@@ -194,11 +197,15 @@
     <keyword type="function" name="gwy_math_choleski_solve ()" link="libgwyddion-Math.html#gwy-math-choleski-solve"/>
     <keyword type="function" name="gwy_math_choleski_invert ()" link="libgwyddion-Math.html#gwy-math-choleski-invert" since="2.46"/>
     <keyword type="function" name="gwy_math_curvature ()" link="libgwyddion-Math.html#gwy-math-curvature" since="2.22"/>
+    <keyword type="function" name="gwy_math_refine_maximum_1d ()" link="libgwyddion-Math.html#gwy-math-refine-maximum-1d" since="2.49"/>
+    <keyword type="function" name="gwy_math_refine_maximum_2d ()" link="libgwyddion-Math.html#gwy-math-refine-maximum-2d" since="2.49"/>
     <keyword type="function" name="gwy_math_refine_maximum ()" link="libgwyddion-Math.html#gwy-math-refine-maximum" since="2.42"/>
+    <keyword type="function" name="gwy_check_regular_2d_grid ()" link="libgwyddion-Math.html#gwy-check-regular-2d-grid" since="2.48"/>
     <keyword type="function" name="gwy_math_median ()" link="libgwyddion-Math.html#gwy-math-median"/>
     <keyword type="function" name="gwy_math_sort ()" link="libgwyddion-Math.html#gwy-math-sort"/>
     <keyword type="function" name="gwy_math_median_uncertainty ()" link="libgwyddion-Math.html#gwy-math-median-uncertainty"/>
     <keyword type="function" name="gwy_xlnx_int ()" link="libgwyddion-Math.html#gwy-xlnx-int" since="2.44"/>
+    <keyword type="function" name="gwy_math_histogram ()" link="libgwyddion-Math.html#gwy-math-histogram" since="2.49"/>
     <keyword type="macro" name="GWY_SQRT3" link="libgwyddion-Math.html#GWY-SQRT3:CAPS"/>
     <keyword type="macro" name="GWY_SQRT_PI" link="libgwyddion-Math.html#GWY-SQRT-PI:CAPS"/>
     <keyword type="function" name="gwy_math_fallback_pow10 ()" link="libgwyddion-Math-Fallback.html#gwy-math-fallback-pow10" since="2.9"/>
@@ -288,6 +295,7 @@
     <keyword type="function" name="gwy_si_unit_nth_root ()" link="GwySIUnit.html#gwy-si-unit-nth-root" since="2.5"/>
     <keyword type="function" name="gwy_si_unit_power_multiply ()" link="GwySIUnit.html#gwy-si-unit-power-multiply" since="2.4"/>
     <keyword type="function" name="gwy_si_unit_equal ()" link="GwySIUnit.html#gwy-si-unit-equal"/>
+    <keyword type="function" name="gwy_si_unit_equal_string ()" link="GwySIUnit.html#gwy-si-unit-equal-string" since="2.49"/>
     <keyword type="function" name="gwy_si_unit_get_format ()" link="GwySIUnit.html#gwy-si-unit-get-format"/>
     <keyword type="function" name="gwy_si_unit_get_format_for_power10 ()" link="GwySIUnit.html#gwy-si-unit-get-format-for-power10"/>
     <keyword type="function" name="gwy_si_unit_get_format_with_resolution ()" link="GwySIUnit.html#gwy-si-unit-get-format-with-resolution"/>
@@ -327,6 +335,7 @@
     <keyword type="function" name="gwy_convert_raw_data ()" link="libgwyddion-gwyutils.html#gwy-convert-raw-data" since="2.25"/>
     <keyword type="function" name="gwy_raw_data_size ()" link="libgwyddion-gwyutils.html#gwy-raw-data-size" since="2.25"/>
     <keyword type="function" name="gwy_object_set_or_reset ()" link="libgwyddion-gwyutils.html#gwy-object-set-or-reset"/>
+    <keyword type="function" name="gwy_set_member_object ()" link="libgwyddion-gwyutils.html#gwy-set-member-object" since="2.49"/>
     <keyword type="function" name="gwy_fopen ()" link="libgwyddion-gwyutils.html#gwy-fopen" since="2.43"/>
     <keyword type="function" name="gwy_fprintf ()" link="libgwyddion-gwyutils.html#gwy-fprintf" since="2.43"/>
     <keyword type="enum" name="enum GwyRawDataType" link="libgwyddion-gwyutils.html#GwyRawDataType" since="2.25"/>
diff --git a/devel-docs/libgwyddion/libgwyddion-docs.sgml b/devel-docs/libgwyddion/libgwyddion-docs.sgml
index e88c7cd..056f292 100644
--- a/devel-docs/libgwyddion/libgwyddion-docs.sgml
+++ b/devel-docs/libgwyddion/libgwyddion-docs.sgml
@@ -39,97 +39,105 @@
     <title>Index of all symbols</title>
     <xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-deprec" role="deprecated">
+  <index id="api-index-deprec">
     <title>Index of deprecated symbols</title>
     <xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-1" role="2.1">
+  <index id="api-index-2-1">
     <title>Index of new symbols in 2.1</title>
     <xi:include href="xml/api-index-2.1.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-4" role="2.4">
+  <index id="api-index-2-4">
     <title>Index of new symbols in 2.4</title>
     <xi:include href="xml/api-index-2.4.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-5" role="2.5">
+  <index id="api-index-2-5">
     <title>Index of new symbols in 2.5</title>
     <xi:include href="xml/api-index-2.5.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-7" role="2.7">
+  <index id="api-index-2-7">
     <title>Index of new symbols in 2.7</title>
     <xi:include href="xml/api-index-2.7.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-8" role="2.8">
+  <index id="api-index-2-8">
     <title>Index of new symbols in 2.8</title>
     <xi:include href="xml/api-index-2.8.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-9" role="2.9">
+  <index id="api-index-2-9">
     <title>Index of new symbols in 2.9</title>
     <xi:include href="xml/api-index-2.9.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-11" role="2.11">
+  <index id="api-index-2-11">
     <title>Index of new symbols in 2.11</title>
     <xi:include href="xml/api-index-2.11.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-12" role="2.12">
+  <index id="api-index-2-12">
     <title>Index of new symbols in 2.12</title>
     <xi:include href="xml/api-index-2.12.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-22" role="2.22">
+  <index id="api-index-2-22">
     <title>Index of new symbols in 2.22</title>
     <xi:include href="xml/api-index-2.22.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-25" role="2.25">
+  <index id="api-index-2-25">
     <title>Index of new symbols in 2.25</title>
     <xi:include href="xml/api-index-2.25.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-26" role="2.26">
+  <index id="api-index-2-26">
     <title>Index of new symbols in 2.26</title>
     <xi:include href="xml/api-index-2.26.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-35" role="2.35">
+  <index id="api-index-2-35">
     <title>Index of new symbols in 2.35</title>
     <xi:include href="xml/api-index-2.35.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-36" role="2.36">
+  <index id="api-index-2-36">
     <title>Index of new symbols in 2.36</title>
     <xi:include href="xml/api-index-2.36.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-37" role="2.37">
+  <index id="api-index-2-37">
     <title>Index of new symbols in 2.37</title>
     <xi:include href="xml/api-index-2.37.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-38" role="2.38">
+  <index id="api-index-2-38">
     <title>Index of new symbols in 2.38</title>
     <xi:include href="xml/api-index-2.38.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-39" role="2.39">
+  <index id="api-index-2-39">
     <title>Index of new symbols in 2.39</title>
     <xi:include href="xml/api-index-2.39.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-42" role="2.42">
+  <index id="api-index-2-42">
     <title>Index of new symbols in 2.42</title>
     <xi:include href="xml/api-index-2.42.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-43" role="2.43">
+  <index id="api-index-2-43">
     <title>Index of new symbols in 2.43</title>
     <xi:include href="xml/api-index-2.43.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-44" role="2.44">
+  <index id="api-index-2-44">
     <title>Index of new symbols in 2.44</title>
     <xi:include href="xml/api-index-2.44.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-45" role="2.45">
+  <index id="api-index-2-45">
     <title>Index of new symbols in 2.45</title>
     <xi:include href="xml/api-index-2.45.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-46" role="2.46">
+  <index id="api-index-2-46">
     <title>Index of new symbols in 2.46</title>
     <xi:include href="xml/api-index-2.46.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-47" role="2.47">
+  <index id="api-index-2-47">
     <title>Index of new symbols in 2.47</title>
     <xi:include href="xml/api-index-2.47.xml"><xi:fallback /></xi:include>
   </index>
+  <index id="api-index-2-48">
+    <title>Index of new symbols in 2.48</title>
+    <xi:include href="xml/api-index-2.48.xml"><xi:fallback /></xi:include>
+  </index>
+  <index id="api-index-2-49">
+    <title>Index of new symbols in 2.49</title>
+    <xi:include href="xml/api-index-2.49.xml"><xi:fallback /></xi:include>
+  </index>
   <!-- API INDICES END -->
 </book>
diff --git a/devel-docs/libgwydgets/Makefile.in b/devel-docs/libgwydgets/Makefile.in
index dea81c0..9c9836f 100644
--- a/devel-docs/libgwydgets/Makefile.in
+++ b/devel-docs/libgwydgets/Makefile.in
@@ -178,10 +178,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -191,6 +188,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -215,7 +214,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -273,6 +274,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -281,17 +283,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/devel-docs/libgwydgets/html/DataWindowWidgets.html b/devel-docs/libgwydgets/html/DataWindowWidgets.html
index ecf50ce..0df4df0 100644
--- a/devel-docs/libgwydgets/html/DataWindowWidgets.html
+++ b/devel-docs/libgwydgets/html/DataWindowWidgets.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Data Windows and Views: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="index.html" title="Gwyddion Widgets Library Reference Manual">
diff --git a/devel-docs/libgwydgets/html/GeneralWidgets.html b/devel-docs/libgwydgets/html/GeneralWidgets.html
index 32f5cb6..3f66128 100644
--- a/devel-docs/libgwydgets/html/GeneralWidgets.html
+++ b/devel-docs/libgwydgets/html/GeneralWidgets.html
@@ -3,11 +3,11 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>General Widgets: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="Gwy3DLabel.html" title="Gwy3DLabel">
-<link rel="next" href="GwyColorButton.html" title="GwyColorButton">
+<link rel="next" href="GwyAdjustBar.html" title="GwyAdjustBar">
 <meta name="generator" content="GTK-Doc V1.19 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -17,13 +17,16 @@
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
 <td><a accesskey="p" href="Gwy3DLabel.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="GwyColorButton.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="GwyAdjustBar.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="chapter">
 <div class="titlepage"><div><div><h1 class="title">
 <a name="GeneralWidgets"></a>General Widgets</h1></div></div></div>
 <div class="toc"><dl class="toc">
 <dt>
+<span class="refentrytitle"><a href="GwyAdjustBar.html">GwyAdjustBar</a></span><span class="refpurpose"> — Compact adjustment visualisation and modification</span>
+</dt>
+<dt>
 <span class="refentrytitle"><a href="GwyColorButton.html">GwyColorButton</a></span><span class="refpurpose"> — A color displaying button</span>
 </dt>
 <dt>
diff --git a/devel-docs/libgwydgets/html/GraphWidgets.html b/devel-docs/libgwydgets/html/GraphWidgets.html
index 5c866dd..b8b3d6f 100644
--- a/devel-docs/libgwydgets/html/GraphWidgets.html
+++ b/devel-docs/libgwydgets/html/GraphWidgets.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Graphs: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="standard-vector-layers.html" title="Standard Vector Layers">
diff --git a/devel-docs/libgwydgets/html/Gwy3DLabel.html b/devel-docs/libgwydgets/html/Gwy3DLabel.html
index a13a6ac..78e5b72 100644
--- a/devel-docs/libgwydgets/html/Gwy3DLabel.html
+++ b/devel-docs/libgwydgets/html/Gwy3DLabel.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Gwy3DLabel: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="Widgets3D.html" title="3D Widgets">
 <link rel="prev" href="Gwy3DSetup.html" title="Gwy3DSetup">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="Gwy3DLabel.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -102,7 +102,7 @@
 </div>
 <div class="refsect1">
 <a name="Gwy3DLabel.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -151,7 +151,7 @@
 </div>
 <div class="refsect1">
 <a name="Gwy3DLabel.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -197,7 +197,7 @@ gwy_3d_label_new (<em class="parameter"><code>const <a href="http://developer.gn
 <p>Creates a new 3D view label.</p>
 <div class="refsect3">
 <a name="gwy-3d-label-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -224,7 +224,7 @@ gwy_3d_label_set_text (<em class="parameter"><code><a class="link" href="Gwy3DLa
 <p>Sets the text of a 3D label.</p>
 <div class="refsect3">
 <a name="gwy-3d-label-set-text.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -253,7 +253,7 @@ gwy_3d_label_get_text (<em class="parameter"><code><a class="link" href="Gwy3DLa
 <p>Gets the text of a 3D label.</p>
 <div class="refsect3">
 <a name="gwy-3d-label-get-text.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -281,7 +281,7 @@ gwy_3d_label_expand_text (<em class="parameter"><code><a class="link" href="Gwy3
 <p>Substitutes variables in label text.</p>
 <div class="refsect3">
 <a name="gwy-3d-label-expand-text.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -316,7 +316,7 @@ gwy_3d_label_reset (<em class="parameter"><code><a class="link" href="Gwy3DLabel
 <p>Resets all 3D label properties and text to default values.</p>
 <div class="refsect3">
 <a name="gwy-3d-label-reset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -338,7 +338,7 @@ gwy_3d_label_reset_text (<em class="parameter"><code><a class="link" href="Gwy3D
 <p>Resets 3D label text to default values.</p>
 <div class="refsect3">
 <a name="gwy-3d-label-reset-text.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -364,7 +364,7 @@ Otherwise label size is changed and <em class="parameter"><code>user_size</code>
  itself is returned.</p>
 <div class="refsect3">
 <a name="gwy-3d-label-user-size.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/Gwy3DSetup.html b/devel-docs/libgwydgets/html/Gwy3DSetup.html
index 7b90aec..8b6f3ca 100644
--- a/devel-docs/libgwydgets/html/Gwy3DSetup.html
+++ b/devel-docs/libgwydgets/html/Gwy3DSetup.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Gwy3DSetup: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="Widgets3D.html" title="3D Widgets">
 <link rel="prev" href="Gwy3DWindow.html" title="Gwy3DWindow">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="Gwy3DSetup.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -53,7 +53,7 @@
 </div>
 <div class="refsect1">
 <a name="Gwy3DSetup.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -67,10 +67,25 @@
 </tr>
 <tr>
 <td class="property_type"><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="Gwy3DSetup.html#Gwy3DSetup--fmscale-reserve-space" title="The “fmscale-reserve-space” property">fmscale-reserve-space</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="Gwy3DSetup.html#Gwy3DSetup--fmscale-size" title="The “fmscale-size” property">fmscale-size</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
 <td class="property_name"><a class="link" href="Gwy3DSetup.html#Gwy3DSetup--fmscale-visible" title="The “fmscale-visible” property">fmscale-visible</a></td>
 <td class="property_flags">Read / Write</td>
 </tr>
 <tr>
+<td class="property_type"><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="Gwy3DSetup.html#Gwy3DSetup--fmscale-y-align" title="The “fmscale-y-align” property">fmscale-y-align</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
 <td class="property_type"><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
 <td class="property_name"><a class="link" href="Gwy3DSetup.html#Gwy3DSetup--hide-masked" title="The “hide-masked” property">hide-masked</a></td>
 <td class="property_flags">Read / Write</td>
@@ -130,7 +145,7 @@
 </div>
 <div class="refsect1">
 <a name="Gwy3DSetup.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -169,7 +184,7 @@ Gwy3DSetup implements
 <p><a class="link" href="Gwy3DSetup.html" title="Gwy3DSetup"><span class="type">Gwy3DSetup</span></a> represents a basic 3D scene setup: viewpoint, projection, light,
 scale, etc.  It is serializable and used to represent the <a class="link" href="Gwy3DView.html" title="Gwy3DView"><span class="type">Gwy3DView</span></a> setup.</p>
 <p>Its components can be read directly in the struct or generically with
-<a href="http://developer.gnome.org/doc/API/2.0/gtk/gobjectgobject-The-Base-Object-Type.html#g-object-get"><code class="function">g_object_get()</code></a>.  To set them you it is necessary to use <a href="http://developer.gnome.org/doc/API/2.0/gtk/gobjectgobject-The-Base-Object-Type.html#g-object-set"><code class="function">g_object_set()</code></a>.</p>
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/gobjectgobject-The-Base-Object-Type.html#g-object-get"><code class="function">g_object_get()</code></a>.  To set them you it is necessary to use <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#g-object-set"><code class="function">g_object_set()</code></a>.</p>
 </div>
 <div class="refsect1">
 <a name="Gwy3DSetup.functions_details"></a><h2>Functions</h2>
@@ -206,21 +221,50 @@ gwy_3d_setup_new (<em class="parameter"><code><span class="type">void</span></co
 <a name="Gwy3DSetup.property-details"></a><h2>Property Details</h2>
 <div class="refsect2">
 <a name="Gwy3DSetup--axes-visible"></a><h3>The <code class="literal">“axes-visible”</code> property</h3>
-<pre class="programlisting">  “axes-visible”             <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<pre class="programlisting">  “axes-visible”             <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
 <p>Whether axes are visible.</p>
 <p>Flags: Read / Write</p>
 <p>Default value: TRUE</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="Gwy3DSetup--fmscale-reserve-space"></a><h3>The <code class="literal">“fmscale-reserve-space”</code> property</h3>
+<pre class="programlisting">  “fmscale-reserve-space”    <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Whethere to reserve entire vertical stripe of the false colour scale.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: TRUE</p>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="Gwy3DSetup--fmscale-size"></a><h3>The <code class="literal">“fmscale-size”</code> property</h3>
+<pre class="programlisting">  “fmscale-size”             <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>Size of false colour scale relative to view height.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,1]</p>
+<p>Default value: 1</p>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="Gwy3DSetup--fmscale-visible"></a><h3>The <code class="literal">“fmscale-visible”</code> property</h3>
-<pre class="programlisting">  “fmscale-visible”          <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
-<p>Whether false color bar is visible .</p>
+<pre class="programlisting">  “fmscale-visible”          <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Whether false color bar is visible.</p>
 <p>Flags: Read / Write</p>
 <p>Default value: FALSE</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="Gwy3DSetup--fmscale-y-align"></a><h3>The <code class="literal">“fmscale-y-align”</code> property</h3>
+<pre class="programlisting">  “fmscale-y-align”          <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>Vertical alignment of false colour scale.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,1]</p>
+<p>Default value: 0.5</p>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="Gwy3DSetup--hide-masked"></a><h3>The <code class="literal">“hide-masked”</code> property</h3>
 <pre class="programlisting">  “hide-masked”              <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
 <p>Hide masked vertices.</p>
diff --git a/devel-docs/libgwydgets/html/Gwy3DView.html b/devel-docs/libgwydgets/html/Gwy3DView.html
index ca4aab9..93547b1 100644
--- a/devel-docs/libgwydgets/html/Gwy3DView.html
+++ b/devel-docs/libgwydgets/html/Gwy3DView.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Gwy3DView: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="Widgets3D.html" title="3D Widgets">
 <link rel="prev" href="Widgets3D.html" title="3D Widgets">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="Gwy3DView.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -226,7 +226,7 @@
 </div>
 <div class="refsect1">
 <a name="Gwy3DView.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -278,7 +278,7 @@
 </div>
 <div class="refsect1">
 <a name="Gwy3DView.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -345,7 +345,7 @@ gwy_3d_view_new (<em class="parameter"><code><a href="../GwyContainer.html#GwyCo
 .</p>
 <div class="refsect3">
 <a name="gwy-3d-view-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -371,7 +371,7 @@ gwy_3d_view_get_setup_prefix (<em class="parameter"><code><a class="link" href="
 <p>Gets prefix identifying 3D view setup in the container.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-get-setup-prefix.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -398,7 +398,7 @@ gwy_3d_view_set_setup_prefix (<em class="parameter"><code><a class="link" href="
 <p>Sets the prefix of 3D view parameters in the container.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-set-setup-prefix.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -430,7 +430,7 @@ gwy_3d_view_get_data_key (<em class="parameter"><code><a class="link" href="Gwy3
 <p>Gets the container key identifying the data field to visualize in a 3D view.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-get-data-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -457,7 +457,7 @@ gwy_3d_view_set_data_key (<em class="parameter"><code><a class="link" href="Gwy3
 <p>Sets the container key identifying the data field to visualize in a 3D view.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-set-data-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -488,7 +488,7 @@ gwy_3d_view_set_ovlay (<em class="parameter"><code><a class="link" href="Gwy3DVi
 <p>Sets overlays for a 3D view.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-set-ovlay.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -526,7 +526,7 @@ gwy_3d_view_get_gradient_key (<em class="parameter"><code><a class="link" href="
 data in a 3D view.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-get-gradient-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -554,7 +554,7 @@ gwy_3d_view_set_gradient_key (<em class="parameter"><code><a class="link" href="
 data in a 3D view.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-set-gradient-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -585,7 +585,7 @@ gwy_3d_view_get_material_key (<em class="parameter"><code><a class="link" href="
 view.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-get-material-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -613,7 +613,7 @@ gwy_3d_view_set_material_key (<em class="parameter"><code><a class="link" href="
 view.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-set-material-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -644,7 +644,7 @@ gwy_3d_view_get_reduced_size (<em class="parameter"><code><a class="link" href="
 <p>See <a class="link" href="Gwy3DView.html#gwy-3d-view-set-reduced-size" title="gwy_3d_view_set_reduced_size ()"><code class="function">gwy_3d_view_set_reduced_size()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-get-reduced-size.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -685,7 +685,7 @@ downsampling.</p>
 does not downsample anything.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-set-reduced-size.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -715,7 +715,7 @@ gwy_3d_view_get_movement_type (<em class="parameter"><code><a class="link" href=
 the mouse motion event.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-get-movement-type.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -742,7 +742,7 @@ gwy_3d_view_set_movement_type (<em class="parameter"><code><a class="link" href=
 <p>Sets the type of widget response on the mouse motion event.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-set-movement-type.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -775,7 +775,7 @@ gwy_3d_view_get_pixbuf (<em class="parameter"><code><a class="link" href="Gwy3DV
  will be implemented to set the resolution of the pixbuf.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-get-pixbuf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -804,7 +804,7 @@ gwy_3d_view_get_label (<em class="parameter"><code><a class="link" href="Gwy3DVi
 object from the data container.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-get-label.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -841,7 +841,7 @@ gwy_3d_view_get_setup (<em class="parameter"><code><a class="link" href="Gwy3DVi
 object from the data container.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-get-setup.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -867,7 +867,7 @@ gwy_3d_view_get_data (<em class="parameter"><code><a class="link" href="Gwy3DVie
 <p>Returns the data container this 3D view displays.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-get-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -895,7 +895,7 @@ gwy_3d_view_get_scale_range (<em class="parameter"><code><a class="link" href="G
 <p>Obtains the minimum and maximum zoom of a 3D data view</p>
 <div class="refsect3">
 <a name="gwy-3d-view-get-scale-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -932,7 +932,7 @@ gwy_3d_view_set_scale_range (<em class="parameter"><code><a class="link" href="G
 <p>Recommended zoom values are 0.5 - 5.0.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-set-scale-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -973,7 +973,7 @@ their rendering depends on the 3D view setup.</p>
 that crash on pixmap drawing operations.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-class-disable-axis-drawing.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -997,7 +997,7 @@ gwy_3d_view_get_mask_key (<em class="parameter"><code><a class="link" href="Gwy3
 visualisation in a 3D view.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-get-mask-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1025,7 +1025,7 @@ gwy_3d_view_set_mask_key (<em class="parameter"><code><a class="link" href="Gwy3
 visualisation in a 3D view.</p>
 <div class="refsect3">
 <a name="gwy-3d-view-set-mask-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/Gwy3DWindow.html b/devel-docs/libgwydgets/html/Gwy3DWindow.html
index 4e6babb..6b5e690 100644
--- a/devel-docs/libgwydgets/html/Gwy3DWindow.html
+++ b/devel-docs/libgwydgets/html/Gwy3DWindow.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Gwy3DWindow: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="Widgets3D.html" title="3D Widgets">
 <link rel="prev" href="Gwy3DView.html" title="Gwy3DView">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="Gwy3DWindow.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -102,7 +102,7 @@
 </div>
 <div class="refsect1">
 <a name="Gwy3DWindow.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -158,7 +158,7 @@ gwy_3d_window_new (<em class="parameter"><code><a class="link" href="Gwy3DView.h
 <p>Creates a new OpenGL 3D data displaying window.</p>
 <div class="refsect3">
 <a name="gwy-3d-window-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -184,7 +184,7 @@ gwy_3d_window_get_3d_view (<em class="parameter"><code><a class="link" href="Gwy
 <p>Returns the <a class="link" href="Gwy3DView.html" title="Gwy3DView"><span class="type">Gwy3DView</span></a> widget this 3D window currently shows.</p>
 <div class="refsect3">
 <a name="gwy-3d-window-get-3d-view.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -212,7 +212,7 @@ gwy_3d_window_add_action_widget (<em class="parameter"><code><a class="link" hre
 <p>The action area is located under the parameter notebook.</p>
 <div class="refsect3">
 <a name="gwy-3d-window-add-action-widget.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -249,7 +249,7 @@ gwy_3d_window_add_small_toolbar_button
 space constraints the button must be contain only a pixmap.</p>
 <div class="refsect3">
 <a name="gwy-3d-window-add-small-toolbar-button.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -303,7 +303,7 @@ caller will set up the layer and call <a class="link" href="Gwy3DView.html#gwy-3
 upon selection of data in the chooser.</p>
 <div class="refsect3">
 <a name="gwy-3d-window-set-overlay-chooser.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -339,7 +339,7 @@ the class instantiates one on its own.  You can normally obtain it with
 the tooltips in either case.</p>
 <div class="refsect3">
 <a name="gwy-3d-window-class-set-tooltips.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyAdjustBar.html b/devel-docs/libgwydgets/html/GwyAdjustBar.html
new file mode 100644
index 0000000..3651633
--- /dev/null
+++ b/devel-docs/libgwydgets/html/GwyAdjustBar.html
@@ -0,0 +1,815 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GwyAdjustBar: Gwyddion Widgets Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
+<link rel="up" href="GeneralWidgets.html" title="General Widgets">
+<link rel="prev" href="GeneralWidgets.html" title="General Widgets">
+<link rel="next" href="GwyColorButton.html" title="GwyColorButton">
+<meta name="generator" content="GTK-Doc V1.19 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#GwyAdjustBar.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#GwyAdjustBar.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_interfaces">  <span class="dim">|</span> 
+                  <a href="#GwyAdjustBar.implemented-interfaces" class="shortcut">Implemented Interfaces</a></span><span id="nav_properties">  <span class="dim">|</span> 
+                  <a href="#GwyAdjustBar.properties" class="shortcut">Properties</a></span><span id="nav_signals">  <span class="dim">|</span> 
+                  <a href="#GwyAdjustBar.signals" class="shortcut">Signals</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="GeneralWidgets.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="GeneralWidgets.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="GwyColorButton.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="GwyAdjustBar"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GwyAdjustBar.top_of_page"></a>GwyAdjustBar</span></h2>
+<p>GwyAdjustBar — Compact adjustment visualisation and modification</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="GwyAdjustBar.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-new" title="gwy_adjust_bar_new ()">gwy_adjust_bar_new</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-set-adjustment" title="gwy_adjust_bar_set_adjustment ()">gwy_adjust_bar_set_adjustment</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk3GtkAdjustment.html#GtkAdjustment-struct"><span class="returnvalue">GtkAdjustment</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-adjustment" title="gwy_adjust_bar_get_adjustment ()">gwy_adjust_bar_get_adjustment</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-set-snap-to-ticks" title="gwy_adjust_bar_set_snap_to_ticks ()">gwy_adjust_bar_set_snap_to_ticks</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-snap-to-ticks" title="gwy_adjust_bar_get_snap_to_ticks ()">gwy_adjust_bar_get_snap_to_ticks</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-set-mapping" title="gwy_adjust_bar_set_mapping ()">gwy_adjust_bar_set_mapping</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="GwyAdjustBar.html#GwyScaleMappingType" title="enum GwyScaleMappingType"><span class="returnvalue">GwyScaleMappingType</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-mapping" title="gwy_adjust_bar_get_mapping ()">gwy_adjust_bar_get_mapping</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-set-has-check-button" title="gwy_adjust_bar_set_has_check_button ()">gwy_adjust_bar_set_has_check_button</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-has-check-button" title="gwy_adjust_bar_get_has_check_button ()">gwy_adjust_bar_get_has_check_button</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-set-bar-sensitive" title="gwy_adjust_bar_set_bar_sensitive ()">gwy_adjust_bar_set_bar_sensitive</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-bar-sensitive" title="gwy_adjust_bar_get_bar_sensitive ()">gwy_adjust_bar_get_bar_sensitive</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-label" title="gwy_adjust_bar_get_label ()">gwy_adjust_bar_get_label</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-check-button" title="gwy_adjust_bar_get_check_button ()">gwy_adjust_bar_get_check_button</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="GwyAdjustBar.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table class="informaltable" border="0">
+<colgroup>
+<col width="150px" class="properties_type">
+<col width="300px" class="properties_name">
+<col width="200px" class="properties_flags">
+</colgroup>
+<tbody>
+<tr>
+<td class="property_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk3GtkAdjustment.html#GtkAdjustment-struct"><span class="type">GtkAdjustment</span></a> *</td>
+<td class="property_name"><a class="link" href="GwyAdjustBar.html#GwyAdjustBar--adjustment" title="The “adjustment” property">adjustment</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="GwyAdjustBar.html#GwyAdjustBar--has-check-button" title="The “has-check-button” property">has-check-button</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a class="link" href="GwyAdjustBar.html#GwyScaleMappingType" title="enum GwyScaleMappingType"><span class="type">GwyScaleMappingType</span></a></td>
+<td class="property_name"><a class="link" href="GwyAdjustBar.html#GwyAdjustBar--mapping" title="The “mapping” property">mapping</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="GwyAdjustBar.html#GwyAdjustBar--snap-to-ticks" title="The “snap-to-ticks” property">snap-to-ticks</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="GwyAdjustBar.signals"></a><h2>Signals</h2>
+<div class="informaltable"><table class="informaltable" border="0">
+<colgroup>
+<col width="150px" class="signals_return">
+<col width="300px" class="signals_name">
+<col width="200px" class="signals_flags">
+</colgroup>
+<tbody><tr>
+<td class="signal_type"><span class="returnvalue">void</span></td>
+<td class="signal_name"><a class="link" href="GwyAdjustBar.html#GwyAdjustBar-change-value" title="The “change-value” signal">change-value</a></td>
+<td class="signal_flags"><a href="http://developer.gnome.org/doc/API/2.0/gtk/gobjectgobject-Signals.html#G-SIGNAL-ACTION:CAPS">Action</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="GwyAdjustBar.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="datatype_keyword">struct</td>
+<td class="function_name"><a class="link" href="GwyAdjustBar.html#GwyAdjustBar-struct" title="struct GwyAdjustBar">GwyAdjustBar</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">struct</td>
+<td class="function_name"><a class="link" href="GwyAdjustBar.html#GwyAdjustBarClass" title="struct GwyAdjustBarClass">GwyAdjustBarClass</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="GwyAdjustBar.html#GwyScaleMappingType" title="enum GwyScaleMappingType">GwyScaleMappingType</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="GwyAdjustBar.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="http://developer.gnome.org/doc/API/2.0/gtk/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a>
+    <span class="lineart">╰──</span> <a href="http://developer.gnome.org/doc/API/2.0/gtk/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+        <span class="lineart">╰──</span> <a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk2GtkObject.html#GtkObject-struct">GtkObject</a>
+            <span class="lineart">╰──</span> <a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk3GtkWidget.html#GtkWidget-struct">GtkWidget</a>
+                <span class="lineart">╰──</span> <a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk3GtkContainer.html#GtkContainer-struct">GtkContainer</a>
+                    <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gtk3GtkBin.html#GtkBin-struct">GtkBin</a>
+                        <span class="lineart">╰──</span> GwyAdjustBar
+</pre>
+</div>
+<div class="refsect1">
+<a name="GwyAdjustBar.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GwyAdjustBar implements
+ AtkImplementorIface and  <a href="/usr/share/gtk-doc/html/gtk3GtkBuildable.html#GtkBuildable-struct">GtkBuildable</a>.</p>
+</div>
+<div class="refsect1">
+<a name="GwyAdjustBar.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include <libgwydgets/gwydgets.h>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GwyAdjustBar.description"></a><h2>Description</h2>
+<p><a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar"><span class="type">GwyAdjustBar</span></a> is a compact widget for visualisation and modification of the
+value of an <a href="/usr/share/gtk-doc/html/gtk3GtkAdjustment.html#GtkAdjustment-struct"><span class="type">GtkAdjustment</span></a>.  It can contains a label with an overlaid bar
+that can be clicked, dragged or modified by the scroll-wheel by the user.
+Since the widget does not take keyboard focus, it should be paired with a
+<a href="/usr/share/gtk-doc/html/gtk3GtkSpinButton.html#GtkSpinButton-struct"><span class="type">GtkSpinButton</span></a>, sharing the same adjustment.  This spin button would also be
+the typical mnemonic widget for the adjustment bar.</p>
+<p><a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar"><span class="type">GwyAdjustBar</span></a> supports several different types of mapping between screen
+positions and values of the underlying adjustment.  Nevertheless, the
+default mapping (signed square root, <a class="link" href="GwyAdjustBar.html#GWY-SCALE-MAPPING-SQRT:CAPS"><code class="literal">GWY_SCALE_MAPPING_SQRT</code></a>) should fit
+most situations.</p>
+</div>
+<div class="refsect1">
+<a name="GwyAdjustBar.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="gwy-adjust-bar-new"></a><h3>gwy_adjust_bar_new ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+gwy_adjust_bar_new (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gtk3GtkAdjustment.html#GtkAdjustment-struct"><span class="type">GtkAdjustment</span></a> *adjustment</code></em>,
+                    <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *label</code></em>);</pre>
+<p>Creates a new adjustment bar.</p>
+<p>The label text, if any, is set with mnemonic enabled.  However, you still
+need to assign it to a widget (presumably a <a href="/usr/share/gtk-doc/html/gtk3GtkSpinButton.html#GtkSpinButton-struct"><span class="type">GtkSpinButton</span></a>) using
+<a href="/usr/share/gtk-doc/html/gtk3GtkLabel.html#gtk-label-set-mnemonic-widget"><code class="function">gtk_label_set_mnemonic_widget()</code></a>.</p>
+<div class="refsect3">
+<a name="gwy-adjust-bar-new.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>adjustment</p></td>
+<td class="parameter_description"><p>The adjustment the adjust bar should use, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>label</p></td>
+<td class="parameter_description"><p>Text of the adjustment bar label, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-adjust-bar-new.returns"></a><h4>Returns</h4>
+<p> A new adjustment bar.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-adjust-bar-set-adjustment"></a><h3>gwy_adjust_bar_set_adjustment ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_adjust_bar_set_adjustment (<em class="parameter"><code><a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar"><span class="type">GwyAdjustBar</span></a> *adjbar</code></em>,
+                               <em class="parameter"><code><a href="/usr/share/gtk-doc/html/gtk3GtkAdjustment.html#GtkAdjustment-struct"><span class="type">GtkAdjustment</span></a> *adjustment</code></em>);</pre>
+<p>Sets the adjustment that an adjustment bar visualises.</p>
+<div class="refsect3">
+<a name="gwy-adjust-bar-set-adjustment.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>adjbar</p></td>
+<td class="parameter_description"><p>An adjustment bar.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>adjustment</p></td>
+<td class="parameter_description"><p>Adjustment to use for the value.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-adjust-bar-get-adjustment"></a><h3>gwy_adjust_bar_get_adjustment ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gtk3GtkAdjustment.html#GtkAdjustment-struct"><span class="returnvalue">GtkAdjustment</span></a> *
+gwy_adjust_bar_get_adjustment (<em class="parameter"><code><a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar"><span class="type">GwyAdjustBar</span></a> *adjbar</code></em>);</pre>
+<p>Obtains the adjustment that an adjustment bar visualises.</p>
+<div class="refsect3">
+<a name="gwy-adjust-bar-get-adjustment.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>adjbar</p></td>
+<td class="parameter_description"><p>An adjustment bar.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-adjust-bar-get-adjustment.returns"></a><h4>Returns</h4>
+<p> The adjustment used by <em class="parameter"><code>adjbar</code></em>
+.  If no adjustment was set
+and the default one is used, function returns <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-adjust-bar-set-snap-to-ticks"></a><h3>gwy_adjust_bar_set_snap_to_ticks ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_adjust_bar_set_snap_to_ticks (<em class="parameter"><code><a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar"><span class="type">GwyAdjustBar</span></a> *adjbar</code></em>,
+                                  <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> setting</code></em>);</pre>
+<p>Sets the snapping behaviour of an adjustment bar.</p>
+<p>Note the ‘multiples of step size’ condition in fact applies to the
+difference from the minimum value.  The maximum adjustment value is always
+permissible, even if it does not satisfy this condition.  Values modified by
+the user (i.e.  emission of signal "change-value") are snapped, however,
+values set explicitly <a href="/usr/share/gtk-doc/html/gtk3GtkAdjustment.html#gtk-adjustment-set-value"><code class="function">gtk_adjustment_set_value()</code></a> are kept intact.</p>
+<p>Setting this option to <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> immediately causes an adjustment value change
+if it does not satisfy the condition.</p>
+<p>It is usually a poor idea to enable snapping for non-linear mappings.</p>
+<div class="refsect3">
+<a name="gwy-adjust-bar-set-snap-to-ticks.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>adjbar</p></td>
+<td class="parameter_description"><p>An adjustment bar.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>setting</p></td>
+<td class="parameter_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to restrict values to multiples of step size,
+<a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> to permit any values.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-adjust-bar-get-snap-to-ticks"></a><h3>gwy_adjust_bar_get_snap_to_ticks ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gwy_adjust_bar_get_snap_to_ticks (<em class="parameter"><code><a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar"><span class="type">GwyAdjustBar</span></a> *adjbar</code></em>);</pre>
+<p>Sets the snapping behaviour of an adjustment bar.</p>
+<div class="refsect3">
+<a name="gwy-adjust-bar-get-snap-to-ticks.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>adjbar</p></td>
+<td class="parameter_description"><p>An adjustment bar.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-adjust-bar-get-snap-to-ticks.returns"></a><h4>Returns</h4>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if values are restricted to multiples of step size.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-adjust-bar-set-mapping"></a><h3>gwy_adjust_bar_set_mapping ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_adjust_bar_set_mapping (<em class="parameter"><code><a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar"><span class="type">GwyAdjustBar</span></a> *adjbar</code></em>,
+                            <em class="parameter"><code><a class="link" href="GwyAdjustBar.html#GwyScaleMappingType" title="enum GwyScaleMappingType"><span class="type">GwyScaleMappingType</span></a> mapping</code></em>);</pre>
+<p>Sets the mapping function type for an adjustment bar.</p>
+<div class="refsect3">
+<a name="gwy-adjust-bar-set-mapping.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>adjbar</p></td>
+<td class="parameter_description"><p>An adjustment bar.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>mapping</p></td>
+<td class="parameter_description"><p>Mapping function type between values and screen positions in the
+adjustment bar.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-adjust-bar-get-mapping"></a><h3>gwy_adjust_bar_get_mapping ()</h3>
+<pre class="programlisting"><a class="link" href="GwyAdjustBar.html#GwyScaleMappingType" title="enum GwyScaleMappingType"><span class="returnvalue">GwyScaleMappingType</span></a>
+gwy_adjust_bar_get_mapping (<em class="parameter"><code><a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar"><span class="type">GwyAdjustBar</span></a> *adjbar</code></em>);</pre>
+<p>Gets the mapping function type of an adjustment bar.</p>
+<div class="refsect3">
+<a name="gwy-adjust-bar-get-mapping.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>adjbar</p></td>
+<td class="parameter_description"><p>An adjustment bar.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-adjust-bar-get-mapping.returns"></a><h4>Returns</h4>
+<p> The type of mapping function between values and screen positions.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-adjust-bar-set-has-check-button"></a><h3>gwy_adjust_bar_set_has_check_button ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_adjust_bar_set_has_check_button (<em class="parameter"><code><a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar"><span class="type">GwyAdjustBar</span></a> *adjbar</code></em>,
+                                     <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> setting</code></em>);</pre>
+<p>Sets whether an adjustment bar has a check button.</p>
+<div class="refsect3">
+<a name="gwy-adjust-bar-set-has-check-button.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>adjbar</p></td>
+<td class="parameter_description"><p>An adjustment bar.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>setting</p></td>
+<td class="parameter_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to enable a check button; <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> to disable it.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-adjust-bar-get-has-check-button"></a><h3>gwy_adjust_bar_get_has_check_button ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gwy_adjust_bar_get_has_check_button (<em class="parameter"><code><a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar"><span class="type">GwyAdjustBar</span></a> *adjbar</code></em>);</pre>
+<p>Reports whether an adjustment bar has a check button.</p>
+<div class="refsect3">
+<a name="gwy-adjust-bar-get-has-check-button.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>adjbar</p></td>
+<td class="parameter_description"><p>An adjustment bar.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-adjust-bar-get-has-check-button.returns"></a><h4>Returns</h4>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the adjustment bar has a check button.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-adjust-bar-set-bar-sensitive"></a><h3>gwy_adjust_bar_set_bar_sensitive ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_adjust_bar_set_bar_sensitive (<em class="parameter"><code><a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar"><span class="type">GwyAdjustBar</span></a> *adjbar</code></em>,
+                                  <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> sensitive</code></em>);</pre>
+<p>Sets the sensitivity of an adjustment bar.</p>
+<p>The bar's sensitivity can be controlled separately.  This is useful when
+<em class="parameter"><code>adjbar</code></em>
+ has a check button because otherwise the bar is the entire widget
+and the function is not different from <a href="/usr/share/gtk-doc/html/gtk3GtkWidget.html#gtk-widget-set-sensitive"><code class="function">gtk_widget_set_sensitive()</code></a>.
+However, if you want to enable and disable the adjustment bar via the check
+button, use this function instead of <a href="/usr/share/gtk-doc/html/gtk3GtkWidget.html#gtk-widget-set-sensitive"><code class="function">gtk_widget_set_sensitive()</code></a> which would
+make insensitive also the check button.</p>
+<div class="refsect3">
+<a name="gwy-adjust-bar-set-bar-sensitive.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>adjbar</p></td>
+<td class="parameter_description"><p>An adjustment bar.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>sensitive</p></td>
+<td class="parameter_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to make the widget's bar sensitive.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-adjust-bar-get-bar-sensitive"></a><h3>gwy_adjust_bar_get_bar_sensitive ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gwy_adjust_bar_get_bar_sensitive (<em class="parameter"><code><a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar"><span class="type">GwyAdjustBar</span></a> *adjbar</code></em>);</pre>
+<p>Reports whether an adjustment bar is sensitive.</p>
+<p>See <a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-set-bar-sensitive" title="gwy_adjust_bar_set_bar_sensitive ()"><code class="function">gwy_adjust_bar_set_bar_sensitive()</code></a> for discussion.</p>
+<div class="refsect3">
+<a name="gwy-adjust-bar-get-bar-sensitive.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>adjbar</p></td>
+<td class="parameter_description"><p>An adjustment bar.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-adjust-bar-get-bar-sensitive.returns"></a><h4>Returns</h4>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the widget's bar is sensitive.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-adjust-bar-get-label"></a><h3>gwy_adjust_bar_get_label ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+gwy_adjust_bar_get_label (<em class="parameter"><code><a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar"><span class="type">GwyAdjustBar</span></a> *adjbar</code></em>);</pre>
+<p>Gets the label widget inside an adjustment bar.</p>
+<p>Use <a href="/usr/share/gtk-doc/html/gtk3GtkLabel.html#gtk-label-set-mnemonic-widget"><code class="function">gtk_label_set_mnemonic_widget()</code></a> to set the mnemonic widget for the label
+or change the label text.</p>
+<div class="refsect3">
+<a name="gwy-adjust-bar-get-label.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>adjbar</p></td>
+<td class="parameter_description"><p>An adjustment bar.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-adjust-bar-get-label.returns"></a><h4>Returns</h4>
+<p> The label widget.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-adjust-bar-get-check-button"></a><h3>gwy_adjust_bar_get_check_button ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+gwy_adjust_bar_get_check_button (<em class="parameter"><code><a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar"><span class="type">GwyAdjustBar</span></a> *adjbar</code></em>);</pre>
+<p>Gets the check button of an adjustment bar.</p>
+<p>Connect to the "toggled" signal of the check button.  Modifying it is not
+recommended.</p>
+<div class="refsect3">
+<a name="gwy-adjust-bar-get-check-button.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>adjbar</p></td>
+<td class="parameter_description"><p>An adjustment bar.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-adjust-bar-get-check-button.returns"></a><h4>Returns</h4>
+<p> The check button widget, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if there is none.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GwyAdjustBar.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GwyAdjustBar-struct"></a><h3>struct GwyAdjustBar</h3>
+<pre class="programlisting">struct GwyAdjustBar;</pre>
+<p>Adjustment bar widget visualising an adjustment.</p>
+<p>The <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar"><span class="type">GwyAdjustBar</span></a> struct contains private data only and should be accessed
+using the functions below.</p>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GwyAdjustBarClass"></a><h3>struct GwyAdjustBarClass</h3>
+<pre class="programlisting">struct GwyAdjustBarClass {
+};
+</pre>
+<p>Class of adjustment bars visualising adjustments.</p>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GwyScaleMappingType"></a><h3>enum GwyScaleMappingType</h3>
+<p>Type of adjustment bar mapping functions.</p>
+<div class="refsect3">
+<a name="GwyScaleMappingType.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="GWY-SCALE-MAPPING-LINEAR:CAPS"></a>GWY_SCALE_MAPPING_LINEAR</p></td>
+<td class="enum_member_description">
+<p>Linear mapping between values and screen
+                           positions.  This recommended for signed additive
+                           quantities of a limited range.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GWY-SCALE-MAPPING-SQRT:CAPS"></a>GWY_SCALE_MAPPING_SQRT</p></td>
+<td class="enum_member_description">
+<p>Screen positions correspond to ‘signed square
+                         roots’ of the value.  This is the
+                         recommended general-purpose default mapping type as
+                         it works with both signed and usigned quantities
+                         and offers good sensitivity for both large and
+                         small values.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GWY-SCALE-MAPPING-LOG:CAPS"></a>GWY_SCALE_MAPPING_LOG</p></td>
+<td class="enum_member_description">
+<p>Screen positions correspond to logarithms of values.
+                        The adjustment range must contain only positive
+                        values.  For quantities of extreme ranges this
+                        mapping may be preferred to <a class="link" href="GwyAdjustBar.html#GWY-SCALE-MAPPING-SQRT:CAPS"><code class="literal">GWY_SCALE_MAPPING_SQRT</code></a>.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GwyAdjustBar.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GwyAdjustBar--adjustment"></a><h3>The <code class="literal">“adjustment”</code> property</h3>
+<pre class="programlisting">  “adjustment”               <a href="/usr/share/gtk-doc/html/gtk3GtkAdjustment.html#GtkAdjustment-struct"><span class="type">GtkAdjustment</span></a> *</pre>
+<p>Adjustment representing the value.</p>
+<p>Flags: Read / Write</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GwyAdjustBar--has-check-button"></a><h3>The <code class="literal">“has-check-button”</code> property</h3>
+<pre class="programlisting">  “has-check-button”         <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Whether the adjust bar has a check button.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GwyAdjustBar--mapping"></a><h3>The <code class="literal">“mapping”</code> property</h3>
+<pre class="programlisting">  “mapping”                  <a class="link" href="GwyAdjustBar.html#GwyScaleMappingType" title="enum GwyScaleMappingType"><span class="type">GwyScaleMappingType</span></a></pre>
+<p>Mapping function between values and screen positions.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: GWY_SCALE_MAPPING_SQRT</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GwyAdjustBar--snap-to-ticks"></a><h3>The <code class="literal">“snap-to-ticks”</code> property</h3>
+<pre class="programlisting">  “snap-to-ticks”            <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Whether only values that are multiples of step size are allowed.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: FALSE</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GwyAdjustBar.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GwyAdjustBar-change-value"></a><h3>The <code class="literal">“change-value”</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+user_function (<a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar"><span class="type">GwyAdjustBar</span></a> *gwyadjustbar,
+               <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a>       arg1,
+               <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>      user_data)</pre>
+<p>The ::change-value signal is emitted when the user interactively
+changes the value.</p>
+<p>It is an action signal.</p>
+<div class="refsect3">
+<a name="GwyAdjustBar-change-value.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>gwyadjustbar</p></td>
+<td class="parameter_description"><p>The <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar"><span class="type">GwyAdjustBar</span></a> which received the signal.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>arg1</p></td>
+<td class="parameter_description"><p>New value for <em class="parameter"><code>gwyadjustbar</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p>Flags: <a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-ACTION:CAPS">Action</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.19</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/devel-docs/libgwydgets/html/GwyAxis.html b/devel-docs/libgwydgets/html/GwyAxis.html
index 27e91e9..a96223d 100644
--- a/devel-docs/libgwydgets/html/GwyAxis.html
+++ b/devel-docs/libgwydgets/html/GwyAxis.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyAxis: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GraphWidgets.html" title="Graphs">
 <link rel="prev" href="GwyGraphArea.html" title="GwyGraphArea">
@@ -37,7 +37,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyAxis.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -197,7 +197,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyAxis.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -260,7 +260,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyAxis.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -275,7 +275,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyAxis.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -332,7 +332,7 @@ gwy_axis_new (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibg
 <p>Creates a new axis.</p>
 <div class="refsect3">
 <a name="gwy-axis-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -359,7 +359,7 @@ gwy_axis_set_logarithmic (<em class="parameter"><code><a class="link" href="GwyA
 <p>Sets logarithmic mode.</p>
 <div class="refsect3">
 <a name="gwy-axis-set-logarithmic.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -389,7 +389,7 @@ gwy_axis_set_visible (<em class="parameter"><code><a class="link" href="GwyAxis.
 <p>Sets the visibility of an axis.</p>
 <div class="refsect3">
 <a name="gwy-axis-set-visible.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -420,7 +420,7 @@ gwy_axis_is_visible (<em class="parameter"><code><a class="link" href="GwyAxis.h
  is set to be visible.</p>
 <div class="refsect3">
 <a name="gwy-axis-is-visible.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -442,7 +442,7 @@ gwy_axis_is_logarithmic (<em class="parameter"><code><a class="link" href="GwyAx
 <p>Determines whether axis is set to be locarithmic.</p>
 <div class="refsect3">
 <a name="gwy-axis-is-logarithmic.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -469,7 +469,7 @@ gwy_axis_get_orientation (<em class="parameter"><code><a class="link" href="GwyA
 <p>Gets the orientation of an axis.</p>
 <div class="refsect3">
 <a name="gwy-axis-get-orientation.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -496,7 +496,7 @@ gwy_axis_set_auto (<em class="parameter"><code><a class="link" href="GwyAxis.htm
 <p>Enables or disables automatic axis adjustmet.</p>
 <div class="refsect3">
 <a name="gwy-axis-set-auto.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -531,7 +531,7 @@ reasonable tick values and spacing.  Use <a class="link" href="GwyAxis.html#gwy-
 boundaries the axis actually decided to use.</p>
 <div class="refsect3">
 <a name="gwy-axis-request-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -567,7 +567,7 @@ gwy_axis_get_range (<em class="parameter"><code><a class="link" href="GwyAxis.ht
 <p>Gets the actual boundaries of an axis.</p>
 <div class="refsect3">
 <a name="gwy-axis-get-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -603,7 +603,7 @@ gwy_axis_get_requested_range (<em class="parameter"><code><a class="link" href="
 <p>Gets the requested boundaries of an axis.</p>
 <div class="refsect3">
 <a name="gwy-axis-get-requested-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -637,7 +637,7 @@ gwy_axis_get_magnification (<em class="parameter"><code><a class="link" href="Gw
 <p>Gets the magnification value of a graph axis.</p>
 <div class="refsect3">
 <a name="gwy-axis-get-magnification.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -663,7 +663,7 @@ gwy_axis_get_magnification_string (<em class="parameter"><code><a class="link" h
 <p>Gets the magnification string of an axis.</p>
 <div class="refsect3">
 <a name="gwy-axis-get-magnification-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -690,7 +690,7 @@ gwy_axis_set_label (<em class="parameter"><code><a class="link" href="GwyAxis.ht
 <p>Sets the label text of an axis.</p>
 <div class="refsect3">
 <a name="gwy-axis-set-label.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -719,7 +719,7 @@ gwy_axis_get_label (<em class="parameter"><code><a class="link" href="GwyAxis.ht
 <p>Gets the label of an axis.</p>
 <div class="refsect3">
 <a name="gwy-axis-get-label.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -749,7 +749,7 @@ to the label. <em class="parameter"><code>unit</code></em>
  is duplicated.</p>
 <div class="refsect3">
 <a name="gwy-axis-set-si-unit.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -779,7 +779,7 @@ gwy_axis_enable_label_edit (<em class="parameter"><code><a class="link" href="Gw
 <p>Enables/disables user to change axis label by clicking on axis widget.</p>
 <div class="refsect3">
 <a name="gwy-axis-enable-label-edit.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -814,7 +814,7 @@ gwy_axis_draw_on_drawable (<em class="parameter"><code><a class="link" href="Gwy
 <p>Draws the x and y-axis on a drawable</p>
 <div class="refsect3">
 <a name="gwy-axis-draw-on-drawable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -876,7 +876,7 @@ gwy_axis_export_vector (<em class="parameter"><code><a class="link" href="GwyAxi
 not useful anywhere else.</p>
 <div class="refsect3">
 <a name="gwy-axis-export-vector.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -930,7 +930,7 @@ gwy_axis_get_major_ticks (<em class="parameter"><code><a class="link" href="GwyA
 <p>Gets the positions of major ticks of an axis.</p>
 <div class="refsect3">
 <a name="gwy-axis-get-major-ticks.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyColorAxis.html b/devel-docs/libgwydgets/html/GwyColorAxis.html
index 0cfd94f..12be1d0 100644
--- a/devel-docs/libgwydgets/html/GwyColorAxis.html
+++ b/devel-docs/libgwydgets/html/GwyColorAxis.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyColorAxis: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="DataWindowWidgets.html" title="Data Windows and Views">
 <link rel="prev" href="GwyLayerMask.html" title="GwyLayerMask">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyColorAxis.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -158,7 +158,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyColorAxis.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -197,7 +197,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyColorAxis.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -250,7 +250,7 @@ GwyColorAxis implements
 <p>Type of color axis non-linear tick mapping function.</p>
 <div class="refsect3">
 <a name="GwyColorAxisMapFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -299,7 +299,7 @@ gwy_color_axis_new (<em class="parameter"><code><a href="/usr/share/gtk-doc/html
 <p>Creates a new color axis.</p>
 <div class="refsect3">
 <a name="gwy-color-axis-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -327,7 +327,7 @@ gwy_color_axis_new_with_range (<em class="parameter"><code><a href="/usr/share/g
 <p>Creates a new color axis.</p>
 <div class="refsect3">
 <a name="gwy-color-axis-new-with-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -367,7 +367,7 @@ gwy_color_axis_get_range (<em class="parameter"><code><a class="link" href="GwyC
 <p>Gets the range of a color axis.</p>
 <div class="refsect3">
 <a name="gwy-color-axis-get-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -403,7 +403,7 @@ gwy_color_axis_set_range (<em class="parameter"><code><a class="link" href="GwyC
 <p>Sets the range of a color axis.</p>
 <div class="refsect3">
 <a name="gwy-color-axis-set-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -437,7 +437,7 @@ gwy_color_axis_get_si_unit (<em class="parameter"><code><a class="link" href="Gw
 <p>Gets the SI unit a color axis displays.</p>
 <div class="refsect3">
 <a name="gwy-color-axis-get-si-unit.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -464,7 +464,7 @@ gwy_color_axis_set_si_unit (<em class="parameter"><code><a class="link" href="Gw
 <p>Sets the SI unit a color axis displays.</p>
 <div class="refsect3">
 <a name="gwy-color-axis-set-si-unit.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -494,7 +494,7 @@ gwy_color_axis_set_gradient (<em class="parameter"><code><a class="link" href="G
 <p>Sets the color gradient a color axis should use.</p>
 <div class="refsect3">
 <a name="gwy-color-axis-set-gradient.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -524,7 +524,7 @@ gwy_color_axis_get_gradient (<em class="parameter"><code><a class="link" href="G
 <p>Gets the color gradient a color axis uses.</p>
 <div class="refsect3">
 <a name="gwy-color-axis-get-gradient.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -550,7 +550,7 @@ gwy_color_axis_get_ticks_style (<em class="parameter"><code><a class="link" href
 <p>Gets ticks style of a color axis.</p>
 <div class="refsect3">
 <a name="gwy-color-axis-get-ticks-style.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -577,7 +577,7 @@ gwy_color_axis_set_ticks_style (<em class="parameter"><code><a class="link" href
 <p>Sets the ticks style of a color axis.</p>
 <div class="refsect3">
 <a name="gwy-color-axis-set-ticks-style.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -606,7 +606,7 @@ gwy_color_axis_get_labels_visible (<em class="parameter"><code><a class="link" h
 <p>Gets the visibility of labels of a color axis.</p>
 <div class="refsect3">
 <a name="gwy-color-axis-get-labels-visible.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -633,7 +633,7 @@ gwy_color_axis_set_labels_visible (<em class="parameter"><code><a class="link" h
 <p>Sets the visibility of labels of a color axis.</p>
 <div class="refsect3">
 <a name="gwy-color-axis-set-labels-visible.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -670,7 +670,7 @@ ticks mode <a class="link" href="libgwydgets-gwydgetenums.html#GWY-TICKS-STYLE-U
 guaranteed.</p>
 <div class="refsect3">
 <a name="gwy-color-axis-set-tick-map-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyColorButton.html b/devel-docs/libgwydgets/html/GwyColorButton.html
index e082113..c4d5ba3 100644
--- a/devel-docs/libgwydgets/html/GwyColorButton.html
+++ b/devel-docs/libgwydgets/html/GwyColorButton.html
@@ -3,10 +3,10 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyColorButton: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GeneralWidgets.html" title="General Widgets">
-<link rel="prev" href="GeneralWidgets.html" title="General Widgets">
+<link rel="prev" href="GwyAdjustBar.html" title="GwyAdjustBar">
 <link rel="next" href="GwyCurve.html" title="GwyCurve">
 <meta name="generator" content="GTK-Doc V1.19 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
@@ -22,7 +22,7 @@
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="GeneralWidgets.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="GeneralWidgets.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="GwyAdjustBar.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="GwyCurve.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyColorButton.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -95,7 +95,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyColorButton.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -118,7 +118,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyColorButton.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -190,7 +190,7 @@ gwy_color_button_new_with_color (<em class="parameter"><code>const <span class="
 <p>Creates a new color button.</p>
 <div class="refsect3">
 <a name="gwy-color-button-new-with-color.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -218,7 +218,7 @@ gwy_color_button_set_color (<em class="parameter"><code><a class="link" href="Gw
 .</p>
 <div class="refsect3">
 <a name="gwy-color-button-set-color.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -249,7 +249,7 @@ gwy_color_button_get_color (<em class="parameter"><code><a class="link" href="Gw
  to be the current color in the <a class="link" href="GwyColorButton.html" title="GwyColorButton"><span class="type">GwyColorButton</span></a> widget.</p>
 <div class="refsect3">
 <a name="gwy-color-button-get-color.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -279,7 +279,7 @@ gwy_color_button_set_use_alpha (<em class="parameter"><code><a class="link" href
 <p>Sets whether or not the color button should use the alpha channel.</p>
 <div class="refsect3">
 <a name="gwy-color-button-set-use-alpha.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -308,7 +308,7 @@ gwy_color_button_get_use_alpha (<em class="parameter"><code><a class="link" href
 <p>Does the color selection dialog use the alpha channel?</p>
 <div class="refsect3">
 <a name="gwy-color-button-get-use-alpha.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyCurve.html b/devel-docs/libgwydgets/html/GwyCurve.html
index ade383d..9f1f4f0 100644
--- a/devel-docs/libgwydgets/html/GwyCurve.html
+++ b/devel-docs/libgwydgets/html/GwyCurve.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyCurve: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GeneralWidgets.html" title="General Widgets">
 <link rel="prev" href="GwyColorButton.html" title="GwyColorButton">
@@ -37,7 +37,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyCurve.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -104,7 +104,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyCurve.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -146,7 +146,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyCurve.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -168,7 +168,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyCurve.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -242,7 +242,7 @@ gwy_curve_reset (<em class="parameter"><code><a class="link" href="GwyCurve.html
 <p>Removes all control points, resetting the curves to their initial state.</p>
 <div class="refsect3">
 <a name="gwy-curve-reset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyDataView.html b/devel-docs/libgwydgets/html/GwyDataView.html
index db68660..16ff5bd 100644
--- a/devel-docs/libgwydgets/html/GwyDataView.html
+++ b/devel-docs/libgwydgets/html/GwyDataView.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyDataView: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="DataWindowWidgets.html" title="Data Windows and Views">
 <link rel="prev" href="GwyDataWindow.html" title="GwyDataWindow">
@@ -37,7 +37,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyDataView.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -271,7 +271,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyDataView.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -294,7 +294,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyDataView.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -326,7 +326,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyDataView.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -405,7 +405,7 @@ mouse and keyboard events.</p>
 transparent or vector.</p>
 <div class="refsect3">
 <a name="gwy-data-view-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -432,7 +432,7 @@ gwy_data_view_get_base_layer (<em class="parameter"><code><a class="link" href="
 <p>A base layer should be always present.</p>
 <div class="refsect3">
 <a name="gwy-data-view-get-base-layer.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -465,7 +465,7 @@ use no base layer, but then <em class="parameter"><code>data_view</code></em>
  will probably display garbage.</p>
 <div class="refsect3">
 <a name="gwy-data-view-set-base-layer.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -496,7 +496,7 @@ gwy_data_view_get_alpha_layer (<em class="parameter"><code><a class="link" href=
 is present.</p>
 <div class="refsect3">
 <a name="gwy-data-view-get-alpha-layer.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -528,7 +528,7 @@ gwy_data_view_set_alpha_layer (<em class="parameter"><code><a class="link" href=
 layer is to be used.</p>
 <div class="refsect3">
 <a name="gwy-data-view-set-alpha-layer.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -559,7 +559,7 @@ gwy_data_view_get_top_layer (<em class="parameter"><code><a class="link" href="G
 is present.</p>
 <div class="refsect3">
 <a name="gwy-data-view-get-top-layer.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -591,7 +591,7 @@ gwy_data_view_set_top_layer (<em class="parameter"><code><a class="link" href="G
 layer is to be used.</p>
 <div class="refsect3">
 <a name="gwy-data-view-set-top-layer.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -622,7 +622,7 @@ gwy_data_view_get_data_prefix (<em class="parameter"><code><a class="link" href=
 currently set to display.</p>
 <div class="refsect3">
 <a name="gwy-data-view-get-data-prefix.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -651,7 +651,7 @@ gwy_data_view_set_data_prefix (<em class="parameter"><code><a class="link" href=
 from, it does not affect layer keys.</p>
 <div class="refsect3">
 <a name="gwy-data-view-set-data-prefix.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -681,7 +681,7 @@ gwy_data_view_get_hexcess (<em class="parameter"><code><a class="link" href="Gwy
 <p>Do not use.  Only useful for <a class="link" href="GwyDataWindow.html" title="GwyDataWindow"><span class="type">GwyDataWindow</span></a> implementation.</p>
 <div class="refsect3">
 <a name="gwy-data-view-get-hexcess.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -708,7 +708,7 @@ gwy_data_view_get_vexcess (<em class="parameter"><code><a class="link" href="Gwy
 <p>Do not use.  Only useful for <a class="link" href="GwyDataWindow.html" title="GwyDataWindow"><span class="type">GwyDataWindow</span></a> implementation.</p>
 <div class="refsect3">
 <a name="gwy-data-view-get-vexcess.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -740,7 +740,7 @@ gwy_data_view_set_zoom (<em class="parameter"><code><a class="link" href="GwyDat
 from change.</p>
 <div class="refsect3">
 <a name="gwy-data-view-set-zoom.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -777,7 +777,7 @@ considered to be the same.</p>
 <a class="link" href="GwyDataView.html#gwy-data-view-get-real-zoom" title="gwy_data_view_get_real_zoom ()"><code class="function">gwy_data_view_get_real_zoom()</code></a> to get the real zoom.</p>
 <div class="refsect3">
 <a name="gwy-data-view-get-zoom.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -808,7 +808,7 @@ by window manager or other constraints.  Unlike ideal zoom set by
 <p>When a resize is queued, the current (old) value is returned.</p>
 <div class="refsect3">
 <a name="gwy-data-view-get-real-zoom.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -836,7 +836,7 @@ gwy_data_view_get_data (<em class="parameter"><code><a class="link" href="GwyDat
 .</p>
 <div class="refsect3">
 <a name="gwy-data-view-get-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -867,7 +867,7 @@ gwy_data_view_coords_xy_clamp (<em class="parameter"><code><a class="link" href=
 area (which can be smaller than widget size).</p>
 <div class="refsect3">
 <a name="gwy-data-view-coords-xy-clamp.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -906,7 +906,7 @@ gwy_data_view_coords_xy_cut_line (<em class="parameter"><code><a class="link" hr
 area (which can be smaller than widget size).</p>
 <div class="refsect3">
 <a name="gwy-data-view-coords-xy-cut-line.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -961,7 +961,7 @@ account.  Coordinates <em class="parameter"><code>xreal</code></em>
 top left field corner.</p>
 <div class="refsect3">
 <a name="gwy-data-view-coords-xy-to-real.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1015,7 +1015,7 @@ account.  Coordinates <em class="parameter"><code>xreal</code></em>
 top left field corner.</p>
 <div class="refsect3">
 <a name="gwy-data-view-coords-real-to-xy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1071,7 +1071,7 @@ account.  Coordinates <em class="parameter"><code>xreal</code></em>
 top left field corner.</p>
 <div class="refsect3">
 <a name="gwy-data-view-coords-real-to-xy-float.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1119,7 +1119,7 @@ gwy_data_view_get_xmeasure (<em class="parameter"><code><a class="link" href="Gw
 screen lengths in pixels.</p>
 <div class="refsect3">
 <a name="gwy-data-view-get-xmeasure.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1146,7 +1146,7 @@ gwy_data_view_get_ymeasure (<em class="parameter"><code><a class="link" href="Gw
 screen lengths in pixels.</p>
 <div class="refsect3">
 <a name="gwy-data-view-get-ymeasure.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1177,7 +1177,7 @@ by <a href="../GwyDataField.html#gwy-data-field-get-xres"><code class="function"
 field displayed by the base layer.</p>
 <div class="refsect3">
 <a name="gwy-data-view-get-pixel-data-sizes.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1217,7 +1217,7 @@ by <a href="../GwyDataField.html#gwy-data-field-get-xreal"><code class="function
 field displayed by the base layer.</p>
 <div class="refsect3">
 <a name="gwy-data-view-get-real-data-sizes.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1259,7 +1259,7 @@ by <a href="../GwyDataField.html#gwy-data-field-get-xoffset"><code class="functi
 field displayed by the base layer.</p>
 <div class="refsect3">
 <a name="gwy-data-view-get-real-data-offsets.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1301,7 +1301,7 @@ to screen distances.  It is to be used with functions like
 distance should be screen-Euclidean.</p>
 <div class="refsect3">
 <a name="gwy-data-view-get-metric.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1335,7 +1335,7 @@ gwy_data_view_get_pixbuf (<em class="parameter"><code><a class="link" href="GwyD
 The returned pixbuf also never has an alpha channel.</p>
 <div class="refsect3">
 <a name="gwy-data-view-get-pixbuf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1382,7 +1382,7 @@ gwy_data_view_export_pixbuf (<em class="parameter"><code><a class="link" href="G
 <p>Exports data view to a pixbuf.</p>
 <div class="refsect3">
 <a name="gwy-data-view-export-pixbuf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1481,7 +1481,7 @@ once the old layer is unplugged, then ::layer-plugged when the new
 is plugged.</p>
 <div class="refsect3">
 <a name="GwyDataView-layer-plugged.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1522,7 +1522,7 @@ once the old layer is unplugged, then ::layer-plugged when the new
 is plugged.</p>
 <div class="refsect3">
 <a name="GwyDataView-layer-unplugged.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1560,7 +1560,7 @@ an update.  That is, when it's the right time to get a new pixbuf from
 <a class="link" href="GwyDataView.html#gwy-data-view-get-pixbuf" title="gwy_data_view_get_pixbuf ()"><code class="function">gwy_data_view_get_pixbuf()</code></a>.</p>
 <div class="refsect3">
 <a name="GwyDataView-redrawn.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1596,7 +1596,7 @@ Its purpose is to subvert the normal resizing logic of <a class="link" href="Gwy
 an explicit resize is needed).  You should usually ignore it.</p>
 <div class="refsect3">
 <a name="GwyDataView-resized.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyDataViewLayer.html b/devel-docs/libgwydgets/html/GwyDataViewLayer.html
index 2106df9..4612527 100644
--- a/devel-docs/libgwydgets/html/GwyDataViewLayer.html
+++ b/devel-docs/libgwydgets/html/GwyDataViewLayer.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyDataViewLayer: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="DataWindowWidgets.html" title="Data Windows and Views">
 <link rel="prev" href="GwyDataView.html" title="GwyDataView">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyDataViewLayer.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -86,7 +86,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyDataViewLayer.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -113,7 +113,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyDataViewLayer.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -161,7 +161,7 @@ gwy_data_view_layer_plugged (<em class="parameter"><code><a class="link" href="G
 <p>Primarily intended for <a class="link" href="GwyDataView.html" title="GwyDataView"><span class="type">GwyDataView</span></a> implementation.</p>
 <div class="refsect3">
 <a name="gwy-data-view-layer-plugged.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -184,7 +184,7 @@ gwy_data_view_layer_unplugged (<em class="parameter"><code><a class="link" href=
 <p>Primarily intended for <a class="link" href="GwyDataView.html" title="GwyDataView"><span class="type">GwyDataView</span></a> implementation.</p>
 <div class="refsect3">
 <a name="gwy-data-view-layer-unplugged.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -206,7 +206,7 @@ gwy_data_view_layer_updated (<em class="parameter"><code><a class="link" href="G
 <p>Emits a "updated" singal on a layer.</p>
 <div class="refsect3">
 <a name="gwy-data-view-layer-updated.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -229,7 +229,7 @@ gwy_data_view_layer_realize (<em class="parameter"><code><a class="link" href="G
 display-specific resources.</p>
 <div class="refsect3">
 <a name="gwy-data-view-layer-realize.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -252,7 +252,7 @@ gwy_data_view_layer_unrealize (<em class="parameter"><code><a class="link" href=
 display-specific resources.</p>
 <div class="refsect3">
 <a name="gwy-data-view-layer-unrealize.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -305,7 +305,7 @@ user_function (<a class="link" href="GwyDataViewLayer.html" title="GwyDataViewLa
 a <a class="link" href="GwyDataView.html" title="GwyDataView"><span class="type">GwyDataView</span></a>.</p>
 <div class="refsect3">
 <a name="GwyDataViewLayer-plugged.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -337,7 +337,7 @@ user_function (<a class="link" href="GwyDataViewLayer.html" title="GwyDataViewLa
 from its <a class="link" href="GwyDataView.html" title="GwyDataView"><span class="type">GwyDataView</span></a>.</p>
 <div class="refsect3">
 <a name="GwyDataViewLayer-unplugged.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -369,7 +369,7 @@ user_function (<a class="link" href="GwyDataViewLayer.html" title="GwyDataViewLa
 the exact means how a layer can be updated depends its type.</p>
 <div class="refsect3">
 <a name="GwyDataViewLayer-updated.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyDataWindow.html b/devel-docs/libgwydgets/html/GwyDataWindow.html
index 587092a..6883b72 100644
--- a/devel-docs/libgwydgets/html/GwyDataWindow.html
+++ b/devel-docs/libgwydgets/html/GwyDataWindow.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyDataWindow: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="DataWindowWidgets.html" title="Data Windows and Views">
 <link rel="prev" href="DataWindowWidgets.html" title="Data Windows and Views">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyDataWindow.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -134,7 +134,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyDataWindow.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -170,7 +170,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyDataWindow.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -224,7 +224,7 @@ gwy_data_window_new (<em class="parameter"><code><a class="link" href="GwyDataVi
 <p>Creates a new data displaying window.</p>
 <div class="refsect3">
 <a name="gwy-data-window-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -250,7 +250,7 @@ gwy_data_window_get_data_view (<em class="parameter"><code><a class="link" href=
 <p>Returns the data view widget a data window currently shows.</p>
 <div class="refsect3">
 <a name="gwy-data-window-get-data-view.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -276,7 +276,7 @@ gwy_data_window_get_color_axis (<em class="parameter"><code><a class="link" href
 <p>Returns the color axis widget displayed by a data window.</p>
 <div class="refsect3">
 <a name="gwy-data-window-get-color-axis.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -302,7 +302,7 @@ gwy_data_window_get_data (<em class="parameter"><code><a class="link" href="GwyD
 <p>Returns the data for the data view a data window currently shows.</p>
 <div class="refsect3">
 <a name="gwy-data-window-get-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -335,7 +335,7 @@ Otherwise the new zoom value is set to <em class="parameter"><code>izoom</code><
 /10000.</p>
 <div class="refsect3">
 <a name="gwy-data-window-set-zoom.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -364,7 +364,7 @@ gwy_data_window_get_data_name (<em class="parameter"><code><a class="link" href=
 <p>Gets the data name part of a data window's title.</p>
 <div class="refsect3">
 <a name="gwy-data-window-get-data-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -392,7 +392,7 @@ gwy_data_window_set_data_name (<em class="parameter"><code><a class="link" href=
 <p>The data name is used in the window's title.</p>
 <div class="refsect3">
 <a name="gwy-data-window-set-data-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -422,7 +422,7 @@ gwy_data_window_get_ul_corner_widget (<em class="parameter"><code><a class="link
 .</p>
 <div class="refsect3">
 <a name="gwy-data-window-get-ul-corner-widget.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -451,7 +451,7 @@ gwy_data_window_set_ul_corner_widget (<em class="parameter"><code><a class="link
 .</p>
 <div class="refsect3">
 <a name="gwy-data-window-set-ul-corner-widget.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -488,7 +488,7 @@ the class instantiates one on its own.  You can normally obtain it with
 the tooltips in either case.</p>
 <div class="refsect3">
 <a name="gwy-data-window-class-set-tooltips.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyGraph.html b/devel-docs/libgwydgets/html/GwyGraph.html
index 0da4b51..d23170f 100644
--- a/devel-docs/libgwydgets/html/GwyGraph.html
+++ b/devel-docs/libgwydgets/html/GwyGraph.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyGraph: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GraphWidgets.html" title="Graphs">
 <link rel="prev" href="GraphWidgets.html" title="Graphs">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyGraph.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -135,7 +135,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGraph.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -151,7 +151,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGraph.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -212,7 +212,7 @@ gwy_graph_new (<em class="parameter"><code><a class="link" href="GwyGraphModel.h
 <p>Creates graph widget based on information in model.</p>
 <div class="refsect3">
 <a name="gwy-graph-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -239,7 +239,7 @@ gwy_graph_get_axis (<em class="parameter"><code><a class="link" href="GwyGraph.h
 <p>Gets a graph axis.</p>
 <div class="refsect3">
 <a name="gwy-graph-get-axis.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -275,7 +275,7 @@ gwy_graph_set_axis_visible (<em class="parameter"><code><a class="link" href="Gw
 can be set also directly using GwyAxis API.</p>
 <div class="refsect3">
 <a name="gwy-graph-set-axis-visible.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -309,7 +309,7 @@ gwy_graph_get_area (<em class="parameter"><code><a class="link" href="GwyGraph.h
 <p>Gets the area widget of a graph.</p>
 <div class="refsect3">
 <a name="gwy-graph-get-area.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -337,7 +337,7 @@ gwy_graph_set_model (<em class="parameter"><code><a class="link" href="GwyGraph.
 <p>Everything in graph widgets will be reset to reflect the new data.</p>
 <div class="refsect3">
 <a name="gwy-graph-set-model.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -366,7 +366,7 @@ gwy_graph_get_model (<em class="parameter"><code><a class="link" href="GwyGraph.
 <p>Gets the model of a graph.</p>
 <div class="refsect3">
 <a name="gwy-graph-get-model.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -395,7 +395,7 @@ gwy_graph_set_status (<em class="parameter"><code><a class="link" href="GwyGraph
 This includes point or area selection and zooming.</p>
 <div class="refsect3">
 <a name="gwy-graph-set-status.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -425,7 +425,7 @@ gwy_graph_get_status (<em class="parameter"><code><a class="link" href="GwyGraph
 <p>See <a class="link" href="GwyGraph.html#gwy-graph-set-status" title="gwy_graph_set_status ()"><code class="function">gwy_graph_set_status()</code></a> for more.</p>
 <div class="refsect3">
 <a name="gwy-graph-get-status.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -453,7 +453,7 @@ gwy_graph_enable_user_input (<em class="parameter"><code><a class="link" href="G
 mouse clicks.</p>
 <div class="refsect3">
 <a name="gwy-graph-enable-user-input.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -485,7 +485,7 @@ gwy_graph_export_pixmap (<em class="parameter"><code><a class="link" href="GwyGr
 <p>Renders a graph widget into a pixbuf.</p>
 <div class="refsect3">
 <a name="gwy-graph-export-pixmap.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -532,7 +532,7 @@ gwy_graph_export_postscript (<em class="parameter"><code><a class="link" href="G
 <p>Approximately renders a graph widget in PostScript.</p>
 <div class="refsect3">
 <a name="gwy-graph-export-postscript.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyGraphArea.html b/devel-docs/libgwydgets/html/GwyGraphArea.html
index b7e5666..805844d 100644
--- a/devel-docs/libgwydgets/html/GwyGraphArea.html
+++ b/devel-docs/libgwydgets/html/GwyGraphArea.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyGraphArea: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GraphWidgets.html" title="Graphs">
 <link rel="prev" href="GwyGraphCurveModel.html" title="GwyGraphCurveModel">
@@ -37,7 +37,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyGraphArea.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -198,7 +198,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGraphArea.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -213,7 +213,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGraphArea.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -228,7 +228,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGraphArea.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -294,7 +294,7 @@ gwy_graph_area_get_label (<em class="parameter"><code><a class="link" href="GwyG
 <p>Gets the label inside a graph area.</p>
 <div class="refsect3">
 <a name="gwy-graph-area-get-label.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -321,7 +321,7 @@ gwy_graph_area_set_model (<em class="parameter"><code><a class="link" href="GwyG
 <p>Sets the graph model of a graph area.</p>
 <div class="refsect3">
 <a name="gwy-graph-area-set-model.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -350,7 +350,7 @@ gwy_graph_area_get_model (<em class="parameter"><code><a class="link" href="GwyG
 <p>Gets the model of a graph area.</p>
 <div class="refsect3">
 <a name="gwy-graph-area-get-model.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -378,7 +378,7 @@ gwy_graph_area_get_cursor (<em class="parameter"><code><a class="link" href="Gwy
 <p>Gets mouse cursor related values within a graph area.</p>
 <div class="refsect3">
 <a name="gwy-graph-area-get-cursor.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -414,7 +414,7 @@ gwy_graph_area_set_x_range (<em class="parameter"><code><a class="link" href="Gw
 <p>Sets the horizontal range a graph area displays.</p>
 <div class="refsect3">
 <a name="gwy-graph-area-set-x-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -450,7 +450,7 @@ gwy_graph_area_set_y_range (<em class="parameter"><code><a class="link" href="Gw
 <p>Sets the vertical range a graph area displays.</p>
 <div class="refsect3">
 <a name="gwy-graph-area-set-y-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -486,7 +486,7 @@ gwy_graph_area_set_x_grid_data (<em class="parameter"><code><a class="link" href
 <p>Sets the grid data on the x-axis of a graph area</p>
 <div class="refsect3">
 <a name="gwy-graph-area-set-x-grid-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -524,7 +524,7 @@ gwy_graph_area_set_y_grid_data (<em class="parameter"><code><a class="link" href
 <p>Sets the grid data on the y-axis of a graph area</p>
 <div class="refsect3">
 <a name="gwy-graph-area-set-y-grid-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -561,7 +561,7 @@ gwy_graph_area_get_x_grid_data (<em class="parameter"><code><a class="link" href
 <p>Gets the grid data on the x-axis of a graph area.</p>
 <div class="refsect3">
 <a name="gwy-graph-area-get-x-grid-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -596,7 +596,7 @@ gwy_graph_area_get_y_grid_data (<em class="parameter"><code><a class="link" href
 <p>Gets the grid data on the y-axis of a graph area.</p>
 <div class="refsect3">
 <a name="gwy-graph-area-get-y-grid-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -634,7 +634,7 @@ therefore also selections for other modes than the currently active one can
 be requested.</p>
 <div class="refsect3">
 <a name="gwy-graph-area-get-selection.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -675,7 +675,7 @@ gwy_graph_area_set_status (<em class="parameter"><code><a class="link" href="Gwy
 (also see this function for details).</p>
 <div class="refsect3">
 <a name="gwy-graph-area-set-status.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -705,7 +705,7 @@ gwy_graph_area_get_status (<em class="parameter"><code><a class="link" href="Gwy
 <p>See <a class="link" href="GwyGraphArea.html#gwy-graph-area-set-status" title="gwy_graph_area_set_status ()"><code class="function">gwy_graph_area_set_status()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-graph-area-get-status.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -737,7 +737,7 @@ gwy_graph_area_draw_on_drawable (<em class="parameter"><code><a class="link" hre
 <p>Draws a graph area to a Gdk drawable.</p>
 <div class="refsect3">
 <a name="gwy-graph-area-draw-on-drawable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -798,7 +798,7 @@ gwy_graph_area_export_vector (<em class="parameter"><code><a class="link" href="
 <p>Creates PostScript representation of a graph area.</p>
 <div class="refsect3">
 <a name="gwy-graph-area-export-vector.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -851,7 +851,7 @@ mouse).</p>
 Use <a class="link" href="GwyGraphArea.html#gwy-graph-area-set-selection-editable" title="gwy_graph_area_set_selection_editable ()"><code class="function">gwy_graph_area_set_selection_editable()</code></a> for that.</p>
 <div class="refsect3">
 <a name="gwy-graph-area-enable-user-input.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -884,7 +884,7 @@ the selection type that can be drawn on the area.  However, the user cannot
 modify it.</p>
 <div class="refsect3">
 <a name="gwy-graph-area-set-selection-editable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -916,7 +916,7 @@ gwy_graph_area_edit_curve (<em class="parameter"><code><a class="link" href="Gwy
 <p>If the dialog is already displayed, it is switched to the requested curve.</p>
 <div class="refsect3">
 <a name="gwy-graph-area-edit-curve.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -980,7 +980,7 @@ user_function (<a class="link" href="GwyGraphArea.html" title="GwyGraphArea"><sp
 edited.</p>
 <div class="refsect3">
 <a name="GwyGraphArea-edit-curve.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyGraphCorner.html b/devel-docs/libgwydgets/html/GwyGraphCorner.html
index c7205cb..2ba2e5d 100644
--- a/devel-docs/libgwydgets/html/GwyGraphCorner.html
+++ b/devel-docs/libgwydgets/html/GwyGraphCorner.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyGraphCorner: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GraphWidgets.html" title="Graphs">
 <link rel="prev" href="GwyGraphCurves.html" title="GwyGraphCurves">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyGraphCorner.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -52,7 +52,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGraphCorner.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
diff --git a/devel-docs/libgwydgets/html/GwyGraphCurveModel.html b/devel-docs/libgwydgets/html/GwyGraphCurveModel.html
index 6996271..a130e6f 100644
--- a/devel-docs/libgwydgets/html/GwyGraphCurveModel.html
+++ b/devel-docs/libgwydgets/html/GwyGraphCurveModel.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyGraphCurveModel: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GraphWidgets.html" title="Graphs">
 <link rel="prev" href="GwyGraphModel.html" title="GwyGraphModel">
@@ -37,7 +37,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyGraphCurveModel.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -172,7 +172,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGraphCurveModel.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -221,7 +221,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGraphCurveModel.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -236,7 +236,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGraphCurveModel.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -284,7 +284,7 @@ fully reconstruct it.</p>
 typecasting.</p>
 <div class="refsect3">
 <a name="gwy-graph-curve-model-duplicate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -319,7 +319,7 @@ gwy_graph_curve_model_new_alike (<em class="parameter"><code><a class="link" hre
 <p>Curve data are not duplicated.</p>
 <div class="refsect3">
 <a name="gwy-graph-curve-model-new-alike.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -356,7 +356,7 @@ can use <a class="link" href="GwyGraphCurveModel.html#gwy-graph-curve-model-enfo
 recommended data point order.</div>
 <div class="refsect3">
 <a name="gwy-graph-curve-model-set-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -401,7 +401,9 @@ gwy_graph_curve_model_set_data_interleaved
                                 <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> n</code></em>);</pre>
 <p>Sets curve model data from an interleaved array.</p>
 <p>The array should contain interleaved abscissa and ordinate values:
-x0, x0, x1, y1, x2, y2, etc.</p>
+x0, y0, x1, y1, x2, y2, etc.  You can also typecast an array of <span class="type">GwyXY</span>
+structs and pass it as <em class="parameter"><code>xydata</code></em>
+.</p>
 <p>If there were calibration data in the former <em class="parameter"><code>gcmodel</code></em>
 , they are removed.</p>
 <div class="warning">The points should be ordered in ascending abscissa order, meaning
@@ -412,7 +414,7 @@ can use <a class="link" href="GwyGraphCurveModel.html#gwy-graph-curve-model-enfo
 recommended data point order.</div>
 <div class="refsect3">
 <a name="gwy-graph-curve-model-set-data-interleaved.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -426,7 +428,7 @@ recommended data point order.</div>
 </tr>
 <tr>
 <td class="parameter_name"><p>xydata</p></td>
-<td class="parameter_description"><p>X data points (array of size 2*<em class="parameter"><code>n</code></em>
+<td class="parameter_description"><p>X and Y data points (array of size 2*<em class="parameter"><code>n</code></em>
 ).</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
@@ -463,7 +465,7 @@ gwy_graph_curve_model_set_data_from_dataline
 , they are removed.</p>
 <div class="refsect3">
 <a name="gwy-graph-curve-model-set-data-from-dataline.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -506,7 +508,7 @@ disrupting the order again.  See its documentation for further remarks.</p>
 <p>The "data-changed" signal is emitted if the data order actually changes.</p>
 <div class="refsect3">
 <a name="gwy-graph-curve-model-enforce-order.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -534,7 +536,7 @@ ordered in both orders.</p>
 <p>See <a class="link" href="GwyGraphCurveModel.html#gwy-graph-curve-model-enforce-order" title="gwy_graph_curve_model_enforce_order ()"><code class="function">gwy_graph_curve_model_enforce_order()</code></a> for fixing the point order.</p>
 <div class="refsect3">
 <a name="gwy-graph-curve-model-is-ordered.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -565,7 +567,7 @@ returned pointer is valid only so long as the curve model exists and its
 data do not change.</p>
 <div class="refsect3">
 <a name="gwy-graph-curve-model-get-xdata.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -594,7 +596,7 @@ returned pointer is valid only so long as the curve model exists and its
 data do not change.</p>
 <div class="refsect3">
 <a name="gwy-graph-curve-model-get-ydata.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -620,7 +622,7 @@ gwy_graph_curve_model_get_ndata (<em class="parameter"><code><a class="link" hre
 <p>Gets the number of points in a graph curve model.</p>
 <div class="refsect3">
 <a name="gwy-graph-curve-model-get-ndata.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -655,7 +657,7 @@ and the function returns <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macr
 <p>See also <a class="link" href="GwyGraphCurveModel.html#gwy-graph-curve-model-get-ranges" title="gwy_graph_curve_model_get_ranges ()"><code class="function">gwy_graph_curve_model_get_ranges()</code></a> for a more high-level function.</p>
 <div class="refsect3">
 <a name="gwy-graph-curve-model-get-x-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -704,7 +706,7 @@ and the function returns <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macr
 <p>See also <a class="link" href="GwyGraphCurveModel.html#gwy-graph-curve-model-get-ranges" title="gwy_graph_curve_model_get_ranges ()"><code class="function">gwy_graph_curve_model_get_ranges()</code></a> for a more high-level function.</p>
 <div class="refsect3">
 <a name="gwy-graph-curve-model-get-y-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -765,7 +767,7 @@ logarithmical scale setup, the output arguments are untouched and <a href="/usr/
 returned.</p>
 <div class="refsect3">
 <a name="gwy-graph-curve-model-get-ranges.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -825,7 +827,7 @@ gwy_graph_curve_model_get_calibration_data
 <p>Get pointer to actual calibration data for curve.</p>
 <div class="refsect3">
 <a name="gwy-graph-curve-model-get-calibration-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -856,7 +858,7 @@ gwy_graph_curve_model_set_calibration_data
 .</p>
 <div class="refsect3">
 <a name="gwy-graph-curve-model-set-calibration-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -970,7 +972,7 @@ user_function (<a class="link" href="GwyGraphCurveModel.html" title="GwyGraphCur
 a function like <a class="link" href="GwyGraphCurveModel.html#gwy-graph-curve-model-set-data" title="gwy_graph_curve_model_set_data ()"><code class="function">gwy_graph_curve_model_set_data()</code></a>.</p>
 <div class="refsect3">
 <a name="GwyGraphCurveModel-data-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyGraphCurves.html b/devel-docs/libgwydgets/html/GwyGraphCurves.html
index 7cd2fad..dd2aeef 100644
--- a/devel-docs/libgwydgets/html/GwyGraphCurves.html
+++ b/devel-docs/libgwydgets/html/GwyGraphCurves.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyGraphCurves: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GraphWidgets.html" title="Graphs">
 <link rel="prev" href="GwyGraphData.html" title="GwyGraphData">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyGraphCurves.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -70,7 +70,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGraphCurves.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -126,7 +126,7 @@ gwy_graph_curves_new (<em class="parameter"><code><a class="link" href="GwyGraph
 changed manually.</p>
 <div class="refsect3">
 <a name="gwy-graph-curves-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -154,7 +154,7 @@ gwy_graph_curves_set_model (<em class="parameter"><code><a class="link" href="Gw
 <p>Changes the graph model a graph curve list.</p>
 <div class="refsect3">
 <a name="gwy-graph-curves-set-model.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -184,7 +184,7 @@ gwy_graph_curves_get_model (<em class="parameter"><code><a class="link" href="Gw
 <p>Gets the graph model a graph curve list displays.</p>
 <div class="refsect3">
 <a name="gwy-graph-curves-get-model.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyGraphData.html b/devel-docs/libgwydgets/html/GwyGraphData.html
index 434396b..d2cd18d 100644
--- a/devel-docs/libgwydgets/html/GwyGraphData.html
+++ b/devel-docs/libgwydgets/html/GwyGraphData.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyGraphData: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GraphWidgets.html" title="Graphs">
 <link rel="prev" href="GwyGraphLabel.html" title="GwyGraphLabel">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyGraphData.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -70,7 +70,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGraphData.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -126,7 +126,7 @@ gwy_graph_data_new (<em class="parameter"><code><a class="link" href="GwyGraphMo
 changed manually.</p>
 <div class="refsect3">
 <a name="gwy-graph-data-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -153,7 +153,7 @@ gwy_graph_data_set_model (<em class="parameter"><code><a class="link" href="GwyG
 <p>Changes the graph model a graph data table displays.</p>
 <div class="refsect3">
 <a name="gwy-graph-data-set-model.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -182,7 +182,7 @@ gwy_graph_data_get_model (<em class="parameter"><code><a class="link" href="GwyG
 <p>Gets the graph model a graph data table displays.</p>
 <div class="refsect3">
 <a name="gwy-graph-data-get-model.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyGraphLabel.html b/devel-docs/libgwydgets/html/GwyGraphLabel.html
index 47f65c8..bb55cec 100644
--- a/devel-docs/libgwydgets/html/GwyGraphLabel.html
+++ b/devel-docs/libgwydgets/html/GwyGraphLabel.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyGraphLabel: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GraphWidgets.html" title="Graphs">
 <link rel="prev" href="libgwydgets-GwyGraphBasics.html" title="GwyGraphBasics">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyGraphLabel.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -94,7 +94,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGraphLabel.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -157,7 +157,7 @@ gwy_graph_label_set_model (<em class="parameter"><code><a class="link" href="Gwy
 <p>Sets new model of a graph label.</p>
 <div class="refsect3">
 <a name="gwy-graph-label-set-model.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -186,7 +186,7 @@ gwy_graph_label_get_model (<em class="parameter"><code><a class="link" href="Gwy
 <p>Gets the model of a graph key.</p>
 <div class="refsect3">
 <a name="gwy-graph-label-get-model.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -214,7 +214,7 @@ gwy_graph_label_enable_user_input (<em class="parameter"><code><a class="link" h
 <p>Enables or disables user input to a graph label.</p>
 <div class="refsect3">
 <a name="gwy-graph-label-enable-user-input.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -250,7 +250,7 @@ gwy_graph_label_draw_on_drawable (<em class="parameter"><code><a class="link" hr
 <p>draws a graph label on a drawable</p>
 <div class="refsect3">
 <a name="gwy-graph-label-draw-on-drawable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -315,7 +315,7 @@ gwy_graph_label_export_vector (<em class="parameter"><code><a class="link" href=
 <p>Creates PostScript representation of a graph label.</p>
 <div class="refsect3">
 <a name="gwy-graph-label-export-vector.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyGraphModel.html b/devel-docs/libgwydgets/html/GwyGraphModel.html
index c30e1d2..c41c5f8 100644
--- a/devel-docs/libgwydgets/html/GwyGraphModel.html
+++ b/devel-docs/libgwydgets/html/GwyGraphModel.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyGraphModel: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GraphWidgets.html" title="Graphs">
 <link rel="prev" href="GwyGraphWindow.html" title="GwyGraphWindow">
@@ -37,7 +37,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyGraphModel.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -221,7 +221,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGraphModel.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -370,7 +370,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGraphModel.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -392,7 +392,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGraphModel.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -440,7 +440,7 @@ reconstruct it.</p>
 typecasting.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-duplicate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -476,7 +476,7 @@ gwy_graph_model_new_alike (<em class="parameter"><code><a class="link" href="Gwy
 Curves are not duplicated or referenced.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-new-alike.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -502,7 +502,7 @@ gwy_graph_model_get_n_curves (<em class="parameter"><code><a class="link" href="
 <p>Reports the number of curves in a graph model.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-get-n-curves.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -529,7 +529,7 @@ gwy_graph_model_add_curve (<em class="parameter"><code><a class="link" href="Gwy
 <p>Adds a new curve to a graph model.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-add-curve.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -566,7 +566,7 @@ gwy_graph_model_remove_curve_by_description
 .</p>
 <div class="refsect3">
 <a name="gwy-graph-model-remove-curve-by-description.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -600,7 +600,7 @@ gwy_graph_model_remove_curve (<em class="parameter"><code><a class="link" href="
 <p>Removes the curve having given index.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-remove-curve.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -631,7 +631,7 @@ gwy_graph_model_get_curve_by_description
 <p>Finds a graph curve model in a graph model by its description.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-get-curve-by-description.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -666,7 +666,7 @@ gwy_graph_model_get_curve (<em class="parameter"><code><a class="link" href="Gwy
 <p>Gets a graph curve model in a graph model by its index.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-get-curve.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -701,7 +701,7 @@ gwy_graph_model_get_curve_index (<em class="parameter"><code><a class="link" hre
 <p>Finds the index of a graph model curve.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-get-curve-index.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -737,7 +737,7 @@ gwy_graph_model_remove_all_curves (<em class="parameter"><code><a class="link" h
 <p>Removes all the curves from graph model</p>
 <div class="refsect3">
 <a name="gwy-graph-model-remove-all-curves.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -774,7 +774,7 @@ in <em class="parameter"><code>gmodel</code></em>
 couples of curves (e.g. data and fit) that should have the same color, etc.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-append-curves.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -811,7 +811,7 @@ gwy_graph_model_set_units_from_data_line
 <p>Sets x and y graph model units to match a data line.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-set-units-from-data-line.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -843,7 +843,7 @@ gwy_graph_model_units_are_compatible (<em class="parameter"><code><a class="link
 graphs.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-units-are-compatible.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -879,7 +879,7 @@ gwy_graph_model_x_data_can_be_logarithmed
 <p>Checks whehter x axis can be lograrithmed.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-x-data-can-be-logarithmed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -907,7 +907,7 @@ gwy_graph_model_y_data_can_be_logarithmed
 <p>Checks whehter y axis can be lograrithmed.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-y-data-can-be-logarithmed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -936,7 +936,7 @@ gwy_graph_model_set_axis_label (<em class="parameter"><code><a class="link" href
 <p>Sets one axis label of a graph model.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-set-axis-label.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -971,7 +971,7 @@ gwy_graph_model_get_axis_label (<em class="parameter"><code><a class="link" href
 <p>Gets the label of a one graph model axis.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-get-axis-label.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1008,7 +1008,7 @@ gwy_graph_model_get_x_range (<em class="parameter"><code><a class="link" href="G
 values calculated from curve abscissa ranges.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-get-x-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1051,7 +1051,7 @@ gwy_graph_model_get_y_range (<em class="parameter"><code><a class="link" href="G
 values calculated from curve ordinate ranges.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-get-y-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1097,7 +1097,7 @@ gwy_graph_model_get_ranges (<em class="parameter"><code><a class="link" href="Gw
 <p>See <a class="link" href="GwyGraphCurveModel.html#gwy-graph-curve-model-get-ranges" title="gwy_graph_curve_model_get_ranges ()"><code class="function">gwy_graph_curve_model_get_ranges()</code></a> for discussion.</p>
 <div class="refsect3">
 <a name="gwy-graph-model-get-ranges.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1164,7 +1164,7 @@ gwy_graph_model_export_ascii (<em class="parameter"><code><a class="link" href="
 .</p>
 <div class="refsect3">
 <a name="gwy-graph-model-export-ascii.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1469,7 +1469,7 @@ user_function (<a class="link" href="GwyGraphModel.html" title="GwyGraphModel"><
 in a graph model emits <a class="link" href="GwyGraphCurveModel.html#GwyGraphCurveModel-data-changed" title="The “data-changed” signal"><span class="type">“data-changed”</span></a>.</p>
 <div class="refsect3">
 <a name="GwyGraphModel-curve-data-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1508,7 +1508,7 @@ user_function (<a class="link" href="GwyGraphModel.html" title="GwyGraphModel"><
 in a graph model emits <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-notify"><span class="type">“notify”</span></a>.</p>
 <div class="refsect3">
 <a name="GwyGraphModel-curve-notify.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyGraphWindow.html b/devel-docs/libgwydgets/html/GwyGraphWindow.html
index bb9b5ef..04a47e5 100644
--- a/devel-docs/libgwydgets/html/GwyGraphWindow.html
+++ b/devel-docs/libgwydgets/html/GwyGraphWindow.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyGraphWindow: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GraphWidgets.html" title="Graphs">
 <link rel="prev" href="GwyGraph.html" title="GwyGraph">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyGraphWindow.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -94,7 +94,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGraphWindow.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -150,7 +150,7 @@ gwy_graph_window_new (<em class="parameter"><code><a class="link" href="GwyGraph
 .</p>
 <div class="refsect3">
 <a name="gwy-graph-window-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -176,7 +176,7 @@ gwy_graph_window_get_graph (<em class="parameter"><code><a class="link" href="Gw
 <p>Gets the graph widget a graph window currently shows.</p>
 <div class="refsect3">
 <a name="gwy-graph-window-get-graph.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -202,7 +202,7 @@ gwy_graph_window_get_graph_data (<em class="parameter"><code><a class="link" hre
 <p>Gets the graph data widget of a graph window.</p>
 <div class="refsect3">
 <a name="gwy-graph-window-get-graph-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -230,7 +230,7 @@ gwy_graph_window_get_graph_curves (<em class="parameter"><code><a class="link" h
 <p>Gets the graph curves widget of a graph window.</p>
 <div class="refsect3">
 <a name="gwy-graph-window-get-graph-curves.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -265,7 +265,7 @@ the class instantiates one on its own.  You can normally obtain it with
 the tooltips in either case.</p>
 <div class="refsect3">
 <a name="gwy-graph-window-class-set-tooltips.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyHMarkerBox.html b/devel-docs/libgwydgets/html/GwyHMarkerBox.html
index d6b0e55..ef934bd 100644
--- a/devel-docs/libgwydgets/html/GwyHMarkerBox.html
+++ b/devel-docs/libgwydgets/html/GwyHMarkerBox.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyHMarkerBox: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GeneralWidgets.html" title="General Widgets">
 <link rel="prev" href="GwyMarkerBox.html" title="GwyMarkerBox">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyHMarkerBox.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -52,7 +52,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyHMarkerBox.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
diff --git a/devel-docs/libgwydgets/html/GwyHRuler.html b/devel-docs/libgwydgets/html/GwyHRuler.html
index 8c4509f..80fc52a 100644
--- a/devel-docs/libgwydgets/html/GwyHRuler.html
+++ b/devel-docs/libgwydgets/html/GwyHRuler.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyHRuler: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GeneralWidgets.html" title="General Widgets">
 <link rel="prev" href="GwyRuler.html" title="GwyRuler">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyHRuler.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -52,7 +52,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyHRuler.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
diff --git a/devel-docs/libgwydgets/html/GwyInventoryStore.html b/devel-docs/libgwydgets/html/GwyInventoryStore.html
index 9d81182..148c3ca 100644
--- a/devel-docs/libgwydgets/html/GwyInventoryStore.html
+++ b/devel-docs/libgwydgets/html/GwyInventoryStore.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyInventoryStore: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GeneralWidgets.html" title="General Widgets">
 <link rel="prev" href="GwyShader.html" title="GwyShader">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyInventoryStore.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -86,7 +86,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyInventoryStore.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -141,7 +141,7 @@ gwy_inventory_store_new (<em class="parameter"><code><a href="../GwyInventory.ht
 <p>Creates a new <a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk3GtkTreeModel.html#GtkTreeModel-struct"><span class="type">GtkTreeModel</span></a> wrapper around a <a href="../GwyInventory.html#GwyInventory-struct"><span class="type">GwyInventory</span></a>.</p>
 <div class="refsect3">
 <a name="gwy-inventory-store-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -167,7 +167,7 @@ gwy_inventory_store_get_inventory (<em class="parameter"><code><a class="link" h
 <p>Gets the inventory a inventory store wraps.</p>
 <div class="refsect3">
 <a name="gwy-inventory-store-get-inventory.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -198,7 +198,7 @@ gwy_inventory_store_get_column_by_name
 <code class="literal">"item"</code> which always works (and always maps to 0).</p>
 <div class="refsect3">
 <a name="gwy-inventory-store-get-column-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -233,7 +233,7 @@ gwy_inventory_store_get_iter (<em class="parameter"><code><a class="link" href="
 <p>Initializes a tree iterator to row corresponding to a inventory item.</p>
 <div class="refsect3">
 <a name="gwy-inventory-store-get-iter.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -277,7 +277,7 @@ gwy_inventory_store_iter_is_valid (<em class="parameter"><code><a class="link" h
 purposes.</div>
 <div class="refsect3">
 <a name="gwy-inventory-store-iter-is-valid.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyLayerBasic.html b/devel-docs/libgwydgets/html/GwyLayerBasic.html
index 5656b89..2fd5a3c 100644
--- a/devel-docs/libgwydgets/html/GwyLayerBasic.html
+++ b/devel-docs/libgwydgets/html/GwyLayerBasic.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyLayerBasic: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="DataWindowWidgets.html" title="Data Windows and Views">
 <link rel="prev" href="GwyVectorLayer.html" title="GwyVectorLayer">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyLayerBasic.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -139,7 +139,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyLayerBasic.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -180,7 +180,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyLayerBasic.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -195,7 +195,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyLayerBasic.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -263,7 +263,7 @@ ther range corresponding to the underlying data even if a presentation is
 shown instead.</p>
 <div class="refsect3">
 <a name="gwy-layer-basic-get-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -297,7 +297,7 @@ gwy_layer_basic_get_range_type (<em class="parameter"><code><a class="link" href
 <p>Gets the current color mapping mode.</p>
 <div class="refsect3">
 <a name="gwy-layer-basic-get-range-type.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -325,7 +325,7 @@ gwy_layer_basic_set_gradient_key (<em class="parameter"><code><a class="link" hr
 <p>Sets the container key of the colour gradient to use to visualize data.</p>
 <div class="refsect3">
 <a name="gwy-layer-basic-set-gradient-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -354,7 +354,7 @@ gwy_layer_basic_get_gradient_key (<em class="parameter"><code><a class="link" hr
 <p>Gets key identifying color gradient.</p>
 <div class="refsect3">
 <a name="gwy-layer-basic-get-gradient-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -385,7 +385,7 @@ values, it determines physical dimensions, etc.  When a data field is set
 with this method, it is displayed instead of the actual data.</p>
 <div class="refsect3">
 <a name="gwy-layer-basic-set-presentation-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -415,7 +415,7 @@ gwy_layer_basic_get_presentation_key (<em class="parameter"><code><a class="link
 <p>See <a class="link" href="GwyLayerBasic.html#gwy-layer-basic-set-presentation-key" title="gwy_layer_basic_set_presentation_key ()"><code class="function">gwy_layer_basic_set_presentation_key()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-layer-basic-get-presentation-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -441,7 +441,7 @@ gwy_layer_basic_get_has_presentation (<em class="parameter"><code><a class="link
 <p>Tests whether a basic layer displays a presentation instead of the data.</p>
 <div class="refsect3">
 <a name="gwy-layer-basic-get-has-presentation.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -469,7 +469,7 @@ gwy_layer_basic_set_min_max_key (<em class="parameter"><code><a class="link" hre
 <p>Sets basic layer fixed range minimum and maximum.</p>
 <div class="refsect3">
 <a name="gwy-layer-basic-set-min-max-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -500,7 +500,7 @@ gwy_layer_basic_get_min_max_key (<em class="parameter"><code><a class="link" hre
 <p>Gets prefix identifying fixed range minimum and maximum.</p>
 <div class="refsect3">
 <a name="gwy-layer-basic-get-min-max-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -528,7 +528,7 @@ gwy_layer_basic_set_range_type_key (<em class="parameter"><code><a class="link"
 data.</p>
 <div class="refsect3">
 <a name="gwy-layer-basic-set-range-type-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -557,7 +557,7 @@ gwy_layer_basic_get_range_type_key (<em class="parameter"><code><a class="link"
 <p>Gets key identifying color range mapping type.</p>
 <div class="refsect3">
 <a name="gwy-layer-basic-get-range-type-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -658,7 +658,7 @@ starts displaying a presentation, or conversely when it stops displaying
 a presentation.</p>
 <div class="refsect3">
 <a name="GwyLayerBasic-presentation-switched.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyLayerMask.html b/devel-docs/libgwydgets/html/GwyLayerMask.html
index 0db8f55..eb132f1 100644
--- a/devel-docs/libgwydgets/html/GwyLayerMask.html
+++ b/devel-docs/libgwydgets/html/GwyLayerMask.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyLayerMask: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="DataWindowWidgets.html" title="Data Windows and Views">
 <link rel="prev" href="GwyLayerBasic.html" title="GwyLayerBasic">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyLayerMask.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -77,7 +77,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyLayerMask.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -93,7 +93,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyLayerMask.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -156,7 +156,7 @@ gwy_layer_mask_set_color_key (<em class="parameter"><code><a class="link" href="
 <p>Sets the container key of colour components of a mask layer.</p>
 <div class="refsect3">
 <a name="gwy-layer-mask-set-color-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -187,7 +187,7 @@ gwy_layer_mask_get_color_key (<em class="parameter"><code><a class="link" href="
 <p>Gets prefix identifying color components.</p>
 <div class="refsect3">
 <a name="gwy-layer-mask-get-color-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -213,7 +213,7 @@ gwy_layer_mask_get_color (<em class="parameter"><code><a class="link" href="GwyL
 <p>Returns the color used by a mask layer.</p>
 <div class="refsect3">
 <a name="gwy-layer-mask-get-color.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyMarkerBox.html b/devel-docs/libgwydgets/html/GwyMarkerBox.html
index 17da9f4..baa4fbd 100644
--- a/devel-docs/libgwydgets/html/GwyMarkerBox.html
+++ b/devel-docs/libgwydgets/html/GwyMarkerBox.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyMarkerBox: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GeneralWidgets.html" title="General Widgets">
 <link rel="prev" href="GwyVRuler.html" title="GwyVRuler">
@@ -37,7 +37,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyMarkerBox.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -175,7 +175,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyMarkerBox.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -202,7 +202,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyMarkerBox.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -239,7 +239,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyMarkerBox.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -419,7 +419,7 @@ a marker at 0.0 and another at 1.0 could look:</p>
 
 <div class="refsect3">
 <a name="GwyMarkerValidateFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -469,7 +469,7 @@ gwy_marker_box_get_selected_marker (<em class="parameter"><code><a class="link"
 box.</p>
 <div class="refsect3">
 <a name="gwy-marker-box-get-selected-marker.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -497,7 +497,7 @@ gwy_marker_box_set_selected_marker (<em class="parameter"><code><a class="link"
 <p>Selects a marker in a marker box.</p>
 <div class="refsect3">
 <a name="gwy-marker-box-set-selected-marker.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -527,7 +527,7 @@ gwy_marker_box_get_marker_position (<em class="parameter"><code><a class="link"
 <p>Gets the position of a marker in a marker box.</p>
 <div class="refsect3">
 <a name="gwy-marker-box-get-marker-position.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -562,7 +562,7 @@ gwy_marker_box_set_marker_position (<em class="parameter"><code><a class="link"
 <p>Moves a marker in a marker box.</p>
 <div class="refsect3">
 <a name="gwy-marker-box-set-marker-position.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -603,7 +603,7 @@ gwy_marker_box_add_marker (<em class="parameter"><code><a class="link" href="Gwy
 <p>Adds a marker to a marker box.</p>
 <div class="refsect3">
 <a name="gwy-marker-box-add-marker.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -643,7 +643,7 @@ gwy_marker_box_remove_marker (<em class="parameter"><code><a class="link" href="
 <p>Removes a marker from a marker box.</p>
 <div class="refsect3">
 <a name="gwy-marker-box-remove-marker.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -677,7 +677,7 @@ gwy_marker_box_get_nmarkers (<em class="parameter"><code><a class="link" href="G
 <p>Gets the number of markers in a marker box.</p>
 <div class="refsect3">
 <a name="gwy-marker-box-get-nmarkers.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -703,7 +703,7 @@ gwy_marker_box_get_markers (<em class="parameter"><code><a class="link" href="Gw
 <p>Gets all markers in a marker box.</p>
 <div class="refsect3">
 <a name="gwy-marker-box-get-markers.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -736,7 +736,7 @@ gwy_marker_box_set_markers (<em class="parameter"><code><a class="link" href="Gw
 set markers that do not logically conflict with the validator.</p>
 <div class="refsect3">
 <a name="gwy-marker-box-set-markers.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -772,7 +772,7 @@ gwy_marker_box_set_flipped (<em class="parameter"><code><a class="link" href="Gw
 <p>Sets whether a marker box is drawn upside down.</p>
 <div class="refsect3">
 <a name="gwy-marker-box-set-flipped.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -801,7 +801,7 @@ gwy_marker_box_get_flipped (<em class="parameter"><code><a class="link" href="Gw
 <p>Returns whether a marker box is drawn upside down.</p>
 <div class="refsect3">
 <a name="gwy-marker-box-get-flipped.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -828,7 +828,7 @@ gwy_marker_box_set_highlight_selected (<em class="parameter"><code><a class="lin
 <p>Sets whether a marker box highlights selected marker.</p>
 <div class="refsect3">
 <a name="gwy-marker-box-set-highlight-selected.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -858,7 +858,7 @@ gwy_marker_box_get_highlight_selected (<em class="parameter"><code><a class="lin
 <p>Returns whether a marker box highlights selected marker.</p>
 <div class="refsect3">
 <a name="gwy-marker-box-get-highlight-selected.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -889,7 +889,7 @@ revalidation is done immediately.  It's up to caller to set a validator
 that do not logically conflict with the distribution of markers.</p>
 <div class="refsect3">
 <a name="gwy-marker-box-set-validator.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -918,7 +918,7 @@ gwy_marker_box_get_validator (<em class="parameter"><code><a class="link" href="
 <p>Gets the marker validation function currently in use.</p>
 <div class="refsect3">
 <a name="gwy-marker-box-get-validator.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1010,7 +1010,7 @@ user_function (<a class="link" href="GwyMarkerBox.html" title="GwyMarkerBox"><sp
 <p>The ::marker-added signal is emitted when a marker is added.</p>
 <div class="refsect3">
 <a name="GwyMarkerBox-marker-added.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1047,7 +1047,7 @@ user_function (<a class="link" href="GwyMarkerBox.html" title="GwyMarkerBox"><sp
 <p>The ::marker-moved signal is emitted when a marker is moved.</p>
 <div class="refsect3">
 <a name="GwyMarkerBox-marker-moved.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1084,7 +1084,7 @@ user_function (<a class="link" href="GwyMarkerBox.html" title="GwyMarkerBox"><sp
 <p>The ::marker-removed signal is emitted when a marker is removed.</p>
 <div class="refsect3">
 <a name="GwyMarkerBox-marker-removed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1121,7 +1121,7 @@ user_function (<a class="link" href="GwyMarkerBox.html" title="GwyMarkerBox"><sp
 <p>The ::marker-selected signal is emitted when marker selection changes.</p>
 <div class="refsect3">
 <a name="GwyMarkerBox-marker-selected.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1158,7 +1158,7 @@ user_function (<a class="link" href="GwyMarkerBox.html" title="GwyMarkerBox"><sp
 with <a class="link" href="GwyMarkerBox.html#gwy-marker-box-set-markers" title="gwy_marker_box_set_markers ()"><code class="function">gwy_marker_box_set_markers()</code></a>.</p>
 <div class="refsect3">
 <a name="GwyMarkerBox-markers-set.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyNullStore.html b/devel-docs/libgwydgets/html/GwyNullStore.html
index 2a648fd..b513d3f 100644
--- a/devel-docs/libgwydgets/html/GwyNullStore.html
+++ b/devel-docs/libgwydgets/html/GwyNullStore.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyNullStore: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GeneralWidgets.html" title="General Widgets">
 <link rel="prev" href="GwyInventoryStore.html" title="GwyInventoryStore">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyNullStore.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -102,7 +102,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyNullStore.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -262,7 +262,7 @@ gwy_null_store_new (<em class="parameter"><code><a href="/usr/share/gtk-doc/html
 <p>Creates a new <a href="/usr/share/gtk-doc/html/gtk3GtkTreeModel.html#GtkTreeModel-struct"><span class="type">GtkTreeModel</span></a> wrapper around nothing.</p>
 <div class="refsect3">
 <a name="gwy-null-store-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -290,7 +290,7 @@ gwy_null_store_get_n_rows (<em class="parameter"><code><a class="link" href="Gwy
 <a href="/usr/share/gtk-doc/html/gtk3GtkTreeModel.html#gtk-tree-model-iter-n-children"><code class="function">gtk_tree_model_iter_n_children()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-null-store-get-n-rows.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -325,7 +325,7 @@ the requested number of rows is reached.</p>
 from its view(s), change the number of rows, and then reconnect.</p>
 <div class="refsect3">
 <a name="gwy-null-store-set-n-rows.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -354,7 +354,7 @@ gwy_null_store_get_model (<em class="parameter"><code><a class="link" href="GwyN
 <p>Gets the model pointer of a null store.</p>
 <div class="refsect3">
 <a name="gwy-null-store-get-model.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -392,7 +392,7 @@ creation (null stores are cheap).</p>
 suit your needs.</p>
 <div class="refsect3">
 <a name="gwy-null-store-set-model.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -431,7 +431,7 @@ gwy_null_store_row_changed (<em class="parameter"><code><a class="link" href="Gw
 achieved with <a href="/usr/share/gtk-doc/html/gtk3GtkTreeModel.html#gtk-tree-model-row-changed"><code class="function">gtk_tree_model_row_changed()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-null-store-row-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -461,7 +461,7 @@ gwy_null_store_iter_is_valid (<em class="parameter"><code><a class="link" href="
 <p>Checks if the given iter is a valid iter for this null store.</p>
 <div class="refsect3">
 <a name="gwy-null-store-iter-is-valid.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyPixmapLayer.html b/devel-docs/libgwydgets/html/GwyPixmapLayer.html
index d16c057..b20a048 100644
--- a/devel-docs/libgwydgets/html/GwyPixmapLayer.html
+++ b/devel-docs/libgwydgets/html/GwyPixmapLayer.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyPixmapLayer: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="DataWindowWidgets.html" title="Data Windows and Views">
 <link rel="prev" href="GwyDataViewLayer.html" title="GwyDataViewLayer">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyPixmapLayer.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -85,7 +85,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyPixmapLayer.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -101,7 +101,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyPixmapLayer.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -154,7 +154,7 @@ gwy_pixmap_layer_wants_repaint (<em class="parameter"><code><a class="link" href
 <p>Checks whether a pixmap layer wants repaint.</p>
 <div class="refsect3">
 <a name="gwy-pixmap-layer-wants-repaint.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -183,7 +183,7 @@ to repaint the pixbuf, it simply returns the current one.  To enforce
 update, emit "data-changed" signal on corresponding data field.</p>
 <div class="refsect3">
 <a name="gwy-pixmap-layer-paint.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -211,7 +211,7 @@ gwy_pixmap_layer_set_data_key (<em class="parameter"><code><a class="link" href=
 <p>Sets the data field to display by a pixmap layer.</p>
 <div class="refsect3">
 <a name="gwy-pixmap-layer-set-data-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -240,7 +240,7 @@ gwy_pixmap_layer_get_data_key (<em class="parameter"><code><a class="link" href=
 <p>Gets the key identifying data field this pixmap layer displays.</p>
 <div class="refsect3">
 <a name="gwy-pixmap-layer-get-data-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -268,7 +268,7 @@ gwy_pixmap_layer_make_pixbuf (<em class="parameter"><code><a class="link" href="
 <p>This method is intended for pixmap layer implementation.</p>
 <div class="refsect3">
 <a name="gwy-pixmap-layer-make-pixbuf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyRuler.html b/devel-docs/libgwydgets/html/GwyRuler.html
index ab76765..f5c7ef0 100644
--- a/devel-docs/libgwydgets/html/GwyRuler.html
+++ b/devel-docs/libgwydgets/html/GwyRuler.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyRuler: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GeneralWidgets.html" title="General Widgets">
 <link rel="prev" href="GwyCurve.html" title="GwyCurve">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyRuler.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -103,7 +103,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyRuler.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -140,7 +140,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyRuler.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -201,7 +201,7 @@ gwy_ruler_set_range (<em class="parameter"><code><a class="link" href="GwyRuler.
 <p>Sets range and current value of a ruler.</p>
 <div class="refsect3">
 <a name="gwy-ruler-set-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -246,7 +246,7 @@ gwy_ruler_draw_pos (<em class="parameter"><code><a class="link" href="GwyRuler.h
 <p>This method is intended primarily for subclass implementation.</p>
 <div class="refsect3">
 <a name="gwy-ruler-draw-pos.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -273,7 +273,7 @@ gwy_ruler_get_range (<em class="parameter"><code><a class="link" href="GwyRuler.
 See <a class="link" href="GwyRuler.html#gwy-ruler-set-range" title="gwy_ruler_set_range ()"><code class="function">gwy_ruler_set_range()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-ruler-get-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -321,7 +321,7 @@ gwy_ruler_set_si_unit (<em class="parameter"><code><a class="link" href="GwyRule
 <p>Setting units to <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> effectively disables them.</p>
 <div class="refsect3">
 <a name="gwy-ruler-set-si-unit.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -350,7 +350,7 @@ gwy_ruler_get_si_unit (<em class="parameter"><code><a class="link" href="GwyRule
 <p>Returns the base units a ruler uses.</p>
 <div class="refsect3">
 <a name="gwy-ruler-get-si-unit.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -377,7 +377,7 @@ gwy_ruler_get_units_placement (<em class="parameter"><code><a class="link" href=
 .</p>
 <div class="refsect3">
 <a name="gwy-ruler-get-units-placement.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -404,7 +404,7 @@ gwy_ruler_set_units_placement (<em class="parameter"><code><a class="link" href=
 <p>Sets whether and where units should be placed on the ruler.</p>
 <div class="refsect3">
 <a name="gwy-ruler-set-units-placement.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwySciText.html b/devel-docs/libgwydgets/html/GwySciText.html
index 230fc5a..09c696e 100644
--- a/devel-docs/libgwydgets/html/GwySciText.html
+++ b/devel-docs/libgwydgets/html/GwySciText.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwySciText: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GeneralWidgets.html" title="General Widgets">
 <link rel="prev" href="GwyHMarkerBox.html" title="GwyHMarkerBox">
@@ -37,7 +37,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwySciText.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -96,7 +96,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySciText.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -111,7 +111,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySciText.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -126,7 +126,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySciText.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -190,7 +190,7 @@ gwy_sci_text_get_text (<em class="parameter"><code><a class="link" href="GwySciT
 <p>The text is already in UTF-8 with all entities converted.</p>
 <div class="refsect3">
 <a name="gwy-sci-text-get-text.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -221,7 +221,7 @@ known entities are converted to entities, other characters are left as they
 are.</p>
 <div class="refsect3">
 <a name="gwy-sci-text-set-text.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -250,7 +250,7 @@ gwy_sci_text_get_has_preview (<em class="parameter"><code><a class="link" href="
 <p>Tests the display of a preview in a scientific text entry.</p>
 <div class="refsect3">
 <a name="gwy-sci-text-get-has-preview.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -277,7 +277,7 @@ gwy_sci_text_set_has_preview (<em class="parameter"><code><a class="link" href="
 <p>Sets the display of a preview in a scientific text entry.</p>
 <div class="refsect3">
 <a name="gwy-sci-text-set-has-preview.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -306,7 +306,7 @@ gwy_sci_text_get_entry (<em class="parameter"><code><a class="link" href="GwySci
 <p>Gets the entry widget of a scientific text entry.</p>
 <div class="refsect3">
 <a name="gwy-sci-text-get-entry.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -369,7 +369,7 @@ contents, you can use <a class="link" href="GwySciText.html#gwy-sci-text-get-ent
 connect to its signal.</p>
 <div class="refsect3">
 <a name="GwySciText-edited.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwySelectionGraph1DArea.html b/devel-docs/libgwydgets/html/GwySelectionGraph1DArea.html
index 8240c95..d3ee252 100644
--- a/devel-docs/libgwydgets/html/GwySelectionGraph1DArea.html
+++ b/devel-docs/libgwydgets/html/GwySelectionGraph1DArea.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwySelectionGraph1DArea: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GraphWidgets.html" title="Graphs">
 <link rel="prev" href="GwyGraphCorner.html" title="GwyGraphCorner">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwySelectionGraph1DArea.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -53,7 +53,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySelectionGraph1DArea.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -68,7 +68,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySelectionGraph1DArea.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
diff --git a/devel-docs/libgwydgets/html/GwySelectionGraphArea.html b/devel-docs/libgwydgets/html/GwySelectionGraphArea.html
index c088435..d3216e3 100644
--- a/devel-docs/libgwydgets/html/GwySelectionGraphArea.html
+++ b/devel-docs/libgwydgets/html/GwySelectionGraphArea.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwySelectionGraphArea: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GraphWidgets.html" title="Graphs">
 <link rel="prev" href="GwySelectionGraph1DArea.html" title="GwySelectionGraph1DArea">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwySelectionGraphArea.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -52,7 +52,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySelectionGraphArea.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
diff --git a/devel-docs/libgwydgets/html/GwySelectionGraphLine.html b/devel-docs/libgwydgets/html/GwySelectionGraphLine.html
index fc45c61..e941486 100644
--- a/devel-docs/libgwydgets/html/GwySelectionGraphLine.html
+++ b/devel-docs/libgwydgets/html/GwySelectionGraphLine.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwySelectionGraphLine: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GraphWidgets.html" title="Graphs">
 <link rel="prev" href="GwySelectionGraphArea.html" title="GwySelectionGraphArea">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwySelectionGraphLine.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -53,7 +53,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySelectionGraphLine.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -68,7 +68,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySelectionGraphLine.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
diff --git a/devel-docs/libgwydgets/html/GwySelectionGraphPoint.html b/devel-docs/libgwydgets/html/GwySelectionGraphPoint.html
index bba1c7d..43497ec 100644
--- a/devel-docs/libgwydgets/html/GwySelectionGraphPoint.html
+++ b/devel-docs/libgwydgets/html/GwySelectionGraphPoint.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwySelectionGraphPoint: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GraphWidgets.html" title="Graphs">
 <link rel="prev" href="GwySelectionGraphLine.html" title="GwySelectionGraphLine">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwySelectionGraphPoint.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -52,7 +52,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySelectionGraphPoint.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
diff --git a/devel-docs/libgwydgets/html/GwySelectionGraphZoom.html b/devel-docs/libgwydgets/html/GwySelectionGraphZoom.html
index d1a3cc8..4361154 100644
--- a/devel-docs/libgwydgets/html/GwySelectionGraphZoom.html
+++ b/devel-docs/libgwydgets/html/GwySelectionGraphZoom.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwySelectionGraphZoom: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GraphWidgets.html" title="Graphs">
 <link rel="prev" href="GwySelectionGraphPoint.html" title="GwySelectionGraphPoint">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwySelectionGraphZoom.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -52,7 +52,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySelectionGraphZoom.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
diff --git a/devel-docs/libgwydgets/html/GwySensitivityGroup.html b/devel-docs/libgwydgets/html/GwySensitivityGroup.html
index 49a0e40..d89a6de 100644
--- a/devel-docs/libgwydgets/html/GwySensitivityGroup.html
+++ b/devel-docs/libgwydgets/html/GwySensitivityGroup.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwySensitivityGroup: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="WidgetUtilities.html" title="Widget Utilities">
 <link rel="prev" href="libgwydgets-gwyradiobuttons.html" title="gwyradiobuttons">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwySensitivityGroup.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -109,7 +109,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySensitivityGroup.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -252,7 +252,7 @@ destroyed when they are any widgets in, generally, you can release your
 initial reference after adding widgets to the group.</p>
 <div class="refsect3">
 <a name="gwy-sensitivity-group-add-widget.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -297,7 +297,7 @@ set in current <em class="parameter"><code>sensgroup</code></em>
  is zero, widget will be always sensitive.</p>
 <div class="refsect3">
 <a name="gwy-sensitivity-group-set-state.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -344,7 +344,7 @@ gwy_sensitivity_group_get_state (<em class="parameter"><code><a class="link" hre
 <p>Gets the current state of a widget flag sensitivity group.</p>
 <div class="refsect3">
 <a name="gwy-sensitivity-group-get-state.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -371,7 +371,7 @@ gwy_sensitivity_group_release_widget (<em class="parameter"><code><a class="link
 <p>Removes a widget from flag sensitivity group.</p>
 <div class="refsect3">
 <a name="gwy-sensitivity-group-release-widget.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -402,7 +402,7 @@ gwy_sensitivity_group_get_widget_mask (<em class="parameter"><code><a class="lin
 <p>Gets sensitivity flags of a widget in a flag sensitivity group.</p>
 <div class="refsect3">
 <a name="gwy-sensitivity-group-get-widget-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -438,7 +438,7 @@ gwy_sensitivity_group_set_widget_mask (<em class="parameter"><code><a class="lin
 <p>Sets the flag mask of a widget in a flag sensitivity group.</p>
 <div class="refsect3">
 <a name="gwy-sensitivity-group-set-widget-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -474,7 +474,7 @@ gwy_sensitivity_group_contains_widget (<em class="parameter"><code><a class="lin
 <p>Checks whether a widget belongs to a sensitivity group.</p>
 <div class="refsect3">
 <a name="gwy-sensitivity-group-contains-widget.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyShader.html b/devel-docs/libgwydgets/html/GwyShader.html
index 1195372..7fb6b42 100644
--- a/devel-docs/libgwydgets/html/GwyShader.html
+++ b/devel-docs/libgwydgets/html/GwyShader.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyShader: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GeneralWidgets.html" title="General Widgets">
 <link rel="prev" href="GwyStatusbar.html" title="GwyStatusbar">
@@ -37,7 +37,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyShader.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -127,7 +127,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyShader.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -150,7 +150,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyShader.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -165,7 +165,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyShader.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -218,7 +218,7 @@ gwy_shader_new (<em class="parameter"><code>const <a href="http://developer.gnom
 <p>The widget takes up all the space allocated for it.</p>
 <div class="refsect3">
 <a name="gwy-shader-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -245,7 +245,7 @@ gwy_shader_get_theta (<em class="parameter"><code><a class="link" href="GwyShade
 <p>Returns the theta coordinate of a shader.</p>
 <div class="refsect3">
 <a name="gwy-shader-get-theta.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -272,7 +272,7 @@ gwy_shader_get_phi (<em class="parameter"><code><a class="link" href="GwyShader.
 <p>Returns the phi coordinate of a shader.</p>
 <div class="refsect3">
 <a name="gwy-shader-get-phi.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -300,7 +300,7 @@ gwy_shader_set_theta (<em class="parameter"><code><a class="link" href="GwyShade
 <p>Sets the theta coordinate of a shader.</p>
 <div class="refsect3">
 <a name="gwy-shader-set-theta.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -331,7 +331,7 @@ gwy_shader_set_phi (<em class="parameter"><code><a class="link" href="GwyShader.
 <p>Sets the phi coordinate of a shader.</p>
 <div class="refsect3">
 <a name="gwy-shader-set-phi.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -362,7 +362,7 @@ gwy_shader_set_angle (<em class="parameter"><code><a class="link" href="GwyShade
 <p>Sets the spherical angle of a shader.</p>
 <div class="refsect3">
 <a name="gwy-shader-set-angle.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -397,7 +397,7 @@ gwy_shader_get_gradient (<em class="parameter"><code><a class="link" href="GwySh
 <p>Returns the name of color gradient a shader uses.</p>
 <div class="refsect3">
 <a name="gwy-shader-get-gradient.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -427,7 +427,7 @@ gwy_shader_set_gradient (<em class="parameter"><code><a class="link" href="GwySh
 <p>Sets the gradient a shader uses.</p>
 <div class="refsect3">
 <a name="gwy-shader-set-gradient.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -457,7 +457,7 @@ gwy_shader_get_update_policy (<em class="parameter"><code><a class="link" href="
 <p>Returns the update policy of a shader.</p>
 <div class="refsect3">
 <a name="gwy-shader-get-update-policy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -484,7 +484,7 @@ gwy_shader_set_update_policy (<em class="parameter"><code><a class="link" href="
 <p>Sets the update policy of a shader.</p>
 <div class="refsect3">
 <a name="gwy-shader-set-update-policy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -554,7 +554,7 @@ user_function (<a class="link" href="GwyShader.html" title="GwyShader"><span cla
 <p>The ::angle-changed signal is emitted when the spherical angle changes.</p>
 <div class="refsect3">
 <a name="GwyShader-angle-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyStatusbar.html b/devel-docs/libgwydgets/html/GwyStatusbar.html
index 69bf6ec..9a90d24 100644
--- a/devel-docs/libgwydgets/html/GwyStatusbar.html
+++ b/devel-docs/libgwydgets/html/GwyStatusbar.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyStatusbar: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GeneralWidgets.html" title="General Widgets">
 <link rel="prev" href="GwySciText.html" title="GwySciText">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyStatusbar.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -62,7 +62,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyStatusbar.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -133,12 +133,12 @@ gwy_statusbar_set_markup (<em class="parameter"><code><a class="link" href="GwyS
                           <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *markup</code></em>);</pre>
 <p>Sets the text to display in a status bar.</p>
 <p>This method is intended for simple status bars that do not have stacks and
-do not need contexts.  It does not mix with <code class="function">gtk_status_bar_push()</code>.  You can
+do not need contexts.  It does not mix with <a href="/usr/share/gtk-doc/html/gtk3GtkStatusbar.html#gtk-statusbar-push"><code class="function">gtk_statusbar_push()</code></a>.  You can
 use either this simple interface or the full stacks-and-contexts API with
 <a class="link" href="GwyStatusbar.html" title="GwyStatusbar"><span class="type">GwyStatusbar</span></a>, but not both in the same status bar.</p>
 <div class="refsect3">
 <a name="gwy-statusbar-set-markup.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/GwyVRuler.html b/devel-docs/libgwydgets/html/GwyVRuler.html
index 1469c53..4a61081 100644
--- a/devel-docs/libgwydgets/html/GwyVRuler.html
+++ b/devel-docs/libgwydgets/html/GwyVRuler.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyVRuler: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GeneralWidgets.html" title="General Widgets">
 <link rel="prev" href="GwyHRuler.html" title="GwyHRuler">
@@ -35,7 +35,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyVRuler.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -52,7 +52,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyVRuler.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
diff --git a/devel-docs/libgwydgets/html/GwyVectorLayer.html b/devel-docs/libgwydgets/html/GwyVectorLayer.html
index 9dacf5e..cc03428 100644
--- a/devel-docs/libgwydgets/html/GwyVectorLayer.html
+++ b/devel-docs/libgwydgets/html/GwyVectorLayer.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyVectorLayer: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="DataWindowWidgets.html" title="Data Windows and Views">
 <link rel="prev" href="GwyPixmapLayer.html" title="GwyPixmapLayer">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyVectorLayer.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -172,7 +172,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyVectorLayer.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -200,7 +200,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyVectorLayer.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -215,7 +215,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyVectorLayer.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -281,7 +281,7 @@ gwy_vector_layer_class_get_selection_type
 <a href="/usr/share/gtk-doc/html/gobjectgobject-Type-Information.html#GType"><span class="type">GType</span></a> one has to use <a href="/usr/share/gtk-doc/html/gobjectgobject-Type-Information.html#g-type-class-peek"><code class="function">g_type_class_peek()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-vector-layer-class-get-selection-type.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -309,7 +309,7 @@ gwy_vector_layer_class_get_selection_type
 <a class="link" href="GwyVectorLayer.html#gwy-vector-layer-class-get-selection-type" title="gwy_vector_layer_class_get_selection_type ()"><code class="function">gwy_vector_layer_class_get_selection_type()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-vector-layer-get-selection-type.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -332,7 +332,7 @@ gwy_vector_layer_set_selection_key (<em class="parameter"><code><a class="link"
 <p>Sets the selection object to use by a vector layer.</p>
 <div class="refsect3">
 <a name="gwy-vector-layer-set-selection-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -361,7 +361,7 @@ gwy_vector_layer_get_selection_key (<em class="parameter"><code><a class="link"
 <p>Gets the key identifying selection this vector layer displays.</p>
 <div class="refsect3">
 <a name="gwy-vector-layer-get-selection-key.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -393,7 +393,7 @@ a selection of appropriate type is created and put to the container first.</p>
 obtaining the selection object a vector layer uses too.</p>
 <div class="refsect3">
 <a name="gwy-vector-layer-ensure-selection.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -419,7 +419,7 @@ gwy_vector_layer_get_focus (<em class="parameter"><code><a class="link" href="Gw
 <p>Gets focused object index.</p>
 <div class="refsect3">
 <a name="gwy-vector-layer-get-focus.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -450,7 +450,7 @@ for this object, and if the layer is editable only this object can be
 modified by the user.</p>
 <div class="refsect3">
 <a name="gwy-vector-layer-set-focus.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -487,7 +487,7 @@ gwy_vector_layer_get_editable (<em class="parameter"><code><a class="link" href=
 <p>Gets editability of a vector layer.</p>
 <div class="refsect3">
 <a name="gwy-vector-layer-get-editable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -518,7 +518,7 @@ edited.</p>
 However, "object-chosen" signal is still emitted.</p>
 <div class="refsect3">
 <a name="gwy-vector-layer-set-editable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -550,7 +550,7 @@ gwy_vector_layer_draw (<em class="parameter"><code><a class="link" href="GwyVect
  on given drawable (which should be a <a class="link" href="GwyDataView.html" title="GwyDataView"><span class="type">GwyDataView</span></a> window).</p>
 <div class="refsect3">
 <a name="gwy-vector-layer-draw.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -587,7 +587,7 @@ gwy_vector_layer_button_press (<em class="parameter"><code><a class="link" href=
 layers.  You should rarely need it.</p>
 <div class="refsect3">
 <a name="gwy-vector-layer-button-press.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -623,7 +623,7 @@ gwy_vector_layer_button_release (<em class="parameter"><code><a class="link" hre
 layers.  You should rarely need it.</p>
 <div class="refsect3">
 <a name="gwy-vector-layer-button-release.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -659,7 +659,7 @@ gwy_vector_layer_motion_notify (<em class="parameter"><code><a class="link" href
 layers.  You should rarely need it.</p>
 <div class="refsect3">
 <a name="gwy-vector-layer-motion-notify.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -695,7 +695,7 @@ gwy_vector_layer_key_press (<em class="parameter"><code><a class="link" href="Gw
 layers.  You should rarely need it.</p>
 <div class="refsect3">
 <a name="gwy-vector-layer-key-press.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -731,7 +731,7 @@ gwy_vector_layer_key_release (<em class="parameter"><code><a class="link" href="
 layers.  You should rarely need it.</p>
 <div class="refsect3">
 <a name="gwy-vector-layer-key-release.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -766,7 +766,7 @@ gwy_vector_layer_object_chosen (<em class="parameter"><code><a class="link" href
 <p>This function is primarily intended for layer implementations.</p>
 <div class="refsect3">
 <a name="gwy-vector-layer-object-chosen.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -872,7 +872,7 @@ even if the layer is not editable, but it is not emitted when focus
 is set and the user attempts to choose a different object.</p>
 <div class="refsect3">
 <a name="GwyVectorLayer-object-chosen.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/WidgetUtilities.html b/devel-docs/libgwydgets/html/WidgetUtilities.html
index b23e044..1be0654 100644
--- a/devel-docs/libgwydgets/html/WidgetUtilities.html
+++ b/devel-docs/libgwydgets/html/WidgetUtilities.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Widget Utilities: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="GwyNullStore.html" title="GwyNullStore">
diff --git a/devel-docs/libgwydgets/html/Widgets3D.html b/devel-docs/libgwydgets/html/Widgets3D.html
index d8287de..2d2f676 100644
--- a/devel-docs/libgwydgets/html/Widgets3D.html
+++ b/devel-docs/libgwydgets/html/Widgets3D.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>3D Widgets: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="GwySelectionGraphZoom.html" title="GwySelectionGraphZoom">
diff --git a/devel-docs/libgwydgets/html/api-index-2-1.html b/devel-docs/libgwydgets/html/api-index-2-1.html
index 6c679c6..eff50db 100644
--- a/devel-docs/libgwydgets/html/api-index-2-1.html
+++ b/devel-docs/libgwydgets/html/api-index-2-1.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.1: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-deprec.html" title="Index of deprecated symbols">
diff --git a/devel-docs/libgwydgets/html/api-index-2-11.html b/devel-docs/libgwydgets/html/api-index-2-11.html
index fd63302..7c2b4dd 100644
--- a/devel-docs/libgwydgets/html/api-index-2-11.html
+++ b/devel-docs/libgwydgets/html/api-index-2-11.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.11: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-8.html" title="Index of new symbols in 2.8">
diff --git a/devel-docs/libgwydgets/html/api-index-2-14.html b/devel-docs/libgwydgets/html/api-index-2-14.html
index c6e49e0..bc21db9 100644
--- a/devel-docs/libgwydgets/html/api-index-2-14.html
+++ b/devel-docs/libgwydgets/html/api-index-2-14.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.14: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-11.html" title="Index of new symbols in 2.11">
diff --git a/devel-docs/libgwydgets/html/api-index-2-16.html b/devel-docs/libgwydgets/html/api-index-2-16.html
index dc5eda5..1a9636f 100644
--- a/devel-docs/libgwydgets/html/api-index-2-16.html
+++ b/devel-docs/libgwydgets/html/api-index-2-16.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.16: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-14.html" title="Index of new symbols in 2.14">
diff --git a/devel-docs/libgwydgets/html/api-index-2-22.html b/devel-docs/libgwydgets/html/api-index-2-22.html
index 23cbf78..ec02749 100644
--- a/devel-docs/libgwydgets/html/api-index-2-22.html
+++ b/devel-docs/libgwydgets/html/api-index-2-22.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.22: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-16.html" title="Index of new symbols in 2.16">
diff --git a/devel-docs/libgwydgets/html/api-index-2-23.html b/devel-docs/libgwydgets/html/api-index-2-23.html
index 24b6f45..92d8d20 100644
--- a/devel-docs/libgwydgets/html/api-index-2-23.html
+++ b/devel-docs/libgwydgets/html/api-index-2-23.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.23: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-22.html" title="Index of new symbols in 2.22">
diff --git a/devel-docs/libgwydgets/html/api-index-2-26.html b/devel-docs/libgwydgets/html/api-index-2-26.html
index 91e0721..43373a7 100644
--- a/devel-docs/libgwydgets/html/api-index-2-26.html
+++ b/devel-docs/libgwydgets/html/api-index-2-26.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.26: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-23.html" title="Index of new symbols in 2.23">
diff --git a/devel-docs/libgwydgets/html/api-index-2-29.html b/devel-docs/libgwydgets/html/api-index-2-29.html
index 78c6a3a..fad0056 100644
--- a/devel-docs/libgwydgets/html/api-index-2-29.html
+++ b/devel-docs/libgwydgets/html/api-index-2-29.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.29: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-26.html" title="Index of new symbols in 2.26">
diff --git a/devel-docs/libgwydgets/html/api-index-2-3.html b/devel-docs/libgwydgets/html/api-index-2-3.html
index 99dcfab..d27ff1e 100644
--- a/devel-docs/libgwydgets/html/api-index-2-3.html
+++ b/devel-docs/libgwydgets/html/api-index-2-3.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.3: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-1.html" title="Index of new symbols in 2.1">
diff --git a/devel-docs/libgwydgets/html/api-index-2-34.html b/devel-docs/libgwydgets/html/api-index-2-34.html
index 79921fd..1cb6d35 100644
--- a/devel-docs/libgwydgets/html/api-index-2-34.html
+++ b/devel-docs/libgwydgets/html/api-index-2-34.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.34: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-29.html" title="Index of new symbols in 2.29">
diff --git a/devel-docs/libgwydgets/html/api-index-2-37.html b/devel-docs/libgwydgets/html/api-index-2-37.html
index 95ff8ed..499b07c 100644
--- a/devel-docs/libgwydgets/html/api-index-2-37.html
+++ b/devel-docs/libgwydgets/html/api-index-2-37.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.37: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-34.html" title="Index of new symbols in 2.34">
diff --git a/devel-docs/libgwydgets/html/api-index-2-38.html b/devel-docs/libgwydgets/html/api-index-2-38.html
index db99611..4d225a3 100644
--- a/devel-docs/libgwydgets/html/api-index-2-38.html
+++ b/devel-docs/libgwydgets/html/api-index-2-38.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.38: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-37.html" title="Index of new symbols in 2.37">
diff --git a/devel-docs/libgwydgets/html/api-index-2-39.html b/devel-docs/libgwydgets/html/api-index-2-39.html
index 7c5d206..540adea 100644
--- a/devel-docs/libgwydgets/html/api-index-2-39.html
+++ b/devel-docs/libgwydgets/html/api-index-2-39.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.39: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-38.html" title="Index of new symbols in 2.38">
diff --git a/devel-docs/libgwydgets/html/api-index-2-41.html b/devel-docs/libgwydgets/html/api-index-2-41.html
index 5c15b80..694c1df 100644
--- a/devel-docs/libgwydgets/html/api-index-2-41.html
+++ b/devel-docs/libgwydgets/html/api-index-2-41.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.41: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-39.html" title="Index of new symbols in 2.39">
diff --git a/devel-docs/libgwydgets/html/api-index-2-42.html b/devel-docs/libgwydgets/html/api-index-2-42.html
index c23ab91..ba236d0 100644
--- a/devel-docs/libgwydgets/html/api-index-2-42.html
+++ b/devel-docs/libgwydgets/html/api-index-2-42.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.42: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-41.html" title="Index of new symbols in 2.41">
diff --git a/devel-docs/libgwydgets/html/api-index-2-43.html b/devel-docs/libgwydgets/html/api-index-2-43.html
index dccb3cd..b368fa0 100644
--- a/devel-docs/libgwydgets/html/api-index-2-43.html
+++ b/devel-docs/libgwydgets/html/api-index-2-43.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.43: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-42.html" title="Index of new symbols in 2.42">
diff --git a/devel-docs/libgwydgets/html/api-index-2-45.html b/devel-docs/libgwydgets/html/api-index-2-45.html
index e054070..97bb03b 100644
--- a/devel-docs/libgwydgets/html/api-index-2-45.html
+++ b/devel-docs/libgwydgets/html/api-index-2-45.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.45: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-43.html" title="Index of new symbols in 2.43">
diff --git a/devel-docs/libgwydgets/html/api-index-2-46.html b/devel-docs/libgwydgets/html/api-index-2-46.html
index 2295d04..5383d8c 100644
--- a/devel-docs/libgwydgets/html/api-index-2-46.html
+++ b/devel-docs/libgwydgets/html/api-index-2-46.html
@@ -3,10 +3,11 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.46: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-45.html" title="Index of new symbols in 2.45">
+<link rel="next" href="api-index-2-48.html" title="Index of new symbols in 2.48">
 <meta name="generator" content="GTK-Doc V1.19 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -18,7 +19,7 @@
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
 <td><a accesskey="p" href="api-index-2-45.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><img src="right-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="n" href="api-index-2-48.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="index">
 <div class="titlepage"><div><div><h1 class="title">
diff --git a/devel-docs/libgwydgets/html/api-index-2-48.html b/devel-docs/libgwydgets/html/api-index-2-48.html
new file mode 100644
index 0000000..c8a8632
--- /dev/null
+++ b/devel-docs/libgwydgets/html/api-index-2-48.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.48: Gwyddion Widgets Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
+<link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
+<link rel="prev" href="api-index-2-46.html" title="Index of new symbols in 2.46">
+<link rel="next" href="api-index-2-49.html" title="Index of new symbols in 2.49">
+<meta name="generator" content="GTK-Doc V1.19 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxS">S</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="p" href="api-index-2-46.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-49.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h1 class="title">
+<a name="api-index-2-48"></a>Index of new symbols in 2.48</h1></div></div></div>
+<a name="idx"></a><a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-CORRELATION-MASK:CAPS" title="GWY_STOCK_CORRELATION_MASK">GWY_STOCK_CORRELATION_MASK</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-DISCONNECTED:CAPS" title="GWY_STOCK_DISCONNECTED">GWY_STOCK_DISCONNECTED</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-FFT-FILTER-1D:CAPS" title="GWY_STOCK_FFT_FILTER_1D">GWY_STOCK_FFT_FILTER_1D</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-FIT-SHAPE:CAPS" title="GWY_STOCK_FIT_SHAPE">GWY_STOCK_FIT_SHAPE</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-FRACTAL-CORRECTION:CAPS" title="GWY_STOCK_FRACTAL_CORRECTION">GWY_STOCK_FRACTAL_CORRECTION</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-MARK-OUTLIERS:CAPS" title="GWY_STOCK_MARK_OUTLIERS">GWY_STOCK_MARK_OUTLIERS</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-MARK-SCARS:CAPS" title="GWY_STOCK_MARK_SCARS">GWY_STOCK_MARK_SCARS</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-NULL-OFFSETS:CAPS" title="GWY_STOCK_NULL_OFFSETS">GWY_STOCK_NULL_OFFSETS</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-PHASES:CAPS" title="GWY_STOCK_SYNTHETIC_PHASES">GWY_STOCK_SYNTHETIC_PHASES</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-XY-DENOISE:CAPS" title="GWY_STOCK_XY_DENOISE">GWY_STOCK_XY_DENOISE</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.19</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/devel-docs/libgwydgets/html/api-index-2-49.html b/devel-docs/libgwydgets/html/api-index-2-49.html
new file mode 100644
index 0000000..8a7e625
--- /dev/null
+++ b/devel-docs/libgwydgets/html/api-index-2-49.html
@@ -0,0 +1,142 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.49: Gwyddion Widgets Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
+<link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
+<link rel="prev" href="api-index-2-48.html" title="Index of new symbols in 2.48">
+<meta name="generator" content="GTK-Doc V1.19 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idx3">3</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxA">A</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxS">S</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxT">T</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="p" href="api-index-2-48.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><img src="right-insensitive.png" width="16" height="16" border="0"></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h1 class="title">
+<a name="api-index-2-49"></a>Index of new symbols in 2.49</h1></div></div></div>
+<a name="idx"></a><a name="idx3"></a><h3 class="title">3</h3>
+<dt>
+<a class="link" href="Gwy3DSetup.html#Gwy3DSetup--fmscale-reserve-space" title="The “fmscale-reserve-space” property">Gwy3DSetup:fmscale-reserve-space</a>, object property in <a class="link" href="Gwy3DSetup.html" title="Gwy3DSetup">Gwy3DSetup</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="Gwy3DSetup.html#Gwy3DSetup--fmscale-size" title="The “fmscale-size” property">Gwy3DSetup:fmscale-size</a>, object property in <a class="link" href="Gwy3DSetup.html" title="Gwy3DSetup">Gwy3DSetup</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="Gwy3DSetup.html#Gwy3DSetup--fmscale-y-align" title="The “fmscale-y-align” property">Gwy3DSetup:fmscale-y-align</a>, object property in <a class="link" href="Gwy3DSetup.html" title="Gwy3DSetup">Gwy3DSetup</a>
+</dt>
+<dd></dd>
+<a name="idxA"></a><h3 class="title">A</h3>
+<dt>
+<a class="link" href="GwyAdjustBar.html#GwyAdjustBar-struct" title="struct GwyAdjustBar">GwyAdjustBar</a>, struct in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#GwyAdjustBarClass" title="struct GwyAdjustBarClass">GwyAdjustBarClass</a>, struct in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-adjustment" title="gwy_adjust_bar_get_adjustment ()">gwy_adjust_bar_get_adjustment</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-bar-sensitive" title="gwy_adjust_bar_get_bar_sensitive ()">gwy_adjust_bar_get_bar_sensitive</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-check-button" title="gwy_adjust_bar_get_check_button ()">gwy_adjust_bar_get_check_button</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-has-check-button" title="gwy_adjust_bar_get_has_check_button ()">gwy_adjust_bar_get_has_check_button</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-label" title="gwy_adjust_bar_get_label ()">gwy_adjust_bar_get_label</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-mapping" title="gwy_adjust_bar_get_mapping ()">gwy_adjust_bar_get_mapping</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-snap-to-ticks" title="gwy_adjust_bar_get_snap_to_ticks ()">gwy_adjust_bar_get_snap_to_ticks</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-new" title="gwy_adjust_bar_new ()">gwy_adjust_bar_new</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-set-adjustment" title="gwy_adjust_bar_set_adjustment ()">gwy_adjust_bar_set_adjustment</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-set-bar-sensitive" title="gwy_adjust_bar_set_bar_sensitive ()">gwy_adjust_bar_set_bar_sensitive</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-set-has-check-button" title="gwy_adjust_bar_set_has_check_button ()">gwy_adjust_bar_set_has_check_button</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-set-mapping" title="gwy_adjust_bar_set_mapping ()">gwy_adjust_bar_set_mapping</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-set-snap-to-ticks" title="gwy_adjust_bar_set_snap_to_ticks ()">gwy_adjust_bar_set_snap_to_ticks</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="GwyAdjustBar.html#GwyScaleMappingType" title="enum GwyScaleMappingType">GwyScaleMappingType</a>, enum in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-FRACTAL-MEASURE:CAPS" title="GWY_STOCK_FRACTAL_MEASURE">GWY_STOCK_FRACTAL_MEASURE</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-MASK-SET:CAPS" title="GWY_STOCK_MASK_SET">GWY_STOCK_MASK_SET</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-NEXT:CAPS" title="GWY_STOCK_NEXT">GWY_STOCK_NEXT</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-PREVIOUS:CAPS" title="GWY_STOCK_PREVIOUS">GWY_STOCK_PREVIOUS</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-ROTATE-3D:CAPS" title="GWY_STOCK_ROTATE_3D">GWY_STOCK_ROTATE_3D</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-FIBRES:CAPS" title="GWY_STOCK_SYNTHETIC_FIBRES">GWY_STOCK_SYNTHETIC_FIBRES</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<a name="idxT"></a><h3 class="title">T</h3>
+<dt>
+<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-attach-adjbar" title="gwy_table_attach_adjbar ()">gwy_table_attach_adjbar</a>, function in <a class="link" href="libgwydgets-gwydgetutils.html" title="gwydgetutils">gwydgetutils</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.19</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/devel-docs/libgwydgets/html/api-index-2-5.html b/devel-docs/libgwydgets/html/api-index-2-5.html
index ba7685c..049e96a 100644
--- a/devel-docs/libgwydgets/html/api-index-2-5.html
+++ b/devel-docs/libgwydgets/html/api-index-2-5.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.5: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-3.html" title="Index of new symbols in 2.3">
diff --git a/devel-docs/libgwydgets/html/api-index-2-7.html b/devel-docs/libgwydgets/html/api-index-2-7.html
index 50fd3ef..220d2b6 100644
--- a/devel-docs/libgwydgets/html/api-index-2-7.html
+++ b/devel-docs/libgwydgets/html/api-index-2-7.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.7: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-5.html" title="Index of new symbols in 2.5">
diff --git a/devel-docs/libgwydgets/html/api-index-2-8.html b/devel-docs/libgwydgets/html/api-index-2-8.html
index bebc92d..d6ee115 100644
--- a/devel-docs/libgwydgets/html/api-index-2-8.html
+++ b/devel-docs/libgwydgets/html/api-index-2-8.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.8: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-2-7.html" title="Index of new symbols in 2.7">
diff --git a/devel-docs/libgwydgets/html/api-index-all.html b/devel-docs/libgwydgets/html/api-index-all.html
index 4907c95..4ff0ea6 100644
--- a/devel-docs/libgwydgets/html/api-index-all.html
+++ b/devel-docs/libgwydgets/html/api-index-all.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of all symbols: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="GwySensitivityGroup.html" title="GwySensitivityGroup">
@@ -110,10 +110,22 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="Gwy3DSetup.html#Gwy3DSetup--fmscale-reserve-space" title="The “fmscale-reserve-space” property">Gwy3DSetup:fmscale-reserve-space</a>, object property in <a class="link" href="Gwy3DSetup.html" title="Gwy3DSetup">Gwy3DSetup</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="Gwy3DSetup.html#Gwy3DSetup--fmscale-size" title="The “fmscale-size” property">Gwy3DSetup:fmscale-size</a>, object property in <a class="link" href="Gwy3DSetup.html" title="Gwy3DSetup">Gwy3DSetup</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="Gwy3DSetup.html#Gwy3DSetup--fmscale-visible" title="The “fmscale-visible” property">Gwy3DSetup:fmscale-visible</a>, object property in <a class="link" href="Gwy3DSetup.html" title="Gwy3DSetup">Gwy3DSetup</a>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="Gwy3DSetup.html#Gwy3DSetup--fmscale-y-align" title="The “fmscale-y-align” property">Gwy3DSetup:fmscale-y-align</a>, object property in <a class="link" href="Gwy3DSetup.html" title="Gwy3DSetup">Gwy3DSetup</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="Gwy3DSetup.html#Gwy3DSetup--hide-masked" title="The “hide-masked” property">Gwy3DSetup:hide-masked</a>, object property in <a class="link" href="Gwy3DSetup.html" title="Gwy3DSetup">Gwy3DSetup</a>
 </dt>
 <dd></dd>
@@ -367,10 +379,90 @@
 <dd></dd>
 <a name="idxA"></a><h3 class="title">A</h3>
 <dt>
+<a class="link" href="GwyAdjustBar.html#GwyAdjustBar-struct" title="struct GwyAdjustBar">GwyAdjustBar</a>, struct in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#GwyAdjustBar-change-value" title="The “change-value” signal">GwyAdjustBar::change-value</a>, object signal in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#GwyAdjustBar--adjustment" title="The “adjustment” property">GwyAdjustBar:adjustment</a>, object property in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#GwyAdjustBar--has-check-button" title="The “has-check-button” property">GwyAdjustBar:has-check-button</a>, object property in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#GwyAdjustBar--mapping" title="The “mapping” property">GwyAdjustBar:mapping</a>, object property in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#GwyAdjustBar--snap-to-ticks" title="The “snap-to-ticks” property">GwyAdjustBar:snap-to-ticks</a>, object property in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#GwyAdjustBarClass" title="struct GwyAdjustBarClass">GwyAdjustBarClass</a>, struct in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwydgets-gwydgetutils.html#gwy-adjustment-get-int" title="gwy_adjustment_get_int()">gwy_adjustment_get_int</a>, macro in <a class="link" href="libgwydgets-gwydgetutils.html" title="gwydgetutils">gwydgetutils</a>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-adjustment" title="gwy_adjust_bar_get_adjustment ()">gwy_adjust_bar_get_adjustment</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-bar-sensitive" title="gwy_adjust_bar_get_bar_sensitive ()">gwy_adjust_bar_get_bar_sensitive</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-check-button" title="gwy_adjust_bar_get_check_button ()">gwy_adjust_bar_get_check_button</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-has-check-button" title="gwy_adjust_bar_get_has_check_button ()">gwy_adjust_bar_get_has_check_button</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-label" title="gwy_adjust_bar_get_label ()">gwy_adjust_bar_get_label</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-mapping" title="gwy_adjust_bar_get_mapping ()">gwy_adjust_bar_get_mapping</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-get-snap-to-ticks" title="gwy_adjust_bar_get_snap_to_ticks ()">gwy_adjust_bar_get_snap_to_ticks</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-new" title="gwy_adjust_bar_new ()">gwy_adjust_bar_new</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-set-adjustment" title="gwy_adjust_bar_set_adjustment ()">gwy_adjust_bar_set_adjustment</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-set-bar-sensitive" title="gwy_adjust_bar_set_bar_sensitive ()">gwy_adjust_bar_set_bar_sensitive</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-set-has-check-button" title="gwy_adjust_bar_set_has_check_button ()">gwy_adjust_bar_set_has_check_button</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-set-mapping" title="gwy_adjust_bar_set_mapping ()">gwy_adjust_bar_set_mapping</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyAdjustBar.html#gwy-adjust-bar-set-snap-to-ticks" title="gwy_adjust_bar_set_snap_to_ticks ()">gwy_adjust_bar_set_snap_to_ticks</a>, function in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="GwyAxis.html#GwyAxis-struct" title="struct GwyAxis">GwyAxis</a>, struct in <a class="link" href="GwyAxis.html" title="GwyAxis">GwyAxis</a>
 </dt>
 <dd></dd>
@@ -2219,6 +2311,10 @@
 <dd></dd>
 <a name="idxS"></a><h3 class="title">S</h3>
 <dt>
+<a class="link" href="GwyAdjustBar.html#GwyScaleMappingType" title="enum GwyScaleMappingType">GwyScaleMappingType</a>, enum in <a class="link" href="GwyAdjustBar.html" title="GwyAdjustBar">GwyAdjustBar</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="GwySciText.html#GwySciText-struct" title="struct GwySciText">GwySciText</a>, struct in <a class="link" href="GwySciText.html" title="GwySciText">GwySciText</a>
 </dt>
 <dd></dd>
@@ -2487,6 +2583,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-CORRELATION-MASK:CAPS" title="GWY_STOCK_CORRELATION_MASK">GWY_STOCK_CORRELATION_MASK</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-CROP:CAPS" title="GWY_STOCK_CROP">GWY_STOCK_CROP</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
 </dt>
 <dd></dd>
@@ -2499,6 +2599,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-DISCONNECTED:CAPS" title="GWY_STOCK_DISCONNECTED">GWY_STOCK_DISCONNECTED</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-DISTANCE:CAPS" title="GWY_STOCK_DISTANCE">GWY_STOCK_DISTANCE</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
 </dt>
 <dd></dd>
@@ -2559,6 +2663,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-FFT-FILTER-1D:CAPS" title="GWY_STOCK_FFT_FILTER_1D">GWY_STOCK_FFT_FILTER_1D</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-FFT-FILTER-2D:CAPS" title="GWY_STOCK_FFT_FILTER_2D">GWY_STOCK_FFT_FILTER_2D</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
 </dt>
 <dd></dd>
@@ -2571,6 +2679,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-FIT-SHAPE:CAPS" title="GWY_STOCK_FIT_SHAPE">GWY_STOCK_FIT_SHAPE</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-FIX-ZERO:CAPS" title="GWY_STOCK_FIX_ZERO">GWY_STOCK_FIX_ZERO</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
 </dt>
 <dd></dd>
@@ -2587,6 +2699,14 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-FRACTAL-CORRECTION:CAPS" title="GWY_STOCK_FRACTAL_CORRECTION">GWY_STOCK_FRACTAL_CORRECTION</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-FRACTAL-MEASURE:CAPS" title="GWY_STOCK_FRACTAL_MEASURE">GWY_STOCK_FRACTAL_MEASURE</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GL-MATERIAL:CAPS" title="GWY_STOCK_GL_MATERIAL">GWY_STOCK_GL_MATERIAL</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
 </dt>
 <dd></dd>
@@ -2795,6 +2915,14 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-MARK-OUTLIERS:CAPS" title="GWY_STOCK_MARK_OUTLIERS">GWY_STOCK_MARK_OUTLIERS</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-MARK-SCARS:CAPS" title="GWY_STOCK_MARK_SCARS">GWY_STOCK_MARK_SCARS</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-MARK-WITH:CAPS" title="GWY_STOCK_MARK_WITH">GWY_STOCK_MARK_WITH</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
 </dt>
 <dd></dd>
@@ -2887,6 +3015,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-MASK-SET:CAPS" title="GWY_STOCK_MASK_SET">GWY_STOCK_MASK_SET</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-MASK-SHRINK:CAPS" title="GWY_STOCK_MASK_SHRINK">GWY_STOCK_MASK_SHRINK</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
 </dt>
 <dd></dd>
@@ -2923,6 +3055,14 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-NEXT:CAPS" title="GWY_STOCK_NEXT">GWY_STOCK_NEXT</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-NULL-OFFSETS:CAPS" title="GWY_STOCK_NULL_OFFSETS">GWY_STOCK_NULL_OFFSETS</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-PALETTES:CAPS" title="GWY_STOCK_PALETTES">GWY_STOCK_PALETTES</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
 </dt>
 <dd></dd>
@@ -2947,6 +3087,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-PREVIOUS:CAPS" title="GWY_STOCK_PREVIOUS">GWY_STOCK_PREVIOUS</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-PROFILE:CAPS" title="GWY_STOCK_PROFILE">GWY_STOCK_PROFILE</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
 </dt>
 <dd></dd>
@@ -2979,6 +3123,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-ROTATE-3D:CAPS" title="GWY_STOCK_ROTATE_3D">GWY_STOCK_ROTATE_3D</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-ROTATE-90-CCW:CAPS" title="GWY_STOCK_ROTATE_90_CCW">GWY_STOCK_ROTATE_90_CCW</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
 </dt>
 <dd></dd>
@@ -3055,6 +3203,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-FIBRES:CAPS" title="GWY_STOCK_SYNTHETIC_FIBRES">GWY_STOCK_SYNTHETIC_FIBRES</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-LATTICE:CAPS" title="GWY_STOCK_SYNTHETIC_LATTICE">GWY_STOCK_SYNTHETIC_LATTICE</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
 </dt>
 <dd></dd>
@@ -3079,6 +3231,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-PHASES:CAPS" title="GWY_STOCK_SYNTHETIC_PHASES">GWY_STOCK_SYNTHETIC_PHASES</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-SPECTRAL:CAPS" title="GWY_STOCK_SYNTHETIC_SPECTRAL">GWY_STOCK_SYNTHETIC_SPECTRAL</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
 </dt>
 <dd></dd>
@@ -3171,6 +3327,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-XY-DENOISE:CAPS" title="GWY_STOCK_XY_DENOISE">GWY_STOCK_XY_DENOISE</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-ZERO-MEAN:CAPS" title="GWY_STOCK_ZERO_MEAN">GWY_STOCK_ZERO_MEAN</a>, macro in <a class="link" href="libgwydgets-gwystock.html" title="gwystock">gwystock</a>
 </dt>
 <dd></dd>
@@ -3192,6 +3352,10 @@
 <dd></dd>
 <a name="idxT"></a><h3 class="title">T</h3>
 <dt>
+<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-attach-adjbar" title="gwy_table_attach_adjbar ()">gwy_table_attach_adjbar</a>, function in <a class="link" href="libgwydgets-gwydgetutils.html" title="gwydgetutils">gwydgetutils</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-attach-hscale" title="gwy_table_attach_hscale ()">gwy_table_attach_hscale</a>, function in <a class="link" href="libgwydgets-gwydgetutils.html" title="gwydgetutils">gwydgetutils</a>
 </dt>
 <dd></dd>
@@ -3208,23 +3372,23 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-check" title="gwy_table_hscale_get_check()">gwy_table_hscale_get_check</a>, macro in <a class="link" href="libgwydgets-gwydgetutils.html" title="gwydgetutils">gwydgetutils</a>
+<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-check" title="gwy_table_hscale_get_check ()">gwy_table_hscale_get_check</a>, function in <a class="link" href="libgwydgets-gwydgetutils.html" title="gwydgetutils">gwydgetutils</a>
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-label" title="gwy_table_hscale_get_label()">gwy_table_hscale_get_label</a>, macro in <a class="link" href="libgwydgets-gwydgetutils.html" title="gwydgetutils">gwydgetutils</a>
+<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-label" title="gwy_table_hscale_get_label ()">gwy_table_hscale_get_label</a>, function in <a class="link" href="libgwydgets-gwydgetutils.html" title="gwydgetutils">gwydgetutils</a>
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-middle-widget" title="gwy_table_hscale_get_middle_widget()">gwy_table_hscale_get_middle_widget</a>, macro in <a class="link" href="libgwydgets-gwydgetutils.html" title="gwydgetutils">gwydgetutils</a>
+<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-middle-widget" title="gwy_table_hscale_get_middle_widget ()">gwy_table_hscale_get_middle_widget</a>, function in <a class="link" href="libgwydgets-gwydgetutils.html" title="gwydgetutils">gwydgetutils</a>
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-scale" title="gwy_table_hscale_get_scale()">gwy_table_hscale_get_scale</a>, macro in <a class="link" href="libgwydgets-gwydgetutils.html" title="gwydgetutils">gwydgetutils</a>
+<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-scale" title="gwy_table_hscale_get_scale ()">gwy_table_hscale_get_scale</a>, function in <a class="link" href="libgwydgets-gwydgetutils.html" title="gwydgetutils">gwydgetutils</a>
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-units" title="gwy_table_hscale_get_units()">gwy_table_hscale_get_units</a>, macro in <a class="link" href="libgwydgets-gwydgetutils.html" title="gwydgetutils">gwydgetutils</a>
+<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-units" title="gwy_table_hscale_get_units ()">gwy_table_hscale_get_units</a>, function in <a class="link" href="libgwydgets-gwydgetutils.html" title="gwydgetutils">gwydgetutils</a>
 </dt>
 <dd></dd>
 <dt>
diff --git a/devel-docs/libgwydgets/html/api-index-deprec.html b/devel-docs/libgwydgets/html/api-index-deprec.html
index 44b6e3b..e720ef3 100644
--- a/devel-docs/libgwydgets/html/api-index-deprec.html
+++ b/devel-docs/libgwydgets/html/api-index-deprec.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of deprecated symbols: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="prev" href="api-index-all.html" title="Index of all symbols">
diff --git a/devel-docs/libgwydgets/html/gwy_3d_base-24.png b/devel-docs/libgwydgets/html/gwy_3d_base-24.png
index e401b4c..6f5f143 100644
Binary files a/devel-docs/libgwydgets/html/gwy_3d_base-24.png and b/devel-docs/libgwydgets/html/gwy_3d_base-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_arithmetic-24.png b/devel-docs/libgwydgets/html/gwy_arithmetic-24.png
index 1f5fa6f..5c44344 100644
Binary files a/devel-docs/libgwydgets/html/gwy_arithmetic-24.png and b/devel-docs/libgwydgets/html/gwy_arithmetic-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_bold-20.png b/devel-docs/libgwydgets/html/gwy_bold-20.png
index 547d29b..d3e0d70 100644
Binary files a/devel-docs/libgwydgets/html/gwy_bold-20.png and b/devel-docs/libgwydgets/html/gwy_bold-20.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_cantilever-24.png b/devel-docs/libgwydgets/html/gwy_cantilever-24.png
index 9540e6a..5a31698 100644
Binary files a/devel-docs/libgwydgets/html/gwy_cantilever-24.png and b/devel-docs/libgwydgets/html/gwy_cantilever-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_color_range-24.png b/devel-docs/libgwydgets/html/gwy_color_range-24.png
index c86d1b2..b2de5e6 100644
Binary files a/devel-docs/libgwydgets/html/gwy_color_range-24.png and b/devel-docs/libgwydgets/html/gwy_color_range-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_color_range_adaptive-24.png b/devel-docs/libgwydgets/html/gwy_color_range_adaptive-24.png
index a13f95a..5425360 100644
Binary files a/devel-docs/libgwydgets/html/gwy_color_range_adaptive-24.png and b/devel-docs/libgwydgets/html/gwy_color_range_adaptive-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_color_range_auto-24.png b/devel-docs/libgwydgets/html/gwy_color_range_auto-24.png
index b6b1102..81e5b8b 100644
Binary files a/devel-docs/libgwydgets/html/gwy_color_range_auto-24.png and b/devel-docs/libgwydgets/html/gwy_color_range_auto-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_color_range_fixed-24.png b/devel-docs/libgwydgets/html/gwy_color_range_fixed-24.png
index 5a3c5ac..6eb4a09 100644
Binary files a/devel-docs/libgwydgets/html/gwy_color_range_fixed-24.png and b/devel-docs/libgwydgets/html/gwy_color_range_fixed-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_color_range_full-24.png b/devel-docs/libgwydgets/html/gwy_color_range_full-24.png
index db2c219..f2039c4 100644
Binary files a/devel-docs/libgwydgets/html/gwy_color_range_full-24.png and b/devel-docs/libgwydgets/html/gwy_color_range_full-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_convolution-24.png b/devel-docs/libgwydgets/html/gwy_convolution-24.png
index c2834c0..df7a926 100644
Binary files a/devel-docs/libgwydgets/html/gwy_convolution-24.png and b/devel-docs/libgwydgets/html/gwy_convolution-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_correct_affine-24.png b/devel-docs/libgwydgets/html/gwy_correct_affine-24.png
index d7af10e..b0c0490 100644
Binary files a/devel-docs/libgwydgets/html/gwy_correct_affine-24.png and b/devel-docs/libgwydgets/html/gwy_correct_affine-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_correlation_mask-24.png b/devel-docs/libgwydgets/html/gwy_correlation_mask-24.png
new file mode 100644
index 0000000..fac36f4
Binary files /dev/null and b/devel-docs/libgwydgets/html/gwy_correlation_mask-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_crop-24.png b/devel-docs/libgwydgets/html/gwy_crop-24.png
index 34137a9..69f5112 100644
Binary files a/devel-docs/libgwydgets/html/gwy_crop-24.png and b/devel-docs/libgwydgets/html/gwy_crop-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_cwt-24.png b/devel-docs/libgwydgets/html/gwy_cwt-24.png
index de2ae1b..abc8b1f 100644
Binary files a/devel-docs/libgwydgets/html/gwy_cwt-24.png and b/devel-docs/libgwydgets/html/gwy_cwt-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_data_measure-24.png b/devel-docs/libgwydgets/html/gwy_data_measure-24.png
index b2bfd9b..f146f37 100644
Binary files a/devel-docs/libgwydgets/html/gwy_data_measure-24.png and b/devel-docs/libgwydgets/html/gwy_data_measure-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_disconnected-24.png b/devel-docs/libgwydgets/html/gwy_disconnected-24.png
new file mode 100644
index 0000000..4a7be6b
Binary files /dev/null and b/devel-docs/libgwydgets/html/gwy_disconnected-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_distance-24.png b/devel-docs/libgwydgets/html/gwy_distance-24.png
index 16ec0e2..a0d3d53 100644
Binary files a/devel-docs/libgwydgets/html/gwy_distance-24.png and b/devel-docs/libgwydgets/html/gwy_distance-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_distance_transform-24.png b/devel-docs/libgwydgets/html/gwy_distance_transform-24.png
index dbc766c..035196b 100644
Binary files a/devel-docs/libgwydgets/html/gwy_distance_transform-24.png and b/devel-docs/libgwydgets/html/gwy_distance_transform-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_distribution_angle-24.png b/devel-docs/libgwydgets/html/gwy_distribution_angle-24.png
index 4ad82c9..330004a 100644
Binary files a/devel-docs/libgwydgets/html/gwy_distribution_angle-24.png and b/devel-docs/libgwydgets/html/gwy_distribution_angle-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_distribution_slope-24.png b/devel-docs/libgwydgets/html/gwy_distribution_slope-24.png
index 86a891e..ac2ef7e 100644
Binary files a/devel-docs/libgwydgets/html/gwy_distribution_slope-24.png and b/devel-docs/libgwydgets/html/gwy_distribution_slope-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_drift-24.png b/devel-docs/libgwydgets/html/gwy_drift-24.png
index 1661032..51472c1 100644
Binary files a/devel-docs/libgwydgets/html/gwy_drift-24.png and b/devel-docs/libgwydgets/html/gwy_drift-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_dwt-24.png b/devel-docs/libgwydgets/html/gwy_dwt-24.png
index 92f8059..8424682 100644
Binary files a/devel-docs/libgwydgets/html/gwy_dwt-24.png and b/devel-docs/libgwydgets/html/gwy_dwt-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_edge-24.png b/devel-docs/libgwydgets/html/gwy_edge-24.png
index be816b1..9b6937c 100644
Binary files a/devel-docs/libgwydgets/html/gwy_edge-24.png and b/devel-docs/libgwydgets/html/gwy_edge-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_enforce_distribution-24.png b/devel-docs/libgwydgets/html/gwy_enforce_distribution-24.png
index 6912bf2..7152df2 100644
Binary files a/devel-docs/libgwydgets/html/gwy_enforce_distribution-24.png and b/devel-docs/libgwydgets/html/gwy_enforce_distribution-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_entropy-24.png b/devel-docs/libgwydgets/html/gwy_entropy-24.png
index c3b0027..baaae0a 100644
Binary files a/devel-docs/libgwydgets/html/gwy_entropy-24.png and b/devel-docs/libgwydgets/html/gwy_entropy-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_extend-24.png b/devel-docs/libgwydgets/html/gwy_extend-24.png
index ab46f12..dd9abce 100644
Binary files a/devel-docs/libgwydgets/html/gwy_extend-24.png and b/devel-docs/libgwydgets/html/gwy_extend-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_extract_path-24.png b/devel-docs/libgwydgets/html/gwy_extract_path-24.png
index 7609af4..3929ae9 100644
Binary files a/devel-docs/libgwydgets/html/gwy_extract_path-24.png and b/devel-docs/libgwydgets/html/gwy_extract_path-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_facet_level-24.png b/devel-docs/libgwydgets/html/gwy_facet_level-24.png
index ddb9e71..e16dd0b 100644
Binary files a/devel-docs/libgwydgets/html/gwy_facet_level-24.png and b/devel-docs/libgwydgets/html/gwy_facet_level-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_favourite-24.png b/devel-docs/libgwydgets/html/gwy_favourite-24.png
index ee6b598..a097321 100644
Binary files a/devel-docs/libgwydgets/html/gwy_favourite-24.png and b/devel-docs/libgwydgets/html/gwy_favourite-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_fft-24.png b/devel-docs/libgwydgets/html/gwy_fft-24.png
index 0fa3b30..ed6fb92 100644
Binary files a/devel-docs/libgwydgets/html/gwy_fft-24.png and b/devel-docs/libgwydgets/html/gwy_fft-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_fft_2d-24.png b/devel-docs/libgwydgets/html/gwy_fft_2d-24.png
index 1d0565c..895582a 100644
Binary files a/devel-docs/libgwydgets/html/gwy_fft_2d-24.png and b/devel-docs/libgwydgets/html/gwy_fft_2d-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_fft_filter_1d-24.png b/devel-docs/libgwydgets/html/gwy_fft_filter_1d-24.png
new file mode 100644
index 0000000..d123ffd
Binary files /dev/null and b/devel-docs/libgwydgets/html/gwy_fft_filter_1d-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_fft_filter_2d-24.png b/devel-docs/libgwydgets/html/gwy_fft_filter_2d-24.png
index 898f74f..78cdfd8 100644
Binary files a/devel-docs/libgwydgets/html/gwy_fft_filter_2d-24.png and b/devel-docs/libgwydgets/html/gwy_fft_filter_2d-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_filter-24.png b/devel-docs/libgwydgets/html/gwy_filter-24.png
index 907adce..51b2792 100644
Binary files a/devel-docs/libgwydgets/html/gwy_filter-24.png and b/devel-docs/libgwydgets/html/gwy_filter-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_find_peaks-24.png b/devel-docs/libgwydgets/html/gwy_find_peaks-24.png
index 548aa29..dabc05e 100644
Binary files a/devel-docs/libgwydgets/html/gwy_find_peaks-24.png and b/devel-docs/libgwydgets/html/gwy_find_peaks-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_fit_shape-24.png b/devel-docs/libgwydgets/html/gwy_fit_shape-24.png
new file mode 100644
index 0000000..222fdcf
Binary files /dev/null and b/devel-docs/libgwydgets/html/gwy_fit_shape-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_fix_zero-24.png b/devel-docs/libgwydgets/html/gwy_fix_zero-24.png
index 2ff6836..a9c36e4 100644
Binary files a/devel-docs/libgwydgets/html/gwy_fix_zero-24.png and b/devel-docs/libgwydgets/html/gwy_fix_zero-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_flip_horizontally-24.png b/devel-docs/libgwydgets/html/gwy_flip_horizontally-24.png
index 1b2a999..4a3e8ed 100644
Binary files a/devel-docs/libgwydgets/html/gwy_flip_horizontally-24.png and b/devel-docs/libgwydgets/html/gwy_flip_horizontally-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_flip_vertically-24.png b/devel-docs/libgwydgets/html/gwy_flip_vertically-24.png
index d5f3d44..3169edb 100644
Binary files a/devel-docs/libgwydgets/html/gwy_flip_vertically-24.png and b/devel-docs/libgwydgets/html/gwy_flip_vertically-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_fractal-24.png b/devel-docs/libgwydgets/html/gwy_fractal-24.png
index a5020fe..11635e5 100644
Binary files a/devel-docs/libgwydgets/html/gwy_fractal-24.png and b/devel-docs/libgwydgets/html/gwy_fractal-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_fractal_correction-24.png b/devel-docs/libgwydgets/html/gwy_fractal_correction-24.png
new file mode 100644
index 0000000..62a93ff
Binary files /dev/null and b/devel-docs/libgwydgets/html/gwy_fractal_correction-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_fractal_measure-24.png b/devel-docs/libgwydgets/html/gwy_fractal_measure-24.png
new file mode 100644
index 0000000..69eb8f8
Binary files /dev/null and b/devel-docs/libgwydgets/html/gwy_fractal_measure-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_gl_material-16.png b/devel-docs/libgwydgets/html/gwy_gl_material-16.png
index 01d8395..d8d6dee 100644
Binary files a/devel-docs/libgwydgets/html/gwy_gl_material-16.png and b/devel-docs/libgwydgets/html/gwy_gl_material-16.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_gradient_horizontal-24.png b/devel-docs/libgwydgets/html/gwy_gradient_horizontal-24.png
index 0cbf614..0a7fdc9 100644
Binary files a/devel-docs/libgwydgets/html/gwy_gradient_horizontal-24.png and b/devel-docs/libgwydgets/html/gwy_gradient_horizontal-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_gradient_vertical-24.png b/devel-docs/libgwydgets/html/gwy_gradient_vertical-24.png
index 39bf6bc..efbb7d8 100644
Binary files a/devel-docs/libgwydgets/html/gwy_gradient_vertical-24.png and b/devel-docs/libgwydgets/html/gwy_gradient_vertical-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_grain_correlation-24.png b/devel-docs/libgwydgets/html/gwy_grain_correlation-24.png
index 0889d2d..44c6577 100644
Binary files a/devel-docs/libgwydgets/html/gwy_grain_correlation-24.png and b/devel-docs/libgwydgets/html/gwy_grain_correlation-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_grain_exscribed_circle-24.png b/devel-docs/libgwydgets/html/gwy_grain_exscribed_circle-24.png
index ad5cbba..def1093 100644
Binary files a/devel-docs/libgwydgets/html/gwy_grain_exscribed_circle-24.png and b/devel-docs/libgwydgets/html/gwy_grain_exscribed_circle-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_grain_inscribed_circle-24.png b/devel-docs/libgwydgets/html/gwy_grain_inscribed_circle-24.png
index 0d80bd1..eba6ac1 100644
Binary files a/devel-docs/libgwydgets/html/gwy_grain_inscribed_circle-24.png and b/devel-docs/libgwydgets/html/gwy_grain_inscribed_circle-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_grains-24.png b/devel-docs/libgwydgets/html/gwy_grains-24.png
index 2d77de1..339081e 100644
Binary files a/devel-docs/libgwydgets/html/gwy_grains-24.png and b/devel-docs/libgwydgets/html/gwy_grains-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_grains_edge-24.png b/devel-docs/libgwydgets/html/gwy_grains_edge-24.png
index 9620f41..1481114 100644
Binary files a/devel-docs/libgwydgets/html/gwy_grains_edge-24.png and b/devel-docs/libgwydgets/html/gwy_grains_edge-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_grains_edge_remove-24.png b/devel-docs/libgwydgets/html/gwy_grains_edge_remove-24.png
index 21666de..51dd823 100644
Binary files a/devel-docs/libgwydgets/html/gwy_grains_edge_remove-24.png and b/devel-docs/libgwydgets/html/gwy_grains_edge_remove-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_grains_graph-24.png b/devel-docs/libgwydgets/html/gwy_grains_graph-24.png
index fd453a8..de6b5ed 100644
Binary files a/devel-docs/libgwydgets/html/gwy_grains_graph-24.png and b/devel-docs/libgwydgets/html/gwy_grains_graph-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_grains_measure-24.png b/devel-docs/libgwydgets/html/gwy_grains_measure-24.png
index 6991688..594f902 100644
Binary files a/devel-docs/libgwydgets/html/gwy_grains_measure-24.png and b/devel-docs/libgwydgets/html/gwy_grains_measure-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_grains_remove-24.png b/devel-docs/libgwydgets/html/gwy_grains_remove-24.png
index f0a57b9..1331f36 100644
Binary files a/devel-docs/libgwydgets/html/gwy_grains_remove-24.png and b/devel-docs/libgwydgets/html/gwy_grains_remove-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_grains_water-24.png b/devel-docs/libgwydgets/html/gwy_grains_water-24.png
index c61d533..ce98629 100644
Binary files a/devel-docs/libgwydgets/html/gwy_grains_water-24.png and b/devel-docs/libgwydgets/html/gwy_grains_water-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph-24.png b/devel-docs/libgwydgets/html/gwy_graph-24.png
index 2311387..08bc1fb 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph-24.png and b/devel-docs/libgwydgets/html/gwy_graph-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_align-24.png b/devel-docs/libgwydgets/html/gwy_graph_align-24.png
index e54ccfc..7d5d8ab 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_align-24.png and b/devel-docs/libgwydgets/html/gwy_graph_align-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_cut-24.png b/devel-docs/libgwydgets/html/gwy_graph_cut-24.png
index e9667bc..afbb068 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_cut-24.png and b/devel-docs/libgwydgets/html/gwy_graph_cut-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_dos-24.png b/devel-docs/libgwydgets/html/gwy_graph_dos-24.png
index be176ea..0b23839 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_dos-24.png and b/devel-docs/libgwydgets/html/gwy_graph_dos-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_export_ascii-24.png b/devel-docs/libgwydgets/html/gwy_graph_export_ascii-24.png
index f87cb0e..ebcf1cc 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_export_ascii-24.png and b/devel-docs/libgwydgets/html/gwy_graph_export_ascii-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_export_png-24.png b/devel-docs/libgwydgets/html/gwy_graph_export_png-24.png
index bc4ecc2..ec0ba64 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_export_png-24.png and b/devel-docs/libgwydgets/html/gwy_graph_export_png-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_export_vector-24.png b/devel-docs/libgwydgets/html/gwy_graph_export_vector-24.png
index 71b6539..9fc43c3 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_export_vector-24.png and b/devel-docs/libgwydgets/html/gwy_graph_export_vector-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_fd-24.png b/devel-docs/libgwydgets/html/gwy_graph_fd-24.png
index c2f3b7a..a28e54b 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_fd-24.png and b/devel-docs/libgwydgets/html/gwy_graph_fd-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_filter-24.png b/devel-docs/libgwydgets/html/gwy_graph_filter-24.png
index 80cf236..5b3ba6a 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_filter-24.png and b/devel-docs/libgwydgets/html/gwy_graph_filter-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_function-24.png b/devel-docs/libgwydgets/html/gwy_graph_function-24.png
index 8d3c0c5..7e868b2 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_function-24.png and b/devel-docs/libgwydgets/html/gwy_graph_function-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_halfgauss-24.png b/devel-docs/libgwydgets/html/gwy_graph_halfgauss-24.png
index ed0ef6c..83b030f 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_halfgauss-24.png and b/devel-docs/libgwydgets/html/gwy_graph_halfgauss-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_level-24.png b/devel-docs/libgwydgets/html/gwy_graph_level-24.png
index dee1168..fc824fa 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_level-24.png and b/devel-docs/libgwydgets/html/gwy_graph_level-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_measure-24.png b/devel-docs/libgwydgets/html/gwy_graph_measure-24.png
index 7b02b42..bc563d1 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_measure-24.png and b/devel-docs/libgwydgets/html/gwy_graph_measure-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_palette-24.png b/devel-docs/libgwydgets/html/gwy_graph_palette-24.png
index 73298e9..7669ef1 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_palette-24.png and b/devel-docs/libgwydgets/html/gwy_graph_palette-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_pointer-24.png b/devel-docs/libgwydgets/html/gwy_graph_pointer-24.png
index c7059fe..37a53c8 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_pointer-24.png and b/devel-docs/libgwydgets/html/gwy_graph_pointer-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_ruler-24.png b/devel-docs/libgwydgets/html/gwy_graph_ruler-24.png
index d7c016a..a0a1585 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_ruler-24.png and b/devel-docs/libgwydgets/html/gwy_graph_ruler-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_vertical-24.png b/devel-docs/libgwydgets/html/gwy_graph_vertical-24.png
index ab82996..708736c 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_vertical-24.png and b/devel-docs/libgwydgets/html/gwy_graph_vertical-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_zoom_fit-24.png b/devel-docs/libgwydgets/html/gwy_graph_zoom_fit-24.png
index 25d61be..173423b 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_zoom_fit-24.png and b/devel-docs/libgwydgets/html/gwy_graph_zoom_fit-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_zoom_in-24.png b/devel-docs/libgwydgets/html/gwy_graph_zoom_in-24.png
index 4d1a4c6..a07015e 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_zoom_in-24.png and b/devel-docs/libgwydgets/html/gwy_graph_zoom_in-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_graph_zoom_out-24.png b/devel-docs/libgwydgets/html/gwy_graph_zoom_out-24.png
index 599752c..d39e0ec 100644
Binary files a/devel-docs/libgwydgets/html/gwy_graph_zoom_out-24.png and b/devel-docs/libgwydgets/html/gwy_graph_zoom_out-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_hough-24.png b/devel-docs/libgwydgets/html/gwy_hough-24.png
index e5d0aee..e1291f7 100644
Binary files a/devel-docs/libgwydgets/html/gwy_hough-24.png and b/devel-docs/libgwydgets/html/gwy_hough-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_immerse-24.png b/devel-docs/libgwydgets/html/gwy_immerse-24.png
index 47bf80f..92f8ff2 100644
Binary files a/devel-docs/libgwydgets/html/gwy_immerse-24.png and b/devel-docs/libgwydgets/html/gwy_immerse-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_iso_roughness-24.png b/devel-docs/libgwydgets/html/gwy_iso_roughness-24.png
index 6892a15..c110932 100644
Binary files a/devel-docs/libgwydgets/html/gwy_iso_roughness-24.png and b/devel-docs/libgwydgets/html/gwy_iso_roughness-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_italic-20.png b/devel-docs/libgwydgets/html/gwy_italic-20.png
index c72d6c0..81fbb46 100644
Binary files a/devel-docs/libgwydgets/html/gwy_italic-20.png and b/devel-docs/libgwydgets/html/gwy_italic-20.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_less-24.png b/devel-docs/libgwydgets/html/gwy_less-24.png
index d29b178..65b46a9 100644
Binary files a/devel-docs/libgwydgets/html/gwy_less-24.png and b/devel-docs/libgwydgets/html/gwy_less-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_level-24.png b/devel-docs/libgwydgets/html/gwy_level-24.png
index 495f59a..4cf0fb8 100644
Binary files a/devel-docs/libgwydgets/html/gwy_level-24.png and b/devel-docs/libgwydgets/html/gwy_level-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_level_flatten_base-24.png b/devel-docs/libgwydgets/html/gwy_level_flatten_base-24.png
index d1a2be0..d2abfa5 100644
Binary files a/devel-docs/libgwydgets/html/gwy_level_flatten_base-24.png and b/devel-docs/libgwydgets/html/gwy_level_flatten_base-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_level_median-24.png b/devel-docs/libgwydgets/html/gwy_level_median-24.png
index 5d5bfee..dfc9653 100644
Binary files a/devel-docs/libgwydgets/html/gwy_level_median-24.png and b/devel-docs/libgwydgets/html/gwy_level_median-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_level_triangle-24.png b/devel-docs/libgwydgets/html/gwy_level_triangle-24.png
index 2e62aee..9bf2a46 100644
Binary files a/devel-docs/libgwydgets/html/gwy_level_triangle-24.png and b/devel-docs/libgwydgets/html/gwy_level_triangle-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_light_rotate-24.png b/devel-docs/libgwydgets/html/gwy_light_rotate-24.png
index 78267d7..9a62056 100644
Binary files a/devel-docs/libgwydgets/html/gwy_light_rotate-24.png and b/devel-docs/libgwydgets/html/gwy_light_rotate-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_line_level-24.png b/devel-docs/libgwydgets/html/gwy_line_level-24.png
index b7829a2..9b47092 100644
Binary files a/devel-docs/libgwydgets/html/gwy_line_level-24.png and b/devel-docs/libgwydgets/html/gwy_line_level-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_load_debug-20.png b/devel-docs/libgwydgets/html/gwy_load_debug-20.png
index 5ae1c78..31d40ce 100644
Binary files a/devel-docs/libgwydgets/html/gwy_load_debug-20.png and b/devel-docs/libgwydgets/html/gwy_load_debug-20.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_load_info-20.png b/devel-docs/libgwydgets/html/gwy_load_info-20.png
index f8b1cd7..9de7202 100644
Binary files a/devel-docs/libgwydgets/html/gwy_load_info-20.png and b/devel-docs/libgwydgets/html/gwy_load_info-20.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_load_warning-20.png b/devel-docs/libgwydgets/html/gwy_load_warning-20.png
index b2d6bca..3c38083 100644
Binary files a/devel-docs/libgwydgets/html/gwy_load_warning-20.png and b/devel-docs/libgwydgets/html/gwy_load_warning-20.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_local_slope-24.png b/devel-docs/libgwydgets/html/gwy_local_slope-24.png
index 250abd8..5d1edf9 100644
Binary files a/devel-docs/libgwydgets/html/gwy_local_slope-24.png and b/devel-docs/libgwydgets/html/gwy_local_slope-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_logscale_horizontal-24.png b/devel-docs/libgwydgets/html/gwy_logscale_horizontal-24.png
index 0424b6c..c4c47b4 100644
Binary files a/devel-docs/libgwydgets/html/gwy_logscale_horizontal-24.png and b/devel-docs/libgwydgets/html/gwy_logscale_horizontal-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_logscale_vertical-24.png b/devel-docs/libgwydgets/html/gwy_logscale_vertical-24.png
index 0365405..9173e0d 100644
Binary files a/devel-docs/libgwydgets/html/gwy_logscale_vertical-24.png and b/devel-docs/libgwydgets/html/gwy_logscale_vertical-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mark_outliers-24.png b/devel-docs/libgwydgets/html/gwy_mark_outliers-24.png
new file mode 100644
index 0000000..79b60f0
Binary files /dev/null and b/devel-docs/libgwydgets/html/gwy_mark_outliers-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mark_scars-24.png b/devel-docs/libgwydgets/html/gwy_mark_scars-24.png
new file mode 100644
index 0000000..df843dd
Binary files /dev/null and b/devel-docs/libgwydgets/html/gwy_mark_scars-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mark_with-24.png b/devel-docs/libgwydgets/html/gwy_mark_with-24.png
index a8a5a38..dde1a2a 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mark_with-24.png and b/devel-docs/libgwydgets/html/gwy_mark_with-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask-16.png b/devel-docs/libgwydgets/html/gwy_mask-16.png
index ff6c0c0..24787e1 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask-16.png and b/devel-docs/libgwydgets/html/gwy_mask-16.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask-24.png b/devel-docs/libgwydgets/html/gwy_mask-24.png
index 32be618..d96374f 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask-24.png and b/devel-docs/libgwydgets/html/gwy_mask-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_add-24.png b/devel-docs/libgwydgets/html/gwy_mask_add-24.png
index d125b2a..5d8db27 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_add-24.png and b/devel-docs/libgwydgets/html/gwy_mask_add-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_circle-24.png b/devel-docs/libgwydgets/html/gwy_mask_circle-24.png
index bc2afd9..abacf74 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_circle-24.png and b/devel-docs/libgwydgets/html/gwy_mask_circle-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_circle_exclusive-24.png b/devel-docs/libgwydgets/html/gwy_mask_circle_exclusive-24.png
index bcca426..4a70445 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_circle_exclusive-24.png and b/devel-docs/libgwydgets/html/gwy_mask_circle_exclusive-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_circle_inclusive-24.png b/devel-docs/libgwydgets/html/gwy_mask_circle_inclusive-24.png
index 128a478..839bc61 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_circle_inclusive-24.png and b/devel-docs/libgwydgets/html/gwy_mask_circle_inclusive-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_distribute-24.png b/devel-docs/libgwydgets/html/gwy_mask_distribute-24.png
index 6acf992..72a00af 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_distribute-24.png and b/devel-docs/libgwydgets/html/gwy_mask_distribute-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_editor-24.png b/devel-docs/libgwydgets/html/gwy_mask_editor-24.png
index 65eeaa5..96a9f2f 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_editor-24.png and b/devel-docs/libgwydgets/html/gwy_mask_editor-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_exclude-24.png b/devel-docs/libgwydgets/html/gwy_mask_exclude-24.png
index 72b8939..6a62863 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_exclude-24.png and b/devel-docs/libgwydgets/html/gwy_mask_exclude-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_exclude_circle-24.png b/devel-docs/libgwydgets/html/gwy_mask_exclude_circle-24.png
index 2fdbadc..4a70445 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_exclude_circle-24.png and b/devel-docs/libgwydgets/html/gwy_mask_exclude_circle-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_extract-24.png b/devel-docs/libgwydgets/html/gwy_mask_extract-24.png
index dbe8f30..e3943e6 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_extract-24.png and b/devel-docs/libgwydgets/html/gwy_mask_extract-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_fill_draw-24.png b/devel-docs/libgwydgets/html/gwy_mask_fill_draw-24.png
index a412a3f..e2f59b6 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_fill_draw-24.png and b/devel-docs/libgwydgets/html/gwy_mask_fill_draw-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_fill_erase-24.png b/devel-docs/libgwydgets/html/gwy_mask_fill_erase-24.png
index a8f7136..fd3450b 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_fill_erase-24.png and b/devel-docs/libgwydgets/html/gwy_mask_fill_erase-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_grow-24.png b/devel-docs/libgwydgets/html/gwy_mask_grow-24.png
index f806456..01b63fc 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_grow-24.png and b/devel-docs/libgwydgets/html/gwy_mask_grow-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_intersect-24.png b/devel-docs/libgwydgets/html/gwy_mask_intersect-24.png
index 7a08f4d..d2ca3c0 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_intersect-24.png and b/devel-docs/libgwydgets/html/gwy_mask_intersect-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_invert-24.png b/devel-docs/libgwydgets/html/gwy_mask_invert-24.png
index 0af7c29..3796b3b 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_invert-24.png and b/devel-docs/libgwydgets/html/gwy_mask_invert-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_line-24.png b/devel-docs/libgwydgets/html/gwy_mask_line-24.png
index a50c304..f7641d1 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_line-24.png and b/devel-docs/libgwydgets/html/gwy_mask_line-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_morph-24.png b/devel-docs/libgwydgets/html/gwy_mask_morph-24.png
index e95e1b0..7acfc4a 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_morph-24.png and b/devel-docs/libgwydgets/html/gwy_mask_morph-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_paint_draw-24.png b/devel-docs/libgwydgets/html/gwy_mask_paint_draw-24.png
index d2b6acd..7e740eb 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_paint_draw-24.png and b/devel-docs/libgwydgets/html/gwy_mask_paint_draw-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_paint_erase-24.png b/devel-docs/libgwydgets/html/gwy_mask_paint_erase-24.png
index cf60f3f..ce13a16 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_paint_erase-24.png and b/devel-docs/libgwydgets/html/gwy_mask_paint_erase-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_rect_exclusive-24.png b/devel-docs/libgwydgets/html/gwy_mask_rect_exclusive-24.png
index 0de5352..9d0d67a 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_rect_exclusive-24.png and b/devel-docs/libgwydgets/html/gwy_mask_rect_exclusive-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_rect_inclusive-24.png b/devel-docs/libgwydgets/html/gwy_mask_rect_inclusive-24.png
index e0e8990..dc2075d 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_rect_inclusive-24.png and b/devel-docs/libgwydgets/html/gwy_mask_rect_inclusive-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_remove-24.png b/devel-docs/libgwydgets/html/gwy_mask_remove-24.png
index eb82317..d1e69dc 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_remove-24.png and b/devel-docs/libgwydgets/html/gwy_mask_remove-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_set-24.png b/devel-docs/libgwydgets/html/gwy_mask_set-24.png
new file mode 100644
index 0000000..98ad1ac
Binary files /dev/null and b/devel-docs/libgwydgets/html/gwy_mask_set-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_shrink-24.png b/devel-docs/libgwydgets/html/gwy_mask_shrink-24.png
index a5e7c8c..1f295e0 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_shrink-24.png and b/devel-docs/libgwydgets/html/gwy_mask_shrink-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_subtract-24.png b/devel-docs/libgwydgets/html/gwy_mask_subtract-24.png
index a452875..4b23180 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_subtract-24.png and b/devel-docs/libgwydgets/html/gwy_mask_subtract-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mask_thin-24.png b/devel-docs/libgwydgets/html/gwy_mask_thin-24.png
index ed44191..bc6de13 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mask_thin-24.png and b/devel-docs/libgwydgets/html/gwy_mask_thin-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_measure_lattice-24.png b/devel-docs/libgwydgets/html/gwy_measure_lattice-24.png
index cd72ade..4dcd3a2 100644
Binary files a/devel-docs/libgwydgets/html/gwy_measure_lattice-24.png and b/devel-docs/libgwydgets/html/gwy_measure_lattice-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_merge-24.png b/devel-docs/libgwydgets/html/gwy_merge-24.png
index b143a65..194af80 100644
Binary files a/devel-docs/libgwydgets/html/gwy_merge-24.png and b/devel-docs/libgwydgets/html/gwy_merge-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_more-24.png b/devel-docs/libgwydgets/html/gwy_more-24.png
index bf60a5d..7ddd42e 100644
Binary files a/devel-docs/libgwydgets/html/gwy_more-24.png and b/devel-docs/libgwydgets/html/gwy_more-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_mutual_crop-24.png b/devel-docs/libgwydgets/html/gwy_mutual_crop-24.png
index e259352..3c5eb1a 100644
Binary files a/devel-docs/libgwydgets/html/gwy_mutual_crop-24.png and b/devel-docs/libgwydgets/html/gwy_mutual_crop-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_neural_apply-24.png b/devel-docs/libgwydgets/html/gwy_neural_apply-24.png
index c08795e..13c66fc 100644
Binary files a/devel-docs/libgwydgets/html/gwy_neural_apply-24.png and b/devel-docs/libgwydgets/html/gwy_neural_apply-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_neural_train-24.png b/devel-docs/libgwydgets/html/gwy_neural_train-24.png
index 603da13..a6ca230 100644
Binary files a/devel-docs/libgwydgets/html/gwy_neural_train-24.png and b/devel-docs/libgwydgets/html/gwy_neural_train-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_next-24.png b/devel-docs/libgwydgets/html/gwy_next-24.png
new file mode 100644
index 0000000..81fee13
Binary files /dev/null and b/devel-docs/libgwydgets/html/gwy_next-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_null_offsets-24.png b/devel-docs/libgwydgets/html/gwy_null_offsets-24.png
new file mode 100644
index 0000000..50ed894
Binary files /dev/null and b/devel-docs/libgwydgets/html/gwy_null_offsets-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_palettes-16.png b/devel-docs/libgwydgets/html/gwy_palettes-16.png
index fef2359..b2fd0c8 100644
Binary files a/devel-docs/libgwydgets/html/gwy_palettes-16.png and b/devel-docs/libgwydgets/html/gwy_palettes-16.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_palettes-24.png b/devel-docs/libgwydgets/html/gwy_palettes-24.png
index 9744b41..4980e7a 100644
Binary files a/devel-docs/libgwydgets/html/gwy_palettes-24.png and b/devel-docs/libgwydgets/html/gwy_palettes-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_path_level-24.png b/devel-docs/libgwydgets/html/gwy_path_level-24.png
index 3f219db..486cbf4 100644
Binary files a/devel-docs/libgwydgets/html/gwy_path_level-24.png and b/devel-docs/libgwydgets/html/gwy_path_level-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_pointer_measure-24.png b/devel-docs/libgwydgets/html/gwy_pointer_measure-24.png
index fb08713..a55127b 100644
Binary files a/devel-docs/libgwydgets/html/gwy_pointer_measure-24.png and b/devel-docs/libgwydgets/html/gwy_pointer_measure-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_poly_distort-24.png b/devel-docs/libgwydgets/html/gwy_poly_distort-24.png
index c1b972d..d1ec76e 100644
Binary files a/devel-docs/libgwydgets/html/gwy_poly_distort-24.png and b/devel-docs/libgwydgets/html/gwy_poly_distort-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_polynom-24.png b/devel-docs/libgwydgets/html/gwy_polynom-24.png
index b7a1534..af5a9fe 100644
Binary files a/devel-docs/libgwydgets/html/gwy_polynom-24.png and b/devel-docs/libgwydgets/html/gwy_polynom-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_polynom_level-24.png b/devel-docs/libgwydgets/html/gwy_polynom_level-24.png
index 2929522..87555d0 100644
Binary files a/devel-docs/libgwydgets/html/gwy_polynom_level-24.png and b/devel-docs/libgwydgets/html/gwy_polynom_level-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_previous-24.png b/devel-docs/libgwydgets/html/gwy_previous-24.png
new file mode 100644
index 0000000..a6a7142
Binary files /dev/null and b/devel-docs/libgwydgets/html/gwy_previous-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_profile-24.png b/devel-docs/libgwydgets/html/gwy_profile-24.png
index 5232d4c..1a946e3 100644
Binary files a/devel-docs/libgwydgets/html/gwy_profile-24.png and b/devel-docs/libgwydgets/html/gwy_profile-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_pygwy-24.png b/devel-docs/libgwydgets/html/gwy_pygwy-24.png
index 7f11f1e..2d4303d 100644
Binary files a/devel-docs/libgwydgets/html/gwy_pygwy-24.png and b/devel-docs/libgwydgets/html/gwy_pygwy-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_remove_under_mask-24.png b/devel-docs/libgwydgets/html/gwy_remove_under_mask-24.png
index 7645baf..11b1054 100644
Binary files a/devel-docs/libgwydgets/html/gwy_remove_under_mask-24.png and b/devel-docs/libgwydgets/html/gwy_remove_under_mask-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_rotate-24.png b/devel-docs/libgwydgets/html/gwy_rotate-24.png
index b1a2c9c..84ed68b 100644
Binary files a/devel-docs/libgwydgets/html/gwy_rotate-24.png and b/devel-docs/libgwydgets/html/gwy_rotate-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_rotate_180-24.png b/devel-docs/libgwydgets/html/gwy_rotate_180-24.png
index 390aa5f..df4f979 100644
Binary files a/devel-docs/libgwydgets/html/gwy_rotate_180-24.png and b/devel-docs/libgwydgets/html/gwy_rotate_180-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_rotate_3d-24.png b/devel-docs/libgwydgets/html/gwy_rotate_3d-24.png
new file mode 100644
index 0000000..f4a9a34
Binary files /dev/null and b/devel-docs/libgwydgets/html/gwy_rotate_3d-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_rotate_90_ccw-24.png b/devel-docs/libgwydgets/html/gwy_rotate_90_ccw-24.png
index 825c228..9d58ad9 100644
Binary files a/devel-docs/libgwydgets/html/gwy_rotate_90_ccw-24.png and b/devel-docs/libgwydgets/html/gwy_rotate_90_ccw-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_rotate_90_cw-24.png b/devel-docs/libgwydgets/html/gwy_rotate_90_cw-24.png
index 14391a5..9aae77b 100644
Binary files a/devel-docs/libgwydgets/html/gwy_rotate_90_cw-24.png and b/devel-docs/libgwydgets/html/gwy_rotate_90_cw-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_scale-24.png b/devel-docs/libgwydgets/html/gwy_scale-24.png
index 136a4f2..d487c8f 100644
Binary files a/devel-docs/libgwydgets/html/gwy_scale-24.png and b/devel-docs/libgwydgets/html/gwy_scale-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_scale_horizontally-24.png b/devel-docs/libgwydgets/html/gwy_scale_horizontally-24.png
index d6e5dc4..250c610 100644
Binary files a/devel-docs/libgwydgets/html/gwy_scale_horizontally-24.png and b/devel-docs/libgwydgets/html/gwy_scale_horizontally-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_scale_vertically-24.png b/devel-docs/libgwydgets/html/gwy_scale_vertically-24.png
index 0730605..7894cb4 100644
Binary files a/devel-docs/libgwydgets/html/gwy_scale_vertically-24.png and b/devel-docs/libgwydgets/html/gwy_scale_vertically-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_scars-24.png b/devel-docs/libgwydgets/html/gwy_scars-24.png
index 3296df2..cbe9604 100644
Binary files a/devel-docs/libgwydgets/html/gwy_scars-24.png and b/devel-docs/libgwydgets/html/gwy_scars-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_selections-24.png b/devel-docs/libgwydgets/html/gwy_selections-24.png
index 6f1fbcc..4796ba8 100644
Binary files a/devel-docs/libgwydgets/html/gwy_selections-24.png and b/devel-docs/libgwydgets/html/gwy_selections-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_shader-24.png b/devel-docs/libgwydgets/html/gwy_shader-24.png
index 6b8c1c7..998ffab 100644
Binary files a/devel-docs/libgwydgets/html/gwy_shader-24.png and b/devel-docs/libgwydgets/html/gwy_shader-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_spectrum-24.png b/devel-docs/libgwydgets/html/gwy_spectrum-24.png
index 647900a..9b1ea59 100644
Binary files a/devel-docs/libgwydgets/html/gwy_spectrum-24.png and b/devel-docs/libgwydgets/html/gwy_spectrum-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_spot_remove-24.png b/devel-docs/libgwydgets/html/gwy_spot_remove-24.png
index d99d062..1e31aec 100644
Binary files a/devel-docs/libgwydgets/html/gwy_spot_remove-24.png and b/devel-docs/libgwydgets/html/gwy_spot_remove-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_stat_quantities-24.png b/devel-docs/libgwydgets/html/gwy_stat_quantities-24.png
index d0f3d67..7636b9b 100644
Binary files a/devel-docs/libgwydgets/html/gwy_stat_quantities-24.png and b/devel-docs/libgwydgets/html/gwy_stat_quantities-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_straighten_path-24.png b/devel-docs/libgwydgets/html/gwy_straighten_path-24.png
index a6f2804..7751eb2 100644
Binary files a/devel-docs/libgwydgets/html/gwy_straighten_path-24.png and b/devel-docs/libgwydgets/html/gwy_straighten_path-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_subscript-20.png b/devel-docs/libgwydgets/html/gwy_subscript-20.png
index c2277ec..953a18f 100644
Binary files a/devel-docs/libgwydgets/html/gwy_subscript-20.png and b/devel-docs/libgwydgets/html/gwy_subscript-20.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_superscript-20.png b/devel-docs/libgwydgets/html/gwy_superscript-20.png
index 1baf2af..a01f57d 100644
Binary files a/devel-docs/libgwydgets/html/gwy_superscript-20.png and b/devel-docs/libgwydgets/html/gwy_superscript-20.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_synthetic_ballistic_deposition-24.png b/devel-docs/libgwydgets/html/gwy_synthetic_ballistic_deposition-24.png
index db325f7..d6368f7 100644
Binary files a/devel-docs/libgwydgets/html/gwy_synthetic_ballistic_deposition-24.png and b/devel-docs/libgwydgets/html/gwy_synthetic_ballistic_deposition-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_synthetic_brownian_motion-24.png b/devel-docs/libgwydgets/html/gwy_synthetic_brownian_motion-24.png
index 98923a8..4751c3a 100644
Binary files a/devel-docs/libgwydgets/html/gwy_synthetic_brownian_motion-24.png and b/devel-docs/libgwydgets/html/gwy_synthetic_brownian_motion-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_synthetic_columnar-24.png b/devel-docs/libgwydgets/html/gwy_synthetic_columnar-24.png
index b92e702..f711f91 100644
Binary files a/devel-docs/libgwydgets/html/gwy_synthetic_columnar-24.png and b/devel-docs/libgwydgets/html/gwy_synthetic_columnar-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_synthetic_diffusion-24.png b/devel-docs/libgwydgets/html/gwy_synthetic_diffusion-24.png
index 5258d4b..024a088 100644
Binary files a/devel-docs/libgwydgets/html/gwy_synthetic_diffusion-24.png and b/devel-docs/libgwydgets/html/gwy_synthetic_diffusion-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_synthetic_domains-24.png b/devel-docs/libgwydgets/html/gwy_synthetic_domains-24.png
index 2be5361..59f1eda 100644
Binary files a/devel-docs/libgwydgets/html/gwy_synthetic_domains-24.png and b/devel-docs/libgwydgets/html/gwy_synthetic_domains-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_synthetic_fibres-24.png b/devel-docs/libgwydgets/html/gwy_synthetic_fibres-24.png
new file mode 100644
index 0000000..a375cee
Binary files /dev/null and b/devel-docs/libgwydgets/html/gwy_synthetic_fibres-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_synthetic_lattice-24.png b/devel-docs/libgwydgets/html/gwy_synthetic_lattice-24.png
index 3c0fbf6..afa711f 100644
Binary files a/devel-docs/libgwydgets/html/gwy_synthetic_lattice-24.png and b/devel-docs/libgwydgets/html/gwy_synthetic_lattice-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_synthetic_line_noise-24.png b/devel-docs/libgwydgets/html/gwy_synthetic_line_noise-24.png
index 439b959..4e37032 100644
Binary files a/devel-docs/libgwydgets/html/gwy_synthetic_line_noise-24.png and b/devel-docs/libgwydgets/html/gwy_synthetic_line_noise-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_synthetic_noise-24.png b/devel-docs/libgwydgets/html/gwy_synthetic_noise-24.png
index afd6ead..8633fc0 100644
Binary files a/devel-docs/libgwydgets/html/gwy_synthetic_noise-24.png and b/devel-docs/libgwydgets/html/gwy_synthetic_noise-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_synthetic_objects-24.png b/devel-docs/libgwydgets/html/gwy_synthetic_objects-24.png
index f640fc2..bdb5a5d 100644
Binary files a/devel-docs/libgwydgets/html/gwy_synthetic_objects-24.png and b/devel-docs/libgwydgets/html/gwy_synthetic_objects-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_synthetic_particles-24.png b/devel-docs/libgwydgets/html/gwy_synthetic_particles-24.png
index 651d2ce..d3db9cb 100644
Binary files a/devel-docs/libgwydgets/html/gwy_synthetic_particles-24.png and b/devel-docs/libgwydgets/html/gwy_synthetic_particles-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_synthetic_pattern-24.png b/devel-docs/libgwydgets/html/gwy_synthetic_pattern-24.png
index c79bb7e..d67a779 100644
Binary files a/devel-docs/libgwydgets/html/gwy_synthetic_pattern-24.png and b/devel-docs/libgwydgets/html/gwy_synthetic_pattern-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_synthetic_phases-24.png b/devel-docs/libgwydgets/html/gwy_synthetic_phases-24.png
new file mode 100644
index 0000000..63ecd8b
Binary files /dev/null and b/devel-docs/libgwydgets/html/gwy_synthetic_phases-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_synthetic_spectral-24.png b/devel-docs/libgwydgets/html/gwy_synthetic_spectral-24.png
index 1521b37..cbe79bb 100644
Binary files a/devel-docs/libgwydgets/html/gwy_synthetic_spectral-24.png and b/devel-docs/libgwydgets/html/gwy_synthetic_spectral-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_synthetic_waves-24.png b/devel-docs/libgwydgets/html/gwy_synthetic_waves-24.png
index 3e63c87..eff1f79 100644
Binary files a/devel-docs/libgwydgets/html/gwy_synthetic_waves-24.png and b/devel-docs/libgwydgets/html/gwy_synthetic_waves-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_tilt-24.png b/devel-docs/libgwydgets/html/gwy_tilt-24.png
index 74bba2f..181b61c 100644
Binary files a/devel-docs/libgwydgets/html/gwy_tilt-24.png and b/devel-docs/libgwydgets/html/gwy_tilt-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_tip_dilation-24.png b/devel-docs/libgwydgets/html/gwy_tip_dilation-24.png
index 5704053..4b99c67 100644
Binary files a/devel-docs/libgwydgets/html/gwy_tip_dilation-24.png and b/devel-docs/libgwydgets/html/gwy_tip_dilation-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_tip_erosion-24.png b/devel-docs/libgwydgets/html/gwy_tip_erosion-24.png
index fe8a7d4..48cc1e2 100644
Binary files a/devel-docs/libgwydgets/html/gwy_tip_erosion-24.png and b/devel-docs/libgwydgets/html/gwy_tip_erosion-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_tip_estimation-24.png b/devel-docs/libgwydgets/html/gwy_tip_estimation-24.png
index 9426647..c87f50e 100644
Binary files a/devel-docs/libgwydgets/html/gwy_tip_estimation-24.png and b/devel-docs/libgwydgets/html/gwy_tip_estimation-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_tip_indent_analyze-24.png b/devel-docs/libgwydgets/html/gwy_tip_indent_analyze-24.png
index 65305a2..67e2a8b 100644
Binary files a/devel-docs/libgwydgets/html/gwy_tip_indent_analyze-24.png and b/devel-docs/libgwydgets/html/gwy_tip_indent_analyze-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_tip_lateral_force-24.png b/devel-docs/libgwydgets/html/gwy_tip_lateral_force-24.png
index 19038b0..b4a961a 100644
Binary files a/devel-docs/libgwydgets/html/gwy_tip_lateral_force-24.png and b/devel-docs/libgwydgets/html/gwy_tip_lateral_force-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_tip_map-24.png b/devel-docs/libgwydgets/html/gwy_tip_map-24.png
index 7da7dd9..ff91df3 100644
Binary files a/devel-docs/libgwydgets/html/gwy_tip_map-24.png and b/devel-docs/libgwydgets/html/gwy_tip_map-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_tip_model-24.png b/devel-docs/libgwydgets/html/gwy_tip_model-24.png
index 5bcc340..0f57f6c 100644
Binary files a/devel-docs/libgwydgets/html/gwy_tip_model-24.png and b/devel-docs/libgwydgets/html/gwy_tip_model-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_tip_pid-24.png b/devel-docs/libgwydgets/html/gwy_tip_pid-24.png
index b7f74fa..2a3606d 100644
Binary files a/devel-docs/libgwydgets/html/gwy_tip_pid-24.png and b/devel-docs/libgwydgets/html/gwy_tip_pid-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_unrotate-24.png b/devel-docs/libgwydgets/html/gwy_unrotate-24.png
index d77a1e7..954a469 100644
Binary files a/devel-docs/libgwydgets/html/gwy_unrotate-24.png and b/devel-docs/libgwydgets/html/gwy_unrotate-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_value_invert-24.png b/devel-docs/libgwydgets/html/gwy_value_invert-24.png
index e38a555..4f85f9b 100644
Binary files a/devel-docs/libgwydgets/html/gwy_value_invert-24.png and b/devel-docs/libgwydgets/html/gwy_value_invert-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_volume-24.png b/devel-docs/libgwydgets/html/gwy_volume-24.png
index 5e3ddf2..d1effc9 100644
Binary files a/devel-docs/libgwydgets/html/gwy_volume-24.png and b/devel-docs/libgwydgets/html/gwy_volume-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_volume_calibrate-24.png b/devel-docs/libgwydgets/html/gwy_volume_calibrate-24.png
index 2011863..c765049 100644
Binary files a/devel-docs/libgwydgets/html/gwy_volume_calibrate-24.png and b/devel-docs/libgwydgets/html/gwy_volume_calibrate-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_volume_dimensions-24.png b/devel-docs/libgwydgets/html/gwy_volume_dimensions-24.png
index 6147235..faa0ba1 100644
Binary files a/devel-docs/libgwydgets/html/gwy_volume_dimensions-24.png and b/devel-docs/libgwydgets/html/gwy_volume_dimensions-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_volume_fd-24.png b/devel-docs/libgwydgets/html/gwy_volume_fd-24.png
index e7a28e4..846421b 100644
Binary files a/devel-docs/libgwydgets/html/gwy_volume_fd-24.png and b/devel-docs/libgwydgets/html/gwy_volume_fd-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_volume_invert-24.png b/devel-docs/libgwydgets/html/gwy_volume_invert-24.png
index 7c2450f..5d2e513 100644
Binary files a/devel-docs/libgwydgets/html/gwy_volume_invert-24.png and b/devel-docs/libgwydgets/html/gwy_volume_invert-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_volume_kmeans-24.png b/devel-docs/libgwydgets/html/gwy_volume_kmeans-24.png
index d16773b..1e30b6e 100644
Binary files a/devel-docs/libgwydgets/html/gwy_volume_kmeans-24.png and b/devel-docs/libgwydgets/html/gwy_volume_kmeans-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_volume_kmedians-24.png b/devel-docs/libgwydgets/html/gwy_volume_kmedians-24.png
index ba33d87..20be117 100644
Binary files a/devel-docs/libgwydgets/html/gwy_volume_kmedians-24.png and b/devel-docs/libgwydgets/html/gwy_volume_kmedians-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_volume_slice-24.png b/devel-docs/libgwydgets/html/gwy_volume_slice-24.png
index ed1b502..13a3630 100644
Binary files a/devel-docs/libgwydgets/html/gwy_volume_slice-24.png and b/devel-docs/libgwydgets/html/gwy_volume_slice-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_volumize-24.png b/devel-docs/libgwydgets/html/gwy_volumize-24.png
index 9bde137..dfcebcd 100644
Binary files a/devel-docs/libgwydgets/html/gwy_volumize-24.png and b/devel-docs/libgwydgets/html/gwy_volumize-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_volumize_layers-24.png b/devel-docs/libgwydgets/html/gwy_volumize_layers-24.png
index 5e262c0..5349ff6 100644
Binary files a/devel-docs/libgwydgets/html/gwy_volumize_layers-24.png and b/devel-docs/libgwydgets/html/gwy_volumize_layers-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_xy_denoise-24.png b/devel-docs/libgwydgets/html/gwy_xy_denoise-24.png
new file mode 100644
index 0000000..9758b6c
Binary files /dev/null and b/devel-docs/libgwydgets/html/gwy_xy_denoise-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_zero_mean-24.png b/devel-docs/libgwydgets/html/gwy_zero_mean-24.png
index 690a0cf..09ac938 100644
Binary files a/devel-docs/libgwydgets/html/gwy_zero_mean-24.png and b/devel-docs/libgwydgets/html/gwy_zero_mean-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_zoom_1_1-24.png b/devel-docs/libgwydgets/html/gwy_zoom_1_1-24.png
index 4383133..2506a6a 100644
Binary files a/devel-docs/libgwydgets/html/gwy_zoom_1_1-24.png and b/devel-docs/libgwydgets/html/gwy_zoom_1_1-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_zoom_fit-24.png b/devel-docs/libgwydgets/html/gwy_zoom_fit-24.png
index 45cdd33..0e84941 100644
Binary files a/devel-docs/libgwydgets/html/gwy_zoom_fit-24.png and b/devel-docs/libgwydgets/html/gwy_zoom_fit-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_zoom_in-24.png b/devel-docs/libgwydgets/html/gwy_zoom_in-24.png
index cdd20ab..54d3e14 100644
Binary files a/devel-docs/libgwydgets/html/gwy_zoom_in-24.png and b/devel-docs/libgwydgets/html/gwy_zoom_in-24.png differ
diff --git a/devel-docs/libgwydgets/html/gwy_zoom_out-24.png b/devel-docs/libgwydgets/html/gwy_zoom_out-24.png
index c47199e..fb0ad41 100644
Binary files a/devel-docs/libgwydgets/html/gwy_zoom_out-24.png and b/devel-docs/libgwydgets/html/gwy_zoom_out-24.png differ
diff --git a/devel-docs/libgwydgets/html/index.html b/devel-docs/libgwydgets/html/index.html
index 6846edb..3e1f464 100644
--- a/devel-docs/libgwydgets/html/index.html
+++ b/devel-docs/libgwydgets/html/index.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Gwyddion Widgets Library Reference Manual: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="next" href="DataWindowWidgets.html" title="Data Windows and Views">
 <meta name="generator" content="GTK-Doc V1.19 (XML mode)">
@@ -15,7 +15,7 @@
 <div>
 <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">Gwyddion Widgets Library Reference Manual</p></th></tr></table></div>
 <div><p class="releaseinfo">
-  For Gwyddion 2.47.
+  For Gwyddion 2.49.
   The latest version of this document can be found on-line at
   <a class="ulink" href="http://gwyddion.net/documentation/libgwydgets/index.php" target="_top">http://gwyddion.net/documentation/libgwydgets/</a>.
 </p></div>
@@ -124,6 +124,9 @@
 <dt><span class="chapter"><a href="GeneralWidgets.html">General Widgets</a></span></dt>
 <dd><dl>
 <dt>
+<span class="refentrytitle"><a href="GwyAdjustBar.html">GwyAdjustBar</a></span><span class="refpurpose"> — Compact adjustment visualisation and modification</span>
+</dt>
+<dt>
 <span class="refentrytitle"><a href="GwyColorButton.html">GwyColorButton</a></span><span class="refpurpose"> — A color displaying button</span>
 </dt>
 <dt>
@@ -213,6 +216,8 @@
 <dt><span class="index"><a href="api-index-2-43.html">Index of new symbols in 2.43</a></span></dt>
 <dt><span class="index"><a href="api-index-2-45.html">Index of new symbols in 2.45</a></span></dt>
 <dt><span class="index"><a href="api-index-2-46.html">Index of new symbols in 2.46</a></span></dt>
+<dt><span class="index"><a href="api-index-2-48.html">Index of new symbols in 2.48</a></span></dt>
+<dt><span class="index"><a href="api-index-2-49.html">Index of new symbols in 2.49</a></span></dt>
 </dl></div>
 <p>
     This library contains Gwyddion extension Gtk+ widgets and widget
diff --git a/devel-docs/libgwydgets/html/libgwydgets-GwyGraphBasics.html b/devel-docs/libgwydgets/html/libgwydgets-GwyGraphBasics.html
index aa62926..c46b7c6 100644
--- a/devel-docs/libgwydgets/html/libgwydgets-GwyGraphBasics.html
+++ b/devel-docs/libgwydgets/html/libgwydgets-GwyGraphBasics.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyGraphBasics: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="GraphWidgets.html" title="Graphs">
 <link rel="prev" href="GwyAxis.html" title="GwyAxis">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwydgets-GwyGraphBasics.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -131,7 +131,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwydgets-GwyGraphBasics.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -165,7 +165,7 @@ gwy_graph_draw_point (<em class="parameter"><code><a href="http://developer.gnom
 <p>Draws a point on a drawable.</p>
 <div class="refsect3">
 <a name="gwy-graph-draw-point.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -228,7 +228,7 @@ gwy_graph_draw_line (<em class="parameter"><code><a href="http://developer.gnome
 <p>Draws a line segment on a drawable.</p>
 <div class="refsect3">
 <a name="gwy-graph-draw-line.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -296,7 +296,7 @@ gwy_graph_draw_curve (<em class="parameter"><code><a href="http://developer.gnom
 <p>Draws a single graph curve on a drawable.</p>
 <div class="refsect3">
 <a name="gwy-graph-draw-curve.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -339,7 +339,7 @@ gwy_graph_draw_selection_points (<em class="parameter"><code><a href="/usr/share
 <p>Draws selection points on a drawable.</p>
 <div class="refsect3">
 <a name="gwy-graph-draw-selection-points.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -381,7 +381,7 @@ gwy_graph_draw_selection_areas (<em class="parameter"><code><a href="/usr/share/
 <p>Draws selected area on a drawable.</p>
 <div class="refsect3">
 <a name="gwy-graph-draw-selection-areas.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -425,7 +425,7 @@ gwy_graph_draw_selection_lines (<em class="parameter"><code><a href="/usr/share/
 <p>Draws selected lines on a drawable.</p>
 <div class="refsect3">
 <a name="gwy-graph-draw-selection-lines.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -473,7 +473,7 @@ gwy_graph_draw_selection_xareas (<em class="parameter"><code><a href="/usr/share
 <p>Draws selected x-area on a drawable.</p>
 <div class="refsect3">
 <a name="gwy-graph-draw-selection-xareas.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -516,7 +516,7 @@ gwy_graph_draw_selection_yareas (<em class="parameter"><code><a href="/usr/share
 <p>Drawss selected y-area on a drawable.</p>
 <div class="refsect3">
 <a name="gwy-graph-draw-selection-yareas.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -562,7 +562,7 @@ gwy_graph_draw_grid (<em class="parameter"><code><a href="/usr/share/gtk-doc/htm
 <p>Draws an array of grid lines on a drawable.</p>
 <div class="refsect3">
 <a name="gwy-graph-draw-grid.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -624,7 +624,7 @@ curves when there is no reason to prefer a particular color.  Note they
 can occasionally change between version, even their number can change.</p>
 <div class="refsect3">
 <a name="gwy-graph-get-preset-color.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -676,7 +676,7 @@ gwy_graph_get_n_preset_colors (<em class="parameter"><code><span class="type">vo
 <p>Graph area specification (for graph drawing primitives).</p>
 <div class="refsect3">
 <a name="GwyGraphActiveAreaSpecs.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
diff --git a/devel-docs/libgwydgets/html/libgwydgets-gwycombobox.html b/devel-docs/libgwydgets/html/libgwydgets-gwycombobox.html
index 368af71..9336e4e 100644
--- a/devel-docs/libgwydgets/html/libgwydgets-gwycombobox.html
+++ b/devel-docs/libgwydgets/html/libgwydgets-gwycombobox.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwycombobox: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="WidgetUtilities.html" title="Widget Utilities">
 <link rel="prev" href="libgwydgets-gwygrainvaluemenu.html" title="gwygrainvaluemenu">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwydgets-gwycombobox.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -222,7 +222,7 @@ gwy_enum_combo_box_new (<em class="parameter"><code>const <span class="type">Gwy
 because it is used directly as the model.</p>
 <div class="refsect3">
 <a name="gwy-enum-combo-box-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -288,7 +288,7 @@ gwy_enum_combo_box_newl (<em class="parameter"><code><a href="/usr/share/gtk-doc
 lifetime of the widget.</p>
 <div class="refsect3">
 <a name="gwy-enum-combo-box-newl.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -341,7 +341,7 @@ gwy_combo_box_metric_unit_new (<em class="parameter"><code><a href="/usr/share/g
 <p>The integer value is the power of 10.</p>
 <div class="refsect3">
 <a name="gwy-combo-box-metric-unit-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -401,7 +401,7 @@ gwy_combo_box_metric_unit_set_unit (<em class="parameter"><code><a href="/usr/sh
 <p>Changes the unit selection displayed by a metric unit combo box.</p>
 <div class="refsect3">
 <a name="gwy-combo-box-metric-unit-set-unit.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -448,7 +448,7 @@ gwy_combo_box_graph_curve_new (<em class="parameter"><code><a href="/usr/share/g
 graph modules.  The graph model is not permitted to change.</p>
 <div class="refsect3">
 <a name="gwy-combo-box-graph-curve-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -495,7 +495,7 @@ gwy_enum_combo_box_set_active (<em class="parameter"><code><a href="/usr/share/g
 <p>Sets the active combo box item by corresponding enum value.</p>
 <div class="refsect3">
 <a name="gwy-enum-combo-box-set-active.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -524,7 +524,7 @@ gwy_enum_combo_box_get_active (<em class="parameter"><code><a href="/usr/share/g
 <p>Gets the enum value corresponding to currently active combo box item.</p>
 <div class="refsect3">
 <a name="gwy-enum-combo-box-get-active.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -552,7 +552,7 @@ gwy_enum_combo_box_update_int (<em class="parameter"><code><a href="/usr/share/g
 combo box value.</p>
 <div class="refsect3">
 <a name="gwy-enum-combo-box-update-int.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/libgwydgets-gwydgetenums.html b/devel-docs/libgwydgets/html/libgwydgets-gwydgetenums.html
index 8e733a8..325a727 100644
--- a/devel-docs/libgwydgets/html/libgwydgets-gwydgetenums.html
+++ b/devel-docs/libgwydgets/html/libgwydgets-gwydgetenums.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwydgetenums: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="WidgetUtilities.html" title="Widget Utilities">
 <link rel="prev" href="libgwydgets-gwydgets.html" title="gwydgets">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwydgets-gwydgetenums.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -49,7 +49,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwydgets-gwydgetenums.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -162,7 +162,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <p>Labeled axis tick mark format.</p>
 <div class="refsect3">
 <a name="GwyAxisScaleFormat.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -200,7 +200,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <p>The type of 3D view change that happens when user drags it with mouse.</p>
 <div class="refsect3">
 <a name="Gwy3DMovement.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -252,7 +252,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <p>3D View projection type.</p>
 <div class="refsect3">
 <a name="Gwy3DProjection.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -283,7 +283,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <p>3D View data visualization type.</p>
 <div class="refsect3">
 <a name="Gwy3DVisualization.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -335,7 +335,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <p>3D View label type.</p>
 <div class="refsect3">
 <a name="Gwy3DViewLabel.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -387,7 +387,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <p>Units placement on a <a class="link" href="GwyRuler.html" title="GwyRuler"><span class="type">GwyRuler</span></a>.</p>
 <div class="refsect3">
 <a name="GwyUnitsPlacement.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -417,10 +417,11 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <hr>
 <div class="refsect2">
 <a name="GwyHScaleStyle"></a><h3>enum GwyHScaleStyle</h3>
-<p>Options controlling <a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-attach-hscale" title="gwy_table_attach_hscale ()"><code class="function">gwy_table_attach_hscale()</code></a> behaviour.</p>
+<p>Options controlling <a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-attach-adjbar" title="gwy_table_attach_adjbar ()"><code class="function">gwy_table_attach_adjbar()</code></a> and <a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-attach-hscale" title="gwy_table_attach_hscale ()"><code class="function">gwy_table_attach_hscale()</code></a>
+behaviour.</p>
 <div class="refsect3">
 <a name="GwyHScaleStyle.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -431,36 +432,44 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <td class="enum_member_name"><p><a name="GWY-HSCALE-DEFAULT:CAPS"></a>GWY_HSCALE_DEFAULT</p></td>
 <td class="enum_member_description">
 <p>Default label, hscale, spinbutton, and units widget
-                     row.</p>
+                     row.  Note that the default mapping is linear for
+                     hscales but signed square root for adjust bars.</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="GWY-HSCALE-LOG:CAPS"></a>GWY_HSCALE_LOG</p></td>
 <td class="enum_member_description">
-<p>Hscale is logarithmic.</p>
+<p>The scale mapping is logarithmic.</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="GWY-HSCALE-SQRT:CAPS"></a>GWY_HSCALE_SQRT</p></td>
 <td class="enum_member_description">
-<p>Hscale is square root.</p>
+<p>The scale mapping is signed square root.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GWY-HSCALE-LINEAR:CAPS"></a>GWY_HSCALE_LINEAR</p></td>
+<td class="enum_member_description">
+<p>The scale mapping is linear.  (Since 2.49)</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="GWY-HSCALE-NO-SCALE:CAPS"></a>GWY_HSCALE_NO_SCALE</p></td>
 <td class="enum_member_description">
-<p>There is no hscale.</p>
+<p>There is no hscale/adjust bar.</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="GWY-HSCALE-WIDGET:CAPS"></a>GWY_HSCALE_WIDGET</p></td>
 <td class="enum_member_description">
-<p>An user-specified widget is used in place of hscale and
-                    spinbutton.</p>
+<p>An user-specified widget is used in place of the
+                    adjustment control(s).</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
@@ -477,7 +486,17 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <td class="enum_member_name"><p><a name="GWY-HSCALE-CHECK:CAPS"></a>GWY_HSCALE_CHECK</p></td>
 <td class="enum_member_description">
 <p>The label is actually a check button that controls
-                   sensitivity of the row.</p>
+                   sensitivity of the row.  This is a flag, to be bitwise
+                   or-ed with other values.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GWY-HSCALE-SNAP:CAPS"></a>GWY_HSCALE_SNAP</p></td>
+<td class="enum_member_description">
+<p>The adjust bar snaps to ticks (hscales cannot snap).
+                  This is a flag, to be bitwise or-ed with other values.
+                  (Since 2.49)</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
@@ -490,7 +509,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <a name="GwyGraphStatusType"></a><h3>enum GwyGraphStatusType</h3>
 <div class="refsect3">
 <a name="GwyGraphStatusType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -541,7 +560,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <a name="GwyGraphGridType"></a><h3>enum GwyGraphGridType</h3>
 <div class="refsect3">
 <a name="GwyGraphGridType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -572,7 +591,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <a name="GwyGraphPointType"></a><h3>enum GwyGraphPointType</h3>
 <div class="refsect3">
 <a name="GwyGraphPointType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -684,7 +703,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <p>Graph curve plotting type.</p>
 <div class="refsect3">
 <a name="GwyGraphCurveType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -728,7 +747,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <a name="GwyGraphLabelPosition"></a><h3>enum GwyGraphLabelPosition</h3>
 <div class="refsect3">
 <a name="GwyGraphLabelPosition.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -770,7 +789,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <p>Graph ASCII export style.</p>
 <div class="refsect3">
 <a name="GwyGraphModelExportStyle.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -853,7 +872,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <p>Types of color gradient mapping in <a class="link" href="GwyLayerBasic.html" title="GwyLayerBasic"><span class="type">GwyLayerBasic</span></a>.</p>
 <div class="refsect3">
 <a name="GwyLayerBasicRangeType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -903,7 +922,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <p>Curve drawing type in <a class="link" href="GwyCurve.html" title="GwyCurve"><span class="type">GwyCurve</span></a>.</p>
 <div class="refsect3">
 <a name="GwyCurveType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -940,7 +959,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <a name="GwyCurveChannel"></a><h3>enum GwyCurveChannel</h3>
 <div class="refsect3">
 <a name="GwyCurveChannel.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -972,7 +991,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <p><a class="link" href="GwyMarkerBox.html" title="GwyMarkerBox"><span class="type">GwyMarkerBox</span></a> operation type (for validation).</p>
 <div class="refsect3">
 <a name="GwyMarkerOperationType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -1010,7 +1029,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <p><a class="link" href="GwyDataView.html" title="GwyDataView"><span class="type">GwyDataView</span></a> layer identification.</p>
 <div class="refsect3">
 <a name="GwyDataViewLayerType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -1048,7 +1067,7 @@ gwy_graph_curve_type_get_enum (<em class="parameter"><code><span class="type">vo
 <p>Axis ticks style (used in <a class="link" href="GwyColorAxis.html" title="GwyColorAxis"><span class="type">GwyColorAxis</span></a>).</p>
 <div class="refsect3">
 <a name="GwyTicksStyle.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwydgets/html/libgwydgets-gwydgets.html b/devel-docs/libgwydgets/html/libgwydgets-gwydgets.html
index ca69fc5..af7c4a1 100644
--- a/devel-docs/libgwydgets/html/libgwydgets-gwydgets.html
+++ b/devel-docs/libgwydgets/html/libgwydgets-gwydgets.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwydgets: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="WidgetUtilities.html" title="Widget Utilities">
 <link rel="prev" href="WidgetUtilities.html" title="Widget Utilities">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwydgets-gwydgets.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -68,7 +68,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwydgets-gwydgets.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
diff --git a/devel-docs/libgwydgets/html/libgwydgets-gwydgetutils.html b/devel-docs/libgwydgets/html/libgwydgets-gwydgetutils.html
index 18c103d..f1dbc71 100644
--- a/devel-docs/libgwydgets/html/libgwydgets-gwydgetutils.html
+++ b/devel-docs/libgwydgets/html/libgwydgets-gwydgetutils.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwydgetutils: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="WidgetUtilities.html" title="Widget Utilities">
 <link rel="prev" href="libgwydgets-gwydgetenums.html" title="gwydgetenums">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwydgets-gwydgetutils.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -71,6 +71,14 @@
 </tr>
 <tr>
 <td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-attach-adjbar" title="gwy_table_attach_adjbar ()">gwy_table_attach_adjbar</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
@@ -78,33 +86,43 @@
 </td>
 </tr>
 <tr>
-<td class="define_keyword">#define</td>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+</td>
 <td class="function_name">
-<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-scale" title="gwy_table_hscale_get_scale()">gwy_table_hscale_get_scale</a><span class="c_punctuation">()</span>
+<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-scale" title="gwy_table_hscale_get_scale ()">gwy_table_hscale_get_scale</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <tr>
-<td class="define_keyword">#define</td>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+</td>
 <td class="function_name">
-<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-check" title="gwy_table_hscale_get_check()">gwy_table_hscale_get_check</a><span class="c_punctuation">()</span>
+<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-check" title="gwy_table_hscale_get_check ()">gwy_table_hscale_get_check</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <tr>
-<td class="define_keyword">#define</td>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+</td>
 <td class="function_name">
-<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-label" title="gwy_table_hscale_get_label()">gwy_table_hscale_get_label</a><span class="c_punctuation">()</span>
+<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-label" title="gwy_table_hscale_get_label ()">gwy_table_hscale_get_label</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <tr>
-<td class="define_keyword">#define</td>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+</td>
 <td class="function_name">
-<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-units" title="gwy_table_hscale_get_units()">gwy_table_hscale_get_units</a><span class="c_punctuation">()</span>
+<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-units" title="gwy_table_hscale_get_units ()">gwy_table_hscale_get_units</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <tr>
-<td class="define_keyword">#define</td>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+</td>
 <td class="function_name">
-<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-middle-widget" title="gwy_table_hscale_get_middle_widget()">gwy_table_hscale_get_middle_widget</a><span class="c_punctuation">()</span>
+<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-middle-widget" title="gwy_table_hscale_get_middle_widget ()">gwy_table_hscale_get_middle_widget</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <tr>
@@ -222,7 +240,7 @@
 <p>Gets a properly rounded integer value from an adjustment, cast to <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a>.</p>
 <div class="refsect3">
 <a name="gwy-adjustment-get-int.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -230,7 +248,7 @@
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>adj</p></td>
-<td class="parameter_description"><p>A <a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk3GtkAdjustment.html#GtkAdjustment-struct"><span class="type">GtkAdjustment</span></a> to get value of.</p></td>
+<td class="parameter_description"><p>A <a href="/usr/share/gtk-doc/html/gtk3GtkAdjustment.html#GtkAdjustment-struct"><span class="type">GtkAdjustment</span></a> to get value of.</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -239,16 +257,16 @@
 <hr>
 <div class="refsect2">
 <a name="gwy-table-attach-spinbutton"></a><h3>gwy_table_attach_spinbutton ()</h3>
-<pre class="programlisting"><a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
-gwy_table_attach_spinbutton (<em class="parameter"><code><a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk3GtkWidget.html#GtkWidget-struct"><span class="type">GtkWidget</span></a> *table</code></em>,
-                             <em class="parameter"><code><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> row</code></em>,
-                             <em class="parameter"><code>const <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
-                             <em class="parameter"><code>const <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *units</code></em>,
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+gwy_table_attach_spinbutton (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gtk3GtkWidget.html#GtkWidget-struct"><span class="type">GtkWidget</span></a> *table</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> row</code></em>,
+                             <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
+                             <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *units</code></em>,
                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/gtk2GtkObject.html#GtkObject-struct"><span class="type">GtkObject</span></a> *adj</code></em>);</pre>
 <p>Attaches a spinbutton with two labels to a table.</p>
 <div class="refsect3">
 <a name="gwy-table-attach-spinbutton.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -302,7 +320,7 @@ gwy_table_attach_row (<em class="parameter"><code><a href="/usr/share/gtk-doc/ht
 <p>Attaches a widget with two labels to a table.</p>
 <div class="refsect3">
 <a name="gwy-table-attach-row.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -350,16 +368,19 @@ gwy_table_attach_hscale (<em class="parameter"><code><a href="/usr/share/gtk-doc
                          <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *units</code></em>,
                          <em class="parameter"><code><a href="/usr/share/gtk-doc/html/gtk2GtkObject.html#GtkObject-struct"><span class="type">GtkObject</span></a> *pivot</code></em>,
                          <em class="parameter"><code><a class="link" href="libgwydgets-gwydgetenums.html#GwyHScaleStyle" title="enum GwyHScaleStyle"><span class="type">GwyHScaleStyle</span></a> style</code></em>);</pre>
-<p>Attaches a spinbutton with a scale and labels, or something else to a table
+<p>Attaches a spinbutton with a scale and labels, or something else, to a table
 row.</p>
-<p>You can use functions <a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-scale" title="gwy_table_hscale_get_scale()"><code class="function">gwy_table_hscale_get_scale()</code></a>,
-<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-check" title="gwy_table_hscale_get_check()"><code class="function">gwy_table_hscale_get_check()</code></a>, etc. to get the various widgets from pivot
+<p>The group of controls takes four table columns: label, scale, spinbutton
+and units.</p>
+<p>You can use functions <a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-scale" title="gwy_table_hscale_get_scale ()"><code class="function">gwy_table_hscale_get_scale()</code></a>,
+<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-check" title="gwy_table_hscale_get_check ()"><code class="function">gwy_table_hscale_get_check()</code></a>, etc. to get the various widgets from pivot
 later.</p>
-<p>FIXME: What exactly happens with various <em class="parameter"><code>style</code></em>
- values is quite convoluted.</p>
+<p>The function usually does the right thing but what exactly happens with
+various <em class="parameter"><code>style</code></em>
+ values is a bit convoluted.</p>
 <div class="refsect3">
 <a name="gwy-table-attach-hscale.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -415,19 +436,100 @@ itself.</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-table-attach-adjbar"></a><h3>gwy_table_attach_adjbar ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+gwy_table_attach_adjbar (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gtk3GtkWidget.html#GtkWidget-struct"><span class="type">GtkWidget</span></a> *table</code></em>,
+                         <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> row</code></em>,
+                         <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
+                         <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *units</code></em>,
+                         <em class="parameter"><code><a href="/usr/share/gtk-doc/html/gtk2GtkObject.html#GtkObject-struct"><span class="type">GtkObject</span></a> *pivot</code></em>,
+                         <em class="parameter"><code><a class="link" href="libgwydgets-gwydgetenums.html#GwyHScaleStyle" title="enum GwyHScaleStyle"><span class="type">GwyHScaleStyle</span></a> style</code></em>);</pre>
+<p>Attaches an adjustment bar with spinbutton and labels, or something else, to
+a table row.</p>
+<p>The group of controls takes three table columns: adjustment bar, spinbutton
+and units.</p>
+<p>You can use functions <a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-scale" title="gwy_table_hscale_get_scale ()"><code class="function">gwy_table_hscale_get_scale()</code></a>,
+<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-check" title="gwy_table_hscale_get_check ()"><code class="function">gwy_table_hscale_get_check()</code></a>, etc. to get the various widgets from pivot
+later.</p>
+<p>The function usually does the right thing but what exactly happens with
+various <em class="parameter"><code>style</code></em>
+ values is a bit convoluted.</p>
+<div class="refsect3">
+<a name="gwy-table-attach-adjbar.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>table</p></td>
+<td class="parameter_description"><p>A <a href="/usr/share/gtk-doc/html/gtk3GtkTable.html#GtkTable-struct"><span class="type">GtkTable</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>row</p></td>
+<td class="parameter_description"><p>Row in <em class="parameter"><code>table</code></em>
+to attach stuff to.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>name</p></td>
+<td class="parameter_description"><p>The label before <em class="parameter"><code>pivot</code></em>
+widget.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>units</p></td>
+<td class="parameter_description"><p>The label after <em class="parameter"><code>pivot</code></em>
+widget.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>pivot</p></td>
+<td class="parameter_description"><p>Either a <a href="/usr/share/gtk-doc/html/gtk3GtkAdjustment.html#GtkAdjustment-struct"><span class="type">GtkAdjustment</span></a>, or a widget to use instead of the spin
+button and scale widgets (if <em class="parameter"><code>style</code></em>
+is <a class="link" href="libgwydgets-gwydgetenums.html#GWY-HSCALE-WIDGET:CAPS"><code class="literal">GWY_HSCALE_WIDGET</code></a>).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>style</p></td>
+<td class="parameter_description"><p>A mix of options an flags determining what and how will be attached
+to the table.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-table-attach-adjbar.returns"></a><h4>Returns</h4>
+<p> The middle widget.  If a spinbutton is attached, then this
+spinbutton is returned.  Otherwise (in <a class="link" href="libgwydgets-gwydgetenums.html#GWY-HSCALE-WIDGET:CAPS"><code class="literal">GWY_HSCALE_WIDGET</code></a> case)
+<em class="parameter"><code>pivot</code></em>
+itself.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-table-hscale-set-sensitive"></a><h3>gwy_table_hscale_set_sensitive ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_table_hscale_set_sensitive (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gtk2GtkObject.html#GtkObject-struct"><span class="type">GtkObject</span></a> *pivot</code></em>,
                                 <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> sensitive</code></em>);</pre>
-<p>Sets sensitivity of a group of controls create by <a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-attach-hscale" title="gwy_table_attach_hscale ()"><code class="function">gwy_table_attach_hscale()</code></a>.</p>
-<p>Do not use with <a class="link" href="libgwydgets-gwydgetenums.html#GWY-HSCALE-CHECK:CAPS"><code class="literal">GWY_HSCALE_CHECK</code></a>, simply set state of the check button
-in such a case.</p>
-<p>This function can be used with rows created by <a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-attach-spinbutton" title="gwy_table_attach_spinbutton ()"><code class="function">gwy_table_attach_spinbutton()</code></a>
-too if the spinbutton is passed as <em class="parameter"><code>pivot</code></em>
+<p>Sets sensitivity of a group of controls create by <a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-attach-hscale" title="gwy_table_attach_hscale ()"><code class="function">gwy_table_attach_hscale()</code></a>
+or <a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-attach-adjbar" title="gwy_table_attach_adjbar ()"><code class="function">gwy_table_attach_adjbar()</code></a>.</p>
+<p>For controls without an enable/disable check button controls the sensitivity
+as expected.  If the hscale was created with <a class="link" href="libgwydgets-gwydgetenums.html#GWY-HSCALE-CHECK:CAPS"><code class="literal">GWY_HSCALE_CHECK</code></a> you usually
+manage its sensitivity by setting state of the check button instead.
+Only use this function when you want to enable/disable the entire group
+of controls, including the check button.</p>
+<p>This function can also be used with rows created by
+<a class="link" href="libgwydgets-gwydgetutils.html#gwy-table-attach-spinbutton" title="gwy_table_attach_spinbutton ()"><code class="function">gwy_table_attach_spinbutton()</code></a> too if the spinbutton is passed as <em class="parameter"><code>pivot</code></em>
 .</p>
 <div class="refsect3">
 <a name="gwy-table-hscale-set-sensitive.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -452,14 +554,15 @@ too if the spinbutton is passed as <em class="parameter"><code>pivot</code></em>
 </div>
 <hr>
 <div class="refsect2">
-<a name="gwy-table-hscale-get-scale"></a><h3>gwy_table_hscale_get_scale()</h3>
-<pre class="programlisting">#define             gwy_table_hscale_get_scale(pivot)</pre>
+<a name="gwy-table-hscale-get-scale"></a><h3>gwy_table_hscale_get_scale ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+gwy_table_hscale_get_scale (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gtk2GtkObject.html#GtkObject-struct"><span class="type">GtkObject</span></a> *pivot</code></em>);</pre>
 <p>Gets the horizontal scale associated with a pivot object.</p>
 <p>May return <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if constructed with <a class="link" href="libgwydgets-gwydgetenums.html#GWY-HSCALE-NO-SCALE:CAPS"><code class="literal">GWY_HSCALE_NO_SCALE</code></a>,
 <a class="link" href="libgwydgets-gwydgetenums.html#GWY-HSCALE-WIDGET:CAPS"><code class="literal">GWY_HSCALE_WIDGET</code></a>, or <a class="link" href="libgwydgets-gwydgetenums.html#GWY-HSCALE-WIDGET-NO-EXPAND:CAPS"><code class="literal">GWY_HSCALE_WIDGET_NO_EXPAND</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-table-hscale-get-scale.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -475,13 +578,14 @@ too if the spinbutton is passed as <em class="parameter"><code>pivot</code></em>
 </div>
 <hr>
 <div class="refsect2">
-<a name="gwy-table-hscale-get-check"></a><h3>gwy_table_hscale_get_check()</h3>
-<pre class="programlisting">#define             gwy_table_hscale_get_check(pivot)</pre>
+<a name="gwy-table-hscale-get-check"></a><h3>gwy_table_hscale_get_check ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+gwy_table_hscale_get_check (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gtk2GtkObject.html#GtkObject-struct"><span class="type">GtkObject</span></a> *pivot</code></em>);</pre>
 <p>Gets the check button associated with a pivot object.</p>
 <p>May return <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if not constructed with <a class="link" href="libgwydgets-gwydgetenums.html#GWY-HSCALE-CHECK:CAPS"><code class="literal">GWY_HSCALE_CHECK</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-table-hscale-get-check.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -497,13 +601,14 @@ too if the spinbutton is passed as <em class="parameter"><code>pivot</code></em>
 </div>
 <hr>
 <div class="refsect2">
-<a name="gwy-table-hscale-get-label"></a><h3>gwy_table_hscale_get_label()</h3>
-<pre class="programlisting">#define             gwy_table_hscale_get_label(pivot)</pre>
+<a name="gwy-table-hscale-get-label"></a><h3>gwy_table_hscale_get_label ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+gwy_table_hscale_get_label (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gtk2GtkObject.html#GtkObject-struct"><span class="type">GtkObject</span></a> *pivot</code></em>);</pre>
 <p>Gets the (left) label associated with a pivot object.</p>
 <p>May return <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if constructed with <a class="link" href="libgwydgets-gwydgetenums.html#GWY-HSCALE-CHECK:CAPS"><code class="literal">GWY_HSCALE_CHECK</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-table-hscale-get-label.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -519,13 +624,14 @@ too if the spinbutton is passed as <em class="parameter"><code>pivot</code></em>
 </div>
 <hr>
 <div class="refsect2">
-<a name="gwy-table-hscale-get-units"></a><h3>gwy_table_hscale_get_units()</h3>
-<pre class="programlisting">#define             gwy_table_hscale_get_units(pivot)</pre>
+<a name="gwy-table-hscale-get-units"></a><h3>gwy_table_hscale_get_units ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+gwy_table_hscale_get_units (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gtk2GtkObject.html#GtkObject-struct"><span class="type">GtkObject</span></a> *pivot</code></em>);</pre>
 <p>Gets the units label associated with a pivot object.</p>
 <p>May return <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if constructed without units.</p>
 <div class="refsect3">
 <a name="gwy-table-hscale-get-units.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -541,12 +647,13 @@ too if the spinbutton is passed as <em class="parameter"><code>pivot</code></em>
 </div>
 <hr>
 <div class="refsect2">
-<a name="gwy-table-hscale-get-middle-widget"></a><h3>gwy_table_hscale_get_middle_widget()</h3>
-<pre class="programlisting">#define             gwy_table_hscale_get_middle_widget(pivot)</pre>
+<a name="gwy-table-hscale-get-middle-widget"></a><h3>gwy_table_hscale_get_middle_widget ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/gtk3GtkWidget.html#GtkWidget-struct"><span class="returnvalue">GtkWidget</span></a> *
+gwy_table_hscale_get_middle_widget (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/gtk2GtkObject.html#GtkObject-struct"><span class="type">GtkObject</span></a> *pivot</code></em>);</pre>
 <p>Gets the middle widget associated with a pivot object.</p>
 <div class="refsect3">
 <a name="gwy-table-hscale-get-middle-widget.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -578,7 +685,7 @@ this point.</p>
 match is returned.</p>
 <div class="refsect3">
 <a name="gwy-table-get-child-widget.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -624,7 +731,7 @@ gwy_color_selector_for_mask (<em class="parameter"><code>const <a href="/usr/sha
 <p>See <a class="link" href="libgwydgets-gwydgetutils.html#gwy-mask-color-selector-run" title="gwy_mask_color_selector_run ()"><code class="function">gwy_mask_color_selector_run()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-color-selector-for-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -670,7 +777,7 @@ gwy_mask_color_selector_run (<em class="parameter"><code>const <a href="/usr/sha
 dialog modally and returns when it is finished.</p>
 <div class="refsect3">
 <a name="gwy-mask-color-selector-run.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -733,7 +840,7 @@ automatically.</p>
 .</p>
 <div class="refsect3">
 <a name="gwy-list-store-row-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -791,7 +898,7 @@ translations (and to reduce code clutter by avoiding dummy constructor and
 left-aligning automatically).</p>
 <div class="refsect3">
 <a name="gwy-label-new-header.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -820,7 +927,7 @@ gwy_stock_like_button_new (<em class="parameter"><code>const <a href="/usr/share
 label text.</p>
 <div class="refsect3">
 <a name="gwy-stock-like-button-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -855,7 +962,7 @@ gwy_tool_like_button_new (<em class="parameter"><code>const <a href="/usr/share/
 label text.</p>
 <div class="refsect3">
 <a name="gwy-tool-like-button-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -888,7 +995,7 @@ gwy_widget_get_activate_on_unfocus (<em class="parameter"><code><a href="/usr/sh
 <p>Obtains the activate-on-unfocus state of a widget.</p>
 <div class="refsect3">
 <a name="gwy-widget-get-activate-on-unfocus.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -919,7 +1026,7 @@ gwy_widget_set_activate_on_unfocus (<em class="parameter"><code><a href="/usr/sh
 leaves the widget.</p>
 <div class="refsect3">
 <a name="gwy-widget-set-activate-on-unfocus.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -955,7 +1062,7 @@ sensitivity (as returned by <a href="/usr/share/gtk-doc/html/gtk2GtkWidget.html#
 just synchronize GtkWidget:sensitive property.</p>
 <div class="refsect3">
 <a name="gwy-widget-sync-sensitivity.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -987,7 +1094,7 @@ gwy_get_pango_ft2_font_map (<em class="parameter"><code><a href="/usr/share/gtk-
 <p>FT2 portability to Win32 is questionable, use PangoCairo instead.</p>
 <div class="refsect3">
 <a name="gwy-get-pango-ft2-font-map.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/libgwydgets-gwygrainvaluemenu.html b/devel-docs/libgwydgets/html/libgwydgets-gwygrainvaluemenu.html
index a5f7126..45be6f0 100644
--- a/devel-docs/libgwydgets/html/libgwydgets-gwygrainvaluemenu.html
+++ b/devel-docs/libgwydgets/html/libgwydgets-gwygrainvaluemenu.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwygrainvaluemenu: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="WidgetUtilities.html" title="Widget Utilities">
 <link rel="prev" href="libgwydgets-gwyoptionmenus.html" title="gwyoptionmenus">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwydgets-gwygrainvaluemenu.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -107,7 +107,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwydgets-gwygrainvaluemenu.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -143,7 +143,7 @@ name, <code class="literal">"symbol_markup"</code> for the rich text symbol,
 allowed only on leaves.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-tree-view-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -185,7 +185,7 @@ gwy_grain_value_tree_view_set_expanded_groups
 <p>Restores a grain value tree view group expansion state.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-tree-view-set-expanded-groups.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -219,7 +219,7 @@ gwy_grain_value_tree_view_get_expanded_groups
 <p>Obtains the group expansion state of a grain value tree view.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-tree-view-get-expanded-groups.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -249,7 +249,7 @@ gwy_grain_value_tree_view_n_enabled (<em class="parameter"><code><a href="/usr/s
 set to <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> in the model.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-tree-view-n-enabled.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -276,7 +276,7 @@ gwy_grain_value_tree_view_get_enabled (<em class="parameter"><code><a href="/usr
 <p>Obtains the list of enabled values in a grain value tree view.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-tree-view-get-enabled.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -307,7 +307,7 @@ gwy_grain_value_tree_view_set_enabled (<em class="parameter"><code><a href="/usr
 <p>The tree is possibly expanded so that all enabled values are visible.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-tree-view-set-enabled.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -342,7 +342,7 @@ gwy_grain_value_tree_view_select (<em class="parameter"><code><a href="/usr/shar
 show it, and the tree view may scroll to make it visible.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-tree-view-select.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -383,7 +383,7 @@ as inconsistent).</p>
  is <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-tree-view-set-same-units.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -416,7 +416,7 @@ values that require same units are disabled.</p></td>
 <p>It must not be assumed these are the only columns in the tree store.</p>
 <div class="refsect3">
 <a name="GwyGrainValueStoreColumn.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwydgets/html/libgwydgets-gwyoptionmenus.html b/devel-docs/libgwydgets/html/libgwydgets-gwyoptionmenus.html
index c036d61..832adff 100644
--- a/devel-docs/libgwydgets/html/libgwydgets-gwyoptionmenus.html
+++ b/devel-docs/libgwydgets/html/libgwydgets-gwyoptionmenus.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwyoptionmenus: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="WidgetUtilities.html" title="Widget Utilities">
 <link rel="prev" href="libgwydgets-gwystock.html" title="gwystock">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwydgets-gwyoptionmenus.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -164,7 +164,7 @@ gwy_menu_gradient (<em class="parameter"><code><a href="http://developer.gnome.o
 each menu item.</p>
 <div class="refsect3">
 <a name="gwy-menu-gradient.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -200,7 +200,7 @@ gwy_gradient_selection_new (<em class="parameter"><code><a href="/usr/share/gtk-
 <p>Creates a gradient selection button.</p>
 <div class="refsect3">
 <a name="gwy-gradient-selection-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -243,7 +243,7 @@ gwy_gradient_tree_view_new (<em class="parameter"><code><a href="/usr/share/gtk-
 <p>Creates a tree view with gradient list.</p>
 <div class="refsect3">
 <a name="gwy-gradient-tree-view-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -285,7 +285,7 @@ gwy_gradient_tree_view_set_active (<em class="parameter"><code><a href="/usr/sha
 <p>Selects a gradient in a gradient list and scrolls to make it visible.</p>
 <div class="refsect3">
 <a name="gwy-gradient-tree-view-set-active.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -320,7 +320,7 @@ gwy_gradient_selection_get_active (<em class="parameter"><code><a href="/usr/sha
 <p>Gets the name of currently selected gradient of a selection button.</p>
 <div class="refsect3">
 <a name="gwy-gradient-selection-get-active.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -347,7 +347,7 @@ gwy_gradient_selection_set_active (<em class="parameter"><code><a href="/usr/sha
 <p>Sets the currently selected gradient of a selection button.</p>
 <div class="refsect3">
 <a name="gwy-gradient-selection-set-active.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -379,7 +379,7 @@ gwy_menu_gl_material (<em class="parameter"><code><a href="/usr/share/gtk-doc/ht
 name for each menu item.</p>
 <div class="refsect3">
 <a name="gwy-menu-gl-material.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -415,7 +415,7 @@ gwy_gl_material_selection_new (<em class="parameter"><code><a href="/usr/share/g
 <p>Creates a GL material selection button.</p>
 <div class="refsect3">
 <a name="gwy-gl-material-selection-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -458,7 +458,7 @@ gwy_gl_material_tree_view_new (<em class="parameter"><code><a href="/usr/share/g
 <p>Creates a tree view with GL material list.</p>
 <div class="refsect3">
 <a name="gwy-gl-material-tree-view-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -500,7 +500,7 @@ gwy_gl_material_tree_view_set_active (<em class="parameter"><code><a href="/usr/
 <p>Selects a GL material in a GL material list and scrolls to make it visible.</p>
 <div class="refsect3">
 <a name="gwy-gl-material-tree-view-set-active.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -535,7 +535,7 @@ gwy_gl_material_selection_get_active (<em class="parameter"><code><a href="/usr/
 <p>Gets the name of currently selected GL material of a selection button.</p>
 <div class="refsect3">
 <a name="gwy-gl-material-selection-get-active.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -562,7 +562,7 @@ gwy_gl_material_selection_set_active (<em class="parameter"><code><a href="/usr/
 <p>Sets the currently selected GL material of a selection button.</p>
 <div class="refsect3">
 <a name="gwy-gl-material-selection-set-active.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -592,7 +592,7 @@ gwy_resource_tree_view_set_active (<em class="parameter"><code><a href="/usr/sha
 <p>Selects a resource in a list and scrolls to make it visible.</p>
 <div class="refsect3">
 <a name="gwy-resource-tree-view-set-active.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/libgwydgets-gwyradiobuttons.html b/devel-docs/libgwydgets/html/libgwydgets-gwyradiobuttons.html
index 4797e21..0cd3747 100644
--- a/devel-docs/libgwydgets/html/libgwydgets-gwyradiobuttons.html
+++ b/devel-docs/libgwydgets/html/libgwydgets-gwyradiobuttons.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwyradiobuttons: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="WidgetUtilities.html" title="Widget Utilities">
 <link rel="prev" href="libgwydgets-gwycombobox.html" title="gwycombobox">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwydgets-gwyradiobuttons.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -130,7 +130,7 @@ gwy_radio_buttons_create (<em class="parameter"><code>const <span class="type">G
 <p>Try to avoid -1 as an enum value.</p>
 <div class="refsect3">
 <a name="gwy-radio-buttons-create.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -189,7 +189,7 @@ gwy_radio_buttons_createl (<em class="parameter"><code><a href="/usr/share/gtk-d
 <p>Creates a radio button group from a list of label/value pairs.</p>
 <div class="refsect3">
 <a name="gwy-radio-buttons-createl.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -243,7 +243,7 @@ gwy_radio_buttons_attach_to_table (<em class="parameter"><code><a href="/usr/sha
 <p>Attaches a group of radio buttons to table rows.</p>
 <div class="refsect3">
 <a name="gwy-radio-buttons-attach-to-table.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -291,7 +291,7 @@ gwy_radio_buttons_set_current (<em class="parameter"><code><a href="/usr/share/g
 data (as set by <a class="link" href="libgwydgets-gwyradiobuttons.html#gwy-radio-buttons-create" title="gwy_radio_buttons_create ()"><code class="function">gwy_radio_buttons_create()</code></a>).</p>
 <div class="refsect3">
 <a name="gwy-radio-buttons-set-current.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -325,7 +325,7 @@ gwy_radio_buttons_get_current (<em class="parameter"><code><a href="/usr/share/g
 <p>Gets the integer enum value corresponding to currently selected item.</p>
 <div class="refsect3">
 <a name="gwy-radio-buttons-get-current.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -353,7 +353,7 @@ gwy_radio_buttons_find (<em class="parameter"><code><a href="/usr/share/gtk-doc/
 <p>Finds a radio button by its associated integer value.</p>
 <div class="refsect3">
 <a name="gwy-radio-buttons-find.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -387,7 +387,7 @@ gwy_radio_button_get_value (<em class="parameter"><code><a href="/usr/share/gtk-
 <p>Gets the integer value associated with a radio button.</p>
 <div class="refsect3">
 <a name="gwy-radio-button-get-value.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -419,7 +419,7 @@ or even construct a radio button group with associated integers without the
 help of <a class="link" href="libgwydgets-gwyradiobuttons.html#gwy-radio-buttons-create" title="gwy_radio_buttons_create ()"><code class="function">gwy_radio_buttons_create()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-radio-button-set-value.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydgets/html/libgwydgets-gwystock.html b/devel-docs/libgwydgets/html/libgwydgets-gwystock.html
index f2a6ff0..a2e52eb 100644
--- a/devel-docs/libgwydgets/html/libgwydgets-gwystock.html
+++ b/devel-docs/libgwydgets/html/libgwydgets-gwystock.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwystock: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="WidgetUtilities.html" title="Widget Utilities">
 <link rel="prev" href="libgwydgets-gwydgetutils.html" title="gwydgetutils">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwydgets-gwystock.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -50,7 +50,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwydgets-gwystock.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -102,6 +102,10 @@
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-CORRELATION-MASK:CAPS" title="GWY_STOCK_CORRELATION_MASK">GWY_STOCK_CORRELATION_MASK</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-CROP:CAPS" title="GWY_STOCK_CROP">GWY_STOCK_CROP</a></td>
 </tr>
 <tr>
@@ -114,6 +118,10 @@
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-DISCONNECTED:CAPS" title="GWY_STOCK_DISCONNECTED">GWY_STOCK_DISCONNECTED</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-DISTANCE:CAPS" title="GWY_STOCK_DISTANCE">GWY_STOCK_DISTANCE</a></td>
 </tr>
 <tr>
@@ -174,6 +182,10 @@
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-FFT-FILTER-1D:CAPS" title="GWY_STOCK_FFT_FILTER_1D">GWY_STOCK_FFT_FILTER_1D</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-FFT-FILTER-2D:CAPS" title="GWY_STOCK_FFT_FILTER_2D">GWY_STOCK_FFT_FILTER_2D</a></td>
 </tr>
 <tr>
@@ -186,6 +198,10 @@
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-FIT-SHAPE:CAPS" title="GWY_STOCK_FIT_SHAPE">GWY_STOCK_FIT_SHAPE</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-FIX-ZERO:CAPS" title="GWY_STOCK_FIX_ZERO">GWY_STOCK_FIX_ZERO</a></td>
 </tr>
 <tr>
@@ -202,6 +218,14 @@
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-FRACTAL-CORRECTION:CAPS" title="GWY_STOCK_FRACTAL_CORRECTION">GWY_STOCK_FRACTAL_CORRECTION</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-FRACTAL-MEASURE:CAPS" title="GWY_STOCK_FRACTAL_MEASURE">GWY_STOCK_FRACTAL_MEASURE</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GL-MATERIAL:CAPS" title="GWY_STOCK_GL_MATERIAL">GWY_STOCK_GL_MATERIAL</a></td>
 </tr>
 <tr>
@@ -214,43 +238,43 @@
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAINS:CAPS" title="GWY_STOCK_GRAINS">GWY_STOCK_GRAINS</a></td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAIN-CORRELATION:CAPS" title="GWY_STOCK_GRAIN_CORRELATION">GWY_STOCK_GRAIN_CORRELATION</a></td>
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAINS-EDGE:CAPS" title="GWY_STOCK_GRAINS_EDGE">GWY_STOCK_GRAINS_EDGE</a></td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAIN-EXSCRIBED-CIRCLE:CAPS" title="GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE">GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE</a></td>
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAINS-EDGE-REMOVE:CAPS" title="GWY_STOCK_GRAINS_EDGE_REMOVE">GWY_STOCK_GRAINS_EDGE_REMOVE</a></td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAIN-INSCRIBED-CIRCLE:CAPS" title="GWY_STOCK_GRAIN_INSCRIBED_CIRCLE">GWY_STOCK_GRAIN_INSCRIBED_CIRCLE</a></td>
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAINS-GRAPH:CAPS" title="GWY_STOCK_GRAINS_GRAPH">GWY_STOCK_GRAINS_GRAPH</a></td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAINS:CAPS" title="GWY_STOCK_GRAINS">GWY_STOCK_GRAINS</a></td>
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAINS-MEASURE:CAPS" title="GWY_STOCK_GRAINS_MEASURE">GWY_STOCK_GRAINS_MEASURE</a></td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAINS-EDGE:CAPS" title="GWY_STOCK_GRAINS_EDGE">GWY_STOCK_GRAINS_EDGE</a></td>
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAINS-REMOVE:CAPS" title="GWY_STOCK_GRAINS_REMOVE">GWY_STOCK_GRAINS_REMOVE</a></td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAINS-EDGE-REMOVE:CAPS" title="GWY_STOCK_GRAINS_EDGE_REMOVE">GWY_STOCK_GRAINS_EDGE_REMOVE</a></td>
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAINS-WATER:CAPS" title="GWY_STOCK_GRAINS_WATER">GWY_STOCK_GRAINS_WATER</a></td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAINS-GRAPH:CAPS" title="GWY_STOCK_GRAINS_GRAPH">GWY_STOCK_GRAINS_GRAPH</a></td>
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAIN-CORRELATION:CAPS" title="GWY_STOCK_GRAIN_CORRELATION">GWY_STOCK_GRAIN_CORRELATION</a></td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAINS-MEASURE:CAPS" title="GWY_STOCK_GRAINS_MEASURE">GWY_STOCK_GRAINS_MEASURE</a></td>
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAIN-EXSCRIBED-CIRCLE:CAPS" title="GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE">GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE</a></td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAINS-REMOVE:CAPS" title="GWY_STOCK_GRAINS_REMOVE">GWY_STOCK_GRAINS_REMOVE</a></td>
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAIN-INSCRIBED-CIRCLE:CAPS" title="GWY_STOCK_GRAIN_INSCRIBED_CIRCLE">GWY_STOCK_GRAIN_INSCRIBED_CIRCLE</a></td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-GRAINS-WATER:CAPS" title="GWY_STOCK_GRAINS_WATER">GWY_STOCK_GRAINS_WATER</a></td>
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
@@ -406,6 +430,14 @@
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-MARK-OUTLIERS:CAPS" title="GWY_STOCK_MARK_OUTLIERS">GWY_STOCK_MARK_OUTLIERS</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-MARK-SCARS:CAPS" title="GWY_STOCK_MARK_SCARS">GWY_STOCK_MARK_SCARS</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-MARK-WITH:CAPS" title="GWY_STOCK_MARK_WITH">GWY_STOCK_MARK_WITH</a></td>
 </tr>
 <tr>
@@ -498,6 +530,10 @@
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-MASK-SET:CAPS" title="GWY_STOCK_MASK_SET">GWY_STOCK_MASK_SET</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-MASK-SHRINK:CAPS" title="GWY_STOCK_MASK_SHRINK">GWY_STOCK_MASK_SHRINK</a></td>
 </tr>
 <tr>
@@ -534,6 +570,14 @@
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-NEXT:CAPS" title="GWY_STOCK_NEXT">GWY_STOCK_NEXT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-NULL-OFFSETS:CAPS" title="GWY_STOCK_NULL_OFFSETS">GWY_STOCK_NULL_OFFSETS</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-PALETTES:CAPS" title="GWY_STOCK_PALETTES">GWY_STOCK_PALETTES</a></td>
 </tr>
 <tr>
@@ -546,6 +590,10 @@
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-POLY-DISTORT:CAPS" title="GWY_STOCK_POLY_DISTORT">GWY_STOCK_POLY_DISTORT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-POLYNOM:CAPS" title="GWY_STOCK_POLYNOM">GWY_STOCK_POLYNOM</a></td>
 </tr>
 <tr>
@@ -554,7 +602,7 @@
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-POLY-DISTORT:CAPS" title="GWY_STOCK_POLY_DISTORT">GWY_STOCK_POLY_DISTORT</a></td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-PREVIOUS:CAPS" title="GWY_STOCK_PREVIOUS">GWY_STOCK_PREVIOUS</a></td>
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
@@ -586,6 +634,10 @@
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-ROTATE-3D:CAPS" title="GWY_STOCK_ROTATE_3D">GWY_STOCK_ROTATE_3D</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-ROTATE-90-CCW:CAPS" title="GWY_STOCK_ROTATE_90_CCW">GWY_STOCK_ROTATE_90_CCW</a></td>
 </tr>
 <tr>
@@ -662,6 +714,10 @@
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-FIBRES:CAPS" title="GWY_STOCK_SYNTHETIC_FIBRES">GWY_STOCK_SYNTHETIC_FIBRES</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-LATTICE:CAPS" title="GWY_STOCK_SYNTHETIC_LATTICE">GWY_STOCK_SYNTHETIC_LATTICE</a></td>
 </tr>
 <tr>
@@ -686,6 +742,10 @@
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-PHASES:CAPS" title="GWY_STOCK_SYNTHETIC_PHASES">GWY_STOCK_SYNTHETIC_PHASES</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-SPECTRAL:CAPS" title="GWY_STOCK_SYNTHETIC_SPECTRAL">GWY_STOCK_SYNTHETIC_SPECTRAL</a></td>
 </tr>
 <tr>
@@ -778,6 +838,10 @@
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-XY-DENOISE:CAPS" title="GWY_STOCK_XY_DENOISE">GWY_STOCK_XY_DENOISE</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="libgwydgets-gwystock.html#GWY-STOCK-ZERO-MEAN:CAPS" title="GWY_STOCK_ZERO_MEAN">GWY_STOCK_ZERO_MEAN</a></td>
 </tr>
 <tr>
@@ -913,6 +977,14 @@ gwy_stock_register_stock_items (<em class="parameter"><code><span class="type">v
 </div>
 <hr>
 <div class="refsect2">
+<a name="GWY-STOCK-CORRELATION-MASK:CAPS"></a><h3>GWY_STOCK_CORRELATION_MASK</h3>
+<pre class="programlisting">#define GWY_STOCK_CORRELATION_MASK               "gwy_correlation_mask"
+</pre>
+<p>The "Correlation-Mask" stock icon.</p>
+<img src="gwy_correlation_mask-24.png"><p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GWY-STOCK-CROP:CAPS"></a><h3>GWY_STOCK_CROP</h3>
 <pre class="programlisting">#define GWY_STOCK_CROP                           "gwy_crop"
 </pre>
@@ -937,6 +1009,14 @@ gwy_stock_register_stock_items (<em class="parameter"><code><span class="type">v
 </div>
 <hr>
 <div class="refsect2">
+<a name="GWY-STOCK-DISCONNECTED:CAPS"></a><h3>GWY_STOCK_DISCONNECTED</h3>
+<pre class="programlisting">#define GWY_STOCK_DISCONNECTED                   "gwy_disconnected"
+</pre>
+<p>The "Disconnected" stock icon.</p>
+<img src="gwy_disconnected-24.png"><p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GWY-STOCK-DISTANCE:CAPS"></a><h3>GWY_STOCK_DISTANCE</h3>
 <pre class="programlisting">#define GWY_STOCK_DISTANCE                       "gwy_distance"
 </pre>
@@ -1057,6 +1137,14 @@ gwy_stock_register_stock_items (<em class="parameter"><code><span class="type">v
 </div>
 <hr>
 <div class="refsect2">
+<a name="GWY-STOCK-FFT-FILTER-1D:CAPS"></a><h3>GWY_STOCK_FFT_FILTER_1D</h3>
+<pre class="programlisting">#define GWY_STOCK_FFT_FILTER_1D                  "gwy_fft_filter_1d"
+</pre>
+<p>The "FFT-Filter-1D" stock icon.</p>
+<img src="gwy_fft_filter_1d-24.png"><p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GWY-STOCK-FFT-FILTER-2D:CAPS"></a><h3>GWY_STOCK_FFT_FILTER_2D</h3>
 <pre class="programlisting">#define GWY_STOCK_FFT_FILTER_2D                  "gwy_fft_filter_2d"
 </pre>
@@ -1081,6 +1169,14 @@ gwy_stock_register_stock_items (<em class="parameter"><code><span class="type">v
 </div>
 <hr>
 <div class="refsect2">
+<a name="GWY-STOCK-FIT-SHAPE:CAPS"></a><h3>GWY_STOCK_FIT_SHAPE</h3>
+<pre class="programlisting">#define GWY_STOCK_FIT_SHAPE                      "gwy_fit_shape"
+</pre>
+<p>The "Fit-Shape" stock icon.</p>
+<img src="gwy_fit_shape-24.png"><p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GWY-STOCK-FIX-ZERO:CAPS"></a><h3>GWY_STOCK_FIX_ZERO</h3>
 <pre class="programlisting">#define GWY_STOCK_FIX_ZERO                       "gwy_fix_zero"
 </pre>
@@ -1113,6 +1209,22 @@ gwy_stock_register_stock_items (<em class="parameter"><code><span class="type">v
 </div>
 <hr>
 <div class="refsect2">
+<a name="GWY-STOCK-FRACTAL-CORRECTION:CAPS"></a><h3>GWY_STOCK_FRACTAL_CORRECTION</h3>
+<pre class="programlisting">#define GWY_STOCK_FRACTAL_CORRECTION             "gwy_fractal_correction"
+</pre>
+<p>The "Fractal-Correction" stock icon.</p>
+<img src="gwy_fractal_correction-24.png"><p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GWY-STOCK-FRACTAL-MEASURE:CAPS"></a><h3>GWY_STOCK_FRACTAL_MEASURE</h3>
+<pre class="programlisting">#define GWY_STOCK_FRACTAL_MEASURE                "gwy_fractal_measure"
+</pre>
+<p>The "Fractal-Measure" stock icon.</p>
+<img src="gwy_fractal_measure-24.png"><p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GWY-STOCK-GL-MATERIAL:CAPS"></a><h3>GWY_STOCK_GL_MATERIAL</h3>
 <pre class="programlisting">#define GWY_STOCK_GL_MATERIAL                    "gwy_gl_material"
 </pre>
@@ -1137,6 +1249,30 @@ gwy_stock_register_stock_items (<em class="parameter"><code><span class="type">v
 </div>
 <hr>
 <div class="refsect2">
+<a name="GWY-STOCK-GRAIN-CORRELATION:CAPS"></a><h3>GWY_STOCK_GRAIN_CORRELATION</h3>
+<pre class="programlisting">#define GWY_STOCK_GRAIN_CORRELATION              "gwy_grain_correlation"
+</pre>
+<p>The "Grain-Correlation" stock icon.</p>
+<img src="gwy_grain_correlation-24.png"><p class="since">Since: <a class="link" href="api-index-2-45.html#api-index-2.45">2.45</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GWY-STOCK-GRAIN-EXSCRIBED-CIRCLE:CAPS"></a><h3>GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE</h3>
+<pre class="programlisting">#define GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE         "gwy_grain_exscribed_circle"
+</pre>
+<p>The "Grain-Exscribed-Circle" stock icon.</p>
+<img src="gwy_grain_exscribed_circle-24.png"><p class="since">Since: <a class="link" href="api-index-2-45.html#api-index-2.45">2.45</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GWY-STOCK-GRAIN-INSCRIBED-CIRCLE:CAPS"></a><h3>GWY_STOCK_GRAIN_INSCRIBED_CIRCLE</h3>
+<pre class="programlisting">#define GWY_STOCK_GRAIN_INSCRIBED_CIRCLE         "gwy_grain_inscribed_circle"
+</pre>
+<p>The "Grain-Inscribed-Circle" stock icon.</p>
+<img src="gwy_grain_inscribed_circle-24.png"><p class="since">Since: <a class="link" href="api-index-2-45.html#api-index-2.45">2.45</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GWY-STOCK-GRAINS:CAPS"></a><h3>GWY_STOCK_GRAINS</h3>
 <pre class="programlisting">#define GWY_STOCK_GRAINS                         "gwy_grains"
 </pre>
@@ -1193,30 +1329,6 @@ gwy_stock_register_stock_items (<em class="parameter"><code><span class="type">v
 </div>
 <hr>
 <div class="refsect2">
-<a name="GWY-STOCK-GRAIN-CORRELATION:CAPS"></a><h3>GWY_STOCK_GRAIN_CORRELATION</h3>
-<pre class="programlisting">#define GWY_STOCK_GRAIN_CORRELATION              "gwy_grain_correlation"
-</pre>
-<p>The "Grain-Correlation" stock icon.</p>
-<img src="gwy_grain_correlation-24.png"><p class="since">Since: <a class="link" href="api-index-2-45.html#api-index-2.45">2.45</a></p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GWY-STOCK-GRAIN-EXSCRIBED-CIRCLE:CAPS"></a><h3>GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE</h3>
-<pre class="programlisting">#define GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE         "gwy_grain_exscribed_circle"
-</pre>
-<p>The "Grain-Exscribed-Circle" stock icon.</p>
-<img src="gwy_grain_exscribed_circle-24.png"><p class="since">Since: <a class="link" href="api-index-2-45.html#api-index-2.45">2.45</a></p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GWY-STOCK-GRAIN-INSCRIBED-CIRCLE:CAPS"></a><h3>GWY_STOCK_GRAIN_INSCRIBED_CIRCLE</h3>
-<pre class="programlisting">#define GWY_STOCK_GRAIN_INSCRIBED_CIRCLE         "gwy_grain_inscribed_circle"
-</pre>
-<p>The "Grain-Inscribed-Circle" stock icon.</p>
-<img src="gwy_grain_inscribed_circle-24.png"><p class="since">Since: <a class="link" href="api-index-2-45.html#api-index-2.45">2.45</a></p>
-</div>
-<hr>
-<div class="refsect2">
 <a name="GWY-STOCK-GRAPH:CAPS"></a><h3>GWY_STOCK_GRAPH</h3>
 <pre class="programlisting">#define GWY_STOCK_GRAPH                          "gwy_graph"
 </pre>
@@ -1521,6 +1633,22 @@ gwy_stock_register_stock_items (<em class="parameter"><code><span class="type">v
 </div>
 <hr>
 <div class="refsect2">
+<a name="GWY-STOCK-MARK-OUTLIERS:CAPS"></a><h3>GWY_STOCK_MARK_OUTLIERS</h3>
+<pre class="programlisting">#define GWY_STOCK_MARK_OUTLIERS                  "gwy_mark_outliers"
+</pre>
+<p>The "Mark-Outliers" stock icon.</p>
+<img src="gwy_mark_outliers-24.png"><p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GWY-STOCK-MARK-SCARS:CAPS"></a><h3>GWY_STOCK_MARK_SCARS</h3>
+<pre class="programlisting">#define GWY_STOCK_MARK_SCARS                     "gwy_mark_scars"
+</pre>
+<p>The "Mark-Scars" stock icon.</p>
+<img src="gwy_mark_scars-24.png"><p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GWY-STOCK-MARK-WITH:CAPS"></a><h3>GWY_STOCK_MARK_WITH</h3>
 <pre class="programlisting">#define GWY_STOCK_MARK_WITH                      "gwy_mark_with"
 </pre>
@@ -1705,6 +1833,14 @@ gwy_stock_register_stock_items (<em class="parameter"><code><span class="type">v
 </div>
 <hr>
 <div class="refsect2">
+<a name="GWY-STOCK-MASK-SET:CAPS"></a><h3>GWY_STOCK_MASK_SET</h3>
+<pre class="programlisting">#define GWY_STOCK_MASK_SET                       "gwy_mask_set"
+</pre>
+<p>The "Mask-Set" stock icon.</p>
+<img src="gwy_mask_set-24.png"><p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GWY-STOCK-MASK-SHRINK:CAPS"></a><h3>GWY_STOCK_MASK_SHRINK</h3>
 <pre class="programlisting">#define GWY_STOCK_MASK_SHRINK                    "gwy_mask_shrink"
 </pre>
@@ -1777,6 +1913,22 @@ gwy_stock_register_stock_items (<em class="parameter"><code><span class="type">v
 </div>
 <hr>
 <div class="refsect2">
+<a name="GWY-STOCK-NEXT:CAPS"></a><h3>GWY_STOCK_NEXT</h3>
+<pre class="programlisting">#define GWY_STOCK_NEXT                           "gwy_next"
+</pre>
+<p>The "Next" stock icon.</p>
+<img src="gwy_next-24.png"><p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GWY-STOCK-NULL-OFFSETS:CAPS"></a><h3>GWY_STOCK_NULL_OFFSETS</h3>
+<pre class="programlisting">#define GWY_STOCK_NULL_OFFSETS                   "gwy_null_offsets"
+</pre>
+<p>The "Null-Offsets" stock icon.</p>
+<img src="gwy_null_offsets-24.png"><p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GWY-STOCK-PALETTES:CAPS"></a><h3>GWY_STOCK_PALETTES</h3>
 <pre class="programlisting">#define GWY_STOCK_PALETTES                       "gwy_palettes"
 </pre>
@@ -1801,6 +1953,14 @@ gwy_stock_register_stock_items (<em class="parameter"><code><span class="type">v
 </div>
 <hr>
 <div class="refsect2">
+<a name="GWY-STOCK-POLY-DISTORT:CAPS"></a><h3>GWY_STOCK_POLY_DISTORT</h3>
+<pre class="programlisting">#define GWY_STOCK_POLY_DISTORT                   "gwy_poly_distort"
+</pre>
+<p>The "Poly-Distort" stock icon.</p>
+<img src="gwy_poly_distort-24.png"><p class="since">Since: <a class="link" href="api-index-2-46.html#api-index-2.46">2.46</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GWY-STOCK-POLYNOM:CAPS"></a><h3>GWY_STOCK_POLYNOM</h3>
 <pre class="programlisting">#define GWY_STOCK_POLYNOM                        "gwy_polynom"
 </pre>
@@ -1817,11 +1977,11 @@ gwy_stock_register_stock_items (<em class="parameter"><code><span class="type">v
 </div>
 <hr>
 <div class="refsect2">
-<a name="GWY-STOCK-POLY-DISTORT:CAPS"></a><h3>GWY_STOCK_POLY_DISTORT</h3>
-<pre class="programlisting">#define GWY_STOCK_POLY_DISTORT                   "gwy_poly_distort"
+<a name="GWY-STOCK-PREVIOUS:CAPS"></a><h3>GWY_STOCK_PREVIOUS</h3>
+<pre class="programlisting">#define GWY_STOCK_PREVIOUS                       "gwy_previous"
 </pre>
-<p>The "Poly-Distort" stock icon.</p>
-<img src="gwy_poly_distort-24.png"><p class="since">Since: <a class="link" href="api-index-2-46.html#api-index-2.46">2.46</a></p>
+<p>The "Previous" stock icon.</p>
+<img src="gwy_previous-24.png"><p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
 </div>
 <hr>
 <div class="refsect2">
@@ -1881,6 +2041,14 @@ gwy_stock_register_stock_items (<em class="parameter"><code><span class="type">v
 </div>
 <hr>
 <div class="refsect2">
+<a name="GWY-STOCK-ROTATE-3D:CAPS"></a><h3>GWY_STOCK_ROTATE_3D</h3>
+<pre class="programlisting">#define GWY_STOCK_ROTATE_3D                      "gwy_rotate_3d"
+</pre>
+<p>The "Rotate-3D" stock icon.</p>
+<img src="gwy_rotate_3d-24.png"><p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GWY-STOCK-ROTATE-90-CCW:CAPS"></a><h3>GWY_STOCK_ROTATE_90_CCW</h3>
 <pre class="programlisting">#define GWY_STOCK_ROTATE_90_CCW                  "gwy_rotate_90_ccw"
 </pre>
@@ -2033,6 +2201,14 @@ gwy_stock_register_stock_items (<em class="parameter"><code><span class="type">v
 </div>
 <hr>
 <div class="refsect2">
+<a name="GWY-STOCK-SYNTHETIC-FIBRES:CAPS"></a><h3>GWY_STOCK_SYNTHETIC_FIBRES</h3>
+<pre class="programlisting">#define GWY_STOCK_SYNTHETIC_FIBRES               "gwy_synthetic_fibres"
+</pre>
+<p>The "Synthetic-Fibres" stock icon.</p>
+<img src="gwy_synthetic_fibres-24.png"><p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GWY-STOCK-SYNTHETIC-LATTICE:CAPS"></a><h3>GWY_STOCK_SYNTHETIC_LATTICE</h3>
 <pre class="programlisting">#define GWY_STOCK_SYNTHETIC_LATTICE              "gwy_synthetic_lattice"
 </pre>
@@ -2081,6 +2257,14 @@ gwy_stock_register_stock_items (<em class="parameter"><code><span class="type">v
 </div>
 <hr>
 <div class="refsect2">
+<a name="GWY-STOCK-SYNTHETIC-PHASES:CAPS"></a><h3>GWY_STOCK_SYNTHETIC_PHASES</h3>
+<pre class="programlisting">#define GWY_STOCK_SYNTHETIC_PHASES               "gwy_synthetic_phases"
+</pre>
+<p>The "Synthetic-Phases" stock icon.</p>
+<img src="gwy_synthetic_phases-24.png"><p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GWY-STOCK-SYNTHETIC-SPECTRAL:CAPS"></a><h3>GWY_STOCK_SYNTHETIC_SPECTRAL</h3>
 <pre class="programlisting">#define GWY_STOCK_SYNTHETIC_SPECTRAL             "gwy_synthetic_spectral"
 </pre>
@@ -2265,6 +2449,14 @@ gwy_stock_register_stock_items (<em class="parameter"><code><span class="type">v
 </div>
 <hr>
 <div class="refsect2">
+<a name="GWY-STOCK-XY-DENOISE:CAPS"></a><h3>GWY_STOCK_XY_DENOISE</h3>
+<pre class="programlisting">#define GWY_STOCK_XY_DENOISE                     "gwy_xy_denoise"
+</pre>
+<p>The "Xy-Denoise" stock icon.</p>
+<img src="gwy_xy_denoise-24.png"><p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GWY-STOCK-ZERO-MEAN:CAPS"></a><h3>GWY_STOCK_ZERO_MEAN</h3>
 <pre class="programlisting">#define GWY_STOCK_ZERO_MEAN                      "gwy_zero_mean"
 </pre>
diff --git a/devel-docs/libgwydgets/html/libgwydgets.devhelp2 b/devel-docs/libgwydgets/html/libgwydgets.devhelp2
index 34055ec..9bbf519 100644
--- a/devel-docs/libgwydgets/html/libgwydgets.devhelp2
+++ b/devel-docs/libgwydgets/html/libgwydgets.devhelp2
@@ -37,6 +37,7 @@
       <sub name="Gwy3DLabel" link="Gwy3DLabel.html"/>
     </sub>
     <sub name="General Widgets" link="GeneralWidgets.html">
+      <sub name="GwyAdjustBar" link="GwyAdjustBar.html"/>
       <sub name="GwyColorButton" link="GwyColorButton.html"/>
       <sub name="GwyCurve" link="GwyCurve.html"/>
       <sub name="GwyRuler" link="GwyRuler.html"/>
@@ -84,6 +85,8 @@
     <sub name="Index of new symbols in 2.43" link="api-index-2-43.html"/>
     <sub name="Index of new symbols in 2.45" link="api-index-2-45.html"/>
     <sub name="Index of new symbols in 2.46" link="api-index-2-46.html"/>
+    <sub name="Index of new symbols in 2.48" link="api-index-2-48.html"/>
+    <sub name="Index of new symbols in 2.49" link="api-index-2-49.html"/>
   </chapters>
   <functions>
     <keyword type="function" name="gwy_data_window_new ()" link="GwyDataWindow.html#gwy-data-window-new"/>
@@ -478,7 +481,10 @@
     <keyword type="struct" name="struct Gwy3DSetup" link="Gwy3DSetup.html#Gwy3DSetup-struct"/>
     <keyword type="struct" name="struct Gwy3DSetupClass" link="Gwy3DSetup.html#Gwy3DSetupClass"/>
     <keyword type="property" name="The “axes-visible” property" link="Gwy3DSetup.html#Gwy3DSetup--axes-visible"/>
+    <keyword type="property" name="The “fmscale-reserve-space” property" link="Gwy3DSetup.html#Gwy3DSetup--fmscale-reserve-space"/>
+    <keyword type="property" name="The “fmscale-size” property" link="Gwy3DSetup.html#Gwy3DSetup--fmscale-size"/>
     <keyword type="property" name="The “fmscale-visible” property" link="Gwy3DSetup.html#Gwy3DSetup--fmscale-visible"/>
+    <keyword type="property" name="The “fmscale-y-align” property" link="Gwy3DSetup.html#Gwy3DSetup--fmscale-y-align"/>
     <keyword type="property" name="The “hide-masked” property" link="Gwy3DSetup.html#Gwy3DSetup--hide-masked"/>
     <keyword type="property" name="The “labels-visible” property" link="Gwy3DSetup.html#Gwy3DSetup--labels-visible"/>
     <keyword type="property" name="The “light-phi” property" link="Gwy3DSetup.html#Gwy3DSetup--light-phi"/>
@@ -506,6 +512,27 @@
     <keyword type="property" name="The “rotation” property" link="Gwy3DLabel.html#Gwy3DLabel--rotation"/>
     <keyword type="property" name="The “size” property" link="Gwy3DLabel.html#Gwy3DLabel--size"/>
     <keyword type="property" name="The “text” property" link="Gwy3DLabel.html#Gwy3DLabel--text"/>
+    <keyword type="function" name="gwy_adjust_bar_new ()" link="GwyAdjustBar.html#gwy-adjust-bar-new" since="2.49"/>
+    <keyword type="function" name="gwy_adjust_bar_set_adjustment ()" link="GwyAdjustBar.html#gwy-adjust-bar-set-adjustment" since="2.49"/>
+    <keyword type="function" name="gwy_adjust_bar_get_adjustment ()" link="GwyAdjustBar.html#gwy-adjust-bar-get-adjustment" since="2.49"/>
+    <keyword type="function" name="gwy_adjust_bar_set_snap_to_ticks ()" link="GwyAdjustBar.html#gwy-adjust-bar-set-snap-to-ticks" since="2.49"/>
+    <keyword type="function" name="gwy_adjust_bar_get_snap_to_ticks ()" link="GwyAdjustBar.html#gwy-adjust-bar-get-snap-to-ticks" since="2.49"/>
+    <keyword type="function" name="gwy_adjust_bar_set_mapping ()" link="GwyAdjustBar.html#gwy-adjust-bar-set-mapping" since="2.49"/>
+    <keyword type="function" name="gwy_adjust_bar_get_mapping ()" link="GwyAdjustBar.html#gwy-adjust-bar-get-mapping" since="2.49"/>
+    <keyword type="function" name="gwy_adjust_bar_set_has_check_button ()" link="GwyAdjustBar.html#gwy-adjust-bar-set-has-check-button" since="2.49"/>
+    <keyword type="function" name="gwy_adjust_bar_get_has_check_button ()" link="GwyAdjustBar.html#gwy-adjust-bar-get-has-check-button" since="2.49"/>
+    <keyword type="function" name="gwy_adjust_bar_set_bar_sensitive ()" link="GwyAdjustBar.html#gwy-adjust-bar-set-bar-sensitive" since="2.49"/>
+    <keyword type="function" name="gwy_adjust_bar_get_bar_sensitive ()" link="GwyAdjustBar.html#gwy-adjust-bar-get-bar-sensitive" since="2.49"/>
+    <keyword type="function" name="gwy_adjust_bar_get_label ()" link="GwyAdjustBar.html#gwy-adjust-bar-get-label" since="2.49"/>
+    <keyword type="function" name="gwy_adjust_bar_get_check_button ()" link="GwyAdjustBar.html#gwy-adjust-bar-get-check-button" since="2.49"/>
+    <keyword type="struct" name="struct GwyAdjustBar" link="GwyAdjustBar.html#GwyAdjustBar-struct"/>
+    <keyword type="struct" name="struct GwyAdjustBarClass" link="GwyAdjustBar.html#GwyAdjustBarClass" since="2.49"/>
+    <keyword type="enum" name="enum GwyScaleMappingType" link="GwyAdjustBar.html#GwyScaleMappingType" since="2.49"/>
+    <keyword type="property" name="The “adjustment” property" link="GwyAdjustBar.html#GwyAdjustBar--adjustment"/>
+    <keyword type="property" name="The “has-check-button” property" link="GwyAdjustBar.html#GwyAdjustBar--has-check-button"/>
+    <keyword type="property" name="The “mapping” property" link="GwyAdjustBar.html#GwyAdjustBar--mapping"/>
+    <keyword type="property" name="The “snap-to-ticks” property" link="GwyAdjustBar.html#GwyAdjustBar--snap-to-ticks"/>
+    <keyword type="signal" name="The “change-value” signal" link="GwyAdjustBar.html#GwyAdjustBar-change-value"/>
     <keyword type="function" name="gwy_color_button_new ()" link="GwyColorButton.html#gwy-color-button-new"/>
     <keyword type="function" name="gwy_color_button_new_with_color ()" link="GwyColorButton.html#gwy-color-button-new-with-color"/>
     <keyword type="function" name="gwy_color_button_set_color ()" link="GwyColorButton.html#gwy-color-button-set-color"/>
@@ -657,12 +684,13 @@
     <keyword type="function" name="gwy_table_attach_spinbutton ()" link="libgwydgets-gwydgetutils.html#gwy-table-attach-spinbutton"/>
     <keyword type="function" name="gwy_table_attach_row ()" link="libgwydgets-gwydgetutils.html#gwy-table-attach-row"/>
     <keyword type="function" name="gwy_table_attach_hscale ()" link="libgwydgets-gwydgetutils.html#gwy-table-attach-hscale"/>
+    <keyword type="function" name="gwy_table_attach_adjbar ()" link="libgwydgets-gwydgetutils.html#gwy-table-attach-adjbar" since="2.49"/>
     <keyword type="function" name="gwy_table_hscale_set_sensitive ()" link="libgwydgets-gwydgetutils.html#gwy-table-hscale-set-sensitive"/>
-    <keyword type="macro" name="gwy_table_hscale_get_scale()" link="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-scale"/>
-    <keyword type="macro" name="gwy_table_hscale_get_check()" link="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-check"/>
-    <keyword type="macro" name="gwy_table_hscale_get_label()" link="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-label"/>
-    <keyword type="macro" name="gwy_table_hscale_get_units()" link="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-units"/>
-    <keyword type="macro" name="gwy_table_hscale_get_middle_widget()" link="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-middle-widget"/>
+    <keyword type="function" name="gwy_table_hscale_get_scale ()" link="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-scale"/>
+    <keyword type="function" name="gwy_table_hscale_get_check ()" link="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-check"/>
+    <keyword type="function" name="gwy_table_hscale_get_label ()" link="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-label"/>
+    <keyword type="function" name="gwy_table_hscale_get_units ()" link="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-units"/>
+    <keyword type="function" name="gwy_table_hscale_get_middle_widget ()" link="libgwydgets-gwydgetutils.html#gwy-table-hscale-get-middle-widget"/>
     <keyword type="function" name="gwy_table_get_child_widget ()" link="libgwydgets-gwydgetutils.html#gwy-table-get-child-widget"/>
     <keyword type="function" name="gwy_color_selector_for_mask ()" link="libgwydgets-gwydgetutils.html#gwy-color-selector-for-mask"/>
     <keyword type="function" name="gwy_mask_color_selector_run ()" link="libgwydgets-gwydgetutils.html#gwy-mask-color-selector-run" since="2.1"/>
@@ -687,9 +715,11 @@
     <keyword type="macro" name="GWY_STOCK_COLOR_RANGE_FULL" link="libgwydgets-gwystock.html#GWY-STOCK-COLOR-RANGE-FULL:CAPS" since="2.7"/>
     <keyword type="macro" name="GWY_STOCK_CONVOLUTION" link="libgwydgets-gwystock.html#GWY-STOCK-CONVOLUTION:CAPS" since="2.45"/>
     <keyword type="macro" name="GWY_STOCK_CORRECT_AFFINE" link="libgwydgets-gwystock.html#GWY-STOCK-CORRECT-AFFINE:CAPS" since="2.37"/>
+    <keyword type="macro" name="GWY_STOCK_CORRELATION_MASK" link="libgwydgets-gwystock.html#GWY-STOCK-CORRELATION-MASK:CAPS" since="2.48"/>
     <keyword type="macro" name="GWY_STOCK_CROP" link="libgwydgets-gwystock.html#GWY-STOCK-CROP:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_CWT" link="libgwydgets-gwystock.html#GWY-STOCK-CWT:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_DATA_MEASURE" link="libgwydgets-gwystock.html#GWY-STOCK-DATA-MEASURE:CAPS" since="2.3"/>
+    <keyword type="macro" name="GWY_STOCK_DISCONNECTED" link="libgwydgets-gwystock.html#GWY-STOCK-DISCONNECTED:CAPS" since="2.48"/>
     <keyword type="macro" name="GWY_STOCK_DISTANCE" link="libgwydgets-gwystock.html#GWY-STOCK-DISTANCE:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_DISTANCE_TRANSFORM" link="libgwydgets-gwystock.html#GWY-STOCK-DISTANCE-TRANSFORM:CAPS" since="2.46"/>
     <keyword type="macro" name="GWY_STOCK_DISTRIBUTION_ANGLE" link="libgwydgets-gwystock.html#GWY-STOCK-DISTRIBUTION-ANGLE:CAPS" since="2.45"/>
@@ -705,16 +735,23 @@
     <keyword type="macro" name="GWY_STOCK_FAVOURITE" link="libgwydgets-gwystock.html#GWY-STOCK-FAVOURITE:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_FFT" link="libgwydgets-gwystock.html#GWY-STOCK-FFT:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_FFT_2D" link="libgwydgets-gwystock.html#GWY-STOCK-FFT-2D:CAPS" since="2.45"/>
+    <keyword type="macro" name="GWY_STOCK_FFT_FILTER_1D" link="libgwydgets-gwystock.html#GWY-STOCK-FFT-FILTER-1D:CAPS" since="2.48"/>
     <keyword type="macro" name="GWY_STOCK_FFT_FILTER_2D" link="libgwydgets-gwystock.html#GWY-STOCK-FFT-FILTER-2D:CAPS" since="2.45"/>
     <keyword type="macro" name="GWY_STOCK_FILTER" link="libgwydgets-gwystock.html#GWY-STOCK-FILTER:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_FIND_PEAKS" link="libgwydgets-gwystock.html#GWY-STOCK-FIND-PEAKS:CAPS" since="2.45"/>
+    <keyword type="macro" name="GWY_STOCK_FIT_SHAPE" link="libgwydgets-gwystock.html#GWY-STOCK-FIT-SHAPE:CAPS" since="2.48"/>
     <keyword type="macro" name="GWY_STOCK_FIX_ZERO" link="libgwydgets-gwystock.html#GWY-STOCK-FIX-ZERO:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_FLIP_HORIZONTALLY" link="libgwydgets-gwystock.html#GWY-STOCK-FLIP-HORIZONTALLY:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_FLIP_VERTICALLY" link="libgwydgets-gwystock.html#GWY-STOCK-FLIP-VERTICALLY:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_FRACTAL" link="libgwydgets-gwystock.html#GWY-STOCK-FRACTAL:CAPS"/>
+    <keyword type="macro" name="GWY_STOCK_FRACTAL_CORRECTION" link="libgwydgets-gwystock.html#GWY-STOCK-FRACTAL-CORRECTION:CAPS" since="2.48"/>
+    <keyword type="macro" name="GWY_STOCK_FRACTAL_MEASURE" link="libgwydgets-gwystock.html#GWY-STOCK-FRACTAL-MEASURE:CAPS" since="2.49"/>
     <keyword type="macro" name="GWY_STOCK_GL_MATERIAL" link="libgwydgets-gwystock.html#GWY-STOCK-GL-MATERIAL:CAPS" since="2.7"/>
     <keyword type="macro" name="GWY_STOCK_GRADIENT_HORIZONTAL" link="libgwydgets-gwystock.html#GWY-STOCK-GRADIENT-HORIZONTAL:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_GRADIENT_VERTICAL" link="libgwydgets-gwystock.html#GWY-STOCK-GRADIENT-VERTICAL:CAPS"/>
+    <keyword type="macro" name="GWY_STOCK_GRAIN_CORRELATION" link="libgwydgets-gwystock.html#GWY-STOCK-GRAIN-CORRELATION:CAPS" since="2.45"/>
+    <keyword type="macro" name="GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE" link="libgwydgets-gwystock.html#GWY-STOCK-GRAIN-EXSCRIBED-CIRCLE:CAPS" since="2.45"/>
+    <keyword type="macro" name="GWY_STOCK_GRAIN_INSCRIBED_CIRCLE" link="libgwydgets-gwystock.html#GWY-STOCK-GRAIN-INSCRIBED-CIRCLE:CAPS" since="2.45"/>
     <keyword type="macro" name="GWY_STOCK_GRAINS" link="libgwydgets-gwystock.html#GWY-STOCK-GRAINS:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_GRAINS_EDGE" link="libgwydgets-gwystock.html#GWY-STOCK-GRAINS-EDGE:CAPS" since="2.45"/>
     <keyword type="macro" name="GWY_STOCK_GRAINS_EDGE_REMOVE" link="libgwydgets-gwystock.html#GWY-STOCK-GRAINS-EDGE-REMOVE:CAPS" since="2.46"/>
@@ -722,9 +759,6 @@
     <keyword type="macro" name="GWY_STOCK_GRAINS_MEASURE" link="libgwydgets-gwystock.html#GWY-STOCK-GRAINS-MEASURE:CAPS" since="2.7"/>
     <keyword type="macro" name="GWY_STOCK_GRAINS_REMOVE" link="libgwydgets-gwystock.html#GWY-STOCK-GRAINS-REMOVE:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_GRAINS_WATER" link="libgwydgets-gwystock.html#GWY-STOCK-GRAINS-WATER:CAPS"/>
-    <keyword type="macro" name="GWY_STOCK_GRAIN_CORRELATION" link="libgwydgets-gwystock.html#GWY-STOCK-GRAIN-CORRELATION:CAPS" since="2.45"/>
-    <keyword type="macro" name="GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE" link="libgwydgets-gwystock.html#GWY-STOCK-GRAIN-EXSCRIBED-CIRCLE:CAPS" since="2.45"/>
-    <keyword type="macro" name="GWY_STOCK_GRAIN_INSCRIBED_CIRCLE" link="libgwydgets-gwystock.html#GWY-STOCK-GRAIN-INSCRIBED-CIRCLE:CAPS" since="2.45"/>
     <keyword type="macro" name="GWY_STOCK_GRAPH" link="libgwydgets-gwystock.html#GWY-STOCK-GRAPH:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_GRAPH_ALIGN" link="libgwydgets-gwystock.html#GWY-STOCK-GRAPH-ALIGN:CAPS" since="2.45"/>
     <keyword type="macro" name="GWY_STOCK_GRAPH_CUT" link="libgwydgets-gwystock.html#GWY-STOCK-GRAPH-CUT:CAPS" since="2.45"/>
@@ -763,6 +797,8 @@
     <keyword type="macro" name="GWY_STOCK_LOCAL_SLOPE" link="libgwydgets-gwystock.html#GWY-STOCK-LOCAL-SLOPE:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_LOGSCALE_HORIZONTAL" link="libgwydgets-gwystock.html#GWY-STOCK-LOGSCALE-HORIZONTAL:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_LOGSCALE_VERTICAL" link="libgwydgets-gwystock.html#GWY-STOCK-LOGSCALE-VERTICAL:CAPS"/>
+    <keyword type="macro" name="GWY_STOCK_MARK_OUTLIERS" link="libgwydgets-gwystock.html#GWY-STOCK-MARK-OUTLIERS:CAPS" since="2.48"/>
+    <keyword type="macro" name="GWY_STOCK_MARK_SCARS" link="libgwydgets-gwystock.html#GWY-STOCK-MARK-SCARS:CAPS" since="2.48"/>
     <keyword type="macro" name="GWY_STOCK_MARK_WITH" link="libgwydgets-gwystock.html#GWY-STOCK-MARK-WITH:CAPS" since="2.37"/>
     <keyword type="macro" name="GWY_STOCK_MASK" link="libgwydgets-gwystock.html#GWY-STOCK-MASK:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_MASK_ADD" link="libgwydgets-gwystock.html#GWY-STOCK-MASK-ADD:CAPS"/>
@@ -786,6 +822,7 @@
     <keyword type="macro" name="GWY_STOCK_MASK_RECT_EXCLUSIVE" link="libgwydgets-gwystock.html#GWY-STOCK-MASK-RECT-EXCLUSIVE:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_MASK_RECT_INCLUSIVE" link="libgwydgets-gwystock.html#GWY-STOCK-MASK-RECT-INCLUSIVE:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_MASK_REMOVE" link="libgwydgets-gwystock.html#GWY-STOCK-MASK-REMOVE:CAPS"/>
+    <keyword type="macro" name="GWY_STOCK_MASK_SET" link="libgwydgets-gwystock.html#GWY-STOCK-MASK-SET:CAPS" since="2.49"/>
     <keyword type="macro" name="GWY_STOCK_MASK_SHRINK" link="libgwydgets-gwystock.html#GWY-STOCK-MASK-SHRINK:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_MASK_SUBTRACT" link="libgwydgets-gwystock.html#GWY-STOCK-MASK-SUBTRACT:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_MASK_THIN" link="libgwydgets-gwystock.html#GWY-STOCK-MASK-THIN:CAPS" since="2.45"/>
@@ -795,12 +832,15 @@
     <keyword type="macro" name="GWY_STOCK_MUTUAL_CROP" link="libgwydgets-gwystock.html#GWY-STOCK-MUTUAL-CROP:CAPS" since="2.46"/>
     <keyword type="macro" name="GWY_STOCK_NEURAL_APPLY" link="libgwydgets-gwystock.html#GWY-STOCK-NEURAL-APPLY:CAPS" since="2.45"/>
     <keyword type="macro" name="GWY_STOCK_NEURAL_TRAIN" link="libgwydgets-gwystock.html#GWY-STOCK-NEURAL-TRAIN:CAPS" since="2.45"/>
+    <keyword type="macro" name="GWY_STOCK_NEXT" link="libgwydgets-gwystock.html#GWY-STOCK-NEXT:CAPS" since="2.49"/>
+    <keyword type="macro" name="GWY_STOCK_NULL_OFFSETS" link="libgwydgets-gwystock.html#GWY-STOCK-NULL-OFFSETS:CAPS" since="2.48"/>
     <keyword type="macro" name="GWY_STOCK_PALETTES" link="libgwydgets-gwystock.html#GWY-STOCK-PALETTES:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_PATH_LEVEL" link="libgwydgets-gwystock.html#GWY-STOCK-PATH-LEVEL:CAPS" since="2.7"/>
     <keyword type="macro" name="GWY_STOCK_POINTER_MEASURE" link="libgwydgets-gwystock.html#GWY-STOCK-POINTER-MEASURE:CAPS"/>
+    <keyword type="macro" name="GWY_STOCK_POLY_DISTORT" link="libgwydgets-gwystock.html#GWY-STOCK-POLY-DISTORT:CAPS" since="2.46"/>
     <keyword type="macro" name="GWY_STOCK_POLYNOM" link="libgwydgets-gwystock.html#GWY-STOCK-POLYNOM:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_POLYNOM_LEVEL" link="libgwydgets-gwystock.html#GWY-STOCK-POLYNOM-LEVEL:CAPS" since="2.29"/>
-    <keyword type="macro" name="GWY_STOCK_POLY_DISTORT" link="libgwydgets-gwystock.html#GWY-STOCK-POLY-DISTORT:CAPS" since="2.46"/>
+    <keyword type="macro" name="GWY_STOCK_PREVIOUS" link="libgwydgets-gwystock.html#GWY-STOCK-PREVIOUS:CAPS" since="2.49"/>
     <keyword type="macro" name="GWY_STOCK_PROFILE" link="libgwydgets-gwystock.html#GWY-STOCK-PROFILE:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_PSDF_LOG_PHI" link="libgwydgets-gwystock.html#GWY-STOCK-PSDF-LOG-PHI:CAPS" since="2.45"/>
     <keyword type="macro" name="GWY_STOCK_PSDF_SECTION" link="libgwydgets-gwystock.html#GWY-STOCK-PSDF-SECTION:CAPS" since="2.45"/>
@@ -808,6 +848,7 @@
     <keyword type="macro" name="GWY_STOCK_REMOVE_UNDER_MASK" link="libgwydgets-gwystock.html#GWY-STOCK-REMOVE-UNDER-MASK:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_ROTATE" link="libgwydgets-gwystock.html#GWY-STOCK-ROTATE:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_ROTATE_180" link="libgwydgets-gwystock.html#GWY-STOCK-ROTATE-180:CAPS"/>
+    <keyword type="macro" name="GWY_STOCK_ROTATE_3D" link="libgwydgets-gwystock.html#GWY-STOCK-ROTATE-3D:CAPS" since="2.49"/>
     <keyword type="macro" name="GWY_STOCK_ROTATE_90_CCW" link="libgwydgets-gwystock.html#GWY-STOCK-ROTATE-90-CCW:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_ROTATE_90_CW" link="libgwydgets-gwystock.html#GWY-STOCK-ROTATE-90-CW:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_SCALE" link="libgwydgets-gwystock.html#GWY-STOCK-SCALE:CAPS"/>
@@ -827,12 +868,14 @@
     <keyword type="macro" name="GWY_STOCK_SYNTHETIC_COLUMNAR" link="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-COLUMNAR:CAPS" since="2.37"/>
     <keyword type="macro" name="GWY_STOCK_SYNTHETIC_DIFFUSION" link="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-DIFFUSION:CAPS" since="2.38"/>
     <keyword type="macro" name="GWY_STOCK_SYNTHETIC_DOMAINS" link="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-DOMAINS:CAPS" since="2.37"/>
+    <keyword type="macro" name="GWY_STOCK_SYNTHETIC_FIBRES" link="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-FIBRES:CAPS" since="2.49"/>
     <keyword type="macro" name="GWY_STOCK_SYNTHETIC_LATTICE" link="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-LATTICE:CAPS" since="2.37"/>
     <keyword type="macro" name="GWY_STOCK_SYNTHETIC_LINE_NOISE" link="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-LINE-NOISE:CAPS" since="2.37"/>
     <keyword type="macro" name="GWY_STOCK_SYNTHETIC_NOISE" link="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-NOISE:CAPS" since="2.37"/>
     <keyword type="macro" name="GWY_STOCK_SYNTHETIC_OBJECTS" link="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-OBJECTS:CAPS" since="2.37"/>
     <keyword type="macro" name="GWY_STOCK_SYNTHETIC_PARTICLES" link="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-PARTICLES:CAPS" since="2.37"/>
     <keyword type="macro" name="GWY_STOCK_SYNTHETIC_PATTERN" link="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-PATTERN:CAPS" since="2.37"/>
+    <keyword type="macro" name="GWY_STOCK_SYNTHETIC_PHASES" link="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-PHASES:CAPS" since="2.48"/>
     <keyword type="macro" name="GWY_STOCK_SYNTHETIC_SPECTRAL" link="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-SPECTRAL:CAPS" since="2.45"/>
     <keyword type="macro" name="GWY_STOCK_SYNTHETIC_WAVES" link="libgwydgets-gwystock.html#GWY-STOCK-SYNTHETIC-WAVES:CAPS" since="2.37"/>
     <keyword type="macro" name="GWY_STOCK_TILT" link="libgwydgets-gwystock.html#GWY-STOCK-TILT:CAPS" since="2.45"/>
@@ -856,6 +899,7 @@
     <keyword type="macro" name="GWY_STOCK_VOLUME_SLICE" link="libgwydgets-gwystock.html#GWY-STOCK-VOLUME-SLICE:CAPS" since="2.46"/>
     <keyword type="macro" name="GWY_STOCK_VOLUMIZE" link="libgwydgets-gwystock.html#GWY-STOCK-VOLUMIZE:CAPS" since="2.46"/>
     <keyword type="macro" name="GWY_STOCK_VOLUMIZE_LAYERS" link="libgwydgets-gwystock.html#GWY-STOCK-VOLUMIZE-LAYERS:CAPS" since="2.45"/>
+    <keyword type="macro" name="GWY_STOCK_XY_DENOISE" link="libgwydgets-gwystock.html#GWY-STOCK-XY-DENOISE:CAPS" since="2.48"/>
     <keyword type="macro" name="GWY_STOCK_ZERO_MEAN" link="libgwydgets-gwystock.html#GWY-STOCK-ZERO-MEAN:CAPS" since="2.45"/>
     <keyword type="macro" name="GWY_STOCK_ZOOM_1_1" link="libgwydgets-gwystock.html#GWY-STOCK-ZOOM-1-1:CAPS"/>
     <keyword type="macro" name="GWY_STOCK_ZOOM_FIT" link="libgwydgets-gwystock.html#GWY-STOCK-ZOOM-FIT:CAPS"/>
@@ -910,6 +954,9 @@
     <keyword type="function" name="gwy_sensitivity_group_contains_widget ()" link="GwySensitivityGroup.html#gwy-sensitivity-group-contains-widget" since="2.34"/>
     <keyword type="struct" name="struct GwySensitivityGroup" link="GwySensitivityGroup.html#GwySensitivityGroup-struct"/>
     <keyword type="struct" name="struct GwySensitivityGroupClass" link="GwySensitivityGroup.html#GwySensitivityGroupClass"/>
+    <keyword type="constant" name="GWY_SCALE_MAPPING_LINEAR" link="GwyAdjustBar.html#GWY-SCALE-MAPPING-LINEAR:CAPS"/>
+    <keyword type="constant" name="GWY_SCALE_MAPPING_SQRT" link="GwyAdjustBar.html#GWY-SCALE-MAPPING-SQRT:CAPS"/>
+    <keyword type="constant" name="GWY_SCALE_MAPPING_LOG" link="GwyAdjustBar.html#GWY-SCALE-MAPPING-LOG:CAPS"/>
     <keyword type="constant" name="GWY_AXIS_SCALE_FORMAT_AUTO" link="libgwydgets-gwydgetenums.html#GWY-AXIS-SCALE-FORMAT-AUTO:CAPS"/>
     <keyword type="constant" name="GWY_AXIS_SCALE_FORMAT_EXP" link="libgwydgets-gwydgetenums.html#GWY-AXIS-SCALE-FORMAT-EXP:CAPS"/>
     <keyword type="constant" name="GWY_AXIS_SCALE_FORMAT_INT" link="libgwydgets-gwydgetenums.html#GWY-AXIS-SCALE-FORMAT-INT:CAPS"/>
@@ -934,10 +981,12 @@
     <keyword type="constant" name="GWY_HSCALE_DEFAULT" link="libgwydgets-gwydgetenums.html#GWY-HSCALE-DEFAULT:CAPS"/>
     <keyword type="constant" name="GWY_HSCALE_LOG" link="libgwydgets-gwydgetenums.html#GWY-HSCALE-LOG:CAPS"/>
     <keyword type="constant" name="GWY_HSCALE_SQRT" link="libgwydgets-gwydgetenums.html#GWY-HSCALE-SQRT:CAPS"/>
+    <keyword type="constant" name="GWY_HSCALE_LINEAR" link="libgwydgets-gwydgetenums.html#GWY-HSCALE-LINEAR:CAPS"/>
     <keyword type="constant" name="GWY_HSCALE_NO_SCALE" link="libgwydgets-gwydgetenums.html#GWY-HSCALE-NO-SCALE:CAPS"/>
     <keyword type="constant" name="GWY_HSCALE_WIDGET" link="libgwydgets-gwydgetenums.html#GWY-HSCALE-WIDGET:CAPS"/>
     <keyword type="constant" name="GWY_HSCALE_WIDGET_NO_EXPAND" link="libgwydgets-gwydgetenums.html#GWY-HSCALE-WIDGET-NO-EXPAND:CAPS"/>
     <keyword type="constant" name="GWY_HSCALE_CHECK" link="libgwydgets-gwydgetenums.html#GWY-HSCALE-CHECK:CAPS"/>
+    <keyword type="constant" name="GWY_HSCALE_SNAP" link="libgwydgets-gwydgetenums.html#GWY-HSCALE-SNAP:CAPS"/>
     <keyword type="constant" name="GWY_GRAPH_STATUS_PLAIN" link="libgwydgets-gwydgetenums.html#GWY-GRAPH-STATUS-PLAIN:CAPS"/>
     <keyword type="constant" name="GWY_GRAPH_STATUS_XSEL" link="libgwydgets-gwydgetenums.html#GWY-GRAPH-STATUS-XSEL:CAPS"/>
     <keyword type="constant" name="GWY_GRAPH_STATUS_YSEL" link="libgwydgets-gwydgetenums.html#GWY-GRAPH-STATUS-YSEL:CAPS"/>
diff --git a/devel-docs/libgwydgets/html/standard-vector-layers.html b/devel-docs/libgwydgets/html/standard-vector-layers.html
index cc0b5b6..1928bda 100644
--- a/devel-docs/libgwydgets/html/standard-vector-layers.html
+++ b/devel-docs/libgwydgets/html/standard-vector-layers.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Standard Vector Layers: Gwyddion Widgets Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Widgets Library Reference Manual">
 <link rel="up" href="DataWindowWidgets.html" title="Data Windows and Views">
 <link rel="prev" href="GwyColorAxis.html" title="GwyColorAxis">
diff --git a/devel-docs/libgwydgets/libgwydgets-docs.sgml b/devel-docs/libgwydgets/libgwydgets-docs.sgml
index 00b3ce3..071a115 100644
--- a/devel-docs/libgwydgets/libgwydgets-docs.sgml
+++ b/devel-docs/libgwydgets/libgwydgets-docs.sgml
@@ -64,6 +64,7 @@
 
   <chapter id="GeneralWidgets">
     <title>General Widgets</title>
+    <xi:include href="xml/gwyadjustbar.xml"/>
     <xi:include href="xml/gwycolorbutton.xml"/>
     <xi:include href="xml/gwycurve.xml"/>
     <xi:include href="xml/gwyruler.xml"/>
@@ -96,93 +97,101 @@
     <title>Index of all symbols</title>
     <xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-deprec" role="deprecated">
+  <index id="api-index-deprec">
     <title>Index of deprecated symbols</title>
     <xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-1" role="2.1">
+  <index id="api-index-2-1">
     <title>Index of new symbols in 2.1</title>
     <xi:include href="xml/api-index-2.1.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-3" role="2.3">
+  <index id="api-index-2-3">
     <title>Index of new symbols in 2.3</title>
     <xi:include href="xml/api-index-2.3.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-5" role="2.5">
+  <index id="api-index-2-5">
     <title>Index of new symbols in 2.5</title>
     <xi:include href="xml/api-index-2.5.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-7" role="2.7">
+  <index id="api-index-2-7">
     <title>Index of new symbols in 2.7</title>
     <xi:include href="xml/api-index-2.7.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-8" role="2.8">
+  <index id="api-index-2-8">
     <title>Index of new symbols in 2.8</title>
     <xi:include href="xml/api-index-2.8.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-11" role="2.11">
+  <index id="api-index-2-11">
     <title>Index of new symbols in 2.11</title>
     <xi:include href="xml/api-index-2.11.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-14" role="2.14">
+  <index id="api-index-2-14">
     <title>Index of new symbols in 2.14</title>
     <xi:include href="xml/api-index-2.14.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-16" role="2.16">
+  <index id="api-index-2-16">
     <title>Index of new symbols in 2.16</title>
     <xi:include href="xml/api-index-2.16.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-22" role="2.22">
+  <index id="api-index-2-22">
     <title>Index of new symbols in 2.22</title>
     <xi:include href="xml/api-index-2.22.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-23" role="2.23">
+  <index id="api-index-2-23">
     <title>Index of new symbols in 2.23</title>
     <xi:include href="xml/api-index-2.23.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-26" role="2.26">
+  <index id="api-index-2-26">
     <title>Index of new symbols in 2.26</title>
     <xi:include href="xml/api-index-2.26.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-29" role="2.29">
+  <index id="api-index-2-29">
     <title>Index of new symbols in 2.29</title>
     <xi:include href="xml/api-index-2.29.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-34" role="2.34">
+  <index id="api-index-2-34">
     <title>Index of new symbols in 2.34</title>
     <xi:include href="xml/api-index-2.34.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-37" role="2.37">
+  <index id="api-index-2-37">
     <title>Index of new symbols in 2.37</title>
     <xi:include href="xml/api-index-2.37.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-38" role="2.38">
+  <index id="api-index-2-38">
     <title>Index of new symbols in 2.38</title>
     <xi:include href="xml/api-index-2.38.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-39" role="2.39">
+  <index id="api-index-2-39">
     <title>Index of new symbols in 2.39</title>
     <xi:include href="xml/api-index-2.39.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-41" role="2.41">
+  <index id="api-index-2-41">
     <title>Index of new symbols in 2.41</title>
     <xi:include href="xml/api-index-2.41.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-42" role="2.42">
+  <index id="api-index-2-42">
     <title>Index of new symbols in 2.42</title>
     <xi:include href="xml/api-index-2.42.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-43" role="2.43">
+  <index id="api-index-2-43">
     <title>Index of new symbols in 2.43</title>
     <xi:include href="xml/api-index-2.43.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-45" role="2.45">
+  <index id="api-index-2-45">
     <title>Index of new symbols in 2.45</title>
     <xi:include href="xml/api-index-2.45.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-46" role="2.46">
+  <index id="api-index-2-46">
     <title>Index of new symbols in 2.46</title>
     <xi:include href="xml/api-index-2.46.xml"><xi:fallback /></xi:include>
   </index>
+  <index id="api-index-2-48">
+    <title>Index of new symbols in 2.48</title>
+    <xi:include href="xml/api-index-2.48.xml"><xi:fallback /></xi:include>
+  </index>
+  <index id="api-index-2-49">
+    <title>Index of new symbols in 2.49</title>
+    <xi:include href="xml/api-index-2.49.xml"><xi:fallback /></xi:include>
+  </index>
   <!-- API INDICES END -->
 </book>
diff --git a/devel-docs/libgwydraw/Makefile.in b/devel-docs/libgwydraw/Makefile.in
index 7ba966d..79cd604 100644
--- a/devel-docs/libgwydraw/Makefile.in
+++ b/devel-docs/libgwydraw/Makefile.in
@@ -178,10 +178,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -191,6 +188,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -215,7 +214,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -273,6 +274,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -281,17 +283,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/devel-docs/libgwydraw/html/GwyGLMaterial.html b/devel-docs/libgwydraw/html/GwyGLMaterial.html
index d5d0ce1..b4d52e4 100644
--- a/devel-docs/libgwydraw/html/GwyGLMaterial.html
+++ b/devel-docs/libgwydraw/html/GwyGLMaterial.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyGLMaterial: Gwyddion Drawing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="prev" href="GwyGradient.html" title="GwyGradient">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyGLMaterial.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -153,7 +153,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGLMaterial.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -208,7 +208,7 @@ gwy_gl_material_get_ambient (<em class="parameter"><code><a class="link" href="G
 <p>Gets the ambient reflectance of a GL material.</p>
 <div class="refsect3">
 <a name="gwy-gl-material-get-ambient.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -236,7 +236,7 @@ gwy_gl_material_set_ambient (<em class="parameter"><code><a class="link" href="G
 <p>Sets the ambient reflectance of a GL material.</p>
 <div class="refsect3">
 <a name="gwy-gl-material-set-ambient.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -265,7 +265,7 @@ gwy_gl_material_get_diffuse (<em class="parameter"><code><a class="link" href="G
 <p>Gets the diffuse reflectance of a GL material.</p>
 <div class="refsect3">
 <a name="gwy-gl-material-get-diffuse.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -293,7 +293,7 @@ gwy_gl_material_set_diffuse (<em class="parameter"><code><a class="link" href="G
 <p>Sets the diffuse reflectance of a GL material.</p>
 <div class="refsect3">
 <a name="gwy-gl-material-set-diffuse.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -322,7 +322,7 @@ gwy_gl_material_get_specular (<em class="parameter"><code><a class="link" href="
 <p>Gets the specular reflectance of a GL material.</p>
 <div class="refsect3">
 <a name="gwy-gl-material-get-specular.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -350,7 +350,7 @@ gwy_gl_material_set_specular (<em class="parameter"><code><a class="link" href="
 <p>Sets the specular reflectance of a GL material.</p>
 <div class="refsect3">
 <a name="gwy-gl-material-set-specular.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -379,7 +379,7 @@ gwy_gl_material_get_emission (<em class="parameter"><code><a class="link" href="
 <p>Gets the emission component of a GL material.</p>
 <div class="refsect3">
 <a name="gwy-gl-material-get-emission.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -407,7 +407,7 @@ gwy_gl_material_set_emission (<em class="parameter"><code><a class="link" href="
 <p>Sets the emission component of a GL material.</p>
 <div class="refsect3">
 <a name="gwy-gl-material-set-emission.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -436,7 +436,7 @@ gwy_gl_material_get_shininess (<em class="parameter"><code><a class="link" href=
 <p>Gets the shininess value of a GL material.</p>
 <div class="refsect3">
 <a name="gwy-gl-material-get-shininess.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -463,7 +463,7 @@ gwy_gl_material_set_shininess (<em class="parameter"><code><a class="link" href=
 <p>Sets the shininess value of a GL material.</p>
 <div class="refsect3">
 <a name="gwy-gl-material-set-shininess.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -493,7 +493,7 @@ gwy_gl_material_sample_to_pixbuf (<em class="parameter"><code><a class="link" hr
 <p>Samples GL material to a provided pixbuf.</p>
 <div class="refsect3">
 <a name="gwy-gl-material-sample-to-pixbuf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -522,7 +522,7 @@ gwy_gl_material_reset (<em class="parameter"><code><a class="link" href="GwyGLMa
 <p>Resets a GL material to default values.</p>
 <div class="refsect3">
 <a name="gwy-gl-material-reset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -555,7 +555,7 @@ gwy_gl_materials_get_gl_material (<em class="parameter"><code>const <a href="htt
 <p>Convenience function to get a GL material from <a class="link" href="GwyGLMaterial.html#gwy-gl-materials" title="gwy_gl_materials ()"><code class="function">gwy_gl_materials()</code></a> by name.</p>
 <div class="refsect3">
 <a name="gwy-gl-materials-get-gl-material.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydraw/html/GwyGradient.html b/devel-docs/libgwydraw/html/GwyGradient.html
index 6759ab3..bf94790 100644
--- a/devel-docs/libgwydraw/html/GwyGradient.html
+++ b/devel-docs/libgwydraw/html/GwyGradient.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyGradient: Gwyddion Drawing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="prev" href="libgwydraw-GwyRGBA.html" title="GwyRGBA">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyGradient.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -179,7 +179,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGradient.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -240,7 +240,7 @@ gwy_gradient_get_color (<em class="parameter"><code><a class="link" href="GwyGra
 <p>Computes the color at a given position of a color gradient.</p>
 <div class="refsect3">
 <a name="gwy-gradient-get-color.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -281,7 +281,7 @@ their number never changes.  The returned pointer is valid only as long
 as the gradient used, indicated by <a href="../GwyResource.html#gwy-resource-use"><code class="function">gwy_resource_use()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-gradient-get-samples.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -326,7 +326,7 @@ gradient definition change), use <a class="link" href="GwyGradient.html#gwy-grad
 This function does not need the gradient to be in use, though.</p>
 <div class="refsect3">
 <a name="gwy-gradient-sample.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -370,7 +370,7 @@ points this method uses supersampling and thus it gives a bit better
 looking gradient presentation.</p>
 <div class="refsect3">
 <a name="gwy-gradient-sample-to-pixbuf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -399,7 +399,7 @@ gwy_gradient_get_npoints (<em class="parameter"><code><a class="link" href="GwyG
 <p>Returns the number of points in a color gradient.</p>
 <div class="refsect3">
 <a name="gwy-gradient-get-npoints.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -427,7 +427,7 @@ gwy_gradient_get_point (<em class="parameter"><code><a class="link" href="GwyGra
 <p>Returns the point at given index of a color gradient.</p>
 <div class="refsect3">
 <a name="gwy-gradient-get-point.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -466,7 +466,7 @@ gwy_gradient_set_point (<em class="parameter"><code><a class="link" href="GwyGra
 (or last) point from 0 (or 1).</p>
 <div class="refsect3">
 <a name="gwy-gradient-set-point.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -504,7 +504,7 @@ gwy_gradient_set_point_color (<em class="parameter"><code><a class="link" href="
 <p>Sets the color of a color gradient point without moving it.</p>
 <div class="refsect3">
 <a name="gwy-gradient-set-point-color.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -543,7 +543,7 @@ gwy_gradient_insert_point (<em class="parameter"><code><a class="link" href="Gwy
 move the first (or last) point from 0 (or 1).</p>
 <div class="refsect3">
 <a name="gwy-gradient-insert-point.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -580,7 +580,7 @@ gwy_gradient_insert_point_sorted (<em class="parameter"><code><a class="link" hr
 <p>Inserts a point into a color gradient based on its x position.</p>
 <div class="refsect3">
 <a name="gwy-gradient-insert-point-sorted.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -620,7 +620,7 @@ with <em class="parameter"><code>x</code></em>
  = 1 present.</p>
 <div class="refsect3">
 <a name="gwy-gradient-delete-point.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -650,7 +650,7 @@ gwy_gradient_reset (<em class="parameter"><code><a class="link" href="GwyGradien
 <p>Resets a gradient to the default two-point gray scale state.</p>
 <div class="refsect3">
 <a name="gwy-gradient-reset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -673,7 +673,7 @@ gwy_gradient_get_points (<em class="parameter"><code><a class="link" href="GwyGr
 <p>Returns the complete set of color points of a gradient.</p>
 <div class="refsect3">
 <a name="gwy-gradient-get-points.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -713,7 +713,7 @@ gwy_gradient_set_points (<em class="parameter"><code><a class="link" href="GwyGr
 last end at 1.0.  There should be no redundant points.</p>
 <div class="refsect3">
 <a name="gwy-gradient-set-points.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -752,7 +752,7 @@ gwy_gradient_set_from_samples (<em class="parameter"><code><a class="link" href=
 <p>The result is usually approximate.</p>
 <div class="refsect3">
 <a name="gwy-gradient-set-from-samples.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -804,7 +804,7 @@ gwy_gradients_get_gradient (<em class="parameter"><code>const <a href="/usr/shar
 <p>Convenience function to get a gradient from <a class="link" href="GwyGradient.html#gwy-gradients" title="gwy_gradients ()"><code class="function">gwy_gradients()</code></a> by name.</p>
 <div class="refsect3">
 <a name="gwy-gradients-get-gradient.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -861,7 +861,7 @@ the default item in <a class="link" href="GwyGradient.html#gwy-gradients" title=
 <p>Gradient color point struct.</p>
 <div class="refsect3">
 <a name="GwyGradientPoint.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
diff --git a/devel-docs/libgwydraw/html/GwySelection.html b/devel-docs/libgwydraw/html/GwySelection.html
index 4b349b8..b33d8ee 100644
--- a/devel-docs/libgwydraw/html/GwySelection.html
+++ b/devel-docs/libgwydraw/html/GwySelection.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwySelection: Gwyddion Drawing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="prev" href="libgwydraw-gwypixfield.html" title="gwypixfield">
@@ -37,7 +37,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwySelection.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -182,7 +182,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySelection.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -204,7 +204,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySelection.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -226,7 +226,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySelection.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -290,7 +290,7 @@ is also used to determine the number of selected object.</p>
 <p>Type of selection filtering function.</p>
 <div class="refsect3">
 <a name="GwySelectionFilterFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -330,7 +330,7 @@ should be removed.</p>
 typecasting.</p>
 <div class="refsect3">
 <a name="gwy-selection-duplicate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -352,7 +352,7 @@ gwy_selection_get_object_size (<em class="parameter"><code><a class="link" href=
 <p>Gets the number of coordinates that make up a one selection object.</p>
 <div class="refsect3">
 <a name="gwy-selection-get-object-size.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -378,7 +378,7 @@ gwy_selection_clear (<em class="parameter"><code><a class="link" href="GwySelect
 <p>Clears a selection.</p>
 <div class="refsect3">
 <a name="gwy-selection-clear.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -402,7 +402,7 @@ gwy_selection_get_object (<em class="parameter"><code><a class="link" href="GwyS
 <p>Gets one selection object.</p>
 <div class="refsect3">
 <a name="gwy-selection-get-object.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -450,7 +450,7 @@ then equal to either the number of selected objects or special value -1
 meaning append to end.</p>
 <div class="refsect3">
 <a name="gwy-selection-set-object.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -493,7 +493,7 @@ gwy_selection_delete_object (<em class="parameter"><code><a class="link" href="G
 objects is moved to close the gap.</p>
 <div class="refsect3">
 <a name="gwy-selection-delete-object.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -523,7 +523,7 @@ gwy_selection_get_data (<em class="parameter"><code><a class="link" href="GwySel
 <p>Gets selection data.</p>
 <div class="refsect3">
 <a name="gwy-selection-get-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -563,7 +563,7 @@ gwy_selection_set_data (<em class="parameter"><code><a class="link" href="GwySel
 <p>Sets selection data.</p>
 <div class="refsect3">
 <a name="gwy-selection-set-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -600,7 +600,7 @@ gwy_selection_get_max_objects (<em class="parameter"><code><a class="link" href=
 <p>Gets the maximum number of selected objects.</p>
 <div class="refsect3">
 <a name="gwy-selection-get-max-objects.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -629,7 +629,7 @@ gwy_selection_set_max_objects (<em class="parameter"><code><a class="link" href=
 "finished" signal.</p>
 <div class="refsect3">
 <a name="gwy-selection-set-max-objects.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -659,7 +659,7 @@ gwy_selection_is_full (<em class="parameter"><code><a class="link" href="GwySele
 <p>Checks whether the maximum number of objects is selected.</p>
 <div class="refsect3">
 <a name="gwy-selection-is-full.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -694,7 +694,7 @@ the specific selection type.  If the selection class does not implement this
 method then all objects are removed.</p>
 <div class="refsect3">
 <a name="gwy-selection-crop.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -745,7 +745,7 @@ it is meaningful.  For some, such as GwySelectionLattice, it is not
 meaningful and moving GwySelectionLattice thus does not do anything.</p>
 <div class="refsect3">
 <a name="gwy-selection-move.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -782,7 +782,7 @@ gwy_selection_filter (<em class="parameter"><code><a class="link" href="GwySelec
 <p>Removes selection objects matching certain criteria.</p>
 <div class="refsect3">
 <a name="gwy-selection-filter.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -820,7 +820,7 @@ gwy_selection_changed (<em class="parameter"><code><a class="link" href="GwySele
 <p>Emits "changed" signal on a selection.</p>
 <div class="refsect3">
 <a name="gwy-selection-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -850,7 +850,7 @@ gwy_selection_finished (<em class="parameter"><code><a class="link" href="GwySel
 <p>Emits "finished" signal on a selection.</p>
 <div class="refsect3">
 <a name="gwy-selection-finished.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -875,7 +875,7 @@ of coordinates.  It should not be accessed directly except selection
 class implementation.</p>
 <div class="refsect3">
 <a name="GwySelection.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
@@ -922,7 +922,7 @@ class implementation.</p>
 and need not be overriden.</p>
 <div class="refsect3">
 <a name="GwySelectionClass.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
@@ -1015,7 +1015,7 @@ user_function (<a class="link" href="GwySelection.html" title="GwySelection"><sp
 <p>The ::changed signal is emitted whenever selection changes.</p>
 <div class="refsect3">
 <a name="GwySelection-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1056,7 +1056,7 @@ user_function (<a class="link" href="GwySelection.html" title="GwySelection"><sp
 a selection object. Selections never emit this signal themselves.</p>
 <div class="refsect3">
 <a name="GwySelection-finished.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydraw/html/api-index-2-16.html b/devel-docs/libgwydraw/html/api-index-2-16.html
index 789fb4f..097292a 100644
--- a/devel-docs/libgwydraw/html/api-index-2-16.html
+++ b/devel-docs/libgwydraw/html/api-index-2-16.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.16: Gwyddion Drawing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="prev" href="api-index-all.html" title="Index of all symbols">
diff --git a/devel-docs/libgwydraw/html/api-index-2-32.html b/devel-docs/libgwydraw/html/api-index-2-32.html
index f8a18ad..6482634 100644
--- a/devel-docs/libgwydraw/html/api-index-2-32.html
+++ b/devel-docs/libgwydraw/html/api-index-2-32.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.32: Gwyddion Drawing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="prev" href="api-index-2-16.html" title="Index of new symbols in 2.16">
diff --git a/devel-docs/libgwydraw/html/api-index-2-39.html b/devel-docs/libgwydraw/html/api-index-2-39.html
index 564ca50..6bb1c7d 100644
--- a/devel-docs/libgwydraw/html/api-index-2-39.html
+++ b/devel-docs/libgwydraw/html/api-index-2-39.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.39: Gwyddion Drawing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="prev" href="api-index-2-32.html" title="Index of new symbols in 2.32">
diff --git a/devel-docs/libgwydraw/html/api-index-2-43.html b/devel-docs/libgwydraw/html/api-index-2-43.html
index d86f46c..31438b9 100644
--- a/devel-docs/libgwydraw/html/api-index-2-43.html
+++ b/devel-docs/libgwydraw/html/api-index-2-43.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.43: Gwyddion Drawing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="prev" href="api-index-2-39.html" title="Index of new symbols in 2.39">
diff --git a/devel-docs/libgwydraw/html/api-index-2-47.html b/devel-docs/libgwydraw/html/api-index-2-47.html
index 35106b2..dd0fbd2 100644
--- a/devel-docs/libgwydraw/html/api-index-2-47.html
+++ b/devel-docs/libgwydraw/html/api-index-2-47.html
@@ -3,10 +3,11 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.47: Gwyddion Drawing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="prev" href="api-index-2-43.html" title="Index of new symbols in 2.43">
+<link rel="next" href="api-index-2-49.html" title="Index of new symbols in 2.49">
 <meta name="generator" content="GTK-Doc V1.19 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -16,7 +17,7 @@
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
 <td><a accesskey="p" href="api-index-2-43.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><img src="right-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="n" href="api-index-2-49.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="index">
 <div class="titlepage"><div><div><h1 class="title">
diff --git a/devel-docs/libgwydraw/html/api-index-2-49.html b/devel-docs/libgwydraw/html/api-index-2-49.html
new file mode 100644
index 0000000..fd4f064
--- /dev/null
+++ b/devel-docs/libgwydraw/html/api-index-2-49.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.49: Gwyddion Drawing Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<link rel="home" href="index.html" title="Gwyddion Drawing Library Reference Manual">
+<link rel="up" href="index.html" title="Gwyddion Drawing Library Reference Manual">
+<link rel="prev" href="api-index-2-47.html" title="Index of new symbols in 2.47">
+<meta name="generator" content="GTK-Doc V1.19 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxR">R</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="p" href="api-index-2-47.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><img src="right-insensitive.png" width="16" height="16" border="0"></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h1 class="title">
+<a name="api-index-2-49"></a>Index of new symbols in 2.49</h1></div></div></div>
+<a name="idx"></a><a name="idxR"></a><h3 class="title">R</h3>
+<dt>
+<a class="link" href="libgwydraw-GwyRGBA.html#gwy-rgba-from-pixbuf-pixel" title="gwy_rgba_from_pixbuf_pixel ()">gwy_rgba_from_pixbuf_pixel</a>, function in <a class="link" href="libgwydraw-GwyRGBA.html" title="GwyRGBA">GwyRGBA</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwydraw-GwyRGBA.html#gwy-rgba-to-pixbuf-pixel" title="gwy_rgba_to_pixbuf_pixel ()">gwy_rgba_to_pixbuf_pixel</a>, function in <a class="link" href="libgwydraw-GwyRGBA.html" title="GwyRGBA">GwyRGBA</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.19</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/devel-docs/libgwydraw/html/api-index-all.html b/devel-docs/libgwydraw/html/api-index-all.html
index c3062dc..f121b3a 100644
--- a/devel-docs/libgwydraw/html/api-index-all.html
+++ b/devel-docs/libgwydraw/html/api-index-all.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of all symbols: Gwyddion Drawing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="prev" href="libgwydraw-gwydraw.html" title="gwydraw">
@@ -235,6 +235,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwydraw-GwyRGBA.html#gwy-rgba-from-pixbuf-pixel" title="gwy_rgba_from_pixbuf_pixel ()">gwy_rgba_from_pixbuf_pixel</a>, function in <a class="link" href="libgwydraw-GwyRGBA.html" title="GwyRGBA">GwyRGBA</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwydraw-GwyRGBA.html#gwy-rgba-get-from-container" title="gwy_rgba_get_from_container ()">gwy_rgba_get_from_container</a>, function in <a class="link" href="libgwydraw-GwyRGBA.html" title="GwyRGBA">GwyRGBA</a>
 </dt>
 <dd></dd>
@@ -278,6 +282,10 @@
 <a class="link" href="libgwydraw-GwyRGBA.html#gwy-rgba-to-hex8" title="gwy_rgba_to_hex8 ()">gwy_rgba_to_hex8</a>, function in <a class="link" href="libgwydraw-GwyRGBA.html" title="GwyRGBA">GwyRGBA</a>
 </dt>
 <dd></dd>
+<dt>
+<a class="link" href="libgwydraw-GwyRGBA.html#gwy-rgba-to-pixbuf-pixel" title="gwy_rgba_to_pixbuf_pixel ()">gwy_rgba_to_pixbuf_pixel</a>, function in <a class="link" href="libgwydraw-GwyRGBA.html" title="GwyRGBA">GwyRGBA</a>
+</dt>
+<dd></dd>
 <a name="idxS"></a><h3 class="title">S</h3>
 <dt>
 <a class="link" href="GwySelection.html#GwySelection-struct" title="struct GwySelection">GwySelection</a>, struct in <a class="link" href="GwySelection.html" title="GwySelection">GwySelection</a>
diff --git a/devel-docs/libgwydraw/html/index.html b/devel-docs/libgwydraw/html/index.html
index 4e8afd9..87514ae 100644
--- a/devel-docs/libgwydraw/html/index.html
+++ b/devel-docs/libgwydraw/html/index.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Gwyddion Drawing Library Reference Manual: Gwyddion Drawing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="next" href="libgwydraw-GwyRGBA.html" title="GwyRGBA">
 <meta name="generator" content="GTK-Doc V1.19 (XML mode)">
@@ -15,7 +15,7 @@
 <div>
 <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">Gwyddion Drawing Library Reference Manual</p></th></tr></table></div>
 <div><p class="releaseinfo">
-  For Gwyddion 2.47.
+  For Gwyddion 2.49.
   The latest version of this document can be found on-line at
   <a class="ulink" href="http://gwyddion.net/documentation/libgwydraw/index.php" target="_top">http://gwyddion.net/documentation/libgwydraw/</a>.
 </p></div>
@@ -50,6 +50,7 @@
 <dt><span class="index"><a href="api-index-2-39.html">Index of new symbols in 2.39</a></span></dt>
 <dt><span class="index"><a href="api-index-2-43.html">Index of new symbols in 2.43</a></span></dt>
 <dt><span class="index"><a href="api-index-2-47.html">Index of new symbols in 2.47</a></span></dt>
+<dt><span class="index"><a href="api-index-2-49.html">Index of new symbols in 2.49</a></span></dt>
 </dl></div>
 <p>
     This library contains low-level data visualization and color handling
diff --git a/devel-docs/libgwydraw/html/libgwydraw-GwyRGBA.html b/devel-docs/libgwydraw/html/libgwydraw-GwyRGBA.html
index 95e94be..6fd7a0e 100644
--- a/devel-docs/libgwydraw/html/libgwydraw-GwyRGBA.html
+++ b/devel-docs/libgwydraw/html/libgwydraw-GwyRGBA.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyRGBA: Gwyddion Drawing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="prev" href="index.html" title="Gwyddion Drawing Library Reference Manual">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwydraw-GwyRGBA.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -159,6 +159,22 @@
 <a class="link" href="libgwydraw-GwyRGBA.html#gwy-rgba-to-hex8" title="gwy_rgba_to_hex8 ()">gwy_rgba_to_hex8</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="libgwydraw-GwyRGBA.html#gwy-rgba-to-pixbuf-pixel" title="gwy_rgba_to_pixbuf_pixel ()">gwy_rgba_to_pixbuf_pixel</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="libgwydraw-GwyRGBA.html#gwy-rgba-from-pixbuf-pixel" title="gwy_rgba_from_pixbuf_pixel ()">gwy_rgba_from_pixbuf_pixel</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -190,7 +206,7 @@ gwy_rgba_new (<em class="parameter"><code><a href="http://developer.gnome.org/do
 <p>This is mostly useful for language bindings.</p>
 <div class="refsect3">
 <a name="gwy-rgba-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -236,7 +252,7 @@ gwy_rgba_copy (<em class="parameter"><code>const <span class="type">GwyRGBA</spa
 <a class="link" href="libgwydraw-GwyRGBA.html#gwy-rgba-free" title="gwy_rgba_free ()"><code class="function">gwy_rgba_free()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-rgba-copy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -263,7 +279,7 @@ gwy_rgba_free (<em class="parameter"><code><span class="type">GwyRGBA</span> *rg
 <p>Frees an rgba structure created with <a class="link" href="libgwydraw-GwyRGBA.html#gwy-rgba-copy" title="gwy_rgba_copy ()"><code class="function">gwy_rgba_copy()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-rgba-free.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -287,7 +303,7 @@ gwy_rgba_to_gdk_color (<em class="parameter"><code>const <span class="type">GwyR
 <p>Note no allocation is performed, just channel value conversion.</p>
 <div class="refsect3">
 <a name="gwy-rgba-to-gdk-color.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -316,7 +332,7 @@ gwy_rgba_to_gdk_alpha (<em class="parameter"><code>const <span class="type">GwyR
 <p>Converts a rgba to a Gdk opacity value.</p>
 <div class="refsect3">
 <a name="gwy-rgba-to-gdk-alpha.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -344,7 +360,7 @@ gwy_rgba_from_gdk_color (<em class="parameter"><code><span class="type">GwyRGBA<
 <p>The alpha value is unchanged, as <a href="http://developer.gnome.org/doc/API/2.0/gtk/gdk3gdk3-Colors.html#GdkColor"><span class="type">GdkColor</span></a> has no opacity information.</p>
 <div class="refsect3">
 <a name="gwy-rgba-from-gdk-color.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -358,7 +374,7 @@ gwy_rgba_from_gdk_color (<em class="parameter"><code><span class="type">GwyRGBA<
 </tr>
 <tr>
 <td class="parameter_name"><p>gdkcolor</p></td>
-<td class="parameter_description"><p>A <a href="http://developer.gnome.org/doc/API/2.0/gtk/gdk3gdk3-Colors.html#GdkColor"><span class="type">GdkColor</span></a>.</p></td>
+<td class="parameter_description"><p>A <a href="/usr/share/gtk-doc/html/gdk3gdk3-Colors.html#GdkColor"><span class="type">GdkColor</span></a>.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -375,7 +391,7 @@ gwy_rgba_from_gdk_color_and_alpha (<em class="parameter"><code><span class="type
 <p>Converts a Gdk color plus an opacity value to a rgba.</p>
 <div class="refsect3">
 <a name="gwy-rgba-from-gdk-color-and-alpha.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -414,7 +430,7 @@ gwy_rgba_interpolate (<em class="parameter"><code>const <span class="type">GwyRG
 this function, not simple independent interpolation of r, g, b, and a.</p>
 <div class="refsect3">
 <a name="gwy-rgba-interpolate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -440,7 +456,7 @@ this function, not simple independent interpolation of r, g, b, and a.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>rgba</p></td>
-<td class="parameter_description"><p>A <span class="type">GwyRGBA</span> to store result to.</p></td>
+<td class="parameter_description"><p>A <span class="type">GwyRGBA</span> to store the result to.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -459,7 +475,7 @@ gwy_rgba_get_from_container (<em class="parameter"><code><span class="type">GwyR
 arrangement.</p>
 <div class="refsect3">
 <a name="gwy-rgba-get-from-container.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -504,7 +520,7 @@ gwy_rgba_store_to_container (<em class="parameter"><code>const <span class="type
 arrangement.</p>
 <div class="refsect3">
 <a name="gwy-rgba-store-to-container.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -543,7 +559,7 @@ gwy_rgba_remove_from_container (<em class="parameter"><code><a href="../GwyConta
 arrangement.</p>
 <div class="refsect3">
 <a name="gwy-rgba-remove-from-container.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -581,7 +597,7 @@ gwy_rgba_set_gdk_gc_fg (<em class="parameter"><code>const <span class="type">Gwy
 documentation for details and caveats.</p>
 <div class="refsect3">
 <a name="gwy-rgba-set-gdk-gc-fg.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -613,7 +629,7 @@ gwy_rgba_set_gdk_gc_bg (<em class="parameter"><code>const <span class="type">Gwy
 documentation for details and caveats.</p>
 <div class="refsect3">
 <a name="gwy-rgba-set-gdk-gc-bg.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -645,7 +661,7 @@ gwy_rgba_to_hex6 (<em class="parameter"><code>const <span class="type">GwyRGBA</
 and does not include any "#" prefix which is used in some contexts.</p>
 <div class="refsect3">
 <a name="gwy-rgba-to-hex6.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -680,7 +696,7 @@ common it is by no means universal.  The output has always exactly 8 bytes
 and does not include any "#" prefix which is used in some contexts.</p>
 <div class="refsect3">
 <a name="gwy-rgba-to-hex8.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -703,6 +719,72 @@ representation (e.g. "ffff0000" for opaque red) will be stored.</p></td>
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-32.html#api-index-2.32">2.32</a></p>
 </div>
+<hr>
+<div class="refsect2">
+<a name="gwy-rgba-to-pixbuf-pixel"></a><h3>gwy_rgba_to_pixbuf_pixel ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a>
+gwy_rgba_to_pixbuf_pixel (<em class="parameter"><code>const <span class="type">GwyRGBA</span> *rgba</code></em>);</pre>
+<p>Converts a RGBA color to pixbuf pixel.</p>
+<p>The returned pixel value includes opacity.  If <em class="parameter"><code>rgba</code></em>
+ is partially
+transparent, so is the pixel.</p>
+<div class="refsect3">
+<a name="gwy-rgba-to-pixbuf-pixel.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>rgba</p></td>
+<td class="parameter_description"><p>A RGBA color.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-rgba-to-pixbuf-pixel.returns"></a><h4>Returns</h4>
+<p> The pixel value as a 32-bit integer.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-rgba-from-pixbuf-pixel"></a><h3>gwy_rgba_from_pixbuf_pixel ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_rgba_from_pixbuf_pixel (<em class="parameter"><code><span class="type">GwyRGBA</span> *rgba</code></em>,
+                            <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint32"><span class="type">guint32</span></a> pixel</code></em>);</pre>
+<p>Converts a pixbuf pixel value to a RGBA color.</p>
+<p>The conversion includes opacity.  If the opacity channel is undefined or
+should be ignored, you need to either set the lowest byte of <em class="parameter"><code>pixel</code></em>
+ to 0xff
+or fix <em class="parameter"><code>rgba</code></em>
+ afterwards.</p>
+<div class="refsect3">
+<a name="gwy-rgba-from-pixbuf-pixel.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>rgba</p></td>
+<td class="parameter_description"><p>A <span class="type">GwyRGBA</span> to store the result to.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>pixel</p></td>
+<td class="parameter_description"><p>Pixbuf pixel value as a 32-bit integer.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
 </div>
 <div class="refsect1">
 <a name="libgwydraw-GwyRGBA.other_details"></a><h2>Types and Values</h2>
diff --git a/devel-docs/libgwydraw/html/libgwydraw-gwydraw.html b/devel-docs/libgwydraw/html/libgwydraw-gwydraw.html
index acdf527..a5e8e71 100644
--- a/devel-docs/libgwydraw/html/libgwydraw-gwydraw.html
+++ b/devel-docs/libgwydraw/html/libgwydraw-gwydraw.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwydraw: Gwyddion Drawing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="prev" href="libgwydraw-gwydrawenums.html" title="gwydrawenums">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwydraw-gwydraw.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
diff --git a/devel-docs/libgwydraw/html/libgwydraw-gwydrawenums.html b/devel-docs/libgwydraw/html/libgwydraw-gwydrawenums.html
index 121f722..6320590 100644
--- a/devel-docs/libgwydraw/html/libgwydraw-gwydrawenums.html
+++ b/devel-docs/libgwydraw/html/libgwydraw-gwydrawenums.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwydrawenums: Gwyddion Drawing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="prev" href="GwySelection.html" title="GwySelection">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwydraw-gwydrawenums.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -64,7 +64,7 @@
 <p>The pixmap image target is rarely used now.</p>
 <div class="refsect3">
 <a name="GwyRenderingTarget.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwydraw/html/libgwydraw-gwypixfield.html b/devel-docs/libgwydraw/html/libgwydraw-gwypixfield.html
index aa35b09..2e837c8 100644
--- a/devel-docs/libgwydraw/html/libgwydraw-gwypixfield.html
+++ b/devel-docs/libgwydraw/html/libgwydraw-gwypixfield.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwypixfield: Gwyddion Drawing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Drawing Library Reference Manual">
 <link rel="prev" href="GwyGLMaterial.html" title="GwyGLMaterial">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwydraw-gwypixfield.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -113,7 +113,7 @@ end, values between are mapped linearly to <em class="parameter"><code>gradient<
 .</p>
 <div class="refsect3">
 <a name="gwy-pixbuf-draw-data-field.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -158,7 +158,7 @@ and all greater values to its end, values between are mapped linearly to
 .</p>
 <div class="refsect3">
 <a name="gwy-pixbuf-draw-data-field-with-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -207,7 +207,7 @@ nonlinear, deformed using inverse function to height density cummulative
 distribution.</p>
 <div class="refsect3">
 <a name="gwy-pixbuf-draw-data-field-adaptive.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -247,7 +247,7 @@ gwy_draw_data_field_map_adaptive (<em class="parameter"><code><a href="../GwyDat
 correspond to specific values.</p>
 <div class="refsect3">
 <a name="gwy-draw-data-field-map-adaptive.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -297,7 +297,7 @@ greater or equal to 1.0 as fully opaque, values between are linearly
 mapped to pixel opacity.</p>
 <div class="refsect3">
 <a name="gwy-pixbuf-draw-data-field-as-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwydraw/html/libgwydraw.devhelp2 b/devel-docs/libgwydraw/html/libgwydraw.devhelp2
index e65ab16..3e0dfe2 100644
--- a/devel-docs/libgwydraw/html/libgwydraw.devhelp2
+++ b/devel-docs/libgwydraw/html/libgwydraw.devhelp2
@@ -14,6 +14,7 @@
     <sub name="Index of new symbols in 2.39" link="api-index-2-39.html"/>
     <sub name="Index of new symbols in 2.43" link="api-index-2-43.html"/>
     <sub name="Index of new symbols in 2.47" link="api-index-2-47.html"/>
+    <sub name="Index of new symbols in 2.49" link="api-index-2-49.html"/>
   </chapters>
   <functions>
     <keyword type="function" name="gwy_rgba_new ()" link="libgwydraw-GwyRGBA.html#gwy-rgba-new" since="2.47"/>
@@ -31,6 +32,8 @@
     <keyword type="function" name="gwy_rgba_set_gdk_gc_bg ()" link="libgwydraw-GwyRGBA.html#gwy-rgba-set-gdk-gc-bg"/>
     <keyword type="function" name="gwy_rgba_to_hex6 ()" link="libgwydraw-GwyRGBA.html#gwy-rgba-to-hex6" since="2.32"/>
     <keyword type="function" name="gwy_rgba_to_hex8 ()" link="libgwydraw-GwyRGBA.html#gwy-rgba-to-hex8" since="2.32"/>
+    <keyword type="function" name="gwy_rgba_to_pixbuf_pixel ()" link="libgwydraw-GwyRGBA.html#gwy-rgba-to-pixbuf-pixel" since="2.49"/>
+    <keyword type="function" name="gwy_rgba_from_pixbuf_pixel ()" link="libgwydraw-GwyRGBA.html#gwy-rgba-from-pixbuf-pixel" since="2.49"/>
     <keyword type="function" name="gwy_gradient_get_color ()" link="GwyGradient.html#gwy-gradient-get-color"/>
     <keyword type="function" name="gwy_gradient_get_samples ()" link="GwyGradient.html#gwy-gradient-get-samples"/>
     <keyword type="function" name="gwy_gradient_sample ()" link="GwyGradient.html#gwy-gradient-sample"/>
diff --git a/devel-docs/libgwydraw/libgwydraw-docs.sgml b/devel-docs/libgwydraw/libgwydraw-docs.sgml
index 63432c4..1afb390 100644
--- a/devel-docs/libgwydraw/libgwydraw-docs.sgml
+++ b/devel-docs/libgwydraw/libgwydraw-docs.sgml
@@ -23,25 +23,29 @@
     <title>Index of all symbols</title>
     <xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-16" role="2.16">
+  <index id="api-index-2-16">
     <title>Index of new symbols in 2.16</title>
     <xi:include href="xml/api-index-2.16.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-32" role="2.32">
+  <index id="api-index-2-32">
     <title>Index of new symbols in 2.32</title>
     <xi:include href="xml/api-index-2.32.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-39" role="2.39">
+  <index id="api-index-2-39">
     <title>Index of new symbols in 2.39</title>
     <xi:include href="xml/api-index-2.39.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-43" role="2.43">
+  <index id="api-index-2-43">
     <title>Index of new symbols in 2.43</title>
     <xi:include href="xml/api-index-2.43.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-47" role="2.47">
+  <index id="api-index-2-47">
     <title>Index of new symbols in 2.47</title>
     <xi:include href="xml/api-index-2.47.xml"><xi:fallback /></xi:include>
   </index>
+  <index id="api-index-2-49">
+    <title>Index of new symbols in 2.49</title>
+    <xi:include href="xml/api-index-2.49.xml"><xi:fallback /></xi:include>
+  </index>
   <!-- API INDICES END -->
 </book>
diff --git a/devel-docs/libgwymodule/Makefile.in b/devel-docs/libgwymodule/Makefile.in
index 1761514..e20da24 100644
--- a/devel-docs/libgwymodule/Makefile.in
+++ b/devel-docs/libgwymodule/Makefile.in
@@ -178,10 +178,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -191,6 +188,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -215,7 +214,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -273,6 +274,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -281,17 +283,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/devel-docs/libgwymodule/html/ModuleLibrary.html b/devel-docs/libgwymodule/html/ModuleLibrary.html
index dcc6c25..82e89f3 100644
--- a/devel-docs/libgwymodule/html/ModuleLibrary.html
+++ b/devel-docs/libgwymodule/html/ModuleLibrary.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Gwyddion Module Library: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="prev" href="index.html" title="Gwyddion Module Library Reference Manual">
diff --git a/devel-docs/libgwymodule/html/ModuleTutorial.html b/devel-docs/libgwymodule/html/ModuleTutorial.html
index b9805e3..b944fd8 100644
--- a/devel-docs/libgwymodule/html/ModuleTutorial.html
+++ b/devel-docs/libgwymodule/html/ModuleTutorial.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Gwyddion Module Tutorial: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="prev" href="libgwymodule-gwymodulebrowser.html" title="gwymodulebrowser">
diff --git a/devel-docs/libgwymodule/html/PluginProxyReference.html b/devel-docs/libgwymodule/html/PluginProxyReference.html
index baf2caa..de23690 100644
--- a/devel-docs/libgwymodule/html/PluginProxyReference.html
+++ b/devel-docs/libgwymodule/html/PluginProxyReference.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Plug-in Proxy Reference: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="prev" href="gwymodule-tutorial-install.html" title="Gwyddion Module Installation">
diff --git a/devel-docs/libgwymodule/html/api-index-2-1.html b/devel-docs/libgwymodule/html/api-index-2-1.html
index ac9a635..b9d1c75 100644
--- a/devel-docs/libgwymodule/html/api-index-2-1.html
+++ b/devel-docs/libgwymodule/html/api-index-2-1.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.1: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="prev" href="api-index-deprec.html" title="Index of deprecated symbols">
diff --git a/devel-docs/libgwymodule/html/api-index-2-18.html b/devel-docs/libgwymodule/html/api-index-2-18.html
index 4e3b67a..462286e 100644
--- a/devel-docs/libgwymodule/html/api-index-2-18.html
+++ b/devel-docs/libgwymodule/html/api-index-2-18.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.18: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="prev" href="api-index-2-1.html" title="Index of new symbols in 2.1">
diff --git a/devel-docs/libgwymodule/html/api-index-2-25.html b/devel-docs/libgwymodule/html/api-index-2-25.html
index 7caec57..bf33261 100644
--- a/devel-docs/libgwymodule/html/api-index-2-25.html
+++ b/devel-docs/libgwymodule/html/api-index-2-25.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.25: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="prev" href="api-index-2-18.html" title="Index of new symbols in 2.18">
diff --git a/devel-docs/libgwymodule/html/api-index-2-32.html b/devel-docs/libgwymodule/html/api-index-2-32.html
index 1818035..40e65d5 100644
--- a/devel-docs/libgwymodule/html/api-index-2-32.html
+++ b/devel-docs/libgwymodule/html/api-index-2-32.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.32: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="prev" href="api-index-2-25.html" title="Index of new symbols in 2.25">
diff --git a/devel-docs/libgwymodule/html/api-index-2-36.html b/devel-docs/libgwymodule/html/api-index-2-36.html
index c53636c..f49ce9d 100644
--- a/devel-docs/libgwymodule/html/api-index-2-36.html
+++ b/devel-docs/libgwymodule/html/api-index-2-36.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.36: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="prev" href="api-index-2-32.html" title="Index of new symbols in 2.32">
diff --git a/devel-docs/libgwymodule/html/api-index-2-38.html b/devel-docs/libgwymodule/html/api-index-2-38.html
index fe4539c..d7d76f5 100644
--- a/devel-docs/libgwymodule/html/api-index-2-38.html
+++ b/devel-docs/libgwymodule/html/api-index-2-38.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.38: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="prev" href="api-index-2-36.html" title="Index of new symbols in 2.36">
diff --git a/devel-docs/libgwymodule/html/api-index-2-45.html b/devel-docs/libgwymodule/html/api-index-2-45.html
index 399d71a..85ffa4d 100644
--- a/devel-docs/libgwymodule/html/api-index-2-45.html
+++ b/devel-docs/libgwymodule/html/api-index-2-45.html
@@ -3,10 +3,11 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.45: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="prev" href="api-index-2-38.html" title="Index of new symbols in 2.38">
+<link rel="next" href="api-index-2-48.html" title="Index of new symbols in 2.48">
 <meta name="generator" content="GTK-Doc V1.19 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -16,7 +17,7 @@
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
 <td><a accesskey="p" href="api-index-2-38.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><img src="right-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="n" href="api-index-2-48.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="index">
 <div class="titlepage"><div><div><h1 class="title">
diff --git a/devel-docs/libgwymodule/html/api-index-2-48.html b/devel-docs/libgwymodule/html/api-index-2-48.html
new file mode 100644
index 0000000..3aa58d5
--- /dev/null
+++ b/devel-docs/libgwymodule/html/api-index-2-48.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.48: Gwyddion Module Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
+<link rel="up" href="index.html" title="Gwyddion Module Library Reference Manual">
+<link rel="prev" href="api-index-2-45.html" title="Index of new symbols in 2.45">
+<link rel="next" href="api-index-2-49.html" title="Index of new symbols in 2.49">
+<meta name="generator" content="GTK-Doc V1.19 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxM">M</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="p" href="api-index-2-45.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-49.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h1 class="title">
+<a name="api-index-2-48"></a>Index of new symbols in 2.48</h1></div></div></div>
+<a name="idx"></a><a name="idxM"></a><h3 class="title">M</h3>
+<dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-disable-registration" title="gwy_module_disable_registration ()">gwy_module_disable_registration</a>, function in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-enable-registration" title="gwy_module_enable_registration ()">gwy_module_enable_registration</a>, function in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-is-enabled" title="gwy_module_is_enabled ()">gwy_module_is_enabled</a>, function in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.19</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/devel-docs/libgwymodule/html/api-index-2-49.html b/devel-docs/libgwymodule/html/api-index-2-49.html
new file mode 100644
index 0000000..cec9e9f
--- /dev/null
+++ b/devel-docs/libgwymodule/html/api-index-2-49.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.49: Gwyddion Module Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
+<link rel="up" href="index.html" title="Gwyddion Module Library Reference Manual">
+<link rel="prev" href="api-index-2-48.html" title="Index of new symbols in 2.48">
+<meta name="generator" content="GTK-Doc V1.19 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxM">M</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="p" href="api-index-2-48.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><img src="right-insensitive.png" width="16" height="16" border="0"></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h1 class="title">
+<a name="api-index-2-49"></a>Index of new symbols in 2.49</h1></div></div></div>
+<a name="idx"></a><a name="idxM"></a><h3 class="title">M</h3>
+<dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleBundleRegisterFunc" title="GwyModuleBundleRegisterFunc ()">GwyModuleBundleRegisterFunc</a>, user_function in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleFailureInfo" title="GwyModuleFailureInfo">GwyModuleFailureInfo</a>, struct in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleRecord" title="struct GwyModuleRecord">GwyModuleRecord</a>, struct in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#GWY-MODULE-BUNDLE-FLAG:CAPS" title="GWY_MODULE_BUNDLE_FLAG">GWY_MODULE_BUNDLE_FLAG</a>, macro in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-failure-foreach" title="gwy_module_failure_foreach ()">gwy_module_failure_foreach</a>, function in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#GWY-MODULE-QUERY2:CAPS" title="GWY_MODULE_QUERY2()">GWY_MODULE_QUERY2</a>, macro in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.19</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/devel-docs/libgwymodule/html/api-index-all.html b/devel-docs/libgwymodule/html/api-index-all.html
index c38bae5..3a4bd2a 100644
--- a/devel-docs/libgwymodule/html/api-index-all.html
+++ b/devel-docs/libgwymodule/html/api-index-all.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of all symbols: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="prev" href="plugin-proxy-rgi.html" title="RGI Registration Method">
@@ -195,10 +195,18 @@
 <dd></dd>
 <a name="idxM"></a><h3 class="title">M</h3>
 <dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleBundleRegisterFunc" title="GwyModuleBundleRegisterFunc ()">GwyModuleBundleRegisterFunc</a>, user_function in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleError" title="enum GwyModuleError">GwyModuleError</a>, enum in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleFailureInfo" title="GwyModuleFailureInfo">GwyModuleFailureInfo</a>, struct in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwymodule-gwymodule-file.html#GwyModuleFileError" title="enum GwyModuleFileError">GwyModuleFileError</a>, enum in <a class="link" href="libgwymodule-gwymodule-file.html" title="gwymodule-file">gwymodule-file</a>
 </dt>
 <dd></dd>
@@ -211,6 +219,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleRecord" title="struct GwyModuleRecord">GwyModuleRecord</a>, struct in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleRegisterFunc" title="GwyModuleRegisterFunc ()">GwyModuleRegisterFunc</a>, user_function in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
 </dt>
 <dd></dd>
@@ -223,10 +235,30 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#GWY-MODULE-BUNDLE-FLAG:CAPS" title="GWY_MODULE_BUNDLE_FLAG">GWY_MODULE_BUNDLE_FLAG</a>, macro in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-disable-registration" title="gwy_module_disable_registration ()">gwy_module_disable_registration</a>, function in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-enable-registration" title="gwy_module_enable_registration ()">gwy_module_enable_registration</a>, function in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#GWY-MODULE-ERROR:CAPS" title="GWY_MODULE_ERROR">GWY_MODULE_ERROR</a>, macro in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-error-quark" title="gwy_module_error_quark ()">gwy_module_error_quark</a>, function in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-failure-foreach" title="gwy_module_failure_foreach ()">gwy_module_failure_foreach</a>, function in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwymodule-gwymodule-file.html#GWY-MODULE-FILE-ERROR:CAPS" title="GWY_MODULE_FILE_ERROR">GWY_MODULE_FILE_ERROR</a>, macro in <a class="link" href="libgwymodule-gwymodule-file.html" title="gwymodule-file">gwymodule-file</a>
 </dt>
 <dd></dd>
@@ -247,6 +279,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-is-enabled" title="gwy_module_is_enabled ()">gwy_module_is_enabled</a>, function in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-lookup" title="gwy_module_lookup ()">gwy_module_lookup</a>, function in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
 </dt>
 <dd></dd>
@@ -255,6 +291,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwymodule-gwymoduleloader.html#GWY-MODULE-QUERY2:CAPS" title="GWY_MODULE_QUERY2()">GWY_MODULE_QUERY2</a>, macro in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-register-module" title="gwy_module_register_module ()">gwy_module_register_module</a>, function in <a class="link" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">gwymoduleloader</a>
 </dt>
 <dd></dd>
diff --git a/devel-docs/libgwymodule/html/api-index-deprec.html b/devel-docs/libgwymodule/html/api-index-deprec.html
index e903d75..151d840 100644
--- a/devel-docs/libgwymodule/html/api-index-deprec.html
+++ b/devel-docs/libgwymodule/html/api-index-deprec.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of deprecated symbols: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="prev" href="api-index-all.html" title="Index of all symbols">
diff --git a/devel-docs/libgwymodule/html/gwymodule-tutorial-beyond.html b/devel-docs/libgwymodule/html/gwymodule-tutorial-beyond.html
index 0ef625f..22cbc79 100644
--- a/devel-docs/libgwymodule/html/gwymodule-tutorial-beyond.html
+++ b/devel-docs/libgwymodule/html/gwymodule-tutorial-beyond.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Beyond the Minimal Module: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleTutorial.html" title="Gwyddion Module Tutorial">
 <link rel="prev" href="gwymodule-tutorial-minimal.html" title="Minimal Module">
@@ -382,8 +382,8 @@
 </ul></div>
 <p>
       There is an extensive
-      <a class="ulink" href="http://gtk.org/tutorial/" target="_top">Gtk+ Tutorial</a>
-      and <a class="ulink" href="http://gtk.org/api/" target="_top">API Reference</a> available
+      <a class="ulink" href="https://developer.gnome.org/gtk-tutorial/stable/" target="_top">Gtk+ Tutorial</a>
+      and <a class="ulink" href="https://developer.gnome.org/gtk2/stable/" target="_top">API Reference</a> available
       on the Gtk+ Web site.  You can use existing modules as templates
       for your module.
     </p>
diff --git a/devel-docs/libgwymodule/html/gwymodule-tutorial-file.html b/devel-docs/libgwymodule/html/gwymodule-tutorial-file.html
index 3383fea..7428434 100644
--- a/devel-docs/libgwymodule/html/gwymodule-tutorial-file.html
+++ b/devel-docs/libgwymodule/html/gwymodule-tutorial-file.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>File Modules: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleTutorial.html" title="Gwyddion Module Tutorial">
 <link rel="prev" href="gwymodule-tutorial-process.html" title="Data Processing Modules">
@@ -45,7 +45,7 @@
       The sample file format our module will load looks as follows, all
       values are stored in little-endian:
       </p>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col>
 <col>
diff --git a/devel-docs/libgwymodule/html/gwymodule-tutorial-graph.html b/devel-docs/libgwymodule/html/gwymodule-tutorial-graph.html
index ba67a99..fb7021f 100644
--- a/devel-docs/libgwymodule/html/gwymodule-tutorial-graph.html
+++ b/devel-docs/libgwymodule/html/gwymodule-tutorial-graph.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Graph Modules: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleTutorial.html" title="Gwyddion Module Tutorial">
 <link rel="prev" href="gwymodule-tutorial-file.html" title="File Modules">
diff --git a/devel-docs/libgwymodule/html/gwymodule-tutorial-install.html b/devel-docs/libgwymodule/html/gwymodule-tutorial-install.html
index aca0955..860bcc9 100644
--- a/devel-docs/libgwymodule/html/gwymodule-tutorial-install.html
+++ b/devel-docs/libgwymodule/html/gwymodule-tutorial-install.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Gwyddion Module Installation: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleTutorial.html" title="Gwyddion Module Tutorial">
 <link rel="prev" href="gwymodule-tutorial-layer.html" title="Layer Modules">
@@ -34,7 +34,7 @@
 <a name="id-1.3.10.3"></a><h2>Overview</h2>
 <p>
       To be written. Meanwhile you can look at the
-      <a class="ulink" href="http://gwyddion.net/download.php#sample-module" target="_top">threshold-example</a>
+      <a class="ulink" href="http://gwyddion.net/apps/#sample-module" target="_top">threshold-example</a>
       module how it copes with this issues.
     </p>
 <p>
diff --git a/devel-docs/libgwymodule/html/gwymodule-tutorial-layer.html b/devel-docs/libgwymodule/html/gwymodule-tutorial-layer.html
index c1168e0..62253bd 100644
--- a/devel-docs/libgwymodule/html/gwymodule-tutorial-layer.html
+++ b/devel-docs/libgwymodule/html/gwymodule-tutorial-layer.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Layer Modules: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleTutorial.html" title="Gwyddion Module Tutorial">
 <link rel="prev" href="gwymodule-tutorial-tool.html" title="Tool Modules">
diff --git a/devel-docs/libgwymodule/html/gwymodule-tutorial-minimal.html b/devel-docs/libgwymodule/html/gwymodule-tutorial-minimal.html
index ef85adb..bee74fc 100644
--- a/devel-docs/libgwymodule/html/gwymodule-tutorial-minimal.html
+++ b/devel-docs/libgwymodule/html/gwymodule-tutorial-minimal.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Minimal Module: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleTutorial.html" title="Gwyddion Module Tutorial">
 <link rel="prev" href="gwymodule-tutorial-overview.html" title="Gwyddion Module Overview">
diff --git a/devel-docs/libgwymodule/html/gwymodule-tutorial-overview.html b/devel-docs/libgwymodule/html/gwymodule-tutorial-overview.html
index 2b4523c..d3458b0 100644
--- a/devel-docs/libgwymodule/html/gwymodule-tutorial-overview.html
+++ b/devel-docs/libgwymodule/html/gwymodule-tutorial-overview.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Gwyddion Module Overview: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleTutorial.html" title="Gwyddion Module Tutorial">
 <link rel="prev" href="ModuleTutorial.html" title="Gwyddion Module Tutorial">
diff --git a/devel-docs/libgwymodule/html/gwymodule-tutorial-process.html b/devel-docs/libgwymodule/html/gwymodule-tutorial-process.html
index 6300116..9166b0e 100644
--- a/devel-docs/libgwymodule/html/gwymodule-tutorial-process.html
+++ b/devel-docs/libgwymodule/html/gwymodule-tutorial-process.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Data Processing Modules: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleTutorial.html" title="Gwyddion Module Tutorial">
 <link rel="prev" href="gwymodule-tutorial-beyond.html" title="Beyond the Minimal Module">
diff --git a/devel-docs/libgwymodule/html/gwymodule-tutorial-tool.html b/devel-docs/libgwymodule/html/gwymodule-tutorial-tool.html
index 07cb6a1..faf9e67 100644
--- a/devel-docs/libgwymodule/html/gwymodule-tutorial-tool.html
+++ b/devel-docs/libgwymodule/html/gwymodule-tutorial-tool.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Tool Modules: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleTutorial.html" title="Gwyddion Module Tutorial">
 <link rel="prev" href="gwymodule-tutorial-graph.html" title="Graph Modules">
diff --git a/devel-docs/libgwymodule/html/index.html b/devel-docs/libgwymodule/html/index.html
index e9dc811..6cdd550 100644
--- a/devel-docs/libgwymodule/html/index.html
+++ b/devel-docs/libgwymodule/html/index.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Gwyddion Module Library Reference Manual: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="next" href="ModuleLibrary.html" title="Gwyddion Module Library">
 <meta name="generator" content="GTK-Doc V1.19 (XML mode)">
@@ -15,7 +15,7 @@
 <div>
 <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">Gwyddion Module Library Reference Manual</p></th></tr></table></div>
 <div><p class="releaseinfo">
-  For Gwyddion 2.47.
+  For Gwyddion 2.49.
   The latest version of this document can be found on-line at
   <a class="ulink" href="http://gwyddion.net/documentation/libgwymodule/index.php" target="_top">http://gwyddion.net/documentation/libgwymodule/</a>.
 </p></div>
@@ -143,6 +143,8 @@
 <dt><span class="index"><a href="api-index-2-36.html">Index of new symbols in 2.36</a></span></dt>
 <dt><span class="index"><a href="api-index-2-38.html">Index of new symbols in 2.38</a></span></dt>
 <dt><span class="index"><a href="api-index-2-45.html">Index of new symbols in 2.45</a></span></dt>
+<dt><span class="index"><a href="api-index-2-48.html">Index of new symbols in 2.48</a></span></dt>
+<dt><span class="index"><a href="api-index-2-49.html">Index of new symbols in 2.49</a></span></dt>
 </dl></div>
 </div>
 <div class="footer">
diff --git a/devel-docs/libgwymodule/html/libgwymodule-gwymodule-file.html b/devel-docs/libgwymodule/html/libgwymodule-gwymodule-file.html
index a6dbbf6..8c8cf91 100644
--- a/devel-docs/libgwymodule/html/libgwymodule-gwymodule-file.html
+++ b/devel-docs/libgwymodule/html/libgwymodule-gwymodule-file.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwymodule-file: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleLibrary.html" title="Gwyddion Module Library">
 <link rel="prev" href="libgwymodule-gwymoduleloader.html" title="gwymoduleloader">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwymodule-gwymodule-file.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -231,7 +231,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwymodule-gwymodule-file.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -284,7 +284,7 @@ operations: <a class="link" href="libgwymodule-gwymodule-file.html#GwyFileDetect
  it should not try to access the file.</p>
 <div class="refsect3">
 <a name="GwyFileDetectFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -328,7 +328,7 @@ description).</p>
 <p>The type of file loading function.</p>
 <div class="refsect3">
 <a name="GwyFileLoadFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -378,7 +378,7 @@ or <em class="parameter"><code>GWY_RUN_INTERACTIVE</code></em>
 <p>The type of file saving function.</p>
 <div class="refsect3">
 <a name="GwyFileSaveFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -443,7 +443,7 @@ vanish.  If they are constructed (non-constant) strings, do not free them.
 Should modules ever become unloadable they will get chance to clean-up.</p>
 <div class="refsect3">
 <a name="gwy-file-func-register.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -507,7 +507,7 @@ written) so its contents can't be used for file type detection.</p>
 simply want to detect a file type.</p>
 <div class="refsect3">
 <a name="gwy-file-func-run-detect.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -554,7 +554,7 @@ gwy_file_func_run_load (<em class="parameter"><code>const <a href="/usr/share/gt
 simply want to load a file.</p>
 <div class="refsect3">
 <a name="gwy-file-func-run-load.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -607,7 +607,7 @@ so the module function doesn't have to care about it.</p>
 simply want to save a file.</p>
 <div class="refsect3">
 <a name="gwy-file-func-run-save.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -665,7 +665,7 @@ so the module function doesn't have to care about it.</p>
 simply want to save a file.</p>
 <div class="refsect3">
 <a name="gwy-file-func-run-export.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -714,7 +714,7 @@ gwy_file_func_exists (<em class="parameter"><code>const <a href="/usr/share/gtk-
 <p>Checks whether a file type function exists.</p>
 <div class="refsect3">
 <a name="gwy-file-func-exists.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -741,7 +741,7 @@ gwy_file_func_get_operations (<em class="parameter"><code>const <a href="/usr/sh
 <p>Returns operations supported by a file type function.</p>
 <div class="refsect3">
 <a name="gwy-file-func-get-operations.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -770,7 +770,7 @@ gwy_file_func_get_description (<em class="parameter"><code>const <a href="/usr/s
  argument of <a class="link" href="libgwymodule-gwymodule-file.html#gwy-file-func-register" title="gwy_file_func_register ()"><code class="function">gwy_file_func_register()</code></a> .</p>
 <div class="refsect3">
 <a name="gwy-file-func-get-description.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -797,7 +797,7 @@ gwy_file_func_foreach (<em class="parameter"><code><a href="/usr/share/gtk-doc/h
 <p>Calls a function for each file function.</p>
 <div class="refsect3">
 <a name="gwy-file-func-foreach.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -848,7 +848,7 @@ gwy_file_detect (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/h
 <p>Detects the type of a file.</p>
 <div class="refsect3">
 <a name="gwy-file-detect.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -894,7 +894,7 @@ gwy_file_detect_with_score (<em class="parameter"><code>const <a href="/usr/shar
 <p>Detects the type of a file and gives the score.</p>
 <div class="refsect3">
 <a name="gwy-file-detect-with-score.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -944,7 +944,7 @@ gwy_file_load (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/htm
 <p>Loads a data file, autodetecting its type.</p>
 <div class="refsect3">
 <a name="gwy-file-load.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -986,7 +986,7 @@ gwy_file_load_with_func (<em class="parameter"><code>const <a href="/usr/share/g
 <p>Loads a data file, autodetecting its type.</p>
 <div class="refsect3">
 <a name="gwy-file-load-with-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1039,7 +1039,7 @@ gwy_file_save (<em class="parameter"><code><a href="../GwyContainer.html#GwyCont
 it does not succeed, it falls back to <a class="link" href="libgwymodule-gwymoduleenums.html#GWY-FILE-OPERATION-EXPORT:CAPS"><code class="literal">GWY_FILE_OPERATION_EXPORT</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-file-save.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1089,7 +1089,7 @@ gwy_file_save_with_func (<em class="parameter"><code><a href="../GwyContainer.ht
 it does not succeed, it falls back to <a class="link" href="libgwymodule-gwymoduleenums.html#GWY-FILE-OPERATION-EXPORT:CAPS"><code class="literal">GWY_FILE_OPERATION_EXPORT</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-file-save-with-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1149,7 +1149,7 @@ sense to let the user explicitly choose between these formats.  Hence,
 detectable formats normally are not explicitly offered.</p>
 <div class="refsect3">
 <a name="gwy-file-func-get-is-detectable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1182,7 +1182,7 @@ detect the format.  For instance, the fallback detection method of the
 Gwyddion rawfile module.</p>
 <div class="refsect3">
 <a name="gwy-file-func-set-is-detectable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1217,7 +1217,7 @@ gwy_file_get_data_info (<em class="parameter"><code><a href="../GwyContainer.htm
 File export does not set it.</p>
 <div class="refsect3">
 <a name="gwy-file-get-data-info.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1266,7 +1266,7 @@ gwy_file_get_filename_sys (<em class="parameter"><code><a href="../GwyContainer.
 File export does not set it.</p>
 <div class="refsect3">
 <a name="gwy-file-get-filename-sys.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1330,7 +1330,7 @@ high-level functions <a class="link" href="libgwymodule-gwymodule-file.html#gwy-
 can return it only when they are called with a wrong function name.</p>
 <div class="refsect3">
 <a name="GwyModuleFileError.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -1430,7 +1430,7 @@ last byte of <em class="parameter"><code>head</code></em>
 the file (or being a part of the file at all).</p>
 <div class="refsect3">
 <a name="GwyFileDetectInfo.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
diff --git a/devel-docs/libgwymodule/html/libgwymodule-gwymodule-graph.html b/devel-docs/libgwymodule/html/libgwymodule-gwymodule-graph.html
index 216529e..e4c6f61 100644
--- a/devel-docs/libgwymodule/html/libgwymodule-gwymodule-graph.html
+++ b/devel-docs/libgwymodule/html/libgwymodule-gwymodule-graph.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwymodule-graph: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleLibrary.html" title="Gwyddion Module Library">
 <link rel="prev" href="libgwymodule-gwymodule-tool.html" title="gwymodule-tool">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwymodule-gwymodule-graph.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -137,7 +137,7 @@
 <p>The type of graph function.</p>
 <div class="refsect3">
 <a name="GwyGraphFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -175,7 +175,7 @@ vanish.  If they are constructed (non-constant) strings, do not free them.
 Should modules ever become unloadable they will get chance to clean-up.</p>
 <div class="refsect3">
 <a name="gwy-graph-func-register.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -236,7 +236,7 @@ gwy_graph_func_run (<em class="parameter"><code>const <a href="/usr/share/gtk-do
 .</p>
 <div class="refsect3">
 <a name="gwy-graph-func-run.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -265,7 +265,7 @@ gwy_graph_func_exists (<em class="parameter"><code>const <a href="/usr/share/gtk
 <p>Checks whether a graph function exists.</p>
 <div class="refsect3">
 <a name="gwy-graph-func-exists.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -294,7 +294,7 @@ gwy_graph_func_get_menu_path (<em class="parameter"><code>const <a href="/usr/sh
 i.e., without any leading "/Graph".</p>
 <div class="refsect3">
 <a name="gwy-graph-func-get-menu-path.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -320,7 +320,7 @@ gwy_graph_func_get_stock_id (<em class="parameter"><code>const <a href="/usr/sha
 <p>Gets stock icon id of a graph function.</p>
 <div class="refsect3">
 <a name="gwy-graph-func-get-stock-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -346,7 +346,7 @@ gwy_graph_func_get_tooltip (<em class="parameter"><code>const <a href="/usr/shar
 <p>Gets tooltip for a graph function.</p>
 <div class="refsect3">
 <a name="gwy-graph-func-get-tooltip.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -372,7 +372,7 @@ gwy_graph_func_get_sensitivity_mask (<em class="parameter"><code>const <a href="
 <p>Gets menu sensititivy mask for a graph function.</p>
 <div class="refsect3">
 <a name="gwy-graph-func-get-sensitivity-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -400,7 +400,7 @@ gwy_graph_func_foreach (<em class="parameter"><code><a href="/usr/share/gtk-doc/
 <p>Calls a function for each graph function.</p>
 <div class="refsect3">
 <a name="gwy-graph-func-foreach.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwymodule/html/libgwymodule-gwymodule-layer.html b/devel-docs/libgwymodule/html/libgwymodule-gwymodule-layer.html
index 574cbf6..0216d42 100644
--- a/devel-docs/libgwymodule/html/libgwymodule-gwymodule-layer.html
+++ b/devel-docs/libgwymodule/html/libgwymodule-gwymodule-layer.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwymodule-layer: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleLibrary.html" title="Gwyddion Module Library">
 <link rel="prev" href="libgwymodule-gwymodule-graph.html" title="gwymodule-graph">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwymodule-gwymodule-layer.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -77,7 +77,7 @@ gwy_layer_func_register (<em class="parameter"><code><a href="http://developer.g
 <p>Registeres a layer function (layer type).</p>
 <div class="refsect3">
 <a name="gwy-layer-func-register.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -105,7 +105,7 @@ gwy_layer_func_foreach (<em class="parameter"><code><a href="http://developer.gn
 <p>Calls a function for each layer function.</p>
 <div class="refsect3">
 <a name="gwy-layer-func-foreach.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwymodule/html/libgwymodule-gwymodule-process.html b/devel-docs/libgwymodule/html/libgwymodule-gwymodule-process.html
index 57d4615..91b75d5 100644
--- a/devel-docs/libgwymodule/html/libgwymodule-gwymodule-process.html
+++ b/devel-docs/libgwymodule/html/libgwymodule-gwymodule-process.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwymodule-process: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleLibrary.html" title="Gwyddion Module Library">
 <link rel="prev" href="libgwymodule-gwymodule-file.html" title="gwymodule-file">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwymodule-gwymodule-process.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -148,7 +148,7 @@ and either modify it or create a new data from it.</p>
 <p>The type of data processing function.</p>
 <div class="refsect3">
 <a name="GwyProcessFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -192,7 +192,7 @@ vanish.  If they are constructed (non-constant) strings, do not free them.
 Should modules ever become unloadable they will get a chance to clean-up.</p>
 <div class="refsect3">
 <a name="gwy-process-func-register.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -261,7 +261,7 @@ gwy_process_func_run (<em class="parameter"><code>const <a href="/usr/share/gtk-
 .</p>
 <div class="refsect3">
 <a name="gwy-process-func-run.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -295,7 +295,7 @@ gwy_process_func_exists (<em class="parameter"><code>const <a href="/usr/share/g
 <p>Checks whether a data processing function exists.</p>
 <div class="refsect3">
 <a name="gwy-process-func-exists.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -322,7 +322,7 @@ gwy_process_func_get_run_types (<em class="parameter"><code>const <a href="/usr/
 <p>Returns run modes supported by a data processing function.</p>
 <div class="refsect3">
 <a name="gwy-process-func-get-run-types.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -350,7 +350,7 @@ gwy_process_func_get_menu_path (<em class="parameter"><code>const <a href="/usr/
 i.e., without any leading "/Data Process".</p>
 <div class="refsect3">
 <a name="gwy-process-func-get-menu-path.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -376,7 +376,7 @@ gwy_process_func_get_stock_id (<em class="parameter"><code>const <a href="/usr/s
 <p>Gets stock icon id of a data processing  function.</p>
 <div class="refsect3">
 <a name="gwy-process-func-get-stock-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -402,7 +402,7 @@ gwy_process_func_get_tooltip (<em class="parameter"><code>const <a href="/usr/sh
 <p>Gets tooltip for a data processing function.</p>
 <div class="refsect3">
 <a name="gwy-process-func-get-tooltip.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -428,7 +428,7 @@ gwy_process_func_get_sensitivity_mask (<em class="parameter"><code>const <a href
 <p>Gets menu sensititivy mask for a data processing function.</p>
 <div class="refsect3">
 <a name="gwy-process-func-get-sensitivity-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -456,7 +456,7 @@ gwy_process_func_foreach (<em class="parameter"><code><a href="/usr/share/gtk-do
 <p>Calls a function for each process function.</p>
 <div class="refsect3">
 <a name="gwy-process-func-foreach.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwymodule/html/libgwymodule-gwymodule-tool.html b/devel-docs/libgwymodule/html/libgwymodule-gwymodule-tool.html
index 4f84b95..b04bb6b 100644
--- a/devel-docs/libgwymodule/html/libgwymodule-gwymodule-tool.html
+++ b/devel-docs/libgwymodule/html/libgwymodule-gwymodule-tool.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwymodule-tool: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleLibrary.html" title="Gwyddion Module Library">
 <link rel="prev" href="libgwymodule-gwymodule-process.html" title="gwymodule-process">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwymodule-gwymodule-tool.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -77,7 +77,7 @@ gwy_tool_func_register (<em class="parameter"><code><a href="http://developer.gn
 <p>Registeres a tool function (tool type).</p>
 <div class="refsect3">
 <a name="gwy-tool-func-register.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -105,7 +105,7 @@ gwy_tool_func_foreach (<em class="parameter"><code><a href="http://developer.gno
 <p>Calls a function for each tool function.</p>
 <div class="refsect3">
 <a name="gwy-tool-func-foreach.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwymodule/html/libgwymodule-gwymodule-volume.html b/devel-docs/libgwymodule/html/libgwymodule-gwymodule-volume.html
index 81675ef..7fde1e0 100644
--- a/devel-docs/libgwymodule/html/libgwymodule-gwymodule-volume.html
+++ b/devel-docs/libgwymodule/html/libgwymodule-gwymodule-volume.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwymodule-volume: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleLibrary.html" title="Gwyddion Module Library">
 <link rel="prev" href="libgwymodule-gwymodule-layer.html" title="gwymodule-layer">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwymodule-gwymodule-volume.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -151,7 +151,7 @@ processing functions but they live in separate menus, toolbars, etc.</p>
 <p>The type of volume data processing function.</p>
 <div class="refsect3">
 <a name="GwyVolumeFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -196,7 +196,7 @@ vanish.  If they are constructed (non-constant) strings, do not free them.
 Should modules ever become unloadable they will get a chance to clean-up.</p>
 <div class="refsect3">
 <a name="gwy-volume-func-register.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -266,7 +266,7 @@ gwy_volume_func_run (<em class="parameter"><code>const <a href="/usr/share/gtk-d
 .</p>
 <div class="refsect3">
 <a name="gwy-volume-func-run.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -301,7 +301,7 @@ gwy_volume_func_exists (<em class="parameter"><code>const <a href="/usr/share/gt
 <p>Checks whether a volume data processing function exists.</p>
 <div class="refsect3">
 <a name="gwy-volume-func-exists.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -329,7 +329,7 @@ gwy_volume_func_get_run_types (<em class="parameter"><code>const <a href="/usr/s
 <p>Returns run modes supported by a volume data processing function.</p>
 <div class="refsect3">
 <a name="gwy-volume-func-get-run-types.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -358,7 +358,7 @@ gwy_volume_func_get_menu_path (<em class="parameter"><code>const <a href="/usr/s
 i.e., without any leading "/Volume Data".</p>
 <div class="refsect3">
 <a name="gwy-volume-func-get-menu-path.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -385,7 +385,7 @@ gwy_volume_func_get_stock_id (<em class="parameter"><code>const <a href="/usr/sh
 <p>Gets stock icon id of a volume data processing  function.</p>
 <div class="refsect3">
 <a name="gwy-volume-func-get-stock-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -412,7 +412,7 @@ gwy_volume_func_get_tooltip (<em class="parameter"><code>const <a href="/usr/sha
 <p>Gets tooltip for a volume data processing function.</p>
 <div class="refsect3">
 <a name="gwy-volume-func-get-tooltip.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -439,7 +439,7 @@ gwy_volume_func_get_sensitivity_mask (<em class="parameter"><code>const <a href=
 <p>Gets menu sensititivy mask for a volume data processing function.</p>
 <div class="refsect3">
 <a name="gwy-volume-func-get-sensitivity-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -468,7 +468,7 @@ gwy_volume_func_foreach (<em class="parameter"><code><a href="/usr/share/gtk-doc
 <p>Calls a function for each volume function.</p>
 <div class="refsect3">
 <a name="gwy-volume-func-foreach.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwymodule/html/libgwymodule-gwymodule-xyz.html b/devel-docs/libgwymodule/html/libgwymodule-gwymodule-xyz.html
index 2feb056..71bc403 100644
--- a/devel-docs/libgwymodule/html/libgwymodule-gwymodule-xyz.html
+++ b/devel-docs/libgwymodule/html/libgwymodule-gwymodule-xyz.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwymodule-xyz: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleLibrary.html" title="Gwyddion Module Library">
 <link rel="prev" href="libgwymodule-gwymodule-volume.html" title="gwymodule-volume">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwymodule-gwymodule-xyz.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -145,7 +145,7 @@
 <p>The type of surface data processing function.</p>
 <div class="refsect3">
 <a name="GwyXYZFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -190,7 +190,7 @@ vanish.  If they are constructed (non-constant) strings, do not free them.
 Should modules ever become unloadable they will get a chance to clean-up.</p>
 <div class="refsect3">
 <a name="gwy-xyz-func-register.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -260,7 +260,7 @@ gwy_xyz_func_run (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/
 .</p>
 <div class="refsect3">
 <a name="gwy-xyz-func-run.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -295,7 +295,7 @@ gwy_xyz_func_exists (<em class="parameter"><code>const <a href="/usr/share/gtk-d
 <p>Checks whether a surface data processing function exists.</p>
 <div class="refsect3">
 <a name="gwy-xyz-func-exists.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -323,7 +323,7 @@ gwy_xyz_func_get_run_types (<em class="parameter"><code>const <a href="/usr/shar
 <p>Returns run modes supported by a surface data processing function.</p>
 <div class="refsect3">
 <a name="gwy-xyz-func-get-run-types.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -352,7 +352,7 @@ gwy_xyz_func_get_menu_path (<em class="parameter"><code>const <a href="/usr/shar
 i.e., without any leading "/XYZ Data".</p>
 <div class="refsect3">
 <a name="gwy-xyz-func-get-menu-path.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -379,7 +379,7 @@ gwy_xyz_func_get_stock_id (<em class="parameter"><code>const <a href="/usr/share
 <p>Gets stock icon id of a surface data processing  function.</p>
 <div class="refsect3">
 <a name="gwy-xyz-func-get-stock-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -406,7 +406,7 @@ gwy_xyz_func_get_tooltip (<em class="parameter"><code>const <a href="/usr/share/
 <p>Gets tooltip for a surface data processing function.</p>
 <div class="refsect3">
 <a name="gwy-xyz-func-get-tooltip.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -433,7 +433,7 @@ gwy_xyz_func_get_sensitivity_mask (<em class="parameter"><code>const <a href="/u
 <p>Gets menu sensititivy mask for a surface data processing function.</p>
 <div class="refsect3">
 <a name="gwy-xyz-func-get-sensitivity-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -462,7 +462,7 @@ gwy_xyz_func_foreach (<em class="parameter"><code><a href="/usr/share/gtk-doc/ht
 <p>Calls a function for each surface function.</p>
 <div class="refsect3">
 <a name="gwy-xyz-func-foreach.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwymodule/html/libgwymodule-gwymodulebrowser.html b/devel-docs/libgwymodule/html/libgwymodule-gwymodulebrowser.html
index b4357d0..ba2b1d0 100644
--- a/devel-docs/libgwymodule/html/libgwymodule-gwymodulebrowser.html
+++ b/devel-docs/libgwymodule/html/libgwymodule-gwymodulebrowser.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwymodulebrowser: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleLibrary.html" title="Gwyddion Module Library">
 <link rel="prev" href="libgwymodule-gwymodule-xyz.html" title="gwymodule-xyz">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwymodule-gwymodulebrowser.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
diff --git a/devel-docs/libgwymodule/html/libgwymodule-gwymoduleenums.html b/devel-docs/libgwymodule/html/libgwymodule-gwymoduleenums.html
index 1f65f5a..af42ded 100644
--- a/devel-docs/libgwymodule/html/libgwymodule-gwymoduleenums.html
+++ b/devel-docs/libgwymodule/html/libgwymodule-gwymoduleenums.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwymoduleenums: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleLibrary.html" title="Gwyddion Module Library">
 <link rel="prev" href="ModuleLibrary.html" title="Gwyddion Module Library">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwymodule-gwymoduleenums.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -78,7 +78,7 @@ Generally only native file format module implements
 <a class="link" href="libgwymodule-gwymoduleenums.html#GWY-FILE-OPERATION-SAVE:CAPS"><code class="literal">GWY_FILE_OPERATION_SAVE</code></a>, all others implement <a class="link" href="libgwymodule-gwymoduleenums.html#GWY-FILE-OPERATION-EXPORT:CAPS"><code class="literal">GWY_FILE_OPERATION_EXPORT</code></a>.</p>
 <div class="refsect3">
 <a name="GwyFileOperationType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -130,7 +130,7 @@ Generally only native file format module implements
 <div class="warning"><p><code class="literal">GwyToolSwitchEvent</code> is deprecated and should not be used in newly-written code.</p></div>
 <div class="refsect3">
 <a name="GwyToolSwitchEvent.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -163,7 +163,7 @@ process functions is <em class="parameter"><code>GWY_RUN_IMMEDIATE</code></em>
 .</p>
 <div class="refsect3">
 <a name="GwyRunType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwymodule/html/libgwymodule-gwymoduleloader.html b/devel-docs/libgwymodule/html/libgwymodule-gwymoduleloader.html
index 832c7a1..5d79419 100644
--- a/devel-docs/libgwymodule/html/libgwymodule-gwymoduleloader.html
+++ b/devel-docs/libgwymodule/html/libgwymodule-gwymoduleloader.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwymoduleloader: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="ModuleLibrary.html" title="Gwyddion Module Library">
 <link rel="prev" href="libgwymodule-gwymoduleenums.html" title="gwymoduleenums">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwymodule-gwymoduleloader.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -46,6 +46,12 @@
 </td>
 </tr>
 <tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
+<a class="link" href="libgwymodule-gwymoduleloader.html#GWY-MODULE-QUERY2:CAPS" title="GWY_MODULE_QUERY2()">GWY_MODULE_QUERY2</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
 <td class="function_type">
 <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
 </td>
@@ -62,6 +68,13 @@
 </td>
 </tr>
 <tr>
+<td class="function_type">const <a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleRecord" title="struct GwyModuleRecord"><span class="returnvalue">GwyModuleRecord</span></a> *
+</td>
+<td class="function_name">
+<span class="c_punctuation">(</span><a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleBundleRegisterFunc" title="GwyModuleBundleRegisterFunc ()">*GwyModuleBundleRegisterFunc</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
 <td class="function_type">
 <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a>
 </td>
@@ -108,18 +121,50 @@
 </td>
 </tr>
 <tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-failure-foreach" title="gwy_module_failure_foreach ()">gwy_module_failure_foreach</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
 <td class="function_type">const <a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleInfo" title="struct GwyModuleInfo"><span class="returnvalue">GwyModuleInfo</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-register-module" title="gwy_module_register_module ()">gwy_module_register_module</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-disable-registration" title="gwy_module_disable_registration ()">gwy_module_disable_registration</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-enable-registration" title="gwy_module_enable_registration ()">gwy_module_enable_registration</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-is-enabled" title="gwy_module_is_enabled ()">gwy_module_is_enabled</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
 </tbody>
 </table></div>
 </div>
 <div class="refsect1">
 <a name="libgwymodule-gwymoduleloader.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -130,13 +175,29 @@
 <td class="function_name"><a class="link" href="libgwymodule-gwymoduleloader.html#GWY-MODULE-ABI-VERSION:CAPS" title="GWY_MODULE_ABI_VERSION">GWY_MODULE_ABI_VERSION</a></td>
 </tr>
 <tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwymodule-gwymoduleloader.html#GWY-MODULE-BUNDLE-FLAG:CAPS" title="GWY_MODULE_BUNDLE_FLAG">GWY_MODULE_BUNDLE_FLAG</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libgwymodule-gwymoduleloader.html#GWY-MODULE-ERROR:CAPS" title="GWY_MODULE_ERROR">GWY_MODULE_ERROR</a></td>
+</tr>
+<tr>
 <td class="datatype_keyword">enum</td>
 <td class="function_name"><a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleError" title="enum GwyModuleError">GwyModuleError</a></td>
 </tr>
 <tr>
 <td class="datatype_keyword">struct</td>
+<td class="function_name"><a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleRecord" title="struct GwyModuleRecord">GwyModuleRecord</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">struct</td>
 <td class="function_name"><a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleInfo" title="struct GwyModuleInfo">GwyModuleInfo</a></td>
 </tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleFailureInfo" title="GwyModuleFailureInfo">GwyModuleFailureInfo</a></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -155,7 +216,7 @@
 <pre class="programlisting">#define             GWY_MODULE_QUERY(mod_info)</pre>
 <p>The module query must be the ONLY exported symbol from a module.</p>
 <p>This macro does The Right Thing necessary to export module info in a way
-Gwyddion understands it. Put <a class="link" href="libgwymodule-gwymoduleloader.html#GWY-MODULE-QUERY:CAPS" title="GWY_MODULE_QUERY()"><span class="type">GWY_MODULE_QUERY</span></a> with the module info
+Gwyddion understands it. Put <a class="link" href="libgwymodule-gwymoduleloader.html#GWY-MODULE-QUERY:CAPS" title="GWY_MODULE_QUERY()"><code class="literal">GWY_MODULE_QUERY</code></a> with the module info
 (<a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleInfo" title="struct GwyModuleInfo"><span class="type">GwyModuleInfo</span></a>) of your module as its argument on a line (with NO
 semicolon after).</p>
 <p>If you write a module in C++ note the module query must have C linkage.
@@ -181,7 +242,7 @@ This has to be done manually in versions up to 2.24; since version 2.25
 it is compiled using a C++ compiler.</p>
 <div class="refsect3">
 <a name="GWY-MODULE-QUERY.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -197,18 +258,65 @@ it is compiled using a C++ compiler.</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="GWY-MODULE-QUERY2:CAPS"></a><h3>GWY_MODULE_QUERY2()</h3>
+<pre class="programlisting">#define             GWY_MODULE_QUERY2(mod_info,mod_name)</pre>
+<p>The module query must be the ONLY exported symbol from a module.</p>
+<p>See <a class="link" href="libgwymodule-gwymoduleloader.html#GWY-MODULE-QUERY:CAPS" title="GWY_MODULE_QUERY()"><code class="literal">GWY_MODULE_QUERY</code></a> for discussion.</p>
+<p>This macro is intended for modules that can be bundled together to one big
+shared library for time and space optimization.  This mostly makes sense
+only for modules included in Gwyddion itself as it contains hundreds of
+modules.</p>
+<p>However, it safe to use in third party modules because if modules
+are not bundled the macro behaves exactly as <a class="link" href="libgwymodule-gwymoduleloader.html#GWY-MODULE-QUERY:CAPS" title="GWY_MODULE_QUERY()"><code class="literal">GWY_MODULE_QUERY</code></a> and the
+<em class="parameter"><code>mod_name</code></em>
+ argument is just ignored.  The macro expansion differs only when
+<code class="literal">GWY_MODULE_BUNDLING</code> is defined when including the "gwymoduleloader.h"
+header.</p>
+<div class="refsect3">
+<a name="GWY-MODULE-QUERY2.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>mod_info</p></td>
+<td class="parameter_description"><p>The <a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleInfo" title="struct GwyModuleInfo"><span class="type">GwyModuleInfo</span></a> structure to return as module info.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>mod_name</p></td>
+<td class="parameter_description"><p>Module name.  It should be identical to the file name the module
+would have if installed standalone, without any extension.
+For instance module implemented in "nt-mdt.c" and installed as
+"nt-mdt.so" or "nt-mdt.dll" (or with other extension, depending
+on the platform) should pass "nt-mdt".</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GwyModuleRegisterFunc"></a><h3>GwyModuleRegisterFunc ()</h3>
 <pre class="programlisting"><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
 <span class="c_punctuation">(</span>*GwyModuleRegisterFunc<span class="c_punctuation">)</span> (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <p>Module registration function type.</p>
 <p>It actually runs particular featrue registration functions, like
 <a class="link" href="libgwymodule-gwymodule-file.html#gwy-file-func-register" title="gwy_file_func_register ()"><code class="function">gwy_file_func_register()</code></a> and <a class="link" href="libgwymodule-gwymodule-process.html#gwy-process-func-register" title="gwy_process_func_register ()"><code class="function">gwy_process_func_register()</code></a>.</p>
+<p>If the module has a complex initialisation it may be safer to simply not
+register any function but return <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> even if it fails to set up itself
+correctly.  The module feature unregistration is somewhat crude and,
+generally, unregisteration may lead to disaster when shared library
+unloading has unexpected side effects.</p>
 <div class="refsect3">
 <a name="GwyModuleRegisterFunc.returns"></a><h4>Returns</h4>
 <p> Whether the registration succeeded.  When it returns <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>, the
-module and its features are unloaded (FIXME: maybe. Currenly only
-module is unloaded, features are NOT unregistered, this can lead
-to all kinds of disasters).</p>
+module and its features are unregistered.</p>
 </div>
 </div>
 <hr>
@@ -227,11 +335,21 @@ the module.</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="GwyModuleBundleRegisterFunc"></a><h3>GwyModuleBundleRegisterFunc ()</h3>
+<pre class="programlisting">const <a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleRecord" title="struct GwyModuleRecord"><span class="returnvalue">GwyModuleRecord</span></a> *
+<span class="c_punctuation">(</span>*GwyModuleBundleRegisterFunc<span class="c_punctuation">)</span> (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Module bundle query function type.</p>
+<p>It returns an array of module records for all modules in the bundle,
+terminated by {<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>}.</p>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-module-error-quark"></a><h3>gwy_module_error_quark ()</h3>
 <pre class="programlisting"><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a>
 gwy_module_error_quark (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <p>Returns error domain for module loading.</p>
-<p>See and use <code class="literal">GWY_MODULE_ERROR</code>.</p>
+<p>See and use <a class="link" href="libgwymodule-gwymoduleloader.html#GWY-MODULE-ERROR:CAPS" title="GWY_MODULE_ERROR"><code class="literal">GWY_MODULE_ERROR</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-module-error-quark.returns"></a><h4>Returns</h4>
 <p> The error domain.</p>
@@ -246,9 +364,11 @@ gwy_module_register_modules (<em class="parameter"><code>const <a href="http://d
 <p>It can be called several times (on different directories).  No errors are
 reported, register modules individually with <a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-register-module" title="gwy_module_register_module ()"><code class="function">gwy_module_register_module()</code></a>
 to get registration errors.</p>
+<p>If you need to prevent specific modules from loading use
+<a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-disable-registration" title="gwy_module_disable_registration ()"><code class="function">gwy_module_disable_registration()</code></a> beforehand.</p>
 <div class="refsect3">
 <a name="gwy-module-register-modules.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -270,7 +390,7 @@ gwy_module_lookup (<em class="parameter"><code>const <a href="http://developer.g
 <p>Returns information about one module.</p>
 <div class="refsect3">
 <a name="gwy-module-lookup.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -293,11 +413,11 @@ constant and never modified or freed.</p>
 <div class="refsect2">
 <a name="gwy-module-get-filename"></a><h3>gwy_module_get_filename ()</h3>
 <pre class="programlisting">const <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
-gwy_module_get_filename (<em class="parameter"><code>const <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
+gwy_module_get_filename (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
 <p>Returns full file name of a module.</p>
 <div class="refsect3">
 <a name="gwy-module-get-filename.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -318,12 +438,12 @@ gwy_module_get_filename (<em class="parameter"><code>const <a href="http://devel
 <hr>
 <div class="refsect2">
 <a name="gwy-module-get-functions"></a><h3>gwy_module_get_functions ()</h3>
-<pre class="programlisting"><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Singly-Linked-Lists.html#GSList"><span class="returnvalue">GSList</span></a> *
-gwy_module_get_functions (<em class="parameter"><code>const <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Singly-Linked-Lists.html#GSList"><span class="returnvalue">GSList</span></a> *
+gwy_module_get_functions (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
 <p>Returns list of names of functions a module implements.</p>
 <div class="refsect3">
 <a name="gwy-module-get-functions.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -338,7 +458,7 @@ gwy_module_get_functions (<em class="parameter"><code>const <a href="http://deve
 </div>
 <div class="refsect3">
 <a name="gwy-module-get-functions.returns"></a><h4>Returns</h4>
-<p> List of module function names, as a <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Singly-Linked-Lists.html#GSList"><span class="type">GSList</span></a> that is owned by
+<p> List of module function names, as a <a href="/usr/share/gtk-doc/html/glibglib-Singly-Linked-Lists.html#GSList"><span class="type">GSList</span></a> that is owned by
 module loader and must not be modified or freed.</p>
 </div>
 </div>
@@ -354,7 +474,7 @@ gwy_module_foreach (<em class="parameter"><code><a href="/usr/share/gtk-doc/html
 info (<a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleInfo" title="struct GwyModuleInfo"><span class="type">GwyModuleInfo</span></a>) as the value.  Neither should be modified.</p>
 <div class="refsect3">
 <a name="gwy-module-foreach.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -377,14 +497,50 @@ info (<a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleInfo" tit
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-module-failure-foreach"></a><h3>gwy_module_failure_foreach ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_module_failure_foreach (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Doubly-Linked-Lists.html#GFunc"><span class="type">GFunc</span></a> function</code></em>,
+                            <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>);</pre>
+<p>Runs <em class="parameter"><code>function</code></em>
+ for each module that failed to register.</p>
+<p>It passes the failure info (<a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleFailureInfo" title="GwyModuleFailureInfo"><span class="type">GwyModuleFailureInfo</span></a>) as the data argument.
+It should be modified.</p>
+<div class="refsect3">
+<a name="gwy-module-failure-foreach.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>function</p></td>
+<td class="parameter_description"><p>A <a href="/usr/share/gtk-doc/html/glibglib-Doubly-Linked-Lists.html#GFunc"><span class="type">GFunc</span></a> run for each module registration failure.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>data</p></td>
+<td class="parameter_description"><p>User data.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-module-register-module"></a><h3>gwy_module_register_module ()</h3>
 <pre class="programlisting">const <a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleInfo" title="struct GwyModuleInfo"><span class="returnvalue">GwyModuleInfo</span></a> *
 gwy_module_register_module (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
 <p>Loads a single module.</p>
+<p>This function also works with bundles.  The returned module info is for the
+bundle and thus not of much use.</p>
 <div class="refsect3">
 <a name="gwy-module-register-module.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -410,6 +566,94 @@ gwy_module_register_module (<em class="parameter"><code>const <a href="/usr/shar
 <p> Module info on success, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> on failure.</p>
 </div>
 </div>
+<hr>
+<div class="refsect2">
+<a name="gwy-module-disable-registration"></a><h3>gwy_module_disable_registration ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_module_disable_registration (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
+<p>Prevents the registration of a module of given name.</p>
+<p>This function blocks future module registration using
+<a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-register-modules" title="gwy_module_register_modules ()"><code class="function">gwy_module_register_modules()</code></a>.  Already loaded modules are unaffected.
+The low-level module loading function <a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-register-module" title="gwy_module_register_module ()"><code class="function">gwy_module_register_module()</code></a> always
+attempts to load the module, even if blocked.</p>
+<div class="refsect3">
+<a name="gwy-module-disable-registration.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>name</p></td>
+<td class="parameter_description"><p>A module name.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-module-enable-registration"></a><h3>gwy_module_enable_registration ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_module_enable_registration (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
+<p>Unblocks the registration of a module of given name.</p>
+<p>This function influences future module registration.  Already loaded modules
+are unaffected.</p>
+<div class="refsect3">
+<a name="gwy-module-enable-registration.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>name</p></td>
+<td class="parameter_description"><p>A module name.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-module-is-enabled"></a><h3>gwy_module_is_enabled ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gwy_module_is_enabled (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
+<p>Reports whether the registration of a module is enabled.</p>
+<p>If the registration of module <em class="parameter"><code>name</code></em>
+ was prevented using
+<a class="link" href="libgwymodule-gwymoduleloader.html#gwy-module-disable-registration" title="gwy_module_disable_registration ()"><code class="function">gwy_module_disable_registration()</code></a> and not subsequently re-enabled
+using <code class="function">gwy_module_enabled_registration()</code> this function returns <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.</p>
+<p>The reported values only represents the current state of blocking.  A module
+<em class="parameter"><code>name</code></em>
+ could have been loaded when it was not blocked.</p>
+<div class="refsect3">
+<a name="gwy-module-is-enabled.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>name</p></td>
+<td class="parameter_description"><p>A module name.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-module-is-enabled.returns"></a><h4>Returns</h4>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if module <em class="parameter"><code>name</code></em>
+can be registered; <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> when it is blocked
+from registration.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
 </div>
 <div class="refsect1">
 <a name="libgwymodule-gwymoduleloader.other_details"></a><h2>Types and Values</h2>
@@ -423,11 +667,25 @@ gwy_module_register_module (<em class="parameter"><code>const <a href="/usr/shar
 </div>
 <hr>
 <div class="refsect2">
+<a name="GWY-MODULE-BUNDLE-FLAG:CAPS"></a><h3>GWY_MODULE_BUNDLE_FLAG</h3>
+<pre class="programlisting">#define GWY_MODULE_BUNDLE_FLAG 256u
+</pre>
+<p>Value to bitwise combine with <a class="link" href="libgwymodule-gwymoduleloader.html#GWY-MODULE-ABI-VERSION:CAPS" title="GWY_MODULE_ABI_VERSION"><code class="literal">GWY_MODULE_ABI_VERSION</code></a> to indicate a bundle.</p>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GWY-MODULE-ERROR:CAPS"></a><h3>GWY_MODULE_ERROR</h3>
+<pre class="programlisting">#define GWY_MODULE_ERROR gwy_module_error_quark()
+</pre>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GwyModuleError"></a><h3>enum GwyModuleError</h3>
 <p>Type of module loading and registration error.</p>
 <div class="refsect3">
 <a name="GwyModuleError.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -490,12 +748,52 @@ gwy_module_register_module (<em class="parameter"><code>const <a href="/usr/shar
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
+<tr>
+<td class="enum_member_name"><p><a name="GWY-MODULE-ERROR-NESTING:CAPS"></a>GWY_MODULE_ERROR_NESTING</p></td>
+<td class="enum_member_description">
+<p>Nested module bundle found.  (Since 2.49)</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
 </tbody>
 </table></div>
 </div>
 </div>
 <hr>
 <div class="refsect2">
+<a name="GwyModuleRecord"></a><h3>struct GwyModuleRecord</h3>
+<pre class="programlisting">struct GwyModuleRecord {
+    GwyModuleQueryFunc query;
+    const gchar *name;
+};
+</pre>
+<p>Module record returned by bundle query function.</p>
+<div class="refsect3">
+<a name="GwyModuleRecord.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="struct_members_name">
+<col class="struct_members_description">
+<col width="200px" class="struct_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="libgwymodule-gwymoduleloader.html#GwyModuleQueryFunc" title="GwyModuleQueryFunc ()"><span class="type">GwyModuleQueryFunc</span></a> <em class="structfield"><code><a name="GwyModuleRecord.query"></a>query</code></em>;</p></td>
+<td class="struct_member_description"><p>Module query function.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GwyModuleRecord.name"></a>name</code></em>;</p></td>
+<td class="struct_member_description"><p>Module name (base file name without extensions).</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GwyModuleInfo"></a><h3>struct GwyModuleInfo</h3>
 <pre class="programlisting">struct GwyModuleInfo {
     guint32 abi_version;
@@ -510,7 +808,7 @@ gwy_module_register_module (<em class="parameter"><code>const <a href="/usr/shar
 <p>Module information returned by <a class="link" href="libgwymodule-gwymoduleloader.html#GWY-MODULE-QUERY:CAPS" title="GWY_MODULE_QUERY()"><code class="function">GWY_MODULE_QUERY()</code></a>.</p>
 <div class="refsect3">
 <a name="GwyModuleInfo.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
@@ -559,6 +857,57 @@ features).</p></td>
 </table></div>
 </div>
 </div>
+<hr>
+<div class="refsect2">
+<a name="GwyModuleFailureInfo"></a><h3>GwyModuleFailureInfo</h3>
+<pre class="programlisting">typedef struct {
+    const gchar *filename;
+    const gchar *modname;
+    const gchar *err_message;
+    gint err_domain;
+    gint err_code;
+} GwyModuleFailureInfo;
+</pre>
+<p>Information about a failed module registration.</p>
+<div class="refsect3">
+<a name="GwyModuleFailureInfo.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="struct_members_name">
+<col class="struct_members_description">
+<col width="200px" class="struct_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="struct_member_name"><p>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GwyModuleFailureInfo.filename"></a>filename</code></em>;</p></td>
+<td class="struct_member_description"><p>Name of the file the module was loaded from.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GwyModuleFailureInfo.modname"></a>modname</code></em>;</p></td>
+<td class="struct_member_description"><p>Module name (can be <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> and contain odd bytes).</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GwyModuleFailureInfo.err-message"></a>err_message</code></em>;</p></td>
+<td class="struct_member_description"><p>Error message from the failed module registration.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GwyModuleFailureInfo.err-domain"></a>err_domain</code></em>;</p></td>
+<td class="struct_member_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Error-Reporting.html#GError"><span class="type">GError</span></a> domain from the failed module registration.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GwyModuleFailureInfo.err-code"></a>err_code</code></em>;</p></td>
+<td class="struct_member_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Error-Reporting.html#GError"><span class="type">GError</span></a> code from the failed module registration.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
 </div>
 </div>
 <div class="footer">
diff --git a/devel-docs/libgwymodule/html/libgwymodule.devhelp2 b/devel-docs/libgwymodule/html/libgwymodule.devhelp2
index 72d001c..71298bf 100644
--- a/devel-docs/libgwymodule/html/libgwymodule.devhelp2
+++ b/devel-docs/libgwymodule/html/libgwymodule.devhelp2
@@ -40,24 +40,36 @@
     <sub name="Index of new symbols in 2.36" link="api-index-2-36.html"/>
     <sub name="Index of new symbols in 2.38" link="api-index-2-38.html"/>
     <sub name="Index of new symbols in 2.45" link="api-index-2-45.html"/>
+    <sub name="Index of new symbols in 2.48" link="api-index-2-48.html"/>
+    <sub name="Index of new symbols in 2.49" link="api-index-2-49.html"/>
   </chapters>
   <functions>
     <keyword type="enum" name="enum GwyFileOperationType" link="libgwymodule-gwymoduleenums.html#GwyFileOperationType"/>
     <keyword type="enum" name="enum GwyToolSwitchEvent" link="libgwymodule-gwymoduleenums.html#GwyToolSwitchEvent" deprecated=""/>
     <keyword type="enum" name="enum GwyRunType" link="libgwymodule-gwymoduleenums.html#GwyRunType"/>
     <keyword type="macro" name="GWY_MODULE_QUERY()" link="libgwymodule-gwymoduleloader.html#GWY-MODULE-QUERY:CAPS"/>
+    <keyword type="macro" name="GWY_MODULE_QUERY2()" link="libgwymodule-gwymoduleloader.html#GWY-MODULE-QUERY2:CAPS" since="2.49"/>
     <keyword type="function" name="GwyModuleRegisterFunc ()" link="libgwymodule-gwymoduleloader.html#GwyModuleRegisterFunc"/>
     <keyword type="function" name="GwyModuleQueryFunc ()" link="libgwymodule-gwymoduleloader.html#GwyModuleQueryFunc"/>
+    <keyword type="function" name="GwyModuleBundleRegisterFunc ()" link="libgwymodule-gwymoduleloader.html#GwyModuleBundleRegisterFunc" since="2.49"/>
     <keyword type="function" name="gwy_module_error_quark ()" link="libgwymodule-gwymoduleloader.html#gwy-module-error-quark"/>
     <keyword type="function" name="gwy_module_register_modules ()" link="libgwymodule-gwymoduleloader.html#gwy-module-register-modules"/>
     <keyword type="function" name="gwy_module_lookup ()" link="libgwymodule-gwymoduleloader.html#gwy-module-lookup"/>
     <keyword type="function" name="gwy_module_get_filename ()" link="libgwymodule-gwymoduleloader.html#gwy-module-get-filename"/>
     <keyword type="function" name="gwy_module_get_functions ()" link="libgwymodule-gwymoduleloader.html#gwy-module-get-functions"/>
     <keyword type="function" name="gwy_module_foreach ()" link="libgwymodule-gwymoduleloader.html#gwy-module-foreach"/>
+    <keyword type="function" name="gwy_module_failure_foreach ()" link="libgwymodule-gwymoduleloader.html#gwy-module-failure-foreach" since="2.49"/>
     <keyword type="function" name="gwy_module_register_module ()" link="libgwymodule-gwymoduleloader.html#gwy-module-register-module"/>
+    <keyword type="function" name="gwy_module_disable_registration ()" link="libgwymodule-gwymoduleloader.html#gwy-module-disable-registration" since="2.48"/>
+    <keyword type="function" name="gwy_module_enable_registration ()" link="libgwymodule-gwymoduleloader.html#gwy-module-enable-registration" since="2.48"/>
+    <keyword type="function" name="gwy_module_is_enabled ()" link="libgwymodule-gwymoduleloader.html#gwy-module-is-enabled" since="2.48"/>
     <keyword type="macro" name="GWY_MODULE_ABI_VERSION" link="libgwymodule-gwymoduleloader.html#GWY-MODULE-ABI-VERSION:CAPS"/>
+    <keyword type="macro" name="GWY_MODULE_BUNDLE_FLAG" link="libgwymodule-gwymoduleloader.html#GWY-MODULE-BUNDLE-FLAG:CAPS" since="2.49"/>
+    <keyword type="macro" name="GWY_MODULE_ERROR" link="libgwymodule-gwymoduleloader.html#GWY-MODULE-ERROR:CAPS"/>
     <keyword type="enum" name="enum GwyModuleError" link="libgwymodule-gwymoduleloader.html#GwyModuleError"/>
+    <keyword type="struct" name="struct GwyModuleRecord" link="libgwymodule-gwymoduleloader.html#GwyModuleRecord" since="2.49"/>
     <keyword type="struct" name="struct GwyModuleInfo" link="libgwymodule-gwymoduleloader.html#GwyModuleInfo"/>
+    <keyword type="struct" name="GwyModuleFailureInfo" link="libgwymodule-gwymoduleloader.html#GwyModuleFailureInfo" since="2.49"/>
     <keyword type="function" name="GwyFileDetectFunc ()" link="libgwymodule-gwymodule-file.html#GwyFileDetectFunc"/>
     <keyword type="function" name="GwyFileLoadFunc ()" link="libgwymodule-gwymodule-file.html#GwyFileLoadFunc"/>
     <keyword type="function" name="GwyFileSaveFunc ()" link="libgwymodule-gwymodule-file.html#GwyFileSaveFunc"/>
@@ -153,6 +165,7 @@
     <keyword type="constant" name="GWY_MODULE_ERROR_ABI" link="libgwymodule-gwymoduleloader.html#GWY-MODULE-ERROR-ABI:CAPS"/>
     <keyword type="constant" name="GWY_MODULE_ERROR_INFO" link="libgwymodule-gwymoduleloader.html#GWY-MODULE-ERROR-INFO:CAPS"/>
     <keyword type="constant" name="GWY_MODULE_ERROR_REGISTER" link="libgwymodule-gwymoduleloader.html#GWY-MODULE-ERROR-REGISTER:CAPS"/>
+    <keyword type="constant" name="GWY_MODULE_ERROR_NESTING" link="libgwymodule-gwymoduleloader.html#GWY-MODULE-ERROR-NESTING:CAPS"/>
     <keyword type="constant" name="GWY_MODULE_FILE_ERROR_CANCELED" link="libgwymodule-gwymodule-file.html#GWY-MODULE-FILE-ERROR-CANCELED:CAPS"/>
     <keyword type="constant" name="GWY_MODULE_FILE_ERROR_CANCELLED" link="libgwymodule-gwymodule-file.html#GWY-MODULE-FILE-ERROR-CANCELLED:CAPS"/>
     <keyword type="constant" name="GWY_MODULE_FILE_ERROR_UNIMPLEMENTED" link="libgwymodule-gwymodule-file.html#GWY-MODULE-FILE-ERROR-UNIMPLEMENTED:CAPS"/>
@@ -160,6 +173,8 @@
     <keyword type="constant" name="GWY_MODULE_FILE_ERROR_DATA" link="libgwymodule-gwymodule-file.html#GWY-MODULE-FILE-ERROR-DATA:CAPS"/>
     <keyword type="constant" name="GWY_MODULE_FILE_ERROR_INTERACTIVE" link="libgwymodule-gwymodule-file.html#GWY-MODULE-FILE-ERROR-INTERACTIVE:CAPS"/>
     <keyword type="constant" name="GWY_MODULE_FILE_ERROR_SPECIFIC" link="libgwymodule-gwymodule-file.html#GWY-MODULE-FILE-ERROR-SPECIFIC:CAPS"/>
+    <keyword type="member" name="GwyModuleRecord.query" link="libgwymodule-gwymoduleloader.html#GwyModuleRecord.query"/>
+    <keyword type="member" name="GwyModuleRecord.name" link="libgwymodule-gwymoduleloader.html#GwyModuleRecord.name"/>
     <keyword type="member" name="GwyModuleInfo.abi-version" link="libgwymodule-gwymoduleloader.html#GwyModuleInfo.abi-version"/>
     <keyword type="member" name="GwyModuleInfo.register-func" link="libgwymodule-gwymoduleloader.html#GwyModuleInfo.register-func"/>
     <keyword type="member" name="GwyModuleInfo.blurb" link="libgwymodule-gwymoduleloader.html#GwyModuleInfo.blurb"/>
@@ -167,6 +182,11 @@
     <keyword type="member" name="GwyModuleInfo.version" link="libgwymodule-gwymoduleloader.html#GwyModuleInfo.version"/>
     <keyword type="member" name="GwyModuleInfo.copyright" link="libgwymodule-gwymoduleloader.html#GwyModuleInfo.copyright"/>
     <keyword type="member" name="GwyModuleInfo.date" link="libgwymodule-gwymoduleloader.html#GwyModuleInfo.date"/>
+    <keyword type="member" name="GwyModuleFailureInfo.filename" link="libgwymodule-gwymoduleloader.html#GwyModuleFailureInfo.filename"/>
+    <keyword type="member" name="GwyModuleFailureInfo.modname" link="libgwymodule-gwymoduleloader.html#GwyModuleFailureInfo.modname"/>
+    <keyword type="member" name="GwyModuleFailureInfo.err-message" link="libgwymodule-gwymoduleloader.html#GwyModuleFailureInfo.err-message"/>
+    <keyword type="member" name="GwyModuleFailureInfo.err-domain" link="libgwymodule-gwymoduleloader.html#GwyModuleFailureInfo.err-domain"/>
+    <keyword type="member" name="GwyModuleFailureInfo.err-code" link="libgwymodule-gwymoduleloader.html#GwyModuleFailureInfo.err-code"/>
     <keyword type="member" name="GwyFileDetectInfo.name" link="libgwymodule-gwymodule-file.html#GwyFileDetectInfo.name"/>
     <keyword type="member" name="GwyFileDetectInfo.name-lowercase" link="libgwymodule-gwymodule-file.html#GwyFileDetectInfo.name-lowercase"/>
     <keyword type="member" name="GwyFileDetectInfo.file-size" link="libgwymodule-gwymodule-file.html#GwyFileDetectInfo.file-size"/>
diff --git a/devel-docs/libgwymodule/html/plugin-proxy-dump.html b/devel-docs/libgwymodule/html/plugin-proxy-dump.html
index efe2788..c3cf61f 100644
--- a/devel-docs/libgwymodule/html/plugin-proxy-dump.html
+++ b/devel-docs/libgwymodule/html/plugin-proxy-dump.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Dump Format: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="PluginProxyReference.html" title="Plug-in Proxy Reference">
 <link rel="prev" href="plugin-proxy-file.html" title="File Type Plug-ins">
diff --git a/devel-docs/libgwymodule/html/plugin-proxy-file.html b/devel-docs/libgwymodule/html/plugin-proxy-file.html
index a0a6c7e..b80b466 100644
--- a/devel-docs/libgwymodule/html/plugin-proxy-file.html
+++ b/devel-docs/libgwymodule/html/plugin-proxy-file.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>File Type Plug-ins: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="PluginProxyReference.html" title="Plug-in Proxy Reference">
 <link rel="prev" href="plugin-proxy-process.html" title="Data Process Plug-ins">
diff --git a/devel-docs/libgwymodule/html/plugin-proxy-overview.html b/devel-docs/libgwymodule/html/plugin-proxy-overview.html
index ef96dea..1e91c90 100644
--- a/devel-docs/libgwymodule/html/plugin-proxy-overview.html
+++ b/devel-docs/libgwymodule/html/plugin-proxy-overview.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Plug-in Proxy Overview: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="PluginProxyReference.html" title="Plug-in Proxy Reference">
 <link rel="prev" href="PluginProxyReference.html" title="Plug-in Proxy Reference">
diff --git a/devel-docs/libgwymodule/html/plugin-proxy-process.html b/devel-docs/libgwymodule/html/plugin-proxy-process.html
index 625387f..b44deb5 100644
--- a/devel-docs/libgwymodule/html/plugin-proxy-process.html
+++ b/devel-docs/libgwymodule/html/plugin-proxy-process.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Data Process Plug-ins: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="PluginProxyReference.html" title="Plug-in Proxy Reference">
 <link rel="prev" href="plugin-proxy-overview.html" title="Plug-in Proxy Overview">
diff --git a/devel-docs/libgwymodule/html/plugin-proxy-rgi.html b/devel-docs/libgwymodule/html/plugin-proxy-rgi.html
index ba82d91..ec6d9ee 100644
--- a/devel-docs/libgwymodule/html/plugin-proxy-rgi.html
+++ b/devel-docs/libgwymodule/html/plugin-proxy-rgi.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>RGI Registration Method: Gwyddion Module Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Module Library Reference Manual">
 <link rel="up" href="PluginProxyReference.html" title="Plug-in Proxy Reference">
 <link rel="prev" href="plugin-proxy-dump.html" title="Dump Format">
diff --git a/devel-docs/libgwymodule/libgwymodule-docs.sgml b/devel-docs/libgwymodule/libgwymodule-docs.sgml
index 4d46385..5842131 100644
--- a/devel-docs/libgwymodule/libgwymodule-docs.sgml
+++ b/devel-docs/libgwymodule/libgwymodule-docs.sgml
@@ -48,37 +48,45 @@
     <title>Index of all symbols</title>
     <xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-deprec" role="deprecated">
+  <index id="api-index-deprec">
     <title>Index of deprecated symbols</title>
     <xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-1" role="2.1">
+  <index id="api-index-2-1">
     <title>Index of new symbols in 2.1</title>
     <xi:include href="xml/api-index-2.1.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-18" role="2.18">
+  <index id="api-index-2-18">
     <title>Index of new symbols in 2.18</title>
     <xi:include href="xml/api-index-2.18.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-25" role="2.25">
+  <index id="api-index-2-25">
     <title>Index of new symbols in 2.25</title>
     <xi:include href="xml/api-index-2.25.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-32" role="2.32">
+  <index id="api-index-2-32">
     <title>Index of new symbols in 2.32</title>
     <xi:include href="xml/api-index-2.32.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-36" role="2.36">
+  <index id="api-index-2-36">
     <title>Index of new symbols in 2.36</title>
     <xi:include href="xml/api-index-2.36.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-38" role="2.38">
+  <index id="api-index-2-38">
     <title>Index of new symbols in 2.38</title>
     <xi:include href="xml/api-index-2.38.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-45" role="2.45">
+  <index id="api-index-2-45">
     <title>Index of new symbols in 2.45</title>
     <xi:include href="xml/api-index-2.45.xml"><xi:fallback /></xi:include>
   </index>
+  <index id="api-index-2-48">
+    <title>Index of new symbols in 2.48</title>
+    <xi:include href="xml/api-index-2.48.xml"><xi:fallback /></xi:include>
+  </index>
+  <index id="api-index-2-49">
+    <title>Index of new symbols in 2.49</title>
+    <xi:include href="xml/api-index-2.49.xml"><xi:fallback /></xi:include>
+  </index>
   <!-- API INDICES END -->
 </book>
diff --git a/devel-docs/libgwymodule/module-tutorial-beyond.xml b/devel-docs/libgwymodule/module-tutorial-beyond.xml
index 9b4bb11..315a660 100644
--- a/devel-docs/libgwymodule/module-tutorial-beyond.xml
+++ b/devel-docs/libgwymodule/module-tutorial-beyond.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
                "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
-<refentry id="gwymodule-tutorial-beyond" revision="@(#) $Id: module-tutorial-beyond.xml 6762 2006-10-09 21:23:55Z yeti-dn $">
+<refentry id="gwymodule-tutorial-beyond" revision="@(#) $Id: module-tutorial-beyond.xml 19894 2017-06-10 05:21:19Z yeti-dn $">
   <refmeta>
     <refentrytitle>Beyond the Minimal Module</refentrytitle>
     <manvolnum>3</manvolnum>
@@ -250,8 +250,8 @@ g_object_unref(graph_model);
         </listitem>
       </itemizedlist>
       There is an extensive
-      <ulink url="http://gtk.org/tutorial/">Gtk+ Tutorial</ulink>
-      and <ulink url="http://gtk.org/api/">API Reference</ulink> available
+      <ulink url="https://developer.gnome.org/gtk-tutorial/stable/">Gtk+ Tutorial</ulink>
+      and <ulink url="https://developer.gnome.org/gtk2/stable/">API Reference</ulink> available
       on the Gtk+ Web site.  You can use existing modules as templates
       for your module.
     </para>
diff --git a/devel-docs/libgwymodule/module-tutorial-install.xml b/devel-docs/libgwymodule/module-tutorial-install.xml
index 97c44f6..d4bd2cf 100644
--- a/devel-docs/libgwymodule/module-tutorial-install.xml
+++ b/devel-docs/libgwymodule/module-tutorial-install.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
                "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
-<refentry id="gwymodule-tutorial-install" revision="@(#) $Id: module-tutorial-install.xml 6751 2006-10-07 22:13:53Z yeti-dn $">
+<refentry id="gwymodule-tutorial-install" revision="@(#) $Id: module-tutorial-install.xml 19894 2017-06-10 05:21:19Z yeti-dn $">
   <refmeta>
     <refentrytitle>Gwyddion Module Installation</refentrytitle>
     <manvolnum>3</manvolnum>
@@ -19,7 +19,7 @@
     <title>Overview</title>
     <para>
       To be written. Meanwhile you can look at the
-      <ulink url="http://gwyddion.net/download.php#sample-module">threshold-example</ulink>
+      <ulink url="http://gwyddion.net/apps/#sample-module">threshold-example</ulink>
       module how it copes with this issues.
     </para>
     <para>
diff --git a/devel-docs/libgwyprocess/Makefile.in b/devel-docs/libgwyprocess/Makefile.in
index 8168c92..5e9294c 100644
--- a/devel-docs/libgwyprocess/Makefile.in
+++ b/devel-docs/libgwyprocess/Makefile.in
@@ -178,10 +178,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -191,6 +188,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -215,7 +214,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -273,6 +274,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -281,17 +283,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/devel-docs/libgwyprocess/html/GwyBrick.html b/devel-docs/libgwyprocess/html/GwyBrick.html
index d50c715..ab9381e 100644
--- a/devel-docs/libgwyprocess/html/GwyBrick.html
+++ b/devel-docs/libgwyprocess/html/GwyBrick.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyBrick: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="GwySpectra.html" title="GwySpectra">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyBrick.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -297,6 +297,14 @@
 </tr>
 <tr>
 <td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="GwyBrick.html#gwy-brick-copy-units" title="gwy_brick_copy_units ()">gwy_brick_copy_units</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">GwySIValueFormat</span> *
 </td>
 <td class="function_name">
@@ -572,7 +580,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyBrick.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -587,7 +595,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyBrick.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -639,7 +647,7 @@ different volume data obtained from SPMs, like in force volume measurements.</p>
 typecasting.</p>
 <div class="refsect3">
 <a name="gwy-brick-duplicate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -668,7 +676,7 @@ gwy_brick_new (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glib
 <p>Creates a new data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -731,7 +739,7 @@ gwy_brick_new_alike (<em class="parameter"><code><a class="link" href="GwyBrick.
 data.</p>
 <div class="refsect3">
 <a name="gwy-brick-new-alike.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -774,7 +782,7 @@ gwy_brick_new_part (<em class="parameter"><code>const <a class="link" href="GwyB
 <p>Use <a class="link" href="GwyBrick.html#gwy-brick-duplicate" title="gwy_brick_duplicate()"><code class="function">gwy_brick_duplicate()</code></a> if you want to copy a whole data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-new-part.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -838,7 +846,7 @@ gwy_brick_data_changed (<em class="parameter"><code><a class="link" href="GwyBri
 <p>Emits signal "data_changed" on a data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-data-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -868,7 +876,7 @@ brick. The original values are used for resampling using a requested
 interpolation alorithm.</p>
 <div class="refsect3">
 <a name="gwy-brick-resample.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -913,7 +921,7 @@ gwy_brick_get_xres (<em class="parameter"><code><a class="link" href="GwyBrick.h
 <p>Gets the x resolution of a data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-xres.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -940,7 +948,7 @@ gwy_brick_get_yres (<em class="parameter"><code><a class="link" href="GwyBrick.h
 <p>Gets the y resolution of a data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-yres.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -967,7 +975,7 @@ gwy_brick_get_zres (<em class="parameter"><code><a class="link" href="GwyBrick.h
 <p>Gets the z resolution of a data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-zres.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -994,7 +1002,7 @@ gwy_brick_get_xreal (<em class="parameter"><code><a class="link" href="GwyBrick.
 <p>Gets the physical size of a data brick in the x direction.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-xreal.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1021,7 +1029,7 @@ gwy_brick_get_yreal (<em class="parameter"><code><a class="link" href="GwyBrick.
 <p>Gets the physical size of a data brick in the y direction.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-yreal.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1048,7 +1056,7 @@ gwy_brick_get_zreal (<em class="parameter"><code><a class="link" href="GwyBrick.
 <p>Gets the physical size of a data brick in the z direction.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-zreal.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1075,7 +1083,7 @@ gwy_brick_get_xoffset (<em class="parameter"><code><a class="link" href="GwyBric
 <p>Gets the offset of data brick origin in x direction.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-xoffset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1102,7 +1110,7 @@ gwy_brick_get_yoffset (<em class="parameter"><code><a class="link" href="GwyBric
 <p>Gets the offset of data brick origin in y direction.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-yoffset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1129,7 +1137,7 @@ gwy_brick_get_zoffset (<em class="parameter"><code><a class="link" href="GwyBric
 <p>Gets the offset of data brick origin in z direction.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-zoffset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1160,7 +1168,7 @@ brick life time.  Some function may change it, most notably
 <p>Use <a class="link" href="GwyBrick.html#gwy-brick-get-data" title="gwy_brick_get_data ()"><code class="function">gwy_brick_get_data()</code></a> if you want to change the data.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-data-const.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1191,7 +1199,7 @@ gwy_brick_set_xreal (<em class="parameter"><code><a class="link" href="GwyBrick.
 <p>Sets the real x dimension of a brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-set-xreal.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1222,7 +1230,7 @@ gwy_brick_set_yreal (<em class="parameter"><code><a class="link" href="GwyBrick.
 <p>Sets the real y dimension of a brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-set-yreal.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1253,7 +1261,7 @@ gwy_brick_set_zreal (<em class="parameter"><code><a class="link" href="GwyBrick.
 <p>Sets the real z dimension of a brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-set-zreal.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1286,7 +1294,7 @@ gwy_brick_set_xoffset (<em class="parameter"><code><a class="link" href="GwyBric
 <a class="link" href="GwyBrick.html#gwy-brick-rtoi" title="gwy_brick_rtoi ()"><code class="function">gwy_brick_rtoi()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-brick-set-xoffset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1319,7 +1327,7 @@ gwy_brick_set_yoffset (<em class="parameter"><code><a class="link" href="GwyBric
 <a class="link" href="GwyBrick.html#gwy-brick-rtoi" title="gwy_brick_rtoi ()"><code class="function">gwy_brick_rtoi()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-brick-set-yoffset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1352,7 +1360,7 @@ gwy_brick_set_zoffset (<em class="parameter"><code><a class="link" href="GwyBric
 <a class="link" href="GwyBrick.html#gwy-brick-rtoi" title="gwy_brick_rtoi ()"><code class="function">gwy_brick_rtoi()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-brick-set-zoffset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1382,7 +1390,7 @@ gwy_brick_get_si_unit_x (<em class="parameter"><code><a class="link" href="GwyBr
 <p>Returns x direction SI unit of a data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-si-unit-x.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1410,7 +1418,7 @@ gwy_brick_get_si_unit_y (<em class="parameter"><code><a class="link" href="GwyBr
 <p>Returns y direction SI unit of a data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-si-unit-y.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1438,7 +1446,7 @@ gwy_brick_get_si_unit_z (<em class="parameter"><code><a class="link" href="GwyBr
 <p>Returns z direction SI unit of a data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-si-unit-z.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1466,7 +1474,7 @@ gwy_brick_get_si_unit_w (<em class="parameter"><code><a class="link" href="GwyBr
 <p>Returns value SI unit of a data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-si-unit-w.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1499,7 +1507,7 @@ brick.</p>
 reference.</p>
 <div class="refsect3">
 <a name="gwy-brick-set-si-unit-x.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1534,7 +1542,7 @@ brick.</p>
 reference.</p>
 <div class="refsect3">
 <a name="gwy-brick-set-si-unit-y.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1569,7 +1577,7 @@ brick.</p>
 reference.</p>
 <div class="refsect3">
 <a name="gwy-brick-set-si-unit-z.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1604,7 +1612,7 @@ brick.</p>
 reference.</p>
 <div class="refsect3">
 <a name="gwy-brick-set-si-unit-w.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1634,7 +1642,7 @@ gwy_brick_get_min (<em class="parameter"><code><a class="link" href="GwyBrick.ht
 <p>Find the minimum value in a data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-min.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1661,7 +1669,7 @@ gwy_brick_get_max (<em class="parameter"><code><a class="link" href="GwyBrick.ht
 <p>Find the maximum value in a data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-max.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1682,6 +1690,37 @@ gwy_brick_get_max (<em class="parameter"><code><a class="link" href="GwyBrick.ht
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-brick-copy-units"></a><h3>gwy_brick_copy_units ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_brick_copy_units (<em class="parameter"><code>const <a class="link" href="GwyBrick.html" title="GwyBrick"><span class="type">GwyBrick</span></a> *brick</code></em>,
+                      <em class="parameter"><code><a class="link" href="GwyBrick.html" title="GwyBrick"><span class="type">GwyBrick</span></a> *target</code></em>);</pre>
+<p>Sets lateral and value units of a data brick to match another data brick.</p>
+<div class="refsect3">
+<a name="gwy-brick-copy-units.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>brick</p></td>
+<td class="parameter_description"><p>A data brick.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>target</p></td>
+<td class="parameter_description"><p>Target data brick.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-brick-get-value-format-x"></a><h3>gwy_brick_get_value_format_x ()</h3>
 <pre class="programlisting"><span class="returnvalue">GwySIValueFormat</span> *
 gwy_brick_get_value_format_x (<em class="parameter"><code><a class="link" href="GwyBrick.html" title="GwyBrick"><span class="type">GwyBrick</span></a> *brick</code></em>,
@@ -1690,7 +1729,7 @@ gwy_brick_get_value_format_x (<em class="parameter"><code><a class="link" href="
 <p>Finds value format good for displaying coordinates of a data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-value-format-x.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1734,7 +1773,7 @@ gwy_brick_get_value_format_y (<em class="parameter"><code><a class="link" href="
 <p>Finds value format good for displaying values of a data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-value-format-y.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1778,7 +1817,7 @@ gwy_brick_get_value_format_z (<em class="parameter"><code><a class="link" href="
 <p>Finds value format good for displaying values of a data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-value-format-z.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1825,7 +1864,7 @@ gwy_brick_get_value_format_w (<em class="parameter"><code><a class="link" href="
 therefore it's relatively slow.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-value-format-w.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1872,7 +1911,7 @@ brick life time.  Some function may change it, most notably
 <a class="link" href="GwyBrick.html#gwy-brick-get-data-const" title="gwy_brick_get_data_const ()"><code class="function">gwy_brick_get_data_const()</code></a> if you are not going to change the data.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1908,7 +1947,7 @@ have to use gwy_brick_itor(<em class="parameter"><code>brick</code></em>
  + 0.5) for that.</p>
 <div class="refsect3">
 <a name="gwy-brick-itor.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1945,7 +1984,7 @@ gwy_brick_rtoi (<em class="parameter"><code><a class="link" href="GwyBrick.html"
 <p>That is it maps range [0..x real-size] to range [0..x resolution].</p>
 <div class="refsect3">
 <a name="gwy-brick-rtoi.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1986,7 +2025,7 @@ have to use gwy_brick_itor(<em class="parameter"><code>brick</code></em>
  + 0.5) for that.</p>
 <div class="refsect3">
 <a name="gwy-brick-jtor.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2023,7 +2062,7 @@ gwy_brick_rtoj (<em class="parameter"><code><a class="link" href="GwyBrick.html"
 <p>That is it maps range [0..y real-size] to range [0..y resolution].</p>
 <div class="refsect3">
 <a name="gwy-brick-rtoj.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2064,7 +2103,7 @@ have to use gwy_brick_itor(<em class="parameter"><code>brick</code></em>
  + 0.5) for that.</p>
 <div class="refsect3">
 <a name="gwy-brick-ktor.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2101,7 +2140,7 @@ gwy_brick_rtok (<em class="parameter"><code><a class="link" href="GwyBrick.html"
 <p>That is it maps range [0..z real-size] to range [0..z resolution].</p>
 <div class="refsect3">
 <a name="gwy-brick-rtok.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2146,7 +2185,7 @@ the values are interpolated between and clamped if outside the range.</p>
 This convention is also kept when no calibration is present.</p>
 <div class="refsect3">
 <a name="gwy-brick-ktor-cal.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2191,7 +2230,7 @@ the values are interpolated between and clamped if outside the range.</p>
 This convention is also kept when no calibration is present.</p>
 <div class="refsect3">
 <a name="gwy-brick-rtok-cal.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2232,7 +2271,7 @@ Get raw data buffer with <a class="link" href="GwyBrick.html#gwy-brick-get-data-
 directly instead.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-val.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2283,7 +2322,7 @@ Get raw data buffer with <a class="link" href="GwyBrick.html#gwy-brick-get-data-
 directly instead.</p>
 <div class="refsect3">
 <a name="gwy-brick-set-val.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2334,7 +2373,7 @@ Get raw data buffer with <a class="link" href="GwyBrick.html#gwy-brick-get-data-
 directly instead.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-val-real.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2385,7 +2424,7 @@ Get raw data buffer with <a class="link" href="GwyBrick.html#gwy-brick-get-data-
 directly instead.</p>
 <div class="refsect3">
 <a name="gwy-brick-set-val-real.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2440,7 +2479,7 @@ See also <a class="link" href="GwyBrick.html#gwy-brick-get-dval-real" title="gwy
 real coordinates.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-dval.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2502,7 +2541,7 @@ See also <a class="link" href="GwyBrick.html#gwy-brick-get-dval" title="gwy_bric
 pixel coordinates.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-dval-real.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2516,20 +2555,20 @@ pixel coordinates.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>x</p></td>
-<td class="parameter_description"><p>Position in data brick in range [0, x resolution].  If the value is outside
-this range, the nearest border value is returned.</p></td>
+<td class="parameter_description"><p>Position in data brick in range [0, x resolution].  If the value is
+outside this range, the nearest border value is returned.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>y</p></td>
-<td class="parameter_description"><p>Position in data brick in range [0, y resolution].  If the value is outside
-this range, the nearest border value is returned.</p></td>
+<td class="parameter_description"><p>Position in data brick in range [0, y resolution].  If the value is
+outside this range, the nearest border value is returned.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>z</p></td>
-<td class="parameter_description"><p>Position in data brick in range [0, z resolution].  If the value is outside
-this range, the nearest border value is returned.</p></td>
+<td class="parameter_description"><p>Position in data brick in range [0, z resolution].  If the value is
+outside this range, the nearest border value is returned.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -2554,7 +2593,7 @@ gwy_brick_clear (<em class="parameter"><code><a class="link" href="GwyBrick.html
 <p>Fills a data brick with zeroes.</p>
 <div class="refsect3">
 <a name="gwy-brick-clear.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2578,7 +2617,7 @@ gwy_brick_fill (<em class="parameter"><code><a class="link" href="GwyBrick.html"
 <p>Fills a data brick with specified value.</p>
 <div class="refsect3">
 <a name="gwy-brick-fill.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2609,7 +2648,7 @@ gwy_brick_multiply (<em class="parameter"><code><a class="link" href="GwyBrick.h
 <p>Multiplies all values in a data brick with a specified value.</p>
 <div class="refsect3">
 <a name="gwy-brick-multiply.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2640,7 +2679,7 @@ gwy_brick_add (<em class="parameter"><code><a class="link" href="GwyBrick.html"
 <p>Adds a specified value to all values in a data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-add.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2683,7 +2722,7 @@ gwy_brick_extract_plane (<em class="parameter"><code>const <a class="link" href=
 plane orientation.</p>
 <div class="refsect3">
 <a name="gwy-brick-extract-plane.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2773,7 +2812,7 @@ extraction, but the planes are accumulated in whole range (0..xres for given
 example)</p>
 <div class="refsect3">
 <a name="gwy-brick-sum-plane.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2864,7 +2903,7 @@ for single plane extraction, but the planes are accumulated in whole range
 (0..xres for given example)</p>
 <div class="refsect3">
 <a name="gwy-brick-min-plane.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2955,7 +2994,7 @@ for single plane extraction, but the planes are accumulated in whole range
 (0..xres for given example)</p>
 <div class="refsect3">
 <a name="gwy-brick-max-plane.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3046,7 +3085,7 @@ for single plane extraction, but the planes are accumulated in whole range
 (0..xres for given example)</p>
 <div class="refsect3">
 <a name="gwy-brick-minpos-plane.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3137,7 +3176,7 @@ for single plane extraction, but the planes are accumulated in whole range
 (0..xres for given example)</p>
 <div class="refsect3">
 <a name="gwy-brick-maxpos-plane.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3228,7 +3267,7 @@ for single plane extraction, but the planes are accumulated in whole range
 (0..xres for given example)</p>
 <div class="refsect3">
 <a name="gwy-brick-mean-plane.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3319,7 +3358,7 @@ for single plane extraction, but the planes are accumulated in whole range
 (0..xres for given example)</p>
 <div class="refsect3">
 <a name="gwy-brick-rms-plane.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3402,7 +3441,7 @@ gwy_brick_extract_line (<em class="parameter"><code>const <a class="link" href="
 two of the start coordinates need to be same as end ones.</p>
 <div class="refsect3">
 <a name="gwy-brick-extract-line.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3468,7 +3507,7 @@ gwy_brick_get_zcalibration (<em class="parameter"><code>const <a class="link" hr
 <p>Gets the z-axis non-linear calibration of a data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-get-zcalibration.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3496,7 +3535,7 @@ gwy_brick_set_zcalibration (<em class="parameter"><code>const <a class="link" hr
 <p>Sets the z-axis non-linear calibration of a data brick.</p>
 <div class="refsect3">
 <a name="gwy-brick-set-zcalibration.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3566,7 +3605,7 @@ is intended as a means to notify others data line users they should
 update themselves.</p>
 <div class="refsect3">
 <a name="GwyBrick-data-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/GwyCDLine.html b/devel-docs/libgwyprocess/html/GwyCDLine.html
index 4378baf..ccab5a9 100644
--- a/devel-docs/libgwyprocess/html/GwyCDLine.html
+++ b/devel-docs/libgwyprocess/html/GwyCDLine.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>cdline: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-arithmetic.html" title="arithmetic">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyCDLine.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -122,7 +122,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyCDLine.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -178,7 +178,7 @@ gwy_cdline_get_name (<em class="parameter"><code><a class="link" href="GwyCDLine
 <p>Return cdline name (its unique identifier).</p>
 <div class="refsect3">
 <a name="gwy-cdline-get-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -205,7 +205,7 @@ gwy_cdline_get_definition (<em class="parameter"><code><a class="link" href="Gwy
 description.</p>
 <div class="refsect3">
 <a name="gwy-cdline-get-definition.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -233,7 +233,7 @@ gwy_cdline_get_param_name (<em class="parameter"><code><a class="link" href="Gwy
 <p>The name may contain Pango markup.</p>
 <div class="refsect3">
 <a name="gwy-cdline-get-param-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -269,7 +269,7 @@ gwy_cdline_get_param_default (<em class="parameter"><code><a class="link" href="
 <p>Returns a constant default parameter value.</p>
 <div class="refsect3">
 <a name="gwy-cdline-get-param-default.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -307,7 +307,7 @@ gwy_cdline_get_param_units (<em class="parameter"><code><a class="link" href="Gw
 abscissa and ordinate.</p>
 <div class="refsect3">
 <a name="gwy-cdline-get-param-units.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -357,7 +357,7 @@ gwy_cdline_get_nparams (<em class="parameter"><code><a class="link" href="GwyCDL
 .</p>
 <div class="refsect3">
 <a name="gwy-cdline-get-nparams.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -391,7 +391,7 @@ gwy_cdline_fit (<em class="parameter"><code><a class="link" href="GwyCDLine.html
 <p>Performs a critical dimension evaulation (fit).</p>
 <div class="refsect3">
 <a name="gwy-cdline-fit.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -465,7 +465,7 @@ gwy_cdline_fit_with_caldata (<em class="parameter"><code><a class="link" href="G
 <p>Performs a critical dimension evaulation (fit), allowing user to pass uncertainties.</p>
 <div class="refsect3">
 <a name="gwy-cdline-fit-with-caldata.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -525,7 +525,7 @@ gwy_cdline_get_value (<em class="parameter"><code><a class="link" href="GwyCDLin
 parameters.</p>
 <div class="refsect3">
 <a name="gwy-cdline-get-value.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/GwyCalData.html b/devel-docs/libgwyprocess/html/GwyCalData.html
index 89b4a61..f0f9203 100644
--- a/devel-docs/libgwyprocess/html/GwyCalData.html
+++ b/devel-docs/libgwyprocess/html/GwyCalData.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyCalData: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="GwyCalibration.html" title="GwyCalibration">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyCalData.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -251,7 +251,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyCalData.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -299,7 +299,7 @@ gwy_caldata_new (<em class="parameter"><code><a href="http://developer.gnome.org
 <p>Creates new calibration data.</p>
 <div class="refsect3">
 <a name="gwy-caldata-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -327,7 +327,7 @@ gwy_caldata_resize (<em class="parameter"><code><a class="link" href="GwyCalData
 <p>Preserves actual values up to new calibration data size.</p>
 <div class="refsect3">
 <a name="gwy-caldata-resize.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -357,7 +357,7 @@ gwy_caldata_append (<em class="parameter"><code><a class="link" href="GwyCalData
 <p>Appends calibration data entries, resizing arrays for holding them.</p>
 <div class="refsect3">
 <a name="gwy-caldata-append.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -387,7 +387,7 @@ gwy_caldata_get_ndata (<em class="parameter"><code><a class="link" href="GwyCalD
 <p>Gets the number of calibration data entries.</p>
 <div class="refsect3">
 <a name="gwy-caldata-get-ndata.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -414,7 +414,7 @@ gwy_caldata_get_x (<em class="parameter"><code><a class="link" href="GwyCalData.
 <p>Gets the Y data for calibration data.</p>
 <div class="refsect3">
 <a name="gwy-caldata-get-x.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -441,7 +441,7 @@ gwy_caldata_get_y (<em class="parameter"><code><a class="link" href="GwyCalData.
 <p>Gets the Y data for calibration data.</p>
 <div class="refsect3">
 <a name="gwy-caldata-get-y.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -468,7 +468,7 @@ gwy_caldata_get_z (<em class="parameter"><code><a class="link" href="GwyCalData.
 <p>Gets the Z data for calibration data.</p>
 <div class="refsect3">
 <a name="gwy-caldata-get-z.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -495,7 +495,7 @@ gwy_caldata_get_xerr (<em class="parameter"><code><a class="link" href="GwyCalDa
 <p>Gets the X error data for calibration data.</p>
 <div class="refsect3">
 <a name="gwy-caldata-get-xerr.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -522,7 +522,7 @@ gwy_caldata_get_yerr (<em class="parameter"><code><a class="link" href="GwyCalDa
 <p>Gets the Y error data for calibration data.</p>
 <div class="refsect3">
 <a name="gwy-caldata-get-yerr.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -549,7 +549,7 @@ gwy_caldata_get_zerr (<em class="parameter"><code><a class="link" href="GwyCalDa
 <p>Gets the Z error data for calibration data.</p>
 <div class="refsect3">
 <a name="gwy-caldata-get-zerr.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -576,7 +576,7 @@ gwy_caldata_get_xunc (<em class="parameter"><code><a class="link" href="GwyCalDa
 <p>Gets the X uncertainty data for calibration data.</p>
 <div class="refsect3">
 <a name="gwy-caldata-get-xunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -603,7 +603,7 @@ gwy_caldata_get_yunc (<em class="parameter"><code><a class="link" href="GwyCalDa
 <p>Gets the Y uncertainty data for calibration data.</p>
 <div class="refsect3">
 <a name="gwy-caldata-get-yunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -630,7 +630,7 @@ gwy_caldata_get_zunc (<em class="parameter"><code><a class="link" href="GwyCalDa
 <p>Gets the Z uncertainty data for calibration data.</p>
 <div class="refsect3">
 <a name="gwy-caldata-get-zunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -663,7 +663,7 @@ gwy_caldata_get_range (<em class="parameter"><code><a class="link" href="GwyCalD
 <p>Obtains boundaries of calibration data validity.</p>
 <div class="refsect3">
 <a name="gwy-caldata-get-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -724,7 +724,7 @@ gwy_caldata_set_range (<em class="parameter"><code><a class="link" href="GwyCalD
 <p>Sets boundaries of calibration data validity.</p>
 <div class="refsect3">
 <a name="gwy-caldata-set-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -779,7 +779,7 @@ gwy_caldata_get_si_unit_x (<em class="parameter"><code><a class="link" href="Gwy
 <p>Returns lateral SI unit of calibration data.</p>
 <div class="refsect3">
 <a name="gwy-caldata-get-si-unit-x.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -807,7 +807,7 @@ gwy_caldata_get_si_unit_y (<em class="parameter"><code><a class="link" href="Gwy
 <p>Returns lateral SI unit of calibration data</p>
 <div class="refsect3">
 <a name="gwy-caldata-get-si-unit-y.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -835,7 +835,7 @@ gwy_caldata_get_si_unit_z (<em class="parameter"><code><a class="link" href="Gwy
 <p>Returns value SI unit of calibration data</p>
 <div class="refsect3">
 <a name="gwy-caldata-get-si-unit-z.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -868,7 +868,7 @@ calibration data.</p>
 reference.</p>
 <div class="refsect3">
 <a name="gwy-caldata-set-si-unit-x.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -903,7 +903,7 @@ calibration data.</p>
 reference.</p>
 <div class="refsect3">
 <a name="gwy-caldata-set-si-unit-y.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -938,7 +938,7 @@ calibration data.</p>
 reference.</p>
 <div class="refsect3">
 <a name="gwy-caldata-set-si-unit-z.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -969,7 +969,7 @@ gwy_caldata_setup_interpolation (<em class="parameter"><code><a class="link" hre
 triangulation, etc.).</p>
 <div class="refsect3">
 <a name="gwy-caldata-setup-interpolation.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1001,7 +1001,7 @@ gwy_caldata_interpolate (<em class="parameter"><code><a class="link" href="GwyCa
 <p>Determines (interpolates) caldata parameters for given position.</p>
 <div class="refsect3">
 <a name="gwy-caldata-interpolate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1072,7 +1072,7 @@ gwy_caldata_save_data (<em class="parameter"><code><a class="link" href="GwyCalD
 <p>Saves calibration data to Gwyddion's caldata resource directory.</p>
 <div class="refsect3">
 <a name="gwy-caldata-save-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1105,7 +1105,7 @@ gwy_caldata_inside (<em class="parameter"><code><a class="link" href="GwyCalData
 <p>Tests whether a point is inside calibration data range.</p>
 <div class="refsect3">
 <a name="gwy-caldata-inside.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/GwyCalibration.html b/devel-docs/libgwyprocess/html/GwyCalibration.html
index 65b5701..22ec37d 100644
--- a/devel-docs/libgwyprocess/html/GwyCalibration.html
+++ b/devel-docs/libgwyprocess/html/GwyCalibration.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyCalibration: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="GwySurface.html" title="GwySurface">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyCalibration.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -92,7 +92,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyCalibration.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -137,7 +137,7 @@ gwy_calibration_new (<em class="parameter"><code>const <a href="http://developer
 <p>Creates new calibration resource.</p>
 <div class="refsect3">
 <a name="gwy-calibration-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -171,7 +171,7 @@ gwy_calibration_get_filename (<em class="parameter"><code><a class="link" href="
 <p>Get filename of associated calibration data.</p>
 <div class="refsect3">
 <a name="gwy-calibration-get-filename.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -198,7 +198,7 @@ gwy_calibration_get_ndata (<em class="parameter"><code><a class="link" href="Gwy
 <p>Returns the number of points in a calibration.</p>
 <div class="refsect3">
 <a name="gwy-calibration-get-ndata.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -238,7 +238,7 @@ gwy_calibrations_get_calibration (<em class="parameter"><code>const <a href="htt
 <p>Convenience function to get a calibration from <a class="link" href="GwyCalibration.html#gwy-calibrations" title="gwy_calibrations ()"><code class="function">gwy_calibrations()</code></a> by name.</p>
 <div class="refsect3">
 <a name="gwy-calibrations-get-calibration.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -267,7 +267,7 @@ gwy_calibration_get_data (<em class="parameter"><code><a class="link" href="GwyC
 <p>Obtains the data related to calibration.</p>
 <div class="refsect3">
 <a name="gwy-calibration-get-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/GwyDataField.html b/devel-docs/libgwyprocess/html/GwyDataField.html
index 0562f54..cf245bc 100644
--- a/devel-docs/libgwyprocess/html/GwyDataField.html
+++ b/devel-docs/libgwyprocess/html/GwyDataField.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyDataField: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="GwyDataLine.html" title="GwyDataLine">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyDataField.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -288,6 +288,14 @@
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
+<a class="link" href="GwyDataField.html#gwy-data-field-copy-units" title="gwy_data_field_copy_units ()">gwy_data_field_copy_units</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
 <a class="link" href="GwyDataField.html#gwy-data-field-copy-units-to-data-line" title="gwy_data_field_copy_units_to_data_line ()">gwy_data_field_copy_units_to_data_line</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
@@ -400,6 +408,22 @@
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
+<a class="link" href="GwyDataField.html#gwy-data-field-flip-xy" title="gwy_data_field_flip_xy ()">gwy_data_field_flip_xy</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="GwyDataField.html#gwy-data-field-area-flip-xy" title="gwy_data_field_area_flip_xy ()">gwy_data_field_area_flip_xy</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
 <a class="link" href="GwyDataField.html#gwy-data-field-fill" title="gwy_data_field_fill ()">gwy_data_field_fill</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
@@ -477,6 +501,14 @@
 </tr>
 <tr>
 <td class="function_type">
+<span class="returnvalue">GwyXY</span> *
+</td>
+<td class="function_name">
+<a class="link" href="GwyDataField.html#gwy-data-field-get-profile-mask" title="gwy_data_field_get_profile_mask ()">gwy_data_field_get_profile_mask</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
@@ -576,7 +608,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyDataField.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -591,7 +623,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyDataField.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -648,7 +680,7 @@ you may need to explicitely invalidate cached values to let
 <a class="link" href="libgwyprocess-stats.html#gwy-data-field-get-max" title="gwy_data_field_get_max ()"><code class="function">gwy_data_field_get_max()</code></a> know it has to recompute the maximum.</p>
 <div class="refsect3">
 <a name="gwy-data-field-invalidate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -672,7 +704,7 @@ typecasting.</p>
 resolutions and units.</p>
 <div class="refsect3">
 <a name="gwy-data-field-duplicate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -698,7 +730,7 @@ gwy_data_field_new (<em class="parameter"><code><a href="/usr/share/gtk-doc/html
 <p>Creates a new data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -750,7 +782,7 @@ gwy_data_field_new_alike (<em class="parameter"><code><a class="link" href="GwyD
 data.</p>
 <div class="refsect3">
 <a name="gwy-data-field-new-alike.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -784,7 +816,7 @@ gwy_data_field_data_changed (<em class="parameter"><code><a class="link" href="G
 <p>Emits signal "data-changed" on a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-data-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -811,7 +843,7 @@ gwy_data_field_new_resampled (<em class="parameter"><code><a class="link" href="
 <a class="link" href="GwyDataField.html#gwy-data-field-resample" title="gwy_data_field_resample ()"><code class="function">gwy_data_field_resample()</code></a>, but it is more efficient.</p>
 <div class="refsect3">
 <a name="gwy-data-field-new-resampled.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -859,7 +891,7 @@ gwy_data_field_resample (<em class="parameter"><code><a class="link" href="GwyDa
 <a class="link" href="GwyDataField.html#gwy-data-field-get-data" title="gwy_data_field_get_data ()"><code class="function">gwy_data_field_get_data()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-resample.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -906,7 +938,7 @@ points, recomputing real size.</p>
 <a class="link" href="GwyDataField.html#gwy-data-field-get-data" title="gwy_data_field_get_data ()"><code class="function">gwy_data_field_get_data()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-resize.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -954,7 +986,7 @@ gwy_data_field_area_extract (<em class="parameter"><code><a class="link" href="G
 <p>Extracts a rectangular part of a data field to a new data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-extract.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1005,7 +1037,7 @@ gwy_data_field_copy (<em class="parameter"><code><a class="link" href="GwyDataFi
 of the same size.</p>
 <div class="refsect3">
 <a name="gwy-data-field-copy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1064,7 +1096,7 @@ out the destination data field <em class="parameter"><code>dest</code></em>
 , the areas may not overlap.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-copy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1135,7 +1167,7 @@ field life time.  Some function may change it, most notably
 <p>See <a class="link" href="GwyDataField.html#gwy-data-field-invalidate" title="gwy_data_field_invalidate ()"><code class="function">gwy_data_field_invalidate()</code></a> for some discussion.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1169,7 +1201,7 @@ field life time.  Some function may change it, most notably
 <p>See <a class="link" href="GwyDataField.html#gwy-data-field-invalidate" title="gwy_data_field_invalidate ()"><code class="function">gwy_data_field_invalidate()</code></a> for some discussion.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-data-const.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1198,7 +1230,7 @@ gwy_data_field_get_xres (<em class="parameter"><code><a class="link" href="GwyDa
 <p>Gets X resolution (number of columns) of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-xres.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1224,7 +1256,7 @@ gwy_data_field_get_yres (<em class="parameter"><code><a class="link" href="GwyDa
 <p>Gets Y resolution (number of rows) of the field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-yres.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1250,7 +1282,7 @@ gwy_data_field_get_xreal (<em class="parameter"><code><a class="link" href="GwyD
 <p>Gets the X real (physical) size of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-xreal.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1276,7 +1308,7 @@ gwy_data_field_get_yreal (<em class="parameter"><code><a class="link" href="GwyD
 <p>Gets the Y real (physical) size of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-yreal.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1303,7 +1335,7 @@ gwy_data_field_set_xreal (<em class="parameter"><code><a class="link" href="GwyD
 <p>Sets X real (physical) size value of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-set-xreal.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1333,7 +1365,7 @@ gwy_data_field_set_yreal (<em class="parameter"><code><a class="link" href="GwyD
 <p>Sets Y real (physical) size value of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-set-yreal.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1362,7 +1394,7 @@ gwy_data_field_set_yreal (<em class="parameter"><code><a class="link" href="GwyD
 gwy_data_field_get_xreal(data_field)/gwy_data_field_get_xres(data_field).</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-xmeasure.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1384,7 +1416,7 @@ gwy_data_field_get_xreal(data_field)/gwy_data_field_get_xres(data_field).</p>
 gwy_data_field_get_yreal(data_field)/gwy_data_field_get_yres(data_field).</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-ymeasure.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1406,7 +1438,7 @@ gwy_data_field_get_xoffset (<em class="parameter"><code><a class="link" href="Gw
 <p>Gets the X offset of data field origin.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-xoffset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1432,7 +1464,7 @@ gwy_data_field_get_yoffset (<em class="parameter"><code><a class="link" href="Gw
 <p>Gets the Y offset of data field origin.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-yoffset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1461,7 +1493,7 @@ gwy_data_field_set_xoffset (<em class="parameter"><code><a class="link" href="Gw
 <a class="link" href="GwyDataField.html#gwy-data-field-rtoj" title="gwy_data_field_rtoj ()"><code class="function">gwy_data_field_rtoj()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-set-xoffset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1493,7 +1525,7 @@ gwy_data_field_set_yoffset (<em class="parameter"><code><a class="link" href="Gw
 <a class="link" href="GwyDataField.html#gwy-data-field-rtoi" title="gwy_data_field_rtoi ()"><code class="function">gwy_data_field_rtoi()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-set-yoffset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1522,7 +1554,7 @@ gwy_data_field_get_si_unit_xy (<em class="parameter"><code><a class="link" href=
 <p>Returns lateral SI unit of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-si-unit-xy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1549,7 +1581,7 @@ gwy_data_field_get_si_unit_z (<em class="parameter"><code><a class="link" href="
 <p>Returns value SI unit of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-si-unit-z.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1581,7 +1613,7 @@ field.</p>
 reference.</p>
 <div class="refsect3">
 <a name="gwy-data-field-set-si-unit-xy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1615,7 +1647,7 @@ field.</p>
 reference.</p>
 <div class="refsect3">
 <a name="gwy-data-field-set-si-unit-z.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1646,7 +1678,7 @@ gwy_data_field_get_value_format_xy (<em class="parameter"><code><a class="link"
 <p>Finds value format good for displaying coordinates of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-value-format-xy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1689,7 +1721,7 @@ gwy_data_field_get_value_format_z (<em class="parameter"><code><a class="link" h
 <p>Finds value format good for displaying values of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-value-format-z.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1724,6 +1756,37 @@ itself is returned.</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-data-field-copy-units"></a><h3>gwy_data_field_copy_units ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_data_field_copy_units (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>,
+                           <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *target</code></em>);</pre>
+<p>Sets lateral and value units of a data field to match another data field.</p>
+<div class="refsect3">
+<a name="gwy-data-field-copy-units.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>data_field</p></td>
+<td class="parameter_description"><p>A data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>target</p></td>
+<td class="parameter_description"><p>Target data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-data-field-copy-units-to-data-line"></a><h3>gwy_data_field_copy_units_to_data_line ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_field_copy_units_to_data_line
@@ -1732,7 +1795,7 @@ gwy_data_field_copy_units_to_data_line
 <p>Sets lateral and value units of a data line to match a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-copy-units-to-data-line.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1763,7 +1826,7 @@ gwy_data_line_copy_units_to_data_field
 <p>Sets lateral and value units of a data field to match a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-copy-units-to-data-field.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1798,7 +1861,7 @@ you have to use gwy_data_field_itor(<em class="parameter"><code>data_field</code
  + 0.5) for that.</p>
 <div class="refsect3">
 <a name="gwy-data-field-itor.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1837,7 +1900,7 @@ you have to use gwy_data_field_jtor(<em class="parameter"><code>data_field</code
  + 0.5) for that.</p>
 <div class="refsect3">
 <a name="gwy-data-field-jtor.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1872,7 +1935,7 @@ gwy_data_field_rtoi (<em class="parameter"><code><a class="link" href="GwyDataFi
 <p>That is it maps range [0..real-y-size] to range [0..y-resolution].</p>
 <div class="refsect3">
 <a name="gwy-data-field-rtoi.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1907,7 +1970,7 @@ gwy_data_field_rtoj (<em class="parameter"><code><a class="link" href="GwyDataFi
 <p>That is it maps range [0..real-x-size] to range [0..x-resolution].</p>
 <div class="refsect3">
 <a name="gwy-data-field-rtoj.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1945,7 +2008,7 @@ Get the raw data buffer with <a class="link" href="GwyDataField.html#gwy-data-fi
 directly instead.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-val.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1991,7 +2054,7 @@ raw data buffer with <a class="link" href="GwyDataField.html#gwy-data-field-get-
 instead.</p>
 <div class="refsect3">
 <a name="gwy-data-field-set-val.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2047,7 +2110,7 @@ gwy_data_field_get_dval(<em class="parameter"><code>data_field</code></em>
 real coordinates.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-dval.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2098,7 +2161,7 @@ coordinates.</p>
 coordinates.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-dval-real.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2144,7 +2207,7 @@ gwy_data_field_rotate (<em class="parameter"><code><a class="link" href="GwyData
                        <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyInterpolationType" title="enum GwyInterpolationType"><span class="type">GwyInterpolationType</span></a> interpolation</code></em>);</pre>
 <p>Rotates a data field by a given angle.</p>
 <p>This function is mostly obsolete.  See <a class="link" href="GwyDataField.html#gwy-data-field-new-rotated" title="gwy_data_field_new_rotated ()"><code class="function">gwy_data_field_new_rotated()</code></a>
-and <code class="function">gwy_data_field_rotated_90()</code>.</p>
+and <a class="link" href="GwyDataField.html#gwy-data-field-new-rotated-90" title="gwy_data_field_new_rotated_90 ()"><code class="function">gwy_data_field_new_rotated_90()</code></a>.</p>
 <p>Values that get outside of data field by the rotation are lost.
 Undefined values from outside of data field that get inside are set to
 data field minimum value.</p>
@@ -2152,7 +2215,7 @@ data field minimum value.</p>
 general affine transform in the real coordinates when pixels are not square.</p>
 <div class="refsect3">
 <a name="gwy-data-field-rotate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2201,12 +2264,12 @@ See <a class="link" href="GwyDataField.html#gwy-data-field-rotate" title="gwy_da
 <p>The returned data field has usually square pixels, the exception being when
 <em class="parameter"><code>angle</code></em>
  is a multiple of <a href="/usr/share/gtk-doc/html/glibglib-Numerical-Definitions.html#G-PI:CAPS"><code class="literal">G_PI</code></a>/2 when the function reduces to
-<code class="function">gwy_data_field_rotated_90()</code> and original pixels are preserved.  This is of
-concern only when <em class="parameter"><code>dfield</code></em>
+<a class="link" href="GwyDataField.html#gwy-data-field-new-rotated-90" title="gwy_data_field_new_rotated_90 ()"><code class="function">gwy_data_field_new_rotated_90()</code></a> and original pixels are preserved.  This is
+of concern only when <em class="parameter"><code>dfield</code></em>
  has non-square pixels.</p>
 <div class="refsect3">
 <a name="gwy-data-field-new-rotated.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2258,7 +2321,7 @@ gwy_data_field_new_rotated_90 (<em class="parameter"><code><a class="link" href=
 <p>Creates a new data field by rotating a data field by 90 degrees.</p>
 <div class="refsect3">
 <a name="gwy-data-field-new-rotated-90.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2296,7 +2359,7 @@ gwy_data_field_invert (<em class="parameter"><code><a class="link" href="GwyData
 <p>In the case of value reflection, it's inverted about the mean value.</p>
 <div class="refsect3">
 <a name="gwy-data-field-invert.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2310,12 +2373,12 @@ gwy_data_field_invert (<em class="parameter"><code><a class="link" href="GwyData
 </tr>
 <tr>
 <td class="parameter_name"><p>x</p></td>
-<td class="parameter_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to reflect about X axis (i.e., vertically).</p></td>
+<td class="parameter_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to reflect about X axis (i.e., invert columns vertically).</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>y</p></td>
-<td class="parameter_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to reflect about Y axis (i.e., horizontally).</p></td>
+<td class="parameter_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to reflect about Y axis (i.e., invert rows horizontally).</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -2329,6 +2392,119 @@ gwy_data_field_invert (<em class="parameter"><code><a class="link" href="GwyData
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-data-field-flip-xy"></a><h3>gwy_data_field_flip_xy ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_data_field_flip_xy (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *src</code></em>,
+                        <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *dest</code></em>,
+                        <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> minor</code></em>);</pre>
+<p>Copies data from one data field to another with transposition.</p>
+<p>The destination data field is resized as necessary, its real dimensions set
+to transposed <em class="parameter"><code>src</code></em>
+ dimensions and its offsets are reset.  Units are not
+updated.</p>
+<div class="refsect3">
+<a name="gwy-data-field-flip-xy.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>src</p></td>
+<td class="parameter_description"><p>Source data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>dest</p></td>
+<td class="parameter_description"><p>Destination data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>minor</p></td>
+<td class="parameter_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to mirror about the minor diagonal; <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> to mirror about
+major diagonal.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-data-field-area-flip-xy"></a><h3>gwy_data_field_area_flip_xy ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_data_field_area_flip_xy (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *src</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> col</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> row</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> width</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> height</code></em>,
+                             <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *dest</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> minor</code></em>);</pre>
+<p>Copies data from a rectangular part of one data field to another with
+transposition.</p>
+<p>The destination data field is resized as necessary, its real dimensions set
+to transposed <em class="parameter"><code>src</code></em>
+ area dimensions and its offsets are reset.  Units are not
+updated.</p>
+<div class="refsect3">
+<a name="gwy-data-field-area-flip-xy.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>src</p></td>
+<td class="parameter_description"><p>Source data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>col</p></td>
+<td class="parameter_description"><p>Upper-left column coordinate in <em class="parameter"><code>src</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>row</p></td>
+<td class="parameter_description"><p>Upper-left row coordinate in <em class="parameter"><code>src</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>width</p></td>
+<td class="parameter_description"><p>Area width (number of columns) in <em class="parameter"><code>src</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>height</p></td>
+<td class="parameter_description"><p>Area height (number of rows) in <em class="parameter"><code>src</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>dest</p></td>
+<td class="parameter_description"><p>Destination data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>minor</p></td>
+<td class="parameter_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to mirror about the minor diagonal; <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> to mirror about
+major diagonal.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-data-field-fill"></a><h3>gwy_data_field_fill ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_field_fill (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>,
@@ -2336,7 +2512,7 @@ gwy_data_field_fill (<em class="parameter"><code><a class="link" href="GwyDataFi
 <p>Fills a data field with given value.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fill.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2365,7 +2541,7 @@ gwy_data_field_clear (<em class="parameter"><code><a class="link" href="GwyDataF
 <p>Fills a data field with zeroes.</p>
 <div class="refsect3">
 <a name="gwy-data-field-clear.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2388,7 +2564,7 @@ gwy_data_field_multiply (<em class="parameter"><code><a class="link" href="GwyDa
 <p>Multiplies all values in a data field by given value.</p>
 <div class="refsect3">
 <a name="gwy-data-field-multiply.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2419,7 +2595,7 @@ gwy_data_field_add (<em class="parameter"><code><a class="link" href="GwyDataFie
 <p>Adds given value to all values in a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-add.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2453,7 +2629,7 @@ gwy_data_field_area_fill (<em class="parameter"><code><a class="link" href="GwyD
 <p>Fills a rectangular part of a data field with given value.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-fill.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2509,7 +2685,7 @@ gwy_data_field_area_fill_mask (<em class="parameter"><code><a class="link" href=
 <p>Fills a masked rectangular part of a data field with given value.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-fill-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2574,7 +2750,7 @@ gwy_data_field_area_clear (<em class="parameter"><code><a class="link" href="Gwy
 <p>Fills a rectangular part of a data field with zeroes.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-clear.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2623,7 +2799,7 @@ gwy_data_field_area_multiply (<em class="parameter"><code><a class="link" href="
 <p>Multiplies values in a rectangular part of a data field by given value</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-multiply.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2677,7 +2853,7 @@ gwy_data_field_area_add (<em class="parameter"><code><a class="link" href="GwyDa
 <p>Adds given value to all values in a rectangular part of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-add.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2734,7 +2910,7 @@ gwy_data_field_get_profile (<em class="parameter"><code><a class="link" href="Gw
 <p>Extracts a possibly averaged profile from data field to a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-profile.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2803,6 +2979,99 @@ data line.</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-data-field-get-profile-mask"></a><h3>gwy_data_field_get_profile_mask ()</h3>
+<pre class="programlisting"><span class="returnvalue">GwyXY</span> *
+gwy_data_field_get_profile_mask (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>,
+                                 <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> *ndata</code></em>,
+                                 <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *mask</code></em>,
+                                 <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyMaskingType" title="enum GwyMaskingType"><span class="type">GwyMaskingType</span></a> masking</code></em>,
+                                 <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> xfrom</code></em>,
+                                 <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> yfrom</code></em>,
+                                 <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> xto</code></em>,
+                                 <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> yto</code></em>,
+                                 <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> res</code></em>,
+                                 <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> thickness</code></em>,
+                                 <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyInterpolationType" title="enum GwyInterpolationType"><span class="type">GwyInterpolationType</span></a> interpolation</code></em>);</pre>
+<p>Extracts a possibly averaged profile from data field, with masking.</p>
+<p>The extracted profile can contain holes due to masking.  It can also contain
+no points at all if the all data values along the profile were excluded due
+to masking – in this case <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> is returned.</p>
+<p>Unlike <a class="link" href="GwyDataField.html#gwy-data-field-get-profile" title="gwy_data_field_get_profile ()"><code class="function">gwy_data_field_get_profile()</code></a>, this function takes real coordinates
+(without offsets), not row and column indices.</p>
+<div class="refsect3">
+<a name="gwy-data-field-get-profile-mask.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>data_field</p></td>
+<td class="parameter_description"><p>A data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>ndata</p></td>
+<td class="parameter_description"><p>Location where to store the actual number of extracted points, which
+may differ from <em class="parameter"><code>res</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>xfrom</p></td>
+<td class="parameter_description"><p>The real <em class="parameter"><code>x</code></em>
+-coordinate where the line starts.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>yfrom</p></td>
+<td class="parameter_description"><p>The real <em class="parameter"><code>y</code></em>
+-coordinate where line starts.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>xto</p></td>
+<td class="parameter_description"><p>The real <em class="parameter"><code>x</code></em>
+-coordinate where the line ends.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>yto</p></td>
+<td class="parameter_description"><p>The real <em class="parameter"><code>y</code></em>
+-coordinate where line ends.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>res</p></td>
+<td class="parameter_description"><p>Requested resolution, i.e. the number of samples to take.
+If nonpositive, sampling is chosen to match <em class="parameter"><code>data_field</code></em>
+'s.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>thickness</p></td>
+<td class="parameter_description"><p>Thickness of line to be averaged.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>interpolation</p></td>
+<td class="parameter_description"><p>Interpolation type to use.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-data-field-get-profile-mask.returns"></a><h4>Returns</h4>
+<p> A newly allocated array of <span class="type">GwyXY</span> coordinare pairs, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.
+The caller must free the returned array with <a href="/usr/share/gtk-doc/html/glibglib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a>.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-data-field-get-row"></a><h3>gwy_data_field_get_row ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_field_get_row (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>,
@@ -2811,7 +3080,7 @@ gwy_data_field_get_row (<em class="parameter"><code><a class="link" href="GwyDat
 <p>Extracts a data field row into a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-row.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2848,7 +3117,7 @@ gwy_data_field_get_column (<em class="parameter"><code><a class="link" href="Gwy
 <p>Extracts a data field column into a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-column.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2886,7 +3155,7 @@ gwy_data_field_set_row (<em class="parameter"><code><a class="link" href="GwyDat
 <p>Data line length must be equal to width of data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-set-row.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2923,7 +3192,7 @@ gwy_data_field_set_column (<em class="parameter"><code><a class="link" href="Gwy
 <p>Data line length must be equal to height of data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-set-column.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2961,7 +3230,7 @@ gwy_data_field_get_row_part (<em class="parameter"><code><a class="link" href="G
 <p>Extracts part of a data field row into a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-row-part.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3009,7 +3278,7 @@ gwy_data_field_get_column_part (<em class="parameter"><code><a class="link" href
 <p>Extracts part of a data field column into a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-column-part.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3060,7 +3329,7 @@ gwy_data_field_set_row_part (<em class="parameter"><code><a class="link" href="G
 , it is resampled to this length.</p>
 <div class="refsect3">
 <a name="gwy-data-field-set-row-part.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3111,7 +3380,7 @@ gwy_data_field_set_column_part (<em class="parameter"><code><a class="link" href
 , it is resampled to this length.</p>
 <div class="refsect3">
 <a name="gwy-data-field-set-column-part.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3158,7 +3427,7 @@ gwy_data_field_get_xder (<em class="parameter"><code><a class="link" href="GwyDa
 <p>On border points, one-side derivative is returned.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-xder.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3202,7 +3471,7 @@ y direction than is usual elsewhere in Gwyddion, i.e. if values increase
 with increasing row number, the returned value is negative.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-yder.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3243,7 +3512,7 @@ gwy_data_field_get_angder (<em class="parameter"><code><a class="link" href="Gwy
 <p>Computes derivative in direction specified by given angle.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-angder.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3302,7 +3571,7 @@ or by just being completely off) <em class="parameter"><code>data_field</code></
 the value of the closest point or something similar.</p>
 <div class="refsect3">
 <a name="gwy-data-field-average-xyz.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3368,7 +3637,7 @@ is intended as a means to notify others data field users they should
 update themselves.</p>
 <div class="refsect3">
 <a name="GwyDataField-data-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/GwyDataLine.html b/devel-docs/libgwyprocess/html/GwyDataLine.html
index 418ae27..ef22647 100644
--- a/devel-docs/libgwyprocess/html/GwyDataLine.html
+++ b/devel-docs/libgwyprocess/html/GwyDataLine.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyDataLine: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyDataLine.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -217,6 +217,14 @@
 </tr>
 <tr>
 <td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="GwyDataLine.html#gwy-data-line-copy-units" title="gwy_data_line_copy_units ()">gwy_data_line_copy_units</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
 </td>
 <td class="function_name">
@@ -444,7 +452,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyDataLine.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -459,7 +467,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyDataLine.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -507,7 +515,7 @@ the data processing functions connected with 1D data, graphs, etc.</p>
 typecasting.</p>
 <div class="refsect3">
 <a name="gwy-data-line-duplicate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -531,7 +539,7 @@ gwy_data_line_new (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/
 <p>Creates a new data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-new.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -573,7 +581,7 @@ gwy_data_line_new_alike (<em class="parameter"><code><a class="link" href="GwyDa
 data.</p>
 <div class="refsect3">
 <a name="gwy-data-line-new-alike.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -607,7 +615,7 @@ gwy_data_line_data_changed (<em class="parameter"><code><a class="link" href="Gw
 <p>Emits signal "data_changed" on a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-data-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -633,7 +641,7 @@ gwy_data_line_new_resampled (<em class="parameter"><code><a class="link" href="G
 <a class="link" href="GwyDataLine.html#gwy-data-line-resample" title="gwy_data_line_resample ()"><code class="function">gwy_data_line_resample()</code></a>, but it is more efficient.</p>
 <div class="refsect3">
 <a name="gwy-data-line-new-resampled.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -677,7 +685,7 @@ line. The original values are used for resampling using a requested
 interpolation alorithm.</p>
 <div class="refsect3">
 <a name="gwy-data-line-resample.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -717,7 +725,7 @@ gwy_data_line_resize (<em class="parameter"><code><a class="link" href="GwyDataL
 sizes.</p>
 <div class="refsect3">
 <a name="gwy-data-line-resize.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -753,7 +761,7 @@ gwy_data_line_part_extract (<em class="parameter"><code><a class="link" href="Gw
 <p>Extracts a part of a data line to a new data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-extract.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -788,14 +796,14 @@ gwy_data_line_part_extract (<em class="parameter"><code><a class="link" href="Gw
 <a name="gwy-data-line-copy"></a><h3>gwy_data_line_copy ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_line_copy (<em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *data_line</code></em>,
-                    <em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *b</code></em>);</pre>
+                    <em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *target</code></em>);</pre>
 <p>Copies the contents of a data line to another already allocated data line
 of the same size.</p>
 <div class="warning">Semantic of method differs from <a class="link" href="GwyDataField.html#gwy-data-field-copy" title="gwy_data_field_copy ()"><code class="function">gwy_data_field_copy()</code></a>, it copies
 only data.  It will be probably changed.</div>
 <div class="refsect3">
 <a name="gwy-data-line-copy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -808,7 +816,7 @@ only data.  It will be probably changed.</div>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
-<td class="parameter_name"><p>b</p></td>
+<td class="parameter_name"><p>target</p></td>
 <td class="parameter_description"><p>Destination data line.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
@@ -829,7 +837,7 @@ line life time.  Some function may change it, most notably
 <a class="link" href="GwyDataLine.html#gwy-data-line-get-data-const" title="gwy_data_line_get_data_const ()"><code class="function">gwy_data_line_get_data_const()</code></a> if you are not going to change the data.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -859,7 +867,7 @@ line life time.  Some function may change it, most notably
 <p>Use <a class="link" href="GwyDataLine.html#gwy-data-line-get-data" title="gwy_data_line_get_data ()"><code class="function">gwy_data_line_get_data()</code></a> if you want to change the data.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-data-const.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -885,7 +893,7 @@ gwy_data_line_get_res (<em class="parameter"><code><a class="link" href="GwyData
 <p>Gets the number of data points in a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-res.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -911,7 +919,7 @@ gwy_data_line_get_real (<em class="parameter"><code><a class="link" href="GwyDat
 <p>Gets the physical size of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-real.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -938,7 +946,7 @@ gwy_data_line_set_real (<em class="parameter"><code><a class="link" href="GwyDat
 <p>Sets the real data line size.</p>
 <div class="refsect3">
 <a name="gwy-data-line-set-real.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -967,7 +975,7 @@ gwy_data_line_get_offset (<em class="parameter"><code><a class="link" href="GwyD
 <p>Gets the offset of data line origin.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-offset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -996,7 +1004,7 @@ gwy_data_line_set_offset (<em class="parameter"><code><a class="link" href="GwyD
 <a class="link" href="GwyDataLine.html#gwy-data-line-rtoi" title="gwy_data_line_rtoi ()"><code class="function">gwy_data_line_rtoi()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-line-set-offset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1025,7 +1033,7 @@ gwy_data_line_get_si_unit_x (<em class="parameter"><code><a class="link" href="G
 <p>Returns lateral SI unit of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-si-unit-x.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1052,7 +1060,7 @@ gwy_data_line_get_si_unit_y (<em class="parameter"><code><a class="link" href="G
 <p>Returns value SI unit of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-si-unit-y.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1084,7 +1092,7 @@ line.</p>
 reference.</p>
 <div class="refsect3">
 <a name="gwy-data-line-set-si-unit-x.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1111,14 +1119,14 @@ reference.</p>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_line_set_si_unit_y (<em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *data_line</code></em>,
                              <em class="parameter"><code><a href="../GwySIUnit.html#GwySIUnit-struct"><span class="type">GwySIUnit</span></a> *si_unit</code></em>);</pre>
-<p>Sets the SI unit corresponding to the "height" (Z) dimension of a data
+<p>Sets the SI unit corresponding to the "height" (Y) dimension of a data
 line.</p>
 <p>It does not assume a reference on <em class="parameter"><code>si_unit</code></em>
 , instead it adds its own
 reference.</p>
 <div class="refsect3">
 <a name="gwy-data-line-set-si-unit-y.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1149,7 +1157,7 @@ gwy_data_line_get_value_format_x (<em class="parameter"><code><a class="link" hr
 <p>Finds value format good for displaying coordinates of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-value-format-x.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1195,7 +1203,7 @@ gwy_data_line_get_value_format_y (<em class="parameter"><code><a class="link" hr
 therefore it's relatively slow.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-value-format-y.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1230,6 +1238,37 @@ itself is returned.</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-data-line-copy-units"></a><h3>gwy_data_line_copy_units ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_data_line_copy_units (<em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *data_line</code></em>,
+                          <em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *target</code></em>);</pre>
+<p>Sets lateral and value units of a data line to match another data line.</p>
+<div class="refsect3">
+<a name="gwy-data-line-copy-units.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>data_line</p></td>
+<td class="parameter_description"><p>A data line.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>target</p></td>
+<td class="parameter_description"><p>Destination data line.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-data-line-itor"></a><h3>gwy_data_line_itor ()</h3>
 <pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
 gwy_data_line_itor (<em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *data_line</code></em>,
@@ -1242,7 +1281,7 @@ have to use gwy_data_line_itor(<em class="parameter"><code>data_line</code></em>
  + 0.5) for that.</p>
 <div class="refsect3">
 <a name="gwy-data-line-itor.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1278,7 +1317,7 @@ gwy_data_line_rtoi (<em class="parameter"><code><a class="link" href="GwyDataLin
 <p>That is it maps range [0..real-size] to range [0..resolution].</p>
 <div class="refsect3">
 <a name="gwy-data-line-rtoi.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1316,7 +1355,7 @@ Get raw data buffer with <a class="link" href="GwyDataLine.html#gwy-data-line-ge
 directly instead.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-val.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1353,7 +1392,7 @@ gwy_data_line_set_val (<em class="parameter"><code><a class="link" href="GwyData
 data buffer with <a class="link" href="GwyDataLine.html#gwy-data-line-get-data" title="gwy_data_line_get_data ()"><code class="function">gwy_data_line_get_data()</code></a> and write to it directly instead.</p>
 <div class="refsect3">
 <a name="gwy-data-line-set-val.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1403,7 +1442,7 @@ gwy_data_line_get_dval(<em class="parameter"><code>data_line</code></em>
 real coordinates.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-dval.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1446,7 +1485,7 @@ coordinates.</p>
 <p>See also <a class="link" href="GwyDataLine.html#gwy-data-line-get-dval" title="gwy_data_line_get_dval ()"><code class="function">gwy_data_line_get_dval()</code></a> for interpolation explanation.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-dval-real.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1487,7 +1526,7 @@ gwy_data_line_invert (<em class="parameter"><code><a class="link" href="GwyDataL
 <p>In the case of value reflection, it's inverted about mean value.</p>
 <div class="refsect3">
 <a name="gwy-data-line-invert.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1521,7 +1560,7 @@ gwy_data_line_clear (<em class="parameter"><code><a class="link" href="GwyDataLi
 <p>Fills a data line with zeroes.</p>
 <div class="refsect3">
 <a name="gwy-data-line-clear.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1544,7 +1583,7 @@ gwy_data_line_fill (<em class="parameter"><code><a class="link" href="GwyDataLin
 <p>Fills a data line with specified value.</p>
 <div class="refsect3">
 <a name="gwy-data-line-fill.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1574,7 +1613,7 @@ gwy_data_line_multiply (<em class="parameter"><code><a class="link" href="GwyDat
 <p>Multiplies all values in a data line with a specified value.</p>
 <div class="refsect3">
 <a name="gwy-data-line-multiply.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1604,7 +1643,7 @@ gwy_data_line_add (<em class="parameter"><code><a class="link" href="GwyDataLine
 <p>Adds a specified value to all values in a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-add.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1635,7 +1674,7 @@ gwy_data_line_part_clear (<em class="parameter"><code><a class="link" href="GwyD
 <p>Fills a data line part with zeroes.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-clear.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1672,7 +1711,7 @@ gwy_data_line_part_fill (<em class="parameter"><code><a class="link" href="GwyDa
 <p>Fills specified part of data line with specified number</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-fill.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1714,7 +1753,7 @@ gwy_data_line_part_multiply (<em class="parameter"><code><a class="link" href="G
 <p>Multiplies all values in a part of data line by specified value.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-multiply.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1756,7 +1795,7 @@ gwy_data_line_part_add (<em class="parameter"><code><a class="link" href="GwyDat
 <p>Adds specified value to all values in a part of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-add.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1803,7 +1842,7 @@ below or above <em class="parameter"><code>threshold</code></em>
  value</p>
 <div class="refsect3">
 <a name="gwy-data-line-threshold.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1856,7 +1895,7 @@ below or above <em class="parameter"><code>threshold</code></em>
  value.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-threshold.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1913,7 +1952,7 @@ gwy_data_line_get_line_coeffs (<em class="parameter"><code><a class="link" href=
 data[i] := data[i] - (av + bv*i);</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-line-coeffs.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1950,7 +1989,7 @@ gwy_data_line_line_level (<em class="parameter"><code><a class="link" href="GwyD
 <p>See <a class="link" href="GwyDataLine.html#gwy-data-line-get-line-coeffs" title="gwy_data_line_get_line_coeffs ()"><code class="function">gwy_data_line_get_line_coeffs()</code></a> for deails.</p>
 <div class="refsect3">
 <a name="gwy-data-line-line-level.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1989,7 +2028,7 @@ between line segments (on the other hand it introduces other deformations
 due to discretization).</p>
 <div class="refsect3">
 <a name="gwy-data-line-rotate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2028,7 +2067,7 @@ gwy_data_line_line_rotate (<em class="parameter"><code><a class="link" href="Gwy
 <p>Use <a class="link" href="GwyDataLine.html#gwy-data-line-rotate" title="gwy_data_line_rotate ()"><code class="function">gwy_data_line_rotate()</code></a> instead.</p>
 <div class="refsect3">
 <a name="gwy-data-line-line-rotate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2063,7 +2102,7 @@ gwy_data_line_get_der (<em class="parameter"><code><a class="link" href="GwyData
 <p>Computes central derivaltion at given index in a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-der.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2101,7 +2140,7 @@ gwy_data_line_part_fit_polynom (<em class="parameter"><code><a class="link" href
 <p>Please see <a class="link" href="GwyDataLine.html#gwy-data-line-fit-polynom" title="gwy_data_line_fit_polynom ()"><code class="function">gwy_data_line_fit_polynom()</code></a> for more details.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-fit-polynom.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2162,7 +2201,7 @@ are indices in the data line.</p>
 and <a class="link" href="GwyDataLine.html#gwy-data-line-get-line-coeffs" title="gwy_data_line_get_line_coeffs ()"><code class="function">gwy_data_line_get_line_coeffs()</code></a> because they are faster.</p>
 <div class="refsect3">
 <a name="gwy-data-line-fit-polynom.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2208,7 +2247,7 @@ gwy_data_line_part_subtract_polynom (<em class="parameter"><code><a class="link"
 <p>Subtracts a polynomial from a part of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-subtract-polynom.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2255,7 +2294,7 @@ gwy_data_line_subtract_polynom (<em class="parameter"><code><a class="link" href
 <p>Subtracts a polynomial from a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-subtract-polynom.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2292,7 +2331,7 @@ gwy_data_line_cumulate (<em class="parameter"><code><a class="link" href="GwyDat
 self.</p>
 <div class="refsect3">
 <a name="gwy-data-line-cumulate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2314,7 +2353,7 @@ gwy_data_line_sqrt (<em class="parameter"><code><a class="link" href="GwyDataLin
 <p>Applies <code class="function">sqrt()</code> to each element in a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-sqrt.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2360,7 +2399,7 @@ is intended as a means to notify others data line users they should
 update themselves.</p>
 <div class="refsect3">
 <a name="GwyDataLine-data-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/GwyGrainValue.html b/devel-docs/libgwyprocess/html/GwyGrainValue.html
index c09cfbb..fc32c4c 100644
--- a/devel-docs/libgwyprocess/html/GwyGrainValue.html
+++ b/devel-docs/libgwyprocess/html/GwyGrainValue.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyGrainValue: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-grains.html" title="grains">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyGrainValue.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -201,7 +201,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyGrainValue.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -256,7 +256,7 @@ gwy_grain_value_get_group (<em class="parameter"><code><a class="link" href="Gwy
 built-in grain values belong to other groups.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-get-group.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -288,7 +288,7 @@ possible to use user-defined grain quantities in expressions for other
 user-defined grain quantities.)</p>
 <div class="refsect3">
 <a name="gwy-grain-value-get-symbol.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -319,7 +319,7 @@ gwy_grain_value_set_symbol (<em class="parameter"><code><a class="link" href="Gw
 <p>See <a class="link" href="GwyGrainValue.html#gwy-grain-value-get-symbol" title="gwy_grain_value_get_symbol ()"><code class="function">gwy_grain_value_get_symbol()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-set-symbol.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -351,7 +351,7 @@ gwy_grain_value_get_symbol_markup (<em class="parameter"><code><a class="link" h
 for graph axis labels.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-get-symbol-markup.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -382,7 +382,7 @@ gwy_grain_value_set_symbol_markup (<em class="parameter"><code><a class="link" h
 <p>See <a class="link" href="GwyGrainValue.html#gwy-grain-value-get-symbol-markup" title="gwy_grain_value_get_symbol_markup ()"><code class="function">gwy_grain_value_get_symbol_markup()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-set-symbol-markup.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -416,7 +416,7 @@ horizontal plane have xy power of 1 and areas have 2, whereas volumes have
 xy power of 2 and value power of 1.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-get-power-xy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -444,7 +444,7 @@ gwy_grain_value_set_power_xy (<em class="parameter"><code><a class="link" href="
 <p>Sets the power of lateral dimensions in a grain value.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-set-power-xy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -475,7 +475,7 @@ gwy_grain_value_get_power_z (<em class="parameter"><code><a class="link" href="G
 <p>See <a class="link" href="GwyGrainValue.html#gwy-grain-value-get-power-xy" title="gwy_grain_value_get_power_xy ()"><code class="function">gwy_grain_value_get_power_xy()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-get-power-z.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -503,7 +503,7 @@ gwy_grain_value_set_power_z (<em class="parameter"><code><a class="link" href="G
 <p>Sets the power of value (height) in a grain value.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-set-power-z.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -533,7 +533,7 @@ gwy_grain_value_get_flags (<em class="parameter"><code><a class="link" href="Gwy
 <p>Obtains the special attributes of a grain quantity.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-get-flags.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -567,7 +567,7 @@ individual flags, obtain the current set with <a class="link" href="GwyGrainValu
 first and then set/unset individual flags.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-set-flags.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -598,7 +598,7 @@ gwy_grain_value_get_quantity (<em class="parameter"><code><a class="link" href="
 <p>Gets the built-in grain quantity corresponding to a grain value.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-get-quantity.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -628,7 +628,7 @@ gwy_grain_value_get_expression (<em class="parameter"><code><a class="link" href
 <p>Gets the expression of a user-defined grain value.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-get-expression.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -660,7 +660,7 @@ gwy_grain_value_set_expression (<em class="parameter"><code><a class="link" href
 <p>It is an error to call this function on a built-in quantity.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-set-expression.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -702,7 +702,7 @@ gwy_grain_value_group_name (<em class="parameter"><code><a class="link" href="Gw
 <p>Obtains the name of a grain value group.</p>
 <div class="refsect3">
 <a name="gwy-grain-value-group-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -743,7 +743,7 @@ gwy_grain_values_get_grain_value (<em class="parameter"><code>const <a href="/us
 name.</p>
 <div class="refsect3">
 <a name="gwy-grain-values-get-grain-value.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -774,7 +774,7 @@ gwy_grain_values_get_grain_value_by_symbol
 its symbol.</p>
 <div class="refsect3">
 <a name="gwy-grain-values-get-grain-value-by-symbol.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -804,7 +804,7 @@ gwy_grain_values_get_builtin_grain_value
 <p>Obtains the built-in grain value corresponding to given enum value.</p>
 <div class="refsect3">
 <a name="gwy-grain-values-get-builtin-grain-value.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -840,7 +840,7 @@ gwy_grain_values_calculate (<em class="parameter"><code><a href="/usr/share/gtk-
 for built-in grain values.</p>
 <div class="refsect3">
 <a name="gwy-grain-values-calculate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -913,7 +913,7 @@ are not used, but its dimensions determine the dimensions of
 <a name="GwyGrainValueGroup"></a><h3>enum GwyGrainValueGroup</h3>
 <div class="refsect3">
 <a name="GwyGrainValueGroup.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -980,7 +980,7 @@ are not used, but its dimensions determine the dimensions of
 <p>Special attributes of grain values.</p>
 <div class="refsect3">
 <a name="GwyGrainValueFlags.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwyprocess/html/GwyShapeFitPreset.html b/devel-docs/libgwyprocess/html/GwyShapeFitPreset.html
index 847d49f..fb154d1 100644
--- a/devel-docs/libgwyprocess/html/GwyShapeFitPreset.html
+++ b/devel-docs/libgwyprocess/html/GwyShapeFitPreset.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwyShapeFitPreset: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-peaks.html" title="peaks">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyShapeFitPreset.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -184,6 +184,14 @@
 </tr>
 <tr>
 <td class="function_type">
+<a href="../libgwyddion-GwyNLFitter.html#GwyNLFitter"><span class="returnvalue">GwyNLFitter</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="GwyShapeFitPreset.html#gwy-shape-fit-preset-quick-fit" title="gwy_shape_fit_preset_quick_fit ()">gwy_shape_fit_preset_quick_fit</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <a href="../GwyInventory.html#GwyInventory-struct"><span class="returnvalue">GwyInventory</span></a> *
 </td>
 <td class="function_name">
@@ -195,7 +203,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyShapeFitPreset.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -255,7 +263,7 @@ and value units.</p>
 vertical radii would be different physical quantities.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-needs-same-units.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -282,7 +290,7 @@ gwy_shape_fit_preset_get_nparams (<em class="parameter"><code><a class="link" hr
 <p>Reports the number of parameters of a 3D geometrical shape fitter preset.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-get-nparams.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -312,7 +320,7 @@ preset.</p>
 <p>The name may contain Pango markup.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-get-param-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -349,7 +357,7 @@ gwy_shape_fit_preset_get_param_flags (<em class="parameter"><code><a class="link
 preset.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-get-param-flags.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -391,7 +399,7 @@ If you want to convert them to degrees for presentation to the user you must
 do it explicitly.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-get-param-units.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -437,7 +445,7 @@ gwy_shape_fit_preset_get_nsecondary (<em class="parameter"><code><a class="link"
 shape fitter preset.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-get-nsecondary.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -468,7 +476,7 @@ fitter preset.</p>
 <p>The name may contain Pango markup.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-get-secondary-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -506,7 +514,7 @@ gwy_shape_fit_preset_get_secondary_flags
 shape fitter preset.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-get-secondary-flags.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -545,7 +553,7 @@ gwy_shape_fit_preset_get_secondary_value
 shape fitter preset.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-get-secondary-value.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -594,7 +602,7 @@ shape fitter preset.</p>
 applying the law of error propagation.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-get-secondary-error.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -656,7 +664,7 @@ If you want to convert them to degrees for presentation to the user you must
 do it explicitly.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-get-secondary-units.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -709,7 +717,7 @@ manual experimentation but often will not be good enough as initial
 parameter estimates for the fit.  See also <a class="link" href="GwyShapeFitPreset.html#gwy-shape-fit-preset-guess" title="gwy_shape_fit_preset_guess ()"><code class="function">gwy_shape_fit_preset_guess()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-setup.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -762,7 +770,7 @@ However, in this case they may be no better than from
 <a class="link" href="GwyShapeFitPreset.html#gwy-shape-fit-preset-setup" title="gwy_shape_fit_preset_setup ()"><code class="function">gwy_shape_fit_preset_setup()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-guess.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -813,7 +821,7 @@ point.</p>
 instead of calling this function in a cycle.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-get-value.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -868,7 +876,7 @@ used.</p>
 <p>See also <a class="link" href="GwyShapeFitPreset.html#gwy-shape-fit-preset-calculate-xyz" title="gwy_shape_fit_preset_calculate_xyz ()"><code class="function">gwy_shape_fit_preset_calculate_xyz()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-calculate-z.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -922,7 +930,7 @@ points.</p>
 <p>See also <a class="link" href="GwyShapeFitPreset.html#gwy-shape-fit-preset-calculate-z" title="gwy_shape_fit_preset_calculate_z ()"><code class="function">gwy_shape_fit_preset_calculate_z()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-calculate-xyz.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -969,7 +977,7 @@ gwy_shape_fit_preset_create_fitter (<em class="parameter"><code><a class="link"
 <a class="link" href="GwyShapeFitPreset.html#gwy-shape-fit-preset-fit" title="gwy_shape_fit_preset_fit ()"><code class="function">gwy_shape_fit_preset_fit()</code></a> directly with <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> fitter.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-create-fitter.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1010,7 +1018,7 @@ and pass to this function.  The fitter must be created for the same preset.</p>
 be obtained from the fitter. See <a href="../libgwyddion-GwyNLFitter.html#gwy-math-nlfit-fit-full"><code class="function">gwy_math_nlfit_fit_full()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-shape-fit-preset-fit.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1073,6 +1081,87 @@ itself, or a newly created fitter if it was <a href="/usr/share/gtk-doc/html/gli
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-shape-fit-preset-quick-fit"></a><h3>gwy_shape_fit_preset_quick_fit ()</h3>
+<pre class="programlisting"><a href="../libgwyddion-GwyNLFitter.html#GwyNLFitter"><span class="returnvalue">GwyNLFitter</span></a> *
+gwy_shape_fit_preset_quick_fit (<em class="parameter"><code><a class="link" href="GwyShapeFitPreset.html" title="GwyShapeFitPreset"><span class="type">GwyShapeFitPreset</span></a> *preset</code></em>,
+                                <em class="parameter"><code><a href="../libgwyddion-GwyNLFitter.html#GwyNLFitter"><span class="type">GwyNLFitter</span></a> *fitter</code></em>,
+                                <em class="parameter"><code>const <span class="type">GwyXYZ</span> *points</code></em>,
+                                <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> n</code></em>,
+                                <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *params</code></em>,
+                                <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *fixed_param</code></em>,
+                                <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *rss</code></em>);</pre>
+<p>Performs a rough non-linear least-squares fit with a 3D geometrical shape
+fitter.</p>
+<p>See <a class="link" href="GwyShapeFitPreset.html#gwy-shape-fit-preset-fit" title="gwy_shape_fit_preset_fit ()"><code class="function">gwy_shape_fit_preset_fit()</code></a> for discussion.  This functions differs by
+using a reduced number of points to perform the fit (unless the input set
+is small) and may also set fitter parameters to make the least squares
+method terminate faster.  The input points are reduced the same way as in
+<a class="link" href="GwySurface.html#gwy-surface-reduce-points" title="gwy_surface_reduce_points ()"><code class="function">gwy_surface_reduce_points()</code></a>.</p>
+<div class="refsect3">
+<a name="gwy-shape-fit-preset-quick-fit.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>preset</p></td>
+<td class="parameter_description"><p>A 3D geometrical shape fitting function.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>fitter</p></td>
+<td class="parameter_description"><p>A Marquardt-Levenberg nonlinear fitter already initialized for
+<em class="parameter"><code>preset</code></em>
+'s function, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>points</p></td>
+<td class="parameter_description"><p>Array of <em class="parameter"><code>n</code></em>
+XYZ data defining the lateral coordinates and values
+to fit.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>n</p></td>
+<td class="parameter_description"><p>Number of items in <em class="parameter"><code>points</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>params</p></td>
+<td class="parameter_description"><p>Fitting parameters filled with initial estimates (the fitting
+starts from the provided values).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>fixed_param</p></td>
+<td class="parameter_description"><p>Which parameters should be treated as fixed (set
+corresponding element to <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> for them).  May be <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if
+all parameters are free.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>rss</p></td>
+<td class="parameter_description"><p>Location to store the residual sum of squares, as returned by
+<a href="../libgwyddion-GwyNLFitter.html#gwy-math-nlfit-fit-idx"><code class="function">gwy_math_nlfit_fit_idx()</code></a>, may be <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-shape-fit-preset-quick-fit.returns"></a><h4>Returns</h4>
+<p> Either <em class="parameter"><code>fitter</code></em>
+itself, or a newly created fitter if it was <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-shape-fit-presets"></a><h3>gwy_shape_fit_presets ()</h3>
 <pre class="programlisting"><a href="../GwyInventory.html#GwyInventory-struct"><span class="returnvalue">GwyInventory</span></a> *
 gwy_shape_fit_presets (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
diff --git a/devel-docs/libgwyprocess/html/GwySpectra.html b/devel-docs/libgwyprocess/html/GwySpectra.html
index 3556d7b..d4b721e 100644
--- a/devel-docs/libgwyprocess/html/GwySpectra.html
+++ b/devel-docs/libgwyprocess/html/GwySpectra.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwySpectra: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="GwyDataField.html" title="GwyDataField">
@@ -37,7 +37,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwySpectra.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -235,7 +235,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySpectra.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="properties_type">
 <col width="300px" class="properties_name">
@@ -265,7 +265,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySpectra.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -280,7 +280,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySpectra.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -328,7 +328,7 @@ representing where in a data field the spectrum was acquired.</p>
 typecasting.</p>
 <div class="refsect3">
 <a name="gwy-spectra-duplicate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -366,7 +366,7 @@ spectra.</p>
 the spectra in it.</p>
 <div class="refsect3">
 <a name="gwy-spectra-new-alike.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -393,7 +393,7 @@ gwy_spectra_data_changed (<em class="parameter"><code><a class="link" href="GwyS
 <p>Emits signal "data_changed" on a spectra object.</p>
 <div class="refsect3">
 <a name="gwy-spectra-data-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -416,7 +416,7 @@ gwy_spectra_get_si_unit_xy (<em class="parameter"><code><a class="link" href="Gw
 <p>Gets SI unit used for the location co-ordinates of spectra.</p>
 <div class="refsect3">
 <a name="gwy-spectra-get-si-unit-xy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -449,7 +449,7 @@ object.</p>
 reference.</p>
 <div class="refsect3">
 <a name="gwy-spectra-set-si-unit-xy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -482,7 +482,7 @@ gwy_spectra_itoxy (<em class="parameter"><code><a class="link" href="GwySpectra.
 <p>Gets the coordinates of one spectrum.</p>
 <div class="refsect3">
 <a name="gwy-spectra-itoxy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -525,7 +525,7 @@ gwy_spectra_xytoi (<em class="parameter"><code><a class="link" href="GwySpectra.
 the coordinates x and y.</p>
 <div class="refsect3">
 <a name="gwy-spectra-xytoi.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -568,7 +568,7 @@ gwy_spectra_setpos (<em class="parameter"><code><a class="link" href="GwySpectra
 <p>Sets the location coordinates of a spectrum.</p>
 <div class="refsect3">
 <a name="gwy-spectra-setpos.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -608,7 +608,7 @@ gwy_spectra_get_n_spectra (<em class="parameter"><code><a class="link" href="Gwy
 <p>Gets the number of spectra in a spectra object.</p>
 <div class="refsect3">
 <a name="gwy-spectra-get-n-spectra.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -636,7 +636,7 @@ gwy_spectra_get_spectrum (<em class="parameter"><code><a class="link" href="GwyS
 <p>Gets a dataline that contains the spectrum at index i.</p>
 <div class="refsect3">
 <a name="gwy-spectra-get-spectrum.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -675,7 +675,7 @@ supplied spectrum, new_spectrum. It takes its own reference
 to the New_Spectrum dataline.</p>
 <div class="refsect3">
 <a name="gwy-spectra-set-spectrum.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -712,7 +712,7 @@ gwy_spectra_set_spectrum_selected (<em class="parameter"><code><a class="link" h
 <p>Sets selected state of a spectrum in a spectra object.</p>
 <div class="refsect3">
 <a name="gwy-spectra-set-spectrum-selected.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -748,7 +748,7 @@ gwy_spectra_get_spectrum_selected (<em class="parameter"><code><a class="link" h
 <p>Gets the selected state of a spectrum in a spectra object.</p>
 <div class="refsect3">
 <a name="gwy-spectra-get-spectrum-selected.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -788,7 +788,7 @@ given point.</p>
 <p>List positions</p>
 <div class="refsect3">
 <a name="gwy-spectra-find-nearest.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -844,7 +844,7 @@ gwy_spectra_add_spectrum (<em class="parameter"><code><a class="link" href="GwyS
 gwy_spectra_add takes a refference to the supplied spectrum.</p>
 <div class="refsect3">
 <a name="gwy-spectra-add-spectrum.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -886,7 +886,7 @@ gwy_spectra_remove_spectrum (<em class="parameter"><code><a class="link" href="G
 spectra are moved down one place.</p>
 <div class="refsect3">
 <a name="gwy-spectra-remove-spectrum.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -916,7 +916,7 @@ gwy_spectra_get_title (<em class="parameter"><code><a class="link" href="GwySpec
 <p>Gets the title of spectra.</p>
 <div class="refsect3">
 <a name="gwy-spectra-get-title.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -944,7 +944,7 @@ gwy_spectra_set_title (<em class="parameter"><code><a class="link" href="GwySpec
 <p>Sets the title of the spectra collection.</p>
 <div class="refsect3">
 <a name="gwy-spectra-set-title.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -974,7 +974,7 @@ gwy_spectra_get_spectrum_x_label (<em class="parameter"><code><a class="link" hr
 <p>Gets the spectrum abscissa label of a spectra object.</p>
 <div class="refsect3">
 <a name="gwy-spectra-get-spectrum-x-label.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1004,7 +1004,7 @@ gwy_spectra_set_spectrum_x_label (<em class="parameter"><code><a class="link" hr
 <p>Sets the spectrum abscissa label of a spectra object.</p>
 <div class="refsect3">
 <a name="gwy-spectra-set-spectrum-x-label.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1034,7 +1034,7 @@ gwy_spectra_get_spectrum_y_label (<em class="parameter"><code><a class="link" hr
 <p>Gets the spectrum ordinate label of a spectra object.</p>
 <div class="refsect3">
 <a name="gwy-spectra-get-spectrum-y-label.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1064,7 +1064,7 @@ gwy_spectra_set_spectrum_y_label (<em class="parameter"><code><a class="link" hr
 <p>Sets the spectrum ordinate label of a spectra object.</p>
 <div class="refsect3">
 <a name="gwy-spectra-set-spectrum-y-label.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1094,7 +1094,7 @@ gwy_spectra_clear (<em class="parameter"><code><a class="link" href="GwySpectra.
 <p>Removes all spectra from the collection.</p>
 <div class="refsect3">
 <a name="gwy-spectra-clear.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1170,7 +1170,7 @@ is intended as a means to notify other spectra users they should
 update themselves.</p>
 <div class="refsect3">
 <a name="GwySpectra-data-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/GwySurface.html b/devel-docs/libgwyprocess/html/GwySurface.html
index 3585862..3ee80ad 100644
--- a/devel-docs/libgwyprocess/html/GwySurface.html
+++ b/devel-docs/libgwyprocess/html/GwySurface.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwySurface: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="GwyBrick.html" title="GwyBrick">
@@ -36,7 +36,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwySurface.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -210,6 +210,14 @@
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
+<a class="link" href="GwySurface.html#gwy-surface-copy-units" title="gwy_surface_copy_units ()">gwy_surface_copy_units</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
 <a class="link" href="GwySurface.html#gwy-data-field-copy-units-to-surface" title="gwy_data_field_copy_units_to_surface ()">gwy_data_field_copy_units_to_surface</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
@@ -284,12 +292,20 @@
 <a class="link" href="GwySurface.html#gwy-surface-xy-is-compatible" title="gwy_surface_xy_is_compatible ()">gwy_surface_xy_is_compatible</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
+<tr>
+<td class="function_type">
+<a class="link" href="GwySurface.html" title="GwySurface"><span class="returnvalue">GwySurface</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="GwySurface.html#gwy-surface-reduce-points" title="gwy_surface_reduce_points ()">gwy_surface_reduce_points</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
 </tbody>
 </table></div>
 </div>
 <div class="refsect1">
 <a name="GwySurface.signals"></a><h2>Signals</h2>
-<div class="informaltable"><table border="0">
+<div class="informaltable"><table class="informaltable" border="0">
 <colgroup>
 <col width="150px" class="signals_return">
 <col width="300px" class="signals_name">
@@ -304,7 +320,7 @@
 </div>
 <div class="refsect1">
 <a name="GwySurface.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -355,7 +371,7 @@ values.</p>
 <p>This is a convenience wrapper of <a href="../GwySerializable.html#gwy-serializable-duplicate"><code class="function">gwy_serializable_duplicate()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-surface-duplicate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -378,7 +394,7 @@ values.</p>
 <p>This is a convenience wrapper of <a href="../GwySerializable.html#gwy-serializable-clone"><code class="function">gwy_serializable_clone()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-surface-clone.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -425,7 +441,7 @@ gwy_surface_new_sized (<em class="parameter"><code><a href="http://developer.gno
 values.</p>
 <div class="refsect3">
 <a name="gwy-surface-new-sized.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -453,7 +469,7 @@ gwy_surface_new_from_data (<em class="parameter"><code>const <span class="type">
 <p>Creates a new surface, filling it with provided points.</p>
 <div class="refsect3">
 <a name="gwy-surface-new-from-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -492,7 +508,7 @@ new surface will not contain any points.  Use <a class="link" href="GwySurface.h
 completely duplicate a surface including data.</p>
 <div class="refsect3">
 <a name="gwy-surface-new-alike.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -528,7 +544,7 @@ change <em class="parameter"><code>surface</code></em>
 's data and vice versa.</p>
 <div class="refsect3">
 <a name="gwy-surface-new-part.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -582,7 +598,7 @@ surface life time.</p>
 <p>See <a class="link" href="GwySurface.html#gwy-surface-invalidate" title="gwy_surface_invalidate ()"><code class="function">gwy_surface_invalidate()</code></a> for some discussion.</p>
 <div class="refsect3">
 <a name="gwy-surface-get-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -614,7 +630,7 @@ field life time.</p>
 <p>See <a class="link" href="GwySurface.html#gwy-surface-invalidate" title="gwy_surface_invalidate ()"><code class="function">gwy_surface_invalidate()</code></a> for some discussion.</p>
 <div class="refsect3">
 <a name="gwy-surface-get-data-const.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -642,7 +658,7 @@ gwy_surface_get_npoints (<em class="parameter"><code><a class="link" href="GwySu
 <p>Gets the number of points in an XYZ surface.</p>
 <div class="refsect3">
 <a name="gwy-surface-get-npoints.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -669,7 +685,7 @@ gwy_surface_data_changed (<em class="parameter"><code><a class="link" href="GwyS
 <p>Emits signal GwySurface::data-changed on a surface.</p>
 <div class="refsect3">
 <a name="gwy-surface-data-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -696,7 +712,7 @@ another, including units and change of dimensions, you can use
 <a class="link" href="GwySurface.html#gwy-surface-clone" title="gwy_surface_clone()"><code class="function">gwy_surface_clone()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-surface-copy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -731,7 +747,7 @@ in the future.</p>
 <p>See <a class="link" href="GwyDataField.html#gwy-data-field-invalidate" title="gwy_data_field_invalidate ()"><code class="function">gwy_data_field_invalidate()</code></a> for discussion of invalidation and examples.</p>
 <div class="refsect3">
 <a name="gwy-surface-invalidate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -766,7 +782,7 @@ the field needs to have identical <em class="parameter"><code>x</code></em>
  units.</p>
 <div class="refsect3">
 <a name="gwy-surface-set-from-data-field.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -799,7 +815,7 @@ gwy_surface_set_from_data_field_mask (<em class="parameter"><code><a class="link
 <p>Fills the data of a surface from a data field, possibly using masking.</p>
 <div class="refsect3">
 <a name="gwy-surface-set-from-data-field-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -839,7 +855,7 @@ gwy_surface_get_si_unit_xy (<em class="parameter"><code><a class="link" href="Gw
 <p>Returns lateral SI unit of a surface.</p>
 <div class="refsect3">
 <a name="gwy-surface-get-si-unit-xy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -867,7 +883,7 @@ gwy_surface_get_si_unit_z (<em class="parameter"><code><a class="link" href="Gwy
 <p>Returns value SI unit of a surface.</p>
 <div class="refsect3">
 <a name="gwy-surface-get-si-unit-z.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -899,7 +915,7 @@ gwy_surface_set_si_unit_xy (<em class="parameter"><code><a class="link" href="Gw
 reference.</p>
 <div class="refsect3">
 <a name="gwy-surface-set-si-unit-xy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -933,7 +949,7 @@ gwy_surface_set_si_unit_z (<em class="parameter"><code><a class="link" href="Gwy
 reference.</p>
 <div class="refsect3">
 <a name="gwy-surface-set-si-unit-z.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -965,7 +981,7 @@ gwy_surface_get_value_format_xy (<em class="parameter"><code><a class="link" hre
 <p>Finds value format good for displaying coordinates of a surface.</p>
 <div class="refsect3">
 <a name="gwy-surface-get-value-format-xy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1009,7 +1025,7 @@ gwy_surface_get_value_format_z (<em class="parameter"><code><a class="link" href
 <p>Finds value format good for displaying values of a surface.</p>
 <div class="refsect3">
 <a name="gwy-surface-get-value-format-z.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1045,6 +1061,37 @@ itself is returned.</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-surface-copy-units"></a><h3>gwy_surface_copy_units ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_surface_copy_units (<em class="parameter"><code><a class="link" href="GwySurface.html" title="GwySurface"><span class="type">GwySurface</span></a> *surface</code></em>,
+                        <em class="parameter"><code><a class="link" href="GwySurface.html" title="GwySurface"><span class="type">GwySurface</span></a> *target</code></em>);</pre>
+<p>Sets lateral and value units of a surface to match another surface.</p>
+<div class="refsect3">
+<a name="gwy-surface-copy-units.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>surface</p></td>
+<td class="parameter_description"><p>A surface.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>target</p></td>
+<td class="parameter_description"><p>Target surface.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-data-field-copy-units-to-surface"></a><h3>gwy_data_field_copy_units_to_surface ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_field_copy_units_to_surface (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>,
@@ -1052,7 +1099,7 @@ gwy_data_field_copy_units_to_surface (<em class="parameter"><code><a class="link
 <p>Sets lateral and value units of a surface to match a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-copy-units-to-surface.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1083,7 +1130,7 @@ gwy_surface_copy_units_to_data_field (<em class="parameter"><code><a class="link
 <p>Sets lateral and value units of a data field to match a surface.</p>
 <div class="refsect3">
 <a name="gwy-surface-copy-units-to-data-field.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1118,7 +1165,7 @@ is very slow compared to simply accessing <em class="parameter"><code>data</code
 C.</p>
 <div class="refsect3">
 <a name="gwy-surface-get.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1160,7 +1207,7 @@ is very slow compared to simply accessing <em class="parameter"><code>data</code
 C.</p>
 <div class="refsect3">
 <a name="gwy-surface-set.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1199,7 +1246,7 @@ gwy_surface_get_xrange (<em class="parameter"><code><a class="link" href="GwySur
 <p>This information is cached.</p>
 <div class="refsect3">
 <a name="gwy-surface-get-xrange.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1237,7 +1284,7 @@ gwy_surface_get_yrange (<em class="parameter"><code><a class="link" href="GwySur
 <p>This information is cached.</p>
 <div class="refsect3">
 <a name="gwy-surface-get-yrange.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1275,7 +1322,7 @@ gwy_surface_get_min_max (<em class="parameter"><code><a class="link" href="GwySu
 <p>This information is cached.</p>
 <div class="refsect3">
 <a name="gwy-surface-get-min-max.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1315,7 +1362,7 @@ in language bindings.</p>
 's data.</p>
 <div class="refsect3">
 <a name="gwy-surface-get-data-full.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1352,7 +1399,7 @@ gwy_surface_set_data_full (<em class="parameter"><code><a class="link" href="Gwy
 <p>See <a class="link" href="GwySurface.html#gwy-surface-get-data-full" title="gwy_surface_get_data_full ()"><code class="function">gwy_surface_get_data_full()</code></a> for a discussion.</p>
 <div class="refsect3">
 <a name="gwy-surface-set-data-full.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1399,7 +1446,7 @@ match the points order in the two surfaces to make this possible.</p>
 <p>This information is cached.</p>
 <div class="refsect3">
 <a name="gwy-surface-xy-is-compatible.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1426,6 +1473,50 @@ are not.</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-45.html#api-index-2.45">2.45</a></p>
 </div>
+<hr>
+<div class="refsect2">
+<a name="gwy-surface-reduce-points"></a><h3>gwy_surface_reduce_points ()</h3>
+<pre class="programlisting"><a class="link" href="GwySurface.html" title="GwySurface"><span class="returnvalue">GwySurface</span></a> *
+gwy_surface_reduce_points (<em class="parameter"><code><a class="link" href="GwySurface.html" title="GwySurface"><span class="type">GwySurface</span></a> *surface</code></em>,
+                           <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> npoints</code></em>);</pre>
+<p>Creates a similar surface with smaller number of points.</p>
+<p>The functions attempts to choose points from the original surface to cover
+its full area, even though points from dense regions are still more likely
+to be found in the result than points from sparse regions.  As the main
+purpose to enable quick rough operations that may take long time with the
+full surface, the focus is on speed not fidelity.</p>
+<p>The function may employ random selection and thus be be non-deterministic.</p>
+<div class="refsect3">
+<a name="gwy-surface-reduce-points.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>surface</p></td>
+<td class="parameter_description"><p>A surface.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>npoints</p></td>
+<td class="parameter_description"><p>Requested number of points in the reduced surface.  If it is not
+smaller than the number of points in <em class="parameter"><code>surface</code></em>
+then the function
+behaves like <a class="link" href="GwySurface.html#gwy-surface-duplicate" title="gwy_surface_duplicate()"><code class="function">gwy_surface_duplicate()</code></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-surface-reduce-points.returns"></a><h4>Returns</h4>
+<p> A newly created <a class="link" href="GwySurface.html" title="GwySurface"><span class="type">GwySurface</span></a> with reduced number of points.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
 </div>
 <div class="refsect1">
 <a name="GwySurface.other_details"></a><h2>Types and Values</h2>
@@ -1441,7 +1532,7 @@ are not.</p>
 accessed for reading.  To set them, you must use the <a class="link" href="GwySurface.html" title="GwySurface"><span class="type">GwySurface</span></a> methods.</p>
 <div class="refsect3">
 <a name="GwySurface.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
@@ -1488,7 +1579,7 @@ is intended as a means to notify others data field users they should
 update themselves.</p>
 <div class="refsect3">
 <a name="GwySurface-data-changed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/GwyTriangulation.html b/devel-docs/libgwyprocess/html/GwyTriangulation.html
index 242eaed..2863c51 100644
--- a/devel-docs/libgwyprocess/html/GwyTriangulation.html
+++ b/devel-docs/libgwyprocess/html/GwyTriangulation.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>triangulation: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-tip.html" title="tip">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="GwyTriangulation.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -109,7 +109,7 @@
 </div>
 <div class="refsect1">
 <a name="GwyTriangulation.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -187,7 +187,7 @@ returned by methods such as <a class="link" href="GwyTriangulation.html#gwy-tria
 then.</p>
 <div class="refsect3">
 <a name="gwy-triangulation-triangulate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -249,7 +249,7 @@ providing user feedback for large triangulations and cancelling the
 procedure upon request.</p>
 <div class="refsect3">
 <a name="gwy-triangulation-triangulate-iterative.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -316,7 +316,7 @@ offsets of <em class="parameter"><code>dfield</code></em>
 .</p>
 <div class="refsect3">
 <a name="gwy-triangulation-interpolate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -365,7 +365,7 @@ gwy_triangulation_data_free (<em class="parameter"><code><a class="link" href="G
 members as they are owned by the triangulation object.</p>
 <div class="refsect3">
 <a name="gwy-triangulation-data-free.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -392,7 +392,7 @@ gwy_triangulation_delaunay (<em class="parameter"><code><a class="link" href="Gw
 <a class="link" href="GwyTriangulation.html#gwy-triangulation-triangulate" title="gwy_triangulation_triangulate ()"><code class="function">gwy_triangulation_triangulate()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-triangulation-delaunay.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -433,7 +433,7 @@ and <a class="link" href="GwyTriangulation.html#GWY-TRIANGULATION-NONE:CAPS" tit
 [] lists sequentially the boundary points.</p>
 <div class="refsect3">
 <a name="gwy-triangulation-boundary.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -483,7 +483,7 @@ obtain the real position in <em class="parameter"><code>vpoints</code></em>
 point numbering.</p>
 <div class="refsect3">
 <a name="gwy-triangulation-voronoi.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -579,7 +579,7 @@ provided here.  See the descriptions of individual methods returning
 <a class="link" href="GwyTriangulation.html#GwyTriangulationData" title="GwyTriangulationData"><span class="type">GwyTriangulationData</span></a>.</p>
 <div class="refsect3">
 <a name="GwyTriangulationData.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-1.html b/devel-docs/libgwyprocess/html/api-index-2-1.html
index 32ef3fc..ce4a5ec 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-1.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-1.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.1: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-deprec.html" title="Index of deprecated symbols">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-11.html b/devel-docs/libgwyprocess/html/api-index-2-11.html
index c74c6f5..e0b4ae6 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-11.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-11.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.11: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-8.html" title="Index of new symbols in 2.8">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-12.html b/devel-docs/libgwyprocess/html/api-index-2-12.html
index 06aab18..62627e5 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-12.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-12.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.12: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-11.html" title="Index of new symbols in 2.11">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-18.html b/devel-docs/libgwyprocess/html/api-index-2-18.html
index 2e16c88..c38993b 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-18.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-18.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.18: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-12.html" title="Index of new symbols in 2.12">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-2.html b/devel-docs/libgwyprocess/html/api-index-2-2.html
index 46cd590..3ac9a6b 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-2.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-2.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.2: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-1.html" title="Index of new symbols in 2.1">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-22.html b/devel-docs/libgwyprocess/html/api-index-2-22.html
index 84d9ec3..ed5ea49 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-22.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-22.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.22: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-18.html" title="Index of new symbols in 2.18">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-23.html b/devel-docs/libgwyprocess/html/api-index-2-23.html
index ccd4e62..8a52fd2 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-23.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-23.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.23: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-22.html" title="Index of new symbols in 2.22">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-26.html b/devel-docs/libgwyprocess/html/api-index-2-26.html
index 4fefdbc..c87be96 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-26.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-26.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.26: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-23.html" title="Index of new symbols in 2.23">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-29.html b/devel-docs/libgwyprocess/html/api-index-2-29.html
index ddd06b2..3c5453f 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-29.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-29.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.29: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-26.html" title="Index of new symbols in 2.26">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-3.html b/devel-docs/libgwyprocess/html/api-index-2-3.html
index 2fd29c0..c82e928 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-3.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-3.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.3: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-2.html" title="Index of new symbols in 2.2">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-30.html b/devel-docs/libgwyprocess/html/api-index-2-30.html
index 267e31f..ce7fbd4 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-30.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-30.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.30: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-29.html" title="Index of new symbols in 2.29">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-31.html b/devel-docs/libgwyprocess/html/api-index-2-31.html
index 3314aaa..5569c35 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-31.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-31.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.31: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-30.html" title="Index of new symbols in 2.30">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-32.html b/devel-docs/libgwyprocess/html/api-index-2-32.html
index 6f50b31..d04e4eb 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-32.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-32.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.32: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-31.html" title="Index of new symbols in 2.31">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-34.html b/devel-docs/libgwyprocess/html/api-index-2-34.html
index 2948597..d19c758 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-34.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-34.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.34: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-32.html" title="Index of new symbols in 2.32">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-35.html b/devel-docs/libgwyprocess/html/api-index-2-35.html
index 4564d2c..2165eab 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-35.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-35.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.35: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-34.html" title="Index of new symbols in 2.34">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-36.html b/devel-docs/libgwyprocess/html/api-index-2-36.html
index 7e31c07..b0a7e23 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-36.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-36.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.36: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-35.html" title="Index of new symbols in 2.35">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-37.html b/devel-docs/libgwyprocess/html/api-index-2-37.html
index 0e43e8a..ca3f57d 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-37.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-37.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.37: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-36.html" title="Index of new symbols in 2.36">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-38.html b/devel-docs/libgwyprocess/html/api-index-2-38.html
index 3063662..858ebf3 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-38.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-38.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.38: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-37.html" title="Index of new symbols in 2.37">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-4.html b/devel-docs/libgwyprocess/html/api-index-2-4.html
index 879997b..d2a7678 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-4.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-4.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.4: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-3.html" title="Index of new symbols in 2.3">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-40.html b/devel-docs/libgwyprocess/html/api-index-2-40.html
index 03a521e..2a36403 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-40.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-40.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.40: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-38.html" title="Index of new symbols in 2.38">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-41.html b/devel-docs/libgwyprocess/html/api-index-2-41.html
index f168280..fd8b5f6 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-41.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-41.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.41: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-40.html" title="Index of new symbols in 2.40">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-42.html b/devel-docs/libgwyprocess/html/api-index-2-42.html
index 9d35ca2..72f06e6 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-42.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-42.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.42: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-41.html" title="Index of new symbols in 2.41">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-43.html b/devel-docs/libgwyprocess/html/api-index-2-43.html
index fbf1f3b..d529a29 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-43.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-43.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.43: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-42.html" title="Index of new symbols in 2.42">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-44.html b/devel-docs/libgwyprocess/html/api-index-2-44.html
index b1db14e..2d1baab 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-44.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-44.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.44: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-43.html" title="Index of new symbols in 2.43">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-45.html b/devel-docs/libgwyprocess/html/api-index-2-45.html
index 8d687ff..c970ef8 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-45.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-45.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.45: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-44.html" title="Index of new symbols in 2.44">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-46.html b/devel-docs/libgwyprocess/html/api-index-2-46.html
index 9c66911..342192d 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-46.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-46.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.46: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-45.html" title="Index of new symbols in 2.45">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-47.html b/devel-docs/libgwyprocess/html/api-index-2-47.html
index b647a15..38cd99e 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-47.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-47.html
@@ -3,10 +3,11 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.47: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-46.html" title="Index of new symbols in 2.46">
+<link rel="next" href="api-index-2-48.html" title="Index of new symbols in 2.48">
 <meta name="generator" content="GTK-Doc V1.19 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -22,7 +23,7 @@
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
 <td><a accesskey="p" href="api-index-2-46.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><img src="right-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="n" href="api-index-2-48.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="index">
 <div class="titlepage"><div><div><h1 class="title">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-48.html b/devel-docs/libgwyprocess/html/api-index-2-48.html
new file mode 100644
index 0000000..236297c
--- /dev/null
+++ b/devel-docs/libgwyprocess/html/api-index-2-48.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.48: Gwyddion Data Processing Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
+<link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
+<link rel="prev" href="api-index-2-47.html" title="Index of new symbols in 2.47">
+<link rel="next" href="api-index-2-49.html" title="Index of new symbols in 2.49">
+<meta name="generator" content="GTK-Doc V1.19 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxD">D</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxS">S</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="p" href="api-index-2-47.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-49.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h1 class="title">
+<a name="api-index-2-48"></a>Index of new symbols in 2.48</h1></div></div></div>
+<a name="idx"></a><a name="idxD"></a><h3 class="title">D</h3>
+<dt>
+<a class="link" href="libgwyprocess-grains.html#gwy-data-field-grains-thin" title="gwy_data_field_grains_thin ()">gwy_data_field_grains_thin</a>, function in <a class="link" href="libgwyprocess-grains.html" title="grains">grains</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="GwyShapeFitPreset.html#gwy-shape-fit-preset-quick-fit" title="gwy_shape_fit_preset_quick_fit ()">gwy_shape_fit_preset_quick_fit</a>, function in <a class="link" href="GwyShapeFitPreset.html" title="GwyShapeFitPreset">GwyShapeFitPreset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwySurface.html#gwy-surface-reduce-points" title="gwy_surface_reduce_points ()">gwy_surface_reduce_points</a>, function in <a class="link" href="GwySurface.html" title="GwySurface">GwySurface</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.19</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/devel-docs/libgwyprocess/html/api-index-2-49.html b/devel-docs/libgwyprocess/html/api-index-2-49.html
new file mode 100644
index 0000000..f91d476
--- /dev/null
+++ b/devel-docs/libgwyprocess/html/api-index-2-49.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.49: Gwyddion Data Processing Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
+<link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
+<link rel="prev" href="api-index-2-48.html" title="Index of new symbols in 2.48">
+<meta name="generator" content="GTK-Doc V1.19 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxA">A</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxC">C</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxD">D</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxS">S</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="p" href="api-index-2-48.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><img src="right-insensitive.png" width="16" height="16" border="0"></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h1 class="title">
+<a name="api-index-2-49"></a>Index of new symbols in 2.49</h1></div></div></div>
+<a name="idx"></a><a name="idxA"></a><h3 class="title">A</h3>
+<dt>
+<a class="link" href="libgwyprocess-gwyprocessenums.html#GwyAffineScalingType" title="enum GwyAffineScalingType">GwyAffineScalingType</a>, enum in <a class="link" href="libgwyprocess-gwyprocessenums.html" title="gwyprocessenums">gwyprocessenums</a>
+</dt>
+<dd></dd>
+<a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="GwyBrick.html#gwy-brick-copy-units" title="gwy_brick_copy_units ()">gwy_brick_copy_units</a>, function in <a class="link" href="GwyBrick.html" title="GwyBrick">GwyBrick</a>
+</dt>
+<dd></dd>
+<a name="idxC"></a><h3 class="title">C</h3>
+<dt>
+<a class="link" href="libgwyprocess-gwyprocessenums.html#gwy-computation-state-get-fraction" title="gwy_computation_state_get_fraction ()">gwy_computation_state_get_fraction</a>, function in <a class="link" href="libgwyprocess-gwyprocessenums.html" title="gwyprocessenums">gwyprocessenums</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyprocess-gwyprocessenums.html#gwy-computation-state-get-state" title="gwy_computation_state_get_state ()">gwy_computation_state_get_state</a>, function in <a class="link" href="libgwyprocess-gwyprocessenums.html" title="gwyprocessenums">gwyprocessenums</a>
+</dt>
+<dd></dd>
+<a name="idxD"></a><h3 class="title">D</h3>
+<dt>
+<a class="link" href="libgwyprocess-correct.html#gwy-data-field-affine-prepare" title="gwy_data_field_affine_prepare ()">gwy_data_field_affine_prepare</a>, function in <a class="link" href="libgwyprocess-correct.html" title="correct">correct</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-cda-mask" title="gwy_data_field_area_cda_mask ()">gwy_data_field_area_cda_mask</a>, function in <a class="link" href="libgwyprocess-stats.html" title="stats">stats</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-da-mask" title="gwy_data_field_area_da_mask ()">gwy_data_field_area_da_mask</a>, function in <a class="link" href="libgwyprocess-stats.html" title="stats">stats</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyprocess-filters.html#gwy-data-field-area-ext-convolve" title="gwy_data_field_area_ext_convolve ()">gwy_data_field_area_ext_convolve</a>, function in <a class="link" href="libgwyprocess-filters.html" title="filters">filters</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyprocess-filters.html#gwy-data-field-area-ext-row-convolve" title="gwy_data_field_area_ext_row_convolve ()">gwy_data_field_area_ext_row_convolve</a>, function in <a class="link" href="libgwyprocess-filters.html" title="filters">filters</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyDataField.html#gwy-data-field-area-flip-xy" title="gwy_data_field_area_flip_xy ()">gwy_data_field_area_flip_xy</a>, function in <a class="link" href="GwyDataField.html" title="GwyDataField">GwyDataField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyDataField.html#gwy-data-field-copy-units" title="gwy_data_field_copy_units ()">gwy_data_field_copy_units</a>, function in <a class="link" href="GwyDataField.html" title="GwyDataField">GwyDataField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyDataField.html#gwy-data-field-flip-xy" title="gwy_data_field_flip_xy ()">gwy_data_field_flip_xy</a>, function in <a class="link" href="GwyDataField.html" title="GwyDataField">GwyDataField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyDataField.html#gwy-data-field-get-profile-mask" title="gwy_data_field_get_profile_mask ()">gwy_data_field_get_profile_mask</a>, function in <a class="link" href="GwyDataField.html" title="GwyDataField">GwyDataField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyprocess-elliptic.html#gwy-data-field-local-maximum" title="gwy_data_field_local_maximum ()">gwy_data_field_local_maximum</a>, function in <a class="link" href="libgwyprocess-elliptic.html" title="elliptic">elliptic</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyprocess-correct.html#gwy-data-field-measure-lattice-acf" title="gwy_data_field_measure_lattice_acf ()">gwy_data_field_measure_lattice_acf</a>, function in <a class="link" href="libgwyprocess-correct.html" title="correct">correct</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyprocess-correct.html#gwy-data-field-measure-lattice-psdf" title="gwy_data_field_measure_lattice_psdf ()">gwy_data_field_measure_lattice_psdf</a>, function in <a class="link" href="libgwyprocess-correct.html" title="correct">correct</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwyDataLine.html#gwy-data-line-copy-units" title="gwy_data_line_copy_units ()">gwy_data_line_copy_units</a>, function in <a class="link" href="GwyDataLine.html" title="GwyDataLine">GwyDataLine</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="libgwyprocess-GwySpline.html#gwy-spline-copy" title="gwy_spline_copy ()">gwy_spline_copy</a>, function in <a class="link" href="libgwyprocess-GwySpline.html" title="GwySpline">GwySpline</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GwySurface.html#gwy-surface-copy-units" title="gwy_surface_copy_units ()">gwy_surface_copy_units</a>, function in <a class="link" href="GwySurface.html" title="GwySurface">GwySurface</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.19</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/devel-docs/libgwyprocess/html/api-index-2-5.html b/devel-docs/libgwyprocess/html/api-index-2-5.html
index b6408f0..9be2559 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-5.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-5.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.5: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-4.html" title="Index of new symbols in 2.4">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-7.html b/devel-docs/libgwyprocess/html/api-index-2-7.html
index eb73214..9c6517a 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-7.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-7.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.7: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-5.html" title="Index of new symbols in 2.5">
diff --git a/devel-docs/libgwyprocess/html/api-index-2-8.html b/devel-docs/libgwyprocess/html/api-index-2-8.html
index b922af5..f02ec51 100644
--- a/devel-docs/libgwyprocess/html/api-index-2-8.html
+++ b/devel-docs/libgwyprocess/html/api-index-2-8.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 2.8: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-2-7.html" title="Index of new symbols in 2.7">
diff --git a/devel-docs/libgwyprocess/html/api-index-all.html b/devel-docs/libgwyprocess/html/api-index-all.html
index 6fc1139..6adc4d3 100644
--- a/devel-docs/libgwyprocess/html/api-index-all.html
+++ b/devel-docs/libgwyprocess/html/api-index-all.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of all symbols: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-gwyprocessenums.html" title="gwyprocessenums">
@@ -15,6 +15,8 @@
 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
 <td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idx2">2</a>
                      <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxA">A</a>
+                     <span class="dim">|</span> 
                   <a class="shortcut" href="#idxB">B</a>
                      <span class="dim">|</span> 
                   <a class="shortcut" href="#idxC">C</a>
@@ -61,6 +63,11 @@
 <a class="link" href="libgwyprocess-gwyprocessenums.html#gwy-2d-cwt-wavelet-type-get-enum" title="gwy_2d_cwt_wavelet_type_get_enum ()">gwy_2d_cwt_wavelet_type_get_enum</a>, function in <a class="link" href="libgwyprocess-gwyprocessenums.html" title="gwyprocessenums">gwyprocessenums</a>
 </dt>
 <dd></dd>
+<a name="idxA"></a><h3 class="title">A</h3>
+<dt>
+<a class="link" href="libgwyprocess-gwyprocessenums.html#GwyAffineScalingType" title="enum GwyAffineScalingType">GwyAffineScalingType</a>, enum in <a class="link" href="libgwyprocess-gwyprocessenums.html" title="gwyprocessenums">gwyprocessenums</a>
+</dt>
+<dd></dd>
 <a name="idxB"></a><h3 class="title">B</h3>
 <dt>
 <a class="link" href="GwyBrick.html#GwyBrick-struct" title="struct GwyBrick">GwyBrick</a>, struct in <a class="link" href="GwyBrick.html" title="GwyBrick">GwyBrick</a>
@@ -87,6 +94,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GwyBrick.html#gwy-brick-copy-units" title="gwy_brick_copy_units ()">gwy_brick_copy_units</a>, function in <a class="link" href="GwyBrick.html" title="GwyBrick">GwyBrick</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="GwyBrick.html#gwy-brick-data-changed" title="gwy_brick_data_changed ()">gwy_brick_data_changed</a>, function in <a class="link" href="GwyBrick.html" title="GwyBrick">GwyBrick</a>
 </dt>
 <dd></dd>
@@ -532,11 +543,15 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState" title="GwyComputationState">GwyComputationState</a>, struct in <a class="link" href="libgwyprocess-gwyprocessenums.html" title="gwyprocessenums">gwyprocessenums</a>
+<a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationStateType" title="enum GwyComputationStateType">GwyComputationStateType</a>, enum in <a class="link" href="libgwyprocess-gwyprocessenums.html" title="gwyprocessenums">gwyprocessenums</a>
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationStateType" title="enum GwyComputationStateType">GwyComputationStateType</a>, enum in <a class="link" href="libgwyprocess-gwyprocessenums.html" title="gwyprocessenums">gwyprocessenums</a>
+<a class="link" href="libgwyprocess-gwyprocessenums.html#gwy-computation-state-get-fraction" title="gwy_computation_state_get_fraction ()">gwy_computation_state_get_fraction</a>, function in <a class="link" href="libgwyprocess-gwyprocessenums.html" title="gwyprocessenums">gwyprocessenums</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyprocess-gwyprocessenums.html#gwy-computation-state-get-state" title="gwy_computation_state_get_state ()">gwy_computation_state_get_state</a>, function in <a class="link" href="libgwyprocess-gwyprocessenums.html" title="gwyprocessenums">gwyprocessenums</a>
 </dt>
 <dd></dd>
 <dt>
@@ -637,6 +652,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwyprocess-correct.html#gwy-data-field-affine-prepare" title="gwy_data_field_affine_prepare ()">gwy_data_field_affine_prepare</a>, function in <a class="link" href="libgwyprocess-correct.html" title="correct">correct</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwyprocess-stats.html#gwy-data-field-angular-average" title="gwy_data_field_angular_average ()">gwy_data_field_angular_average</a>, function in <a class="link" href="libgwyprocess-stats.html" title="stats">stats</a>
 </dt>
 <dd></dd>
@@ -669,6 +688,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-cda-mask" title="gwy_data_field_area_cda_mask ()">gwy_data_field_area_cda_mask</a>, function in <a class="link" href="libgwyprocess-stats.html" title="stats">stats</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-cdh" title="gwy_data_field_area_cdh ()">gwy_data_field_area_cdh</a>, function in <a class="link" href="libgwyprocess-stats.html" title="stats">stats</a>
 </dt>
 <dd></dd>
@@ -705,6 +728,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-da-mask" title="gwy_data_field_area_da_mask ()">gwy_data_field_area_da_mask</a>, function in <a class="link" href="libgwyprocess-stats.html" title="stats">stats</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-dh" title="gwy_data_field_area_dh ()">gwy_data_field_area_dh</a>, function in <a class="link" href="libgwyprocess-stats.html" title="stats">stats</a>
 </dt>
 <dd></dd>
@@ -717,6 +744,14 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwyprocess-filters.html#gwy-data-field-area-ext-convolve" title="gwy_data_field_area_ext_convolve ()">gwy_data_field_area_ext_convolve</a>, function in <a class="link" href="libgwyprocess-filters.html" title="filters">filters</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyprocess-filters.html#gwy-data-field-area-ext-row-convolve" title="gwy_data_field_area_ext_row_convolve ()">gwy_data_field_area_ext_row_convolve</a>, function in <a class="link" href="libgwyprocess-filters.html" title="filters">filters</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="GwyDataField.html#gwy-data-field-area-fill" title="gwy_data_field_area_fill ()">gwy_data_field_area_fill</a>, function in <a class="link" href="GwyDataField.html" title="GwyDataField">GwyDataField</a>
 </dt>
 <dd></dd>
@@ -809,6 +844,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GwyDataField.html#gwy-data-field-area-flip-xy" title="gwy_data_field_area_flip_xy ()">gwy_data_field_area_flip_xy</a>, function in <a class="link" href="GwyDataField.html" title="GwyDataField">GwyDataField</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwyprocess-filters.html#gwy-data-field-area-gather" title="gwy_data_field_area_gather ()">gwy_data_field_area_gather</a>, function in <a class="link" href="libgwyprocess-filters.html" title="filters">filters</a>
 </dt>
 <dd></dd>
@@ -1025,6 +1064,22 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-row-acf" title="gwy_data_field_area_row_acf ()">gwy_data_field_area_row_acf</a>, function in <a class="link" href="libgwyprocess-stats.html" title="stats">stats</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-row-asg" title="gwy_data_field_area_row_asg ()">gwy_data_field_area_row_asg</a>, function in <a class="link" href="libgwyprocess-stats.html" title="stats">stats</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-row-hhcf" title="gwy_data_field_area_row_hhcf ()">gwy_data_field_area_row_hhcf</a>, function in <a class="link" href="libgwyprocess-stats.html" title="stats">stats</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-row-psdf" title="gwy_data_field_area_row_psdf ()">gwy_data_field_area_row_psdf</a>, function in <a class="link" href="libgwyprocess-stats.html" title="stats">stats</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-rpsdf" title="gwy_data_field_area_rpsdf ()">gwy_data_field_area_rpsdf</a>, function in <a class="link" href="libgwyprocess-stats.html" title="stats">stats</a>
 </dt>
 <dd></dd>
@@ -1105,6 +1160,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GwyDataField.html#gwy-data-field-copy-units" title="gwy_data_field_copy_units ()">gwy_data_field_copy_units</a>, function in <a class="link" href="GwyDataField.html" title="GwyDataField">GwyDataField</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="GwyDataField.html#gwy-data-field-copy-units-to-data-line" title="gwy_data_field_copy_units_to_data_line ()">gwy_data_field_copy_units_to_data_line</a>, function in <a class="link" href="GwyDataField.html" title="GwyDataField">GwyDataField</a>
 </dt>
 <dd></dd>
@@ -1345,6 +1404,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GwyDataField.html#gwy-data-field-flip-xy" title="gwy_data_field_flip_xy ()">gwy_data_field_flip_xy</a>, function in <a class="link" href="GwyDataField.html" title="GwyDataField">GwyDataField</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwyprocess-fractals.html#gwy-data-field-fractal-correction" title="gwy_data_field_fractal_correction ()">gwy_data_field_fractal_correction</a>, function in <a class="link" href="libgwyprocess-fractals.html" title="fractals">fractals</a>
 </dt>
 <dd></dd>
@@ -1517,6 +1580,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GwyDataField.html#gwy-data-field-get-profile-mask" title="gwy_data_field_get_profile_mask ()">gwy_data_field_get_profile_mask</a>, function in <a class="link" href="GwyDataField.html" title="GwyDataField">GwyDataField</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwyprocess-stats.html#gwy-data-field-get-rms" title="gwy_data_field_get_rms ()">gwy_data_field_get_rms</a>, function in <a class="link" href="libgwyprocess-stats.html" title="stats">stats</a>
 </dt>
 <dd></dd>
@@ -1709,6 +1776,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwyprocess-grains.html#gwy-data-field-grains-thin" title="gwy_data_field_grains_thin ()">gwy_data_field_grains_thin</a>, function in <a class="link" href="libgwyprocess-grains.html" title="grains">grains</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwyprocess-grains.html#gwy-data-field-grains-watershed-finalize" title="gwy_data_field_grains_watershed_finalize ()">gwy_data_field_grains_watershed_finalize</a>, function in <a class="link" href="libgwyprocess-grains.html" title="grains">grains</a>
 </dt>
 <dd></dd>
@@ -1785,6 +1856,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwyprocess-elliptic.html#gwy-data-field-local-maximum" title="gwy_data_field_local_maximum ()">gwy_data_field_local_maximum</a>, function in <a class="link" href="libgwyprocess-elliptic.html" title="elliptic">elliptic</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwyprocess-level.html#gwy-data-field-local-plane-quantity" title="gwy_data_field_local_plane_quantity ()">gwy_data_field_local_plane_quantity</a>, function in <a class="link" href="libgwyprocess-level.html" title="level">level</a>
 </dt>
 <dd></dd>
@@ -1809,6 +1884,14 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwyprocess-correct.html#gwy-data-field-measure-lattice-acf" title="gwy_data_field_measure_lattice_acf ()">gwy_data_field_measure_lattice_acf</a>, function in <a class="link" href="libgwyprocess-correct.html" title="correct">correct</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyprocess-correct.html#gwy-data-field-measure-lattice-psdf" title="gwy_data_field_measure_lattice_psdf ()">gwy_data_field_measure_lattice_psdf</a>, function in <a class="link" href="libgwyprocess-correct.html" title="correct">correct</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="libgwyprocess-stats.html#gwy-data-field-minkowski-boundary" title="gwy_data_field_minkowski_boundary ()">gwy_data_field_minkowski_boundary</a>, function in <a class="link" href="libgwyprocess-stats.html" title="stats">stats</a>
 </dt>
 <dd></dd>
@@ -2045,6 +2128,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GwyDataLine.html#gwy-data-line-copy-units" title="gwy_data_line_copy_units ()">gwy_data_line_copy_units</a>, function in <a class="link" href="GwyDataLine.html" title="GwyDataLine">GwyDataLine</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="GwyDataField.html#gwy-data-line-copy-units-to-data-field" title="gwy_data_line_copy_units_to_data_field ()">gwy_data_line_copy_units_to_data_field</a>, function in <a class="link" href="GwyDataField.html" title="GwyDataField">GwyDataField</a>
 </dt>
 <dd></dd>
@@ -2249,6 +2336,22 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="libgwyprocess-linestats.html#gwy-data-line-max-pos-i" title="gwy_data_line_max_pos_i ()">gwy_data_line_max_pos_i</a>, function in <a class="link" href="libgwyprocess-linestats.html" title="linestats">linestats</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyprocess-linestats.html#gwy-data-line-max-pos-r" title="gwy_data_line_max_pos_r ()">gwy_data_line_max_pos_r</a>, function in <a class="link" href="libgwyprocess-linestats.html" title="linestats">linestats</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyprocess-linestats.html#gwy-data-line-min-pos-i" title="gwy_data_line_min_pos_i ()">gwy_data_line_min_pos_i</a>, function in <a class="link" href="libgwyprocess-linestats.html" title="linestats">linestats</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libgwyprocess-linestats.html#gwy-data-line-min-pos-r" title="gwy_data_line_min_pos_r ()">gwy_data_line_min_pos_r</a>, function in <a class="link" href="libgwyprocess-linestats.html" title="linestats">linestats</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="GwyDataLine.html#gwy-data-line-multiply" title="gwy_data_line_multiply ()">gwy_data_line_multiply</a>, function in <a class="link" href="GwyDataLine.html" title="GwyDataLine">GwyDataLine</a>
 </dt>
 <dd></dd>
@@ -2811,6 +2914,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GwyShapeFitPreset.html#gwy-shape-fit-preset-quick-fit" title="gwy_shape_fit_preset_quick_fit ()">gwy_shape_fit_preset_quick_fit</a>, function in <a class="link" href="GwyShapeFitPreset.html" title="GwyShapeFitPreset">GwyShapeFitPreset</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="GwyShapeFitPreset.html#gwy-shape-fit-preset-setup" title="gwy_shape_fit_preset_setup ()">gwy_shape_fit_preset_setup</a>, function in <a class="link" href="GwyShapeFitPreset.html" title="GwyShapeFitPreset">GwyShapeFitPreset</a>
 </dt>
 <dd></dd>
@@ -2935,7 +3042,7 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline">GwySpline</a>, struct in <a class="link" href="libgwyprocess-GwySpline.html" title="GwySpline">GwySpline</a>
+<a class="link" href="libgwyprocess-GwySpline.html#gwy-spline-copy" title="gwy_spline_copy ()">gwy_spline_copy</a>, function in <a class="link" href="libgwyprocess-GwySpline.html" title="GwySpline">GwySpline</a>
 </dt>
 <dd></dd>
 <dt>
@@ -3015,6 +3122,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GwySurface.html#gwy-surface-copy-units" title="gwy_surface_copy_units ()">gwy_surface_copy_units</a>, function in <a class="link" href="GwySurface.html" title="GwySurface">GwySurface</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="GwySurface.html#gwy-surface-copy-units-to-data-field" title="gwy_surface_copy_units_to_data_field ()">gwy_surface_copy_units_to_data_field</a>, function in <a class="link" href="GwySurface.html" title="GwySurface">GwySurface</a>
 </dt>
 <dd></dd>
@@ -3099,6 +3210,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GwySurface.html#gwy-surface-reduce-points" title="gwy_surface_reduce_points ()">gwy_surface_reduce_points</a>, function in <a class="link" href="GwySurface.html" title="GwySurface">GwySurface</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="GwySurface.html#gwy-surface-set" title="gwy_surface_set ()">gwy_surface_set</a>, function in <a class="link" href="GwySurface.html" title="GwySurface">GwySurface</a>
 </dt>
 <dd></dd>
@@ -3136,10 +3251,6 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset" title="struct GwyTipModelPreset">GwyTipModelPreset</a>, struct in <a class="link" href="libgwyprocess-tip.html" title="tip">tip</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="libgwyprocess-gwyprocessenums.html#GwyTipParamType" title="enum GwyTipParamType">GwyTipParamType</a>, enum in <a class="link" href="libgwyprocess-gwyprocessenums.html" title="gwyprocessenums">gwyprocessenums</a>
 </dt>
 <dd></dd>
diff --git a/devel-docs/libgwyprocess/html/api-index-deprec.html b/devel-docs/libgwyprocess/html/api-index-deprec.html
index be52984..9fc9050 100644
--- a/devel-docs/libgwyprocess/html/api-index-deprec.html
+++ b/devel-docs/libgwyprocess/html/api-index-deprec.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of deprecated symbols: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="api-index-all.html" title="Index of all symbols">
@@ -73,10 +73,6 @@
 <a class="link" href="libgwyprocess-tip.html#GwyTipModelFunc" title="GwyTipModelFunc ()">GwyTipModelFunc</a>, user_function in <a class="link" href="libgwyprocess-tip.html" title="tip">tip</a>
 </dt>
 <dd></dd>
-<dt>
-<a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset" title="struct GwyTipModelPreset">GwyTipModelPreset</a>, struct in <a class="link" href="libgwyprocess-tip.html" title="tip">tip</a>
-</dt>
-<dd></dd>
 </div>
 <div class="footer">
 <hr>Generated by GTK-Doc V1.19</div>
diff --git a/devel-docs/libgwyprocess/html/index.html b/devel-docs/libgwyprocess/html/index.html
index 36b2b04..003d260 100644
--- a/devel-docs/libgwyprocess/html/index.html
+++ b/devel-docs/libgwyprocess/html/index.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Gwyddion Data Processing Library Reference Manual: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="next" href="GwyDataLine.html" title="GwyDataLine">
 <meta name="generator" content="GTK-Doc V1.19 (XML mode)">
@@ -15,7 +15,7 @@
 <div>
 <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">Gwyddion Data Processing Library Reference Manual</p></th></tr></table></div>
 <div><p class="releaseinfo">
-  For Gwyddion 2.47.
+  For Gwyddion 2.49.
   The latest version of this document can be found on-line at
   <a class="ulink" href="http://gwyddion.net/documentation/libgwyprocess/index.php" target="_top">http://gwyddion.net/documentation/libgwyprocess/</a>.
 </p></div>
@@ -154,6 +154,8 @@
 <dt><span class="index"><a href="api-index-2-45.html">Index of new symbols in 2.45</a></span></dt>
 <dt><span class="index"><a href="api-index-2-46.html">Index of new symbols in 2.46</a></span></dt>
 <dt><span class="index"><a href="api-index-2-47.html">Index of new symbols in 2.47</a></span></dt>
+<dt><span class="index"><a href="api-index-2-48.html">Index of new symbols in 2.48</a></span></dt>
+<dt><span class="index"><a href="api-index-2-49.html">Index of new symbols in 2.49</a></span></dt>
 </dl></div>
 <p>
     This library contains classes representing one- and twodimensional data,
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-GwySpline.html b/devel-docs/libgwyprocess/html/libgwyprocess-GwySpline.html
index cc130e6..9283c8b 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-GwySpline.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-GwySpline.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>GwySpline: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="GwyShapeFitPreset.html" title="GwyShapeFitPreset">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-GwySpline.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -41,7 +41,7 @@
 <tbody>
 <tr>
 <td class="function_type">
-<a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline"><span class="returnvalue">GwySpline</span></a> *
+<span class="returnvalue">GwySpline</span> *
 </td>
 <td class="function_name">
 <a class="link" href="libgwyprocess-GwySpline.html#gwy-spline-new" title="gwy_spline_new ()">gwy_spline_new</a> <span class="c_punctuation">()</span>
@@ -57,7 +57,15 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline"><span class="returnvalue">GwySpline</span></a> *
+<span class="returnvalue">GwySpline</span> *
+</td>
+<td class="function_name">
+<a class="link" href="libgwyprocess-GwySpline.html#gwy-spline-copy" title="gwy_spline_copy ()">gwy_spline_copy</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">GwySpline</span> *
 </td>
 <td class="function_name">
 <a class="link" href="libgwyprocess-GwySpline.html#gwy-spline-new-from-points" title="gwy_spline_new_from_points ()">gwy_spline_new_from_points</a> <span class="c_punctuation">()</span>
@@ -152,19 +160,6 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="libgwyprocess-GwySpline.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="name">
-<col class="description">
-</colgroup>
-<tbody><tr>
-<td class="datatype_keyword"> </td>
-<td class="function_name"><a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline">GwySpline</a></td>
-</tr></tbody>
-</table></div>
-</div>
-<div class="refsect1">
 <a name="libgwyprocess-GwySpline.includes"></a><h2>Includes</h2>
 <pre class="synopsis">#include <libprocess/gwyprocess.h>
 </pre>
@@ -176,7 +171,7 @@
 <a name="libgwyprocess-GwySpline.functions_details"></a><h2>Functions</h2>
 <div class="refsect2">
 <a name="gwy-spline-new"></a><h3>gwy_spline_new ()</h3>
-<pre class="programlisting"><a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline"><span class="returnvalue">GwySpline</span></a> *
+<pre class="programlisting"><span class="returnvalue">GwySpline</span> *
 gwy_spline_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <p>Creates a new empty spline curve.</p>
 <p>You need to set the curve points using <a class="link" href="libgwyprocess-GwySpline.html#gwy-spline-set-points" title="gwy_spline_set_points ()"><code class="function">gwy_spline_set_points()</code></a> before any
@@ -192,11 +187,11 @@ to construct the spline already with some points.</p>
 <div class="refsect2">
 <a name="gwy-spline-free"></a><h3>gwy_spline_free ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-gwy_spline_free (<em class="parameter"><code><a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline"><span class="type">GwySpline</span></a> *spline</code></em>);</pre>
+gwy_spline_free (<em class="parameter"><code><span class="type">GwySpline</span> *spline</code></em>);</pre>
 <p>Frees a spline curve and all associated resources.</p>
 <div class="refsect3">
 <a name="gwy-spline-free.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -213,15 +208,42 @@ gwy_spline_free (<em class="parameter"><code><a class="link" href="libgwyprocess
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-spline-copy"></a><h3>gwy_spline_copy ()</h3>
+<pre class="programlisting"><span class="returnvalue">GwySpline</span> *
+gwy_spline_copy (<em class="parameter"><code><span class="type">GwySpline</span> *spline</code></em>);</pre>
+<p>Creates a copy of a spline curve.</p>
+<div class="refsect3">
+<a name="gwy-spline-copy.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>spline</p></td>
+<td class="parameter_description"><p>A spline curve.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-spline-copy.returns"></a><h4>Returns</h4>
+<p> A newly created spline curve.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-spline-new-from-points"></a><h3>gwy_spline_new_from_points ()</h3>
-<pre class="programlisting"><a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline"><span class="returnvalue">GwySpline</span></a> *
+<pre class="programlisting"><span class="returnvalue">GwySpline</span> *
 gwy_spline_new_from_points (<em class="parameter"><code>const <span class="type">GwyXY</span> *xy</code></em>,
                             <em class="parameter"><code><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> n</code></em>);</pre>
 <p>Creates a new spline curve passing through given points.</p>
 <p>See <a class="link" href="libgwyprocess-GwySpline.html#gwy-spline-set-points" title="gwy_spline_set_points ()"><code class="function">gwy_spline_set_points()</code></a> for discussion.</p>
 <div class="refsect3">
 <a name="gwy-spline-new-from-points.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -252,11 +274,11 @@ gwy_spline_new_from_points (<em class="parameter"><code>const <span class="type"
 <div class="refsect2">
 <a name="gwy-spline-get-npoints"></a><h3>gwy_spline_get_npoints ()</h3>
 <pre class="programlisting"><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a>
-gwy_spline_get_npoints (<em class="parameter"><code><a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline"><span class="type">GwySpline</span></a> *spline</code></em>);</pre>
+gwy_spline_get_npoints (<em class="parameter"><code><span class="type">GwySpline</span> *spline</code></em>);</pre>
 <p>Gets the number of points of a spline curve.</p>
 <div class="refsect3">
 <a name="gwy-spline-get-npoints.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -279,12 +301,12 @@ gwy_spline_get_npoints (<em class="parameter"><code><a class="link" href="libgwy
 <div class="refsect2">
 <a name="gwy-spline-get-points"></a><h3>gwy_spline_get_points ()</h3>
 <pre class="programlisting">const <span class="returnvalue">GwyXY</span> *
-gwy_spline_get_points (<em class="parameter"><code><a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline"><span class="type">GwySpline</span></a> *spline</code></em>);</pre>
+gwy_spline_get_points (<em class="parameter"><code><span class="type">GwySpline</span> *spline</code></em>);</pre>
 <p>Gets the coordinates of spline curve points.</p>
 <p>If the spline is empty (there are no points) the function returns <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-spline-get-points.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -311,13 +333,13 @@ destroyed.</p>
 <div class="refsect2">
 <a name="gwy-spline-get-tangents"></a><h3>gwy_spline_get_tangents ()</h3>
 <pre class="programlisting">const <span class="returnvalue">GwyXY</span> *
-gwy_spline_get_tangents (<em class="parameter"><code><a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline"><span class="type">GwySpline</span></a> *spline</code></em>);</pre>
+gwy_spline_get_tangents (<em class="parameter"><code><span class="type">GwySpline</span> *spline</code></em>);</pre>
 <p>Gets tangents to the curve in its defining points.</p>
 <p>See <a class="link" href="libgwyprocess-GwySpline.html#gwy-spline-sample-uniformly" title="gwy_spline_sample_uniformly ()"><code class="function">gwy_spline_sample_uniformly()</code></a> for discussion.</p>
 <p>If the spline is empty (there are no points) the function returns <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-spline-get-tangents.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -344,12 +366,12 @@ destroyed.</p>
 <div class="refsect2">
 <a name="gwy-spline-get-slackness"></a><h3>gwy_spline_get_slackness ()</h3>
 <pre class="programlisting"><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
-gwy_spline_get_slackness (<em class="parameter"><code><a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline"><span class="type">GwySpline</span></a> *spline</code></em>);</pre>
+gwy_spline_get_slackness (<em class="parameter"><code><span class="type">GwySpline</span> *spline</code></em>);</pre>
 <p>Gets the slackness parameter of a spline curve.</p>
 <p>See <a class="link" href="libgwyprocess-GwySpline.html#gwy-spline-set-slackness" title="gwy_spline_set_slackness ()"><code class="function">gwy_spline_set_slackness()</code></a> for discussion.</p>
 <div class="refsect3">
 <a name="gwy-spline-get-slackness.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -372,12 +394,12 @@ gwy_spline_get_slackness (<em class="parameter"><code><a class="link" href="libg
 <div class="refsect2">
 <a name="gwy-spline-get-closed"></a><h3>gwy_spline_get_closed ()</h3>
 <pre class="programlisting"><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gwy_spline_get_closed (<em class="parameter"><code><a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline"><span class="type">GwySpline</span></a> *spline</code></em>);</pre>
+gwy_spline_get_closed (<em class="parameter"><code><span class="type">GwySpline</span> *spline</code></em>);</pre>
 <p>Reports whether a spline curve is closed or not.</p>
 <p>See <a class="link" href="libgwyprocess-GwySpline.html#gwy-spline-set-closed" title="gwy_spline_set_closed ()"><code class="function">gwy_spline_set_closed()</code></a> for discussion.</p>
 <div class="refsect3">
 <a name="gwy-spline-get-closed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -401,7 +423,7 @@ is closed, <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard
 <div class="refsect2">
 <a name="gwy-spline-set-points"></a><h3>gwy_spline_set_points ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-gwy_spline_set_points (<em class="parameter"><code><a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline"><span class="type">GwySpline</span></a> *spline</code></em>,
+gwy_spline_set_points (<em class="parameter"><code><span class="type">GwySpline</span> *spline</code></em>,
                        <em class="parameter"><code>const <span class="type">GwyXY</span> *xy</code></em>,
                        <em class="parameter"><code><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> n</code></em>);</pre>
 <p>Sets the coordinates of XY points a spline curve should pass through.</p>
@@ -419,7 +441,7 @@ scales differ.</p>
 <p>Using unscaled physical coordinates may produce odd results.</p>
 <div class="refsect3">
 <a name="gwy-spline-set-points.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -451,7 +473,7 @@ scales differ.</p>
 <div class="refsect2">
 <a name="gwy-spline-set-slackness"></a><h3>gwy_spline_set_slackness ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-gwy_spline_set_slackness (<em class="parameter"><code><a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline"><span class="type">GwySpline</span></a> *spline</code></em>,
+gwy_spline_set_slackness (<em class="parameter"><code><span class="type">GwySpline</span> *spline</code></em>,
                           <em class="parameter"><code><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> slackness</code></em>);</pre>
 <p>Sets the slackness parameter of a spline curve.</p>
 <p>The slackness parameter determines how taut or slack the curve is.</p>
@@ -463,7 +485,7 @@ tensile stress while values larger than 1 compressive stres.  The default
 value is 1/sqrt(2).</p>
 <div class="refsect3">
 <a name="gwy-spline-set-slackness.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -489,7 +511,7 @@ value is 1/sqrt(2).</p>
 <div class="refsect2">
 <a name="gwy-spline-set-closed"></a><h3>gwy_spline_set_closed ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-gwy_spline_set_closed (<em class="parameter"><code><a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline"><span class="type">GwySpline</span></a> *spline</code></em>,
+gwy_spline_set_closed (<em class="parameter"><code><span class="type">GwySpline</span> *spline</code></em>,
                        <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> closed</code></em>);</pre>
 <p>Sets whether a spline curve is closed or open.</p>
 <p>In closed curve the last point is connected smoothly with the first point,
@@ -502,7 +524,7 @@ again.</p>
 has zero curvature at these two points.</p>
 <div class="refsect3">
 <a name="gwy-spline-set-closed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -529,14 +551,14 @@ closed, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAP
 <div class="refsect2">
 <a name="gwy-spline-length"></a><h3>gwy_spline_length ()</h3>
 <pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
-gwy_spline_length (<em class="parameter"><code><a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline"><span class="type">GwySpline</span></a> *spline</code></em>);</pre>
+gwy_spline_length (<em class="parameter"><code><span class="type">GwySpline</span> *spline</code></em>);</pre>
 <p>Calculates the length of a spline curve.</p>
 <p>This is useful when you want to sample the curve with a specific step
 (at least approximately).</p>
 <p>Note <a class="link" href="libgwyprocess-GwySpline.html#gwy-spline-sample-uniformly" title="gwy_spline_sample_uniformly ()"><code class="function">gwy_spline_sample_uniformly()</code></a> also returns the length.</p>
 <div class="refsect3">
 <a name="gwy-spline-length.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -559,7 +581,7 @@ gwy_spline_length (<em class="parameter"><code><a class="link" href="libgwyproce
 <div class="refsect2">
 <a name="gwy-spline-sample-naturally"></a><h3>gwy_spline_sample_naturally ()</h3>
 <pre class="programlisting">const <span class="returnvalue">GwyXY</span> *
-gwy_spline_sample_naturally (<em class="parameter"><code><a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline"><span class="type">GwySpline</span></a> *spline</code></em>,
+gwy_spline_sample_naturally (<em class="parameter"><code><span class="type">GwySpline</span> *spline</code></em>,
                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> *n</code></em>);</pre>
 <p>Samples efficiently a spline curve.</p>
 <p>This function calculates coordinates of points that lie on the spline curve
@@ -569,7 +591,7 @@ particularly useful for drawing the curve.</p>
 curves and corner case handling.</p>
 <div class="refsect3">
 <a name="gwy-spline-sample-naturally.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -603,7 +625,7 @@ destroyed.</p>
 <div class="refsect2">
 <a name="gwy-spline-sample-uniformly"></a><h3>gwy_spline_sample_uniformly ()</h3>
 <pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
-gwy_spline_sample_uniformly (<em class="parameter"><code><a class="link" href="libgwyprocess-GwySpline.html#GwySpline" title="GwySpline"><span class="type">GwySpline</span></a> *spline</code></em>,
+gwy_spline_sample_uniformly (<em class="parameter"><code><span class="type">GwySpline</span> *spline</code></em>,
                              <em class="parameter"><code><span class="type">GwyXY</span> *xy</code></em>,
                              <em class="parameter"><code><span class="type">GwyXY</span> *t</code></em>,
                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> n</code></em>);</pre>
@@ -632,7 +654,7 @@ points coincide or the curve has only a single point the vectors may be
 (0,0).</p>
 <div class="refsect3">
 <a name="gwy-spline-sample-uniformly.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -674,10 +696,6 @@ May be <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"
 </div>
 <div class="refsect1">
 <a name="libgwyprocess-GwySpline.other_details"></a><h2>Types and Values</h2>
-<div class="refsect2">
-<a name="GwySpline"></a><h3>GwySpline</h3>
-<pre class="programlisting">typedef struct _GwySpline GwySpline;</pre>
-</div>
 </div>
 </div>
 <div class="footer">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-arithmetic.html b/devel-docs/libgwyprocess/html/libgwyprocess-arithmetic.html
index 05db0c0..fa9e4bc 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-arithmetic.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-arithmetic.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>arithmetic: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="GwyCalData.html" title="GwyCalData">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-arithmetic.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -149,7 +149,7 @@ gwy_data_field_sum_fields (<em class="parameter"><code><a class="link" href="Gwy
 <p>Sums two data fields.</p>
 <div class="refsect3">
 <a name="gwy-data-field-sum-fields.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -188,7 +188,7 @@ gwy_data_field_subtract_fields (<em class="parameter"><code><a class="link" href
 <p>Subtracts one data field from another.</p>
 <div class="refsect3">
 <a name="gwy-data-field-subtract-fields.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -227,7 +227,7 @@ gwy_data_field_divide_fields (<em class="parameter"><code><a class="link" href="
 <p>Divides one data field with another.</p>
 <div class="refsect3">
 <a name="gwy-data-field-divide-fields.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -266,7 +266,7 @@ gwy_data_field_multiply_fields (<em class="parameter"><code><a class="link" href
 <p>Multiplies two data fields.</p>
 <div class="refsect3">
 <a name="gwy-data-field-multiply-fields.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -305,7 +305,7 @@ gwy_data_field_min_of_fields (<em class="parameter"><code><a class="link" href="
 <p>Finds point-wise maxima of two data fields.</p>
 <div class="refsect3">
 <a name="gwy-data-field-min-of-fields.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -344,7 +344,7 @@ gwy_data_field_max_of_fields (<em class="parameter"><code><a class="link" href="
 <p>Finds point-wise minima of two data fields.</p>
 <div class="refsect3">
 <a name="gwy-data-field-max-of-fields.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -383,7 +383,7 @@ gwy_data_field_hypot_of_fields (<em class="parameter"><code><a class="link" href
 <p>Finds point-wise hypotenuse of two data fields.</p>
 <div class="refsect3">
 <a name="gwy-data-field-hypot-of-fields.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -423,7 +423,7 @@ gwy_data_field_check_compatibility (<em class="parameter"><code><a class="link"
 <p>Checks whether two data fields are compatible.</p>
 <div class="refsect3">
 <a name="gwy-data-field-check-compatibility.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -464,7 +464,7 @@ gwy_data_line_check_compatibility (<em class="parameter"><code><a class="link" h
 <p>Checks whether two data lines are compatible.</p>
 <div class="refsect3">
 <a name="gwy-data-line-check-compatibility.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -511,7 +511,7 @@ gwy_data_field_extend (<em class="parameter"><code><a class="link" href="GwyData
 method of exterior handling.</p>
 <div class="refsect3">
 <a name="gwy-data-field-extend.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-correct.html b/devel-docs/libgwyprocess/html/libgwyprocess-correct.html
index 56f09a6..2994d80 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-correct.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-correct.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>correct: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="GwyCDLine.html" title="cdline">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-correct.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -121,6 +121,30 @@
 </tr>
 <tr>
 <td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="libgwyprocess-correct.html#gwy-data-field-affine-prepare" title="gwy_data_field_affine_prepare ()">gwy_data_field_affine_prepare</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="libgwyprocess-correct.html#gwy-data-field-measure-lattice-acf" title="gwy_data_field_measure_lattice_acf ()">gwy_data_field_measure_lattice_acf</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="libgwyprocess-correct.html#gwy-data-field-measure-lattice-psdf" title="gwy_data_field_measure_lattice_psdf ()">gwy_data_field_measure_lattice_psdf</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
 </td>
 <td class="function_name">
@@ -167,7 +191,7 @@
 <p>The type of two-dimensional coordinate transform function.</p>
 <div class="refsect3">
 <a name="GwyCoordTransform2DFunc.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -233,7 +257,7 @@ worse for not much speed increase.  Conversely, you may wish to increase
 increased computation time.</p>
 <div class="refsect3">
 <a name="gwy-data-field-laplace-solve.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -292,7 +316,7 @@ non-iteratie <a class="link" href="libgwyprocess-correct.html#gwy-data-field-lap
 faster and more accurate.</div>
 <div class="refsect3">
 <a name="gwy-data-field-correct-laplace-iteration.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -345,7 +369,7 @@ masked and unmasked) into points in <em class="parameter"><code>data_field</code
 <a class="link" href="libgwyprocess-correct.html#gwy-data-field-correct-average-unmasked" title="gwy_data_field_correct_average_unmasked ()"><code class="function">gwy_data_field_correct_average_unmasked()</code></a> instead.</p>
 <div class="refsect3">
 <a name="gwy-data-field-correct-average.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -381,7 +405,7 @@ It is useful as the first rough step of correction of data under the mask.</p>
 <p>If all data are masked the field is filled with zeroes.</p>
 <div class="refsect3">
 <a name="gwy-data-field-correct-average-unmasked.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -419,7 +443,7 @@ corresponds to the usual Gaussian distribution outliers detection if
  is 3.</p>
 <div class="refsect3">
 <a name="gwy-data-field-mask-outliers.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -467,7 +491,7 @@ height.</p>
 root-mean square deviation of heights.</p>
 <div class="refsect3">
 <a name="gwy-data-field-mask-outliers2.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -509,7 +533,7 @@ gwy_data_field_distort (<em class="parameter"><code><a class="link" href="GwyDat
                         <em class="parameter"><code><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
                         <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyInterpolationType" title="enum GwyInterpolationType"><span class="type">GwyInterpolationType</span></a> interp</code></em>,
                         <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyExteriorType" title="enum GwyExteriorType"><span class="type">GwyExteriorType</span></a> exterior</code></em>,
-                        <em class="parameter"><code><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> fill_value</code></em>);</pre>
+                        <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> fill_value</code></em>);</pre>
 <p>Distorts a data field in the horizontal plane.</p>
 <p>Note the transform function <em class="parameter"><code>invtrans</code></em>
  is the inverse transform, in other
@@ -517,7 +541,7 @@ words it calculates the old coordinates from the new coordinates (the
 transform would not be uniquely defined the other way round).</p>
 <div class="refsect3">
 <a name="gwy-data-field-distort.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -586,7 +610,7 @@ gwy_data_field_sample_distorted (<em class="parameter"><code><a class="link" hre
                                  <em class="parameter"><code>const <span class="type">GwyXY</span> *coords</code></em>,
                                  <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyInterpolationType" title="enum GwyInterpolationType"><span class="type">GwyInterpolationType</span></a> interp</code></em>,
                                  <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyExteriorType" title="enum GwyExteriorType"><span class="type">GwyExteriorType</span></a> exterior</code></em>,
-                                 <em class="parameter"><code><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> fill_value</code></em>);</pre>
+                                 <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> fill_value</code></em>);</pre>
 <p>Resamples a data field in an arbitrarily distorted manner.</p>
 <p>Each item in <em class="parameter"><code>coords</code></em>
  corresponds to one pixel in <em class="parameter"><code>dest</code></em>
@@ -595,7 +619,7 @@ coordinates in <em class="parameter"><code>source</code></em>
  defining the value to set in this pixel.</p>
 <div class="refsect3">
 <a name="gwy-data-field-sample-distorted.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -660,7 +684,7 @@ way even degenerate (non-invertible) transforms can be meaningfully used.
 Also note that the (column, row) coordinate system is left-handed.</p>
 <div class="refsect3">
 <a name="gwy-data-field-affine.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -723,6 +747,212 @@ to
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-data-field-affine-prepare"></a><h3>gwy_data_field_affine_prepare ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_data_field_affine_prepare (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *source</code></em>,
+                               <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *dest</code></em>,
+                               <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *a1a2</code></em>,
+                               <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *a1a2_corr</code></em>,
+                               <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *invtrans</code></em>,
+                               <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyAffineScalingType" title="enum GwyAffineScalingType"><span class="type">GwyAffineScalingType</span></a> scaling</code></em>,
+                               <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> prevent_rotation</code></em>,
+                               <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> oversampling</code></em>);</pre>
+<p>Resolves an affine transformation of a data field in the horizontal plane.</p>
+<p>This function calculates suitable arguments for <a class="link" href="libgwyprocess-correct.html#gwy-data-field-affine" title="gwy_data_field_affine ()"><code class="function">gwy_data_field_affine()</code></a>
+from given images and lattice vectors (in real coordinates).</p>
+<p>Data field <em class="parameter"><code>dest</code></em>
+ will be resized and its real dimensions and units set in
+anticipation of <a class="link" href="libgwyprocess-correct.html#gwy-data-field-affine" title="gwy_data_field_affine ()"><code class="function">gwy_data_field_affine()</code></a>.  Its contents will be destroyed.</p>
+<p>Note that <em class="parameter"><code>a1a2_corr</code></em>
+ is an input-output parameter.  In general, the vectors
+will be modified according to <em class="parameter"><code>scaling</code></em>
+ and <em class="parameter"><code>prevent_rotation</code></em>
+ to the actual
+vectors in <em class="parameter"><code>dest</code></em>
+ after the transformation.  Only if <em class="parameter"><code>prevent_rotation</code></em>
+ is
+<a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> and <em class="parameter"><code>scaling</code></em>
+ is <a class="link" href="libgwyprocess-gwyprocessenums.html#GWY-AFFINE-SCALING-AS-GIVEN:CAPS"><code class="literal">GWY_AFFINE_SCALING_AS_GIVEN</code></a> the vectors are
+preserved.</p>
+<div class="refsect3">
+<a name="gwy-data-field-affine-prepare.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>source</p></td>
+<td class="parameter_description"><p>Source data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>dest</p></td>
+<td class="parameter_description"><p>Destination data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>a1a2</p></td>
+<td class="parameter_description"><p>Lattice vectors (or generally base vectors) in <em class="parameter"><code>source</code></em>
+, as an array
+of four components: <em class="parameter"><code>x1</code></em>
+, <em class="parameter"><code>y1</code></em>
+, <em class="parameter"><code>x2</code></em>
+and <em class="parameter"><code>y2</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>a1a2_corr</p></td>
+<td class="parameter_description"><p>Correct lattice vectors (or generally base vectors) <em class="parameter"><code>dest</code></em>
+should
+have after the affine transform, in the same form as <em class="parameter"><code>a1a2</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>invtrans</p></td>
+<td class="parameter_description"><p>Inverse transform as an array of six values to be filled
+according to <a class="link" href="libgwyprocess-correct.html#gwy-data-field-affine" title="gwy_data_field_affine ()"><code class="function">gwy_data_field_affine()</code></a> specification.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>scaling</p></td>
+<td class="parameter_description"><p>How (or if) to scale the correct lattice vectors.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>prevent_rotation</p></td>
+<td class="parameter_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to prevent rotation of the data by rotating
+<em class="parameter"><code>a1a2_corr</code></em>
+as a whole to a direction preserving the
+data orientation.  <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> to take <em class="parameter"><code>a1a2_corr</code></em>
+as given.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>oversampling</p></td>
+<td class="parameter_description"><p>Oversampling factor.  Values larger than 1 mean smaller
+pixels (and more of them) in <em class="parameter"><code>dest</code></em>
+, values smaller than 1
+the opposite.  Pass 1.0 for the default pixel size choice.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-data-field-measure-lattice-acf"></a><h3>gwy_data_field_measure_lattice_acf ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gwy_data_field_measure_lattice_acf (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *acf2d</code></em>,
+                                    <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *a1a2</code></em>);</pre>
+<p>Estimates or improves estimate of lattice vectors from a 2D ACF field.</p>
+<p>Note that the 2D ACF of a data field has to be passed, not the data field
+itself.  The correlation function can be for instance calculated by
+<a class="link" href="libgwyprocess-stats.html#gwy-data-field-2dacf" title="gwy_data_field_2dacf ()"><code class="function">gwy_data_field_2dacf()</code></a>. However, you can calculate and/or process the
+correlation function in any way you see fit.</p>
+<p>When the vectors in <em class="parameter"><code>a1a2</code></em>
+ are zero the function attempts to estimate the
+lattice from scratch.  But if <em class="parameter"><code>a1a2</code></em>
+ contains two non-zero vectors it takes
+them as approximate lattice vectors to improve.</p>
+<p>If the function return <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> the array <em class="parameter"><code>a1a2</code></em>
+ is filled with useless values
+and must be ignored.</p>
+<div class="refsect3">
+<a name="gwy-data-field-measure-lattice-acf.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>acf2d</p></td>
+<td class="parameter_description"><p>Data field containing two-dimensional autocorrelation function.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>a1a2</p></td>
+<td class="parameter_description"><p>Lattice vectors as an array of four components: <em class="parameter"><code>x1</code></em>
+, <em class="parameter"><code>y1</code></em>
+, <em class="parameter"><code>x2</code></em>
+and
+<em class="parameter"><code>y2</code></em>
+(in real coordinates).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-data-field-measure-lattice-acf.returns"></a><h4>Returns</h4>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if good lattice vectors were found, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> on failure.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-data-field-measure-lattice-psdf"></a><h3>gwy_data_field_measure_lattice_psdf ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gwy_data_field_measure_lattice_psdf (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *psdf2d</code></em>,
+                                     <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *a1a2</code></em>);</pre>
+<p>Estimates or improves estimate of lattice vectors from a 2D PSDF field.</p>
+<p>Note that the 2D PSDF of a data field has to be passed, not the data field
+itself.  The spectral density can be for instance calculated by
+<a class="link" href="libgwyprocess-inttrans.html#gwy-data-field-2dfft" title="gwy_data_field_2dfft ()"><code class="function">gwy_data_field_2dfft()</code></a> and summing the squares of real and imaginary parts
+However, you can calculate and/or process the spectral density in any way
+you see fit.</p>
+<p>When the vectors in <em class="parameter"><code>a1a2</code></em>
+ are zero the function attempts to estimate the
+lattice from scratch.  But if <em class="parameter"><code>a1a2</code></em>
+ contains two non-zero vectors it takes
+them as approximate lattice vectors to improve.</p>
+<p>If the function return <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> the array <em class="parameter"><code>a1a2</code></em>
+ is filled with useless values
+and must be ignored.</p>
+<div class="refsect3">
+<a name="gwy-data-field-measure-lattice-psdf.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>psdf2d</p></td>
+<td class="parameter_description"><p>Data field containing two-dimensional power spectrum density
+function (or alternatively Fourier coefficient modulus).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>a1a2</p></td>
+<td class="parameter_description"><p>Lattice vectors as an array of four components: <em class="parameter"><code>x1</code></em>
+, <em class="parameter"><code>y1</code></em>
+, <em class="parameter"><code>x2</code></em>
+and
+<em class="parameter"><code>y2</code></em>
+(in real coordinates).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-data-field-measure-lattice-psdf.returns"></a><h4>Returns</h4>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if good lattice vectors were found, <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> on failure.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-data-line-correct-laplace"></a><h3>gwy_data_line_correct_laplace ()</h3>
 <pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
 gwy_data_line_correct_laplace (<em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *data_line</code></em>,
@@ -734,7 +964,7 @@ Interior missing segments are filled with linear dependence between the edge
 points.  Missing segments with one end open are filled with the edge value.</p>
 <div class="refsect3">
 <a name="gwy-data-line-correct-laplace.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -780,7 +1010,7 @@ Zero or negative values in <em class="parameter"><code>result</code></em>
 values siginify samples that are part of a scar.</p>
 <div class="refsect3">
 <a name="gwy-data-field-mark-scars.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -844,7 +1074,7 @@ gwy_data_field_unrotate_find_corrections
 In addition an estimate is made about the prevalent one.</p>
 <div class="refsect3">
 <a name="gwy-data-field-unrotate-find-corrections.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-correlation.html b/devel-docs/libgwyprocess/html/libgwyprocess-correlation.html
index f666132..0c0bddc 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-correlation.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-correlation.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>correlation: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-correct.html" title="correct">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-correlation.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -65,7 +65,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState" title="GwyComputationState"><span class="returnvalue">GwyComputationState</span></a> *
+<a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState"><span class="returnvalue">GwyComputationState</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="libgwyprocess-correlation.html#gwy-data-field-crosscorrelate-init" title="gwy_data_field_crosscorrelate_init ()">gwy_data_field_crosscorrelate_init</a> <span class="c_punctuation">()</span>
@@ -105,7 +105,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState" title="GwyComputationState"><span class="returnvalue">GwyComputationState</span></a> *
+<a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState"><span class="returnvalue">GwyComputationState</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="libgwyprocess-correlation.html#gwy-data-field-correlate-init" title="gwy_data_field_correlate_init ()">gwy_data_field_correlate_init</a> <span class="c_punctuation">()</span>
@@ -166,7 +166,7 @@ postion of the correlation window on data is given by
 function returns -1.0 (none correlation)..</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-correlation-score.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -252,7 +252,7 @@ postion of the correlation window on data is given by
 function returns -1.0 (none correlation)..</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-weighted-correlation-score.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -341,7 +341,7 @@ in the <em class="parameter"><code>data_field2</code></em>
 .</p>
 <div class="refsect3">
 <a name="gwy-data-field-crosscorrelate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -402,7 +402,7 @@ used.  Pass zero.</p></td>
 <hr>
 <div class="refsect2">
 <a name="gwy-data-field-crosscorrelate-init"></a><h3>gwy_data_field_crosscorrelate_init ()</h3>
-<pre class="programlisting"><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState" title="GwyComputationState"><span class="returnvalue">GwyComputationState</span></a> *
+<pre class="programlisting"><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState"><span class="returnvalue">GwyComputationState</span></a> *
 gwy_data_field_crosscorrelate_init (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field1</code></em>,
                                     <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field2</code></em>,
                                     <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *x_dist</code></em>,
@@ -416,7 +416,7 @@ gwy_data_field_crosscorrelate_init (<em class="parameter"><code><a class="link"
 <p>This iterator reports its state as <a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationStateType" title="enum GwyComputationStateType"><span class="type">GwyComputationStateType</span></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-crosscorrelate-init.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -481,13 +481,13 @@ gwy_data_field_crosscorrelate_init (<em class="parameter"><code><a class="link"
 <a name="gwy-data-field-crosscorrelate-set-weights"></a><h3>gwy_data_field_crosscorrelate_set_weights ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_field_crosscorrelate_set_weights
-                               (<em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState" title="GwyComputationState"><span class="type">GwyComputationState</span></a> *state</code></em>,
+                               (<em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState"><span class="type">GwyComputationState</span></a> *state</code></em>,
                                 <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyWindowingType" title="enum GwyWindowingType"><span class="type">GwyWindowingType</span></a> type</code></em>);</pre>
 <p>Sets the weight function to be used within iterative cross-correlation algorithm. By default (not setting it),
 rectangular windowing is used. This function should be called before running first iteration to get consistent results.</p>
 <div class="refsect3">
 <a name="gwy-data-field-crosscorrelate-set-weights.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -513,7 +513,7 @@ rectangular windowing is used. This function should be called before running fir
 <a name="gwy-data-field-crosscorrelate-iteration"></a><h3>gwy_data_field_crosscorrelate_iteration ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_field_crosscorrelate_iteration
-                               (<em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState" title="GwyComputationState"><span class="type">GwyComputationState</span></a> *state</code></em>);</pre>
+                               (<em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState"><span class="type">GwyComputationState</span></a> *state</code></em>);</pre>
 <p>Performs one iteration of cross-correlation.</p>
 <p>Cross-correlation matches two different images of the same object under
 changes.</p>
@@ -535,7 +535,7 @@ by finishing or being aborted, <a class="link" href="libgwyprocess-correlation.h
 must be called to release allocated resources.</p>
 <div class="refsect3">
 <a name="gwy-data-field-crosscorrelate-iteration.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -554,11 +554,11 @@ must be called to release allocated resources.</p>
 <a name="gwy-data-field-crosscorrelate-finalize"></a><h3>gwy_data_field_crosscorrelate_finalize ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_field_crosscorrelate_finalize
-                               (<em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState" title="GwyComputationState"><span class="type">GwyComputationState</span></a> *state</code></em>);</pre>
+                               (<em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState"><span class="type">GwyComputationState</span></a> *state</code></em>);</pre>
 <p>Destroys a cross-correlation iterator, freeing all resources.</p>
 <div class="refsect3">
 <a name="gwy-data-field-crosscorrelate-finalize.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -596,7 +596,7 @@ the area where the kernel field fits into the data field completely are
 set to -1 for <a class="link" href="libgwyprocess-gwyprocessenums.html#GWY-CORRELATION-NORMAL:CAPS"><code class="literal">GWY_CORRELATION_NORMAL</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-correlate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -630,7 +630,7 @@ set to -1 for <a class="link" href="libgwyprocess-gwyprocessenums.html#GWY-CORRE
 <hr>
 <div class="refsect2">
 <a name="gwy-data-field-correlate-init"></a><h3>gwy_data_field_correlate_init ()</h3>
-<pre class="programlisting"><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState" title="GwyComputationState"><span class="returnvalue">GwyComputationState</span></a> *
+<pre class="programlisting"><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState"><span class="returnvalue">GwyComputationState</span></a> *
 gwy_data_field_correlate_init (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>,
                                <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *kernel_field</code></em>,
                                <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *score</code></em>);</pre>
@@ -638,7 +638,7 @@ gwy_data_field_correlate_init (<em class="parameter"><code><a class="link" href=
 <p>This iterator reports its state as <a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationStateType" title="enum GwyComputationStateType"><span class="type">GwyComputationStateType</span></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-correlate-init.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -672,7 +672,7 @@ gwy_data_field_correlate_init (<em class="parameter"><code><a class="link" href=
 <div class="refsect2">
 <a name="gwy-data-field-correlate-iteration"></a><h3>gwy_data_field_correlate_iteration ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-gwy_data_field_correlate_iteration (<em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState" title="GwyComputationState"><span class="type">GwyComputationState</span></a> *state</code></em>);</pre>
+gwy_data_field_correlate_iteration (<em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState"><span class="type">GwyComputationState</span></a> *state</code></em>);</pre>
 <p>Performs one iteration of correlation.</p>
 <p>An iterator can be created with <a class="link" href="libgwyprocess-correlation.html#gwy-data-field-correlate-init" title="gwy_data_field_correlate_init ()"><code class="function">gwy_data_field_correlate_init()</code></a>.
 When iteration ends, either by finishing or being aborted,
@@ -680,7 +680,7 @@ When iteration ends, either by finishing or being aborted,
 resources.</p>
 <div class="refsect3">
 <a name="gwy-data-field-correlate-iteration.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -698,11 +698,11 @@ resources.</p>
 <div class="refsect2">
 <a name="gwy-data-field-correlate-finalize"></a><h3>gwy_data_field_correlate_finalize ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-gwy_data_field_correlate_finalize (<em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState" title="GwyComputationState"><span class="type">GwyComputationState</span></a> *state</code></em>);</pre>
+gwy_data_field_correlate_finalize (<em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState"><span class="type">GwyComputationState</span></a> *state</code></em>);</pre>
 <p>Destroys a correlation iterator, freeing all resources.</p>
 <div class="refsect3">
 <a name="gwy-data-field-correlate-finalize.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-cwt.html b/devel-docs/libgwyprocess/html/libgwyprocess-cwt.html
index 059a6b3..6cc274b 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-cwt.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-cwt.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>cwt: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-correlation.html" title="correlation">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-cwt.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-dwt.html b/devel-docs/libgwyprocess/html/libgwyprocess-dwt.html
index f1b7409..5a0d29e 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-dwt.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-dwt.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>dwt: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-cwt.html" title="cwt">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-dwt.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -108,7 +108,7 @@ gwy_dwt_set_coefficients (<em class="parameter"><code><a class="link" href="GwyD
 <p>Fills resampled or nely allocated data line with wavelet coefficients.</p>
 <div class="refsect3">
 <a name="gwy-dwt-set-coefficients.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -152,7 +152,7 @@ or <em class="parameter"><code>minsize</code></em>
  = 4 to perform full decomposition (or anything between).</p>
 <div class="refsect3">
 <a name="gwy-data-line-dwt.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -201,7 +201,7 @@ or <em class="parameter"><code>minsize</code></em>
  = 4 to perform full decomposition (or anything between).</p>
 <div class="refsect3">
 <a name="gwy-data-field-xdwt.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -250,7 +250,7 @@ or <em class="parameter"><code>minsize</code></em>
  = 4 to perform full decomposition (or anything between).</p>
 <div class="refsect3">
 <a name="gwy-data-field-ydwt.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -299,7 +299,7 @@ or <em class="parameter"><code>minsize</code></em>
  = 4 to perform full decomposition (or anything between).</p>
 <div class="refsect3">
 <a name="gwy-data-field-dwt.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -349,7 +349,7 @@ or <em class="parameter"><code>minsize</code></em>
  = 4 to perform full decomposition (or anything between).</p>
 <div class="refsect3">
 <a name="gwy-data-field-dwt-mark-anisotropy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-elliptic.html b/devel-docs/libgwyprocess/html/libgwyprocess-elliptic.html
index d880e5f..c31aad5 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-elliptic.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-elliptic.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>elliptic: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-dwt.html" title="dwt">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-elliptic.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -111,6 +111,14 @@
 <a class="link" href="libgwyprocess-elliptic.html#gwy-data-field-get-circular-area-size" title="gwy_data_field_get_circular_area_size ()">gwy_data_field_get_circular_area_size</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="libgwyprocess-elliptic.html#gwy-data-field-local-maximum" title="gwy_data_field_local_maximum ()">gwy_data_field_local_maximum</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -205,14 +213,14 @@ gwy_data_field_elliptic_area_fill (<em class="parameter"><code><a class="link" h
                                    <em class="parameter"><code><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> col</code></em>,
                                    <em class="parameter"><code><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> row</code></em>,
                                    <em class="parameter"><code><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> width</code></em>,
-                                   <em class="parameter"><code><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> height</code></em>,
+                                   <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> height</code></em>,
                                    <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> value</code></em>);</pre>
 <p>Fills an elliptic region of a data field with given value.</p>
 <p>The elliptic region is defined by its bounding box which must be completely
 contained in the data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-elliptic-area-fill.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -272,7 +280,7 @@ gwy_data_field_elliptic_area_extract (<em class="parameter"><code><a class="link
 contained in the data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-elliptic-area-extract.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -343,7 +351,7 @@ allowing to implement pixel-wise filters on elliptic areas.  Values from
 <a class="link" href="libgwyprocess-elliptic.html#gwy-data-field-elliptic-area-extract" title="gwy_data_field_elliptic_area_extract ()"><code class="function">gwy_data_field_elliptic_area_extract()</code></a> took them from.</p>
 <div class="refsect3">
 <a name="gwy-data-field-elliptic-area-unextract.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -394,7 +402,7 @@ gwy_data_field_get_elliptic_area_size (<em class="parameter"><code><a href="/usr
 <p>Calculates an upper bound of the number of samples in an elliptic region.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-elliptic-area-size.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -432,7 +440,7 @@ gwy_data_field_circular_area_fill (<em class="parameter"><code><a class="link" h
 <p>Fills an elliptic region of a data field with given value.</p>
 <div class="refsect3">
 <a name="gwy-data-field-circular-area-fill.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -487,7 +495,7 @@ gwy_data_field_circular_area_extract (<em class="parameter"><code><a class="link
 <p>Extracts values from a circular region of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-circular-area-extract.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -554,7 +562,7 @@ area centre, i.e. to (<em class="parameter"><code>col</code></em>
 .</p>
 <div class="refsect3">
 <a name="gwy-data-field-circular-area-extract-with-pos.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -637,7 +645,7 @@ allowing to implement pixel-wise filters on circular areas.  Values from
 <a class="link" href="libgwyprocess-elliptic.html#gwy-data-field-circular-area-extract" title="gwy_data_field_circular_area_extract ()"><code class="function">gwy_data_field_circular_area_extract()</code></a> took them from.</p>
 <div class="refsect3">
 <a name="gwy-data-field-circular-area-unextract.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -682,7 +690,7 @@ gwy_data_field_get_circular_area_size (<em class="parameter"><code><a href="/usr
 <p>Calculates an upper bound of the number of samples in a circular region.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-circular-area-size.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -701,6 +709,75 @@ gwy_data_field_get_circular_area_size (<em class="parameter"><code><a href="/usr
 bounds (or its upper bound).</p>
 </div>
 </div>
+<hr>
+<div class="refsect2">
+<a name="gwy-data-field-local-maximum"></a><h3>gwy_data_field_local_maximum ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gwy_data_field_local_maximum (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *dfield</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *x</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *y</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> ax</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> ay</code></em>);</pre>
+<p>Searches an elliptical area in a data field for local maximum.</p>
+<p>The area may stick outside the data field.</p>
+<p>The function first finds the maximum within the ellipse, intersected with
+the data field and then tries subpixel refinement.  The maximum is
+considered successfully located if it is inside the data field, i.e. not on
+edge, there is no higher value in its 8-neighbourhood, and the subpixel
+refinement of its position succeeds (which usually happens when the
+first two conditions are met, but not always).</p>
+<p>Even if the function returns <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> the values of <em class="parameter"><code>x</code></em>
+ and <em class="parameter"><code>y</code></em>
+ are reasonable,
+but they may not correspond to an actual maximum.</p>
+<p>The radii can be zero.  A single pixel is then examined, but if it is indeed
+a local maximum, its position is refined.</p>
+<div class="refsect3">
+<a name="gwy-data-field-local-maximum.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>dfield</p></td>
+<td class="parameter_description"><p>A two-dimensional data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>x</p></td>
+<td class="parameter_description"><p>Approximate maximum <em class="parameter"><code>x</code></em>
+-location to be improved (in pixels).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>y</p></td>
+<td class="parameter_description"><p>Approximate maximum <em class="parameter"><code>y</code></em>
+-location to be improved (in pixels).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>ax</p></td>
+<td class="parameter_description"><p>Horizontal search radius.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>ay</p></td>
+<td class="parameter_description"><p>Vertical search radius.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-data-field-local-maximum.returns"></a><h4>Returns</h4>
+<p> <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the maximum was successfully located.  <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> when the
+location is problematic and should not be used.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
 </div>
 <div class="refsect1">
 <a name="libgwyprocess-elliptic.other_details"></a><h2>Types and Values</h2>
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-filters.html b/devel-docs/libgwyprocess/html/libgwyprocess-filters.html
index 09d3015..f7cfd70 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-filters.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-filters.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>filters: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-elliptic.html" title="elliptic">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-filters.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -124,6 +124,14 @@
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
+<a class="link" href="libgwyprocess-filters.html#gwy-data-field-area-ext-convolve" title="gwy_data_field_area_ext_convolve ()">gwy_data_field_area_ext_convolve</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
 <a class="link" href="libgwyprocess-filters.html#gwy-data-field-convolve-1d" title="gwy_data_field_convolve_1d ()">gwy_data_field_convolve_1d</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
@@ -140,6 +148,14 @@
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
+<a class="link" href="libgwyprocess-filters.html#gwy-data-field-area-ext-row-convolve" title="gwy_data_field_area_ext_row_convolve ()">gwy_data_field_area_ext_row_convolve</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
 <a class="link" href="libgwyprocess-filters.html#gwy-data-field-filter-median" title="gwy_data_field_filter_median ()">gwy_data_field_filter_median</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
@@ -436,7 +452,7 @@ gwy_data_field_normalize (<em class="parameter"><code><a class="link" href="GwyD
  is filled with only one value, it is changed to 0.0.</p>
 <div class="refsect3">
 <a name="gwy-data-field-normalize.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -477,7 +493,7 @@ gwy_data_field_fill(<em class="parameter"><code>data_field</code></em>
 ).</p>
 <div class="refsect3">
 <a name="gwy-data-field-renormalize.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -535,7 +551,7 @@ gwy_data_field_fill(<em class="parameter"><code>data_field</code></em>
 ).</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-renormalize.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -599,7 +615,7 @@ than <em class="parameter"><code>threshold</code></em>
 </p>
 <div class="refsect3">
 <a name="gwy-data-field-threshold.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -655,7 +671,7 @@ than <em class="parameter"><code>threshold</code></em>
 </p>
 <div class="refsect3">
 <a name="gwy-data-field-area-threshold.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -720,7 +736,7 @@ gwy_data_field_clamp (<em class="parameter"><code><a class="link" href="GwyDataF
 <p>Limits data field values to a range.</p>
 <div class="refsect3">
 <a name="gwy-data-field-clamp.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -767,7 +783,7 @@ gwy_data_field_area_clamp (<em class="parameter"><code><a class="link" href="Gwy
 <p>Limits values in a rectangular part of a data field to a range.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-clamp.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -860,7 +876,7 @@ errors of all output values are given by the largest input values, that is
 relative precision of results small in absolute value may be poor.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-gather.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -944,7 +960,7 @@ gwy_data_field_convolve (<em class="parameter"><code><a class="link" href="GwyDa
 <p>Convolves a data field with given kernel.</p>
 <div class="refsect3">
 <a name="gwy-data-field-convolve.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -981,7 +997,7 @@ gwy_data_field_area_convolve (<em class="parameter"><code><a class="link" href="
 <p>Convolves a rectangular part of a data field with given kernel.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-convolve.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1027,6 +1043,127 @@ with.</p></td>
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-data-field-area-ext-convolve"></a><h3>gwy_data_field_area_ext_convolve ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_data_field_area_ext_convolve (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *field</code></em>,
+                                  <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> col</code></em>,
+                                  <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> row</code></em>,
+                                  <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> width</code></em>,
+                                  <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> height</code></em>,
+                                  <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *target</code></em>,
+                                  <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *kernel</code></em>,
+                                  <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyExteriorType" title="enum GwyExteriorType"><span class="type">GwyExteriorType</span></a> exterior</code></em>,
+                                  <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> fill_value</code></em>,
+                                  <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> as_integral</code></em>);</pre>
+<p>Convolve a field with a two-dimensional kernel.</p>
+<p>Pixel dimensions of <em class="parameter"><code>target</code></em>
+ may match either <em class="parameter"><code>field</code></em>
+ or just the rectangular
+area.  In the former case the result is written in the same rectangular
+area; in the latter case the result fills the entire <em class="parameter"><code>target</code></em>
+.</p>
+<p>The convolution is performed with the kernel centred on the respective field
+pixels.  For directions in which the kernel has an odd size this holds
+precisely.  For an even-sized kernel this means the kernel centre is placed
+0.5 pixel left or up (towards lower indices) from the respective field
+pixel.</p>
+<p>See <a class="link" href="libgwyprocess-arithmetic.html#gwy-data-field-extend" title="gwy_data_field_extend ()"><code class="function">gwy_data_field_extend()</code></a> for what constitutes the exterior and how it is
+handled.</p>
+<p>If <em class="parameter"><code>as_integral</code></em>
+ is <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> the function performs a simple discrete
+convolution sum and the value units of <em class="parameter"><code>target</code></em>
+ are set to product of <em class="parameter"><code>field</code></em>
+
+and <em class="parameter"><code>kernel</code></em>
+ units.</p>
+<p>If <em class="parameter"><code>as_integral</code></em>
+ is <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> the function approximates a convolution integral.
+In this case <em class="parameter"><code>kernel</code></em>
+ should be a sampled continuous transfer function.
+The units of value <em class="parameter"><code>target</code></em>
+ are set to product of <em class="parameter"><code>field</code></em>
+ and <em class="parameter"><code>kernel</code></em>
+ value
+units and <em class="parameter"><code>field</code></em>
+ lateral units squared.  Furthermore, the discrete sum is
+multiplied by the pixel size (i.e. d<em class="parameter"><code>x</code></em>
+ d<em class="parameter"><code>y</code></em>
+ in the integral).</p>
+<p>In either case, the lateral units and pixel size of <em class="parameter"><code>kernel</code></em>
+ are assumed to
+be the same as for <em class="parameter"><code>field</code></em>
+ (albeit not checked), because the convolution does
+not make sense otherwise.</p>
+<div class="refsect3">
+<a name="gwy-data-field-area-ext-convolve.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>field</p></td>
+<td class="parameter_description"><p>A two-dimensional data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>col</p></td>
+<td class="parameter_description"><p>Upper-left column coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>row</p></td>
+<td class="parameter_description"><p>Upper-left row coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>width</p></td>
+<td class="parameter_description"><p>Area width (number of columns).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>height</p></td>
+<td class="parameter_description"><p>Area height (number of rows).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>target</p></td>
+<td class="parameter_description"><p>A two-dimensional data field where the result will be placed.
+It may be <em class="parameter"><code>field</code></em>
+for an in-place modification.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>kernel</p></td>
+<td class="parameter_description"><p>Kernel to convolve <em class="parameter"><code>field</code></em>
+with.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>exterior</p></td>
+<td class="parameter_description"><p>Exterior pixels handling.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>fill_value</p></td>
+<td class="parameter_description"><p>The value to use with <a class="link" href="libgwyprocess-gwyprocessenums.html#GWY-EXTERIOR-FIXED-VALUE:CAPS"><code class="literal">GWY_EXTERIOR_FIXED_VALUE</code></a> exterior.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>as_integral</p></td>
+<td class="parameter_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> for normalisation and units as a convolution integral,
+<a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> as a sum.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-data-field-convolve-1d"></a><h3>gwy_data_field_convolve_1d ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_field_convolve_1d (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>,
@@ -1035,7 +1172,7 @@ gwy_data_field_convolve_1d (<em class="parameter"><code><a class="link" href="Gw
 <p>Convolves a data field with given linear kernel.</p>
 <div class="refsect3">
 <a name="gwy-data-field-convolve-1d.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1081,7 +1218,7 @@ gwy_data_field_area_convolve_1d (<em class="parameter"><code><a class="link" hre
 horizontal and vertical convolutions instead one 2D convolution.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-convolve-1d.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1135,6 +1272,125 @@ column-wise convolution).</p></td>
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-data-field-area-ext-row-convolve"></a><h3>gwy_data_field_area_ext_row_convolve ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_data_field_area_ext_row_convolve (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *field</code></em>,
+                                      <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> col</code></em>,
+                                      <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> row</code></em>,
+                                      <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> width</code></em>,
+                                      <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> height</code></em>,
+                                      <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *target</code></em>,
+                                      <em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *kernel</code></em>,
+                                      <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyExteriorType" title="enum GwyExteriorType"><span class="type">GwyExteriorType</span></a> exterior</code></em>,
+                                      <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> fill_value</code></em>,
+                                      <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> as_integral</code></em>);</pre>
+<p>Convolve a field row-wise with a one-dimensional kernel.</p>
+<p>Pixel dimensions of <em class="parameter"><code>target</code></em>
+ may match either <em class="parameter"><code>field</code></em>
+ or just the rectangular
+area.  In the former case the result is written in the same rectangular
+area; in the latter case the result fills the entire <em class="parameter"><code>target</code></em>
+.</p>
+<p>The convolution is performed with the kernel centred on the respective field
+pixels.  For an odd-sized kernel this holds precisely.  For an even-sized
+kernel this means the kernel centre is placed 0.5 pixel to the left
+(towards lower column indices) from the respective field pixel.</p>
+<p>See <a class="link" href="libgwyprocess-arithmetic.html#gwy-data-field-extend" title="gwy_data_field_extend ()"><code class="function">gwy_data_field_extend()</code></a> for what constitutes the exterior and how it is
+handled.</p>
+<p>If <em class="parameter"><code>as_integral</code></em>
+ is <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> the function performs a simple discrete
+convolution sum and the value units of <em class="parameter"><code>target</code></em>
+ are set to product of <em class="parameter"><code>field</code></em>
+
+and <em class="parameter"><code>kernel</code></em>
+ units.</p>
+<p>If <em class="parameter"><code>as_integral</code></em>
+ is <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> the function approximates a convolution integral.
+In this case <em class="parameter"><code>kernel</code></em>
+ should be a sampled continuous transfer function.
+The units of value <em class="parameter"><code>target</code></em>
+ are set to product of <em class="parameter"><code>field</code></em>
+ and <em class="parameter"><code>kernel</code></em>
+ value
+units and <em class="parameter"><code>field</code></em>
+ lateral units.  Furthermore, the discrete sum is multiplied
+by the pixel size (i.e. d<em class="parameter"><code>x</code></em>
+ in the integral).</p>
+<p>In either case, the lateral units and pixel size of <em class="parameter"><code>kernel</code></em>
+ are assumed to
+be the same as for a <em class="parameter"><code>field</code></em>
+'s row (albeit not checked), because
+the convolution does not make sense otherwise.</p>
+<div class="refsect3">
+<a name="gwy-data-field-area-ext-row-convolve.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>field</p></td>
+<td class="parameter_description"><p>A two-dimensional data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>col</p></td>
+<td class="parameter_description"><p>Upper-left column coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>row</p></td>
+<td class="parameter_description"><p>Upper-left row coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>width</p></td>
+<td class="parameter_description"><p>Area width (number of columns).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>height</p></td>
+<td class="parameter_description"><p>Area height (number of rows).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>target</p></td>
+<td class="parameter_description"><p>A two-dimensional data field where the result will be placed.
+It may be <em class="parameter"><code>field</code></em>
+for an in-place modification.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>kernel</p></td>
+<td class="parameter_description"><p>Kernel to convolve <em class="parameter"><code>field</code></em>
+with.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>exterior</p></td>
+<td class="parameter_description"><p>Exterior pixels handling.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>fill_value</p></td>
+<td class="parameter_description"><p>The value to use with <a class="link" href="libgwyprocess-gwyprocessenums.html#GWY-EXTERIOR-FIXED-VALUE:CAPS"><code class="literal">GWY_EXTERIOR_FIXED_VALUE</code></a> exterior.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>as_integral</p></td>
+<td class="parameter_description"><p><a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> for normalisation and units as a convolution integral,
+<a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> as a sum.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-data-field-filter-median"></a><h3>gwy_data_field_filter_median ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_field_filter_median (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>,
@@ -1142,7 +1398,7 @@ gwy_data_field_filter_median (<em class="parameter"><code><a class="link" href="
 <p>Filters a data field with median filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-median.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1176,7 +1432,7 @@ gwy_data_field_area_filter_median (<em class="parameter"><code><a class="link" h
 <p>Filters a rectangular part of a data field with median filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-filter-median.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1227,7 +1483,7 @@ gwy_data_field_filter_mean (<em class="parameter"><code><a class="link" href="Gw
 .</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-mean.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1263,7 +1519,7 @@ gwy_data_field_area_filter_mean (<em class="parameter"><code><a class="link" hre
 <p>This method is a simple <a class="link" href="libgwyprocess-filters.html#gwy-data-field-area-gather" title="gwy_data_field_area_gather ()"><code class="function">gwy_data_field_area_gather()</code></a> wrapper.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-filter-mean.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1313,7 +1569,7 @@ gwy_data_field_filter_conservative (<em class="parameter"><code><a class="link"
 <p>Filters a data field with conservative denoise filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-conservative.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1348,7 +1604,7 @@ gwy_data_field_area_filter_conservative
 <p>Filters a rectangular part of a data field with conservative denoise filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-filter-conservative.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1397,7 +1653,7 @@ gwy_data_field_filter_laplacian (<em class="parameter"><code><a class="link" hre
 <p>Filters a data field with Laplacian filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-laplacian.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1423,7 +1679,7 @@ gwy_data_field_area_filter_laplacian (<em class="parameter"><code><a class="link
 <p>Filters a rectangular part of a data field with Laplacian filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-filter-laplacian.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1468,7 +1724,7 @@ gwy_data_field_filter_laplacian_of_gaussians
 <p>Filters a data field with Laplacian of Gaussians filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-laplacian-of-gaussians.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1497,7 +1753,7 @@ gwy_data_field_area_filter_laplacian_of_gaussians
 with Laplacian of Gaussians filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-filter-laplacian-of-gaussians.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1543,7 +1799,7 @@ gwy_data_field_filter_sobel (<em class="parameter"><code><a class="link" href="G
 <p>Filters a data field with a directional Sobel filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-sobel.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1577,7 +1833,7 @@ gwy_data_field_area_filter_sobel (<em class="parameter"><code><a class="link" hr
 <p>Filters a rectangular part of a data field with a directional Sobel filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-filter-sobel.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1626,7 +1882,7 @@ gwy_data_field_filter_sobel_total (<em class="parameter"><code><a class="link" h
 <p>Filters a data field with total Sobel filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-sobel-total.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1650,7 +1906,7 @@ gwy_data_field_filter_prewitt (<em class="parameter"><code><a class="link" href=
 <p>Filters a data field with Prewitt filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-prewitt.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1685,7 +1941,7 @@ gwy_data_field_area_filter_prewitt (<em class="parameter"><code><a class="link"
 filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-filter-prewitt.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1734,7 +1990,7 @@ gwy_data_field_filter_prewitt_total (<em class="parameter"><code><a class="link"
 <p>Filters a data field with total Prewitt filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-prewitt-total.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1762,7 +2018,7 @@ physical units, not pixel-wise), except at the edges where the differences
 are one-sided.</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-slope.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1799,7 +2055,7 @@ gwy_data_field_filter_dechecker (<em class="parameter"><code><a class="link" hre
 <p>Filters a data field with 5x5 checker pattern removal filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-dechecker.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1827,7 +2083,7 @@ gwy_data_field_area_filter_dechecker (<em class="parameter"><code><a class="link
 filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-filter-dechecker.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1873,7 +2129,7 @@ gwy_data_field_filter_gaussian (<em class="parameter"><code><a class="link" href
 <p>Filters a data field with a Gaussian filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-gaussian.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1909,7 +2165,7 @@ gwy_data_field_area_filter_gaussian (<em class="parameter"><code><a class="link"
 <p>The Gausian is normalized, i.e. it is sum-preserving.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-filter-gaussian.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1960,7 +2216,7 @@ gwy_data_field_filter_minimum (<em class="parameter"><code><a class="link" href=
 <p>Filters a data field with minimum filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-minimum.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1995,7 +2251,7 @@ gwy_data_field_area_filter_minimum (<em class="parameter"><code><a class="link"
 <p>This operation is often called erosion filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-filter-minimum.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2045,7 +2301,7 @@ gwy_data_field_filter_maximum (<em class="parameter"><code><a class="link" href=
 <p>Filters a data field with maximum filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-maximum.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2080,7 +2336,7 @@ gwy_data_field_area_filter_maximum (<em class="parameter"><code><a class="link"
 <p>This operation is often called dilation filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-filter-maximum.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2156,7 +2412,7 @@ structuring elements, are much faster for large sizes of the squares.</p>
 <p>The exterior is always handled as <a class="link" href="libgwyprocess-gwyprocessenums.html#GWY-EXTERIOR-BORDER-EXTEND:CAPS"><code class="literal">GWY_EXTERIOR_BORDER_EXTEND</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-filter-min-max.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2225,7 +2481,7 @@ largest disc in the sequence fits into a (2<em class="parameter"><code>size</cod
  + 1) square.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-filter-disc-asf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2284,7 +2540,7 @@ gwy_data_field_filter_rms (<em class="parameter"><code><a class="link" href="Gwy
 <p>Filters a data field with RMS filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-rms.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2320,7 +2576,7 @@ gwy_data_field_area_filter_rms (<em class="parameter"><code><a class="link" href
 <p>RMS filter computes root mean square in given area.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-filter-rms.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2369,7 +2625,7 @@ gwy_data_field_filter_kuwahara (<em class="parameter"><code><a class="link" href
 <p>Filters a data field with Kuwahara filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-kuwahara.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2396,7 +2652,7 @@ gwy_data_field_area_filter_kuwahara (<em class="parameter"><code><a class="link"
 (edge-preserving smoothing) filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-filter-kuwahara.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2441,7 +2697,7 @@ gwy_data_field_filter_canny (<em class="parameter"><code><a class="link" href="G
 <p>Filters a rectangular part of a data field with canny edge detector filter.</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-canny.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2473,7 +2729,7 @@ gwy_data_field_shade (<em class="parameter"><code><a class="link" href="GwyDataF
 <p>Shades a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-shade.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2519,7 +2775,7 @@ gwy_data_field_filter_harris (<em class="parameter"><code><a class="link" href="
 <p>All passed data field must have the same size.</p>
 <div class="refsect3">
 <a name="gwy-data-field-filter-harris.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-fractals.html b/devel-docs/libgwyprocess/html/libgwyprocess-fractals.html
index e5cc65d..d09977b 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-fractals.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-fractals.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>fractals: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-filters.html" title="filters">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-fractals.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -138,7 +138,7 @@ gwy_data_field_fractal_partitioning (<em class="parameter"><code><a class="link"
 they will contain corresponding values at each position.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fractal-partitioning.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -184,7 +184,7 @@ gwy_data_field_fractal_cubecounting (<em class="parameter"><code><a class="link"
 they will contain corresponding values at each position.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fractal-cubecounting.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -230,7 +230,7 @@ gwy_data_field_fractal_triangulation (<em class="parameter"><code><a class="link
 they will contain corresponding values at each position.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fractal-triangulation.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -276,7 +276,7 @@ gwy_data_field_fractal_psdf (<em class="parameter"><code><a class="link" href="G
 they will contain corresponding values at each position.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fractal-psdf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -323,7 +323,7 @@ gwy_data_field_fractal_cubecounting_dim
 <a class="link" href="libgwyprocess-fractals.html#gwy-data-field-fractal-cubecounting" title="gwy_data_field_fractal_cubecounting ()"><code class="function">gwy_data_field_fractal_cubecounting()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fractal-cubecounting-dim.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -374,7 +374,7 @@ gwy_data_field_fractal_triangulation_dim
 <a class="link" href="libgwyprocess-fractals.html#gwy-data-field-fractal-triangulation" title="gwy_data_field_fractal_triangulation ()"><code class="function">gwy_data_field_fractal_triangulation()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fractal-triangulation-dim.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -425,7 +425,7 @@ gwy_data_field_fractal_partitioning_dim
 <a class="link" href="libgwyprocess-fractals.html#gwy-data-field-fractal-partitioning" title="gwy_data_field_fractal_partitioning ()"><code class="function">gwy_data_field_fractal_partitioning()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fractal-partitioning-dim.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -476,7 +476,7 @@ log-log plot data.</p>
 <a class="link" href="libgwyprocess-fractals.html#gwy-data-field-fractal-psdf" title="gwy_data_field_fractal_psdf ()"><code class="function">gwy_data_field_fractal_psdf()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fractal-psdf-dim.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -522,7 +522,7 @@ gwy_data_field_fractal_correction (<em class="parameter"><code><a class="link" h
 interpolation.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fractal-correction.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-grains.html b/devel-docs/libgwyprocess/html/libgwyprocess-grains.html
index c5cd675..2ddf8f9 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-grains.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-grains.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>grains: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-fractals.html" title="fractals">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-grains.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -105,7 +105,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState" title="GwyComputationState"><span class="returnvalue">GwyComputationState</span></a> *
+<a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState"><span class="returnvalue">GwyComputationState</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="libgwyprocess-grains.html#gwy-data-field-grains-watershed-init" title="gwy_data_field_grains_watershed_init ()">gwy_data_field_grains_watershed_init</a> <span class="c_punctuation">()</span>
@@ -313,6 +313,14 @@
 </tr>
 <tr>
 <td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="libgwyprocess-grains.html#gwy-data-field-grains-thin" title="gwy_data_field_grains_thin ()">gwy_data_field_grains_thin</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
 </td>
 <td class="function_name">
@@ -358,7 +366,7 @@ gwy_data_field_grains_mark_curvature (<em class="parameter"><code><a class="link
 <p>Marks data that are above/below curvature threshold.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-mark-curvature.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -406,7 +414,7 @@ gwy_data_field_grains_mark_watershed (<em class="parameter"><code><a class="link
 <p>Performs watershed algorithm.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-mark-watershed.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -472,7 +480,7 @@ gwy_data_field_grains_remove_grain (<em class="parameter"><code><a class="link"
 <p>Removes one grain at given position.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-remove-grain.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -518,7 +526,7 @@ gwy_data_field_grains_extract_grain (<em class="parameter"><code><a class="link"
 ), all grains are removed.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-extract-grain.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -561,7 +569,7 @@ gwy_data_field_grains_remove_by_number
 .</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-remove-by-number.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -592,7 +600,7 @@ gwy_data_field_grains_remove_by_size (<em class="parameter"><code><a class="link
 <p>Removes all grains below specified area.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-remove-by-size.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -625,7 +633,7 @@ gwy_data_field_grains_remove_by_height
 <p>Removes grains that are higher/lower than given threshold value.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-remove-by-height.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -666,7 +674,7 @@ gwy_data_field_grains_remove_touching_border
 <p>Removes all grains that touch field borders.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-remove-touching-border.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -684,7 +692,7 @@ gwy_data_field_grains_remove_touching_border
 <hr>
 <div class="refsect2">
 <a name="gwy-data-field-grains-watershed-init"></a><h3>gwy_data_field_grains_watershed_init ()</h3>
-<pre class="programlisting"><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState" title="GwyComputationState"><span class="returnvalue">GwyComputationState</span></a> *
+<pre class="programlisting"><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState"><span class="returnvalue">GwyComputationState</span></a> *
 gwy_data_field_grains_watershed_init (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>,
                                       <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *grain_field</code></em>,
                                       <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> locate_steps</code></em>,
@@ -698,7 +706,7 @@ gwy_data_field_grains_watershed_init (<em class="parameter"><code><a class="link
 <p>This iterator reports its state as <a class="link" href="libgwyprocess-gwyprocessenums.html#GwyWatershedStateType" title="enum GwyWatershedStateType"><span class="type">GwyWatershedStateType</span></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-watershed-init.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -763,7 +771,7 @@ gwy_data_field_grains_watershed_init (<em class="parameter"><code><a class="link
 <a name="gwy-data-field-grains-watershed-iteration"></a><h3>gwy_data_field_grains_watershed_iteration ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_field_grains_watershed_iteration
-                               (<em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState" title="GwyComputationState"><span class="type">GwyComputationState</span></a> *state</code></em>);</pre>
+                               (<em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState"><span class="type">GwyComputationState</span></a> *state</code></em>);</pre>
 <p>Performs one iteration of the watershed algorithm.</p>
 <p>Fields <em class="parameter"><code>state</code></em>
  and progress <em class="parameter"><code>fraction</code></em>
@@ -777,7 +785,7 @@ by finishing or being aborted, <a class="link" href="libgwyprocess-grains.html#g
 must be called to release allocated resources.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-watershed-iteration.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -796,11 +804,11 @@ must be called to release allocated resources.</p>
 <a name="gwy-data-field-grains-watershed-finalize"></a><h3>gwy_data_field_grains_watershed_finalize ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_field_grains_watershed_finalize
-                               (<em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState" title="GwyComputationState"><span class="type">GwyComputationState</span></a> *state</code></em>);</pre>
+                               (<em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState"><span class="type">GwyComputationState</span></a> *state</code></em>);</pre>
 <p>Destroys a watershed iterator, freeing all resources.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-watershed-finalize.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -825,7 +833,7 @@ gwy_data_field_grains_mark_height (<em class="parameter"><code><a class="link" h
 <p>Marks data that are above/below height threshold.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-mark-height.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -868,7 +876,7 @@ gwy_data_field_grains_mark_slope (<em class="parameter"><code><a class="link" hr
 <p>Marks data that are above/below slope threshold.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-mark-slope.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -910,7 +918,7 @@ gwy_data_field_otsu_threshold (<em class="parameter"><code><a class="link" href=
 inter-class variances of two classes of pixels: above and below theshold.</p>
 <div class="refsect3">
 <a name="gwy-data-field-otsu-threshold.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -949,7 +957,7 @@ gwy_data_field_grains_add (<em class="parameter"><code><a class="link" href="Gwy
 <p></p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-add.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -994,7 +1002,7 @@ result is stored in <em class="parameter"><code>grain_field</code></em>
 <p></p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-intersect.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1025,7 +1033,7 @@ gwy_data_field_grains_invert (<em class="parameter"><code><a class="link" href="
 transformed to 0.0.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-invert.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1063,7 +1071,7 @@ even original dimensions to 2 for <em class="parameter"><code>symmetrical</code>
  being <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-autocrop.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1129,7 +1137,7 @@ gwy_data_field_number_grains (<em class="parameter"><code><a class="link" href="
 <p>Numbers grains in a mask data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-number-grains.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1170,7 +1178,7 @@ gwy_data_field_number_grains_periodic (<em class="parameter"><code><a class="lin
 of periodicity, i.e. grains can touch across the opposite field edges.</p>
 <div class="refsect3">
 <a name="gwy-data-field-number-grains-periodic.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1213,7 +1221,7 @@ gwy_data_field_get_grain_bounding_boxes
 <p>Find bounding boxes of all grains.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-grain-bounding-boxes.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1278,7 +1286,7 @@ gwy_data_field_get_grain_sizes (<em class="parameter"><code><a class="link" href
 covered by the mask.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-grain-sizes.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1361,7 +1369,7 @@ the <em class="parameter"><code>distribution</code></em>
  is its offset).</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-get-distribution.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1453,7 +1461,7 @@ particular grain.  This enables one for instance to calculate grain sizes
 and grain heights and then correlate them.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-get-values.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1517,7 +1525,7 @@ is more efficient if several grain quantities need to be calculated since
 <a class="link" href="libgwyprocess-grains.html#gwy-data-field-grains-get-values" title="gwy_data_field_grains_get_values ()"><code class="function">gwy_data_field_grains_get_values()</code></a> can do lot of repeated work in such case.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-get-quantities.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1588,7 +1596,7 @@ gwy_grain_quantity_needs_same_units (<em class="parameter"><code><a class="link"
 units match.</p>
 <div class="refsect3">
 <a name="gwy-grain-quantity-needs-same-units.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1620,7 +1628,7 @@ gwy_grain_quantity_get_units (<em class="parameter"><code><a class="link" href="
 <p>Calculates the units of a grain quantity.</p>
 <div class="refsect3">
 <a name="gwy-grain-quantity-get-units.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1679,7 +1687,7 @@ gwy_data_field_area_grains_tgnd (<em class="parameter"><code><a class="link" hre
 calculates the distribution in the full range.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-grains-tgnd.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1754,7 +1762,7 @@ threshold levels.  For large <em class="parameter"><code>nstats</code></em>
 equivalent number of <a class="link" href="libgwyprocess-grains.html#gwy-data-field-grains-mark-height" title="gwy_data_field_grains_mark_height ()"><code class="function">gwy_data_field_grains_mark_height()</code></a> calls.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-grains-tgnd-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1839,7 +1847,7 @@ boundary, measured in pixels.</p>
 transforms such as city-block or chessboard.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grain-distance-transform.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1871,7 +1879,7 @@ only since 2.43.  Use <a class="link" href="libgwyprocess-grains.html#gwy-data-f
 if you need compatibility with older versions.</p>
 <div class="refsect3">
 <a name="gwy-data-field-grain-simple-dist-trans.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1916,7 +1924,7 @@ farther than <em class="parameter"><code>amount</code></em>
 .</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-shrink.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1970,7 +1978,7 @@ not farther than <em class="parameter"><code>amount</code></em>
 .</p>
 <div class="refsect3">
 <a name="gwy-data-field-grains-grow.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2010,6 +2018,32 @@ grains, without regard to grain connectivity.</p></td>
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-data-field-grains-thin"></a><h3>gwy_data_field_grains_thin ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_data_field_grains_thin (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>);</pre>
+<p>Performs thinning of a data field containing mask.</p>
+<p>The result of thinning is a ‘skeleton’ mask consisting of single-pixel thin
+lines.</p>
+<div class="refsect3">
+<a name="gwy-data-field-grains-thin.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>data_field</p></td>
+<td class="parameter_description"><p>A data field with zeroes in empty space and nonzeroes in
+grains.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-48.html#api-index-2.48">2.48</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-data-field-fill-voids"></a><h3>gwy_data_field_fill_voids ()</h3>
 <pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
 gwy_data_field_fill_voids (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>,
@@ -2022,7 +2056,7 @@ in 8-connectivity because grains themselves are considered in
 4-connectivity.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fill-voids.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2080,7 +2114,7 @@ relatively (although not drastically) expensive
 <a class="link" href="libgwyprocess-grains.html#gwy-data-field-number-grains" title="gwy_data_field_number_grains ()"><code class="function">gwy_data_field_number_grains()</code></a> call.</p>
 <div class="refsect3">
 <a name="gwy-data-field-waterpour.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2133,7 +2167,7 @@ the set.  A minimum is defined analogously.  A field filled with a single
 value is considered to have neither minimum nor maximum.</p>
 <div class="refsect3">
 <a name="gwy-data-field-mark-extrema.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-gwyprocess.html b/devel-docs/libgwyprocess/html/libgwyprocess-gwyprocess.html
index 267737c..d197f49 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-gwyprocess.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-gwyprocess.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwyprocess: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="GwyTriangulation.html" title="triangulation">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-gwyprocess.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-gwyprocessenums.html b/devel-docs/libgwyprocess/html/libgwyprocess-gwyprocessenums.html
index dafb1c3..733b8e0 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-gwyprocessenums.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-gwyprocessenums.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>gwyprocessenums: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-gwyprocess.html" title="gwyprocess">
@@ -15,7 +15,8 @@
 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
 <td width="100%" align="left" class="shortcuts">
 <a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
-                  <a href="#libgwyprocess-gwyprocessenums.description" class="shortcut">Description</a></span>
+                  <a href="#libgwyprocess-gwyprocessenums.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#libgwyprocess-gwyprocessenums.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
@@ -33,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-gwyprocessenums.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -116,12 +117,28 @@
 <a class="link" href="libgwyprocess-gwyprocessenums.html#gwy-distance-transform-type-get-enum" title="gwy_distance_transform_type_get_enum ()">gwy_distance_transform_type_get_enum</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="libgwyprocess-gwyprocessenums.html#gwy-computation-state-get-state" title="gwy_computation_state_get_state ()">gwy_computation_state_get_state</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="libgwyprocess-gwyprocessenums.html#gwy-computation-state-get-fraction" title="gwy_computation_state_get_fraction ()">gwy_computation_state_get_fraction</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
 </tbody>
 </table></div>
 </div>
-<div class="refsect1">
+<a name="GwyComputationState"></a><div class="refsect1">
 <a name="libgwyprocess-gwyprocessenums.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -224,13 +241,19 @@
 <td class="function_name"><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyRotateResizeType" title="enum GwyRotateResizeType">GwyRotateResizeType</a></td>
 </tr>
 <tr>
-<td class="datatype_keyword"> </td>
-<td class="function_name"><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState" title="GwyComputationState">GwyComputationState</a></td>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyAffineScalingType" title="enum GwyAffineScalingType">GwyAffineScalingType</a></td>
 </tr>
 </tbody>
 </table></div>
 </div>
 <div class="refsect1">
+<a name="libgwyprocess-gwyprocessenums.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gpointer">gpointer</a>
+    <span class="lineart">╰──</span> GwyComputationState
+</pre>
+</div>
+<div class="refsect1">
 <a name="libgwyprocess-gwyprocessenums.includes"></a><h2>Includes</h2>
 <pre class="synopsis">#include <libprocess/gwyprocess.h>
 </pre>
@@ -362,6 +385,63 @@ gwy_distance_transform_type_get_enum (<em class="parameter"><code><span class="t
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-43.html#api-index-2.43">2.43</a></p>
 </div>
+<hr>
+<div class="refsect2">
+<a name="gwy-computation-state-get-state"></a><h3>gwy_computation_state_get_state ()</h3>
+<pre class="programlisting"><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+gwy_computation_state_get_state (<em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState"><span class="type">GwyComputationState</span></a> *compstate</code></em>);</pre>
+<p>Gets the state field of a computation state struct.</p>
+<p>Useful mostly for language bindings.</p>
+<div class="refsect3">
+<a name="gwy-computation-state-get-state.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>compstate</p></td>
+<td class="parameter_description"><p>Computation state.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-computation-state-get-state.returns"></a><h4>Returns</h4>
+<p> The state field of <em class="parameter"><code>compstate</code></em>
+.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-computation-state-get-fraction"></a><h3>gwy_computation_state_get_fraction ()</h3>
+<pre class="programlisting"><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+gwy_computation_state_get_fraction (<em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationState"><span class="type">GwyComputationState</span></a> *compstate</code></em>);</pre>
+<p>Gets the fraction field of a computation state struct.</p>
+<div class="refsect3">
+<a name="gwy-computation-state-get-fraction.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>compstate</p></td>
+<td class="parameter_description"><p>Computation state.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-computation-state-get-fraction.returns"></a><h4>Returns</h4>
+<p> The fraction field of <em class="parameter"><code>compstate</code></em>
+.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
 </div>
 <div class="refsect1">
 <a name="libgwyprocess-gwyprocessenums.other_details"></a><h2>Types and Values</h2>
@@ -370,7 +450,7 @@ gwy_distance_transform_type_get_enum (<em class="parameter"><code><span class="t
 <p>Mask merge type (namely used in grain processing).</p>
 <div class="refsect3">
 <a name="GwyMergeType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -403,7 +483,7 @@ gwy_distance_transform_type_get_enum (<em class="parameter"><code><span class="t
 cannot apply masks in exclude mode.</p>
 <div class="refsect3">
 <a name="GwyMaskingType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -442,7 +522,7 @@ cannot apply masks in exclude mode.</p>
 <a name="GwyWatershedStateType"></a><h3>enum GwyWatershedStateType</h3>
 <div class="refsect3">
 <a name="GwyWatershedStateType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -489,7 +569,7 @@ cannot apply masks in exclude mode.</p>
 <p>Plane symmetry types for rotation correction.</p>
 <div class="refsect3">
 <a name="GwyPlaneSymmetry.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -559,7 +639,7 @@ cannot apply masks in exclude mode.</p>
 <a name="Gwy2DCWTWaveletType"></a><h3>enum Gwy2DCWTWaveletType</h3>
 <div class="refsect3">
 <a name="Gwy2DCWTWaveletType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -586,7 +666,7 @@ cannot apply masks in exclude mode.</p>
 <p>Orientation type.</p>
 <div class="refsect3">
 <a name="GwyOrientation.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -619,7 +699,7 @@ cannot apply masks in exclude mode.</p>
 uses -1, the forward transform +1.</p>
 <div class="refsect3">
 <a name="GwyTransformDirection.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -652,7 +732,7 @@ uses -1, the forward transform +1.</p>
 methods.</p>
 <div class="refsect3">
 <a name="GwyDataFieldCached.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -746,7 +826,7 @@ methods.</p>
 <p>Common iterative computation iterator state type.</p>
 <div class="refsect3">
 <a name="GwyComputationStateType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -789,7 +869,7 @@ methods.</p>
 <a name="GwyDWTType"></a><h3>enum GwyDWTType</h3>
 <div class="refsect3">
 <a name="GwyDWTType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -835,7 +915,7 @@ methods.</p>
 <a name="GwyDWTDenoiseType"></a><h3>enum GwyDWTDenoiseType</h3>
 <div class="refsect3">
 <a name="GwyDWTDenoiseType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -867,7 +947,7 @@ methods.</p>
 <p>Interpolation types.</p>
 <div class="refsect3">
 <a name="GwyInterpolationType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -955,7 +1035,7 @@ methods.</p>
 <a class="link" href="libgwyprocess-level.html#gwy-data-field-area-fit-local-planes" title="gwy_data_field_area_fit_local_planes ()"><code class="function">gwy_data_field_area_fit_local_planes()</code></a> and similar functions.</p>
 <div class="refsect3">
 <a name="GwyPlaneFitQuantity.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -1021,7 +1101,7 @@ methods.</p>
 <p>Frequency windowing type.</p>
 <div class="refsect3">
 <a name="GwyWindowingType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -1108,7 +1188,7 @@ methods.</p>
 <p>Type of tip shape presets.</p>
 <div class="refsect3">
 <a name="GwyTipType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -1184,7 +1264,7 @@ methods.</p>
 <a class="link" href="libgwyprocess-tip.html#gwy-tip-model-preset-create-for-zrange" title="gwy_tip_model_preset_create_for_zrange ()"><code class="function">gwy_tip_model_preset_create_for_zrange()</code></a>.</p>
 <div class="refsect3">
 <a name="GwyTipParamType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -1246,7 +1326,7 @@ methods.</p>
 <a name="GwyCorrelationType"></a><h3>enum GwyCorrelationType</h3>
 <div class="refsect3">
 <a name="GwyCorrelationType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -1279,7 +1359,7 @@ methods.</p>
 and similar functions.</p>
 <div class="refsect3">
 <a name="GwyGrainQuantity.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -1680,7 +1760,7 @@ and similar functions.</p>
 <p>Data line and field compatibility flags.</p>
 <div class="refsect3">
 <a name="GwyDataCompatibilityFlags.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -1740,7 +1820,7 @@ and similar functions.</p>
 <a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-get-line-stats" title="gwy_data_field_area_get_line_stats ()"><code class="function">gwy_data_field_area_get_line_stats()</code></a>.</p>
 <div class="refsect3">
 <a name="GwyLineStatQuantity.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -1854,6 +1934,20 @@ and similar functions.</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
+<tr>
+<td class="enum_member_name"><p><a name="GWY-LINE-STAT-MINPOS:CAPS"></a>GWY_LINE_STAT_MINPOS</p></td>
+<td class="enum_member_description">
+<p>Minimum position along the line (Since: 2.48).</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GWY-LINE-STAT-MAXPOS:CAPS"></a>GWY_LINE_STAT_MAXPOS</p></td>
+<td class="enum_member_description">
+<p>Maximum position along the line (Since: 2.48).</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -1869,7 +1963,7 @@ convolution uses mirror extension, rotation fills exterior with
 a fixed value.</p>
 <div class="refsect3">
 <a name="GwyExteriorType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -1933,7 +2027,7 @@ a fixed value.</p>
 <p>Type of distance transform.</p>
 <div class="refsect3">
 <a name="GwyDistanceTransformType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -2015,7 +2109,7 @@ a fixed value.</p>
 elements.</p>
 <div class="refsect3">
 <a name="GwyMinMaxFilterType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -2092,7 +2186,7 @@ elements.</p>
 <p>Type of rotated data field size determination method.</p>
 <div class="refsect3">
 <a name="GwyRotateResizeType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -2129,80 +2223,46 @@ elements.</p>
 </div>
 <hr>
 <div class="refsect2">
-<a name="GwyComputationState"></a><h3>GwyComputationState</h3>
-<pre class="programlisting">typedef struct {
-    guint state;
-    gdouble fraction;
-} GwyComputationState;
-</pre>
-<p>State of iterative computation.</p>
-<p>Iterators usually append their own private state data, therefore it must
-not be assumed the public fields <em class="parameter"><code>state</code></em>
- and <em class="parameter"><code>fraction</code></em>
- are the only fields.</p>
-<p>A typical iteration, assuming an iterative computation `foo' with the
-default <a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationStateType" title="enum GwyComputationStateType"><span class="type">GwyComputationStateType</span></a> state could be:</p>
-<div class="informalexample">
-  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
-    <tbody>
-      <tr>
-        <td class="listing_lines" align="right"><pre>1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11
-12
-13
-14</pre></td>
-        <td class="listing_code"><pre class="programlisting"><span class="usertype">GwyComputationStateType</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">state</span><span class="symbol">;</span>
-
-<span class="normal">state </span><span class="symbol">=</span><span class="normal"> </span><span class="function">gwy_data_field_foo_init</span><span class="symbol">(</span><span class="usertype">GwyDataField</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">data_field</span><span class="symbol">,</span><span class="normal"> </span><span class="symbol">...);</span>
-<span class="keyword">do</span><span class="normal"> </span><span class="cbracket">{</span>
-<span class="normal">    </span><span class="function">gwy_data_field_foo_iteration</span><span class="symbol">(</span><span class="normal">state</span><span class="symbol">);</span>
-<span class="normal">    </span><span class="comment">/* Update progress using state->fraction,</span>
-<span class="comment">        let Gtk+ main loop run, check for abort, ... */</span>
-<span class="normal">    </span><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">aborted</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span>
-<span class="normal">        </span><span class="function">gwy_data_field_foo_finalize</span><span class="symbol">(</span><span class="normal">state</span><span class="symbol">);</span>
-<span class="normal">        </span><span class="keyword">return</span><span class="normal"> <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros.html#FALSE:CAPS">FALSE</a></span><span class="symbol">;</span>
-<span class="normal">    </span><span class="cbracket">}</span>
-<span class="cbracket">}</span><span class="normal"> </span><span class="keyword">while</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">state</span><span class="symbol">-></span><span class="normal">state </span><span class="symbol">!=</span><span class="normal"> <a href="#GWY-COMPUTATION-STATE-FINISHED:CAPS">GWY_COMPUTATION_STATE_FINISHED</a></span><span class="symbol">);</span>
-<span class="function">gwy_data_field_foo_finalize</span><span class="symbol">(</span><span class="normal">state</span><span class="symbol">);</span>
-<span class="keyword">return</span><span class="normal"> <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Standard-Macros.html#TRUE:CAPS">TRUE</a></span><span class="symbol">;</span></pre></td>
-      </tr>
-    </tbody>
-  </table>
-</div>
-
+<a name="GwyAffineScalingType"></a><h3>enum GwyAffineScalingType</h3>
+<p>Type of lattice vector scaling in affine transform preparation.</p>
 <div class="refsect3">
-<a name="GwyComputationState.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<a name="GwyAffineScalingType.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="300px" class="struct_members_name">
-<col class="struct_members_description">
-<col width="200px" class="struct_members_annotations">
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
 </colgroup>
 <tbody>
 <tr>
-<td class="struct_member_name"><p><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GwyComputationState.state"></a>state</code></em>;</p></td>
-<td class="struct_member_description"><p>Current computation state, usually of <a class="link" href="libgwyprocess-gwyprocessenums.html#GwyComputationStateType" title="enum GwyComputationStateType"><span class="type">GwyComputationStateType</span></a>, but
-particular iterators can define their own types.</p></td>
-<td class="struct_member_annotations"> </td>
+<td class="enum_member_name"><p><a name="GWY-AFFINE-SCALING-AS-GIVEN:CAPS"></a>GWY_AFFINE_SCALING_AS_GIVEN</p></td>
+<td class="enum_member_description">
+<p>Correct lattice vectors lengths are taken
+                              as given.</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
-<td class="struct_member_name"><p><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> <em class="structfield"><code><a name="GwyComputationState.fraction"></a>fraction</code></em>;</p></td>
-<td class="struct_member_description"><p>Fraction of computation completed.  For staged algorithms,
-the fraction refers to the current stage only.</p></td>
-<td class="struct_member_annotations"> </td>
+<td class="enum_member_name"><p><a name="GWY-AFFINE-SCALING-PRESERVE-AREA:CAPS"></a>GWY_AFFINE_SCALING_PRESERVE_AREA</p></td>
+<td class="enum_member_description">
+<p>Correct lattice vectors are scaled to
+                                   make the transformation area-preserving.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GWY-AFFINE-SCALING-PRESERVE-X:CAPS"></a>GWY_AFFINE_SCALING_PRESERVE_X</p></td>
+<td class="enum_member_description">
+<p>Correct lattice vectors are scaled to
+                                preserve the scale along <em class="parameter"><code>x</code></em>
+-axis.</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
 </div>
 </div>
 </div>
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-hough.html b/devel-docs/libgwyprocess/html/libgwyprocess-hough.html
index c444717..c9cf753 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-hough.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-hough.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hough: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="GwyGrainValue.html" title="GwyGrainValue">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-hough.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -166,7 +166,7 @@ gwy_data_field_get_local_maxima_list (<em class="parameter"><code><a class="link
  maxima are located.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-local-maxima-list.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-interpolation.html b/devel-docs/libgwyprocess/html/libgwyprocess-interpolation.html
index 9959f6b..d519eef 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-interpolation.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-interpolation.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>interpolation: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-inttrans.html" title="inttrans">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-interpolation.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -160,7 +160,7 @@ methods to get interpolated value between
 two arbitrary data points.</p>
 <div class="refsect3">
 <a name="gwy-interpolation-get-dval.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -233,7 +233,7 @@ interpolating function with the same support size.  See
 interpolation coefficients.</p>
 <div class="refsect3">
 <a name="gwy-interpolation-get-dval-of-equidists.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -276,7 +276,7 @@ gwy_interpolation_interpolate_1d (<em class="parameter"><code><a href="/usr/shar
 <a class="link" href="libgwyprocess-interpolation.html#gwy-interpolation-get-support-size" title="gwy_interpolation_get_support_size ()"><code class="function">gwy_interpolation_get_support_size()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-interpolation-interpolate-1d.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -320,7 +320,7 @@ gwy_interpolation_interpolate_2d (<em class="parameter"><code><a href="/usr/shar
 <p>Interpolates a signle data point in two dimensions.</p>
 <div class="refsect3">
 <a name="gwy-interpolation-interpolate-2d.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -378,7 +378,7 @@ preprocess the data values to obtain interpolation coefficients first.  On
 the ohter hand they typically offer much higher interpolation quality.</p>
 <div class="refsect3">
 <a name="gwy-interpolation-has-interpolating-basis.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -407,7 +407,7 @@ gwy_interpolation_get_support_size (<em class="parameter"><code><a class="link"
 <p>Obtains the basis support size for an interpolation type.</p>
 <div class="refsect3">
 <a name="gwy-interpolation-get-support-size.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -440,7 +440,7 @@ interpolating function.  Therefore you can also omit it and use the data
 array directly for these interpolation types.</p>
 <div class="refsect3">
 <a name="gwy-interpolation-resolve-coeffs-1d.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -485,7 +485,7 @@ interpolating function.  Therefore you can also omit it and use the data
 array directly for these interpolation types.</p>
 <div class="refsect3">
 <a name="gwy-interpolation-resolve-coeffs-2d.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -541,7 +541,7 @@ gwy_interpolation_resample_block_1d (<em class="parameter"><code><a href="/usr/s
 <a class="link" href="GwyDataLine.html#gwy-data-line-new-resampled" title="gwy_data_line_new_resampled ()"><code class="function">gwy_data_line_new_resampled()</code></a> provide more convenient interface.</p>
 <div class="refsect3">
 <a name="gwy-interpolation-resample-block-1d.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -604,7 +604,7 @@ gwy_interpolation_resample_block_2d (<em class="parameter"><code><a href="/usr/s
 <a class="link" href="GwyDataField.html#gwy-data-field-new-resampled" title="gwy_data_field_new_resampled ()"><code class="function">gwy_data_field_new_resampled()</code></a> provide more convenient interface.</p>
 <div class="refsect3">
 <a name="gwy-interpolation-resample-block-2d.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -688,7 +688,7 @@ gwy_interpolation_shift_block_1d (<em class="parameter"><code><a href="/usr/shar
 <p>Shifts a one-dimensional data block by a possibly non-integer offset.</p>
 <div class="refsect3">
 <a name="gwy-interpolation-shift-block-1d.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-inttrans.html b/devel-docs/libgwyprocess/html/libgwyprocess-inttrans.html
index 4e9f5b0..f8cf750 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-inttrans.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-inttrans.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>inttrans: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-hough.html" title="hough">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-inttrans.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -179,10 +179,8 @@ and other statistical characteristics.</p>
 perform no other operations on the data beside the transform itself.
 This makes them suitable for applications where both forward and inverse
 transform is performed.</p>
-<p>Both types of functions wrap a Fourier transform backend which can be
-currently either <a class="link" href="libgwyprocess-simpleFFT.html#gwy-fft-simple" title="gwy_fft_simple ()"><code class="function">gwy_fft_simple()</code></a>, available always, or</p>
-<a class="ulink" href="http://fftw.org/" target="_top">FFTW3</a>, available when Gwyddion was
-<p>compiled with it.</p>
+<p>Both types of functions wrap</p>
+<a class="ulink" href="http://fftw.org/" target="_top">FFTW3</a><p>routines.</p>
 </div>
 <div class="refsect1">
 <a name="libgwyprocess-inttrans.functions_details"></a><h2>Functions</h2>
@@ -204,7 +202,7 @@ data for other reasons and thus have the freedom to choose a convenient
 transform size.</p>
 <div class="refsect3">
 <a name="gwy-fft-find-nice-size.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -239,7 +237,7 @@ gwy_data_line_fft (<em class="parameter"><code><a class="link" href="GwyDataLine
 <p>A windowing or data leveling can be applied if requested.</p>
 <div class="refsect3">
 <a name="gwy-data-line-fft.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -319,7 +317,7 @@ gwy_data_line_part_fft (<em class="parameter"><code><a class="link" href="GwyDat
 <p>A windowing or data leveling can be applied if requested.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-fft.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -406,7 +404,7 @@ gwy_data_line_fft_raw (<em class="parameter"><code><a class="link" href="GwyData
 by <a class="link" href="libgwyprocess-inttrans.html#gwy-fft-find-nice-size" title="gwy_fft_find_nice_size ()"><code class="function">gwy_fft_find_nice_size()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-line-fft-raw.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -465,7 +463,7 @@ gwy_data_field_1dfft (<em class="parameter"><code><a class="link" href="GwyDataF
 obtain reasonable results.</p>
 <div class="refsect3">
 <a name="gwy-data-field-1dfft.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -557,7 +555,7 @@ Fast Fourier Transform.</p>
 obtain reasonable results.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-1dfft.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -663,7 +661,7 @@ gwy_data_field_1dfft_raw (<em class="parameter"><code><a class="link" href="GwyD
 by <a class="link" href="libgwyprocess-inttrans.html#gwy-fft-find-nice-size" title="gwy_fft_find_nice_size ()"><code class="function">gwy_fft_find_nice_size()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-1dfft-raw.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -730,7 +728,7 @@ obtain reasonable results.</p>
 <a class="link" href="libgwyprocess-inttrans.html#gwy-data-field-fft-postprocess" title="gwy_data_field_fft_postprocess ()"><code class="function">gwy_data_field_fft_postprocess()</code></a> for that.</p>
 <div class="refsect3">
 <a name="gwy-data-field-2dfft.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -812,7 +810,7 @@ gwy_data_field_area_2dfft (<em class="parameter"><code><a class="link" href="Gwy
 obtain reasonable results.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-2dfft.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -910,7 +908,7 @@ by <a class="link" href="libgwyprocess-inttrans.html#gwy-fft-find-nice-size" tit
 <a class="link" href="libgwyprocess-inttrans.html#gwy-data-field-fft-postprocess" title="gwy_data_field_fft_postprocess ()"><code class="function">gwy_data_field_fft_postprocess()</code></a> for that.</p>
 <div class="refsect3">
 <a name="gwy-data-field-2dfft-raw.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -970,7 +968,7 @@ is odd, <a class="link" href="libgwyprocess-inttrans.html#gwy-data-field-2dfft-h
 paired properly.</p>
 <div class="refsect3">
 <a name="gwy-data-field-2dfft-humanize.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -995,7 +993,7 @@ to reshuffle a humanized 2D FFT output back into the natural positions.</p>
 <p>See <a class="link" href="libgwyprocess-inttrans.html#gwy-data-field-2dfft-humanize" title="gwy_data_field_2dfft_humanize ()"><code class="function">gwy_data_field_2dfft_humanize()</code></a> for discussion.</p>
 <div class="refsect3">
 <a name="gwy-data-field-2dfft-dehumanize.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1027,7 +1025,7 @@ offsets are cleared.</p>
 <p>Value units are kept intact.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fft-postprocess.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1062,7 +1060,7 @@ gwy_data_field_fft_filter_1d (<em class="parameter"><code><a class="link" href="
 <p>Performs 1D FFT filtering of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fft-filter-1d.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1114,7 +1112,7 @@ gwy_data_field_cwt (<em class="parameter"><code><a class="link" href="GwyDataFie
 scale and using given wavelet.</p>
 <div class="refsect3">
 <a name="gwy-data-field-cwt.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-level.html b/devel-docs/libgwyprocess/html/libgwyprocess-level.html
index 8d63175..9077040 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-level.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-level.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>level: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-interpolation.html" title="interpolation">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-level.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -278,7 +278,7 @@ as in <a class="link" href="libgwyprocess-level.html#gwy-data-field-fit-plane" t
 corner.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-fit-plane.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -355,7 +355,7 @@ gwy_data_field_fit_plane (<em class="parameter"><code><a class="link" href="GwyD
 data[i] := data[i] - (pa + pby*i + pbx*j);</p>
 <div class="refsect3">
 <a name="gwy-data-field-fit-plane.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -411,7 +411,7 @@ gwy_data_field_get_ymeasure(data_field) to obtain physical plane
 coefficients.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fit-facet-plane.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -470,7 +470,7 @@ gwy_data_field_plane_level (<em class="parameter"><code><a class="link" href="Gw
 <p>See <a class="link" href="libgwyprocess-level.html#gwy-data-field-fit-plane" title="gwy_data_field_fit_plane ()"><code class="function">gwy_data_field_fit_plane()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-data-field-plane-level.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -512,7 +512,7 @@ gwy_data_field_plane_rotate (<em class="parameter"><code><a class="link" href="G
 <p>Performs rotation of plane along x and y axis.</p>
 <div class="refsect3">
 <a name="gwy-data-field-plane-rotate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -567,7 +567,7 @@ from data inside (or outside for <em class="parameter"><code>exclude</code></em>
  = <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>) the area.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fit-lines.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -635,7 +635,7 @@ gwy_data_field_fit_polynom (<em class="parameter"><code><a class="link" href="Gw
 <p>Fits a two-dimensional polynomial to a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fit-polynom.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -698,7 +698,7 @@ this method works only up to <em class="parameter"><code>col_degree</code></em>
  = 6.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-fit-polynom.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -769,7 +769,7 @@ gwy_data_field_subtract_polynom (<em class="parameter"><code><a class="link" hre
 <p>Subtracts a two-dimensional polynomial from a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-subtract-polynom.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -819,7 +819,7 @@ gwy_data_field_area_subtract_polynom (<em class="parameter"><code><a class="link
 field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-subtract-polynom.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -885,7 +885,7 @@ gwy_data_field_fit_legendre (<em class="parameter"><code><a class="link" href="G
 <p>See <a class="link" href="libgwyprocess-level.html#gwy-data-field-area-fit-legendre" title="gwy_data_field_area_fit_legendre ()"><code class="function">gwy_data_field_area_fit_legendre()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fit-legendre.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -955,7 +955,7 @@ first row (column) corresponds to -1.0, and the last row (column) to 1.0.</p>
 orthogonal on a discrete point set (if their degrees are equal mod 2).</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-fit-legendre.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1026,7 +1026,7 @@ gwy_data_field_subtract_legendre (<em class="parameter"><code><a class="link" hr
 <p>Subtracts a two-dimensional Legendre polynomial fit from a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-subtract-legendre.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1079,7 +1079,7 @@ used on an area of dimensions different than the area the coefficients were
 calculated for.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-subtract-legendre.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1144,7 +1144,7 @@ gwy_data_field_fit_poly_max (<em class="parameter"><code><a class="link" href="G
 <p>See <a class="link" href="libgwyprocess-level.html#gwy-data-field-area-fit-poly-max" title="gwy_data_field_area_fit_poly_max ()"><code class="function">gwy_data_field_area_fit_poly_max()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fit-poly-max.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1199,7 +1199,7 @@ differs by limiting the total maximum degree, while
 and vertical directions independently.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-fit-poly-max.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1266,7 +1266,7 @@ gwy_data_field_subtract_poly_max (<em class="parameter"><code><a class="link" hr
 a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-subtract-poly-max.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1314,7 +1314,7 @@ used on an area of dimensions different than the area the coefficients were
 calculated for.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-subtract-poly-max.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1377,7 +1377,7 @@ gwy_data_field_fit_poly (<em class="parameter"><code><a class="link" href="GwyDa
 <p>Fit a given set of polynomial terms to a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fit-poly.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1461,7 +1461,7 @@ are always from the interval [-1,1] where -1 corresponds to the left/topmost
 pixel and 1 corresponds to the bottom/rightmost pixel of the area.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-fit-poly.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1556,7 +1556,7 @@ gwy_data_field_subtract_poly (<em class="parameter"><code><a class="link" href="
 <p>Subtract a given set of polynomial terms from a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-subtract-poly.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1609,7 +1609,7 @@ gwy_data_field_area_subtract_poly (<em class="parameter"><code><a class="link" h
 field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-subtract-poly.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1688,7 +1688,7 @@ that is <em class="parameter"><code>GWY_PLANE_FIT_A</code></em>
  is normal mean value.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-fit-local-planes.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1774,7 +1774,7 @@ gwy_data_field_area_local_plane_quantity
 <a class="link" href="libgwyprocess-level.html#gwy-data-field-area-fit-local-planes" title="gwy_data_field_area_fit_local_planes ()"><code class="function">gwy_data_field_area_fit_local_planes()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-local-plane-quantity.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1843,7 +1843,7 @@ gwy_data_field_fit_local_planes (<em class="parameter"><code><a class="link" hre
 <p>See <a class="link" href="libgwyprocess-level.html#gwy-data-field-area-fit-local-planes" title="gwy_data_field_area_fit_local_planes ()"><code class="function">gwy_data_field_area_fit_local_planes()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-data-field-fit-local-planes.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1895,7 +1895,7 @@ gwy_data_field_local_plane_quantity (<em class="parameter"><code><a class="link"
 <a class="link" href="libgwyprocess-level.html#gwy-data-field-fit-local-planes" title="gwy_data_field_fit_local_planes ()"><code class="function">gwy_data_field_fit_local_planes()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-local-plane-quantity.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-linestats.html b/devel-docs/libgwyprocess/html/libgwyprocess-linestats.html
index 3e25cff..5a43f70 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-linestats.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-linestats.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>linestats: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-level.html" title="level">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-linestats.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -68,6 +68,38 @@
 <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
 </td>
 <td class="function_name">
+<a class="link" href="libgwyprocess-linestats.html#gwy-data-line-min-pos-i" title="gwy_data_line_min_pos_i ()">gwy_data_line_min_pos_i</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="libgwyprocess-linestats.html#gwy-data-line-max-pos-i" title="gwy_data_line_max_pos_i ()">gwy_data_line_max_pos_i</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="libgwyprocess-linestats.html#gwy-data-line-min-pos-r" title="gwy_data_line_min_pos_r ()">gwy_data_line_min_pos_r</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="libgwyprocess-linestats.html#gwy-data-line-max-pos-r" title="gwy_data_line_max_pos_r ()">gwy_data_line_max_pos_r</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+</td>
+<td class="function_name">
 <a class="link" href="libgwyprocess-linestats.html#gwy-data-line-get-avg" title="gwy_data_line_get_avg ()">gwy_data_line_get_avg</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
@@ -153,7 +185,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
 </td>
 <td class="function_name">
 <a class="link" href="libgwyprocess-linestats.html#gwy-data-line-part-get-avg" title="gwy_data_line_part_get_avg ()">gwy_data_line_part_get_avg</a> <span class="c_punctuation">()</span>
@@ -161,7 +193,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
 </td>
 <td class="function_name">
 <a class="link" href="libgwyprocess-linestats.html#gwy-data-line-part-get-rms" title="gwy_data_line_part_get_rms ()">gwy_data_line_part_get_rms</a> <span class="c_punctuation">()</span>
@@ -169,7 +201,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
 </td>
 <td class="function_name">
 <a class="link" href="libgwyprocess-linestats.html#gwy-data-line-part-get-tan-beta0" title="gwy_data_line_part_get_tan_beta0 ()">gwy_data_line_part_get_tan_beta0</a> <span class="c_punctuation">()</span>
@@ -177,7 +209,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+<a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
 </td>
 <td class="function_name">
 <a class="link" href="libgwyprocess-linestats.html#gwy-data-line-part-get-variation" title="gwy_data_line_part_get_variation ()">gwy_data_line_part_get_variation</a> <span class="c_punctuation">()</span>
@@ -363,7 +395,7 @@ gwy_data_line_get_max (<em class="parameter"><code><a class="link" href="GwyData
 <p>Finds the maximum value of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-max.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -389,7 +421,7 @@ gwy_data_line_get_min (<em class="parameter"><code><a class="link" href="GwyData
 <p>Finds the minimum value of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-min.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -418,7 +450,7 @@ gwy_data_line_get_min_max (<em class="parameter"><code><a class="link" href="Gwy
 <p>Since 2.42</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-min-max.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -446,13 +478,121 @@ gwy_data_line_get_min_max (<em class="parameter"><code><a class="link" href="Gwy
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-data-line-min-pos-i"></a><h3>gwy_data_line_min_pos_i ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+gwy_data_line_min_pos_i (<em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *data_line</code></em>);</pre>
+<p>Finds the minimum pixel position of a data line.</p>
+<div class="refsect3">
+<a name="gwy-data-line-min-pos-i.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>data_line</p></td>
+<td class="parameter_description"><p>A data line.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-data-line-min-pos-i.returns"></a><h4>Returns</h4>
+<p> The minimum pixel position.</p>
+<p>Since 2.48</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-data-line-max-pos-i"></a><h3>gwy_data_line_max_pos_i ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+gwy_data_line_max_pos_i (<em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *data_line</code></em>);</pre>
+<p>Finds the maximum pixel position of a data line.</p>
+<div class="refsect3">
+<a name="gwy-data-line-max-pos-i.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>data_line</p></td>
+<td class="parameter_description"><p>A data line.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-data-line-max-pos-i.returns"></a><h4>Returns</h4>
+<p> The maximum pixel position.</p>
+<p>Since 2.48</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-data-line-min-pos-r"></a><h3>gwy_data_line_min_pos_r ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+gwy_data_line_min_pos_r (<em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *data_line</code></em>);</pre>
+<p>Finds the real minimum position in a data line.</p>
+<div class="refsect3">
+<a name="gwy-data-line-min-pos-r.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>data_line</p></td>
+<td class="parameter_description"><p>A data line.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-data-line-min-pos-r.returns"></a><h4>Returns</h4>
+<p> Real position for the minimum.</p>
+<p>Since 2.48</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-data-line-max-pos-r"></a><h3>gwy_data_line_max_pos_r ()</h3>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+gwy_data_line_max_pos_r (<em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *data_line</code></em>);</pre>
+<p>Finds the real maximum position in a data line.</p>
+<div class="refsect3">
+<a name="gwy-data-line-max-pos-r.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>data_line</p></td>
+<td class="parameter_description"><p>A data line.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-data-line-max-pos-r.returns"></a><h4>Returns</h4>
+<p> Real position for the maximum.</p>
+<p>Since 2.48</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-data-line-get-avg"></a><h3>gwy_data_line_get_avg ()</h3>
 <pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
 gwy_data_line_get_avg (<em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *data_line</code></em>);</pre>
 <p>Computes average value of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-avg.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -478,7 +618,7 @@ gwy_data_line_get_rms (<em class="parameter"><code><a class="link" href="GwyData
 <p>Computes root mean square value of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-rms.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -504,7 +644,7 @@ gwy_data_line_get_tan_beta0 (<em class="parameter"><code><a class="link" href="G
 <p>Computes root mean square slope in a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-tan-beta0.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -532,7 +672,7 @@ gwy_data_line_get_variation (<em class="parameter"><code><a class="link" href="G
 <p>See <a class="link" href="libgwyprocess-linestats.html#gwy-data-line-part-get-variation" title="gwy_data_line_part_get_variation ()"><code class="function">gwy_data_line_part_get_variation()</code></a> for definition and discussion.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-variation.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -559,7 +699,7 @@ gwy_data_line_get_sum (<em class="parameter"><code><a class="link" href="GwyData
 <p>Computes sum of all values in a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-sum.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -585,7 +725,7 @@ gwy_data_line_get_ra (<em class="parameter"><code><a class="link" href="GwyDataL
 <p>Computes the mean absolute deviation of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-ra.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -612,7 +752,7 @@ gwy_data_line_get_skew (<em class="parameter"><code><a class="link" href="GwyDat
 <p>Computes the skew of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-skew.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -639,7 +779,7 @@ gwy_data_line_get_kurtosis (<em class="parameter"><code><a class="link" href="Gw
 <p>Computes the kurtosis of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-kurtosis.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -668,7 +808,7 @@ gwy_data_line_part_get_max (<em class="parameter"><code><a class="link" href="Gw
 <p>Finds the maximum value of a part of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-get-max.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -708,7 +848,7 @@ gwy_data_line_part_get_min (<em class="parameter"><code><a class="link" href="Gw
 <p>Finds the minimum value of a part of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-get-min.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -751,7 +891,7 @@ gwy_data_line_part_get_min_max (<em class="parameter"><code><a class="link" href
 <p>Since 2.42</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-get-min-max.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -797,7 +937,7 @@ gwy_data_line_part_get_avg (<em class="parameter"><code><a class="link" href="Gw
 <p>Computes mean value of all values in a part of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-get-avg.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -837,7 +977,7 @@ gwy_data_line_part_get_rms (<em class="parameter"><code><a class="link" href="Gw
 <p>Computes root mean square value of a part of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-get-rms.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -880,7 +1020,7 @@ to the second derivative of both HHCF and ACF at zero.</p>
 <p>This roughness quantity is also known as Dq.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-get-tan-beta0.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -926,7 +1066,7 @@ as the value units of the line.  See also
 <a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-get-variation" title="gwy_data_field_area_get_variation ()"><code class="function">gwy_data_field_area_get_variation()</code></a> for some more discussion.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-get-variation.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -967,7 +1107,7 @@ gwy_data_line_part_get_sum (<em class="parameter"><code><a class="link" href="Gw
 <p>Computes sum of all values in a part of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-get-sum.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1007,7 +1147,7 @@ gwy_data_line_part_get_ra (<em class="parameter"><code><a class="link" href="Gwy
 <p>Computes mean absolute deviation value of a part of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-get-ra.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1047,7 +1187,7 @@ gwy_data_line_part_get_skew (<em class="parameter"><code><a class="link" href="G
 <p>Computes skew value of a part of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-get-skew.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1089,7 +1229,7 @@ gwy_data_line_part_get_kurtosis (<em class="parameter"><code><a class="link" hre
 is zero for the Gaussian distribution (not 3).</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-get-kurtosis.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1129,7 +1269,7 @@ gwy_data_line_get_modus (<em class="parameter"><code><a class="link" href="GwyDa
 <p>See <a class="link" href="libgwyprocess-linestats.html#gwy-data-line-part-get-modus" title="gwy_data_line_part_get_modus ()"><code class="function">gwy_data_line_part_get_modus()</code></a> for details and caveats.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-modus.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1168,7 +1308,7 @@ gwy_data_line_part_get_modus (<em class="parameter"><code><a class="link" href="
 return modus of the data itself, but modus of a histogram.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-get-modus.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1214,7 +1354,7 @@ gwy_data_line_get_median (<em class="parameter"><code><a class="link" href="GwyD
 <p>Finds median of a data line.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-median.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1243,7 +1383,7 @@ gwy_data_line_part_get_median (<em class="parameter"><code><a class="link" href=
 <p>Finds median of a data line part.</p>
 <div class="refsect3">
 <a name="gwy-data-line-part-get-median.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1286,7 +1426,7 @@ gwy_data_line_get_length (<em class="parameter"><code><a class="link" href="GwyD
 values.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-length.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1323,7 +1463,7 @@ or Maximum Profile Peak Height <em class="parameter"><code>Rp</code></em>
 .</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-xpm.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1375,7 +1515,7 @@ or Maximum Profile Peak Depth <em class="parameter"><code>Rv</code></em>
 .</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-xvm.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1420,7 +1560,7 @@ gwy_data_line_get_xtm (<em class="parameter"><code><a class="link" href="GwyData
 by <a class="link" href="libgwyprocess-linestats.html#gwy-data-line-get-xpm" title="gwy_data_line_get_xpm ()"><code class="function">gwy_data_line_get_xpm()</code></a> and <a class="link" href="libgwyprocess-linestats.html#gwy-data-line-get-xvm" title="gwy_data_line_get_xvm ()"><code class="function">gwy_data_line_get_xvm()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-line-get-xtm.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1496,7 +1636,7 @@ except when <em class="parameter"><code>v</code></em>
 =0, in which case the range is set to [-1,1].</p>
 <div class="refsect3">
 <a name="gwy-data-line-distribution.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1564,7 +1704,7 @@ gwy_data_line_dh (<em class="parameter"><code><a class="link" href="GwyDataLine.
 real data minimum and maximum value.</p>
 <div class="refsect3">
 <a name="gwy-data-line-dh.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1618,7 +1758,7 @@ gwy_data_line_cdh (<em class="parameter"><code><a class="link" href="GwyDataLine
 real data minimum and maximum value.</p>
 <div class="refsect3">
 <a name="gwy-data-line-cdh.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1672,7 +1812,7 @@ gwy_data_line_da (<em class="parameter"><code><a class="link" href="GwyDataLine.
 real data minimum and maximum angle value.</p>
 <div class="refsect3">
 <a name="gwy-data-line-da.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1724,7 +1864,7 @@ gwy_data_line_cda (<em class="parameter"><code><a class="link" href="GwyDataLine
 real data minimum and maximum angle value.</p>
 <div class="refsect3">
 <a name="gwy-data-line-cda.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1773,7 +1913,7 @@ gwy_data_line_acf (<em class="parameter"><code><a class="link" href="GwyDataLine
 </p>
 <div class="refsect3">
 <a name="gwy-data-line-acf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1807,7 +1947,7 @@ gwy_data_line_hhcf (<em class="parameter"><code><a class="link" href="GwyDataLin
 .</p>
 <div class="refsect3">
 <a name="gwy-data-line-hhcf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1843,7 +1983,7 @@ gwy_data_line_psdf (<em class="parameter"><code><a class="link" href="GwyDataLin
 units properly.</p>
 <div class="refsect3">
 <a name="gwy-data-line-psdf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-peaks.html b/devel-docs/libgwyprocess/html/libgwyprocess-peaks.html
index 6148f7c..0518a50 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-peaks.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-peaks.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>peaks: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-simpleFFT.html" title="simpleFFT">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-peaks.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -124,7 +124,7 @@
 </div>
 <div class="refsect1">
 <a name="libgwyprocess-peaks.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -175,7 +175,7 @@ gwy_peaks_copy (<em class="parameter"><code><span class="type">GwyPeaks</span> *
 <p>This is mostly useful for language bindings.</p>
 <div class="refsect3">
 <a name="gwy-peaks-copy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -202,7 +202,7 @@ gwy_peaks_free (<em class="parameter"><code><span class="type">GwyPeaks</span> *
 <p>Frees a peak analyser and all associated data.</p>
 <div class="refsect3">
 <a name="gwy-peaks-free.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -229,7 +229,7 @@ background type will only be used in future analyses; it does not change the
 results of the already performed analysis.</p>
 <div class="refsect3">
 <a name="gwy-peaks-set-background.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -263,7 +263,7 @@ only be effective in future analyses; it does not change the results of the
 already performed analysis.</p>
 <div class="refsect3">
 <a name="gwy-peaks-set-order.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -301,7 +301,7 @@ gwy_peaks_analyze (<em class="parameter"><code><span class="type">GwyPeaks</span
 subsequently requested using <a class="link" href="libgwyprocess-peaks.html#gwy-peaks-get-quantity" title="gwy_peaks_get_quantity ()"><code class="function">gwy_peaks_get_quantity()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-peaks-analyze.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -358,7 +358,7 @@ gwy_peaks_analyze_xy (<em class="parameter"><code><span class="type">GwyPeaks</s
 subsequently requested using <a class="link" href="libgwyprocess-peaks.html#gwy-peaks-get-quantity" title="gwy_peaks_get_quantity ()"><code class="function">gwy_peaks_get_quantity()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-peaks-analyze-xy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -408,7 +408,7 @@ gwy_peaks_analyze_dataline (<em class="parameter"><code><span class="type">GwyPe
 subsequently requested using <a class="link" href="libgwyprocess-peaks.html#gwy-peaks-get-quantity" title="gwy_peaks_get_quantity ()"><code class="function">gwy_peaks_get_quantity()</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-peaks-analyze-dataline.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -447,7 +447,7 @@ gwy_peaks_n_peaks (<em class="parameter"><code><span class="type">GwyPeaks</span
 <p>Gets the current number of peaks of a peak analyser.</p>
 <div class="refsect3">
 <a name="gwy-peaks-n-peaks.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -476,7 +476,7 @@ gwy_peaks_get_quantity (<em class="parameter"><code><span class="type">GwyPeaks<
 <p>Obtaines values of a given quantity for all found peaks.</p>
 <div class="refsect3">
 <a name="gwy-peaks-get-quantity.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -512,7 +512,7 @@ number is returned by <a class="link" href="libgwyprocess-peaks.html#gwy-peaks-n
 <p>Type of background available in graph peak analysers.</p>
 <div class="refsect3">
 <a name="GwyPeakBackgroundType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -545,7 +545,7 @@ number is returned by <a class="link" href="libgwyprocess-peaks.html#gwy-peaks-n
 <p>Type of peak ordering by in the graph peak analyser results.</p>
 <div class="refsect3">
 <a name="GwyPeakOrderType.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -579,7 +579,7 @@ number is returned by <a class="link" href="libgwyprocess-peaks.html#gwy-peaks-n
 <p>Type of pcharacteristics graph peak analysers can provide.</p>
 <div class="refsect3">
 <a name="GwyPeakQuantity.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-simpleFFT.html b/devel-docs/libgwyprocess/html/libgwyprocess-simpleFFT.html
index 959e6c9..5f50b3f 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-simpleFFT.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-simpleFFT.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>simpleFFT: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-linestats.html" title="linestats">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-simpleFFT.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -73,13 +73,14 @@
 </div>
 <div class="refsect1">
 <a name="libgwyprocess-simpleFFT.description"></a><h2>Description</h2>
-<p>The simple one-dimensional FFT algorithm <a class="link" href="libgwyprocess-simpleFFT.html#gwy-fft-simple" title="gwy_fft_simple ()"><code class="function">gwy_fft_simple()</code></a> is used as
-a fallback by other functions when a better implementation (FFTW3) is not
-available.</p>
-<p>You should not use it directly, as it is a waste of resources
-if FFTW3 backed is in use, neither you should feel any need to, as
-high-level functions such as <a class="link" href="libgwyprocess-inttrans.html#gwy-data-field-2dfft" title="gwy_data_field_2dfft ()"><code class="function">gwy_data_field_2dfft()</code></a> are available.</p>
-<p>Up to version 2.7 simpleFFT works only with certain tranform sizes, mostly
+<p>The simple one-dimensional FFT algorithm <a class="link" href="libgwyprocess-simpleFFT.html#gwy-fft-simple" title="gwy_fft_simple ()"><code class="function">gwy_fft_simple()</code></a> used to be
+employed as a fallback by other functions when a better implementation
+(FFTW3) was not available.  Since version 2.49 it just calls the
+corresponding FFTW routine.</p>
+<p>Generally, you should either use high-level Gwyddion functions such as
+<a class="link" href="libgwyprocess-inttrans.html#gwy-data-field-2dfft-raw" title="gwy_data_field_2dfft_raw ()"><code class="function">gwy_data_field_2dfft_raw()</code></a> or, if they are insufficient, FFTW routines
+directly.</p>
+<p>Up to version 2.7 simpleFFT required certain tranform sizes, mostly
 powers of 2.  Since 2.8 it can handle arbitrary tranform sizes, although
 sizes with large prime factors can be quite slow (still O(n*log(n)) though).</p>
 </div>
@@ -97,8 +98,9 @@ gwy_fft_simple (<em class="parameter"><code><a class="link" href="libgwyprocess-
                 <em class="parameter"><code><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *out_re</code></em>,
                 <em class="parameter"><code><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *out_im</code></em>);</pre>
 <p>Performs a DFT algorithm.</p>
-<p>This is a low-level function used by other FFT functions when no better
-backend is available.</p>
+<p>This is a low-level function that used to be employed by other FFT functions
+when no better backend was available.  Since version 2.49 it just calls the
+corresponding FFTW routine.</p>
 <p>Strides are distances between samples in input and output arrays.  Use 1
 for normal `dense' arrays.  To use <a class="link" href="libgwyprocess-simpleFFT.html#gwy-fft-simple" title="gwy_fft_simple ()"><code class="function">gwy_fft_simple()</code></a> with interleaved arrays,
 that is with alternating real and imaginary data, call it with
@@ -115,7 +117,7 @@ transform directions.  By performing forward and then backward transform,
 you will obtain the original array (up to rounding errors).</p>
 <div class="refsect3">
 <a name="gwy-fft-simple.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -180,7 +182,7 @@ gwy_fft_window (<em class="parameter"><code><a href="http://developer.gnome.org/
 <p>Multiplies data by given window.</p>
 <div class="refsect3">
 <a name="gwy-fft-window.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -216,7 +218,7 @@ gwy_fft_window_data_field (<em class="parameter"><code><a class="link" href="Gwy
 <p>Performs windowing of a data field in given direction.</p>
 <div class="refsect3">
 <a name="gwy-fft-window-data-field.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-stats-uncertainty.html b/devel-docs/libgwyprocess/html/libgwyprocess-stats-uncertainty.html
index 7e6cf35..d934397 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-stats-uncertainty.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-stats-uncertainty.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>stats uncertainty: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-stats.html" title="stats">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-stats-uncertainty.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -380,7 +380,7 @@ gwy_data_field_get_max_uncertainty (<em class="parameter"><code><a class="link"
 <p>Finds the uncertainty of the maximum value of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-max-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -423,7 +423,7 @@ gwy_data_field_area_get_max_uncertainty
 field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-max-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -489,7 +489,7 @@ gwy_data_field_get_min_uncertainty (<em class="parameter"><code><a class="link"
 <p>Finds the uncertainty of the minimum value of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-min-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -532,7 +532,7 @@ gwy_data_field_area_get_min_uncertainty
 field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-min-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -601,7 +601,7 @@ gwy_data_field_get_min_max_uncertainty
 <p>Finds minimum and maximum values of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-min-max-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -654,7 +654,7 @@ of a data field.</p>
 <a class="link" href="libgwyprocess-gwyprocessenums.html#GWY-MASK-INCLUDE:CAPS"><code class="literal">GWY_MASK_INCLUDE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-min-max-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -730,7 +730,7 @@ gwy_data_field_area_get_min_max_uncertainty_mask
 part of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-min-max-uncertainty-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -802,7 +802,7 @@ gwy_data_field_get_avg_uncertainty (<em class="parameter"><code><a class="link"
 <p>Computes the uncertainty of the average value of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-avg-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -848,7 +848,7 @@ data field.</p>
 <a class="link" href="libgwyprocess-gwyprocessenums.html#GWY-MASK-INCLUDE:CAPS"><code class="literal">GWY_MASK_INCLUDE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-avg-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -916,7 +916,7 @@ gwy_data_field_area_get_avg_uncertainty_mask
 data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-avg-uncertainty-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -982,7 +982,7 @@ gwy_data_field_get_rms_uncertainty (<em class="parameter"><code><a class="link"
 <p>Computes uncertainty of  root mean square value of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-rms-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1023,7 +1023,7 @@ gwy_data_field_area_get_rms_uncertainty
 data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-rms-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1095,7 +1095,7 @@ gwy_data_field_area_get_rms_uncertainty_mask
 rectangular part of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-rms-uncertainty-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1169,7 +1169,7 @@ gwy_data_field_get_stats_uncertainties
 field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-stats-uncertainties.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1244,7 +1244,7 @@ gwy_data_field_area_get_stats_uncertainties
 with masking mode <a class="link" href="libgwyprocess-gwyprocessenums.html#GWY-MASK-INCLUDE:CAPS"><code class="literal">GWY_MASK_INCLUDE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-stats-uncertainties.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1343,7 +1343,7 @@ gwy_data_field_area_get_stats_uncertainties_mask
 rectangular part of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-stats-uncertainties-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1444,7 +1444,7 @@ gwy_data_field_area_acf_uncertainty (<em class="parameter"><code><a class="link"
 a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-acf-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1526,7 +1526,7 @@ gwy_data_field_acf_uncertainty (<em class="parameter"><code><a class="link" href
 field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-acf-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1589,7 +1589,7 @@ gwy_data_field_area_hhcf_uncertainty (<em class="parameter"><code><a class="link
 rectangular part of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-hhcf-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1669,7 +1669,7 @@ gwy_data_field_hhcf_uncertainty (<em class="parameter"><code><a class="link" hre
 field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-hhcf-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1727,7 +1727,7 @@ gwy_data_field_get_surface_area_uncertainty
 <p>Computes uncertainty of surface area of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-surface-area-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1784,7 +1784,7 @@ gwy_data_field_area_get_surface_area_uncertainty
 with masking mode <a class="link" href="libgwyprocess-gwyprocessenums.html#GWY-MASK-INCLUDE:CAPS"><code class="literal">GWY_MASK_INCLUDE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-surface-area-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1866,7 +1866,7 @@ gwy_data_field_area_get_surface_area_mask_uncertainty
  are the same physical quantities.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-surface-area-mask-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1952,7 +1952,7 @@ gwy_data_field_area_get_median_uncertainty
 with masking mode <a class="link" href="libgwyprocess-gwyprocessenums.html#GWY-MASK-INCLUDE:CAPS"><code class="literal">GWY_MASK_INCLUDE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-median-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2019,7 +2019,7 @@ gwy_data_field_area_get_median_uncertainty_mask
 <p>Computes uncertainty of  median value of a data field area.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-median-uncertainty-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2085,7 +2085,7 @@ gwy_data_field_get_median_uncertainty (<em class="parameter"><code><a class="lin
 <p>Computes uncertainty of median value of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-median-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2128,7 +2128,7 @@ gwy_data_field_area_dh_uncertainty (<em class="parameter"><code><a class="link"
 data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-dh-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2198,7 +2198,7 @@ gwy_data_field_dh_uncertainty (<em class="parameter"><code><a class="link" href=
 <p>Calculates uncertainty of distribution of heights in a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-dh-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2255,7 +2255,7 @@ gwy_data_field_area_get_normal_coeffs_uncertainty
 field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-normal-coeffs-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2358,7 +2358,7 @@ gwy_data_field_get_normal_coeffs_uncertainty
 <p>Computes squared uncertainty of average normal vector of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-normal-coeffs-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2438,7 +2438,7 @@ gwy_data_field_area_get_inclination_uncertainty
 <p>Calculates the uncertainty of the inclination of the image (polar and azimuth angle).</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-inclination-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2514,7 +2514,7 @@ gwy_data_field_get_inclination_uncertainty
 <p>Calculates the uncertainty of the inclination of the image (polar and azimuth angle).</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-inclination-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2582,7 +2582,7 @@ gwy_data_field_area_cdh_uncertainty (<em class="parameter"><code><a class="link"
 rectangular part of the data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-cdh-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2653,7 +2653,7 @@ gwy_data_field_cdh_uncertainty (<em class="parameter"><code><a class="link" href
 field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-cdh-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2721,7 +2721,7 @@ gwy_data_line_acf_uncertainty (<em class="parameter"><code><a class="link" href=
 </p>
 <div class="refsect3">
 <a name="gwy-data-line-acf-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2759,7 +2759,7 @@ gwy_data_line_cumulate_uncertainty (<em class="parameter"><code><a class="link"
 uncertainty of the original distribution.</p>
 <div class="refsect3">
 <a name="gwy-data-line-cumulate-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2786,7 +2786,7 @@ stores results in <em class="parameter"><code>target_line</code></em>
 .</p>
 <div class="refsect3">
 <a name="gwy-data-line-hhcf-uncertainty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-stats.html b/devel-docs/libgwyprocess/html/libgwyprocess-stats.html
index 0a7472e..d0a8218 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-stats.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-stats.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>stats: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-GwySpline.html" title="GwySpline">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-stats.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -372,6 +372,14 @@
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
+<a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-da-mask" title="gwy_data_field_area_da_mask ()">gwy_data_field_area_da_mask</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
 <a class="link" href="libgwyprocess-stats.html#gwy-data-field-da" title="gwy_data_field_da ()">gwy_data_field_da</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
@@ -388,6 +396,14 @@
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
+<a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-cda-mask" title="gwy_data_field_area_cda_mask ()">gwy_data_field_area_cda_mask</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
 <a class="link" href="libgwyprocess-stats.html#gwy-data-field-cda" title="gwy_data_field_cda ()">gwy_data_field_cda</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
@@ -409,6 +425,14 @@
 </tr>
 <tr>
 <td class="function_type">
+<a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="returnvalue">GwyDataLine</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-row-acf" title="gwy_data_field_area_row_acf ()">gwy_data_field_area_row_acf</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
@@ -425,6 +449,14 @@
 </tr>
 <tr>
 <td class="function_type">
+<a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="returnvalue">GwyDataLine</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-row-hhcf" title="gwy_data_field_area_row_hhcf ()">gwy_data_field_area_row_hhcf</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
@@ -441,6 +473,14 @@
 </tr>
 <tr>
 <td class="function_type">
+<a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="returnvalue">GwyDataLine</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-row-psdf" title="gwy_data_field_area_row_psdf ()">gwy_data_field_area_row_psdf</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
@@ -457,6 +497,14 @@
 </tr>
 <tr>
 <td class="function_type">
+<a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="returnvalue">GwyDataLine</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-row-asg" title="gwy_data_field_area_row_asg ()">gwy_data_field_area_row_asg</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
@@ -656,7 +704,7 @@ gwy_data_field_get_max (<em class="parameter"><code><a class="link" href="GwyDat
 <p>This quantity is cached.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-max.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -683,7 +731,7 @@ gwy_data_field_get_min (<em class="parameter"><code><a class="link" href="GwyDat
 <p>This quantity is cached.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-min.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -711,7 +759,7 @@ gwy_data_field_get_min_max (<em class="parameter"><code><a class="link" href="Gw
 <p>Finds minimum and maximum values of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-min-max.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -746,7 +794,7 @@ gwy_data_field_get_avg (<em class="parameter"><code><a class="link" href="GwyDat
 <p>This quantity is cached.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-avg.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -773,7 +821,7 @@ gwy_data_field_get_rms (<em class="parameter"><code><a class="link" href="GwyDat
 <p>This quantity is cached.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-rms.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -800,7 +848,7 @@ gwy_data_field_get_sum (<em class="parameter"><code><a class="link" href="GwyDat
 <p>This quantity is cached.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-sum.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -827,7 +875,7 @@ gwy_data_field_get_median (<em class="parameter"><code><a class="link" href="Gwy
 <p>This quantity is cached.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-median.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -854,7 +902,7 @@ gwy_data_field_get_surface_area (<em class="parameter"><code><a class="link" hre
 <p>This quantity is cached.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-surface-area.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -882,7 +930,7 @@ gwy_data_field_get_variation (<em class="parameter"><code><a class="link" href="
 <p>This quantity is cached.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-variation.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -911,7 +959,7 @@ gwy_data_field_get_entropy (<em class="parameter"><code><a class="link" href="Gw
 <p>This quantity is cached.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-entropy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -946,7 +994,7 @@ represent the coordinates (<em class="parameter"><code>x</code></em>
 the same dimensions.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-entropy-2d.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -987,7 +1035,7 @@ gwy_data_field_area_get_max (<em class="parameter"><code><a class="link" href="G
 <p>Finds the maximum value in a rectangular part of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-max.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1046,7 +1094,7 @@ gwy_data_field_area_get_min (<em class="parameter"><code><a class="link" href="G
 <p>Finds the minimum value in a rectangular part of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-min.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1112,7 +1160,7 @@ gwy_data_field_area_get_min_max (<em class="parameter"><code><a class="link" hre
 with masking mode <a class="link" href="libgwyprocess-gwyprocessenums.html#GWY-MASK-INCLUDE:CAPS"><code class="literal">GWY_MASK_INCLUDE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-min-max.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1179,7 +1227,7 @@ gwy_data_field_area_get_min_max_mask (<em class="parameter"><code><a class="link
 <p>Finds minimum and maximum values in a rectangular part of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-min-max-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1254,7 +1302,7 @@ gwy_data_field_area_get_avg (<em class="parameter"><code><a class="link" href="G
 with masking mode <a class="link" href="libgwyprocess-gwyprocessenums.html#GWY-MASK-INCLUDE:CAPS"><code class="literal">GWY_MASK_INCLUDE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-avg.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1313,7 +1361,7 @@ gwy_data_field_area_get_avg_mask (<em class="parameter"><code><a class="link" hr
 <p>Computes average value of a rectangular part of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-avg-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1379,7 +1427,7 @@ gwy_data_field_area_get_rms (<em class="parameter"><code><a class="link" href="G
 <p>Computes root mean square value of a rectangular part of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-rms.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1441,7 +1489,7 @@ gwy_data_field_area_get_rms_mask (<em class="parameter"><code><a class="link" hr
 data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-rms-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1511,7 +1559,7 @@ cotinguous part of the mask or inverted mask) separately and the deviations
 are calculated from these mean values.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-grainwise-rms.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1580,7 +1628,7 @@ gwy_data_field_area_get_sum (<em class="parameter"><code><a class="link" href="G
 with masking mode <a class="link" href="libgwyprocess-gwyprocessenums.html#GWY-MASK-INCLUDE:CAPS"><code class="literal">GWY_MASK_INCLUDE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-sum.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1639,7 +1687,7 @@ gwy_data_field_area_get_sum_mask (<em class="parameter"><code><a class="link" hr
 <p>Sums values of a rectangular part of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-sum-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1709,7 +1757,7 @@ gwy_data_field_area_get_median (<em class="parameter"><code><a class="link" href
 with masking mode <a class="link" href="libgwyprocess-gwyprocessenums.html#GWY-MASK-INCLUDE:CAPS"><code class="literal">GWY_MASK_INCLUDE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-median.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1768,7 +1816,7 @@ gwy_data_field_area_get_median_mask (<em class="parameter"><code><a class="link"
 <p>Computes median value of a data field area.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-median-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1838,7 +1886,7 @@ gwy_data_field_area_get_surface_area (<em class="parameter"><code><a class="link
 <a class="link" href="libgwyprocess-gwyprocessenums.html#GWY-MASK-INCLUDE:CAPS"><code class="literal">GWY_MASK_INCLUDE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-surface-area.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1901,7 +1949,7 @@ gwy_data_field_area_get_surface_area_mask
  are the same physical quantities.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-surface-area-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1970,7 +2018,7 @@ gwy_data_field_area_get_entropy_at_scales
 <p>Calculates estimates of value distribution entropy at various scales.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-entropy-at-scales.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2048,7 +2096,7 @@ gwy_data_field_get_entropy_2d_at_scales
 scales.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-entropy-2d-at-scales.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2113,7 +2161,7 @@ non-fractal surfaces it scales with the linear dimension of the image, not
 with its area, despite being an area integral.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-variation.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2196,7 +2244,7 @@ returned.</p>
 <p>It should be noted that this estimate may be biased.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-entropy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2263,7 +2311,7 @@ gwy_data_field_area_get_volume (<em class="parameter"><code><a class="link" href
 <p>Computes volume of a rectangular part of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-volume.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2336,7 +2384,7 @@ subject to changes.</p>
 <p>This quantity is cached.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-autorange.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2375,7 +2423,7 @@ gwy_data_field_get_stats (<em class="parameter"><code><a class="link" href="GwyD
 <p>Computes basic statistical quantities of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-stats.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2441,7 +2489,7 @@ gwy_data_field_area_get_stats (<em class="parameter"><code><a class="link" href=
 with masking mode <a class="link" href="libgwyprocess-gwyprocessenums.html#GWY-MASK-INCLUDE:CAPS"><code class="literal">GWY_MASK_INCLUDE</code></a>.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-stats.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2529,7 +2577,7 @@ gwy_data_field_area_get_stats_mask (<em class="parameter"><code><a class="link"
 <p>Computes basic statistical quantities of a rectangular part of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-stats-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2655,7 +2703,7 @@ realized:</p>
 
 <div class="refsect3">
 <a name="gwy-data-field-area-count-in-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2669,7 +2717,7 @@ realized:</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>mask</p></td>
-<td class="parameter_description"><p>Mask specifying which values to take into account/exclude, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p></td>
+<td class="parameter_description"><p>Mask specifying which values to take into account, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -2741,7 +2789,7 @@ gwy_data_field_area_dh (<em class="parameter"><code><a class="link" href="GwyDat
 <p>Calculates distribution of heights in a rectangular part of data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-dh.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2755,7 +2803,7 @@ gwy_data_field_area_dh (<em class="parameter"><code><a class="link" href="GwyDat
 </tr>
 <tr>
 <td class="parameter_name"><p>mask</p></td>
-<td class="parameter_description"><p>Mask specifying which values to take into account/exclude, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p></td>
+<td class="parameter_description"><p>Mask specifying which values to take into account, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -2804,7 +2852,7 @@ gwy_data_field_dh (<em class="parameter"><code><a class="link" href="GwyDataFiel
 <p>Calculates distribution of heights in a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-dh.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2848,7 +2896,7 @@ gwy_data_field_area_cdh (<em class="parameter"><code><a class="link" href="GwyDa
 field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-cdh.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2862,7 +2910,7 @@ field.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>mask</p></td>
-<td class="parameter_description"><p>Mask specifying which values to take into account/exclude, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p></td>
+<td class="parameter_description"><p>Mask specifying which values to take into account, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -2911,7 +2959,7 @@ gwy_data_field_cdh (<em class="parameter"><code><a class="link" href="GwyDataFie
 <p>Calculates cumulative distribution of heights in a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-cdh.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2954,7 +3002,7 @@ gwy_data_field_area_da (<em class="parameter"><code><a class="link" href="GwyDat
 <p>Calculates distribution of slopes in a rectangular part of data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-da.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3009,6 +3057,82 @@ nonpositive, a suitable resolution is determined automatically.</p></td>
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-data-field-area-da-mask"></a><h3>gwy_data_field_area_da_mask ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_data_field_area_da_mask (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>,
+                             <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *mask</code></em>,
+                             <em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *target_line</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> col</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> row</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> width</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> height</code></em>,
+                             <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyOrientation" title="enum GwyOrientation"><span class="type">GwyOrientation</span></a> orientation</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> nstats</code></em>);</pre>
+<p>Calculates distribution of slopes in a rectangular part of data field, with
+masking.</p>
+<div class="refsect3">
+<a name="gwy-data-field-area-da-mask.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>data_field</p></td>
+<td class="parameter_description"><p>A data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>mask</p></td>
+<td class="parameter_description"><p>Mask specifying which values to take into account, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>target_line</p></td>
+<td class="parameter_description"><p>A data line to store the distribution to.  It will be
+resampled to requested width.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>col</p></td>
+<td class="parameter_description"><p>Upper-left column coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>row</p></td>
+<td class="parameter_description"><p>Upper-left row coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>width</p></td>
+<td class="parameter_description"><p>Area width (number of columns).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>height</p></td>
+<td class="parameter_description"><p>Area height (number of rows).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>orientation</p></td>
+<td class="parameter_description"><p>Orientation to compute the slope distribution in.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>nstats</p></td>
+<td class="parameter_description"><p>The number of samples to take on the distribution function.  If
+nonpositive, a suitable resolution is determined automatically.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-data-field-da"></a><h3>gwy_data_field_da ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_field_da (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>,
@@ -3018,7 +3142,7 @@ gwy_data_field_da (<em class="parameter"><code><a class="link" href="GwyDataFiel
 <p>Calculates distribution of slopes in a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-da.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3067,7 +3191,77 @@ gwy_data_field_area_cda (<em class="parameter"><code><a class="link" href="GwyDa
 field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-cda.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>data_field</p></td>
+<td class="parameter_description"><p>A data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>target_line</p></td>
+<td class="parameter_description"><p>A data line to store the distribution to.  It will be
+resampled to requested width.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>col</p></td>
+<td class="parameter_description"><p>Upper-left column coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>row</p></td>
+<td class="parameter_description"><p>Upper-left row coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>width</p></td>
+<td class="parameter_description"><p>Area width (number of columns).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>height</p></td>
+<td class="parameter_description"><p>Area height (number of rows).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>orientation</p></td>
+<td class="parameter_description"><p>Orientation to compute the slope distribution in.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>nstats</p></td>
+<td class="parameter_description"><p>The number of samples to take on the distribution function.  If
+nonpositive, a suitable resolution is determined automatically.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gwy-data-field-area-cda-mask"></a><h3>gwy_data_field_area_cda_mask ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gwy_data_field_area_cda_mask (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>,
+                              <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *mask</code></em>,
+                              <em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *target_line</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> col</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> row</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> width</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> height</code></em>,
+                              <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyOrientation" title="enum GwyOrientation"><span class="type">GwyOrientation</span></a> orientation</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> nstats</code></em>);</pre>
+<p>Calculates cumulative distribution of slopes in a rectangular part of data
+field, with masking.</p>
+<div class="refsect3">
+<a name="gwy-data-field-area-cda-mask.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3119,6 +3313,7 @@ nonpositive, a suitable resolution is determined automatically.</p></td>
 </tbody>
 </table></div>
 </div>
+<p class="since">Since: <a class="link" href="api-index-2-49.html#api-index-2.49">2.49</a></p>
 </div>
 <hr>
 <div class="refsect2">
@@ -3131,7 +3326,7 @@ gwy_data_field_cda (<em class="parameter"><code><a class="link" href="GwyDataFie
 <p>Calculates cumulative distribution of slopes in a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-cda.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3181,7 +3376,7 @@ gwy_data_field_area_acf (<em class="parameter"><code><a class="link" href="GwyDa
 a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-acf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3256,7 +3451,7 @@ gwy_data_field_acf (<em class="parameter"><code><a class="link" href="GwyDataFie
 <p>Calculates one-dimensional autocorrelation function of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-acf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3299,6 +3494,98 @@ nonpositive, data field width (height) is used.</p></td>
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-data-field-area-row-acf"></a><h3>gwy_data_field_area_row_acf ()</h3>
+<pre class="programlisting"><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="returnvalue">GwyDataLine</span></a> *
+gwy_data_field_area_row_acf (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *field</code></em>,
+                             <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *mask</code></em>,
+                             <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyMaskingType" title="enum GwyMaskingType"><span class="type">GwyMaskingType</span></a> masking</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> col</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> row</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> width</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> height</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> level</code></em>,
+                             <em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *weights</code></em>);</pre>
+<p>Calculates the row-wise autocorrelation function (ACF) of a field.</p>
+<p>The calculated ACF has the natural number of points, i.e. <em class="parameter"><code>width</code></em>
+.</p>
+<p>Masking is performed by omitting all terms that contain excluded pixels.
+Since different rows contain different numbers of pixels, the resulting
+ACF values are calculated as a weighted sums where weight of each row's
+contribution is proportional to the number of contributing terms.  In other
+words, the weighting is fair: each contributing pixel has the same influence
+on the result.</p>
+<div class="refsect3">
+<a name="gwy-data-field-area-row-acf.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>field</p></td>
+<td class="parameter_description"><p>A two-dimensional data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>col</p></td>
+<td class="parameter_description"><p>Upper-left column coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>row</p></td>
+<td class="parameter_description"><p>Upper-left row coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>width</p></td>
+<td class="parameter_description"><p>Area width (number of columns).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>height</p></td>
+<td class="parameter_description"><p>Area height (number of rows).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>mask</p></td>
+<td class="parameter_description"><p>Mask specifying which values to take into account/exclude, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>masking</p></td>
+<td class="parameter_description"><p>Masking mode to use (has any effect only with non-<a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> <em class="parameter"><code>mask</code></em>
+).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>level</p></td>
+<td class="parameter_description"><p>The first polynomial degree to keep in the rows, lower degrees than
+<em class="parameter"><code>level</code></em>
+are subtracted.  Note only values 0 (no levelling) and 1
+(subtract the mean value of each row) are available at present.  For
+SPM data, you usually wish to pass 1.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>weights</p></td>
+<td class="parameter_description"><p>Line to store the denominators to (or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>).  It will be resized
+to match the returned line.  The denominators are integers equal
+to the number of terms that contributed to each value.  They are
+suitable as fitting weight if the ACF is fitted.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-data-field-area-row-acf.returns"></a><h4>Returns</h4>
+<p> A new one-dimensional data line with the ACF.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-data-field-area-hhcf"></a><h3>gwy_data_field_area_hhcf ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_field_area_hhcf (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>,
@@ -3314,7 +3601,7 @@ gwy_data_field_area_hhcf (<em class="parameter"><code><a class="link" href="GwyD
 a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-hhcf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3389,7 +3676,7 @@ gwy_data_field_hhcf (<em class="parameter"><code><a class="link" href="GwyDataFi
 <p>Calculates one-dimensional autocorrelation function of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-hhcf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3432,6 +3719,99 @@ nonpositive, data field width (height) is used.</p></td>
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-data-field-area-row-hhcf"></a><h3>gwy_data_field_area_row_hhcf ()</h3>
+<pre class="programlisting"><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="returnvalue">GwyDataLine</span></a> *
+gwy_data_field_area_row_hhcf (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *field</code></em>,
+                              <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *mask</code></em>,
+                              <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyMaskingType" title="enum GwyMaskingType"><span class="type">GwyMaskingType</span></a> masking</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> col</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> row</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> width</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> height</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> level</code></em>,
+                              <em class="parameter"><code><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="type">GwyDataLine</span></a> *weights</code></em>);</pre>
+<p>Calculates the row-wise height-height correlation function (HHCF) of a
+rectangular part of a field.</p>
+<p>The calculated HHCF has the natural number of points, i.e. <em class="parameter"><code>width</code></em>
+.</p>
+<p>Masking is performed by omitting all terms that contain excluded pixels.
+Since different rows contain different numbers of pixels, the resulting
+HHCF values are calculated as a weighted sums where weight of each row's
+contribution is proportional to the number of contributing terms.  In other
+words, the weighting is fair: each contributing pixel has the same influence
+on the result.</p>
+<div class="refsect3">
+<a name="gwy-data-field-area-row-hhcf.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>field</p></td>
+<td class="parameter_description"><p>A two-dimensional data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>col</p></td>
+<td class="parameter_description"><p>Upper-left column coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>row</p></td>
+<td class="parameter_description"><p>Upper-left row coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>width</p></td>
+<td class="parameter_description"><p>Area width (number of columns).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>height</p></td>
+<td class="parameter_description"><p>Area height (number of rows).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>mask</p></td>
+<td class="parameter_description"><p>Mask specifying which values to take into account/exclude, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>masking</p></td>
+<td class="parameter_description"><p>Masking mode to use (has any effect only with non-<a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> <em class="parameter"><code>mask</code></em>
+).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>level</p></td>
+<td class="parameter_description"><p>The first polynomial degree to keep in the rows, lower degrees than
+<em class="parameter"><code>level</code></em>
+are subtracted.  Note only values 0 (no levelling) and 1
+(subtract the mean value of each row) are available at present.
+There is no difference for HHCF.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>weights</p></td>
+<td class="parameter_description"><p>Line to store the denominators to (or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>).  It will be resized
+to match the returned line.  The denominators are integers equal
+to the number of terms that contributed to each value.  They are
+suitable as fitting weight if the ACF is fitted.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-data-field-area-row-hhcf.returns"></a><h4>Returns</h4>
+<p> A new one-dimensional data line with the HHCF.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-data-field-area-psdf"></a><h3>gwy_data_field_area_psdf ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_field_area_psdf (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>,
@@ -3448,7 +3828,7 @@ gwy_data_field_area_psdf (<em class="parameter"><code><a class="link" href="GwyD
 part of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-psdf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3527,7 +3907,7 @@ gwy_data_field_psdf (<em class="parameter"><code><a class="link" href="GwyDataFi
 <p>Calculates one-dimensional power spectrum density function of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-psdf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3575,6 +3955,98 @@ nonpositive, data field width (height) is used.</p></td>
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-data-field-area-row-psdf"></a><h3>gwy_data_field_area_row_psdf ()</h3>
+<pre class="programlisting"><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="returnvalue">GwyDataLine</span></a> *
+gwy_data_field_area_row_psdf (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *field</code></em>,
+                              <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *mask</code></em>,
+                              <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyMaskingType" title="enum GwyMaskingType"><span class="type">GwyMaskingType</span></a> masking</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> col</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> row</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> width</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> height</code></em>,
+                              <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyWindowingType" title="enum GwyWindowingType"><span class="type">GwyWindowingType</span></a> windowing</code></em>,
+                              <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> level</code></em>);</pre>
+<p>Calculates the row-wise power spectrum density function (PSDF) of a
+rectangular part of a field.</p>
+<p>The calculated PSDF has the natural number of points that follows from DFT,
+i.e. <em class="parameter"><code>width</code></em>
+/2+1.</p>
+<p>The reduction of the total energy by windowing is compensated by multiplying
+the PSDF to make its sum of squares equal to the input data sum of squares.</p>
+<p>Masking is performed by omitting all terms that contain excluded pixels.
+Since different rows contain different numbers of pixels, the resulting
+PSDF is calculated as a weighted sum where each row's weight is proportional
+to the number of contributing pixels.  In other words, the weighting is
+fair: each contributing pixel has the same influence on the result.</p>
+<div class="refsect3">
+<a name="gwy-data-field-area-row-psdf.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>field</p></td>
+<td class="parameter_description"><p>A two-dimensional data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>col</p></td>
+<td class="parameter_description"><p>Upper-left column coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>row</p></td>
+<td class="parameter_description"><p>Upper-left row coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>width</p></td>
+<td class="parameter_description"><p>Area width (number of columns).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>height</p></td>
+<td class="parameter_description"><p>Area height (number of rows).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>mask</p></td>
+<td class="parameter_description"><p>Mask specifying which values to take into account/exclude, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>masking</p></td>
+<td class="parameter_description"><p>Masking mode to use (has any effect only with non-<a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> <em class="parameter"><code>mask</code></em>
+).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>windowing</p></td>
+<td class="parameter_description"><p>Windowing type to use.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>level</p></td>
+<td class="parameter_description"><p>The first polynomial degree to keep in the rows, lower degrees than
+<em class="parameter"><code>level</code></em>
+are subtracted.  Note only values 0 (no levelling) and 1
+(subtract the mean value of each row) are available at present.  For
+SPM data, you usually wish to pass 1.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-data-field-area-row-psdf.returns"></a><h4>Returns</h4>
+<p> A new one-dimensional data line with the PSDF.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-data-field-area-rpsdf"></a><h3>gwy_data_field_area_rpsdf ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_field_area_rpsdf (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>,
@@ -3590,7 +4062,7 @@ gwy_data_field_area_rpsdf (<em class="parameter"><code><a class="link" href="Gwy
 part of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-rpsdf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3663,7 +4135,7 @@ gwy_data_field_rpsdf (<em class="parameter"><code><a class="link" href="GwyDataF
 <p>Calculates radial power spectrum density function of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-rpsdf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3706,6 +4178,89 @@ nonpositive, data field width (height) is used.</p></td>
 </div>
 <hr>
 <div class="refsect2">
+<a name="gwy-data-field-area-row-asg"></a><h3>gwy_data_field_area_row_asg ()</h3>
+<pre class="programlisting"><a class="link" href="GwyDataLine.html" title="GwyDataLine"><span class="returnvalue">GwyDataLine</span></a> *
+gwy_data_field_area_row_asg (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *field</code></em>,
+                             <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *mask</code></em>,
+                             <em class="parameter"><code><a class="link" href="libgwyprocess-gwyprocessenums.html#GwyMaskingType" title="enum GwyMaskingType"><span class="type">GwyMaskingType</span></a> masking</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> col</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> row</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> width</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> height</code></em>,
+                             <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint"><span class="type">guint</span></a> level</code></em>);</pre>
+<p>Calculates the row-wise area scale graph (ASG) of a rectangular part of a
+field.</p>
+<p>The calculated ASG has the natural number of points, i.e. <em class="parameter"><code>width</code></em>
+-1.</p>
+<p>The ASG represents the apparent area excess (ratio of surface and projected
+area minus one) observed at given length scale.  The quantity calculated by
+this function serves a similar purpose as ASME B46.1 area scale graph but
+is defined differently, based on the HHCF.  See
+<a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-row-hhcf" title="gwy_data_field_area_row_hhcf ()"><code class="function">gwy_data_field_area_row_hhcf()</code></a> for details of its calculation.</p>
+<div class="refsect3">
+<a name="gwy-data-field-area-row-asg.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>field</p></td>
+<td class="parameter_description"><p>A two-dimensional data field.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>col</p></td>
+<td class="parameter_description"><p>Upper-left column coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>row</p></td>
+<td class="parameter_description"><p>Upper-left row coordinate.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>width</p></td>
+<td class="parameter_description"><p>Area width (number of columns).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>height</p></td>
+<td class="parameter_description"><p>Area height (number of rows).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>mask</p></td>
+<td class="parameter_description"><p>Mask specifying which values to take into account/exclude, or <a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>masking</p></td>
+<td class="parameter_description"><p>Masking mode to use (has any effect only with non-<a href="/usr/share/gtk-doc/html/glibglib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> <em class="parameter"><code>mask</code></em>
+).</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>level</p></td>
+<td class="parameter_description"><p>The first polynomial degree to keep in the rows, lower degrees than
+<em class="parameter"><code>level</code></em>
+are subtracted.  Note only values 0 (no levelling) and 1
+(subtract the mean value of each row) are available at present.
+There is no difference for ASG.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="gwy-data-field-area-row-asg.returns"></a><h4>Returns</h4>
+<p> A new one-dimensional data line with the ASG.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gwy-data-field-area-2dacf"></a><h3>gwy_data_field_area_2dacf ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_data_field_area_2dacf (<em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *data_field</code></em>,
@@ -3728,7 +4283,7 @@ distances are calculated from smaller number of data points they become
 increasingly bogus, therefore the default range is half of the size.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-2dacf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3798,7 +4353,7 @@ gwy_data_field_2dacf (<em class="parameter"><code><a class="link" href="GwyDataF
 adjustable) in this function are set to their default values.</p>
 <div class="refsect3">
 <a name="gwy-data-field-2dacf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3835,7 +4390,7 @@ gwy_data_field_area_racf (<em class="parameter"><code><a class="link" href="GwyD
 of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-racf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3894,7 +4449,7 @@ gwy_data_field_racf (<em class="parameter"><code><a class="link" href="GwyDataFi
 <p>Calculates radially averaged autocorrelation function of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-racf.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -3941,7 +4496,7 @@ threshold value (,white pixels`) divided by the total number of samples
 in the area.  Is it's equivalent to 1-CDH.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-minkowski-volume.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -4000,7 +4555,7 @@ gwy_data_field_minkowski_volume (<em class="parameter"><code><a class="link" hre
 <p>See <a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-minkowski-volume" title="gwy_data_field_area_minkowski_volume ()"><code class="function">gwy_data_field_area_minkowski_volume()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-data-field-minkowski-volume.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -4048,7 +4603,7 @@ threshold value (the number of pixel sides where of neighouring pixels is
 in the area.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-minkowski-boundary.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -4107,7 +4662,7 @@ gwy_data_field_minkowski_boundary (<em class="parameter"><code><a class="link" h
 <p>See <a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-minkowski-boundary" title="gwy_data_field_area_minkowski_boundary ()"><code class="function">gwy_data_field_area_minkowski_boundary()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-data-field-minkowski-boundary.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -4154,7 +4709,7 @@ pixels below threhsold (,black</code>) for each threshold value, divided by the
 total number of samples in the area.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-minkowski-euler.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -4214,7 +4769,7 @@ a data field.</p>
 <p>See <a class="link" href="libgwyprocess-stats.html#gwy-data-field-area-minkowski-euler" title="gwy_data_field_area_minkowski_euler ()"><code class="function">gwy_data_field_area_minkowski_euler()</code></a> for details.</p>
 <div class="refsect3">
 <a name="gwy-data-field-minkowski-euler.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -4252,7 +4807,7 @@ gwy_data_field_slope_distribution (<em class="parameter"><code><a class="link" h
 <p>Computes angular slope distribution.</p>
 <div class="refsect3">
 <a name="gwy-data-field-slope-distribution.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -4293,7 +4848,7 @@ gwy_data_field_get_normal_coeffs (<em class="parameter"><code><a class="link" hr
 <p>Computes average normal vector of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-normal-coeffs.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -4346,7 +4901,7 @@ gwy_data_field_area_get_normal_coeffs (<em class="parameter"><code><a class="lin
 <p>Computes average normal vector of an area of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-normal-coeffs.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -4417,7 +4972,7 @@ gwy_data_field_area_get_inclination (<em class="parameter"><code><a class="link"
 <p>Calculates the inclination of the image (polar and azimuth angle).</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-inclination.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -4473,7 +5028,7 @@ gwy_data_field_get_inclination (<em class="parameter"><code><a class="link" href
 <p>Calculates the inclination of the image (polar and azimuth angle).</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-inclination.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -4516,7 +5071,7 @@ gwy_data_field_area_get_line_stats (<em class="parameter"><code><a class="link"
 <p>Use <a class="link" href="libgwyprocess-stats.html#gwy-data-field-get-line-stats-mask" title="gwy_data_field_get_line_stats_mask ()"><code class="function">gwy_data_field_get_line_stats_mask()</code></a> for full masking type options.</p>
 <div class="refsect3">
 <a name="gwy-data-field-area-get-line-stats.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -4599,7 +5154,7 @@ gwy_data_field_get_line_stats_mask (<em class="parameter"><code><a class="link"
 <p>Calculates a line quantity for each row or column in a data field area.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-line-stats-mask.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -4690,7 +5245,7 @@ gwy_data_field_get_line_stats (<em class="parameter"><code><a class="link" href=
 <p>Calculates a line quantity for each row or column of a data field.</p>
 <div class="refsect3">
 <a name="gwy-data-field-get-line-stats.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -4733,7 +5288,7 @@ gwy_data_field_count_maxima (<em class="parameter"><code><a class="link" href="G
 <p>See <a class="link" href="libgwyprocess-grains.html#gwy-data-field-mark-extrema" title="gwy_data_field_mark_extrema ()"><code class="function">gwy_data_field_mark_extrema()</code></a> for the definition of a regional maximum.</p>
 <div class="refsect3">
 <a name="gwy-data-field-count-maxima.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -4761,7 +5316,7 @@ gwy_data_field_count_minima (<em class="parameter"><code><a class="link" href="G
 <p>See <a class="link" href="libgwyprocess-grains.html#gwy-data-field-mark-extrema" title="gwy_data_field_mark_extrema ()"><code class="function">gwy_data_field_mark_extrema()</code></a> for the definition of a regional minimum.</p>
 <div class="refsect3">
 <a name="gwy-data-field-count-minima.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -4803,7 +5358,7 @@ calculated for instance if either central or outer part of the disc is
 excluded by masking.</p>
 <div class="refsect3">
 <a name="gwy-data-field-angular-average.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess-tip.html b/devel-docs/libgwyprocess/html/libgwyprocess-tip.html
index 8b0e40c..37cec57 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess-tip.html
+++ b/devel-docs/libgwyprocess/html/libgwyprocess-tip.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>tip: Gwyddion Data Processing Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="up" href="index.html" title="Gwyddion Data Processing Library Reference Manual">
 <link rel="prev" href="libgwyprocess-stats-uncertainty.html" title="stats uncertainty">
@@ -15,7 +15,8 @@
 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
 <td width="100%" align="left" class="shortcuts">
 <a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
-                  <a href="#libgwyprocess-tip.description" class="shortcut">Description</a></span>
+                  <a href="#libgwyprocess-tip.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#libgwyprocess-tip.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
@@ -33,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="libgwyprocess-tip.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -64,14 +65,14 @@
 </td>
 </tr>
 <tr>
-<td class="function_type">const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset" title="struct GwyTipModelPreset"><span class="returnvalue">GwyTipModelPreset</span></a> *
+<td class="function_type">const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset"><span class="returnvalue">GwyTipModelPreset</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="libgwyprocess-tip.html#gwy-tip-model-get-preset" title="gwy_tip_model_get_preset ()">gwy_tip_model_get_preset</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <tr>
-<td class="function_type">const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset" title="struct GwyTipModelPreset"><span class="returnvalue">GwyTipModelPreset</span></a> *
+<td class="function_type">const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset"><span class="returnvalue">GwyTipModelPreset</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="libgwyprocess-tip.html#gwy-tip-model-get-preset-by-name" title="gwy_tip_model_get_preset_by_name ()">gwy_tip_model_get_preset_by_name</a> <span class="c_punctuation">()</span>
@@ -173,18 +174,11 @@
 </tbody>
 </table></div>
 </div>
-<div class="refsect1">
-<a name="libgwyprocess-tip.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="name">
-<col class="description">
-</colgroup>
-<tbody><tr>
-<td class="datatype_keyword">struct</td>
-<td class="function_name"><a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset" title="struct GwyTipModelPreset">GwyTipModelPreset</a></td>
-</tr></tbody>
-</table></div>
+<a name="GwyTipModelPreset"></a><div class="refsect1">
+<a name="libgwyprocess-tip.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gpointer">gpointer</a>
+    <span class="lineart">╰──</span> GwyTipModelPreset
+</pre>
 </div>
 <div class="refsect1">
 <a name="libgwyprocess-tip.includes"></a><h2>Includes</h2>
@@ -232,12 +226,12 @@ gwy_tip_model_get_npresets (<em class="parameter"><code><span class="type">void<
 <hr>
 <div class="refsect2">
 <a name="gwy-tip-model-get-preset"></a><h3>gwy_tip_model_get_preset ()</h3>
-<pre class="programlisting">const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset" title="struct GwyTipModelPreset"><span class="returnvalue">GwyTipModelPreset</span></a> *
-gwy_tip_model_get_preset (<em class="parameter"><code><a href="http://developer.gnome.org/doc/API/2.0/gtk/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> preset_id</code></em>);</pre>
+<pre class="programlisting">const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset"><span class="returnvalue">GwyTipModelPreset</span></a> *
+gwy_tip_model_get_preset (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a> preset_id</code></em>);</pre>
 <p>Get data related to tip preset.</p>
 <div class="refsect3">
 <a name="gwy-tip-model-get-preset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -258,12 +252,12 @@ gwy_tip_model_get_preset (<em class="parameter"><code><a href="http://developer.
 <hr>
 <div class="refsect2">
 <a name="gwy-tip-model-get-preset-by-name"></a><h3>gwy_tip_model_get_preset_by_name ()</h3>
-<pre class="programlisting">const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset" title="struct GwyTipModelPreset"><span class="returnvalue">GwyTipModelPreset</span></a> *
+<pre class="programlisting">const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset"><span class="returnvalue">GwyTipModelPreset</span></a> *
 gwy_tip_model_get_preset_by_name (<em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
 <p>Get data related to preset with specified name.</p>
 <div class="refsect3">
 <a name="gwy-tip-model-get-preset-by-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -285,11 +279,11 @@ gwy_tip_model_get_preset_by_name (<em class="parameter"><code>const <a href="/us
 <div class="refsect2">
 <a name="gwy-tip-model-get-preset-id"></a><h3>gwy_tip_model_get_preset_id ()</h3>
 <pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
-gwy_tip_model_get_preset_id (<em class="parameter"><code>const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset" title="struct GwyTipModelPreset"><span class="type">GwyTipModelPreset</span></a> *preset</code></em>);</pre>
+gwy_tip_model_get_preset_id (<em class="parameter"><code>const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset"><span class="type">GwyTipModelPreset</span></a> *preset</code></em>);</pre>
 <p>Get preset identifier within all presets.</p>
 <div class="refsect3">
 <a name="gwy-tip-model-get-preset-id.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -311,11 +305,11 @@ gwy_tip_model_get_preset_id (<em class="parameter"><code>const <a class="link" h
 <div class="refsect2">
 <a name="gwy-tip-model-get-preset-tip-name"></a><h3>gwy_tip_model_get_preset_tip_name ()</h3>
 <pre class="programlisting">const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
-gwy_tip_model_get_preset_tip_name (<em class="parameter"><code>const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset" title="struct GwyTipModelPreset"><span class="type">GwyTipModelPreset</span></a> *preset</code></em>);</pre>
+gwy_tip_model_get_preset_tip_name (<em class="parameter"><code>const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset"><span class="type">GwyTipModelPreset</span></a> *preset</code></em>);</pre>
 <p>Get name of the preset (e. g. "contact").</p>
 <div class="refsect3">
 <a name="gwy-tip-model-get-preset-tip-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -337,11 +331,11 @@ gwy_tip_model_get_preset_tip_name (<em class="parameter"><code>const <a class="l
 <div class="refsect2">
 <a name="gwy-tip-model-get-preset-group-name"></a><h3>gwy_tip_model_get_preset_group_name ()</h3>
 <pre class="programlisting">const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
-gwy_tip_model_get_preset_group_name (<em class="parameter"><code>const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset" title="struct GwyTipModelPreset"><span class="type">GwyTipModelPreset</span></a> *preset</code></em>);</pre>
+gwy_tip_model_get_preset_group_name (<em class="parameter"><code>const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset"><span class="type">GwyTipModelPreset</span></a> *preset</code></em>);</pre>
 <p>Get group name of preset (e. g. "analytical".)</p>
 <div class="refsect3">
 <a name="gwy-tip-model-get-preset-group-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -363,7 +357,7 @@ gwy_tip_model_get_preset_group_name (<em class="parameter"><code>const <a class=
 <div class="refsect2">
 <a name="gwy-tip-model-get-preset-nparams"></a><h3>gwy_tip_model_get_preset_nparams ()</h3>
 <pre class="programlisting"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
-gwy_tip_model_get_preset_nparams (<em class="parameter"><code>const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset" title="struct GwyTipModelPreset"><span class="type">GwyTipModelPreset</span></a> *preset</code></em>);</pre>
+gwy_tip_model_get_preset_nparams (<em class="parameter"><code>const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset"><span class="type">GwyTipModelPreset</span></a> *preset</code></em>);</pre>
 <p>Get number of tip preset parameters.</p>
 <div class="warning">In versions prior to 2.47 the function alwas returned zero and thus
 was useless.  You had to know the what parameters each model had and always
@@ -374,7 +368,7 @@ of parameters used in functions such as <a class="link" href="libgwyprocess-tip.
 parameters the old functions take.  They behave exactly as before.</div>
 <div class="refsect3">
 <a name="gwy-tip-model-get-preset-nparams.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -396,7 +390,7 @@ parameters the old functions take.  They behave exactly as before.</div>
 <div class="refsect2">
 <a name="gwy-tip-model-get-preset-params"></a><h3>gwy_tip_model_get_preset_params ()</h3>
 <pre class="programlisting">const <a class="link" href="libgwyprocess-gwyprocessenums.html#GwyTipParamType" title="enum GwyTipParamType"><span class="returnvalue">GwyTipParamType</span></a> *
-gwy_tip_model_get_preset_params (<em class="parameter"><code>const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset" title="struct GwyTipModelPreset"><span class="type">GwyTipModelPreset</span></a> *preset</code></em>);</pre>
+gwy_tip_model_get_preset_params (<em class="parameter"><code>const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset"><span class="type">GwyTipModelPreset</span></a> *preset</code></em>);</pre>
 <p>Gets the list of parameters of a tip model preset.</p>
 <p>All tip models have parameters from a predefined set given by the
 <a class="link" href="libgwyprocess-gwyprocessenums.html#GwyTipParamType" title="enum GwyTipParamType"><span class="type">GwyTipParamType</span></a> enum.</p>
@@ -405,7 +399,7 @@ you may want to avoid tip models that have parameters with an unknown
 (higher than known) id.</p>
 <div class="refsect3">
 <a name="gwy-tip-model-get-preset-params.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -429,7 +423,7 @@ is owned by the library and must not be modified nor freed.</p>
 <div class="refsect2">
 <a name="gwy-tip-model-preset-create"></a><h3>gwy_tip_model_preset_create ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-gwy_tip_model_preset_create (<em class="parameter"><code>const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset" title="struct GwyTipModelPreset"><span class="type">GwyTipModelPreset</span></a> *preset</code></em>,
+gwy_tip_model_preset_create (<em class="parameter"><code>const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset"><span class="type">GwyTipModelPreset</span></a> *preset</code></em>,
                              <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *tip</code></em>,
                              <em class="parameter"><code>const <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *params</code></em>);</pre>
 <p>Fills a data field with a preset tip model.</p>
@@ -444,7 +438,7 @@ And only those parameters are passed in <em class="parameter"><code>params</code
 .</p>
 <div class="refsect3">
 <a name="gwy-tip-model-preset-create.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -476,7 +470,7 @@ And only those parameters are passed in <em class="parameter"><code>params</code
 <a name="gwy-tip-model-preset-create-for-zrange"></a><h3>gwy_tip_model_preset_create_for_zrange ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gwy_tip_model_preset_create_for_zrange
-                               (<em class="parameter"><code>const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset" title="struct GwyTipModelPreset"><span class="type">GwyTipModelPreset</span></a> *preset</code></em>,
+                               (<em class="parameter"><code>const <a class="link" href="libgwyprocess-tip.html#GwyTipModelPreset"><span class="type">GwyTipModelPreset</span></a> *preset</code></em>,
                                 <em class="parameter"><code><a class="link" href="GwyDataField.html" title="GwyDataField"><span class="type">GwyDataField</span></a> *tip</code></em>,
                                 <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> zrange</code></em>,
                                 <em class="parameter"><code><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> square</code></em>,
@@ -502,7 +496,7 @@ And only those parameters are passed in <em class="parameter"><code>params</code
 .</p>
 <div class="refsect3">
 <a name="gwy-tip-model-preset-create-for-zrange.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -558,7 +552,7 @@ equivalent to morphological dilation operation.</p>
 undefined.</p>
 <div class="refsect3">
 <a name="gwy-tip-dilation.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -616,7 +610,7 @@ Villarrubia, which is equivalent to morphological erosion operation.</p>
 undefined.</p>
 <div class="refsect3">
 <a name="gwy-tip-erosion.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -674,7 +668,7 @@ can be used as a mask of points where tip did not directly touch the
 surface.</p>
 <div class="refsect3">
 <a name="gwy-tip-cmap.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -737,7 +731,7 @@ of surface range can be good. Otherwise we recommend to start with zero
 threshold and increase it slowly to observe changes and choose right value.</p>
 <div class="refsect3">
 <a name="gwy-tip-estimate-partial.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -808,7 +802,7 @@ of surface range can be good. Otherwise we recommend to start with zero
 threshold and increase it slowly to observe changes and choose right value.</p>
 <div class="refsect3">
 <a name="gwy-tip-estimate-full.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -861,18 +855,6 @@ threshold and increase it slowly to observe changes and choose right value.</p>
 </div>
 <div class="refsect1">
 <a name="libgwyprocess-tip.other_details"></a><h2>Types and Values</h2>
-<div class="refsect2">
-<a name="GwyTipModelPreset"></a><h3>struct GwyTipModelPreset</h3>
-<pre class="programlisting">struct GwyTipModelPreset {
-    const gchar *tip_name;
-    const gchar *group_name;
-    GwyTipModelFunc func;
-    GwyTipGuessFunc guess;
-    gint nparams;
-};
-</pre>
-<div class="warning"><p><code class="literal">GwyTipModelPreset</code> is deprecated and should not be used in newly-written code.</p></div>
-</div>
 </div>
 </div>
 <div class="footer">
diff --git a/devel-docs/libgwyprocess/html/libgwyprocess.devhelp2 b/devel-docs/libgwyprocess/html/libgwyprocess.devhelp2
index 6fd547e..a2e6a69 100644
--- a/devel-docs/libgwyprocess/html/libgwyprocess.devhelp2
+++ b/devel-docs/libgwyprocess/html/libgwyprocess.devhelp2
@@ -66,6 +66,8 @@
     <sub name="Index of new symbols in 2.45" link="api-index-2-45.html"/>
     <sub name="Index of new symbols in 2.46" link="api-index-2-46.html"/>
     <sub name="Index of new symbols in 2.47" link="api-index-2-47.html"/>
+    <sub name="Index of new symbols in 2.48" link="api-index-2-48.html"/>
+    <sub name="Index of new symbols in 2.49" link="api-index-2-49.html"/>
   </chapters>
   <functions>
     <keyword type="macro" name="gwy_data_line_duplicate()" link="GwyDataLine.html#gwy-data-line-duplicate"/>
@@ -90,6 +92,7 @@
     <keyword type="function" name="gwy_data_line_set_si_unit_y ()" link="GwyDataLine.html#gwy-data-line-set-si-unit-y"/>
     <keyword type="function" name="gwy_data_line_get_value_format_x ()" link="GwyDataLine.html#gwy-data-line-get-value-format-x"/>
     <keyword type="function" name="gwy_data_line_get_value_format_y ()" link="GwyDataLine.html#gwy-data-line-get-value-format-y"/>
+    <keyword type="function" name="gwy_data_line_copy_units ()" link="GwyDataLine.html#gwy-data-line-copy-units" since="2.49"/>
     <keyword type="function" name="gwy_data_line_itor ()" link="GwyDataLine.html#gwy-data-line-itor"/>
     <keyword type="function" name="gwy_data_line_rtoi ()" link="GwyDataLine.html#gwy-data-line-rtoi"/>
     <keyword type="function" name="gwy_data_line_get_val ()" link="GwyDataLine.html#gwy-data-line-get-val"/>
@@ -152,6 +155,7 @@
     <keyword type="function" name="gwy_data_field_set_si_unit_z ()" link="GwyDataField.html#gwy-data-field-set-si-unit-z"/>
     <keyword type="function" name="gwy_data_field_get_value_format_xy ()" link="GwyDataField.html#gwy-data-field-get-value-format-xy"/>
     <keyword type="function" name="gwy_data_field_get_value_format_z ()" link="GwyDataField.html#gwy-data-field-get-value-format-z"/>
+    <keyword type="function" name="gwy_data_field_copy_units ()" link="GwyDataField.html#gwy-data-field-copy-units" since="2.49"/>
     <keyword type="function" name="gwy_data_field_copy_units_to_data_line ()" link="GwyDataField.html#gwy-data-field-copy-units-to-data-line"/>
     <keyword type="function" name="gwy_data_line_copy_units_to_data_field ()" link="GwyDataField.html#gwy-data-line-copy-units-to-data-field"/>
     <keyword type="function" name="gwy_data_field_itor ()" link="GwyDataField.html#gwy-data-field-itor"/>
@@ -166,6 +170,8 @@
     <keyword type="function" name="gwy_data_field_new_rotated ()" link="GwyDataField.html#gwy-data-field-new-rotated" since="2.46"/>
     <keyword type="function" name="gwy_data_field_new_rotated_90 ()" link="GwyDataField.html#gwy-data-field-new-rotated-90" since="2.46"/>
     <keyword type="function" name="gwy_data_field_invert ()" link="GwyDataField.html#gwy-data-field-invert"/>
+    <keyword type="function" name="gwy_data_field_flip_xy ()" link="GwyDataField.html#gwy-data-field-flip-xy" since="2.49"/>
+    <keyword type="function" name="gwy_data_field_area_flip_xy ()" link="GwyDataField.html#gwy-data-field-area-flip-xy" since="2.49"/>
     <keyword type="function" name="gwy_data_field_fill ()" link="GwyDataField.html#gwy-data-field-fill"/>
     <keyword type="function" name="gwy_data_field_clear ()" link="GwyDataField.html#gwy-data-field-clear"/>
     <keyword type="function" name="gwy_data_field_multiply ()" link="GwyDataField.html#gwy-data-field-multiply"/>
@@ -176,6 +182,7 @@
     <keyword type="function" name="gwy_data_field_area_multiply ()" link="GwyDataField.html#gwy-data-field-area-multiply"/>
     <keyword type="function" name="gwy_data_field_area_add ()" link="GwyDataField.html#gwy-data-field-area-add"/>
     <keyword type="function" name="gwy_data_field_get_profile ()" link="GwyDataField.html#gwy-data-field-get-profile"/>
+    <keyword type="function" name="gwy_data_field_get_profile_mask ()" link="GwyDataField.html#gwy-data-field-get-profile-mask" since="2.49"/>
     <keyword type="function" name="gwy_data_field_get_row ()" link="GwyDataField.html#gwy-data-field-get-row"/>
     <keyword type="function" name="gwy_data_field_get_column ()" link="GwyDataField.html#gwy-data-field-get-column"/>
     <keyword type="function" name="gwy_data_field_set_row ()" link="GwyDataField.html#gwy-data-field-set-row"/>
@@ -253,6 +260,7 @@
     <keyword type="function" name="gwy_brick_set_si_unit_w ()" link="GwyBrick.html#gwy-brick-set-si-unit-w" since="2.31"/>
     <keyword type="function" name="gwy_brick_get_min ()" link="GwyBrick.html#gwy-brick-get-min" since="2.31"/>
     <keyword type="function" name="gwy_brick_get_max ()" link="GwyBrick.html#gwy-brick-get-max" since="2.31"/>
+    <keyword type="function" name="gwy_brick_copy_units ()" link="GwyBrick.html#gwy-brick-copy-units" since="2.49"/>
     <keyword type="function" name="gwy_brick_get_value_format_x ()" link="GwyBrick.html#gwy-brick-get-value-format-x" since="2.31"/>
     <keyword type="function" name="gwy_brick_get_value_format_y ()" link="GwyBrick.html#gwy-brick-get-value-format-y" since="2.31"/>
     <keyword type="function" name="gwy_brick_get_value_format_z ()" link="GwyBrick.html#gwy-brick-get-value-format-z" since="2.31"/>
@@ -312,6 +320,7 @@
     <keyword type="function" name="gwy_surface_set_si_unit_z ()" link="GwySurface.html#gwy-surface-set-si-unit-z" since="2.45"/>
     <keyword type="function" name="gwy_surface_get_value_format_xy ()" link="GwySurface.html#gwy-surface-get-value-format-xy" since="2.45"/>
     <keyword type="function" name="gwy_surface_get_value_format_z ()" link="GwySurface.html#gwy-surface-get-value-format-z" since="2.45"/>
+    <keyword type="function" name="gwy_surface_copy_units ()" link="GwySurface.html#gwy-surface-copy-units" since="2.49"/>
     <keyword type="function" name="gwy_data_field_copy_units_to_surface ()" link="GwySurface.html#gwy-data-field-copy-units-to-surface" since="2.46"/>
     <keyword type="function" name="gwy_surface_copy_units_to_data_field ()" link="GwySurface.html#gwy-surface-copy-units-to-data-field" since="2.46"/>
     <keyword type="function" name="gwy_surface_get ()" link="GwySurface.html#gwy-surface-get" since="2.45"/>
@@ -322,6 +331,7 @@
     <keyword type="function" name="gwy_surface_get_data_full ()" link="GwySurface.html#gwy-surface-get-data-full" since="2.45"/>
     <keyword type="function" name="gwy_surface_set_data_full ()" link="GwySurface.html#gwy-surface-set-data-full" since="2.45"/>
     <keyword type="function" name="gwy_surface_xy_is_compatible ()" link="GwySurface.html#gwy-surface-xy-is-compatible" since="2.45"/>
+    <keyword type="function" name="gwy_surface_reduce_points ()" link="GwySurface.html#gwy-surface-reduce-points" since="2.48"/>
     <keyword type="struct" name="struct GwySurface" link="GwySurface.html#GwySurface-struct"/>
     <keyword type="struct" name="struct GwySurfaceClass" link="GwySurface.html#GwySurfaceClass" since="2.45"/>
     <keyword type="signal" name="The “data-changed” signal" link="GwySurface.html#GwySurface-data-changed"/>
@@ -393,6 +403,9 @@
     <keyword type="function" name="gwy_data_field_distort ()" link="libgwyprocess-correct.html#gwy-data-field-distort" since="2.5"/>
     <keyword type="function" name="gwy_data_field_sample_distorted ()" link="libgwyprocess-correct.html#gwy-data-field-sample-distorted" since="2.45"/>
     <keyword type="function" name="gwy_data_field_affine ()" link="libgwyprocess-correct.html#gwy-data-field-affine" since="2.34"/>
+    <keyword type="function" name="gwy_data_field_affine_prepare ()" link="libgwyprocess-correct.html#gwy-data-field-affine-prepare" since="2.49"/>
+    <keyword type="function" name="gwy_data_field_measure_lattice_acf ()" link="libgwyprocess-correct.html#gwy-data-field-measure-lattice-acf" since="2.49"/>
+    <keyword type="function" name="gwy_data_field_measure_lattice_psdf ()" link="libgwyprocess-correct.html#gwy-data-field-measure-lattice-psdf" since="2.49"/>
     <keyword type="function" name="gwy_data_line_correct_laplace ()" link="libgwyprocess-correct.html#gwy-data-line-correct-laplace" since="2.45"/>
     <keyword type="function" name="gwy_data_field_mark_scars ()" link="libgwyprocess-correct.html#gwy-data-field-mark-scars" since="2.46"/>
     <keyword type="function" name="gwy_data_field_unrotate_find_corrections ()" link="libgwyprocess-correct.html#gwy-data-field-unrotate-find-corrections"/>
@@ -423,6 +436,7 @@
     <keyword type="function" name="gwy_data_field_circular_area_extract_with_pos ()" link="libgwyprocess-elliptic.html#gwy-data-field-circular-area-extract-with-pos" since="2.2"/>
     <keyword type="function" name="gwy_data_field_circular_area_unextract ()" link="libgwyprocess-elliptic.html#gwy-data-field-circular-area-unextract"/>
     <keyword type="function" name="gwy_data_field_get_circular_area_size ()" link="libgwyprocess-elliptic.html#gwy-data-field-get-circular-area-size"/>
+    <keyword type="function" name="gwy_data_field_local_maximum ()" link="libgwyprocess-elliptic.html#gwy-data-field-local-maximum" since="2.49"/>
     <keyword type="function" name="gwy_data_field_normalize ()" link="libgwyprocess-filters.html#gwy-data-field-normalize"/>
     <keyword type="function" name="gwy_data_field_renormalize ()" link="libgwyprocess-filters.html#gwy-data-field-renormalize"/>
     <keyword type="function" name="gwy_data_field_area_renormalize ()" link="libgwyprocess-filters.html#gwy-data-field-area-renormalize" since="2.45"/>
@@ -433,8 +447,10 @@
     <keyword type="function" name="gwy_data_field_area_gather ()" link="libgwyprocess-filters.html#gwy-data-field-area-gather"/>
     <keyword type="function" name="gwy_data_field_convolve ()" link="libgwyprocess-filters.html#gwy-data-field-convolve"/>
     <keyword type="function" name="gwy_data_field_area_convolve ()" link="libgwyprocess-filters.html#gwy-data-field-area-convolve"/>
+    <keyword type="function" name="gwy_data_field_area_ext_convolve ()" link="libgwyprocess-filters.html#gwy-data-field-area-ext-convolve" since="2.49"/>
     <keyword type="function" name="gwy_data_field_convolve_1d ()" link="libgwyprocess-filters.html#gwy-data-field-convolve-1d" since="2.4"/>
     <keyword type="function" name="gwy_data_field_area_convolve_1d ()" link="libgwyprocess-filters.html#gwy-data-field-area-convolve-1d" since="2.4"/>
+    <keyword type="function" name="gwy_data_field_area_ext_row_convolve ()" link="libgwyprocess-filters.html#gwy-data-field-area-ext-row-convolve" since="2.49"/>
     <keyword type="function" name="gwy_data_field_filter_median ()" link="libgwyprocess-filters.html#gwy-data-field-filter-median"/>
     <keyword type="function" name="gwy_data_field_area_filter_median ()" link="libgwyprocess-filters.html#gwy-data-field-area-filter-median"/>
     <keyword type="function" name="gwy_data_field_filter_mean ()" link="libgwyprocess-filters.html#gwy-data-field-filter-mean"/>
@@ -512,6 +528,7 @@
     <keyword type="function" name="gwy_data_field_grain_simple_dist_trans ()" link="libgwyprocess-grains.html#gwy-data-field-grain-simple-dist-trans" since="2.41"/>
     <keyword type="function" name="gwy_data_field_grains_shrink ()" link="libgwyprocess-grains.html#gwy-data-field-grains-shrink" since="2.43"/>
     <keyword type="function" name="gwy_data_field_grains_grow ()" link="libgwyprocess-grains.html#gwy-data-field-grains-grow" since="2.43"/>
+    <keyword type="function" name="gwy_data_field_grains_thin ()" link="libgwyprocess-grains.html#gwy-data-field-grains-thin" since="2.48"/>
     <keyword type="function" name="gwy_data_field_fill_voids ()" link="libgwyprocess-grains.html#gwy-data-field-fill-voids" since="2.37"/>
     <keyword type="function" name="gwy_data_field_waterpour ()" link="libgwyprocess-grains.html#gwy-data-field-waterpour" since="2.37"/>
     <keyword type="function" name="gwy_data_field_mark_extrema ()" link="libgwyprocess-grains.html#gwy-data-field-mark-extrema" since="2.37"/>
@@ -602,6 +619,10 @@
     <keyword type="function" name="gwy_data_line_get_max ()" link="libgwyprocess-linestats.html#gwy-data-line-get-max"/>
     <keyword type="function" name="gwy_data_line_get_min ()" link="libgwyprocess-linestats.html#gwy-data-line-get-min"/>
     <keyword type="function" name="gwy_data_line_get_min_max ()" link="libgwyprocess-linestats.html#gwy-data-line-get-min-max"/>
+    <keyword type="function" name="gwy_data_line_min_pos_i ()" link="libgwyprocess-linestats.html#gwy-data-line-min-pos-i"/>
+    <keyword type="function" name="gwy_data_line_max_pos_i ()" link="libgwyprocess-linestats.html#gwy-data-line-max-pos-i"/>
+    <keyword type="function" name="gwy_data_line_min_pos_r ()" link="libgwyprocess-linestats.html#gwy-data-line-min-pos-r"/>
+    <keyword type="function" name="gwy_data_line_max_pos_r ()" link="libgwyprocess-linestats.html#gwy-data-line-max-pos-r"/>
     <keyword type="function" name="gwy_data_line_get_avg ()" link="libgwyprocess-linestats.html#gwy-data-line-get-avg"/>
     <keyword type="function" name="gwy_data_line_get_rms ()" link="libgwyprocess-linestats.html#gwy-data-line-get-rms"/>
     <keyword type="function" name="gwy_data_line_get_tan_beta0 ()" link="libgwyprocess-linestats.html#gwy-data-line-get-tan-beta0" since="2.2"/>
@@ -671,11 +692,13 @@
     <keyword type="function" name="gwy_shape_fit_preset_calculate_xyz ()" link="GwyShapeFitPreset.html#gwy-shape-fit-preset-calculate-xyz" since="2.47"/>
     <keyword type="function" name="gwy_shape_fit_preset_create_fitter ()" link="GwyShapeFitPreset.html#gwy-shape-fit-preset-create-fitter" since="2.47"/>
     <keyword type="function" name="gwy_shape_fit_preset_fit ()" link="GwyShapeFitPreset.html#gwy-shape-fit-preset-fit" since="2.47"/>
+    <keyword type="function" name="gwy_shape_fit_preset_quick_fit ()" link="GwyShapeFitPreset.html#gwy-shape-fit-preset-quick-fit" since="2.48"/>
     <keyword type="function" name="gwy_shape_fit_presets ()" link="GwyShapeFitPreset.html#gwy-shape-fit-presets" since="2.47"/>
     <keyword type="struct" name="struct GwyShapeFitPreset" link="GwyShapeFitPreset.html#GwyShapeFitPreset-struct"/>
     <keyword type="struct" name="struct GwyShapeFitPresetClass" link="GwyShapeFitPreset.html#GwyShapeFitPresetClass"/>
     <keyword type="function" name="gwy_spline_new ()" link="libgwyprocess-GwySpline.html#gwy-spline-new" since="2.45"/>
     <keyword type="function" name="gwy_spline_free ()" link="libgwyprocess-GwySpline.html#gwy-spline-free" since="2.45"/>
+    <keyword type="function" name="gwy_spline_copy ()" link="libgwyprocess-GwySpline.html#gwy-spline-copy" since="2.49"/>
     <keyword type="function" name="gwy_spline_new_from_points ()" link="libgwyprocess-GwySpline.html#gwy-spline-new-from-points" since="2.45"/>
     <keyword type="function" name="gwy_spline_get_npoints ()" link="libgwyprocess-GwySpline.html#gwy-spline-get-npoints" since="2.45"/>
     <keyword type="function" name="gwy_spline_get_points ()" link="libgwyprocess-GwySpline.html#gwy-spline-get-points" since="2.45"/>
@@ -688,7 +711,6 @@
     <keyword type="function" name="gwy_spline_length ()" link="libgwyprocess-GwySpline.html#gwy-spline-length" since="2.45"/>
     <keyword type="function" name="gwy_spline_sample_naturally ()" link="libgwyprocess-GwySpline.html#gwy-spline-sample-naturally" since="2.45"/>
     <keyword type="function" name="gwy_spline_sample_uniformly ()" link="libgwyprocess-GwySpline.html#gwy-spline-sample-uniformly" since="2.45"/>
-    <keyword type="struct" name="GwySpline" link="libgwyprocess-GwySpline.html#GwySpline"/>
     <keyword type="function" name="gwy_data_field_get_max ()" link="libgwyprocess-stats.html#gwy-data-field-get-max"/>
     <keyword type="function" name="gwy_data_field_get_min ()" link="libgwyprocess-stats.html#gwy-data-field-get-min"/>
     <keyword type="function" name="gwy_data_field_get_min_max ()" link="libgwyprocess-stats.html#gwy-data-field-get-min-max"/>
@@ -730,17 +752,23 @@
     <keyword type="function" name="gwy_data_field_area_cdh ()" link="libgwyprocess-stats.html#gwy-data-field-area-cdh"/>
     <keyword type="function" name="gwy_data_field_cdh ()" link="libgwyprocess-stats.html#gwy-data-field-cdh"/>
     <keyword type="function" name="gwy_data_field_area_da ()" link="libgwyprocess-stats.html#gwy-data-field-area-da"/>
+    <keyword type="function" name="gwy_data_field_area_da_mask ()" link="libgwyprocess-stats.html#gwy-data-field-area-da-mask" since="2.49"/>
     <keyword type="function" name="gwy_data_field_da ()" link="libgwyprocess-stats.html#gwy-data-field-da"/>
     <keyword type="function" name="gwy_data_field_area_cda ()" link="libgwyprocess-stats.html#gwy-data-field-area-cda"/>
+    <keyword type="function" name="gwy_data_field_area_cda_mask ()" link="libgwyprocess-stats.html#gwy-data-field-area-cda-mask" since="2.49"/>
     <keyword type="function" name="gwy_data_field_cda ()" link="libgwyprocess-stats.html#gwy-data-field-cda"/>
     <keyword type="function" name="gwy_data_field_area_acf ()" link="libgwyprocess-stats.html#gwy-data-field-area-acf"/>
     <keyword type="function" name="gwy_data_field_acf ()" link="libgwyprocess-stats.html#gwy-data-field-acf"/>
+    <keyword type="function" name="gwy_data_field_area_row_acf ()" link="libgwyprocess-stats.html#gwy-data-field-area-row-acf"/>
     <keyword type="function" name="gwy_data_field_area_hhcf ()" link="libgwyprocess-stats.html#gwy-data-field-area-hhcf"/>
     <keyword type="function" name="gwy_data_field_hhcf ()" link="libgwyprocess-stats.html#gwy-data-field-hhcf"/>
+    <keyword type="function" name="gwy_data_field_area_row_hhcf ()" link="libgwyprocess-stats.html#gwy-data-field-area-row-hhcf"/>
     <keyword type="function" name="gwy_data_field_area_psdf ()" link="libgwyprocess-stats.html#gwy-data-field-area-psdf"/>
     <keyword type="function" name="gwy_data_field_psdf ()" link="libgwyprocess-stats.html#gwy-data-field-psdf"/>
+    <keyword type="function" name="gwy_data_field_area_row_psdf ()" link="libgwyprocess-stats.html#gwy-data-field-area-row-psdf"/>
     <keyword type="function" name="gwy_data_field_area_rpsdf ()" link="libgwyprocess-stats.html#gwy-data-field-area-rpsdf" since="2.7"/>
     <keyword type="function" name="gwy_data_field_rpsdf ()" link="libgwyprocess-stats.html#gwy-data-field-rpsdf" since="2.7"/>
+    <keyword type="function" name="gwy_data_field_area_row_asg ()" link="libgwyprocess-stats.html#gwy-data-field-area-row-asg"/>
     <keyword type="function" name="gwy_data_field_area_2dacf ()" link="libgwyprocess-stats.html#gwy-data-field-area-2dacf" since="2.7"/>
     <keyword type="function" name="gwy_data_field_2dacf ()" link="libgwyprocess-stats.html#gwy-data-field-2dacf" since="2.7"/>
     <keyword type="function" name="gwy_data_field_area_racf ()" link="libgwyprocess-stats.html#gwy-data-field-area-racf" since="2.22"/>
@@ -819,7 +847,6 @@
     <keyword type="function" name="gwy_tip_cmap ()" link="libgwyprocess-tip.html#gwy-tip-cmap"/>
     <keyword type="function" name="gwy_tip_estimate_partial ()" link="libgwyprocess-tip.html#gwy-tip-estimate-partial"/>
     <keyword type="function" name="gwy_tip_estimate_full ()" link="libgwyprocess-tip.html#gwy-tip-estimate-full"/>
-    <keyword type="struct" name="struct GwyTipModelPreset" link="libgwyprocess-tip.html#GwyTipModelPreset" deprecated=""/>
     <keyword type="function" name="gwy_triangulation_new ()" link="GwyTriangulation.html#gwy-triangulation-new" since="2.18"/>
     <keyword type="function" name="gwy_triangulation_triangulate ()" link="GwyTriangulation.html#gwy-triangulation-triangulate" since="2.18"/>
     <keyword type="function" name="gwy_triangulation_triangulate_iterative ()" link="GwyTriangulation.html#gwy-triangulation-triangulate-iterative" since="2.44"/>
@@ -846,6 +873,8 @@
     <keyword type="function" name="gwy_windowing_type_get_enum ()" link="libgwyprocess-gwyprocessenums.html#gwy-windowing-type-get-enum"/>
     <keyword type="function" name="gwy_correlation_type_get_enum ()" link="libgwyprocess-gwyprocessenums.html#gwy-correlation-type-get-enum"/>
     <keyword type="function" name="gwy_distance_transform_type_get_enum ()" link="libgwyprocess-gwyprocessenums.html#gwy-distance-transform-type-get-enum" since="2.43"/>
+    <keyword type="function" name="gwy_computation_state_get_state ()" link="libgwyprocess-gwyprocessenums.html#gwy-computation-state-get-state" since="2.49"/>
+    <keyword type="function" name="gwy_computation_state_get_fraction ()" link="libgwyprocess-gwyprocessenums.html#gwy-computation-state-get-fraction" since="2.49"/>
     <keyword type="enum" name="enum GwyMergeType" link="libgwyprocess-gwyprocessenums.html#GwyMergeType"/>
     <keyword type="enum" name="enum GwyMaskingType" link="libgwyprocess-gwyprocessenums.html#GwyMaskingType" since="2.12"/>
     <keyword type="enum" name="enum GwyWatershedStateType" link="libgwyprocess-gwyprocessenums.html#GwyWatershedStateType"/>
@@ -870,7 +899,7 @@
     <keyword type="enum" name="enum GwyDistanceTransformType" link="libgwyprocess-gwyprocessenums.html#GwyDistanceTransformType" since="2.41"/>
     <keyword type="enum" name="enum GwyMinMaxFilterType" link="libgwyprocess-gwyprocessenums.html#GwyMinMaxFilterType" since="2.43"/>
     <keyword type="enum" name="enum GwyRotateResizeType" link="libgwyprocess-gwyprocessenums.html#GwyRotateResizeType" since="2.46"/>
-    <keyword type="struct" name="GwyComputationState" link="libgwyprocess-gwyprocessenums.html#GwyComputationState"/>
+    <keyword type="enum" name="enum GwyAffineScalingType" link="libgwyprocess-gwyprocessenums.html#GwyAffineScalingType" since="2.49"/>
     <keyword type="constant" name="GWY_GRAIN_VALUE_GROUP_ID" link="GwyGrainValue.html#GWY-GRAIN-VALUE-GROUP-ID:CAPS"/>
     <keyword type="constant" name="GWY_GRAIN_VALUE_GROUP_POSITION" link="GwyGrainValue.html#GWY-GRAIN-VALUE-GROUP-POSITION:CAPS"/>
     <keyword type="constant" name="GWY_GRAIN_VALUE_GROUP_VALUE" link="GwyGrainValue.html#GWY-GRAIN-VALUE-GROUP-VALUE:CAPS"/>
@@ -1045,6 +1074,8 @@
     <keyword type="constant" name="GWY_LINE_STAT_KURTOSIS" link="libgwyprocess-gwyprocessenums.html#GWY-LINE-STAT-KURTOSIS:CAPS"/>
     <keyword type="constant" name="GWY_LINE_STAT_RANGE" link="libgwyprocess-gwyprocessenums.html#GWY-LINE-STAT-RANGE:CAPS"/>
     <keyword type="constant" name="GWY_LINE_STAT_VARIATION" link="libgwyprocess-gwyprocessenums.html#GWY-LINE-STAT-VARIATION:CAPS"/>
+    <keyword type="constant" name="GWY_LINE_STAT_MINPOS" link="libgwyprocess-gwyprocessenums.html#GWY-LINE-STAT-MINPOS:CAPS"/>
+    <keyword type="constant" name="GWY_LINE_STAT_MAXPOS" link="libgwyprocess-gwyprocessenums.html#GWY-LINE-STAT-MAXPOS:CAPS"/>
     <keyword type="constant" name="GWY_EXTERIOR_UNDEFINED" link="libgwyprocess-gwyprocessenums.html#GWY-EXTERIOR-UNDEFINED:CAPS"/>
     <keyword type="constant" name="GWY_EXTERIOR_BORDER_EXTEND" link="libgwyprocess-gwyprocessenums.html#GWY-EXTERIOR-BORDER-EXTEND:CAPS"/>
     <keyword type="constant" name="GWY_EXTERIOR_MIRROR_EXTEND" link="libgwyprocess-gwyprocessenums.html#GWY-EXTERIOR-MIRROR-EXTEND:CAPS"/>
@@ -1069,13 +1100,14 @@
     <keyword type="constant" name="GWY_ROTATE_RESIZE_SAME_SIZE" link="libgwyprocess-gwyprocessenums.html#GWY-ROTATE-RESIZE-SAME-SIZE:CAPS"/>
     <keyword type="constant" name="GWY_ROTATE_RESIZE_EXPAND" link="libgwyprocess-gwyprocessenums.html#GWY-ROTATE-RESIZE-EXPAND:CAPS"/>
     <keyword type="constant" name="GWY_ROTATE_RESIZE_CUT" link="libgwyprocess-gwyprocessenums.html#GWY-ROTATE-RESIZE-CUT:CAPS"/>
+    <keyword type="constant" name="GWY_AFFINE_SCALING_AS_GIVEN" link="libgwyprocess-gwyprocessenums.html#GWY-AFFINE-SCALING-AS-GIVEN:CAPS"/>
+    <keyword type="constant" name="GWY_AFFINE_SCALING_PRESERVE_AREA" link="libgwyprocess-gwyprocessenums.html#GWY-AFFINE-SCALING-PRESERVE-AREA:CAPS"/>
+    <keyword type="constant" name="GWY_AFFINE_SCALING_PRESERVE_X" link="libgwyprocess-gwyprocessenums.html#GWY-AFFINE-SCALING-PRESERVE-X:CAPS"/>
     <keyword type="member" name="GwySurface-struct.n" link="GwySurface.html#GwySurface-struct.n"/>
     <keyword type="member" name="GwySurface-struct.data" link="GwySurface.html#GwySurface-struct.data"/>
     <keyword type="member" name="GwyTriangulationData.npoints" link="GwyTriangulation.html#GwyTriangulationData.npoints"/>
     <keyword type="member" name="GwyTriangulationData.size" link="GwyTriangulation.html#GwyTriangulationData.size"/>
     <keyword type="member" name="GwyTriangulationData.index" link="GwyTriangulation.html#GwyTriangulationData.index"/>
     <keyword type="member" name="GwyTriangulationData.neighbours" link="GwyTriangulation.html#GwyTriangulationData.neighbours"/>
-    <keyword type="member" name="GwyComputationState.state" link="libgwyprocess-gwyprocessenums.html#GwyComputationState.state"/>
-    <keyword type="member" name="GwyComputationState.fraction" link="libgwyprocess-gwyprocessenums.html#GwyComputationState.fraction"/>
   </functions>
 </book>
diff --git a/devel-docs/libgwyprocess/libgwyprocess-docs.sgml b/devel-docs/libgwyprocess/libgwyprocess-docs.sgml
index 644999b..ca02c92 100644
--- a/devel-docs/libgwyprocess/libgwyprocess-docs.sgml
+++ b/devel-docs/libgwyprocess/libgwyprocess-docs.sgml
@@ -49,129 +49,137 @@
     <title>Index of all symbols</title>
     <xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-deprec" role="deprecated">
+  <index id="api-index-deprec">
     <title>Index of deprecated symbols</title>
     <xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-1" role="2.1">
+  <index id="api-index-2-1">
     <title>Index of new symbols in 2.1</title>
     <xi:include href="xml/api-index-2.1.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-2" role="2.2">
+  <index id="api-index-2-2">
     <title>Index of new symbols in 2.2</title>
     <xi:include href="xml/api-index-2.2.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-3" role="2.3">
+  <index id="api-index-2-3">
     <title>Index of new symbols in 2.3</title>
     <xi:include href="xml/api-index-2.3.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-4" role="2.4">
+  <index id="api-index-2-4">
     <title>Index of new symbols in 2.4</title>
     <xi:include href="xml/api-index-2.4.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-5" role="2.5">
+  <index id="api-index-2-5">
     <title>Index of new symbols in 2.5</title>
     <xi:include href="xml/api-index-2.5.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-7" role="2.7">
+  <index id="api-index-2-7">
     <title>Index of new symbols in 2.7</title>
     <xi:include href="xml/api-index-2.7.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-8" role="2.8">
+  <index id="api-index-2-8">
     <title>Index of new symbols in 2.8</title>
     <xi:include href="xml/api-index-2.8.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-11" role="2.11">
+  <index id="api-index-2-11">
     <title>Index of new symbols in 2.11</title>
     <xi:include href="xml/api-index-2.11.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-12" role="2.12">
+  <index id="api-index-2-12">
     <title>Index of new symbols in 2.12</title>
     <xi:include href="xml/api-index-2.12.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-18" role="2.18">
+  <index id="api-index-2-18">
     <title>Index of new symbols in 2.18</title>
     <xi:include href="xml/api-index-2.18.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-22" role="2.22">
+  <index id="api-index-2-22">
     <title>Index of new symbols in 2.22</title>
     <xi:include href="xml/api-index-2.22.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-23" role="2.23">
+  <index id="api-index-2-23">
     <title>Index of new symbols in 2.23</title>
     <xi:include href="xml/api-index-2.23.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-26" role="2.26">
+  <index id="api-index-2-26">
     <title>Index of new symbols in 2.26</title>
     <xi:include href="xml/api-index-2.26.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-29" role="2.29">
+  <index id="api-index-2-29">
     <title>Index of new symbols in 2.29</title>
     <xi:include href="xml/api-index-2.29.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-30" role="2.30">
+  <index id="api-index-2-30">
     <title>Index of new symbols in 2.30</title>
     <xi:include href="xml/api-index-2.30.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-31" role="2.31">
+  <index id="api-index-2-31">
     <title>Index of new symbols in 2.31</title>
     <xi:include href="xml/api-index-2.31.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-32" role="2.32">
+  <index id="api-index-2-32">
     <title>Index of new symbols in 2.32</title>
     <xi:include href="xml/api-index-2.32.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-34" role="2.34">
+  <index id="api-index-2-34">
     <title>Index of new symbols in 2.34</title>
     <xi:include href="xml/api-index-2.34.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-35" role="2.35">
+  <index id="api-index-2-35">
     <title>Index of new symbols in 2.35</title>
     <xi:include href="xml/api-index-2.35.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-36" role="2.36">
+  <index id="api-index-2-36">
     <title>Index of new symbols in 2.36</title>
     <xi:include href="xml/api-index-2.36.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-37" role="2.37">
+  <index id="api-index-2-37">
     <title>Index of new symbols in 2.37</title>
     <xi:include href="xml/api-index-2.37.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-38" role="2.38">
+  <index id="api-index-2-38">
     <title>Index of new symbols in 2.38</title>
     <xi:include href="xml/api-index-2.38.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-40" role="2.40">
+  <index id="api-index-2-40">
     <title>Index of new symbols in 2.40</title>
     <xi:include href="xml/api-index-2.40.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-41" role="2.41">
+  <index id="api-index-2-41">
     <title>Index of new symbols in 2.41</title>
     <xi:include href="xml/api-index-2.41.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-42" role="2.42">
+  <index id="api-index-2-42">
     <title>Index of new symbols in 2.42</title>
     <xi:include href="xml/api-index-2.42.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-43" role="2.43">
+  <index id="api-index-2-43">
     <title>Index of new symbols in 2.43</title>
     <xi:include href="xml/api-index-2.43.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-44" role="2.44">
+  <index id="api-index-2-44">
     <title>Index of new symbols in 2.44</title>
     <xi:include href="xml/api-index-2.44.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-45" role="2.45">
+  <index id="api-index-2-45">
     <title>Index of new symbols in 2.45</title>
     <xi:include href="xml/api-index-2.45.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-46" role="2.46">
+  <index id="api-index-2-46">
     <title>Index of new symbols in 2.46</title>
     <xi:include href="xml/api-index-2.46.xml"><xi:fallback /></xi:include>
   </index>
-  <index id="api-index-2-47" role="2.47">
+  <index id="api-index-2-47">
     <title>Index of new symbols in 2.47</title>
     <xi:include href="xml/api-index-2.47.xml"><xi:fallback /></xi:include>
   </index>
+  <index id="api-index-2-48">
+    <title>Index of new symbols in 2.48</title>
+    <xi:include href="xml/api-index-2.48.xml"><xi:fallback /></xi:include>
+  </index>
+  <index id="api-index-2-49">
+    <title>Index of new symbols in 2.49</title>
+    <xi:include href="xml/api-index-2.49.xml"><xi:fallback /></xi:include>
+  </index>
   <!-- API INDICES END -->
 </book>
diff --git a/gwyddion.spec b/gwyddion.spec
index 3398686..3ad1668 100644
--- a/gwyddion.spec
+++ b/gwyddion.spec
@@ -1,14 +1,11 @@
-# @(#) $Id: gwyddion.spec.in 18763 2016-07-23 12:45:07Z yeti-dn $
-%{expand:%global distro_is_redhat %(test ! -f /etc/redhat-release; echo $?)}
-%{expand:%global distro_is_suse %(test ! -f /etc/SuSE-release; echo $?)}
-
+# @(#) $Id: gwyddion.spec.in 20201 2017-08-08 17:03:21Z yeti-dn $
 Name:          gwyddion
-Version:       2.47
-Release:       1
+Version:       2.49
+Release:       1%{?dist}
 Summary:       An SPM data visualization and analysis tool
 
 Group:         Applications/Engineering
-License:       GNU GPL
+License:       GPLv2+
 URL:           http://gwyddion.net/
 Source0:       http://gwyddion.net/download/%{version}/%{name}-%{version}.tar.xz
 BuildRoot:     %{_tmppath}/%{name}-%{version}-%{release}-root-%(id -un)
@@ -16,70 +13,64 @@ Requires(pre):    /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
 
 BuildRequires: gcc-c++
-BuildRequires: gtk2-devel >= 2.14
-BuildRequires: glib2-devel >= 2.14
-BuildRequires: pango-devel >= 1.10
-BuildRequires: cairo-devel >= 1.6
-BuildRequires: gtkglext-devel
-BuildRequires: libxml2-devel
+BuildRequires: pkgconfig(gtk+-2.0) >= 2.14
+BuildRequires: pkgconfig(glib-2.0) >= 2.14
+BuildRequires: pkgconfig(pango) >= 1.12
+BuildRequires: pkgconfig(cairo) >= 1.6
+BuildRequires: pkgconfig(fftw3) >= 3.1
+BuildRequires: pkgconfig(gtkglext-1.0)
+BuildRequires: pkgconfig(libxml-2.0)
 BuildRequires: zlib-devel
-BuildRequires: libwebp-devel
-BuildRequires: ruby >= 1.8
-%if %{distro_is_redhat}
-BuildRequires: rubypick
-%endif
+BuildRequires: pkgconfig(libwebp)
+BuildRequires: pkgconfig(OpenEXR)
+BuildRequires: pkgconfig(cfitsio)
+BuildRequires: pkgconfig(libpng)
+BuildRequires: pkgconfig(unique-1.0)
+BuildRequires: ruby(release) >= 1.8
 BuildRequires: gettext
 BuildRequires: desktop-file-utils >= 0.9
-BuildRequires: pkgconfig
 BuildRequires: findutils
+BuildRequires: pkgconfig(xmu)
+BuildRequires: pkgconfig(gtksourceview-2.0)
+BuildRequires: pkgconfig(minizip)
+BuildRequires: sed
 
-%if %{distro_is_redhat}
-BuildRequires: libXmu-devel
-BuildRequires: pygtk2-devel
-BuildRequires: gtksourceview2-devel
-# minizip would be nice to require everywhere but it does not seem available.
-BuildRequires: minizip-devel
-%define fftw3 fftw
-%define fftw3devel fftw-devel
-%define python2devel python2-devel
-%define configureopts %{nil}
+%if 0%{?suse_version}
+BuildRequires: pkg-config
+%else
+BuildRequires: pkgconfig
 %endif
 
-%if %{distro_is_suse}
-BuildRequires: xorg-x11-Mesa-devel
-BuildRequires: xorg-x11-libXmu-devel
-BuildRequires: python-gtk-devel
-BuildRequires: gtksourceview-devel
-BuildRequires: libzip-devel
-%define fftw3 fftw3
-%define fftw3devel fftw3-devel
-%define configureopts %{nil}
+BuildRequires: perl >= 5.005
+%if 0%{?rhl}
+BuildRequires: perl-podlators
 %endif
 
-# Default the fftw package name to the common name in the hope the distro
-# provides that.  The expansion inside %if is somehow limited, define the
-# test in two steps.
-%define fftwundefined %{?fftw3:0}%{!?fftw3:1}
-%if %{fftwundefined}
-%define fftw3 fftw
-%define fftw3devel fftw-devel
+# Obsolete?  Keep for now...
+%if 0%{?suse_version}
+%define gconf2 gconf2
+%else
+%define gconf2 GConf2
 %endif
+BuildRequires: %{gconf2}
 
-# Ditto for the python development package.
-%define python2undefined %{?python2devel:0}%{!?python2devel:1}
-%if %{python2undefined}
-%define python2devel python-devel
+%if 0%{?fedora} >= 26
+%define python2 python2
+%else
+%define python2 python
 %endif
+BuildRequires: %{python2}
+BuildRequires: %{python2}-devel >= 2.7
 
-%ifarch %ix86
-BuildRequires: %{fftw3devel} >= 3.0
-%else
-BuildRequires: %{fftw3devel} >= 3.1
+%if 0%{?rhl}
+BuildRequires: pygtk2-devel >= 2.10
 %endif
-BuildRequires: %{python2devel} >= 2.2
-# Fedora guarantees these two, other may not
-BuildRequires: perl >= 5.005
-BuildRequires: sed
+%if 0%{?suse_version}
+BuildRequires: python-gtk-devel >= 2.10
+%endif
+# otherwise...?
+
+%define configureopts %{nil}
 
 # The only packaged perl module is private, don't expose it.
 %define __perl_provides %{nil}
@@ -99,24 +90,21 @@ BuildRequires: sed
 %package devel
 Summary:       Headers, libraries and tools for Gwyddion module development
 Group:         Development/Libraries
-Requires:      %{name} = %{version}
+Requires:      %{name}%{?_isa} = %{version}
 # This pulls everything else
-Requires:      gtk2-devel >= 2.8
-Requires:      gtkglext-devel
-Requires:      %{fftw3devel}
-%if %{distro_is_redhat}
+Requires:      gtk2-devel%{?_isa} >= 2.8
+Requires:      gtkglext-devel%{?_isa}
 Requires:      perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version))
-Requires:      python-abi = %(%{__python} -c "import sys ; print sys.version[:3]")
-%endif
+Requires:      python-abi = 2.7
 
 
 %package thumbnailer-gconf
 Summary:         GConf schemas for gwyddion-thumbnailer integration
 Group:           System Environment/Libraries
 Requires:        %{name} = %{version}
-Requires(pre):   GConf2
-Requires(post):  GConf2
-Requires(preun): GConf2
+Requires(pre):   %{gconf2}
+Requires(post):  %{gconf2}
+Requires(preun): %{gconf2}
 
 
 %description
@@ -216,7 +204,7 @@ fi
 %{_bindir}/%{name}
 %{_bindir}/%{name}-thumbnailer
 %defattr(-,root,root)
-%doc AUTHORS COPYING INSTALL.%{name} NEWS README THANKS
+%doc AUTHORS COPYING NEWS README THANKS
 %{pkgdatadir}/pixmaps/*.png
 %{pkgdatadir}/pixmaps/*.ico
 %{pkgdatadir}/gradients/*
@@ -316,3 +304,7 @@ fi
 
 %files thumbnailer-gconf
 %{gconfdir}/*.schemas
+
+%changelog
+* Tue Aug  8 2017 Yeti <yeti at gwyddion.net> - 2.49-1
+- hello rpmlint, this package is partially generated
diff --git a/libdraw/Makefile.am b/libdraw/Makefile.am
index 642e145..4d106f7 100644
--- a/libdraw/Makefile.am
+++ b/libdraw/Makefile.am
@@ -1,4 +1,4 @@
-# @(#) $Id: Makefile.am 19258 2016-11-15 08:25:23Z yeti-dn $
+# @(#) $Id: Makefile.am 20269 2017-08-14 11:21:07Z yeti-dn $
 
 libgwyddion = $(top_builddir)/libgwyddion/libgwyddion2.la
 libgwyprocess = $(top_builddir)/libprocess/libgwyprocess2.la
@@ -59,7 +59,7 @@ AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"GwyDraw\"
 # Any iface change    C++: 0:   A
 # Adding ifaces       C:   R:   A++
 # Changing ifaces     C:   R:   0
-libversion = -version-info 5:0:5
+libversion = -version-info 6:0:6
 #libversion = -release @LIBRARY_RELEASE@
 libgwydraw2_la_LDFLAGS = @GTK_LIBS@ @BASIC_LIBS@ -export-dynamic $(no_undefined) $(export_symbols) $(libversion)
 libgwydraw2_la_LIBADD = $(libgwydraw_libadd)
diff --git a/libdraw/Makefile.in b/libdraw/Makefile.in
index 448ff01..387452c 100644
--- a/libdraw/Makefile.in
+++ b/libdraw/Makefile.in
@@ -14,10 +14,10 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 19258 2016-11-15 08:25:23Z yeti-dn $
+# @(#) $Id: Makefile.am 20269 2017-08-14 11:21:07Z yeti-dn $
 
 # Generic glib-mkenum rules.
-# @(#) $Id: mkenum.mk 11705 2011-01-03 08:32:55Z yeti-dn $
+# @(#) $Id: mkenum.mk 20080 2017-07-24 16:05:52Z yeti-dn $
 #
 # Parameters:
 # MKENUM_NAME -- output base name
@@ -273,10 +273,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -286,6 +283,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -310,7 +309,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -368,6 +369,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -376,17 +378,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -502,9 +500,6 @@ BUILT_SOURCES = $(am__append_2)
 MKENUM_NAME = gwydrawtypes
 MKENUM_ID = GWYDRAW_TYPES
 MKENUM_HFILES = $(srcdir)/gwydrawenums.h
-
-# TODO: Detect
-GLIB_MKENUMS = glib-mkenums
 mkenum_built_sources = $(MKENUM_NAME).h $(MKENUM_NAME).c
 @MAINTAINER_MODE_TRUE at mkenum_stamp_files = $(MKENUM_NAME).h.stamp
 @MAINTAINER_MODE_TRUE at mkenum_self = $(top_srcdir)/utils/mkenum.mk
@@ -528,7 +523,7 @@ AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"GwyDraw\"
 # Any iface change    C++: 0:   A
 # Adding ifaces       C:   R:   A++
 # Changing ifaces     C:   R:   0
-libversion = -version-info 5:0:5
+libversion = -version-info 6:0:6
 #libversion = -release @LIBRARY_RELEASE@
 libgwydraw2_la_LDFLAGS = @GTK_LIBS@ @BASIC_LIBS@ -export-dynamic $(no_undefined) $(export_symbols) $(libversion)
 libgwydraw2_la_LIBADD = $(libgwydraw_libadd)
diff --git a/libdraw/gwypixfield.c b/libdraw/gwypixfield.c
index 4d707a6..f1af4d1 100644
--- a/libdraw/gwypixfield.c
+++ b/libdraw/gwypixfield.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwypixfield.c 16667 2014-10-11 16:39:06Z yeti-dn $
+ *  @(#) $Id: gwypixfield.c 20070 2017-07-12 07:48:27Z yeti-dn $
  *  Copyright (C) 2003,2014 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -262,8 +262,7 @@ gwy_draw_data_field_map_adaptive(GwyDataField *data_field,
 static gint*
 calc_cdh(GwyDataField *dfield, gint *cdh_size)
 {
-    const gdouble *data;
-    gdouble q, min, max;
+    gdouble min, max;
     gint i, n, xres, yres;
     gint *cdh;
 
@@ -271,24 +270,14 @@ calc_cdh(GwyDataField *dfield, gint *cdh_size)
     yres = gwy_data_field_get_yres(dfield);
     gwy_data_field_get_min_max(dfield, &min, &max);
 
-    n = GWY_ROUND(pow(xres*yres, 2.0/3.0));
-    data = gwy_data_field_get_data_const(dfield);
-    q = (n - 1.0)/(max - min);
-    cdh = g_new(gint, n);
-
-    cdh[0] = 0;
-    for (i = 1; i < n; i++)
-        cdh[i] = xres*yres/(2*n);
-    for (i = 0; i < xres*yres; i++) {
-        gint h = (gint)((data[i] - min)*q + 1);
-        cdh[GWY_CLAMP(h, 0, n-1)]++;
-    }
+    n = *cdh_size = GWY_ROUND(pow(xres*yres, 2.0/3.0));
+    cdh = g_new(guint, n);
+    gwy_math_histogram(gwy_data_field_get_data_const(dfield), xres*yres,
+                       min, max, n, cdh);
     for (i = 1; i < n; i++)
-        cdh[i] += cdh[i-1];
+        cdh[i] += xres*yres/(2*n) + cdh[i-1];
     cdh[0] = 0;
 
-    *cdh_size = n;
-
     return cdh;
 }
 
@@ -310,19 +299,18 @@ gwy_pixbuf_draw_data_field_as_mask(GdkPixbuf *pixbuf,
                                    const GwyRGBA *color)
 {
     int xres, yres, i, j, rowstride;
-    guchar *pixels, *line;
+    guchar *pixels, *pixline;
     guint32 pixel;
-    const gdouble *row, *data;
-    gdouble cor;
+    const gdouble *drow, *data;
+    guchar a;
 
     g_return_if_fail(GDK_IS_PIXBUF(pixbuf));
     g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
     g_return_if_fail(color);
 
-    pixel = 0xff
-            | ((guint32)(guchar)floor(255.99999*color->b) << 8)
-            | ((guint32)(guchar)floor(255.99999*color->g) << 16)
-            | ((guint32)(guchar)floor(255.99999*color->r) << 24);
+    pixel = gwy_rgba_to_pixbuf_pixel(color);
+    a = (pixel & 0xff);
+    pixel |= 0xff;
     gdk_pixbuf_fill(pixbuf, pixel);
     if (!gdk_pixbuf_get_has_alpha(pixbuf))
         return;
@@ -336,18 +324,12 @@ gwy_pixbuf_draw_data_field_as_mask(GdkPixbuf *pixbuf,
 
     pixels = gdk_pixbuf_get_pixels(pixbuf);
     rowstride = gdk_pixbuf_get_rowstride(pixbuf);
-    cor = 255*color->a + 0.99999;
-    gwy_debug("cor = %g", cor);
 
     for (i = 0; i < yres; i++) {
-        line = pixels + i*rowstride + 3;
-        row = data + i*xres;
-        for (j = 0; j < xres; j++, row++) {
-            gdouble val = GWY_CLAMP(*row, 0.0, 1.0);
-
-            *line = (guchar)(cor*val);
-            line += 4;
-        }
+        pixline = pixels + i*rowstride + 3;
+        drow = data + i*xres;
+        for (j = xres; j; j--, drow++, pixline += 4)
+            *pixline = (*drow >= 0.5) ? a : 0;
     }
 }
 
diff --git a/libdraw/gwyrgba.c b/libdraw/gwyrgba.c
index 5862d88..f1a1f23 100644
--- a/libdraw/gwyrgba.c
+++ b/libdraw/gwyrgba.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: gwyrgba.c 19135 2016-10-30 14:53:30Z yeti-dn $
- *  Copyright (C) 2004-2016 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: gwyrgba.c 20069 2017-07-12 07:47:40Z yeti-dn $
+ *  Copyright (C) 2004-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -182,7 +182,7 @@ gwy_rgba_from_gdk_color_and_alpha(GwyRGBA *rgba,
  * @src1: Color at point @x = 0.0.
  * @src2: Color at point @x = 1.0.
  * @x: Point in interval 0..1 to take color from.
- * @rgba: A #GwyRGBA to store result to.
+ * @rgba: A #GwyRGBA to store the result to.
  *
  * Linearly interpolates two colors, including alpha blending.
  *
@@ -401,9 +401,9 @@ gwy_rgba_to_hex6(const GwyRGBA *rgba,
     g_return_if_fail(rgba);
     g_return_if_fail(hexout);
     g_snprintf(hexout, 7, "%02x%02x%02x",
-               float_to_gdk(rgba->r),
-               float_to_gdk(rgba->g),
-               float_to_gdk(rgba->b));
+               float_to_hex(rgba->r),
+               float_to_hex(rgba->g),
+               float_to_hex(rgba->b));
 }
 
 /**
@@ -427,12 +427,59 @@ gwy_rgba_to_hex8(const GwyRGBA *rgba,
     g_return_if_fail(rgba);
     g_return_if_fail(hexout);
     g_snprintf(hexout, 9, "%02x%02x%02x%02x",
-               float_to_gdk(rgba->a),
-               float_to_gdk(rgba->r),
-               float_to_gdk(rgba->g),
-               float_to_gdk(rgba->b));
+               float_to_hex(rgba->a),
+               float_to_hex(rgba->r),
+               float_to_hex(rgba->g),
+               float_to_hex(rgba->b));
 }
 
+/**
+ * gwy_rgba_to_pixbuf_pixel:
+ * @rgba: A RGBA color.
+ *
+ * Converts a RGBA color to pixbuf pixel.
+ *
+ * The returned pixel value includes opacity.  If @rgba is partially
+ * transparent, so is the pixel.
+ *
+ * Returns: The pixel value as a 32-bit integer.
+ *
+ * Since: 2.49
+ **/
+guint32
+gwy_rgba_to_pixbuf_pixel(const GwyRGBA *rgba)
+{
+    g_return_val_if_fail(rgba, 0);
+
+    return ((guint32)float_to_hex(rgba->a)
+            | (((guint32)float_to_hex(rgba->b)) << 8)
+            | (((guint32)float_to_hex(rgba->g)) << 16)
+            | (((guint32)float_to_hex(rgba->r)) << 24));
+}
+
+/**
+ * gwy_rgba_from_pixbuf_pixel:
+ * @rgba: A #GwyRGBA to store the result to.
+ * @pixel: Pixbuf pixel value as a 32-bit integer.
+ *
+ * Converts a pixbuf pixel value to a RGBA color.
+ *
+ * The conversion includes opacity.  If the opacity channel is undefined or
+ * should be ignored, you need to either set the lowest byte of @pixel to 0xff
+ * or fix @rgba afterwards.
+ *
+ * Since: 2.49
+ **/
+void
+gwy_rgba_from_pixbuf_pixel(GwyRGBA *rgba,
+                           guint32 pixel)
+{
+    g_return_if_fail(rgba);
+    rgba->a = (pixel & 0xffu)/255.0;
+    rgba->b = ((pixel >> 8) & 0xffu)/255.0;
+    rgba->g = ((pixel >> 16) & 0xffu)/255.0;
+    rgba->r = ((pixel >> 24) & 0xffu)/255.0;
+}
 
 /************************** Documentation ****************************/
 
diff --git a/libdraw/gwyrgba.h b/libdraw/gwyrgba.h
index 8b57272..20e0966 100644
--- a/libdraw/gwyrgba.h
+++ b/libdraw/gwyrgba.h
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: gwyrgba.h 19135 2016-10-30 14:53:30Z yeti-dn $
- *  Copyright (C) 2004-2016 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: gwyrgba.h 20069 2017-07-12 07:47:40Z yeti-dn $
+ *  Copyright (C) 2004-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -71,6 +71,9 @@ void     gwy_rgba_to_hex6                 (const GwyRGBA *rgba,
                                            gchar *hexout);
 void     gwy_rgba_to_hex8                 (const GwyRGBA *rgba,
                                            gchar *hexout);
+guint32  gwy_rgba_to_pixbuf_pixel         (const GwyRGBA *rgba);
+void     gwy_rgba_from_pixbuf_pixel       (GwyRGBA *rgba,
+                                           guint32 pixel);
 
 G_END_DECLS
 
diff --git a/libgwyddion/Makefile.am b/libgwyddion/Makefile.am
index b243f4b..210368f 100644
--- a/libgwyddion/Makefile.am
+++ b/libgwyddion/Makefile.am
@@ -1,4 +1,4 @@
-# @(#) $Id: Makefile.am 19258 2016-11-15 08:25:23Z yeti-dn $
+# @(#) $Id: Makefile.am 20269 2017-08-14 11:21:07Z yeti-dn $
 
 libgwyddion2includedir = $(pkgincludedir)/libgwyddion
 
@@ -78,7 +78,7 @@ AM_CPPFLAGS = \
 # Any iface change    C++: 0:   A
 # Adding ifaces       C:   R:   A++
 # Changing ifaces     C:   R:   0
-libversion = -version-info 22:0:22
+libversion = -version-info 23:0:23
 #libversion = -release @LIBRARY_RELEASE@
 libgwyddion2_la_LDFLAGS = @BASIC_LIBS@ -export-dynamic $(no_undefined) $(export_symbols) $(libversion)
 libgwyddion2_la_SOURCES = \
diff --git a/libgwyddion/Makefile.in b/libgwyddion/Makefile.in
index 2a13eaf..3fcedb2 100644
--- a/libgwyddion/Makefile.in
+++ b/libgwyddion/Makefile.in
@@ -14,10 +14,10 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 19258 2016-11-15 08:25:23Z yeti-dn $
+# @(#) $Id: Makefile.am 20269 2017-08-14 11:21:07Z yeti-dn $
 
 # Generic glib-mkenum rules.
-# @(#) $Id: mkenum.mk 11705 2011-01-03 08:32:55Z yeti-dn $
+# @(#) $Id: mkenum.mk 20080 2017-07-24 16:05:52Z yeti-dn $
 #
 # Parameters:
 # MKENUM_NAME -- output base name
@@ -276,10 +276,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -289,6 +286,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -313,7 +312,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -371,6 +372,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -379,17 +381,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -522,9 +520,6 @@ MKENUM_HFILES = \
 	$(srcdir)/gwyutils.h \
 	$(srcdir)/gwyexpr.h
 
-
-# TODO: Detect
-GLIB_MKENUMS = glib-mkenums
 mkenum_built_sources = $(MKENUM_NAME).h $(MKENUM_NAME).c
 @MAINTAINER_MODE_TRUE at mkenum_stamp_files = $(MKENUM_NAME).h.stamp
 @MAINTAINER_MODE_TRUE at mkenum_self = $(top_srcdir)/utils/mkenum.mk
@@ -553,7 +548,7 @@ AM_CPPFLAGS = \
 # Any iface change    C++: 0:   A
 # Adding ifaces       C:   R:   A++
 # Changing ifaces     C:   R:   0
-libversion = -version-info 22:0:22
+libversion = -version-info 23:0:23
 #libversion = -release @LIBRARY_RELEASE@
 libgwyddion2_la_LDFLAGS = @BASIC_LIBS@ -export-dynamic $(no_undefined) $(export_symbols) $(libversion)
 libgwyddion2_la_SOURCES = \
diff --git a/libgwyddion/gwycontainer.c b/libgwyddion/gwycontainer.c
index a73d336..a380664 100644
--- a/libgwyddion/gwycontainer.c
+++ b/libgwyddion/gwycontainer.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwycontainer.c 18117 2016-01-19 10:15:26Z yeti-dn $
+ *  @(#) $Id: gwycontainer.c 19324 2016-11-28 22:24:36Z yeti-dn $
  *  Copyright (C) 2003,2004,2014 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -66,62 +66,63 @@ typedef struct {
     gint i;
 } SerializeData;
 
-static void     gwy_container_serializable_init  (GwySerializableIface *iface);
-static void     value_destroy_func               (gpointer data);
-static void     gwy_container_finalize           (GObject *object);
-static GValue*  gwy_container_get_value_of_type  (GwyContainer *container,
-                                                  GQuark key,
-                                                  GType type);
-static GValue*  gwy_container_gis_value_of_type  (GwyContainer *container,
-                                                  GQuark key,
-                                                  GType type);
-static gboolean gwy_container_try_set_one        (GwyContainer *container,
-                                                  GQuark key,
-                                                  GValue *value);
-static void     gwy_container_try_setv           (GwyContainer *container,
-                                                  gsize nvalues,
-                                                  GwyKeyVal *values);
-static void     gwy_container_try_set_valist     (GwyContainer *container,
-                                                  va_list ap);
-static void     gwy_container_set_by_name_valist (GwyContainer *container,
-                                                  va_list ap);
-static GByteArray* gwy_container_serialize       (GObject *object,
-                                                  GByteArray *buffer);
-static gsize    gwy_container_get_size           (GObject *object);
-static void     hash_serialize_func              (gpointer hkey,
-                                                  gpointer hvalue,
-                                                  gpointer hdata);
-static GObject* gwy_container_deserialize        (const guchar *buffer,
-                                                  gsize size,
-                                                  gsize *position);
-static gboolean hash_remove_prefix_func          (gpointer hkey,
-                                                  gpointer hvalue,
-                                                  gpointer hdata);
-static void     hash_foreach_func                (gpointer hkey,
-                                                  gpointer hvalue,
-                                                  gpointer hdata);
-static void     keys_foreach_func                (gpointer hkey,
-                                                  gpointer hvalue,
-                                                  gpointer hdata);
-static void     keys_by_name_foreach_func        (gpointer hkey,
-                                                  gpointer hvalue,
-                                                  gpointer hdata);
-static GObject* gwy_container_duplicate_real     (GObject *object);
-static void     gwy_container_clone_real         (GObject *source,
-                                                  GObject *copy);
-static gboolean hash_remove_all_func             (void);
-static void     hash_duplicate_func              (gpointer hkey,
-                                                  gpointer hvalue,
-                                                  gpointer hdata);
-static GwyContainer*
-              gwy_container_duplicate_by_prefix_valist(GwyContainer *container,
-                                                       va_list ap);
-static void     hash_prefix_duplicate_func       (gpointer hkey,
-                                                  gpointer hvalue,
-                                                  gpointer hdata);
-static void     hash_find_keys_func              (gpointer hkey,
-                                                  gpointer hvalue,
-                                                  gpointer hdata);
+static void          gwy_container_serializable_init (GwySerializableIface *iface);
+static void          value_destroy_func              (gpointer data);
+static void          gwy_container_finalize          (GObject *object);
+static GValue*       gwy_container_get_value_of_type (GwyContainer *container,
+                                                      GQuark key,
+                                                      GType type);
+static GValue*       gwy_container_gis_value_of_type (GwyContainer *container,
+                                                      GQuark key,
+                                                      GType type);
+static gboolean      gwy_container_try_set_one       (GwyContainer *container,
+                                                      GQuark key,
+                                                      GValue *value);
+static void          gwy_container_try_setv          (GwyContainer *container,
+                                                      gsize nvalues,
+                                                      GwyKeyVal *values);
+static void          gwy_container_try_set_valist    (GwyContainer *container,
+                                                      va_list ap);
+static void          gwy_container_set_by_name_valist(GwyContainer *container,
+                                                      va_list ap);
+static GByteArray*   gwy_container_serialize         (GObject *object,
+                                                      GByteArray *buffer);
+static gsize         gwy_container_get_size          (GObject *object);
+static void          hash_serialize_func             (gpointer hkey,
+                                                      gpointer hvalue,
+                                                      gpointer hdata);
+static GObject*      gwy_container_deserialize       (const guchar *buffer,
+                                                      gsize size,
+                                                      gsize *position);
+static gboolean      hash_remove_prefix_func         (gpointer hkey,
+                                                      gpointer hvalue,
+                                                      gpointer hdata);
+static void          hash_foreach_func               (gpointer hkey,
+                                                      gpointer hvalue,
+                                                      gpointer hdata);
+static void          keys_foreach_func               (gpointer hkey,
+                                                      gpointer hvalue,
+                                                      gpointer hdata);
+static void          keys_by_name_foreach_func       (gpointer hkey,
+                                                      gpointer hvalue,
+                                                      gpointer hdata);
+static GObject*      gwy_container_duplicate_real    (GObject *object);
+static void          gwy_container_clone_real        (GObject *source,
+                                                      GObject *copy);
+static gboolean      hash_remove_all_func            (void);
+static void          hash_duplicate_func             (gpointer hkey,
+                                                      gpointer hvalue,
+                                                      gpointer hdata);
+static GwyContainer* duplicate_by_prefix_valist      (GwyContainer *container,
+                                                      va_list ap);
+static GwyContainer* duplicate_by_prefix_do          (GwyContainer *container,
+                                                      PrefixListData *pfxlist);
+static void          hash_prefix_duplicate_func      (gpointer hkey,
+                                                      gpointer hvalue,
+                                                      gpointer hdata);
+static void          hash_find_keys_func             (gpointer hkey,
+                                                      gpointer hvalue,
+                                                      gpointer hdata);
 
 static int      pstring_compare_callback         (const void *p,
                                                   const void *q);
@@ -2107,8 +2108,7 @@ hash_duplicate_func(gpointer hkey, gpointer hvalue, gpointer hdata)
  * Returns: A newly created container.
  **/
 GwyContainer*
-gwy_container_duplicate_by_prefix(GwyContainer *container,
-                                  ...)
+gwy_container_duplicate_by_prefix(GwyContainer *container, ...)
 {
     GwyContainer *duplicate;
     va_list ap;
@@ -2116,15 +2116,42 @@ gwy_container_duplicate_by_prefix(GwyContainer *container,
     g_return_val_if_fail(GWY_IS_CONTAINER(container), NULL);
 
     va_start(ap, container);
-    duplicate = gwy_container_duplicate_by_prefix_valist(container, ap);
+    duplicate = duplicate_by_prefix_valist(container, ap);
     va_end(ap);
 
     return duplicate;
 }
 
+/**
+ * gwy_container_duplicate_by_prefixv:
+ * @container: A container.
+ * @n: Number of prefixes.
+ * @prefixes: List of prefixes.
+ *
+ * Duplicates a container keeping only values under given prefixes.
+ *
+ * Like gwy_container_duplicate(), this method creates a deep copy, that is
+ * contained object are physically duplicated too, not just referenced again.
+ *
+ * Returns: A newly created container.
+ *
+ * Since: 2.48
+ **/
+GwyContainer*
+gwy_container_duplicate_by_prefixv(GwyContainer *container,
+                                   guint n,
+                                   const gchar **prefixes)
+{
+    PrefixListData pfxlist;
+
+    g_return_val_if_fail(GWY_IS_CONTAINER(container), NULL);
+    pfxlist.nprefixes = n;
+    pfxlist.prefixes = prefixes;
+    return duplicate_by_prefix_do(container, &pfxlist);
+}
+
 static GwyContainer*
-gwy_container_duplicate_by_prefix_valist(GwyContainer *container,
-                                         va_list ap)
+duplicate_by_prefix_valist(GwyContainer *container, va_list ap)
 {
     GwyContainer *duplicate;
     PrefixListData pfxlist;
@@ -2144,26 +2171,38 @@ gwy_container_duplicate_by_prefix_valist(GwyContainer *container,
         pfxlist.nprefixes++;
         prefix = va_arg(ap, const gchar*);
     }
-    pfxlist.pfxlengths = g_new(gsize, n);
-    pfxlist.pfxclosed = g_new(gboolean, n);
-    for (n = 0; n < pfxlist.nprefixes; n++) {
-        pfxlist.pfxlengths[n] = strlen(pfxlist.prefixes[n]);
-        pfxlist.pfxclosed[n] = !pfxlist.pfxlengths[n]
-                               || pfxlist.prefixes[n][pfxlist.pfxlengths[n] - 1]
-                                  == GWY_CONTAINER_PATHSEP;
+
+    duplicate = duplicate_by_prefix_do(container, &pfxlist);
+    g_free(pfxlist.prefixes);
+    return duplicate;
+}
+
+static GwyContainer*
+duplicate_by_prefix_do(GwyContainer *container, PrefixListData *pfxlist)
+{
+    GwyContainer *duplicate;
+    gsize n;
+
+    pfxlist->pfxlengths = g_new(gsize, pfxlist->nprefixes);
+    pfxlist->pfxclosed = g_new(gboolean, pfxlist->nprefixes);
+    for (n = 0; n < pfxlist->nprefixes; n++) {
+        const gchar *prefix = pfxlist->prefixes[n];
+        gsize len;
+        len = pfxlist->pfxlengths[n] = strlen(prefix);
+        pfxlist->pfxclosed[n] = !len || (prefix[len - 1]
+                                         == GWY_CONTAINER_PATHSEP);
     }
 
     /* don't emit signals when no one can be connected */
     duplicate = (GwyContainer*)gwy_container_new();
     duplicate->in_construction = TRUE;
-    pfxlist.container = duplicate;
+    pfxlist->container = duplicate;
     g_hash_table_foreach(container->values,
-                         hash_prefix_duplicate_func, &pfxlist);
+                         hash_prefix_duplicate_func, pfxlist);
     duplicate->in_construction = FALSE;
 
-    g_free(pfxlist.prefixes);
-    g_free(pfxlist.pfxclosed);
-    g_free(pfxlist.pfxlengths);
+    g_free(pfxlist->pfxclosed);
+    g_free(pfxlist->pfxlengths);
 
     return duplicate;
 }
diff --git a/libgwyddion/gwycontainer.h b/libgwyddion/gwycontainer.h
index 1e82e0f..af81da1 100644
--- a/libgwyddion/gwycontainer.h
+++ b/libgwyddion/gwycontainer.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwycontainer.h 18117 2016-01-19 10:15:26Z yeti-dn $
+ *  @(#) $Id: gwycontainer.h 19818 2017-05-31 11:41:43Z yeti-dn $
  *  Copyright (C) 2003,2004,2014 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -78,13 +78,16 @@ gboolean      gwy_container_gis_value             (GwyContainer *container,
 void          gwy_container_set_value             (GwyContainer *container,
                                                    ...);
 void          gwy_container_set_value_by_name     (GwyContainer *container,
-                                                   ...);
+                                                   ...) G_GNUC_NULL_TERMINATED;
 gboolean      gwy_container_remove                (GwyContainer *container,
                                                    GQuark key);
 guint         gwy_container_remove_by_prefix      (GwyContainer *container,
                                                    const gchar *prefix);
 GwyContainer* gwy_container_duplicate_by_prefix   (GwyContainer *container,
                                                    ...);
+GwyContainer* gwy_container_duplicate_by_prefixv  (GwyContainer *container,
+                                                   guint n,
+                                                   const gchar **prefixes);
 gint          gwy_container_transfer              (GwyContainer *source,
                                                    GwyContainer *dest,
                                                    const gchar *source_prefix,
diff --git a/libgwyddion/gwyddiontypes.c b/libgwyddion/gwyddiontypes.c
index a2c3c04..17024cd 100644
--- a/libgwyddion/gwyddiontypes.c
+++ b/libgwyddion/gwyddiontypes.c
@@ -40,6 +40,34 @@ gwy_nl_fit_param_flags_get_type(void)
     return etype;
 }
 
+#include "./gwyexpr.h"
+
+GType
+gwy_expr_error_get_type(void)
+{
+    static GType etype = 0;
+
+    if (etype == 0) {
+        static const GEnumValue values[] = {
+            { GWY_EXPR_ERROR_CLOSING_PARENTHESIS, "GWY_EXPR_ERROR_CLOSING_PARENTHESIS", "closing-parenthesis" },
+            { GWY_EXPR_ERROR_EMPTY, "GWY_EXPR_ERROR_EMPTY", "empty" },
+            { GWY_EXPR_ERROR_EMPTY_PARENTHESES, "GWY_EXPR_ERROR_EMPTY_PARENTHESES", "empty-parentheses" },
+            { GWY_EXPR_ERROR_GARBAGE, "GWY_EXPR_ERROR_GARBAGE", "garbage" },
+            { GWY_EXPR_ERROR_INVALID_ARGUMENT, "GWY_EXPR_ERROR_INVALID_ARGUMENT", "invalid-argument" },
+            { GWY_EXPR_ERROR_INVALID_TOKEN, "GWY_EXPR_ERROR_INVALID_TOKEN", "invalid-token" },
+            { GWY_EXPR_ERROR_MISSING_ARGUMENT, "GWY_EXPR_ERROR_MISSING_ARGUMENT", "missing-argument" },
+            { GWY_EXPR_ERROR_NOT_EXECUTABLE, "GWY_EXPR_ERROR_NOT_EXECUTABLE", "not-executable" },
+            { GWY_EXPR_ERROR_OPENING_PARENTHESIS, "GWY_EXPR_ERROR_OPENING_PARENTHESIS", "opening-parenthesis" },
+            { GWY_EXPR_ERROR_STRAY_COMMA, "GWY_EXPR_ERROR_STRAY_COMMA", "stray-comma" },
+            { GWY_EXPR_ERROR_UNRESOLVED_IDENTIFIERS, "GWY_EXPR_ERROR_UNRESOLVED_IDENTIFIERS", "unresolved-identifiers" },
+            { GWY_EXPR_ERROR_CONSTANT_NAME, "GWY_EXPR_ERROR_CONSTANT_NAME", "constant-name" },
+            { 0, NULL, NULL }
+        };
+        etype = g_enum_register_static("GwyExprError", values);
+    }
+    return etype;
+}
+
 #include "./gwyutils.h"
 
 GType
@@ -85,34 +113,6 @@ gwy_byte_order_get_type(void)
     return etype;
 }
 
-#include "./gwyexpr.h"
-
-GType
-gwy_expr_error_get_type(void)
-{
-    static GType etype = 0;
-
-    if (etype == 0) {
-        static const GEnumValue values[] = {
-            { GWY_EXPR_ERROR_CLOSING_PARENTHESIS, "GWY_EXPR_ERROR_CLOSING_PARENTHESIS", "closing-parenthesis" },
-            { GWY_EXPR_ERROR_EMPTY, "GWY_EXPR_ERROR_EMPTY", "empty" },
-            { GWY_EXPR_ERROR_EMPTY_PARENTHESES, "GWY_EXPR_ERROR_EMPTY_PARENTHESES", "empty-parentheses" },
-            { GWY_EXPR_ERROR_GARBAGE, "GWY_EXPR_ERROR_GARBAGE", "garbage" },
-            { GWY_EXPR_ERROR_INVALID_ARGUMENT, "GWY_EXPR_ERROR_INVALID_ARGUMENT", "invalid-argument" },
-            { GWY_EXPR_ERROR_INVALID_TOKEN, "GWY_EXPR_ERROR_INVALID_TOKEN", "invalid-token" },
-            { GWY_EXPR_ERROR_MISSING_ARGUMENT, "GWY_EXPR_ERROR_MISSING_ARGUMENT", "missing-argument" },
-            { GWY_EXPR_ERROR_NOT_EXECUTABLE, "GWY_EXPR_ERROR_NOT_EXECUTABLE", "not-executable" },
-            { GWY_EXPR_ERROR_OPENING_PARENTHESIS, "GWY_EXPR_ERROR_OPENING_PARENTHESIS", "opening-parenthesis" },
-            { GWY_EXPR_ERROR_STRAY_COMMA, "GWY_EXPR_ERROR_STRAY_COMMA", "stray-comma" },
-            { GWY_EXPR_ERROR_UNRESOLVED_IDENTIFIERS, "GWY_EXPR_ERROR_UNRESOLVED_IDENTIFIERS", "unresolved-identifiers" },
-            { GWY_EXPR_ERROR_CONSTANT_NAME, "GWY_EXPR_ERROR_CONSTANT_NAME", "constant-name" },
-            { 0, NULL, NULL }
-        };
-        etype = g_enum_register_static("GwyExprError", values);
-    }
-    return etype;
-}
-
 
 /* Generated data ends here */
 
diff --git a/libgwyddion/gwyddiontypes.h b/libgwyddion/gwyddiontypes.h
index 518867e..f27339e 100644
--- a/libgwyddion/gwyddiontypes.h
+++ b/libgwyddion/gwyddiontypes.h
@@ -14,15 +14,15 @@ GType gwy_si_unit_format_style_get_type(void) G_GNUC_CONST;
 GType gwy_nl_fit_param_flags_get_type(void) G_GNUC_CONST;
 #define GWY_TYPE_NL_FIT_PARAM_FLAGS (gwy_nl_fit_param_flags_get_type())
 
+GType gwy_expr_error_get_type(void) G_GNUC_CONST;
+#define GWY_TYPE_EXPR_ERROR (gwy_expr_error_get_type())
+
 GType gwy_raw_data_type_get_type(void) G_GNUC_CONST;
 #define GWY_TYPE_RAW_DATA_TYPE (gwy_raw_data_type_get_type())
 
 GType gwy_byte_order_get_type(void) G_GNUC_CONST;
 #define GWY_TYPE_BYTE_ORDER (gwy_byte_order_get_type())
 
-GType gwy_expr_error_get_type(void) G_GNUC_CONST;
-#define GWY_TYPE_EXPR_ERROR (gwy_expr_error_get_type())
-
 G_END_DECLS
 
 #endif /* __GWYDDION_TYPES_H__ */
diff --git a/libgwyddion/gwyenum.h b/libgwyddion/gwyenum.h
index fe1d9ce..ea052f9 100644
--- a/libgwyddion/gwyenum.h
+++ b/libgwyddion/gwyenum.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwyenum.h 15790 2013-12-26 12:10:09Z yeti-dn $
+ *  @(#) $Id: gwyenum.h 19818 2017-05-31 11:41:43Z yeti-dn $
  *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -43,7 +43,7 @@ const gchar*  gwy_enum_to_string     (gint enumval,
                                       const GwyEnum *enum_table,
                                       gint n);
 gchar*        gwy_enuml_to_string    (gint enumval,
-                                      ...);
+                                      ...) G_GNUC_NULL_TERMINATED;
 gint          gwy_string_to_flags    (const gchar *str,
                                       const GwyEnum *enum_table,
                                       gint n,
diff --git a/libgwyddion/gwymath.c b/libgwyddion/gwymath.c
index 32c6425..2f69c5c 100644
--- a/libgwyddion/gwymath.c
+++ b/libgwyddion/gwymath.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwymath.c 19134 2016-10-30 14:53:05Z yeti-dn $
+ *  @(#) $Id: gwymath.c 20264 2017-08-13 11:01:18Z yeti-dn $
  *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -977,7 +977,41 @@ gwy_math_curvature(const gdouble *coeffs,
 }
 
 /**
- * gwy_math_refine_maximum:
+ * gwy_math_refine_maximum_1d:
+ * @y: Array of length 3, containing the neighbourhood values with the maximum
+ *     in the centre.
+ * @x: Location to store the refined @x-coordinate.
+ *
+ * Performs subpixel refinement of parabolic a one-dimensional maximum.
+ *
+ * The central value corresponds to x-coordinate 0, distances between values
+ * are unity.  The refinement is based by fitting a parabola through the
+ * maximum.  If it fails or the calculated maximum lies farther than the
+ * surrounding values the function sets the refined maximum to the origin and
+ * returns %FALSE.
+ *
+ * Returns: %TRUE if the refinement succeeded, %FALSE if it failed.  The value
+ *          of @x is usable regardless of the return value.
+ *
+ * Since: 2.49
+ **/
+gboolean
+gwy_math_refine_maximum_1d(const gdouble *y, gdouble *x)
+{
+    gdouble b, D;
+
+    *x = 0.0;
+    D = y[2] + y[0] - 2.0*y[1];
+    b = 0.5*(y[0] - y[2]);
+    if (fabs(D) < fabs(b))
+        return FALSE;
+
+    *x = b/D;
+    return TRUE;
+}
+
+/**
+ * gwy_math_refine_maximum_2d:
  * @z: Array of length 9, containing the square 3x3 neighbourhood values in
  *     matrix order and with the maximum in the centre.
  * @x: Location to store the refined @x-coordinate.
@@ -994,11 +1028,11 @@ gwy_math_curvature(const gdouble *coeffs,
  * Returns: %TRUE if the refinement succeeded, %FALSE if it failed.  The values
  *          of @x and @y are usable regardless of the return value.
  *
- * Since: 2.42
+ * Since: 2.49
  **/
 gboolean
-gwy_math_refine_maximum(const gdouble *z,
-                        gdouble *x, gdouble *y)
+gwy_math_refine_maximum_2d(const gdouble *z,
+                           gdouble *x, gdouble *y)
 {
     gdouble sz, szx, szy, szxx, szxy, szyy;
     gdouble bx, by, cxx, cxy, cyy, D, sx, sy;
@@ -1041,7 +1075,7 @@ gwy_math_refine_maximum(const gdouble *z,
 
     /* Don't trust the sub-pixel refinement if it moves the maximum too far
      * from the centre. */
-    if (fabs(sx) > 1.0 || fabs(sy) > 1.0)
+    if (sx*sx + sy*sy > 2.0)
         return FALSE;
 
     *x = sx;
@@ -1050,6 +1084,250 @@ gwy_math_refine_maximum(const gdouble *z,
 }
 
 /**
+ * gwy_math_refine_maximum:
+ * @z: Array of length 9, containing the square 3x3 neighbourhood values in
+ *     matrix order and with the maximum in the centre.
+ * @x: Location to store the refined @x-coordinate.
+ * @y: Location to store the refined @y-coordinate.
+ *
+ * Performs subpixel refinement of parabolic a two-dimensional maximum.
+ *
+ * An alias for gwy_math_refine_maximum_2d().
+ *
+ * Returns: %TRUE if the refinement succeeded, %FALSE if it failed.  The values
+ *          of @x and @y are usable regardless of the return value.
+ *
+ * Since: 2.42
+ **/
+gboolean
+gwy_math_refine_maximum(const gdouble *z, gdouble *x, gdouble *y)
+{
+    return gwy_math_refine_maximum_2d(z, x, y);
+}
+
+static guint
+estimate_regular_res(gdouble *pos, gint n, gdouble *minpos, gdouble *maxpos)
+{
+    gdouble maxstep = 0.0;
+    guint k, res;
+
+    gwy_math_sort(n, pos);
+    *minpos = pos[0];
+    *maxpos = pos[n-1];
+    gwy_debug("range [%g,%g]", *minpos, *maxpos);
+    if (maxpos <= minpos)
+        return 0;
+
+    for (k = 1; k < n; k++) {
+        if (pos[k] - pos[k-1] > maxstep)
+            maxstep = pos[k] - pos[k-1];
+    }
+    gwy_debug("maxstep %g", maxstep);
+    res = (gint)ceil((*maxpos - *minpos)/maxstep) + 1;
+    gwy_debug("estimated res %d", res);
+
+    if (n % res != 0)
+        return 0;
+
+    return res;
+}
+
+/**
+ * gwy_check_regular_2d_grid:
+ * @coords: Array of @n coordinate pairs in plane.  You can also typecast
+ *          #GwyXY or #GwyXYZ to doubles.
+ * @stride: Actual number of double values in one block.  It must be at least
+ *          2 if @coords contains just alternating @x and @y.  If you pass an
+ *          typecast #GwyXYZ array give stride as 3, etc.
+ * @n: Number of items in @coords.
+ * @tolerance: Relative distance from pixel center which is still considered
+ *             OK.  Pass a negative value for some reasonable default.
+ *             The maximum meaningful value is 0.5, beyond that the point would
+ *             end up in a different pixel.
+ * @xres: Location where to store the number of columns.
+ * @yres: Location where to store the number of rows.
+ * @xymin: Location where to store the minimum coordinates (top left corner).
+ * @xystep: Location where to store the pixel size.
+ *
+ * Detects if points in plane form a regular rectangular grid oriented along
+ * the Cartesian axes.
+ *
+ * Points lying in one straight line are not considered to form a rectangle.
+ *
+ * When the function fails, i.e. the points do not form a regular grid, the
+ * values of output arguments are undefined.
+ *
+ * Returns: On success, a newly allocated array mapping grid indices
+ *          (@i*@xres+ at j) to indices in @coords.  %NULL is returned on failure.
+ *
+ * Since: 2.48
+ **/
+guint*
+gwy_check_regular_2d_grid(const gdouble *coords, guint stride, guint n,
+                          gdouble tolerance,
+                          guint *pxres, guint *pyres,
+                          GwyXY *xymin, GwyXY *xystep)
+{
+    gdouble xmin, xmax, ymin, ymax, dx, dy;
+    gint xres, yres;
+    guint k;
+    gdouble *pos;
+    guint *map;
+    gboolean *encountered;
+
+    g_return_val_if_fail(stride >= 2, NULL);
+    g_return_val_if_fail(coords || !n, NULL);
+    g_return_val_if_fail(pxres && pyres && xymin && xystep, NULL);
+
+    if (n < 4)
+        return NULL;
+
+    if (tolerance < 0.0)
+        tolerance = 0.05;
+
+    pos = g_new(gdouble, n);
+    gwy_debug("estimating yres from rows");
+    for (k = 0; k < n; k++)
+        pos[k] = coords[k*stride + 1];
+    yres = estimate_regular_res(pos, n, &ymin, &ymax);
+
+    gwy_debug("estimating xres from columns");
+    for (k = 0; k < n; k++)
+        pos[k] = coords[k*stride];
+    xres = estimate_regular_res(pos, n, &xmin, &xmax);
+
+    g_free(pos);
+
+    if (yres) {
+        xres = n/yres;
+        gwy_debug("from rows xres %u, yres %u", xres, yres);
+    }
+    else if (xres) {
+        yres = n/xres;
+        gwy_debug("from columns xres %u, yres %u", xres, yres);
+    }
+    else
+        return NULL;
+
+    dx = (xmax - xmin)/(xres - 1);
+    dy = (ymax - ymin)/(yres - 1);
+    xmin -= 0.5*dx;
+    xmax += 0.5*dx;
+    ymin -= 0.5*dy;
+    ymax += 0.5*dy;
+
+    map = g_new(guint, n);
+    encountered = g_new0(gboolean, n);
+    for (k = 0; k < n; k++) {
+        gdouble y = (coords[k*stride + 1] - ymin)/dy;
+        gdouble x = (coords[k*stride + 0] - xmin)/dx;
+        gint i = (gint)floor(y);
+        gint j = (gint)floor(x);
+
+        if (i < 0 || i >= yres || j < 0 || j >= xres) {
+            g_critical("Points not inside estimated region?!");
+            goto fail;
+        }
+        if (fabs(x - j - 0.5) > tolerance || fabs(y - i - 0.5) > tolerance) {
+            gwy_debug("(%g,%g) too far from (%g,%g)", x, y, j+0.5, i+0.5);
+            goto fail;
+        }
+        if (encountered[i*xres + j])
+            goto fail;
+
+        encountered[i*xres + j] = TRUE;
+        map[i*xres + j] = k;
+    }
+
+    g_free(encountered);
+    xymin->x = xmin;
+    xymin->y = ymin;
+    xystep->x = dx;
+    xystep->y = dy;
+    *pxres = xres;
+    *pyres = yres;
+    return map;
+
+fail:
+    g_free(map);
+    g_free(encountered);
+    return NULL;
+}
+
+/**
+ * gwy_math_histogram:
+ * @values: Values to make histogram from.
+ * @n: Number of values in @values.
+ * @min: Minimum value to consider (left edge of histogram).
+ * @max: Maximum value to consider (right edge of histogram).
+ * @nbins: Number of histogram bins (number of @counts items), a positive
+ *         number.
+ * @counts: Array where to store the counts.
+ *
+ * Counts the numbers of values falling into equal-sized bins.
+ *
+ * The value of @min must not be larger than @max.  The values may lie outside
+ * [@min, at max].  They are not counted in the histogram, nor the returned total.
+ *
+ * Rounding rules for values exactly at the edge of two bins are arbitrary
+ * and must not be relied upon.
+ *
+ * Returns: The number of values inside the entire histogram, i.e. at most @n
+ *          but possibly a reduced count.
+ *
+ * Since: 2.49
+ **/
+guint
+gwy_math_histogram(const gdouble *values,
+                   guint n,
+                   gdouble min,
+                   gdouble max,
+                   guint nbins,
+                   guint *counts)
+{
+    guint i, total = 0;
+    gint nb;
+    gdouble d;
+
+    g_return_val_if_fail(nbins > 0, 0);
+    g_return_val_if_fail(counts, 0);
+    g_return_val_if_fail(values || !n, 0);
+    g_return_val_if_fail(min <= max, 0);
+
+    gwy_clear(counts, nbins);
+    d = max - min;
+    if (G_UNLIKELY(!(d > 0.0))) {
+        for (i = 0; i < n; i++) {
+            if (values[i] == min)
+                counts[0]++;
+        }
+        return counts[0];
+    }
+
+    d = nbins/d;
+    nb = nbins;
+    for (i = 0; i < n; i++) {
+        gdouble v = values[i];
+        gint bi;
+
+        if (v < min || v > max)
+            continue;
+
+        bi = (gint)floor((v - min)*d);
+        if (G_LIKELY(bi >= 0 && bi < nb)) {
+            counts[bi]++;
+            total++;
+        }
+        else if (v == max) {
+            counts[nbins-1]++;
+            total++;
+        }
+    }
+
+    return total;
+}
+
+/**
  * gwy_xlnx_int:
  * @x: Value to calculate @x*log(@x) of.
  *
@@ -1402,8 +1680,6 @@ gwy_math_median_uncertainty(gsize n, gdouble *array, gdouble *uarray)
     }
 }
 
-
-
 /************************** Documentation ****************************/
 
 /**
diff --git a/libgwyddion/gwymath.h b/libgwyddion/gwymath.h
index 36a1085..dc05f4d 100644
--- a/libgwyddion/gwymath.h
+++ b/libgwyddion/gwymath.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwymath.h 19134 2016-10-30 14:53:05Z yeti-dn $
+ *  @(#) $Id: gwymath.h 19750 2017-05-16 09:35:02Z yeti-dn $
  *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -123,9 +123,22 @@ guint    gwy_math_curvature            (const gdouble *coeffs,
                                         gdouble *xc,
                                         gdouble *yc,
                                         gdouble *zc);
+gboolean gwy_math_refine_maximum_1d    (const gdouble *y,
+                                        gdouble *x);
+gboolean gwy_math_refine_maximum_2d    (const gdouble *z,
+                                        gdouble *x,
+                                        gdouble *y);
 gboolean gwy_math_refine_maximum       (const gdouble *z,
                                         gdouble *x,
                                         gdouble *y);
+guint*   gwy_check_regular_2d_grid     (const gdouble *coords,
+                                        guint stride,
+                                        guint n,
+                                        gdouble tolerance,
+                                        guint *xres,
+                                        guint *yres,
+                                        GwyXY *xymin,
+                                        GwyXY *xystep)          G_GNUC_MALLOC;
 gdouble  gwy_math_median               (gsize n,
                                         gdouble *array);
 void     gwy_math_sort                 (gsize n,
@@ -134,6 +147,12 @@ gdouble  gwy_math_median_uncertainty   (gsize n,
                                         gdouble *array,
                                         gdouble *uarray);
 gdouble  gwy_xlnx_int                  (guint x)                G_GNUC_CONST;
+guint    gwy_math_histogram            (const gdouble *values,
+                                        guint n,
+                                        gdouble min,
+                                        gdouble max,
+                                        guint nbins,
+                                        guint *counts);
 
 G_END_DECLS
 
diff --git a/libgwyddion/gwymathfallback.h b/libgwyddion/gwymathfallback.h
index 0f01690..6e2d95a 100644
--- a/libgwyddion/gwymathfallback.h
+++ b/libgwyddion/gwymathfallback.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwymathfallback.h 18915 2016-09-04 20:37:09Z yeti-dn $
+ *  @(#) $Id: gwymathfallback.h 20151 2017-08-03 08:47:10Z yeti-dn $
  *  Copyright (C) 2007-2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -130,13 +130,19 @@ gwy_math_fallback_isnan(double x)
 
 #endif /* GWY_MATH_NAMESPACE_CLEAN */
 
-#ifdef GWY_HAVE_ISINF
+/* GCC's fast math makes isinf no-op.  Must use the fallback function.
+ * Gwyddion works with finite arithmetic, but we need to detect INFs upon
+ * file import and remove it. */
+#if (defined(GWY_HAVE_ISINF) && !defined(__FAST_MATH__))
 #define gwy_isinf isinf
 #else
 #define gwy_isinf gwy_math_fallback_isinf
 #endif  /* GWY_HAVE_ISINF */
 
-#ifdef GWY_HAVE_ISNAN
+/* GCC's fast math makes isnan no-op.  Must use the fallback function.
+ * Gwyddion works with finite arithmetic, but we need to detect NaNs upon
+ * file import and remove it. */
+#if (defined(GWY_HAVE_ISNAN) && !defined(__FAST_MATH__))
 #define gwy_isnan isnan
 #else
 #define gwy_isnan gwy_math_fallback_isnan
diff --git a/libgwyddion/gwynlfit.c b/libgwyddion/gwynlfit.c
index a3acf29..bbb4c98 100644
--- a/libgwyddion/gwynlfit.c
+++ b/libgwyddion/gwynlfit.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwynlfit.c 19150 2016-10-31 21:34:48Z yeti-dn $
+ *  @(#) $Id: gwynlfit.c 19529 2017-03-16 22:17:27Z yeti-dn $
  *  Copyright (C) 2000-2003 Martin Siler.
  *  Copyright (C) 2004-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
@@ -703,7 +703,7 @@ gwy_math_nlfit_fit_real(GwyNLFitter *nlfit,
                 for (j = 0; j < i; j++) {
                     gint jid = var_param_id[j];
 
-                    if (iid == G_MAXDOUBLE || jid == G_MAXDOUBLE)
+                    if (iid < 0 || jid < 0)
                         SLi(nlfit->covar, i, j) = 0.0;
                     else
                         SLi(nlfit->covar, i, j) = SLi(save_a, iid, jid);
@@ -1063,7 +1063,8 @@ gwy_math_nlfit_succeeded(GwyNLFitter *nlfit)
  *
  * Returns the standard deviation of parameter number @par.
  *
- * This function makes sense only after a successful fit.
+ * This function makes sense only after a successful fit and for a free
+ * parameter.
  *
  * Returns: The SD of @par-th parameter.
  **/
@@ -1331,7 +1332,9 @@ free_private_data(GwyNLFitter *fitter)
  * @i: Data index from the set {0, 1, 2, ..., ndata-1}.
  * @param: Parameters.
  * @fixed_param: Which parameters should be treated as fixed (corresponding
- *               entries are set to %TRUE).
+ *               entries are set to %TRUE).  It may be %NULL is no parameters
+ *               are fixed.  The function must set derivatives by fixed
+ *               parameters to zero.
  * @func: The fitted function.
  * @user_data: User data as passed to gwy_math_nlfit_fit().
  * @der: Array where the @nparam partial derivatives by each parameter are
diff --git a/libgwyddion/gwynlfitpreset.c b/libgwyddion/gwynlfitpreset.c
index 776b443..878b465 100644
--- a/libgwyddion/gwynlfitpreset.c
+++ b/libgwyddion/gwynlfitpreset.c
@@ -1,7 +1,7 @@
 /*
- *  @(#) $Id: gwynlfitpreset.c 19146 2016-10-31 16:29:54Z yeti-dn $
+ *  @(#) $Id: gwynlfitpreset.c 20262 2017-08-12 10:49:32Z yeti-dn $
  *  Copyright (C) 2000-2003 Martin Siler.
- *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
+ *  Copyright (C) 2004-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -33,6 +33,34 @@ gwy_nlfit_preset_new_static(const GwyNLFitPresetBuiltin *data);
 
 G_DEFINE_TYPE(GwyNLFitPreset, gwy_nlfit_preset, GWY_TYPE_RESOURCE)
 
+G_GNUC_UNUSED
+static gdouble
+_gwy_gamma(gdouble x)
+{
+    static const gdouble p[] = {
+        676.5203681218851,
+        -1259.1392167224028,
+        771.32342877765313,
+        -176.61502916214059,
+        12.507343278686905,
+        -0.13857109526572012,
+        9.9843695780195716e-6,
+        1.5056327351493116e-7
+    };
+    gdouble xi = 0.99999999999980993, t;
+    guint i;
+
+    if (x < 0.5)
+        return G_PI/(sin(G_PI*x)*_gwy_gamma(1.0 - x));
+
+    x -= 1.0;
+    for (i = 0; i < G_N_ELEMENTS(p); i++)
+        xi += p[i]/(x + i + 1);
+
+    t = x + G_N_ELEMENTS(p) - 0.5;
+    return sqrt(2.0*G_PI) * pow(t, x + 0.5) * exp(-t) * xi;
+}
+
 /*********************** gaussian *****************************/
 static gdouble
 gauss_func(gdouble x,
@@ -759,6 +787,52 @@ exp_rpsdf_guess(gint n_dat,
     *fres = TRUE;
 }
 
+/******************** K-correlated PSDF ***************************/
+
+/* XXX: σ² = s² β(1/2, (C-1)/2)
+ * But we cannot normalise to σ² because C and σ are terribly correlated. */
+static gdouble
+kcorr_psdf_func(gdouble x,
+                G_GNUC_UNUSED gint n_param,
+                const gdouble *b,
+                G_GNUC_UNUSED gpointer user_data,
+                gboolean *fres)
+{
+    gdouble s = b[0], T = b[1], C = b[2], t;
+
+    if (T == 0.0 || C <= 0.0) {
+        *fres = FALSE;
+        return 0.0;
+    }
+    *fres = TRUE;
+    t = T*x;
+    return T*s*s/pow(1.0 + t*t, 0.5*(C + 1.0));
+}
+
+static void
+kcorr_psdf_guess(gint n_dat,
+                 const gdouble *x,
+                 const gdouble *y,
+                 gdouble *param,
+                 gboolean *fres)
+{
+    exp_psdf_guess(n_dat, x, y, param, fres);
+    /* Usually C is around 1.  We probably cannot guess it better... */
+    param[2] = 0.2;
+}
+
+static GwySIUnit*
+kcorr_psdf_get_units(GwyNLFitPreset *preset,
+                     guint param,
+                     GwySIUnit *siunit_x,
+                     GwySIUnit *siunit_y)
+{
+    if (param == 2)
+        return gwy_si_unit_new(NULL);
+
+    return psdf_get_units(preset, param, siunit_x, siunit_y);
+}
+
 /**************   polynomial 0th order ********************************/
 static gdouble
 poly_0_func(G_GNUC_UNUSED gdouble x,
@@ -1078,13 +1152,14 @@ smstep_guess(gint n_dat,
         param[3] = (yleft/nleft < yright/nright) ? ymax - ymin : ymin - ymax;
     else
         param[3] = (xymax > xymin) ? ymax - ymin : ymin - ymax;
-    param[4] = 0.0;
-    param[5] = 0.0;
+    /* Using zero here prevents L-M from making progress. */
+    param[4] = 0.05*param[3]/(xmax - xmin);
+    param[5] = param[4]/(xmax - xmin);
 
     *fres = TRUE;
 }
 
-/******************* bent step ********************************/
+/******************* erf bent step ********************************/
 static gdouble
 bentstep_func(gdouble x,
               G_GNUC_UNUSED gint n_param,
@@ -1109,6 +1184,31 @@ bentstep_func(gdouble x,
     return f;
 }
 
+/******************* tanh bent step ********************************/
+static gdouble
+boltzmannstep_func(gdouble x,
+                   G_GNUC_UNUSED gint n_param,
+                   const gdouble *b,
+                   G_GNUC_UNUSED gpointer user_data,
+                   gboolean *fres)
+{
+    gdouble xc = b[0], yc = b[1], w = b[2], h = b[3], alpha = b[4], beta = b[5];
+    gdouble f;
+
+    *fres = TRUE;
+
+    *fres = TRUE;
+    x -= xc;
+    w = fabs(w);
+    f = yc + alpha*x + beta*x*x;
+    if (w == 0.0)
+        f += (x > 0.0) ? 0.5*h : -0.5*h;
+    else
+        f += h*tanh(x/w)/2.0;
+
+    return f;
+}
+
 /******************* power function ********************************/
 static gdouble
 power_func(gdouble x,
@@ -1377,6 +1477,13 @@ static const GwyNLFitParam gauss2_four_params[] = {
    { "T<sub>2</sub>", 1, 0, },
 };
 
+/* XXX: s power is fractional, attempted to fix case-by-case */
+static const GwyNLFitParam kcorr_psdf_params[] = {
+   { "s", 0, 0, },
+   { "T", 1, 0, },
+   { "C", 0, 0, },
+};
+
 static const GwyNLFitParam poly3_params[] = {
    { "a",  0, 1, },
    { "b", -1, 1, },
@@ -1501,7 +1608,7 @@ static const GwyNLFitPresetBuiltin fitting_presets[] = {
         NULL,
         &gauss_rpsdf_guess,
         &psdf_get_units,
-        &weights_linear_decrease,
+        NULL,
         G_N_ELEMENTS(gauss_two_params),
         gauss_two_params,
     },
@@ -1580,11 +1687,25 @@ static const GwyNLFitPresetBuiltin fitting_presets[] = {
         NULL,
         &exp_rpsdf_guess,
         &psdf_get_units,
-        &weights_linear_decrease,
+        NULL,
         G_N_ELEMENTS(gauss_two_params),
         gauss_two_params,
     },
     {
+        N_("K-correlated (PSDF)"),
+        "<i>f</i>(<i>x</i>) "
+            "= s<sup>2</sup><i>T</i>"
+            "/[1 + <i>x</i><sup>2</sup><i>T</i><sup>2</sup>]"
+            "<sup><i>C</i>/2</sup>",
+        &kcorr_psdf_func,
+        NULL,
+        &kcorr_psdf_guess,
+        &kcorr_psdf_get_units,
+        NULL,
+        G_N_ELEMENTS(kcorr_psdf_params),
+        kcorr_psdf_params,
+    },
+    {
         N_("Polynomial (order 0)"),
         "<i>f</i>(<i>x</i>) = <i>a</i>",
         &poly_0_func,
@@ -1697,6 +1818,22 @@ static const GwyNLFitPresetBuiltin fitting_presets[] = {
         bentstep_params,
     },
     {
+        N_("Boltzmann bent step"),
+        "<i>f</i>(<i>x</i>) "
+            "= y<sub>0</sub> "
+            "+ <i>h</i>/2 tanh(<i>ξ</i>/<i>w</i>) "
+            "+ <i>α</i><i>ξ</i> "
+            "+ <i>β</i><i>ξ</i><sup>2</sup>, "
+            "<i>ξ</i> = <i>x</i> − <i>x</i><sub>0</sub>",
+        &boltzmannstep_func,
+        NULL,
+        &smstep_guess,
+        NULL,
+        NULL,
+        G_N_ELEMENTS(bentstep_params),
+        bentstep_params,
+    },
+    {
         N_("Power"),
         "<i>f</i>(<i>x</i>) "
             "= <i>a</i> + <i>b</i><i>x</i><sup><i>c</i></sup>",
@@ -2096,6 +2233,16 @@ gwy_nlfit_presets(void)
  * <member><literal>"Smooth slanted step"</literal></member>
  * </simplelist>
  *
+ * The following presets are available since version 2.48:
+ * <simplelist type='vert'>
+ * <member><literal>"K-correlated (PSDF)"</literal></member>
+ * </simplelist>
+ *
+ * The following presets are available since version 2.49:
+ * <simplelist type='vert'>
+ * <member><literal>"Boltzmann bent step"</literal></member>
+ * </simplelist>
+ *
  * The result of the fitting is stored in a normal #GwyNLFitter, therefore the
  * typical use is:
  *
diff --git a/libgwyddion/gwysiunit.c b/libgwyddion/gwysiunit.c
index 3d89ae4..86c7861 100644
--- a/libgwyddion/gwysiunit.c
+++ b/libgwyddion/gwysiunit.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwysiunit.c 19216 2016-11-09 10:39:06Z yeti-dn $
+ *  @(#) $Id: gwysiunit.c 20108 2017-07-29 13:00:31Z yeti-dn $
  *  Copyright (C) 2004-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -563,7 +563,7 @@ gwy_si_unit_get_format(GwySIUnit *siunit,
 
 /**
  * gwy_si_unit_get_format_with_resolution:
- * @siunit: A SI unit.
+ * @siunit: An SI unit.
  * @style: Unit format style.
  * @maximum: The maximum value to be represented.
  * @resolution: The smallest step (approximately) that should make a visible
@@ -614,7 +614,7 @@ gwy_si_unit_get_format_with_resolution(GwySIUnit *siunit,
 
 /**
  * gwy_si_unit_get_format_with_digits:
- * @siunit: A SI unit.
+ * @siunit: An SI unit.
  * @style: Unit format style.
  * @maximum: The maximum value to be represented.
  * @sdigits: The number of significant digits the value should have.
@@ -665,12 +665,12 @@ gwy_si_unit_get_format_with_digits(GwySIUnit *siunit,
 
 /**
  * gwy_si_unit_equal:
- * @siunit1: First unit.
+ * @siunit: First unit.
  * @siunit2: Second unit.
  *
  * Checks whether two SI units are equal.
  *
- * Returns: %TRUE if units are equal.
+ * Returns: %TRUE if the units are equal.
  **/
 gboolean
 gwy_si_unit_equal(GwySIUnit *siunit1, GwySIUnit *siunit2)
@@ -705,6 +705,47 @@ gwy_si_unit_equal(GwySIUnit *siunit1, GwySIUnit *siunit2)
     return TRUE;
 }
 
+/**
+ * gwy_si_unit_equal_string:
+ * @siunit: An SI unit.
+ * @unit_string: Unit string (it can be %NULL for an empty unit).
+ *
+ * Checks whether an SI unit corresponds to given string.
+ *
+ * Any power-of-ten prefixes are ignored.  This function is mostly useful for
+ * quick comparison with simple units such as "m" and for checking whether a
+ * unit is non-empty (by comparing with %NULL or an empty string).
+ *
+ * Returns: %TRUE if the units is equivalent to the given string.
+ *
+ * Since: 2.49
+ **/
+gboolean
+gwy_si_unit_equal_string(GwySIUnit *siunit,
+                         const gchar *unit_string)
+{
+    GwySIUnit *tmpunit;
+    gboolean retval;
+
+    g_return_val_if_fail(GWY_IS_SI_UNIT(siunit), FALSE);
+
+    if (!unit_string || !*unit_string)
+        return !siunit->units->len;
+
+    if (siunit->units->len == 1) {
+        GwySimpleUnit *unit = &g_array_index(siunit->units, GwySimpleUnit, 0);
+        if (gwy_strequal(g_quark_to_string(unit->unit), unit_string))
+            return TRUE;
+        /* If they differ we cannot make any conclusion. */
+    }
+
+    tmpunit = gwy_si_unit_new_parse(unit_string, NULL);
+    retval = gwy_si_unit_equal(siunit, tmpunit);
+    g_object_unref(tmpunit);
+
+    return retval;
+}
+
 /* fix all kinds of sloppy and strange notations */
 static void
 fix_unit_name(GString *str)
diff --git a/libgwyddion/gwysiunit.h b/libgwyddion/gwysiunit.h
index 5cafeb1..16bbd93 100644
--- a/libgwyddion/gwysiunit.h
+++ b/libgwyddion/gwysiunit.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwysiunit.h 19201 2016-11-07 21:07:07Z yeti-dn $
+ *  @(#) $Id: gwysiunit.h 20108 2017-07-29 13:00:31Z yeti-dn $
  *  Copyright (C) 2004-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -92,8 +92,10 @@ GwySIUnit*        gwy_si_unit_power_multiply       (GwySIUnit *siunit1,
                                                     GwySIUnit *siunit2,
                                                     gint power2,
                                                     GwySIUnit *result);
-gboolean          gwy_si_unit_equal                (GwySIUnit *siunit1,
+gboolean          gwy_si_unit_equal                (GwySIUnit *siunit,
                                                     GwySIUnit *siunit2);
+gboolean          gwy_si_unit_equal_string         (GwySIUnit *siunit,
+                                                    const gchar *unit_string);
 
 GwySIValueFormat* gwy_si_unit_get_format           (GwySIUnit *siunit,
                                                     GwySIUnitFormatStyle style,
diff --git a/libgwyddion/gwyutils.c b/libgwyddion/gwyutils.c
index abe1751..0daf476 100644
--- a/libgwyddion/gwyutils.c
+++ b/libgwyddion/gwyutils.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwyutils.c 19216 2016-11-09 10:39:06Z yeti-dn $
+ *  @(#) $Id: gwyutils.c 19821 2017-05-31 15:21:55Z yeti-dn $
  *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -1840,6 +1840,128 @@ gwy_object_set_or_reset(gpointer object,
     g_object_thaw_notify(object);
 }
 
+/**
+ * gwy_set_member_object:
+ * @instance: An object instance.
+ * @member_object: Another object to be owned by @instanced, or %NULL.
+ * @expected_type: The type of @member_object.  It is checked and a critical
+ *                 message is emitted if it does not conform.
+ * @member_field: Pointer to location storing the current member object to
+ *                be replaced by @member_object.
+ * @...: List of quadruplets of the form signal name, #GCallback callback,
+ *       #gulong pointer to location to hold the signal handler id, and
+ *       #GConnectFlags connection flags.
+ *
+ * Replaces a member object of another object, handling signal connection and
+ * disconnection.
+ *
+ * If @member_object is not %NULL a reference is taken, sinking any floating
+ * objects (and conversely, the reference to the previous member object is
+ * released).
+ *
+ * The purpose is to simplify bookkeeping in classes that have settable
+ * member objects and (usually but not necessarily) need to connect to some
+ * signals of these member objects.  Since this function both connects and
+ * disconnects signals it must be always called with the same set of signals,
+ * including callbacks and flags, for a specific member object.
+ *
+ * Example for a <type>GwyFoo</type> class owning a #GwyGradient member object,
+ * assuming the usual conventions:
+ * |[
+ * typedef struct _GwyFooPrivate GwyFooPrivate;
+ *
+ * struct _GwyFooPrivate {
+ *     GwyGradient *gradient;
+ *     gulong gradient_data_changed_id;
+ * };
+ *
+ * static gboolean
+ * set_gradient(GwyFoo *foo)
+ * {
+ *     GwyFooPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE(foo, GWY_TYPE_FOO,
+ *                                                       GwyFooPrivate);
+ *     if (!gwy_set_member_object(foo, gradient, GWY_TYPE_GRADIENT,
+ *                                &priv->gradient,
+ *                                "data-changed", &foo_gradient_data_changed,
+ *                                &priv->gradient_data_changed_id,
+ *                                G_CONNECT_SWAPPED,
+ *                                NULL))
+ *         return FALSE;
+ *
+ *     // Do whatever else needs to be done if the gradient changes.
+ *     return TRUE;
+ * }
+ * ]|
+ * The gradient setter then usually only calls
+ * <function>set_gradient()</function> and disposing of the member object again
+ * only calls <function>set_gradient()</function> but with %NULL gradient.
+ *
+ * Returns: %TRUE if @member_field was changed.  %FALSE means the new
+ *          member is identical to the current one and the function reduced to
+ *          no-op (or that an assertion faled).
+ *
+ * Since: 2.49
+ **/
+gboolean
+gwy_set_member_object(gpointer instance,
+                      gpointer member_object,
+                      GType expected_type,
+                      gpointer member_field,
+                      ...)
+{
+    gpointer *pmember = (gpointer*)member_field;
+    gpointer old_member = *pmember;
+    const gchar *signal_name;
+
+    if (old_member == member_object)
+        return FALSE;
+
+    g_return_val_if_fail(!member_object
+                         || G_TYPE_CHECK_INSTANCE_TYPE(member_object,
+                                                       expected_type),
+                         FALSE);
+
+    if (member_object)
+        g_object_ref_sink(member_object);
+
+    if (old_member) {
+        va_list ap;
+        va_start(ap, member_field);
+        for (signal_name = va_arg(ap, const gchar*);
+             signal_name;
+             signal_name = va_arg(ap, const gchar*)) {
+            G_GNUC_UNUSED GCallback handler = va_arg(ap, GCallback);
+            gulong *handler_id = va_arg(ap, gulong*);
+            G_GNUC_UNUSED GConnectFlags flags = va_arg(ap, GConnectFlags);
+            g_signal_handler_disconnect(old_member, *handler_id);
+            *handler_id = 0;
+        }
+        va_end(ap);
+    }
+
+    *pmember = member_object;
+
+    if (member_object) {
+        va_list ap;
+        va_start(ap, member_field);
+        for (signal_name = va_arg(ap, const gchar*);
+             signal_name;
+             signal_name = va_arg(ap, const gchar*)) {
+            GCallback handler = va_arg(ap, GCallback);
+            gulong *handler_id = va_arg(ap, gulong*);
+            GConnectFlags flags = va_arg(ap, GConnectFlags);
+            *handler_id = g_signal_connect_data(member_object, signal_name,
+                                                handler, instance, NULL,
+                                                flags);
+        }
+        va_end(ap);
+    }
+
+    if (old_member)
+        g_object_unref(old_member);
+
+    return TRUE;
+}
 
 /**
  * gwy_fopen:
diff --git a/libgwyddion/gwyutils.h b/libgwyddion/gwyutils.h
index 7b2effc..a806570 100644
--- a/libgwyddion/gwyutils.h
+++ b/libgwyddion/gwyutils.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwyutils.h 18799 2016-08-01 07:15:50Z yeti-dn $
+ *  @(#) $Id: gwyutils.h 19821 2017-05-31 15:21:55Z yeti-dn $
  *  Copyright (C) 2003-2011 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -72,7 +72,7 @@ gboolean     gwy_ascii_strcase_equal   (gconstpointer v1,
                                         gconstpointer v2);
 guint        gwy_ascii_strcase_hash    (gconstpointer v);
 guint        gwy_stramong              (const gchar *str,
-                                        ...);
+                                        ...)                        G_GNUC_NULL_TERMINATED;
 gpointer     gwy_memmem                (gconstpointer haystack,
                                         gsize haystack_len,
                                         gconstpointer needle,
@@ -112,7 +112,12 @@ void         gwy_convert_raw_data      (gconstpointer data,
 guint        gwy_raw_data_size         (GwyRawDataType datatype);
 void         gwy_object_set_or_reset   (gpointer object,
                                         GType type,
-                                        ...);
+                                        ...)                        G_GNUC_NULL_TERMINATED;
+gboolean     gwy_set_member_object     (gpointer instance,
+                                        gpointer member_object,
+                                        GType expected_type,
+                                        gpointer member_field,
+                                        ...)                        G_GNUC_NULL_TERMINATED;
 #ifdef G_OS_WIN32
 FILE*        gwy_fopen                 (const gchar *filename, 
                                         const gchar *mode);
diff --git a/libgwyddion/gwyversion.h b/libgwyddion/gwyversion.h
index a731f56..2f84ed9 100644
--- a/libgwyddion/gwyversion.h
+++ b/libgwyddion/gwyversion.h
@@ -27,8 +27,8 @@
 G_BEGIN_DECLS
 
 #define GWY_VERSION_MAJOR 2
-#define GWY_VERSION_MINOR 47
-#define GWY_VERSION_STRING "2.47"
+#define GWY_VERSION_MINOR 49
+#define GWY_VERSION_STRING "2.49"
 
 gint gwy_version_major(void);
 gint gwy_version_minor(void);
diff --git a/libgwydgets/Makefile.am b/libgwydgets/Makefile.am
index 4bd8389..038b2c8 100644
--- a/libgwydgets/Makefile.am
+++ b/libgwydgets/Makefile.am
@@ -1,4 +1,4 @@
-# @(#) $Id: Makefile.am 19063 2016-10-12 20:44:52Z yeti-dn $
+# @(#) $Id: Makefile.am 20269 2017-08-14 11:21:07Z yeti-dn $
 
 libgwyddion = $(top_builddir)/libgwyddion/libgwyddion2.la
 libgwyprocess = $(top_builddir)/libprocess/libgwyprocess2.la
@@ -18,6 +18,7 @@ libgwydgets2include_HEADERS = \
 	gwy3dsetup.h \
 	gwy3dview.h \
 	gwy3dwindow.h \
+	gwyadjustbar.h \
 	gwyaxis.h \
 	gwycoloraxis.h \
 	gwycolorbutton.h \
@@ -91,6 +92,7 @@ MKENUM_NAME = gwydgettypes
 MKENUM_ID = GWYDGET_TYPES
 MKENUM_HFILES = \
 		$(srcdir)/gwydgetenums.h \
+		$(srcdir)/gwyadjustbar.h \
 		$(srcdir)/gwygrainvaluemenu.h
 include $(top_srcdir)/utils/mkenum.mk
 
@@ -114,7 +116,7 @@ AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Gwydgets\"
 # Any iface change    C++: 0:   A
 # Adding ifaces       C:   R:   A++
 # Changing ifaces     C:   R:   0
-libversion = -version-info 23:0:23
+libversion = -version-info 25:0:25
 #libversion = -release @LIBRARY_RELEASE@
 libgwydgets2_la_LDFLAGS = @GTKGLEXT_LIBS@ @BASIC_LIBS@ -export-dynamic $(no_undefined) $(export_symbols) $(libversion)
 libgwydgets2_la_LIBADD = $(libgwydgets_libadd)
@@ -124,6 +126,7 @@ libgwydgets2_la_SOURCES = \
 	gwy3dsetup.c \
 	gwy3dview.c \
 	gwy3dwindow.c \
+	gwyadjustbar.c \
 	gwyaxis.c \
 	gwyaxisdialog.c \
 	gwycoloraxis.c \
diff --git a/libgwydgets/Makefile.in b/libgwydgets/Makefile.in
index aa7cfae..ea4eec6 100644
--- a/libgwydgets/Makefile.in
+++ b/libgwydgets/Makefile.in
@@ -14,10 +14,10 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 19063 2016-10-12 20:44:52Z yeti-dn $
+# @(#) $Id: Makefile.am 20269 2017-08-14 11:21:07Z yeti-dn $
 
 # Generic glib-mkenum rules.
-# @(#) $Id: mkenum.mk 11705 2011-01-03 08:32:55Z yeti-dn $
+# @(#) $Id: mkenum.mk 20080 2017-07-24 16:05:52Z yeti-dn $
 #
 # Parameters:
 # MKENUM_NAME -- output base name
@@ -31,7 +31,7 @@
 # MAINTAINERCLEANFILES
 
 # Generic glib-genmarshal rules.
-# @(#) $Id: genmarshal.mk 11705 2011-01-03 08:32:55Z yeti-dn $
+# @(#) $Id: genmarshal.mk 20080 2017-07-24 16:05:52Z yeti-dn $
 #
 # Parameters:
 # GENMARSHAL_NAME -- output base name
@@ -176,15 +176,15 @@ am__installdirs = "$(DESTDIR)$(libdir)" \
 	"$(DESTDIR)$(libgwydgets2includedir)"
 LTLIBRARIES = $(lib_LTLIBRARIES)
 am_libgwydgets2_la_OBJECTS = gwy3dlabel.lo gwy3dsetup.lo gwy3dview.lo \
-	gwy3dwindow.lo gwyaxis.lo gwyaxisdialog.lo gwycoloraxis.lo \
-	gwycolorbutton.lo gwycombobox.lo gwycurve.lo gwydataview.lo \
-	gwydataviewlayer.lo gwydatawindow.lo gwydgetenums.lo \
-	gwydgetmarshals.lo gwydgets.lo gwydgettypes.lo gwydgetutils.lo \
-	gwygrainvaluemenu.lo gwygraph.lo gwygrapharea.lo \
-	gwygraphareadialog.lo gwygraphbasics.lo gwygraphcorner.lo \
-	gwygraphcurvemodel.lo gwygraphcurves.lo gwygraphdata.lo \
-	gwygraphexport.lo gwygraphlabel.lo gwygraphlabeldialog.lo \
-	gwygraphmodel.lo gwygraphwindow.lo \
+	gwy3dwindow.lo gwyadjustbar.lo gwyaxis.lo gwyaxisdialog.lo \
+	gwycoloraxis.lo gwycolorbutton.lo gwycombobox.lo gwycurve.lo \
+	gwydataview.lo gwydataviewlayer.lo gwydatawindow.lo \
+	gwydgetenums.lo gwydgetmarshals.lo gwydgets.lo gwydgettypes.lo \
+	gwydgetutils.lo gwygrainvaluemenu.lo gwygraph.lo \
+	gwygrapharea.lo gwygraphareadialog.lo gwygraphbasics.lo \
+	gwygraphcorner.lo gwygraphcurvemodel.lo gwygraphcurves.lo \
+	gwygraphdata.lo gwygraphexport.lo gwygraphlabel.lo \
+	gwygraphlabeldialog.lo gwygraphmodel.lo gwygraphwindow.lo \
 	gwygraphwindowmeasuredialog.lo gwyhmarkerbox.lo gwyhruler.lo \
 	gwyinventorystore.lo gwylayer-basic.lo gwylayer-mask.lo \
 	gwymarkerbox.lo gwynullstore.lo gwyoptionmenus.lo \
@@ -306,10 +306,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -319,6 +316,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -343,7 +342,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -401,6 +402,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -409,17 +411,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -518,6 +516,7 @@ libgwydgets2include_HEADERS = \
 	gwy3dsetup.h \
 	gwy3dview.h \
 	gwy3dwindow.h \
+	gwyadjustbar.h \
 	gwyaxis.h \
 	gwycoloraxis.h \
 	gwycolorbutton.h \
@@ -590,11 +589,9 @@ MKENUM_NAME = gwydgettypes
 MKENUM_ID = GWYDGET_TYPES
 MKENUM_HFILES = \
 		$(srcdir)/gwydgetenums.h \
+		$(srcdir)/gwyadjustbar.h \
 		$(srcdir)/gwygrainvaluemenu.h
 
-
-# TODO: Detect
-GLIB_MKENUMS = glib-mkenums
 mkenum_built_sources = $(MKENUM_NAME).h $(MKENUM_NAME).c
 @MAINTAINER_MODE_TRUE at mkenum_stamp_files = $(MKENUM_NAME).h.stamp
 @MAINTAINER_MODE_TRUE at mkenum_self = $(top_srcdir)/utils/mkenum.mk
@@ -609,9 +606,6 @@ mkenum_built_sources = $(MKENUM_NAME).h $(MKENUM_NAME).c
 
 GENMARSHAL_NAME = gwydgetmarshals
 GENMARSHAL_PREFIX = _gwydget_marshal
-
-# TODO: Detect
-GLIB_GENMARSHAL = glib-genmarshal
 genmarshal_built_sources = \
 	$(GENMARSHAL_NAME).h \
 	$(GENMARSHAL_NAME).c
@@ -626,7 +620,7 @@ AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Gwydgets\"
 # Any iface change    C++: 0:   A
 # Adding ifaces       C:   R:   A++
 # Changing ifaces     C:   R:   0
-libversion = -version-info 23:0:23
+libversion = -version-info 25:0:25
 #libversion = -release @LIBRARY_RELEASE@
 libgwydgets2_la_LDFLAGS = @GTKGLEXT_LIBS@ @BASIC_LIBS@ -export-dynamic $(no_undefined) $(export_symbols) $(libversion)
 libgwydgets2_la_LIBADD = $(libgwydgets_libadd)
@@ -635,6 +629,7 @@ libgwydgets2_la_SOURCES = \
 	gwy3dsetup.c \
 	gwy3dview.c \
 	gwy3dwindow.c \
+	gwyadjustbar.c \
 	gwyaxis.c \
 	gwyaxisdialog.c \
 	gwycoloraxis.c \
@@ -772,6 +767,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gwy3dsetup.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gwy3dview.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gwy3dwindow.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gwyadjustbar.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gwyaxis.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gwyaxisdialog.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gwycoloraxis.Plo at am__quote@
diff --git a/libgwydgets/gwy3dsetup.c b/libgwydgets/gwy3dsetup.c
index 83fdb2f..e316bc9 100644
--- a/libgwydgets/gwy3dsetup.c
+++ b/libgwydgets/gwy3dsetup.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: gwy3dsetup.c 18070 2016-01-11 20:55:02Z yeti-dn $
- *  Copyright (C) 2006 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: gwy3dsetup.c 20263 2017-08-12 11:13:26Z yeti-dn $
+ *  Copyright (C) 2006-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -42,6 +42,9 @@ enum {
     PROP_LIGHT_THETA,
     PROP_HIDE_MASKED,
     PROP_LINE_WIDTH,
+    PROP_FMSCALE_SIZE,
+    PROP_FMSCALE_Y_ALIGN,
+    PROP_FMSCALE_RESERVE_SPACE,
     PROP_LAST
 };
 
@@ -129,9 +132,8 @@ gwy_3d_setup_class_init(Gwy3DSetupClass *klass)
         (gobject_class,
          PROP_FMSCALE_VISIBLE,
          g_param_spec_boolean("fmscale-visible",
-                              "fmscale visible",
-                              "Whether false color bar is visible "
-                              "",
+                              "Fmscale visible",
+                              "Whether false color bar is visible",
                               FALSE,
                               G_PARAM_READWRITE));
 
@@ -217,6 +219,56 @@ gwy_3d_setup_class_init(Gwy3DSetupClass *klass)
                              "Width of axis lines and ticks, in pixels.",
                              1.0, 10.0, 1.0,
                              G_PARAM_READWRITE));
+
+    /**
+     * Gwy3DSetup:fmscale-size:
+     *
+     * Size of false colour scale relative to view height.
+     *
+     * Since: 2.49
+     **/
+    g_object_class_install_property
+        (gobject_class,
+         PROP_FMSCALE_SIZE,
+         g_param_spec_double("fmscale-size",
+                             "Fmscale size",
+                             "Size of false colour scale relative to "
+                             "view height.",
+                             0.0, 1.0, 1.0,
+                             G_PARAM_READWRITE));
+
+    /**
+     * Gwy3DSetup:fmscale-y-align:
+     *
+     * Vertical alignment of false colour scale.
+     *
+     * Since: 2.49
+     **/
+    g_object_class_install_property
+        (gobject_class,
+         PROP_FMSCALE_Y_ALIGN,
+         g_param_spec_double("fmscale-y-align",
+                             "Fmscale y align",
+                             "Vertical alignment of false colour scale.",
+                             0.0, 1.0, 0.5,
+                             G_PARAM_READWRITE));
+    /**
+     * Gwy3DSetup:fmscale-reserve-space:
+     *
+     * Whethere to reserve entire vertical stripe of the false colour scale.
+     *
+     * Since: 2.49
+     **/
+    g_object_class_install_property
+        (gobject_class,
+         PROP_FMSCALE_RESERVE_SPACE,
+         g_param_spec_boolean("fmscale-reserve-space",
+                              "Fmscale resrrve space",
+                              "Whether to reserve horizontal space for "
+                              "the false colour scale.",
+                              TRUE,
+                              G_PARAM_READWRITE));
+
 }
 
 static void
@@ -236,6 +288,9 @@ gwy_3d_setup_init(Gwy3DSetup *setup)
     setup->light_phi = 0.0;
     setup->light_theta = 0.0;
     setup->line_width = 1.0;
+    setup->fmscale_size = 1.0;
+    setup->fmscale_yalign = 0.5;
+    setup->fmscale_reserve_space = TRUE;
 }
 
 static void
@@ -299,6 +354,18 @@ gwy_3d_setup_set_property(GObject *object,
         setup->line_width = g_value_get_double(value);
         break;
 
+        case PROP_FMSCALE_SIZE:
+        setup->fmscale_size = g_value_get_double(value);
+        break;
+
+        case PROP_FMSCALE_Y_ALIGN:
+        setup->fmscale_yalign = g_value_get_double(value);
+        break;
+
+        case PROP_FMSCALE_RESERVE_SPACE:
+        setup->fmscale_reserve_space = g_value_get_boolean(value);
+        break;
+
         default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
         break;
@@ -366,6 +433,18 @@ gwy_3d_setup_get_property(GObject *object,
         g_value_set_double(value, setup->line_width);
         break;
 
+        case PROP_FMSCALE_SIZE:
+        g_value_set_double(value, setup->fmscale_size);
+        break;
+
+        case PROP_FMSCALE_Y_ALIGN:
+        g_value_set_double(value, setup->fmscale_yalign);
+        break;
+
+        case PROP_FMSCALE_RESERVE_SPACE:
+        g_value_set_boolean(value, setup->fmscale_reserve_space);
+        break;
+
         default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
         break;
@@ -397,6 +476,9 @@ gwy_3d_setup_serialize(GObject *serializable,
             { 'd', "light-theta", &setup->light_theta, NULL, },
             { 'b', "hide-masked", &setup->hide_masked, NULL, },
             { 'd', "line-width", &setup->line_width, NULL, },
+            { 'd', "fmscale-size", &setup->fmscale_size, NULL, },
+            { 'd', "fmscale-y-align", &setup->fmscale_yalign, NULL, },
+            { 'b', "fmscale-resrrve-space", &setup->fmscale_reserve_space, NULL, },
         };
 
         return gwy_serialize_pack_object_struct(buffer,
@@ -429,6 +511,9 @@ gwy_3d_setup_get_size(GObject *object)
             { 'd', "light-theta", &setup->light_theta, NULL, },
             { 'b', "hide-masked", &setup->hide_masked, NULL, },
             { 'd', "line-width", &setup->line_width, NULL, },
+            { 'd', "fmscale-size", &setup->fmscale_size, NULL, },
+            { 'd', "fmscale-y-align", &setup->fmscale_yalign, NULL, },
+            { 'b', "fmscale-resrrve-space", &setup->fmscale_reserve_space, NULL, },
         };
 
         return gwy_serialize_get_struct_size(GWY_3D_SETUP_TYPE_NAME,
@@ -462,6 +547,9 @@ gwy_3d_setup_deserialize(const guchar *buffer,
             { 'd', "light-theta", &setup->light_theta, NULL, },
             { 'b', "hide-masked", &setup->hide_masked, NULL, },
             { 'd', "line-width", &setup->line_width, NULL, },
+            { 'd', "fmscale-size", &setup->fmscale_size, NULL, },
+            { 'd', "fmscale-y-align", &setup->fmscale_yalign, NULL, },
+            { 'b', "fmscale-resrrve-space", &setup->fmscale_reserve_space, NULL, },
         };
 
         if (!gwy_serialize_unpack_object_struct(buffer, size, position,
@@ -548,6 +636,21 @@ gwy_3d_setup_clone(GObject *source,
         g_object_notify(copy, "line-width");
     }
 
+    if (clone->fmscale_size != setup->fmscale_size) {
+        clone->fmscale_size = setup->fmscale_size;
+        g_object_notify(copy, "fmscale-size");
+    }
+
+    if (clone->fmscale_yalign != setup->fmscale_yalign) {
+        clone->fmscale_yalign = setup->fmscale_yalign;
+        g_object_notify(copy, "fmscale-y-align");
+    }
+
+    if (clone->fmscale_reserve_space != setup->fmscale_reserve_space) {
+        clone->fmscale_reserve_space = setup->fmscale_reserve_space;
+        g_object_notify(copy, "fmscale-reserve-space");
+    }
+
     g_object_thaw_notify(copy);
 }
 
@@ -576,6 +679,9 @@ gwy_3d_setup_duplicate_real(GObject *object)
     duplicate->hide_masked = setup->hide_masked;
 
     duplicate->line_width = setup->line_width;
+    duplicate->fmscale_size = setup->fmscale_size;
+    duplicate->fmscale_yalign = setup->fmscale_yalign;
+    duplicate->fmscale_reserve_space = setup->fmscale_reserve_space;
 
     return (GObject*)duplicate;
 }
diff --git a/libgwydgets/gwy3dsetup.h b/libgwydgets/gwy3dsetup.h
index 4816835..3b7c0a7 100644
--- a/libgwydgets/gwy3dsetup.h
+++ b/libgwydgets/gwy3dsetup.h
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: gwy3dsetup.h 17340 2015-09-10 08:49:47Z yeti-dn $
- *  Copyright (C) 2006 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: gwy3dsetup.h 20263 2017-08-12 11:13:26Z yeti-dn $
+ *  Copyright (C) 2006-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -49,7 +49,7 @@ struct _Gwy3DSetup {
     gboolean labels_visible;
     gboolean fmscale_visible;
     gboolean hide_masked;
-    gboolean b_reserved3;
+    gboolean fmscale_reserve_space;
     gboolean b_reserved4;
 
     guint i_reserved1;
@@ -62,8 +62,8 @@ struct _Gwy3DSetup {
     gdouble light_phi;
     gdouble light_theta;
     gdouble line_width;
-    gdouble d_reserved_2;
-    gdouble d_reserved_3;
+    gdouble fmscale_size;
+    gdouble fmscale_yalign;
     gdouble d_reserved_4;
 };
 
diff --git a/libgwydgets/gwy3dview.c b/libgwydgets/gwy3dview.c
index 80532d0..2b06999 100644
--- a/libgwydgets/gwy3dview.c
+++ b/libgwydgets/gwy3dview.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: gwy3dview.c 19216 2016-11-09 10:39:06Z yeti-dn $
- *  Copyright (C) 2003-2015 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: gwy3dview.c 20271 2017-08-14 13:16:49Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *  Copyright (C) 2004 Martin Siler.
  *  E-mail: silerm at physics.muni.cz.
@@ -104,6 +104,14 @@ enum {
 };
 
 enum {
+    GWY_3D_JUST_LEFT_EDGE = 0,
+    GWY_3D_JUST_TOP_EDGE = 0,
+    GWY_3D_JUST_CENTER = 1,
+    GWY_3D_JUST_RIGHT_EDGE = 2,
+    GWY_3D_JUST_BOTTOM_EDGE = 2,
+};
+
+enum {
     PROP_0,
     PROP_MOVEMENT,
     PROP_REDUCED_SIZE,
@@ -192,6 +200,8 @@ static gboolean gwy_3d_view_button_press         (GtkWidget *widget,
                                                   GdkEventButton *event);
 static gboolean gwy_3d_view_button_release       (GtkWidget *widget,
                                                   GdkEventButton *event);
+static gboolean gwy_3d_view_scroll               (GtkWidget *widget,
+                                                  GdkEventScroll *event);
 static void     gwy_3d_calculate_pixel_sizes     (GwyDataField *dfield,
                                                   GLfloat *dx,
                                                   GLfloat *dy);
@@ -219,8 +229,8 @@ static void     gwy_3d_texture_text              (Gwy3DView     *gwy3dview,
                                                   GLfloat        raster_z,
                                                   GLfloat        rot,
                                                   guint          size,
-                                                  gint           vjustify,
-                                                  gint           hjustify);
+                                                  gint           hjustify,
+                                                  gint           vjustify);
 static gint     gwy_3d_draw_fmscaletex           (Gwy3DView *view);
 static void     gwy_3d_view_class_make_list_pool (Gwy3DListPool *pool);
 static void     gwy_3d_view_assign_lists         (Gwy3DView *gwy3dview);
@@ -274,6 +284,7 @@ gwy_3d_view_class_init(Gwy3DViewClass *klass)
     widget_class->size_allocate = gwy_3d_view_size_allocate;
     widget_class->button_press_event = gwy_3d_view_button_press;
     widget_class->button_release_event = gwy_3d_view_button_release;
+    widget_class->scroll_event = gwy_3d_view_scroll;
     widget_class->motion_notify_event = gwy_3d_view_motion_notify;
 
     klass->list_pool = g_new0(Gwy3DListPool, 1);
@@ -407,10 +418,10 @@ gwy_3d_view_destroy(GtkObject *object)
                                           gwy3dview->ovlay_updated_id[i]);
             gwy_data_view_layer_unplugged(GWY_DATA_VIEW_LAYER(gwy3dview->ovlays[i]));
             GWY_OBJECT_UNREF(gwy3dview->ovlays[i]);
-        };
+        }
         g_free(gwy3dview->ovlays);
         gwy3dview->ovlays = NULL;
-    };
+    }
 
     GTK_OBJECT_CLASS(gwy_3d_view_parent_class)->destroy(object);
 }
@@ -763,9 +774,9 @@ gwy_3d_view_set_ovlay(Gwy3DView *gwy3dview,
         for (i = 0; i < gwy3dview->novlays; i++) {
             gwy_data_view_layer_unplugged(GWY_DATA_VIEW_LAYER(gwy3dview->ovlays[i]));
             GWY_OBJECT_UNREF(gwy3dview->ovlays[i]);
-        };
+        }
         g_free(gwy3dview->ovlays);
-    };
+    }
 
     gwy3dview->ovlays = g_new(GwyPixmapLayer*, novlays);
     gwy3dview->ovlay_updated_id = g_new(guint, novlays);
@@ -779,7 +790,7 @@ gwy_3d_view_set_ovlay(Gwy3DView *gwy3dview,
                                        "updated",
                                        G_CALLBACK(gwy_3d_view_queue_draw),
                                        gwy3dview);
-    };
+    }
     gwy_3d_view_update_lists(gwy3dview);
 }
 
@@ -958,27 +969,34 @@ static void
 gwy_3d_view_setup_changed(Gwy3DView *gwy3dview,
                           GParamSpec *pspec)
 {
+    Gwy3DSetup *setup = gwy3dview->setup;
+
     gwy_debug("%p <%s>", gwy3dview, pspec ? pspec->name : "NULL");
     /* TODO: must decide what needs redraw, if anything */
     if (pspec) {
-        if (!gwy_3d_visualisation_has_light(gwy3dview->setup->visualization)
+        if (!gwy_3d_visualisation_has_light(setup->visualization)
             && (gwy_strequal(pspec->name, "light-theta")
                 || gwy_strequal(pspec->name, "light-phi")))
             return;
-        if (!gwy3dview->setup->axes_visible
+        if (!setup->axes_visible
             && gwy_strequal(pspec->name, "labels-visible"))
             return;
         if (gwy_strequal(pspec->name, "visualization")) {
             gwy_3d_view_update_lists(gwy3dview);
             return;
-        };
+        }
         if (gwy_strequal(pspec->name, "hide-masked")) {
             gwy_3d_view_update_lists(gwy3dview);
             return;
-        };
-        if (!gwy3dview->setup->axes_visible
+        }
+        if (!setup->axes_visible
             && gwy_strequal(pspec->name, "line-width"))
             return;
+        if (!setup->fmscale_visible
+            && (gwy_strequal(pspec->name, "fmscale-size")
+                || gwy_strequal(pspec->name, "fmscale-y-align")
+                || gwy_strequal(pspec->name, "fmscale-reserve-space")))
+            return;
     }
 
     gwy_3d_view_queue_draw(gwy3dview);
@@ -1595,8 +1613,6 @@ gwy_3d_view_expose(GtkWidget *widget,
     GLfloat h = widget->allocation.height;
     gint sw = 0;
 
-    gwy_debug(" ");
-
     gwy_debug("width: %f, height: %f", w, h);
 
     g_return_val_if_fail(GWY_IS_3D_VIEW(widget), FALSE);
@@ -1636,6 +1652,8 @@ gwy_3d_view_expose(GtkWidget *widget,
 
         sw = gwy_3d_draw_fmscaletex(gwy3dview);
         gwy_debug("Scale width: %d", sw);
+        if (!gwy3dview->setup->fmscale_reserve_space)
+            sw = 0;
 
         glDisable(GL_TEXTURE_2D);
         glEnable(GL_DEPTH_TEST);
@@ -1697,11 +1715,6 @@ gwy_3d_view_expose(GtkWidget *widget,
     glCallList(gwy3dview->shape_list_base + gwy3dview->shape_current);
     if (gwy3dview->setup->axes_visible)
         gwy_3d_draw_axes(gwy3dview, w-sw, h);
-    else {
-        /* FIXME: False colour axis area is drawn as big black box without
-         * this.  Have no idea why. */
-        glColor3f(1.0, 1.0, 1.0);
-    }
 
     if (gwy3dview->movement == GWY_3D_MOVEMENT_LIGHT && priv->button)
         gwy_3d_draw_light_position(gwy3dview);
@@ -1725,8 +1738,6 @@ gwy_3d_view_button_press(GtkWidget *widget,
     Gwy3DView *gwy3dview = GWY_3D_VIEW(widget);
     Gwy3DViewPrivate *priv = GWY_3D_VIEW_GET_PRIVATE(gwy3dview);
 
-    gwy_debug(" ");
-
     gwy3dview->mouse_begin_x = event->x;
     gwy3dview->mouse_begin_y = event->y;
     priv->button = TRUE;
@@ -1751,6 +1762,30 @@ gwy_3d_view_button_release(GtkWidget *widget,
 }
 
 static gboolean
+gwy_3d_view_scroll(GtkWidget *widget, GdkEventScroll *event)
+{
+    Gwy3DView *gwy3dview = GWY_3D_VIEW(widget);
+    GdkScrollDirection dir = event->direction;
+    gboolean enlarge;
+    gdouble val, q;
+
+    enlarge = (dir == GDK_SCROLL_UP || dir == GDK_SCROLL_RIGHT);
+
+    q = exp(2.5*(enlarge ? GWY_3D_Z_DEFORMATION : -GWY_3D_Z_DEFORMATION));
+    if (event->state & GDK_SHIFT_MASK) {
+        val = gwy3dview->setup->z_scale*q;
+        g_object_set(gwy3dview->setup, "z-scale", val, NULL);
+    }
+    else {
+        val = gwy3dview->setup->scale*q;
+        val = CLAMP(val, gwy3dview->view_scale_min, gwy3dview->view_scale_max);
+        g_object_set(gwy3dview->setup, "scale", val, NULL);
+    }
+
+    return TRUE;
+}
+
+static gboolean
 gwy_3d_view_motion_notify(GtkWidget *widget,
                           G_GNUC_UNUSED GdkEventMotion *event)
 {
@@ -2024,8 +2059,8 @@ gwy_3d_make_list(Gwy3DView *gwy3dview,
     Gwy3DVector *normals;
     const gdouble *data;
     const gdouble *mask = NULL;
-    GdkPixbuf* pixbuf;
-    guchar* colors;
+    GdkPixbuf *pixbuf;
+    guchar *colors;
     gboolean glon;
 
     g_return_if_fail(GWY_IS_DATA_FIELD(dfield));
@@ -2047,7 +2082,7 @@ gwy_3d_make_list(Gwy3DView *gwy3dview,
     gwy_3d_calculate_pixel_sizes(dfield, &dx, &dy);
     res = MAX(xres*dx, yres*dy);
     if (gwy3dview->ovlays) {
-        GdkPixbuf* lpb;
+        GdkPixbuf *lpb;
         gint l;
 
         pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, 0, 8, xres, yres);
@@ -2063,8 +2098,8 @@ gwy_3d_make_list(Gwy3DView *gwy3dview,
                                          (gdouble)xres/gdk_pixbuf_get_width(lpb),
                                          (gdouble)yres/gdk_pixbuf_get_height(lpb),
                                          GDK_INTERP_TILES, 0xff);
-            };
-        };
+            }
+        }
     }
     else {
         GwyGradient *grad = gwy3dview->gradient;
@@ -2076,7 +2111,7 @@ gwy_3d_make_list(Gwy3DView *gwy3dview,
         pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, 0, 8, xres, yres);
         gwy_pixbuf_draw_data_field(pixbuf, dfield, grad);
         gwy_resource_release(GWY_RESOURCE(grad));
-    };
+    }
 
     colors = gdk_pixbuf_get_pixels(pixbuf);
     rowstride = gdk_pixbuf_get_rowstride(pixbuf);
@@ -2095,19 +2130,19 @@ gwy_3d_make_list(Gwy3DView *gwy3dview,
             gdouble z;
             guchar *color;
             if (gwy3dview->setup->hide_masked && mask != NULL) {
-                if (mask[(yres-1 - j)*xres + i] == 0
-                    && mask[(yres-2 - j)*xres + i] == 0
+                if (mask[(yres-1 - j)*xres + i] == 0.0
+                    && mask[(yres-2 - j)*xres + i] == 0.0
                     && !glon) {
                     glBegin(GL_TRIANGLE_STRIP);
                     glon = TRUE;
-                    if (mask[(yres-1 - j)*xres + i - 1] > 0
-                        && mask[(yres-2 - j)*xres + i - 1] > 0) {
+                    if (mask[(yres-1 - j)*xres + i - 1] > 0.0
+                        && mask[(yres-2 - j)*xres + i - 1] > 0.0) {
                         GWY_3D_VERTEX(i, j);
                     }
-                    else if (mask[(yres-1 - j)*xres + i - 1] > 0) {
+                    else if (mask[(yres-1 - j)*xres + i - 1] > 0.0) {
                         GWY_3D_VERTEX(i-1, j+1);
                     }
-                    else if (mask[(yres-2 - j)*xres + i - 1] > 0.) {
+                    else if (mask[(yres-2 - j)*xres + i - 1] > 0.0) {
                         GWY_3D_VERTEX(i-1, j);
                     }
                 }
@@ -2124,7 +2159,7 @@ gwy_3d_make_list(Gwy3DView *gwy3dview,
             else {
                 GWY_3D_VERTEX(i, j);
                 GWY_3D_VERTEX(i, j+1);
-            };
+            }
         }
         glEnd();
     }
@@ -2143,9 +2178,9 @@ gwy_3d_make_list(Gwy3DView *gwy3dview,
  * multiplies the matrices
  *
 */
-static void gwy_3d_util_mult_matrix(const GLdouble a[16],
-                                    const GLdouble b[16],
-                                    GLdouble mpMatrix[16])
+static void
+gwy_3d_util_mult_matrix(const GLdouble *a, const GLdouble *b,
+                        GLdouble *mpMatrix)
 {
     int i, j;
 
@@ -2158,38 +2193,34 @@ static void gwy_3d_util_mult_matrix(const GLdouble a[16],
                 + a[i*4+3]*b[3*4+j];
         }
     }
-};
+}
 
 /* mpMatrix is the current model-projection-matrix */
-static void gwy_3d_util_get_mpmatrix(GLdouble mpMatrix[16])
+static void
+gwy_3d_util_get_mpmatrix(GLdouble *mpMatrix)
 {
     GLdouble mM[16], pM[16];
     glGetDoublev(GL_MODELVIEW_MATRIX, mM);
     glGetDoublev(GL_PROJECTION_MATRIX, pM);
 
     gwy_3d_util_mult_matrix(mM, pM, mpMatrix);
-};
-
+}
 
 /* wx,wy,wz denote the pont x,y,z will result
  * in under the model-projection-matrix mpM
  * and the viewport vpMatrix
 */
-static int gwy_3d_util_project(GLdouble x,
-                               GLdouble y,
-                               GLdouble z,
-                               const GLdouble mpM[16],
-                               const GLint vpMatrix[4],
-                               GLdouble* wx,
-                               GLdouble* wy,
-                               GLdouble* wz)
+static int
+gwy_3d_util_project(GLdouble x, GLdouble y, GLdouble z,
+                    const GLdouble *mpM, const GLint *vpMatrix,
+                    GLdouble *wx, GLdouble *wy, GLdouble *wz)
 {
     GLdouble temp[4];
     /* Matrix-Vector-Product */
-    temp[0] = mpM[0]*x+mpM[4]*y+mpM[8]*z+mpM[12];
-    temp[1] = mpM[1]*x+mpM[5]*y+mpM[9]*z+mpM[13];
-    temp[2] = mpM[2]*x+mpM[6]*y+mpM[10]*z+mpM[14];
-    temp[3] = mpM[3]*x+mpM[7]*y+mpM[11]*z+mpM[15];
+    temp[0] = mpM[0]*x + mpM[4]*y + mpM[8]*z + mpM[12];
+    temp[1] = mpM[1]*x + mpM[5]*y + mpM[9]*z + mpM[13];
+    temp[2] = mpM[2]*x + mpM[6]*y + mpM[10]*z + mpM[14];
+    temp[3] = mpM[3]*x + mpM[7]*y + mpM[11]*z + mpM[15];
 
     if (temp[3] == 0.0)
         return GL_FALSE;
@@ -2198,14 +2229,15 @@ static int gwy_3d_util_project(GLdouble x,
     temp[1] /= temp[3];
     temp[2] /= temp[3];
 
-    *wx = (0.5*temp[0]+0.5)*vpMatrix[2]+vpMatrix[0];
-    *wy = (0.5*temp[1]+0.5)*vpMatrix[3]+vpMatrix[1];
-    *wz = 0.5*temp[2]+0.5;
+    *wx = (0.5*temp[0] + 0.5)*vpMatrix[2] + vpMatrix[0];
+    *wy = (0.5*temp[1] + 0.5)*vpMatrix[3] + vpMatrix[1];
+    *wz = 0.5*temp[2] + 0.5;
 
     return GL_TRUE;
 }
 
-static inline int uppow2(int x)
+static inline gint
+uppow2(gint x)
 {
     x--;
     x |= x >> 1;
@@ -2216,12 +2248,12 @@ static inline int uppow2(int x)
     x++;
 
     return x;
-};
+}
 
 static void
 gwy_3d_draw_axes(Gwy3DView *widget, gint width, gint height)
 {
-    GLfloat dx, dy, rx, Ax, Ay, Bx, By, Cx, Cy;
+    GLfloat dx, dy, rx, Ax, Ay, Bx, By, Cx, Cy, ticklen, xt, yt;
     gdouble data_min, data_max;
     gint xres, yres, res;
     gboolean yfirst;
@@ -2254,6 +2286,7 @@ gwy_3d_draw_axes(Gwy3DView *widget, gint width, gint height)
                         gwy_gl_material_get_specular(mat_none));
     glMaterialf(GL_FRONT, GL_SHININESS,
                 (GLfloat)gwy_gl_material_get_shininess(mat_none)*128.0f);
+
     /* This is optimistic.  Hope something reasonable happens when the selected
      * line width is not actually supported. */
     glLineWidth(widget->setup->line_width);
@@ -2262,60 +2295,78 @@ gwy_3d_draw_axes(Gwy3DView *widget, gint width, gint height)
         Ay = dy*yres;
         Cx = dx*xres;
         yfirst = TRUE;
-    } else if (rx > 90.0 && rx <= 180.0) {
+    }
+    else if (rx > 90.0 && rx <= 180.0) {
         Ax = dx*xres;
         Ay = dy*yres;
         By = dy*yres;
         yfirst = FALSE;
-    } else if (rx > 180.0 && rx <= 270.0) {
+    }
+    else if (rx > 180.0 && rx <= 270.0) {
         Ax = dx*xres;
         Bx = dx*xres;
         By = dy*yres;
         Cy = dy*yres;
-       yfirst = TRUE;
-    } else if (rx >= 270.0 && rx <= 360.0) {
+        yfirst = TRUE;
+    }
+    else if (rx >= 270.0 && rx <= 360.0) {
         Bx = dx*xres;
         Cx = dx*xres;
         Cy = dy*yres;
         yfirst = FALSE;
     }
+    ticklen = 0.01f*(dx*xres + dy*yres);
+
+    /* X, Y and Z axes */
     glBegin(GL_LINE_STRIP);
-        glColor3f(0.0, 0.0, 0.0);
-        glVertex3f(Ax, Ay, 0.0f);
-        glVertex3f(Bx, By, 0.0f);
-        glVertex3f(Cx, Cy, 0.0f);
-        glVertex3f(Cx, Cy, data_max - data_min);
-    glEnd();
-    glBegin(GL_LINES);
-        glVertex3f(Ax, Ay, 0.0f);
-        glVertex3f(Ax - (Cx-Bx)*0.02, Ay - (Cy-By)*0.02, 0.0f);
-        glVertex3f((Ax+Bx)/2, (Ay+By)/2, 0.0f);
-        glVertex3f((Ax+Bx)/2 - (Cx-Bx)*0.02,
-                   (Ay+By)/2 - (Cy-By)*0.02, 0.0f);
-        glVertex3f(Bx, By, 0.0f);
-        glVertex3f(Bx - (Cx-Bx)*0.02, By - (Cy-By)*0.02, 0.0f);
-        glVertex3f(Bx, By, 0.0f);
-        glVertex3f(Bx - (Ax-Bx)*0.02, By - (Ay-By)*0.02, 0.0f);
-        glVertex3f((Cx+Bx)/2, (Cy+By)/2, 0.0f);
-        glVertex3f((Cx+Bx)/2 - (Ax-Bx)*0.02,
-                   (Cy+By)/2 - (Ay-By)*0.02, 0.0f);
-        glVertex3f(Cx, Cy, 0.0f);
-        glVertex3f(Cx - (Ax-Bx)*0.02, Cy - (Ay-By)*0.02, 0.0f);
+    glColor3f(0.0, 0.0, 0.0);
+    glVertex2f(Ax, Ay);
+    glVertex2f(Bx, By);
+    glVertex2f(Cx, Cy);
+    glVertex3f(Cx, Cy, data_max - data_min);
     glEnd();
 
     glBegin(GL_LINES);
-        glVertex3f(Cx, Cy, data_max - data_min);
-        glVertex3f(Cx - (Ax-Bx)*0.02, Cy - (Ay-By)*0.02,
-                 data_max - data_min);
-        glVertex3f(Cx, Cy, (data_max - data_min)/2);
-        glVertex3f(Cx - (Ax-Bx)*0.02, Cy - (Ay-By)*0.02,
-                   (data_max - data_min)/2);
+    /* X-axis ticks */
+    xt = ticklen*(Bx - Cx)/(ABS(Cx - Bx) + ABS(Cy - By));
+    yt = ticklen*(By - Cy)/(ABS(Cx - Bx) + ABS(Cy - By));
+
+    glVertex2f(Ax, Ay);
+    glVertex2f(Ax + xt, Ay + yt);
+
+    glVertex2f((Ax+Bx)/2, (Ay+By)/2);
+    glVertex2f((Ax+Bx)/2 + xt, (Ay+By)/2 + yt);
+
+    glVertex2f(Bx, By);
+    glVertex2f(Bx + xt, By + yt);
+
+    /* Y-axis ticks */
+    xt = ticklen*(Bx - Ax)/(ABS(Bx - Ax) + ABS(By - Ay));
+    yt = ticklen*(By - Ay)/(ABS(Bx - Ax) + ABS(By - Ay));
+
+    glVertex2f(Bx, By);
+    glVertex2f(Bx + xt, By + yt);
+
+    glVertex2f((Cx+Bx)/2, (Cy+By)/2);
+    glVertex2f((Cx+Bx)/2 + xt, (Cy+By)/2 + yt);
+
+    glVertex2f(Cx, Cy);
+    glVertex2f(Cx + xt, Cy + yt);
+
+    /* Z-axis ticks */
+    glVertex3f(Cx, Cy, data_max - data_min);
+    glVertex3f(Cx + xt, Cy + yt, data_max - data_min);
+
+    glVertex3f(Cx, Cy, (data_max - data_min)/2);
+    glVertex3f(Cx + xt, Cy + yt, (data_max - data_min)/2);
     glEnd();
 
     /*
     TODO: create bitmaps with labels in the beginning (possibly in init_gl)
           into display lists and draw here
     */
+    /* FIXME: I was able to fix the ticks drawing but this is still terribly
+     * broken for non-square images.  (Yeti) */
     if (widget->setup->labels_visible
         && !ugly_hack_globally_disable_axis_drawing) {
         guint view_size;
@@ -2343,10 +2394,10 @@ gwy_3d_draw_axes(Gwy3DView *widget, gint width, gint height)
 
         gwy_3d_util_project(Ax, Ay, -0.0f, mpM, vpM, &sx, &sy, &sz);
         gwy_3d_util_project(Bx, By, -0.0f, mpM, vpM, &tx, &ty, &tz);
-        rotA = atan2((ty-sy), (tx-sx));
+        rotA = atan2(ty-sy, tx-sx);
 
         gwy_3d_util_project(Cx, Cy, -0.0f, mpM, vpM, &sx, &sy, &sz);
-        rotB = G_PI/2.-atan2((sx-tx), (sy-ty));
+        rotB = G_PI/2.0 - atan2(sx-tx, sy-ty);
 
         gwy_3d_util_project((Ax+Bx)/2 - (Cx-Bx)*0.1,
                             (Ay+By)/2 - (Cy-By)*0.1,
@@ -2385,20 +2436,20 @@ gwy_3d_draw_axes(Gwy3DView *widget, gint width, gint height)
         gwy_3d_texture_text(widget, yfirst ? GWY_3D_VIEW_LABEL_Y
                                            : GWY_3D_VIEW_LABEL_X,
                             sx, sy, sz, rotA,
-                            size, 1, 1);
+                            size, GWY_3D_JUST_CENTER, GWY_3D_JUST_CENTER);
 
         gwy_3d_texture_text(widget, yfirst ? GWY_3D_VIEW_LABEL_X
                                            : GWY_3D_VIEW_LABEL_Y,
                             tx, ty, tz, rotB,
-                            size, 1, 1);
+                            size, GWY_3D_JUST_CENTER, GWY_3D_JUST_CENTER);
 
         gwy_3d_texture_text(widget, GWY_3D_VIEW_LABEL_MAX,
                             vx, vy, vz, 0,
-                            size, 1, 0);
+                            size, GWY_3D_JUST_LEFT_EDGE, GWY_3D_JUST_CENTER);
 
         gwy_3d_texture_text(widget, GWY_3D_VIEW_LABEL_MIN,
                             ux, uy, uz, 0,
-                            size, 1, 0);
+                            size, GWY_3D_JUST_LEFT_EDGE, GWY_3D_JUST_CENTER);
 
         /* unset 2d */
         glDisable(GL_BLEND);
@@ -2439,15 +2490,17 @@ gwy_3d_draw_light_position(Gwy3DView *widget)
                         gwy_gl_material_get_specular(mat_none));
     glMaterialf(GL_FRONT, GL_SHININESS,
                 (GLfloat)gwy_gl_material_get_shininess(mat_none)*128.0f);
+
     glPushMatrix();
     plane_z = GWY_3D_Z_TRANSFORMATION
               *(data_mean - data_min)/(data_max  - data_min)
               + GWY_3D_Z_DISPLACEMENT;
 
     glTranslatef(0.0f, 0.0f, plane_z);
-    glRotatef(widget->setup->light_theta * RAD_2_DEG, 0.0f, 0.0f, 1.0f);
-    glRotatef(-widget->setup->light_phi * RAD_2_DEG, 0.0f, 1.0f, 0.0f);
+    glRotatef(-widget->setup->light_theta * RAD_2_DEG, 0.0f, 0.0f, 1.0f);
+    glRotatef(widget->setup->light_phi * RAD_2_DEG, 0.0f, 1.0f, 0.0f);
     glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
     glBegin(GL_QUAD_STRIP);
     for (i = -180; i <= 180; i += 5) {
         GLfloat x = cos(i * DEG_2_RAD) * G_SQRT2;
@@ -2456,13 +2509,16 @@ gwy_3d_draw_light_position(Gwy3DView *widget)
         glVertex3f(x, -0.05f, z);
     }
     glEnd();
+
     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
     glBegin(GL_LINE_STRIP);
         glVertex3f(0.0f,  0.0f,  0.0f);
         glVertex3f(0.0f,  0.05f, G_SQRT2);
         glVertex3f(0.0f, -0.05f, G_SQRT2);
         glVertex3f(0.0f,  0.0f,  0.0f);
     glEnd();
+
     glPopMatrix();
 }
 
@@ -2541,7 +2597,7 @@ gwy_3d_set_projection(Gwy3DView *gwy3dview, GLfloat aspect)
         }
     }
     else {
-        aspect = 1./aspect;
+        aspect = 1.0/aspect;
         switch (gwy3dview->setup->projection) {
             case GWY_3D_PROJECTION_ORTHOGRAPHIC:
             glOrtho(-1.0   * GWY_3D_ORTHO_CORRECTION,
@@ -2561,13 +2617,13 @@ gwy_3d_set_projection(Gwy3DView *gwy3dview, GLfloat aspect)
 }
 
 static PangoLayout*
-gwy_3d_prepare_layout(cairo_t* cr, gdouble zoom)
+gwy_3d_prepare_layout(cairo_t *cr, gdouble zoom)
 {
     PangoFontDescription *fontdesc;
     PangoLayout *layout;
 
     layout = pango_cairo_create_layout(cr);
-    fontdesc = pango_font_description_from_string("Helvetica 12");
+    fontdesc = pango_font_description_from_string("Arial 12");
     pango_font_description_set_size(fontdesc, GWY_ROUND(0.8*PANGO_SCALE*zoom));
     pango_layout_set_font_description(layout, fontdesc);
     pango_font_description_free(fontdesc);
@@ -2600,7 +2656,7 @@ gwy_3d_view_render_string(gdouble size,
     cr = cairo_create(surface);
     clayout = gwy_3d_prepare_layout(cr, size);
 
-    cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0);
+    cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
     pango_layout_set_markup(clayout, text, -1);
     pango_layout_get_pixel_size(clayout, &px, &py);
     *width = px;
@@ -2620,7 +2676,7 @@ gwy_3d_view_render_string(gdouble size,
     surface = cairo_image_surface_create_for_data(alpha, CAIRO_FORMAT_ARGB32,
                                                   px, py, wstride);
     cr = cairo_create(surface);
-    cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0);
+    cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
     pango_cairo_update_layout(cr, clayout);
     pango_layout_set_markup(clayout, text, -1);
     pango_cairo_show_layout(cr, clayout);
@@ -2636,12 +2692,11 @@ gwy_3d_view_render_string(gdouble size,
 }
 
 /* image to opengl-texture */
-static GLuint
-gwy_3d_cairo_to_tex(guchar* image,
+static void
+gwy_3d_cairo_to_tex(guchar *image,
                     gint width, gint height, gint stride)
 {
     GLint w2 = uppow2(width), h2 = uppow2(height);
-    GLuint t[1];
 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
@@ -2651,9 +2706,7 @@ gwy_3d_cairo_to_tex(guchar* image,
     glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w2, h2,
                  0, GL_BGRA, GL_UNSIGNED_BYTE, image);
-
-    return t[0];
-};
+}
 
 /* puts textured rectangle t into view */
 static void
@@ -2669,14 +2722,21 @@ gwy_3d_draw_ctex(GLuint t,
     glBindTexture(GL_TEXTURE_2D, t);
 
     glBegin(GL_QUADS);
-    glTexCoord2f(0, ht) ; glVertex2f(ho, vo);
-    glTexCoord2f(0, 0); glVertex2f(ho, vo+height);
-    glTexCoord2f(wt, 0); glVertex2f(ho+width, vo+height);
-    glTexCoord2f(wt, ht); glVertex2f(ho+width, vo);
+    glTexCoord2f(0, ht);
+    glVertex2f(ho, vo);
+
+    glTexCoord2f(0, 0);
+    glVertex2f(ho, vo+height);
+
+    glTexCoord2f(wt, 0);
+    glVertex2f(ho+width, vo+height);
+
+    glTexCoord2f(wt, ht);
+    glVertex2f(ho+width, vo);
     glEnd();
 
     glBindTexture(GL_TEXTURE_2D, 0);
-};
+}
 
 /* draws text using a texture */
 static void
@@ -2687,8 +2747,8 @@ gwy_3d_texture_text(Gwy3DView     *gwy3dview,
                     GLfloat        raster_z,
                     GLfloat        rot,
                     guint          size,
-                    gint           vjustify,
-                    gint           hjustify)
+                    gint           hjustify,
+                    gint           vjustify)
 {
     GLuint tex = 0;
     Gwy3DLabel *label;
@@ -2709,7 +2769,7 @@ gwy_3d_texture_text(Gwy3DView     *gwy3dview,
     gwy_3d_cairo_to_tex(img, width, height, stride);
     glPushMatrix();
     glTranslatef(raster_x+displacement_x, raster_y+displacement_y, raster_z);
-    glRotatef(rot*180./G_PI, 0, 0, 1);
+    glRotatef(rot*180.0/G_PI, 0, 0, 1);
     gwy_3d_draw_ctex(tex, hjustify, vjustify, width, height);
     glPopMatrix();
 
@@ -2718,7 +2778,7 @@ gwy_3d_texture_text(Gwy3DView     *gwy3dview,
 
 /* converts GwyGradient in gradient to cairo_pattern_t in pattern */
 static void
-gwy_gradient_to_cairo_pattern(cairo_pattern_t* pattern, GwyGradient* gradient)
+gwy_gradient_to_cairo_pattern(cairo_pattern_t *pattern, GwyGradient *gradient)
 {
     GwyGradientPoint gp;
     gint i = 0, npoints = gwy_gradient_get_npoints(gradient);
@@ -2727,18 +2787,19 @@ gwy_gradient_to_cairo_pattern(cairo_pattern_t* pattern, GwyGradient* gradient)
         cairo_pattern_add_color_stop_rgba(pattern, gp.x,
                                           gp.color.r, gp.color.g, gp.color.b,
                                           gp.color.a);
-    };
-};
+    }
+}
 
 /* puts string into PangoLayout, printf style */
 static void
 gwy_3d_format_layout(PangoLayout *layout,
-                     GString* string,
+                     GString *string,
                      const gchar *format,
                      ...)
 {
     gchar *buffer;
     gint length;
+    guint i;
     va_list args;
 
     g_string_truncate(string, 0);
@@ -2750,8 +2811,22 @@ gwy_3d_format_layout(PangoLayout *layout,
 
     /* Replace ASCII with proper minus */
     if (string->str[0] == '-') {
-        g_string_erase(string, 0, 1);
-        g_string_prepend_unichar(string, 0x2212);
+        /* Fix -0.0 */
+        i = 1;
+        while (string->str[i] == '0')
+            i++;
+        if (string->str[i] == '.' || string->str[i] == ',')
+            i++;
+        while (string->str[i] == '0')
+            i++;
+
+        if (i > 1 && (!string->str[i] || g_ascii_isspace(string->str[i]))) {
+            g_string_erase(string, 0, 1);
+        }
+        else {
+            g_string_erase(string, 0, 1);
+            g_string_prepend_unichar(string, 0x2212);
+        }
     }
 
     pango_layout_set_markup(layout, string->str, string->len);
@@ -2773,7 +2848,7 @@ gwy_3d_step_to_prec(gdouble d)
 
 /* prints layout onto cairo context, vertically centered */
 static void
-gwy_3d_pango_cairo_show_layout_vcentered(cairo_t* cr, PangoLayout* layout)
+gwy_3d_pango_cairo_show_layout_vcentered(cairo_t *cr, PangoLayout *layout)
 {
     int lw, lh;
     gdouble ch;
@@ -2781,7 +2856,7 @@ gwy_3d_pango_cairo_show_layout_vcentered(cairo_t* cr, PangoLayout* layout)
     ch = (double)(lh)/PANGO_SCALE;
     cairo_rel_move_to(cr, 0, -ch/2.0);
     pango_cairo_show_layout(cr, layout);
-};
+}
 
 /* init cario context */
 static cairo_t*
@@ -2789,11 +2864,11 @@ gwy_cairo_create_cairo_context(gint width,
                                gint height,
                                cairo_surface_t **surf)
 {
-    cairo_t* cr;
+    cairo_t *cr;
 
     *surf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
     cr = cairo_create(*surf);
-    cairo_set_source_rgba(cr, 1, 1, 1, 1);
+    cairo_set_source_rgb(cr, 1, 1, 1);
     cairo_paint(cr);
     cairo_set_source_rgb(cr, 0, 0, 0);
     return cr;
@@ -2801,34 +2876,32 @@ gwy_cairo_create_cairo_context(gint width,
 
 /* renders false color bar into returned surface */
 static cairo_surface_t*
-gwy_3d_fmscaletex(gint height,
-                  gdouble bot,
-                  gdouble top,
-                  gint fsize,
+gwy_3d_fmscaletex(gint height, gdouble bot, gdouble top,
+                  gint fontsize, gdouble line_width,
                   GwySIUnit *siunit,
-                  GwyGradient* gradient,
+                  GwyGradient *gradient,
                   gboolean inverted,
-                  gint* rw, gint* rh,
+                  gint *width,
                   gboolean noticks)
 {
     PangoLayout *layout;
-    cairo_t* cr;
-    cairo_surface_t* surf;
+    cairo_t *cr;
+    cairo_surface_t *surf;
     gdouble x_max;
     gdouble scale, x, m, tickdist, max;
     GwySIValueFormat *format;
     GString *s;
-    gint tick, width, lw, layw1, layw2, layh;
+    gint tick, layw1, layw2, layh;
     gint units_width, label_height, mintickdist, prec = 1;
     G_GNUC_UNUSED gboolean do_draw = TRUE;
     gint size, fmw, l;
-    cairo_pattern_t* pattern;
+    cairo_pattern_t *pattern;
     gdouble zoom;
 
     s = g_string_new(NULL);
     cr = gwy_cairo_create_cairo_context(1, 1, &surf);
-    layout = gwy_3d_prepare_layout(cr, fsize);
-    zoom = 0.8/12.0*(float)fsize;
+    layout = gwy_3d_prepare_layout(cr, fontsize);
+    zoom = 0.8/12.0*(float)fontsize;
 
     x_max = MAX(fabs(bot), fabs(top));
     format = gwy_si_unit_get_format(siunit, GWY_SI_UNIT_FORMAT_VFMARKUP,
@@ -2859,7 +2932,7 @@ gwy_3d_fmscaletex(gint height,
         x = 10.0;
     tickdist = x*m;
     x = ceil(bot/tickdist)*tickdist;
-    max = top-0.999999*label_height/scale;
+    max = top - 0.999999*label_height/scale;
     prec = gwy_3d_step_to_prec(tickdist/format->magnitude);
     /* prec computation ends here */
 
@@ -2872,18 +2945,15 @@ gwy_3d_fmscaletex(gint height,
 
     l = MAX(layw1, layw2);
     tick = zoom*GWY_3D_TICK_LENGTH; /* physical tick length */
-    lw = 1;/* line width */
     fmw = 18*zoom;
-    width = fmw + 2*lw + l + 2*zoom + tick + 2;
+    *width = fmw + 2*line_width + l + 2*zoom + tick + 2;
 
     cairo_surface_destroy(surf);
     cairo_destroy(cr);
 
-    cr = gwy_cairo_create_cairo_context(uppow2(width), uppow2(height), &surf);
-    *rw = width;
-    *rh = height;
+    cr = gwy_cairo_create_cairo_context(uppow2(*width), uppow2(height), &surf);
     pango_cairo_update_layout(cr, layout);
-    cairo_set_line_width(cr, lw);
+    cairo_set_line_width(cr, line_width);
 
     gwy_3d_format_layout(layout, s, "%.*f", prec, bot/format->magnitude);
 
@@ -2897,7 +2967,7 @@ gwy_3d_fmscaletex(gint height,
         if ((x-bot)*scale < label_height) {
             x += tickdist;
             /* cairo_translate(cr, 0, -tickdist*scale); */
-        };
+        }
 
         cairo_translate(cr, 0, -(x-bot)*scale);
 
@@ -2911,8 +2981,8 @@ gwy_3d_fmscaletex(gint height,
             gwy_3d_pango_cairo_show_layout_vcentered(cr, layout);
             cairo_translate(cr, 0, -tickdist*scale);
             x += tickdist;
-        };
-    };
+        }
+    }
 
     cairo_identity_matrix(cr);
     cairo_translate(cr, fmw+2, label_height+0.5);
@@ -2937,28 +3007,11 @@ gwy_3d_fmscaletex(gint height,
     cairo_fill(cr);
     cairo_pattern_destroy(pattern);
 
-    cairo_set_source_rgba(cr, 0, 0, 0, 1);
-    cairo_rectangle(cr, 0,  0, fmw, size);
+    cairo_set_source_rgb(cr, 0, 0, 0);
+    cairo_rectangle(cr, 0, 0, fmw, size);
     cairo_stroke(cr);
-    /*    samples = gwy_gradient_get_samples(gradient, &nsamples);
-    pixels = cairo_image_surface_get_data(surf);
-    rowstride = cairo_image_surface_get_stride(surf);
-    for (y = 0; y < size; y++) {
-        gint j, k, yi;
-        guchar *row;
-
-        yi = inverted ? size-1 - y : y;
-        row = pixels
-            + rowstride*(label_height+yi)
-            + 4*(int) lw;
-        k = nsamples-1 - floor(nsamples*y/size);
-        for (j = 0; j < fmw; j++) {
-          row[4*j + 2] = samples[4*k];
-          row[4*j + 1] = samples[4*k + 1];
-          row[4*j + 0] = samples[4*k + 2];
-        }
-    }
-    */
+
+    cairo_surface_flush(surf);
 
     gwy_si_unit_value_format_free(format);
     g_object_unref(layout);
@@ -2974,41 +3027,54 @@ gwy_3d_draw_fmscaletex(Gwy3DView *view)
 {
     gint height = GTK_WIDGET(view)->allocation.height;
     gint width = GTK_WIDGET(view)->allocation.width;
-    gint size = (gint)(sqrt(MIN(width, height))*0.8);
-    cairo_surface_t* surf;
+    gint fontsize = (gint)(sqrt(MIN(width, height))*0.8);
+    gint reduced_height, actual_width, he;
+    cairo_surface_t *surf;
+    Gwy3DSetup *setup = view->setup;
     gdouble min, max;
     gboolean noticks;
     GwySIUnit *zunit;
     GwyLayerBasic *blayer;
+    GwyDataField *dfield;
+
+    /* XXX: This function requires view->ovlays[0] to be present.  Is is always
+     * satisfied when we can get here?  */
+    g_return_val_if_fail(view->ovlays[0], 0);
+
+    reduced_height = GWY_ROUND(height * setup->fmscale_size);
+    if (reduced_height < 12)
+        return 0;
 
     glTranslatef(width, 0, 0);
+    glColor3f(1.0, 1.0, 1.0);
 
     blayer = GWY_LAYER_BASIC(view->ovlays[0]);
     gwy_layer_basic_get_range(blayer, &min, &max);
     noticks = (gwy_layer_basic_get_range_type(blayer)
                == GWY_LAYER_BASIC_RANGE_ADAPT);
 
-    /* XXX: This requires view->ovlays[0] to be present.  Is is always
-     * satisfied when we can get here?  */
-    zunit = gwy_data_field_get_si_unit_z(GWY_DATA_FIELD(view->ovlays[0]->data_field));
-    surf = gwy_3d_fmscaletex(height,
-                             min,
-                             max,
-                             size,
+    dfield = GWY_DATA_FIELD(view->ovlays[0]->data_field);
+    zunit = gwy_data_field_get_si_unit_z(dfield);
+    surf = gwy_3d_fmscaletex(reduced_height, min, max,
+                             fontsize, sqrt(setup->line_width),
                              zunit,
                              view->gradient,
-                             FALSE,
-                             &width, &height, noticks);
+                             FALSE,   /* FIXME: When it should be TRUE? */
+                             &actual_width, noticks);
 
     gwy_3d_cairo_to_tex(cairo_image_surface_get_data(surf),
-                        width,
-                        height,
+                        actual_width,
+                        reduced_height,
                         cairo_image_surface_get_stride(surf));
 
-    gwy_3d_draw_ctex(0, 2, 2, width, height);
+    he = GWY_ROUND((1.0 - setup->fmscale_yalign) * (height - reduced_height));
+    glTranslatef(0, he, 0);
+
+    gwy_3d_draw_ctex(0, GWY_3D_JUST_RIGHT_EDGE, GWY_3D_JUST_BOTTOM_EDGE,
+                     actual_width, reduced_height);
     cairo_surface_destroy(surf);
 
-    return width;
+    return actual_width;
 }
 
 /**
diff --git a/libgwydgets/gwy3dwindow.c b/libgwydgets/gwy3dwindow.c
index 42453a6..2acf542 100644
--- a/libgwydgets/gwy3dwindow.c
+++ b/libgwydgets/gwy3dwindow.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: gwy3dwindow.c 19037 2016-10-08 10:40:49Z yeti-dn $
- *  Copyright (C) 2004-2016 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: gwy3dwindow.c 20263 2017-08-12 11:13:26Z yeti-dn $
+ *  Copyright (C) 2004-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -50,7 +50,7 @@
 #define ZOOM_FACTOR 1.3195
 
 enum {
-    DEFAULT_WIDTH = 550,
+    DEFAULT_WIDTH = 620,
     DEFAULT_HEIGHT = 360,
 };
 
@@ -58,90 +58,96 @@ enum {
     N_BUTTONS = GWY_3D_MOVEMENT_LIGHT + 1
 };
 
-static void     gwy_3d_window_destroy              (GtkObject *object);
-static void     gwy_3d_window_finalize             (GObject *object);
-static GdkWindowEdge gwy_3d_window_get_grip_edge   (Gwy3DWindow *gwy3dwindow);
-static void     gwy_3d_window_get_grip_rect        (Gwy3DWindow *gwy3dwindow,
-                                                    GdkRectangle *rect);
-static void     gwy_3d_window_set_grip_cursor      (Gwy3DWindow *gwy3dwindow);
-static void     gwy_3d_window_create_resize_grip   (Gwy3DWindow *gwy3dwindow);
-static void     gwy_3d_window_direction_changed    (GtkWidget *widget,
-                                                    GtkTextDirection prev_dir);
-static void     gwy_3d_window_destroy_resize_grip  (Gwy3DWindow *gwy3dwindow);
-static gboolean gwy_3d_window_configure            (GtkWidget *widget,
-                                                    GdkEventConfigure *event);
-static void     gwy_3d_window_realize              (GtkWidget *widget);
-static void     gwy_3d_window_unrealize            (GtkWidget *widget);
-static void     gwy_3d_window_map                  (GtkWidget *widget);
-static void     gwy_3d_window_unmap                (GtkWidget *widget);
-static gboolean gwy_3d_window_button_press         (GtkWidget *widget,
-                                                    GdkEventButton *event);
-static gboolean gwy_3d_window_key_pressed          (GtkWidget *widget,
-                                                    GdkEventKey *event);
-static gboolean gwy_3d_window_expose               (GtkWidget *widget,
-                                                    GdkEventExpose *event);
-static void     gwy_3d_window_resize               (Gwy3DWindow *gwy3dwindow,
-                                                    gint zoomtype);
-static void     gwy_3d_window_pack_buttons         (Gwy3DWindow *gwy3dwindow,
-                                                    guint offset,
-                                                    GtkBox *box);
-static void     gwy_3d_window_setup_adj_changed    (GtkAdjustment *adj,
-                                                    Gwy3DSetup *setup);
-static void     gwy_3d_window_adj_setup_changed    (Gwy3DSetup *setup,
-                                                    GParamSpec *pspec,
-                                                    GtkAdjustment *adj);
-static GtkWidget* gwy_3d_window_build_basic_tab    (Gwy3DWindow *window);
-static GtkWidget* gwy_3d_window_build_visual_tab   (Gwy3DWindow *window);
-static GtkWidget* gwy_3d_window_build_label_tab    (Gwy3DWindow *window);
-static void     gwy_3d_window_set_mode             (gpointer userdata,
-                                                    GtkWidget *button);
-static void     gwy_3d_window_set_gradient         (GtkTreeSelection *selection,
-                                                    Gwy3DWindow *gwy3dwindow);
-static void     gwy_3d_window_set_material         (GtkTreeSelection *selection,
-                                                    Gwy3DWindow *gwy3dwindow);
-static void     gwy_3d_window_select_controls      (gpointer data,
-                                                    GtkWidget *button);
-static void     gwy_3d_window_set_labels           (GtkWidget *combo,
-                                                    Gwy3DWindow *gwy3dwindow);
-static void     gwy_3d_window_label_adj_changed    (GtkAdjustment *adj,
-                                                    Gwy3DWindow *window);
-static void     gwy_3d_window_projection_changed   (GtkToggleButton *check,
-                                                    Gwy3DWindow *window);
-static void     gwy_3d_window_show_axes_changed    (GtkToggleButton *check,
-                                                    Gwy3DWindow *window);
-static void     gwy_3d_window_hide_masked_changed  (GtkToggleButton *check,
-                                                    Gwy3DWindow *window);
-static void     gwy_3d_window_show_labels_changed  (GtkToggleButton *check,
-                                                    Gwy3DWindow *window);
-static void     gwy_3d_window_show_fmscale_changed (GtkToggleButton *check,
-                                                    Gwy3DWindow *window);
-static void     gwy_3d_window_display_mode_changed (GtkWidget *item,
-                                                    Gwy3DWindow *window);
-static void     gwy_3d_window_set_visualization    (Gwy3DWindow *window,
-                                                    Gwy3DVisualization visual);
-static void     gwy_3d_window_visualization_changed(Gwy3DSetup *setup,
-                                                    GParamSpec *pspec,
-                                                    Gwy3DWindow *window);
-static void     gwy_3d_window_auto_scale_changed   (GtkToggleButton *check,
-                                                    Gwy3DWindow *window);
-static void     gwy_3d_window_labels_entry_activate(GtkEntry *entry,
-                                                    Gwy3DWindow *window);
-static void     gwy_3d_window_labels_reset_clicked (Gwy3DWindow *window);
-static void     gwy_3d_window_reset_visualisation  (Gwy3DWindow *window);
-static void     gwy_3d_window_set_tooltip          (GtkWidget *widget,
-                                                    const gchar *tip_text);
-static gboolean gwy_3d_window_view_clicked         (GtkWidget *gwy3dwindow,
-                                                    GdkEventButton *event,
-                                                    GtkWidget *gwy3dview);
-static void     gwy_3d_window_visual_selected      (GtkWidget *item,
-                                                    Gwy3DWindow *gwy3dwindow);
-static void     gwy_3d_window_gradient_selected    (GtkWidget *item,
-                                                    Gwy3DWindow *gwy3dwindow);
-static void     gwy_3d_window_material_selected    (GtkWidget *item,
-                                                    Gwy3DWindow *gwy3dwindow);
-static void     gwy_3d_window_set_zscale           (Gwy3DWindow *window);
-static void     update_physcale_entry              (Gwy3DWindow *window,
-                                                    GtkAdjustment *adj);
+static void          gwy_3d_window_destroy              (GtkObject *object);
+static void          gwy_3d_window_finalize             (GObject *object);
+static GdkWindowEdge gwy_3d_window_get_grip_edge        (Gwy3DWindow *gwy3dwindow);
+static void          gwy_3d_window_get_grip_rect        (Gwy3DWindow *gwy3dwindow,
+                                                         GdkRectangle *rect);
+static void          gwy_3d_window_set_grip_cursor      (Gwy3DWindow *gwy3dwindow);
+static void          gwy_3d_window_create_resize_grip   (Gwy3DWindow *gwy3dwindow);
+static void          gwy_3d_window_direction_changed    (GtkWidget *widget,
+                                                         GtkTextDirection prev_dir);
+static void          gwy_3d_window_destroy_resize_grip  (Gwy3DWindow *gwy3dwindow);
+static gboolean      gwy_3d_window_configure            (GtkWidget *widget,
+                                                         GdkEventConfigure *event);
+static void          gwy_3d_window_realize              (GtkWidget *widget);
+static void          gwy_3d_window_unrealize            (GtkWidget *widget);
+static void          gwy_3d_window_map                  (GtkWidget *widget);
+static void          gwy_3d_window_unmap                (GtkWidget *widget);
+static gboolean      gwy_3d_window_button_press         (GtkWidget *widget,
+                                                         GdkEventButton *event);
+static gboolean      gwy_3d_window_key_pressed          (GtkWidget *widget,
+                                                         GdkEventKey *event);
+static gboolean      gwy_3d_window_expose               (GtkWidget *widget,
+                                                         GdkEventExpose *event);
+static void          gwy_3d_window_resize               (Gwy3DWindow *gwy3dwindow,
+                                                         gint zoomtype);
+static void          gwy_3d_window_pack_buttons         (Gwy3DWindow *gwy3dwindow,
+                                                         guint offset,
+                                                         GtkBox *box);
+static void          gwy_3d_window_setup_adj_changed    (GtkAdjustment *adj,
+                                                         Gwy3DSetup *setup);
+static void          gwy_3d_window_adj_setup_changed    (Gwy3DSetup *setup,
+                                                         GParamSpec *pspec,
+                                                         GtkAdjustment *adj);
+static GtkWidget*    gwy_3d_window_build_basic_tab      (Gwy3DWindow *window);
+static GtkWidget*    gwy_3d_window_build_visual_tab     (Gwy3DWindow *window);
+static GtkWidget*    gwy_3d_window_build_label_tab      (Gwy3DWindow *window);
+static GtkWidget*    gwy_3d_window_build_colorbar_tab   (Gwy3DWindow *window);
+static void          gwy_3d_window_set_mode             (gpointer userdata,
+                                                         GtkWidget *button);
+static void          gwy_3d_window_set_gradient         (GtkTreeSelection *selection,
+                                                         Gwy3DWindow *gwy3dwindow);
+static void          gwy_3d_window_set_material         (GtkTreeSelection *selection,
+                                                         Gwy3DWindow *gwy3dwindow);
+static void          gwy_3d_window_select_controls      (gpointer data,
+                                                         GtkWidget *button);
+static void          gwy_3d_window_set_labels           (GtkWidget *combo,
+                                                         Gwy3DWindow *gwy3dwindow);
+static void          gwy_3d_window_label_adj_changed    (GtkAdjustment *adj,
+                                                         Gwy3DWindow *window);
+static void          gwy_3d_window_projection_changed   (GtkToggleButton *check,
+                                                         Gwy3DWindow *window);
+static void          gwy_3d_window_show_axes_changed    (GtkToggleButton *check,
+                                                         Gwy3DWindow *window);
+static void          gwy_3d_window_hide_masked_changed  (GtkToggleButton *check,
+                                                         Gwy3DWindow *window);
+static void          gwy_3d_window_show_labels_changed  (GtkToggleButton *check,
+                                                         Gwy3DWindow *window);
+static void          gwy_3d_window_fmscale_rspace_changed(GtkToggleButton *check,
+                                                         Gwy3DWindow *window);
+static void          gwy_3d_window_show_fmscale_changed (GtkToggleButton *check,
+                                                         Gwy3DWindow *window);
+static void          gwy_3d_window_display_mode_changed (GtkWidget *item,
+                                                         Gwy3DWindow *window);
+static void          gwy_3d_window_set_visualization    (Gwy3DWindow *window,
+                                                         Gwy3DVisualization visual);
+static void          gwy_3d_window_visualization_changed(Gwy3DSetup *setup,
+                                                         GParamSpec *pspec,
+                                                         Gwy3DWindow *window);
+static void          gwy_3d_window_auto_scale_changed   (GtkToggleButton *check,
+                                                         Gwy3DWindow *window);
+static void          gwy_3d_window_label_size_eq_changed(GtkToggleButton *check,
+                                                         Gwy3DWindow *window);
+static void          gwy_3d_window_labels_entry_activate(GtkEntry *entry,
+                                                         Gwy3DWindow *window);
+static void          gwy_3d_window_labels_reset_clicked (Gwy3DWindow *window);
+static void          gwy_3d_window_reset_visualisation  (Gwy3DWindow *window);
+static void          gwy_3d_window_set_tooltip          (GtkWidget *widget,
+                                                         const gchar *tip_text);
+static gboolean      gwy_3d_window_view_clicked         (GtkWidget *gwy3dwindow,
+                                                         GdkEventButton *event,
+                                                         GtkWidget *gwy3dview);
+static void          gwy_3d_window_visual_selected      (GtkWidget *item,
+                                                         Gwy3DWindow *gwy3dwindow);
+static void          gwy_3d_window_gradient_selected    (GtkWidget *item,
+                                                         Gwy3DWindow *gwy3dwindow);
+static void          gwy_3d_window_material_selected    (GtkWidget *item,
+                                                         Gwy3DWindow *gwy3dwindow);
+static void          gwy_3d_window_set_zscale           (Gwy3DWindow *window);
+static void          update_physcale_entry              (Gwy3DWindow *window,
+                                                         GtkAdjustment *adj);
+static void          sync_other_labels_to_current       (Gwy3DWindow *window);
 
 /* These are actually class data.  To put them to Class struct someone would
  * have to do class_ref() and live with this reference to the end of time. */
@@ -210,20 +216,20 @@ gwy_3d_window_destroy(GtkObject *object)
 
         setup = gwy_3d_view_get_setup(GWY_3D_VIEW(gwy3dwindow->gwy3dview));
         g_signal_handlers_disconnect_matched(setup,
-                                     G_SIGNAL_MATCH_FUNC
-                                     | G_SIGNAL_MATCH_DATA,
-                                     0, 0, NULL,
-                                     gwy_3d_window_visualization_changed,
-                                     gwy3dwindow);
+                                             G_SIGNAL_MATCH_FUNC
+                                             | G_SIGNAL_MATCH_DATA,
+                                             0, 0, NULL,
+                                             gwy_3d_window_visualization_changed,
+                                             gwy3dwindow);
 
         while (gwy3dwindow->setup_adjustments) {
             adj = GTK_ADJUSTMENT(gwy3dwindow->setup_adjustments->data);
             g_signal_handlers_disconnect_matched(setup,
-                                         G_SIGNAL_MATCH_FUNC
-                                         | G_SIGNAL_MATCH_DATA,
-                                         0, 0, NULL,
-                                         gwy_3d_window_adj_setup_changed,
-                                         adj);
+                                                 G_SIGNAL_MATCH_FUNC
+                                                 | G_SIGNAL_MATCH_DATA,
+                                                 0, 0, NULL,
+                                                 gwy_3d_window_adj_setup_changed,
+                                                 adj);
             gwy3dwindow->setup_adjustments
                 = g_slist_remove(gwy3dwindow->setup_adjustments, adj);
         }
@@ -327,7 +333,6 @@ gwy_3d_window_direction_changed(GtkWidget *widget,
     Gwy3DWindow *gwy3dwindow = GWY_3D_WINDOW(widget);
 
     gwy_3d_window_set_grip_cursor(gwy3dwindow);
-    /* FIXME: must switch More/Less icons too */
 }
 
 static void
@@ -566,7 +571,7 @@ gwy_3d_window_pack_buttons(Gwy3DWindow *gwy3dwindow,
     const buttons[] = {
         {
             GWY_3D_MOVEMENT_ROTATION,
-            GWY_STOCK_ROTATE,
+            GWY_STOCK_ROTATE_3D,
             N_("Rotate view (R)")
         },
         {
@@ -620,9 +625,7 @@ gwy_3d_window_new(Gwy3DView *gwy3dview)
 {
     Gwy3DWindow *gwy3dwindow;
     GtkWidget *vbox, *hbox, *hbox2, *button;
-    GtkTextDirection direction;
 
-    gwy_debug("");
     g_return_val_if_fail(GWY_IS_3D_VIEW(gwy3dview), NULL);
 
     if (!adj_property_quark) {
@@ -634,7 +637,6 @@ gwy_3d_window_new(Gwy3DView *gwy3dview)
     gtk_window_set_wmclass(GTK_WINDOW(gwy3dwindow), "data",
                            g_get_application_name());
     gtk_window_set_resizable(GTK_WINDOW(gwy3dwindow), TRUE);
-    direction = gtk_widget_get_direction(GTK_WIDGET(gwy3dwindow));
 
     gwy3dwindow->buttons = g_new0(GtkWidget*, 2*N_BUTTONS);
     gwy3dwindow->in_update = FALSE;
@@ -659,9 +661,7 @@ gwy_3d_window_new(Gwy3DView *gwy3dview)
     gtk_box_pack_start(GTK_BOX(gwy3dwindow->vbox_small), button,
                        FALSE, FALSE, 0);
     gtk_container_add(GTK_CONTAINER(button),
-                      gtk_image_new_from_stock(direction == GTK_TEXT_DIR_LTR
-                                               ? GWY_STOCK_LESS
-                                               : GWY_STOCK_MORE,
+                      gtk_image_new_from_stock(GWY_STOCK_MORE,
                                                GTK_ICON_SIZE_LARGE_TOOLBAR));
     gwy_3d_window_set_tooltip(button, _("Show full controls"));
     g_object_set_data(G_OBJECT(button), "gwy3dwindow", gwy3dwindow);
@@ -686,9 +686,7 @@ gwy_3d_window_new(Gwy3DView *gwy3dview)
     gtk_box_pack_end(GTK_BOX(hbox2), button, FALSE, FALSE, 0);
 
     gtk_container_add(GTK_CONTAINER(button),
-                      gtk_image_new_from_stock(direction == GTK_TEXT_DIR_LTR
-                                               ? GWY_STOCK_MORE
-                                               : GWY_STOCK_LESS,
+                      gtk_image_new_from_stock(GWY_STOCK_LESS,
                                                GTK_ICON_SIZE_LARGE_TOOLBAR));
     gwy_3d_window_set_tooltip(button, _("Hide full controls"));
     g_object_set_data(G_OBJECT(button), "gwy3dwindow", gwy3dwindow);
@@ -718,6 +716,11 @@ gwy_3d_window_new(Gwy3DView *gwy3dview)
     gtk_notebook_append_page(GTK_NOTEBOOK(gwy3dwindow->notebook),
                              vbox, gtk_label_new(_("Labels")));
 
+    /* Colorbar table */
+    vbox = gwy_3d_window_build_colorbar_tab(gwy3dwindow);
+    gtk_notebook_append_page(GTK_NOTEBOOK(gwy3dwindow->notebook),
+                             vbox, gtk_label_new(_("Colorbar")));
+
     gtk_widget_show_all(hbox);
 
     gtk_window_set_default_size(GTK_WINDOW(gwy3dwindow),
@@ -761,7 +764,15 @@ gwy_3d_window_adj_setup_changed(Gwy3DSetup *setup,
     id = g_signal_handler_find(adj, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
                                0, 0, 0, gwy_3d_window_setup_adj_changed, setup);
     g_signal_handler_block(adj, id);
-    gtk_adjustment_set_value(adj, rad2deg ? 180.0/G_PI*value : value);
+    if (rad2deg) {
+        value *= 180.0/G_PI;
+        if (value < -180.0 || value > 180.0) {
+            value = fmod(value, 360.0);
+            if (value < -180.0)
+                value += 360.0;
+        }
+    }
+    gtk_adjustment_set_value(adj, value);
     g_signal_handler_unblock(adj, id);
 }
 
@@ -823,27 +834,27 @@ gwy_3d_window_build_basic_tab(Gwy3DWindow *window)
     row = 0;
 
     adj = gwy_3d_window_make_setup_adj(window, setup, "rotation-x",
-                                       -G_MAXDOUBLE, G_MAXDOUBLE, 1.0, 15.0,
-                                       TRUE);
-    spin = gwy_table_attach_spinbutton(table, row++, _("φ:"), _("deg"), adj);
+                                       -180.0, 180.0, 1.0, 15.0, TRUE);
+    spin = gwy_table_attach_adjbar(table, row++, _("φ:"), _("deg"),
+                                   adj, GWY_HSCALE_LINEAR);
 
     adj = gwy_3d_window_make_setup_adj(window, setup, "rotation-y",
-                                       -G_MAXDOUBLE, G_MAXDOUBLE, 1.0, 15.0,
-                                       TRUE);
-    spin = gwy_table_attach_spinbutton(table, row++,
-                                       _("θ:"), _("deg"), adj);
+                                       -180.0, 180.0, 1.0, 15.0, TRUE);
+    spin = gwy_table_attach_adjbar(table, row++, _("θ:"), _("deg"),
+                                   adj, GWY_HSCALE_LINEAR);
 
     adj = gwy_3d_window_make_setup_adj(window, setup, "scale",
                                        0.05, 10.0, 0.01, 0.1,
                                        FALSE);
-    spin = gwy_table_attach_spinbutton(table, row++, _("_Scale:"), NULL, adj);
+    spin = gwy_table_attach_adjbar(table, row++, _("_Scale:"), NULL,
+                                   adj, GWY_HSCALE_LOG);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2);
 
     adj = gwy_3d_window_make_setup_adj(window, setup, "z-scale",
                                        0.001, 100.0, 0.001, 1.0,
                                        FALSE);
-    spin = gwy_table_attach_spinbutton(table, row++,
-                                       _("_Value scale:"), NULL, adj);
+    spin = gwy_table_attach_adjbar(table, row++, _("_Value scale:"), NULL,
+                                   adj, GWY_HSCALE_LOG);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 5);
     g_signal_connect_swapped(adj, "value-changed",
                              G_CALLBACK(update_physcale_entry), window);
@@ -871,10 +882,9 @@ gwy_3d_window_build_basic_tab(Gwy3DWindow *window)
 
     /* The range and step is what seems typically supported. */
     adj = gwy_3d_window_make_setup_adj(window, setup, "line-width",
-                                       1.0, 10.0, 0.1, 1.0,
-                                       FALSE);
-    spin = gwy_table_attach_spinbutton(table, row++,
-                                       _("Line _width:"), "px", adj);
+                                       1.0, 10.0, 0.1, 1.0, FALSE);
+    spin = gwy_table_attach_adjbar(table, row++, _("Line _width:"), _("px"),
+                                   adj, GWY_HSCALE_LINEAR);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 1);
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
@@ -882,7 +892,7 @@ gwy_3d_window_build_basic_tab(Gwy3DWindow *window)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
                                  setup->axes_visible);
     gtk_table_attach(GTK_TABLE(table), check,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(check, "toggled",
                      G_CALLBACK(gwy_3d_window_show_axes_changed), window);
     row++;
@@ -891,25 +901,16 @@ gwy_3d_window_build_basic_tab(Gwy3DWindow *window)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
                                  setup->labels_visible);
     gtk_table_attach(GTK_TABLE(table), check,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(check, "toggled",
                      G_CALLBACK(gwy_3d_window_show_labels_changed), window);
     row++;
 
-    check = gtk_check_button_new_with_mnemonic(_("Show false _colorbar"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
-                                 setup->fmscale_visible);
-    gtk_table_attach(GTK_TABLE(table), check,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
-    g_signal_connect(check, "toggled",
-                     G_CALLBACK(gwy_3d_window_show_fmscale_changed), window);
-    row++;
-
     check = gtk_check_button_new_with_mnemonic(_("_Orthographic projection"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
                                  !setup->projection);
     gtk_table_attach(GTK_TABLE(table), check,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(check, "toggled",
                      G_CALLBACK(gwy_3d_window_projection_changed), window);
     row++;
@@ -918,7 +919,7 @@ gwy_3d_window_build_basic_tab(Gwy3DWindow *window)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
                                  setup->hide_masked);
     gtk_table_attach(GTK_TABLE(table), check,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(check, "toggled",
                      G_CALLBACK(gwy_3d_window_hide_masked_changed), window);
     row++;
@@ -985,33 +986,15 @@ gwy_3d_window_build_visual_tab(Gwy3DWindow *window)
                                window,
                                setup->visualization);
 
-    gtk_table_attach(GTK_TABLE(table),
-                     GTK_WIDGET(window->visual_mode_group->data),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
-    row++;
-
-    gtk_table_attach(GTK_TABLE(table),
-                     GTK_WIDGET(window->visual_mode_group->next->data),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
-    row++;
-
-    gtk_table_attach(GTK_TABLE(table),
-                     GTK_WIDGET(window->visual_mode_group->next->next->data),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
-    row++;
-
-    gtk_table_attach(GTK_TABLE(table),
-                     GTK_WIDGET(window->visual_mode_group->next->next->next->data),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
-    row++;
-
+    row = gwy_radio_buttons_attach_to_table(window->visual_mode_group,
+                                            GTK_TABLE(table), 2, row);
 
     label = gtk_label_new_with_mnemonic(_("_Material:"));
     window->material_label = label;
     gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
     gtk_widget_set_sensitive(label, is_material);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     name = NULL;
@@ -1022,24 +1005,23 @@ gwy_3d_window_build_visual_tab(Gwy3DWindow *window)
     window->material_menu = menu;
     gtk_widget_set_sensitive(menu, is_material);
     gtk_table_attach(GTK_TABLE(table), menu,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     adj = gwy_3d_window_make_setup_adj(window, setup, "light-phi",
-                                       -G_MAXDOUBLE, G_MAXDOUBLE, 1.0, 15.0,
-                                       TRUE);
-    spin = gwy_table_attach_spinbutton(table, row++,
-                                       _("_Light φ:"), _("deg"), adj);
+                                       -180.0, 180.0, 1.0, 15.0, TRUE);
+    spin = gwy_table_attach_adjbar(table, row++, _("_Light φ:"), _("deg"),
+                                   adj, GWY_HSCALE_LINEAR);
     window->lights_spin1 = spin;
-    gtk_widget_set_sensitive(spin, light);
+    gwy_table_hscale_set_sensitive(adj, light);
 
     adj = gwy_3d_window_make_setup_adj(window, setup, "light-theta",
-                                       -G_MAXDOUBLE, G_MAXDOUBLE, 1.0, 15.0,
-                                       TRUE);
-    spin = gwy_table_attach_spinbutton(table, row++,
-                                       _("L_ight θ:"), _("deg"), adj);
+                                       -180.0, 180.0, 1.0, 15.0, TRUE);
+    spin = gwy_table_attach_adjbar(table, row++, _("L_ight θ:"), _("deg"),
+                                   adj, GWY_HSCALE_LINEAR);
     window->lights_spin2 = spin;
-    gtk_widget_set_sensitive(spin, light);
+    gwy_table_hscale_set_sensitive(adj, light);
+
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 12);
     gtk_widget_set_sensitive(window->buttons[GWY_3D_MOVEMENT_LIGHT],
                              light);
@@ -1055,12 +1037,12 @@ gwy_3d_window_build_visual_tab(Gwy3DWindow *window)
     gtk_widget_set_sensitive(menu, is_gradient || is_overlay);
     window->gradient_menu = menu;
     gtk_table_attach(GTK_TABLE(table), menu,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     window->dataov_menu = gtk_label_new(NULL);
     gtk_table_attach(GTK_TABLE(table), window->dataov_menu,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
 
@@ -1135,6 +1117,23 @@ gwy_3d_window_set_overlay_chooser(Gwy3DWindow *gwy3dwindow,
                          setup->visualization == GWY_3D_VISUALIZATION_OVERLAY);
 }
 
+static guint
+find_equal_label_size(Gwy3DWindow *window)
+{
+    Gwy3DView *view;
+    guint size_x, size_y, size_min, size_max;
+
+    view = GWY_3D_VIEW(window->gwy3dview);
+    size_x = gwy_3d_view_get_label(view, GWY_3D_VIEW_LABEL_X)->size;
+    size_y = gwy_3d_view_get_label(view, GWY_3D_VIEW_LABEL_Y)->size;
+    size_min = gwy_3d_view_get_label(view, GWY_3D_VIEW_LABEL_MIN)->size;
+    size_max = gwy_3d_view_get_label(view, GWY_3D_VIEW_LABEL_MAX)->size;
+    if (size_x == size_y && size_y == size_min && size_min == size_max)
+        return size_x;
+
+    return 0;
+}
+
 static GtkWidget*
 gwy_3d_window_build_label_tab(Gwy3DWindow *window)
 {
@@ -1155,7 +1154,7 @@ gwy_3d_window_build_label_tab(Gwy3DWindow *window)
 
     vbox = gtk_vbox_new(FALSE, 0);
 
-    table = gtk_table_new(8, 3, FALSE);
+    table = gtk_table_new(9, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -1165,31 +1164,24 @@ gwy_3d_window_build_label_tab(Gwy3DWindow *window)
     combo = gwy_enum_combo_box_new(label_entries, G_N_ELEMENTS(label_entries),
                                    G_CALLBACK(gwy_3d_window_set_labels),
                                    window, -1, TRUE);
-    gwy_table_attach_row(table, row, _("_Label:"), NULL, combo);
+    gwy_table_attach_adjbar(table, row, _("_Label:"), NULL,
+                            GTK_OBJECT(combo), GWY_HSCALE_WIDGET_NO_EXPAND);
     window->labels_menu = combo;
     row++;
 
-
-    label = gtk_label_new_with_mnemonic(_("_Text:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
     gwy3dlabel = gwy_3d_view_get_label(view, GWY_3D_VIEW_LABEL_X);
-    entry = gtk_entry_new();
+    window->labels_text = entry = gtk_entry_new();
     gtk_entry_set_max_length(GTK_ENTRY(entry), 100);
     g_signal_connect(entry, "activate",
                      G_CALLBACK(gwy_3d_window_labels_entry_activate), window);
     gtk_entry_set_text(GTK_ENTRY(entry), gwy_3d_label_get_text(gwy3dlabel));
     gtk_editable_select_region(GTK_EDITABLE(entry),
                                0, GTK_ENTRY(entry)->text_length);
-
-    gtk_table_attach(GTK_TABLE(table), entry,
-                     1, 3, row, row+1, GTK_FILL, 0, 0, 0);
-    window->labels_text = entry;
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+    gwy_table_attach_adjbar(table, row, _("_Text:"), NULL,
+                            GTK_OBJECT(entry), GWY_HSCALE_WIDGET);
     row++;
 
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gtk_label_new(_("Move label"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
@@ -1199,8 +1191,8 @@ gwy_3d_window_build_label_tab(Gwy3DWindow *window)
     adj = gtk_adjustment_new(gwy3dlabel->delta_x,
                              -1000.0, 1000.0, 1.0, 10.0, 0.0);
     g_object_set_qdata(G_OBJECT(adj), adj_property_quark, "delta-x");
-    spin = gwy_table_attach_spinbutton(table, row++, _("_Horizontally:"), "px",
-                                       adj);
+    spin = gwy_table_attach_adjbar(table, row, _("_Horizontally:"), _("px"),
+                                   adj, GWY_HSCALE_SQRT);
     window->labels_delta_x = spin;
     g_signal_connect(adj, "value-changed",
                      G_CALLBACK(gwy_3d_window_label_adj_changed), window);
@@ -1209,19 +1201,30 @@ gwy_3d_window_build_label_tab(Gwy3DWindow *window)
     adj = gtk_adjustment_new(gwy3dlabel->delta_y,
                              -1000.0, 1000.0, 1.0, 10.0, 0.0);
     g_object_set_qdata(G_OBJECT(adj), adj_property_quark, "delta-y");
-    spin = gwy_table_attach_spinbutton(table, row++, _("_Vertically:"), "px",
-                                       adj);
+    spin = gwy_table_attach_adjbar(table, row, _("_Vertically:"), _("px"),
+                                   adj, GWY_HSCALE_SQRT);
     window->labels_delta_y = spin;
     g_signal_connect(adj, "value-changed",
                      G_CALLBACK(gwy_3d_window_label_adj_changed), window);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+    row++;
+
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    check = gtk_check_button_new_with_mnemonic(_("A_ll labels have the "
+                                                 "same size"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
+                                 find_equal_label_size(window));
+    gtk_table_attach(GTK_TABLE(table), check,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    window->label_size_equal = check;
+    g_signal_connect(check, "toggled",
+                     G_CALLBACK(gwy_3d_window_label_size_eq_changed), window);
     row++;
 
     check = gtk_check_button_new_with_mnemonic(_("Scale size _automatically"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
                                  !gwy3dlabel->fixed_size);
     gtk_table_attach(GTK_TABLE(table), check,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     window->labels_autosize = check;
     g_signal_connect(check, "toggled",
                      G_CALLBACK(gwy_3d_window_auto_scale_changed), window);
@@ -1229,9 +1232,9 @@ gwy_3d_window_build_label_tab(Gwy3DWindow *window)
 
     adj = gtk_adjustment_new(gwy3dlabel->size, 1.0, 100.0, 1.0, 10.0, 0.0);
     g_object_set_qdata(G_OBJECT(adj), adj_property_quark, "size");
-    spin = gwy_table_attach_spinbutton(table, row++, _("Si_ze:"), _("pixels"),
-                                       adj);
-    gtk_widget_set_sensitive(spin, gwy3dlabel->fixed_size);
+    spin = gwy_table_attach_adjbar(table, row, _("Si_ze:"), _("px"),
+                                   adj, GWY_HSCALE_SQRT);
+    gwy_table_hscale_set_sensitive(adj, gwy3dlabel->fixed_size);
     window->labels_size = spin;
     g_signal_connect(adj, "value-changed",
                      G_CALLBACK(gwy_3d_window_label_adj_changed), window);
@@ -1250,6 +1253,69 @@ gwy_3d_window_build_label_tab(Gwy3DWindow *window)
     return vbox;
 }
 
+static GtkWidget*
+gwy_3d_window_build_colorbar_tab(Gwy3DWindow *window)
+{
+    Gwy3DView *view;
+    Gwy3DSetup *setup;
+    GtkWidget *vbox, *spin, *table, *check;
+    GtkObject *adj;
+    gint row;
+
+    view = GWY_3D_VIEW(window->gwy3dview);
+    setup = gwy_3d_view_get_setup(view);
+
+    vbox = gtk_vbox_new(FALSE, 0);
+
+    table = gtk_table_new(4, 3, FALSE);
+    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
+    gtk_table_set_col_spacings(GTK_TABLE(table), 6);
+    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
+    gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0);
+    row = 0;
+
+    check = gtk_check_button_new_with_mnemonic(_("Show false _colorbar"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
+                                 setup->fmscale_visible);
+    gtk_table_attach(GTK_TABLE(table), check,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    g_signal_connect(check, "toggled",
+                     G_CALLBACK(gwy_3d_window_show_fmscale_changed), window);
+    row++;
+
+    check = gtk_check_button_new_with_mnemonic(_("Reserve space "
+                                                 "for _colorbar"));
+    g_object_set_data(G_OBJECT(window),
+                      "gwy-3d-window-fmscale-reserve-space", check);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
+                                 setup->fmscale_reserve_space);
+    gtk_table_attach(GTK_TABLE(table), check,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    g_signal_connect(check, "toggled",
+                     G_CALLBACK(gwy_3d_window_fmscale_rspace_changed), window);
+    gtk_widget_set_sensitive(check, setup->fmscale_visible);
+    row++;
+
+    adj = gwy_3d_window_make_setup_adj(window, setup, "fmscale-size",
+                                       0.0, 1.0, 0.001, 0.1, FALSE);
+    g_object_set_data(G_OBJECT(window), "gwy-3d-window-fmscale-size", adj);
+    spin = gwy_table_attach_adjbar(table, row++, _("_Size:"), NULL,
+                                   adj, GWY_HSCALE_LINEAR);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
+    gwy_table_hscale_set_sensitive(adj, setup->fmscale_visible);
+
+    adj = gwy_3d_window_make_setup_adj(window, setup, "fmscale-y-align",
+                                       0.0, 1.0, 0.001, 0.1, FALSE);
+    g_object_set_data(G_OBJECT(window), "gwy-3d-window-fmscale-y-align", adj);
+    spin = gwy_table_attach_adjbar(table, row++,
+                                   _("_Vertical alignment:"), NULL,
+                                   adj, GWY_HSCALE_LINEAR);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
+    gwy_table_hscale_set_sensitive(adj, setup->fmscale_visible);
+
+    return vbox;
+}
+
 /**
  * gwy_3d_window_get_3d_view:
  * @gwy3dwindow: A 3D data view window.
@@ -1479,6 +1545,7 @@ static void
 gwy_3d_window_label_adj_changed(GtkAdjustment *adj,
                                 Gwy3DWindow *window)
 {
+    GtkToggleButton *check;
     Gwy3DLabel *label;
     const gchar *key;
     gdouble oldval, newval;
@@ -1491,6 +1558,10 @@ gwy_3d_window_label_adj_changed(GtkAdjustment *adj,
     newval = gtk_adjustment_get_value(adj);
     if (oldval != newval)
         g_object_set(label, key, newval, NULL);
+
+    check = GTK_TOGGLE_BUTTON(window->label_size_equal);
+    if (gtk_toggle_button_get_active(check))
+        sync_other_labels_to_current(window);
 }
 
 static void
@@ -1531,7 +1602,8 @@ gwy_3d_window_show_axes_changed(GtkToggleButton *check,
     Gwy3DSetup *setup;
 
     setup = gwy_3d_view_get_setup(GWY_3D_VIEW(window->gwy3dview));
-    g_object_set(setup, "axes-visible", gtk_toggle_button_get_active(check),
+    g_object_set(setup,
+                 "axes-visible", gtk_toggle_button_get_active(check),
                  NULL);
 }
 
@@ -1542,22 +1614,43 @@ gwy_3d_window_show_labels_changed(GtkToggleButton *check,
     Gwy3DSetup *setup;
 
     setup = gwy_3d_view_get_setup(GWY_3D_VIEW(window->gwy3dview));
-    g_object_set(setup, "labels-visible", gtk_toggle_button_get_active(check),
+    g_object_set(setup,
+                 "labels-visible", gtk_toggle_button_get_active(check),
                  NULL);
 }
 
 static void
-gwy_3d_window_show_fmscale_changed(GtkToggleButton *check,
-                                  Gwy3DWindow *window)
+gwy_3d_window_fmscale_rspace_changed(GtkToggleButton *check,
+                                     Gwy3DWindow *window)
 {
     Gwy3DSetup *setup;
 
     setup = gwy_3d_view_get_setup(GWY_3D_VIEW(window->gwy3dview));
-    g_object_set(setup, "fmscale-visible", gtk_toggle_button_get_active(check),
+    g_object_set(setup,
+                 "fmscale-reserve-space", gtk_toggle_button_get_active(check),
                  NULL);
 }
 
 static void
+gwy_3d_window_show_fmscale_changed(GtkToggleButton *check,
+                                   Gwy3DWindow *window)
+{
+    gboolean active = gtk_toggle_button_get_active(check);
+    GtkObject *adj, *button;
+    Gwy3DSetup *setup;
+
+    setup = gwy_3d_view_get_setup(GWY_3D_VIEW(window->gwy3dview));
+    g_object_set(setup, "fmscale-visible", active, NULL);
+    adj = g_object_get_data(G_OBJECT(window), "gwy-3d-window-fmscale-y-align");
+    gwy_table_hscale_set_sensitive(adj, active);
+    adj = g_object_get_data(G_OBJECT(window), "gwy-3d-window-fmscale-size");
+    gwy_table_hscale_set_sensitive(adj, active);
+    button = g_object_get_data(G_OBJECT(window),
+                               "gwy-3d-window-fmscale-reserve-space");
+    gwy_table_hscale_set_sensitive(button, active);
+}
+
+static void
 gwy_3d_window_display_mode_changed(GtkWidget *item,
                                    Gwy3DWindow *window)
 {
@@ -1581,8 +1674,9 @@ gwy_3d_window_set_visualization(Gwy3DWindow *window,
                                 Gwy3DVisualization visual)
 {
     gboolean is_material = FALSE, is_gradient = FALSE,
-        is_overlay = FALSE,
-        light = FALSE;
+             is_overlay = FALSE, light = FALSE;
+    GtkAdjustment *adj;
+
     if (visual == GWY_3D_VISUALIZATION_GRADIENT) {
         is_gradient = TRUE;
         light = FALSE;
@@ -1603,8 +1697,10 @@ gwy_3d_window_set_visualization(Gwy3DWindow *window,
     gtk_widget_set_sensitive(window->material_menu, is_material);
     gtk_widget_set_sensitive(window->material_label, is_material);
     gtk_widget_set_sensitive(window->gradient_menu, is_gradient || is_overlay);
-    gtk_widget_set_sensitive(window->lights_spin1, light);
-    gtk_widget_set_sensitive(window->lights_spin2, light);
+    adj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(window->lights_spin1));
+    gwy_table_hscale_set_sensitive(GTK_OBJECT(adj), light);
+    adj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(window->lights_spin2));
+    gwy_table_hscale_set_sensitive(GTK_OBJECT(adj), light);
     gtk_widget_set_sensitive(window->buttons[GWY_3D_MOVEMENT_LIGHT],
                              light);
     gtk_widget_set_sensitive(window->buttons[N_BUTTONS + GWY_3D_MOVEMENT_LIGHT],
@@ -1633,16 +1729,37 @@ gwy_3d_window_auto_scale_changed(GtkToggleButton *check,
 {
     Gwy3DLabel *label;
     gboolean active;
+    GtkAdjustment *adj;
     gint id;
 
     active = gtk_toggle_button_get_active(check);
-    gtk_widget_set_sensitive(window->labels_size, !active);
+    adj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(window->labels_size));
+    gwy_table_hscale_set_sensitive(GTK_OBJECT(adj), !active);
 
     id = gwy_enum_combo_box_get_active(GTK_COMBO_BOX(window->labels_menu));
     label = gwy_3d_view_get_label(GWY_3D_VIEW(window->gwy3dview), id);
     /* The check button is for the opposite of "fixed-size". */
     if (!label->fixed_size == !active)
         g_object_set(label, "fixed-size", !active, NULL);
+
+    /* Restore the size the (previously disabled) spin button is showing. */
+    if (label->fixed_size) {
+        adj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(window->labels_size));
+        gtk_adjustment_value_changed(adj);
+    }
+
+    check = GTK_TOGGLE_BUTTON(window->label_size_equal);
+    if (gtk_toggle_button_get_active(check))
+        sync_other_labels_to_current(window);
+}
+
+static void
+gwy_3d_window_label_size_eq_changed(GtkToggleButton *check, Gwy3DWindow *window)
+{
+    if (window->in_update || !gtk_toggle_button_get_active(check))
+        return;
+
+    sync_other_labels_to_current(window);
 }
 
 static void
@@ -1657,6 +1774,7 @@ gwy_3d_window_labels_entry_activate(GtkEntry *entry,
     gwy_3d_label_set_text(label, gtk_entry_get_text(entry));
 }
 
+/* This resets the current one.  Should we add also a reset-all button? */
 static void
 gwy_3d_window_labels_reset_clicked(Gwy3DWindow *window)
 {
@@ -1918,6 +2036,33 @@ update_physcale_entry(Gwy3DWindow *window, GtkAdjustment *adj)
     gtk_entry_set_text(GTK_ENTRY(window->physcale_entry), buf);
 }
 
+static void
+sync_other_labels_to_current(Gwy3DWindow *window)
+{
+    Gwy3DLabel *label;
+    gboolean fixed_size;
+    gint id, i;
+    gdouble size;
+
+    id = gwy_enum_combo_box_get_active(GTK_COMBO_BOX(window->labels_menu));
+    label = gwy_3d_view_get_label(GWY_3D_VIEW(window->gwy3dview), id);
+    size = label->size;
+    fixed_size = label->fixed_size;
+
+    for (i = 0; i < GWY_3D_VIEW_NLABELS; i++) {
+        if (i == id)
+            continue;
+
+        label = gwy_3d_view_get_label(GWY_3D_VIEW(window->gwy3dview), i);
+        if (label->size != size || label->fixed_size != fixed_size) {
+            g_object_set(label,
+                         "fixed-size", fixed_size,
+                         "size", size,
+                         NULL);
+        }
+    }
+}
+
 /************************** Documentation ****************************/
 
 /**
diff --git a/libgwydgets/gwy3dwindow.h b/libgwydgets/gwy3dwindow.h
index cb21b23..682a209 100644
--- a/libgwydgets/gwy3dwindow.h
+++ b/libgwydgets/gwy3dwindow.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwy3dwindow.h 16431 2014-07-23 12:56:36Z yeti-dn $
+ *  @(#) $Id: gwy3dwindow.h 19769 2017-05-18 08:07:41Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -71,7 +71,7 @@ struct _Gwy3DWindow {
 
     GtkWidget *dataov_menu;
     GtkWidget *physcale_entry;
-    GtkWidget *widget4;
+    GtkWidget *label_size_equal;
     GtkWidget *widget5;
 
     gboolean in_update;
diff --git a/libgwydgets/gwyadjustbar.c b/libgwydgets/gwyadjustbar.c
new file mode 100644
index 0000000..ac60a35
--- /dev/null
+++ b/libgwydgets/gwyadjustbar.c
@@ -0,0 +1,1356 @@
+/*
+ *  @(#) $Id: gwyadjustbar.c 19913 2017-06-13 12:38:25Z yeti-dn $
+ *  Copyright (C) 2012-2017 David Necas (Yeti).
+ *  E-mail: yeti at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <gtk/gtkmain.h>
+#include <gtk/gtksignal.h>
+#include <glib-object.h>
+
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libgwyddion/gwydebugobjects.h>
+#include <libprocess/datafield.h>
+#include <libdraw/gwyrgba.h>
+#include <libgwydgets/gwydgettypes.h>
+#include <libgwydgets/gwyadjustbar.h>
+
+enum {
+    PROP_0,
+    PROP_ADJUSTMENT,
+    PROP_SNAP_TO_TICKS,
+    PROP_MAPPING,
+    PROP_HAS_CHECK_BUTTON,
+    N_PROPS,
+};
+
+enum {
+    SGNL_CHANGE_VALUE,
+    N_SIGNALS
+};
+
+typedef gdouble (*MappingFunc)(gdouble value);
+
+struct _GwyAdjustBarPrivate {
+    GdkWindow *input_window;
+    GdkCursor *cursor_move;
+
+    GtkAdjustment *adjustment;
+    gulong adjustment_value_changed_id;
+    gulong adjustment_changed_id;
+    gdouble oldvalue; /* This is to avoid acting on no-change notifications. */
+    gboolean snap_to_ticks;
+    gboolean adjustment_ok;
+    gboolean dragging;
+
+    GtkWidget *check;
+    gboolean bar_sensitive;
+
+    GwyScaleMappingType mapping;
+    MappingFunc map_value;
+    MappingFunc map_position;
+    gint x;
+    gint length;
+    gdouble a;
+    gdouble b;
+};
+
+typedef struct _GwyAdjustBarPrivate AdjustBar;
+
+static void     gwy_adjust_bar_dispose       (GObject *object);
+static void     gwy_adjust_bar_finalize      (GObject *object);
+static void     gwy_adjust_bar_set_property  (GObject *object,
+                                              guint prop_id,
+                                              const GValue *value,
+                                              GParamSpec *pspec);
+static void     gwy_adjust_bar_get_property  (GObject *object,
+                                              guint prop_id,
+                                              GValue *value,
+                                              GParamSpec *pspec);
+static void     gwy_adjust_bar_forall        (GtkContainer *container,
+                                              gboolean include_internals,
+                                              GtkCallback callback,
+                                              gpointer cbdata);
+static void     gwy_adjust_bar_realize       (GtkWidget *widget);
+static void     gwy_adjust_bar_unrealize     (GtkWidget *widget);
+static void     gwy_adjust_bar_map           (GtkWidget *widget);
+static void     gwy_adjust_bar_unmap         (GtkWidget *widget);
+static void     gwy_adjust_bar_size_request  (GtkWidget *widget,
+                                              GtkRequisition *requisition);
+static void     gwy_adjust_bar_size_allocate (GtkWidget *widget,
+                                              GtkAllocation *allocation);
+static gboolean gwy_adjust_bar_expose        (GtkWidget *widget,
+                                              GdkEventExpose *expose);
+static gboolean gwy_adjust_bar_enter_notify  (GtkWidget *widget,
+                                              GdkEventCrossing *event);
+static gboolean gwy_adjust_bar_leave_notify  (GtkWidget *widget,
+                                              GdkEventCrossing *event);
+static gboolean gwy_adjust_bar_scroll        (GtkWidget *widget,
+                                              GdkEventScroll *event);
+static gboolean gwy_adjust_bar_button_press  (GtkWidget *widget,
+                                              GdkEventButton *event);
+static gboolean gwy_adjust_bar_button_release(GtkWidget *widget,
+                                              GdkEventButton *event);
+static gboolean gwy_adjust_bar_motion_notify (GtkWidget *widget,
+                                              GdkEventMotion *event);
+static GType    gwy_adjust_bar_child_type    (GtkContainer *container);
+static void     gwy_adjust_bar_change_value  (GwyAdjustBar *adjbar,
+                                              gdouble newvalue);
+static gboolean set_adjustment               (GwyAdjustBar *adjbar,
+                                              GtkAdjustment *adjustment);
+static gboolean set_snap_to_ticks            (GwyAdjustBar *adjbar,
+                                              gboolean setting);
+static gboolean set_mapping                  (GwyAdjustBar *adjbar,
+                                              GwyScaleMappingType mapping);
+static void     create_input_window          (GwyAdjustBar *adjbar);
+static void     destroy_input_window         (GwyAdjustBar *adjbar);
+static void     draw_bar                     (GwyAdjustBar *adjbar,
+                                              cairo_t *cr);
+static void     adjustment_changed           (GwyAdjustBar *adjbar,
+                                              GtkAdjustment *adjustment);
+static void     adjustment_value_changed     (GwyAdjustBar *adjbar,
+                                              GtkAdjustment *adjustment);
+static void     update_mapping               (GwyAdjustBar *adjbar);
+static gdouble  map_value_to_position        (GwyAdjustBar *adjbar,
+                                              gdouble value);
+static gdouble  map_position_to_value        (GwyAdjustBar *adjbar,
+                                              gdouble position);
+static gdouble  map_both_linear              (gdouble value);
+static void     change_value                 (GtkWidget *widget,
+                                              gdouble newposition);
+static void     ensure_cursors               (GwyAdjustBar *adjbar);
+static void     discard_cursors              (GwyAdjustBar *adjbar);
+static gdouble  snap_value                   (GwyAdjustBar *adjbar,
+                                              gdouble value);
+
+static const GtkBorder default_border = { 4, 4, 3, 3 };
+
+static GParamSpec *properties[N_PROPS];
+static guint signals[N_SIGNALS];
+
+G_DEFINE_TYPE(GwyAdjustBar, gwy_adjust_bar, GTK_TYPE_BIN);
+
+static void
+gwy_adjust_bar_class_init(GwyAdjustBarClass *klass)
+{
+    GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+    GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
+    GtkContainerClass *container_class = GTK_CONTAINER_CLASS(klass);
+    guint i;
+
+    g_type_class_add_private(klass, sizeof(AdjustBar));
+
+    gobject_class->dispose = gwy_adjust_bar_dispose;
+    gobject_class->finalize = gwy_adjust_bar_finalize;
+    gobject_class->get_property = gwy_adjust_bar_get_property;
+    gobject_class->set_property = gwy_adjust_bar_set_property;
+
+    widget_class->realize = gwy_adjust_bar_realize;
+    widget_class->unrealize = gwy_adjust_bar_unrealize;
+    widget_class->map = gwy_adjust_bar_map;
+    widget_class->unmap = gwy_adjust_bar_unmap;
+    widget_class->size_request = gwy_adjust_bar_size_request;
+    widget_class->size_allocate = gwy_adjust_bar_size_allocate;
+    widget_class->expose_event = gwy_adjust_bar_expose;
+    widget_class->enter_notify_event = gwy_adjust_bar_enter_notify;
+    widget_class->leave_notify_event = gwy_adjust_bar_leave_notify;
+    widget_class->scroll_event = gwy_adjust_bar_scroll;
+    widget_class->button_press_event = gwy_adjust_bar_button_press;
+    widget_class->button_release_event = gwy_adjust_bar_button_release;
+    widget_class->motion_notify_event = gwy_adjust_bar_motion_notify;
+
+    container_class->forall = gwy_adjust_bar_forall;
+    container_class->child_type = gwy_adjust_bar_child_type;
+
+    klass->change_value = gwy_adjust_bar_change_value;
+
+    properties[PROP_ADJUSTMENT]
+        = g_param_spec_object("adjustment",
+                              "Adjustment",
+                              "Adjustment representing the value.",
+                              GTK_TYPE_ADJUSTMENT,
+                              G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+    properties[PROP_SNAP_TO_TICKS]
+        = g_param_spec_boolean("snap-to-ticks",
+                               "Snap to ticks",
+                               "Whether only values that are multiples of step "
+                               "size are allowed.",
+                               FALSE,
+                               G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+    properties[PROP_MAPPING]
+        = g_param_spec_enum("mapping",
+                            "Mapping",
+                            "Mapping function between values and screen "
+                            "positions.",
+                            GWY_TYPE_SCALE_MAPPING_TYPE,
+                            GWY_SCALE_MAPPING_SQRT,
+                            G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+    properties[PROP_HAS_CHECK_BUTTON]
+        = g_param_spec_boolean("has-check-button",
+                               "Has check button",
+                               "Whether the adjust bar has a check button.",
+                               FALSE,
+                               G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+    for (i = 1; i < N_PROPS; i++)
+        g_object_class_install_property(gobject_class, i, properties[i]);
+
+    /**
+     * GwyAdjustBar::change-value:
+     * @gwyadjustbar: The #GwyAdjustBar which received the signal.
+     * @arg1: New value for @gwyadjustbar.
+     *
+     * The ::change-value signal is emitted when the user interactively
+     * changes the value.
+     *
+     * It is an action signal.
+     **/
+    signals[SGNL_CHANGE_VALUE]
+        = g_signal_new("change-value",
+                       G_OBJECT_CLASS_TYPE(klass),
+                       G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                       G_STRUCT_OFFSET(GwyAdjustBarClass, change_value),
+                       NULL, NULL,
+                       g_cclosure_marshal_VOID__DOUBLE,
+                       G_TYPE_NONE, 1, G_TYPE_DOUBLE);
+}
+
+static void
+gwy_adjust_bar_init(GwyAdjustBar *adjbar)
+{
+    GtkWidget *label;
+    AdjustBar *priv;
+
+    priv = adjbar->priv = G_TYPE_INSTANCE_GET_PRIVATE(adjbar,
+                                                      GWY_TYPE_ADJUST_BAR,
+                                                      AdjustBar);
+    priv->mapping = GWY_SCALE_MAPPING_SQRT;
+    priv->bar_sensitive = TRUE;
+    GTK_WIDGET_SET_FLAGS(adjbar, GTK_NO_WINDOW);
+    label = gtk_label_new(NULL);
+    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+    gtk_container_add(GTK_CONTAINER(adjbar), label);
+}
+
+static void
+gwy_adjust_bar_finalize(GObject *object)
+{
+    G_OBJECT_CLASS(gwy_adjust_bar_parent_class)->finalize(object);
+}
+
+static void
+gwy_adjust_bar_dispose(GObject *object)
+{
+    GwyAdjustBar *adjbar = GWY_ADJUST_BAR(object);
+
+    set_adjustment(adjbar, NULL);
+    G_OBJECT_CLASS(gwy_adjust_bar_parent_class)->dispose(object);
+}
+
+static void
+gwy_adjust_bar_set_property(GObject *object,
+                            guint prop_id,
+                            const GValue *value,
+                            GParamSpec *pspec)
+{
+    GwyAdjustBar *adjbar = GWY_ADJUST_BAR(object);
+
+    switch (prop_id) {
+        case PROP_ADJUSTMENT:
+        set_adjustment(adjbar, g_value_get_object(value));
+        break;
+
+        case PROP_SNAP_TO_TICKS:
+        set_snap_to_ticks(adjbar, g_value_get_boolean(value));
+        break;
+
+        case PROP_MAPPING:
+        set_mapping(adjbar, g_value_get_enum(value));
+        break;
+
+        case PROP_HAS_CHECK_BUTTON:
+        gwy_adjust_bar_set_has_check_button(adjbar, g_value_get_boolean(value));
+        break;
+
+        default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+        break;
+    }
+}
+
+static void
+gwy_adjust_bar_get_property(GObject *object,
+                            guint prop_id,
+                            GValue *value,
+                            GParamSpec *pspec)
+{
+    AdjustBar *priv = GWY_ADJUST_BAR(object)->priv;
+
+    switch (prop_id) {
+        case PROP_ADJUSTMENT:
+        g_value_set_object(value, priv->adjustment);
+        break;
+
+        case PROP_SNAP_TO_TICKS:
+        g_value_set_boolean(value, priv->snap_to_ticks);
+        break;
+
+        case PROP_MAPPING:
+        g_value_set_enum(value, priv->mapping);
+        break;
+
+        case PROP_HAS_CHECK_BUTTON:
+        g_value_set_boolean(value, !!priv->check);
+        break;
+
+        default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+        break;
+    }
+}
+
+static void
+gwy_adjust_bar_forall(GtkContainer *container, gboolean include_internals,
+                      GtkCallback callback, gpointer cbdata)
+{
+    if (include_internals) {
+        AdjustBar *priv = GWY_ADJUST_BAR(container)->priv;
+        if (priv->check)
+            (*callback)(priv->check, cbdata);
+
+    }
+    GTK_CONTAINER_CLASS(gwy_adjust_bar_parent_class)->forall(container,
+                                                             include_internals,
+                                                             callback, cbdata);
+}
+
+static void
+gwy_adjust_bar_realize(GtkWidget *widget)
+{
+    GwyAdjustBar *adjbar = GWY_ADJUST_BAR(widget);
+
+    GTK_WIDGET_CLASS(gwy_adjust_bar_parent_class)->realize(widget);
+    create_input_window(adjbar);
+}
+
+static void
+gwy_adjust_bar_unrealize(GtkWidget *widget)
+{
+    GwyAdjustBar *adjbar = GWY_ADJUST_BAR(widget);
+    AdjustBar *priv = adjbar->priv;
+
+    discard_cursors(adjbar);
+    destroy_input_window(adjbar);
+    priv->adjustment_ok = FALSE;
+    GTK_WIDGET_CLASS(gwy_adjust_bar_parent_class)->unrealize(widget);
+}
+
+static void
+gwy_adjust_bar_map(GtkWidget *widget)
+{
+    GwyAdjustBar *adjbar = GWY_ADJUST_BAR(widget);
+    AdjustBar *priv = adjbar->priv;
+    GtkWidget *check = priv->check;
+
+    GTK_WIDGET_CLASS(gwy_adjust_bar_parent_class)->map(widget);
+    if (priv->input_window)
+        gdk_window_show(priv->input_window);
+    if (check
+        && GTK_WIDGET_VISIBLE(check)
+        && gtk_widget_get_child_visible(check)
+        && !GTK_WIDGET_MAPPED(check))
+        gtk_widget_map(check);
+}
+
+static void
+gwy_adjust_bar_unmap(GtkWidget *widget)
+{
+    GwyAdjustBar *adjbar = GWY_ADJUST_BAR(widget);
+    AdjustBar *priv = adjbar->priv;
+    GtkWidget *check = priv->check;
+
+    if (check)
+        gtk_widget_unmap(check);
+    if (priv->input_window)
+        gdk_window_hide(priv->input_window);
+    GTK_WIDGET_CLASS(gwy_adjust_bar_parent_class)->unmap(widget);
+}
+
+static void
+gwy_adjust_bar_size_request(GtkWidget *widget, GtkRequisition *requisition)
+{
+    AdjustBar *priv = GWY_ADJUST_BAR(widget)->priv;
+    GtkWidget *label;
+    GtkRequisition child_req;
+    gint border_width, spacing;
+
+    requisition->width = default_border.left + default_border.right;
+    requisition->height = default_border.top + default_border.bottom;
+
+    border_width = gtk_container_get_border_width(GTK_CONTAINER(widget));
+    requisition->width += 2*border_width;
+    requisition->height += 2*border_width;
+
+    label = GTK_BIN(widget)->child;
+    if (label && GTK_WIDGET_VISIBLE(label)) {
+        gtk_widget_size_request(label, &child_req);
+        requisition->width += child_req.width;
+        requisition->height += child_req.height;
+    }
+
+    if (priv->check) {
+        gtk_widget_size_request(priv->check, &child_req);
+        requisition->width += child_req.width;
+        requisition->height = MAX(requisition->height, child_req.height);
+
+        /* Reproduce checkbutton's indicator spacing internally.  It puts two
+         * spacings between the check and label.  So use that instead of
+         * our default border. */
+        gtk_widget_style_get(priv->check, "indicator-spacing", &spacing, NULL);
+        requisition->width += 2*spacing;
+        requisition->width -= default_border.left;
+    }
+}
+
+static void
+gwy_adjust_bar_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
+{
+    AdjustBar *priv = GWY_ADJUST_BAR(widget)->priv;
+    GtkWidget *label;
+    GtkAllocation child_allocation;
+    GtkRequisition child_req;
+    gint border_width, spacing, width, h;
+
+    border_width = gtk_container_get_border_width(GTK_CONTAINER(widget));
+    widget->allocation = *allocation;
+
+    priv->x = 0;
+    width = allocation->width;
+    if (priv->check) {
+        gtk_widget_get_child_requisition(priv->check, &child_req);
+        gtk_widget_style_get(priv->check, "indicator-spacing", &spacing, NULL);
+        priv->x = child_req.width + 2*spacing - default_border.left;
+        priv->x = MAX(priv->x, 0);
+        width = MAX(width - priv->x, 1);
+
+        child_allocation.x = allocation->x;
+        child_allocation.y = allocation->y + (allocation->height
+                                              - child_req.height)/2;
+        child_allocation.width = child_req.width;
+        child_allocation.height = child_req.height;
+        gtk_widget_size_allocate(priv->check, &child_allocation);
+    }
+
+    gwy_debug("ALLOCATION %dx%d at (%d,%d)",
+              allocation->width, allocation->height,
+              allocation->x, allocation->y);
+    if (priv->input_window) {
+        gwy_debug("INPUT WINDOW %dx%d at (%d,%d)",
+                  width, allocation->height,
+                  allocation->x + priv->x, allocation->y);
+        gdk_window_move_resize(priv->input_window,
+                               allocation->x + priv->x, allocation->y,
+                               width, allocation->height);
+    }
+
+    label = GTK_BIN(widget)->child;
+    if (label && GTK_WIDGET_VISIBLE(label)) {
+        gtk_widget_get_child_requisition(label, &child_req);
+        h = child_req.height + (2*border_width
+                                + default_border.top + default_border.bottom);
+        child_allocation.x = (allocation->x + priv->x
+                              + border_width + default_border.left);
+        child_allocation.y = (allocation->y
+                              + MAX(allocation->height - h, 0)/2
+                              + border_width + default_border.top);
+        child_allocation.width = (width - 2*border_width
+                                  - default_border.left - default_border.right);
+        child_allocation.height = (allocation->height - 2*border_width
+                                   - default_border.top - default_border.bottom);
+        gtk_widget_size_allocate(label, &child_allocation);
+    }
+
+    update_mapping(GWY_ADJUST_BAR(widget));
+}
+
+static gboolean
+gwy_adjust_bar_expose(GtkWidget *widget, GdkEventExpose *event)
+{
+    if (GTK_WIDGET_DRAWABLE(widget)) {
+        GwyAdjustBar *adjbar = GWY_ADJUST_BAR(widget);
+        cairo_t *cr;
+
+        cr = gdk_cairo_create(gtk_widget_get_parent_window(widget));
+#ifdef DEBUG
+        {
+            cairo_set_source_rgba(cr, 0.1, 0.9, 0.2, 1.0);
+            cairo_rectangle(cr,
+                            widget->allocation.x, widget->allocation.y,
+                            widget->allocation.width, widget->allocation.height);
+            cairo_fill(cr);
+        }
+#endif
+        cairo_translate(cr,
+                        widget->allocation.x + adjbar->priv->x,
+                        widget->allocation.y);
+        draw_bar(adjbar, cr);
+        cairo_destroy(cr);
+    }
+    GTK_WIDGET_CLASS(gwy_adjust_bar_parent_class)->expose_event(widget, event);
+
+    return FALSE;
+}
+
+static gboolean
+gwy_adjust_bar_enter_notify(GtkWidget *widget,
+                            G_GNUC_UNUSED GdkEventCrossing *event)
+{
+    AdjustBar *priv = GWY_ADJUST_BAR(widget)->priv;
+    GtkStateType state = GTK_WIDGET_STATE(widget);
+
+    if (!priv->bar_sensitive)
+        return FALSE;
+    ensure_cursors(GWY_ADJUST_BAR(widget));
+    if (!(state & GTK_STATE_PRELIGHT))
+        gtk_widget_set_state(widget, state | GTK_STATE_PRELIGHT);
+    return FALSE;
+}
+
+static gboolean
+gwy_adjust_bar_leave_notify(GtkWidget *widget,
+                            G_GNUC_UNUSED GdkEventCrossing *event)
+{
+    AdjustBar *priv = GWY_ADJUST_BAR(widget)->priv;
+    GtkStateType state = GTK_WIDGET_STATE(widget);
+
+    if (!priv->bar_sensitive || priv->dragging)
+        return FALSE;
+    if (state & GTK_STATE_PRELIGHT)
+        gtk_widget_set_state(widget, state & ~GTK_STATE_PRELIGHT);
+    return FALSE;
+}
+
+static gboolean
+gwy_adjust_bar_scroll(GtkWidget *widget, GdkEventScroll *event)
+{
+    GdkScrollDirection dir = event->direction;
+    GwyAdjustBar *adjbar = GWY_ADJUST_BAR(widget);
+    AdjustBar *priv = adjbar->priv;
+    gdouble value, position, newposition;
+
+    if (!priv->adjustment_ok)
+        return TRUE;
+
+    value = gtk_adjustment_get_value(priv->adjustment);
+    position = map_value_to_position(adjbar, value);
+    newposition = position;
+    if (dir == GDK_SCROLL_UP || dir == GDK_SCROLL_RIGHT)
+        newposition += 1.0;
+    else
+        newposition -= 1.0;
+
+    newposition = CLAMP(newposition, 0.0, priv->length);
+    if (newposition != position)
+        change_value(widget, newposition);
+    return TRUE;
+}
+
+static gboolean
+gwy_adjust_bar_button_press(GtkWidget *widget, GdkEventButton *event)
+{
+    AdjustBar *priv = GWY_ADJUST_BAR(widget)->priv;
+
+    if (!priv->bar_sensitive || event->button != 1)
+        return FALSE;
+    priv->dragging = TRUE;
+    change_value(widget, event->x);
+    if (GTK_BIN(widget)->child)
+        gtk_widget_mnemonic_activate(GTK_BIN(widget)->child, FALSE);
+    return TRUE;
+}
+
+static gboolean
+gwy_adjust_bar_button_release(GtkWidget *widget, GdkEventButton *event)
+{
+    AdjustBar *priv = GWY_ADJUST_BAR(widget)->priv;
+
+    if (!priv->bar_sensitive || event->button != 1)
+        return FALSE;
+    change_value(widget, event->x);
+    priv->dragging = FALSE;
+    return TRUE;
+}
+
+static gboolean
+gwy_adjust_bar_motion_notify(GtkWidget *widget, GdkEventMotion *event)
+{
+    AdjustBar *priv = GWY_ADJUST_BAR(widget)->priv;
+
+    if (!priv->bar_sensitive || !(event->state & GDK_BUTTON1_MASK))
+        return FALSE;
+    change_value(widget, event->x);
+    return TRUE;
+}
+
+static GType
+gwy_adjust_bar_child_type(GtkContainer *container)
+{
+    GtkWidget *child = GTK_BIN(container)->child;
+
+    if (!child)
+        return GTK_TYPE_LABEL;
+    else
+        return G_TYPE_NONE;
+}
+
+static void
+gwy_adjust_bar_change_value(GwyAdjustBar *adjbar, gdouble newvalue)
+{
+    AdjustBar *priv = adjbar->priv;
+    gdouble value;
+
+    g_return_if_fail(priv->adjustment);
+    if (!priv->adjustment_ok)
+        return;
+
+    value = gtk_adjustment_get_value(priv->adjustment);
+    newvalue = snap_value(adjbar, newvalue);
+    if (fabs(newvalue - value) <= 1e-12*fmax(fabs(newvalue), fabs(value)))
+        return;
+
+    gtk_adjustment_set_value(priv->adjustment, newvalue);
+}
+
+/**
+ * gwy_adjust_bar_new:
+ * @adjustment: The adjustment the adjust bar should use, or %NULL.
+ * @label: Text of the adjustment bar label, or %NULL.
+ *
+ * Creates a new adjustment bar.
+ *
+ * The label text, if any, is set with mnemonic enabled.  However, you still
+ * need to assign it to a widget (presumably a #GtkSpinButton) using
+ * gtk_label_set_mnemonic_widget().
+ *
+ * Returns: A new adjustment bar.
+ *
+ * Since: 2.49
+ **/
+GtkWidget*
+gwy_adjust_bar_new(GtkAdjustment *adjustment, const gchar *label)
+{
+    GwyAdjustBar *adjbar;
+
+    if (adjustment) {
+        adjbar = g_object_new(GWY_TYPE_ADJUST_BAR,
+                              "adjustment", adjustment,
+                              NULL);
+    }
+    else
+        adjbar = g_object_newv(GWY_TYPE_ADJUST_BAR, 0, NULL);
+
+    if (label) {
+        GtkWidget *child = GTK_BIN(adjbar)->child;
+        gtk_label_set_text_with_mnemonic(GTK_LABEL(child), label);
+    }
+
+    return GTK_WIDGET(adjbar);
+}
+
+/**
+ * gwy_adjust_bar_set_adjustment:
+ * @adjbar: An adjustment bar.
+ * @adjustment: Adjustment to use for the value.
+ *
+ * Sets the adjustment that an adjustment bar visualises.
+ *
+ * Since: 2.49
+ **/
+void
+gwy_adjust_bar_set_adjustment(GwyAdjustBar *adjbar,
+                              GtkAdjustment *adjustment)
+{
+    g_return_if_fail(GWY_IS_ADJUST_BAR(adjbar));
+    g_return_if_fail(GTK_IS_ADJUSTMENT(adjustment));
+    if (!set_adjustment(adjbar, adjustment))
+        return;
+
+    g_object_notify(G_OBJECT(adjbar), "adjustment");
+}
+
+/**
+ * gwy_adjust_bar_get_adjustment:
+ * @adjbar: An adjustment bar.
+ *
+ * Obtains the adjustment that an adjustment bar visualises.
+ *
+ * Returns: The adjustment used by @adjbar.  If no adjustment was set
+ *          and the default one is used, function returns %NULL.
+ *
+ * Since: 2.49
+ **/
+GtkAdjustment*
+gwy_adjust_bar_get_adjustment(GwyAdjustBar *adjbar)
+{
+    g_return_val_if_fail(GWY_IS_ADJUST_BAR(adjbar), NULL);
+    return adjbar->priv->adjustment;
+}
+
+/**
+ * gwy_adjust_bar_set_snap_to_ticks:
+ * @adjbar: An adjustment bar.
+ * @setting: %TRUE to restrict values to multiples of step size,
+ *           %FALSE to permit any values.
+ *
+ * Sets the snapping behaviour of an adjustment bar.
+ *
+ * Note the ‘multiples of step size’ condition in fact applies to the
+ * difference from the minimum value.  The maximum adjustment value is always
+ * permissible, even if it does not satisfy this condition.  Values modified by
+ * the user (i.e.  emission of signal "change-value") are snapped, however,
+ * values set explicitly gtk_adjustment_set_value() are kept intact.
+ *
+ * Setting this option to %TRUE immediately causes an adjustment value change
+ * if it does not satisfy the condition.
+ *
+ * It is usually a poor idea to enable snapping for non-linear mappings.
+ *
+ * Since: 2.49
+ **/
+void
+gwy_adjust_bar_set_snap_to_ticks(GwyAdjustBar *adjbar,
+                                 gboolean setting)
+{
+    g_return_if_fail(GWY_IS_ADJUST_BAR(adjbar));
+    if (!set_snap_to_ticks(adjbar, setting))
+        return;
+
+    g_object_notify(G_OBJECT(adjbar), "snap-to-ticks");
+}
+
+/**
+ * gwy_adjust_bar_get_snap_to_ticks:
+ * @adjbar: An adjustment bar.
+ *
+ * Sets the snapping behaviour of an adjustment bar.
+ *
+ * Returns: %TRUE if values are restricted to multiples of step size.
+ *
+ * Since: 2.49
+ **/
+gboolean
+gwy_adjust_bar_get_snap_to_ticks(GwyAdjustBar *adjbar)
+{
+    g_return_val_if_fail(GWY_IS_ADJUST_BAR(adjbar), FALSE);
+    return !!adjbar->priv->snap_to_ticks;
+}
+
+/**
+ * gwy_adjust_bar_set_mapping:
+ * @adjbar: An adjustment bar.
+ * @mapping: Mapping function type between values and screen positions in the
+ *           adjustment bar.
+ *
+ * Sets the mapping function type for an adjustment bar.
+ *
+ * Since: 2.49
+ **/
+void
+gwy_adjust_bar_set_mapping(GwyAdjustBar *adjbar,
+                           GwyScaleMappingType mapping)
+{
+    g_return_if_fail(GWY_IS_ADJUST_BAR(adjbar));
+    if (!set_mapping(adjbar, mapping))
+        return;
+
+    g_object_notify(G_OBJECT(adjbar), "mapping");
+}
+
+/**
+ * gwy_adjust_bar_get_mapping:
+ * @adjbar: An adjustment bar.
+ *
+ * Gets the mapping function type of an adjustment bar.
+ *
+ * Returns: The type of mapping function between values and screen positions.
+ *
+ * Since: 2.49
+ **/
+GwyScaleMappingType
+gwy_adjust_bar_get_mapping(GwyAdjustBar *adjbar)
+{
+    g_return_val_if_fail(GWY_IS_ADJUST_BAR(adjbar), GWY_SCALE_MAPPING_LINEAR);
+    return adjbar->priv->mapping;
+}
+
+/**
+ * gwy_adjust_bar_set_has_check_button:
+ * @adjbar: An adjustment bar.
+ * @setting: %TRUE to enable a check button; %FALSE to disable it.
+ *
+ * Sets whether an adjustment bar has a check button.
+ *
+ * Since: 2.49
+ **/
+void
+gwy_adjust_bar_set_has_check_button(GwyAdjustBar *adjbar, gboolean setting)
+{
+    AdjustBar *priv;
+
+    g_return_if_fail(GWY_IS_ADJUST_BAR(adjbar));
+    priv = adjbar->priv;
+    if (!setting == !priv->check)
+        return;
+
+    if (setting) {
+        priv->check = gtk_check_button_new();
+        gtk_widget_set_parent(priv->check, GTK_WIDGET(adjbar));
+        gtk_widget_set_name(priv->check, "gwyadjbarcheck");
+        /* FIXME: Should do even if we are hidden? */
+        gtk_widget_show(priv->check);
+    }
+    else {
+        gtk_widget_destroy(priv->check);
+        priv->check = NULL;
+    }
+
+    if (GTK_WIDGET_VISIBLE(GTK_WIDGET(adjbar)))
+        gtk_widget_queue_resize(GTK_WIDGET(adjbar));
+
+    g_object_notify(G_OBJECT(adjbar), "has-check-button");
+}
+
+/**
+ * gwy_adjust_bar_get_has_check_button:
+ * @adjbar: An adjustment bar.
+ *
+ * Reports whether an adjustment bar has a check button.
+ *
+ * Returns: %TRUE if the adjustment bar has a check button.
+ *
+ * Since: 2.49
+ **/
+gboolean
+gwy_adjust_bar_get_has_check_button(GwyAdjustBar *adjbar)
+{
+    g_return_val_if_fail(GWY_IS_ADJUST_BAR(adjbar), FALSE);
+    return !!adjbar->priv->check;
+}
+
+/**
+ * gwy_adjust_bar_get_label:
+ * @adjbar: An adjustment bar.
+ *
+ * Gets the label widget inside an adjustment bar.
+ *
+ * Use gtk_label_set_mnemonic_widget() to set the mnemonic widget for the label
+ * or change the label text.
+ *
+ * Returns: The label widget.
+ *
+ * Since: 2.49
+ **/
+GtkWidget*
+gwy_adjust_bar_get_label(GwyAdjustBar *adjbar)
+{
+    g_return_val_if_fail(GWY_IS_ADJUST_BAR(adjbar), NULL);
+    return GTK_BIN(adjbar)->child;
+}
+
+/**
+ * gwy_adjust_bar_get_check_button:
+ * @adjbar: An adjustment bar.
+ *
+ * Gets the check button of an adjustment bar.
+ *
+ * Connect to the "toggled" signal of the check button.  Modifying it is not
+ * recommended.
+ *
+ * Returns: The check button widget, or %NULL if there is none.
+ *
+ * Since: 2.49
+ **/
+GtkWidget*
+gwy_adjust_bar_get_check_button(GwyAdjustBar *adjbar)
+{
+    g_return_val_if_fail(GWY_IS_ADJUST_BAR(adjbar), NULL);
+    return adjbar->priv->check;
+}
+
+/**
+ * gwy_adjust_bar_set_bar_sensitive:
+ * @adjbar: An adjustment bar.
+ * @sensitive: %TRUE to make the widget's bar sensitive.
+ *
+ * Sets the sensitivity of an adjustment bar.
+ *
+ * The bar's sensitivity can be controlled separately.  This is useful when
+ * @adjbar has a check button because otherwise the bar is the entire widget
+ * and the function is not different from gtk_widget_set_sensitive().
+ * However, if you want to enable and disable the adjustment bar via the check
+ * button, use this function instead of gtk_widget_set_sensitive() which would
+ * make insensitive also the check button.
+ *
+ * Since: 2.49
+ **/
+void
+gwy_adjust_bar_set_bar_sensitive(GwyAdjustBar *adjbar, gboolean sensitive)
+{
+    GtkWidget *widget;
+    AdjustBar *priv;
+
+    g_return_if_fail(GWY_IS_ADJUST_BAR(adjbar));
+    priv = adjbar->priv;
+    if (!priv->bar_sensitive == !sensitive)
+        return;
+
+    priv->bar_sensitive = sensitive;
+    if (sensitive) {
+        gtk_widget_set_sensitive(GTK_BIN(adjbar)->child, TRUE);
+        if (priv->input_window)
+            ensure_cursors(adjbar);
+    }
+    else {
+        if (priv->input_window) {
+            gdk_window_set_cursor(priv->input_window, NULL);
+            discard_cursors(adjbar);
+        }
+        gtk_widget_set_sensitive(GTK_BIN(adjbar)->child, FALSE);
+    }
+
+    widget = GTK_WIDGET(adjbar);
+    if (GTK_WIDGET_DRAWABLE(widget))
+        gtk_widget_queue_draw(widget);
+}
+
+/**
+ * gwy_adjust_bar_get_bar_sensitive:
+ * @adjbar: An adjustment bar.
+ *
+ * Reports whether an adjustment bar is sensitive.
+ *
+ * See gwy_adjust_bar_set_bar_sensitive() for discussion.
+ *
+ * Returns: %TRUE if the widget's bar is sensitive.
+ *
+ * Since: 2.49
+ **/
+gboolean
+gwy_adjust_bar_get_bar_sensitive(GwyAdjustBar *adjbar)
+{
+    g_return_val_if_fail(GWY_IS_ADJUST_BAR(adjbar), FALSE);
+    return adjbar->priv->bar_sensitive;
+}
+
+static gboolean
+set_adjustment(GwyAdjustBar *adjbar,
+               GtkAdjustment *adjustment)
+{
+    AdjustBar *priv = adjbar->priv;
+    if (!gwy_set_member_object(adjbar, adjustment, GTK_TYPE_ADJUSTMENT,
+                               &priv->adjustment,
+                               "changed", &adjustment_changed,
+                               &priv->adjustment_changed_id,
+                               G_CONNECT_SWAPPED,
+                               "value-changed", &adjustment_value_changed,
+                               &priv->adjustment_value_changed_id,
+                               G_CONNECT_SWAPPED,
+                               NULL))
+        return FALSE;
+
+    update_mapping(adjbar);
+    gtk_widget_queue_draw(GTK_WIDGET(adjbar));
+    return TRUE;
+}
+
+static gboolean
+set_snap_to_ticks(GwyAdjustBar *adjbar,
+                  gboolean setting)
+{
+    AdjustBar *priv = adjbar->priv;
+    if (!setting == !priv->snap_to_ticks)
+        return FALSE;
+
+    priv->snap_to_ticks = !!setting;
+    if (setting && priv->adjustment) {
+        gdouble value = gtk_adjustment_get_value(priv->adjustment);
+        gdouble snapped = snap_value(adjbar, value);
+        if (fabs(snapped - value) > 1e-12*fmax(fabs(snapped), fabs(value)))
+            gtk_adjustment_set_value(priv->adjustment, snapped);
+    }
+
+    return TRUE;
+}
+
+static gboolean
+set_mapping(GwyAdjustBar *adjbar,
+            GwyScaleMappingType mapping)
+{
+    AdjustBar *priv = adjbar->priv;
+    if (mapping == priv->mapping)
+        return FALSE;
+
+    if (mapping > GWY_SCALE_MAPPING_LOG) {
+        g_warning("Wrong scale mapping %u.", mapping);
+        return FALSE;
+    }
+
+    priv->mapping = mapping;
+    update_mapping(adjbar);
+    gtk_widget_queue_draw(GTK_WIDGET(adjbar));
+    return TRUE;
+}
+
+static void
+create_input_window(GwyAdjustBar *adjbar)
+{
+    AdjustBar *priv = adjbar->priv;
+    GtkWidget *widget = GTK_WIDGET(adjbar);
+    GtkAllocation *allocation = &widget->allocation;
+    GdkWindowAttr attributes;
+    gint attributes_mask;
+
+    g_return_if_fail(GTK_WIDGET_REALIZED(widget));
+    if (priv->input_window)
+        return;
+
+    attributes.x = allocation->x + priv->x;
+    attributes.y = allocation->y;
+    attributes.width = priv->length;
+    attributes.height = allocation->height;
+    attributes.window_type = GDK_WINDOW_CHILD;
+    attributes.wclass = GDK_INPUT_ONLY;
+    attributes.event_mask = (gtk_widget_get_events(widget)
+                             | GDK_BUTTON_PRESS_MASK
+                             | GDK_BUTTON_RELEASE_MASK
+                             | GDK_ENTER_NOTIFY_MASK
+                             | GDK_LEAVE_NOTIFY_MASK
+                             | GDK_SCROLL_MASK
+                             | GDK_POINTER_MOTION_MASK
+                             | GDK_POINTER_MOTION_HINT_MASK);
+    attributes_mask = GDK_WA_X | GDK_WA_Y;
+    gwy_debug("CREATE INPUT WINDOW %dx%d at (%d,%d)",
+              attributes.width, attributes.height, attributes.x, attributes.y);
+    priv->input_window = gdk_window_new(gtk_widget_get_parent_window(widget),
+                                        &attributes, attributes_mask);
+    gdk_window_set_user_data(priv->input_window, widget);
+}
+
+static void
+destroy_input_window(GwyAdjustBar *adjbar)
+{
+    AdjustBar *priv = adjbar->priv;
+
+    if (!priv->input_window)
+        return;
+    gwy_debug("DESTROY INPUT WINDOW");
+    gdk_window_destroy(priv->input_window);
+    priv->input_window = NULL;
+}
+
+static void
+draw_bar(GwyAdjustBar *adjbar, cairo_t *cr)
+{
+    AdjustBar *priv = adjbar->priv;
+    GtkWidget *widget = GTK_WIDGET(adjbar);
+    GtkStateType state = GTK_WIDGET_STATE(widget);
+    gdouble height = widget->allocation.height;
+    gdouble width = priv->length;
+    gdouble val, barlength = 0.0;
+    GwyRGBA base_color = { 0.3, 0.6, 1.0, 1.0 }, fcolor, bcolor;
+    GwyRGBA bgcolor = { 1.0, 1.0, 1.0, 1.0 };
+
+    if ((state & GTK_STATE_INSENSITIVE) || !priv->bar_sensitive) {
+        base_color.a *= 0.4;
+        bgcolor.a *= 0.4;
+    }
+    fcolor = bcolor = base_color;
+    fcolor.a *= (state & GTK_STATE_PRELIGHT) ? 0.5 : 0.333;
+    bgcolor.a *= (state & GTK_STATE_PRELIGHT) ? 0.5 : 0.333;
+
+    if (priv->adjustment_ok) {
+        val = gtk_adjustment_get_value(priv->adjustment);
+        barlength = map_value_to_position(adjbar, val);
+    }
+
+    if (width > 2.0 && height > 2.0) {
+        cairo_set_source_rgba(cr, bgcolor.r, bgcolor.g, bgcolor.b, bgcolor.a);
+        cairo_rectangle(cr, 1.0, 1.0, width-2.0, height-2.0);
+        cairo_fill(cr);
+    }
+
+    if (barlength < 0.5)
+        return;
+
+    cairo_set_line_width(cr, 1.0);
+    if (barlength > 2.0) {
+        cairo_rectangle(cr, 0.0, 0.0, barlength, height);
+        cairo_set_source_rgba(cr, fcolor.r, fcolor.g, fcolor.b, fcolor.a);
+        cairo_fill(cr);
+
+        cairo_rectangle(cr, 0.5, 0.5, barlength-1.0, height-1.0);
+        cairo_set_source_rgba(cr, bcolor.r, bcolor.g, bcolor.b, bcolor.a);
+        cairo_stroke(cr);
+    }
+    else {
+        cairo_rectangle(cr, 0, 0, barlength, height);
+        cairo_set_source_rgba(cr, bcolor.r, bcolor.g, bcolor.b, bcolor.a);
+        cairo_fill(cr);
+    }
+}
+
+static void
+adjustment_changed(GwyAdjustBar *adjbar,
+                   G_GNUC_UNUSED GtkAdjustment *adjustment)
+{
+    update_mapping(adjbar);
+    gtk_widget_queue_draw(GTK_WIDGET(adjbar));
+}
+
+static void
+adjustment_value_changed(GwyAdjustBar *adjbar,
+                         GtkAdjustment *adjustment)
+{
+    AdjustBar *priv = adjbar->priv;
+    gdouble newvalue;
+
+    if (!priv->adjustment_ok)
+        return;
+
+    newvalue = gtk_adjustment_get_value(adjustment);
+    if (newvalue == priv->oldvalue)
+        return;
+
+    priv->oldvalue = newvalue;
+    gtk_widget_queue_draw(GTK_WIDGET(adjbar));
+}
+
+static gdouble
+ssqrt(gdouble x)
+{
+    return (x < 0.0) ? -sqrt(fabs(x)) : sqrt(x);
+}
+
+static gdouble
+ssqr(gdouble x)
+{
+    return x*fabs(x);
+}
+
+static void
+update_mapping(GwyAdjustBar *adjbar)
+{
+    AdjustBar *priv = adjbar->priv;
+    gdouble lower, upper;
+
+    priv->adjustment_ok = FALSE;
+    if (!priv->adjustment)
+        return;
+
+    lower = priv->adjustment->lower;
+    upper = priv->adjustment->upper;
+
+    if (gwy_isinf(lower) || gwy_isnan(lower)
+        || gwy_isinf(upper) || gwy_isnan(upper))
+        return;
+
+    if (priv->mapping == GWY_SCALE_MAPPING_LOG) {
+        if (lower <= 0.0 || upper <= 0.0)
+            return;
+    }
+
+    priv->length = GTK_WIDGET(adjbar)->allocation.width - priv->x;
+    if (priv->length < 2)
+        return;
+
+    if (priv->mapping == GWY_SCALE_MAPPING_LINEAR)
+        priv->map_value = priv->map_position = map_both_linear;
+    else if (priv->mapping == GWY_SCALE_MAPPING_SQRT) {
+        priv->map_value = ssqrt;
+        priv->map_position = ssqr;
+    }
+    else if (priv->mapping == GWY_SCALE_MAPPING_LOG) {
+        priv->map_value = log;
+        priv->map_position = exp;
+    }
+    priv->b = priv->map_value(lower);
+    priv->a = (priv->map_value(upper) - priv->b)/priv->length;
+    if (gwy_isinf(priv->a) || gwy_isnan(priv->a) || !priv->a
+        || gwy_isinf(priv->b) || gwy_isnan(priv->b))
+        return;
+
+    priv->adjustment_ok = TRUE;
+}
+
+static gdouble
+map_value_to_position(GwyAdjustBar *adjbar, gdouble value)
+{
+    AdjustBar *priv = adjbar->priv;
+
+    return (priv->map_value(value) - priv->b)/priv->a;
+}
+
+static gdouble
+map_position_to_value(GwyAdjustBar *adjbar, gdouble position)
+{
+    AdjustBar *priv = adjbar->priv;
+
+    return priv->map_position(priv->a*position + priv->b);
+}
+
+static gdouble
+map_both_linear(gdouble value)
+{
+    return value;
+}
+
+static void
+change_value(GtkWidget *widget, gdouble newposition)
+{
+    GwyAdjustBar *adjbar = GWY_ADJUST_BAR(widget);
+    AdjustBar *priv = adjbar->priv;
+    gdouble value, newvalue;
+
+    if (!priv->adjustment_ok)
+        return;
+
+    value = gtk_adjustment_get_value(priv->adjustment);
+    newposition = CLAMP(newposition, 0.0, priv->length);
+    newvalue = map_position_to_value(adjbar, newposition);
+    if (newvalue != value)
+        g_signal_emit(adjbar, signals[SGNL_CHANGE_VALUE], 0, newvalue);
+}
+
+static void
+ensure_cursors(GwyAdjustBar *adjbar)
+{
+    AdjustBar *priv = adjbar->priv;
+    GdkDisplay *display;
+
+    if (priv->cursor_move)
+        return;
+
+    display = gtk_widget_get_display(GTK_WIDGET(adjbar));
+    priv->cursor_move = gdk_cursor_new_for_display(display,
+                                                   GDK_SB_H_DOUBLE_ARROW);
+    gdk_window_set_cursor(priv->input_window, priv->cursor_move);
+}
+
+static void
+discard_cursors(GwyAdjustBar *adjbar)
+{
+    AdjustBar *priv = adjbar->priv;
+
+    if (priv->cursor_move) {
+        gdk_cursor_unref(priv->cursor_move);
+        priv->cursor_move = NULL;
+    }
+}
+
+static gdouble
+snap_value(GwyAdjustBar *adjbar, gdouble value)
+{
+    AdjustBar *priv = adjbar->priv;
+    gdouble step, lower, upper, m;
+
+    if (!priv->adjustment || !priv->snap_to_ticks)
+        return value;
+
+    step = priv->adjustment->step_increment;
+    if (!step)
+        return value;
+
+    lower = priv->adjustment->lower;
+    upper = priv->adjustment->upper;
+    m = 0.5*fmin(step, upper - lower);
+    if (value >= upper - m)
+        return upper;
+
+    value = GWY_ROUND((value - lower)/step)*step + lower;
+    if (value > upper)
+        value -= step;
+    if (value < lower)
+        value = lower;
+
+    return value;
+}
+
+/**
+ * SECTION: gwyadjustbar
+ * @title: GwyAdjustBar
+ * @short_description: Compact adjustment visualisation and modification
+ *
+ * #GwyAdjustBar is a compact widget for visualisation and modification of the
+ * value of an #GtkAdjustment.  It can contains a label with an overlaid bar
+ * that can be clicked, dragged or modified by the scroll-wheel by the user.
+ * Since the widget does not take keyboard focus, it should be paired with a
+ * #GtkSpinButton, sharing the same adjustment.  This spin button would also be
+ * the typical mnemonic widget for the adjustment bar.
+ *
+ * #GwyAdjustBar supports several different types of mapping between screen
+ * positions and values of the underlying adjustment.  Nevertheless, the
+ * default mapping (signed square root, %GWY_SCALE_MAPPING_SQRT) should fit
+ * most situations.
+ **/
+
+/**
+ * GwyAdjustBar:
+ *
+ * Adjustment bar widget visualising an adjustment.
+ *
+ * The #GwyAdjustBar struct contains private data only and should be accessed
+ * using the functions below.
+ *
+ * Since: 2.49
+ **/
+
+/**
+ * GwyAdjustBarClass:
+ *
+ * Class of adjustment bars visualising adjustments.
+ *
+ * Since: 2.49
+ **/
+
+/**
+ * GwyScaleMappingType:
+ * @GWY_SCALE_MAPPING_LINEAR: Linear mapping between values and screen
+ *                            positions.  This recommended for signed additive
+ *                            quantities of a limited range.
+ * @GWY_SCALE_MAPPING_SQRT: Screen positions correspond to ‘signed square
+ *                          roots’ of the value.  This is the
+ *                          recommended general-purpose default mapping type as
+ *                          it works with both signed and usigned quantities
+ *                          and offers good sensitivity for both large and
+ *                          small values.
+ * @GWY_SCALE_MAPPING_LOG: Screen positions correspond to logarithms of values.
+ *                         The adjustment range must contain only positive
+ *                         values.  For quantities of extreme ranges this
+ *                         mapping may be preferred to %GWY_SCALE_MAPPING_SQRT.
+ *
+ * Type of adjustment bar mapping functions.
+ *
+ * Since: 2.49
+ **/
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/libgwydgets/gwyadjustbar.h b/libgwydgets/gwyadjustbar.h
new file mode 100644
index 0000000..d718961
--- /dev/null
+++ b/libgwydgets/gwyadjustbar.h
@@ -0,0 +1,85 @@
+/*
+ *  @(#) $Id: gwyadjustbar.h 19899 2017-06-11 07:07:40Z yeti-dn $
+ *  Copyright (C) 2012-2017 David Necas (Yeti).
+ *  E-mail: yeti at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GWY_ADJUST_BAR_H__
+#define __GWY_ADJUST_BAR_H__
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+typedef enum {
+    GWY_SCALE_MAPPING_LINEAR = 0,
+    GWY_SCALE_MAPPING_SQRT   = 1,
+    GWY_SCALE_MAPPING_LOG    = 2,
+} GwyScaleMappingType;
+
+#define GWY_TYPE_ADJUST_BAR            (gwy_adjust_bar_get_type())
+#define GWY_ADJUST_BAR(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), GWY_TYPE_ADJUST_BAR, GwyAdjustBar))
+#define GWY_ADJUST_BAR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), GWY_TYPE_ADJUST_BAR, GwyAdjustBarClass))
+#define GWY_IS_ADJUST_BAR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), GWY_TYPE_ADJUST_BAR))
+#define GWY_IS_ADJUST_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GWY_TYPE_ADJUST_BAR))
+#define GWY_ADJUST_BAR_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), GWY_TYPE_ADJUST_BAR, GwyAdjustBarClass))
+
+typedef struct _GwyAdjustBar      GwyAdjustBar;
+typedef struct _GwyAdjustBarClass GwyAdjustBarClass;
+
+struct _GwyAdjustBar {
+    GtkBin bin;
+    struct _GwyAdjustBarPrivate *priv;
+};
+
+struct _GwyAdjustBarClass {
+    /*<private>*/
+    GtkBinClass bin_class;
+
+    void (*change_value)(GwyAdjustBar *adjbar, gdouble value);
+
+    void (*reserved1)(void);
+    void (*reserved2)(void);
+};
+
+GType               gwy_adjust_bar_get_type            (void)                         G_GNUC_CONST;
+GtkWidget*          gwy_adjust_bar_new                 (GtkAdjustment *adjustment,
+                                                        const gchar *label);
+void                gwy_adjust_bar_set_adjustment      (GwyAdjustBar *adjbar,
+                                                        GtkAdjustment *adjustment);
+GtkAdjustment*      gwy_adjust_bar_get_adjustment      (GwyAdjustBar *adjbar);
+void                gwy_adjust_bar_set_snap_to_ticks   (GwyAdjustBar *adjbar,
+                                                        gboolean setting);
+gboolean            gwy_adjust_bar_get_snap_to_ticks   (GwyAdjustBar *adjbar);
+void                gwy_adjust_bar_set_mapping         (GwyAdjustBar *adjbar,
+                                                        GwyScaleMappingType mapping);
+GwyScaleMappingType gwy_adjust_bar_get_mapping         (GwyAdjustBar *adjbar);
+void                gwy_adjust_bar_set_has_check_button(GwyAdjustBar *adjbar,
+                                                        gboolean setting);
+gboolean            gwy_adjust_bar_get_has_check_button(GwyAdjustBar *adjbar);
+void                gwy_adjust_bar_set_bar_sensitive   (GwyAdjustBar *adjbar,
+                                                        gboolean sensitive);
+gboolean            gwy_adjust_bar_get_bar_sensitive   (GwyAdjustBar *adjbar);
+GtkWidget*          gwy_adjust_bar_get_label           (GwyAdjustBar *adjbar);
+GtkWidget*          gwy_adjust_bar_get_check_button    (GwyAdjustBar *adjbar);
+
+G_END_DECLS
+
+#endif
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/libgwydgets/gwyaxisdialog.c b/libgwydgets/gwyaxisdialog.c
index 3d07284..b1bc6b4 100644
--- a/libgwydgets/gwyaxisdialog.c
+++ b/libgwydgets/gwyaxisdialog.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwyaxisdialog.c 18206 2016-01-24 22:16:43Z yeti-dn $
+ *  @(#) $Id: gwyaxisdialog.c 19922 2017-06-17 12:16:45Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -27,24 +27,8 @@
 #include <libgwydgets/gwyscitext.h>
 #include <libgwydgets/gwyaxisdialog.h>
 
-static gboolean gwy_axis_dialog_delete    (GtkWidget *widget,
-                                           GdkEventAny *event);
-/*
-static void     major_length_changed_cb   (GtkAdjustment *adj,
-                                           GObject *axis);
-static void     major_thickness_changed_cb(GtkAdjustment *adj,
-                                           GObject *axis);
-static void     major_maxticks_changed_cb (GtkAdjustment *adj,
-                                           GObject *axis);
-static void     minor_length_changed_cb   (GtkAdjustment *adj,
-                                           GObject *axis);
-static void     minor_thickness_changed_cb(GtkAdjustment *adj,
-                                           GObject *axis);
-static void     minor_division_changed_cb (GtkAdjustment *adj,
-                                           GObject *axis);
-static void     autoscale_changed_cb      (GtkToggleButton *button,
-                                           GwyAxisDialog *dialog);
-*/
+static gboolean gwy_axis_dialog_delete(GtkWidget *widget,
+                                       GdkEventAny *event);
 
 G_DEFINE_TYPE(GwyAxisDialog, _gwy_axis_dialog, GTK_TYPE_DIALOG)
 
@@ -59,14 +43,12 @@ _gwy_axis_dialog_class_init(GwyAxisDialogClass *klass)
 static void
 _gwy_axis_dialog_init(G_GNUC_UNUSED GwyAxisDialog *dialog)
 {
-    gwy_debug("");
 }
 
 static gboolean
 gwy_axis_dialog_delete(GtkWidget *widget,
                        G_GNUC_UNUSED GdkEventAny *event)
 {
-    gwy_debug("");
     gtk_widget_hide(widget);
 
     return TRUE;
@@ -86,19 +68,11 @@ _gwy_axis_dialog_new(GwyAxis *axis)
     GwyAxisDialog *dialog;
     GtkWidget *label, *table;
     gint row;
-    /*
-    gint row;
-    gboolean is_auto;
-    */
 
-    gwy_debug("");
     dialog = GWY_AXIS_DIALOG(g_object_new(GWY_TYPE_AXIS_DIALOG, NULL));
     dialog->axis = axis;
 
-    if (dialog->axis)
-        gtk_window_set_title(GTK_WINDOW(dialog), _("Axis Properties"));
-    else
-        gtk_window_set_title(GTK_WINDOW(dialog), _("Label Properties"));
+    gtk_window_set_title(GTK_WINDOW(dialog), _("Axis Properties"));
 
     gtk_dialog_add_button(GTK_DIALOG(dialog),
                           GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
@@ -111,76 +85,6 @@ _gwy_axis_dialog_new(GwyAxis *axis)
     gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table);
     row = 0;
 
-    /*
-    label = gwy_label_new_header(_("Axis Settings"));
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    row++;
-
-    g_object_get(dialog->axis, "auto", &is_auto, NULL);
-    dialog->is_auto = gtk_check_button_new_with_mnemonic(_("_Autoscale"));
-    gtk_table_attach(GTK_TABLE(table), dialog->is_auto,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    g_signal_connect(dialog->is_auto, "toggled",
-                     G_CALLBACK(autoscale_changed_cb), dialog);
-    row++;
-
-    g_object_get(dialog->axis, "major-maxticks", &i, NULL);
-    dialog->major_division = gtk_adjustment_new(i, 1, 50, 1, 5, 0);
-    dialog->major_division_spin
-        = gwy_table_attach_hscale(table, row, _("Major division:"), NULL,
-                                  dialog->major_division, 0);
-    g_signal_connect(dialog->major_division, "value-changed",
-                     G_CALLBACK(major_maxticks_changed_cb), dialog->axis);
-    row++;
-
-    g_object_get(dialog->axis, "major-thickness", &i, NULL);
-    dialog->major_thickness = gtk_adjustment_new(i, 1, 10, 1, 5, 0);
-    gwy_table_attach_spinbutton(table, row, _("Major thickness:"), NULL,
-                                dialog->major_thickness);
-    g_signal_connect(dialog->major_thickness, "value-changed",
-                     G_CALLBACK(major_thickness_changed_cb), dialog->axis);
-    row++;
-
-    g_object_get(dialog->axis, "major-length", &i, NULL);
-    dialog->major_length = gtk_adjustment_new(i, 1, 20, 1, 5, 0);
-    gwy_table_attach_spinbutton(table, row, _("Major length:"), NULL,
-                                dialog->major_length);
-    g_signal_connect(dialog->major_length, "value-changed",
-                 G_CALLBACK(major_length_changed_cb), dialog->axis);
-    row++;
-
-    g_object_get(dialog->axis, "minor-division", &i, NULL);
-    dialog->minor_division = gtk_adjustment_new(i, 1, 20, 1, 5, 0);
-    dialog->minor_division_spin
-        = gwy_table_attach_spinbutton(table, row, _("Minor division:"),
-                                      NULL,
-                                      dialog->minor_division);
-    g_signal_connect(dialog->minor_division, "value-changed",
-                     G_CALLBACK(minor_division_changed_cb), dialog->axis);
-    row++;
-
-    g_object_get(dialog->axis, "minor-thickness", &i, NULL);
-    dialog->minor_thickness = gtk_adjustment_new(i, 1, 10, 1, 5, 0);
-    gwy_table_attach_spinbutton(table, row, _("Minor thickness:"), NULL,
-                                dialog->minor_thickness);
-    g_signal_connect(dialog->minor_thickness, "value-changed",
-                     G_CALLBACK(minor_thickness_changed_cb), dialog->axis);
-    row++;
-
-    g_object_get(dialog->axis, "minor-length", &i, NULL);
-    dialog->minor_length = gtk_adjustment_new(i, 1, 20, 1, 5, 0);
-    gwy_table_attach_spinbutton(table, row, _("Minor length:"), NULL,
-                                dialog->minor_length);
-    g_signal_connect(dialog->minor_length, "value-changed",
-                     G_CALLBACK(minor_length_changed_cb), dialog->axis);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
-    row++;
-
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->is_auto),
-                                 is_auto);
-    */
-
     label = gwy_label_new_header(_("Label Text"));
     gtk_table_attach(GTK_TABLE(table), label,
                      0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
@@ -202,62 +106,6 @@ _gwy_axis_dialog_get_sci_text(GtkWidget* dialog)
 }
 
 /*
-static void
-major_length_changed_cb(GtkAdjustment *adj, GObject *axis)
-{
-    g_object_set(axis, "major-length", gwy_adjustment_get_int(adj), NULL);
-}
-
-static void
-major_maxticks_changed_cb(GtkAdjustment *adj, GObject *axis)
-{
-    g_object_set(axis, "major-maxticks", gwy_adjustment_get_int(adj), NULL);
-}
-
-static void
-major_thickness_changed_cb(GtkAdjustment *adj, GObject *axis)
-{
-    g_object_set(axis, "major-thickness", gwy_adjustment_get_int(adj), NULL);
-}
-
-static void
-minor_length_changed_cb(GtkAdjustment *adj, GObject *axis)
-{
-    g_object_set(axis, "minor-length", gwy_adjustment_get_int(adj), NULL);
-}
-
-static void
-minor_thickness_changed_cb(GtkAdjustment *adj, GObject *axis)
-{
-    g_object_set(axis, "minor-thickness", gwy_adjustment_get_int(adj), NULL);
-}
-
-static void
-minor_division_changed_cb(GtkAdjustment *adj, GObject *axis)
-{
-    g_object_set(axis, "minor-division", gwy_adjustment_get_int(adj), NULL);
-}
-
-
-static void
-autoscale_changed_cb(GtkToggleButton *button, GwyAxisDialog *dialog)
-{
-    gboolean is_auto;
-
-    is_auto = gtk_toggle_button_get_active(button);
-
-    gtk_widget_set_sensitive(GTK_WIDGET(dialog->minor_division_spin), !is_auto);
-    gtk_widget_set_sensitive(GTK_WIDGET(dialog->major_division_spin), !is_auto);
-
-    g_object_set(dialog->axis, "auto", is_auto, NULL);
-    g_object_set(dialog->axis, "major-maxticks",
-                 gwy_adjustment_get_int(dialog->major_division), NULL);
-    g_object_set(dialog->axis, "minor-division",
-                 gwy_adjustment_get_int(dialog->minor_division), NULL);
-}
-*/
-
-/*
  * SECTION:gwyaxisdialog
  * @title: GwyAxisDialog
  * @short_description: Axis properties dialog
diff --git a/libgwydgets/gwycombobox.c b/libgwydgets/gwycombobox.c
index 9fcc709..c87f50f 100644
--- a/libgwydgets/gwycombobox.c
+++ b/libgwydgets/gwycombobox.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwycombobox.c 18289 2016-02-18 20:46:34Z yeti-dn $
+ *  @(#) $Id: gwycombobox.c 20070 2017-07-12 07:48:27Z yeti-dn $
  *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -449,10 +449,7 @@ render_curve_colour(G_GNUC_UNUSED GtkCellLayout *layout,
     g_return_if_fail(gcmodel);
 
     g_object_get(gcmodel, "color", &color, NULL);
-    pixel = 0xff
-        | ((guint32)(guchar)floor(255.99999*color->b) << 8)
-        | ((guint32)(guchar)floor(255.99999*color->g) << 16)
-        | ((guint32)(guchar)floor(255.99999*color->r) << 24);
+    pixel = 0xff | gwy_rgba_to_pixbuf_pixel(color);
     gwy_rgba_free(color);
     gdk_pixbuf_fill(pixbuf, pixel);
 }
diff --git a/libgwydgets/gwydataview.c b/libgwydgets/gwydataview.c
index 1d02b85..42ee1ec 100644
--- a/libgwydgets/gwydataview.c
+++ b/libgwydgets/gwydataview.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: gwydataview.c 19037 2016-10-08 10:40:49Z yeti-dn $
- *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: gwydataview.c 19491 2017-02-24 09:35:27Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -1213,6 +1213,8 @@ gwy_data_view_coords_xy_clamp(GwyDataView *data_view,
     }
 }
 
+/* XXX: This functions should have a return value saying whether the line
+ * intersect the area at all.  But cannot do this without changing the API. */
 /**
  * gwy_data_view_coords_xy_cut_line:
  * @data_view: A data view.
@@ -1249,15 +1251,19 @@ gwy_data_view_coords_xy_cut_line(GwyDataView *data_view,
 
     /* Horizontal/vertical lines */
     if (*x1scr == *x0scr) {
+        if (*x0scr != x0s)
+            goto fail;
         *y0scr = y0s;
         *y1scr = y1s;
+        return;
     }
     if (*y1scr == *y0scr) {
+        if (*y0scr != y0s)
+            goto fail;
         *x0scr = x0s;
         *x1scr = x1s;
-    }
-    if (*y1scr == *y0scr || *x1scr == *x0scr)
         return;
+    }
 
     /* The hard case */
     x0s = *x0scr;
@@ -1298,18 +1304,20 @@ gwy_data_view_coords_xy_cut_line(GwyDataView *data_view,
         i1 = i;
     }
 
-    /* The line does not intersect the boundary at all.  Just return something
-     * and pray... */
-    if (i0 == -1) {
-        *x0scr = *x1scr = xsize/2;
-        *y0scr = *y1scr = ysize/2;
-        return;
-    }
+    if (i0 == -1)
+        goto fail;
 
     *x0scr = GWY_ROUND(x0s + t[i0]*(x1s - x0s));
     *x1scr = GWY_ROUND(x0s + t[i1]*(x1s - x0s));
     *y0scr = GWY_ROUND(y0s + t[i0]*(y1s - y0s));
     *y1scr = GWY_ROUND(y0s + t[i1]*(y1s - y0s));
+    return;
+
+fail:
+    /* The line does not intersect the boundary at all.  Just return something
+     * and pray... */
+    *x0scr = *x1scr = xsize/2;
+    *y0scr = *y1scr = ysize/2;
 }
 
 /**
diff --git a/libgwydgets/gwydgetenums.c b/libgwydgets/gwydgetenums.c
index b78948f..4b7d6d0 100644
--- a/libgwydgets/gwydgetenums.c
+++ b/libgwydgets/gwydgetenums.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwydgetenums.c 18878 2016-08-24 17:22:53Z yeti-dn $
+ *  @(#) $Id: gwydgetenums.c 19924 2017-06-17 12:57:41Z yeti-dn $
  *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -111,19 +111,26 @@ gwy_graph_curve_type_get_enum(void)
 /**
  * GwyHScaleStyle:
  * @GWY_HSCALE_DEFAULT: Default label, hscale, spinbutton, and units widget
- *                      row.
- * @GWY_HSCALE_LOG: Hscale is logarithmic.
- * @GWY_HSCALE_SQRT: Hscale is square root.
- * @GWY_HSCALE_NO_SCALE: There is no hscale.
- * @GWY_HSCALE_WIDGET: An user-specified widget is used in place of hscale and
- *                     spinbutton.
+ *                      row.  Note that the default mapping is linear for
+ *                      hscales but signed square root for adjust bars.
+ * @GWY_HSCALE_LOG: The scale mapping is logarithmic.
+ * @GWY_HSCALE_SQRT: The scale mapping is signed square root.
+ * @GWY_HSCALE_LINEAR: The scale mapping is linear.  (Since 2.49)
+ * @GWY_HSCALE_NO_SCALE: There is no hscale/adjust bar.
+ * @GWY_HSCALE_WIDGET: An user-specified widget is used in place of the
+ *                     adjustment control(s).
  * @GWY_HSCALE_WIDGET_NO_EXPAND: An user-specified widget is used in place of
  *                               hscale and spinbutton, and it is left-aligned
  *                               instead of taking all the alloted space.
  * @GWY_HSCALE_CHECK: The label is actually a check button that controls
- *                    sensitivity of the row.
- *
- * Options controlling gwy_table_attach_hscale() behaviour.
+ *                    sensitivity of the row.  This is a flag, to be bitwise
+ *                    or-ed with other values.
+ * @GWY_HSCALE_SNAP: The adjust bar snaps to ticks (hscales cannot snap).
+ *                   This is a flag, to be bitwise or-ed with other values.
+ *                   (Since 2.49)
+ *
+ * Options controlling gwy_table_attach_adjbar() and gwy_table_attach_hscale()
+ * behaviour.
  **/
 
 /**
diff --git a/libgwydgets/gwydgetenums.h b/libgwydgets/gwydgetenums.h
index 12b220c..cdfbf67 100644
--- a/libgwydgets/gwydgetenums.h
+++ b/libgwydgets/gwydgetenums.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwydgetenums.h 18878 2016-08-24 17:22:53Z yeti-dn $
+ *  @(#) $Id: gwydgetenums.h 19924 2017-06-17 12:57:41Z yeti-dn $
  *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -66,15 +66,16 @@ typedef enum {
     GWY_UNITS_PLACEMENT_AT_ZERO
 } GwyUnitsPlacement;
 
-/* XXX */
 typedef enum {
     GWY_HSCALE_DEFAULT          = 0,
     GWY_HSCALE_LOG              = 1,
     GWY_HSCALE_SQRT             = 2,
+    GWY_HSCALE_LINEAR           = 3,
     GWY_HSCALE_NO_SCALE         = 6,
     GWY_HSCALE_WIDGET           = 7,
     GWY_HSCALE_WIDGET_NO_EXPAND = 8,
-    GWY_HSCALE_CHECK            = 1024
+    GWY_HSCALE_CHECK            = 1024,
+    GWY_HSCALE_SNAP             = 2048,
 } GwyHScaleStyle;
 
 typedef enum {
diff --git a/libgwydgets/gwydgetmarshals.c b/libgwydgets/gwydgetmarshals.c
index dbb8c45..6baa206 100644
--- a/libgwydgets/gwydgetmarshals.c
+++ b/libgwydgets/gwydgetmarshals.c
@@ -64,9 +64,9 @@ _gwydget_marshal_VOID__INT_PARAM (GClosure     *closure,
                                                 gint         arg_1,
                                                 gpointer     arg_2,
                                                 gpointer     data2);
-  register GMarshalFunc_VOID__INT_PARAM callback;
-  register GCClosure *cc = (GCClosure*) closure;
-  register gpointer data1, data2;
+  GMarshalFunc_VOID__INT_PARAM callback;
+  GCClosure *cc = (GCClosure*) closure;
+  gpointer data1, data2;
 
   g_return_if_fail (n_param_values == 3);
 
diff --git a/libgwydgets/gwydgets.c b/libgwydgets/gwydgets.c
index 112fceb..c64cbc1 100644
--- a/libgwydgets/gwydgets.c
+++ b/libgwydgets/gwydgets.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwydgets.c 15598 2013-11-11 12:33:32Z yeti-dn $
+ *  @(#) $Id: gwydgets.c 19833 2017-06-04 13:03:23Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -65,6 +65,13 @@ gwy_widgets_type_init(void)
          "  GtkStatusbar::shadow_type = 0\n"
          "}\n"
          "widget \"*.gwyflatstatusbar\" style \"gwyflatstatusbar\"\n"
+         "\n"
+         /* adjust bar internal check button */
+         "style \"gwyadjbarcheck\" {\n"
+         "  GtkCheckButton::focus_padding = 0\n"
+         "  GtkCheckButton::focus_line_width = 0\n"
+         "}\n"
+         "widget \"*.gwyadjbarcheck\" style \"gwyadjbarcheck\"\n"
          "\n");
 }
 
diff --git a/libgwydgets/gwydgets.h b/libgwydgets/gwydgets.h
index b4c02bb..b1d2e6b 100644
--- a/libgwydgets/gwydgets.h
+++ b/libgwydgets/gwydgets.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwydgets.h 15598 2013-11-11 12:33:32Z yeti-dn $
+ *  @(#) $Id: gwydgets.h 19825 2017-06-01 09:27:11Z yeti-dn $
  *  Copyright (C) 2003,2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -31,6 +31,7 @@
 #include <libgwydgets/gwy3dsetup.h>
 #include <libgwydgets/gwy3dview.h>
 #include <libgwydgets/gwy3dwindow.h>
+#include <libgwydgets/gwyadjustbar.h>
 #include <libgwydgets/gwyaxis.h>
 #include <libgwydgets/gwycoloraxis.h>
 #include <libgwydgets/gwycolorbutton.h>
diff --git a/libgwydgets/gwydgettypes.c b/libgwydgets/gwydgettypes.c
index c9cd194..b343490 100644
--- a/libgwydgets/gwydgettypes.c
+++ b/libgwydgets/gwydgettypes.c
@@ -120,10 +120,12 @@ gwy_hscale_style_get_type(void)
             { GWY_HSCALE_DEFAULT, "GWY_HSCALE_DEFAULT", "default" },
             { GWY_HSCALE_LOG, "GWY_HSCALE_LOG", "log" },
             { GWY_HSCALE_SQRT, "GWY_HSCALE_SQRT", "sqrt" },
+            { GWY_HSCALE_LINEAR, "GWY_HSCALE_LINEAR", "linear" },
             { GWY_HSCALE_NO_SCALE, "GWY_HSCALE_NO_SCALE", "no-scale" },
             { GWY_HSCALE_WIDGET, "GWY_HSCALE_WIDGET", "widget" },
             { GWY_HSCALE_WIDGET_NO_EXPAND, "GWY_HSCALE_WIDGET_NO_EXPAND", "widget-no-expand" },
             { GWY_HSCALE_CHECK, "GWY_HSCALE_CHECK", "check" },
+            { GWY_HSCALE_SNAP, "GWY_HSCALE_SNAP", "snap" },
             { 0, NULL, NULL }
         };
         etype = g_enum_register_static("GwyHScaleStyle", values);
@@ -365,6 +367,25 @@ gwy_ticks_style_get_type(void)
     return etype;
 }
 
+#include "./gwyadjustbar.h"
+
+GType
+gwy_scale_mapping_type_get_type(void)
+{
+    static GType etype = 0;
+
+    if (etype == 0) {
+        static const GEnumValue values[] = {
+            { GWY_SCALE_MAPPING_LINEAR, "GWY_SCALE_MAPPING_LINEAR", "linear" },
+            { GWY_SCALE_MAPPING_SQRT, "GWY_SCALE_MAPPING_SQRT", "sqrt" },
+            { GWY_SCALE_MAPPING_LOG, "GWY_SCALE_MAPPING_LOG", "log" },
+            { 0, NULL, NULL }
+        };
+        etype = g_enum_register_static("GwyScaleMappingType", values);
+    }
+    return etype;
+}
+
 #include "./gwygrainvaluemenu.h"
 
 GType
diff --git a/libgwydgets/gwydgettypes.h b/libgwydgets/gwydgettypes.h
index e2083fe..a7b196b 100644
--- a/libgwydgets/gwydgettypes.h
+++ b/libgwydgets/gwydgettypes.h
@@ -65,6 +65,9 @@ GType gwy_data_view_layer_type_get_type(void) G_GNUC_CONST;
 GType gwy_ticks_style_get_type(void) G_GNUC_CONST;
 #define GWY_TYPE_TICKS_STYLE (gwy_ticks_style_get_type())
 
+GType gwy_scale_mapping_type_get_type(void) G_GNUC_CONST;
+#define GWY_TYPE_SCALE_MAPPING_TYPE (gwy_scale_mapping_type_get_type())
+
 GType gwy_grain_value_store_column_get_type(void) G_GNUC_CONST;
 #define GWY_TYPE_GRAIN_VALUE_STORE_COLUMN (gwy_grain_value_store_column_get_type())
 
diff --git a/libgwydgets/gwydgetutils.c b/libgwydgets/gwydgetutils.c
index ae1fd3d..39a2718 100644
--- a/libgwydgets/gwydgetutils.c
+++ b/libgwydgets/gwydgetutils.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: gwydgetutils.c 19127 2016-10-26 21:09:48Z yeti-dn $
- *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: gwydgetutils.c 19924 2017-06-17 12:57:41Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -28,8 +28,10 @@
 #include <libgwyddion/gwydebugobjects.h>
 #include <libdraw/gwydraw.h>
 #ifndef GDK_WINDOWING_QUARTZ
+/* Produces a warning with -Wundef in Fedora.  Reported as Bug 1414319. */
 #include <pango/pangoft2.h>
 #endif
+#include <libgwydgets/gwyadjustbar.h>
 #include <libgwydgets/gwydgetutils.h>
 
 enum {
@@ -44,6 +46,8 @@ static void gwy_hscale_update_sqrt(GtkAdjustment *adj,
                                    GtkAdjustment *slave);
 static void gwy_hscale_update_sq  (GtkAdjustment *adj,
                                    GtkAdjustment *slave);
+static void hscale_set_sensitive  (GtkObject *pivot,
+                                   gboolean sensitive);
 static void disconnect_slave      (GtkWidget *slave,
                                    GtkWidget *master);
 static void disconnect_master     (GtkWidget *master,
@@ -78,7 +82,7 @@ gwy_table_attach_spinbutton(GtkWidget *table,
     else
         adj = gtk_adjustment_new(0, 0, 0, 0, 0, 0);
 
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1, 0);
+    spin = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 0.1, 0);
     gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
     gwy_table_attach_row(table, row, name, units, spin);
 
@@ -166,6 +170,18 @@ gwy_table_get_child_widget(GtkWidget *table,
 
 /************************** Scale attaching ****************************/
 
+static gdouble
+ssqrt(gdouble x)
+{
+    return (x < 0.0) ? -sqrt(fabs(x)) : sqrt(x);
+}
+
+static gdouble
+ssqr(gdouble x)
+{
+    return x*fabs(x);
+}
+
 static void
 gwy_hscale_update_log(GtkAdjustment *adj, GtkAdjustment *slave)
 {
@@ -201,7 +217,7 @@ gwy_hscale_update_sqrt(GtkAdjustment *adj, GtkAdjustment *slave)
                                G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
                                0, 0, 0, gwy_hscale_update_sq, adj);
     g_signal_handler_block(slave, id);
-    gtk_adjustment_set_value(slave, sqrt(adj->value));
+    gtk_adjustment_set_value(slave, ssqrt(adj->value));
     g_signal_handler_unblock(slave, id);
 }
 
@@ -214,7 +230,7 @@ gwy_hscale_update_sq(GtkAdjustment *adj, GtkAdjustment *slave)
                                G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
                                0, 0, 0, gwy_hscale_update_sqrt, adj);
     g_signal_handler_block(slave, id);
-    gtk_adjustment_set_value(slave, adj->value*adj->value);
+    gtk_adjustment_set_value(slave, ssqr(adj->value));
     g_signal_handler_unblock(slave, id);
 }
 
@@ -224,38 +240,80 @@ gwy_hscale_update_sq(GtkAdjustment *adj, GtkAdjustment *slave)
  *         @pivot.
  * @sensitive: %TRUE to make the row sensitive, %FALSE to insensitive.
  *
- * Sets sensitivity of a group of controls create by gwy_table_attach_hscale().
+ * Sets sensitivity of a group of controls create by gwy_table_attach_hscale()
+ * or gwy_table_attach_adjbar().
  *
- * Do not use with %GWY_HSCALE_CHECK, simply set state of the check button
- * in such a case.
+ * For controls without an enable/disable check button controls the sensitivity
+ * as expected.  If the hscale was created with %GWY_HSCALE_CHECK you usually
+ * manage its sensitivity by setting state of the check button instead.
+ * Only use this function when you want to enable/disable the entire group
+ * of controls, including the check button.
  *
- * This function can be used with rows created by gwy_table_attach_spinbutton()
- * too if the spinbutton is passed as @pivot.
+ * This function can also be used with rows created by
+ * gwy_table_attach_spinbutton() too if the spinbutton is passed as @pivot.
  **/
 void
-gwy_table_hscale_set_sensitive(GtkObject *pivot,
-                               gboolean sensitive)
+gwy_table_hscale_set_sensitive(GtkObject *pivot, gboolean sensitive)
 {
-    GtkWidget *widget;
-    GObject *object;
+    GtkWidget *scale, *check;
+    gboolean sens = sensitive;
 
-    object = G_OBJECT(pivot);
+    g_object_set_data(G_OBJECT(pivot), "gwy-explicit-disable",
+                      GINT_TO_POINTER(!sensitive));
 
-    if ((widget = g_object_get_data(object, "scale")))
-        gtk_widget_set_sensitive(widget, sensitive);
-    if ((widget = g_object_get_data(object, "middle_widget")))
-        gtk_widget_set_sensitive(widget, sensitive);
-    if ((widget = g_object_get_data(object, "label")))
-        gtk_widget_set_sensitive(widget, sensitive);
-    if ((widget = g_object_get_data(object, "units")))
-        gtk_widget_set_sensitive(widget, sensitive);
+    if ((check = gwy_table_hscale_get_check(pivot))
+        && GTK_IS_CHECK_BUTTON(check)) {
+        sens = (sensitive
+                && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check)));
+    }
+    else
+        check = NULL;
+
+    hscale_set_sensitive(pivot, sens);
+
+    if (check) {
+        scale = gwy_table_hscale_get_scale(pivot);
+        if (scale && GWY_IS_ADJUST_BAR(scale))
+            gtk_widget_set_sensitive(scale, sensitive);
+        else
+            gtk_widget_set_sensitive(check, sensitive);
+    }
 }
 
 static void
-gwy_hscale_checkbutton_cb(GtkToggleButton *check,
-                          GtkObject *pivot)
+hscale_checkbutton_toggled(GtkToggleButton *check, GtkObject *pivot)
 {
-    gwy_table_hscale_set_sensitive(pivot, gtk_toggle_button_get_active(check));
+    gboolean sens, active;
+
+    active = gtk_toggle_button_get_active(check);
+    sens = !GPOINTER_TO_INT(g_object_get_data(G_OBJECT(pivot),
+                                              "gwy-explicit-disable"));
+    hscale_set_sensitive(pivot, active && sens);
+}
+
+static void
+hscale_set_sensitive(GtkObject *pivot, gboolean sensitive)
+{
+    GtkWidget *widget;
+    gboolean is_adjbar = FALSE;
+
+    widget = gwy_table_hscale_get_scale(pivot);
+    if (widget && GWY_IS_ADJUST_BAR(widget))
+        is_adjbar = TRUE;
+
+    if (is_adjbar)
+        gwy_adjust_bar_set_bar_sensitive(GWY_ADJUST_BAR(widget), sensitive);
+    else {
+        if (widget)
+            gtk_widget_set_sensitive(widget, sensitive);
+        if ((widget = gwy_table_hscale_get_label(pivot)))
+            gtk_widget_set_sensitive(widget, sensitive);
+    }
+
+    if ((widget = gwy_table_hscale_get_middle_widget(pivot)))
+        gtk_widget_set_sensitive(widget, sensitive);
+    if ((widget = gwy_table_hscale_get_units(pivot)))
+        gtk_widget_set_sensitive(widget, sensitive);
 }
 
 /**
@@ -269,28 +327,30 @@ gwy_hscale_checkbutton_cb(GtkToggleButton *check,
  * @style: A mix of options an flags determining what and how will be attached
  *         to the table.
  *
- * Attaches a spinbutton with a scale and labels, or something else to a table
+ * Attaches a spinbutton with a scale and labels, or something else, to a table
  * row.
  *
+ * The group of controls takes four table columns: label, scale, spinbutton
+ * and units.
+ *
  * You can use functions gwy_table_hscale_get_scale(),
  * gwy_table_hscale_get_check(), etc. to get the various widgets from pivot
  * later.
  *
- * FIXME: What exactly happens with various @style values is quite convoluted.
+ * The function usually does the right thing but what exactly happens with
+ * various @style values is a bit convoluted.
  *
  * Returns: The middle widget.  If a spinbutton is attached, then this
  *          spinbutton is returned.  Otherwise (in %GWY_HSCALE_WIDGET case)
  *          @pivot itself.
  **/
 GtkWidget*
-gwy_table_attach_hscale(GtkWidget *table,
-                        gint row,
-                        const gchar *name,
-                        const gchar *units,
+gwy_table_attach_hscale(GtkWidget *table, gint row,
+                        const gchar *name, const gchar *units,
                         GtkObject *pivot,
                         GwyHScaleStyle style)
 {
-    GtkWidget *spin, *scale, *label, *check, *middle_widget, *align;
+    GtkWidget *spin, *scale, *label, *check = NULL, *middle_widget, *align;
     GtkAdjustment *scale_adj = NULL, *adj = NULL;
     GwyHScaleStyle base_style;
     GtkTable *tab;
@@ -300,12 +360,13 @@ gwy_table_attach_hscale(GtkWidget *table,
     g_return_val_if_fail(GTK_IS_TABLE(table), NULL);
     tab = GTK_TABLE(table);
 
-    base_style = style & ~GWY_HSCALE_CHECK;
+    base_style = style & ~(GWY_HSCALE_CHECK | GWY_HSCALE_SNAP);
     switch (base_style) {
         case GWY_HSCALE_DEFAULT:
         case GWY_HSCALE_NO_SCALE:
         case GWY_HSCALE_LOG:
         case GWY_HSCALE_SQRT:
+        case GWY_HSCALE_LINEAR:
         if (pivot) {
             g_return_val_if_fail(GTK_IS_ADJUSTMENT(pivot), NULL);
             adj = GTK_ADJUSTMENT(pivot);
@@ -313,7 +374,8 @@ gwy_table_attach_hscale(GtkWidget *table,
         else {
             if (base_style == GWY_HSCALE_LOG || base_style == GWY_HSCALE_SQRT)
                 g_warning("Nonlinear scale doesn't work with implicit adj.");
-            adj = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 0, 0, 0, 0));
+            adj = GTK_ADJUSTMENT(gtk_adjustment_new(0.01, 0.01, 1.00, 0.01, 0.1,
+                                                    0));
         }
         break;
 
@@ -327,11 +389,16 @@ gwy_table_attach_hscale(GtkWidget *table,
         break;
     }
 
+    if (style & GWY_HSCALE_SNAP) {
+        g_warning("gwy_table_attach_hscale() does not implement "
+                  "snapping to ticks.");
+    }
+
     if (base_style != GWY_HSCALE_WIDGET
         && base_style != GWY_HSCALE_WIDGET_NO_EXPAND) {
         u = adj->step_increment;
         digits = (u > 0.0) ? (gint)floor(-log10(u)) : 0;
-        spin = gtk_spin_button_new(adj, adj->step_increment, MAX(digits, 0));
+        spin = gtk_spin_button_new(adj, 0.1, MAX(digits, 0));
         u = adj->value;
         gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
         gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(spin), TRUE);
@@ -357,7 +424,7 @@ gwy_table_attach_hscale(GtkWidget *table,
             u = sqrt(adj->upper);
             l = sqrt(adj->lower);
             scale_adj
-                = GTK_ADJUSTMENT(gtk_adjustment_new(sqrt(adj->value),
+                = GTK_ADJUSTMENT(gtk_adjustment_new(ssqrt(adj->value),
                                                     l, u,
                                                     (u - l)/GWY_HSCALE_WIDTH,
                                                     10*(u - l)/GWY_HSCALE_WIDTH,
@@ -387,7 +454,8 @@ gwy_table_attach_hscale(GtkWidget *table,
 
     if (base_style == GWY_HSCALE_DEFAULT
         || base_style == GWY_HSCALE_LOG
-        || base_style == GWY_HSCALE_SQRT) {
+        || base_style == GWY_HSCALE_SQRT
+        || base_style == GWY_HSCALE_LINEAR) {
         scale = gtk_hscale_new(scale_adj);
         gtk_scale_set_draw_value(GTK_SCALE(scale), FALSE);
         gtk_widget_set_size_request(scale, GWY_HSCALE_WIDTH, -1);
@@ -396,12 +464,11 @@ gwy_table_attach_hscale(GtkWidget *table,
         g_object_set_data(G_OBJECT(pivot), "scale", scale);
     }
 
-
     if (style & GWY_HSCALE_CHECK) {
         check = gtk_check_button_new_with_mnemonic(name);
         gtk_table_attach(tab, check, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
         g_signal_connect(check, "toggled",
-                         G_CALLBACK(gwy_hscale_checkbutton_cb), pivot);
+                         G_CALLBACK(hscale_checkbutton_toggled), pivot);
         g_object_set_data(G_OBJECT(pivot), "check", check);
     }
     else {
@@ -420,6 +487,193 @@ gwy_table_attach_hscale(GtkWidget *table,
         g_object_set_data(G_OBJECT(pivot), "units", label);
     }
 
+    if (check)
+        hscale_checkbutton_toggled(GTK_TOGGLE_BUTTON(check), pivot);
+
+    return middle_widget;
+}
+
+/**
+ * gwy_table_attach_adjbar:
+ * @table: A #GtkTable.
+ * @row: Row in @table to attach stuff to.
+ * @name: The label before @pivot widget.
+ * @units: The label after @pivot widget.
+ * @pivot: Either a #GtkAdjustment, or a widget to use instead of the spin
+ *         button and scale widgets (if @style is %GWY_HSCALE_WIDGET).
+ * @style: A mix of options an flags determining what and how will be attached
+ *         to the table.
+ *
+ * Attaches an adjustment bar with spinbutton and labels, or something else, to
+ * a table row.
+ *
+ * The group of controls takes three table columns: adjustment bar, spinbutton
+ * and units.
+ *
+ * You can use functions gwy_table_hscale_get_scale(),
+ * gwy_table_hscale_get_check(), etc. to get the various widgets from pivot
+ * later.
+ *
+ * The function usually does the right thing but what exactly happens with
+ * various @style values is a bit convoluted.
+ *
+ * Returns: The middle widget.  If a spinbutton is attached, then this
+ *          spinbutton is returned.  Otherwise (in %GWY_HSCALE_WIDGET case)
+ *          @pivot itself.
+ *
+ * Since: 2.49
+ **/
+GtkWidget*
+gwy_table_attach_adjbar(GtkWidget *table, gint row,
+                        const gchar *name, const gchar *units,
+                        GtkObject *pivot,
+                        GwyHScaleStyle style)
+{
+    GtkWidget *spin, *label, *check = NULL, *middle_widget, *hbox;
+    GtkAdjustment *adj = NULL;
+    GwyHScaleStyle base_style;
+    GwyAdjustBar *adjbar;
+    GtkTable *tab;
+    gdouble u;
+    gint digits, spacing;
+
+    g_return_val_if_fail(GTK_IS_TABLE(table), NULL);
+    tab = GTK_TABLE(table);
+
+    base_style = style & ~(GWY_HSCALE_CHECK | GWY_HSCALE_SNAP);
+    switch (base_style) {
+        case GWY_HSCALE_DEFAULT:
+        case GWY_HSCALE_NO_SCALE:
+        case GWY_HSCALE_LOG:
+        case GWY_HSCALE_SQRT:
+        case GWY_HSCALE_LINEAR:
+        if (pivot) {
+            g_return_val_if_fail(GTK_IS_ADJUSTMENT(pivot), NULL);
+            adj = GTK_ADJUSTMENT(pivot);
+        }
+        else {
+            if (base_style == GWY_HSCALE_LOG || base_style == GWY_HSCALE_SQRT)
+                g_warning("Nonlinear scale doesn't work with implicit adj.");
+            adj = GTK_ADJUSTMENT(gtk_adjustment_new(0.01, 0.01, 1.00, 0.01, 0.1,
+                                                    0));
+        }
+        break;
+
+        case GWY_HSCALE_WIDGET:
+        case GWY_HSCALE_WIDGET_NO_EXPAND:
+        g_return_val_if_fail(GTK_IS_WIDGET(pivot), NULL);
+        break;
+
+        default:
+        g_return_val_if_reached(NULL);
+        break;
+    }
+
+    if ((style & GWY_HSCALE_SNAP)
+        && (base_style == GWY_HSCALE_NO_SCALE
+            || base_style == GWY_HSCALE_WIDGET
+            || base_style == GWY_HSCALE_WIDGET_NO_EXPAND)) {
+        g_warning("There is no adjust bar that could snap to ticks.");
+    }
+
+    if (base_style == GWY_HSCALE_WIDGET
+        || base_style == GWY_HSCALE_WIDGET_NO_EXPAND) {
+        middle_widget = GTK_WIDGET(pivot);
+
+        g_object_get(table, "column-spacing", &spacing, NULL);
+        hbox = gtk_hbox_new(FALSE, spacing);
+        gtk_table_attach(GTK_TABLE(table), hbox, 0, 2, row, row+1,
+                         GTK_FILL, 0, 0, 0);
+
+        if (base_style == GWY_HSCALE_WIDGET_NO_EXPAND)
+            gtk_box_pack_end(GTK_BOX(hbox), middle_widget, FALSE, FALSE, 0);
+        else
+            gtk_box_pack_end(GTK_BOX(hbox), middle_widget, TRUE, TRUE, 0);
+
+        if (style & GWY_HSCALE_CHECK) {
+            check = gtk_check_button_new_with_mnemonic(name);
+            gtk_box_pack_start(GTK_BOX(hbox), check, FALSE, FALSE, 0);
+            g_signal_connect(check, "toggled",
+                             G_CALLBACK(hscale_checkbutton_toggled), pivot);
+            g_object_set_data(G_OBJECT(pivot), "check", check);
+        }
+        else {
+            label = gtk_label_new_with_mnemonic(name);
+            gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+            gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+            gtk_label_set_mnemonic_widget(GTK_LABEL(label), middle_widget);
+            g_object_set_data(G_OBJECT(pivot), "label", label);
+        }
+    }
+    else {
+        u = adj->step_increment;
+        digits = (u > 0.0) ? (gint)floor(-log10(u)) : 0;
+        spin = gtk_spin_button_new(adj, 0.1, MAX(digits, 0));
+        gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
+        gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(spin), TRUE);
+        gtk_table_attach(tab, spin, 1, 2, row, row+1, GTK_FILL, 0, 0, 0);
+        middle_widget = spin;
+
+        if (base_style == GWY_HSCALE_NO_SCALE) {
+            if (style & GWY_HSCALE_CHECK) {
+                check = gtk_check_button_new_with_mnemonic(name);
+                gtk_table_attach(tab, check, 0, 1, row, row+1,
+                                 GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                g_signal_connect(check, "toggled",
+                                 G_CALLBACK(hscale_checkbutton_toggled), pivot);
+                g_object_set_data(G_OBJECT(pivot), "check", check);
+            }
+            else {
+                label = gtk_label_new_with_mnemonic(name);
+                gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+                gtk_table_attach(tab, label, 0, 1, row, row+1,
+                                 GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                gtk_label_set_mnemonic_widget(GTK_LABEL(label), middle_widget);
+                g_object_set_data(G_OBJECT(pivot), "label", label);
+            }
+        }
+        else {
+            adjbar = GWY_ADJUST_BAR(gwy_adjust_bar_new(adj, name));
+            if (base_style == GWY_HSCALE_LINEAR)
+                gwy_adjust_bar_set_mapping(adjbar, GWY_SCALE_MAPPING_LINEAR);
+            else if (base_style == GWY_HSCALE_SQRT)
+                gwy_adjust_bar_set_mapping(adjbar, GWY_SCALE_MAPPING_SQRT);
+            else if (base_style == GWY_HSCALE_LOG)
+                gwy_adjust_bar_set_mapping(adjbar, GWY_SCALE_MAPPING_LOG);
+
+            gtk_table_attach(tab, GTK_WIDGET(adjbar), 0, 1, row, row+1,
+                             GTK_EXPAND | GTK_FILL, 0, 0, 0);
+            g_object_set_data(G_OBJECT(pivot), "scale", adjbar);
+
+            label = gwy_adjust_bar_get_label(adjbar);
+            g_object_set_data(G_OBJECT(pivot), "label", label);
+            gtk_label_set_mnemonic_widget(GTK_LABEL(label), middle_widget);
+
+            if (style & GWY_HSCALE_CHECK) {
+                gwy_adjust_bar_set_has_check_button(adjbar, TRUE);
+                check = gwy_adjust_bar_get_check_button(adjbar);
+                g_signal_connect(check, "toggled",
+                                 G_CALLBACK(hscale_checkbutton_toggled), pivot);
+                g_object_set_data(G_OBJECT(pivot), "check", check);
+            }
+            if (style & GWY_HSCALE_SNAP)
+                gwy_adjust_bar_set_snap_to_ticks(adjbar, TRUE);
+        }
+    }
+
+    g_object_set_data(G_OBJECT(pivot), "middle_widget", middle_widget);
+
+    if (units) {
+        label = gtk_label_new(units);
+        gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
+        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+        gtk_table_attach(tab, label, 2, 3, row, row+1, GTK_FILL, 0, 0, 0);
+        g_object_set_data(G_OBJECT(pivot), "units", label);
+    }
+
+    if (check)
+        hscale_checkbutton_toggled(GTK_TOGGLE_BUTTON(check), pivot);
+
     return middle_widget;
 }
 
@@ -432,6 +686,12 @@ gwy_table_attach_hscale(GtkWidget *table,
  * May return %NULL if constructed with %GWY_HSCALE_NO_SCALE,
  * %GWY_HSCALE_WIDGET, or %GWY_HSCALE_WIDGET_NO_EXPAND.
  **/
+GtkWidget*
+gwy_table_hscale_get_scale(GtkObject *pivot)
+{
+    g_return_val_if_fail(pivot, NULL);
+    return (GtkWidget*)g_object_get_data(G_OBJECT(pivot), "scale");
+}
 
 /**
  * gwy_table_hscale_get_check:
@@ -441,6 +701,12 @@ gwy_table_attach_hscale(GtkWidget *table,
  *
  * May return %NULL if not constructed with %GWY_HSCALE_CHECK.
  **/
+GtkWidget*
+gwy_table_hscale_get_check(GtkObject *pivot)
+{
+    g_return_val_if_fail(pivot, NULL);
+    return (GtkWidget*)g_object_get_data(G_OBJECT(pivot), "check");
+}
 
 /**
  * gwy_table_hscale_get_label:
@@ -450,6 +716,12 @@ gwy_table_attach_hscale(GtkWidget *table,
  *
  * May return %NULL if constructed with %GWY_HSCALE_CHECK.
  **/
+GtkWidget*
+gwy_table_hscale_get_label(GtkObject *pivot)
+{
+    g_return_val_if_fail(pivot, NULL);
+    return (GtkWidget*)g_object_get_data(G_OBJECT(pivot), "label");
+}
 
 /**
  * gwy_table_hscale_get_units:
@@ -459,6 +731,12 @@ gwy_table_attach_hscale(GtkWidget *table,
  *
  * May return %NULL if constructed without units.
  **/
+GtkWidget*
+gwy_table_hscale_get_units(GtkObject *pivot)
+{
+    g_return_val_if_fail(pivot, NULL);
+    return (GtkWidget*)g_object_get_data(G_OBJECT(pivot), "units");
+}
 
 /**
  * gwy_table_hscale_get_middle_widget:
@@ -466,6 +744,12 @@ gwy_table_attach_hscale(GtkWidget *table,
  *
  * Gets the middle widget associated with a pivot object.
  **/
+GtkWidget*
+gwy_table_hscale_get_middle_widget(GtkObject *pivot)
+{
+    g_return_val_if_fail(pivot, NULL);
+    return (GtkWidget*)g_object_get_data(G_OBJECT(pivot), "middle_widget");
+}
 
 /************************** Mask colors ****************************/
 
diff --git a/libgwydgets/gwydgetutils.h b/libgwydgets/gwydgetutils.h
index c839e2d..74db877 100644
--- a/libgwydgets/gwydgetutils.h
+++ b/libgwydgets/gwydgetutils.h
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: gwydgetutils.h 15598 2013-11-11 12:33:32Z yeti-dn $
- *  Copyright (C) 2003-2005 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: gwydgetutils.h 19847 2017-06-06 08:22:50Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -32,35 +32,35 @@ G_BEGIN_DECLS
 #define gwy_adjustment_get_int(adj) \
     ((gint)(gtk_adjustment_get_value(GTK_ADJUSTMENT(adj)) + 0.5))
 
-GtkWidget*   gwy_table_attach_spinbutton    (GtkWidget *table,
-                                             gint row,
-                                             const gchar *name,
-                                             const gchar *units,
-                                             GtkObject *adj);
-void         gwy_table_attach_row           (GtkWidget *table,
-                                             gint row,
-                                             const gchar *name,
-                                             const gchar *units,
-                                             GtkWidget *middle_widget);
-GtkWidget*   gwy_table_attach_hscale        (GtkWidget *table,
-                                             gint row,
-                                             const gchar *name,
-                                             const gchar *units,
-                                             GtkObject *pivot,
-                                             GwyHScaleStyle style);
-void         gwy_table_hscale_set_sensitive (GtkObject *pivot,
-                                             gboolean sensitive);
-
-#define      gwy_table_hscale_get_scale(pivot) \
-    ((GtkWidget*)(g_object_get_data(G_OBJECT(pivot), "scale")))
-#define      gwy_table_hscale_get_check(pivot) \
-    ((GtkWidget*)(g_object_get_data(G_OBJECT(pivot), "check")))
-#define      gwy_table_hscale_get_label(pivot) \
-    ((GtkWidget*)(g_object_get_data(G_OBJECT(pivot), "label")))
-#define      gwy_table_hscale_get_units(pivot) \
-    ((GtkWidget*)(g_object_get_data(G_OBJECT(pivot), "units")))
-#define      gwy_table_hscale_get_middle_widget(pivot) \
-    ((GtkWidget*)(g_object_get_data(G_OBJECT(pivot), "middle_widget")))
+GtkWidget* gwy_table_attach_spinbutton       (GtkWidget *table,
+                                              gint row,
+                                              const gchar *name,
+                                              const gchar *units,
+                                              GtkObject *adj);
+void       gwy_table_attach_row              (GtkWidget *table,
+                                              gint row,
+                                              const gchar *name,
+                                              const gchar *units,
+                                              GtkWidget *middle_widget);
+GtkWidget* gwy_table_attach_hscale           (GtkWidget *table,
+                                              gint row,
+                                              const gchar *name,
+                                              const gchar *units,
+                                              GtkObject *pivot,
+                                              GwyHScaleStyle style);
+GtkWidget* gwy_table_attach_adjbar           (GtkWidget *table,
+                                              gint row,
+                                              const gchar *name,
+                                              const gchar *units,
+                                              GtkObject *pivot,
+                                              GwyHScaleStyle style);
+void       gwy_table_hscale_set_sensitive    (GtkObject *pivot,
+                                              gboolean sensitive);
+GtkWidget* gwy_table_hscale_get_scale        (GtkObject *pivot);
+GtkWidget* gwy_table_hscale_get_check        (GtkObject *pivot);
+GtkWidget* gwy_table_hscale_get_label        (GtkObject *pivot);
+GtkWidget* gwy_table_hscale_get_units        (GtkObject *pivot);
+GtkWidget* gwy_table_hscale_get_middle_widget(GtkObject *pivot);
 
 GtkWidget*   gwy_table_get_child_widget     (GtkWidget *table,
                                              gint row,
diff --git a/libgwydgets/gwygraphareadialog.c b/libgwydgets/gwygraphareadialog.c
index 8c46f55..0ad7c1f 100644
--- a/libgwydgets/gwygraphareadialog.c
+++ b/libgwydgets/gwygraphareadialog.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwygraphareadialog.c 17484 2015-09-28 11:35:31Z yeti-dn $
+ *  @(#) $Id: gwygraphareadialog.c 20070 2017-07-12 07:48:27Z yeti-dn $
  *  Copyright (C) 2003-2007 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -98,10 +98,10 @@ _gwy_graph_area_dialog_init(GwyGraphAreaDialog *dialog)
     gint row;
 
     gtk_window_set_title(GTK_WINDOW(dialog), _("Curve Properties"));
-    dialog->prev = gwy_stock_like_button_new(_("Pre_v"), GWY_STOCK_LESS);
+    dialog->prev = gwy_stock_like_button_new(_("Pre_v"), GWY_STOCK_PREVIOUS);
     gtk_dialog_add_action_widget(GTK_DIALOG(dialog), dialog->prev,
                                  GWY_GRAPH_AREA_DIALOG_RESPONSE_PREV);
-    dialog->next = gwy_stock_like_button_new(_("_Next"), GWY_STOCK_MORE);
+    dialog->next = gwy_stock_like_button_new(_("_Next"), GWY_STOCK_NEXT);
     gtk_dialog_add_action_widget(GTK_DIALOG(dialog), dialog->next,
                                  GWY_GRAPH_AREA_DIALOG_RESPONSE_NEXT);
     gtk_dialog_add_button(GTK_DIALOG(dialog),
@@ -109,61 +109,53 @@ _gwy_graph_area_dialog_init(GwyGraphAreaDialog *dialog)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE);
     update_switcher_sensitivity(dialog);
 
-    table = gtk_table_new(7, 4, FALSE);
+    table = gtk_table_new(7, 3, FALSE);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
     gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table);
     row = 0;
 
-    hbox = gtk_hbox_new(FALSE, 6);
-    gtk_table_attach(GTK_TABLE(table), hbox,
-                     0, 4, row, row+1, GTK_FILL, 0, 0, 0);
-
     dialog->curvetype_menu
         = gwy_enum_combo_box_new(gwy_graph_curve_type_get_enum(), -1,
                                  G_CALLBACK(curvetype_changed), dialog,
                                  0, TRUE);
-    gwy_table_attach_hscale(table, row, _("Plot _style:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("Plot _style:"), NULL,
                             GTK_OBJECT(dialog->curvetype_menu),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
-    hbox = gtk_hbox_new(FALSE, 4);
-    gtk_table_attach(GTK_TABLE(table), hbox,
-                     1, 3, row, row+1, GTK_FILL, 0, 0, 0);
-
     dialog->color_button = gwy_color_button_new();
     gwy_color_button_set_use_alpha(GWY_COLOR_BUTTON(dialog->color_button),
                                    FALSE);
-    gtk_box_pack_start(GTK_BOX(hbox), dialog->color_button, FALSE, FALSE, 0);
+    gwy_table_attach_adjbar(table, row, _("Pl_ot color:"), NULL,
+                            GTK_OBJECT(dialog->color_button),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     g_signal_connect(dialog->color_button, "clicked",
                      G_CALLBACK(color_change), dialog);
 
+    hbox = gtk_widget_get_parent(dialog->color_button);
     dialog->color_selector = gwy_graph_color_combo_new();
-    gtk_box_pack_start(GTK_BOX(hbox), dialog->color_selector, FALSE, FALSE, 0);
+    gtk_box_pack_end(GTK_BOX(hbox), dialog->color_selector, FALSE, FALSE, 0);
+    gtk_container_child_set(GTK_CONTAINER(hbox), dialog->color_selector,
+                            "position", 1,
+                            NULL);
     g_signal_connect(dialog->color_selector, "changed",
                      G_CALLBACK(color_selected), dialog);
-
-    label = gtk_label_new_with_mnemonic(_("Pl_ot color:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), dialog->color_button);
     row++;
 
     dialog->pointtype_menu
         = gwy_graph_combo_box_new(dialog, "point-type", TRUE,
                                   G_CALLBACK(_gwy_graph_get_point_type_store),
                                   GWY_GRAPH_POINT_SQUARE);
-    gwy_table_attach_hscale(table, row, _("Point _type:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("Point _type:"), NULL,
                             GTK_OBJECT(dialog->pointtype_menu),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     dialog->pointsize = gtk_adjustment_new(6, 1, 50, 1, 5, 0);
-    gwy_table_attach_hscale(table, row, _("_Point size:"), "px",
-                            dialog->pointsize, 0);
+    gwy_table_attach_adjbar(table, row, _("_Point size:"), _("px"),
+                            dialog->pointsize, GWY_HSCALE_SQRT);
     g_signal_connect(dialog->pointsize, "value-changed",
                      G_CALLBACK(pointsize_changed), dialog);
     row++;
@@ -172,23 +164,24 @@ _gwy_graph_area_dialog_init(GwyGraphAreaDialog *dialog)
         = gwy_graph_combo_box_new(dialog, "line-style", FALSE,
                                   G_CALLBACK(_gwy_graph_get_line_style_store),
                                   GDK_LINE_SOLID);
-    gwy_table_attach_hscale(table, row, _("_Line type:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Line type:"), NULL,
                             GTK_OBJECT(dialog->linestyle_menu),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     dialog->thickness = gtk_adjustment_new(6, 1, 50, 1, 5, 0);
-    gwy_table_attach_hscale(table, row, _("Line t_hickness:"), "px",
-                            dialog->thickness, 0);
+    gwy_table_attach_adjbar(table, row, _("Line t_hickness:"), _("px"),
+                            dialog->thickness, GWY_HSCALE_SQRT);
     g_signal_connect(dialog->thickness, "value-changed",
                      G_CALLBACK(thickness_changed), dialog);
     row++;
 
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gtk_label_new_with_mnemonic(_("<b>Label Te_xt</b>"));
     gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     dialog->sci_text = gwy_sci_text_new();
@@ -714,10 +707,7 @@ render_graph_color(G_GNUC_UNUSED GtkCellLayout *cell_layout,
             pixel = 0;
     }
     if (pixel)
-        pixel = 0xff
-                | ((guint32)(guchar)floor(255.99999*rgba.b) << 8)
-                | ((guint32)(guchar)floor(255.99999*rgba.g) << 16)
-                | ((guint32)(guchar)floor(255.99999*rgba.r) << 24);
+        pixel = 0xff | gwy_rgba_to_pixbuf_pixel(&rgba);
     gdk_pixbuf_fill(pixbuf, pixel);
     g_object_set(renderer, "pixbuf", pixbuf, NULL);
 }
diff --git a/libgwydgets/gwygraphcurvemodel.c b/libgwydgets/gwygraphcurvemodel.c
index 666b20a..0b6795c 100644
--- a/libgwydgets/gwygraphcurvemodel.c
+++ b/libgwydgets/gwygraphcurvemodel.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwygraphcurvemodel.c 19127 2016-10-26 21:09:48Z yeti-dn $
+ *  @(#) $Id: gwygraphcurvemodel.c 20060 2017-07-11 09:59:27Z yeti-dn $
  *  Copyright (C) 2005-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -697,13 +697,14 @@ gwy_graph_curve_model_set_data(GwyGraphCurveModel *gcmodel,
 /**
  * gwy_graph_curve_model_set_data_interleaved:
  * @gcmodel: A graph curve model.
- * @xydata: X data points (array of size 2*@n).
+ * @xydata: X and Y data points (array of size 2*@n).
  * @n: Number of points, i.e. half the number of items in @xydata.
  *
  * Sets curve model data from an interleaved array.
  *
  * The array should contain interleaved abscissa and ordinate values:
- * x0, x0, x1, y1, x2, y2, etc.
+ * x0, y0, x1, y1, x2, y2, etc.  You can also typecast an array of #GwyXY
+ * structs and pass it as @xydata.
  *
  * If there were calibration data in the former @gcmodel, they are removed.
  *
diff --git a/libgwydgets/gwygraphcurves.c b/libgwydgets/gwygraphcurves.c
index f9311d5..3418fc6 100644
--- a/libgwydgets/gwygraphcurves.c
+++ b/libgwydgets/gwygraphcurves.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwygraphcurves.c 19071 2016-10-14 09:02:41Z yeti-dn $
+ *  @(#) $Id: gwygraphcurves.c 20070 2017-07-12 07:48:27Z yeti-dn $
  *  Copyright (C) 2007 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -371,10 +371,7 @@ render_column(GtkCellLayout *column,
             guint32 pixel;
 
             g_object_get(gcmodel, "color", &color, NULL);
-            pixel = 0xff
-                   | ((guint32)(guchar)floor(255.99999*color->b) << 8)
-                    | ((guint32)(guchar)floor(255.99999*color->g) << 16)
-                    | ((guint32)(guchar)floor(255.99999*color->r) << 24);
+            pixel = 0xff | gwy_rgba_to_pixbuf_pixel(color);
             gwy_rgba_free(color);
             gdk_pixbuf_fill(graph_curves->pixbuf, pixel);
         }
diff --git a/libgwydgets/gwygraphlabeldialog.c b/libgwydgets/gwygraphlabeldialog.c
index 5ef63e3..1f77509 100644
--- a/libgwydgets/gwygraphlabeldialog.c
+++ b/libgwydgets/gwygraphlabeldialog.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwygraphlabeldialog.c 15598 2013-11-11 12:33:32Z yeti-dn $
+ *  @(#) $Id: gwygraphlabeldialog.c 19923 2017-06-17 12:33:25Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -65,14 +65,14 @@ _gwy_graph_label_dialog_init(GwyGraphLabelDialog *dialog)
                           GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE);
 
-    table = gtk_table_new(2, 4, FALSE);
+    table = gtk_table_new(2, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
 
     dialog->thickness = gtk_adjustment_new(1, 0, 6, 1, 5, 0);
-    gwy_table_attach_hscale(table, row, _("Frame thickness:"), NULL,
-                            dialog->thickness, 0);
+    gwy_table_attach_adjbar(table, row, _("_Frame thickness:"), NULL,
+                            dialog->thickness, GWY_HSCALE_LINEAR);
     g_signal_connect(dialog->thickness, "value-changed",
                      G_CALLBACK(thickness_changed_cb), dialog);
     row++;
@@ -81,8 +81,9 @@ _gwy_graph_label_dialog_init(GwyGraphLabelDialog *dialog)
         = gtk_check_button_new_with_mnemonic(_("_Reversed layout"));
     g_signal_connect(dialog->reversed, "toggled",
                      G_CALLBACK(reverse_changed_cb), dialog);
-    gtk_table_attach(GTK_TABLE(table), dialog->reversed, 0, 3, row, row + 1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), dialog->reversed, 0, 2, row, row + 1,
+                     GTK_FILL, 0, 0, 0);
+    row++;
 
     gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table);
     gtk_widget_show_all(GTK_DIALOG(dialog)->vbox);
diff --git a/libgwydgets/gwyradiobuttons.c b/libgwydgets/gwyradiobuttons.c
index e70085b..626fea4 100644
--- a/libgwydgets/gwyradiobuttons.c
+++ b/libgwydgets/gwyradiobuttons.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwyradiobuttons.c 15598 2013-11-11 12:33:32Z yeti-dn $
+ *  @(#) $Id: gwyradiobuttons.c 19837 2017-06-05 11:40:09Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -195,7 +195,7 @@ gwy_radio_buttons_attach_to_table(GSList *group,
     while (group) {
         gtk_table_attach(table, GTK_WIDGET(group->data),
                          0, colspan, row, row + 1,
-                         GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                         GTK_FILL, 0, 0, 0);
         row++;
         group = g_slist_next(group);
     }
@@ -238,11 +238,13 @@ gwy_radio_buttons_set_current(GSList *group,
 gint
 gwy_radio_buttons_get_current(GSList *group)
 {
+    setup_quark();
     while (group) {
         g_return_val_if_fail(GTK_IS_RADIO_BUTTON(group->data), -1);
-        if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group->data)))
+        if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group->data))) {
             return GPOINTER_TO_INT(g_object_get_qdata(G_OBJECT(group->data),
                                                       gwyrb_quark));
+        }
         group = g_slist_next(group);
     }
 
@@ -263,6 +265,7 @@ gwy_radio_buttons_find(GSList *group,
                        gint value)
 {
     g_return_val_if_fail(group, NULL);
+    setup_quark();
     while (group) {
         g_return_val_if_fail(GTK_IS_RADIO_BUTTON(group->data), FALSE);
         if (GPOINTER_TO_INT(g_object_get_qdata(G_OBJECT(group->data),
diff --git a/libgwydgets/gwystatusbar.c b/libgwydgets/gwystatusbar.c
index 709d4ff..e98f9d4 100644
--- a/libgwydgets/gwystatusbar.c
+++ b/libgwydgets/gwystatusbar.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwystatusbar.c 15598 2013-11-11 12:33:32Z yeti-dn $
+ *  @(#) $Id: gwystatusbar.c 19850 2017-06-06 08:47:49Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -87,7 +87,7 @@ gwy_statusbar_update_markup(GtkStatusbar *statusbar,
  * Sets the text to display in a status bar.
  *
  * This method is intended for simple status bars that do not have stacks and
- * do not need contexts.  It does not mix with gtk_status_bar_push().  You can
+ * do not need contexts.  It does not mix with gtk_statusbar_push().  You can
  * use either this simple interface or the full stacks-and-contexts API with
  * #GwyStatusbar, but not both in the same status bar.
  **/
diff --git a/libgwydgets/gwystock.c b/libgwydgets/gwystock.c
index 4ee98dd..76b5aa9 100644
--- a/libgwydgets/gwystock.c
+++ b/libgwydgets/gwystock.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwystock.c 18961 2016-09-17 07:38:23Z yeti-dn $
+ *  @(#) $Id: gwystock.c 20258 2017-08-12 08:17:43Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -372,6 +372,15 @@ file_to_icon_source(const gchar *path,
  **/
 
 /**
+ * GWY_STOCK_CORRELATION_MASK:
+ *
+ * The "Correlation-Mask" stock icon.
+ * <inlinegraphic fileref="gwy_correlation_mask-24.png" format="PNG"/>
+ *
+ * Since: 2.48
+ **/
+
+/**
  * GWY_STOCK_CROP:
  *
  * The "Crop" stock icon.
@@ -395,6 +404,15 @@ file_to_icon_source(const gchar *path,
  **/
 
 /**
+ * GWY_STOCK_DISCONNECTED:
+ *
+ * The "Disconnected" stock icon.
+ * <inlinegraphic fileref="gwy_disconnected-24.png" format="PNG"/>
+ *
+ * Since: 2.48
+ **/
+
+/**
  * GWY_STOCK_DISTANCE:
  *
  * The "Distance" stock icon.
@@ -518,6 +536,15 @@ file_to_icon_source(const gchar *path,
  **/
 
 /**
+ * GWY_STOCK_FFT_FILTER_1D:
+ *
+ * The "FFT-Filter-1D" stock icon.
+ * <inlinegraphic fileref="gwy_fft_filter_1d-24.png" format="PNG"/>
+ *
+ * Since: 2.48
+ **/
+
+/**
  * GWY_STOCK_FFT_FILTER_2D:
  *
  * The "FFT-Filter-2D" stock icon.
@@ -543,6 +570,15 @@ file_to_icon_source(const gchar *path,
  **/
 
 /**
+ * GWY_STOCK_FIT_SHAPE:
+ *
+ * The "Fit-Shape" stock icon.
+ * <inlinegraphic fileref="gwy_fit_shape-24.png" format="PNG"/>
+ *
+ * Since: 2.48
+ **/
+
+/**
  * GWY_STOCK_FIX_ZERO:
  *
  * The "Fix-Zero" stock icon.
@@ -571,6 +607,24 @@ file_to_icon_source(const gchar *path,
  **/
 
 /**
+ * GWY_STOCK_FRACTAL_CORRECTION:
+ *
+ * The "Fractal-Correction" stock icon.
+ * <inlinegraphic fileref="gwy_fractal_correction-24.png" format="PNG"/>
+ *
+ * Since: 2.48
+ **/
+
+/**
+ * GWY_STOCK_FRACTAL_MEASURE:
+ *
+ * The "Fractal-Measure" stock icon.
+ * <inlinegraphic fileref="gwy_fractal_measure-24.png" format="PNG"/>
+ *
+ * Since: 2.49
+ **/
+
+/**
  * GWY_STOCK_GL_MATERIAL:
  *
  * The "GL-Material" stock icon.
@@ -594,6 +648,33 @@ file_to_icon_source(const gchar *path,
  **/
 
 /**
+ * GWY_STOCK_GRAIN_CORRELATION:
+ *
+ * The "Grain-Correlation" stock icon.
+ * <inlinegraphic fileref="gwy_grain_correlation-24.png" format="PNG"/>
+ *
+ * Since: 2.45
+ **/
+
+/**
+ * GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE:
+ *
+ * The "Grain-Exscribed-Circle" stock icon.
+ * <inlinegraphic fileref="gwy_grain_exscribed_circle-24.png" format="PNG"/>
+ *
+ * Since: 2.45
+ **/
+
+/**
+ * GWY_STOCK_GRAIN_INSCRIBED_CIRCLE:
+ *
+ * The "Grain-Inscribed-Circle" stock icon.
+ * <inlinegraphic fileref="gwy_grain_inscribed_circle-24.png" format="PNG"/>
+ *
+ * Since: 2.45
+ **/
+
+/**
  * GWY_STOCK_GRAINS:
  *
  * The "Grains" stock icon.
@@ -649,33 +730,6 @@ file_to_icon_source(const gchar *path,
  **/
 
 /**
- * GWY_STOCK_GRAIN_CORRELATION:
- *
- * The "Grain-Correlation" stock icon.
- * <inlinegraphic fileref="gwy_grain_correlation-24.png" format="PNG"/>
- *
- * Since: 2.45
- **/
-
-/**
- * GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE:
- *
- * The "Grain-Exscribed-Circle" stock icon.
- * <inlinegraphic fileref="gwy_grain_exscribed_circle-24.png" format="PNG"/>
- *
- * Since: 2.45
- **/
-
-/**
- * GWY_STOCK_GRAIN_INSCRIBED_CIRCLE:
- *
- * The "Grain-Inscribed-Circle" stock icon.
- * <inlinegraphic fileref="gwy_grain_inscribed_circle-24.png" format="PNG"/>
- *
- * Since: 2.45
- **/
-
-/**
  * GWY_STOCK_GRAPH:
  *
  * The "Graph" stock icon.
@@ -972,6 +1026,24 @@ file_to_icon_source(const gchar *path,
  **/
 
 /**
+ * GWY_STOCK_MARK_OUTLIERS:
+ *
+ * The "Mark-Outliers" stock icon.
+ * <inlinegraphic fileref="gwy_mark_outliers-24.png" format="PNG"/>
+ *
+ * Since: 2.48
+ **/
+
+/**
+ * GWY_STOCK_MARK_SCARS:
+ *
+ * The "Mark-Scars" stock icon.
+ * <inlinegraphic fileref="gwy_mark_scars-24.png" format="PNG"/>
+ *
+ * Since: 2.48
+ **/
+
+/**
  * GWY_STOCK_MARK_WITH:
  *
  * The "Mark-With" stock icon.
@@ -1151,6 +1223,15 @@ file_to_icon_source(const gchar *path,
  **/
 
 /**
+ * GWY_STOCK_MASK_SET:
+ *
+ * The "Mask-Set" stock icon.
+ * <inlinegraphic fileref="gwy_mask_set-24.png" format="PNG"/>
+ *
+ * Since: 2.49
+ **/
+
+/**
  * GWY_STOCK_MASK_SHRINK:
  *
  * The "Mask-Shrink" stock icon.
@@ -1226,6 +1307,24 @@ file_to_icon_source(const gchar *path,
  **/
 
 /**
+ * GWY_STOCK_NEXT:
+ *
+ * The "Next" stock icon.
+ * <inlinegraphic fileref="gwy_next-24.png" format="PNG"/>
+ *
+ * Since: 2.49
+ **/
+
+/**
+ * GWY_STOCK_NULL_OFFSETS:
+ *
+ * The "Null-Offsets" stock icon.
+ * <inlinegraphic fileref="gwy_null_offsets-24.png" format="PNG"/>
+ *
+ * Since: 2.48
+ **/
+
+/**
  * GWY_STOCK_PALETTES:
  *
  * The "Palettes" stock icon.
@@ -1249,6 +1348,15 @@ file_to_icon_source(const gchar *path,
  **/
 
 /**
+ * GWY_STOCK_POLY_DISTORT:
+ *
+ * The "Poly-Distort" stock icon.
+ * <inlinegraphic fileref="gwy_poly_distort-24.png" format="PNG"/>
+ *
+ * Since: 2.46
+ **/
+
+/**
  * GWY_STOCK_POLYNOM:
  *
  * The "Polynom" stock icon.
@@ -1265,12 +1373,12 @@ file_to_icon_source(const gchar *path,
  **/
 
 /**
- * GWY_STOCK_POLY_DISTORT:
+ * GWY_STOCK_PREVIOUS:
  *
- * The "Poly-Distort" stock icon.
- * <inlinegraphic fileref="gwy_poly_distort-24.png" format="PNG"/>
+ * The "Previous" stock icon.
+ * <inlinegraphic fileref="gwy_previous-24.png" format="PNG"/>
  *
- * Since: 2.46
+ * Since: 2.49
  **/
 
 /**
@@ -1329,6 +1437,15 @@ file_to_icon_source(const gchar *path,
  **/
 
 /**
+ * GWY_STOCK_ROTATE_3D:
+ *
+ * The "Rotate-3D" stock icon.
+ * <inlinegraphic fileref="gwy_rotate_3d-24.png" format="PNG"/>
+ *
+ * Since: 2.49
+ **/
+
+/**
  * GWY_STOCK_ROTATE_90_CCW:
  *
  * The "Rotate-90-CCW" stock icon.
@@ -1476,6 +1593,15 @@ file_to_icon_source(const gchar *path,
  **/
 
 /**
+ * GWY_STOCK_SYNTHETIC_FIBRES:
+ *
+ * The "Synthetic-Fibres" stock icon.
+ * <inlinegraphic fileref="gwy_synthetic_fibres-24.png" format="PNG"/>
+ *
+ * Since: 2.49
+ **/
+
+/**
  * GWY_STOCK_SYNTHETIC_LATTICE:
  *
  * The "Synthetic-Lattice" stock icon.
@@ -1530,6 +1656,15 @@ file_to_icon_source(const gchar *path,
  **/
 
 /**
+ * GWY_STOCK_SYNTHETIC_PHASES:
+ *
+ * The "Synthetic-Phases" stock icon.
+ * <inlinegraphic fileref="gwy_synthetic_phases-24.png" format="PNG"/>
+ *
+ * Since: 2.48
+ **/
+
+/**
  * GWY_STOCK_SYNTHETIC_SPECTRAL:
  *
  * The "Synthetic-Spectral" stock icon.
@@ -1733,6 +1868,15 @@ file_to_icon_source(const gchar *path,
  **/
 
 /**
+ * GWY_STOCK_XY_DENOISE:
+ *
+ * The "Xy-Denoise" stock icon.
+ * <inlinegraphic fileref="gwy_xy_denoise-24.png" format="PNG"/>
+ *
+ * Since: 2.48
+ **/
+
+/**
  * GWY_STOCK_ZERO_MEAN:
  *
  * The "Zero-Mean" stock icon.
diff --git a/libgwydgets/gwystock.h b/libgwydgets/gwystock.h
index 6047949..630dcd5 100644
--- a/libgwydgets/gwystock.h
+++ b/libgwydgets/gwystock.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwystock.h 18961 2016-09-17 07:38:23Z yeti-dn $
+ *  @(#) $Id: gwystock.h 20258 2017-08-12 08:17:43Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -40,9 +40,11 @@ G_BEGIN_DECLS
 #define GWY_STOCK_COLOR_RANGE_FULL               "gwy_color_range_full"
 #define GWY_STOCK_CONVOLUTION                    "gwy_convolution"
 #define GWY_STOCK_CORRECT_AFFINE                 "gwy_correct_affine"
+#define GWY_STOCK_CORRELATION_MASK               "gwy_correlation_mask"
 #define GWY_STOCK_CROP                           "gwy_crop"
 #define GWY_STOCK_CWT                            "gwy_cwt"
 #define GWY_STOCK_DATA_MEASURE                   "gwy_data_measure"
+#define GWY_STOCK_DISCONNECTED                   "gwy_disconnected"
 #define GWY_STOCK_DISTANCE                       "gwy_distance"
 #define GWY_STOCK_DISTANCE_TRANSFORM             "gwy_distance_transform"
 #define GWY_STOCK_DISTRIBUTION_ANGLE             "gwy_distribution_angle"
@@ -58,16 +60,23 @@ G_BEGIN_DECLS
 #define GWY_STOCK_FAVOURITE                      "gwy_favourite"
 #define GWY_STOCK_FFT                            "gwy_fft"
 #define GWY_STOCK_FFT_2D                         "gwy_fft_2d"
+#define GWY_STOCK_FFT_FILTER_1D                  "gwy_fft_filter_1d"
 #define GWY_STOCK_FFT_FILTER_2D                  "gwy_fft_filter_2d"
 #define GWY_STOCK_FILTER                         "gwy_filter"
 #define GWY_STOCK_FIND_PEAKS                     "gwy_find_peaks"
+#define GWY_STOCK_FIT_SHAPE                      "gwy_fit_shape"
 #define GWY_STOCK_FIX_ZERO                       "gwy_fix_zero"
 #define GWY_STOCK_FLIP_HORIZONTALLY              "gwy_flip_horizontally"
 #define GWY_STOCK_FLIP_VERTICALLY                "gwy_flip_vertically"
 #define GWY_STOCK_FRACTAL                        "gwy_fractal"
+#define GWY_STOCK_FRACTAL_CORRECTION             "gwy_fractal_correction"
+#define GWY_STOCK_FRACTAL_MEASURE                "gwy_fractal_measure"
 #define GWY_STOCK_GL_MATERIAL                    "gwy_gl_material"
 #define GWY_STOCK_GRADIENT_HORIZONTAL            "gwy_gradient_horizontal"
 #define GWY_STOCK_GRADIENT_VERTICAL              "gwy_gradient_vertical"
+#define GWY_STOCK_GRAIN_CORRELATION              "gwy_grain_correlation"
+#define GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE         "gwy_grain_exscribed_circle"
+#define GWY_STOCK_GRAIN_INSCRIBED_CIRCLE         "gwy_grain_inscribed_circle"
 #define GWY_STOCK_GRAINS                         "gwy_grains"
 #define GWY_STOCK_GRAINS_EDGE                    "gwy_grains_edge"
 #define GWY_STOCK_GRAINS_EDGE_REMOVE             "gwy_grains_edge_remove"
@@ -75,9 +84,6 @@ G_BEGIN_DECLS
 #define GWY_STOCK_GRAINS_MEASURE                 "gwy_grains_measure"
 #define GWY_STOCK_GRAINS_REMOVE                  "gwy_grains_remove"
 #define GWY_STOCK_GRAINS_WATER                   "gwy_grains_water"
-#define GWY_STOCK_GRAIN_CORRELATION              "gwy_grain_correlation"
-#define GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE         "gwy_grain_exscribed_circle"
-#define GWY_STOCK_GRAIN_INSCRIBED_CIRCLE         "gwy_grain_inscribed_circle"
 #define GWY_STOCK_GRAPH                          "gwy_graph"
 #define GWY_STOCK_GRAPH_ALIGN                    "gwy_graph_align"
 #define GWY_STOCK_GRAPH_CUT                      "gwy_graph_cut"
@@ -116,6 +122,8 @@ G_BEGIN_DECLS
 #define GWY_STOCK_LOCAL_SLOPE                    "gwy_local_slope"
 #define GWY_STOCK_LOGSCALE_HORIZONTAL            "gwy_logscale_horizontal"
 #define GWY_STOCK_LOGSCALE_VERTICAL              "gwy_logscale_vertical"
+#define GWY_STOCK_MARK_OUTLIERS                  "gwy_mark_outliers"
+#define GWY_STOCK_MARK_SCARS                     "gwy_mark_scars"
 #define GWY_STOCK_MARK_WITH                      "gwy_mark_with"
 #define GWY_STOCK_MASK                           "gwy_mask"
 #define GWY_STOCK_MASK_ADD                       "gwy_mask_add"
@@ -139,6 +147,7 @@ G_BEGIN_DECLS
 #define GWY_STOCK_MASK_RECT_EXCLUSIVE            "gwy_mask_rect_exclusive"
 #define GWY_STOCK_MASK_RECT_INCLUSIVE            "gwy_mask_rect_inclusive"
 #define GWY_STOCK_MASK_REMOVE                    "gwy_mask_remove"
+#define GWY_STOCK_MASK_SET                       "gwy_mask_set"
 #define GWY_STOCK_MASK_SHRINK                    "gwy_mask_shrink"
 #define GWY_STOCK_MASK_SUBTRACT                  "gwy_mask_subtract"
 #define GWY_STOCK_MASK_THIN                      "gwy_mask_thin"
@@ -148,12 +157,15 @@ G_BEGIN_DECLS
 #define GWY_STOCK_MUTUAL_CROP                    "gwy_mutual_crop"
 #define GWY_STOCK_NEURAL_APPLY                   "gwy_neural_apply"
 #define GWY_STOCK_NEURAL_TRAIN                   "gwy_neural_train"
+#define GWY_STOCK_NEXT                           "gwy_next"
+#define GWY_STOCK_NULL_OFFSETS                   "gwy_null_offsets"
 #define GWY_STOCK_PALETTES                       "gwy_palettes"
 #define GWY_STOCK_PATH_LEVEL                     "gwy_path_level"
 #define GWY_STOCK_POINTER_MEASURE                "gwy_pointer_measure"
+#define GWY_STOCK_POLY_DISTORT                   "gwy_poly_distort"
 #define GWY_STOCK_POLYNOM                        "gwy_polynom"
 #define GWY_STOCK_POLYNOM_LEVEL                  "gwy_polynom_level"
-#define GWY_STOCK_POLY_DISTORT                   "gwy_poly_distort"
+#define GWY_STOCK_PREVIOUS                       "gwy_previous"
 #define GWY_STOCK_PROFILE                        "gwy_profile"
 #define GWY_STOCK_PSDF_LOG_PHI                   "gwy_psdf_log_phi"
 #define GWY_STOCK_PSDF_SECTION                   "gwy_psdf_section"
@@ -161,6 +173,7 @@ G_BEGIN_DECLS
 #define GWY_STOCK_REMOVE_UNDER_MASK              "gwy_remove_under_mask"
 #define GWY_STOCK_ROTATE                         "gwy_rotate"
 #define GWY_STOCK_ROTATE_180                     "gwy_rotate_180"
+#define GWY_STOCK_ROTATE_3D                      "gwy_rotate_3d"
 #define GWY_STOCK_ROTATE_90_CCW                  "gwy_rotate_90_ccw"
 #define GWY_STOCK_ROTATE_90_CW                   "gwy_rotate_90_cw"
 #define GWY_STOCK_SCALE                          "gwy_scale"
@@ -180,12 +193,14 @@ G_BEGIN_DECLS
 #define GWY_STOCK_SYNTHETIC_COLUMNAR             "gwy_synthetic_columnar"
 #define GWY_STOCK_SYNTHETIC_DIFFUSION            "gwy_synthetic_diffusion"
 #define GWY_STOCK_SYNTHETIC_DOMAINS              "gwy_synthetic_domains"
+#define GWY_STOCK_SYNTHETIC_FIBRES               "gwy_synthetic_fibres"
 #define GWY_STOCK_SYNTHETIC_LATTICE              "gwy_synthetic_lattice"
 #define GWY_STOCK_SYNTHETIC_LINE_NOISE           "gwy_synthetic_line_noise"
 #define GWY_STOCK_SYNTHETIC_NOISE                "gwy_synthetic_noise"
 #define GWY_STOCK_SYNTHETIC_OBJECTS              "gwy_synthetic_objects"
 #define GWY_STOCK_SYNTHETIC_PARTICLES            "gwy_synthetic_particles"
 #define GWY_STOCK_SYNTHETIC_PATTERN              "gwy_synthetic_pattern"
+#define GWY_STOCK_SYNTHETIC_PHASES               "gwy_synthetic_phases"
 #define GWY_STOCK_SYNTHETIC_SPECTRAL             "gwy_synthetic_spectral"
 #define GWY_STOCK_SYNTHETIC_WAVES                "gwy_synthetic_waves"
 #define GWY_STOCK_TILT                           "gwy_tilt"
@@ -209,6 +224,7 @@ G_BEGIN_DECLS
 #define GWY_STOCK_VOLUME_SLICE                   "gwy_volume_slice"
 #define GWY_STOCK_VOLUMIZE                       "gwy_volumize"
 #define GWY_STOCK_VOLUMIZE_LAYERS                "gwy_volumize_layers"
+#define GWY_STOCK_XY_DENOISE                     "gwy_xy_denoise"
 #define GWY_STOCK_ZERO_MEAN                      "gwy_zero_mean"
 #define GWY_STOCK_ZOOM_1_1                       "gwy_zoom_1_1"
 #define GWY_STOCK_ZOOM_FIT                       "gwy_zoom_fit"
diff --git a/libgwymodule/Makefile.am b/libgwymodule/Makefile.am
index 04ce4eb..6a887d6 100644
--- a/libgwymodule/Makefile.am
+++ b/libgwymodule/Makefile.am
@@ -1,4 +1,4 @@
-# @(#) $Id: Makefile.am 18638 2016-04-24 09:31:03Z yeti-dn $
+# @(#) $Id: Makefile.am 20269 2017-08-14 11:21:07Z yeti-dn $
 
 libgwyddion = $(top_builddir)/libgwyddion/libgwyddion2.la
 libgwyprocess = $(top_builddir)/libprocess/libgwyprocess2.la
@@ -70,7 +70,7 @@ AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"GwyModule\"
 # Any iface change    C++: 0:   A
 # Adding ifaces       C:   R:   A++
 # Changing ifaces     C:   R:   0
-libversion = -version-info 9:0:9
+libversion = -version-info 11:0:11
 #libversion = -release @LIBRARY_RELEASE@
 libgwymodule2_la_LDFLAGS = @GMODULE_LIBS@ @GTK_LIBS@ @BASIC_LIBS@  -export-dynamic $(no_undefined) $(export_symbols) $(libversion)
 libgwymodule2_la_LIBADD = $(libgwymodule_libadd)
diff --git a/libgwymodule/Makefile.in b/libgwymodule/Makefile.in
index af92df3..de5c6e3 100644
--- a/libgwymodule/Makefile.in
+++ b/libgwymodule/Makefile.in
@@ -14,10 +14,10 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 18638 2016-04-24 09:31:03Z yeti-dn $
+# @(#) $Id: Makefile.am 20269 2017-08-14 11:21:07Z yeti-dn $
 
 # Generic glib-mkenum rules.
-# @(#) $Id: mkenum.mk 11705 2011-01-03 08:32:55Z yeti-dn $
+# @(#) $Id: mkenum.mk 20080 2017-07-24 16:05:52Z yeti-dn $
 #
 # Parameters:
 # MKENUM_NAME -- output base name
@@ -275,10 +275,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -288,6 +285,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -312,7 +311,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -370,6 +371,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -378,17 +380,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -519,9 +517,6 @@ MKENUM_HFILES = \
 	$(srcdir)/gwymoduleloader.h \
 	$(srcdir)/gwymodule-file.h
 
-
-# TODO: Detect
-GLIB_MKENUMS = glib-mkenums
 mkenum_built_sources = $(MKENUM_NAME).h $(MKENUM_NAME).c
 @MAINTAINER_MODE_TRUE at mkenum_stamp_files = $(MKENUM_NAME).h.stamp
 @MAINTAINER_MODE_TRUE at mkenum_self = $(top_srcdir)/utils/mkenum.mk
@@ -542,7 +537,7 @@ AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"GwyModule\"
 # Any iface change    C++: 0:   A
 # Adding ifaces       C:   R:   A++
 # Changing ifaces     C:   R:   0
-libversion = -version-info 9:0:9
+libversion = -version-info 11:0:11
 #libversion = -release @LIBRARY_RELEASE@
 libgwymodule2_la_LDFLAGS = @GMODULE_LIBS@ @GTK_LIBS@ @BASIC_LIBS@  -export-dynamic $(no_undefined) $(export_symbols) $(libversion)
 libgwymodule2_la_LIBADD = $(libgwymodule_libadd)
diff --git a/libgwymodule/gwymodule-file.c b/libgwymodule/gwymodule-file.c
index dec4cd6..dc7a21d 100644
--- a/libgwymodule/gwymodule-file.c
+++ b/libgwymodule/gwymodule-file.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwymodule-file.c 18070 2016-01-11 20:55:02Z yeti-dn $
+ *  @(#) $Id: gwymodule-file.c 19428 2017-01-18 12:22:20Z yeti-dn $
  *  Copyright (C) 2003,2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -436,7 +436,7 @@ static gboolean
 gwy_file_detect_fill_info(GwyFileDetectInfo *fileinfo,
                           gboolean only_name)
 {
-    struct stat st;
+    GStatBuf st;
     FILE *fh;
 
     g_return_val_if_fail(fileinfo && fileinfo->name, FALSE);
diff --git a/libgwymodule/gwymodulebrowser.c b/libgwymodule/gwymodulebrowser.c
index 6790e75..bada4f5 100644
--- a/libgwymodule/gwymodulebrowser.c
+++ b/libgwymodule/gwymodulebrowser.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwymodulebrowser.c 15598 2013-11-11 12:33:32Z yeti-dn $
+ *  @(#) $Id: gwymodulebrowser.c 20051 2017-07-10 09:11:41Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -25,7 +25,6 @@
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwyutils.h>
 #include <libgwymodule/gwymodulebrowser.h>
-#include "gwymoduleinternal.h"
 
 static GtkWidget* gwy_module_browser_construct    (GtkWidget *parent);
 static GtkWidget* gwy_module_browser_info_table   (GtkWidget *parent);
@@ -105,14 +104,14 @@ gwy_module_browser_store_module(const gchar *name,
 }
 
 static void
-gwy_module_browser_store_failure(G_GNUC_UNUSED const gchar *filename,
-                                 _GwyModuleFailureInfo *fail_info,
+gwy_module_browser_store_failure(GwyModuleFailureInfo *fail_info,
                                  GtkListStore *store)
 {
     GtkTreeIter iter;
+    const gchar *name = fail_info->modname ? fail_info->modname : "???";
 
     gtk_list_store_insert_with_values(store, &iter, G_MAXINT,
-                                      MODEL_NAME, fail_info->modname,
+                                      MODEL_NAME, name,
                                       MODEL_INFO, fail_info,
                                       MODEL_FAILED, TRUE,
                                       -1);
@@ -127,7 +126,7 @@ gwy_module_browser_render(G_GNUC_UNUSED GtkTreeViewColumn *column,
 {
     const gchar *name;
     const GwyModuleInfo *mod_info;
-    const _GwyModuleFailureInfo *fail_info;
+    const GwyModuleFailureInfo *fail_info;
     gboolean failed;
     const gchar *text;
 
@@ -202,8 +201,7 @@ gwy_module_browser_construct(GtkWidget *parent)
                                G_TYPE_POINTER,
                                G_TYPE_BOOLEAN);
     gwy_module_foreach((GHFunc)gwy_module_browser_store_module, store);
-    _gwy_module_failure_foreach((GHFunc)gwy_module_browser_store_failure,
-                                store);
+    gwy_module_failure_foreach((GFunc)gwy_module_browser_store_failure, store);
     gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store),
                                     MODEL_NAME, compare_modules, NULL, NULL);
     gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), MODEL_NAME,
@@ -283,7 +281,7 @@ update_module_info_cb(GtkWidget *tree,
     GtkTreeModel *store;
     GtkTreeSelection *selection;
     const GwyModuleInfo *mod_info;
-    const _GwyModuleFailureInfo *fail_info;
+    const GwyModuleFailureInfo *fail_info;
     const gchar *name;
     gboolean failed;
     GtkTreeIter iter;
@@ -317,7 +315,7 @@ update_module_info_cb(GtkWidget *tree,
         gtk_label_set_text(label, fail_info->filename);
 
         label = GTK_LABEL(g_object_get_data(G_OBJECT(parent), "failure"));
-        gtk_label_set_text(label, fail_info->message);
+        gtk_label_set_text(label, fail_info->err_message);
 
         return;
     }
diff --git a/libgwymodule/gwymoduleinternal.h b/libgwymodule/gwymoduleinternal.h
index cce0b38..294f38a 100644
--- a/libgwymodule/gwymoduleinternal.h
+++ b/libgwymodule/gwymoduleinternal.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwymoduleinternal.h 18322 2016-02-22 16:55:56Z yeti-dn $
+ *  @(#) $Id: gwymoduleinternal.h 20051 2017-07-10 09:11:41Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -39,7 +39,7 @@ G_BEGIN_DECLS
 
 /* internal module info */
 typedef struct {
-    GwyModuleInfo *mod_info;
+    const GwyModuleInfo *mod_info;
     gchar *name;
     gchar *file;
     gboolean loaded;
@@ -47,19 +47,22 @@ typedef struct {
 } _GwyModuleInfoInternal;
 
 typedef struct {
-    gchar *modname;
+    /* public fields, except the consts
+     * MUST correspond to GwyModuleFailureInfo */
     gchar *filename;
-    gchar *message;
-} _GwyModuleFailureInfo;
+    gchar *modname;
+    gchar *err_message;
+    gint err_domain;
+    gint err_code;
+    /* private fields */
+    gchar *key;
+} _GwyModuleFailureInfoInternal;
 
 G_GNUC_INTERNAL
 gboolean _gwy_module_add_registered_function(const gchar *prefix,
                                              const gchar *name);
 
 G_GNUC_INTERNAL
-void     _gwy_module_failure_foreach        (GHFunc function,
-                                             gpointer data);
-G_GNUC_INTERNAL
 gboolean _gwy_file_func_remove              (const gchar *name);
 
 G_GNUC_INTERNAL
diff --git a/libgwymodule/gwymoduleloader.c b/libgwymodule/gwymoduleloader.c
index c7fe7cd..130540f 100644
--- a/libgwymodule/gwymoduleloader.c
+++ b/libgwymodule/gwymoduleloader.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: gwymoduleloader.c 19278 2016-11-16 16:51:38Z yeti-dn $
- *  Copyright (C) 2003,2004 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: gwymoduleloader.c 20052 2017-07-10 09:12:58Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -40,20 +40,38 @@ typedef struct {
     gpointer data;
 } GwyModuleForeachData;
 
-static gboolean             check_python_availability    (void);
-static void                 gwy_load_modules_in_dir      (GDir *gdir,
-                                                          const gchar *dirname,
-                                                          GHashTable *mods);
-static gboolean             gwy_module_pedantic_check    (_GwyModuleInfoInternal *iinfo);
-static void                 gwy_module_get_rid_of        (const gchar *modname);
-static void                 gwy_module_init              (void);
-static const GwyModuleInfo* gwy_module_do_register_module(const gchar *modulename,
-                                                          GHashTable *mods,
-                                                          GError **error);
-static void                 gwy_module_register_fail     (GError *myerr,
-                                                          GError **error,
-                                                          const gchar *modname,
-                                                          const gchar *filename);
+typedef struct {
+    GFunc func;
+    gpointer data;
+} GwyModuleFailForeachData;
+
+static gboolean             check_python_availability     (void);
+static void                 gwy_load_modules_in_dir       (GDir *gdir,
+                                                           const gchar *dirname,
+                                                           GHashTable *mods);
+static gboolean             gwy_module_pedantic_check     (_GwyModuleInfoInternal *iinfo);
+static void                 gwy_module_get_rid_of         (const gchar *modname);
+static void                 gwy_module_init               (void);
+static const GwyModuleInfo* gwy_module_do_register_module (const gchar *modulename,
+                                                           GHashTable *mods,
+                                                           GError **error);
+static gboolean             gwy_module_check_module_name  (const gchar *modname,
+                                                           GHashTable *mods,
+                                                           GError **error);
+static gboolean             register_module_with_info     (GHashTable *mods,
+                                                           const GwyModuleInfo *mod_info,
+                                                           const gchar *filename,
+                                                           gchar *modname,
+                                                           gboolean in_bundle,
+                                                           GError **error);
+static gchar*               gwy_module_figure_out_name    (const gchar *filename);
+static void                 gwy_module_register_fail      (GError *myerr,
+                                                           GError **error,
+                                                           const gchar *modname,
+                                                           const gchar *filename);
+static GHashTable*          gwy_module_get_blocking_table (gboolean do_create);
+static gboolean             gwy_module_filename_is_blocked(const gchar *filename);
+static gboolean             gwy_module_name_is_blocked    (const gchar *modname);
 
 static GHashTable *modules = NULL;
 static GHashTable *failures = NULL;
@@ -89,6 +107,9 @@ gwy_module_error_quark(void)
  * It can be called several times (on different directories).  No errors are
  * reported, register modules individually with gwy_module_register_module()
  * to get registration errors.
+ *
+ * If you need to prevent specific modules from loading use
+ * gwy_module_disable_registration() beforehand.
  **/
 void
 gwy_module_register_modules(const gchar **paths)
@@ -132,13 +153,39 @@ _gwy_module_add_registered_function(const gchar *prefix,
     return TRUE;
 }
 
+static void
+gwy_module_failure_foreach_one(G_GNUC_UNUSED const gchar *key,
+                               _GwyModuleFailureInfoInternal *finfo,
+                               GwyModuleFailForeachData *data)
+{
+    data->func((GwyModuleFailureInfo*)finfo, data->data);
+}
 
+/**
+ * gwy_module_failure_foreach:
+ * @function: A #GFunc run for each module registration failure.
+ * @data: User data.
+ *
+ * Runs @function for each module that failed to register.
+ *
+ * It passes the failure info (#GwyModuleFailureInfo) as the data argument.
+ * It should be modified.
+ *
+ * Since: 2.49
+ **/
 void
-_gwy_module_failure_foreach(GHFunc function,
-                            gpointer data)
+gwy_module_failure_foreach(GFunc function, gpointer data)
 {
-    if (failures)
-        g_hash_table_foreach(failures, function, data);
+    GwyModuleFailForeachData fdata;
+
+    if (!failures)
+        return;
+
+    g_return_if_fail(function);
+    fdata.func = function;
+    fdata.data = data;
+    g_hash_table_foreach(failures,
+                         (GHFunc)&gwy_module_failure_foreach_one, &fdata);
 }
 
 static void
@@ -146,7 +193,7 @@ gwy_module_foreach_one(const gchar *name,
                        _GwyModuleInfoInternal *iinfo,
                        GwyModuleForeachData *fdata)
 {
-    fdata->func((gpointer)name, iinfo->mod_info, fdata->data);
+    fdata->func((gpointer)name, (gpointer)iinfo->mod_info, fdata->data);
 }
 
 /**
@@ -229,6 +276,9 @@ gwy_module_get_functions(const gchar *name)
  *
  * Loads a single module.
  *
+ * This function also works with bundles.  The returned module info is for the
+ * bundle and thus not of much use.
+ *
  * Returns: Module info on success, %NULL on failure.
  **/
 const GwyModuleInfo*
@@ -247,20 +297,25 @@ gwy_module_register_fail(GError *myerr,
                          const gchar *modname,
                          const gchar *filename)
 {
-    _GwyModuleFailureInfo *finfo;
+    _GwyModuleFailureInfoInternal *finfo;
 
     if (!failures)
         failures = g_hash_table_new(g_str_hash, g_str_equal);
 
-    if (g_hash_table_lookup(failures, filename))
+    if (g_hash_table_lookup(failures, filename)) {
+        g_clear_error(&myerr);
         return;
+    }
 
     g_return_if_fail(myerr);
-    finfo = g_new(_GwyModuleFailureInfo, 1);
+    finfo = g_new(_GwyModuleFailureInfoInternal, 1);
+    finfo->key = g_strconcat(filename, "/", modname, NULL);
     finfo->modname = g_strdup(modname);
     finfo->filename = g_strdup(filename);
-    finfo->message = g_strdup(myerr->message);
-    g_hash_table_insert(failures, finfo->filename, finfo);
+    finfo->err_message = g_strdup(myerr->message);
+    finfo->err_domain = myerr->domain;
+    finfo->err_code = myerr->code;
+    g_hash_table_insert(failures, finfo->key, finfo);
 
     g_propagate_error(error, myerr);
 }
@@ -272,44 +327,13 @@ gwy_module_do_register_module(const gchar *filename,
 {
     GModule *mod;
     gboolean ok;
-    _GwyModuleInfoInternal *iinfo;
     GwyModuleInfo *mod_info = NULL;
     GwyModuleQueryFunc query;
-    gchar *modname, *s;
+    gchar *modname;
     GError *err = NULL;
 
-    s = g_path_get_basename(filename);
-    modname = g_ascii_strdown(s, -1);
-    g_free(s);
-    /* FIXME: On normal platforms module names have an extension, but if
-     * it doesn't, just get over it.  This can happen only with explicit
-     * gwy_module_register_module() as gwy_load_modules_in_dir() accepts
-     * only sane names. */
-    if ((s = strchr(modname, '.')))
-        *s = '\0';
-    if (!*modname) {
-        g_set_error(&err, GWY_MODULE_ERROR, GWY_MODULE_ERROR_NAME,
-                    "Module name is empty");
-        gwy_module_register_fail(err, error, modname, filename);
-        g_free(modname);
-        return NULL;
-    }
-
-    if (!gwy_strisident(modname, "_-", NULL))
-        g_warning("Module name `%s' is not a valid identifier. "
-                  "It may be rejected in future.", modname);
-
-    if (g_hash_table_lookup(mods, modname)) {
-        g_set_error(&err, GWY_MODULE_ERROR, GWY_MODULE_ERROR_DUPLICATE,
-                    "Module was already registered");
-        gwy_module_register_fail(err, error, modname, filename);
-        g_free(modname);
-        return NULL;
-    }
-
-    if (gwy_strequal(modname, "pygwy") && !check_python_availability()) {
-        g_set_error(&err, GWY_MODULE_ERROR, GWY_MODULE_ERROR_OPEN,
-                    "Avoiding to register pygwy if Python is unavailable.");
+    modname = gwy_module_figure_out_name(filename);
+    if (!gwy_module_check_module_name(modname, mods, &err)) {
         gwy_module_register_fail(err, error, modname, filename);
         g_free(modname);
         return NULL;
@@ -340,16 +364,138 @@ gwy_module_do_register_module(const gchar *filename,
 
     if (ok) {
         mod_info = query();
-        if (!mod_info) {
-            g_set_error(&err, GWY_MODULE_ERROR, GWY_MODULE_ERROR_INFO,
-                        "Module info is NULL");
-            gwy_module_register_fail(err, error, modname, filename);
-            ok = FALSE;
+        /* register_module_with_info() always consumes (or frees) modname */
+        ok = register_module_with_info(mods, mod_info, filename, modname, FALSE,
+                                       error);
+        if (ok) {
+            gwy_debug("Making module `%s' resident.", filename);
+            g_module_make_resident(mod);
+        }
+        else {
+            if (!g_module_close(mod)) {
+                g_critical("Cannot unload module `%s': %s",
+                           filename, g_module_error());
+            }
+        }
+    }
+    else
+        g_free(modname);
+
+    currenly_registered_module = NULL;
+
+    return ok ? mod_info : NULL;
+}
+
+static gboolean
+register_module_bundle(GHashTable *mods, const GwyModuleInfo *bundle_info,
+                       const gchar *filename, const gchar *bundlename,
+                       GError **error)
+{
+    const GwyModuleInfo *mod_info;
+    GwyModuleQueryFunc query;
+    const GwyModuleRecord *records;
+    GwyModuleBundleRegisterFunc register_bundle;
+    GError *err = NULL;
+    gchar *modname;
+    guint i, nok = 0;
+
+    if (!bundle_info->register_func) {
+        g_set_error(&err, GWY_MODULE_ERROR, GWY_MODULE_ERROR_ABI,
+                    "Module bundle %s info has no registration function",
+                    bundlename);
+        gwy_module_register_fail(err, error, bundlename, filename);
+        return FALSE;
+    }
+
+    register_bundle = (GwyModuleBundleRegisterFunc)(bundle_info->register_func);
+    records = register_bundle();
+    if (!records) {
+        g_set_error(&err, GWY_MODULE_ERROR, GWY_MODULE_ERROR_ABI,
+                    "Module bundle %s returned NULL module records",
+                    bundlename);
+        gwy_module_register_fail(err, error, bundlename, filename);
+        return FALSE;
+    }
+
+    for (i = 0; records[i].query && records[i].name; i++) {
+        gwy_debug("bundle module record for %s", records[i].name);
+        if (gwy_module_name_is_blocked(records[i].name))
+            continue;
+
+        err = NULL;
+        if (!gwy_module_check_module_name(records[i].name, mods, &err)) {
+            gwy_module_register_fail(err, error, records[i].name, filename);
+            continue;
+        }
+
+        query = records[i].query;
+        modname = g_strdup(records[i].name);
+        currenly_registered_module = modname;
+        mod_info = query();
+        if (mod_info) {
+            /* TODO: Must again check duplicit names, etc. */
+            if (register_module_with_info(mods, mod_info, filename,
+                                          modname, TRUE, NULL))
+                nok++;
         }
+        else
+            g_free(modname);
+
+        currenly_registered_module = NULL;
+    }
+
+    if (nok > 0)
+        return TRUE;
+
+    /* FIXME: Could be report errors in more detail? */
+    g_set_error(error, GWY_MODULE_ERROR, GWY_MODULE_ERROR_ABI,
+                "Module bundle %s did not successfully register any module",
+                bundlename);
+    return FALSE;
+}
+
+static gboolean
+register_module_with_info(GHashTable *mods, const GwyModuleInfo *mod_info,
+                          const gchar *filename, gchar *modname,
+                          gboolean in_bundle, GError **error)
+{
+    _GwyModuleInfoInternal *iinfo;
+    GError *err = NULL;
+    gboolean ok = TRUE;
+    guint abi_version;
+
+    if (!mod_info) {
+        g_set_error(&err, GWY_MODULE_ERROR, GWY_MODULE_ERROR_INFO,
+                    "Module info is NULL");
+        gwy_module_register_fail(err, error, modname, filename);
+        ok = FALSE;
     }
 
     if (ok) {
-        ok = mod_info->abi_version == GWY_MODULE_ABI_VERSION;
+        abi_version = mod_info->abi_version;
+        if (abi_version & GWY_MODULE_BUNDLE_FLAG) {
+            gwy_debug("bundle flag found on %s", filename);
+            if (in_bundle) {
+                g_set_error(&err, GWY_MODULE_ERROR, GWY_MODULE_ERROR_NESTING,
+                            "Nested module bundles are insane "
+                            "and not supported.");
+                gwy_module_register_fail(err, error, modname, filename);
+                g_free(modname);
+                return FALSE;
+            }
+            abi_version &= ~(GWY_MODULE_BUNDLE_FLAG);
+            if (abi_version == GWY_MODULE_ABI_VERSION) {
+                ok = register_module_bundle(mods, mod_info,
+                                            filename, modname, error);
+                g_free(modname);
+                return ok;
+            }
+            ok = FALSE;
+        }
+        else {
+            ok = (abi_version == GWY_MODULE_ABI_VERSION);
+        }
+
         if (!ok) {
             g_set_error(&err, GWY_MODULE_ERROR, GWY_MODULE_ERROR_ABI,
                         "Module ABI version %d differs from %d",
@@ -359,12 +505,12 @@ gwy_module_do_register_module(const gchar *filename,
     }
 
     if (ok) {
-        ok = mod_info->register_func
-                && mod_info->blurb && *mod_info->blurb
-                && mod_info->author && *mod_info->author
-                && mod_info->version && *mod_info->version
-                && mod_info->copyright && *mod_info->copyright
-                && mod_info->date && *mod_info->date;
+        ok = (mod_info->register_func
+              && mod_info->blurb && *mod_info->blurb
+              && mod_info->author && *mod_info->author
+              && mod_info->version && *mod_info->version
+              && mod_info->copyright && *mod_info->copyright
+              && mod_info->date && *mod_info->date);
         if (!ok) {
             g_set_error(&err, GWY_MODULE_ERROR, GWY_MODULE_ERROR_ABI,
                         "Module info has missing/invalid fields");
@@ -394,25 +540,63 @@ gwy_module_do_register_module(const gchar *filename,
 
         if (ok)
             gwy_module_pedantic_check(iinfo);
-        else {
+        else
             gwy_module_get_rid_of(iinfo->name);
-            modname = NULL;
-        }
     }
+    else
+        g_free(modname);
 
-    if (ok) {
-        gwy_debug("Making module `%s' resident.", filename);
-        g_module_make_resident(mod);
+    return ok;
+}
+
+static gchar*
+gwy_module_figure_out_name(const gchar *filename)
+{
+    gchar *modname, *s;
+    guint i;
+
+    modname = g_path_get_basename(filename);
+    for (i = 0; modname[i]; i++)
+        modname[i] = g_ascii_tolower(modname[i]);
+
+    /* FIXME: On normal platforms module names have an extension, but if
+     * it doesn't, just get over it.  This can happen only with explicit
+     * gwy_module_register_module() as gwy_load_modules_in_dir() accepts
+     * only sane names. */
+    if ((s = strchr(modname, '.')))
+        *s = '\0';
+
+    return modname;
+}
+
+static gboolean
+gwy_module_check_module_name(const gchar *modname,
+                             GHashTable *mods,
+                             GError **error)
+{
+    if (!modname || !*modname) {
+        g_set_error(error, GWY_MODULE_ERROR, GWY_MODULE_ERROR_NAME,
+                    "Module name is empty");
+        return FALSE;
     }
-    else {
-        if (!g_module_close(mod))
-            g_critical("Cannot unload module `%s': %s",
-                       filename, g_module_error());
-        g_free(modname);
+
+    if (!gwy_strisident(modname, "_-", NULL))
+        g_warning("Module name `%s' is not a valid identifier. "
+                  "It may be rejected in future.", modname);
+
+    if (g_hash_table_lookup(mods, modname)) {
+        g_set_error(error, GWY_MODULE_ERROR, GWY_MODULE_ERROR_DUPLICATE,
+                    "Module was already registered");
+        return FALSE;
     }
-    currenly_registered_module = NULL;
 
-    return ok ? mod_info : NULL;
+    if (gwy_strequal(modname, "pygwy") && !check_python_availability()) {
+        g_set_error(error, GWY_MODULE_ERROR, GWY_MODULE_ERROR_OPEN,
+                    "Avoiding to register pygwy if Python is unavailable.");
+        return FALSE;
+    }
+
+    return TRUE;
 }
 
 /* XXX: If python is not available loading pygwy can pop up weird boxes.  Fix
@@ -492,9 +676,15 @@ gwy_load_modules_in_dir(GDir *gdir,
         if (!g_str_has_suffix(filename, "." G_MODULE_SUFFIX))
 #endif
             continue;
-        modulename = g_build_filename(dirname, filename, NULL);
-        gwy_module_do_register_module(modulename, mods, NULL);
-        g_free(modulename);
+
+        /* FIXME: Should we block bundles here?  Probably, because we may want
+         * to block things *before* we try to dlopen() them.  This allows to
+         * get out of some hairy situations. */
+        if (!gwy_module_filename_is_blocked(filename)) {
+            modulename = g_build_filename(dirname, filename, NULL);
+            gwy_module_do_register_module(modulename, mods, NULL);
+            g_free(modulename);
+        }
     }
 }
 
@@ -646,10 +836,142 @@ gwy_module_lookup(const gchar *name)
 {
     _GwyModuleInfoInternal *info;
 
+    if (!modules)
+        return NULL;
+
     info = g_hash_table_lookup(modules, name);
     return info ? info->mod_info : NULL;
 }
 
+/**
+ * gwy_module_disable_registration:
+ * @name: A module name.
+ *
+ * Prevents the registration of a module of given name.
+ *
+ * This function blocks future module registration using
+ * gwy_module_register_modules().  Already loaded modules are unaffected.
+ * The low-level module loading function gwy_module_register_module() always
+ * attempts to load the module, even if blocked.
+ *
+ * Since: 2.48
+ **/
+void
+gwy_module_disable_registration(const gchar *name)
+{
+    GHashTable *blocked_modules;
+    GQuark quark;
+
+    g_return_if_fail(name);
+    blocked_modules = gwy_module_get_blocking_table(TRUE);
+    quark = g_quark_from_string(name);
+    g_hash_table_insert(blocked_modules,
+                        GSIZE_TO_POINTER(quark), GINT_TO_POINTER(TRUE));
+}
+
+/**
+ * gwy_module_enable_registration:
+ * @name: A module name.
+ *
+ * Unblocks the registration of a module of given name.
+ *
+ * This function influences future module registration.  Already loaded modules
+ * are unaffected.
+ *
+ * Since: 2.48
+ **/
+void
+gwy_module_enable_registration(const gchar *name)
+{
+    GHashTable *blocked_modules;
+    GQuark quark;
+
+    g_return_if_fail(name);
+    blocked_modules = gwy_module_get_blocking_table(FALSE);
+    if (!blocked_modules)
+        return;
+
+    quark = g_quark_from_string(name);
+    g_hash_table_remove(blocked_modules, GSIZE_TO_POINTER(quark));
+}
+
+/**
+ * gwy_module_is_enabled:
+ * @name: A module name.
+ *
+ * Reports whether the registration of a module is enabled.
+ *
+ * If the registration of module @name was prevented using
+ * gwy_module_disable_registration() and not subsequently re-enabled
+ * using gwy_module_enabled_registration() this function returns %FALSE.
+ *
+ * The reported values only represents the current state of blocking.  A module
+ * @name could have been loaded when it was not blocked.
+ *
+ * Returns: %TRUE if module @name can be registered; %FALSE when it is blocked
+ *          from registration.
+ *
+ * Since: 2.48
+ **/
+gboolean
+gwy_module_is_enabled(const gchar *name)
+{
+    GHashTable *blocked_modules;
+    GQuark quark;
+
+    g_return_val_if_fail(name, FALSE);
+    blocked_modules = gwy_module_get_blocking_table(FALSE);
+    if (!blocked_modules)
+        return TRUE;
+
+    quark = g_quark_from_string(name);
+    return !g_hash_table_lookup(blocked_modules, GSIZE_TO_POINTER(quark));
+}
+
+static gboolean
+gwy_module_filename_is_blocked(const gchar *filename)
+{
+    GHashTable *blocked_modules;
+    gchar *modname;
+    GQuark quark;
+
+    blocked_modules = gwy_module_get_blocking_table(FALSE);
+    if (!blocked_modules)
+        return FALSE;
+
+    modname = gwy_module_figure_out_name(filename);
+    quark = g_quark_from_string(modname);
+    g_free(modname);
+
+    return !!g_hash_table_lookup(blocked_modules, GSIZE_TO_POINTER(quark));
+}
+
+static gboolean
+gwy_module_name_is_blocked(const gchar *modname)
+{
+    GHashTable *blocked_modules;
+    GQuark quark;
+
+    blocked_modules = gwy_module_get_blocking_table(FALSE);
+    if (!blocked_modules)
+        return FALSE;
+
+    quark = g_quark_from_string(modname);
+
+    return !!g_hash_table_lookup(blocked_modules, GSIZE_TO_POINTER(quark));
+}
+
+static GHashTable*
+gwy_module_get_blocking_table(gboolean do_create)
+{
+    static GHashTable *blocked_modules = NULL;
+
+    if (!blocked_modules && do_create)
+        blocked_modules = g_hash_table_new(g_direct_hash, g_direct_equal);
+
+    return blocked_modules;
+}
+
 /************************** Documentation ****************************/
 
 /**
@@ -679,7 +1001,7 @@ gwy_module_lookup(const gchar *name)
  * The module query must be the ONLY exported symbol from a module.
  *
  * This macro does The Right Thing necessary to export module info in a way
- * Gwyddion understands it. Put #GWY_MODULE_QUERY with the module info
+ * Gwyddion understands it. Put %GWY_MODULE_QUERY with the module info
  * (#GwyModuleInfo) of your module as its argument on a line (with NO
  * semicolon after).
  *
@@ -695,26 +1017,40 @@ gwy_module_lookup(const gchar *name)
  * it is compiled using a C++ compiler.
  **/
 
-/*
- * GWY_MODULE_QUERY_BUILTIN:
+/**
+ * GWY_MODULE_QUERY2:
  * @mod_info: The #GwyModuleInfo structure to return as module info.
- * @name: Module name.  This is the base name of the source file with dashes
- *        and other non-identifier characters changed to underscores.  For
- *        instance module "nt-mdt.c" should pass nt_mdt.
- *
- * The declaration of module info query for built-in modules.
- *
- * See GWY_MODULE_QUERY() for discussion.  Using this macro instead of
- * GWY_MODULE_QUERY() changes the name of the exported query function and
- * enables integrating the module into the gwyddion executable.  This obviously
- * makes sense only for core modules that are distributed with Gwyddion,
- * however, it does no harm in third party modules as this macro functions
- * differently from GWY_MODULE_QUERY() only if preprocessor symbol
- * %GWY_MODULE_IS_BUILTIN is defined (which you do not do in an external
- * module).
- *
- * Since: 2.22
- */
+ * @mod_name: Module name.  It should be identical to the file name the module
+ *            would have if installed standalone, without any extension.
+ *            For instance module implemented in "nt-mdt.c" and installed as
+ *            "nt-mdt.so" or "nt-mdt.dll" (or with other extension, depending
+ *            on the platform) should pass "nt-mdt".
+ *
+ * The module query must be the ONLY exported symbol from a module.
+ *
+ * See %GWY_MODULE_QUERY for discussion.
+ *
+ * This macro is intended for modules that can be bundled together to one big
+ * shared library for time and space optimization.  This mostly makes sense
+ * only for modules included in Gwyddion itself as it contains hundreds of
+ * modules.
+ *
+ * However, it safe to use in third party modules because if modules
+ * are not bundled the macro behaves exactly as %GWY_MODULE_QUERY and the
+ * @mod_name argument is just ignored.  The macro expansion differs only when
+ * %GWY_MODULE_BUNDLING is defined when including the "gwymoduleloader.h"
+ * header.
+ *
+ * Since: 2.49
+ **/
+
+/**
+ * GWY_MODULE_BUNDLE_FLAG
+ *
+ * Value to bitwise combine with %GWY_MODULE_ABI_VERSION to indicate a bundle.
+ *
+ * Since: 2.49
+ **/
 
 /**
  * GwyModuleRegisterFunc:
@@ -724,10 +1060,14 @@ gwy_module_lookup(const gchar *name)
  * It actually runs particular featrue registration functions, like
  * gwy_file_func_register() and gwy_process_func_register().
  *
+ * If the module has a complex initialisation it may be safer to simply not
+ * register any function but return %TRUE even if it fails to set up itself
+ * correctly.  The module feature unregistration is somewhat crude and,
+ * generally, unregisteration may lead to disaster when shared library
+ * unloading has unexpected side effects.
+ *
  * Returns: Whether the registration succeeded.  When it returns %FALSE, the
- *          module and its features are unloaded (FIXME: maybe. Currenly only
- *          module is unloaded, features are NOT unregistered, this can lead
- *          to all kinds of disasters).
+ *          module and its features are unregistered.
  **/
 
 /**
@@ -743,6 +1083,17 @@ gwy_module_lookup(const gchar *name)
  **/
 
 /**
+ * GwyModuleBundleRegisterFunc:
+ *
+ * Module bundle query function type.
+ *
+ * It returns an array of module records for all modules in the bundle,
+ * terminated by {%NULL, %NULL}.
+ *
+ * Since: 2.49
+ **/
+
+/**
  * GwyModuleInfo:
  * @abi_version: Gwyddion module ABI version, should be always
  *               #GWY_MODULE_ABI_VERSION.
@@ -759,6 +1110,29 @@ gwy_module_lookup(const gchar *name)
  **/
 
 /**
+ * GwyModuleFailureInfo:
+ * @filename: Name of the file the module was loaded from.
+ * @modname: Module name (can be %NULL and contain odd bytes).
+ * @err_message: Error message from the failed module registration.
+ * @err_domain: #GError domain from the failed module registration.
+ * @err_code: #GError code from the failed module registration.
+ *
+ * Information about a failed module registration.
+ *
+ * Since: 2.49
+ **/
+
+/**
+ * GwyModuleRecord:
+ * @query: Module query function.
+ * @name: Module name (base file name without extensions).
+ *
+ * Module record returned by bundle query function.
+ *
+ * Since: 2.49
+ **/
+
+/**
  * GwyRunType:
  * @GWY_RUN_NONE: None.
  * @GWY_RUN_NONINTERACTIVE: The function is run non-interactively, it must not
@@ -796,6 +1170,7 @@ gwy_module_lookup(const gchar *name)
  * @GWY_MODULE_ERROR_INFO: Module query function provided %NULL info.
  * @GWY_MODULE_ERROR_REGISTER: The registration function returned %FALSE; or
  *                             the module did not register any function.
+ * @GWY_MODULE_ERROR_NESTING: Nested module bundle found.  (Since 2.49)
  *
  * Type of module loading and registration error.
  **/
diff --git a/libgwymodule/gwymoduleloader.h b/libgwymodule/gwymoduleloader.h
index 56e295c..9ae4b09 100644
--- a/libgwymodule/gwymoduleloader.h
+++ b/libgwymodule/gwymoduleloader.h
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: gwymoduleloader.h 15598 2013-11-11 12:33:32Z yeti-dn $
- *  Copyright (C) 2003,2004 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: gwymoduleloader.h 20051 2017-07-10 09:11:41Z yeti-dn $
+ *  Copyright (C) 2003,2004,2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -27,6 +27,7 @@
 G_BEGIN_DECLS
 
 #define GWY_MODULE_ABI_VERSION 2
+#define GWY_MODULE_BUNDLE_FLAG 256u
 
 #ifdef  __cplusplus
 #define __GWY_MODULE_QUERY_EXTERN_C extern "C"
@@ -36,7 +37,15 @@ G_BEGIN_DECLS
 
 #define GWY_MODULE_QUERY(mod_info) \
     __GWY_MODULE_QUERY_EXTERN_C G_MODULE_EXPORT GwyModuleInfo* \
-    _gwy_module_query(void) { return &mod_info; } \
+    _gwy_module_query(void) { return &mod_info; }
+
+#ifdef GWY_MODULE_BUNDLING
+#define GWY_MODULE_QUERY2(mod_info,mod_name) \
+    __GWY_MODULE_QUERY_EXTERN_C G_GNUC_INTERNAL GwyModuleInfo* \
+    _gwy_module_query__##mod_name(void) { return &mod_info; }
+#else
+#define GWY_MODULE_QUERY2(mod_info,mod_name) GWY_MODULE_QUERY(mod_info)
+#endif
 
 #define GWY_MODULE_ERROR gwy_module_error_quark()
 
@@ -47,14 +56,21 @@ typedef enum {
     GWY_MODULE_ERROR_QUERY,
     GWY_MODULE_ERROR_ABI,
     GWY_MODULE_ERROR_INFO,
-    GWY_MODULE_ERROR_REGISTER
+    GWY_MODULE_ERROR_REGISTER,
+    GWY_MODULE_ERROR_NESTING
 } GwyModuleError;
 
-/* FIXME: This is a public structure, remove the underscore indirection. */
 typedef struct _GwyModuleInfo GwyModuleInfo;
+typedef struct _GwyModuleRecord GwyModuleRecord;
 
-typedef gboolean       (*GwyModuleRegisterFunc) (void);
-typedef GwyModuleInfo* (*GwyModuleQueryFunc)    (void);
+typedef gboolean               (*GwyModuleRegisterFunc)       (void);
+typedef GwyModuleInfo*         (*GwyModuleQueryFunc)          (void);
+typedef const GwyModuleRecord* (*GwyModuleBundleRegisterFunc) (void);
+
+struct _GwyModuleRecord {
+    GwyModuleQueryFunc query;
+    const gchar *name;
+};
 
 struct _GwyModuleInfo {
     guint32 abi_version;
@@ -66,15 +82,28 @@ struct _GwyModuleInfo {
     const gchar *date;
 };
 
-GQuark                  gwy_module_error_quark      (void);
-void                    gwy_module_register_modules (const gchar **paths);
-const GwyModuleInfo*    gwy_module_lookup           (const gchar *name);
-const gchar*            gwy_module_get_filename     (const gchar *name);
-GSList*                 gwy_module_get_functions    (const gchar *name);
-void                    gwy_module_foreach          (GHFunc function,
+typedef struct {
+    const gchar *filename;
+    const gchar *modname;
+    const gchar *err_message;
+    gint err_domain;
+    gint err_code;
+} GwyModuleFailureInfo;
+
+GQuark               gwy_module_error_quark         (void);
+void                 gwy_module_register_modules    (const gchar **paths);
+const GwyModuleInfo* gwy_module_lookup              (const gchar *name);
+const gchar*         gwy_module_get_filename        (const gchar *name);
+GSList*              gwy_module_get_functions       (const gchar *name);
+void                 gwy_module_foreach             (GHFunc function,
+                                                     gpointer data);
+void                 gwy_module_failure_foreach     (GFunc function,
                                                      gpointer data);
-const GwyModuleInfo*    gwy_module_register_module  (const gchar *name,
+const GwyModuleInfo* gwy_module_register_module     (const gchar *name,
                                                      GError **error);
+void                 gwy_module_disable_registration(const gchar *name);
+void                 gwy_module_enable_registration (const gchar *name);
+gboolean             gwy_module_is_enabled          (const gchar *name);
 
 G_END_DECLS
 
diff --git a/libgwymodule/gwymoduletypes.c b/libgwymodule/gwymoduletypes.c
index 0da2ce3..e0e2e54 100644
--- a/libgwymodule/gwymoduletypes.c
+++ b/libgwymodule/gwymoduletypes.c
@@ -75,6 +75,7 @@ gwy_module_error_get_type(void)
             { GWY_MODULE_ERROR_ABI, "GWY_MODULE_ERROR_ABI", "abi" },
             { GWY_MODULE_ERROR_INFO, "GWY_MODULE_ERROR_INFO", "info" },
             { GWY_MODULE_ERROR_REGISTER, "GWY_MODULE_ERROR_REGISTER", "register" },
+            { GWY_MODULE_ERROR_NESTING, "GWY_MODULE_ERROR_NESTING", "nesting" },
             { 0, NULL, NULL }
         };
         etype = g_enum_register_static("GwyModuleError", values);
diff --git a/libprocess/Makefile.am b/libprocess/Makefile.am
index 249986c..f819277 100644
--- a/libprocess/Makefile.am
+++ b/libprocess/Makefile.am
@@ -1,4 +1,4 @@
-# @(#) $Id: Makefile.am 19258 2016-11-15 08:25:23Z yeti-dn $
+# @(#) $Id: Makefile.am 20269 2017-08-14 11:21:07Z yeti-dn $
 
 libgwyddion = $(top_builddir)/libgwyddion/libgwyddion2.la
 
@@ -47,10 +47,8 @@ libgwyprocess2include_HEADERS = \
 
 noinst_HEADERS = \
 	gwyprocessinternal.h \
-	monte-carlo-unc.h \
 	morph_lib.h \
-	natural.h \
-	wrappers.h
+	natural.h
 
 lib_LTLIBRARIES = libgwyprocess2.la
 
@@ -90,7 +88,7 @@ AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"GwyProcess\"
 # Any iface change    C++: 0:   A
 # Adding ifaces       C:   R:   A++
 # Changing ifaces     C:   R:   0
-libversion = -version-info 30:0:30
+libversion = -version-info 32:0:32
 #libversion = -release @LIBRARY_RELEASE@
 libgwyprocess2_la_LDFLAGS = @BASIC_LIBS@ @FFTW3_LIBS@ -export-dynamic $(no_undefined) $(export_symbols) $(libversion)
 libgwyprocess2_la_LIBADD = $(libgwyprocess_libadd)
@@ -101,6 +99,7 @@ libgwyprocess2_la_SOURCES = \
 	natural.c \
 	cdline.c \
 	correct.c \
+	correct-laplace.c \
 	correlation.c \
 	cwt.c \
 	datafield.c \
@@ -108,8 +107,12 @@ libgwyprocess2_la_SOURCES = \
 	dwt.c \
 	elliptic.c \
 	filters.c \
+	filters-minmax.c \
 	fractals.c \
 	grains.c \
+	grains-disttrans.c \
+	grains-values.c \
+	grains-wshed.c \
 	gwycaldata.c \
 	gwycalibration.c \
 	gwygrainvalue.c \
@@ -122,13 +125,15 @@ libgwyprocess2_la_SOURCES = \
 	inttrans.c \
 	level.c \
 	linestats.c \
-	monte-carlo-unc.c \
 	morph_lib.c \
 	peaks.c \
 	simplefft.c \
 	spectra.c \
 	spline.c \
 	stats.c \
+	stats-acfpsdf.c \
+	stats-entropy.c \
+	stats-sum.c \
 	stats_uncertainty.c \
 	surface.c \
 	tip.c \
diff --git a/libprocess/Makefile.in b/libprocess/Makefile.in
index fd0d548..2837388 100644
--- a/libprocess/Makefile.in
+++ b/libprocess/Makefile.in
@@ -14,10 +14,10 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 19258 2016-11-15 08:25:23Z yeti-dn $
+# @(#) $Id: Makefile.am 20269 2017-08-14 11:21:07Z yeti-dn $
 
 # Generic glib-mkenum rules.
-# @(#) $Id: mkenum.mk 11705 2011-01-03 08:32:55Z yeti-dn $
+# @(#) $Id: mkenum.mk 20080 2017-07-24 16:05:52Z yeti-dn $
 #
 # Parameters:
 # MKENUM_NAME -- output base name
@@ -160,13 +160,15 @@ am__installdirs = "$(DESTDIR)$(libdir)" \
 	"$(DESTDIR)$(libgwyprocess2includedir)"
 LTLIBRARIES = $(lib_LTLIBRARIES)
 am_libgwyprocess2_la_OBJECTS = arithmetic.lo brick.lo natural.lo \
-	cdline.lo correct.lo correlation.lo cwt.lo datafield.lo \
-	dataline.lo dwt.lo elliptic.lo filters.lo fractals.lo \
-	grains.lo gwycaldata.lo gwycalibration.lo gwygrainvalue.lo \
-	gwyprocess.lo gwyprocessenums.lo gwyprocesstypes.lo \
-	gwyshapefitpreset.lo hough.lo interpolation.lo inttrans.lo \
-	level.lo linestats.lo monte-carlo-unc.lo morph_lib.lo peaks.lo \
-	simplefft.lo spectra.lo spline.lo stats.lo \
+	cdline.lo correct.lo correct-laplace.lo correlation.lo cwt.lo \
+	datafield.lo dataline.lo dwt.lo elliptic.lo filters.lo \
+	filters-minmax.lo fractals.lo grains.lo grains-disttrans.lo \
+	grains-values.lo grains-wshed.lo gwycaldata.lo \
+	gwycalibration.lo gwygrainvalue.lo gwyprocess.lo \
+	gwyprocessenums.lo gwyprocesstypes.lo gwyshapefitpreset.lo \
+	hough.lo interpolation.lo inttrans.lo level.lo linestats.lo \
+	morph_lib.lo peaks.lo simplefft.lo spectra.lo spline.lo \
+	stats.lo stats-acfpsdf.lo stats-entropy.lo stats-sum.lo \
 	stats_uncertainty.lo surface.lo tip.lo triangulation.lo
 libgwyprocess2_la_OBJECTS = $(am_libgwyprocess2_la_OBJECTS)
 AM_V_lt = $(am__v_lt_ at AM_V@)
@@ -280,10 +282,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -293,6 +292,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -317,7 +318,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -375,6 +378,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -383,17 +387,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -521,10 +521,8 @@ libgwyprocess2include_HEADERS = \
 
 noinst_HEADERS = \
 	gwyprocessinternal.h \
-	monte-carlo-unc.h \
 	morph_lib.h \
-	natural.h \
-	wrappers.h
+	natural.h
 
 lib_LTLIBRARIES = libgwyprocess2.la
 @OS_MSWIN_TRUE at no_undefined = -no-undefined
@@ -544,9 +542,6 @@ MKENUM_HFILES = \
 	$(srcdir)/peaks.h \
 	$(srcdir)/gwygrainvalue.h
 
-
-# TODO: Detect
-GLIB_MKENUMS = glib-mkenums
 mkenum_built_sources = $(MKENUM_NAME).h $(MKENUM_NAME).c
 @MAINTAINER_MODE_TRUE at mkenum_stamp_files = $(MKENUM_NAME).h.stamp
 @MAINTAINER_MODE_TRUE at mkenum_self = $(top_srcdir)/utils/mkenum.mk
@@ -567,7 +562,7 @@ AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"GwyProcess\"
 # Any iface change    C++: 0:   A
 # Adding ifaces       C:   R:   A++
 # Changing ifaces     C:   R:   0
-libversion = -version-info 30:0:30
+libversion = -version-info 32:0:32
 #libversion = -release @LIBRARY_RELEASE@
 libgwyprocess2_la_LDFLAGS = @BASIC_LIBS@ @FFTW3_LIBS@ -export-dynamic $(no_undefined) $(export_symbols) $(libversion)
 libgwyprocess2_la_LIBADD = $(libgwyprocess_libadd)
@@ -577,6 +572,7 @@ libgwyprocess2_la_SOURCES = \
 	natural.c \
 	cdline.c \
 	correct.c \
+	correct-laplace.c \
 	correlation.c \
 	cwt.c \
 	datafield.c \
@@ -584,8 +580,12 @@ libgwyprocess2_la_SOURCES = \
 	dwt.c \
 	elliptic.c \
 	filters.c \
+	filters-minmax.c \
 	fractals.c \
 	grains.c \
+	grains-disttrans.c \
+	grains-values.c \
+	grains-wshed.c \
 	gwycaldata.c \
 	gwycalibration.c \
 	gwygrainvalue.c \
@@ -598,13 +598,15 @@ libgwyprocess2_la_SOURCES = \
 	inttrans.c \
 	level.c \
 	linestats.c \
-	monte-carlo-unc.c \
 	morph_lib.c \
 	peaks.c \
 	simplefft.c \
 	spectra.c \
 	spline.c \
 	stats.c \
+	stats-acfpsdf.c \
+	stats-entropy.c \
+	stats-sum.c \
 	stats_uncertainty.c \
 	surface.c \
 	tip.c \
@@ -693,6 +695,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/arithmetic.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/brick.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cdline.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/correct-laplace.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/correct.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/correlation.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cwt.Plo at am__quote@
@@ -700,8 +703,12 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dataline.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dwt.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/elliptic.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/filters-minmax.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/filters.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fractals.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/grains-disttrans.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/grains-values.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/grains-wshed.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/grains.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gwycaldata.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gwycalibration.Plo at am__quote@
@@ -715,13 +722,15 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/inttrans.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/level.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/linestats.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/monte-carlo-unc.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/morph_lib.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/natural.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/peaks.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/simplefft.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/spectra.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/spline.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/stats-acfpsdf.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/stats-entropy.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/stats-sum.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/stats.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/stats_uncertainty.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/surface.Plo at am__quote@
diff --git a/libprocess/arithmetic.c b/libprocess/arithmetic.c
index 5ca0ad3..60543da 100644
--- a/libprocess/arithmetic.c
+++ b/libprocess/arithmetic.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: arithmetic.c 19036 2016-10-08 10:32:41Z yeti-dn $
+ *  @(#) $Id: arithmetic.c 20128 2017-08-01 11:19:59Z yeti-dn $
  *  Copyright (C) 2003,2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -446,32 +446,6 @@ gwy_data_line_check_compatibility(GwyDataLine *data_line1,
     return result;
 }
 
-/* code ported from libgwy3 */
-typedef void (*RowExtendFunc)(const gdouble *in,
-                              gdouble *out,
-                              guint pos,
-                              guint width,
-                              guint res,
-                              guint extend_left,
-                              guint extend_right,
-                              gdouble value);
-
-typedef void (*RectExtendFunc)(const gdouble *in,
-                               guint inrowstride,
-                               gdouble *out,
-                               guint outrowstride,
-                               guint xpos,
-                               guint ypos,
-                               guint width,
-                               guint height,
-                               guint xres,
-                               guint yres,
-                               guint extend_left,
-                               guint extend_right,
-                               guint extend_up,
-                               guint extend_down,
-                               gdouble value);
-
 static inline void
 fill_block(gdouble *data, guint len, gdouble value)
 {
@@ -729,8 +703,22 @@ rect_extend_fill(const gdouble *in, guint inrowstride,
         fill_block(out2, extend_left + width + extend_right, value);
 }
 
-static RectExtendFunc
-get_rect_extend_func(GwyExteriorType exterior)
+RowExtendFunc
+_gwy_get_row_extend_func(GwyExteriorType exterior)
+{
+    if (exterior == GWY_EXTERIOR_FIXED_VALUE)
+        return &row_extend_fill;
+    if (exterior == GWY_EXTERIOR_BORDER_EXTEND)
+        return &row_extend_border;
+    if (exterior == GWY_EXTERIOR_MIRROR_EXTEND)
+        return &row_extend_mirror;
+    if (exterior == GWY_EXTERIOR_PERIODIC)
+        return &row_extend_periodic;
+    g_return_val_if_reached(NULL);
+}
+
+RectExtendFunc
+_gwy_get_rect_extend_func(GwyExteriorType exterior)
 {
     if (exterior == GWY_EXTERIOR_FIXED_VALUE)
         return &rect_extend_fill;
@@ -779,7 +767,7 @@ gwy_data_field_extend(GwyDataField *data_field,
 
     g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), NULL);
 
-    extend_rect = get_rect_extend_func(exterior);
+    extend_rect = _gwy_get_rect_extend_func(exterior);
     g_return_val_if_fail(extend_rect, NULL);
 
     width = data_field->xres;
@@ -802,10 +790,7 @@ gwy_data_field_extend(GwyDataField *data_field,
         gwy_data_field_set_xoffset(target, 0.0);
         gwy_data_field_set_yoffset(target, 0.0);
     }
-    gwy_serializable_clone(G_OBJECT(gwy_data_field_get_si_unit_xy(data_field)),
-                           G_OBJECT(gwy_data_field_get_si_unit_xy(target)));
-    gwy_serializable_clone(G_OBJECT(gwy_data_field_get_si_unit_z(data_field)),
-                           G_OBJECT(gwy_data_field_get_si_unit_z(target)));
+    gwy_data_field_copy_units(data_field, target);
 
     return target;
 }
diff --git a/libprocess/brick.c b/libprocess/brick.c
index 33fe07f..40fd611 100644
--- a/libprocess/brick.c
+++ b/libprocess/brick.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: brick.c 19108 2016-10-21 08:50:43Z yeti-dn $
- *  Copyright (C) 2012-2016 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: brick.c 20128 2017-08-01 11:19:59Z yeti-dn $
+ *  Copyright (C) 2012-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  Originally based on Yeti's implementation for Gwyddion 3 branch,
@@ -24,13 +24,13 @@
 
 #include "config.h"
 #include <string.h>
-
+#include <stdlib.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
 #include <libgwyddion/gwydebugobjects.h>
 #include <libprocess/brick.h>
 #include <libprocess/interpolation.h>
-#include <stdlib.h>
+#include "gwyprocessinternal.h"
 
 #define GWY_BRICK_TYPE_NAME "GwyBrick"
 
@@ -118,6 +118,8 @@ gwy_brick_finalize(GObject *object)
 
     GWY_OBJECT_UNREF(brick->si_unit_x);
     GWY_OBJECT_UNREF(brick->si_unit_y);
+    GWY_OBJECT_UNREF(brick->si_unit_z);
+    GWY_OBJECT_UNREF(brick->si_unit_w);
     g_free(brick->data);
 
     G_OBJECT_CLASS(gwy_brick_parent_class)->finalize(object);
@@ -202,20 +204,12 @@ gwy_brick_new_alike(GwyBrick *model,
     else
         brick->data = g_new(gdouble, brick->xres * brick->yres * brick->zres);
 
-    if (model->si_unit_x)
-        brick->si_unit_x = gwy_si_unit_duplicate(model->si_unit_x);
-    if (model->si_unit_y)
-        brick->si_unit_y = gwy_si_unit_duplicate(model->si_unit_y);
-    if (model->si_unit_z)
-        brick->si_unit_z = gwy_si_unit_duplicate(model->si_unit_z);
-    if (model->si_unit_w)
-        brick->si_unit_w = gwy_si_unit_duplicate(model->si_unit_w);
+    gwy_brick_copy_units(model, brick);
 
     priv = model->priv;
     new_priv = brick->priv;
     if (priv->zcalibration)
-        new_priv->zcalibration
-                          = gwy_data_line_duplicate(priv->zcalibration);
+        new_priv->zcalibration = gwy_data_line_duplicate(priv->zcalibration);
 
     return brick;
 }
@@ -255,9 +249,9 @@ gwy_brick_new_part(const GwyBrick *brick,
     g_return_val_if_fail(xpos >= 0 && ypos >=0 && zpos >=0
                          && xres >=0 && yres >=0 && zres >= 0,
                          NULL);
-    g_return_val_if_fail(((xpos + xres) <= brick->xres)
-                         && ((ypos + yres) <= brick->yres)
-                         && ((zpos + zres) <= brick->zres),
+    g_return_val_if_fail((xpos + xres <= brick->xres)
+                         && (ypos + yres <= brick->yres)
+                         && (zpos + zres <= brick->zres),
                          NULL);
 
     part = gwy_brick_new(xres, yres, zres,
@@ -278,14 +272,7 @@ gwy_brick_new_part(const GwyBrick *brick,
         }
     }
 
-    if (brick->si_unit_x)
-        part->si_unit_x = gwy_si_unit_duplicate(brick->si_unit_x);
-    if (brick->si_unit_y)
-        part->si_unit_y = gwy_si_unit_duplicate(brick->si_unit_y);
-    if (brick->si_unit_z)
-        part->si_unit_z = gwy_si_unit_duplicate(brick->si_unit_z);
-    if (brick->si_unit_w)
-        part->si_unit_w = gwy_si_unit_duplicate(brick->si_unit_w);
+    gwy_brick_copy_units(brick, part);
 
     priv = brick->priv;
     if (priv->zcalibration) {
@@ -296,12 +283,9 @@ gwy_brick_new_part(const GwyBrick *brick,
     }
 
     if (keep_offsets) {
-        gwy_brick_set_xoffset(part, (gdouble)xpos * brick->xreal
-                            / brick->xres + brick->xoff);
-        gwy_brick_set_yoffset(part, (gdouble)ypos * brick->yreal
-                            / brick->yres + brick->yoff);
-        gwy_brick_set_zoffset(part, (gdouble)zpos * brick->zreal
-                            / brick->zres + brick->zoff);
+        gwy_brick_set_xoffset(part, xpos*brick->xreal/brick->xres + brick->xoff);
+        gwy_brick_set_yoffset(part, ypos*brick->yreal/brick->yres + brick->yoff);
+        gwy_brick_set_zoffset(part, zpos*brick->zreal/brick->zres + brick->zoff);
     }
 
     return part;
@@ -316,24 +300,18 @@ gwy_brick_serialize(GObject *obj,
     GwyBrickPrivate *priv;
     guint32 datasize;
     guint32 num_items = 1;
-    gdouble *pxoff, *pyoff, *pzoff;
+    gpointer pxoff, pyoff, pzoff, pxunit, pyunit, pzunit, pwunit;
     gpointer *calibrations = NULL;
 
-    gwy_debug("");
-    g_return_val_if_fail(GWY_IS_BRICK(obj), NULL);
-
     brick = GWY_BRICK(obj);
-    if (!brick->si_unit_x)
-        brick->si_unit_x = gwy_si_unit_new(NULL);
-    if (!brick->si_unit_y)
-        brick->si_unit_y = gwy_si_unit_new(NULL);
-    if (!brick->si_unit_z)
-        brick->si_unit_z = gwy_si_unit_new(NULL);
-    if (!brick->si_unit_w)
-        brick->si_unit_w = gwy_si_unit_new(NULL);
+
     pxoff = brick->xoff ? &brick->xoff : NULL;
     pyoff = brick->yoff ? &brick->yoff : NULL;
     pzoff = brick->zoff ? &brick->zoff : NULL;
+    pxunit = unit_pointer_if_nonempty(brick->si_unit_x);
+    pyunit = unit_pointer_if_nonempty(brick->si_unit_y);
+    pzunit = unit_pointer_if_nonempty(brick->si_unit_z);
+    pwunit = unit_pointer_if_nonempty(brick->si_unit_w);
     datasize = brick->xres * brick->yres * brick->zres;
     priv = (GwyBrickPrivate *)brick->priv;
 
@@ -357,10 +335,10 @@ gwy_brick_serialize(GObject *obj,
             { 'd', "xoff", pxoff, NULL, },
             { 'd', "yoff", pyoff, NULL, },
             { 'd', "zoff", pzoff, NULL, },
-            { 'o', "si_unit_x", &brick->si_unit_x, NULL, },
-            { 'o', "si_unit_y", &brick->si_unit_y, NULL, },
-            { 'o', "si_unit_z", &brick->si_unit_z, NULL, },
-            { 'o', "si_unit_w", &brick->si_unit_w, NULL, },
+            { 'o', "si_unit_x", pxunit, NULL, },
+            { 'o', "si_unit_y", pyunit, NULL, },
+            { 'o', "si_unit_z", pzunit, NULL, },
+            { 'o', "si_unit_w", pwunit, NULL, },
             { 'D', "data", &brick->data, &datasize, },
             { 'O', "calibration", &calibrations, &num_items, },
         };
@@ -383,21 +361,18 @@ gwy_brick_get_size(GObject *obj)
     GwyBrickPrivate *priv;
     guint32 datasize;
     guint32 num_items = 1;
+    gpointer pxoff, pyoff, pzoff, pxunit, pyunit, pzunit, pwunit;
     gpointer *calibrations = NULL;
 
-    gwy_debug("");
-    g_return_val_if_fail(GWY_IS_BRICK(obj), 0);
-
     brick = GWY_BRICK(obj);
 
-    if (!brick->si_unit_x)
-        brick->si_unit_x = gwy_si_unit_new(NULL);
-    if (!brick->si_unit_y)
-        brick->si_unit_y = gwy_si_unit_new(NULL);
-    if (!brick->si_unit_z)
-        brick->si_unit_z = gwy_si_unit_new(NULL);
-    if (!brick->si_unit_w)
-        brick->si_unit_w = gwy_si_unit_new(NULL);
+    pxoff = brick->xoff ? &brick->xoff : NULL;
+    pyoff = brick->yoff ? &brick->yoff : NULL;
+    pzoff = brick->zoff ? &brick->zoff : NULL;
+    pxunit = unit_pointer_if_nonempty(brick->si_unit_x);
+    pyunit = unit_pointer_if_nonempty(brick->si_unit_y);
+    pzunit = unit_pointer_if_nonempty(brick->si_unit_z);
+    pwunit = unit_pointer_if_nonempty(brick->si_unit_w);
 
     datasize = brick->xres * brick->yres * brick->zres;
     priv = (GwyBrickPrivate *)brick->priv;
@@ -417,13 +392,13 @@ gwy_brick_get_size(GObject *obj)
             { 'd', "xreal", &brick->xreal, NULL, },
             { 'd', "yreal", &brick->yreal, NULL, },
             { 'd', "zreal", &brick->zreal, NULL, },
-            { 'd', "xoff", &brick->xoff, NULL, },
-            { 'd', "yoff", &brick->yoff, NULL, },
-            { 'd', "zoff", &brick->zoff, NULL, },
-            { 'o', "si_unit_x", &brick->si_unit_x, NULL, },
-            { 'o', "si_unit_y", &brick->si_unit_y, NULL, },
-            { 'o', "si_unit_z", &brick->si_unit_z, NULL, },
-            { 'o', "si_unit_w", &brick->si_unit_w, NULL, },
+            { 'd', "xoff", pxoff, NULL, },
+            { 'd', "yoff", pyoff, NULL, },
+            { 'd', "zoff", pzoff, NULL, },
+            { 'o', "si_unit_x", pxunit, NULL, },
+            { 'o', "si_unit_y", pyunit, NULL, },
+            { 'o', "si_unit_z", pzunit, NULL, },
+            { 'o', "si_unit_w", pwunit, NULL, },
             { 'D', "data", &brick->data, &datasize, },
             { 'O', "calibration", &calibrations, &num_items, },
         };
@@ -589,38 +564,7 @@ gwy_brick_clone_real(GObject *source, GObject *copy)
     gwy_assign(clone->data, brick->data,
                brick->xres * brick->yres * brick->zres);
 
-    /* SI Units can be NULL */
-    if (brick->si_unit_x && clone->si_unit_x)
-        gwy_serializable_clone(G_OBJECT(brick->si_unit_x),
-                               G_OBJECT(clone->si_unit_x));
-    else if (brick->si_unit_x && !clone->si_unit_x)
-        clone->si_unit_x = gwy_si_unit_duplicate(brick->si_unit_x);
-    else if (!brick->si_unit_x && clone->si_unit_x)
-        GWY_OBJECT_UNREF(clone->si_unit_x);
-
-    if (brick->si_unit_y && clone->si_unit_y)
-        gwy_serializable_clone(G_OBJECT(brick->si_unit_y),
-                               G_OBJECT(clone->si_unit_y));
-    else if (brick->si_unit_y && !clone->si_unit_y)
-        clone->si_unit_y = gwy_si_unit_duplicate(brick->si_unit_y);
-    else if (!brick->si_unit_y && clone->si_unit_y)
-        GWY_OBJECT_UNREF(clone->si_unit_y);
-
-    if (brick->si_unit_z && clone->si_unit_z)
-        gwy_serializable_clone(G_OBJECT(brick->si_unit_z),
-                               G_OBJECT(clone->si_unit_z));
-    else if (brick->si_unit_z && !clone->si_unit_z)
-        clone->si_unit_z = gwy_si_unit_duplicate(brick->si_unit_z);
-    else if (!brick->si_unit_z && clone->si_unit_z)
-        GWY_OBJECT_UNREF(clone->si_unit_z);
-
-    if (brick->si_unit_w && clone->si_unit_w)
-        gwy_serializable_clone(G_OBJECT(brick->si_unit_w),
-                               G_OBJECT(clone->si_unit_w));
-    else if (brick->si_unit_w && !clone->si_unit_w)
-        clone->si_unit_w = gwy_si_unit_duplicate(brick->si_unit_w);
-    else if (!brick->si_unit_w && clone->si_unit_w)
-        GWY_OBJECT_UNREF(clone->si_unit_w);
+    gwy_brick_copy_units(brick, clone);
 
     priv = brick->priv;
     clone_priv = clone->priv;
@@ -684,29 +628,36 @@ gwy_brick_resample(GwyBrick *brick,
         brick->xres = xres;
         brick->yres = yres;
         brick->zres = zres;
-
-        brick->data = g_renew(gdouble, brick->data, brick->xres * brick->yres * brick->zres);
+        brick->data = g_renew(gdouble, brick->data, xres*yres*zres);
         return;
     }
 
-    bdata = g_new(gdouble, xres * yres * zres);
+    bdata = g_new(gdouble, xres*yres*zres);
 
     xratio = (gdouble)brick->xres/xres;
     yratio = (gdouble)brick->yres/yres;
     zratio = (gdouble)brick->zres/zres;
 
+    if (interpolation != GWY_INTERPOLATION_ROUND) {
+        g_warning("Only the ROUND interpolation method is implemented.");
+        interpolation = GWY_INTERPOLATION_ROUND;
+    }
 
     if (interpolation == GWY_INTERPOLATION_ROUND) {
-
-        for (col=0; col<xres; col++)
-        {
-            for (row=0; row<yres; row++)
-            {
-                for (lev=0; lev<zres; lev++)
-                    bdata[col + xres*row + xres*yres*lev] = gwy_brick_get_val(brick, MIN((gint)(xratio*col + 0.5), brick->xres-1), MIN((gint)(yratio*row + 0.5), brick->yres-1), MIN((gint)(zratio*lev + 0.5), brick->zres-1));
+        for (col=0; col<xres; col++) {
+            for (row=0; row<yres; row++) {
+                for (lev=0; lev<zres; lev++) {
+                    bdata[col + xres*row + xres*yres*lev]
+                        = gwy_brick_get_val(brick,
+                                            MIN((gint)(xratio*col + 0.5),
+                                                brick->xres-1),
+                                            MIN((gint)(yratio*row + 0.5),
+                                                brick->yres-1),
+                                            MIN((gint)(zratio*lev + 0.5),
+                                                brick->zres-1));
+                }
             }
         }
-
     }
 
     g_free(brick->data);
@@ -714,10 +665,8 @@ gwy_brick_resample(GwyBrick *brick,
     brick->xres = xres;
     brick->yres = yres;
     brick->zres = zres;
-
 }
 
-
 /**
  * gwy_brick_get_dval:
  * @brick: A data brick.
@@ -748,9 +697,17 @@ gwy_brick_get_dval(GwyBrick *a, gdouble x, gdouble y, gdouble z, gint interpolat
     if (G_UNLIKELY(interpolation == GWY_INTERPOLATION_NONE))
         return 0.0;
 
-    if (x<0) x = 0;
-    if (y<0) y = 0;
-    if (z<0) z = 0;
+    if (x < 0)
+        x = 0;
+    if (y < 0)
+        y = 0;
+    if (z < 0)
+        z = 0;
+
+    if (interpolation != GWY_INTERPOLATION_ROUND) {
+        g_warning("Only the ROUND interpolation method is implemented.");
+        interpolation = GWY_INTERPOLATION_ROUND;
+    }
 
     switch (interpolation) {
         case GWY_INTERPOLATION_ROUND:
@@ -765,12 +722,12 @@ gwy_brick_get_dval(GwyBrick *a, gdouble x, gdouble y, gdouble z, gint interpolat
 /**
  * gwy_brick_get_dval_real:
  * @brick: A data brick.
- * @x: Position in data brick in range [0, x resolution].  If the value is outside
- *     this range, the nearest border value is returned.
- * @y: Position in data brick in range [0, y resolution].  If the value is outside
- *     this range, the nearest border value is returned.
- * @z: Position in data brick in range [0, z resolution].  If the value is outside
- *     this range, the nearest border value is returned.
+ * @x: Position in data brick in range [0, x resolution].  If the value is
+ *     outside this range, the nearest border value is returned.
+ * @y: Position in data brick in range [0, y resolution].  If the value is
+ *     outside this range, the nearest border value is returned.
+ * @z: Position in data brick in range [0, z resolution].  If the value is
+ *     outside this range, the nearest border value is returned.
  * @interpolation: Interpolation method to use.
  *
  * Gets interpolated value at arbitrary data brick point indexed by pixel
@@ -794,15 +751,22 @@ gwy_brick_get_dval_real(GwyBrick *a, gdouble x, gdouble y, gdouble z, gint inter
     if (G_UNLIKELY(interpolation == GWY_INTERPOLATION_NONE))
         return 0.0;
 
-    if (x<0) x = 0;
-    if (y<0) y = 0;
-    if (z<0) z = 0;
-
+    if (x < 0)
+        x = 0;
+    if (y < 0)
+        y = 0;
+    if (z < 0)
+        z = 0;
 
     xratio = a->xres/a->xreal;
     yratio = a->yres/a->yreal;
     zratio = a->zres/a->zreal;
 
+    if (interpolation != GWY_INTERPOLATION_ROUND) {
+        g_warning("Only the ROUND interpolation method is implemented.");
+        interpolation = GWY_INTERPOLATION_ROUND;
+    }
+
     switch (interpolation) {
         case GWY_INTERPOLATION_ROUND:
         return a->data[MIN((gint)(x*xratio + 0.5), a->xres-1)
@@ -1115,7 +1079,6 @@ gwy_brick_set_zreal(GwyBrick *brick, gdouble zreal)
     brick->zreal = zreal;
 }
 
-
 /**
  * gwy_brick_get_si_unit_x:
  * @brick: A data brick.
@@ -1222,13 +1185,7 @@ gwy_brick_set_si_unit_x(GwyBrick *brick,
                         GwySIUnit *si_unit)
 {
     g_return_if_fail(GWY_IS_BRICK(brick));
-    g_return_if_fail(GWY_IS_SI_UNIT(si_unit));
-    if (brick->si_unit_x == si_unit)
-        return;
-
-    GWY_OBJECT_UNREF(brick->si_unit_x);
-    g_object_ref(si_unit);
-    brick->si_unit_x = si_unit;
+    _gwy_set_object_si_unit(si_unit, &brick->si_unit_x);
 }
 
 /**
@@ -1249,13 +1206,7 @@ gwy_brick_set_si_unit_y(GwyBrick *brick,
                         GwySIUnit *si_unit)
 {
     g_return_if_fail(GWY_IS_BRICK(brick));
-    g_return_if_fail(GWY_IS_SI_UNIT(si_unit));
-    if (brick->si_unit_y == si_unit)
-        return;
-
-    GWY_OBJECT_UNREF(brick->si_unit_y);
-    g_object_ref(si_unit);
-    brick->si_unit_y = si_unit;
+    _gwy_set_object_si_unit(si_unit, &brick->si_unit_y);
 }
 
 /**
@@ -1276,13 +1227,7 @@ gwy_brick_set_si_unit_z(GwyBrick *brick,
                         GwySIUnit *si_unit)
 {
     g_return_if_fail(GWY_IS_BRICK(brick));
-    g_return_if_fail(GWY_IS_SI_UNIT(si_unit));
-    if (brick->si_unit_z == si_unit)
-        return;
-
-    GWY_OBJECT_UNREF(brick->si_unit_z);
-    g_object_ref(si_unit);
-    brick->si_unit_z = si_unit;
+    _gwy_set_object_si_unit(si_unit, &brick->si_unit_z);
 }
 
 /**
@@ -1303,13 +1248,28 @@ gwy_brick_set_si_unit_w(GwyBrick *brick,
                         GwySIUnit *si_unit)
 {
     g_return_if_fail(GWY_IS_BRICK(brick));
-    g_return_if_fail(GWY_IS_SI_UNIT(si_unit));
-    if (brick->si_unit_w == si_unit)
-        return;
+    _gwy_set_object_si_unit(si_unit, &brick->si_unit_w);
+}
 
-    GWY_OBJECT_UNREF(brick->si_unit_w);
-    g_object_ref(si_unit);
-    brick->si_unit_w = si_unit;
+/**
+ * gwy_brick_copy_units:
+ * @brick: A data brick.
+ * @target: Target data brick.
+ *
+ * Sets lateral and value units of a data brick to match another data brick.
+ *
+ * Since: 2.49
+ **/
+void
+gwy_brick_copy_units(const GwyBrick *brick, GwyBrick *target)
+{
+    g_return_if_fail(GWY_IS_BRICK(brick));
+    g_return_if_fail(GWY_IS_BRICK(target));
+
+    _gwy_assign_si_unit(brick->si_unit_x, &target->si_unit_x);
+    _gwy_assign_si_unit(brick->si_unit_y, &target->si_unit_y);
+    _gwy_assign_si_unit(brick->si_unit_z, &target->si_unit_z);
+    _gwy_assign_si_unit(brick->si_unit_w, &target->si_unit_w);
 }
 
 /**
@@ -1337,8 +1297,8 @@ gwy_brick_get_value_format_x(GwyBrick *brick,
     max = brick->xreal;
     unit = brick->xreal/brick->xres;
     return gwy_si_unit_get_format_with_resolution
-        (gwy_brick_get_si_unit_x(brick),
-         style, max, unit, format);
+                                            (gwy_brick_get_si_unit_x(brick),
+                                             style, max, unit, format);
 }
 
 /**
@@ -1366,8 +1326,8 @@ gwy_brick_get_value_format_y(GwyBrick *brick,
     max = brick->yreal;
     unit = brick->yreal/brick->yres;
     return gwy_si_unit_get_format_with_resolution
-        (gwy_brick_get_si_unit_y(brick),
-         style, max, unit, format);
+                                            (gwy_brick_get_si_unit_y(brick),
+                                             style, max, unit, format);
 }
 
 /**
@@ -1395,8 +1355,8 @@ gwy_brick_get_value_format_z(GwyBrick *brick,
     max = brick->zreal;
     unit = brick->zreal/brick->zres;
     return gwy_si_unit_get_format_with_resolution
-        (gwy_brick_get_si_unit_z(brick),
-         style, max, unit, format);
+                                           (gwy_brick_get_si_unit_z(brick),
+                                            style, max, unit, format);
 }
 
 
@@ -1413,12 +1373,14 @@ gwy_brick_get_value_format_z(GwyBrick *brick,
 gdouble
 gwy_brick_get_min(GwyBrick *brick)
 {
-    gint i;
+    gint i, n;
     gdouble min = G_MAXDOUBLE;
 
-    for (i=0; i<(brick->xres * brick->yres * brick->zres); i++)
-    {
-        if (brick->data[i]<min) min = brick->data[i];
+    g_return_val_if_fail(GWY_IS_BRICK(brick), 0.0);
+    n = brick->xres * brick->yres * brick->zres;
+    for (i = 0; i < n; i++) {
+        if (brick->data[i] < min)
+            min = brick->data[i];
     }
     return min;
 }
@@ -1436,12 +1398,14 @@ gwy_brick_get_min(GwyBrick *brick)
 gdouble
 gwy_brick_get_max(GwyBrick *brick)
 {
-    gint i;
+    gint i, n;
     gdouble max = -G_MAXDOUBLE;
 
-    for (i=0; i<(brick->xres * brick->yres * brick->zres); i++)
-    {
-        if (brick->data[i]>max) max = brick->data[i];
+    g_return_val_if_fail(GWY_IS_BRICK(brick), 0.0);
+    n = brick->xres * brick->yres * brick->zres;
+    for (i = 0; i < n; i++) {
+        if (brick->data[i] > max)
+            max = brick->data[i];
     }
     return max;
 }
@@ -1889,10 +1853,11 @@ void
 gwy_brick_add(GwyBrick *brick,
               gdouble value)
 {
-    gint i;
+    gint i, n;
 
     g_return_if_fail(GWY_IS_BRICK(brick));
-    for (i = 0; i < (brick->xres*brick->yres*brick->zres); i++)
+    n = brick->xres * brick->yres * brick->zres;
+    for (i = 0; i < n; i++)
         brick->data[i] += value;
 }
 
@@ -1909,10 +1874,11 @@ void
 gwy_brick_multiply(GwyBrick *brick,
                    gdouble value)
 {
-    gint i;
+    gint i, n;
 
     g_return_if_fail(GWY_IS_BRICK(brick));
-    for (i = 0; i < (brick->xres*brick->yres*brick->zres); i++)
+    n = brick->xres * brick->yres * brick->zres;
+    for (i = 0; i < n; i++)
         brick->data[i] *= value;
 }
 
@@ -1950,9 +1916,9 @@ gwy_brick_extract_plane(const GwyBrick *brick,
                         gint depth,
                         G_GNUC_UNUSED gboolean keep_offsets)
 {
-    gint col, row, lev;
+    gint col, row, lev, xres, yres, zres;
     gdouble *bdata, *ddata;
-    GwySIUnit *si_unit;
+    GwySIUnit *si_unit = NULL;
 
     g_return_if_fail(GWY_IS_BRICK(brick));
 
@@ -1960,66 +1926,66 @@ gwy_brick_extract_plane(const GwyBrick *brick,
                      || (width > 0 && height == -1 && depth > 0)
                      || (width > 0 && height > 0 && depth == -1));
 
-    g_return_if_fail(istart >= 0 && istart < brick->xres &&
-                     jstart >= 0 && jstart < brick->yres &&
-                     kstart >= 0 && kstart < brick->zres);
+    xres = brick->xres;
+    yres = brick->yres;
+    zres = brick->zres;
+    g_return_if_fail(istart >= 0 && istart < xres &&
+                     jstart >= 0 && jstart < yres &&
+                     kstart >= 0 && kstart < zres);
 
     bdata = brick->data;
 
     if (width == -1 && height > 0 && depth > 0) {
-        g_return_if_fail((jstart + height) <= brick->yres);
-        g_return_if_fail((kstart + depth) <= brick->zres);
+        g_return_if_fail((jstart + height) <= yres);
+        g_return_if_fail((kstart + depth) <= zres);
 
         gwy_data_field_resample(target, height, depth, GWY_INTERPOLATION_NONE);
         ddata = gwy_data_field_get_data(target);
         gwy_data_field_set_xreal(target, brick->yreal);
         gwy_data_field_set_yreal(target, brick->zreal);
-        si_unit = gwy_brick_get_si_unit_y((GwyBrick *) brick);
+        si_unit = brick->si_unit_y;
 
         col = istart;
         for (row = 0; row < height; row++) {
             for (lev = 0; lev < depth; lev++) {
-                ddata[row + lev * height] =
-                    bdata[col + brick->xres * (row + jstart) +
-                          brick->xres * brick->yres * (lev + kstart)];
+                ddata[row + lev*height] =
+                    bdata[col + xres*(row + jstart) + xres*yres*(lev + kstart)];
             }
         }
     }
     else if (width > 0 && height == -1 && depth > 0) {
-        g_return_if_fail((istart + width) <= brick->xres);
-        g_return_if_fail((kstart + depth) <= brick->zres);
+        g_return_if_fail((istart + width) <= xres);
+        g_return_if_fail((kstart + depth) <= zres);
 
         gwy_data_field_resample(target, width, depth, GWY_INTERPOLATION_NONE);
         ddata = gwy_data_field_get_data(target);
         gwy_data_field_set_xreal(target, brick->xreal);
         gwy_data_field_set_yreal(target, brick->zreal);
-        si_unit = gwy_brick_get_si_unit_x((GwyBrick *) brick);
+        si_unit = brick->si_unit_x;
 
         row = jstart;
         for (col = 0; col < width; col++) {
             for (lev = 0; lev < depth; lev++) {
-                ddata[col + lev * width] =
-                    bdata[col + istart + brick->xres * row +
-                          brick->xres * brick->yres * (lev + kstart)];
+                ddata[col + lev*width] =
+                    bdata[col + istart + xres*row + xres*yres*(lev + kstart)];
             }
         }
     }
     else if (width > 0 && height > 0 && depth == -1) {
-        g_return_if_fail((istart + width) <= brick->xres);
-        g_return_if_fail((jstart + height) <= brick->yres);
+        g_return_if_fail((istart + width) <= xres);
+        g_return_if_fail((jstart + height) <= yres);
 
         gwy_data_field_resample(target, width, height, GWY_INTERPOLATION_NONE);
         ddata = gwy_data_field_get_data(target);
         gwy_data_field_set_xreal(target, brick->xreal);
         gwy_data_field_set_yreal(target, brick->yreal);
-        si_unit = gwy_brick_get_si_unit_x((GwyBrick *) brick);
+        si_unit = brick->si_unit_x;
 
         lev = kstart;
         for (col = 0; col < width; col++) {
             for (row = 0; row < height; row++) {
-                ddata[col + row * width] =
-                    bdata[col + istart + brick->xres * (row + jstart) +
-                          brick->xres * brick->yres * (lev)];
+                ddata[col + row*width] =
+                    bdata[col + istart + xres*(row + jstart) + xres*yres*(lev)];
             }
         }
     }
@@ -2027,14 +1993,8 @@ gwy_brick_extract_plane(const GwyBrick *brick,
         g_return_if_reached();
     }
 
-    si_unit = gwy_si_unit_duplicate(si_unit);
-    gwy_data_field_set_si_unit_xy(target, si_unit);
-    g_object_unref(si_unit);
-
-    si_unit = gwy_brick_get_si_unit_w((GwyBrick *) brick);
-    si_unit = gwy_si_unit_duplicate(si_unit);
-    gwy_data_field_set_si_unit_z(target, si_unit);
-    g_object_unref(si_unit);
+    _gwy_assign_si_unit(si_unit, &target->si_unit_xy);
+    _gwy_assign_si_unit(brick->si_unit_w, &target->si_unit_z);
 }
 
 /**
@@ -2074,9 +2034,9 @@ gwy_brick_sum_plane(const GwyBrick *brick,
                     gint depth,
                     G_GNUC_UNUSED gboolean keep_offsets)
 {
-    gint col, row, lev;
+    gint col, row, lev, xres, yres, zres;
     gdouble *bdata, *ddata;
-    GwySIUnit *si_unit;
+    GwySIUnit *si_unit = NULL;
 
     g_return_if_fail(GWY_IS_BRICK(brick));
 
@@ -2084,15 +2044,18 @@ gwy_brick_sum_plane(const GwyBrick *brick,
                      || (width > 0 && height == -1 && depth > 0)
                      || (width > 0 && height > 0 && depth == -1));
 
-    g_return_if_fail(istart >=0 && istart < brick->xres
-                     && jstart >=0 && jstart < brick->yres
-                     && kstart >=0 && kstart < brick->zres);
+    xres = brick->xres;
+    yres = brick->yres;
+    zres = brick->zres;
+    g_return_if_fail(istart >=0 && istart < xres
+                     && jstart >=0 && jstart < yres
+                     && kstart >=0 && kstart < zres);
 
     bdata = brick->data;
 
     if (width == -1 && height > 0 && depth > 0) {
-        g_return_if_fail((jstart+height) <= brick->yres);
-        g_return_if_fail((kstart+depth) <= brick->zres);
+        g_return_if_fail((jstart+height) <= yres);
+        g_return_if_fail((kstart+depth) <= zres);
 
         gwy_data_field_resample(target, height, depth, GWY_INTERPOLATION_NONE);
         gwy_data_field_clear(target);
@@ -2100,11 +2063,12 @@ gwy_brick_sum_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->yreal);
         gwy_data_field_set_yreal(target, brick->zreal);
+        si_unit = brick->si_unit_y;
 
         for (row = 0; row < height; row++) {
             for (lev = 0; lev < depth; lev++) {
-                for (col = 0; col < brick->xres; col++) {
-                    gdouble bv = bdata[col + brick->xres*(row + jstart) + brick->xres*brick->yres*(lev + kstart)];
+                for (col = 0; col < xres; col++) {
+                    gdouble bv = bdata[col + xres*(row + jstart) + xres*yres*(lev + kstart)];
                     ddata[row + lev*height] += bv;
                 }
             }
@@ -2112,8 +2076,8 @@ gwy_brick_sum_plane(const GwyBrick *brick,
     }
 
     if (width > 0 && height == -1 && depth > 0) {
-        g_return_if_fail((istart+width) <= brick->xres);
-        g_return_if_fail((kstart+depth) <= brick->zres);
+        g_return_if_fail((istart+width) <= xres);
+        g_return_if_fail((kstart+depth) <= zres);
 
         gwy_data_field_resample(target, width, depth, GWY_INTERPOLATION_NONE);
         gwy_data_field_clear(target);
@@ -2121,11 +2085,12 @@ gwy_brick_sum_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->xreal);
         gwy_data_field_set_yreal(target, brick->zreal);
+        si_unit = brick->si_unit_x;
 
         for (col = 0; col < width; col++) {
             for (lev = 0; lev < depth; lev++) {
-                for (row = 0; row < brick->yres; row++) {
-                    gdouble bv = bdata[col + istart + brick->xres*row + brick->xres*brick->yres*(lev + kstart)];
+                for (row = 0; row < yres; row++) {
+                    gdouble bv = bdata[col + istart + xres*row + xres*yres*(lev + kstart)];
                     ddata[col + lev*width] += bv;
                 }
             }
@@ -2133,8 +2098,8 @@ gwy_brick_sum_plane(const GwyBrick *brick,
     }
 
     if (width > 0 && height > 0 && depth == -1) {
-        g_return_if_fail((istart+width) <= brick->xres);
-        g_return_if_fail((jstart+height) <= brick->yres);
+        g_return_if_fail((istart+width) <= xres);
+        g_return_if_fail((jstart+height) <= yres);
 
         gwy_data_field_resample(target, width, height, GWY_INTERPOLATION_NONE);
         gwy_data_field_clear(target);
@@ -2142,22 +2107,20 @@ gwy_brick_sum_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->xreal);
         gwy_data_field_set_yreal(target, brick->yreal);
+        si_unit = brick->si_unit_x;
 
         for (col = 0; col < width; col++) {
             for (row = 0; row < height; row++) {
-                for (lev = 0; lev < brick->zres; lev++) {
-                    gdouble bv = bdata[col + istart + brick->xres*(row + jstart) + brick->xres*brick->yres*(lev)];
+                for (lev = 0; lev < zres; lev++) {
+                    gdouble bv = bdata[col + istart + xres*(row + jstart) + xres*yres*(lev)];
                     ddata[col + row*width] += bv;
                 }
             }
         }
     }
 
-    si_unit = gwy_brick_get_si_unit_x((GwyBrick *)brick);
-    gwy_data_field_set_si_unit_xy(target, si_unit);
-
-    si_unit = gwy_brick_get_si_unit_w((GwyBrick *)brick);
-    gwy_data_field_set_si_unit_z(target, si_unit);
+    _gwy_assign_si_unit(si_unit, &target->si_unit_xy);
+    _gwy_assign_si_unit(brick->si_unit_w, &target->si_unit_z);
 }
 
 /**
@@ -2197,9 +2160,9 @@ gwy_brick_min_plane(const GwyBrick *brick,
                     gint depth,
                     G_GNUC_UNUSED gboolean keep_offsets)
 {
-    gint col, row, lev;
+    gint col, row, lev, xres, yres, zres;
     gdouble *bdata, *ddata;
-    GwySIUnit *si_unit;
+    GwySIUnit *si_unit = NULL;
 
     g_return_if_fail(GWY_IS_BRICK(brick));
 
@@ -2207,16 +2170,19 @@ gwy_brick_min_plane(const GwyBrick *brick,
                      || (width > 0 && height == -1 && depth > 0)
                      || (width > 0 && height > 0 && depth == -1));
 
-    g_return_if_fail(istart >=0 && istart < brick->xres
-                     && jstart >=0 && jstart < brick->yres
-                     && kstart >=0 && kstart < brick->zres);
+    xres = brick->xres;
+    yres = brick->yres;
+    zres = brick->zres;
+    g_return_if_fail(istart >=0 && istart < xres
+                     && jstart >=0 && jstart < yres
+                     && kstart >=0 && kstart < zres);
 
     bdata = brick->data;
     gwy_data_field_clear(target);
 
     if (width == -1 && height > 0 && depth > 0) {
-        g_return_if_fail((jstart+height) <= brick->yres);
-        g_return_if_fail((kstart+depth) <= brick->zres);
+        g_return_if_fail((jstart+height) <= yres);
+        g_return_if_fail((kstart+depth) <= zres);
 
         gwy_data_field_resample(target, height, depth, GWY_INTERPOLATION_NONE);
         gwy_data_field_fill(target, G_MAXDOUBLE);
@@ -2224,11 +2190,12 @@ gwy_brick_min_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->yreal);
         gwy_data_field_set_yreal(target, brick->zreal);
+        si_unit = brick->si_unit_y;
 
         for (row = 0; row < height; row++) {
             for (lev = 0; lev < depth; lev++) {
-                for (col = 0; col < brick->xres; col++) {
-                    gdouble bv = bdata[col + brick->xres*(row + jstart) + brick->xres*brick->yres*(lev + kstart)];
+                for (col = 0; col < xres; col++) {
+                    gdouble bv = bdata[col + xres*(row + jstart) + xres*yres*(lev + kstart)];
                     gdouble fv = ddata[row + lev*height];
                     ddata[row + lev*height] = MIN(bv, fv);
                 }
@@ -2237,8 +2204,8 @@ gwy_brick_min_plane(const GwyBrick *brick,
     }
 
     if (width > 0 && height == -1 && depth > 0) {
-        g_return_if_fail((istart+width) <= brick->xres);
-        g_return_if_fail((kstart+depth) <= brick->zres);
+        g_return_if_fail((istart+width) <= xres);
+        g_return_if_fail((kstart+depth) <= zres);
 
         gwy_data_field_resample(target, width, depth, GWY_INTERPOLATION_NONE);
         gwy_data_field_fill(target, G_MAXDOUBLE);
@@ -2246,11 +2213,12 @@ gwy_brick_min_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->xreal);
         gwy_data_field_set_yreal(target, brick->zreal);
+        si_unit = brick->si_unit_x;
 
         for (col = 0; col < width; col++) {
             for (lev = 0; lev < depth; lev++) {
-                for (row = 0; row < brick->yres; row++) {
-                    gdouble bv = bdata[col + istart + brick->xres*row + brick->xres*brick->yres*(lev + kstart)];
+                for (row = 0; row < yres; row++) {
+                    gdouble bv = bdata[col + istart + xres*row + xres*yres*(lev + kstart)];
                     gdouble fv = ddata[col + lev*width];
                     ddata[col + lev*width] = MIN(bv, fv);
                 }
@@ -2259,8 +2227,8 @@ gwy_brick_min_plane(const GwyBrick *brick,
     }
 
     if (width > 0 && height > 0 && depth == -1) {
-        g_return_if_fail((istart+width) <= brick->xres);
-        g_return_if_fail((jstart+height) <= brick->yres);
+        g_return_if_fail((istart+width) <= xres);
+        g_return_if_fail((jstart+height) <= yres);
 
         gwy_data_field_resample(target, width, height, GWY_INTERPOLATION_NONE);
         gwy_data_field_fill(target, G_MAXDOUBLE);
@@ -2268,11 +2236,12 @@ gwy_brick_min_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->xreal);
         gwy_data_field_set_yreal(target, brick->yreal);
+        si_unit = brick->si_unit_x;
 
         for (col = 0; col < width; col++) {
             for (row = 0; row < height; row++) {
-                for (lev = 0; lev < brick->zres; lev++) {
-                    gdouble bv = bdata[col + istart + brick->xres*(row + jstart) + brick->xres*brick->yres*(lev)];
+                for (lev = 0; lev < zres; lev++) {
+                    gdouble bv = bdata[col + istart + xres*(row + jstart) + xres*yres*(lev)];
                     gdouble fv = ddata[col + row*width];
                     ddata[col + row*width] = MIN(bv, fv);
                 }
@@ -2280,11 +2249,8 @@ gwy_brick_min_plane(const GwyBrick *brick,
         }
     }
 
-    si_unit = gwy_brick_get_si_unit_x((GwyBrick *)brick);
-    gwy_data_field_set_si_unit_xy(target, si_unit);
-
-    si_unit = gwy_brick_get_si_unit_w((GwyBrick *)brick);
-    gwy_data_field_set_si_unit_z(target, si_unit);
+    _gwy_assign_si_unit(si_unit, &target->si_unit_xy);
+    _gwy_assign_si_unit(brick->si_unit_w, &target->si_unit_z);
 }
 
 /**
@@ -2324,9 +2290,9 @@ gwy_brick_max_plane(const GwyBrick *brick,
                     gint depth,
                     G_GNUC_UNUSED gboolean keep_offsets)
 {
-    gint col, row, lev;
+    gint col, row, lev, xres, yres, zres;
     gdouble *bdata, *ddata;
-    GwySIUnit *si_unit;
+    GwySIUnit *si_unit = NULL;
 
     g_return_if_fail(GWY_IS_BRICK(brick));
 
@@ -2334,16 +2300,19 @@ gwy_brick_max_plane(const GwyBrick *brick,
                      || (width > 0 && height == -1 && depth > 0)
                      || (width > 0 && height > 0 && depth == -1));
 
-    g_return_if_fail(istart >=0 && istart < brick->xres
-                     && jstart >=0 && jstart < brick->yres
-                     && kstart >=0 && kstart < brick->zres);
+    xres = brick->xres;
+    yres = brick->yres;
+    zres = brick->zres;
+    g_return_if_fail(istart >=0 && istart < xres
+                     && jstart >=0 && jstart < yres
+                     && kstart >=0 && kstart < zres);
 
     bdata = brick->data;
     gwy_data_field_clear(target);
 
     if (width == -1 && height > 0 && depth > 0) {
-        g_return_if_fail((jstart+height) <= brick->yres);
-        g_return_if_fail((kstart+depth) <= brick->zres);
+        g_return_if_fail((jstart+height) <= yres);
+        g_return_if_fail((kstart+depth) <= zres);
 
         gwy_data_field_resample(target, height, depth, GWY_INTERPOLATION_NONE);
         gwy_data_field_fill(target, G_MINDOUBLE);
@@ -2351,11 +2320,12 @@ gwy_brick_max_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->yreal);
         gwy_data_field_set_yreal(target, brick->zreal);
+        si_unit = brick->si_unit_y;
 
         for (row = 0; row < height; row++) {
             for (lev = 0; lev < depth; lev++) {
-                for (col = 0; col < brick->xres; col++) {
-                    gdouble bv = bdata[col + brick->xres*(row + jstart) + brick->xres*brick->yres*(lev + kstart)];
+                for (col = 0; col < xres; col++) {
+                    gdouble bv = bdata[col + xres*(row + jstart) + xres*yres*(lev + kstart)];
                     gdouble fv = ddata[row + lev*height];
                     ddata[row + lev*height] = MAX(bv, fv);
                 }
@@ -2364,8 +2334,8 @@ gwy_brick_max_plane(const GwyBrick *brick,
     }
 
     if (width > 0 && height == -1 && depth > 0) {
-        g_return_if_fail((istart+width) <= brick->xres);
-        g_return_if_fail((kstart+depth) <= brick->zres);
+        g_return_if_fail((istart+width) <= xres);
+        g_return_if_fail((kstart+depth) <= zres);
 
         gwy_data_field_resample(target, width, depth, GWY_INTERPOLATION_NONE);
         gwy_data_field_fill(target, G_MINDOUBLE);
@@ -2373,11 +2343,12 @@ gwy_brick_max_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->xreal);
         gwy_data_field_set_yreal(target, brick->zreal);
+        si_unit = brick->si_unit_x;
 
         for (col = 0; col < width; col++) {
             for (lev = 0; lev < depth; lev++) {
-                for (row = 0; row < brick->yres; row++) {
-                    gdouble bv = bdata[col + istart + brick->xres*row + brick->xres*brick->yres*(lev + kstart)];
+                for (row = 0; row < yres; row++) {
+                    gdouble bv = bdata[col + istart + xres*row + xres*yres*(lev + kstart)];
                     gdouble fv = ddata[col + lev*width];
                     ddata[col + lev*width] = MAX(bv, fv);
                 }
@@ -2386,8 +2357,8 @@ gwy_brick_max_plane(const GwyBrick *brick,
     }
 
     if (width > 0 && height > 0 && depth == -1) {
-        g_return_if_fail((istart+width) <= brick->xres);
-        g_return_if_fail((jstart+height) <= brick->yres);
+        g_return_if_fail((istart+width) <= xres);
+        g_return_if_fail((jstart+height) <= yres);
 
         gwy_data_field_resample(target, width, height, GWY_INTERPOLATION_NONE);
         gwy_data_field_fill(target, G_MINDOUBLE);
@@ -2395,11 +2366,12 @@ gwy_brick_max_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->xreal);
         gwy_data_field_set_yreal(target, brick->yreal);
+        si_unit = brick->si_unit_x;
 
         for (col = 0; col < width; col++) {
             for (row = 0; row < height; row++) {
-                for (lev = 0; lev < brick->zres; lev++) {
-                    gdouble bv = bdata[col + istart + brick->xres*(row + jstart) + brick->xres*brick->yres*(lev)];
+                for (lev = 0; lev < zres; lev++) {
+                    gdouble bv = bdata[col + istart + xres*(row + jstart) + xres*yres*(lev)];
                     gdouble fv = ddata[col + row*width];
                     ddata[col + row*width] = MAX(bv, fv);
                 }
@@ -2407,11 +2379,8 @@ gwy_brick_max_plane(const GwyBrick *brick,
         }
     }
 
-    si_unit = gwy_brick_get_si_unit_x((GwyBrick *)brick);
-    gwy_data_field_set_si_unit_xy(target, si_unit);
-
-    si_unit = gwy_brick_get_si_unit_w((GwyBrick *)brick);
-    gwy_data_field_set_si_unit_z(target, si_unit);
+    _gwy_assign_si_unit(si_unit, &target->si_unit_xy);
+    _gwy_assign_si_unit(brick->si_unit_w, &target->si_unit_z);
 }
 
 /**
@@ -2451,10 +2420,10 @@ gwy_brick_minpos_plane(const GwyBrick *brick,
                        gint depth,
                        G_GNUC_UNUSED gboolean keep_offsets)
 {
-    gint col, row, lev;
+    gint col, row, lev, xres, yres, zres;
     gdouble *bdata, *ddata;
     gint minpos;
-    GwySIUnit *si_unit;
+    GwySIUnit *si_unit = NULL;
     GwyDataLine *calibration;
     gdouble *caldata;
 
@@ -2464,16 +2433,19 @@ gwy_brick_minpos_plane(const GwyBrick *brick,
                      || (width > 0 && height == -1 && depth > 0)
                      || (width > 0 && height > 0 && depth == -1));
 
-    g_return_if_fail(istart >=0 && istart < brick->xres
-                     && jstart >=0 && jstart < brick->yres
-                     && kstart >=0 && kstart < brick->zres);
+    xres = brick->xres;
+    yres = brick->yres;
+    zres = brick->zres;
+    g_return_if_fail(istart >=0 && istart < xres
+                     && jstart >=0 && jstart < yres
+                     && kstart >=0 && kstart < zres);
 
     bdata = brick->data;
     gwy_data_field_clear(target);
 
     if (width == -1 && height > 0 && depth > 0) {
-        g_return_if_fail((jstart+height) <= brick->yres);
-        g_return_if_fail((kstart+depth) <= brick->zres);
+        g_return_if_fail((jstart+height) <= yres);
+        g_return_if_fail((kstart+depth) <= zres);
 
         gwy_data_field_resample(target, height, depth, GWY_INTERPOLATION_NONE);
         gwy_data_field_fill(target, G_MAXDOUBLE);
@@ -2481,12 +2453,13 @@ gwy_brick_minpos_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->yreal);
         gwy_data_field_set_yreal(target, brick->zreal);
+        si_unit = brick->si_unit_y;
 
         for (row = 0; row < height; row++) {
             for (lev = 0; lev < depth; lev++) {
                 minpos = 0;
-                for (col = 0; col < brick->xres; col++) {
-                    gdouble bv = bdata[col + brick->xres*(row + jstart) + brick->xres*brick->yres*(lev + kstart)];
+                for (col = 0; col < xres; col++) {
+                    gdouble bv = bdata[col + xres*(row + jstart) + xres*yres*(lev + kstart)];
                     gdouble fv = ddata[row + lev*height];
                     if (bv < fv)
                         minpos = col;
@@ -2500,8 +2473,8 @@ gwy_brick_minpos_plane(const GwyBrick *brick,
     }
 
     if (width > 0 && height == -1 && depth > 0) {
-        g_return_if_fail((istart+width) <= brick->xres);
-        g_return_if_fail((kstart+depth) <= brick->zres);
+        g_return_if_fail((istart+width) <= xres);
+        g_return_if_fail((kstart+depth) <= zres);
 
         gwy_data_field_resample(target, width, depth, GWY_INTERPOLATION_NONE);
         gwy_data_field_fill(target, G_MAXDOUBLE);
@@ -2509,12 +2482,13 @@ gwy_brick_minpos_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->xreal);
         gwy_data_field_set_yreal(target, brick->zreal);
+        si_unit = brick->si_unit_x;
 
         for (col = 0; col < width; col++) {
             for (lev = 0; lev < depth; lev++) {
                 minpos = 0;
-                for (row = 0; row < brick->yres; row++) {
-                    gdouble bv = bdata[col + istart + brick->xres*row + brick->xres*brick->yres*(lev + kstart)];
+                for (row = 0; row < yres; row++) {
+                    gdouble bv = bdata[col + istart + xres*row + xres*yres*(lev + kstart)];
                     gdouble fv = ddata[col + lev*width];
                     if (bv < fv)
                         minpos = row;
@@ -2528,8 +2502,8 @@ gwy_brick_minpos_plane(const GwyBrick *brick,
     }
 
     if (width > 0 && height > 0 && depth == -1) {
-        g_return_if_fail((istart+width) <= brick->xres);
-        g_return_if_fail((jstart+height) <= brick->yres);
+        g_return_if_fail((istart+width) <= xres);
+        g_return_if_fail((jstart+height) <= yres);
 
         gwy_data_field_resample(target, width, height, GWY_INTERPOLATION_NONE);
         gwy_data_field_fill(target, G_MAXDOUBLE);
@@ -2537,6 +2511,7 @@ gwy_brick_minpos_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->xreal);
         gwy_data_field_set_yreal(target, brick->yreal);
+        si_unit = brick->si_unit_x;
 
         calibration = gwy_brick_get_zcalibration((GwyBrick *)brick);
         if (calibration) {
@@ -2550,8 +2525,8 @@ gwy_brick_minpos_plane(const GwyBrick *brick,
         for (col = 0; col < width; col++) {
             for (row = 0; row < height; row++) {
                 minpos = 0;
-                for (lev = 0; lev < brick->zres; lev++) {
-                    gdouble bv = bdata[col + istart + brick->xres*(row + jstart) + brick->xres*brick->yres*(lev)];
+                for (lev = 0; lev < zres; lev++) {
+                    gdouble bv = bdata[col + istart + xres*(row + jstart) + xres*yres*(lev)];
                     gdouble fv = ddata[col + row*width];
                     if (bv < fv)
                         minpos = lev;
@@ -2565,8 +2540,9 @@ gwy_brick_minpos_plane(const GwyBrick *brick,
         }
     }
 
-    si_unit = gwy_brick_get_si_unit_x((GwyBrick *)brick);
-    gwy_data_field_set_si_unit_xy(target, si_unit);
+    _gwy_assign_si_unit(si_unit, &target->si_unit_xy);
+    /* The position is an integer.  Whatever... */
+    _gwy_assign_si_unit(NULL, &target->si_unit_z);
 }
 
 /**
@@ -2606,10 +2582,10 @@ gwy_brick_maxpos_plane(const GwyBrick *brick,
                        gint depth,
                        G_GNUC_UNUSED gboolean keep_offsets)
 {
-    gint col, row, lev;
+    gint col, row, lev, xres, yres, zres;
     gdouble *bdata, *ddata;
     gint maxpos;
-    GwySIUnit *si_unit;
+    GwySIUnit *si_unit = NULL;
     GwyDataLine *calibration;
     gdouble *caldata;
 
@@ -2619,16 +2595,19 @@ gwy_brick_maxpos_plane(const GwyBrick *brick,
                      || (width > 0 && height == -1 && depth > 0)
                      || (width > 0 && height > 0 && depth == -1));
 
-    g_return_if_fail(istart >=0 && istart < brick->xres
-                     && jstart >=0 && jstart < brick->yres
-                     && kstart >=0 && kstart < brick->zres);
+    xres = brick->xres;
+    yres = brick->yres;
+    zres = brick->zres;
+    g_return_if_fail(istart >=0 && istart < xres
+                     && jstart >=0 && jstart < yres
+                     && kstart >=0 && kstart < zres);
 
     bdata = brick->data;
     gwy_data_field_clear(target);
 
     if (width == -1 && height > 0 && depth > 0) {
-        g_return_if_fail((jstart+height) <= brick->yres);
-        g_return_if_fail((kstart+depth) <= brick->zres);
+        g_return_if_fail((jstart+height) <= yres);
+        g_return_if_fail((kstart+depth) <= zres);
 
         gwy_data_field_resample(target, height, depth, GWY_INTERPOLATION_NONE);
         gwy_data_field_fill(target, G_MINDOUBLE);
@@ -2636,12 +2615,13 @@ gwy_brick_maxpos_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->yreal);
         gwy_data_field_set_yreal(target, brick->zreal);
+        si_unit = brick->si_unit_y;
 
         for (row = 0; row < height; row++) {
             for (lev = 0; lev < depth; lev++) {
                 maxpos = 0;
-                for (col = 0; col < brick->xres; col++) {
-                    gdouble bv = bdata[col + brick->xres*(row + jstart) + brick->xres*brick->yres*(lev + kstart)];
+                for (col = 0; col < xres; col++) {
+                    gdouble bv = bdata[col + xres*(row + jstart) + xres*yres*(lev + kstart)];
                     gdouble fv = ddata[row + lev*height];
                     if (bv > fv)
                         maxpos = col;
@@ -2655,8 +2635,8 @@ gwy_brick_maxpos_plane(const GwyBrick *brick,
     }
 
     if (width > 0 && height == -1 && depth > 0) {
-        g_return_if_fail((istart+width) <= brick->xres);
-        g_return_if_fail((kstart+depth) <= brick->zres);
+        g_return_if_fail((istart+width) <= xres);
+        g_return_if_fail((kstart+depth) <= zres);
 
         gwy_data_field_resample(target, width, depth, GWY_INTERPOLATION_NONE);
         gwy_data_field_fill(target, G_MINDOUBLE);
@@ -2664,12 +2644,13 @@ gwy_brick_maxpos_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->xreal);
         gwy_data_field_set_yreal(target, brick->zreal);
+        si_unit = brick->si_unit_x;
 
         for (col = 0; col < width; col++) {
             for (lev = 0; lev < depth; lev++) {
                 maxpos = 0;
-                for (row = 0; row < brick->yres; row++) {
-                    gdouble bv = bdata[col + istart + brick->xres*row + brick->xres*brick->yres*(lev + kstart)];
+                for (row = 0; row < yres; row++) {
+                    gdouble bv = bdata[col + istart + xres*row + xres*yres*(lev + kstart)];
                     gdouble fv = ddata[col + lev*width];
                     if (bv > fv)
                         maxpos = row;
@@ -2683,8 +2664,8 @@ gwy_brick_maxpos_plane(const GwyBrick *brick,
     }
 
     if (width > 0 && height > 0 && depth == -1) {
-        g_return_if_fail((istart+width) <= brick->xres);
-        g_return_if_fail((jstart+height) <= brick->yres);
+        g_return_if_fail((istart+width) <= xres);
+        g_return_if_fail((jstart+height) <= yres);
 
         gwy_data_field_resample(target, width, height, GWY_INTERPOLATION_NONE);
         gwy_data_field_fill(target, G_MINDOUBLE);
@@ -2692,6 +2673,7 @@ gwy_brick_maxpos_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->xreal);
         gwy_data_field_set_yreal(target, brick->yreal);
+        si_unit = brick->si_unit_x;
 
         calibration = gwy_brick_get_zcalibration((GwyBrick *)brick);
         if (calibration) {
@@ -2705,8 +2687,8 @@ gwy_brick_maxpos_plane(const GwyBrick *brick,
         for (col = 0; col < width; col++) {
             for (row = 0; row < height; row++) {
                 maxpos = 0;
-                for (lev = 0; lev < brick->zres; lev++) {
-                    gdouble bv = bdata[col + istart + brick->xres*(row + jstart) + brick->xres*brick->yres*(lev)];
+                for (lev = 0; lev < zres; lev++) {
+                    gdouble bv = bdata[col + istart + xres*(row + jstart) + xres*yres*(lev)];
                     gdouble fv = ddata[col + row*width];
                     if (bv > fv)
                         maxpos = lev;
@@ -2720,8 +2702,9 @@ gwy_brick_maxpos_plane(const GwyBrick *brick,
         }
     }
 
-    si_unit = gwy_brick_get_si_unit_x((GwyBrick *)brick);
-    gwy_data_field_set_si_unit_xy(target, si_unit);
+    _gwy_assign_si_unit(si_unit, &target->si_unit_xy);
+    /* The position is an integer.  Whatever... */
+    _gwy_assign_si_unit(NULL, &target->si_unit_z);
 }
 
 /**
@@ -2761,9 +2744,8 @@ gwy_brick_mean_plane(const GwyBrick *brick,
                      gint depth,
                      G_GNUC_UNUSED gboolean keep_offsets)
 {
-    gint col, row, lev;
+    gint col, row, lev, xres, yres, zres;
     gdouble *ddata;
-    GwySIUnit *si_unit;
 
     g_return_if_fail(GWY_IS_BRICK(brick));
 
@@ -2771,55 +2753,52 @@ gwy_brick_mean_plane(const GwyBrick *brick,
                      || (width > 0 && height == -1 && depth > 0)
                      || (width > 0 && height > 0 && depth == -1));
 
-    g_return_if_fail(istart >=0 && istart < brick->xres
-                     && jstart >=0 && jstart < brick->yres
-                     && kstart >=0 && kstart < brick->zres);
+    xres = brick->xres;
+    yres = brick->yres;
+    zres = brick->zres;
+    g_return_if_fail(istart >=0 && istart < xres
+                     && jstart >=0 && jstart < yres
+                     && kstart >=0 && kstart < zres);
 
     gwy_brick_sum_plane(brick, target,
                         istart, jstart, kstart, width, height, depth,
                         keep_offsets);
 
     if (width == -1 && height > 0 && depth > 0) {
-        g_return_if_fail((jstart+height) <= brick->yres);
-        g_return_if_fail((kstart+depth) <= brick->zres);
+        g_return_if_fail((jstart+height) <= yres);
+        g_return_if_fail((kstart+depth) <= zres);
 
         ddata = gwy_data_field_get_data(target);
         for (row = 0; row < height; row++) {
             for (lev = 0; lev < depth; lev++) {
-                ddata[row + lev*height] /= brick->xres;
+                ddata[row + lev*height] /= xres;
             }
         }
     }
 
     if (width > 0 && height == -1 && depth > 0) {
-        g_return_if_fail((istart+width) <= brick->xres);
-        g_return_if_fail((kstart+depth) <= brick->zres);
+        g_return_if_fail((istart+width) <= xres);
+        g_return_if_fail((kstart+depth) <= zres);
 
         ddata = gwy_data_field_get_data(target);
         for (col = 0; col < width; col++) {
             for (lev = 0; lev < depth; lev++) {
-                ddata[col + lev*width] /= brick->yres;
+                ddata[col + lev*width] /= yres;
             }
         }
     }
 
     if (width > 0 && height > 0 && depth == -1) {
-        g_return_if_fail((istart+width) <= brick->xres);
-        g_return_if_fail((jstart+height) <= brick->yres);
+        g_return_if_fail((istart+width) <= xres);
+        g_return_if_fail((jstart+height) <= yres);
 
         ddata = gwy_data_field_get_data(target);
         for (col = 0; col < width; col++) {
             for (row = 0; row < height; row++) {
-                ddata[col + row*width] /= brick->zres;
+                ddata[col + row*width] /= zres;
             }
         }
     }
-
-    si_unit = gwy_brick_get_si_unit_x((GwyBrick *)brick);
-    gwy_data_field_set_si_unit_xy(target, si_unit);
-
-    si_unit = gwy_brick_get_si_unit_w((GwyBrick *)brick);
-    gwy_data_field_set_si_unit_z(target, si_unit);
 }
 
 /**
@@ -2859,10 +2838,10 @@ gwy_brick_rms_plane(const GwyBrick *brick,
                     gint depth,
                     G_GNUC_UNUSED gboolean keep_offsets)
 {
-    gint col, row, lev;
+    gint col, row, lev, xres, yres, zres;
     gdouble *bdata, *ddata, *mdata;
     GwyDataField *meanfield;
-    GwySIUnit *si_unit;
+    GwySIUnit *si_unit = NULL;
 
     g_return_if_fail(GWY_IS_BRICK(brick));
 
@@ -2870,9 +2849,12 @@ gwy_brick_rms_plane(const GwyBrick *brick,
                      || (width > 0 && height == -1 && depth > 0)
                      || (width > 0 && height > 0 && depth == -1));
 
-    g_return_if_fail(istart >=0 && istart < brick->xres
-                     && jstart >=0 && jstart < brick->yres
-                     && kstart >=0 && kstart < brick->zres);
+    xres = brick->xres;
+    yres = brick->yres;
+    zres = brick->zres;
+    g_return_if_fail(istart >= 0 && istart < xres
+                     && jstart >= 0 && jstart < yres
+                     && kstart >= 0 && kstart < zres);
 
     meanfield = gwy_data_field_new(1, 1, 1.0, 1.0, FALSE);
     gwy_brick_mean_plane(brick, meanfield,
@@ -2882,8 +2864,8 @@ gwy_brick_rms_plane(const GwyBrick *brick,
     bdata = brick->data;
 
     if (width == -1 && height > 0 && depth > 0) {
-        g_return_if_fail((jstart+height) <= brick->yres);
-        g_return_if_fail((kstart+depth) <= brick->zres);
+        g_return_if_fail((jstart+height) <= yres);
+        g_return_if_fail((kstart+depth) <= zres);
 
         gwy_data_field_resample(target, height, depth, GWY_INTERPOLATION_NONE);
         gwy_data_field_clear(target);
@@ -2892,11 +2874,12 @@ gwy_brick_rms_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->yreal);
         gwy_data_field_set_yreal(target, brick->zreal);
+        si_unit = brick->si_unit_y;
 
         for (row = 0; row < height; row++) {
             for (lev = 0; lev < depth; lev++) {
-                for (col = 0; col < brick->xres; col++) {
-                    gdouble bv = bdata[col + brick->xres*(row + jstart) + brick->xres*brick->yres*(lev + kstart)];
+                for (col = 0; col < xres; col++) {
+                    gdouble bv = bdata[col + xres*(row + jstart) + xres*yres*(lev + kstart)];
                     gdouble mv = mdata[row + lev*height];
                     ddata[row + lev*height] += (bv - mv)*(bv - mv);
                 }
@@ -2905,15 +2888,15 @@ gwy_brick_rms_plane(const GwyBrick *brick,
 
         for (row = 0; row < height; row++) {
             for (lev = 0; lev < depth; lev++) {
-                ddata[row + lev*height] /= brick->xres;
+                ddata[row + lev*height] /= xres;
                 ddata[row + lev*height] = sqrt(ddata[row + lev*height]);
             }
         }
     }
 
     if (width > 0 && height == -1 && depth > 0) {
-        g_return_if_fail((istart+width) <= brick->xres);
-        g_return_if_fail((kstart+depth) <= brick->zres);
+        g_return_if_fail((istart+width) <= xres);
+        g_return_if_fail((kstart+depth) <= zres);
 
         gwy_data_field_resample(target, width, depth, GWY_INTERPOLATION_NONE);
         gwy_data_field_clear(target);
@@ -2922,11 +2905,12 @@ gwy_brick_rms_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->xreal);
         gwy_data_field_set_yreal(target, brick->zreal);
+        si_unit = brick->si_unit_x;
 
         for (col = 0; col < width; col++) {
             for (lev = 0; lev < depth; lev++) {
-                for (row = 0; row < brick->yres; row++) {
-                    gdouble bv = bdata[col + istart + brick->xres*row + brick->xres*brick->yres*(lev + kstart)];
+                for (row = 0; row < yres; row++) {
+                    gdouble bv = bdata[col + istart + xres*row + xres*yres*(lev + kstart)];
                     gdouble mv = mdata[col + lev*width];
                     ddata[col + lev*width] += (bv - mv)*(bv - mv);
                 }
@@ -2935,15 +2919,15 @@ gwy_brick_rms_plane(const GwyBrick *brick,
 
         for (col = 0; col < width; col++) {
             for (lev = 0; lev < depth; lev++) {
-                ddata[col + lev*width] /= brick->yres;
+                ddata[col + lev*width] /= yres;
                 ddata[col + lev*width] = sqrt(ddata[col + lev*width]);
             }
         }
     }
 
     if (width > 0 && height > 0 && depth == -1) {
-        g_return_if_fail((istart+width) <= brick->xres);
-        g_return_if_fail((jstart+height) <= brick->yres);
+        g_return_if_fail((istart+width) <= xres);
+        g_return_if_fail((jstart+height) <= yres);
 
         gwy_data_field_resample(target, width, height, GWY_INTERPOLATION_NONE);
         gwy_data_field_clear(target);
@@ -2952,11 +2936,12 @@ gwy_brick_rms_plane(const GwyBrick *brick,
 
         gwy_data_field_set_xreal(target, brick->xreal);
         gwy_data_field_set_yreal(target, brick->yreal);
+        si_unit = brick->si_unit_x;
 
         for (col = 0; col < width; col++) {
             for (row = 0; row < height; row++) {
-                for (lev = 0; lev < brick->zres; lev++) {
-                    gdouble bv = bdata[col + istart + brick->xres*(row + jstart) + brick->xres*brick->yres*(lev)];
+                for (lev = 0; lev < zres; lev++) {
+                    gdouble bv = bdata[col + istart + xres*(row + jstart) + xres*yres*(lev)];
                     gdouble mv = mdata[col + row*width];
                     ddata[col + row*width] += (bv - mv)*(bv - mv);
                 }
@@ -2965,7 +2950,7 @@ gwy_brick_rms_plane(const GwyBrick *brick,
 
         for (col = 0; col < width; col++) {
             for (row = 0; row < height; row++) {
-                ddata[col + row*width] /= brick->zres;
+                ddata[col + row*width] /= zres;
                 ddata[col + row*width] = sqrt(ddata[col + row*width]);
             }
         }
@@ -2973,11 +2958,8 @@ gwy_brick_rms_plane(const GwyBrick *brick,
 
     g_object_unref(meanfield);
 
-    si_unit = gwy_brick_get_si_unit_x((GwyBrick *)brick);
-    gwy_data_field_set_si_unit_xy(target, si_unit);
-
-    si_unit = gwy_brick_get_si_unit_w((GwyBrick *)brick);
-    gwy_data_field_set_si_unit_z(target, si_unit);
+    _gwy_assign_si_unit(si_unit, &target->si_unit_xy);
+    _gwy_assign_si_unit(brick->si_unit_w, &target->si_unit_z);
 }
 
 /**
@@ -3006,121 +2988,93 @@ gwy_brick_extract_line(const GwyBrick *brick, GwyDataLine *target,
                        gint iend, gint jend, gint kend,
                        G_GNUC_UNUSED gboolean keep_offsets)
 {
-    gint col, row, lev;
+    gint col, row, lev, xres, yres, zres;
     gdouble *bdata, *ddata;
-    GwySIUnit *si_unit;
+    GwySIUnit *si_unit = NULL;
 
     g_return_if_fail(GWY_IS_BRICK(brick));
 
-
-    g_return_if_fail(istart >= 0 && istart <= brick->xres
-                     && jstart >= 0 && jstart <= brick->yres
-                     && kstart >= 0 && kstart <= brick->zres
-                     && iend >= 0 && iend <= brick->xres
-                     && jend >= 0 && jend <= brick->yres
-                     && kend >= 0 && kend <= brick->zres);
+    xres = brick->xres;
+    yres = brick->yres;
+    zres = brick->zres;
+    g_return_if_fail(istart >= 0 && istart <= xres
+                     && jstart >= 0 && jstart <= yres
+                     && kstart >= 0 && kstart <= zres
+                     && iend >= 0 && iend <= xres
+                     && jend >= 0 && jend <= yres
+                     && kend >= 0 && kend <= zres);
 
     bdata = brick->data;
 
     if ((jstart == jend) && (kstart == kend)) {
-        gwy_data_line_resample(target, abs(iend - istart),
+        gwy_data_line_resample(target, ABS(iend - istart),
                                GWY_INTERPOLATION_NONE);
         ddata = gwy_data_line_get_data(target);
-        si_unit = gwy_brick_get_si_unit_x((GwyBrick *) brick);
+        si_unit = brick->si_unit_x;
 
         row = jstart;
         lev = kstart;
-        if (iend >= istart)
-            for (col = 0; col < (iend - istart); col++) {
-                ddata[col] =
-                    bdata[col + istart + brick->xres * (row) +
-                          brick->xres * brick->yres * (lev)];
-            }
-        else
-            for (col = 0; col < (istart - iend); col++) {
-                ddata[col] =
-                    bdata[iend - col - 1 + brick->xres * (row) +
-                          brick->xres * brick->yres * (lev)];
-            }
+        if (iend >= istart) {
+            for (col = 0; col < (iend - istart); col++)
+                ddata[col] = bdata[col + istart + xres*row + xres*yres*lev];
+        }
+        else {
+            for (col = 0; col < (istart - iend); col++)
+                ddata[col] = bdata[iend - col - 1 + xres*row + xres*yres*lev];
+        }
         gwy_data_line_set_offset(target,
-                                 MIN(istart,
-                                     iend) * brick->xreal /
-                                 (gdouble)brick->xres);
+                                 MIN(istart, iend) * brick->xreal/xres);
         gwy_data_line_set_real(target,
-                               (gdouble)abs(iend -
-                                            istart) * brick->xreal /
-                               (gdouble)brick->xres);
+                               ABS(iend - istart) * brick->xreal/xres);
     }
     else if ((istart == iend) && (kstart == kend)) {
-        gwy_data_line_resample(target, abs(jend - jstart),
+        gwy_data_line_resample(target, ABS(jend - jstart),
                                GWY_INTERPOLATION_NONE);
         ddata = gwy_data_line_get_data(target);
-        si_unit = gwy_brick_get_si_unit_y((GwyBrick *) brick);
+        si_unit = brick->si_unit_y;
 
         col = istart;
         lev = kstart;
-        if (jend >= jstart)
-            for (row = 0; row < (jend - jstart); row++) {
-                ddata[row] =
-                    bdata[col + brick->xres * (row + jstart) +
-                          brick->xres * brick->yres * (lev)];
-            }
-        else
-            for (row = 0; row < (jstart - jend); row++) {
-                ddata[row] =
-                    bdata[col + brick->xres * (jstart - row - 1) +
-                          brick->xres * brick->yres * (lev)];
-            }
+        if (jend >= jstart) {
+            for (row = 0; row < (jend - jstart); row++)
+                ddata[row] = bdata[col + xres*(row + jstart) + xres*yres*lev];
+        }
+        else {
+            for (row = 0; row < (jstart - jend); row++)
+                ddata[row] = bdata[col + xres*(jstart - row - 1) + xres*yres*lev];
+        }
         gwy_data_line_set_offset(target,
-                                 MIN(jstart,
-                                     jend) * brick->yreal /
-                                 (gdouble)brick->yres);
+                                 MIN(jstart, jend) * brick->yreal/yres);
         gwy_data_line_set_real(target,
-                               (gdouble)abs(jend -
-                                            jstart) * brick->yreal /
-                               (gdouble)brick->yres);
+                               ABS(jend - jstart) * brick->yreal/yres);
     }
     else if ((istart == iend) && (jstart == jend)) {
-        gwy_data_line_resample(target, abs(kend - kstart),
+        gwy_data_line_resample(target, ABS(kend - kstart),
                                GWY_INTERPOLATION_NONE);
         ddata = gwy_data_line_get_data(target);
-        si_unit = gwy_brick_get_si_unit_z((GwyBrick *) brick);
+        si_unit = brick->si_unit_x;
 
         col = istart;
         row = jstart;
-        if (kend >= kstart)
-            for (lev = 0; lev < (kend - kstart); lev++) {
-                ddata[lev] =
-                    bdata[col + brick->xres * (row) +
-                          brick->xres * brick->yres * (lev + kstart)];
-            }
-        else
-            for (lev = 0; lev < (kstart - kend); lev++) {
-                ddata[lev] =
-                    bdata[col + brick->xres * (row) +
-                          brick->xres * brick->yres * (kend - lev - 1)];
-            }
+        if (kend >= kstart) {
+            for (lev = 0; lev < (kend - kstart); lev++)
+                ddata[lev] = bdata[col + xres*row + xres*yres*(lev + kstart)];
+        }
+        else {
+            for (lev = 0; lev < (kstart - kend); lev++)
+                ddata[lev] = bdata[col + xres*row + xres*yres*(kend - lev - 1)];
+        }
         gwy_data_line_set_offset(target,
-                                 MIN(kstart,
-                                     kend) * brick->zreal /
-                                 (gdouble)brick->zres);
+                                 MIN(kstart, kend) * brick->zreal/zres);
         gwy_data_line_set_real(target,
-                               (gdouble)abs(kend -
-                                            kstart) * brick->zreal /
-                               (gdouble)brick->zres);
+                               ABS(kend - kstart) * brick->zreal/zres);
     }
     else {
         g_return_if_reached();
     }
 
-    si_unit = gwy_si_unit_duplicate(si_unit);
-    gwy_data_line_set_si_unit_x(target, si_unit);
-    g_object_unref(si_unit);
-
-    si_unit = gwy_brick_get_si_unit_w((GwyBrick *) brick);
-    si_unit = gwy_si_unit_duplicate(si_unit);
-    gwy_data_line_set_si_unit_y(target, si_unit);
-    g_object_unref(si_unit);
+    _gwy_assign_si_unit(si_unit, &target->si_unit_x);
+    _gwy_assign_si_unit(brick->si_unit_w, &target->si_unit_y);
 }
 
 /**
diff --git a/libprocess/brick.h b/libprocess/brick.h
index fa5f27d..81c735b 100644
--- a/libprocess/brick.h
+++ b/libprocess/brick.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: brick.h 18119 2016-01-19 11:01:32Z yeti-dn $
+ *  @(#) $Id: brick.h 20128 2017-08-01 11:19:59Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -106,21 +106,6 @@ GwyBrick* gwy_brick_new_part    (const GwyBrick *brick,
                                  gboolean keep_offsets);
 void      gwy_brick_data_changed(GwyBrick *brick);
 
-/*void            gwy_brick_set_size    (GwyBrick *brick,
-                                       guint xres,
-                                       guint yres,
-                                       guint zres,
-                                       gboolean clear);*/
-/*void            gwy_brick_copy        (const GwyBrick *src,
-                                       const GwyBrickPart *srcpart,
-                                       GwyBrick *dest,
-                                       guint destcol,
-                                       guint destrow,
-                                       guint destlevel);*/
-/*void            gwy_brick_copy_full   (const GwyBrick *src,
-                                       GwyBrick *dest);*/
-/*void            gwy_brick_invalidate  (GwyBrick *brick);*/
-
 void              gwy_brick_resample          (GwyBrick *brick,
                                                gint xres,
                                                gint yres,
@@ -162,6 +147,8 @@ void              gwy_brick_set_si_unit_w     (GwyBrick *brick,
                                                GwySIUnit *si_unit);
 gdouble           gwy_brick_get_min           (GwyBrick *brick);
 gdouble           gwy_brick_get_max           (GwyBrick *brick);
+void              gwy_brick_copy_units        (const GwyBrick *brick,
+                                               GwyBrick *target);
 GwySIValueFormat* gwy_brick_get_value_format_x(GwyBrick *brick,
                                                GwySIUnitFormatStyle style,
                                                GwySIValueFormat *format);
diff --git a/libprocess/correct-laplace.c b/libprocess/correct-laplace.c
new file mode 100644
index 0000000..d425275
--- /dev/null
+++ b/libprocess/correct-laplace.c
@@ -0,0 +1,1592 @@
+/*
+ *  @(#) $Id: correct-laplace.c 19727 2017-05-10 17:45:37Z yeti-dn $
+ *  Copyright (C) 2004-2017 David Necas (Yeti), Petr Klapetek.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <string.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libprocess/datafield.h>
+#include <libprocess/stats.h>
+#include <libprocess/grains.h>
+#include <libprocess/correct.h>
+#include "gwyprocessinternal.h"
+
+enum { NONE = G_MAXUINT };
+
+typedef enum {
+    UP,
+    RIGHT,
+    DOWN,
+    LEFT,
+    NDIRECTIONS
+} LaplaceDirection;
+
+/*
+ * @len: The number of blocks.  (The allocated size is usually a bit larger.)
+ * @n: Start of each neighbour in @k and @w, size @len+1.
+ * @k: Indices of neighbours for laplacian calculation, allocated size is a
+ *     multiple of @len but blocks are variable-size, given by @n.  These
+ *     indices refer to these arrays, not the original grid.
+ * @w: Coefficient blocks (for calculation of the second derivative from
+ *     neigbours), allocated size is a
+ *     multiple of @len but blocks are variable-size, given by @n.
+ * @z: Values of the points, size @len.
+ * @rhs: Right-hand-sides of the points, size @len.
+ * @f: The difference between the second derivative and the value, size @len.
+ * @v: Conjugate-gradients auxiliary vector, size @len.
+ * @t: Conjugate-gradients auxiliary vector, size @len.
+ * @gindex: Where the point is placed in the original data, size @len.
+ */
+/* FIXME: Most of the coefficient sets in @w are repeated many times.  We could
+ * consilidate them, replacing 3-5 doubles (typically) per iterator with one
+ * integer.
+ */
+typedef struct {
+    gsize len;
+    gsize int_size;
+    gsize float_size;
+    guint *n;
+    guint *k;
+    gdouble *w;
+    gdouble *z;
+    gdouble *rhs;
+    gdouble *f;
+    gdouble *v;
+    gdouble *t;
+    guint *gindex;
+} LaplaceIterators;
+
+typedef struct {
+    gboolean is_virtual : 1;
+    gboolean is_boundary : 1;
+    gboolean is_rhs : 1;
+
+    guint bdist;     // Distance of the boundary line where ∂z/∂x = 0
+    guint step;
+    guint neighbour;
+    guint neighbour2;
+
+    gdouble rhs;     // Remember the exterior data used for rhs
+    gdouble weight;  // Coefficient before (z_neighbour - z_0)
+    gdouble weight2; // Coefficient before (z_neighbour2 - z_0)
+} LaplaceNeighbour;
+
+/**
+ * gwy_data_field_correct_laplace_iteration:
+ * @data_field: Data field to be corrected.
+ * @mask_field: Mask of places to be corrected.
+ * @buffer_field: Initialized to same size as mask and data.
+ * @error: Maximum change within last step.
+ * @corrfactor: Correction factor within step.
+ *
+ * Performs one interation of Laplace data correction.
+ *
+ * Tries to remove all the points in mask off the data by using
+ * iterative method similar to solving heat flux equation.
+ *
+ * Use this function repeatedly until reasonable @error is reached.
+ *
+ * <warning>For almost all purposes this function was superseded by
+ * non-iteratie gwy_data_field_laplace_solve() which is simultaneously much
+ * faster and more accurate.</warning>
+ **/
+void
+gwy_data_field_correct_laplace_iteration(GwyDataField *data_field,
+                                         GwyDataField *mask_field,
+                                         GwyDataField *buffer_field,
+                                         gdouble corrfactor,
+                                         gdouble *error)
+{
+    gint xres, yres, i, j;
+    const gdouble *mask, *data;
+    gdouble *buffer;
+    gdouble cor, cf, err;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    g_return_if_fail(GWY_IS_DATA_FIELD(mask_field));
+    g_return_if_fail(GWY_IS_DATA_FIELD(buffer_field));
+    g_return_if_fail(data_field->xres == mask_field->xres
+                     && data_field->yres == mask_field->yres);
+
+    xres = data_field->xres;
+    yres = data_field->yres;
+
+    /* check buffer field */
+    if (buffer_field->xres != xres || buffer_field->yres != yres)
+        gwy_data_field_resample(buffer_field, xres, yres,
+                                GWY_INTERPOLATION_NONE);
+
+    gwy_data_field_copy(data_field, buffer_field, FALSE);
+
+    data = data_field->data;
+    buffer = buffer_field->data;
+    mask = mask_field->data;
+
+    /* set boundary condition for masked boundary data */
+    if (yres >= 2) {
+        for (i = 0; i < xres; i++) {
+            if (mask[i] > 0)
+                buffer[i] = buffer[i + xres];
+            if (mask[i + xres*(yres - 1)] > 0)
+                buffer[i + xres*(yres - 1)] = buffer[i + xres*(yres - 2)];
+        }
+    }
+    if (xres >= 2) {
+        for (i = 0; i < yres; i++) {
+            if (mask[xres*i] > 0)
+                buffer[xres*i] = buffer[1 + xres*i];
+            if (mask[xres - 1 + xres*i] > 0)
+                buffer[xres - 1 + xres*i] = buffer[xres-2 + xres*i];
+        }
+    }
+
+    /* iterate */
+    err = 0.0;
+    cf = corrfactor;
+    for (i = 1; i < yres - 1; i++) {
+        for (j = 1; j < xres - 1; j++) {
+            if (mask[i*xres + j] > 0) {
+                cor = cf*((data[(i - 1)*xres + j] + data[(i + 1)*xres + j]
+                           - 2*data[i*xres + j])
+                          + (data[i*xres + j - 1] + data[i*xres + j + 1]
+                             - 2*data[i*xres + j]));
+
+                buffer[i*xres + j] += cor;
+                cor = fabs(cor);
+                if (cor > err)
+                    err = cor;
+            }
+        }
+    }
+
+    gwy_data_field_copy(buffer_field, data_field, FALSE);
+    gwy_data_field_invalidate(data_field);
+
+    if (error)
+        *error = err;
+}
+
+/***************************************************************************
+ *
+ * Efficient Laplace interpolation.
+ *
+ ***************************************************************************/
+
+static gboolean
+promote(const guint *levels, guint *buffer,
+        guint xres, guint yres,
+        guint level, guint step)
+{
+    guint nx = (xres + step-1)/step, ny = (yres + step-1)/step;
+    guint vstep = xres*step;
+    gboolean ok = FALSE;
+    guint i, j;
+
+    if (nx < 3 || ny < 3)
+        return ok;
+
+    for (i = 0; i < ny; i++) {
+        for (j = 0; j < nx; j++) {
+            guint k = (i*xres + j)*step;
+
+            if (levels[k] == level
+                && (!i || levels[k-vstep] == level)
+                && (!j || levels[k-step] == level)
+                && (j == nx-1 || levels[k+step] == level)
+                && (i == ny-1 || levels[k+vstep] == level)) {
+                buffer[k] = level+1;
+                ok = TRUE;
+            }
+        }
+    }
+
+    return ok;
+}
+
+static void
+demote(const guint *levels, guint *buffer,
+       guint xres, guint yres,
+       guint level, guint step)
+{
+    guint nx = (xres + step-1)/step, ny = (yres + step-1)/step;
+    guint vstep = xres*step;
+    guint i, j;
+
+    if (nx < 3 || ny < 3)
+        return;
+
+    for (i = 1; i < ny-1; i++) {
+        for (j = 1; j < nx-1; j++) {
+            guint k = (i*xres + j)*step;
+
+            if (levels[k] == level
+                && (levels[k-vstep-step] == level-1
+                    || levels[k-vstep] == level-1
+                    || levels[k-vstep+step] == level-1
+                    || levels[k-step] == level-1
+                    || levels[k+step] == level-1
+                    || levels[k+vstep-step] == level-1
+                    || levels[k+vstep] == level-1
+                    || levels[k+vstep+step] == level-1)) {
+                if (buffer[k-vstep-step] > level)
+                    buffer[k-vstep-step] = level;
+                if (buffer[k-vstep] > level)
+                    buffer[k-vstep] = level;
+                if (buffer[k-vstep+step] > level)
+                    buffer[k-vstep+step] = level;
+                if (buffer[k-step] > level)
+                    buffer[k-step] = level;
+                if (buffer[k+step] > level)
+                    buffer[k+step] = level;
+                if (buffer[k+vstep-step] > level)
+                    buffer[k+vstep-step] = level;
+                if (buffer[k+vstep] > level)
+                    buffer[k+vstep] = level;
+                if (buffer[k+vstep+step] > level)
+                    buffer[k+vstep+step] = level;
+            }
+        }
+    }
+}
+
+static gboolean
+reduce(const guint *levels, guint *buffer,
+       guint xres, guint yres,
+       guint level, guint step)
+{
+    guint nx = (xres + step-1)/step, ny = (yres + step-1)/step;
+    guint halfstep = step/2;
+    guint vstep = xres*step, vhalfstep = xres*halfstep;
+    gboolean ok = FALSE;
+    gboolean right = (nx - 1)*step + halfstep < xres;
+    gboolean down = (ny - 1)*step + halfstep < yres;
+    guint i, j;
+
+    g_return_val_if_fail(step % 2 == 0, FALSE);
+
+    if (nx < 3 || ny < 3)
+        return ok;
+
+    for (i = 0; i < ny; i++) {
+        for (j = 0; j < nx; j++) {
+            guint k = (i*xres + j)*step;
+
+            if (levels[k] == level
+                && (!i || !j || levels[k-vstep-step] >= level)
+                && (!i || levels[k-vstep] == level)
+                && (!i || j == nx-1 || levels[k-vstep+step] >= level)
+                && (!j || levels[k-step] == level)
+                && (j == nx-1 || levels[k+step] == level)
+                && (i == ny-1 || !j || levels[k+vstep-step] >= level)
+                && (i == ny-1 || levels[k+vstep] == level)
+                && (i == ny-1 || j == nx-1 || levels[k+vstep+step] >= level)) {
+                buffer[k] = level+1;
+                if (i && j)
+                    buffer[k-vhalfstep-halfstep] = NONE;
+                if (i)
+                    buffer[k-vhalfstep] = NONE;
+                if (i && (right || j < nx-1))
+                    buffer[k-vhalfstep+halfstep] = NONE;
+                if (j)
+                    buffer[k-halfstep] = NONE;
+                if (right || j < nx-1)
+                    buffer[k+halfstep] = NONE;
+                if ((down || i < ny-1) && j)
+                    buffer[k+vhalfstep-halfstep] = NONE;
+                if (down || i < ny-1)
+                    buffer[k+vhalfstep] = NONE;
+                if ((down || i < ny-1) && (right || j < nx-1))
+                    buffer[k+vhalfstep+halfstep] = NONE;
+                ok = TRUE;
+            }
+        }
+    }
+
+    return ok;
+}
+
+static void
+remove_spikes(guint *levels,
+              guint xres, guint yres,
+              guint level, guint step)
+{
+    guint nx = (xres + step-1)/step, ny = (yres + step-1)/step;
+    guint i, j;
+
+    if (nx < 3 || ny < 3)
+        return;
+
+    for (i = 1; i < ny-1; i++) {
+        for (j = 1; j < nx-1; j++) {
+            guint k = (i*xres + j)*step;
+
+            if (levels[k] == level) {
+                guint su = (levels[k-xres*step] == NONE),
+                      sd = (levels[k+xres*step] == NONE),
+                      sl = (levels[k-step] == NONE),
+                      sr = (levels[k+step] == NONE);
+
+                if ((su & sd & ~sl & ~sr) || (~su & ~sd & sl & sr))
+                    levels[k] = NONE;
+            }
+        }
+    }
+}
+
+static guint
+build_levels(guint *levels, guint *buffer,
+             guint xres, guint yres)
+{
+    guint step = 1, level = 0;
+
+    gwy_assign(buffer, levels, xres*yres);
+    while (TRUE) {
+        // Promote odd levels to one-greater even levels if they do not touch
+        // lower-values levels.
+        level++;
+        if (!promote(levels, buffer, xres, yres, level, step))
+            break;
+
+        // Ensure a dense representation near the boundary.
+        if (level == 1) {
+            gwy_assign(levels, buffer, xres*yres);
+            demote(levels, buffer, xres, yres, level, step);
+        }
+
+        gwy_assign(levels, buffer, xres*yres);
+        // Clear the space around even levels and promote them to one-greater
+        // odd levels if the do not touch lower levels.
+        level++;
+        step *= 2;
+        if (!reduce(levels, buffer, xres, yres, level, step))
+            break;
+
+        // Remove even levels that would have to be interpolated from two
+        // opposide sides (they appear when both sides of it are promoted but
+        // not the point itself).
+        if (level > 1)
+            remove_spikes(buffer, xres, yres, level, step/2);
+
+        gwy_assign(levels, buffer, xres*yres);
+    }
+
+    return level;
+}
+
+static guint
+count_grid_points(const guint *levels,
+                  guint xres, guint yres)
+{
+    guint k, npoints = 0;
+
+    for (k = 0; k < xres*yres; k++) {
+        if (levels[k] && levels[k] != NONE)
+            npoints++;
+    }
+
+    return npoints;
+}
+
+static void
+build_grid_index(const guint *levels,
+                 guint xres, guint yres,
+                 guint *gindex,
+                 guint *revindex)
+{
+    guint k, n = 0;
+
+    for (k = 0; k < xres*yres; k++) {
+        if (levels[k] && levels[k] != NONE) {
+            revindex[k] = n;
+            gindex[n++] = k;
+        }
+        else
+            revindex[k] = NONE;
+    }
+}
+
+static void
+laplace_iterators_setup(LaplaceIterators *iterators,
+                        guint maxneighbours)
+{
+    gsize len = iterators->len;
+
+    iterators->k = iterators->n + (len + 2);
+    iterators->gindex = iterators->k + maxneighbours*len;
+
+    iterators->rhs = iterators->z + len;
+    iterators->f = iterators->rhs + len;
+    iterators->v = iterators->f + len;
+    iterators->t = iterators->v + len;
+    iterators->w = iterators->t + len;
+}
+
+static void
+laplace_iterators_resize(LaplaceIterators *iterators,
+                         guint len,
+                         guint maxneighbours)
+{
+    gsize int_size = (maxneighbours + 2)*len + 2;
+    gsize float_size = (maxneighbours + 5)*len;
+
+    iterators->len = len;
+
+    if (int_size > iterators->int_size) {
+        if (G_UNLIKELY(iterators->int_size))
+            g_warning("Laplace iterators need to be enlarged (int).");
+        GWY_FREE(iterators->n);
+        iterators->n = g_new0(guint, int_size);
+        iterators->int_size = int_size;
+    }
+    else
+        gwy_clear(iterators->n, int_size);
+
+    if (float_size > iterators->float_size) {
+        if (G_UNLIKELY(iterators->float_size))
+            g_warning("Laplace iterators need to be enlarged (float).");
+        GWY_FREE(iterators->z);
+        iterators->z = g_new0(gdouble, float_size);
+        iterators->float_size = float_size;
+    }
+    else
+        gwy_clear(iterators->z, float_size);
+
+    laplace_iterators_setup(iterators, maxneighbours);
+}
+
+static LaplaceIterators*
+laplace_iterators_new(guint len, guint maxneighbours)
+{
+    LaplaceIterators *iterators = g_slice_new0(LaplaceIterators);
+    laplace_iterators_resize(iterators, len, maxneighbours);
+    return iterators;
+}
+
+static void
+laplace_iterators_free(LaplaceIterators *iterators)
+{
+    g_free(iterators->z);
+    g_free(iterators->n);
+    g_slice_free(LaplaceIterators, iterators);
+}
+
+static void
+analyse_neighbour_direction(const guint *levels,
+                            const gdouble *data,
+                            gint xres, gint yres,
+                            gint xstep, gint ystep,
+                            gint j, gint i,
+                            const guint *revindex,
+                            LaplaceNeighbour *nd)
+{
+    gint ineigh, jneigh, step;
+    gint xorthostep, yorthostep;
+    guint kk;
+
+    gwy_clear(nd, 1);
+    step = MAX(ABS(xstep), ABS(ystep));
+    ineigh = i + ystep;
+    jneigh = j + xstep;
+
+    // 1 Primary neighbour.
+    // 1.a Neumann boundary.
+    // The upper and left boundaries are always aligned.
+    if (ineigh < 0) {
+        g_assert(i == 0);
+        nd->is_boundary = TRUE;
+        nd->step = step;
+        return;
+    }
+    if (jneigh < 0) {
+        g_assert(j == 0);
+        nd->is_boundary = TRUE;
+        nd->step = step;
+        return;
+    }
+    // The other boundaries can be unaligned.
+    if (ineigh >= yres) {
+        nd->is_boundary = TRUE;
+        nd->bdist = yres-1 - i;
+        nd->step = step;
+        return;
+    }
+    if (jneigh >= xres) {
+        nd->is_boundary = TRUE;
+        nd->bdist = xres-1 - j;
+        nd->step = step;
+        return;
+    }
+
+    kk = ineigh*xres + jneigh;
+
+    // 1.b Dirichlet boundary.
+    if (!levels[kk]) {
+        g_assert(step == 1);
+        nd->is_rhs = TRUE;
+        nd->step = step;
+        nd->rhs = data[kk];
+        return;
+    }
+
+    // 1.c Interior.
+    if (levels[kk] != NONE) {
+        nd->neighbour = revindex[kk];
+        nd->step = step;
+        return;
+    }
+
+    // 2 Secondary neighbour.
+    ineigh = i + 2*ystep;
+    jneigh = j + 2*xstep;
+
+    // 2.a Neumann boundary.
+    // The upper and left boundaries are always aligned.
+    if (ineigh < 0) {
+        g_assert(i == 0);
+        nd->is_boundary = TRUE;
+        nd->step = 2*step;
+        return;
+    }
+    if (jneigh < 0) {
+        g_assert(j == 0);
+        nd->is_boundary = TRUE;
+        nd->step = 2*step;
+        return;
+    }
+    // The other boundaries can be unaligned.
+    if (ineigh >= yres) {
+        nd->is_boundary = TRUE;
+        nd->bdist = yres-1 - i;
+        nd->step = 2*step;
+        return;
+    }
+    if (jneigh >= xres) {
+        nd->is_boundary = TRUE;
+        nd->bdist = xres-1 - j;
+        nd->step = 2*step;
+        return;
+    }
+
+    kk = ineigh*xres + jneigh;
+    g_assert(levels[kk]);    // Dirichlet boundary is always at step one.
+
+    // 2.b Interior.
+    if (levels[kk] != NONE) {
+        nd->neighbour = revindex[kk];
+        nd->step = 2*step;
+        return;
+    }
+
+    // 3 Virtual neighbour.
+    xorthostep = xstep ? 0 : ABS(ystep);
+    yorthostep = ystep ? 0 : ABS(xstep);
+    ineigh = i + 2*ystep - yorthostep;
+    jneigh = j + 2*xstep - xorthostep;
+    // The upper and left boundaries are always aligned.
+    g_assert(ineigh >= 0);
+    g_assert(jneigh >= 0);
+    kk = ineigh*xres + jneigh;
+
+    nd->is_virtual = TRUE;
+    nd->neighbour = revindex[kk];
+    nd->step = 2*step;  // The long distance; the short is always half of that.
+
+    ineigh = i + 2*ystep + yorthostep;
+    jneigh = j + 2*xstep + xorthostep;
+    g_assert(ineigh < yres || jneigh < xres);
+    if (ineigh < yres && jneigh < xres) {
+        kk = ineigh*xres + jneigh;
+        nd->neighbour2 = revindex[kk];
+        g_assert(nd->neighbour2 != NONE);
+    }
+    else {
+        nd->is_boundary = TRUE;
+        if (ineigh >= yres)
+            nd->bdist = yres-1 - i;
+        else
+            nd->bdist = xres-1 - j;
+    }
+}
+
+static void
+calculate_weights(LaplaceNeighbour *nd)
+{
+    LaplaceDirection virtual_dir = NDIRECTIONS;
+    guint i, ii, ileft, iright, j, boundary_dir;
+    gboolean virtual_is_boundary;
+
+    // At most one virtual direction.
+    for (j = 0; j < NDIRECTIONS; j++) {
+        if (nd[j].is_virtual) {
+            g_assert(virtual_dir == NDIRECTIONS);
+            virtual_dir = j;
+        }
+    }
+
+    // No virtual, no mixing of z_xx and z_yy.
+    if (virtual_dir == NDIRECTIONS) {
+        for (j = 0; j < NDIRECTIONS; j++) {
+            guint jj = (j + 2) % NDIRECTIONS;
+            gdouble s, xs;
+
+            if (nd[j].is_boundary)
+                continue;
+
+            s = nd[j].step;
+            xs = nd[jj].is_boundary ? 2*nd[jj].bdist : nd[jj].step;
+            nd[j].weight = 2.0/(s + xs)/s;
+        }
+        return;
+    }
+
+    // Virtual.
+    i = virtual_dir;
+    iright = (i + 1) % NDIRECTIONS;
+    ii = (i + 2) % NDIRECTIONS;
+    ileft = (i + 3) % NDIRECTIONS;
+    boundary_dir = NDIRECTIONS;
+    virtual_is_boundary = nd[i].is_boundary;
+
+    // At most one boundary direction, except the boundary direction itself.
+    for (j = 0; j < NDIRECTIONS; j++) {
+        if (j != virtual_dir && nd[j].is_boundary) {
+            g_assert(boundary_dir == NDIRECTIONS);
+            boundary_dir = j;
+        }
+    }
+    g_assert(!virtual_is_boundary || (boundary_dir == iright
+                                      || boundary_dir == ileft));
+    if (boundary_dir == NDIRECTIONS) {
+        gdouble s = nd[i].step, ss = nd[ii].step;
+        gdouble sleft = nd[ileft].step, sright = nd[iright].step;
+        gdouble w = 1.0 - 0.25*s/(s + ss);
+        nd[i].weight = nd[i].weight2 = 1.0/(s + ss)/s;
+        nd[ii].weight = 2.0/(s + ss)/ss;
+        nd[ileft].weight = 2.0*w/(sleft + sright)/sleft;
+        nd[iright].weight = 2.0*w/(sleft + sright)/sright;
+    }
+    else if (boundary_dir == ii) {
+        gdouble s = nd[i].step;
+        gdouble sleft = nd[ileft].step, sright = nd[iright].step;
+        gdouble b = nd[boundary_dir].bdist;
+        gdouble w = 1.0 - 0.25*s/(s + 2*b);
+        nd[i].weight = nd[i].weight2 = 1.0/(s + 2*b)/s;
+        nd[ileft].weight = 2.0*w/(sleft + sright)/sleft;
+        nd[iright].weight = 2.0*w/(sleft + sright)/sright;
+    }
+    else {
+        guint irem = (boundary_dir + 2) % NDIRECTIONS;
+        gdouble s = nd[i].step, ss = nd[ii].step;
+        gdouble srem = nd[irem].step;
+        gdouble b = nd[boundary_dir].bdist;
+        gdouble w = 1.0 - 0.25*(s + 4*b)/(s + ss);
+        nd[i].weight = 2.0/(s + ss)/s;
+        nd[ii].weight = 2.0/(s + ss)/ss;
+        nd[irem].weight = 2.0*w/(srem + 2*b)/srem;
+    }
+}
+
+static void
+build_iterator(LaplaceNeighbour *nd,
+               LaplaceIterators *iterators,
+               guint ipt,
+               gdouble *nrhs,
+               gdouble *rhssum)
+{
+    guint i, start, npt = 0;
+    gdouble ws = 0.0, rs = 0.0;
+    gboolean sorted = FALSE;
+    guint *iter_k;
+    gdouble *iter_w;
+
+    // Figure out how many neighbours we have and sum the weights.
+    for (i = 0; i < NDIRECTIONS; i++) {
+        if (nd[i].weight) {
+            ws += nd[i].weight;
+            if (nd[i].is_rhs) {
+                g_assert(!nd[i].is_virtual);
+                g_assert(!nd[i].is_boundary);
+                rs += nd[i].rhs;
+                *nrhs += nd[i].weight;
+            }
+            else
+                npt++;
+
+            if (nd[i].weight2) {
+                g_assert(nd[i].is_virtual);
+                ws += nd[i].weight2;
+                npt++;
+            }
+        }
+    }
+    g_assert(npt > 0 && npt <= 5);
+
+    start = iterators->n[ipt];
+    iterators->n[ipt+1] = start + npt;
+    if (rs) {
+        *rhssum += rs;
+        iterators->rhs[ipt] = rs/ws;
+    }
+
+    // Create the iterators.
+    iter_w = iterators->w + start;
+    iter_k = iterators->k + start;
+    for (i = 0; i < NDIRECTIONS; i++) {
+        if (!nd[i].is_rhs && nd[i].weight) {
+            *(iter_w++) = nd[i].weight/ws;
+            *(iter_k++) = nd[i].neighbour;
+            if (nd[i].weight2) {
+                *(iter_w++) = nd[i].weight2/ws;
+                *(iter_k++) = nd[i].neighbour2;
+            }
+        }
+    }
+
+    // Sort the segments by k.
+    iter_w = iterators->w + start;
+    iter_k = iterators->k + start;
+    do {
+        sorted = TRUE;
+        for (i = 1; i < npt; i++) {
+            if (iter_k[i-1] > iter_k[i]) {
+                GWY_SWAP(guint, iter_k[i-1], iter_k[i]);
+                GWY_SWAP(gdouble, iter_w[i-1], iter_w[i]);
+                sorted = FALSE;
+            }
+        }
+    } while (!sorted);
+}
+
+static void
+build_sparse_iterators(LaplaceIterators *iterators,
+                       guint *revindex,
+                       const guint *levels,
+                       const gdouble *data,
+                       guint xres, guint yres)
+{
+    LaplaceNeighbour nd[NDIRECTIONS];
+    guint len = count_grid_points(levels, xres, yres);
+    gdouble rhssum = 0.0, nrhs = 0.0;
+    const guint *gindex;
+    guint ipt;
+
+    laplace_iterators_resize(iterators, len, 5);
+    build_grid_index(levels, xres, yres, iterators->gindex, revindex);
+
+    gindex = iterators->gindex;
+
+    for (ipt = 0; ipt < len; ipt++) {
+        guint k = gindex[ipt], i = k/xres, j = k % xres;
+        gint step = 1 << ((levels[k] - 1)/2);
+
+        analyse_neighbour_direction(levels, data, xres, yres,
+                                    0, -step, j, i, revindex, nd + UP);
+        analyse_neighbour_direction(levels, data, xres, yres,
+                                    step, 0, j, i, revindex, nd + RIGHT);
+        analyse_neighbour_direction(levels, data, xres, yres,
+                                    0, step, j, i, revindex, nd + DOWN);
+        analyse_neighbour_direction(levels, data, xres, yres,
+                                    -step, 0, j, i, revindex, nd + LEFT);
+
+        calculate_weights(nd);
+        build_iterator(nd, iterators, ipt, &nrhs, &rhssum);
+    }
+
+    // Initialise with the mean value of right hand sides, including
+    // multiplicity.
+    rhssum /= nrhs;
+    for (ipt = 0; ipt < len; ipt++)
+        iterators->z[ipt] = rhssum;
+}
+
+static void
+build_dense_iterators(LaplaceIterators *iterators,
+                      guint *revindex,
+                      const guint *levels,
+                      const gdouble *data,
+                      guint xres, guint yres)
+{
+    guint len = count_grid_points(levels, xres, yres);
+    const guint *gindex;
+    guint ipt;
+
+    laplace_iterators_resize(iterators, len, 4);
+    build_grid_index(levels, xres, yres, iterators->gindex, revindex);
+
+    gindex = iterators->gindex;
+    for (ipt = 0; ipt < len; ipt++) {
+        guint k = gindex[ipt], i = k/xres, j = k % xres, ws = 0, n = 0;
+        gdouble rs = 0.0;
+        guint *iter_k = iterators->k + iterators->n[ipt];
+        gdouble *iter_w = iterators->w + iterators->n[ipt];
+
+        if (i) {
+            guint kk = k-xres;
+            ws++;
+            if (levels[kk]) {
+                *(iter_k++) = revindex[kk];
+                n++;
+            }
+            else
+                rs += data[kk];
+        }
+        if (j) {
+            guint kk = k-1;
+            ws++;
+            if (levels[kk]) {
+                *(iter_k++) = revindex[kk];
+                n++;
+            }
+            else
+                rs += data[kk];
+        }
+        if (j < xres-1) {
+            guint kk = k+1;
+            ws++;
+            if (levels[kk]) {
+                *(iter_k++) = revindex[kk];
+                n++;
+            }
+            else
+                rs += data[kk];
+        }
+        if (i < yres-1) {
+            guint kk = k+xres;
+            ws++;
+            if (levels[kk]) {
+                *(iter_k++) = revindex[kk];
+                n++;
+            }
+            else
+                rs += data[kk];
+        }
+
+        iterators->z[ipt] = data[k];
+        iterators->rhs[ipt] = rs/ws;
+        iterators->n[ipt+1] = iterators->n[ipt] + n;
+        while (n--)
+            *(iter_w++) = 1.0/ws;
+    }
+}
+
+static void
+calculate_f(LaplaceIterators *iterators)
+{
+    const guint *n = iterators->n, *k = iterators->k;
+    const gdouble *z = iterators->z, *iz = iterators->z,
+                  *w = iterators->w, *rhs = iterators->rhs;
+    gdouble *f = iterators->f;
+    guint l, ipt;
+
+    for (ipt = iterators->len; ipt; ipt--, n++, z++, rhs++, f++) {
+        gdouble lhs = 0.0;
+        for (l = *(n + 1) - *n; l; l--, k++, w++)
+            lhs += iz[*k]*(*w);
+        *f = (*z - lhs) - *rhs;
+    }
+}
+
+static void
+iterate_simple(LaplaceIterators *iterators)
+{
+    const gdouble *f = iterators->f;
+    gdouble *z = iterators->z;
+    guint ipt;
+
+    for (ipt = iterators->len; ipt; ipt--, z++, f++)
+        *z -= 0.8*(*f);
+}
+
+static void
+matrix_multiply(LaplaceIterators *iterators, const gdouble *v, gdouble *r)
+{
+    const guint *n = iterators->n, *k = iterators->k;
+    const gdouble *w = iterators->w, *iv = v;
+    guint l, ipt;
+
+    for (ipt = iterators->len; ipt; ipt--, n++, v++, r++) {
+        gdouble s = 0.0;
+
+        for (l = *(n + 1) - *n; l; l--, k++, w++)
+            s += iv[*k]*(*w);
+
+        *r = *v - s;
+    }
+}
+
+static gboolean
+iterate_conj_grad(LaplaceIterators *iterators)
+{
+    gdouble *z, *v = iterators->v, *t = iterators->t, *f = iterators->f;
+    gdouble S = 0.0, phi = 0.0, phiS;
+    guint ipt;
+
+    // Temporary quantities: t = A.v, S = v.t, φ = v.f
+    matrix_multiply(iterators, iterators->v, iterators->t);
+
+    for (ipt = iterators->len; ipt; ipt--, v++, t++, f++) {
+        S += (*v)*(*t);
+        phi += (*v)*(*f);
+    }
+
+    if (S < 1e-16)
+        return TRUE;
+
+    // New value and f = A.z-b
+    phiS = phi/S;
+    z = iterators->z;
+    v = iterators->v;
+    f = iterators->f;
+    t = iterators->t;
+    for (ipt = iterators->len; ipt; ipt--, z++, v++, f++, t++) {
+        *z -= phiS*(*v);
+        *f -= phiS*(*t);
+    }
+
+    // New v
+    phi = 0.0;
+    f = iterators->f;
+    t = iterators->t;
+    for (ipt = iterators->len; ipt; ipt--, t++, f++)
+        phi += (*t)*(*f);
+
+    phiS = phi/S;
+    v = iterators->v;
+    f = iterators->f;
+    for (ipt = iterators->len; ipt; ipt--, v++, f++)
+        *v = *f - phiS*(*v);
+
+    return FALSE;
+}
+
+static void
+move_result_to_data(const LaplaceIterators *iterators, gdouble *data)
+{
+    guint ipt;
+
+    for (ipt = 0; ipt < iterators->len; ipt++)
+        data[iterators->gindex[ipt]] = iterators->z[ipt];
+}
+
+static void
+interpolate(guint *levels, gdouble *data, guint xres, guint yres, guint step)
+{
+    guint nx = (xres + step-1)/step, ny = (yres + step-1)/step,
+          vstep = xres*step;
+    guint i, j;
+
+    if (nx < 3 || ny < 3)
+        return;
+
+    // Six-point interpolation
+    for (i = 0; i < ny; i++) {
+        if (i % 2 == 0) {
+            // Interpolated point horizontally in between two other points.
+            for (j = 1; j < nx; j += 2) {
+                guint k = (i*xres + j)*step;
+                if (levels[k] != NONE)
+                    continue;
+
+                if (i >= 2 && i < ny-2 && j < nx-1) {
+                    data[k] = (0.375*(data[k-step] + data[k+step])
+                               + 0.0625*(data[k-2*vstep-step]
+                                         + data[k-2*vstep+step]
+                                         + data[k+2*vstep-step]
+                                         + data[k+2*vstep+step]));
+                    levels[k] = (levels[k-step] + levels[k+step])/2;
+                }
+                else if (j < nx-1 && i < ny-2) {
+                    // Upper boundary is aligned.
+                    data[k] = (0.375*(data[k-step] + data[k+step])
+                               + 0.125*(data[k+2*vstep-step]
+                                        + data[k+2*vstep+step]));
+                    levels[k] = (levels[k-step] + levels[k+step])/2;
+                }
+                else if (j < nx-1 && i >= 2) {
+                    // Lower boundary can be unaligned.
+                    guint bdist = yres-1 - i*step;
+                    guint a = 4*bdist + 3*step, b = step, d = 8*(bdist + step);
+                    data[k] = (a*(data[k-step] + data[k+step])
+                               + b*(data[k-2*vstep-step]
+                                    + data[k-2*vstep+step]))/d;
+                    levels[k] = (levels[k-step] + levels[k+step])/2;
+                }
+                else if (i >= 2 && i < ny-2) {
+                    // Right boundary can be unaligned.
+                    guint bdist = xres-1 - j*step;
+                    guint a = 6*step - 4*bdist, b = 2*bdist + step, d = 8*step;
+                    data[k] = (a*data[k-step]
+                               + b*(data[k-2*vstep-step]
+                                    + data[k+2*vstep-step]))/d;
+                    levels[k] = levels[k-step];
+                }
+                else if (i < ny-2) {
+                    // Upper boundary is aligned, right boundary can be
+                    // unaligned.
+                    guint bdist = xres-1 - j*step;
+                    guint a = 3*step - 2*bdist, b = 2*bdist + step, d = 4*step;
+                    data[k] = (a*data[k-step] + b*data[k-step+2*vstep])/d;
+                    levels[k] = levels[k-step];
+                }
+                else if (i >= 2) {
+                    // Lower and right boundaries can be both unaligned.
+                    guint xbdist = xres-1 - j*step;
+                    guint ybdist = yres-1 - i*step;
+                    guint a = 3*step + 4*ybdist - 2*xbdist, b = 2*xbdist + step;
+                    data[k] = (a*data[k-step] + b*data[k-2*vstep])/(a + b);
+                    levels[k] = levels[k-step];
+                }
+                else {
+                    g_assert_not_reached();
+                }
+            }
+        }
+        else {
+            // Interpolated point vertically in between two other points.
+            for (j = 0; j < nx; j += 2) {
+                guint k = (i*xres + j)*step;
+                if (levels[k] != NONE)
+                    continue;
+
+                if (j >= 2 && j < nx-2 && i < ny-1) {
+                    data[k] = (0.375*(data[k-vstep] + data[k+vstep])
+                               + 0.0625*(data[k-vstep-2*step]
+                                         + data[k-vstep+2*step]
+                                         + data[k+vstep-2*step]
+                                         + data[k+vstep+2*step]));
+                    levels[k] = (levels[k-vstep] + levels[k+vstep])/2;
+                }
+                else if (j < nx-2 && i < ny-1) {
+                    // Left boundary is aligned.
+                    data[k] = (0.375*(data[k-vstep] + data[k+vstep])
+                               + 0.125*(data[k-vstep+2*step]
+                                        + data[k+vstep+2*step]));
+                    levels[k] = (levels[k-vstep] + levels[k+vstep])/2;
+                }
+                else if (j >= 2 && i < ny-1) {
+                    // Right boundary can be unaligned.
+                    guint bdist = xres-1 - j*step;
+                    guint a = 4*bdist + 3*step, b = step, d = 8*(bdist + step);
+                    data[k] = (a*(data[k-vstep] + data[k+vstep])
+                               + b*(data[k-vstep-2*step]
+                                    + data[k+vstep-2*step]))/d;
+                    levels[k] = (levels[k-vstep] + levels[k+vstep])/2;
+                }
+                else if (j >= 2 && j < nx-2) {
+                    // Lower boundary can be unaligned.
+                    guint bdist = yres-1 - i*step;
+                    guint a = 6*step - 4*bdist, b = 2*bdist + step, d = 8*step;
+                    data[k] = (a*data[k-vstep]
+                               + b*(data[k-vstep-2*step]
+                                    + data[k-vstep+2*step]))/d;
+                    levels[k] = levels[k-vstep];
+                }
+                else if (j < nx-2) {
+                    // Left boundary is aligned, lower boundary can be
+                    // unaligned.
+                    guint bdist = yres-1 - i*step;
+                    guint a = 3*step - 2*bdist, b = 2*bdist + step, d = 4*step;
+                    data[k] = (a*data[k-vstep] + b*data[k+2*step-vstep])/d;
+                    levels[k] = levels[k-vstep];
+                }
+                else if (j >= 2) {
+                    // Lower and right boundaries can be both unaligned.
+                    guint xbdist = xres-1 - j*step;
+                    guint ybdist = yres-1 - i*step;
+                    guint a = 3*step + 4*xbdist - 2*ybdist, b = 2*ybdist + step;
+                    data[k] = (a*data[k-vstep] + b*data[k-2*step])/(a + b);
+                    levels[k] = levels[k-vstep];
+                }
+                else {
+                    g_assert_not_reached();
+                }
+            }
+        }
+    }
+
+    // Four-point interpolation
+    for (i = 1; i < ny; i += 2) {
+        for (j = 1; j < nx; j += 2) {
+            guint k = (i*xres + j)*step;
+            if (levels[k] != NONE)
+                continue;
+
+            if (i < ny-1 && j < nx-1) {
+                data[k] = 0.25*(data[k-vstep] + data[k+vstep]
+                                + data[k-step] + data[k+step]);
+                levels[k] = (levels[k-vstep] + levels[k+vstep]
+                             + levels[k-step] + levels[k+step])/4;
+            }
+            else if (i < ny-1) {
+                // Right boundary can be unaligned.
+                guint bdist = xres-1 - j*step;
+                guint a = 2*bdist + step, b = 2*step, d = 4*(bdist + step);
+                data[k] = (a*(data[k-vstep] + data[k+vstep])
+                           + b*data[k-step])/d;
+                levels[k] = (levels[k-vstep] + levels[k+vstep])/2;
+            }
+            else if (j < nx-1) {
+                // Lower boundary can be unaligned.
+                guint bdist = yres-1 - i*step;
+                guint a = 2*bdist + step, b = 2*step, d = 4*(bdist + step);
+                data[k] = (a*(data[k-step] + data[k+step])
+                           + b*data[k-vstep])/d;
+                levels[k] = (levels[k-step] + levels[k+step])/2;
+            }
+            else {
+                // Right and lower boundary can be unaligned both.
+                guint xbdist = xres-1 - j*step;
+                guint ybdist = yres-1 - i*step;
+                guint a = 2*ybdist + step, b = 2*xbdist + step;
+                data[k] = (a*data[k-step] + b*data[k-vstep])/(a + b);
+                levels[k] = (levels[k-step] + levels[k-vstep])/2;
+            }
+        }
+    }
+}
+
+static void
+reconstruct(guint *levels, gdouble *data, guint xres, guint yres, guint level)
+{
+    guint step = 1 << ((level - 1)/2);
+
+    while (step) {
+        interpolate(levels, data, xres, yres, step);
+        step /= 2;
+    }
+}
+
+static void
+init_data_simple(gdouble *data, guint *levels, guint xres, guint yres)
+{
+    guint i, j, kk, level = 1;
+    gboolean finished = FALSE;
+
+    for (kk = 0; kk < xres*yres; kk++)
+        levels[kk] = !!levels[kk];
+
+    while (!finished) {
+        finished = TRUE;
+        for (i = 0; i < yres; i++) {
+            for (j = 0; j < xres; j++) {
+                guint k = i*xres + j, n = 0;
+                gdouble s = 0;
+
+                if (levels[k] != level)
+                    continue;
+
+                if (i && levels[k-xres] < level) {
+                    s += data[k-xres];
+                    n++;
+                }
+                if (j && levels[k-1] < level) {
+                    s += data[k-1];
+                    n++;
+                }
+                if (j+1 < xres && levels[k+1] < level) {
+                    s += data[k+1];
+                    n++;
+                }
+                if (i+1 < yres && levels[k+xres] < level) {
+                    s += data[k+xres];
+                    n++;
+                }
+
+                if (n) {
+                    data[k] = s/n;
+                }
+                else {
+                    levels[k] = level+1;
+                    finished = FALSE;
+                }
+            }
+        }
+        level++;
+    }
+}
+
+static void
+laplace_sparse(LaplaceIterators *iterators,
+               guint *revindex,
+               gdouble *data, guint *levels, guint xres, guint yres,
+               guint nconjgrad, guint nsimple)
+{
+    // Revindex is filled later, use is as a temporary xres*yres-sized buffer.
+    guint maxlevel = build_levels(levels, revindex, xres, yres);
+    gboolean finished = FALSE;
+    guint iter;
+
+    if (maxlevel < 3) {
+        // If the grain is nowhere thick just init the interior using boundary
+        // conditions and continue with dense iteration.  Note for single-pixel
+        // grains init_data_simple() already produces the solution.
+        init_data_simple(data, levels, xres, yres);
+        return;
+    }
+
+    build_sparse_iterators(iterators, revindex, levels, data, xres, yres);
+    calculate_f(iterators),
+    gwy_assign(iterators->v, iterators->f, iterators->len);
+    for (iter = 0; iter < nconjgrad; iter++) {
+        if ((finished = iterate_conj_grad(iterators)))
+            break;
+    }
+    if (!finished) {
+        for (iter = 0; iter < nsimple; iter++) {
+            calculate_f(iterators);
+            iterate_simple(iterators);
+        }
+    }
+    move_result_to_data(iterators, data);
+    reconstruct(levels, data, xres, yres, maxlevel);
+}
+
+static void
+laplace_dense(LaplaceIterators *iterators,
+              guint *revindex,
+              gdouble *data, guint *levels, guint xres, guint yres,
+              guint nconjgrad, guint nsimple)
+{
+    gboolean finished = FALSE;
+    guint iter;
+
+    build_dense_iterators(iterators, revindex, levels, data, xres, yres);
+    calculate_f(iterators);
+    gwy_assign(iterators->v, iterators->f, iterators->len);
+    for (iter = 0; iter < nconjgrad; iter++) {
+        if ((finished = iterate_conj_grad(iterators)))
+            break;
+    }
+    if (!finished) {
+        for (iter = 0; iter < nsimple; iter++) {
+            calculate_f(iterators);
+            iterate_simple(iterators);
+        }
+    }
+    move_result_to_data(iterators, data);
+}
+
+// Extract grain data from full-sized @grains and @data to workspace-sized
+// @levels and @z.
+static void
+extract_grain(const gint *grains,
+              const gdouble *data,
+              guint xres,
+              const GwyDataFieldPart *fpart,
+              gint grain_id,
+              guint *levels,
+              gdouble *z)
+{
+    guint i, j;
+    const gint *grow;
+    guint *lrow;
+
+    for (i = 0; i < fpart->height; i++) {
+        gwy_assign(z + i*fpart->width,
+                   data + (i + fpart->row)*xres + fpart->col,
+                   fpart->width);
+        grow = grains + (i + fpart->row)*xres + fpart->col;
+        lrow = levels + i*fpart->width;
+        for (j = fpart->width; j; j--, lrow++, grow++)
+            *lrow = (*grow == grain_id);
+    }
+}
+
+// Put interpolated grain data @z back to @data.
+static void
+insert_grain(const gint *grains,
+             gdouble *data,
+             guint xres,
+             const GwyDataFieldPart *fpart,
+             gint grain_id,
+             const gdouble *z)
+{
+    guint i, j;
+
+    for (i = 0; i < fpart->height; i++) {
+        const gdouble *zrow = z + i*fpart->width;
+        const gint *grow = grains + (i + fpart->row)*xres + fpart->col;
+        gdouble *drow = data + (i + fpart->row)*xres + fpart->col;
+        for (j = fpart->width; j; j--, zrow++, drow++, grow++) {
+            if (*grow == grain_id)
+                *drow = *zrow;
+        }
+    }
+}
+
+static void
+enlarge_field_part(GwyDataFieldPart *fpart, guint xres, guint yres)
+{
+    if (fpart->col) {
+        fpart->col--;
+        fpart->width++;
+    }
+    if (fpart->col + fpart->width < xres)
+        fpart->width++;
+
+    if (fpart->row) {
+        fpart->row--;
+        fpart->height++;
+    }
+    if (fpart->row + fpart->height < yres)
+        fpart->height++;
+}
+
+/*
+ * Find the largest
+ * - grain size in the terms of pixels: this is the number of iterators for
+ *   dense iteration
+ * - grain size in the terms of extended bounding box (i.e. bounding box
+ *   including one more line of pixels to each side, if possible): this is
+ *   the size of levels, revindex and data arrays.
+ */
+static void
+find_largest_sizes(guint xres, guint yres,
+                   const GwyDataFieldPart *bboxes,
+                   const guint *sizes,
+                   guint gfrom, guint gto,
+                   guint *size,
+                   guint *bboxsize)
+{
+    guint gno, bs;
+    GwyDataFieldPart bbox;
+
+    *size = *bboxsize = 0;
+    for (gno = gfrom; gno <= gto; gno++) {
+        if (sizes[gno] > *size)
+            *size = sizes[gno];
+
+        bbox = bboxes[gno];
+        enlarge_field_part(&bbox, xres, yres);
+        bs = bbox.width * bbox.height;
+        if (bs > *bboxsize)
+            *bboxsize = bs;
+    }
+}
+
+/**
+ * gwy_data_field_laplace_solve:
+ * @field: A two-dimensional data field.
+ * @mask: A two-dimensional data field containing mask defining the areas to
+ *        interpolate.
+ * @grain_id: The id number of the grain to replace with the solution of
+ *            Laplace equation, from 1 to @ngrains (see
+ *            gwy_data_field_grain_numbers()).  Passing 0 means to replace the
+ *            entire empty space outside grains while passing a negative value
+ *            means to replace the entire masked area.
+ * @qprec: Speed-accuracy tuning parameter.  Pass 1.0 for the default that is
+ *         fast and sufficiently precise.
+ *
+ * Replaces masked areas by the solution of Laplace equation.
+ *
+ * The boundary conditions on mask boundaries are Dirichlet with values given
+ * by pixels on the outer boundary of the masked area.  Boundary conditions at
+ * field edges are Neumann conditions ∂z/∂n=0 where n denotes the normal to the
+ * edge.  If entire area of @field is to be replaced the problem is
+ * underspecified; @field will be filled with zeroes.
+ *
+ * For the default value of @qprec the the result should be good enough for any
+ * image processing purposes with the typical local error of order 10⁻⁵ for
+ * very large grains and possibly much smaller for small grains.  You can lower
+ * @qprec down to about 0.3 or even 0.2 if speed is crucial and some precision
+ * can be sacrificed.  Below that the result just starts becoming somewhat
+ * worse for not much speed increase.  Conversely, you may wish to increase
+ * @qprec up to 3 or even 5 if accuracy is important and you can afford the
+ * increased computation time.
+ *
+ * Since: 2.47
+ **/
+void
+gwy_data_field_laplace_solve(GwyDataField *field,
+                             GwyDataField *mask,
+                             gint grain_id,
+                             gdouble qprec)
+{
+    GwyDataField *ourmask;
+    guint xres, yres, maxsize, maxbboxsize;
+    gint ngrains, gfrom, gto;
+    GwyDataFieldPart *bboxes;
+    LaplaceIterators *iterators;
+    guint *levels, *revindex;
+    gint *grains;
+    guint *sizes;
+    gdouble *z;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(mask));
+    g_return_if_fail(GWY_IS_DATA_FIELD(field));
+    g_return_if_fail(mask->xres == field->xres);
+    g_return_if_fail(mask->yres == field->yres);
+
+    // To fill the entire empty space we need to divide it to grains too so
+    // work with the inverted mask.
+    if (grain_id == 0) {
+        ourmask = gwy_data_field_duplicate(mask);
+        gwy_data_field_grains_invert(ourmask);
+        grain_id = -1;
+    }
+    else
+        ourmask = g_object_ref((gpointer)mask);
+
+    xres = field->xres;
+    yres = field->yres;
+    grains = g_new0(gint, xres*yres);
+    ngrains = gwy_data_field_number_grains(ourmask, grains);
+    if (grain_id > ngrains) {
+        g_free(grains);
+        g_return_if_fail(grain_id <= ngrains);
+    }
+
+    bboxes = (GwyDataFieldPart*)gwy_data_field_get_grain_bounding_boxes(ourmask,
+                                                                        ngrains,
+                                                                        grains,
+                                                                        NULL);
+    sizes = (guint*)gwy_data_field_get_grain_sizes(ourmask, ngrains, grains,
+                                                   NULL);
+
+    // The underspecified case.
+    if (ngrains == 1 && sizes[1] == xres*yres) {
+        gwy_data_field_clear(field);
+        g_object_unref(ourmask);
+        g_free(sizes);
+        g_free(bboxes);
+        g_free(grains);
+        return;
+    }
+
+    gfrom = (grain_id < 0) ? 1 : grain_id;
+    gto = (grain_id < 0) ? ngrains : grain_id;
+
+    // Allocate everything at the maximum size to avoid reallocations.
+    find_largest_sizes(xres, yres, bboxes, sizes, gfrom, gto,
+                       &maxsize, &maxbboxsize);
+
+    levels = g_new(guint, maxbboxsize);
+    revindex = g_new(guint, maxbboxsize);
+    z = g_new(gdouble, maxbboxsize);
+    iterators = laplace_iterators_new(maxsize, 5);
+
+    for (grain_id = gfrom; grain_id <= gto; grain_id++) {
+        GwyDataFieldPart bbox = bboxes[grain_id];
+        enlarge_field_part(&bbox, xres, yres);
+        extract_grain(grains, field->data, xres, &bbox, grain_id, levels, z);
+        laplace_sparse(iterators, revindex, z, levels,
+                       bbox.width, bbox.height, 60*qprec, 20*qprec);
+        if (sizes[grain_id] > 1)
+            laplace_dense(iterators, revindex, z, levels,
+                          bbox.width, bbox.height, 60*qprec, 30*qprec);
+        insert_grain(grains, field->data, xres, &bbox, grain_id, z);
+    }
+
+    laplace_iterators_free(iterators);
+    g_free(z);
+    g_free(levels);
+    g_free(revindex);
+    g_free(sizes);
+    g_free(bboxes);
+    g_free(grains);
+
+    g_object_unref(ourmask);
+    gwy_data_field_invalidate(field);
+}
+
+static void
+interpolate_segment(GwyDataLine *data_line, gint from, gint to)
+{
+    gint i, res = data_line->res;
+    gdouble *d = data_line->data;
+    gdouble zl, zr;
+
+    g_assert(to < res-1 || from > 0);
+
+    if (from == 0) {
+        zr = d[to+1];
+        for (i = from; i <= to; i++)
+            d[i] = zr;
+    }
+    else if (to == res-1) {
+        zl = d[from-1];
+        for (i = from; i <= to; i++)
+            d[i] = zl;
+    }
+    else {
+        zl = d[from-1]/(to - from + 2);
+        zr = d[to+1]/(to - from + 2);
+        for (i = from; i <= to; i++)
+            d[i] = zr*(i+1 - from) + zl*(to+1 - i);
+    }
+}
+
+/**
+ * gwy_data_line_correct_laplace:
+ * @data_line: A data line.
+ * @mask_line: Mask of places to be corrected.
+ *
+ * Fills missing values in a data line using Laplace data correction.
+ *
+ * Both data lines must have the same number of values.
+ *
+ * For one-dimensional data the missing data interpolation is explicit.
+ * Interior missing segments are filled with linear dependence between the edge
+ * points.  Missing segments with one end open are filled with the edge value.
+ *
+ * Returns: %TRUE if the line contained any data at all.  If there are no data
+ *          the %FALSE is returned and @data_line is filled with zeros.
+ *
+ * Since: 2.45
+ **/
+gboolean
+gwy_data_line_correct_laplace(GwyDataLine *data_line,
+                              GwyDataLine *mask_line)
+{
+    gint start = -1, i, res;
+    const gdouble *m;
+
+    g_return_val_if_fail(GWY_IS_DATA_LINE(data_line), FALSE);
+    g_return_val_if_fail(GWY_IS_DATA_LINE(mask_line), FALSE);
+    g_return_val_if_fail(data_line->res == mask_line->res, FALSE);
+
+    res = data_line->res;
+    m = mask_line->data;
+    for (i = 0; i < res; i++) {
+        if (start == -1) {
+            if (m[i] > 0.0)
+                start = i;
+        }
+        else {
+            if (!(m[i] > 0.0)) {
+                interpolate_segment(data_line, start, i-1);
+                start = -1;
+            }
+        }
+    }
+
+    if (start == 0) {
+        gwy_data_line_clear(data_line);
+        return FALSE;
+    }
+
+    if (start != -1)
+        interpolate_segment(data_line, start, res-1);
+
+    return TRUE;
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/libprocess/correct.c b/libprocess/correct.c
index 0a14192..8e5957a 100644
--- a/libprocess/correct.c
+++ b/libprocess/correct.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: correct.c 19145 2016-10-31 16:19:12Z yeti-dn $
- *  Copyright (C) 2004-2016 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: correct.c 20178 2017-08-07 09:17:20Z yeti-dn $
+ *  Copyright (C) 2004-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -20,1525 +20,44 @@
  */
 
 #include "config.h"
+#include <stdlib.h>
 #include <string.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
 #include <libprocess/datafield.h>
+#include <libprocess/elliptic.h>
 #include <libprocess/linestats.h>
 #include <libprocess/stats.h>
 #include <libprocess/grains.h>
+#include <libprocess/filters.h>
 #include <libprocess/correct.h>
 #include <libprocess/interpolation.h>
 
-enum { NONE = G_MAXUINT };
-
-typedef enum {
-    UP,
-    RIGHT,
-    DOWN,
-    LEFT,
-    NDIRECTIONS
-} LaplaceDirection;
-
-typedef struct {
-    guint col;
-    guint row;
-    guint width;
-    guint height;
-} GwyDataFieldPart;
-
-/*
- * @len: The number of blocks.  (The allocated size is usually a bit larger.)
- * @n: Start of each neighbour in @k and @w, size @len+1.
- * @k: Indices of neighbours for laplacian calculation, allocated size is a
- *     multiple of @len but blocks are variable-size, given by @n.  These
- *     indices refer to these arrays, not the original grid.
- * @w: Coefficient blocks (for calculation of the second derivative from
- *     neigbours), allocated size is a
- *     multiple of @len but blocks are variable-size, given by @n.
- * @z: Values of the points, size @len.
- * @rhs: Right-hand-sides of the points, size @len.
- * @f: The difference between the second derivative and the value, size @len.
- * @v: Conjugate-gradients auxiliary vector, size @len.
- * @t: Conjugate-gradients auxiliary vector, size @len.
- * @gindex: Where the point is placed in the original data, size @len.
- */
-/* FIXME: Most of the coefficient sets in @w are repeated many times.  We could
- * consilidate them, replacing 3-5 doubles (typically) per iterator with one
- * integer.
- */
-typedef struct {
-    gsize len;
-    gsize int_size;
-    gsize float_size;
-    guint *n;
-    guint *k;
-    gdouble *w;
-    gdouble *z;
-    gdouble *rhs;
-    gdouble *f;
-    gdouble *v;
-    gdouble *t;
-    guint *gindex;
-} LaplaceIterators;
-
-typedef struct {
-    gboolean is_virtual : 1;
-    gboolean is_boundary : 1;
-    gboolean is_rhs : 1;
-
-    guint bdist;     // Distance of the boundary line where ∂z/∂x = 0
-    guint step;
-    guint neighbour;
-    guint neighbour2;
-
-    gdouble rhs;     // Remember the exterior data used for rhs
-    gdouble weight;  // Coefficient before (z_neighbour - z_0)
-    gdouble weight2; // Coefficient before (z_neighbour2 - z_0)
-} LaplaceNeighbour;
-
-static void    gwy_data_field_distort_internal(GwyDataField *source,
-                                               GwyDataField *dest,
-                                               GwyInterpolationType interp,
-                                               GwyExteriorType exterior,
-                                               gdouble fill_value,
-                                               const GwyXY *coords,
-                                               GwyCoordTransform2DFunc invtrans,
-                                               gpointer user_data);
-static gdouble unrotate_refine_correction     (GwyDataLine *derdist,
-                                               guint m,
-                                               gdouble phi);
-static void    compute_fourier_coeffs         (gint nder,
-                                               const gdouble *der,
-                                               guint symmetry,
-                                               gdouble *st,
-                                               gdouble *ct);
-static void    interpolate_segment            (GwyDataLine *data_line,
-                                               gint from,
-                                               gint to);
-
-/**
- * gwy_data_field_correct_laplace_iteration:
- * @data_field: Data field to be corrected.
- * @mask_field: Mask of places to be corrected.
- * @buffer_field: Initialized to same size as mask and data.
- * @error: Maximum change within last step.
- * @corrfactor: Correction factor within step.
- *
- * Performs one interation of Laplace data correction.
- *
- * Tries to remove all the points in mask off the data by using
- * iterative method similar to solving heat flux equation.
- *
- * Use this function repeatedly until reasonable @error is reached.
- *
- * <warning>For almost all purposes this function was superseded by
- * non-iteratie gwy_data_field_laplace_solve() which is simultaneously much
- * faster and more accurate.</warning>
- **/
-void
-gwy_data_field_correct_laplace_iteration(GwyDataField *data_field,
-                                         GwyDataField *mask_field,
-                                         GwyDataField *buffer_field,
-                                         gdouble corrfactor,
-                                         gdouble *error)
-{
-    gint xres, yres, i, j;
-    const gdouble *mask, *data;
-    gdouble *buffer;
-    gdouble cor, cf, err;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(GWY_IS_DATA_FIELD(mask_field));
-    g_return_if_fail(GWY_IS_DATA_FIELD(buffer_field));
-    g_return_if_fail(data_field->xres == mask_field->xres
-                     && data_field->yres == mask_field->yres);
-
-    xres = data_field->xres;
-    yres = data_field->yres;
-
-    /* check buffer field */
-    if (buffer_field->xres != xres || buffer_field->yres != yres)
-        gwy_data_field_resample(buffer_field, xres, yres,
-                                GWY_INTERPOLATION_NONE);
-
-    gwy_data_field_copy(data_field, buffer_field, FALSE);
-
-    data = data_field->data;
-    buffer = buffer_field->data;
-    mask = mask_field->data;
-
-    /* set boundary condition for masked boundary data */
-    if (yres >= 2) {
-        for (i = 0; i < xres; i++) {
-            if (mask[i] > 0)
-                buffer[i] = buffer[i + xres];
-            if (mask[i + xres*(yres - 1)] > 0)
-                buffer[i + xres*(yres - 1)] = buffer[i + xres*(yres - 2)];
-        }
-    }
-    if (xres >= 2) {
-        for (i = 0; i < yres; i++) {
-            if (mask[xres*i] > 0)
-                buffer[xres*i] = buffer[1 + xres*i];
-            if (mask[xres - 1 + xres*i] > 0)
-                buffer[xres - 1 + xres*i] = buffer[xres-2 + xres*i];
-        }
-    }
-
-    /* iterate */
-    err = 0.0;
-    cf = corrfactor;
-    for (i = 1; i < yres - 1; i++) {
-        for (j = 1; j < xres - 1; j++) {
-            if (mask[i*xres + j] > 0) {
-                cor = cf*((data[(i - 1)*xres + j] + data[(i + 1)*xres + j]
-                           - 2*data[i*xres + j])
-                          + (data[i*xres + j - 1] + data[i*xres + j + 1]
-                             - 2*data[i*xres + j]));
-
-                buffer[i*xres + j] += cor;
-                cor = fabs(cor);
-                if (cor > err)
-                    err = cor;
-            }
-        }
-    }
-
-    gwy_data_field_copy(buffer_field, data_field, FALSE);
-    gwy_data_field_invalidate(data_field);
-
-    if (error)
-        *error = err;
-}
-
-/***************************************************************************
- *
- * Efficient Laplace interpolation.
- *
- ***************************************************************************/
-
-static gboolean
-promote(const guint *levels, guint *buffer,
-        guint xres, guint yres,
-        guint level, guint step)
-{
-    guint nx = (xres + step-1)/step, ny = (yres + step-1)/step;
-    guint vstep = xres*step;
-    gboolean ok = FALSE;
-    guint i, j;
-
-    if (nx < 3 || ny < 3)
-        return ok;
-
-    for (i = 0; i < ny; i++) {
-        for (j = 0; j < nx; j++) {
-            guint k = (i*xres + j)*step;
-
-            if (levels[k] == level
-                && (!i || levels[k-vstep] == level)
-                && (!j || levels[k-step] == level)
-                && (j == nx-1 || levels[k+step] == level)
-                && (i == ny-1 || levels[k+vstep] == level)) {
-                buffer[k] = level+1;
-                ok = TRUE;
-            }
-        }
-    }
-
-    return ok;
-}
-
-static void
-demote(const guint *levels, guint *buffer,
-       guint xres, guint yres,
-       guint level, guint step)
-{
-    guint nx = (xres + step-1)/step, ny = (yres + step-1)/step;
-    guint vstep = xres*step;
-    guint i, j;
-
-    if (nx < 3 || ny < 3)
-        return;
-
-    for (i = 1; i < ny-1; i++) {
-        for (j = 1; j < nx-1; j++) {
-            guint k = (i*xres + j)*step;
-
-            if (levels[k] == level
-                && (levels[k-vstep-step] == level-1
-                    || levels[k-vstep] == level-1
-                    || levels[k-vstep+step] == level-1
-                    || levels[k-step] == level-1
-                    || levels[k+step] == level-1
-                    || levels[k+vstep-step] == level-1
-                    || levels[k+vstep] == level-1
-                    || levels[k+vstep+step] == level-1)) {
-                if (buffer[k-vstep-step] > level)
-                    buffer[k-vstep-step] = level;
-                if (buffer[k-vstep] > level)
-                    buffer[k-vstep] = level;
-                if (buffer[k-vstep+step] > level)
-                    buffer[k-vstep+step] = level;
-                if (buffer[k-step] > level)
-                    buffer[k-step] = level;
-                if (buffer[k+step] > level)
-                    buffer[k+step] = level;
-                if (buffer[k+vstep-step] > level)
-                    buffer[k+vstep-step] = level;
-                if (buffer[k+vstep] > level)
-                    buffer[k+vstep] = level;
-                if (buffer[k+vstep+step] > level)
-                    buffer[k+vstep+step] = level;
-            }
-        }
-    }
-}
-
-static gboolean
-reduce(const guint *levels, guint *buffer,
-       guint xres, guint yres,
-       guint level, guint step)
-{
-    guint nx = (xres + step-1)/step, ny = (yres + step-1)/step;
-    guint halfstep = step/2;
-    guint vstep = xres*step, vhalfstep = xres*halfstep;
-    gboolean ok = FALSE;
-    gboolean right = (nx - 1)*step + halfstep < xres;
-    gboolean down = (ny - 1)*step + halfstep < yres;
-    guint i, j;
-
-    g_return_val_if_fail(step % 2 == 0, FALSE);
-
-    if (nx < 3 || ny < 3)
-        return ok;
-
-    for (i = 0; i < ny; i++) {
-        for (j = 0; j < nx; j++) {
-            guint k = (i*xres + j)*step;
-
-            if (levels[k] == level
-                && (!i || !j || levels[k-vstep-step] >= level)
-                && (!i || levels[k-vstep] == level)
-                && (!i || j == nx-1 || levels[k-vstep+step] >= level)
-                && (!j || levels[k-step] == level)
-                && (j == nx-1 || levels[k+step] == level)
-                && (i == ny-1 || !j || levels[k+vstep-step] >= level)
-                && (i == ny-1 || levels[k+vstep] == level)
-                && (i == ny-1 || j == nx-1 || levels[k+vstep+step] >= level)) {
-                buffer[k] = level+1;
-                if (i && j)
-                    buffer[k-vhalfstep-halfstep] = NONE;
-                if (i)
-                    buffer[k-vhalfstep] = NONE;
-                if (i && (right || j < nx-1))
-                    buffer[k-vhalfstep+halfstep] = NONE;
-                if (j)
-                    buffer[k-halfstep] = NONE;
-                if (right || j < nx-1)
-                    buffer[k+halfstep] = NONE;
-                if ((down || i < ny-1) && j)
-                    buffer[k+vhalfstep-halfstep] = NONE;
-                if (down || i < ny-1)
-                    buffer[k+vhalfstep] = NONE;
-                if ((down || i < ny-1) && (right || j < nx-1))
-                    buffer[k+vhalfstep+halfstep] = NONE;
-                ok = TRUE;
-            }
-        }
-    }
-
-    return ok;
-}
-
-static void
-remove_spikes(guint *levels,
-              guint xres, guint yres,
-              guint level, guint step)
-{
-    guint nx = (xres + step-1)/step, ny = (yres + step-1)/step;
-    guint i, j;
-
-    if (nx < 3 || ny < 3)
-        return;
-
-    for (i = 1; i < ny-1; i++) {
-        for (j = 1; j < nx-1; j++) {
-            guint k = (i*xres + j)*step;
-
-            if (levels[k] == level) {
-                guint su = (levels[k-xres*step] == NONE),
-                      sd = (levels[k+xres*step] == NONE),
-                      sl = (levels[k-step] == NONE),
-                      sr = (levels[k+step] == NONE);
-
-                if ((su & sd & ~sl & ~sr) || (~su & ~sd & sl & sr))
-                    levels[k] = NONE;
-            }
-        }
-    }
-}
-
-static guint
-build_levels(guint *levels, guint *buffer,
-             guint xres, guint yres)
-{
-    guint step = 1, level = 0;
-
-    gwy_assign(buffer, levels, xres*yres);
-    while (TRUE) {
-        // Promote odd levels to one-greater even levels if they do not touch
-        // lower-values levels.
-        level++;
-        if (!promote(levels, buffer, xres, yres, level, step))
-            break;
-
-        // Ensure a dense representation near the boundary.
-        if (level == 1) {
-            gwy_assign(levels, buffer, xres*yres);
-            demote(levels, buffer, xres, yres, level, step);
-        }
-
-        gwy_assign(levels, buffer, xres*yres);
-        // Clear the space around even levels and promote them to one-greater
-        // odd levels if the do not touch lower levels.
-        level++;
-        step *= 2;
-        if (!reduce(levels, buffer, xres, yres, level, step))
-            break;
-
-        // Remove even levels that would have to be interpolated from two
-        // opposide sides (they appear when both sides of it are promoted but
-        // not the point itself).
-        if (level > 1)
-            remove_spikes(buffer, xres, yres, level, step/2);
-
-        gwy_assign(levels, buffer, xres*yres);
-    }
-
-    return level;
-}
-
-static guint
-count_grid_points(const guint *levels,
-                  guint xres, guint yres)
-{
-    guint k, npoints = 0;
-
-    for (k = 0; k < xres*yres; k++) {
-        if (levels[k] && levels[k] != NONE)
-            npoints++;
-    }
-
-    return npoints;
-}
-
-static void
-build_grid_index(const guint *levels,
-                 guint xres, guint yres,
-                 guint *gindex,
-                 guint *revindex)
-{
-    guint k, n = 0;
-
-    for (k = 0; k < xres*yres; k++) {
-        if (levels[k] && levels[k] != NONE) {
-            revindex[k] = n;
-            gindex[n++] = k;
-        }
-        else
-            revindex[k] = NONE;
-    }
-}
-
-static void
-laplace_iterators_setup(LaplaceIterators *iterators,
-                        guint maxneighbours)
-{
-    gsize len = iterators->len;
-
-    iterators->k = iterators->n + (len + 2);
-    iterators->gindex = iterators->k + maxneighbours*len;
-
-    iterators->rhs = iterators->z + len;
-    iterators->f = iterators->rhs + len;
-    iterators->v = iterators->f + len;
-    iterators->t = iterators->v + len;
-    iterators->w = iterators->t + len;
-}
-
-static void
-laplace_iterators_resize(LaplaceIterators *iterators,
-                         guint len,
-                         guint maxneighbours)
-{
-    gsize int_size = (maxneighbours + 2)*len + 2;
-    gsize float_size = (maxneighbours + 5)*len;
-
-    iterators->len = len;
-
-    if (int_size > iterators->int_size) {
-        if (G_UNLIKELY(iterators->int_size))
-            g_warning("Laplace iterators need to be enlarged (int).");
-        GWY_FREE(iterators->n);
-        iterators->n = g_new0(guint, int_size);
-        iterators->int_size = int_size;
-    }
-    else
-        gwy_clear(iterators->n, int_size);
-
-    if (float_size > iterators->float_size) {
-        if (G_UNLIKELY(iterators->float_size))
-            g_warning("Laplace iterators need to be enlarged (float).");
-        GWY_FREE(iterators->z);
-        iterators->z = g_new0(gdouble, float_size);
-        iterators->float_size = float_size;
-    }
-    else
-        gwy_clear(iterators->z, float_size);
-
-    laplace_iterators_setup(iterators, maxneighbours);
-}
-
-static LaplaceIterators*
-laplace_iterators_new(guint len, guint maxneighbours)
-{
-    LaplaceIterators *iterators = g_slice_new0(LaplaceIterators);
-    laplace_iterators_resize(iterators, len, maxneighbours);
-    return iterators;
-}
-
-static void
-laplace_iterators_free(LaplaceIterators *iterators)
-{
-    g_free(iterators->z);
-    g_free(iterators->n);
-    g_slice_free(LaplaceIterators, iterators);
-}
-
-static void
-analyse_neighbour_direction(const guint *levels,
-                            const gdouble *data,
-                            gint xres, gint yres,
-                            gint xstep, gint ystep,
-                            gint j, gint i,
-                            const guint *revindex,
-                            LaplaceNeighbour *nd)
-{
-    gint ineigh, jneigh, step;
-    gint xorthostep, yorthostep;
-    guint kk;
-
-    gwy_clear(nd, 1);
-    step = MAX(ABS(xstep), ABS(ystep));
-    ineigh = i + ystep;
-    jneigh = j + xstep;
-
-    // 1 Primary neighbour.
-    // 1.a Neumann boundary.
-    // The upper and left boundaries are always aligned.
-    if (ineigh < 0) {
-        g_assert(i == 0);
-        nd->is_boundary = TRUE;
-        nd->step = step;
-        return;
-    }
-    if (jneigh < 0) {
-        g_assert(j == 0);
-        nd->is_boundary = TRUE;
-        nd->step = step;
-        return;
-    }
-    // The other boundaries can be unaligned.
-    if (ineigh >= yres) {
-        nd->is_boundary = TRUE;
-        nd->bdist = yres-1 - i;
-        nd->step = step;
-        return;
-    }
-    if (jneigh >= xres) {
-        nd->is_boundary = TRUE;
-        nd->bdist = xres-1 - j;
-        nd->step = step;
-        return;
-    }
-
-    kk = ineigh*xres + jneigh;
-
-    // 1.b Dirichlet boundary.
-    if (!levels[kk]) {
-        g_assert(step == 1);
-        nd->is_rhs = TRUE;
-        nd->step = step;
-        nd->rhs = data[kk];
-        return;
-    }
-
-    // 1.c Interior.
-    if (levels[kk] != NONE) {
-        nd->neighbour = revindex[kk];
-        nd->step = step;
-        return;
-    }
-
-    // 2 Secondary neighbour.
-    ineigh = i + 2*ystep;
-    jneigh = j + 2*xstep;
-
-    // 2.a Neumann boundary.
-    // The upper and left boundaries are always aligned.
-    if (ineigh < 0) {
-        g_assert(i == 0);
-        nd->is_boundary = TRUE;
-        nd->step = 2*step;
-        return;
-    }
-    if (jneigh < 0) {
-        g_assert(j == 0);
-        nd->is_boundary = TRUE;
-        nd->step = 2*step;
-        return;
-    }
-    // The other boundaries can be unaligned.
-    if (ineigh >= yres) {
-        nd->is_boundary = TRUE;
-        nd->bdist = yres-1 - i;
-        nd->step = 2*step;
-        return;
-    }
-    if (jneigh >= xres) {
-        nd->is_boundary = TRUE;
-        nd->bdist = xres-1 - j;
-        nd->step = 2*step;
-        return;
-    }
-
-    kk = ineigh*xres + jneigh;
-    g_assert(levels[kk]);    // Dirichlet boundary is always at step one.
-
-    // 2.b Interior.
-    if (levels[kk] != NONE) {
-        nd->neighbour = revindex[kk];
-        nd->step = 2*step;
-        return;
-    }
-
-    // 3 Virtual neighbour.
-    xorthostep = xstep ? 0 : ABS(ystep);
-    yorthostep = ystep ? 0 : ABS(xstep);
-    ineigh = i + 2*ystep - yorthostep;
-    jneigh = j + 2*xstep - xorthostep;
-    // The upper and left boundaries are always aligned.
-    g_assert(ineigh >= 0);
-    g_assert(jneigh >= 0);
-    kk = ineigh*xres + jneigh;
-
-    nd->is_virtual = TRUE;
-    nd->neighbour = revindex[kk];
-    nd->step = 2*step;  // The long distance; the short is always half of that.
-
-    ineigh = i + 2*ystep + yorthostep;
-    jneigh = j + 2*xstep + xorthostep;
-    g_assert(ineigh < yres || jneigh < xres);
-    if (ineigh < yres && jneigh < xres) {
-        kk = ineigh*xres + jneigh;
-        nd->neighbour2 = revindex[kk];
-        g_assert(nd->neighbour2 != NONE);
-    }
-    else {
-        nd->is_boundary = TRUE;
-        if (ineigh >= yres)
-            nd->bdist = yres-1 - i;
-        else
-            nd->bdist = xres-1 - j;
-    }
-}
-
-static void
-calculate_weights(LaplaceNeighbour *nd)
-{
-    LaplaceDirection virtual_dir = NDIRECTIONS;
-    guint i, ii, ileft, iright, j, boundary_dir;
-    gboolean virtual_is_boundary;
-
-    // At most one virtual direction.
-    for (j = 0; j < NDIRECTIONS; j++) {
-        if (nd[j].is_virtual) {
-            g_assert(virtual_dir == NDIRECTIONS);
-            virtual_dir = j;
-        }
-    }
-
-    // No virtual, no mixing of z_xx and z_yy.
-    if (virtual_dir == NDIRECTIONS) {
-        for (j = 0; j < NDIRECTIONS; j++) {
-            guint jj = (j + 2) % NDIRECTIONS;
-            gdouble s, xs;
-
-            if (nd[j].is_boundary)
-                continue;
-
-            s = nd[j].step;
-            xs = nd[jj].is_boundary ? 2*nd[jj].bdist : nd[jj].step;
-            nd[j].weight = 2.0/(s + xs)/s;
-        }
-        return;
-    }
-
-    // Virtual.
-    i = virtual_dir;
-    iright = (i + 1) % NDIRECTIONS;
-    ii = (i + 2) % NDIRECTIONS;
-    ileft = (i + 3) % NDIRECTIONS;
-    boundary_dir = NDIRECTIONS;
-    virtual_is_boundary = nd[i].is_boundary;
-
-    // At most one boundary direction, except the boundary direction itself.
-    for (j = 0; j < NDIRECTIONS; j++) {
-        if (j != virtual_dir && nd[j].is_boundary) {
-            g_assert(boundary_dir == NDIRECTIONS);
-            boundary_dir = j;
-        }
-    }
-    g_assert(!virtual_is_boundary || (boundary_dir == iright
-                                      || boundary_dir == ileft));
-    if (boundary_dir == NDIRECTIONS) {
-        gdouble s = nd[i].step, ss = nd[ii].step;
-        gdouble sleft = nd[ileft].step, sright = nd[iright].step;
-        gdouble w = 1.0 - 0.25*s/(s + ss);
-        nd[i].weight = nd[i].weight2 = 1.0/(s + ss)/s;
-        nd[ii].weight = 2.0/(s + ss)/ss;
-        nd[ileft].weight = 2.0*w/(sleft + sright)/sleft;
-        nd[iright].weight = 2.0*w/(sleft + sright)/sright;
-    }
-    else if (boundary_dir == ii) {
-        gdouble s = nd[i].step;
-        gdouble sleft = nd[ileft].step, sright = nd[iright].step;
-        gdouble b = nd[boundary_dir].bdist;
-        gdouble w = 1.0 - 0.25*s/(s + 2*b);
-        nd[i].weight = nd[i].weight2 = 1.0/(s + 2*b)/s;
-        nd[ileft].weight = 2.0*w/(sleft + sright)/sleft;
-        nd[iright].weight = 2.0*w/(sleft + sright)/sright;
-    }
-    else {
-        guint irem = (boundary_dir + 2) % NDIRECTIONS;
-        gdouble s = nd[i].step, ss = nd[ii].step;
-        gdouble srem = nd[irem].step;
-        gdouble b = nd[boundary_dir].bdist;
-        gdouble w = 1.0 - 0.25*(s + 4*b)/(s + ss);
-        nd[i].weight = 2.0/(s + ss)/s;
-        nd[ii].weight = 2.0/(s + ss)/ss;
-        nd[irem].weight = 2.0*w/(srem + 2*b)/srem;
-    }
-}
-
-static void
-build_iterator(LaplaceNeighbour *nd,
-               LaplaceIterators *iterators,
-               guint ipt,
-               gdouble *nrhs,
-               gdouble *rhssum)
-{
-    guint i, start, npt = 0;
-    gdouble ws = 0.0, rs = 0.0;
-    gboolean sorted = FALSE;
-    guint *iter_k;
-    gdouble *iter_w;
-
-    // Figure out how many neighbours we have and sum the weights.
-    for (i = 0; i < NDIRECTIONS; i++) {
-        if (nd[i].weight) {
-            ws += nd[i].weight;
-            if (nd[i].is_rhs) {
-                g_assert(!nd[i].is_virtual);
-                g_assert(!nd[i].is_boundary);
-                rs += nd[i].rhs;
-                *nrhs += nd[i].weight;
-            }
-            else
-                npt++;
-
-            if (nd[i].weight2) {
-                g_assert(nd[i].is_virtual);
-                ws += nd[i].weight2;
-                npt++;
-            }
-        }
-    }
-    g_assert(npt > 0 && npt <= 5);
-
-    start = iterators->n[ipt];
-    iterators->n[ipt+1] = start + npt;
-    if (rs) {
-        *rhssum += rs;
-        iterators->rhs[ipt] = rs/ws;
-    }
-
-    // Create the iterators.
-    iter_w = iterators->w + start;
-    iter_k = iterators->k + start;
-    for (i = 0; i < NDIRECTIONS; i++) {
-        if (!nd[i].is_rhs && nd[i].weight) {
-            *(iter_w++) = nd[i].weight/ws;
-            *(iter_k++) = nd[i].neighbour;
-            if (nd[i].weight2) {
-                *(iter_w++) = nd[i].weight2/ws;
-                *(iter_k++) = nd[i].neighbour2;
-            }
-        }
-    }
-
-    // Sort the segments by k.
-    iter_w = iterators->w + start;
-    iter_k = iterators->k + start;
-    do {
-        sorted = TRUE;
-        for (i = 1; i < npt; i++) {
-            if (iter_k[i-1] > iter_k[i]) {
-                GWY_SWAP(guint, iter_k[i-1], iter_k[i]);
-                GWY_SWAP(gdouble, iter_w[i-1], iter_w[i]);
-                sorted = FALSE;
-            }
-        }
-    } while (!sorted);
-}
-
-static void
-build_sparse_iterators(LaplaceIterators *iterators,
-                       guint *revindex,
-                       const guint *levels,
-                       const gdouble *data,
-                       guint xres, guint yres)
-{
-    LaplaceNeighbour nd[NDIRECTIONS];
-    guint len = count_grid_points(levels, xres, yres);
-    gdouble rhssum = 0.0, nrhs = 0.0;
-    const guint *gindex;
-    guint ipt;
-
-    laplace_iterators_resize(iterators, len, 5);
-    build_grid_index(levels, xres, yres, iterators->gindex, revindex);
-
-    gindex = iterators->gindex;
-
-    for (ipt = 0; ipt < len; ipt++) {
-        guint k = gindex[ipt], i = k/xres, j = k % xres;
-        gint step = 1 << ((levels[k] - 1)/2);
-
-        analyse_neighbour_direction(levels, data, xres, yres,
-                                    0, -step, j, i, revindex, nd + UP);
-        analyse_neighbour_direction(levels, data, xres, yres,
-                                    step, 0, j, i, revindex, nd + RIGHT);
-        analyse_neighbour_direction(levels, data, xres, yres,
-                                    0, step, j, i, revindex, nd + DOWN);
-        analyse_neighbour_direction(levels, data, xres, yres,
-                                    -step, 0, j, i, revindex, nd + LEFT);
-
-        calculate_weights(nd);
-        build_iterator(nd, iterators, ipt, &nrhs, &rhssum);
-    }
-
-    // Initialise with the mean value of right hand sides, including
-    // multiplicity.
-    rhssum /= nrhs;
-    for (ipt = 0; ipt < len; ipt++)
-        iterators->z[ipt] = rhssum;
-}
-
-static void
-build_dense_iterators(LaplaceIterators *iterators,
-                      guint *revindex,
-                      const guint *levels,
-                      const gdouble *data,
-                      guint xres, guint yres)
-{
-    guint len = count_grid_points(levels, xres, yres);
-    const guint *gindex;
-    guint ipt;
-
-    laplace_iterators_resize(iterators, len, 4);
-    build_grid_index(levels, xres, yres, iterators->gindex, revindex);
-
-    gindex = iterators->gindex;
-    for (ipt = 0; ipt < len; ipt++) {
-        guint k = gindex[ipt], i = k/xres, j = k % xres, ws = 0, n = 0;
-        gdouble rs = 0.0;
-        guint *iter_k = iterators->k + iterators->n[ipt];
-        gdouble *iter_w = iterators->w + iterators->n[ipt];
-
-        if (i) {
-            guint kk = k-xres;
-            ws++;
-            if (levels[kk]) {
-                *(iter_k++) = revindex[kk];
-                n++;
-            }
-            else
-                rs += data[kk];
-        }
-        if (j) {
-            guint kk = k-1;
-            ws++;
-            if (levels[kk]) {
-                *(iter_k++) = revindex[kk];
-                n++;
-            }
-            else
-                rs += data[kk];
-        }
-        if (j < xres-1) {
-            guint kk = k+1;
-            ws++;
-            if (levels[kk]) {
-                *(iter_k++) = revindex[kk];
-                n++;
-            }
-            else
-                rs += data[kk];
-        }
-        if (i < yres-1) {
-            guint kk = k+xres;
-            ws++;
-            if (levels[kk]) {
-                *(iter_k++) = revindex[kk];
-                n++;
-            }
-            else
-                rs += data[kk];
-        }
-
-        iterators->z[ipt] = data[k];
-        iterators->rhs[ipt] = rs/ws;
-        iterators->n[ipt+1] = iterators->n[ipt] + n;
-        while (n--)
-            *(iter_w++) = 1.0/ws;
-    }
-}
-
-static void
-calculate_f(LaplaceIterators *iterators)
-{
-    const guint *n = iterators->n, *k = iterators->k;
-    const gdouble *z = iterators->z, *iz = iterators->z,
-                  *w = iterators->w, *rhs = iterators->rhs;
-    gdouble *f = iterators->f;
-    guint l, ipt;
-
-    for (ipt = iterators->len; ipt; ipt--, n++, z++, rhs++, f++) {
-        gdouble lhs = 0.0;
-        for (l = *(n + 1) - *n; l; l--, k++, w++)
-            lhs += iz[*k]*(*w);
-        *f = (*z - lhs) - *rhs;
-    }
-}
-
-static void
-iterate_simple(LaplaceIterators *iterators)
-{
-    const gdouble *f = iterators->f;
-    gdouble *z = iterators->z;
-    guint ipt;
-
-    for (ipt = iterators->len; ipt; ipt--, z++, f++)
-        *z -= 0.8*(*f);
-}
-
-static void
-matrix_multiply(LaplaceIterators *iterators, const gdouble *v, gdouble *r)
-{
-    const guint *n = iterators->n, *k = iterators->k;
-    const gdouble *w = iterators->w, *iv = v;
-    guint l, ipt;
-
-    for (ipt = iterators->len; ipt; ipt--, n++, v++, r++) {
-        gdouble s = 0.0;
-
-        for (l = *(n + 1) - *n; l; l--, k++, w++)
-            s += iv[*k]*(*w);
-
-        *r = *v - s;
-    }
-}
-
-static gboolean
-iterate_conj_grad(LaplaceIterators *iterators)
-{
-    gdouble *z, *v = iterators->v, *t = iterators->t, *f = iterators->f;
-    gdouble S = 0.0, phi = 0.0, phiS;
-    guint ipt;
-
-    // Temporary quantities: t = A.v, S = v.t, φ = v.f
-    matrix_multiply(iterators, iterators->v, iterators->t);
-
-    for (ipt = iterators->len; ipt; ipt--, v++, t++, f++) {
-        S += (*v)*(*t);
-        phi += (*v)*(*f);
-    }
-
-    if (S < 1e-16)
-        return TRUE;
-
-    // New value and f = A.z-b
-    phiS = phi/S;
-    z = iterators->z;
-    v = iterators->v;
-    f = iterators->f;
-    t = iterators->t;
-    for (ipt = iterators->len; ipt; ipt--, z++, v++, f++, t++) {
-        *z -= phiS*(*v);
-        *f -= phiS*(*t);
-    }
-
-    // New v
-    phi = 0.0;
-    f = iterators->f;
-    t = iterators->t;
-    for (ipt = iterators->len; ipt; ipt--, t++, f++)
-        phi += (*t)*(*f);
-
-    phiS = phi/S;
-    v = iterators->v;
-    f = iterators->f;
-    for (ipt = iterators->len; ipt; ipt--, v++, f++)
-        *v = *f - phiS*(*v);
-
-    return FALSE;
-}
-
-static void
-move_result_to_data(const LaplaceIterators *iterators, gdouble *data)
-{
-    guint ipt;
-
-    for (ipt = 0; ipt < iterators->len; ipt++)
-        data[iterators->gindex[ipt]] = iterators->z[ipt];
-}
-
-static void
-interpolate(guint *levels, gdouble *data, guint xres, guint yres, guint step)
-{
-    guint nx = (xres + step-1)/step, ny = (yres + step-1)/step,
-          vstep = xres*step;
-    guint i, j;
-
-    if (nx < 3 || ny < 3)
-        return;
-
-    // Six-point interpolation
-    for (i = 0; i < ny; i++) {
-        if (i % 2 == 0) {
-            // Interpolated point horizontally in between two other points.
-            for (j = 1; j < nx; j += 2) {
-                guint k = (i*xres + j)*step;
-                if (levels[k] != NONE)
-                    continue;
-
-                if (i >= 2 && i < ny-2 && j < nx-1) {
-                    data[k] = (0.375*(data[k-step] + data[k+step])
-                               + 0.0625*(data[k-2*vstep-step]
-                                         + data[k-2*vstep+step]
-                                         + data[k+2*vstep-step]
-                                         + data[k+2*vstep+step]));
-                    levels[k] = (levels[k-step] + levels[k+step])/2;
-                }
-                else if (j < nx-1 && i < ny-2) {
-                    // Upper boundary is aligned.
-                    data[k] = (0.375*(data[k-step] + data[k+step])
-                               + 0.125*(data[k+2*vstep-step]
-                                        + data[k+2*vstep+step]));
-                    levels[k] = (levels[k-step] + levels[k+step])/2;
-                }
-                else if (j < nx-1 && i >= 2) {
-                    // Lower boundary can be unaligned.
-                    guint bdist = yres-1 - i*step;
-                    guint a = 4*bdist + 3*step, b = step, d = 8*(bdist + step);
-                    data[k] = (a*(data[k-step] + data[k+step])
-                               + b*(data[k-2*vstep-step]
-                                    + data[k-2*vstep+step]))/d;
-                    levels[k] = (levels[k-step] + levels[k+step])/2;
-                }
-                else if (i >= 2 && i < ny-2) {
-                    // Right boundary can be unaligned.
-                    guint bdist = xres-1 - j*step;
-                    guint a = 6*step - 4*bdist, b = 2*bdist + step, d = 8*step;
-                    data[k] = (a*data[k-step]
-                               + b*(data[k-2*vstep-step]
-                                    + data[k+2*vstep-step]))/d;
-                    levels[k] = levels[k-step];
-                }
-                else if (i < ny-2) {
-                    // Upper boundary is aligned, right boundary can be
-                    // unaligned.
-                    guint bdist = xres-1 - j*step;
-                    guint a = 3*step - 2*bdist, b = 2*bdist + step, d = 4*step;
-                    data[k] = (a*data[k-step] + b*data[k-step+2*vstep])/d;
-                    levels[k] = levels[k-step];
-                }
-                else if (i >= 2) {
-                    // Lower and right boundaries can be both unaligned.
-                    guint xbdist = xres-1 - j*step;
-                    guint ybdist = yres-1 - i*step;
-                    guint a = 3*step + 4*ybdist - 2*xbdist, b = 2*xbdist + step;
-                    data[k] = (a*data[k-step] + b*data[k-2*vstep])/(a + b);
-                    levels[k] = levels[k-step];
-                }
-                else {
-                    g_assert_not_reached();
-                }
-            }
-        }
-        else {
-            // Interpolated point vertically in between two other points.
-            for (j = 0; j < nx; j += 2) {
-                guint k = (i*xres + j)*step;
-                if (levels[k] != NONE)
-                    continue;
-
-                if (j >= 2 && j < nx-2 && i < ny-1) {
-                    data[k] = (0.375*(data[k-vstep] + data[k+vstep])
-                               + 0.0625*(data[k-vstep-2*step]
-                                         + data[k-vstep+2*step]
-                                         + data[k+vstep-2*step]
-                                         + data[k+vstep+2*step]));
-                    levels[k] = (levels[k-vstep] + levels[k+vstep])/2;
-                }
-                else if (j < nx-2 && i < ny-1) {
-                    // Left boundary is aligned.
-                    data[k] = (0.375*(data[k-vstep] + data[k+vstep])
-                               + 0.125*(data[k-vstep+2*step]
-                                        + data[k+vstep+2*step]));
-                    levels[k] = (levels[k-vstep] + levels[k+vstep])/2;
-                }
-                else if (j >= 2 && i < ny-1) {
-                    // Right boundary can be unaligned.
-                    guint bdist = xres-1 - j*step;
-                    guint a = 4*bdist + 3*step, b = step, d = 8*(bdist + step);
-                    data[k] = (a*(data[k-vstep] + data[k+vstep])
-                               + b*(data[k-vstep-2*step]
-                                    + data[k+vstep-2*step]))/d;
-                    levels[k] = (levels[k-vstep] + levels[k+vstep])/2;
-                }
-                else if (j >= 2 && j < nx-2) {
-                    // Lower boundary can be unaligned.
-                    guint bdist = yres-1 - i*step;
-                    guint a = 6*step - 4*bdist, b = 2*bdist + step, d = 8*step;
-                    data[k] = (a*data[k-vstep]
-                               + b*(data[k-vstep-2*step]
-                                    + data[k-vstep+2*step]))/d;
-                    levels[k] = levels[k-vstep];
-                }
-                else if (j < nx-2) {
-                    // Left boundary is aligned, lower boundary can be
-                    // unaligned.
-                    guint bdist = yres-1 - i*step;
-                    guint a = 3*step - 2*bdist, b = 2*bdist + step, d = 4*step;
-                    data[k] = (a*data[k-vstep] + b*data[k+2*step-vstep])/d;
-                    levels[k] = levels[k-vstep];
-                }
-                else if (j >= 2) {
-                    // Lower and right boundaries can be both unaligned.
-                    guint xbdist = xres-1 - j*step;
-                    guint ybdist = yres-1 - i*step;
-                    guint a = 3*step + 4*xbdist - 2*ybdist, b = 2*ybdist + step;
-                    data[k] = (a*data[k-vstep] + b*data[k-2*step])/(a + b);
-                    levels[k] = levels[k-vstep];
-                }
-                else {
-                    g_assert_not_reached();
-                }
-            }
-        }
-    }
-
-    // Four-point interpolation
-    for (i = 1; i < ny; i += 2) {
-        for (j = 1; j < nx; j += 2) {
-            guint k = (i*xres + j)*step;
-            if (levels[k] != NONE)
-                continue;
-
-            if (i < ny-1 && j < nx-1) {
-                data[k] = 0.25*(data[k-vstep] + data[k+vstep]
-                                + data[k-step] + data[k+step]);
-                levels[k] = (levels[k-vstep] + levels[k+vstep]
-                             + levels[k-step] + levels[k+step])/4;
-            }
-            else if (i < ny-1) {
-                // Right boundary can be unaligned.
-                guint bdist = xres-1 - j*step;
-                guint a = 2*bdist + step, b = 2*step, d = 4*(bdist + step);
-                data[k] = (a*(data[k-vstep] + data[k+vstep])
-                           + b*data[k-step])/d;
-                levels[k] = (levels[k-vstep] + levels[k+vstep])/2;
-            }
-            else if (j < nx-1) {
-                // Lower boundary can be unaligned.
-                guint bdist = yres-1 - i*step;
-                guint a = 2*bdist + step, b = 2*step, d = 4*(bdist + step);
-                data[k] = (a*(data[k-step] + data[k+step])
-                           + b*data[k-vstep])/d;
-                levels[k] = (levels[k-step] + levels[k+step])/2;
-            }
-            else {
-                // Right and lower boundary can be unaligned both.
-                guint xbdist = xres-1 - j*step;
-                guint ybdist = yres-1 - i*step;
-                guint a = 2*ybdist + step, b = 2*xbdist + step;
-                data[k] = (a*data[k-step] + b*data[k-vstep])/(a + b);
-                levels[k] = (levels[k-step] + levels[k-vstep])/2;
-            }
-        }
-    }
-}
-
-static void
-reconstruct(guint *levels, gdouble *data, guint xres, guint yres, guint level)
-{
-    guint step = 1 << ((level - 1)/2);
-
-    while (step) {
-        interpolate(levels, data, xres, yres, step);
-        step /= 2;
-    }
-}
-
-static void
-init_data_simple(gdouble *data, guint *levels, guint xres, guint yres)
-{
-    guint i, j, kk, level = 1;
-    gboolean finished = FALSE;
-
-    for (kk = 0; kk < xres*yres; kk++)
-        levels[kk] = !!levels[kk];
-
-    while (!finished) {
-        finished = TRUE;
-        for (i = 0; i < yres; i++) {
-            for (j = 0; j < xres; j++) {
-                guint k = i*xres + j, n = 0;
-                gdouble s = 0;
-
-                if (levels[k] != level)
-                    continue;
-
-                if (i && levels[k-xres] < level) {
-                    s += data[k-xres];
-                    n++;
-                }
-                if (j && levels[k-1] < level) {
-                    s += data[k-1];
-                    n++;
-                }
-                if (j+1 < xres && levels[k+1] < level) {
-                    s += data[k+1];
-                    n++;
-                }
-                if (i+1 < yres && levels[k+xres] < level) {
-                    s += data[k+xres];
-                    n++;
-                }
-
-                if (n) {
-                    data[k] = s/n;
-                }
-                else {
-                    levels[k] = level+1;
-                    finished = FALSE;
-                }
-            }
-        }
-        level++;
-    }
-}
-
-static void
-laplace_sparse(LaplaceIterators *iterators,
-               guint *revindex,
-               gdouble *data, guint *levels, guint xres, guint yres,
-               guint nconjgrad, guint nsimple)
-{
-    // Revindex is filled later, use is as a temporary xres*yres-sized buffer.
-    guint maxlevel = build_levels(levels, revindex, xres, yres);
-    gboolean finished = FALSE;
-    guint iter;
-
-    if (maxlevel < 3) {
-        // If the grain is nowhere thick just init the interior using boundary
-        // conditions and continue with dense iteration.  Note for single-pixel
-        // grains init_data_simple() already produces the solution.
-        init_data_simple(data, levels, xres, yres);
-        return;
-    }
-
-    build_sparse_iterators(iterators, revindex, levels, data, xres, yres);
-    calculate_f(iterators),
-    gwy_assign(iterators->v, iterators->f, iterators->len);
-    for (iter = 0; iter < nconjgrad; iter++) {
-        if ((finished = iterate_conj_grad(iterators)))
-            break;
-    }
-    if (!finished) {
-        for (iter = 0; iter < nsimple; iter++) {
-            calculate_f(iterators);
-            iterate_simple(iterators);
-        }
-    }
-    move_result_to_data(iterators, data);
-    reconstruct(levels, data, xres, yres, maxlevel);
-}
-
-static void
-laplace_dense(LaplaceIterators *iterators,
-              guint *revindex,
-              gdouble *data, guint *levels, guint xres, guint yres,
-              guint nconjgrad, guint nsimple)
-{
-    gboolean finished = FALSE;
-    guint iter;
-
-    build_dense_iterators(iterators, revindex, levels, data, xres, yres);
-    calculate_f(iterators);
-    gwy_assign(iterators->v, iterators->f, iterators->len);
-    for (iter = 0; iter < nconjgrad; iter++) {
-        if ((finished = iterate_conj_grad(iterators)))
-            break;
-    }
-    if (!finished) {
-        for (iter = 0; iter < nsimple; iter++) {
-            calculate_f(iterators);
-            iterate_simple(iterators);
-        }
-    }
-    move_result_to_data(iterators, data);
-}
-
-// Extract grain data from full-sized @grains and @data to workspace-sized
-// @levels and @z.
-static void
-extract_grain(const gint *grains,
-              const gdouble *data,
-              guint xres,
-              const GwyDataFieldPart *fpart,
-              gint grain_id,
-              guint *levels,
-              gdouble *z)
-{
-    guint i, j;
-    const gint *grow;
-    guint *lrow;
-
-    for (i = 0; i < fpart->height; i++) {
-        gwy_assign(z + i*fpart->width,
-                   data + (i + fpart->row)*xres + fpart->col,
-                   fpart->width);
-        grow = grains + (i + fpart->row)*xres + fpart->col;
-        lrow = levels + i*fpart->width;
-        for (j = fpart->width; j; j--, lrow++, grow++)
-            *lrow = (*grow == grain_id);
-    }
-}
-
-// Put interpolated grain data @z back to @data.
-static void
-insert_grain(const gint *grains,
-             gdouble *data,
-             guint xres,
-             const GwyDataFieldPart *fpart,
-             gint grain_id,
-             const gdouble *z)
-{
-    guint i, j;
-
-    for (i = 0; i < fpart->height; i++) {
-        const gdouble *zrow = z + i*fpart->width;
-        const gint *grow = grains + (i + fpart->row)*xres + fpart->col;
-        gdouble *drow = data + (i + fpart->row)*xres + fpart->col;
-        for (j = fpart->width; j; j--, zrow++, drow++, grow++) {
-            if (*grow == grain_id)
-                *drow = *zrow;
-        }
-    }
-}
-
-static void
-enlarge_field_part(GwyDataFieldPart *fpart, guint xres, guint yres)
-{
-    if (fpart->col) {
-        fpart->col--;
-        fpart->width++;
-    }
-    if (fpart->col + fpart->width < xres)
-        fpart->width++;
-
-    if (fpart->row) {
-        fpart->row--;
-        fpart->height++;
-    }
-    if (fpart->row + fpart->height < yres)
-        fpart->height++;
-}
-
-/*
- * Find the largest
- * - grain size in the terms of pixels: this is the number of iterators for
- *   dense iteration
- * - grain size in the terms of extended bounding box (i.e. bounding box
- *   including one more line of pixels to each side, if possible): this is
- *   the size of levels, revindex and data arrays.
- */
-static void
-find_largest_sizes(guint xres, guint yres,
-                   const GwyDataFieldPart *bboxes,
-                   const guint *sizes,
-                   guint gfrom, guint gto,
-                   guint *size,
-                   guint *bboxsize)
-{
-    guint gno, bs;
-    GwyDataFieldPart bbox;
-
-    *size = *bboxsize = 0;
-    for (gno = gfrom; gno <= gto; gno++) {
-        if (sizes[gno] > *size)
-            *size = sizes[gno];
-
-        bbox = bboxes[gno];
-        enlarge_field_part(&bbox, xres, yres);
-        bs = bbox.width * bbox.height;
-        if (bs > *bboxsize)
-            *bboxsize = bs;
-    }
-}
-
-/**
- * gwy_data_field_laplace_solve:
- * @field: A two-dimensional data field.
- * @mask: A two-dimensional data field containing mask defining the areas to
- *        interpolate.
- * @grain_id: The id number of the grain to replace with the solution of
- *            Laplace equation, from 1 to @ngrains (see
- *            gwy_data_field_grain_numbers()).  Passing 0 means to replace the
- *            entire empty space outside grains while passing a negative value
- *            means to replace the entire masked area.
- * @qprec: Speed-accuracy tuning parameter.  Pass 1.0 for the default that is
- *         fast and sufficiently precise.
- *
- * Replaces masked areas by the solution of Laplace equation.
- *
- * The boundary conditions on mask boundaries are Dirichlet with values given
- * by pixels on the outer boundary of the masked area.  Boundary conditions at
- * field edges are Neumann conditions ∂z/∂n=0 where n denotes the normal to the
- * edge.  If entire area of @field is to be replaced the problem is
- * underspecified; @field will be filled with zeroes.
- *
- * For the default value of @qprec the the result should be good enough for any
- * image processing purposes with the typical local error of order 10⁻⁵ for
- * very large grains and possibly much smaller for small grains.  You can lower
- * @qprec down to about 0.3 or even 0.2 if speed is crucial and some precision
- * can be sacrificed.  Below that the result just starts becoming somewhat
- * worse for not much speed increase.  Conversely, you may wish to increase
- * @qprec up to 3 or even 5 if accuracy is important and you can afford the
- * increased computation time.
- *
- * Since: 2.47
- **/
-void
-gwy_data_field_laplace_solve(GwyDataField *field,
-                             GwyDataField *mask,
-                             gint grain_id,
-                             gdouble qprec)
-{
-    GwyDataField *ourmask;
-    guint xres, yres, maxsize, maxbboxsize;
-    gint ngrains, gfrom, gto;
-    GwyDataFieldPart *bboxes;
-    LaplaceIterators *iterators;
-    guint *levels, *revindex;
-    gint *grains;
-    guint *sizes;
-    gdouble *z;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(mask));
-    g_return_if_fail(GWY_IS_DATA_FIELD(field));
-    g_return_if_fail(mask->xres == field->xres);
-    g_return_if_fail(mask->yres == field->yres);
-
-    // To fill the entire empty space we need to divide it to grains too so
-    // work with the inverted mask.
-    if (grain_id == 0) {
-        ourmask = gwy_data_field_duplicate(mask);
-        gwy_data_field_grains_invert(ourmask);
-        grain_id = -1;
-    }
-    else
-        ourmask = g_object_ref((gpointer)mask);
-
-    xres = field->xres;
-    yres = field->yres;
-    grains = g_new0(gint, xres*yres);
-    ngrains = gwy_data_field_number_grains(ourmask, grains);
-    if (grain_id > ngrains) {
-        g_free(grains);
-        g_return_if_fail(grain_id <= ngrains);
-    }
-
-    bboxes = (GwyDataFieldPart*)gwy_data_field_get_grain_bounding_boxes(ourmask,
-                                                                        ngrains,
-                                                                        grains,
-                                                                        NULL);
-    sizes = (guint*)gwy_data_field_get_grain_sizes(ourmask, ngrains, grains,
-                                                   NULL);
-
-    // The underspecified case.
-    if (ngrains == 1 && sizes[1] == xres*yres) {
-        gwy_data_field_clear(field);
-        g_object_unref(ourmask);
-        g_free(sizes);
-        g_free(bboxes);
-        g_free(grains);
-        return;
-    }
-
-    gfrom = (grain_id < 0) ? 1 : grain_id;
-    gto = (grain_id < 0) ? ngrains : grain_id;
-
-    // Allocate everything at the maximum size to avoid reallocations.
-    find_largest_sizes(xres, yres, bboxes, sizes, gfrom, gto,
-                       &maxsize, &maxbboxsize);
-
-    levels = g_new(guint, maxbboxsize);
-    revindex = g_new(guint, maxbboxsize);
-    z = g_new(gdouble, maxbboxsize);
-    iterators = laplace_iterators_new(maxsize, 5);
-
-    for (grain_id = gfrom; grain_id <= gto; grain_id++) {
-        GwyDataFieldPart bbox = bboxes[grain_id];
-        enlarge_field_part(&bbox, xres, yres);
-        extract_grain(grains, field->data, xres, &bbox, grain_id, levels, z);
-        laplace_sparse(iterators, revindex, z, levels,
-                       bbox.width, bbox.height, 60*qprec, 20*qprec);
-        if (sizes[grain_id] > 1)
-            laplace_dense(iterators, revindex, z, levels,
-                          bbox.width, bbox.height, 60*qprec, 30*qprec);
-        insert_grain(grains, field->data, xres, &bbox, grain_id, z);
-    }
-
-    laplace_iterators_free(iterators);
-    g_free(z);
-    g_free(levels);
-    g_free(revindex);
-    g_free(sizes);
-    g_free(bboxes);
-    g_free(grains);
-
-    g_object_unref(ourmask);
-    gwy_data_field_invalidate(field);
-}
-
-
-
-
+typedef struct {
+    gdouble max;
+    gdouble x;
+    gdouble y;
+    gdouble d;
+    gdouble q;
+    guint basecount;
+} LatticeMaximumInfo;
 
+static void    gwy_data_field_distort_internal(GwyDataField *source,
+                                               GwyDataField *dest,
+                                               GwyInterpolationType interp,
+                                               GwyExteriorType exterior,
+                                               gdouble fill_value,
+                                               const GwyXY *coords,
+                                               GwyCoordTransform2DFunc invtrans,
+                                               gpointer user_data);
+static gdouble unrotate_refine_correction     (GwyDataLine *derdist,
+                                               guint m,
+                                               gdouble phi);
+static void    compute_fourier_coeffs         (gint nder,
+                                               const gdouble *der,
+                                               guint symmetry,
+                                               gdouble *st,
+                                               gdouble *ct);
 
 /**
  * gwy_data_field_mask_outliers:
@@ -1695,7 +214,7 @@ gwy_data_field_unrotate_find_corrections(GwyDataLine *derdist,
     static const guint symm[] = { 2, 3, 4, 6 };
     GwyPlaneSymmetry guess, t;
     gint nder;
-    gsize j, m;
+    guint j, m;
     gdouble avg, max, total, phi;
     const gdouble *der;
     gdouble sint[G_N_ELEMENTS(symm)], cost[G_N_ELEMENTS(symm)];
@@ -2200,86 +719,705 @@ gwy_data_field_affine(GwyDataField *source,
     g_object_unref(coeffield);
 }
 
+static gdouble
+matrix2_det(const gdouble *m)
+{
+    return m[0]*m[3] - m[1]*m[2];
+}
+
+/* Permit dest = src */
+static void
+matrix2_vector2(gdouble *dest, const gdouble *m, const gdouble *src)
+{
+    gdouble xy[2];
+
+    xy[0] = m[0]*src[0] + m[1]*src[1];
+    xy[1] = m[2]*src[0] + m[3]*src[1];
+    dest[0] = xy[0];
+    dest[1] = xy[1];
+}
+
+/* Permit dest = src */
+static void
+matrix2_matrix2(gdouble *dest, const gdouble *m, const gdouble *src)
+{
+    gdouble xy[4];
+
+    xy[0] = m[0]*src[0] + m[1]*src[2];
+    xy[1] = m[0]*src[1] + m[1]*src[3];
+    xy[2] = m[2]*src[0] + m[3]*src[2];
+    xy[3] = m[2]*src[1] + m[3]*src[3];
+    dest[0] = xy[0];
+    dest[1] = xy[1];
+    dest[2] = xy[2];
+    dest[3] = xy[3];
+}
+
+/* Permit dest = src */
+static void
+invert_matrix2(gdouble *dest, const gdouble *src)
+{
+    gdouble D = matrix2_det(src);
+    gdouble xy[4];
+
+    gwy_debug("D %g", D);
+    xy[0] = src[3]/D;
+    xy[1] = -src[1]/D;
+    xy[2] = -src[2]/D;
+    xy[3] = src[0]/D;
+    dest[0] = xy[0];
+    dest[1] = xy[1];
+    dest[2] = xy[2];
+    dest[3] = xy[3];
+}
+
+static void
+corner_max(gdouble x, gdouble y, const gdouble *m, gdouble *vmax)
+{
+    gdouble v[2];
+
+    v[0] = x;
+    v[1] = y;
+    matrix2_vector2(v, m, v);
+    vmax[0] = MAX(vmax[0], fabs(v[0]));
+    vmax[1] = MAX(vmax[1], fabs(v[1]));
+}
+
+static void
+solve_transform_real(const gdouble *a1a2, const gdouble *a1a2_corr, gdouble *m)
+{
+    gdouble tmp[4];
+    tmp[0] = a1a2[0];
+    tmp[1] = a1a2[2];
+    tmp[2] = a1a2[1];
+    tmp[3] = a1a2[3];
+    invert_matrix2(m, tmp);
+    tmp[0] = a1a2_corr[0];
+    tmp[1] = a1a2_corr[2];
+    tmp[2] = a1a2_corr[1];
+    tmp[3] = a1a2_corr[3];
+    matrix2_matrix2(m, tmp, m);
+}
+
 /**
- * gwy_data_line_correct_laplace:
- * @data_line: A data line.
- * @mask_line: Mask of places to be corrected.
+ * gwy_data_field_affine_prepare:
+ * @source: Source data field.
+ * @dest: Destination data field.
+ * @a1a2: Lattice vectors (or generally base vectors) in @source, as an array
+ *        of four components: @x1, @y1, @x2 and @y2.
+ * @a1a2_corr: Correct lattice vectors (or generally base vectors) @dest should
+ *             have after the affine transform, in the same form as @a1a2.
+ * @invtrans: Inverse transform as an array of six values to be filled
+ *            according to gwy_data_field_affine() specification.
+ * @scaling: How (or if) to scale the correct lattice vectors.
+ * @prevent_rotation: %TRUE to prevent rotation of the data by rotating
+ *                    @a1a2_corr as a whole to a direction preserving the
+ *                    data orientation.  %FALSE to take @a1a2_corr as given.
+ * @oversampling: Oversampling factor.  Values larger than 1 mean smaller
+ *                pixels (and more of them) in @dest, values smaller than 1
+ *                the opposite.  Pass 1.0 for the default pixel size choice.
  *
- * Fills missing values in a data line using Laplace data correction.
+ * Resolves an affine transformation of a data field in the horizontal plane.
  *
- * Both data lines must have the same number of values.
+ * This function calculates suitable arguments for gwy_data_field_affine()
+ * from given images and lattice vectors (in real coordinates).
  *
- * For one-dimensional data the missing data interpolation is explicit.
- * Interior missing segments are filled with linear dependence between the edge
- * points.  Missing segments with one end open are filled with the edge value.
+ * Data field @dest will be resized and its real dimensions and units set in
+ * anticipation of gwy_data_field_affine().  Its contents will be destroyed.
  *
- * Returns: %TRUE if the line contained any data at all.  If there are no data
- *          the %FALSE is returned and @data_line is filled with zeros.
+ * Note that @a1a2_corr is an input-output parameter.  In general, the vectors
+ * will be modified according to @scaling and @prevent_rotation to the actual
+ * vectors in @dest after the transformation.  Only if @prevent_rotation is
+ * %FALSE and @scaling is %GWY_AFFINE_SCALING_AS_GIVEN the vectors are
+ * preserved.
  *
- * Since: 2.45
+ * Since: 2.49
  **/
-gboolean
-gwy_data_line_correct_laplace(GwyDataLine *data_line,
-                              GwyDataLine *mask_line)
+void
+gwy_data_field_affine_prepare(GwyDataField *source,
+                              GwyDataField *dest,
+                              const gdouble *a1a2,
+                              gdouble *a1a2_corr,
+                              gdouble *invtrans,
+                              GwyAffineScalingType scaling,
+                              gboolean prevent_rotation,
+                              gdouble oversampling)
 {
-    gint start = -1, i, res;
-    const gdouble *m;
-
-    g_return_val_if_fail(GWY_IS_DATA_LINE(data_line), FALSE);
-    g_return_val_if_fail(GWY_IS_DATA_LINE(mask_line), FALSE);
-    g_return_val_if_fail(data_line->res == mask_line->res, FALSE);
-
-    res = data_line->res;
-    m = mask_line->data;
-    for (i = 0; i < res; i++) {
-        if (start == -1) {
-            if (m[i] > 0.0)
-                start = i;
-        }
-        else {
-            if (!(m[i] > 0.0)) {
-                interpolate_segment(data_line, start, i-1);
-                start = -1;
+    gdouble dx, dy, sdx, sdy, alpha, q;
+    gdouble vmax[2], tmp[4];
+    guint xres, yres, i;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(source));
+    g_return_if_fail(GWY_IS_DATA_FIELD(dest));
+    g_return_if_fail(a1a2);
+    g_return_if_fail(a1a2_corr);
+    g_return_if_fail(invtrans);
+
+    if (!(oversampling > 0.0)) {
+        g_warning("Oversampling must be positive.");
+        oversampling = 1.0;
+    }
+    sdx = source->xreal/source->xres;
+    sdy = source->yreal/source->yres;
+
+    gwy_debug("a1a2 %g %g %g %g", a1a2[0], a1a2[1], a1a2[2], a1a2[3]);
+    gwy_debug("a1a2_corr %g %g %g %g",
+              a1a2_corr[0], a1a2_corr[1], a1a2_corr[2], a1a2_corr[3]);
+    /* This is an approximate rotation correction to get the base more or less
+     * oriented in the plane as expected and not upside down. */
+    if (prevent_rotation) {
+        alpha = atan2(-a1a2[1], a1a2[0]);
+        tmp[0] = tmp[3] = cos(alpha);
+        tmp[1] = sin(alpha);
+        tmp[2] = -sin(alpha);
+        matrix2_vector2(a1a2_corr, tmp, a1a2_corr);
+        matrix2_vector2(a1a2_corr + 2, tmp, a1a2_corr + 2);
+    }
+
+    solve_transform_real(a1a2, a1a2_corr, invtrans);
+    gwy_debug("invtrans %g %g %g %g",
+              invtrans[0], invtrans[1], invtrans[2], invtrans[3]);
+
+    /* This is the exact rotation correction. */
+    if (prevent_rotation) {
+        alpha = atan2(invtrans[2], invtrans[0]);
+        gwy_debug("alpha %g", alpha);
+        tmp[0] = tmp[3] = cos(alpha);
+        tmp[1] = sin(alpha);
+        tmp[2] = -sin(alpha);
+        matrix2_matrix2(invtrans, tmp, invtrans);
+    }
+
+    if (scaling == GWY_AFFINE_SCALING_PRESERVE_AREA)
+        q = 1.0/sqrt(fabs(matrix2_det(invtrans)));
+    else if (scaling == GWY_AFFINE_SCALING_PRESERVE_X)
+        q = 1.0/hypot(invtrans[0], invtrans[2]);
+    else
+        q = 1.0;
+
+    for (i = 0; i < 4; i++) {
+        invtrans[i] *= q;
+        /* To create the corrected lattice selection on result. */
+        a1a2_corr[i] *= q;
+    }
+    gwy_debug("invtrans %g %g %g %g",
+              invtrans[0], invtrans[1], invtrans[2], invtrans[3]);
+
+    vmax[0] = vmax[1] = 0.0;
+    corner_max(source->xreal, source->yreal, invtrans, vmax);
+    corner_max(-source->xreal, source->yreal, invtrans, vmax);
+    corner_max(source->xreal, -source->yreal, invtrans, vmax);
+    corner_max(-source->xreal, -source->yreal, invtrans, vmax);
+
+    /* Prevent information loss by using a sufficient resolution to represent
+     * original pixels. */
+    tmp[0] = sdx;
+    tmp[1] = tmp[2] = 0.0;
+    tmp[3] = sdy;
+    gwy_debug("dxdy %g %g", tmp[0], tmp[3]);
+    matrix2_matrix2(tmp, invtrans, tmp);
+    gwy_debug("pix_corr %g %g %g %g", tmp[0], tmp[1], tmp[2], tmp[3]);
+    dx = hypot(tmp[0]/G_SQRT2, tmp[1]/G_SQRT2);
+    dy = hypot(tmp[2]/G_SQRT2, tmp[3]/G_SQRT2);
+    dx = dy = MIN(dx, dy)/oversampling;
+    xres = GWY_ROUND(vmax[0]/dx);
+    yres = GWY_ROUND(vmax[1]/dy);
+    gwy_debug("dxdy_corr %g %g", dx, dy);
+    gwy_debug("res %u %u", xres, yres);
+
+    gwy_data_field_resample(dest, xres, yres, GWY_INTERPOLATION_NONE);
+    dest->xreal = dx*xres;
+    dest->yreal = dy*yres;
+    /* We could preserve the centre but that would be strange for the typical
+     * case when there are no offsets. */
+    dest->xoff = dest->yoff = 0.0;
+    gwy_data_field_copy_units(source, dest);
+
+    /* So far, we used invtrans as a temporary matrix.  Now really fill it with
+     * the inverse transformation. */
+    invert_matrix2(invtrans, invtrans);
+    gwy_debug("minv %g %g %g %g",
+              invtrans[0], invtrans[1], invtrans[2], invtrans[3]);
+
+    /* Multiply from right by pixel-to-real matrix in the corrected field. */
+    tmp[0] = dx;
+    tmp[1] = tmp[2] = 0.0;
+    tmp[3] = dy;
+    matrix2_matrix2(invtrans, invtrans, tmp);
+    /* and from left by real-to-pixel matrix in the original field. */
+    tmp[0] = 1.0/sdx;
+    tmp[1] = tmp[2] = 0.0;
+    tmp[3] = 1.0/sdy;
+    matrix2_matrix2(invtrans, tmp, invtrans);
+    gwy_debug("minvpix %g %g %g %g",
+              invtrans[0], invtrans[1], invtrans[2], invtrans[3]);
+
+    invtrans[4] = 0.5*xres;
+    invtrans[5] = 0.5*yres;
+    matrix2_vector2(invtrans + 4, invtrans, invtrans + 4);
+    invtrans[4] = 0.5*source->xres - invtrans[4];
+    invtrans[5] = 0.5*source->yres - invtrans[5];
+    gwy_debug("b %g %g", invtrans[4], invtrans[5]);
+}
+
+static void
+maybe_swap_axes(gdouble *a1a2)
+{
+    gdouble phi;
+
+    phi = fmod(atan2(a1a2[1], a1a2[0]) + 4.0*G_PI - atan2(a1a2[3], a1a2[2]),
+               2.0*G_PI);
+    if (phi > G_PI) {
+        GWY_SWAP(gdouble, a1a2[0], a1a2[2]);
+        GWY_SWAP(gdouble, a1a2[1], a1a2[3]);
+    }
+}
+
+static gboolean
+transform_vectors_real_freq(gdouble *xy)
+{
+    gdouble D = matrix2_det(xy);
+    gdouble a = fabs(xy[0]*xy[3]) + fabs(xy[1]*xy[2]);
+
+    if (fabs(D)/a < 1e-9)
+        return FALSE;
+
+    invert_matrix2(xy, xy);
+    /* Transpose. */
+    GWY_SWAP(gdouble, xy[1], xy[2]);
+    return TRUE;
+}
+
+static gint
+compare_maxima(gconstpointer pa, gconstpointer pb)
+{
+    const LatticeMaximumInfo *a = (const LatticeMaximumInfo*)pa;
+    const LatticeMaximumInfo *b = (const LatticeMaximumInfo*)pb;
+
+    if (a->basecount*a->q > b->basecount*b->q)
+        return -1;
+    if (a->basecount*a->q < b->basecount*b->q)
+        return 1;
+
+    if (a->q > b->q)
+        return -1;
+    if (a->q < b->q)
+        return 1;
+
+    /* Ensure comparison stability.  This should play no role in significance
+     * sorting. */
+    if (a->y < b->y)
+        return -1;
+    if (a->y > b->y)
+        return 1;
+    if (a->x < b->x)
+        return -1;
+    if (a->x > b->x)
+        return 1;
+    return 0;
+}
+
+/* @dfield is ACF or PSDF here. */
+static gboolean
+guess_lattice(GwyDataField *dfield, gdouble *a1a2, gboolean is_psdf)
+{
+    enum { nquantities = 3 };
+    GwyGrainQuantity quantities[nquantities] = {
+        GWY_GRAIN_VALUE_MAXIMUM,
+        GWY_GRAIN_VALUE_CENTER_X,
+        GWY_GRAIN_VALUE_CENTER_Y,
+    };
+    GwyDataField *smoothed = NULL, *mask;
+    gdouble *values[nquantities];
+    LatticeMaximumInfo *maxima;
+    gint *grains;
+    guint i, j, k, ngrains;
+    gdouble dh, cphi, sphi, phi, l1, l2, d, x, y;
+    gboolean ok = FALSE;
+
+    /* Mark local maxima. */
+    mask = gwy_data_field_new_alike(dfield, FALSE);
+    if (is_psdf) {
+        smoothed = gwy_data_field_duplicate(dfield);
+        gwy_data_field_filter_gaussian(smoothed, 1.2);
+        dfield = smoothed;
+    }
+
+    gwy_data_field_mark_extrema(dfield, mask, TRUE);
+    grains = g_new0(gint, dfield->xres*dfield->yres);
+    ngrains = gwy_data_field_number_grains(mask, grains);
+    GWY_OBJECT_UNREF(mask);
+
+    /* Find the position and value of each. */
+    for (i = 0; i < nquantities; i++)
+        values[i] = g_new(gdouble, ngrains+1);
+
+    gwy_data_field_grains_get_quantities(dfield, values,
+                                         quantities, nquantities,
+                                         ngrains, grains);
+    GWY_OBJECT_UNREF(smoothed);
+
+    maxima = g_new(LatticeMaximumInfo, ngrains);
+    dh = hypot(dfield->xreal/dfield->xres, dfield->yreal/dfield->yres);
+    for (i = 0; i < ngrains; i++) {
+        maxima[i].max = values[0][i+1];
+        maxima[i].x = values[1][i+1];
+        maxima[i].y = values[2][i+1];
+        maxima[i].d = hypot(maxima[i].x, maxima[i].y);
+        maxima[i].q = maxima[i].max/(maxima[i].d + 5.0*dh);
+        maxima[i].basecount = 0;
+    }
+    for (i = 0; i < nquantities; i++)
+        g_free(values[i]);
+
+    /* Remove the central peak, i.e. anything too close to the centre */
+    i = j = 0;
+    while (i < ngrains) {
+        d = maxima[i].d;
+        maxima[j] = maxima[i];
+        if (d >= 1.8*dh)
+            j++;
+        i++;
+    }
+    ngrains = j;
+
+    if ((is_psdf && ngrains < 4) || (!is_psdf && ngrains < 14)) {
+        gwy_debug("Too few maxima (after centre removal): %d.", ngrains);
+        g_free(maxima);
+        return FALSE;
+    }
+
+    qsort(maxima, ngrains, sizeof(LatticeMaximumInfo), compare_maxima);
+#ifdef DEBUG
+    for (i = 0; i < ngrains; i++) {
+        gwy_debug("[%u] (%g, %g) %g :: %g",
+                  i, maxima[i].x, maxima[i].y, maxima[i].max, maxima[i].q);
+    }
+#endif
+
+    /* Remove anything with direction opposite to the first vector.  But we
+     * must carefully accept ortohogonal vectors.  This is just a half-plane
+     * selection though it influences the preferred vectors, of course. */
+    gwy_debug("Base-plane selector [%u] (%g, %g) %g",
+              0, maxima[0].x, maxima[0].y, maxima[0].max);
+    cphi = maxima[0].x/maxima[0].d;
+    sphi = maxima[0].y/maxima[0].d;
+    i = j = 1;
+    while (i < ngrains) {
+        x = cphi*maxima[i].x + sphi*maxima[i].y;
+        y = cphi*maxima[i].y - sphi*maxima[i].x;
+        maxima[j] = maxima[i];
+        if (x > 1e-9*dh || (x > -1e-9*dh && y > 1e-9*dh))
+            j++;
+        i++;
+    }
+    ngrains = j;
+
+    if ((is_psdf && ngrains < 2) || (!is_psdf && ngrains < 7)) {
+        gwy_debug("Too few maxima (after half-plane removal): %d.", ngrains);
+        g_free(maxima);
+        return FALSE;
+    }
+
+    /* Locate the most important maxima. */
+    ngrains = MIN(ngrains, 12);
+    for (i = 0; i < ngrains; i++) {
+        for (j = i+1; j < ngrains; j++) {
+            x = maxima[i].x + maxima[j].x;
+            y = maxima[i].y + maxima[j].y;
+            for (k = 0; k < ngrains; k++) {
+                if (fabs(maxima[k].x - x) < dh && fabs(maxima[k].y - y) < dh) {
+                    maxima[i].basecount++;
+                    maxima[j].basecount++;
+                }
             }
         }
     }
+    qsort(maxima, ngrains, sizeof(LatticeMaximumInfo), compare_maxima);
+#ifdef DEBUG
+    for (i = 0; i < ngrains; i++) {
+        gwy_debug("[%u] (%g, %g) %g #%u",
+                  i, maxima[i].x, maxima[i].y, maxima[i].max,
+                  maxima[i].basecount);
+    }
+#endif
 
-    if (start == 0) {
-        gwy_data_line_clear(data_line);
+    if (!is_psdf && maxima[1].basecount < 3) {
+        g_free(maxima);
         return FALSE;
     }
 
-    if (start != -1)
-        interpolate_segment(data_line, start, res-1);
+    a1a2[0] = maxima[0].x;
+    a1a2[1] = maxima[0].y;
+    dh = maxima[0].d;
+    /* Exclude maxima that appear to be collinear with the first one,
+     * otherwise take the next one with the highest basecount. */
+    for (i = 1; i < ngrains; i++) {
+        for (k = 2; k < 5; k++) {
+            if (fabs(maxima[i].x/k - a1a2[0]) < 0.2*dh
+                && fabs(maxima[i].y/k - a1a2[1]) < 0.2*dh) {
+                gwy_debug("Excluding #%u for collinearity (%u).", i, k);
+                break;
+            }
+        }
+        if (k == 5) {
+            a1a2[2] = maxima[i].x;
+            a1a2[3] = maxima[i].y;
+            ok = TRUE;
+            break;
+        }
+    }
+
+    g_free(maxima);
+    if (!ok)
+        return FALSE;
+
+    /* Try to choose some sensible vectors among the equivalent choices. It
+     * does not guarantee the choice a human would make but at least make
+     * a reasonable one... */
+    for (i = 0; i < 4; i++)
+        a1a2[i] = -a1a2[i];
+    if (is_psdf)
+        transform_vectors_real_freq(a1a2);
+    maybe_swap_axes(a1a2);
+    l1 = hypot(a1a2[0], a1a2[1]);
+    l2 = hypot(a1a2[2], a1a2[3]);
+    phi = acos((a1a2[0]*a1a2[2] + a1a2[1]*a1a2[3])/(l1*l2));
+    if (phi > 0.5*G_PI) {
+        if (a1a2[0]*a1a2[3] - a1a2[1]*a1a2[2] > 0.0) {
+            a1a2[2] = -a1a2[2];
+            a1a2[3] = -a1a2[3];
+        }
+        else {
+            a1a2[0] = -a1a2[0];
+            a1a2[1] = -a1a2[1];
+        }
+    }
+    maybe_swap_axes(a1a2);
 
     return TRUE;
 }
 
-static void
-interpolate_segment(GwyDataLine *data_line, gint from, gint to)
+static gdouble
+refine_from_multiple(GwyDataField *dfield, gdouble *a1a2,
+                     gint range, gint limit, gint xwinsize, gint ywinsize)
+{
+    gint i, j, n, nex;
+    gdouble sii, sij, sjj, six, sjx, siy, sjy, xytmp[2];
+    gdouble w, D, dx, dy, xoff, yoff;
+
+    xoff = dfield->xoff;
+    yoff = dfield->yoff;
+    dx = dfield->xreal/dfield->xres;
+    dy = dfield->yreal/dfield->yres;
+    n = nex = 0;
+    sii = sij = sjj = six = sjx = siy = sjy = 0.0;
+    for (i = -range; i <= range; i++) {
+        for (j = -range; j <= range; j++) {
+            w = i*i + j*j;
+            if (w > limit || w == 0)
+                continue;
+
+            nex++;
+            xytmp[0] = i*a1a2[0] + j*a1a2[2];
+            xytmp[1] = i*a1a2[1] + j*a1a2[3];
+
+            xytmp[0] = (xytmp[0] - xoff)/dx;
+            xytmp[1] = (xytmp[1] - yoff)/dy;
+
+            if (!gwy_data_field_local_maximum(dfield,
+                                              xytmp + 0, xytmp + 1,
+                                              xwinsize, ywinsize))
+                continue;
+
+            xytmp[0] = (xytmp[0] + 0.5)*dx + xoff;
+            xytmp[1] = (xytmp[1] + 0.5)*dy + yoff;
+
+            w = 1.0/w;
+            sii += i*i*w;
+            sij += i*j*w;
+            sjj += j*j*w;
+            six += i*xytmp[0]*w;
+            sjx += j*xytmp[0]*w;
+            siy += i*xytmp[1]*w;
+            sjy += j*xytmp[1]*w;
+            n++;
+        }
+    }
+
+    if (!n)
+        return 0.0;
+
+    D = sii*sjj - sij*sij;
+    a1a2[0] = (six*sjj - sjx*sij)/D;
+    a1a2[2] = (sjx*sii - six*sij)/D;
+    a1a2[1] = (siy*sjj - sjy*sij)/D;
+    a1a2[3] = (sjy*sii - siy*sij)/D;
+
+    return (gdouble)n/nex;
+}
+
+static gboolean
+refine_lattice(GwyDataField *dfield, gdouble *a1a2, gboolean is_psdf)
 {
-    gint i, res = data_line->res;
-    gdouble *d = data_line->data;
-    gdouble zl, zr;
+    gint xwinsize, ywinsize;
+    gdouble r, dx, dy;
+
+    dx = dfield->xreal/dfield->xres;
+    dy = dfield->yreal/dfield->yres;
+    xwinsize = (gint)(0.32*MAX(fabs(a1a2[0]), fabs(a1a2[2]))/dx + 0.5);
+    ywinsize = (gint)(0.32*MAX(fabs(a1a2[1]), fabs(a1a2[3]))/dy + 0.5);
+    gwy_debug("window size: %dx%d", xwinsize, ywinsize);
+
+    r = refine_from_multiple(dfield, a1a2, 1, 2, xwinsize, ywinsize);
+    gwy_debug("refine1(%g): (%g, %g) (%g, %g)",
+              r, a1a2[0], a1a2[1], a1a2[2], a1a2[3]);
 
-    g_assert(to < res-1 || from > 0);
+    if (is_psdf)
+        return r >= 0.75;
 
-    if (from == 0) {
-        zr = d[to+1];
-        for (i = from; i <= to; i++)
-            d[i] = zr;
+    if (r == 1.0) {
+        xwinsize = 5*xwinsize/6;
+        ywinsize = 5*ywinsize/6;
+        r = refine_from_multiple(dfield, a1a2, 3, 25, xwinsize, ywinsize);
+        gwy_debug("refine3(%g): (%g, %g) (%g, %g)",
+                  r, a1a2[0], a1a2[1], a1a2[2], a1a2[3]);
     }
-    else if (to == res-1) {
-        zl = d[from-1];
-        for (i = from; i <= to; i++)
-            d[i] = zl;
+
+    if (r == 1.0) {
+        xwinsize = 7*xwinsize/8;
+        ywinsize = 7*ywinsize/8;
+        r = refine_from_multiple(dfield, a1a2, 5, 29, xwinsize, ywinsize);
+        gwy_debug("refine5(%g): (%g, %g) (%g, %g)",
+                  r, a1a2[0], a1a2[1], a1a2[2], a1a2[3]);
     }
-    else {
-        zl = d[from-1]/(to - from + 2);
-        zr = d[to+1]/(to - from + 2);
-        for (i = from; i <= to; i++)
-            d[i] = zr*(i+1) + zl*(to+1 - from - i);
+
+    return r > 0.5;
+}
+
+/**
+ * gwy_data_field_measure_lattice_acf:
+ * @acf2d: Data field containing two-dimensional autocorrelation function.
+ * @a1a2: Lattice vectors as an array of four components: @x1, @y1, @x2 and
+ *        @y2 (in real coordinates).
+ *
+ * Estimates or improves estimate of lattice vectors from a 2D ACF field.
+ *
+ * Note that the 2D ACF of a data field has to be passed, not the data field
+ * itself.  The correlation function can be for instance calculated by
+ * gwy_data_field_2dacf(). However, you can calculate and/or process the
+ * correlation function in any way you see fit.
+ *
+ * When the vectors in @a1a2 are zero the function attempts to estimate the
+ * lattice from scratch.  But if @a1a2 contains two non-zero vectors it takes
+ * them as approximate lattice vectors to improve.
+ *
+ * If the function return %FALSE the array @a1a2 is filled with useless values
+ * and must be ignored.
+ *
+ * Returns: %TRUE if good lattice vectors were found, %FALSE on failure.
+ *
+ * Since: 2.49
+ **/
+gboolean
+gwy_data_field_measure_lattice_acf(GwyDataField *acf2d, gdouble *a1a2)
+{
+    gdouble dx, dy;
+    guint i;
+
+    if ((a1a2[0] == 0.0 && a1a2[1] == 0.0)
+        || (a1a2[2] == 0.0 && a1a2[3] == 0.0)) {
+        if (!guess_lattice(acf2d, a1a2, FALSE))
+            return FALSE;
+        gwy_debug("guess: (%g, %g) (%g, %g)",
+                  a1a2[0], a1a2[1], a1a2[2], a1a2[3]);
+    }
+
+    for (i = 0; i < 4; i++) {
+        if (gwy_isnan(a1a2[i]) || gwy_isinf(a1a2[i]))
+            return FALSE;
+    }
+
+    if (!refine_lattice(acf2d, a1a2, FALSE))
+        return FALSE;
+
+    for (i = 0; i < 4; i++) {
+        if (gwy_isnan(a1a2[i]) || gwy_isinf(a1a2[i]))
+            return FALSE;
+    }
+
+    /* For very skewed lattices refine() can produce two of the same vector. */
+    dx = acf2d->xreal/acf2d->xres;
+    dy = acf2d->yreal/acf2d->yres;
+    if (hypot(a1a2[0] - a1a2[2], a1a2[1] - a1a2[3]) < 1.8*hypot(dx, dy))
+        return FALSE;
+
+    return TRUE;
+}
+
+/**
+ * gwy_data_field_measure_lattice_psdf:
+ * @psdf2d: Data field containing two-dimensional power spectrum density
+ *          function (or alternatively Fourier coefficient modulus).
+ * @a1a2: Lattice vectors as an array of four components: @x1, @y1, @x2 and
+ *        @y2 (in real coordinates).
+ *
+ * Estimates or improves estimate of lattice vectors from a 2D PSDF field.
+ *
+ * Note that the 2D PSDF of a data field has to be passed, not the data field
+ * itself.  The spectral density can be for instance calculated by
+ * gwy_data_field_2dfft() and summing the squares of real and imaginary parts
+ * However, you can calculate and/or process the spectral density in any way
+ * you see fit.
+ *
+ * When the vectors in @a1a2 are zero the function attempts to estimate the
+ * lattice from scratch.  But if @a1a2 contains two non-zero vectors it takes
+ * them as approximate lattice vectors to improve.
+ *
+ * If the function return %FALSE the array @a1a2 is filled with useless values
+ * and must be ignored.
+ *
+ * Returns: %TRUE if good lattice vectors were found, %FALSE on failure.
+ *
+ * Since: 2.49
+ **/
+gboolean
+gwy_data_field_measure_lattice_psdf(GwyDataField *psdf2d, gdouble *a1a2)
+{
+    gdouble dx, dy;
+    guint i;
+
+    if ((a1a2[0] == 0.0 && a1a2[1] == 0.0)
+        || (a1a2[2] == 0.0 && a1a2[3] == 0.0)) {
+        if (!guess_lattice(psdf2d, a1a2, TRUE))
+            return FALSE;
+        gwy_debug("guess: (%g, %g) (%g, %g)",
+                  a1a2[0], a1a2[1], a1a2[2], a1a2[3]);
+    }
+
+    transform_vectors_real_freq(a1a2);
+    for (i = 0; i < 4; i++) {
+        if (gwy_isnan(a1a2[i]) || gwy_isinf(a1a2[i]))
+            return FALSE;
     }
+
+    if (!refine_lattice(psdf2d, a1a2, TRUE))
+        return FALSE;
+
+    transform_vectors_real_freq(a1a2);
+    gwy_debug("real: (%g, %g) (%g, %g)", a1a2[0], a1a2[1], a1a2[2], a1a2[3]);
+    for (i = 0; i < 4; i++) {
+        if (gwy_isnan(a1a2[i]) || gwy_isinf(a1a2[i]))
+            return FALSE;
+    }
+
+    /* For very skewed lattices refine() can produce two of the same vector. */
+    dx = 1.0/psdf2d->xreal;
+    dy = 1.0/psdf2d->yreal;
+    if (hypot(a1a2[0] - a1a2[2], a1a2[1] - a1a2[3]) < 1.8*hypot(dx, dy))
+        return FALSE;
+
+    return TRUE;
 }
 
 /**
diff --git a/libprocess/correct.h b/libprocess/correct.h
index 034f70f..fdbfe8b 100644
--- a/libprocess/correct.h
+++ b/libprocess/correct.h
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: correct.h 19086 2016-10-16 12:18:11Z yeti-dn $
- *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: correct.h 20135 2017-08-02 11:20:45Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -72,6 +72,18 @@ void     gwy_data_field_affine                   (GwyDataField *source,
                                                   GwyInterpolationType interp,
                                                   GwyExteriorType exterior,
                                                   gdouble fill_value);
+void     gwy_data_field_affine_prepare           (GwyDataField *source,
+                                                  GwyDataField *dest,
+                                                  const gdouble *a1a2,
+                                                  gdouble *a1a2_corr,
+                                                  gdouble *invtrans,
+                                                  GwyAffineScalingType scaling,
+                                                  gboolean prevent_rotation,
+                                                  gdouble oversampling);
+gboolean gwy_data_field_measure_lattice_acf      (GwyDataField *acf2d,
+                                                  gdouble *a1a2);
+gboolean gwy_data_field_measure_lattice_psdf     (GwyDataField *psdf2d,
+                                                  gdouble *a1a2);
 gboolean gwy_data_line_correct_laplace           (GwyDataLine *data_line,
                                                   GwyDataLine *mask_line);
 void     gwy_data_field_mark_scars               (GwyDataField *data_field,
diff --git a/libprocess/cwt.c b/libprocess/cwt.c
index 8a9bc62..27061eb 100644
--- a/libprocess/cwt.c
+++ b/libprocess/cwt.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: cwt.c 15598 2013-11-11 12:33:32Z yeti-dn $
+ *  @(#) $Id: cwt.c 19698 2017-05-03 20:18:10Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -19,7 +19,6 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-#include "config.h"
 #include <libgwyddion/gwymath.h>
 #include <libprocess/cwt.h>
 
diff --git a/libprocess/datafield.c b/libprocess/datafield.c
index 9f4c680..425762d 100644
--- a/libprocess/datafield.c
+++ b/libprocess/datafield.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: datafield.c 19036 2016-10-08 10:32:41Z yeti-dn $
- *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: datafield.c 20128 2017-08-01 11:19:59Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -33,6 +33,8 @@
 
 #define GWY_DATA_FIELD_TYPE_NAME "GwyDataField"
 
+enum { BLOCK_SIZE = 64 };
+
 enum {
     DATA_CHANGED,
     LAST_SIGNAL
@@ -198,10 +200,7 @@ gwy_data_field_new_alike(GwyDataField *model,
     else
         data_field->data = g_new(gdouble, data_field->xres*data_field->yres);
 
-    if (model->si_unit_xy)
-        data_field->si_unit_xy = gwy_si_unit_duplicate(model->si_unit_xy);
-    if (model->si_unit_z)
-        data_field->si_unit_z = gwy_si_unit_duplicate(model->si_unit_z);
+    gwy_data_field_copy_units(model, data_field);
 
     return data_field;
 }
@@ -239,10 +238,7 @@ gwy_data_field_new_resampled(GwyDataField *data_field,
                                 FALSE);
     result->xoff = data_field->xoff;
     result->yoff = data_field->yoff;
-    if (data_field->si_unit_xy)
-        result->si_unit_xy = gwy_si_unit_duplicate(data_field->si_unit_xy);
-    if (data_field->si_unit_z)
-        result->si_unit_z = gwy_si_unit_duplicate(data_field->si_unit_z);
+    gwy_data_field_copy_units(data_field, result);
 
     /* Prevent rounding errors from introducing different values in constants
      * field during resampling. */
@@ -266,19 +262,14 @@ gwy_data_field_serialize(GObject *obj,
 {
     GwyDataField *data_field;
     guint32 datasize;
-    gdouble *pxoff, *pyoff;
-
-    gwy_debug("");
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(obj), NULL);
+    gpointer pxoff, pyoff, pxyunit, pzunit;
 
     data_field = GWY_DATA_FIELD(obj);
-    if (!data_field->si_unit_xy)
-        data_field->si_unit_xy = gwy_si_unit_new(NULL);
-    if (!data_field->si_unit_z)
-        data_field->si_unit_z = gwy_si_unit_new(NULL);
     datasize = data_field->xres*data_field->yres;
     pxoff = data_field->xoff ? &data_field->xoff : NULL;
     pyoff = data_field->yoff ? &data_field->yoff : NULL;
+    pxyunit = unit_pointer_if_nonempty(data_field->si_unit_xy);
+    pzunit = unit_pointer_if_nonempty(data_field->si_unit_z);
     {
         GwySerializeSpec spec[] = {
             { 'i', "xres", &data_field->xres, NULL, },
@@ -287,8 +278,8 @@ gwy_data_field_serialize(GObject *obj,
             { 'd', "yreal", &data_field->yreal, NULL, },
             { 'd', "xoff", pxoff, NULL, },
             { 'd', "yoff", pyoff, NULL, },
-            { 'o', "si_unit_xy", &data_field->si_unit_xy, NULL, },
-            { 'o', "si_unit_z", &data_field->si_unit_z, NULL, },
+            { 'o', "si_unit_xy", pxyunit, NULL, },
+            { 'o', "si_unit_z", pzunit, NULL, },
             { 'D', "data", &data_field->data, &datasize, },
         };
         return gwy_serialize_pack_object_struct(buffer,
@@ -302,26 +293,24 @@ gwy_data_field_get_size(GObject *obj)
 {
     GwyDataField *data_field;
     guint32 datasize;
-
-    gwy_debug("");
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(obj), 0);
+    gpointer pxoff, pyoff, pxyunit, pzunit;
 
     data_field = GWY_DATA_FIELD(obj);
-    if (!data_field->si_unit_xy)
-        data_field->si_unit_xy = gwy_si_unit_new(NULL);
-    if (!data_field->si_unit_z)
-        data_field->si_unit_z = gwy_si_unit_new(NULL);
     datasize = data_field->xres*data_field->yres;
+    pxoff = data_field->xoff ? &data_field->xoff : NULL;
+    pyoff = data_field->yoff ? &data_field->yoff : NULL;
+    pxyunit = unit_pointer_if_nonempty(data_field->si_unit_xy);
+    pzunit = unit_pointer_if_nonempty(data_field->si_unit_z);
     {
         GwySerializeSpec spec[] = {
             { 'i', "xres", &data_field->xres, NULL, },
             { 'i', "yres", &data_field->yres, NULL, },
             { 'd', "xreal", &data_field->xreal, NULL, },
             { 'd', "yreal", &data_field->yreal, NULL, },
-            { 'd', "xoff", &data_field->xoff, NULL, },
-            { 'd', "yoff", &data_field->yoff, NULL, },
-            { 'o', "si_unit_xy", &data_field->si_unit_xy, NULL, },
-            { 'o', "si_unit_z", &data_field->si_unit_z, NULL, },
+            { 'd', "xoff", pxoff, NULL, },
+            { 'd', "yoff", pyoff, NULL, },
+            { 'o', "si_unit_xy", pxyunit, NULL, },
+            { 'o', "si_unit_z", pzunit, NULL, },
             { 'D', "data", &data_field->data, &datasize, },
         };
         return gwy_serialize_get_struct_size(GWY_DATA_FIELD_TYPE_NAME,
@@ -491,22 +480,7 @@ gwy_data_field_copy(GwyDataField *src,
     if (!nondata_too)
         return;
 
-    /* SI Units can be NULL */
-    if (src->si_unit_xy && dest->si_unit_xy)
-        gwy_serializable_clone(G_OBJECT(src->si_unit_xy),
-                               G_OBJECT(dest->si_unit_xy));
-    else if (src->si_unit_xy && !dest->si_unit_xy)
-        dest->si_unit_xy = gwy_si_unit_duplicate(src->si_unit_xy);
-    else if (!src->si_unit_xy && dest->si_unit_xy)
-        GWY_OBJECT_UNREF(dest->si_unit_xy);
-
-    if (src->si_unit_z && dest->si_unit_z)
-        gwy_serializable_clone(G_OBJECT(src->si_unit_z),
-                               G_OBJECT(dest->si_unit_z));
-    else if (src->si_unit_z && !dest->si_unit_z)
-        dest->si_unit_z = gwy_si_unit_duplicate(src->si_unit_z);
-    else if (!src->si_unit_z && dest->si_unit_z)
-        GWY_OBJECT_UNREF(dest->si_unit_z);
+    gwy_data_field_copy_units(src, dest);
 }
 
 /**
@@ -770,10 +744,7 @@ gwy_data_field_area_extract(GwyDataField *data_field,
                    data_field->data + (i + row)*data_field->xres + col,
                    width);
     }
-    if (data_field->si_unit_xy)
-        result->si_unit_xy = gwy_si_unit_duplicate(data_field->si_unit_xy);
-    if (data_field->si_unit_z)
-        result->si_unit_z = gwy_si_unit_duplicate(data_field->si_unit_z);
+    gwy_data_field_copy_units(data_field, result);
 
     return result;
 }
@@ -1155,13 +1126,7 @@ gwy_data_field_set_si_unit_xy(GwyDataField *data_field,
                               GwySIUnit *si_unit)
 {
     g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(GWY_IS_SI_UNIT(si_unit));
-    if (data_field->si_unit_xy == si_unit)
-        return;
-
-    GWY_OBJECT_UNREF(data_field->si_unit_xy);
-    g_object_ref(si_unit);
-    data_field->si_unit_xy = si_unit;
+    _gwy_set_object_si_unit(si_unit, &data_field->si_unit_xy);
 }
 
 /**
@@ -1180,13 +1145,7 @@ gwy_data_field_set_si_unit_z(GwyDataField *data_field,
                              GwySIUnit *si_unit)
 {
     g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(GWY_IS_SI_UNIT(si_unit));
-    if (data_field->si_unit_z == si_unit)
-        return;
-
-    GWY_OBJECT_UNREF(data_field->si_unit_z);
-    g_object_ref(si_unit);
-    data_field->si_unit_z = si_unit;
+    _gwy_set_object_si_unit(si_unit, &data_field->si_unit_z);
 }
 
 /**
@@ -1418,7 +1377,7 @@ gwy_data_field_get_dval_real(GwyDataField *data_field, gdouble x, gdouble y,
  * Rotates a data field by a given angle.
  *
  * This function is mostly obsolete.  See gwy_data_field_new_rotated()
- * and gwy_data_field_rotated_90().
+ * and gwy_data_field_new_rotated_90().
  *
  * Values that get outside of data field by the rotation are lost.
  * Undefined values from outside of data field that get inside are set to
@@ -1533,36 +1492,14 @@ gwy_data_field_new_rotated_90(GwyDataField *data_field,
                               gboolean clockwise)
 {
     GwyDataField *result;
-    gint xres, yres, i, j;
-    gdouble *dd;
-    const gdouble *sd;
 
-    xres = data_field->xres;
-    yres = data_field->yres;
     result = gwy_data_field_new_alike(data_field, FALSE);
-    gwy_data_field_resample(result, yres, xres, GWY_INTERPOLATION_NONE);
-    result->xreal = data_field->yreal;
-    result->yreal = data_field->xreal;
+    gwy_data_field_flip_xy(data_field, result, FALSE);
+    /* Clockwise = flip + rowinv; Anti-clockwise = flip + colinv. */
+    gwy_data_field_invert(result, !clockwise, clockwise, FALSE);
     result->xoff = data_field->yoff;
     result->yoff = data_field->xoff;
 
-    sd = data_field->data;
-    dd = result->data;
-    if (!clockwise) {
-        for (i = 0; i < xres; i++) {
-            for (j = 0; j < yres; j++) {
-                dd[i*yres + j] = sd[j*xres + (xres - 1 - i)];
-            }
-        }
-    }
-    else {
-        for (i = 0; i < xres; i++) {
-            for (j = 0; j < yres; j++) {
-                dd[i*yres + (yres - 1 - j)] = sd[j*xres + i];
-            }
-        }
-    }
-
     return result;
 }
 
@@ -1675,8 +1612,8 @@ rotate_find_out_dimensions(GwyDataField *dfield,
  *
  * The returned data field has usually square pixels, the exception being when
  * @angle is a multiple of %G_PI/2 when the function reduces to
- * gwy_data_field_rotated_90() and original pixels are preserved.  This is of
- * concern only when @dfield has non-square pixels.
+ * gwy_data_field_new_rotated_90() and original pixels are preserved.  This is
+ * of concern only when @dfield has non-square pixels.
  *
  * Returns: A newly created data field.
  *
@@ -1791,10 +1728,7 @@ gwy_data_field_new_rotated(GwyDataField *dfield,
     result = gwy_data_field_new(newxres, newyres, newxreal, newyreal, FALSE);
     result->xoff = dfield->yoff + 0.5*(yreal - newxreal);
     result->yoff = dfield->xoff + 0.5*(xreal - newyreal);
-    if (dfield->si_unit_xy)
-        result->si_unit_xy = gwy_si_unit_duplicate(dfield->si_unit_xy);
-    if (dfield->si_unit_z)
-        result->si_unit_z = gwy_si_unit_duplicate(dfield->si_unit_z);
+    gwy_data_field_copy_units(dfield, result);
 
     if (exterior_mask) {
         gwy_serializable_clone(G_OBJECT(result), G_OBJECT(exterior_mask));
@@ -1862,11 +1796,24 @@ gwy_data_field_new_rotated(GwyDataField *dfield,
     return result;
 }
 
+static void
+invert_array_in_place(gdouble *d, guint n)
+{
+    gdouble *e = d + n-1;
+
+    n /= 2;
+    while (n--) {
+        GWY_SWAP(gdouble, *d, *e);
+        d++;
+        e--;
+    }
+}
+
 /**
  * gwy_data_field_invert:
  * @data_field: A data field.
- * @x: %TRUE to reflect about X axis (i.e., vertically).
- * @y: %TRUE to reflect about Y axis (i.e., horizontally).
+ * @x: %TRUE to reflect about X axis (i.e., invert columns vertically).
+ * @y: %TRUE to reflect about Y axis (i.e., invert rows horizontally).
  * @z: %TRUE to invert in Z direction (i.e., invert values).
  *
  * Reflects amd/or inverts a data field.
@@ -1879,12 +1826,14 @@ gwy_data_field_invert(GwyDataField *data_field,
                       gboolean y,
                       gboolean z)
 {
-    gint i, j, n;
+    gint xres, yres, i, j, n;
     gdouble avg;
     gdouble *data, *flip;
 
     g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    n = data_field->xres*data_field->yres;
+    xres = data_field->xres;
+    yres = data_field->yres;
+    n = xres*yres;
 
     if (z) {
         avg = gwy_data_field_get_avg(data_field);
@@ -1909,24 +1858,17 @@ gwy_data_field_invert(GwyDataField *data_field,
     }
 
     if (x && y) {
-        data = data_field->data;
-        flip = data + n-1;
-        for (i = 0; i < n/2; i++, data++, flip--)
-            GWY_SWAP(gdouble, *data, *flip);
+        invert_array_in_place(data_field->data, n);
     }
     else if (y) {
-        for (i = 0; i < data_field->yres; i++) {
-            data = data_field->data + i*data_field->xres;
-            flip = data + data_field->xres-1;
-            for (j = 0; j < data_field->xres/2; j++, data++, flip--)
-                GWY_SWAP(gdouble, *data, *flip);
-        }
+        for (i = 0; i < yres; i++)
+            invert_array_in_place(data_field->data + i*xres, xres);
     }
     else if (x) {
-        for (i = 0; i < data_field->yres/2; i++) {
-            data = data_field->data + i*data_field->xres;
-            flip = data_field->data + (data_field->yres-1 - i)*data_field->xres;
-            for (j = 0; j < data_field->xres; j++, data++, flip++)
+        for (i = 0; i < yres/2; i++) {
+            data = data_field->data + i*xres;
+            flip = data_field->data + (yres-1 - i)*xres;
+            for (j = 0; j < xres; j++, data++, flip++)
                 GWY_SWAP(gdouble, *data, *flip);
         }
     }
@@ -1939,6 +1881,132 @@ gwy_data_field_invert(GwyDataField *data_field,
                           | CBIT(VAR);
 }
 
+/* Block sizes are measured in destination, in source, the dims are swapped. */
+static inline void
+swap_block(const gdouble *sb, gdouble *db,
+           guint xblocksize, guint yblocksize,
+           guint dxres, guint sxres)
+{
+    guint i, j;
+
+    for (i = 0; i < yblocksize; i++) {
+        const gdouble *s = sb + i;
+        gdouble *d = db + i*dxres;
+        for (j = xblocksize; j; j--, d++, s += sxres)
+            *d = *s;
+    }
+}
+
+static void
+transpose_to(const GwyDataField *source,
+             guint col, guint row,
+             guint width, guint height,
+             GwyDataField *dest,
+             guint destcol, guint destrow)
+{
+    guint dxres = dest->xres, sxres = source->xres;
+    guint jmax = height/BLOCK_SIZE * BLOCK_SIZE;
+    guint imax = width/BLOCK_SIZE * BLOCK_SIZE;
+    const gdouble *sbase = source->data + sxres*row + col;
+    gdouble *dbase = dest->data + dxres*destrow + destcol;
+    guint ib, jb;
+
+    for (ib = 0; ib < imax; ib += BLOCK_SIZE) {
+        for (jb = 0; jb < jmax; jb += BLOCK_SIZE)
+            swap_block(sbase + (jb*sxres + ib), dbase + (ib*dxres + jb),
+                       BLOCK_SIZE, BLOCK_SIZE, dxres, sxres);
+        if (jmax != height)
+            swap_block(sbase + (jmax*sxres + ib), dbase + (ib*dxres + jmax),
+                       height - jmax, BLOCK_SIZE, dxres, sxres);
+    }
+    if (imax != width) {
+        for (jb = 0; jb < jmax; jb += BLOCK_SIZE)
+            swap_block(sbase + (jb*sxres + imax), dbase + (imax*dxres + jb),
+                       BLOCK_SIZE, width - imax, dxres, sxres);
+        if (jmax != height)
+            swap_block(sbase + (jmax*sxres + imax),
+                       dbase + (imax*dxres + jmax),
+                       height - jmax, width - imax, dxres, sxres);
+    }
+}
+
+/**
+ * gwy_data_field_flip_xy:
+ * @src: Source data field.
+ * @dest: Destination data field.
+ * @minor: %TRUE to mirror about the minor diagonal; %FALSE to mirror about
+ *         major diagonal.
+ *
+ * Copies data from one data field to another with transposition.
+ *
+ * The destination data field is resized as necessary, its real dimensions set
+ * to transposed @src dimensions and its offsets are reset.  Units are not
+ * updated.
+ *
+ * Since: 2.49
+ **/
+void
+gwy_data_field_flip_xy(GwyDataField *src, GwyDataField *dest,
+                       gboolean minor)
+{
+    gint xres = src->xres, yres = src->yres;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(src));
+    g_return_if_fail(GWY_IS_DATA_FIELD(dest));
+    gwy_data_field_resample(dest, yres, xres, GWY_INTERPOLATION_NONE);
+    transpose_to(src, 0, 0, xres, yres, dest, 0, 0);
+    if (minor)
+        invert_array_in_place(dest->data, xres*yres);
+    dest->yreal = src->xreal;
+    dest->xreal = src->yreal;
+    dest->xoff = dest->yoff = 0.0;
+}
+
+/**
+ * gwy_data_field_area_flip_xy:
+ * @src: Source data field.
+ * @col: Upper-left column coordinate in @src.
+ * @row: Upper-left row coordinate in @src.
+ * @width: Area width (number of columns) in @src.
+ * @height: Area height (number of rows) in @src.
+ * @dest: Destination data field.
+ * @minor: %TRUE to mirror about the minor diagonal; %FALSE to mirror about
+ *         major diagonal.
+ *
+ * Copies data from a rectangular part of one data field to another with
+ * transposition.
+ *
+ * The destination data field is resized as necessary, its real dimensions set
+ * to transposed @src area dimensions and its offsets are reset.  Units are not
+ * updated.
+ *
+ * Since: 2.49
+ **/
+void
+gwy_data_field_area_flip_xy(GwyDataField *src,
+                            gint col, gint row, gint width, gint height,
+                            GwyDataField *dest,
+                            gboolean minor)
+{
+    gint xres = src->xres, yres = src->yres;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(src));
+    g_return_if_fail(GWY_IS_DATA_FIELD(dest));
+    g_return_if_fail(width > 0 && width <= xres);
+    g_return_if_fail(height > 0 && height <= yres);
+    g_return_if_fail(col >= 0 && col <= xres - width);
+    g_return_if_fail(row >= 0 && row <= yres - height);
+
+    gwy_data_field_resample(dest, height, width, GWY_INTERPOLATION_NONE);
+    transpose_to(src, col, row, width, height, dest, 0, 0);
+    if (minor)
+        invert_array_in_place(dest->data, width*height);
+
+    dest->yreal = dest->yres * gwy_data_field_get_xmeasure(src);
+    dest->xreal = dest->xres * gwy_data_field_get_ymeasure(src);
+    dest->xoff = dest->yoff = 0.0;
+}
+
 /**
  * gwy_data_field_fill:
  * @data_field: A data field.
@@ -2598,6 +2666,141 @@ gwy_data_field_get_profile(GwyDataField *data_field,
 }
 
 /**
+ * gwy_data_field_get_profile_mask:
+ * @data_field: A data field.
+ * @ndata: Location where to store the actual number of extracted points, which
+ *         may differ from @res.
+ * @xfrom: The real @x-coordinate where the line starts.
+ * @yfrom: The real @y-coordinate where line starts.
+ * @xto: The real @x-coordinate where the line ends.
+ * @yto: The real @y-coordinate where line ends.
+ * @res: Requested resolution, i.e. the number of samples to take.
+ *       If nonpositive, sampling is chosen to match @data_field's.
+ * @thickness: Thickness of line to be averaged.
+ * @interpolation: Interpolation type to use.
+ *
+ * Extracts a possibly averaged profile from data field, with masking.
+ *
+ * The extracted profile can contain holes due to masking.  It can also contain
+ * no points at all if the all data values along the profile were excluded due
+ * to masking – in this case %NULL is returned.
+ *
+ * Unlike gwy_data_field_get_profile(), this function takes real coordinates
+ * (without offsets), not row and column indices.
+ *
+ * Returns: A newly allocated array of #GwyXY coordinare pairs, or %NULL.
+ *          The caller must free the returned array with g_free().
+ *
+ * Since: 2.49
+ **/
+GwyXY*
+gwy_data_field_get_profile_mask(GwyDataField *dfield,
+                                gint *ndata,
+                                GwyDataField *mask,
+                                GwyMaskingType masking,
+                                gdouble xfrom, gdouble yfrom,
+                                gdouble xto, gdouble yto,
+                                gint res,
+                                gint thickness,
+                                GwyInterpolationType interpolation)
+{
+    gint k, i, j, kk;
+    gdouble xreal, yreal, dx, dy, xstep, ystep, step, size, tx, ty, h;
+    gint xres, yres, tres, n;
+    GwyXY *xydata;
+    const gdouble *m;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(dfield), NULL);
+    g_return_val_if_fail(!mask || GWY_IS_DATA_FIELD(mask), NULL);
+    g_return_val_if_fail(ndata, NULL);
+
+    if (masking == GWY_MASK_IGNORE)
+        mask = NULL;
+    else if (!mask)
+        masking = GWY_MASK_IGNORE;
+    m = mask ? mask->data : NULL;
+
+    xres = dfield->xres;
+    yres = dfield->yres;
+    xreal = dfield->xreal;
+    yreal = dfield->yreal;
+    dx = xreal/xres;
+    dy = yreal/yres;
+
+    size = hypot(fabs(xto - xfrom)/dx + 1, fabs(yto - yfrom)/dy + 1);
+    size = MAX(size, 1.0);
+    if (res <= 0)
+        res = GWY_ROUND(size);
+
+    gwy_debug("size: %g, res: %d", size, res);
+    if (xto == xfrom && yto == yfrom) {
+        xto += 0.2*dx;
+        yto += 0.2*dy;
+        xfrom -= 0.2*dx;
+        yfrom -= 0.2*dy;
+    }
+    xstep = (xto - xfrom)/(res - 1.0);
+    ystep = (yto - yfrom)/(res - 1.0);
+    step = hypot(xstep, ystep);
+    gwy_debug("step (%g, %g)", xstep, ystep);
+
+    if (thickness <= 1) {
+        tres = 0;
+        tx = ty = 0.0;
+    }
+    else {
+        tres = 2*(thickness - 1);
+        tx = (yto - yfrom)/dy;
+        ty = -(xto - xfrom)/dx;
+        h = hypot(tx, ty);
+        tx *= dx/h * 0.5*thickness/tres;
+        ty *= dy/h * 0.5*thickness/tres;
+    }
+    gwy_debug("tres: %d, tstep (%g, %g)", tres, tx, ty);
+
+    xydata = g_new0(GwyXY, res);
+
+    n = 0;
+    for (k = 0; k < res; k++) {
+        gdouble xc = xfrom + xstep*k;
+        gdouble yc = yfrom + ystep*k;
+        gdouble z = 0.0;
+        gint w = 0;
+
+        for (kk = -tres; kk <= tres; kk++) {
+            gdouble x = xc + kk*tx;
+            gdouble y = yc + kk*ty;
+
+            x = CLAMP(x, 0.0, 0.999999*xreal);
+            y = CLAMP(y, 0.0, 0.999999*yreal);
+
+            if (masking != GWY_MASK_IGNORE) {
+                i = (gint)floor(y/dy);
+                j = (gint)floor(x/dx);
+                if ((masking == GWY_MASK_INCLUDE && m[i*xres + j] <= 0.0)
+                    || (masking == GWY_MASK_EXCLUDE && m[i*xres + j] >= 1.0))
+                    continue;
+            }
+
+            z += gwy_data_field_get_dval_real(dfield, x, y, interpolation);
+            w++;
+        }
+        gwy_debug("[%d] %d", k, w);
+        if (w) {
+            xydata[n].x = step*k;
+            xydata[n].y = z/w;
+            n++;
+        }
+    }
+
+    *ndata = n;
+    if (!n)
+        GWY_FREE(xydata);
+
+    return xydata;
+}
+
+/**
  * gwy_data_field_get_xder:
  * @data_field: A data field.
  * @col: Column index.
@@ -2682,65 +2885,41 @@ gwy_data_field_get_angder(GwyDataField *data_field,
 }
 
 /**
- * gwy_data_field_copy_units_to_data_line:
- * @data_field: A data field to get units from.
- * @data_line: A data line to set units of.
+ * gwy_data_field_copy_units:
+ * @data_field: A data field.
+ * @target: Target data field.
  *
- * Sets lateral and value units of a data line to match a data field.
+ * Sets lateral and value units of a data field to match another data field.
+ *
+ * Since: 2.49
  **/
 void
-gwy_data_field_copy_units_to_data_line(GwyDataField *data_field,
-                                       GwyDataLine *data_line)
+gwy_data_field_copy_units(GwyDataField *data_field,
+                          GwyDataField *target)
 {
-    g_return_if_fail(GWY_IS_DATA_LINE(data_line));
     g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    g_return_if_fail(GWY_IS_DATA_FIELD(target));
 
-    if (data_field->si_unit_xy && data_line->si_unit_x)
-        gwy_serializable_clone(G_OBJECT(data_field->si_unit_xy),
-                               G_OBJECT(data_line->si_unit_x));
-    else if (data_field->si_unit_xy && !data_line->si_unit_x)
-        data_line->si_unit_x = gwy_si_unit_duplicate(data_field->si_unit_xy);
-    else if (!data_field->si_unit_xy && data_line->si_unit_x)
-        GWY_OBJECT_UNREF(data_line->si_unit_x);
-
-    if (data_field->si_unit_z && data_line->si_unit_y)
-        gwy_serializable_clone(G_OBJECT(data_field->si_unit_z),
-                               G_OBJECT(data_line->si_unit_y));
-    else if (data_field->si_unit_z && !data_line->si_unit_y)
-        data_line->si_unit_y = gwy_si_unit_duplicate(data_field->si_unit_z);
-    else if (!data_field->si_unit_z && data_line->si_unit_y)
-        GWY_OBJECT_UNREF(data_line->si_unit_y);
+    _gwy_assign_si_unit(data_field->si_unit_xy, &target->si_unit_xy);
+    _gwy_assign_si_unit(data_field->si_unit_z, &target->si_unit_z);
 }
 
 /**
- * gwy_data_line_copy_units_to_data_field:
- * @data_line: A data line to get units from.
- * @data_field: A data field to set units of.
+ * gwy_data_field_copy_units_to_data_line:
+ * @data_field: A data field to get units from.
+ * @data_line: A data line to set units of.
  *
- * Sets lateral and value units of a data field to match a data line.
+ * Sets lateral and value units of a data line to match a data field.
  **/
 void
-gwy_data_line_copy_units_to_data_field(GwyDataLine *data_line,
-                                       GwyDataField *data_field)
+gwy_data_field_copy_units_to_data_line(GwyDataField *data_field,
+                                       GwyDataLine *data_line)
 {
     g_return_if_fail(GWY_IS_DATA_LINE(data_line));
     g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
 
-    if (data_line->si_unit_x && data_field->si_unit_xy)
-        gwy_serializable_clone(G_OBJECT(data_line->si_unit_x),
-                               G_OBJECT(data_field->si_unit_xy));
-    else if (data_line->si_unit_x && !data_field->si_unit_xy)
-        data_field->si_unit_xy = gwy_si_unit_duplicate(data_line->si_unit_x);
-    else if (!data_line->si_unit_x && data_field->si_unit_xy)
-        GWY_OBJECT_UNREF(data_field->si_unit_xy);
-
-    if (data_line->si_unit_y && data_field->si_unit_z)
-        gwy_serializable_clone(G_OBJECT(data_line->si_unit_y),
-                               G_OBJECT(data_field->si_unit_z));
-    else if (data_line->si_unit_y && !data_field->si_unit_z)
-        data_field->si_unit_z = gwy_si_unit_duplicate(data_line->si_unit_y);
-    else if (!data_line->si_unit_y && data_field->si_unit_z)
-        GWY_OBJECT_UNREF(data_field->si_unit_z);
+    _gwy_assign_si_unit(data_field->si_unit_xy, &data_line->si_unit_x);
+    _gwy_assign_si_unit(data_field->si_unit_z, &data_line->si_unit_y);
 }
 
 #undef gwy_data_field_invalidate
diff --git a/libprocess/datafield.h b/libprocess/datafield.h
index 4853860..d7812c0 100644
--- a/libprocess/datafield.h
+++ b/libprocess/datafield.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: datafield.h 18938 2016-09-09 18:36:02Z yeti-dn $
+ *  @(#) $Id: datafield.h 20128 2017-08-01 11:19:59Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -150,6 +150,8 @@ GwySIValueFormat* gwy_data_field_get_value_format_xy(GwyDataField *data_field,
 GwySIValueFormat* gwy_data_field_get_value_format_z (GwyDataField *data_field,
                                                      GwySIUnitFormatStyle style,
                                                      GwySIValueFormat *format);
+void          gwy_data_field_copy_units             (GwyDataField *data_field,
+                                                     GwyDataField *target);
 void          gwy_data_field_copy_units_to_data_line(GwyDataField *data_field,
                                                      GwyDataLine *data_line);
 void          gwy_data_line_copy_units_to_data_field(GwyDataLine *data_line,
@@ -165,128 +167,149 @@ gdouble           gwy_data_field_rtoj                (GwyDataField *data_field,
                                                       gdouble realx);
 
 
-gdouble       gwy_data_field_get_val        (GwyDataField *data_field,
-                                             gint col,
-                                             gint row);
-void          gwy_data_field_set_val        (GwyDataField *data_field,
-                                             gint col,
-                                             gint row,
-                                             gdouble value);
-gdouble       gwy_data_field_get_dval       (GwyDataField *data_field,
-                                             gdouble x,
-                                             gdouble y,
-                                             GwyInterpolationType interpolation);
-gdouble       gwy_data_field_get_dval_real  (GwyDataField *data_field,
-                                             gdouble x,
-                                             gdouble y,
-                                             GwyInterpolationType interpolation);
-void          gwy_data_field_rotate         (GwyDataField *data_field,
-                                             gdouble angle,
-                                             GwyInterpolationType interpolation);
-GwyDataField* gwy_data_field_new_rotated    (GwyDataField *dfield,
-                                             GwyDataField *exterior_mask,
-                                             gdouble angle,
-                                             GwyInterpolationType interp,
-                                             GwyRotateResizeType resize);
-GwyDataField* gwy_data_field_new_rotated_90 (GwyDataField *data_field,
-                                             gboolean clockwise);
-void          gwy_data_field_invert         (GwyDataField *data_field,
-                                             gboolean x,
-                                             gboolean y,
-                                             gboolean z);
-void          gwy_data_field_fill           (GwyDataField *data_field,
-                                             gdouble value);
-void          gwy_data_field_clear          (GwyDataField *data_field);
-void          gwy_data_field_multiply       (GwyDataField *data_field,
-                                             gdouble value);
-void          gwy_data_field_add            (GwyDataField *data_field,
-                                             gdouble value);
-void          gwy_data_field_area_fill      (GwyDataField *data_field,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height,
-                                             gdouble value);
-void          gwy_data_field_area_fill_mask (GwyDataField *data_field,
-                                             GwyDataField *mask,
-                                             GwyMaskingType mode,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height,
-                                             gdouble value);
-void          gwy_data_field_area_clear     (GwyDataField *data_field,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height);
-void          gwy_data_field_area_multiply  (GwyDataField *data_field,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height,
-                                             gdouble value);
-void          gwy_data_field_area_add       (GwyDataField *data_field,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height,
-                                             gdouble value);
-GwyDataLine*  gwy_data_field_get_profile    (GwyDataField *data_field,
-                                             GwyDataLine* data_line,
-                                             gint scol,
-                                             gint srow,
-                                             gint ecol,
-                                             gint erow,
-                                             gint res,
-                                             gint thickness,
-                                             GwyInterpolationType interpolation);
-void          gwy_data_field_get_row        (GwyDataField *data_field,
-                                             GwyDataLine* data_line,
-                                             gint row);
-void          gwy_data_field_get_column     (GwyDataField *data_field,
-                                             GwyDataLine* data_line,
-                                             gint col);
-void          gwy_data_field_set_row        (GwyDataField *data_field,
-                                             GwyDataLine* data_line,
-                                             gint row);
-void          gwy_data_field_set_column     (GwyDataField *data_field,
-                                             GwyDataLine* data_line,
-                                             gint col);
-void          gwy_data_field_get_row_part   (GwyDataField *data_field,
-                                             GwyDataLine* data_line,
-                                             gint row,
-                                             gint from,
-                                             gint to);
-void          gwy_data_field_get_column_part(GwyDataField *data_field,
-                                             GwyDataLine* data_line,
-                                             gint col,
-                                             gint from,
-                                             gint to);
-void          gwy_data_field_set_row_part   (GwyDataField *data_field,
-                                             GwyDataLine* data_line,
-                                             gint row,
-                                             gint from,
-                                             gint to);
-void          gwy_data_field_set_column_part(GwyDataField *data_field,
-                                             GwyDataLine* data_line,
-                                             gint col,
-                                             gint from,
-                                             gint to);
-gdouble       gwy_data_field_get_xder       (GwyDataField *data_field,
-                                             gint col,
-                                             gint row);
-gdouble       gwy_data_field_get_yder       (GwyDataField *data_field,
-                                             gint col,
-                                             gint row);
-gdouble       gwy_data_field_get_angder     (GwyDataField *data_field,
-                                             gint col,
-                                             gint row,
-                                             gdouble theta);
-void          gwy_data_field_average_xyz    (GwyDataField *data_field,
-                                             GwyDataField *density_map,
-                                             const GwyXYZ *points,
-                                             gint npoints);
+gdouble       gwy_data_field_get_val         (GwyDataField *data_field,
+                                              gint col,
+                                              gint row);
+void          gwy_data_field_set_val         (GwyDataField *data_field,
+                                              gint col,
+                                              gint row,
+                                              gdouble value);
+gdouble       gwy_data_field_get_dval        (GwyDataField *data_field,
+                                              gdouble x,
+                                              gdouble y,
+                                              GwyInterpolationType interpolation);
+gdouble       gwy_data_field_get_dval_real   (GwyDataField *data_field,
+                                              gdouble x,
+                                              gdouble y,
+                                              GwyInterpolationType interpolation);
+void          gwy_data_field_rotate          (GwyDataField *data_field,
+                                              gdouble angle,
+                                              GwyInterpolationType interpolation);
+GwyDataField* gwy_data_field_new_rotated     (GwyDataField *dfield,
+                                              GwyDataField *exterior_mask,
+                                              gdouble angle,
+                                              GwyInterpolationType interp,
+                                              GwyRotateResizeType resize);
+GwyDataField* gwy_data_field_new_rotated_90  (GwyDataField *data_field,
+                                              gboolean clockwise);
+void          gwy_data_field_invert          (GwyDataField *data_field,
+                                              gboolean x,
+                                              gboolean y,
+                                              gboolean z);
+void          gwy_data_field_flip_xy         (GwyDataField *src,
+                                              GwyDataField *dest,
+                                              gboolean minor);
+void          gwy_data_field_area_flip_xy    (GwyDataField *src,
+                                              gint col,
+                                              gint row,
+                                              gint width,
+                                              gint height,
+                                              GwyDataField *dest,
+                                              gboolean minor);
+void          gwy_data_field_fill            (GwyDataField *data_field,
+                                              gdouble value);
+void          gwy_data_field_clear           (GwyDataField *data_field);
+void          gwy_data_field_multiply        (GwyDataField *data_field,
+                                              gdouble value);
+void          gwy_data_field_add             (GwyDataField *data_field,
+                                              gdouble value);
+void          gwy_data_field_area_fill       (GwyDataField *data_field,
+                                              gint col,
+                                              gint row,
+                                              gint width,
+                                              gint height,
+                                              gdouble value);
+void          gwy_data_field_area_fill_mask  (GwyDataField *data_field,
+                                              GwyDataField *mask,
+                                              GwyMaskingType mode,
+                                              gint col,
+                                              gint row,
+                                              gint width,
+                                              gint height,
+                                              gdouble value);
+void          gwy_data_field_area_clear      (GwyDataField *data_field,
+                                              gint col,
+                                              gint row,
+                                              gint width,
+                                              gint height);
+void          gwy_data_field_area_multiply   (GwyDataField *data_field,
+                                              gint col,
+                                              gint row,
+                                              gint width,
+                                              gint height,
+                                              gdouble value);
+void          gwy_data_field_area_add        (GwyDataField *data_field,
+                                              gint col,
+                                              gint row,
+                                              gint width,
+                                              gint height,
+                                              gdouble value);
+GwyDataLine*  gwy_data_field_get_profile     (GwyDataField *data_field,
+                                              GwyDataLine* data_line,
+                                              gint scol,
+                                              gint srow,
+                                              gint ecol,
+                                              gint erow,
+                                              gint res,
+                                              gint thickness,
+                                              GwyInterpolationType interpolation);
+GwyXY*        gwy_data_field_get_profile_mask(GwyDataField *data_field,
+                                              gint *ndata,
+                                              GwyDataField *mask,
+                                              GwyMaskingType masking,
+                                              gdouble xfrom,
+                                              gdouble yfrom,
+                                              gdouble xto,
+                                              gdouble yto,
+                                              gint res,
+                                              gint thickness,
+                                              GwyInterpolationType interpolation);
+void          gwy_data_field_get_row         (GwyDataField *data_field,
+                                              GwyDataLine* data_line,
+                                              gint row);
+void          gwy_data_field_get_column      (GwyDataField *data_field,
+                                              GwyDataLine* data_line,
+                                              gint col);
+void          gwy_data_field_set_row         (GwyDataField *data_field,
+                                              GwyDataLine* data_line,
+                                              gint row);
+void          gwy_data_field_set_column      (GwyDataField *data_field,
+                                              GwyDataLine* data_line,
+                                              gint col);
+void          gwy_data_field_get_row_part    (GwyDataField *data_field,
+                                              GwyDataLine* data_line,
+                                              gint row,
+                                              gint from,
+                                              gint to);
+void          gwy_data_field_get_column_part (GwyDataField *data_field,
+                                              GwyDataLine* data_line,
+                                              gint col,
+                                              gint from,
+                                              gint to);
+void          gwy_data_field_set_row_part    (GwyDataField *data_field,
+                                              GwyDataLine* data_line,
+                                              gint row,
+                                              gint from,
+                                              gint to);
+void          gwy_data_field_set_column_part (GwyDataField *data_field,
+                                              GwyDataLine* data_line,
+                                              gint col,
+                                              gint from,
+                                              gint to);
+gdouble       gwy_data_field_get_xder        (GwyDataField *data_field,
+                                              gint col,
+                                              gint row);
+gdouble       gwy_data_field_get_yder        (GwyDataField *data_field,
+                                              gint col,
+                                              gint row);
+gdouble       gwy_data_field_get_angder      (GwyDataField *data_field,
+                                              gint col,
+                                              gint row,
+                                              gdouble theta);
+void          gwy_data_field_average_xyz     (GwyDataField *data_field,
+                                              GwyDataField *density_map,
+                                              const GwyXYZ *points,
+                                              gint npoints);
 
 G_END_DECLS
 
diff --git a/libprocess/dataline.c b/libprocess/dataline.c
index 268c274..120ec7b 100644
--- a/libprocess/dataline.c
+++ b/libprocess/dataline.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: dataline.c 19036 2016-10-08 10:32:41Z yeti-dn $
- *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: dataline.c 20128 2017-08-01 11:19:59Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -25,8 +25,10 @@
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
 #include <libgwyddion/gwydebugobjects.h>
+#include <libprocess/datafield.h>
 #include <libprocess/linestats.h>
 #include <libprocess/interpolation.h>
+#include "gwyprocessinternal.h"
 
 #define GWY_DATA_LINE_TYPE_NAME "GwyDataLine"
 
@@ -167,10 +169,7 @@ gwy_data_line_new_alike(GwyDataLine *model,
     else
         data_line->data = g_new(gdouble, data_line->res);
 
-    if (model->si_unit_x)
-        data_line->si_unit_x = gwy_si_unit_duplicate(model->si_unit_x);
-    if (model->si_unit_y)
-        data_line->si_unit_y = gwy_si_unit_duplicate(model->si_unit_y);
+    gwy_data_line_copy_units(model, data_line);
 
     return data_line;
 }
@@ -205,11 +204,7 @@ gwy_data_line_new_resampled(GwyDataLine *data_line,
 
     result = gwy_data_line_new(res, data_line->real, FALSE);
     result->off = data_line->off;
-    if (data_line->si_unit_x)
-        result->si_unit_x = gwy_si_unit_duplicate(data_line->si_unit_x);
-    if (data_line->si_unit_y)
-        result->si_unit_y = gwy_si_unit_duplicate(data_line->si_unit_y);
-
+    gwy_data_line_copy_units(data_line, result);
     gwy_interpolation_resample_block_1d(data_line->res, data_line->data,
                                         result->res, result->data,
                                         interpolation, TRUE);
@@ -222,24 +217,19 @@ gwy_data_line_serialize(GObject *obj,
                         GByteArray *buffer)
 {
     GwyDataLine *data_line;
-    gdouble *poff;
-
-    gwy_debug("");
-    g_return_val_if_fail(GWY_IS_DATA_LINE(obj), NULL);
+    gpointer poff, pxunit, pyunit;
 
     data_line = GWY_DATA_LINE(obj);
-    if (!data_line->si_unit_x)
-        data_line->si_unit_x = gwy_si_unit_new(NULL);
-    if (!data_line->si_unit_y)
-        data_line->si_unit_y = gwy_si_unit_new(NULL);
     poff = data_line->off ? &data_line->off : NULL;
+    pxunit = unit_pointer_if_nonempty(data_line->si_unit_x);
+    pyunit = unit_pointer_if_nonempty(data_line->si_unit_y);
     {
         GwySerializeSpec spec[] = {
             { 'i', "res", &data_line->res, NULL, },
             { 'd', "real", &data_line->real, NULL, },
             { 'd', "off", poff, NULL, },
-            { 'o', "si_unit_x", &data_line->si_unit_x, NULL, },
-            { 'o', "si_unit_y", &data_line->si_unit_y, NULL, },
+            { 'o', "si_unit_x", pxunit, NULL, },
+            { 'o', "si_unit_y", pyunit, NULL, },
             { 'D', "data", &data_line->data, &data_line->res, },
         };
 
@@ -253,22 +243,19 @@ static gsize
 gwy_data_line_get_size(GObject *obj)
 {
     GwyDataLine *data_line;
-
-    gwy_debug("");
-    g_return_val_if_fail(GWY_IS_DATA_LINE(obj), 0);
+    gpointer poff, pxunit, pyunit;
 
     data_line = GWY_DATA_LINE(obj);
-    if (!data_line->si_unit_x)
-        data_line->si_unit_x = gwy_si_unit_new(NULL);
-    if (!data_line->si_unit_y)
-        data_line->si_unit_y = gwy_si_unit_new(NULL);
+    poff = data_line->off ? &data_line->off : NULL;
+    pxunit = unit_pointer_if_nonempty(data_line->si_unit_x);
+    pyunit = unit_pointer_if_nonempty(data_line->si_unit_y);
     {
         GwySerializeSpec spec[] = {
             { 'i', "res", &data_line->res, NULL, },
             { 'd', "real", &data_line->real, NULL, },
-            { 'd', "off", &data_line->off, NULL, },
-            { 'o', "si_unit_x", &data_line->si_unit_x, NULL, },
-            { 'o', "si_unit_y", &data_line->si_unit_y, NULL, },
+            { 'd', "off", poff, NULL, },
+            { 'o', "si_unit_x", pxunit, NULL, },
+            { 'o', "si_unit_y", pyunit, NULL, },
             { 'D', "data", &data_line->data, &data_line->res, },
         };
 
@@ -296,7 +283,6 @@ gwy_data_line_deserialize(const guchar *buffer,
       { 'D', "data", &data, &fsize, },
     };
 
-    gwy_debug("");
     g_return_val_if_fail(buffer, NULL);
 
     if (!gwy_serialize_unpack_object_struct(buffer, size, position,
@@ -339,7 +325,6 @@ gwy_data_line_duplicate_real(GObject *object)
 {
     GwyDataLine *data_line, *duplicate;
 
-    g_return_val_if_fail(GWY_IS_DATA_LINE(object), NULL);
     data_line = GWY_DATA_LINE(object);
     duplicate = gwy_data_line_new_alike(data_line, FALSE);
     gwy_assign(duplicate->data, data_line->data, data_line->res);
@@ -367,21 +352,8 @@ gwy_data_line_clone_real(GObject *source, GObject *copy)
     gwy_assign(clone->data, data_line->data, data_line->res);
 
     /* SI Units can be NULL */
-    if (data_line->si_unit_x && clone->si_unit_x)
-        gwy_serializable_clone(G_OBJECT(data_line->si_unit_x),
-                               G_OBJECT(clone->si_unit_x));
-    else if (data_line->si_unit_x && !clone->si_unit_x)
-        clone->si_unit_x = gwy_si_unit_duplicate(data_line->si_unit_x);
-    else if (!data_line->si_unit_x && clone->si_unit_x)
-        GWY_OBJECT_UNREF(clone->si_unit_x);
-
-    if (data_line->si_unit_y && clone->si_unit_y)
-        gwy_serializable_clone(G_OBJECT(data_line->si_unit_y),
-                               G_OBJECT(clone->si_unit_y));
-    else if (data_line->si_unit_y && !clone->si_unit_y)
-        clone->si_unit_y = gwy_si_unit_duplicate(data_line->si_unit_y);
-    else if (!data_line->si_unit_y && clone->si_unit_y)
-        GWY_OBJECT_UNREF(clone->si_unit_y);
+    _gwy_assign_si_unit(data_line->si_unit_x, &clone->si_unit_x);
+    _gwy_assign_si_unit(data_line->si_unit_y, &clone->si_unit_y);
 }
 
 /**
@@ -487,11 +459,7 @@ gwy_data_line_part_extract(GwyDataLine *data_line,
 
     result = gwy_data_line_new(len, data_line->real*len/data_line->res, FALSE);
     gwy_assign(result->data, data_line->data + from, len);
-
-    if (data_line->si_unit_x)
-        result->si_unit_x = gwy_si_unit_duplicate(data_line->si_unit_x);
-    if (data_line->si_unit_y)
-        result->si_unit_y = gwy_si_unit_duplicate(data_line->si_unit_y);
+    gwy_data_line_copy_units(data_line, result);
 
     return result;
 }
@@ -499,7 +467,7 @@ gwy_data_line_part_extract(GwyDataLine *data_line,
 /**
  * gwy_data_line_copy:
  * @data_line: Source data line.
- * @b: Destination data line.
+ * @target: Destination data line.
  *
  * Copies the contents of a data line to another already allocated data line
  * of the same size.
@@ -755,13 +723,7 @@ gwy_data_line_set_si_unit_x(GwyDataLine *data_line,
                             GwySIUnit *si_unit)
 {
     g_return_if_fail(GWY_IS_DATA_LINE(data_line));
-    g_return_if_fail(GWY_IS_SI_UNIT(si_unit));
-    if (data_line->si_unit_x == si_unit)
-        return;
-
-    GWY_OBJECT_UNREF(data_line->si_unit_x);
-    g_object_ref(si_unit);
-    data_line->si_unit_x = si_unit;
+    _gwy_set_object_si_unit(si_unit, &data_line->si_unit_x);
 }
 
 /**
@@ -769,7 +731,7 @@ gwy_data_line_set_si_unit_x(GwyDataLine *data_line,
  * @data_line: A data line.
  * @si_unit: SI unit to be set.
  *
- * Sets the SI unit corresponding to the "height" (Z) dimension of a data
+ * Sets the SI unit corresponding to the "height" (Y) dimension of a data
  * line.
  *
  * It does not assume a reference on @si_unit, instead it adds its own
@@ -780,13 +742,7 @@ gwy_data_line_set_si_unit_y(GwyDataLine *data_line,
                             GwySIUnit *si_unit)
 {
     g_return_if_fail(GWY_IS_DATA_LINE(data_line));
-    g_return_if_fail(GWY_IS_SI_UNIT(si_unit));
-    if (data_line->si_unit_y == si_unit)
-        return;
-
-    GWY_OBJECT_UNREF(data_line->si_unit_y);
-    g_object_ref(si_unit);
-    data_line->si_unit_y = si_unit;
+    _gwy_set_object_si_unit(si_unit, &data_line->si_unit_y);
 }
 
 /**
@@ -851,6 +807,44 @@ gwy_data_line_get_value_format_y(GwyDataLine *data_line,
 }
 
 /**
+ * gwy_data_line_copy_units:
+ * @data_line: A data line.
+ * @target: Destination data line.
+ *
+ * Sets lateral and value units of a data line to match another data line.
+ *
+ * Since: 2.49
+ **/
+void
+gwy_data_line_copy_units(GwyDataLine *data_line,
+                         GwyDataLine *target)
+{
+    g_return_if_fail(GWY_IS_DATA_LINE(data_line));
+    g_return_if_fail(GWY_IS_DATA_LINE(target));
+
+    _gwy_assign_si_unit(data_line->si_unit_x, &target->si_unit_x);
+    _gwy_assign_si_unit(data_line->si_unit_y, &target->si_unit_y);
+}
+
+/**
+ * gwy_data_line_copy_units_to_data_field:
+ * @data_line: A data line to get units from.
+ * @data_field: A data field to set units of.
+ *
+ * Sets lateral and value units of a data field to match a data line.
+ **/
+void
+gwy_data_line_copy_units_to_data_field(GwyDataLine *data_line,
+                                       GwyDataField *data_field)
+{
+    g_return_if_fail(GWY_IS_DATA_LINE(data_line));
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+
+    _gwy_assign_si_unit(data_line->si_unit_x, &data_field->si_unit_xy);
+    _gwy_assign_si_unit(data_line->si_unit_y, &data_field->si_unit_z);
+}
+
+/**
  * gwy_data_line_itor:
  * @data_line: A data line.
  * @pixpos: Pixel coordinate.
@@ -1610,7 +1604,6 @@ gwy_data_line_sqrt(GwyDataLine *data_line)
     }
 }
 
-
 /************************** Documentation ****************************/
 
 /**
diff --git a/libprocess/dataline.h b/libprocess/dataline.h
index 9690eb0..88b622c 100644
--- a/libprocess/dataline.h
+++ b/libprocess/dataline.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: dataline.h 18119 2016-01-19 11:01:32Z yeti-dn $
+ *  @(#) $Id: dataline.h 20128 2017-08-01 11:19:59Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -85,7 +85,7 @@ GwyDataLine*   gwy_data_line_part_extract          (GwyDataLine *data_line,
                                                     gint from,
                                                     gint len);
 void           gwy_data_line_copy                  (GwyDataLine *data_line,
-                                                    GwyDataLine *b);
+                                                    GwyDataLine *target);
 gdouble*       gwy_data_line_get_data              (GwyDataLine *data_line);
 const gdouble* gwy_data_line_get_data_const        (GwyDataLine *data_line);
 gint           gwy_data_line_get_res               (GwyDataLine *data_line);
@@ -107,6 +107,8 @@ GwySIValueFormat* gwy_data_line_get_value_format_x (GwyDataLine *data_line,
 GwySIValueFormat* gwy_data_line_get_value_format_y (GwyDataLine *data_line,
                                                     GwySIUnitFormatStyle style,
                                                     GwySIValueFormat *format);
+void           gwy_data_line_copy_units            (GwyDataLine *data_line,
+                                                    GwyDataLine *target);
 gdouble        gwy_data_line_itor                  (GwyDataLine *data_line,
                                                     gdouble pixpos);
 gdouble        gwy_data_line_rtoi                  (GwyDataLine *data_line,
diff --git a/libprocess/dwt.c b/libprocess/dwt.c
index ccefc72..e15936d 100644
--- a/libprocess/dwt.c
+++ b/libprocess/dwt.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: dwt.c 19108 2016-10-21 08:50:43Z yeti-dn $
+ *  @(#) $Id: dwt.c 19698 2017-05-03 20:18:10Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -19,12 +19,11 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-#include "config.h"
 #include <string.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
-#include <libprocess/dwt.h>
 #include <libprocess/stats.h>
+#include <libprocess/dwt.h>
 
 typedef struct {
     gint ncof;
diff --git a/libprocess/elliptic.c b/libprocess/elliptic.c
index c0ed24b..2c3382b 100644
--- a/libprocess/elliptic.c
+++ b/libprocess/elliptic.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: elliptic.c 19036 2016-10-08 10:32:41Z yeti-dn $
- *  Copyright (C) 2005-2006 David Necas (Yeti), Petr Klapetek, Chris Anderson.
+ *  @(#) $Id: elliptic.c 20283 2017-08-15 08:54:48Z yeti-dn $
+ *  Copyright (C) 2005-2017 David Necas (Yeti), Petr Klapetek, Chris Anderson.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, sidewinder.asu at gmail.com.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -19,7 +19,6 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-#include "config.h"
 #include <string.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
@@ -255,6 +254,114 @@ gwy_data_field_get_elliptic_area_size(gint width,
 }
 
 /**
+ * gwy_data_field_local_maximum:
+ * @dfield: A two-dimensional data field.
+ * @x: Approximate maximum @x-location to be improved (in pixels).
+ * @y: Approximate maximum @y-location to be improved (in pixels).
+ * @ax: Horizontal search radius.
+ * @ay: Vertical search radius.
+ *
+ * Searches an elliptical area in a data field for local maximum.
+ *
+ * The area may stick outside the data field.
+ *
+ * The function first finds the maximum within the ellipse, intersected with
+ * the data field and then tries subpixel refinement.  The maximum is
+ * considered successfully located if it is inside the data field, i.e. not on
+ * edge, there is no higher value in its 8-neighbourhood, and the subpixel
+ * refinement of its position succeeds (which usually happens when the
+ * first two conditions are met, but not always).
+ *
+ * Even if the function returns %FALSE the values of @x and @y are reasonable,
+ * but they may not correspond to an actual maximum.
+ *
+ * The radii can be zero.  A single pixel is then examined, but if it is indeed
+ * a local maximum, its position is refined.
+ *
+ * Returns: %TRUE if the maximum was successfully located.  %FALSE when the
+ *          location is problematic and should not be used.
+ *
+ * Since: 2.49
+ **/
+gboolean
+gwy_data_field_local_maximum(GwyDataField *dfield,
+                             gdouble *x, gdouble *y,
+                             gint ax, gint ay)
+{
+    gint xj,yi, mi, mj, i, j, k;
+    gint xres, yres, xfrom, xto, yfrom, yto;
+    gdouble xx, yy, v, max;
+    const gdouble *d;
+    gdouble z[9];
+    gboolean ok;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(dfield), FALSE);
+    g_return_val_if_fail(x, FALSE);
+    g_return_val_if_fail(y, FALSE);
+
+    xres = dfield->xres;
+    yres = dfield->yres;
+    xj = (gint)(*x);
+    yi = (gint)(*y);
+    ax = ABS(ax);
+    ay = ABS(ay);
+
+    gwy_debug("searching around: %g, %g (%d+-%d, %d+-%d)",
+              *x, *y, xj, ax, yi, ay);
+    mi = mj = 0;
+    max = -G_MAXDOUBLE;
+    yfrom = MAX(yi - ay, 0) - yi;
+    yto = MIN(yi + ay, yres-1) - yi;
+    for (i = yfrom; i <= yto; i++) {
+        v = i/(ay + 0.5);
+        k = (gint)floor((ax + 0.5)*sqrt(1.0 - v*v));
+        xfrom = MAX(xj - k, 0) - xj;
+        xto = MIN(xj + k, xres-1) - xj;
+        d = dfield->data + (i + yi)*xres + (xj + xfrom);
+        for (j = xfrom; j <= xto; j++, d++) {
+            if (*d > max) {
+                max = *d;
+                mi = i;
+                mj = j;
+            }
+        }
+    }
+    mj += xj;
+    mi += yi;
+    gwy_debug("pixel maximum at: %d, %d", mj, mi);
+
+    /* No pixels found at all. */
+    if (max == -G_MAXDOUBLE)
+        return FALSE;
+
+    /* Data field edge. */
+    *x = mj;
+    *y = mi;
+    if (mi == 0 || mi == yres-1 || mj == 0 || mj == xres-1)
+        return FALSE;
+
+    d = dfield->data;
+    k = mi*xres + mj;
+    for (i = -1; i <= 1; i++) {
+        for (j = -1; j <= 1; j++) {
+            v = d[k + i*xres + j];
+            /* Not an actual maximum. */
+            if ((i || j) && v > max)
+                return FALSE;
+            z[3*(i + 1) + (j + 1)] = v;
+        }
+    }
+    ok = gwy_math_refine_maximum_2d(z, &xx, &yy);
+    gwy_debug("refinement by (%g, %g)", xx, yy);
+    if (!ok)
+        return FALSE;
+
+    *x += xx;
+    *y += yy;
+    return TRUE;
+}
+
+/**
  * gwy_data_field_circular_area_fill:
  * @data_field: A data field.
  * @col: Row index of circular area centre.
diff --git a/libprocess/elliptic.h b/libprocess/elliptic.h
index 32c8ac8..adb7d22 100644
--- a/libprocess/elliptic.h
+++ b/libprocess/elliptic.h
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: elliptic.h 15598 2013-11-11 12:33:32Z yeti-dn $
- *  Copyright (C) 2005-2006 David Necas (Yeti), Petr Klapetek, Chris Anderson.
+ *  @(#) $Id: elliptic.h 20129 2017-08-01 20:01:48Z yeti-dn $
+ *  Copyright (C) 2005-2017 David Necas (Yeti), Petr Klapetek, Chris Anderson.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, sidewinder.asu at gmail.com.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -26,49 +26,54 @@
 
 G_BEGIN_DECLS
 
-gint gwy_data_field_elliptic_area_fill            (GwyDataField *data_field,
-                                                   gint col,
-                                                   gint row,
-                                                   gint width,
-                                                   gint height,
-                                                   gdouble value);
-gint gwy_data_field_elliptic_area_extract         (GwyDataField *data_field,
-                                                   gint col,
-                                                   gint row,
-                                                   gint width,
-                                                   gint height,
-                                                   gdouble *data);
-void gwy_data_field_elliptic_area_unextract       (GwyDataField *data_field,
-                                                   gint col,
-                                                   gint row,
-                                                   gint width,
-                                                   gint height,
-                                                   const gdouble *data);
-gint gwy_data_field_get_elliptic_area_size        (gint width,
-                                                   gint height);
-gint gwy_data_field_circular_area_fill            (GwyDataField *data_field,
-                                                   gint col,
-                                                   gint row,
-                                                   gdouble radius,
-                                                   gdouble value);
-gint gwy_data_field_circular_area_extract         (GwyDataField *data_field,
-                                                   gint col,
-                                                   gint row,
-                                                   gdouble radius,
-                                                   gdouble *data);
-gint gwy_data_field_circular_area_extract_with_pos(GwyDataField *data_field,
-                                                   gint col,
-                                                   gint row,
-                                                   gdouble radius,
-                                                   gdouble *data,
-                                                   gint *xpos,
-                                                   gint *ypos);
-void gwy_data_field_circular_area_unextract       (GwyDataField *data_field,
-                                                   gint col,
-                                                   gint row,
-                                                   gdouble radius,
-                                                   const gdouble *data);
-gint gwy_data_field_get_circular_area_size        (gdouble radius);
+gint     gwy_data_field_elliptic_area_fill            (GwyDataField *data_field,
+                                                       gint col,
+                                                       gint row,
+                                                       gint width,
+                                                       gint height,
+                                                       gdouble value);
+gint     gwy_data_field_elliptic_area_extract         (GwyDataField *data_field,
+                                                       gint col,
+                                                       gint row,
+                                                       gint width,
+                                                       gint height,
+                                                       gdouble *data);
+void     gwy_data_field_elliptic_area_unextract       (GwyDataField *data_field,
+                                                       gint col,
+                                                       gint row,
+                                                       gint width,
+                                                       gint height,
+                                                       const gdouble *data);
+gint     gwy_data_field_get_elliptic_area_size        (gint width,
+                                                       gint height);
+gint     gwy_data_field_circular_area_fill            (GwyDataField *data_field,
+                                                       gint col,
+                                                       gint row,
+                                                       gdouble radius,
+                                                       gdouble value);
+gint     gwy_data_field_circular_area_extract         (GwyDataField *data_field,
+                                                       gint col,
+                                                       gint row,
+                                                       gdouble radius,
+                                                       gdouble *data);
+gint     gwy_data_field_circular_area_extract_with_pos(GwyDataField *data_field,
+                                                       gint col,
+                                                       gint row,
+                                                       gdouble radius,
+                                                       gdouble *data,
+                                                       gint *xpos,
+                                                       gint *ypos);
+void     gwy_data_field_circular_area_unextract       (GwyDataField *data_field,
+                                                       gint col,
+                                                       gint row,
+                                                       gdouble radius,
+                                                       const gdouble *data);
+gint     gwy_data_field_get_circular_area_size        (gdouble radius);
+gboolean gwy_data_field_local_maximum                 (GwyDataField *dfield,
+                                                       gdouble *x,
+                                                       gdouble *y,
+                                                       gint ax,
+                                                       gint ay);
 
 G_END_DECLS
 
diff --git a/libprocess/filters-minmax.c b/libprocess/filters-minmax.c
new file mode 100644
index 0000000..b0d9247
--- /dev/null
+++ b/libprocess/filters-minmax.c
@@ -0,0 +1,1574 @@
+/*
+ *  @(#) $Id: filters-minmax.c 19698 2017-05-03 20:18:10Z yeti-dn $
+ *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libprocess/filters.h>
+#include <libprocess/elliptic.h>
+#include <libprocess/stats.h>
+#include <libprocess/linestats.h>
+#include <libprocess/grains.h>
+#include "gwyprocessinternal.h"
+
+/* Data for one row.  To be used in conjuction with MinMaxPrecomputedReq. */
+typedef struct {
+    gdouble *storage;
+    gdouble **each;
+    gdouble **even;
+} MinMaxPrecomputedRow;
+
+typedef struct {
+    guint sublen1;   /* Even length for the even-odd scheme. */
+    guint sublen2;
+    gboolean needed;
+    gboolean even_even : 1;
+    gboolean even_odd : 1;
+} MinMaxPrecomputedLen;
+
+/* Resolved set of required block lengths and the rules how to compute them. */
+typedef struct {
+    /* NB: The array sizes are maxlen_even+1 and maxlen_each+1 because maxlen
+     * is really the maximum length, inclusive. */
+    MinMaxPrecomputedLen *each;
+    MinMaxPrecomputedLen *even;
+    guint maxlen_each;
+    guint maxlen_even;
+    guint nbuffers;   /* The actual number of row buffers (for storage size) */
+} MinMaxPrecomputedReq;
+
+typedef struct {
+    guint row;
+    guint col;
+    guint len;
+} MaskSegment;
+
+typedef struct {
+    MaskSegment *segments;
+    guint nsegments;
+} MaskRLE;
+
+typedef struct {
+    MaskRLE *mrle;
+    MinMaxPrecomputedReq *req;
+    MinMaxPrecomputedRow **prows;
+    gdouble *extrowbuf;
+    guint rowbuflen;
+    guint kxres;
+    guint kyres;
+} MinMaxPrecomputed;
+
+typedef void (*MinMaxPrecomputedRowFill)(const MinMaxPrecomputedReq *req,
+                                         MinMaxPrecomputedRow *prow,
+                                         const gdouble *x,
+                                         guint rowlen);
+
+static void find_required_lengths_recursive(MinMaxPrecomputedReq *req,
+                                            guint blocklen,
+                                            gboolean is_even);
+
+/**
+ * gwy_data_field_area_filter_minimum:
+ * @data_field: A data field to apply minimum filter to.
+ * @size: Neighbourhood size for minimum search.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ *
+ * Filters a rectangular part of a data field with minimum filter.
+ *
+ * This operation is often called erosion filter.
+ **/
+void
+gwy_data_field_area_filter_minimum(GwyDataField *data_field,
+                                   gint size,
+                                   gint col,
+                                   gint row,
+                                   gint width,
+                                   gint height)
+{
+    GwyDataField *buffer, *buffer2;
+    gint d, i, j, ip, ii, im, jp, jm;
+    gint ep, em;  /* positive and negative excess */
+    gdouble *buf, *buf2;
+    gdouble v;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    g_return_if_fail(col >= 0 && row >= 0
+                     && width > 0 && height > 0
+                     && col + width <= data_field->xres
+                     && row + height <= data_field->yres);
+    g_return_if_fail(size > 0);
+    if (size == 1)
+        return;
+
+    /* FIXME: does this silly case need an alternative implementation? */
+    if (size/2 >= MIN(width, height)) {
+        g_warning("Too large kernel size for too small area.");
+        return;
+    }
+
+    buffer = gwy_data_field_new(width, height, 1.0, 1.0, FALSE);
+    buffer2 = gwy_data_field_new(width, height, 1.0, 1.0, FALSE);
+    buf = buffer->data;
+    buf2 = buffer2->data;
+
+    d = 1;
+    gwy_data_field_area_copy(data_field, buffer, col, row, width, height, 0, 0);
+    while (3*d < size) {
+        for (i = 0; i < height; i++) {
+            ii = i*width;
+            im = MAX(i - d, 0)*width;
+            ip = MIN(i + d, height-1)*width;
+            for (j = 0; j < width; j++) {
+                jm = MAX(j - d, 0);
+                jp = MIN(j + d, width-1);
+
+                v = MIN(buf[im + jm], buf[im + jp]);
+                if (v > buf[im + j])
+                    v = buf[im + j];
+                if (v > buf[ii + jm])
+                    v = buf[ii + jm];
+                if (v > buf[ii + j])
+                    v = buf[ii + j];
+                if (v > buf[ip + j])
+                    v = buf[ip + j];
+                if (v > buf[ii + jp])
+                    v = buf[ii + jp];
+                if (v > buf[ip + jm])
+                    v = buf[ip + jm];
+                if (v > buf[ip + jp])
+                    v = buf[ip + jp];
+
+                buf2[ii + j] = v;
+            }
+        }
+        /* XXX: This breaks the relation between buffer and buf */
+        GWY_SWAP(gdouble*, buf, buf2);
+        d *= 3;
+    }
+
+
+    /* Now we have to overlay the neighbourhoods carefully to get exactly
+     * @size-sized squares.  There are two cases:
+     * 1. @size <= 2*d, it's enough to take four corner representants
+     * 2. @size > 2*d, it's necessary to take all nine representants
+     */
+    ep = size/2;
+    em = (size - 1)/2;
+
+    for (i = 0; i < height; i++) {
+        ii = i*width;
+        im = (MAX(i - em, 0) + d/2)*width;
+        ip = (MIN(i + ep, height-1) - d/2)*width;
+
+        for (j = 0; j < width; j++) {
+            jm = MAX(j - em, 0) + d/2;
+            jp = MIN(j + ep, width-1) - d/2;
+
+            v = MIN(buf[im + jm], buf[im + jp]);
+            if (2*d < size) {
+                if (v > buf[im + j])
+                    v = buf[im + j];
+                if (v > buf[ii + jm])
+                    v = buf[ii + jm];
+                if (v > buf[ii + j])
+                    v = buf[ii + j];
+                if (v > buf[ii + jp])
+                    v = buf[ii + jp];
+                if (v > buf[ip + j])
+                    v = buf[ip + j];
+            }
+            if (v > buf[ip + jm])
+                v = buf[ip + jm];
+            if (v > buf[ip + jp])
+                v = buf[ip + jp];
+
+            buf2[ii + j] = v;
+        }
+    }
+    buffer->data = buf;
+    buffer2->data = buf2;
+
+    gwy_data_field_area_copy(buffer2, data_field,
+                             0, 0, width, height, col, row);
+
+    g_object_unref(buffer2);
+    g_object_unref(buffer);
+}
+
+/**
+ * gwy_data_field_filter_minimum:
+ * @data_field: A data field to apply minimum filter to.
+ * @size: Neighbourhood size for minimum search.
+ *
+ * Filters a data field with minimum filter.
+ **/
+void
+gwy_data_field_filter_minimum(GwyDataField *data_field,
+                              gint size)
+{
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    gwy_data_field_area_filter_minimum(data_field, size, 0, 0,
+                                       data_field->xres, data_field->yres);
+}
+
+/**
+ * gwy_data_field_area_filter_maximum:
+ * @data_field: A data field to apply maximum filter to.
+ * @size: Neighbourhood size for maximum search.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ *
+ * Filters a rectangular part of a data field with maximum filter.
+ *
+ * This operation is often called dilation filter.
+ **/
+void
+gwy_data_field_area_filter_maximum(GwyDataField *data_field,
+                                   gint size,
+                                   gint col,
+                                   gint row,
+                                   gint width,
+                                   gint height)
+{
+    GwyDataField *buffer, *buffer2;
+    gint d, i, j, ip, ii, im, jp, jm;
+    gint ep, em;  /* positive and negative excess */
+    gdouble *buf, *buf2;
+    gdouble v;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    g_return_if_fail(col >= 0 && row >= 0
+                     && width > 0 && height > 0
+                     && col + width <= data_field->xres
+                     && row + height <= data_field->yres);
+    g_return_if_fail(size > 0);
+    if (size == 1)
+        return;
+
+    /* FIXME: does this silly case need an alternative implementation? */
+    if (size/2 >= MIN(width, height)) {
+        g_warning("Too large kernel size for too small area.");
+        return;
+    }
+
+    buffer = gwy_data_field_new(width, height, 1.0, 1.0, FALSE);
+    buffer2 = gwy_data_field_new(width, height, 1.0, 1.0, FALSE);
+    buf = buffer->data;
+    buf2 = buffer2->data;
+
+    d = 1;
+    gwy_data_field_area_copy(data_field, buffer, col, row, width, height, 0, 0);
+    while (3*d < size) {
+        for (i = 0; i < height; i++) {
+            ii = i*width;
+            im = MAX(i - d, 0)*width;
+            ip = MIN(i + d, height-1)*width;
+            for (j = 0; j < width; j++) {
+                jm = MAX(j - d, 0);
+                jp = MIN(j + d, width-1);
+
+                v = MAX(buf[im + jm], buf[im + jp]);
+                if (v < buf[im + j])
+                    v = buf[im + j];
+                if (v < buf[ii + jm])
+                    v = buf[ii + jm];
+                if (v < buf[ii + j])
+                    v = buf[ii + j];
+                if (v < buf[ip + j])
+                    v = buf[ip + j];
+                if (v < buf[ii + jp])
+                    v = buf[ii + jp];
+                if (v < buf[ip + jm])
+                    v = buf[ip + jm];
+                if (v < buf[ip + jp])
+                    v = buf[ip + jp];
+
+                buf2[ii + j] = v;
+            }
+        }
+        /* XXX: This breaks the relation between buffer and buf */
+        GWY_SWAP(gdouble*, buf, buf2);
+        d *= 3;
+    }
+
+
+    /* Now we have to overlay the neighbourhoods carefully to get exactly
+     * @size-sized squares.  There are two cases:
+     * 1. @size <= 2*d, it's enough to take four corner representants
+     * 2. @size > 2*d, it's necessary to take all nine representants
+     */
+    ep = size/2;
+    em = (size - 1)/2;
+
+    for (i = 0; i < height; i++) {
+        ii = i*width;
+        im = (MAX(i - em, 0) + d/2)*width;
+        ip = (MIN(i + ep, height-1) - d/2)*width;
+
+        for (j = 0; j < width; j++) {
+            jm = MAX(j - em, 0) + d/2;
+            jp = MIN(j + ep, width-1) - d/2;
+
+            v = MAX(buf[im + jm], buf[im + jp]);
+            if (2*d < size) {
+                if (v < buf[im + j])
+                    v = buf[im + j];
+                if (v < buf[ii + jm])
+                    v = buf[ii + jm];
+                if (v < buf[ii + j])
+                    v = buf[ii + j];
+                if (v < buf[ii + jp])
+                    v = buf[ii + jp];
+                if (v < buf[ip + j])
+                    v = buf[ip + j];
+            }
+            if (v < buf[ip + jm])
+                v = buf[ip + jm];
+            if (v < buf[ip + jp])
+                v = buf[ip + jp];
+
+            buf2[ii + j] = v;
+        }
+    }
+    buffer->data = buf;
+    buffer2->data = buf2;
+
+    gwy_data_field_area_copy(buffer2, data_field,
+                             0, 0, width, height, col, row);
+
+    g_object_unref(buffer2);
+    g_object_unref(buffer);
+}
+
+/**
+ * gwy_data_field_filter_maximum:
+ * @data_field: A data field to apply maximum filter to.
+ * @size: Neighbourhood size for maximum search.
+ *
+ * Filters a data field with maximum filter.
+ **/
+void
+gwy_data_field_filter_maximum(GwyDataField *data_field,
+                              gint size)
+{
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    gwy_data_field_area_filter_maximum(data_field, size, 0, 0,
+                                       data_field->xres, data_field->yres);
+}
+
+static inline gboolean
+maybe_set_req(MinMaxPrecomputedLen *precomp)
+{
+    if (precomp->needed)
+        return TRUE;
+
+    precomp->needed = TRUE;
+    return FALSE;
+}
+
+static inline void
+fill_req_subs(MinMaxPrecomputedLen *precomp,
+              guint sublen1, guint sublen2,
+              gboolean even_odd, gboolean even_even)
+{
+    precomp->sublen1 = sublen1;
+    precomp->sublen2 = sublen2;
+    precomp->even_even = even_even;
+    precomp->even_odd = even_odd;
+    g_assert(!even_odd || !even_even);
+    g_assert(!even_odd || sublen1 % 2 == 0);
+    g_assert(!even_even || (sublen1 % 2 == 0 && sublen2 % 2 == 0));
+}
+
+static void
+find_required_lengths_recursive(MinMaxPrecomputedReq *req,
+                                guint blocklen, gboolean is_even)
+{
+    MinMaxPrecomputedLen *precomp;
+    guint i, j, any = 0;
+
+    g_assert(blocklen);
+
+    if (is_even) {
+        g_assert(blocklen % 2 == 0);
+
+        precomp = req->even + blocklen;
+        if (maybe_set_req(precomp))
+            return;
+
+        if (blocklen == 2) {
+            /* Even(2) = Each(1) + Each(1) */
+            fill_req_subs(precomp, 1, 1, FALSE, FALSE);
+            find_required_lengths_recursive(req, 1, FALSE);
+        }
+        else if (blocklen % 4 == 0) {
+            /* Even(4m) = Even(2m) + Even(2m) */
+            fill_req_subs(precomp, blocklen/2, blocklen/2, FALSE, TRUE);
+            find_required_lengths_recursive(req, blocklen/2, TRUE);
+        }
+        else if (blocklen % 4 == 2) {
+            /* Even(4m+2) = Even(2m+2) + Even(2m) */
+            fill_req_subs(precomp, blocklen/2 - 1, blocklen/2 + 1, FALSE, TRUE);
+            find_required_lengths_recursive(req, blocklen/2 - 1, TRUE);
+            find_required_lengths_recursive(req, blocklen/2 + 1, TRUE);
+        }
+        else {
+            g_assert_not_reached();
+        }
+    }
+    else {
+        precomp = req->each + blocklen;
+        if (maybe_set_req(precomp))
+            return;
+
+        if (blocklen == 1) {
+            /* Even(1), this is always required.  There is no construction
+             * rule, of course.*/
+            req->each[1].needed = TRUE;
+        }
+        else if (blocklen % 2 == 0) {
+            /* Try to find a split into two existing lengths. */
+            for (i = 1, j = blocklen-1; i < (blocklen + 1)/2; i++, j--) {
+                if (req->each[i].needed && req->each[j].needed) {
+                    fill_req_subs(precomp, i, j, FALSE, FALSE);
+                    return;
+                }
+            }
+
+            /* Each(2m) = Each(m) + Each(m) */
+            fill_req_subs(precomp, blocklen/2, blocklen/2, FALSE, FALSE);
+            find_required_lengths_recursive(req, blocklen/2, FALSE);
+        }
+        else if (blocklen % 2 == 1) {
+            /* Try to find a split into two existing lengths. */
+            for (i = 1, j = blocklen-1; i < (blocklen + 1)/2; i++, j--) {
+                if (req->each[i].needed && req->each[j].needed) {
+                    fill_req_subs(precomp, i, j, FALSE, FALSE);
+                    return;
+                }
+                if (req->even[i].needed && req->each[j].needed) {
+                    fill_req_subs(precomp, i, j, TRUE, FALSE);
+                    return;
+                }
+                if (req->each[i].needed && req->even[j].needed) {
+                    fill_req_subs(precomp, j, i, TRUE, FALSE);
+                    return;
+                }
+                if (req->each[i].needed)
+                    any = i;
+            }
+            /* Or split to one existing and one new. */
+            if (any) {
+                fill_req_subs(precomp, any, blocklen - any, FALSE, FALSE);
+                find_required_lengths_recursive(req, blocklen - any, FALSE);
+                return;
+            }
+
+            if (blocklen % 4 == 1) {
+                /* Each(4m+1) = Even(2m) + Each(2m+1), Each(2m+1) + Even(2m) */
+                fill_req_subs(precomp, blocklen/2, blocklen/2 + 1, TRUE, FALSE);
+                find_required_lengths_recursive(req, blocklen/2, TRUE);
+                find_required_lengths_recursive(req, blocklen/2 + 1, FALSE);
+            }
+            else if (blocklen % 4 == 3) {
+                /* Each(4m+3) = Even(2m+2) + Each(2m+1), Each(2m+1) + Even(2m+2) */
+                fill_req_subs(precomp, blocklen/2 + 1, blocklen/2, TRUE, FALSE);
+                find_required_lengths_recursive(req, blocklen/2 + 1, TRUE);
+                find_required_lengths_recursive(req, blocklen/2, FALSE);
+            }
+            else {
+                g_assert_not_reached();
+            }
+        }
+        else {
+            g_assert_not_reached();
+        }
+    }
+}
+
+static int
+compare_guint(const void *pa, const void *pb)
+{
+    guint a = *(const guint*)pa, b = *(const guint*)pb;
+
+    if (a < b)
+        return -1;
+    if (a > b)
+        return 1;
+    return 0;
+}
+
+static MinMaxPrecomputedReq*
+find_required_lengths_for_set(const guint *blocklens, guint nlens)
+{
+    MinMaxPrecomputedReq *req = g_new(MinMaxPrecomputedReq, 1);
+    guint *blens = g_new(guint, 2*nlens);
+    guint i, n, maxlen;
+
+    /* Find unique lengths and sort them in ascending order to blens[],
+     * starting ar position nlens. */
+    gwy_assign(blens, blocklens, nlens);
+    qsort(blens, nlens, sizeof(guint), compare_guint);
+
+    blens[nlens] = blens[0];
+    for (i = n = 1; i < nlens; i++) {
+        if (blens[i] > blens[i-1])
+            blens[nlens + n++] = blens[i];
+    }
+
+    maxlen = blens[nlens + n-1];
+    req->maxlen_each = maxlen;
+    req->maxlen_even = maxlen;
+    req->each = g_new0(MinMaxPrecomputedLen, maxlen+1);
+    req->even = g_new0(MinMaxPrecomputedLen, maxlen+1);
+    for (i = 0; i < n; i++)
+        find_required_lengths_recursive(req, blens[nlens + i], FALSE);
+
+    g_free(blens);
+
+    for (i = maxlen; i; i--) {
+        if (req->even[i].needed)
+            break;
+    }
+    req->maxlen_even = i;
+
+    req->nbuffers = 0;
+    for (i = 1; i <= req->maxlen_each; i++) {
+        if (req->each[i].needed)
+            req->nbuffers++;
+    }
+    for (i = 2; i <= req->maxlen_even; i++) {
+        if (req->even[i].needed)
+            req->nbuffers++;
+    }
+
+    return req;
+}
+
+static void
+min_max_precomputed_req_free(MinMaxPrecomputedReq *req)
+{
+    g_free(req->each);
+    g_free(req->even);
+    g_free(req);
+}
+
+/* Allocate data buffers for all lengths.  Do not allocate the Each(1) buffer,
+ * we use a direct pointer to the data row for that. */
+static MinMaxPrecomputedRow*
+min_max_precomputed_row_alloc(const MinMaxPrecomputedReq *req,
+                              guint rowlen)
+{
+    MinMaxPrecomputedRow *prow = g_new0(MinMaxPrecomputedRow, 1);
+    gdouble *p;
+    guint i;
+
+    prow->storage = p = g_new(gdouble, rowlen*req->nbuffers);
+    prow->each = g_new0(gdouble*, req->maxlen_each + 1);
+    if (req->maxlen_even)
+        prow->even = g_new0(gdouble*, req->maxlen_even + 1);
+
+    for (i = 1; i <= req->maxlen_each; i++) {
+        if (req->each[i].needed) {
+            prow->each[i] = p;
+            p += rowlen;
+        }
+    }
+    for (i = 2; i <= req->maxlen_even; i++) {
+        if (req->even[i].needed) {
+            prow->even[i] = p;
+            p += rowlen;
+        }
+    }
+
+    return prow;
+}
+
+static void
+compose_max_row_data_each(gdouble *target,
+                          const gdouble *sub1,
+                          guint sublen1,
+                          const gdouble *sub2,
+                          guint sublen2,
+                          guint rowlen)
+{
+    guint i, n;
+
+    g_return_if_fail(sublen1 + sublen2 <= rowlen);
+    g_return_if_fail(target);
+    g_return_if_fail(sub1);
+    g_return_if_fail(sub2);
+
+    sub2 += sublen1;
+    n = rowlen - (sublen1 + sublen2);
+    i = 0;
+    while (i <= n) {
+        target[i] = (*sub1 < *sub2) ? *sub2 : *sub1;
+        i++;
+        sub1++;
+        sub2++;
+    }
+}
+
+static void
+compose_max_row_data_even_odd(gdouble *target,
+                              const gdouble *even,
+                              guint evenlen,
+                              const gdouble *odd,
+                              guint oddlen,
+                              guint rowlen)
+{
+    const gdouble *even2, *odd2;
+    guint i, n;
+
+    g_return_if_fail(evenlen + oddlen <= rowlen);
+    g_return_if_fail(evenlen % 2 == 0);
+    g_return_if_fail(target);
+    g_return_if_fail(even);
+    g_return_if_fail(odd);
+
+    odd2 = odd + 1;
+    even2 = even + oddlen + 1;
+    odd += evenlen;
+    n = rowlen - (evenlen + oddlen);
+    i = 0;
+    while (i+1 <= n) {
+        /* Now even points to an even position. */
+        target[i] = (*even < *odd) ? *odd : *even;
+        i++;
+        even += 2;
+        odd += 2;
+
+        /* Now even2 points to an even position. */
+        target[i] = (*even2 < *odd2) ? *odd2 : *even2;
+        i++;
+        even2 += 2;
+        odd2 += 2;
+    }
+
+    if (i <= n) {
+        /* Now even points to an even position. */
+        target[i] = (*even < *odd) ? *odd : *even;
+        i++;
+    }
+    if (i <= n) {
+        /* Now even2 points to an even position. */
+        target[i] = (*even2 < *odd2) ? *odd2 : *even2;
+    }
+}
+
+static void
+compose_max_row_data_even(gdouble *target,
+                          const gdouble *sub1,
+                          guint sublen1,
+                          const gdouble *sub2,
+                          guint sublen2,
+                          guint rowlen)
+{
+    guint i, n;
+
+    g_return_if_fail(sublen1 + sublen2 <= rowlen);
+    g_return_if_fail(sublen1 % 2 == 0);
+    g_return_if_fail(sublen2 % 2 == 0);
+    g_return_if_fail(target);
+    g_return_if_fail(sub1);
+    g_return_if_fail(sub2);
+
+    sub2 += sublen1;
+    n = rowlen - (sublen1 + sublen2);
+    i = 0;
+    while (i <= n) {
+        target[i] = (*sub1 < *sub2) ? *sub2 : *sub1;
+        i += 2;
+        sub1 += 2;
+        sub2 += 2;
+    }
+}
+
+static void
+compose_max_row_data_two(gdouble *target,
+                         const gdouble *one,
+                         guint rowlen)
+{
+    guint i, n;
+
+    g_return_if_fail(2 <= rowlen);
+    g_return_if_fail(target);
+    g_return_if_fail(one);
+
+    n = rowlen - 2;
+    i = 0;
+    while (i <= n) {
+        target[i] = (*one < *(one + 1)) ? *(one + 1) : *one;
+        i += 2;
+        one += 2;
+    }
+}
+
+/* Precomputes maxima for row.  Minimum is always computed from given index
+ * blocklen values *forwards*, i.e. the block is not symmetrical it starts at
+ * the given index. */
+static void
+max_precomputed_row_fill(const MinMaxPrecomputedReq *req,
+                         MinMaxPrecomputedRow *prow,
+                         const gdouble *x,
+                         guint rowlen)
+{
+    guint blen;
+
+    /* The row itself, AKA Each(1). */
+    gwy_assign(prow->each[1], x, rowlen);
+
+    for (blen = 2; blen <= req->maxlen_each; blen++) {
+        const MinMaxPrecomputedLen *precomp;
+
+        precomp = req->each + blen;
+        if (precomp->needed) {
+            g_assert(!precomp->even_even);
+            if (precomp->even_odd) {
+                compose_max_row_data_even_odd(prow->each[blen],
+                                              prow->even[precomp->sublen1],
+                                              precomp->sublen1,
+                                              prow->each[precomp->sublen2],
+                                              precomp->sublen2,
+                                              rowlen);
+            }
+            else {
+                compose_max_row_data_each(prow->each[blen],
+                                          prow->each[precomp->sublen1],
+                                          precomp->sublen1,
+                                          prow->each[precomp->sublen2],
+                                          precomp->sublen2,
+                                          rowlen);
+            }
+        }
+
+        if (blen > req->maxlen_even)
+            continue;
+
+        precomp = req->even + blen;
+        if (precomp->needed) {
+            g_assert(!precomp->even_odd);
+            if (precomp->even_even) {
+                compose_max_row_data_even(prow->even[blen],
+                                          prow->even[precomp->sublen1],
+                                          precomp->sublen1,
+                                          prow->even[precomp->sublen2],
+                                          precomp->sublen2,
+                                          rowlen);
+            }
+            else {
+                g_assert(blen == 2);
+                g_assert(precomp->sublen1 == 1);
+                compose_max_row_data_two(prow->even[blen],
+                                         prow->each[precomp->sublen1],
+                                         rowlen);
+            }
+        }
+    }
+}
+
+static void
+compose_min_row_data_each(gdouble *target,
+                          const gdouble *sub1,
+                          guint sublen1,
+                          const gdouble *sub2,
+                          guint sublen2,
+                          guint rowlen)
+{
+    guint i, n;
+
+    g_return_if_fail(sublen1 + sublen2 <= rowlen);
+    g_return_if_fail(target);
+    g_return_if_fail(sub1);
+    g_return_if_fail(sub2);
+
+    sub2 += sublen1;
+    n = rowlen - (sublen1 + sublen2);
+    i = 0;
+    while (i <= n) {
+        target[i] = (*sub1 > *sub2) ? *sub2 : *sub1;
+        i++;
+        sub1++;
+        sub2++;
+    }
+}
+
+static void
+compose_min_row_data_even_odd(gdouble *target,
+                              const gdouble *even,
+                              guint evenlen,
+                              const gdouble *odd,
+                              guint oddlen,
+                              guint rowlen)
+{
+    const gdouble *even2, *odd2;
+    guint i, n;
+
+    g_return_if_fail(evenlen + oddlen <= rowlen);
+    g_return_if_fail(evenlen % 2 == 0);
+    g_return_if_fail(target);
+    g_return_if_fail(even);
+    g_return_if_fail(odd);
+
+    odd2 = odd + 1;
+    even2 = even + oddlen + 1;
+    odd += evenlen;
+    n = rowlen - (evenlen + oddlen);
+    i = 0;
+    while (i+1 <= n) {
+        /* Now even points to an even position. */
+        target[i] = (*even > *odd) ? *odd : *even;
+        i++;
+        even += 2;
+        odd += 2;
+
+        /* Now even2 points to an even position. */
+        target[i] = (*even2 > *odd2) ? *odd2 : *even2;
+        i++;
+        even2 += 2;
+        odd2 += 2;
+    }
+
+    if (i <= n) {
+        /* Now even points to an even position. */
+        target[i] = (*even > *odd) ? *odd : *even;
+        i++;
+    }
+    if (i <= n) {
+        /* Now even2 points to an even position. */
+        target[i] = (*even2 > *odd2) ? *odd2 : *even2;
+    }
+}
+
+static void
+compose_min_row_data_even(gdouble *target,
+                          const gdouble *sub1,
+                          guint sublen1,
+                          const gdouble *sub2,
+                          guint sublen2,
+                          guint rowlen)
+{
+    guint i, n;
+
+    g_return_if_fail(sublen1 + sublen2 <= rowlen);
+    g_return_if_fail(sublen1 % 2 == 0);
+    g_return_if_fail(sublen2 % 2 == 0);
+    g_return_if_fail(target);
+    g_return_if_fail(sub1);
+    g_return_if_fail(sub2);
+
+    sub2 += sublen1;
+    n = rowlen - (sublen1 + sublen2);
+    i = 0;
+    while (i <= n) {
+        target[i] = (*sub1 > *sub2) ? *sub2 : *sub1;
+        i += 2;
+        sub1 += 2;
+        sub2 += 2;
+    }
+}
+
+static void
+compose_min_row_data_two(gdouble *target,
+                         const gdouble *one,
+                         guint rowlen)
+{
+    guint i, n;
+
+    g_return_if_fail(2 <= rowlen);
+    g_return_if_fail(target);
+    g_return_if_fail(one);
+
+    n = rowlen - 2;
+    i = 0;
+    while (i <= n) {
+        target[i] = (*one > *(one + 1)) ? *(one + 1) : *one;
+        i += 2;
+        one += 2;
+    }
+}
+
+/* Precomputes minima for row.  Minimum is always computed from given index
+ * blocklen values *forwards*, i.e. the block is not symmetrical it starts at
+ * the given index. */
+static void
+min_precomputed_row_fill(const MinMaxPrecomputedReq *req,
+                         MinMaxPrecomputedRow *prow,
+                         const gdouble *x,
+                         guint rowlen)
+{
+    guint blen;
+
+    /* The row itself, AKA Each(1). */
+    gwy_assign(prow->each[1], x, rowlen);
+
+    for (blen = 2; blen <= req->maxlen_each; blen++) {
+        const MinMaxPrecomputedLen *precomp;
+
+        precomp = req->each + blen;
+        if (precomp->needed) {
+            g_assert(!precomp->even_even);
+            if (precomp->even_odd) {
+                compose_min_row_data_even_odd(prow->each[blen],
+                                              prow->even[precomp->sublen1],
+                                              precomp->sublen1,
+                                              prow->each[precomp->sublen2],
+                                              precomp->sublen2,
+                                              rowlen);
+            }
+            else {
+                compose_min_row_data_each(prow->each[blen],
+                                          prow->each[precomp->sublen1],
+                                          precomp->sublen1,
+                                          prow->each[precomp->sublen2],
+                                          precomp->sublen2,
+                                          rowlen);
+            }
+        }
+
+        if (blen > req->maxlen_even)
+            continue;
+
+        precomp = req->even + blen;
+        if (precomp->needed) {
+            g_assert(!precomp->even_odd);
+            if (precomp->even_even) {
+                compose_min_row_data_even(prow->even[blen],
+                                          prow->even[precomp->sublen1],
+                                          precomp->sublen1,
+                                          prow->even[precomp->sublen2],
+                                          precomp->sublen2,
+                                          rowlen);
+            }
+            else {
+                g_assert(blen == 2);
+                compose_min_row_data_two(prow->even[blen],
+                                         prow->each[precomp->sublen1],
+                                         rowlen);
+            }
+        }
+    }
+}
+
+static void
+min_max_precomputed_row_copy(MinMaxPrecomputedRow *target,
+                             const MinMaxPrecomputedRow *source,
+                             const MinMaxPrecomputedReq *req,
+                             guint rowlen)
+{
+    gwy_assign(target->storage, source->storage, rowlen*req->nbuffers);
+}
+
+static void
+min_max_precomputed_row_free(MinMaxPrecomputedRow *prow)
+{
+    g_free(prow->each);
+    g_free(prow->even);
+    g_free(prow->storage);
+    g_free(prow);
+}
+
+static MaskRLE*
+run_length_encode_mask(GwyDataField *mask)
+{
+    GArray *segments = g_array_new(FALSE, FALSE, sizeof(MaskSegment));
+    MaskRLE *mrle = g_new0(MaskRLE, 1);
+    const gdouble *data = mask->data;
+    guint xres = mask->xres, yres = mask->yres;
+    guint i, j, l;
+
+    for (i = 0; i < yres; i++) {
+        j = l = 0;
+        while (j + l < xres) {
+            if (*(data++))
+                l++;
+            else {
+                if (l) {
+                    MaskSegment seg = { i, j, l };
+                    g_array_append_val(segments, seg);
+                    j += l;
+                    l = 0;
+                }
+                j++;
+            }
+        }
+        if (l) {
+            MaskSegment seg = { i, j, l };
+            g_array_append_val(segments, seg);
+        }
+    }
+
+    mrle->nsegments = segments->len;
+    mrle->segments = (MaskSegment*)g_array_free(segments, FALSE);
+    return mrle;
+}
+
+static void
+mask_rle_free(MaskRLE *mrle)
+{
+    g_free(mrle->segments);
+    g_free(mrle);
+}
+
+/* Analyse the set of segments and make a composition plan. */
+static MinMaxPrecomputedReq*
+find_required_lengths_for_rle(const MaskRLE *mrle)
+{
+    MinMaxPrecomputedReq *req;
+    guint *lengths = g_new(guint, mrle->nsegments);
+    guint i;
+
+    for (i = 0; i < mrle->nsegments; i++)
+        lengths[i] = mrle->segments[i].len;
+    req = find_required_lengths_for_set(lengths, mrle->nsegments);
+    g_free(lengths);
+
+    return req;
+}
+
+static inline void
+fill_block(gdouble *data, guint len, gdouble value)
+{
+    while (len--)
+        *(data++) = value;
+}
+
+static inline void
+row_extend_base(const gdouble *in, gdouble *out,
+                guint *pos, guint *width, guint res,
+                guint *extend_left, guint *extend_right)
+{
+    guint e2r, e2l;
+
+    /* Expand the ROI to the right as far as possible */
+    e2r = MIN(*extend_right, res - (*pos + *width));
+    *width += e2r;
+    *extend_right -= e2r;
+
+    /* Expand the ROI to the left as far as possible */
+    e2l = MIN(*extend_left, *pos);
+    *width += e2l;
+    *extend_left -= e2l;
+    *pos -= e2l;
+
+    /* Direct copy of the ROI */
+    gwy_assign(out + *extend_left, in + *pos, *width);
+}
+
+static void
+row_extend_border(const gdouble *in, gdouble *out,
+                  guint pos, guint width, guint res,
+                  guint extend_left, guint extend_right,
+                  G_GNUC_UNUSED gdouble value)
+{
+    row_extend_base(in, out, &pos, &width, res, &extend_left, &extend_right);
+    /* Forward-extend */
+    fill_block(out + extend_left + width, extend_right, in[res-1]);
+    /* Backward-extend */
+    fill_block(out, extend_left, in[0]);
+}
+
+static void
+mask_rle_execute_min_max(const MaskRLE *mrle, MinMaxPrecomputedRow **prows,
+                         gdouble *outbuf, guint width, gboolean maximum)
+{
+    const MaskSegment *seg = mrle->segments;
+    guint n = mrle->nsegments, i, j;
+    const gdouble *segdata = prows[seg->row]->each[seg->len] + seg->col;
+
+    gwy_assign(outbuf, segdata, width);
+    seg++;
+    for (i = n-1; i; i--, seg++) {
+        segdata = prows[seg->row]->each[seg->len] + seg->col;
+        if (maximum) {
+            for (j = 0; j < width; j++) {
+                if (outbuf[j] < segdata[j])
+                    outbuf[j] = segdata[j];
+            }
+        }
+        else {
+            for (j = 0; j < width; j++) {
+                if (outbuf[j] > segdata[j])
+                    outbuf[j] = segdata[j];
+            }
+        }
+    }
+}
+
+static gboolean
+gwy_data_field_area_rle_analyse(GwyDataField *kernel,
+                                gint width,
+                                MinMaxPrecomputed *mmp)
+{
+    guint kxres, kyres, i;
+
+    kxres = kernel->xres;
+    kyres = kernel->yres;
+    mmp->rowbuflen = width + kxres-1;
+    mmp->kxres = kxres;
+    mmp->kyres = kyres;
+
+    /* Run-length encode the mask, i.e. transform it to a set of segments
+     * and their positions. */
+    mmp->mrle = run_length_encode_mask(kernel);
+    if (!mmp->mrle->nsegments) {
+        mask_rle_free(mmp->mrle);
+        return FALSE;
+    }
+
+    mmp->req = find_required_lengths_for_rle(mmp->mrle);
+
+    /* Create the row buffers for running extrema of various lengths. */
+    mmp->prows = g_new(MinMaxPrecomputedRow*, kyres);
+    for (i = 0; i < kyres; i++)
+        mmp->prows[i] = min_max_precomputed_row_alloc(mmp->req, mmp->rowbuflen);
+
+    mmp->extrowbuf = g_new(gdouble, mmp->rowbuflen);
+
+    return TRUE;
+}
+
+static int
+compare_segment(const void *pa, const void *pb)
+{
+    const MaskSegment *a = (const MaskSegment*)pa, *b = (const MaskSegment*)pb;
+
+    if (a->row < b->row)
+        return -1;
+    if (a->row > b->row)
+        return 1;
+    if (a->col < b->col)
+        return -1;
+    if (a->col > b->col)
+        return 1;
+    return 0;
+}
+
+/* Rotate the RLE data by pi.  The set of block lengths does not change.
+ * Therefore, the decompositions do not change either.  The only thing that
+ * changes is the positions of the RLE segments. */
+static void
+gwy_data_field_area_rle_flip(MaskRLE *mrle, guint kxres, guint kyres)
+{
+    guint i;
+
+    for (i = 0; i < mrle->nsegments; i++) {
+        MaskSegment *seg = mrle->segments + i;
+        seg->col = kxres - seg->col - seg->len;
+        seg->row = kyres-1 - seg->row;
+    }
+
+    qsort(mrle->segments, mrle->nsegments, sizeof(MaskSegment),
+          compare_segment);
+}
+
+static void
+gwy_data_field_area_rle_free(MinMaxPrecomputed *mmp)
+{
+    guint i;
+
+    g_free(mmp->extrowbuf);
+    for (i = 0; i < mmp->kyres; i++)
+        min_max_precomputed_row_free(mmp->prows[i]);
+    g_free(mmp->prows);
+    min_max_precomputed_req_free(mmp->req);
+    mask_rle_free(mmp->mrle);
+}
+
+static void
+gwy_data_field_area_min_max_execute(GwyDataField *dfield,
+                                    gdouble *outbuf,
+                                    MinMaxPrecomputed *mmp,
+                                    gboolean maximum,
+                                    gint col, gint row,
+                                    gint width, gint height)
+{
+    MaskRLE *mrle = mmp->mrle;
+    MinMaxPrecomputedReq *req = mmp->req;
+    MinMaxPrecomputedRow **prows = mmp->prows, *prow;
+    MinMaxPrecomputedRowFill precomp_row_fill;
+    guint xres, yres, i, ii;
+    guint extend_up, extend_down, extend_left, extend_right;
+    gdouble *d, *extrowbuf = mmp->extrowbuf;
+    guint rowbuflen = mmp->rowbuflen;
+
+    xres = dfield->xres;
+    yres = dfield->yres;
+    d = dfield->data;
+    precomp_row_fill = (maximum
+                        ? max_precomputed_row_fill
+                        : min_precomputed_row_fill);
+
+    /* Initialise the buffers for the zeroth row of the area.  For the maximum
+     * operation we even-sized kernels to the other direction to obtain
+     * morphological operation according to definitions. */
+    if (maximum) {
+        extend_up = mmp->kyres/2;
+        extend_down = (mmp->kyres - 1)/2;
+        extend_left = mmp->kxres/2;
+        extend_right = (mmp->kxres - 1)/2;
+    }
+    else {
+        extend_up = (mmp->kyres - 1)/2;
+        extend_down = mmp->kyres/2;
+        extend_left = (mmp->kxres - 1)/2;
+        extend_right = mmp->kxres/2;
+    }
+
+    for (i = 0; i <= extend_down; i++) {
+        if (row + i < yres) {
+            row_extend_border(d + xres*(row + i), extrowbuf,
+                              col, width, xres,
+                              extend_left, extend_right,
+                              0.0);
+            precomp_row_fill(req, prows[i + extend_up], extrowbuf, rowbuflen);
+        }
+        else
+            min_max_precomputed_row_copy(prows[i], prows[i-1], req, rowbuflen);
+    }
+    for (i = 1; i <= extend_up; i++) {
+        ii = extend_up - i;
+        if (i <= (guint)row) {
+            row_extend_border(d + xres*(row - i), extrowbuf,
+                              col, width, xres,
+                              extend_left, extend_right,
+                              0.0);
+            precomp_row_fill(req, prows[ii], extrowbuf, rowbuflen);
+        }
+        else
+            min_max_precomputed_row_copy(prows[ii],
+                                         prows[(ii + 1) % mmp->kyres],
+                                         req, rowbuflen);
+    }
+
+    /* Go through the rows and extract the minima or maxima from the
+     * precomputed segment data. */
+    i = 0;
+    while (TRUE) {
+        mask_rle_execute_min_max(mrle, prows, outbuf + i*width, width, maximum);
+        i++;
+        if (i == (guint)height)
+            break;
+
+        /* Rotate physically prows[] so that the current row is at the zeroth
+         * position.  We could use cyclic buffers but then all subordinate
+         * functions would know how to handle them and calculating mod() for
+         * all indexing is inefficient anyway. */
+        prow = prows[0];
+        for (ii = 0; ii < mmp->kyres-1; ii++)
+            prows[ii] = prows[ii+1];
+        prows[mmp->kyres-1] = prow;
+
+        /* Precompute the new row at the bottom. */
+        ii = row + i + extend_down;
+        if (ii < yres) {
+            row_extend_border(d + xres*ii, extrowbuf,
+                              col, width, xres,
+                              extend_left, extend_right,
+                              0.0);
+            precomp_row_fill(req, prow, extrowbuf, rowbuflen);
+        }
+        else {
+            g_assert(mmp->kyres >= 2);
+            min_max_precomputed_row_copy(prow, prows[mmp->kyres-2],
+                                         req, rowbuflen);
+        }
+    }
+}
+
+static gboolean
+kernel_is_nonempty(GwyDataField *dfield)
+{
+    guint i, n = dfield->xres * dfield->yres;
+    gdouble *d = dfield->data;
+
+    for (i = 0; i < n; i++, d++) {
+        if (*d)
+            return TRUE;
+    }
+    return FALSE;
+}
+
+/* NB: The kernel passed to this function should be non-empty. */
+static void
+gwy_data_field_area_filter_min_max_real(GwyDataField *data_field,
+                                        GwyDataField *kernel,
+                                        GwyMinMaxFilterType filtertype,
+                                        gint col, gint row,
+                                        gint width, gint height)
+{
+    MinMaxPrecomputed mmp;
+    gdouble *outbuf, *d;
+    gint i, j, xres, yres, kxres, kyres;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    g_return_if_fail(col >= 0 && row >= 0
+                     && width > 0 && height > 0
+                     && col + width <= data_field->xres
+                     && row + height <= data_field->yres);
+
+    xres = data_field->xres;
+    yres = data_field->yres;
+    kxres = kernel->xres;
+    kyres = kernel->yres;
+    d = data_field->data;
+
+    if (filtertype == GWY_MIN_MAX_FILTER_MINIMUM
+        || filtertype == GWY_MIN_MAX_FILTER_MAXIMUM) {
+        gboolean is_max = (filtertype == GWY_MIN_MAX_FILTER_MAXIMUM);
+
+        gwy_data_field_area_rle_analyse(kernel, width, &mmp);
+        if (is_max)
+            gwy_data_field_area_rle_flip(mmp.mrle, kxres, kyres);
+        outbuf = g_new(gdouble, width*height);
+        gwy_data_field_area_min_max_execute(data_field, outbuf, &mmp, is_max,
+                                            col, row, width, height);
+        gwy_data_field_area_rle_free(&mmp);
+
+        d += row*xres + col;
+        for (i = 0; i < height; i++)
+            gwy_assign(d + i*xres, outbuf + i*width, width);
+        gwy_data_field_invalidate(data_field);
+        g_free(outbuf);
+    }
+    else if (filtertype == GWY_MIN_MAX_FILTER_RANGE
+             || filtertype == GWY_MIN_MAX_FILTER_NORMALIZATION) {
+        gdouble *outbuf2;
+
+        gwy_data_field_area_rle_analyse(kernel, width, &mmp);
+        outbuf = g_new(gdouble, width*height);
+        gwy_data_field_area_min_max_execute(data_field, outbuf, &mmp, FALSE,
+                                            col, row, width, height);
+
+        gwy_data_field_area_rle_flip(mmp.mrle, kxres, kyres);
+        outbuf2 = g_new(gdouble, width*height);
+        gwy_data_field_area_min_max_execute(data_field, outbuf2, &mmp, TRUE,
+                                            col, row, width, height);
+        gwy_data_field_area_rle_free(&mmp);
+
+        d += row*xres + col;
+        if (filtertype == GWY_MIN_MAX_FILTER_RANGE) {
+            for (i = 0; i < height; i++) {
+                for (j = 0; j < width; j++)
+                    d[i*xres + j] = outbuf2[i*width + j] - outbuf[i*width + j];
+            }
+        }
+        else {
+            for (i = 0; i < height; i++) {
+                for (j = 0; j < width; j++) {
+                    gdouble min = outbuf[i*width + j];
+                    gdouble max = outbuf2[i*width + j];
+
+                    if (G_UNLIKELY(min == max))
+                        d[i*xres + j] = 0.5;
+                    else
+                        d[i*xres + j] = (d[i*xres + j] - min)/(max - min);
+                }
+            }
+        }
+        gwy_data_field_invalidate(data_field);
+        g_free(outbuf2);
+        g_free(outbuf);
+    }
+    else if (filtertype == GWY_MIN_MAX_FILTER_OPENING
+             || filtertype == GWY_MIN_MAX_FILTER_CLOSING) {
+        gboolean is_closing = (filtertype == GWY_MIN_MAX_FILTER_CLOSING);
+        /* To limit the area of application but keep the influence of
+         * surrouding pixels as if we did erosion and dilation on the entire
+         * field, we must perform the first operation in an extended area. */
+        gint extcol = MAX(0, col - kxres/2);
+        gint extrow = MAX(0, row - kyres/2);
+        gint extwidth = MIN(xres, col + width + kxres/2) - extcol;
+        gint extheight = MIN(yres, row + height + kyres/2) - extrow;
+        GwyDataField *tmpfield;
+
+        gwy_data_field_area_rle_analyse(kernel, extwidth, &mmp);
+        if (is_closing)
+            gwy_data_field_area_rle_flip(mmp.mrle, kxres, kyres);
+        tmpfield = gwy_data_field_new(extwidth, extheight, extwidth, extheight,
+                                      FALSE);
+        gwy_data_field_area_min_max_execute(data_field, tmpfield->data, &mmp,
+                                            is_closing,
+                                            extcol, extrow,
+                                            extwidth, extheight);
+
+        if (extcol == col && extrow == row
+            && extwidth == width && extheight == height) {
+            /* Avoid repeating the analysis for full-field application. */
+            gwy_data_field_area_rle_flip(mmp.mrle, kxres, kyres);
+        }
+        else {
+            gwy_data_field_area_rle_free(&mmp);
+            gwy_data_field_area_rle_analyse(kernel, width, &mmp);
+            if (!is_closing)
+                gwy_data_field_area_rle_flip(mmp.mrle, kxres, kyres);
+        }
+        outbuf = g_new(gdouble, width*height);
+        gwy_data_field_area_min_max_execute(tmpfield, outbuf, &mmp,
+                                            !is_closing,
+                                            col - extcol, row - extrow,
+                                            width, height);
+        gwy_data_field_area_rle_free(&mmp);
+        g_object_unref(tmpfield);
+
+        d += row*xres + col;
+        for (i = 0; i < height; i++)
+            gwy_assign(d + i*xres, outbuf + i*width, width);
+        gwy_data_field_invalidate(data_field);
+
+        g_free(outbuf);
+    }
+    else {
+        g_return_if_reached();
+    }
+}
+
+/**
+ * gwy_data_field_area_filter_min_max:
+ * @data_field: A data field to apply the filter to.
+ * @kernel: Data field defining the flat structuring element.
+ * @filtertype: The type of filter to apply.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ *
+ * Applies a morphological operation with a flat structuring element to a
+ * part of a data field.
+ *
+ * Morphological operations with flat structuring elements can be expressed
+ * using minimum (erosion) and maximum (dilation) filters that are the basic
+ * operations this function can perform.
+ *
+ * The kernel field is a mask that defines the shape of the flat structuring
+ * element.  It is reflected for all maximum operations (dilation).  For
+ * symmetrical kernels this does not matter.  You can use
+ * gwy_data_field_elliptic_area_fill() to create a true circular (or
+ * elliptical) kernel.
+ *
+ * The kernel is implicitly centered, i.e. it will be applied symmetrically to
+ * avoid unexpected data movement.  Even-sized kernels (generally not
+ * recommended) will extend farther towards the top left image corner for
+ * minimum (erosion) and towards the bottom right corner for maximum (dilation)
+ * operations due to the reflection.  If you need off-center structuring
+ * elements you can add empty rows or columns to one side of the kernel to
+ * counteract the symmetrisation.
+ *
+ * The operation is linear-time in kernel size for any convex kernel.  Note
+ * gwy_data_field_area_filter_minimum() and
+ * gwy_data_field_area_filter_maximum(), which are limited to square
+ * structuring elements, are much faster for large sizes of the squares.
+ *
+ * The exterior is always handled as %GWY_EXTERIOR_BORDER_EXTEND.
+ *
+ * Since: 2.43
+ **/
+void
+gwy_data_field_area_filter_min_max(GwyDataField *data_field,
+                                   GwyDataField *kernel,
+                                   GwyMinMaxFilterType filtertype,
+                                   gint col, gint row,
+                                   gint width, gint height)
+{
+    GwyDataField *redkernel;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(kernel));
+    redkernel = gwy_data_field_duplicate(kernel);
+    gwy_data_field_grains_autocrop(redkernel, TRUE, NULL, NULL, NULL, NULL);
+    if (kernel_is_nonempty(redkernel)) {
+        gwy_data_field_area_filter_min_max_real(data_field, redkernel,
+                                                filtertype,
+                                                col, row, width, height);
+    }
+    g_object_unref(redkernel);
+}
+
+/**
+ * gwy_data_field_area_filter_disc_asf:
+ * @data_field: A data field to apply the filter to.
+ * @radius: Maximum radius of the circular structuring element, in pixels.
+ *          For radius 0 and smaller the filter is no-op.
+ * @closing: %TRUE requests an opening-closing filter (i.e. ending with
+ *           closing), %FALSE requests a closing-opening filter (i.e. ending
+ *           with opening).
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ *
+ * Applies an alternating sequential morphological filter with a flat disc
+ * structuring element to a part of a data field.
+ *
+ * Alternating sequential filter is a filter consisting of repeated opening and
+ * closing (or closing and opening) with progressively larger structuring
+ * elements.  This function performs such filtering for sequence of structuring
+ * elements consisting of true Euclidean discs with increasing radii.  The
+ * largest disc in the sequence fits into a (2 at size + 1) × (2 at size + 1) square.
+ *
+ * Since: 2.43
+ **/
+void
+gwy_data_field_area_filter_disc_asf(GwyDataField *data_field,
+                                    gint radius,
+                                    gboolean closing,
+                                    gint col,
+                                    gint row,
+                                    gint width,
+                                    gint height)
+{
+    GwyMinMaxFilterType filtertype1, filtertype2;
+    gint r;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    g_return_if_fail(col >= 0 && row >= 0
+                     && width > 0 && height > 0
+                     && col + width <= data_field->xres
+                     && row + height <= data_field->yres);
+
+    if (closing) {
+        filtertype1 = GWY_MIN_MAX_FILTER_OPENING;
+        filtertype2 = GWY_MIN_MAX_FILTER_CLOSING;
+    }
+    else {
+        filtertype1 = GWY_MIN_MAX_FILTER_CLOSING;
+        filtertype2 = GWY_MIN_MAX_FILTER_OPENING;
+    }
+
+    for (r = 1; r <= radius; r++) {
+        gint size = 2*r + 1;
+        GwyDataField *kernel = gwy_data_field_new(size, size, size, size, TRUE);
+        gwy_data_field_elliptic_area_fill(kernel, 0, 0, size, size, 1.0);
+        gwy_data_field_area_filter_min_max_real(data_field, kernel, filtertype1,
+                                                col, row, width, height);
+        gwy_data_field_area_filter_min_max_real(data_field, kernel, filtertype2,
+                                                col, row, width, height);
+        g_object_unref(kernel);
+    }
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/libprocess/filters.c b/libprocess/filters.c
index 3db0d72..fffec8d 100644
--- a/libprocess/filters.c
+++ b/libprocess/filters.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: filters.c 19128 2016-10-26 21:25:12Z yeti-dn $
- *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: filters.c 20128 2017-08-01 11:19:59Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -19,74 +19,18 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-#include "config.h"
 #include <string.h>
-#include <stdlib.h>
+#include <fftw3.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
 #include <libprocess/filters.h>
-#include <libprocess/elliptic.h>
 #include <libprocess/stats.h>
 #include <libprocess/linestats.h>
-#include <libprocess/grains.h>
+#include <libprocess/inttrans.h>
 #include <libprocess/arithmetic.h>
 #include "gwyprocessinternal.h"
 
-/* Data for one row.  To be used in conjuction with MinMaxPrecomputedReq. */
-typedef struct {
-    gdouble *storage;
-    gdouble **each;
-    gdouble **even;
-} MinMaxPrecomputedRow;
-
-typedef struct {
-    guint sublen1;   /* Even length for the even-odd scheme. */
-    guint sublen2;
-    gboolean needed;
-    gboolean even_even : 1;
-    gboolean even_odd : 1;
-} MinMaxPrecomputedLen;
-
-/* Resolved set of required block lengths and the rules how to compute them. */
-typedef struct {
-    /* NB: The array sizes are maxlen_even+1 and maxlen_each+1 because maxlen
-     * is really the maximum length, inclusive. */
-    MinMaxPrecomputedLen *each;
-    MinMaxPrecomputedLen *even;
-    guint maxlen_each;
-    guint maxlen_even;
-    guint nbuffers;   /* The actual number of row buffers (for storage size) */
-} MinMaxPrecomputedReq;
-
-typedef struct {
-    guint row;
-    guint col;
-    guint len;
-} MaskSegment;
-
-typedef struct {
-    MaskSegment *segments;
-    guint nsegments;
-} MaskRLE;
-
-typedef struct {
-    MaskRLE *mrle;
-    MinMaxPrecomputedReq *req;
-    MinMaxPrecomputedRow **prows;
-    gdouble *extrowbuf;
-    guint rowbuflen;
-    guint kxres;
-    guint kyres;
-} MinMaxPrecomputed;
-
-typedef void (*MinMaxPrecomputedRowFill)(const MinMaxPrecomputedReq *req,
-                                         MinMaxPrecomputedRow *prow,
-                                         const gdouble *x,
-                                         guint rowlen);
-
-static void find_required_lengths_recursive(MinMaxPrecomputedReq *req,
-                                            guint blocklen,
-                                            gboolean is_even);
+typedef gdouble (*DoubleArrayFunc)(const gdouble *results);
 
 static gint thin_data_field(GwyDataField *data_field);
 
@@ -1072,6 +1016,581 @@ gwy_data_field_convolve_1d(GwyDataField *data_field,
                                     0, 0, data_field->xres, data_field->yres);
 }
 
+static void
+ensure_defined_exterior(GwyExteriorType *exterior, gdouble *fill_value)
+{
+    if (*exterior == GWY_EXTERIOR_UNDEFINED) {
+        g_warning("Do not use GWY_EXTERIOR_UNDEFINED for convolutions and "
+                  "correlations.  Fixing to zero-filled exterior.");
+        *exterior = GWY_EXTERIOR_FIXED_VALUE;
+        *fill_value = 0.0;
+    }
+}
+
+// Symmetrically means that for even @extsize- at size it holds
+// @extend_begining=@extend_end while for an odd difference it holds
+// @extend_begining+1=@extend_end, i.e. it's extended one pixel more at the
+// end.
+static void
+make_symmetrical_extension(guint size, guint extsize,
+                           guint *extend_begining, guint *extend_end)
+{
+    guint extend = extsize - size;
+
+    *extend_begining = extend/2;
+    *extend_end = extend - *extend_begining;
+}
+
+static void
+row_convolve_direct(const GwyDataField *field,
+                    guint col, guint row,
+                    guint width, guint height,
+                    GwyDataField *target,
+                    guint targetcol, guint targetrow,
+                    const GwyDataLine *kernel,
+                    RowExtendFunc extend_row,
+                    gdouble fill_value)
+{
+    guint xres = field->xres;
+    guint kres = kernel->res;
+    const gdouble *kdata = kernel->data;
+    guint size = width + kres - 1;
+    guint extend_left, extend_right, i, j, k;
+    gdouble *extdata = g_new(gdouble, size);
+
+    make_symmetrical_extension(width, size, &extend_left, &extend_right);
+
+    /* The direct method is used only if kres ≪ res.  Don't bother optimising
+     * the boundaries, just make the inner loop tight. */
+    for (i = 0; i < height; i++) {
+        gdouble *trow = target->data + (targetrow + i)*target->xres + targetcol;
+        extend_row(field->data + (row + i)*xres, extdata,
+                   col, width, xres, extend_left, extend_right, fill_value);
+        for (j = 0; j < width; j++) {
+            const gdouble *d = extdata + extend_left + kres/2 + j;
+            gdouble v = 0.0;
+            for (k = 0; k < kres; k++, d--)
+                v += kdata[k] * *d;
+            trow[j] = v;
+        }
+    }
+
+    g_free(extdata);
+}
+
+static inline void
+extend_kernel_row(const gdouble *kernel, guint klen,
+                  gdouble *extended, guint size)
+{
+    guint llen = klen/2, rlen = klen - llen;
+    gwy_assign(extended, kernel + llen, rlen);
+    gwy_clear(extended + rlen, size - klen);
+    gwy_assign(extended + size - llen, kernel, llen);
+}
+
+static void
+extend_kernel_rect(const gdouble *kernel,
+                   guint kxlen, guint kylen,
+                   gdouble *extended,
+                   guint xsize, guint ysize, guint rowstride)
+{
+    guint ulen = kylen/2, dlen = kylen - ulen;
+    guint i;
+
+    for (i = 0; i < dlen; i++) {
+        extend_kernel_row(kernel + (i + ulen)*kxlen, kxlen,
+                          extended + i*rowstride, xsize);
+    }
+    gwy_clear(extended + dlen*rowstride, (ysize - kylen)*rowstride);
+    for (i = 0; i < ulen; i++) {
+        extend_kernel_row(kernel + i*kxlen, kxlen,
+                          extended + (ysize - ulen + i)*rowstride, xsize);
+    }
+}
+
+static inline void
+complex_multiply_with(fftw_complex *a, const fftw_complex *b)
+{
+    gdouble re = (*a)[0]*(*b)[0] - (*a)[1]*(*b)[1];
+
+    (*a)[1] = (*a)[1]*(*b)[0] + (*a)[0]*(*b)[1];
+    (*a)[0] = re;
+}
+
+static void
+row_convolve_fft(GwyDataField *field,
+                 guint col, guint row,
+                 guint width, guint height,
+                 GwyDataField *target,
+                 guint targetcol, guint targetrow,
+                 GwyDataLine *kernel,
+                 RowExtendFunc extend_row,
+                 gdouble fill_value)
+{
+    guint xres = field->xres, kres = kernel->res;
+    guint size = gwy_fft_find_nice_size(width + kres - 1);
+    // The innermost (contiguous) dimension of R2C the complex output is
+    // slightly larger than the real input.  Note @cstride is measured in
+    // fftw_complex, multiply it by 2 for doubles.
+    guint cstride = size/2 + 1;
+    guint extend_left, extend_right, i, j;
+    gdouble *extdata = g_new(gdouble, size);
+    fftw_complex *datac = g_new(fftw_complex, 2*cstride);
+    fftw_complex *kernelc = datac + cstride;
+    fftw_plan dplan, cplan;
+    gdouble q;
+
+    /* The R2C plan for transforming the extended data row (or kernel). */
+    dplan = fftw_plan_dft_r2c_1d(size, extdata, datac,
+                                 FFTW_DESTROY_INPUT | _GWY_FFTW_PATIENCE);
+    g_assert(dplan);
+    /* The C2R plan the backward transform of the convolution of each row. */
+    cplan = fftw_plan_dft_c2r_1d(size, datac, extdata, _GWY_FFTW_PATIENCE);
+    g_assert(cplan);
+
+    // Transform the kernel.
+    extend_kernel_row(kernel->data, kres, extdata, size);
+    fftw_execute(dplan);
+    gwy_assign(kernelc, datac, cstride);
+
+    // Convolve rows
+    make_symmetrical_extension(width, size, &extend_left, &extend_right);
+    q = 1.0/size;
+    for (i = 0; i < height; i++) {
+        extend_row(field->data + (row + i)*xres, extdata,
+                   col, width, xres, extend_left, extend_right, fill_value);
+        fftw_execute(dplan);
+        for (j = 0; j < cstride; j++) {
+            complex_multiply_with(datac + j, kernelc + j);
+            datac[j][0] *= q;
+            datac[j][1] *= q;
+        }
+        fftw_execute(cplan);
+        gwy_assign(target->data + (targetrow + i)*target->xres + targetcol,
+                   extdata + extend_left,
+                   width);
+    }
+
+    fftw_destroy_plan(cplan);
+    fftw_destroy_plan(dplan);
+    fftw_free(datac);
+    fftw_free(extdata);
+}
+
+/**
+ * gwy_data_field_area_ext_row_convolve:
+ * @field: A two-dimensional data field.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ * @target: A two-dimensional data field where the result will be placed.
+ *          It may be @field for an in-place modification.
+ * @kernel: Kernel to convolve @field with.
+ * @exterior: Exterior pixels handling.
+ * @fill_value: The value to use with %GWY_EXTERIOR_FIXED_VALUE exterior.
+ * @as_integral: %TRUE for normalisation and units as a convolution integral,
+ *               %FALSE as a sum.
+ *
+ * Convolve a field row-wise with a one-dimensional kernel.
+ *
+ * Pixel dimensions of @target may match either @field or just the rectangular
+ * area.  In the former case the result is written in the same rectangular
+ * area; in the latter case the result fills the entire @target.
+ *
+ * The convolution is performed with the kernel centred on the respective field
+ * pixels.  For an odd-sized kernel this holds precisely.  For an even-sized
+ * kernel this means the kernel centre is placed 0.5 pixel to the left
+ * (towards lower column indices) from the respective field pixel.
+ *
+ * See gwy_data_field_extend() for what constitutes the exterior and how it is
+ * handled.
+ *
+ * If @as_integral is %FALSE the function performs a simple discrete
+ * convolution sum and the value units of @target are set to product of @field
+ * and @kernel units.
+ *
+ * If @as_integral is %TRUE the function approximates a convolution integral.
+ * In this case @kernel should be a sampled continuous transfer function.
+ * The units of value @target are set to product of @field and @kernel value
+ * units and @field lateral units.  Furthermore, the discrete sum is multiplied
+ * by the pixel size (i.e. d at x in the integral).
+ *
+ * In either case, the lateral units and pixel size of @kernel are assumed to
+ * be the same as for a @field's row (albeit not checked), because
+ * the convolution does not make sense otherwise.
+ *
+ * Since: 2.49
+ **/
+void
+gwy_data_field_area_ext_row_convolve(GwyDataField *field,
+                                     guint col, guint row,
+                                     guint width, guint height,
+                                     GwyDataField *target,
+                                     GwyDataLine *kernel,
+                                     GwyExteriorType exterior,
+                                     gdouble fill_value,
+                                     gboolean as_integral)
+{
+    guint xres, yres;
+    guint targetcol, targetrow;
+    GwySIUnit *funit, *kunit, *tunit;
+    RowExtendFunc extend_row;
+    gdouble dx, dy;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(field));
+    g_return_if_fail(GWY_IS_DATA_FIELD(target));
+    g_return_if_fail(GWY_IS_DATA_LINE(kernel));
+    xres = field->xres;
+    yres = field->yres;
+    g_return_if_fail(col < xres && row < yres);
+    g_return_if_fail(width > 0 && height > 0);
+    g_return_if_fail(col + width <= xres && row + height <= yres);
+    g_return_if_fail((target->xres == xres && target->yres == yres)
+                     || (target->xres == width && target->yres == height));
+    targetcol = (target->xres == xres) ? col : 0;
+    targetrow = (target->yres == yres) ? row : 0;
+
+    ensure_defined_exterior(&exterior, &fill_value);
+    if (!(extend_row = _gwy_get_row_extend_func(exterior)))
+        return;
+
+    if (width <= 12 || kernel->res <= 3.0*(log(width) - 1.0)) {
+        row_convolve_direct(field, col, row, width, height,
+                            target, targetcol, targetrow,
+                            kernel, extend_row, fill_value);
+    }
+    else {
+        row_convolve_fft(field, col, row, width, height,
+                         target, targetcol, targetrow,
+                         kernel, extend_row, fill_value);
+    }
+
+    dx = field->xreal/field->xres;
+    dy = field->yreal/field->yres;
+    if (target != field) {
+        _gwy_assign_si_unit(field->si_unit_xy, &target->si_unit_xy);
+        target->xreal = dx*target->xres;
+        target->yreal = dy*target->yres;
+    }
+
+    funit = gwy_data_field_get_si_unit_z(field);
+    kunit = gwy_data_line_get_si_unit_y(kernel);
+    tunit = gwy_data_field_get_si_unit_z(target);
+    gwy_si_unit_multiply(funit, kunit, tunit);
+    if (as_integral) {
+        funit = gwy_data_field_get_si_unit_xy(field);
+        gwy_si_unit_multiply(tunit, funit, tunit);
+        gwy_data_field_multiply(target, dx);
+    }
+
+    gwy_data_field_invalidate(target);
+}
+
+/**
+ * multiconvolve_direct:
+ * @field: A two-dimensional data field.
+ * @col: First ROI column.
+ * @row: First RIO row.
+ * @width: ROI width.
+ * @height: RIO height.
+ * @target: A two-dimensional data field where the result will be placed.
+ *          It may be @field itself.
+ * @targetcol: Column to place the result into @target.
+ * @targetrow: Target to place the result into @target.
+ * @kernel: Array of @nkernel equally-sized kernel.
+ * @nkernel: Number of items in @kernel.
+ * @combine_results: Function to combine results of individual convolutions
+ *                   to the final result put to @target.  May be %NULL if
+ *                   @nkernel is 1.
+ * @extend_rect: Rectangle extending method.
+ * @fill_value: The value to use with fixed-value exterior.
+ *
+ * Performs convolution of a field with a number of equally-sized kenrels,
+ * combining the results of individual convolutions into a single value.
+ */
+static void
+multiconvolve_direct(GwyDataField *field,
+                     guint col, guint row,
+                     guint width, guint height,
+                     GwyDataField *target,
+                     guint targetcol, guint targetrow,
+                     GwyDataField **kernel,
+                     guint nkernel,
+                     DoubleArrayFunc combine_results,
+                     RectExtendFunc extend_rect,
+                     gdouble fill_value)
+{
+    guint xres, yres, kxres, kyres, xsize, ysize;
+    guint extend_left, extend_right, extend_up, extend_down;
+    gdouble *extdata;
+    guint kno, i, j, ik, jk;
+
+    g_return_if_fail(nkernel);
+    g_return_if_fail(kernel);
+    g_return_if_fail(nkernel == 1 || combine_results);
+
+    xres = field->xres;
+    yres = field->yres;
+    kxres = kernel[0]->xres;
+    kyres = kernel[0]->yres;
+    for (kno = 1; kno < nkernel; kno++) {
+        g_return_if_fail(kernel[kno]->xres == kxres
+                         && kernel[kno]->yres == kyres);
+    }
+
+    xsize = width + kxres - 1;
+    ysize = height + kyres - 1;
+    extdata = g_new(gdouble, xsize*ysize);
+    make_symmetrical_extension(width, xsize, &extend_left, &extend_right);
+    make_symmetrical_extension(height, ysize, &extend_up, &extend_down);
+
+    extend_rect(field->data, xres, extdata, xsize,
+                col, row, width, height, xres, yres,
+                extend_left, extend_right, extend_up, extend_down, fill_value);
+
+    /* The direct method is used only if kres ≪ res.  Don't bother optimising
+     * the boundaries, just make the inner loop tight. */
+    if (nkernel == 1) {
+        const gdouble *kdata = kernel[0]->data;
+        for (i = 0; i < height; i++) {
+            gdouble *trow = target->data + ((targetrow + i)*target->xres
+                                            + targetcol);
+            for (j = 0; j < width; j++) {
+                const gdouble *id = extdata + (extend_up + kyres/2 + i)*xsize;
+                gdouble v = 0.0;
+                for (ik = 0; ik < kyres; ik++, id -= xsize) {
+                    const gdouble *jd = id + extend_left + kxres/2 + j;
+                    const gdouble *krow = kdata + ik*kxres;
+                    for (jk = 0; jk < kxres; jk++, jd--)
+                        v += krow[jk] * *jd;
+                }
+                trow[j] = v;
+            }
+        }
+    }
+    else {
+        for (i = 0; i < height; i++) {
+            gdouble *trow = target->data + ((targetrow + i)*target->xres
+                                            + targetcol);
+            for (j = 0; j < width; j++) {
+                gdouble results[nkernel];
+                for (kno = 0; kno < nkernel; kno++) {
+                    const gdouble *id = extdata + (extend_up
+                                                   + kyres/2 + i)*xsize;
+                    const gdouble *kdata = kernel[kno]->data;
+                    gdouble v = 0.0;
+                    for (ik = 0; ik < kyres; ik++, id -= xsize) {
+                        const gdouble *jd = id + extend_left + kxres/2 + j;
+                        const gdouble *krow = kdata + ik*kxres;
+                        for (jk = 0; jk < kxres; jk++, jd--)
+                            v += krow[jk] * *jd;
+                    }
+                    results[kno] = v;
+                }
+                trow[j] = combine_results(results);
+            }
+        }
+    }
+
+    g_free(extdata);
+}
+
+static void
+convolve_fft(GwyDataField *field,
+             guint col, guint row,
+             guint width, guint height,
+             GwyDataField *target,
+             guint targetcol, guint targetrow,
+             GwyDataField *kernel,
+             RectExtendFunc extend_rect,
+             gdouble fill_value)
+{
+    guint xres = field->xres, yres = field->yres,
+          kxres = kernel->xres, kyres = kernel->yres;
+    guint xsize = gwy_fft_find_nice_size(width + kxres - 1);
+    guint ysize = gwy_fft_find_nice_size(height + kyres - 1);
+    // The innermost (contiguous) dimension of R2C the complex output is
+    // slightly larger than the real input.  If the transform is in-place the
+    // input array needs to be padded.  Note @cstride is measured in
+    // fftw_complex, multiply it by 2 for doubles.
+    guint cstride = xsize/2 + 1;
+    // Use in-place transforms.  Let FFTW figure out whether allocating
+    // temporary buffers worths it or not.
+    fftw_complex *datac = g_new(fftw_complex, cstride*ysize);
+    gdouble *extdata = (gdouble*)datac;
+    fftw_complex *kernelc = g_new(fftw_complex, cstride*ysize);
+    guint extend_left, extend_right, extend_up, extend_down;
+    guint i, k;
+    fftw_plan kplan, dplan, cplan;
+    gdouble q;
+
+    make_symmetrical_extension(width, xsize, &extend_left, &extend_right);
+    make_symmetrical_extension(height, ysize, &extend_up, &extend_down);
+
+    // The R2C plan for transforming the extended kernel.  The input is in
+    // extdata to make it an out-of-place transform (this also means the input
+    // data row stride is just xsize, not 2*cstride).
+    kplan = fftw_plan_dft_r2c_2d(ysize, xsize, extdata, kernelc,
+                                 FFTW_DESTROY_INPUT | _GWY_FFTW_PATIENCE);
+    g_assert(kplan);
+    // The R2C plan for transforming the extended data.  This one is in-place.
+    dplan = fftw_plan_dft_r2c_2d(ysize, xsize, extdata, datac,
+                                 FFTW_DESTROY_INPUT | _GWY_FFTW_PATIENCE);
+    g_assert(dplan);
+    // The C2R plan the backward transform of the convolution.  The input
+    // is in fact in kernelc to make it an out-of-place transform.  So, again,
+    // the output has cstride of only xsize.
+    cplan = fftw_plan_dft_c2r_2d(ysize, xsize, kernelc, extdata,
+                                 _GWY_FFTW_PATIENCE);
+    g_assert(cplan);
+
+    // Transform the kernel.
+    extend_kernel_rect(kernel->data, kxres, kyres,
+                       extdata, xsize, ysize, xsize);
+    fftw_execute(kplan);
+
+    // Convolve
+    extend_rect(field->data, xres, extdata, 2*cstride,
+                col, row, width, height, xres, yres,
+                extend_left, extend_right, extend_up, extend_down, fill_value);
+    fftw_execute(dplan);
+
+    q = 1.0/(xsize*ysize);
+    for (k = 0; k < cstride*ysize; k++) {
+        complex_multiply_with(kernelc + k, datac + k);
+        kernelc[k][0] *= q;
+        kernelc[k][1] *= q;
+    }
+    fftw_execute(cplan);
+
+    for (i = 0; i < height; i++) {
+        gwy_assign(target->data + (targetrow + i)*target->xres + targetcol,
+                   extdata + (extend_up + i)*xsize + extend_left,
+                   width);
+    }
+
+    fftw_destroy_plan(kplan);
+    fftw_destroy_plan(cplan);
+    fftw_destroy_plan(dplan);
+    fftw_free(kernelc);
+    fftw_free(datac);
+}
+
+/**
+ * gwy_data_field_area_ext_convolve:
+ * @field: A two-dimensional data field.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ * @target: A two-dimensional data field where the result will be placed.
+ *          It may be @field for an in-place modification.
+ * @kernel: Kernel to convolve @field with.
+ * @exterior: Exterior pixels handling.
+ * @fill_value: The value to use with %GWY_EXTERIOR_FIXED_VALUE exterior.
+ * @as_integral: %TRUE for normalisation and units as a convolution integral,
+ *               %FALSE as a sum.
+ *
+ * Convolve a field with a two-dimensional kernel.
+ *
+ * Pixel dimensions of @target may match either @field or just the rectangular
+ * area.  In the former case the result is written in the same rectangular
+ * area; in the latter case the result fills the entire @target.
+ *
+ * The convolution is performed with the kernel centred on the respective field
+ * pixels.  For directions in which the kernel has an odd size this holds
+ * precisely.  For an even-sized kernel this means the kernel centre is placed
+ * 0.5 pixel left or up (towards lower indices) from the respective field
+ * pixel.
+ *
+ * See gwy_data_field_extend() for what constitutes the exterior and how it is
+ * handled.
+ *
+ * If @as_integral is %FALSE the function performs a simple discrete
+ * convolution sum and the value units of @target are set to product of @field
+ * and @kernel units.
+ *
+ * If @as_integral is %TRUE the function approximates a convolution integral.
+ * In this case @kernel should be a sampled continuous transfer function.
+ * The units of value @target are set to product of @field and @kernel value
+ * units and @field lateral units squared.  Furthermore, the discrete sum is
+ * multiplied by the pixel size (i.e. d at x d at y in the integral).
+ *
+ * In either case, the lateral units and pixel size of @kernel are assumed to
+ * be the same as for @field (albeit not checked), because the convolution does
+ * not make sense otherwise.
+ *
+ * Since: 2.49
+ **/
+void
+gwy_data_field_area_ext_convolve(GwyDataField *field,
+                                 guint col, guint row,
+                                 guint width, guint height,
+                                 GwyDataField *target,
+                                 GwyDataField *kernel,
+                                 GwyExteriorType exterior,
+                                 gdouble fill_value,
+                                 gboolean as_integral)
+{
+    guint xres, yres, size;
+    guint targetcol, targetrow;
+    GwySIUnit *funit, *kunit, *tunit;
+    RectExtendFunc extend_rect;
+    gdouble dx, dy;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(field));
+    g_return_if_fail(GWY_IS_DATA_FIELD(target));
+    g_return_if_fail(GWY_IS_DATA_FIELD(kernel));
+    xres = field->xres;
+    yres = field->yres;
+    g_return_if_fail(col < xres && row < yres);
+    g_return_if_fail(width > 0 && height > 0);
+    g_return_if_fail(col + width <= xres && row + height <= yres);
+    g_return_if_fail((target->xres == xres && target->yres == yres)
+                     || (target->xres == width && target->yres == height));
+    targetcol = (target->xres == xres) ? col : 0;
+    targetrow = (target->yres == yres) ? row : 0;
+
+    ensure_defined_exterior(&exterior, &fill_value);
+    if (!(extend_rect =_gwy_get_rect_extend_func(exterior)))
+        return;
+
+    size = height*width;
+    if (size <= 25) {
+        multiconvolve_direct(field, col, row, width, height,
+                             target, targetcol, targetrow,
+                             &kernel, 1, NULL, extend_rect, fill_value);
+    }
+    else {
+        convolve_fft(field, col, row, width, height,
+                     target, targetcol, targetrow,
+                     kernel, extend_rect, fill_value);
+    }
+
+    dx = field->xreal/field->xres;
+    dy = field->yreal/field->yres;
+    if (target != field) {
+        funit = gwy_data_field_get_si_unit_xy(field);
+        tunit = gwy_data_field_get_si_unit_xy(target);
+        gwy_serializable_clone(G_OBJECT(funit), G_OBJECT(tunit));
+        target->xreal = dx*target->xres;
+        target->yreal = dy*target->yres;
+    }
+
+    funit = gwy_data_field_get_si_unit_z(field);
+    kunit = gwy_data_field_get_si_unit_z(kernel);
+    tunit = gwy_data_field_get_si_unit_z(target);
+    gwy_si_unit_multiply(funit, kunit, tunit);
+    if (as_integral) {
+        funit = gwy_data_field_get_si_unit_xy(field);
+        gwy_si_unit_power_multiply(tunit, 1, funit, 2, tunit);
+        gwy_data_field_multiply(target, dx*dy);
+    }
+
+    gwy_data_field_invalidate(target);
+}
+
 /**
  * gwy_data_field_area_filter_mean:
  * @data_field: A data field to apply the filter to.
@@ -1341,8 +1860,8 @@ gwy_data_field_area_filter_laplacian_of_gaussians(GwyDataField *data_field,
     gint i, j;
 
     laplacian_of_gaussians = gwy_data_field_new(5, 5, 5.0, 5.0, TRUE);
-    for(i = 0; i < 5; i++)
-        for(j = 0; j < 5; j++)
+    for (i = 0; i < 5; i++)
+        for (j = 0; j < 5; j++)
             gwy_data_field_set_val(laplacian_of_gaussians, j, i,
                                    laplacian_of_gaussians_data[i*5+j]);
     g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
@@ -2046,1491 +2565,6 @@ thin_data_field(GwyDataField *data_field)
 }
 
 /**
- * gwy_data_field_area_filter_minimum:
- * @data_field: A data field to apply minimum filter to.
- * @size: Neighbourhood size for minimum search.
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- *
- * Filters a rectangular part of a data field with minimum filter.
- *
- * This operation is often called erosion filter.
- **/
-void
-gwy_data_field_area_filter_minimum(GwyDataField *data_field,
-                                   gint size,
-                                   gint col,
-                                   gint row,
-                                   gint width,
-                                   gint height)
-{
-    GwyDataField *buffer, *buffer2;
-    gint d, i, j, ip, ii, im, jp, jm;
-    gint ep, em;  /* positive and negative excess */
-    gdouble *buf, *buf2;
-    gdouble v;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(col >= 0 && row >= 0
-                     && width > 0 && height > 0
-                     && col + width <= data_field->xres
-                     && row + height <= data_field->yres);
-    g_return_if_fail(size > 0);
-    if (size == 1)
-        return;
-
-    /* FIXME: does this silly case need an alternative implementation? */
-    if (size/2 >= MIN(width, height)) {
-        g_warning("Too large kernel size for too small area.");
-        return;
-    }
-
-    buffer = gwy_data_field_new(width, height, 1.0, 1.0, FALSE);
-    buffer2 = gwy_data_field_new(width, height, 1.0, 1.0, FALSE);
-    buf = buffer->data;
-    buf2 = buffer2->data;
-
-    d = 1;
-    gwy_data_field_area_copy(data_field, buffer, col, row, width, height, 0, 0);
-    while (3*d < size) {
-        for (i = 0; i < height; i++) {
-            ii = i*width;
-            im = MAX(i - d, 0)*width;
-            ip = MIN(i + d, height-1)*width;
-            for (j = 0; j < width; j++) {
-                jm = MAX(j - d, 0);
-                jp = MIN(j + d, width-1);
-
-                v = MIN(buf[im + jm], buf[im + jp]);
-                if (v > buf[im + j])
-                    v = buf[im + j];
-                if (v > buf[ii + jm])
-                    v = buf[ii + jm];
-                if (v > buf[ii + j])
-                    v = buf[ii + j];
-                if (v > buf[ip + j])
-                    v = buf[ip + j];
-                if (v > buf[ii + jp])
-                    v = buf[ii + jp];
-                if (v > buf[ip + jm])
-                    v = buf[ip + jm];
-                if (v > buf[ip + jp])
-                    v = buf[ip + jp];
-
-                buf2[ii + j] = v;
-            }
-        }
-        /* XXX: This breaks the relation between buffer and buf */
-        GWY_SWAP(gdouble*, buf, buf2);
-        d *= 3;
-    }
-
-
-    /* Now we have to overlay the neighbourhoods carefully to get exactly
-     * @size-sized squares.  There are two cases:
-     * 1. @size <= 2*d, it's enough to take four corner representants
-     * 2. @size > 2*d, it's necessary to take all nine representants
-     */
-    ep = size/2;
-    em = (size - 1)/2;
-
-    for (i = 0; i < height; i++) {
-        ii = i*width;
-        im = (MAX(i - em, 0) + d/2)*width;
-        ip = (MIN(i + ep, height-1) - d/2)*width;
-
-        for (j = 0; j < width; j++) {
-            jm = MAX(j - em, 0) + d/2;
-            jp = MIN(j + ep, width-1) - d/2;
-
-            v = MIN(buf[im + jm], buf[im + jp]);
-            if (2*d < size) {
-                if (v > buf[im + j])
-                    v = buf[im + j];
-                if (v > buf[ii + jm])
-                    v = buf[ii + jm];
-                if (v > buf[ii + j])
-                    v = buf[ii + j];
-                if (v > buf[ii + jp])
-                    v = buf[ii + jp];
-                if (v > buf[ip + j])
-                    v = buf[ip + j];
-            }
-            if (v > buf[ip + jm])
-                v = buf[ip + jm];
-            if (v > buf[ip + jp])
-                v = buf[ip + jp];
-
-            buf2[ii + j] = v;
-        }
-    }
-    buffer->data = buf;
-    buffer2->data = buf2;
-
-    gwy_data_field_area_copy(buffer2, data_field,
-                             0, 0, width, height, col, row);
-
-    g_object_unref(buffer2);
-    g_object_unref(buffer);
-}
-
-/**
- * gwy_data_field_filter_minimum:
- * @data_field: A data field to apply minimum filter to.
- * @size: Neighbourhood size for minimum search.
- *
- * Filters a data field with minimum filter.
- **/
-void
-gwy_data_field_filter_minimum(GwyDataField *data_field,
-                              gint size)
-{
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    gwy_data_field_area_filter_minimum(data_field, size, 0, 0,
-                                       data_field->xres, data_field->yres);
-}
-
-/**
- * gwy_data_field_area_filter_maximum:
- * @data_field: A data field to apply maximum filter to.
- * @size: Neighbourhood size for maximum search.
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- *
- * Filters a rectangular part of a data field with maximum filter.
- *
- * This operation is often called dilation filter.
- **/
-void
-gwy_data_field_area_filter_maximum(GwyDataField *data_field,
-                                   gint size,
-                                   gint col,
-                                   gint row,
-                                   gint width,
-                                   gint height)
-{
-    GwyDataField *buffer, *buffer2;
-    gint d, i, j, ip, ii, im, jp, jm;
-    gint ep, em;  /* positive and negative excess */
-    gdouble *buf, *buf2;
-    gdouble v;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(col >= 0 && row >= 0
-                     && width > 0 && height > 0
-                     && col + width <= data_field->xres
-                     && row + height <= data_field->yres);
-    g_return_if_fail(size > 0);
-    if (size == 1)
-        return;
-
-    /* FIXME: does this silly case need an alternative implementation? */
-    if (size/2 >= MIN(width, height)) {
-        g_warning("Too large kernel size for too small area.");
-        return;
-    }
-
-    buffer = gwy_data_field_new(width, height, 1.0, 1.0, FALSE);
-    buffer2 = gwy_data_field_new(width, height, 1.0, 1.0, FALSE);
-    buf = buffer->data;
-    buf2 = buffer2->data;
-
-    d = 1;
-    gwy_data_field_area_copy(data_field, buffer, col, row, width, height, 0, 0);
-    while (3*d < size) {
-        for (i = 0; i < height; i++) {
-            ii = i*width;
-            im = MAX(i - d, 0)*width;
-            ip = MIN(i + d, height-1)*width;
-            for (j = 0; j < width; j++) {
-                jm = MAX(j - d, 0);
-                jp = MIN(j + d, width-1);
-
-                v = MAX(buf[im + jm], buf[im + jp]);
-                if (v < buf[im + j])
-                    v = buf[im + j];
-                if (v < buf[ii + jm])
-                    v = buf[ii + jm];
-                if (v < buf[ii + j])
-                    v = buf[ii + j];
-                if (v < buf[ip + j])
-                    v = buf[ip + j];
-                if (v < buf[ii + jp])
-                    v = buf[ii + jp];
-                if (v < buf[ip + jm])
-                    v = buf[ip + jm];
-                if (v < buf[ip + jp])
-                    v = buf[ip + jp];
-
-                buf2[ii + j] = v;
-            }
-        }
-        /* XXX: This breaks the relation between buffer and buf */
-        GWY_SWAP(gdouble*, buf, buf2);
-        d *= 3;
-    }
-
-
-    /* Now we have to overlay the neighbourhoods carefully to get exactly
-     * @size-sized squares.  There are two cases:
-     * 1. @size <= 2*d, it's enough to take four corner representants
-     * 2. @size > 2*d, it's necessary to take all nine representants
-     */
-    ep = size/2;
-    em = (size - 1)/2;
-
-    for (i = 0; i < height; i++) {
-        ii = i*width;
-        im = (MAX(i - em, 0) + d/2)*width;
-        ip = (MIN(i + ep, height-1) - d/2)*width;
-
-        for (j = 0; j < width; j++) {
-            jm = MAX(j - em, 0) + d/2;
-            jp = MIN(j + ep, width-1) - d/2;
-
-            v = MAX(buf[im + jm], buf[im + jp]);
-            if (2*d < size) {
-                if (v < buf[im + j])
-                    v = buf[im + j];
-                if (v < buf[ii + jm])
-                    v = buf[ii + jm];
-                if (v < buf[ii + j])
-                    v = buf[ii + j];
-                if (v < buf[ii + jp])
-                    v = buf[ii + jp];
-                if (v < buf[ip + j])
-                    v = buf[ip + j];
-            }
-            if (v < buf[ip + jm])
-                v = buf[ip + jm];
-            if (v < buf[ip + jp])
-                v = buf[ip + jp];
-
-            buf2[ii + j] = v;
-        }
-    }
-    buffer->data = buf;
-    buffer2->data = buf2;
-
-    gwy_data_field_area_copy(buffer2, data_field,
-                             0, 0, width, height, col, row);
-
-    g_object_unref(buffer2);
-    g_object_unref(buffer);
-}
-
-/**
- * gwy_data_field_filter_maximum:
- * @data_field: A data field to apply maximum filter to.
- * @size: Neighbourhood size for maximum search.
- *
- * Filters a data field with maximum filter.
- **/
-void
-gwy_data_field_filter_maximum(GwyDataField *data_field,
-                              gint size)
-{
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    gwy_data_field_area_filter_maximum(data_field, size, 0, 0,
-                                       data_field->xres, data_field->yres);
-}
-
-static inline gboolean
-maybe_set_req(MinMaxPrecomputedLen *precomp)
-{
-    if (precomp->needed)
-        return TRUE;
-
-    precomp->needed = TRUE;
-    return FALSE;
-}
-
-static inline void
-fill_req_subs(MinMaxPrecomputedLen *precomp,
-              guint sublen1, guint sublen2,
-              gboolean even_odd, gboolean even_even)
-{
-    precomp->sublen1 = sublen1;
-    precomp->sublen2 = sublen2;
-    precomp->even_even = even_even;
-    precomp->even_odd = even_odd;
-    g_assert(!even_odd || !even_even);
-    g_assert(!even_odd || sublen1 % 2 == 0);
-    g_assert(!even_even || (sublen1 % 2 == 0 && sublen2 % 2 == 0));
-}
-
-static void
-find_required_lengths_recursive(MinMaxPrecomputedReq *req,
-                                guint blocklen, gboolean is_even)
-{
-    MinMaxPrecomputedLen *precomp;
-    guint i, j, any = 0;
-
-    g_assert(blocklen);
-
-    if (is_even) {
-        g_assert(blocklen % 2 == 0);
-
-        precomp = req->even + blocklen;
-        if (maybe_set_req(precomp))
-            return;
-
-        if (blocklen == 2) {
-            /* Even(2) = Each(1) + Each(1) */
-            fill_req_subs(precomp, 1, 1, FALSE, FALSE);
-            find_required_lengths_recursive(req, 1, FALSE);
-        }
-        else if (blocklen % 4 == 0) {
-            /* Even(4m) = Even(2m) + Even(2m) */
-            fill_req_subs(precomp, blocklen/2, blocklen/2, FALSE, TRUE);
-            find_required_lengths_recursive(req, blocklen/2, TRUE);
-        }
-        else if (blocklen % 4 == 2) {
-            /* Even(4m+2) = Even(2m+2) + Even(2m) */
-            fill_req_subs(precomp, blocklen/2 - 1, blocklen/2 + 1, FALSE, TRUE);
-            find_required_lengths_recursive(req, blocklen/2 - 1, TRUE);
-            find_required_lengths_recursive(req, blocklen/2 + 1, TRUE);
-        }
-        else {
-            g_assert_not_reached();
-        }
-    }
-    else {
-        precomp = req->each + blocklen;
-        if (maybe_set_req(precomp))
-            return;
-
-        if (blocklen == 1) {
-            /* Even(1), this is always required.  There is no construction
-             * rule, of course.*/
-            req->each[1].needed = TRUE;
-        }
-        else if (blocklen % 2 == 0) {
-            /* Try to find a split into two existing lengths. */
-            for (i = 1, j = blocklen-1; i < (blocklen + 1)/2; i++, j--) {
-                if (req->each[i].needed && req->each[j].needed) {
-                    fill_req_subs(precomp, i, j, FALSE, FALSE);
-                    return;
-                }
-            }
-
-            /* Each(2m) = Each(m) + Each(m) */
-            fill_req_subs(precomp, blocklen/2, blocklen/2, FALSE, FALSE);
-            find_required_lengths_recursive(req, blocklen/2, FALSE);
-        }
-        else if (blocklen % 2 == 1) {
-            /* Try to find a split into two existing lengths. */
-            for (i = 1, j = blocklen-1; i < (blocklen + 1)/2; i++, j--) {
-                if (req->each[i].needed && req->each[j].needed) {
-                    fill_req_subs(precomp, i, j, FALSE, FALSE);
-                    return;
-                }
-                if (req->even[i].needed && req->each[j].needed) {
-                    fill_req_subs(precomp, i, j, TRUE, FALSE);
-                    return;
-                }
-                if (req->each[i].needed && req->even[j].needed) {
-                    fill_req_subs(precomp, j, i, TRUE, FALSE);
-                    return;
-                }
-                if (req->each[i].needed)
-                    any = i;
-            }
-            /* Or split to one existing and one new. */
-            if (any) {
-                fill_req_subs(precomp, any, blocklen - any, FALSE, FALSE);
-                find_required_lengths_recursive(req, blocklen - any, FALSE);
-                return;
-            }
-
-            if (blocklen % 4 == 1) {
-                /* Each(4m+1) = Even(2m) + Each(2m+1), Each(2m+1) + Even(2m) */
-                fill_req_subs(precomp, blocklen/2, blocklen/2 + 1, TRUE, FALSE);
-                find_required_lengths_recursive(req, blocklen/2, TRUE);
-                find_required_lengths_recursive(req, blocklen/2 + 1, FALSE);
-            }
-            else if (blocklen % 4 == 3) {
-                /* Each(4m+3) = Even(2m+2) + Each(2m+1), Each(2m+1) + Even(2m+2) */
-                fill_req_subs(precomp, blocklen/2 + 1, blocklen/2, TRUE, FALSE);
-                find_required_lengths_recursive(req, blocklen/2 + 1, TRUE);
-                find_required_lengths_recursive(req, blocklen/2, FALSE);
-            }
-            else {
-                g_assert_not_reached();
-            }
-        }
-        else {
-            g_assert_not_reached();
-        }
-    }
-}
-
-static int
-compare_guint(const void *pa, const void *pb)
-{
-    guint a = *(const guint*)pa, b = *(const guint*)pb;
-
-    if (a < b)
-        return -1;
-    if (a > b)
-        return 1;
-    return 0;
-}
-
-static MinMaxPrecomputedReq*
-find_required_lengths_for_set(const guint *blocklens, guint nlens)
-{
-    MinMaxPrecomputedReq *req = g_new(MinMaxPrecomputedReq, 1);
-    guint *blens = g_new(guint, 2*nlens);
-    guint i, n, maxlen;
-
-    /* Find unique lengths and sort them in ascending order to blens[],
-     * starting ar position nlens. */
-    gwy_assign(blens, blocklens, nlens);
-    qsort(blens, nlens, sizeof(guint), compare_guint);
-
-    blens[nlens] = blens[0];
-    for (i = n = 1; i < nlens; i++) {
-        if (blens[i] > blens[i-1])
-            blens[nlens + n++] = blens[i];
-    }
-
-    maxlen = blens[nlens + n-1];
-    req->maxlen_each = maxlen;
-    req->maxlen_even = maxlen;
-    req->each = g_new0(MinMaxPrecomputedLen, maxlen+1);
-    req->even = g_new0(MinMaxPrecomputedLen, maxlen+1);
-    for (i = 0; i < n; i++)
-        find_required_lengths_recursive(req, blens[nlens + i], FALSE);
-
-    g_free(blens);
-
-    for (i = maxlen; i; i--) {
-        if (req->even[i].needed)
-            break;
-    }
-    req->maxlen_even = i;
-
-    req->nbuffers = 0;
-    for (i = 1; i <= req->maxlen_each; i++) {
-        if (req->each[i].needed)
-            req->nbuffers++;
-    }
-    for (i = 2; i <= req->maxlen_even; i++) {
-        if (req->even[i].needed)
-            req->nbuffers++;
-    }
-
-    return req;
-}
-
-static void
-min_max_precomputed_req_free(MinMaxPrecomputedReq *req)
-{
-    g_free(req->each);
-    g_free(req->even);
-    g_free(req);
-}
-
-/* Allocate data buffers for all lengths.  Do not allocate the Each(1) buffer,
- * we use a direct pointer to the data row for that. */
-static MinMaxPrecomputedRow*
-min_max_precomputed_row_alloc(const MinMaxPrecomputedReq *req,
-                              guint rowlen)
-{
-    MinMaxPrecomputedRow *prow = g_new0(MinMaxPrecomputedRow, 1);
-    gdouble *p;
-    guint i;
-
-    prow->storage = p = g_new(gdouble, rowlen*req->nbuffers);
-    prow->each = g_new0(gdouble*, req->maxlen_each + 1);
-    if (req->maxlen_even)
-        prow->even = g_new0(gdouble*, req->maxlen_even + 1);
-
-    for (i = 1; i <= req->maxlen_each; i++) {
-        if (req->each[i].needed) {
-            prow->each[i] = p;
-            p += rowlen;
-        }
-    }
-    for (i = 2; i <= req->maxlen_even; i++) {
-        if (req->even[i].needed) {
-            prow->even[i] = p;
-            p += rowlen;
-        }
-    }
-
-    return prow;
-}
-
-static void
-compose_max_row_data_each(gdouble *target,
-                          const gdouble *sub1,
-                          guint sublen1,
-                          const gdouble *sub2,
-                          guint sublen2,
-                          guint rowlen)
-{
-    guint i, n;
-
-    g_return_if_fail(sublen1 + sublen2 <= rowlen);
-    g_return_if_fail(target);
-    g_return_if_fail(sub1);
-    g_return_if_fail(sub2);
-
-    sub2 += sublen1;
-    n = rowlen - (sublen1 + sublen2);
-    i = 0;
-    while (i <= n) {
-        target[i] = (*sub1 < *sub2) ? *sub2 : *sub1;
-        i++;
-        sub1++;
-        sub2++;
-    }
-}
-
-static void
-compose_max_row_data_even_odd(gdouble *target,
-                              const gdouble *even,
-                              guint evenlen,
-                              const gdouble *odd,
-                              guint oddlen,
-                              guint rowlen)
-{
-    const gdouble *even2, *odd2;
-    guint i, n;
-
-    g_return_if_fail(evenlen + oddlen <= rowlen);
-    g_return_if_fail(evenlen % 2 == 0);
-    g_return_if_fail(target);
-    g_return_if_fail(even);
-    g_return_if_fail(odd);
-
-    odd2 = odd + 1;
-    even2 = even + oddlen + 1;
-    odd += evenlen;
-    n = rowlen - (evenlen + oddlen);
-    i = 0;
-    while (i+1 <= n) {
-        /* Now even points to an even position. */
-        target[i] = (*even < *odd) ? *odd : *even;
-        i++;
-        even += 2;
-        odd += 2;
-
-        /* Now even2 points to an even position. */
-        target[i] = (*even2 < *odd2) ? *odd2 : *even2;
-        i++;
-        even2 += 2;
-        odd2 += 2;
-    }
-
-    if (i <= n) {
-        /* Now even points to an even position. */
-        target[i] = (*even < *odd) ? *odd : *even;
-        i++;
-    }
-    if (i <= n) {
-        /* Now even2 points to an even position. */
-        target[i] = (*even2 < *odd2) ? *odd2 : *even2;
-    }
-}
-
-static void
-compose_max_row_data_even(gdouble *target,
-                          const gdouble *sub1,
-                          guint sublen1,
-                          const gdouble *sub2,
-                          guint sublen2,
-                          guint rowlen)
-{
-    guint i, n;
-
-    g_return_if_fail(sublen1 + sublen2 <= rowlen);
-    g_return_if_fail(sublen1 % 2 == 0);
-    g_return_if_fail(sublen2 % 2 == 0);
-    g_return_if_fail(target);
-    g_return_if_fail(sub1);
-    g_return_if_fail(sub2);
-
-    sub2 += sublen1;
-    n = rowlen - (sublen1 + sublen2);
-    i = 0;
-    while (i <= n) {
-        target[i] = (*sub1 < *sub2) ? *sub2 : *sub1;
-        i += 2;
-        sub1 += 2;
-        sub2 += 2;
-    }
-}
-
-static void
-compose_max_row_data_two(gdouble *target,
-                         const gdouble *one,
-                         guint rowlen)
-{
-    guint i, n;
-
-    g_return_if_fail(2 <= rowlen);
-    g_return_if_fail(target);
-    g_return_if_fail(one);
-
-    n = rowlen - 2;
-    i = 0;
-    while (i <= n) {
-        target[i] = (*one < *(one + 1)) ? *(one + 1) : *one;
-        i += 2;
-        one += 2;
-    }
-}
-
-/* Precomputes maxima for row.  Minimum is always computed from given index
- * blocklen values *forwards*, i.e. the block is not symmetrical it starts at
- * the given index. */
-static void
-max_precomputed_row_fill(const MinMaxPrecomputedReq *req,
-                         MinMaxPrecomputedRow *prow,
-                         const gdouble *x,
-                         guint rowlen)
-{
-    guint blen;
-
-    /* The row itself, AKA Each(1). */
-    gwy_assign(prow->each[1], x, rowlen);
-
-    for (blen = 2; blen <= req->maxlen_each; blen++) {
-        const MinMaxPrecomputedLen *precomp;
-
-        precomp = req->each + blen;
-        if (precomp->needed) {
-            g_assert(!precomp->even_even);
-            if (precomp->even_odd) {
-                compose_max_row_data_even_odd(prow->each[blen],
-                                              prow->even[precomp->sublen1],
-                                              precomp->sublen1,
-                                              prow->each[precomp->sublen2],
-                                              precomp->sublen2,
-                                              rowlen);
-            }
-            else {
-                compose_max_row_data_each(prow->each[blen],
-                                          prow->each[precomp->sublen1],
-                                          precomp->sublen1,
-                                          prow->each[precomp->sublen2],
-                                          precomp->sublen2,
-                                          rowlen);
-            }
-        }
-
-        if (blen > req->maxlen_even)
-            continue;
-
-        precomp = req->even + blen;
-        if (precomp->needed) {
-            g_assert(!precomp->even_odd);
-            if (precomp->even_even) {
-                compose_max_row_data_even(prow->even[blen],
-                                          prow->even[precomp->sublen1],
-                                          precomp->sublen1,
-                                          prow->even[precomp->sublen2],
-                                          precomp->sublen2,
-                                          rowlen);
-            }
-            else {
-                g_assert(blen == 2);
-                g_assert(precomp->sublen1 == 1);
-                compose_max_row_data_two(prow->even[blen],
-                                         prow->each[precomp->sublen1],
-                                         rowlen);
-            }
-        }
-    }
-}
-
-static void
-compose_min_row_data_each(gdouble *target,
-                          const gdouble *sub1,
-                          guint sublen1,
-                          const gdouble *sub2,
-                          guint sublen2,
-                          guint rowlen)
-{
-    guint i, n;
-
-    g_return_if_fail(sublen1 + sublen2 <= rowlen);
-    g_return_if_fail(target);
-    g_return_if_fail(sub1);
-    g_return_if_fail(sub2);
-
-    sub2 += sublen1;
-    n = rowlen - (sublen1 + sublen2);
-    i = 0;
-    while (i <= n) {
-        target[i] = (*sub1 > *sub2) ? *sub2 : *sub1;
-        i++;
-        sub1++;
-        sub2++;
-    }
-}
-
-static void
-compose_min_row_data_even_odd(gdouble *target,
-                              const gdouble *even,
-                              guint evenlen,
-                              const gdouble *odd,
-                              guint oddlen,
-                              guint rowlen)
-{
-    const gdouble *even2, *odd2;
-    guint i, n;
-
-    g_return_if_fail(evenlen + oddlen <= rowlen);
-    g_return_if_fail(evenlen % 2 == 0);
-    g_return_if_fail(target);
-    g_return_if_fail(even);
-    g_return_if_fail(odd);
-
-    odd2 = odd + 1;
-    even2 = even + oddlen + 1;
-    odd += evenlen;
-    n = rowlen - (evenlen + oddlen);
-    i = 0;
-    while (i+1 <= n) {
-        /* Now even points to an even position. */
-        target[i] = (*even > *odd) ? *odd : *even;
-        i++;
-        even += 2;
-        odd += 2;
-
-        /* Now even2 points to an even position. */
-        target[i] = (*even2 > *odd2) ? *odd2 : *even2;
-        i++;
-        even2 += 2;
-        odd2 += 2;
-    }
-
-    if (i <= n) {
-        /* Now even points to an even position. */
-        target[i] = (*even > *odd) ? *odd : *even;
-        i++;
-    }
-    if (i <= n) {
-        /* Now even2 points to an even position. */
-        target[i] = (*even2 > *odd2) ? *odd2 : *even2;
-    }
-}
-
-static void
-compose_min_row_data_even(gdouble *target,
-                          const gdouble *sub1,
-                          guint sublen1,
-                          const gdouble *sub2,
-                          guint sublen2,
-                          guint rowlen)
-{
-    guint i, n;
-
-    g_return_if_fail(sublen1 + sublen2 <= rowlen);
-    g_return_if_fail(sublen1 % 2 == 0);
-    g_return_if_fail(sublen2 % 2 == 0);
-    g_return_if_fail(target);
-    g_return_if_fail(sub1);
-    g_return_if_fail(sub2);
-
-    sub2 += sublen1;
-    n = rowlen - (sublen1 + sublen2);
-    i = 0;
-    while (i <= n) {
-        target[i] = (*sub1 > *sub2) ? *sub2 : *sub1;
-        i += 2;
-        sub1 += 2;
-        sub2 += 2;
-    }
-}
-
-static void
-compose_min_row_data_two(gdouble *target,
-                         const gdouble *one,
-                         guint rowlen)
-{
-    guint i, n;
-
-    g_return_if_fail(2 <= rowlen);
-    g_return_if_fail(target);
-    g_return_if_fail(one);
-
-    n = rowlen - 2;
-    i = 0;
-    while (i <= n) {
-        target[i] = (*one > *(one + 1)) ? *(one + 1) : *one;
-        i += 2;
-        one += 2;
-    }
-}
-
-/* Precomputes minima for row.  Minimum is always computed from given index
- * blocklen values *forwards*, i.e. the block is not symmetrical it starts at
- * the given index. */
-static void
-min_precomputed_row_fill(const MinMaxPrecomputedReq *req,
-                         MinMaxPrecomputedRow *prow,
-                         const gdouble *x,
-                         guint rowlen)
-{
-    guint blen;
-
-    /* The row itself, AKA Each(1). */
-    gwy_assign(prow->each[1], x, rowlen);
-
-    for (blen = 2; blen <= req->maxlen_each; blen++) {
-        const MinMaxPrecomputedLen *precomp;
-
-        precomp = req->each + blen;
-        if (precomp->needed) {
-            g_assert(!precomp->even_even);
-            if (precomp->even_odd) {
-                compose_min_row_data_even_odd(prow->each[blen],
-                                              prow->even[precomp->sublen1],
-                                              precomp->sublen1,
-                                              prow->each[precomp->sublen2],
-                                              precomp->sublen2,
-                                              rowlen);
-            }
-            else {
-                compose_min_row_data_each(prow->each[blen],
-                                          prow->each[precomp->sublen1],
-                                          precomp->sublen1,
-                                          prow->each[precomp->sublen2],
-                                          precomp->sublen2,
-                                          rowlen);
-            }
-        }
-
-        if (blen > req->maxlen_even)
-            continue;
-
-        precomp = req->even + blen;
-        if (precomp->needed) {
-            g_assert(!precomp->even_odd);
-            if (precomp->even_even) {
-                compose_min_row_data_even(prow->even[blen],
-                                          prow->even[precomp->sublen1],
-                                          precomp->sublen1,
-                                          prow->even[precomp->sublen2],
-                                          precomp->sublen2,
-                                          rowlen);
-            }
-            else {
-                g_assert(blen == 2);
-                compose_min_row_data_two(prow->even[blen],
-                                         prow->each[precomp->sublen1],
-                                         rowlen);
-            }
-        }
-    }
-}
-
-static void
-min_max_precomputed_row_copy(MinMaxPrecomputedRow *target,
-                             const MinMaxPrecomputedRow *source,
-                             const MinMaxPrecomputedReq *req,
-                             guint rowlen)
-{
-    gwy_assign(target->storage, source->storage, rowlen*req->nbuffers);
-}
-
-static void
-min_max_precomputed_row_free(MinMaxPrecomputedRow *prow)
-{
-    g_free(prow->each);
-    g_free(prow->even);
-    g_free(prow->storage);
-    g_free(prow);
-}
-
-static MaskRLE*
-run_length_encode_mask(GwyDataField *mask)
-{
-    GArray *segments = g_array_new(FALSE, FALSE, sizeof(MaskSegment));
-    MaskRLE *mrle = g_new0(MaskRLE, 1);
-    const gdouble *data = mask->data;
-    guint xres = mask->xres, yres = mask->yres;
-    guint i, j, l;
-
-    for (i = 0; i < yres; i++) {
-        j = l = 0;
-        while (j + l < xres) {
-            if (*(data++))
-                l++;
-            else {
-                if (l) {
-                    MaskSegment seg = { i, j, l };
-                    g_array_append_val(segments, seg);
-                    j += l;
-                    l = 0;
-                }
-                j++;
-            }
-        }
-        if (l) {
-            MaskSegment seg = { i, j, l };
-            g_array_append_val(segments, seg);
-        }
-    }
-
-    mrle->nsegments = segments->len;
-    mrle->segments = (MaskSegment*)g_array_free(segments, FALSE);
-    return mrle;
-}
-
-static void
-mask_rle_free(MaskRLE *mrle)
-{
-    g_free(mrle->segments);
-    g_free(mrle);
-}
-
-/* Analyse the set of segments and make a composition plan. */
-static MinMaxPrecomputedReq*
-find_required_lengths_for_rle(const MaskRLE *mrle)
-{
-    MinMaxPrecomputedReq *req;
-    guint *lengths = g_new(guint, mrle->nsegments);
-    guint i;
-
-    for (i = 0; i < mrle->nsegments; i++)
-        lengths[i] = mrle->segments[i].len;
-    req = find_required_lengths_for_set(lengths, mrle->nsegments);
-    g_free(lengths);
-
-    return req;
-}
-
-static inline void
-fill_block(gdouble *data, guint len, gdouble value)
-{
-    while (len--)
-        *(data++) = value;
-}
-
-static inline void
-row_extend_base(const gdouble *in, gdouble *out,
-                guint *pos, guint *width, guint res,
-                guint *extend_left, guint *extend_right)
-{
-    guint e2r, e2l;
-
-    /* Expand the ROI to the right as far as possible */
-    e2r = MIN(*extend_right, res - (*pos + *width));
-    *width += e2r;
-    *extend_right -= e2r;
-
-    /* Expand the ROI to the left as far as possible */
-    e2l = MIN(*extend_left, *pos);
-    *width += e2l;
-    *extend_left -= e2l;
-    *pos -= e2l;
-
-    /* Direct copy of the ROI */
-    gwy_assign(out + *extend_left, in + *pos, *width);
-}
-
-static void
-row_extend_border(const gdouble *in, gdouble *out,
-                  guint pos, guint width, guint res,
-                  guint extend_left, guint extend_right,
-                  G_GNUC_UNUSED gdouble value)
-{
-    row_extend_base(in, out, &pos, &width, res, &extend_left, &extend_right);
-    /* Forward-extend */
-    fill_block(out + extend_left + width, extend_right, in[res-1]);
-    /* Backward-extend */
-    fill_block(out, extend_left, in[0]);
-}
-
-static void
-mask_rle_execute_min_max(const MaskRLE *mrle, MinMaxPrecomputedRow **prows,
-                         gdouble *outbuf, guint width, gboolean maximum)
-{
-    const MaskSegment *seg = mrle->segments;
-    guint n = mrle->nsegments, i, j;
-    const gdouble *segdata = prows[seg->row]->each[seg->len] + seg->col;
-
-    gwy_assign(outbuf, segdata, width);
-    seg++;
-    for (i = n-1; i; i--, seg++) {
-        segdata = prows[seg->row]->each[seg->len] + seg->col;
-        if (maximum) {
-            for (j = 0; j < width; j++) {
-                if (outbuf[j] < segdata[j])
-                    outbuf[j] = segdata[j];
-            }
-        }
-        else {
-            for (j = 0; j < width; j++) {
-                if (outbuf[j] > segdata[j])
-                    outbuf[j] = segdata[j];
-            }
-        }
-    }
-}
-
-static gboolean
-gwy_data_field_area_rle_analyse(GwyDataField *kernel,
-                                gint width,
-                                MinMaxPrecomputed *mmp)
-{
-    guint kxres, kyres, i;
-
-    kxres = kernel->xres;
-    kyres = kernel->yres;
-    mmp->rowbuflen = width + kxres-1;
-    mmp->kxres = kxres;
-    mmp->kyres = kyres;
-
-    /* Run-length encode the mask, i.e. transform it to a set of segments
-     * and their positions. */
-    mmp->mrle = run_length_encode_mask(kernel);
-    if (!mmp->mrle->nsegments) {
-        mask_rle_free(mmp->mrle);
-        return FALSE;
-    }
-
-    mmp->req = find_required_lengths_for_rle(mmp->mrle);
-
-    /* Create the row buffers for running extrema of various lengths. */
-    mmp->prows = g_new(MinMaxPrecomputedRow*, kyres);
-    for (i = 0; i < kyres; i++)
-        mmp->prows[i] = min_max_precomputed_row_alloc(mmp->req, mmp->rowbuflen);
-
-    mmp->extrowbuf = g_new(gdouble, mmp->rowbuflen);
-
-    return TRUE;
-}
-
-static int
-compare_segment(const void *pa, const void *pb)
-{
-    const MaskSegment *a = (const MaskSegment*)pa, *b = (const MaskSegment*)pb;
-
-    if (a->row < b->row)
-        return -1;
-    if (a->row > b->row)
-        return 1;
-    if (a->col < b->col)
-        return -1;
-    if (a->col > b->col)
-        return 1;
-    return 0;
-}
-
-/* Rotate the RLE data by pi.  The set of block lengths does not change.
- * Therefore, the decompositions do not change either.  The only thing that
- * changes is the positions of the RLE segments. */
-static void
-gwy_data_field_area_rle_flip(MaskRLE *mrle, guint kxres, guint kyres)
-{
-    guint i;
-
-    for (i = 0; i < mrle->nsegments; i++) {
-        MaskSegment *seg = mrle->segments + i;
-        seg->col = kxres - seg->col - seg->len;
-        seg->row = kyres-1 - seg->row;
-    }
-
-    qsort(mrle->segments, mrle->nsegments, sizeof(MaskSegment),
-          compare_segment);
-}
-
-static void
-gwy_data_field_area_rle_free(MinMaxPrecomputed *mmp)
-{
-    guint i;
-
-    g_free(mmp->extrowbuf);
-    for (i = 0; i < mmp->kyres; i++)
-        min_max_precomputed_row_free(mmp->prows[i]);
-    g_free(mmp->prows);
-    min_max_precomputed_req_free(mmp->req);
-    mask_rle_free(mmp->mrle);
-}
-
-static void
-gwy_data_field_area_min_max_execute(GwyDataField *dfield,
-                                    gdouble *outbuf,
-                                    MinMaxPrecomputed *mmp,
-                                    gboolean maximum,
-                                    gint col, gint row,
-                                    gint width, gint height)
-{
-    MaskRLE *mrle = mmp->mrle;
-    MinMaxPrecomputedReq *req = mmp->req;
-    MinMaxPrecomputedRow **prows = mmp->prows, *prow;
-    MinMaxPrecomputedRowFill precomp_row_fill;
-    guint xres, yres, i, ii;
-    guint extend_up, extend_down, extend_left, extend_right;
-    gdouble *d, *extrowbuf = mmp->extrowbuf;
-    guint rowbuflen = mmp->rowbuflen;
-
-    xres = dfield->xres;
-    yres = dfield->yres;
-    d = dfield->data;
-    precomp_row_fill = (maximum
-                        ? max_precomputed_row_fill
-                        : min_precomputed_row_fill);
-
-    /* Initialise the buffers for the zeroth row of the area.  For the maximum
-     * operation we even-sized kernels to the other direction to obtain
-     * morphological operation according to definitions. */
-    if (maximum) {
-        extend_up = mmp->kyres/2;
-        extend_down = (mmp->kyres - 1)/2;
-        extend_left = mmp->kxres/2;
-        extend_right = (mmp->kxres - 1)/2;
-    }
-    else {
-        extend_up = (mmp->kyres - 1)/2;
-        extend_down = mmp->kyres/2;
-        extend_left = (mmp->kxres - 1)/2;
-        extend_right = mmp->kxres/2;
-    }
-
-    for (i = 0; i <= extend_down; i++) {
-        if (row + i < yres) {
-            row_extend_border(d + xres*(row + i), extrowbuf,
-                              col, width, xres,
-                              extend_left, extend_right,
-                              0.0);
-            precomp_row_fill(req, prows[i + extend_up], extrowbuf, rowbuflen);
-        }
-        else
-            min_max_precomputed_row_copy(prows[i], prows[i-1], req, rowbuflen);
-    }
-    for (i = 1; i <= extend_up; i++) {
-        ii = extend_up - i;
-        if (i <= (guint)row) {
-            row_extend_border(d + xres*(row - i), extrowbuf,
-                              col, width, xres,
-                              extend_left, extend_right,
-                              0.0);
-            precomp_row_fill(req, prows[ii], extrowbuf, rowbuflen);
-        }
-        else
-            min_max_precomputed_row_copy(prows[ii],
-                                         prows[(ii + 1) % mmp->kyres],
-                                         req, rowbuflen);
-    }
-
-    /* Go through the rows and extract the minima or maxima from the
-     * precomputed segment data. */
-    i = 0;
-    while (TRUE) {
-        mask_rle_execute_min_max(mrle, prows, outbuf + i*width, width, maximum);
-        i++;
-        if (i == (guint)height)
-            break;
-
-        /* Rotate physically prows[] so that the current row is at the zeroth
-         * position.  We could use cyclic buffers but then all subordinate
-         * functions would know how to handle them and calculating mod() for
-         * all indexing is inefficient anyway. */
-        prow = prows[0];
-        for (ii = 0; ii < mmp->kyres-1; ii++)
-            prows[ii] = prows[ii+1];
-        prows[mmp->kyres-1] = prow;
-
-        /* Precompute the new row at the bottom. */
-        ii = row + i + extend_down;
-        if (ii < yres) {
-            row_extend_border(d + xres*ii, extrowbuf,
-                              col, width, xres,
-                              extend_left, extend_right,
-                              0.0);
-            precomp_row_fill(req, prow, extrowbuf, rowbuflen);
-        }
-        else {
-            g_assert(mmp->kyres >= 2);
-            min_max_precomputed_row_copy(prow, prows[mmp->kyres-2],
-                                         req, rowbuflen);
-        }
-    }
-}
-
-static gboolean
-kernel_is_nonempty(GwyDataField *dfield)
-{
-    guint i, n = dfield->xres * dfield->yres;
-    gdouble *d = dfield->data;
-
-    for (i = 0; i < n; i++, d++) {
-        if (*d)
-            return TRUE;
-    }
-    return FALSE;
-}
-
-/* NB: The kernel passed to this function should be non-empty. */
-static void
-gwy_data_field_area_filter_min_max_real(GwyDataField *data_field,
-                                        GwyDataField *kernel,
-                                        GwyMinMaxFilterType filtertype,
-                                        gint col, gint row,
-                                        gint width, gint height)
-{
-    MinMaxPrecomputed mmp;
-    gdouble *outbuf, *d;
-    gint i, j, xres, yres, kxres, kyres;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(col >= 0 && row >= 0
-                     && width > 0 && height > 0
-                     && col + width <= data_field->xres
-                     && row + height <= data_field->yres);
-
-    xres = data_field->xres;
-    yres = data_field->yres;
-    kxres = kernel->xres;
-    kyres = kernel->yres;
-    d = data_field->data;
-
-    if (filtertype == GWY_MIN_MAX_FILTER_MINIMUM
-        || filtertype == GWY_MIN_MAX_FILTER_MAXIMUM) {
-        gboolean is_max = (filtertype == GWY_MIN_MAX_FILTER_MAXIMUM);
-
-        gwy_data_field_area_rle_analyse(kernel, width, &mmp);
-        if (is_max)
-            gwy_data_field_area_rle_flip(mmp.mrle, kxres, kyres);
-        outbuf = g_new(gdouble, width*height);
-        gwy_data_field_area_min_max_execute(data_field, outbuf, &mmp, is_max,
-                                            col, row, width, height);
-        gwy_data_field_area_rle_free(&mmp);
-
-        d += row*xres + col;
-        for (i = 0; i < height; i++)
-            gwy_assign(d + i*xres, outbuf + i*width, width);
-        gwy_data_field_invalidate(data_field);
-        g_free(outbuf);
-    }
-    else if (filtertype == GWY_MIN_MAX_FILTER_RANGE
-             || filtertype == GWY_MIN_MAX_FILTER_NORMALIZATION) {
-        gdouble *outbuf2;
-
-        gwy_data_field_area_rle_analyse(kernel, width, &mmp);
-        outbuf = g_new(gdouble, width*height);
-        gwy_data_field_area_min_max_execute(data_field, outbuf, &mmp, FALSE,
-                                            col, row, width, height);
-
-        gwy_data_field_area_rle_flip(mmp.mrle, kxres, kyres);
-        outbuf2 = g_new(gdouble, width*height);
-        gwy_data_field_area_min_max_execute(data_field, outbuf2, &mmp, TRUE,
-                                            col, row, width, height);
-        gwy_data_field_area_rle_free(&mmp);
-
-        d += row*xres + col;
-        if (filtertype == GWY_MIN_MAX_FILTER_RANGE) {
-            for (i = 0; i < height; i++) {
-                for (j = 0; j < width; j++)
-                    d[i*xres + j] = outbuf2[i*width + j] - outbuf[i*width + j];
-            }
-        }
-        else {
-            for (i = 0; i < height; i++) {
-                for (j = 0; j < width; j++) {
-                    gdouble min = outbuf[i*width + j];
-                    gdouble max = outbuf2[i*width + j];
-
-                    if (G_UNLIKELY(min == max))
-                        d[i*xres + j] = 0.5;
-                    else
-                        d[i*xres + j] = (d[i*xres + j] - min)/(max - min);
-                }
-            }
-        }
-        gwy_data_field_invalidate(data_field);
-        g_free(outbuf2);
-        g_free(outbuf);
-    }
-    else if (filtertype == GWY_MIN_MAX_FILTER_OPENING
-             || filtertype == GWY_MIN_MAX_FILTER_CLOSING) {
-        gboolean is_closing = (filtertype == GWY_MIN_MAX_FILTER_CLOSING);
-        /* To limit the area of application but keep the influence of
-         * surrouding pixels as if we did erosion and dilation on the entire
-         * field, we must perform the first operation in an extended area. */
-        gint extcol = MAX(0, col - kxres/2);
-        gint extrow = MAX(0, row - kyres/2);
-        gint extwidth = MIN(xres, col + width + kxres/2) - extcol;
-        gint extheight = MIN(yres, row + height + kyres/2) - extrow;
-        GwyDataField *tmpfield;
-
-        gwy_data_field_area_rle_analyse(kernel, extwidth, &mmp);
-        if (is_closing)
-            gwy_data_field_area_rle_flip(mmp.mrle, kxres, kyres);
-        tmpfield = gwy_data_field_new(extwidth, extheight, extwidth, extheight,
-                                      FALSE);
-        gwy_data_field_area_min_max_execute(data_field, tmpfield->data, &mmp,
-                                            is_closing,
-                                            extcol, extrow,
-                                            extwidth, extheight);
-
-        if (extcol == col && extrow == row
-            && extwidth == width && extheight == height) {
-            /* Avoid repeating the analysis for full-field application. */
-            gwy_data_field_area_rle_flip(mmp.mrle, kxres, kyres);
-        }
-        else {
-            gwy_data_field_area_rle_free(&mmp);
-            gwy_data_field_area_rle_analyse(kernel, width, &mmp);
-            if (!is_closing)
-                gwy_data_field_area_rle_flip(mmp.mrle, kxres, kyres);
-        }
-        outbuf = g_new(gdouble, width*height);
-        gwy_data_field_area_min_max_execute(tmpfield, outbuf, &mmp,
-                                            !is_closing,
-                                            col - extcol, row - extrow,
-                                            width, height);
-        gwy_data_field_area_rle_free(&mmp);
-        g_object_unref(tmpfield);
-
-        d += row*xres + col;
-        for (i = 0; i < height; i++)
-            gwy_assign(d + i*xres, outbuf + i*width, width);
-        gwy_data_field_invalidate(data_field);
-
-        g_free(outbuf);
-    }
-    else {
-        g_return_if_reached();
-    }
-}
-
-/**
- * gwy_data_field_area_filter_min_max:
- * @data_field: A data field to apply the filter to.
- * @kernel: Data field defining the flat structuring element.
- * @filtertype: The type of filter to apply.
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- *
- * Applies a morphological operation with a flat structuring element to a
- * part of a data field.
- *
- * Morphological operations with flat structuring elements can be expressed
- * using minimum (erosion) and maximum (dilation) filters that are the basic
- * operations this function can perform.
- *
- * The kernel field is a mask that defines the shape of the flat structuring
- * element.  It is reflected for all maximum operations (dilation).  For
- * symmetrical kernels this does not matter.  You can use
- * gwy_data_field_elliptic_area_fill() to create a true circular (or
- * elliptical) kernel.
- *
- * The kernel is implicitly centered, i.e. it will be applied symmetrically to
- * avoid unexpected data movement.  Even-sized kernels (generally not
- * recommended) will extend farther towards the top left image corner for
- * minimum (erosion) and towards the bottom right corner for maximum (dilation)
- * operations due to the reflection.  If you need off-center structuring
- * elements you can add empty rows or columns to one side of the kernel to
- * counteract the symmetrisation.
- *
- * The operation is linear-time in kernel size for any convex kernel.  Note
- * gwy_data_field_area_filter_minimum() and
- * gwy_data_field_area_filter_maximum(), which are limited to square
- * structuring elements, are much faster for large sizes of the squares.
- *
- * The exterior is always handled as %GWY_EXTERIOR_BORDER_EXTEND.
- *
- * Since: 2.43
- **/
-void
-gwy_data_field_area_filter_min_max(GwyDataField *data_field,
-                                   GwyDataField *kernel,
-                                   GwyMinMaxFilterType filtertype,
-                                   gint col, gint row,
-                                   gint width, gint height)
-{
-    GwyDataField *redkernel;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(kernel));
-    redkernel = gwy_data_field_duplicate(kernel);
-    gwy_data_field_grains_autocrop(redkernel, TRUE, NULL, NULL, NULL, NULL);
-    if (kernel_is_nonempty(redkernel)) {
-        gwy_data_field_area_filter_min_max_real(data_field, redkernel,
-                                                filtertype,
-                                                col, row, width, height);
-    }
-    g_object_unref(redkernel);
-}
-
-/**
- * gwy_data_field_area_filter_disc_asf:
- * @data_field: A data field to apply the filter to.
- * @radius: Maximum radius of the circular structuring element, in pixels.
- *          For radius 0 and smaller the filter is no-op.
- * @closing: %TRUE requests an opening-closing filter (i.e. ending with
- *           closing), %FALSE requests a closing-opening filter (i.e. ending
- *           with opening).
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- *
- * Applies an alternating sequential morphological filter with a flat disc
- * structuring element to a part of a data field.
- *
- * Alternating sequential filter is a filter consisting of repeated opening and
- * closing (or closing and opening) with progressively larger structuring
- * elements.  This function performs such filtering for sequence of structuring
- * elements consisting of true Euclidean discs with increasing radii.  The
- * largest disc in the sequence fits into a (2 at size + 1) × (2 at size + 1) square.
- *
- * Since: 2.43
- **/
-void
-gwy_data_field_area_filter_disc_asf(GwyDataField *data_field,
-                                    gint radius,
-                                    gboolean closing,
-                                    gint col,
-                                    gint row,
-                                    gint width,
-                                    gint height)
-{
-    GwyMinMaxFilterType filtertype1, filtertype2;
-    gint r;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(col >= 0 && row >= 0
-                     && width > 0 && height > 0
-                     && col + width <= data_field->xres
-                     && row + height <= data_field->yres);
-
-    if (closing) {
-        filtertype1 = GWY_MIN_MAX_FILTER_OPENING;
-        filtertype2 = GWY_MIN_MAX_FILTER_CLOSING;
-    }
-    else {
-        filtertype1 = GWY_MIN_MAX_FILTER_CLOSING;
-        filtertype2 = GWY_MIN_MAX_FILTER_OPENING;
-    }
-
-    for (r = 1; r <= radius; r++) {
-        gint size = 2*r + 1;
-        GwyDataField *kernel = gwy_data_field_new(size, size, size, size, TRUE);
-        gwy_data_field_elliptic_area_fill(kernel, 0, 0, size, size, 1.0);
-        gwy_data_field_area_filter_min_max_real(data_field, kernel, filtertype1,
-                                                col, row, width, height);
-        gwy_data_field_area_filter_min_max_real(data_field, kernel, filtertype2,
-                                                col, row, width, height);
-        g_object_unref(kernel);
-    }
-}
-
-/**
  * kuwahara_block:
  * @a: points to a 5x5 matrix (array of 25 doubles)
  *
diff --git a/libprocess/filters.h b/libprocess/filters.h
index 42b711c..ea0d99c 100644
--- a/libprocess/filters.h
+++ b/libprocess/filters.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: filters.h 18539 2016-03-28 19:40:38Z yeti-dn $
+ *  @(#) $Id: filters.h 19808 2017-05-30 07:32:41Z yeti-dn $
  *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -77,6 +77,16 @@ void gwy_data_field_area_convolve                     (GwyDataField *data_field,
                                                        gint row,
                                                        gint width,
                                                        gint height);
+void gwy_data_field_area_ext_convolve                 (GwyDataField *field,
+                                                       guint col,
+                                                       guint row,
+                                                       guint width,
+                                                       guint height,
+                                                       GwyDataField *target,
+                                                       GwyDataField *kernel,
+                                                       GwyExteriorType exterior,
+                                                       gdouble fill_value,
+                                                       gboolean as_integral);
 void gwy_data_field_convolve_1d                       (GwyDataField *data_field,
                                                        GwyDataLine *kernel_line,
                                                        GwyOrientation orientation);
@@ -87,6 +97,16 @@ void gwy_data_field_area_convolve_1d                  (GwyDataField *data_field,
                                                        gint row,
                                                        gint width,
                                                        gint height);
+void gwy_data_field_area_ext_row_convolve             (GwyDataField *field,
+                                                       guint col,
+                                                       guint row,
+                                                       guint width,
+                                                       guint height,
+                                                       GwyDataField *target,
+                                                       GwyDataLine *kernel,
+                                                       GwyExteriorType exterior,
+                                                       gdouble fill_value,
+                                                       gboolean as_integral);
 void gwy_data_field_filter_median                     (GwyDataField *data_field,
                                                        gint size);
 void gwy_data_field_area_filter_median                (GwyDataField *data_field,
diff --git a/libprocess/fractals.c b/libprocess/fractals.c
index cdbedfc..4ad6020 100644
--- a/libprocess/fractals.c
+++ b/libprocess/fractals.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: fractals.c 16242 2014-05-30 20:39:32Z yeti-dn $
+ *  @(#) $Id: fractals.c 19698 2017-05-03 20:18:10Z yeti-dn $
  *  Copyright (C) 2004 Jindrich Bilek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -19,13 +19,12 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-#include "config.h"
-#include <glib.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
 #include <libgwyddion/gwyrandgenset.h>
 #include <libprocess/datafield.h>
 #include <libprocess/stats.h>
+#include <libprocess/fractals.h>
 
 static void gwy_data_field_fractal_fit(GwyDataLine *xresult,
                                        GwyDataLine *yresult,
diff --git a/libprocess/grains-disttrans.c b/libprocess/grains-disttrans.c
new file mode 100644
index 0000000..6aa889c
--- /dev/null
+++ b/libprocess/grains-disttrans.c
@@ -0,0 +1,978 @@
+/*
+ *  @(#) $Id: grains-disttrans.c 19984 2017-06-26 11:18:06Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libprocess/arithmetic.h>
+#include <libprocess/grains.h>
+#include "gwyprocessinternal.h"
+
+enum {
+    SEDINF = 0x7fffffffu,
+    QUEUED = 0x80000000u,
+};
+
+typedef struct {
+    gdouble distance;
+    guint i;
+    guint j;
+} DistantPoint;
+
+typedef struct {
+    gdouble dist, ndist;
+    gint j, i;
+} ThinCandidate;
+
+typedef gboolean (*ErodeFunc)(guint *grain,
+                              gint width, gint height,
+                              guint id,
+                              const PixelQueue *inqueue,
+                              PixelQueue *outqueue);
+
+
+/* Euclidean distance transform */
+
+static inline void
+pixel_queue_add(PixelQueue *queue,
+                gint i, gint j)
+{
+    if (G_UNLIKELY(queue->len == queue->size)) {
+        queue->size = MAX(2*queue->size, 16);
+        queue->points = g_renew(GridPoint, queue->points, queue->size);
+    }
+
+    queue->points[queue->len].i = i;
+    queue->points[queue->len].j = j;
+    queue->len++;
+}
+
+// Set squared distance for all points that have an 8-neighbour outside and
+// add them to the queue.
+static void
+distance_transform_first_step(guint *distances,
+                              guint xres, guint yres,
+                              IntList *queue,
+                              gboolean from_border)
+{
+    guint k = 0, j, i;
+
+    queue->len = 0;
+    for (i = 0; i < yres; i++) {
+        gboolean first_row = (i == 0);
+        gboolean last_row = (i == yres-1);
+
+        for (j = 0; j < xres; j++, k++) {
+            gboolean first_column = (j == 0);
+            gboolean last_column = (j == xres-1);
+
+            if (!distances[k])
+                continue;
+
+            if ((from_border && (first_row || first_column
+                                 || last_row || last_column))
+                || (!first_row && !distances[k-xres])
+                || (!first_column && !distances[k-1])
+                || (!last_column && !distances[k+1])
+                || (!last_row && !distances[k+xres])) {
+                distances[k] = 1;
+                int_list_add(queue, k);
+            }
+            else if ((!first_row && !first_column && !distances[k-xres-1])
+                     || (!first_row && !last_column && !distances[k-xres+1])
+                     || (!last_row && !first_column && !distances[k+xres-1])
+                     || (!last_row && !last_column && !distances[k+xres+1])) {
+                distances[k] = 2;
+                int_list_add(queue, k);
+            }
+        }
+    }
+}
+
+static void
+distance_transform_erode_sed(guint *distances, const guint *olddist,
+                             guint xres, guint yres,
+                             guint l,
+                             const IntList *inqueue,
+                             IntList *outqueue)
+{
+    guint hvsed2 = 2*l - 1, diag2 = 2*hvsed2;
+    guint q;
+
+    outqueue->len = 0;
+
+    for (q = 0; q < inqueue->len; q++) {
+        guint k = inqueue->data[q], kk = k-xres-1;
+        guint i = k/xres, j = k % xres;
+        gboolean first_row = (i == 0);
+        gboolean last_row = (i == yres-1);
+        gboolean first_column = (j == 0);
+        gboolean last_column = (j == xres-1);
+        guint d2hv = olddist[k] + hvsed2, d2d = olddist[k] + diag2;
+
+        if (!first_row && !first_column && (distances[kk] & ~QUEUED) > d2d) {
+            if (!(distances[kk] & QUEUED))
+                int_list_add(outqueue, kk);
+            distances[kk] = QUEUED | d2d;
+        }
+        kk++;
+        if (!first_row && (distances[kk] & ~QUEUED) > d2hv) {
+            if (!(distances[kk] & QUEUED))
+                int_list_add(outqueue, kk);
+            distances[kk] = QUEUED | d2hv;
+        }
+        kk++;
+        if (!first_row && !last_column && (distances[kk] & ~QUEUED) > d2d) {
+            if (!(distances[kk] & QUEUED))
+                int_list_add(outqueue, kk);
+            distances[kk] = QUEUED | d2d;
+        }
+        kk += xres-2;
+        if (!first_column && (distances[kk] & ~QUEUED) > d2hv) {
+            if (!(distances[kk] & QUEUED))
+                int_list_add(outqueue, kk);
+            distances[kk] = QUEUED | d2hv;
+        }
+        kk += 2;
+        if (!last_column && (distances[kk] & ~QUEUED) > d2hv) {
+            if (!(distances[kk] & QUEUED))
+                int_list_add(outqueue, kk);
+            distances[kk] = QUEUED | d2hv;
+        }
+        kk += xres-2;
+        if (!last_row && !first_column && (distances[kk] & ~QUEUED) > d2d) {
+            if (!(distances[kk] & QUEUED))
+                int_list_add(outqueue, kk);
+            distances[kk] = QUEUED | d2d;
+        }
+        kk++;
+        if (!last_row && (distances[kk] & ~QUEUED) > d2hv) {
+            if (!(distances[kk] & QUEUED))
+                int_list_add(outqueue, kk);
+            distances[kk] = QUEUED | d2hv;
+        }
+        kk++;
+        if (!last_row && !last_column && (distances[kk] & ~QUEUED) > d2d) {
+            if (!(distances[kk] & QUEUED))
+                int_list_add(outqueue, kk);
+            distances[kk] = QUEUED | d2d;
+        }
+    }
+}
+
+/**
+ * _gwy_distance_transform_raw:
+ * @distances: Array @xres*@yres with nonzeroes within shapes.  If all non-zero
+ *             values are %SEDINF you can pass %TRUE for @infinitised.
+ * @workspace: Workspace of identical dimensions as @distances.
+ * @xres: Width.
+ * @yres: Height.
+ * @inqueue: Pre-allocated queue used by the algorithm.
+ * @outqueue: Second pre-allocated queue used by the algorithm.
+ * @from_border: %TRUE to consider image edges to be grain boundaries.
+ *
+ * Performs distance transformation.
+ *
+ * When it finishes non-zero values in @distances are squared Euclidean
+ * distances from outside pixels (including outside the field).
+ *
+ * Workspace objects @workspace, @inqueue and @outqueue do not carry any
+ * information.  They are allocated by the caller to enable an efficient
+ * repeated use.
+ **/
+static void
+distance_transform_raw(guint *distances, guint *workspace,
+                       guint xres, guint yres,
+                       IntList *inqueue, IntList *outqueue,
+                       gboolean from_border)
+{
+    guint l, q;
+
+    distance_transform_first_step(distances, xres, yres, inqueue, from_border);
+
+    for (l = 2; inqueue->len; l++) {
+        gint *qdata;
+
+        for (q = 0; q < inqueue->len; q++) {
+            guint k = inqueue->data[q];
+            workspace[k] = distances[k];
+        }
+        distance_transform_erode_sed(distances, workspace, xres, yres, l,
+                                     inqueue, outqueue);
+
+        qdata = outqueue->data;
+        for (q = outqueue->len; q; q--, qdata++)
+            distances[*qdata] &= ~QUEUED;
+
+        GWY_SWAP(IntList*, inqueue, outqueue);
+    }
+}
+
+static void
+gwy_data_field_grain_distance_transform_internal(GwyDataField *data_field,
+                                                 gboolean from_border)
+{
+    IntList *inqueue, *outqueue;
+    guint xres, yres, k, inisize;
+    guint *distances, *workspace;
+    gdouble *d;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+
+    xres = data_field->xres;
+    yres = data_field->yres;
+    d = data_field->data;
+    distances = g_new(guint, xres*yres);
+    workspace = g_new(guint, xres*yres);
+
+    for (k = 0; k < xres*yres; k++)
+        distances[k] = (d[k] > 0.0) ? SEDINF : 0;
+
+    inisize = (guint)(8*sqrt(xres*yres) + 16);
+    inqueue = int_list_new(inisize);
+    outqueue = int_list_new(inisize);
+
+    distance_transform_raw(distances, workspace, xres, yres, inqueue, outqueue,
+                           from_border);
+
+    int_list_free(inqueue);
+    int_list_free(outqueue);
+
+    for (k = 0; k < xres*yres; k++)
+        d[k] = sqrt(distances[k]);
+    gwy_data_field_invalidate(data_field);
+
+    g_free(workspace);
+    g_free(distances);
+}
+
+/**
+ * gwy_data_field_grain_distance_transform:
+ * @data_field: A data field with zeroes in empty space and nonzeroes in
+ *              grains.
+ *
+ * Performs Euclidean distance transform of a data field with grains.
+ *
+ * Each non-zero value will be replaced with Euclidean distance to the grain
+ * boundary, measured in pixels.
+ *
+ * See also gwy_data_field_grain_simple_dist_trans() for simple distance
+ * transforms such as city-block or chessboard.
+ *
+ * Since: 2.36
+ **/
+void
+gwy_data_field_grain_distance_transform(GwyDataField *data_field)
+{
+    gwy_data_field_grain_distance_transform_internal(data_field, TRUE);
+}
+
+/* Init @queue with all Von Neumann-neighbourhood boundary pixels. */
+static void
+init_erosion_4(guint *grain,
+               guint width, guint height,
+               gboolean from_border,
+               PixelQueue *queue)
+{
+    guint ifrom = from_border ? 0 : 1;
+    guint iend = from_border ? height : height-1;
+    guint jfrom = from_border ? 0 : 1;
+    guint jend = from_border ? width : width-1;
+    guint i, j, k;
+
+    queue->len = 0;
+    for (i = ifrom; i < iend; i++) {
+        k = i*width + jfrom;
+        for (j = jfrom; j < jend; j++, k++) {
+            if (!grain[k])
+                continue;
+
+            if (!i || !j || j == width-1 || i == height-1
+                || !grain[k - width] || !grain[k - 1]
+                || !grain[k + 1] || !grain[k + width]) {
+                grain[k] = 1;
+                pixel_queue_add(queue, i, j);
+            }
+        }
+    }
+}
+
+/* Init @queue with all Von Neumann-neighbourhood boundary pixels. */
+static void
+init_erosion_8(guint *grain,
+               gint width, gint height,
+               gboolean from_border,
+               PixelQueue *queue)
+{
+    guint ifrom = from_border ? 0 : 1;
+    guint iend = from_border ? height : height-1;
+    guint jfrom = from_border ? 0 : 1;
+    guint jend = from_border ? width : width-1;
+    guint i, j, k;
+
+    queue->len = 0;
+    for (i = ifrom; i < iend; i++) {
+        k = i*width + jfrom;
+        for (j = jfrom; j < jend; j++, k++) {
+            if (!grain[k])
+                continue;
+
+            if (!i || !j || j == width-1 || i == height-1
+                || !grain[k - width - 1] || !grain[k - width]
+                || !grain[k - width + 1]
+                || !grain[k - 1] || !grain[k + 1]
+                || !grain[k + width - 1] || !grain[k + width]
+                || !grain[k + width + 1]) {
+                grain[k] = 1;
+                pixel_queue_add(queue, i, j);
+            }
+        }
+    }
+}
+
+static gboolean
+erode_4(guint *grain,
+        gint width, gint height,
+        guint id,
+        const PixelQueue *inqueue,
+        PixelQueue *outqueue)
+{
+    const GridPoint *ipt = inqueue->points;
+    guint m;
+
+    outqueue->len = 0;
+    for (m = inqueue->len; m; m--, ipt++) {
+        gint i = ipt->i, j = ipt->j, k = i*width + j;
+
+        if (i && grain[k - width] == G_MAXUINT) {
+            grain[k - width] = id+1;
+            pixel_queue_add(outqueue, i-1, j);
+        }
+        if (j && grain[k - 1] == G_MAXUINT) {
+            grain[k - 1] = id+1;
+            pixel_queue_add(outqueue, i, j-1);
+        }
+        if (j < width-1 && grain[k + 1] == G_MAXUINT) {
+            grain[k + 1] = id+1;
+            pixel_queue_add(outqueue, i, j+1);
+        }
+        if (i < height-1 && grain[k + width] == G_MAXUINT) {
+            grain[k + width] = id+1;
+            pixel_queue_add(outqueue, i+1, j);
+        }
+    }
+
+    return outqueue->len;
+}
+
+static gboolean
+erode_8(guint *grain,
+        gint width, gint height,
+        guint id,
+        const PixelQueue *inqueue,
+        PixelQueue *outqueue)
+{
+    const GridPoint *ipt = inqueue->points;
+    guint m;
+
+    outqueue->len = 0;
+    for (m = inqueue->len; m; m--, ipt++) {
+        gint i = ipt->i, j = ipt->j, k = i*width + j;
+        if (i && j && grain[k - width - 1] == G_MAXUINT) {
+            grain[k - width - 1] = id+1;
+            pixel_queue_add(outqueue, i-1, j-1);
+        }
+        if (i && grain[k - width] == G_MAXUINT) {
+            grain[k - width] = id+1;
+            pixel_queue_add(outqueue, i-1, j);
+        }
+        if (i && j < width-1 && grain[k - width + 1] == G_MAXUINT) {
+            grain[k - width + 1] = id+1;
+            pixel_queue_add(outqueue, i-1, j+1);
+        }
+        if (j && grain[k - 1] == G_MAXUINT) {
+            grain[k - 1] = id+1;
+            pixel_queue_add(outqueue, i, j-1);
+        }
+        if (j < width-1 && grain[k + 1] == G_MAXUINT) {
+            grain[k + 1] = id+1;
+            pixel_queue_add(outqueue, i, j+1);
+        }
+        if (i < height-1 && j && grain[k + width - 1] == G_MAXUINT) {
+            grain[k + width - 1] = id+1;
+            pixel_queue_add(outqueue, i+1, j-1);
+        }
+        if (i < height-1 && grain[k + width] == G_MAXUINT) {
+            grain[k + width] = id+1;
+            pixel_queue_add(outqueue, i+1, j);
+        }
+        if (i < height-1 && j < width-1 && grain[k + width + 1] == G_MAXUINT) {
+            grain[k + width + 1] = id+1;
+            pixel_queue_add(outqueue, i+1, j+1);
+        }
+    }
+
+    return outqueue->len;
+}
+
+/* Perform a cityblock, chessboard or octagonal distance transform of given
+ * type using provided queues. */
+guint
+_gwy_simple_dist_trans(gint *grain, guint width, guint height,
+                       gboolean from_border, GwyDistanceTransformType dtype,
+                       PixelQueue *inqueue, PixelQueue *outqueue)
+{
+    ErodeFunc erode = NULL;
+    guint dist = 1;
+
+    inqueue->len = outqueue->len = 0;
+
+    if (dtype == GWY_DISTANCE_TRANSFORM_CONN4
+        || dtype == GWY_DISTANCE_TRANSFORM_OCTAGONAL48)
+        init_erosion_4(grain, width, height, from_border, inqueue);
+    else if (dtype == GWY_DISTANCE_TRANSFORM_CONN8
+             || dtype == GWY_DISTANCE_TRANSFORM_OCTAGONAL84)
+        init_erosion_8(grain, width, height, from_border, inqueue);
+
+    if (dtype == GWY_DISTANCE_TRANSFORM_CONN4
+        || dtype == GWY_DISTANCE_TRANSFORM_OCTAGONAL84)
+        erode = erode_4;
+    else if (dtype == GWY_DISTANCE_TRANSFORM_CONN8
+             || dtype == GWY_DISTANCE_TRANSFORM_OCTAGONAL48)
+        erode = erode_8;
+
+    g_return_val_if_fail(erode, 0);
+
+    while (TRUE) {
+        if (!erode(grain, width, height, dist, inqueue, outqueue))
+            break;
+        GWY_SWAP(PixelQueue*, inqueue, outqueue);
+        dist++;
+
+        if (dtype == GWY_DISTANCE_TRANSFORM_OCTAGONAL48
+            || dtype == GWY_DISTANCE_TRANSFORM_OCTAGONAL84)
+            erode = (erode == erode_4) ? erode_8 : erode_4;
+    }
+
+    if (!from_border) {
+        guint k;
+
+        /* Fix single-pixel grains touching the image borders. */
+        for (k = 0; k < width; k++) {
+            if (grain[k] == G_MAXUINT)
+                grain[k] = 1;
+            if (grain[width*(height-1) + k] == G_MAXUINT)
+                grain[width*(height-1) + k] = 1;
+        }
+
+        for (k = 0; k < height; k++) {
+            if (grain[k*width] == G_MAXUINT)
+                grain[k*width] = 1;
+            if (grain[k*width + width-1] == G_MAXUINT)
+                grain[k*width + width-1] = 1;
+        }
+    }
+
+    return dist;
+}
+
+static void
+average_octagonal_dt(GwyDataField *dfield, gboolean from_border)
+{
+    GwyDataField *tmp;
+
+    tmp = gwy_data_field_duplicate(dfield);
+    gwy_data_field_grain_simple_dist_trans(dfield,
+                                           GWY_DISTANCE_TRANSFORM_OCTAGONAL48,
+                                           from_border);
+    gwy_data_field_grain_simple_dist_trans(tmp,
+                                           GWY_DISTANCE_TRANSFORM_OCTAGONAL84,
+                                           from_border);
+    gwy_data_field_sum_fields(dfield, dfield, tmp);
+    gwy_data_field_multiply(dfield, 0.5);
+    g_object_unref(tmp);
+}
+
+/**
+ * gwy_data_field_grain_simple_dist_trans:
+ * @data_field: A data field with zeroes in empty space and nonzeroes in
+ *              grains.
+ * @dtype: Type of simple distance to use.
+ * @from_border: %TRUE to consider image edges to be grain boundaries.
+ *
+ * Performs a distance transform of a data field with grains.
+ *
+ * Each non-zero value will be replaced with a distance to the grain boundary,
+ * measured in pixels.
+ *
+ * Note this function can calculate the true Euclidean distance transform
+ * only since 2.43.  Use gwy_data_field_grain_distance_transform() for the EDT
+ * if you need compatibility with older versions.
+ *
+ * Since: 2.41
+ **/
+void
+gwy_data_field_grain_simple_dist_trans(GwyDataField *data_field,
+                                       GwyDistanceTransformType dtype,
+                                       gboolean from_border)
+{
+    guint *grains = NULL;
+    PixelQueue *inqueue, *outqueue;
+    gdouble *d;
+    guint xres, yres, k;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+
+    if (dtype == GWY_DISTANCE_TRANSFORM_EUCLIDEAN) {
+        gwy_data_field_grain_distance_transform_internal(data_field,
+                                                         from_border);
+        return;
+    }
+    if (dtype == GWY_DISTANCE_TRANSFORM_OCTAGONAL) {
+        average_octagonal_dt(data_field, from_border);
+        return;
+    }
+
+    g_return_if_fail(dtype <= GWY_DISTANCE_TRANSFORM_OCTAGONAL84);
+
+    xres = data_field->xres;
+    yres = data_field->yres;
+    d = data_field->data;
+    inqueue = g_slice_new0(PixelQueue);
+    outqueue = g_slice_new0(PixelQueue);
+    grains = g_new(guint, xres*yres);
+    for (k = 0; k < xres*yres; k++)
+        grains[k] = (d[k] > 0.0) ? G_MAXUINT : 0;
+
+    _gwy_simple_dist_trans(grains, xres, yres, from_border, dtype,
+                           inqueue, outqueue);
+
+    for (k = 0; k < xres*yres; k++)
+        d[k] = grains[k];
+    gwy_data_field_invalidate(data_field);
+
+    g_free(grains);
+    g_free(inqueue->points);
+    g_free(outqueue->points);
+    g_slice_free(PixelQueue, inqueue);
+    g_slice_free(PixelQueue, outqueue);
+}
+
+/**
+ * gwy_data_field_grains_shrink:
+ * @data_field: A data field with zeroes in empty space and nonzeroes in
+ *              grains.
+ * @amount: How much the grains should be reduced, in pixels.  It is inclusive,
+ *          i.e. pixels that are @amount far from the border will be removed.
+ * @dtype: Type of simple distance to use.
+ * @from_border: %TRUE to consider image edges to be grain boundaries.
+ *               %FALSE to reduce grains touching field boundaries only along
+ *               the boundaries.
+ *
+ * Erodes a data field containing mask by specified amount using a distance
+ * measure.
+ *
+ * Non-zero pixels in @data_field will be replaced with zeroes if they are not
+ * farther than @amount from the grain boundary as defined by @dtype.
+ *
+ * Since: 2.43
+ **/
+void
+gwy_data_field_grains_shrink(GwyDataField *data_field,
+                             gdouble amount,
+                             GwyDistanceTransformType dtype,
+                             gboolean from_border)
+{
+    GwyDataField *edt;
+    guint xres, yres, k;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    g_return_if_fail(dtype <= GWY_DISTANCE_TRANSFORM_EUCLIDEAN);
+
+    if (amount < 0.5)
+        return;
+
+    xres = data_field->xres;
+    yres = data_field->yres;
+    edt = gwy_data_field_duplicate(data_field);
+    gwy_data_field_grain_simple_dist_trans(edt, dtype, from_border);
+    for (k = 0; k < xres*yres; k++) {
+        if (edt->data[k] <= amount + 1e-9)
+            data_field->data[k] = 0.0;
+    }
+
+    g_object_unref(edt);
+    gwy_data_field_invalidate(data_field);
+}
+
+static gint
+compare_distant_points(gconstpointer pa, gconstpointer pb)
+{
+    const DistantPoint *a = (const DistantPoint*)pa;
+    const DistantPoint *b = (const DistantPoint*)pb;
+
+    if (a->distance < b->distance)
+        return -1;
+    if (a->distance > b->distance)
+        return 1;
+    if (a->i < b->i)
+        return -1;
+    if (a->i > b->i)
+        return 1;
+    if (a->j < b->j)
+        return -1;
+    if (a->j > b->j)
+        return 1;
+    return 0;
+}
+
+static void
+grow_without_merging(GwyDataField *dfield, GwyDataField *edt, gdouble amount)
+{
+    GArray *array;
+    guint xres, yres, i, j, k, m;
+    gdouble *d, *e;
+    gint *grains;
+
+    xres = dfield->xres;
+    yres = dfield->yres;
+    d = dfield->data;
+    e = edt->data;
+    grains = g_new0(gint, xres*yres);
+    if (!gwy_data_field_number_grains(dfield, grains)) {
+        g_free(grains);
+        return;
+    }
+
+    array = g_array_sized_new(FALSE, FALSE, sizeof(DistantPoint), 1000);
+    for (i = 0; i < yres; i++) {
+        for (j = 0; j < xres; j++) {
+            gdouble eij = e[i*xres + j];
+            if (eij > 0.0 && eij <= amount) {
+                DistantPoint dp = { eij, i, j };
+                g_array_append_val(array, dp);
+            }
+        }
+    }
+    g_array_sort(array, compare_distant_points);
+
+    for (m = 0; m < array->len; m++) {
+        const DistantPoint *dp = &g_array_index(array, DistantPoint, m);
+        gint g1, g2, g3, g4, gno;
+
+        k = dp->i*xres + dp->j;
+        g1 = dp->i > 0      ? grains[k-xres] : 0;
+        g2 = dp->j > 0      ? grains[k-1]    : 0;
+        g3 = dp->j < xres-1 ? grains[k+1]    : 0;
+        g4 = dp->i < yres-1 ? grains[k+xres] : 0;
+        /* If all are equal or zeroes then bitwise or gives us the nonzero
+         * value sought. */
+        gno = g1 | g2 | g3 | g4;
+        if ((!g1 || g1 == gno)
+            && (!g2 || g2 == gno)
+            && (!g3 || g3 == gno)
+            && (!g4 || g4 == gno)) {
+            grains[k] = gno;
+            d[k] = 1.0;
+        }
+    }
+
+    g_array_free(array, TRUE);
+    g_free(grains);
+}
+
+/**
+ * gwy_data_field_grains_grow:
+ * @data_field: A data field with zeroes in empty space and nonzeroes in
+ *              grains.
+ * @amount: How much the grains should be expanded, in pixels.  It is
+ *          inclusive, i.e. exterior pixels that are @amount far from the
+ *          border will be filled.
+ * @dtype: Type of simple distance to use.
+ * @prevent_merging: %TRUE to prevent grain merging, i.e. the growth stops
+ *                   where two grains would merge.  %FALSE to simply expand the
+ *                   grains, without regard to grain connectivity.
+ *
+ * Dilates a data field containing mask by specified amount using a distance
+ * measure.
+ *
+ * Non-positive pixels in @data_field will be replaced with ones if they are
+ * not farther than @amount from the grain boundary as defined by @dtype.
+ *
+ * Since: 2.43
+ **/
+void
+gwy_data_field_grains_grow(GwyDataField *data_field,
+                           gdouble amount,
+                           GwyDistanceTransformType dtype,
+                           gboolean prevent_merging)
+{
+    GwyDataField *edt;
+    guint xres, yres, k;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    g_return_if_fail(dtype <= GWY_DISTANCE_TRANSFORM_EUCLIDEAN);
+
+    if (amount < 0.5)
+        return;
+
+    amount += 1e-9;
+    xres = data_field->xres;
+    yres = data_field->yres;
+    edt = gwy_data_field_duplicate(data_field);
+    gwy_data_field_grains_invert(edt);
+    gwy_data_field_grain_simple_dist_trans(edt, dtype, FALSE);
+    if (prevent_merging)
+        grow_without_merging(data_field, edt, amount);
+    else {
+        for (k = 0; k < xres*yres; k++) {
+            if (edt->data[k] <= amount)
+                data_field->data[k] = 1.0;
+        }
+    }
+    g_object_unref(edt);
+    gwy_data_field_invalidate(data_field);
+}
+
+static gint
+compare_candidate(gconstpointer pa, gconstpointer pb)
+{
+    const ThinCandidate *a = (const ThinCandidate*)pa;
+    const ThinCandidate *b = (const ThinCandidate*)pb;
+
+    /* Take pixels with lowest Euclidean distances first. */
+    if (a->dist < b->dist)
+        return -1;
+    if (a->dist > b->dist)
+        return 1;
+
+    /* If equal, take pixels with largest Euclidean distance *of their
+     * neighbours* first.  This essentially mean flat edges go before corners,
+     * preserving useful branches. */
+    if (a->ndist > b->ndist)
+        return -1;
+    if (a->ndist < b->ndist)
+        return 1;
+
+    /* When desperate, sort bottom and right coordinates first so that we try
+     * to remove them first.  Anyway we must impose some rule to make the
+     * sort stable. */
+    if (a->i > b->i)
+        return -1;
+    if (a->i < b->i)
+        return 1;
+    if (a->j > b->j)
+        return -1;
+    if (a->j < b->j)
+        return 1;
+
+    return 0;
+}
+
+/**
+ * gwy_data_field_grains_thin:
+ * @data_field: A data field with zeroes in empty space and nonzeroes in
+ *              grains.
+ *
+ * Performs thinning of a data field containing mask.
+ *
+ * The result of thinning is a ‘skeleton’ mask consisting of single-pixel thin
+ * lines.
+ *
+ * Since: 2.48
+ **/
+void
+gwy_data_field_grains_thin(GwyDataField *mask)
+{
+    /* TRUE means removing the central pixel in a 3x3 pixel configuration does
+     * not break any currently connected parts. */
+    static const gboolean ok_to_remove[0x100] = {
+        FALSE, TRUE,  FALSE, TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
+        FALSE, TRUE,  FALSE, FALSE, TRUE,  TRUE,  TRUE,  TRUE,
+        TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
+        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  TRUE,  TRUE,
+        FALSE, TRUE,  FALSE, FALSE, TRUE,  TRUE,  FALSE, FALSE,
+        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  FALSE, FALSE,
+        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  TRUE,  TRUE,
+        TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
+        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  TRUE,  TRUE,
+        TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
+        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  TRUE,  TRUE,
+        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  FALSE, FALSE,
+        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  FALSE, FALSE,
+        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  TRUE,  TRUE,
+        FALSE, TRUE,  FALSE, TRUE,  TRUE,  TRUE,  FALSE, TRUE,
+        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
+        TRUE,  TRUE,  FALSE, TRUE,  TRUE,  TRUE,  FALSE, TRUE,
+        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
+        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
+        TRUE,  TRUE,  FALSE, TRUE,  TRUE,  TRUE,  FALSE, TRUE,
+        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
+        TRUE,  TRUE,  FALSE, TRUE,  TRUE,  TRUE,  FALSE, TRUE,
+        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
+        TRUE,  TRUE,  FALSE, TRUE,  TRUE,  TRUE,  FALSE, TRUE,
+        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
+        TRUE,  TRUE,  FALSE, TRUE,  TRUE,  TRUE,  FALSE, TRUE,
+        TRUE,  TRUE,  FALSE, TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
+    };
+
+    GwyDataField *dfield;
+    gint i, j, k, xres, yres, ncand;
+    gdouble *d, *m;
+    ThinCandidate *candidates;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(mask));
+
+    xres = mask->xres;
+    yres = mask->yres;
+    dfield = gwy_data_field_duplicate(mask);
+    gwy_data_field_copy(mask, dfield, FALSE);
+    gwy_data_field_grain_distance_transform(dfield);
+    d = dfield->data;
+    m = mask->data;
+
+    ncand = 0;
+    for (k = 0; k < xres*yres; k++) {
+        if (d[k] > 0.0)
+            ncand++;
+    }
+
+    if (ncand < 2) {
+        /* There are no mask pixels or just a single pixel.  In either case
+         * we do not have to do anything. */
+        g_object_unref(dfield);
+        return;
+    }
+
+    candidates = g_new(ThinCandidate, ncand);
+    k = 0;
+    for (i = 0; i < yres; i++) {
+        for (j = 0; j < xres; j++) {
+            if (d[i*xres + j] > 0.0) {
+                gdouble nd, ndist = 0.0, maxndist = 0.0;
+                candidates[k].i = i;
+                candidates[k].j = j;
+                candidates[k].dist = d[i*xres + j];
+
+                if (i && j) {
+                    nd = d[(i-1)*xres + (j-1)];
+                    ndist += nd;
+                    if (nd > maxndist)
+                        maxndist = nd;
+                }
+                if (i) {
+                    nd = d[(i-1)*xres + j];
+                    ndist += nd;
+                    if (nd > maxndist)
+                        maxndist = nd;
+                }
+                if (i && j < xres-1) {
+                    nd = d[(i-1)*xres + (j+1)];
+                    ndist += nd;
+                    if (nd > maxndist)
+                        maxndist = nd;
+                }
+                if (j < xres-1) {
+                    nd = d[i*xres + (j+1)];
+                    ndist += nd;
+                    if (nd > maxndist)
+                        maxndist = nd;
+                }
+                if (i < yres-1 && j < xres-1) {
+                    nd = d[(i+1)*xres + (j+1)];
+                    ndist += nd;
+                    if (nd > maxndist)
+                        maxndist = nd;
+                }
+                if (i < yres-1) {
+                    nd = d[(i+1)*xres + j];
+                    ndist += nd;
+                    if (nd > maxndist)
+                        maxndist = nd;
+                }
+                if (i < yres-1 && j) {
+                    nd = d[(i+1)*xres + (j-1)];
+                    ndist += nd;
+                    if (nd > maxndist)
+                        maxndist = nd;
+                }
+                if (j) {
+                    nd = d[i*xres + (j-1)];
+                    ndist += nd;
+                    if (nd > maxndist)
+                        maxndist = nd;
+                }
+
+                /* If the point is farther from the border than any neighbour
+                 * we never remove it. */
+                if (candidates[k].dist < 0.999*maxndist) {
+                    candidates[k].ndist = ndist;
+                    k++;
+                }
+            }
+        }
+    }
+    ncand = k;
+
+    if (ncand) {
+        qsort(candidates, ncand, sizeof(ThinCandidate), &compare_candidate);
+
+        for (k = 0; k < ncand; k++) {
+            guint b = 0;
+
+            i = candidates[k].i;
+            j = candidates[k].j;
+            if (i && j && d[(i-1)*xres + (j-1)] > 0.0)
+                b |= 1;
+            if (i && d[(i-1)*xres + j] > 0.0)
+                b |= 2;
+            if (i && j < xres-1 && d[(i-1)*xres + (j+1)] > 0.0)
+                b |= 4;
+            if (j < xres-1 && d[i*xres + (j+1)] > 0.0)
+                b |= 8;
+            if (i < yres-1 && j < xres-1 && d[(i+1)*xres + (j+1)] > 0.0)
+                b |= 16;
+            if (i < yres-1 && d[(i+1)*xres + j] > 0.0)
+                b |= 32;
+            if (i < yres-1 && j && d[(i+1)*xres + (j-1)] > 0.0)
+                b |= 64;
+            if (j && d[i*xres + (j-1)] > 0.0)
+                b |= 128;
+
+            if (ok_to_remove[b]) {
+                d[i*xres + j] = 0.0;
+                m[i*xres + j] = 0.0;
+            }
+        }
+    }
+
+    g_free(candidates);
+    g_object_unref(dfield);
+    gwy_data_field_invalidate(mask);
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/libprocess/grains-values.c b/libprocess/grains-values.c
new file mode 100644
index 0000000..f75096f
--- /dev/null
+++ b/libprocess/grains-values.c
@@ -0,0 +1,2094 @@
+/*
+ *  @(#) $Id: grains-values.c 19698 2017-05-03 20:18:10Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include <string.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libprocess/linestats.h>
+#include <libprocess/arithmetic.h>
+#include <libprocess/correct.h>
+#include <libprocess/grains.h>
+#include "gwyprocessinternal.h"
+
+#define ONE G_GUINT64_CONSTANT(1)
+
+typedef struct {
+    gdouble xa;
+    gdouble ya;
+    gdouble xb;
+    gdouble yb;
+    gdouble r2;
+} Edge;
+
+typedef struct {
+    guint size;
+    guint len;
+    Edge *edges;
+} EdgeQueue;
+
+typedef struct {
+    gdouble x;
+    gdouble y;
+    gdouble R2;
+    guint size;   /* For candidate sorting. */
+} InscribedDisc;
+
+enum { NDIRECTIONS = 12 };
+
+static const gdouble shift_directions[NDIRECTIONS*2] = {
+    1.0, 0.0,
+    0.9914448613738104, 0.1305261922200516,
+    0.9659258262890683, 0.2588190451025207,
+    0.9238795325112867, 0.3826834323650898,
+    0.8660254037844387, 0.5,
+    0.7933533402912352, 0.6087614290087207,
+    0.7071067811865476, 0.7071067811865475,
+    0.6087614290087207, 0.7933533402912352,
+    0.5,                0.8660254037844386,
+    0.3826834323650898, 0.9238795325112867,
+    0.2588190451025207, 0.9659258262890683,
+    0.1305261922200517, 0.9914448613738104,
+};
+
+/**
+ * gwy_data_field_grains_get_distribution:
+ * @data_field: Data field used for marking.  For some quantities its values
+ *              are not used, but units and physical dimensions are always
+ *              taken from it.
+ * @grain_field: Data field (mask) of marked grains.  Note if you pass
+ *               non-%NULL @grains all grain information is taken from it and
+ *               @grain_field can be even %NULL then.
+ * @distribution: Data line to store grain distribution to.
+ * @grains: Grain numbers filled with gwy_data_field_number_grains() if you
+ *          have it, or %NULL (the function then finds grain numbers itself
+ *          which is not efficient for repeated use on the same grain field).
+ * @ngrains: The number of grains as returned by
+ *           gwy_data_field_number_grains().  Ignored in @grains is %NULL.
+ * @quantity: The quantity to calculate.
+ * @nstats: The number of samples to take on the distribution function.  If
+ *          nonpositive, a suitable resolution is determined automatically.
+ *
+ * Computes distribution of requested grain characteristics.
+ *
+ * Puts number of grains vs. grain value data into @distribution, units, scales
+ * and offsets of @distribution are updated accordingly.
+ *
+ * Note the @i-th bin is [@i*@dx+ at off,(@i+1)*@dx+ at off] so the central value
+ * you probably want to use for plotting is (@i+0.5)*@dx+ at off (where @dx is
+ * the @distribution data line pixel size, @off is its offset).
+ *
+ * Returns: A data line with the distribution: @distribution itself if it was
+ *          not %NULL, otherwise a newly created #GwyDataLine caller must
+ *          destroy.  If there are no grains, %NULL is returned and
+ *          @distribution is not changed.
+ **/
+GwyDataLine*
+gwy_data_field_grains_get_distribution(GwyDataField *data_field,
+                                       GwyDataField *grain_field,
+                                       GwyDataLine *distribution,
+                                       gint ngrains,
+                                       const gint *grains,
+                                       GwyGrainQuantity quantity,
+                                       gint nstats)
+{
+    GwyDataLine *values;
+    gint *mygrains = NULL;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), FALSE);
+    g_return_val_if_fail(grains || GWY_IS_DATA_FIELD(grain_field), FALSE);
+    g_return_val_if_fail(!grain_field
+                         || (grain_field->xres == data_field->xres
+                             && grain_field->yres == data_field->yres), FALSE);
+    g_return_val_if_fail(!distribution || GWY_IS_DATA_LINE(distribution),
+                         FALSE);
+
+    /* Calculate raw statistics */
+    if (!grains) {
+        grains = mygrains = g_new0(gint, grain_field->xres*grain_field->yres);
+        ngrains = gwy_data_field_number_grains(grain_field, mygrains);
+    }
+    if (!ngrains) {
+        g_free(mygrains);
+        return NULL;
+    }
+
+    values = gwy_data_line_new(ngrains + 1, 1.0, FALSE);
+    gwy_data_field_grains_get_values(data_field, values->data,
+                                     ngrains, grains, quantity);
+    g_free(mygrains);
+
+    values->res--;
+    values->data[0] = values->data[values->res];
+
+    if (!distribution)
+        distribution = gwy_data_line_new(1, 1.0, FALSE);
+
+    gwy_data_line_distribution(values, distribution, 0.0, 0.0, FALSE, nstats);
+
+    g_object_unref(values);
+
+    return distribution;
+}
+
+/* See stats.c for description, this function calculates twice `contribution
+ * of one corner' (the twice is to move multiplications from inner loops) */
+static inline gdouble
+square_area2w_1c(gdouble z1, gdouble z2, gdouble z4, gdouble c,
+                 gdouble x, gdouble y)
+{
+    return sqrt(1.0 + (z1 - z2)*(z1 - z2)/x + (z1 + z2 - c)*(z1 + z2 - c)/y)
+            + sqrt(1.0 + (z1 - z4)*(z1 - z4)/y + (z1 + z4 - c)*(z1 + z4 - c)/x);
+}
+
+/**
+ * find_grain_convex_hull:
+ * @xres: The number of columns in @grains.
+ * @yres: The number of rows in @grains.
+ * @grains: Grain numbers filled with gwy_data_field_number_grains().
+ * @pos: Position of the top-left vertex of grain's convex hull.
+ * @vertices: Array to fill with vertices.
+ *
+ * Finds vertices of a grain's convex hull.
+ *
+ * The grain is identified by @pos which must lie in a grain.
+ *
+ * The positions are returned as indices to vertex grid.  NB: The size of the
+ * grid is (@xres + 1)*(@yres + 1), not @xres*@yres.
+ *
+ * The method is a bit naive, some atan2() calculations could be easily saved.
+ **/
+static void
+find_grain_convex_hull(gint xres, gint yres,
+                       const gint *grains,
+                       gint pos,
+                       GArray *vertices)
+{
+    enum { RIGHT = 0, DOWN, LEFT, UP } newdir, dir;
+    const GridPoint *cur, *mid, *prev;
+    GridPoint v;
+    gdouble phi, phim;
+    gint initpos, gno;
+
+    g_return_if_fail(grains[pos]);
+
+    g_array_set_size(vertices, 0);
+    initpos = pos;
+    gno = grains[pos];
+    v.i = pos/xres;
+    v.j = pos % xres;
+    g_array_append_val(vertices, v);
+    newdir = RIGHT;
+
+    do {
+        dir = newdir;
+        switch (dir) {
+            case RIGHT:
+            v.j++;
+            if (v.i > 0 && v.j < xres && grains[(v.i-1)*xres + v.j] == gno)
+                newdir = UP;
+            else if (v.j < xres && grains[v.i*xres + v.j] == gno)
+                newdir = RIGHT;
+            else
+                newdir = DOWN;
+            break;
+
+            case DOWN:
+            v.i++;
+            if (v.j < xres && v.i < yres && grains[v.i*xres + v.j] == gno)
+                newdir = RIGHT;
+            else if (v.i < yres && grains[v.i*xres + v.j-1] == gno)
+                newdir = DOWN;
+            else
+                newdir = LEFT;
+            break;
+
+            case LEFT:
+            v.j--;
+            if (v.i < yres && v.j > 0 && grains[v.i*xres + v.j-1] == gno)
+                newdir = DOWN;
+            else if (v.j > 0 && grains[(v.i-1)*xres + v.j-1] == gno)
+                newdir = LEFT;
+            else
+                newdir = UP;
+            break;
+
+            case UP:
+            v.i--;
+            if (v.j > 0 && v.i > 0 && grains[(v.i-1)*xres + v.j-1] == gno)
+                newdir = LEFT;
+            else if (v.i > 0 && grains[(v.i-1)*xres + v.j] == gno)
+                newdir = UP;
+            else
+                newdir = RIGHT;
+            break;
+
+            default:
+            g_assert_not_reached();
+            break;
+        }
+
+        /* When we turn right, the previous point is a potential vertex, and
+         * it can also supersed previous vertices. */
+        if (newdir == (dir + 1) % 4) {
+            g_array_append_val(vertices, v);
+            while (vertices->len > 2) {
+                cur = &g_array_index(vertices, GridPoint, vertices->len-1);
+                mid = &g_array_index(vertices, GridPoint, vertices->len-2);
+                prev = &g_array_index(vertices, GridPoint, vertices->len-3);
+                phi = atan2(cur->i - mid->i, cur->j - mid->j);
+                phim = atan2(mid->i - prev->i, mid->j - prev->j);
+                phi = fmod(phi - phim + 4.0*G_PI, 2.0*G_PI);
+                /* This should be fairly save as (a) not real harm is done
+                 * when we have an occasional extra vertex (b) the greatest
+                 * possible angle is G_PI/2.0 */
+                if (phi > 1e-12 && phi < G_PI)
+                    break;
+
+                /* Get rid of mid, it is in a locally concave part */
+                g_array_index(vertices, GridPoint, vertices->len-2) = *cur;
+                g_array_set_size(vertices, vertices->len-1);
+            }
+        }
+    } while (v.i*xres + v.j != initpos);
+
+    /* The last point is duplicated first point */
+    g_array_set_size(vertices, vertices->len-1);
+}
+
+/**
+ * grain_maximum_bound:
+ * @vertices: Convex hull vertex list.
+ * @qx: Scale (pixel size) in x-direction.
+ * @qy: Scale (pixel size) in y-direction.
+ * @vx: Location to store vector x component to.
+ * @vy: Location to store vector y component to.
+ *
+ * Given a list of integer convex hull vertices, return the vector between
+ * the two most distance vertices.
+ *
+ * FIXME: This is a blatantly naive O(n^2) algorithm.
+ **/
+static void
+grain_maximum_bound(GArray *vertices,
+                    gdouble qx, gdouble qy,
+                    gdouble *vx, gdouble *vy)
+{
+    const GridPoint *a, *x;
+    gdouble vm, v, dx, dy;
+    guint g1, g2;
+
+    vm = -G_MAXDOUBLE;
+    for (g1 = 0; g1 < vertices->len; g1++) {
+        a = &g_array_index(vertices, GridPoint, g1);
+        for (g2 = g1 + 1; g2 < vertices->len; g2++) {
+            x = &g_array_index(vertices, GridPoint, g2);
+            dx = qx*(x->j - a->j);
+            dy = qy*(x->i - a->i);
+            v = dx*dx + dy*dy;
+            if (v > vm) {
+                vm = v;
+                *vx = dx;
+                *vy = dy;
+            }
+        }
+    }
+}
+
+/**
+ * grain_minimum_bound:
+ * @vertices: Convex hull vertex list.
+ * @qx: Scale (pixel size) in x-direction.
+ * @qy: Scale (pixel size) in y-direction.
+ * @vx: Location to store vector x component to.
+ * @vy: Location to store vector y component to.
+ *
+ * Given a list of integer convex hull vertices, return the vector
+ * corresponding to the minimum linear projection.
+ *
+ * FIXME: This is a blatantly naive O(n^2) algorithm.
+ **/
+static void
+grain_minimum_bound(GArray *vertices,
+                    gdouble qx, gdouble qy,
+                    gdouble *vx, gdouble *vy)
+{
+    const GridPoint *a, *b, *x;
+    gdouble vm, vm1, v, s, b2, bx, by, dx, dy, vx1, vy1;
+    guint g1, g1p, g2;
+
+    g_return_if_fail(vertices->len >= 3);
+
+    vm = G_MAXDOUBLE;
+    for (g1 = 0; g1 < vertices->len; g1++) {
+        a = &g_array_index(vertices, GridPoint, g1);
+        g1p = (g1 + 1) % vertices->len;
+        b = &g_array_index(vertices, GridPoint, g1p);
+        bx = qx*(b->j - a->j);
+        by = qy*(b->i - a->i);
+        b2 = bx*bx + by*by;
+        vm1 = vx1 = vy1 = -G_MAXDOUBLE;
+        for (g2 = 0; g2 < vertices->len; g2++) {
+            x = &g_array_index(vertices, GridPoint, g2);
+            dx = qx*(x->j - a->j);
+            dy = qy*(x->i - a->i);
+            s = (dx*bx + dy*by)/b2;
+            dx -= s*bx;
+            dy -= s*by;
+            v = dx*dx + dy*dy;
+            if (v > vm1) {
+                vm1 = v;
+                vx1 = dx;
+                vy1 = dy;
+            }
+        }
+        if (vm1 < vm) {
+            vm = vm1;
+            *vx = vx1;
+            *vy = vy1;
+        }
+    }
+}
+
+static gdouble
+grain_convex_hull_area(GArray *vertices, gdouble dx, gdouble dy)
+{
+    const GridPoint *a = &g_array_index(vertices, GridPoint, 0),
+                    *b = &g_array_index(vertices, GridPoint, 1),
+                    *c = &g_array_index(vertices, GridPoint, 2);
+    gdouble s = 0.0;
+    guint i;
+
+    g_return_val_if_fail(vertices->len >= 4, 0.0);
+
+    for (i = 2; i < vertices->len; i++) {
+        gdouble bx = b->j - a->j, by = b->i - a->i,
+                cx = c->j - a->j, cy = c->i - a->i;
+        s += 0.5*(bx*cy - by*cx);
+        b = c;
+        c++;
+    }
+
+    return dx*dy*s;
+}
+
+static void
+grain_convex_hull_centre(GArray *vertices,
+                         gdouble dx, gdouble dy,
+                         gdouble *centrex, gdouble *centrey)
+{
+    const GridPoint *a = &g_array_index(vertices, GridPoint, 0),
+                    *b = &g_array_index(vertices, GridPoint, 1),
+                    *c = &g_array_index(vertices, GridPoint, 2);
+    gdouble s = 0.0, xc = 0.0, yc = 0.0;
+    guint i;
+
+    g_return_if_fail(vertices->len >= 4);
+
+    for (i = 2; i < vertices->len; i++) {
+        gdouble bx = b->j - a->j, by = b->i - a->i,
+                cx = c->j - a->j, cy = c->i - a->i;
+        gdouble s1 = bx*cy - by*cx;
+        xc += s1*(a->j + b->j + c->j);
+        yc += s1*(a->i + b->i + c->i);
+        s += s1;
+        b = c;
+        c++;
+    }
+    *centrex = xc*dx/(3.0*s);
+    *centrey = yc*dy/(3.0*s);
+}
+
+static gdouble
+minimize_circle_radius(InscribedDisc *circle, GArray *vertices,
+                       gdouble dx, gdouble dy)
+{
+    const GridPoint *v = (const GridPoint*)vertices->data;
+    gdouble x = circle->x, y = circle->y, r2best = 0.0;
+    guint n = vertices->len;
+
+    while (n--) {
+        gdouble deltax = dx*v->j - x, deltay = dy*v->i - y;
+        gdouble r2 = deltax*deltax + deltay*deltay;
+
+        if (r2 > r2best)
+            r2best = r2;
+
+        v++;
+    }
+
+    return r2best;
+}
+
+static void
+improve_circumscribed_circle(InscribedDisc *circle, GArray *vertices,
+                             gdouble dx, gdouble dy)
+{
+    gdouble eps = 1.0, improvement, qgeom = sqrt(dx*dy);
+
+    do {
+        InscribedDisc best = *circle;
+        guint i;
+
+        improvement = 0.0;
+        for (i = 0; i < NDIRECTIONS; i++) {
+            InscribedDisc cand;
+            gdouble sx = eps*qgeom*shift_directions[2*i],
+                    sy = eps*qgeom*shift_directions[2*i + 1];
+
+            cand.size = circle->size;
+
+            cand.x = circle->x + sx;
+            cand.y = circle->y + sy;
+            if ((cand.R2 = minimize_circle_radius(&cand, vertices, dx, dy))
+                < best.R2)
+                best = cand;
+
+            cand.x = circle->x - sy;
+            cand.y = circle->y + sx;
+            if ((cand.R2 = minimize_circle_radius(&cand, vertices, dx, dy))
+                < best.R2)
+                best = cand;
+
+            cand.x = circle->x - sx;
+            cand.y = circle->y - sy;
+            if ((cand.R2 = minimize_circle_radius(&cand, vertices, dx, dy))
+                < best.R2)
+                best = cand;
+
+            cand.x = circle->x + sy;
+            cand.y = circle->y - sx;
+            if ((cand.R2 = minimize_circle_radius(&cand, vertices, dx, dy))
+                < best.R2)
+                best = cand;
+        }
+        if (best.R2 < circle->R2) {
+            improvement = (best.R2 - circle->R2)/(dx*dy);
+            *circle = best;
+        }
+        else {
+            eps *= 0.5;
+        }
+    } while (eps > 1e-3 || improvement > 1e-3);
+}
+
+static guint*
+grain_maybe_realloc(guint *grain, guint w, guint h, guint *grainsize)
+{
+    if (w*h > *grainsize) {
+        g_free(grain);
+        *grainsize = w*h;
+        grain = g_new(guint, *grainsize);
+    }
+    return grain;
+}
+
+static guint*
+extract_upsampled_square_pixel_grain(const guint *grains, guint xres, guint gno,
+                                     const gint *bbox,
+                                     guint *grain, guint *grainsize,
+                                     guint *widthup, guint *heightup,
+                                     gdouble dx, gdouble dy)
+{
+    gint col = bbox[0], row = bbox[1], w = bbox[2], h = bbox[3];
+    guint w2 = 2*w, h2 = 2*h;
+    guint i, j;
+
+    /* Do not bother with nearly square pixels and upsample also 2×2. */
+    if (fabs(log(dy/dx)) < 0.05) {
+        grain = grain_maybe_realloc(grain, w2, h2, grainsize);
+        for (i = 0; i < h; i++) {
+            guint k2 = w2*(2*i);
+            guint k = (i + row)*xres + col;
+            for (j = 0; j < w; j++, k++, k2 += 2) {
+                guint v = (grains[k] == gno) ? G_MAXUINT : 0;
+                grain[k2] = v;
+                grain[k2+1] = v;
+                grain[k2 + w2] = v;
+                grain[k2 + w2+1] = v;
+            }
+        }
+    }
+    else if (dy < dx) {
+        /* Horizontal upsampling, precalculate index map to use in each row. */
+        guint *indices;
+        w2 = GWY_ROUND(dx/dy*w2);
+        grain = grain_maybe_realloc(grain, w2, h2, grainsize);
+        indices = (guint*)g_slice_alloc(w2*sizeof(guint));
+        for (j = 0; j < w2; j++) {
+            gint jj = (gint)floor(0.5*j*dy/dx);
+            indices[j] = CLAMP(jj, 0, (gint)w-1);
+        }
+        for (i = 0; i < h; i++) {
+            guint k = (i + row)*xres + col;
+            guint k2 = w2*(2*i);
+            for (j = 0; j < w2; j++) {
+                guint v = (grains[k + indices[j]] == gno) ? G_MAXUINT : 0;
+                grain[k2 + j] = v;
+                grain[k2 + w2 + j] = v;
+            }
+        }
+        g_slice_free1(w2*sizeof(guint), indices);
+    }
+    else {
+        /* Vertical upsampling, rows are 2× scaled copies but uneven. */
+        h2 = GWY_ROUND(dy/dx*h2);
+        grain = grain_maybe_realloc(grain, w2, h2, grainsize);
+        for (i = 0; i < h2; i++) {
+            guint k, k2 = i*w2;
+            gint ii = (gint)floor(0.5*i*dx/dy);
+            ii = CLAMP(ii, 0, (gint)h-1);
+            k = (ii + row)*xres + col;
+            for (j = 0; j < w; j++) {
+                guint v = (grains[k + j] == gno) ? G_MAXUINT : 0;
+                grain[k2 + 2*j] = v;
+                grain[k2 + 2*j + 1] = v;
+            }
+        }
+    }
+
+    *widthup = w2;
+    *heightup = h2;
+    return grain;
+}
+
+static gint
+compare_candidates(gconstpointer a,
+                   gconstpointer b)
+{
+    const InscribedDisc *da = (const InscribedDisc*)a;
+    const InscribedDisc *db = (const InscribedDisc*)b;
+
+    if (da->size > db->size)
+        return -1;
+    if (da->size < db->size)
+        return 1;
+
+    if (da->R2 < db->R2)
+        return -1;
+    if (da->R2 > db->R2)
+        return 1;
+
+    return 0;
+}
+
+static void
+find_disc_centre_candidates(GArray *candidates,
+                            PixelQueue *inqueue,
+                            const guint *grain,
+                            guint width, guint height,
+                            gdouble dx, gdouble dy,
+                            gdouble centrex, gdouble centrey)
+{
+    guint m;
+
+    g_array_set_size(candidates, 0);
+    for (m = 0; m < inqueue->len; m++) {
+        GridPoint *mpt = inqueue->points + m;
+        guint i = mpt->i, j = mpt->j, k = i*width + j, size = 8*grain[k], w;
+        InscribedDisc cand;
+
+        if (i && j && (w = grain[k - width-1]) != G_MAXUINT)
+            size += w;
+        if (i && (w = grain[k - width]) != G_MAXUINT)
+            size += 2*w;
+        if (i && j < width-1 && (w = grain[k - width+1]) != G_MAXUINT)
+            size += w;
+        if (j && (w = grain[k-1]) != G_MAXUINT)
+            size += 2*w;
+        if (j < width-1 && (w = grain[k+1]) != G_MAXUINT)
+            size += 2*w;
+        if (i < height-1 && j && (w = grain[k + width-1]) != G_MAXUINT)
+            size += w;
+        if (i < height-1 && (w = grain[k + width]) != G_MAXUINT)
+            size += 2*w;
+        if (i < height-1 && j < width-1 && (w = grain[k + width+1]) != G_MAXUINT)
+            size += w;
+
+        cand.x = (mpt->j + 0.5)*dx;
+        cand.y = (mpt->i + 0.5)*dy;
+        cand.size = size;
+        /* Use R2 temporarily for distance from the entire grain centre;
+         * this is only for sorting below. */
+        cand.R2 = ((cand.x - centrex)*(cand.x - centrex)
+                   + (cand.y - centrey)*(cand.y - centrey));
+        g_array_append_val(candidates, cand);
+    }
+    g_array_sort(candidates, &compare_candidates);
+}
+
+static inline void
+edge_list_add(EdgeQueue *queue,
+              gdouble xa, gdouble ya,
+              gdouble xb, gdouble yb)
+{
+    if (G_UNLIKELY(queue->len == queue->size)) {
+        queue->size = MAX(2*queue->size, 16);
+        queue->edges = g_renew(Edge, queue->edges, queue->size);
+    }
+
+    queue->edges[queue->len].xa = xa;
+    queue->edges[queue->len].ya = ya;
+    queue->edges[queue->len].xb = xb;
+    queue->edges[queue->len].yb = yb;
+    queue->len++;
+}
+
+static void
+find_all_edges(EdgeQueue *edges,
+               const gint *grains, guint xres,
+               guint gno, const gint *bbox,
+               gdouble dx, gdouble dy)
+{
+    guint col = bbox[0], row = bbox[1], w = bbox[2], h = bbox[3];
+    guint i, j;
+    guint *vertices;
+
+    edges->len = 0;
+
+    vertices = g_slice_alloc((w + 1)*sizeof(guint));
+    for (j = 0; j <= w; j++)
+        vertices[j] = G_MAXUINT;
+
+    for (i = 0; i <= h; i++) {
+        guint k = (i + row)*xres + col;
+        guint vertex = G_MAXUINT;
+
+        for (j = 0; j <= w; j++, k++) {
+            /*
+             * 1 2
+             * 3 4
+             */
+            guint g0 = i && j && grains[k - xres - 1] == gno;
+            guint g1 = i && j < w && grains[k - xres] == gno;
+            guint g2 = i < h && j && grains[k - 1] == gno;
+            guint g3 = i < h && j < w && grains[k] == gno;
+            guint g = g0 | (g1 << 1) | (g2 << 2) | (g3 << 3);
+
+            if (g == 8 || g == 7) {
+                vertex = j;
+                vertices[j] = i;
+            }
+            else if (g == 2 || g == 13) {
+                edge_list_add(edges, dx*j, dy*vertices[j], dx*j, dy*i);
+                vertex = j;
+                vertices[j] = G_MAXUINT;
+            }
+            else if (g == 4 || g == 11) {
+                edge_list_add(edges, dx*vertex, dy*i, dx*j, dy*i);
+                vertex = G_MAXUINT;
+                vertices[j] = i;
+            }
+            else if (g == 1 || g == 14) {
+                edge_list_add(edges, dx*vertex, dy*i, dx*j, dy*i);
+                edge_list_add(edges, dx*j, dy*vertices[j], dx*j, dy*i);
+                vertex = G_MAXUINT;
+                vertices[j] = G_MAXUINT;
+            }
+            else if (g == 6 || g == 9) {
+                edge_list_add(edges, dx*vertex, dy*i, dx*j, dy*i);
+                edge_list_add(edges, dx*j, dy*vertices[j], dx*j, dy*i);
+                vertex = j;
+                vertices[j] = i;
+            }
+        }
+    }
+
+    g_slice_free1((w + 1)*sizeof(guint), vertices);
+}
+
+static gdouble
+maximize_disc_radius(InscribedDisc *disc, Edge *edges, guint n)
+{
+    gdouble x = disc->x, y = disc->y, r2best = HUGE_VAL;
+
+    while (n--) {
+        gdouble rax = edges->xa - x, ray = edges->ya - y,
+                rbx = edges->xb - x, rby = edges->yb - y,
+                deltax = edges->xb - edges->xa, deltay = edges->yb - edges->ya;
+        gdouble ca = -(deltax*rax + deltay*ray),
+                cb = deltax*rbx + deltay*rby;
+
+        if (ca <= 0.0)
+            edges->r2 = rax*rax + ray*ray;
+        else if (cb <= 0.0)
+            edges->r2 = rbx*rbx + rby*rby;
+        else {
+            gdouble tx = cb*rax + ca*rbx, ty = cb*ray + ca*rby, D = ca + cb;
+            edges->r2 = (tx*tx + ty*ty)/(D*D);
+        }
+
+        if (edges->r2 < r2best)
+            r2best = edges->r2;
+        edges++;
+    }
+
+    return r2best;
+}
+
+static guint
+filter_relevant_edges(EdgeQueue *edges, gdouble r2, gdouble eps)
+{
+    Edge *edge = edges->edges, *enear = edges->edges;
+    gdouble limit = sqrt(r2) + 4.0*eps + 0.5;
+    guint i;
+
+    limit *= limit;
+    for (i = edges->len; i; i--, edge++) {
+        if (edge->r2 <= limit) {
+            if (edge != enear)
+                GWY_SWAP(Edge, *edge, *enear);
+            enear++;
+        }
+    }
+
+    return enear - edges->edges;
+}
+
+static void
+improve_inscribed_disc(InscribedDisc *disc, EdgeQueue *edges, guint dist)
+{
+    gdouble eps = 0.5 + 0.25*(dist > 4) + 0.25*(dist > 16), improvement;
+    guint nsuccessiveimprovements = 0;
+
+    do {
+        InscribedDisc best;
+        guint i, nr;
+
+        disc->R2 = maximize_disc_radius(disc, edges->edges, edges->len);
+        eps = MIN(eps, 0.5*sqrt(disc->R2));
+        best = *disc;
+        nr = filter_relevant_edges(edges, best.R2, eps);
+
+        improvement = 0.0;
+        for (i = 0; i < NDIRECTIONS; i++) {
+            InscribedDisc cand;
+            gdouble sx = eps*shift_directions[2*i],
+                    sy = eps*shift_directions[2*i + 1];
+
+            cand.size = disc->size;
+
+            cand.x = disc->x + sx;
+            cand.y = disc->y + sy;
+            if ((cand.R2 = maximize_disc_radius(&cand, edges->edges, nr))
+                > best.R2)
+                best = cand;
+
+            cand.x = disc->x - sy;
+            cand.y = disc->y + sx;
+            if ((cand.R2 = maximize_disc_radius(&cand, edges->edges, nr))
+                > best.R2)
+                best = cand;
+
+            cand.x = disc->x - sx;
+            cand.y = disc->y - sy;
+            if ((cand.R2 = maximize_disc_radius(&cand, edges->edges, nr))
+                > best.R2)
+                best = cand;
+
+            cand.x = disc->x + sy;
+            cand.y = disc->y - sx;
+            if ((cand.R2 = maximize_disc_radius(&cand, edges->edges, nr))
+                > best.R2)
+                best = cand;
+        }
+
+        if (best.R2 > disc->R2) {
+            improvement = sqrt(best.R2) - sqrt(disc->R2);
+            *disc = best;
+            /* This scales up *each* successive improvement after 3 so eps can
+             * grow very quickly. */
+            if (nsuccessiveimprovements++ > 2)
+                eps *= 1.5;
+        }
+        else {
+            eps *= 0.5;
+            nsuccessiveimprovements = 0;
+        }
+    } while (eps > 1e-3 || improvement > 1e-3);
+}
+
+/**
+ * gwy_data_field_grains_get_values:
+ * @data_field: Data field used for marking.  For some quantities its values
+ *              are not used, but its dimensions determine the dimensions of
+ *              @grains.
+ * @values: Array of size @ngrains+1 to put grain values to.  It can be
+ *          %NULL to allocate and return a new array.
+ * @grains: Grain numbers filled with gwy_data_field_number_grains().
+ * @ngrains: The number of grains as returned by
+ *           gwy_data_field_number_grains().
+ * @quantity: The quantity to calculate.
+ *
+ * Calculates characteristics of grains.
+ *
+ * This is a bit low-level function, see also
+ * gwy_data_field_grains_get_distribution().
+ *
+ * The array @values will be filled with the requested grain value for each
+ * individual grain (0th item of @values which does not correspond to any grain
+ * will be overwritten with an arbitrary value and should be ignored).
+ *
+ * The grain numbers serve as indices in @values.  Therefore as long as the
+ * same @grains is used, the same position in @values corresponds to the same
+ * particular grain.  This enables one for instance to calculate grain sizes
+ * and grain heights and then correlate them.
+ *
+ * Returns: @values itself if it was not %NULL, otherwise a newly allocated
+ *          array that caller has to free.
+ **/
+gdouble*
+gwy_data_field_grains_get_values(GwyDataField *data_field,
+                                 gdouble *values,
+                                 gint ngrains,
+                                 const gint *grains,
+                                 GwyGrainQuantity quantity)
+{
+    gdouble *allvalues[1];
+
+    if (!values)
+        values = g_new(gdouble, ngrains + 1);
+
+    allvalues[0] = values;
+    gwy_data_field_grains_get_quantities(data_field, allvalues,
+                                         &quantity, 1, ngrains, grains);
+    return values;
+}
+
+static gdouble*
+ensure_buffer(GwyGrainQuantity quantity,
+              gdouble **quantity_data,
+              guint ngrains,
+              gdouble fillvalue,
+              GList **buffers)
+{
+    gdouble *buf, *b;
+    guint gno;
+
+    if (quantity_data[quantity]) {
+        buf = quantity_data[quantity];
+        if (!fillvalue)
+            gwy_clear(buf, ngrains + 1);
+    }
+    else {
+        if (fillvalue)
+            buf = g_new(gdouble, ngrains + 1);
+        else
+            buf = g_new0(gdouble, ngrains + 1);
+        *buffers = g_list_prepend(*buffers, buf);
+    }
+    if (fillvalue) {
+        for (gno = ngrains+1, b = buf; gno; gno--)
+            *(b++) = fillvalue;
+    }
+
+    return buf;
+}
+
+/* Note all coordinates are pixel-wise, not real.  For linear and quadratic,
+ * the origin is always the grain centre. */
+static void
+calculate_grain_aux(GwyDataField *data_field,
+                    const gint *grains,
+                    guint ngrains,
+                    gint *sizes, gint *boundpos,
+                    gdouble *min, gdouble *max,
+                    gdouble *xvalue, gdouble *yvalue, gdouble *zvalue,
+                    gdouble *linear, gdouble *quadratic)
+{
+    guint xres, yres, i, j, k, n, gno, nn;
+    gdouble z;
+    const gdouble *d;
+    const gint *g;
+    gdouble *t;
+
+    xres = data_field->xres;
+    yres = data_field->yres;
+    nn = xres*yres;
+
+    if (sizes) {
+        for (k = nn, g = grains; k; k--, g++) {
+            gno = *g;
+            sizes[gno]++;
+        }
+    }
+    if (boundpos) {
+        for (k = 0, g = grains; k < nn; k++, g++) {
+            gno = *g;
+            if (boundpos[gno] == -1)
+                boundpos[gno] = k;
+        }
+    }
+    if (min) {
+        for (k = nn, g = grains, d = data_field->data; k; k--, g++, d++) {
+            gno = *g;
+            z = *d;
+            if (z < min[gno])
+                min[gno] = z;
+        }
+    }
+    if (max) {
+        for (k = nn, g = grains, d = data_field->data; k; k--, g++, d++) {
+            gno = *g;
+            z = *d;
+            if (z > max[gno])
+                max[gno] = z;
+        }
+    }
+    if (zvalue) {
+        g_assert(sizes);
+        for (k = nn, g = grains, d = data_field->data; k; k--, g++, d++) {
+            gno = *g;
+            z = *d;
+            zvalue[gno] += z;
+        }
+        for (gno = 0; gno <= ngrains; gno++) {
+            n = sizes[gno];
+            zvalue[gno] /= n;
+        }
+    }
+    if (xvalue) {
+        g_assert(sizes);
+        g = grains;
+        for (i = 0; i < yres; i++) {
+            for (j = 0; j < xres; j++, g++) {
+                gno = *g;
+                xvalue[gno] += j;
+            }
+        }
+        for (gno = 0; gno <= ngrains; gno++) {
+            n = sizes[gno];
+            xvalue[gno] /= n;
+        }
+    }
+    if (yvalue) {
+        g_assert(sizes);
+        g = grains;
+        for (i = 0; i < yres; i++) {
+            for (j = 0; j < xres; j++, g++) {
+                gno = *g;
+                yvalue[gno] += i;
+            }
+        }
+        for (gno = 0; gno <= ngrains; gno++) {
+            n = sizes[gno];
+            yvalue[gno] /= n;
+        }
+    }
+    if (linear) {
+        g_assert(xvalue && yvalue);
+        g = grains;
+        d = data_field->data;
+        for (i = 0; i < yres; i++) {
+            for (j = 0; j < xres; j++, g++, d++) {
+                gdouble x, y;
+
+                gno = *g;
+                t = linear + 5*gno;
+                x = j - xvalue[gno];
+                y = i - yvalue[gno];
+                z = *d;
+                *(t++) += x*x;
+                *(t++) += x*y;
+                *(t++) += y*y;
+                *(t++) += x*z;
+                *t += y*z;
+            }
+        }
+    }
+    if (quadratic) {
+        g_assert(xvalue && yvalue);
+        g = grains;
+        d = data_field->data;
+        for (i = 0; i < yres; i++) {
+            for (j = 0; j < xres; j++, g++, d++) {
+                gdouble x, y, xx, yy, xy;
+
+                gno = *g;
+                t = quadratic + 12*gno;
+                x = j - xvalue[gno];
+                y = i - yvalue[gno];
+                xx = x*x;
+                xy = x*y;
+                yy = y*y;
+                z = *d;
+                *(t++) += xx*x;
+                *(t++) += xx*y;
+                *(t++) += x*yy;
+                *(t++) += y*yy;
+                *(t++) += xx*xx;
+                *(t++) += xx*xy;
+                *(t++) += xx*yy;
+                *(t++) += xy*yy;
+                *(t++) += yy*yy;
+                *(t++) += xx*z;
+                *(t++) += xy*z;
+                *t += yy*z;
+            }
+        }
+    }
+}
+
+static void
+integrate_grain_volume0(const gdouble *d, const gint *grains,
+                        gint xres, gint yres,
+                        gdouble *volume, guint ngrains,
+                        gdouble pixelarea)
+{
+    gint i, j, gno;
+
+    gwy_clear(volume, ngrains + 1);
+    for (i = 0; i < yres; i++) {
+        for (j = 0; j < xres; j++) {
+            gint ix, ipx, imx, jp, jm;
+            gdouble v;
+
+            ix = i*xres;
+            if (!(gno = grains[ix + j]))
+                continue;
+
+            imx = (i > 0) ? ix-xres : ix;
+            ipx = (i < yres-1) ? ix+xres : ix;
+            jm = (j > 0) ? j-1 : j;
+            jp = (j < xres-1) ? j+1 : j;
+
+            v = (52.0*d[ix + j] + 10.0*(d[imx + j] + d[ix + jm]
+                                        + d[ix + jp] + d[ipx + j])
+                 + (d[imx + jm] + d[imx + jp] + d[ipx + jm] + d[ipx + jp]));
+
+            volume[gno] += v;
+        }
+    }
+    for (gno = 0; gno <= ngrains; gno++)
+        volume[gno] *= pixelarea/96.0;
+}
+
+/**
+ * gwy_data_field_grains_get_quantities:
+ * @data_field: Data field used for marking.  For some quantities its values
+ *              are not used, but its dimensions determine the dimensions of
+ *              @grains.
+ * @values: Array of @nquantities pointers to blocks of length @ngrains+1 to
+ *          put the calculated grain values to.  Each block corresponds to one
+ *          requested quantity.  %NULL can be passed to allocate and return a
+ *          new array.
+ * @quantities: Array of @nquantities items that specify the requested
+ *              #GwyGrainQuantity to put to corresponding items in @values.
+ *              Quantities can repeat.
+ * @nquantities: The number of requested different grain values.
+ * @grains: Grain numbers filled with gwy_data_field_number_grains().
+ * @ngrains: The number of grains as returned by
+ *           gwy_data_field_number_grains().
+ *
+ * Calculates multiple characteristics of grains simultaneously.
+ *
+ * See gwy_data_field_grains_get_values() for some discussion.  This function
+ * is more efficient if several grain quantities need to be calculated since
+ * gwy_data_field_grains_get_values() can do lot of repeated work in such case.
+ *
+ * Returns: @values itself if it was not %NULL, otherwise a newly allocated
+ *          array that caller has to free with g_free(), including the
+ *          contained arrays.
+ *
+ * Since: 2.22
+ **/
+gdouble**
+gwy_data_field_grains_get_quantities(GwyDataField *data_field,
+                                     gdouble **values,
+                                     const GwyGrainQuantity *quantities,
+                                     guint nquantities,
+                                     guint ngrains,
+                                     const gint *grains)
+{
+    /* The number of built-in quantities. */
+    enum { NQ = 45 };
+    enum {
+        NEED_SIZES = 1 << 0,
+        NEED_BOUNDPOS = 1 << 1,
+        NEED_MIN = 1 << 2,
+        NEED_MAX = 1 << 3,
+        NEED_XVALUE = (1 << 4) | NEED_SIZES,
+        NEED_YVALUE = (1 << 5) | NEED_SIZES,
+        NEED_CENTRE = NEED_XVALUE | NEED_YVALUE,
+        NEED_ZVALUE = (1 << 6) | NEED_SIZES,
+        NEED_LINEAR = (1 << 7) | NEED_ZVALUE | NEED_CENTRE,
+        NEED_QUADRATIC = (1 << 8) | NEED_LINEAR,
+        NEED_BBOX = (1 << 9),
+        INVALID = G_MAXUINT
+    };
+    static const guint need_aux[NQ] = {
+        NEED_SIZES,                   /* projected area */
+        NEED_SIZES,                   /* equiv square side */
+        NEED_SIZES,                   /* equiv disc radius */
+        0,                            /* surface area */
+        NEED_MAX,                     /* maximum */
+        NEED_MIN,                     /* minimum */
+        NEED_ZVALUE,                  /* mean */
+        NEED_SIZES,                   /* median */
+        NEED_SIZES,                   /* pixel area */
+        NEED_MIN | NEED_MAX,          /* half-height area */
+        0,                            /* flat boundary length */
+        INVALID,
+        NEED_BOUNDPOS,                /* min bounding size */
+        NEED_BOUNDPOS,                /* min bounding direction */
+        NEED_BOUNDPOS,                /* max bounding size */
+        NEED_BOUNDPOS,                /* max bounding direction */
+        NEED_XVALUE,                  /* centre x */
+        NEED_YVALUE,                  /* centre y */
+        0,                            /* volume, 0-based */
+        NEED_MIN | NEED_SIZES,        /* volume, min-based */
+        NEED_BBOX | NEED_SIZES,       /* volume, Laplace-based */
+        INVALID,
+        INVALID,
+        NEED_LINEAR,                  /* slope theta */
+        NEED_LINEAR,                  /* slope phi */
+        0,                            /* boundary minimum */
+        0,                            /* boundary maximum */
+        NEED_QUADRATIC,               /* curvature centre x */
+        NEED_QUADRATIC,               /* curvature centre y */
+        NEED_QUADRATIC,               /* curvature centre z */
+        NEED_QUADRATIC,               /* curvature invrad 1 */
+        NEED_QUADRATIC,               /* curvature invrad 2 */
+        NEED_QUADRATIC,               /* curvature direction 1 */
+        NEED_QUADRATIC,               /* curvature direction 2 */
+        NEED_CENTRE | NEED_BBOX,      /* inscribed disc radius */
+        NEED_CENTRE | NEED_BBOX,      /* inscribed disc centre x */
+        NEED_CENTRE | NEED_BBOX,      /* inscribed disc centre y */
+        NEED_BOUNDPOS,                /* convex hull area */
+        NEED_BOUNDPOS,                /* circumcircle radius */
+        NEED_BOUNDPOS,                /* circumcircle centre x */
+        NEED_BOUNDPOS,                /* circumcircle centre y */
+        NEED_CENTRE,                  /* mean radius */
+        NEED_LINEAR,                  /* equiv ellipse major axis */
+        NEED_LINEAR,                  /* equiv ellipse minor axis */
+        NEED_LINEAR,                  /* equiv ellipse major axis angle */
+    };
+
+    gdouble *quantity_data[NQ];
+    gboolean seen[NQ];
+    GList *l, *buffers = NULL;
+    guint *sizes = NULL;
+    gint *boundpos = NULL, *bbox = NULL;
+    gdouble *xvalue = NULL, *yvalue = NULL, *zvalue = NULL,
+            *min = NULL, *max = NULL,
+            *linear = NULL, *quadratic = NULL;
+    const gdouble *d;
+    gdouble *p;
+    gdouble qh, qv, qarea, qdiag, qgeom;
+    guint xres, yres, i, j, k, nn, gno;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), NULL);
+    g_return_val_if_fail(grains, NULL);
+    if (!nquantities)
+        return values;
+    g_return_val_if_fail(quantities, NULL);
+
+    if (!values) {
+        values = g_new(gdouble*, nquantities);
+        for (i = 0; i < nquantities; i++)
+            values[i] = g_new0(gdouble, ngrains + 1);
+    }
+    else {
+        for (i = 0; i < nquantities; i++)
+            gwy_clear(values[i], ngrains + 1);
+    }
+
+    xres = data_field->xres;
+    yres = data_field->yres;
+    nn = xres*yres;
+    gwy_debug("ngrains: %d, nn: %d", ngrains, nn);
+
+    /* Figure out which quantities are requested. */
+    gwy_clear(quantity_data, NQ);
+    for (i = 0; i < nquantities; i++) {
+        GwyGrainQuantity quantity = quantities[i];
+
+        if ((guint)quantity >= NQ || need_aux[quantity] == INVALID) {
+            g_warning("Invalid built-in grain quantity number %u.", quantity);
+            continue;
+        }
+        /* Take the first if the same quantity is requested multiple times.
+         * We will deal with this later. */
+        if (!quantity_data[quantity])
+            quantity_data[quantity] = values[i];
+    }
+
+    /* Figure out the auxiliary data to calculate.  Do this after we gathered
+     * all quantities as some auxiliary data are in fact quantities too. */
+    for (i = 0; i < nquantities; i++) {
+        GwyGrainQuantity quantity = quantities[i];
+        guint need;
+
+        if ((guint)quantity >= NQ || need_aux[quantity] == INVALID)
+            continue;
+
+        need = need_aux[quantity];
+        /* Integer data */
+        if ((need & NEED_SIZES) && !sizes) {
+            sizes = g_new0(guint, ngrains + 1);
+            buffers = g_list_prepend(buffers, sizes);
+        }
+        if ((need & NEED_BOUNDPOS) && !boundpos) {
+            boundpos = g_new(gint, ngrains + 1);
+            buffers = g_list_prepend(buffers, boundpos);
+            for (gno = 0; gno <= ngrains; gno++)
+                boundpos[gno] = -1;
+        }
+        if ((need & NEED_BBOX) && !bbox) {
+            bbox = gwy_data_field_get_grain_bounding_boxes(data_field,
+                                                           ngrains, grains,
+                                                           NULL);
+            buffers = g_list_prepend(buffers, bbox);
+        }
+        /* Floating point data that coincide with some quantity.  An array
+         * is allocated only if the corresponding quantity is not requested.
+         * Otherwise we use the supplied array. */
+        if (need & NEED_MIN)
+            min = ensure_buffer(GWY_GRAIN_VALUE_MINIMUM, quantity_data,
+                                ngrains, G_MAXDOUBLE, &buffers);
+        if (need & NEED_MAX)
+            max = ensure_buffer(GWY_GRAIN_VALUE_MAXIMUM, quantity_data,
+                                ngrains, -G_MAXDOUBLE, &buffers);
+        if (need & NEED_XVALUE)
+            xvalue = ensure_buffer(GWY_GRAIN_VALUE_CENTER_X, quantity_data,
+                                   ngrains, 0.0, &buffers);
+        if (need & NEED_YVALUE)
+            yvalue = ensure_buffer(GWY_GRAIN_VALUE_CENTER_Y, quantity_data,
+                                   ngrains, 0.0, &buffers);
+        if (need & NEED_ZVALUE)
+            zvalue = ensure_buffer(GWY_GRAIN_VALUE_MEAN, quantity_data,
+                                   ngrains, 0.0, &buffers);
+        /* Complex floating point data */
+        if ((need & NEED_LINEAR) && !linear) {
+            linear = g_new0(gdouble, 5*(ngrains + 1));
+            buffers = g_list_prepend(buffers, linear);
+        }
+        if ((need & NEED_QUADRATIC) && !quadratic) {
+            quadratic = g_new0(gdouble, 12*(ngrains + 1));
+            buffers = g_list_prepend(buffers, quadratic);
+        }
+    }
+
+    /* Calculate auxiliary quantities (in pixel lateral coordinates) */
+    calculate_grain_aux(data_field, grains, ngrains, sizes, boundpos,
+                        min, max, xvalue, yvalue, zvalue, linear, quadratic);
+
+    d = data_field->data;
+    qh = gwy_data_field_get_xmeasure(data_field);
+    qv = gwy_data_field_get_ymeasure(data_field);
+    qdiag = hypot(qh, qv);
+    qarea = qh*qv;
+    qgeom = sqrt(qarea);
+
+    /* Calculate specific requested quantities */
+    if ((p = quantity_data[GWY_GRAIN_VALUE_PIXEL_AREA])) {
+        for (gno = 0; gno <= ngrains; gno++)
+            p[gno] = sizes[gno];
+    }
+    if ((p = quantity_data[GWY_GRAIN_VALUE_PROJECTED_AREA])) {
+        for (gno = 0; gno <= ngrains; gno++)
+            p[gno] = qarea*sizes[gno];
+    }
+    if ((p = quantity_data[GWY_GRAIN_VALUE_EQUIV_SQUARE_SIDE])) {
+        for (gno = 0; gno <= ngrains; gno++)
+            p[gno] = sqrt(qarea*sizes[gno]);
+    }
+    if ((p = quantity_data[GWY_GRAIN_VALUE_EQUIV_DISC_RADIUS])) {
+        for (gno = 0; gno <= ngrains; gno++)
+            p[gno] = sqrt(qarea/G_PI*sizes[gno]);
+    }
+    if ((p = quantity_data[GWY_GRAIN_VALUE_SURFACE_AREA])) {
+        gdouble qh2 = qh*qh, qv2 = qv*qv;
+
+        gwy_clear(p, ngrains + 1);
+        /* Every contribution is calculated twice -- for each pixel (vertex)
+         * participating to a particular triangle */
+        for (i = 0; i < yres; i++) {
+            for (j = 0; j < xres; j++) {
+                gint ix, ipx, imx, jp, jm;
+                gdouble c;
+
+                ix = i*xres;
+                if (!(gno = grains[ix + j]))
+                    continue;
+
+                imx = (i > 0) ? ix-xres : ix;
+                ipx = (i < yres-1) ? ix+xres : ix;
+                jm = (j > 0) ? j-1 : j;
+                jp = (j < xres-1) ? j+1 : j;
+
+                c = (d[ix + j] + d[ix + jm] + d[imx + jm] + d[imx + j])/2.0;
+                p[gno] += square_area2w_1c(d[ix + j], d[ix + jm],
+                                           d[imx + j], c, qh2, qv2);
+
+                c = (d[ix + j] + d[ix + jp] + d[imx + jp] + d[imx + j])/2.0;
+                p[gno] += square_area2w_1c(d[ix + j], d[ix + jp],
+                                           d[imx + j], c, qh2, qv2);
+
+                c = (d[ix + j] + d[ix + jm] + d[ipx + jm] + d[ipx + j])/2.0;
+                p[gno] += square_area2w_1c(d[ix + j], d[ix + jm],
+                                           d[ipx + j], c, qh2, qv2);
+
+                c = (d[ix + j] + d[ix + jp] + d[ipx + jp] + d[ipx + j])/2.0;
+                p[gno] += square_area2w_1c(d[ix + j], d[ix + jp],
+                                           d[ipx + j], c, qh2, qv2);
+            }
+        }
+        for (gno = 0; gno <= ngrains; gno++)
+            p[gno] *= qarea/8.0;
+    }
+    /* GWY_GRAIN_VALUE_MINIMUM is calculated directly. */
+    /* GWY_GRAIN_VALUE_MAXIMUM is calculated directly. */
+    /* GWY_GRAIN_VALUE_MEAN is calculated directly. */
+    if ((p = quantity_data[GWY_GRAIN_VALUE_MEDIAN])) {
+        guint *csizes = g_new0(guint, ngrains + 1);
+        guint *pos = g_new0(guint, ngrains + 1);
+        gdouble *tmp;
+
+        /* Find cumulative sizes (we care only about grains, ignore the
+         * outside-grains area) */
+        csizes[0] = 0;
+        csizes[1] = sizes[1];
+        for (gno = 2; gno <= ngrains; gno++)
+            csizes[gno] = sizes[gno] + csizes[gno-1];
+
+        tmp = g_new(gdouble, csizes[ngrains]);
+        /* Find where each grain starts in tmp sorted by grain # */
+        for (gno = 1; gno <= ngrains; gno++)
+            pos[gno] = csizes[gno-1];
+        /* Sort values by grain # to tmp */
+        for (k = 0; k < nn; k++) {
+            if ((gno = grains[k])) {
+                tmp[pos[gno]] = d[k];
+                pos[gno]++;
+            }
+        }
+        /* Find medians of each block */
+        for (gno = 1; gno <= ngrains; gno++)
+            p[gno] = gwy_math_median(csizes[gno] - csizes[gno-1],
+                                     tmp + csizes[gno-1]);
+        /* Finalize */
+        g_free(csizes);
+        g_free(pos);
+        g_free(tmp);
+    }
+    if ((p = quantity_data[GWY_GRAIN_VALUE_HALF_HEIGHT_AREA])) {
+        gdouble *zhalf;
+        guint *zhsizes;
+
+        /* Find the grain half-heights, i.e. (z_min + z_max)/2, first */
+        zhalf = g_new(gdouble, ngrains + 1);
+        for (gno = 0; gno <= ngrains; gno++)
+            zhalf[gno] = (min[gno] + max[gno])/2.0;
+        /* Calculate the area of pixels above the half-heights */
+        zhsizes = g_new0(gint, ngrains + 1);
+        for (k = 0; k < nn; k++) {
+            gno = grains[k];
+            if (d[k] >= zhalf[gno])
+                zhsizes[gno]++;
+        }
+        for (gno = 0; gno <= ngrains; gno++)
+            p[gno] = qarea*zhsizes[gno];
+        /* Finalize */
+        g_free(zhalf);
+        g_free(zhsizes);
+    }
+    if ((p = quantity_data[GWY_GRAIN_VALUE_FLAT_BOUNDARY_LENGTH])) {
+        gwy_clear(p, ngrains + 1);
+        /* Note the cycles go to xres and yres inclusive as we calculate the
+         * boundary, not pixel interiors. */
+        for (i = 0; i <= yres; i++) {
+            for (j = 0; j <= xres; j++) {
+                gint g1, g2, g3, g4, f;
+
+                /* Hope compiler will optimize this mess... */
+                g1 = (i > 0 && j > 0) ? grains[i*xres + j - xres - 1] : 0;
+                g2 = (i > 0 && j < xres) ? grains[i*xres + j - xres] : 0;
+                g3 = (i < yres && j > 0) ? grains[i*xres + j - 1] : 0;
+                g4 = (i < yres && j < xres) ? grains[i*xres + j] : 0;
+                f = (g1 > 0) + (g2 > 0) + (g3 > 0) + (g4 > 0);
+                if (f == 0 || f == 4)
+                    continue;
+
+                if (f == 1 || f == 3) {
+                    /* Try to avoid too many if-thens by using the fact they
+                     * are all either zero or an identical value */
+                    p[g1 | g2 | g3 | g4] += qdiag/2.0;
+                }
+                else if (g1 && g4) {
+                    /* This works for both g1 == g4 and g1 != g4 */
+                    p[g1] += qdiag/2.0;
+                    p[g4] += qdiag/2.0;
+                }
+                else if (g2 && g3) {
+                    /* This works for both g2 == g3 and g2 != g3 */
+                    p[g2] += qdiag/2.0;
+                    p[g3] += qdiag/2.0;
+                }
+                else if (g1 == g2)
+                    p[g1 | g3] += qh;
+                else if (g1 == g3)
+                    p[g1 | g2] += qv;
+                else {
+                    g_assert_not_reached();
+                }
+            }
+        }
+    }
+    if (quantity_data[GWY_GRAIN_VALUE_BOUNDARY_MINIMUM]
+        || quantity_data[GWY_GRAIN_VALUE_BOUNDARY_MAXIMUM]) {
+        gdouble *pmin = quantity_data[GWY_GRAIN_VALUE_BOUNDARY_MINIMUM];
+        gdouble *pmax = quantity_data[GWY_GRAIN_VALUE_BOUNDARY_MAXIMUM];
+
+        if (pmin) {
+            for (gno = 0; gno <= ngrains; gno++)
+                pmin[gno] = G_MAXDOUBLE;
+        }
+        if (pmax) {
+            for (gno = 0; gno <= ngrains; gno++)
+                pmax[gno] = -G_MAXDOUBLE;
+        }
+
+        for (i = 0; i < yres; i++) {
+            for (j = 0; j < xres; j++) {
+                gdouble z;
+
+                /* Processing of the none-grain boundary is waste of time. */
+                if (!(gno = grains[i*xres + j]))
+                    continue;
+
+                if (i && j && i < yres-1 && j < xres - 1
+                    && grains[(i - 1)*xres + j] == gno
+                    && grains[i*xres + j - 1] == gno
+                    && grains[i*xres + j + 1] == gno
+                    && grains[(i + 1)*xres + j] == gno)
+                    continue;
+
+                z = d[i*xres + j];
+                if (pmin && z < pmin[gno])
+                    pmin[gno] = z;
+                if (pmax && z > pmax[gno])
+                    pmax[gno] = z;
+            }
+        }
+    }
+    if (quantity_data[GWY_GRAIN_VALUE_MINIMUM_BOUND_SIZE]
+        || quantity_data[GWY_GRAIN_VALUE_MINIMUM_BOUND_ANGLE]
+        || quantity_data[GWY_GRAIN_VALUE_MAXIMUM_BOUND_SIZE]
+        || quantity_data[GWY_GRAIN_VALUE_MAXIMUM_BOUND_ANGLE]
+        || quantity_data[GWY_GRAIN_VALUE_CONVEX_HULL_AREA]
+        || quantity_data[GWY_GRAIN_VALUE_CIRCUMCIRCLE_R]
+        || quantity_data[GWY_GRAIN_VALUE_CIRCUMCIRCLE_X]
+        || quantity_data[GWY_GRAIN_VALUE_CIRCUMCIRCLE_Y]) {
+        gdouble *psmin = quantity_data[GWY_GRAIN_VALUE_MINIMUM_BOUND_SIZE];
+        gdouble *psmax = quantity_data[GWY_GRAIN_VALUE_MAXIMUM_BOUND_SIZE];
+        gdouble *pamin = quantity_data[GWY_GRAIN_VALUE_MINIMUM_BOUND_ANGLE];
+        gdouble *pamax = quantity_data[GWY_GRAIN_VALUE_MAXIMUM_BOUND_ANGLE];
+        gdouble *achull = quantity_data[GWY_GRAIN_VALUE_CONVEX_HULL_AREA];
+        gdouble *circcr = quantity_data[GWY_GRAIN_VALUE_CIRCUMCIRCLE_R];
+        gdouble *circcx = quantity_data[GWY_GRAIN_VALUE_CIRCUMCIRCLE_X];
+        gdouble *circcy = quantity_data[GWY_GRAIN_VALUE_CIRCUMCIRCLE_Y];
+        GArray *vertices;
+
+        /* Find the complete convex hulls */
+        vertices = g_array_new(FALSE, FALSE, sizeof(GridPoint));
+        for (gno = 1; gno <= ngrains; gno++) {
+            gdouble dx = qh, dy = qv;
+
+            find_grain_convex_hull(xres, yres, grains, boundpos[gno], vertices);
+            if (psmin || pamin) {
+                grain_minimum_bound(vertices, qh, qv, &dx, &dy);
+                if (psmin)
+                    psmin[gno] = hypot(dx, dy);
+                if (pamin) {
+                    pamin[gno] = atan2(-dy, dx);
+                    if (pamin[gno] <= -G_PI/2.0)
+                        pamin[gno] += G_PI;
+                    else if (pamin[gno] > G_PI/2.0)
+                        pamin[gno] -= G_PI;
+                }
+            }
+            if (psmax || pamax) {
+                grain_maximum_bound(vertices, qh, qv, &dx, &dy);
+                if (psmax)
+                    psmax[gno] = hypot(dx, dy);
+                if (pamax) {
+                    pamax[gno] = atan2(-dy, dx);
+                    if (pamax[gno] <= -G_PI/2.0)
+                        pamax[gno] += G_PI;
+                    else if (pamax[gno] > G_PI/2.0)
+                        pamax[gno] -= G_PI;
+                }
+            }
+            if (achull) {
+                achull[gno] = grain_convex_hull_area(vertices, qh, qv);
+            }
+            if (circcr || circcx || circcy) {
+                InscribedDisc circle = { 0.0, 0.0, 0.0, 0 };
+
+                grain_convex_hull_centre(vertices, qh, qv,
+                                         &circle.x, &circle.y);
+                circle.R2 = minimize_circle_radius(&circle, vertices,
+                                                   qh, qv);
+                improve_circumscribed_circle(&circle, vertices, qh, qv);
+
+                if (circcr)
+                    circcr[gno] = sqrt(circle.R2);
+                if (circcx)
+                    circcx[gno] = circle.x + data_field->xoff;
+                if (circcy)
+                    circcy[gno] = circle.y + data_field->yoff;
+            }
+        }
+        /* Finalize */
+        g_array_free(vertices, TRUE);
+    }
+    /* XXX: This must go before GWY_GRAIN_VALUE_CENTER_X and
+     * GWY_GRAIN_VALUE_CENTER_Y because we want them as pixel quantities. */
+    if (quantity_data[GWY_GRAIN_VALUE_INSCRIBED_DISC_R]
+        || quantity_data[GWY_GRAIN_VALUE_INSCRIBED_DISC_X]
+        || quantity_data[GWY_GRAIN_VALUE_INSCRIBED_DISC_Y]) {
+        gdouble *inscdr = quantity_data[GWY_GRAIN_VALUE_INSCRIBED_DISC_R];
+        gdouble *inscdx = quantity_data[GWY_GRAIN_VALUE_INSCRIBED_DISC_X];
+        gdouble *inscdy = quantity_data[GWY_GRAIN_VALUE_INSCRIBED_DISC_Y];
+        guint *grain = NULL;
+        guint grainsize = 0;
+        PixelQueue *inqueue = g_slice_new0(PixelQueue);
+        PixelQueue *outqueue = g_slice_new0(PixelQueue);
+        GArray *candidates = g_array_new(FALSE, FALSE, sizeof(InscribedDisc));
+        EdgeQueue edges = { 0, 0, NULL };
+        InscribedDisc *cand;
+
+        /*
+         * For each grain:
+         *    Extract it, find all boundary pixels.
+         *    Use (octagnoal) erosion to find disc centre candidate(s).
+         *    For each candidate:
+         *       Find maximum disc that fits with this centre.
+         *       By expanding/moving try to find a larger disc until we cannot
+         *       improve it.
+         */
+        for (gno = 1; gno <= ngrains; gno++) {
+            guint width, height, dist;
+            gdouble dx, dy, centrex, centrey;
+            guint w = bbox[4*gno + 2], h = bbox[4*gno + 3];
+            gdouble xoff = qh*bbox[4*gno] + data_field->xoff,
+                    yoff = qv*bbox[4*gno + 1] + data_field->yoff;
+            guint ncand;
+
+            /* If the grain is rectangular, calculate the disc directly.
+             * Large rectangular grains are rare but the point is to catch
+             * grains with width of height of 1 here. */
+            if (sizes[gno] == w*h) {
+                dx = 0.5*w*qh;
+                dy = 0.5*h*qv;
+                if (inscdr)
+                    inscdr[gno] = 0.999*MIN(dx, dy);
+                if (inscdx)
+                    inscdx[gno] = dx + xoff;
+                if (inscdy)
+                    inscdy[gno] = dy + yoff;
+                continue;
+            }
+
+            /* Upsampling twice combined with octagonal erosion has the nice
+             * property that we get candidate pixels in places such as corners
+             * or junctions of one-pixel thin lines. */
+            grain = extract_upsampled_square_pixel_grain(grains, xres, gno,
+                                                         bbox + 4*gno,
+                                                         grain, &grainsize,
+                                                         &width, &height,
+                                                         qh, qv);
+            /* Size of upsamples pixel in original pixel coordinates.  Normally
+             * equal to 1/2 and always approximately 1:1. */
+            dx = w*(qh/qgeom)/width;
+            dy = h*(qv/qgeom)/height;
+            /* Grain centre in squeezed pixel coordinates within the bbox. */
+            centrex = (xvalue[gno] + 0.5)*(qh/qgeom);
+            centrey = (yvalue[gno] + 0.5)*(qv/qgeom);
+
+            dist = _gwy_simple_dist_trans(grain, width, height, TRUE,
+                                          GWY_DISTANCE_TRANSFORM_OCTAGONAL48,
+                                          inqueue, outqueue);
+            if (dist % 2 == 0) {
+                GWY_SWAP(PixelQueue*, inqueue, outqueue);
+            }
+#if 0
+            for (i = 0; i < height; i++) {
+                for (j = 0; j < width; j++) {
+                    if (!grain[i*width + j])
+                        g_printerr("..");
+                    else
+                        g_printerr("%02u", grain[i*width + j]);
+                    g_printerr("%c", j == width-1 ? '\n' : ' ');
+                }
+            }
+#endif
+            /* Now inqueue is always non-empty and contains max-distance
+             * pixels of the upscaled grain. */
+            find_disc_centre_candidates(candidates, inqueue,
+                                        grain, width, height,
+                                        dx, dy, centrex, centrey);
+            find_all_edges(&edges, grains, xres, gno, bbox + 4*gno,
+                           qh/qgeom, qv/qgeom);
+
+            /* Try a few first candidates for the inscribed disc centre. */
+            ncand = MIN(15, candidates->len);
+            for (i = 0; i < ncand; i++) {
+                cand = &g_array_index(candidates, InscribedDisc, i);
+                improve_inscribed_disc(cand, &edges, dist);
+            }
+
+            cand = &g_array_index(candidates, InscribedDisc, 0);
+            for (i = 1; i < ncand; i++) {
+                if (g_array_index(candidates, InscribedDisc, i).R2 > cand->R2)
+                    cand = &g_array_index(candidates, InscribedDisc, i);
+            }
+
+            if (inscdr)
+                inscdr[gno] = sqrt(cand->R2 * qarea);
+            if (inscdx)
+                inscdx[gno] = cand->x*qgeom + xoff;
+            if (inscdy)
+                inscdy[gno] = cand->y*qgeom + yoff;
+        }
+
+        g_free(grain);
+        g_free(inqueue->points);
+        g_free(outqueue->points);
+        g_slice_free(PixelQueue, inqueue);
+        g_slice_free(PixelQueue, outqueue);
+        g_free(edges.edges);
+        g_array_free(candidates, TRUE);
+    }
+    /* XXX: This must go before GWY_GRAIN_VALUE_CENTER_X and
+     * GWY_GRAIN_VALUE_CENTER_Y because we want them as pixel quantities. */
+    if ((p = quantity_data[GWY_GRAIN_VALUE_MEAN_RADIUS])) {
+        guint *blen = g_new0(guint, ngrains + 1);
+
+        k = 0;
+        for (i = 0; i < yres; i++) {
+            for (j = 0; j < xres; j++, k++) {
+                gdouble xc, yc;
+
+                if (!(gno = grains[k]))
+                    continue;
+
+                xc = xvalue[gno];
+                yc = yvalue[gno];
+                if (!i || !grains[k - xres]) {
+                    p[gno] += hypot(qh*(j+0.5 - xc), qv*(i - yc));
+                    p[gno] += hypot(qh*(j+1 - xc), qv*(i - yc));
+                    blen[gno] += 2;
+                }
+                if (!j || !grains[k-1]) {
+                    p[gno] += hypot(qh*(j - xc), qv*(i - yc));
+                    p[gno] += hypot(qh*(j - xc), qv*(i+0.5 - yc));
+                    blen[gno] += 2;
+                }
+                if (j == xres-1 || !grains[k+1]) {
+                    p[gno] += hypot(qh*(j+1 - xc), qv*(i+0.5 - yc));
+                    p[gno] += hypot(qh*(j+1 - xc), qv*(i+1 - yc));
+                    blen[gno] += 2;
+                }
+                if (i == yres-1 || !grains[k + xres]) {
+                    p[gno] += hypot(qh*(j - xc), qv*(i+1 - yc));
+                    p[gno] += hypot(qh*(j+0.5 - xc), qv*(i+1 - yc));
+                    blen[gno] += 2;
+                }
+            }
+        }
+
+        for (gno = 1; gno <= ngrains; gno++)
+            p[gno] /= blen[gno];
+
+        g_free(blen);
+    }
+    if (quantity_data[GWY_GRAIN_VALUE_EQUIV_ELLIPSE_MAJOR]
+        || quantity_data[GWY_GRAIN_VALUE_EQUIV_ELLIPSE_MINOR]
+        || quantity_data[GWY_GRAIN_VALUE_EQUIV_ELLIPSE_ANGLE]) {
+        gdouble *amaj = quantity_data[GWY_GRAIN_VALUE_EQUIV_ELLIPSE_MAJOR];
+        gdouble *amin = quantity_data[GWY_GRAIN_VALUE_EQUIV_ELLIPSE_MINOR];
+        gdouble *phi = quantity_data[GWY_GRAIN_VALUE_EQUIV_ELLIPSE_ANGLE];
+
+        for (gno = 1; gno <= ngrains; gno++) {
+            guint n = sizes[gno];
+            gdouble *lin = linear + 5*gno;
+            gdouble Jxx = qh*qh*(lin[0] + n/12.0)*qarea;
+            gdouble Jxy = qh*qv*lin[1]*qarea;
+            gdouble Jyy = qv*qv*(lin[2] + n/12.0)*qarea;
+
+            if (phi) {
+                gdouble Jeps = 1e-9*MAX(Jxx, Jyy);
+
+                if (fabs(Jxx - Jyy) > Jeps || fabs(Jxy) > Jeps)
+                    phi[gno] = 0.5*atan2(-2.0*Jxy, Jxx - Jyy);
+                else
+                    phi[gno] = 0.0;
+            }
+
+            if (amaj || amin) {
+                gdouble u = Jxx + Jyy,
+                        v = hypot(2.0*Jxy, Jxx - Jyy),
+                        w = sqrt(G_PI*sqrt(Jxx*Jyy - Jxy*Jxy));
+
+                if (amaj)
+                    amaj[gno] = sqrt((u + v)/w);
+                if (amin)
+                    amin[gno] = sqrt((u - v)/w);
+            }
+        }
+
+    }
+    if ((p = quantity_data[GWY_GRAIN_VALUE_CENTER_X])) {
+        for (gno = 0; gno <= ngrains; gno++)
+            p[gno] = qh*(p[gno] + 0.5) + data_field->xoff;
+    }
+    if ((p = quantity_data[GWY_GRAIN_VALUE_CENTER_Y])) {
+        for (gno = 0; gno <= ngrains; gno++)
+            p[gno] = qv*(p[gno] + 0.5) + data_field->yoff;
+    }
+    if (quantity_data[GWY_GRAIN_VALUE_VOLUME_0]
+        || quantity_data[GWY_GRAIN_VALUE_VOLUME_MIN]) {
+        gdouble *pv0 = quantity_data[GWY_GRAIN_VALUE_VOLUME_0];
+        gdouble *pvm = quantity_data[GWY_GRAIN_VALUE_VOLUME_MIN];
+
+        if (pv0) {
+            integrate_grain_volume0(d, grains, xres, yres, pv0, ngrains, qarea);
+            if (pvm) {
+                for (gno = 0; gno <= ngrains; gno++)
+                    pvm[gno] = pv0[gno] - qarea*min[gno]*sizes[gno];
+            }
+        }
+        else {
+            g_assert(pvm);
+            integrate_grain_volume0(d, grains, xres, yres, pvm, ngrains, qarea);
+            for (gno = 0; gno <= ngrains; gno++)
+                pvm[gno] -= qarea*min[gno]*sizes[gno];
+        }
+    }
+    if ((p = quantity_data[GWY_GRAIN_VALUE_VOLUME_LAPLACE])) {
+        /* Fail gracefully when there is one big `grain' over all data. */
+        if (ngrains == 1 && sizes[1] == xres*yres)
+            p[1] = 0.0;
+        else {
+            GwyDataField *difference = gwy_data_field_duplicate(data_field);
+            GwyDataField *mask = gwy_data_field_new_alike(data_field, FALSE);
+            gdouble *m = mask->data;
+
+            for (k = 0; k < nn; k++)
+                m[k] = grains[k];
+
+            gwy_data_field_laplace_solve(difference, mask, -1, 0.4);
+            g_object_unref(mask);
+            gwy_data_field_subtract_fields(difference, data_field, difference);
+            integrate_grain_volume0(difference->data, grains, xres, yres, p,
+                                    ngrains, qarea);
+            g_object_unref(difference);
+        }
+    }
+    if (quantity_data[GWY_GRAIN_VALUE_SLOPE_THETA]
+        || quantity_data[GWY_GRAIN_VALUE_SLOPE_PHI]) {
+        gdouble *ptheta = quantity_data[GWY_GRAIN_VALUE_SLOPE_THETA];
+        gdouble *pphi = quantity_data[GWY_GRAIN_VALUE_SLOPE_PHI];
+
+        for (gno = 1; gno <= ngrains; gno++) {
+            gdouble xx, yy, xy, xz, yz, det, bx, by;
+            gdouble *lin = linear + 5*gno;
+
+            xx = lin[0];
+            xy = lin[1];
+            yy = lin[2];
+            xz = lin[3];
+            yz = lin[4];
+            det = xx*yy - xy*xy;
+            if (det) {
+                bx = (xz*yy - xy*yz)/(qh*det);
+                by = (yz*xx - xy*xz)/(qv*det);
+                if (ptheta)
+                    ptheta[gno] = atan(hypot(bx, by));
+                if (pphi)
+                    pphi[gno] = atan2(by, -bx);
+            }
+            else {
+                if (ptheta)
+                    ptheta[gno] = 0.0;
+                if (pphi)
+                    pphi[gno] = 0.0;
+            }
+        }
+    }
+    if (quantity_data[GWY_GRAIN_VALUE_CURVATURE_CENTER_X]
+        || quantity_data[GWY_GRAIN_VALUE_CURVATURE_CENTER_Y]
+        || quantity_data[GWY_GRAIN_VALUE_CURVATURE_CENTER_Z]
+        || quantity_data[GWY_GRAIN_VALUE_CURVATURE1]
+        || quantity_data[GWY_GRAIN_VALUE_CURVATURE2]
+        || quantity_data[GWY_GRAIN_VALUE_CURVATURE_ANGLE1]
+        || quantity_data[GWY_GRAIN_VALUE_CURVATURE_ANGLE2]) {
+        gdouble *px = quantity_data[GWY_GRAIN_VALUE_CURVATURE_CENTER_X];
+        gdouble *py = quantity_data[GWY_GRAIN_VALUE_CURVATURE_CENTER_Y];
+        gdouble *pz = quantity_data[GWY_GRAIN_VALUE_CURVATURE_CENTER_Z];
+        gdouble *pk1 = quantity_data[GWY_GRAIN_VALUE_CURVATURE1];
+        gdouble *pk2 = quantity_data[GWY_GRAIN_VALUE_CURVATURE2];
+        gdouble *pa1 = quantity_data[GWY_GRAIN_VALUE_CURVATURE_ANGLE1];
+        gdouble *pa2 = quantity_data[GWY_GRAIN_VALUE_CURVATURE_ANGLE2];
+        gdouble mx = sqrt(qh/qv), my = sqrt(qv/qh);
+
+        for (gno = 1; gno <= ngrains; gno++) {
+            /* a:
+             *  0 [<1>
+             *  1  <x>   <x²>
+             *  3  <y>   <xy>   <y²>
+             *  6  <x²>  <x³>   <x²y>  <x⁴>
+             * 10  <xy>  <x²y>  <xy²>  <x³y>   <x²y²>
+             * 15  <y²>  <xy²>  <y³>   <x²y²>  <xy³>   <y⁴>]
+             * b: [<z>  <xz>  <yz>  <x²z>  <xyz>  <y²z>]
+             */
+            gdouble a[21], b[6];
+            gdouble *lin = linear + 5*gno, *quad = quadratic + 12*gno;
+            guint n = sizes[gno];
+
+            if (n >= 6) {
+                a[0] = n;
+                a[1] = a[3] = 0.0;
+                a[2] = a[6] = lin[0];
+                a[4] = a[10] = lin[1];
+                a[5] = a[15] = lin[2];
+                a[7] = quad[0];
+                a[8] = a[11] = quad[1];
+                a[9] = quad[4];
+                a[12] = a[16] = quad[2];
+                a[13] = quad[5];
+                a[14] = a[18] = quad[6];
+                a[17] = quad[3];
+                a[19] = quad[7];
+                a[20] = quad[8];
+                if (gwy_math_choleski_decompose(6, a)) {
+                    b[0] = n*zvalue[gno];
+                    b[1] = lin[3];
+                    b[2] = lin[4];
+                    b[3] = quad[9];
+                    b[4] = quad[10];
+                    b[5] = quad[11];
+                    gwy_math_choleski_solve(6, a, b);
+                    /* Get pixel aspect ratio right while keeping pixel size
+                     * around 1. */
+                    b[1] /= mx;
+                    b[2] /= my;
+                    b[3] /= mx*mx;
+                    b[5] /= my*my;
+                }
+                else
+                    n = 0;
+            }
+
+            /* Recycle a[] for the curvature parameters. */
+            if (n >= 6)
+                gwy_math_curvature(b, a+0, a+1, a+2, a+3, a+4, a+5, a+6);
+            else {
+                a[0] = a[1] = a[2] = a[4] = a[5] = 0.0;
+                a[3] = G_PI/2.0;
+                a[6] = zvalue[gno];
+            }
+            if (pk1)
+                pk1[gno] = a[0]/(qgeom*qgeom);
+            if (pk2)
+                pk2[gno] = a[1]/(qgeom*qgeom);
+            if (pa1)
+                pa1[gno] = a[2];
+            if (pa2)
+                pa2[gno] = a[3];
+            if (px)
+                px[gno] = qgeom*a[4] + xvalue[gno];
+            if (py)
+                py[gno] = qgeom*a[5] + yvalue[gno];
+            if (pz)
+                pz[gno] = a[6];
+        }
+    }
+
+    /* Copy quantity values to all other instances of the same quantity in
+     * @values. */
+    gwy_clear(seen, NQ);
+    for (i = 0; i < nquantities; i++) {
+        GwyGrainQuantity quantity = quantities[i];
+
+        if ((guint)quantity >= NQ || need_aux[quantity] == INVALID)
+            continue;
+
+        if (seen[quantity])
+            gwy_assign(values[i], quantity_data[quantity], ngrains + 1);
+        seen[quantity] = TRUE;
+    }
+
+    /* Finalize */
+    for (l = buffers; l; l = g_list_next(l))
+        g_free(l->data);
+    g_list_free(buffers);
+
+    return values;
+}
+
+/**
+ * gwy_grain_quantity_needs_same_units:
+ * @quantity: A grain quantity.
+ *
+ * Tests whether a grain quantity is defined only when lateral and value
+ * units match.
+ *
+ * Returns: %TRUE if @quantity is meaningless when lateral and value units
+ *          differ, %FALSE if it is always defined.
+ *
+ * Since: 2.7
+ **/
+gboolean
+gwy_grain_quantity_needs_same_units(GwyGrainQuantity quantity)
+{
+    enum {
+        no_same_units = ((ONE << GWY_GRAIN_VALUE_PROJECTED_AREA)
+                         | (ONE << GWY_GRAIN_VALUE_EQUIV_SQUARE_SIDE)
+                         | (ONE << GWY_GRAIN_VALUE_EQUIV_DISC_RADIUS)
+                         | (ONE << GWY_GRAIN_VALUE_MAXIMUM)
+                         | (ONE << GWY_GRAIN_VALUE_MINIMUM)
+                         | (ONE << GWY_GRAIN_VALUE_MEAN)
+                         | (ONE << GWY_GRAIN_VALUE_MEDIAN)
+                         | (ONE << GWY_GRAIN_VALUE_HALF_HEIGHT_AREA)
+                         | (ONE << GWY_GRAIN_VALUE_FLAT_BOUNDARY_LENGTH)
+                         | (ONE << GWY_GRAIN_VALUE_MINIMUM_BOUND_SIZE)
+                         | (ONE << GWY_GRAIN_VALUE_MINIMUM_BOUND_ANGLE)
+                         | (ONE << GWY_GRAIN_VALUE_MAXIMUM_BOUND_SIZE)
+                         | (ONE << GWY_GRAIN_VALUE_MAXIMUM_BOUND_ANGLE)
+                         | (ONE << GWY_GRAIN_VALUE_CENTER_X)
+                         | (ONE << GWY_GRAIN_VALUE_CENTER_Y)
+                         | (ONE << GWY_GRAIN_VALUE_VOLUME_0)
+                         | (ONE << GWY_GRAIN_VALUE_VOLUME_MIN)
+                         | (ONE << GWY_GRAIN_VALUE_VOLUME_LAPLACE)
+                         | (ONE << GWY_GRAIN_VALUE_SLOPE_PHI)
+                         | (ONE << GWY_GRAIN_VALUE_CURVATURE_CENTER_X)
+                         | (ONE << GWY_GRAIN_VALUE_CURVATURE_CENTER_Y)
+                         | (ONE << GWY_GRAIN_VALUE_CURVATURE_CENTER_Z)
+                         | (ONE << GWY_GRAIN_VALUE_CURVATURE_ANGLE1)
+                         | (ONE << GWY_GRAIN_VALUE_CURVATURE_ANGLE2)
+                         | (ONE << GWY_GRAIN_VALUE_INSCRIBED_DISC_R)
+                         | (ONE << GWY_GRAIN_VALUE_INSCRIBED_DISC_X)
+                         | (ONE << GWY_GRAIN_VALUE_INSCRIBED_DISC_Y)
+                         | (ONE << GWY_GRAIN_VALUE_CONVEX_HULL_AREA)
+                         | (ONE << GWY_GRAIN_VALUE_CIRCUMCIRCLE_R)
+                         | (ONE << GWY_GRAIN_VALUE_CIRCUMCIRCLE_X)
+                         | (ONE << GWY_GRAIN_VALUE_CIRCUMCIRCLE_Y)
+                         | (ONE << GWY_GRAIN_VALUE_MEAN_RADIUS)),
+        same_units = ((ONE << GWY_GRAIN_VALUE_SLOPE_THETA)
+                      | (ONE << GWY_GRAIN_VALUE_SURFACE_AREA)
+                      | (ONE << GWY_GRAIN_VALUE_CURVATURE1)
+                      | (ONE << GWY_GRAIN_VALUE_CURVATURE2))
+    };
+
+    if ((ONE << quantity) & no_same_units)
+        return FALSE;
+    if ((ONE << quantity) & same_units)
+        return TRUE;
+    g_return_val_if_reached(FALSE);
+}
+
+/**
+ * gwy_grain_quantity_get_units:
+ * @quantity: A grain quantity.
+ * @siunitxy: Lateral SI unit of data.
+ * @siunitz: Value SI unit of data.
+ * @result: An SI unit to set to the units of @quantity.
+ *          It can be %NULL, a new SI unit is created then and returned.
+ *
+ * Calculates the units of a grain quantity.
+ *
+ * Returns: When @result is %NULL, a newly creates SI unit that has to be
+ *          dereferenced when no longer used later.  Otherwise @result itself
+ *          is simply returned, its reference count is NOT increased.
+ *
+ * Since: 2.7
+ **/
+GwySIUnit*
+gwy_grain_quantity_get_units(GwyGrainQuantity quantity,
+                             GwySIUnit *siunitxy,
+                             GwySIUnit *siunitz,
+                             GwySIUnit *result)
+{
+    enum {
+        coord_units = ((ONE << GWY_GRAIN_VALUE_EQUIV_SQUARE_SIDE)
+                       | (ONE << GWY_GRAIN_VALUE_EQUIV_DISC_RADIUS)
+                       | (ONE << GWY_GRAIN_VALUE_FLAT_BOUNDARY_LENGTH)
+                       | (ONE << GWY_GRAIN_VALUE_MINIMUM_BOUND_SIZE)
+                       | (ONE << GWY_GRAIN_VALUE_MAXIMUM_BOUND_SIZE)
+                       | (ONE << GWY_GRAIN_VALUE_CENTER_X)
+                       | (ONE << GWY_GRAIN_VALUE_CENTER_Y)
+                       | (ONE << GWY_GRAIN_VALUE_CURVATURE_CENTER_X)
+                       | (ONE << GWY_GRAIN_VALUE_CURVATURE_CENTER_Y)
+                       | (ONE << GWY_GRAIN_VALUE_INSCRIBED_DISC_R)
+                       | (ONE << GWY_GRAIN_VALUE_INSCRIBED_DISC_X)
+                       | (ONE << GWY_GRAIN_VALUE_INSCRIBED_DISC_Y)
+                       | (ONE << GWY_GRAIN_VALUE_CIRCUMCIRCLE_R)
+                       | (ONE << GWY_GRAIN_VALUE_CIRCUMCIRCLE_X)
+                       | (ONE << GWY_GRAIN_VALUE_CIRCUMCIRCLE_Y)
+                       | (ONE << GWY_GRAIN_VALUE_MEAN_RADIUS)),
+        icoord_units = ((ONE << GWY_GRAIN_VALUE_CURVATURE1)
+                       | (ONE << GWY_GRAIN_VALUE_CURVATURE2)),
+        value_units = ((ONE << GWY_GRAIN_VALUE_MAXIMUM)
+                       | (ONE << GWY_GRAIN_VALUE_MINIMUM)
+                       | (ONE << GWY_GRAIN_VALUE_MEAN)
+                       | (ONE << GWY_GRAIN_VALUE_MEDIAN)
+                       | (ONE << GWY_GRAIN_VALUE_CURVATURE_CENTER_Z)),
+        area_units = ((ONE << GWY_GRAIN_VALUE_PROJECTED_AREA)
+                      | (ONE << GWY_GRAIN_VALUE_HALF_HEIGHT_AREA)
+                      | (ONE << GWY_GRAIN_VALUE_SURFACE_AREA)
+                      | (ONE << GWY_GRAIN_VALUE_CONVEX_HULL_AREA)),
+        volume_units = ((ONE << GWY_GRAIN_VALUE_VOLUME_0)
+                        | (ONE << GWY_GRAIN_VALUE_VOLUME_MIN)
+                        | (ONE << GWY_GRAIN_VALUE_VOLUME_LAPLACE)),
+        angle_units = ((ONE << GWY_GRAIN_VALUE_MINIMUM_BOUND_ANGLE)
+                       | (ONE << GWY_GRAIN_VALUE_MAXIMUM_BOUND_ANGLE)
+                       | (ONE << GWY_GRAIN_VALUE_SLOPE_PHI)
+                       | (ONE << GWY_GRAIN_VALUE_SLOPE_THETA)
+                       | (ONE << GWY_GRAIN_VALUE_CURVATURE_ANGLE1)
+                       | (ONE << GWY_GRAIN_VALUE_CURVATURE_ANGLE2))
+    };
+
+    g_return_val_if_fail(GWY_IS_SI_UNIT(siunitxy), result);
+    g_return_val_if_fail(GWY_IS_SI_UNIT(siunitz), result);
+
+    if ((ONE << quantity) & coord_units)
+        return gwy_si_unit_power(siunitxy, 1, result);
+    if ((ONE << quantity) & icoord_units)
+        return gwy_si_unit_power(siunitxy, -1, result);
+    if ((ONE << quantity) & value_units)
+        return gwy_si_unit_power(siunitz, 1, result);
+    if ((ONE << quantity) & area_units)
+        return gwy_si_unit_power(siunitxy, 2, result);
+    if ((ONE << quantity) & volume_units)
+        return gwy_si_unit_power_multiply(siunitxy, 2, siunitz, 1, result);
+    if ((ONE << quantity) & angle_units) {
+        if (!result)
+            return gwy_si_unit_new(NULL);
+        gwy_si_unit_set_from_string(result, NULL);
+        return result;
+    }
+
+    g_return_val_if_reached(result);
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/libprocess/grains-wshed.c b/libprocess/grains-wshed.c
new file mode 100644
index 0000000..623942b
--- /dev/null
+++ b/libprocess/grains-wshed.c
@@ -0,0 +1,1253 @@
+/*
+ *  @(#) $Id: grains-wshed.c 20128 2017-08-01 11:19:59Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
+ *
+ *  The quicksort algorithm was copied from GNU C library,
+ *  Copyright (C) 1991, 1992, 1996, 1997, 1999 Free Software Foundation, Inc.
+ *  See below.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <string.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libprocess/filters.h>
+#include <libprocess/stats.h>
+#include <libprocess/grains.h>
+#include "gwyprocessinternal.h"
+
+#define GRAIN_BARRIER G_MAXINT
+
+/* Watershed iterator */
+typedef struct {
+    GwyComputationState cs;
+    GwyDataField *data_field;
+    GwyDataField *grain_field;
+    gint locate_steps;
+    gint locate_thresh;
+    gdouble locate_dropsize;
+    gint wshed_steps;
+    gdouble wshed_dropsize;
+    gboolean prefilter;
+    gboolean below;
+    gint internal_i;
+    GwyDataField *min;
+    GwyDataField *water;
+    GwyDataField *mark_dfield;
+} GwyWatershedState;
+
+static gboolean step_by_one                  (GwyDataField *data_field,
+                                              gint *rcol,
+                                              gint *rrow);
+static void     drop_step                    (GwyDataField *data_field,
+                                              GwyDataField *water_field,
+                                              gdouble dropsize);
+static void     drop_minima                  (GwyDataField *water_field,
+                                              GwyDataField *min_field,
+                                              gint threshval);
+static void     process_mask                 (GwyDataField *grain_field,
+                                              gint col,
+                                              gint row);
+static void     wdrop_step                   (GwyDataField *data_field,
+                                              GwyDataField *min_field,
+                                              GwyDataField *water_field,
+                                              GwyDataField *grain_field,
+                                              gdouble dropsize);
+static void     mark_grain_boundaries        (GwyDataField *grain_field);
+static void     waterpour_sort               (const gdouble *d,
+                                              gint *idx,
+                                              gint n);
+
+
+/**
+ * gwy_data_field_grains_mark_watershed:
+ * @data_field: Data to be used for marking.
+ * @grain_field: Result of marking (mask).
+ * @locate_steps: Locating algorithm steps.
+ * @locate_thresh: Locating algorithm threshold.
+ * @locate_dropsize: Locating drop size.
+ * @wshed_steps: Watershed steps.
+ * @wshed_dropsize: Watershed drop size.
+ * @prefilter: Use prefiltering.
+ * @below: If %TRUE, valleys are marked, otherwise mountains are marked.
+ *
+ * Performs watershed algorithm.
+ **/
+void
+gwy_data_field_grains_mark_watershed(GwyDataField *data_field,
+                                     GwyDataField *grain_field,
+                                     gint locate_steps,
+                                     gint locate_thresh,
+                                     gdouble locate_dropsize,
+                                     gint wshed_steps,
+                                     gdouble wshed_dropsize,
+                                     gboolean prefilter,
+                                     gboolean below)
+{
+    GwyDataField *min, *water, *mark_dfield;
+    gint xres, yres, i;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    g_return_if_fail(GWY_IS_DATA_FIELD(grain_field));
+
+    xres = data_field->xres;
+    yres = data_field->yres;
+
+    min = gwy_data_field_new_alike(data_field, TRUE);
+    water = gwy_data_field_new_alike(data_field, TRUE);
+    mark_dfield = gwy_data_field_duplicate(data_field);
+    if (below)
+        gwy_data_field_multiply(mark_dfield, -1.0);
+    if (prefilter)
+        gwy_data_field_filter_median(mark_dfield, 6);
+
+    gwy_data_field_resample(grain_field, xres, yres, GWY_INTERPOLATION_NONE);
+    gwy_data_field_clear(grain_field);
+
+    /* odrop */
+    for (i = 0; i < locate_steps; i++)
+        drop_step(mark_dfield, water, locate_dropsize);
+    drop_minima(water, min, locate_thresh);
+
+    /* owatershed */
+    gwy_data_field_copy(data_field, mark_dfield, FALSE);
+    if (below)
+        gwy_data_field_multiply(mark_dfield, -1.0);
+    for (i = 0; i < wshed_steps; i++)
+        wdrop_step(mark_dfield, min, water, grain_field, wshed_dropsize);
+
+    mark_grain_boundaries(grain_field);
+
+    g_object_unref(min);
+    g_object_unref(water);
+    g_object_unref(mark_dfield);
+    gwy_data_field_invalidate(grain_field);
+}
+
+/**
+ * gwy_data_field_grains_watershed_init:
+ * @data_field: Data to be used for marking.
+ * @grain_field: Result of marking (mask).
+ * @locate_steps: Locating algorithm steps.
+ * @locate_thresh: Locating algorithm threshold.
+ * @locate_dropsize: Locating drop size.
+ * @wshed_steps: Watershed steps.
+ * @wshed_dropsize: Watershed drop size.
+ * @prefilter: Use prefiltering.
+ * @below: If %TRUE, valleys are marked, otherwise mountains are marked.
+ *
+ * Initializes the watershed algorithm.
+ *
+ * This iterator reports its state as #GwyWatershedStateType.
+ *
+ * Returns: A new watershed iterator.
+ **/
+GwyComputationState*
+gwy_data_field_grains_watershed_init(GwyDataField *data_field,
+                                     GwyDataField *grain_field,
+                                     gint locate_steps,
+                                     gint locate_thresh,
+                                     gdouble locate_dropsize,
+                                     gint wshed_steps,
+                                     gdouble wshed_dropsize,
+                                     gboolean prefilter,
+                                     gboolean below)
+{
+    GwyWatershedState *state;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), NULL);
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(grain_field), NULL);
+
+    state = g_new0(GwyWatershedState, 1);
+
+    state->cs.state = GWY_WATERSHED_STATE_INIT;
+    state->cs.fraction = 0.0;
+    state->data_field = g_object_ref(data_field);
+    state->grain_field = g_object_ref(grain_field);
+    state->locate_steps = locate_steps;
+    state->locate_thresh = locate_thresh;
+    state->locate_dropsize = locate_dropsize;
+    state->wshed_steps = wshed_steps;
+    state->wshed_dropsize = wshed_dropsize;
+    state->prefilter = prefilter;
+    state->below = below;
+    state->internal_i = 0;
+
+    return (GwyComputationState*)state;
+}
+
+/**
+ * gwy_data_field_grains_watershed_iteration:
+ * @state: Watershed iterator.
+ *
+ * Performs one iteration of the watershed algorithm.
+ *
+ * Fields @state and progress @fraction of watershed state are updated
+ * (fraction is calculated for each phase individually).  Once @state
+ * becomes %GWY_WATERSHED_STATE_FINISHED, the calculation is finised.
+ *
+ * A watershed iterator can be created with
+ * gwy_data_field_grains_watershed_init().  When iteration ends, either
+ * by finishing or being aborted, gwy_data_field_grains_watershed_finalize()
+ * must be called to release allocated resources.
+ **/
+void
+gwy_data_field_grains_watershed_iteration(GwyComputationState *cstate)
+{
+    GwyWatershedState *state = (GwyWatershedState*)cstate;
+
+    if (state->cs.state == GWY_WATERSHED_STATE_INIT) {
+        state->min = gwy_data_field_new_alike(state->data_field, TRUE);
+        state->water = gwy_data_field_new_alike(state->data_field, TRUE);
+        state->mark_dfield = gwy_data_field_duplicate(state->data_field);
+        if (state->below)
+            gwy_data_field_multiply(state->mark_dfield, -1.0);
+        if (state->prefilter)
+            gwy_data_field_filter_median(state->mark_dfield, 6);
+
+        gwy_data_field_resample(state->grain_field,
+                                state->data_field->xres,
+                                state->data_field->yres,
+                                GWY_INTERPOLATION_NONE);
+        gwy_data_field_clear(state->grain_field);
+
+        state->cs.state = GWY_WATERSHED_STATE_LOCATE;
+        state->internal_i = 0;
+        state->cs.fraction = 0.0;
+    }
+    else if (state->cs.state == GWY_WATERSHED_STATE_LOCATE) {
+        if (state->internal_i < state->locate_steps) {
+            drop_step(state->mark_dfield, state->water, state->locate_dropsize);
+            state->internal_i += 1;
+            state->cs.fraction = (gdouble)state->internal_i/state->locate_steps;
+        }
+        else {
+            state->cs.state = GWY_WATERSHED_STATE_MIN;
+            state->internal_i = 0;
+            state->cs.fraction = 0.0;
+        }
+    }
+    else if (state->cs.state == GWY_WATERSHED_STATE_MIN) {
+        drop_minima(state->water, state->min, state->locate_thresh);
+        state->cs.state = GWY_WATERSHED_STATE_WATERSHED;
+        state->internal_i = 0;
+        state->cs.fraction = 0.0;
+    }
+    else if (state->cs.state == GWY_WATERSHED_STATE_WATERSHED) {
+        if (state->internal_i == 0) {
+            gwy_data_field_copy(state->data_field, state->mark_dfield, FALSE);
+            if (state->below)
+                gwy_data_field_multiply(state->mark_dfield, -1.0);
+        }
+        if (state->internal_i < state->wshed_steps) {
+            wdrop_step(state->mark_dfield, state->min, state->water,
+                       state->grain_field, state->wshed_dropsize);
+            state->internal_i += 1;
+            state->cs.fraction = (gdouble)state->internal_i/state->wshed_steps;
+        }
+        else {
+            state->cs.state = GWY_WATERSHED_STATE_MARK;
+            state->internal_i = 0;
+            state->cs.fraction = 0.0;
+        }
+    }
+    else if (state->cs.state == GWY_WATERSHED_STATE_MARK) {
+        mark_grain_boundaries(state->grain_field);
+        state->cs.state = GWY_WATERSHED_STATE_FINISHED;
+        state->cs.fraction = 1.0;
+    }
+    else if (state->cs.state == GWY_WATERSHED_STATE_FINISHED)
+        return;
+
+    gwy_data_field_invalidate(state->grain_field);
+}
+
+/**
+ * gwy_data_field_grains_watershed_finalize:
+ * @state: Watershed iterator.
+ *
+ * Destroys a watershed iterator, freeing all resources.
+ **/
+void
+gwy_data_field_grains_watershed_finalize(GwyComputationState *cstate)
+{
+    GwyWatershedState *state = (GwyWatershedState*)cstate;
+
+    GWY_OBJECT_UNREF(state->min);
+    GWY_OBJECT_UNREF(state->water);
+    GWY_OBJECT_UNREF(state->mark_dfield);
+    GWY_OBJECT_UNREF(state->data_field);
+    GWY_OBJECT_UNREF(state->grain_field);
+    g_free(state);
+}
+
+void
+gwy_data_field_grains_splash_water(GwyDataField *data_field,
+                                   GwyDataField *water,
+                                   gint locate_steps,
+                                   gdouble locate_dropsize)
+{
+    GwyDataField *mark_dfield;
+    gint i;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+
+    mark_dfield = gwy_data_field_duplicate(data_field);
+
+    /* odrop */
+    gwy_data_field_clear(water);
+    for (i = 0; i < locate_steps; i++)
+        drop_step(mark_dfield, water, locate_dropsize);
+
+    gwy_data_field_invalidate(water);
+    g_object_unref(mark_dfield);
+}
+
+static gboolean
+step_by_one(GwyDataField *data_field, gint *rcol, gint *rrow)
+{
+    gint xres, yres;
+    gdouble a, b, c, d, v;
+
+    xres = data_field->xres;
+    yres = data_field->yres;
+
+    if (*rcol < (xres - 1))
+        a = data_field->data[*rcol + 1 + xres*(*rrow)];
+    else
+        a = -G_MAXDOUBLE;
+
+    if (*rcol > 0)
+        b = data_field->data[*rcol - 1 + xres*(*rrow)];
+    else
+        b = -G_MAXDOUBLE;
+
+    if (*rrow < (yres - 1))
+        c = data_field->data[*rcol + xres*(*rrow + 1)];
+    else
+        c = -G_MAXDOUBLE;
+
+    if (*rrow > 0)
+        d = data_field->data[*rcol + xres*(*rrow - 1)];
+    else
+        d = -G_MAXDOUBLE;
+
+    v = data_field->data[(gint)(*rcol + xres*(*rrow))];
+
+    if (v >= a && v >= b && v >= c && v >= d) {
+        return TRUE;
+    }
+    else if (a >= v && a >= b && a >= c && a >= d) {
+        *rcol += 1;
+        return FALSE;
+    }
+    else if (b >= v && b >= a && b >= c && b >= d) {
+        *rcol -= 1;
+        return FALSE;
+    }
+    else if (c >= v && c >= b && c >= a && c >= d) {
+        *rrow += 1;
+        return FALSE;
+    }
+    else {
+        *rrow -= 1;
+        return FALSE;
+    }
+
+    return FALSE;
+}
+
+static void
+drop_step(GwyDataField *data_field, GwyDataField *water_field, gdouble dropsize)
+{
+    gint xres, yres, i;
+    gint col, row;
+    gboolean retval;
+
+    xres = data_field->xres;
+    yres = data_field->yres;
+
+    for (i = 0; i < xres*yres; i++) {
+        row = (gint)floor((gdouble)i/(gdouble)xres);
+        col = i - xres*row;
+        if (col == 0 || row == 0 || col == (xres - 1) || row == (yres - 1))
+            continue;
+
+        do {
+            retval = step_by_one(data_field, &col, &row);
+        } while (!retval);
+
+        water_field->data[col + xres*row] += 1;
+        data_field->data[col + xres*row] -= dropsize;
+
+    }
+    gwy_data_field_invalidate(water_field);
+    gwy_data_field_invalidate(data_field);
+}
+
+static void
+drop_minima(GwyDataField *water_field, GwyDataField *min_field, gint threshval)
+{
+    gint xres, yres, i, j, ngrains;
+    gint *grain_maxima, *grain_size;
+    gdouble *data;
+    gint *grains;
+
+    xres = water_field->xres;
+    yres = water_field->yres;
+    data = water_field->data;
+
+    grains = g_new0(gint, xres*yres);
+    ngrains = gwy_data_field_number_grains(water_field, grains);
+    grain_size = g_new0(gint, ngrains + 1);
+    grain_maxima = g_new(gint, ngrains + 1);
+    for (i = 1; i <= ngrains; i++)
+        grain_maxima[i] = -1;
+
+    /* sum grain sizes and find maxima */
+    for (i = 0; i < xres*yres; i++) {
+        j = grains[i];
+        if (!j)
+            continue;
+
+        grain_size[j]++;
+        if (grain_maxima[j] < 0
+            || data[grain_maxima[j]] < data[i])
+            grain_maxima[j] = i;
+    }
+    g_free(grains);
+
+    /* mark maxima */
+    for (i = 1; i <= ngrains; i++) {
+        if (grain_size[i] <= threshval)
+            continue;
+
+        min_field->data[grain_maxima[i]] = i;
+    }
+
+    g_free(grain_maxima);
+    g_free(grain_size);
+}
+
+static void
+process_mask(GwyDataField *grain_field, gint col, gint row)
+{
+    gint xres, yres, ival[4], val, i;
+    gboolean stat;
+    gdouble *data;
+
+    xres = grain_field->xres;
+    yres = grain_field->yres;
+    data = grain_field->data;
+
+    if (col == 0 || row == 0 || col == (xres - 1) || row == (yres - 1)) {
+        data[col + xres*row] = -1;
+        return;
+    }
+
+    /*if this is grain or boundary, keep it */
+    if (data[col + xres*row] != 0)
+        return;
+
+    /*if there is nothing around, do nothing */
+    if ((fabs(data[col + 1 + xres*row]) + fabs(data[col - 1 + xres*row])
+         + fabs(data[col + xres*(row + 1)]) + fabs(data[col + xres*(row - 1)]))
+        == 0)
+        return;
+
+    /*now count the grain values around */
+    ival[0] = data[col - 1 + xres*row];
+    ival[1] = data[col + xres*(row - 1)];
+    ival[2] = data[col + 1 + xres*row];
+    ival[3] = data[col + xres*(row + 1)];
+
+    val = 0;
+    stat = FALSE;
+    for (i = 0; i < 4; i++) {
+        if (val > 0 && ival[i] > 0 && ival[i] != val) {
+            /*if some value already was there and the now one is different */
+            stat = TRUE;
+            break;
+        }
+        else {
+            /*ifthere is some value */
+            if (ival[i] > 0) {
+                val = ival[i];
+            }
+        }
+    }
+
+    /*it will be boundary or grain */
+    data[col + xres*row] = stat ? -1 : val;
+}
+
+static void
+wdrop_step(GwyDataField *data_field, GwyDataField *min_field,
+           GwyDataField *water_field, GwyDataField *grain_field,
+           gdouble dropsize)
+{
+    gint xres, yres, vcol, vrow, col, row, grain;
+    gboolean retval;
+
+    xres = data_field->xres;
+    yres = data_field->yres;
+
+    grain = 0;
+    for (col = 0; col < xres; col++) {
+        for (row = 0; row < yres; row++) {
+            if (min_field->data[col + xres*row] > 0)
+                grain_field->data[col + xres*row] = grain++;
+        }
+    }
+    for (col = 1; col < xres - 1; col++) {
+        for (row = 1; row < yres - 1; row++) {
+
+            vcol = col;
+            vrow = row;
+            do {
+                retval = step_by_one(data_field, &vcol, &vrow);
+            } while (!retval);
+
+            /*now, distinguish what to change at point vi, vj */
+            process_mask(grain_field, vcol, vrow);
+            water_field->data[vcol + xres*(vrow)] += 1;
+            data_field->data[vcol + xres*(vrow)] -= dropsize;
+
+        }
+    }
+}
+
+static void
+mark_grain_boundaries(GwyDataField *grain_field)
+{
+    gint xres, yres, col, row;
+    GwyDataField *buffer;
+    gdouble *data;
+
+    xres = grain_field->xres;
+    yres = grain_field->yres;
+    /* FIXME: it is not necessary to duplicate complete data field to check
+     * a few boundary pixels. */
+    buffer = gwy_data_field_duplicate(grain_field);
+    data = buffer->data;
+
+    for (col = 1; col < xres - 1; col++) {
+        for (row = 1; row < yres - 1; row++) {
+            if (data[col + xres*row] != data[col + 1 + xres*row]
+                || data[col + xres*row] != data[col + xres*(row + 1)])
+                grain_field->data[col + xres*row] = 0;
+        }
+    }
+    g_object_unref(buffer);
+}
+
+static gint
+waterpour_decide(const gint *assigned, gint xres, gint yres, gint km)
+{
+    gint i = km/xres, j = km % xres;
+    gint idu = (i ? assigned[km-xres] : GRAIN_BARRIER),
+         idl = (j ? assigned[km-1] : GRAIN_BARRIER),
+         idr = (j < xres-1 ? assigned[km+1] : GRAIN_BARRIER),
+         idd = (i < yres-1 ? assigned[km+xres] : GRAIN_BARRIER);
+
+    if (idu == GRAIN_BARRIER || idu == 0) {
+        if (idl == GRAIN_BARRIER || idl == 0) {
+            if (idr == GRAIN_BARRIER || idr == 0) {
+                if (idd == GRAIN_BARRIER || idd == 0)
+                    return 0;
+                return idd;
+            }
+            if (idd == GRAIN_BARRIER || idd == 0|| idd == idr)
+                return idr;
+            return GRAIN_BARRIER;
+        }
+        if (idr == GRAIN_BARRIER || idr == 0 || idr == idl) {
+            if (idd == GRAIN_BARRIER || idd == 0|| idd == idl)
+                return idl;
+        }
+        return GRAIN_BARRIER;
+    }
+    if (idl == GRAIN_BARRIER || idl == 0 || idl == idu) {
+        if (idr == GRAIN_BARRIER || idr == 0 || idr == idu) {
+            if (idd == GRAIN_BARRIER || idd == 0 || idd == idu)
+                return idu;
+        }
+    }
+    return GRAIN_BARRIER;
+}
+
+static gint
+mark_one_grain(const gdouble *d, gint *assigned,
+               gint xres, gint yres,
+               gint km, gint gno,
+               IntList *inqueue, IntList *outqueue)
+{
+    gint m, i, j, count = 1;
+    gdouble z = d[km];
+
+    inqueue->len = 0;
+    int_list_add(inqueue, km);
+    assigned[km] = gno;
+
+    while (inqueue->len) {
+        outqueue->len = 0;
+        for (m = 0; m < inqueue->len; m++) {
+            km = inqueue->data[m];
+            i = km/xres;
+            j = km % xres;
+
+            if (i > 0 && !assigned[km-xres] && d[km-xres] == z)
+                int_list_add(outqueue, km-xres);
+            if (j > 0 && !assigned[km-1] && d[km-1] == z)
+                int_list_add(outqueue, km-1);
+            if (j < xres-1 && !assigned[km+1] && d[km+1] == z)
+                int_list_add(outqueue, km+1);
+            if (i < yres-1 && !assigned[km+xres] && d[km+xres] == z)
+                int_list_add(outqueue, km+xres);
+        }
+
+        inqueue->len = 0;
+        for (m = 0; m < outqueue->len; m++) {
+            km = outqueue->data[m];
+            if (!assigned[km]) {
+                assigned[km] = gno;
+                int_list_add(inqueue, km);
+                count++;
+            }
+        }
+    }
+
+    return count;
+}
+
+static void
+fix_grain_numbers(gint *grains, gint *buf, gint n)
+{
+    gint gno = 0, k;
+
+    for (k = 0; k < n; k++) {
+        gint gnok = grains[k];
+        if (gnok && !buf[gnok]) {
+            buf[gnok] = ++gno;
+        }
+    }
+    for (k = 0; k < n; k++)
+        grains[k] = buf[grains[k]];
+}
+
+/**
+ * gwy_data_field_waterpour:
+ * @data_field: A data field to segmentate.
+ * @result: Data field that will be filled with the resulting mask.  It will be
+ *          resized to the dimensions of @data_field and its properties set
+ *          accordingly.
+ * @grains: Optionally, an array with the same number of items as @data_field.
+ *          If non-%NULL, it will be filled with grain numbers in the same
+ *          manner as gwy_data_field_number_grains().  Pass %NULL to ignore.
+ *
+ * Performs the classical Vincent watershed segmentation of a data field.
+ *
+ * The segmentation always results in the entire field being masked with the
+ * exception of thin (8-connectivity) lines separating the segments (grains).
+ *
+ * Compared to gwy_data_field_grains_mark_watershed(), this algorithm is very
+ * fast.  However, when used alone, it typically results in a serious
+ * oversegmentation as each local minimum gives raise to a grain.  Furthermore,
+ * the full segmentation means that also pixels which would be considered
+ * outside any grain in the topographical sense will be assigned to some
+ * catchment basin.  Therefore, pre- or postprocessing is usually necessary,
+ * using the gradient image or a more sophisticated method.
+ *
+ * The function does not assign pixels with value %HUGE_VAL or larger to any
+ * segment.  This can be used to pre-mark certain areas explicitly as
+ * boundaries.
+ *
+ * Since the algorithm numbers the grains as a side effect, you can pass a
+ * @grains array and get the grain numbers immediatelly, avoiding the
+ * relatively (although not drastically) expensive
+ * gwy_data_field_number_grains() call.
+ *
+ * Returns: The number of segments (grains) in the result, excluding the
+ *          separators, i.e. the same convention as in
+ *          gwy_data_field_number_grains() is used.
+ *
+ * Since: 2.37
+ **/
+gint
+gwy_data_field_waterpour(GwyDataField *data_field,
+                         GwyDataField *result,
+                         gint *grains)
+{
+    IntList *flatqueue, *fillqueue;
+    gint xres, yres, n, k, kq, gno;
+    gint *queue, *assigned;
+    const gdouble *d;
+    gdouble *rd;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), 0);
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(result), 0);
+
+    xres = data_field->xres;
+    yres = data_field->yres;
+    n = xres*yres;
+    gwy_data_field_resample(result, xres, yres, GWY_INTERPOLATION_NONE);
+
+    queue = g_new(gint, n);
+    for (k = 0; k < n; k++)
+        queue[k] = k;
+
+    d = data_field->data;
+    waterpour_sort(d, queue, n);
+
+    assigned = grains ? grains : g_new0(gint, n);
+    flatqueue = int_list_new(0);
+    fillqueue = int_list_new(0);
+    kq = gno = 0;
+    while (kq < n) {
+        gint len = 1, todo, um;
+        gdouble z;
+
+        k = queue[kq];
+        z = d[k];
+        if (z >= HUGE_VAL)
+            break;
+
+        while (kq + len < n && d[queue[kq + len]] == z)
+            len++;
+
+        todo = len;
+        while (todo) {
+            gint m;
+
+            um = GRAIN_BARRIER;
+            flatqueue->len = 0;
+            for (m = 0; m < len; m++) {
+                gint km = queue[kq + m];
+                gint id = assigned[km];
+                if (id)
+                    continue;
+
+                if ((id = waterpour_decide(assigned, xres, yres, km))) {
+                    /* Must postpone the grain number assignment. There may
+                     * be conflicts later so only queue the position; we have
+                     * to waterpour_decide() again. */
+                    int_list_add(flatqueue, km);
+                }
+                else if (um == GRAIN_BARRIER)
+                    um = m;
+            }
+
+            if (flatqueue->len) {
+                /* We have some modifications to commit. */
+                for (m = 0; m < flatqueue->len; m++) {
+                    gint km = flatqueue->data[m];
+                    gint id = waterpour_decide(assigned, xres, yres, km);
+                    g_assert(id);
+                    assigned[km] = id;
+                }
+                todo -= flatqueue->len;
+            }
+            else {
+                /* We do not have any modifications.  All unassigned pixels
+                 * of this height belong to new grains. */
+                break;
+            }
+        }
+
+        /* Create new grains from remaining pixels. */
+        while (todo) {
+            gint km = GRAIN_BARRIER;
+            while (um < len) {
+                k = queue[kq + um];
+                um++;
+                if (!assigned[k]) {
+                    km = k;
+                    break;
+                }
+            }
+            g_assert(km != GRAIN_BARRIER);
+            todo -= mark_one_grain(d, assigned, xres, yres,
+                                   km, ++gno, flatqueue, fillqueue);
+        }
+
+        kq += len;
+    }
+
+    while (kq < n) {
+        k = queue[kq++];
+        assigned[k] = GRAIN_BARRIER;
+    }
+
+    rd = result->data;
+    for (k = 0; k < n; k++) {
+        gint gnok = assigned[k];
+        gnok = (gnok == GRAIN_BARRIER) ? 0 : gnok;
+        assigned[k] = gnok;
+        rd[k] = !!gnok;
+    }
+
+    /* The grain numbering differs from gwy_data_field_number_grains() which
+     * performs the numbering from top left to bottom right.  Since we
+     * guarantee stable grain numbers, renumber the grains to match that.
+     * Recycle @queue as a scratch buffer.  */
+    if (grains) {
+        gwy_clear(queue, gno+1);
+        fix_grain_numbers(grains, queue, n);
+    }
+
+    int_list_free(fillqueue);
+    int_list_free(flatqueue);
+    g_free(queue);
+    if (!grains)
+        g_free(assigned);
+
+    result->xreal = data_field->xreal;
+    result->yreal = data_field->yreal;
+    result->xoff = data_field->xoff;
+    result->yoff = data_field->yoff;
+
+    _gwy_assign_si_unit(data_field->si_unit_xy, &result->si_unit_xy);
+    if (result->si_unit_z)
+        gwy_si_unit_set_from_string(result->si_unit_z, NULL);
+
+    gwy_data_field_invalidate(result);
+
+    return gno;
+}
+
+/* Mark sharp maxima with 2, known non-maxima with 1. */
+static guint
+mark_maxima(GwyDataField *field,
+            guint *types)
+{
+    guint xres = field->xres, yres = field->yres;
+    const gdouble *d = field->data;
+    guint i, j, k = 0, unmarked = xres*yres;
+
+    for (i = 0; i < yres; i++) {
+        for (j = 0; j < xres; j++, k++) {
+            /* Mark non-maxima. */
+            if ((i && d[k] < d[k-xres])
+                || (j && d[k] < d[k-1])
+                || (j < xres-1 && d[k] < d[k+1])
+                || (i < yres-1 && d[k] < d[k+xres])) {
+                types[k] = 1;
+                unmarked--;
+            }
+            /* Mark maxima. */
+            else if ((!i || d[k] > d[k-xres])
+                     && (!j || d[k] > d[k-1])
+                     && (j == xres-1 || d[k] > d[k+1])
+                     && (i == yres-1 || d[k] > d[k+xres])) {
+                types[k] = 2;
+                unmarked--;
+            }
+        }
+    }
+
+    return unmarked;
+}
+
+/* Mark sharp minima with 2, known non-minima with 1. */
+static guint
+mark_minima(GwyDataField *field,
+            guint *types)
+{
+    guint xres = field->xres, yres = field->yres;
+    const gdouble *d = field->data;
+    guint i, j, k = 0, unmarked = xres*yres;
+
+    for (i = 0; i < yres; i++) {
+        for (j = 0; j < xres; j++, k++) {
+            /* Mark non-minima. */
+            if ((i && d[k] > d[k-xres])
+                || (j && d[k] > d[k-1])
+                || (j < xres-1 && d[k] > d[k+1])
+                || (i < yres-1 && d[k] > d[k+xres])) {
+                types[k] = 1;
+                unmarked--;
+            }
+            /* Mark minima. */
+            else if ((!i || d[k] < d[k-xres])
+                     && (!j || d[k] < d[k-1])
+                     && (j == xres-1 || d[k] < d[k+1])
+                     && (i == yres-1 || d[k] < d[k+xres])) {
+                types[k] = 2;
+                unmarked--;
+            }
+        }
+    }
+
+    return unmarked;
+}
+
+/* Propagate non-maxima type to all pixels of the same value.  Or minima. This
+ * alogorithm no longer depends on how the states was marked, it just
+ * propagates the 1 state though identical values. */
+static void
+propagate_non_extrema_marking(guint *types, const gdouble *d,
+                              guint xres, guint yres)
+{
+    IntList *inqueue = int_list_new(16);
+    IntList *outqueue = int_list_new(16);
+    guint i, j, m, k = 0;
+
+    for (i = 0; i < yres; i++) {
+        for (j = 0; j < xres; j++, k++) {
+            if (types[k])
+                continue;
+            /* If the value is equal to some neighbour which is a known
+             * non-maximum then this pixel is also non-maximum.  (If the
+             * neighbour is a known maximum this pixel cannot be unknown.) */
+            if ((i && types[k-xres] && d[k] == d[k-xres])
+                || (j && types[k-1] && d[k] == d[k-1])
+                || (j < xres-1 && types[k+1] && d[k] == d[k+1])
+                || (i < yres-1 && types[k+xres] && d[k] == d[k+xres])) {
+                types[k] = 1;
+                int_list_add(outqueue, k);
+            }
+        }
+    }
+    GWY_SWAP(IntList*, inqueue, outqueue);
+
+    while (inqueue->len) {
+        for (m = 0; m < inqueue->len; m++) {
+            k = inqueue->data[m];
+            i = k/xres;
+            j = k % xres;
+
+            /* Propagate the non-maximum type to all still unknown
+             * neighbours.  Since we set them to known immediately, double
+             * queuing is avoided. */
+            if (i && !types[k-xres]) {
+                types[k-xres] = 1;
+                int_list_add(outqueue, k-xres);
+            }
+            if (j && !types[k-1]) {
+                types[k-1] = 1;
+                int_list_add(outqueue, k-1);
+            }
+            if (j < xres-1 && !types[k+1]) {
+                types[k+1] = 1;
+                int_list_add(outqueue, k+1);
+            }
+            if (i < yres-1 && !types[k+xres]) {
+                types[k+xres] = 1;
+                int_list_add(outqueue, k+xres);
+            }
+        }
+
+        inqueue->len = 0;
+        GWY_SWAP(IntList*, inqueue, outqueue);
+    }
+
+    int_list_free(inqueue);
+    int_list_free(outqueue);
+}
+
+/**
+ * gwy_data_field_mark_extrema:
+ * @dfield: A two-dimensional data field.
+ * @extrema: Target field for the extrema mask.
+ * @maxima: %TRUE to mark maxima, %FALSE to mark minima.
+ *
+ * Marks local maxima or minima in a two-dimensional field.
+ *
+ * Local (or regional) maximum is a contiguous set of pixels that have the same
+ * value and this value is sharply greater than the value of any pixel touching
+ * the set.  A minimum is defined analogously.  A field filled with a single
+ * value is considered to have neither minimum nor maximum.
+ *
+ * Since: 2.37
+ **/
+void
+gwy_data_field_mark_extrema(GwyDataField *dfield,
+                            GwyDataField *extrema,
+                            gboolean maxima)
+{
+    gdouble min, max;
+    guint xres, yres, unmarked, k;
+    guint *types;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(dfield));
+    g_return_if_fail(GWY_IS_DATA_FIELD(extrema));
+    xres = dfield->xres;
+    yres = dfield->yres;
+    g_return_if_fail(extrema->xres == xres);
+    g_return_if_fail(extrema->yres == yres);
+
+    gwy_data_field_clear(extrema);
+
+    gwy_data_field_get_min_max(dfield, &min, &max);
+    /* This takes care of 1×1 fields too. */
+    if (min == max)
+        return;
+
+    types = g_new0(guint, xres*yres);
+    unmarked = (maxima ? mark_maxima : mark_minima)(dfield, types);
+
+    if (unmarked)
+        propagate_non_extrema_marking(types, dfield->data, xres, yres);
+
+    /* Mark 1 as 0 (non-extremum); mark 0 and 2 as 1 (extremum).  The remaining
+       0s are exactly those flat areas which cannot be made non-maximum, i.e.
+       they must be maxima.  Assume extrema are relatively sparse so prefer
+       fast iteration compared to fast mask bit setting. */
+    for (k = 0; k < xres*yres; k++) {
+        if (!(types[k] & 1))
+            extrema->data[k] = 1.0;
+    }
+
+    g_free(types);
+    gwy_data_field_invalidate(extrema);
+}
+
+/* Copyright (C) 1991, 1992, 1996, 1997, 1999 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Written by Douglas C. Schmidt (schmidt at ics.uci.edu).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA  */
+
+/* If you consider tuning this algorithm, you should consult first:
+   Engineering a sort function; Jon Bentley and M. Douglas McIlroy;
+   Software - Practice and Experience; Vol. 23 (11), 1249-1265, 1993.  */
+
+typedef struct {
+    gdouble z;
+    guint k;
+} Pair;
+
+#define is_smaller_pair(a, b) \
+    ((a)->z < (b)->z || ((a)->z == (b)->z && (a)->k < (b)->k))
+
+#define PSWAP(x, y) GWY_SWAP(Pair, x, y)
+
+#define STACK_SIZE      (CHAR_BIT * sizeof(gsize))
+#define PUSH(low, high) ((void) ((top->lo = (low)), (top->hi = (high)), ++top))
+#define POP(low, high)  ((void) (--top, (low = top->lo), (high = top->hi)))
+#define STACK_NOT_EMPTY (stack < top)
+
+/* Order size using quicksort.  This implementation incorporates
+   four optimizations discussed in Sedgewick:
+
+   1. Non-recursive, using an explicit stack of pointer that store the
+   next array partition to sort.  To save time, this maximum amount
+   of space required to store an array of SIZE_MAX is allocated on the
+   stack.  Assuming a 32-bit (64 bit) integer for size_t, this needs
+   only 32 * sizeof(stack_node) == 256 bytes (for 64 bit: 1024 bytes).
+   Pretty cheap, actually.
+
+   2. Chose the pivot element using a median-of-three decision tree.
+   This reduces the probability of selecting a bad pivot value and
+   eliminates certain extraneous comparisons.
+
+   3. Only quicksorts TOTAL_ELEMS / MAX_THRESH partitions, leaving
+   insertion sort to order the MAX_THRESH items within each partition.
+   This is a big win, since insertion sort is faster for small, mostly
+   sorted array segments.
+
+   4. The larger of the two sub-partitions is always pushed onto the
+   stack first, with the algorithm then concentrating on the
+   smaller partition.  This *guarantees* no more than log(n)
+   stack size is needed (actually O(1) in this case)!  */
+
+static void
+sort_pairs(Pair *array,
+           gsize n)
+{
+    /* Note: Specialization makes the insertion sort part relatively more
+     * efficient, after some benchmarking this seems be about the best value
+     * on Athlon 64. */
+    enum { MAX_THRESH = 20 };
+
+    // Stack node declarations used to store unfulfilled partition obligations.
+    typedef struct {
+        Pair *lo;
+        Pair *hi;
+    } stack_node;
+
+    if (n < 2)
+        /* Avoid lossage with unsigned arithmetic below.  */
+        return;
+
+    if (n > MAX_THRESH) {
+        Pair *lo = array;
+        Pair *hi = lo + (n - 1);
+        stack_node stack[STACK_SIZE];
+        stack_node *top = stack + 1;
+
+        while (STACK_NOT_EMPTY) {
+            Pair *left_ptr;
+            Pair *right_ptr;
+
+            /* Select median value from among LO, MID, and HI. Rearrange
+               LO and HI so the three values are sorted. This lowers the
+               probability of picking a pathological pivot value and
+               skips a comparison for both the LEFT_PTR and RIGHT_PTR in
+               the while loops. */
+
+            Pair *mid = lo + ((hi - lo) >> 1);
+
+            if (is_smaller_pair(mid, lo))
+                PSWAP(*mid, *lo);
+            if (is_smaller_pair(hi, mid))
+                PSWAP(*mid, *hi);
+            else
+                goto jump_over;
+            if (is_smaller_pair(mid, lo))
+                PSWAP(*mid, *lo);
+
+jump_over:
+          left_ptr  = lo + 1;
+          right_ptr = hi - 1;
+
+          /* Here's the famous ``collapse the walls'' section of quicksort.
+             Gotta like those tight inner loops!  They are the main reason
+             that this algorithm runs much faster than others. */
+          do {
+              while (is_smaller_pair(left_ptr, mid))
+                  left_ptr++;
+
+              while (is_smaller_pair(mid, right_ptr))
+                  right_ptr--;
+
+              if (left_ptr < right_ptr) {
+                  PSWAP(*left_ptr, *right_ptr);
+                  if (mid == left_ptr)
+                      mid = right_ptr;
+                  else if (mid == right_ptr)
+                      mid = left_ptr;
+                  left_ptr++;
+                  right_ptr--;
+              }
+              else if (left_ptr == right_ptr) {
+                  left_ptr++;
+                  right_ptr--;
+                  break;
+              }
+          }
+          while (left_ptr <= right_ptr);
+
+          /* Set up pointers for next iteration.  First determine whether
+             left and right partitions are below the threshold size.  If so,
+             ignore one or both.  Otherwise, push the larger partition's
+             bounds on the stack and continue sorting the smaller one. */
+
+          if ((gsize)(right_ptr - lo) <= MAX_THRESH) {
+              if ((gsize)(hi - left_ptr) <= MAX_THRESH)
+                  /* Ignore both small partitions. */
+                  POP(lo, hi);
+              else
+                  /* Ignore small left partition. */
+                  lo = left_ptr;
+          }
+          else if ((gsize)(hi - left_ptr) <= MAX_THRESH)
+              /* Ignore small right partition. */
+              hi = right_ptr;
+          else if ((right_ptr - lo) > (hi - left_ptr)) {
+              /* Push larger left partition indices. */
+              PUSH(lo, right_ptr);
+              lo = left_ptr;
+          }
+          else {
+              /* Push larger right partition indices. */
+              PUSH(left_ptr, hi);
+              hi = right_ptr;
+          }
+        }
+    }
+
+    /* Once the BASE_PTR array is partially sorted by quicksort the rest
+       is completely sorted using insertion sort, since this is efficient
+       for partitions below MAX_THRESH size. BASE_PTR points to the beginning
+       of the array to sort, and END_PTR points at the very last element in
+       the array (*not* one beyond it!). */
+
+    {
+        Pair *const end_ptr = array + (n - 1);
+        Pair *tmp_ptr = array;
+        Pair *thresh = MIN(end_ptr, array + MAX_THRESH);
+        Pair *run_ptr;
+
+        /* Find smallest element in first threshold and place it at the
+           array's beginning.  This is the smallest array element,
+           and the operation speeds up insertion sort's inner loop. */
+
+        for (run_ptr = tmp_ptr + 1; run_ptr <= thresh; run_ptr++) {
+            if (is_smaller_pair(run_ptr, tmp_ptr))
+                tmp_ptr = run_ptr;
+        }
+
+        if (tmp_ptr != array)
+            PSWAP(*tmp_ptr, *array);
+
+        /* Insertion sort, running from left-hand-side up to right-hand-side.
+         */
+
+        run_ptr = array + 1;
+        while (++run_ptr <= end_ptr) {
+            tmp_ptr = run_ptr - 1;
+            while (is_smaller_pair(run_ptr, tmp_ptr))
+                tmp_ptr--;
+
+            tmp_ptr++;
+            if (tmp_ptr != run_ptr) {
+                Pair *hi, *lo;
+                Pair d;
+
+                d = *run_ptr;
+                for (hi = lo = run_ptr; --lo >= tmp_ptr; hi = lo)
+                    *hi = *lo;
+                *hi = d;
+            }
+        }
+    }
+}
+
+static void
+waterpour_sort(const gdouble *d, gint *idx, gint n)
+{
+    Pair *pairs = g_new(Pair, n);
+    gint k;
+
+    for (k = 0; k < n; k++)
+        pairs[k] = (Pair){ d[k], k };
+
+    sort_pairs(pairs, n);
+
+    for (k = 0; k < n; k++)
+        idx[k] = pairs[k].k;
+
+    g_free(pairs);
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/libprocess/grains.c b/libprocess/grains.c
index ac179c5..99440f6 100644
--- a/libprocess/grains.c
+++ b/libprocess/grains.c
@@ -1,15 +1,11 @@
 /*
- *  @(#) $Id: grains.c 19199 2016-11-07 20:03:54Z yeti-dn $
- *  Copyright (C) 2003-2015 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: grains.c 19698 2017-05-03 20:18:10Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  Copyright (C) 2013 Brazilian Nanotechnology National Laboratory
  *  E-mail: Vinicius Barboza <vinicius.barboza at lnnano.cnpem.br>
  *
- *  The quicksort algorithm was copied from GNU C library,
- *  Copyright (C) 1991, 1992, 1996, 1997, 1999 Free Software Foundation, Inc.
- *  See below.
- *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation; either version 2 of the License, or
@@ -26,7 +22,6 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-#include "config.h"
 #include <string.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
@@ -34,86 +29,14 @@
 #include <libprocess/filters.h>
 #include <libprocess/arithmetic.h>
 #include <libprocess/stats.h>
-#include <libprocess/correct.h>
 #include <libprocess/grains.h>
-
-#define ONE G_GUINT64_CONSTANT(1)
-#define GRAIN_BARRIER G_MAXINT
+#include "gwyprocessinternal.h"
 
 enum {
     FOREGROUND_FLAG = 1,
     BACKGROUND_FLAG = 0,
 };
 
-typedef struct {
-    gint i;
-    gint j;
-} GridPoint;
-
-typedef struct {
-    guint size;
-    guint len;
-    GridPoint *points;
-} PixelQueue;
-
-typedef struct {
-    gdouble xa;
-    gdouble ya;
-    gdouble xb;
-    gdouble yb;
-    gdouble r2;
-} Edge;
-
-typedef struct {
-    guint size;
-    guint len;
-    Edge *edges;
-} EdgeQueue;
-
-typedef struct {
-    gdouble x;
-    gdouble y;
-    gdouble R2;
-    guint size;   /* For candidate sorting. */
-} InscribedDisc;
-
-typedef struct {
-    gdouble distance;
-    guint i;
-    guint j;
-} DistantPoint;
-
-/* Watershed iterator */
-typedef struct {
-    GwyComputationState cs;
-    GwyDataField *data_field;
-    GwyDataField *grain_field;
-    gint locate_steps;
-    gint locate_thresh;
-    gdouble locate_dropsize;
-    gint wshed_steps;
-    gdouble wshed_dropsize;
-    gboolean prefilter;
-    gboolean below;
-    gint internal_i;
-    GwyDataField *min;
-    GwyDataField *water;
-    GwyDataField *mark_dfield;
-} GwyWatershedState;
-
-typedef gboolean (*ErodeFunc)(guint *grain,
-                              gint width, gint height,
-                              guint id,
-                              const PixelQueue *inqueue,
-                              PixelQueue *outqueue);
-
-static guint    simple_dist_trans            (gint *grain,
-                                              guint width,
-                                              guint height,
-                                              gboolean from_border,
-                                              GwyDistanceTransformType dtype,
-                                              PixelQueue *inqueue,
-                                              PixelQueue *outqueue);
 static gdouble  class_weight                 (GwyDataLine *hist,
                                               gint t,
                                               gint flag);
@@ -121,24 +44,6 @@ static gdouble  class_mean                   (GwyDataField *dfield,
                                               GwyDataLine *hist,
                                               gint t,
                                               gint flag);
-static gboolean step_by_one                  (GwyDataField *data_field,
-                                              gint *rcol,
-                                              gint *rrow);
-static void     drop_step                    (GwyDataField *data_field,
-                                              GwyDataField *water_field,
-                                              gdouble dropsize);
-static void     drop_minima                  (GwyDataField *water_field,
-                                              GwyDataField *min_field,
-                                              gint threshval);
-static void     process_mask                 (GwyDataField *grain_field,
-                                              gint col,
-                                              gint row);
-static void     wdrop_step                   (GwyDataField *data_field,
-                                              GwyDataField *min_field,
-                                              GwyDataField *water_field,
-                                              GwyDataField *grain_field,
-                                              gdouble dropsize);
-static void     mark_grain_boundaries        (GwyDataField *grain_field);
 static gint*    gwy_data_field_fill_grain    (GwyDataField *data_field,
                                               gint col,
                                               gint row,
@@ -152,26 +57,6 @@ static gint     gwy_data_field_fill_one_grain(gint xres,
                                               gint grain_no,
                                               gint *listv,
                                               gint *listh);
-static void     waterpour_sort               (const gdouble *d,
-                                              gint *idx,
-                                              gint n);
-
-enum { NDIRECTIONS = 12 };
-
-static const gdouble shift_directions[NDIRECTIONS*2] = {
-    1.0, 0.0,
-    0.9914448613738104, 0.1305261922200516,
-    0.9659258262890683, 0.2588190451025207,
-    0.9238795325112867, 0.3826834323650898,
-    0.8660254037844387, 0.5,
-    0.7933533402912352, 0.6087614290087207,
-    0.7071067811865476, 0.7071067811865475,
-    0.6087614290087207, 0.7933533402912352,
-    0.5,                0.8660254037844386,
-    0.3826834323650898, 0.9238795325112867,
-    0.2588190451025207, 0.9659258262890683,
-    0.1305261922200517, 0.9914448613738104,
-};
 
 /**
  * gwy_data_field_grains_mark_height:
@@ -432,228 +317,6 @@ class_mean(GwyDataField *dfield,
 }
 
 /**
- * gwy_data_field_grains_mark_watershed:
- * @data_field: Data to be used for marking.
- * @grain_field: Result of marking (mask).
- * @locate_steps: Locating algorithm steps.
- * @locate_thresh: Locating algorithm threshold.
- * @locate_dropsize: Locating drop size.
- * @wshed_steps: Watershed steps.
- * @wshed_dropsize: Watershed drop size.
- * @prefilter: Use prefiltering.
- * @below: If %TRUE, valleys are marked, otherwise mountains are marked.
- *
- * Performs watershed algorithm.
- **/
-void
-gwy_data_field_grains_mark_watershed(GwyDataField *data_field,
-                                     GwyDataField *grain_field,
-                                     gint locate_steps,
-                                     gint locate_thresh,
-                                     gdouble locate_dropsize,
-                                     gint wshed_steps,
-                                     gdouble wshed_dropsize,
-                                     gboolean prefilter,
-                                     gboolean below)
-{
-    GwyDataField *min, *water, *mark_dfield;
-    gint xres, yres, i;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(GWY_IS_DATA_FIELD(grain_field));
-
-    xres = data_field->xres;
-    yres = data_field->yres;
-
-    min = gwy_data_field_new_alike(data_field, TRUE);
-    water = gwy_data_field_new_alike(data_field, TRUE);
-    mark_dfield = gwy_data_field_duplicate(data_field);
-    if (below)
-        gwy_data_field_multiply(mark_dfield, -1.0);
-    if (prefilter)
-        gwy_data_field_filter_median(mark_dfield, 6);
-
-    gwy_data_field_resample(grain_field, xres, yres, GWY_INTERPOLATION_NONE);
-    gwy_data_field_clear(grain_field);
-
-    /* odrop */
-    for (i = 0; i < locate_steps; i++)
-        drop_step(mark_dfield, water, locate_dropsize);
-    drop_minima(water, min, locate_thresh);
-
-    /* owatershed */
-    gwy_data_field_copy(data_field, mark_dfield, FALSE);
-    if (below)
-        gwy_data_field_multiply(mark_dfield, -1.0);
-    for (i = 0; i < wshed_steps; i++)
-        wdrop_step(mark_dfield, min, water, grain_field, wshed_dropsize);
-
-    mark_grain_boundaries(grain_field);
-
-    g_object_unref(min);
-    g_object_unref(water);
-    g_object_unref(mark_dfield);
-    gwy_data_field_invalidate(grain_field);
-}
-
-/**
- * gwy_data_field_grains_watershed_init:
- * @data_field: Data to be used for marking.
- * @grain_field: Result of marking (mask).
- * @locate_steps: Locating algorithm steps.
- * @locate_thresh: Locating algorithm threshold.
- * @locate_dropsize: Locating drop size.
- * @wshed_steps: Watershed steps.
- * @wshed_dropsize: Watershed drop size.
- * @prefilter: Use prefiltering.
- * @below: If %TRUE, valleys are marked, otherwise mountains are marked.
- *
- * Initializes the watershed algorithm.
- *
- * This iterator reports its state as #GwyWatershedStateType.
- *
- * Returns: A new watershed iterator.
- **/
-GwyComputationState*
-gwy_data_field_grains_watershed_init(GwyDataField *data_field,
-                                     GwyDataField *grain_field,
-                                     gint locate_steps,
-                                     gint locate_thresh,
-                                     gdouble locate_dropsize,
-                                     gint wshed_steps,
-                                     gdouble wshed_dropsize,
-                                     gboolean prefilter,
-                                     gboolean below)
-{
-    GwyWatershedState *state;
-
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), NULL);
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(grain_field), NULL);
-
-    state = g_new0(GwyWatershedState, 1);
-
-    state->cs.state = GWY_WATERSHED_STATE_INIT;
-    state->cs.fraction = 0.0;
-    state->data_field = g_object_ref(data_field);
-    state->grain_field = g_object_ref(grain_field);
-    state->locate_steps = locate_steps;
-    state->locate_thresh = locate_thresh;
-    state->locate_dropsize = locate_dropsize;
-    state->wshed_steps = wshed_steps;
-    state->wshed_dropsize = wshed_dropsize;
-    state->prefilter = prefilter;
-    state->below = below;
-    state->internal_i = 0;
-
-    return (GwyComputationState*)state;
-}
-
-/**
- * gwy_data_field_grains_watershed_iteration:
- * @state: Watershed iterator.
- *
- * Performs one iteration of the watershed algorithm.
- *
- * Fields @state and progress @fraction of watershed state are updated
- * (fraction is calculated for each phase individually).  Once @state
- * becomes %GWY_WATERSHED_STATE_FINISHED, the calculation is finised.
- *
- * A watershed iterator can be created with
- * gwy_data_field_grains_watershed_init().  When iteration ends, either
- * by finishing or being aborted, gwy_data_field_grains_watershed_finalize()
- * must be called to release allocated resources.
- **/
-void
-gwy_data_field_grains_watershed_iteration(GwyComputationState *cstate)
-{
-    GwyWatershedState *state = (GwyWatershedState*)cstate;
-
-    if (state->cs.state == GWY_WATERSHED_STATE_INIT) {
-        state->min = gwy_data_field_new_alike(state->data_field, TRUE);
-        state->water = gwy_data_field_new_alike(state->data_field, TRUE);
-        state->mark_dfield = gwy_data_field_duplicate(state->data_field);
-        if (state->below)
-            gwy_data_field_multiply(state->mark_dfield, -1.0);
-        if (state->prefilter)
-            gwy_data_field_filter_median(state->mark_dfield, 6);
-
-        gwy_data_field_resample(state->grain_field,
-                                state->data_field->xres,
-                                state->data_field->yres,
-                                GWY_INTERPOLATION_NONE);
-        gwy_data_field_clear(state->grain_field);
-
-        state->cs.state = GWY_WATERSHED_STATE_LOCATE;
-        state->internal_i = 0;
-        state->cs.fraction = 0.0;
-    }
-    else if (state->cs.state == GWY_WATERSHED_STATE_LOCATE) {
-        if (state->internal_i < state->locate_steps) {
-            drop_step(state->mark_dfield, state->water, state->locate_dropsize);
-            state->internal_i += 1;
-            state->cs.fraction = (gdouble)state->internal_i/state->locate_steps;
-        }
-        else {
-            state->cs.state = GWY_WATERSHED_STATE_MIN;
-            state->internal_i = 0;
-            state->cs.fraction = 0.0;
-        }
-    }
-    else if (state->cs.state == GWY_WATERSHED_STATE_MIN) {
-        drop_minima(state->water, state->min, state->locate_thresh);
-        state->cs.state = GWY_WATERSHED_STATE_WATERSHED;
-        state->internal_i = 0;
-        state->cs.fraction = 0.0;
-    }
-    else if (state->cs.state == GWY_WATERSHED_STATE_WATERSHED) {
-        if (state->internal_i == 0) {
-            gwy_data_field_copy(state->data_field, state->mark_dfield, FALSE);
-            if (state->below)
-                gwy_data_field_multiply(state->mark_dfield, -1.0);
-        }
-        if (state->internal_i < state->wshed_steps) {
-            wdrop_step(state->mark_dfield, state->min, state->water,
-                       state->grain_field, state->wshed_dropsize);
-            state->internal_i += 1;
-            state->cs.fraction = (gdouble)state->internal_i/state->wshed_steps;
-        }
-        else {
-            state->cs.state = GWY_WATERSHED_STATE_MARK;
-            state->internal_i = 0;
-            state->cs.fraction = 0.0;
-        }
-    }
-    else if (state->cs.state == GWY_WATERSHED_STATE_MARK) {
-        mark_grain_boundaries(state->grain_field);
-        state->cs.state = GWY_WATERSHED_STATE_FINISHED;
-        state->cs.fraction = 1.0;
-    }
-    else if (state->cs.state == GWY_WATERSHED_STATE_FINISHED)
-        return;
-
-    gwy_data_field_invalidate(state->grain_field);
-}
-
-/**
- * gwy_data_field_grains_watershed_finalize:
- * @state: Watershed iterator.
- *
- * Destroys a watershed iterator, freeing all resources.
- **/
-void
-gwy_data_field_grains_watershed_finalize(GwyComputationState *cstate)
-{
-    GwyWatershedState *state = (GwyWatershedState*)cstate;
-
-    GWY_OBJECT_UNREF(state->min);
-    GWY_OBJECT_UNREF(state->water);
-    GWY_OBJECT_UNREF(state->mark_dfield);
-    GWY_OBJECT_UNREF(state->data_field);
-    GWY_OBJECT_UNREF(state->grain_field);
-    g_free(state);
-}
-
-/**
  * gwy_data_field_grains_remove_grain:
  * @grain_field: Field of marked grains (mask).
  * @col: Column inside a grain.
@@ -937,2618 +600,169 @@ gwy_data_field_grains_remove_touching_border(GwyDataField *grain_field)
 }
 
 /**
- * gwy_data_field_grains_get_distribution:
- * @data_field: Data field used for marking.  For some quantities its values
- *              are not used, but units and physical dimensions are always
- *              taken from it.
- * @grain_field: Data field (mask) of marked grains.  Note if you pass
- *               non-%NULL @grains all grain information is taken from it and
- *               @grain_field can be even %NULL then.
- * @distribution: Data line to store grain distribution to.
- * @grains: Grain numbers filled with gwy_data_field_number_grains() if you
- *          have it, or %NULL (the function then finds grain numbers itself
- *          which is not efficient for repeated use on the same grain field).
- * @ngrains: The number of grains as returned by
- *           gwy_data_field_number_grains().  Ignored in @grains is %NULL.
- * @quantity: The quantity to calculate.
- * @nstats: The number of samples to take on the distribution function.  If
- *          nonpositive, a suitable resolution is determined automatically.
- *
- * Computes distribution of requested grain characteristics.
- *
- * Puts number of grains vs. grain value data into @distribution, units, scales
- * and offsets of @distribution are updated accordingly.
+ * gwy_data_field_grains_add:
+ * @grain_field: Field of marked grains (mask).
+ * @add_field: Field of marked grains (mask) to be added.
  *
- * Note the @i-th bin is [@i*@dx+ at off,(@i+1)*@dx+ at off] so the central value
- * you probably want to use for plotting is (@i+0.5)*@dx+ at off (where @dx is
- * the @distribution data line pixel size, @off is its offset).
+ * Adds @add_field grains to @grain_field.
  *
- * Returns: A data line with the distribution: @distribution itself if it was
- *          not %NULL, otherwise a newly created #GwyDataLine caller must
- *          destroy.  If there are no grains, %NULL is returned and
- *          @distribution is not changed.
+ * Note: This function is equivalent to
+ * |[
+ * gwy_data_field_max_of_fields(grain_field, grain_field, add_field);
+ * ]|
  **/
-GwyDataLine*
-gwy_data_field_grains_get_distribution(GwyDataField *data_field,
-                                       GwyDataField *grain_field,
-                                       GwyDataLine *distribution,
-                                       gint ngrains,
-                                       const gint *grains,
-                                       GwyGrainQuantity quantity,
-                                       gint nstats)
-{
-    GwyDataLine *values;
-    gint *mygrains = NULL;
-
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), FALSE);
-    g_return_val_if_fail(grains || GWY_IS_DATA_FIELD(grain_field), FALSE);
-    g_return_val_if_fail(!grain_field
-                         || (grain_field->xres == data_field->xres
-                             && grain_field->yres == data_field->yres), FALSE);
-    g_return_val_if_fail(!distribution || GWY_IS_DATA_LINE(distribution),
-                         FALSE);
-
-    /* Calculate raw statistics */
-    if (!grains) {
-        grains = mygrains = g_new0(gint, grain_field->xres*grain_field->yres);
-        ngrains = gwy_data_field_number_grains(grain_field, mygrains);
-    }
-    if (!ngrains) {
-        g_free(mygrains);
-        return NULL;
-    }
-
-    values = gwy_data_line_new(ngrains + 1, 1.0, FALSE);
-    gwy_data_field_grains_get_values(data_field, values->data,
-                                     ngrains, grains, quantity);
-    g_free(mygrains);
-
-    values->res--;
-    values->data[0] = values->data[values->res];
-
-    if (!distribution)
-        distribution = gwy_data_line_new(1, 1.0, FALSE);
-
-    gwy_data_line_distribution(values, distribution, 0.0, 0.0, FALSE, nstats);
-
-    g_object_unref(values);
-
-    return distribution;
-}
-
-/* See stats.c for description, this function calculates twice `contribution
- * of one corner' (the twice is to move multiplications from inner loops) */
-static inline gdouble
-square_area2w_1c(gdouble z1, gdouble z2, gdouble z4, gdouble c,
-                 gdouble x, gdouble y)
+void
+gwy_data_field_grains_add(GwyDataField *grain_field, GwyDataField *add_field)
 {
-    return sqrt(1.0 + (z1 - z2)*(z1 - z2)/x + (z1 + z2 - c)*(z1 + z2 - c)/y)
-            + sqrt(1.0 + (z1 - z4)*(z1 - z4)/y + (z1 + z4 - c)*(z1 + z4 - c)/x);
+    gwy_data_field_max_of_fields(grain_field, grain_field, add_field);
 }
 
 /**
- * find_grain_convex_hull:
- * @xres: The number of columns in @grains.
- * @yres: The number of rows in @grains.
- * @grains: Grain numbers filled with gwy_data_field_number_grains().
- * @pos: Position of the top-left vertex of grain's convex hull.
- * @vertices: Array to fill with vertices.
- *
- * Finds vertices of a grain's convex hull.
- *
- * The grain is identified by @pos which must lie in a grain.
+ * gwy_data_field_grains_intersect:
+ * @grain_field: Field of marked grains (mask).
+ * @intersect_field: Field of marked grains (mask).
  *
- * The positions are returned as indices to vertex grid.  NB: The size of the
- * grid is (@xres + 1)*(@yres + 1), not @xres*@yres.
+ * Performs intersection betweet two grain fields,
+ * result is stored in @grain_field.
  *
- * The method is a bit naive, some atan2() calculations could be easily saved.
+ * Note: This function is equivalent to
+ * |[
+ * gwy_data_field_min_of_fields(grain_field, grain_field, intersect_field);
+ * ]|
  **/
-static void
-find_grain_convex_hull(gint xres, gint yres,
-                       const gint *grains,
-                       gint pos,
-                       GArray *vertices)
+void
+gwy_data_field_grains_intersect(GwyDataField *grain_field,
+                                GwyDataField *intersect_field)
 {
-    enum { RIGHT = 0, DOWN, LEFT, UP } newdir, dir;
-    const GridPoint *cur, *mid, *prev;
-    GridPoint v;
-    gdouble phi, phim;
-    gint initpos, gno;
-
-    g_return_if_fail(grains[pos]);
-
-    g_array_set_size(vertices, 0);
-    initpos = pos;
-    gno = grains[pos];
-    v.i = pos/xres;
-    v.j = pos % xres;
-    g_array_append_val(vertices, v);
-    newdir = RIGHT;
-
-    do {
-        dir = newdir;
-        switch (dir) {
-            case RIGHT:
-            v.j++;
-            if (v.i > 0 && v.j < xres && grains[(v.i-1)*xres + v.j] == gno)
-                newdir = UP;
-            else if (v.j < xres && grains[v.i*xres + v.j] == gno)
-                newdir = RIGHT;
-            else
-                newdir = DOWN;
-            break;
-
-            case DOWN:
-            v.i++;
-            if (v.j < xres && v.i < yres && grains[v.i*xres + v.j] == gno)
-                newdir = RIGHT;
-            else if (v.i < yres && grains[v.i*xres + v.j-1] == gno)
-                newdir = DOWN;
-            else
-                newdir = LEFT;
-            break;
-
-            case LEFT:
-            v.j--;
-            if (v.i < yres && v.j > 0 && grains[v.i*xres + v.j-1] == gno)
-                newdir = DOWN;
-            else if (v.j > 0 && grains[(v.i-1)*xres + v.j-1] == gno)
-                newdir = LEFT;
-            else
-                newdir = UP;
-            break;
-
-            case UP:
-            v.i--;
-            if (v.j > 0 && v.i > 0 && grains[(v.i-1)*xres + v.j-1] == gno)
-                newdir = LEFT;
-            else if (v.i > 0 && grains[(v.i-1)*xres + v.j] == gno)
-                newdir = UP;
-            else
-                newdir = RIGHT;
-            break;
-
-            default:
-            g_assert_not_reached();
-            break;
-        }
-
-        /* When we turn right, the previous point is a potential vertex, and
-         * it can also supersed previous vertices. */
-        if (newdir == (dir + 1) % 4) {
-            g_array_append_val(vertices, v);
-            while (vertices->len > 2) {
-                cur = &g_array_index(vertices, GridPoint, vertices->len-1);
-                mid = &g_array_index(vertices, GridPoint, vertices->len-2);
-                prev = &g_array_index(vertices, GridPoint, vertices->len-3);
-                phi = atan2(cur->i - mid->i, cur->j - mid->j);
-                phim = atan2(mid->i - prev->i, mid->j - prev->j);
-                phi = fmod(phi - phim + 4.0*G_PI, 2.0*G_PI);
-                /* This should be fairly save as (a) not real harm is done
-                 * when we have an occasional extra vertex (b) the greatest
-                 * possible angle is G_PI/2.0 */
-                if (phi > 1e-12 && phi < G_PI)
-                    break;
-
-                /* Get rid of mid, it is in a locally concave part */
-                g_array_index(vertices, GridPoint, vertices->len-2) = *cur;
-                g_array_set_size(vertices, vertices->len-1);
-            }
-        }
-    } while (v.i*xres + v.j != initpos);
-
-    /* The last point is duplicated first point */
-    g_array_set_size(vertices, vertices->len-1);
+    gwy_data_field_min_of_fields(grain_field, grain_field, intersect_field);
 }
 
 /**
- * grain_maximum_bound:
- * @vertices: Convex hull vertex list.
- * @qx: Scale (pixel size) in x-direction.
- * @qy: Scale (pixel size) in y-direction.
- * @vx: Location to store vector x component to.
- * @vy: Location to store vector y component to.
+ * gwy_data_field_grains_invert:
+ * @grain_field: Data field (mask) of marked grains.
  *
- * Given a list of integer convex hull vertices, return the vector between
- * the two most distance vertices.
+ * Inverts a data field representing a mask.
+ *
+ * All non-positive values are transformed to 1.0.  All positive values are
+ * transformed to 0.0.
  *
- * FIXME: This is a blatantly naive O(n^2) algorithm.
+ * Since: 2.43
  **/
-static void
-grain_maximum_bound(GArray *vertices,
-                    gdouble qx, gdouble qy,
-                    gdouble *vx, gdouble *vy)
+void
+gwy_data_field_grains_invert(GwyDataField *grain_field)
 {
-    const GridPoint *a, *x;
-    gdouble vm, v, dx, dy;
-    guint g1, g2;
-
-    vm = -G_MAXDOUBLE;
-    for (g1 = 0; g1 < vertices->len; g1++) {
-        a = &g_array_index(vertices, GridPoint, g1);
-        for (g2 = g1 + 1; g2 < vertices->len; g2++) {
-            x = &g_array_index(vertices, GridPoint, g2);
-            dx = qx*(x->j - a->j);
-            dy = qy*(x->i - a->i);
-            v = dx*dx + dy*dy;
-            if (v > vm) {
-                vm = v;
-                *vx = dx;
-                *vy = dy;
-            }
-        }
+    guint xres, yres, k;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(grain_field));
+    xres = grain_field->xres;
+    yres = grain_field->yres;
+    for (k = 0; k < xres*yres; k++) {
+        if (grain_field->data[k] > 0.0)
+            grain_field->data[k] = 0.0;
+        else
+            grain_field->data[k] = 1.0;
     }
 }
 
 /**
- * grain_minimum_bound:
- * @vertices: Convex hull vertex list.
- * @qx: Scale (pixel size) in x-direction.
- * @qy: Scale (pixel size) in y-direction.
- * @vx: Location to store vector x component to.
- * @vy: Location to store vector y component to.
+ * gwy_data_field_grains_autocrop:
+ * @mask_field: Data field representing a mask.
+ * @symmetrically: %TRUE to remove borders symmetrically, i.e the same number
+ *                 of pixels from left and right, and also top and bottom.
+ *                 %FALSE to remove as many empty rows and columns as possible.
+ * @left: Location to store how many column were removed from the left, or
+ *        %NULL.
+ * @right: Location to store how many column were removed from the right, or
+ *         %NULL.
+ * @up: Location to store how many row were removed from the top, or %NULL.
+ * @down: Location to store how many row were removed from the bottom, or
+ *        %NULL.
+ *
+ * Removes empty border rows and columns from a data field representing a mask.
+ *
+ * If there are border rows and columns filled completely with non-positive
+ * values the size of the data field is reduced, removing these rows.  The
+ * parameter @symmetrically controls whether the size reduction is maximum
+ * possible or symmetrical.
+ *
+ * When there is no positive value in the field the field size is reduced to
+ * the smallest possible.  This means 1x1 for @symmetrical being %FALSE and
+ * even original dimensions to 2 for @symmetrical being %TRUE.
  *
- * Given a list of integer convex hull vertices, return the vector
- * corresponding to the minimum linear projection.
+ * Returns: %TRUE if the field size was reduced at all.  Detailed information
+ *          about the reduction can be obtained from @left, @right, @up and
+ *          @down.
  *
- * FIXME: This is a blatantly naive O(n^2) algorithm.
+ * Since: 2.43
  **/
-static void
-grain_minimum_bound(GArray *vertices,
-                    gdouble qx, gdouble qy,
-                    gdouble *vx, gdouble *vy)
+gboolean
+gwy_data_field_grains_autocrop(GwyDataField *mask_field,
+                               gboolean symmetrically,
+                               guint *left,
+                               guint *right,
+                               guint *up,
+                               guint *down)
 {
-    const GridPoint *a, *b, *x;
-    gdouble vm, vm1, v, s, b2, bx, by, dx, dy, vx1, vy1;
-    guint g1, g1p, g2;
-
-    g_return_if_fail(vertices->len >= 3);
-
-    vm = G_MAXDOUBLE;
-    for (g1 = 0; g1 < vertices->len; g1++) {
-        a = &g_array_index(vertices, GridPoint, g1);
-        g1p = (g1 + 1) % vertices->len;
-        b = &g_array_index(vertices, GridPoint, g1p);
-        bx = qx*(b->j - a->j);
-        by = qy*(b->i - a->i);
-        b2 = bx*bx + by*by;
-        vm1 = vx1 = vy1 = -G_MAXDOUBLE;
-        for (g2 = 0; g2 < vertices->len; g2++) {
-            x = &g_array_index(vertices, GridPoint, g2);
-            dx = qx*(x->j - a->j);
-            dy = qy*(x->i - a->i);
-            s = (dx*bx + dy*by)/b2;
-            dx -= s*bx;
-            dy -= s*by;
-            v = dx*dx + dy*dy;
-            if (v > vm1) {
-                vm1 = v;
-                vx1 = dx;
-                vy1 = dy;
+    gint xres, yres, i, j, firstcol, firstrow, lastcol, lastrow;
+    const gdouble *d;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(mask_field), FALSE);
+    xres = mask_field->xres;
+    yres = mask_field->yres;
+    firstcol = xres;
+    firstrow = yres;
+    lastcol = lastrow = -1;
+    d = mask_field->data;
+    for (i = 0; i < yres; i++) {
+        for (j = 0; j < xres; j++, d++) {
+            if (*d > 0.0) {
+                if (G_UNLIKELY(i < firstrow))
+                    firstrow = i;
+                if (G_UNLIKELY(j < firstcol))
+                    firstcol = j;
+                if (G_UNLIKELY(i > lastrow))
+                    lastrow = i;
+                if (G_UNLIKELY(j > lastcol))
+                    lastcol = j;
             }
         }
-        if (vm1 < vm) {
-            vm = vm1;
-            *vx = vx1;
-            *vy = vy1;
-        }
     }
-}
-
-static gdouble
-grain_convex_hull_area(GArray *vertices, gdouble dx, gdouble dy)
-{
-    const GridPoint *a = &g_array_index(vertices, GridPoint, 0),
-                    *b = &g_array_index(vertices, GridPoint, 1),
-                    *c = &g_array_index(vertices, GridPoint, 2);
-    gdouble s = 0.0;
-    guint i;
-
-    g_return_val_if_fail(vertices->len >= 4, 0.0);
-
-    for (i = 2; i < vertices->len; i++) {
-        gdouble bx = b->j - a->j, by = b->i - a->i,
-                cx = c->j - a->j, cy = c->i - a->i;
-        s += 0.5*(bx*cy - by*cx);
-        b = c;
-        c++;
+    gwy_debug("first (%d,%d) last (%d,%d)",
+              firstcol, firstrow, lastcol, lastrow);
+    if (firstcol > lastcol) {
+        g_assert(firstrow > lastrow);
+        /* Anticipate the reduction to 2 for even-sized dimensions. */
+        lastcol = (xres - 1)/2;
+        firstcol = xres - lastcol;
+        lastrow = (yres - 1)/2;
+        firstrow = yres - lastrow;
     }
-
-    return dx*dy*s;
-}
-
-static void
-grain_convex_hull_centre(GArray *vertices,
-                         gdouble dx, gdouble dy,
-                         gdouble *centrex, gdouble *centrey)
-{
-    const GridPoint *a = &g_array_index(vertices, GridPoint, 0),
-                    *b = &g_array_index(vertices, GridPoint, 1),
-                    *c = &g_array_index(vertices, GridPoint, 2);
-    gdouble s = 0.0, xc = 0.0, yc = 0.0;
-    guint i;
-
-    g_return_if_fail(vertices->len >= 4);
-
-    for (i = 2; i < vertices->len; i++) {
-        gdouble bx = b->j - a->j, by = b->i - a->i,
-                cx = c->j - a->j, cy = c->i - a->i;
-        gdouble s1 = bx*cy - by*cx;
-        xc += s1*(a->j + b->j + c->j);
-        yc += s1*(a->i + b->i + c->i);
-        s += s1;
-        b = c;
-        c++;
+    if (symmetrically) {
+        firstcol = MIN(firstcol, xres-1 - lastcol);
+        lastcol = xres-1 - firstcol;
+        firstrow = MIN(firstrow, yres-1 - lastrow);
+        lastrow = yres-1 - firstrow;
     }
-    *centrex = xc*dx/(3.0*s);
-    *centrey = yc*dy/(3.0*s);
-}
-
-static gdouble
-minimize_circle_radius(InscribedDisc *circle, GArray *vertices,
-                       gdouble dx, gdouble dy)
-{
-    const GridPoint *v = (const GridPoint*)vertices->data;
-    gdouble x = circle->x, y = circle->y, r2best = 0.0;
-    guint n = vertices->len;
+    lastcol++;
+    lastrow++;
 
-    while (n--) {
-        gdouble deltax = dx*v->j - x, deltay = dy*v->i - y;
-        gdouble r2 = deltax*deltax + deltay*deltay;
+    if (left)
+        *left = firstcol;
+    if (right)
+        *right = xres - lastcol;
+    if (up)
+        *up = firstrow;
+    if (down)
+        *down = yres - lastrow;
 
-        if (r2 > r2best)
-            r2best = r2;
+    gwy_debug("%dx%d at (%d,%d) of %dx%d",
+              lastcol-firstcol, lastrow-firstrow, firstcol, firstrow,
+              xres, yres);
+    if (firstcol == 0 && firstrow == 0 && lastcol == xres && lastrow == yres)
+        return FALSE;
 
-        v++;
-    }
-
-    return r2best;
-}
-
-static void
-improve_circumscribed_circle(InscribedDisc *circle, GArray *vertices,
-                             gdouble dx, gdouble dy)
-{
-    gdouble eps = 1.0, improvement, qgeom = sqrt(dx*dy);
-
-    do {
-        InscribedDisc best = *circle;
-        guint i;
-
-        improvement = 0.0;
-        for (i = 0; i < NDIRECTIONS; i++) {
-            InscribedDisc cand;
-            gdouble sx = eps*qgeom*shift_directions[2*i],
-                    sy = eps*qgeom*shift_directions[2*i + 1];
-
-            cand.size = circle->size;
-
-            cand.x = circle->x + sx;
-            cand.y = circle->y + sy;
-            if ((cand.R2 = minimize_circle_radius(&cand, vertices, dx, dy))
-                < best.R2)
-                best = cand;
-
-            cand.x = circle->x - sy;
-            cand.y = circle->y + sx;
-            if ((cand.R2 = minimize_circle_radius(&cand, vertices, dx, dy))
-                < best.R2)
-                best = cand;
-
-            cand.x = circle->x - sx;
-            cand.y = circle->y - sy;
-            if ((cand.R2 = minimize_circle_radius(&cand, vertices, dx, dy))
-                < best.R2)
-                best = cand;
-
-            cand.x = circle->x + sy;
-            cand.y = circle->y - sx;
-            if ((cand.R2 = minimize_circle_radius(&cand, vertices, dx, dy))
-                < best.R2)
-                best = cand;
-        }
-        if (best.R2 < circle->R2) {
-            improvement = (best.R2 - circle->R2)/(dx*dy);
-            *circle = best;
-        }
-        else {
-            eps *= 0.5;
-        }
-    } while (eps > 1e-3 || improvement > 1e-3);
-}
-
-static inline void
-pixel_queue_add(PixelQueue *queue,
-                gint i, gint j)
-{
-    if (G_UNLIKELY(queue->len == queue->size)) {
-        queue->size = MAX(2*queue->size, 16);
-        queue->points = g_renew(GridPoint, queue->points, queue->size);
-    }
-
-    queue->points[queue->len].i = i;
-    queue->points[queue->len].j = j;
-    queue->len++;
-}
-
-static guint*
-grain_maybe_realloc(guint *grain, guint w, guint h, guint *grainsize)
-{
-    if (w*h > *grainsize) {
-        g_free(grain);
-        *grainsize = w*h;
-        grain = g_new(guint, *grainsize);
-    }
-    return grain;
-}
-
-static guint*
-extract_upsampled_square_pixel_grain(const guint *grains, guint xres, guint gno,
-                                     const gint *bbox,
-                                     guint *grain, guint *grainsize,
-                                     guint *widthup, guint *heightup,
-                                     gdouble dx, gdouble dy)
-{
-    gint col = bbox[0], row = bbox[1], w = bbox[2], h = bbox[3];
-    guint w2 = 2*w, h2 = 2*h;
-    guint i, j;
-
-    /* Do not bother with nearly square pixels and upsample also 2×2. */
-    if (fabs(log(dy/dx)) < 0.05) {
-        grain = grain_maybe_realloc(grain, w2, h2, grainsize);
-        for (i = 0; i < h; i++) {
-            guint k2 = w2*(2*i);
-            guint k = (i + row)*xres + col;
-            for (j = 0; j < w; j++, k++, k2 += 2) {
-                guint v = (grains[k] == gno) ? G_MAXUINT : 0;
-                grain[k2] = v;
-                grain[k2+1] = v;
-                grain[k2 + w2] = v;
-                grain[k2 + w2+1] = v;
-            }
-        }
-    }
-    else if (dy < dx) {
-        /* Horizontal upsampling, precalculate index map to use in each row. */
-        guint *indices;
-        w2 = GWY_ROUND(dx/dy*w2);
-        grain = grain_maybe_realloc(grain, w2, h2, grainsize);
-        indices = (guint*)g_slice_alloc(w2*sizeof(guint));
-        for (j = 0; j < w2; j++) {
-            gint jj = (gint)floor(0.5*j*dy/dx);
-            indices[j] = CLAMP(jj, 0, (gint)w-1);
-        }
-        for (i = 0; i < h; i++) {
-            guint k = (i + row)*xres + col;
-            guint k2 = w2*(2*i);
-            for (j = 0; j < w2; j++) {
-                guint v = (grains[k + indices[j]] == gno) ? G_MAXUINT : 0;
-                grain[k2 + j] = v;
-                grain[k2 + w2 + j] = v;
-            }
-        }
-        g_slice_free1(w2*sizeof(guint), indices);
-    }
-    else {
-        /* Vertical upsampling, rows are 2× scaled copies but uneven. */
-        h2 = GWY_ROUND(dy/dx*h2);
-        grain = grain_maybe_realloc(grain, w2, h2, grainsize);
-        for (i = 0; i < h2; i++) {
-            guint k, k2 = i*w2;
-            gint ii = (gint)floor(0.5*i*dx/dy);
-            ii = CLAMP(ii, 0, (gint)h-1);
-            k = (ii + row)*xres + col;
-            for (j = 0; j < w; j++) {
-                guint v = (grains[k + j] == gno) ? G_MAXUINT : 0;
-                grain[k2 + 2*j] = v;
-                grain[k2 + 2*j + 1] = v;
-            }
-        }
-    }
-
-    *widthup = w2;
-    *heightup = h2;
-    return grain;
-}
-
-/* Init @queue with all Von Neumann-neighbourhood boundary pixels. */
-static void
-init_erosion_4(guint *grain,
-               guint width, guint height,
-               gboolean from_border,
-               PixelQueue *queue)
-{
-    guint ifrom = from_border ? 0 : 1;
-    guint iend = from_border ? height : height-1;
-    guint jfrom = from_border ? 0 : 1;
-    guint jend = from_border ? width : width-1;
-    guint i, j, k;
-
-    queue->len = 0;
-    for (i = ifrom; i < iend; i++) {
-        k = i*width + jfrom;
-        for (j = jfrom; j < jend; j++, k++) {
-            if (!grain[k])
-                continue;
-
-            if (!i || !j || j == width-1 || i == height-1
-                || !grain[k - width] || !grain[k - 1]
-                || !grain[k + 1] || !grain[k + width]) {
-                grain[k] = 1;
-                pixel_queue_add(queue, i, j);
-            }
-        }
-    }
-}
-
-/* Init @queue with all Von Neumann-neighbourhood boundary pixels. */
-static void
-init_erosion_8(guint *grain,
-               gint width, gint height,
-               gboolean from_border,
-               PixelQueue *queue)
-{
-    guint ifrom = from_border ? 0 : 1;
-    guint iend = from_border ? height : height-1;
-    guint jfrom = from_border ? 0 : 1;
-    guint jend = from_border ? width : width-1;
-    guint i, j, k;
-
-    queue->len = 0;
-    for (i = ifrom; i < iend; i++) {
-        k = i*width + jfrom;
-        for (j = jfrom; j < jend; j++, k++) {
-            if (!grain[k])
-                continue;
-
-            if (!i || !j || j == width-1 || i == height-1
-                || !grain[k - width - 1] || !grain[k - width]
-                || !grain[k - width + 1]
-                || !grain[k - 1] || !grain[k + 1]
-                || !grain[k + width - 1] || !grain[k + width]
-                || !grain[k + width + 1]) {
-                grain[k] = 1;
-                pixel_queue_add(queue, i, j);
-            }
-        }
-    }
-}
-
-static gboolean
-erode_4(guint *grain,
-        gint width, gint height,
-        guint id,
-        const PixelQueue *inqueue,
-        PixelQueue *outqueue)
-{
-    const GridPoint *ipt = inqueue->points;
-    guint m;
-
-    outqueue->len = 0;
-    for (m = inqueue->len; m; m--, ipt++) {
-        gint i = ipt->i, j = ipt->j, k = i*width + j;
-
-        if (i && grain[k - width] == G_MAXUINT) {
-            grain[k - width] = id+1;
-            pixel_queue_add(outqueue, i-1, j);
-        }
-        if (j && grain[k - 1] == G_MAXUINT) {
-            grain[k - 1] = id+1;
-            pixel_queue_add(outqueue, i, j-1);
-        }
-        if (j < width-1 && grain[k + 1] == G_MAXUINT) {
-            grain[k + 1] = id+1;
-            pixel_queue_add(outqueue, i, j+1);
-        }
-        if (i < height-1 && grain[k + width] == G_MAXUINT) {
-            grain[k + width] = id+1;
-            pixel_queue_add(outqueue, i+1, j);
-        }
-    }
-
-    return outqueue->len;
-}
-
-static gboolean
-erode_8(guint *grain,
-        gint width, gint height,
-        guint id,
-        const PixelQueue *inqueue,
-        PixelQueue *outqueue)
-{
-    const GridPoint *ipt = inqueue->points;
-    guint m;
-
-    outqueue->len = 0;
-    for (m = inqueue->len; m; m--, ipt++) {
-        gint i = ipt->i, j = ipt->j, k = i*width + j;
-        if (i && j && grain[k - width - 1] == G_MAXUINT) {
-            grain[k - width - 1] = id+1;
-            pixel_queue_add(outqueue, i-1, j-1);
-        }
-        if (i && grain[k - width] == G_MAXUINT) {
-            grain[k - width] = id+1;
-            pixel_queue_add(outqueue, i-1, j);
-        }
-        if (i && j < width-1 && grain[k - width + 1] == G_MAXUINT) {
-            grain[k - width + 1] = id+1;
-            pixel_queue_add(outqueue, i-1, j+1);
-        }
-        if (j && grain[k - 1] == G_MAXUINT) {
-            grain[k - 1] = id+1;
-            pixel_queue_add(outqueue, i, j-1);
-        }
-        if (j < width-1 && grain[k + 1] == G_MAXUINT) {
-            grain[k + 1] = id+1;
-            pixel_queue_add(outqueue, i, j+1);
-        }
-        if (i < height-1 && j && grain[k + width - 1] == G_MAXUINT) {
-            grain[k + width - 1] = id+1;
-            pixel_queue_add(outqueue, i+1, j-1);
-        }
-        if (i < height-1 && grain[k + width] == G_MAXUINT) {
-            grain[k + width] = id+1;
-            pixel_queue_add(outqueue, i+1, j);
-        }
-        if (i < height-1 && j < width-1 && grain[k + width + 1] == G_MAXUINT) {
-            grain[k + width + 1] = id+1;
-            pixel_queue_add(outqueue, i+1, j+1);
-        }
-    }
-
-    return outqueue->len;
-}
-
-static gint
-compare_candidates(gconstpointer a,
-                   gconstpointer b)
-{
-    const InscribedDisc *da = (const InscribedDisc*)a;
-    const InscribedDisc *db = (const InscribedDisc*)b;
-
-    if (da->size > db->size)
-        return -1;
-    if (da->size < db->size)
-        return 1;
-
-    if (da->R2 < db->R2)
-        return -1;
-    if (da->R2 > db->R2)
-        return 1;
-
-    return 0;
-}
-
-static void
-find_disc_centre_candidates(GArray *candidates,
-                            PixelQueue *inqueue,
-                            const guint *grain,
-                            guint width, guint height,
-                            gdouble dx, gdouble dy,
-                            gdouble centrex, gdouble centrey)
-{
-    guint m;
-
-    g_array_set_size(candidates, 0);
-    for (m = 0; m < inqueue->len; m++) {
-        GridPoint *mpt = inqueue->points + m;
-        guint i = mpt->i, j = mpt->j, k = i*width + j, size = 8*grain[k], w;
-        InscribedDisc cand;
-
-        if (i && j && (w = grain[k - width-1]) != G_MAXUINT)
-            size += w;
-        if (i && (w = grain[k - width]) != G_MAXUINT)
-            size += 2*w;
-        if (i && j < width-1 && (w = grain[k - width+1]) != G_MAXUINT)
-            size += w;
-        if (j && (w = grain[k-1]) != G_MAXUINT)
-            size += 2*w;
-        if (j < width-1 && (w = grain[k+1]) != G_MAXUINT)
-            size += 2*w;
-        if (i < height-1 && j && (w = grain[k + width-1]) != G_MAXUINT)
-            size += w;
-        if (i < height-1 && (w = grain[k + width]) != G_MAXUINT)
-            size += 2*w;
-        if (i < height-1 && j < width-1 && (w = grain[k + width+1]) != G_MAXUINT)
-            size += w;
-
-        cand.x = (mpt->j + 0.5)*dx;
-        cand.y = (mpt->i + 0.5)*dy;
-        cand.size = size;
-        /* Use R2 temporarily for distance from the entire grain centre;
-         * this is only for sorting below. */
-        cand.R2 = ((cand.x - centrex)*(cand.x - centrex)
-                   + (cand.y - centrey)*(cand.y - centrey));
-        g_array_append_val(candidates, cand);
-    }
-    g_array_sort(candidates, &compare_candidates);
-}
-
-static inline void
-edge_list_add(EdgeQueue *queue,
-              gdouble xa, gdouble ya,
-              gdouble xb, gdouble yb)
-{
-    if (G_UNLIKELY(queue->len == queue->size)) {
-        queue->size = MAX(2*queue->size, 16);
-        queue->edges = g_renew(Edge, queue->edges, queue->size);
-    }
-
-    queue->edges[queue->len].xa = xa;
-    queue->edges[queue->len].ya = ya;
-    queue->edges[queue->len].xb = xb;
-    queue->edges[queue->len].yb = yb;
-    queue->len++;
-}
-
-static void
-find_all_edges(EdgeQueue *edges,
-               const gint *grains, guint xres,
-               guint gno, const gint *bbox,
-               gdouble dx, gdouble dy)
-{
-    guint col = bbox[0], row = bbox[1], w = bbox[2], h = bbox[3];
-    guint i, j;
-    guint *vertices;
-
-    edges->len = 0;
-
-    vertices = g_slice_alloc((w + 1)*sizeof(guint));
-    for (j = 0; j <= w; j++)
-        vertices[j] = G_MAXUINT;
-
-    for (i = 0; i <= h; i++) {
-        guint k = (i + row)*xres + col;
-        guint vertex = G_MAXUINT;
-
-        for (j = 0; j <= w; j++, k++) {
-            /*
-             * 1 2
-             * 3 4
-             */
-            guint g0 = i && j && grains[k - xres - 1] == gno;
-            guint g1 = i && j < w && grains[k - xres] == gno;
-            guint g2 = i < h && j && grains[k - 1] == gno;
-            guint g3 = i < h && j < w && grains[k] == gno;
-            guint g = g0 | (g1 << 1) | (g2 << 2) | (g3 << 3);
-
-            if (g == 8 || g == 7) {
-                vertex = j;
-                vertices[j] = i;
-            }
-            else if (g == 2 || g == 13) {
-                edge_list_add(edges, dx*j, dy*vertices[j], dx*j, dy*i);
-                vertex = j;
-                vertices[j] = G_MAXUINT;
-            }
-            else if (g == 4 || g == 11) {
-                edge_list_add(edges, dx*vertex, dy*i, dx*j, dy*i);
-                vertex = G_MAXUINT;
-                vertices[j] = i;
-            }
-            else if (g == 1 || g == 14) {
-                edge_list_add(edges, dx*vertex, dy*i, dx*j, dy*i);
-                edge_list_add(edges, dx*j, dy*vertices[j], dx*j, dy*i);
-                vertex = G_MAXUINT;
-                vertices[j] = G_MAXUINT;
-            }
-            else if (g == 6 || g == 9) {
-                edge_list_add(edges, dx*vertex, dy*i, dx*j, dy*i);
-                edge_list_add(edges, dx*j, dy*vertices[j], dx*j, dy*i);
-                vertex = j;
-                vertices[j] = i;
-            }
-        }
-    }
-
-    g_slice_free1((w + 1)*sizeof(guint), vertices);
-}
-
-static gdouble
-maximize_disc_radius(InscribedDisc *disc, Edge *edges, guint n)
-{
-    gdouble x = disc->x, y = disc->y, r2best = HUGE_VAL;
-
-    while (n--) {
-        gdouble rax = edges->xa - x, ray = edges->ya - y,
-                rbx = edges->xb - x, rby = edges->yb - y,
-                deltax = edges->xb - edges->xa, deltay = edges->yb - edges->ya;
-        gdouble ca = -(deltax*rax + deltay*ray),
-                cb = deltax*rbx + deltay*rby;
-
-        if (ca <= 0.0)
-            edges->r2 = rax*rax + ray*ray;
-        else if (cb <= 0.0)
-            edges->r2 = rbx*rbx + rby*rby;
-        else {
-            gdouble tx = cb*rax + ca*rbx, ty = cb*ray + ca*rby, D = ca + cb;
-            edges->r2 = (tx*tx + ty*ty)/(D*D);
-        }
-
-        if (edges->r2 < r2best)
-            r2best = edges->r2;
-        edges++;
-    }
-
-    return r2best;
-}
-
-static guint
-filter_relevant_edges(EdgeQueue *edges, gdouble r2, gdouble eps)
-{
-    Edge *edge = edges->edges, *enear = edges->edges;
-    gdouble limit = sqrt(r2) + 4.0*eps + 0.5;
-    guint i;
-
-    limit *= limit;
-    for (i = edges->len; i; i--, edge++) {
-        if (edge->r2 <= limit) {
-            if (edge != enear)
-                GWY_SWAP(Edge, *edge, *enear);
-            enear++;
-        }
-    }
-
-    return enear - edges->edges;
-}
-
-static void
-improve_inscribed_disc(InscribedDisc *disc, EdgeQueue *edges, guint dist)
-{
-    gdouble eps = 0.5 + 0.25*(dist > 4) + 0.25*(dist > 16), improvement;
-    guint nsuccessiveimprovements = 0;
-
-    do {
-        InscribedDisc best;
-        guint i, nr;
-
-        disc->R2 = maximize_disc_radius(disc, edges->edges, edges->len);
-        eps = MIN(eps, 0.5*sqrt(disc->R2));
-        best = *disc;
-        nr = filter_relevant_edges(edges, best.R2, eps);
-
-        improvement = 0.0;
-        for (i = 0; i < NDIRECTIONS; i++) {
-            InscribedDisc cand;
-            gdouble sx = eps*shift_directions[2*i],
-                    sy = eps*shift_directions[2*i + 1];
-
-            cand.size = disc->size;
-
-            cand.x = disc->x + sx;
-            cand.y = disc->y + sy;
-            if ((cand.R2 = maximize_disc_radius(&cand, edges->edges, nr))
-                > best.R2)
-                best = cand;
-
-            cand.x = disc->x - sy;
-            cand.y = disc->y + sx;
-            if ((cand.R2 = maximize_disc_radius(&cand, edges->edges, nr))
-                > best.R2)
-                best = cand;
-
-            cand.x = disc->x - sx;
-            cand.y = disc->y - sy;
-            if ((cand.R2 = maximize_disc_radius(&cand, edges->edges, nr))
-                > best.R2)
-                best = cand;
-
-            cand.x = disc->x + sy;
-            cand.y = disc->y - sx;
-            if ((cand.R2 = maximize_disc_radius(&cand, edges->edges, nr))
-                > best.R2)
-                best = cand;
-        }
-
-        if (best.R2 > disc->R2) {
-            improvement = sqrt(best.R2) - sqrt(disc->R2);
-            *disc = best;
-            /* This scales up *each* successive improvement after 3 so eps can
-             * grow very quickly. */
-            if (nsuccessiveimprovements++ > 2)
-                eps *= 1.5;
-        }
-        else {
-            eps *= 0.5;
-            nsuccessiveimprovements = 0;
-        }
-    } while (eps > 1e-3 || improvement > 1e-3);
-}
-
-/**
- * gwy_data_field_grains_get_values:
- * @data_field: Data field used for marking.  For some quantities its values
- *              are not used, but its dimensions determine the dimensions of
- *              @grains.
- * @values: Array of size @ngrains+1 to put grain values to.  It can be
- *          %NULL to allocate and return a new array.
- * @grains: Grain numbers filled with gwy_data_field_number_grains().
- * @ngrains: The number of grains as returned by
- *           gwy_data_field_number_grains().
- * @quantity: The quantity to calculate.
- *
- * Calculates characteristics of grains.
- *
- * This is a bit low-level function, see also
- * gwy_data_field_grains_get_distribution().
- *
- * The array @values will be filled with the requested grain value for each
- * individual grain (0th item of @values which does not correspond to any grain
- * will be overwritten with an arbitrary value and should be ignored).
- *
- * The grain numbers serve as indices in @values.  Therefore as long as the
- * same @grains is used, the same position in @values corresponds to the same
- * particular grain.  This enables one for instance to calculate grain sizes
- * and grain heights and then correlate them.
- *
- * Returns: @values itself if it was not %NULL, otherwise a newly allocated
- *          array that caller has to free.
- **/
-gdouble*
-gwy_data_field_grains_get_values(GwyDataField *data_field,
-                                 gdouble *values,
-                                 gint ngrains,
-                                 const gint *grains,
-                                 GwyGrainQuantity quantity)
-{
-    gdouble *allvalues[1];
-
-    if (!values)
-        values = g_new(gdouble, ngrains + 1);
-
-    allvalues[0] = values;
-    gwy_data_field_grains_get_quantities(data_field, allvalues,
-                                         &quantity, 1, ngrains, grains);
-    return values;
-}
-
-static gdouble*
-ensure_buffer(GwyGrainQuantity quantity,
-              gdouble **quantity_data,
-              guint ngrains,
-              gdouble fillvalue,
-              GList **buffers)
-{
-    gdouble *buf, *b;
-    guint gno;
-
-    if (quantity_data[quantity]) {
-        buf = quantity_data[quantity];
-        if (!fillvalue)
-            gwy_clear(buf, ngrains + 1);
-    }
-    else {
-        if (fillvalue)
-            buf = g_new(gdouble, ngrains + 1);
-        else
-            buf = g_new0(gdouble, ngrains + 1);
-        *buffers = g_list_prepend(*buffers, buf);
-    }
-    if (fillvalue) {
-        for (gno = ngrains+1, b = buf; gno; gno--)
-            *(b++) = fillvalue;
-    }
-
-    return buf;
-}
-
-/* Note all coordinates are pixel-wise, not real.  For linear and quadratic,
- * the origin is always the grain centre. */
-static void
-calculate_grain_aux(GwyDataField *data_field,
-                    const gint *grains,
-                    guint ngrains,
-                    gint *sizes, gint *boundpos,
-                    gdouble *min, gdouble *max,
-                    gdouble *xvalue, gdouble *yvalue, gdouble *zvalue,
-                    gdouble *linear, gdouble *quadratic)
-{
-    guint xres, yres, i, j, k, n, gno, nn;
-    gdouble z;
-    const gdouble *d;
-    const gint *g;
-    gdouble *t;
-
-    xres = data_field->xres;
-    yres = data_field->yres;
-    nn = xres*yres;
-
-    if (sizes) {
-        for (k = nn, g = grains; k; k--, g++) {
-            gno = *g;
-            sizes[gno]++;
-        }
-    }
-    if (boundpos) {
-        for (k = 0, g = grains; k < nn; k++, g++) {
-            gno = *g;
-            if (boundpos[gno] == -1)
-                boundpos[gno] = k;
-        }
-    }
-    if (min) {
-        for (k = nn, g = grains, d = data_field->data; k; k--, g++, d++) {
-            gno = *g;
-            z = *d;
-            if (z < min[gno])
-                min[gno] = z;
-        }
-    }
-    if (max) {
-        for (k = nn, g = grains, d = data_field->data; k; k--, g++, d++) {
-            gno = *g;
-            z = *d;
-            if (z > max[gno])
-                max[gno] = z;
-        }
-    }
-    if (zvalue) {
-        g_assert(sizes);
-        for (k = nn, g = grains, d = data_field->data; k; k--, g++, d++) {
-            gno = *g;
-            z = *d;
-            zvalue[gno] += z;
-        }
-        for (gno = 0; gno <= ngrains; gno++) {
-            n = sizes[gno];
-            zvalue[gno] /= n;
-        }
-    }
-    if (xvalue) {
-        g_assert(sizes);
-        g = grains;
-        for (i = 0; i < yres; i++) {
-            for (j = 0; j < xres; j++, g++) {
-                gno = *g;
-                xvalue[gno] += j;
-            }
-        }
-        for (gno = 0; gno <= ngrains; gno++) {
-            n = sizes[gno];
-            xvalue[gno] /= n;
-        }
-    }
-    if (yvalue) {
-        g_assert(sizes);
-        g = grains;
-        for (i = 0; i < yres; i++) {
-            for (j = 0; j < xres; j++, g++) {
-                gno = *g;
-                yvalue[gno] += i;
-            }
-        }
-        for (gno = 0; gno <= ngrains; gno++) {
-            n = sizes[gno];
-            yvalue[gno] /= n;
-        }
-    }
-    if (linear) {
-        g_assert(xvalue && yvalue);
-        g = grains;
-        d = data_field->data;
-        for (i = 0; i < yres; i++) {
-            for (j = 0; j < xres; j++, g++, d++) {
-                gdouble x, y;
-
-                gno = *g;
-                t = linear + 5*gno;
-                x = j - xvalue[gno];
-                y = i - yvalue[gno];
-                z = *d;
-                *(t++) += x*x;
-                *(t++) += x*y;
-                *(t++) += y*y;
-                *(t++) += x*z;
-                *t += y*z;
-            }
-        }
-    }
-    if (quadratic) {
-        g_assert(xvalue && yvalue);
-        g = grains;
-        d = data_field->data;
-        for (i = 0; i < yres; i++) {
-            for (j = 0; j < xres; j++, g++, d++) {
-                gdouble x, y, xx, yy, xy;
-
-                gno = *g;
-                t = quadratic + 12*gno;
-                x = j - xvalue[gno];
-                y = i - yvalue[gno];
-                xx = x*x;
-                xy = x*y;
-                yy = y*y;
-                z = *d;
-                *(t++) += xx*x;
-                *(t++) += xx*y;
-                *(t++) += x*yy;
-                *(t++) += y*yy;
-                *(t++) += xx*xx;
-                *(t++) += xx*xy;
-                *(t++) += xx*yy;
-                *(t++) += xy*yy;
-                *(t++) += yy*yy;
-                *(t++) += xx*z;
-                *(t++) += xy*z;
-                *t += yy*z;
-            }
-        }
-    }
-}
-
-static void
-integrate_grain_volume0(const gdouble *d, const gint *grains,
-                        gint xres, gint yres,
-                        gdouble *volume, guint ngrains,
-                        gdouble pixelarea)
-{
-    gint i, j, gno;
-
-    gwy_clear(volume, ngrains + 1);
-    for (i = 0; i < yres; i++) {
-        for (j = 0; j < xres; j++) {
-            gint ix, ipx, imx, jp, jm;
-            gdouble v;
-
-            ix = i*xres;
-            if (!(gno = grains[ix + j]))
-                continue;
-
-            imx = (i > 0) ? ix-xres : ix;
-            ipx = (i < yres-1) ? ix+xres : ix;
-            jm = (j > 0) ? j-1 : j;
-            jp = (j < xres-1) ? j+1 : j;
-
-            v = (52.0*d[ix + j] + 10.0*(d[imx + j] + d[ix + jm]
-                                        + d[ix + jp] + d[ipx + j])
-                 + (d[imx + jm] + d[imx + jp] + d[ipx + jm] + d[ipx + jp]));
-
-            volume[gno] += v;
-        }
-    }
-    for (gno = 0; gno <= ngrains; gno++)
-        volume[gno] *= pixelarea/96.0;
-}
-
-/**
- * gwy_data_field_grains_get_quantities:
- * @data_field: Data field used for marking.  For some quantities its values
- *              are not used, but its dimensions determine the dimensions of
- *              @grains.
- * @values: Array of @nquantities pointers to blocks of length @ngrains+1 to
- *          put the calculated grain values to.  Each block corresponds to one
- *          requested quantity.  %NULL can be passed to allocate and return a
- *          new array.
- * @quantities: Array of @nquantities items that specify the requested
- *              #GwyGrainQuantity to put to corresponding items in @values.
- *              Quantities can repeat.
- * @nquantities: The number of requested different grain values.
- * @grains: Grain numbers filled with gwy_data_field_number_grains().
- * @ngrains: The number of grains as returned by
- *           gwy_data_field_number_grains().
- *
- * Calculates multiple characteristics of grains simultaneously.
- *
- * See gwy_data_field_grains_get_values() for some discussion.  This function
- * is more efficient if several grain quantities need to be calculated since
- * gwy_data_field_grains_get_values() can do lot of repeated work in such case.
- *
- * Returns: @values itself if it was not %NULL, otherwise a newly allocated
- *          array that caller has to free with g_free(), including the
- *          contained arrays.
- *
- * Since: 2.22
- **/
-gdouble**
-gwy_data_field_grains_get_quantities(GwyDataField *data_field,
-                                     gdouble **values,
-                                     const GwyGrainQuantity *quantities,
-                                     guint nquantities,
-                                     guint ngrains,
-                                     const gint *grains)
-{
-    /* The number of built-in quantities. */
-    enum { NQ = 45 };
-    enum {
-        NEED_SIZES = 1 << 0,
-        NEED_BOUNDPOS = 1 << 1,
-        NEED_MIN = 1 << 2,
-        NEED_MAX = 1 << 3,
-        NEED_XVALUE = (1 << 4) | NEED_SIZES,
-        NEED_YVALUE = (1 << 5) | NEED_SIZES,
-        NEED_CENTRE = NEED_XVALUE | NEED_YVALUE,
-        NEED_ZVALUE = (1 << 6) | NEED_SIZES,
-        NEED_LINEAR = (1 << 7) | NEED_ZVALUE | NEED_CENTRE,
-        NEED_QUADRATIC = (1 << 8) | NEED_LINEAR,
-        NEED_BBOX = (1 << 9),
-        INVALID = G_MAXUINT
-    };
-    static const guint need_aux[NQ] = {
-        NEED_SIZES,                   /* projected area */
-        NEED_SIZES,                   /* equiv square side */
-        NEED_SIZES,                   /* equiv disc radius */
-        0,                            /* surface area */
-        NEED_MAX,                     /* maximum */
-        NEED_MIN,                     /* minimum */
-        NEED_ZVALUE,                  /* mean */
-        NEED_SIZES,                   /* median */
-        NEED_SIZES,                   /* pixel area */
-        NEED_MIN | NEED_MAX,          /* half-height area */
-        0,                            /* flat boundary length */
-        INVALID,
-        NEED_BOUNDPOS,                /* min bounding size */
-        NEED_BOUNDPOS,                /* min bounding direction */
-        NEED_BOUNDPOS,                /* max bounding size */
-        NEED_BOUNDPOS,                /* max bounding direction */
-        NEED_XVALUE,                  /* centre x */
-        NEED_YVALUE,                  /* centre y */
-        0,                            /* volume, 0-based */
-        NEED_MIN | NEED_SIZES,        /* volume, min-based */
-        NEED_BBOX | NEED_SIZES,       /* volume, Laplace-based */
-        INVALID,
-        INVALID,
-        NEED_LINEAR,                  /* slope theta */
-        NEED_LINEAR,                  /* slope phi */
-        0,                            /* boundary minimum */
-        0,                            /* boundary maximum */
-        NEED_QUADRATIC,               /* curvature centre x */
-        NEED_QUADRATIC,               /* curvature centre y */
-        NEED_QUADRATIC,               /* curvature centre z */
-        NEED_QUADRATIC,               /* curvature invrad 1 */
-        NEED_QUADRATIC,               /* curvature invrad 2 */
-        NEED_QUADRATIC,               /* curvature direction 1 */
-        NEED_QUADRATIC,               /* curvature direction 2 */
-        NEED_CENTRE | NEED_BBOX,      /* inscribed disc radius */
-        NEED_CENTRE | NEED_BBOX,      /* inscribed disc centre x */
-        NEED_CENTRE | NEED_BBOX,      /* inscribed disc centre y */
-        NEED_BOUNDPOS,                /* convex hull area */
-        NEED_BOUNDPOS,                /* circumcircle radius */
-        NEED_BOUNDPOS,                /* circumcircle centre x */
-        NEED_BOUNDPOS,                /* circumcircle centre y */
-        NEED_CENTRE,                  /* mean radius */
-        NEED_LINEAR,                  /* equiv ellipse major axis */
-        NEED_LINEAR,                  /* equiv ellipse minor axis */
-        NEED_LINEAR,                  /* equiv ellipse major axis angle */
-    };
-
-    gdouble *quantity_data[NQ];
-    gboolean seen[NQ];
-    GList *l, *buffers = NULL;
-    guint *sizes = NULL;
-    gint *boundpos = NULL, *bbox = NULL;
-    gdouble *xvalue = NULL, *yvalue = NULL, *zvalue = NULL,
-            *min = NULL, *max = NULL,
-            *linear = NULL, *quadratic = NULL;
-    const gdouble *d;
-    gdouble *p;
-    gdouble qh, qv, qarea, qdiag, qgeom;
-    guint xres, yres, i, j, k, nn, gno;
-
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), NULL);
-    g_return_val_if_fail(grains, NULL);
-    if (!nquantities)
-        return values;
-    g_return_val_if_fail(quantities, NULL);
-
-    if (!values) {
-        values = g_new(gdouble*, nquantities);
-        for (i = 0; i < nquantities; i++)
-            values[i] = g_new0(gdouble, ngrains + 1);
-    }
-    else {
-        for (i = 0; i < nquantities; i++)
-            gwy_clear(values[i], ngrains + 1);
-    }
-
-    xres = data_field->xres;
-    yres = data_field->yres;
-    nn = xres*yres;
-    gwy_debug("ngrains: %d, nn: %d", ngrains, nn);
-
-    /* Figure out which quantities are requested. */
-    gwy_clear(quantity_data, NQ);
-    for (i = 0; i < nquantities; i++) {
-        GwyGrainQuantity quantity = quantities[i];
-
-        if ((guint)quantity >= NQ || need_aux[quantity] == INVALID) {
-            g_warning("Invalid built-in grain quantity number %u.", quantity);
-            continue;
-        }
-        /* Take the first if the same quantity is requested multiple times.
-         * We will deal with this later. */
-        if (!quantity_data[quantity])
-            quantity_data[quantity] = values[i];
-    }
-
-    /* Figure out the auxiliary data to calculate.  Do this after we gathered
-     * all quantities as some auxiliary data are in fact quantities too. */
-    for (i = 0; i < nquantities; i++) {
-        GwyGrainQuantity quantity = quantities[i];
-        guint need;
-
-        if ((guint)quantity >= NQ || need_aux[quantity] == INVALID)
-            continue;
-
-        need = need_aux[quantity];
-        /* Integer data */
-        if ((need & NEED_SIZES) && !sizes) {
-            sizes = g_new0(guint, ngrains + 1);
-            buffers = g_list_prepend(buffers, sizes);
-        }
-        if ((need & NEED_BOUNDPOS) && !boundpos) {
-            boundpos = g_new(gint, ngrains + 1);
-            buffers = g_list_prepend(buffers, boundpos);
-            for (gno = 0; gno <= ngrains; gno++)
-                boundpos[gno] = -1;
-        }
-        if ((need & NEED_BBOX) && !bbox) {
-            bbox = gwy_data_field_get_grain_bounding_boxes(data_field,
-                                                           ngrains, grains,
-                                                           NULL);
-            buffers = g_list_prepend(buffers, bbox);
-        }
-        /* Floating point data that coincide with some quantity.  An array
-         * is allocated only if the corresponding quantity is not requested.
-         * Otherwise we use the supplied array. */
-        if (need & NEED_MIN)
-            min = ensure_buffer(GWY_GRAIN_VALUE_MINIMUM, quantity_data,
-                                ngrains, G_MAXDOUBLE, &buffers);
-        if (need & NEED_MAX)
-            max = ensure_buffer(GWY_GRAIN_VALUE_MAXIMUM, quantity_data,
-                                ngrains, -G_MAXDOUBLE, &buffers);
-        if (need & NEED_XVALUE)
-            xvalue = ensure_buffer(GWY_GRAIN_VALUE_CENTER_X, quantity_data,
-                                   ngrains, 0.0, &buffers);
-        if (need & NEED_YVALUE)
-            yvalue = ensure_buffer(GWY_GRAIN_VALUE_CENTER_Y, quantity_data,
-                                   ngrains, 0.0, &buffers);
-        if (need & NEED_ZVALUE)
-            zvalue = ensure_buffer(GWY_GRAIN_VALUE_MEAN, quantity_data,
-                                   ngrains, 0.0, &buffers);
-        /* Complex floating point data */
-        if ((need & NEED_LINEAR) && !linear) {
-            linear = g_new0(gdouble, 5*(ngrains + 1));
-            buffers = g_list_prepend(buffers, linear);
-        }
-        if ((need & NEED_QUADRATIC) && !quadratic) {
-            quadratic = g_new0(gdouble, 12*(ngrains + 1));
-            buffers = g_list_prepend(buffers, quadratic);
-        }
-    }
-
-    /* Calculate auxiliary quantities (in pixel lateral coordinates) */
-    calculate_grain_aux(data_field, grains, ngrains, sizes, boundpos,
-                        min, max, xvalue, yvalue, zvalue, linear, quadratic);
-
-    d = data_field->data;
-    qh = gwy_data_field_get_xmeasure(data_field);
-    qv = gwy_data_field_get_ymeasure(data_field);
-    qdiag = hypot(qh, qv);
-    qarea = qh*qv;
-    qgeom = sqrt(qarea);
-
-    /* Calculate specific requested quantities */
-    if ((p = quantity_data[GWY_GRAIN_VALUE_PIXEL_AREA])) {
-        for (gno = 0; gno <= ngrains; gno++)
-            p[gno] = sizes[gno];
-    }
-    if ((p = quantity_data[GWY_GRAIN_VALUE_PROJECTED_AREA])) {
-        for (gno = 0; gno <= ngrains; gno++)
-            p[gno] = qarea*sizes[gno];
-    }
-    if ((p = quantity_data[GWY_GRAIN_VALUE_EQUIV_SQUARE_SIDE])) {
-        for (gno = 0; gno <= ngrains; gno++)
-            p[gno] = sqrt(qarea*sizes[gno]);
-    }
-    if ((p = quantity_data[GWY_GRAIN_VALUE_EQUIV_DISC_RADIUS])) {
-        for (gno = 0; gno <= ngrains; gno++)
-            p[gno] = sqrt(qarea/G_PI*sizes[gno]);
-    }
-    if ((p = quantity_data[GWY_GRAIN_VALUE_SURFACE_AREA])) {
-        gdouble qh2 = qh*qh, qv2 = qv*qv;
-
-        gwy_clear(p, ngrains + 1);
-        /* Every contribution is calculated twice -- for each pixel (vertex)
-         * participating to a particular triangle */
-        for (i = 0; i < yres; i++) {
-            for (j = 0; j < xres; j++) {
-                gint ix, ipx, imx, jp, jm;
-                gdouble c;
-
-                ix = i*xres;
-                if (!(gno = grains[ix + j]))
-                    continue;
-
-                imx = (i > 0) ? ix-xres : ix;
-                ipx = (i < yres-1) ? ix+xres : ix;
-                jm = (j > 0) ? j-1 : j;
-                jp = (j < xres-1) ? j+1 : j;
-
-                c = (d[ix + j] + d[ix + jm] + d[imx + jm] + d[imx + j])/2.0;
-                p[gno] += square_area2w_1c(d[ix + j], d[ix + jm],
-                                           d[imx + j], c, qh2, qv2);
-
-                c = (d[ix + j] + d[ix + jp] + d[imx + jp] + d[imx + j])/2.0;
-                p[gno] += square_area2w_1c(d[ix + j], d[ix + jp],
-                                           d[imx + j], c, qh2, qv2);
-
-                c = (d[ix + j] + d[ix + jm] + d[ipx + jm] + d[ipx + j])/2.0;
-                p[gno] += square_area2w_1c(d[ix + j], d[ix + jm],
-                                           d[ipx + j], c, qh2, qv2);
-
-                c = (d[ix + j] + d[ix + jp] + d[ipx + jp] + d[ipx + j])/2.0;
-                p[gno] += square_area2w_1c(d[ix + j], d[ix + jp],
-                                           d[ipx + j], c, qh2, qv2);
-            }
-        }
-        for (gno = 0; gno <= ngrains; gno++)
-            p[gno] *= qarea/8.0;
-    }
-    /* GWY_GRAIN_VALUE_MINIMUM is calculated directly. */
-    /* GWY_GRAIN_VALUE_MAXIMUM is calculated directly. */
-    /* GWY_GRAIN_VALUE_MEAN is calculated directly. */
-    if ((p = quantity_data[GWY_GRAIN_VALUE_MEDIAN])) {
-        guint *csizes = g_new0(guint, ngrains + 1);
-        guint *pos = g_new0(guint, ngrains + 1);
-        gdouble *tmp;
-
-        /* Find cumulative sizes (we care only about grains, ignore the
-         * outside-grains area) */
-        csizes[0] = 0;
-        csizes[1] = sizes[1];
-        for (gno = 2; gno <= ngrains; gno++)
-            csizes[gno] = sizes[gno] + csizes[gno-1];
-
-        tmp = g_new(gdouble, csizes[ngrains]);
-        /* Find where each grain starts in tmp sorted by grain # */
-        for (gno = 1; gno <= ngrains; gno++)
-            pos[gno] = csizes[gno-1];
-        /* Sort values by grain # to tmp */
-        for (k = 0; k < nn; k++) {
-            if ((gno = grains[k])) {
-                tmp[pos[gno]] = d[k];
-                pos[gno]++;
-            }
-        }
-        /* Find medians of each block */
-        for (gno = 1; gno <= ngrains; gno++)
-            p[gno] = gwy_math_median(csizes[gno] - csizes[gno-1],
-                                     tmp + csizes[gno-1]);
-        /* Finalize */
-        g_free(csizes);
-        g_free(pos);
-        g_free(tmp);
-    }
-    if ((p = quantity_data[GWY_GRAIN_VALUE_HALF_HEIGHT_AREA])) {
-        gdouble *zhalf;
-        guint *zhsizes;
-
-        /* Find the grain half-heights, i.e. (z_min + z_max)/2, first */
-        zhalf = g_new(gdouble, ngrains + 1);
-        for (gno = 0; gno <= ngrains; gno++)
-            zhalf[gno] = (min[gno] + max[gno])/2.0;
-        /* Calculate the area of pixels above the half-heights */
-        zhsizes = g_new0(gint, ngrains + 1);
-        for (k = 0; k < nn; k++) {
-            gno = grains[k];
-            if (d[k] >= zhalf[gno])
-                zhsizes[gno]++;
-        }
-        for (gno = 0; gno <= ngrains; gno++)
-            p[gno] = qarea*zhsizes[gno];
-        /* Finalize */
-        g_free(zhalf);
-        g_free(zhsizes);
-    }
-    if ((p = quantity_data[GWY_GRAIN_VALUE_FLAT_BOUNDARY_LENGTH])) {
-        gwy_clear(p, ngrains + 1);
-        /* Note the cycles go to xres and yres inclusive as we calculate the
-         * boundary, not pixel interiors. */
-        for (i = 0; i <= yres; i++) {
-            for (j = 0; j <= xres; j++) {
-                gint g1, g2, g3, g4, f;
-
-                /* Hope compiler will optimize this mess... */
-                g1 = (i > 0 && j > 0) ? grains[i*xres + j - xres - 1] : 0;
-                g2 = (i > 0 && j < xres) ? grains[i*xres + j - xres] : 0;
-                g3 = (i < yres && j > 0) ? grains[i*xres + j - 1] : 0;
-                g4 = (i < yres && j < xres) ? grains[i*xres + j] : 0;
-                f = (g1 > 0) + (g2 > 0) + (g3 > 0) + (g4 > 0);
-                if (f == 0 || f == 4)
-                    continue;
-
-                if (f == 1 || f == 3) {
-                    /* Try to avoid too many if-thens by using the fact they
-                     * are all either zero or an identical value */
-                    p[g1 | g2 | g3 | g4] += qdiag/2.0;
-                }
-                else if (g1 && g4) {
-                    /* This works for both g1 == g4 and g1 != g4 */
-                    p[g1] += qdiag/2.0;
-                    p[g4] += qdiag/2.0;
-                }
-                else if (g2 && g3) {
-                    /* This works for both g2 == g3 and g2 != g3 */
-                    p[g2] += qdiag/2.0;
-                    p[g3] += qdiag/2.0;
-                }
-                else if (g1 == g2)
-                    p[g1 | g3] += qh;
-                else if (g1 == g3)
-                    p[g1 | g2] += qv;
-                else {
-                    g_assert_not_reached();
-                }
-            }
-        }
-    }
-    if (quantity_data[GWY_GRAIN_VALUE_BOUNDARY_MINIMUM]
-        || quantity_data[GWY_GRAIN_VALUE_BOUNDARY_MAXIMUM]) {
-        gdouble *pmin = quantity_data[GWY_GRAIN_VALUE_BOUNDARY_MINIMUM];
-        gdouble *pmax = quantity_data[GWY_GRAIN_VALUE_BOUNDARY_MAXIMUM];
-
-        if (pmin) {
-            for (gno = 0; gno <= ngrains; gno++)
-                pmin[gno] = G_MAXDOUBLE;
-        }
-        if (pmax) {
-            for (gno = 0; gno <= ngrains; gno++)
-                pmax[gno] = -G_MAXDOUBLE;
-        }
-
-        for (i = 0; i < yres; i++) {
-            for (j = 0; j < xres; j++) {
-                gdouble z;
-
-                /* Processing of the none-grain boundary is waste of time. */
-                if (!(gno = grains[i*xres + j]))
-                    continue;
-
-                if (i && j && i < yres-1 && j < xres - 1
-                    && grains[(i - 1)*xres + j] == gno
-                    && grains[i*xres + j - 1] == gno
-                    && grains[i*xres + j + 1] == gno
-                    && grains[(i + 1)*xres + j] == gno)
-                    continue;
-
-                z = d[i*xres + j];
-                if (pmin && z < pmin[gno])
-                    pmin[gno] = z;
-                if (pmax && z > pmax[gno])
-                    pmax[gno] = z;
-            }
-        }
-    }
-    if (quantity_data[GWY_GRAIN_VALUE_MINIMUM_BOUND_SIZE]
-        || quantity_data[GWY_GRAIN_VALUE_MINIMUM_BOUND_ANGLE]
-        || quantity_data[GWY_GRAIN_VALUE_MAXIMUM_BOUND_SIZE]
-        || quantity_data[GWY_GRAIN_VALUE_MAXIMUM_BOUND_ANGLE]
-        || quantity_data[GWY_GRAIN_VALUE_CONVEX_HULL_AREA]
-        || quantity_data[GWY_GRAIN_VALUE_CIRCUMCIRCLE_R]
-        || quantity_data[GWY_GRAIN_VALUE_CIRCUMCIRCLE_X]
-        || quantity_data[GWY_GRAIN_VALUE_CIRCUMCIRCLE_Y]) {
-        gdouble *psmin = quantity_data[GWY_GRAIN_VALUE_MINIMUM_BOUND_SIZE];
-        gdouble *psmax = quantity_data[GWY_GRAIN_VALUE_MAXIMUM_BOUND_SIZE];
-        gdouble *pamin = quantity_data[GWY_GRAIN_VALUE_MINIMUM_BOUND_ANGLE];
-        gdouble *pamax = quantity_data[GWY_GRAIN_VALUE_MAXIMUM_BOUND_ANGLE];
-        gdouble *achull = quantity_data[GWY_GRAIN_VALUE_CONVEX_HULL_AREA];
-        gdouble *circcr = quantity_data[GWY_GRAIN_VALUE_CIRCUMCIRCLE_R];
-        gdouble *circcx = quantity_data[GWY_GRAIN_VALUE_CIRCUMCIRCLE_X];
-        gdouble *circcy = quantity_data[GWY_GRAIN_VALUE_CIRCUMCIRCLE_Y];
-        GArray *vertices;
-
-        /* Find the complete convex hulls */
-        vertices = g_array_new(FALSE, FALSE, sizeof(GridPoint));
-        for (gno = 1; gno <= ngrains; gno++) {
-            gdouble dx = qh, dy = qv;
-
-            find_grain_convex_hull(xres, yres, grains, boundpos[gno], vertices);
-            if (psmin || pamin) {
-                grain_minimum_bound(vertices, qh, qv, &dx, &dy);
-                if (psmin)
-                    psmin[gno] = hypot(dx, dy);
-                if (pamin) {
-                    pamin[gno] = atan2(-dy, dx);
-                    if (pamin[gno] <= -G_PI/2.0)
-                        pamin[gno] += G_PI;
-                    else if (pamin[gno] > G_PI/2.0)
-                        pamin[gno] -= G_PI;
-                }
-            }
-            if (psmax || pamax) {
-                grain_maximum_bound(vertices, qh, qv, &dx, &dy);
-                if (psmax)
-                    psmax[gno] = hypot(dx, dy);
-                if (pamax) {
-                    pamax[gno] = atan2(-dy, dx);
-                    if (pamax[gno] <= -G_PI/2.0)
-                        pamax[gno] += G_PI;
-                    else if (pamax[gno] > G_PI/2.0)
-                        pamax[gno] -= G_PI;
-                }
-            }
-            if (achull) {
-                achull[gno] = grain_convex_hull_area(vertices, qh, qv);
-            }
-            if (circcr || circcx || circcy) {
-                InscribedDisc circle = { 0.0, 0.0, 0.0, 0 };
-
-                grain_convex_hull_centre(vertices, qh, qv,
-                                         &circle.x, &circle.y);
-                circle.R2 = minimize_circle_radius(&circle, vertices,
-                                                   qh, qv);
-                improve_circumscribed_circle(&circle, vertices, qh, qv);
-
-                if (circcr)
-                    circcr[gno] = sqrt(circle.R2);
-                if (circcx)
-                    circcx[gno] = circle.x + data_field->xoff;
-                if (circcy)
-                    circcy[gno] = circle.y + data_field->yoff;
-            }
-        }
-        /* Finalize */
-        g_array_free(vertices, TRUE);
-    }
-    /* XXX: This must go before GWY_GRAIN_VALUE_CENTER_X and
-     * GWY_GRAIN_VALUE_CENTER_Y because we want them as pixel quantities. */
-    if (quantity_data[GWY_GRAIN_VALUE_INSCRIBED_DISC_R]
-        || quantity_data[GWY_GRAIN_VALUE_INSCRIBED_DISC_X]
-        || quantity_data[GWY_GRAIN_VALUE_INSCRIBED_DISC_Y]) {
-        gdouble *inscdr = quantity_data[GWY_GRAIN_VALUE_INSCRIBED_DISC_R];
-        gdouble *inscdx = quantity_data[GWY_GRAIN_VALUE_INSCRIBED_DISC_X];
-        gdouble *inscdy = quantity_data[GWY_GRAIN_VALUE_INSCRIBED_DISC_Y];
-        guint *grain = NULL;
-        guint grainsize = 0;
-        PixelQueue *inqueue = g_slice_new0(PixelQueue);
-        PixelQueue *outqueue = g_slice_new0(PixelQueue);
-        GArray *candidates = g_array_new(FALSE, FALSE, sizeof(InscribedDisc));
-        EdgeQueue edges = { 0, 0, NULL };
-        InscribedDisc *cand;
-
-        /*
-         * For each grain:
-         *    Extract it, find all boundary pixels.
-         *    Use (octagnoal) erosion to find disc centre candidate(s).
-         *    For each candidate:
-         *       Find maximum disc that fits with this centre.
-         *       By expanding/moving try to find a larger disc until we cannot
-         *       improve it.
-         */
-        for (gno = 1; gno <= ngrains; gno++) {
-            guint width, height, dist;
-            gdouble dx, dy, centrex, centrey;
-            guint w = bbox[4*gno + 2], h = bbox[4*gno + 3];
-            gdouble xoff = qh*bbox[4*gno] + data_field->xoff,
-                    yoff = qv*bbox[4*gno + 1] + data_field->yoff;
-            guint ncand;
-
-            /* If the grain is rectangular, calculate the disc directly.
-             * Large rectangular grains are rare but the point is to catch
-             * grains with width of height of 1 here. */
-            if (sizes[gno] == w*h) {
-                dx = 0.5*w*qh;
-                dy = 0.5*h*qv;
-                if (inscdr)
-                    inscdr[gno] = 0.999*MIN(dx, dy);
-                if (inscdx)
-                    inscdx[gno] = dx + xoff;
-                if (inscdy)
-                    inscdy[gno] = dy + yoff;
-                continue;
-            }
-
-            /* Upsampling twice combined with octagonal erosion has the nice
-             * property that we get candidate pixels in places such as corners
-             * or junctions of one-pixel thin lines. */
-            grain = extract_upsampled_square_pixel_grain(grains, xres, gno,
-                                                         bbox + 4*gno,
-                                                         grain, &grainsize,
-                                                         &width, &height,
-                                                         qh, qv);
-            /* Size of upsamples pixel in original pixel coordinates.  Normally
-             * equal to 1/2 and always approximately 1:1. */
-            dx = w*(qh/qgeom)/width;
-            dy = h*(qv/qgeom)/height;
-            /* Grain centre in squeezed pixel coordinates within the bbox. */
-            centrex = (xvalue[gno] + 0.5)*(qh/qgeom);
-            centrey = (yvalue[gno] + 0.5)*(qv/qgeom);
-
-            dist = simple_dist_trans(grain, width, height, TRUE,
-                                     GWY_DISTANCE_TRANSFORM_OCTAGONAL48,
-                                     inqueue, outqueue);
-            if (dist % 2 == 0) {
-                GWY_SWAP(PixelQueue*, inqueue, outqueue);
-            }
-#if 0
-            for (i = 0; i < height; i++) {
-                for (j = 0; j < width; j++) {
-                    if (!grain[i*width + j])
-                        g_printerr("..");
-                    else
-                        g_printerr("%02u", grain[i*width + j]);
-                    g_printerr("%c", j == width-1 ? '\n' : ' ');
-                }
-            }
-#endif
-            /* Now inqueue is always non-empty and contains max-distance
-             * pixels of the upscaled grain. */
-            find_disc_centre_candidates(candidates, inqueue,
-                                        grain, width, height,
-                                        dx, dy, centrex, centrey);
-            find_all_edges(&edges, grains, xres, gno, bbox + 4*gno,
-                           qh/qgeom, qv/qgeom);
-
-            /* Try a few first candidates for the inscribed disc centre. */
-            ncand = MIN(15, candidates->len);
-            for (i = 0; i < ncand; i++) {
-                cand = &g_array_index(candidates, InscribedDisc, i);
-                improve_inscribed_disc(cand, &edges, dist);
-            }
-
-            cand = &g_array_index(candidates, InscribedDisc, 0);
-            for (i = 1; i < ncand; i++) {
-                if (g_array_index(candidates, InscribedDisc, i).R2 > cand->R2)
-                    cand = &g_array_index(candidates, InscribedDisc, i);
-            }
-
-            if (inscdr)
-                inscdr[gno] = sqrt(cand->R2 * qarea);
-            if (inscdx)
-                inscdx[gno] = cand->x*qgeom + xoff;
-            if (inscdy)
-                inscdy[gno] = cand->y*qgeom + yoff;
-        }
-
-        g_free(grain);
-        g_free(inqueue->points);
-        g_free(outqueue->points);
-        g_slice_free(PixelQueue, inqueue);
-        g_slice_free(PixelQueue, outqueue);
-        g_free(edges.edges);
-        g_array_free(candidates, TRUE);
-    }
-    /* XXX: This must go before GWY_GRAIN_VALUE_CENTER_X and
-     * GWY_GRAIN_VALUE_CENTER_Y because we want them as pixel quantities. */
-    if ((p = quantity_data[GWY_GRAIN_VALUE_MEAN_RADIUS])) {
-        guint *blen = g_new0(guint, ngrains + 1);
-
-        k = 0;
-        for (i = 0; i < yres; i++) {
-            for (j = 0; j < xres; j++, k++) {
-                gdouble xc, yc;
-
-                if (!(gno = grains[k]))
-                    continue;
-
-                xc = xvalue[gno];
-                yc = yvalue[gno];
-                if (!i || !grains[k - xres]) {
-                    p[gno] += hypot(qh*(j+0.5 - xc), qv*(i - yc));
-                    p[gno] += hypot(qh*(j+1 - xc), qv*(i - yc));
-                    blen[gno] += 2;
-                }
-                if (!j || !grains[k-1]) {
-                    p[gno] += hypot(qh*(j - xc), qv*(i - yc));
-                    p[gno] += hypot(qh*(j - xc), qv*(i+0.5 - yc));
-                    blen[gno] += 2;
-                }
-                if (j == xres-1 || !grains[k+1]) {
-                    p[gno] += hypot(qh*(j+1 - xc), qv*(i+0.5 - yc));
-                    p[gno] += hypot(qh*(j+1 - xc), qv*(i+1 - yc));
-                    blen[gno] += 2;
-                }
-                if (i == yres-1 || !grains[k + xres]) {
-                    p[gno] += hypot(qh*(j - xc), qv*(i+1 - yc));
-                    p[gno] += hypot(qh*(j+0.5 - xc), qv*(i+1 - yc));
-                    blen[gno] += 2;
-                }
-            }
-        }
-
-        for (gno = 1; gno <= ngrains; gno++)
-            p[gno] /= blen[gno];
-
-        g_free(blen);
-    }
-    if (quantity_data[GWY_GRAIN_VALUE_EQUIV_ELLIPSE_MAJOR]
-        || quantity_data[GWY_GRAIN_VALUE_EQUIV_ELLIPSE_MINOR]
-        || quantity_data[GWY_GRAIN_VALUE_EQUIV_ELLIPSE_ANGLE]) {
-        gdouble *amaj = quantity_data[GWY_GRAIN_VALUE_EQUIV_ELLIPSE_MAJOR];
-        gdouble *amin = quantity_data[GWY_GRAIN_VALUE_EQUIV_ELLIPSE_MINOR];
-        gdouble *phi = quantity_data[GWY_GRAIN_VALUE_EQUIV_ELLIPSE_ANGLE];
-
-        for (gno = 1; gno <= ngrains; gno++) {
-            guint n = sizes[gno];
-            gdouble *lin = linear + 5*gno;
-            gdouble Jxx = qh*qh*(lin[0] + n/12.0)*qarea;
-            gdouble Jxy = qh*qv*lin[1]*qarea;
-            gdouble Jyy = qv*qv*(lin[2] + n/12.0)*qarea;
-
-            if (phi) {
-                gdouble Jeps = 1e-9*MAX(Jxx, Jyy);
-
-                if (fabs(Jxx - Jyy) > Jeps || fabs(Jxy) > Jeps)
-                    phi[gno] = 0.5*atan2(-2.0*Jxy, Jxx - Jyy);
-                else
-                    phi[gno] = 0.0;
-            }
-
-            if (amaj || amin) {
-                gdouble u = Jxx + Jyy,
-                        v = hypot(2.0*Jxy, Jxx - Jyy),
-                        w = sqrt(G_PI*sqrt(Jxx*Jyy - Jxy*Jxy));
-
-                if (amaj)
-                    amaj[gno] = sqrt((u + v)/w);
-                if (amin)
-                    amin[gno] = sqrt((u - v)/w);
-            }
-        }
-
-    }
-    if ((p = quantity_data[GWY_GRAIN_VALUE_CENTER_X])) {
-        for (gno = 0; gno <= ngrains; gno++)
-            p[gno] = qh*(p[gno] + 0.5) + data_field->xoff;
-    }
-    if ((p = quantity_data[GWY_GRAIN_VALUE_CENTER_Y])) {
-        for (gno = 0; gno <= ngrains; gno++)
-            p[gno] = qv*(p[gno] + 0.5) + data_field->yoff;
-    }
-    if (quantity_data[GWY_GRAIN_VALUE_VOLUME_0]
-        || quantity_data[GWY_GRAIN_VALUE_VOLUME_MIN]) {
-        gdouble *pv0 = quantity_data[GWY_GRAIN_VALUE_VOLUME_0];
-        gdouble *pvm = quantity_data[GWY_GRAIN_VALUE_VOLUME_MIN];
-
-        if (pv0) {
-            integrate_grain_volume0(d, grains, xres, yres, pv0, ngrains, qarea);
-            if (pvm) {
-                for (gno = 0; gno <= ngrains; gno++)
-                    pvm[gno] = pv0[gno] - qarea*min[gno]*sizes[gno];
-            }
-        }
-        else {
-            g_assert(pvm);
-            integrate_grain_volume0(d, grains, xres, yres, pvm, ngrains, qarea);
-            for (gno = 0; gno <= ngrains; gno++)
-                pvm[gno] -= qarea*min[gno]*sizes[gno];
-        }
-    }
-    if ((p = quantity_data[GWY_GRAIN_VALUE_VOLUME_LAPLACE])) {
-        /* Fail gracefully when there is one big `grain' over all data. */
-        if (ngrains == 1 && sizes[1] == xres*yres)
-            p[1] = 0.0;
-        else {
-            GwyDataField *difference = gwy_data_field_duplicate(data_field);
-            GwyDataField *mask = gwy_data_field_new_alike(data_field, FALSE);
-            gdouble *m = mask->data;
-
-            for (k = 0; k < nn; k++)
-                m[k] = grains[k];
-
-            gwy_data_field_laplace_solve(difference, mask, -1, 0.4);
-            g_object_unref(mask);
-            gwy_data_field_subtract_fields(difference, data_field, difference);
-            integrate_grain_volume0(difference->data, grains, xres, yres, p,
-                                    ngrains, qarea);
-            g_object_unref(difference);
-        }
-    }
-    if (quantity_data[GWY_GRAIN_VALUE_SLOPE_THETA]
-        || quantity_data[GWY_GRAIN_VALUE_SLOPE_PHI]) {
-        gdouble *ptheta = quantity_data[GWY_GRAIN_VALUE_SLOPE_THETA];
-        gdouble *pphi = quantity_data[GWY_GRAIN_VALUE_SLOPE_PHI];
-
-        for (gno = 1; gno <= ngrains; gno++) {
-            gdouble xx, yy, xy, xz, yz, det, bx, by;
-            gdouble *lin = linear + 5*gno;
-
-            xx = lin[0];
-            xy = lin[1];
-            yy = lin[2];
-            xz = lin[3];
-            yz = lin[4];
-            det = xx*yy - xy*xy;
-            if (det) {
-                bx = (xz*yy - xy*yz)/(qh*det);
-                by = (yz*xx - xy*xz)/(qv*det);
-                if (ptheta)
-                    ptheta[gno] = atan(hypot(bx, by));
-                if (pphi)
-                    pphi[gno] = atan2(by, -bx);
-            }
-            else {
-                if (ptheta)
-                    ptheta[gno] = 0.0;
-                if (pphi)
-                    pphi[gno] = 0.0;
-            }
-        }
-    }
-    if (quantity_data[GWY_GRAIN_VALUE_CURVATURE_CENTER_X]
-        || quantity_data[GWY_GRAIN_VALUE_CURVATURE_CENTER_Y]
-        || quantity_data[GWY_GRAIN_VALUE_CURVATURE_CENTER_Z]
-        || quantity_data[GWY_GRAIN_VALUE_CURVATURE1]
-        || quantity_data[GWY_GRAIN_VALUE_CURVATURE2]
-        || quantity_data[GWY_GRAIN_VALUE_CURVATURE_ANGLE1]
-        || quantity_data[GWY_GRAIN_VALUE_CURVATURE_ANGLE2]) {
-        gdouble *px = quantity_data[GWY_GRAIN_VALUE_CURVATURE_CENTER_X];
-        gdouble *py = quantity_data[GWY_GRAIN_VALUE_CURVATURE_CENTER_Y];
-        gdouble *pz = quantity_data[GWY_GRAIN_VALUE_CURVATURE_CENTER_Z];
-        gdouble *pk1 = quantity_data[GWY_GRAIN_VALUE_CURVATURE1];
-        gdouble *pk2 = quantity_data[GWY_GRAIN_VALUE_CURVATURE2];
-        gdouble *pa1 = quantity_data[GWY_GRAIN_VALUE_CURVATURE_ANGLE1];
-        gdouble *pa2 = quantity_data[GWY_GRAIN_VALUE_CURVATURE_ANGLE2];
-        gdouble mx = sqrt(qh/qv), my = sqrt(qv/qh);
-
-        for (gno = 1; gno <= ngrains; gno++) {
-            /* a:
-             *  0 [<1>
-             *  1  <x>   <x²>
-             *  3  <y>   <xy>   <y²>
-             *  6  <x²>  <x³>   <x²y>  <x⁴>
-             * 10  <xy>  <x²y>  <xy²>  <x³y>   <x²y²>
-             * 15  <y²>  <xy²>  <y³>   <x²y²>  <xy³>   <y⁴>]
-             * b: [<z>  <xz>  <yz>  <x²z>  <xyz>  <y²z>]
-             */
-            gdouble a[21], b[6];
-            gdouble *lin = linear + 5*gno, *quad = quadratic + 12*gno;
-            guint n = sizes[gno];
-
-            if (n >= 6) {
-                a[0] = n;
-                a[1] = a[3] = 0.0;
-                a[2] = a[6] = lin[0];
-                a[4] = a[10] = lin[1];
-                a[5] = a[15] = lin[2];
-                a[7] = quad[0];
-                a[8] = a[11] = quad[1];
-                a[9] = quad[4];
-                a[12] = a[16] = quad[2];
-                a[13] = quad[5];
-                a[14] = a[18] = quad[6];
-                a[17] = quad[3];
-                a[19] = quad[7];
-                a[20] = quad[8];
-                if (gwy_math_choleski_decompose(6, a)) {
-                    b[0] = n*zvalue[gno];
-                    b[1] = lin[3];
-                    b[2] = lin[4];
-                    b[3] = quad[9];
-                    b[4] = quad[10];
-                    b[5] = quad[11];
-                    gwy_math_choleski_solve(6, a, b);
-                    /* Get pixel aspect ratio right while keeping pixel size
-                     * around 1. */
-                    b[1] /= mx;
-                    b[2] /= my;
-                    b[3] /= mx*mx;
-                    b[5] /= my*my;
-                }
-                else
-                    n = 0;
-            }
-
-            /* Recycle a[] for the curvature parameters. */
-            if (n >= 6)
-                gwy_math_curvature(b, a+0, a+1, a+2, a+3, a+4, a+5, a+6);
-            else {
-                a[0] = a[1] = a[2] = a[4] = a[5] = 0.0;
-                a[3] = G_PI/2.0;
-                a[6] = zvalue[gno];
-            }
-            if (pk1)
-                pk1[gno] = a[0]/(qgeom*qgeom);
-            if (pk2)
-                pk2[gno] = a[1]/(qgeom*qgeom);
-            if (pa1)
-                pa1[gno] = a[2];
-            if (pa2)
-                pa2[gno] = a[3];
-            if (px)
-                px[gno] = qgeom*a[4] + xvalue[gno];
-            if (py)
-                py[gno] = qgeom*a[5] + yvalue[gno];
-            if (pz)
-                pz[gno] = a[6];
-        }
-    }
-
-    /* Copy quantity values to all other instances of the same quantity in
-     * @values. */
-    gwy_clear(seen, NQ);
-    for (i = 0; i < nquantities; i++) {
-        GwyGrainQuantity quantity = quantities[i];
-
-        if ((guint)quantity >= NQ || need_aux[quantity] == INVALID)
-            continue;
-
-        if (seen[quantity])
-            gwy_assign(values[i], quantity_data[quantity], ngrains + 1);
-        seen[quantity] = TRUE;
-    }
-
-    /* Finalize */
-    for (l = buffers; l; l = g_list_next(l))
-        g_free(l->data);
-    g_list_free(buffers);
-
-    return values;
-}
-
-/**
- * gwy_grain_quantity_needs_same_units:
- * @quantity: A grain quantity.
- *
- * Tests whether a grain quantity is defined only when lateral and value
- * units match.
- *
- * Returns: %TRUE if @quantity is meaningless when lateral and value units
- *          differ, %FALSE if it is always defined.
- *
- * Since: 2.7
- **/
-gboolean
-gwy_grain_quantity_needs_same_units(GwyGrainQuantity quantity)
-{
-    enum {
-        no_same_units = ((ONE << GWY_GRAIN_VALUE_PROJECTED_AREA)
-                         | (ONE << GWY_GRAIN_VALUE_EQUIV_SQUARE_SIDE)
-                         | (ONE << GWY_GRAIN_VALUE_EQUIV_DISC_RADIUS)
-                         | (ONE << GWY_GRAIN_VALUE_MAXIMUM)
-                         | (ONE << GWY_GRAIN_VALUE_MINIMUM)
-                         | (ONE << GWY_GRAIN_VALUE_MEAN)
-                         | (ONE << GWY_GRAIN_VALUE_MEDIAN)
-                         | (ONE << GWY_GRAIN_VALUE_HALF_HEIGHT_AREA)
-                         | (ONE << GWY_GRAIN_VALUE_FLAT_BOUNDARY_LENGTH)
-                         | (ONE << GWY_GRAIN_VALUE_MINIMUM_BOUND_SIZE)
-                         | (ONE << GWY_GRAIN_VALUE_MINIMUM_BOUND_ANGLE)
-                         | (ONE << GWY_GRAIN_VALUE_MAXIMUM_BOUND_SIZE)
-                         | (ONE << GWY_GRAIN_VALUE_MAXIMUM_BOUND_ANGLE)
-                         | (ONE << GWY_GRAIN_VALUE_CENTER_X)
-                         | (ONE << GWY_GRAIN_VALUE_CENTER_Y)
-                         | (ONE << GWY_GRAIN_VALUE_VOLUME_0)
-                         | (ONE << GWY_GRAIN_VALUE_VOLUME_MIN)
-                         | (ONE << GWY_GRAIN_VALUE_VOLUME_LAPLACE)
-                         | (ONE << GWY_GRAIN_VALUE_SLOPE_PHI)
-                         | (ONE << GWY_GRAIN_VALUE_CURVATURE_CENTER_X)
-                         | (ONE << GWY_GRAIN_VALUE_CURVATURE_CENTER_Y)
-                         | (ONE << GWY_GRAIN_VALUE_CURVATURE_CENTER_Z)
-                         | (ONE << GWY_GRAIN_VALUE_CURVATURE_ANGLE1)
-                         | (ONE << GWY_GRAIN_VALUE_CURVATURE_ANGLE2)
-                         | (ONE << GWY_GRAIN_VALUE_INSCRIBED_DISC_R)
-                         | (ONE << GWY_GRAIN_VALUE_INSCRIBED_DISC_X)
-                         | (ONE << GWY_GRAIN_VALUE_INSCRIBED_DISC_Y)
-                         | (ONE << GWY_GRAIN_VALUE_CONVEX_HULL_AREA)
-                         | (ONE << GWY_GRAIN_VALUE_CIRCUMCIRCLE_R)
-                         | (ONE << GWY_GRAIN_VALUE_CIRCUMCIRCLE_X)
-                         | (ONE << GWY_GRAIN_VALUE_CIRCUMCIRCLE_Y)
-                         | (ONE << GWY_GRAIN_VALUE_MEAN_RADIUS)),
-        same_units = ((ONE << GWY_GRAIN_VALUE_SLOPE_THETA)
-                      | (ONE << GWY_GRAIN_VALUE_SURFACE_AREA)
-                      | (ONE << GWY_GRAIN_VALUE_CURVATURE1)
-                      | (ONE << GWY_GRAIN_VALUE_CURVATURE2))
-    };
-
-    if ((ONE << quantity) & no_same_units)
-        return FALSE;
-    if ((ONE << quantity) & same_units)
-        return TRUE;
-    g_return_val_if_reached(FALSE);
-}
-
-/**
- * gwy_grain_quantity_get_units:
- * @quantity: A grain quantity.
- * @siunitxy: Lateral SI unit of data.
- * @siunitz: Value SI unit of data.
- * @result: An SI unit to set to the units of @quantity.
- *          It can be %NULL, a new SI unit is created then and returned.
- *
- * Calculates the units of a grain quantity.
- *
- * Returns: When @result is %NULL, a newly creates SI unit that has to be
- *          dereferenced when no longer used later.  Otherwise @result itself
- *          is simply returned, its reference count is NOT increased.
- *
- * Since: 2.7
- **/
-GwySIUnit*
-gwy_grain_quantity_get_units(GwyGrainQuantity quantity,
-                             GwySIUnit *siunitxy,
-                             GwySIUnit *siunitz,
-                             GwySIUnit *result)
-{
-    enum {
-        coord_units = ((ONE << GWY_GRAIN_VALUE_EQUIV_SQUARE_SIDE)
-                       | (ONE << GWY_GRAIN_VALUE_EQUIV_DISC_RADIUS)
-                       | (ONE << GWY_GRAIN_VALUE_FLAT_BOUNDARY_LENGTH)
-                       | (ONE << GWY_GRAIN_VALUE_MINIMUM_BOUND_SIZE)
-                       | (ONE << GWY_GRAIN_VALUE_MAXIMUM_BOUND_SIZE)
-                       | (ONE << GWY_GRAIN_VALUE_CENTER_X)
-                       | (ONE << GWY_GRAIN_VALUE_CENTER_Y)
-                       | (ONE << GWY_GRAIN_VALUE_CURVATURE_CENTER_X)
-                       | (ONE << GWY_GRAIN_VALUE_CURVATURE_CENTER_Y)
-                       | (ONE << GWY_GRAIN_VALUE_INSCRIBED_DISC_R)
-                       | (ONE << GWY_GRAIN_VALUE_INSCRIBED_DISC_X)
-                       | (ONE << GWY_GRAIN_VALUE_INSCRIBED_DISC_Y)
-                       | (ONE << GWY_GRAIN_VALUE_CIRCUMCIRCLE_R)
-                       | (ONE << GWY_GRAIN_VALUE_CIRCUMCIRCLE_X)
-                       | (ONE << GWY_GRAIN_VALUE_CIRCUMCIRCLE_Y)
-                       | (ONE << GWY_GRAIN_VALUE_MEAN_RADIUS)),
-        icoord_units = ((ONE << GWY_GRAIN_VALUE_CURVATURE1)
-                       | (ONE << GWY_GRAIN_VALUE_CURVATURE2)),
-        value_units = ((ONE << GWY_GRAIN_VALUE_MAXIMUM)
-                       | (ONE << GWY_GRAIN_VALUE_MINIMUM)
-                       | (ONE << GWY_GRAIN_VALUE_MEAN)
-                       | (ONE << GWY_GRAIN_VALUE_MEDIAN)
-                       | (ONE << GWY_GRAIN_VALUE_CURVATURE_CENTER_Z)),
-        area_units = ((ONE << GWY_GRAIN_VALUE_PROJECTED_AREA)
-                      | (ONE << GWY_GRAIN_VALUE_HALF_HEIGHT_AREA)
-                      | (ONE << GWY_GRAIN_VALUE_SURFACE_AREA)
-                      | (ONE << GWY_GRAIN_VALUE_CONVEX_HULL_AREA)),
-        volume_units = ((ONE << GWY_GRAIN_VALUE_VOLUME_0)
-                        | (ONE << GWY_GRAIN_VALUE_VOLUME_MIN)
-                        | (ONE << GWY_GRAIN_VALUE_VOLUME_LAPLACE)),
-        angle_units = ((ONE << GWY_GRAIN_VALUE_MINIMUM_BOUND_ANGLE)
-                       | (ONE << GWY_GRAIN_VALUE_MAXIMUM_BOUND_ANGLE)
-                       | (ONE << GWY_GRAIN_VALUE_SLOPE_PHI)
-                       | (ONE << GWY_GRAIN_VALUE_SLOPE_THETA)
-                       | (ONE << GWY_GRAIN_VALUE_CURVATURE_ANGLE1)
-                       | (ONE << GWY_GRAIN_VALUE_CURVATURE_ANGLE2))
-    };
-
-    g_return_val_if_fail(GWY_IS_SI_UNIT(siunitxy), result);
-    g_return_val_if_fail(GWY_IS_SI_UNIT(siunitz), result);
-
-    if ((ONE << quantity) & coord_units)
-        return gwy_si_unit_power(siunitxy, 1, result);
-    if ((ONE << quantity) & icoord_units)
-        return gwy_si_unit_power(siunitxy, -1, result);
-    if ((ONE << quantity) & value_units)
-        return gwy_si_unit_power(siunitz, 1, result);
-    if ((ONE << quantity) & area_units)
-        return gwy_si_unit_power(siunitxy, 2, result);
-    if ((ONE << quantity) & volume_units)
-        return gwy_si_unit_power_multiply(siunitxy, 2, siunitz, 1, result);
-    if ((ONE << quantity) & angle_units) {
-        if (!result)
-            return gwy_si_unit_new(NULL);
-        gwy_si_unit_set_from_string(result, NULL);
-        return result;
-    }
-
-    g_return_val_if_reached(result);
-}
-
-/**
- * gwy_data_field_grains_add:
- * @grain_field: Field of marked grains (mask).
- * @add_field: Field of marked grains (mask) to be added.
- *
- * Adds @add_field grains to @grain_field.
- *
- * Note: This function is equivalent to
- * |[
- * gwy_data_field_max_of_fields(grain_field, grain_field, add_field);
- * ]|
- **/
-void
-gwy_data_field_grains_add(GwyDataField *grain_field, GwyDataField *add_field)
-{
-    gwy_data_field_max_of_fields(grain_field, grain_field, add_field);
-}
-
-/**
- * gwy_data_field_grains_intersect:
- * @grain_field: Field of marked grains (mask).
- * @intersect_field: Field of marked grains (mask).
- *
- * Performs intersection betweet two grain fields,
- * result is stored in @grain_field.
- *
- * Note: This function is equivalent to
- * |[
- * gwy_data_field_min_of_fields(grain_field, grain_field, intersect_field);
- * ]|
- **/
-void
-gwy_data_field_grains_intersect(GwyDataField *grain_field,
-                                GwyDataField *intersect_field)
-{
-    gwy_data_field_min_of_fields(grain_field, grain_field, intersect_field);
-}
-
-/**
- * gwy_data_field_grains_invert:
- * @grain_field: Data field (mask) of marked grains.
- *
- * Inverts a data field representing a mask.
- *
- * All non-positive values are transformed to 1.0.  All positive values are
- * transformed to 0.0.
- *
- * Since: 2.43
- **/
-void
-gwy_data_field_grains_invert(GwyDataField *grain_field)
-{
-    guint xres, yres, k;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(grain_field));
-    xres = grain_field->xres;
-    yres = grain_field->yres;
-    for (k = 0; k < xres*yres; k++) {
-        if (grain_field->data[k] > 0.0)
-            grain_field->data[k] = 0.0;
-        else
-            grain_field->data[k] = 1.0;
-    }
-}
-
-/**
- * gwy_data_field_grains_autocrop:
- * @mask_field: Data field representing a mask.
- * @symmetrically: %TRUE to remove borders symmetrically, i.e the same number
- *                 of pixels from left and right, and also top and bottom.
- *                 %FALSE to remove as many empty rows and columns as possible.
- * @left: Location to store how many column were removed from the left, or
- *        %NULL.
- * @right: Location to store how many column were removed from the right, or
- *         %NULL.
- * @up: Location to store how many row were removed from the top, or %NULL.
- * @down: Location to store how many row were removed from the bottom, or
- *        %NULL.
- *
- * Removes empty border rows and columns from a data field representing a mask.
- *
- * If there are border rows and columns filled completely with non-positive
- * values the size of the data field is reduced, removing these rows.  The
- * parameter @symmetrically controls whether the size reduction is maximum
- * possible or symmetrical.
- *
- * When there is no positive value in the field the field size is reduced to
- * the smallest possible.  This means 1x1 for @symmetrical being %FALSE and
- * even original dimensions to 2 for @symmetrical being %TRUE.
- *
- * Returns: %TRUE if the field size was reduced at all.  Detailed information
- *          about the reduction can be obtained from @left, @right, @up and
- *          @down.
- *
- * Since: 2.43
- **/
-gboolean
-gwy_data_field_grains_autocrop(GwyDataField *mask_field,
-                               gboolean symmetrically,
-                               guint *left,
-                               guint *right,
-                               guint *up,
-                               guint *down)
-{
-    gint xres, yres, i, j, firstcol, firstrow, lastcol, lastrow;
-    const gdouble *d;
-
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(mask_field), FALSE);
-    xres = mask_field->xres;
-    yres = mask_field->yres;
-    firstcol = xres;
-    firstrow = yres;
-    lastcol = lastrow = -1;
-    d = mask_field->data;
-    for (i = 0; i < yres; i++) {
-        for (j = 0; j < xres; j++, d++) {
-            if (*d > 0.0) {
-                if (G_UNLIKELY(i < firstrow))
-                    firstrow = i;
-                if (G_UNLIKELY(j < firstcol))
-                    firstcol = j;
-                if (G_UNLIKELY(i > lastrow))
-                    lastrow = i;
-                if (G_UNLIKELY(j > lastcol))
-                    lastcol = j;
-            }
-        }
-    }
-    gwy_debug("first (%d,%d) last (%d,%d)",
-              firstcol, firstrow, lastcol, lastrow);
-    if (firstcol > lastcol) {
-        g_assert(firstrow > lastrow);
-        /* Anticipate the reduction to 2 for even-sized dimensions. */
-        lastcol = (xres - 1)/2;
-        firstcol = xres - lastcol;
-        lastrow = (yres - 1)/2;
-        firstrow = yres - lastrow;
-    }
-    if (symmetrically) {
-        firstcol = MIN(firstcol, xres-1 - lastcol);
-        lastcol = xres-1 - firstcol;
-        firstrow = MIN(firstrow, yres-1 - lastrow);
-        lastrow = yres-1 - firstrow;
-    }
-    lastcol++;
-    lastrow++;
-
-    if (left)
-        *left = firstcol;
-    if (right)
-        *right = xres - lastcol;
-    if (up)
-        *up = firstrow;
-    if (down)
-        *down = yres - lastrow;
-
-    gwy_debug("%dx%d at (%d,%d) of %dx%d",
-              lastcol-firstcol, lastrow-firstrow, firstcol, firstrow,
-              xres, yres);
-    if (firstcol == 0 && firstrow == 0 && lastcol == xres && lastrow == yres)
-        return FALSE;
-
-    gwy_data_field_resize(mask_field, firstcol, firstrow, lastcol, lastrow);
-    return TRUE;
-}
-
-void
-gwy_data_field_grains_splash_water(GwyDataField *data_field,
-                                   GwyDataField *water,
-                                   gint locate_steps,
-                                   gdouble locate_dropsize)
-{
-    GwyDataField *mark_dfield;
-    gint i;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-
-    mark_dfield = gwy_data_field_duplicate(data_field);
-
-    /* odrop */
-    gwy_data_field_clear(water);
-    for (i = 0; i < locate_steps; i++)
-        drop_step(mark_dfield, water, locate_dropsize);
-
-    gwy_data_field_invalidate(water);
-    g_object_unref(mark_dfield);
-}
-
-
-/****************************************************************************/
-/*private functions*/
-
-static gboolean
-step_by_one(GwyDataField *data_field, gint *rcol, gint *rrow)
-{
-    gint xres, yres;
-    gdouble a, b, c, d, v;
-
-    xres = data_field->xres;
-    yres = data_field->yres;
-
-    if (*rcol < (xres - 1))
-        a = data_field->data[*rcol + 1 + xres*(*rrow)];
-    else
-        a = -G_MAXDOUBLE;
-
-    if (*rcol > 0)
-        b = data_field->data[*rcol - 1 + xres*(*rrow)];
-    else
-        b = -G_MAXDOUBLE;
-
-    if (*rrow < (yres - 1))
-        c = data_field->data[*rcol + xres*(*rrow + 1)];
-    else
-        c = -G_MAXDOUBLE;
-
-    if (*rrow > 0)
-        d = data_field->data[*rcol + xres*(*rrow - 1)];
-    else
-        d = -G_MAXDOUBLE;
-
-    v = data_field->data[(gint)(*rcol + xres*(*rrow))];
-
-    if (v >= a && v >= b && v >= c && v >= d) {
-        return TRUE;
-    }
-    else if (a >= v && a >= b && a >= c && a >= d) {
-        *rcol += 1;
-        return FALSE;
-    }
-    else if (b >= v && b >= a && b >= c && b >= d) {
-        *rcol -= 1;
-        return FALSE;
-    }
-    else if (c >= v && c >= b && c >= a && c >= d) {
-        *rrow += 1;
-        return FALSE;
-    }
-    else {
-        *rrow -= 1;
-        return FALSE;
-    }
-
-    return FALSE;
-}
-
-static void
-drop_step(GwyDataField *data_field, GwyDataField *water_field, gdouble dropsize)
-{
-    gint xres, yres, i;
-    gint col, row;
-    gboolean retval;
-
-    xres = data_field->xres;
-    yres = data_field->yres;
-
-    for (i = 0; i < xres*yres; i++) {
-        row = (gint)floor((gdouble)i/(gdouble)xres);
-        col = i - xres*row;
-        if (col == 0 || row == 0 || col == (xres - 1) || row == (yres - 1))
-            continue;
-
-        do {
-            retval = step_by_one(data_field, &col, &row);
-        } while (!retval);
-
-        water_field->data[col + xres*row] += 1;
-        data_field->data[col + xres*row] -= dropsize;
-
-    }
-    gwy_data_field_invalidate(water_field);
-    gwy_data_field_invalidate(data_field);
-}
-
-static void
-drop_minima(GwyDataField *water_field, GwyDataField *min_field, gint threshval)
-{
-    gint xres, yres, i, j, ngrains;
-    gint *grain_maxima, *grain_size;
-    gdouble *data;
-    gint *grains;
-
-    xres = water_field->xres;
-    yres = water_field->yres;
-    data = water_field->data;
-
-    grains = g_new0(gint, xres*yres);
-    ngrains = gwy_data_field_number_grains(water_field, grains);
-    grain_size = g_new0(gint, ngrains + 1);
-    grain_maxima = g_new(gint, ngrains + 1);
-    for (i = 1; i <= ngrains; i++)
-        grain_maxima[i] = -1;
-
-    /* sum grain sizes and find maxima */
-    for (i = 0; i < xres*yres; i++) {
-        j = grains[i];
-        if (!j)
-            continue;
-
-        grain_size[j]++;
-        if (grain_maxima[j] < 0
-            || data[grain_maxima[j]] < data[i])
-            grain_maxima[j] = i;
-    }
-    g_free(grains);
-
-    /* mark maxima */
-    for (i = 1; i <= ngrains; i++) {
-        if (grain_size[i] <= threshval)
-            continue;
-
-        min_field->data[grain_maxima[i]] = i;
-    }
-
-    g_free(grain_maxima);
-    g_free(grain_size);
-}
-
-static void
-process_mask(GwyDataField *grain_field, gint col, gint row)
-{
-    gint xres, yres, ival[4], val, i;
-    gboolean stat;
-    gdouble *data;
-
-    xres = grain_field->xres;
-    yres = grain_field->yres;
-    data = grain_field->data;
-
-    if (col == 0 || row == 0 || col == (xres - 1) || row == (yres - 1)) {
-        data[col + xres*row] = -1;
-        return;
-    }
-
-    /*if this is grain or boundary, keep it */
-    if (data[col + xres*row] != 0)
-        return;
-
-    /*if there is nothing around, do nothing */
-    if ((fabs(data[col + 1 + xres*row]) + fabs(data[col - 1 + xres*row])
-         + fabs(data[col + xres*(row + 1)]) + fabs(data[col + xres*(row - 1)]))
-        == 0)
-        return;
-
-    /*now count the grain values around */
-    ival[0] = data[col - 1 + xres*row];
-    ival[1] = data[col + xres*(row - 1)];
-    ival[2] = data[col + 1 + xres*row];
-    ival[3] = data[col + xres*(row + 1)];
-
-    val = 0;
-    stat = FALSE;
-    for (i = 0; i < 4; i++) {
-        if (val > 0 && ival[i] > 0 && ival[i] != val) {
-            /*if some value already was there and the now one is different */
-            stat = TRUE;
-            break;
-        }
-        else {
-            /*ifthere is some value */
-            if (ival[i] > 0) {
-                val = ival[i];
-            }
-        }
-    }
-
-    /*it will be boundary or grain */
-    data[col + xres*row] = stat ? -1 : val;
-}
-
-static void
-wdrop_step(GwyDataField *data_field, GwyDataField *min_field,
-           GwyDataField *water_field, GwyDataField *grain_field,
-           gdouble dropsize)
-{
-    gint xres, yres, vcol, vrow, col, row, grain;
-    gboolean retval;
-
-    xres = data_field->xres;
-    yres = data_field->yres;
-
-    grain = 0;
-    for (col = 0; col < xres; col++) {
-        for (row = 0; row < yres; row++) {
-            if (min_field->data[col + xres*row] > 0)
-                grain_field->data[col + xres*row] = grain++;
-        }
-    }
-    for (col = 1; col < xres - 1; col++) {
-        for (row = 1; row < yres - 1; row++) {
-
-            vcol = col;
-            vrow = row;
-            do {
-                retval = step_by_one(data_field, &vcol, &vrow);
-            } while (!retval);
-
-            /*now, distinguish what to change at point vi, vj */
-            process_mask(grain_field, vcol, vrow);
-            water_field->data[vcol + xres*(vrow)] += 1;
-            data_field->data[vcol + xres*(vrow)] -= dropsize;
-
-        }
-    }
-}
-
-static void
-mark_grain_boundaries(GwyDataField *grain_field)
-{
-    gint xres, yres, col, row;
-    GwyDataField *buffer;
-    gdouble *data;
-
-    xres = grain_field->xres;
-    yres = grain_field->yres;
-    /* FIXME: it is not necessary to duplicate complete data field to check
-     * a few boundary pixels. */
-    buffer = gwy_data_field_duplicate(grain_field);
-    data = buffer->data;
-
-    for (col = 1; col < xres - 1; col++) {
-        for (row = 1; row < yres - 1; row++) {
-            if (data[col + xres*row] != data[col + 1 + xres*row]
-                || data[col + xres*row] != data[col + xres*(row + 1)])
-                grain_field->data[col + xres*row] = 0;
-        }
-    }
-    g_object_unref(buffer);
+    gwy_data_field_resize(mask_field, firstcol, firstrow, lastcol, lastrow);
+    return TRUE;
 }
 
 /* Merge grains i and j in map with full resolution */
@@ -4259,679 +1473,81 @@ gwy_data_field_fill_one_grain(gint xres,
     listh[0] = listh[1] = initial;
     nh = 2;
 
-    while (nv) {
-        /* go through vertical lines and expand them horizontally */
-        for (i = 0; i < nv; i += 2) {
-            for (p = listv[i]; p <= listv[i + 1]; p += xres) {
-                gint start, stop;
-
-                /* scan left */
-                start = p - 1;
-                stop = (p/xres)*xres;
-                for (j = start; j >= stop; j--) {
-                    if (visited[j] || data[j] != look_for)
-                        break;
-                    visited[j] = grain_no;
-                    count++;
-                }
-                if (j < start) {
-                    listh[nh++] = j + 1;
-                    listh[nh++] = start;
-                }
-
-                /* scan right */
-                start = p + 1;
-                stop = (p/xres + 1)*xres;
-                for (j = start; j < stop; j++) {
-                    if (visited[j] || data[j] != look_for)
-                        break;
-                    visited[j] = grain_no;
-                    count++;
-                }
-                if (j > start) {
-                    listh[nh++] = start;
-                    listh[nh++] = j - 1;
-                }
-            }
-        }
-        nv = 0;
-
-        /* go through horizontal lines and expand them vertically */
-        for (i = 0; i < nh; i += 2) {
-            for (p = listh[i]; p <= listh[i + 1]; p++) {
-                gint start, stop;
-
-                /* scan up */
-                start = p - xres;
-                stop = p % xres;
-                for (j = start; j >= stop; j -= xres) {
-                    if (visited[j] || data[j] != look_for)
-                        break;
-                    visited[j] = grain_no;
-                    count++;
-                }
-                if (j < start) {
-                    listv[nv++] = j + xres;
-                    listv[nv++] = start;
-                }
-
-                /* scan down */
-                start = p + xres;
-                stop = p % xres + n;
-                for (j = start; j < stop; j += xres) {
-                    if (visited[j] || data[j] != look_for)
-                        break;
-                    visited[j] = grain_no;
-                    count++;
-                }
-                if (j > start) {
-                    listv[nv++] = start;
-                    listv[nv++] = j - xres;
-                }
-            }
-        }
-        nh = 0;
-    }
-
-    return count;
-}
-
-/* Euclidean distance transform */
-
-enum {
-    SEDINF = 0x7fffffffu,
-    QUEUED = 0x80000000u,
-};
-
-typedef struct {
-    guint size;
-    guint len;
-    gint *data;
-} IntList;
-
-static inline IntList*
-int_list_new(guint prealloc)
-{
-    IntList *list = g_slice_new0(IntList);
-    prealloc = MAX(prealloc, 16);
-    list->size = prealloc;
-    list->data = g_new(gint, list->size);
-    return list;
-}
-
-static inline void
-int_list_add(IntList *list, gint i)
-{
-    if (G_UNLIKELY(list->len == list->size)) {
-        list->size = MAX(2*list->size, 16);
-        list->data = g_renew(gint, list->data, list->size);
-    }
-
-    list->data[list->len] = i;
-    list->len++;
-}
-
-static inline void
-int_list_add_unique(IntList **plist, gint i)
-{
-    IntList *list;
-    guint j;
-
-    if (!*plist)
-        *plist = int_list_new(0);
-
-    list = *plist;
-    for (j = 0; j < list->len; j++) {
-        if (list->data[j] == i)
-            return;
-    }
-    int_list_add(list, i);
-}
-
-static void
-int_list_free(IntList *list)
-{
-    g_free(list->data);
-    g_slice_free(IntList, list);
-}
-
-
-// Set squared distance for all points that have an 8-neighbour outside and
-// add them to the queue.
-static void
-distance_transform_first_step(guint *distances,
-                              guint xres, guint yres,
-                              IntList *queue,
-                              gboolean from_border)
-{
-    guint k = 0, j, i;
-
-    queue->len = 0;
-    for (i = 0; i < yres; i++) {
-        gboolean first_row = (i == 0);
-        gboolean last_row = (i == yres-1);
-
-        for (j = 0; j < xres; j++, k++) {
-            gboolean first_column = (j == 0);
-            gboolean last_column = (j == xres-1);
-
-            if (!distances[k])
-                continue;
-
-            if ((from_border && (first_row || first_column
-                                 || last_row || last_column))
-                || (!first_row && !distances[k-xres])
-                || (!first_column && !distances[k-1])
-                || (!last_column && !distances[k+1])
-                || (!last_row && !distances[k+xres])) {
-                distances[k] = 1;
-                int_list_add(queue, k);
-            }
-            else if ((!first_row && !first_column && !distances[k-xres-1])
-                     || (!first_row && !last_column && !distances[k-xres+1])
-                     || (!last_row && !first_column && !distances[k+xres-1])
-                     || (!last_row && !last_column && !distances[k+xres+1])) {
-                distances[k] = 2;
-                int_list_add(queue, k);
-            }
-        }
-    }
-}
-
-static void
-distance_transform_erode_sed(guint *distances, const guint *olddist,
-                             guint xres, guint yres,
-                             guint l,
-                             const IntList *inqueue,
-                             IntList *outqueue)
-{
-    guint hvsed2 = 2*l - 1, diag2 = 2*hvsed2;
-    guint q;
-
-    outqueue->len = 0;
-
-    for (q = 0; q < inqueue->len; q++) {
-        guint k = inqueue->data[q], kk = k-xres-1;
-        guint i = k/xres, j = k % xres;
-        gboolean first_row = (i == 0);
-        gboolean last_row = (i == yres-1);
-        gboolean first_column = (j == 0);
-        gboolean last_column = (j == xres-1);
-        guint d2hv = olddist[k] + hvsed2, d2d = olddist[k] + diag2;
-
-        if (!first_row && !first_column && (distances[kk] & ~QUEUED) > d2d) {
-            if (!(distances[kk] & QUEUED))
-                int_list_add(outqueue, kk);
-            distances[kk] = QUEUED | d2d;
-        }
-        kk++;
-        if (!first_row && (distances[kk] & ~QUEUED) > d2hv) {
-            if (!(distances[kk] & QUEUED))
-                int_list_add(outqueue, kk);
-            distances[kk] = QUEUED | d2hv;
-        }
-        kk++;
-        if (!first_row && !last_column && (distances[kk] & ~QUEUED) > d2d) {
-            if (!(distances[kk] & QUEUED))
-                int_list_add(outqueue, kk);
-            distances[kk] = QUEUED | d2d;
-        }
-        kk += xres-2;
-        if (!first_column && (distances[kk] & ~QUEUED) > d2hv) {
-            if (!(distances[kk] & QUEUED))
-                int_list_add(outqueue, kk);
-            distances[kk] = QUEUED | d2hv;
-        }
-        kk += 2;
-        if (!last_column && (distances[kk] & ~QUEUED) > d2hv) {
-            if (!(distances[kk] & QUEUED))
-                int_list_add(outqueue, kk);
-            distances[kk] = QUEUED | d2hv;
-        }
-        kk += xres-2;
-        if (!last_row && !first_column && (distances[kk] & ~QUEUED) > d2d) {
-            if (!(distances[kk] & QUEUED))
-                int_list_add(outqueue, kk);
-            distances[kk] = QUEUED | d2d;
-        }
-        kk++;
-        if (!last_row && (distances[kk] & ~QUEUED) > d2hv) {
-            if (!(distances[kk] & QUEUED))
-                int_list_add(outqueue, kk);
-            distances[kk] = QUEUED | d2hv;
-        }
-        kk++;
-        if (!last_row && !last_column && (distances[kk] & ~QUEUED) > d2d) {
-            if (!(distances[kk] & QUEUED))
-                int_list_add(outqueue, kk);
-            distances[kk] = QUEUED | d2d;
-        }
-    }
-}
-
-/**
- * _gwy_distance_transform_raw:
- * @distances: Array @xres*@yres with nonzeroes within shapes.  If all non-zero
- *             values are %SEDINF you can pass %TRUE for @infinitised.
- * @workspace: Workspace of identical dimensions as @distances.
- * @xres: Width.
- * @yres: Height.
- * @inqueue: Pre-allocated queue used by the algorithm.
- * @outqueue: Second pre-allocated queue used by the algorithm.
- * @from_border: %TRUE to consider image edges to be grain boundaries.
- *
- * Performs distance transformation.
- *
- * When it finishes non-zero values in @distances are squared Euclidean
- * distances from outside pixels (including outside the field).
- *
- * Workspace objects @workspace, @inqueue and @outqueue do not carry any
- * information.  They are allocated by the caller to enable an efficient
- * repeated use.
- **/
-static void
-distance_transform_raw(guint *distances, guint *workspace,
-                       guint xres, guint yres,
-                       IntList *inqueue, IntList *outqueue,
-                       gboolean from_border)
-{
-    guint l, q;
-
-    distance_transform_first_step(distances, xres, yres, inqueue, from_border);
-
-    for (l = 2; inqueue->len; l++) {
-        gint *qdata;
-
-        for (q = 0; q < inqueue->len; q++) {
-            guint k = inqueue->data[q];
-            workspace[k] = distances[k];
-        }
-        distance_transform_erode_sed(distances, workspace, xres, yres, l,
-                                     inqueue, outqueue);
-
-        qdata = outqueue->data;
-        for (q = outqueue->len; q; q--, qdata++)
-            distances[*qdata] &= ~QUEUED;
-
-        GWY_SWAP(IntList*, inqueue, outqueue);
-    }
-}
-
-static void
-gwy_data_field_grain_distance_transform_internal(GwyDataField *data_field,
-                                                 gboolean from_border)
-{
-    IntList *inqueue, *outqueue;
-    guint xres, yres, k, inisize;
-    guint *distances, *workspace;
-    gdouble *d;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-
-    xres = data_field->xres;
-    yres = data_field->yres;
-    d = data_field->data;
-    distances = g_new(guint, xres*yres);
-    workspace = g_new(guint, xres*yres);
-
-    for (k = 0; k < xres*yres; k++)
-        distances[k] = (d[k] > 0.0) ? SEDINF : 0;
-
-    inisize = (guint)(8*sqrt(xres*yres) + 16);
-    inqueue = int_list_new(inisize);
-    outqueue = int_list_new(inisize);
-
-    distance_transform_raw(distances, workspace, xres, yres, inqueue, outqueue,
-                           from_border);
-
-    int_list_free(inqueue);
-    int_list_free(outqueue);
-
-    for (k = 0; k < xres*yres; k++)
-        d[k] = sqrt(distances[k]);
-    gwy_data_field_invalidate(data_field);
-
-    g_free(workspace);
-    g_free(distances);
-}
-
-/**
- * gwy_data_field_grain_distance_transform:
- * @data_field: A data field with zeroes in empty space and nonzeroes in
- *              grains.
- *
- * Performs Euclidean distance transform of a data field with grains.
- *
- * Each non-zero value will be replaced with Euclidean distance to the grain
- * boundary, measured in pixels.
- *
- * See also gwy_data_field_grain_simple_dist_trans() for simple distance
- * transforms such as city-block or chessboard.
- *
- * Since: 2.36
- **/
-void
-gwy_data_field_grain_distance_transform(GwyDataField *data_field)
-{
-    gwy_data_field_grain_distance_transform_internal(data_field, TRUE);
-}
-
-/* Perform a cityblock, chessboard or octagonal distance transform of given
- * type using provided queues. */
-static guint
-simple_dist_trans(gint *grain, guint width, guint height,
-                  gboolean from_border, GwyDistanceTransformType dtype,
-                  PixelQueue *inqueue, PixelQueue *outqueue)
-{
-    ErodeFunc erode = NULL;
-    guint dist = 1;
-
-    inqueue->len = outqueue->len = 0;
-
-    if (dtype == GWY_DISTANCE_TRANSFORM_CONN4
-        || dtype == GWY_DISTANCE_TRANSFORM_OCTAGONAL48)
-        init_erosion_4(grain, width, height, from_border, inqueue);
-    else if (dtype == GWY_DISTANCE_TRANSFORM_CONN8
-             || dtype == GWY_DISTANCE_TRANSFORM_OCTAGONAL84)
-        init_erosion_8(grain, width, height, from_border, inqueue);
-
-    if (dtype == GWY_DISTANCE_TRANSFORM_CONN4
-        || dtype == GWY_DISTANCE_TRANSFORM_OCTAGONAL84)
-        erode = erode_4;
-    else if (dtype == GWY_DISTANCE_TRANSFORM_CONN8
-             || dtype == GWY_DISTANCE_TRANSFORM_OCTAGONAL48)
-        erode = erode_8;
-
-    g_return_val_if_fail(erode, 0);
-
-    while (TRUE) {
-        if (!erode(grain, width, height, dist, inqueue, outqueue))
-            break;
-        GWY_SWAP(PixelQueue*, inqueue, outqueue);
-        dist++;
-
-        if (dtype == GWY_DISTANCE_TRANSFORM_OCTAGONAL48
-            || dtype == GWY_DISTANCE_TRANSFORM_OCTAGONAL84)
-            erode = (erode == erode_4) ? erode_8 : erode_4;
-    }
-
-    if (!from_border) {
-        guint k;
-
-        /* Fix single-pixel grains touching the image borders. */
-        for (k = 0; k < width; k++) {
-            if (grain[k] == G_MAXUINT)
-                grain[k] = 1;
-            if (grain[width*(height-1) + k] == G_MAXUINT)
-                grain[width*(height-1) + k] = 1;
-        }
-
-        for (k = 0; k < height; k++) {
-            if (grain[k*width] == G_MAXUINT)
-                grain[k*width] = 1;
-            if (grain[k*width + width-1] == G_MAXUINT)
-                grain[k*width + width-1] = 1;
-        }
-    }
-
-    return dist;
-}
-
-static void
-average_octagonal_dt(GwyDataField *dfield, gboolean from_border)
-{
-    GwyDataField *tmp;
-
-    tmp = gwy_data_field_duplicate(dfield);
-    gwy_data_field_grain_simple_dist_trans(dfield,
-                                           GWY_DISTANCE_TRANSFORM_OCTAGONAL48,
-                                           from_border);
-    gwy_data_field_grain_simple_dist_trans(tmp,
-                                           GWY_DISTANCE_TRANSFORM_OCTAGONAL84,
-                                           from_border);
-    gwy_data_field_sum_fields(dfield, dfield, tmp);
-    gwy_data_field_multiply(dfield, 0.5);
-    g_object_unref(tmp);
-}
-
-/**
- * gwy_data_field_grain_simple_dist_trans:
- * @data_field: A data field with zeroes in empty space and nonzeroes in
- *              grains.
- * @dtype: Type of simple distance to use.
- * @from_border: %TRUE to consider image edges to be grain boundaries.
- *
- * Performs a distance transform of a data field with grains.
- *
- * Each non-zero value will be replaced with a distance to the grain boundary,
- * measured in pixels.
- *
- * Note this function can calculate the true Euclidean distance transform
- * only since 2.43.  Use gwy_data_field_grain_distance_transform() for the EDT
- * if you need compatibility with older versions.
- *
- * Since: 2.41
- **/
-void
-gwy_data_field_grain_simple_dist_trans(GwyDataField *data_field,
-                                       GwyDistanceTransformType dtype,
-                                       gboolean from_border)
-{
-    guint *grains = NULL;
-    PixelQueue *inqueue, *outqueue;
-    gdouble *d;
-    guint xres, yres, k;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-
-    if (dtype == GWY_DISTANCE_TRANSFORM_EUCLIDEAN) {
-        gwy_data_field_grain_distance_transform_internal(data_field,
-                                                         from_border);
-        return;
-    }
-    if (dtype == GWY_DISTANCE_TRANSFORM_OCTAGONAL) {
-        average_octagonal_dt(data_field, from_border);
-        return;
-    }
-
-    g_return_if_fail(dtype <= GWY_DISTANCE_TRANSFORM_OCTAGONAL84);
-
-    xres = data_field->xres;
-    yres = data_field->yres;
-    d = data_field->data;
-    inqueue = g_slice_new0(PixelQueue);
-    outqueue = g_slice_new0(PixelQueue);
-    grains = g_new(guint, xres*yres);
-    for (k = 0; k < xres*yres; k++)
-        grains[k] = (d[k] > 0.0) ? G_MAXUINT : 0;
-
-    simple_dist_trans(grains, xres, yres, from_border, dtype,
-                      inqueue, outqueue);
-
-    for (k = 0; k < xres*yres; k++)
-        d[k] = grains[k];
-
-    g_free(grains);
-    g_free(inqueue->points);
-    g_free(outqueue->points);
-    g_slice_free(PixelQueue, inqueue);
-    g_slice_free(PixelQueue, outqueue);
-}
-
-/**
- * gwy_data_field_grains_shrink:
- * @data_field: A data field with zeroes in empty space and nonzeroes in
- *              grains.
- * @amount: How much the grains should be reduced, in pixels.  It is inclusive,
- *          i.e. pixels that are @amount far from the border will be removed.
- * @dtype: Type of simple distance to use.
- * @from_border: %TRUE to consider image edges to be grain boundaries.
- *               %FALSE to reduce grains touching field boundaries only along
- *               the boundaries.
- *
- * Erodes a data field containing mask by specified amount using a distance
- * measure.
- *
- * Non-zero pixels in @data_field will be replaced with zeroes if they are not
- * farther than @amount from the grain boundary as defined by @dtype.
- *
- * Since: 2.43
- **/
-void
-gwy_data_field_grains_shrink(GwyDataField *data_field,
-                             gdouble amount,
-                             GwyDistanceTransformType dtype,
-                             gboolean from_border)
-{
-    GwyDataField *edt;
-    guint xres, yres, k;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(dtype <= GWY_DISTANCE_TRANSFORM_EUCLIDEAN);
-
-    if (amount < 0.5)
-        return;
-
-    xres = data_field->xres;
-    yres = data_field->yres;
-    edt = gwy_data_field_duplicate(data_field);
-    gwy_data_field_grain_simple_dist_trans(edt, dtype, from_border);
-    for (k = 0; k < xres*yres; k++) {
-        if (edt->data[k] <= amount + 1e-9)
-            data_field->data[k] = 0.0;
-    }
-
-    g_object_unref(edt);
-    gwy_data_field_invalidate(data_field);
-}
-
-static gint
-compare_distant_points(gconstpointer pa, gconstpointer pb)
-{
-    const DistantPoint *a = (const DistantPoint*)pa;
-    const DistantPoint *b = (const DistantPoint*)pb;
-
-    if (a->distance < b->distance)
-        return -1;
-    if (a->distance > b->distance)
-        return 1;
-    if (a->i < b->i)
-        return -1;
-    if (a->i > b->i)
-        return 1;
-    if (a->j < b->j)
-        return -1;
-    if (a->j > b->j)
-        return 1;
-    return 0;
-}
-
-static void
-grow_without_merging(GwyDataField *dfield, GwyDataField *edt, gdouble amount)
-{
-    GArray *array;
-    guint xres, yres, i, j, k, m;
-    gdouble *d, *e;
-    gint *grains;
+    while (nv) {
+        /* go through vertical lines and expand them horizontally */
+        for (i = 0; i < nv; i += 2) {
+            for (p = listv[i]; p <= listv[i + 1]; p += xres) {
+                gint start, stop;
 
-    xres = dfield->xres;
-    yres = dfield->yres;
-    d = dfield->data;
-    e = edt->data;
-    grains = g_new0(gint, xres*yres);
-    if (!gwy_data_field_number_grains(dfield, grains)) {
-        g_free(grains);
-        return;
-    }
+                /* scan left */
+                start = p - 1;
+                stop = (p/xres)*xres;
+                for (j = start; j >= stop; j--) {
+                    if (visited[j] || data[j] != look_for)
+                        break;
+                    visited[j] = grain_no;
+                    count++;
+                }
+                if (j < start) {
+                    listh[nh++] = j + 1;
+                    listh[nh++] = start;
+                }
 
-    array = g_array_sized_new(FALSE, FALSE, sizeof(DistantPoint), 1000);
-    for (i = 0; i < yres; i++) {
-        for (j = 0; j < xres; j++) {
-            gdouble eij = e[i*xres + j];
-            if (eij > 0.0 && eij <= amount) {
-                DistantPoint dp = { eij, i, j };
-                g_array_append_val(array, dp);
+                /* scan right */
+                start = p + 1;
+                stop = (p/xres + 1)*xres;
+                for (j = start; j < stop; j++) {
+                    if (visited[j] || data[j] != look_for)
+                        break;
+                    visited[j] = grain_no;
+                    count++;
+                }
+                if (j > start) {
+                    listh[nh++] = start;
+                    listh[nh++] = j - 1;
+                }
             }
         }
-    }
-    g_array_sort(array, compare_distant_points);
-
-    for (m = 0; m < array->len; m++) {
-        const DistantPoint *dp = &g_array_index(array, DistantPoint, m);
-        gint g1, g2, g3, g4, gno;
-
-        k = dp->i*xres + dp->j;
-        g1 = dp->i > 0      ? grains[k-xres] : 0;
-        g2 = dp->j > 0      ? grains[k-1]    : 0;
-        g3 = dp->j < xres-1 ? grains[k+1]    : 0;
-        g4 = dp->i < yres-1 ? grains[k+xres] : 0;
-        /* If all are equal or zeroes then bitwise or gives us the nonzero
-         * value sought. */
-        gno = g1 | g2 | g3 | g4;
-        if ((!g1 || g1 == gno)
-            && (!g2 || g2 == gno)
-            && (!g3 || g3 == gno)
-            && (!g4 || g4 == gno)) {
-            grains[k] = gno;
-            d[k] = 1.0;
-        }
-    }
-
-    g_array_free(array, TRUE);
-    g_free(grains);
-}
-
-/**
- * gwy_data_field_grains_grow:
- * @data_field: A data field with zeroes in empty space and nonzeroes in
- *              grains.
- * @amount: How much the grains should be expanded, in pixels.  It is
- *          inclusive, i.e. exterior pixels that are @amount far from the
- *          border will be filled.
- * @dtype: Type of simple distance to use.
- * @prevent_merging: %TRUE to prevent grain merging, i.e. the growth stops
- *                   where two grains would merge.  %FALSE to simply expand the
- *                   grains, without regard to grain connectivity.
- *
- * Dilates a data field containing mask by specified amount using a distance
- * measure.
- *
- * Non-positive pixels in @data_field will be replaced with ones if they are
- * not farther than @amount from the grain boundary as defined by @dtype.
- *
- * Since: 2.43
- **/
-void
-gwy_data_field_grains_grow(GwyDataField *data_field,
-                           gdouble amount,
-                           GwyDistanceTransformType dtype,
-                           gboolean prevent_merging)
-{
-    GwyDataField *edt;
-    guint xres, yres, k;
+        nv = 0;
 
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(dtype <= GWY_DISTANCE_TRANSFORM_EUCLIDEAN);
+        /* go through horizontal lines and expand them vertically */
+        for (i = 0; i < nh; i += 2) {
+            for (p = listh[i]; p <= listh[i + 1]; p++) {
+                gint start, stop;
 
-    if (amount < 0.5)
-        return;
+                /* scan up */
+                start = p - xres;
+                stop = p % xres;
+                for (j = start; j >= stop; j -= xres) {
+                    if (visited[j] || data[j] != look_for)
+                        break;
+                    visited[j] = grain_no;
+                    count++;
+                }
+                if (j < start) {
+                    listv[nv++] = j + xres;
+                    listv[nv++] = start;
+                }
 
-    amount += 1e-9;
-    xres = data_field->xres;
-    yres = data_field->yres;
-    edt = gwy_data_field_duplicate(data_field);
-    gwy_data_field_grains_invert(edt);
-    gwy_data_field_grain_simple_dist_trans(edt, dtype, FALSE);
-    if (prevent_merging)
-        grow_without_merging(data_field, edt, amount);
-    else {
-        for (k = 0; k < xres*yres; k++) {
-            if (edt->data[k] <= amount)
-                data_field->data[k] = 1.0;
+                /* scan down */
+                start = p + xres;
+                stop = p % xres + n;
+                for (j = start; j < stop; j += xres) {
+                    if (visited[j] || data[j] != look_for)
+                        break;
+                    visited[j] = grain_no;
+                    count++;
+                }
+                if (j > start) {
+                    listv[nv++] = start;
+                    listv[nv++] = j - xres;
+                }
+            }
         }
+        nh = 0;
     }
-    g_object_unref(edt);
-    gwy_data_field_invalidate(data_field);
+
+    return count;
 }
 
 /**
@@ -5101,707 +1717,6 @@ gwy_data_field_fill_voids(GwyDataField *data_field,
     return changed_ever;
 }
 
-static gint
-waterpour_decide(const gint *assigned, gint xres, gint yres, gint km)
-{
-    gint i = km/xres, j = km % xres;
-    gint idu = (i ? assigned[km-xres] : GRAIN_BARRIER),
-         idl = (j ? assigned[km-1] : GRAIN_BARRIER),
-         idr = (j < xres-1 ? assigned[km+1] : GRAIN_BARRIER),
-         idd = (i < yres-1 ? assigned[km+xres] : GRAIN_BARRIER);
-
-    if (idu == GRAIN_BARRIER || idu == 0) {
-        if (idl == GRAIN_BARRIER || idl == 0) {
-            if (idr == GRAIN_BARRIER || idr == 0) {
-                if (idd == GRAIN_BARRIER || idd == 0)
-                    return 0;
-                return idd;
-            }
-            if (idd == GRAIN_BARRIER || idd == 0|| idd == idr)
-                return idr;
-            return GRAIN_BARRIER;
-        }
-        if (idr == GRAIN_BARRIER || idr == 0 || idr == idl) {
-            if (idd == GRAIN_BARRIER || idd == 0|| idd == idl)
-                return idl;
-        }
-        return GRAIN_BARRIER;
-    }
-    if (idl == GRAIN_BARRIER || idl == 0 || idl == idu) {
-        if (idr == GRAIN_BARRIER || idr == 0 || idr == idu) {
-            if (idd == GRAIN_BARRIER || idd == 0 || idd == idu)
-                return idu;
-        }
-    }
-    return GRAIN_BARRIER;
-}
-
-static gint
-mark_one_grain(const gdouble *d, gint *assigned,
-               gint xres, gint yres,
-               gint km, gint gno,
-               IntList *inqueue, IntList *outqueue)
-{
-    gint m, i, j, count = 1;
-    gdouble z = d[km];
-
-    inqueue->len = 0;
-    int_list_add(inqueue, km);
-    assigned[km] = gno;
-
-    while (inqueue->len) {
-        outqueue->len = 0;
-        for (m = 0; m < inqueue->len; m++) {
-            km = inqueue->data[m];
-            i = km/xres;
-            j = km % xres;
-
-            if (i > 0 && !assigned[km-xres] && d[km-xres] == z)
-                int_list_add(outqueue, km-xres);
-            if (j > 0 && !assigned[km-1] && d[km-1] == z)
-                int_list_add(outqueue, km-1);
-            if (j < xres-1 && !assigned[km+1] && d[km+1] == z)
-                int_list_add(outqueue, km+1);
-            if (i < yres-1 && !assigned[km+xres] && d[km+xres] == z)
-                int_list_add(outqueue, km+xres);
-        }
-
-        inqueue->len = 0;
-        for (m = 0; m < outqueue->len; m++) {
-            km = outqueue->data[m];
-            if (!assigned[km]) {
-                assigned[km] = gno;
-                int_list_add(inqueue, km);
-                count++;
-            }
-        }
-    }
-
-    return count;
-}
-
-static void
-fix_grain_numbers(gint *grains, gint *buf, gint n)
-{
-    gint gno = 0, k;
-
-    for (k = 0; k < n; k++) {
-        gint gnok = grains[k];
-        if (gnok && !buf[gnok]) {
-            buf[gnok] = ++gno;
-        }
-    }
-    for (k = 0; k < n; k++)
-        grains[k] = buf[grains[k]];
-}
-
-/**
- * gwy_data_field_waterpour:
- * @data_field: A data field to segmentate.
- * @result: Data field that will be filled with the resulting mask.  It will be
- *          resized to the dimensions of @data_field and its properties set
- *          accordingly.
- * @grains: Optionally, an array with the same number of items as @data_field.
- *          If non-%NULL, it will be filled with grain numbers in the same
- *          manner as gwy_data_field_number_grains().  Pass %NULL to ignore.
- *
- * Performs the classical Vincent watershed segmentation of a data field.
- *
- * The segmentation always results in the entire field being masked with the
- * exception of thin (8-connectivity) lines separating the segments (grains).
- *
- * Compared to gwy_data_field_grains_mark_watershed(), this algorithm is very
- * fast.  However, when used alone, it typically results in a serious
- * oversegmentation as each local minimum gives raise to a grain.  Furthermore,
- * the full segmentation means that also pixels which would be considered
- * outside any grain in the topographical sense will be assigned to some
- * catchment basin.  Therefore, pre- or postprocessing is usually necessary,
- * using the gradient image or a more sophisticated method.
- *
- * The function does not assign pixels with value %HUGE_VAL or larger to any
- * segment.  This can be used to pre-mark certain areas explicitly as
- * boundaries.
- *
- * Since the algorithm numbers the grains as a side effect, you can pass a
- * @grains array and get the grain numbers immediatelly, avoiding the
- * relatively (although not drastically) expensive
- * gwy_data_field_number_grains() call.
- *
- * Returns: The number of segments (grains) in the result, excluding the
- *          separators, i.e. the same convention as in
- *          gwy_data_field_number_grains() is used.
- *
- * Since: 2.37
- **/
-gint
-gwy_data_field_waterpour(GwyDataField *data_field,
-                         GwyDataField *result,
-                         gint *grains)
-{
-    IntList *flatqueue, *fillqueue;
-    gint xres, yres, n, k, kq, gno;
-    gint *queue, *assigned;
-    const gdouble *d;
-    gdouble *rd;
-
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), 0);
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(result), 0);
-
-    xres = data_field->xres;
-    yres = data_field->yres;
-    n = xres*yres;
-    gwy_data_field_resample(result, xres, yres, GWY_INTERPOLATION_NONE);
-
-    queue = g_new(gint, n);
-    for (k = 0; k < n; k++)
-        queue[k] = k;
-
-    d = data_field->data;
-    waterpour_sort(d, queue, n);
-
-    assigned = grains ? grains : g_new0(gint, n);
-    flatqueue = int_list_new(0);
-    fillqueue = int_list_new(0);
-    kq = gno = 0;
-    while (kq < n) {
-        gint len = 1, todo, um;
-        gdouble z;
-
-        k = queue[kq];
-        z = d[k];
-        if (z >= HUGE_VAL)
-            break;
-
-        while (kq + len < n && d[queue[kq + len]] == z)
-            len++;
-
-        todo = len;
-        while (todo) {
-            gint m;
-
-            um = GRAIN_BARRIER;
-            flatqueue->len = 0;
-            for (m = 0; m < len; m++) {
-                gint km = queue[kq + m];
-                gint id = assigned[km];
-                if (id)
-                    continue;
-
-                if ((id = waterpour_decide(assigned, xres, yres, km))) {
-                    /* Must postpone the grain number assignment. There may
-                     * be conflicts later so only queue the position; we have
-                     * to waterpour_decide() again. */
-                    int_list_add(flatqueue, km);
-                }
-                else if (um == GRAIN_BARRIER)
-                    um = m;
-            }
-
-            if (flatqueue->len) {
-                /* We have some modifications to commit. */
-                for (m = 0; m < flatqueue->len; m++) {
-                    gint km = flatqueue->data[m];
-                    gint id = waterpour_decide(assigned, xres, yres, km);
-                    g_assert(id);
-                    assigned[km] = id;
-                }
-                todo -= flatqueue->len;
-            }
-            else {
-                /* We do not have any modifications.  All unassigned pixels
-                 * of this height belong to new grains. */
-                break;
-            }
-        }
-
-        /* Create new grains from remaining pixels. */
-        while (todo) {
-            gint km = GRAIN_BARRIER;
-            while (um < len) {
-                k = queue[kq + um];
-                um++;
-                if (!assigned[k]) {
-                    km = k;
-                    break;
-                }
-            }
-            g_assert(km != GRAIN_BARRIER);
-            todo -= mark_one_grain(d, assigned, xres, yres,
-                                   km, ++gno, flatqueue, fillqueue);
-        }
-
-        kq += len;
-    }
-
-    while (kq < n) {
-        k = queue[kq++];
-        assigned[k] = GRAIN_BARRIER;
-    }
-
-    rd = result->data;
-    for (k = 0; k < n; k++) {
-        gint gnok = assigned[k];
-        gnok = (gnok == GRAIN_BARRIER) ? 0 : gnok;
-        assigned[k] = gnok;
-        rd[k] = !!gnok;
-    }
-
-    /* The grain numbering differs from gwy_data_field_number_grains() which
-     * performs the numbering from top left to bottom right.  Since we
-     * guarantee stable grain numbers, renumber the grains to match that.
-     * Recycle @queue as a scratch buffer.  */
-    if (grains) {
-        gwy_clear(queue, gno+1);
-        fix_grain_numbers(grains, queue, n);
-    }
-
-    int_list_free(fillqueue);
-    int_list_free(flatqueue);
-    g_free(queue);
-    if (!grains)
-        g_free(assigned);
-
-    result->xreal = data_field->xreal;
-    result->yreal = data_field->yreal;
-    result->xoff = data_field->xoff;
-    result->yoff = data_field->yoff;
-
-    /* SI Units can be NULL */
-    if (data_field->si_unit_xy && result->si_unit_xy)
-        gwy_serializable_clone(G_OBJECT(data_field->si_unit_xy),
-                               G_OBJECT(result->si_unit_xy));
-    else if (data_field->si_unit_xy && !result->si_unit_xy)
-        result->si_unit_xy = gwy_si_unit_duplicate(data_field->si_unit_xy);
-    else if (!data_field->si_unit_xy && result->si_unit_xy)
-        GWY_OBJECT_UNREF(result->si_unit_xy);
-
-    if (result->si_unit_z)
-        gwy_si_unit_set_from_string(result->si_unit_z, NULL);
-
-    gwy_data_field_invalidate(result);
-
-    return gno;
-}
-
-/* Mark sharp maxima with 2, known non-maxima with 1. */
-static guint
-mark_maxima(GwyDataField *field,
-            guint *types)
-{
-    guint xres = field->xres, yres = field->yres;
-    const gdouble *d = field->data;
-    guint i, j, k = 0, unmarked = xres*yres;
-
-    for (i = 0; i < yres; i++) {
-        for (j = 0; j < xres; j++, k++) {
-            /* Mark non-maxima. */
-            if ((i && d[k] < d[k-xres])
-                || (j && d[k] < d[k-1])
-                || (j < xres-1 && d[k] < d[k+1])
-                || (i < yres-1 && d[k] < d[k+xres])) {
-                types[k] = 1;
-                unmarked--;
-            }
-            /* Mark maxima. */
-            else if ((!i || d[k] > d[k-xres])
-                     && (!j || d[k] > d[k-1])
-                     && (j == xres-1 || d[k] > d[k+1])
-                     && (i == yres-1 || d[k] > d[k+xres])) {
-                types[k] = 2;
-                unmarked--;
-            }
-        }
-    }
-
-    return unmarked;
-}
-
-/* Mark sharp minima with 2, known non-minima with 1. */
-static guint
-mark_minima(GwyDataField *field,
-            guint *types)
-{
-    guint xres = field->xres, yres = field->yres;
-    const gdouble *d = field->data;
-    guint i, j, k = 0, unmarked = xres*yres;
-
-    for (i = 0; i < yres; i++) {
-        for (j = 0; j < xres; j++, k++) {
-            /* Mark non-minima. */
-            if ((i && d[k] > d[k-xres])
-                || (j && d[k] > d[k-1])
-                || (j < xres-1 && d[k] > d[k+1])
-                || (i < yres-1 && d[k] > d[k+xres])) {
-                types[k] = 1;
-                unmarked--;
-            }
-            /* Mark minima. */
-            else if ((!i || d[k] < d[k-xres])
-                     && (!j || d[k] < d[k-1])
-                     && (j == xres-1 || d[k] < d[k+1])
-                     && (i == yres-1 || d[k] < d[k+xres])) {
-                types[k] = 2;
-                unmarked--;
-            }
-        }
-    }
-
-    return unmarked;
-}
-
-/* Propagate non-maxima type to all pixels of the same value.  Or minima. This
- * alogorithm no longer depends on how the states was marked, it just
- * propagates the 1 state though identical values. */
-static void
-propagate_non_extrema_marking(guint *types, const gdouble *d,
-                              guint xres, guint yres)
-{
-    IntList *inqueue = int_list_new(16);
-    IntList *outqueue = int_list_new(16);
-    guint i, j, m, k = 0;
-
-    for (i = 0; i < yres; i++) {
-        for (j = 0; j < xres; j++, k++) {
-            if (types[k])
-                continue;
-            /* If the value is equal to some neighbour which is a known
-             * non-maximum then this pixel is also non-maximum.  (If the
-             * neighbour is a known maximum this pixel cannot be unknown.) */
-            if ((i && types[k-xres] && d[k] == d[k-xres])
-                || (j && types[k-1] && d[k] == d[k-1])
-                || (j < xres-1 && types[k+1] && d[k] == d[k+1])
-                || (i < yres-1 && types[k+xres] && d[k] == d[k+xres])) {
-                types[k] = 1;
-                int_list_add(outqueue, k);
-            }
-        }
-    }
-    GWY_SWAP(IntList*, inqueue, outqueue);
-
-    while (inqueue->len) {
-        for (m = 0; m < inqueue->len; m++) {
-            k = inqueue->data[m];
-            i = k/xres;
-            j = k % xres;
-
-            /* Propagate the non-maximum type to all still unknown
-             * neighbours.  Since we set them to known immediately, double
-             * queuing is avoided. */
-            if (i && !types[k-xres]) {
-                types[k-xres] = 1;
-                int_list_add(outqueue, k-xres);
-            }
-            if (j && !types[k-1]) {
-                types[k-1] = 1;
-                int_list_add(outqueue, k-1);
-            }
-            if (j < xres-1 && !types[k+1]) {
-                types[k+1] = 1;
-                int_list_add(outqueue, k+1);
-            }
-            if (i < yres-1 && !types[k+xres]) {
-                types[k+xres] = 1;
-                int_list_add(outqueue, k+xres);
-            }
-        }
-
-        inqueue->len = 0;
-        GWY_SWAP(IntList*, inqueue, outqueue);
-    }
-
-    int_list_free(inqueue);
-    int_list_free(outqueue);
-}
-
-/**
- * gwy_data_field_mark_extrema:
- * @dfield: A two-dimensional data field.
- * @extrema: Target field for the extrema mask.
- * @maxima: %TRUE to mark maxima, %FALSE to mark minima.
- *
- * Marks local maxima or minima in a two-dimensional field.
- *
- * Local (or regional) maximum is a contiguous set of pixels that have the same
- * value and this value is sharply greater than the value of any pixel touching
- * the set.  A minimum is defined analogously.  A field filled with a single
- * value is considered to have neither minimum nor maximum.
- *
- * Since: 2.37
- **/
-void
-gwy_data_field_mark_extrema(GwyDataField *dfield,
-                            GwyDataField *extrema,
-                            gboolean maxima)
-{
-    gdouble min, max;
-    guint xres, yres, unmarked, k;
-    guint *types;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(dfield));
-    g_return_if_fail(GWY_IS_DATA_FIELD(extrema));
-    xres = dfield->xres;
-    yres = dfield->yres;
-    g_return_if_fail(extrema->xres == xres);
-    g_return_if_fail(extrema->yres == yres);
-
-    gwy_data_field_clear(extrema);
-
-    gwy_data_field_get_min_max(dfield, &min, &max);
-    /* This takes care of 1×1 fields too. */
-    if (min == max)
-        return;
-
-    types = g_new0(guint, xres*yres);
-    unmarked = (maxima ? mark_maxima : mark_minima)(dfield, types);
-
-    if (unmarked)
-        propagate_non_extrema_marking(types, dfield->data, xres, yres);
-
-    /* Mark 1 as 0 (non-extremum); mark 0 and 2 as 1 (extremum).  The remaining
-       0s are exactly those flat areas which cannot be made non-maximum, i.e.
-       they must be maxima.  Assume extrema are relatively sparse so prefer
-       fast iteration compared to fast mask bit setting. */
-    for (k = 0; k < xres*yres; k++) {
-        if (!(types[k] & 1))
-            extrema->data[k] = 1.0;
-    }
-
-    g_free(types);
-    gwy_data_field_invalidate(extrema);
-}
-
-/* Copyright (C) 1991, 1992, 1996, 1997, 1999 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Written by Douglas C. Schmidt (schmidt at ics.uci.edu).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA  */
-
-/* If you consider tuning this algorithm, you should consult first:
-   Engineering a sort function; Jon Bentley and M. Douglas McIlroy;
-   Software - Practice and Experience; Vol. 23 (11), 1249-1265, 1993.  */
-
-typedef struct {
-    gdouble z;
-    guint k;
-} Pair;
-
-#define is_smaller_pair(a, b) \
-    ((a)->z < (b)->z || ((a)->z == (b)->z && (a)->k < (b)->k))
-
-#define PSWAP(x, y) GWY_SWAP(Pair, x, y)
-
-#define STACK_SIZE      (CHAR_BIT * sizeof(gsize))
-#define PUSH(low, high) ((void) ((top->lo = (low)), (top->hi = (high)), ++top))
-#define POP(low, high)  ((void) (--top, (low = top->lo), (high = top->hi)))
-#define STACK_NOT_EMPTY (stack < top)
-
-/* Order size using quicksort.  This implementation incorporates
-   four optimizations discussed in Sedgewick:
-
-   1. Non-recursive, using an explicit stack of pointer that store the
-   next array partition to sort.  To save time, this maximum amount
-   of space required to store an array of SIZE_MAX is allocated on the
-   stack.  Assuming a 32-bit (64 bit) integer for size_t, this needs
-   only 32 * sizeof(stack_node) == 256 bytes (for 64 bit: 1024 bytes).
-   Pretty cheap, actually.
-
-   2. Chose the pivot element using a median-of-three decision tree.
-   This reduces the probability of selecting a bad pivot value and
-   eliminates certain extraneous comparisons.
-
-   3. Only quicksorts TOTAL_ELEMS / MAX_THRESH partitions, leaving
-   insertion sort to order the MAX_THRESH items within each partition.
-   This is a big win, since insertion sort is faster for small, mostly
-   sorted array segments.
-
-   4. The larger of the two sub-partitions is always pushed onto the
-   stack first, with the algorithm then concentrating on the
-   smaller partition.  This *guarantees* no more than log(n)
-   stack size is needed (actually O(1) in this case)!  */
-
-static void
-sort_pairs(Pair *array,
-           gsize n)
-{
-    /* Note: Specialization makes the insertion sort part relatively more
-     * efficient, after some benchmarking this seems be about the best value
-     * on Athlon 64. */
-    enum { MAX_THRESH = 20 };
-
-    // Stack node declarations used to store unfulfilled partition obligations.
-    typedef struct {
-        Pair *lo;
-        Pair *hi;
-    } stack_node;
-
-    if (n < 2)
-        /* Avoid lossage with unsigned arithmetic below.  */
-        return;
-
-    if (n > MAX_THRESH) {
-        Pair *lo = array;
-        Pair *hi = lo + (n - 1);
-        stack_node stack[STACK_SIZE];
-        stack_node *top = stack + 1;
-
-        while (STACK_NOT_EMPTY) {
-            Pair *left_ptr;
-            Pair *right_ptr;
-
-            /* Select median value from among LO, MID, and HI. Rearrange
-               LO and HI so the three values are sorted. This lowers the
-               probability of picking a pathological pivot value and
-               skips a comparison for both the LEFT_PTR and RIGHT_PTR in
-               the while loops. */
-
-            Pair *mid = lo + ((hi - lo) >> 1);
-
-            if (is_smaller_pair(mid, lo))
-                PSWAP(*mid, *lo);
-            if (is_smaller_pair(hi, mid))
-                PSWAP(*mid, *hi);
-            else
-                goto jump_over;
-            if (is_smaller_pair(mid, lo))
-                PSWAP(*mid, *lo);
-
-jump_over:
-          left_ptr  = lo + 1;
-          right_ptr = hi - 1;
-
-          /* Here's the famous ``collapse the walls'' section of quicksort.
-             Gotta like those tight inner loops!  They are the main reason
-             that this algorithm runs much faster than others. */
-          do {
-              while (is_smaller_pair(left_ptr, mid))
-                  left_ptr++;
-
-              while (is_smaller_pair(mid, right_ptr))
-                  right_ptr--;
-
-              if (left_ptr < right_ptr) {
-                  PSWAP(*left_ptr, *right_ptr);
-                  if (mid == left_ptr)
-                      mid = right_ptr;
-                  else if (mid == right_ptr)
-                      mid = left_ptr;
-                  left_ptr++;
-                  right_ptr--;
-              }
-              else if (left_ptr == right_ptr) {
-                  left_ptr++;
-                  right_ptr--;
-                  break;
-              }
-          }
-          while (left_ptr <= right_ptr);
-
-          /* Set up pointers for next iteration.  First determine whether
-             left and right partitions are below the threshold size.  If so,
-             ignore one or both.  Otherwise, push the larger partition's
-             bounds on the stack and continue sorting the smaller one. */
-
-          if ((gsize)(right_ptr - lo) <= MAX_THRESH) {
-              if ((gsize)(hi - left_ptr) <= MAX_THRESH)
-                  /* Ignore both small partitions. */
-                  POP(lo, hi);
-              else
-                  /* Ignore small left partition. */
-                  lo = left_ptr;
-          }
-          else if ((gsize)(hi - left_ptr) <= MAX_THRESH)
-              /* Ignore small right partition. */
-              hi = right_ptr;
-          else if ((right_ptr - lo) > (hi - left_ptr)) {
-              /* Push larger left partition indices. */
-              PUSH(lo, right_ptr);
-              lo = left_ptr;
-          }
-          else {
-              /* Push larger right partition indices. */
-              PUSH(left_ptr, hi);
-              hi = right_ptr;
-          }
-        }
-    }
-
-    /* Once the BASE_PTR array is partially sorted by quicksort the rest
-       is completely sorted using insertion sort, since this is efficient
-       for partitions below MAX_THRESH size. BASE_PTR points to the beginning
-       of the array to sort, and END_PTR points at the very last element in
-       the array (*not* one beyond it!). */
-
-    {
-        Pair *const end_ptr = array + (n - 1);
-        Pair *tmp_ptr = array;
-        Pair *thresh = MIN(end_ptr, array + MAX_THRESH);
-        Pair *run_ptr;
-
-        /* Find smallest element in first threshold and place it at the
-           array's beginning.  This is the smallest array element,
-           and the operation speeds up insertion sort's inner loop. */
-
-        for (run_ptr = tmp_ptr + 1; run_ptr <= thresh; run_ptr++) {
-            if (is_smaller_pair(run_ptr, tmp_ptr))
-                tmp_ptr = run_ptr;
-        }
-
-        if (tmp_ptr != array)
-            PSWAP(*tmp_ptr, *array);
-
-        /* Insertion sort, running from left-hand-side up to right-hand-side.
-         */
-
-        run_ptr = array + 1;
-        while (++run_ptr <= end_ptr) {
-            tmp_ptr = run_ptr - 1;
-            while (is_smaller_pair(run_ptr, tmp_ptr))
-                tmp_ptr--;
-
-            tmp_ptr++;
-            if (tmp_ptr != run_ptr) {
-                Pair *hi, *lo;
-                Pair d;
-
-                d = *run_ptr;
-                for (hi = lo = run_ptr; --lo >= tmp_ptr; hi = lo)
-                    *hi = *lo;
-                *hi = d;
-            }
-        }
-    }
-}
-
-static void
-waterpour_sort(const gdouble *d, gint *idx, gint n)
-{
-    Pair *pairs = g_new(Pair, n);
-    gint k;
-
-    for (k = 0; k < n; k++)
-        pairs[k] = (Pair){ d[k], k };
-
-    sort_pairs(pairs, n);
-
-    for (k = 0; k < n; k++)
-        idx[k] = pairs[k].k;
-
-    g_free(pairs);
-}
-
 /************************** Documentation ****************************/
 
 /**
diff --git a/libprocess/grains.h b/libprocess/grains.h
index 4e9da26..3d2bad7 100644
--- a/libprocess/grains.h
+++ b/libprocess/grains.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: grains.h 19085 2016-10-16 12:17:32Z yeti-dn $
+ *  @(#) $Id: grains.h 19511 2017-03-06 22:46:13Z yeti-dn $
  *  Copyright (C) 2003-2015 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -167,6 +167,7 @@ void     gwy_data_field_grains_grow             (GwyDataField *data_field,
                                                  gdouble amount,
                                                  GwyDistanceTransformType dtype,
                                                  gboolean prevent_merging);
+void     gwy_data_field_grains_thin             (GwyDataField *data_field);
 gboolean gwy_data_field_fill_voids              (GwyDataField *data_field,
                                                  gboolean nonsimple);
 gint     gwy_data_field_waterpour               (GwyDataField *data_field,
diff --git a/libprocess/gwygrainvalue.c b/libprocess/gwygrainvalue.c
index 8c8b878..2e1dc46 100644
--- a/libprocess/gwygrainvalue.c
+++ b/libprocess/gwygrainvalue.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwygrainvalue.c 17175 2015-05-23 20:53:49Z yeti-dn $
+ *  @(#) $Id: gwygrainvalue.c 19698 2017-05-03 20:18:10Z yeti-dn $
  *  Copyright (C) 2007 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -19,12 +19,10 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-#include "config.h"
 #include <stdlib.h>
 #include <string.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwyexpr.h>
-#include <libgwyddion/gwyutils.h>
 #include <libgwyddion/gwydebugobjects.h>
 #include <libprocess/gwygrainvalue.h>
 #include "gwyprocessinternal.h"
diff --git a/libprocess/gwyprocess.c b/libprocess/gwyprocess.c
index a093a60..29fa337 100644
--- a/libprocess/gwyprocess.c
+++ b/libprocess/gwyprocess.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwyprocess.c 19101 2016-10-19 12:56:46Z yeti-dn $
+ *  @(#) $Id: gwyprocess.c 20128 2017-08-01 11:19:59Z yeti-dn $
  *  Copyright (C) 2003-2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -19,12 +19,7 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-#include "config.h"
-
-#ifdef HAVE_FFTW3
 #include <fftw3.h>
-#endif
-
 #include <libgwyddion/gwyddion.h>
 #include <libprocess/gwyprocess.h>
 #include "gwyprocessinternal.h"
@@ -32,12 +27,10 @@
 static void
 gwy_process_import_fftw_wisdom(void)
 {
-#ifdef HAVE_FFTW3
     G_GNUC_UNUSED gboolean ok;
 
     ok = fftw_import_system_wisdom();
     gwy_debug("FFTW3 system wisdom imported: %d", ok);
-#endif
 }
 
 /**
@@ -78,6 +71,46 @@ gwy_process_type_init(void)
     gwy_process_import_fftw_wisdom();
 }
 
+/* Transfer units by value (gwy_foo_copy_units()). */
+void
+_gwy_assign_si_unit(GwySIUnit *source, GwySIUnit **dest)
+{
+    if (source == *dest)
+        return;
+
+    if (!source || gwy_si_unit_equal_string(source, NULL)) {
+        GWY_OBJECT_UNREF(*dest);
+        return;
+    }
+
+    if (*dest)
+        gwy_serializable_clone(G_OBJECT(source), G_OBJECT(*dest));
+    else
+        *dest = gwy_si_unit_duplicate(source);
+}
+
+/* Take unit object ownership -- @objmember is presumably an object member
+ * (gwy_foo_set_si_unit_x()). */
+void
+_gwy_set_object_si_unit(GwySIUnit *unit, GwySIUnit **objmember)
+{
+    GwySIUnit *tmp;
+
+    g_return_if_fail(!unit || GWY_IS_SI_UNIT(unit));
+
+    if (unit == *objmember)
+        return;
+
+    if (!unit || gwy_si_unit_equal_string(unit, NULL)) {
+        GWY_OBJECT_UNREF(*objmember);
+        return;
+    }
+
+    tmp = *objmember;
+    *objmember = g_object_ref(unit);
+    GWY_OBJECT_UNREF(tmp);
+}
+
 /************************** Documentation ****************************/
 
 /**
diff --git a/libprocess/gwyprocessenums.c b/libprocess/gwyprocessenums.c
index dd18136..029ed6d 100644
--- a/libprocess/gwyprocessenums.c
+++ b/libprocess/gwyprocessenums.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: gwyprocessenums.c 19145 2016-10-31 16:19:12Z yeti-dn $
- *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: gwyprocessenums.c 20155 2017-08-03 14:52:21Z yeti-dn $
+ *  Copyright (C) 2005-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -528,6 +528,8 @@ gwy_masking_type_get_enum(void)
  *                       2.42).
  * @GWY_LINE_STAT_VARIATION: Variation (integral of absolute value) (Since:
  *                           2.42).
+ * @GWY_LINE_STAT_MINPOS: Minimum position along the line (Since: 2.48).
+ * @GWY_LINE_STAT_MAXPOS: Maximum position along the line (Since: 2.48).
  *
  * Line statistical quantities to be requested with
  * gwy_data_field_area_get_line_stats().
@@ -679,6 +681,20 @@ gwy_distance_transform_type_get_enum(void)
  **/
 
 /**
+ * GwyAffineScalingType:
+ * @GWY_AFFINE_SCALING_AS_GIVEN: Correct lattice vectors lengths are taken
+ *                               as given.
+ * @GWY_AFFINE_SCALING_PRESERVE_AREA: Correct lattice vectors are scaled to
+ *                                    make the transformation area-preserving.
+ * @GWY_AFFINE_SCALING_PRESERVE_X: Correct lattice vectors are scaled to
+ *                                 preserve the scale along @x-axis.
+ *
+ * Type of lattice vector scaling in affine transform preparation.
+ *
+ * Since: 2.49
+ **/
+
+/**
  * GwyComputationStateType:
  * @GWY_COMPUTATION_STATE_INIT: Iterator was set up, the next step will
  *                              actually create temporary data structures
@@ -724,4 +740,49 @@ gwy_distance_transform_type_get_enum(void)
  * </programlisting></informalexample>
  **/
 
+GType
+gwy_computation_state_get_type(void)
+{
+    static GType compstate_type = 0;
+
+    if (G_UNLIKELY(!compstate_type))
+        compstate_type = g_pointer_type_register_static("GwyComputationState");
+
+    return compstate_type;
+}
+
+/**
+ * gwy_computation_state_get_state:
+ * @compstate: Computation state.
+ *
+ * Gets the state field of a computation state struct.
+ *
+ * Useful mostly for language bindings.
+ *
+ * Returns: The state field of @compstate.
+ *
+ * Since: 2.49
+ **/
+gint
+gwy_computation_state_get_state(GwyComputationState *compstate)
+{
+    return compstate->state;
+}
+
+/**
+ * gwy_computation_state_get_fraction:
+ * @compstate: Computation state.
+ *
+ * Gets the fraction field of a computation state struct.
+ *
+ * Returns: The fraction field of @compstate.
+ *
+ * Since: 2.49
+ **/
+gdouble
+gwy_computation_state_get_fraction(GwyComputationState *compstate)
+{
+    return compstate->fraction;
+}
+
 /* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/libprocess/gwyprocessenums.h b/libprocess/gwyprocessenums.h
index d3576f0..ac54828 100644
--- a/libprocess/gwyprocessenums.h
+++ b/libprocess/gwyprocessenums.h
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: gwyprocessenums.h 19080 2016-10-14 13:59:02Z yeti-dn $
- *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: gwyprocessenums.h 20142 2017-08-02 18:25:44Z yeti-dn $
+ *  Copyright (C) 2005-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -245,6 +245,8 @@ typedef enum {
     GWY_LINE_STAT_KURTOSIS,
     GWY_LINE_STAT_RANGE,
     GWY_LINE_STAT_VARIATION,
+    GWY_LINE_STAT_MINPOS,
+    GWY_LINE_STAT_MAXPOS,
 } GwyLineStatQuantity;
 
 typedef enum {
@@ -283,6 +285,12 @@ typedef enum {
     GWY_ROTATE_RESIZE_CUT       = 2,
 } GwyRotateResizeType;
 
+typedef enum {
+    GWY_AFFINE_SCALING_AS_GIVEN      = 0,
+    GWY_AFFINE_SCALING_PRESERVE_AREA = 1,
+    GWY_AFFINE_SCALING_PRESERVE_X    = 2,
+} GwyAffineScalingType;
+
 const GwyEnum* gwy_merge_type_get_enum(void) G_GNUC_CONST;
 const GwyEnum* gwy_masking_type_get_enum(void) G_GNUC_CONST;
 const GwyEnum* gwy_plane_symmetry_get_enum(void) G_GNUC_CONST;
@@ -301,6 +309,12 @@ typedef struct {
     gdouble fraction;
 } GwyComputationState;
 
+#define GWY_TYPE_COMPUTATION_STATE (gwy_computation_state_get_type())
+
+GType   gwy_computation_state_get_type    ()                                G_GNUC_CONST;
+gint    gwy_computation_state_get_state   (GwyComputationState *compstate);
+gdouble gwy_computation_state_get_fraction(GwyComputationState *compstate);
+
 G_END_DECLS
 
 #endif /* __GWY_PROCESS_ENUMS_H__ */
diff --git a/libprocess/gwyprocessinternal.h b/libprocess/gwyprocessinternal.h
index ea3ea99..9903242 100644
--- a/libprocess/gwyprocessinternal.h
+++ b/libprocess/gwyprocessinternal.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwyprocessinternal.h 19101 2016-10-19 12:56:46Z yeti-dn $
+ *  @(#) $Id: gwyprocessinternal.h 20128 2017-08-01 11:19:59Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -37,22 +37,30 @@ G_BEGIN_DECLS
 #define CBIT(b)             (1 << GWY_DATA_FIELD_CACHE_##b)
 #define CTEST(datafield, b) ((datafield)->cached & CBIT(b))
 
-typedef struct {
-    guint col;
-    guint row;
-    guint width;
-    guint height;
-} GwyFieldPart;
-
-/* XXX: Maybe this protoype is too detailed.  Including the mask and area
- * arguments explicitly will permit certain optimistations, namely limiting
- * the working area. */
-typedef void (*GwyDataFieldScalarFunc)(GwyDataField *field,
-                                       GwyDataField *mask,
-                                       GwyMaskingType mode,
-                                       const GwyFieldPart *fpart,
-                                       gpointer params,
-                                       gdouble *results);
+typedef void (*RowExtendFunc)(const gdouble *in,
+                              gdouble *out,
+                              guint pos,
+                              guint width,
+                              guint res,
+                              guint extend_left,
+                              guint extend_right,
+                              gdouble value);
+
+typedef void (*RectExtendFunc)(const gdouble *in,
+                               guint inrowstride,
+                               gdouble *out,
+                               guint outrowstride,
+                               guint xpos,
+                               guint ypos,
+                               guint width,
+                               guint height,
+                               guint xres,
+                               guint yres,
+                               guint extend_left,
+                               guint extend_right,
+                               guint extend_up,
+                               guint extend_down,
+                               gdouble value);
 
 G_GNUC_INTERNAL
 void _gwy_cdline_class_setup_presets(void);
@@ -66,6 +74,12 @@ void _gwy_calibration_class_setup_presets(void);
 G_GNUC_INTERNAL
 void _gwy_shape_fit_preset_class_setup_presets(void);
 
+G_GNUC_INTERNAL
+RowExtendFunc _gwy_get_row_extend_func(GwyExteriorType exterior);
+
+G_GNUC_INTERNAL
+RectExtendFunc _gwy_get_rect_extend_func(GwyExteriorType exterior);
+
 struct _GwySurfacePrivate {
     GwySIUnit *si_unit_xy;
     GwySIUnit *si_unit_z;
@@ -78,6 +92,98 @@ struct _GwySurfacePrivate {
 
 typedef struct _GwySurfacePrivate Surface;
 
+typedef struct {
+    guint col;
+    guint row;
+    guint width;
+    guint height;
+} GwyDataFieldPart;
+
+typedef struct {
+    gint i;
+    gint j;
+} GridPoint;
+
+typedef struct {
+    guint size;
+    guint len;
+    GridPoint *points;
+} PixelQueue;
+
+G_GNUC_INTERNAL
+guint _gwy_simple_dist_trans(gint *grain,
+                             guint width,
+                             guint height,
+                             gboolean from_border,
+                             GwyDistanceTransformType dtype,
+                             PixelQueue *inqueue,
+                             PixelQueue *outqueue);
+
+typedef struct {
+    guint size;
+    guint len;
+    gint *data;
+} IntList;
+
+G_GNUC_UNUSED
+static inline IntList*
+int_list_new(guint prealloc)
+{
+    IntList *list = g_slice_new0(IntList);
+    prealloc = MAX(prealloc, 16);
+    list->size = prealloc;
+    list->data = g_new(gint, list->size);
+    return list;
+}
+
+G_GNUC_UNUSED
+static inline void
+int_list_add(IntList *list, gint i)
+{
+    if (G_UNLIKELY(list->len == list->size)) {
+        list->size = MAX(2*list->size, 16);
+        list->data = g_renew(gint, list->data, list->size);
+    }
+
+    list->data[list->len] = i;
+    list->len++;
+}
+
+G_GNUC_UNUSED
+static inline void
+int_list_add_unique(IntList **plist, gint i)
+{
+    IntList *list;
+    guint j;
+
+    if (!*plist)
+        *plist = int_list_new(0);
+
+    list = *plist;
+    for (j = 0; j < list->len; j++) {
+        if (list->data[j] == i)
+            return;
+    }
+    int_list_add(list, i);
+}
+
+G_GNUC_UNUSED
+static inline void
+int_list_free(IntList *list)
+{
+    g_free(list->data);
+    g_slice_free(IntList, list);
+}
+
+#define unit_pointer_if_nonempty(unit) \
+    (((unit) && !gwy_si_unit_equal_string((unit), NULL)) ? &(unit) : NULL)
+
+G_GNUC_INTERNAL
+void _gwy_assign_si_unit(GwySIUnit *source, GwySIUnit **dest);
+
+G_GNUC_INTERNAL
+void _gwy_set_object_si_unit(GwySIUnit *unit, GwySIUnit **objmember);
+
 G_END_DECLS
 
 #endif /* __GWYPROCESS_INTERNAL_H__ */
diff --git a/libprocess/gwyprocesstypes.c b/libprocess/gwyprocesstypes.c
index 668f7a6..4209e2b 100644
--- a/libprocess/gwyprocesstypes.c
+++ b/libprocess/gwyprocesstypes.c
@@ -431,6 +431,8 @@ gwy_line_stat_quantity_get_type(void)
             { GWY_LINE_STAT_KURTOSIS, "GWY_LINE_STAT_KURTOSIS", "kurtosis" },
             { GWY_LINE_STAT_RANGE, "GWY_LINE_STAT_RANGE", "range" },
             { GWY_LINE_STAT_VARIATION, "GWY_LINE_STAT_VARIATION", "variation" },
+            { GWY_LINE_STAT_MINPOS, "GWY_LINE_STAT_MINPOS", "minpos" },
+            { GWY_LINE_STAT_MAXPOS, "GWY_LINE_STAT_MAXPOS", "maxpos" },
             { 0, NULL, NULL }
         };
         etype = g_enum_register_static("GwyLineStatQuantity", values);
@@ -518,6 +520,23 @@ gwy_rotate_resize_type_get_type(void)
     return etype;
 }
 
+GType
+gwy_affine_scaling_type_get_type(void)
+{
+    static GType etype = 0;
+
+    if (etype == 0) {
+        static const GEnumValue values[] = {
+            { GWY_AFFINE_SCALING_AS_GIVEN, "GWY_AFFINE_SCALING_AS_GIVEN", "as-given" },
+            { GWY_AFFINE_SCALING_PRESERVE_AREA, "GWY_AFFINE_SCALING_PRESERVE_AREA", "preserve-area" },
+            { GWY_AFFINE_SCALING_PRESERVE_X, "GWY_AFFINE_SCALING_PRESERVE_X", "preserve-x" },
+            { 0, NULL, NULL }
+        };
+        etype = g_enum_register_static("GwyAffineScalingType", values);
+    }
+    return etype;
+}
+
 #include "./peaks.h"
 
 GType
diff --git a/libprocess/gwyprocesstypes.h b/libprocess/gwyprocesstypes.h
index c3c84cd..a1fa267 100644
--- a/libprocess/gwyprocesstypes.h
+++ b/libprocess/gwyprocesstypes.h
@@ -80,6 +80,9 @@ GType gwy_min_max_filter_type_get_type(void) G_GNUC_CONST;
 GType gwy_rotate_resize_type_get_type(void) G_GNUC_CONST;
 #define GWY_TYPE_ROTATE_RESIZE_TYPE (gwy_rotate_resize_type_get_type())
 
+GType gwy_affine_scaling_type_get_type(void) G_GNUC_CONST;
+#define GWY_TYPE_AFFINE_SCALING_TYPE (gwy_affine_scaling_type_get_type())
+
 GType gwy_peak_background_type_get_type(void) G_GNUC_CONST;
 #define GWY_TYPE_PEAK_BACKGROUND_TYPE (gwy_peak_background_type_get_type())
 
diff --git a/libprocess/gwyshapefitpreset.c b/libprocess/gwyshapefitpreset.c
index 8f49d8e..a0b1bbf 100644
--- a/libprocess/gwyshapefitpreset.c
+++ b/libprocess/gwyshapefitpreset.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwyshapefitpreset.c 19259 2016-11-15 08:26:23Z yeti-dn $
+ *  @(#) $Id: gwyshapefitpreset.c 19380 2016-12-23 11:12:56Z pecold $
  *  Copyright (C) 2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -332,9 +332,9 @@ static gdouble            enforce_secondary_flags(const FitShapeFunc *builtin,
                                                   guint i,
                                                   gdouble value);
 static GwyShapeFitPreset* create_static_preset   (const FitShapeFunc *function);
-static void               reduce_data_size       (const GwyXYZ *xyzsrc,
+static GwySurface*        reduce_data_size       (const GwyXYZ *xyzsrc,
                                                   guint nsrc,
-                                                  GwySurface *dest);
+                                                  guint nred);
 
 G_DEFINE_TYPE(GwyShapeFitPreset, gwy_shape_fit_preset, GWY_TYPE_RESOURCE)
 
@@ -399,6 +399,12 @@ _gwy_shape_fit_preset_class_setup_presets(void)
     g_type_class_unref(klass);
 }
 
+static guint
+calculate_nreduced(guint n)
+{
+    return (guint)sqrt(n*(gdouble)NREDLIM);
+}
+
 /**
  * gwy_shape_fit_preset_needs_same_units:
  * @preset: A 3D geometrical shape fitting function.
@@ -983,6 +989,78 @@ gwy_shape_fit_preset_fit(GwyShapeFitPreset *preset,
     return fitter;
 }
 
+/**
+ * gwy_shape_fit_preset_quick_fit:
+ * @preset: A 3D geometrical shape fitting function.
+ * @fitter: A Marquardt-Levenberg nonlinear fitter already initialized for
+ *          @preset's function, or %NULL.
+ * @points: Array of @n XYZ data defining the lateral coordinates and values
+ *          to fit.
+ * @n: Number of items in @points.
+ * @params: Fitting parameters filled with initial estimates (the fitting
+ *          starts from the provided values).
+ * @fixed_param: Which parameters should be treated as fixed (set
+ *               corresponding element to %TRUE for them).  May be %NULL if
+ *               all parameters are free.
+ * @rss: Location to store the residual sum of squares, as returned by
+ *       gwy_math_nlfit_fit_idx(), may be %NULL.
+ *
+ * Performs a rough non-linear least-squares fit with a 3D geometrical shape
+ * fitter.
+ *
+ * See gwy_shape_fit_preset_fit() for discussion.  This functions differs by
+ * using a reduced number of points to perform the fit (unless the input set
+ * is small) and may also set fitter parameters to make the least squares
+ * method terminate faster.  The input points are reduced the same way as in
+ * gwy_surface_reduce_points().
+ *
+ * Returns: Either @fitter itself, or a newly created fitter if it was %NULL.
+ *
+ * Since: 2.48
+ **/
+GwyNLFitter*
+gwy_shape_fit_preset_quick_fit(GwyShapeFitPreset *preset,
+                               GwyNLFitter *fitter,
+                               const GwyXYZ *points,
+                               guint n,
+                               gdouble *params,
+                               const gboolean *fixed_param,
+                               gdouble *rss)
+{
+    ShapeFitPreset *priv;
+    const FitShapeFunc *builtin;
+    guint nred = calculate_nreduced(n);
+    gdouble myrss;
+
+    g_return_val_if_fail(GWY_IS_SHAPE_FIT_PRESET(preset), NULL);
+    g_return_val_if_fail(points, NULL);
+    g_return_val_if_fail(params, NULL);
+    if (!fitter)
+        fitter = gwy_shape_fit_preset_create_fitter(preset);
+
+    gwy_math_nlfit_set_max_iterations(fitter, 30);
+    priv = preset->priv;
+    builtin = priv->builtin;
+    if (nred < n) {
+        GwySurface *surface = reduce_data_size(points, n, nred);
+        priv->xyz = surface->data;
+        myrss = gwy_math_nlfit_fit_idx_full(fitter, nred, builtin->nparams,
+                                            params, fixed_param, NULL, priv);
+        g_object_unref(surface);
+    }
+    else {
+        priv->xyz = points;
+        myrss = gwy_math_nlfit_fit_idx_full(fitter, n, builtin->nparams,
+                                            params, fixed_param, NULL, priv);
+    }
+    priv->xyz = NULL;
+    enforce_param_flags(builtin, params);
+    if (rss)
+        *rss = myrss;
+
+    return fitter;
+}
+
 static void
 enforce_param_flags(const FitShapeFunc *builtin, gdouble *param)
 {
@@ -1014,20 +1092,23 @@ enforce_secondary_flags(const FitShapeFunc *builtin, guint i, gdouble value)
     return value;
 }
 
-static void
-reduce_data_size(const GwyXYZ *xyzsrc, guint nsrc, GwySurface *dest)
+static GwySurface*
+reduce_data_size(const GwyXYZ *xyzsrc, guint nsrc, guint nred)
 {
-    GwyRandGenSet *rngset = gwy_rand_gen_set_new(1);
-    guint ndest = gwy_surface_get_npoints(dest);
-    guint *redindex = gwy_rand_gen_set_choose_shuffle(rngset, 0, nsrc, ndest);
-    GwyXYZ *xyzdest = gwy_surface_get_data(dest);
-    guint i;
+    GwySurface *reduced, *surface = gwy_surface_new();
+    guint n = surface->n;
+    GwyXYZ *data = surface->data;
 
-    for (i = 0; i < ndest; i++)
-        xyzdest[i] = xyzsrc[redindex[i]];
+    /* XXX: This is a dirty trick we can only dare to attempt since we are
+     * doing it inside the library and know gwy_surface_reduce_points() does
+     * not change the @data and @n fields.  Do not try it at home! */
+    surface->data = (GwyXYZ*)xyzsrc;
+    surface->n = nsrc;
+    reduced = gwy_surface_reduce_points(surface, nred);
+    surface->data = data;
+    surface->n = n;
 
-    g_free(redindex);
-    gwy_rand_gen_set_free(rngset);
+    return reduced;
 }
 
 static GwyShapeFitPreset*
@@ -1095,7 +1176,7 @@ gwy_coshm1(gdouble x)
             sphi = sphi_last; \
         } \
         else { \
-            sincos(phi, &sphi, &cphi); \
+            _gwy_sincos(phi, &sphi, &cphi); \
             cphi_last = cphi; \
             sphi_last = sphi; \
             phi##_last = phi; \
@@ -1440,21 +1521,18 @@ estimate_projection_direction_red(const GwyXYZ *xyz, guint n,
                                   FitShapeEstimateCache *estimcache)
 {
     FitShapeEstimateCache estimcachered;
-    guint nred = (guint)sqrt(n*(gdouble)NREDLIM);
+    guint nred = calculate_nreduced(n);
     GwySurface *surface;
     gdouble phi;
 
     if (nred >= n)
         return estimate_projection_direction(xyz, n, estimcache);
 
-    surface = gwy_surface_new_sized(nred);
-    reduce_data_size(xyz, n, surface);
-
     /* Make sure caching still works for the reduced data. */
+    surface = reduce_data_size(xyz, n, nred);
     gwy_clear(&estimcachered, 1);
     phi = estimate_projection_direction(gwy_surface_get_data_const(surface),
                                         nred, &estimcachered);
-
     g_object_unref(surface);
 
     return phi;
diff --git a/libprocess/gwyshapefitpreset.h b/libprocess/gwyshapefitpreset.h
index 2648400..edd3109 100644
--- a/libprocess/gwyshapefitpreset.h
+++ b/libprocess/gwyshapefitpreset.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwyshapefitpreset.h 19109 2016-10-21 08:57:19Z yeti-dn $
+ *  @(#) $Id: gwyshapefitpreset.h 19370 2016-12-20 21:32:00Z yeti-dn $
  *  Copyright (C) 2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -106,6 +106,13 @@ GwyNLFitter*       gwy_shape_fit_preset_fit                (GwyShapeFitPreset *p
                                                             gdouble *params,
                                                             const gboolean *fixed_param,
                                                             gdouble *rss);
+GwyNLFitter*       gwy_shape_fit_preset_quick_fit          (GwyShapeFitPreset *preset,
+                                                            GwyNLFitter *fitter,
+                                                            const GwyXYZ *points,
+                                                            guint n,
+                                                            gdouble *params,
+                                                            const gboolean *fixed_param,
+                                                            gdouble *rss);
 GwyInventory*      gwy_shape_fit_presets                   (void);
 
 G_END_DECLS
diff --git a/libprocess/hough.c b/libprocess/hough.c
index 0f75a87..c1516a5 100644
--- a/libprocess/hough.c
+++ b/libprocess/hough.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: hough.c 19128 2016-10-26 21:25:12Z yeti-dn $
+ *  @(#) $Id: hough.c 20129 2017-08-01 20:01:48Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -19,14 +19,14 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-#include "config.h"
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
 #include <libprocess/filters.h>
 #include <libprocess/stats.h>
-#include <libprocess/hough.h>
 #include <libprocess/grains.h>
 #include <libprocess/arithmetic.h>
+#include <libprocess/elliptic.h>
+#include <libprocess/hough.h>
 
 static void bresenhams_line           (GwyDataField *dfield,
                                        gint x1,
@@ -503,36 +503,9 @@ get_local_maximum(GwyDataField *dfield,
                   gint mcol, gint mrow,
                   gdouble *xval, gdouble *yval)
 {
-    gint xres, yres;
-    gdouble zm, zp, z0;
-    const gdouble *data;
-
-    xres = dfield->xres;
-    yres = dfield->yres;
-    data = dfield->data;
-    z0 = dfield->data[xres*mrow + mcol];
-    if (mcol > 0 && mcol < xres-1) {
-        zm = data[mrow*xres + mcol-1];
-        zp = data[mrow*xres + mcol+1];
-        if ((zm + zp - 2*z0) == 0)
-            *xval = (gdouble)mcol;
-        else {
-            *xval = (gdouble)mcol + (zm - zp)/(zm + zp - 2*z0)/2.0;
-        }
-    }
-    else
-        *xval = (gdouble)mcol;
-
-    if (mrow > 0 && mrow < yres-1) {
-        zm = data[(mrow - 1)*xres + mcol];
-        zp = data[(mrow + 1)*xres + mcol];
-        if ((zm + zp - 2*z0) == 0)
-            *yval = (gdouble)mrow;
-        else
-            *yval = (gdouble)mrow + (zm - zp)/(zm + zp - 2*z0)/2.0;
-    }
-    else
-        *yval = (gdouble)mrow;
+    *xval = mcol;
+    *yval = mrow;
+    gwy_data_field_local_maximum(dfield, xval, yval, 3, 3);
 }
 
 /**
@@ -587,8 +560,7 @@ gwy_data_field_get_local_maxima_list(GwyDataField *dfield,
 
                 if (zdata[i] < value)  {
                     if (subpixel) {
-                        get_local_maximum(dfield, mcol, mrow,
-                                          &xval, &yval);
+                        get_local_maximum(dfield, mcol, mrow, &xval, &yval);
                         zdata[i] = value;
                         xdata[i] = xval;
                         ydata[i] = yval;
diff --git a/libprocess/interpolation.c b/libprocess/interpolation.c
index 8f5d77f..5f283a5 100644
--- a/libprocess/interpolation.c
+++ b/libprocess/interpolation.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: interpolation.c 19036 2016-10-08 10:32:41Z yeti-dn $
+ *  @(#) $Id: interpolation.c 19698 2017-05-03 20:18:10Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -19,7 +19,6 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-#include "config.h"
 #include <string.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
diff --git a/libprocess/interpolation.h b/libprocess/interpolation.h
index 2fc4824..d10d9b4 100644
--- a/libprocess/interpolation.h
+++ b/libprocess/interpolation.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: interpolation.h 15598 2013-11-11 12:33:32Z yeti-dn $
+ *  @(#) $Id: interpolation.h 19328 2016-11-29 14:21:48Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -32,30 +32,30 @@ gdouble gwy_interpolation_get_dval(gdouble x,
                                    gdouble y1_,
                                    gdouble x2_,
                                    gdouble y2_,
-                                   GwyInterpolationType interpolation);
+                                   GwyInterpolationType interpolation) G_GNUC_CONST;
 
 gdouble
 gwy_interpolation_get_dval_of_equidists(gdouble x,
                                         gdouble *data,
-                                        GwyInterpolationType interpolation);
+                                        GwyInterpolationType interpolation) G_GNUC_PURE;
 
 gdouble
 gwy_interpolation_interpolate_1d(gdouble x,
                                  const gdouble *coeff,
-                                 GwyInterpolationType interpolation);
+                                 GwyInterpolationType interpolation) G_GNUC_PURE;
 
 gdouble
 gwy_interpolation_interpolate_2d(gdouble x,
                                  gdouble y,
                                  gint rowstride,
                                  const gdouble *coeff,
-                                 GwyInterpolationType interpolation);
+                                 GwyInterpolationType interpolation) G_GNUC_PURE;
 
 gboolean
-gwy_interpolation_has_interpolating_basis(GwyInterpolationType interpolation);
+gwy_interpolation_has_interpolating_basis(GwyInterpolationType interpolation) G_GNUC_CONST;
 
 gint
-gwy_interpolation_get_support_size(GwyInterpolationType interpolation);
+gwy_interpolation_get_support_size(GwyInterpolationType interpolation) G_GNUC_CONST;
 
 void
 gwy_interpolation_resolve_coeffs_1d(gint n,
diff --git a/libprocess/inttrans.c b/libprocess/inttrans.c
index 57e24b7..c8951ca 100644
--- a/libprocess/inttrans.c
+++ b/libprocess/inttrans.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: inttrans.c 19036 2016-10-08 10:32:41Z yeti-dn $
- *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: inttrans.c 19717 2017-05-09 08:25:16Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -19,13 +19,8 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-#include "config.h"
-
-#ifdef HAVE_FFTW3
-#include <fftw3.h>
-#endif
-
 #include <string.h>
+#include <fftw3.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
 #include <libprocess/arithmetic.h>
@@ -323,7 +318,6 @@ gwy_data_line_fft_do(GwyDataLine *rsrc,
                      GwyDataLine *idest,
                      GwyTransformDirection direction)
 {
-#ifdef HAVE_FFTW3
     fftw_iodim dims[1], howmany_dims[1];
     gdouble *rbuf = g_memdup(rsrc->data, rsrc->res*sizeof(gdouble));
     gdouble *ibuf = g_memdup(isrc->data, isrc->res*sizeof(gdouble));
@@ -337,16 +331,18 @@ gwy_data_line_fft_do(GwyDataLine *rsrc,
     howmany_dims[0].os = rsrc->res;
     /* Backward direction is equivalent to switching real and imaginary parts */
     /* XXX: Planner destroys input. */
-    if (direction == GWY_TRANSFORM_DIRECTION_BACKWARD)
+    if (direction == GWY_TRANSFORM_DIRECTION_BACKWARD) {
         plan = fftw_plan_guru_split_dft(1, dims, 1, howmany_dims,
                                         rsrc->data, isrc->data,
                                         rdest->data, idest->data,
                                         _GWY_FFTW_PATIENCE);
-    else
+    }
+    else {
         plan = fftw_plan_guru_split_dft(1, dims, 1, howmany_dims,
                                         isrc->data, rsrc->data,
                                         idest->data, rdest->data,
                                         _GWY_FFTW_PATIENCE);
+    }
     g_return_if_fail(plan);
     gwy_assign(rsrc->data, rbuf, rsrc->res);
     gwy_assign(isrc->data, ibuf, isrc->res);
@@ -357,11 +353,6 @@ gwy_data_line_fft_do(GwyDataLine *rsrc,
 
     gwy_data_line_multiply(rdest, 1.0/sqrt(rsrc->res));
     gwy_data_line_multiply(idest, 1.0/sqrt(rsrc->res));
-#else
-    gwy_fft_simple(direction, rsrc->res,
-                   1, rsrc->data, isrc->data,
-                   1, rdest->data, idest->data);
-#endif
 }
 
 static void
@@ -371,7 +362,6 @@ gwy_data_line_fft_real_do(GwyDataLine *rsrc,
                           GwyDataLine *idest,
                           GwyTransformDirection direction)
 {
-#ifdef HAVE_FFTW3
     fftw_iodim dims[1], howmany_dims[1];
     fftw_plan plan;
     gint j;
@@ -404,13 +394,6 @@ gwy_data_line_fft_real_do(GwyDataLine *rsrc,
         gwy_data_line_multiply(idest, 1.0/sqrt(rsrc->res));
     else
         gwy_data_line_multiply(idest, -1.0/sqrt(rsrc->res));
-#else
-    /* We cannot save anything here.  Or correct me... */
-    gwy_data_line_clear(ibuf);
-    gwy_fft_simple(direction, rsrc->res,
-                   1, rsrc->data, ibuf->data,
-                   1, rdest->data, idest->data);
-#endif
 }
 
 static void
@@ -588,7 +571,6 @@ gwy_data_field_2dfft_do(GwyDataField *rin,
                         GwyDataField *iout,
                         GwyTransformDirection direction)
 {
-#ifdef HAVE_FFTW3
     fftw_iodim dims[2], howmany_dims[1];
     fftw_plan plan;
 
@@ -618,32 +600,6 @@ gwy_data_field_2dfft_do(GwyDataField *rin,
 
     gwy_data_field_multiply(rout, 1.0/sqrt(rin->xres*rin->yres));
     gwy_data_field_multiply(iout, 1.0/sqrt(rin->xres*rin->yres));
-#else
-    gdouble *ibuf, *rbuf;
-    gint j, k, xres, yres;
-
-    xres = rin->xres;
-    yres = rin->yres;
-    for (k = 0; k < yres; k++) {
-        gwy_fft_simple(direction, xres,
-                       1, rin->data + k*xres, iin->data + k*xres,
-                       1, rout->data + k*xres, iout->data + k*xres);
-    }
-    /* Use a one-row temporary buffer */
-    rbuf = g_new(gdouble, 2*yres);
-    ibuf = rbuf + 1;
-    for (k = 0; k < xres; k++) {
-        gwy_fft_simple(direction, yres,
-                       xres, rout->data + k, iout->data + k,
-                       2, rbuf, ibuf);
-        /* Move the result from buffer to iout, rout columns */
-        for (j = 0; j < yres; j++) {
-            rout->data[j*xres + k] = rbuf[2*j];
-            iout->data[j*xres + k] = ibuf[2*j];
-        }
-    }
-    g_free(rbuf);
-#endif
     gwy_data_field_invalidate(rout);
     gwy_data_field_invalidate(iout);
 }
@@ -728,7 +684,6 @@ gwy_data_field_2dfft_real_do(GwyDataField *rin,
                              GwyTransformDirection direction)
 {
     gint xres = rin->xres, yres = rin->yres;
-#ifdef HAVE_FFTW3
     fftw_iodim dims[2], howmany_dims[1];
     fftw_plan plan;
     gint j, k;
@@ -774,48 +729,6 @@ gwy_data_field_2dfft_real_do(GwyDataField *rin,
         gwy_data_field_multiply(iout, 1.0/sqrt(xres*yres));
     else
         gwy_data_field_multiply(iout, -1.0/sqrt(xres*yres));
-#else
-    GwyDataField *rbuf = gwy_data_field_duplicate(rin);
-    gint k, j;
-
-    for (k = 0; k+1 < yres; k += 2) {
-        gdouble *re, *im, *r0, *r1, *i0, *i1;
-
-        re = rout->data + k*xres;
-        im = rout->data + (k + 1)*xres;
-        r0 = rbuf->data + k*xres;
-        r1 = rbuf->data + (k + 1)*xres;
-        i0 = ibuf->data + k*xres;
-        i1 = ibuf->data + (k + 1)*xres;
-
-        gwy_fft_simple(direction, xres, 1, r0, r1, 1, re, im);
-
-        /* Disentangle transforms of the row couples */
-        r0[0] = re[0];
-        i0[0] = 0.0;
-        r1[0] = im[0];
-        i1[0] = 0.0;
-        for (j = 1; j < xres; j++) {
-            r0[j] = (re[j] + re[xres - j])/2.0;
-            i0[j] = (im[j] - im[xres - j])/2.0;
-            r1[j] = (im[j] + im[xres - j])/2.0;
-            i1[j] = (-re[j] + re[xres - j])/2.0;
-        }
-    }
-    if (yres % 2) {
-        k = xres * (yres - 1);
-        gwy_clear(ibuf->data, xres);
-        gwy_fft_simple(direction, xres,
-                       1, rbuf->data + k, ibuf->data,
-                       1, rout->data + k, iout->data + k);
-
-    }
-    for (k = 0; k < xres; k++)
-        gwy_fft_simple(direction, yres,
-                       xres, rbuf->data + k, ibuf->data + k,
-                       xres, rout->data + k, iout->data + k);
-    g_object_unref(rbuf);
-#endif
     gwy_data_field_invalidate(rout);
     gwy_data_field_invalidate(iout);
 }
@@ -1336,7 +1249,6 @@ gwy_data_field_xfft_do(GwyDataField *rin,
                        GwyDataField *iout,
                        GwyTransformDirection direction)
 {
-#ifdef HAVE_FFTW3
     fftw_iodim dims[1], howmany_dims[1];
     fftw_plan plan;
 
@@ -1368,14 +1280,6 @@ gwy_data_field_xfft_do(GwyDataField *rin,
 
     gwy_data_field_multiply(rout, 1.0/sqrt(rin->xres));
     gwy_data_field_multiply(iout, 1.0/sqrt(rin->xres));
-#else
-    gint k;
-
-    for (k = 0; k < rin->yres; k++)
-        gwy_fft_simple(direction, rin->xres,
-                       1, rin->data + k*rin->xres, iin->data + k*rin->xres,
-                       1, rout->data + k*rin->xres, iout->data + k*rin->xres);
-#endif
     gwy_data_field_invalidate(rout);
     gwy_data_field_invalidate(iout);
 }
@@ -1456,7 +1360,6 @@ gwy_data_field_xfft_real_do(GwyDataField *rin,
                             GwyDataField *iout,
                             GwyTransformDirection direction)
 {
-#ifdef HAVE_FFTW3
     fftw_iodim dims[1], howmany_dims[1];
     fftw_plan plan;
     gint j, k;
@@ -1493,45 +1396,6 @@ gwy_data_field_xfft_real_do(GwyDataField *rin,
         gwy_data_field_multiply(iout, 1.0/sqrt(rin->xres));
     else
         gwy_data_field_multiply(iout, -1.0/sqrt(rin->xres));
-#else
-    gint j, k;
-
-    for (k = 0; k+1 < rin->yres; k += 2) {
-        gdouble *re, *im, *r0, *r1, *i0, *i1;
-
-        re = ibuf->data + k*rin->xres;
-        im = ibuf->data + (k + 1)*rin->xres;
-        r0 = rin->data + k*rin->xres;
-        r1 = rin->data + (k + 1)*rin->xres;
-
-        gwy_fft_simple(direction, rin->xres, 1, r0, r1, 1, re, im);
-
-        r0 = rout->data + k*rin->xres;
-        r1 = rout->data + (k + 1)*rin->xres;
-        i0 = iout->data + k*rin->xres;
-        i1 = iout->data + (k + 1)*rin->xres;
-
-        /* Disentangle transforms of the row couples */
-        r0[0] = re[0];
-        i0[0] = 0.0;
-        r1[0] = im[0];
-        i1[0] = 0.0;
-        for (j = 1; j < rin->xres; j++) {
-            r0[j] = (re[j] + re[rin->xres - j])/2.0;
-            i0[j] = (im[j] - im[rin->xres - j])/2.0;
-            r1[j] = (im[j] + im[rin->xres - j])/2.0;
-            i1[j] = (-re[j] + re[rin->xres - j])/2.0;
-        }
-    }
-    if (rin->yres % 2) {
-        k = rin->xres * (rin->yres - 1);
-        gwy_clear(ibuf->data, rin->xres);
-        gwy_fft_simple(direction, rin->xres,
-                       1, rin->data + k, ibuf->data,
-                       1, rout->data + k, iout->data + k);
-
-    }
-#endif
     gwy_data_field_invalidate(rout);
     gwy_data_field_invalidate(iout);
 }
@@ -1623,7 +1487,6 @@ gwy_data_field_yfft_do(GwyDataField *rin,
                        GwyDataField *iout,
                        GwyTransformDirection direction)
 {
-#ifdef HAVE_FFTW3
     fftw_iodim dims[1], howmany_dims[1];
     fftw_plan plan;
 
@@ -1655,14 +1518,6 @@ gwy_data_field_yfft_do(GwyDataField *rin,
 
     gwy_data_field_multiply(rout, 1.0/sqrt(rin->yres));
     gwy_data_field_multiply(iout, 1.0/sqrt(rin->yres));
-#else
-    gint k;
-
-    for (k = 0; k < rin->xres; k++)
-        gwy_fft_simple(direction, rin->yres,
-                       rin->xres, rin->data + k, iin->data + k,
-                       rin->xres, rout->data + k, iout->data + k);
-#endif
     gwy_data_field_invalidate(rout);
     gwy_data_field_invalidate(iout);
 }
@@ -1743,7 +1598,6 @@ gwy_data_field_yfft_real_do(GwyDataField *rin,
                             GwyDataField *iout,
                             GwyTransformDirection direction)
 {
-#ifdef HAVE_FFTW3
     fftw_iodim dims[1], howmany_dims[1];
     fftw_plan plan;
     gint j, k;
@@ -1780,51 +1634,6 @@ gwy_data_field_yfft_real_do(GwyDataField *rin,
         gwy_data_field_multiply(iout, 1.0/sqrt(rin->yres));
     else
         gwy_data_field_multiply(iout, -1.0/sqrt(rin->yres));
-#else
-    gint j, k;
-
-    for (k = 0; k+1 < rin->xres; k += 2) {
-        gdouble *re, *im, *r0, *r1, *i0, *i1;
-
-        re = ibuf->data + k;
-        im = ibuf->data + (k + 1);
-        r0 = rin->data + k;
-        r1 = rin->data + (k + 1);
-
-        /* FIXME: we could achieve better data locality by using the in
-         * arrays `rotated'. */
-        gwy_fft_simple(direction, rin->yres, rin->xres, r0, r1,
-                       rin->xres, re, im);
-
-        r0 = rout->data + k;
-        r1 = rout->data + (k + 1);
-        i0 = iout->data + k;
-        i1 = iout->data + (k + 1);
-
-        /* Disentangle transforms of the row couples */
-        r0[0] = re[0];
-        i0[0] = 0.0;
-        r1[0] = im[0];
-        i1[0] = 0.0;
-        for (j = 1; j < rin->yres; j++) {
-            gint n = rin->xres*rin->yres, kj = rin->xres*j;
-
-            r0[kj] = (re[kj] + re[n - kj])/2.0;
-            i0[kj] = (im[kj] - im[n - kj])/2.0;
-            r1[kj] = (im[kj] + im[n - kj])/2.0;
-            i1[kj] = (-re[kj] + re[n - kj])/2.0;
-        }
-    }
-    if (rin->xres % 2) {
-        k = rin->xres - 1;
-        for (j = 0; j < rin->yres; j++)
-            ibuf->data[j*rin->xres + k] = 0.0;
-        gwy_fft_simple(direction, rin->yres,
-                       rin->xres, rin->data + k, ibuf->data + k,
-                       rin->xres, rout->data + k, iout->data + k);
-
-    }
-#endif
     gwy_data_field_invalidate(rout);
     gwy_data_field_invalidate(iout);
 }
@@ -2037,32 +1846,23 @@ gwy_data_field_cwt(GwyDataField *data_field,
     gwy_data_field_invalidate(data_field);
 }
 
-static void
-flip_xy(GwyDataField *source, GwyDataField *dest, gboolean minor)
+static GwyDataLine*
+resample_dline_for_1d_fft_filter(GwyDataLine *dline, gint res,
+                                 GwyInterpolationType interpolation)
 {
-    gint xres, yres, i, j;
-    gdouble *dd;
-    const gdouble *sd;
-
-    xres = gwy_data_field_get_xres(source);
-    yres = gwy_data_field_get_yres(source);
-    gwy_data_field_resample(dest, yres, xres, GWY_INTERPOLATION_NONE);
-    sd = gwy_data_field_get_data_const(source);
-    dd = gwy_data_field_get_data(dest);
-    if (minor) {
-        for (i = 0; i < xres; i++) {
-            for (j = 0; j < yres; j++) {
-                dd[i*yres + j] = sd[j*xres + (xres - 1 - i)];
-            }
-        }
-    }
-    else {
-        for (i = 0; i < xres; i++) {
-            for (j = 0; j < yres; j++) {
-                dd[i*yres + (yres - 1 - j)] = sd[j*xres + i];
-            }
-        }
-    }
+    GwyDataLine *half = gwy_data_line_new_resampled(dline, (res + 1)/2,
+                                                    interpolation);
+    GwyDataLine *full = gwy_data_line_new(res, res, FALSE);
+    gint i;
+
+    /* Fill the full line symmetrically.  The central element may we written
+     * twice, but with the same value. */
+    gwy_assign(full->data, half->data, half->res);
+    for (i = 0; i < half->res; i++)
+        full->data[res-1 - i] = half->data[i];
+
+    g_object_unref(half);
+    return full;
 }
 
 /**
@@ -2085,7 +1885,7 @@ gwy_data_field_fft_filter_1d(GwyDataField *data_field,
                              GwyOrientation orientation,
                              GwyInterpolationType interpolation)
 {
-    GwyDataField *source, *target, *iresult_field, *hlp_rdfield, *hlp_idfield;
+    GwyDataField *iresult_field, *hlp_rdfield, *hlp_idfield;
     GwyDataLine *w;
     gint i, j, xres, yres;
 
@@ -2093,60 +1893,50 @@ gwy_data_field_fft_filter_1d(GwyDataField *data_field,
     g_return_if_fail(GWY_IS_DATA_FIELD(result_field));
     g_return_if_fail(GWY_IS_DATA_LINE(weights));
 
-    gwy_data_field_resample(result_field, data_field->xres, data_field->yres,
-                            GWY_INTERPOLATION_NONE);
-
-    if (orientation == GWY_ORIENTATION_VERTICAL) {
-        source = target = gwy_data_field_new_alike(data_field, FALSE);
-        flip_xy(data_field, source, FALSE);
-    }
-    else {
-        source = data_field;
-        target = result_field;
-    }
-
-    yres = source->yres;
-    xres = source->xres;
+    yres = data_field->yres;
+    xres = data_field->xres;
+    gwy_data_field_resample(result_field, xres, yres, GWY_INTERPOLATION_NONE);
 
-    hlp_rdfield = gwy_data_field_new_alike(source, TRUE);
-    hlp_idfield = gwy_data_field_new_alike(source, TRUE);
-    iresult_field = gwy_data_field_new_alike(source, TRUE);
+    hlp_rdfield = gwy_data_field_new_alike(data_field, TRUE);
+    hlp_idfield = gwy_data_field_new_alike(data_field, TRUE);
+    iresult_field = gwy_data_field_new_alike(data_field, TRUE);
 
-    gwy_data_field_1dfft_raw(source, NULL,
+    gwy_data_field_1dfft_raw(data_field, NULL,
                              hlp_rdfield, hlp_idfield,
-                             GWY_ORIENTATION_HORIZONTAL,
-                             GWY_TRANSFORM_DIRECTION_FORWARD);
+                             orientation, GWY_TRANSFORM_DIRECTION_FORWARD);
+
+    if (orientation == GWY_ORIENTATION_VERTICAL)
+        w = resample_dline_for_1d_fft_filter(weights, yres, interpolation);
+    else
+        w = resample_dline_for_1d_fft_filter(weights, xres, interpolation);
 
-    w = gwy_data_line_new_resampled(weights, (xres + 1)/2, interpolation);
     for (i = 0; i < yres; i++) {
         gdouble *rrow = hlp_rdfield->data + i*xres;
         gdouble *irow = hlp_idfield->data + i*xres;
 
-        for (j = 0; j < xres/2; j++) {
-            rrow[j] *= w->data[j];
-            rrow[xres-1 - j] *= w->data[j];
-            irow[j] *= w->data[j];
-            irow[xres-1 - j] *= w->data[j];
+        if (orientation == GWY_ORIENTATION_VERTICAL) {
+            gdouble wi = w->data[i];
+            for (j = 0; j < xres; j++) {
+                rrow[j] *= wi;
+                irow[j] *= wi;
+            }
         }
-        if (w->res != xres/2) {
-            rrow[xres/2] *= w->data[xres/2];
-            irow[xres/2] *= w->data[xres/2];
+        else {
+            gdouble *wrow = w->data;
+            for (j = 0; j < xres; j++) {
+                rrow[j] *= wrow[j];
+                irow[j] *= wrow[j];
+            }
         }
     }
     g_object_unref(w);
 
     gwy_data_field_1dfft_raw(hlp_rdfield, hlp_idfield,
-                             target, iresult_field,
-                             GWY_ORIENTATION_HORIZONTAL,
-                             GWY_TRANSFORM_DIRECTION_BACKWARD);
+                             result_field, iresult_field,
+                             orientation, GWY_TRANSFORM_DIRECTION_BACKWARD);
     g_object_unref(iresult_field);
     g_object_unref(hlp_rdfield);
     g_object_unref(hlp_idfield);
-
-    if (orientation == GWY_ORIENTATION_VERTICAL) {
-        flip_xy(target, result_field, TRUE);
-        g_object_unref(target);
-    }
 }
 
 /************************** Documentation ****************************/
@@ -2169,10 +1959,9 @@ gwy_data_field_fft_filter_1d(GwyDataField *data_field,
  * This makes them suitable for applications where both forward and inverse
  * transform is performed.
  *
- * Both types of functions wrap a Fourier transform backend which can be
- * currently either gwy_fft_simple(), available always, or
- * <ulink url="http://fftw.org/">FFTW3</ulink>, available when Gwyddion was
- * compiled with it.
+ * Both types of functions wrap
+ * <ulink url="http://fftw.org/">FFTW3</ulink>
+ * routines.
  **/
 
 /* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/libprocess/level.c b/libprocess/level.c
index 2bbfa53..c1ab96a 100644
--- a/libprocess/level.c
+++ b/libprocess/level.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: level.c 19036 2016-10-08 10:32:41Z yeti-dn $
+ *  @(#) $Id: level.c 19698 2017-05-03 20:18:10Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -19,7 +19,6 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-#include "config.h"
 #include <string.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
diff --git a/libprocess/linestats.c b/libprocess/linestats.c
index 13c055f..9f9dd75 100644
--- a/libprocess/linestats.c
+++ b/libprocess/linestats.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: linestats.c 19108 2016-10-21 08:50:43Z yeti-dn $
+ *  @(#) $Id: linestats.c 20171 2017-08-06 19:49:48Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -19,7 +19,6 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-#include "config.h"
 #include <string.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
@@ -75,6 +74,124 @@ gwy_data_line_get_min(GwyDataLine *data_line)
 }
 
 /**
+ * gwy_data_line_min_pos_i:
+ * @data_line: A data line.
+ *
+ * Finds the minimum pixel position of a data line.
+ *
+ * Returns: The minimum pixel position.
+ *
+ * Since 2.48
+ **/
+gdouble
+gwy_data_line_min_pos_i(GwyDataLine *data_line)
+{
+    gint i, res, minpos = 0;
+    gdouble min = G_MAXDOUBLE, *val;
+
+    g_return_val_if_fail(GWY_IS_DATA_LINE(data_line), 0.0);
+
+    res = data_line->res;
+    val = data_line->data;
+    for (i = 0; i < res; i++) {
+        if (G_UNLIKELY(*(val++) < min)) {
+            min = *val;
+            minpos = i;
+        }
+    }
+    return minpos;
+}
+
+/**
+ * gwy_data_line_max_pos_i:
+ * @data_line: A data line.
+ *
+ * Finds the maximum pixel position of a data line.
+ *
+ * Returns: The maximum pixel position.
+ *
+ * Since 2.48
+ **/
+gdouble
+gwy_data_line_max_pos_i(GwyDataLine *data_line)
+{
+    gint i, res, maxpos = 0;
+    gdouble max = G_MINDOUBLE, *val;
+
+    g_return_val_if_fail(GWY_IS_DATA_LINE(data_line), 0.0);
+
+    res = data_line->res;;
+    val = data_line->data;
+    for (i = 0; i < res; i++) {
+        if (G_UNLIKELY(*(val++) > max)) {
+            max = *val;
+            maxpos = i;
+        }
+    }
+    return maxpos;
+}
+
+/**
+ * gwy_data_line_min_pos_r:
+ * @data_line: A data line.
+ *
+ * Finds the real minimum position in a data line.
+ *
+ * Returns: Real position for the minimum.
+ *
+ * Since 2.48
+ **/
+gdouble
+gwy_data_line_min_pos_r(GwyDataLine *data_line)
+{
+    gint res;
+    gdouble real, offset, pos;
+
+    g_return_val_if_fail(GWY_IS_DATA_LINE(data_line), 0.0);
+
+    res = data_line->res;
+    if (G_UNLIKELY(res == 0.0)) {
+        return 0.0;
+    }
+    real = data_line->real;
+    offset = data_line->off;
+
+    pos = gwy_data_line_min_pos_i(data_line);
+
+    return pos * real / res + offset;
+}
+
+/**
+ * gwy_data_line_max_pos_r:
+ * @data_line: A data line.
+ *
+ * Finds the real maximum position in a data line.
+ *
+ * Returns: Real position for the maximum.
+ *
+ * Since 2.48
+ **/
+gdouble
+gwy_data_line_max_pos_r(GwyDataLine *data_line)
+{
+    gint res;
+    gdouble real, offset, pos;
+
+    g_return_val_if_fail(GWY_IS_DATA_LINE(data_line), 0.0);
+
+    res = data_line->res;
+    if (G_UNLIKELY(res == 0.0)) {
+        return 0.0;
+    }
+    real = data_line->real;
+    offset = data_line->off;
+
+    pos = gwy_data_line_max_pos_i(data_line);
+
+    return pos * real / res + offset;
+}
+
+/**
  * gwy_data_line_get_avg:
  * @data_line: A data line.
  *
@@ -781,7 +898,8 @@ gwy_data_line_distribution(GwyDataLine *data_line,
 {
     GwySIUnit *yunit, *lineunit;
     const gdouble *data;
-    gint i, j, res, ndata;
+    gint i, res, ndata;
+    guint *counts;
     gdouble s;
 
     g_return_if_fail(GWY_IS_DATA_LINE(data_line));
@@ -830,20 +948,11 @@ gwy_data_line_distribution(GwyDataLine *data_line,
     gwy_data_line_resample(distribution, nstats, GWY_INTERPOLATION_NONE);
     gwy_data_line_clear(distribution);
 
-    ndata = 0;
-    for (i = 0; i < res; i++) {
-        if (data[i] == ymax) {
-            distribution->data[nstats-1] += 1.0;
-            ndata++;
-        }
-        else {
-            j = (gint)((data[i] - ymin)/s);
-            if (j >= 0 && j < nstats) {
-                distribution->data[j] += 1.0;
-                ndata++;
-            }
-        }
-    }
+    counts = g_new0(guint, nstats);
+    ndata = gwy_math_histogram(data, res, ymin, ymax, nstats, counts);
+    for (i = 0; i < nstats; i++)
+        distribution->data[i] = counts[i];
+    g_free(counts);
 
     /* Set proper units and scales */
     distribution->real = ymax - ymin;
@@ -881,8 +990,9 @@ gwy_data_line_dh(GwyDataLine *data_line,
                  gdouble ymin, gdouble ymax,
                  gint nsteps)
 {
-    gint i, n, val;
-    gdouble step, nstep, imin;
+    gint i, n;
+    gdouble step;
+    guint *counts;
 
     g_return_if_fail(GWY_IS_DATA_LINE(data_line));
     g_return_if_fail(GWY_IS_DATA_LINE(target_line));
@@ -897,18 +1007,14 @@ gwy_data_line_dh(GwyDataLine *data_line,
         ymax = gwy_data_line_get_max(data_line);
     }
     step = (ymax - ymin)/(nsteps - 1.0);
-    imin = ymin/step;
 
-    for (i = 0; i < n; i++) {
-        val = (gint)((data_line->data[i]/step) - imin);
-        if (G_UNLIKELY(val < 0 || val >= nsteps)) {
-            /*this should never happened*/
-            val = 0;
-        }
-        target_line->data[val] += 1.0;
-    }
-    nstep = n*step;
-    gwy_data_line_multiply(target_line, 1.0/nstep);
+    counts = g_new0(guint, nsteps);
+    n = gwy_math_histogram(data_line->data, n, ymin, ymax, nsteps, counts);
+    for (i = 0; i < nsteps; i++)
+        target_line->data[i] = counts[i];
+    g_free(counts);
+
+    gwy_data_line_multiply(target_line, 1.0/(n*step));
     target_line->off = ymin;
     target_line->real = ymax - ymin;
 }
@@ -938,6 +1044,7 @@ gwy_data_line_cdh(GwyDataLine *data_line,
 
     gwy_data_line_dh(data_line, target_line, ymin, ymax, nsteps);
     gwy_data_line_cumulate(target_line);
+    target_line->data[target_line->res-1] = 1.0;   /* Fix rounding errors. */
 }
 
 /**
@@ -1021,6 +1128,7 @@ gwy_data_line_cda(GwyDataLine *data_line,
 
     gwy_data_line_da(data_line, target_line, ymin, ymax, nsteps);
     gwy_data_line_cumulate(target_line);
+    target_line->data[target_line->res-1] = 1.0;   /* Fix rounding errors. */
 }
 
 /**
diff --git a/libprocess/linestats.h b/libprocess/linestats.h
index 93530a1..38d9080 100644
--- a/libprocess/linestats.h
+++ b/libprocess/linestats.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: linestats.h 17386 2015-09-14 09:22:40Z yeti-dn $
+ *  @(#) $Id: linestats.h 19341 2016-12-03 08:22:08Z dn2010 $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -31,6 +31,10 @@ gdouble gwy_data_line_get_min           (GwyDataLine *data_line);
 void    gwy_data_line_get_min_max       (GwyDataLine *data_line,
                                          gdouble *min,
                                          gdouble *max);
+gdouble gwy_data_line_min_pos_i         (GwyDataLine *data_line);
+gdouble gwy_data_line_max_pos_i         (GwyDataLine *data_line);
+gdouble gwy_data_line_min_pos_r         (GwyDataLine *data_line);
+gdouble gwy_data_line_max_pos_r         (GwyDataLine *data_line);
 gdouble gwy_data_line_get_avg           (GwyDataLine *data_line);
 gdouble gwy_data_line_get_rms           (GwyDataLine *data_line);
 gdouble gwy_data_line_get_tan_beta0     (GwyDataLine *data_line);
diff --git a/libprocess/monte-carlo-unc.c b/libprocess/monte-carlo-unc.c
deleted file mode 100644
index b161977..0000000
--- a/libprocess/monte-carlo-unc.c
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- *  @(#) $Id: monte-carlo-unc.c 15598 2013-11-11 12:33:32Z yeti-dn $
- *  Copyright (C) 2011 David Necas (Yeti).
- *  E-mail: yeti at gwyddion.net.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
- *  Boston, MA 02110-1301, USA.
- */
-
-#include <glib.h>
-#include <libgwyddion/gwymath.h>
-#include "monte-carlo-unc.h"
-
-/* Extend randomisation boundaries a bit beyond the caller-specified
- * rectangular area. */
-static void
-extend_area(GwyDataField *field,
-            guint *col, guint *row,
-            guint *width, guint *height,
-            guint ext)
-{
-    guint xres = field->xres, yres = field->yres, n;
-
-    n = MIN(*col, ext);
-    *col -= n;
-    *width += n;
-
-    n = MIN(*col + *width + ext, xres);
-    *width = n - *col;
-
-    n = MIN(*row, ext);
-    *row -= n;
-    *height += n;
-
-    n = MIN(*row + *height + ext, yres);
-    *height = n - *row;
-}
-
-/* XXX: Replace with some actual random field generation according to the
- * uncertainties. */
-static void
-randomise_field_area(GwyDataField *destination,
-                     GwyDataField *source,
-                     guint col,
-                     guint row,
-                     guint width,
-                     guint height,
-                     GRand *rng,
-                     const GwyFieldUncertainties *unc)
-{
-    gdouble q = 2.0*GWY_SQRT3*unc->sigma;
-    const gdouble *src = source->data + row*source->xres + col;
-    gdouble *dest = destination->data + row*destination->xres + col;
-    guint i, j;
-
-    for (i = 0; i < height; i++) {
-        const gdouble *s = src + i*source->xres;
-        gdouble *d = dest + i*destination->xres;
-
-        for (j = width; j; j--, s++, d++) {
-            *d = *s + q*(g_rand_double(rng) - 1.0);
-        }
-    }
-}
-
-/**
- * _gwy_data_field_unc_scalar:
- * @field: Data field with the original data.
- * @mask: Mask to use, if any.
- * @mode: Masking mode to use.
- * @fpart: Part of the field to process, or %NULL for a full field.
- * @params: Processing parameters passed to @func.
- * @results: Array of @nresults items to store the uncertainties of the
- *           @nresults scalars calculated by @func.
- * @nresults: The number of scalars function @func calculates.
- * @func: Data processing function to run on the data.
- * @unc: Uncertainties.
- *
- * Find the uncertainties of a scalar data field processing function using
- * Monte Carlo.
- **/
-void
-_gwy_data_field_unc_scalar(GwyDataField *field,
-                           GwyDataField *mask,
-                           GwyMaskingType mode,
-                           const GwyFieldPart *fpart,
-                           gpointer params,
-                           gdouble *results,
-                           guint nresults,
-                           GwyDataFieldScalarFunc func,
-                           const GwyFieldUncertainties *unc)
-{
-    guint niter = 10000;
-    GwyDataField *workspace;
-    gdouble *accum;
-    guint width, height, row, col, iter, i;
-    GRand *rng;
-
-    /* XXX: This should be moved to some common helper function once it's
-     * needed in several places, like is done in libgwy3. */
-    if (fpart) {
-        col = fpart->col;
-        row = fpart->row;
-        width = fpart->width;
-        height = fpart->height;
-    }
-    else {
-        row = col = 0;
-        width = field->xres;
-        height = field->yres;
-    }
-    if (!mask || mode == GWY_MASK_IGNORE) {
-        mask = NULL;
-        mode = GWY_MASK_IGNORE;
-    }
-    extend_area(field, &col, &row, &width, &height, 5);
-
-    workspace = gwy_data_field_duplicate(field);
-    accum = g_new0(gdouble, 2*nresults);
-    rng = g_rand_new();
-
-    for (iter = 0; iter < niter; iter++) {
-        randomise_field_area(workspace, field,
-                             col, row, width, height, rng, unc);
-        func(workspace, mask, mode, fpart, params, results);
-        for (i = 0; i < nresults; i++) {
-            gdouble r = results[i];
-
-            accum[2*i] += r;
-            accum[2*i + 1] += r*r;
-        }
-    }
-
-    for (i = 0; i < nresults; i++) {
-        gdouble s = accum[2*i]/niter, s2 = accum[2*i + 1]/niter;
-        results[i] = sqrt(MAX(s2 - s*s, 0.0));
-    }
-
-    g_rand_free(rng);
-    g_free(accum);
-    g_object_unref(workspace);
-}
-
-/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/libprocess/monte-carlo-unc.h b/libprocess/monte-carlo-unc.h
deleted file mode 100644
index 8481501..0000000
--- a/libprocess/monte-carlo-unc.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  @(#) $Id: monte-carlo-unc.h 15598 2013-11-11 12:33:32Z yeti-dn $
- *  Copyright (C) 2011 David Necas (Yeti).
- *  E-mail: yeti at gwyddion.net.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
- *  Boston, MA 02110-1301, USA.
- */
-
-/*< private_header >*/
-
-#ifndef __GWY_PROCESS_MONTE_CARLO_UNC_H__
-#define __GWY_PROCESS_MONTE_CARLO_UNC_H__
-
-#include <libprocess/datafield.h>
-#include "gwyprocessinternal.h"
-
-G_BEGIN_DECLS
-
-typedef struct {
-    /* XXX: Replace this with actual uncertainty data. */
-    gdouble sigma;
-} GwyFieldUncertainties;
-
-G_GNUC_INTERNAL
-void _gwy_data_field_unc_scalar(GwyDataField *field,
-                                GwyDataField *mask,
-                                GwyMaskingType mode,
-                                const GwyFieldPart *fpart,
-                                gpointer params,
-                                gdouble *results,
-                                guint nresults,
-                                GwyDataFieldScalarFunc func,
-                                const GwyFieldUncertainties *unc);
-
-G_END_DECLS
-
-#endif /* __GWY_PROCESS_MONTE_CARLO_UNC_H__ */
-
-/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/libprocess/simplefft.c b/libprocess/simplefft.c
index 8cbdb06..639bf7b 100644
--- a/libprocess/simplefft.c
+++ b/libprocess/simplefft.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: simplefft.c 18438 2016-03-15 16:17:18Z yeti-dn $
- *  Copyright (C) 2003-2007 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: simplefft.c 19688 2017-05-03 14:01:57Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -19,79 +19,13 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-/*
- * How this all works.
- *
- * There are four main components:
- *
- * - shuffle_and_twiddle() reorganizes data from one buffer to another,
- *   to the order expected by the pass functions below (which is always
- *   maximized stride n/p, unfortunately) and applied twiddle factors
- *
- * - pass2(), ..., pass10() perform subtransforms with sizes p=2-10 on
- *   arrays of size n, i.e. they perform n/p identical transforms with
- *   stride n/p, these are hand-coded
- *
- * - gpass() performs a general small-prime subtransform of size p, it is
- *   O(p^2), however it makes use of some general block symmetries and thus
- *   it outperforms bluestein() on smaller prime sizes
- *
- * - bluestein() is a Bluestein's arbitrary-size O(n log(n)) transform
- *   algorithm that re-expresses it via a cyclic convolution of larger
- *   but more factorable size, it recursively calls gwy_fft_simple() and it
- *   is currently only used in on big step for everything that remains
- *   after chopping off factors that passP() and gpass() can handle
- *
- * The driver routine gwy_fft_simple() decides whether a bluestein() pass is
- * necessary, performs it as the first step if it is, and then continues
- * with interleaved passP()/gpass() and shuffle_and_twiddle() for the
- * individual factors, using a temporary storage buffer with stride 1 (that
- * is never freed).
- */
-
-#include "config.h"
-#include <string.h>
+#include <fftw3.h>
 #include <libgwyddion/gwymath.h>
 #include <libprocess/simplefft.h>
-
-#define C3_1 0.5
-#define S3_1 0.86602540378443864676372317075293618347140262690518
-
-#define C10_1 0.80901699437494742410229341718281905886015458990288
-#define C10_2 0.30901699437494742410229341718281905886015458990289
-#define S10_1 0.58778525229247312916870595463907276859765243764313
-#define S10_2 0.95105651629515357211643933337938214340569863412574
-
-#define C5_1 C10_2
-#define C5_2 -C10_1
-#define S5_1 S10_2
-#define S5_2 S10_1
-
-#define C7_1 0.62348980185873353052500488400423981063227473089641
-#define C7_2 -0.22252093395631440428890256449679475946635556876452
-#define C7_3 -0.90096886790241912623610231950744505116591916213184
-#define S7_1 0.78183148246802980870844452667405775023233451870867
-#define S7_2 0.97492791218182360701813168299393121723278580062000
-#define S7_3 0.43388373911755812047576833284835875460999072778748
-
-#define S8_1 .70710678118654752440084436210484903928483593768846
-
-#ifdef HAVE_SINCOS
-#define _gwy_sincos sincos
-#else
-static inline void
-_gwy_sincos(gdouble x, gdouble *s, gdouble *c)
-{
-    *s = sin(x);
-    *c = cos(x);
-}
-#endif
+#include "gwyprocessinternal.h"
 
 static guint smooth_upper_bound(guint n);
 
-typedef void (*ButterflyFunc)(guint gn,
-                              guint stride, gdouble *re, gdouble *im);
-
 typedef gdouble (*GwyFFTWindowingFunc)(gint i, gint n);
 
 static gdouble gwy_fft_window_hann     (gint i, gint n);
@@ -147,548 +81,6 @@ gwy_fft_find_nice_size(gint size)
     return smooth_upper_bound(size);
 }
 
-/***** Scratch buffers {{{ **********************************************/
-/* We don't like GArray because it ensures the data will stay there when the
- * array size changes, which is a waste of time if it includes copying.
- * Also, we'd like to have plain gdouble* arrays, the administrative stuff
- * should not be visible. */
-#define _GWY_SCRATCH_BUFFER_ALIGNMENT 16
-#define _GWY_SCRATCH_BUFFER_BLOCK 16
-
-#define _GWY_SCRATCH_BUFFER_GET(b) \
-    ((_GwyScratchBuffer*)(((guchar*)(b))-_GWY_SCRATCH_BUFFER_ALIGNMENT))
-
-#define _GWY_SCRATCH_BUFFER_ALIGN(n, l) ((MAX((n), 1) + (l)-1)/(l)*(l))
-
-#define _gwy_scratch_buffer_free_backend(b, l) \
-    g_slice_free1((l)*sizeof(gdouble), (b))
-#define _gwy_scratch_buffer_alloc_backend(l) \
-    g_slice_alloc((l)*sizeof(gdouble) + sizeof(_GwyScratchBufferHead))
-
-typedef union {
-    struct {
-        gsize alloc_len;
-    } info;
-    guchar keep_memory_nicely_aligned[_GWY_SCRATCH_BUFFER_ALIGNMENT];
-} _GwyScratchBufferHead;
-
-typedef struct {
-    _GwyScratchBufferHead head;
-    gdouble data[1];  /* Don't tempt compilers even more. */
-} _GwyScratchBuffer;
-
-static inline void
-_gwy_scratch_buffer_free(gdouble *buffer)
-{
-    _GwyScratchBuffer *buf;
-
-    if (buffer) {
-        buf = _GWY_SCRATCH_BUFFER_GET(buffer);
-        _gwy_scratch_buffer_free_backend(buf, buf->head.info.alloc_len);
-    }
-}
-
-static inline gdouble*
-_gwy_scratch_buffer_ensure(gdouble *buffer, guint n)
-{
-    _GwyScratchBuffer *buf;
-
-    if (buffer) {
-        buf = _GWY_SCRATCH_BUFFER_GET(buffer);
-        if (n <= buf->head.info.alloc_len)
-            return buffer;
-
-        _gwy_scratch_buffer_free_backend(buf, buf->head.info.alloc_len);
-    }
-
-    n = _GWY_SCRATCH_BUFFER_ALIGN(n, _GWY_SCRATCH_BUFFER_ALIGNMENT);
-    buf = _gwy_scratch_buffer_alloc_backend(n);
-    buf->head.info.alloc_len = n;
-    return &buf->data[0];
-}
-/***** }}} **************************************************************/
-
-
-/**
- * shuffle_and_twiddle:
- * @gn: The total array size.
- * @gm: The next already transformed size, i.e. the product of all factors
- *      we have already handled, including @p.
- * @p: The factor we want to handle now.
- * @istride: Input data stride.
- * @in_re: Real part of input data.
- * @in_im: Imaginary part of input data.
- * @ostride: Output data stride.
- * @out_re: Real part of output data.
- * @out_im: Imaginary part of output data.
- *
- * Move data between two buffers, ensuring the result will have stride @gn/@p
- * and applying twiddle factors.
- **/
-static void
-shuffle_and_twiddle(guint gn, guint gm, guint p,
-                    guint istride, const gdouble *in_re, const gdouble *in_im,
-                    guint ostride, gdouble *out_re, gdouble *out_im)
-{
-    gdouble *ff_re, *ff_im;
-    guint m, k2, n1;
-
-    /* k2 == 0, twiddle factors are 1 */
-    for (m = 0; m < gn/gm; m++) {
-        const gdouble *inb_re = in_re + istride*m;
-        const gdouble *inb_im = in_im + istride*m;
-        gdouble *outb_re = out_re + ostride*m;
-        gdouble *outb_im = out_im + ostride*m;
-
-        for (n1 = 0; n1 < p; n1++) {
-            guint li = gn/gm*istride*n1;
-            guint lo = gn/p*ostride*n1;
-
-            outb_re[lo] = inb_re[li];
-            outb_im[lo] = inb_im[li];
-        }
-    }
-    if (gm == p)
-        return;
-
-    /* Other twiddle factors have to be calculated,
-       but for n1 == 0 they are always 1 */
-    ff_re = g_newa(gdouble, p);
-    ff_im = g_newa(gdouble, p);
-    for (k2 = 1; k2 < gm/p; k2++) {
-        for (n1 = 1; n1 < p; n1++)
-            _gwy_sincos(2.0*G_PI*n1*k2/gm, ff_im + n1, ff_re + n1);
-        for (m = 0; m < gn/gm; m++) {
-            const gdouble *inb_re = in_re + istride*(m + gn*p/gm*k2);
-            const gdouble *inb_im = in_im + istride*(m + gn*p/gm*k2);
-            gdouble *outb_re = out_re + ostride*(m + gn/gm*k2);
-            gdouble *outb_im = out_im + ostride*(m + gn/gm*k2);
-
-            outb_re[0] = inb_re[0];
-            outb_im[0] = inb_im[0];
-            for (n1 = 1; n1 < p; n1++) {
-                guint li = gn/gm*istride*n1;
-                guint lo = gn/p*ostride*n1;
-
-                outb_re[lo] = ff_re[n1]*inb_re[li] - ff_im[n1]*inb_im[li];
-                outb_im[lo] = ff_re[n1]*inb_im[li] + ff_im[n1]*inb_re[li];
-            }
-        }
-    }
-}
-
-/* Butterflies. {{{
- * Hopefully the compiler will optimize out the excessibe assigments to
- * temporary variables. */
-static void
-pass2(guint gn, guint stride, gdouble *re, gdouble *im)
-{
-    guint m;
-
-    gn /= 2;
-    for (m = 0; m < gn; m++) {
-        gdouble z;
-
-        z = re[stride*m] - re[stride*(gn + m)];
-        re[stride*m] += re[stride*(gn + m)];
-        re[stride*(gn + m)] = z;
-
-        z = im[stride*m] - im[stride*(gn + m)];
-        im[stride*m] += im[stride*(gn + m)];
-        im[stride*(gn + m)] = z;
-    }
-}
-
-static void
-pass3(guint gn, guint stride, gdouble *re, gdouble *im)
-{
-    guint m;
-
-    gn /= 3;
-    for (m = 0; m < gn; m++) {
-        gdouble z1re, z1im, z2re, z2im;
-
-        z1re = re[stride*(gn + m)] + re[stride*(2*gn + m)];
-        z1im = im[stride*(gn + m)] + im[stride*(2*gn + m)];
-        /* Multiplication by i */
-        z2re = (im[stride*(2*gn + m)] - im[stride*(gn + m)])*S3_1;
-        z2im = (re[stride*(gn + m)] - re[stride*(2*gn + m)])*S3_1;
-        re[stride*(2*gn + m)] = re[stride*m] - (z2re + 0.5*z1re);
-        im[stride*(2*gn + m)] = im[stride*m] - (z2im + 0.5*z1im);
-        re[stride*(gn + m)] = re[stride*m] + (z2re - 0.5*z1re);
-        im[stride*(gn + m)] = im[stride*m] + (z2im - 0.5*z1im);
-        re[stride*m] += z1re;
-        im[stride*m] += z1im;
-    }
-}
-
-static void
-pass4(guint gn, guint stride, gdouble *re, gdouble *im)
-{
-    guint m;
-
-    gn /= 4;
-    for (m = 0; m < gn; m++) {
-        gdouble z0re, z0im, z1re, z1im, z2re, z2im, z3re, z3im;
-
-        /* Level 0 */
-        z0re = re[stride*m] + re[stride*(2*gn + m)];
-        z0im = im[stride*m] + im[stride*(2*gn + m)];
-        z1re = re[stride*(gn + m)] + re[stride*(3*gn + m)];
-        z1im = im[stride*(gn + m)] + im[stride*(3*gn + m)];
-        z2re = re[stride*m] - re[stride*(2*gn + m)];
-        z2im = im[stride*m] - im[stride*(2*gn + m)];
-        z3re = re[stride*(gn + m)] - re[stride*(3*gn + m)];
-        z3im = im[stride*(gn + m)] - im[stride*(3*gn + m)];
-
-        /* Level 1 */
-        re[stride*m] = z0re + z1re;
-        im[stride*m] = z0im + z1im;
-        /* Multiplication by i */
-        re[stride*(gn + m)] = z2re - z3im;
-        im[stride*(gn + m)] = z2im + z3re;
-        re[stride*(2*gn + m)] = z0re - z1re;
-        im[stride*(2*gn + m)] = z0im - z1im;
-        /* Multiplication by i */
-        re[stride*(3*gn + m)] = z2re + z3im;
-        im[stride*(3*gn + m)] = z2im - z3re;
-    }
-}
-
-static void
-pass5(guint gn, guint stride, gdouble *re, gdouble *im)
-{
-    guint m;
-
-    gn /= 5;
-    for (m = 0; m < gn; m++) {
-        gdouble w0re, w0im, w1re, w1im, w2re, w2im, w3re, w3im;
-        gdouble z0re, z0im, z1re, z1im, z2re, z2im, z3re, z3im;
-
-        /* Level 0 */
-        z0re = re[stride*(gn + m)] + re[stride*(4*gn + m)];
-        z0im = im[stride*(gn + m)] + im[stride*(4*gn + m)];
-        z1re = re[stride*(gn + m)] - re[stride*(4*gn + m)];
-        z1im = im[stride*(gn + m)] - im[stride*(4*gn + m)];
-        z2re = re[stride*(2*gn + m)] + re[stride*(3*gn + m)];
-        z2im = im[stride*(2*gn + m)] + im[stride*(3*gn + m)];
-        z3re = re[stride*(2*gn + m)] - re[stride*(3*gn + m)];
-        z3im = im[stride*(2*gn + m)] - im[stride*(3*gn + m)];
-
-        /* Level 1 */
-        w0re = re[stride*m] + C5_1*z0re + C5_2*z2re;
-        w0im = im[stride*m] + C5_1*z0im + C5_2*z2im;
-        w1re = re[stride*m] + C5_2*z0re + C5_1*z2re;
-        w1im = im[stride*m] + C5_2*z0im + C5_1*z2im;
-        /* Multiplication by i */
-        w2re = -S5_1*z1im - S5_2*z3im;
-        w2im = S5_1*z1re + S5_2*z3re;
-        w3re = -S5_2*z1im + S5_1*z3im;
-        w3im = S5_2*z1re - S5_1*z3re;
-
-        /* Level 2 */
-        re[stride*m] += z0re + z2re;
-        im[stride*m] += z0im + z2im;
-        re[stride*(gn + m)] = w0re + w2re;
-        im[stride*(gn + m)] = w0im + w2im;
-        re[stride*(2*gn + m)] = w1re + w3re;
-        im[stride*(2*gn + m)] = w1im + w3im;
-        re[stride*(3*gn + m)] = w1re - w3re;
-        im[stride*(3*gn + m)] = w1im - w3im;
-        re[stride*(4*gn + m)] = w0re - w2re;
-        im[stride*(4*gn + m)] = w0im - w2im;
-    }
-}
-
-static void
-pass6(guint gn, guint stride, gdouble *re, gdouble *im)
-{
-    guint m;
-
-    gn /= 6;
-    for (m = 0; m < gn; m++) {
-        gdouble w1re, w1im, w2re, w2im;
-        gdouble w4re, w4im, w5re, w5im;
-        gdouble z0re, z0im, z1re, z1im, z2re, z2im;
-        gdouble z3re, z3im, z4re, z4im, z5re, z5im;
-
-        /* Level 0 */
-        z0re = re[stride*m] + re[stride*(3*gn + m)];
-        z0im = im[stride*m] + im[stride*(3*gn + m)];
-        z3re = re[stride*m] - re[stride*(3*gn + m)];
-        z3im = im[stride*m] - im[stride*(3*gn + m)];
-        z1re = re[stride*(gn + m)] + re[stride*(5*gn + m)];
-        z1im = im[stride*(gn + m)] + im[stride*(5*gn + m)];
-        z5re = re[stride*(gn + m)] - re[stride*(5*gn + m)];
-        z5im = im[stride*(gn + m)] - im[stride*(5*gn + m)];
-        z2re = re[stride*(2*gn + m)] + re[stride*(4*gn + m)];
-        z2im = im[stride*(2*gn + m)] + im[stride*(4*gn + m)];
-        z4re = re[stride*(2*gn + m)] - re[stride*(4*gn + m)];
-        z4im = im[stride*(2*gn + m)] - im[stride*(4*gn + m)];
-
-        /* Level 1 and Level 2 for indices 0 and 3 */
-        w1re = z1re + z2re;
-        w1im = z1im + z2im;
-        w2re = z1re - z2re;
-        w2im = z1im - z2im;
-        re[stride*m] = z0re + w1re;
-        im[stride*m] = z0im + w1im;
-        re[stride*(3*gn + m)] = z3re - w2re;
-        im[stride*(3*gn + m)] = z3im - w2im;
-        w1re *= C3_1;
-        w1im *= C3_1;
-        w2re *= C3_1;
-        w2im *= C3_1;
-        /* Multiplication by i */
-        w4re = -S3_1*(z4im + z5im);
-        w4im = S3_1*(z4re + z5re);
-        w5re = -S3_1*(z4im - z5im);
-        w5im = S3_1*(z4re - z5re);
-
-        /* Level 2 */
-        re[stride*(gn + m)] = z3re + w2re + w4re;
-        im[stride*(gn + m)] = z3im + w2im + w4im;
-        re[stride*(2*gn + m)] = z0re - w1re - w5re;
-        im[stride*(2*gn + m)] = z0im - w1im - w5im;
-        re[stride*(4*gn + m)] = z0re - w1re + w5re;
-        im[stride*(4*gn + m)] = z0im - w1im + w5im;
-        re[stride*(5*gn + m)] = z3re + w2re - w4re;
-        im[stride*(5*gn + m)] = z3im + w2im - w4im;
-    }
-}
-
-static void
-pass7(guint gn, guint stride, gdouble *re, gdouble *im)
-{
-    guint m;
-
-    gn /= 7;
-    for (m = 0; m < gn; m++) {
-        gdouble w1re, w1im, w2re, w2im, w3re, w3im;
-        gdouble w4re, w4im, w5re, w5im, w6re, w6im;
-        gdouble z1re, z1im, z2re, z2im, z3re, z3im;
-        gdouble z4re, z4im, z5re, z5im, z6re, z6im;
-
-        /* Level 0 */
-        z1re = re[stride*(gn + m)] + re[stride*(6*gn + m)];
-        z1im = im[stride*(gn + m)] + im[stride*(6*gn + m)];
-        z6re = re[stride*(gn + m)] - re[stride*(6*gn + m)];
-        z6im = im[stride*(gn + m)] - im[stride*(6*gn + m)];
-        z2re = re[stride*(2*gn + m)] + re[stride*(5*gn + m)];
-        z2im = im[stride*(2*gn + m)] + im[stride*(5*gn + m)];
-        z5re = re[stride*(2*gn + m)] - re[stride*(5*gn + m)];
-        z5im = im[stride*(2*gn + m)] - im[stride*(5*gn + m)];
-        z3re = re[stride*(3*gn + m)] + re[stride*(4*gn + m)];
-        z3im = im[stride*(3*gn + m)] + im[stride*(4*gn + m)];
-        z4re = re[stride*(3*gn + m)] - re[stride*(4*gn + m)];
-        z4im = im[stride*(3*gn + m)] - im[stride*(4*gn + m)];
-
-        /* Level 2 */
-        w1re = re[stride*m] + C7_1*z1re + C7_2*z2re + C7_3*z3re;
-        w1im = im[stride*m] + C7_1*z1im + C7_2*z2im + C7_3*z3im;
-        w2re = re[stride*m] + C7_2*z1re + C7_3*z2re + C7_1*z3re;
-        w2im = im[stride*m] + C7_2*z1im + C7_3*z2im + C7_1*z3im;
-        w3re = re[stride*m] + C7_3*z1re + C7_1*z2re + C7_2*z3re;
-        w3im = im[stride*m] + C7_3*z1im + C7_1*z2im + C7_2*z3im;
-        /* Multiplication by i */
-        w4re = -S7_2*z4im + S7_1*z5im - S7_3*z6im;
-        w4im = S7_2*z4re - S7_1*z5re + S7_3*z6re;
-        w5re = S7_1*z4im + S7_3*z5im - S7_2*z6im;
-        w5im = -S7_1*z4re - S7_3*z5re + S7_2*z6re;
-        w6re = -S7_3*z4im - S7_2*z5im - S7_1*z6im;
-        w6im = S7_3*z4re + S7_2*z5re + S7_1*z6re;
-
-        /* Level 3 */
-        re[stride*m] += z1re + z2re + z3re;
-        im[stride*m] += z1im + z2im + z3im;
-        re[stride*(gn + m)] = w1re + w6re;
-        im[stride*(gn + m)] = w1im + w6im;
-        re[stride*(2*gn + m)] = w2re + w5re;
-        im[stride*(2*gn + m)] = w2im + w5im;
-        re[stride*(3*gn + m)] = w3re + w4re;
-        im[stride*(3*gn + m)] = w3im + w4im;
-        re[stride*(4*gn + m)] = w3re - w4re;
-        im[stride*(4*gn + m)] = w3im - w4im;
-        re[stride*(5*gn + m)] = w2re - w5re;
-        im[stride*(5*gn + m)] = w2im - w5im;
-        re[stride*(6*gn + m)] = w1re - w6re;
-        im[stride*(6*gn + m)] = w1im - w6im;
-    }
-}
-
-static void
-pass8(guint gn, guint stride, gdouble *re, gdouble *im)
-{
-    guint m;
-
-    gn /= 8;
-    for (m = 0; m < gn; m++) {
-        gdouble z0re, z0im, z1re, z1im, z2re, z2im, z3re, z3im;
-        gdouble z4re, z4im, z5re, z5im, z6re, z6im, z7re, z7im;
-        gdouble w0re, w0im, w1re, w1im, w2re, w2im, w3re, w3im;
-        gdouble w4re, w4im, w5re, w5im, w6re, w6im, w7re, w7im;
-
-        /* Level 0 */
-        z0re = re[stride*m] + re[stride*(4*gn + m)];
-        z0im = im[stride*m] + im[stride*(4*gn + m)];
-        z1re = re[stride*(gn + m)] + re[stride*(5*gn + m)];
-        z1im = im[stride*(gn + m)] + im[stride*(5*gn + m)];
-        z2re = re[stride*(2*gn + m)] + re[stride*(6*gn + m)];
-        z2im = im[stride*(2*gn + m)] + im[stride*(6*gn + m)];
-        z3re = re[stride*(3*gn + m)] + re[stride*(7*gn + m)];
-        z3im = im[stride*(3*gn + m)] + im[stride*(7*gn + m)];
-        z4re = re[stride*m] - re[stride*(4*gn + m)];
-        z4im = im[stride*m] - im[stride*(4*gn + m)];
-        z5re = re[stride*(gn + m)] - re[stride*(5*gn + m)];
-        z5im = im[stride*(gn + m)] - im[stride*(5*gn + m)];
-        z6re = re[stride*(2*gn + m)] - re[stride*(6*gn + m)];
-        z6im = im[stride*(2*gn + m)] - im[stride*(6*gn + m)];
-        z7re = re[stride*(3*gn + m)] - re[stride*(7*gn + m)];
-        z7im = im[stride*(3*gn + m)] - im[stride*(7*gn + m)];
-
-        /* Level 1 */
-        w0re = z0re + z2re;
-        w0im = z0im + z2im;
-        w1re = z1re + z3re;
-        w1im = z1im + z3im;
-        w2re = z0re - z2re;
-        w2im = z0im - z2im;
-        w3re = z1re - z3re;
-        w3im = z1im - z3im;
-        /* Multiplication by i */
-        w4re = z4re - z6im;
-        w4im = z4im + z6re;
-        /* Multiplication by i */
-        w5re = -(z5im + z7im);
-        w5im = z5re + z7re;
-        /* Multiplication by i */
-        w6re = z4re + z6im;
-        w6im = z4im - z6re;
-        w7re = z5re - z7re;
-        w7im = z5im - z7im;
-
-        /* Level 2 and 3 */
-        z5re = S8_1*(w5re + w7re);
-        z5im = S8_1*(w5im + w7im);
-        z7re = S8_1*(w5re - w7re);
-        z7im = S8_1*(w5im - w7im);
-        re[stride*m] = w0re + w1re;
-        im[stride*m] = w0im + w1im;
-        re[stride*(gn + m)] = w4re + z5re;
-        im[stride*(gn + m)] = w4im + z5im;
-        /* Multiplication by i */
-        re[stride*(2*gn + m)] = w2re - w3im;
-        im[stride*(2*gn + m)] = w2im + w3re;
-        re[stride*(3*gn + m)] = w6re + z7re;
-        im[stride*(3*gn + m)] = w6im + z7im;
-        re[stride*(4*gn + m)] = w0re - w1re;
-        im[stride*(4*gn + m)] = w0im - w1im;
-        re[stride*(5*gn + m)] = w4re - z5re;
-        im[stride*(5*gn + m)] = w4im - z5im;
-        /* Multiplication by i */
-        re[stride*(6*gn + m)] = w2re + w3im;
-        im[stride*(6*gn + m)] = w2im - w3re;
-        re[stride*(7*gn + m)] = w6re - z7re;
-        im[stride*(7*gn + m)] = w6im - z7im;
-    }
-}
-
-static void
-pass10(guint gn, guint stride, gdouble *re, gdouble *im)
-{
-    guint m;
-
-    gn /= 10;
-    for (m = 0; m < gn; m++) {
-        gdouble z0re, z0im, z1re, z1im, z2re, z2im, z3re, z3im, z4re, z4im;
-        gdouble z5re, z5im, z6re, z6im, z7re, z7im, z8re, z8im, z9re, z9im;
-        gdouble w1re, w1im, w2re, w2im, w3re, w3im, w4re, w4im;
-        gdouble w6re, w6im, w7re, w7im, w8re, w8im, w9re, w9im;
-
-        /* Level 0 */
-        z0re = re[stride*m] + re[stride*(5*gn + m)];
-        z0im = im[stride*m] + im[stride*(5*gn + m)];
-        z5re = re[stride*m] - re[stride*(5*gn + m)];
-        z5im = im[stride*m] - im[stride*(5*gn + m)];
-        z1re = re[stride*(gn + m)] + re[stride*(9*gn + m)];
-        z1im = im[stride*(gn + m)] + im[stride*(9*gn + m)];
-        z9re = re[stride*(gn + m)] - re[stride*(9*gn + m)];
-        z9im = im[stride*(gn + m)] - im[stride*(9*gn + m)];
-        z2re = re[stride*(2*gn + m)] + re[stride*(8*gn + m)];
-        z2im = im[stride*(2*gn + m)] + im[stride*(8*gn + m)];
-        z8re = re[stride*(2*gn + m)] - re[stride*(8*gn + m)];
-        z8im = im[stride*(2*gn + m)] - im[stride*(8*gn + m)];
-        z3re = re[stride*(3*gn + m)] + re[stride*(7*gn + m)];
-        z3im = im[stride*(3*gn + m)] + im[stride*(7*gn + m)];
-        z7re = re[stride*(3*gn + m)] - re[stride*(7*gn + m)];
-        z7im = im[stride*(3*gn + m)] - im[stride*(7*gn + m)];
-        z4re = re[stride*(4*gn + m)] + re[stride*(6*gn + m)];
-        z4im = im[stride*(4*gn + m)] + im[stride*(6*gn + m)];
-        z6re = re[stride*(4*gn + m)] - re[stride*(6*gn + m)];
-        z6im = im[stride*(4*gn + m)] - im[stride*(6*gn + m)];
-
-        /* Level 1 */
-        w1re = z1re + z4re;
-        w1im = z1im + z4im;
-        w2re = z2re + z3re;
-        w2im = z2im + z3im;
-        w3re = z2re - z3re;
-        w3im = z2im - z3im;
-        w4re = z1re - z4re;
-        w4im = z1im - z4im;
-        w6re = z6re + z9re;
-        w6im = z6im + z9im;
-        w7re = z7re + z8re;
-        w7im = z7im + z8im;
-        w8re = z7re - z8re;
-        w8im = z7im - z8im;
-        w9re = z6re - z9re;
-        w9im = z6im - z9im;
-
-        /* Level 2 (recycling z, except for z0 and z5) */
-        z1re = z5re + C10_1*w4re + C10_2*w3re;
-        z1im = z5im + C10_1*w4im + C10_2*w3im;
-        z2re = z0re + C10_2*w1re - C10_1*w2re;
-        z2im = z0im + C10_2*w1im - C10_1*w2im;
-        z3re = z5re - C10_2*w4re - C10_1*w3re;
-        z3im = z5im - C10_2*w4im - C10_1*w3im;
-        z4re = z0re - C10_1*w1re + C10_2*w2re;
-        z4im = z0im - C10_1*w1im + C10_2*w2im;
-        /* Multiplication by i */
-        z6re = S10_1*w9im - S10_2*w8im;
-        z6im = -S10_1*w9re + S10_2*w8re;
-        z7re = -S10_2*w6im + S10_1*w7im;
-        z7im = S10_2*w6re - S10_1*w7re;
-        z8re = S10_2*w9im + S10_1*w8im;
-        z8im = -S10_2*w9re - S10_1*w8re;
-        z9re = -S10_1*w6im - S10_2*w7im;
-        z9im = S10_1*w6re + S10_2*w7re;
-
-        /* Level 3 */
-        re[stride*m] = z0re + w1re + w2re;
-        im[stride*m] = z0im + w1im + w2im;
-        re[stride*(gn + m)] = z1re + z9re;
-        im[stride*(gn + m)] = z1im + z9im;
-        re[stride*(2*gn + m)] = z2re + z8re;
-        im[stride*(2*gn + m)] = z2im + z8im;
-        re[stride*(3*gn + m)] = z3re + z7re;
-        im[stride*(3*gn + m)] = z3im + z7im;
-        re[stride*(4*gn + m)] = z4re + z6re;
-        im[stride*(4*gn + m)] = z4im + z6im;
-        re[stride*(5*gn + m)] = z5re + w3re - w4re;
-        im[stride*(5*gn + m)] = z5im + w3im - w4im;
-        re[stride*(6*gn + m)] = z4re - z6re;
-        im[stride*(6*gn + m)] = z4im - z6im;
-        re[stride*(7*gn + m)] = z3re - z7re;
-        im[stride*(7*gn + m)] = z3im - z7im;
-        re[stride*(8*gn + m)] = z2re - z8re;
-        im[stride*(8*gn + m)] = z2im - z8im;
-        re[stride*(9*gn + m)] = z1re - z9re;
-        im[stride*(9*gn + m)] = z1im - z9im;
-    }
-}
-/* }}} */
-
 /**
  * smooth_upper_bound:
  * @n: A number.
@@ -723,260 +115,6 @@ smooth_upper_bound(guint n)
 }
 
 /**
- * bluestein:
- * @n: The transform size and the array size (unlike passP() and gpass(),
- *     this function performs only a single transform).
- * @istride: Input data stride.
- * @in_re: Real part of input data.
- * @in_im: Imaginary part of input data.
- * @ostride: Output data stride.
- * @out_re: Real part of output data.
- * @out_im: Imaginary part of output data.
- *
- * Performs Bluestein's arbitrary-size FFT.
- *
- * Note it calls gwy_fft_simple().
- **/
-static void
-bluestein(guint n,
-          guint istride, const gdouble *in_re, const gdouble *in_im,
-          guint ostride, gdouble *out_re, gdouble *out_im)
-{
-    static gdouble *bre = NULL;
-    static guint bn = 0;
-    static gdouble *are = NULL;
-
-    gdouble *aim, *bim;
-    gdouble q;
-    guint j, nfft;
-
-    nfft = smooth_upper_bound(2*n - 1);
-
-    /* Calculate chirp b, Fb */
-    if (bn != n) {
-        bre = _gwy_scratch_buffer_ensure(bre, 4*nfft);
-        bn = n;
-
-        bim = bre + nfft;
-        bre[0] = 1.0;
-        bim[0] = 0.0;
-        for (j = 1; j < (n + 1)/2; j++) {
-            _gwy_sincos(G_PI*j*j/n, bim + j, bre + j);
-            bre[nfft - j]   = bre[j];
-            bim[nfft - j]   = bim[j];
-            bre[nfft-n + j] = bre[n - j] = -bre[j];
-            bim[nfft-n + j] = bim[n - j] = -bim[j];
-        }
-
-        for (j = n; j <= nfft-n; j++)
-            bre[j] = bim[j] = 0.0;
-
-        gwy_fft_simple(GWY_TRANSFORM_DIRECTION_FORWARD, nfft,
-                       1, bre, bim, 1, bre + 2*nfft, bim + 2*nfft);
-    }
-    else
-        bim = bre + nfft;
-
-    /* Build zero-extended premultiplied a, Fa */
-    are = _gwy_scratch_buffer_ensure(are, 4*nfft);
-    aim = are + nfft;
-
-    for (j = 0; j < n; j++) {
-        are[j] = bre[j]*in_re[istride*j] + bim[j]*in_im[istride*j];
-        aim[j] = bre[j]*in_im[istride*j] - bim[j]*in_re[istride*j];
-    }
-    gwy_clear(are + n, nfft - n);
-    gwy_clear(aim + n, nfft - n);
-    gwy_fft_simple(GWY_TRANSFORM_DIRECTION_FORWARD, nfft,
-                   1, are, aim, 1, are + 2*nfft, aim + 2*nfft);
-
-    /* Multiply Fa*Fb into Fa and transform back */
-    are += 2*nfft;
-    aim += 2*nfft;
-    bre += 2*nfft;
-    bim += 2*nfft;
-    for (j = 0; j < nfft; j++) {
-        gdouble x = are[j];
-
-        are[j] = bre[j]*are[j] - bim[j]*aim[j];
-        aim[j] = bre[j]*aim[j] + bim[j]*x;
-    }
-    are -= 2*nfft;
-    aim -= 2*nfft;
-    bre -= 2*nfft;
-    bim -= 2*nfft;
-    gwy_fft_simple(GWY_TRANSFORM_DIRECTION_BACKWARD, nfft,
-                   1, are + 2*nfft, aim + 2*nfft, 1, are, aim);
-
-    /* Store result into out */
-    q = sqrt((gdouble)nfft/n);
-    for (j = 0; j < n; j++) {
-        out_re[ostride*j] = q*(are[j]*bre[j] + aim[j]*bim[j]);
-        out_im[ostride*j] = q*(aim[j]*bre[j] - are[j]*bim[j]);
-    }
-}
-
-/**
- * gpass:
- * @p: The factor we want to handle now.
- * @gn: The total array size.
- * @stride: Array stride.
- * @re: Real data.
- * @im: Imaginary data.
- *
- * Performs a general prime-sized butterfly pass.
- *
- * This is a rather naive O(N^2) method.
- *
- * All memory is stack-allocated, do not pass large @p values!
- **/
-static void
-gpass(guint p, guint gn,
-      guint stride, gdouble *re, gdouble *im)
-{
-    gdouble *fc, *fs, *wer, *wor, *wei, *woi;
-    gdouble ucr, uci, usr, usi;
-    gint *idx;
-    guint q, m, n, j;
-    gint k;
-
-    gn /= p;
-    q = (p - 1)/2;
-    fc = g_newa(gdouble, 2*q);
-    fs = fc + q;
-    for (j = 0; j < q; j++)
-        _gwy_sincos(2*G_PI*(j + 1)/p, fs + j, fc + j);
-
-    idx = g_newa(gint, q*q);
-    for (n = 0; n < q; n++) {
-        for (j = 0; j < q; j++) {
-            k = (n + 1)*(j + 1) % p;
-            idx[n*q + j] = (k > (gint)q) ? k-(gint)p : k;
-        }
-    }
-
-    wer = g_newa(gdouble, 4*q);
-    wei = wer + q;
-    wor = wer + 2*q;
-    woi = wor + q;
-    for (m = 0; m < gn; m++) {
-        /* even/odd blocks */
-        for (j = 1; j <= q; j++) {
-            wer[j-1] = re[stride*(j*gn + m)] + re[stride*((p - j)*gn + m)];
-            wor[j-1] = re[stride*(j*gn + m)] - re[stride*((p - j)*gn + m)];
-            wei[j-1] = im[stride*(j*gn + m)] + im[stride*((p - j)*gn + m)];
-            woi[j-1] = im[stride*(j*gn + m)] - im[stride*((p - j)*gn + m)];
-        }
-        /* block sums */
-        for (n = 0; n < q; n++) {
-            ucr = re[stride*m];
-            uci = im[stride*m];
-            usr = 0.0;
-            usi = 0.0;
-            for (j = 0; j < q; j++) {
-                if ((k = idx[n*q + j]) > 0) {
-                    ucr += fc[k-1]*wer[j];
-                    uci += fc[k-1]*wei[j];
-                    usr += fs[k-1]*wor[j];
-                    usi += fs[k-1]*woi[j];
-                }
-                else {
-                    ucr += fc[-k-1]*wer[j];
-                    uci += fc[-k-1]*wei[j];
-                    usr -= fs[-k-1]*wor[j];
-                    usi -= fs[-k-1]*woi[j];
-                }
-            }
-            re[stride*((n + 1)*gn + m)] = ucr - usi;
-            im[stride*((n + 1)*gn + m)] = uci + usr;
-            re[stride*((p-1 - n)*gn + m)] = ucr + usi;
-            im[stride*((p-1 - n)*gn + m)] = uci - usr;
-        }
-        /* first row */
-        for (j = 0; j < q; j++) {
-            re[stride*m] += wer[j];
-            im[stride*m] += wei[j];
-        }
-    }
-}
-
-/**
- * analyse_size:
- * @n: A number (transform size).
- * @pp: An array to put its factors to.  The caller is responsible for it
- *      being large enough.
- *
- * Factors a transform size into suitable subtransform sizes.
- *
- * The factors are not necessarily primes, they are either factors we have
- * passP() routine for (and larger compound factors are preferred then), or
- * they are prime factors handled by gpass().  If anything remains, it is
- * put to the last item and the return value is negated.
- *
- * Returns: The number of factors put into @pp, negated if the last factor
- *          is a Big Ugly Number(TM).
- **/
-static gint
-analyse_size(guint n, guint *pp)
-{
-    guint m, p, k;
-    gint np;
-
-    for (m = 1, np = 0; m < n; m *= p, np++) {
-        k = n/m;
-        if (k % 5 == 0)
-            p = (k % 2 == 0) ? 10 : 5;
-        else if (k % 3 == 0)
-            p = (k % 2 == 0) ? 6 : 3;
-        else if (k % 2 == 0)
-            p = (k % 4 == 0) ? ((k % 8 == 0 && k != 16) ? 8 : 4) : 2;
-        else if (k % 7 == 0)
-            p = 7;
-        /* Out of luck with nice factors.  Try the less nice ones. */
-        else {
-            /* gpass() ceases to be competitive with bluestein() around 70.
-             * Also, the required stack space exceeds 1kB. */
-            static const guint primes[] = {
-                11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67
-            };
-
-            for (m = 0; m < G_N_ELEMENTS(primes); m++) {
-                p = primes[m];
-                while (k % p == 0) {
-                    pp[np] = p;
-                    np++;
-                    k /= p;
-                }
-                if (k == 1)
-                    return np;
-            }
-            /* Ugly large prime factors still remain.
-             * Indicate them by a negative return value. */
-            pp[np] = k;
-            np++;
-
-            return -np;
-        }
-        pp[np] = p;
-    }
-
-    return np;
-}
-
-static void
-normalize(guint n, gdouble norm_fact,
-          guint istride, const gdouble *in_re, const gdouble *in_im,
-          guint ostride, gdouble *out_re, gdouble *out_im)
-{
-    guint j;
-
-    for (j = 0; j < n; j++) {
-        out_re[ostride*j] = norm_fact*in_re[istride*j];
-        out_im[ostride*j] = norm_fact*in_im[istride*j];
-    }
-}
-
-/**
  * gwy_fft_simple:
  * @dir: Transformation direction.
  * @n: Number of data points. Note only certain transform sizes are
@@ -993,8 +131,9 @@ normalize(guint n, gdouble norm_fact,
  *
  * Performs a DFT algorithm.
  *
- * This is a low-level function used by other FFT functions when no better
- * backend is available.
+ * This is a low-level function that used to be employed by other FFT functions
+ * when no better backend was available.  Since version 2.49 it just calls the
+ * corresponding FFTW routine.
  *
  * Strides are distances between samples in input and output arrays.  Use 1
  * for normal `dense' arrays.  To use gwy_fft_simple() with interleaved arrays,
@@ -1016,112 +155,50 @@ gwy_fft_simple(GwyTransformDirection dir,
                gdouble *out_re,
                gdouble *out_im)
 {
-    static const ButterflyFunc butterflies[] = {
-        NULL, NULL, pass2, pass3, pass4,
-        pass5, pass6, pass7, pass8, NULL,
-        pass10
-    };
-
-    static gdouble *buffer = NULL;
-
-    guint *pp;
-    gdouble *buf_re, *buf_im;
-    guint m, j, p, k, bstride;
-    gint np;
-    gdouble norm_fact;
-
-    /* The subroutines are written for +i in the exponent.  Shoot me. */
-    if (dir != GWY_TRANSFORM_DIRECTION_BACKWARD) {
-        GWY_SWAP(const gdouble*, in_re, in_im);
-        GWY_SWAP(gdouble*, out_re, out_im);
-    }
-
-    m = 1;
-    pp = g_newa(guint, 21);
-    np = analyse_size(n, pp);
-#ifdef DEBUG
-    {
-        GString *str;
-
-        str = g_string_new(NULL);
-        g_string_append_printf(str, "%u:", n);
-        for (j = 0; j < (guint)ABS(np); j++)
-            g_string_append_printf(str, " %u", pp[j]);
-        if (np < 0)
-            g_string_append(str, "(!)");
-        gwy_debug("factorization: %s", str->str);
-        g_string_free(str, TRUE);
-    }
-#endif
-    /* This is exteremely simplistic.  Although we do not have codelets for
-     * the factors, we could still factorize it and use much smaller transform
-     * sizes in bluestein(). */
-    if (np < 0) {
-        /* bluestein() calls recursively gwy_fft_simple() and the contents of
-         * buf[] is overwriten. */
-        np = -np-1;
-        m = pp[np];
-        k = n/m;
-        /* FIXME: This has a terrible memory access pattern.
-         * The swapped arrays are all right, bluestein() uses a normal
-         * sign convention, unlike everything else here. */
-        for (j = 0; j < k; j++)
-            bluestein(m,
-                      k*istride, in_im + j*istride, in_re + j*istride,
-                      k*ostride, out_im + j*ostride, out_re + j*ostride);
-        if (k == 1)
-            return;
-    }
-
-    /* XXX: This is never freed. */
-    buf_re = buffer = _gwy_scratch_buffer_ensure(buffer, 2*n);
-    buf_im = buf_re + n;
-    bstride = 1;
+    fftw_iodim dims[1], howmany_dims[1];
+    fftw_plan plan;
+    gdouble q;
 
-    /* Here it gets hairy.
-     * We can have the data either in out or in in.
-     * And we may want them either in out or in buf. */
-    norm_fact = sqrt((gdouble)m/n);
-    if (m > 1) {
-        if (np % 2 == 0) {
-            normalize(n, norm_fact,
-                      ostride, out_re, out_im, ostride, out_re, out_im);
+    if (G_UNLIKELY(!n))
+        return;
 
-            GWY_SWAP(gdouble*, buf_re, out_re);
-            GWY_SWAP(gdouble*, buf_im, out_im);
-            GWY_SWAP(guint, bstride, ostride);
-        }
-        else {
-            normalize(n, norm_fact,
-                      ostride, out_re, out_im, bstride, buf_re, buf_im);
-        }
+    g_return_if_fail(istride > 0);
+    g_return_if_fail(ostride > 0);
+
+    dims[0].n = n;
+    dims[0].is = istride;
+    dims[0].os = ostride;
+    howmany_dims[0].n = 1;
+    howmany_dims[0].is = n;
+    howmany_dims[0].os = n;
+
+    /* Use FFTW_PRESERVE_INPUT to fullfill the promise we do not modify the
+     * input arrays and typecast the const away for FFTW. */
+    if (dir == GWY_TRANSFORM_DIRECTION_BACKWARD) {
+        plan = fftw_plan_guru_split_dft(1, dims, 1, howmany_dims,
+                                        (gdouble*)in_im, (gdouble*)in_re,
+                                        out_im, out_re,
+                                        _GWY_FFTW_PATIENCE
+                                        | FFTW_PRESERVE_INPUT);
     }
     else {
-        if (np % 2 == 0 && n > 1) {
-            GWY_SWAP(gdouble*, buf_re, out_re);
-            GWY_SWAP(gdouble*, buf_im, out_im);
-            GWY_SWAP(guint, bstride, ostride);
-        }
-        normalize(n, norm_fact,
-                  istride, in_re, in_im, ostride, out_re, out_im);
+        plan = fftw_plan_guru_split_dft(1, dims, 1, howmany_dims,
+                                        (gdouble*)in_re, (gdouble*)in_im,
+                                        out_re, out_im,
+                                        _GWY_FFTW_PATIENCE
+                                        | FFTW_PRESERVE_INPUT);
     }
 
-    /* Cooley-Tukey */
-    for (k = 0; k < (guint)np; k++, m *= p) {
-        p = pp[k];
-        if (m > 1)
-            shuffle_and_twiddle(n, m*p, p,
-                                bstride, buf_re, buf_im,
-                                ostride, out_re, out_im);
-
-        if (p < G_N_ELEMENTS(butterflies))
-            butterflies[p](n, ostride, out_re, out_im);
-        else
-            gpass(p, n, ostride, out_re, out_im);
+    g_return_if_fail(plan);
+    fftw_execute(plan);
+    fftw_destroy_plan(plan);
 
-        GWY_SWAP(gdouble*, buf_re, out_re);
-        GWY_SWAP(gdouble*, buf_im, out_im);
-        GWY_SWAP(guint, bstride, ostride);
+    q = 1.0/sqrt(n);
+    while (n--) {
+        *out_re *= q;
+        *out_im *= q;
+        out_re += ostride;
+        out_im += ostride;
     }
 }
 
@@ -1319,15 +396,16 @@ gwy_fft_window_data_field(GwyDataField *dfield,
  * @see_also: <link linkend="libgwyprocess-inttrans">inttrans</link>
  *            -- high-level integral transform functions
  *
- * The simple one-dimensional FFT algorithm gwy_fft_simple() is used as
- * a fallback by other functions when a better implementation (FFTW3) is not
- * available.
+ * The simple one-dimensional FFT algorithm gwy_fft_simple() used to be
+ * employed as a fallback by other functions when a better implementation
+ * (FFTW3) was not available.  Since version 2.49 it just calls the
+ * corresponding FFTW routine.
  *
- * You should not use it directly, as it is a waste of resources
- * if FFTW3 backed is in use, neither you should feel any need to, as
- * high-level functions such as gwy_data_field_2dfft() are available.
+ * Generally, you should either use high-level Gwyddion functions such as
+ * gwy_data_field_2dfft_raw() or, if they are insufficient, FFTW routines
+ * directly.
  *
- * Up to version 2.7 simpleFFT works only with certain tranform sizes, mostly
+ * Up to version 2.7 simpleFFT required certain tranform sizes, mostly
  * powers of 2.  Since 2.8 it can handle arbitrary tranform sizes, although
  * sizes with large prime factors can be quite slow (still O(n*log(n)) though).
  **/
diff --git a/libprocess/spectra.c b/libprocess/spectra.c
index b334ab0..c42e4b2 100644
--- a/libprocess/spectra.c
+++ b/libprocess/spectra.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: spectra.c 19108 2016-10-21 08:50:43Z yeti-dn $
+ *  @(#) $Id: spectra.c 20128 2017-08-01 11:19:59Z yeti-dn $
  *  Copyright (C) 2006 Owain Davies, David Necas (Yeti), Petr Klapetek.
  *  E-mail: owain.davies at blueyonder.co.uk
  *          yeti at gwyddion.net, klapetek at gwyddion.net.
@@ -30,6 +30,7 @@
 #include <libprocess/spectra.h>
 #include <libprocess/linestats.h>
 #include <libprocess/interpolation.h>
+#include "gwyprocessinternal.h"
 
 #define GWY_SPECTRA_TYPE_NAME "GwySpectra"
 /* default number number of spectra allocated to data and coords */
@@ -178,8 +179,6 @@ gwy_spectra_finalize(GObject *object)
     GwySpectra *spectra = (GwySpectra*)object;
     guint i;
 
-    gwy_debug("");
-
     GWY_OBJECT_UNREF(spectra->si_unit_xy);
     for (i = 0; i < spectra->spectra->len; i++) {
         GwySpectrum *spec = &g_array_index(spectra->spectra, GwySpectrum, i);
@@ -291,9 +290,7 @@ gwy_spectra_new_alike(GwySpectra *model)
 
     g_return_val_if_fail(GWY_IS_SPECTRA(model), NULL);
     spectra = g_object_new(GWY_TYPE_SPECTRA, NULL);
-
-    if (model->si_unit_xy)
-        spectra->si_unit_xy = gwy_si_unit_duplicate(model->si_unit_xy);
+    _gwy_assign_si_unit(model->si_unit_xy, &spectra->si_unit_xy);
 
     return spectra;
 }
@@ -356,23 +353,20 @@ gwy_spectra_serialize(GObject *obj,
     guint32 *selected;
     guint32 ncurves, ncoords, nselected;
     GByteArray *retval;
-
-    gwy_debug("");
-    g_return_val_if_fail(GWY_IS_SPECTRA(obj), NULL);
+    gpointer pxyunit;
 
     spectra = GWY_SPECTRA(obj);
-    if (!spectra->si_unit_xy)
-        spectra->si_unit_xy = gwy_si_unit_new(NULL);
 
     separate_arrays(spectra->spectra,
                     &ncurves, &curves,
                     &ncoords, &coords,
                     &nselected, &selected);
+    pxyunit = unit_pointer_if_nonempty(spectra->si_unit_xy);
 
     {
         GwySerializeSpec spec[] = {
             { 's', "title",       &spectra->title,       NULL,       },
-            { 'o', "si_unit_xy",  &spectra->si_unit_xy,  NULL,       },
+            { 'o', "si_unit_xy",  pxyunit,               NULL,       },
             { 'D', "coords",      &coords,               &ncoords,   },
             { 'I', "selected",    &selected,             &nselected, },
             { 'O', "data",        &curves,               &ncurves,   },
@@ -401,23 +395,20 @@ gwy_spectra_get_size(GObject *obj)
     guint32 *selected;
     guint32 ncurves, ncoords, nselected;
     gsize retval;
-
-    gwy_debug("");
-    g_return_val_if_fail(GWY_IS_SPECTRA(obj), 0);
+    gpointer pxyunit;
 
     spectra = GWY_SPECTRA(obj);
-    if (!spectra->si_unit_xy)
-        spectra->si_unit_xy = gwy_si_unit_new(NULL);
 
     separate_arrays(spectra->spectra,
                     &ncurves, &curves,
                     &ncoords, &coords,
                     &nselected, &selected);
+    pxyunit = unit_pointer_if_nonempty(spectra->si_unit_xy);
 
     {
         GwySerializeSpec spec[] = {
             { 's', "title",       &spectra->title,       NULL,       },
-            { 'o', "si_unit_xy",  &spectra->si_unit_xy,  NULL,       },
+            { 'o', "si_unit_xy",  pxyunit,               NULL,       },
             { 'D', "coords",      &coords,               &ncoords,   },
             { 'I', "selected",    &selected,             &nselected, },
             { 'O', "data",        &curves,               &ncurves,   },
@@ -546,8 +537,7 @@ gwy_spectra_duplicate_real(GObject *object)
     spectra = GWY_SPECTRA(object);
     duplicate = gwy_spectra_new_alike(spectra);
     duplicate->title = g_strdup(spectra->title);
-    if (spectra->si_unit_xy)
-        duplicate->si_unit_xy = gwy_si_unit_duplicate(spectra->si_unit_xy);
+    _gwy_assign_si_unit(spectra->si_unit_xy, &duplicate->si_unit_xy);
     g_array_append_vals(duplicate->spectra, spectra->spectra->data,
                         spectra->spectra->len);
 
@@ -595,14 +585,7 @@ gwy_spectra_clone_real(GObject *source, GObject *copy)
             = gwy_data_line_duplicate(dataline);
     }
 
-    /* SI Units can be NULL */
-    if (spectra->si_unit_xy && clone->si_unit_xy)
-        gwy_serializable_clone(G_OBJECT(spectra->si_unit_xy),
-                               G_OBJECT(clone->si_unit_xy));
-    else if (spectra->si_unit_xy && !clone->si_unit_xy)
-        clone->si_unit_xy = gwy_si_unit_duplicate(spectra->si_unit_xy);
-    else if (!spectra->si_unit_xy && clone->si_unit_xy)
-        GWY_OBJECT_UNREF(clone->si_unit_xy);
+    _gwy_assign_si_unit(spectra->si_unit_xy, &clone->si_unit_xy);
 }
 
 /**
@@ -659,13 +642,7 @@ gwy_spectra_set_si_unit_xy(GwySpectra *spectra,
                            GwySIUnit *si_unit)
 {
     g_return_if_fail(GWY_IS_SPECTRA(spectra));
-    g_return_if_fail(GWY_IS_SI_UNIT(si_unit));
-    if (spectra->si_unit_xy == si_unit)
-        return;
-
-    GWY_OBJECT_UNREF(spectra->si_unit_xy);
-    g_object_ref(si_unit);
-    spectra->si_unit_xy = si_unit;
+    _gwy_set_object_si_unit(si_unit, &spectra->si_unit_xy);
 }
 
 /**
diff --git a/libprocess/spline.c b/libprocess/spline.c
index 699afc2..b2b75c6 100644
--- a/libprocess/spline.c
+++ b/libprocess/spline.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: spline.c 19036 2016-10-08 10:32:41Z yeti-dn $
- *  Copyright (C) 2016 David Necas (Yeti).
+ *  @(#) $Id: spline.c 20156 2017-08-03 15:04:56Z yeti-dn $
+ *  Copyright (C) 2016-2017 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -19,10 +19,8 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-#include "config.h"
 #include <string.h>
 #include <libgwyddion/gwymacros.h>
-#include <libgwyddion/gwymath.h>
 #include <libprocess/spline.h>
 
 #define MAX_RECURSION_DEPTH 20
@@ -104,6 +102,20 @@ static void sample_curve_uniformly  (GwySpline *spline,
                                      GwyXY *velocities);
 static void calculate_point_tangents(GwySpline *spline);
 
+GType
+gwy_spline_get_type(void)
+{
+    static GType spline_type = 0;
+
+    if (G_UNLIKELY(!spline_type)) {
+        spline_type = g_boxed_type_register_static("GwySpline",
+                                                   (GBoxedCopyFunc)gwy_spline_copy,
+                                                   (GBoxedFreeFunc)gwy_spline_free);
+    }
+
+    return spline_type;
+}
+
 /**
  * gwy_spline_new:
  *
@@ -157,6 +169,30 @@ gwy_spline_free(GwySpline *spline)
 }
 
 /**
+ * gwy_spline_copy:
+ * @spline: A spline curve.
+ *
+ * Creates a copy of a spline curve.
+ *
+ * Returns: A newly created spline curve.
+ *
+ * Since: 2.49
+ **/
+GwySpline*
+gwy_spline_copy(GwySpline *spline)
+{
+    GwySpline *retval;
+
+    g_return_val_if_fail(spline, NULL);
+    retval = gwy_spline_new_from_points((const GwyXY*)spline->points->data,
+                                        spline->points->len);
+    retval->slackness = spline->slackness;
+    retval->closed = spline->closed;
+
+    return retval;
+}
+
+/**
  * gwy_spline_new_from_points:
  * @xy: Array of points in plane the curve will pass through.
  * @n: Number of points in @xy.
diff --git a/libprocess/spline.h b/libprocess/spline.h
index f0c98a4..be0259f 100644
--- a/libprocess/spline.h
+++ b/libprocess/spline.h
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: spline.h 18313 2016-02-22 08:34:52Z yeti-dn $
- *  Copyright (C) 2016 David Necas (Yeti).
+ *  @(#) $Id: spline.h 20157 2017-08-03 15:19:20Z yeti-dn $
+ *  Copyright (C) 2016-2017 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -23,14 +23,18 @@
 #define __GWY_SPLINE_H__
 
 #include <glib.h>
-#include <libprocess/triangulation.h>
+#include <libgwyddion/gwymath.h>
 
 G_BEGIN_DECLS
 
 typedef struct _GwySpline GwySpline;
 
-GwySpline*   gwy_spline_new             (void);
+#define GWY_TYPE_SPLINE (gwy_spline_get_type())
+
+GType        gwy_spline_get_type        (void)               G_GNUC_CONST;
+GwySpline*   gwy_spline_new             (void)               G_GNUC_MALLOC;
 void         gwy_spline_free            (GwySpline *spline);
+GwySpline*   gwy_spline_copy            (GwySpline *spline)  G_GNUC_MALLOC;
 GwySpline*   gwy_spline_new_from_points (const GwyXY *xy,
                                          guint n);
 guint        gwy_spline_get_npoints     (GwySpline *spline);
diff --git a/libprocess/stats-acfpsdf.c b/libprocess/stats-acfpsdf.c
new file mode 100644
index 0000000..8e2892d
--- /dev/null
+++ b/libprocess/stats-acfpsdf.c
@@ -0,0 +1,2192 @@
+/*
+ *  @(#) $Id: stats-acfpsdf.c 20128 2017-08-01 11:19:59Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include <string.h>
+#include <fftw3.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libprocess/simplefft.h>
+#include <libprocess/datafield.h>
+#include <libprocess/correct.h>
+#include <libprocess/stats.h>
+#include <libprocess/inttrans.h>
+#include "gwyprocessinternal.h"
+
+#define gwycreal(x) ((x)[0])
+#define gwycimag(x) ((x)[1])
+
+typedef void (*GwyFFTAreaFunc)(fftw_plan plan,
+                               GwyDataLine *din,
+                               GwyDataLine *dout,
+                               GwyDataLine *target_line);
+
+static inline void
+do_fft_acf(fftw_plan plan,
+           GwyDataLine *din,
+           GwyDataLine *dout,
+           GwyDataLine *target_line)
+{
+    gdouble *in, *out;
+    gint j, width, res;
+
+    width = target_line->res;
+    res = din->res;
+    in = din->data;
+    out = dout->data;
+
+    gwy_clear(in + width, res - width);
+
+    fftw_execute(plan);
+    in[0] = out[0]*out[0];
+    for (j = 1; j < (res + 1)/2; j++)
+        in[j] = in[res-j] = out[j]*out[j] + out[res-j]*out[res-j];
+    if (!(res % 2))
+        in[res/2] = out[res/2]*out[res/2];
+
+    fftw_execute(plan);
+    for (j = 0; j < width; j++)
+        target_line->data[j] += out[j]/(width - j);
+}
+
+static inline void
+do_fft_hhcf(fftw_plan plan,
+            GwyDataLine *din,
+            GwyDataLine *dout,
+            GwyDataLine *target_line)
+{
+    gdouble *in, *out;
+    gdouble sum;
+    gint j, width, res;
+
+    width = target_line->res;
+    res = din->res;
+    in = din->data;
+    out = dout->data;
+
+    sum = 0.0;
+    for (j = 0; j < width; j++) {
+        sum += in[j]*in[j] + in[width-1-j]*in[width-1-j];
+        target_line->data[width-1-j] += sum*res/(j+1);
+    }
+
+    gwy_clear(in + width, res - width);
+
+    fftw_execute(plan);
+    in[0] = out[0]*out[0];
+    for (j = 1; j < (res + 1)/2; j++)
+        in[j] = in[res-j] = out[j]*out[j] + out[res-j]*out[res-j];
+    if (!(res % 2))
+        in[res/2] = out[res/2]*out[res/2];
+
+    fftw_execute(plan);
+    for (j = 0; j < width; j++)
+        target_line->data[j] -= 2*out[j]/(width - j);
+}
+
+static void
+gwy_data_field_area_func_fft(GwyDataField *data_field,
+                             GwyDataLine *target_line,
+                             GwyFFTAreaFunc func,
+                             gint col, gint row,
+                             gint width, gint height,
+                             GwyOrientation orientation,
+                             GwyInterpolationType interpolation,
+                             gint nstats)
+{
+    GwyDataLine *din, *dout;
+    fftw_plan plan;
+    gdouble *in, *out, *drow, *dcol;
+    gint i, j, xres, yres, res = 0;
+    gdouble avg;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    g_return_if_fail(GWY_IS_DATA_LINE(target_line));
+    xres = data_field->xres;
+    yres = data_field->yres;
+    g_return_if_fail(col >= 0 && row >= 0
+                     && width >= 1 && height >= 1
+                     && col + width <= xres
+                     && row + height <= yres);
+    g_return_if_fail(orientation == GWY_ORIENTATION_HORIZONTAL
+                     || orientation == GWY_ORIENTATION_VERTICAL);
+
+    switch (orientation) {
+        case GWY_ORIENTATION_HORIZONTAL:
+        res = gwy_fft_find_nice_size(2*xres);
+        gwy_data_line_resample(target_line, width, GWY_INTERPOLATION_NONE);
+        break;
+
+        case GWY_ORIENTATION_VERTICAL:
+        res = gwy_fft_find_nice_size(2*yres);
+        gwy_data_line_resample(target_line, height, GWY_INTERPOLATION_NONE);
+        break;
+    }
+    gwy_data_line_clear(target_line);
+    gwy_data_line_set_offset(target_line, 0.0);
+
+    din = gwy_data_line_new(res, 1.0, FALSE);
+    dout = gwy_data_line_new(res, 1.0, FALSE);
+    in = gwy_data_line_get_data(din);
+    out = gwy_data_line_get_data(dout);
+    plan = fftw_plan_r2r_1d(res, in, out, FFTW_R2HC, _GWY_FFTW_PATIENCE);
+    g_return_if_fail(plan);
+
+    switch (orientation) {
+        case GWY_ORIENTATION_HORIZONTAL:
+        for (i = 0; i < height; i++) {
+            drow = data_field->data + (i + row)*xres + col;
+            avg = gwy_data_field_area_get_avg(data_field, NULL,
+                                              col, row+i, width, 1);
+            for (j = 0; j < width; j++)
+                in[j] = drow[j] - avg;
+            func(plan, din, dout, target_line);
+        }
+        gwy_data_line_set_real(target_line,
+                               gwy_data_field_jtor(data_field, width));
+        gwy_data_line_multiply(target_line, 1.0/(res*height));
+        break;
+
+        case GWY_ORIENTATION_VERTICAL:
+        for (i = 0; i < width; i++) {
+            dcol = data_field->data + row*xres + (i + col);
+            avg = gwy_data_field_area_get_avg(data_field, NULL,
+                                              col+i, row, 1, height);
+            for (j = 0; j < height; j++)
+                in[j] = dcol[j*xres] - avg;
+            func(plan, din, dout, target_line);
+        }
+        gwy_data_line_set_real(target_line,
+                               gwy_data_field_itor(data_field, height));
+        gwy_data_line_multiply(target_line, 1.0/(res*width));
+        break;
+    }
+
+    fftw_destroy_plan(plan);
+    g_object_unref(din);
+    g_object_unref(dout);
+
+    if (nstats > 1)
+        gwy_data_line_resample(target_line, nstats, interpolation);
+}
+
+/**
+ * gwy_data_field_area_acf:
+ * @data_field: A data field.
+ * @target_line: A data line to store the distribution to.  It will be
+ *               resampled to requested width.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ * @orientation: Orientation of lines (ACF is simply averaged over the
+ *               other orientation).
+ * @interpolation: Interpolation to use when @nstats is given and requires
+ *                 resampling.
+ * @nstats: The number of samples to take on the distribution function.  If
+ *          nonpositive, @width (@height) is used.
+ *
+ * Calculates one-dimensional autocorrelation function of a rectangular part of
+ * a data field.
+ **/
+void
+gwy_data_field_area_acf(GwyDataField *data_field,
+                        GwyDataLine *target_line,
+                        gint col, gint row,
+                        gint width, gint height,
+                        GwyOrientation orientation,
+                        GwyInterpolationType interpolation,
+                        gint nstats)
+{
+    gwy_data_field_area_func_fft(data_field, target_line,
+                                 &do_fft_acf,
+                                 col, row, width, height,
+                                 orientation, interpolation, nstats);
+    /* Set proper units */
+    _gwy_assign_si_unit(data_field->si_unit_xy, &target_line->si_unit_x);
+    gwy_si_unit_power(gwy_data_field_get_si_unit_z(data_field), 2,
+                      gwy_data_line_get_si_unit_y(target_line));
+}
+
+/**
+ * gwy_data_field_acf:
+ * @data_field: A data field.
+ * @target_line: A data line to store the distribution to.  It will be
+ *               resampled to requested width.
+ * @orientation: Orientation of lines (ACF is simply averaged over the
+ *               other orientation).
+ * @interpolation: Interpolation to use when @nstats is given and requires
+ *                 resampling.
+ * @nstats: The number of samples to take on the distribution function.  If
+ *          nonpositive, data field width (height) is used.
+ *
+ * Calculates one-dimensional autocorrelation function of a data field.
+ **/
+void
+gwy_data_field_acf(GwyDataField *data_field,
+                   GwyDataLine *target_line,
+                   GwyOrientation orientation,
+                   GwyInterpolationType interpolation,
+                   gint nstats)
+{
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    gwy_data_field_area_acf(data_field, target_line,
+                            0, 0, data_field->xres, data_field->yres,
+                            orientation, interpolation, nstats);
+}
+
+/**
+ * gwy_data_field_area_hhcf:
+ * @data_field: A data field.
+ * @target_line: A data line to store the distribution to.  It will be
+ *               resampled to requested width.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ * @orientation: Orientation of lines (HHCF is simply averaged over the
+ *               other orientation).
+ * @interpolation: Interpolation to use when @nstats is given and requires
+ *                 resampling.
+ * @nstats: The number of samples to take on the distribution function.  If
+ *          nonpositive, @width (@height) is used.
+ *
+ * Calculates one-dimensional autocorrelation function of a rectangular part of
+ * a data field.
+ **/
+void
+gwy_data_field_area_hhcf(GwyDataField *data_field,
+                         GwyDataLine *target_line,
+                         gint col, gint row,
+                         gint width, gint height,
+                         GwyOrientation orientation,
+                         GwyInterpolationType interpolation,
+                         gint nstats)
+{
+    gwy_data_field_area_func_fft(data_field, target_line, &do_fft_hhcf,
+                                 col, row, width, height,
+                                 orientation, interpolation, nstats);
+
+    /* Set proper units */
+    _gwy_assign_si_unit(data_field->si_unit_xy, &target_line->si_unit_x);
+    gwy_si_unit_power(gwy_data_field_get_si_unit_z(data_field), 2,
+                      gwy_data_line_get_si_unit_y(target_line));
+}
+
+/**
+ * gwy_data_field_hhcf:
+ * @data_field: A data field.
+ * @target_line: A data line to store the distribution to.  It will be
+ *               resampled to requested width.
+ * @orientation: Orientation of lines (HHCF is simply averaged over the
+ *               other orientation).
+ * @interpolation: Interpolation to use when @nstats is given and requires
+ *                 resampling.
+ * @nstats: The number of samples to take on the distribution function.  If
+ *          nonpositive, data field width (height) is used.
+ *
+ * Calculates one-dimensional autocorrelation function of a data field.
+ **/
+void
+gwy_data_field_hhcf(GwyDataField *data_field,
+                    GwyDataLine *target_line,
+                    GwyOrientation orientation,
+                    GwyInterpolationType interpolation,
+                    gint nstats)
+{
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    gwy_data_field_area_hhcf(data_field, target_line,
+                             0, 0, data_field->xres, data_field->yres,
+                             orientation, interpolation, nstats);
+}
+
+/**
+ * gwy_data_field_area_psdf:
+ * @data_field: A data field.
+ * @target_line: A data line to store the distribution to.  It will be
+ *               resampled to requested width.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ * @orientation: Orientation of lines (PSDF is simply averaged over the
+ *               other orientation).
+ * @interpolation: Interpolation to use when @nstats is given and requires
+ *                 resampling.
+ * @windowing: Windowing type to use.
+ * @nstats: The number of samples to take on the distribution function.  If
+ *          nonpositive, data field width (height) is used.
+ *
+ * Calculates one-dimensional power spectrum density function of a rectangular
+ * part of a data field.
+ **/
+void
+gwy_data_field_area_psdf(GwyDataField *data_field,
+                         GwyDataLine *target_line,
+                         gint col, gint row,
+                         gint width, gint height,
+                         GwyOrientation orientation,
+                         GwyInterpolationType interpolation,
+                         GwyWindowingType windowing,
+                         gint nstats)
+{
+    GwyDataField *re_field, *im_field;
+    GwySIUnit *xyunit, *zunit, *lineunit;
+    gdouble *re, *im, *target;
+    gint i, j, xres, yres, size;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    g_return_if_fail(GWY_IS_DATA_LINE(target_line));
+    xres = data_field->xres;
+    yres = data_field->yres;
+    size = (orientation == GWY_ORIENTATION_HORIZONTAL) ? width : height;
+    g_return_if_fail(col >= 0 && row >= 0
+                     && width >= 1 && height >= 1
+                     && size >= 4
+                     && col + width <= xres
+                     && row + height <= yres);
+    g_return_if_fail(orientation == GWY_ORIENTATION_HORIZONTAL
+                     || orientation == GWY_ORIENTATION_VERTICAL);
+
+    if (nstats < 1)
+        nstats = size/2 - 1;
+    gwy_data_line_resample(target_line, size/2, GWY_INTERPOLATION_NONE);
+    gwy_data_line_clear(target_line);
+    gwy_data_line_set_offset(target_line, 0.0);
+
+    re_field = gwy_data_field_new(width, height, 1.0, 1.0, FALSE);
+    im_field = gwy_data_field_new(width, height, 1.0, 1.0, FALSE);
+    target = target_line->data;
+    switch (orientation) {
+        case GWY_ORIENTATION_HORIZONTAL:
+        gwy_data_field_area_1dfft(data_field, NULL, re_field, im_field,
+                                  col, row, width, height,
+                                  orientation,
+                                  windowing,
+                                  GWY_TRANSFORM_DIRECTION_FORWARD,
+                                  interpolation,
+                                  TRUE, 2);
+        re = re_field->data;
+        im = im_field->data;
+        for (i = 0; i < height; i++) {
+            for (j = 0; j < size/2; j++)
+                target[j] += re[i*width + j]*re[i*width + j]
+                             + im[i*width + j]*im[i*width + j];
+        }
+        gwy_data_line_multiply(target_line,
+                               data_field->xreal/xres/(2*G_PI*height));
+        gwy_data_line_set_real(target_line, G_PI*xres/data_field->xreal);
+        break;
+
+        case GWY_ORIENTATION_VERTICAL:
+        gwy_data_field_area_1dfft(data_field, NULL, re_field, im_field,
+                                  col, row, width, height,
+                                  orientation,
+                                  windowing,
+                                  GWY_TRANSFORM_DIRECTION_FORWARD,
+                                  interpolation,
+                                  TRUE, 2);
+        re = re_field->data;
+        im = im_field->data;
+        for (i = 0; i < width; i++) {
+            for (j = 0; j < size/2; j++)
+                target[j] += re[j*width + i]*re[j*width + i]
+                             + im[j*width + i]*im[j*width + i];
+        }
+        gwy_data_line_multiply(target_line,
+                               data_field->yreal/yres/(2*G_PI*width));
+        gwy_data_line_set_real(target_line, G_PI*yres/data_field->yreal);
+        break;
+    }
+
+    gwy_data_line_set_offset(target_line,
+                             target_line->real/target_line->res);
+    gwy_data_line_resize(target_line, 1, target_line->res);
+    gwy_data_line_resample(target_line, nstats, interpolation);
+
+    g_object_unref(re_field);
+    g_object_unref(im_field);
+
+    /* Set proper units */
+    xyunit = gwy_data_field_get_si_unit_xy(data_field);
+    zunit = gwy_data_field_get_si_unit_z(data_field);
+    lineunit = gwy_data_line_get_si_unit_x(target_line);
+    gwy_si_unit_power(xyunit, -1, lineunit);
+    lineunit = gwy_data_line_get_si_unit_y(target_line);
+    gwy_si_unit_power(zunit, 2, lineunit);
+    gwy_si_unit_multiply(lineunit, xyunit, lineunit);
+}
+
+/**
+ * gwy_data_field_psdf:
+ * @data_field: A data field.
+ * @target_line: A data line to store the distribution to.  It will be
+ *               resampled to requested width.
+ * @orientation: Orientation of lines (PSDF is simply averaged over the
+ *               other orientation).
+ * @interpolation: Interpolation to use when @nstats is given and requires
+ *                 resampling.
+ * @windowing: Windowing type to use.
+ * @nstats: The number of samples to take on the distribution function.  If
+ *          nonpositive, data field width (height) is used.
+ *
+ * Calculates one-dimensional power spectrum density function of a data field.
+ **/
+void
+gwy_data_field_psdf(GwyDataField *data_field,
+                    GwyDataLine *target_line,
+                    GwyOrientation orientation,
+                    GwyInterpolationType interpolation,
+                    GwyWindowingType windowing,
+                    gint nstats)
+{
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    gwy_data_field_area_psdf(data_field, target_line,
+                             0, 0, data_field->xres, data_field->yres,
+                             orientation, interpolation, windowing, nstats);
+}
+
+/**
+ * gwy_data_field_area_rpsdf:
+ * @data_field: A data field.
+ * @target_line: A data line to store the distribution to.  It will be
+ *               resampled to requested width.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ * @interpolation: Interpolation to use when @nstats is given and requires
+ *                 resampling.
+ * @windowing: Windowing type to use.
+ * @nstats: The number of samples to take on the distribution function.  If
+ *          nonpositive, data field width (height) is used.
+ *
+ * Calculates radial power spectrum density function of a rectangular
+ * part of a data field.
+ *
+ * Since: 2.7
+ **/
+void
+gwy_data_field_area_rpsdf(GwyDataField *data_field,
+                          GwyDataLine *target_line,
+                          gint col, gint row,
+                          gint width, gint height,
+                          GwyInterpolationType interpolation,
+                          GwyWindowingType windowing,
+                          gint nstats)
+{
+    GwyDataField *re_field, *im_field;
+    GwySIUnit *xyunit, *zunit, *lineunit;
+    gdouble *re, *im;
+    gint i, j, k, xres, yres;
+    gdouble xreal, yreal, r;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    g_return_if_fail(GWY_IS_DATA_LINE(target_line));
+    xres = data_field->xres;
+    yres = data_field->yres;
+    g_return_if_fail(col >= 0 && row >= 0
+                     && width >= 4 && height >= 4
+                     && col + width <= xres
+                     && row + height <= yres);
+    xreal = data_field->xreal;
+    yreal = data_field->yreal;
+
+    re_field = gwy_data_field_new(width, height,
+                                  width*xreal/xres, height*yreal/yres,
+                                  FALSE);
+    im_field = gwy_data_field_new_alike(re_field, FALSE);
+    gwy_data_field_area_2dfft(data_field, NULL, re_field, im_field,
+                              col, row, width, height,
+                              windowing,
+                              GWY_TRANSFORM_DIRECTION_FORWARD,
+                              interpolation,
+                              TRUE, 2);
+    re = re_field->data;
+    im = im_field->data;
+    for (i = 0; i < height; i++) {
+        for (j = 0; j < width; j++) {
+            k = i*width + j;
+            re[k] = re[k]*re[k] + im[k]*im[k];
+        }
+    }
+    g_object_unref(im_field);
+
+    gwy_data_field_fft_postprocess(re_field, TRUE);
+    r = 0.5*MAX(re_field->xreal, re_field->yreal);
+    gwy_data_field_angular_average(re_field, target_line,
+                                   NULL, GWY_MASK_IGNORE,
+                                   0.0, 0.0, r, nstats ? nstats+1 : 0);
+    g_object_unref(re_field);
+    /* Get rid of the zero first element which is bad for logscale. */
+    nstats = target_line->res-1;
+    gwy_data_line_resize(target_line, 1, nstats+1);
+    target_line->off += target_line->real/nstats;
+
+    /* Postprocess does not use angular coordinates, fix that. */
+    target_line->real *= 2.0*G_PI;
+    target_line->off *= 2.0*G_PI;
+    r = xreal*yreal/(2.0*G_PI*width*height) * target_line->real/nstats;
+    for (k = 0; k < nstats; k++)
+        target_line->data[k] *= r*(k + 1);
+
+    /* Set proper value units */
+    xyunit = gwy_data_field_get_si_unit_xy(data_field);
+    zunit = gwy_data_field_get_si_unit_z(data_field);
+    lineunit = gwy_data_line_get_si_unit_x(target_line);
+    gwy_si_unit_power(xyunit, -1, lineunit);
+    lineunit = gwy_data_line_get_si_unit_y(target_line);
+    gwy_si_unit_power(zunit, 2, lineunit);
+    gwy_si_unit_multiply(lineunit, xyunit, lineunit);
+}
+
+/**
+ * gwy_data_field_rpsdf:
+ * @data_field: A data field.
+ * @target_line: A data line to store the distribution to.  It will be
+ *               resampled to requested width.
+ * @interpolation: Interpolation to use when @nstats is given and requires
+ *                 resampling.
+ * @windowing: Windowing type to use.
+ * @nstats: The number of samples to take on the distribution function.  If
+ *          nonpositive, data field width (height) is used.
+ *
+ * Calculates radial power spectrum density function of a data field.
+ *
+ * Since: 2.7
+ **/
+void
+gwy_data_field_rpsdf(GwyDataField *data_field,
+                     GwyDataLine *target_line,
+                     GwyInterpolationType interpolation,
+                     GwyWindowingType windowing,
+                     gint nstats)
+{
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    gwy_data_field_area_rpsdf(data_field, target_line,
+                              0, 0, data_field->xres, data_field->yres,
+                              interpolation, windowing, nstats);
+}
+
+/**
+ * gwy_data_field_area_racf:
+ * @data_field: A data field.
+ * @target_line: A data line to store the autocorrelation function to.  It
+ *               will be resampled to requested width.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ * @nstats: The number of samples to take on the autocorrelation function.  If
+ *          nonpositive, a suitable resolution is chosen automatically.
+ *
+ * Calculates radially averaged autocorrelation function of a rectangular part
+ * of a data field.
+ *
+ * Since: 2.22
+ **/
+void
+gwy_data_field_area_racf(GwyDataField *data_field,
+                         GwyDataLine *target_line,
+                         gint col, gint row,
+                         gint width, gint height,
+                         gint nstats)
+{
+    GwyDataField *acf_field;
+    gint xres, yres, size;
+    gdouble r;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    g_return_if_fail(GWY_IS_DATA_LINE(target_line));
+    xres = data_field->xres;
+    yres = data_field->yres;
+    g_return_if_fail(col >= 0 && row >= 0
+                     && width >= 4 && height >= 4
+                     && col + width <= xres
+                     && row + height <= yres);
+
+    size = MIN(width, height)/2;
+    if (nstats < 1)
+        nstats = size;
+
+    acf_field = gwy_data_field_new(2*size - 1, 2*size - 1, 1.0, 1.0, FALSE);
+    gwy_data_field_area_2dacf(data_field, acf_field,
+                              col, row, width, height, size, size);
+    r = 0.5*MAX(acf_field->xreal, acf_field->yreal);
+    gwy_data_field_angular_average(acf_field, target_line,
+                                   NULL, GWY_MASK_IGNORE,
+                                   0.0, 0.0, r, nstats);
+    g_object_unref(acf_field);
+}
+
+/**
+ * gwy_data_field_racf:
+ * @data_field: A data field.
+ * @target_line: A data line to store the autocorrelation function to.  It
+ *               will be resampled to requested width.
+ * @nstats: The number of samples to take on the autocorrelation function.  If
+ *          nonpositive, a suitable resolution is chosen automatically.
+ *
+ * Calculates radially averaged autocorrelation function of a data field.
+ *
+ * Since: 2.22
+ **/
+void
+gwy_data_field_racf(GwyDataField *data_field,
+                    GwyDataLine *target_line,
+                    gint nstats)
+{
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    gwy_data_field_area_racf(data_field, target_line,
+                             0, 0, data_field->xres, data_field->yres,
+                             nstats);
+}
+
+/**
+ * gwy_data_field_area_2dacf:
+ * @data_field: A data field.
+ * @target_field: A data field to store the result to.  It will be resampled
+ *                to (2 at xrange-1)x(2 at yrange-1).
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ * @xrange: Horizontal correlation range.  Non-positive value means
+ *          the default range of half of @data_field width will be used.
+ * @yrange: Vertical correlation range.  Non-positive value means
+ *          the default range of half of @data_field height will be used.
+ *
+ * Calculates two-dimensional autocorrelation function of a data field area.
+ *
+ * The resulting data field has the correlation corresponding to (0,0) in the
+ * centre.
+ *
+ * The maximum possible values of @xrange and @yrange are @data_field
+ * width and height, respectively.  However, as the values for longer
+ * distances are calculated from smaller number of data points they become
+ * increasingly bogus, therefore the default range is half of the size.
+ *
+ * Since: 2.7
+ **/
+void
+gwy_data_field_area_2dacf(GwyDataField *data_field,
+                          GwyDataField *target_field,
+                          gint col, gint row,
+                          gint width, gint height,
+                          gint xrange, gint yrange)
+{
+    fftw_plan plan;
+    GwyDataField *re_in, *re_out, *im_out, *ibuf;
+    gdouble *src, *dst, *dstm;
+    gint i, j, xres, yres, xsize, ysize;
+    gdouble xreal, yreal, v, q;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    g_return_if_fail(GWY_IS_DATA_FIELD(target_field));
+    xres = data_field->xres;
+    yres = data_field->yres;
+    g_return_if_fail(col >= 0 && row >= 0
+                     && width >= 4 && height >= 4
+                     && col + width <= xres
+                     && row + height <= yres);
+    if (xrange <= 0)
+        xrange = width/2;
+    if (yrange <= 0)
+        yrange = height/2;
+    g_return_if_fail(xrange <= width && yrange <= height);
+    xreal = data_field->xreal;
+    yreal = data_field->yreal;
+
+    xsize = gwy_fft_find_nice_size(width + xrange);
+    ysize = gwy_fft_find_nice_size(height + yrange);
+
+    re_in = gwy_data_field_new(xsize, height, 1.0, 1.0, TRUE);
+    re_out = gwy_data_field_new_alike(re_in, FALSE);
+    im_out = gwy_data_field_new_alike(re_in, FALSE);
+    ibuf = gwy_data_field_new_alike(re_in, FALSE);
+
+    /* Stage 1: Row-wise FFT, with zero-padded columns.
+     * No need to transform the padding rows as zero rises from zeroes. */
+    gwy_data_field_area_copy(data_field, re_in, col, row, width, height, 0, 0);
+    gwy_data_field_1dfft_raw(re_in, NULL, re_out, im_out,
+                             GWY_ORIENTATION_HORIZONTAL,
+                             GWY_TRANSFORM_DIRECTION_FORWARD);
+
+    /* Stage 2: Column-wise FFT, taking the norm and another column-wise FTT.
+     * We take the advantage of the fact that the order of the row- and
+     * column-wise transforms is arbitrary and that taking the norm is a
+     * local operation. */
+    /* Use interleaved arrays, this enables us to foist them as `complex'
+     * to FFTW. */
+    src = g_new(gdouble, 4*ysize);
+    dst = src + 2*ysize;
+    q = sqrt(xsize)/ysize;
+    plan = fftw_plan_dft_1d(ysize, (fftw_complex*)src, (fftw_complex*)dst,
+                            FFTW_FORWARD, _GWY_FFTW_PATIENCE);
+    for (j = 0; j < xsize; j++) {
+        for (i = 0; i < height; i++) {
+            src[2*i + 0] = re_out->data[i*xsize + j];
+            src[2*i + 1] = im_out->data[i*xsize + j];
+        }
+        gwy_clear(src + 2*height, 2*(ysize - height));
+        fftw_execute(plan);
+        for (i = 0; i < ysize; i++) {
+            src[2*i] = dst[2*i]*dst[2*i] + dst[2*i + 1]*dst[2*i + 1];
+            src[2*i + 1] = 0.0;
+        }
+        fftw_execute(plan);
+        for (i = 0; i < height; i++) {
+            re_in->data[i*xsize + j] = dst[2*i + 0];
+            ibuf->data[i*xsize + j]  = dst[2*i + 1];
+        }
+    }
+    fftw_destroy_plan(plan);
+    g_free(src);
+
+    /* Stage 3: The final row-wise FFT. */
+    gwy_data_field_1dfft_raw(re_in, ibuf, re_out, im_out,
+                             GWY_ORIENTATION_HORIZONTAL,
+                             GWY_TRANSFORM_DIRECTION_FORWARD);
+
+    g_object_unref(ibuf);
+    g_object_unref(re_in);
+    g_object_unref(im_out);
+
+    gwy_data_field_resample(target_field, 2*xrange - 1, 2*yrange - 1,
+                            GWY_INTERPOLATION_NONE);
+    /* Extract the correlation data and reshuflle it to human-undestandable
+     * positions with 0.0 at the centre. */
+    for (i = 0; i < yrange; i++) {
+        src = re_out->data + i*xsize;
+        dst = target_field->data + (yrange-1 + i)*target_field->xres;
+        dstm = target_field->data + (yrange-1 - i)*target_field->xres;
+        for (j = 0; j < xrange; j++) {
+            if (j > 0) {
+                v = q*src[xsize - j]/(height - i)/(width - j);
+                if (i > 0)
+                    dstm[xrange-1 + j] = v;
+                dst[xrange-1 - j] = v;
+            }
+            v = q*src[j]/(height - i)/(width - j);
+            if (i > 0)
+                dstm[xrange-1 - j] = v;
+            dst[xrange-1 + j] = v;
+        }
+    }
+    g_object_unref(re_out);
+
+    target_field->xreal = xreal*target_field->xres/xres;
+    target_field->yreal = yreal*target_field->yres/yres;
+    target_field->xoff = -0.5*target_field->xreal;
+    target_field->yoff = -0.5*target_field->yreal;
+
+    _gwy_assign_si_unit(data_field->si_unit_xy, &target_field->si_unit_xy);
+    gwy_si_unit_power(gwy_data_field_get_si_unit_z(data_field), 2,
+                      gwy_data_field_get_si_unit_z(target_field));
+
+    gwy_data_field_invalidate(target_field);
+}
+
+/**
+ * gwy_data_field_2dacf:
+ * @data_field: A data field.
+ * @target_field: A data field to store the result to.
+ *
+ * Calculates two-dimensional autocorrelation function of a data field.
+ *
+ * See gwy_data_field_area_2dacf() for details.  Parameters missing (not
+ * adjustable) in this function are set to their default values.
+ *
+ * Since: 2.7
+ **/
+void
+gwy_data_field_2dacf(GwyDataField *data_field,
+                     GwyDataField *target_field)
+{
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+
+    gwy_data_field_area_2dacf(data_field, target_field,
+                              0, 0, data_field->xres, data_field->yres, 0, 0);
+}
+
+/* Does not really belong here, but is is used only by functions from this
+ * source file, so... */
+
+/**
+ * gwy_data_field_angular_average:
+ * @data_field: A data field.
+ * @target_line: A data line to store the distribution to.  It will be
+ *               resampled to @nstats size.
+ * @mask: Mask of pixels to include from/exclude in the averaging, or %NULL
+ *        for full @data_field.
+ * @masking: Masking mode to use.  See the introduction for description of
+ *           masking modes.
+ * @x: X-coordinate of the averaging disc origin, in real coordinates
+ *     including offsets.
+ * @y: Y-coordinate of the averaging disc origin, in real coordinates
+ *     including offsets.
+ * @r: Radius, in real coordinates.  It determines the real length of the
+ *     resulting line.
+ * @nstats: The number of samples the resulting line should have.  A
+ *          non-positive value means the sampling will be determined
+ *          automatically.
+ *
+ * Performs angular averaging of a part of a data field.
+ *
+ * The result of such averaging is an radial profile, starting from the disc
+ * centre.
+ *
+ * The function does not guarantee that @target_line will have exactly @nstats
+ * samples upon return.  A cmaller number of samples than requested may be
+ * calculated for instance if either central or outer part of the disc is
+ * excluded by masking.
+ *
+ * Since: 2.42
+ **/
+void
+gwy_data_field_angular_average(GwyDataField *data_field,
+                               GwyDataLine *target_line,
+                               GwyDataField *mask,
+                               GwyMaskingType masking,
+                               gdouble x,
+                               gdouble y,
+                               gdouble r,
+                               gint nstats)
+{
+    gint ifrom, ito, jfrom, jto, i, j, k, kfrom, kto, xres, yres;
+    gdouble xreal, yreal, dx, dy, xoff, yoff, h, rr;
+    const gdouble *d, *m;
+    gdouble *target, *weight;
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    g_return_if_fail(GWY_IS_DATA_LINE(target_line));
+    g_return_if_fail(r >= 0.0);
+    xres = data_field->xres;
+    yres = data_field->yres;
+    if (masking == GWY_MASK_IGNORE)
+        mask = NULL;
+    else if (!mask)
+        masking = GWY_MASK_IGNORE;
+
+    if (mask) {
+        g_return_if_fail(GWY_IS_DATA_FIELD(mask));
+        g_return_if_fail(mask->xres == xres);
+        g_return_if_fail(mask->yres == yres);
+    }
+
+    xreal = data_field->xreal;
+    yreal = data_field->yreal;
+    xoff = data_field->xoff;
+    yoff = data_field->yoff;
+    g_return_if_fail(x >= xoff && x <= xoff + xreal);
+    g_return_if_fail(y >= yoff && y <= yoff + yreal);
+    /* Just for integer overflow; we limit i and j ranges explicitly later. */
+    r = MIN(r, hypot(xreal, yreal));
+    x -= xoff;
+    y -= yoff;
+
+    dx = xreal/xres;
+    dy = yreal/yres;
+
+    /* Prefer sampling close to the shorter step. */
+    if (nstats < 1) {
+        h = 2.0*dx*dy/(dx + dy);
+        nstats = GWY_ROUND(r/h);
+        nstats = MAX(nstats, 1);
+    }
+    h = r/nstats;
+
+    d = data_field->data;
+    m = mask ? mask->data : NULL;
+
+    gwy_data_line_resample(target_line, nstats, GWY_INTERPOLATION_NONE);
+    gwy_data_line_clear(target_line);
+    gwy_data_field_copy_units_to_data_line(data_field, target_line);
+    target_line->real = h*nstats;
+    target_line->off = 0.0;
+    target = target_line->data;
+    /* Just return something for single-point lines. */
+    if (nstats < 2 || r == 0.0) {
+        /* NB: gwy_data_field_get_dval_real() does not use offsets. */
+        target[0] = gwy_data_field_get_dval_real(data_field, x, y,
+                                                 GWY_INTERPOLATION_ROUND);
+        return;
+    }
+
+    ifrom = (gint)floor(gwy_data_field_rtoi(data_field, y - r));
+    ifrom = MAX(ifrom, 0);
+    ito = (gint)ceil(gwy_data_field_rtoi(data_field, y + r));
+    ito = MIN(ito, yres-1);
+
+    jfrom = (gint)floor(gwy_data_field_rtoj(data_field, x - r));
+    jfrom = MAX(jfrom, 0);
+    jto = (gint)ceil(gwy_data_field_rtoj(data_field, x + r));
+    jto = MIN(jto, xres-1);
+
+    weight = g_new0(gdouble, nstats);
+    for (i = ifrom; i <= ito; i++) {
+        gdouble yy = (i + 0.5)*dy - y;
+        for (j = jfrom; j <= jto; j++) {
+            gdouble xx = (j + 0.5)*dx - x;
+            gdouble v = d[i*xres + j];
+
+            if ((masking == GWY_MASK_INCLUDE && m[i*xres + j] <= 0.0)
+                || (masking == GWY_MASK_EXCLUDE && m[i*xres + j] >= 1.0))
+                continue;
+
+            rr = sqrt(xx*xx + yy*yy)/h;
+            k = floor(rr);
+            if (k+1 >= nstats) {
+                if (k+1 == nstats) {
+                    target[k] += v;
+                    weight[k] += 1.0;
+                }
+                continue;
+            }
+
+            rr -= k;
+            if (rr <= 0.5)
+                rr = 2.0*rr*rr;
+            else
+                rr = 1.0 - 2.0*(1.0 - rr)*(1.0 - rr);
+
+            target[k] += (1.0 - rr)*v;
+            target[k+1] += rr*v;
+            weight[k] += 1.0 - rr;
+            weight[k+1] += rr;
+        }
+    }
+
+    /* Get rid of initial and trailing no-data segment. */
+    for (kfrom = 0; kfrom < nstats; kfrom++) {
+        if (weight[kfrom])
+            break;
+    }
+    for (kto = nstats-1; kto > kfrom; kto--) {
+        if (weight[kto])
+            break;
+    }
+    if (kto - kfrom < 2) {
+        /* XXX: This is not correct.  We do not care. */
+        target_line->real = h;
+        target[0] = gwy_data_field_get_dval_real(data_field, x, y,
+                                                 GWY_INTERPOLATION_ROUND);
+        return;
+    }
+
+    if (kfrom != 0 || kto != nstats-1) {
+        nstats = kto+1 - kfrom;
+        gwy_data_line_resize(target_line, kfrom, kto+1);
+        target = target_line->data;
+        target_line->off = kfrom*h;
+        memmove(weight, weight + kfrom, nstats*sizeof(gdouble));
+    }
+    g_assert(weight[0]);
+    g_assert(weight[nstats-1]);
+
+    /* Fill holes where we have no weight, this can occur near the start if
+     * large nstats is requested. */
+    kfrom = -1;
+    for (k = 0; k < nstats; k++) {
+        if (weight[k]) {
+            target[k] /= weight[k];
+            if (kfrom+1 != k) {
+                gdouble first = target[kfrom];
+                gdouble last = target[k];
+                for (j = kfrom+1; j < k; j++) {
+                    gdouble w = (j - kfrom)/(gdouble)(k - kfrom);
+                    target[j] = w*last + (1.0 - w)*first;
+                }
+            }
+            kfrom = k;
+        }
+    }
+
+    g_free(weight);
+}
+
+/**************************************************************************
+ *
+ * Masked ACF, HHCF, PSDF
+ * DOI 10.1016/j.ultramic.2012.08.002
+ *
+ **************************************************************************/
+
+static void
+row_assign_mask(GwyDataField *mask,
+                guint col,
+                guint row,
+                guint width,
+                GwyMaskingType masking,
+                gdouble *out)
+{
+    const gdouble *m = mask->data + row*mask->xres + col;
+    guint j;
+
+    if (masking == GWY_MASK_INCLUDE) {
+        for (j = width; j; j--, out++, m++)
+            *out = (*m > 0.0);
+    }
+    else {
+        for (j = width; j; j--, out++, m++)
+            *out = (*m <= 0.0);
+    }
+}
+
+static void
+row_accumulate(gdouble *accum,
+               const gdouble *data,
+               guint size)
+{
+    guint j;
+
+    for (j = size; j; j--, accum++, data++)
+        *accum += *data;
+}
+
+/* FFTW calculates unnormalised DFT so we divide the result of the first
+ * transformation with (1/√size)² = 1/size and keep the second transfrom as-is
+ * to obtain exactly g_k.
+ *
+ * Here we deviate from the paper and try to smoothly interpolate the missing
+ * values to reduce spurious high-frequency content.  It helps sometimes... */
+static void
+row_divide_nonzero_with_laplace(const gdouble *numerator,
+                                const gdouble *denominator,
+                                gdouble *out,
+                                guint size)
+{
+    GwyDataLine *line, *mask;
+    guint j;
+    gboolean have_zero = FALSE;
+
+    for (j = 0; j < size; j++) {
+        if (denominator[j] != 0)
+            out[j] = numerator[j]/denominator[j];
+        else {
+            out[j] = 0.0;
+            have_zero = TRUE;
+        }
+    }
+
+    if (!have_zero)
+        return;
+
+    line = gwy_data_line_new(size, size, FALSE);
+    gwy_assign(line->data, out, size);
+    mask = gwy_data_line_new(size, size, FALSE);
+    for (j = 0; j < size; j++)
+        mask->data[j] = (denominator[j] == 0);
+
+    gwy_data_line_correct_laplace(line, mask);
+    gwy_assign(out, line->data, size);
+
+    g_object_unref(line);
+    g_object_unref(mask);
+}
+
+static void
+row_accum_cnorm(gdouble *accum,
+                const fftw_complex *fftc,
+                guint size,
+                gdouble q)
+{
+    gdouble *out = accum, *out2 = accum + (size-1);
+    gdouble re = gwycreal(*fftc), im = gwycimag(*fftc);
+    gdouble v;
+    guint j;
+
+    q /= size;
+    v = q*(re*re + im*im);
+    *out += v;
+    out++, fftc++;
+    for (j = (size + 1)/2 - 1; j; j--, fftc++, out++, out2--) {
+        re = gwycreal(*fftc);
+        im = gwycimag(*fftc);
+        v = q*(re*re + im*im);
+        *out += v;
+        *out2 += v;
+    }
+    if (size % 2 == 0) {
+        re = gwycreal(*fftc);
+        im = gwycimag(*fftc);
+        v = q*(re*re + im*im);
+        *out += v;
+    }
+}
+
+#if 0
+static void
+row2_assign_cnorm(gdouble *out,
+                  gdouble *out2,
+                  const fftw_complex *fftc,
+                  guint size,
+                  gdouble q)
+{
+    gdouble re = gwycreal(*fftc), im = gwycimag(*fftc);
+    gdouble v;
+    guint j;
+
+    q /= size;
+    v = q*(re*re + im*im);
+    *out = v;
+    out++, fftc++;
+    for (j = (size + 1)/2 - 1; j; j--, fftc++, out++, out2--) {
+        re = gwycreal(*fftc);
+        im = gwycimag(*fftc);
+        v = q*(re*re + im*im);
+        *out = v;
+        *out2 = v;
+    }
+    if (size % 2 == 0) {
+        re = gwycreal(*fftc);
+        im = gwycimag(*fftc);
+        v = q*(re*re + im*im);
+        *out = v;
+    }
+}
+#endif
+
+static void
+row_extfft_accum_cnorm(fftw_plan plan,
+                       gdouble *fftr,
+                       gdouble *accum,
+                       fftw_complex *fftc,
+                       guint size,
+                       guint width,
+                       gdouble q)
+{
+    gwy_clear(fftr + width, size - width);
+    fftw_execute(plan);
+    row_accum_cnorm(accum, fftc, size, q);
+}
+
+/* Calculate the product A*B+AB*, equal to 2*(Re A Re B + Im A Im B), of two
+ * R2HC outputs (the result is added to @out including the redundant even
+ * terms). */
+static void
+row_accum_cprod(const fftw_complex *fftca,
+                const fftw_complex *fftcb,
+                gdouble *out,
+                guint size,
+                gdouble q)
+{
+    gdouble *out2 = out + size-1;
+    gdouble rea = gwycreal(*fftca), ima = gwycimag(*fftca),
+            reb = gwycreal(*fftcb), imb = gwycimag(*fftcb), v;
+    guint j;
+
+    q *= 2.0/size;
+    v = q*(rea*reb + ima*imb);
+    *out += v;
+    out++, fftca++, fftcb++;
+    for (j = (size + 1)/2 - 1; j; j--, out++, fftca++, fftcb++, out2--) {
+        rea = gwycreal(*fftca);
+        ima = gwycimag(*fftca);
+        reb = gwycreal(*fftcb);
+        imb = gwycimag(*fftcb);
+        v = q*(rea*reb + ima*imb);
+        *out += v;
+        *out2 += v;
+    }
+    if (size % 2 == 0) {
+        rea = gwycreal(*fftca);
+        ima = gwycimag(*fftca);
+        reb = gwycreal(*fftcb);
+        imb = gwycimag(*fftcb);
+        v = q*(rea*reb + ima*imb);
+        *out += v;
+    }
+}
+
+/* Used in cases when we expect the imaginary part to be zero but do not want
+ * to bother with specialised DCT. */
+static void
+row_extfft_extract_re(fftw_plan plan,
+                      gdouble *fftr,
+                      gdouble *out,
+                      fftw_complex *fftc,
+                      guint size,
+                      guint width)
+{
+    guint j;
+
+    gwy_assign(fftr, out, size);
+    fftw_execute(plan);
+    for (j = 0; j < width; j++)
+        out[j] = gwycreal(fftc[j]);
+}
+
+static void
+row_extfft_symmetrise_re(fftw_plan plan,
+                         gdouble *fftr,
+                         gdouble *out,
+                         fftw_complex *fftc,
+                         guint size)
+{
+    gdouble *out2 = out + size-1;
+    guint j;
+
+    gwy_assign(fftr, out, size);
+    fftw_execute(plan);
+
+    *out = gwycreal(*fftc);
+    out++, fftc++;
+    for (j = (size + 1)/2 - 1; j; j--, fftc++, out++, out2--)
+        *out = *out2 = gwycreal(*fftc);
+    if (size % 2 == 0)
+        *out = gwycreal(*fftc);
+}
+
+/* Calculate the complex absolute value of R2HC output items, excluding the
+ * redundant even terms.  So the size of @out must be @size/2 + 1. */
+static void
+row_extract_cabs(const fftw_complex *in,
+                 gdouble *out,
+                 guint width)
+{
+    guint j;
+
+    *out = sqrt(gwycreal(*in)*gwycreal(*in) + gwycimag(*in)*gwycimag(*in));
+    for (j = width; j; j--, out++, in++)
+        *out = sqrt(gwycreal(*in)*gwycreal(*in) + gwycimag(*in)*gwycimag(*in));
+}
+
+static void
+row_accumulate_vk(const gdouble *data,
+                  gdouble *v,
+                  guint size)
+{
+    const gdouble *data2 = data + (size-1);
+    gdouble sum = 0.0;
+    guint j;
+
+    v += size-1;
+    for (j = size; j; j--, data++, data2--, v--) {
+        sum += (*data)*(*data) + (*data2)*(*data2);
+        *v += sum;
+    }
+}
+
+static void
+row_copy_subtract(const gdouble *in,
+                  gdouble *out,
+                  guint n,
+                  gdouble a)
+{
+    guint i;
+
+    for (i = n; i; i--, in++, out++)
+        *out = *in - a;
+}
+
+/* Level a row of data by subtracting the mean value. */
+static void
+row_level(const gdouble *in,
+          gdouble *out,
+          guint n)
+{
+    gdouble sumsi = 0.0;
+    const gdouble *pdata = in;
+    guint i;
+
+    for (i = n; i; i--, pdata++)
+        sumsi += *pdata;
+
+    row_copy_subtract(in, out, n, sumsi/n);
+}
+
+/* Level a row of data by subtracting the mean value of data under mask and
+ * clear (set to zero) all data not under mask.  Note how the zeroes nicely
+ * ensure that the subsequent functions Just Work(TM) and don't need to know we
+ * use masking at all. */
+static guint
+row_level_mask(const gdouble *in,
+               gdouble *out,
+               guint n,
+               const gdouble *m,
+               GwyMaskingType masking)
+{
+    gdouble sumsi = 0.0, a;
+    const gdouble *pdata = in, *mdata = m;
+    guint i, nd = 0;
+
+    if (masking == GWY_MASK_INCLUDE) {
+        for (i = n; i; i--, pdata++, mdata++) {
+            if (*mdata > 0.0) {
+                sumsi += *pdata;
+                nd++;
+            }
+        }
+    }
+    else {
+        for (i = n; i; i--, pdata++, mdata++) {
+            if (*mdata <= 0.0) {
+                sumsi += *pdata;
+                nd++;
+            }
+        }
+    }
+
+    /* This can be division by zero but in that case we never use the value. */
+    a = sumsi/nd;
+    pdata = in;
+    mdata = m;
+    if (masking == GWY_MASK_INCLUDE) {
+        for (i = n; i; i--, pdata++, mdata++, out++)
+            *out = (*mdata > 0.0) ? *pdata - a : 0.0;
+    }
+    else {
+        for (i = n; i; i--, pdata++, mdata++, out++)
+            *out = (*mdata <= 0.0) ? *pdata - a : 0.0;
+    }
+
+    return nd;
+}
+
+/* Window a row using a sampled windowing function. */
+static void
+row_window(gdouble *data, const gdouble *window, guint n)
+{
+    guint i;
+
+    for (i = n; i; i--, data++, window++)
+        *data *= *window;
+}
+
+/* Level and count the number of valid data in a row */
+static guint
+row_level_and_count(const gdouble *in,
+                    gdouble *out,
+                    guint width,
+                    GwyDataField *mask,
+                    GwyMaskingType masking,
+                    guint maskcol,
+                    guint maskrow,
+                    guint level)
+{
+    guint i, count;
+    const gdouble *m;
+
+    if (!mask || masking == GWY_MASK_IGNORE) {
+        if (level)
+            row_level(in, out, width);
+        else
+            gwy_assign(out, in, width);
+        return width;
+    }
+
+    m = mask->data + mask->xres*maskrow + maskcol;
+    if (level)
+        return row_level_mask(in, out, width, m, masking);
+
+    count = 0;
+    if (masking == GWY_MASK_INCLUDE) {
+        for (i = width; i; i--, in++, out++, m++) {
+            if (*m > 0.0) {
+                *out = *in;
+                count++;
+            }
+            else
+                *out = 0.0;
+        }
+    }
+    else {
+        for (i = width; i; i--, in++, out++, m++) {
+            if (*m <= 0.0) {
+                *out = *in;
+                count++;
+            }
+            else
+                *out = 0.0;
+        }
+    }
+    return count;
+}
+
+static void
+set_cf_units(GwyDataField *field,
+             GwyDataLine *line,
+             GwyDataLine *weights)
+{
+    gwy_data_field_copy_units_to_data_line(field, line);
+    if (line->si_unit_y)
+        gwy_si_unit_power(line->si_unit_y, 2, line->si_unit_y);
+
+    if (weights) {
+        gwy_data_field_copy_units_to_data_line(field, weights);
+        gwy_si_unit_set_from_string(gwy_data_line_get_si_unit_y(weights), NULL);
+    }
+}
+
+/**
+ * gwy_data_field_area_row_acf:
+ * @field: A two-dimensional data field.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ * @mask: Mask specifying which values to take into account/exclude, or %NULL.
+ * @masking: Masking mode to use (has any effect only with non-%NULL @mask).
+ * @level: The first polynomial degree to keep in the rows, lower degrees than
+ *         @level are subtracted.  Note only values 0 (no levelling) and 1
+ *         (subtract the mean value of each row) are available at present.  For
+ *         SPM data, you usually wish to pass 1.
+ * @weights: Line to store the denominators to (or %NULL).  It will be resized
+ *           to match the returned line.  The denominators are integers equal
+ *           to the number of terms that contributed to each value.  They are
+ *           suitable as fitting weight if the ACF is fitted.
+ *
+ * Calculates the row-wise autocorrelation function (ACF) of a field.
+ *
+ * The calculated ACF has the natural number of points, i.e. @width.
+ *
+ * Masking is performed by omitting all terms that contain excluded pixels.
+ * Since different rows contain different numbers of pixels, the resulting
+ * ACF values are calculated as a weighted sums where weight of each row's
+ * contribution is proportional to the number of contributing terms.  In other
+ * words, the weighting is fair: each contributing pixel has the same influence
+ * on the result.
+ *
+ * Returns: A new one-dimensional data line with the ACF.
+ **/
+GwyDataLine*
+gwy_data_field_area_row_acf(GwyDataField *field,
+                            GwyDataField *mask,
+                            GwyMaskingType masking,
+                            guint col, guint row,
+                            guint width, guint height,
+                            guint level,
+                            GwyDataLine *weights)
+{
+    GwyDataLine *line = NULL;
+    fftw_complex *fftc;
+    const gdouble *base;
+    gdouble *fftr, *accum_data, *accum_mask;
+    guint nfullrows = 0, nemptyrows = 0;
+    guint size, cstride, i, j;
+    fftw_plan plan;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(field), NULL);
+    g_return_val_if_fail(!mask || GWY_IS_DATA_FIELD(mask), NULL);
+    if (mask) {
+        g_return_val_if_fail(mask->xres == field->xres
+                             && mask->yres == field->yres, NULL);
+    }
+    g_return_val_if_fail(!weights || GWY_IS_DATA_LINE(weights), NULL);
+
+    if (level > 1) {
+        g_warning("Levelling degree %u is not supported, changing to 1.",
+                  level);
+        level = 1;
+    }
+
+    /* Transform size must be at least twice the data size for zero padding.
+     * An even size is necessary due to alignment constraints in FFTW.
+     * Using this size for all buffers is a bit excessive but safe. */
+    line = gwy_data_line_new(width, 1.0, TRUE);
+    size = gwy_fft_find_nice_size((width + 1)/2*4);
+    /* The innermost (contiguous) dimension of R2C the complex output is
+     * slightly larger than the real input.  Note @cstride is measured in
+     * fftw_complex, multiply it by 2 for doubles. */
+    cstride = size/2 + 1;
+    base = field->data + row*field->xres + col;
+    fftr = g_new(gdouble, 3*size);
+    accum_data = fftr + size;
+    accum_mask = fftr + 2*size;
+    fftc = g_new(fftw_complex, cstride);
+
+    plan = fftw_plan_dft_r2c_1d(size, fftr, fftc,
+                                FFTW_DESTROY_INPUT | _GWY_FFTW_PATIENCE);
+    g_assert(plan);
+    gwy_clear(accum_data, size);
+    gwy_clear(accum_mask, size);
+
+    /* Gather squared Fourier coefficients for all rows. */
+    for (i = 0; i < height; i++) {
+        guint count = row_level_and_count(base + i*field->xres, fftr, width,
+                                          mask, masking, col, row + i, level);
+        if (!count) {
+            nemptyrows++;
+            continue;
+        }
+
+        /* Calculate and gather squared Fourier coefficients of the data. */
+        row_extfft_accum_cnorm(plan, fftr, accum_data, fftc, size, width, 1.0);
+
+        if (count == width) {
+            nfullrows++;
+            continue;
+        }
+
+        /* Calculate and gather squared Fourier coefficients of the mask. */
+        row_assign_mask(mask, col, row + i, width, masking, fftr);
+        row_extfft_accum_cnorm(plan, fftr, accum_mask, fftc, size, width, 1.0);
+    }
+
+    /* Numerator of G_k, i.e. FFT of squared data Fourier coefficients. */
+    row_extfft_extract_re(plan, fftr, accum_data, fftc, size, width);
+
+    /* Denominator of G_k, i.e. FFT of squared mask Fourier coefficients.
+     * Don't perform the FFT if there were no partial rows. */
+    if (nfullrows + nemptyrows < height)
+        row_extfft_extract_re(plan, fftr, accum_mask, fftc, size, width);
+
+    for (j = 0; j < width; j++) {
+        /* Denominators must be rounded to integers because they are integers
+         * and this permits to detect zeroes in the denominator. */
+        accum_mask[j] = GWY_ROUND(accum_mask[j]) + nfullrows*(width - j);
+    }
+    row_divide_nonzero_with_laplace(accum_data, accum_mask, line->data,
+                                    line->res);
+
+    line->real = gwy_data_field_get_xmeasure(field)*line->res;
+    /* line->off = -0.5*line->real/line->res; */
+
+    if (weights) {
+        gwy_data_line_resample(weights, line->res, GWY_INTERPOLATION_NONE);
+        gwy_data_line_set_real(weights, line->real);
+        gwy_data_line_set_offset(weights, line->off);
+        gwy_assign(weights->data, accum_mask, weights->res);
+    }
+
+    fftw_destroy_plan(plan);
+    fftw_free(fftc);
+    fftw_free(fftr);
+
+    set_cf_units(field, line, weights);
+    return line;
+}
+
+static void
+normalise_window_square(gdouble *window, guint n)
+{
+    gdouble s = 0.0;
+    guint i;
+
+    for (i = 0; i < n; i++)
+        s += window[i]*window[i];
+
+    if (!s)
+        return;
+
+    s = sqrt(n/s);
+    for (i = 0; i < n; i++)
+        window[i] *= s;
+}
+
+/**
+ * gwy_data_field_area_row_psdf:
+ * @field: A two-dimensional data field.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ * @mask: Mask specifying which values to take into account/exclude, or %NULL.
+ * @masking: Masking mode to use (has any effect only with non-%NULL @mask).
+ * @windowing: Windowing type to use.
+ * @level: The first polynomial degree to keep in the rows, lower degrees than
+ *         @level are subtracted.  Note only values 0 (no levelling) and 1
+ *         (subtract the mean value of each row) are available at present.  For
+ *         SPM data, you usually wish to pass 1.
+ *
+ * Calculates the row-wise power spectrum density function (PSDF) of a
+ * rectangular part of a field.
+ *
+ * The calculated PSDF has the natural number of points that follows from DFT,
+ * i.e. @width/2+1.
+ *
+ * The reduction of the total energy by windowing is compensated by multiplying
+ * the PSDF to make its sum of squares equal to the input data sum of squares.
+ *
+ * Masking is performed by omitting all terms that contain excluded pixels.
+ * Since different rows contain different numbers of pixels, the resulting
+ * PSDF is calculated as a weighted sum where each row's weight is proportional
+ * to the number of contributing pixels.  In other words, the weighting is
+ * fair: each contributing pixel has the same influence on the result.
+ *
+ * Returns: A new one-dimensional data line with the PSDF.
+ **/
+GwyDataLine*
+gwy_data_field_area_row_psdf(GwyDataField *field,
+                             GwyDataField *mask,
+                             GwyMaskingType masking,
+                             guint col, guint row,
+                             guint width, guint height,
+                             GwyWindowingType windowing,
+                             guint level)
+{
+    GwyDataLine *line = NULL;
+    fftw_complex *fftc;
+    const gdouble *base;
+    gdouble *fftr, *accum_data, *accum_mask, *window;
+    guint nfullrows = 0, nemptyrows = 0;
+    guint size, cstride, i, j;
+    fftw_plan plan;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(field), NULL);
+    g_return_val_if_fail(!mask || GWY_IS_DATA_FIELD(mask), NULL);
+    if (mask) {
+        g_return_val_if_fail(mask->xres == field->xres
+                             && mask->yres == field->yres, NULL);
+    }
+
+    if (level > 1) {
+        g_warning("Levelling degree %u is not supported, changing to 1.",
+                  level);
+        level = 1;
+    }
+
+    /* The innermost (contiguous) dimension of R2C the complex output is
+     * slightly larger than the real input.  Note @cstride is measured in
+     * fftw_complex, multiply it by 2 for doubles. */
+    cstride = width/2 + 1;
+    /* An even size is necessary due to alignment constraints in FFTW.
+     *Using this size for all buffers is a bit excessive but safe. */
+    line = gwy_data_line_new(cstride, 1.0, TRUE);
+    size = (width + 3)/4*4;
+    base = field->data + row*field->xres + col;
+    fftr = g_new(gdouble, 4*size);
+    accum_data = fftr + 1*size;
+    accum_mask = fftr + 2*size;
+    window = fftr + 3*size;
+    fftc = g_new(fftw_complex, cstride);
+
+    gwy_clear(accum_data, size);
+    gwy_clear(accum_mask, size);
+
+    for (j = 0; j < width; j++)
+        window[j] = 1.0;
+    gwy_fft_window(width, window, windowing);
+    normalise_window_square(window, width);
+
+    plan = fftw_plan_dft_r2c_1d(width, fftr, fftc,
+                                FFTW_DESTROY_INPUT | _GWY_FFTW_PATIENCE);
+    g_assert(plan);
+    for (i = 0; i < height; i++) {
+        guint count = row_level_and_count(base + i*field->xres, fftr, width,
+                                          mask, masking, col, row + i, level);
+        if (!count) {
+            nemptyrows++;
+            continue;
+        }
+
+        /* Calculate and gather squared Fourier coefficients of the data. */
+        row_window(fftr, window, width);
+        row_extfft_accum_cnorm(plan, fftr, accum_data, fftc, width, width, 1.0);
+
+        if (count == width) {
+            nfullrows++;
+            continue;
+        }
+
+        /* Calculate and gather squared Fourier coefficients of the mask. */
+        row_assign_mask(mask, col, row + i, width, masking, fftr);
+        row_extfft_accum_cnorm(plan, fftr, accum_mask, fftc, width, width, 1.0);
+    }
+
+    /* Numerator of A_k, i.e. FFT of squared data Fourier coefficients. */
+    row_extfft_symmetrise_re(plan, fftr, accum_data, fftc, width);
+
+    /* Denominator of A_k, i.e. FFT of squared mask Fourier coefficients.
+     * Don't perform the FFT if there were no partial rows. */
+    if (nfullrows + nemptyrows < height)
+        row_extfft_symmetrise_re(plan, fftr, accum_mask, fftc, width);
+
+    for (j = 0; j < width; j++) {
+        /* Denominators must be rounded to integers because they are integers
+         * and this permits to detect zeroes in the denominator. */
+        accum_mask[j] = GWY_ROUND(accum_mask[j]) + nfullrows*width;
+    }
+    row_divide_nonzero_with_laplace(accum_data, accum_mask, fftr, width);
+
+    /* The transform is the other way round – for complex numbers.  Since it
+     * is in fact a DCT here we don't care and run it as a forward transform. */
+    fftw_execute(plan);
+    row_extract_cabs(fftc, line->data, line->res);
+
+    fftw_destroy_plan(plan);
+    fftw_free(fftc);
+    fftw_free(fftr);
+
+    gwy_data_line_multiply(line, gwy_data_field_get_xmeasure(field)/(2*G_PI));
+    line->real = G_PI/gwy_data_field_get_xmeasure(field);
+    /* line->off = -0.5*line->real/line->res; */
+
+    gwy_si_unit_power(gwy_data_field_get_si_unit_xy(field),
+                      -1,
+                      gwy_data_line_get_si_unit_x(line));
+    gwy_si_unit_power_multiply(gwy_data_field_get_si_unit_xy(field), 1,
+                               gwy_data_field_get_si_unit_z(field), 2,
+                               gwy_data_line_get_si_unit_y(line));
+    return line;
+}
+
+/**
+ * gwy_data_field_area_row_hhcf:
+ * @field: A two-dimensional data field.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ * @mask: Mask specifying which values to take into account/exclude, or %NULL.
+ * @masking: Masking mode to use (has any effect only with non-%NULL @mask).
+ * @level: The first polynomial degree to keep in the rows, lower degrees than
+ *         @level are subtracted.  Note only values 0 (no levelling) and 1
+ *         (subtract the mean value of each row) are available at present.
+ *         There is no difference for HHCF.
+ * @weights: Line to store the denominators to (or %NULL).  It will be resized
+ *           to match the returned line.  The denominators are integers equal
+ *           to the number of terms that contributed to each value.  They are
+ *           suitable as fitting weight if the ACF is fitted.
+ *
+ * Calculates the row-wise height-height correlation function (HHCF) of a
+ * rectangular part of a field.
+ *
+ * The calculated HHCF has the natural number of points, i.e. @width.
+ *
+ * Masking is performed by omitting all terms that contain excluded pixels.
+ * Since different rows contain different numbers of pixels, the resulting
+ * HHCF values are calculated as a weighted sums where weight of each row's
+ * contribution is proportional to the number of contributing terms.  In other
+ * words, the weighting is fair: each contributing pixel has the same influence
+ * on the result.
+ *
+ * Returns: A new one-dimensional data line with the HHCF.
+ **/
+GwyDataLine*
+gwy_data_field_area_row_hhcf(GwyDataField *field,
+                             GwyDataField *mask,
+                             GwyMaskingType masking,
+                             guint col, guint row,
+                             guint width, guint height,
+                             guint level,
+                             GwyDataLine *weights)
+{
+    GwyDataLine *line = NULL;
+    fftw_complex *fftc, *tmp;
+    const gdouble *base, *q;
+    gdouble *fftr, *accum_data, *accum_mask, *accum_v, *p;
+    guint nfullrows = 0, nemptyrows = 0;
+    guint size, cstride, i, j;
+    fftw_plan plan;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(field), NULL);
+    g_return_val_if_fail(!mask || GWY_IS_DATA_FIELD(mask), NULL);
+    if (mask) {
+        g_return_val_if_fail(mask->xres == field->xres
+                             && mask->yres == field->yres, NULL);
+    }
+    g_return_val_if_fail(!weights || GWY_IS_DATA_LINE(weights), NULL);
+
+    if (level > 1) {
+        g_warning("Levelling degree %u is not supported, changing to 1.",
+                  level);
+        level = 1;
+    }
+
+    /* Transform size must be at least twice the data size for zero padding.
+     * An even size is necessary due to alignment constraints in FFTW.
+     * Using this size for all buffers is a bit excessive but safe. */
+    line = gwy_data_line_new(width, 1.0, TRUE);
+    size = gwy_fft_find_nice_size((width + 1)/2*4);
+    /* The innermost (contiguous) dimension of R2C the complex output is
+     * slightly larger than the real input.  Note @cstride is measured in
+     * fftw_complex, multiply it by 2 for doubles. */
+    cstride = size/2 + 1;
+    base = field->data + row*field->xres + col;
+    fftr = g_new(gdouble, 4*size);
+    accum_data = fftr + size;
+    accum_mask = fftr + 2*size;
+    accum_v = fftr + 3*size;
+    fftc = g_new(fftw_complex, 2*cstride);
+    tmp = fftc + cstride;
+
+    plan = fftw_plan_dft_r2c_1d(size, fftr, fftc,
+                                FFTW_DESTROY_INPUT | _GWY_FFTW_PATIENCE);
+    g_assert(plan);
+    gwy_clear(accum_data, size);
+    gwy_clear(accum_mask, size);
+    gwy_clear(accum_v, size);
+
+    // Gather V_ν-2|Z_ν|² for all rows, except that for full rows we actually
+    // gather just -2|Z_ν|² because v_k can be calculated without DFT.
+    for (i = 0; i < height; i++) {
+        guint count = row_level_and_count(base + i*field->xres, fftr, width,
+                                          mask, masking, col, row + i, level);
+        if (!count) {
+            nemptyrows++;
+            continue;
+        }
+
+        /* Calculate v_k before FFT destroys the input levelled/filtered data.
+         */
+        if (count == width)
+            row_accumulate_vk(fftr, accum_v, width);
+        else {
+            // For partial rows, we will need the data later to calculate FFT
+            // of their squares.  Save them to the line that conveniently has
+            // the right size.
+            gwy_assign(line->data, fftr, width);
+        }
+
+        /* Calculate and gather -2 times squared Fourier coefficients. */
+        row_extfft_accum_cnorm(plan, fftr, accum_data, fftc, size, width, -2.0);
+
+        if (count == width) {
+            nfullrows++;
+            continue;
+        }
+
+        /* First calculate U_ν (Fourier cofficients of squared data).  Save
+         * them to tmp. */
+        q = line->data;
+        p = fftr;
+        for (j = width; j; j--, p++, q++)
+            *p = (*q)*(*q);
+        gwy_clear(fftr + width, size - width);
+        fftw_execute(plan);
+        gwy_assign(tmp, fftc, cstride);
+
+        /* Mask.  We need the intermediate result C_ν to combine it with U_ν. */
+        row_assign_mask(mask, col, row + i, width, masking, fftr);
+        gwy_clear(fftr + width, size - width);
+        fftw_execute(plan);
+
+        /* Accumulate V_ν (calculated from C_ν and U_ν) to accum_data. */
+        row_accum_cprod(tmp, fftc, accum_data, size, 1.0);
+
+        /* And accumulate squared mask Fourier coeffs |C_ν|². */
+        row_accum_cnorm(accum_mask, fftc, size, 1.0);
+    }
+
+    /* Numerator of H_k, excluding non-DFT data in v_k. */
+    row_extfft_extract_re(plan, fftr, accum_data, fftc, size, width);
+    /* Combine it with v_k to get the full numerator in accum_data. */
+    row_accumulate(accum_data, accum_v, width);
+
+    // Denominator of H_k, i.e. FFT of squared mask Fourier coefficients.
+    // Don't perform the FFT if there were no partial rows.
+    if (nfullrows + nemptyrows < height)
+        row_extfft_extract_re(plan, fftr, accum_mask, fftc, size, width);
+
+    for (j = 0; j < width; j++) {
+        // Denominators must be rounded to integers because they are integers
+        // and this permits to detect zeroes in the denominator.
+        accum_mask[j] = GWY_ROUND(accum_mask[j]) + nfullrows*(width - j);
+    }
+    row_divide_nonzero_with_laplace(accum_data, accum_mask, line->data,
+                                    line->res);
+
+    line->real = gwy_data_field_get_xmeasure(field)*line->res;
+    /* line->off = -0.5*line->real/line->res; */
+
+    if (weights) {
+        gwy_data_line_resample(weights, line->res, GWY_INTERPOLATION_NONE);
+        gwy_data_line_set_real(weights, line->real);
+        gwy_data_line_set_offset(weights, line->off);
+        gwy_assign(weights->data, accum_mask, weights->res);
+    }
+
+    fftw_destroy_plan(plan);
+    fftw_free(fftc);
+    fftw_free(fftr);
+
+    set_cf_units(field, line, weights);
+    return line;
+}
+
+/* Recalculate area excess based on second-order expansion to the true one,
+ * assuming the distribution is exponential. */
+static inline gdouble
+asg_correction(gdouble ex)
+{
+    if (ex < 1e-3)
+        return ex*(1.0 - ex*(1.0 - 3.0*ex*(1.0 - 5.0*ex*(1.0 - 7.0*ex*(1.0 - 9.0*ex*(1.0 - 11.0*ex))))));
+
+    return sqrt(0.5*G_PI*ex) * exp(0.5/ex) * erfc(sqrt(0.5/ex));
+}
+
+/**
+ * gwy_data_field_area_row_asg:
+ * @field: A two-dimensional data field.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ * @mask: Mask specifying which values to take into account/exclude, or %NULL.
+ * @masking: Masking mode to use (has any effect only with non-%NULL @mask).
+ * @level: The first polynomial degree to keep in the rows, lower degrees than
+ *         @level are subtracted.  Note only values 0 (no levelling) and 1
+ *         (subtract the mean value of each row) are available at present.
+ *         There is no difference for ASG.
+ *
+ * Calculates the row-wise area scale graph (ASG) of a rectangular part of a
+ * field.
+ *
+ * The calculated ASG has the natural number of points, i.e. @width-1.
+ *
+ * The ASG represents the apparent area excess (ratio of surface and projected
+ * area minus one) observed at given length scale.  The quantity calculated by
+ * this function serves a similar purpose as ASME B46.1 area scale graph but
+ * is defined differently, based on the HHCF.  See
+ * gwy_data_field_area_row_hhcf() for details of its calculation.
+ *
+ * Returns: A new one-dimensional data line with the ASG.
+ **/
+GwyDataLine*
+gwy_data_field_area_row_asg(GwyDataField *field,
+                            GwyDataField *mask,
+                            GwyMaskingType masking,
+                            guint col, guint row,
+                            guint width, guint height,
+                            guint level)
+{
+    GwyDataLine *hhcf;
+    GwyDataLine *line = NULL;
+    gdouble dx;
+    guint i;
+
+    hhcf = gwy_data_field_area_row_hhcf(field, mask, masking,
+                                        col, row, width, height, level, NULL);
+
+    g_return_val_if_fail(hhcf, NULL);
+    dx = hhcf->real/hhcf->res;
+    if (hhcf->res < 2) {
+        line = gwy_data_line_new(1, dx, TRUE);
+        g_object_unref(hhcf);
+        return line;
+    }
+
+    line = gwy_data_line_new(hhcf->res - 1, dx*(hhcf->res - 1), FALSE);
+    line->off = 0.5*dx;
+
+    for (i = 0; i < line->res; i++) {
+        gdouble t = (i + 0.5)*dx + line->off;
+        line->data[i] = asg_correction(hhcf->data[i+1]/(t*t));
+    }
+
+    _gwy_assign_si_unit(field->si_unit_xy, &line->si_unit_x);
+    g_object_unref(hhcf);
+
+    return line;
+}
+
+#if 0
+static void
+hhcf_running_sums(GwyDataField *rsum,
+                  const gdouble *data, guint stride, guint width, guint height,
+                  gdouble *buf)
+{
+    guint xres = rsum->xres, yres = rsum->yres;
+    guint xrange = xres/2, yrange = yres/2;
+    gdouble *rsdata = rsum->data;
+    guint i, j;
+
+    g_assert(xres == 2*xrange+1);
+    g_assert(yres == 2*yrange+1);
+
+    // Same-sign HHCF arguments, sums growing along the major diagonal.
+    gwy_clear(buf, width);
+    for (i = 0; i < height; i++) {
+        const gdouble *row1 = data + i*stride;
+        const gdouble *row2 = data + (height-1 - i)*stride + width-1;
+        gdouble s = 0.0;
+        for (j = 0; j < width; j++, row1++, row2--) {
+            gdouble z1 = *row1, z2 = *row2;
+            buf[j] += z1*z1 + z2*z2;
+            s += buf[j];
+            guint ii = height-1 - i, jj = width-1 - j;
+            if (ii <= yrange && jj <= xrange) {
+                rsdata[(yrange + ii)*xres + xrange + jj] = s;
+                rsdata[(yrange - ii)*xres + xrange - jj] = s;
+            }
+        }
+    }
+
+    // Opposite-sign HHCF arguments, sums growing along the minor diagonal.
+    gwy_clear(buf, width);
+    for (i = 0; i < height; i++) {
+        const gdouble *row1 = data + (height-1 - i)*stride;
+        const gdouble *row2 = data + i*stride + width-1;
+        gdouble s = 0.0;
+        for (j = 0; j < width; j++, row1++, row2--) {
+            gdouble z1 = *row1, z2 = *row2;
+            buf[j] += z1*z1 + z2*z2;
+            s += buf[j];
+            guint ii = height-1 - i, jj = width-1 - j;
+            if (ii <= yrange && jj <= xrange) {
+                rsdata[(yrange + ii)*xres + xrange - jj] = s;
+                rsdata[(yrange - ii)*xres + xrange + jj] = s;
+            }
+        }
+    }
+}
+
+static GwyDataField*
+gwy_data_field_cf(GwyDataField *field,
+                  GwyDataFieldPart *fpart,
+                  guint xrange, guint yrange,
+                  guint level,
+                  CFType type)
+{
+    guint col, row, width, height;
+
+    if (level > 1) {
+        g_warning("Levelling degree %u is not supported, changing to 1.",
+                  level);
+        level = 1;
+    }
+    if (xrange >= width) {
+        g_warning("CF x range is not smaller than width, fixing it.");
+        xrange = width-1;
+    }
+    if (yrange >= height) {
+        g_warning("CF y range is not smaller than height, fixing it.");
+        yrange = height-1;
+    }
+
+    guint xsize = gwy_fft_find_nice_size(width + xrange);
+    guint ysize = gwy_fft_find_nice_size(height + yrange);
+    // The innermost (contiguous) dimension of R2C the complex output is
+    // slightly larger than the real input.  Note @cstride is measured in
+    // fftw_complex, multiply it by 2 for doubles.
+    guint cxsize = xsize/2 + 1;
+    gdouble *fftr = g_new(gdouble, xsize*ysize);
+    fftw_complex *fftc = g_new(fftw_complex, cxsize*ysize);
+    fftw_plan plan = fftw_plan_dft_r2c_2d(ysize, xsize, fftr, fftc,
+                                          FFTW_DESTROY_INPUT
+                                          | _GWY_FFTW_PATIENCE);
+    g_assert(plan);
+
+    guint xres = field->xres;
+    if (level == 1) {
+        gdouble mean = gwy_data_field_mean(field, fpart, NULL, GWY_MASK_IGNORE);
+        for (guint i = 0; i < height; i++) {
+            const gdouble *drow = field->data + (i + row)*xres + col;
+            gdouble *rrow = fftr + i*xsize;
+            row_copy_subtract(drow, rrow, width, mean);
+            gwy_clear(rrow + width, xsize - width);
+        }
+    }
+    else {
+        for (guint i = 0; i < height; i++) {
+            const gdouble *drow = field->data + (i + row)*xres + col;
+            gdouble *rrow = fftr + i*xsize;
+            gwy_assign(rrow, drow, width);
+            gwy_clear(rrow + width, xsize - width);
+        }
+    }
+
+    GwyDataField *cf = gwy_data_field_new_sized(2*xrange + 1, 2*yrange + 1, TRUE);
+    guint txres = cf->xres, tyres = cf->yres;
+
+    if (type == CF_HHCF) {
+        if (yrange)
+            hhcf_running_sums(cf, fftr, xsize, width, height,
+                              fftr + xsize*height);
+        else {
+            // If yrange=0 we cannot use the lower (to be zeroed) part of fftr
+            // as a temporary scratch space because there is no lower part.
+            gdouble *workspace = g_new(gdouble, width);
+            hhcf_running_sums(cf, fftr, xsize, width, height, workspace);
+            g_free(workspace);
+        }
+    }
+
+    gwy_clear(fftr + xsize*height, xsize*(ysize - height));
+
+    fftw_execute(plan);
+
+    row2_assign_cnorm(fftr, fftr + xsize-1, fftc, xsize, 1.0/ysize);
+    for (guint i = 1; i < ysize; i++) {
+        const fftw_complex *crow = fftc + i*cxsize;
+        gdouble *rrow = fftr + i*xsize,
+                *rrow2 = fftr + (ysize - i)*xsize + xsize-1;
+        row2_assign_cnorm(rrow, rrow2, crow, xsize, 1.0/ysize);
+    }
+
+    fftw_execute(plan);
+    fftw_destroy_plan(plan);
+    fftw_free(fftr);
+
+    for (guint i = 0; i <= yrange; i++) {
+        const fftw_complex *crow = fftc + i*cxsize;
+        gdouble *frow = cf->data + (yrange + i)*txres + xrange;
+        gdouble *brow = cf->data + (yrange - i)*txres + xrange;
+        if (type == CF_ACF) {
+            for (guint j = 0; j <= xrange; j++, crow++, frow++, brow--) {
+                gdouble v = gwycreal(*crow);
+                *frow = *brow = v/(height - i)/(width - j);
+            }
+        }
+        else if (type == CF_HHCF) {
+            guint from = 0;
+            if (!i) {
+                /* Don't process the central point twice. */
+                gdouble v = gwycreal(*crow);
+                *frow = (*frow - 2.0*v)/height/width;
+                from++;
+                crow++;
+                frow++;
+                brow--;
+            }
+            for (guint j = from; j <= xrange; j++, crow++, frow++, brow--) {
+                gdouble v = gwycreal(*crow);
+                *frow = (*frow - 2.0*v)/(height - i)/(width - j);
+                *brow = (*brow - 2.0*v)/(height - i)/(width - j);
+            }
+        }
+    }
+    for (guint i = 1; i <= yrange; i++) {
+        const fftw_complex *crow = fftc + (ysize - i)*cxsize + 1;
+        gdouble *frow = cf->data + (yrange - i)*txres + (xrange+1);
+        gdouble *brow = cf->data + (yrange + i)*txres + (xrange-1);
+        if (type == CF_ACF) {
+            for (guint j = 1; j <= xrange; j++, crow++, frow++, brow--) {
+                gdouble v = gwycreal(*crow);
+                *frow = *brow = v/(height - i)/(width - j);
+            }
+        }
+        else if (type == CF_HHCF) {
+            for (guint j = 1; j <= xrange; j++, crow++, frow++, brow--) {
+                gdouble v = gwycreal(*crow);
+                *frow = (*frow - 2.0*v)/(height - i)/(width - j);
+                *brow = (*brow - 2.0*v)/(height - i)/(width - j);
+            }
+        }
+    }
+    fftw_free(fftc);
+
+    gdouble dx = gwy_data_field_get_xmeasure(field), dy = gwy_data_field_get_ymeasure(field);
+    cf->xreal = dx*txres;
+    cf->yreal = dy*tyres;
+    cf->xoff = -0.5*cf->xreal;
+    cf->yoff = -0.5*cf->yreal;
+
+    _gwy_assign_unit(&cf->xunit, field->xunit);
+    _gwy_assign_unit(&cf->yunit, field->yunit);
+    gwy_si_unit_power(gwy_data_field_get_si_unit_z(cf), field->zunit, 2);
+
+    return cf;
+}
+#endif
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/libprocess/stats-entropy.c b/libprocess/stats-entropy.c
new file mode 100644
index 0000000..1d63a88
--- /dev/null
+++ b/libprocess/stats-entropy.c
@@ -0,0 +1,1068 @@
+/*
+ *  @(#) $Id: stats-entropy.c 19698 2017-05-03 20:18:10Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include <string.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libprocess/datafield.h>
+#include <libprocess/stats.h>
+#include "gwyprocessinternal.h"
+
+typedef struct _BinTreeNode BinTreeNode;
+typedef struct _QuadTreeNode QuadTreeNode;
+
+struct _BinTreeNode {
+    /* This optimally uses memory on 64bit architectures where pt and
+     * children have the same size (16 bytes). */
+    union {
+        /* The at most two points inside for non-max-depth leaves. */
+        struct {
+            gdouble a;
+            gdouble b;
+        } pt;
+        /* Children for non-max-depth non-leaves. */
+        BinTreeNode *children[2];
+    } u;
+    /* Always set; for max-depth leaves it is the only meaningful field. */
+    guint count;
+};
+
+typedef struct {
+    gdouble min;
+    gdouble max;
+    BinTreeNode *root;
+    guint maxdepth;
+    gboolean degenerate;
+    gdouble degenerateS;
+} BinTree;
+
+struct _QuadTreeNode {
+    /* This optimally uses memory on 64bit architectures where pt and
+     * children have the same size (32 bytes). */
+    union {
+        /* The at most two points inside for non-max-depth leaves. */
+        struct {
+            GwyXY a;
+            GwyXY b;
+        } pt;
+        /* Children for non-max-depth non-leaves. */
+        QuadTreeNode *children[4];
+    } u;
+    /* Always set; for max-depth leaves it is the only meaningful field. */
+    guint count;
+};
+
+typedef struct {
+    GwyXY min;
+    GwyXY max;
+    QuadTreeNode *root;
+    guint maxdepth;
+    gboolean degenerate;
+    gdouble degenerateS;
+} QuadTree;
+
+/* Find the flattest part of the curve representing scaling histogram-based
+ * entropy on scale and use the value there as the entropy estimate.  Handle
+ * the too-few-pixels cases gracefully.
+ *
+ * NB: We assume
+ * (1) ecurve beings from large scales.  This is important only when it has
+ * lots of points because we may skip a few at the beginning then to avoid
+ * mistaking the flat part of the curve there for the inflexion point.
+ * (2) ecurve goes by powers of 2 scales, this is for the mindiff filtering.
+ */
+static gdouble
+calculate_entropy_from_scaling(const gdouble *ecurve, guint maxdiv)
+{
+    /* Initialise S to the δ-function entropy and mindiff to the half of the
+     * asymptotic value for distribution that is sum of δ-functions.
+     * This means only if the differences drops substantially from this
+     * asymptotic value we will consider is as potential inflexion point.
+     * If we get ecurve[] essentially corresponding to a set of δ-functions
+     * then we return -G_MAXDOUBLE. */
+    gdouble S = -G_MAXDOUBLE, mindiff = 0.6*G_LN2;
+    guint i, from = (maxdiv >= 12) + (maxdiv >= 36);
+
+    if (maxdiv < 1)
+        return ecurve[0];
+
+    if (maxdiv < 5) {
+        for (i = from; i <= maxdiv-2; i++) {
+            gdouble diff = 0.5*(fabs(ecurve[i+1] - ecurve[i])
+                                + fabs(ecurve[i+2] - ecurve[i+1]))/G_LN2;
+            gdouble diff2 = 0.5*(fabs(ecurve[i] + ecurve[i+2]
+                                      - 2.0*ecurve[i+1]))/(G_LN2*G_LN2);
+            if (diff + diff2 < mindiff) {
+                S = ecurve[i+1];
+                mindiff = diff + diff2;
+            }
+        }
+    }
+    else {
+        for (i = from; i <= maxdiv-4; i++) {
+            gdouble diff = 0.25*(fabs(ecurve[i+1] - ecurve[i])
+                                 + fabs(ecurve[i+2] - ecurve[i+1])
+                                 + fabs(ecurve[i+3] - ecurve[i+2])
+                                 + fabs(ecurve[i+4] - ecurve[i+3]));
+            gdouble diff2 = 0.5*(fabs(ecurve[i+1] + ecurve[i+4]
+                                      - 2.0*ecurve[i+2]))/(G_LN2*G_LN2);
+            if (diff + diff2 < mindiff) {
+                S = (ecurve[i+1] + ecurve[i+2] + ecurve[i+3])/3.0;
+                mindiff = diff + diff2;
+            }
+        }
+    }
+
+    return S;
+}
+
+/* This is what we get on average from all possible two-point configurations if
+ * they are randomly distributed.  A fairly good estimate that in practice
+ * seems to result in some deviation on the 5th significant digit, which is
+ * hardly significant at all.  The contribution is the same in 1D and 2D. */
+static void
+add_estimated_unsplit_node_entropy(gdouble *S, guint maxdepth, gdouble w)
+{
+    gdouble q = 2.0*G_LN2*w;
+    guint i;
+
+    for (i = 0; i <= maxdepth; i++, S++) {
+        S[0] += q;
+        q *= 0.5;
+    }
+}
+
+static BinTreeNode*
+bin_tree_node_new(const gdouble pt)
+{
+    BinTreeNode *btnode = g_slice_new(BinTreeNode);
+    btnode->u.pt.a = pt;
+    btnode->count = 1;
+    return btnode;
+}
+
+static void
+bin_tree_add_node(BinTreeNode *btnode, const gdouble pt,
+                  gdouble min, gdouble max, guint maxdepth)
+{
+    BinTreeNode *child;
+    gdouble centre;
+    guint i;
+
+    /* We reached maximum allowed subdivision.  Just increase the count. */
+    if (!maxdepth) {
+        if (btnode->count <= 2)
+            gwy_clear(&btnode->u, 1);
+        btnode->count++;
+        return;
+    }
+
+    /* We will descend into subtrees. */
+    centre = 0.5*(min + max);
+
+    /* If this node has just one point add the other there and we are done. */
+    if (btnode->count == 1) {
+        btnode->u.pt.b = pt;
+        btnode->count++;
+        return;
+    }
+
+    /* We will be recursing.  So if this node is a leaf start by making it
+     * non-leaf. */
+    if (btnode->count == 2) {
+        gdouble pta = btnode->u.pt.a;
+        gdouble ptb = btnode->u.pt.b;
+        guint ia = (pta > centre);
+        guint ib = (ptb > centre);
+
+        gwy_clear(&btnode->u, 1);
+        child = btnode->u.children[ia] = bin_tree_node_new(pta);
+        /* Must distinguish between creating two child nodes and creating one
+         * two-point child node. */
+        if (ia == ib) {
+            child->u.pt.b = ptb;
+            child->count = 2;
+        }
+        else
+            btnode->u.children[ib] = bin_tree_node_new(ptb);
+    }
+
+    /* Add the new point to the appropriate child. */
+    i = (pt > centre);
+    maxdepth--;
+    btnode->count++;
+
+    if ((child = btnode->u.children[i])) {
+        /* Recurse.  This will end either by reaching maxdepth=0 or by
+         * successful separation in the other branch of this conditon. */
+        if (i == 0)
+            bin_tree_add_node(child, pt, min, centre, maxdepth);
+        else
+            bin_tree_add_node(child, pt, centre, max, maxdepth);
+    }
+    else {
+        /* There is nothing here yet.  Add the point as a new leaf. */
+        btnode->u.children[i] = bin_tree_node_new(pt);
+    }
+}
+
+static void
+bin_tree_add(BinTree *btree, const gdouble pt)
+{
+    if (G_LIKELY(btree->root)) {
+        bin_tree_add_node(btree->root, pt,
+                          btree->min, btree->max, btree->maxdepth);
+    }
+    else
+        btree->root = bin_tree_node_new(pt);
+}
+
+static void
+bin_tree_find_range(BinTree *btree, const gdouble *xdata, guint n)
+{
+    gdouble min = G_MAXDOUBLE;
+    gdouble max = -G_MAXDOUBLE;
+    guint i;
+
+    for (i = 0; i < n; i++) {
+        gdouble x = xdata[i];
+
+        if (x < min)
+            min = x;
+        if (x > max)
+            max = x;
+    }
+
+    btree->min = min;
+    btree->max = max;
+}
+
+static void
+bin_tree_node_free(BinTreeNode *btnode)
+{
+    guint i;
+
+    if (btnode->count > 2) {
+        for (i = 0; i < G_N_ELEMENTS(btnode->u.children); i++) {
+            if (btnode->u.children[i])
+                bin_tree_node_free(btnode->u.children[i]);
+        }
+    }
+    g_slice_free(BinTreeNode, btnode);
+}
+
+static void
+bin_tree_free(BinTree *btree)
+{
+    if (!btree->degenerate)
+        bin_tree_node_free(btree->root);
+    g_free(btree);
+}
+
+static BinTree*
+bin_tree_new(const gdouble *xdata, guint n, guint maxdepth)
+{
+    BinTree *btree;
+    guint i;
+
+    btree = g_new0(BinTree, 1);
+
+    if (!maxdepth)
+        maxdepth = 24;
+    btree->maxdepth = maxdepth;
+
+    bin_tree_find_range(btree, xdata, n);
+    if (!(btree->min < btree->max)) {
+        btree->degenerate = TRUE;
+        btree->degenerateS = G_MAXDOUBLE;
+        return btree;
+    }
+
+    /* Return explicit estimates for n < 4, making maxdiv at least 1 (with
+     * half-scales included, ecurve will have at least 3 points then). */
+    if (n == 2) {
+        btree->degenerate = TRUE;
+        btree->degenerateS = log(btree->max - btree->min);
+        return btree;
+    }
+    if (n == 3) {
+        btree->degenerate = TRUE;
+        btree->degenerateS = (log(btree->max - btree->min)
+                              + 0.5*log(1.5) - G_LN2/3.0);
+        return btree;
+    }
+
+    for (i = 0; i < n; i++) {
+        gdouble pt = xdata[i];
+        bin_tree_add(btree, pt);
+    }
+
+    return btree;
+}
+
+static void
+bin_tree_node_entropies_at_scales(BinTreeNode *btnode, guint maxdepth,
+                                  gdouble *S, guint *unsplit)
+{
+    BinTreeNode *child;
+    guint i;
+
+    /* Singular points contribute to p*ln(p) always with zero.  So we can stop
+     * recursion to finer subdivisions when count == 1. */
+    if (btnode->count <= 1)
+        return;
+
+    if (!maxdepth) {
+        S[0] += gwy_xlnx_int(btnode->count);
+        return;
+    }
+
+    if (btnode->count == 2) {
+        unsplit[0]++;
+        return;
+    }
+
+    S[0] += gwy_xlnx_int(btnode->count);
+    S++;
+
+    maxdepth--;
+    unsplit++;
+    for (i = 0; i < G_N_ELEMENTS(btnode->u.children); i++) {
+        if ((child = btnode->u.children[i]))
+            bin_tree_node_entropies_at_scales(child, maxdepth, S, unsplit);
+    }
+}
+
+static gdouble*
+bin_tree_entropies_at_scales(BinTree *btree, guint maxdepth)
+{
+    gdouble *S;
+    guint *unsplit;
+    guint i, n, npts;
+    gdouble Sscale;
+
+    if (!maxdepth)
+        maxdepth = btree->maxdepth;
+
+    n = maxdepth + 1;
+    S = g_new0(gdouble, n);
+
+    if (btree->degenerate) {
+        S[0] = btree->degenerateS;
+        for (i = 1; i < n; i++)
+            S[i] = S[i-1] - G_LN2;
+        return S;
+    }
+
+    unsplit = g_new0(guint, maxdepth);
+    bin_tree_node_entropies_at_scales(btree->root,
+                                      MIN(maxdepth, btree->maxdepth),
+                                      S, unsplit);
+
+    for (i = 0; i < maxdepth; i++) {
+        if (unsplit[i])
+            add_estimated_unsplit_node_entropy(S + i, maxdepth - i, unsplit[i]);
+    }
+    g_free(unsplit);
+
+    npts = btree->root->count;
+    Sscale = log(npts*(btree->max - btree->min));
+    for (i = 0; i < n; i++)
+        S[i] = Sscale - i*G_LN2 - S[i]/npts;
+
+    return S;
+}
+
+static gdouble*
+calculate_entropy_at_scales(GwyDataField *dfield,
+                            GwyDataField *mask,
+                            GwyMaskingType mode,
+                            gint col, gint row,
+                            gint width, gint height,
+                            guint *maxdiv,
+                            gdouble *S)
+{
+    gint xres;
+    guint i, j, n;
+    gdouble *xdata;
+    const gdouble *base;
+    gboolean must_free_xdata = TRUE;
+    gdouble *ecurve;
+    BinTree *btree;
+
+    if (mask) {
+        gwy_data_field_area_count_in_range(mask, NULL, col, row, width, height,
+                                           G_MAXDOUBLE, 1.0, NULL, &n);
+        if (mode == GWY_MASK_EXCLUDE)
+            n = width*height - n;
+    }
+    else
+        n = width*height;
+
+    if (!*maxdiv) {
+        if (n >= 2)
+            *maxdiv = (guint)floor(3.0*log(n)/G_LN2 + 1e-12);
+        else
+            *maxdiv = 2;
+
+        /* We will run out of significant digits in coordinates after that. */
+        *maxdiv = MIN(*maxdiv, 50);
+    }
+
+    if (n < 2) {
+        ecurve = g_new(gdouble, *maxdiv+1);
+        for (i = 0; i <= *maxdiv; i++)
+            ecurve[i] = -G_MAXDOUBLE;
+        if (S)
+            *S = -G_MAXDOUBLE;
+        return ecurve;
+    }
+
+    xres = dfield->xres;
+    base = dfield->data + row*xres + col;
+    if (n == xres*dfield->yres) {
+        /* Handle the full-field case without allocating anything. */
+        xdata = dfield->data;
+        must_free_xdata = FALSE;
+    }
+    else {
+        xdata = g_new(gdouble, n);
+        if (mask) {
+            const gdouble *mbase = mask->data + row*xres + col;
+            const gboolean invert = (mode == GWY_MASK_EXCLUDE);
+            guint k = 0;
+
+            for (i = 0; i < height; i++) {
+                const gdouble *d = base + i*xres;
+                const gdouble *m = mbase + i*xres;
+                for (j = width; j; j--, d++, m++) {
+                    if ((*m < 1.0) == invert)
+                        xdata[k++] = *d;
+                }
+            }
+            g_assert(k == n);
+        }
+        else {
+            for (i = 0; i < height; i++)
+                gwy_assign(xdata + i*width, base + i*xres, width);
+        }
+    }
+
+    btree = bin_tree_new(xdata, n, *maxdiv);
+    if (must_free_xdata)
+        g_free(xdata);
+
+    ecurve = bin_tree_entropies_at_scales(btree, *maxdiv);
+    if (S) {
+        if (btree->degenerate)
+            *S = btree->degenerateS;
+        else
+            *S = calculate_entropy_from_scaling(ecurve, *maxdiv);
+    }
+    bin_tree_free(btree);
+
+    return ecurve;
+}
+
+/**
+ * gwy_data_field_area_get_entropy_at_scales:
+ * @data_field: A data field.
+ * @target_line: A data line to store the result to.  It will be resampled to
+ *               @maxdiv+1 items.
+ * @mask: Mask specifying which values to take into account/exclude, or %NULL.
+ * @mode: Masking mode to use.  See the introduction for description of
+ *        masking modes.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ * @maxdiv: Maximum number of divisions of the value range.  Pass zero to
+ *          choose it automatically.
+ *
+ * Calculates estimates of value distribution entropy at various scales.
+ *
+ * Returns: The best estimate, as gwy_data_field_area_get_entropy().
+ *
+ * Since: 2.44
+ **/
+gdouble
+gwy_data_field_area_get_entropy_at_scales(GwyDataField *data_field,
+                                          GwyDataLine *target_line,
+                                          GwyDataField *mask,
+                                          GwyMaskingType mode,
+                                          gint col, gint row,
+                                          gint width, gint height,
+                                          gint maxdiv)
+{
+    GwySIUnit *lineunit;
+    guint umaxdiv = (maxdiv > 0 ? maxdiv : 0);
+    gdouble *ecurve;
+    gdouble min, max, S = -G_MAXDOUBLE;
+    gint i;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), S);
+    g_return_val_if_fail(GWY_IS_DATA_LINE(target_line), S);
+    g_return_val_if_fail(!mask || (GWY_IS_DATA_FIELD(mask)
+                                   && mask->xres == data_field->xres
+                                   && mask->yres == data_field->yres), S);
+    g_return_val_if_fail(col >= 0 && row >= 0
+                         && width >= 0 && height >= 0
+                         && col + width <= data_field->xres
+                         && row + height <= data_field->yres, S);
+
+    ecurve = calculate_entropy_at_scales(data_field, mask, mode,
+                                         col, row, width, height,
+                                         &umaxdiv, &S);
+    maxdiv = maxdiv ? maxdiv : umaxdiv + 1;
+    gwy_data_line_resample(target_line, maxdiv, GWY_INTERPOLATION_NONE);
+    target_line->real = maxdiv*G_LN2;
+    for (i = 0; i < maxdiv; i++)
+        target_line->data[maxdiv-1 - i] = ecurve[i];
+    g_free(ecurve);
+
+    gwy_data_field_area_get_min_max_mask(data_field, mask, mode,
+                                         col, row, width, height,
+                                         &min, &max);
+    if (max > min)
+        target_line->off = log(max - min) - (maxdiv - 0.5)*G_LN2;
+
+    lineunit = gwy_data_line_get_si_unit_x(target_line);
+    gwy_si_unit_set_from_string(lineunit, NULL);
+    lineunit = gwy_data_line_get_si_unit_y(target_line);
+    gwy_si_unit_set_from_string(lineunit, NULL);
+
+    return S;
+}
+
+/**
+ * gwy_data_field_get_entropy:
+ * @data_field: A data field.
+ *
+ * Computes the entropy of a data field.
+ *
+ * See gwy_data_field_area_get_entropy() for the definition.
+ *
+ * This quantity is cached.
+ *
+ * Returns: The value distribution entropy.
+ *
+ * Since: 2.42
+ **/
+gdouble
+gwy_data_field_get_entropy(GwyDataField *data_field)
+{
+    gdouble S = -G_MAXDOUBLE;
+    gdouble *ecurve;
+    guint maxdiv = 0;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), S);
+
+    gwy_debug("%s", CTEST(data_field, ENT) ? "cache" : "lame");
+    if (CTEST(data_field, ENT))
+        return CVAL(data_field, ENT);
+
+    ecurve = calculate_entropy_at_scales(data_field, NULL, GWY_MASK_IGNORE,
+                                         0, 0,
+                                         data_field->xres, data_field->yres,
+                                         &maxdiv, &S);
+    g_free(ecurve);
+
+    CVAL(data_field, ENT) = S;
+    data_field->cached |= CBIT(ENT);
+
+    return S;
+}
+
+/**
+ * gwy_data_field_area_get_entropy:
+ * @data_field: A data field.
+ * @mask: Mask specifying which values to take into account/exclude, or %NULL.
+ * @mode: Masking mode to use.  See the introduction for description of
+ *        masking modes.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ *
+ * Estimates the entropy of field data distribution.
+ *
+ * The estimate is calculated as @S = ln(@n Δ) − 1/@n ∑ @n_i ln(@n_i), where
+ * @n is the number of pixels considered, Δ the bin size and @n_i the count in
+ * the @i-th bin.  If @S is plotted as a function of the bin size Δ, it is,
+ * generally, a growing function with a plateau for ‘reasonable’ bin sizes.
+ * The estimate is taken at the plateau.  If no plateau is found, which means
+ * the distribution is effectively a sum of δ-functions, -%G_MAXDOUBLE is
+ * returned.
+ *
+ * It should be noted that this estimate may be biased.
+ *
+ * Returns: The estimated entropy of the data values.  The entropy of no data
+ *          or a single single is returned as -%G_MAXDOUBLE.
+ *
+ * Since: 2.42
+ **/
+gdouble
+gwy_data_field_area_get_entropy(GwyDataField *data_field,
+                                GwyDataField *mask,
+                                GwyMaskingType mode,
+                                gint col, gint row,
+                                gint width, gint height)
+{
+    gdouble S = -G_MAXDOUBLE;
+    gdouble *ecurve;
+    guint maxdiv = 0;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), S);
+    g_return_val_if_fail(!mask || (GWY_IS_DATA_FIELD(mask)
+                                   && mask->xres == data_field->xres
+                                   && mask->yres == data_field->yres), S);
+    g_return_val_if_fail(col >= 0 && row >= 0
+                         && width >= 0 && height >= 0
+                         && col + width <= data_field->xres
+                         && row + height <= data_field->yres,
+                         S);
+
+    /* The result is the same, but it can be cached. */
+    if ((!mask || mode == GWY_MASK_IGNORE)
+        && row == 0 && col == 0
+        && width == data_field->xres && height == data_field->yres)
+        return gwy_data_field_get_entropy(data_field);
+
+    ecurve = calculate_entropy_at_scales(data_field, mask, mode,
+                                         col, row, width, height,
+                                         &maxdiv, &S);
+    g_free(ecurve);
+    return S;
+}
+
+static QuadTreeNode*
+quad_tree_node_new(const GwyXY *pt)
+{
+    QuadTreeNode *qtnode = g_slice_new(QuadTreeNode);
+    qtnode->u.pt.a = *pt;
+    qtnode->count = 1;
+    return qtnode;
+}
+
+static void
+quad_tree_add_node(QuadTreeNode *qtnode, const GwyXY *pt,
+                   GwyXY min, GwyXY max, guint maxdepth)
+{
+    QuadTreeNode *child;
+    GwyXY centre;
+    guint i;
+
+    /* We reached maximum allowed subdivision.  Just increase the count. */
+    if (!maxdepth) {
+        if (qtnode->count <= 2)
+            gwy_clear(&qtnode->u, 1);
+        qtnode->count++;
+        return;
+    }
+
+    /* We will descend into subtrees. */
+    centre.x = 0.5*(min.x + max.x);
+    centre.y = 0.5*(min.y + max.y);
+
+    /* If this node has just one point add the other there and we are done. */
+    if (qtnode->count == 1) {
+        qtnode->u.pt.b = *pt;
+        qtnode->count++;
+        return;
+    }
+
+    /* We will be recursing.  So if this node is a leaf start by making it
+     * non-leaf. */
+    if (qtnode->count == 2) {
+        GwyXY pta = qtnode->u.pt.a;
+        GwyXY ptb = qtnode->u.pt.b;
+        guint ia = (pta.x > centre.x) + 2*(pta.y > centre.y);
+        guint ib = (ptb.x > centre.x) + 2*(ptb.y > centre.y);
+
+        gwy_clear(&qtnode->u, 1);
+        child = qtnode->u.children[ia] = quad_tree_node_new(&pta);
+        /* Must distinguish between creating two child nodes and creating one
+         * two-point child node. */
+        if (ia == ib) {
+            child->u.pt.b = ptb;
+            child->count = 2;
+        }
+        else
+            qtnode->u.children[ib] = quad_tree_node_new(&ptb);
+    }
+
+    /* Add the new point to the appropriate child. */
+    i = (pt->x > centre.x) + 2*(pt->y > centre.y);
+    maxdepth--;
+    qtnode->count++;
+
+    if ((child = qtnode->u.children[i])) {
+        /* Recurse.  This will end either by reaching maxdepth=0 or by
+         * successful separation in the other branch of this conditon. */
+        if (i == 0)
+            quad_tree_add_node(child, pt, min, centre, maxdepth);
+        else if (i == 1) {
+            min.x = centre.x;
+            max.y = centre.y;
+            quad_tree_add_node(child, pt, min, max, maxdepth);
+        }
+        else if (i == 2) {
+            max.x = centre.x;
+            min.y = centre.y;
+            quad_tree_add_node(child, pt, min, max, maxdepth);
+        }
+        else
+            quad_tree_add_node(child, pt, centre, max, maxdepth);
+    }
+    else {
+        /* There is nothing here yet.  Add the point as a new leaf. */
+        qtnode->u.children[i] = quad_tree_node_new(pt);
+    }
+}
+
+static void
+quad_tree_add(QuadTree *qtree, const GwyXY *pt)
+{
+    if (G_LIKELY(qtree->root)) {
+        quad_tree_add_node(qtree->root, pt,
+                           qtree->min, qtree->max, qtree->maxdepth);
+    }
+    else
+        qtree->root = quad_tree_node_new(pt);
+}
+
+static void
+quad_tree_find_range(QuadTree *qtree,
+                     const gdouble *xdata, const gdouble *ydata, guint n)
+{
+    GwyXY min = { G_MAXDOUBLE, G_MAXDOUBLE };
+    GwyXY max = { -G_MAXDOUBLE, -G_MAXDOUBLE };
+    guint i;
+
+    for (i = 0; i < n; i++) {
+        gdouble x = xdata[i];
+        gdouble y = ydata[i];
+
+        if (x < min.x)
+            min.x = x;
+        if (x > max.x)
+            max.x = x;
+        if (y < min.y)
+            min.y = y;
+        if (y > max.y)
+            max.y = y;
+    }
+
+    qtree->min = min;
+    qtree->max = max;
+}
+
+static void
+quad_tree_node_free(QuadTreeNode *qtnode)
+{
+    guint i;
+
+    if (qtnode->count > 2) {
+        for (i = 0; i < G_N_ELEMENTS(qtnode->u.children); i++) {
+            if (qtnode->u.children[i])
+                quad_tree_node_free(qtnode->u.children[i]);
+        }
+    }
+    g_slice_free(QuadTreeNode, qtnode);
+}
+
+static void
+quad_tree_free(QuadTree *qtree)
+{
+    quad_tree_node_free(qtree->root);
+    g_free(qtree);
+}
+
+static QuadTree*
+quad_tree_new(const gdouble *xdata, const gdouble *ydata, guint n,
+              guint maxdepth)
+{
+    QuadTree *qtree;
+    guint i;
+
+    qtree = g_new0(QuadTree, 1);
+
+    if (!maxdepth)
+        maxdepth = 16;
+    qtree->maxdepth = maxdepth;
+
+    quad_tree_find_range(qtree, xdata, ydata, n);
+    if (!(qtree->min.x < qtree->max.x) || !(qtree->min.y < qtree->max.y)) {
+        qtree->degenerate = TRUE;
+        qtree->degenerateS = G_MAXDOUBLE;
+        return qtree;
+    }
+
+    /* Return explicit estimates for n < 4, making maxdiv at least 1 (with
+     * half-scales included, ecurve will have at least 3 points then). */
+    if (n == 2) {
+        qtree->degenerate = TRUE;
+        qtree->degenerateS = (log(qtree->max.x - qtree->min.x)
+                               + log(qtree->max.y - qtree->min.y));
+        return qtree;
+    }
+    if (n == 3) {
+        qtree->degenerate = TRUE;
+        qtree->degenerateS = (log(qtree->max.x - qtree->min.x)
+                               + log(qtree->max.y - qtree->min.y)
+                               + 0.5*log(1.5) - 2.0*G_LN2/3.0);
+        return qtree;
+    }
+
+    for (i = 0; i < n; i++) {
+        GwyXY pt = { xdata[i], ydata[i] };
+        quad_tree_add(qtree, &pt);
+    }
+
+    return qtree;
+}
+
+static gdouble
+quad_tree_node_half_scale_entropy(QuadTreeNode *qtnode)
+{
+    QuadTreeNode *child;
+    guint cnt[G_N_ELEMENTS(qtnode->u.children)] = { 0, 0, 0, 0 };
+    guint i;
+
+    for (i = 0; i < G_N_ELEMENTS(qtnode->u.children); i++) {
+        if ((child = qtnode->u.children[i]))
+            cnt[i] = child->count;
+    }
+    return 0.5*(gwy_xlnx_int(cnt[0] + cnt[1])
+                + gwy_xlnx_int(cnt[2] + cnt[3])
+                + gwy_xlnx_int(cnt[0] + cnt[2])
+                + gwy_xlnx_int(cnt[1] + cnt[3]));
+}
+
+static void
+quad_tree_node_entropies_at_scales(QuadTreeNode *qtnode, guint maxdepth,
+                                   gdouble *S, guint *unsplit)
+{
+    QuadTreeNode *child;
+    guint i;
+
+    /* Singular points contribute to p*ln(p) always with zero.  So we can stop
+     * recursion to finer subdivisions when count == 1. */
+    if (qtnode->count <= 1)
+        return;
+
+    if (!maxdepth) {
+        S[0] += gwy_xlnx_int(qtnode->count);
+        return;
+    }
+
+    if (qtnode->count == 2) {
+        unsplit[0]++;
+        return;
+    }
+
+    S[0] += gwy_xlnx_int(qtnode->count);
+    S++;
+
+    // Half-scale entropies we estimate as averages of horizontal and vertical
+    // binning.
+    S[0] += quad_tree_node_half_scale_entropy(qtnode);
+    S++;
+
+    maxdepth--;
+    unsplit++;
+    for (i = 0; i < G_N_ELEMENTS(qtnode->u.children); i++) {
+        if ((child = qtnode->u.children[i]))
+            quad_tree_node_entropies_at_scales(child, maxdepth, S, unsplit);
+    }
+}
+
+static gdouble*
+quad_tree_entropies_at_scales(QuadTree *qtree, guint maxdepth)
+{
+    gdouble *S;
+    guint *unsplit;
+    guint i, n, npts;
+    gdouble Sscale;
+
+    if (!maxdepth)
+        maxdepth = qtree->maxdepth;
+
+    n = 2*maxdepth + 1;
+    S = g_new0(gdouble, n);
+    unsplit = g_new0(guint, maxdepth);
+    quad_tree_node_entropies_at_scales(qtree->root,
+                                       MIN(maxdepth, qtree->maxdepth),
+                                       S, unsplit);
+
+    for (i = 0; i < maxdepth; i++) {
+        if (unsplit[i])
+            add_estimated_unsplit_node_entropy(S + 2*i, 2*(maxdepth - i),
+                                               unsplit[i]);
+    }
+    g_free(unsplit);
+
+    npts = qtree->root->count;
+    Sscale = log(npts
+                 *(qtree->max.x - qtree->min.x)*(qtree->max.y - qtree->min.y));
+    for (i = 0; i < n; i++)
+        S[i] = Sscale - i*G_LN2 - S[i]/npts;
+
+    return S;
+}
+
+static gdouble*
+calculate_entropy_2d_at_scales(GwyDataField *xfield,
+                               GwyDataField *yfield,
+                               guint *maxdiv,
+                               gdouble *S)
+{
+    guint xres, yres, n, i;
+    gdouble *ecurve;
+    QuadTree *qtree;
+
+    xres = xfield->xres;
+    yres = xfield->yres;
+    n = xres*yres;
+
+    if (!*maxdiv) {
+        if (n >= 2)
+            *maxdiv = (guint)floor(1.5*log(n)/G_LN2 + 1e-12);
+        else
+            *maxdiv = 1;
+
+        /* We will run out of significant digits in coordinates after that. */
+        *maxdiv = MIN(*maxdiv, 50);
+    }
+
+    if (n < 2) {
+        ecurve = g_new(gdouble, *maxdiv+1);
+        for (i = 0; i <= *maxdiv; i++)
+            ecurve[i] = -G_MAXDOUBLE;
+        if (S)
+            *S = -G_MAXDOUBLE;
+        return ecurve;
+    }
+
+    qtree = quad_tree_new(xfield->data, yfield->data, n, *maxdiv);
+    ecurve = quad_tree_entropies_at_scales(qtree, *maxdiv);
+    if (S) {
+        if (qtree->degenerate)
+            *S = qtree->degenerateS;
+        else
+            *S = calculate_entropy_from_scaling(ecurve, 2*(*maxdiv));
+    }
+    quad_tree_free(qtree);
+
+    return ecurve;
+}
+
+/**
+ * gwy_data_field_get_entropy_2d_at_scales:
+ * @xfield: A data field containing the @x-coordinates.
+ * @yfield: A data field containing the @y-coordinates.
+ * @target_line: A data line to store the result to.  It will be resampled to
+ *               @maxdiv+1 items.
+ * @maxdiv: Maximum number of divisions of the value range.  Pass zero to
+ *          choose it automatically.
+ *
+ * Calculates estimates of entropy of two-dimensional point cloud at various
+ * scales.
+ *
+ * Returns: The best estimate, as gwy_data_field_get_entropy_2d().
+ *
+ * Since: 2.44
+ **/
+gdouble
+gwy_data_field_get_entropy_2d_at_scales(GwyDataField *xfield,
+                                        GwyDataField *yfield,
+                                        GwyDataLine *target_line,
+                                        gint maxdiv)
+{
+    GwySIUnit *lineunit;
+    guint umaxdiv = (maxdiv > 0 ? maxdiv/2 : 0);
+    gdouble *ecurve;
+    gdouble xmin, xmax, ymin, ymax, S = -G_MAXDOUBLE;
+    gint i;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(xfield), S);
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(yfield), S);
+    g_return_val_if_fail(GWY_IS_DATA_LINE(target_line), S);
+    g_return_val_if_fail(xfield->xres == yfield->xres, S);
+    g_return_val_if_fail(xfield->yres == yfield->yres, S);
+
+    ecurve = calculate_entropy_2d_at_scales(xfield, yfield, &umaxdiv, &S);
+    maxdiv = maxdiv ? maxdiv : 2*umaxdiv + 1;
+    gwy_data_line_resample(target_line, maxdiv, GWY_INTERPOLATION_NONE);
+    target_line->real = maxdiv*G_LN2;
+    for (i = 0; i < maxdiv; i++)
+        target_line->data[maxdiv-1 - i] = ecurve[i];
+    g_free(ecurve);
+
+    gwy_data_field_get_min_max(xfield, &xmin, &xmax);
+    gwy_data_field_get_min_max(xfield, &ymin, &ymax);
+    if ((xmax > xmin) && (ymax > ymin))
+        target_line->off = (log((xmax - xmin)*(ymax - ymin))
+                            - (maxdiv - 0.5)*G_LN2);
+
+    lineunit = gwy_data_line_get_si_unit_x(target_line);
+    gwy_si_unit_set_from_string(lineunit, NULL);
+    lineunit = gwy_data_line_get_si_unit_y(target_line);
+    gwy_si_unit_set_from_string(lineunit, NULL);
+
+    return S;
+}
+
+/**
+ * gwy_data_field_get_entropy_2d:
+ * @xfield: A data field containing the @x-coordinates.
+ * @yfield: A data field containing the @y-coordinates.
+ *
+ * Computes the entropy of a two-dimensional point cloud.
+ *
+ * Each pair of corresponding @xfield and @yfield pixels is assumed to
+ * represent the coordinates (@x, at y) of a point in plane.  Hence they must have
+ * the same dimensions.
+ *
+ * Returns: The two-dimensional distribution entropy.
+ *
+ * Since: 2.44
+ **/
+gdouble
+gwy_data_field_get_entropy_2d(GwyDataField *xfield,
+                              GwyDataField *yfield)
+{
+    gdouble *ecurve;
+    guint maxdiv = 0;
+    gdouble S = -G_MAXDOUBLE;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(xfield), S);
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(yfield), S);
+    g_return_val_if_fail(xfield->xres == yfield->xres, S);
+    g_return_val_if_fail(xfield->yres == yfield->yres, S);
+
+    ecurve = calculate_entropy_2d_at_scales(xfield, yfield, &maxdiv, &S);
+    g_free(ecurve);
+
+    return S;
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/libprocess/stats-sum.c b/libprocess/stats-sum.c
new file mode 100644
index 0000000..e4f0c2b
--- /dev/null
+++ b/libprocess/stats-sum.c
@@ -0,0 +1,1516 @@
+/*
+ *  @(#) $Id: stats-sum.c 19698 2017-05-03 20:18:10Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include <string.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libprocess/datafield.h>
+#include <libprocess/stats.h>
+#include <libprocess/linestats.h>
+#include "gwyprocessinternal.h"
+
+/**
+ * square_area1:
+ * @z1: Z-value in first corner.
+ * @z2: Z-value in second corner.
+ * @z3: Z-value in third corner.
+ * @z4: Z-value in fourth corner.
+ * @q: One fourth of rectangle projected area (x-size * ysize).
+ *
+ * Calculates approximate area of a one square pixel.
+ *
+ * Returns: The area.
+ **/
+static inline gdouble
+square_area1(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
+             gdouble q)
+{
+    gdouble c;
+
+    c = (z1 + z2 + z3 + z4)/4.0;
+    z1 -= c;
+    z2 -= c;
+    z3 -= c;
+    z4 -= c;
+
+    return (sqrt(1.0 + 2.0*(z1*z1 + z2*z2)/q)
+            + sqrt(1.0 + 2.0*(z2*z2 + z3*z3)/q)
+            + sqrt(1.0 + 2.0*(z3*z3 + z4*z4)/q)
+            + sqrt(1.0 + 2.0*(z4*z4 + z1*z1)/q));
+}
+
+/**
+ * square_area1w:
+ * @z1: Z-value in first corner.
+ * @z2: Z-value in second corner.
+ * @z3: Z-value in third corner.
+ * @z4: Z-value in fourth corner.
+ * @w1: Weight of first corner (0 or 1).
+ * @w2: Weight of second corner (0 or 1).
+ * @w3: Weight of third corner (0 or 1).
+ * @w4: Weight of fourth corner (0 or 1).
+ * @q: One fourth of rectangle projected area (x-size * ysize).
+ *
+ * Calculates approximate area of a one square pixel with some corners possibly
+ * missing.
+ *
+ * Returns: The area.
+ **/
+static inline gdouble
+square_area1w(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
+              gint w1, gint w2, gint w3, gint w4,
+              gdouble q)
+{
+    gdouble c;
+
+    c = (z1 + z2 + z3 + z4)/4.0;
+    z1 -= c;
+    z2 -= c;
+    z3 -= c;
+    z4 -= c;
+
+    return ((w1 + w2)*sqrt(1.0 + 2.0*(z1*z1 + z2*z2)/q)
+            + (w2 + w3)*sqrt(1.0 + 2.0*(z2*z2 + z3*z3)/q)
+            + (w3 + w4)*sqrt(1.0 + 2.0*(z3*z3 + z4*z4)/q)
+            + (w4 + w1)*sqrt(1.0 + 2.0*(z4*z4 + z1*z1)/q))/2.0;
+}
+
+/**
+ * square_area2:
+ * @z1: Z-value in first corner.
+ * @z2: Z-value in second corner.
+ * @z3: Z-value in third corner.
+ * @z4: Z-value in fourth corner.
+ * @x: One fourth of square of rectangle width (x-size).
+ * @y: One fourth of square of rectangle height (y-size).
+ *
+ * Calculates approximate area of a one general rectangular pixel.
+ *
+ * Returns: The area.
+ **/
+static inline gdouble
+square_area2(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
+             gdouble x, gdouble y)
+{
+    gdouble c;
+
+    c = (z1 + z2 + z3 + z4)/2.0;
+
+    return (sqrt(1.0 + (z1 - z2)*(z1 - z2)/x
+                 + (z1 + z2 - c)*(z1 + z2 - c)/y)
+            + sqrt(1.0 + (z2 - z3)*(z2 - z3)/y
+                   + (z2 + z3 - c)*(z2 + z3 - c)/x)
+            + sqrt(1.0 + (z3 - z4)*(z3 - z4)/x
+                   + (z3 + z4 - c)*(z3 + z4 - c)/y)
+            + sqrt(1.0 + (z1 - z4)*(z1 - z4)/y
+                   + (z1 + z4 - c)*(z1 + z4 - c)/x));
+}
+
+/**
+ * square_area2w:
+ * @z1: Z-value in first corner.
+ * @z2: Z-value in second corner.
+ * @z3: Z-value in third corner.
+ * @z4: Z-value in fourth corner.
+ * @w1: Weight of first corner (0 or 1).
+ * @w2: Weight of second corner (0 or 1).
+ * @w3: Weight of third corner (0 or 1).
+ * @w4: Weight of fourth corner (0 or 1).
+ * @x: One fourth of square of rectangle width (x-size).
+ * @y: One fourth of square of rectangle height (y-size).
+ *
+ * Calculates approximate area of a one general rectangular pixel with some
+ * corners possibly missing.
+ *
+ * Returns: The area.
+ **/
+static inline gdouble
+square_area2w(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
+              gint w1, gint w2, gint w3, gint w4,
+              gdouble x, gdouble y)
+{
+    gdouble c;
+
+    c = (z1 + z2 + z3 + z4)/2.0;
+
+    return ((w1 + w2)*sqrt(1.0 + (z1 - z2)*(z1 - z2)/x
+                           + (z1 + z2 - c)*(z1 + z2 - c)/y)
+            + (w2 + w3)*sqrt(1.0 + (z2 - z3)*(z2 - z3)/y
+                             + (z2 + z3 - c)*(z2 + z3 - c)/x)
+            + (w3 + w4)*sqrt(1.0 + (z3 - z4)*(z3 - z4)/x
+                             + (z3 + z4 - c)*(z3 + z4 - c)/y)
+            + (w4 + w1)*sqrt(1.0 + (z1 - z4)*(z1 - z4)/y
+                             + (z1 + z4 - c)*(z1 + z4 - c)/x))/2.0;
+}
+
+/**
+ * stripe_area1:
+ * @n: The number of values in @r, @rr, @m.
+ * @stride: Stride in @r, @rr, @m.
+ * @r: Array of @n z-values of vertices, this row of vertices is considered
+ *     inside.
+ * @rr: Array of @n z-values of vertices, this row of vertices is considered
+ *      outside.
+ * @m: Mask for @r (@rr does not need mask since it has zero weight by
+ *     definition), or %NULL to sum over all @r vertices.
+ * @mode: Masking mode.
+ * @q: One fourth of rectangle projected area (x-size * ysize).
+ *
+ * Calculates approximate area of a half-pixel stripe.
+ *
+ * Returns: The area.
+ **/
+static gdouble
+stripe_area1(gint n,
+             gint stride,
+             const gdouble *r,
+             const gdouble *rr,
+             const gdouble *m,
+             GwyMaskingType mode,
+             gdouble q)
+{
+    gdouble sum = 0.0;
+    gint j;
+
+    if (m && mode != GWY_MASK_IGNORE) {
+        if (mode == GWY_MASK_INCLUDE) {
+            for (j = 0; j < n-1; j++)
+                sum += square_area1w(r[j*stride], r[(j + 1)*stride],
+                                     rr[(j + 1)*stride], rr[j*stride],
+                                     m[j*stride] > 0.0, m[(j + 1)*stride] > 0.0,
+                                     0, 0,
+                                     q);
+        }
+        else {
+            for (j = 0; j < n-1; j++)
+                sum += square_area1w(r[j*stride], r[(j + 1)*stride],
+                                     rr[(j + 1)*stride], rr[j*stride],
+                                     m[j*stride] < 1.0, m[(j + 1)*stride] < 1.0,
+                                     0, 0,
+                                     q);
+        }
+    }
+    else {
+        for (j = 0; j < n-1; j++)
+            sum += square_area1w(r[j*stride], r[(j + 1)*stride],
+                                 rr[(j + 1)*stride], rr[j*stride],
+                                 1, 1, 0, 0,
+                                 q);
+    }
+
+    return sum;
+}
+
+/**
+ * stripe_area2:
+ * @n: The number of values in @r, @rr, @m.
+ * @stride: Stride in @r, @rr, @m.
+ * @r: Array of @n z-values of vertices, this row of vertices is considered
+ *     inside.
+ * @rr: Array of @n z-values of vertices, this row of vertices is considered
+ *      outside.
+ * @m: Mask for @r (@rr does not need mask since it has zero weight by
+ *     definition), or %NULL to sum over all @r vertices.
+ * @x: One fourth of square of rectangle width (x-size).
+ * @y: One fourth of square of rectangle height (y-size).
+ *
+ * Calculates approximate area of a half-pixel stripe.
+ *
+ * Returns: The area.
+ **/
+static gdouble
+stripe_area2(gint n,
+             gint stride,
+             const gdouble *r,
+             const gdouble *rr,
+             const gdouble *m,
+             GwyMaskingType mode,
+             gdouble x,
+             gdouble y)
+{
+    gdouble sum = 0.0;
+    gint j;
+
+    if (m && mode == GWY_MASK_INCLUDE) {
+        for (j = 0; j < n-1; j++)
+            sum += square_area2w(r[j*stride], r[(j + 1)*stride],
+                                 rr[(j + 1)*stride], rr[j*stride],
+                                 m[j*stride] > 0.0, m[(j + 1)*stride] > 0.0,
+                                 0, 0,
+                                 x, y);
+    }
+    else if (m && mode == GWY_MASK_EXCLUDE) {
+        for (j = 0; j < n-1; j++)
+            sum += square_area2w(r[j*stride], r[(j + 1)*stride],
+                                 rr[(j + 1)*stride], rr[j*stride],
+                                 m[j*stride] < 1.0, m[(j + 1)*stride] < 1.0,
+                                 0, 0,
+                                 x, y);
+    }
+    else {
+        for (j = 0; j < n-1; j++)
+            sum += square_area2w(r[j*stride], r[(j + 1)*stride],
+                                 rr[(j + 1)*stride], rr[j*stride],
+                                 1, 1, 0, 0,
+                                 x, y);
+    }
+
+    return sum;
+}
+
+static gdouble
+calculate_surface_area(GwyDataField *dfield,
+                       GwyDataField *mask,
+                       GwyMaskingType mode,
+                       gint col, gint row,
+                       gint width, gint height)
+{
+    const gdouble *r, *m, *dataul, *maskul;
+    gint i, j, xres, yres, s;
+    gdouble x, y, q, sum = 0.0;
+
+    /* special cases */
+    if (!width || !height)
+        return sum;
+
+    xres = dfield->xres;
+    yres = dfield->yres;
+    x = dfield->xreal/dfield->xres;
+    y = dfield->yreal/dfield->yres;
+    q = x*y;
+    x = x*x;
+    y = y*y;
+    dataul = dfield->data + xres*row + col;
+
+    if (mask && mode != GWY_MASK_IGNORE) {
+        maskul = mask->data + xres*row + col;
+        if (fabs(log(x/y)) < 1e-7) {
+            /* Inside */
+            for (i = 0; i < height-1; i++) {
+                r = dataul + xres*i;
+                m = maskul + xres*i;
+                if (mode == GWY_MASK_INCLUDE) {
+                    for (j = 0; j < width-1; j++)
+                        sum += square_area1w(r[j], r[j+1],
+                                             r[j+xres+1], r[j+xres],
+                                             m[j] > 0.0, m[j+1] > 0.0,
+                                             m[j+xres+1] > 0.0, m[j+xres] > 0.0,
+                                             q);
+                }
+                else {
+                    for (j = 0; j < width-1; j++)
+                        sum += square_area1w(r[j], r[j+1],
+                                             r[j+xres+1], r[j+xres],
+                                             m[j] < 1.0, m[j+1] < 1.0,
+                                             m[j+xres+1] < 1.0, m[j+xres] < 1.0,
+                                             q);
+                }
+            }
+
+            /* Top row */
+            s = !(row == 0);
+            sum += stripe_area1(width, 1, dataul, dataul - s*xres,
+                                maskul, mode, q);
+
+            /* Bottom row */
+            s = !(row + height == yres);
+            sum += stripe_area1(width, 1,
+                                dataul + xres*(height-1),
+                                dataul + xres*(height-1 + s),
+                                maskul + xres*(height-1), mode, q);
+
+            /* Left column */
+            s = !(col == 0);
+            sum += stripe_area1(height, xres, dataul, dataul - s,
+                                maskul, mode, q);
+            /* Right column */
+            s = !(col + width == xres);
+            sum += stripe_area1(height, xres,
+                                dataul + width-1, dataul + width-1 + s,
+                                maskul + width-1, mode, q);
+        }
+        else {
+            /* Inside */
+            for (i = 0; i < height-1; i++) {
+                r = dataul + xres*i;
+                m = maskul + xres*i;
+                if (mode == GWY_MASK_INCLUDE) {
+                    for (j = 0; j < width-1; j++)
+                        sum += square_area2w(r[j], r[j+1],
+                                             r[j+xres+1], r[j+xres],
+                                             m[j] > 0.0, m[j+1] > 0.0,
+                                             m[j+xres+1] > 0.0, m[j+xres] > 0.0,
+                                             x, y);
+                }
+                else {
+                    for (j = 0; j < width-1; j++)
+                        sum += square_area2w(r[j], r[j+1],
+                                             r[j+xres+1], r[j+xres],
+                                             m[j] < 1.0, m[j+1] < 1.0,
+                                             m[j+xres+1] < 1.0, m[j+xres] < 1.0,
+                                             x, y);
+                }
+            }
+
+            /* Top row */
+            s = !(row == 0);
+            sum += stripe_area2(width, 1, dataul, dataul - s*xres, maskul,
+                                mode, x, y);
+
+            /* Bottom row */
+            s = !(row + height == yres);
+            sum += stripe_area2(width, 1,
+                                dataul + xres*(height-1),
+                                dataul + xres*(height-1 + s),
+                                maskul + xres*(height-1),
+                                mode, x, y);
+
+            /* Left column */
+            s = !(col == 0);
+            sum += stripe_area2(height, xres, dataul, dataul - s, maskul,
+                                mode, y, x);
+
+            /* Right column */
+            s = !(col + width == xres);
+            sum += stripe_area2(height, xres,
+                                dataul + width-1, dataul + width-1 + s,
+                                maskul + width-1,
+                                mode, y, x);
+        }
+
+        /* Just take the four corner quater-pixels as flat.  */
+        if (mode == GWY_MASK_INCLUDE) {
+            if (maskul[0] > 0.0)
+                sum += 1.0;
+            if (maskul[width-1] > 0.0)
+                sum += 1.0;
+            if (maskul[xres*(height-1)] > 0.0)
+                sum += 1.0;
+            if (maskul[xres*(height-1) + width-1] > 0.0)
+                sum += 1.0;
+        }
+        else {
+            if (maskul[0] < 1.0)
+                sum += 1.0;
+            if (maskul[width-1] < 1.0)
+                sum += 1.0;
+            if (maskul[xres*(height-1)] < 1.0)
+                sum += 1.0;
+            if (maskul[xres*(height-1) + width-1] < 1.0)
+                sum += 1.0;
+        }
+    }
+    else {
+        if (fabs(log(x/y)) < 1e-7) {
+            /* Inside */
+            for (i = 0; i < height-1; i++) {
+                r = dataul + xres*i;
+                for (j = 0; j < width-1; j++)
+                    sum += square_area1(r[j], r[j+1], r[j+xres+1], r[j+xres],
+                                        q);
+            }
+
+            /* Top row */
+            s = !(row == 0);
+            sum += stripe_area1(width, 1, dataul, dataul - s*xres,
+                                NULL, GWY_MASK_IGNORE, q);
+
+            /* Bottom row */
+            s = !(row + height == yres);
+            sum += stripe_area1(width, 1,
+                                dataul + xres*(height-1),
+                                dataul + xres*(height-1 + s),
+                                NULL, GWY_MASK_IGNORE, q);
+
+            /* Left column */
+            s = !(col == 0);
+            sum += stripe_area1(height, xres, dataul, dataul - s,
+                                NULL, GWY_MASK_IGNORE, q);
+
+            /* Right column */
+            s = !(col + width == xres);
+            sum += stripe_area1(height, xres,
+                                dataul + width-1, dataul + width-1 + s,
+                                NULL, GWY_MASK_IGNORE, q);
+        }
+        else {
+            for (i = 0; i < height-1; i++) {
+                r = dataul + xres*i;
+                for (j = 0; j < width-1; j++)
+                    sum += square_area2(r[j], r[j+1], r[j+xres+1], r[j+xres],
+                                        x, y);
+            }
+
+            /* Top row */
+            s = !(row == 0);
+            sum += stripe_area2(width, 1, dataul, dataul - s*xres, NULL,
+                                GWY_MASK_IGNORE, x, y);
+
+            /* Bottom row */
+            s = !(row + height == yres);
+            sum += stripe_area2(width, 1,
+                                dataul + xres*(height-1),
+                                dataul + xres*(height-1 + s),
+                                NULL,
+                                GWY_MASK_IGNORE, x, y);
+
+            /* Left column */
+            s = !(col == 0);
+            sum += stripe_area2(height, xres, dataul, dataul - s, NULL,
+                                GWY_MASK_IGNORE, y, x);
+
+            /* Right column */
+            s = !(col + width == xres);
+            sum += stripe_area2(height, xres,
+                                dataul + width-1, dataul + width-1 + s, NULL,
+                                GWY_MASK_IGNORE, y, x);
+        }
+
+        /* Just take the four corner quater-pixels as flat.  */
+        sum += 4.0;
+    }
+
+    return sum*q/4;
+}
+
+/**
+ * gwy_data_field_get_surface_area:
+ * @data_field: A data field.
+ *
+ * Computes surface area of a data field.
+ *
+ * This quantity is cached.
+ *
+ * Returns: The surface area.
+ **/
+gdouble
+gwy_data_field_get_surface_area(GwyDataField *data_field)
+{
+    gdouble area = 0.0;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), area);
+
+    gwy_debug("%s", CTEST(data_field, ARE) ? "cache" : "lame");
+    if (CTEST(data_field, ARE))
+        return CVAL(data_field, ARE);
+
+    area = calculate_surface_area(data_field, NULL, GWY_MASK_IGNORE,
+                                  0, 0, data_field->xres, data_field->yres);
+
+    CVAL(data_field, ARE) = area;
+    data_field->cached |= CBIT(ARE);
+
+    return area;
+}
+
+/**
+ * gwy_data_field_area_get_surface_area:
+ * @data_field: A data field.
+ * @mask: Mask specifying which values to take into account/exclude, or %NULL.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ *
+ * Computes surface area of a rectangular part of a data field.
+ *
+ * This function is equivalent to calling
+ * @gwy_data_field_area_get_surface_area_mask() with masking mode
+ * %GWY_MASK_INCLUDE.
+ *
+ * Returns: The surface area.
+ **/
+gdouble
+gwy_data_field_area_get_surface_area(GwyDataField *data_field,
+                                     GwyDataField *mask,
+                                     gint col, gint row,
+                                     gint width, gint height)
+{
+    return gwy_data_field_area_get_surface_area_mask(data_field, mask,
+                                                     GWY_MASK_INCLUDE,
+                                                     col, row, width, height);
+}
+
+/**
+ * gwy_data_field_area_get_surface_area_mask:
+ * @data_field: A data field.
+ * @mask: Mask specifying which values to take into account/exclude, or %NULL.
+ * @mode: Masking mode to use.  See the introduction for description of
+ *        masking modes.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ *
+ * Computes surface area of a rectangular part of a data field.
+ *
+ * This quantity makes sense only if the lateral dimensions and values of
+ * @data_field are the same physical quantities.
+ *
+ * Returns: The surface area.
+ *
+ * Since: 2.18
+ **/
+gdouble
+gwy_data_field_area_get_surface_area_mask(GwyDataField *data_field,
+                                          GwyDataField *mask,
+                                          GwyMaskingType mode,
+                                          gint col, gint row,
+                                          gint width, gint height)
+{
+    gdouble area = 0.0;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), area);
+    g_return_val_if_fail(!mask || (GWY_IS_DATA_FIELD(mask)
+                                   && mask->xres == data_field->xres
+                                   && mask->yres == data_field->yres), area);
+    g_return_val_if_fail(col >= 0 && row >= 0
+                         && width >= 0 && height >= 0
+                         && col + width <= data_field->xres
+                         && row + height <= data_field->yres,
+                         area);
+
+    /* The result is the same, but it can be cached. */
+    if ((!mask || mode == GWY_MASK_IGNORE)
+        && row == 0 && col == 0
+        && width == data_field->xres && height == data_field->yres)
+        return gwy_data_field_get_surface_area(data_field);
+
+    return calculate_surface_area(data_field, mask, mode,
+                                  col, row, width, height);
+}
+
+/**
+ * square_var1:
+ * @z1: Z-value in first corner.
+ * @z2: Z-value in second corner.
+ * @z3: Z-value in third corner.
+ * @z4: Z-value in fourth corner.
+ * @q: One fourth of rectangle projected var (x-size * ysize).
+ *
+ * Calculates approximate variation of a one square pixel.
+ *
+ * Returns: The variation.
+ **/
+static inline gdouble
+square_var1(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
+            gdouble q)
+{
+    gdouble z12 = z1 - z2, z23 = z2 - z3, z34 = z3 - z4, z41 = z4 - z1;
+
+    return (sqrt((z12*z12 + z41*z41)/q)
+            + sqrt((z23*z23 + z12*z12)/q)
+            + sqrt((z34*z34 + z23*z23)/q)
+            + sqrt((z41*z41 + z34*z34)/q));
+}
+
+/**
+ * square_var1w:
+ * @z1: Z-value in first corner.
+ * @z2: Z-value in second corner.
+ * @z3: Z-value in third corner.
+ * @z4: Z-value in fourth corner.
+ * @w1: Weight of first corner (0 or 1).
+ * @w2: Weight of second corner (0 or 1).
+ * @w3: Weight of third corner (0 or 1).
+ * @w4: Weight of fourth corner (0 or 1).
+ * @q: One fourth of rectangle projected var (x-size * ysize).
+ *
+ * Calculates approximate variation of a one square pixel with some corners
+ * possibly missing.
+ *
+ * Returns: The variation.
+ **/
+static inline gdouble
+square_var1w(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
+             gint w1, gint w2, gint w3, gint w4,
+             gdouble q)
+{
+    gdouble z12 = z1 - z2, z23 = z2 - z3, z34 = z3 - z4, z41 = z4 - z1;
+
+    return (w1*sqrt((z12*z12 + z41*z41)/q)
+            + w2*sqrt((z23*z23 + z12*z12)/q)
+            + w3*sqrt((z34*z34 + z23*z23)/q)
+            + w4*sqrt((z41*z41 + z34*z34)/q));
+}
+
+/**
+ * square_var2:
+ * @z1: Z-value in first corner.
+ * @z2: Z-value in second corner.
+ * @z3: Z-value in third corner.
+ * @z4: Z-value in fourth corner.
+ * @x: One fourth of square of rectangle width (x-size).
+ * @y: One fourth of square of rectangle height (y-size).
+ *
+ * Calculates approximate variation of a one general rectangular pixel.
+ *
+ * Returns: The variation.
+ **/
+static inline gdouble
+square_var2(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
+            gdouble x, gdouble y)
+{
+    gdouble z12 = z1 - z2, z23 = z2 - z3, z34 = z3 - z4, z41 = z4 - z1;
+
+    return (sqrt(z12*z12/x + z41*z41/y)
+            + sqrt(z23*z23/y + z12*z12/x)
+            + sqrt(z34*z34/x + z23*z23/y)
+            + sqrt(z41*z41/y + z34*z34/x));
+}
+
+/**
+ * square_var2w:
+ * @z1: Z-value in first corner.
+ * @z2: Z-value in second corner.
+ * @z3: Z-value in third corner.
+ * @z4: Z-value in fourth corner.
+ * @w1: Weight of first corner (0 or 1).
+ * @w2: Weight of second corner (0 or 1).
+ * @w3: Weight of third corner (0 or 1).
+ * @w4: Weight of fourth corner (0 or 1).
+ * @x: One fourth of square of rectangle width (x-size).
+ * @y: One fourth of square of rectangle height (y-size).
+ *
+ * Calculates approximate variation of a one general rectangular pixel with
+ * some corners possibly missing.
+ *
+ * Returns: The variation.
+ **/
+static inline gdouble
+square_var2w(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
+             gint w1, gint w2, gint w3, gint w4,
+             gdouble x, gdouble y)
+{
+    gdouble z12 = z1 - z2, z23 = z2 - z3, z34 = z3 - z4, z41 = z4 - z1;
+
+    return (w1*sqrt(z12*z12/x + z41*z41/y)
+            + w2*sqrt(z23*z23/y + z12*z12/x)
+            + w3*sqrt(z34*z34/x + z23*z23/y)
+            + w4*sqrt(z41*z41/y + z34*z34/x));
+}
+
+/**
+ * stripe_var1:
+ * @n: The number of values in @r, @rr, @m.
+ * @stride: Stride in @r, @rr, @m.
+ * @r: Array of @n z-values of vertices, this row of vertices is considered
+ *     inside.
+ * @rr: Array of @n z-values of vertices, this row of vertices is considered
+ *      outside.
+ * @m: Mask for @r (@rr does not need mask since it has zero weight by
+ *     definition), or %NULL to sum over all @r vertices.
+ * @mode: Masking mode.
+ * @q: One fourth of rectangle projected var (x-size * ysize).
+ *
+ * Calculates approximate variation of a half-pixel stripe.
+ *
+ * Returns: The variation.
+ **/
+static gdouble
+stripe_var1(gint n,
+            gint stride,
+            const gdouble *r,
+            const gdouble *rr,
+            const gdouble *m,
+            GwyMaskingType mode,
+            gdouble q)
+{
+    gdouble sum = 0.0;
+    gint j;
+
+    if (m && mode != GWY_MASK_IGNORE) {
+        if (mode == GWY_MASK_INCLUDE) {
+            for (j = 0; j < n-1; j++)
+                sum += square_var1w(r[j*stride], r[(j + 1)*stride],
+                                    rr[(j + 1)*stride], rr[j*stride],
+                                    m[j*stride] > 0.0, m[(j + 1)*stride] > 0.0,
+                                    0, 0,
+                                    q);
+        }
+        else {
+            for (j = 0; j < n-1; j++)
+                sum += square_var1w(r[j*stride], r[(j + 1)*stride],
+                                    rr[(j + 1)*stride], rr[j*stride],
+                                    m[j*stride] < 1.0, m[(j + 1)*stride] < 1.0,
+                                    0, 0,
+                                    q);
+        }
+    }
+    else {
+        for (j = 0; j < n-1; j++)
+            sum += square_var1w(r[j*stride], r[(j + 1)*stride],
+                                rr[(j + 1)*stride], rr[j*stride],
+                                1, 1, 0, 0,
+                                q);
+    }
+
+    return sum;
+}
+
+/**
+ * stripe_var2:
+ * @n: The number of values in @r, @rr, @m.
+ * @stride: Stride in @r, @rr, @m.
+ * @r: Array of @n z-values of vertices, this row of vertices is considered
+ *     inside.
+ * @rr: Array of @n z-values of vertices, this row of vertices is considered
+ *      outside.
+ * @m: Mask for @r (@rr does not need mask since it has zero weight by
+ *     definition), or %NULL to sum over all @r vertices.
+ * @x: One fourth of square of rectangle width (x-size).
+ * @y: One fourth of square of rectangle height (y-size).
+ *
+ * Calculates approximate variation of a half-pixel stripe.
+ *
+ * Returns: The variation.
+ **/
+static gdouble
+stripe_var2(gint n,
+            gint stride,
+            const gdouble *r,
+            const gdouble *rr,
+            const gdouble *m,
+            GwyMaskingType mode,
+            gdouble x,
+            gdouble y)
+{
+    gdouble sum = 0.0;
+    gint j;
+
+    if (m && mode == GWY_MASK_INCLUDE) {
+        for (j = 0; j < n-1; j++)
+            sum += square_var2w(r[j*stride], r[(j + 1)*stride],
+                                rr[(j + 1)*stride], rr[j*stride],
+                                m[j*stride] > 0.0, m[(j + 1)*stride] > 0.0,
+                                0, 0,
+                                x, y);
+    }
+    else if (m && mode == GWY_MASK_EXCLUDE) {
+        for (j = 0; j < n-1; j++)
+            sum += square_var2w(r[j*stride], r[(j + 1)*stride],
+                                rr[(j + 1)*stride], rr[j*stride],
+                                m[j*stride] < 1.0, m[(j + 1)*stride] < 1.0,
+                                0, 0,
+                                x, y);
+    }
+    else {
+        for (j = 0; j < n-1; j++)
+            sum += square_var2w(r[j*stride], r[(j + 1)*stride],
+                                rr[(j + 1)*stride], rr[j*stride],
+                                1, 1, 0, 0,
+                                x, y);
+    }
+
+    return sum;
+}
+
+static gdouble
+calculate_variation(GwyDataField *dfield,
+                    GwyDataField *mask,
+                    GwyMaskingType mode,
+                    gint col, gint row,
+                    gint width, gint height)
+{
+    const gdouble *r, *m, *dataul, *maskul;
+    gint i, j, xres, yres, s;
+    gdouble x, y, q, sum = 0.0;
+
+    /* special cases */
+    if (!width || !height)
+        return sum;
+
+    xres = dfield->xres;
+    yres = dfield->yres;
+    x = dfield->xreal/dfield->xres;
+    y = dfield->yreal/dfield->yres;
+    q = x*y;
+    x = x*x;
+    y = y*y;
+    dataul = dfield->data + xres*row + col;
+
+    if (mask && mode != GWY_MASK_IGNORE) {
+        maskul = mask->data + xres*row + col;
+        if (fabs(log(x/y)) < 1e-7) {
+            /* Inside */
+            for (i = 0; i < height-1; i++) {
+                r = dataul + xres*i;
+                m = maskul + xres*i;
+                if (mode == GWY_MASK_INCLUDE) {
+                    for (j = 0; j < width-1; j++)
+                        sum += square_var1w(r[j], r[j+1],
+                                            r[j+xres+1], r[j+xres],
+                                            m[j] > 0.0, m[j+1] > 0.0,
+                                            m[j+xres+1] > 0.0, m[j+xres] > 0.0,
+                                            q);
+                }
+                else {
+                    for (j = 0; j < width-1; j++)
+                        sum += square_var1w(r[j], r[j+1],
+                                            r[j+xres+1], r[j+xres],
+                                            m[j] < 1.0, m[j+1] < 1.0,
+                                            m[j+xres+1] < 1.0, m[j+xres] < 1.0,
+                                            q);
+                }
+            }
+
+            /* Top row */
+            s = !(row == 0);
+            sum += stripe_var1(width, 1, dataul, dataul - s*xres,
+                               maskul, mode, q);
+
+            /* Bottom row */
+            s = !(row + height == yres);
+            sum += stripe_var1(width, 1,
+                               dataul + xres*(height-1),
+                               dataul + xres*(height-1 + s),
+                               maskul + xres*(height-1), mode, q);
+
+            /* Left column */
+            s = !(col == 0);
+            sum += stripe_var1(height, xres, dataul, dataul - s,
+                               maskul, mode, q);
+            /* Right column */
+            s = !(col + width == xres);
+            sum += stripe_var1(height, xres,
+                               dataul + width-1, dataul + width-1 + s,
+                               maskul + width-1, mode, q);
+        }
+        else {
+            /* Inside */
+            for (i = 0; i < height-1; i++) {
+                r = dataul + xres*i;
+                m = maskul + xres*i;
+                if (mode == GWY_MASK_INCLUDE) {
+                    for (j = 0; j < width-1; j++)
+                        sum += square_var2w(r[j], r[j+1],
+                                            r[j+xres+1], r[j+xres],
+                                            m[j] > 0.0, m[j+1] > 0.0,
+                                            m[j+xres+1] > 0.0, m[j+xres] > 0.0,
+                                            x, y);
+                }
+                else {
+                    for (j = 0; j < width-1; j++)
+                        sum += square_var2w(r[j], r[j+1],
+                                            r[j+xres+1], r[j+xres],
+                                            m[j] < 1.0, m[j+1] < 1.0,
+                                            m[j+xres+1] < 1.0, m[j+xres] < 1.0,
+                                            x, y);
+                }
+            }
+
+            /* Top row */
+            s = !(row == 0);
+            sum += stripe_var2(width, 1, dataul, dataul - s*xres, maskul,
+                               mode, x, y);
+
+            /* Bottom row */
+            s = !(row + height == yres);
+            sum += stripe_var2(width, 1,
+                               dataul + xres*(height-1),
+                               dataul + xres*(height-1 + s),
+                               maskul + xres*(height-1),
+                               mode, x, y);
+
+            /* Left column */
+            s = !(col == 0);
+            sum += stripe_var2(height, xres, dataul, dataul - s, maskul,
+                               mode, y, x);
+
+            /* Right column */
+            s = !(col + width == xres);
+            sum += stripe_var2(height, xres,
+                               dataul + width-1, dataul + width-1 + s,
+                               maskul + width-1,
+                               mode, y, x);
+        }
+    }
+    else {
+        if (fabs(log(x/y)) < 1e-7) {
+            /* Inside */
+            for (i = 0; i < height-1; i++) {
+                r = dataul + xres*i;
+                for (j = 0; j < width-1; j++)
+                    sum += square_var1(r[j], r[j+1], r[j+xres+1], r[j+xres],
+                                       q);
+            }
+
+            /* Top row */
+            s = !(row == 0);
+            sum += stripe_var1(width, 1, dataul, dataul - s*xres,
+                               NULL, GWY_MASK_IGNORE, q);
+
+            /* Bottom row */
+            s = !(row + height == yres);
+            sum += stripe_var1(width, 1,
+                               dataul + xres*(height-1),
+                               dataul + xres*(height-1 + s),
+                               NULL, GWY_MASK_IGNORE, q);
+
+            /* Left column */
+            s = !(col == 0);
+            sum += stripe_var1(height, xres, dataul, dataul - s,
+                               NULL, GWY_MASK_IGNORE, q);
+
+            /* Right column */
+            s = !(col + width == xres);
+            sum += stripe_var1(height, xres,
+                               dataul + width-1, dataul + width-1 + s,
+                               NULL, GWY_MASK_IGNORE, q);
+        }
+        else {
+            for (i = 0; i < height-1; i++) {
+                r = dataul + xres*i;
+                for (j = 0; j < width-1; j++)
+                    sum += square_var2(r[j], r[j+1], r[j+xres+1], r[j+xres],
+                                       x, y);
+            }
+
+            /* Top row */
+            s = !(row == 0);
+            sum += stripe_var2(width, 1, dataul, dataul - s*xres, NULL,
+                               GWY_MASK_IGNORE, x, y);
+
+            /* Bottom row */
+            s = !(row + height == yres);
+            sum += stripe_var2(width, 1,
+                               dataul + xres*(height-1),
+                               dataul + xres*(height-1 + s),
+                               NULL,
+                               GWY_MASK_IGNORE, x, y);
+
+            /* Left column */
+            s = !(col == 0);
+            sum += stripe_var2(height, xres, dataul, dataul - s, NULL,
+                               GWY_MASK_IGNORE, y, x);
+
+            /* Right column */
+            s = !(col + width == xres);
+            sum += stripe_var2(height, xres,
+                               dataul + width-1, dataul + width-1 + s, NULL,
+                               GWY_MASK_IGNORE, y, x);
+        }
+    }
+
+    return sum*q/4;
+}
+
+/**
+ * gwy_data_field_get_variation:
+ * @data_field: A data field.
+ *
+ * Computes the total variation of a data field.
+ *
+ * See gwy_data_field_area_get_variation() for the definition.
+ *
+ * This quantity is cached.
+ *
+ * Returns: The variation.
+ *
+ * Since: 2.38
+ **/
+gdouble
+gwy_data_field_get_variation(GwyDataField *data_field)
+{
+    gdouble var = 0.0;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), var);
+
+    gwy_debug("%s", CTEST(data_field, VAR) ? "cache" : "lame");
+    if (CTEST(data_field, VAR))
+        return CVAL(data_field, VAR);
+
+    var = calculate_variation(data_field, NULL, GWY_MASK_IGNORE,
+                              0, 0, data_field->xres, data_field->yres);
+
+    CVAL(data_field, VAR) = var;
+    data_field->cached |= CBIT(VAR);
+
+    return var;
+}
+
+/**
+ * gwy_data_field_area_get_variation:
+ * @data_field: A data field.
+ * @mask: Mask specifying which values to take into account/exclude, or %NULL.
+ * @mode: Masking mode to use.  See the introduction for description of
+ *        masking modes.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ *
+ * Computes the total variation of a rectangular part of a data field.
+ *
+ * The total variation is estimated as the integral of the absolute value of
+ * local gradient.
+ *
+ * This quantity has the somewhat odd units of value unit times lateral unit.
+ * It can be envisioned as follows.  If the surface has just two height levels
+ * (upper and lower planes) then the quantity is the length of the boundary
+ * between the upper and lower part, multiplied by the step height.  If the
+ * surface is piece-wise constant, then the variation is the step height
+ * integrated along the boundaries between the constant parts.  Therefore, for
+ * non-fractal surfaces it scales with the linear dimension of the image, not
+ * with its area, despite being an area integral.
+ *
+ * Returns: The variation.
+ *
+ * Since: 2.38
+ **/
+gdouble
+gwy_data_field_area_get_variation(GwyDataField *data_field,
+                                  GwyDataField *mask,
+                                  GwyMaskingType mode,
+                                  gint col, gint row,
+                                  gint width, gint height)
+{
+    gdouble var = 0.0;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), var);
+    g_return_val_if_fail(!mask || (GWY_IS_DATA_FIELD(mask)
+                                   && mask->xres == data_field->xres
+                                   && mask->yres == data_field->yres), var);
+    g_return_val_if_fail(col >= 0 && row >= 0
+                         && width >= 0 && height >= 0
+                         && col + width <= data_field->xres
+                         && row + height <= data_field->yres,
+                         var);
+
+    /* The result is the same, but it can be cached. */
+    if ((!mask || mode == GWY_MASK_IGNORE)
+        && row == 0 && col == 0
+        && width == data_field->xres && height == data_field->yres)
+        return gwy_data_field_get_variation(data_field);
+
+    return calculate_variation(data_field, mask, mode,
+                               col, row, width, height);
+}
+
+/**
+ * square_volume:
+ * @z1: Z-value in first corner.
+ * @z2: Z-value in second corner.
+ * @z3: Z-value in third corner.
+ * @z4: Z-value in fourth corner.
+ *
+ * Calculates approximate volume of a one square pixel.
+ *
+ * Returns: The volume.
+ **/
+static inline gdouble
+square_volume(gdouble z1, gdouble z2, gdouble z3, gdouble z4)
+{
+    gdouble c;
+
+    c = (z1 + z2 + z3 + z4)/4.0;
+
+    return c;
+}
+
+/**
+ * square_volumew:
+ * @z1: Z-value in first corner.
+ * @z2: Z-value in second corner.
+ * @z3: Z-value in third corner.
+ * @z4: Z-value in fourth corner.
+ * @w1: Weight of first corner (0 or 1).
+ * @w2: Weight of second corner (0 or 1).
+ * @w3: Weight of third corner (0 or 1).
+ * @w4: Weight of fourth corner (0 or 1).
+ *
+ * Calculates approximate volume of a one square pixel with some corners
+ * possibly missing.
+ *
+ * Returns: The volume.
+ **/
+static inline gdouble
+square_volumew(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
+               gint w1, gint w2, gint w3, gint w4)
+{
+    gdouble c;
+
+    c = (z1 + z2 + z3 + z4)/4.0;
+
+    return (w1*(3.0*z1 + z2 + z4 + c)
+            + w2*(3.0*z2 + z1 + z3 + c)
+            + w3*(3.0*z3 + z2 + z4 + c)
+            + w4*(3.0*z4 + z3 + z1 + c))/24.0;
+}
+
+/**
+ * stripe_volume:
+ * @n: The number of values in @r, @rr, @m.
+ * @stride: Stride in @r, @rr, @m.
+ * @r: Array of @n z-values of vertices, this row of vertices is considered
+ *     inside.
+ * @rr: Array of @n z-values of vertices, this row of vertices is considered
+ *      outside.
+ * @m: Mask for @r (@rr does not need mask since it has zero weight by
+ *     definition), or %NULL to sum over all @r vertices.
+ *
+ * Calculates approximate volume of a half-pixel stripe.
+ *
+ * Returns: The volume.
+ **/
+static gdouble
+stripe_volume(gint n,
+              gint stride,
+              const gdouble *r,
+              const gdouble *rr,
+              const gdouble *m)
+{
+    gdouble sum = 0.0;
+    gint j;
+
+    if (m) {
+        for (j = 0; j < n-1; j++)
+            sum += square_volumew(r[j*stride], r[(j + 1)*stride],
+                                  rr[(j + 1)*stride], rr[j*stride],
+                                  m[j*stride] > 0.0, m[(j + 1)*stride] > 0.0,
+                                  0, 0);
+    }
+    else {
+        for (j = 0; j < n-1; j++)
+            sum += square_volumew(r[j*stride], r[(j + 1)*stride],
+                                  rr[(j + 1)*stride], rr[j*stride],
+                                  1, 1, 0, 0);
+    }
+
+    return sum;
+}
+
+/**
+ * stripe_volumeb:
+ * @n: The number of values in @r, @rr, @m.
+ * @stride: Stride in @r, @rr, @m.
+ * @r: Array of @n z-values of vertices, this row of vertices is considered
+ *     inside.
+ * @rr: Array of @n z-values of vertices, this row of vertices is considered
+ *      outside.
+ * @b: Array of @n z-values of basis, this row of vertices is considered
+ *     inside.
+ * @br: Array of @n z-values of basis, this row of vertices is considered
+ *      outside.
+ * @m: Mask for @r (@rr does not need mask since it has zero weight by
+ *     definition), or %NULL to sum over all @r vertices.
+ *
+ * Calculates approximate volume of a half-pixel stripe, taken from basis.
+ *
+ * Returns: The volume.
+ **/
+static gdouble
+stripe_volumeb(gint n,
+               gint stride,
+               const gdouble *r,
+               const gdouble *rr,
+               const gdouble *b,
+               const gdouble *br,
+               const gdouble *m)
+{
+    gdouble sum = 0.0;
+    gint j;
+
+    if (m) {
+        for (j = 0; j < n-1; j++)
+            sum += square_volumew(r[j*stride] - b[j*stride],
+                                  r[(j + 1)*stride] - b[(j + 1)*stride],
+                                  rr[(j + 1)*stride] - br[(j + 1)*stride],
+                                  rr[j*stride] - br[j*stride],
+                                  m[j*stride] > 0.0,
+                                  m[(j + 1)*stride] > 0.0,
+                                  0, 0);
+    }
+    else {
+        for (j = 0; j < n-1; j++)
+            sum += square_volumew(r[j*stride] - b[j*stride],
+                                  r[(j + 1)*stride] - b[(j + 1)*stride],
+                                  rr[(j + 1)*stride] - br[(j + 1)*stride],
+                                  rr[j*stride] - br[j*stride],
+                                  1, 1, 0, 0);
+    }
+
+    return sum;
+}
+
+static gdouble
+calculate_volume(GwyDataField *dfield,
+                 GwyDataField *basis,
+                 GwyDataField *mask,
+                 gint col, gint row,
+                 gint width, gint height)
+{
+    const gdouble *r, *m, *b, *dataul, *maskul, *basisul;
+    gint i, j, xres, yres, s;
+    gdouble sum = 0.0;
+
+    /* special cases */
+    if (!width || !height)
+        return sum;
+
+    xres = dfield->xres;
+    yres = dfield->yres;
+    dataul = dfield->data + xres*row + col;
+
+    if (mask) {
+        maskul = mask->data + xres*row + col;
+        if (!basis) {
+            /* Inside */
+            for (i = 0; i < height-1; i++) {
+                r = dataul + xres*i;
+                m = maskul + xres*i;
+                for (j = 0; j < width-1; j++)
+                    sum += square_volumew(r[j], r[j+1],
+                                          r[j+xres+1], r[j+xres],
+                                          m[j] > 0.0, m[j+1] > 0.0,
+                                          m[j+xres+1] > 0.0, m[j+xres] > 0.0);
+            }
+
+            /* Top row */
+            s = !(row == 0);
+            sum += stripe_volume(width, 1, dataul, dataul - s*xres, maskul);
+
+            /* Bottom row */
+            s = !(row + height == yres);
+            sum += stripe_volume(width, 1,
+                                 dataul + xres*(height-1),
+                                 dataul + xres*(height-1 + s),
+                                 maskul + xres*(height-1));
+
+            /* Left column */
+            s = !(col == 0);
+            sum += stripe_volume(height, xres, dataul, dataul - s, maskul);
+
+            /* Right column */
+            s = !(col + width == xres);
+            sum += stripe_volume(height, xres,
+                                 dataul + width-1, dataul + width-1 + s,
+                                 maskul + width-1);
+
+            /* Just take the four corner quater-pixels as flat.  */
+            if (maskul[0])
+                sum += dataul[0]/4.0;
+            if (maskul[width-1])
+                sum += dataul[width-1]/4.0;
+            if (maskul[xres*(height-1)])
+                sum += dataul[xres*(height-1)]/4.0;
+            if (maskul[xres*(height-1) + width-1])
+                sum += dataul[xres*(height-1) + width-1]/4.0;
+        }
+        else {
+            basisul = basis->data + xres*row + col;
+
+            /* Inside */
+            for (i = 0; i < height-1; i++) {
+                r = dataul + xres*i;
+                m = maskul + xres*i;
+                b = basisul + xres*i;
+                for (j = 0; j < width-1; j++)
+                    sum += square_volumew(r[j] - b[j],
+                                          r[j+1] - b[j+1],
+                                          r[j+xres+1] - b[j+xres+1],
+                                          r[j+xres] - b[j+xres],
+                                          m[j] > 0.0, m[j+1] > 0.0,
+                                          m[j+xres+1] > 0.0, m[j+xres] > 0.0);
+            }
+
+            /* Top row */
+            s = !(row == 0);
+            sum += stripe_volumeb(width, 1,
+                                  dataul, dataul - s*xres,
+                                  basisul, basisul - s*xres,
+                                  maskul);
+
+            /* Bottom row */
+            s = !(row + height == yres);
+            sum += stripe_volumeb(width, 1,
+                                  dataul + xres*(height-1),
+                                  dataul + xres*(height-1 + s),
+                                  basisul + xres*(height-1),
+                                  basisul + xres*(height-1 + s),
+                                  maskul + xres*(height-1));
+
+            /* Left column */
+            s = !(col == 0);
+            sum += stripe_volumeb(height, xres,
+                                  dataul, dataul - s,
+                                  basisul, basisul - s,
+                                  maskul);
+
+            /* Right column */
+            s = !(col + width == xres);
+            sum += stripe_volumeb(height, xres,
+                                  dataul + width-1, dataul + width-1 + s,
+                                  basisul + width-1, basisul + width-1 + s,
+                                  maskul + width-1);
+
+            /* Just take the four corner quater-pixels as flat.  */
+            if (maskul[0])
+                sum += (dataul[0] - basisul[0])/4.0;
+            if (maskul[width-1])
+                sum += (dataul[width-1] - basisul[width-1])/4.0;
+            if (maskul[xres*(height-1)])
+                sum += (dataul[xres*(height-1)] - basisul[xres*(height-1)])/4.0;
+            if (maskul[xres*(height-1) + width-1])
+                sum += (dataul[xres*(height-1) + width-1]
+                        - basisul[xres*(height-1) + width-1])/4.0;
+        }
+    }
+    else {
+        if (!basis) {
+            /* Inside */
+            for (i = 0; i < height-1; i++) {
+                r = dataul + xres*i;
+                for (j = 0; j < width-1; j++)
+                    sum += square_volume(r[j], r[j+1], r[j+xres+1], r[j+xres]);
+            }
+
+            /* Top row */
+            s = !(row == 0);
+            sum += stripe_volume(width, 1, dataul, dataul - s*xres, NULL);
+
+            /* Bottom row */
+            s = !(row + height == yres);
+            sum += stripe_volume(width, 1,
+                                 dataul + xres*(height-1),
+                                 dataul + xres*(height-1 + s),
+                                 NULL);
+
+            /* Left column */
+            s = !(col == 0);
+            sum += stripe_volume(height, xres, dataul, dataul - s, NULL);
+
+            /* Right column */
+            s = !(col + width == xres);
+            sum += stripe_volume(height, xres,
+                                 dataul + width-1, dataul + width-1 + s,
+                                 NULL);
+
+            /* Just take the four corner quater-pixels as flat.  */
+            sum += dataul[0]/4.0;
+            sum += dataul[width-1]/4.0;
+            sum += dataul[xres*(height-1)]/4.0;
+            sum += dataul[xres*(height-1) + width-1]/4.0;
+        }
+        else {
+            basisul = basis->data + xres*row + col;
+
+            /* Inside */
+            for (i = 0; i < height-1; i++) {
+                r = dataul + xres*i;
+                b = basisul + xres*i;
+                for (j = 0; j < width-1; j++)
+                    sum += square_volume(r[j] - b[j],
+                                         r[j+1] - b[j+1],
+                                         r[j+xres+1] - b[j+xres+1],
+                                         r[j+xres] - b[j+xres]);
+            }
+
+            /* Top row */
+            s = !(row == 0);
+            sum += stripe_volumeb(width, 1,
+                                  dataul, dataul - s*xres,
+                                  basisul, basisul - s*xres,
+                                  NULL);
+
+            /* Bottom row */
+            s = !(row + height == yres);
+            sum += stripe_volumeb(width, 1,
+                                  dataul + xres*(height-1),
+                                  dataul + xres*(height-1 + s),
+                                  basisul + xres*(height-1),
+                                  basisul + xres*(height-1 + s),
+                                  NULL);
+
+            /* Left column */
+            s = !(col == 0);
+            sum += stripe_volumeb(height, xres,
+                                  dataul, dataul - s,
+                                  basisul, basisul - s,
+                                  NULL);
+
+            /* Right column */
+            s = !(col + width == xres);
+            sum += stripe_volumeb(height, xres,
+                                  dataul + width-1, dataul + width-1 + s,
+                                  basisul + width-1, basisul + width-1 + s,
+                                  NULL);
+
+            /* Just take the four corner quater-pixels as flat.  */
+            sum += (dataul[0] - basisul[0])/4.0;
+            sum += (dataul[width-1] - basisul[width-1])/4.0;
+            sum += (dataul[xres*(height-1)] - basisul[xres*(height-1)])/4.0;
+            sum += (dataul[xres*(height-1) + width-1]
+                    - basisul[xres*(height-1) + width-1])/4.0;
+        }
+    }
+
+    return sum* dfield->xreal/dfield->xres * dfield->yreal/dfield->yres;
+}
+
+/* Don't define gwy_data_field_get_volume() without mask and basis, it would
+ * just be a complicate way to calculate gwy_data_field_get_sum() */
+
+/**
+ * gwy_data_field_area_get_volume:
+ * @data_field: A data field.
+ * @basis: The basis or background for volume calculation if not %NULL.
+ *         The height of each vertex is then the difference between
+ *         @data_field value and @basis value.  Value %NULL is the same
+ *         as passing all zeroes for the basis.
+ * @mask: Mask specifying which values to take into account/exclude, or %NULL.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ *
+ * Computes volume of a rectangular part of a data field.
+ *
+ * Returns: The volume.
+ *
+ * Since: 2.3
+ **/
+gdouble
+gwy_data_field_area_get_volume(GwyDataField *data_field,
+                               GwyDataField *basis,
+                               GwyDataField *mask,
+                               gint col, gint row,
+                               gint width, gint height)
+{
+    gdouble vol = 0.0;
+
+    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), vol);
+    g_return_val_if_fail(!basis || (GWY_IS_DATA_FIELD(basis)
+                                    && basis->xres == data_field->xres
+                                    && basis->yres == data_field->yres), vol);
+    g_return_val_if_fail(!mask || (GWY_IS_DATA_FIELD(mask)
+                                   && mask->xres == data_field->xres
+                                   && mask->yres == data_field->yres), vol);
+    g_return_val_if_fail(col >= 0 && row >= 0
+                         && width >= 0 && height >= 0
+                         && col + width <= data_field->xres
+                         && row + height <= data_field->yres,
+                         vol);
+
+    return calculate_volume(data_field, basis, mask, col, row, width, height);
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/libprocess/stats.c b/libprocess/stats.c
index 2530dba..9a00bb1 100644
--- a/libprocess/stats.c
+++ b/libprocess/stats.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: stats.c 19216 2016-11-09 10:39:06Z yeti-dn $
- *  Copyright (C) 2003-2009 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: stats.c 19788 2017-05-22 12:59:28Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -19,13 +19,7 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-#include "config.h"
 #include <string.h>
-
-#ifdef HAVE_FFTW3
-#include <fftw3.h>
-#endif
-
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
 #include <libprocess/datafield.h>
@@ -33,66 +27,10 @@
 #include <libprocess/stats.h>
 #include <libprocess/linestats.h>
 #include <libprocess/grains.h>
-#include <libprocess/inttrans.h>
-#include <libprocess/simplefft.h>
 #include "gwyprocessinternal.h"
-#include "wrappers.h"
 
 typedef gdouble (*LineStatFunc)(GwyDataLine *dline);
 
-typedef struct _BinTreeNode BinTreeNode;
-typedef struct _QuadTreeNode QuadTreeNode;
-
-struct _BinTreeNode {
-    /* This optimally uses memory on 64bit architectures where pt and
-     * children have the same size (16 bytes). */
-    union {
-        /* The at most two points inside for non-max-depth leaves. */
-        struct {
-            gdouble a;
-            gdouble b;
-        } pt;
-        /* Children for non-max-depth non-leaves. */
-        BinTreeNode *children[2];
-    } u;
-    /* Always set; for max-depth leaves it is the only meaningful field. */
-    guint count;
-};
-
-typedef struct {
-    gdouble min;
-    gdouble max;
-    BinTreeNode *root;
-    guint maxdepth;
-    gboolean degenerate;
-    gdouble degenerateS;
-} BinTree;
-
-struct _QuadTreeNode {
-    /* This optimally uses memory on 64bit architectures where pt and
-     * children have the same size (32 bytes). */
-    union {
-        /* The at most two points inside for non-max-depth leaves. */
-        struct {
-            GwyXY a;
-            GwyXY b;
-        } pt;
-        /* Children for non-max-depth non-leaves. */
-        QuadTreeNode *children[4];
-    } u;
-    /* Always set; for max-depth leaves it is the only meaningful field. */
-    guint count;
-};
-
-typedef struct {
-    GwyXY min;
-    GwyXY max;
-    QuadTreeNode *root;
-    guint maxdepth;
-    gboolean degenerate;
-    gdouble degenerateS;
-} QuadTree;
-
 /**
  * gwy_data_field_get_max:
  * @data_field: A data field.
@@ -522,22 +460,6 @@ gwy_data_field_area_get_min_max_mask(GwyDataField *data_field,
     *max = max1;
 }
 
-void
-_gwy_data_field_get_min_max(GwyDataField *field,
-                            GwyDataField *mask,
-                            GwyMaskingType mode,
-                            const GwyFieldPart *fpart,
-                            G_GNUC_UNUSED gpointer params,
-                            gdouble *results)
-{
-    gwy_data_field_area_get_min_max_mask(field, mask, mode,
-                                         fpart ? fpart->col : 0,
-                                         fpart ? fpart->row : 0,
-                                         fpart ? fpart->width : field->xres,
-                                         fpart ? fpart->height : field->yres,
-                                         results, results + 1);
-}
-
 /**
  * gwy_data_field_get_sum:
  * @data_field: A data field.
@@ -1379,7 +1301,7 @@ gwy_data_field_area_get_stats_mask(GwyDataField *dfield,
 /**
  * gwy_data_field_area_count_in_range:
  * @data_field: A data field.
- * @mask: Mask specifying which values to take into account/exclude, or %NULL.
+ * @mask: Mask specifying which values to take into account, or %NULL.
  * @col: Upper-left column coordinate.
  * @row: Upper-left row coordinate.
  * @width: Area width (number of columns).
@@ -1478,7 +1400,7 @@ gwy_data_field_area_count_in_range(GwyDataField *data_field,
 /**
  * gwy_data_field_area_dh:
  * @data_field: A data field.
- * @mask: Mask specifying which values to take into account/exclude, or %NULL.
+ * @mask: Mask specifying which values to take into account, or %NULL.
  * @target_line: A data line to store the distribution to.  It will be
  *               resampled to requested width.
  * @col: Upper-left column coordinate.
@@ -1501,25 +1423,28 @@ gwy_data_field_area_dh(GwyDataField *data_field,
     GwySIUnit *fieldunit, *lineunit, *rhounit;
     gdouble min, max;
     const gdouble *drow, *mrow;
-    gint i, j, k;
+    gint xres, yres, i, j;
+    guint *counts;
     guint nn;
 
     g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    xres = data_field->xres;
+    yres = data_field->yres;
     g_return_if_fail(!mask || (GWY_IS_DATA_FIELD(mask)
-                               && mask->xres == data_field->xres
-                               && mask->yres == data_field->yres));
+                               && mask->xres == xres
+                               && mask->yres == yres));
     g_return_if_fail(GWY_IS_DATA_LINE(target_line));
     g_return_if_fail(col >= 0 && row >= 0
                      && width >= 1 && height >= 1
-                     && col + width <= data_field->xres
-                     && row + height <= data_field->yres);
+                     && col + width <= xres
+                     && row + height <= yres);
 
     if (mask) {
         nn = 0;
         for (i = 0; i < height; i++) {
-            mrow = mask->data + (i + row)*mask->xres + col;
+            mrow = mask->data + (i + row)*xres + col;
             for (j = 0; j < width; j++) {
-                if (mrow[j])
+                if (mrow[j] > 0.0)
                     nn++;
             }
         }
@@ -1533,7 +1458,6 @@ gwy_data_field_area_dh(GwyDataField *data_field,
     }
 
     gwy_data_line_resample(target_line, nstats, GWY_INTERPOLATION_NONE);
-    gwy_data_line_clear(target_line);
     gwy_data_field_area_get_min_max(data_field, nn ? mask : NULL,
                                     col, row, width, height,
                                     &min, &max);
@@ -1546,7 +1470,13 @@ gwy_data_field_area_dh(GwyDataField *data_field,
     gwy_si_unit_power(lineunit, -1, rhounit);
 
     /* Handle border cases */
+    if (!nn) {
+        gwy_data_line_clear(target_line);
+        gwy_data_line_set_real(target_line, min ? max : 1.0);
+        return;
+    }
     if (min == max) {
+        gwy_data_line_clear(target_line);
         gwy_data_line_set_real(target_line, min ? max : 1.0);
         target_line->data[0] = nstats/gwy_data_line_get_real(target_line);
         return;
@@ -1555,42 +1485,33 @@ gwy_data_field_area_dh(GwyDataField *data_field,
     /* Calculate height distribution */
     gwy_data_line_set_real(target_line, max - min);
     gwy_data_line_set_offset(target_line, min);
+    counts = g_new(guint, nstats);
+
     if (mask) {
+        gdouble *values = g_new(gdouble, nn);
+
+        nn = 0;
         for (i = 0; i < height; i++) {
-            drow = data_field->data + (i + row)*data_field->xres + col;
-            mrow = mask->data + (i + row)*mask->xres + col;
+            drow = data_field->data + (i + row)*xres + col;
+            mrow = mask->data + (i + row)*xres + col;
 
             for (j = 0; j < width; j++) {
-                if (mrow[j]) {
-                    k = (gint)((drow[j] - min)/(max - min)*nstats);
-                    /* Fix rounding errors */
-                    if (G_UNLIKELY(k >= nstats))
-                        k = nstats-1;
-                    else if (G_UNLIKELY(k < 0))
-                        k = 0;
-
-                    target_line->data[k] += 1;
-                }
+                if (mrow[j] > 0.0)
+                    values[nn++] = drow[j];
             }
         }
+        nn = gwy_math_histogram(values, nn, min, max, nstats, counts);
+        g_free(values);
     }
     else {
-        for (i = 0; i < height; i++) {
-            drow = data_field->data + (i + row)*data_field->xres + col;
-
-            for (j = 0; j < width; j++) {
-                k = (gint)((drow[j] - min)/(max - min)*nstats);
-                /* Fix rounding errors */
-                if (G_UNLIKELY(k >= nstats))
-                    k = nstats-1;
-                else if (G_UNLIKELY(k < 0))
-                    k = 0;
-
-                target_line->data[k] += 1;
-            }
-        }
+        nn = gwy_math_histogram(data_field->data, nn,
+                                min, max, nstats, counts);
     }
 
+    for (i = 0; i < nstats; i++)
+        target_line->data[i] = counts[i];
+    g_free(counts);
+
     /* Normalize integral to 1 */
     gwy_data_line_multiply(target_line, nstats/(max - min)/MAX(nn, 1));
 }
@@ -1619,7 +1540,7 @@ gwy_data_field_dh(GwyDataField *data_field,
 /**
  * gwy_data_field_area_cdh:
  * @data_field: A data field.
- * @mask: Mask specifying which values to take into account/exclude, or %NULL.
+ * @mask: Mask specifying which values to take into account, or %NULL.
  * @target_line: A data line to store the distribution to.  It will be
  *               resampled to requested width.
  * @col: Upper-left column coordinate.
@@ -1647,6 +1568,7 @@ gwy_data_field_area_cdh(GwyDataField *data_field,
                            nstats);
     gwy_data_line_cumulate(target_line);
     gwy_data_line_multiply(target_line, gwy_data_line_itor(target_line, 1));
+    target_line->data[target_line->res-1] = 1.0;   /* Fix rounding errors. */
 
     /* Update units after integration */
     lineunit = gwy_data_line_get_si_unit_x(target_line);
@@ -1676,8 +1598,9 @@ gwy_data_field_cdh(GwyDataField *data_field,
 }
 
 /**
- * gwy_data_field_area_da:
+ * gwy_data_field_area_da_mask:
  * @data_field: A data field.
+ * @mask: Mask specifying which values to take into account, or %NULL.
  * @target_line: A data line to store the distribution to.  It will be
  *               resampled to requested width.
  * @col: Upper-left column coordinate.
@@ -1688,96 +1611,153 @@ gwy_data_field_cdh(GwyDataField *data_field,
  * @nstats: The number of samples to take on the distribution function.  If
  *          nonpositive, a suitable resolution is determined automatically.
  *
- * Calculates distribution of slopes in a rectangular part of data field.
+ * Calculates distribution of slopes in a rectangular part of data field, with
+ * masking.
+ *
+ * Since: 2.49
  **/
 void
-gwy_data_field_area_da(GwyDataField *data_field,
-                       GwyDataLine *target_line,
-                       gint col, gint row,
-                       gint width, gint height,
-                       GwyOrientation orientation,
-                       gint nstats)
+gwy_data_field_area_da_mask(GwyDataField *data_field,
+                            GwyDataField *mask,
+                            GwyDataLine *target_line,
+                            gint col, gint row,
+                            gint width, gint height,
+                            GwyOrientation orientation,
+                            gint nstats)
 {
     GwySIUnit *lineunit, *rhounit;
-    GwyDataField *der;
-    const gdouble *drow;
-    gdouble *derrow;
-    gdouble q;
-    gint xres, yres, i, j, size;
+    const gdouble *drow, *mrow;
+    gdouble *values;
+    guint *counts;
+    gdouble min, max, q;
+    gint xres, yres, i, j, nn;
 
     g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
     xres = data_field->xres;
     yres = data_field->yres;
-    size = (orientation == GWY_ORIENTATION_HORIZONTAL) ? width : height;
     g_return_if_fail(col >= 0 && row >= 0
                      && width >= 1 && height >= 1
-                     && size >= 2
                      && col + width <= xres
                      && row + height <= yres);
+    g_return_if_fail(!mask || (GWY_IS_DATA_FIELD(mask)
+                               && mask->xres == xres
+                               && mask->yres == yres));
+    g_return_if_fail(GWY_IS_DATA_LINE(target_line));
 
-    /* Create a temporary data field from horizontal/vertical derivations
-     * and then simply use gwy_data_field_dh().
-     * XXX: Should not such a thing exist as a public method? */
-    der = gwy_data_field_new(width, height,
-                             data_field->xreal*width/xres,
-                             data_field->yreal*height/yres,
-                             FALSE);
+    if (mask) {
+        nn = 0;
+        if (orientation == GWY_ORIENTATION_VERTICAL) {
+            for (i = 0; i < height-1; i++) {
+                mrow = mask->data + (i + row)*xres + col;
+                for (j = 0; j < width; j++) {
+                    if (mrow[j] > 0.0 && mrow[j+xres] > 0.0)
+                        nn++;
+                }
+            }
+        }
+        else {
+            for (i = 0; i < height; i++) {
+                mrow = mask->data + (i + row)*xres + col;
+                for (j = 0; j < width-1; j++) {
+                    if (mrow[j] > 0.0 && mrow[j+1] > 0.0)
+                        nn++;
+                }
+            }
+        }
+    }
+    else {
+        if (orientation == GWY_ORIENTATION_VERTICAL)
+            nn = width*(height - 1);
+        else
+            nn = (width - 1)*height;
+    }
 
-    switch (orientation) {
-        case GWY_ORIENTATION_HORIZONTAL:
-        q = xres/data_field->xreal;
-        /* Instead of testing border columns in each gwy_data_field_get_xder()
-         * call, special-case them explicitely */
-        for (i = 0; i < height; i++) {
-            drow = data_field->data + (i + row)*xres + col;
-            derrow = der->data + i*width;
+    if (nstats < 1) {
+        nstats = floor(3.49*cbrt(nn) + 0.5);
+        nstats = MAX(nstats, 2);
+    }
 
-            derrow[0] = drow[1] - drow[0];
-            for (j = 1; j < width-1; j++)
-                derrow[j] = (drow[j+1] - drow[j-1])/2.0;
-            if (width > 1)
-                derrow[j] = drow[width-1] - drow[width-2];
-        }
-        break;
+    gwy_data_line_resample(target_line, nstats, GWY_INTERPOLATION_NONE);
 
-        case GWY_ORIENTATION_VERTICAL:
+    if (orientation == GWY_ORIENTATION_VERTICAL)
         q = yres/data_field->yreal;
-        /* Instead of testing border rows in each gwy_data_field_get_yder()
-         * call, special-case them explicitely */
-        drow = data_field->data + row*xres + col;
-        derrow = der->data;
-        for (j = 0; j < width; j++)
-            derrow[j] = *(drow + j+xres) - *(drow + j);
-
-        for (i = 1; i < height-1; i++) {
-            drow = data_field->data + (i + row)*xres + col;
-            derrow = der->data + i*width;
+    else
+        q = xres/data_field->xreal;
 
-            for (j = 0; j < width; j++)
-                derrow[j] = (*(drow + j+xres) - *(drow + j-xres))/2.0;
+    values = g_new(gdouble, MAX(nn, 1));
+    nn = 0;
+    if (mask) {
+        if (orientation == GWY_ORIENTATION_VERTICAL) {
+            for (i = 0; i < height-1; i++) {
+                mrow = mask->data + (i + row)*xres + col;
+                drow = data_field->data + (i + row)*xres + col;
+                for (j = 0; j < width; j++) {
+                    if (mrow[j] > 0.0 && mrow[j+xres] > 0.0)
+                        values[nn++] = q*(drow[j+xres] - drow[j]);
+                }
+            }
         }
-
-        if (height > 1) {
-            drow = data_field->data + (row + height-1)*xres + col;
-            derrow = der->data + (height-1)*width;
-            for (j = 0; j < width; j++)
-                derrow[j] = *(drow + j) - *(drow + j-xres);
+        else {
+            for (i = 0; i < height; i++) {
+                mrow = mask->data + (i + row)*xres + col;
+                drow = data_field->data + (i + row)*xres + col;
+                for (j = 0; j < width-1; j++) {
+                    if (mrow[j] > 0.0 && mrow[j+1] > 0.0)
+                        values[nn++] = q*(drow[j+1] - drow[j]);
+                }
+            }
         }
-        break;
+    }
+    else {
+        if (orientation == GWY_ORIENTATION_VERTICAL) {
+            for (i = 0; i < height-1; i++) {
+                drow = data_field->data + (i + row)*xres + col;
+                for (j = 0; j < width; j++)
+                    values[nn++] = q*(drow[j+xres] - drow[j]);
+            }
+        }
+        else {
+            for (i = 0; i < height; i++) {
+                drow = data_field->data + (i + row)*xres + col;
+                for (j = 0; j < width-1; j++)
+                    values[nn++] = q*(drow[j+1] - drow[j]);
+            }
+        }
+    }
 
-        default:
-        g_assert_not_reached();
-        break;
+    min = max = values[0];
+    for (i = 1; i < nn; i++) {
+        if (values[i] < min)
+            min = values[i];
+        if (values[i] > max)
+            max = values[i];
+    }
+
+    /* Handle border cases */
+    if (!nn) {
+        gwy_data_line_clear(target_line);
+        gwy_data_line_set_real(target_line, 1.0);
+        gwy_data_line_set_offset(target_line, -0.5);
+        return;
+    }
+    if (min == max) {
+        gwy_data_line_clear(target_line);
+        gwy_data_line_set_real(target_line, min ? max : 1.0);
+        target_line->data[0] = nstats/gwy_data_line_get_real(target_line);
+        return;
     }
 
-    gwy_data_field_dh(der, target_line, nstats);
-    /* Fix derivation normalization.  At the same time we have to multiply
-     * target_line values with inverse factor to keep integral intact */
-    gwy_data_line_set_real(target_line, q*gwy_data_line_get_real(target_line));
-    gwy_data_line_set_offset(target_line,
-                             q*gwy_data_line_get_offset(target_line));
-    gwy_data_line_multiply(target_line, 1.0/q);
-    g_object_unref(der);
+    counts = g_new(guint, nstats);
+    nn = gwy_math_histogram(values, nn, min, max, nstats, counts);
+    g_free(values);
+
+    for (i = 0; i < nstats; i++)
+        target_line->data[i] = counts[i];
+    g_free(counts);
+
+    gwy_data_line_set_real(target_line, max - min);
+    gwy_data_line_set_offset(target_line, min);
+    gwy_data_line_multiply(target_line, nstats/(max - min)/nn);
 
     /* Set proper units */
     lineunit = gwy_data_line_get_si_unit_x(target_line);
@@ -1789,6 +1769,33 @@ gwy_data_field_area_da(GwyDataField *data_field,
 }
 
 /**
+ * gwy_data_field_area_da:
+ * @data_field: A data field.
+ * @target_line: A data line to store the distribution to.  It will be
+ *               resampled to requested width.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ * @orientation: Orientation to compute the slope distribution in.
+ * @nstats: The number of samples to take on the distribution function.  If
+ *          nonpositive, a suitable resolution is determined automatically.
+ *
+ * Calculates distribution of slopes in a rectangular part of data field.
+ **/
+void
+gwy_data_field_area_da(GwyDataField *data_field,
+                       GwyDataLine *target_line,
+                       gint col, gint row,
+                       gint width, gint height,
+                       GwyOrientation orientation,
+                       gint nstats)
+{
+    gwy_data_field_area_da_mask(data_field, NULL, target_line,
+                                col, row, width, height, orientation, nstats);
+}
+
+/**
  * gwy_data_field_da:
  * @data_field: A data field.
  * @target_line: A data line to store the distribution to.  It will be
@@ -1805,7 +1812,6 @@ gwy_data_field_da(GwyDataField *data_field,
                   GwyOrientation orientation,
                   gint nstats)
 {
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
     gwy_data_field_area_da(data_field, target_line,
                            0, 0, data_field->xres, data_field->yres,
                            orientation, nstats);
@@ -1835,13 +1841,45 @@ gwy_data_field_area_cda(GwyDataField *data_field,
                         GwyOrientation orientation,
                         gint nstats)
 {
+    gwy_data_field_area_cda_mask(data_field, NULL, target_line,
+                                 col, row, width, height, orientation, nstats);
+}
+
+/**
+ * gwy_data_field_area_cda_mask:
+ * @data_field: A data field.
+ * @target_line: A data line to store the distribution to.  It will be
+ *               resampled to requested width.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ * @orientation: Orientation to compute the slope distribution in.
+ * @nstats: The number of samples to take on the distribution function.  If
+ *          nonpositive, a suitable resolution is determined automatically.
+ *
+ * Calculates cumulative distribution of slopes in a rectangular part of data
+ * field, with masking.
+ *
+ * Since: 2.49
+ **/
+void
+gwy_data_field_area_cda_mask(GwyDataField *data_field,
+                             GwyDataField *mask,
+                             GwyDataLine *target_line,
+                             gint col, gint row,
+                             gint width, gint height,
+                             GwyOrientation orientation,
+                             gint nstats)
+{
     GwySIUnit *lineunit, *rhounit;
 
-    gwy_data_field_area_da(data_field, target_line,
-                           col, row, width, height,
-                           orientation, nstats);
+    gwy_data_field_area_da_mask(data_field, mask, target_line,
+                                col, row, width, height,
+                                orientation, nstats);
     gwy_data_line_cumulate(target_line);
     gwy_data_line_multiply(target_line, gwy_data_line_itor(target_line, 1));
+    target_line->data[target_line->res-1] = 1.0;   /* Fix rounding errors. */
 
     /* Update units after integration */
     lineunit = gwy_data_line_get_si_unit_x(target_line);
@@ -1872,233 +1910,8 @@ gwy_data_field_cda(GwyDataField *data_field,
                             orientation, nstats);
 }
 
-#ifdef HAVE_FFTW3
-typedef void (*GwyFFTAreaFunc)(fftw_plan plan,
-                               GwyDataLine *din,
-                               GwyDataLine *dout,
-                               GwyDataLine *target_line);
-
-static inline void
-do_fft_acf(fftw_plan plan,
-           GwyDataLine *din,
-           GwyDataLine *dout,
-           GwyDataLine *target_line)
-{
-    gdouble *in, *out;
-    gint j, width, res;
-
-    width = target_line->res;
-    res = din->res;
-    in = din->data;
-    out = dout->data;
-
-    gwy_clear(in + width, res - width);
-
-    fftw_execute(plan);
-    in[0] = out[0]*out[0];
-    for (j = 1; j < (res + 1)/2; j++)
-        in[j] = in[res-j] = out[j]*out[j] + out[res-j]*out[res-j];
-    if (!(res % 2))
-        in[res/2] = out[res/2]*out[res/2];
-
-    fftw_execute(plan);
-    for (j = 0; j < width; j++)
-        target_line->data[j] += out[j]/(width - j);
-}
-
-static inline void
-do_fft_hhcf(fftw_plan plan,
-            GwyDataLine *din,
-            GwyDataLine *dout,
-            GwyDataLine *target_line)
-{
-    gdouble *in, *out;
-    gdouble sum;
-    gint j, width, res;
-
-    width = target_line->res;
-    res = din->res;
-    in = din->data;
-    out = dout->data;
-
-    sum = 0.0;
-    for (j = 0; j < width; j++) {
-        sum += in[j]*in[j] + in[width-1-j]*in[width-1-j];
-        target_line->data[width-1-j] += sum*res/(j+1);
-    }
-
-    gwy_clear(in + width, res - width);
-
-    fftw_execute(plan);
-    in[0] = out[0]*out[0];
-    for (j = 1; j < (res + 1)/2; j++)
-        in[j] = in[res-j] = out[j]*out[j] + out[res-j]*out[res-j];
-    if (!(res % 2))
-        in[res/2] = out[res/2]*out[res/2];
-
-    fftw_execute(plan);
-    for (j = 0; j < width; j++)
-        target_line->data[j] -= 2*out[j]/(width - j);
-}
-
-static void
-gwy_data_field_area_func_fft(GwyDataField *data_field,
-                             GwyDataLine *target_line,
-                             GwyFFTAreaFunc func,
-                             gint col, gint row,
-                             gint width, gint height,
-                             GwyOrientation orientation,
-                             GwyInterpolationType interpolation,
-                             gint nstats)
-{
-    GwyDataLine *din, *dout;
-    fftw_plan plan;
-    gdouble *in, *out, *drow, *dcol;
-    gint i, j, xres, yres, res = 0;
-    gdouble avg;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(GWY_IS_DATA_LINE(target_line));
-    xres = data_field->xres;
-    yres = data_field->yres;
-    g_return_if_fail(col >= 0 && row >= 0
-                     && width >= 1 && height >= 1
-                     && col + width <= xres
-                     && row + height <= yres);
-    g_return_if_fail(orientation == GWY_ORIENTATION_HORIZONTAL
-                     || orientation == GWY_ORIENTATION_VERTICAL);
-
-    switch (orientation) {
-        case GWY_ORIENTATION_HORIZONTAL:
-        res = gwy_fft_find_nice_size(2*xres);
-        gwy_data_line_resample(target_line, width, GWY_INTERPOLATION_NONE);
-        break;
-
-        case GWY_ORIENTATION_VERTICAL:
-        res = gwy_fft_find_nice_size(2*yres);
-        gwy_data_line_resample(target_line, height, GWY_INTERPOLATION_NONE);
-        break;
-    }
-    gwy_data_line_clear(target_line);
-    gwy_data_line_set_offset(target_line, 0.0);
-
-    din = gwy_data_line_new(res, 1.0, FALSE);
-    dout = gwy_data_line_new(res, 1.0, FALSE);
-    in = gwy_data_line_get_data(din);
-    out = gwy_data_line_get_data(dout);
-    plan = fftw_plan_r2r_1d(res, in, out, FFTW_R2HC, _GWY_FFTW_PATIENCE);
-    g_return_if_fail(plan);
-
-    switch (orientation) {
-        case GWY_ORIENTATION_HORIZONTAL:
-        for (i = 0; i < height; i++) {
-            drow = data_field->data + (i + row)*xres + col;
-            avg = gwy_data_field_area_get_avg(data_field, NULL,
-                                              col, row+i, width, 1);
-            for (j = 0; j < width; j++)
-                in[j] = drow[j] - avg;
-            func(plan, din, dout, target_line);
-        }
-        gwy_data_line_set_real(target_line,
-                               gwy_data_field_jtor(data_field, width));
-        gwy_data_line_multiply(target_line, 1.0/(res*height));
-        break;
-
-        case GWY_ORIENTATION_VERTICAL:
-        for (i = 0; i < width; i++) {
-            dcol = data_field->data + row*xres + (i + col);
-            avg = gwy_data_field_area_get_avg(data_field, NULL,
-                                              col+i, row, 1, height);
-            for (j = 0; j < height; j++)
-                in[j] = dcol[j*xres] - avg;
-            func(plan, din, dout, target_line);
-        }
-        gwy_data_line_set_real(target_line,
-                               gwy_data_field_itor(data_field, height));
-        gwy_data_line_multiply(target_line, 1.0/(res*width));
-        break;
-    }
-
-    fftw_destroy_plan(plan);
-    g_object_unref(din);
-    g_object_unref(dout);
-
-    if (nstats > 1)
-        gwy_data_line_resample(target_line, nstats, interpolation);
-}
-#else  /* HAVE_FFTW3 */
-typedef void (*GwyLameAreaFunc)(GwyDataLine *source,
-                                GwyDataLine *target);
-
-static void
-gwy_data_field_area_func_lame(GwyDataField *data_field,
-                              GwyDataLine *target_line,
-                              GwyLameAreaFunc func,
-                              gint col, gint row,
-                              gint width, gint height,
-                              GwyOrientation orientation,
-                              GwyInterpolationType interpolation,
-                              gint nstats)
-{
-    GwyDataLine *data_line, *tmp_line;
-    gint i, j, xres, yres, size;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(GWY_IS_DATA_LINE(target_line));
-    xres = data_field->xres;
-    yres = data_field->yres;
-    g_return_if_fail(col >= 0 && row >= 0
-                     && width >= 1 && height >= 1
-                     && col + width <= xres
-                     && row + height <= yres);
-    g_return_if_fail(orientation == GWY_ORIENTATION_HORIZONTAL
-                     || orientation == GWY_ORIENTATION_VERTICAL);
-
-    size = (orientation == GWY_ORIENTATION_HORIZONTAL) ? width : height;
-    data_line = gwy_data_line_new(size, 1.0, FALSE);
-    tmp_line = gwy_data_line_new(size, 1.0, FALSE);
-    gwy_data_line_resample(target_line, size, GWY_INTERPOLATION_NONE);
-    gwy_data_line_clear(target_line);
-    gwy_data_line_set_offset(target_line, 0.0);
-
-    switch (orientation) {
-        case GWY_ORIENTATION_HORIZONTAL:
-        for (i = 0; i < height; i++) {
-            gwy_data_field_get_row_part(data_field, data_line, row+i,
-                                        col, col+width);
-            func(data_line, tmp_line);
-            for (j = 0; j < width; j++)
-                target_line->data[j] += tmp_line->data[j];
-        }
-        gwy_data_line_set_real(target_line,
-                               gwy_data_field_jtor(data_field, width));
-        gwy_data_line_multiply(target_line, 1.0/height);
-        break;
-
-        case GWY_ORIENTATION_VERTICAL:
-        for (i = 0; i < width; i++) {
-            gwy_data_field_get_column_part(data_field, data_line, col+i,
-                                           row, row+height);
-            func(data_line, tmp_line);
-            for (j = 0; j < height; j++)
-                target_line->data[j] += tmp_line->data[j];
-        }
-        gwy_data_line_set_real(target_line,
-                               gwy_data_field_itor(data_field, height));
-        gwy_data_line_multiply(target_line, 1.0/width);
-        break;
-    }
-
-    g_object_unref(data_line);
-    g_object_unref(tmp_line);
-
-    if (nstats > 1)
-        gwy_data_line_resample(target_line, nstats, interpolation);
-}
-#endif  /* HAVE_FFTW3 */
-
 /**
- * gwy_data_field_area_acf:
+ * gwy_data_field_area_minkowski_volume:
  * @data_field: A data field.
  * @target_line: A data line to store the distribution to.  It will be
  *               resampled to requested width.
@@ -2106,3412 +1919,254 @@ gwy_data_field_area_func_lame(GwyDataField *data_field,
  * @row: Upper-left row coordinate.
  * @width: Area width (number of columns).
  * @height: Area height (number of rows).
- * @orientation: Orientation of lines (ACF is simply averaged over the
- *               other orientation).
- * @interpolation: Interpolation to use when @nstats is given and requires
- *                 resampling.
  * @nstats: The number of samples to take on the distribution function.  If
- *          nonpositive, @width (@height) is used.
- *
- * Calculates one-dimensional autocorrelation function of a rectangular part of
- * a data field.
- **/
-void
-gwy_data_field_area_acf(GwyDataField *data_field,
-                        GwyDataLine *target_line,
-                        gint col, gint row,
-                        gint width, gint height,
-                        GwyOrientation orientation,
-                        GwyInterpolationType interpolation,
-                        gint nstats)
-{
-    GwySIUnit *fieldunit, *lineunit;
-
-#ifdef HAVE_FFTW3
-    gwy_data_field_area_func_fft(data_field, target_line,
-                                 &do_fft_acf,
-                                 col, row, width, height,
-                                 orientation, interpolation, nstats);
-#else
-    gwy_data_field_area_func_lame(data_field, target_line,
-                                  &gwy_data_line_acf,
-                                  col, row, width, height,
-                                  orientation, interpolation, nstats);
-#endif  /* HAVE_FFTW3 */
-
-    /* Set proper units */
-    fieldunit = gwy_data_field_get_si_unit_xy(data_field);
-    lineunit = gwy_data_line_get_si_unit_x(target_line);
-    gwy_serializable_clone(G_OBJECT(fieldunit), G_OBJECT(lineunit));
-    lineunit = gwy_data_line_get_si_unit_y(target_line);
-    gwy_si_unit_power(gwy_data_field_get_si_unit_z(data_field), 2, lineunit);
-}
-
-/**
- * gwy_data_field_acf:
- * @data_field: A data field.
- * @target_line: A data line to store the distribution to.  It will be
- *               resampled to requested width.
- * @orientation: Orientation of lines (ACF is simply averaged over the
- *               other orientation).
- * @interpolation: Interpolation to use when @nstats is given and requires
- *                 resampling.
- * @nstats: The number of samples to take on the distribution function.  If
- *          nonpositive, data field width (height) is used.
- *
- * Calculates one-dimensional autocorrelation function of a data field.
- **/
-void
-gwy_data_field_acf(GwyDataField *data_field,
-                   GwyDataLine *target_line,
-                   GwyOrientation orientation,
-                   GwyInterpolationType interpolation,
-                   gint nstats)
-{
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    gwy_data_field_area_acf(data_field, target_line,
-                            0, 0, data_field->xres, data_field->yres,
-                            orientation, interpolation, nstats);
-}
-
-/**
- * gwy_data_field_area_hhcf:
- * @data_field: A data field.
- * @target_line: A data line to store the distribution to.  It will be
- *               resampled to requested width.
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- * @orientation: Orientation of lines (HHCF is simply averaged over the
- *               other orientation).
- * @interpolation: Interpolation to use when @nstats is given and requires
- *                 resampling.
- * @nstats: The number of samples to take on the distribution function.  If
- *          nonpositive, @width (@height) is used.
- *
- * Calculates one-dimensional autocorrelation function of a rectangular part of
- * a data field.
- **/
-void
-gwy_data_field_area_hhcf(GwyDataField *data_field,
-                         GwyDataLine *target_line,
-                         gint col, gint row,
-                         gint width, gint height,
-                         GwyOrientation orientation,
-                         GwyInterpolationType interpolation,
-                         gint nstats)
-{
-    GwySIUnit *fieldunit, *lineunit;
-
-#ifdef HAVE_FFTW3
-    gwy_data_field_area_func_fft(data_field, target_line, &do_fft_hhcf,
-                                 col, row, width, height,
-                                 orientation, interpolation, nstats);
-#else
-    gwy_data_field_area_func_lame(data_field, target_line,
-                                  &gwy_data_line_hhcf,
-                                  col, row, width, height,
-                                  orientation, interpolation, nstats);
-#endif  /* HAVE_FFTW3 */
-
-    /* Set proper units */
-    fieldunit = gwy_data_field_get_si_unit_xy(data_field);
-    lineunit = gwy_data_line_get_si_unit_x(target_line);
-    gwy_serializable_clone(G_OBJECT(fieldunit), G_OBJECT(lineunit));
-    lineunit = gwy_data_line_get_si_unit_y(target_line);
-    gwy_si_unit_power(gwy_data_field_get_si_unit_z(data_field), 2, lineunit);
-}
-
-/**
- * gwy_data_field_hhcf:
- * @data_field: A data field.
- * @target_line: A data line to store the distribution to.  It will be
- *               resampled to requested width.
- * @orientation: Orientation of lines (HHCF is simply averaged over the
- *               other orientation).
- * @interpolation: Interpolation to use when @nstats is given and requires
- *                 resampling.
- * @nstats: The number of samples to take on the distribution function.  If
- *          nonpositive, data field width (height) is used.
- *
- * Calculates one-dimensional autocorrelation function of a data field.
- **/
-void
-gwy_data_field_hhcf(GwyDataField *data_field,
-                    GwyDataLine *target_line,
-                    GwyOrientation orientation,
-                    GwyInterpolationType interpolation,
-                    gint nstats)
-{
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    gwy_data_field_area_hhcf(data_field, target_line,
-                             0, 0, data_field->xres, data_field->yres,
-                             orientation, interpolation, nstats);
-}
-
-/**
- * gwy_data_field_area_psdf:
- * @data_field: A data field.
- * @target_line: A data line to store the distribution to.  It will be
- *               resampled to requested width.
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- * @orientation: Orientation of lines (PSDF is simply averaged over the
- *               other orientation).
- * @interpolation: Interpolation to use when @nstats is given and requires
- *                 resampling.
- * @windowing: Windowing type to use.
- * @nstats: The number of samples to take on the distribution function.  If
- *          nonpositive, data field width (height) is used.
- *
- * Calculates one-dimensional power spectrum density function of a rectangular
- * part of a data field.
- **/
-void
-gwy_data_field_area_psdf(GwyDataField *data_field,
-                         GwyDataLine *target_line,
-                         gint col, gint row,
-                         gint width, gint height,
-                         GwyOrientation orientation,
-                         GwyInterpolationType interpolation,
-                         GwyWindowingType windowing,
-                         gint nstats)
-{
-    GwyDataField *re_field, *im_field;
-    GwySIUnit *xyunit, *zunit, *lineunit;
-    gdouble *re, *im, *target;
-    gint i, j, xres, yres, size;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(GWY_IS_DATA_LINE(target_line));
-    xres = data_field->xres;
-    yres = data_field->yres;
-    size = (orientation == GWY_ORIENTATION_HORIZONTAL) ? width : height;
-    g_return_if_fail(col >= 0 && row >= 0
-                     && width >= 1 && height >= 1
-                     && size >= 4
-                     && col + width <= xres
-                     && row + height <= yres);
-    g_return_if_fail(orientation == GWY_ORIENTATION_HORIZONTAL
-                     || orientation == GWY_ORIENTATION_VERTICAL);
-
-    if (nstats < 1)
-        nstats = size/2 - 1;
-    gwy_data_line_resample(target_line, size/2, GWY_INTERPOLATION_NONE);
-    gwy_data_line_clear(target_line);
-    gwy_data_line_set_offset(target_line, 0.0);
-
-    re_field = gwy_data_field_new(width, height, 1.0, 1.0, FALSE);
-    im_field = gwy_data_field_new(width, height, 1.0, 1.0, FALSE);
-    target = target_line->data;
-    switch (orientation) {
-        case GWY_ORIENTATION_HORIZONTAL:
-        gwy_data_field_area_1dfft(data_field, NULL, re_field, im_field,
-                                  col, row, width, height,
-                                  orientation,
-                                  windowing,
-                                  GWY_TRANSFORM_DIRECTION_FORWARD,
-                                  interpolation,
-                                  TRUE, 2);
-        re = re_field->data;
-        im = im_field->data;
-        for (i = 0; i < height; i++) {
-            for (j = 0; j < size/2; j++)
-                target[j] += re[i*width + j]*re[i*width + j]
-                             + im[i*width + j]*im[i*width + j];
-        }
-        gwy_data_line_multiply(target_line,
-                               data_field->xreal/xres/(2*G_PI*height));
-        gwy_data_line_set_real(target_line, G_PI*xres/data_field->xreal);
-        break;
-
-        case GWY_ORIENTATION_VERTICAL:
-        gwy_data_field_area_1dfft(data_field, NULL, re_field, im_field,
-                                  col, row, width, height,
-                                  orientation,
-                                  windowing,
-                                  GWY_TRANSFORM_DIRECTION_FORWARD,
-                                  interpolation,
-                                  TRUE, 2);
-        re = re_field->data;
-        im = im_field->data;
-        for (i = 0; i < width; i++) {
-            for (j = 0; j < size/2; j++)
-                target[j] += re[j*width + i]*re[j*width + i]
-                             + im[j*width + i]*im[j*width + i];
-        }
-        gwy_data_line_multiply(target_line,
-                               data_field->yreal/yres/(2*G_PI*width));
-        gwy_data_line_set_real(target_line, G_PI*yres/data_field->yreal);
-        break;
-    }
-
-    gwy_data_line_set_offset(target_line,
-                             target_line->real/target_line->res);
-    gwy_data_line_resize(target_line, 1, target_line->res);
-    gwy_data_line_resample(target_line, nstats, interpolation);
-
-    g_object_unref(re_field);
-    g_object_unref(im_field);
-
-    /* Set proper units */
-    xyunit = gwy_data_field_get_si_unit_xy(data_field);
-    zunit = gwy_data_field_get_si_unit_z(data_field);
-    lineunit = gwy_data_line_get_si_unit_x(target_line);
-    gwy_si_unit_power(xyunit, -1, lineunit);
-    lineunit = gwy_data_line_get_si_unit_y(target_line);
-    gwy_si_unit_power(zunit, 2, lineunit);
-    gwy_si_unit_multiply(lineunit, xyunit, lineunit);
-}
-
-/**
- * gwy_data_field_psdf:
- * @data_field: A data field.
- * @target_line: A data line to store the distribution to.  It will be
- *               resampled to requested width.
- * @orientation: Orientation of lines (PSDF is simply averaged over the
- *               other orientation).
- * @interpolation: Interpolation to use when @nstats is given and requires
- *                 resampling.
- * @windowing: Windowing type to use.
- * @nstats: The number of samples to take on the distribution function.  If
- *          nonpositive, data field width (height) is used.
- *
- * Calculates one-dimensional power spectrum density function of a data field.
- **/
-void
-gwy_data_field_psdf(GwyDataField *data_field,
-                    GwyDataLine *target_line,
-                    GwyOrientation orientation,
-                    GwyInterpolationType interpolation,
-                    GwyWindowingType windowing,
-                    gint nstats)
-{
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    gwy_data_field_area_psdf(data_field, target_line,
-                             0, 0, data_field->xres, data_field->yres,
-                             orientation, interpolation, windowing, nstats);
-}
-
-/**
- * gwy_data_field_area_rpsdf:
- * @data_field: A data field.
- * @target_line: A data line to store the distribution to.  It will be
- *               resampled to requested width.
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- * @interpolation: Interpolation to use when @nstats is given and requires
- *                 resampling.
- * @windowing: Windowing type to use.
- * @nstats: The number of samples to take on the distribution function.  If
- *          nonpositive, data field width (height) is used.
+ *          nonpositive, a suitable resolution is determined automatically.
  *
- * Calculates radial power spectrum density function of a rectangular
- * part of a data field.
+ * Calculates Minkowski volume functional of a rectangular part of a data
+ * field.
  *
- * Since: 2.7
+ * Volume functional is calculated as the number of values above each
+ * threshold value (,white pixels`) divided by the total number of samples
+ * in the area.  Is it's equivalent to 1-CDH.
  **/
 void
-gwy_data_field_area_rpsdf(GwyDataField *data_field,
-                          GwyDataLine *target_line,
-                          gint col, gint row,
-                          gint width, gint height,
-                          GwyInterpolationType interpolation,
-                          GwyWindowingType windowing,
-                          gint nstats)
+gwy_data_field_area_minkowski_volume(GwyDataField *data_field,
+                                     GwyDataLine *target_line,
+                                     gint col, gint row,
+                                     gint width, gint height,
+                                     gint nstats)
 {
-    GwyDataField *re_field, *im_field;
-    GwySIUnit *xyunit, *zunit, *lineunit;
-    gdouble *re, *im;
-    gint i, j, k, xres, yres;
-    gdouble xreal, yreal, r;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(GWY_IS_DATA_LINE(target_line));
-    xres = data_field->xres;
-    yres = data_field->yres;
-    g_return_if_fail(col >= 0 && row >= 0
-                     && width >= 4 && height >= 4
-                     && col + width <= xres
-                     && row + height <= yres);
-    xreal = data_field->xreal;
-    yreal = data_field->yreal;
-
-    re_field = gwy_data_field_new(width, height,
-                                  width*xreal/xres, height*yreal/yres,
-                                  FALSE);
-    im_field = gwy_data_field_new_alike(re_field, FALSE);
-    gwy_data_field_area_2dfft(data_field, NULL, re_field, im_field,
-                              col, row, width, height,
-                              windowing,
-                              GWY_TRANSFORM_DIRECTION_FORWARD,
-                              interpolation,
-                              TRUE, 2);
-    re = re_field->data;
-    im = im_field->data;
-    for (i = 0; i < height; i++) {
-        for (j = 0; j < width; j++) {
-            k = i*width + j;
-            re[k] = re[k]*re[k] + im[k]*im[k];
-        }
-    }
-    g_object_unref(im_field);
-
-    gwy_data_field_fft_postprocess(re_field, TRUE);
-    r = 0.5*MAX(re_field->xreal, re_field->yreal);
-    gwy_data_field_angular_average(re_field, target_line,
-                                   NULL, GWY_MASK_IGNORE,
-                                   0.0, 0.0, r, nstats ? nstats+1 : 0);
-    g_object_unref(re_field);
-    /* Get rid of the zero first element which is bad for logscale. */
-    nstats = target_line->res-1;
-    gwy_data_line_resize(target_line, 1, nstats+1);
-    target_line->off += target_line->real/nstats;
-
-    /* Postprocess does not use angular coordinates, fix that. */
-    target_line->real *= 2.0*G_PI;
-    target_line->off *= 2.0*G_PI;
-    r = xreal*yreal/(2.0*G_PI*width*height) * target_line->real/nstats;
-    for (k = 0; k < nstats; k++)
-        target_line->data[k] *= r*(k + 1);
-
-    /* Set proper value units */
-    xyunit = gwy_data_field_get_si_unit_xy(data_field);
-    zunit = gwy_data_field_get_si_unit_z(data_field);
-    lineunit = gwy_data_line_get_si_unit_x(target_line);
-    gwy_si_unit_power(xyunit, -1, lineunit);
-    lineunit = gwy_data_line_get_si_unit_y(target_line);
-    gwy_si_unit_power(zunit, 2, lineunit);
-    gwy_si_unit_multiply(lineunit, xyunit, lineunit);
+    gwy_data_field_area_cdh(data_field, NULL, target_line,
+                            col, row, width, height,
+                            nstats);
+    gwy_data_line_multiply(target_line, -1.0);
+    gwy_data_line_add(target_line, 1.0);
 }
 
 /**
- * gwy_data_field_rpsdf:
+ * gwy_data_field_minkowski_volume:
  * @data_field: A data field.
  * @target_line: A data line to store the distribution to.  It will be
  *               resampled to requested width.
- * @interpolation: Interpolation to use when @nstats is given and requires
- *                 resampling.
- * @windowing: Windowing type to use.
  * @nstats: The number of samples to take on the distribution function.  If
- *          nonpositive, data field width (height) is used.
- *
- * Calculates radial power spectrum density function of a data field.
- *
- * Since: 2.7
- **/
-void
-gwy_data_field_rpsdf(GwyDataField *data_field,
-                     GwyDataLine *target_line,
-                     GwyInterpolationType interpolation,
-                     GwyWindowingType windowing,
-                     gint nstats)
-{
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    gwy_data_field_area_rpsdf(data_field, target_line,
-                              0, 0, data_field->xres, data_field->yres,
-                              interpolation, windowing, nstats);
-}
-
-/**
- * gwy_data_field_area_racf:
- * @data_field: A data field.
- * @target_line: A data line to store the autocorrelation function to.  It
- *               will be resampled to requested width.
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- * @nstats: The number of samples to take on the autocorrelation function.  If
- *          nonpositive, a suitable resolution is chosen automatically.
- *
- * Calculates radially averaged autocorrelation function of a rectangular part
- * of a data field.
- *
- * Since: 2.22
- **/
-void
-gwy_data_field_area_racf(GwyDataField *data_field,
-                         GwyDataLine *target_line,
-                         gint col, gint row,
-                         gint width, gint height,
-                         gint nstats)
-{
-    GwyDataField *acf_field;
-    gint xres, yres, size;
-    gdouble r;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(GWY_IS_DATA_LINE(target_line));
-    xres = data_field->xres;
-    yres = data_field->yres;
-    g_return_if_fail(col >= 0 && row >= 0
-                     && width >= 4 && height >= 4
-                     && col + width <= xres
-                     && row + height <= yres);
-
-    size = MIN(width, height)/2;
-    if (nstats < 1)
-        nstats = size;
-
-    acf_field = gwy_data_field_new(2*size - 1, 2*size - 1, 1.0, 1.0, FALSE);
-    gwy_data_field_area_2dacf(data_field, acf_field,
-                              col, row, width, height, size, size);
-    r = 0.5*MAX(acf_field->xreal, acf_field->yreal);
-    gwy_data_field_angular_average(acf_field, target_line,
-                                   NULL, GWY_MASK_IGNORE,
-                                   0.0, 0.0, r, nstats);
-    g_object_unref(acf_field);
-}
-
-/**
- * gwy_data_field_racf:
- * @data_field: A data field.
- * @target_line: A data line to store the autocorrelation function to.  It
- *               will be resampled to requested width.
- * @nstats: The number of samples to take on the autocorrelation function.  If
- *          nonpositive, a suitable resolution is chosen automatically.
- *
- * Calculates radially averaged autocorrelation function of a data field.
- *
- * Since: 2.22
- **/
-void
-gwy_data_field_racf(GwyDataField *data_field,
-                    GwyDataLine *target_line,
-                    gint nstats)
-{
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    gwy_data_field_area_racf(data_field, target_line,
-                             0, 0, data_field->xres, data_field->yres,
-                             nstats);
-}
-
-/**
- * gwy_data_field_area_2dacf:
- * @data_field: A data field.
- * @target_field: A data field to store the result to.  It will be resampled
- *                to (2 at xrange-1)x(2 at yrange-1).
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- * @xrange: Horizontal correlation range.  Non-positive value means
- *          the default range of half of @data_field width will be used.
- * @yrange: Vertical correlation range.  Non-positive value means
- *          the default range of half of @data_field height will be used.
- *
- * Calculates two-dimensional autocorrelation function of a data field area.
- *
- * The resulting data field has the correlation corresponding to (0,0) in the
- * centre.
- *
- * The maximum possible values of @xrange and @yrange are @data_field
- * width and height, respectively.  However, as the values for longer
- * distances are calculated from smaller number of data points they become
- * increasingly bogus, therefore the default range is half of the size.
- *
- * Since: 2.7
- **/
-void
-gwy_data_field_area_2dacf(GwyDataField *data_field,
-                          GwyDataField *target_field,
-                          gint col, gint row,
-                          gint width, gint height,
-                          gint xrange, gint yrange)
-{
-#ifdef HAVE_FFTW3
-    fftw_plan plan;
-#endif
-    GwyDataField *re_in, *re_out, *im_out, *ibuf;
-    GwySIUnit *xyunit, *zunit, *unit;
-    gdouble *src, *dst, *dstm;
-    gint i, j, xres, yres, xsize, ysize;
-    gdouble xreal, yreal, v, q;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(GWY_IS_DATA_FIELD(target_field));
-    xres = data_field->xres;
-    yres = data_field->yres;
-    g_return_if_fail(col >= 0 && row >= 0
-                     && width >= 4 && height >= 4
-                     && col + width <= xres
-                     && row + height <= yres);
-    if (xrange <= 0)
-        xrange = width/2;
-    if (yrange <= 0)
-        yrange = height/2;
-    g_return_if_fail(xrange <= width && yrange <= height);
-    xreal = data_field->xreal;
-    yreal = data_field->yreal;
-
-    xsize = gwy_fft_find_nice_size(width + xrange);
-    ysize = gwy_fft_find_nice_size(height + yrange);
-
-    re_in = gwy_data_field_new(xsize, height, 1.0, 1.0, TRUE);
-    re_out = gwy_data_field_new_alike(re_in, FALSE);
-    im_out = gwy_data_field_new_alike(re_in, FALSE);
-    ibuf = gwy_data_field_new_alike(re_in, FALSE);
-
-    /* Stage 1: Row-wise FFT, with zero-padded columns.
-     * No need to transform the padding rows as zero rises from zeroes. */
-    gwy_data_field_area_copy(data_field, re_in, col, row, width, height, 0, 0);
-    gwy_data_field_1dfft_raw(re_in, NULL, re_out, im_out,
-                             GWY_ORIENTATION_HORIZONTAL,
-                             GWY_TRANSFORM_DIRECTION_FORWARD);
-
-    /* Stage 2: Column-wise FFT, taking the norm and another column-wise FTT.
-     * We take the advantage of the fact that the order of the row- and
-     * column-wise transforms is arbitrary and that taking the norm is a
-     * local operation. */
-    /* Use interleaved arrays, this enables us to foist them as `complex'
-     * to FFTW. */
-    src = g_new(gdouble, 4*ysize);
-    dst = src + 2*ysize;
-#ifdef HAVE_FFTW3
-    q = sqrt(xsize)/ysize;
-    plan = fftw_plan_dft_1d(ysize, (fftw_complex*)src, (fftw_complex*)dst,
-                            FFTW_FORWARD, _GWY_FFTW_PATIENCE);
-#else
-    q = sqrt(xsize*ysize);
-#endif
-    for (j = 0; j < xsize; j++) {
-        for (i = 0; i < height; i++) {
-            src[2*i + 0] = re_out->data[i*xsize + j];
-            src[2*i + 1] = im_out->data[i*xsize + j];
-        }
-        gwy_clear(src + 2*height, 2*(ysize - height));
-#ifdef HAVE_FFTW3
-        fftw_execute(plan);
-#else
-        gwy_fft_simple(GWY_TRANSFORM_DIRECTION_FORWARD, ysize,
-                       2, src, src + 1,
-                       2, dst, dst + 1);
-#endif
-        for (i = 0; i < ysize; i++) {
-            src[2*i] = dst[2*i]*dst[2*i] + dst[2*i + 1]*dst[2*i + 1];
-            src[2*i + 1] = 0.0;
-        }
-#ifdef HAVE_FFTW3
-        fftw_execute(plan);
-#else
-        gwy_fft_simple(GWY_TRANSFORM_DIRECTION_FORWARD, ysize,
-                       2, src, src + 1,
-                       2, dst, dst + 1);
-#endif
-        for (i = 0; i < height; i++) {
-            re_in->data[i*xsize + j] = dst[2*i + 0];
-            ibuf->data[i*xsize + j]  = dst[2*i + 1];
-        }
-    }
-#ifdef HAVE_FFTW3
-    fftw_destroy_plan(plan);
-#endif
-    g_free(src);
-
-    /* Stage 3: The final row-wise FFT. */
-    gwy_data_field_1dfft_raw(re_in, ibuf, re_out, im_out,
-                             GWY_ORIENTATION_HORIZONTAL,
-                             GWY_TRANSFORM_DIRECTION_FORWARD);
-
-    g_object_unref(ibuf);
-    g_object_unref(re_in);
-    g_object_unref(im_out);
-
-    gwy_data_field_resample(target_field, 2*xrange - 1, 2*yrange - 1,
-                            GWY_INTERPOLATION_NONE);
-    /* Extract the correlation data and reshuflle it to human-undestandable
-     * positions with 0.0 at the centre. */
-    for (i = 0; i < yrange; i++) {
-        src = re_out->data + i*xsize;
-        dst = target_field->data + (yrange-1 + i)*target_field->xres;
-        dstm = target_field->data + (yrange-1 - i)*target_field->xres;
-        for (j = 0; j < xrange; j++) {
-            if (j > 0) {
-                v = q*src[xsize - j]/(height - i)/(width - j);
-                if (i > 0)
-                    dstm[xrange-1 + j] = v;
-                dst[xrange-1 - j] = v;
-            }
-            v = q*src[j]/(height - i)/(width - j);
-            if (i > 0)
-                dstm[xrange-1 - j] = v;
-            dst[xrange-1 + j] = v;
-        }
-    }
-    g_object_unref(re_out);
-
-    target_field->xreal = xreal*target_field->xres/xres;
-    target_field->yreal = yreal*target_field->yres/yres;
-    target_field->xoff = -0.5*target_field->xreal;
-    target_field->yoff = -0.5*target_field->yreal;
-
-    xyunit = gwy_data_field_get_si_unit_xy(data_field);
-    zunit = gwy_data_field_get_si_unit_z(data_field);
-    unit = gwy_data_field_get_si_unit_xy(target_field);
-    gwy_serializable_clone(G_OBJECT(xyunit), G_OBJECT(unit));
-    unit = gwy_data_field_get_si_unit_z(target_field);
-    gwy_si_unit_power(zunit, 2, unit);
-
-    gwy_data_field_invalidate(target_field);
-}
-
-/**
- * gwy_data_field_2dacf:
- * @data_field: A data field.
- * @target_field: A data field to store the result to.
- *
- * Calculates two-dimensional autocorrelation function of a data field.
+ *          nonpositive, a suitable resolution is determined automatically.
  *
- * See gwy_data_field_area_2dacf() for details.  Parameters missing (not
- * adjustable) in this function are set to their default values.
+ * Calculates Minkowski volume functional of a data field.
  *
- * Since: 2.7
- **/
-void
-gwy_data_field_2dacf(GwyDataField *data_field,
-                     GwyDataField *target_field)
-{
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-
-    gwy_data_field_area_2dacf(data_field, target_field,
-                              0, 0, data_field->xres, data_field->yres, 0, 0);
-}
-
-/**
- * gwy_data_field_area_minkowski_volume:
- * @data_field: A data field.
- * @target_line: A data line to store the distribution to.  It will be
- *               resampled to requested width.
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- * @nstats: The number of samples to take on the distribution function.  If
- *          nonpositive, a suitable resolution is determined automatically.
- *
- * Calculates Minkowski volume functional of a rectangular part of a data
- * field.
- *
- * Volume functional is calculated as the number of values above each
- * threshold value (,white pixels`) divided by the total number of samples
- * in the area.  Is it's equivalent to 1-CDH.
- **/
-void
-gwy_data_field_area_minkowski_volume(GwyDataField *data_field,
-                                     GwyDataLine *target_line,
-                                     gint col, gint row,
-                                     gint width, gint height,
-                                     gint nstats)
-{
-    gwy_data_field_area_cdh(data_field, NULL, target_line,
-                            col, row, width, height,
-                            nstats);
-    gwy_data_line_multiply(target_line, -1.0);
-    gwy_data_line_add(target_line, 1.0);
-}
-
-/**
- * gwy_data_field_minkowski_volume:
- * @data_field: A data field.
- * @target_line: A data line to store the distribution to.  It will be
- *               resampled to requested width.
- * @nstats: The number of samples to take on the distribution function.  If
- *          nonpositive, a suitable resolution is determined automatically.
- *
- * Calculates Minkowski volume functional of a data field.
- *
- * See gwy_data_field_area_minkowski_volume() for details.
+ * See gwy_data_field_area_minkowski_volume() for details.
  **/
 void
 gwy_data_field_minkowski_volume(GwyDataField *data_field,
                                 GwyDataLine *target_line,
                                 gint nstats)
-{
-    gwy_data_field_cdh(data_field, target_line, nstats);
-    gwy_data_line_multiply(target_line, -1.0);
-    gwy_data_line_add(target_line, 1.0);
-}
-
-/**
- * gwy_data_field_area_minkowski_boundary:
- * @data_field: A data field.
- * @target_line: A data line to store the distribution to.  It will be
- *               resampled to requested width.
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- * @nstats: The number of samples to take on the distribution function.  If
- *          nonpositive, a suitable resolution is determined automatically.
- *
- * Calculates Minkowski boundary functional of a rectangular part of a data
- * field.
- *
- * Boundary functional is calculated as the number of boundaries for each
- * threshold value (the number of pixel sides where of neighouring pixels is
- * ,white` and the other ,black`) divided by the total number of samples
- * in the area.
- **/
-void
-gwy_data_field_area_minkowski_boundary(GwyDataField *data_field,
-                                       GwyDataLine *target_line,
-                                       gint col, gint row,
-                                       gint width, gint height,
-                                       gint nstats)
-{
-    GwySIUnit *fieldunit, *lineunit;
-    const gdouble *data;
-    gdouble *line;
-    gdouble min, max, q;
-    gint xres, i, j, k, k0, kr, kd;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(GWY_IS_DATA_LINE(target_line));
-    g_return_if_fail(col >= 0 && row >= 0
-                     && width >= 0 && height >= 0
-                     && col + width <= data_field->xres
-                     && row + height <= data_field->yres);
-
-    if (nstats < 1) {
-        nstats = floor(3.49*cbrt(width*height) + 0.5);
-        nstats = MAX(nstats, 2);
-    }
-
-    gwy_data_line_resample(target_line, nstats, GWY_INTERPOLATION_NONE);
-    gwy_data_line_clear(target_line);
-    gwy_data_field_area_get_min_max(data_field, NULL,
-                                    col, row, width, height,
-                                    &min, &max);
-    /* There are no boundaries on a totally flat sufrace */
-    if (min == max || width == 0 || height == 0)
-        return;
-
-    xres = data_field->xres;
-    q = nstats/(max - min);
-    line = target_line->data;
-
-    for (i = 0; i < height-1; i++) {
-        kr = (gint)((data_field->data[i*xres + col] - min)*q);
-        for (j = 0; j < width-1; j++) {
-            data = data_field->data + (i + row)*xres + (col + j);
-
-            k0 = kr;
-
-            kr = (gint)((data[1] - min)*q);
-            for (k = MAX(MIN(k0, kr), 0); k < MIN(MAX(k0, kr), nstats); k++)
-                line[k] += 1;
-
-            kd = (gint)((data[xres] - min)*q);
-            for (k = MAX(MIN(k0, kd), 0); k < MIN(MAX(k0, kd), nstats); k++)
-                line[k] += 1;
-        }
-    }
-
-    gwy_data_line_multiply(target_line, 1.0/(width*height));
-    gwy_data_line_set_real(target_line, max - min);
-    gwy_data_line_set_offset(target_line, min);
-
-    /* Set proper units */
-    fieldunit = gwy_data_field_get_si_unit_z(data_field);
-    lineunit = gwy_data_line_get_si_unit_x(target_line);
-    gwy_serializable_clone(G_OBJECT(fieldunit), G_OBJECT(lineunit));
-    lineunit = gwy_data_line_get_si_unit_y(target_line);
-    gwy_si_unit_set_from_string(lineunit, NULL);
-}
-
-/**
- * gwy_data_field_minkowski_boundary:
- * @data_field: A data field.
- * @target_line: A data line to store the distribution to.  It will be
- *               resampled to requested width.
- * @nstats: The number of samples to take on the distribution function.  If
- *          nonpositive, a suitable resolution is determined automatically.
- *
- * Calculates Minkowski boundary functional of a data field.
- *
- * See gwy_data_field_area_minkowski_boundary() for details.
- **/
-void
-gwy_data_field_minkowski_boundary(GwyDataField *data_field,
-                                  GwyDataLine *target_line,
-                                  gint nstats)
-{
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    gwy_data_field_area_minkowski_boundary(data_field, target_line,
-                                           0, 0,
-                                           data_field->xres, data_field->yres,
-                                           nstats);
-}
-
-/**
- * gwy_data_field_area_minkowski_euler:
- * @data_field: A data field.
- * @target_line: A data line to store the distribution to.  It will be
- *               resampled to requested width.
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- * @nstats: The number of samples to take on the distribution function.  If
- *          nonpositive, a suitable resolution is determined automatically.
- *
- * Calculates Minkowski connectivity functional (Euler characteristics) of
- * a rectangular part of a data field.
- *
- * Connectivity functional is calculated as the number connected areas of
- * pixels above threhsold (,white`) minus the number of connected areas of
- * pixels below threhsold (,black`) for each threshold value, divided by the
- * total number of samples in the area.
- **/
-void
-gwy_data_field_area_minkowski_euler(GwyDataField *data_field,
-                                    GwyDataLine *target_line,
-                                    gint col, gint row,
-                                    gint width, gint height,
-                                    gint nstats)
-{
-    GwySIUnit *fieldunit, *lineunit;
-    GwyDataLine *tmp_line;
-    gint i;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(GWY_IS_DATA_LINE(target_line));
-    g_return_if_fail(col >= 0 && row >= 0
-                     && width >= 0 && height >= 0
-                     && col + width <= data_field->xres
-                     && row + height <= data_field->yres);
-
-    if (nstats < 1) {
-        nstats = floor(3.49*cbrt(width*height) + 0.5);
-        nstats = MAX(nstats, 2);
-    }
-
-    gwy_data_line_resample(target_line, nstats, GWY_INTERPOLATION_NONE);
-    tmp_line = gwy_data_line_new_alike(target_line, FALSE);
-
-    gwy_data_field_area_grains_tgnd(data_field, target_line,
-                                    col, row, width, height,
-                                    FALSE, nstats);
-    gwy_data_field_area_grains_tgnd(data_field, tmp_line,
-                                    col, row, width, height,
-                                    TRUE, nstats);
-
-    for (i = 0; i < nstats; i++)
-        target_line->data[i] -= tmp_line->data[nstats-1 - i];
-    g_object_unref(tmp_line);
-
-    gwy_data_line_multiply(target_line, 1.0/(width*height));
-    gwy_data_line_invert(target_line, TRUE, FALSE);
-
-    /* Set proper units */
-    fieldunit = gwy_data_field_get_si_unit_z(data_field);
-    lineunit = gwy_data_line_get_si_unit_x(target_line);
-    gwy_serializable_clone(G_OBJECT(fieldunit), G_OBJECT(lineunit));
-    lineunit = gwy_data_line_get_si_unit_y(target_line);
-    gwy_si_unit_set_from_string(lineunit, NULL);
-}
-
-/**
- * gwy_data_field_minkowski_euler:
- * @data_field: A data field.
- * @target_line: A data line to store the distribution to.  It will be
- *               resampled to requested width.
- * @nstats: The number of samples to take on the distribution function.  If
- *          nonpositive, a suitable resolution is determined automatically.
- *
- * Calculates Minkowski connectivity functional (Euler characteristics) of
- * a data field.
- *
- * See gwy_data_field_area_minkowski_euler() for details.
- **/
-void
-gwy_data_field_minkowski_euler(GwyDataField *data_field,
-                               GwyDataLine *target_line,
-                               gint nstats)
-{
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    gwy_data_field_area_minkowski_euler(data_field, target_line,
-                                        0, 0,
-                                        data_field->xres, data_field->yres,
-                                        nstats);
-}
-
-/**
- * square_area1:
- * @z1: Z-value in first corner.
- * @z2: Z-value in second corner.
- * @z3: Z-value in third corner.
- * @z4: Z-value in fourth corner.
- * @q: One fourth of rectangle projected area (x-size * ysize).
- *
- * Calculates approximate area of a one square pixel.
- *
- * Returns: The area.
- **/
-static inline gdouble
-square_area1(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
-             gdouble q)
-{
-    gdouble c;
-
-    c = (z1 + z2 + z3 + z4)/4.0;
-    z1 -= c;
-    z2 -= c;
-    z3 -= c;
-    z4 -= c;
-
-    return (sqrt(1.0 + 2.0*(z1*z1 + z2*z2)/q)
-            + sqrt(1.0 + 2.0*(z2*z2 + z3*z3)/q)
-            + sqrt(1.0 + 2.0*(z3*z3 + z4*z4)/q)
-            + sqrt(1.0 + 2.0*(z4*z4 + z1*z1)/q));
-}
-
-/**
- * square_area1w:
- * @z1: Z-value in first corner.
- * @z2: Z-value in second corner.
- * @z3: Z-value in third corner.
- * @z4: Z-value in fourth corner.
- * @w1: Weight of first corner (0 or 1).
- * @w2: Weight of second corner (0 or 1).
- * @w3: Weight of third corner (0 or 1).
- * @w4: Weight of fourth corner (0 or 1).
- * @q: One fourth of rectangle projected area (x-size * ysize).
- *
- * Calculates approximate area of a one square pixel with some corners possibly
- * missing.
- *
- * Returns: The area.
- **/
-static inline gdouble
-square_area1w(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
-              gint w1, gint w2, gint w3, gint w4,
-              gdouble q)
-{
-    gdouble c;
-
-    c = (z1 + z2 + z3 + z4)/4.0;
-    z1 -= c;
-    z2 -= c;
-    z3 -= c;
-    z4 -= c;
-
-    return ((w1 + w2)*sqrt(1.0 + 2.0*(z1*z1 + z2*z2)/q)
-            + (w2 + w3)*sqrt(1.0 + 2.0*(z2*z2 + z3*z3)/q)
-            + (w3 + w4)*sqrt(1.0 + 2.0*(z3*z3 + z4*z4)/q)
-            + (w4 + w1)*sqrt(1.0 + 2.0*(z4*z4 + z1*z1)/q))/2.0;
-}
-
-/**
- * square_area2:
- * @z1: Z-value in first corner.
- * @z2: Z-value in second corner.
- * @z3: Z-value in third corner.
- * @z4: Z-value in fourth corner.
- * @x: One fourth of square of rectangle width (x-size).
- * @y: One fourth of square of rectangle height (y-size).
- *
- * Calculates approximate area of a one general rectangular pixel.
- *
- * Returns: The area.
- **/
-static inline gdouble
-square_area2(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
-             gdouble x, gdouble y)
-{
-    gdouble c;
-
-    c = (z1 + z2 + z3 + z4)/2.0;
-
-    return (sqrt(1.0 + (z1 - z2)*(z1 - z2)/x
-                 + (z1 + z2 - c)*(z1 + z2 - c)/y)
-            + sqrt(1.0 + (z2 - z3)*(z2 - z3)/y
-                   + (z2 + z3 - c)*(z2 + z3 - c)/x)
-            + sqrt(1.0 + (z3 - z4)*(z3 - z4)/x
-                   + (z3 + z4 - c)*(z3 + z4 - c)/y)
-            + sqrt(1.0 + (z1 - z4)*(z1 - z4)/y
-                   + (z1 + z4 - c)*(z1 + z4 - c)/x));
-}
-
-/**
- * square_area2w:
- * @z1: Z-value in first corner.
- * @z2: Z-value in second corner.
- * @z3: Z-value in third corner.
- * @z4: Z-value in fourth corner.
- * @w1: Weight of first corner (0 or 1).
- * @w2: Weight of second corner (0 or 1).
- * @w3: Weight of third corner (0 or 1).
- * @w4: Weight of fourth corner (0 or 1).
- * @x: One fourth of square of rectangle width (x-size).
- * @y: One fourth of square of rectangle height (y-size).
- *
- * Calculates approximate area of a one general rectangular pixel with some
- * corners possibly missing.
- *
- * Returns: The area.
- **/
-static inline gdouble
-square_area2w(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
-              gint w1, gint w2, gint w3, gint w4,
-              gdouble x, gdouble y)
-{
-    gdouble c;
-
-    c = (z1 + z2 + z3 + z4)/2.0;
-
-    return ((w1 + w2)*sqrt(1.0 + (z1 - z2)*(z1 - z2)/x
-                           + (z1 + z2 - c)*(z1 + z2 - c)/y)
-            + (w2 + w3)*sqrt(1.0 + (z2 - z3)*(z2 - z3)/y
-                             + (z2 + z3 - c)*(z2 + z3 - c)/x)
-            + (w3 + w4)*sqrt(1.0 + (z3 - z4)*(z3 - z4)/x
-                             + (z3 + z4 - c)*(z3 + z4 - c)/y)
-            + (w4 + w1)*sqrt(1.0 + (z1 - z4)*(z1 - z4)/y
-                             + (z1 + z4 - c)*(z1 + z4 - c)/x))/2.0;
-}
-
-/**
- * stripe_area1:
- * @n: The number of values in @r, @rr, @m.
- * @stride: Stride in @r, @rr, @m.
- * @r: Array of @n z-values of vertices, this row of vertices is considered
- *     inside.
- * @rr: Array of @n z-values of vertices, this row of vertices is considered
- *      outside.
- * @m: Mask for @r (@rr does not need mask since it has zero weight by
- *     definition), or %NULL to sum over all @r vertices.
- * @mode: Masking mode.
- * @q: One fourth of rectangle projected area (x-size * ysize).
- *
- * Calculates approximate area of a half-pixel stripe.
- *
- * Returns: The area.
- **/
-static gdouble
-stripe_area1(gint n,
-             gint stride,
-             const gdouble *r,
-             const gdouble *rr,
-             const gdouble *m,
-             GwyMaskingType mode,
-             gdouble q)
-{
-    gdouble sum = 0.0;
-    gint j;
-
-    if (m && mode != GWY_MASK_IGNORE) {
-        if (mode == GWY_MASK_INCLUDE) {
-            for (j = 0; j < n-1; j++)
-                sum += square_area1w(r[j*stride], r[(j + 1)*stride],
-                                     rr[(j + 1)*stride], rr[j*stride],
-                                     m[j*stride] > 0.0, m[(j + 1)*stride] > 0.0,
-                                     0, 0,
-                                     q);
-        }
-        else {
-            for (j = 0; j < n-1; j++)
-                sum += square_area1w(r[j*stride], r[(j + 1)*stride],
-                                     rr[(j + 1)*stride], rr[j*stride],
-                                     m[j*stride] < 1.0, m[(j + 1)*stride] < 1.0,
-                                     0, 0,
-                                     q);
-        }
-    }
-    else {
-        for (j = 0; j < n-1; j++)
-            sum += square_area1w(r[j*stride], r[(j + 1)*stride],
-                                 rr[(j + 1)*stride], rr[j*stride],
-                                 1, 1, 0, 0,
-                                 q);
-    }
-
-    return sum;
-}
-
-/**
- * stripe_area2:
- * @n: The number of values in @r, @rr, @m.
- * @stride: Stride in @r, @rr, @m.
- * @r: Array of @n z-values of vertices, this row of vertices is considered
- *     inside.
- * @rr: Array of @n z-values of vertices, this row of vertices is considered
- *      outside.
- * @m: Mask for @r (@rr does not need mask since it has zero weight by
- *     definition), or %NULL to sum over all @r vertices.
- * @x: One fourth of square of rectangle width (x-size).
- * @y: One fourth of square of rectangle height (y-size).
- *
- * Calculates approximate area of a half-pixel stripe.
- *
- * Returns: The area.
- **/
-static gdouble
-stripe_area2(gint n,
-             gint stride,
-             const gdouble *r,
-             const gdouble *rr,
-             const gdouble *m,
-             GwyMaskingType mode,
-             gdouble x,
-             gdouble y)
-{
-    gdouble sum = 0.0;
-    gint j;
-
-    if (m && mode == GWY_MASK_INCLUDE) {
-        for (j = 0; j < n-1; j++)
-            sum += square_area2w(r[j*stride], r[(j + 1)*stride],
-                                 rr[(j + 1)*stride], rr[j*stride],
-                                 m[j*stride] > 0.0, m[(j + 1)*stride] > 0.0,
-                                 0, 0,
-                                 x, y);
-    }
-    else if (m && mode == GWY_MASK_EXCLUDE) {
-        for (j = 0; j < n-1; j++)
-            sum += square_area2w(r[j*stride], r[(j + 1)*stride],
-                                 rr[(j + 1)*stride], rr[j*stride],
-                                 m[j*stride] < 1.0, m[(j + 1)*stride] < 1.0,
-                                 0, 0,
-                                 x, y);
-    }
-    else {
-        for (j = 0; j < n-1; j++)
-            sum += square_area2w(r[j*stride], r[(j + 1)*stride],
-                                 rr[(j + 1)*stride], rr[j*stride],
-                                 1, 1, 0, 0,
-                                 x, y);
-    }
-
-    return sum;
-}
-
-static gdouble
-calculate_surface_area(GwyDataField *dfield,
-                       GwyDataField *mask,
-                       GwyMaskingType mode,
-                       gint col, gint row,
-                       gint width, gint height)
-{
-    const gdouble *r, *m, *dataul, *maskul;
-    gint i, j, xres, yres, s;
-    gdouble x, y, q, sum = 0.0;
-
-    /* special cases */
-    if (!width || !height)
-        return sum;
-
-    xres = dfield->xres;
-    yres = dfield->yres;
-    x = dfield->xreal/dfield->xres;
-    y = dfield->yreal/dfield->yres;
-    q = x*y;
-    x = x*x;
-    y = y*y;
-    dataul = dfield->data + xres*row + col;
-
-    if (mask && mode != GWY_MASK_IGNORE) {
-        maskul = mask->data + xres*row + col;
-        if (fabs(log(x/y)) < 1e-7) {
-            /* Inside */
-            for (i = 0; i < height-1; i++) {
-                r = dataul + xres*i;
-                m = maskul + xres*i;
-                if (mode == GWY_MASK_INCLUDE) {
-                    for (j = 0; j < width-1; j++)
-                        sum += square_area1w(r[j], r[j+1],
-                                             r[j+xres+1], r[j+xres],
-                                             m[j] > 0.0, m[j+1] > 0.0,
-                                             m[j+xres+1] > 0.0, m[j+xres] > 0.0,
-                                             q);
-                }
-                else {
-                    for (j = 0; j < width-1; j++)
-                        sum += square_area1w(r[j], r[j+1],
-                                             r[j+xres+1], r[j+xres],
-                                             m[j] < 1.0, m[j+1] < 1.0,
-                                             m[j+xres+1] < 1.0, m[j+xres] < 1.0,
-                                             q);
-                }
-            }
-
-            /* Top row */
-            s = !(row == 0);
-            sum += stripe_area1(width, 1, dataul, dataul - s*xres,
-                                maskul, mode, q);
-
-            /* Bottom row */
-            s = !(row + height == yres);
-            sum += stripe_area1(width, 1,
-                                dataul + xres*(height-1),
-                                dataul + xres*(height-1 + s),
-                                maskul + xres*(height-1), mode, q);
-
-            /* Left column */
-            s = !(col == 0);
-            sum += stripe_area1(height, xres, dataul, dataul - s,
-                                maskul, mode, q);
-            /* Right column */
-            s = !(col + width == xres);
-            sum += stripe_area1(height, xres,
-                                dataul + width-1, dataul + width-1 + s,
-                                maskul + width-1, mode, q);
-        }
-        else {
-            /* Inside */
-            for (i = 0; i < height-1; i++) {
-                r = dataul + xres*i;
-                m = maskul + xres*i;
-                if (mode == GWY_MASK_INCLUDE) {
-                    for (j = 0; j < width-1; j++)
-                        sum += square_area2w(r[j], r[j+1],
-                                             r[j+xres+1], r[j+xres],
-                                             m[j] > 0.0, m[j+1] > 0.0,
-                                             m[j+xres+1] > 0.0, m[j+xres] > 0.0,
-                                             x, y);
-                }
-                else {
-                    for (j = 0; j < width-1; j++)
-                        sum += square_area2w(r[j], r[j+1],
-                                             r[j+xres+1], r[j+xres],
-                                             m[j] < 1.0, m[j+1] < 1.0,
-                                             m[j+xres+1] < 1.0, m[j+xres] < 1.0,
-                                             x, y);
-                }
-            }
-
-            /* Top row */
-            s = !(row == 0);
-            sum += stripe_area2(width, 1, dataul, dataul - s*xres, maskul,
-                                mode, x, y);
-
-            /* Bottom row */
-            s = !(row + height == yres);
-            sum += stripe_area2(width, 1,
-                                dataul + xres*(height-1),
-                                dataul + xres*(height-1 + s),
-                                maskul + xres*(height-1),
-                                mode, x, y);
-
-            /* Left column */
-            s = !(col == 0);
-            sum += stripe_area2(height, xres, dataul, dataul - s, maskul,
-                                mode, y, x);
-
-            /* Right column */
-            s = !(col + width == xres);
-            sum += stripe_area2(height, xres,
-                                dataul + width-1, dataul + width-1 + s,
-                                maskul + width-1,
-                                mode, y, x);
-        }
-
-        /* Just take the four corner quater-pixels as flat.  */
-        if (mode == GWY_MASK_INCLUDE) {
-            if (maskul[0] > 0.0)
-                sum += 1.0;
-            if (maskul[width-1] > 0.0)
-                sum += 1.0;
-            if (maskul[xres*(height-1)] > 0.0)
-                sum += 1.0;
-            if (maskul[xres*(height-1) + width-1] > 0.0)
-                sum += 1.0;
-        }
-        else {
-            if (maskul[0] < 1.0)
-                sum += 1.0;
-            if (maskul[width-1] < 1.0)
-                sum += 1.0;
-            if (maskul[xres*(height-1)] < 1.0)
-                sum += 1.0;
-            if (maskul[xres*(height-1) + width-1] < 1.0)
-                sum += 1.0;
-        }
-    }
-    else {
-        if (fabs(log(x/y)) < 1e-7) {
-            /* Inside */
-            for (i = 0; i < height-1; i++) {
-                r = dataul + xres*i;
-                for (j = 0; j < width-1; j++)
-                    sum += square_area1(r[j], r[j+1], r[j+xres+1], r[j+xres],
-                                        q);
-            }
-
-            /* Top row */
-            s = !(row == 0);
-            sum += stripe_area1(width, 1, dataul, dataul - s*xres,
-                                NULL, GWY_MASK_IGNORE, q);
-
-            /* Bottom row */
-            s = !(row + height == yres);
-            sum += stripe_area1(width, 1,
-                                dataul + xres*(height-1),
-                                dataul + xres*(height-1 + s),
-                                NULL, GWY_MASK_IGNORE, q);
-
-            /* Left column */
-            s = !(col == 0);
-            sum += stripe_area1(height, xres, dataul, dataul - s,
-                                NULL, GWY_MASK_IGNORE, q);
-
-            /* Right column */
-            s = !(col + width == xres);
-            sum += stripe_area1(height, xres,
-                                dataul + width-1, dataul + width-1 + s,
-                                NULL, GWY_MASK_IGNORE, q);
-        }
-        else {
-            for (i = 0; i < height-1; i++) {
-                r = dataul + xres*i;
-                for (j = 0; j < width-1; j++)
-                    sum += square_area2(r[j], r[j+1], r[j+xres+1], r[j+xres],
-                                        x, y);
-            }
-
-            /* Top row */
-            s = !(row == 0);
-            sum += stripe_area2(width, 1, dataul, dataul - s*xres, NULL,
-                                GWY_MASK_IGNORE, x, y);
-
-            /* Bottom row */
-            s = !(row + height == yres);
-            sum += stripe_area2(width, 1,
-                                dataul + xres*(height-1),
-                                dataul + xres*(height-1 + s),
-                                NULL,
-                                GWY_MASK_IGNORE, x, y);
-
-            /* Left column */
-            s = !(col == 0);
-            sum += stripe_area2(height, xres, dataul, dataul - s, NULL,
-                                GWY_MASK_IGNORE, y, x);
-
-            /* Right column */
-            s = !(col + width == xres);
-            sum += stripe_area2(height, xres,
-                                dataul + width-1, dataul + width-1 + s, NULL,
-                                GWY_MASK_IGNORE, y, x);
-        }
-
-        /* Just take the four corner quater-pixels as flat.  */
-        sum += 4.0;
-    }
-
-    return sum*q/4;
-}
-
-/**
- * gwy_data_field_get_surface_area:
- * @data_field: A data field.
- *
- * Computes surface area of a data field.
- *
- * This quantity is cached.
- *
- * Returns: The surface area.
- **/
-gdouble
-gwy_data_field_get_surface_area(GwyDataField *data_field)
-{
-    gdouble area = 0.0;
-
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), area);
-
-    gwy_debug("%s", CTEST(data_field, ARE) ? "cache" : "lame");
-    if (CTEST(data_field, ARE))
-        return CVAL(data_field, ARE);
-
-    area = calculate_surface_area(data_field, NULL, GWY_MASK_IGNORE,
-                                  0, 0, data_field->xres, data_field->yres);
-
-    CVAL(data_field, ARE) = area;
-    data_field->cached |= CBIT(ARE);
-
-    return area;
-}
-
-/**
- * gwy_data_field_area_get_surface_area:
- * @data_field: A data field.
- * @mask: Mask specifying which values to take into account/exclude, or %NULL.
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- *
- * Computes surface area of a rectangular part of a data field.
- *
- * This function is equivalent to calling
- * @gwy_data_field_area_get_surface_area_mask() with masking mode
- * %GWY_MASK_INCLUDE.
- *
- * Returns: The surface area.
- **/
-gdouble
-gwy_data_field_area_get_surface_area(GwyDataField *data_field,
-                                     GwyDataField *mask,
-                                     gint col, gint row,
-                                     gint width, gint height)
-{
-    return gwy_data_field_area_get_surface_area_mask(data_field, mask,
-                                                     GWY_MASK_INCLUDE,
-                                                     col, row, width, height);
-}
-
-/**
- * gwy_data_field_area_get_surface_area_mask:
- * @data_field: A data field.
- * @mask: Mask specifying which values to take into account/exclude, or %NULL.
- * @mode: Masking mode to use.  See the introduction for description of
- *        masking modes.
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- *
- * Computes surface area of a rectangular part of a data field.
- *
- * This quantity makes sense only if the lateral dimensions and values of
- * @data_field are the same physical quantities.
- *
- * Returns: The surface area.
- *
- * Since: 2.18
- **/
-gdouble
-gwy_data_field_area_get_surface_area_mask(GwyDataField *data_field,
-                                          GwyDataField *mask,
-                                          GwyMaskingType mode,
-                                          gint col, gint row,
-                                          gint width, gint height)
-{
-    gdouble area = 0.0;
-
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), area);
-    g_return_val_if_fail(!mask || (GWY_IS_DATA_FIELD(mask)
-                                   && mask->xres == data_field->xres
-                                   && mask->yres == data_field->yres), area);
-    g_return_val_if_fail(col >= 0 && row >= 0
-                         && width >= 0 && height >= 0
-                         && col + width <= data_field->xres
-                         && row + height <= data_field->yres,
-                         area);
-
-    /* The result is the same, but it can be cached. */
-    if ((!mask || mode == GWY_MASK_IGNORE)
-        && row == 0 && col == 0
-        && width == data_field->xres && height == data_field->yres)
-        return gwy_data_field_get_surface_area(data_field);
-
-    return calculate_surface_area(data_field, mask, mode,
-                                  col, row, width, height);
-}
-
-/**
- * square_var1:
- * @z1: Z-value in first corner.
- * @z2: Z-value in second corner.
- * @z3: Z-value in third corner.
- * @z4: Z-value in fourth corner.
- * @q: One fourth of rectangle projected var (x-size * ysize).
- *
- * Calculates approximate variation of a one square pixel.
- *
- * Returns: The variation.
- **/
-static inline gdouble
-square_var1(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
-            gdouble q)
-{
-    gdouble z12 = z1 - z2, z23 = z2 - z3, z34 = z3 - z4, z41 = z4 - z1;
-
-    return (sqrt((z12*z12 + z41*z41)/q)
-            + sqrt((z23*z23 + z12*z12)/q)
-            + sqrt((z34*z34 + z23*z23)/q)
-            + sqrt((z41*z41 + z34*z34)/q));
-}
-
-/**
- * square_var1w:
- * @z1: Z-value in first corner.
- * @z2: Z-value in second corner.
- * @z3: Z-value in third corner.
- * @z4: Z-value in fourth corner.
- * @w1: Weight of first corner (0 or 1).
- * @w2: Weight of second corner (0 or 1).
- * @w3: Weight of third corner (0 or 1).
- * @w4: Weight of fourth corner (0 or 1).
- * @q: One fourth of rectangle projected var (x-size * ysize).
- *
- * Calculates approximate variation of a one square pixel with some corners
- * possibly missing.
- *
- * Returns: The variation.
- **/
-static inline gdouble
-square_var1w(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
-             gint w1, gint w2, gint w3, gint w4,
-             gdouble q)
-{
-    gdouble z12 = z1 - z2, z23 = z2 - z3, z34 = z3 - z4, z41 = z4 - z1;
-
-    return (w1*sqrt((z12*z12 + z41*z41)/q)
-            + w2*sqrt((z23*z23 + z12*z12)/q)
-            + w3*sqrt((z34*z34 + z23*z23)/q)
-            + w4*sqrt((z41*z41 + z34*z34)/q));
-}
-
-/**
- * square_var2:
- * @z1: Z-value in first corner.
- * @z2: Z-value in second corner.
- * @z3: Z-value in third corner.
- * @z4: Z-value in fourth corner.
- * @x: One fourth of square of rectangle width (x-size).
- * @y: One fourth of square of rectangle height (y-size).
- *
- * Calculates approximate variation of a one general rectangular pixel.
- *
- * Returns: The variation.
- **/
-static inline gdouble
-square_var2(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
-            gdouble x, gdouble y)
-{
-    gdouble z12 = z1 - z2, z23 = z2 - z3, z34 = z3 - z4, z41 = z4 - z1;
-
-    return (sqrt(z12*z12/x + z41*z41/y)
-            + sqrt(z23*z23/y + z12*z12/x)
-            + sqrt(z34*z34/x + z23*z23/y)
-            + sqrt(z41*z41/y + z34*z34/x));
-}
-
-/**
- * square_var2w:
- * @z1: Z-value in first corner.
- * @z2: Z-value in second corner.
- * @z3: Z-value in third corner.
- * @z4: Z-value in fourth corner.
- * @w1: Weight of first corner (0 or 1).
- * @w2: Weight of second corner (0 or 1).
- * @w3: Weight of third corner (0 or 1).
- * @w4: Weight of fourth corner (0 or 1).
- * @x: One fourth of square of rectangle width (x-size).
- * @y: One fourth of square of rectangle height (y-size).
- *
- * Calculates approximate variation of a one general rectangular pixel with
- * some corners possibly missing.
- *
- * Returns: The variation.
- **/
-static inline gdouble
-square_var2w(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
-             gint w1, gint w2, gint w3, gint w4,
-             gdouble x, gdouble y)
-{
-    gdouble z12 = z1 - z2, z23 = z2 - z3, z34 = z3 - z4, z41 = z4 - z1;
-
-    return (w1*sqrt(z12*z12/x + z41*z41/y)
-            + w2*sqrt(z23*z23/y + z12*z12/x)
-            + w3*sqrt(z34*z34/x + z23*z23/y)
-            + w4*sqrt(z41*z41/y + z34*z34/x));
-}
-
-/**
- * stripe_var1:
- * @n: The number of values in @r, @rr, @m.
- * @stride: Stride in @r, @rr, @m.
- * @r: Array of @n z-values of vertices, this row of vertices is considered
- *     inside.
- * @rr: Array of @n z-values of vertices, this row of vertices is considered
- *      outside.
- * @m: Mask for @r (@rr does not need mask since it has zero weight by
- *     definition), or %NULL to sum over all @r vertices.
- * @mode: Masking mode.
- * @q: One fourth of rectangle projected var (x-size * ysize).
- *
- * Calculates approximate variation of a half-pixel stripe.
- *
- * Returns: The variation.
- **/
-static gdouble
-stripe_var1(gint n,
-            gint stride,
-            const gdouble *r,
-            const gdouble *rr,
-            const gdouble *m,
-            GwyMaskingType mode,
-            gdouble q)
-{
-    gdouble sum = 0.0;
-    gint j;
-
-    if (m && mode != GWY_MASK_IGNORE) {
-        if (mode == GWY_MASK_INCLUDE) {
-            for (j = 0; j < n-1; j++)
-                sum += square_var1w(r[j*stride], r[(j + 1)*stride],
-                                    rr[(j + 1)*stride], rr[j*stride],
-                                    m[j*stride] > 0.0, m[(j + 1)*stride] > 0.0,
-                                    0, 0,
-                                    q);
-        }
-        else {
-            for (j = 0; j < n-1; j++)
-                sum += square_var1w(r[j*stride], r[(j + 1)*stride],
-                                    rr[(j + 1)*stride], rr[j*stride],
-                                    m[j*stride] < 1.0, m[(j + 1)*stride] < 1.0,
-                                    0, 0,
-                                    q);
-        }
-    }
-    else {
-        for (j = 0; j < n-1; j++)
-            sum += square_var1w(r[j*stride], r[(j + 1)*stride],
-                                rr[(j + 1)*stride], rr[j*stride],
-                                1, 1, 0, 0,
-                                q);
-    }
-
-    return sum;
-}
-
-/**
- * stripe_var2:
- * @n: The number of values in @r, @rr, @m.
- * @stride: Stride in @r, @rr, @m.
- * @r: Array of @n z-values of vertices, this row of vertices is considered
- *     inside.
- * @rr: Array of @n z-values of vertices, this row of vertices is considered
- *      outside.
- * @m: Mask for @r (@rr does not need mask since it has zero weight by
- *     definition), or %NULL to sum over all @r vertices.
- * @x: One fourth of square of rectangle width (x-size).
- * @y: One fourth of square of rectangle height (y-size).
- *
- * Calculates approximate variation of a half-pixel stripe.
- *
- * Returns: The variation.
- **/
-static gdouble
-stripe_var2(gint n,
-            gint stride,
-            const gdouble *r,
-            const gdouble *rr,
-            const gdouble *m,
-            GwyMaskingType mode,
-            gdouble x,
-            gdouble y)
-{
-    gdouble sum = 0.0;
-    gint j;
-
-    if (m && mode == GWY_MASK_INCLUDE) {
-        for (j = 0; j < n-1; j++)
-            sum += square_var2w(r[j*stride], r[(j + 1)*stride],
-                                rr[(j + 1)*stride], rr[j*stride],
-                                m[j*stride] > 0.0, m[(j + 1)*stride] > 0.0,
-                                0, 0,
-                                x, y);
-    }
-    else if (m && mode == GWY_MASK_EXCLUDE) {
-        for (j = 0; j < n-1; j++)
-            sum += square_var2w(r[j*stride], r[(j + 1)*stride],
-                                rr[(j + 1)*stride], rr[j*stride],
-                                m[j*stride] < 1.0, m[(j + 1)*stride] < 1.0,
-                                0, 0,
-                                x, y);
-    }
-    else {
-        for (j = 0; j < n-1; j++)
-            sum += square_var2w(r[j*stride], r[(j + 1)*stride],
-                                rr[(j + 1)*stride], rr[j*stride],
-                                1, 1, 0, 0,
-                                x, y);
-    }
-
-    return sum;
-}
-
-static gdouble
-calculate_variation(GwyDataField *dfield,
-                    GwyDataField *mask,
-                    GwyMaskingType mode,
-                    gint col, gint row,
-                    gint width, gint height)
-{
-    const gdouble *r, *m, *dataul, *maskul;
-    gint i, j, xres, yres, s;
-    gdouble x, y, q, sum = 0.0;
-
-    /* special cases */
-    if (!width || !height)
-        return sum;
-
-    xres = dfield->xres;
-    yres = dfield->yres;
-    x = dfield->xreal/dfield->xres;
-    y = dfield->yreal/dfield->yres;
-    q = x*y;
-    x = x*x;
-    y = y*y;
-    dataul = dfield->data + xres*row + col;
-
-    if (mask && mode != GWY_MASK_IGNORE) {
-        maskul = mask->data + xres*row + col;
-        if (fabs(log(x/y)) < 1e-7) {
-            /* Inside */
-            for (i = 0; i < height-1; i++) {
-                r = dataul + xres*i;
-                m = maskul + xres*i;
-                if (mode == GWY_MASK_INCLUDE) {
-                    for (j = 0; j < width-1; j++)
-                        sum += square_var1w(r[j], r[j+1],
-                                            r[j+xres+1], r[j+xres],
-                                            m[j] > 0.0, m[j+1] > 0.0,
-                                            m[j+xres+1] > 0.0, m[j+xres] > 0.0,
-                                            q);
-                }
-                else {
-                    for (j = 0; j < width-1; j++)
-                        sum += square_var1w(r[j], r[j+1],
-                                            r[j+xres+1], r[j+xres],
-                                            m[j] < 1.0, m[j+1] < 1.0,
-                                            m[j+xres+1] < 1.0, m[j+xres] < 1.0,
-                                            q);
-                }
-            }
-
-            /* Top row */
-            s = !(row == 0);
-            sum += stripe_var1(width, 1, dataul, dataul - s*xres,
-                               maskul, mode, q);
-
-            /* Bottom row */
-            s = !(row + height == yres);
-            sum += stripe_var1(width, 1,
-                               dataul + xres*(height-1),
-                               dataul + xres*(height-1 + s),
-                               maskul + xres*(height-1), mode, q);
-
-            /* Left column */
-            s = !(col == 0);
-            sum += stripe_var1(height, xres, dataul, dataul - s,
-                               maskul, mode, q);
-            /* Right column */
-            s = !(col + width == xres);
-            sum += stripe_var1(height, xres,
-                               dataul + width-1, dataul + width-1 + s,
-                               maskul + width-1, mode, q);
-        }
-        else {
-            /* Inside */
-            for (i = 0; i < height-1; i++) {
-                r = dataul + xres*i;
-                m = maskul + xres*i;
-                if (mode == GWY_MASK_INCLUDE) {
-                    for (j = 0; j < width-1; j++)
-                        sum += square_var2w(r[j], r[j+1],
-                                            r[j+xres+1], r[j+xres],
-                                            m[j] > 0.0, m[j+1] > 0.0,
-                                            m[j+xres+1] > 0.0, m[j+xres] > 0.0,
-                                            x, y);
-                }
-                else {
-                    for (j = 0; j < width-1; j++)
-                        sum += square_var2w(r[j], r[j+1],
-                                            r[j+xres+1], r[j+xres],
-                                            m[j] < 1.0, m[j+1] < 1.0,
-                                            m[j+xres+1] < 1.0, m[j+xres] < 1.0,
-                                            x, y);
-                }
-            }
-
-            /* Top row */
-            s = !(row == 0);
-            sum += stripe_var2(width, 1, dataul, dataul - s*xres, maskul,
-                               mode, x, y);
-
-            /* Bottom row */
-            s = !(row + height == yres);
-            sum += stripe_var2(width, 1,
-                               dataul + xres*(height-1),
-                               dataul + xres*(height-1 + s),
-                               maskul + xres*(height-1),
-                               mode, x, y);
-
-            /* Left column */
-            s = !(col == 0);
-            sum += stripe_var2(height, xres, dataul, dataul - s, maskul,
-                               mode, y, x);
-
-            /* Right column */
-            s = !(col + width == xres);
-            sum += stripe_var2(height, xres,
-                               dataul + width-1, dataul + width-1 + s,
-                               maskul + width-1,
-                               mode, y, x);
-        }
-    }
-    else {
-        if (fabs(log(x/y)) < 1e-7) {
-            /* Inside */
-            for (i = 0; i < height-1; i++) {
-                r = dataul + xres*i;
-                for (j = 0; j < width-1; j++)
-                    sum += square_var1(r[j], r[j+1], r[j+xres+1], r[j+xres],
-                                       q);
-            }
-
-            /* Top row */
-            s = !(row == 0);
-            sum += stripe_var1(width, 1, dataul, dataul - s*xres,
-                               NULL, GWY_MASK_IGNORE, q);
-
-            /* Bottom row */
-            s = !(row + height == yres);
-            sum += stripe_var1(width, 1,
-                               dataul + xres*(height-1),
-                               dataul + xres*(height-1 + s),
-                               NULL, GWY_MASK_IGNORE, q);
-
-            /* Left column */
-            s = !(col == 0);
-            sum += stripe_var1(height, xres, dataul, dataul - s,
-                               NULL, GWY_MASK_IGNORE, q);
-
-            /* Right column */
-            s = !(col + width == xres);
-            sum += stripe_var1(height, xres,
-                               dataul + width-1, dataul + width-1 + s,
-                               NULL, GWY_MASK_IGNORE, q);
-        }
-        else {
-            for (i = 0; i < height-1; i++) {
-                r = dataul + xres*i;
-                for (j = 0; j < width-1; j++)
-                    sum += square_var2(r[j], r[j+1], r[j+xres+1], r[j+xres],
-                                       x, y);
-            }
-
-            /* Top row */
-            s = !(row == 0);
-            sum += stripe_var2(width, 1, dataul, dataul - s*xres, NULL,
-                               GWY_MASK_IGNORE, x, y);
-
-            /* Bottom row */
-            s = !(row + height == yres);
-            sum += stripe_var2(width, 1,
-                               dataul + xres*(height-1),
-                               dataul + xres*(height-1 + s),
-                               NULL,
-                               GWY_MASK_IGNORE, x, y);
-
-            /* Left column */
-            s = !(col == 0);
-            sum += stripe_var2(height, xres, dataul, dataul - s, NULL,
-                               GWY_MASK_IGNORE, y, x);
-
-            /* Right column */
-            s = !(col + width == xres);
-            sum += stripe_var2(height, xres,
-                               dataul + width-1, dataul + width-1 + s, NULL,
-                               GWY_MASK_IGNORE, y, x);
-        }
-    }
-
-    return sum*q/4;
-}
-
-/**
- * gwy_data_field_get_variation:
- * @data_field: A data field.
- *
- * Computes the total variation of a data field.
- *
- * See gwy_data_field_area_get_variation() for the definition.
- *
- * This quantity is cached.
- *
- * Returns: The variation.
- *
- * Since: 2.38
- **/
-gdouble
-gwy_data_field_get_variation(GwyDataField *data_field)
-{
-    gdouble var = 0.0;
-
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), var);
-
-    gwy_debug("%s", CTEST(data_field, VAR) ? "cache" : "lame");
-    if (CTEST(data_field, VAR))
-        return CVAL(data_field, VAR);
-
-    var = calculate_variation(data_field, NULL, GWY_MASK_IGNORE,
-                              0, 0, data_field->xres, data_field->yres);
-
-    CVAL(data_field, VAR) = var;
-    data_field->cached |= CBIT(VAR);
-
-    return var;
-}
-
-/**
- * gwy_data_field_area_get_variation:
- * @data_field: A data field.
- * @mask: Mask specifying which values to take into account/exclude, or %NULL.
- * @mode: Masking mode to use.  See the introduction for description of
- *        masking modes.
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- *
- * Computes the total variation of a rectangular part of a data field.
- *
- * The total variation is estimated as the integral of the absolute value of
- * local gradient.
- *
- * This quantity has the somewhat odd units of value unit times lateral unit.
- * It can be envisioned as follows.  If the surface has just two height levels
- * (upper and lower planes) then the quantity is the length of the boundary
- * between the upper and lower part, multiplied by the step height.  If the
- * surface is piece-wise constant, then the variation is the step height
- * integrated along the boundaries between the constant parts.  Therefore, for
- * non-fractal surfaces it scales with the linear dimension of the image, not
- * with its area, despite being an area integral.
- *
- * Returns: The variation.
- *
- * Since: 2.38
- **/
-gdouble
-gwy_data_field_area_get_variation(GwyDataField *data_field,
-                                  GwyDataField *mask,
-                                  GwyMaskingType mode,
-                                  gint col, gint row,
-                                  gint width, gint height)
-{
-    gdouble var = 0.0;
-
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), var);
-    g_return_val_if_fail(!mask || (GWY_IS_DATA_FIELD(mask)
-                                   && mask->xres == data_field->xres
-                                   && mask->yres == data_field->yres), var);
-    g_return_val_if_fail(col >= 0 && row >= 0
-                         && width >= 0 && height >= 0
-                         && col + width <= data_field->xres
-                         && row + height <= data_field->yres,
-                         var);
-
-    /* The result is the same, but it can be cached. */
-    if ((!mask || mode == GWY_MASK_IGNORE)
-        && row == 0 && col == 0
-        && width == data_field->xres && height == data_field->yres)
-        return gwy_data_field_get_variation(data_field);
-
-    return calculate_variation(data_field, mask, mode,
-                               col, row, width, height);
-}
-
-/**
- * square_volume:
- * @z1: Z-value in first corner.
- * @z2: Z-value in second corner.
- * @z3: Z-value in third corner.
- * @z4: Z-value in fourth corner.
- *
- * Calculates approximate volume of a one square pixel.
- *
- * Returns: The volume.
- **/
-static inline gdouble
-square_volume(gdouble z1, gdouble z2, gdouble z3, gdouble z4)
-{
-    gdouble c;
-
-    c = (z1 + z2 + z3 + z4)/4.0;
-
-    return c;
-}
-
-/**
- * square_volumew:
- * @z1: Z-value in first corner.
- * @z2: Z-value in second corner.
- * @z3: Z-value in third corner.
- * @z4: Z-value in fourth corner.
- * @w1: Weight of first corner (0 or 1).
- * @w2: Weight of second corner (0 or 1).
- * @w3: Weight of third corner (0 or 1).
- * @w4: Weight of fourth corner (0 or 1).
- *
- * Calculates approximate volume of a one square pixel with some corners
- * possibly missing.
- *
- * Returns: The volume.
- **/
-static inline gdouble
-square_volumew(gdouble z1, gdouble z2, gdouble z3, gdouble z4,
-               gint w1, gint w2, gint w3, gint w4)
-{
-    gdouble c;
-
-    c = (z1 + z2 + z3 + z4)/4.0;
-
-    return (w1*(3.0*z1 + z2 + z4 + c)
-            + w2*(3.0*z2 + z1 + z3 + c)
-            + w3*(3.0*z3 + z2 + z4 + c)
-            + w4*(3.0*z4 + z3 + z1 + c))/24.0;
-}
-
-/**
- * stripe_volume:
- * @n: The number of values in @r, @rr, @m.
- * @stride: Stride in @r, @rr, @m.
- * @r: Array of @n z-values of vertices, this row of vertices is considered
- *     inside.
- * @rr: Array of @n z-values of vertices, this row of vertices is considered
- *      outside.
- * @m: Mask for @r (@rr does not need mask since it has zero weight by
- *     definition), or %NULL to sum over all @r vertices.
- *
- * Calculates approximate volume of a half-pixel stripe.
- *
- * Returns: The volume.
- **/
-static gdouble
-stripe_volume(gint n,
-              gint stride,
-              const gdouble *r,
-              const gdouble *rr,
-              const gdouble *m)
-{
-    gdouble sum = 0.0;
-    gint j;
-
-    if (m) {
-        for (j = 0; j < n-1; j++)
-            sum += square_volumew(r[j*stride], r[(j + 1)*stride],
-                                  rr[(j + 1)*stride], rr[j*stride],
-                                  m[j*stride] > 0.0, m[(j + 1)*stride] > 0.0,
-                                  0, 0);
-    }
-    else {
-        for (j = 0; j < n-1; j++)
-            sum += square_volumew(r[j*stride], r[(j + 1)*stride],
-                                  rr[(j + 1)*stride], rr[j*stride],
-                                  1, 1, 0, 0);
-    }
-
-    return sum;
-}
-
-/**
- * stripe_volumeb:
- * @n: The number of values in @r, @rr, @m.
- * @stride: Stride in @r, @rr, @m.
- * @r: Array of @n z-values of vertices, this row of vertices is considered
- *     inside.
- * @rr: Array of @n z-values of vertices, this row of vertices is considered
- *      outside.
- * @b: Array of @n z-values of basis, this row of vertices is considered
- *     inside.
- * @br: Array of @n z-values of basis, this row of vertices is considered
- *      outside.
- * @m: Mask for @r (@rr does not need mask since it has zero weight by
- *     definition), or %NULL to sum over all @r vertices.
- *
- * Calculates approximate volume of a half-pixel stripe, taken from basis.
- *
- * Returns: The volume.
- **/
-static gdouble
-stripe_volumeb(gint n,
-               gint stride,
-               const gdouble *r,
-               const gdouble *rr,
-               const gdouble *b,
-               const gdouble *br,
-               const gdouble *m)
-{
-    gdouble sum = 0.0;
-    gint j;
-
-    if (m) {
-        for (j = 0; j < n-1; j++)
-            sum += square_volumew(r[j*stride] - b[j*stride],
-                                  r[(j + 1)*stride] - b[(j + 1)*stride],
-                                  rr[(j + 1)*stride] - br[(j + 1)*stride],
-                                  rr[j*stride] - br[j*stride],
-                                  m[j*stride] > 0.0,
-                                  m[(j + 1)*stride] > 0.0,
-                                  0, 0);
-    }
-    else {
-        for (j = 0; j < n-1; j++)
-            sum += square_volumew(r[j*stride] - b[j*stride],
-                                  r[(j + 1)*stride] - b[(j + 1)*stride],
-                                  rr[(j + 1)*stride] - br[(j + 1)*stride],
-                                  rr[j*stride] - br[j*stride],
-                                  1, 1, 0, 0);
-    }
-
-    return sum;
-}
-
-static gdouble
-calculate_volume(GwyDataField *dfield,
-                 GwyDataField *basis,
-                 GwyDataField *mask,
-                 gint col, gint row,
-                 gint width, gint height)
-{
-    const gdouble *r, *m, *b, *dataul, *maskul, *basisul;
-    gint i, j, xres, yres, s;
-    gdouble sum = 0.0;
-
-    /* special cases */
-    if (!width || !height)
-        return sum;
-
-    xres = dfield->xres;
-    yres = dfield->yres;
-    dataul = dfield->data + xres*row + col;
-
-    if (mask) {
-        maskul = mask->data + xres*row + col;
-        if (!basis) {
-            /* Inside */
-            for (i = 0; i < height-1; i++) {
-                r = dataul + xres*i;
-                m = maskul + xres*i;
-                for (j = 0; j < width-1; j++)
-                    sum += square_volumew(r[j], r[j+1],
-                                          r[j+xres+1], r[j+xres],
-                                          m[j] > 0.0, m[j+1] > 0.0,
-                                          m[j+xres+1] > 0.0, m[j+xres] > 0.0);
-            }
-
-            /* Top row */
-            s = !(row == 0);
-            sum += stripe_volume(width, 1, dataul, dataul - s*xres, maskul);
-
-            /* Bottom row */
-            s = !(row + height == yres);
-            sum += stripe_volume(width, 1,
-                                 dataul + xres*(height-1),
-                                 dataul + xres*(height-1 + s),
-                                 maskul + xres*(height-1));
-
-            /* Left column */
-            s = !(col == 0);
-            sum += stripe_volume(height, xres, dataul, dataul - s, maskul);
-
-            /* Right column */
-            s = !(col + width == xres);
-            sum += stripe_volume(height, xres,
-                                 dataul + width-1, dataul + width-1 + s,
-                                 maskul + width-1);
-
-            /* Just take the four corner quater-pixels as flat.  */
-            if (maskul[0])
-                sum += dataul[0]/4.0;
-            if (maskul[width-1])
-                sum += dataul[width-1]/4.0;
-            if (maskul[xres*(height-1)])
-                sum += dataul[xres*(height-1)]/4.0;
-            if (maskul[xres*(height-1) + width-1])
-                sum += dataul[xres*(height-1) + width-1]/4.0;
-        }
-        else {
-            basisul = basis->data + xres*row + col;
-
-            /* Inside */
-            for (i = 0; i < height-1; i++) {
-                r = dataul + xres*i;
-                m = maskul + xres*i;
-                b = basisul + xres*i;
-                for (j = 0; j < width-1; j++)
-                    sum += square_volumew(r[j] - b[j],
-                                          r[j+1] - b[j+1],
-                                          r[j+xres+1] - b[j+xres+1],
-                                          r[j+xres] - b[j+xres],
-                                          m[j] > 0.0, m[j+1] > 0.0,
-                                          m[j+xres+1] > 0.0, m[j+xres] > 0.0);
-            }
-
-            /* Top row */
-            s = !(row == 0);
-            sum += stripe_volumeb(width, 1,
-                                  dataul, dataul - s*xres,
-                                  basisul, basisul - s*xres,
-                                  maskul);
-
-            /* Bottom row */
-            s = !(row + height == yres);
-            sum += stripe_volumeb(width, 1,
-                                  dataul + xres*(height-1),
-                                  dataul + xres*(height-1 + s),
-                                  basisul + xres*(height-1),
-                                  basisul + xres*(height-1 + s),
-                                  maskul + xres*(height-1));
-
-            /* Left column */
-            s = !(col == 0);
-            sum += stripe_volumeb(height, xres,
-                                  dataul, dataul - s,
-                                  basisul, basisul - s,
-                                  maskul);
-
-            /* Right column */
-            s = !(col + width == xres);
-            sum += stripe_volumeb(height, xres,
-                                  dataul + width-1, dataul + width-1 + s,
-                                  basisul + width-1, basisul + width-1 + s,
-                                  maskul + width-1);
-
-            /* Just take the four corner quater-pixels as flat.  */
-            if (maskul[0])
-                sum += (dataul[0] - basisul[0])/4.0;
-            if (maskul[width-1])
-                sum += (dataul[width-1] - basisul[width-1])/4.0;
-            if (maskul[xres*(height-1)])
-                sum += (dataul[xres*(height-1)] - basisul[xres*(height-1)])/4.0;
-            if (maskul[xres*(height-1) + width-1])
-                sum += (dataul[xres*(height-1) + width-1]
-                        - basisul[xres*(height-1) + width-1])/4.0;
-        }
-    }
-    else {
-        if (!basis) {
-            /* Inside */
-            for (i = 0; i < height-1; i++) {
-                r = dataul + xres*i;
-                for (j = 0; j < width-1; j++)
-                    sum += square_volume(r[j], r[j+1], r[j+xres+1], r[j+xres]);
-            }
-
-            /* Top row */
-            s = !(row == 0);
-            sum += stripe_volume(width, 1, dataul, dataul - s*xres, NULL);
-
-            /* Bottom row */
-            s = !(row + height == yres);
-            sum += stripe_volume(width, 1,
-                                 dataul + xres*(height-1),
-                                 dataul + xres*(height-1 + s),
-                                 NULL);
-
-            /* Left column */
-            s = !(col == 0);
-            sum += stripe_volume(height, xres, dataul, dataul - s, NULL);
-
-            /* Right column */
-            s = !(col + width == xres);
-            sum += stripe_volume(height, xres,
-                                 dataul + width-1, dataul + width-1 + s,
-                                 NULL);
-
-            /* Just take the four corner quater-pixels as flat.  */
-            sum += dataul[0]/4.0;
-            sum += dataul[width-1]/4.0;
-            sum += dataul[xres*(height-1)]/4.0;
-            sum += dataul[xres*(height-1) + width-1]/4.0;
-        }
-        else {
-            basisul = basis->data + xres*row + col;
-
-            /* Inside */
-            for (i = 0; i < height-1; i++) {
-                r = dataul + xres*i;
-                b = basisul + xres*i;
-                for (j = 0; j < width-1; j++)
-                    sum += square_volume(r[j] - b[j],
-                                         r[j+1] - b[j+1],
-                                         r[j+xres+1] - b[j+xres+1],
-                                         r[j+xres] - b[j+xres]);
-            }
-
-            /* Top row */
-            s = !(row == 0);
-            sum += stripe_volumeb(width, 1,
-                                  dataul, dataul - s*xres,
-                                  basisul, basisul - s*xres,
-                                  NULL);
-
-            /* Bottom row */
-            s = !(row + height == yres);
-            sum += stripe_volumeb(width, 1,
-                                  dataul + xres*(height-1),
-                                  dataul + xres*(height-1 + s),
-                                  basisul + xres*(height-1),
-                                  basisul + xres*(height-1 + s),
-                                  NULL);
-
-            /* Left column */
-            s = !(col == 0);
-            sum += stripe_volumeb(height, xres,
-                                  dataul, dataul - s,
-                                  basisul, basisul - s,
-                                  NULL);
-
-            /* Right column */
-            s = !(col + width == xres);
-            sum += stripe_volumeb(height, xres,
-                                  dataul + width-1, dataul + width-1 + s,
-                                  basisul + width-1, basisul + width-1 + s,
-                                  NULL);
-
-            /* Just take the four corner quater-pixels as flat.  */
-            sum += (dataul[0] - basisul[0])/4.0;
-            sum += (dataul[width-1] - basisul[width-1])/4.0;
-            sum += (dataul[xres*(height-1)] - basisul[xres*(height-1)])/4.0;
-            sum += (dataul[xres*(height-1) + width-1]
-                    - basisul[xres*(height-1) + width-1])/4.0;
-        }
-    }
-
-    return sum* dfield->xreal/dfield->xres * dfield->yreal/dfield->yres;
-}
-
-/* Don't define gwy_data_field_get_volume() without mask and basis, it would
- * just be a complicate way to calculate gwy_data_field_get_sum() */
-
-/**
- * gwy_data_field_area_get_volume:
- * @data_field: A data field.
- * @basis: The basis or background for volume calculation if not %NULL.
- *         The height of each vertex is then the difference between
- *         @data_field value and @basis value.  Value %NULL is the same
- *         as passing all zeroes for the basis.
- * @mask: Mask specifying which values to take into account/exclude, or %NULL.
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- *
- * Computes volume of a rectangular part of a data field.
- *
- * Returns: The volume.
- *
- * Since: 2.3
- **/
-gdouble
-gwy_data_field_area_get_volume(GwyDataField *data_field,
-                               GwyDataField *basis,
-                               GwyDataField *mask,
-                               gint col, gint row,
-                               gint width, gint height)
-{
-    gdouble vol = 0.0;
-
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), vol);
-    g_return_val_if_fail(!basis || (GWY_IS_DATA_FIELD(basis)
-                                    && basis->xres == data_field->xres
-                                    && basis->yres == data_field->yres), vol);
-    g_return_val_if_fail(!mask || (GWY_IS_DATA_FIELD(mask)
-                                   && mask->xres == data_field->xres
-                                   && mask->yres == data_field->yres), vol);
-    g_return_val_if_fail(col >= 0 && row >= 0
-                         && width >= 0 && height >= 0
-                         && col + width <= data_field->xres
-                         && row + height <= data_field->yres,
-                         vol);
-
-    return calculate_volume(data_field, basis, mask, col, row, width, height);
-}
-
-/* Find the flattest part of the curve representing scaling histogram-based
- * entropy on scale and use the value there as the entropy estimate.  Handle
- * the too-few-pixels cases gracefully.
- *
- * NB: We assume
- * (1) ecurve beings from large scales.  This is important only when it has
- * lots of points because we may skip a few at the beginning then to avoid
- * mistaking the flat part of the curve there for the inflexion point.
- * (2) ecurve goes by powers of 2 scales, this is for the mindiff filtering.
- */
-static gdouble
-calculate_entropy_from_scaling(const gdouble *ecurve, guint maxdiv)
-{
-    /* Initialise S to the δ-function entropy and mindiff to the half of the
-     * asymptotic value for distribution that is sum of δ-functions.
-     * This means only if the differences drops substantially from this
-     * asymptotic value we will consider is as potential inflexion point.
-     * If we get ecurve[] essentially corresponding to a set of δ-functions
-     * then we return -G_MAXDOUBLE. */
-    gdouble S = -G_MAXDOUBLE, mindiff = 0.6*G_LN2;
-    guint i, from = (maxdiv >= 12) + (maxdiv >= 36);
-
-    if (maxdiv < 1)
-        return ecurve[0];
-
-    if (maxdiv < 5) {
-        for (i = from; i <= maxdiv-2; i++) {
-            gdouble diff = 0.5*(fabs(ecurve[i+1] - ecurve[i])
-                                + fabs(ecurve[i+2] - ecurve[i+1]))/G_LN2;
-            gdouble diff2 = 0.5*(fabs(ecurve[i] + ecurve[i+2]
-                                      - 2.0*ecurve[i+1]))/(G_LN2*G_LN2);
-            if (diff + diff2 < mindiff) {
-                S = ecurve[i+1];
-                mindiff = diff + diff2;
-            }
-        }
-    }
-    else {
-        for (i = from; i <= maxdiv-4; i++) {
-            gdouble diff = 0.25*(fabs(ecurve[i+1] - ecurve[i])
-                                 + fabs(ecurve[i+2] - ecurve[i+1])
-                                 + fabs(ecurve[i+3] - ecurve[i+2])
-                                 + fabs(ecurve[i+4] - ecurve[i+3]));
-            gdouble diff2 = 0.5*(fabs(ecurve[i+1] + ecurve[i+4]
-                                      - 2.0*ecurve[i+2]))/(G_LN2*G_LN2);
-            if (diff + diff2 < mindiff) {
-                S = (ecurve[i+1] + ecurve[i+2] + ecurve[i+3])/3.0;
-                mindiff = diff + diff2;
-            }
-        }
-    }
-
-    return S;
-}
-
-/* This is what we get on average from all possible two-point configurations if
- * they are randomly distributed.  A fairly good estimate that in practice
- * seems to result in some deviation on the 5th significant digit, which is
- * hardly significant at all.  The contribution is the same in 1D and 2D. */
-static void
-add_estimated_unsplit_node_entropy(gdouble *S, guint maxdepth, gdouble w)
-{
-    gdouble q = 2.0*G_LN2*w;
-    guint i;
-
-    for (i = 0; i <= maxdepth; i++, S++) {
-        S[0] += q;
-        q *= 0.5;
-    }
-}
-
-static BinTreeNode*
-bin_tree_node_new(const gdouble pt)
-{
-    BinTreeNode *btnode = g_slice_new(BinTreeNode);
-    btnode->u.pt.a = pt;
-    btnode->count = 1;
-    return btnode;
-}
-
-static void
-bin_tree_add_node(BinTreeNode *btnode, const gdouble pt,
-                  gdouble min, gdouble max, guint maxdepth)
-{
-    BinTreeNode *child;
-    gdouble centre;
-    guint i;
-
-    /* We reached maximum allowed subdivision.  Just increase the count. */
-    if (!maxdepth) {
-        if (btnode->count <= 2)
-            gwy_clear(&btnode->u, 1);
-        btnode->count++;
-        return;
-    }
-
-    /* We will descend into subtrees. */
-    centre = 0.5*(min + max);
-
-    /* If this node has just one point add the other there and we are done. */
-    if (btnode->count == 1) {
-        btnode->u.pt.b = pt;
-        btnode->count++;
-        return;
-    }
-
-    /* We will be recursing.  So if this node is a leaf start by making it
-     * non-leaf. */
-    if (btnode->count == 2) {
-        gdouble pta = btnode->u.pt.a;
-        gdouble ptb = btnode->u.pt.b;
-        guint ia = (pta > centre);
-        guint ib = (ptb > centre);
-
-        gwy_clear(&btnode->u, 1);
-        child = btnode->u.children[ia] = bin_tree_node_new(pta);
-        /* Must distinguish between creating two child nodes and creating one
-         * two-point child node. */
-        if (ia == ib) {
-            child->u.pt.b = ptb;
-            child->count = 2;
-        }
-        else
-            btnode->u.children[ib] = bin_tree_node_new(ptb);
-    }
-
-    /* Add the new point to the appropriate child. */
-    i = (pt > centre);
-    maxdepth--;
-    btnode->count++;
-
-    if ((child = btnode->u.children[i])) {
-        /* Recurse.  This will end either by reaching maxdepth=0 or by
-         * successful separation in the other branch of this conditon. */
-        if (i == 0)
-            bin_tree_add_node(child, pt, min, centre, maxdepth);
-        else
-            bin_tree_add_node(child, pt, centre, max, maxdepth);
-    }
-    else {
-        /* There is nothing here yet.  Add the point as a new leaf. */
-        btnode->u.children[i] = bin_tree_node_new(pt);
-    }
-}
-
-static void
-bin_tree_add(BinTree *btree, const gdouble pt)
-{
-    if (G_LIKELY(btree->root)) {
-        bin_tree_add_node(btree->root, pt,
-                          btree->min, btree->max, btree->maxdepth);
-    }
-    else
-        btree->root = bin_tree_node_new(pt);
-}
-
-static void
-bin_tree_find_range(BinTree *btree, const gdouble *xdata, guint n)
-{
-    gdouble min = G_MAXDOUBLE;
-    gdouble max = -G_MAXDOUBLE;
-    guint i;
-
-    for (i = 0; i < n; i++) {
-        gdouble x = xdata[i];
-
-        if (x < min)
-            min = x;
-        if (x > max)
-            max = x;
-    }
-
-    btree->min = min;
-    btree->max = max;
-}
-
-static void
-bin_tree_node_free(BinTreeNode *btnode)
-{
-    guint i;
-
-    if (btnode->count > 2) {
-        for (i = 0; i < G_N_ELEMENTS(btnode->u.children); i++) {
-            if (btnode->u.children[i])
-                bin_tree_node_free(btnode->u.children[i]);
-        }
-    }
-    g_slice_free(BinTreeNode, btnode);
-}
-
-static void
-bin_tree_free(BinTree *btree)
-{
-    if (!btree->degenerate)
-        bin_tree_node_free(btree->root);
-    g_free(btree);
-}
-
-static BinTree*
-bin_tree_new(const gdouble *xdata, guint n, guint maxdepth)
-{
-    BinTree *btree;
-    guint i;
-
-    btree = g_new0(BinTree, 1);
-
-    if (!maxdepth)
-        maxdepth = 24;
-    btree->maxdepth = maxdepth;
-
-    bin_tree_find_range(btree, xdata, n);
-    if (!(btree->min < btree->max)) {
-        btree->degenerate = TRUE;
-        btree->degenerateS = G_MAXDOUBLE;
-        return btree;
-    }
-
-    /* Return explicit estimates for n < 4, making maxdiv at least 1 (with
-     * half-scales included, ecurve will have at least 3 points then). */
-    if (n == 2) {
-        btree->degenerate = TRUE;
-        btree->degenerateS = log(btree->max - btree->min);
-        return btree;
-    }
-    if (n == 3) {
-        btree->degenerate = TRUE;
-        btree->degenerateS = (log(btree->max - btree->min)
-                              + 0.5*log(1.5) - G_LN2/3.0);
-        return btree;
-    }
-
-    for (i = 0; i < n; i++) {
-        gdouble pt = xdata[i];
-        bin_tree_add(btree, pt);
-    }
-
-    return btree;
-}
-
-static void
-bin_tree_node_entropies_at_scales(BinTreeNode *btnode, guint maxdepth,
-                                  gdouble *S, guint *unsplit)
-{
-    BinTreeNode *child;
-    guint i;
-
-    /* Singular points contribute to p*ln(p) always with zero.  So we can stop
-     * recursion to finer subdivisions when count == 1. */
-    if (btnode->count <= 1)
-        return;
-
-    if (!maxdepth) {
-        S[0] += gwy_xlnx_int(btnode->count);
-        return;
-    }
-
-    if (btnode->count == 2) {
-        unsplit[0]++;
-        return;
-    }
-
-    S[0] += gwy_xlnx_int(btnode->count);
-    S++;
-
-    maxdepth--;
-    unsplit++;
-    for (i = 0; i < G_N_ELEMENTS(btnode->u.children); i++) {
-        if ((child = btnode->u.children[i]))
-            bin_tree_node_entropies_at_scales(child, maxdepth, S, unsplit);
-    }
-}
-
-static gdouble*
-bin_tree_entropies_at_scales(BinTree *btree, guint maxdepth)
-{
-    gdouble *S;
-    guint *unsplit;
-    guint i, n, npts;
-    gdouble Sscale;
-
-    if (!maxdepth)
-        maxdepth = btree->maxdepth;
-
-    n = maxdepth + 1;
-    S = g_new0(gdouble, n);
-
-    if (btree->degenerate) {
-        S[0] = btree->degenerateS;
-        for (i = 1; i < n; i++)
-            S[i] = S[i-1] - G_LN2;
-        return S;
-    }
-
-    unsplit = g_new0(guint, maxdepth);
-    bin_tree_node_entropies_at_scales(btree->root,
-                                      MIN(maxdepth, btree->maxdepth),
-                                      S, unsplit);
-
-    for (i = 0; i < maxdepth; i++) {
-        if (unsplit[i])
-            add_estimated_unsplit_node_entropy(S + i, maxdepth - i, unsplit[i]);
-    }
-    g_free(unsplit);
-
-    npts = btree->root->count;
-    Sscale = log(npts*(btree->max - btree->min));
-    for (i = 0; i < n; i++)
-        S[i] = Sscale - i*G_LN2 - S[i]/npts;
-
-    return S;
-}
-
-static gdouble*
-calculate_entropy_at_scales(GwyDataField *dfield,
-                            GwyDataField *mask,
-                            GwyMaskingType mode,
-                            gint col, gint row,
-                            gint width, gint height,
-                            guint *maxdiv,
-                            gdouble *S)
-{
-    gint xres;
-    guint i, j, n;
-    gdouble *xdata;
-    const gdouble *base;
-    gboolean must_free_xdata = TRUE;
-    gdouble *ecurve;
-    BinTree *btree;
-
-    if (mask) {
-        gwy_data_field_area_count_in_range(mask, NULL, col, row, width, height,
-                                           G_MAXDOUBLE, 1.0, NULL, &n);
-        if (mode == GWY_MASK_EXCLUDE)
-            n = width*height - n;
-    }
-    else
-        n = width*height;
-
-    if (!*maxdiv) {
-        if (n >= 2)
-            *maxdiv = (guint)floor(3.0*log(n)/G_LN2 + 1e-12);
-        else
-            *maxdiv = 2;
-
-        /* We will run out of significant digits in coordinates after that. */
-        *maxdiv = MIN(*maxdiv, 50);
-    }
-
-    if (n < 2) {
-        ecurve = g_new(gdouble, *maxdiv+1);
-        for (i = 0; i <= *maxdiv; i++)
-            ecurve[i] = -G_MAXDOUBLE;
-        if (S)
-            *S = -G_MAXDOUBLE;
-        return ecurve;
-    }
-
-    xres = dfield->xres;
-    base = dfield->data + row*xres + col;
-    if (n == xres*dfield->yres) {
-        /* Handle the full-field case without allocating anything. */
-        xdata = dfield->data;
-        must_free_xdata = FALSE;
-    }
-    else {
-        xdata = g_new(gdouble, n);
-        if (mask) {
-            const gdouble *mbase = mask->data + row*xres + col;
-            const gboolean invert = (mode == GWY_MASK_EXCLUDE);
-            guint k = 0;
-
-            for (i = 0; i < height; i++) {
-                const gdouble *d = base + i*xres;
-                const gdouble *m = mbase + i*xres;
-                for (j = width; j; j--, d++, m++) {
-                    if ((*m < 1.0) == invert)
-                        xdata[k++] = *d;
-                }
-            }
-            g_assert(k == n);
-        }
-        else {
-            for (i = 0; i < height; i++)
-                gwy_assign(xdata + i*width, base + i*xres, width);
-        }
-    }
-
-    btree = bin_tree_new(xdata, n, *maxdiv);
-    if (must_free_xdata)
-        g_free(xdata);
-
-    ecurve = bin_tree_entropies_at_scales(btree, *maxdiv);
-    if (S) {
-        if (btree->degenerate)
-            *S = btree->degenerateS;
-        else
-            *S = calculate_entropy_from_scaling(ecurve, *maxdiv);
-    }
-    bin_tree_free(btree);
-
-    return ecurve;
-}
-
-/**
- * gwy_data_field_area_get_entropy_at_scales:
- * @data_field: A data field.
- * @target_line: A data line to store the result to.  It will be resampled to
- *               @maxdiv+1 items.
- * @mask: Mask specifying which values to take into account/exclude, or %NULL.
- * @mode: Masking mode to use.  See the introduction for description of
- *        masking modes.
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- * @maxdiv: Maximum number of divisions of the value range.  Pass zero to
- *          choose it automatically.
- *
- * Calculates estimates of value distribution entropy at various scales.
- *
- * Returns: The best estimate, as gwy_data_field_area_get_entropy().
- *
- * Since: 2.44
- **/
-gdouble
-gwy_data_field_area_get_entropy_at_scales(GwyDataField *data_field,
-                                          GwyDataLine *target_line,
-                                          GwyDataField *mask,
-                                          GwyMaskingType mode,
-                                          gint col, gint row,
-                                          gint width, gint height,
-                                          gint maxdiv)
-{
-    GwySIUnit *lineunit;
-    guint umaxdiv = (maxdiv > 0 ? maxdiv : 0);
-    gdouble *ecurve;
-    gdouble min, max, S = -G_MAXDOUBLE;
-    gint i;
-
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), S);
-    g_return_val_if_fail(GWY_IS_DATA_LINE(target_line), S);
-    g_return_val_if_fail(!mask || (GWY_IS_DATA_FIELD(mask)
-                                   && mask->xres == data_field->xres
-                                   && mask->yres == data_field->yres), S);
-    g_return_val_if_fail(col >= 0 && row >= 0
-                         && width >= 0 && height >= 0
-                         && col + width <= data_field->xres
-                         && row + height <= data_field->yres, S);
-
-    ecurve = calculate_entropy_at_scales(data_field, mask, mode,
-                                         col, row, width, height,
-                                         &umaxdiv, &S);
-    maxdiv = maxdiv ? maxdiv : umaxdiv + 1;
-    gwy_data_line_resample(target_line, maxdiv, GWY_INTERPOLATION_NONE);
-    target_line->real = maxdiv*G_LN2;
-    for (i = 0; i < maxdiv; i++)
-        target_line->data[maxdiv-1 - i] = ecurve[i];
-    g_free(ecurve);
-
-    gwy_data_field_area_get_min_max_mask(data_field, mask, mode,
-                                         col, row, width, height,
-                                         &min, &max);
-    if (max > min)
-        target_line->off = log(max - min) - (maxdiv - 0.5)*G_LN2;
-
-    lineunit = gwy_data_line_get_si_unit_x(target_line);
-    gwy_si_unit_set_from_string(lineunit, NULL);
-    lineunit = gwy_data_line_get_si_unit_y(target_line);
-    gwy_si_unit_set_from_string(lineunit, NULL);
-
-    return S;
-}
-
-/**
- * gwy_data_field_get_entropy:
- * @data_field: A data field.
- *
- * Computes the entropy of a data field.
- *
- * See gwy_data_field_area_get_entropy() for the definition.
- *
- * This quantity is cached.
- *
- * Returns: The value distribution entropy.
- *
- * Since: 2.42
- **/
-gdouble
-gwy_data_field_get_entropy(GwyDataField *data_field)
-{
-    gdouble S = -G_MAXDOUBLE;
-    gdouble *ecurve;
-    guint maxdiv = 0;
-
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), S);
-
-    gwy_debug("%s", CTEST(data_field, ENT) ? "cache" : "lame");
-    if (CTEST(data_field, ENT))
-        return CVAL(data_field, ENT);
-
-    ecurve = calculate_entropy_at_scales(data_field, NULL, GWY_MASK_IGNORE,
-                                         0, 0,
-                                         data_field->xres, data_field->yres,
-                                         &maxdiv, &S);
-    g_free(ecurve);
-
-    CVAL(data_field, ENT) = S;
-    data_field->cached |= CBIT(ENT);
-
-    return S;
-}
-
-/**
- * gwy_data_field_area_get_entropy:
- * @data_field: A data field.
- * @mask: Mask specifying which values to take into account/exclude, or %NULL.
- * @mode: Masking mode to use.  See the introduction for description of
- *        masking modes.
- * @col: Upper-left column coordinate.
- * @row: Upper-left row coordinate.
- * @width: Area width (number of columns).
- * @height: Area height (number of rows).
- *
- * Estimates the entropy of field data distribution.
- *
- * The estimate is calculated as @S = ln(@n Δ) − 1/@n ∑ @n_i ln(@n_i), where
- * @n is the number of pixels considered, Δ the bin size and @n_i the count in
- * the @i-th bin.  If @S is plotted as a function of the bin size Δ, it is,
- * generally, a growing function with a plateau for ‘reasonable’ bin sizes.
- * The estimate is taken at the plateau.  If no plateau is found, which means
- * the distribution is effectively a sum of δ-functions, -%G_MAXDOUBLE is
- * returned.
- *
- * It should be noted that this estimate may be biased.
- *
- * Returns: The estimated entropy of the data values.  The entropy of no data
- *          or a single single is returned as -%G_MAXDOUBLE.
- *
- * Since: 2.42
- **/
-gdouble
-gwy_data_field_area_get_entropy(GwyDataField *data_field,
-                                GwyDataField *mask,
-                                GwyMaskingType mode,
-                                gint col, gint row,
-                                gint width, gint height)
-{
-    gdouble S = -G_MAXDOUBLE;
-    gdouble *ecurve;
-    guint maxdiv = 0;
-
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(data_field), S);
-    g_return_val_if_fail(!mask || (GWY_IS_DATA_FIELD(mask)
-                                   && mask->xres == data_field->xres
-                                   && mask->yres == data_field->yres), S);
-    g_return_val_if_fail(col >= 0 && row >= 0
-                         && width >= 0 && height >= 0
-                         && col + width <= data_field->xres
-                         && row + height <= data_field->yres,
-                         S);
-
-    /* The result is the same, but it can be cached. */
-    if ((!mask || mode == GWY_MASK_IGNORE)
-        && row == 0 && col == 0
-        && width == data_field->xres && height == data_field->yres)
-        return gwy_data_field_get_entropy(data_field);
-
-    ecurve = calculate_entropy_at_scales(data_field, mask, mode,
-                                         col, row, width, height,
-                                         &maxdiv, &S);
-    g_free(ecurve);
-    return S;
-}
-
-static QuadTreeNode*
-quad_tree_node_new(const GwyXY *pt)
-{
-    QuadTreeNode *qtnode = g_slice_new(QuadTreeNode);
-    qtnode->u.pt.a = *pt;
-    qtnode->count = 1;
-    return qtnode;
-}
-
-static void
-quad_tree_add_node(QuadTreeNode *qtnode, const GwyXY *pt,
-                   GwyXY min, GwyXY max, guint maxdepth)
-{
-    QuadTreeNode *child;
-    GwyXY centre;
-    guint i;
-
-    /* We reached maximum allowed subdivision.  Just increase the count. */
-    if (!maxdepth) {
-        if (qtnode->count <= 2)
-            gwy_clear(&qtnode->u, 1);
-        qtnode->count++;
-        return;
-    }
-
-    /* We will descend into subtrees. */
-    centre.x = 0.5*(min.x + max.x);
-    centre.y = 0.5*(min.y + max.y);
-
-    /* If this node has just one point add the other there and we are done. */
-    if (qtnode->count == 1) {
-        qtnode->u.pt.b = *pt;
-        qtnode->count++;
-        return;
-    }
-
-    /* We will be recursing.  So if this node is a leaf start by making it
-     * non-leaf. */
-    if (qtnode->count == 2) {
-        GwyXY pta = qtnode->u.pt.a;
-        GwyXY ptb = qtnode->u.pt.b;
-        guint ia = (pta.x > centre.x) + 2*(pta.y > centre.y);
-        guint ib = (ptb.x > centre.x) + 2*(ptb.y > centre.y);
-
-        gwy_clear(&qtnode->u, 1);
-        child = qtnode->u.children[ia] = quad_tree_node_new(&pta);
-        /* Must distinguish between creating two child nodes and creating one
-         * two-point child node. */
-        if (ia == ib) {
-            child->u.pt.b = ptb;
-            child->count = 2;
-        }
-        else
-            qtnode->u.children[ib] = quad_tree_node_new(&ptb);
-    }
-
-    /* Add the new point to the appropriate child. */
-    i = (pt->x > centre.x) + 2*(pt->y > centre.y);
-    maxdepth--;
-    qtnode->count++;
-
-    if ((child = qtnode->u.children[i])) {
-        /* Recurse.  This will end either by reaching maxdepth=0 or by
-         * successful separation in the other branch of this conditon. */
-        if (i == 0)
-            quad_tree_add_node(child, pt, min, centre, maxdepth);
-        else if (i == 1) {
-            min.x = centre.x;
-            max.y = centre.y;
-            quad_tree_add_node(child, pt, min, max, maxdepth);
-        }
-        else if (i == 2) {
-            max.x = centre.x;
-            min.y = centre.y;
-            quad_tree_add_node(child, pt, min, max, maxdepth);
-        }
-        else
-            quad_tree_add_node(child, pt, centre, max, maxdepth);
-    }
-    else {
-        /* There is nothing here yet.  Add the point as a new leaf. */
-        qtnode->u.children[i] = quad_tree_node_new(pt);
-    }
-}
-
-static void
-quad_tree_add(QuadTree *qtree, const GwyXY *pt)
-{
-    if (G_LIKELY(qtree->root)) {
-        quad_tree_add_node(qtree->root, pt,
-                           qtree->min, qtree->max, qtree->maxdepth);
-    }
-    else
-        qtree->root = quad_tree_node_new(pt);
-}
-
-static void
-quad_tree_find_range(QuadTree *qtree,
-                     const gdouble *xdata, const gdouble *ydata, guint n)
-{
-    GwyXY min = { G_MAXDOUBLE, G_MAXDOUBLE };
-    GwyXY max = { -G_MAXDOUBLE, -G_MAXDOUBLE };
-    guint i;
-
-    for (i = 0; i < n; i++) {
-        gdouble x = xdata[i];
-        gdouble y = ydata[i];
-
-        if (x < min.x)
-            min.x = x;
-        if (x > max.x)
-            max.x = x;
-        if (y < min.y)
-            min.y = y;
-        if (y > max.y)
-            max.y = y;
-    }
-
-    qtree->min = min;
-    qtree->max = max;
-}
-
-static void
-quad_tree_node_free(QuadTreeNode *qtnode)
-{
-    guint i;
-
-    if (qtnode->count > 2) {
-        for (i = 0; i < G_N_ELEMENTS(qtnode->u.children); i++) {
-            if (qtnode->u.children[i])
-                quad_tree_node_free(qtnode->u.children[i]);
-        }
-    }
-    g_slice_free(QuadTreeNode, qtnode);
-}
-
-static void
-quad_tree_free(QuadTree *qtree)
-{
-    quad_tree_node_free(qtree->root);
-    g_free(qtree);
-}
-
-static QuadTree*
-quad_tree_new(const gdouble *xdata, const gdouble *ydata, guint n,
-              guint maxdepth)
-{
-    QuadTree *qtree;
-    guint i;
-
-    qtree = g_new0(QuadTree, 1);
-
-    if (!maxdepth)
-        maxdepth = 16;
-    qtree->maxdepth = maxdepth;
-
-    quad_tree_find_range(qtree, xdata, ydata, n);
-    if (!(qtree->min.x < qtree->max.x) || !(qtree->min.y < qtree->max.y)) {
-        qtree->degenerate = TRUE;
-        qtree->degenerateS = G_MAXDOUBLE;
-        return qtree;
-    }
-
-    /* Return explicit estimates for n < 4, making maxdiv at least 1 (with
-     * half-scales included, ecurve will have at least 3 points then). */
-    if (n == 2) {
-        qtree->degenerate = TRUE;
-        qtree->degenerateS = (log(qtree->max.x - qtree->min.x)
-                               + log(qtree->max.y - qtree->min.y));
-        return qtree;
-    }
-    if (n == 3) {
-        qtree->degenerate = TRUE;
-        qtree->degenerateS = (log(qtree->max.x - qtree->min.x)
-                               + log(qtree->max.y - qtree->min.y)
-                               + 0.5*log(1.5) - 2.0*G_LN2/3.0);
-        return qtree;
-    }
-
-    for (i = 0; i < n; i++) {
-        GwyXY pt = { xdata[i], ydata[i] };
-        quad_tree_add(qtree, &pt);
-    }
-
-    return qtree;
-}
-
-static gdouble
-quad_tree_node_half_scale_entropy(QuadTreeNode *qtnode)
-{
-    QuadTreeNode *child;
-    guint cnt[G_N_ELEMENTS(qtnode->u.children)] = { 0, 0, 0, 0 };
-    guint i;
-
-    for (i = 0; i < G_N_ELEMENTS(qtnode->u.children); i++) {
-        if ((child = qtnode->u.children[i]))
-            cnt[i] = child->count;
-    }
-    return 0.5*(gwy_xlnx_int(cnt[0] + cnt[1])
-                + gwy_xlnx_int(cnt[2] + cnt[3])
-                + gwy_xlnx_int(cnt[0] + cnt[2])
-                + gwy_xlnx_int(cnt[1] + cnt[3]));
+{
+    gwy_data_field_cdh(data_field, target_line, nstats);
+    gwy_data_line_multiply(target_line, -1.0);
+    gwy_data_line_add(target_line, 1.0);
 }
 
-static void
-quad_tree_node_entropies_at_scales(QuadTreeNode *qtnode, guint maxdepth,
-                                   gdouble *S, guint *unsplit)
+/**
+ * gwy_data_field_area_minkowski_boundary:
+ * @data_field: A data field.
+ * @target_line: A data line to store the distribution to.  It will be
+ *               resampled to requested width.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ * @nstats: The number of samples to take on the distribution function.  If
+ *          nonpositive, a suitable resolution is determined automatically.
+ *
+ * Calculates Minkowski boundary functional of a rectangular part of a data
+ * field.
+ *
+ * Boundary functional is calculated as the number of boundaries for each
+ * threshold value (the number of pixel sides where of neighouring pixels is
+ * ,white` and the other ,black`) divided by the total number of samples
+ * in the area.
+ **/
+void
+gwy_data_field_area_minkowski_boundary(GwyDataField *data_field,
+                                       GwyDataLine *target_line,
+                                       gint col, gint row,
+                                       gint width, gint height,
+                                       gint nstats)
 {
-    QuadTreeNode *child;
-    guint i;
+    GwySIUnit *fieldunit, *lineunit;
+    const gdouble *data;
+    gdouble *line;
+    gdouble min, max, q;
+    gint xres, i, j, k, k0, kr, kd;
 
-    /* Singular points contribute to p*ln(p) always with zero.  So we can stop
-     * recursion to finer subdivisions when count == 1. */
-    if (qtnode->count <= 1)
-        return;
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    g_return_if_fail(GWY_IS_DATA_LINE(target_line));
+    g_return_if_fail(col >= 0 && row >= 0
+                     && width >= 0 && height >= 0
+                     && col + width <= data_field->xres
+                     && row + height <= data_field->yres);
 
-    if (!maxdepth) {
-        S[0] += gwy_xlnx_int(qtnode->count);
-        return;
+    if (nstats < 1) {
+        nstats = floor(3.49*cbrt(width*height) + 0.5);
+        nstats = MAX(nstats, 2);
     }
 
-    if (qtnode->count == 2) {
-        unsplit[0]++;
+    gwy_data_line_resample(target_line, nstats, GWY_INTERPOLATION_NONE);
+    gwy_data_line_clear(target_line);
+    gwy_data_field_area_get_min_max(data_field, NULL,
+                                    col, row, width, height,
+                                    &min, &max);
+    /* There are no boundaries on a totally flat sufrace */
+    if (min == max || width == 0 || height == 0)
         return;
-    }
 
-    S[0] += gwy_xlnx_int(qtnode->count);
-    S++;
+    xres = data_field->xres;
+    q = nstats/(max - min);
+    line = target_line->data;
 
-    // Half-scale entropies we estimate as averages of horizontal and vertical
-    // binning.
-    S[0] += quad_tree_node_half_scale_entropy(qtnode);
-    S++;
+    for (i = 0; i < height-1; i++) {
+        kr = (gint)((data_field->data[i*xres + col] - min)*q);
+        for (j = 0; j < width-1; j++) {
+            data = data_field->data + (i + row)*xres + (col + j);
 
-    maxdepth--;
-    unsplit++;
-    for (i = 0; i < G_N_ELEMENTS(qtnode->u.children); i++) {
-        if ((child = qtnode->u.children[i]))
-            quad_tree_node_entropies_at_scales(child, maxdepth, S, unsplit);
-    }
-}
+            k0 = kr;
 
-static gdouble*
-quad_tree_entropies_at_scales(QuadTree *qtree, guint maxdepth)
-{
-    gdouble *S;
-    guint *unsplit;
-    guint i, n, npts;
-    gdouble Sscale;
-
-    if (!maxdepth)
-        maxdepth = qtree->maxdepth;
-
-    n = 2*maxdepth + 1;
-    S = g_new0(gdouble, n);
-    unsplit = g_new0(guint, maxdepth);
-    quad_tree_node_entropies_at_scales(qtree->root,
-                                       MIN(maxdepth, qtree->maxdepth),
-                                       S, unsplit);
-
-    for (i = 0; i < maxdepth; i++) {
-        if (unsplit[i])
-            add_estimated_unsplit_node_entropy(S + 2*i, 2*(maxdepth - i),
-                                               unsplit[i]);
+            kr = (gint)((data[1] - min)*q);
+            for (k = MAX(MIN(k0, kr), 0); k < MIN(MAX(k0, kr), nstats); k++)
+                line[k] += 1;
+
+            kd = (gint)((data[xres] - min)*q);
+            for (k = MAX(MIN(k0, kd), 0); k < MIN(MAX(k0, kd), nstats); k++)
+                line[k] += 1;
+        }
     }
-    g_free(unsplit);
 
-    npts = qtree->root->count;
-    Sscale = log(npts
-                 *(qtree->max.x - qtree->min.x)*(qtree->max.y - qtree->min.y));
-    for (i = 0; i < n; i++)
-        S[i] = Sscale - i*G_LN2 - S[i]/npts;
+    gwy_data_line_multiply(target_line, 1.0/(width*height));
+    gwy_data_line_set_real(target_line, max - min);
+    gwy_data_line_set_offset(target_line, min);
 
-    return S;
+    /* Set proper units */
+    fieldunit = gwy_data_field_get_si_unit_z(data_field);
+    lineunit = gwy_data_line_get_si_unit_x(target_line);
+    gwy_serializable_clone(G_OBJECT(fieldunit), G_OBJECT(lineunit));
+    lineunit = gwy_data_line_get_si_unit_y(target_line);
+    gwy_si_unit_set_from_string(lineunit, NULL);
 }
 
-static gdouble*
-calculate_entropy_2d_at_scales(GwyDataField *xfield,
-                               GwyDataField *yfield,
-                               guint *maxdiv,
-                               gdouble *S)
+/**
+ * gwy_data_field_minkowski_boundary:
+ * @data_field: A data field.
+ * @target_line: A data line to store the distribution to.  It will be
+ *               resampled to requested width.
+ * @nstats: The number of samples to take on the distribution function.  If
+ *          nonpositive, a suitable resolution is determined automatically.
+ *
+ * Calculates Minkowski boundary functional of a data field.
+ *
+ * See gwy_data_field_area_minkowski_boundary() for details.
+ **/
+void
+gwy_data_field_minkowski_boundary(GwyDataField *data_field,
+                                  GwyDataLine *target_line,
+                                  gint nstats)
 {
-    guint xres, yres, n, i;
-    gdouble *ecurve;
-    QuadTree *qtree;
-
-    xres = xfield->xres;
-    yres = xfield->yres;
-    n = xres*yres;
-
-    if (!*maxdiv) {
-        if (n >= 2)
-            *maxdiv = (guint)floor(1.5*log(n)/G_LN2 + 1e-12);
-        else
-            *maxdiv = 1;
-
-        /* We will run out of significant digits in coordinates after that. */
-        *maxdiv = MIN(*maxdiv, 50);
-    }
-
-    if (n < 2) {
-        ecurve = g_new(gdouble, *maxdiv+1);
-        for (i = 0; i <= *maxdiv; i++)
-            ecurve[i] = -G_MAXDOUBLE;
-        if (S)
-            *S = -G_MAXDOUBLE;
-        return ecurve;
-    }
-
-    qtree = quad_tree_new(xfield->data, yfield->data, n, *maxdiv);
-    ecurve = quad_tree_entropies_at_scales(qtree, *maxdiv);
-    if (S) {
-        if (qtree->degenerate)
-            *S = qtree->degenerateS;
-        else
-            *S = calculate_entropy_from_scaling(ecurve, 2*(*maxdiv));
-    }
-    quad_tree_free(qtree);
-
-    return ecurve;
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    gwy_data_field_area_minkowski_boundary(data_field, target_line,
+                                           0, 0,
+                                           data_field->xres, data_field->yres,
+                                           nstats);
 }
 
 /**
- * gwy_data_field_get_entropy_2d_at_scales:
- * @xfield: A data field containing the @x-coordinates.
- * @yfield: A data field containing the @y-coordinates.
- * @target_line: A data line to store the result to.  It will be resampled to
- *               @maxdiv+1 items.
- * @maxdiv: Maximum number of divisions of the value range.  Pass zero to
- *          choose it automatically.
- *
- * Calculates estimates of entropy of two-dimensional point cloud at various
- * scales.
+ * gwy_data_field_area_minkowski_euler:
+ * @data_field: A data field.
+ * @target_line: A data line to store the distribution to.  It will be
+ *               resampled to requested width.
+ * @col: Upper-left column coordinate.
+ * @row: Upper-left row coordinate.
+ * @width: Area width (number of columns).
+ * @height: Area height (number of rows).
+ * @nstats: The number of samples to take on the distribution function.  If
+ *          nonpositive, a suitable resolution is determined automatically.
  *
- * Returns: The best estimate, as gwy_data_field_get_entropy_2d().
+ * Calculates Minkowski connectivity functional (Euler characteristics) of
+ * a rectangular part of a data field.
  *
- * Since: 2.44
+ * Connectivity functional is calculated as the number connected areas of
+ * pixels above threhsold (,white`) minus the number of connected areas of
+ * pixels below threhsold (,black`) for each threshold value, divided by the
+ * total number of samples in the area.
  **/
-gdouble
-gwy_data_field_get_entropy_2d_at_scales(GwyDataField *xfield,
-                                        GwyDataField *yfield,
-                                        GwyDataLine *target_line,
-                                        gint maxdiv)
+void
+gwy_data_field_area_minkowski_euler(GwyDataField *data_field,
+                                    GwyDataLine *target_line,
+                                    gint col, gint row,
+                                    gint width, gint height,
+                                    gint nstats)
 {
-    GwySIUnit *lineunit;
-    guint umaxdiv = (maxdiv > 0 ? maxdiv/2 : 0);
-    gdouble *ecurve;
-    gdouble xmin, xmax, ymin, ymax, S = -G_MAXDOUBLE;
+    GwySIUnit *fieldunit, *lineunit;
+    GwyDataLine *tmp_line;
     gint i;
 
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(xfield), S);
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(yfield), S);
-    g_return_val_if_fail(GWY_IS_DATA_LINE(target_line), S);
-    g_return_val_if_fail(xfield->xres == yfield->xres, S);
-    g_return_val_if_fail(xfield->yres == yfield->yres, S);
-
-    ecurve = calculate_entropy_2d_at_scales(xfield, yfield, &umaxdiv, &S);
-    maxdiv = maxdiv ? maxdiv : 2*umaxdiv + 1;
-    gwy_data_line_resample(target_line, maxdiv, GWY_INTERPOLATION_NONE);
-    target_line->real = maxdiv*G_LN2;
-    for (i = 0; i < maxdiv; i++)
-        target_line->data[maxdiv-1 - i] = ecurve[i];
-    g_free(ecurve);
-
-    gwy_data_field_get_min_max(xfield, &xmin, &xmax);
-    gwy_data_field_get_min_max(xfield, &ymin, &ymax);
-    if ((xmax > xmin) && (ymax > ymin))
-        target_line->off = (log((xmax - xmin)*(ymax - ymin))
-                            - (maxdiv - 0.5)*G_LN2);
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    g_return_if_fail(GWY_IS_DATA_LINE(target_line));
+    g_return_if_fail(col >= 0 && row >= 0
+                     && width >= 0 && height >= 0
+                     && col + width <= data_field->xres
+                     && row + height <= data_field->yres);
+
+    if (nstats < 1) {
+        nstats = floor(3.49*cbrt(width*height) + 0.5);
+        nstats = MAX(nstats, 2);
+    }
+
+    gwy_data_line_resample(target_line, nstats, GWY_INTERPOLATION_NONE);
+    tmp_line = gwy_data_line_new_alike(target_line, FALSE);
+
+    gwy_data_field_area_grains_tgnd(data_field, target_line,
+                                    col, row, width, height,
+                                    FALSE, nstats);
+    gwy_data_field_area_grains_tgnd(data_field, tmp_line,
+                                    col, row, width, height,
+                                    TRUE, nstats);
+
+    for (i = 0; i < nstats; i++)
+        target_line->data[i] -= tmp_line->data[nstats-1 - i];
+    g_object_unref(tmp_line);
+
+    gwy_data_line_multiply(target_line, 1.0/(width*height));
+    gwy_data_line_invert(target_line, TRUE, FALSE);
 
+    /* Set proper units */
+    fieldunit = gwy_data_field_get_si_unit_z(data_field);
     lineunit = gwy_data_line_get_si_unit_x(target_line);
-    gwy_si_unit_set_from_string(lineunit, NULL);
+    gwy_serializable_clone(G_OBJECT(fieldunit), G_OBJECT(lineunit));
     lineunit = gwy_data_line_get_si_unit_y(target_line);
     gwy_si_unit_set_from_string(lineunit, NULL);
-
-    return S;
 }
 
 /**
- * gwy_data_field_get_entropy_2d:
- * @xfield: A data field containing the @x-coordinates.
- * @yfield: A data field containing the @y-coordinates.
- *
- * Computes the entropy of a two-dimensional point cloud.
- *
- * Each pair of corresponding @xfield and @yfield pixels is assumed to
- * represent the coordinates (@x, at y) of a point in plane.  Hence they must have
- * the same dimensions.
+ * gwy_data_field_minkowski_euler:
+ * @data_field: A data field.
+ * @target_line: A data line to store the distribution to.  It will be
+ *               resampled to requested width.
+ * @nstats: The number of samples to take on the distribution function.  If
+ *          nonpositive, a suitable resolution is determined automatically.
  *
- * Returns: The two-dimensional distribution entropy.
+ * Calculates Minkowski connectivity functional (Euler characteristics) of
+ * a data field.
  *
- * Since: 2.44
+ * See gwy_data_field_area_minkowski_euler() for details.
  **/
-gdouble
-gwy_data_field_get_entropy_2d(GwyDataField *xfield,
-                              GwyDataField *yfield)
+void
+gwy_data_field_minkowski_euler(GwyDataField *data_field,
+                               GwyDataLine *target_line,
+                               gint nstats)
 {
-    gdouble *ecurve;
-    guint maxdiv = 0;
-    gdouble S = -G_MAXDOUBLE;
-
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(xfield), S);
-    g_return_val_if_fail(GWY_IS_DATA_FIELD(yfield), S);
-    g_return_val_if_fail(xfield->xres == yfield->xres, S);
-    g_return_val_if_fail(xfield->yres == yfield->yres, S);
-
-    ecurve = calculate_entropy_2d_at_scales(xfield, yfield, &maxdiv, &S);
-    g_free(ecurve);
-
-    return S;
+    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
+    gwy_data_field_area_minkowski_euler(data_field, target_line,
+                                        0, 0,
+                                        data_field->xres, data_field->yres,
+                                        nstats);
 }
 
 /**
@@ -6389,199 +3044,6 @@ gwy_data_field_count_minima(GwyDataField *data_field)
     return ngrains;
 }
 
-/**
- * gwy_data_field_angular_average:
- * @data_field: A data field.
- * @target_line: A data line to store the distribution to.  It will be
- *               resampled to @nstats size.
- * @mask: Mask of pixels to include from/exclude in the averaging, or %NULL
- *        for full @data_field.
- * @masking: Masking mode to use.  See the introduction for description of
- *           masking modes.
- * @x: X-coordinate of the averaging disc origin, in real coordinates
- *     including offsets.
- * @y: Y-coordinate of the averaging disc origin, in real coordinates
- *     including offsets.
- * @r: Radius, in real coordinates.  It determines the real length of the
- *     resulting line.
- * @nstats: The number of samples the resulting line should have.  A
- *          non-positive value means the sampling will be determined
- *          automatically.
- *
- * Performs angular averaging of a part of a data field.
- *
- * The result of such averaging is an radial profile, starting from the disc
- * centre.
- *
- * The function does not guarantee that @target_line will have exactly @nstats
- * samples upon return.  A cmaller number of samples than requested may be
- * calculated for instance if either central or outer part of the disc is
- * excluded by masking.
- *
- * Since: 2.42
- **/
-void
-gwy_data_field_angular_average(GwyDataField *data_field,
-                               GwyDataLine *target_line,
-                               GwyDataField *mask,
-                               GwyMaskingType masking,
-                               gdouble x,
-                               gdouble y,
-                               gdouble r,
-                               gint nstats)
-{
-    gint ifrom, ito, jfrom, jto, i, j, k, kfrom, kto, xres, yres;
-    gdouble xreal, yreal, dx, dy, xoff, yoff, h, rr;
-    const gdouble *d, *m;
-    gdouble *target, *weight;
-
-    g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
-    g_return_if_fail(GWY_IS_DATA_LINE(target_line));
-    g_return_if_fail(r >= 0.0);
-    xres = data_field->xres;
-    yres = data_field->yres;
-    if (masking == GWY_MASK_IGNORE)
-        mask = NULL;
-    else if (!mask)
-        masking = GWY_MASK_IGNORE;
-
-    if (mask) {
-        g_return_if_fail(GWY_IS_DATA_FIELD(mask));
-        g_return_if_fail(mask->xres == xres);
-        g_return_if_fail(mask->yres == yres);
-    }
-
-    xreal = data_field->xreal;
-    yreal = data_field->yreal;
-    xoff = data_field->xoff;
-    yoff = data_field->yoff;
-    g_return_if_fail(x >= xoff && x <= xoff + xreal);
-    g_return_if_fail(y >= yoff && y <= yoff + yreal);
-    /* Just for integer overflow; we limit i and j ranges explicitly later. */
-    r = MIN(r, hypot(xreal, yreal));
-    x -= xoff;
-    y -= yoff;
-
-    dx = xreal/xres;
-    dy = yreal/yres;
-
-    /* Prefer sampling close to the shorter step. */
-    if (nstats < 1) {
-        h = 2.0*dx*dy/(dx + dy);
-        nstats = GWY_ROUND(r/h);
-        nstats = MAX(nstats, 1);
-    }
-    h = r/nstats;
-
-    d = data_field->data;
-    m = mask ? mask->data : NULL;
-
-    gwy_data_line_resample(target_line, nstats, GWY_INTERPOLATION_NONE);
-    gwy_data_line_clear(target_line);
-    gwy_data_field_copy_units_to_data_line(data_field, target_line);
-    target_line->real = h*nstats;
-    target_line->off = 0.0;
-    target = target_line->data;
-    /* Just return something for single-point lines. */
-    if (nstats < 2 || r == 0.0) {
-        /* NB: gwy_data_field_get_dval_real() does not use offsets. */
-        target[0] = gwy_data_field_get_dval_real(data_field, x, y,
-                                                 GWY_INTERPOLATION_ROUND);
-        return;
-    }
-
-    ifrom = (gint)floor(gwy_data_field_rtoi(data_field, y - r));
-    ifrom = MAX(ifrom, 0);
-    ito = (gint)ceil(gwy_data_field_rtoi(data_field, y + r));
-    ito = MIN(ito, yres-1);
-
-    jfrom = (gint)floor(gwy_data_field_rtoj(data_field, x - r));
-    jfrom = MAX(jfrom, 0);
-    jto = (gint)ceil(gwy_data_field_rtoj(data_field, x + r));
-    jto = MIN(jto, xres-1);
-
-    weight = g_new0(gdouble, nstats);
-    for (i = ifrom; i <= ito; i++) {
-        gdouble yy = (i + 0.5)*dy - y;
-        for (j = jfrom; j <= jto; j++) {
-            gdouble xx = (j + 0.5)*dx - x;
-            gdouble v = d[i*xres + j];
-
-            if ((masking == GWY_MASK_INCLUDE && m[i*xres + j] <= 0.0)
-                || (masking == GWY_MASK_EXCLUDE && m[i*xres + j] >= 1.0))
-                continue;
-
-            rr = sqrt(xx*xx + yy*yy)/h;
-            k = floor(rr);
-            if (k+1 >= nstats) {
-                if (k+1 == nstats) {
-                    target[k] += v;
-                    weight[k] += 1.0;
-                }
-                continue;
-            }
-
-            rr -= k;
-            if (rr <= 0.5)
-                rr = 2.0*rr*rr;
-            else
-                rr = 1.0 - 2.0*(1.0 - rr)*(1.0 - rr);
-
-            target[k] += (1.0 - rr)*v;
-            target[k+1] += rr*v;
-            weight[k] += 1.0 - rr;
-            weight[k+1] += rr;
-        }
-    }
-
-    /* Get rid of initial and trailing no-data segment. */
-    for (kfrom = 0; kfrom < nstats; kfrom++) {
-        if (weight[kfrom])
-            break;
-    }
-    for (kto = nstats-1; kto > kfrom; kto--) {
-        if (weight[kto])
-            break;
-    }
-    if (kto - kfrom < 2) {
-        /* XXX: This is not correct.  We do not care. */
-        target_line->real = h;
-        target[0] = gwy_data_field_get_dval_real(data_field, x, y,
-                                                 GWY_INTERPOLATION_ROUND);
-        return;
-    }
-
-    if (kfrom != 0 || kto != nstats-1) {
-        nstats = kto+1 - kfrom;
-        gwy_data_line_resize(target_line, kfrom, kto+1);
-        target = target_line->data;
-        target_line->off = kfrom*h;
-        memmove(weight, weight + kfrom, nstats*sizeof(gdouble));
-    }
-    g_assert(weight[0]);
-    g_assert(weight[nstats-1]);
-
-    /* Fill holes where we have no weight, this can occur near the start if
-     * large nstats is requested. */
-    kfrom = -1;
-    for (k = 0; k < nstats; k++) {
-        if (weight[k]) {
-            target[k] /= weight[k];
-            if (kfrom+1 != k) {
-                gdouble first = target[kfrom];
-                gdouble last = target[k];
-                for (j = kfrom+1; j < k; j++) {
-                    gdouble w = (j - kfrom)/(gdouble)(k - kfrom);
-                    target[j] = w*last + (1.0 - w)*first;
-                }
-            }
-            kfrom = k;
-        }
-    }
-
-    g_free(weight);
-}
-
 /************************** Documentation ****************************/
 
 /**
diff --git a/libprocess/stats.h b/libprocess/stats.h
index dee0cb1..421055e 100644
--- a/libprocess/stats.h
+++ b/libprocess/stats.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: stats.h 18844 2016-08-16 15:36:42Z yeti-dn $
+ *  @(#) $Id: stats.h 19788 2017-05-22 12:59:28Z yeti-dn $
  *  Copyright (C) 2003-2009 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -196,6 +196,7 @@ void    gwy_data_field_get_stats            (GwyDataField *data_field,
                                              gdouble *rms,
                                              gdouble *skew,
                                              gdouble *kurtosis);
+
 #ifndef GWY_DISABLE_DEPRECATED
 void    gwy_data_field_area_get_stats       (GwyDataField *data_field,
                                              GwyDataField *mask,
@@ -209,231 +210,297 @@ void    gwy_data_field_area_get_stats       (GwyDataField *data_field,
                                              gdouble *skew,
                                              gdouble *kurtosis);
 #endif
-void    gwy_data_field_area_get_stats_mask  (GwyDataField *data_field,
-                                             GwyDataField *mask,
-                                             GwyMaskingType mode,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height,
-                                             gdouble *avg,
-                                             gdouble *ra,
-                                             gdouble *rms,
-                                             gdouble *skew,
-                                             gdouble *kurtosis);
-void    gwy_data_field_area_count_in_range  (GwyDataField *data_field,
-                                             GwyDataField *mask,
-                                             gint col, gint row,
-                                             gint width, gint height,
-                                             gdouble below,
-                                             gdouble above,
-                                             gint *nbelow,
-                                             gint *nabove);
-void    gwy_data_field_area_dh              (GwyDataField *data_field,
-                                             GwyDataField *mask,
-                                             GwyDataLine *target_line,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height,
-                                             gint nstats);
-void    gwy_data_field_dh                   (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             gint nstats);
-void    gwy_data_field_area_cdh             (GwyDataField *data_field,
-                                             GwyDataField *mask,
-                                             GwyDataLine *target_line,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height,
-                                             gint nstats);
-void    gwy_data_field_cdh                  (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             gint nstats);
-void    gwy_data_field_area_da              (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height,
-                                             GwyOrientation orientation,
-                                             gint nstats);
-void    gwy_data_field_da                   (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             GwyOrientation orientation,
-                                             gint nstats);
-void    gwy_data_field_area_cda             (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height,
-                                             GwyOrientation orientation,
-                                             gint nstats);
-void    gwy_data_field_cda                  (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             GwyOrientation orientation,
-                                             gint nstats);
-void    gwy_data_field_area_acf             (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height,
-                                             GwyOrientation orientation,
-                                             GwyInterpolationType interpolation,
-                                             gint nstats);
-void    gwy_data_field_acf                  (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             GwyOrientation orientation,
-                                             GwyInterpolationType interpolation,
-                                             gint nstats);
-void    gwy_data_field_area_hhcf            (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height,
-                                             GwyOrientation orientation,
-                                             GwyInterpolationType interpolation,
-                                             gint nstats);
-void    gwy_data_field_hhcf                 (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             GwyOrientation orientation,
-                                             GwyInterpolationType interpolation,
-                                             gint nstats);
-void    gwy_data_field_area_psdf            (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height,
-                                             GwyOrientation orientation,
-                                             GwyInterpolationType interpolation,
-                                             GwyWindowingType windowing,
-                                             gint nstats);
-void    gwy_data_field_psdf                 (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             GwyOrientation orientation,
-                                             GwyInterpolationType interpolation,
-                                             GwyWindowingType windowing,
-                                             gint nstats);
-void    gwy_data_field_area_rpsdf           (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height,
-                                             GwyInterpolationType interpolation,
-                                             GwyWindowingType windowing,
-                                             gint nstats);
-void    gwy_data_field_rpsdf                (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             GwyInterpolationType interpolation,
-                                             GwyWindowingType windowing,
-                                             gint nstats);
-void    gwy_data_field_area_2dacf           (GwyDataField *data_field,
-                                             GwyDataField *target_field,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height,
-                                             gint xrange,
-                                             gint yrange);
-void    gwy_data_field_2dacf                (GwyDataField *data_field,
-                                             GwyDataField *target_field);
-void    gwy_data_field_area_racf            (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height,
-                                             gint nstats);
-void    gwy_data_field_racf                 (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             gint nstats);
-void    gwy_data_field_area_minkowski_volume(GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             gint col, gint row,
-                                             gint width, gint height,
-                                             gint nstats);
-void    gwy_data_field_minkowski_volume     (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             gint nstats);
-void  gwy_data_field_area_minkowski_boundary(GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             gint col, gint row,
-                                             gint width, gint height,
-                                             gint nstats);
-void    gwy_data_field_minkowski_boundary   (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             gint nstats);
-void    gwy_data_field_area_minkowski_euler (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             gint col, gint row,
-                                             gint width, gint height,
-                                             gint nstats);
-void    gwy_data_field_minkowski_euler      (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             gint nstats);
-void    gwy_data_field_slope_distribution   (GwyDataField *data_field,
-                                             GwyDataLine *derdist,
-                                             gint kernel_size);
-void    gwy_data_field_get_normal_coeffs    (GwyDataField *data_field,
-                                             gdouble *nx,
-                                             gdouble *ny,
-                                             gdouble *nz,
-                                             gboolean normalize1);
-void   gwy_data_field_area_get_normal_coeffs(GwyDataField *data_field,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height,
-                                             gdouble *nx,
-                                             gdouble *ny,
-                                             gdouble *nz,
-                                             gboolean normalize1);
-void    gwy_data_field_area_get_inclination (GwyDataField *data_field,
-                                             gint col,
-                                             gint row,
-                                             gint width,
-                                             gint height,
-                                             gdouble *theta,
-                                             gdouble *phi);
-void    gwy_data_field_get_inclination      (GwyDataField *data_field,
-                                             gdouble *theta,
-                                             gdouble *phi);
-void    gwy_data_field_area_get_line_stats  (GwyDataField *data_field,
-                                             GwyDataField *mask,
-                                             GwyDataLine *target_line,
-                                             gint col, gint row,
-                                             gint width, gint height,
-                                             GwyLineStatQuantity quantity,
-                                             GwyOrientation orientation);
-void    gwy_data_field_get_line_stats_mask  (GwyDataField *data_field,
-                                             GwyDataField *mask,
-                                             GwyMaskingType masking,
-                                             GwyDataLine *target_line,
-                                             GwyDataLine *weights,
-                                             gint col, gint row,
-                                             gint width, gint height,
-                                             GwyLineStatQuantity quantity,
-                                             GwyOrientation orientation);
-void    gwy_data_field_get_line_stats       (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             GwyLineStatQuantity quantity,
-                                             GwyOrientation orientation);
-guint   gwy_data_field_count_maxima         (GwyDataField *data_field);
-guint   gwy_data_field_count_minima         (GwyDataField *data_field);
-void    gwy_data_field_angular_average      (GwyDataField *data_field,
-                                             GwyDataLine *target_line,
-                                             GwyDataField *mask,
-                                             GwyMaskingType masking,
-                                             gdouble x,
-                                             gdouble y,
-                                             gdouble r,
-                                             gint nstats);
+
+void         gwy_data_field_area_get_stats_mask    (GwyDataField *data_field,
+                                                    GwyDataField *mask,
+                                                    GwyMaskingType mode,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    gdouble *avg,
+                                                    gdouble *ra,
+                                                    gdouble *rms,
+                                                    gdouble *skew,
+                                                    gdouble *kurtosis);
+void         gwy_data_field_area_count_in_range    (GwyDataField *data_field,
+                                                    GwyDataField *mask,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    gdouble below,
+                                                    gdouble above,
+                                                    gint *nbelow,
+                                                    gint *nabove);
+void         gwy_data_field_area_dh                (GwyDataField *data_field,
+                                                    GwyDataField *mask,
+                                                    GwyDataLine *target_line,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    gint nstats);
+void         gwy_data_field_dh                     (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    gint nstats);
+void         gwy_data_field_area_cdh               (GwyDataField *data_field,
+                                                    GwyDataField *mask,
+                                                    GwyDataLine *target_line,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    gint nstats);
+void         gwy_data_field_cdh                    (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    gint nstats);
+void         gwy_data_field_area_da                (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    GwyOrientation orientation,
+                                                    gint nstats);
+void         gwy_data_field_area_da_mask           (GwyDataField *data_field,
+                                                    GwyDataField *mask,
+                                                    GwyDataLine *target_line,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    GwyOrientation orientation,
+                                                    gint nstats);
+void         gwy_data_field_da                     (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    GwyOrientation orientation,
+                                                    gint nstats);
+void         gwy_data_field_area_cda               (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    GwyOrientation orientation,
+                                                    gint nstats);
+void         gwy_data_field_area_cda_mask          (GwyDataField *data_field,
+                                                    GwyDataField *mask,
+                                                    GwyDataLine *target_line,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    GwyOrientation orientation,
+                                                    gint nstats);
+void         gwy_data_field_cda                    (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    GwyOrientation orientation,
+                                                    gint nstats);
+void         gwy_data_field_area_acf               (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    GwyOrientation orientation,
+                                                    GwyInterpolationType interpolation,
+                                                    gint nstats);
+void         gwy_data_field_acf                    (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    GwyOrientation orientation,
+                                                    GwyInterpolationType interpolation,
+                                                    gint nstats);
+GwyDataLine* gwy_data_field_area_row_acf           (GwyDataField *field,
+                                                    GwyDataField *mask,
+                                                    GwyMaskingType masking,
+                                                    guint col,
+                                                    guint row,
+                                                    guint width,
+                                                    guint height,
+                                                    guint level,
+                                                    GwyDataLine *weights);
+void         gwy_data_field_area_hhcf              (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    GwyOrientation orientation,
+                                                    GwyInterpolationType interpolation,
+                                                    gint nstats);
+void         gwy_data_field_hhcf                   (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    GwyOrientation orientation,
+                                                    GwyInterpolationType interpolation,
+                                                    gint nstats);
+GwyDataLine* gwy_data_field_area_row_hhcf          (GwyDataField *field,
+                                                    GwyDataField *mask,
+                                                    GwyMaskingType masking,
+                                                    guint col,
+                                                    guint row,
+                                                    guint width,
+                                                    guint height,
+                                                    guint level,
+                                                    GwyDataLine *weights);
+void         gwy_data_field_area_psdf              (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    GwyOrientation orientation,
+                                                    GwyInterpolationType interpolation,
+                                                    GwyWindowingType windowing,
+                                                    gint nstats);
+void         gwy_data_field_psdf                   (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    GwyOrientation orientation,
+                                                    GwyInterpolationType interpolation,
+                                                    GwyWindowingType windowing,
+                                                    gint nstats);
+GwyDataLine* gwy_data_field_area_row_psdf          (GwyDataField *field,
+                                                    GwyDataField *mask,
+                                                    GwyMaskingType masking,
+                                                    guint col,
+                                                    guint row,
+                                                    guint width,
+                                                    guint height,
+                                                    GwyWindowingType windowing,
+                                                    guint level);
+void         gwy_data_field_area_rpsdf             (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    GwyInterpolationType interpolation,
+                                                    GwyWindowingType windowing,
+                                                    gint nstats);
+void         gwy_data_field_rpsdf                  (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    GwyInterpolationType interpolation,
+                                                    GwyWindowingType windowing,
+                                                    gint nstats);
+GwyDataLine* gwy_data_field_area_row_asg           (GwyDataField *field,
+                                                    GwyDataField *mask,
+                                                    GwyMaskingType masking,
+                                                    guint col,
+                                                    guint row,
+                                                    guint width,
+                                                    guint height,
+                                                    guint level);
+void         gwy_data_field_area_2dacf             (GwyDataField *data_field,
+                                                    GwyDataField *target_field,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    gint xrange,
+                                                    gint yrange);
+void         gwy_data_field_2dacf                  (GwyDataField *data_field,
+                                                    GwyDataField *target_field);
+void         gwy_data_field_area_racf              (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    gint nstats);
+void         gwy_data_field_racf                   (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    gint nstats);
+void         gwy_data_field_area_minkowski_volume  (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    gint nstats);
+void         gwy_data_field_minkowski_volume       (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    gint nstats);
+void         gwy_data_field_area_minkowski_boundary(GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    gint nstats);
+void         gwy_data_field_minkowski_boundary     (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    gint nstats);
+void         gwy_data_field_area_minkowski_euler   (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    gint nstats);
+void         gwy_data_field_minkowski_euler        (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    gint nstats);
+void         gwy_data_field_slope_distribution     (GwyDataField *data_field,
+                                                    GwyDataLine *derdist,
+                                                    gint kernel_size);
+void         gwy_data_field_get_normal_coeffs      (GwyDataField *data_field,
+                                                    gdouble *nx,
+                                                    gdouble *ny,
+                                                    gdouble *nz,
+                                                    gboolean normalize1);
+void         gwy_data_field_area_get_normal_coeffs (GwyDataField *data_field,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    gdouble *nx,
+                                                    gdouble *ny,
+                                                    gdouble *nz,
+                                                    gboolean normalize1);
+void         gwy_data_field_area_get_inclination   (GwyDataField *data_field,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    gdouble *theta,
+                                                    gdouble *phi);
+void         gwy_data_field_get_inclination        (GwyDataField *data_field,
+                                                    gdouble *theta,
+                                                    gdouble *phi);
+void         gwy_data_field_area_get_line_stats    (GwyDataField *data_field,
+                                                    GwyDataField *mask,
+                                                    GwyDataLine *target_line,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    GwyLineStatQuantity quantity,
+                                                    GwyOrientation orientation);
+void         gwy_data_field_get_line_stats_mask    (GwyDataField *data_field,
+                                                    GwyDataField *mask,
+                                                    GwyMaskingType masking,
+                                                    GwyDataLine *target_line,
+                                                    GwyDataLine *weights,
+                                                    gint col,
+                                                    gint row,
+                                                    gint width,
+                                                    gint height,
+                                                    GwyLineStatQuantity quantity,
+                                                    GwyOrientation orientation);
+void         gwy_data_field_get_line_stats         (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    GwyLineStatQuantity quantity,
+                                                    GwyOrientation orientation);
+guint        gwy_data_field_count_maxima           (GwyDataField *data_field);
+guint        gwy_data_field_count_minima           (GwyDataField *data_field);
+void         gwy_data_field_angular_average        (GwyDataField *data_field,
+                                                    GwyDataLine *target_line,
+                                                    GwyDataField *mask,
+                                                    GwyMaskingType masking,
+                                                    gdouble x,
+                                                    gdouble y,
+                                                    gdouble r,
+                                                    gint nstats);
 
 G_END_DECLS
 
diff --git a/libprocess/stats_uncertainty.c b/libprocess/stats_uncertainty.c
index ff8f75b..16743e5 100644
--- a/libprocess/stats_uncertainty.c
+++ b/libprocess/stats_uncertainty.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: stats_uncertainty.c 19216 2016-11-09 10:39:06Z yeti-dn $
+ *  @(#) $Id: stats_uncertainty.c 19692 2017-05-03 17:20:06Z yeti-dn $
  *  Copyright (C) 2003-2009 Anna Campbellova
  *  E-mail: acampbellova at cmi.cz.
  *
@@ -22,10 +22,6 @@
 #include "config.h"
 #include <string.h>
 
-#ifdef HAVE_FFTW3
-#include <fftw3.h>
-#endif
-
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
 #include <libprocess/datafield.h>
@@ -37,28 +33,6 @@
 #include <libprocess/inttrans.h>
 #include <libprocess/simplefft.h>
 #include "gwyprocessinternal.h"
-#include "monte-carlo-unc.h"
-#include "wrappers.h"
-
-/* XXX: This is just an example.   Does not use any actual uncertainties. */
-G_GNUC_UNUSED
-static void
-_gwy_data_field_area_min_max_unc(GwyDataField *field,
-                                 G_GNUC_UNUSED GwyDataField *uncz_field,
-                                 GwyDataField *mask, GwyMaskingType mode,
-                                 gint col, gint row,
-                                 gint width, gint height,
-                                 gdouble *min, gdouble *max)
-{
-    GwyFieldPart fpart = { col, row, width, height };
-    GwyFieldUncertainties unc = { 1.0 };
-    gdouble results[2];
-
-    _gwy_data_field_unc_scalar(field, mask, mode, &fpart, NULL, results, 2,
-                               &_gwy_data_field_get_min_max, &unc);
-    *min = results[0];
-    *max = results[1];
-}
 
 /**
  * gwy_data_field_get_max_uncertainty:
diff --git a/libprocess/surface.c b/libprocess/surface.c
index 25124b0..168e35e 100644
--- a/libprocess/surface.c
+++ b/libprocess/surface.c
@@ -1,6 +1,6 @@
 /*
- *  $Id: surface.c 19186 2016-11-06 18:10:10Z yeti-dn $
- *  Copyright (C) 2011-2016 David Nečas (Yeti).
+ *  $Id: surface.c 20128 2017-08-01 11:19:59Z yeti-dn $
+ *  Copyright (C) 2011-2017 David Nečas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -25,6 +25,7 @@
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
 #include <libgwyddion/gwymd5.h>
+#include <libgwyddion/gwyrandgenset.h>
 #include <libgwyddion/gwydebugobjects.h>
 #include <libprocess/surface.h>
 #include <libprocess/stats.h>
@@ -50,7 +51,7 @@ static GObject*    gwy_surface_duplicate_real   (GObject *serializable);
 static void        gwy_surface_clone_real       (GObject *destination,
                                                  GObject *source);
 static void        copy_info                    (GwySurface *dest,
-                                                 const GwySurface *src);
+                                                 GwySurface *src);
 static void        ensure_ranges                (GwySurface *surface);
 static void        ensure_checksum              (GwySurface *surface);
 
@@ -121,17 +122,6 @@ free_data(GwySurface *surface)
 }
 
 static void
-ensure_units(GwySurface *surface)
-{
-    Surface *priv = surface->priv;
-
-    if (!priv->si_unit_xy)
-        priv->si_unit_xy = gwy_si_unit_new(NULL);
-    if (!priv->si_unit_z)
-        priv->si_unit_z = gwy_si_unit_new(NULL);
-}
-
-static void
 gwy_surface_finalize(GObject *object)
 {
     GwySurface *surface = GWY_SURFACE(object);
@@ -154,16 +144,18 @@ gwy_surface_serialize(GObject *obj,
 {
     GwySurface *surface;
     guint32 datasize;
+    gpointer pxyunit, pzunit;
 
     g_return_val_if_fail(GWY_IS_SURFACE(obj), NULL);
 
     surface = GWY_SURFACE(obj);
-    ensure_units(surface);
     datasize = 3*surface->n;
+    pxyunit = unit_pointer_if_nonempty(surface->priv->si_unit_xy);
+    pzunit = unit_pointer_if_nonempty(surface->priv->si_unit_z);
     {
         GwySerializeSpec spec[] = {
-            { 'o', "si_unit_xy", &surface->priv->si_unit_xy, NULL, },
-            { 'o', "si_unit_z", &surface->priv->si_unit_z, NULL, },
+            { 'o', "si_unit_xy", pxyunit, NULL, },
+            { 'o', "si_unit_z", pzunit, NULL, },
             { 'D', "data", &surface->data, &datasize, },
         };
         return gwy_serialize_pack_object_struct(buffer,
@@ -177,16 +169,18 @@ gwy_surface_get_size(GObject *obj)
 {
     GwySurface *surface;
     guint32 datasize;
+    gpointer pxyunit, pzunit;
 
     g_return_val_if_fail(GWY_IS_SURFACE(obj), 0);
 
     surface = GWY_SURFACE(obj);
-    ensure_units(surface);
     datasize = 3*surface->n;
+    pxyunit = unit_pointer_if_nonempty(surface->priv->si_unit_xy);
+    pzunit = unit_pointer_if_nonempty(surface->priv->si_unit_z);
     {
         GwySerializeSpec spec[] = {
-            { 'o', "si_unit_xy", &surface->priv->si_unit_xy, NULL, },
-            { 'o', "si_unit_z", &surface->priv->si_unit_z, NULL, },
+            { 'o', "si_unit_xy", pxyunit, NULL, },
+            { 'o', "si_unit_z", pzunit, NULL, },
             { 'D', "data", &surface->data, &datasize, },
         };
         return gwy_serialize_get_struct_size(GWY_SURFACE_TYPE_NAME,
@@ -279,31 +273,14 @@ gwy_surface_clone_real(GObject *source, GObject *copy)
 }
 
 static void
-copy_info(GwySurface *dest,
-          const GwySurface *src)
+copy_info(GwySurface *dest, GwySurface *src)
 {
     Surface *dpriv = dest->priv, *spriv = src->priv;
 
-    /* SI Units can be NULL */
-    if (spriv->si_unit_xy && dpriv->si_unit_xy)
-        gwy_serializable_clone(G_OBJECT(spriv->si_unit_xy),
-                               G_OBJECT(dpriv->si_unit_xy));
-    else if (spriv->si_unit_xy && !dpriv->si_unit_xy)
-        dpriv->si_unit_xy = gwy_si_unit_duplicate(spriv->si_unit_xy);
-    else if (!spriv->si_unit_xy && dpriv->si_unit_xy)
-        GWY_OBJECT_UNREF(dpriv->si_unit_xy);
-
-    if (spriv->si_unit_z && dpriv->si_unit_z)
-        gwy_serializable_clone(G_OBJECT(spriv->si_unit_z),
-                               G_OBJECT(dpriv->si_unit_z));
-    else if (spriv->si_unit_z && !dpriv->si_unit_z)
-        dpriv->si_unit_z = gwy_si_unit_duplicate(spriv->si_unit_z);
-    else if (!spriv->si_unit_z && dpriv->si_unit_z)
-        GWY_OBJECT_UNREF(dpriv->si_unit_z);
-
     dpriv->cached_ranges = spriv->cached_ranges;
     dpriv->min = spriv->min;
     dpriv->max = spriv->max;
+    gwy_surface_copy_units(src, dest);
 
     dpriv->cached_checksum = spriv->cached_checksum;
     gwy_assign(dpriv->checksum, spriv->checksum, G_N_ELEMENTS(spriv->checksum));
@@ -768,13 +745,7 @@ gwy_surface_set_si_unit_xy(GwySurface *surface,
                            GwySIUnit *si_unit)
 {
     g_return_if_fail(GWY_IS_SURFACE(surface));
-    g_return_if_fail(GWY_IS_SI_UNIT(si_unit));
-    if (surface->priv->si_unit_xy == si_unit)
-        return;
-
-    GWY_OBJECT_UNREF(surface->priv->si_unit_xy);
-    g_object_ref(si_unit);
-    surface->priv->si_unit_xy = si_unit;
+    _gwy_set_object_si_unit(si_unit, &surface->priv->si_unit_xy);
 }
 
 /**
@@ -794,13 +765,7 @@ gwy_surface_set_si_unit_z(GwySurface *surface,
                           GwySIUnit *si_unit)
 {
     g_return_if_fail(GWY_IS_SURFACE(surface));
-    g_return_if_fail(GWY_IS_SI_UNIT(si_unit));
-    if (surface->priv->si_unit_z == si_unit)
-        return;
-
-    GWY_OBJECT_UNREF(surface->priv->si_unit_z);
-    g_object_ref(si_unit);
-    surface->priv->si_unit_z = si_unit;
+    _gwy_set_object_si_unit(si_unit, &surface->priv->si_unit_z);
 }
 
 /**
@@ -890,6 +855,26 @@ gwy_surface_get_value_format_z(GwySurface *surface,
 }
 
 /**
+ * gwy_surface_copy_units:
+ * @surface: A surface.
+ * @target: Target surface.
+ *
+ * Sets lateral and value units of a surface to match another surface.
+ *
+ * Since: 2.49
+ **/
+void
+gwy_surface_copy_units(GwySurface *surface,
+                       GwySurface *target)
+{
+    g_return_if_fail(GWY_IS_SURFACE(surface));
+    g_return_if_fail(GWY_IS_SURFACE(target));
+
+    _gwy_assign_si_unit(surface->priv->si_unit_xy, &target->priv->si_unit_xy);
+    _gwy_assign_si_unit(surface->priv->si_unit_z, &target->priv->si_unit_z);
+}
+
+/**
  * gwy_data_field_copy_units_to_surface:
  * @data_field: A two-dimensional data field.
  * @surface: A surface.
@@ -908,21 +893,8 @@ gwy_data_field_copy_units_to_surface(GwyDataField *data_field,
     g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
 
     priv = surface->priv;
-    if (data_field->si_unit_xy && priv->si_unit_xy)
-        gwy_serializable_clone(G_OBJECT(data_field->si_unit_xy),
-                               G_OBJECT(priv->si_unit_xy));
-    else if (data_field->si_unit_xy && !priv->si_unit_xy)
-        priv->si_unit_xy = gwy_si_unit_duplicate(data_field->si_unit_xy);
-    else if (!data_field->si_unit_xy && priv->si_unit_xy)
-        GWY_OBJECT_UNREF(priv->si_unit_xy);
-
-    if (data_field->si_unit_z && priv->si_unit_z)
-        gwy_serializable_clone(G_OBJECT(data_field->si_unit_z),
-                               G_OBJECT(priv->si_unit_z));
-    else if (data_field->si_unit_z && !priv->si_unit_z)
-        priv->si_unit_z = gwy_si_unit_duplicate(data_field->si_unit_z);
-    else if (!data_field->si_unit_z && priv->si_unit_z)
-        GWY_OBJECT_UNREF(priv->si_unit_z);
+    _gwy_assign_si_unit(data_field->si_unit_xy, &priv->si_unit_xy);
+    _gwy_assign_si_unit(data_field->si_unit_z, &priv->si_unit_z);
 }
 
 /**
@@ -944,21 +916,8 @@ gwy_surface_copy_units_to_data_field(GwySurface *surface,
     g_return_if_fail(GWY_IS_DATA_FIELD(data_field));
 
     priv = surface->priv;
-    if (priv->si_unit_xy && data_field->si_unit_xy)
-        gwy_serializable_clone(G_OBJECT(priv->si_unit_xy),
-                               G_OBJECT(data_field->si_unit_xy));
-    else if (priv->si_unit_xy && !data_field->si_unit_xy)
-        data_field->si_unit_xy = gwy_si_unit_duplicate(priv->si_unit_xy);
-    else if (!priv->si_unit_xy && data_field->si_unit_xy)
-        GWY_OBJECT_UNREF(data_field->si_unit_xy);
-
-    if (priv->si_unit_z && data_field->si_unit_z)
-        gwy_serializable_clone(G_OBJECT(priv->si_unit_z),
-                               G_OBJECT(data_field->si_unit_z));
-    else if (priv->si_unit_z && !data_field->si_unit_z)
-        data_field->si_unit_z = gwy_si_unit_duplicate(priv->si_unit_z);
-    else if (!priv->si_unit_z && data_field->si_unit_z)
-        GWY_OBJECT_UNREF(data_field->si_unit_z);
+    _gwy_assign_si_unit(priv->si_unit_xy, &data_field->si_unit_xy);
+    _gwy_assign_si_unit(priv->si_unit_z, &data_field->si_unit_z);
 }
 
 /**
@@ -1206,13 +1165,19 @@ gboolean
 gwy_surface_xy_is_compatible(GwySurface *surface,
                              GwySurface *othersurface)
 {
+    GwySIUnit *sunit, *ounit;
+    gboolean sempty, oempty;
+
     g_return_val_if_fail(GWY_IS_SURFACE(surface), FALSE);
     g_return_val_if_fail(GWY_IS_SURFACE(othersurface), FALSE);
 
-    ensure_units(surface);
-    ensure_units(othersurface);
-    if (!gwy_si_unit_equal(surface->priv->si_unit_xy,
-                           othersurface->priv->si_unit_xy))
+    sunit = surface->priv->si_unit_xy;
+    ounit = othersurface->priv->si_unit_xy;
+    sempty = (!sunit || gwy_si_unit_equal_string(sunit, NULL));
+    oempty = (!ounit || gwy_si_unit_equal_string(ounit, NULL));
+    if ((sempty && !oempty)
+        || (!sempty && oempty)
+        || (!sempty && !oempty && !gwy_si_unit_equal(sunit, ounit)))
         return FALSE;
 
     ensure_checksum(surface);
@@ -1244,6 +1209,221 @@ ensure_checksum(GwySurface *surface)
 }
 
 /**
+ * gwy_surface_reduce_points:
+ * @surface: A surface.
+ * @npoints: Requested number of points in the reduced surface.  If it is not
+ *           smaller than the number of points in @surface then the function
+ *           behaves like gwy_surface_duplicate().
+ *
+ * Creates a similar surface with smaller number of points.
+ *
+ * The functions attempts to choose points from the original surface to cover
+ * its full area, even though points from dense regions are still more likely
+ * to be found in the result than points from sparse regions.  As the main
+ * purpose to enable quick rough operations that may take long time with the
+ * full surface, the focus is on speed not fidelity.
+ *
+ * The function may employ random selection and thus be be non-deterministic.
+ *
+ * Returns: A newly created #GwySurface with reduced number of points.
+ *
+ * Since: 2.48
+ **/
+GwySurface*
+gwy_surface_reduce_points(GwySurface *surface, guint npoints)
+{
+    GwyXYZ *srcdata, *destdata;
+    GwySurface *retval;
+    GwyRandGenSet *rngset;
+    GRand *rng;
+    gdouble xmin, xmax, ymin, ymax, xlen, ylen, d;
+    gboolean x_is_degenerate, y_is_degenerate;
+    gint k, n, xres = 1, yres = 1, i, j;
+    guint *redindex, *pts = NULL;
+    gint *grid;
+    guint ngrid = 0;
+
+    g_return_val_if_fail(GWY_IS_SURFACE(surface), NULL);
+    n = surface->n;
+    if (npoints >= surface->n)
+        return gwy_surface_duplicate(surface);
+    if (!npoints)
+        return gwy_surface_new_alike(surface);
+
+    gwy_debug("reducing from %u to %u", surface->n, npoints);
+    rngset = gwy_rand_gen_set_new(1);
+    rng = gwy_rand_gen_set_rng(rngset, 0);
+    srcdata = surface->data;
+
+    retval = gwy_surface_new_alike(surface);
+    retval->n = npoints;
+    alloc_data(retval);
+    destdata = retval->data;
+
+    /* If a reasonable number of points is requested try to spread them. */
+    if (npoints > 3) {
+        gwy_surface_get_xrange(surface, &xmin, &xmax);
+        gwy_surface_get_yrange(surface, &ymin, &ymax);
+        xlen = xmax - xmin;
+        ylen = ymax - ymin;
+        x_is_degenerate = (xmin >= xmax);
+        y_is_degenerate = (ymin >= ymax);
+        if (x_is_degenerate && y_is_degenerate) {
+            /* Choose points randomly */
+            gwy_debug("both x and y are degenerate");
+            d = 0.5*fmax(fabs(xmax), fabs(ymax));
+            if (d == 0.0)
+                d = 1.0;
+        }
+        if (x_is_degenerate && !y_is_degenerate) {
+            gwy_debug("x is degenerate");
+            /* Vertical line */
+            xres = 1;
+            yres = 3*npoints;
+            d = 0.5*ylen/yres;
+        }
+        else if (y_is_degenerate && !x_is_degenerate) {
+            gwy_debug("y is degenerate");
+            /* Horizontal line */
+            xres = 3*npoints;
+            yres = 1;
+            d = 0.5*xlen/xres;
+        }
+        else {
+            gwy_debug("neither x nor y is degenerate");
+            d = sqrt(4.0*xlen*ylen/npoints);
+            if (xlen >= ylen) {
+                yres = (gint)floor(ylen/d + 0.5);
+                xres = (4*npoints + yres-1)/yres;
+                gwy_debug("choosing using x");
+            }
+            else {
+                xres = (gint)floor(xlen/d + 0.5);
+                yres = (4*npoints + xres-1)/xres;
+                gwy_debug("choosing using y");
+            }
+            d *= 0.5;
+        }
+        if (!xres || !yres)
+            xres = yres = 1;
+        xmin -= d;
+        ymin -= d;
+        xmax += d;
+        ymax += d;
+        xlen = xmax - xmin;
+        ylen = ymax - ymin;
+        gwy_debug("xres %d, yres %d", xres, yres);
+    }
+
+    if (xres == 1 && yres == 1) {
+        redindex = gwy_rand_gen_set_choose_shuffle(rngset, 0, n, npoints);
+        for (k = 0; k < (gint)npoints; k++)
+            destdata[k] = srcdata[redindex[k]];
+        g_free(redindex);
+        gwy_rand_gen_set_free(rngset);
+        gwy_surface_invalidate(retval);
+        return retval;
+    }
+
+    /* Count the number of points in each rectangle. */
+    grid = g_new0(gint, xres*yres);
+    ngrid = 0;
+    for (k = 0; k < n; k++) {
+        j = (gint)floor((srcdata[k].x - xmin)/xlen*xres);
+        i = (gint)floor((srcdata[k].y - ymin)/ylen*yres);
+        j = GWY_CLAMP(j, 0, xres-1);
+        i = GWY_CLAMP(i, 0, yres-1);
+        if (!grid[i*xres + j])
+            ngrid++;
+        grid[i*xres + j]++;
+    }
+    gwy_debug("points in rectangles %u", ngrid);
+
+    /* Select one point in each rectangle by generating the index of
+     * point we should retain. */
+    if (ngrid < npoints) {
+        /* Use a point from each rectangle and then fill the rest randomly. */
+        for (i = 0; i < xres*yres; i++) {
+            if (grid[i] > 1)
+                grid[i] = g_rand_int_range(rng, 1, grid[i]+1);
+        }
+        /* Find the indices of selected points. */
+        pts = g_new0(guint, surface->n);
+        for (k = ngrid = 0; k < n; k++) {
+            j = (gint)floor((srcdata[k].x - xmin)/xlen*xres);
+            i = (gint)floor((srcdata[k].y - ymin)/ylen*yres);
+            j = GWY_CLAMP(j, 0, xres-1);
+            i = GWY_CLAMP(i, 0, yres-1);
+            if (grid[i*xres + j] > 1)
+                grid[i*xres + j]--;
+            else if (grid[i*xres + j] == 1) {
+                destdata[ngrid++] = srcdata[k];
+                pts[k] = TRUE;
+                grid[i*xres + j] = 0;
+            }
+        }
+
+        /* Start filling the new surface with points from rectangles. */
+        gwy_debug("filled from grid %u", ngrid);
+
+        /* Fill the rest with randomly selected points. */
+        for (i = j = 0; i < n; i++) {
+            if (!pts[i])
+                pts[j++] = i;
+        }
+        redindex = gwy_rand_gen_set_choose_shuffle(rngset, 0,
+                                                   surface->n - ngrid,
+                                                   npoints - ngrid);
+        for (k = 0; k < (gint)(npoints - ngrid); k++)
+            destdata[ngrid + k] = srcdata[pts[redindex[k]]];
+
+        g_free(pts);
+        g_free(redindex);
+        gwy_debug("filled randomly %u", (npoints - ngrid));
+    }
+    else {
+        if (ngrid > npoints) {
+            /* We have more points in rectangles than requested so remove some
+             * of them randomly. */
+            gwy_debug("removing %u rectangles", ngrid - npoints);
+            pts = g_new0(guint, ngrid);
+            for (i = j = 0; i < xres*yres; i++) {
+                if (grid[i])
+                    pts[j++] = i;
+            }
+            redindex = gwy_rand_gen_set_choose_shuffle(rngset, 0, ngrid,
+                                                       ngrid - npoints);
+            for (i = 0; i < ngrid - npoints; i++)
+                grid[pts[redindex[i]]] = 0;
+            g_free(redindex);
+            g_free(pts);
+        }
+
+        /* Use a point from each remaining rectangle. */
+        for (i = 0; i < xres*yres; i++) {
+            if (grid[i] > 1)
+                grid[i] = g_rand_int_range(rng, 1, grid[i]+1);
+        }
+        for (k = ngrid = 0; k < n; k++) {
+            j = (gint)floor((srcdata[k].x - xmin)/xlen*xres);
+            i = (gint)floor((srcdata[k].y - ymin)/ylen*yres);
+            j = GWY_CLAMP(j, 0, xres-1);
+            i = GWY_CLAMP(i, 0, yres-1);
+            if (grid[i*xres + j] > 1)
+                grid[i*xres + j]--;
+            else if (grid[i*xres + j] == 1) {
+                destdata[ngrid++] = srcdata[k];
+                grid[i*xres + j] = 0;
+            }
+        }
+    }
+    g_free(grid);
+    gwy_rand_gen_set_free(rngset);
+
+    return retval;
+}
+
+/**
  * SECTION:surface
  * @title: GwySurface
  * @short_description: General two-dimensional data
diff --git a/libprocess/surface.h b/libprocess/surface.h
index 20ad62e..6ee2726 100644
--- a/libprocess/surface.h
+++ b/libprocess/surface.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: surface.h 18950 2016-09-12 08:34:24Z yeti-dn $
+ *  @(#) $Id: surface.h 20128 2017-08-01 11:19:59Z yeti-dn $
  *  Copyright (C) 2011-2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -66,67 +66,71 @@ struct _GwySurfaceClass {
 #define gwy_surface_clone(dest, src) \
     (gwy_serializable_clone(G_OBJECT(dest), G_OBJECT(src)))
 
-GType             gwy_surface_get_type           (void)                       G_GNUC_CONST;
-GwySurface*       gwy_surface_new                (void);
-GwySurface*       gwy_surface_new_sized          (guint n);
-GwySurface*       gwy_surface_new_from_data      (const GwyXYZ *points,
-                                                  guint n);
-GwySurface*       gwy_surface_new_alike          (GwySurface *model);
-GwySurface*       gwy_surface_new_part           (GwySurface *surface,
-                                                  gdouble xfrom,
-                                                  gdouble xto,
-                                                  gdouble yfrom,
-                                                  gdouble yto);
-GwyXYZ*           gwy_surface_get_data           (GwySurface *surface);
-const GwyXYZ*     gwy_surface_get_data_const     (GwySurface *surface);
-guint             gwy_surface_get_npoints        (GwySurface *surface);
-void              gwy_surface_data_changed       (GwySurface *surface);
-void              gwy_surface_copy               (GwySurface *src,
-                                                  GwySurface *dest);
-void              gwy_surface_invalidate         (GwySurface *surface);
-void              gwy_surface_set_from_data_field(GwySurface *surface,
-                                                  GwyDataField *data_field);
+GType             gwy_surface_get_type                (void)                       G_GNUC_CONST;
+GwySurface*       gwy_surface_new                     (void);
+GwySurface*       gwy_surface_new_sized               (guint n);
+GwySurface*       gwy_surface_new_from_data           (const GwyXYZ *points,
+                                                       guint n);
+GwySurface*       gwy_surface_new_alike               (GwySurface *model);
+GwySurface*       gwy_surface_new_part                (GwySurface *surface,
+                                                       gdouble xfrom,
+                                                       gdouble xto,
+                                                       gdouble yfrom,
+                                                       gdouble yto);
+GwyXYZ*           gwy_surface_get_data                (GwySurface *surface);
+const GwyXYZ*     gwy_surface_get_data_const          (GwySurface *surface);
+guint             gwy_surface_get_npoints             (GwySurface *surface);
+void              gwy_surface_data_changed            (GwySurface *surface);
+void              gwy_surface_copy                    (GwySurface *src,
+                                                       GwySurface *dest);
+void              gwy_surface_invalidate              (GwySurface *surface);
+void              gwy_surface_set_from_data_field     (GwySurface *surface,
+                                                       GwyDataField *data_field);
 void              gwy_surface_set_from_data_field_mask(GwySurface *surface,
                                                        GwyDataField *data_field,
                                                        GwyDataField *mask,
                                                        GwyMaskingType masking);
-GwySIUnit*        gwy_surface_get_si_unit_xy     (GwySurface *surface);
-GwySIUnit*        gwy_surface_get_si_unit_z      (GwySurface *surface);
-void              gwy_surface_set_si_unit_xy     (GwySurface *surface,
-                                                  GwySIUnit *si_unit);
-void              gwy_surface_set_si_unit_z      (GwySurface *surface,
-                                                  GwySIUnit *si_unit);
-GwySIValueFormat* gwy_surface_get_value_format_xy(GwySurface *surface,
-                                                  GwySIUnitFormatStyle style,
-                                                  GwySIValueFormat *format);
-GwySIValueFormat* gwy_surface_get_value_format_z (GwySurface *surface,
-                                                  GwySIUnitFormatStyle style,
-                                                  GwySIValueFormat *format);
-void          gwy_data_field_copy_units_to_surface(GwyDataField *data_field,
-                                                   GwySurface *surface);
-void          gwy_surface_copy_units_to_data_field(GwySurface *surface,
-                                                   GwyDataField *data_field);
-GwyXYZ            gwy_surface_get                (GwySurface *surface,
-                                                  guint pos);
-void              gwy_surface_set                (GwySurface *surface,
-                                                  guint pos,
-                                                  GwyXYZ point);
-void              gwy_surface_get_xrange         (GwySurface *surface,
-                                                  gdouble *min,
-                                                  gdouble *max);
-void              gwy_surface_get_yrange         (GwySurface *surface,
-                                                  gdouble *min,
-                                                  gdouble *max);
-void              gwy_surface_get_min_max        (GwySurface *surface,
-                                                  gdouble *min,
-                                                  gdouble *max);
-const GwyXYZ*     gwy_surface_get_data_full      (GwySurface *surface,
-                                                  guint *n);
-void              gwy_surface_set_data_full      (GwySurface *surface,
-                                                  const GwyXYZ *points,
-                                                  guint n);
-gboolean          gwy_surface_xy_is_compatible   (GwySurface *surface,
-                                                  GwySurface *othersurface);
+GwySIUnit*        gwy_surface_get_si_unit_xy          (GwySurface *surface);
+GwySIUnit*        gwy_surface_get_si_unit_z           (GwySurface *surface);
+void              gwy_surface_set_si_unit_xy          (GwySurface *surface,
+                                                       GwySIUnit *si_unit);
+void              gwy_surface_set_si_unit_z           (GwySurface *surface,
+                                                       GwySIUnit *si_unit);
+GwySIValueFormat* gwy_surface_get_value_format_xy     (GwySurface *surface,
+                                                       GwySIUnitFormatStyle style,
+                                                       GwySIValueFormat *format);
+GwySIValueFormat* gwy_surface_get_value_format_z      (GwySurface *surface,
+                                                       GwySIUnitFormatStyle style,
+                                                       GwySIValueFormat *format);
+void              gwy_surface_copy_units              (GwySurface *surface,
+                                                       GwySurface *target);
+void              gwy_data_field_copy_units_to_surface(GwyDataField *data_field,
+                                                       GwySurface *surface);
+void              gwy_surface_copy_units_to_data_field(GwySurface *surface,
+                                                       GwyDataField *data_field);
+GwyXYZ            gwy_surface_get                     (GwySurface *surface,
+                                                       guint pos);
+void              gwy_surface_set                     (GwySurface *surface,
+                                                       guint pos,
+                                                       GwyXYZ point);
+void              gwy_surface_get_xrange              (GwySurface *surface,
+                                                       gdouble *min,
+                                                       gdouble *max);
+void              gwy_surface_get_yrange              (GwySurface *surface,
+                                                       gdouble *min,
+                                                       gdouble *max);
+void              gwy_surface_get_min_max             (GwySurface *surface,
+                                                       gdouble *min,
+                                                       gdouble *max);
+const GwyXYZ*     gwy_surface_get_data_full           (GwySurface *surface,
+                                                       guint *n);
+void              gwy_surface_set_data_full           (GwySurface *surface,
+                                                       const GwyXYZ *points,
+                                                       guint n);
+gboolean          gwy_surface_xy_is_compatible        (GwySurface *surface,
+                                                       GwySurface *othersurface);
+GwySurface*       gwy_surface_reduce_points           (GwySurface *surface,
+                                                       guint npoints);
 
 G_END_DECLS
 
diff --git a/libprocess/tip.c b/libprocess/tip.c
index 041faea..f2c8976 100644
--- a/libprocess/tip.c
+++ b/libprocess/tip.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: tip.c 19251 2016-11-14 08:42:00Z yeti-dn $
+ *  @(#) $Id: tip.c 20155 2017-08-03 14:52:21Z yeti-dn $
  *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -19,16 +19,14 @@
  *  Boston, MA 02110-1301, USA.
  */
 
-#include "config.h"
 #include <string.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
 #include <libprocess/filters.h>
 #include <libprocess/stats.h>
 #include <libprocess/grains.h>
-#include <libprocess/morph_lib.h>
-
-/* INTERPOLATION: New (not applicable). */
+#include <libprocess/tip.h>
+#include "morph_lib.h"
 
 /* Update when new parameter type is added. */
 enum {
@@ -44,6 +42,17 @@ typedef struct {
     const GwyTipParamType *params;
 } GwyTipModelPresetReal;
 
+GType
+gwy_tip_model_preset_get_type(void)
+{
+    static GType tipmodel_type = 0;
+
+    if (G_UNLIKELY(!tipmodel_type))
+        tipmodel_type = g_pointer_type_register_static("GwyTipModelPreset");
+
+    return tipmodel_type;
+}
+
 static void
 guess_symmetrical(GwyDataField *data,
                   gdouble height,
diff --git a/libprocess/tip.h b/libprocess/tip.h
index b742456..b188ea0 100644
--- a/libprocess/tip.h
+++ b/libprocess/tip.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: tip.h 19080 2016-10-14 13:59:02Z yeti-dn $
+ *  @(#) $Id: tip.h 20145 2017-08-02 20:31:19Z yeti-dn $
  *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -52,6 +52,9 @@ struct _GwyTipModelPreset {
 };
 #endif
 
+#define GWY_TYPE_TIP_MODEL_PRESET (gwy_tip_model_preset_get_type())
+
+GType                    gwy_tip_model_preset_get_type         (void)                             G_GNUC_CONST;
 gint                     gwy_tip_model_get_npresets            (void);
 const GwyTipModelPreset* gwy_tip_model_get_preset              (gint preset_id);
 const GwyTipModelPreset* gwy_tip_model_get_preset_by_name      (const gchar *name);
diff --git a/libprocess/triangulation.c b/libprocess/triangulation.c
index 0e724b6..42cc37a 100644
--- a/libprocess/triangulation.c
+++ b/libprocess/triangulation.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: triangulation.c 19071 2016-10-14 09:02:41Z yeti-dn $
+ *  @(#) $Id: triangulation.c 19698 2017-05-03 20:18:10Z yeti-dn $
  *  Copyright (C) 2009 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -18,7 +18,6 @@
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
  *  Boston, MA 02110-1301, USA.
  */
-#include "config.h"
 #include <string.h>
 #include <math.h>
 #include <libgwyddion/gwymacros.h>
diff --git a/libprocess/wrappers.h b/libprocess/wrappers.h
deleted file mode 100644
index 26ad4cc..0000000
--- a/libprocess/wrappers.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  @(#) $Id: wrappers.h 15598 2013-11-11 12:33:32Z yeti-dn $
- *  Copyright (C) 2011 David Necas (Yeti).
- *  E-mail: yeti at gwyddion.net.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
- *  Boston, MA 02110-1301, USA.
- */
-
-/*< private_header >*/
-
-#ifndef __GWY_PROCESS_WRAPPERS_H__
-#define __GWY_PROCESS_WRAPPERS_H__
-
-#include <libprocess/datafield.h>
-#include "gwyprocessinternal.h"
-
-G_BEGIN_DECLS
-
-G_GNUC_INTERNAL
-void _gwy_data_field_get_min_max(GwyDataField *field,
-                                 GwyDataField *mask,
-                                 GwyMaskingType mode,
-                                 const GwyFieldPart *fpart,
-                                 gpointer params,
-                                 gdouble *results);
-
-G_END_DECLS
-
-#endif /* __GWY_PROCESS_WRAPPERS_H__ */
-
-/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/m4/Makefile.in b/m4/Makefile.in
index b641451..dd05ab9 100644
--- a/m4/Makefile.in
+++ b/m4/Makefile.in
@@ -171,10 +171,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -184,6 +181,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -208,7 +207,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -266,6 +267,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -274,17 +276,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/m4/gwy-enable.m4 b/m4/gwy-enable.m4
index 9a3674e..e14b3c6 100644
--- a/m4/gwy-enable.m4
+++ b/m4/gwy-enable.m4
@@ -4,12 +4,12 @@ AC_DEFUN([GWY_ENABLE],
 [
 AC_ARG_ENABLE([$1],
   AS_HELP_STRING([--enable-$1],
-                 [$3 @<:@default=@:>@ifelse([$4],,[yes],[$4])]),
+                 [$3 @<:@default=ifelse($4,,yes,$4)@:>@]),
   [case "${enableval}" in
      yes|no) ifelse([$2],,[enable_$1="$enableval"],[enable_$2="$enableval"]) ;;
      *) AC_MSG_ERROR(bad value ${enableval} for --enable-$1) ;;
    esac],
-  [ifelse([$2],,[enable_$1=ifelse([$4],,[yes],[$4])],[enable_$2=ifelse([$4],,[yes],[$4])])])
+  [ifelse($2,,[enable_$1=ifelse($4,,yes,$4)],[enable_$2=ifelse($4,,yes,$4)])])
 ])
 
 dnl Create simple --with option $1, creating enable_$2 with help text $3,
@@ -18,10 +18,10 @@ AC_DEFUN([GWY_WITH],
 [
 AC_ARG_WITH([$1],
   AS_HELP_STRING([--with-$1],
-                 [$3 @<:@default=@:>@ifelse([$4],,[yes],[$4])]),
+                 [$3 @<:@default=ifelse($4,,yes,$4)@:>@]),
   [case "${withval}" in
      yes|no) ifelse([$2],,[enable_$1="$withval"],[enable_$2="$withval"]) ;;
      *) AC_MSG_ERROR(bad value ${withval} for --with-$1) ;;
    esac],
-  [ifelse([$2],,[enable_$1=ifelse([$4],,[yes],[$4])],[enable_$2=ifelse([$4],,[yes],[$4])])])
+  [ifelse($2,,[enable_$1=ifelse($4,,yes,$4)],[enable_$2=ifelse($4,,yes,$4)])])
 ])
diff --git a/m4/gwy-python.m4 b/m4/gwy-python.m4
index 8c95d9c..c2fc441 100644
--- a/m4/gwy-python.m4
+++ b/m4/gwy-python.m4
@@ -1,78 +1,67 @@
-dnl GWY_PYTHON_SYSCFG_VAR(VARIABLE [,ACTION-ON-SUCCESS [,ACTION-ON-FAILURE]])
-dnl VARIABLE is a distutils.sysconfig variable such as LINKFORSHARED;
-dnl          output variable PYTHON_SYSCFG_${VARIABLE} is always created,
-dnl          filled with the value of VARIABLE on success, left empty on
-dnl          failure
-dnl ACTION-ON-SUCCESS is executed when the value of VARIABLE was successfully
-dnl                   obtained
-dnl ACTION-ON-FAILURE is executed on any kind of failure (can't run Python
-dnl                   or anything)
-dnl
-dnl Requires: AM_PATH_PYTHON, as you probably want a particular minimum Python
-dnl           version, call it yourself beforehand
-AC_DEFUN([GWY_PYTHON_SYSCFG_VAR],
-[
-AC_REQUIRE([AM_PATH_PYTHON])dnl
-AC_SUBST([PYTHON_SYSCFG_$1])
-AC_MSG_CHECKING([for python build option $1])
-if test -n "$PYTHON_SYSCFG_$1"; then
-  AC_MSG_RESULT([$PYTHON_SYSCFG_$1])
-  export PYTHON_SYSCFG_$1
-  $2
+dnl Try to link a test program with already determined PYTHON_INCLUDES and
+dnl PYTHON_LDFLAGS (by whatever means necessary).
+dnl $1 = action on success
+dnl $2 = action on failure
+
+AC_DEFUN([GWY_PYTHON_TRY_LINK],
+[ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+CPPFLAGS="$LIBS $PYTHON_INCLUDES"
+LIBS="$LIBS $PYTHON_LDFLAGS"
+AC_MSG_CHECKING([if we can link a test Python program])
+AC_LANG_PUSH([C])
+AC_LINK_IFELSE([
+AC_LANG_PROGRAM([[#include <Python.h>]],
+                [[Py_Initialize();]])
+],dnl
+[AC_MSG_RESULT([yes])
+$1],dnl
+[AC_MSG_RESULT([no])
+$2])
+AC_LANG_POP([C])
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
+
+dnl Find flags for with-Python compilation and linking.
+dnl   Originally suggested by wichert.
+dnl   Rewritten by Yeti.
+dnl $1 = list of Python versions to try
+dnl $2 = action on success
+dnl $3 = action on failure
+AC_DEFUN([GWY_PYTHON_DEVEL],
+[if test "x$1" != x; then
+  for version in $1 ; do
+    AC_PATH_TOOL([PYTHON_CONFIG], [python$version-config])
+    if test "x$PYTHON_CONFIG" != x; then
+      PYTHON_VERSION=$version
+      break
+    fi
+  done
 else
-cat >conftest.py <<\_______EOF
-import sys, distutils.sysconfig
-x = sys.argv[[1]].strip()
-v = distutils.sysconfig.get_config_var(x)
-if not isinstance(v, str):
-    sys.stderr.write('Value of %s is not a string' % x)
-    sys.exit(1)
-print 'PYTHON_SYSCFG_%s="%s"' % (x, v)
-print 'ac_res="%s"' % v
-_______EOF
+  AC_PATH_TOOL([PYTHON_CONFIG], [python-config])
+  if test "x$PYTHON_CONFIG" != x; then
+    PYTHON_VERSION=$(python -c "import sys;print '.'.join(map(str, sys.version_info@<:@:2@:>@))")
+  fi
+fi
 
-if $PYTHON conftest.py $1 >conftest.file 2>conftest.err && test ! -s conftest.err; then
-  eval `cat conftest.file`
-  AC_MSG_RESULT([$ac_res])
+if test "x$PYTHON_CONFIG" != x; then
+  PYTHON_INCLUDES="$("$PYTHON_CONFIG" --includes)"
+  PYTHON_LDFLAGS="$("$PYTHON_CONFIG" --ldflags)"
+  GWY_PYTHON_TRY_LINK([],[PYTHON_CONFIG=])
+fi
+
+if test "x$PYTHON_CONFIG" != x; then
   $2
+  :
 else
-  AC_MSG_RESULT([unknown])
-  cat conftest.err >&5
-  echo "$as_me: failed program was:" >&5
-  sed 's/^/| /' conftest.py >&5
-  eval PYTHON_SYSCFG_$1=
+  PYTHON_INCLUDES=
+  PYTHON_LDFLAGS=
   $3
 fi
-rm -f conftest.py conftest.err conftest.file
-fi
-])
-
-## Find the install dirs for the python installation.
-##  By James Henstridge
-##  Fixed by Yeti because does not work on MS Windows
 
-dnl a macro to check for ability to create python extensions
-dnl  AM_CHECK_PYTHON_HEADERS([ACTION-IF-POSSIBLE], [ACTION-IF-NOT-POSSIBLE])
-dnl function also defines PYTHON_INCLUDES
-AC_DEFUN([GWY_CHECK_PYTHON_HEADERS],
-[AC_REQUIRE([AM_PATH_PYTHON])
-AC_MSG_CHECKING(for headers required to compile python extensions)
-dnl deduce PYTHON_INCLUDES
-py_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.prefix.replace('\\\\\\\\','/'))"`
-py_exec_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix.replace('\\\\\\\\','/'))"`
-PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}"
-if test "$py_prefix" != "$py_exec_prefix"; then
-  PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}"
-fi
-AC_SUBST(PYTHON_INCLUDES)
-dnl check if the headers exist:
-save_CPPFLAGS="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES"
-AC_TRY_CPP([#include <Python.h>],dnl
-[AC_MSG_RESULT(found)
-$1],dnl
-[AC_MSG_RESULT(not found)
-$2])
-CPPFLAGS="$save_CPPFLAGS"
+AC_SUBST([PYTHON_VERSION])
+AC_SUBST([PYTHON_INCLUDES])
+AC_SUBST([PYTHON_LDFLAGS])
 ])
 
diff --git a/modules/Makefile.in b/modules/Makefile.in
index 34e7ffc..3b1a040 100644
--- a/modules/Makefile.in
+++ b/modules/Makefile.in
@@ -300,10 +300,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -313,6 +310,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -337,7 +336,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -395,6 +396,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -403,17 +405,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/modules/file/Makefile.am b/modules/file/Makefile.am
index 6757a0e..e9ffd97 100644
--- a/modules/file/Makefile.am
+++ b/modules/file/Makefile.am
@@ -1,4 +1,4 @@
-# @(#) $Id: Makefile.am 18773 2016-07-26 05:53:30Z yeti-dn $
+# @(#) $Id: Makefile.am 20186 2017-08-07 14:15:17Z yeti-dn $
 
 # For each optional module foo there is variable foo_module that should be set
 # to foo.la when the module is enabled.
@@ -105,7 +105,8 @@ hdrimage_module =
 disabled_sources += hdrimage.cc
 endif
 
-# Some modules require ‘any ZIP library’.  We must choose one.
+# Some modules require ‘any ZIP library’.  We must choose one.  Configure
+# should ensure at most one of the following is enabled.
 if HAVE_LIBZIP
 zip_cflags = @LIBZIP_CFLAGS@
 zip_libs = @LIBZIP_LIBS@
@@ -119,27 +120,29 @@ endif
 # These modules compile also without the respective libraries so just add the
 # flags if the libraries are available.
 createc_la_LIBADD    = @ZLIB@
-nrrdfile_la_LIBADD   = @ZLIB@ @BZIP2@
-pixmap_la_LIBADD     = @PNG_LIBS@
-pixmap_la_CFLAGS     = $(AM_CFLAGS) @PNG_CFLAGS@
+hdrimage_la_LIBADD   = @EXR_LIBS@ @PNG_LIBS@
+hdrimage_la_CXXFLAGS = $(AM_CXXFLAGS) @PNG_CFLAGS@ @EXR_CFLAGS@ @HDRIMAGE_EXTRA_CFLAGS@
 imgexport_la_LIBADD  = @PNG_LIBS@ @WEBP_LIBS@
 imgexport_la_CFLAGS  = $(AM_CFLAGS) @PNG_CFLAGS@ @WEBP_CFLAGS@
-rhk_sm4_la_LIBADD    = @ZLIB@
-hdrimage_la_LIBADD   = @EXR_LIBS@ @PNG_LIBS@
-hdrimage_la_CXXFLAGS = $(AM_CXXFLAGS) @PNG_CFLAGS@ @EXR_CFLAGS@
 jpkscan_la_CFLAGS    = $(AM_CFLAGS) $(zip_cflags)
 jpkscan_la_LIBADD    = $(zip_libs)
+nrrdfile_la_LIBADD   = @ZLIB@ @BZIP2@
+pixmap_la_LIBADD     = @PNG_LIBS@
+pixmap_la_CFLAGS     = $(AM_CFLAGS) @PNG_CFLAGS@
+rhk_sm4_la_LIBADD    = @ZLIB@
 
 filedir = $(pkglibdir)/modules/file
 
-file_LTLIBRARIES = \
+# Only bundle modules without own dependencies.  If something goes wrong with
+# any required libraries at run-time, it will at most break these individual
+# unbundled modules, not the bundle.
+bundlable_modules = \
 	accurexii-txt.la \
 	aistfile.la \
 	alicona.la \
 	ambfile.la \
 	anfatec.la \
 	apefile.la \
-	$(apedaxfile_module) \
 	asciiexport.la \
 	assing-afm.la \
 	attocube.la \
@@ -148,8 +151,8 @@ file_LTLIBRARIES = \
 	burleigh_bii.la \
 	burleigh_exp.la \
 	codevfile.la \
-	createc.la \
 	csmfile.la \
+	dektakvca.la \
 	dektakxml.la \
 	dimensionfile.la \
 	dmefile.la \
@@ -157,7 +160,6 @@ file_LTLIBRARIES = \
 	dumbfile.la \
 	ecsfile.la \
 	ezdfile.la \
-	$(fitsfile_module) \
 	femtoscan.la \
 	femtoscan-txt.la \
 	gdeffile.la \
@@ -165,23 +167,19 @@ file_LTLIBRARIES = \
 	gwyfile.la \
 	gxyzffile.la \
 	hdf4file.la \
-	$(hdrimage_module) \
 	hitachi-afm.la \
 	hitachi-sem.la \
 	igorfile.la \
-	imgexport.la \
 	intelliwave.la \
 	intematix.la \
 	iso28600.la \
 	jeol.la \
-	jpkscan.la \
 	jspmfile.la \
 	keyence.la \
 	leica.la \
 	lextfile.la \
 	magellan.la \
 	mapvue.la \
-	$(matfile_module) \
 	metropro.la \
 	microprof.la \
 	miffile.la \
@@ -191,15 +189,12 @@ file_LTLIBRARIES = \
 	nanomagnetics.la \
 	nanonics.la \
 	nanonis.la \
-	$(nanoobserver_module) \
 	nanoscan.la \
-	$(nanoscantech_module) \
 	nanoscope-ii.la \
 	nanoscope.la \
 	nanotop.la \
 	netcdf.la \
 	nmmxyz.la \
-	nrrdfile.la \
 	nt-mdt.la \
 	nxiifile.la \
 	oldmda.la \
@@ -209,8 +204,6 @@ file_LTLIBRARIES = \
 	omicronflat.la \
 	omicronmatrix.la \
 	opdfile.la \
-	$(opengps_module) \
-	pixmap.la \
 	pnifile.la \
 	pltfile.la \
 	princetonspe.la \
@@ -222,23 +215,19 @@ file_LTLIBRARIES = \
 	rawxyz.la \
 	renishaw.la \
 	rhk-sm3.la \
-	rhk-sm4.la \
 	rhk-spm32.la \
 	robotics.la \
 	s94file.la \
 	sdfile.la \
 	seiko.la \
 	sensofar.la \
-	$(sensofarx_module) \
 	sensolytics.la \
 	shimadzu.la \
 	sicmfile.la \
 	sis.la \
 	spip-asc.la \
-	$(spml_module) \
 	spmlab.la \
 	spmlabf.la \
-	$(spmxfile_module) \
 	stmprg.la \
 	stpfile.la \
 	surffile.la \
@@ -254,8 +243,37 @@ file_LTLIBRARIES = \
 	wsxmfile.la \
 	xyzexport.la \
 	zeiss.la \
+	zeisslsm.la \
 	zemax.la
 
+# file_modules is either the bundle or all the individual modules.
+if MODULE_BUNDLING
+file_modules = file.la
+BUILT_SOURCES = file.c
+file_la_CFLAGS = $(AM_CFLAGS) -DGWY_MODULE_BUNDLING
+else
+file_modules = $(bundlable_modules)
+endif
+
+file_LTLIBRARIES = \
+	$(file_modules) \
+	createc.la \
+	imgexport.la \
+	jpkscan.la \
+	nrrdfile.la \
+	pixmap.la \
+	rhk-sm4.la \
+	$(apedaxfile_module) \
+	$(fitsfile_module) \
+	$(hdrimage_module) \
+	$(matfile_module) \
+	$(nanoobserver_module) \
+	$(nanoscantech_module) \
+	$(opengps_module) \
+	$(sensofarx_module) \
+	$(spml_module) \
+	$(spmxfile_module)
+
 noinst_HEADERS = \
 	err.h \
 	get.h
@@ -268,6 +286,11 @@ if OS_MSWIN
 no_undefined = -no-undefined
 endif
 
+AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
+AM_CFLAGS = @COMMON_CFLAGS@
+AM_CXXFLAGS = @COMMON_CXXFLAGS@
+AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
+
 if MODULE_DEPENDENCIES
 module_libadd = \
 	$(top_builddir)/app/libgwyapp2.la \
@@ -279,11 +302,15 @@ module_libadd = \
 	@GTK_LIBS@
 endif
 
-AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
-AM_CFLAGS = @COMMON_CFLAGS@
-AM_CXXFLAGS = @COMMON_CXXFLAGS@
-AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
+# Standalone modules
+createc_la_SOURCES       = createc.c
+imgexport_la_SOURCES     = imgexport.c imgexportpreset.h gwytiff.h image-keys.h
+jpkscan_la_SOURCES       = jpkscan.c jpk.h gwytiff.h
+pixmap_la_SOURCES        = pixmap.c gwytiff.h image-keys.h
+rhk_sm4_la_SOURCES       = rhk-sm4.c
+nrrdfile_la_SOURCES      = nrrdfile.c
 
+# Bundlable modules, must be listed in file_la_SOURCES below.
 accurexii_txt_la_SOURCES = accurexii-txt.c
 aistfile_la_SOURCES      = aistfile.c
 alicona_la_SOURCES       = alicona.c
@@ -297,9 +324,9 @@ bcrfile_la_SOURCES       = bcrfile.c
 burleigh_la_SOURCES      = burleigh.c
 burleigh_bii_la_SOURCES  = burleigh_bii.c
 burleigh_exp_la_SOURCES  = burleigh_exp.c
-createc_la_SOURCES       = createc.c
 codevfile_la_SOURCES     = codevfile.c
 csmfile_la_SOURCES       = csmfile.c
+dektakvca_la_SOURCES     = dektakvca.c
 dektakxml_la_SOURCES     = dektakxml.c
 dimensionfile_la_SOURCES = dimensionfile.c
 dmefile_la_SOURCES       = dmefile.c
@@ -317,12 +344,10 @@ hdf4file_la_SOURCES      = hdf4file.c
 hitachi_afm_la_SOURCES   = hitachi-afm.c
 hitachi_sem_la_SOURCES   = hitachi-sem.c
 igorfile_la_SOURCES      = igorfile.c
-imgexport_la_SOURCES     = imgexport.c imgexportpreset.h gwytiff.h image-keys.h
 intelliwave_la_SOURCES   = intelliwave.c
 intematix_la_SOURCES     = intematix.c gwytiff.h
 iso28600_la_SOURCES      = iso28600.c
 jeol_la_SOURCES          = jeol.c
-jpkscan_la_SOURCES       = jpkscan.c jpk.h gwytiff.h
 jspmfile_la_SOURCES      = jspmfile.c
 keyence_la_SOURCES       = keyence.c
 leica_la_SOURCES         = leica.c
@@ -344,17 +369,15 @@ nanoscope_la_SOURCES     = nanoscope.c
 nanotop_la_SOURCES       = nanotop.c
 netcdf_la_SOURCES        = netcdf.c
 nmmxyz_la_SOURCES        = nmmxyz.c
-nrrdfile_la_SOURCES      = nrrdfile.c
 nt_mdt_la_SOURCES        = nt-mdt.c
 nxiifile_la_SOURCES      = nxiifile.c
 oldmda_la_SOURCES        = oldmda.c
 ols_la_SOURCES           = ols.c gwytiff.h
-ometiff_la_SOURCES       = ometiff.c
+ometiff_la_SOURCES       = ometiff.c gwytiff.h
 omicron_la_SOURCES       = omicron.c
 omicronflat_la_SOURCES   = omicronflat.c
 omicronmatrix_la_SOURCES = omicronmatrix.c
 opdfile_la_SOURCES       = opdfile.c
-pixmap_la_SOURCES        = pixmap.c gwytiff.h image-keys.h
 pnifile_la_SOURCES       = pnifile.c
 pltfile_la_SOURCES       = pltfile.c
 princetonspe_la_SOURCES  = princetonspe.c
@@ -366,7 +389,6 @@ rawgraph_la_SOURCES      = rawgraph.c
 rawxyz_la_SOURCES        = rawxyz.c
 renishaw_la_SOURCES      = renishaw.c
 rhk_sm3_la_SOURCES       = rhk-sm3.c
-rhk_sm4_la_SOURCES       = rhk-sm4.c
 rhk_spm32_la_SOURCES     = rhk-spm32.c
 robotics_la_SOURCES      = robotics.c
 s94file_la_SOURCES       = s94file.c
@@ -384,7 +406,7 @@ stmprg_la_SOURCES        = stmprg.c
 stpfile_la_SOURCES       = stpfile.c
 surffile_la_SOURCES      = surffile.c
 tiaser_la_SOURCES        = tiaser.c
-tescan_la_SOURCES        = tescan.c
+tescan_la_SOURCES        = tescan.c gwytiff.h
 unisoku_la_SOURCES       = unisoku.c
 vtkfile_la_SOURCES       = vtkfile.c
 win_stm_la_SOURCES       = win_stm.c
@@ -394,8 +416,125 @@ witec_asc_la_SOURCES     = witec-asc.c
 wsffile_la_SOURCES       = wsffile.c
 wsxmfile_la_SOURCES      = wsxmfile.c
 xyzexport_la_SOURCES     = xyzexport.c
-zeiss_la_SOURCES         = zeiss.c
+zeiss_la_SOURCES         = zeiss.c gwytiff.h
+zeisslsm_la_SOURCES      = zeisslsm.c gwytiff.h
 zemax_la_SOURCES         = zemax.c
 
+file_la_SOURCES =  \
+	$(accurexii_txt_la_SOURCES) \
+	$(aistfile_la_SOURCES) \
+	$(alicona_la_SOURCES) \
+	$(ambfile_la_SOURCES) \
+	$(anfatec_la_SOURCES) \
+	$(apefile_la_SOURCES) \
+	$(asciiexport_la_SOURCES) \
+	$(assing_afm_la_SOURCES) \
+	$(attocube_la_SOURCES) \
+	$(bcrfile_la_SOURCES) \
+	$(burleigh_la_SOURCES) \
+	$(burleigh_bii_la_SOURCES) \
+	$(burleigh_exp_la_SOURCES) \
+	$(codevfile_la_SOURCES) \
+	$(csmfile_la_SOURCES) \
+	$(dektakvca_la_SOURCES) \
+	$(dektakxml_la_SOURCES) \
+	$(dimensionfile_la_SOURCES) \
+	$(dmefile_la_SOURCES) \
+	$(dm3file_la_SOURCES) \
+	$(dumbfile_la_SOURCES) \
+	$(ecsfile_la_SOURCES) \
+	$(ezdfile_la_SOURCES) \
+	$(femtoscan_la_SOURCES) \
+	$(femtoscan_txt_la_SOURCES) \
+	$(gdeffile_la_SOURCES) \
+	$(gsffile_la_SOURCES) \
+	$(gwyfile_la_SOURCES) \
+	$(gxyzffile_la_SOURCES) \
+	$(hdf4file_la_SOURCES) \
+	$(hitachi_afm_la_SOURCES) \
+	$(hitachi_sem_la_SOURCES) \
+	$(igorfile_la_SOURCES) \
+	$(intelliwave_la_SOURCES) \
+	$(intematix_la_SOURCES) \
+	$(iso28600_la_SOURCES) \
+	$(jeol_la_SOURCES) \
+	$(jspmfile_la_SOURCES) \
+	$(keyence_la_SOURCES) \
+	$(leica_la_SOURCES) \
+	$(lextfile_la_SOURCES) \
+	$(magellan_la_SOURCES) \
+	$(mapvue_la_SOURCES) \
+	$(metropro_la_SOURCES) \
+	$(microprof_la_SOURCES) \
+	$(miffile_la_SOURCES) \
+	$(mifile_la_SOURCES) \
+	$(mulfile_la_SOURCES) \
+	$(nanoeducator_la_SOURCES) \
+	$(nanomagnetics_la_SOURCES) \
+	$(nanonics_la_SOURCES) \
+	$(nanonis_la_SOURCES) \
+	$(nanoscan_la_SOURCES) \
+	$(nanoscope_ii_la_SOURCES) \
+	$(nanoscope_la_SOURCES) \
+	$(nanotop_la_SOURCES) \
+	$(netcdf_la_SOURCES) \
+	$(nmmxyz_la_SOURCES) \
+	$(nt_mdt_la_SOURCES) \
+	$(nxiifile_la_SOURCES) \
+	$(oldmda_la_SOURCES) \
+	$(ols_la_SOURCES) \
+	$(ometiff_la_SOURCES) \
+	$(omicron_la_SOURCES) \
+	$(omicronflat_la_SOURCES) \
+	$(omicronmatrix_la_SOURCES) \
+	$(opdfile_la_SOURCES) \
+	$(pnifile_la_SOURCES) \
+	$(pltfile_la_SOURCES) \
+	$(princetonspe_la_SOURCES) \
+	$(psia_la_SOURCES) \
+	$(pt3file_la_SOURCES) \
+	$(quesant_la_SOURCES) \
+	$(rawfile_la_SOURCES) \
+	$(rawgraph_la_SOURCES) \
+	$(rawxyz_la_SOURCES) \
+	$(renishaw_la_SOURCES) \
+	$(rhk_sm3_la_SOURCES) \
+	$(rhk_spm32_la_SOURCES) \
+	$(robotics_la_SOURCES) \
+	$(s94file_la_SOURCES) \
+	$(sdfile_la_SOURCES) \
+	$(seiko_la_SOURCES) \
+	$(sensofar_la_SOURCES) \
+	$(sensolytics_la_SOURCES) \
+	$(shimadzu_la_SOURCES) \
+	$(sicmfile_la_SOURCES) \
+	$(sis_la_SOURCES) \
+	$(spip_asc_la_SOURCES) \
+	$(spmlab_la_SOURCES) \
+	$(spmlabf_la_SOURCES) \
+	$(stmprg_la_SOURCES) \
+	$(stpfile_la_SOURCES) \
+	$(surffile_la_SOURCES) \
+	$(tiaser_la_SOURCES) \
+	$(tescan_la_SOURCES) \
+	$(unisoku_la_SOURCES) \
+	$(vtkfile_la_SOURCES) \
+	$(win_stm_la_SOURCES) \
+	$(wipfile_la_SOURCES) \
+	$(witfile_la_SOURCES) \
+	$(witec_asc_la_SOURCES) \
+	$(wsffile_la_SOURCES) \
+	$(wsxmfile_la_SOURCES) \
+	$(xyzexport_la_SOURCES) \
+	$(zeiss_la_SOURCES) \
+	$(zeisslsm_la_SOURCES) \
+	$(zemax_la_SOURCES) \
+	file.c
+
+file.c: $(srcdir)/Makefile.am $(top_builddir)/config.status $(top_srcdir)/utils/gen-module-bundle.sh
+	$(SHELL) $(top_srcdir)/utils/gen-module-bundle.sh file.c $(bundlable_modules)
+
+CLEAN_FILES = file.c
+
 clean-local:
 	rm -f core.* *~
diff --git a/modules/file/Makefile.in b/modules/file/Makefile.in
index 5ab28e7..208073f 100644
--- a/modules/file/Makefile.in
+++ b/modules/file/Makefile.in
@@ -14,7 +14,7 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 18773 2016-07-26 05:53:30Z yeti-dn $
+# @(#) $Id: Makefile.am 20186 2017-08-07 14:15:17Z yeti-dn $
 
 
 VPATH = @srcdir@
@@ -154,18 +154,23 @@ AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
+ at MODULE_BUNDLING_FALSE@am_accurexii_txt_la_rpath = -rpath $(filedir)
 aistfile_la_LIBADD =
 am_aistfile_la_OBJECTS = aistfile.lo
 aistfile_la_OBJECTS = $(am_aistfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_aistfile_la_rpath = -rpath $(filedir)
 alicona_la_LIBADD =
 am_alicona_la_OBJECTS = alicona.lo
 alicona_la_OBJECTS = $(am_alicona_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_alicona_la_rpath = -rpath $(filedir)
 ambfile_la_LIBADD =
 am_ambfile_la_OBJECTS = ambfile.lo
 ambfile_la_OBJECTS = $(am_ambfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_ambfile_la_rpath = -rpath $(filedir)
 anfatec_la_LIBADD =
 am_anfatec_la_OBJECTS = anfatec.lo
 anfatec_la_OBJECTS = $(am_anfatec_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_anfatec_la_rpath = -rpath $(filedir)
 am__DEPENDENCIES_1 =
 @HAVE_ANY_ZIP_TRUE@@HAVE_XML2_TRUE at apedaxfile_la_DEPENDENCIES =  \
 @HAVE_ANY_ZIP_TRUE@@HAVE_XML2_TRUE@	$(am__DEPENDENCIES_1)
@@ -180,63 +185,237 @@ apedaxfile_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 apefile_la_LIBADD =
 am_apefile_la_OBJECTS = apefile.lo
 apefile_la_OBJECTS = $(am_apefile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_apefile_la_rpath = -rpath $(filedir)
 asciiexport_la_LIBADD =
 am_asciiexport_la_OBJECTS = asciiexport.lo
 asciiexport_la_OBJECTS = $(am_asciiexport_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_asciiexport_la_rpath = -rpath $(filedir)
 assing_afm_la_LIBADD =
 am_assing_afm_la_OBJECTS = assing-afm.lo
 assing_afm_la_OBJECTS = $(am_assing_afm_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_assing_afm_la_rpath = -rpath $(filedir)
 attocube_la_LIBADD =
 am_attocube_la_OBJECTS = attocube.lo
 attocube_la_OBJECTS = $(am_attocube_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_attocube_la_rpath = -rpath $(filedir)
 bcrfile_la_LIBADD =
 am_bcrfile_la_OBJECTS = bcrfile.lo
 bcrfile_la_OBJECTS = $(am_bcrfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_bcrfile_la_rpath = -rpath $(filedir)
 burleigh_la_LIBADD =
 am_burleigh_la_OBJECTS = burleigh.lo
 burleigh_la_OBJECTS = $(am_burleigh_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_burleigh_la_rpath = -rpath $(filedir)
 burleigh_bii_la_LIBADD =
 am_burleigh_bii_la_OBJECTS = burleigh_bii.lo
 burleigh_bii_la_OBJECTS = $(am_burleigh_bii_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_burleigh_bii_la_rpath = -rpath $(filedir)
 burleigh_exp_la_LIBADD =
 am_burleigh_exp_la_OBJECTS = burleigh_exp.lo
 burleigh_exp_la_OBJECTS = $(am_burleigh_exp_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_burleigh_exp_la_rpath = -rpath $(filedir)
 codevfile_la_LIBADD =
 am_codevfile_la_OBJECTS = codevfile.lo
 codevfile_la_OBJECTS = $(am_codevfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_codevfile_la_rpath = -rpath $(filedir)
 createc_la_DEPENDENCIES =
 am_createc_la_OBJECTS = createc.lo
 createc_la_OBJECTS = $(am_createc_la_OBJECTS)
 csmfile_la_LIBADD =
 am_csmfile_la_OBJECTS = csmfile.lo
 csmfile_la_OBJECTS = $(am_csmfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_csmfile_la_rpath = -rpath $(filedir)
+dektakvca_la_LIBADD =
+am_dektakvca_la_OBJECTS = dektakvca.lo
+dektakvca_la_OBJECTS = $(am_dektakvca_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_dektakvca_la_rpath = -rpath $(filedir)
 dektakxml_la_LIBADD =
 am_dektakxml_la_OBJECTS = dektakxml.lo
 dektakxml_la_OBJECTS = $(am_dektakxml_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_dektakxml_la_rpath = -rpath $(filedir)
 dimensionfile_la_LIBADD =
 am_dimensionfile_la_OBJECTS = dimensionfile.lo
 dimensionfile_la_OBJECTS = $(am_dimensionfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_dimensionfile_la_rpath = -rpath $(filedir)
 dm3file_la_LIBADD =
 am_dm3file_la_OBJECTS = dm3file.lo
 dm3file_la_OBJECTS = $(am_dm3file_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_dm3file_la_rpath = -rpath $(filedir)
 dmefile_la_LIBADD =
 am_dmefile_la_OBJECTS = dmefile.lo
 dmefile_la_OBJECTS = $(am_dmefile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_dmefile_la_rpath = -rpath $(filedir)
 dumbfile_la_LIBADD =
 am_dumbfile_la_OBJECTS = dumbfile.lo
 dumbfile_la_OBJECTS = $(am_dumbfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_dumbfile_la_rpath = -rpath $(filedir)
 ecsfile_la_LIBADD =
 am_ecsfile_la_OBJECTS = ecsfile.lo
 ecsfile_la_OBJECTS = $(am_ecsfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_ecsfile_la_rpath = -rpath $(filedir)
 ezdfile_la_LIBADD =
 am_ezdfile_la_OBJECTS = ezdfile.lo
 ezdfile_la_OBJECTS = $(am_ezdfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_ezdfile_la_rpath = -rpath $(filedir)
 femtoscan_txt_la_LIBADD =
 am_femtoscan_txt_la_OBJECTS = femtoscan-txt.lo
 femtoscan_txt_la_OBJECTS = $(am_femtoscan_txt_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_femtoscan_txt_la_rpath = -rpath $(filedir)
 femtoscan_la_LIBADD =
 am_femtoscan_la_OBJECTS = femtoscan.lo
 femtoscan_la_OBJECTS = $(am_femtoscan_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_femtoscan_la_rpath = -rpath $(filedir)
+file_la_LIBADD =
+am__objects_1 = file_la-accurexii-txt.lo
+am__objects_2 = file_la-aistfile.lo
+am__objects_3 = file_la-alicona.lo
+am__objects_4 = file_la-ambfile.lo
+am__objects_5 = file_la-anfatec.lo
+am__objects_6 = file_la-apefile.lo
+am__objects_7 = file_la-asciiexport.lo
+am__objects_8 = file_la-assing-afm.lo
+am__objects_9 = file_la-attocube.lo
+am__objects_10 = file_la-bcrfile.lo
+am__objects_11 = file_la-burleigh.lo
+am__objects_12 = file_la-burleigh_bii.lo
+am__objects_13 = file_la-burleigh_exp.lo
+am__objects_14 = file_la-codevfile.lo
+am__objects_15 = file_la-csmfile.lo
+am__objects_16 = file_la-dektakvca.lo
+am__objects_17 = file_la-dektakxml.lo
+am__objects_18 = file_la-dimensionfile.lo
+am__objects_19 = file_la-dmefile.lo
+am__objects_20 = file_la-dm3file.lo
+am__objects_21 = file_la-dumbfile.lo
+am__objects_22 = file_la-ecsfile.lo
+am__objects_23 = file_la-ezdfile.lo
+am__objects_24 = file_la-femtoscan.lo
+am__objects_25 = file_la-femtoscan-txt.lo
+am__objects_26 = file_la-gdeffile.lo
+am__objects_27 = file_la-gsffile.lo
+am__objects_28 = file_la-gwyfile.lo
+am__objects_29 = file_la-gxyzffile.lo
+am__objects_30 = file_la-hdf4file.lo
+am__objects_31 = file_la-hitachi-afm.lo
+am__objects_32 = file_la-hitachi-sem.lo
+am__objects_33 = file_la-igorfile.lo
+am__objects_34 = file_la-intelliwave.lo
+am__objects_35 = file_la-intematix.lo
+am__objects_36 = file_la-iso28600.lo
+am__objects_37 = file_la-jeol.lo
+am__objects_38 = file_la-jspmfile.lo
+am__objects_39 = file_la-keyence.lo
+am__objects_40 = file_la-leica.lo
+am__objects_41 = file_la-lextfile.lo
+am__objects_42 = file_la-magellan.lo
+am__objects_43 = file_la-mapvue.lo
+am__objects_44 = file_la-metropro.lo
+am__objects_45 = file_la-microprof.lo
+am__objects_46 = file_la-miffile.lo
+am__objects_47 = file_la-mifile.lo
+am__objects_48 = file_la-mulfile.lo
+am__objects_49 = file_la-nanoeducator.lo
+am__objects_50 = file_la-nanomagnetics.lo
+am__objects_51 = file_la-nanonics.lo
+am__objects_52 = file_la-nanonis.lo
+am__objects_53 = file_la-nanoscan.lo
+am__objects_54 = file_la-nanoscope-ii.lo
+am__objects_55 = file_la-nanoscope.lo
+am__objects_56 = file_la-nanotop.lo
+am__objects_57 = file_la-netcdf.lo
+am__objects_58 = file_la-nmmxyz.lo
+am__objects_59 = file_la-nt-mdt.lo
+am__objects_60 = file_la-nxiifile.lo
+am__objects_61 = file_la-oldmda.lo
+am__objects_62 = file_la-ols.lo
+am__objects_63 = file_la-ometiff.lo
+am__objects_64 = file_la-omicron.lo
+am__objects_65 = file_la-omicronflat.lo
+am__objects_66 = file_la-omicronmatrix.lo
+am__objects_67 = file_la-opdfile.lo
+am__objects_68 = file_la-pnifile.lo
+am__objects_69 = file_la-pltfile.lo
+am__objects_70 = file_la-princetonspe.lo
+am__objects_71 = file_la-psia.lo
+am__objects_72 = file_la-pt3file.lo
+am__objects_73 = file_la-quesant.lo
+am__objects_74 = file_la-rawfile.lo
+am__objects_75 = file_la-rawgraph.lo
+am__objects_76 = file_la-rawxyz.lo
+am__objects_77 = file_la-renishaw.lo
+am__objects_78 = file_la-rhk-sm3.lo
+am__objects_79 = file_la-rhk-spm32.lo
+am__objects_80 = file_la-robotics.lo
+am__objects_81 = file_la-s94file.lo
+am__objects_82 = file_la-sdfile.lo
+am__objects_83 = file_la-seiko.lo
+am__objects_84 = file_la-sensofar.lo
+am__objects_85 = file_la-sensolytics.lo
+am__objects_86 = file_la-shimadzu.lo
+am__objects_87 = file_la-sicmfile.lo
+am__objects_88 = file_la-sis.lo
+am__objects_89 = file_la-spip-asc.lo
+am__objects_90 = file_la-spmlab.lo
+am__objects_91 = file_la-spmlabf.lo
+am__objects_92 = file_la-stmprg.lo
+am__objects_93 = file_la-stpfile.lo
+am__objects_94 = file_la-surffile.lo
+am__objects_95 = file_la-tiaser.lo
+am__objects_96 = file_la-tescan.lo
+am__objects_97 = file_la-unisoku.lo
+am__objects_98 = file_la-vtkfile.lo
+am__objects_99 = file_la-win_stm.lo
+am__objects_100 = file_la-wipfile.lo
+am__objects_101 = file_la-witfile.lo
+am__objects_102 = file_la-witec-asc.lo
+am__objects_103 = file_la-wsffile.lo
+am__objects_104 = file_la-wsxmfile.lo
+am__objects_105 = file_la-xyzexport.lo
+am__objects_106 = file_la-zeiss.lo
+am__objects_107 = file_la-zeisslsm.lo
+am__objects_108 = file_la-zemax.lo
+am_file_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
+	$(am__objects_3) $(am__objects_4) $(am__objects_5) \
+	$(am__objects_6) $(am__objects_7) $(am__objects_8) \
+	$(am__objects_9) $(am__objects_10) $(am__objects_11) \
+	$(am__objects_12) $(am__objects_13) $(am__objects_14) \
+	$(am__objects_15) $(am__objects_16) $(am__objects_17) \
+	$(am__objects_18) $(am__objects_19) $(am__objects_20) \
+	$(am__objects_21) $(am__objects_22) $(am__objects_23) \
+	$(am__objects_24) $(am__objects_25) $(am__objects_26) \
+	$(am__objects_27) $(am__objects_28) $(am__objects_29) \
+	$(am__objects_30) $(am__objects_31) $(am__objects_32) \
+	$(am__objects_33) $(am__objects_34) $(am__objects_35) \
+	$(am__objects_36) $(am__objects_37) $(am__objects_38) \
+	$(am__objects_39) $(am__objects_40) $(am__objects_41) \
+	$(am__objects_42) $(am__objects_43) $(am__objects_44) \
+	$(am__objects_45) $(am__objects_46) $(am__objects_47) \
+	$(am__objects_48) $(am__objects_49) $(am__objects_50) \
+	$(am__objects_51) $(am__objects_52) $(am__objects_53) \
+	$(am__objects_54) $(am__objects_55) $(am__objects_56) \
+	$(am__objects_57) $(am__objects_58) $(am__objects_59) \
+	$(am__objects_60) $(am__objects_61) $(am__objects_62) \
+	$(am__objects_63) $(am__objects_64) $(am__objects_65) \
+	$(am__objects_66) $(am__objects_67) $(am__objects_68) \
+	$(am__objects_69) $(am__objects_70) $(am__objects_71) \
+	$(am__objects_72) $(am__objects_73) $(am__objects_74) \
+	$(am__objects_75) $(am__objects_76) $(am__objects_77) \
+	$(am__objects_78) $(am__objects_79) $(am__objects_80) \
+	$(am__objects_81) $(am__objects_82) $(am__objects_83) \
+	$(am__objects_84) $(am__objects_85) $(am__objects_86) \
+	$(am__objects_87) $(am__objects_88) $(am__objects_89) \
+	$(am__objects_90) $(am__objects_91) $(am__objects_92) \
+	$(am__objects_93) $(am__objects_94) $(am__objects_95) \
+	$(am__objects_96) $(am__objects_97) $(am__objects_98) \
+	$(am__objects_99) $(am__objects_100) $(am__objects_101) \
+	$(am__objects_102) $(am__objects_103) $(am__objects_104) \
+	$(am__objects_105) $(am__objects_106) $(am__objects_107) \
+	$(am__objects_108) file_la-file.lo
+file_la_OBJECTS = $(am_file_la_OBJECTS)
+file_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(file_la_CFLAGS) \
+	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+ at MODULE_BUNDLING_TRUE@am_file_la_rpath = -rpath $(filedir)
 fitsfile_la_DEPENDENCIES =
 am__fitsfile_la_SOURCES_DIST = fitsfile.c
 @HAVE_CFITSIO_TRUE at am_fitsfile_la_OBJECTS = fitsfile_la-fitsfile.lo
@@ -248,18 +427,23 @@ fitsfile_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 gdeffile_la_LIBADD =
 am_gdeffile_la_OBJECTS = gdeffile.lo
 gdeffile_la_OBJECTS = $(am_gdeffile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_gdeffile_la_rpath = -rpath $(filedir)
 gsffile_la_LIBADD =
 am_gsffile_la_OBJECTS = gsffile.lo
 gsffile_la_OBJECTS = $(am_gsffile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_gsffile_la_rpath = -rpath $(filedir)
 gwyfile_la_LIBADD =
 am_gwyfile_la_OBJECTS = gwyfile.lo
 gwyfile_la_OBJECTS = $(am_gwyfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_gwyfile_la_rpath = -rpath $(filedir)
 gxyzffile_la_LIBADD =
 am_gxyzffile_la_OBJECTS = gxyzffile.lo
 gxyzffile_la_OBJECTS = $(am_gxyzffile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_gxyzffile_la_rpath = -rpath $(filedir)
 hdf4file_la_LIBADD =
 am_hdf4file_la_OBJECTS = hdf4file.lo
 hdf4file_la_OBJECTS = $(am_hdf4file_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_hdf4file_la_rpath = -rpath $(filedir)
 hdrimage_la_DEPENDENCIES =
 am__hdrimage_la_SOURCES_DIST = hdrimage.cc gwytiff.h image-keys.h
 @HAVE_CXX_TRUE at am_hdrimage_la_OBJECTS = hdrimage_la-hdrimage.lo
@@ -271,12 +455,15 @@ hdrimage_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
 hitachi_afm_la_LIBADD =
 am_hitachi_afm_la_OBJECTS = hitachi-afm.lo
 hitachi_afm_la_OBJECTS = $(am_hitachi_afm_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_hitachi_afm_la_rpath = -rpath $(filedir)
 hitachi_sem_la_LIBADD =
 am_hitachi_sem_la_OBJECTS = hitachi-sem.lo
 hitachi_sem_la_OBJECTS = $(am_hitachi_sem_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_hitachi_sem_la_rpath = -rpath $(filedir)
 igorfile_la_LIBADD =
 am_igorfile_la_OBJECTS = igorfile.lo
 igorfile_la_OBJECTS = $(am_igorfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_igorfile_la_rpath = -rpath $(filedir)
 imgexport_la_DEPENDENCIES =
 am_imgexport_la_OBJECTS = imgexport_la-imgexport.lo
 imgexport_la_OBJECTS = $(am_imgexport_la_OBJECTS)
@@ -286,15 +473,19 @@ imgexport_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 intelliwave_la_LIBADD =
 am_intelliwave_la_OBJECTS = intelliwave.lo
 intelliwave_la_OBJECTS = $(am_intelliwave_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_intelliwave_la_rpath = -rpath $(filedir)
 intematix_la_LIBADD =
 am_intematix_la_OBJECTS = intematix.lo
 intematix_la_OBJECTS = $(am_intematix_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_intematix_la_rpath = -rpath $(filedir)
 iso28600_la_LIBADD =
 am_iso28600_la_OBJECTS = iso28600.lo
 iso28600_la_OBJECTS = $(am_iso28600_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_iso28600_la_rpath = -rpath $(filedir)
 jeol_la_LIBADD =
 am_jeol_la_OBJECTS = jeol.lo
 jeol_la_OBJECTS = $(am_jeol_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_jeol_la_rpath = -rpath $(filedir)
 jpkscan_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
 am_jpkscan_la_OBJECTS = jpkscan_la-jpkscan.lo
 jpkscan_la_OBJECTS = $(am_jpkscan_la_OBJECTS)
@@ -304,48 +495,63 @@ jpkscan_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 jspmfile_la_LIBADD =
 am_jspmfile_la_OBJECTS = jspmfile.lo
 jspmfile_la_OBJECTS = $(am_jspmfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_jspmfile_la_rpath = -rpath $(filedir)
 keyence_la_LIBADD =
 am_keyence_la_OBJECTS = keyence.lo
 keyence_la_OBJECTS = $(am_keyence_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_keyence_la_rpath = -rpath $(filedir)
 leica_la_LIBADD =
 am_leica_la_OBJECTS = leica.lo
 leica_la_OBJECTS = $(am_leica_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_leica_la_rpath = -rpath $(filedir)
 lextfile_la_LIBADD =
 am_lextfile_la_OBJECTS = lextfile.lo
 lextfile_la_OBJECTS = $(am_lextfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_lextfile_la_rpath = -rpath $(filedir)
 magellan_la_LIBADD =
 am_magellan_la_OBJECTS = magellan.lo
 magellan_la_OBJECTS = $(am_magellan_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_magellan_la_rpath = -rpath $(filedir)
 mapvue_la_LIBADD =
 am_mapvue_la_OBJECTS = mapvue.lo
 mapvue_la_OBJECTS = $(am_mapvue_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_mapvue_la_rpath = -rpath $(filedir)
 metropro_la_LIBADD =
 am_metropro_la_OBJECTS = metropro.lo
 metropro_la_OBJECTS = $(am_metropro_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_metropro_la_rpath = -rpath $(filedir)
 microprof_la_LIBADD =
 am_microprof_la_OBJECTS = microprof.lo
 microprof_la_OBJECTS = $(am_microprof_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_microprof_la_rpath = -rpath $(filedir)
 miffile_la_LIBADD =
 am_miffile_la_OBJECTS = miffile.lo
 miffile_la_OBJECTS = $(am_miffile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_miffile_la_rpath = -rpath $(filedir)
 mifile_la_LIBADD =
 am_mifile_la_OBJECTS = mifile.lo
 mifile_la_OBJECTS = $(am_mifile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_mifile_la_rpath = -rpath $(filedir)
 mulfile_la_LIBADD =
 am_mulfile_la_OBJECTS = mulfile.lo
 mulfile_la_OBJECTS = $(am_mulfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_mulfile_la_rpath = -rpath $(filedir)
 nanoeducator_la_LIBADD =
 am_nanoeducator_la_OBJECTS = nanoeducator.lo
 nanoeducator_la_OBJECTS = $(am_nanoeducator_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_nanoeducator_la_rpath = -rpath $(filedir)
 nanomagnetics_la_LIBADD =
 am_nanomagnetics_la_OBJECTS = nanomagnetics.lo
 nanomagnetics_la_OBJECTS = $(am_nanomagnetics_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_nanomagnetics_la_rpath = -rpath $(filedir)
 nanonics_la_LIBADD =
 am_nanonics_la_OBJECTS = nanonics.lo
 nanonics_la_OBJECTS = $(am_nanonics_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_nanonics_la_rpath = -rpath $(filedir)
 nanonis_la_LIBADD =
 am_nanonis_la_OBJECTS = nanonis.lo
 nanonis_la_OBJECTS = $(am_nanonis_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_nanonis_la_rpath = -rpath $(filedir)
 @HAVE_ANY_ZIP_TRUE at nanoobserver_la_DEPENDENCIES =  \
 @HAVE_ANY_ZIP_TRUE@	$(am__DEPENDENCIES_1)
 am__nanoobserver_la_SOURCES_DIST = nanoobserver.c gwyzip.h
@@ -360,6 +566,7 @@ nanoobserver_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 nanoscan_la_LIBADD =
 am_nanoscan_la_OBJECTS = nanoscan.lo
 nanoscan_la_OBJECTS = $(am_nanoscan_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_nanoscan_la_rpath = -rpath $(filedir)
 @HAVE_ANY_ZIP_TRUE at nanoscantech_la_DEPENDENCIES =  \
 @HAVE_ANY_ZIP_TRUE@	$(am__DEPENDENCIES_1)
 am__nanoscantech_la_SOURCES_DIST = nanoscantech.c gwyzip.h
@@ -374,48 +581,62 @@ nanoscantech_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 nanoscope_ii_la_LIBADD =
 am_nanoscope_ii_la_OBJECTS = nanoscope-ii.lo
 nanoscope_ii_la_OBJECTS = $(am_nanoscope_ii_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_nanoscope_ii_la_rpath = -rpath $(filedir)
 nanoscope_la_LIBADD =
 am_nanoscope_la_OBJECTS = nanoscope.lo
 nanoscope_la_OBJECTS = $(am_nanoscope_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_nanoscope_la_rpath = -rpath $(filedir)
 nanotop_la_LIBADD =
 am_nanotop_la_OBJECTS = nanotop.lo
 nanotop_la_OBJECTS = $(am_nanotop_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_nanotop_la_rpath = -rpath $(filedir)
 netcdf_la_LIBADD =
 am_netcdf_la_OBJECTS = netcdf.lo
 netcdf_la_OBJECTS = $(am_netcdf_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_netcdf_la_rpath = -rpath $(filedir)
 nmmxyz_la_LIBADD =
 am_nmmxyz_la_OBJECTS = nmmxyz.lo
 nmmxyz_la_OBJECTS = $(am_nmmxyz_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_nmmxyz_la_rpath = -rpath $(filedir)
 nrrdfile_la_DEPENDENCIES =
 am_nrrdfile_la_OBJECTS = nrrdfile.lo
 nrrdfile_la_OBJECTS = $(am_nrrdfile_la_OBJECTS)
 nt_mdt_la_LIBADD =
 am_nt_mdt_la_OBJECTS = nt-mdt.lo
 nt_mdt_la_OBJECTS = $(am_nt_mdt_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_nt_mdt_la_rpath = -rpath $(filedir)
 nxiifile_la_LIBADD =
 am_nxiifile_la_OBJECTS = nxiifile.lo
 nxiifile_la_OBJECTS = $(am_nxiifile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_nxiifile_la_rpath = -rpath $(filedir)
 oldmda_la_LIBADD =
 am_oldmda_la_OBJECTS = oldmda.lo
 oldmda_la_OBJECTS = $(am_oldmda_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_oldmda_la_rpath = -rpath $(filedir)
 ols_la_LIBADD =
 am_ols_la_OBJECTS = ols.lo
 ols_la_OBJECTS = $(am_ols_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_ols_la_rpath = -rpath $(filedir)
 ometiff_la_LIBADD =
 am_ometiff_la_OBJECTS = ometiff.lo
 ometiff_la_OBJECTS = $(am_ometiff_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_ometiff_la_rpath = -rpath $(filedir)
 omicron_la_LIBADD =
 am_omicron_la_OBJECTS = omicron.lo
 omicron_la_OBJECTS = $(am_omicron_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_omicron_la_rpath = -rpath $(filedir)
 omicronflat_la_LIBADD =
 am_omicronflat_la_OBJECTS = omicronflat.lo
 omicronflat_la_OBJECTS = $(am_omicronflat_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_omicronflat_la_rpath = -rpath $(filedir)
 omicronmatrix_la_LIBADD =
 am_omicronmatrix_la_OBJECTS = omicronmatrix.lo
 omicronmatrix_la_OBJECTS = $(am_omicronmatrix_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_omicronmatrix_la_rpath = -rpath $(filedir)
 opdfile_la_LIBADD =
 am_opdfile_la_OBJECTS = opdfile.lo
 opdfile_la_OBJECTS = $(am_opdfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_opdfile_la_rpath = -rpath $(filedir)
 @HAVE_ANY_ZIP_TRUE at opengps_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
 am__opengps_la_SOURCES_DIST = opengps.c gwyzip.h
 @HAVE_ANY_ZIP_TRUE at am_opengps_la_OBJECTS = opengps_la-opengps.lo
@@ -433,57 +654,74 @@ pixmap_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 pltfile_la_LIBADD =
 am_pltfile_la_OBJECTS = pltfile.lo
 pltfile_la_OBJECTS = $(am_pltfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_pltfile_la_rpath = -rpath $(filedir)
 pnifile_la_LIBADD =
 am_pnifile_la_OBJECTS = pnifile.lo
 pnifile_la_OBJECTS = $(am_pnifile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_pnifile_la_rpath = -rpath $(filedir)
 princetonspe_la_LIBADD =
 am_princetonspe_la_OBJECTS = princetonspe.lo
 princetonspe_la_OBJECTS = $(am_princetonspe_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_princetonspe_la_rpath = -rpath $(filedir)
 psia_la_LIBADD =
 am_psia_la_OBJECTS = psia.lo
 psia_la_OBJECTS = $(am_psia_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_psia_la_rpath = -rpath $(filedir)
 pt3file_la_LIBADD =
 am_pt3file_la_OBJECTS = pt3file.lo
 pt3file_la_OBJECTS = $(am_pt3file_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_pt3file_la_rpath = -rpath $(filedir)
 quesant_la_LIBADD =
 am_quesant_la_OBJECTS = quesant.lo
 quesant_la_OBJECTS = $(am_quesant_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_quesant_la_rpath = -rpath $(filedir)
 rawfile_la_LIBADD =
 am_rawfile_la_OBJECTS = rawfile.lo
 rawfile_la_OBJECTS = $(am_rawfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_rawfile_la_rpath = -rpath $(filedir)
 rawgraph_la_LIBADD =
 am_rawgraph_la_OBJECTS = rawgraph.lo
 rawgraph_la_OBJECTS = $(am_rawgraph_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_rawgraph_la_rpath = -rpath $(filedir)
 rawxyz_la_LIBADD =
 am_rawxyz_la_OBJECTS = rawxyz.lo
 rawxyz_la_OBJECTS = $(am_rawxyz_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_rawxyz_la_rpath = -rpath $(filedir)
 renishaw_la_LIBADD =
 am_renishaw_la_OBJECTS = renishaw.lo
 renishaw_la_OBJECTS = $(am_renishaw_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_renishaw_la_rpath = -rpath $(filedir)
 rhk_sm3_la_LIBADD =
 am_rhk_sm3_la_OBJECTS = rhk-sm3.lo
 rhk_sm3_la_OBJECTS = $(am_rhk_sm3_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_rhk_sm3_la_rpath = -rpath $(filedir)
 rhk_sm4_la_DEPENDENCIES =
 am_rhk_sm4_la_OBJECTS = rhk-sm4.lo
 rhk_sm4_la_OBJECTS = $(am_rhk_sm4_la_OBJECTS)
 rhk_spm32_la_LIBADD =
 am_rhk_spm32_la_OBJECTS = rhk-spm32.lo
 rhk_spm32_la_OBJECTS = $(am_rhk_spm32_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_rhk_spm32_la_rpath = -rpath $(filedir)
 robotics_la_LIBADD =
 am_robotics_la_OBJECTS = robotics.lo
 robotics_la_OBJECTS = $(am_robotics_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_robotics_la_rpath = -rpath $(filedir)
 s94file_la_LIBADD =
 am_s94file_la_OBJECTS = s94file.lo
 s94file_la_OBJECTS = $(am_s94file_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_s94file_la_rpath = -rpath $(filedir)
 sdfile_la_LIBADD =
 am_sdfile_la_OBJECTS = sdfile.lo
 sdfile_la_OBJECTS = $(am_sdfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_sdfile_la_rpath = -rpath $(filedir)
 seiko_la_LIBADD =
 am_seiko_la_OBJECTS = seiko.lo
 seiko_la_OBJECTS = $(am_seiko_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_seiko_la_rpath = -rpath $(filedir)
 sensofar_la_LIBADD =
 am_sensofar_la_OBJECTS = sensofar.lo
 sensofar_la_OBJECTS = $(am_sensofar_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_sensofar_la_rpath = -rpath $(filedir)
 @HAVE_ANY_ZIP_TRUE at sensofarx_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
 am__sensofarx_la_SOURCES_DIST = sensofarx.c
 @HAVE_ANY_ZIP_TRUE at am_sensofarx_la_OBJECTS =  \
@@ -496,18 +734,23 @@ sensofarx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 sensolytics_la_LIBADD =
 am_sensolytics_la_OBJECTS = sensolytics.lo
 sensolytics_la_OBJECTS = $(am_sensolytics_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_sensolytics_la_rpath = -rpath $(filedir)
 shimadzu_la_LIBADD =
 am_shimadzu_la_OBJECTS = shimadzu.lo
 shimadzu_la_OBJECTS = $(am_shimadzu_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_shimadzu_la_rpath = -rpath $(filedir)
 sicmfile_la_LIBADD =
 am_sicmfile_la_OBJECTS = sicmfile.lo
 sicmfile_la_OBJECTS = $(am_sicmfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_sicmfile_la_rpath = -rpath $(filedir)
 sis_la_LIBADD =
 am_sis_la_OBJECTS = sis.lo
 sis_la_OBJECTS = $(am_sis_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_sis_la_rpath = -rpath $(filedir)
 spip_asc_la_LIBADD =
 am_spip_asc_la_OBJECTS = spip-asc.lo
 spip_asc_la_OBJECTS = $(am_spip_asc_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_spip_asc_la_rpath = -rpath $(filedir)
 spml_la_DEPENDENCIES =
 am__spml_la_SOURCES_DIST = spml.c spml-utils.h
 @HAVE_XML2_TRUE@@HAVE_ZLIB_TRUE at am_spml_la_OBJECTS = spml_la-spml.lo
@@ -519,9 +762,11 @@ spml_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 spmlab_la_LIBADD =
 am_spmlab_la_OBJECTS = spmlab.lo
 spmlab_la_OBJECTS = $(am_spmlab_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_spmlab_la_rpath = -rpath $(filedir)
 spmlabf_la_LIBADD =
 am_spmlabf_la_OBJECTS = spmlabf.lo
 spmlabf_la_OBJECTS = $(am_spmlabf_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_spmlabf_la_rpath = -rpath $(filedir)
 @HAVE_ANY_ZIP_TRUE at spmxfile_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
 am__spmxfile_la_SOURCES_DIST = spmxfile.c gwyzip.h
 @HAVE_ANY_ZIP_TRUE at am_spmxfile_la_OBJECTS = spmxfile_la-spmxfile.lo
@@ -533,51 +778,71 @@ spmxfile_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 stmprg_la_LIBADD =
 am_stmprg_la_OBJECTS = stmprg.lo
 stmprg_la_OBJECTS = $(am_stmprg_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_stmprg_la_rpath = -rpath $(filedir)
 stpfile_la_LIBADD =
 am_stpfile_la_OBJECTS = stpfile.lo
 stpfile_la_OBJECTS = $(am_stpfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_stpfile_la_rpath = -rpath $(filedir)
 surffile_la_LIBADD =
 am_surffile_la_OBJECTS = surffile.lo
 surffile_la_OBJECTS = $(am_surffile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_surffile_la_rpath = -rpath $(filedir)
 tescan_la_LIBADD =
 am_tescan_la_OBJECTS = tescan.lo
 tescan_la_OBJECTS = $(am_tescan_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_tescan_la_rpath = -rpath $(filedir)
 tiaser_la_LIBADD =
 am_tiaser_la_OBJECTS = tiaser.lo
 tiaser_la_OBJECTS = $(am_tiaser_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_tiaser_la_rpath = -rpath $(filedir)
 unisoku_la_LIBADD =
 am_unisoku_la_OBJECTS = unisoku.lo
 unisoku_la_OBJECTS = $(am_unisoku_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_unisoku_la_rpath = -rpath $(filedir)
 vtkfile_la_LIBADD =
 am_vtkfile_la_OBJECTS = vtkfile.lo
 vtkfile_la_OBJECTS = $(am_vtkfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_vtkfile_la_rpath = -rpath $(filedir)
 win_stm_la_LIBADD =
 am_win_stm_la_OBJECTS = win_stm.lo
 win_stm_la_OBJECTS = $(am_win_stm_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_win_stm_la_rpath = -rpath $(filedir)
 wipfile_la_LIBADD =
 am_wipfile_la_OBJECTS = wipfile.lo
 wipfile_la_OBJECTS = $(am_wipfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_wipfile_la_rpath = -rpath $(filedir)
 witec_asc_la_LIBADD =
 am_witec_asc_la_OBJECTS = witec-asc.lo
 witec_asc_la_OBJECTS = $(am_witec_asc_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_witec_asc_la_rpath = -rpath $(filedir)
 witfile_la_LIBADD =
 am_witfile_la_OBJECTS = witfile.lo
 witfile_la_OBJECTS = $(am_witfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_witfile_la_rpath = -rpath $(filedir)
 wsffile_la_LIBADD =
 am_wsffile_la_OBJECTS = wsffile.lo
 wsffile_la_OBJECTS = $(am_wsffile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_wsffile_la_rpath = -rpath $(filedir)
 wsxmfile_la_LIBADD =
 am_wsxmfile_la_OBJECTS = wsxmfile.lo
 wsxmfile_la_OBJECTS = $(am_wsxmfile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_wsxmfile_la_rpath = -rpath $(filedir)
 xyzexport_la_LIBADD =
 am_xyzexport_la_OBJECTS = xyzexport.lo
 xyzexport_la_OBJECTS = $(am_xyzexport_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_xyzexport_la_rpath = -rpath $(filedir)
 zeiss_la_LIBADD =
 am_zeiss_la_OBJECTS = zeiss.lo
 zeiss_la_OBJECTS = $(am_zeiss_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_zeiss_la_rpath = -rpath $(filedir)
+zeisslsm_la_LIBADD =
+am_zeisslsm_la_OBJECTS = zeisslsm.lo
+zeisslsm_la_OBJECTS = $(am_zeisslsm_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_zeisslsm_la_rpath = -rpath $(filedir)
 zemax_la_LIBADD =
 am_zemax_la_OBJECTS = zemax.lo
 zemax_la_OBJECTS = $(am_zemax_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_zemax_la_rpath = -rpath $(filedir)
 AM_V_P = $(am__v_P_ at AM_V@)
 am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -638,11 +903,12 @@ SOURCES = $(accurexii_txt_la_SOURCES) $(aistfile_la_SOURCES) \
 	$(bcrfile_la_SOURCES) $(burleigh_la_SOURCES) \
 	$(burleigh_bii_la_SOURCES) $(burleigh_exp_la_SOURCES) \
 	$(codevfile_la_SOURCES) $(createc_la_SOURCES) \
-	$(csmfile_la_SOURCES) $(dektakxml_la_SOURCES) \
-	$(dimensionfile_la_SOURCES) $(dm3file_la_SOURCES) \
-	$(dmefile_la_SOURCES) $(dumbfile_la_SOURCES) \
-	$(ecsfile_la_SOURCES) $(ezdfile_la_SOURCES) \
-	$(femtoscan_txt_la_SOURCES) $(femtoscan_la_SOURCES) \
+	$(csmfile_la_SOURCES) $(dektakvca_la_SOURCES) \
+	$(dektakxml_la_SOURCES) $(dimensionfile_la_SOURCES) \
+	$(dm3file_la_SOURCES) $(dmefile_la_SOURCES) \
+	$(dumbfile_la_SOURCES) $(ecsfile_la_SOURCES) \
+	$(ezdfile_la_SOURCES) $(femtoscan_txt_la_SOURCES) \
+	$(femtoscan_la_SOURCES) $(file_la_SOURCES) \
 	$(fitsfile_la_SOURCES) $(gdeffile_la_SOURCES) \
 	$(gsffile_la_SOURCES) $(gwyfile_la_SOURCES) \
 	$(gxyzffile_la_SOURCES) $(hdf4file_la_SOURCES) \
@@ -688,7 +954,7 @@ SOURCES = $(accurexii_txt_la_SOURCES) $(aistfile_la_SOURCES) \
 	$(wipfile_la_SOURCES) $(witec_asc_la_SOURCES) \
 	$(witfile_la_SOURCES) $(wsffile_la_SOURCES) \
 	$(wsxmfile_la_SOURCES) $(xyzexport_la_SOURCES) \
-	$(zeiss_la_SOURCES) $(zemax_la_SOURCES)
+	$(zeiss_la_SOURCES) $(zeisslsm_la_SOURCES) $(zemax_la_SOURCES)
 DIST_SOURCES = $(accurexii_txt_la_SOURCES) $(aistfile_la_SOURCES) \
 	$(alicona_la_SOURCES) $(ambfile_la_SOURCES) \
 	$(anfatec_la_SOURCES) $(am__apedaxfile_la_SOURCES_DIST) \
@@ -697,11 +963,12 @@ DIST_SOURCES = $(accurexii_txt_la_SOURCES) $(aistfile_la_SOURCES) \
 	$(bcrfile_la_SOURCES) $(burleigh_la_SOURCES) \
 	$(burleigh_bii_la_SOURCES) $(burleigh_exp_la_SOURCES) \
 	$(codevfile_la_SOURCES) $(createc_la_SOURCES) \
-	$(csmfile_la_SOURCES) $(dektakxml_la_SOURCES) \
-	$(dimensionfile_la_SOURCES) $(dm3file_la_SOURCES) \
-	$(dmefile_la_SOURCES) $(dumbfile_la_SOURCES) \
-	$(ecsfile_la_SOURCES) $(ezdfile_la_SOURCES) \
-	$(femtoscan_txt_la_SOURCES) $(femtoscan_la_SOURCES) \
+	$(csmfile_la_SOURCES) $(dektakvca_la_SOURCES) \
+	$(dektakxml_la_SOURCES) $(dimensionfile_la_SOURCES) \
+	$(dm3file_la_SOURCES) $(dmefile_la_SOURCES) \
+	$(dumbfile_la_SOURCES) $(ecsfile_la_SOURCES) \
+	$(ezdfile_la_SOURCES) $(femtoscan_txt_la_SOURCES) \
+	$(femtoscan_la_SOURCES) $(file_la_SOURCES) \
 	$(am__fitsfile_la_SOURCES_DIST) $(gdeffile_la_SOURCES) \
 	$(gsffile_la_SOURCES) $(gwyfile_la_SOURCES) \
 	$(gxyzffile_la_SOURCES) $(hdf4file_la_SOURCES) \
@@ -748,7 +1015,7 @@ DIST_SOURCES = $(accurexii_txt_la_SOURCES) $(aistfile_la_SOURCES) \
 	$(witec_asc_la_SOURCES) $(witfile_la_SOURCES) \
 	$(wsffile_la_SOURCES) $(wsxmfile_la_SOURCES) \
 	$(xyzexport_la_SOURCES) $(zeiss_la_SOURCES) \
-	$(zemax_la_SOURCES)
+	$(zeisslsm_la_SOURCES) $(zemax_la_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -815,10 +1082,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -828,6 +1092,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -852,7 +1118,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -910,6 +1178,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -918,17 +1187,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -1088,7 +1353,8 @@ matfile_module =
 @HAVE_CXX_TRUE at hdrimage_module = hdrimage.la
 @HAVE_CXX_TRUE at hdrimage_la_SOURCES = hdrimage.cc gwytiff.h image-keys.h
 
-# Some modules require ‘any ZIP library’.  We must choose one.
+# Some modules require ‘any ZIP library’.  We must choose one.  Configure
+# should ensure at most one of the following is enabled.
 @HAVE_LIBZIP_TRUE at zip_cflags = @LIBZIP_CFLAGS@
 @HAVE_MINIZIP_TRUE at zip_cflags = @MINIZIP_CFLAGS@
 @HAVE_LIBZIP_TRUE at zip_libs = @LIBZIP_LIBS@
@@ -1097,25 +1363,28 @@ matfile_module =
 # These modules compile also without the respective libraries so just add the
 # flags if the libraries are available.
 createc_la_LIBADD = @ZLIB@
-nrrdfile_la_LIBADD = @ZLIB@ @BZIP2@
-pixmap_la_LIBADD = @PNG_LIBS@
-pixmap_la_CFLAGS = $(AM_CFLAGS) @PNG_CFLAGS@
+hdrimage_la_LIBADD = @EXR_LIBS@ @PNG_LIBS@
+hdrimage_la_CXXFLAGS = $(AM_CXXFLAGS) @PNG_CFLAGS@ @EXR_CFLAGS@ @HDRIMAGE_EXTRA_CFLAGS@
 imgexport_la_LIBADD = @PNG_LIBS@ @WEBP_LIBS@
 imgexport_la_CFLAGS = $(AM_CFLAGS) @PNG_CFLAGS@ @WEBP_CFLAGS@
-rhk_sm4_la_LIBADD = @ZLIB@
-hdrimage_la_LIBADD = @EXR_LIBS@ @PNG_LIBS@
-hdrimage_la_CXXFLAGS = $(AM_CXXFLAGS) @PNG_CFLAGS@ @EXR_CFLAGS@
 jpkscan_la_CFLAGS = $(AM_CFLAGS) $(zip_cflags)
 jpkscan_la_LIBADD = $(zip_libs)
+nrrdfile_la_LIBADD = @ZLIB@ @BZIP2@
+pixmap_la_LIBADD = @PNG_LIBS@
+pixmap_la_CFLAGS = $(AM_CFLAGS) @PNG_CFLAGS@
+rhk_sm4_la_LIBADD = @ZLIB@
 filedir = $(pkglibdir)/modules/file
-file_LTLIBRARIES = \
+
+# Only bundle modules without own dependencies.  If something goes wrong with
+# any required libraries at run-time, it will at most break these individual
+# unbundled modules, not the bundle.
+bundlable_modules = \
 	accurexii-txt.la \
 	aistfile.la \
 	alicona.la \
 	ambfile.la \
 	anfatec.la \
 	apefile.la \
-	$(apedaxfile_module) \
 	asciiexport.la \
 	assing-afm.la \
 	attocube.la \
@@ -1124,8 +1393,8 @@ file_LTLIBRARIES = \
 	burleigh_bii.la \
 	burleigh_exp.la \
 	codevfile.la \
-	createc.la \
 	csmfile.la \
+	dektakvca.la \
 	dektakxml.la \
 	dimensionfile.la \
 	dmefile.la \
@@ -1133,7 +1402,6 @@ file_LTLIBRARIES = \
 	dumbfile.la \
 	ecsfile.la \
 	ezdfile.la \
-	$(fitsfile_module) \
 	femtoscan.la \
 	femtoscan-txt.la \
 	gdeffile.la \
@@ -1141,23 +1409,19 @@ file_LTLIBRARIES = \
 	gwyfile.la \
 	gxyzffile.la \
 	hdf4file.la \
-	$(hdrimage_module) \
 	hitachi-afm.la \
 	hitachi-sem.la \
 	igorfile.la \
-	imgexport.la \
 	intelliwave.la \
 	intematix.la \
 	iso28600.la \
 	jeol.la \
-	jpkscan.la \
 	jspmfile.la \
 	keyence.la \
 	leica.la \
 	lextfile.la \
 	magellan.la \
 	mapvue.la \
-	$(matfile_module) \
 	metropro.la \
 	microprof.la \
 	miffile.la \
@@ -1167,15 +1431,12 @@ file_LTLIBRARIES = \
 	nanomagnetics.la \
 	nanonics.la \
 	nanonis.la \
-	$(nanoobserver_module) \
 	nanoscan.la \
-	$(nanoscantech_module) \
 	nanoscope-ii.la \
 	nanoscope.la \
 	nanotop.la \
 	netcdf.la \
 	nmmxyz.la \
-	nrrdfile.la \
 	nt-mdt.la \
 	nxiifile.la \
 	oldmda.la \
@@ -1185,8 +1446,6 @@ file_LTLIBRARIES = \
 	omicronflat.la \
 	omicronmatrix.la \
 	opdfile.la \
-	$(opengps_module) \
-	pixmap.la \
 	pnifile.la \
 	pltfile.la \
 	princetonspe.la \
@@ -1198,23 +1457,19 @@ file_LTLIBRARIES = \
 	rawxyz.la \
 	renishaw.la \
 	rhk-sm3.la \
-	rhk-sm4.la \
 	rhk-spm32.la \
 	robotics.la \
 	s94file.la \
 	sdfile.la \
 	seiko.la \
 	sensofar.la \
-	$(sensofarx_module) \
 	sensolytics.la \
 	shimadzu.la \
 	sicmfile.la \
 	sis.la \
 	spip-asc.la \
-	$(spml_module) \
 	spmlab.la \
 	spmlabf.la \
-	$(spmxfile_module) \
 	stmprg.la \
 	stpfile.la \
 	surffile.la \
@@ -1230,8 +1485,34 @@ file_LTLIBRARIES = \
 	wsxmfile.la \
 	xyzexport.la \
 	zeiss.la \
+	zeisslsm.la \
 	zemax.la
 
+ at MODULE_BUNDLING_FALSE@file_modules = $(bundlable_modules)
+
+# file_modules is either the bundle or all the individual modules.
+ at MODULE_BUNDLING_TRUE@file_modules = file.la
+ at MODULE_BUNDLING_TRUE@BUILT_SOURCES = file.c
+ at MODULE_BUNDLING_TRUE@file_la_CFLAGS = $(AM_CFLAGS) -DGWY_MODULE_BUNDLING
+file_LTLIBRARIES = \
+	$(file_modules) \
+	createc.la \
+	imgexport.la \
+	jpkscan.la \
+	nrrdfile.la \
+	pixmap.la \
+	rhk-sm4.la \
+	$(apedaxfile_module) \
+	$(fitsfile_module) \
+	$(hdrimage_module) \
+	$(matfile_module) \
+	$(nanoobserver_module) \
+	$(nanoscantech_module) \
+	$(opengps_module) \
+	$(sensofarx_module) \
+	$(spml_module) \
+	$(spmxfile_module)
+
 noinst_HEADERS = \
 	err.h \
 	get.h
@@ -1241,6 +1522,10 @@ EXTRA_DIST = \
 	1CHECKLIST
 
 @OS_MSWIN_TRUE at no_undefined = -no-undefined
+AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
+AM_CFLAGS = @COMMON_CFLAGS@
+AM_CXXFLAGS = @COMMON_CXXFLAGS@
+AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
 @MODULE_DEPENDENCIES_TRUE at module_libadd = \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/app/libgwyapp2.la \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libdraw/libgwydraw2.la \
@@ -1250,10 +1535,16 @@ EXTRA_DIST = \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libprocess/libgwyprocess2.la \
 @MODULE_DEPENDENCIES_TRUE@	@GTK_LIBS@
 
-AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
-AM_CFLAGS = @COMMON_CFLAGS@
-AM_CXXFLAGS = @COMMON_CXXFLAGS@
-AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
+
+# Standalone modules
+createc_la_SOURCES = createc.c
+imgexport_la_SOURCES = imgexport.c imgexportpreset.h gwytiff.h image-keys.h
+jpkscan_la_SOURCES = jpkscan.c jpk.h gwytiff.h
+pixmap_la_SOURCES = pixmap.c gwytiff.h image-keys.h
+rhk_sm4_la_SOURCES = rhk-sm4.c
+nrrdfile_la_SOURCES = nrrdfile.c
+
+# Bundlable modules, must be listed in file_la_SOURCES below.
 accurexii_txt_la_SOURCES = accurexii-txt.c
 aistfile_la_SOURCES = aistfile.c
 alicona_la_SOURCES = alicona.c
@@ -1267,9 +1558,9 @@ bcrfile_la_SOURCES = bcrfile.c
 burleigh_la_SOURCES = burleigh.c
 burleigh_bii_la_SOURCES = burleigh_bii.c
 burleigh_exp_la_SOURCES = burleigh_exp.c
-createc_la_SOURCES = createc.c
 codevfile_la_SOURCES = codevfile.c
 csmfile_la_SOURCES = csmfile.c
+dektakvca_la_SOURCES = dektakvca.c
 dektakxml_la_SOURCES = dektakxml.c
 dimensionfile_la_SOURCES = dimensionfile.c
 dmefile_la_SOURCES = dmefile.c
@@ -1287,12 +1578,10 @@ hdf4file_la_SOURCES = hdf4file.c
 hitachi_afm_la_SOURCES = hitachi-afm.c
 hitachi_sem_la_SOURCES = hitachi-sem.c
 igorfile_la_SOURCES = igorfile.c
-imgexport_la_SOURCES = imgexport.c imgexportpreset.h gwytiff.h image-keys.h
 intelliwave_la_SOURCES = intelliwave.c
 intematix_la_SOURCES = intematix.c gwytiff.h
 iso28600_la_SOURCES = iso28600.c
 jeol_la_SOURCES = jeol.c
-jpkscan_la_SOURCES = jpkscan.c jpk.h gwytiff.h
 jspmfile_la_SOURCES = jspmfile.c
 keyence_la_SOURCES = keyence.c
 leica_la_SOURCES = leica.c
@@ -1314,17 +1603,15 @@ nanoscope_la_SOURCES = nanoscope.c
 nanotop_la_SOURCES = nanotop.c
 netcdf_la_SOURCES = netcdf.c
 nmmxyz_la_SOURCES = nmmxyz.c
-nrrdfile_la_SOURCES = nrrdfile.c
 nt_mdt_la_SOURCES = nt-mdt.c
 nxiifile_la_SOURCES = nxiifile.c
 oldmda_la_SOURCES = oldmda.c
 ols_la_SOURCES = ols.c gwytiff.h
-ometiff_la_SOURCES = ometiff.c
+ometiff_la_SOURCES = ometiff.c gwytiff.h
 omicron_la_SOURCES = omicron.c
 omicronflat_la_SOURCES = omicronflat.c
 omicronmatrix_la_SOURCES = omicronmatrix.c
 opdfile_la_SOURCES = opdfile.c
-pixmap_la_SOURCES = pixmap.c gwytiff.h image-keys.h
 pnifile_la_SOURCES = pnifile.c
 pltfile_la_SOURCES = pltfile.c
 princetonspe_la_SOURCES = princetonspe.c
@@ -1336,7 +1623,6 @@ rawgraph_la_SOURCES = rawgraph.c
 rawxyz_la_SOURCES = rawxyz.c
 renishaw_la_SOURCES = renishaw.c
 rhk_sm3_la_SOURCES = rhk-sm3.c
-rhk_sm4_la_SOURCES = rhk-sm4.c
 rhk_spm32_la_SOURCES = rhk-spm32.c
 robotics_la_SOURCES = robotics.c
 s94file_la_SOURCES = s94file.c
@@ -1354,7 +1640,7 @@ stmprg_la_SOURCES = stmprg.c
 stpfile_la_SOURCES = stpfile.c
 surffile_la_SOURCES = surffile.c
 tiaser_la_SOURCES = tiaser.c
-tescan_la_SOURCES = tescan.c
+tescan_la_SOURCES = tescan.c gwytiff.h
 unisoku_la_SOURCES = unisoku.c
 vtkfile_la_SOURCES = vtkfile.c
 win_stm_la_SOURCES = win_stm.c
@@ -1364,9 +1650,123 @@ witec_asc_la_SOURCES = witec-asc.c
 wsffile_la_SOURCES = wsffile.c
 wsxmfile_la_SOURCES = wsxmfile.c
 xyzexport_la_SOURCES = xyzexport.c
-zeiss_la_SOURCES = zeiss.c
+zeiss_la_SOURCES = zeiss.c gwytiff.h
+zeisslsm_la_SOURCES = zeisslsm.c gwytiff.h
 zemax_la_SOURCES = zemax.c
-all: all-am
+file_la_SOURCES = \
+	$(accurexii_txt_la_SOURCES) \
+	$(aistfile_la_SOURCES) \
+	$(alicona_la_SOURCES) \
+	$(ambfile_la_SOURCES) \
+	$(anfatec_la_SOURCES) \
+	$(apefile_la_SOURCES) \
+	$(asciiexport_la_SOURCES) \
+	$(assing_afm_la_SOURCES) \
+	$(attocube_la_SOURCES) \
+	$(bcrfile_la_SOURCES) \
+	$(burleigh_la_SOURCES) \
+	$(burleigh_bii_la_SOURCES) \
+	$(burleigh_exp_la_SOURCES) \
+	$(codevfile_la_SOURCES) \
+	$(csmfile_la_SOURCES) \
+	$(dektakvca_la_SOURCES) \
+	$(dektakxml_la_SOURCES) \
+	$(dimensionfile_la_SOURCES) \
+	$(dmefile_la_SOURCES) \
+	$(dm3file_la_SOURCES) \
+	$(dumbfile_la_SOURCES) \
+	$(ecsfile_la_SOURCES) \
+	$(ezdfile_la_SOURCES) \
+	$(femtoscan_la_SOURCES) \
+	$(femtoscan_txt_la_SOURCES) \
+	$(gdeffile_la_SOURCES) \
+	$(gsffile_la_SOURCES) \
+	$(gwyfile_la_SOURCES) \
+	$(gxyzffile_la_SOURCES) \
+	$(hdf4file_la_SOURCES) \
+	$(hitachi_afm_la_SOURCES) \
+	$(hitachi_sem_la_SOURCES) \
+	$(igorfile_la_SOURCES) \
+	$(intelliwave_la_SOURCES) \
+	$(intematix_la_SOURCES) \
+	$(iso28600_la_SOURCES) \
+	$(jeol_la_SOURCES) \
+	$(jspmfile_la_SOURCES) \
+	$(keyence_la_SOURCES) \
+	$(leica_la_SOURCES) \
+	$(lextfile_la_SOURCES) \
+	$(magellan_la_SOURCES) \
+	$(mapvue_la_SOURCES) \
+	$(metropro_la_SOURCES) \
+	$(microprof_la_SOURCES) \
+	$(miffile_la_SOURCES) \
+	$(mifile_la_SOURCES) \
+	$(mulfile_la_SOURCES) \
+	$(nanoeducator_la_SOURCES) \
+	$(nanomagnetics_la_SOURCES) \
+	$(nanonics_la_SOURCES) \
+	$(nanonis_la_SOURCES) \
+	$(nanoscan_la_SOURCES) \
+	$(nanoscope_ii_la_SOURCES) \
+	$(nanoscope_la_SOURCES) \
+	$(nanotop_la_SOURCES) \
+	$(netcdf_la_SOURCES) \
+	$(nmmxyz_la_SOURCES) \
+	$(nt_mdt_la_SOURCES) \
+	$(nxiifile_la_SOURCES) \
+	$(oldmda_la_SOURCES) \
+	$(ols_la_SOURCES) \
+	$(ometiff_la_SOURCES) \
+	$(omicron_la_SOURCES) \
+	$(omicronflat_la_SOURCES) \
+	$(omicronmatrix_la_SOURCES) \
+	$(opdfile_la_SOURCES) \
+	$(pnifile_la_SOURCES) \
+	$(pltfile_la_SOURCES) \
+	$(princetonspe_la_SOURCES) \
+	$(psia_la_SOURCES) \
+	$(pt3file_la_SOURCES) \
+	$(quesant_la_SOURCES) \
+	$(rawfile_la_SOURCES) \
+	$(rawgraph_la_SOURCES) \
+	$(rawxyz_la_SOURCES) \
+	$(renishaw_la_SOURCES) \
+	$(rhk_sm3_la_SOURCES) \
+	$(rhk_spm32_la_SOURCES) \
+	$(robotics_la_SOURCES) \
+	$(s94file_la_SOURCES) \
+	$(sdfile_la_SOURCES) \
+	$(seiko_la_SOURCES) \
+	$(sensofar_la_SOURCES) \
+	$(sensolytics_la_SOURCES) \
+	$(shimadzu_la_SOURCES) \
+	$(sicmfile_la_SOURCES) \
+	$(sis_la_SOURCES) \
+	$(spip_asc_la_SOURCES) \
+	$(spmlab_la_SOURCES) \
+	$(spmlabf_la_SOURCES) \
+	$(stmprg_la_SOURCES) \
+	$(stpfile_la_SOURCES) \
+	$(surffile_la_SOURCES) \
+	$(tiaser_la_SOURCES) \
+	$(tescan_la_SOURCES) \
+	$(unisoku_la_SOURCES) \
+	$(vtkfile_la_SOURCES) \
+	$(win_stm_la_SOURCES) \
+	$(wipfile_la_SOURCES) \
+	$(witfile_la_SOURCES) \
+	$(witec_asc_la_SOURCES) \
+	$(wsffile_la_SOURCES) \
+	$(wsxmfile_la_SOURCES) \
+	$(xyzexport_la_SOURCES) \
+	$(zeiss_la_SOURCES) \
+	$(zeisslsm_la_SOURCES) \
+	$(zemax_la_SOURCES) \
+	file.c
+
+CLEAN_FILES = file.c
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
 
 .SUFFIXES:
 .SUFFIXES: .c .cc .lo .o .obj
@@ -1436,229 +1836,235 @@ clean-fileLTLIBRARIES:
 	}
 
 accurexii-txt.la: $(accurexii_txt_la_OBJECTS) $(accurexii_txt_la_DEPENDENCIES) $(EXTRA_accurexii_txt_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(accurexii_txt_la_OBJECTS) $(accurexii_txt_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_accurexii_txt_la_rpath) $(accurexii_txt_la_OBJECTS) $(accurexii_txt_la_LIBADD) $(LIBS)
 
 aistfile.la: $(aistfile_la_OBJECTS) $(aistfile_la_DEPENDENCIES) $(EXTRA_aistfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(aistfile_la_OBJECTS) $(aistfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_aistfile_la_rpath) $(aistfile_la_OBJECTS) $(aistfile_la_LIBADD) $(LIBS)
 
 alicona.la: $(alicona_la_OBJECTS) $(alicona_la_DEPENDENCIES) $(EXTRA_alicona_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(alicona_la_OBJECTS) $(alicona_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_alicona_la_rpath) $(alicona_la_OBJECTS) $(alicona_la_LIBADD) $(LIBS)
 
 ambfile.la: $(ambfile_la_OBJECTS) $(ambfile_la_DEPENDENCIES) $(EXTRA_ambfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(ambfile_la_OBJECTS) $(ambfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_ambfile_la_rpath) $(ambfile_la_OBJECTS) $(ambfile_la_LIBADD) $(LIBS)
 
 anfatec.la: $(anfatec_la_OBJECTS) $(anfatec_la_DEPENDENCIES) $(EXTRA_anfatec_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(anfatec_la_OBJECTS) $(anfatec_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_anfatec_la_rpath) $(anfatec_la_OBJECTS) $(anfatec_la_LIBADD) $(LIBS)
 
 apedaxfile.la: $(apedaxfile_la_OBJECTS) $(apedaxfile_la_DEPENDENCIES) $(EXTRA_apedaxfile_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(apedaxfile_la_LINK) $(am_apedaxfile_la_rpath) $(apedaxfile_la_OBJECTS) $(apedaxfile_la_LIBADD) $(LIBS)
 
 apefile.la: $(apefile_la_OBJECTS) $(apefile_la_DEPENDENCIES) $(EXTRA_apefile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(apefile_la_OBJECTS) $(apefile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_apefile_la_rpath) $(apefile_la_OBJECTS) $(apefile_la_LIBADD) $(LIBS)
 
 asciiexport.la: $(asciiexport_la_OBJECTS) $(asciiexport_la_DEPENDENCIES) $(EXTRA_asciiexport_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(asciiexport_la_OBJECTS) $(asciiexport_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_asciiexport_la_rpath) $(asciiexport_la_OBJECTS) $(asciiexport_la_LIBADD) $(LIBS)
 
 assing-afm.la: $(assing_afm_la_OBJECTS) $(assing_afm_la_DEPENDENCIES) $(EXTRA_assing_afm_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(assing_afm_la_OBJECTS) $(assing_afm_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_assing_afm_la_rpath) $(assing_afm_la_OBJECTS) $(assing_afm_la_LIBADD) $(LIBS)
 
 attocube.la: $(attocube_la_OBJECTS) $(attocube_la_DEPENDENCIES) $(EXTRA_attocube_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(attocube_la_OBJECTS) $(attocube_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_attocube_la_rpath) $(attocube_la_OBJECTS) $(attocube_la_LIBADD) $(LIBS)
 
 bcrfile.la: $(bcrfile_la_OBJECTS) $(bcrfile_la_DEPENDENCIES) $(EXTRA_bcrfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(bcrfile_la_OBJECTS) $(bcrfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_bcrfile_la_rpath) $(bcrfile_la_OBJECTS) $(bcrfile_la_LIBADD) $(LIBS)
 
 burleigh.la: $(burleigh_la_OBJECTS) $(burleigh_la_DEPENDENCIES) $(EXTRA_burleigh_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(burleigh_la_OBJECTS) $(burleigh_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_burleigh_la_rpath) $(burleigh_la_OBJECTS) $(burleigh_la_LIBADD) $(LIBS)
 
 burleigh_bii.la: $(burleigh_bii_la_OBJECTS) $(burleigh_bii_la_DEPENDENCIES) $(EXTRA_burleigh_bii_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(burleigh_bii_la_OBJECTS) $(burleigh_bii_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_burleigh_bii_la_rpath) $(burleigh_bii_la_OBJECTS) $(burleigh_bii_la_LIBADD) $(LIBS)
 
 burleigh_exp.la: $(burleigh_exp_la_OBJECTS) $(burleigh_exp_la_DEPENDENCIES) $(EXTRA_burleigh_exp_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(burleigh_exp_la_OBJECTS) $(burleigh_exp_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_burleigh_exp_la_rpath) $(burleigh_exp_la_OBJECTS) $(burleigh_exp_la_LIBADD) $(LIBS)
 
 codevfile.la: $(codevfile_la_OBJECTS) $(codevfile_la_DEPENDENCIES) $(EXTRA_codevfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(codevfile_la_OBJECTS) $(codevfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_codevfile_la_rpath) $(codevfile_la_OBJECTS) $(codevfile_la_LIBADD) $(LIBS)
 
 createc.la: $(createc_la_OBJECTS) $(createc_la_DEPENDENCIES) $(EXTRA_createc_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(createc_la_OBJECTS) $(createc_la_LIBADD) $(LIBS)
 
 csmfile.la: $(csmfile_la_OBJECTS) $(csmfile_la_DEPENDENCIES) $(EXTRA_csmfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(csmfile_la_OBJECTS) $(csmfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_csmfile_la_rpath) $(csmfile_la_OBJECTS) $(csmfile_la_LIBADD) $(LIBS)
+
+dektakvca.la: $(dektakvca_la_OBJECTS) $(dektakvca_la_DEPENDENCIES) $(EXTRA_dektakvca_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_dektakvca_la_rpath) $(dektakvca_la_OBJECTS) $(dektakvca_la_LIBADD) $(LIBS)
 
 dektakxml.la: $(dektakxml_la_OBJECTS) $(dektakxml_la_DEPENDENCIES) $(EXTRA_dektakxml_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(dektakxml_la_OBJECTS) $(dektakxml_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_dektakxml_la_rpath) $(dektakxml_la_OBJECTS) $(dektakxml_la_LIBADD) $(LIBS)
 
 dimensionfile.la: $(dimensionfile_la_OBJECTS) $(dimensionfile_la_DEPENDENCIES) $(EXTRA_dimensionfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(dimensionfile_la_OBJECTS) $(dimensionfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_dimensionfile_la_rpath) $(dimensionfile_la_OBJECTS) $(dimensionfile_la_LIBADD) $(LIBS)
 
 dm3file.la: $(dm3file_la_OBJECTS) $(dm3file_la_DEPENDENCIES) $(EXTRA_dm3file_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(dm3file_la_OBJECTS) $(dm3file_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_dm3file_la_rpath) $(dm3file_la_OBJECTS) $(dm3file_la_LIBADD) $(LIBS)
 
 dmefile.la: $(dmefile_la_OBJECTS) $(dmefile_la_DEPENDENCIES) $(EXTRA_dmefile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(dmefile_la_OBJECTS) $(dmefile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_dmefile_la_rpath) $(dmefile_la_OBJECTS) $(dmefile_la_LIBADD) $(LIBS)
 
 dumbfile.la: $(dumbfile_la_OBJECTS) $(dumbfile_la_DEPENDENCIES) $(EXTRA_dumbfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(dumbfile_la_OBJECTS) $(dumbfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_dumbfile_la_rpath) $(dumbfile_la_OBJECTS) $(dumbfile_la_LIBADD) $(LIBS)
 
 ecsfile.la: $(ecsfile_la_OBJECTS) $(ecsfile_la_DEPENDENCIES) $(EXTRA_ecsfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(ecsfile_la_OBJECTS) $(ecsfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_ecsfile_la_rpath) $(ecsfile_la_OBJECTS) $(ecsfile_la_LIBADD) $(LIBS)
 
 ezdfile.la: $(ezdfile_la_OBJECTS) $(ezdfile_la_DEPENDENCIES) $(EXTRA_ezdfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(ezdfile_la_OBJECTS) $(ezdfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_ezdfile_la_rpath) $(ezdfile_la_OBJECTS) $(ezdfile_la_LIBADD) $(LIBS)
 
 femtoscan-txt.la: $(femtoscan_txt_la_OBJECTS) $(femtoscan_txt_la_DEPENDENCIES) $(EXTRA_femtoscan_txt_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(femtoscan_txt_la_OBJECTS) $(femtoscan_txt_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_femtoscan_txt_la_rpath) $(femtoscan_txt_la_OBJECTS) $(femtoscan_txt_la_LIBADD) $(LIBS)
 
 femtoscan.la: $(femtoscan_la_OBJECTS) $(femtoscan_la_DEPENDENCIES) $(EXTRA_femtoscan_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(femtoscan_la_OBJECTS) $(femtoscan_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_femtoscan_la_rpath) $(femtoscan_la_OBJECTS) $(femtoscan_la_LIBADD) $(LIBS)
+
+file.la: $(file_la_OBJECTS) $(file_la_DEPENDENCIES) $(EXTRA_file_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(file_la_LINK) $(am_file_la_rpath) $(file_la_OBJECTS) $(file_la_LIBADD) $(LIBS)
 
 fitsfile.la: $(fitsfile_la_OBJECTS) $(fitsfile_la_DEPENDENCIES) $(EXTRA_fitsfile_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(fitsfile_la_LINK) $(am_fitsfile_la_rpath) $(fitsfile_la_OBJECTS) $(fitsfile_la_LIBADD) $(LIBS)
 
 gdeffile.la: $(gdeffile_la_OBJECTS) $(gdeffile_la_DEPENDENCIES) $(EXTRA_gdeffile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(gdeffile_la_OBJECTS) $(gdeffile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_gdeffile_la_rpath) $(gdeffile_la_OBJECTS) $(gdeffile_la_LIBADD) $(LIBS)
 
 gsffile.la: $(gsffile_la_OBJECTS) $(gsffile_la_DEPENDENCIES) $(EXTRA_gsffile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(gsffile_la_OBJECTS) $(gsffile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_gsffile_la_rpath) $(gsffile_la_OBJECTS) $(gsffile_la_LIBADD) $(LIBS)
 
 gwyfile.la: $(gwyfile_la_OBJECTS) $(gwyfile_la_DEPENDENCIES) $(EXTRA_gwyfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(gwyfile_la_OBJECTS) $(gwyfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_gwyfile_la_rpath) $(gwyfile_la_OBJECTS) $(gwyfile_la_LIBADD) $(LIBS)
 
 gxyzffile.la: $(gxyzffile_la_OBJECTS) $(gxyzffile_la_DEPENDENCIES) $(EXTRA_gxyzffile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(gxyzffile_la_OBJECTS) $(gxyzffile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_gxyzffile_la_rpath) $(gxyzffile_la_OBJECTS) $(gxyzffile_la_LIBADD) $(LIBS)
 
 hdf4file.la: $(hdf4file_la_OBJECTS) $(hdf4file_la_DEPENDENCIES) $(EXTRA_hdf4file_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(hdf4file_la_OBJECTS) $(hdf4file_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_hdf4file_la_rpath) $(hdf4file_la_OBJECTS) $(hdf4file_la_LIBADD) $(LIBS)
 
 hdrimage.la: $(hdrimage_la_OBJECTS) $(hdrimage_la_DEPENDENCIES) $(EXTRA_hdrimage_la_DEPENDENCIES) 
 	$(AM_V_CXXLD)$(hdrimage_la_LINK) $(am_hdrimage_la_rpath) $(hdrimage_la_OBJECTS) $(hdrimage_la_LIBADD) $(LIBS)
 
 hitachi-afm.la: $(hitachi_afm_la_OBJECTS) $(hitachi_afm_la_DEPENDENCIES) $(EXTRA_hitachi_afm_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(hitachi_afm_la_OBJECTS) $(hitachi_afm_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_hitachi_afm_la_rpath) $(hitachi_afm_la_OBJECTS) $(hitachi_afm_la_LIBADD) $(LIBS)
 
 hitachi-sem.la: $(hitachi_sem_la_OBJECTS) $(hitachi_sem_la_DEPENDENCIES) $(EXTRA_hitachi_sem_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(hitachi_sem_la_OBJECTS) $(hitachi_sem_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_hitachi_sem_la_rpath) $(hitachi_sem_la_OBJECTS) $(hitachi_sem_la_LIBADD) $(LIBS)
 
 igorfile.la: $(igorfile_la_OBJECTS) $(igorfile_la_DEPENDENCIES) $(EXTRA_igorfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(igorfile_la_OBJECTS) $(igorfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_igorfile_la_rpath) $(igorfile_la_OBJECTS) $(igorfile_la_LIBADD) $(LIBS)
 
 imgexport.la: $(imgexport_la_OBJECTS) $(imgexport_la_DEPENDENCIES) $(EXTRA_imgexport_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(imgexport_la_LINK) -rpath $(filedir) $(imgexport_la_OBJECTS) $(imgexport_la_LIBADD) $(LIBS)
 
 intelliwave.la: $(intelliwave_la_OBJECTS) $(intelliwave_la_DEPENDENCIES) $(EXTRA_intelliwave_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(intelliwave_la_OBJECTS) $(intelliwave_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_intelliwave_la_rpath) $(intelliwave_la_OBJECTS) $(intelliwave_la_LIBADD) $(LIBS)
 
 intematix.la: $(intematix_la_OBJECTS) $(intematix_la_DEPENDENCIES) $(EXTRA_intematix_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(intematix_la_OBJECTS) $(intematix_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_intematix_la_rpath) $(intematix_la_OBJECTS) $(intematix_la_LIBADD) $(LIBS)
 
 iso28600.la: $(iso28600_la_OBJECTS) $(iso28600_la_DEPENDENCIES) $(EXTRA_iso28600_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(iso28600_la_OBJECTS) $(iso28600_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_iso28600_la_rpath) $(iso28600_la_OBJECTS) $(iso28600_la_LIBADD) $(LIBS)
 
 jeol.la: $(jeol_la_OBJECTS) $(jeol_la_DEPENDENCIES) $(EXTRA_jeol_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(jeol_la_OBJECTS) $(jeol_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_jeol_la_rpath) $(jeol_la_OBJECTS) $(jeol_la_LIBADD) $(LIBS)
 
 jpkscan.la: $(jpkscan_la_OBJECTS) $(jpkscan_la_DEPENDENCIES) $(EXTRA_jpkscan_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(jpkscan_la_LINK) -rpath $(filedir) $(jpkscan_la_OBJECTS) $(jpkscan_la_LIBADD) $(LIBS)
 
 jspmfile.la: $(jspmfile_la_OBJECTS) $(jspmfile_la_DEPENDENCIES) $(EXTRA_jspmfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(jspmfile_la_OBJECTS) $(jspmfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_jspmfile_la_rpath) $(jspmfile_la_OBJECTS) $(jspmfile_la_LIBADD) $(LIBS)
 
 keyence.la: $(keyence_la_OBJECTS) $(keyence_la_DEPENDENCIES) $(EXTRA_keyence_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(keyence_la_OBJECTS) $(keyence_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_keyence_la_rpath) $(keyence_la_OBJECTS) $(keyence_la_LIBADD) $(LIBS)
 
 leica.la: $(leica_la_OBJECTS) $(leica_la_DEPENDENCIES) $(EXTRA_leica_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(leica_la_OBJECTS) $(leica_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_leica_la_rpath) $(leica_la_OBJECTS) $(leica_la_LIBADD) $(LIBS)
 
 lextfile.la: $(lextfile_la_OBJECTS) $(lextfile_la_DEPENDENCIES) $(EXTRA_lextfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(lextfile_la_OBJECTS) $(lextfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_lextfile_la_rpath) $(lextfile_la_OBJECTS) $(lextfile_la_LIBADD) $(LIBS)
 
 magellan.la: $(magellan_la_OBJECTS) $(magellan_la_DEPENDENCIES) $(EXTRA_magellan_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(magellan_la_OBJECTS) $(magellan_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_magellan_la_rpath) $(magellan_la_OBJECTS) $(magellan_la_LIBADD) $(LIBS)
 
 mapvue.la: $(mapvue_la_OBJECTS) $(mapvue_la_DEPENDENCIES) $(EXTRA_mapvue_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(mapvue_la_OBJECTS) $(mapvue_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_mapvue_la_rpath) $(mapvue_la_OBJECTS) $(mapvue_la_LIBADD) $(LIBS)
 
 metropro.la: $(metropro_la_OBJECTS) $(metropro_la_DEPENDENCIES) $(EXTRA_metropro_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(metropro_la_OBJECTS) $(metropro_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_metropro_la_rpath) $(metropro_la_OBJECTS) $(metropro_la_LIBADD) $(LIBS)
 
 microprof.la: $(microprof_la_OBJECTS) $(microprof_la_DEPENDENCIES) $(EXTRA_microprof_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(microprof_la_OBJECTS) $(microprof_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_microprof_la_rpath) $(microprof_la_OBJECTS) $(microprof_la_LIBADD) $(LIBS)
 
 miffile.la: $(miffile_la_OBJECTS) $(miffile_la_DEPENDENCIES) $(EXTRA_miffile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(miffile_la_OBJECTS) $(miffile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_miffile_la_rpath) $(miffile_la_OBJECTS) $(miffile_la_LIBADD) $(LIBS)
 
 mifile.la: $(mifile_la_OBJECTS) $(mifile_la_DEPENDENCIES) $(EXTRA_mifile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(mifile_la_OBJECTS) $(mifile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_mifile_la_rpath) $(mifile_la_OBJECTS) $(mifile_la_LIBADD) $(LIBS)
 
 mulfile.la: $(mulfile_la_OBJECTS) $(mulfile_la_DEPENDENCIES) $(EXTRA_mulfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(mulfile_la_OBJECTS) $(mulfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_mulfile_la_rpath) $(mulfile_la_OBJECTS) $(mulfile_la_LIBADD) $(LIBS)
 
 nanoeducator.la: $(nanoeducator_la_OBJECTS) $(nanoeducator_la_DEPENDENCIES) $(EXTRA_nanoeducator_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(nanoeducator_la_OBJECTS) $(nanoeducator_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_nanoeducator_la_rpath) $(nanoeducator_la_OBJECTS) $(nanoeducator_la_LIBADD) $(LIBS)
 
 nanomagnetics.la: $(nanomagnetics_la_OBJECTS) $(nanomagnetics_la_DEPENDENCIES) $(EXTRA_nanomagnetics_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(nanomagnetics_la_OBJECTS) $(nanomagnetics_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_nanomagnetics_la_rpath) $(nanomagnetics_la_OBJECTS) $(nanomagnetics_la_LIBADD) $(LIBS)
 
 nanonics.la: $(nanonics_la_OBJECTS) $(nanonics_la_DEPENDENCIES) $(EXTRA_nanonics_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(nanonics_la_OBJECTS) $(nanonics_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_nanonics_la_rpath) $(nanonics_la_OBJECTS) $(nanonics_la_LIBADD) $(LIBS)
 
 nanonis.la: $(nanonis_la_OBJECTS) $(nanonis_la_DEPENDENCIES) $(EXTRA_nanonis_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(nanonis_la_OBJECTS) $(nanonis_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_nanonis_la_rpath) $(nanonis_la_OBJECTS) $(nanonis_la_LIBADD) $(LIBS)
 
 nanoobserver.la: $(nanoobserver_la_OBJECTS) $(nanoobserver_la_DEPENDENCIES) $(EXTRA_nanoobserver_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(nanoobserver_la_LINK) $(am_nanoobserver_la_rpath) $(nanoobserver_la_OBJECTS) $(nanoobserver_la_LIBADD) $(LIBS)
 
 nanoscan.la: $(nanoscan_la_OBJECTS) $(nanoscan_la_DEPENDENCIES) $(EXTRA_nanoscan_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(nanoscan_la_OBJECTS) $(nanoscan_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_nanoscan_la_rpath) $(nanoscan_la_OBJECTS) $(nanoscan_la_LIBADD) $(LIBS)
 
 nanoscantech.la: $(nanoscantech_la_OBJECTS) $(nanoscantech_la_DEPENDENCIES) $(EXTRA_nanoscantech_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(nanoscantech_la_LINK) $(am_nanoscantech_la_rpath) $(nanoscantech_la_OBJECTS) $(nanoscantech_la_LIBADD) $(LIBS)
 
 nanoscope-ii.la: $(nanoscope_ii_la_OBJECTS) $(nanoscope_ii_la_DEPENDENCIES) $(EXTRA_nanoscope_ii_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(nanoscope_ii_la_OBJECTS) $(nanoscope_ii_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_nanoscope_ii_la_rpath) $(nanoscope_ii_la_OBJECTS) $(nanoscope_ii_la_LIBADD) $(LIBS)
 
 nanoscope.la: $(nanoscope_la_OBJECTS) $(nanoscope_la_DEPENDENCIES) $(EXTRA_nanoscope_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(nanoscope_la_OBJECTS) $(nanoscope_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_nanoscope_la_rpath) $(nanoscope_la_OBJECTS) $(nanoscope_la_LIBADD) $(LIBS)
 
 nanotop.la: $(nanotop_la_OBJECTS) $(nanotop_la_DEPENDENCIES) $(EXTRA_nanotop_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(nanotop_la_OBJECTS) $(nanotop_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_nanotop_la_rpath) $(nanotop_la_OBJECTS) $(nanotop_la_LIBADD) $(LIBS)
 
 netcdf.la: $(netcdf_la_OBJECTS) $(netcdf_la_DEPENDENCIES) $(EXTRA_netcdf_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(netcdf_la_OBJECTS) $(netcdf_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_netcdf_la_rpath) $(netcdf_la_OBJECTS) $(netcdf_la_LIBADD) $(LIBS)
 
 nmmxyz.la: $(nmmxyz_la_OBJECTS) $(nmmxyz_la_DEPENDENCIES) $(EXTRA_nmmxyz_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(nmmxyz_la_OBJECTS) $(nmmxyz_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_nmmxyz_la_rpath) $(nmmxyz_la_OBJECTS) $(nmmxyz_la_LIBADD) $(LIBS)
 
 nrrdfile.la: $(nrrdfile_la_OBJECTS) $(nrrdfile_la_DEPENDENCIES) $(EXTRA_nrrdfile_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(nrrdfile_la_OBJECTS) $(nrrdfile_la_LIBADD) $(LIBS)
 
 nt-mdt.la: $(nt_mdt_la_OBJECTS) $(nt_mdt_la_DEPENDENCIES) $(EXTRA_nt_mdt_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(nt_mdt_la_OBJECTS) $(nt_mdt_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_nt_mdt_la_rpath) $(nt_mdt_la_OBJECTS) $(nt_mdt_la_LIBADD) $(LIBS)
 
 nxiifile.la: $(nxiifile_la_OBJECTS) $(nxiifile_la_DEPENDENCIES) $(EXTRA_nxiifile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(nxiifile_la_OBJECTS) $(nxiifile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_nxiifile_la_rpath) $(nxiifile_la_OBJECTS) $(nxiifile_la_LIBADD) $(LIBS)
 
 oldmda.la: $(oldmda_la_OBJECTS) $(oldmda_la_DEPENDENCIES) $(EXTRA_oldmda_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(oldmda_la_OBJECTS) $(oldmda_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_oldmda_la_rpath) $(oldmda_la_OBJECTS) $(oldmda_la_LIBADD) $(LIBS)
 
 ols.la: $(ols_la_OBJECTS) $(ols_la_DEPENDENCIES) $(EXTRA_ols_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(ols_la_OBJECTS) $(ols_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_ols_la_rpath) $(ols_la_OBJECTS) $(ols_la_LIBADD) $(LIBS)
 
 ometiff.la: $(ometiff_la_OBJECTS) $(ometiff_la_DEPENDENCIES) $(EXTRA_ometiff_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(ometiff_la_OBJECTS) $(ometiff_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_ometiff_la_rpath) $(ometiff_la_OBJECTS) $(ometiff_la_LIBADD) $(LIBS)
 
 omicron.la: $(omicron_la_OBJECTS) $(omicron_la_DEPENDENCIES) $(EXTRA_omicron_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(omicron_la_OBJECTS) $(omicron_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_omicron_la_rpath) $(omicron_la_OBJECTS) $(omicron_la_LIBADD) $(LIBS)
 
 omicronflat.la: $(omicronflat_la_OBJECTS) $(omicronflat_la_DEPENDENCIES) $(EXTRA_omicronflat_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(omicronflat_la_OBJECTS) $(omicronflat_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_omicronflat_la_rpath) $(omicronflat_la_OBJECTS) $(omicronflat_la_LIBADD) $(LIBS)
 
 omicronmatrix.la: $(omicronmatrix_la_OBJECTS) $(omicronmatrix_la_DEPENDENCIES) $(EXTRA_omicronmatrix_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(omicronmatrix_la_OBJECTS) $(omicronmatrix_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_omicronmatrix_la_rpath) $(omicronmatrix_la_OBJECTS) $(omicronmatrix_la_LIBADD) $(LIBS)
 
 opdfile.la: $(opdfile_la_OBJECTS) $(opdfile_la_DEPENDENCIES) $(EXTRA_opdfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(opdfile_la_OBJECTS) $(opdfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_opdfile_la_rpath) $(opdfile_la_OBJECTS) $(opdfile_la_LIBADD) $(LIBS)
 
 opengps.la: $(opengps_la_OBJECTS) $(opengps_la_DEPENDENCIES) $(EXTRA_opengps_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(opengps_la_LINK) $(am_opengps_la_rpath) $(opengps_la_OBJECTS) $(opengps_la_LIBADD) $(LIBS)
@@ -1667,136 +2073,139 @@ pixmap.la: $(pixmap_la_OBJECTS) $(pixmap_la_DEPENDENCIES) $(EXTRA_pixmap_la_DEPE
 	$(AM_V_CCLD)$(pixmap_la_LINK) -rpath $(filedir) $(pixmap_la_OBJECTS) $(pixmap_la_LIBADD) $(LIBS)
 
 pltfile.la: $(pltfile_la_OBJECTS) $(pltfile_la_DEPENDENCIES) $(EXTRA_pltfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(pltfile_la_OBJECTS) $(pltfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_pltfile_la_rpath) $(pltfile_la_OBJECTS) $(pltfile_la_LIBADD) $(LIBS)
 
 pnifile.la: $(pnifile_la_OBJECTS) $(pnifile_la_DEPENDENCIES) $(EXTRA_pnifile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(pnifile_la_OBJECTS) $(pnifile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_pnifile_la_rpath) $(pnifile_la_OBJECTS) $(pnifile_la_LIBADD) $(LIBS)
 
 princetonspe.la: $(princetonspe_la_OBJECTS) $(princetonspe_la_DEPENDENCIES) $(EXTRA_princetonspe_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(princetonspe_la_OBJECTS) $(princetonspe_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_princetonspe_la_rpath) $(princetonspe_la_OBJECTS) $(princetonspe_la_LIBADD) $(LIBS)
 
 psia.la: $(psia_la_OBJECTS) $(psia_la_DEPENDENCIES) $(EXTRA_psia_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(psia_la_OBJECTS) $(psia_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_psia_la_rpath) $(psia_la_OBJECTS) $(psia_la_LIBADD) $(LIBS)
 
 pt3file.la: $(pt3file_la_OBJECTS) $(pt3file_la_DEPENDENCIES) $(EXTRA_pt3file_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(pt3file_la_OBJECTS) $(pt3file_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_pt3file_la_rpath) $(pt3file_la_OBJECTS) $(pt3file_la_LIBADD) $(LIBS)
 
 quesant.la: $(quesant_la_OBJECTS) $(quesant_la_DEPENDENCIES) $(EXTRA_quesant_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(quesant_la_OBJECTS) $(quesant_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_quesant_la_rpath) $(quesant_la_OBJECTS) $(quesant_la_LIBADD) $(LIBS)
 
 rawfile.la: $(rawfile_la_OBJECTS) $(rawfile_la_DEPENDENCIES) $(EXTRA_rawfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(rawfile_la_OBJECTS) $(rawfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_rawfile_la_rpath) $(rawfile_la_OBJECTS) $(rawfile_la_LIBADD) $(LIBS)
 
 rawgraph.la: $(rawgraph_la_OBJECTS) $(rawgraph_la_DEPENDENCIES) $(EXTRA_rawgraph_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(rawgraph_la_OBJECTS) $(rawgraph_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_rawgraph_la_rpath) $(rawgraph_la_OBJECTS) $(rawgraph_la_LIBADD) $(LIBS)
 
 rawxyz.la: $(rawxyz_la_OBJECTS) $(rawxyz_la_DEPENDENCIES) $(EXTRA_rawxyz_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(rawxyz_la_OBJECTS) $(rawxyz_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_rawxyz_la_rpath) $(rawxyz_la_OBJECTS) $(rawxyz_la_LIBADD) $(LIBS)
 
 renishaw.la: $(renishaw_la_OBJECTS) $(renishaw_la_DEPENDENCIES) $(EXTRA_renishaw_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(renishaw_la_OBJECTS) $(renishaw_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_renishaw_la_rpath) $(renishaw_la_OBJECTS) $(renishaw_la_LIBADD) $(LIBS)
 
 rhk-sm3.la: $(rhk_sm3_la_OBJECTS) $(rhk_sm3_la_DEPENDENCIES) $(EXTRA_rhk_sm3_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(rhk_sm3_la_OBJECTS) $(rhk_sm3_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_rhk_sm3_la_rpath) $(rhk_sm3_la_OBJECTS) $(rhk_sm3_la_LIBADD) $(LIBS)
 
 rhk-sm4.la: $(rhk_sm4_la_OBJECTS) $(rhk_sm4_la_DEPENDENCIES) $(EXTRA_rhk_sm4_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(rhk_sm4_la_OBJECTS) $(rhk_sm4_la_LIBADD) $(LIBS)
 
 rhk-spm32.la: $(rhk_spm32_la_OBJECTS) $(rhk_spm32_la_DEPENDENCIES) $(EXTRA_rhk_spm32_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(rhk_spm32_la_OBJECTS) $(rhk_spm32_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_rhk_spm32_la_rpath) $(rhk_spm32_la_OBJECTS) $(rhk_spm32_la_LIBADD) $(LIBS)
 
 robotics.la: $(robotics_la_OBJECTS) $(robotics_la_DEPENDENCIES) $(EXTRA_robotics_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(robotics_la_OBJECTS) $(robotics_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_robotics_la_rpath) $(robotics_la_OBJECTS) $(robotics_la_LIBADD) $(LIBS)
 
 s94file.la: $(s94file_la_OBJECTS) $(s94file_la_DEPENDENCIES) $(EXTRA_s94file_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(s94file_la_OBJECTS) $(s94file_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_s94file_la_rpath) $(s94file_la_OBJECTS) $(s94file_la_LIBADD) $(LIBS)
 
 sdfile.la: $(sdfile_la_OBJECTS) $(sdfile_la_DEPENDENCIES) $(EXTRA_sdfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(sdfile_la_OBJECTS) $(sdfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_sdfile_la_rpath) $(sdfile_la_OBJECTS) $(sdfile_la_LIBADD) $(LIBS)
 
 seiko.la: $(seiko_la_OBJECTS) $(seiko_la_DEPENDENCIES) $(EXTRA_seiko_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(seiko_la_OBJECTS) $(seiko_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_seiko_la_rpath) $(seiko_la_OBJECTS) $(seiko_la_LIBADD) $(LIBS)
 
 sensofar.la: $(sensofar_la_OBJECTS) $(sensofar_la_DEPENDENCIES) $(EXTRA_sensofar_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(sensofar_la_OBJECTS) $(sensofar_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_sensofar_la_rpath) $(sensofar_la_OBJECTS) $(sensofar_la_LIBADD) $(LIBS)
 
 sensofarx.la: $(sensofarx_la_OBJECTS) $(sensofarx_la_DEPENDENCIES) $(EXTRA_sensofarx_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(sensofarx_la_LINK) $(am_sensofarx_la_rpath) $(sensofarx_la_OBJECTS) $(sensofarx_la_LIBADD) $(LIBS)
 
 sensolytics.la: $(sensolytics_la_OBJECTS) $(sensolytics_la_DEPENDENCIES) $(EXTRA_sensolytics_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(sensolytics_la_OBJECTS) $(sensolytics_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_sensolytics_la_rpath) $(sensolytics_la_OBJECTS) $(sensolytics_la_LIBADD) $(LIBS)
 
 shimadzu.la: $(shimadzu_la_OBJECTS) $(shimadzu_la_DEPENDENCIES) $(EXTRA_shimadzu_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(shimadzu_la_OBJECTS) $(shimadzu_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_shimadzu_la_rpath) $(shimadzu_la_OBJECTS) $(shimadzu_la_LIBADD) $(LIBS)
 
 sicmfile.la: $(sicmfile_la_OBJECTS) $(sicmfile_la_DEPENDENCIES) $(EXTRA_sicmfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(sicmfile_la_OBJECTS) $(sicmfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_sicmfile_la_rpath) $(sicmfile_la_OBJECTS) $(sicmfile_la_LIBADD) $(LIBS)
 
 sis.la: $(sis_la_OBJECTS) $(sis_la_DEPENDENCIES) $(EXTRA_sis_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(sis_la_OBJECTS) $(sis_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_sis_la_rpath) $(sis_la_OBJECTS) $(sis_la_LIBADD) $(LIBS)
 
 spip-asc.la: $(spip_asc_la_OBJECTS) $(spip_asc_la_DEPENDENCIES) $(EXTRA_spip_asc_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(spip_asc_la_OBJECTS) $(spip_asc_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_spip_asc_la_rpath) $(spip_asc_la_OBJECTS) $(spip_asc_la_LIBADD) $(LIBS)
 
 spml.la: $(spml_la_OBJECTS) $(spml_la_DEPENDENCIES) $(EXTRA_spml_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(spml_la_LINK) $(am_spml_la_rpath) $(spml_la_OBJECTS) $(spml_la_LIBADD) $(LIBS)
 
 spmlab.la: $(spmlab_la_OBJECTS) $(spmlab_la_DEPENDENCIES) $(EXTRA_spmlab_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(spmlab_la_OBJECTS) $(spmlab_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_spmlab_la_rpath) $(spmlab_la_OBJECTS) $(spmlab_la_LIBADD) $(LIBS)
 
 spmlabf.la: $(spmlabf_la_OBJECTS) $(spmlabf_la_DEPENDENCIES) $(EXTRA_spmlabf_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(spmlabf_la_OBJECTS) $(spmlabf_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_spmlabf_la_rpath) $(spmlabf_la_OBJECTS) $(spmlabf_la_LIBADD) $(LIBS)
 
 spmxfile.la: $(spmxfile_la_OBJECTS) $(spmxfile_la_DEPENDENCIES) $(EXTRA_spmxfile_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(spmxfile_la_LINK) $(am_spmxfile_la_rpath) $(spmxfile_la_OBJECTS) $(spmxfile_la_LIBADD) $(LIBS)
 
 stmprg.la: $(stmprg_la_OBJECTS) $(stmprg_la_DEPENDENCIES) $(EXTRA_stmprg_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(stmprg_la_OBJECTS) $(stmprg_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_stmprg_la_rpath) $(stmprg_la_OBJECTS) $(stmprg_la_LIBADD) $(LIBS)
 
 stpfile.la: $(stpfile_la_OBJECTS) $(stpfile_la_DEPENDENCIES) $(EXTRA_stpfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(stpfile_la_OBJECTS) $(stpfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_stpfile_la_rpath) $(stpfile_la_OBJECTS) $(stpfile_la_LIBADD) $(LIBS)
 
 surffile.la: $(surffile_la_OBJECTS) $(surffile_la_DEPENDENCIES) $(EXTRA_surffile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(surffile_la_OBJECTS) $(surffile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_surffile_la_rpath) $(surffile_la_OBJECTS) $(surffile_la_LIBADD) $(LIBS)
 
 tescan.la: $(tescan_la_OBJECTS) $(tescan_la_DEPENDENCIES) $(EXTRA_tescan_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(tescan_la_OBJECTS) $(tescan_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_tescan_la_rpath) $(tescan_la_OBJECTS) $(tescan_la_LIBADD) $(LIBS)
 
 tiaser.la: $(tiaser_la_OBJECTS) $(tiaser_la_DEPENDENCIES) $(EXTRA_tiaser_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(tiaser_la_OBJECTS) $(tiaser_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_tiaser_la_rpath) $(tiaser_la_OBJECTS) $(tiaser_la_LIBADD) $(LIBS)
 
 unisoku.la: $(unisoku_la_OBJECTS) $(unisoku_la_DEPENDENCIES) $(EXTRA_unisoku_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(unisoku_la_OBJECTS) $(unisoku_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_unisoku_la_rpath) $(unisoku_la_OBJECTS) $(unisoku_la_LIBADD) $(LIBS)
 
 vtkfile.la: $(vtkfile_la_OBJECTS) $(vtkfile_la_DEPENDENCIES) $(EXTRA_vtkfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(vtkfile_la_OBJECTS) $(vtkfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_vtkfile_la_rpath) $(vtkfile_la_OBJECTS) $(vtkfile_la_LIBADD) $(LIBS)
 
 win_stm.la: $(win_stm_la_OBJECTS) $(win_stm_la_DEPENDENCIES) $(EXTRA_win_stm_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(win_stm_la_OBJECTS) $(win_stm_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_win_stm_la_rpath) $(win_stm_la_OBJECTS) $(win_stm_la_LIBADD) $(LIBS)
 
 wipfile.la: $(wipfile_la_OBJECTS) $(wipfile_la_DEPENDENCIES) $(EXTRA_wipfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(wipfile_la_OBJECTS) $(wipfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_wipfile_la_rpath) $(wipfile_la_OBJECTS) $(wipfile_la_LIBADD) $(LIBS)
 
 witec-asc.la: $(witec_asc_la_OBJECTS) $(witec_asc_la_DEPENDENCIES) $(EXTRA_witec_asc_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(witec_asc_la_OBJECTS) $(witec_asc_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_witec_asc_la_rpath) $(witec_asc_la_OBJECTS) $(witec_asc_la_LIBADD) $(LIBS)
 
 witfile.la: $(witfile_la_OBJECTS) $(witfile_la_DEPENDENCIES) $(EXTRA_witfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(witfile_la_OBJECTS) $(witfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_witfile_la_rpath) $(witfile_la_OBJECTS) $(witfile_la_LIBADD) $(LIBS)
 
 wsffile.la: $(wsffile_la_OBJECTS) $(wsffile_la_DEPENDENCIES) $(EXTRA_wsffile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(wsffile_la_OBJECTS) $(wsffile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_wsffile_la_rpath) $(wsffile_la_OBJECTS) $(wsffile_la_LIBADD) $(LIBS)
 
 wsxmfile.la: $(wsxmfile_la_OBJECTS) $(wsxmfile_la_DEPENDENCIES) $(EXTRA_wsxmfile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(wsxmfile_la_OBJECTS) $(wsxmfile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_wsxmfile_la_rpath) $(wsxmfile_la_OBJECTS) $(wsxmfile_la_LIBADD) $(LIBS)
 
 xyzexport.la: $(xyzexport_la_OBJECTS) $(xyzexport_la_DEPENDENCIES) $(EXTRA_xyzexport_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(xyzexport_la_OBJECTS) $(xyzexport_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_xyzexport_la_rpath) $(xyzexport_la_OBJECTS) $(xyzexport_la_LIBADD) $(LIBS)
 
 zeiss.la: $(zeiss_la_OBJECTS) $(zeiss_la_DEPENDENCIES) $(EXTRA_zeiss_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(zeiss_la_OBJECTS) $(zeiss_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_zeiss_la_rpath) $(zeiss_la_OBJECTS) $(zeiss_la_LIBADD) $(LIBS)
+
+zeisslsm.la: $(zeisslsm_la_OBJECTS) $(zeisslsm_la_DEPENDENCIES) $(EXTRA_zeisslsm_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_zeisslsm_la_rpath) $(zeisslsm_la_OBJECTS) $(zeisslsm_la_LIBADD) $(LIBS)
 
 zemax.la: $(zemax_la_OBJECTS) $(zemax_la_DEPENDENCIES) $(EXTRA_zemax_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(filedir) $(zemax_la_OBJECTS) $(zemax_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_zemax_la_rpath) $(zemax_la_OBJECTS) $(zemax_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -1821,6 +2230,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/codevfile.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/createc.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/csmfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dektakvca.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dektakxml.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dimensionfile.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dm3file.Plo at am__quote@
@@ -1830,6 +2240,115 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ezdfile.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/femtoscan-txt.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/femtoscan.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-accurexii-txt.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-aistfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-alicona.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-ambfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-anfatec.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-apefile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-asciiexport.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-assing-afm.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-attocube.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-bcrfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-burleigh.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-burleigh_bii.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-burleigh_exp.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-codevfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-csmfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-dektakvca.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-dektakxml.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-dimensionfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-dm3file.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-dmefile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-dumbfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-ecsfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-ezdfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-femtoscan-txt.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-femtoscan.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-file.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-gdeffile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-gsffile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-gwyfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-gxyzffile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-hdf4file.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-hitachi-afm.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-hitachi-sem.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-igorfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-intelliwave.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-intematix.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-iso28600.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-jeol.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-jspmfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-keyence.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-leica.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-lextfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-magellan.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-mapvue.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-metropro.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-microprof.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-miffile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-mifile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-mulfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-nanoeducator.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-nanomagnetics.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-nanonics.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-nanonis.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-nanoscan.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-nanoscope-ii.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-nanoscope.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-nanotop.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-netcdf.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-nmmxyz.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-nt-mdt.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-nxiifile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-oldmda.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-ols.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-ometiff.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-omicron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-omicronflat.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-omicronmatrix.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-opdfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-pltfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-pnifile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-princetonspe.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-psia.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-pt3file.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-quesant.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-rawfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-rawgraph.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-rawxyz.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-renishaw.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-rhk-sm3.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-rhk-spm32.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-robotics.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-s94file.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-sdfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-seiko.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-sensofar.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-sensolytics.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-shimadzu.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-sicmfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-sis.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-spip-asc.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-spmlab.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-spmlabf.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-stmprg.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-stpfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-surffile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-tescan.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-tiaser.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-unisoku.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-vtkfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-win_stm.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-wipfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-witec-asc.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-witfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-wsffile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-wsxmfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-xyzexport.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-zeiss.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-zeisslsm.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_la-zemax.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fitsfile_la-fitsfile.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gdeffile.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gsffile.Plo at am__quote@
@@ -1924,6 +2443,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/wsxmfile.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/xyzexport.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/zeiss.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/zeisslsm.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/zemax.Plo at am__quote@
 
 .c.o:
@@ -1954,6 +2474,769 @@ apedaxfile_la-apedaxfile.lo: apedaxfile.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(apedaxfile_la_CFLAGS) $(CFLAGS) -c -o apedaxfile_la-apedaxfile.lo `test -f 'apedaxfile.c' || echo '$(srcdir)/'`apedaxfile.c
 
+file_la-accurexii-txt.lo: accurexii-txt.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-accurexii-txt.lo -MD -MP -MF $(DEPDIR)/file_la-accurexii-txt.Tpo -c -o file_la-accurexii-txt.lo `test -f 'accurexii-txt.c' || echo '$(srcdir)/'`accurexii-txt.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-accurexii-txt.Tpo $(DEPDIR)/file_la-accurexii-txt.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='accurexii-txt.c' object='file_la-accurexii-txt.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-accurexii-txt.lo `test -f 'accurexii-txt.c' || echo '$(srcdir)/'`accurexii-txt.c
+
+file_la-aistfile.lo: aistfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-aistfile.lo -MD -MP -MF $(DEPDIR)/file_la-aistfile.Tpo -c -o file_la-aistfile.lo `test -f 'aistfile.c' || echo '$(srcdir)/'`aistfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-aistfile.Tpo $(DEPDIR)/file_la-aistfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='aistfile.c' object='file_la-aistfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-aistfile.lo `test -f 'aistfile.c' || echo '$(srcdir)/'`aistfile.c
+
+file_la-alicona.lo: alicona.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-alicona.lo -MD -MP -MF $(DEPDIR)/file_la-alicona.Tpo -c -o file_la-alicona.lo `test -f 'alicona.c' || echo '$(srcdir)/'`alicona.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-alicona.Tpo $(DEPDIR)/file_la-alicona.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='alicona.c' object='file_la-alicona.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-alicona.lo `test -f 'alicona.c' || echo '$(srcdir)/'`alicona.c
+
+file_la-ambfile.lo: ambfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-ambfile.lo -MD -MP -MF $(DEPDIR)/file_la-ambfile.Tpo -c -o file_la-ambfile.lo `test -f 'ambfile.c' || echo '$(srcdir)/'`ambfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-ambfile.Tpo $(DEPDIR)/file_la-ambfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ambfile.c' object='file_la-ambfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-ambfile.lo `test -f 'ambfile.c' || echo '$(srcdir)/'`ambfile.c
+
+file_la-anfatec.lo: anfatec.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-anfatec.lo -MD -MP -MF $(DEPDIR)/file_la-anfatec.Tpo -c -o file_la-anfatec.lo `test -f 'anfatec.c' || echo '$(srcdir)/'`anfatec.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-anfatec.Tpo $(DEPDIR)/file_la-anfatec.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='anfatec.c' object='file_la-anfatec.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-anfatec.lo `test -f 'anfatec.c' || echo '$(srcdir)/'`anfatec.c
+
+file_la-apefile.lo: apefile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-apefile.lo -MD -MP -MF $(DEPDIR)/file_la-apefile.Tpo -c -o file_la-apefile.lo `test -f 'apefile.c' || echo '$(srcdir)/'`apefile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-apefile.Tpo $(DEPDIR)/file_la-apefile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='apefile.c' object='file_la-apefile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-apefile.lo `test -f 'apefile.c' || echo '$(srcdir)/'`apefile.c
+
+file_la-asciiexport.lo: asciiexport.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-asciiexport.lo -MD -MP -MF $(DEPDIR)/file_la-asciiexport.Tpo -c -o file_la-asciiexport.lo `test -f 'asciiexport.c' || echo '$(srcdir)/'`asciiexport.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-asciiexport.Tpo $(DEPDIR)/file_la-asciiexport.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='asciiexport.c' object='file_la-asciiexport.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-asciiexport.lo `test -f 'asciiexport.c' || echo '$(srcdir)/'`asciiexport.c
+
+file_la-assing-afm.lo: assing-afm.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-assing-afm.lo -MD -MP -MF $(DEPDIR)/file_la-assing-afm.Tpo -c -o file_la-assing-afm.lo `test -f 'assing-afm.c' || echo '$(srcdir)/'`assing-afm.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-assing-afm.Tpo $(DEPDIR)/file_la-assing-afm.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='assing-afm.c' object='file_la-assing-afm.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-assing-afm.lo `test -f 'assing-afm.c' || echo '$(srcdir)/'`assing-afm.c
+
+file_la-attocube.lo: attocube.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-attocube.lo -MD -MP -MF $(DEPDIR)/file_la-attocube.Tpo -c -o file_la-attocube.lo `test -f 'attocube.c' || echo '$(srcdir)/'`attocube.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-attocube.Tpo $(DEPDIR)/file_la-attocube.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='attocube.c' object='file_la-attocube.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-attocube.lo `test -f 'attocube.c' || echo '$(srcdir)/'`attocube.c
+
+file_la-bcrfile.lo: bcrfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-bcrfile.lo -MD -MP -MF $(DEPDIR)/file_la-bcrfile.Tpo -c -o file_la-bcrfile.lo `test -f 'bcrfile.c' || echo '$(srcdir)/'`bcrfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-bcrfile.Tpo $(DEPDIR)/file_la-bcrfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='bcrfile.c' object='file_la-bcrfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-bcrfile.lo `test -f 'bcrfile.c' || echo '$(srcdir)/'`bcrfile.c
+
+file_la-burleigh.lo: burleigh.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-burleigh.lo -MD -MP -MF $(DEPDIR)/file_la-burleigh.Tpo -c -o file_la-burleigh.lo `test -f 'burleigh.c' || echo '$(srcdir)/'`burleigh.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-burleigh.Tpo $(DEPDIR)/file_la-burleigh.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='burleigh.c' object='file_la-burleigh.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-burleigh.lo `test -f 'burleigh.c' || echo '$(srcdir)/'`burleigh.c
+
+file_la-burleigh_bii.lo: burleigh_bii.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-burleigh_bii.lo -MD -MP -MF $(DEPDIR)/file_la-burleigh_bii.Tpo -c -o file_la-burleigh_bii.lo `test -f 'burleigh_bii.c' || echo '$(srcdir)/'`burleigh_bii.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-burleigh_bii.Tpo $(DEPDIR)/file_la-burleigh_bii.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='burleigh_bii.c' object='file_la-burleigh_bii.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-burleigh_bii.lo `test -f 'burleigh_bii.c' || echo '$(srcdir)/'`burleigh_bii.c
+
+file_la-burleigh_exp.lo: burleigh_exp.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-burleigh_exp.lo -MD -MP -MF $(DEPDIR)/file_la-burleigh_exp.Tpo -c -o file_la-burleigh_exp.lo `test -f 'burleigh_exp.c' || echo '$(srcdir)/'`burleigh_exp.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-burleigh_exp.Tpo $(DEPDIR)/file_la-burleigh_exp.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='burleigh_exp.c' object='file_la-burleigh_exp.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-burleigh_exp.lo `test -f 'burleigh_exp.c' || echo '$(srcdir)/'`burleigh_exp.c
+
+file_la-codevfile.lo: codevfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-codevfile.lo -MD -MP -MF $(DEPDIR)/file_la-codevfile.Tpo -c -o file_la-codevfile.lo `test -f 'codevfile.c' || echo '$(srcdir)/'`codevfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-codevfile.Tpo $(DEPDIR)/file_la-codevfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='codevfile.c' object='file_la-codevfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-codevfile.lo `test -f 'codevfile.c' || echo '$(srcdir)/'`codevfile.c
+
+file_la-csmfile.lo: csmfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-csmfile.lo -MD -MP -MF $(DEPDIR)/file_la-csmfile.Tpo -c -o file_la-csmfile.lo `test -f 'csmfile.c' || echo '$(srcdir)/'`csmfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-csmfile.Tpo $(DEPDIR)/file_la-csmfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='csmfile.c' object='file_la-csmfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-csmfile.lo `test -f 'csmfile.c' || echo '$(srcdir)/'`csmfile.c
+
+file_la-dektakvca.lo: dektakvca.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-dektakvca.lo -MD -MP -MF $(DEPDIR)/file_la-dektakvca.Tpo -c -o file_la-dektakvca.lo `test -f 'dektakvca.c' || echo '$(srcdir)/'`dektakvca.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-dektakvca.Tpo $(DEPDIR)/file_la-dektakvca.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dektakvca.c' object='file_la-dektakvca.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-dektakvca.lo `test -f 'dektakvca.c' || echo '$(srcdir)/'`dektakvca.c
+
+file_la-dektakxml.lo: dektakxml.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-dektakxml.lo -MD -MP -MF $(DEPDIR)/file_la-dektakxml.Tpo -c -o file_la-dektakxml.lo `test -f 'dektakxml.c' || echo '$(srcdir)/'`dektakxml.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-dektakxml.Tpo $(DEPDIR)/file_la-dektakxml.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dektakxml.c' object='file_la-dektakxml.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-dektakxml.lo `test -f 'dektakxml.c' || echo '$(srcdir)/'`dektakxml.c
+
+file_la-dimensionfile.lo: dimensionfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-dimensionfile.lo -MD -MP -MF $(DEPDIR)/file_la-dimensionfile.Tpo -c -o file_la-dimensionfile.lo `test -f 'dimensionfile.c' || echo '$(srcdir)/'`dimensionfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-dimensionfile.Tpo $(DEPDIR)/file_la-dimensionfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dimensionfile.c' object='file_la-dimensionfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-dimensionfile.lo `test -f 'dimensionfile.c' || echo '$(srcdir)/'`dimensionfile.c
+
+file_la-dmefile.lo: dmefile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-dmefile.lo -MD -MP -MF $(DEPDIR)/file_la-dmefile.Tpo -c -o file_la-dmefile.lo `test -f 'dmefile.c' || echo '$(srcdir)/'`dmefile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-dmefile.Tpo $(DEPDIR)/file_la-dmefile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dmefile.c' object='file_la-dmefile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-dmefile.lo `test -f 'dmefile.c' || echo '$(srcdir)/'`dmefile.c
+
+file_la-dm3file.lo: dm3file.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-dm3file.lo -MD -MP -MF $(DEPDIR)/file_la-dm3file.Tpo -c -o file_la-dm3file.lo `test -f 'dm3file.c' || echo '$(srcdir)/'`dm3file.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-dm3file.Tpo $(DEPDIR)/file_la-dm3file.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dm3file.c' object='file_la-dm3file.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-dm3file.lo `test -f 'dm3file.c' || echo '$(srcdir)/'`dm3file.c
+
+file_la-dumbfile.lo: dumbfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-dumbfile.lo -MD -MP -MF $(DEPDIR)/file_la-dumbfile.Tpo -c -o file_la-dumbfile.lo `test -f 'dumbfile.c' || echo '$(srcdir)/'`dumbfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-dumbfile.Tpo $(DEPDIR)/file_la-dumbfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dumbfile.c' object='file_la-dumbfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-dumbfile.lo `test -f 'dumbfile.c' || echo '$(srcdir)/'`dumbfile.c
+
+file_la-ecsfile.lo: ecsfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-ecsfile.lo -MD -MP -MF $(DEPDIR)/file_la-ecsfile.Tpo -c -o file_la-ecsfile.lo `test -f 'ecsfile.c' || echo '$(srcdir)/'`ecsfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-ecsfile.Tpo $(DEPDIR)/file_la-ecsfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ecsfile.c' object='file_la-ecsfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-ecsfile.lo `test -f 'ecsfile.c' || echo '$(srcdir)/'`ecsfile.c
+
+file_la-ezdfile.lo: ezdfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-ezdfile.lo -MD -MP -MF $(DEPDIR)/file_la-ezdfile.Tpo -c -o file_la-ezdfile.lo `test -f 'ezdfile.c' || echo '$(srcdir)/'`ezdfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-ezdfile.Tpo $(DEPDIR)/file_la-ezdfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ezdfile.c' object='file_la-ezdfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-ezdfile.lo `test -f 'ezdfile.c' || echo '$(srcdir)/'`ezdfile.c
+
+file_la-femtoscan.lo: femtoscan.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-femtoscan.lo -MD -MP -MF $(DEPDIR)/file_la-femtoscan.Tpo -c -o file_la-femtoscan.lo `test -f 'femtoscan.c' || echo '$(srcdir)/'`femtoscan.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-femtoscan.Tpo $(DEPDIR)/file_la-femtoscan.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='femtoscan.c' object='file_la-femtoscan.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-femtoscan.lo `test -f 'femtoscan.c' || echo '$(srcdir)/'`femtoscan.c
+
+file_la-femtoscan-txt.lo: femtoscan-txt.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-femtoscan-txt.lo -MD -MP -MF $(DEPDIR)/file_la-femtoscan-txt.Tpo -c -o file_la-femtoscan-txt.lo `test -f 'femtoscan-txt.c' || echo '$(srcdir)/'`femtoscan-txt.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-femtoscan-txt.Tpo $(DEPDIR)/file_la-femtoscan-txt.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='femtoscan-txt.c' object='file_la-femtoscan-txt.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-femtoscan-txt.lo `test -f 'femtoscan-txt.c' || echo '$(srcdir)/'`femtoscan-txt.c
+
+file_la-gdeffile.lo: gdeffile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-gdeffile.lo -MD -MP -MF $(DEPDIR)/file_la-gdeffile.Tpo -c -o file_la-gdeffile.lo `test -f 'gdeffile.c' || echo '$(srcdir)/'`gdeffile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-gdeffile.Tpo $(DEPDIR)/file_la-gdeffile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gdeffile.c' object='file_la-gdeffile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-gdeffile.lo `test -f 'gdeffile.c' || echo '$(srcdir)/'`gdeffile.c
+
+file_la-gsffile.lo: gsffile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-gsffile.lo -MD -MP -MF $(DEPDIR)/file_la-gsffile.Tpo -c -o file_la-gsffile.lo `test -f 'gsffile.c' || echo '$(srcdir)/'`gsffile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-gsffile.Tpo $(DEPDIR)/file_la-gsffile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gsffile.c' object='file_la-gsffile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-gsffile.lo `test -f 'gsffile.c' || echo '$(srcdir)/'`gsffile.c
+
+file_la-gwyfile.lo: gwyfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-gwyfile.lo -MD -MP -MF $(DEPDIR)/file_la-gwyfile.Tpo -c -o file_la-gwyfile.lo `test -f 'gwyfile.c' || echo '$(srcdir)/'`gwyfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-gwyfile.Tpo $(DEPDIR)/file_la-gwyfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gwyfile.c' object='file_la-gwyfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-gwyfile.lo `test -f 'gwyfile.c' || echo '$(srcdir)/'`gwyfile.c
+
+file_la-gxyzffile.lo: gxyzffile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-gxyzffile.lo -MD -MP -MF $(DEPDIR)/file_la-gxyzffile.Tpo -c -o file_la-gxyzffile.lo `test -f 'gxyzffile.c' || echo '$(srcdir)/'`gxyzffile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-gxyzffile.Tpo $(DEPDIR)/file_la-gxyzffile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gxyzffile.c' object='file_la-gxyzffile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-gxyzffile.lo `test -f 'gxyzffile.c' || echo '$(srcdir)/'`gxyzffile.c
+
+file_la-hdf4file.lo: hdf4file.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-hdf4file.lo -MD -MP -MF $(DEPDIR)/file_la-hdf4file.Tpo -c -o file_la-hdf4file.lo `test -f 'hdf4file.c' || echo '$(srcdir)/'`hdf4file.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-hdf4file.Tpo $(DEPDIR)/file_la-hdf4file.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='hdf4file.c' object='file_la-hdf4file.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-hdf4file.lo `test -f 'hdf4file.c' || echo '$(srcdir)/'`hdf4file.c
+
+file_la-hitachi-afm.lo: hitachi-afm.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-hitachi-afm.lo -MD -MP -MF $(DEPDIR)/file_la-hitachi-afm.Tpo -c -o file_la-hitachi-afm.lo `test -f 'hitachi-afm.c' || echo '$(srcdir)/'`hitachi-afm.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-hitachi-afm.Tpo $(DEPDIR)/file_la-hitachi-afm.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='hitachi-afm.c' object='file_la-hitachi-afm.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-hitachi-afm.lo `test -f 'hitachi-afm.c' || echo '$(srcdir)/'`hitachi-afm.c
+
+file_la-hitachi-sem.lo: hitachi-sem.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-hitachi-sem.lo -MD -MP -MF $(DEPDIR)/file_la-hitachi-sem.Tpo -c -o file_la-hitachi-sem.lo `test -f 'hitachi-sem.c' || echo '$(srcdir)/'`hitachi-sem.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-hitachi-sem.Tpo $(DEPDIR)/file_la-hitachi-sem.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='hitachi-sem.c' object='file_la-hitachi-sem.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-hitachi-sem.lo `test -f 'hitachi-sem.c' || echo '$(srcdir)/'`hitachi-sem.c
+
+file_la-igorfile.lo: igorfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-igorfile.lo -MD -MP -MF $(DEPDIR)/file_la-igorfile.Tpo -c -o file_la-igorfile.lo `test -f 'igorfile.c' || echo '$(srcdir)/'`igorfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-igorfile.Tpo $(DEPDIR)/file_la-igorfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='igorfile.c' object='file_la-igorfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-igorfile.lo `test -f 'igorfile.c' || echo '$(srcdir)/'`igorfile.c
+
+file_la-intelliwave.lo: intelliwave.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-intelliwave.lo -MD -MP -MF $(DEPDIR)/file_la-intelliwave.Tpo -c -o file_la-intelliwave.lo `test -f 'intelliwave.c' || echo '$(srcdir)/'`intelliwave.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-intelliwave.Tpo $(DEPDIR)/file_la-intelliwave.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='intelliwave.c' object='file_la-intelliwave.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-intelliwave.lo `test -f 'intelliwave.c' || echo '$(srcdir)/'`intelliwave.c
+
+file_la-intematix.lo: intematix.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-intematix.lo -MD -MP -MF $(DEPDIR)/file_la-intematix.Tpo -c -o file_la-intematix.lo `test -f 'intematix.c' || echo '$(srcdir)/'`intematix.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-intematix.Tpo $(DEPDIR)/file_la-intematix.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='intematix.c' object='file_la-intematix.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-intematix.lo `test -f 'intematix.c' || echo '$(srcdir)/'`intematix.c
+
+file_la-iso28600.lo: iso28600.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-iso28600.lo -MD -MP -MF $(DEPDIR)/file_la-iso28600.Tpo -c -o file_la-iso28600.lo `test -f 'iso28600.c' || echo '$(srcdir)/'`iso28600.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-iso28600.Tpo $(DEPDIR)/file_la-iso28600.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='iso28600.c' object='file_la-iso28600.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-iso28600.lo `test -f 'iso28600.c' || echo '$(srcdir)/'`iso28600.c
+
+file_la-jeol.lo: jeol.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-jeol.lo -MD -MP -MF $(DEPDIR)/file_la-jeol.Tpo -c -o file_la-jeol.lo `test -f 'jeol.c' || echo '$(srcdir)/'`jeol.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-jeol.Tpo $(DEPDIR)/file_la-jeol.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='jeol.c' object='file_la-jeol.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-jeol.lo `test -f 'jeol.c' || echo '$(srcdir)/'`jeol.c
+
+file_la-jspmfile.lo: jspmfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-jspmfile.lo -MD -MP -MF $(DEPDIR)/file_la-jspmfile.Tpo -c -o file_la-jspmfile.lo `test -f 'jspmfile.c' || echo '$(srcdir)/'`jspmfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-jspmfile.Tpo $(DEPDIR)/file_la-jspmfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='jspmfile.c' object='file_la-jspmfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-jspmfile.lo `test -f 'jspmfile.c' || echo '$(srcdir)/'`jspmfile.c
+
+file_la-keyence.lo: keyence.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-keyence.lo -MD -MP -MF $(DEPDIR)/file_la-keyence.Tpo -c -o file_la-keyence.lo `test -f 'keyence.c' || echo '$(srcdir)/'`keyence.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-keyence.Tpo $(DEPDIR)/file_la-keyence.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='keyence.c' object='file_la-keyence.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-keyence.lo `test -f 'keyence.c' || echo '$(srcdir)/'`keyence.c
+
+file_la-leica.lo: leica.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-leica.lo -MD -MP -MF $(DEPDIR)/file_la-leica.Tpo -c -o file_la-leica.lo `test -f 'leica.c' || echo '$(srcdir)/'`leica.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-leica.Tpo $(DEPDIR)/file_la-leica.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='leica.c' object='file_la-leica.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-leica.lo `test -f 'leica.c' || echo '$(srcdir)/'`leica.c
+
+file_la-lextfile.lo: lextfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-lextfile.lo -MD -MP -MF $(DEPDIR)/file_la-lextfile.Tpo -c -o file_la-lextfile.lo `test -f 'lextfile.c' || echo '$(srcdir)/'`lextfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-lextfile.Tpo $(DEPDIR)/file_la-lextfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lextfile.c' object='file_la-lextfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-lextfile.lo `test -f 'lextfile.c' || echo '$(srcdir)/'`lextfile.c
+
+file_la-magellan.lo: magellan.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-magellan.lo -MD -MP -MF $(DEPDIR)/file_la-magellan.Tpo -c -o file_la-magellan.lo `test -f 'magellan.c' || echo '$(srcdir)/'`magellan.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-magellan.Tpo $(DEPDIR)/file_la-magellan.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='magellan.c' object='file_la-magellan.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-magellan.lo `test -f 'magellan.c' || echo '$(srcdir)/'`magellan.c
+
+file_la-mapvue.lo: mapvue.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-mapvue.lo -MD -MP -MF $(DEPDIR)/file_la-mapvue.Tpo -c -o file_la-mapvue.lo `test -f 'mapvue.c' || echo '$(srcdir)/'`mapvue.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-mapvue.Tpo $(DEPDIR)/file_la-mapvue.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mapvue.c' object='file_la-mapvue.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-mapvue.lo `test -f 'mapvue.c' || echo '$(srcdir)/'`mapvue.c
+
+file_la-metropro.lo: metropro.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-metropro.lo -MD -MP -MF $(DEPDIR)/file_la-metropro.Tpo -c -o file_la-metropro.lo `test -f 'metropro.c' || echo '$(srcdir)/'`metropro.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-metropro.Tpo $(DEPDIR)/file_la-metropro.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='metropro.c' object='file_la-metropro.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-metropro.lo `test -f 'metropro.c' || echo '$(srcdir)/'`metropro.c
+
+file_la-microprof.lo: microprof.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-microprof.lo -MD -MP -MF $(DEPDIR)/file_la-microprof.Tpo -c -o file_la-microprof.lo `test -f 'microprof.c' || echo '$(srcdir)/'`microprof.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-microprof.Tpo $(DEPDIR)/file_la-microprof.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='microprof.c' object='file_la-microprof.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-microprof.lo `test -f 'microprof.c' || echo '$(srcdir)/'`microprof.c
+
+file_la-miffile.lo: miffile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-miffile.lo -MD -MP -MF $(DEPDIR)/file_la-miffile.Tpo -c -o file_la-miffile.lo `test -f 'miffile.c' || echo '$(srcdir)/'`miffile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-miffile.Tpo $(DEPDIR)/file_la-miffile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='miffile.c' object='file_la-miffile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-miffile.lo `test -f 'miffile.c' || echo '$(srcdir)/'`miffile.c
+
+file_la-mifile.lo: mifile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-mifile.lo -MD -MP -MF $(DEPDIR)/file_la-mifile.Tpo -c -o file_la-mifile.lo `test -f 'mifile.c' || echo '$(srcdir)/'`mifile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-mifile.Tpo $(DEPDIR)/file_la-mifile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mifile.c' object='file_la-mifile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-mifile.lo `test -f 'mifile.c' || echo '$(srcdir)/'`mifile.c
+
+file_la-mulfile.lo: mulfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-mulfile.lo -MD -MP -MF $(DEPDIR)/file_la-mulfile.Tpo -c -o file_la-mulfile.lo `test -f 'mulfile.c' || echo '$(srcdir)/'`mulfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-mulfile.Tpo $(DEPDIR)/file_la-mulfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mulfile.c' object='file_la-mulfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-mulfile.lo `test -f 'mulfile.c' || echo '$(srcdir)/'`mulfile.c
+
+file_la-nanoeducator.lo: nanoeducator.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-nanoeducator.lo -MD -MP -MF $(DEPDIR)/file_la-nanoeducator.Tpo -c -o file_la-nanoeducator.lo `test -f 'nanoeducator.c' || echo '$(srcdir)/'`nanoeducator.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-nanoeducator.Tpo $(DEPDIR)/file_la-nanoeducator.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='nanoeducator.c' object='file_la-nanoeducator.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-nanoeducator.lo `test -f 'nanoeducator.c' || echo '$(srcdir)/'`nanoeducator.c
+
+file_la-nanomagnetics.lo: nanomagnetics.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-nanomagnetics.lo -MD -MP -MF $(DEPDIR)/file_la-nanomagnetics.Tpo -c -o file_la-nanomagnetics.lo `test -f 'nanomagnetics.c' || echo '$(srcdir)/'`nanomagnetics.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-nanomagnetics.Tpo $(DEPDIR)/file_la-nanomagnetics.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='nanomagnetics.c' object='file_la-nanomagnetics.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-nanomagnetics.lo `test -f 'nanomagnetics.c' || echo '$(srcdir)/'`nanomagnetics.c
+
+file_la-nanonics.lo: nanonics.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-nanonics.lo -MD -MP -MF $(DEPDIR)/file_la-nanonics.Tpo -c -o file_la-nanonics.lo `test -f 'nanonics.c' || echo '$(srcdir)/'`nanonics.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-nanonics.Tpo $(DEPDIR)/file_la-nanonics.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='nanonics.c' object='file_la-nanonics.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-nanonics.lo `test -f 'nanonics.c' || echo '$(srcdir)/'`nanonics.c
+
+file_la-nanonis.lo: nanonis.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-nanonis.lo -MD -MP -MF $(DEPDIR)/file_la-nanonis.Tpo -c -o file_la-nanonis.lo `test -f 'nanonis.c' || echo '$(srcdir)/'`nanonis.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-nanonis.Tpo $(DEPDIR)/file_la-nanonis.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='nanonis.c' object='file_la-nanonis.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-nanonis.lo `test -f 'nanonis.c' || echo '$(srcdir)/'`nanonis.c
+
+file_la-nanoscan.lo: nanoscan.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-nanoscan.lo -MD -MP -MF $(DEPDIR)/file_la-nanoscan.Tpo -c -o file_la-nanoscan.lo `test -f 'nanoscan.c' || echo '$(srcdir)/'`nanoscan.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-nanoscan.Tpo $(DEPDIR)/file_la-nanoscan.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='nanoscan.c' object='file_la-nanoscan.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-nanoscan.lo `test -f 'nanoscan.c' || echo '$(srcdir)/'`nanoscan.c
+
+file_la-nanoscope-ii.lo: nanoscope-ii.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-nanoscope-ii.lo -MD -MP -MF $(DEPDIR)/file_la-nanoscope-ii.Tpo -c -o file_la-nanoscope-ii.lo `test -f 'nanoscope-ii.c' || echo '$(srcdir)/'`nanoscope-ii.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-nanoscope-ii.Tpo $(DEPDIR)/file_la-nanoscope-ii.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='nanoscope-ii.c' object='file_la-nanoscope-ii.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-nanoscope-ii.lo `test -f 'nanoscope-ii.c' || echo '$(srcdir)/'`nanoscope-ii.c
+
+file_la-nanoscope.lo: nanoscope.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-nanoscope.lo -MD -MP -MF $(DEPDIR)/file_la-nanoscope.Tpo -c -o file_la-nanoscope.lo `test -f 'nanoscope.c' || echo '$(srcdir)/'`nanoscope.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-nanoscope.Tpo $(DEPDIR)/file_la-nanoscope.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='nanoscope.c' object='file_la-nanoscope.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-nanoscope.lo `test -f 'nanoscope.c' || echo '$(srcdir)/'`nanoscope.c
+
+file_la-nanotop.lo: nanotop.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-nanotop.lo -MD -MP -MF $(DEPDIR)/file_la-nanotop.Tpo -c -o file_la-nanotop.lo `test -f 'nanotop.c' || echo '$(srcdir)/'`nanotop.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-nanotop.Tpo $(DEPDIR)/file_la-nanotop.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='nanotop.c' object='file_la-nanotop.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-nanotop.lo `test -f 'nanotop.c' || echo '$(srcdir)/'`nanotop.c
+
+file_la-netcdf.lo: netcdf.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-netcdf.lo -MD -MP -MF $(DEPDIR)/file_la-netcdf.Tpo -c -o file_la-netcdf.lo `test -f 'netcdf.c' || echo '$(srcdir)/'`netcdf.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-netcdf.Tpo $(DEPDIR)/file_la-netcdf.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='netcdf.c' object='file_la-netcdf.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-netcdf.lo `test -f 'netcdf.c' || echo '$(srcdir)/'`netcdf.c
+
+file_la-nmmxyz.lo: nmmxyz.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-nmmxyz.lo -MD -MP -MF $(DEPDIR)/file_la-nmmxyz.Tpo -c -o file_la-nmmxyz.lo `test -f 'nmmxyz.c' || echo '$(srcdir)/'`nmmxyz.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-nmmxyz.Tpo $(DEPDIR)/file_la-nmmxyz.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='nmmxyz.c' object='file_la-nmmxyz.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-nmmxyz.lo `test -f 'nmmxyz.c' || echo '$(srcdir)/'`nmmxyz.c
+
+file_la-nt-mdt.lo: nt-mdt.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-nt-mdt.lo -MD -MP -MF $(DEPDIR)/file_la-nt-mdt.Tpo -c -o file_la-nt-mdt.lo `test -f 'nt-mdt.c' || echo '$(srcdir)/'`nt-mdt.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-nt-mdt.Tpo $(DEPDIR)/file_la-nt-mdt.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='nt-mdt.c' object='file_la-nt-mdt.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-nt-mdt.lo `test -f 'nt-mdt.c' || echo '$(srcdir)/'`nt-mdt.c
+
+file_la-nxiifile.lo: nxiifile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-nxiifile.lo -MD -MP -MF $(DEPDIR)/file_la-nxiifile.Tpo -c -o file_la-nxiifile.lo `test -f 'nxiifile.c' || echo '$(srcdir)/'`nxiifile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-nxiifile.Tpo $(DEPDIR)/file_la-nxiifile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='nxiifile.c' object='file_la-nxiifile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-nxiifile.lo `test -f 'nxiifile.c' || echo '$(srcdir)/'`nxiifile.c
+
+file_la-oldmda.lo: oldmda.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-oldmda.lo -MD -MP -MF $(DEPDIR)/file_la-oldmda.Tpo -c -o file_la-oldmda.lo `test -f 'oldmda.c' || echo '$(srcdir)/'`oldmda.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-oldmda.Tpo $(DEPDIR)/file_la-oldmda.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='oldmda.c' object='file_la-oldmda.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-oldmda.lo `test -f 'oldmda.c' || echo '$(srcdir)/'`oldmda.c
+
+file_la-ols.lo: ols.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-ols.lo -MD -MP -MF $(DEPDIR)/file_la-ols.Tpo -c -o file_la-ols.lo `test -f 'ols.c' || echo '$(srcdir)/'`ols.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-ols.Tpo $(DEPDIR)/file_la-ols.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ols.c' object='file_la-ols.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-ols.lo `test -f 'ols.c' || echo '$(srcdir)/'`ols.c
+
+file_la-ometiff.lo: ometiff.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-ometiff.lo -MD -MP -MF $(DEPDIR)/file_la-ometiff.Tpo -c -o file_la-ometiff.lo `test -f 'ometiff.c' || echo '$(srcdir)/'`ometiff.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-ometiff.Tpo $(DEPDIR)/file_la-ometiff.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ometiff.c' object='file_la-ometiff.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-ometiff.lo `test -f 'ometiff.c' || echo '$(srcdir)/'`ometiff.c
+
+file_la-omicron.lo: omicron.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-omicron.lo -MD -MP -MF $(DEPDIR)/file_la-omicron.Tpo -c -o file_la-omicron.lo `test -f 'omicron.c' || echo '$(srcdir)/'`omicron.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-omicron.Tpo $(DEPDIR)/file_la-omicron.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='omicron.c' object='file_la-omicron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-omicron.lo `test -f 'omicron.c' || echo '$(srcdir)/'`omicron.c
+
+file_la-omicronflat.lo: omicronflat.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-omicronflat.lo -MD -MP -MF $(DEPDIR)/file_la-omicronflat.Tpo -c -o file_la-omicronflat.lo `test -f 'omicronflat.c' || echo '$(srcdir)/'`omicronflat.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-omicronflat.Tpo $(DEPDIR)/file_la-omicronflat.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='omicronflat.c' object='file_la-omicronflat.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-omicronflat.lo `test -f 'omicronflat.c' || echo '$(srcdir)/'`omicronflat.c
+
+file_la-omicronmatrix.lo: omicronmatrix.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-omicronmatrix.lo -MD -MP -MF $(DEPDIR)/file_la-omicronmatrix.Tpo -c -o file_la-omicronmatrix.lo `test -f 'omicronmatrix.c' || echo '$(srcdir)/'`omicronmatrix.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-omicronmatrix.Tpo $(DEPDIR)/file_la-omicronmatrix.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='omicronmatrix.c' object='file_la-omicronmatrix.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-omicronmatrix.lo `test -f 'omicronmatrix.c' || echo '$(srcdir)/'`omicronmatrix.c
+
+file_la-opdfile.lo: opdfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-opdfile.lo -MD -MP -MF $(DEPDIR)/file_la-opdfile.Tpo -c -o file_la-opdfile.lo `test -f 'opdfile.c' || echo '$(srcdir)/'`opdfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-opdfile.Tpo $(DEPDIR)/file_la-opdfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='opdfile.c' object='file_la-opdfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-opdfile.lo `test -f 'opdfile.c' || echo '$(srcdir)/'`opdfile.c
+
+file_la-pnifile.lo: pnifile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-pnifile.lo -MD -MP -MF $(DEPDIR)/file_la-pnifile.Tpo -c -o file_la-pnifile.lo `test -f 'pnifile.c' || echo '$(srcdir)/'`pnifile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-pnifile.Tpo $(DEPDIR)/file_la-pnifile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pnifile.c' object='file_la-pnifile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-pnifile.lo `test -f 'pnifile.c' || echo '$(srcdir)/'`pnifile.c
+
+file_la-pltfile.lo: pltfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-pltfile.lo -MD -MP -MF $(DEPDIR)/file_la-pltfile.Tpo -c -o file_la-pltfile.lo `test -f 'pltfile.c' || echo '$(srcdir)/'`pltfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-pltfile.Tpo $(DEPDIR)/file_la-pltfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pltfile.c' object='file_la-pltfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-pltfile.lo `test -f 'pltfile.c' || echo '$(srcdir)/'`pltfile.c
+
+file_la-princetonspe.lo: princetonspe.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-princetonspe.lo -MD -MP -MF $(DEPDIR)/file_la-princetonspe.Tpo -c -o file_la-princetonspe.lo `test -f 'princetonspe.c' || echo '$(srcdir)/'`princetonspe.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-princetonspe.Tpo $(DEPDIR)/file_la-princetonspe.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='princetonspe.c' object='file_la-princetonspe.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-princetonspe.lo `test -f 'princetonspe.c' || echo '$(srcdir)/'`princetonspe.c
+
+file_la-psia.lo: psia.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-psia.lo -MD -MP -MF $(DEPDIR)/file_la-psia.Tpo -c -o file_la-psia.lo `test -f 'psia.c' || echo '$(srcdir)/'`psia.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-psia.Tpo $(DEPDIR)/file_la-psia.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='psia.c' object='file_la-psia.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-psia.lo `test -f 'psia.c' || echo '$(srcdir)/'`psia.c
+
+file_la-pt3file.lo: pt3file.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-pt3file.lo -MD -MP -MF $(DEPDIR)/file_la-pt3file.Tpo -c -o file_la-pt3file.lo `test -f 'pt3file.c' || echo '$(srcdir)/'`pt3file.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-pt3file.Tpo $(DEPDIR)/file_la-pt3file.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pt3file.c' object='file_la-pt3file.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-pt3file.lo `test -f 'pt3file.c' || echo '$(srcdir)/'`pt3file.c
+
+file_la-quesant.lo: quesant.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-quesant.lo -MD -MP -MF $(DEPDIR)/file_la-quesant.Tpo -c -o file_la-quesant.lo `test -f 'quesant.c' || echo '$(srcdir)/'`quesant.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-quesant.Tpo $(DEPDIR)/file_la-quesant.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='quesant.c' object='file_la-quesant.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-quesant.lo `test -f 'quesant.c' || echo '$(srcdir)/'`quesant.c
+
+file_la-rawfile.lo: rawfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-rawfile.lo -MD -MP -MF $(DEPDIR)/file_la-rawfile.Tpo -c -o file_la-rawfile.lo `test -f 'rawfile.c' || echo '$(srcdir)/'`rawfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-rawfile.Tpo $(DEPDIR)/file_la-rawfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='rawfile.c' object='file_la-rawfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-rawfile.lo `test -f 'rawfile.c' || echo '$(srcdir)/'`rawfile.c
+
+file_la-rawgraph.lo: rawgraph.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-rawgraph.lo -MD -MP -MF $(DEPDIR)/file_la-rawgraph.Tpo -c -o file_la-rawgraph.lo `test -f 'rawgraph.c' || echo '$(srcdir)/'`rawgraph.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-rawgraph.Tpo $(DEPDIR)/file_la-rawgraph.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='rawgraph.c' object='file_la-rawgraph.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-rawgraph.lo `test -f 'rawgraph.c' || echo '$(srcdir)/'`rawgraph.c
+
+file_la-rawxyz.lo: rawxyz.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-rawxyz.lo -MD -MP -MF $(DEPDIR)/file_la-rawxyz.Tpo -c -o file_la-rawxyz.lo `test -f 'rawxyz.c' || echo '$(srcdir)/'`rawxyz.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-rawxyz.Tpo $(DEPDIR)/file_la-rawxyz.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='rawxyz.c' object='file_la-rawxyz.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-rawxyz.lo `test -f 'rawxyz.c' || echo '$(srcdir)/'`rawxyz.c
+
+file_la-renishaw.lo: renishaw.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-renishaw.lo -MD -MP -MF $(DEPDIR)/file_la-renishaw.Tpo -c -o file_la-renishaw.lo `test -f 'renishaw.c' || echo '$(srcdir)/'`renishaw.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-renishaw.Tpo $(DEPDIR)/file_la-renishaw.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='renishaw.c' object='file_la-renishaw.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-renishaw.lo `test -f 'renishaw.c' || echo '$(srcdir)/'`renishaw.c
+
+file_la-rhk-sm3.lo: rhk-sm3.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-rhk-sm3.lo -MD -MP -MF $(DEPDIR)/file_la-rhk-sm3.Tpo -c -o file_la-rhk-sm3.lo `test -f 'rhk-sm3.c' || echo '$(srcdir)/'`rhk-sm3.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-rhk-sm3.Tpo $(DEPDIR)/file_la-rhk-sm3.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='rhk-sm3.c' object='file_la-rhk-sm3.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-rhk-sm3.lo `test -f 'rhk-sm3.c' || echo '$(srcdir)/'`rhk-sm3.c
+
+file_la-rhk-spm32.lo: rhk-spm32.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-rhk-spm32.lo -MD -MP -MF $(DEPDIR)/file_la-rhk-spm32.Tpo -c -o file_la-rhk-spm32.lo `test -f 'rhk-spm32.c' || echo '$(srcdir)/'`rhk-spm32.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-rhk-spm32.Tpo $(DEPDIR)/file_la-rhk-spm32.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='rhk-spm32.c' object='file_la-rhk-spm32.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-rhk-spm32.lo `test -f 'rhk-spm32.c' || echo '$(srcdir)/'`rhk-spm32.c
+
+file_la-robotics.lo: robotics.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-robotics.lo -MD -MP -MF $(DEPDIR)/file_la-robotics.Tpo -c -o file_la-robotics.lo `test -f 'robotics.c' || echo '$(srcdir)/'`robotics.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-robotics.Tpo $(DEPDIR)/file_la-robotics.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='robotics.c' object='file_la-robotics.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-robotics.lo `test -f 'robotics.c' || echo '$(srcdir)/'`robotics.c
+
+file_la-s94file.lo: s94file.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-s94file.lo -MD -MP -MF $(DEPDIR)/file_la-s94file.Tpo -c -o file_la-s94file.lo `test -f 's94file.c' || echo '$(srcdir)/'`s94file.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-s94file.Tpo $(DEPDIR)/file_la-s94file.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='s94file.c' object='file_la-s94file.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-s94file.lo `test -f 's94file.c' || echo '$(srcdir)/'`s94file.c
+
+file_la-sdfile.lo: sdfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-sdfile.lo -MD -MP -MF $(DEPDIR)/file_la-sdfile.Tpo -c -o file_la-sdfile.lo `test -f 'sdfile.c' || echo '$(srcdir)/'`sdfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-sdfile.Tpo $(DEPDIR)/file_la-sdfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='sdfile.c' object='file_la-sdfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-sdfile.lo `test -f 'sdfile.c' || echo '$(srcdir)/'`sdfile.c
+
+file_la-seiko.lo: seiko.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-seiko.lo -MD -MP -MF $(DEPDIR)/file_la-seiko.Tpo -c -o file_la-seiko.lo `test -f 'seiko.c' || echo '$(srcdir)/'`seiko.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-seiko.Tpo $(DEPDIR)/file_la-seiko.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='seiko.c' object='file_la-seiko.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-seiko.lo `test -f 'seiko.c' || echo '$(srcdir)/'`seiko.c
+
+file_la-sensofar.lo: sensofar.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-sensofar.lo -MD -MP -MF $(DEPDIR)/file_la-sensofar.Tpo -c -o file_la-sensofar.lo `test -f 'sensofar.c' || echo '$(srcdir)/'`sensofar.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-sensofar.Tpo $(DEPDIR)/file_la-sensofar.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='sensofar.c' object='file_la-sensofar.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-sensofar.lo `test -f 'sensofar.c' || echo '$(srcdir)/'`sensofar.c
+
+file_la-sensolytics.lo: sensolytics.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-sensolytics.lo -MD -MP -MF $(DEPDIR)/file_la-sensolytics.Tpo -c -o file_la-sensolytics.lo `test -f 'sensolytics.c' || echo '$(srcdir)/'`sensolytics.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-sensolytics.Tpo $(DEPDIR)/file_la-sensolytics.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='sensolytics.c' object='file_la-sensolytics.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-sensolytics.lo `test -f 'sensolytics.c' || echo '$(srcdir)/'`sensolytics.c
+
+file_la-shimadzu.lo: shimadzu.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-shimadzu.lo -MD -MP -MF $(DEPDIR)/file_la-shimadzu.Tpo -c -o file_la-shimadzu.lo `test -f 'shimadzu.c' || echo '$(srcdir)/'`shimadzu.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-shimadzu.Tpo $(DEPDIR)/file_la-shimadzu.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='shimadzu.c' object='file_la-shimadzu.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-shimadzu.lo `test -f 'shimadzu.c' || echo '$(srcdir)/'`shimadzu.c
+
+file_la-sicmfile.lo: sicmfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-sicmfile.lo -MD -MP -MF $(DEPDIR)/file_la-sicmfile.Tpo -c -o file_la-sicmfile.lo `test -f 'sicmfile.c' || echo '$(srcdir)/'`sicmfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-sicmfile.Tpo $(DEPDIR)/file_la-sicmfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='sicmfile.c' object='file_la-sicmfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-sicmfile.lo `test -f 'sicmfile.c' || echo '$(srcdir)/'`sicmfile.c
+
+file_la-sis.lo: sis.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-sis.lo -MD -MP -MF $(DEPDIR)/file_la-sis.Tpo -c -o file_la-sis.lo `test -f 'sis.c' || echo '$(srcdir)/'`sis.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-sis.Tpo $(DEPDIR)/file_la-sis.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='sis.c' object='file_la-sis.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-sis.lo `test -f 'sis.c' || echo '$(srcdir)/'`sis.c
+
+file_la-spip-asc.lo: spip-asc.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-spip-asc.lo -MD -MP -MF $(DEPDIR)/file_la-spip-asc.Tpo -c -o file_la-spip-asc.lo `test -f 'spip-asc.c' || echo '$(srcdir)/'`spip-asc.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-spip-asc.Tpo $(DEPDIR)/file_la-spip-asc.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='spip-asc.c' object='file_la-spip-asc.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-spip-asc.lo `test -f 'spip-asc.c' || echo '$(srcdir)/'`spip-asc.c
+
+file_la-spmlab.lo: spmlab.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-spmlab.lo -MD -MP -MF $(DEPDIR)/file_la-spmlab.Tpo -c -o file_la-spmlab.lo `test -f 'spmlab.c' || echo '$(srcdir)/'`spmlab.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-spmlab.Tpo $(DEPDIR)/file_la-spmlab.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='spmlab.c' object='file_la-spmlab.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-spmlab.lo `test -f 'spmlab.c' || echo '$(srcdir)/'`spmlab.c
+
+file_la-spmlabf.lo: spmlabf.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-spmlabf.lo -MD -MP -MF $(DEPDIR)/file_la-spmlabf.Tpo -c -o file_la-spmlabf.lo `test -f 'spmlabf.c' || echo '$(srcdir)/'`spmlabf.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-spmlabf.Tpo $(DEPDIR)/file_la-spmlabf.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='spmlabf.c' object='file_la-spmlabf.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-spmlabf.lo `test -f 'spmlabf.c' || echo '$(srcdir)/'`spmlabf.c
+
+file_la-stmprg.lo: stmprg.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-stmprg.lo -MD -MP -MF $(DEPDIR)/file_la-stmprg.Tpo -c -o file_la-stmprg.lo `test -f 'stmprg.c' || echo '$(srcdir)/'`stmprg.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-stmprg.Tpo $(DEPDIR)/file_la-stmprg.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='stmprg.c' object='file_la-stmprg.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-stmprg.lo `test -f 'stmprg.c' || echo '$(srcdir)/'`stmprg.c
+
+file_la-stpfile.lo: stpfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-stpfile.lo -MD -MP -MF $(DEPDIR)/file_la-stpfile.Tpo -c -o file_la-stpfile.lo `test -f 'stpfile.c' || echo '$(srcdir)/'`stpfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-stpfile.Tpo $(DEPDIR)/file_la-stpfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='stpfile.c' object='file_la-stpfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-stpfile.lo `test -f 'stpfile.c' || echo '$(srcdir)/'`stpfile.c
+
+file_la-surffile.lo: surffile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-surffile.lo -MD -MP -MF $(DEPDIR)/file_la-surffile.Tpo -c -o file_la-surffile.lo `test -f 'surffile.c' || echo '$(srcdir)/'`surffile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-surffile.Tpo $(DEPDIR)/file_la-surffile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='surffile.c' object='file_la-surffile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-surffile.lo `test -f 'surffile.c' || echo '$(srcdir)/'`surffile.c
+
+file_la-tiaser.lo: tiaser.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-tiaser.lo -MD -MP -MF $(DEPDIR)/file_la-tiaser.Tpo -c -o file_la-tiaser.lo `test -f 'tiaser.c' || echo '$(srcdir)/'`tiaser.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-tiaser.Tpo $(DEPDIR)/file_la-tiaser.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tiaser.c' object='file_la-tiaser.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-tiaser.lo `test -f 'tiaser.c' || echo '$(srcdir)/'`tiaser.c
+
+file_la-tescan.lo: tescan.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-tescan.lo -MD -MP -MF $(DEPDIR)/file_la-tescan.Tpo -c -o file_la-tescan.lo `test -f 'tescan.c' || echo '$(srcdir)/'`tescan.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-tescan.Tpo $(DEPDIR)/file_la-tescan.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tescan.c' object='file_la-tescan.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-tescan.lo `test -f 'tescan.c' || echo '$(srcdir)/'`tescan.c
+
+file_la-unisoku.lo: unisoku.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-unisoku.lo -MD -MP -MF $(DEPDIR)/file_la-unisoku.Tpo -c -o file_la-unisoku.lo `test -f 'unisoku.c' || echo '$(srcdir)/'`unisoku.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-unisoku.Tpo $(DEPDIR)/file_la-unisoku.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='unisoku.c' object='file_la-unisoku.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-unisoku.lo `test -f 'unisoku.c' || echo '$(srcdir)/'`unisoku.c
+
+file_la-vtkfile.lo: vtkfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-vtkfile.lo -MD -MP -MF $(DEPDIR)/file_la-vtkfile.Tpo -c -o file_la-vtkfile.lo `test -f 'vtkfile.c' || echo '$(srcdir)/'`vtkfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-vtkfile.Tpo $(DEPDIR)/file_la-vtkfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='vtkfile.c' object='file_la-vtkfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-vtkfile.lo `test -f 'vtkfile.c' || echo '$(srcdir)/'`vtkfile.c
+
+file_la-win_stm.lo: win_stm.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-win_stm.lo -MD -MP -MF $(DEPDIR)/file_la-win_stm.Tpo -c -o file_la-win_stm.lo `test -f 'win_stm.c' || echo '$(srcdir)/'`win_stm.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-win_stm.Tpo $(DEPDIR)/file_la-win_stm.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='win_stm.c' object='file_la-win_stm.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-win_stm.lo `test -f 'win_stm.c' || echo '$(srcdir)/'`win_stm.c
+
+file_la-wipfile.lo: wipfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-wipfile.lo -MD -MP -MF $(DEPDIR)/file_la-wipfile.Tpo -c -o file_la-wipfile.lo `test -f 'wipfile.c' || echo '$(srcdir)/'`wipfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-wipfile.Tpo $(DEPDIR)/file_la-wipfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='wipfile.c' object='file_la-wipfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-wipfile.lo `test -f 'wipfile.c' || echo '$(srcdir)/'`wipfile.c
+
+file_la-witfile.lo: witfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-witfile.lo -MD -MP -MF $(DEPDIR)/file_la-witfile.Tpo -c -o file_la-witfile.lo `test -f 'witfile.c' || echo '$(srcdir)/'`witfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-witfile.Tpo $(DEPDIR)/file_la-witfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='witfile.c' object='file_la-witfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-witfile.lo `test -f 'witfile.c' || echo '$(srcdir)/'`witfile.c
+
+file_la-witec-asc.lo: witec-asc.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-witec-asc.lo -MD -MP -MF $(DEPDIR)/file_la-witec-asc.Tpo -c -o file_la-witec-asc.lo `test -f 'witec-asc.c' || echo '$(srcdir)/'`witec-asc.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-witec-asc.Tpo $(DEPDIR)/file_la-witec-asc.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='witec-asc.c' object='file_la-witec-asc.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-witec-asc.lo `test -f 'witec-asc.c' || echo '$(srcdir)/'`witec-asc.c
+
+file_la-wsffile.lo: wsffile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-wsffile.lo -MD -MP -MF $(DEPDIR)/file_la-wsffile.Tpo -c -o file_la-wsffile.lo `test -f 'wsffile.c' || echo '$(srcdir)/'`wsffile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-wsffile.Tpo $(DEPDIR)/file_la-wsffile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='wsffile.c' object='file_la-wsffile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-wsffile.lo `test -f 'wsffile.c' || echo '$(srcdir)/'`wsffile.c
+
+file_la-wsxmfile.lo: wsxmfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-wsxmfile.lo -MD -MP -MF $(DEPDIR)/file_la-wsxmfile.Tpo -c -o file_la-wsxmfile.lo `test -f 'wsxmfile.c' || echo '$(srcdir)/'`wsxmfile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-wsxmfile.Tpo $(DEPDIR)/file_la-wsxmfile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='wsxmfile.c' object='file_la-wsxmfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-wsxmfile.lo `test -f 'wsxmfile.c' || echo '$(srcdir)/'`wsxmfile.c
+
+file_la-xyzexport.lo: xyzexport.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-xyzexport.lo -MD -MP -MF $(DEPDIR)/file_la-xyzexport.Tpo -c -o file_la-xyzexport.lo `test -f 'xyzexport.c' || echo '$(srcdir)/'`xyzexport.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-xyzexport.Tpo $(DEPDIR)/file_la-xyzexport.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='xyzexport.c' object='file_la-xyzexport.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-xyzexport.lo `test -f 'xyzexport.c' || echo '$(srcdir)/'`xyzexport.c
+
+file_la-zeiss.lo: zeiss.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-zeiss.lo -MD -MP -MF $(DEPDIR)/file_la-zeiss.Tpo -c -o file_la-zeiss.lo `test -f 'zeiss.c' || echo '$(srcdir)/'`zeiss.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-zeiss.Tpo $(DEPDIR)/file_la-zeiss.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='zeiss.c' object='file_la-zeiss.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-zeiss.lo `test -f 'zeiss.c' || echo '$(srcdir)/'`zeiss.c
+
+file_la-zeisslsm.lo: zeisslsm.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-zeisslsm.lo -MD -MP -MF $(DEPDIR)/file_la-zeisslsm.Tpo -c -o file_la-zeisslsm.lo `test -f 'zeisslsm.c' || echo '$(srcdir)/'`zeisslsm.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-zeisslsm.Tpo $(DEPDIR)/file_la-zeisslsm.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='zeisslsm.c' object='file_la-zeisslsm.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-zeisslsm.lo `test -f 'zeisslsm.c' || echo '$(srcdir)/'`zeisslsm.c
+
+file_la-zemax.lo: zemax.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-zemax.lo -MD -MP -MF $(DEPDIR)/file_la-zemax.Tpo -c -o file_la-zemax.lo `test -f 'zemax.c' || echo '$(srcdir)/'`zemax.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-zemax.Tpo $(DEPDIR)/file_la-zemax.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='zemax.c' object='file_la-zemax.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-zemax.lo `test -f 'zemax.c' || echo '$(srcdir)/'`zemax.c
+
+file_la-file.lo: file.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -MT file_la-file.lo -MD -MP -MF $(DEPDIR)/file_la-file.Tpo -c -o file_la-file.lo `test -f 'file.c' || echo '$(srcdir)/'`file.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/file_la-file.Tpo $(DEPDIR)/file_la-file.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='file.c' object='file_la-file.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(file_la_CFLAGS) $(CFLAGS) -c -o file_la-file.lo `test -f 'file.c' || echo '$(srcdir)/'`file.c
+
 fitsfile_la-fitsfile.lo: fitsfile.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fitsfile_la_CFLAGS) $(CFLAGS) -MT fitsfile_la-fitsfile.lo -MD -MP -MF $(DEPDIR)/fitsfile_la-fitsfile.Tpo -c -o fitsfile_la-fitsfile.lo `test -f 'fitsfile.c' || echo '$(srcdir)/'`fitsfile.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/fitsfile_la-fitsfile.Tpo $(DEPDIR)/fitsfile_la-fitsfile.Plo
@@ -2141,13 +3424,15 @@ distdir: $(DISTFILES)
 	  fi; \
 	done
 check-am: all-am
-check: check-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
 all-am: Makefile $(LTLIBRARIES) $(HEADERS)
 installdirs:
 	for dir in "$(DESTDIR)$(filedir)"; do \
 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
-install: install-am
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
 install-exec: install-exec-am
 install-data: install-data-am
 uninstall: uninstall-am
@@ -2177,6 +3462,7 @@ distclean-generic:
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
 clean: clean-am
 
 clean-am: clean-fileLTLIBRARIES clean-generic clean-libtool \
@@ -2248,7 +3534,7 @@ ps-am:
 
 uninstall-am: uninstall-fileLTLIBRARIES
 
-.MAKE: install-am install-strip
+.MAKE: all check install install-am install-strip
 
 .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
 	clean-fileLTLIBRARIES clean-generic clean-libtool clean-local \
@@ -2268,6 +3554,9 @@ uninstall-am: uninstall-fileLTLIBRARIES
 .PRECIOUS: Makefile
 
 
+file.c: $(srcdir)/Makefile.am $(top_builddir)/config.status $(top_srcdir)/utils/gen-module-bundle.sh
+	$(SHELL) $(top_srcdir)/utils/gen-module-bundle.sh file.c $(bundlable_modules)
+
 clean-local:
 	rm -f core.* *~
 
diff --git a/modules/file/accurexii-txt.c b/modules/file/accurexii-txt.c
index ecfabbe..92e308b 100644
--- a/modules/file/accurexii-txt.c
+++ b/modules/file/accurexii-txt.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: accurexii-txt.c 16387 2014-07-10 10:41:50Z yeti-dn $
+ *  $Id: accurexii-txt.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -77,7 +77,7 @@ static GwyModuleInfo module_info = {
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, accurexii_txt)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/aistfile.c b/modules/file/aistfile.c
index c8dba97..940dca2 100644
--- a/modules/file/aistfile.c
+++ b/modules/file/aistfile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: aistfile.c 17187 2015-06-05 05:32:45Z pecold $
+ *  $Id: aistfile.c 20195 2017-08-08 06:10:25Z yeti-dn $
  *  Copyright (C) 2009 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -62,10 +62,6 @@
 
 #include "err.h"
 
-#ifdef _MSC_VER
-#define swab _swab
-#endif
-
 #define EXTENSION ".aist"
 
 typedef struct {
@@ -126,12 +122,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Imports AIST-NT data files."),
     "Yeti <yeti at gwyddion.net>",
-    "0.5",
+    "0.5.1",
     "David Nečas (Yeti)",
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, aistfile)
 
 static gboolean
 module_register(void)
@@ -624,7 +620,8 @@ read_qt_string(const guchar **p, gsize *size, gchar **value)
     }
     else if (G_BYTE_ORDER == G_LITTLE_ENDIAN) {
         utf16native = must_free = g_new(gunichar2, len/sizeof(gunichar2));
-        swab(*p, (gpointer)must_free, len);
+        gwy_memcpy_byte_swap(*p, (guint8*)must_free,
+                             2, len/sizeof(gunichar2), 1);
     }
     *value = g_utf16_to_utf8(utf16native, len/sizeof(gunichar2), NULL, NULL,
                              NULL);
diff --git a/modules/file/alicona.c b/modules/file/alicona.c
index fc1efe7..39c6bed 100644
--- a/modules/file/alicona.c
+++ b/modules/file/alicona.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: alicona.c 17187 2015-06-05 05:32:45Z pecold $
+ *  $Id: alicona.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2011 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -151,7 +151,7 @@ static GwyModuleInfo module_info = {
     "2011",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, alicona)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/ambfile.c b/modules/file/ambfile.c
index f71026c..38d1fd9 100644
--- a/modules/file/ambfile.c
+++ b/modules/file/ambfile.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: ambfile.c 18884 2016-08-26 06:59:41Z yeti-dn $
+ *  @(#) $Id: ambfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -67,8 +67,7 @@
 
 enum {
     HEADER_SIZE = 65,
-    XRES_OFFSET = 0x31,
-    YRES_OFFSET = 0x35,
+    PARAM_OFFSET = 0x31,
 };
 
 static gboolean      module_register(void);
@@ -83,12 +82,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Imports Ambios AMB data files."),
     "Yeti <yeti at gwyddion.net>",
-    "0.2",
+    "0.3",
     "David Nečas (Yeti)",
     "2011",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, ambfile)
 
 static gboolean
 module_register(void)
@@ -126,11 +125,11 @@ amb_load(const gchar *filename,
     GwyContainer *container = NULL;
     guchar *buffer = NULL;
     const guchar *p;
-    gdouble *data;
-    guint i, j;
     gsize size = 0;
     GError *err = NULL;
     guint xres, yres;
+    gdouble xreal;
+    G_GNUC_UNUSED gdouble q;
     GwyDataField *dfield;
 
     if (!gwy_file_get_contents(filename, &buffer, &size, &err)) {
@@ -143,9 +142,8 @@ amb_load(const gchar *filename,
     }
 
     /* The two bytes before are usually zeroes */
-    p = buffer + XRES_OFFSET;
+    p = buffer + PARAM_OFFSET;
     xres = gwy_get_guint32_le(&p);
-    p = buffer + YRES_OFFSET;
     yres = gwy_get_guint32_le(&p);
     gwy_debug("xres: %u yres: %u", xres, yres);
     /* The four bytes after might be a float, then there are four more bytes. */
@@ -154,15 +152,16 @@ amb_load(const gchar *filename,
     if (err_SIZE_MISMATCH(error, 4*xres*yres + HEADER_SIZE, size, TRUE))
         goto fail;
 
-    dfield = gwy_data_field_new(xres, yres, 1.0, 1.0*yres/xres,
-                                FALSE);
-    data = gwy_data_field_get_data(dfield);
-    p = buffer + HEADER_SIZE;
-    for (i = 0; i < yres; i++) {
-        for (j = 0; j < xres; j++)
-            data[i*xres + j] = gwy_get_gfloat_le(&p);
-    }
+    xreal = gwy_get_gfloat_le(&p) * 1e-3;
+    /* FIXME: I do not know what the second number means.  It does not seem to
+     * be z-scale because z scaling does not change when the number changes. */
+    q = gwy_get_gfloat_le(&p);
+    gwy_debug("xreal: %g, q: %g", xreal, q);
 
+    dfield = gwy_data_field_new(xres, yres, xreal, xreal, FALSE);
+    gwy_convert_raw_data(buffer + HEADER_SIZE, xres*yres, 1,
+                         GWY_RAW_DATA_FLOAT, GWY_BYTE_ORDER_LITTLE_ENDIAN,
+                         gwy_data_field_get_data(dfield), 1e-3, 0.0);
     gwy_si_unit_set_from_string(gwy_data_field_get_si_unit_xy(dfield), "m");
     gwy_si_unit_set_from_string(gwy_data_field_get_si_unit_z(dfield), "m");
 
@@ -170,6 +169,7 @@ amb_load(const gchar *filename,
     gwy_container_set_object_by_name(container, "/0/data", dfield);
     gwy_container_set_string_by_name(container, "/0/data/title",
                                      g_strdup("Topography"));
+    gwy_app_channel_check_nonsquare(container, 0);
     g_object_unref(dfield);
 
     gwy_file_channel_import_log_add(container, 0, NULL, filename);
diff --git a/modules/file/anfatec.c b/modules/file/anfatec.c
index 38f1f1a..65fe090 100644
--- a/modules/file/anfatec.c
+++ b/modules/file/anfatec.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: anfatec.c 19071 2016-10-14 09:02:41Z yeti-dn $
+ *  $Id: anfatec.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2010 David Necas (Yeti)
  *  E-mail: yeti at gwyddion.net
  *
@@ -91,7 +91,7 @@ static GwyModuleInfo module_info = {
     "2010",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, anfatec)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/apedaxfile.c b/modules/file/apedaxfile.c
index 1144b66..c21a0ea 100644
--- a/modules/file/apedaxfile.c
+++ b/modules/file/apedaxfile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: apedaxfile.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: apedaxfile.c 19549 2017-03-27 08:34:42Z yeti-dn $
  *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -213,31 +213,33 @@ static const APEXmlField dax_stm[] = {
 
 /*Prototypes*/
 
-static gboolean      module_register               (void);
-static gint          apedax_detect                 (const GwyFileDetectInfo *fileinfo,
-                                                    gboolean only_name);
-static GwyContainer* apedax_load                   (const gchar *filename,
-                                                    GwyRunType mode,
-                                                    GError **error);
-static GwyContainer* apedax_get_meta               (guchar *scan_xml_content,
-                                                    gsize content_size,
-                                                    gboolean apdt_file);
-static gchar*        apedax_get_xml_node_as_string (xmlDocPtr doc,
-                                                    const gchar *node_xpath);
-static GwyDataField* apedax_get_data_field         (GwyZipFile uFile,
-                                                    const gchar *chFileName,
-                                                    const APEScanSize *scan_size,
-                                                    gchar *zUnit,
-                                                    gdouble scale,
-                                                    GError **error);
-static gboolean      apedax_get_channels_data      (GwyZipFile uFile,
-                                                    guchar *scan_xml_content,
-                                                    gsize content_size,
-                                                    const gchar *filename,
-                                                    GwyContainer *container,
-                                                    GwyContainer *meta,
-                                                    const APEScanSize *scan_size,
-                                                    GError **error);
+static gboolean      module_register              (void);
+static gint          apedax_detect                (const GwyFileDetectInfo *fileinfo,
+                                                   gboolean only_name);
+static gboolean      apedax_is_plausible_file     (const guchar *filehead,
+                                                   gsize len);
+static GwyContainer* apedax_load                  (const gchar *filename,
+                                                   GwyRunType mode,
+                                                   GError **error);
+static GwyContainer* apedax_get_meta              (guchar *scan_xml_content,
+                                                   gsize content_size,
+                                                   gboolean apdt_file);
+static gchar*        apedax_get_xml_node_as_string(xmlDocPtr doc,
+                                                   const gchar *node_xpath);
+static GwyDataField* apedax_get_data_field        (GwyZipFile uFile,
+                                                   const gchar *chFileName,
+                                                   const APEScanSize *scan_size,
+                                                   gchar *zUnit,
+                                                   gdouble scale,
+                                                   GError **error);
+static gboolean      apedax_get_channels_data     (GwyZipFile uFile,
+                                                   guchar *scan_xml_content,
+                                                   gsize content_size,
+                                                   const gchar *filename,
+                                                   GwyContainer *container,
+                                                   GwyContainer *meta,
+                                                   const APEScanSize *scan_size,
+                                                   GError **error);
 
 static gboolean     apedax_is_xml_valid            (guchar *scan_xml_content,
                                                     gsize content_size);
@@ -260,7 +262,7 @@ static GwyModuleInfo module_info = {
     "Andrea Cervesato <infos at aperesearch.com>, "
         "Gianfranco Gallizia <infos at aperesearch.com>, "
         "Samo Ziberna <infos at aperesearch.com>",
-    "0.7",
+    "0.8",
     "A.P.E. Research srl",
     "2015"
 };
@@ -306,6 +308,11 @@ apedax_detect(const GwyFileDetectInfo *fileinfo,
     else
         return 0;
 
+    /* Weed out surely non-DAX files before calling possibly expensive ZIP
+     * functions. */
+    if (!apedax_is_plausible_file(fileinfo->head, fileinfo->buffer_len))
+        return 0;
+
     gwy_debug("Opening the file with MiniZIP");
     uFile = gwyzip_open(fileinfo->name);
 
@@ -334,6 +341,23 @@ apedax_detect(const GwyFileDetectInfo *fileinfo,
     return score;
 }
 
+/* Try to find the name of an expected file somewhere. */
+static gboolean
+apedax_is_plausible_file(const guchar *filehead, gsize len)
+{
+    static const gchar *filenames[] = {
+        ".bin", "scan.xml",
+    };
+    guint i;
+
+    for (i = 0; i < G_N_ELEMENTS(filenames); i++) {
+        if (gwy_memmem(filehead, len, filenames[i], strlen(filenames[i])))
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
 /*Load function*/
 
 static GwyContainer*
diff --git a/modules/file/apefile.c b/modules/file/apefile.c
index ec936cf..97ae8e0 100644
--- a/modules/file/apefile.c
+++ b/modules/file/apefile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: apefile.c 17817 2015-12-09 21:35:07Z yeti-dn $
+ *  $Id: apefile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -200,7 +200,7 @@ static GwyModuleInfo module_info = {
     "2005",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, apefile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/asciiexport.c b/modules/file/asciiexport.c
index 99e2b51..bee4e08 100644
--- a/modules/file/asciiexport.c
+++ b/modules/file/asciiexport.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: asciiexport.c 17719 2015-11-06 08:46:13Z pecold $
+ *  @(#) $Id: asciiexport.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003,2007 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -79,7 +79,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, asciiexport)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/assing-afm.c b/modules/file/assing-afm.c
index ae3ff39..0129ab0 100644
--- a/modules/file/assing-afm.c
+++ b/modules/file/assing-afm.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: assing-afm.c 18007 2016-01-06 23:14:44Z yeti-dn $
+ *  @(#) $Id: assing-afm.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -76,7 +76,7 @@ static GwyModuleInfo module_info = {
     "2005",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, assing_afm)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/attocube.c b/modules/file/attocube.c
index 56ada60..98549a3 100644
--- a/modules/file/attocube.c
+++ b/modules/file/attocube.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: attocube.c 17718 2015-11-06 08:04:04Z pecold $
+ *  $Id: attocube.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2009 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -88,7 +88,7 @@ static GwyModuleInfo module_info = {
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, attocube)
 
 static gboolean
 module_register(void)
@@ -271,6 +271,12 @@ asc_load(const gchar *filename,
     if ((value = g_hash_table_lookup(hash, "scanspeed")))
         gwy_container_set_string_by_name(meta, "Scan Speed", g_strdup(value));
 
+    if ((value = g_hash_table_lookup(hash, "x-offset")))
+        gwy_container_set_string_by_name(meta, "X Offset", g_strdup(value));
+
+    if ((value = g_hash_table_lookup(hash, "y-offset")))
+        gwy_container_set_string_by_name(meta, "Y Offset", g_strdup(value));
+
     gwy_file_channel_import_log_add(container, 0, NULL, filename);
 
 fail:
diff --git a/modules/file/bcrfile.c b/modules/file/bcrfile.c
index b2e968b..74b0916 100644
--- a/modules/file/bcrfile.c
+++ b/modules/file/bcrfile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: bcrfile.c 19216 2016-11-09 10:39:06Z yeti-dn $
+ *  $Id: bcrfile.c 20196 2017-08-08 06:13:38Z yeti-dn $
  *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -76,11 +76,6 @@
 
 #include "err.h"
 
-#ifdef _MSC_VER
-#define swab _swab
-#endif
-
-
 /* in characters, not bytes */
 #define HEADER_SIZE 2048
 
@@ -145,12 +140,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Imports Image Metrology BCR data files."),
     "Yeti <yeti at gwyddion.net>",
-    "0.15",
+    "0.16",
     "David Nečas (Yeti) & Petr Klapetek",
     "2005",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, bcrfile)
 
 static gboolean
 module_register(void)
@@ -228,7 +223,7 @@ bcrfile_load(const gchar *filename,
 #endif
 #if (G_BYTE_ORDER == G_BIG_ENDIAN)
         s = g_new(gunichar2, HEADER_SIZE);
-        swab(buffer, s, header_size);
+        gwy_memcpy_byte_swap(buffer, (guint8*)s, 2, HEADER_SIZE, 1);
 #endif
         header = g_utf16_to_utf8(s, HEADER_SIZE, 0, 0, &err);
         g_free(s);
diff --git a/modules/file/burleigh.c b/modules/file/burleigh.c
index afcd722..f36c643 100644
--- a/modules/file/burleigh.c
+++ b/modules/file/burleigh.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: burleigh.c 19071 2016-10-14 09:02:41Z yeti-dn $
+ *  @(#) $Id: burleigh.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2006 David Necas (Yeti), Petr Klapetek, Hans-Peter Doerr.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net,
  *          doerr at cip.physik.uni-freiburg.de.
@@ -131,7 +131,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, burleigh)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/burleigh_bii.c b/modules/file/burleigh_bii.c
index de16780..796a6af 100644
--- a/modules/file/burleigh_bii.c
+++ b/modules/file/burleigh_bii.c
@@ -79,7 +79,7 @@ static GwyModuleInfo module_info = {
     "2008",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, burleigh_bii)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/burleigh_exp.c b/modules/file/burleigh_exp.c
index 9274d76..903d43d 100644
--- a/modules/file/burleigh_exp.c
+++ b/modules/file/burleigh_exp.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: burleigh_exp.c 19216 2016-11-09 10:39:06Z yeti-dn $
+ *  @(#) $Id: burleigh_exp.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2007 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -92,7 +92,7 @@ static GwyModuleInfo module_info = {
     "2007",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, burleigh_exp)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/codevfile.c b/modules/file/codevfile.c
index f2efd95..4a329ca 100644
--- a/modules/file/codevfile.c
+++ b/modules/file/codevfile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: codevfile.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: codevfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2011 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -75,7 +75,7 @@ static GwyModuleInfo module_info = {
     "2011",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, codevfile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/csmfile.c b/modules/file/csmfile.c
index 88c667f..9c26e14 100644
--- a/modules/file/csmfile.c
+++ b/modules/file/csmfile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: csmfile.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: csmfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2011 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -87,7 +87,7 @@ static GwyModuleInfo module_info = {
     "2011",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, csmfile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/dektakvca.c b/modules/file/dektakvca.c
new file mode 100644
index 0000000..1f1a691
--- /dev/null
+++ b/modules/file/dektakvca.c
@@ -0,0 +1,1037 @@
+/*
+ *  $Id: dektakvca.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2017 David Necas (Yeti).
+ *  E-mail: yeti at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * [FILE-MAGIC-FREEDESKTOP]
+ * <mime-type type="application/x-dektak-opdx">
+ *   <comment>Dektak OPDx profilometry data</comment>
+ *   <magic priority="80">
+ *     <match type="string" offset="0" value="VCA DATA\x01\x00\x00\x55"/>
+ *   </magic>
+ * </mime-type>
+ **/
+
+/**
+ * [FILE-MAGIC-FILEMAGIC]
+ * # Dektak (binary serialisation)
+ * 0 string VCA\ DATA\x01\x00\x00\x55 Dektak OPDx profilometry data
+ **/
+
+/**
+ * [FILE-MAGIC-USERGUIDE]
+ * Dektak OPDx profilometry data
+ * .OPDx
+ * Read
+ **/
+
+#include "config.h"
+#include <string.h>
+#include <stdlib.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwyutils.h>
+#include <libgwyddion/gwymath.h>
+#include <libprocess/datafield.h>
+#include <libgwymodule/gwymodule-file.h>
+#include <app/data-browser.h>
+#include <app/gwymoduleutils-file.h>
+
+#include "err.h"
+#include "get.h"
+
+#define MAGIC "VCA DATA\x01\x00\x00\x55"
+#define MAGIC_SIZE (sizeof(MAGIC)-1)
+
+#define EXTENSION ".OPDx"
+
+#define MEAS_SETTINGS "/MetaData/MeasurementSettings"
+#define RAW_1D_DATA   "/1D_Data/Raw"
+#define ANY_2D_DATA   "/2D_Data/"
+
+enum {
+    TIMESTAMP_SIZE = 9,
+    UNIT_EXTRA = 12,
+    DOUBLE_ARRAY_EXTRA = 5,
+};
+
+/* Int16s are probably either 0x08, 0x09 or 0x04, 0x05 */
+typedef enum {
+    DEKTAK_MATRIX       = 0x00, /* Too lazy to assign an actual type id? */
+    DEKTAK_BOOLEAN      = 0x01, /* Takes value 0 and 1 */
+    DEKTAK_SINT32       = 0x06,
+    DEKTAK_UINT32       = 0x07,
+    DEKTAK_SINT64       = 0x0a,
+    DEKTAK_UINT64       = 0x0b,
+    DEKTAK_FLOAT        = 0x0c, /* Single precision float */
+    DEKTAK_DOUBLE       = 0x0d, /* Double precision float */
+    DEKTAK_TYPE_ID      = 0x0e, /* Compound type holding some kind of type id */
+    DEKTAK_STRING       = 0x12, /* Free-form string value */
+    DEKTAK_QUANTITY     = 0x13, /* Value with units (compound type) */
+    DEKTAK_TIME_STAMP   = 0x15, /* Datetime (string/9-byte binary) */
+    DEKTAK_UNITS        = 0x18, /* Units (compound type) */
+    DEKTAK_DOUBLE_ARRAY = 0x40, /* Raw data array, in XML Base64-encoded */
+    DEKTAK_STRING_LIST  = 0x42, /* List of Str */
+    DEKTAK_RAW_DATA     = 0x46, /* Parent/wrapper tag of raw data */
+    DEKTAK_RAW_DATA_2D  = 0x47, /* Parent/wrapper tag of raw data */
+    DEKTAK_POS_RAW_DATA = 0x7c, /* Base64-encoded positions, not sure how
+                                   it differs from 64 */
+    DEKTAK_CONTAINER    = 0x7d, /* General nested data structure */
+    DEKTAK_TERMINATOR   = 0x7f, /* Always the last item.
+                                   Usually a couple of 0xff bytes inside. */
+} DektakTypeID;
+
+/* Points directly to the memory buffer.  We use it for all kind of blocks
+ * in the file: containers, raw data regions, strings and also the file itself.
+ */
+typedef struct {
+    const guchar *p;
+    guint32 len;
+} DektakBuf;
+
+/* Quantities have name, symbol and value (in that units presumably).
+ * Units have name, symbol, conversion factor *to* (not from) the unit and
+ * then some stuff.  Possibly boolean flags? */
+typedef struct {
+    gdouble value;
+    DektakBuf name;
+    DektakBuf symbol;
+    guchar extra[UNIT_EXTRA];
+} DektakQuantUnit;
+
+typedef struct {
+    DektakQuantUnit unit;
+    gdouble divisor;
+    guint64 count;
+    DektakBuf buf;
+} DektakRawPos1D;
+
+typedef struct {
+    DektakQuantUnit unitx;
+    DektakQuantUnit unity;
+    gdouble divisorx;
+    gdouble divisory;
+} DektakRawPos2D;
+
+typedef struct {
+    DektakBuf another_name;
+    guint32 some_int;
+    guint32 xres;
+    guint32 yres;
+    DektakBuf buf;
+} DektakMatrix;
+
+typedef union {
+    gboolean b;
+    guint32 ui;
+    gint32 si;
+    guint64 uq;
+    gint64 sq;
+    gdouble d;
+    guint8 timestamp[TIMESTAMP_SIZE];  /* Format unknown. */
+    DektakBuf buf;
+    DektakQuantUnit qun;
+    DektakRawPos1D rawpos1d;
+    DektakRawPos2D rawpos2d;
+    DektakMatrix matrix;
+    GArray *strlist;                   /* Contains heap-allocated data. */
+} DektakItemData;
+
+typedef struct {
+    DektakBuf typename;
+    guint typeid;
+    DektakItemData data;
+} DektakItem;
+
+static gboolean          module_register (void);
+static gint              dektakvca_detect(const GwyFileDetectInfo *fileinfo,
+                                          gboolean only_name);
+static GwyContainer*     dektakvca_load  (const gchar *filename,
+                                          GwyRunType mode,
+                                          GError **error);
+static gboolean          find_1d_data    (GHashTable *hash,
+                                          GwyContainer *container,
+                                          GString *str,
+                                          GError **error);
+static gboolean          find_2d_data    (GHashTable *hash,
+                                          GwyContainer *container,
+                                          GString *str,
+                                          GError **error);
+static GwyContainer*     create_meta     (GHashTable *hash);
+static GwySIUnit*        find_quantity   (GHashTable *hash,
+                                          const gchar *key,
+                                          GString *str,
+                                          gdouble *value,
+                                          GError **error);
+static const DektakItem* find_item       (GHashTable *hash,
+                                          const gchar *path,
+                                          guint expected_type,
+                                          gboolean fail_if_not_found,
+                                          GError **error);
+static gboolean          read_item       (const DektakBuf *buf,
+                                          guint32 *pos,
+                                          GHashTable *hash,
+                                          GString *path,
+                                          GError **error);
+static void              dektak_item_free(gpointer p);
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION,
+    &module_register,
+    N_("Imports Dektak OPDx data files."),
+    "Yeti <yeti at gwyddion.net>",
+    "0.1",
+    "David Nečas (Yeti)",
+    "2017",
+};
+
+GWY_MODULE_QUERY2(module_info, dektakvca)
+
+static gboolean
+module_register(void)
+{
+    gwy_file_func_register("dektakvca",
+                           N_("Dektak OPDx data files (.OPDx)"),
+                           (GwyFileDetectFunc)&dektakvca_detect,
+                           (GwyFileLoadFunc)&dektakvca_load,
+                           NULL,
+                           NULL);
+
+    return TRUE;
+}
+
+static gint
+dektakvca_detect(const GwyFileDetectInfo *fileinfo,
+                 gboolean only_name)
+{
+    const gchar *head = fileinfo->head;
+
+    if (only_name)
+        return g_str_has_suffix(fileinfo->name_lowercase, EXTENSION) ? 20 : 0;
+
+    if (fileinfo->buffer_len <= MAGIC_SIZE
+        || memcmp(head, MAGIC, MAGIC_SIZE) != 0)
+        return 0;
+
+    return 100;
+}
+
+static GwyContainer*
+dektakvca_load(const gchar *filename,
+               G_GNUC_UNUSED GwyRunType mode,
+               GError **error)
+{
+    GwyContainer *container = NULL;
+    guchar *buffer = NULL;
+    gsize size = 0;
+    GError *err = NULL;
+    GHashTable *hash;
+    GString *str;
+    DektakBuf buf;
+    guint pos;
+
+    if (!gwy_file_get_contents(filename, &buffer, &size, &err)) {
+        err_GET_FILE_CONTENTS(error, &err);
+        return NULL;
+    }
+    if (size < MAGIC_SIZE || memcmp(buffer, MAGIC, MAGIC_SIZE) != 0) {
+        gwy_file_abandon_contents(buffer, size, NULL);
+        err_FILE_TYPE(error, "Dektak OPDx");
+        return NULL;
+    }
+
+    hash = g_hash_table_new_full(g_str_hash, g_str_equal,
+                                 g_free, dektak_item_free);
+    str = g_string_new(NULL);
+    buf.len = size;
+    buf.p = buffer;
+
+    pos = MAGIC_SIZE;
+    while (pos < size) {
+       if (!read_item(&buf, &pos, hash, str, error))
+           goto fail;
+    }
+
+    /* Many things have two values, one in measurement settings and the other
+     * in the data.  The value in data seems to be the actual one, the value
+     * in settings is nominal? */
+    container = gwy_container_new();
+    if (!find_1d_data(hash, container, str, error)) {
+        GWY_OBJECT_UNREF(container);
+        goto fail;
+    }
+
+    if (!find_2d_data(hash, container, str, error)) {
+        GWY_OBJECT_UNREF(container);
+        goto fail;
+    }
+
+    if (!gwy_container_get_n_items(container)) {
+        err_NO_DATA(error);
+        GWY_OBJECT_UNREF(container);
+    }
+
+
+fail:
+    g_hash_table_destroy(hash);
+    g_string_free(str, TRUE);
+    gwy_file_abandon_contents(buffer, size, NULL);
+
+    return container;
+}
+
+/* Only returns FALSE when @error is set.  When it does not seem there are
+ * 1D data it returns TRUE; must check if @container has anyhthing in it
+ * later. */
+static gboolean
+find_1d_data(GHashTable *hash, GwyContainer *container, GString *str,
+             GError **error)
+{
+    GwyGraphModel *gmodel;
+    GwyGraphCurveModel *gcmodel;
+    const DektakItem *item;
+    GwySIUnit *xunit = NULL, *yunit = NULL;
+    const guchar *rawydata, *rawxdata = NULL;
+    gdouble *xdata, *ydata;
+    guint i, res;
+    gdouble real, qy, qx;
+    gboolean ok = FALSE;
+
+    /* If there are SamplesToLog for 1D data, expect 1D data to be present. */
+    if (!(item = find_item(hash, MEAS_SETTINGS "/SamplesToLog",
+                           DEKTAK_UINT64, FALSE, NULL)))
+        return TRUE;
+
+    res = item->data.uq;
+    gwy_debug("res %u", res);
+
+    if (!(xunit = find_quantity(hash, MEAS_SETTINGS "/ScanLength", str,
+                                &real, error)))
+        goto fail;
+    gwy_debug("real %g", real);
+
+    if (!(yunit = find_quantity(hash, RAW_1D_DATA "/DataScale", str,
+                                &qy, error)))
+        goto fail;
+    gwy_debug("qy %g", qy);
+
+    /* Values -- they must be present. */
+    if (!(item = find_item(hash, RAW_1D_DATA "/Array",
+                           DEKTAK_DOUBLE_ARRAY, TRUE, NULL))) {
+        err_NO_DATA(error);
+        goto fail;
+    }
+    if (err_SIZE_MISMATCH(error,
+                          DOUBLE_ARRAY_EXTRA + res*sizeof(gdouble),
+                          item->data.buf.len,
+                          TRUE))
+        goto fail;
+    rawydata = item->data.buf.p + 5;
+
+    /* Positions -- optional. */
+    if ((item = find_item(hash, RAW_1D_DATA "/PositionFunction",
+                          DEKTAK_POS_RAW_DATA, TRUE, NULL))) {
+        if (err_SIZE_MISMATCH(error,
+                              res*sizeof(gdouble), item->data.rawpos1d.buf.len,
+                              TRUE))
+            goto fail;
+        rawxdata = item->data.rawpos1d.buf.p;
+        qx = 1.0/item->data.rawpos1d.unit.value;
+    }
+
+    /* Use DataKind as the title. */
+    g_string_truncate(str, 0);
+    if ((item = find_item(hash, "/MetaData/DataKind",
+                          DEKTAK_STRING, FALSE, NULL)))
+        g_string_append_len(str, item->data.buf.p, item->data.buf.len);
+    else
+        g_string_append(str, "Curve");
+
+    /* Create the graph. */
+    xdata = g_new(gdouble, res);
+    if (rawxdata) {
+        gwy_convert_raw_data(rawxdata, res, 1,
+                             GWY_RAW_DATA_DOUBLE, GWY_BYTE_ORDER_LITTLE_ENDIAN,
+                             xdata, qx, 0.0);
+    }
+    else {
+        for (i = 0; i < res; i++)
+            xdata[i] = real*i/(res - 1.0);
+    }
+
+    ydata = g_new(gdouble, res);
+    gwy_convert_raw_data(rawydata, res, 1,
+                         GWY_RAW_DATA_DOUBLE, GWY_BYTE_ORDER_LITTLE_ENDIAN,
+                         ydata, qy, 0.0);
+
+    gmodel = gwy_graph_model_new();
+    gcmodel = gwy_graph_curve_model_new();
+    g_object_set(gcmodel,
+                 "mode", GWY_GRAPH_CURVE_LINE,
+                 "color", gwy_graph_get_preset_color(0),
+                 "description", str->str,
+                 NULL);
+    gwy_graph_curve_model_set_data(gcmodel, xdata, ydata, res);
+    gwy_graph_model_add_curve(gmodel, gcmodel);
+    g_object_unref(gcmodel);
+    g_free(xdata);
+    g_free(ydata);
+
+    g_object_set(gmodel,
+                 "si-unit-x", xunit,
+                 "si-unit-y", yunit,
+                 "title", str->str,
+                 NULL);
+    gwy_container_set_object(container,
+                             gwy_app_get_graph_key_for_id(0), gmodel);
+    g_object_unref(gmodel);
+
+    ok = TRUE;
+
+fail:
+    GWY_OBJECT_UNREF(xunit);
+    GWY_OBJECT_UNREF(yunit);
+
+    return ok;
+}
+
+static void
+find_2d_data_matrix(gpointer key, gpointer value, gpointer user_data)
+{
+    const gchar *name = (const gchar*)key;
+    const DektakItem *item = (const DektakItem*)value;
+    GPtrArray *channels = (GPtrArray*)user_data;
+    const gchar *s;
+
+    if (item->typeid != DEKTAK_MATRIX)
+        return;
+    if (strncmp(name, ANY_2D_DATA, 9) != 0)
+        return;
+    if (!(s = strchr(name + 9, '/')))
+        return;
+    if (!gwy_strequal(s + 1, "Matrix"))
+        return;
+
+    g_ptr_array_add(channels, g_strndup(name + 9, s - name - 9));
+    gwy_debug("found 2D channel %s",
+              (gchar*)g_ptr_array_index(channels, channels->len-1));
+}
+
+static gboolean
+find_2d_data(GHashTable *hash, GwyContainer *container, GString *str,
+             GError **error)
+{
+    GwySIUnit *xunit = NULL, *yunit = NULL, *zunit = NULL;
+    GwyContainer *meta;
+    GPtrArray *channels;
+    GwyDataField *dfield, *mask;
+    const DektakItem *item;
+    gboolean ok = FALSE;
+    const guchar *rawdata;
+    guint i, len, xres, yres;
+    gdouble xreal, yreal, q = 1.0;
+    GString *s;
+    GQuark quark;
+
+    channels = g_ptr_array_new();
+    g_hash_table_foreach(hash, find_2d_data_matrix, channels);
+    if (!channels->len) {
+        g_ptr_array_free(channels, TRUE);
+        return TRUE;
+    }
+
+    s = g_string_new(NULL);
+    for (i = 0; i < channels->len; i++) {
+        g_string_assign(str, ANY_2D_DATA);
+        g_string_append(str, (gchar*)g_ptr_array_index(channels, i));
+        len = str->len;
+
+        g_string_append(str, "/Matrix");
+        item = find_item(hash, str->str, DEKTAK_MATRIX, TRUE, NULL);
+        /* Must correspond to what find_2d_data_matrix() found. */
+        g_return_val_if_fail(item, FALSE);
+
+        rawdata = item->data.matrix.buf.p;
+        xres = item->data.matrix.xres;
+        yres = item->data.matrix.yres;
+        if (err_DIMENSION(error, xres) || err_DIMENSION(error, yres))
+            goto fail;
+
+        g_string_truncate(str, len);
+        g_string_append(str, "/Dimension1Extent");
+        if (!(yunit = find_quantity(hash, str->str, s, &yreal, error)))
+            goto fail;
+        gwy_debug("yreal %g", yreal);
+
+        g_string_truncate(str, len);
+        g_string_append(str, "/Dimension2Extent");
+        if (!(xunit = find_quantity(hash, str->str, s, &xreal, error)))
+            goto fail;
+        gwy_debug("xreal %g", xreal);
+
+        g_string_truncate(str, len);
+        g_string_append(str, "/DataScale");
+        if (!(zunit = find_quantity(hash, str->str, s, &q, error)))
+            goto fail;
+        gwy_debug("q %g", q);
+
+        if (!gwy_si_unit_equal(xunit, yunit)) {
+            g_warning("Different x and y units are not representable, "
+                      "ignoring y.");
+        }
+
+        dfield = gwy_data_field_new(xres, yres, xreal, yreal, FALSE);
+        gwy_data_field_set_si_unit_xy(dfield, xunit);
+        gwy_data_field_set_si_unit_z(dfield, zunit);
+
+        gwy_convert_raw_data(rawdata, xres*yres, 1,
+                             GWY_RAW_DATA_FLOAT, GWY_BYTE_ORDER_LITTLE_ENDIAN,
+                             gwy_data_field_get_data(dfield), q, 0.0);
+
+        quark = gwy_app_get_data_key_for_id(i);
+        gwy_container_set_object(container, quark, dfield);
+        if ((mask = gwy_app_channel_mask_of_nans(dfield, TRUE))) {
+            quark = gwy_app_get_mask_key_for_id(i);
+            gwy_container_set_object(container, quark, mask);
+            g_object_unref(mask);
+        }
+        g_object_unref(dfield);
+
+        quark = gwy_app_get_data_title_key_for_id(i);
+        gwy_container_set_const_string(container, quark,
+                                       g_ptr_array_index(channels, i));
+
+        GWY_OBJECT_UNREF(xunit);
+        GWY_OBJECT_UNREF(yunit);
+        GWY_OBJECT_UNREF(zunit);
+
+        if ((meta = create_meta(hash))) {
+            quark = gwy_app_get_data_meta_key_for_id(i);
+            gwy_container_set_object(container, quark, meta);
+            g_object_unref(meta);
+        }
+    }
+    ok = TRUE;
+
+fail:
+    GWY_OBJECT_UNREF(xunit);
+    GWY_OBJECT_UNREF(yunit);
+    GWY_OBJECT_UNREF(zunit);
+    g_string_free(s, TRUE);
+    for (i = 0; i < channels->len; i++)
+        g_free(g_ptr_array_index(channels, i));
+    g_ptr_array_free(channels, TRUE);
+    return ok;
+}
+
+static void
+create_meta_item(gpointer key, gpointer value, gpointer user_data)
+{
+    const gchar *name = (const gchar*)key;
+    const DektakItem *item = (const DektakItem*)value;
+    GwyContainer *meta = (GwyContainer*)user_data;
+    gchar *metakey, *metavalue;
+
+    if (!g_str_has_prefix(name, "/MetaData/"))
+        return;
+
+    if (item->typeid == DEKTAK_BOOLEAN)
+        metavalue = g_strdup(item->data.b ? "True" : "False");
+    else if (item->typeid == DEKTAK_SINT32)
+        metavalue = g_strdup_printf("%d", item->data.si);
+    else if (item->typeid == DEKTAK_UINT32)
+        metavalue = g_strdup_printf("%u", item->data.ui);
+    else if (item->typeid == DEKTAK_SINT64)
+        metavalue = g_strdup_printf("%" G_GINT64_FORMAT, item->data.sq);
+    else if (item->typeid == DEKTAK_UINT64)
+        metavalue = g_strdup_printf("%" G_GUINT64_FORMAT, item->data.uq);
+    else if (item->typeid == DEKTAK_DOUBLE || item->typeid == DEKTAK_FLOAT)
+        metavalue = g_strdup_printf("%g", item->data.d);
+    else if (item->typeid == DEKTAK_STRING)
+        metavalue = g_strndup(item->data.buf.p, item->data.buf.len);
+    else if (item->typeid == DEKTAK_QUANTITY) {
+        metavalue = g_strdup_printf("%g %.*s", item->data.qun.value,
+                                    item->data.qun.symbol.len,
+                                    item->data.qun.symbol.p);
+    }
+    else if (item->typeid == DEKTAK_STRING_LIST) {
+        GArray *strlist = item->data.strlist;
+        const DektakBuf *str;
+        guint i, len = 0;
+
+        for (i = 0; i < strlist->len; i++) {
+            str = &g_array_index(strlist, DektakBuf, i);
+            len += str->len + 1;
+        }
+
+        if (len) {
+            metavalue = g_new(gchar, len);
+            len = 0;
+            for (i = 0; i < strlist->len; i++) {
+                str = &g_array_index(strlist, DektakBuf, i);
+                memcpy(metavalue + len, str->p, str->len);
+                len += str->len;
+                metavalue[len] = ' ';
+                len++;
+            }
+            metavalue[len-1] = '\0';
+        }
+        else
+            metavalue = g_strdup("");
+    }
+    else {
+        gwy_debug("unhandled meta %02x %s\n", item->typeid, name);
+        return;
+    }
+
+    metakey = gwy_strreplace(name + 10, "/", "::", (gsize)-1);
+    gwy_container_set_string_by_name(meta, metakey, (const guchar*)metavalue);
+    g_free(metakey);
+}
+
+static GwyContainer*
+create_meta(GHashTable *hash)
+{
+    GwyContainer *meta = gwy_container_new();
+
+    g_hash_table_foreach(hash, create_meta_item, meta);
+    if (gwy_container_get_n_items(meta))
+        return meta;
+
+    g_object_unref(meta);
+    return NULL;
+}
+
+static GwySIUnit*
+find_quantity(GHashTable *hash, const gchar *key, GString *str,
+              gdouble *value, GError **error)
+{
+    const DektakItem *item;
+    GwySIUnit *unit;
+    gint power10;
+
+    if (!(item = find_item(hash, key, DEKTAK_QUANTITY, TRUE, error)))
+        return NULL;
+    g_string_truncate(str, 0);
+    g_string_append_len(str,
+                        item->data.qun.symbol.p, item->data.qun.symbol.len);
+    unit = gwy_si_unit_new_parse(str->str, &power10);
+    *value = item->data.qun.value * pow10(power10);
+
+    return unit;
+}
+
+static const DektakItem*
+find_item(GHashTable *hash, const gchar *path, guint expected_type,
+          gboolean fail_if_not_found, GError **error)
+{
+    const DektakItem *item = g_hash_table_lookup(hash, path);
+
+    if (!item) {
+        if (fail_if_not_found)
+            err_MISSING_FIELD(error, path);
+        return NULL;
+    }
+    if (expected_type && item->typeid != expected_type) {
+        if (fail_if_not_found) {
+            g_set_error(error, GWY_MODULE_FILE_ERROR,
+                        GWY_MODULE_FILE_ERROR_DATA,
+                        _("Item `%s' has unexpected type %u instead of %u."),
+                        path, item->typeid, expected_type);
+        }
+        return NULL;
+    }
+    return item;
+}
+
+static gboolean
+read_with_check(const DektakBuf *buf, guint32 *pos, guint32 nbytes, void *out)
+{
+    if (buf->len < nbytes || *pos > buf->len - nbytes)
+        return FALSE;
+    memcpy(out, buf->p + *pos, nbytes);
+    *pos += nbytes;
+    return TRUE;
+}
+
+static gboolean
+read_int16(const DektakBuf *buf, guint32 *pos, guint16 *i)
+{
+    if (read_with_check(buf, pos, sizeof(guint16), i)) {
+        *i = GUINT16_FROM_LE(*i);
+        return TRUE;
+    }
+    return FALSE;
+}
+
+static gboolean
+read_int32(const DektakBuf *buf, guint32 *pos, guint32 *i)
+{
+    if (read_with_check(buf, pos, sizeof(guint32), i)) {
+        *i = GUINT32_FROM_LE(*i);
+        return TRUE;
+    }
+    return FALSE;
+}
+
+static gboolean
+read_int64(const DektakBuf *buf, guint32 *pos, guint64 *i)
+{
+    if (read_with_check(buf, pos, sizeof(guint64), i)) {
+        *i = GUINT64_FROM_LE(*i);
+        return TRUE;
+    }
+    return FALSE;
+}
+
+static gboolean
+read_float(const DektakBuf *buf, guint32 *pos, gdouble *f)
+{
+    union { guint32 i; gfloat f; } u;
+    if (read_with_check(buf, pos, sizeof(guint32), &u)) {
+        u.i = GUINT32_FROM_LE(u.i);
+        *f = u.f;
+        return TRUE;
+    }
+    return FALSE;
+}
+
+static gboolean
+read_double(const DektakBuf *buf, guint32 *pos, gdouble *f)
+{
+    union { guint64 i; gdouble f; } u;
+    if (read_with_check(buf, pos, sizeof(guint64), &u)) {
+        u.i = GUINT64_FROM_LE(u.i);
+        *f = u.f;
+        return TRUE;
+    }
+    return FALSE;
+}
+
+static gboolean
+read_varlen(const DektakBuf *buf, guint32 *pos, guint32 *l)
+{
+    guint8 lenlen;
+    if (!read_with_check(buf, pos, 1, &lenlen))
+        return FALSE;
+
+    if (lenlen == 1) {
+        guint8 len;
+        if (!read_with_check(buf, pos, 1, &len))
+            return FALSE;
+        *l = len;
+    }
+    else if (lenlen == 2) {
+        guint16 len;
+        if (!read_int16(buf, pos, &len))
+            return FALSE;
+        *l = len;
+    }
+    else if (lenlen == 4) {
+        guint32 len;
+        if (!read_int32(buf, pos, &len))
+            return FALSE;
+        *l = len;
+    }
+    else {
+        /* XXX: We should to report a different error type here, like
+         * "Unsupported length length".  */
+        return FALSE;
+    }
+    return TRUE;
+}
+
+/* Name has always 4byte size, unlike a string which has varlength. */
+static gboolean
+read_name(const DektakBuf *buf, guint32 *pos, DektakBuf *str)
+{
+    if (!read_int32(buf, pos, &str->len))
+        return FALSE;
+    if (buf->len < str->len || *pos > buf->len - str->len)
+        return FALSE;
+    str->p = buf->p + *pos;
+    *pos += str->len;
+    return TRUE;
+}
+
+/* NB: it moves @pos to the end of the structure because @p becomes the inner
+ * content buffer. */
+static gboolean
+read_structured(const DektakBuf *buf, guint32 *pos, DektakBuf *content)
+{
+    if (!read_varlen(buf, pos, &content->len))
+        return FALSE;
+    if (buf->len < content->len || *pos > buf->len - content->len)
+        return FALSE;
+    content->p = buf->p + *pos;
+    *pos += content->len;
+    return TRUE;
+}
+
+/* NB: it moves @pos to the end of the structure because @content becomes the
+ * inner content buffer. */
+static gboolean
+read_named_struct(const DektakBuf *buf, guint32 *pos,
+                  DektakBuf *typename, DektakBuf *content)
+{
+    if (!read_name(buf, pos, typename))
+        return FALSE;
+    if (!read_structured(buf, pos, content))
+        return FALSE;
+    return TRUE;
+}
+
+/* Helper function; the structure seems to be repeated in various places. */
+static gboolean
+read_quantunit_content(const DektakBuf *buf, guint32 *pos, gboolean is_unit,
+                       DektakQuantUnit *unit)
+{
+    if (!is_unit) {
+        if (!read_double(buf, pos, &unit->value))
+            return FALSE;
+    }
+    if (!read_name(buf, pos, &unit->name))
+        return FALSE;
+    if (!read_name(buf, pos, &unit->symbol))
+        return FALSE;
+    if (is_unit) {
+        if (!read_double(buf, pos, &unit->value))
+            return FALSE;
+        if (!read_with_check(buf, pos, UNIT_EXTRA, &unit->extra[0]))
+            return FALSE;
+    }
+    return TRUE;
+}
+
+static gboolean
+read_dimension2d_content(const DektakBuf *buf, guint32 *pos,
+                         DektakQuantUnit *unit, gdouble *divisor)
+{
+    if (!read_double(buf, pos, &unit->value))
+        return FALSE;
+    if (!read_name(buf, pos, &unit->name))
+        return FALSE;
+    if (!read_name(buf, pos, &unit->symbol))
+        return FALSE;
+    if (!read_double(buf, pos, divisor))
+        return FALSE;
+    if (!read_with_check(buf, pos, UNIT_EXTRA, &unit->extra[0]))
+        return FALSE;
+    return TRUE;
+}
+
+static gboolean
+read_item(const DektakBuf *buf, guint32 *pos, GHashTable *hash, GString *path,
+          GError **error)
+{
+    DektakItem item;
+    DektakBuf name, content, s;
+    guint8 typeid, b8;
+    guint orig_path_len = path->len;
+    guint32 itempos = 0;
+
+    if (!read_name(buf, pos, &name))
+        goto fail;
+
+    g_string_append_c(path, '/');
+    g_string_append_len(path, (gchar*)name.p, name.len);
+
+    if (!read_with_check(buf, pos, 1, &typeid))
+        goto fail;
+
+    gwy_clear(&item, 1);
+    item.typeid = typeid;
+
+    /* Simple types. */
+    if (typeid == DEKTAK_BOOLEAN) {
+        if (!read_with_check(buf, pos, 1, &b8))
+            goto fail;
+        item.data.b = b8;
+    }
+    else if (typeid == DEKTAK_SINT32 || typeid == DEKTAK_UINT32) {
+        if (!read_int32(buf, pos, &item.data.ui))
+            goto fail;
+    }
+    else if (typeid == DEKTAK_SINT64 || typeid == DEKTAK_UINT64) {
+        if (!read_int64(buf, pos, &item.data.uq))
+            goto fail;
+    }
+    else if (typeid == DEKTAK_FLOAT) {
+        if (!read_float(buf, pos, &item.data.d))
+            goto fail;
+    }
+    else if (typeid == DEKTAK_DOUBLE) {
+        if (!read_double(buf, pos, &item.data.d))
+            goto fail;
+    }
+    else if (typeid == DEKTAK_TIME_STAMP) {
+        if (!read_with_check(buf, pos, TIMESTAMP_SIZE, &item.data.timestamp[0]))
+            goto fail;
+    }
+    else if (typeid == DEKTAK_STRING) {
+        if (!read_structured(buf, pos, &item.data.buf))
+            goto fail;
+    }
+    else if (typeid == DEKTAK_QUANTITY) {
+        if (!read_structured(buf, pos, &content))
+            goto fail;
+        if (!read_quantunit_content(&content, &itempos, FALSE, &item.data.qun))
+            goto fail;
+    }
+    else if (typeid == DEKTAK_UNITS) {
+        if (!read_structured(buf, pos, &content))
+            goto fail;
+        if (!read_quantunit_content(&content, &itempos, TRUE, &item.data.qun))
+            goto fail;
+    }
+    else if (typeid == DEKTAK_TERMINATOR) {
+        /* There are usually some 0xff bytes.  Not sure what to think about
+         * them. */
+        *pos = buf->len;
+    }
+    /* Container types.  Cannot tell any difference between these two.  Raw
+     * data purpose seems to be wrapping actual raw data in something
+     * container-like. */
+    else if (typeid == DEKTAK_CONTAINER
+             || typeid == DEKTAK_RAW_DATA
+             || typeid == DEKTAK_RAW_DATA_2D) {
+        if (!read_structured(buf, pos, &content))
+            goto fail;
+        while (itempos < content.len) {
+            if (!read_item(&content, &itempos, hash, path, error))
+                return FALSE;
+        }
+    }
+    /* Types with string type name (i.e. untyped serialised junk we have to
+     * know how to read). */
+    else if (typeid == DEKTAK_DOUBLE_ARRAY) {
+        /* Must check if array size is 8*something + 5.   But later. */
+        if (!read_named_struct(buf, pos, &item.typename, &item.data.buf))
+            goto fail;
+    }
+    else if (typeid == DEKTAK_STRING_LIST) {
+        if (!read_named_struct(buf, pos, &item.typename, &content))
+            goto fail;
+        item.data.strlist = g_array_new(FALSE, FALSE, sizeof(DektakBuf));
+        while (itempos < content.len) {
+           if (!read_name(&content, &itempos, &s)) {
+               g_array_free(item.data.strlist, TRUE);
+               goto fail;
+           }
+           g_array_append_val(item.data.strlist, s);
+        }
+    }
+    else if (typeid == DEKTAK_TYPE_ID) {
+        /* The type id is presumably an integral type because in XML it is
+         * represented by an integer literal.  But it is represented as a
+         * byte buffer.  */
+        if (!read_named_struct(buf, pos, &item.typename, &item.data.buf))
+            goto fail;
+    }
+    else if (typeid == DEKTAK_POS_RAW_DATA) {
+        /* Unfortunately, we have to know if we are readin 1D or 2D at this
+         * point because the structs differ.  Bummer. */
+        if (g_str_has_prefix(path->str, "/2D_Data")) {
+            gwy_debug("assuming 2D for pos raw data");
+            if (!read_named_struct(buf, pos, &item.typename, &content))
+                goto fail;
+
+            if (!read_dimension2d_content(&content, &itempos,
+                                          &item.data.rawpos2d.unitx,
+                                          &item.data.rawpos2d.divisorx))
+                goto fail;
+            if (!read_dimension2d_content(&content, &itempos,
+                                          &item.data.rawpos2d.unity,
+                                          &item.data.rawpos2d.divisory))
+                goto fail;
+        }
+        else {
+            if (!g_str_has_prefix(path->str, "/1D_Data")) {
+                g_warning("Cannot tell if we have 1D or 2D data, assuming 1D.");
+            }
+            gwy_debug("assuming 1D for pos raw data");
+            if (!read_named_struct(buf, pos, &item.typename, &content))
+                goto fail;
+
+            /* This is exactly as a UNIT record, but it does not carry the type
+             * byte.  Whatever. */
+            if (!read_quantunit_content(&content, &itempos, TRUE,
+                                        &item.data.rawpos1d.unit))
+                goto fail;
+            if (!read_int64(&content, &itempos, &item.data.rawpos1d.count))
+                goto fail;
+            /* Must check if item count matches the buffer size.  But later. */
+            item.data.rawpos1d.buf = content;
+            item.data.rawpos1d.buf.p += itempos;
+            item.data.rawpos1d.buf.len -= itempos;
+        }
+    }
+    else if (typeid == DEKTAK_MATRIX) {
+        if (!read_name(buf, pos, &item.typename))
+            goto fail;
+        /* This is usually zero... */
+        if (!read_int32(buf, pos, &item.data.matrix.some_int))
+            goto fail;
+        if (!read_name(buf, pos, &item.data.matrix.another_name))
+            goto fail;
+        /* The length includes the following xres and yres. */
+        if (!read_varlen(buf, pos, &item.data.matrix.buf.len))
+            goto fail;
+        if (!read_int32(buf, pos, &item.data.matrix.yres))
+            goto fail;
+        if (!read_int32(buf, pos, &item.data.matrix.xres))
+            goto fail;
+        if (item.data.matrix.buf.len < 2*sizeof(guint32))
+            goto fail;
+        item.data.matrix.buf.len -= 2*sizeof(guint32);
+        item.data.matrix.buf.p = buf->p + *pos;
+        if (buf->len - *pos < item.data.matrix.buf.len)
+            goto fail;
+        *pos += item.data.matrix.buf.len;
+    }
+    else {
+        err_DATA_TYPE(error, typeid);
+        return FALSE;
+    }
+
+    gwy_debug("%s (typeid %02x)", path->str, typeid);
+    g_hash_table_insert(hash,
+                        g_strndup(path->str, path->len),
+                        g_slice_dup(DektakItem, &item));
+    g_string_truncate(path, orig_path_len);
+    return TRUE;
+
+fail:
+    g_set_error(error, GWY_MODULE_FILE_ERROR, GWY_MODULE_FILE_ERROR_DATA,
+                _("Truncated data inside item %s."), path->str);
+    return FALSE;
+}
+
+static void
+dektak_item_free(gpointer p)
+{
+    DektakItem *item = (DektakItem*)p;
+
+    /* Currently the only data type with heap-allocated data. */
+    if (item->typeid == DEKTAK_STRING_LIST)
+        g_array_free(item->data.strlist, TRUE);
+    g_slice_free(DektakItem, item);
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/file/dektakxml.c b/modules/file/dektakxml.c
index c711803..b9bac2e 100644
--- a/modules/file/dektakxml.c
+++ b/modules/file/dektakxml.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: dektakxml.c 18781 2016-07-28 10:48:52Z yeti-dn $
+ *  $Id: dektakxml.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -33,7 +33,7 @@
 
 /**
  * [FILE-MAGIC-FILEMAGIC]
- * # SIS
+ * # Dektak (text serialisation)
  * 0 string \x3c?xml
  * >&0 search/80 \x3cDataContainer\ typeid="125" Dektak XML profilometry data
  **/
@@ -72,25 +72,6 @@
 #define RAW_1D_DATA   "/DataContainer/1D_Data/Raw"
 #define Micrometre 1e-6
 
-/* This is what I guessed from observing the XML.  At this moment we ignore
- * the type ids anyway. */
-typedef enum {
-    DEKTAKXML_BOOLEAN      = 1,   /* Takes value 0 and 1 */
-    DEKTAKXML_COUNT        = 11,  /* Positive integer which is an item count */
-    DEKTAKXML_DOUBLE       = 12,  /* Any number */
-    DEKTAKXML_INT          = 13,  /* Arbitrary integer */
-    DEKTAKXML_TYPE_ID      = 14,  /* Type id, some kind of enum? */
-    DEKTAKXML_STRING       = 18,  /* Free-form string value */
-    DEKTAKXML_VALUE_UNIT   = 19,  /* Have Value and Unit children */
-    DEKTAKXML_TIME_STAMP   = 21,  /* Datetime (formatted as string) */
-    DEKTAKXML_BASE64       = 64,  /* Base64-encoded raw data array */
-    DEKTAKXML_STRING_LIST  = 66,  /* List of Str */
-    DEKTAKXML_RAW_DATA     = 70,  /* Parent/wrapper tag of raw data */
-    DEKTAKXML_POS_RAW_DATA = 124, /* Base64-encoded positions, not sure how
-                                     it differs from 64 */
-    DEKTAKXML_CONTAINER    = 125, /* General nested data structure */
-} DektakXMLTypeID;
-
 typedef struct {
     gchar *name;
     gsize len;
@@ -100,7 +81,6 @@ typedef struct {
 typedef struct {
     GHashTable *hash;
     GString *path;
-    GPtrArray *channels;
     GArray *rawdata;
 } DektakXMLFile;
 
@@ -142,7 +122,7 @@ static GwyModuleInfo module_info = {
     "2016",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, dektakxml)
 
 static gboolean
 module_register(void)
@@ -239,9 +219,9 @@ dektakxml_load(const gchar *filename,
      * in the data.  The value in data seems to be the actual one, the value
      * in settings is nominal? */
     if (!require_keys(dxfile.hash, error,
-                      RAW_1D_DATA "/NumPoints",
-                      RAW_1D_DATA "/Extent/Value",
-                      RAW_1D_DATA "/Extent/Unit",
+                      MEAS_SETTINGS "/SamplesToLog",
+                      MEAS_SETTINGS "/ScanLength/Value",
+                      MEAS_SETTINGS "/ScanLength/Unit",
                       RAW_1D_DATA "/DataScale/Value",
                       RAW_1D_DATA "/DataScale/Unit",
                       NULL))
@@ -352,7 +332,6 @@ dektakxml_init(DektakXMLFile *dxfile)
     dxfile->hash = g_hash_table_new_full(g_str_hash, g_str_equal,
                                          g_free, g_free);
     dxfile->path = g_string_new(NULL);
-    dxfile->channels = g_ptr_array_new();
     dxfile->rawdata = g_array_new(FALSE, FALSE, sizeof(DektakXMLRawData));
 }
 
@@ -366,16 +345,10 @@ dektakxml_free(DektakXMLFile *dxfile)
     if (dxfile->path)
         g_string_free(dxfile->path, TRUE);
 
-    if (dxfile->channels) {
-        for (i = 0; i < dxfile->channels->len; i++)
-            g_free(g_ptr_array_index(dxfile->channels, i));
-        g_ptr_array_free(dxfile->channels, TRUE);
-    }
-
     if (dxfile->rawdata) {
         for (i = 0; i < dxfile->rawdata->len; i++) {
             DektakXMLRawData *rawdata = &g_array_index(dxfile->rawdata,
-                                                      DektakXMLRawData, i);
+                                                       DektakXMLRawData, i);
             g_free(rawdata->name);
             g_free(rawdata->data);
         }
diff --git a/modules/file/dimensionfile.c b/modules/file/dimensionfile.c
index 7581a0e..da0006e 100644
--- a/modules/file/dimensionfile.c
+++ b/modules/file/dimensionfile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: dimensionfile.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: dimensionfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -75,7 +75,7 @@ static GwyModuleInfo module_info = {
     "2016",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, dimensionfile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/dm3file.c b/modules/file/dm3file.c
index e9c242f..cdfb10d 100644
--- a/modules/file/dm3file.c
+++ b/modules/file/dm3file.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: dm3file.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: dm3file.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2012 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -278,7 +278,7 @@ static GwyModuleInfo module_info = {
     "2012",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, dm3file)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/dmefile.c b/modules/file/dmefile.c
index f46b95a..30a2102 100644
--- a/modules/file/dmefile.c
+++ b/modules/file/dmefile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: dmefile.c 18071 2016-01-11 21:00:49Z yeti-dn $
+ *  $Id: dmefile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -135,7 +135,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, dmefile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/dumbfile.c b/modules/file/dumbfile.c
index b34fa38..62c310b 100644
--- a/modules/file/dumbfile.c
+++ b/modules/file/dumbfile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: dumbfile.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: dumbfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2009 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -74,7 +74,7 @@ static GwyModuleInfo module_info = {
     "2011",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, dumbfile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/ecsfile.c b/modules/file/ecsfile.c
index 22b2c09..9053952 100644
--- a/modules/file/ecsfile.c
+++ b/modules/file/ecsfile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: ecsfile.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: ecsfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2006 David Necas (Yeti), Petr Klapetek, Markus Pristovsek
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net,
  *  prissi at gift.physik.tu-berlin.de.
@@ -88,7 +88,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, ecsfile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/ezdfile.c b/modules/file/ezdfile.c
index 2a05563..a5f1400 100644
--- a/modules/file/ezdfile.c
+++ b/modules/file/ezdfile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: ezdfile.c 16387 2014-07-10 10:41:50Z yeti-dn $
+ *  $Id: ezdfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -139,7 +139,7 @@ static GwyModuleInfo module_info = {
     "2005",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, ezdfile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/femtoscan-txt.c b/modules/file/femtoscan-txt.c
index 1423060..520d959 100644
--- a/modules/file/femtoscan-txt.c
+++ b/modules/file/femtoscan-txt.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: femtoscan-txt.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: femtoscan-txt.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -81,7 +81,7 @@ static GwyModuleInfo module_info = {
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, femtoscan_txt)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/femtoscan.c b/modules/file/femtoscan.c
index a6a7a39..605b8dc 100644
--- a/modules/file/femtoscan.c
+++ b/modules/file/femtoscan.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: femtoscan.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: femtoscan.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -85,7 +85,7 @@ static GwyModuleInfo module_info = {
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, femtoscan)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/file.c b/modules/file/file.c
new file mode 100644
index 0000000..77de51f
--- /dev/null
+++ b/modules/file/file.c
@@ -0,0 +1,240 @@
+/* This is a GENERATED file. */
+#include <glib.h>
+#include <libgwymodule/gwymodule.h>
+
+static const GwyModuleRecord* register_bundle(void);
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION | GWY_MODULE_BUNDLE_FLAG,
+    (GwyModuleRegisterFunc)&register_bundle,
+    NULL, NULL, NULL, NULL, NULL,
+};
+
+GWY_MODULE_QUERY(module_info)
+
+GwyModuleInfo* _gwy_module_query__accurexii_txt(void);
+GwyModuleInfo* _gwy_module_query__aistfile(void);
+GwyModuleInfo* _gwy_module_query__alicona(void);
+GwyModuleInfo* _gwy_module_query__ambfile(void);
+GwyModuleInfo* _gwy_module_query__anfatec(void);
+GwyModuleInfo* _gwy_module_query__apefile(void);
+GwyModuleInfo* _gwy_module_query__asciiexport(void);
+GwyModuleInfo* _gwy_module_query__assing_afm(void);
+GwyModuleInfo* _gwy_module_query__attocube(void);
+GwyModuleInfo* _gwy_module_query__bcrfile(void);
+GwyModuleInfo* _gwy_module_query__burleigh(void);
+GwyModuleInfo* _gwy_module_query__burleigh_bii(void);
+GwyModuleInfo* _gwy_module_query__burleigh_exp(void);
+GwyModuleInfo* _gwy_module_query__codevfile(void);
+GwyModuleInfo* _gwy_module_query__csmfile(void);
+GwyModuleInfo* _gwy_module_query__dektakvca(void);
+GwyModuleInfo* _gwy_module_query__dektakxml(void);
+GwyModuleInfo* _gwy_module_query__dimensionfile(void);
+GwyModuleInfo* _gwy_module_query__dmefile(void);
+GwyModuleInfo* _gwy_module_query__dm3file(void);
+GwyModuleInfo* _gwy_module_query__dumbfile(void);
+GwyModuleInfo* _gwy_module_query__ecsfile(void);
+GwyModuleInfo* _gwy_module_query__ezdfile(void);
+GwyModuleInfo* _gwy_module_query__femtoscan(void);
+GwyModuleInfo* _gwy_module_query__femtoscan_txt(void);
+GwyModuleInfo* _gwy_module_query__gdeffile(void);
+GwyModuleInfo* _gwy_module_query__gsffile(void);
+GwyModuleInfo* _gwy_module_query__gwyfile(void);
+GwyModuleInfo* _gwy_module_query__gxyzffile(void);
+GwyModuleInfo* _gwy_module_query__hdf4file(void);
+GwyModuleInfo* _gwy_module_query__hitachi_afm(void);
+GwyModuleInfo* _gwy_module_query__hitachi_sem(void);
+GwyModuleInfo* _gwy_module_query__igorfile(void);
+GwyModuleInfo* _gwy_module_query__intelliwave(void);
+GwyModuleInfo* _gwy_module_query__intematix(void);
+GwyModuleInfo* _gwy_module_query__iso28600(void);
+GwyModuleInfo* _gwy_module_query__jeol(void);
+GwyModuleInfo* _gwy_module_query__jspmfile(void);
+GwyModuleInfo* _gwy_module_query__keyence(void);
+GwyModuleInfo* _gwy_module_query__leica(void);
+GwyModuleInfo* _gwy_module_query__lextfile(void);
+GwyModuleInfo* _gwy_module_query__magellan(void);
+GwyModuleInfo* _gwy_module_query__mapvue(void);
+GwyModuleInfo* _gwy_module_query__metropro(void);
+GwyModuleInfo* _gwy_module_query__microprof(void);
+GwyModuleInfo* _gwy_module_query__miffile(void);
+GwyModuleInfo* _gwy_module_query__mifile(void);
+GwyModuleInfo* _gwy_module_query__mulfile(void);
+GwyModuleInfo* _gwy_module_query__nanoeducator(void);
+GwyModuleInfo* _gwy_module_query__nanomagnetics(void);
+GwyModuleInfo* _gwy_module_query__nanonics(void);
+GwyModuleInfo* _gwy_module_query__nanonis(void);
+GwyModuleInfo* _gwy_module_query__nanoscan(void);
+GwyModuleInfo* _gwy_module_query__nanoscope_ii(void);
+GwyModuleInfo* _gwy_module_query__nanoscope(void);
+GwyModuleInfo* _gwy_module_query__nanotop(void);
+GwyModuleInfo* _gwy_module_query__netcdf(void);
+GwyModuleInfo* _gwy_module_query__nmmxyz(void);
+GwyModuleInfo* _gwy_module_query__nt_mdt(void);
+GwyModuleInfo* _gwy_module_query__nxiifile(void);
+GwyModuleInfo* _gwy_module_query__oldmda(void);
+GwyModuleInfo* _gwy_module_query__ols(void);
+GwyModuleInfo* _gwy_module_query__ometiff(void);
+GwyModuleInfo* _gwy_module_query__omicron(void);
+GwyModuleInfo* _gwy_module_query__omicronflat(void);
+GwyModuleInfo* _gwy_module_query__omicronmatrix(void);
+GwyModuleInfo* _gwy_module_query__opdfile(void);
+GwyModuleInfo* _gwy_module_query__pnifile(void);
+GwyModuleInfo* _gwy_module_query__pltfile(void);
+GwyModuleInfo* _gwy_module_query__princetonspe(void);
+GwyModuleInfo* _gwy_module_query__psia(void);
+GwyModuleInfo* _gwy_module_query__pt3file(void);
+GwyModuleInfo* _gwy_module_query__quesant(void);
+GwyModuleInfo* _gwy_module_query__rawfile(void);
+GwyModuleInfo* _gwy_module_query__rawgraph(void);
+GwyModuleInfo* _gwy_module_query__rawxyz(void);
+GwyModuleInfo* _gwy_module_query__renishaw(void);
+GwyModuleInfo* _gwy_module_query__rhk_sm3(void);
+GwyModuleInfo* _gwy_module_query__rhk_spm32(void);
+GwyModuleInfo* _gwy_module_query__robotics(void);
+GwyModuleInfo* _gwy_module_query__s94file(void);
+GwyModuleInfo* _gwy_module_query__sdfile(void);
+GwyModuleInfo* _gwy_module_query__seiko(void);
+GwyModuleInfo* _gwy_module_query__sensofar(void);
+GwyModuleInfo* _gwy_module_query__sensolytics(void);
+GwyModuleInfo* _gwy_module_query__shimadzu(void);
+GwyModuleInfo* _gwy_module_query__sicmfile(void);
+GwyModuleInfo* _gwy_module_query__sis(void);
+GwyModuleInfo* _gwy_module_query__spip_asc(void);
+GwyModuleInfo* _gwy_module_query__spmlab(void);
+GwyModuleInfo* _gwy_module_query__spmlabf(void);
+GwyModuleInfo* _gwy_module_query__stmprg(void);
+GwyModuleInfo* _gwy_module_query__stpfile(void);
+GwyModuleInfo* _gwy_module_query__surffile(void);
+GwyModuleInfo* _gwy_module_query__tescan(void);
+GwyModuleInfo* _gwy_module_query__tiaser(void);
+GwyModuleInfo* _gwy_module_query__unisoku(void);
+GwyModuleInfo* _gwy_module_query__vtkfile(void);
+GwyModuleInfo* _gwy_module_query__win_stm(void);
+GwyModuleInfo* _gwy_module_query__wipfile(void);
+GwyModuleInfo* _gwy_module_query__witec_asc(void);
+GwyModuleInfo* _gwy_module_query__witfile(void);
+GwyModuleInfo* _gwy_module_query__wsffile(void);
+GwyModuleInfo* _gwy_module_query__wsxmfile(void);
+GwyModuleInfo* _gwy_module_query__xyzexport(void);
+GwyModuleInfo* _gwy_module_query__zeiss(void);
+GwyModuleInfo* _gwy_module_query__zeisslsm(void);
+GwyModuleInfo* _gwy_module_query__zemax(void);
+
+static const GwyModuleRecord modules[] = {
+  { _gwy_module_query__accurexii_txt, "accurexii-txt", },
+  { _gwy_module_query__aistfile, "aistfile", },
+  { _gwy_module_query__alicona, "alicona", },
+  { _gwy_module_query__ambfile, "ambfile", },
+  { _gwy_module_query__anfatec, "anfatec", },
+  { _gwy_module_query__apefile, "apefile", },
+  { _gwy_module_query__asciiexport, "asciiexport", },
+  { _gwy_module_query__assing_afm, "assing-afm", },
+  { _gwy_module_query__attocube, "attocube", },
+  { _gwy_module_query__bcrfile, "bcrfile", },
+  { _gwy_module_query__burleigh, "burleigh", },
+  { _gwy_module_query__burleigh_bii, "burleigh_bii", },
+  { _gwy_module_query__burleigh_exp, "burleigh_exp", },
+  { _gwy_module_query__codevfile, "codevfile", },
+  { _gwy_module_query__csmfile, "csmfile", },
+  { _gwy_module_query__dektakvca, "dektakvca", },
+  { _gwy_module_query__dektakxml, "dektakxml", },
+  { _gwy_module_query__dimensionfile, "dimensionfile", },
+  { _gwy_module_query__dmefile, "dmefile", },
+  { _gwy_module_query__dm3file, "dm3file", },
+  { _gwy_module_query__dumbfile, "dumbfile", },
+  { _gwy_module_query__ecsfile, "ecsfile", },
+  { _gwy_module_query__ezdfile, "ezdfile", },
+  { _gwy_module_query__femtoscan, "femtoscan", },
+  { _gwy_module_query__femtoscan_txt, "femtoscan-txt", },
+  { _gwy_module_query__gdeffile, "gdeffile", },
+  { _gwy_module_query__gsffile, "gsffile", },
+  { _gwy_module_query__gwyfile, "gwyfile", },
+  { _gwy_module_query__gxyzffile, "gxyzffile", },
+  { _gwy_module_query__hdf4file, "hdf4file", },
+  { _gwy_module_query__hitachi_afm, "hitachi-afm", },
+  { _gwy_module_query__hitachi_sem, "hitachi-sem", },
+  { _gwy_module_query__igorfile, "igorfile", },
+  { _gwy_module_query__intelliwave, "intelliwave", },
+  { _gwy_module_query__intematix, "intematix", },
+  { _gwy_module_query__iso28600, "iso28600", },
+  { _gwy_module_query__jeol, "jeol", },
+  { _gwy_module_query__jspmfile, "jspmfile", },
+  { _gwy_module_query__keyence, "keyence", },
+  { _gwy_module_query__leica, "leica", },
+  { _gwy_module_query__lextfile, "lextfile", },
+  { _gwy_module_query__magellan, "magellan", },
+  { _gwy_module_query__mapvue, "mapvue", },
+  { _gwy_module_query__metropro, "metropro", },
+  { _gwy_module_query__microprof, "microprof", },
+  { _gwy_module_query__miffile, "miffile", },
+  { _gwy_module_query__mifile, "mifile", },
+  { _gwy_module_query__mulfile, "mulfile", },
+  { _gwy_module_query__nanoeducator, "nanoeducator", },
+  { _gwy_module_query__nanomagnetics, "nanomagnetics", },
+  { _gwy_module_query__nanonics, "nanonics", },
+  { _gwy_module_query__nanonis, "nanonis", },
+  { _gwy_module_query__nanoscan, "nanoscan", },
+  { _gwy_module_query__nanoscope_ii, "nanoscope-ii", },
+  { _gwy_module_query__nanoscope, "nanoscope", },
+  { _gwy_module_query__nanotop, "nanotop", },
+  { _gwy_module_query__netcdf, "netcdf", },
+  { _gwy_module_query__nmmxyz, "nmmxyz", },
+  { _gwy_module_query__nt_mdt, "nt-mdt", },
+  { _gwy_module_query__nxiifile, "nxiifile", },
+  { _gwy_module_query__oldmda, "oldmda", },
+  { _gwy_module_query__ols, "ols", },
+  { _gwy_module_query__ometiff, "ometiff", },
+  { _gwy_module_query__omicron, "omicron", },
+  { _gwy_module_query__omicronflat, "omicronflat", },
+  { _gwy_module_query__omicronmatrix, "omicronmatrix", },
+  { _gwy_module_query__opdfile, "opdfile", },
+  { _gwy_module_query__pnifile, "pnifile", },
+  { _gwy_module_query__pltfile, "pltfile", },
+  { _gwy_module_query__princetonspe, "princetonspe", },
+  { _gwy_module_query__psia, "psia", },
+  { _gwy_module_query__pt3file, "pt3file", },
+  { _gwy_module_query__quesant, "quesant", },
+  { _gwy_module_query__rawfile, "rawfile", },
+  { _gwy_module_query__rawgraph, "rawgraph", },
+  { _gwy_module_query__rawxyz, "rawxyz", },
+  { _gwy_module_query__renishaw, "renishaw", },
+  { _gwy_module_query__rhk_sm3, "rhk-sm3", },
+  { _gwy_module_query__rhk_spm32, "rhk-spm32", },
+  { _gwy_module_query__robotics, "robotics", },
+  { _gwy_module_query__s94file, "s94file", },
+  { _gwy_module_query__sdfile, "sdfile", },
+  { _gwy_module_query__seiko, "seiko", },
+  { _gwy_module_query__sensofar, "sensofar", },
+  { _gwy_module_query__sensolytics, "sensolytics", },
+  { _gwy_module_query__shimadzu, "shimadzu", },
+  { _gwy_module_query__sicmfile, "sicmfile", },
+  { _gwy_module_query__sis, "sis", },
+  { _gwy_module_query__spip_asc, "spip-asc", },
+  { _gwy_module_query__spmlab, "spmlab", },
+  { _gwy_module_query__spmlabf, "spmlabf", },
+  { _gwy_module_query__stmprg, "stmprg", },
+  { _gwy_module_query__stpfile, "stpfile", },
+  { _gwy_module_query__surffile, "surffile", },
+  { _gwy_module_query__tescan, "tescan", },
+  { _gwy_module_query__tiaser, "tiaser", },
+  { _gwy_module_query__unisoku, "unisoku", },
+  { _gwy_module_query__vtkfile, "vtkfile", },
+  { _gwy_module_query__win_stm, "win_stm", },
+  { _gwy_module_query__wipfile, "wipfile", },
+  { _gwy_module_query__witec_asc, "witec-asc", },
+  { _gwy_module_query__witfile, "witfile", },
+  { _gwy_module_query__wsffile, "wsffile", },
+  { _gwy_module_query__wsxmfile, "wsxmfile", },
+  { _gwy_module_query__xyzexport, "xyzexport", },
+  { _gwy_module_query__zeiss, "zeiss", },
+  { _gwy_module_query__zeisslsm, "zeisslsm", },
+  { _gwy_module_query__zemax, "zemax", },
+  { NULL, NULL, },
+};
+
+static const GwyModuleRecord*
+register_bundle(void)
+{
+    return modules;
+}
diff --git a/modules/file/gdeffile.c b/modules/file/gdeffile.c
index bf727c4..765c2ab 100644
--- a/modules/file/gdeffile.c
+++ b/modules/file/gdeffile.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gdeffile.c 17718 2015-11-06 08:04:04Z pecold $
+ *  @(#) $Id: gdeffile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2010 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -133,7 +133,7 @@ static GwyModuleInfo module_info = {
     "2010",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, gdeffile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/gsffile.c b/modules/file/gsffile.c
index 7cc9a9b..6167763 100644
--- a/modules/file/gsffile.c
+++ b/modules/file/gsffile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: gsffile.c 17719 2015-11-06 08:46:13Z pecold $
+ *  $Id: gsffile.c 20109 2017-07-29 13:06:01Z yeti-dn $
  *  Copyright (C) 2009 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -95,7 +95,7 @@ static GwyModuleInfo module_info = {
     "2010",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, gsffile)
 
 static gboolean
 module_register(void)
@@ -314,7 +314,7 @@ gsf_export(GwyContainer *container,
     const gdouble *d;
     gdouble v;
     gchar *s;
-    GwySIUnit *unit, *emptyunit;
+    GwySIUnit *unit;
     FILE *fh;
 
     gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &dfield,
@@ -343,20 +343,18 @@ gsf_export(GwyContainer *container,
     if ((v = gwy_data_field_get_yoffset(dfield)))
         append_num(header, "YOffset", v);
 
-    emptyunit = gwy_si_unit_new(NULL);
     unit = gwy_data_field_get_si_unit_xy(dfield);
-    if (!gwy_si_unit_equal(unit, emptyunit)) {
+    if (!gwy_si_unit_equal_string(unit, NULL)) {
         s = gwy_si_unit_get_string(unit, GWY_SI_UNIT_FORMAT_PLAIN);
         g_string_append_printf(header, "XYUnits = %s\n", s);
         g_free(s);
     }
     unit = gwy_data_field_get_si_unit_z(dfield);
-    if (!gwy_si_unit_equal(unit, emptyunit)) {
+    if (!gwy_si_unit_equal_string(unit, NULL)) {
         s = gwy_si_unit_get_string(unit, GWY_SI_UNIT_FORMAT_PLAIN);
         g_string_append_printf(header, "ZUnits = %s\n", s);
         g_free(s);
     }
-    g_object_unref(emptyunit);
 
     s = gwy_app_get_data_field_title(container, id);
     g_string_append_printf(header, "Title = %s\n", s);
diff --git a/modules/file/gwyfile.c b/modules/file/gwyfile.c
index 3661e79..76b2713 100644
--- a/modules/file/gwyfile.c
+++ b/modules/file/gwyfile.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwyfile.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: gwyfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -108,7 +108,7 @@ static GwyModuleInfo module_info = {
     "2003",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, gwyfile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/gwytiff.h b/modules/file/gwytiff.h
index 33d2048..b510c5b 100644
--- a/modules/file/gwytiff.h
+++ b/modules/file/gwytiff.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwytiff.h 19049 2016-10-10 13:53:53Z yeti-dn $
+ *  @(#) $Id: gwytiff.h 19394 2017-01-05 15:12:04Z dn2010 $
  *  Copyright (C) 2007-2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -101,6 +101,8 @@ typedef enum {
     GWY_TIFFTAG_SOFTWARE          = 305,
     GWY_TIFFTAG_DATE_TIME         = 306,
     GWY_TIFFTAG_ARTIST            = 315,
+    GWY_TIFFTAG_PREDICTOR         = 317,
+    GWY_TIFFTAG_COLORMAP          = 320,
     GWY_TIFFTAG_TILE_WIDTH        = 322,
     GWY_TIFFTAG_TILE_LENGTH       = 323,
     GWY_TIFFTAG_TILE_OFFSETS      = 324,
@@ -113,6 +115,7 @@ typedef enum {
  * standard if needed.  */
 typedef enum {
     GWY_TIFF_COMPRESSION_NONE = 1,
+    GWY_TIFF_COMPRESSION_LZW  = 5,
 } GwyTIFFCompression;
 
 typedef enum {
diff --git a/modules/file/gxyzffile.c b/modules/file/gxyzffile.c
index b8fb0a2..8b10703 100644
--- a/modules/file/gxyzffile.c
+++ b/modules/file/gxyzffile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: gxyzffile.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: gxyzffile.c 20109 2017-07-29 13:06:01Z yeti-dn $
  *  Copyright (C) 2013-2016 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -122,7 +122,7 @@ static GwyModuleInfo module_info = {
     "2013",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, gxyzffile)
 
 static gboolean
 module_register(void)
@@ -667,7 +667,6 @@ write_header(FILE *fh, guint nchannels, guint npoints,
              GError **error)
 {
     static const gchar zeros[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
-    GwySIUnit *emptyunit;
     GString *header;
     gchar *s;
     guint i, padding;
@@ -676,22 +675,19 @@ write_header(FILE *fh, guint nchannels, guint npoints,
     g_string_append_printf(header, "NChannels = %u\n", nchannels);
     g_string_append_printf(header, "NPoints = %u\n", npoints);
 
-    emptyunit = gwy_si_unit_new(NULL);
-
-    if (!gwy_si_unit_equal(xyunit, emptyunit)) {
+    if (!gwy_si_unit_equal_string(xyunit, NULL)) {
         s = gwy_si_unit_get_string(xyunit, GWY_SI_UNIT_FORMAT_PLAIN);
         g_string_append_printf(header, "XYUnits = %s\n", s);
         g_free(s);
     }
 
     for (i = 0; i < nchannels; i++) {
-        if (!gwy_si_unit_equal(zunits[i], emptyunit)) {
+        if (!gwy_si_unit_equal_string(zunits[i], NULL)) {
             s = gwy_si_unit_get_string(zunits[i], GWY_SI_UNIT_FORMAT_PLAIN);
             g_string_append_printf(header, "ZUnits%u = %s\n", i+1, s);
             g_free(s);
         }
     }
-    g_object_unref(emptyunit);
 
     for (i = 0; i < nchannels; i++)
         g_string_append_printf(header, "Title%u = %s\n", i, titles[i]);
diff --git a/modules/file/hdf4file.c b/modules/file/hdf4file.c
index bbefec9..c89ac3b 100644
--- a/modules/file/hdf4file.c
+++ b/modules/file/hdf4file.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: hdf4file.c 16387 2014-07-10 10:41:50Z yeti-dn $
+ *  $Id: hdf4file.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2006 David Necas (Yeti), Petr Klapetek, Markus Pristovsek
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net,
  *  prissi at gift.physik.tu-berlin.de.
@@ -343,7 +343,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, hdf4file)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/hitachi-afm.c b/modules/file/hitachi-afm.c
index 495948a..acdf141 100644
--- a/modules/file/hitachi-afm.c
+++ b/modules/file/hitachi-afm.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: hitachi-afm.c 16387 2014-07-10 10:41:50Z yeti-dn $
+ *  $Id: hitachi-afm.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek, Markus Pristovsek
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *  prissi at gift.physik.tu-berlin.de.
@@ -111,7 +111,7 @@ static GwyModuleInfo module_info = {
     "2005",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, hitachi_afm)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/hitachi-sem.c b/modules/file/hitachi-sem.c
index 95dea54..163b3f2 100644
--- a/modules/file/hitachi-sem.c
+++ b/modules/file/hitachi-sem.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: hitachi-sem.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: hitachi-sem.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2011 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -88,7 +88,7 @@ static GwyModuleInfo module_info = {
     "2011",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, hitachi_sem)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/igorfile.c b/modules/file/igorfile.c
index 0793100..3bd8d44 100644
--- a/modules/file/igorfile.c
+++ b/modules/file/igorfile.c
@@ -1,6 +1,6 @@
 /*
- *  $Id: igorfile.c 19044 2016-10-08 19:10:46Z yeti-dn $
- *  Copyright (C) 2009 David Necas (Yeti).
+ *  $Id: igorfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2009-2017 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -32,16 +32,19 @@
  * [FILE-MAGIC-USERGUIDE]
  * WaveMetrics IGOR binary wave v5
  * .ibw
- * Read
+ * Read Export
  **/
 
 #include "config.h"
 #include <string.h>
 #include <stdlib.h>
+#include <stdio.h>
+#include <glib/gstdio.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwyutils.h>
 #include <libgwyddion/gwymath.h>
 #include <libprocess/stats.h>
+#include <libprocess/arithmetic.h>
 #include <libgwymodule/gwymodule-file.h>
 #include <app/gwymoduleutils-file.h>
 #include <app/data-browser.h>
@@ -166,33 +169,40 @@ typedef struct {
     GwyContainer *channelmeta;
 } IgorFile;
 
-static gboolean      module_register       (void);
-static gint          igor_detect           (const GwyFileDetectInfo *fileinfo,
-                                            gboolean only_name);
-static GwyContainer* igor_load             (const gchar *filename,
-                                            GwyRunType mode,
-                                            GError **error);
-static guint         igor_read_headers     (IgorFile *igorfile,
-                                            const guchar *buffer,
-                                            gsize size,
-                                            gboolean check_only,
-                                            GError **error);
-static guint         igor_checksum         (gconstpointer buffer,
-                                            gsize size,
-                                            gboolean lsb);
-static guint         igor_data_type_size   (IgorDataType type);
-static GwyDataField* igor_read_data_field  (const IgorFile *igorfile,
-                                            const guchar *buffer,
-                                            guint i,
-                                            const gchar *zunits,
-                                            gboolean imaginary);
-static GwyContainer* igor_get_metadata     (IgorFile *igorfile,
-                                            guint id);
-static GPtrArray*    read_channel_labels   (const gchar *p,
-                                            guint n,
-                                            guint l);
-static gchar*        canonicalize_title    (const gchar *title);
-static const gchar*  channel_title_to_units(const gchar *title);
+static gboolean      module_register         (void);
+static gint          igor_detect             (const GwyFileDetectInfo *fileinfo,
+                                              gboolean only_name);
+static GwyContainer* igor_load               (const gchar *filename,
+                                              GwyRunType mode,
+                                              GError **error);
+static gboolean      igor_export             (GwyContainer *data,
+                                              const gchar *filename,
+                                              GwyRunType mode,
+                                              GError **error);
+static guint         igor_read_headers       (IgorFile *igorfile,
+                                              const guchar *buffer,
+                                              gsize size,
+                                              gboolean check_only,
+                                              GError **error);
+static guint         igor_checksum           (gconstpointer buffer,
+                                              gsize size,
+                                              gboolean lsb);
+static guint         igor_data_type_size     (IgorDataType type);
+static GwyDataField* igor_read_data_field    (const IgorFile *igorfile,
+                                              const guchar *buffer,
+                                              guint i,
+                                              const gchar *zunits,
+                                              gboolean is_imaginary);
+static GwyContainer* igor_get_metadata       (IgorFile *igorfile,
+                                              guint id);
+static GPtrArray*    read_channel_labels     (const gchar *p,
+                                              guint n,
+                                              guint l);
+static gchar*        canonicalize_title      (const gchar *title);
+static const gchar*  channel_title_to_units  (const gchar *title);
+static gint*         find_compatible_channels(GwyContainer *container,
+                                              GwyDataField *dfield,
+                                              guint *n);
 
 static GwyModuleInfo module_info = {
     GWY_MODULE_ABI_VERSION,
@@ -204,7 +214,7 @@ static GwyModuleInfo module_info = {
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, igorfile)
 
 static gboolean
 module_register(void)
@@ -214,7 +224,7 @@ module_register(void)
                            (GwyFileDetectFunc)&igor_detect,
                            (GwyFileLoadFunc)&igor_load,
                            NULL,
-                           NULL);
+                           (GwyFileSaveFunc)&igor_export);
 
     return TRUE;
 }
@@ -287,7 +297,8 @@ igor_load(const gchar *filename,
     xres = wave5->n_dim[0];
     yres = wave5->n_dim[1];
     igorfile.nchannels = wave5->n_dim[2];
-    if (igorfile.nchannels==0) igorfile.nchannels=1;
+    if (igorfile.nchannels == 0)
+        igorfile.nchannels = 1;
 
     if (!xres || !yres || !igorfile.nchannels || wave5->n_dim[3]) {
         g_set_error(error, GWY_MODULE_FILE_ERROR, GWY_MODULE_FILE_ERROR_DATA,
@@ -327,7 +338,7 @@ igor_load(const gchar *filename,
         goto fail;
 
     p = buffer + igorfile.headers_size + expected_size;
-    gwy_debug("remaning data size: %lu", (gulong)(size - (p - buffer)));
+    gwy_debug("remaining data size: %lu", (gulong)(size - (p - buffer)));
 
     p += igorfile.header.formula_size;
     if ((igorfile.variant == IGOR_ASYLUM_FORCE
@@ -352,8 +363,8 @@ igor_load(const gchar *filename,
 
     /* FIXME: The labels are mandatory only in Asylum Research files. */
     nlabels = igorfile.header.dim_labels_size[2]/(MAX_WAVE_NAME5+1);
-    expected_size = (MAX_WAVE_NAME5 + 1)*(nlabels);
-    if ((p - buffer) + expected_size > size ) {
+    expected_size = (MAX_WAVE_NAME5 + 1)*nlabels;
+    if ((p - buffer) + expected_size > size) {
         g_set_error(error, GWY_MODULE_FILE_ERROR, GWY_MODULE_FILE_ERROR_DATA,
                     _("Cannot read channel labels."));
         goto fail;
@@ -614,6 +625,7 @@ igor_read_headers(IgorFile *igorfile,
         get_CHARARRAY(wave5->whpad1, &p);
         wave5->wh_version = igorfile->get_guint16(&p);
         get_CHARARRAY0(wave5->bname, &p);
+        gwy_debug("bname %s", wave5->bname);
         wave5->whpad2 = igorfile->get_guint32(&p);
         wave5->dfolder = igorfile->get_guint32(&p);
         for (i = 0; i < MAXDIMS; i++) {
@@ -695,7 +707,7 @@ igor_read_data_field(const IgorFile *igorfile,
                      const guchar *buffer,
                      guint i,
                      const gchar *zunits,
-                     gboolean imaginary)
+                     gboolean is_imaginary)
 {
     const IgorWaveHeader5 *wave5;
     guint n, xres, yres, skip;
@@ -717,9 +729,9 @@ igor_read_data_field(const IgorFile *igorfile,
                                 FALSE);
     data = gwy_data_field_get_data(dfield);
 
-    g_return_val_if_fail(!imaginary || (wave5->type & IGOR_COMPLEX), dfield);
-    skip = imaginary ? igorfile->type_size/2 : 0;
-    if (imaginary)
+    g_return_val_if_fail(!is_imaginary || (wave5->type & IGOR_COMPLEX), dfield);
+    skip = is_imaginary ? igorfile->type_size/2 : 0;
+    if (is_imaginary)
         p += skip;
 
     /* TODO: Support extended units */
@@ -931,4 +943,299 @@ igor_get_metadata(IgorFile *igorfile,
     return igorfile->channelmeta;
 }
 
+static inline guint
+append_uint16(GByteArray *content, guint16 u16)
+{
+    guint pos = content->len;
+
+    u16 = GUINT16_TO_LE(u16);
+    g_byte_array_append(content, (guint8*)&u16, sizeof(guint16));
+    return pos;
+}
+
+static inline guint
+append_uint32(GByteArray *content, guint32 u32)
+{
+    guint pos = content->len;
+
+    u32 = GUINT32_TO_LE(u32);
+    g_byte_array_append(content, (guint8*)&u32, sizeof(guint32));
+    return pos;
+}
+
+static inline void
+append_double(GByteArray *content, gdouble dbl)
+{
+    union { guchar pp[8]; double d; } u;
+
+    u.d = dbl;
+#if (G_BYTE_ORDER == G_BIG_ENDIAN)
+    GWY_SWAP(guchar, u.pp[0], u.pp[7]);
+    GWY_SWAP(guchar, u.pp[1], u.pp[6]);
+    GWY_SWAP(guchar, u.pp[2], u.pp[5]);
+    GWY_SWAP(guchar, u.pp[3], u.pp[4]);
+#endif
+    g_byte_array_append(content, u.pp, sizeof(gdouble));
+}
+
+static inline void
+append_zeros(GByteArray *content, guint len)
+{
+    guint8 *zeros;
+    guint64 z64 = 0;
+
+    if (len <= 8) {
+        g_byte_array_append(content, (guint8*)&z64, len);
+        return;
+    }
+
+    zeros = g_new0(guint8, len);
+    g_byte_array_append(content, zeros, len);
+    g_free(zeros);
+}
+
+static inline void
+append_string(GByteArray *content, const gchar *str, guint maxlen)
+{
+    guint len;
+
+    if (!str) {
+        append_zeros(content, maxlen+1);
+        return;
+    }
+
+    len = strlen(str);
+    g_byte_array_append(content, str, MIN(len, maxlen));
+    append_zeros(content, maxlen+1 - MIN(len, maxlen));
+}
+
+static gboolean
+igor_export(GwyContainer *data,
+            const gchar *filename,
+            G_GNUC_UNUSED GwyRunType mode,
+            GError **error)
+{
+    GByteArray *header = NULL;
+    GwyDataField *dfield;
+    GwySIUnit *xyunit, *zunit;
+    const gdouble *d, *drow;
+    gfloat *dfl = NULL, *frow;
+    gint *ids = NULL;
+    FILE *fh = NULL;
+    gboolean ok = FALSE;
+    guint chksumpos;
+    guint xres, yres, n, npts, nchannels, i, j, k, wantlen;
+    gdouble xreal, yreal;
+    guint16 chksum;
+    gchar *title, *title_latin1, *unitstr;
+    gchar bname[MAX_WAVE_NAME5+1];
+    GQuark quark;
+
+    gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &dfield, 0);
+    if (!dfield) {
+        err_NO_CHANNEL_EXPORT(error);
+        return FALSE;
+    }
+
+    ids = find_compatible_channels(data, dfield, &nchannels);
+    g_return_val_if_fail(nchannels > 0, FALSE);
+
+    if (!(fh = gwy_fopen(filename, "wb"))) {
+        err_OPEN_WRITE(error);
+        g_free(ids);
+        return FALSE;
+    }
+
+    xres = gwy_data_field_get_xres(dfield);
+    yres = gwy_data_field_get_yres(dfield);
+    xreal = gwy_data_field_get_xreal(dfield);
+    yreal = gwy_data_field_get_yreal(dfield);
+    xyunit = gwy_data_field_get_si_unit_xy(dfield);
+    zunit = gwy_data_field_get_si_unit_z(dfield);
+
+    n = xres*yres;
+    npts = nchannels*n;
+
+    wantlen = HEADER_SIZE5 + WAVE_SIZE5;
+    header = g_byte_array_sized_new(wantlen);
+
+    /* File header. */
+    append_uint16(header, 0x0005u); /* Version. */
+    chksumpos = append_uint16(header, 0); /* Checksum - TBD later. */
+    append_uint32(header, WAVE_SIZE5 + npts*sizeof(gfloat)); /* WFM size */
+    append_uint32(header, 0); /* formula size */
+    append_uint32(header, 0); /* note size */
+    append_uint32(header, 0); /* extended data units size */
+    for (i = 0; i < MAXDIMS; i++)
+        append_uint32(header, 0); /* extended dimension unit sizes */
+
+    /* extended dimension label sizes: x, y, channel, 4D */
+    append_uint32(header, 0);
+    append_uint32(header, 0);
+    append_uint32(header, nchannels*(MAX_WAVE_NAME5 + 1));
+    append_uint32(header, 0);
+
+    append_uint32(header, 0); /* string indices for text waves */
+    append_uint32(header, 0); /* options1, reserved */
+    append_uint32(header, 0); /* options2, reserved */
+
+    /* Wave header. */
+    append_uint32(header, 0); /* next */
+    append_uint32(header, 0); /* creation date */
+    append_uint32(header, 0); /* modification date */
+    append_uint32(header, npts); /* npts */
+    append_uint16(header, IGOR_SINGLE); /* type */
+    append_uint16(header, 0); /* lock */
+    append_zeros(header, 6); /* whpad1 */
+    append_uint16(header, 1); /* wh_version */
+    /* Igor complains if the field is empty.  Also it does not like it being
+     * the same as something else... */
+    g_snprintf(bname, sizeof(bname), "gwy%u", g_random_int());
+    append_string(header, bname, MAX_WAVE_NAME5); /* bname */
+    append_zeros(header, 4); /* whpad2 */
+    append_uint32(header, 0); /* dfolder */
+
+    append_uint32(header, xres); /* n_dim[0] */
+    append_uint32(header, yres); /* n_dim[1] */
+    append_uint32(header, nchannels); /* n_dim[2] */
+    append_uint32(header, 0); /* n_dim[3] */
+
+    append_double(header, xreal/xres); /* sfA[0] */
+    append_double(header, yreal/yres); /* sfA[1] */
+    append_double(header, 1.0); /* sfA[2] */
+    append_double(header, 1.0); /* sfA[3] */
+
+    /* FIXME: We could store offsets but they may differ among the fields. */
+    append_double(header, 0.0); /* sfB[0] */
+    append_double(header, 0.0); /* sfB[1] */
+    append_double(header, 0.0); /* sfB[2] */
+    append_double(header, 0.0); /* sfB[3] */
+
+    /* natural data units */
+    unitstr = gwy_si_unit_get_string(zunit, GWY_SI_UNIT_FORMAT_PLAIN);
+    if (strlen(unitstr) == 1)
+        append_string(header, unitstr, MAX_UNIT_CHARS);
+    else
+        append_string(header, NULL, MAX_UNIT_CHARS);
+
+    /* dimension units */
+    unitstr = gwy_si_unit_get_string(xyunit, GWY_SI_UNIT_FORMAT_PLAIN);
+    if (strlen(unitstr) == 1) {
+        append_string(header, unitstr, MAX_UNIT_CHARS);
+        append_string(header, unitstr, MAX_UNIT_CHARS);
+    }
+    else {
+        append_string(header, NULL, MAX_UNIT_CHARS);
+        append_string(header, NULL, MAX_UNIT_CHARS);
+    }
+    g_free(unitstr);
+    for (i = 2; i < MAXDIMS; i++)
+        append_string(header, NULL, MAX_UNIT_CHARS);
+
+    append_uint16(header, 0); /* fsValid */
+    append_uint16(header, 0); /* whpad3 */
+    append_double(header, 0.0); /* top full scale */
+    append_double(header, 0.0); /* bottom full scale */
+
+    gwy_debug("header len %u", header->len);
+
+    if (header->len < wantlen)
+        append_zeros(header, wantlen - header->len);
+    chksum = igor_checksum(header->data, header->len, TRUE);
+    gwy_debug("checksum %04x", chksum);
+    chksum = ((chksum + 0xffff) & 0xffff) ^ 0xffff;
+    header->data[chksumpos] = chksum % 0x100;
+    header->data[chksumpos+1] = chksum/0x100;
+
+    if (!(ok = (fwrite(header->data, 1, header->len, fh) == header->len))) {
+        err_WRITE(error);
+        goto fail;
+    }
+
+    dfl = g_new(gfloat, n);
+    for (k = 0; ids[k] >= 0; k++) {
+        quark = gwy_app_get_data_key_for_id(ids[k]);
+        dfield = gwy_container_get_object(data, quark);
+        d = gwy_data_field_get_data_const(dfield);
+        for (i = 0; i < yres; i++) {
+            frow = dfl + i*xres;
+            drow = d + (yres-1 - i)*xres;
+            for (j = 0; j < xres; j++) {
+#if (G_BYTE_ORDER == G_BIG_ENDIAN)
+                {
+                    union { guchar pp[4]; gfloat f; } u;
+
+                    u.f = drow[j];
+                    GWY_SWAP(guchar, u.pp[0], u.pp[3]);
+                    GWY_SWAP(guchar, u.pp[1], u.pp[2]);
+                    frow[j] = u.f;
+                }
+#else
+                frow[j] = drow[j];
+#endif
+            }
+        }
+
+        if (!(ok = (fwrite(dfl, sizeof(gfloat), n, fh) == n))) {
+            err_WRITE(error);
+            goto fail;
+        }
+    }
+
+    g_byte_array_set_size(header, 0);
+    for (k = 0; ids[k] >= 0; k++) {
+        title = gwy_app_get_data_field_title(data, ids[k]);
+        title_latin1 = g_convert(title, -1, "ISO-8859-1", "UTF-8",
+                                 NULL, NULL, NULL);
+        append_string(header, title_latin1, MAX_WAVE_NAME5);
+        g_free(title_latin1);
+        g_free(title);
+    }
+
+    if (!(ok = (fwrite(header->data, 1, header->len, fh) == header->len))) {
+        err_WRITE(error);
+        goto fail;
+    }
+
+    ok = TRUE;
+
+fail:
+    fclose(fh);
+    if (!ok)
+        g_unlink(filename);
+    g_free(ids);
+    g_free(dfl);
+    if (header)
+        g_byte_array_free(header, TRUE);
+
+    return ok;
+}
+
+static gint*
+find_compatible_channels(GwyContainer *container,
+                         GwyDataField *dfield,
+                         guint *n)
+{
+    GwyDataField *otherfield;
+    GQuark quark;
+    guint i, j;
+    gint *ids;
+
+    ids = gwy_app_data_browser_get_data_ids(container);
+    for (i = j = 0; ids[i] >= 0; i++) {
+        quark = gwy_app_get_data_key_for_id(ids[i]);
+        otherfield = gwy_container_get_object(container, quark);
+        if (gwy_data_field_check_compatibility(dfield, otherfield,
+                                               GWY_DATA_COMPATIBILITY_ALL) != 0)
+            continue;
+
+        ids[j++] = ids[i];
+    }
+    g_assert(j > 0);
+    *n = j;
+    ids[j] = -1;
+
+    return ids;
+}
+
 /* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/file/imgexport.c b/modules/file/imgexport.c
index 1b4d7e4..3b68a2f 100644
--- a/modules/file/imgexport.c
+++ b/modules/file/imgexport.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: imgexport.c 19219 2016-11-09 20:12:49Z yeti-dn $
- *  Copyright (C) 2014-2016 David Necas (Yeti).
+ *  @(#) $Id: imgexport.c 19926 2017-06-17 13:20:28Z yeti-dn $
+ *  Copyright (C) 2014-2017 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -212,9 +212,7 @@ typedef struct {
     GtkObject *inset_opacity;
     GSList *inset_pos;
     GtkWidget *inset_pos_label[6];
-    GtkWidget *inset_length_label;
     GtkWidget *inset_length;
-    GtkWidget *inset_length_auto;
     GtkWidget *inset_draw_ticks;
     GtkWidget *inset_draw_label;
     GtkWidget *inset_draw_text_above;
@@ -225,7 +223,6 @@ typedef struct {
     GtkWidget *draw_mask;
     GtkWidget *draw_maskkey;
     GtkWidget *mask_key;
-    GtkWidget *mask_key_label;
     GtkObject *maskkey_gap;
     GtkWidget *interpolation;
     GSList *ztype;
@@ -298,24 +295,26 @@ typedef struct _ImgExportFormat {
     gboolean supports_transparency;
 } ImgExportFormat;
 
-static gboolean module_register         (void);
-static gint     img_export_detect       (const GwyFileDetectInfo *fileinfo,
-                                         gboolean only_name,
-                                         const gchar *name);
-static gboolean img_export_export       (GwyContainer *data,
-                                         const gchar *filename,
-                                         GwyRunType mode,
-                                         GError **error,
-                                         const gchar *name);
-static void     img_export_free_env     (ImgExportEnv *env);
-static void     img_export_load_args    (GwyContainer *container,
-                                         ImgExportArgs *args);
-static void     img_export_save_args    (GwyContainer *container,
-                                         ImgExportArgs *args);
-static gchar*   scalebar_auto_length    (GwyDataField *dfield,
-                                         gdouble *p);
-static gdouble  inset_length_ok         (GwyDataField *dfield,
-                                         const gchar *inset_length);
+static gboolean module_register     (void);
+static gint     img_export_detect   (const GwyFileDetectInfo *fileinfo,
+                                     gboolean only_name,
+                                     const gchar *name);
+static gboolean img_export_export   (GwyContainer *data,
+                                     const gchar *filename,
+                                     GwyRunType mode,
+                                     GError **error,
+                                     const gchar *name);
+static void     img_export_free_env (ImgExportEnv *env);
+static void     select_a_real_font  (ImgExportArgs *args,
+                                     GtkWidget *widget);
+static void     img_export_load_args(GwyContainer *container,
+                                     ImgExportArgs *args);
+static void     img_export_save_args(GwyContainer *container,
+                                     ImgExportArgs *args);
+static gchar*   scalebar_auto_length(GwyDataField *dfield,
+                                     gdouble *p);
+static gdouble  inset_length_ok     (GwyDataField *dfield,
+                                     const gchar *inset_length);
 
 #ifdef HAVE_PNG
 static gboolean write_image_png16(ImgExportArgs *args,
@@ -514,7 +513,7 @@ static GwyModuleInfo module_info = {
        "Export to some formats relies on GDK and other libraries thus may "
        "be installation-dependent."),
     "Yeti <yeti at gwyddion.net>",
-    "2.1",
+    "2.4",
     "David Nečas (Yeti)",
     "2014",
 };
@@ -933,12 +932,12 @@ find_hruler_ticks(const ImgExportArgs *args, ImgExportSizes *sizes,
     gwy_debug("unit '%s'", vf->units);
     offset /= vf->magnitude;
     real /= vf->magnitude;
-    format_layout_numeric(args, layout, &logical1, s,
-                          "%.*f", vf->precision, -real);
-    gwy_debug("right '%s'", s->str);
     format_layout_numeric(args, layout, &logical2, s,
                           "%.*f %s", vf->precision, offset, vf->units);
     gwy_debug("first '%s'", s->str);
+    format_layout_numeric(args, layout, &logical1, s,
+                          "%.*f", vf->precision, real + offset);
+    gwy_debug("right '%s'", s->str);
 
     height = MAX(logical1.height/pangoscale, logical2.height/pangoscale);
     sizes->hruler_label_height = height;
@@ -1177,10 +1176,13 @@ find_fmscale_ticks(const ImgExportArgs *args, ImgExportSizes *sizes,
     measure_fmscale_label(vf, args, sizes, layout, s);
     height = sizes->fmruler_label_height;
 
+    /* We can afford somewhat denser ticks for adaptive mapping.  However,
+     * when there are labels we definitely want the distance to the next tick
+     * to be much larger than to the correct tick. */
     if (env->fm_rangetype == GWY_LAYER_BASIC_RANGE_ADAPT)
-        n = CLAMP(GWY_ROUND(size/height), 1, 36);
+        n = CLAMP(GWY_ROUND(1.2*size/height), 1, 40);
     else
-        n = CLAMP(GWY_ROUND(size/height), 1, 12);
+        n = CLAMP(GWY_ROUND(0.7*size/height), 1, 15);
 
     gwy_debug("nticks %u", n);
     ticks->step = real/n;
@@ -1200,6 +1202,7 @@ find_fmscale_ticks(const ImgExportArgs *args, ImgExportSizes *sizes,
         }
     }
     gwy_debug("base %g, step %g", ticks->base, ticks->step);
+    gwy_debug("tick distance/label height ratio %g", size/n/height);
 
     if (args->fix_fmscale_precision) {
         /* Do everything as normal and override the precision at the end. */
@@ -1292,7 +1295,8 @@ measure_title(const ImgExportArgs *args, ImgExportSizes *sizes,
     if (!s->len)
         format_layout(layout, &logical, s, "%s", env->title);
 
-    /* Straight.  This is rotated according to the type when drawing. */
+    /* Straight.  This is rotated according to the type when drawing.
+     * NB: rect->h can be negative; the measurement must deal with it. */
     gap = fs*args->title_gap;
     if (args->title_type != IMGEXPORT_TITLE_FMSCALE)
         gap = MAX(gap, 0.0);
@@ -1482,7 +1486,7 @@ calculate_sizes(const ImgExportArgs *args,
     /* Canvas */
     sizes->canvas.w = sizes->fmruler.x + sizes->fmruler.w + borderw;
     if (args->title_type == IMGEXPORT_TITLE_FMSCALE)
-        sizes->canvas.w += sizes->title.h;
+        sizes->canvas.w += MAX(sizes->title.h, 0.0);
 
     sizes->canvas.h = (sizes->image.y + sizes->image.h + sizes->maskkey.h
                        + borderw);
@@ -1805,22 +1809,22 @@ draw_hruler(const ImgExportArgs *args,
             GString *s,
             cairo_t *cr)
 {
+    GwySIValueFormat *vf = sizes->vf_hruler;
     GwyDataField *dfield = args->env->dfield;
-    gdouble xreal = gwy_data_field_get_xreal(dfield);
-    gdouble xoffset = gwy_data_field_get_xoffset(dfield);
     const ImgExportRect *rect = &sizes->hruler;
     const RulerTicks *ticks = &sizes->hruler_ticks;
-    GwySIValueFormat *vf = sizes->vf_hruler;
     const GwyRGBA *color = &args->linetext_color;
     gdouble lw = sizes->sizes.line_width;
     gdouble tl = sizes->sizes.tick_length;
-    gdouble x, bs, scale, ximg;
+    gdouble x, bs, scale, ximg, xreal, xoffset;
     gboolean units_placed = FALSE;
 
     if (args->xytype != IMGEXPORT_LATERAL_RULERS)
         return;
 
-    scale = (rect->w - lw)/(xreal/vf->magnitude);
+    xreal = gwy_data_field_get_xreal(dfield)/vf->magnitude;
+    xoffset = gwy_data_field_get_xoffset(dfield)/vf->magnitude;
+    scale = (rect->w - lw)/xreal;
     bs = ticks->step*ticks->base;
 
     cairo_save(cr);
@@ -1869,21 +1873,21 @@ draw_vruler(const ImgExportArgs *args,
             GString *s,
             cairo_t *cr)
 {
+    GwySIValueFormat *vf = sizes->vf_vruler;
     GwyDataField *dfield = args->env->dfield;
-    gdouble yreal = gwy_data_field_get_yreal(dfield);
-    gdouble yoffset = gwy_data_field_get_yoffset(dfield);
     const ImgExportRect *rect = &sizes->vruler;
     const RulerTicks *ticks = &sizes->vruler_ticks;
-    GwySIValueFormat *vf = sizes->vf_vruler;
     const GwyRGBA *color = &args->linetext_color;
     gdouble lw = sizes->sizes.line_width;
     gdouble tl = sizes->sizes.tick_length;
-    gdouble y, bs, scale, yimg;
+    gdouble y, bs, scale, yimg, yreal, yoffset;
 
     if (args->xytype != IMGEXPORT_LATERAL_RULERS)
         return;
 
-    scale = (rect->h - lw)/(yreal/vf->magnitude);
+    yreal = gwy_data_field_get_yreal(dfield)/vf->magnitude;
+    yoffset = gwy_data_field_get_yoffset(dfield)/vf->magnitude;
+    scale = (rect->h - lw)/yreal;
     bs = ticks->step*ticks->base;
 
     cairo_save(cr);
@@ -2162,9 +2166,8 @@ draw_fmruler(const ImgExportArgs *args,
     gdouble lw = sizes->sizes.line_width;
     gdouble tl = sizes->sizes.tick_length;
     gdouble uw = sizes->fmruler_units_width;
-    gdouble z, bs, scale, yimg, min, max, real, w;
-    PangoRectangle logical;
-    gboolean inverted = env->fm_inverted;
+    gdouble z, bs, scale, yimg, min, max, real, w, yoff;
+    PangoRectangle logical, ink;
     GArray *mticks;
     guint nticks, i;
 
@@ -2200,8 +2203,10 @@ draw_fmruler(const ImgExportArgs *args,
         format_layout_numeric(args, layout, &logical, s,
                               "%.*f %s", vf->precision, max, vf->units);
     w = logical.width/pangoscale;
+    pango_layout_get_extents(layout, &ink, NULL);
+    yoff = (logical.height - (ink.height + ink.y))/pangoscale;
     gwy_debug("max '%s' (%g x %g)", s->str, w, logical.height/pangoscale);
-    cairo_move_to(cr, rect->w - w, lw);
+    cairo_move_to(cr, rect->w - w, lw - 0.5*yoff);
     pango_cairo_show_layout(cr, layout);
     format_layout_numeric(args, layout, &logical, s,
                           "%.*f", vf->precision, min);
@@ -2245,14 +2250,16 @@ draw_fmruler(const ImgExportArgs *args,
     cairo_set_line_width(cr, lw);
     for (i = 0; i < nticks; i++) {
         z = g_array_index(mticks, gdouble, i);
-        if (inverted)
-            yimg = (z - min)*scale + lw;
-        else
-            yimg = (max - z)*scale + lw;
-
-        if (yimg <= sizes->fmruler_label_height + 4.0*lw
-            || yimg + sizes->fmruler_label_height + 4.0*lw >= rect->h)
-            continue;
+        yimg = (max - z)*scale + lw;
+        if (env->fm_rangetype == GWY_LAYER_BASIC_RANGE_ADAPT) {
+            if (yimg <= lw || yimg + lw >= rect->h)
+                continue;
+        }
+        else {
+            if (yimg <= sizes->fmruler_label_height + 4.0*lw
+                || yimg + sizes->fmruler_label_height + 4.0*lw >= rect->h)
+                continue;
+        }
 
         cairo_move_to(cr, 0.0, yimg);
         cairo_rel_line_to(cr, tl, 0.0);
@@ -2271,12 +2278,7 @@ draw_fmruler(const ImgExportArgs *args,
     for (i = 0; i < nticks; i++) {
         z = g_array_index(mticks, gdouble, i);
         z = fixzero(z);
-
-        if (inverted)
-            yimg = (z - min)*scale + lw;
-        else
-            yimg = (max - z)*scale + lw;
-
+        yimg = (max - z)*scale + lw;
         if (yimg <= sizes->fmruler_label_height + 4.0*lw
             || yimg + 2.0*sizes->fmruler_label_height + 4.0*lw >= rect->h)
             continue;
@@ -2284,7 +2286,7 @@ draw_fmruler(const ImgExportArgs *args,
         format_layout_numeric(args, layout, &logical, s,
                               "%.*f", vf->precision, z);
         w = logical.width/pangoscale;
-        cairo_move_to(cr, rect->w - uw - w, yimg);
+        cairo_move_to(cr, rect->w - uw - w, yimg - 0.5*yoff);
         pango_cairo_show_layout(cr, layout);
     };
     cairo_restore(cr);
@@ -2979,46 +2981,60 @@ create_colour_control(GtkTable *table,
                       ImgExportColourControls *colourctrl)
 {
     GtkWidget *label, *colour, *setblack, *setwhite, *hbox;
+    GtkSizeGroup *coloursize;
+    gboolean do_unref = FALSE;
     gint ncols;
 
-    label = gtk_label_new_with_mnemonic(name);
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label,
-                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
-    hbox = gtk_hbox_new(TRUE, 4);
+    hbox = gtk_hbox_new(FALSE, 2);
     g_object_get(table, "n-columns", &ncols, NULL);
     gtk_table_attach(table, hbox,
-                     1, ncols, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, ncols-1, row, row+1, GTK_FILL, 0, 0, 0);
+
+    coloursize = g_object_get_data(G_OBJECT(table), "colour-size-group");
+    if (!coloursize) {
+        coloursize = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+        g_object_set_data(G_OBJECT(table), "colour-size-group", coloursize);
+        do_unref = TRUE;
+    }
+
+    label = gtk_label_new_with_mnemonic(name);
+    gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
 
     colour = gwy_color_button_new_with_color(target);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), colour);
-    gwy_color_button_set_use_alpha(GWY_COLOR_BUTTON(colour), FALSE);
-    gtk_box_pack_start(GTK_BOX(hbox), colour, TRUE, TRUE, 0);
-    g_object_set_data(G_OBJECT(colour), "target", target);
-    g_signal_connect_swapped(colour, "clicked",
-                             G_CALLBACK(select_colour), controls);
+
+    setwhite = gtk_button_new_with_label(_("White"));
+    gtk_size_group_add_widget(coloursize, setwhite);
+    gtk_box_pack_end(GTK_BOX(hbox), setwhite, FALSE, FALSE, 0);
+    g_object_set_data(G_OBJECT(setwhite), "target", target);
+    g_object_set_data(G_OBJECT(setwhite), "settocolour", (gpointer)&white);
+    g_object_set_data(G_OBJECT(setwhite), "colourbutton", colour);
+    g_signal_connect_swapped(setwhite, "clicked",
+                             G_CALLBACK(set_colour_to), controls);
 
     setblack = gtk_button_new_with_label(_("Black"));
-    gtk_box_pack_start(GTK_BOX(hbox), setblack, TRUE, TRUE, 0);
+    gtk_size_group_add_widget(coloursize, setblack);
+    gtk_box_pack_end(GTK_BOX(hbox), setblack, FALSE, FALSE, 0);
     g_object_set_data(G_OBJECT(setblack), "target", target);
     g_object_set_data(G_OBJECT(setblack), "settocolour", (gpointer)&black);
     g_object_set_data(G_OBJECT(setblack), "colourbutton", colour);
     g_signal_connect_swapped(setblack, "clicked",
                              G_CALLBACK(set_colour_to), controls);
 
-    setwhite = gtk_button_new_with_label(_("White"));
-    gtk_box_pack_start(GTK_BOX(hbox), setwhite, TRUE, TRUE, 0);
-    g_object_set_data(G_OBJECT(setwhite), "target", target);
-    g_object_set_data(G_OBJECT(setwhite), "settocolour", (gpointer)&white);
-    g_object_set_data(G_OBJECT(setwhite), "colourbutton", colour);
-    g_signal_connect_swapped(setwhite, "clicked",
-                             G_CALLBACK(set_colour_to), controls);
+    gtk_label_set_mnemonic_widget(GTK_LABEL(label), colour);
+    gtk_size_group_add_widget(coloursize, colour);
+    gwy_color_button_set_use_alpha(GWY_COLOR_BUTTON(colour), FALSE);
+    gtk_box_pack_end(GTK_BOX(hbox), colour, FALSE, FALSE, 0);
+    g_object_set_data(G_OBJECT(colour), "target", target);
+    g_signal_connect_swapped(colour, "clicked",
+                             G_CALLBACK(select_colour), controls);
 
     colourctrl->label = label;
     colourctrl->button = colour;
     colourctrl->setblack = setblack;
     colourctrl->setwhite = setwhite;
+
+    if (do_unref)
+        g_object_unref(coloursize);
 }
 
 static void
@@ -3029,7 +3045,7 @@ create_basic_controls(ImgExportControls *controls)
     gboolean is_vector = !!env->format->write_vector;
     gboolean can_transp = !!env->format->supports_transparency;
     const gchar *sizeunit;
-    GtkWidget *table, *spin, *label;
+    GtkWidget *table, *spin;
     GCallback width_cb, height_cb;
     gint row = 0, digits;
 
@@ -3041,7 +3057,7 @@ create_basic_controls(ImgExportControls *controls)
 
     gtk_table_attach(GTK_TABLE(table),
                      gwy_label_new_header(_("Physical Dimensions")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     if (is_vector) {
@@ -3050,21 +3066,19 @@ create_basic_controls(ImgExportControls *controls)
 
         controls->pxwidth = gtk_adjustment_new(args->pxwidth, 0.01, 254.0,
                                                0.001, 0.1, 0);
-        spin = gwy_table_attach_spinbutton(table, row, _("Pi_xel size:"), "mm",
-                                           controls->pxwidth);
+        spin = gwy_table_attach_adjbar(table, row++, _("Pi_xel size:"), "mm",
+                                       controls->pxwidth, GWY_HSCALE_LOG);
         gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
         g_signal_connect_swapped(controls->pxwidth, "value-changed",
                                  G_CALLBACK(pxwidth_changed), controls);
-        row++;
 
         controls->ppi = gtk_adjustment_new(ppi, 0.1, 2540.0, 0.01, 100.0, 0);
-        spin = gwy_table_attach_spinbutton(table, row,
-                                           _("Pixels per _inch:"), NULL,
-                                           controls->ppi);
+        spin = gwy_table_attach_adjbar(table, row++,
+                                       _("Pixels per _inch:"), NULL,
+                                       controls->ppi, GWY_HSCALE_LOG);
         gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2);
         g_signal_connect_swapped(controls->ppi, "value-changed",
                                  G_CALLBACK(ppi_changed), controls);
-        row++;
 
         sizeunit = "mm";
         digits = 1;
@@ -3085,12 +3099,11 @@ create_basic_controls(ImgExportControls *controls)
         digits = 0;
         controls->zoom = gtk_adjustment_new(args->zoom, minzoom, maxzoom,
                                             0.001, 1.0, 0);
-        spin = gwy_table_attach_spinbutton(table, row,
-                                           _("_Zoom:"), NULL, controls->zoom);
+        spin = gwy_table_attach_adjbar(table, row++, _("_Zoom:"), NULL,
+                                       controls->zoom, GWY_HSCALE_LOG);
         gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
         g_signal_connect_swapped(controls->zoom, "value-changed",
                                  G_CALLBACK(zoom_changed), controls);
-        row++;
 
         controls->width = gtk_adjustment_new(w, 2.0, 16384.0, 1.0, 10.0, 0);
         controls->height = gtk_adjustment_new(h, 2.0, 16384.0, 1.0, 10.0, 0);
@@ -3098,98 +3111,85 @@ create_basic_controls(ImgExportControls *controls)
         height_cb = G_CALLBACK(height_changed_pixmap);
     }
 
-    spin = gwy_table_attach_spinbutton(table, row, _("_Width:"), sizeunit,
-                                       controls->width);
+    spin = gwy_table_attach_adjbar(table, row++, _("_Width:"), sizeunit,
+                                   controls->width, GWY_HSCALE_LOG);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), digits);
     g_signal_connect_swapped(controls->width, "value-changed",
                              G_CALLBACK(width_cb), controls);
-    row++;
 
-    spin = gwy_table_attach_spinbutton(table, row, _("_Height:"), sizeunit,
-                                       controls->height);
+    spin = gwy_table_attach_adjbar(table, row++, _("_Height:"), sizeunit,
+                                   controls->height, GWY_HSCALE_LOG);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), digits);
     g_signal_connect_swapped(controls->height, "value-changed",
                              height_cb, controls);
-    row++;
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     gtk_table_attach(GTK_TABLE(table),
                      gwy_label_new_header(_("Parameters")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
-    label = gtk_label_new_with_mnemonic(_("_Font:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
     controls->font = gtk_font_button_new();
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls->font);
     gtk_font_button_set_show_size(GTK_FONT_BUTTON(controls->font), FALSE);
     gtk_font_button_set_use_font(GTK_FONT_BUTTON(controls->font), TRUE);
     update_selected_font(controls);
-    gtk_table_attach(GTK_TABLE(table), controls->font,
-                     1, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gwy_table_attach_adjbar(table, row++, _("_Font:"), NULL,
+                            GTK_OBJECT(controls->font),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     g_signal_connect_swapped(controls->font, "font-set",
                              G_CALLBACK(font_changed), controls);
-    row++;
 
     controls->font_size = gtk_adjustment_new(args->sizes.font_size,
                                              1.0, 1024.0, 1.0, 10.0, 0);
-    spin = gwy_table_attach_spinbutton(GTK_WIDGET(table), row,
-                                       _("_Font size:"), NULL,
-                                       controls->font_size);
+    spin = gwy_table_attach_adjbar(GTK_WIDGET(table), row++,
+                                   _("_Font size:"), NULL,
+                                   controls->font_size, GWY_HSCALE_LOG);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 1);
     g_signal_connect_swapped(controls->font_size, "value-changed",
                              G_CALLBACK(font_size_changed), controls);
-    row++;
 
     controls->line_width = gtk_adjustment_new(args->sizes.line_width,
                                               0.0, 16.0, 0.01, 1.0, 0);
-    spin = gwy_table_attach_spinbutton(GTK_WIDGET(table), row,
-                                       _("Line t_hickness:"), NULL,
-                                       controls->line_width);
+    spin = gwy_table_attach_adjbar(GTK_WIDGET(table), row++,
+                                   _("Line t_hickness:"), NULL,
+                                   controls->line_width, GWY_HSCALE_SQRT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2);
     g_signal_connect_swapped(controls->line_width, "value-changed",
                              G_CALLBACK(line_width_changed), controls);
-    row++;
 
     controls->outline_width = gtk_adjustment_new(args->sizes.outline_width,
                                                  0.0, 16.0, 0.01, 1.0, 0);
-    spin = gwy_table_attach_spinbutton(GTK_WIDGET(table), row,
-                                       _("O_utline thickness:"), NULL,
-                                       controls->outline_width);
+    spin = gwy_table_attach_adjbar(GTK_WIDGET(table), row++,
+                                   _("O_utline thickness:"), NULL,
+                                   controls->outline_width, GWY_HSCALE_SQRT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2);
     g_signal_connect_swapped(controls->outline_width, "value-changed",
                              G_CALLBACK(outline_width_changed), controls);
-    row++;
 
     controls->border_width = gtk_adjustment_new(args->sizes.border_width,
                                                 0.0, 1024.0, 0.1, 1.0, 0);
-    spin = gwy_table_attach_spinbutton(GTK_WIDGET(table), row,
-                                       _("_Border width:"), NULL,
-                                       controls->border_width);
+    spin = gwy_table_attach_adjbar(GTK_WIDGET(table), row++,
+                                   _("_Border width:"), NULL,
+                                   controls->border_width, GWY_HSCALE_SQRT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 1);
     g_signal_connect_swapped(controls->border_width, "value-changed",
                              G_CALLBACK(border_width_changed), controls);
-    row++;
 
     controls->tick_length = gtk_adjustment_new(args->sizes.tick_length,
                                                0.0, 1024.0, 0.1, 1.0, 0);
-    spin = gwy_table_attach_spinbutton(GTK_WIDGET(table), row,
-                                       _("_Tick length:"), NULL,
-                                       controls->tick_length);
+    spin = gwy_table_attach_adjbar(GTK_WIDGET(table), row++,
+                                   _("_Tick length:"), NULL,
+                                   controls->tick_length, GWY_HSCALE_SQRT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 1);
     g_signal_connect_swapped(controls->tick_length, "value-changed",
                              G_CALLBACK(tick_length_changed), controls);
-    row++;
 
     controls->scale_font
         = gtk_check_button_new_with_mnemonic(_("Tie sizes to _data pixels"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->scale_font),
                                  args->scale_font);
     gtk_table_attach(GTK_TABLE(table), controls->scale_font,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls->scale_font, "toggled",
                              G_CALLBACK(scale_font_changed), controls);
     row++;
@@ -3200,7 +3200,7 @@ create_basic_controls(ImgExportControls *controls)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->decomma),
                                  args->decomma);
     gtk_table_attach(GTK_TABLE(table), controls->decomma,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls->decomma, "toggled",
                              G_CALLBACK(decimal_comma_changed), controls);
     row++;
@@ -3208,13 +3208,12 @@ create_basic_controls(ImgExportControls *controls)
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     gtk_table_attach(GTK_TABLE(table),
                      gwy_label_new_header(_("Colors")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     create_colour_control(GTK_TABLE(table), row++,
                           _("_Line and text color:"), &args->linetext_color,
                           controls, &controls->linetext_colour);
-    row++;
 
     if (can_transp) {
         controls->transparent_bg
@@ -3222,7 +3221,7 @@ create_basic_controls(ImgExportControls *controls)
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->transparent_bg),
                                      args->transparent_bg);
         gtk_table_attach(GTK_TABLE(table), controls->transparent_bg,
-                         0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         g_signal_connect_swapped(controls->transparent_bg, "toggled",
                                  G_CALLBACK(transparent_bg_changed), controls);
         row++;
@@ -3231,7 +3230,6 @@ create_basic_controls(ImgExportControls *controls)
     create_colour_control(GTK_TABLE(table), row++,
                           _("_Background color:"), &args->bg_color,
                           controls, &controls->bg_colour);
-    row++;
 
     update_basic_sensitivity(controls);
 }
@@ -3248,9 +3246,8 @@ update_lateral_sensitivity(ImgExportControls *controls)
     update_colour_controls_sensitivity(&controls->inset_outline_colour,
                                        insetsens);
     gwy_table_hscale_set_sensitive(controls->inset_opacity, insetsens);
-    gtk_widget_set_sensitive(controls->inset_length_label, insetsens);
-    gtk_widget_set_sensitive(controls->inset_length, insetsens);
-    gtk_widget_set_sensitive(controls->inset_length_auto, insetsens);
+    gwy_table_hscale_set_sensitive(GTK_OBJECT(controls->inset_length),
+                                   insetsens);
     gtk_widget_set_sensitive(controls->inset_draw_ticks, insetsens);
     gtk_widget_set_sensitive(controls->inset_draw_label, insetsens);
     gtk_widget_set_sensitive(controls->inset_draw_text_above, insetsens);
@@ -3277,17 +3274,12 @@ update_value_sensitivity(ImgExportControls *controls)
 
     gwy_table_hscale_set_sensitive(controls->fmscale_gap, fmsens);
     gwy_table_hscale_set_sensitive(controls->fmscale_precision, fmsens);
-    gtk_widget_set_sensitive(gwy_table_hscale_get_check(controls->fmscale_precision),
-                             fmsens);
     gwy_table_hscale_set_sensitive(controls->kilo_threshold,
-                                   fmsens || titlesens);
-    gtk_widget_set_sensitive(gwy_table_hscale_get_check(controls->kilo_threshold),
-                             fmsens || titlesens);
+                                   (fmsens || titlesens));
     gwy_table_hscale_set_sensitive(controls->title_gap, titlesens);
     gtk_widget_set_sensitive(controls->draw_frame, framesens);
     gtk_widget_set_sensitive(controls->draw_maskkey, masksens);
-    gtk_widget_set_sensitive(controls->mask_key, maskkeysens);
-    gtk_widget_set_sensitive(controls->mask_key_label, maskkeysens);
+    gwy_table_hscale_set_sensitive(GTK_OBJECT(controls->mask_key), maskkeysens);
     gwy_table_hscale_set_sensitive(controls->maskkey_gap, maskkeysens);
 }
 
@@ -3408,72 +3400,85 @@ inset_length_changed(ImgExportControls *controls,
         update_preview(controls);
 }
 
-static GtkObject*
-attach_gap(GtkWidget *table,
-           const gchar *label,
-           gint row,
-           gdouble max,
-           gdouble value)
-{
-    GtkWidget *widget;
-    GtkObject *adj;
-
-    adj = gtk_adjustment_new(value, 0.0, max, 0.01, 0.1, 0);
-    gwy_table_attach_hscale(table, row, label, NULL, adj, GWY_HSCALE_DEFAULT);
-
-    /* Make the hscale take more columns to accommodate for inset position
-     * controls. */
-    widget = gwy_table_get_child_widget(table, row, 2);
-    g_object_ref(widget);
-    gtk_container_remove(GTK_CONTAINER(table), widget);
-    gtk_table_attach(GTK_TABLE(table), widget,
-                     3, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    g_object_unref(widget);
-
-    widget = gwy_table_get_child_widget(table, row, 1);
-    g_object_ref(widget);
-    gtk_container_remove(GTK_CONTAINER(table), widget);
-    gtk_table_attach(GTK_TABLE(table), widget,
-                     1, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    g_object_unref(widget);
-
-    return adj;
-}
-
 static void
 inset_pos_add(ImgExportControls *controls,
-              GtkTable *table,
-              InsetPosType pos,
-              gint col, gint row)
+              GtkTable *table, gint row, gint col,
+              InsetPosType pos)
 {
-    GtkWidget *button;
+    GtkWidget *button, *align;
 
+    align = gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
+    gtk_table_attach(table, align, col, col+1, row, row+1, GTK_FILL, 0, 0, 0);
     button = gtk_radio_button_new_with_label(controls->inset_pos, NULL);
     if (pos == controls->args->inset_pos)
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
     controls->inset_pos = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
     g_object_set_qdata(G_OBJECT(button), controls->rb_quark,
                        GUINT_TO_POINTER(pos));
-    gtk_table_attach(table, button, col, col+1, row, row+1, 0, 0, 0, 0);
+    gtk_container_add(GTK_CONTAINER(align), button);
     g_signal_connect_swapped(button, "clicked",
                              G_CALLBACK(inset_pos_changed), controls);
 }
 
+static GtkWidget*
+create_inset_pos_table(ImgExportControls *controls)
+{
+    GtkWidget *label;
+    GtkTable *table;
+
+    table = GTK_TABLE(gtk_table_new(3, 4, FALSE));
+    gtk_table_set_row_spacings(table, 2);
+    gtk_table_set_col_spacings(table, 6);
+
+    controls->inset_pos_label[0] = label = gwy_label_new_header(_("Placement"));
+    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+    gtk_table_attach(table, label, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+
+    controls->inset_pos_label[1] = label = gtk_label_new(_("left"));
+    gtk_table_attach(table, label, 1, 2, 0, 1, GTK_FILL, 0, 0, 0);
+
+    controls->inset_pos_label[2] = label = gtk_label_new(_("center"));
+    gtk_table_attach(table, label, 2, 3, 0, 1, GTK_FILL, 0, 0, 0);
+
+    controls->inset_pos_label[3] = label = gtk_label_new(_("right"));
+    gtk_table_attach(table, label, 3, 4, 0, 1, GTK_FILL, 0, 0, 0);
+
+    controls->rb_quark = g_quark_from_string("gwy-radiobuttons-key");
+
+    controls->inset_pos_label[4] = label = gtk_label_new(_("top"));
+    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
+    gtk_table_attach(table, label, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+
+    inset_pos_add(controls, table, 1, 1, INSET_POS_TOP_LEFT);
+    inset_pos_add(controls, table, 1, 2, INSET_POS_TOP_CENTER);
+    inset_pos_add(controls, table, 1, 3, INSET_POS_TOP_RIGHT);
+
+    controls->inset_pos_label[5] = label = gtk_label_new(_("bottom"));
+    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
+    gtk_table_attach(table, label, 0, 1, 2, 3, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+
+    inset_pos_add(controls, table, 2, 1, INSET_POS_BOTTOM_LEFT);
+    inset_pos_add(controls, table, 2, 2, INSET_POS_BOTTOM_CENTER);
+    inset_pos_add(controls, table, 2, 3, INSET_POS_BOTTOM_RIGHT);
+
+    return GTK_WIDGET(table);
+}
+
 static void
 create_lateral_controls(ImgExportControls *controls)
 {
     ImgExportArgs *args = controls->args;
-    GtkWidget *table, *label;
+    GtkWidget *table, *label, *button, *postable;
     gint row = 0;
 
-    table = controls->table_lateral = gtk_table_new(18, 4, FALSE);
+    table = controls->table_lateral = gtk_table_new(15, 3, FALSE);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
 
     label = gwy_label_new_header(_("Lateral scale"));
     gtk_table_attach(GTK_TABLE(table), label, 0, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     row++;
 
     controls->xytype
@@ -3481,116 +3486,76 @@ create_lateral_controls(ImgExportControls *controls)
                                    G_CALLBACK(xytype_changed), controls,
                                    args->xytype);
     row = gwy_radio_buttons_attach_to_table(controls->xytype, GTK_TABLE(table),
-                                            3, row);
-
-    controls->inset_length_label
-        = label = gtk_label_new_with_mnemonic(_("_Length:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                                            2, row);
 
     controls->inset_length = gtk_entry_new();
     gtk_entry_set_width_chars(GTK_ENTRY(controls->inset_length), 8);
     gtk_entry_set_text(GTK_ENTRY(controls->inset_length),
                        controls->args->inset_length);
     gwy_widget_set_activate_on_unfocus(controls->inset_length, TRUE);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls->inset_length);
+    gwy_table_attach_adjbar(table, row, _("_Length:"), NULL,
+                            GTK_OBJECT(controls->inset_length),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     g_signal_connect_swapped(controls->inset_length, "activate",
                              G_CALLBACK(inset_length_changed), controls);
-    gtk_table_attach(GTK_TABLE(table), controls->inset_length,
-                     1, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
 
-    controls->inset_length_auto = gtk_button_new_with_mnemonic(_("_Auto"));
-    g_signal_connect_swapped(controls->inset_length_auto, "clicked",
+    button = gtk_button_new_with_mnemonic(_("_Auto"));
+    g_object_set_data(G_OBJECT(controls->inset_length), "units", button);
+    g_signal_connect_swapped(button, "clicked",
                              G_CALLBACK(inset_length_set_auto), controls);
-    gtk_table_attach(GTK_TABLE(table), controls->inset_length_auto,
-                     3, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), button,
+                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
-    controls->inset_pos_label[0] = label = gwy_label_new_header(_("Placement"));
-    gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    controls->inset_pos_label[1] = label = gtk_label_new(_("left"));
-    gtk_table_attach(GTK_TABLE(table), label, 1, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    controls->inset_pos_label[2] = label = gtk_label_new(_("center"));
-    gtk_table_attach(GTK_TABLE(table), label, 2, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    controls->inset_pos_label[3] = label = gtk_label_new(_("right"));
-    gtk_table_attach(GTK_TABLE(table), label, 3, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    row++;
-
-    controls->inset_pos_label[4] = label = gtk_label_new(_("top"));
-    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    controls->rb_quark = g_quark_from_string("gwy-radiobuttons-key");
-
-    inset_pos_add(controls, GTK_TABLE(table), INSET_POS_TOP_LEFT, 1, row);
-    inset_pos_add(controls, GTK_TABLE(table), INSET_POS_TOP_CENTER, 2, row);
-    inset_pos_add(controls, GTK_TABLE(table), INSET_POS_TOP_RIGHT, 3, row);
-    row++;
-
-    controls->inset_pos_label[5] = label = gtk_label_new(_("bottom"));
-    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    inset_pos_add(controls, GTK_TABLE(table), INSET_POS_BOTTOM_LEFT, 1, row);
-    inset_pos_add(controls, GTK_TABLE(table), INSET_POS_BOTTOM_CENTER, 2, row);
-    inset_pos_add(controls, GTK_TABLE(table), INSET_POS_BOTTOM_RIGHT, 3, row);
+    postable = create_inset_pos_table(controls);
+    gtk_table_attach(GTK_TABLE(table), postable,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
-
-    controls->inset_xgap = attach_gap(table, _("Hori_zontal gap:"), row, 4.0,
-                                      args->inset_xgap);
+    controls->inset_xgap = gtk_adjustment_new(args->inset_xgap,
+                                              0.0, 4.0, 0.01, 0.1, 0);
+    gwy_table_attach_adjbar(table, row++, _("Hori_zontal gap:"), NULL,
+                            controls->inset_xgap, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls->inset_xgap, "value-changed",
                              G_CALLBACK(inset_xgap_changed), controls);
-    row++;
 
-    controls->inset_ygap = attach_gap(table, _("_Vertical gap:"), row, 2.0,
-                                      args->inset_ygap);
+    controls->inset_ygap = gtk_adjustment_new(args->inset_ygap,
+                                              0.0, 2.0, 0.01, 0.1, 0);
+    gwy_table_attach_adjbar(table, row++, _("_Vertical gap:"), NULL,
+                            controls->inset_ygap, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls->inset_ygap, "value-changed",
                              G_CALLBACK(inset_ygap_changed), controls);
-    row++;
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gwy_label_new_header(_("Options"));
-    gtk_table_attach(GTK_TABLE(table), label, 0, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
     row++;
 
     create_colour_control(GTK_TABLE(table), row++,
                           _("Colo_r:"), &args->inset_color,
                           controls, &controls->inset_colour);
-    row++;
 
     create_colour_control(GTK_TABLE(table), row++,
                           _("Out_line color:"), &args->inset_outline_color,
                           controls, &controls->inset_outline_colour);
-    row++;
 
-    controls->inset_opacity = attach_gap(table, _("O_pacity:"), row, 1.0,
-                                         args->inset_color.a);
+    controls->inset_opacity = gtk_adjustment_new(args->inset_color.a,
+                                                 0.0, 1.0, 0.001, 0.1, 0);
+    gwy_table_attach_adjbar(table, row++, _("O_pacity:"), NULL,
+                            controls->inset_opacity, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls->inset_opacity, "value-changed",
                              G_CALLBACK(inset_opacity_changed), controls);
-    row++;
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
-
     controls->inset_draw_ticks
         = gtk_check_button_new_with_mnemonic(_("Draw _ticks"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->inset_draw_ticks),
                                  args->inset_draw_ticks);
     gtk_table_attach(GTK_TABLE(table), controls->inset_draw_ticks,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls->inset_draw_ticks, "toggled",
                              G_CALLBACK(inset_draw_ticks_changed), controls);
     row++;
@@ -3600,7 +3565,7 @@ create_lateral_controls(ImgExportControls *controls)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->inset_draw_label),
                                  args->inset_draw_label);
     gtk_table_attach(GTK_TABLE(table), controls->inset_draw_label,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls->inset_draw_label, "toggled",
                              G_CALLBACK(inset_draw_label_changed), controls);
     row++;
@@ -3610,7 +3575,7 @@ create_lateral_controls(ImgExportControls *controls)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->inset_draw_text_above),
                                  args->inset_draw_text_above);
     gtk_table_attach(GTK_TABLE(table), controls->inset_draw_text_above,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls->inset_draw_text_above, "toggled",
                              G_CALLBACK(inset_draw_text_above_changed),
                              controls);
@@ -3771,13 +3736,13 @@ create_value_controls(ImgExportControls *controls)
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
 
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Image")),
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     label = gtk_label_new_with_mnemonic(_("_Interpolation type:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
 
     if (controls->args->env->format->write_vector) {
         /* Vector formats can only handle these two. */
@@ -3800,14 +3765,14 @@ create_value_controls(ImgExportControls *controls)
     }
     gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls->interpolation);
     gtk_table_attach(GTK_TABLE(table), controls->interpolation,
-                     1, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     1, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls->draw_frame
         = check = gtk_check_button_new_with_mnemonic(_("Draw _frame"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), args->draw_frame);
-    gtk_table_attach(GTK_TABLE(table), check, 0, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), check, 0, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(check, "toggled",
                              G_CALLBACK(draw_frame_changed), controls);
     row++;
@@ -3816,8 +3781,8 @@ create_value_controls(ImgExportControls *controls)
         = check = gtk_check_button_new_with_mnemonic(_("Draw _mask"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), args->draw_mask);
     gtk_widget_set_sensitive(check, !!env->mask);
-    gtk_table_attach(GTK_TABLE(table), check, 0, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), check, 0, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(check, "toggled",
                              G_CALLBACK(draw_mask_changed), controls);
     row++;
@@ -3826,40 +3791,33 @@ create_value_controls(ImgExportControls *controls)
         = check = gtk_check_button_new_with_mnemonic(_("Draw mask _legend"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), args->draw_maskkey);
     gtk_widget_set_sensitive(check, !!env->mask && args->draw_mask);
-    gtk_table_attach(GTK_TABLE(table), check, 0, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), check, 0, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(check, "toggled",
                              G_CALLBACK(draw_maskkey_changed), controls);
     row++;
 
-    controls->mask_key_label
-        = label = gtk_label_new_with_mnemonic(_("_Label:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
     controls->mask_key = gtk_entry_new();
     gtk_entry_set_width_chars(GTK_ENTRY(controls->mask_key), 8);
     gtk_entry_set_text(GTK_ENTRY(controls->mask_key), controls->args->mask_key);
     gwy_widget_set_activate_on_unfocus(controls->mask_key, TRUE);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls->mask_key);
     g_signal_connect_swapped(controls->mask_key, "activate",
                              G_CALLBACK(mask_key_changed), controls);
-    gtk_table_attach(GTK_TABLE(table), controls->mask_key,
-                     1, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gwy_table_attach_adjbar(table, row++, _("_Label:"), NULL,
+                            GTK_OBJECT(controls->mask_key), GWY_HSCALE_WIDGET);
     row++;
 
     controls->maskkey_gap = gtk_adjustment_new(args->maskkey_gap,
                                                0.0, 2.0, 0.01, 0.1, 0);
-    gwy_table_attach_hscale(table, row, _("_Vertical gap:"), NULL,
-                            controls->maskkey_gap, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("_Vertical gap:"), NULL,
+                            controls->maskkey_gap, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls->maskkey_gap, "value-changed",
                              G_CALLBACK(maskkey_gap_changed), controls);
     row++;
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Value Scale")),
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls->ztype
@@ -3867,26 +3825,25 @@ create_value_controls(ImgExportControls *controls)
                                    G_CALLBACK(ztype_changed), controls,
                                    args->ztype);
     row = gwy_radio_buttons_attach_to_table(controls->ztype,
-                                            GTK_TABLE(table), 3, row);
+                                            GTK_TABLE(table), 2, row);
 
     controls->fmscale_gap = gtk_adjustment_new(args->fmscale_gap,
                                                0.0, 2.0, 0.01, 0.1, 0);
-    gwy_table_attach_hscale(table, row, _("Hori_zontal gap:"), NULL,
-                            controls->fmscale_gap, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("Hori_zontal gap:"), NULL,
+                            controls->fmscale_gap, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls->fmscale_gap, "value-changed",
                              G_CALLBACK(fmscale_gap_changed), controls);
     row++;
 
     controls->fmscale_precision = gtk_adjustment_new(args->fmscale_precision,
                                                      0.0, 16.0, 1.0, 5.0, 0);
-    gwy_table_attach_hscale(table, row, _("Fi_xed precision:"), NULL,
-                            controls->fmscale_precision, GWY_HSCALE_CHECK);
+    gwy_table_attach_adjbar(table, row, _("Fi_xed precision:"), NULL,
+                            controls->fmscale_precision,
+                            GWY_HSCALE_LINEAR | GWY_HSCALE_CHECK | GWY_HSCALE_SNAP);
     controls->fix_fmscale_precision
         = gwy_table_hscale_get_check(controls->fmscale_precision);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->fix_fmscale_precision),
                                  args->fix_fmscale_precision);
-    gwy_table_hscale_set_sensitive(controls->fmscale_precision,
-                                   args->fix_fmscale_precision);
     g_signal_connect_swapped(controls->fmscale_precision, "value-changed",
                              G_CALLBACK(fmscale_precision_changed), controls);
     g_signal_connect_swapped(controls->fix_fmscale_precision, "toggled",
@@ -3895,15 +3852,13 @@ create_value_controls(ImgExportControls *controls)
 
     controls->kilo_threshold = gtk_adjustment_new(args->kilo_threshold,
                                                   1.0, 100000.0, 1.0, 100.0, 0);
-    gwy_table_attach_hscale(table, row, _("Fixed _kilo threshold:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("Fixed _kilo threshold:"), NULL,
                             controls->kilo_threshold,
                             GWY_HSCALE_CHECK | GWY_HSCALE_LOG);
     controls->fix_kilo_threshold
         = gwy_table_hscale_get_check(controls->kilo_threshold);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->fix_kilo_threshold),
                                  args->fix_kilo_threshold);
-    gwy_table_hscale_set_sensitive(controls->kilo_threshold,
-                                   args->fix_kilo_threshold);
     g_signal_connect_swapped(controls->kilo_threshold, "value-changed",
                              G_CALLBACK(kilo_threshold_changed), controls);
     g_signal_connect_swapped(controls->fix_kilo_threshold, "toggled",
@@ -3912,27 +3867,22 @@ create_value_controls(ImgExportControls *controls)
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Title")),
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
-    label = gtk_label_new_with_mnemonic(_("Posi_tion:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
     controls->title_type
         = gwy_enum_combo_box_new(title_types, G_N_ELEMENTS(title_types),
                                  G_CALLBACK(title_type_changed), controls,
                                  args->title_type, TRUE);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls->title_type);
-    gtk_table_attach(GTK_TABLE(table), controls->title_type,
-                     1, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gwy_table_attach_adjbar(table, row, _("Posi_tion:"), NULL,
+                            GTK_OBJECT(controls->title_type),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     controls->title_gap = gtk_adjustment_new(args->title_gap,
-                                             -1.0, 1.0, 0.01, 0.1, 0);
-    gwy_table_attach_hscale(table, row, _("_Gap:"), NULL,
-                            controls->title_gap, GWY_HSCALE_DEFAULT);
+                                             -2.0, 1.0, 0.01, 0.1, 0);
+    gwy_table_attach_adjbar(table, row, _("_Gap:"), NULL,
+                            controls->title_gap, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls->title_gap, "value-changed",
                              G_CALLBACK(title_gap_changed), controls);
     row++;
@@ -3941,8 +3891,8 @@ create_value_controls(ImgExportControls *controls)
         = check = gtk_check_button_new_with_mnemonic(_("Put _units to title"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->units_in_title),
                                  args->units_in_title);
-    gtk_table_attach(GTK_TABLE(table), check, 0, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), check, 0, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(check, "toggled",
                              G_CALLBACK(units_in_title_changed), controls);
     row++;
@@ -4126,7 +4076,7 @@ create_selection_controls(ImgExportControls *controls)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
                                  args->draw_selection);
     gtk_table_attach(GTK_TABLE(table), check, 0, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(check, "toggled",
                              G_CALLBACK(draw_selection_changed), controls);
     row++;
@@ -4136,7 +4086,7 @@ create_selection_controls(ImgExportControls *controls)
     controls->selections = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
     treeview = GTK_TREE_VIEW(controls->selections);
     gtk_table_attach(GTK_TABLE(table), controls->selections, 0, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+                     GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
     row++;
 
     treesel = gtk_tree_view_get_selection(treeview);
@@ -4183,17 +4133,15 @@ create_selection_controls(ImgExportControls *controls)
     create_colour_control(GTK_TABLE(table), row++,
                           _("Colo_r:"), &args->sel_color,
                           controls, &controls->sel_colour);
-    row++;
 
     create_colour_control(GTK_TABLE(table), row++,
                           _("Out_line color:"), &args->sel_outline_color,
                           controls, &controls->sel_outline_colour);
-    row++;
 
     controls->sel_opacity = gtk_adjustment_new(args->sel_color.a,
                                                0.0, 1.0, 0.001, 0.1, 0);
-    gwy_table_attach_hscale(table, row, _("O_pacity:"), NULL,
-                            controls->sel_opacity, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("O_pacity:"), NULL,
+                            controls->sel_opacity, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls->sel_opacity, "value-changed",
                              G_CALLBACK(sel_opacity_changed), controls);
     row++;
@@ -4202,7 +4150,7 @@ create_selection_controls(ImgExportControls *controls)
 
     controls->sel_options_label = gwy_label_new_header(_("Options"));
     gtk_table_attach(GTK_TABLE(table), controls->sel_options_label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls->sel_row_start = row;
@@ -4245,7 +4193,7 @@ reset_to_preset(ImgExportControls *controls,
     args->linetext_color = src->linetext_color;
     gwy_color_button_set_color(GWY_COLOR_BUTTON(controls->linetext_colour.button),
                                &args->linetext_color);
-    args->bg_color = src->linetext_color;
+    args->bg_color = src->bg_color;
     gwy_color_button_set_color(GWY_COLOR_BUTTON(controls->bg_colour.button),
                                &args->bg_color);
 
@@ -4764,6 +4712,7 @@ img_export_dialog(ImgExportArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     g_free(title);
     controls.dialog = dialog;
+    select_a_real_font(args, dialog);
     g_signal_connect_swapped(dialog, "destroy",
                              G_CALLBACK(unqueue_preview), &controls);
 
@@ -6458,7 +6407,7 @@ options_sel_line(ImgExportControls *controls)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
                                  args->sel_number_objects);
     gtk_table_attach(table, check, 0, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(check, "toggled",
                              G_CALLBACK(sel_number_objects_changed), controls);
     controls->sel_options = g_slist_prepend(controls->sel_options, check);
@@ -6489,7 +6438,7 @@ options_sel_point(ImgExportControls *controls)
     g_signal_connect_swapped(check, "toggled",
                              G_CALLBACK(sel_number_objects_changed), controls);
     gtk_table_attach(table, check, 0, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     controls->sel_options = g_slist_prepend(controls->sel_options, check);
     row++;
 
@@ -6572,6 +6521,64 @@ static const gchar zoom_key[]                  = "/module/pixmap/zoom";
 static const gchar ztype_key[]                 = "/module/pixmap/ztype";
 
 static void
+select_a_real_font(ImgExportArgs *args, GtkWidget *widget)
+{
+    static const gchar *fonts_to_try[] = {
+        /* Linux */
+        "Liberation Sans",
+        "Nimbus Sans L",
+        /* OS X */
+        "Lucida Grande",
+        "Helvetica Neue",
+        /* Windows, but Arial is quite ubiquitous. */
+        "Arial",
+        "Helvetica",
+        /* Alias, can be something odd... */
+        "Sans",
+    };
+
+    PangoContext *context;
+    PangoFontFamily **families = NULL;
+    const gchar *name, *currname;
+    gint nfamilies, i;
+    guint j;
+
+    context = gtk_widget_get_pango_context(widget);
+    pango_context_list_families(context, &families, &nfamilies);
+
+    currname = args->font;
+    for (i = 0; i < nfamilies; i++) {
+        name = pango_font_family_get_name(families[i]);
+        if (g_ascii_strcasecmp(currname, name) == 0) {
+            /* The font from settings seems available.   Use it. */
+            gwy_debug("found font %s", currname);
+            g_free(families);
+            return;
+        }
+    }
+    gwy_debug("did not find font %s", currname);
+
+    /* We do not have the font from settings.  Try to find some other sane
+     * sans font. */
+    for (j = 0; j < G_N_ELEMENTS(fonts_to_try); j++) {
+        currname = fonts_to_try[j];
+        for (i = 0; i < nfamilies; i++) {
+            name = pango_font_family_get_name(families[i]);
+            if (g_ascii_strcasecmp(currname, name) == 0) {
+                gwy_debug("found font %s", currname);
+                g_free(args->font);
+                args->font = g_strdup(currname);
+                g_free(families);
+                return;
+            }
+        }
+    }
+
+    /* Shrug and proceed... */
+    g_free(families);
+}
+
+static void
 img_export_free_env(ImgExportEnv *env)
 {
     if (env->grey)
diff --git a/modules/file/imgexportpreset.h b/modules/file/imgexportpreset.h
index 486429d..d51a69e 100644
--- a/modules/file/imgexportpreset.h
+++ b/modules/file/imgexportpreset.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: imgexportpreset.h 19082 2016-10-14 20:40:18Z dn2010 $
+ *  @(#) $Id: imgexportpreset.h 19917 2017-06-15 12:28:10Z yeti-dn $
  *  Copyright (C) 2014-2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -162,7 +162,7 @@ static const ImgExportArgs img_export_defaults = {
     GWYRGBA_WHITE, GWYRGBA_WHITE, INSET_POS_BOTTOM_RIGHT,
     GWYRGBA_BLACK, GWYRGBA_WHITE, TRUE,
     TRUE, TRUE, FALSE, TRUE,
-    "Helvetica", TRUE,
+    "Arial", TRUE,
     FALSE, TRUE, TRUE, FALSE,
     1.0, 1.0, 1.0, 0.0, 1.0,
     FALSE, 2,
@@ -269,7 +269,7 @@ img_export_sanitize_args(ImgExportArgs *args)
     args->fmscale_gap = CLAMP(args->fmscale_gap, 0.0, 2.0);
     args->inset_xgap = CLAMP(args->inset_xgap, 0.0, 4.0);
     args->inset_ygap = CLAMP(args->inset_ygap, 0.0, 2.0);
-    args->title_gap = CLAMP(args->title_gap, -1.0, 1.0);
+    args->title_gap = CLAMP(args->title_gap, -2.0, 1.0);
     args->fix_fmscale_precision = !!args->fix_fmscale_precision;
     args->fmscale_precision = CLAMP(args->fmscale_precision, 0, 16);
     args->fix_kilo_threshold = !!args->fix_kilo_threshold;
diff --git a/modules/file/intelliwave.c b/modules/file/intelliwave.c
index 99c7c20..ed9c43a 100644
--- a/modules/file/intelliwave.c
+++ b/modules/file/intelliwave.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: intelliwave.c 19216 2016-11-09 10:39:06Z yeti-dn $
+ *  $Id: intelliwave.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -235,7 +235,7 @@ static GwyModuleInfo module_info = {
     "2016",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, intelliwave)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/intematix.c b/modules/file/intematix.c
index 17cf641..ae73dba 100644
--- a/modules/file/intematix.c
+++ b/modules/file/intematix.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: intematix.c 17718 2015-11-06 08:04:04Z pecold $
+ *  @(#) $Id: intematix.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2007 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -129,7 +129,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, intematix)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/iso28600.c b/modules/file/iso28600.c
index 29ac22d..da1f936 100644
--- a/modules/file/iso28600.c
+++ b/modules/file/iso28600.c
@@ -1,6 +1,6 @@
 /*
- *  $Id: iso28600.c 19044 2016-10-08 19:10:46Z yeti-dn $
- *  Copyright (C) 2011 David Necas (Yeti).
+ *  $Id: iso28600.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2011-2016 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -170,6 +170,15 @@ static GwyContainer*       load_channels      (ISO28600FieldValue *header,
                                                gdouble xreal,
                                                gdouble yreal,
                                                GError **error);
+static GwyContainer*       load_xyz_data      (ISO28600FieldValue *header,
+                                               const gchar *filename,
+                                               gchar **strings,
+                                               gchar **p,
+                                               ISO28600ExperimentMode experiment,
+                                               guint nchannels,
+                                               gdouble qx,
+                                               gdouble qy,
+                                               GError **error);
 static GwyContainer*       load_spectra_graphs(ISO28600FieldValue *header,
                                                gchar **p,
                                                ISO28600SpectroscopyScanMode smode,
@@ -533,12 +542,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Imports and exports ISO 28600:2011 SPM data transfer format."),
     "Yeti <yeti at gwyddion.net>",
-    "0.2",
+    "0.4",
     "David Nečas (Yeti)",
     "2011",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, iso28600)
 
 static gboolean
 module_register(void)
@@ -600,34 +609,6 @@ iso28600_load(const gchar *filename,
         guint xres, yres, nchannels;
         gdouble xreal, yreal;
 
-        if (header[16].enumerated.value != ISO28600_SCAN_REGULAR_MAPPING) {
-            g_set_error(error, GWY_MODULE_FILE_ERROR,
-                        GWY_MODULE_FILE_ERROR_DATA,
-                        _("Only regular mappings are implemented but "
-                          "file has mapping type ‘%s’."),
-                        header[16].enumerated.str);
-            goto fail;
-        }
-        xres = header[23].i;
-        yres = header[24].i;
-        if (err_DIMENSION(error, xres) || err_DIMENSION(error, yres))
-            goto fail;
-
-        xreal = header[27].d;
-        yreal = header[28].d;
-        if (!((xreal = fabs(xreal)) > 0)) {
-            g_warning("Real x size is 0.0, fixing to 1.0");
-            xreal = 1.0;
-        }
-        if (!((yreal = fabs(yreal)) > 0)) {
-            g_warning("Real y size is 0.0, fixing to 1.0");
-            yreal = 1.0;
-        }
-        xreal *= pow10(header[25].unit.power10);
-        yreal *= pow10(header[26].unit.power10);
-        if (!gwy_si_unit_equal(header[25].unit.unit, header[26].unit.unit))
-            g_warning("X and Y units differ, using X");
-
         nchannels = 1;
         if (experiment == ISO28600_EXPERIMENT_MAP_MC) {
             nchannels = header[93].i;
@@ -636,11 +617,49 @@ iso28600_load(const gchar *filename,
                 goto fail;
             }
         }
+        if (!gwy_si_unit_equal(header[25].unit.unit, header[26].unit.unit))
+            g_warning("X and Y units differ, using X");
 
-        container = load_channels(header, filename, strings, &p,
-                                  experiment, nchannels,
-                                  xres, yres, xreal, yreal,
-                                  error);
+        if (header[16].enumerated.value == ISO28600_SCAN_IRREGULAR_MAPPING) {
+            /* Ignore all area information because we have explicit X and Y
+             * coordinates of each point.  Just precalculate the factors. */
+            xreal = pow10(header[25].unit.power10);
+            yreal = pow10(header[26].unit.power10);
+            container = load_xyz_data(header, filename, strings, &p,
+                                      experiment, nchannels, xreal, yreal,
+                                      error);
+        }
+        else if (header[16].enumerated.value == ISO28600_SCAN_REGULAR_MAPPING) {
+            xres = header[23].i;
+            yres = header[24].i;
+            if (err_DIMENSION(error, xres) || err_DIMENSION(error, yres))
+                goto fail;
+
+            xreal = header[27].d;
+            yreal = header[28].d;
+            if (!((xreal = fabs(xreal)) > 0)) {
+                g_warning("Real x size is 0.0, fixing to 1.0");
+                xreal = 1.0;
+            }
+            if (!((yreal = fabs(yreal)) > 0)) {
+                g_warning("Real y size is 0.0, fixing to 1.0");
+                yreal = 1.0;
+            }
+            xreal *= pow10(header[25].unit.power10);
+            yreal *= pow10(header[26].unit.power10);
+            container = load_channels(header, filename, strings, &p,
+                                      experiment, nchannels,
+                                      xres, yres, xreal, yreal,
+                                      error);
+        }
+        else {
+            g_set_error(error, GWY_MODULE_FILE_ERROR,
+                        GWY_MODULE_FILE_ERROR_DATA,
+                        _("Only regular and irregular mappings are implemented "
+                          "but the file has mapping type ‘%s’."),
+                        header[16].enumerated.str);
+            goto fail;
+        }
     }
     if (experiment == ISO28600_EXPERIMENT_SPEC_SC
         || experiment == ISO28600_EXPERIMENT_SPEC_MC) {
@@ -724,6 +743,7 @@ load_channels(ISO28600FieldValue *header,
     gdouble *datas[MAX_CHANNELS];
     gdouble powers10[MAX_CHANNELS];
     gchar *line, *end;
+    GQuark quark;
     guint id, k;
 
     for (id = 0; id < nchannels; id++) {
@@ -752,7 +772,7 @@ load_channels(ISO28600FieldValue *header,
         if (!line) {
             g_set_error(error, GWY_MODULE_FILE_ERROR,
                         GWY_MODULE_FILE_ERROR_DATA,
-                        _("End of file reached when reading sample #%d of %d"),
+                        _("End of file reached when reading sample #%u of %u"),
                         k, xres*yres);
             goto fail;
         }
@@ -762,11 +782,14 @@ load_channels(ISO28600FieldValue *header,
                 g_set_error(error, GWY_MODULE_FILE_ERROR,
                             GWY_MODULE_FILE_ERROR_DATA,
                             _("Malformed data encountered when reading sample "
-                              "#%d of %d"),
-                            k, xres*yres);
+                              "#%u"),
+                            k);
                 goto fail;
             }
             line = end;
+            /* The standard specifies comma separator. */
+            while (g_ascii_isspace(*line) || *line == ',')
+                line++;
         }
     }
     if (!line || !gwy_strequal(line, EOD_MAGIC)) {
@@ -779,16 +802,13 @@ load_channels(ISO28600FieldValue *header,
     for (id = 0; id < nchannels; id++) {
         GwyContainer *meta;
         const gchar *title;
-        GQuark quark = gwy_app_get_data_key_for_id(id);
 
+        quark = gwy_app_get_data_key_for_id(id);
         gwy_container_set_object(container, quark, fields[id]);
 
-        meta = get_meta(header, strings, id);
-        if (meta) {
-            gchar key[40];
-
-            g_snprintf(key, sizeof(key), "/%d/meta", id);
-            gwy_container_set_object_by_name(container, key, meta);
+        if ((meta = get_meta(header, strings, id))) {
+            quark = gwy_app_get_data_meta_key_for_id(id);
+            gwy_container_set_object(container, quark, meta);
             g_object_unref(meta);
         }
 
@@ -798,10 +818,8 @@ load_channels(ISO28600FieldValue *header,
             title = header[94 + 3*id].s;
 
         if (strlen(title)) {
-            gchar key[40];
-
-            g_snprintf(key, sizeof(key), "/%d/data/title", id);
-            gwy_container_set_string_by_name(container, key, g_strdup(title));
+            quark = gwy_app_get_data_title_key_for_id(id);
+            gwy_container_set_const_string(container, quark, title);
         }
 
         gwy_file_channel_import_log_add(container, id, NULL, filename);
@@ -814,6 +832,124 @@ fail:
     return container;
 }
 
+static GwyContainer*
+load_xyz_data(ISO28600FieldValue *header,
+              const gchar *filename,
+              gchar **strings,
+              gchar **p,
+              ISO28600ExperimentMode experiment,
+              guint nchannels,
+              gdouble qx, gdouble qy,
+              GError **error)
+{
+    GwyContainer *container = NULL;
+    gdouble powers10[MAX_CHANNELS+2];
+    GArray *alldata;
+    gchar *line, *end;
+    guint id, k;
+
+    powers10[0] = qx;
+    powers10[1] = qy;
+    for (id = 0; id < nchannels; id++) {
+        if (experiment == ISO28600_EXPERIMENT_MAP_SC)
+            powers10[id+2] = pow10(header[69].unit.power10);
+        else
+            powers10[id+2] = pow10(header[95 + 3*id].unit.power10);
+    }
+
+    /* It is not clear how many rows with data there are because the
+     * specification is obviously nonsensical, using 1..M×N range even for
+     * irregular data. */
+    alldata = g_array_new(FALSE, FALSE, sizeof(gdouble));
+    k = 0;
+    while ((line = gwy_str_next_line(p))) {
+        if (gwy_strequal(line, EOD_MAGIC))
+            break;
+        for (id = 0; id < nchannels+2; id++) {
+            gdouble v = powers10[id]*g_ascii_strtod(line, &end);
+            if (line == end) {
+                g_set_error(error, GWY_MODULE_FILE_ERROR,
+                            GWY_MODULE_FILE_ERROR_DATA,
+                            _("Malformed data encountered when reading sample "
+                              "#%u")
+                            , k);
+                goto fail;
+            }
+            g_array_append_val(alldata, v);
+            line = end;
+            /* The standard specifies comma separator. */
+            while (g_ascii_isspace(*line) || *line == ',')
+                line++;
+        }
+    }
+    if (!line || !gwy_strequal(line, EOD_MAGIC)) {
+        g_set_error(error, GWY_MODULE_FILE_ERROR, GWY_MODULE_FILE_ERROR_DATA,
+                    _("Missing end-of-data marker."));
+        goto fail;
+    }
+
+    container = gwy_container_new();
+    k = alldata->len/(nchannels + 2);
+    for (id = 0; id < nchannels; id++) {
+        GQuark quark;
+        GwyContainer *meta;
+        const gchar *title;
+        GwySurface *surface;
+        GwySIUnit *unit;
+        GwyXYZ *data;
+        guint i;
+
+        surface = gwy_surface_new_sized(k);
+        data = gwy_surface_get_data(surface);
+        for (i = 0; i < k; i++) {
+            GwyXYZ pt;
+
+            pt.x = g_array_index(alldata, gdouble, (nchannels + 2)*i);
+            pt.y = g_array_index(alldata, gdouble, (nchannels + 2)*i + 1);
+            pt.z = g_array_index(alldata, gdouble, (nchannels + 2)*i + 2 + id);
+            data[i] = pt;
+        }
+        unit = gwy_surface_get_si_unit_xy(surface);
+        gwy_serializable_clone(G_OBJECT(header[25].unit.unit), G_OBJECT(unit));
+        unit = gwy_surface_get_si_unit_z(surface);
+        if (experiment == ISO28600_EXPERIMENT_MAP_SC) {
+            gwy_serializable_clone(G_OBJECT(header[69].unit.unit),
+                                   G_OBJECT(unit));
+        }
+        else {
+            gwy_serializable_clone(G_OBJECT(header[95 + 3*id].unit.unit),
+                                   G_OBJECT(unit));
+        }
+
+        quark = gwy_app_get_data_key_for_id(id);
+        gwy_container_set_object(container, quark, surface);
+
+        if ((meta = get_meta(header, strings, id))) {
+            quark = gwy_app_get_surface_meta_key_for_id(id);
+            gwy_container_set_object(container, quark, meta);
+            g_object_unref(meta);
+        }
+
+        if (experiment == ISO28600_EXPERIMENT_MAP_SC)
+            title = header[68].s;
+        else
+            title = header[94 + 3*id].s;
+
+        if (strlen(title)) {
+            quark = gwy_app_get_surface_title_key_for_id(id);
+            gwy_container_set_const_string(container, quark, title);
+        }
+
+        gwy_file_xyz_import_log_add(container, id, NULL, filename);
+        g_object_unref(surface);
+    }
+
+fail:
+    g_array_free(alldata, TRUE);
+
+    return container;
+}
+
 /* XXX: The data format for spectroscopy is not well described so I estimate
  * it is how I would do it. */
 static GwyContainer*
@@ -940,7 +1076,7 @@ get_meta(ISO28600FieldValue *header,
     static const GwyEnum fields_without_units[] = {
         { "deg", 33 }, { "V", 40 }, { "K", 49 }, { "Pa", 50 }, { "%", 51 },
         { "N/m", 56 }, { "Hz", 57 }, { "deg", 59 }, { "deg", 60 },
-        { "deg", 61 }, 
+        { "deg", 61 },
     };
     gint year, month, day, hour, minute, second, offset;
     GwyContainer *meta = gwy_container_new();
diff --git a/modules/file/jeol.c b/modules/file/jeol.c
index f842bc7..2cac8f7 100644
--- a/modules/file/jeol.c
+++ b/modules/file/jeol.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: jeol.c 17859 2015-12-17 11:59:01Z yeti-dn $
+ *  @(#) $Id: jeol.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -541,7 +541,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, jeol)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/jpkscan.c b/modules/file/jpkscan.c
index 05558ee..d2950e6 100644
--- a/modules/file/jpkscan.c
+++ b/modules/file/jpkscan.c
@@ -1,11 +1,11 @@
 /*
- *  @(#) $Id: jpkscan.c 19097 2016-10-18 21:19:05Z dn2010 $
+ *  @(#) $Id: jpkscan.c 19673 2017-05-01 16:03:55Z yeti-dn $
  *  Loader for JPK Image Scans.
  *  Copyright (C) 2005  JPK Instruments AG.
  *  Written by Sven Neumann <neumann at jpk.com>.
  *
  *  Rewritten to use GwyTIFF and spectra added by Yeti <yeti at gwyddion.net>.
- *  Copyright (C) 2009-2015 David Necas (Yeti).
+ *  Copyright (C) 2009-2017 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -46,21 +46,25 @@
 /**
  * [FILE-MAGIC-USERGUIDE]
  * JPK Instruments
- * .jpk .jpk-qi-image
- * Read SPS
+ * .jpk .jpk-qi-image .jpk-force .jpk-force-map .jpk-qi-data
+ * Read SPS Volume
  **/
 
 #include "config.h"
 #include <string.h>
 #include <stdlib.h>
+#include <stdio.h>
+#include <glib/gstdio.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
 #include <libgwyddion/gwyutils.h>
 #include <libgwymodule/gwymodule-file.h>
 #include <libprocess/stats.h>
+#include <libprocess/grains.h>
 #include <libgwydgets/gwygraphmodel.h>
 #include <app/gwymoduleutils-file.h>
 #include <app/data-browser.h>
+#include <app/wait.h>
 
 #include "err.h"
 #include "jpk.h"
@@ -93,9 +97,12 @@ typedef enum {
 } JPKForceFileType;
 
 typedef struct {
-    GHashTable *header_properties;
+    /* Segment header properties. */
     /* Concatenated data of all channels. */
-    guint ndata;
+    guint ndata;           /* Points per curve from settings.  The actual
+                              number of values measured can be smaller and is
+                              stored in measured_ndata[] for each map point. */
+    guint *measured_ndata;
     gdouble *data;
     const gchar **units;   /* For all channels */
     const gchar *segment_style;   /* This is extend, retract, pause. */
@@ -104,7 +111,10 @@ typedef struct {
 } JPKForceData;
 
 typedef struct {
+    const gchar *filename;
+
     GRegex *segment_regex;
+    GRegex *index_regex;
     GRegex *index_segment_regex;
     GString *str;     /* General scratch buffer. */
     GString *sstr;    /* Inner scratch buffer for lookup_property(). */
@@ -116,21 +126,31 @@ typedef struct {
     guint nids;
     guint *ids;
     guint nsegs;
-    guint npoints;
+    guint npoints;      /* Number of positions (xy coordinates) */
     guint nchannels;
     gint height_cid;
     gchar **channel_names;
     const gchar **default_cals;
+    /* We have only data[nseg] (with all channels and points in one block).
+     * The most coarse index is map point, then channel, then spectrum value. */
     JPKForceData *data;
 
     /* For maps/QI */
-    GHashTable **point_header_properties;
-    guint xres;
+    guint xres;        /* Detected */
     guint yres;
-
-    /* The backend storage for all the hash tables.  We must keep those we
+    guint ilength;     /* Grid dimensions from the header */
+    guint jlength;
+    GwyXY *coordinates;
+    GwyXY xyorigin;
+    GwyXY xystep;
+    gboolean *have_coordinates;
+    guint *pointmap;   /* Image pixel index → file data point id (index). */
+    guint imgid;       /* Next free image id. */
+
+    /* The backend storage for all the hash tables.  We must keep buffers we
      * created hashes from because the strings point directly to the buffers. */
     GSList *buffers;
+    GHashTable *last_hash;
 } JPKForceFile;
 
 static gboolean      module_register     (void);
@@ -169,35 +189,77 @@ static gint          jpkforce_detect              (const GwyFileDetectInfo *file
 static GwyContainer* jpkforce_load                (const gchar *filename,
                                                    GwyRunType mode,
                                                    GError **error);
+static void          read_embedded_image_file     (GwyContainer *container,
+                                                   GwyZipFile zipfile,
+                                                   JPKForceFile *jpkfile);
+static void          check_regular_grid           (JPKForceFile *jpkfile);
 static guint         create_force_curves          (GwyContainer *container,
                                                    JPKForceFile *jpkfile);
 static gboolean      read_curve_data              (GwyZipFile zipfile,
                                                    JPKForceFile *jpkfile,
                                                    GError **error);
+static guint         create_volume_data           (GwyContainer *container,
+                                                   JPKForceFile *jpkfile,
+                                                   GwySetFractionFunc set_fraction,
+                                                   GError **error);
+static void          create_aux_datafield         (GwyContainer *container,
+                                                   JPKForceFile *jpkfile,
+                                                   GwyDataField *srcfield,
+                                                   GwyDataField *mask,
+                                                   const gchar *name,
+                                                   const JPKForceData *data);
+static guint         create_sps_data              (GwyContainer *container,
+                                                   JPKForceFile *jpkfile,
+                                                   GwySetFractionFunc set_fraction,
+                                                   GError **error);
+static gboolean      read_forcemap_data           (GwyZipFile zipfile,
+                                                   JPKForceFile *jpkfile,
+                                                   GwySetFractionFunc set_fraction,
+                                                   GError **error);
 static gboolean      read_raw_data                (GwyZipFile zipfile,
                                                    JPKForceFile *jpkfile,
                                                    JPKForceData *data,
+                                                   GHashTable *hash,
+                                                   const gchar *datatype,
+                                                   guint ptid,
+                                                   guint cid,
+                                                   guint ndata,
+                                                   GError **error);
+static gboolean      read_computed_data           (JPKForceFile *jpkfile,
+                                                   GHashTable *header_properties,
+                                                   JPKForceData *data,
                                                    const gchar *datatype,
-                                                   guint i,
+                                                   guint ptid,
+                                                   guint cid,
+                                                   guint ndata,
                                                    GError **error);
+static void          find_segment_settings        (JPKForceFile *jpkfile,
+                                                   GHashTable *header_properties,
+                                                   guint sid);
 static guint         find_segment_npoints         (JPKForceFile *jpkfile,
                                                    GHashTable *header_properties,
                                                    GError **error);
-static gchar*        find_sgement_name            (GHashTable *header_properties);
+static gchar*        find_sgement_name            (GHashTable *segment_properties,
+                                                   GHashTable *shared_properties,
+                                                   guint sid,
+                                                   GString *str);
 static gboolean      apply_default_channel_scaling(JPKForceFile *jpkfile,
                                                    JPKForceData *data,
-                                                   guint i);
+                                                   GHashTable *header_properties,
+                                                   guint cid,
+                                                   gsize datablockoff);
 static gboolean      find_scaling_parameters      (JPKForceFile *jpkfile,
                                                    GHashTable *header_properties,
                                                    const gchar *subkey,
-                                                   guint i,
+                                                   guint cid,
                                                    gdouble *multiplier,
                                                    gdouble *offset,
-                                                   const gchar **unit);
+                                                   const gchar **unit,
+                                                   gboolean ignore_missing);
 static const gchar*  lookup_channel_property      (JPKForceFile *jpkfile,
                                                    GHashTable *header_properties,
                                                    const gchar *subkey,
-                                                   guint i,
+                                                   guint cid,
                                                    gboolean fail_if_not_found,
                                                    GError **error);
 static const gchar*  lookup_property              (JPKForceFile *jpkfile,
@@ -213,14 +275,15 @@ static gboolean      analyse_segment_ids          (JPKForceFile *jpkfile,
                                                    GError **error);
 static gboolean      analyse_map_segment_ids      (JPKForceFile *jpkfile,
                                                    GError **error);
-static gboolean      enumerate_segments           (GwyZipFile zipfile,
-                                                   JPKForceFile *jpkfile);
-static gboolean      enumerate_map_segments       (GwyZipFile zipfile,
-                                                   JPKForceFile *jpkfile);
-static void          jpk_force_file_free          (JPKForceFile *jpkfile);
+static gboolean      scan_file_enumerate_segments (GwyZipFile zipfile,
+                                                   JPKForceFile *jpkfile,
+                                                   GwySetMessageFunc set_fraction,
+                                                   GError **error);
 static GHashTable*   parse_header_properties      (GwyZipFile zipfile,
                                                    JPKForceFile *jpkfile,
                                                    GError **error);
+static void          free_last_hash               (JPKForceFile *jpkfile);
+static void          jpk_force_file_free          (JPKForceFile *jpkfile);
 #endif
 
 static GwyModuleInfo module_info = {
@@ -370,6 +433,11 @@ jpkscan_load(const gchar *filename,
     gwy_tiff_free(tiff);
     g_object_unref(meta);
 
+    if (!gwy_container_get_n_items(container)) {
+        err_NO_DATA(error);
+        GWY_OBJECT_UNREF(container);
+    }
+
     return container;
 }
 
@@ -465,11 +533,17 @@ jpk_load_channel(const GwyTIFF *tiff,
     gwy_tiff_get_bool(tiff, idx, JPK_TIFFTAG_Grid_Reflect, &reflect);
     data = gwy_data_field_get_data(dfield);
 
-    for (j = 0; j < reader->height; j++)
+    for (j = 0; j < reader->height; j++) {
         gwy_tiff_read_image_row(tiff, reader, 0,
                                 reflect ? j : reader->height-1 - j,
                                 mult, offset,
                                 data + j*reader->width);
+    }
+
+    if (gwy_tiff_get_float0(tiff, JPK_TIFFTAG_Grid_x0, &offset))
+        gwy_data_field_set_xoffset(dfield, offset);
+    if (gwy_tiff_get_float0(tiff, JPK_TIFFTAG_Grid_y0, &offset))
+        gwy_data_field_set_yoffset(dfield, offset);
 
     /* Add the GwyDataField to the container */
 
@@ -646,13 +720,15 @@ jpkforce_detect(const GwyFileDetectInfo *fileinfo,
 
 static GwyContainer*
 jpkforce_load(const gchar *filename,
-              G_GNUC_UNUSED GwyRunType mode,
+              GwyRunType mode,
               GError **error)
 {
     GwyContainer *container = NULL;
     JPKForceFile jpkfile;
     GwyZipFile zipfile;
+    gboolean waiting = FALSE;
 
+    gwy_debug("open file");
     zipfile = gwyzip_open(filename);
     if (!zipfile) {
         g_set_error(error, GWY_MODULE_FILE_ERROR,
@@ -663,60 +739,102 @@ jpkforce_load(const gchar *filename,
 
     gwy_clear(&jpkfile, 1);
 
-    /* The main properties must exist. */
-    if (!gwyzip_locate_file(zipfile, "header.properties", TRUE, error)
-        || !(jpkfile.header_properties = parse_header_properties(zipfile,
-                                                                 &jpkfile,
-                                                                 error)))
-        goto fail;
-
-    /* Optional. */
-    if (gwyzip_locate_file(zipfile, "shared-data/header.properties", TRUE,
-                           NULL)) {
-        jpkfile.shared_header_properties = parse_header_properties(zipfile,
-                                                                   &jpkfile,
-                                                                   NULL);
-    }
-
     jpkfile.height_cid = -1;
     jpkfile.str = g_string_new(NULL);
     jpkfile.sstr = g_string_new(NULL);
     jpkfile.qstr = g_string_new(NULL);
     jpkfile.segment_regex
         = g_regex_new("^segments/([0-9]+)/(.*)$", G_REGEX_OPTIMIZE, 0, NULL);
+    jpkfile.index_regex
+        = g_regex_new("^index/([0-9]+)/(.*)$", G_REGEX_OPTIMIZE, 0, NULL);
     jpkfile.index_segment_regex
         = g_regex_new("^index/([0-9]+)/segments/([0-9]+)/(.*)$",
                       G_REGEX_OPTIMIZE, 0, NULL);
+    jpkfile.filename = filename;
+
+    gwy_debug("starting scanning");
+    if (mode == GWY_RUN_INTERACTIVE) {
+        g_string_printf(jpkfile.str,
+                        _("Scanning file (%u curves)..."), 0);
+        gwy_app_wait_start(NULL, jpkfile.str->str);
+        waiting = TRUE;
+    }
+    if (!scan_file_enumerate_segments(zipfile, &jpkfile,
+                                      waiting ? gwy_app_wait_set_message : NULL,
+                                      error))
+        goto fail;
 
-    if (enumerate_segments(zipfile, &jpkfile)) {
-        jpkfile.type = JPK_FORCE_CURVES;
+    if (jpkfile.type == JPK_FORCE_CURVES) {
         if (!analyse_segment_ids(&jpkfile, error))
             goto fail;
     }
-    else if (enumerate_map_segments(zipfile, &jpkfile)) {
-        jpkfile.type = JPK_FORCE_MAP;
+    else if (jpkfile.type == JPK_FORCE_MAP) {
+        /* The image file should be near the beginning so hopefully this
+         * locate-file operation does not take several seconds. */
         if (gwyzip_locate_file(zipfile, "data-image.jpk-qi-image", TRUE, NULL))
             jpkfile.type = JPK_FORCE_QI;
         if (!analyse_map_segment_ids(&jpkfile, error))
             goto fail;
     }
     else {
-        err_NO_DATA(error);
-        goto fail;
+        g_assert_not_reached();
     }
 
     if (!enumerate_channels(&jpkfile, jpkfile.shared_header_properties, FALSE,
                             error))
         goto fail;
 
-    jpkfile.data = g_new0(JPKForceData, jpkfile.nids);
-    container = gwy_container_new();
+    jpkfile.data = g_new0(JPKForceData, jpkfile.nsegs);
     if (jpkfile.type == JPK_FORCE_CURVES) {
         if (!read_curve_data(zipfile, &jpkfile, error))
             goto fail;
+        container = gwy_container_new();
         create_force_curves(container, &jpkfile);
     }
     else {
+        jpkfile.coordinates = g_new(GwyXY, jpkfile.npoints);
+        jpkfile.have_coordinates = g_new0(gboolean, jpkfile.npoints);
+        if (waiting) {
+            if (!gwy_app_wait_set_message(_("Reading files..."))
+                || !gwy_app_wait_set_fraction(0.0)) {
+                err_CANCELLED(error);
+                goto fail;
+            }
+        }
+        if (!read_forcemap_data(zipfile, &jpkfile,
+                                waiting ? gwy_app_wait_set_fraction : NULL,
+                                error))
+            goto fail;
+
+        check_regular_grid(&jpkfile);
+        container = gwy_container_new();
+        read_embedded_image_file(container, zipfile, &jpkfile);
+
+        if (jpkfile.pointmap) {
+            /* Regular grid with complete rows. */
+            if (waiting) {
+                if (!gwy_app_wait_set_message(_("Creating volume data..."))
+                    || !gwy_app_wait_set_fraction(0.0)) {
+                    err_CANCELLED(error);
+                    GWY_OBJECT_UNREF(container);
+                    goto fail;
+                }
+            }
+            if (!create_volume_data(container, &jpkfile,
+                                    waiting ? gwy_app_wait_set_fraction : NULL,
+                                    error)) {
+                GWY_OBJECT_UNREF(container);
+                goto fail;
+            }
+        }
+        else {
+            if (!create_sps_data(container, &jpkfile,
+                                 waiting ? gwy_app_wait_set_fraction : NULL,
+                                 error)) {
+                GWY_OBJECT_UNREF(container);
+                goto fail;
+            }
+        }
     }
 
     if (!gwy_container_get_n_items(container)) {
@@ -728,10 +846,121 @@ jpkforce_load(const gchar *filename,
 fail:
     gwyzip_close(zipfile);
     jpk_force_file_free(&jpkfile);
+    if (waiting)
+        gwy_app_wait_finish();
 
     return container;
 }
 
+/* Extract the embedded image to a temporary file and use jpkscan_load() to
+ * load it.  Do not complain if something goes wrong.  We take the embedded
+ * image as a bonus if we can load it. */
+static void
+read_embedded_image_file(GwyContainer *container,
+                         GwyZipFile zipfile, JPKForceFile *jpkfile)
+{
+    GwyContainer *embcontainer;
+    guchar *content = NULL, *p;
+    gchar *filename = NULL;
+    gsize size;
+    gssize bytes_written;
+    gint *ids;
+    guint i;
+    gint fd;
+
+    if (!gwyzip_locate_file(zipfile, "data-image.jpk-qi-image", TRUE, NULL))
+        return;
+
+    if (!(content = gwyzip_get_file_content(zipfile, &size, NULL)))
+        return;
+
+    fd = g_file_open_tmp("gwyddion-jpkscan-XXXXXX.jpk-qi-image", &filename,
+                         NULL);
+    if (fd == -1)
+        goto fail;
+
+    p = content;
+    while (size) {
+        bytes_written = write(fd, p, size);
+        if (bytes_written <= 0) {
+            /* We might want to try again when we get zero written bytes or an
+             * error such as EAGAIN, EWOULDBLOCK or EINTR.  But in this
+             * context, screw it. */
+            close(fd);
+            goto fail;
+        }
+        p += bytes_written;
+        size -= bytes_written;
+    }
+
+    embcontainer = jpkscan_load(filename, GWY_RUN_NONINTERACTIVE, NULL);
+    close(fd);
+    if (embcontainer) {
+        gwy_container_transfer(embcontainer, container, "/", "/", FALSE);
+        g_object_unref(embcontainer);
+
+        ids = gwy_app_data_browser_get_data_ids(container);
+        for (i = 0; ids[i] != -1; i++) {
+            if (ids[i] >= jpkfile->imgid)
+                jpkfile->imgid = ids[i]+1;
+        }
+        g_free(ids);
+    }
+
+fail:
+    if (filename) {
+        g_unlink(filename);
+        g_free(filename);
+    }
+    g_free(content);
+}
+
+
+static void
+check_regular_grid(JPKForceFile *jpkfile)
+{
+    guint npoints = jpkfile->npoints;
+    guint *pointmap;
+
+    if (!npoints)
+        return;
+
+    pointmap = gwy_check_regular_2d_grid((gdouble*)jpkfile->coordinates,
+                                         2, npoints, -1.0,
+                                         &jpkfile->xres,
+                                         &jpkfile->yres,
+                                         &jpkfile->xyorigin,
+                                         &jpkfile->xystep);
+    gwy_debug("first attempt %p", pointmap);
+    if (pointmap) {
+        jpkfile->pointmap = pointmap;
+        return;
+    }
+
+    if (jpkfile->ilength < 2 || jpkfile->jlength < 2)
+        return;
+    if (jpkfile->ilength*jpkfile->jlength == npoints)
+        return;
+    if (npoints < jpkfile->jlength)
+        return;
+
+    /* For an incomplete measurement, try cutting it to full rows.  If we
+     * still do not get a regular grid just give up. */
+    npoints = (npoints/jpkfile->jlength)*jpkfile->jlength;
+    pointmap = gwy_check_regular_2d_grid((gdouble*)jpkfile->coordinates,
+                                         2, npoints, -1.0,
+                                         &jpkfile->xres,
+                                         &jpkfile->yres,
+                                         &jpkfile->xyorigin,
+                                         &jpkfile->xystep);
+    gwy_debug("second attempt %p", pointmap);
+    if (pointmap) {
+        jpkfile->pointmap = pointmap;
+        jpkfile->npoints = npoints;
+        return;
+    }
+}
+
 static gboolean
 err_IRREGULAR_NUMBERING(GError **error)
 {
@@ -791,7 +1020,7 @@ compare_uint2(gconstpointer a, gconstpointer b)
 }
 
 static gchar*
-match_segment_filename(const gchar *filename, GRegex *regex, gint *id)
+match_segment_or_index_filename(const gchar *filename, GRegex *regex, gint *id)
 {
     GMatchInfo *info;
     gchar *s;
@@ -867,6 +1096,7 @@ create_force_curves(GwyContainer *container, JPKForceFile *jpkfile)
             ydata = data->data + cid * ndata;
             gcmodel = gwy_graph_curve_model_new();
             gwy_graph_curve_model_set_data(gcmodel, xdata, ydata, ndata);
+            gwy_graph_curve_model_enforce_order(gcmodel);
             g_object_set(gcmodel,
                          "mode", GWY_GRAPH_CURVE_LINE,
                          "color", gwy_graph_get_preset_color(i++),
@@ -903,25 +1133,31 @@ create_force_curves(GwyContainer *container, JPKForceFile *jpkfile)
 static gboolean
 read_curve_data(GwyZipFile zipfile, JPKForceFile *jpkfile, GError **error)
 {
+    JPKForceData *data;
     GString *str = jpkfile->str;
+    guint sid;
 
-    if (!gwyzip_first_file(zipfile, NULL)) {
-        /* Internal error ??? */
-        err_NO_DATA(error);
+    if (!gwyzip_first_file(zipfile, error))
         return FALSE;
+
+    if (jpkfile->shared_header_properties) {
+        for (sid = 0; sid < jpkfile->nsegs; sid++)
+            find_segment_settings(jpkfile, jpkfile->shared_header_properties,
+                                  sid);
     }
 
     do {
         gchar *filename = NULL, *suffix = NULL;
         GHashTable *hash;
-        guint id, i, ndata;
+        guint cid, ndata;
         gboolean ok;
 
-        if (!gwyzip_get_current_filename(zipfile, &filename, NULL))
-            continue;
+        if (!gwyzip_get_current_filename(zipfile, &filename, error))
+            return FALSE;
 
         /* Find the header. */
-        suffix = match_segment_filename(filename, jpkfile->segment_regex, &id);
+        suffix = match_segment_or_index_filename(filename,
+                                                 jpkfile->segment_regex, &sid);
         g_free(filename);
 
         if (!suffix)
@@ -931,48 +1167,42 @@ read_curve_data(GwyZipFile zipfile, JPKForceFile *jpkfile, GError **error)
         if (!ok)
             continue;
 
-        g_assert(id <= jpkfile->nids);
-        g_assert(jpkfile->data[id].header_properties == NULL);
+        g_assert(sid <= jpkfile->nsegs);
+        data = jpkfile->data + sid;
 
         hash = parse_header_properties(zipfile, jpkfile, error);
-        jpkfile->data[id].header_properties = hash;
-        /* FIXME FIXME: A segment many not have numpoints if data were not
-         * collected. */
+        /* A segment many not have numpoints if data were not collected.
+         * But for single curves this means a bad file anyway.  */
         if (!hash
             || !enumerate_channels(jpkfile, hash, TRUE, error)
             || !(ndata = find_segment_npoints(jpkfile, hash, error)))
             return FALSE;
 
-        jpkfile->data[id].segment_style
-            = g_hash_table_lookup(hash, "force-segment-header.settings"
-                                        ".segment-settings.style");
-        jpkfile->data[id].segment_type
-            = g_hash_table_lookup(hash, "force-segment-header.settings"
-                                        ".segment-settings.type");
-        jpkfile->data[id].segment_name = find_sgement_name(hash);
-
-        gwy_debug("%u, npts = %u", id, ndata);
-        jpkfile->data[id].ndata = ndata;
-        jpkfile->data[id].data = g_new(gdouble, ndata*jpkfile->nchannels);
-        jpkfile->data[id].units = g_new(const gchar*, jpkfile->nchannels);
+        gwy_debug("%u, npts = %u", sid, ndata);
+        if (data->ndata && ndata != data->ndata) {
+            /* Can this happen for non-maps? */
+            gwy_debug("number of measured data differs from settings");
+        }
+        /* Anyway, we have just a single curve set so let the segment header
+         * override any shared settings. */
+        data->ndata = ndata;
+        data->data = g_new(gdouble, ndata*jpkfile->nchannels);
+        data->units = g_new0(const gchar*, jpkfile->nchannels);
+        find_segment_settings(jpkfile, hash, sid);
+
         /* Expect corresponding data files next. */
-        for (i = 0; i < jpkfile->nchannels; i++) {
+        for (cid = 0; cid < jpkfile->nchannels; cid++) {
             const gchar *datafilename, *datatype;
 
             if (!(datatype = lookup_channel_property(jpkfile, hash, "type",
-                                                     i, TRUE, error)))
+                                                     cid, TRUE, error)))
                 return FALSE;
 
-            gwy_debug("data.type %s", datatype);
-            if (gwy_strequal(datatype, "constant-data")) {
-                g_warning("Cannot handle constant-data yet.");
-                /* TODO: handle constant data. */
-                continue;
-            }
-
-            if (gwy_strequal(datatype, "raster-data")) {
-                g_warning("Cannot handle raster-data yet.");
-                /* TODO: handle ramp data. */
+            /* Handle computed data.  There is no corresponding file. */
+            if (gwy_stramong(datatype, "constant-data", "raster-data", NULL)) {
+                if (!read_computed_data(jpkfile, hash, data,
+                                        datatype, 0, cid, ndata, error))
+                    return FALSE;
                 continue;
             }
 
@@ -982,10 +1212,10 @@ read_curve_data(GwyZipFile zipfile, JPKForceFile *jpkfile, GError **error)
 
             if (!(datafilename = lookup_channel_property(jpkfile, hash,
                                                          "file.name",
-                                                         i, TRUE, error)))
+                                                         cid, TRUE, error)))
                 return FALSE;
 
-            g_string_printf(str, "segments/%u/%s", id, datafilename);
+            g_string_printf(str, "segments/%u/%s", sid, datafilename);
             if (!gwyzip_get_current_filename(zipfile, &filename, error))
                 return FALSE;
             gwy_debug("expecting file <%s>, found <%s>", str->str, filename);
@@ -994,32 +1224,700 @@ read_curve_data(GwyZipFile zipfile, JPKForceFile *jpkfile, GError **error)
                 g_free(filename);
                 return FALSE;
             }
+            g_free(filename);
 
             /* Read the data. */
-            if (!read_raw_data(zipfile, jpkfile, jpkfile->data + id,
-                               datatype, i, error)) {
+            if (!read_raw_data(zipfile, jpkfile, data, hash,
+                               datatype, 0, cid, ndata, error))
+                return FALSE;
+            apply_default_channel_scaling(jpkfile, data, hash, cid, cid*ndata);
+        }
+
+        free_last_hash(jpkfile);
+
+    } while (gwyzip_next_file(zipfile, NULL));
+
+    return TRUE;
+}
+
+static gboolean
+analyse_height_channel_range(JPKForceData *data, const guint *pointmap,
+                             guint nchannels, guint npoints,
+                             gint height_cid,
+                             GwyDataField *min_field,
+                             GwyDataField *range_field,
+                             GwyDataField *mask)
+{
+    guint ij, k, ndata = data->ndata, measured_ndata, np;
+    gdouble *dm = gwy_data_field_get_data(min_field);
+    gdouble *dr = gwy_data_field_get_data(range_field);
+    gdouble *m = gwy_data_field_get_data(mask);
+
+    np = 0;
+    /* ij indexes image points (so the fields are already unshuffled); we then
+     * analyse the curve at pointmap[ij] */
+    for (ij = 0; ij < npoints; ij++) {
+        gdouble zmin = G_MAXDOUBLE, zmax = -G_MAXDOUBLE;
+        const gdouble *ptdata;
+
+        ptdata = data->data + ndata*(height_cid + pointmap[ij]*nchannels);
+        measured_ndata = data->measured_ndata[pointmap[ij]];
+        if (measured_ndata >= 2) {
+            for (k = 0; k < measured_ndata; k++) {
+                gdouble z = ptdata[k];
+                if (z < zmin)
+                    zmin = z;
+                if (z > zmax)
+                    zmax = z;
+            }
+            dm[ij] = zmin;
+            dr[ij] = zmax - zmin;
+            m[ij] = 1.0;
+            np++;
+        }
+        else {
+            dm[ij] = dr[ij] = m[ij] = 0.0;
+        }
+    }
+    if (!np)
+        return FALSE;
+
+    return TRUE;
+}
+
+static int
+compare_double(gconstpointer a, gconstpointer b)
+{
+    const double da = *(const double*)a;
+    const double db = *(const double*)b;
+
+    if (da < db)
+        return -1;
+    if (da > db)
+        return 1;
+    return 0;
+}
+
+/* Enforce interpolation to regular z because there is, in principle, no
+ * guarantee the z values in individual spectra are compatible in any manner.
+ * But we have shared z.  This can cause some information loss... */
+static void
+rasterise_spectrum_curve(GwyXY *data, guint ndata,
+                         const gdouble *abscissa, gdouble *out,
+                         guint nout, guint outstride)
+{
+    guint i, j;
+
+    g_assert(ndata > 0);
+
+    qsort(data, ndata, sizeof(GwyXY), compare_double);
+
+    /* Fill the leading segment before the data start with the first value.
+     * This should not happen except for rounding errors. */
+    i = j = 0;
+    while (i < nout && abscissa[i] <= data[j].x) {
+        *out = data[j].y;
+        out += outstride;
+        i++;
+    }
+
+    /* Interpolate until we reach the end of available values or fill the
+     * entire output array. */
+    while (i < nout && j < ndata-1) {
+        /* Invariant: abscissa[i] >= data[j].x */
+        if (abscissa[i] == data[j].x)
+            *out = data[j].y;
+        else {
+            gdouble d = data[j+1].x - data[j].x;
+            if (G_LIKELY(d > 0.0)) {
+                gdouble t = (abscissa[i] - data[j].x)/d;
+                *out = t*data[j+1].y + (1.0 - t)*data[j].y;
+            }
+            else
+                *out = data[j].y;
+        }
+        out += outstride;
+        i++;
+        /* Possibly move forward in input, preserving the invariant. */
+        while (i < nout && j < ndata-1 && abscissa[i] > data[j+1].x)
+            j++;
+    }
+
+    /* There may be a trailing segment after the last input value because the
+     * curve shorter.  In this case we must have j == ndata-1.  Filling with
+     * the last value seems reasonable. */
+    while (i < nout) {
+        *out = data[ndata-1].y;
+        out += outstride;
+        i++;
+    }
+}
+
+static guint
+create_volume_data(GwyContainer *container, JPKForceFile *jpkfile,
+                   GwySetFractionFunc set_fraction,
+                   GError **error)
+{
+    guint sid, cid, height_cid = jpkfile->height_cid;
+    guint nbricks, ij, k, nchannels = jpkfile->nchannels;
+    guint xres = jpkfile->xres, yres = jpkfile->yres;
+    guint noutdata, ndata;
+    GwyDataField *min_field, *range_field, *mask, *dfield;
+    gdouble *abscissa = NULL;
+    gdouble progres_denom, zmin, zrange;
+    GwyXY *curve = NULL;
+
+    g_return_val_if_fail(height_cid < jpkfile->nchannels, 0);
+
+    min_field = gwy_data_field_new(xres, yres,
+                                   jpkfile->xystep.x*xres,
+                                   jpkfile->xystep.y*yres,
+                                   FALSE);
+    gwy_si_unit_set_from_string(gwy_data_field_get_si_unit_xy(min_field), "m");
+    gwy_si_unit_set_from_string(gwy_data_field_get_si_unit_z(min_field), "m");
+    gwy_data_field_set_xoffset(min_field, jpkfile->xyorigin.x);
+    gwy_data_field_set_yoffset(min_field, jpkfile->xyorigin.y);
+    range_field = gwy_data_field_new_alike(min_field, FALSE);
+    mask = gwy_data_field_new_alike(min_field, FALSE);
+    gwy_si_unit_set_from_string(gwy_data_field_get_si_unit_z(mask), NULL);
+
+    /* FIXME: Pessimistic.  But that is probably better than the opposite. */
+    progres_denom = jpkfile->nsegs*(nchannels - 1.0)*xres*yres;
+
+    nbricks = 0;
+    /* XXX: Segments z-{extend,retract}-height should have linear height.  But
+     * segments z-{extend,retract}-force do not.  What is more problematic, the
+     * z data can be different in each point. So we cannot just attach
+     * a calibration; we need to interpolate the data to a regular z grid. */
+    for (sid = 0; sid < jpkfile->nsegs; sid++) {
+        JPKForceData *data = jpkfile->data + sid;
+        gdouble hstep;
+
+        if (gwy_strequal(data->segment_style, "pause"))
+            continue;
+
+        if (!analyse_height_channel_range(data, jpkfile->pointmap,
+                                          nchannels, xres*yres, height_cid,
+                                          min_field, range_field, mask)) {
+            g_warning("No curves with reasonable number of points found "
+                      "for segment %u.", sid);
+            continue;
+        }
+
+        ndata = data->ndata;
+        hstep = gwy_data_field_area_get_median(range_field, mask,
+                                               0, 0, xres, yres)/ndata;
+        gwy_data_field_area_get_min_max(range_field, mask,
+                                        0, 0, xres, yres, NULL, &zrange);
+        noutdata = GWY_ROUND(zrange/hstep);
+        noutdata = MIN(noutdata, 2*ndata);
+
+        curve = g_renew(GwyXY, curve, noutdata);
+        abscissa = g_renew(gdouble, abscissa, noutdata);
+        for (k = 0; k < noutdata; k++)
+            abscissa[k] = k/(noutdata-1.0) * zrange;
+
+        for (cid = 0; cid < nchannels; cid++) {
+            GwyBrick *brick;
+            gdouble *bdata;
+            gchar *title;
+            GQuark key;
+
+            if (cid == height_cid)
+                continue;
+
+            brick = gwy_brick_new(xres, yres, noutdata,
+                                  jpkfile->xystep.x*xres,
+                                  jpkfile->xystep.y*yres,
+                                  zrange,
+                                  FALSE);
+            bdata = gwy_brick_get_data(brick);
+            /* ij indexes image points; we then extract the curve at
+             * pointmap[ij] */
+            for (ij = 0; ij < xres*yres; ij++) {
+                const gdouble *zdata, *wdata;
+                guint measured_ndata, kpt;
+
+                kpt = jpkfile->pointmap[ij];
+                zdata = data->data + ndata*(height_cid + kpt*nchannels);
+                wdata = data->data + ndata*(cid + kpt*nchannels);
+                measured_ndata = data->measured_ndata[kpt];
+
+                if (measured_ndata > 2) {
+                    zmin = min_field->data[ij];
+                    for (k = 0; k < measured_ndata; k++) {
+                        curve[k].x = zdata[k] - zmin;
+                        curve[k].y = wdata[k];
+                    }
+                    rasterise_spectrum_curve(curve, measured_ndata, abscissa,
+                                             bdata + ij, noutdata, xres*yres);
+                }
+                else {
+                    /* Fill missing curves with zeros. */
+                    for (k = 0; k < noutdata; k++)
+                        bdata[ij + k*xres*yres] = 0.0;
+                }
+
+                if (set_fraction && ij % 1000 == 0) {
+                    if (!set_fraction((nbricks*xres*yres + ij)/progres_denom)) {
+                        err_CANCELLED(error);
+                        g_object_unref(brick);
+                        nbricks = 0;
+                        goto fail;
+                    }
+                }
+            }
+
+            gwy_brick_set_xoffset(brick, jpkfile->xyorigin.x);
+            gwy_brick_set_yoffset(brick, jpkfile->xyorigin.y);
+            gwy_brick_set_zoffset(brick, gwy_data_field_get_min(min_field));
+
+            gwy_si_unit_set_from_string(gwy_brick_get_si_unit_x(brick), "m");
+            gwy_si_unit_set_from_string(gwy_brick_get_si_unit_y(brick), "m");
+            gwy_si_unit_set_from_string(gwy_brick_get_si_unit_z(brick),
+                                        data->units[height_cid]);
+            gwy_si_unit_set_from_string(gwy_brick_get_si_unit_w(brick),
+                                        data->units[cid]);
+
+            key = gwy_app_get_brick_key_for_id(nbricks);
+            gwy_container_set_object(container, key, brick);
+            g_object_unref(brick);
+
+            title = g_strdup_printf("%s [%s]",
+                                    jpkfile->channel_names[cid],
+                                    data->segment_name);
+            key = gwy_app_get_brick_title_key_for_id(nbricks);
+            gwy_container_set_string(container, key, title);
+
+            dfield = gwy_data_field_new(xres, yres,
+                                        gwy_brick_get_xreal(brick),
+                                        gwy_brick_get_yreal(brick),
+                                        FALSE);
+            gwy_brick_mean_plane(brick, dfield, 0, 0, 0, xres, yres, -1, FALSE);
+            key = gwy_app_get_brick_preview_key_for_id(nbricks);
+            gwy_container_set_object(container, key, dfield);
+            g_object_unref(dfield);
+
+            nbricks++;
+        }
+
+        gwy_data_field_grains_invert(mask);
+        create_aux_datafield(container, jpkfile, min_field, mask,
+                             "Force curve start", data);
+        create_aux_datafield(container, jpkfile, range_field, mask,
+                             "Force curve length", data);
+    }
+
+fail:
+    g_free(curve);
+    g_free(abscissa);
+    g_object_unref(min_field);
+    g_object_unref(range_field);
+    g_object_unref(mask);
+
+    return nbricks;
+}
+
+static void
+create_aux_datafield(GwyContainer *container, JPKForceFile *jpkfile,
+                     GwyDataField *srcfield, GwyDataField *mask,
+                     const gchar *name, const JPKForceData *data)
+{
+    GwyDataField *dfield;
+    gchar *title;
+    GQuark key;
+
+    dfield = gwy_data_field_duplicate(srcfield);
+    key = gwy_app_get_data_key_for_id(jpkfile->imgid);
+    gwy_container_set_object(container, key, dfield);
+    g_object_unref(dfield);
+
+    key = gwy_app_get_data_title_key_for_id(jpkfile->imgid);
+    title = g_strdup_printf("%s [%s]", name, data->segment_name);
+    gwy_container_set_string(container, key, title);
+
+    if (gwy_data_field_get_max(mask) > 0.0) {
+        dfield = gwy_data_field_duplicate(mask);
+        key = gwy_app_get_mask_key_for_id(jpkfile->imgid);
+        gwy_container_set_object(container, key, dfield);
+        g_object_unref(dfield);
+    }
+    gwy_file_channel_import_log_add(container, jpkfile->imgid, NULL,
+                                    jpkfile->filename);
+    jpkfile->imgid++;
+}
+
+static guint
+create_sps_data(GwyContainer *container, JPKForceFile *jpkfile,
+                GwySetFractionFunc set_fraction,
+                GError **error)
+{
+    guint sid, cid, height_cid = jpkfile->height_cid;
+    guint nspec, ij, k, nchannels = jpkfile->nchannels;
+    guint xres = jpkfile->xres, yres = jpkfile->yres;
+    guint noutdata, ndata;
+    GwyDataField *min_field, *range_field, *mask;
+    gdouble *abscissa = NULL;
+    gdouble progres_denom, zmin, zrange;
+    GwyXY *curve = NULL;
+
+    g_return_val_if_fail(height_cid < jpkfile->nchannels, 0);
+
+    min_field = gwy_data_field_new(xres, yres,
+                                   jpkfile->xystep.x*xres,
+                                   jpkfile->xystep.y*yres,
+                                   FALSE);
+    gwy_si_unit_set_from_string(gwy_data_field_get_si_unit_xy(min_field), "m");
+    gwy_si_unit_set_from_string(gwy_data_field_get_si_unit_z(min_field), "m");
+    range_field = gwy_data_field_new_alike(min_field, FALSE);
+    mask = gwy_data_field_new_alike(min_field, FALSE);
+    gwy_si_unit_set_from_string(gwy_data_field_get_si_unit_z(mask), NULL);
+
+    /* FIXME: Pessimistic.  But that is probably better than the opposite. */
+    progres_denom = jpkfile->nsegs*(nchannels - 1.0)*xres*yres;
+
+    nspec = 0;
+    for (sid = 0; sid < jpkfile->nsegs; sid++) {
+        JPKForceData *data = jpkfile->data + sid;
+        gdouble hstep;
+
+        if (gwy_strequal(data->segment_style, "pause"))
+            continue;
+
+        if (!analyse_height_channel_range(data, jpkfile->pointmap,
+                                          nchannels, xres*yres, height_cid,
+                                          min_field, range_field, mask)) {
+            g_warning("No curves with reasonable number of points found "
+                      "for segment %u.", sid);
+            continue;
+        }
+
+        ndata = data->ndata;
+        hstep = gwy_data_field_area_get_median(range_field, mask,
+                                               0, 0, xres, yres)/ndata;
+        gwy_data_field_area_get_min_max(range_field, mask,
+                                        0, 0, xres, yres, NULL, &zrange);
+        noutdata = GWY_ROUND(zrange/hstep);
+        noutdata = MIN(noutdata, 2*ndata);
+
+        curve = g_renew(GwyXY, curve, noutdata);
+        abscissa = g_renew(gdouble, abscissa, noutdata);
+        for (k = 0; k < noutdata; k++)
+            abscissa[k] = k/(noutdata-1.0) * zrange;
+
+        for (cid = 0; cid < nchannels; cid++) {
+            GwySpectra *spectra;
+            GwyDataLine *sps;
+            gchar *title;
+            GQuark key;
+
+            if (cid == height_cid)
+                continue;
+
+            spectra = gwy_spectra_new();
+            /* ij indexes image points; we then extract the curve at
+             * pointmap[ij] */
+            for (ij = 0; ij < xres*yres; ij++) {
+                const gdouble *zdata, *wdata;
+                gdouble *sdata;
+                guint measured_ndata, kpt;
+
+                kpt = jpkfile->pointmap[ij];
+                zdata = data->data + ndata*(height_cid + kpt*nchannels);
+                wdata = data->data + ndata*(cid + kpt*nchannels);
+                measured_ndata = data->measured_ndata[kpt];
+
+                if (measured_ndata < 3)
+                    continue;
+
+                zmin = min_field->data[ij];
+                for (k = 0; k < measured_ndata; k++) {
+                    curve[k].x = zdata[k] - zmin;
+                    curve[k].y = wdata[k];
+                }
+                sps = gwy_data_line_new(measured_ndata,
+                                        zrange*measured_ndata/(noutdata - 1.0),
+                                        FALSE);
+                gwy_data_line_set_offset(sps, zmin);
+                gwy_si_unit_set_from_string(gwy_data_line_get_si_unit_x(sps),
+                                            data->units[height_cid]);
+                gwy_si_unit_set_from_string(gwy_data_line_get_si_unit_y(sps),
+                                            data->units[cid]);
+
+                sdata = gwy_data_line_get_data(sps);
+                rasterise_spectrum_curve(curve, measured_ndata, abscissa,
+                                         sdata, measured_ndata, 1);
+
+                gwy_spectra_add_spectrum(spectra, sps,
+                                         jpkfile->coordinates[kpt].x,
+                                         jpkfile->coordinates[kpt].y);
+                g_object_unref(sps);
+
+                if (set_fraction && ij % 1000 == 0) {
+                    if (!set_fraction((nspec*xres*yres + ij)/progres_denom)) {
+                        err_CANCELLED(error);
+                        g_object_unref(spectra);
+                        nspec = 0;
+                        goto fail;
+                    }
+                }
+            }
+
+            gwy_si_unit_set_from_string(gwy_spectra_get_si_unit_xy(spectra),
+                                        "m");
+
+            key = gwy_app_get_spectra_key_for_id(nspec);
+            gwy_container_set_object(container, key, spectra);
+            g_object_unref(spectra);
+
+            title = g_strdup_printf("%s [%s]",
+                                    jpkfile->channel_names[cid],
+                                    data->segment_name);
+            gwy_spectra_set_title(spectra, title);
+            g_free(title);
+
+            nspec++;
+        }
+    }
+
+fail:
+    g_free(curve);
+    g_free(abscissa);
+    g_object_unref(min_field);
+    g_object_unref(range_field);
+    g_object_unref(mask);
+
+    return nspec;
+}
+
+static inline const gchar*
+lookup_either(GHashTable *hash, const gchar *key1, const gchar *key2)
+{
+    const gchar *s;
+
+    if ((s = g_hash_table_lookup(hash, key1)))
+        return s;
+    if ((s = g_hash_table_lookup(hash, key2)))
+        return s;
+    return NULL;
+}
+
+static gboolean
+read_forcemap_data(GwyZipFile zipfile, JPKForceFile *jpkfile,
+                   GwySetFractionFunc set_fraction, GError **error)
+{
+    GHashTable *hash;
+    JPKForceData *data;
+    GString *str = jpkfile->str;
+    const gchar *s;
+    guint sid, ptid;
+
+    if (!gwyzip_first_file(zipfile, error))
+        return FALSE;
+
+    /* FIXME: Which dimension is i and which is j? */
+    hash = jpkfile->header_properties;
+    if ((s = lookup_either(hash,
+                           "quantitative-imaging-map.position-pattern."
+                           "grid.ilength",
+                           "force-scan-map.position-pattern."
+                           "grid.ilength"))) {
+        jpkfile->ilength = atoi(s);
+        gwy_debug("ilength from header %u", jpkfile->ilength);
+    }
+    if ((s = lookup_either(hash,
+                           "quantitative-imaging-map.position-pattern."
+                           "grid.jlength",
+                           "force-scan-map.position-pattern."
+                           "grid.jlength"))) {
+        jpkfile->jlength = atoi(s);
+        gwy_debug("jlength from header %u", jpkfile->jlength);
+    }
+
+    /* XXX: Cannot continue without knowing the number of points from
+     * settings.  Would like avoid allocating all curve data one by one.
+     * Though we might be forced to do that at the end? */
+    if (!jpkfile->shared_header_properties) {
+        err_MISSING_FIELD(error, "num-points");
+        return FALSE;
+    }
+
+    for (sid = 0; sid < jpkfile->nsegs; sid++) {
+        data = jpkfile->data + sid;
+        find_segment_settings(jpkfile, jpkfile->shared_header_properties, sid);
+        if (!data->ndata) {
+            err_MISSING_FIELD(error, "num-points");
+        }
+        /* NB: We cannot allocate anything here.  Must, unfortunately, wait for
+         * enumerate_channels() to be run for the first time. */
+        data->measured_ndata = g_new0(guint, jpkfile->npoints);
+    }
+
+    do {
+        gchar *filename = NULL, *suffix = NULL;
+        guint cid, ndata;
+        gsize datablockoff;
+        gboolean ok;
+
+        if (!gwyzip_get_current_filename(zipfile, &filename, error))
+            return FALSE;
+
+        /* The point header comes after the segment data.  But that is not
+         * of much help because there may be missing segments.  */
+        suffix = match_segment_or_index_filename(filename, jpkfile->index_regex,
+                                                 &ptid);
+        if (suffix && gwy_strequal(suffix, "header.properties")) {
+            g_free(filename);
+            g_free(suffix);
+
+            g_assert(ptid <= jpkfile->npoints);
+
+            hash = parse_header_properties(zipfile, jpkfile, error);
+            if (!hash)
+                return FALSE;
+            if (!(s = lookup_either(hash,
+                                    "quantitative-imaging-series.header."
+                                    "position.x",
+                                    "force-scan-series.header."
+                                    "position.x"))) {
+                err_MISSING_FIELD(error, "position.x");
+                return FALSE;
+            }
+            jpkfile->coordinates[ptid].x = g_ascii_strtod(s, NULL);
+            if (!(s = lookup_either(hash,
+                                    "quantitative-imaging-series.header."
+                                    "position.y",
+                                    "force-scan-series.header."
+                                    "position.y"))) {
+                err_MISSING_FIELD(error, "position.y");
+                return FALSE;
+            }
+            jpkfile->coordinates[ptid].y = g_ascii_strtod(s, NULL);
+            jpkfile->have_coordinates[ptid] = TRUE;
+            free_last_hash(jpkfile);
+            continue;
+        }
+        g_free(suffix);
+
+        /* Find the header. */
+        suffix = match_map_segment_filename(filename,
+                                            jpkfile->index_segment_regex,
+                                            &ptid, &sid);
+        g_free(filename);
+
+        if (!suffix)
+            continue;
+        ok = gwy_strequal(suffix, "segment-header.properties");
+        g_free(suffix);
+        /* This should only happen with the directory entry, not any actual
+         * file. */
+        if (!ok)
+            continue;
+
+        g_assert(sid <= jpkfile->nsegs);
+        g_assert(ptid <= jpkfile->npoints);
+
+        data = jpkfile->data + sid;
+        if (set_fraction && ptid % 1000 == 0) {
+            if (!set_fraction((gdouble)ptid/jpkfile->npoints)) {
+                err_CANCELLED(error);
+                return FALSE;
+            }
+        }
+
+        hash = parse_header_properties(zipfile, jpkfile, error);
+        if (!hash
+            || !enumerate_channels(jpkfile, hash, TRUE, error)
+            || !(ndata = find_segment_npoints(jpkfile, hash, error)))
+            return FALSE;
+
+        if (!data->data) {
+            data->data = g_new(gdouble,
+                               data->ndata*jpkfile->nchannels*jpkfile->npoints);
+            data->units = g_new0(const gchar*, jpkfile->nchannels);
+        }
+
+        //gwy_debug("%u, %u, npts = %u", ptid, sid, ndata);
+        data->measured_ndata[ptid] = ndata;
+        find_segment_settings(jpkfile, hash, sid);
+
+        /* Expect corresponding data files next. */
+        for (cid = 0; cid < jpkfile->nchannels; cid++) {
+            const gchar *datafilename, *datatype;
+
+            if (!(datatype = lookup_channel_property(jpkfile, hash, "type",
+                                                     cid, TRUE, error)))
+                return FALSE;
+
+            //gwy_debug("data.type %s", datatype);
+            /* Handle computed data.  There is no corresponding file. */
+            if (gwy_stramong(datatype, "constant-data", "raster-data", NULL)) {
+                if (!read_computed_data(jpkfile, hash, data,
+                                        datatype, ptid, cid, ndata, error))
+                    return FALSE;
+                continue;
+            }
+
+            /* Otherwise we have actual data and expect a file name. */
+            if (!gwyzip_next_file(zipfile, error))
+                return FALSE;
+
+            if (!(datafilename = lookup_channel_property(jpkfile, hash,
+                                                         "file.name",
+                                                         cid, TRUE, error)))
+                return FALSE;
+
+            g_string_printf(str, "index/%u/segments/%u/%s",
+                            ptid, sid, datafilename);
+            if (!gwyzip_get_current_filename(zipfile, &filename, error))
+                return FALSE;
+            //gwy_debug("expecting file <%s>, found <%s>", str->str, filename);
+            if (!gwy_strequal(filename, str->str)) {
+                err_DATA_FILE_NAME(error, str->str, filename);
                 g_free(filename);
                 return FALSE;
             }
             g_free(filename);
-            apply_default_channel_scaling(jpkfile, jpkfile->data + id, i);
+
+            /* Read the data. */
+            if (!read_raw_data(zipfile, jpkfile, data, hash,
+                               datatype, ptid, cid, ndata, error))
+                return FALSE;
+
+            datablockoff = (ptid*jpkfile->nchannels + cid)*data->ndata;
+            apply_default_channel_scaling(jpkfile, data, hash,
+                                          cid, datablockoff);
         }
+
+        free_last_hash(jpkfile);
+
     } while (gwyzip_next_file(zipfile, NULL));
 
+    for (ptid = 0; ptid < jpkfile->npoints; ptid++) {
+        if (!jpkfile->have_coordinates[ptid]) {
+            g_set_error(error, GWY_MODULE_FILE_ERROR,
+                        GWY_MODULE_FILE_ERROR_DATA,
+                        _("Header properties file for index %u is missing."),
+                        ptid);
+            return FALSE;
+        }
+    }
+
     return TRUE;
 }
 
 static gboolean
 read_raw_data(GwyZipFile zipfile, JPKForceFile *jpkfile,
-              JPKForceData *data, const gchar *datatype, guint i,
+              JPKForceData *data, GHashTable *hash, const gchar *datatype,
+              guint ptid, guint cid, guint ndata,
               GError **error)
 {
     GwyRawDataType rawtype;
-    GHashTable *hash = data->header_properties;
     const gchar *encoder = "";
-    gsize size;
+    gsize size, datablockoff;
     guchar *bytes;
     gdouble q, off;
+    gboolean is_float;
 
     if (gwy_stramong(datatype, "float-data", "float", NULL))
         rawtype = GWY_RAW_DATA_FLOAT;
@@ -1028,7 +1926,7 @@ read_raw_data(GwyZipFile zipfile, JPKForceFile *jpkfile,
     else if (gwy_stramong(datatype, "short-data", "memory-short-data", "short",
                           NULL)) {
         if (!(encoder = lookup_channel_property(jpkfile, hash, "encoder.type",
-                                                i, TRUE, error)))
+                                                cid, TRUE, error)))
             return FALSE;
         if (gwy_stramong(encoder, "unsignedshort", "unsignedshort-limited",
                          NULL))
@@ -1044,7 +1942,7 @@ read_raw_data(GwyZipFile zipfile, JPKForceFile *jpkfile,
     else if (gwy_stramong(datatype, "integer-data", "memory-integer-data",
                           NULL)) {
         if (!(encoder = lookup_channel_property(jpkfile, hash, "encoder.type",
-                                                i, TRUE, error)))
+                                                cid, TRUE, error)))
             return FALSE;
         if (gwy_stramong(encoder, "unsignedinteger", "unsignedinteger-limited",
                          NULL))
@@ -1060,7 +1958,7 @@ read_raw_data(GwyZipFile zipfile, JPKForceFile *jpkfile,
     else if (gwy_stramong(datatype, "long-data", "memory-long-data", "long",
                           NULL)) {
         if (!(encoder = lookup_channel_property(jpkfile, hash, "encoder.type",
-                                                i, TRUE, error)))
+                                                cid, TRUE, error)))
             return FALSE;
         if (gwy_stramong(encoder, "unsignedlong", "unsignedlong-limited",
                          NULL))
@@ -1081,7 +1979,7 @@ read_raw_data(GwyZipFile zipfile, JPKForceFile *jpkfile,
     if (!(bytes = gwyzip_get_file_content(zipfile, &size, error)))
         return FALSE;
 
-    if (err_SIZE_MISMATCH(error, data->ndata*gwy_raw_data_size(rawtype), size,
+    if (err_SIZE_MISMATCH(error, ndata*gwy_raw_data_size(rawtype), size,
                           TRUE)) {
         g_free(bytes);
         return FALSE;
@@ -1090,29 +1988,125 @@ read_raw_data(GwyZipFile zipfile, JPKForceFile *jpkfile,
     /* Apply the encoder conversion factors.  These convert raw data to some
      * sensor physical values, typically Volts.  Conversions to values we
      * actually want to display are done later.  */
-    find_scaling_parameters(jpkfile, hash, "encoder", i,
-                            &q, &off, data->units + i);
-    gwy_convert_raw_data(bytes, data->ndata, 1, rawtype,
+    /* Apparently floating point data do not need encoder (makes sense but
+     * the file spec is unclear in this regard). */
+    is_float = (rawtype == GWY_RAW_DATA_DOUBLE
+                || rawtype == GWY_RAW_DATA_FLOAT);
+    find_scaling_parameters(jpkfile, hash, "encoder", cid,
+                            &q, &off, data->units + cid,
+                            is_float);
+    /* Use allocate ndata from settings, not actual ndata for segment here! */
+    datablockoff = (ptid*jpkfile->nchannels + cid)*data->ndata;
+    gwy_convert_raw_data(bytes, ndata, 1, rawtype,
                          GWY_BYTE_ORDER_BIG_ENDIAN,
-                         data->data + i*data->ndata, q, off);
+                         data->data + datablockoff, q, off);
     g_free(bytes);
-    gwy_debug("read %u (%s,%s) data points",
-              data->ndata, datatype, encoder);
+    //gwy_debug("read %u (%s,%s) data points", ndata, datatype, encoder);
     return TRUE;
 }
 
+static gboolean
+read_computed_data(JPKForceFile *jpkfile, GHashTable *header_properties,
+                   JPKForceData *data, const gchar *datatype,
+                   guint ptid, guint cid, guint ndata,
+                   GError **error)
+{
+    gsize datablockoff;
+    const gchar *s;
+    gdouble value, start, step;
+    gdouble *d;
+    guint j;
+
+    /* Use allocate ndata from settings, not actual ndata for segment here! */
+    datablockoff = (ptid*jpkfile->nchannels + cid)*data->ndata;
+    d = data->data + datablockoff;
+
+    if (gwy_strequal(datatype, "constant-data")) {
+        if (!(s = lookup_channel_property(jpkfile, header_properties,
+                                          "value", cid, TRUE, error)))
+            return FALSE;
+        value = g_ascii_strtod(s, NULL);
+
+        for (j = 0; j < ndata; j++)
+            d[j] = value;
+        return TRUE;
+    }
+
+    if (gwy_strequal(datatype, "raster-data")) {
+        if (!(s = lookup_channel_property(jpkfile, header_properties,
+                                          "start", cid, TRUE, error)))
+            return FALSE;
+        start = g_ascii_strtod(s, NULL);
+        if (!(s = lookup_channel_property(jpkfile, header_properties,
+                                          "step", cid, TRUE, error)))
+            return FALSE;
+        step = g_ascii_strtod(s, NULL);
+
+        for (j = 0; j < ndata; j++)
+            d[j] = start + j*step;
+        return TRUE;
+    }
+
+    g_assert_not_reached();
+    return FALSE;
+}
+
+static void
+find_segment_settings(JPKForceFile *jpkfile,
+                      GHashTable *header_properties, guint sid)
+{
+    GHashTable *shared_properties = jpkfile->shared_header_properties;
+    JPKForceData *data = jpkfile->data + sid;
+    GString *str = jpkfile->str;
+    const gchar *s;
+
+    g_free(data->segment_name);
+    data->segment_name = find_sgement_name(header_properties, shared_properties,
+                                           sid, str);
+    //gwy_debug("segment %u name: %s", sid, data->segment_name);
+    /* FIXME: Should we fail when segment_name is NULL? */
+
+    data->segment_style = g_hash_table_lookup(header_properties,
+                                              "force-segment-header.settings"
+                                              ".segment-settings.style");
+    if (!data->segment_style && shared_properties) {
+        g_string_printf(str, "force-segment-header-info.%u.settings."
+                        "segment-settings.style", sid);
+        data->segment_style = g_hash_table_lookup(shared_properties, str->str);
+    }
+    //gwy_debug("segment %u style: %s", sid, data->segment_style);
+
+    if (!data->ndata && shared_properties) {
+        g_string_printf(str, "force-segment-header-info.%u.settings."
+                        "segment-settings.num-points", sid);
+        if ((s = g_hash_table_lookup(shared_properties, str->str)))
+            data->ndata = atoi(s);
+    }
+    //gwy_debug("segment %u num-points: %u", sid, data->ndata);
+
+    data->segment_type = g_hash_table_lookup(header_properties,
+                                             "force-segment-header.settings"
+                                             ".segment-settings.type");
+    if (!data->segment_type && shared_properties) {
+        g_string_printf(str, "force-segment-header-info.%u.settings."
+                        "segment-settings.type", sid);
+        data->segment_type = g_hash_table_lookup(shared_properties, str->str);
+    }
+    //gwy_debug("segment %u type: %s", sid, data->segment_type);
+}
+
 static guint
 find_segment_npoints(JPKForceFile *jpkfile,
                      GHashTable *header_properties, GError **error)
 {
-    guint i, npts = 0;
+    guint cid, npts = 0;
     const gchar *s;
 
-    for (i = 0; i < jpkfile->nchannels; i++) {
+    for (cid = 0; cid < jpkfile->nchannels; cid++) {
         if (!(s = lookup_channel_property(jpkfile, header_properties,
-                                          "num-points", i, TRUE, error)))
+                                          "num-points", cid, TRUE, error)))
             return 0;
-        if (i) {
+        if (cid) {
             if (atoi(s) != npts) {
                 err_INVALID(error, jpkfile->str->str);
                 return 0;
@@ -1128,21 +2122,41 @@ find_segment_npoints(JPKForceFile *jpkfile,
     return npts;
 }
 
+static const gchar*
+lookup_similar(GHashTable *hash, GString *str, guint len, const gchar *newend)
+{
+    g_string_truncate(str, len);
+    g_string_append(str, newend);
+    return g_hash_table_lookup(hash, str->str);
+}
+
 static gchar*
-find_sgement_name(GHashTable *header_properties)
+find_sgement_name(GHashTable *segment_properties, GHashTable *shared_properties,
+                  guint sid, GString *str)
 {
+    GHashTable *hash;
     const gchar *t, *name, *prefix, *suffix;
+    guint len;
     gchar *s;
 
-    t = g_hash_table_lookup(header_properties,
-                            "force-segment-header.settings"
-                            ".segment-settings.identifier.type");
-    name = g_hash_table_lookup(header_properties,
-                               "force-segment-header.settings"
-                               ".segment-settings.identifier.name");
+    /* Figure out the correct leading part of the path. */
+    hash = segment_properties;
+    g_string_assign(str, "force-segment-header.settings."
+                    "segment-settings.identifier.");
+    len = str->len;
+    name = lookup_similar(hash, str, len, "name");
+    if (!name && shared_properties) {
+        hash = shared_properties;
+        g_string_printf(str, "force-segment-header-info.%u.settings."
+                        "segment-settings.identifier.", sid);
+        len = str->len;
+        name = lookup_similar(hash, str, len, "name");
+    }
     if (!name)
         return NULL;
 
+    /* Use this leading part for all other keys. */
+    t = lookup_similar(hash, str, len, "type");
     if (!t) {
         g_warning("Missing identifier type.");
         return g_strdup(name);
@@ -1154,12 +2168,8 @@ find_sgement_name(GHashTable *header_properties)
         return s;
     }
     if (gwy_strequal(t, "ExtendedStandard")) {
-        prefix = g_hash_table_lookup(header_properties,
-                                     "force-segment-header.settings"
-                                     ".segment-settings.identifier.prefix");
-        suffix = g_hash_table_lookup(header_properties,
-                                     "force-segment-header.settings"
-                                     ".segment-settings.identifier.suffix");
+        prefix = lookup_similar(hash, str, len, "prefix");
+        suffix = lookup_similar(hash, str, len, "suffix");
         if (prefix && suffix)
             return g_strconcat(prefix, name, suffix, NULL);
         g_warning("Prefix or suffix missing for ExtendedStandard identifier.");
@@ -1177,37 +2187,38 @@ find_sgement_name(GHashTable *header_properties)
 static gboolean
 apply_default_channel_scaling(JPKForceFile *jpkfile,
                               JPKForceData *data,
-                              guint i)
+                              GHashTable *header_properties,
+                              guint cid,
+                              gsize datablockoff)
 {
-    GHashTable *header_properties = data->header_properties;
     const gchar *default_cal;
     gdouble q, off;
     gdouble *d;
     gchar *key;
     guint j, ndata;
 
-    if (!(default_cal = jpkfile->default_cals[i])) {
+    if (!(default_cal = jpkfile->default_cals[cid])) {
         default_cal = lookup_channel_property(jpkfile, header_properties,
                                               "conversion-set.conversions.default",
-                                              i, FALSE, NULL);
+                                              cid, FALSE, NULL);
         if (!default_cal) {
             g_warning("Cannot find the default conversion.");
             return FALSE;
         }
         else
-            jpkfile->default_cals[i] = default_cal;
+            jpkfile->default_cals[cid] = default_cal;
     }
 
     key = g_strconcat("conversion-set.conversion.", default_cal, NULL);
-    if (!find_scaling_parameters(jpkfile, header_properties, key, i,
-                                 &q, &off, data->units + i)) {
+    if (!find_scaling_parameters(jpkfile, header_properties, key, cid,
+                                 &q, &off, data->units + cid, FALSE)) {
         g_free(key);
         return FALSE;
     }
     g_free(key);
 
     ndata = data->ndata;
-    d = data->data + i*ndata;
+    d = data->data + datablockoff;
     for (j = 0; j < ndata; j++)
         d[j] = q*d[j] + off;
 
@@ -1219,17 +2230,19 @@ lookup_scaling_property(JPKForceFile *jpkfile,
                         GHashTable *hash,
                         const gchar *subkey,
                         guint len,
-                        guint i,
-                        const gchar *expected_value)
+                        guint cid,
+                        const gchar *expected_value,
+                        gboolean ignore_missing)
 {
     GString *key = jpkfile->qstr;
     const gchar *s;
 
     g_string_truncate(key, len);
     g_string_append(key, subkey);
-    s = lookup_channel_property(jpkfile, hash, key->str, i, FALSE, NULL);
+    s = lookup_channel_property(jpkfile, hash, key->str, cid, FALSE, NULL);
     if (!s) {
-        g_warning("Cannot find %s.", key->str);
+        if (!ignore_missing)
+            g_warning("Cannot find %s.", key->str);
         return NULL;
     }
     if (expected_value && !gwy_strequal(s, expected_value)) {
@@ -1247,10 +2260,11 @@ static gboolean
 find_scaling_parameters(JPKForceFile *jpkfile,
                         GHashTable *hash,
                         const gchar *subkey,
-                        guint i,
+                        guint cid,
                         gdouble *multiplier,
                         gdouble *offset,
-                        const gchar **unit)
+                        const gchar **unit,
+                        gboolean ignore_missing)
 {
     /* There seem to be different unit styles.  Documentation says just "unit"
      * but I see "unit.type" and "unit.unit" for the actual unit.  Try both. */
@@ -1278,7 +2292,7 @@ find_scaling_parameters(JPKForceFile *jpkfile,
      * already know we are at the base calibration by looking at
      * "conversions.base" but we do not bother at present. */
     g_string_append(key, "defined");
-    if ((s = lookup_channel_property(jpkfile, hash, key->str, i, FALSE, NULL))
+    if ((s = lookup_channel_property(jpkfile, hash, key->str, cid, FALSE, NULL))
         && gwy_strequal(s, "false"))
         return TRUE;
 
@@ -1286,20 +2300,23 @@ find_scaling_parameters(JPKForceFile *jpkfile,
     g_string_append(key, "scaling.");
     len = key->len;
 
-    if (!lookup_scaling_property(jpkfile, hash, "type", len, i, "linear"))
+    if (!lookup_scaling_property(jpkfile, hash, "type", len, cid,
+                                 "linear", ignore_missing))
         return FALSE;
-    if (!lookup_scaling_property(jpkfile, hash, "style", len, i,
-                                 "offsetmultiplier"))
+    if (!lookup_scaling_property(jpkfile, hash, "style", len, cid,
+                                 "offsetmultiplier", ignore_missing))
         return FALSE;
-    if ((s = lookup_scaling_property(jpkfile, hash, "offset", len, i, NULL)))
+    if ((s = lookup_scaling_property(jpkfile, hash, "offset", len, cid,
+                                     NULL, ignore_missing)))
         *offset = g_ascii_strtod(s, NULL);
-    if ((s = lookup_scaling_property(jpkfile, hash, "multiplier", len, i, NULL)))
+    if ((s = lookup_scaling_property(jpkfile, hash, "multiplier", len, cid,
+                                     NULL, ignore_missing)))
         *multiplier = g_ascii_strtod(s, NULL);
 
     for (j = 0; j < G_N_ELEMENTS(unit_keys); j++) {
         g_string_truncate(key, len);
         g_string_append(key, unit_keys[j]);
-        s = lookup_channel_property(jpkfile, hash, key->str, i, FALSE, NULL);
+        s = lookup_channel_property(jpkfile, hash, key->str, cid, FALSE, NULL);
         if (s) {
             *unit = s;
             break;
@@ -1313,7 +2330,7 @@ find_scaling_parameters(JPKForceFile *jpkfile,
     g_string_assign(key, subkey);
     len = key->len;
     g_string_append(key, ".base-calibration-slot");
-    bcs = lookup_channel_property(jpkfile, hash, key->str, i, FALSE, NULL);
+    bcs = lookup_channel_property(jpkfile, hash, key->str, cid, FALSE, NULL);
     if (!bcs)
         return TRUE;
 
@@ -1328,8 +2345,9 @@ find_scaling_parameters(JPKForceFile *jpkfile,
     g_string_truncate(key, s+1 - subkey);
     g_string_append(key, bcs);
     bcskey = g_strdup(key->str);
-    if (find_scaling_parameters(jpkfile, hash, bcskey, i,
-                                &base_multipler, &base_offset, &base_unit)) {
+    if (find_scaling_parameters(jpkfile, hash, bcskey, cid,
+                                &base_multipler, &base_offset, &base_unit,
+                                FALSE)) {
         g_free(bcskey);
         *multiplier *= base_multipler;
         *offset += *multiplier * base_offset;
@@ -1370,15 +2388,19 @@ lookup_channel_property(JPKForceFile *jpkfile,
     g_string_append(str, "lcd-info.");
     g_string_append(str, subkey);
     if ((retval = lookup_property(jpkfile, header_properties, str->str,
-                                  fail_if_not_found, &err)))
+                                  fail_if_not_found,
+                                  fail_if_not_found ? &err : NULL)))
         return retval;
 
     g_string_truncate(str, len);
     g_string_append(str, "data.");
     g_string_append(str, subkey);
     if ((retval = lookup_property(jpkfile, header_properties, str->str,
-                                  FALSE, NULL)))
+                                  FALSE, NULL))) {
+        if (fail_if_not_found)
+            g_clear_error(&err);
         return retval;
+    }
 
     if (fail_if_not_found) {
         /* @err cannot be set otherwise. */
@@ -1428,7 +2450,7 @@ lookup_property(JPKForceFile *jpkfile,
     g_string_append_c(sstr, '.');
     g_string_append(sstr, s);
     g_string_append(sstr, key + len);
-    gwy_debug("shared properties key <%s>", sstr->str);
+    //gwy_debug("shared properties key <%s>", sstr->str);
 
     if ((s = g_hash_table_lookup(jpkfile->shared_header_properties, sstr->str)))
         return s;
@@ -1508,8 +2530,9 @@ analyse_segment_ids(JPKForceFile *jpkfile, GError **error)
 
     g_assert(jpkfile->type == JPK_FORCE_CURVES);
     for (i = 0; i < nids; i++) {
-        if (jpkfile->ids[i] != i)
+        if (jpkfile->ids[i] != i) {
             return err_IRREGULAR_NUMBERING(error);
+        }
     }
 
     jpkfile->nsegs = nids;
@@ -1517,111 +2540,252 @@ analyse_segment_ids(JPKForceFile *jpkfile, GError **error)
     return TRUE;
 }
 
+static void
+add_id_to_array(gpointer hkey, G_GNUC_UNUSED gpointer hval, gpointer user_data)
+{
+    guint id = GPOINTER_TO_UINT(hkey);
+    GArray *array = (GArray*)user_data;
+
+    g_array_append_val(array, id);
+}
+
 static gboolean
 analyse_map_segment_ids(JPKForceFile *jpkfile, GError **error)
 {
-    guint i, j, k, nids = jpkfile->nids;
-    guint nsegs, npoints, idx0, idx;
+    GHashTable *idhash;
+    GArray *idlist;
+    guint *allids;
+    guint i, j, k, kk, nids = jpkfile->nids;
+    guint nsegs, npoints, idx;
 
     g_assert(jpkfile->type == JPK_FORCE_MAP || jpkfile->type == JPK_FORCE_QI);
-    idx0 = jpkfile->ids[0];
-    for (i = 1; i < nids; i++) {
+    gwy_debug("nids %u", nids);
+
+    idhash = g_hash_table_new(g_direct_hash, g_direct_equal);
+    for (i = 0; i < nids; i++) {
+        idx = jpkfile->ids[2*i + 1];
+        g_hash_table_insert(idhash,
+                            GUINT_TO_POINTER(idx), GUINT_TO_POINTER(TRUE));
+    }
+    idlist = g_array_new(FALSE, FALSE, sizeof(guint));
+    g_hash_table_foreach(idhash, add_id_to_array, idlist);
+    g_array_sort(idlist, compare_uint);
+    nsegs = idlist->len;
+
+    gwy_debug("segment ids (%u)", nsegs);
+    for (i = 0; i < nsegs; i++) {
+        if (g_array_index(idlist, guint, i) != i) {
+            g_array_free(idlist, TRUE);
+            g_hash_table_destroy(idhash);
+            return err_IRREGULAR_NUMBERING(error);
+        }
+    }
+
+    g_hash_table_steal_all(idhash);
+    for (i = 0; i < nids; i++) {
         idx = jpkfile->ids[2*i];
-        if (idx != idx0)
-            break;
+        g_hash_table_insert(idhash,
+                            GUINT_TO_POINTER(idx), GUINT_TO_POINTER(TRUE));
     }
-    nsegs = i;
-    if (nids % nsegs != 0)
-        return err_IRREGULAR_NUMBERING(error);
+    g_array_set_size(idlist, 0);
+    g_hash_table_foreach(idhash, add_id_to_array, idlist);
+    g_array_sort(idlist, compare_uint);
+    npoints = idlist->len;
 
-    npoints = nids/nsegs;
+    gwy_debug("point ids (%u)", npoints);
     for (i = 0; i < npoints; i++) {
-        for (j = 0; j < nsegs; j++) {
-            k = i*nsegs + j;
-            if (jpkfile->ids[2*k] != i || jpkfile->ids[2*k + 1] != j)
-                return err_IRREGULAR_NUMBERING(error);
+        if (g_array_index(idlist, guint, i) != i) {
+            g_array_free(idlist, TRUE);
+            g_hash_table_destroy(idhash);
+            return err_IRREGULAR_NUMBERING(error);
         }
     }
+    g_array_free(idlist, TRUE);
+    g_hash_table_destroy(idhash);
+
+    /* There can be some missing spectra.  But if there is too large disparity
+     * between nsegs*npoints and the number of curves then something is amiss.
+     * We do not want to try allocating a huge chunk of memory in result... */
+    if (nids/npoints > nsegs+1)
+        return err_IRREGULAR_NUMBERING(error);
 
     jpkfile->nsegs = nsegs;
     jpkfile->npoints = npoints;
-    return TRUE;
-}
-
-static gboolean
-enumerate_segments(GwyZipFile zipfile, JPKForceFile *jpkfile)
-{
-    GArray *ids;
 
-    if (!gwyzip_first_file(zipfile, NULL))
-        return FALSE;
-
-    ids = g_array_new(FALSE, FALSE, sizeof(gint));
-    do {
-        gchar *filename = NULL, *suffix = NULL;
-        guint id;
-
-        if (!gwyzip_get_current_filename(zipfile, &filename, NULL))
-            continue;
+    gwy_debug("expecting missing %u curves", nsegs*npoints - nids);
+    if (nids == nsegs*npoints)
+        return TRUE;
 
-        if ((suffix = match_segment_filename(filename,
-                                             jpkfile->segment_regex,
-                                             &id))) {
-            if (gwy_strequal(suffix, "segment-header.properties")) {
-                g_array_append_val(ids, id);
-                gwy_debug("segment: %s -> %u", filename, id);
+    /* Some curves are missing.  Insert markers to the ids[] array so that
+     * we have it formally complete. */
+    allids = g_new(guint, 2*nids*npoints);
+    kk = k = 0;
+    for (i = 0; i < npoints; i++) {
+        for (j = 0; j < nsegs; j++) {
+            k = i*nsegs + j;
+            if (jpkfile->ids[2*kk] != i || jpkfile->ids[2*kk + 1] != j) {
+                allids[2*k] = allids[2*k + 1] = G_MAXUINT;
+            }
+            else {
+                allids[2*k] = i;
+                allids[2*k + 1] = j;
+                kk++;
             }
-            g_free(suffix);
         }
-        g_free(filename);
-    } while (gwyzip_next_file(zipfile, NULL));
-
-    if (!ids->len) {
-        g_array_free(ids, TRUE);
-        return FALSE;
     }
+    gwy_debug("%u missing curves", k+1 - kk);
+    GWY_SWAP(guint*, jpkfile->ids, allids);
 
-    g_array_sort(ids, compare_uint);
-    jpkfile->nids = ids->len;
-    jpkfile->ids = (guint*)g_array_free(ids, FALSE);
     return TRUE;
 }
 
+/*
+ * We want to avoid:
+ * - gwyzip_locate_file() on files that can be at the end; for instance shared
+ *   header properties
+ * - scanning the file twice to figure out what kind of data we are dealing
+ *   with
+ * Either takes a *long* time.
+ *
+ * So here we gather info about curve segments, read any special file we come
+ * across along the way and decide the file type, all in a single pass.
+ */
 static gboolean
-enumerate_map_segments(GwyZipFile zipfile, JPKForceFile *jpkfile)
+scan_file_enumerate_segments(GwyZipFile zipfile, JPKForceFile *jpkfile,
+                             GwySetMessageFunc set_message,
+                             GError **error)
 {
-    GArray *ids;
+    GRegex *seg_regex = jpkfile->segment_regex,
+           *map_regex = jpkfile->index_segment_regex;
+    GHashTable *hash;
+    GArray *ids = NULL;
 
-    if (!gwyzip_first_file(zipfile, NULL))
+    gwy_debug("file");
+    if (!gwyzip_first_file(zipfile, error))
         return FALSE;
 
-    ids = g_array_new(FALSE, FALSE, 2*sizeof(gint));
     do {
         gchar *filename = NULL, *suffix = NULL;
-        guint id[2];
+        guint id, id2[2];
 
-        if (!gwyzip_get_current_filename(zipfile, &filename, NULL))
-            continue;
+        if (!gwyzip_get_current_filename(zipfile, &filename, error)) {
+            if (ids)
+                g_array_free(ids, TRUE);
+            return FALSE;
+        }
 
-        if ((suffix = match_map_segment_filename(filename,
-                                                 jpkfile->index_segment_regex,
-                                                 id + 0, id + 1))) {
-            if (gwy_strequal(suffix, "segment-header.properties")) {
-                g_array_append_val(ids, id);
-                gwy_debug("map segment: %s -> %u,%u", filename, id[0], id[1]);
+        if (gwy_strequal(filename, "header.properties")) {
+            /* If we encounter main header.properties read it. */
+            if (jpkfile->header_properties)
+                g_warning("%s found twice, using the first one", filename);
+            else {
+                if (!(hash = parse_header_properties(zipfile, jpkfile,
+                                                     error))) {
+                    if (ids)
+                        g_array_free(ids, TRUE);
+                    g_free(filename);
+                    return FALSE;
+                }
+                jpkfile->header_properties = hash;
+                jpkfile->last_hash = NULL;   /* Take ownership. */
+            }
+        }
+        else if (gwy_strequal(filename, "shared-data/header.properties")) {
+            /* If we encounter shared header.properties read it. */
+            if (jpkfile->shared_header_properties)
+                g_warning("%s found twice, using the first one", filename);
+            else {
+                if (!(hash = parse_header_properties(zipfile, jpkfile,
+                                                     error))) {
+                    if (ids)
+                        g_array_free(ids, TRUE);
+                    g_free(filename);
+                    return FALSE;
+                }
+                jpkfile->shared_header_properties = hash;
+                jpkfile->last_hash = NULL;   /* Take ownership. */
+            }
+        }
+        else if (jpkfile->type == JPK_FORCE_MAP) {
+            /* File type known (MAP vs QI resolved later), try to get ids. */
+            if ((suffix = match_map_segment_filename(filename, map_regex,
+                                                     id2 + 0, id2 + 1))) {
+                if (gwy_strequal(suffix, "segment-header.properties")) {
+                    g_array_append_val(ids, id2);
+                    if (set_message && ids->len % 10000 == 0) {
+                        g_string_printf(jpkfile->str,
+                                        _("Scanning file (%u curves)..."),
+                                        ids->len);
+                        if (!set_message(jpkfile->str->str)) {
+                            g_free(suffix);
+                            g_free(filename);
+                            err_CANCELLED(error);
+                            g_array_free(ids, TRUE);
+                            return FALSE;
+                        }
+                    }
+                }
+                g_free(suffix);
+            }
+        }
+        else if (jpkfile->type == JPK_FORCE_CURVES) {
+            /* File type known, try to get id. */
+            if ((suffix = match_segment_or_index_filename(filename, seg_regex,
+                                                          &id))) {
+                if (gwy_strequal(suffix, "segment-header.properties")) {
+                    g_array_append_val(ids, id);
+                    gwy_debug("segment: %s -> %u", filename, id);
+                }
+                g_free(suffix);
+            }
+        }
+        else {
+            /* Try to decide the file type. */
+            if ((suffix = match_map_segment_filename(filename, map_regex,
+                                                     id2 + 0, id2 + 1))) {
+                if (gwy_strequal(suffix, "segment-header.properties")) {
+                    jpkfile->type = JPK_FORCE_MAP;
+                    ids = g_array_new(FALSE, FALSE, 2*sizeof(gint));
+                    g_array_append_val(ids, id2);
+                }
+                g_free(suffix);
+            }
+            else if ((suffix = match_segment_or_index_filename(filename,
+                                                               seg_regex,
+                                                               &id))) {
+                if (gwy_strequal(suffix, "segment-header.properties")) {
+                    jpkfile->type = JPK_FORCE_CURVES;
+                    ids = g_array_new(FALSE, FALSE, sizeof(gint));
+                    g_array_append_val(ids, id);
+                    gwy_debug("segment: %s -> %u", filename, id);
+                }
+                g_free(suffix);
             }
-            g_free(suffix);
         }
         g_free(filename);
     } while (gwyzip_next_file(zipfile, NULL));
 
-    if (!ids->len) {
+    if (!ids) {
+        err_NO_DATA(error);
+        return FALSE;
+    }
+    g_assert(jpkfile->type);
+
+    if (!jpkfile->header_properties) {
+        g_set_error(error, GWY_MODULE_FILE_ERROR, GWY_MODULE_FILE_ERROR_IO,
+                    _("File %s is missing in the zip file."),
+                    "header.properties");
         g_array_free(ids, TRUE);
         return FALSE;
     }
 
-    g_array_sort(ids, compare_uint2);
+    if (jpkfile->type == JPK_FORCE_MAP)
+        g_array_sort(ids, compare_uint2);
+    else
+        g_array_sort(ids, compare_uint);
+
     jpkfile->nids = ids->len;
+    gwy_debug("total nids: %u", jpkfile->nids);
     jpkfile->ids = (guint*)g_array_free(ids, FALSE);
     return TRUE;
 }
@@ -1639,13 +2803,17 @@ parse_header_properties(GwyZipFile zipfile, JPKForceFile *jpkfile,
         return NULL;
 
     jpkfile->buffers = g_slist_prepend(jpkfile->buffers, contents);
-    hash = g_hash_table_new(g_str_hash, g_str_equal);
 
     gwy_clear(&parser, 1);
     parser.comment_prefix = "#";
     parser.key_value_separator = "=";
     hash = gwy_text_header_parse((gchar*)contents, &parser, NULL, error);
-#ifdef DEBUG
+    if (hash && jpkfile->last_hash) {
+        g_warning("Overwriting last_hash, memory leak is imminent.");
+    }
+    jpkfile->last_hash = hash;
+//#ifdef DEBUG
+#if 0
     if (hash) {
         gchar *filename;
         if (gwyzip_get_current_filename(zipfile, &filename, NULL)) {
@@ -1662,12 +2830,25 @@ parse_header_properties(GwyZipFile zipfile, JPKForceFile *jpkfile,
 }
 
 static void
+free_last_hash(JPKForceFile *jpkfile)
+{
+    g_hash_table_destroy(jpkfile->last_hash);
+    jpkfile->last_hash = NULL;
+
+    g_free(jpkfile->buffers->data);
+    jpkfile->buffers = g_slist_delete_link(jpkfile->buffers, jpkfile->buffers);
+}
+
+static void
 jpk_force_file_free(JPKForceFile *jpkfile)
 {
     GSList *l;
     guint i;
 
     g_free(jpkfile->ids);
+    g_free(jpkfile->coordinates);
+    g_free(jpkfile->pointmap);
+    g_free(jpkfile->have_coordinates);
 
     for (i = 0; i < jpkfile->nchannels; i++)
         g_free(jpkfile->channel_names[i]);
@@ -1676,6 +2857,8 @@ jpk_force_file_free(JPKForceFile *jpkfile)
 
     if (jpkfile->segment_regex)
         g_regex_unref(jpkfile->segment_regex);
+    if (jpkfile->index_regex)
+        g_regex_unref(jpkfile->index_regex);
     if (jpkfile->index_segment_regex)
         g_regex_unref(jpkfile->index_segment_regex);
 
@@ -1692,27 +2875,19 @@ jpk_force_file_free(JPKForceFile *jpkfile)
     if (jpkfile->shared_header_properties)
         g_hash_table_destroy(jpkfile->shared_header_properties);
 
-    if (jpkfile->point_header_properties) {
-        for (i = 0; i < jpkfile->npoints; i++) {
-            if (jpkfile->point_header_properties[i])
-                g_hash_table_destroy(jpkfile->point_header_properties[i]);
-        }
-        g_free(jpkfile->point_header_properties);
-    }
-
     if (jpkfile->data) {
-        for (i = 0; i < jpkfile->nids; i++) {
-            if (jpkfile->data[i].header_properties)
-                g_hash_table_destroy(jpkfile->data[i].header_properties);
+        for (i = 0; i < jpkfile->nsegs; i++) {
             g_free(jpkfile->data[i].data);
             g_free(jpkfile->data[i].segment_name);
             g_free(jpkfile->data[i].units);
+            g_free(jpkfile->data[i].measured_ndata);
         }
         g_free(jpkfile->data);
     }
 
     while ((l = jpkfile->buffers)) {
         jpkfile->buffers = g_slist_next(l);
+        g_free(l->data);
         g_slist_free_1(l);
     }
 }
diff --git a/modules/file/jspmfile.c b/modules/file/jspmfile.c
index 720f1ef..90f5a99 100644
--- a/modules/file/jspmfile.c
+++ b/modules/file/jspmfile.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: jspmfile.c 16831 2014-11-29 10:08:47Z yeti-dn $
+ *  @(#) $Id: jspmfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -192,7 +192,7 @@ static GwyModuleInfo module_info = {
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, jspmfile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/keyence.c b/modules/file/keyence.c
index 5cfe757..9b4869e 100644
--- a/modules/file/keyence.c
+++ b/modules/file/keyence.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: keyence.c 18034 2016-01-08 14:02:03Z yeti-dn $
+ *  $Id: keyence.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2015 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -319,7 +319,7 @@ static GwyModuleInfo module_info = {
     "2015",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, keyence)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/leica.c b/modules/file/leica.c
index d703855..3b30cef 100644
--- a/modules/file/leica.c
+++ b/modules/file/leica.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: leica.c 19130 2016-10-27 20:58:23Z dn2010 $
+ *  $Id: leica.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014 Daniil Bratashov (dn2010), David Necas (Yeti)..
  *
  *  E-mail: dn2010 at gmail.com.
@@ -180,7 +180,7 @@ static GwyModuleInfo module_info = {
     "2016",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, leica)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/lextfile.c b/modules/file/lextfile.c
index 0a272f2..35ff94e 100644
--- a/modules/file/lextfile.c
+++ b/modules/file/lextfile.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: lextfile.c 16387 2014-07-10 10:41:50Z yeti-dn $
+ *  @(#) $Id: lextfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2010 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -84,7 +84,7 @@ static GwyModuleInfo module_info = {
     "2010",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, lextfile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/magellan.c b/modules/file/magellan.c
index ac3fb67..a72622b 100644
--- a/modules/file/magellan.c
+++ b/modules/file/magellan.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: magellan.c 17801 2015-12-03 15:02:50Z yeti-dn $
+ *  @(#) $Id: magellan.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2013 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -65,7 +65,7 @@ static GwyModuleInfo module_info = {
     "2013",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, magellan)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/mapvue.c b/modules/file/mapvue.c
index 2a3dd73..5d88e74 100644
--- a/modules/file/mapvue.c
+++ b/modules/file/mapvue.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: mapvue.c 16387 2014-07-10 10:41:50Z yeti-dn $
+ *  $Id: mapvue.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2009,2011 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -471,7 +471,7 @@ static GwyModuleInfo module_info = {
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, mapvue)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/metropro.c b/modules/file/metropro.c
index b7b8d19..eb26af3 100644
--- a/modules/file/metropro.c
+++ b/modules/file/metropro.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: metropro.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: metropro.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2006,2014 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -344,7 +344,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, metropro)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/microprof.c b/modules/file/microprof.c
index 935815e..b30c2b6 100644
--- a/modules/file/microprof.c
+++ b/modules/file/microprof.c
@@ -1,6 +1,6 @@
 /*
  *  $Id: microprof.c 6038 2006-05-23 09:16:26Z yeti-dn $
- *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
+ *  Copyright (C) 2005-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -84,11 +84,13 @@
 #define EXTENSION_TXT ".txt"
 
 enum {
-    MICROPROF_HEADER_SIZE = 124,
+    MICROPROF_HEADER_SIZE = 122,
     MICROPROF_MIN_TEXT_SIZE = 80,
 };
 
 typedef struct {
+    gchar *comment1;
+    gchar *comment2;
     guint xres;
     guint yres;
     gdouble xrange;
@@ -105,6 +107,12 @@ static gint          microprof_txt_detect     (const GwyFileDetectInfo *fileinfo
 static GwyContainer* microprof_load           (const gchar *filename,
                                                GwyRunType mode,
                                                GError **error);
+static gboolean      microprof_read_string    (const guchar *buffer,
+                                               gsize size,
+                                               gsize pos,
+                                               gchar **pstr,
+                                               guint *len,
+                                               GError **error);
 static GwyDataField* microprof_read_data_field(const MicroProfFile *mfile,
                                                const guchar *buffer);
 static GwyContainer* microprof_txt_load       (const gchar *filename,
@@ -116,12 +124,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Imports MicroProf FRT profilometer data files."),
     "Yeti <yeti at gwyddion.net>",
-    "0.5",
+    "0.6",
     "David Nečas (Yeti) & Petr Klapetek",
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, microprof)
 
 static gboolean
 module_register(void)
@@ -149,7 +157,7 @@ microprof_detect(const GwyFileDetectInfo *fileinfo,
     if (only_name)
         return g_str_has_suffix(fileinfo->name_lowercase, EXTENSION) ? 10 : 0;
 
-    if (fileinfo->file_size < MICROPROF_HEADER_SIZE
+    if (fileinfo->file_size < MICROPROF_HEADER_SIZE + 1
         || fileinfo->buffer_len < MAGIC_SIZE
         || memcmp(fileinfo->head, MAGIC, MAGIC_SIZE) != 0)
         return 0;
@@ -205,24 +213,29 @@ microprof_load(const gchar *filename,
                GError **error)
 {
     enum {
-        XRES = 0x0026, YRES = 0x002a,
-        XRANGE = 0x0038, YRANGE = 0x0040,
-        ZRANGE = 0x006e,
+        COMMENT1_OFFSET = 0x0014,
+        COMMENT2_OFFSET = 0x001a,
+        XRES_OFFSET = 0x0024,
+        YRES_OFFSET = 0x0028,
+        XRANGE_OFFSET = 0x0036,
+        YRANGE_OFFSET = 0x003e,
+        ZRANGE_OFFSET = 0x006c,
     };
-    GwyContainer *container = NULL;
+    GwyContainer *container = NULL, *meta = NULL;
     guchar *buffer = NULL;
     const guchar *p;
     MicroProfFile mfile;
-    gsize size = 0;
+    gsize size = 0, extra_len = 0;
     GError *err = NULL;
-    guint i, ndata, datasize;
+    guint i, ndata, datasize, len;
 
     if (!gwy_file_get_contents(filename, &buffer, &size, &err)) {
         err_GET_FILE_CONTENTS(error, &err);
         return NULL;
     }
 
-    if (size < MICROPROF_HEADER_SIZE) {
+    gwy_clear(&mfile, 1);
+    if (size < MICROPROF_HEADER_SIZE + 1) {
         err_TOO_SHORT(error);
         goto fail;
     }
@@ -232,37 +245,60 @@ microprof_load(const gchar *filename,
         goto fail;
     }
 
-    p = buffer + XRES;
+    if (!microprof_read_string(buffer, size, COMMENT1_OFFSET + extra_len,
+                               &mfile.comment1, &len, error))
+        goto fail;
+    extra_len += len;
+
+    if (!microprof_read_string(buffer, size, COMMENT2_OFFSET + extra_len,
+                               &mfile.comment2, &len, error))
+        goto fail;
+    extra_len += len;
+
+    gwy_debug("reading xres from offset 0x%04lx",
+              (gulong)(XRES_OFFSET + extra_len));
+    p = buffer + XRES_OFFSET + extra_len;
     mfile.xres = gwy_get_guint16_le(&p);
+    gwy_debug("xres %u", mfile.xres);
     if (err_DIMENSION(error, mfile.xres))
         goto fail;
 
-    p = buffer + YRES;
+    gwy_debug("reading yres from offset 0x%04lx",
+              (gulong)(YRES_OFFSET + extra_len));
+    p = buffer + YRES_OFFSET + extra_len;
     mfile.yres = gwy_get_guint16_le(&p);
+    gwy_debug("yres %u", mfile.yres);
     if (err_DIMENSION(error, mfile.xres))
         goto fail;
 
-    p = buffer + XRANGE;
+    gwy_debug("reading xrange from offset 0x%04lx",
+              (gulong)(XRANGE_OFFSET + extra_len));
+    p = buffer + XRANGE_OFFSET + extra_len;
     mfile.xrange = gwy_get_gdouble_le(&p);
     if (!(mfile.xrange = fabs(mfile.xrange))) {
         g_warning("Real x size is 0.0, fixing to 1.0");
         mfile.xrange = 1.0;
     }
 
-    p = buffer + YRANGE;
+    gwy_debug("reading yrange from offset 0x%04lx",
+              (gulong)(YRANGE_OFFSET + extra_len));
+    p = buffer + YRANGE_OFFSET + extra_len;
     mfile.yrange = gwy_get_gdouble_le(&p);
     if (!(mfile.yrange = fabs(mfile.yrange))) {
         g_warning("Real y size is 0.0, fixing to 1.0");
         mfile.yrange = 1.0;
     }
 
-    p = buffer + ZRANGE;
+    p = buffer + ZRANGE_OFFSET + extra_len;
     mfile.zscale = gwy_get_gdouble_le(&p);
 
     datasize = 2*mfile.xres*mfile.yres;
-    if (err_SIZE_MISMATCH(error, datasize, size - MICROPROF_HEADER_SIZE, FALSE))
+    if (err_SIZE_MISMATCH(error, datasize,
+                          size - MICROPROF_HEADER_SIZE - extra_len, FALSE))
         goto fail;
     /* FIXME: There is weird stuff between channels.  Need specs.
+     * Moreover, the second image seems to be byte-to-byte identical.
+     * So maybe ignoring it is the right thing to do.
     ndata = (size - MICROPROF_HEADER_SIZE)/datasize;
     if (!ndata) {
         err_NO_DATA(error);
@@ -272,26 +308,77 @@ microprof_load(const gchar *filename,
     ndata = 1;
     container = gwy_container_new();
 
-    mfile.data = buffer + MICROPROF_HEADER_SIZE;
+    if (mfile.comment1 || mfile.comment2) {
+        meta = gwy_container_new();
+        if (mfile.comment1) {
+            gwy_container_set_const_string_by_name(meta, "Comment 1",
+                                                   mfile.comment1);
+        }
+        if (mfile.comment2) {
+            gwy_container_set_const_string_by_name(meta, "Comment 2",
+                                                   mfile.comment2);
+        }
+    }
+
+    mfile.data = buffer + MICROPROF_HEADER_SIZE + extra_len;
     for (i = 0; i < ndata; i++) {
         GwyDataField *dfield;
         GQuark quark;
 
-        dfield = microprof_read_data_field(&mfile,
-                                           mfile.data + i*datasize);
+        dfield = microprof_read_data_field(&mfile, mfile.data + i*datasize);
         quark = gwy_app_get_data_key_for_id(i);
         gwy_container_set_object(container, quark, dfield);
         g_object_unref(dfield);
 
+        /* FIXME: Duplicate meta if we ever are going to have multiple
+         * channels here. */
+        if (meta) {
+            quark = gwy_app_get_data_meta_key_for_id(i);
+            gwy_container_set_object(container, quark, meta);
+        }
+
         gwy_app_channel_title_fall_back(container, i);
         gwy_file_channel_import_log_add(container, i, NULL, filename);
     }
 
+    GWY_OBJECT_UNREF(meta);
+
 fail:
+    g_free(mfile.comment1);
+    g_free(mfile.comment2);
     gwy_file_abandon_contents(buffer, size, NULL);
     return container;
 }
 
+static gboolean
+microprof_read_string(const guchar *buffer, gsize size, gsize pos,
+                      gchar **pstr, guint *len, GError **error)
+{
+    const guchar *p;
+
+    if (pos > size - sizeof(guint32)) {
+        g_set_error(error, GWY_MODULE_FILE_ERROR, GWY_MODULE_FILE_ERROR_DATA,
+                    _("File header is truncated."));
+        return FALSE;
+    }
+
+    gwy_debug("reading string len from offset 0x%04lx", (gulong)pos);
+    p = buffer + pos;
+    *len = gwy_get_guint32_le(&p);
+    gwy_debug("string length %u", *len);
+    if (*len < 2)
+        return TRUE;
+
+    pos += sizeof(guint32);
+    if (*len > size - pos) {
+        g_set_error(error, GWY_MODULE_FILE_ERROR, GWY_MODULE_FILE_ERROR_DATA,
+                    _("File header is truncated."));
+        return FALSE;
+    }
+    *pstr = g_strndup(p, *len);
+    return TRUE;
+}
+
 static GwyDataField*
 microprof_read_data_field(const MicroProfFile *mfile,
                           const guchar *buffer)
diff --git a/modules/file/miffile.c b/modules/file/miffile.c
index 846a94e..ef24110 100644
--- a/modules/file/miffile.c
+++ b/modules/file/miffile.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: miffile.c 17718 2015-11-06 08:04:04Z pecold $
+ *  @(#) $Id: miffile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2010 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -204,7 +204,7 @@ static GwyModuleInfo module_info = {
     "2010",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, miffile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/mifile.c b/modules/file/mifile.c
index 8324c98..d9708d8 100644
--- a/modules/file/mifile.c
+++ b/modules/file/mifile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: mifile.c 17957 2016-01-03 11:11:32Z dn2010 $
+ *  $Id: mifile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2005 Chris Anderson, Molecular Imaging Corp.
  *  E-mail: sidewinder.asu at gmail.com
  *
@@ -181,7 +181,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, mifile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/mulfile.c b/modules/file/mulfile.c
index cb81a9b..16d0e6b 100644
--- a/modules/file/mulfile.c
+++ b/modules/file/mulfile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: mulfile.c 19071 2016-10-14 09:02:41Z yeti-dn $
+ *  $Id: mulfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2011 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -164,7 +164,7 @@ static GwyModuleInfo module_info = {
     "2011",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, mulfile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/nanoeducator.c b/modules/file/nanoeducator.c
index 72dab2d..d7827b9 100644
--- a/modules/file/nanoeducator.c
+++ b/modules/file/nanoeducator.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: nanoeducator.c 19071 2016-10-14 09:02:41Z yeti-dn $
+ *  $Id: nanoeducator.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2009 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -294,7 +294,7 @@ static GwyModuleInfo module_info = {
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, nanoeducator)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/nanomagnetics.c b/modules/file/nanomagnetics.c
index d30a1b5..18fc35c 100644
--- a/modules/file/nanomagnetics.c
+++ b/modules/file/nanomagnetics.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: nanomagnetics.c 19216 2016-11-09 10:39:06Z yeti-dn $
+ *  @(#) $Id: nanomagnetics.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2012 Sameer Grover, David Necas (Yeti).
  *  E-mail: sameer.grover.1 at gmail.com, yeti at gwyddion.net.
  *
@@ -406,7 +406,7 @@ static GwyModuleInfo module_info = {
     "2012",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, nanomagnetics)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/nanonics.c b/modules/file/nanonics.c
index 0e989a7..932c476 100644
--- a/modules/file/nanonics.c
+++ b/modules/file/nanonics.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: nanonics.c 17180 2015-05-25 09:21:15Z yeti-dn $
+ *  $Id: nanonics.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2009-2011 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -108,7 +108,7 @@ static GwyModuleInfo module_info = {
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, nanonics)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/nanonis.c b/modules/file/nanonis.c
index 25b6b7e..ee97db2 100644
--- a/modules/file/nanonis.c
+++ b/modules/file/nanonis.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: nanonis.c 19029 2016-10-04 12:37:34Z yeti-dn $
+ *  $Id: nanonis.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2006,2015 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -122,7 +122,7 @@ static const GwyEnum directions[] = {
     { "both",     DIR_BOTH,     },
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, nanonis)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/nanoobserver.c b/modules/file/nanoobserver.c
index 3d56f9f..f640f22 100644
--- a/modules/file/nanoobserver.c
+++ b/modules/file/nanoobserver.c
@@ -1,6 +1,6 @@
 /*
- *  $Id: nanoobserver.c 19044 2016-10-08 19:10:46Z yeti-dn $
- *  Copyright (C) 2012 David Necas (Yeti).
+ *  $Id: nanoobserver.c 19476 2017-02-15 18:11:18Z yeti-dn $
+ *  Copyright (C) 2012-2017 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -29,17 +29,26 @@
 
 /**
  * [FILE-MAGIC-FILEMAGIC]
- * # NanoObserver
+ * # Nano-Solution/NanoObserver 1.23
  * # A ZIP archive, we have to look for Scan/Measure.xml as the first file.
  * 0 string PK\x03\x04
- * >30 string Scan/Measure.xml Nanomagnetics NMI SPM data version 3
+ * >30 string Scan/Measure.xml Nano-Solution SPM data version 1.23
+ **/
+
+/**
+ * [FILE-MAGIC-FILEMAGIC]
+ * # Nano-Solution/NanoObserver 1.33
+ * # A ZIP archive, we have to look for NAO_v133.txt as the first file.
+ * # This is a dummy file put there exactly for indentification purposes.
+ * 0 string PK\x03\x04
+ * >30 string NAO_v133.txt Nano-Solution SPM data version 1.33
  **/
 
 /**
  * [FILE-MAGIC-USERGUIDE]
- * NanoObserver
+ * Nano-Solution/NanoObserver
  * .nao
- * Read
+ * Read SPS
  **/
 
 #include "config.h"
@@ -58,61 +67,140 @@
 
 #define MAGIC "PK\x03\x04"
 #define MAGIC_SIZE (sizeof(MAGIC)-1)
-#define MAGIC0 "Scan"
-#define MAGIC1 "Scan/Streams.xml"
-#define MAGIC2 "Scan/Measure.xml"
-#define MAGIC3 "Scan/Data"
+
+#define MAGIC123_0 "Scan"
+#define MAGIC123_1 "Scan/Streams.xml"
+#define MAGIC123_2 "Scan/Measure.xml"
+#define MAGIC123_3 "Scan/Data"
+
+#define MAGIC133_0 "NAO_v133.txt"
+#define MAGIC133_1 "Data/Imaging.xml"
+#define MAGIC133_2 "Data/Spectro.xml"
+
 #define BLOODY_UTF8_BOM "\xef\xbb\xbf"
 #define EXTENSION ".nao"
 
-typedef enum {
-    DIR_BAD,
-    DIR_FORWARD,
-    DIR_BACKWARD,
-} NAODirection;
-
 typedef struct {
     gchar *name;
     gchar *units;
+    gchar *dir;
+    /* 1.33 only */
+    gchar *filename;
 } NAOStream;
 
 typedef struct {
+    gchar *dir;
+    gchar *name;
+    gchar *unit;
+    /* What the header says */
+    guint capacity;
+    guint sizeused;
+    /* Actual data */
+    guint nvalues;
+    gdouble *values;
+} NAOSpectrumData;
+
+typedef struct {
+    /* Filled from imaging header, if any. */
+    gdouble x;
+    gdouble y;
+    gchar *filename;
+    /* Filled by parsing spectrum XML file. */
+    GHashTable *hash;
+    GArray *specdata;
+    gdouble sweep_from;
+    gdouble sweep_to;
+    gchar *sweep_unit;
+    /* Borrowed from main NAOFile. */
+    GString *path;
+    /* Workspace */
+    gchar *current_name;
+    gchar *current_unit;
+    gchar *spectro_parameters;
+    guint current_specdata_id;
+} NAOSpectrum;
+
+typedef struct {
     guint xres;
     guint yres;
     gdouble xreal;
     gdouble yreal;
-    guint nstreams;
-    NAOStream *streams;
+    GArray *streams;
+    GArray *spectra;
     GHashTable *hash;
+    GwyContainer *meta;
     /* Workspace */
-    gboolean have_resolution;
-    gboolean have_size;
     GString *path;
+    gchar *current_name;
+    gchar *current_unit;
+    gchar *imaging_parameters;
+    /* For the log */
+    const gchar *filename;
 } NAOFile;
 
-static gboolean      module_register     (void);
-static gint          nao_detect          (const GwyFileDetectInfo *fileinfo,
-                                          gboolean only_name);
-static GwyContainer* nao_load            (const gchar *filename,
-                                          GwyRunType mode,
-                                          GError **error);
-static void          add_meta            (gpointer hkey,
-                                          gpointer hvalue,
-                                          gpointer user_data);
-static GwyDataField* nao_read_field      (GwyZipFile zipfile,
-                                          NAOFile *naofile,
-                                          guint id);
-static gboolean      nao_parse_measure   (GwyZipFile zipfile,
-                                          NAOFile *naofile,
-                                          GError **error);
-static void          nao_file_free       (NAOFile *naofile);
+static gboolean      module_register             (void);
+static gint          nao_detect                  (const GwyFileDetectInfo *fileinfo,
+                                                  gboolean only_name);
+static gint          nao123_detect               (const GwyFileDetectInfo *fileinfo);
+static gint          nao133_detect               (const GwyFileDetectInfo *fileinfo);
+static GwyContainer* nao_load                    (const gchar *filename,
+                                                  GwyRunType mode,
+                                                  GError **error);
+static GwyContainer* nao123_load                 (GwyZipFile zipfile,
+                                                  NAOFile *naofile,
+                                                  GError **error);
+static GwyContainer* nao133_imaging_load         (GwyZipFile zipfile,
+                                                  NAOFile *naofile,
+                                                  GError **error);
+static GwyContainer* nao133_spectro_load         (GwyZipFile zipfile,
+                                                  NAOFile *naofile,
+                                                  GError **error);
+static void          add_meta                    (gpointer hkey,
+                                                  gpointer hvalue,
+                                                  gpointer user_data);
+static GwyDataField* nao_read_field              (GwyZipFile zipfile,
+                                                  NAOFile *naofile,
+                                                  guint id,
+                                                  GError **error);
+static gboolean      nao_parse_xml_header        (GwyZipFile zipfile,
+                                                  NAOFile *naofile,
+                                                  const gchar *filename,
+                                                  GMarkupParser *parser,
+                                                  GError **error);
+static gboolean      nao133_parse_spectrum       (GwyZipFile zipfile,
+                                                  NAOSpectrum *spectrum,
+                                                  GError **error);
+static void          create_channel              (NAOFile *naofile,
+                                                  GwyDataField *dfield,
+                                                  NAOStream *stream,
+                                                  guint channelno,
+                                                  GwyContainer *container);
+static void          create_spectra              (NAOFile *naofile,
+                                                  GwyContainer *container);
+static GwyDataLine*  create_dataline_for_spectrum(NAOSpectrumData *specdata,
+                                                  NAOSpectrum *spectrum);
+static void          add_dline_to_spectra        (GPtrArray *sps,
+                                                  GwyDataLine *dline,
+                                                  const gchar *xtitle,
+                                                  const gchar *name,
+                                                  const gchar *dir,
+                                                  gdouble x,
+                                                  gdouble y);
+static gboolean      find_size_and_resolution    (NAOFile *naofile,
+                                                  GError **error);
+static gboolean      find_spectrum_abscissa      (NAOSpectrum *spectrum,
+                                                  GError **error);
+static const gchar*  find_attribute              (const gchar **attribute_names,
+                                                  const gchar **attribute_values,
+                                                  const gchar *attrname);
+static void          nao_file_free               (NAOFile *naofile);
 
 static GwyModuleInfo module_info = {
     GWY_MODULE_ABI_VERSION,
     &module_register,
-    N_("Reads NanoObserver .nao files."),
+    N_("Reads Nano-Solution/NanoObserver .nao files."),
     "Yeti <yeti at gwyddion.net>",
-    "1.4",
+    "2.0",
     "David Nečas (Yeti)",
     "2012",
 };
@@ -123,7 +211,7 @@ static gboolean
 module_register(void)
 {
     gwy_file_func_register("nanoobserver",
-                           N_("NanoObserver data (.nao)"),
+                           N_("Nano-Solution/NanoObserver data (.nao)"),
                            (GwyFileDetectFunc)&nao_detect,
                            (GwyFileLoadFunc)&nao_load,
                            NULL,
@@ -136,7 +224,7 @@ static gint
 nao_detect(const GwyFileDetectInfo *fileinfo,
            gboolean only_name)
 {
-    GwyZipFile zipfile;
+    gint score;
 
     if (only_name)
         return g_str_has_suffix(fileinfo->name_lowercase, EXTENSION) ? 15 : 0;
@@ -146,31 +234,114 @@ nao_detect(const GwyFileDetectInfo *fileinfo,
         || memcmp(fileinfo->head, MAGIC, MAGIC_SIZE) != 0)
         return 0;
 
+    /* Format versions. */
+    if ((score = nao133_detect(fileinfo)) > 0)
+        return score;
+    if ((score = nao123_detect(fileinfo)) > 0)
+        return score;
+
+    return 0;
+}
+
+static gint
+nao123_detect(const GwyFileDetectInfo *fileinfo)
+{
+    GwyZipFile zipfile;
+    gint score = 0;
+
     /* It contains directory Scan so this should be somewehre near the begining
      * of the file. */
-    if (!gwy_memmem(fileinfo->head, fileinfo->buffer_len,
-                    MAGIC0, sizeof(MAGIC0)-1))
+    if (gwy_memmem(fileinfo->head, fileinfo->buffer_len,
+                   MAGIC123_0, sizeof(MAGIC123_0)-1)) {
+        gwy_debug("found magic0 %s", MAGIC123_0);
+    }
+    else {
+        gwy_debug("not found magic0 %s", MAGIC123_0);
         return 0;
-    if (!gwy_memmem(fileinfo->head, fileinfo->buffer_len,
-                    MAGIC1, sizeof(MAGIC1)-1)
-        && !gwy_memmem(fileinfo->head, fileinfo->buffer_len,
-                       MAGIC2, sizeof(MAGIC2)-1)
-        && !gwy_memmem(fileinfo->head, fileinfo->buffer_len,
-                       MAGIC3, sizeof(MAGIC3)-1))
+    }
+
+    if (gwy_memmem(fileinfo->head, fileinfo->buffer_len,
+                   MAGIC123_1, sizeof(MAGIC123_1)-1)) {
+        gwy_debug("found magic1 %s", MAGIC123_1);
+    }
+    else if (gwy_memmem(fileinfo->head, fileinfo->buffer_len,
+                        MAGIC123_2, sizeof(MAGIC123_2)-1)) {
+        gwy_debug("found magic2 %s", MAGIC123_2);
+    }
+    else if (gwy_memmem(fileinfo->head, fileinfo->buffer_len,
+                        MAGIC123_3, sizeof(MAGIC123_3)-1)) {
+        gwy_debug("found magic3 %s", MAGIC123_3);
+    }
+    else {
+        gwy_debug("no magic filename fragment found.");
         return 0;
+    }
 
     /* We have to realy look inside. */
     if (!(zipfile = gwyzip_open(fileinfo->name)))
         return 0;
 
-    if (!gwyzip_locate_file(zipfile, "Scan/Measure.xml", 1, NULL)) {
-        gwyzip_close(zipfile);
+    if (gwyzip_locate_file(zipfile, "Scan/Measure.xml", 1, NULL)) {
+        gwy_debug("found Scan/Measure.xml in the archive");
+        score = 100;
+    }
+    else {
+        gwy_debug("cannot find Scan/Measure.xml in the archive");
+    }
+    gwyzip_close(zipfile);
+
+    return score;
+}
+
+static gint
+nao133_detect(const GwyFileDetectInfo *fileinfo)
+{
+    GwyZipFile zipfile;
+    gint score = 0;
+
+    /* It contains directory Scan so this should be somewehre near the begining
+     * of the file. */
+    if (gwy_memmem(fileinfo->head, fileinfo->buffer_len,
+                   MAGIC133_0, sizeof(MAGIC133_0)-1)) {
+        gwy_debug("found magic0 %s", MAGIC133_0);
+    }
+    else {
+        gwy_debug("not found magic0 %s", MAGIC133_0);
+        return 0;
+    }
+
+    if (gwy_memmem(fileinfo->head, fileinfo->buffer_len,
+                   MAGIC133_1, sizeof(MAGIC133_1)-1)) {
+        gwy_debug("found magic1 %s", MAGIC133_1);
+    }
+    else if (gwy_memmem(fileinfo->head, fileinfo->buffer_len,
+                        MAGIC133_2, sizeof(MAGIC133_2)-1)) {
+        gwy_debug("found magic2 %s", MAGIC133_2);
+    }
+    else {
+        gwy_debug("no magic filename fragment found.");
         return 0;
     }
 
+    /* We have to realy look inside. */
+    if (!(zipfile = gwyzip_open(fileinfo->name)))
+        return 0;
+
+    if (gwyzip_locate_file(zipfile, "Data/Imaging.xml", 1, NULL)) {
+        gwy_debug("found Data/Imaging.xml in the archive");
+        score = 100;
+    }
+    else if (gwyzip_locate_file(zipfile, "Data/Spectro.xml", 1, NULL)) {
+        gwy_debug("found Data/Spectro.xml in the archive");
+        score = 100;
+    }
+    else {
+        gwy_debug("cannot find neither Data/Imaging.xml nor Data/Spectro.xml "
+                  "in the archive");
+    }
     gwyzip_close(zipfile);
 
-    return 100;
+    return score;
 }
 
 static GwyContainer*
@@ -178,13 +349,9 @@ nao_load(const gchar *filename,
          G_GNUC_UNUSED GwyRunType mode,
          GError **error)
 {
-    GwyContainer *container = NULL, *meta = NULL;
-    gchar *filename_curr;
+    GwyContainer *container = NULL;
     NAOFile naofile;
     GwyZipFile zipfile;
-    NAODirection dir;
-    guint id, channelno = 0;
-    gboolean status;
 
     zipfile = gwyzip_open(filename);
     if (!zipfile) {
@@ -195,85 +362,24 @@ nao_load(const gchar *filename,
     }
 
     gwy_clear(&naofile, 1);
-    if (!nao_parse_measure(zipfile, &naofile, error))
-        goto fail;
-
-    status = gwyzip_first_file(zipfile, error);
-    if (!status)
-        goto fail;
-
-    container = gwy_container_new();
-    if (g_hash_table_size(naofile.hash)) {
-        meta = gwy_container_new();
-        g_hash_table_foreach(naofile.hash, &add_meta, meta);
+    naofile.filename = filename;
+    if (gwyzip_locate_file(zipfile, "NAO_v133.txt", 1, NULL)) {
+        if (gwyzip_locate_file(zipfile, "Data/Imaging.xml", 1, NULL))
+            container = nao133_imaging_load(zipfile, &naofile, error);
+        else if (gwyzip_locate_file(zipfile, "Data/Spectro.xml", 1, NULL))
+            container = nao133_spectro_load(zipfile, &naofile, error);
+        else
+            err_FILE_TYPE(error, "Nano-Solution");
     }
-
-    while (status && gwyzip_get_current_filename(zipfile, &filename_curr,
-                                                 NULL)) {
-        if (g_str_has_prefix(filename_curr, "Scan/Data/")) {
-            const gchar *dataname = filename_curr + strlen("Scan/Data/");
-            dir = DIR_BAD;
-
-            gwy_debug("dataname <%s>", dataname);
-            for (id = 0; id < naofile.nstreams; id++) {
-                guint len = strlen(naofile.streams[id].name);
-                if (strncmp(dataname, naofile.streams[id].name, len) == 0) {
-                    if (gwy_strequal(dataname + len, "_Left.dat"))
-                        dir = DIR_FORWARD;
-                    else if (gwy_strequal(dataname + len, "_Right.dat"))
-                        dir = DIR_BACKWARD;
-                }
-                if (dir != DIR_BAD)
-                    break;
-            }
-            if (dir != DIR_BAD) {
-                GwyDataField *field = nao_read_field(zipfile, &naofile, id);
-                if (field) {
-                    GQuark key = gwy_app_get_data_key_for_id(channelno);
-                    gchar *strkey, *title;
-
-                    gwy_container_set_object(container, key, field);
-                    g_object_unref(field);
-
-                    strkey = g_strdup_printf("/%u/data/title", channelno);
-                    title = g_strdup_printf("%s %s",
-                                            naofile.streams[id].name,
-                                            dir == DIR_FORWARD ? "Left" : "Right");
-                    gwy_container_set_string_by_name(container, strkey, title);
-                    g_free(strkey);
-
-                    if (meta) {
-                        GwyContainer *thismeta;
-
-                        strkey = g_strdup_printf("/%u/meta", channelno);
-                        thismeta = GWY_CONTAINER(gwy_serializable_duplicate
-                                                             (G_OBJECT(meta)));
-                        gwy_container_set_object_by_name(container, strkey,
-                                                         thismeta);
-                        g_object_unref(thismeta);
-                        g_free(strkey);
-                    }
-                    gwy_file_channel_import_log_add(container, channelno,
-                                                    NULL, filename);
-
-                    channelno++;
-                }
-            }
-
-        }
-        g_free(filename_curr);
-        status = gwyzip_next_file(zipfile, NULL);
+    else if (gwyzip_locate_file(zipfile, "Scan/Measure.xml", 1, NULL)) {
+        container = nao123_load(zipfile, &naofile, error);
+    }
+    else {
+        err_FILE_TYPE(error, "Nano-Solution");
     }
 
-fail:
     gwyzip_close(zipfile);
     nao_file_free(&naofile);
-    GWY_OBJECT_UNREF(meta);
-    if (!channelno) {
-        GWY_OBJECT_UNREF(container);
-        if (error && !*error)
-            err_NO_DATA(error);
-    }
 
     return container;
 }
@@ -286,33 +392,34 @@ add_meta(gpointer hkey, gpointer hvalue, gpointer user_data)
 }
 
 static GwyDataField*
-nao_read_field(GwyZipFile zipfile, NAOFile *naofile, guint id)
+nao_read_field(GwyZipFile zipfile, NAOFile *naofile, guint id, GError **error)
 {
     gsize size, expected_size;
     guint width, G_GNUC_UNUSED height, nscanlines, i, j;
-    guchar *buffer = gwyzip_get_file_content(zipfile, &size, NULL);
-    const guchar *p = buffer;
+    guchar *buffer;
+    const guchar *p;
+    const gchar *units;
     GwyDataField *field;
     gdouble *data;
 
-    if (!buffer)
+    if (!(buffer = gwyzip_get_file_content(zipfile, &size, error)))
         return NULL;
 
     if (size < 3*4 + 4 + 4) {
-        g_warning("Too short data file (%lu bytes).", (gulong)size);
+        g_set_error(error, GWY_MODULE_FILE_ERROR, GWY_MODULE_FILE_ERROR_DATA,
+                    _("Data block is truncated"));
         g_free(buffer);
         return NULL;
     }
 
+    p = buffer;
     width = gwy_get_guint32_le(&p);
     height = gwy_get_guint32_le(&p);
     nscanlines = gwy_get_guint32_le(&p);
     gwy_debug("[%u] %u %u %u", id, width, height, nscanlines);
 
     expected_size = 3*4 + 4*nscanlines*(width + 1);
-    if (size != expected_size) {
-        g_warning("Data file size %lu does not match expected %lu.",
-                  (gulong)size, (gulong)expected_size);
+    if (err_SIZE_MISMATCH(error, expected_size, size, TRUE)) {
         g_free(buffer);
         return NULL;
     }
@@ -337,23 +444,22 @@ nao_read_field(GwyZipFile zipfile, NAOFile *naofile, guint id)
 
     /* Older versions of the format had human-readable units there but we
      * disregard these. */
-    gwy_si_unit_set_from_string(gwy_data_field_get_si_unit_z(field),
-                                naofile->streams[id].units);
+    units = g_array_index(naofile->streams, NAOStream, id).units;
+    gwy_si_unit_set_from_string(gwy_data_field_get_si_unit_z(field), units);
     gwy_si_unit_set_from_string(gwy_data_field_get_si_unit_xy(field), "m");
 
     return field;
 }
 
 static void
-nao_streams_start_element(G_GNUC_UNUSED GMarkupParseContext *context,
-                          const gchar *element_name,
-                          const gchar **attribute_names,
-                          const gchar **attribute_values,
-                          gpointer user_data,
-                          G_GNUC_UNUSED GError **error)
+nao123_start_element(G_GNUC_UNUSED GMarkupParseContext *context,
+                     const gchar *element_name,
+                     const gchar **attribute_names,
+                     const gchar **attribute_values,
+                     gpointer user_data,
+                     G_GNUC_UNUSED GError **error)
 {
     NAOFile *naofile = (NAOFile*)user_data;
-    guint i;
     gchar *path;
 
     g_string_append_c(naofile->path, '/');
@@ -361,30 +467,27 @@ nao_streams_start_element(G_GNUC_UNUSED GMarkupParseContext *context,
     path = naofile->path->str;
 
     if (gwy_strequal(path, "/Measure/Streams/Stream")) {
-        const gchar *name = NULL, *unit = NULL;
-        gwy_debug("Stream");
-        for (i = 0; attribute_names[i]; i++) {
-            if (gwy_strequal(attribute_names[i], "Id"))
-                name = attribute_values[i];
-            else if (gwy_strequal(attribute_names[i], "Unit"))
-                unit = attribute_values[i];
-        }
-        if (name && unit) {
+        const gchar *name, *unit;
+
+        gwy_debug(element_name);
+        if ((name = find_attribute(attribute_names, attribute_values, "Id"))
+            && (unit = find_attribute(attribute_names, attribute_values,
+                                      "Unit"))) {
+            NAOStream stream;
             gwy_debug("Adding stream %s [%s]", name, unit);
-            naofile->streams = g_renew(NAOStream, naofile->streams,
-                                       naofile->nstreams+1);
-            naofile->streams[naofile->nstreams].name = g_strdup(name);
-            naofile->streams[naofile->nstreams].units = g_strdup(unit);
-            naofile->nstreams++;
+            gwy_clear(&stream, 1);
+            stream.name = g_strdup(name);
+            stream.units = g_strdup(unit);
+            g_array_append_val(naofile->streams, stream);
         }
     }
 }
 
 static void
-nao_streams_end_element(G_GNUC_UNUSED GMarkupParseContext *context,
-                        const gchar *element_name,
-                        gpointer user_data,
-                        G_GNUC_UNUSED GError **error)
+nao123_end_element(G_GNUC_UNUSED GMarkupParseContext *context,
+                   const gchar *element_name,
+                   gpointer user_data,
+                   G_GNUC_UNUSED GError **error)
 {
     NAOFile *naofile = (NAOFile*)user_data;
     guint n = strlen(element_name), len = naofile->path->len;
@@ -397,62 +500,364 @@ nao_streams_end_element(G_GNUC_UNUSED GMarkupParseContext *context,
 }
 
 static void
-nao_streams_text(G_GNUC_UNUSED GMarkupParseContext *context,
-                 const gchar *text,
-                 gsize text_len,
-                 gpointer user_data,
-                 G_GNUC_UNUSED GError **error)
+nao123_text(G_GNUC_UNUSED GMarkupParseContext *context,
+            const gchar *text,
+            gsize text_len,
+            gpointer user_data,
+            G_GNUC_UNUSED GError **error)
 {
     NAOFile *naofile = (NAOFile*)user_data;
     gchar *path = naofile->path->str;
 
-    if (gwy_strequal(path, "/Measure/Parameters/Resolution")) {
-        gchar *s = g_strndup(text, text_len);
-        gwy_debug("Resolution");
-        if (sscanf(s, "%u, %u", &naofile->xres, &naofile->yres) == 2
-            && !err_DIMENSION(NULL, naofile->xres)
-            && !err_DIMENSION(NULL, naofile->yres))
-            naofile->have_resolution = TRUE;
-        g_free(s);
-    }
-    else if (gwy_strequal(path, "/Measure/Parameters/Size")) {
-        gchar *end, *s = g_strndup(text, text_len);
-        gwy_debug("Size");
-        if ((naofile->xreal = g_ascii_strtod(s, &end)) > 0.0
-            && *end == ','
-            && (naofile->yreal = g_ascii_strtod(end+1, NULL)) > 0.0)
-            naofile->have_size = TRUE;
-        g_free(s);
-    }
-    else if (g_str_has_prefix(path, "/Measure/Parameters/")) {
+    if (g_str_has_prefix(path, "/Measure/Parameters/")) {
         gchar *name = g_strdup(path + strlen("/Measure/Parameters/"));
         gchar *value = g_strndup(text, text_len);
         g_strdelimit(name, "/", ' ');
         g_strstrip(value);
-        if (strlen(value))
+        if (strlen(value)) {
+            if (!naofile->hash) {
+                naofile->hash = g_hash_table_new_full(g_str_hash, g_str_equal,
+                                                      g_free, g_free);
+            }
             g_hash_table_replace(naofile->hash, name, value);
+        }
         else
             g_free(value);
     }
 }
 
-static gboolean
-nao_parse_measure(GwyZipFile zipfile,
-                  NAOFile *naofile,
-                  GError **error)
+static GwyContainer*
+nao123_load(GwyZipFile zipfile, NAOFile *naofile, GError **error)
+{
+    GMarkupParser parser = {
+        &nao123_start_element,
+        &nao123_end_element,
+        &nao123_text,
+        NULL,
+        NULL,
+    };
+    GwyContainer *container = NULL;
+    gchar *filename_curr;
+    guint len, id, channelno = 0;
+    gboolean status;
+
+    if (!nao_parse_xml_header(zipfile, naofile, "Scan/Measure.xml", &parser,
+                              error))
+        goto fail;
+
+    status = gwyzip_first_file(zipfile, error);
+    if (!status)
+        goto fail;
+
+    container = gwy_container_new();
+    while (status && gwyzip_get_current_filename(zipfile, &filename_curr,
+                                                 NULL)) {
+        if (g_str_has_prefix(filename_curr, "Scan/Data/")) {
+            const gchar *dataname = filename_curr + strlen("Scan/Data/");
+            NAOStream *stream = NULL;
+
+            gwy_debug("dataname <%s>", dataname);
+            for (id = 0; id < naofile->streams->len; id++) {
+                stream = &g_array_index(naofile->streams, NAOStream, id);
+                len = strlen(stream->name);
+                if (strncmp(dataname, stream->name, len) == 0) {
+                    if (gwy_strequal(dataname + len, "_Left.dat"))
+                        stream->dir = g_strdup("Left");
+                    else if (gwy_strequal(dataname + len, "_Right.dat"))
+                        stream->dir = g_strdup("Right");
+                }
+                if (stream->dir)
+                    break;
+            }
+            if (stream->dir) {
+                GwyDataField *dfield = nao_read_field(zipfile, naofile, id,
+                                                      error);
+                if (!dfield)
+                    goto fail;
+                create_channel(naofile, dfield, stream, channelno, container);
+                channelno++;
+            }
+        }
+        g_free(filename_curr);
+        status = gwyzip_next_file(zipfile, NULL);
+    }
+
+fail:
+    if (!container || !gwy_container_get_n_items(container)) {
+        GWY_OBJECT_UNREF(container);
+        if (error && !*error)
+            err_NO_DATA(error);
+    }
+
+    return container;
+}
+
+static void
+nao133_imaging_start_element(G_GNUC_UNUSED GMarkupParseContext *context,
+                             const gchar *element_name,
+                             const gchar **attribute_names,
+                             const gchar **attribute_values,
+                             gpointer user_data,
+                             G_GNUC_UNUSED GError **error)
+{
+    NAOFile *naofile = (NAOFile*)user_data;
+    gchar *path;
+    guint n, i;
+
+    g_string_append_c(naofile->path, '/');
+    g_string_append(naofile->path, element_name);
+    path = naofile->path->str;
+
+    /* The channels are a mess in 1.33.  They are listed three times but units
+     * are only given in the ‘view’ part, not as units of the data files
+     * themselves.  Try to piece the information toegether... */
+    if (gwy_strequal(path, "/Imaging/ChannelList/ChannelData")) {
+        const gchar *s;
+        gwy_debug(element_name);
+        if ((s = find_attribute(attribute_names, attribute_values, "Name")))
+            naofile->current_name = g_strdup(s);
+        if ((s = find_attribute(attribute_names, attribute_values, "Unit"))) {
+            gwy_debug("Found Unit on ChannelData");
+            naofile->current_unit = g_strdup(s);
+        }
+    }
+    else if (gwy_stramong(path,
+                          "/Imaging/ChannelList/ChannelData/Left",
+                          "/Imaging/ChannelList/ChannelData/Right",
+                          NULL)) {
+        const gchar *filename;
+        gwy_debug(element_name);
+        if (naofile->current_name &&
+            (filename = find_attribute(attribute_names, attribute_values,
+                                       "NaoSubFile"))) {
+            NAOStream stream;
+            gwy_clear(&stream, 1);
+            stream.name = g_strdup(naofile->current_name);
+            stream.filename = g_strdelimit(g_strdup(filename), "\\", '/');
+            stream.dir = g_strdup(element_name);
+            if (naofile->current_unit)
+                stream.units = g_strdup(naofile->current_unit);
+            g_array_append_val(naofile->streams, stream);
+        }
+    }
+    else if (gwy_strequal(path, "/Imaging/ImagingView/ChannelView")) {
+        const gchar *name, *unit;
+        gwy_debug(element_name);
+        if ((name = find_attribute(attribute_names, attribute_values, "Name"))
+            && (unit = find_attribute(attribute_names, attribute_values,
+                                      "Unit"))) {
+            n = naofile->streams->len;
+            for (i = 0; i < n; i++) {
+                NAOStream *stream = &g_array_index(naofile->streams, NAOStream,
+                                                   i);
+                /* Use ChannelView unit only of there is no in ChannelData. */
+                if (gwy_strequal(stream->name, name) && !stream->units) {
+                    gwy_debug("Found Unit on ChannelView");
+                    g_free(stream->units);
+                    stream->units = g_strdup(unit);
+                }
+            }
+        }
+    }
+    /* Spectra.  The GridMode attribute is only informational.  Each spectrum
+     * always has X and Y, and that is what we need. */
+    else if (gwy_strequal(path, "/Imaging/FlexGrid/Locus")) {
+        const gchar *filename, *x, *y;
+        gwy_debug(element_name);
+        if ((filename = find_attribute(attribute_names, attribute_values,
+                                       "NaoSubFile"))
+            && (x = find_attribute(attribute_names, attribute_values, "X"))
+            && (y = find_attribute(attribute_names, attribute_values, "Y"))) {
+            NAOSpectrum spectrum;
+            gwy_clear(&spectrum, 1);
+            spectrum.filename = g_strdelimit(g_strdup(filename), "\\", '/');
+            spectrum.x = atoi(x);
+            spectrum.y = atoi(y);
+            g_array_append_val(naofile->spectra, spectrum);
+        }
+    }
+}
+
+static void
+nao133_imaging_end_element(G_GNUC_UNUSED GMarkupParseContext *context,
+                           const gchar *element_name,
+                           gpointer user_data,
+                           G_GNUC_UNUSED GError **error)
+{
+    NAOFile *naofile = (NAOFile*)user_data;
+    guint n = strlen(element_name), len = naofile->path->len;
+    gchar *path = naofile->path->str;
+
+    g_return_if_fail(g_str_has_suffix(path, element_name));
+    g_return_if_fail(len > n);
+    g_return_if_fail(path[len-1 - n] == '/');
+    if (gwy_strequal(path, "/Imaging/ChannelList/ChannelData")) {
+        GWY_FREE(naofile->current_name);
+        GWY_FREE(naofile->current_unit);
+    }
+    g_string_set_size(naofile->path, len-1 - n);
+}
+
+static void
+nao133_imaging_text(G_GNUC_UNUSED GMarkupParseContext *context,
+                    const gchar *text,
+                    gsize text_len,
+                    gpointer user_data,
+                    G_GNUC_UNUSED GError **error)
+{
+    NAOFile *naofile = (NAOFile*)user_data;
+    gchar *path = naofile->path->str;
+
+    /* The parameters are a mess in 1.33.  There is a nested plain text header
+     * inside a XML tag.  Why on Earth someone did that whey they already had
+     * everything represented in XML... */
+    if (gwy_strequal(path, "/Imaging/ImagingParameters")) {
+        GwyTextHeaderParser parser;
+        GHashTable *hash;
+        gchar *imaging_parameters = g_strndup(text, text_len);
+
+        gwy_clear(&parser, 1);
+        parser.key_value_separator = "=";
+        hash = gwy_text_header_parse(imaging_parameters, &parser, NULL, NULL);
+        if (naofile->hash && hash) {
+            g_warning("Multiple ImagingParameter tags.  Using the last one.");
+            g_free(naofile->imaging_parameters);
+            g_hash_table_destroy(naofile->hash);
+        }
+        if (hash) {
+            naofile->imaging_parameters = imaging_parameters;
+            naofile->hash = hash;
+        }
+        else
+            g_free(imaging_parameters);
+    }
+}
+
+/* NB: This can be imaging + spectroscopy, just not standalone spectra cuves. */
+static GwyContainer*
+nao133_imaging_load(GwyZipFile zipfile, NAOFile *naofile, GError **error)
 {
     GMarkupParser parser = {
-        &nao_streams_start_element,
-        &nao_streams_end_element,
-        &nao_streams_text,
+        &nao133_imaging_start_element,
+        &nao133_imaging_end_element,
+        &nao133_imaging_text,
         NULL,
         NULL,
     };
+    GwyContainer *container = NULL;
+    GwyDataField *dfield;
+    guint id;
+
+    if (!nao_parse_xml_header(zipfile, naofile, "Data/Imaging.xml", &parser,
+                              error))
+        goto fail;
+
+    container = gwy_container_new();
+    for (id = 0; id < naofile->streams->len; id++) {
+        NAOStream *stream = &g_array_index(naofile->streams, NAOStream, id);
+
+        if (!gwyzip_locate_file(zipfile, stream->filename, 1, error))
+            goto fail;
+        if (!(dfield = nao_read_field(zipfile, naofile, id, error)))
+            goto fail;
+
+        create_channel(naofile, dfield, stream, id, container);
+    }
+
+    for (id = 0; id < naofile->spectra->len; id++) {
+        NAOSpectrum *spectrum = &g_array_index(naofile->spectra, NAOSpectrum,
+                                               id);
+        /* Do not fail when a spectrum curve data are not found.  According to
+         * Scientec-CSI a spectrum NaoSubFile only means the spectrum was
+         * planned.  But it might not be actually measured. */
+        if (!gwyzip_locate_file(zipfile, spectrum->filename, 1, NULL))
+            continue;
+        spectrum->path = naofile->path;
+        if (!nao133_parse_spectrum(zipfile, spectrum, error))
+            goto fail;
+    }
+    create_spectra(naofile, container);
+
+    if (!gwy_container_get_n_items(container)) {
+        err_NO_DATA(error);
+        goto fail;
+    }
+    return container;
+
+fail:
+    GWY_OBJECT_UNREF(container);
+    return NULL;
+}
+
+/* The pure spectra case.  We do not know how to recalculate pixel coordinates
+ * to real coordinates so we import the spectra as graph curves. */
+static GwyContainer*
+nao133_spectro_load(GwyZipFile zipfile, NAOFile *naofile, GError **error)
+{
+    GwyContainer *container = NULL;
+    const gchar *xtitle;
+    NAOSpectrum spectrum;
+    guint j;
+
+    /* Do this for unified cleanup after we are done. */
+    naofile->path = g_string_new(NULL);
+    naofile->spectra = g_array_new(FALSE, FALSE, sizeof(NAOSpectrum));
+
+    gwy_clear(&spectrum, 1);
+    spectrum.path = naofile->path;
+    g_array_append_val(naofile->spectra, spectrum);
+
+    if (!nao133_parse_spectrum(zipfile, &spectrum, error))
+        goto fail;
+
+    container = gwy_container_new();
+    xtitle = g_hash_table_lookup(spectrum.hash, "SweepSignal");
+
+    for (j = 0; j < spectrum.specdata->len; j++) {
+        NAOSpectrumData *specdata = &g_array_index(spectrum.specdata,
+                                                   NAOSpectrumData, j);
+        GwyDataLine *dline = create_dataline_for_spectrum(specdata, &spectrum);
+        GwyGraphModel *gmodel = gwy_graph_model_new();
+        GwyGraphCurveModel *gcmodel = gwy_graph_curve_model_new();
+        gchar *fullname = g_strconcat(specdata->name, " ", specdata->dir, NULL);
+        GQuark key;
+
+        gwy_graph_curve_model_set_data_from_dataline(gcmodel, dline, 0, 0);
+        gwy_graph_model_set_units_from_data_line(gmodel, dline);
+        g_object_unref(dline);
+        g_object_set(gcmodel,
+                     "mode", GWY_GRAPH_CURVE_LINE,
+                     "description", fullname,
+                     NULL);
+        g_free(fullname);
+        gwy_graph_model_add_curve(gmodel, gcmodel);
+        g_object_unref(gcmodel);
+        g_object_set(gmodel,
+                     "title", specdata->name,
+                     "axis-label-left", specdata->name,
+                     NULL);
+        if (xtitle)
+            g_object_set(gmodel, "axis-label-bottom", xtitle, NULL);
+
+        key = gwy_app_get_graph_key_for_id(j);
+        gwy_container_set_object(container, key, gmodel);
+        g_object_unref(gmodel);
+    }
+
+fail:
+    return container;
+}
+
+static gboolean
+nao_parse_xml_header(GwyZipFile zipfile, NAOFile *naofile,
+                     const gchar *filename, GMarkupParser *parser,
+                     GError **error)
+{
     GMarkupParseContext *context = NULL;
     guchar *content = NULL, *s;
     gboolean ok = FALSE;
 
-    if (!gwyzip_locate_file(zipfile, "Scan/Measure.xml", 1, error)
+    if (!gwyzip_locate_file(zipfile, filename, 1, error)
         || !(content = gwyzip_get_file_content(zipfile, NULL, error)))
         return FALSE;
 
@@ -463,28 +868,205 @@ nao_parse_measure(GwyZipFile zipfile,
 
     if (!naofile->path)
         naofile->path = g_string_new(NULL);
-    if (!naofile->hash)
-        naofile->hash = g_hash_table_new_full(g_str_hash, g_str_equal,
-                                              g_free, g_free);
+    naofile->streams = g_array_new(FALSE, FALSE, sizeof(NAOStream));
+    naofile->spectra = g_array_new(FALSE, FALSE, sizeof(NAOSpectrum));
 
-    context = g_markup_parse_context_new(&parser, 0, naofile, NULL);
+    context = g_markup_parse_context_new(parser, 0, naofile, NULL);
     if (!g_markup_parse_context_parse(context, s, -1, error))
         goto fail;
     if (!g_markup_parse_context_end_parse(context, error))
         goto fail;
-
-    if (!naofile->have_resolution) {
-        err_MISSING_FIELD(error, "Resolution");
+    if (!find_size_and_resolution(naofile, error))
         goto fail;
-    }
-    if (!naofile->have_size) {
-        err_MISSING_FIELD(error, "Size");
+    gwy_debug("nstreams %u", (guint)naofile->streams->len);
+    if (!naofile->streams->len) {
+        err_NO_DATA(error);
         goto fail;
     }
-    if (!naofile->nstreams) {
+    ok = TRUE;
+
+    if (g_hash_table_size(naofile->hash)) {
+        naofile->meta = gwy_container_new();
+        g_hash_table_foreach(naofile->hash, &add_meta, naofile->meta);
+    }
+
+fail:
+    if (context)
+        g_markup_parse_context_free(context);
+    g_free(content);
+
+    return ok;
+}
+
+static void
+nao133_spectro_start_element(G_GNUC_UNUSED GMarkupParseContext *context,
+                             const gchar *element_name,
+                             const gchar **attribute_names,
+                             const gchar **attribute_values,
+                             gpointer user_data,
+                             G_GNUC_UNUSED GError **error)
+{
+    NAOSpectrum *spectrum = (NAOSpectrum*)user_data;
+    gchar *path;
+
+    g_string_append_c(spectrum->path, '/');
+    g_string_append(spectrum->path, element_name);
+    path = spectrum->path->str;
+
+    if (gwy_strequal(path, "/Spectroscopy/SpectroData/ChannelData")) {
+        const gchar *name, *unit;
+        gwy_debug(element_name);
+        if ((name = find_attribute(attribute_names, attribute_values, "Name"))
+            && (unit = find_attribute(attribute_names, attribute_values,
+                                      "Unit"))) {
+            spectrum->current_name = g_strdup(name);
+            spectrum->current_unit = g_strdup(unit);
+        }
+    }
+    else if (gwy_strequal(path,
+                          "/Spectroscopy/SpectroData/ChannelData/PassData")) {
+        const gchar *name, *capacity, *sizeused;
+        gwy_debug(element_name);
+        if ((name = find_attribute(attribute_names, attribute_values, "Name"))
+            && (capacity = find_attribute(attribute_names, attribute_values,
+                                          "Capacity"))
+            && (sizeused = find_attribute(attribute_names, attribute_values,
+                                          "SizeUsed"))) {
+            NAOSpectrumData specdata;
+            gwy_clear(&specdata, 1);
+            specdata.capacity = atoi(capacity);
+            specdata.sizeused = atoi(sizeused);
+            specdata.dir = g_strdup(name);
+            specdata.name = g_strdup(spectrum->current_name);
+            specdata.unit = g_strdup(spectrum->current_unit);
+            spectrum->current_specdata_id = spectrum->specdata->len;
+            g_array_append_val(spectrum->specdata, specdata);
+        }
+    }
+}
+
+static void
+nao133_spectro_end_element(G_GNUC_UNUSED GMarkupParseContext *context,
+                           const gchar *element_name,
+                           gpointer user_data,
+                           G_GNUC_UNUSED GError **error)
+{
+    NAOSpectrum *spectrum = (NAOSpectrum*)user_data;
+    guint n = strlen(element_name), len = spectrum->path->len;
+    gchar *path = spectrum->path->str;
+
+    g_return_if_fail(g_str_has_suffix(path, element_name));
+    g_return_if_fail(len > n);
+    g_return_if_fail(path[len-1 - n] == '/');
+    if (gwy_strequal(path, "/Spectroscopy/SpectroData/ChannelData")) {
+        GWY_FREE(spectrum->current_name);
+        GWY_FREE(spectrum->current_unit);
+    }
+    else if (gwy_strequal(path,
+                          "/Spectroscopy/SpectroData/ChannelData/PassData")) {
+        spectrum->current_specdata_id = G_MAXUINT;
+    }
+    g_string_set_size(spectrum->path, len-1 - n);
+}
+
+static void
+nao133_spectro_text(G_GNUC_UNUSED GMarkupParseContext *context,
+                    const gchar *text,
+                    gsize text_len,
+                    gpointer user_data,
+                    G_GNUC_UNUSED GError **error)
+{
+    NAOSpectrum *spectrum = (NAOSpectrum*)user_data;
+    gchar *path = spectrum->path->str;
+
+    /* The per-spectrum metadata.  Unfortunately, there is no place in GWY
+     * files for them; but we use them to construct the GwySpectra. */
+    if (gwy_strequal(path, "/Spectroscopy/SpectroParameters")) {
+        GwyTextHeaderParser parser;
+        GHashTable *hash;
+        gchar *spectro_parameters = g_strndup(text, text_len);
+
+        gwy_clear(&parser, 1);
+        parser.key_value_separator = "=";
+        hash = gwy_text_header_parse(spectro_parameters, &parser, NULL, NULL);
+        if (spectrum->hash && hash) {
+            g_warning("Multiple SpectroParameters tags.  Using the last one.");
+            g_free(spectrum->spectro_parameters);
+            g_hash_table_destroy(spectrum->hash);
+        }
+        if (hash) {
+            spectrum->spectro_parameters = spectro_parameters;
+            spectrum->hash = hash;
+        }
+        else
+            g_free(spectro_parameters);
+    }
+    /* The actual data, represented as a list of plain text data values. */
+    else if (gwy_strequal(path,
+                          "/Spectroscopy/SpectroData/ChannelData/PassData")
+             && spectrum->current_specdata_id != G_MAXUINT) {
+        NAOSpectrumData *specdata = &g_array_index(spectrum->specdata,
+                                                   NAOSpectrumData,
+                                                   spectrum->current_specdata_id);
+        gchar *end;
+        GArray *values = g_array_new(FALSE, FALSE, sizeof(gdouble));
+
+        while (TRUE) {
+            gdouble v = g_ascii_strtod(text, &end);
+            if (end == text)
+                break;
+            g_array_append_val(values, v);
+            text = end;
+        }
+        /* Limit the number of point to SizeUsed. */
+        values->len = MIN(values->len, specdata->sizeused);
+        if (values->len) {
+            specdata->nvalues = values->len;
+            specdata->values = (gdouble*)g_array_free(values, FALSE);
+        }
+        else
+            g_array_free(values, TRUE);
+    }
+}
+
+static gboolean
+nao133_parse_spectrum(GwyZipFile zipfile, NAOSpectrum *spectrum, GError **error)
+{
+    GMarkupParser parser = {
+        &nao133_spectro_start_element,
+        &nao133_spectro_end_element,
+        &nao133_spectro_text,
+        NULL,
+        NULL,
+    };
+    GMarkupParseContext *context = NULL;
+    guchar *content = NULL, *s;
+    gboolean ok = FALSE;
+
+    if (!(content = gwyzip_get_file_content(zipfile, NULL, error)))
+        return FALSE;
+
+    gwy_strkill(content, "\r");
+    s = content;
+    if (g_str_has_prefix(s, BLOODY_UTF8_BOM))
+        s += strlen(BLOODY_UTF8_BOM);
+
+    spectrum->specdata = g_array_new(FALSE, FALSE, sizeof(NAOSpectrumData));
+
+    context = g_markup_parse_context_new(&parser, 0, spectrum, NULL);
+    if (!g_markup_parse_context_parse(context, s, -1, error))
+        goto fail;
+    if (!g_markup_parse_context_end_parse(context, error))
+        goto fail;
+    gwy_debug("nspecdata %u", (guint)spectrum->specdata->len);
+    if (!spectrum->specdata->len) {
+        /* A bit misleading? */
         err_NO_DATA(error);
         goto fail;
     }
+    if (!find_spectrum_abscissa(spectrum, error))
+        goto fail;
+
     ok = TRUE;
 
 fail:
@@ -496,13 +1078,310 @@ fail:
 }
 
 static void
-nao_file_free(NAOFile *naofile)
+create_channel(NAOFile *naofile, GwyDataField *dfield,
+               NAOStream *stream, guint channelno, GwyContainer *container)
+{
+    GwyContainer *meta;
+    GQuark key;
+    gchar *title;
+
+    key = gwy_app_get_data_key_for_id(channelno);
+    gwy_container_set_object(container, key, dfield);
+    g_object_unref(dfield);
+
+    key = gwy_app_get_data_title_key_for_id(channelno);
+    title = g_strconcat(stream->name, " ", stream->dir, NULL);
+    gwy_container_set_string(container, key, title);
+
+    if (naofile->meta) {
+        key = gwy_app_get_data_meta_key_for_id(channelno);
+        meta = gwy_container_duplicate(naofile->meta);
+        gwy_container_set_object(container, key, meta);
+        g_object_unref(meta);
+    }
+    gwy_file_channel_import_log_add(container, channelno,
+                                    NULL, naofile->filename);
+}
+
+/* We must organise spectra differently than in the file: split them by channel
+ * and direction but group different positions to one GwySpectra object. */
+static void
+create_spectra(NAOFile *naofile, GwyContainer *container)
+{
+    GwyDataField *dfield = NULL;
+    GPtrArray *sps;
+    guint i, j, id;
+
+    if (!naofile->spectra || !naofile->spectra->len)
+        return;
+
+    if (!gwy_container_gis_object(container, gwy_app_get_data_key_for_id(0),
+                                  (GObject**)&dfield)) {
+        g_warning("Cannot convert spectra pixel coordinates to real "
+                  "because there is no image.");
+    }
+
+    sps = g_ptr_array_new();
+    for (i = 0; i < naofile->spectra->len; i++) {
+        NAOSpectrum *spectrum = &g_array_index(naofile->spectra, NAOSpectrum,
+                                               i);
+        const gchar *xtitle;
+
+        /* Spectrum planned, but not measured. */
+        if (!spectrum->specdata)
+            continue;
+
+        if (dfield) {
+            spectrum->x = gwy_data_field_jtor(dfield, spectrum->x + 0.5);
+            spectrum->y = gwy_data_field_itor(dfield,
+                                              dfield->yres - 0.5 - spectrum->y);
+        }
+
+        xtitle = g_hash_table_lookup(spectrum->hash, "SweepSignal");
+        for (j = 0; j < spectrum->specdata->len; j++) {
+            NAOSpectrumData *specdata = &g_array_index(spectrum->specdata,
+                                                       NAOSpectrumData, j);
+            GwyDataLine *dline = create_dataline_for_spectrum(specdata,
+                                                              spectrum);
+            add_dline_to_spectra(sps, dline,
+                                 xtitle, specdata->name, specdata->dir,
+                                 spectrum->x, spectrum->y);
+        }
+    }
+
+    for (id = 0; id < sps->len; id++) {
+        GwySpectra *spectra = (GwySpectra*)g_ptr_array_index(sps, id);
+        GQuark key = gwy_app_get_spectra_key_for_id(id);
+        gwy_container_set_object(container, key, spectra);
+        g_object_unref(spectra);
+    }
+    g_ptr_array_free(sps, TRUE);
+}
+
+static GwyDataLine*
+create_dataline_for_spectrum(NAOSpectrumData *specdata, NAOSpectrum *spectrum)
+{
+    GwyDataLine *dline;
+    gdouble real = spectrum->sweep_to - spectrum->sweep_from;
+
+    if (!(fabs(real) > 0.0)) {
+        g_warning("Spectrum sweep range is zero, fixing to 1.0");
+        real = 1.0;
+    }
+
+    dline = gwy_data_line_new(specdata->nvalues, fabs(real), FALSE);
+    gwy_assign(gwy_data_line_get_data(dline), specdata->values,
+               specdata->nvalues);
+
+    if (real > 0.0)
+        gwy_data_line_set_offset(dline, spectrum->sweep_from);
+    else {
+        gwy_data_line_invert(dline, TRUE, FALSE);
+        gwy_data_line_set_offset(dline, spectrum->sweep_to);
+    }
+
+    gwy_si_unit_set_from_string(gwy_data_line_get_si_unit_x(dline),
+                                spectrum->sweep_unit);
+    gwy_si_unit_set_from_string(gwy_data_line_get_si_unit_y(dline),
+                                specdata->unit);
+
+    return dline;
+}
+
+static void
+add_dline_to_spectra(GPtrArray *sps, GwyDataLine *dline,
+                     const gchar *xtitle, const gchar *name, const gchar *dir,
+                     gdouble x, gdouble y)
+{
+    gchar *fullname = g_strconcat(name, " ", dir, NULL);
+    const gchar *specxlabel;
+    GwyDataLine *firstspec;
+    GwySpectra *spectra = NULL;
+    guint i;
+
+    gwy_debug("looking for <%s><%s><%s>", fullname, name, xtitle);
+    /* Find spectra set that matches all the attributes. */
+    for (i = 0; i < sps->len; i++) {
+        spectra = (GwySpectra*)g_ptr_array_index(sps, i);
+        firstspec = gwy_spectra_get_spectrum(spectra, 0);
+        specxlabel = gwy_spectra_get_spectrum_x_label(spectra);
+        if (gwy_strequal(gwy_spectra_get_title(spectra), fullname)
+            && gwy_strequal(gwy_spectra_get_spectrum_y_label(spectra), name)
+            && ((!specxlabel && !xtitle)
+                || (specxlabel && xtitle && gwy_strequal(specxlabel, xtitle)))
+            && gwy_si_unit_equal(gwy_data_line_get_si_unit_x(dline),
+                                 gwy_data_line_get_si_unit_x(firstspec))
+            && gwy_si_unit_equal(gwy_data_line_get_si_unit_y(dline),
+                                 gwy_data_line_get_si_unit_y(firstspec)))
+            break;
+        spectra = NULL;
+    }
+
+    if (!spectra) {
+        spectra = gwy_spectra_new();
+        gwy_spectra_set_title(spectra, fullname);
+        gwy_spectra_set_spectrum_y_label(spectra, name);
+        if (xtitle)
+            gwy_spectra_set_spectrum_x_label(spectra, xtitle);
+        gwy_si_unit_set_from_string(gwy_spectra_get_si_unit_xy(spectra), "m");
+        g_ptr_array_add(sps, spectra);
+    }
+
+    gwy_spectra_add_spectrum(spectra, dline, x, y);
+    g_object_unref(dline);
+    g_free(fullname);
+}
+
+static gboolean
+find_size_and_resolution(NAOFile *naofile, GError **error)
+{
+    GHashTable *hash = naofile->hash;
+    const gchar *value;
+
+    /* Ensure the parameter hash table exists.  It may not if there is no
+     * parameters part or (in 1.23) is empty. */
+    if (!hash) {
+        err_MISSING_FIELD(error, "Resolution");
+        return FALSE;
+    }
+
+    if ((value = g_hash_table_lookup(hash, "Resolution"))) {
+        if (sscanf(value, "%u, %u", &naofile->xres, &naofile->yres) != 2) {
+            err_INVALID(error, "Resolution");
+            return FALSE;
+        }
+        if (err_DIMENSION(error, naofile->xres)
+            || err_DIMENSION(error, naofile->yres))
+            return FALSE;
+    }
+    else {
+        err_MISSING_FIELD(error, "Resolution");
+        return FALSE;
+    }
+    gwy_debug("xres %u, yres %u", naofile->xres, naofile->yres);
+
+    if ((value = g_hash_table_lookup(hash, "Size"))) {
+        gchar *end, *s = g_strdup(value);
+        if ((naofile->xreal = g_ascii_strtod(s, &end)) > 0.0
+            && *end == ','
+            && (naofile->yreal = g_ascii_strtod(end+1, NULL)) > 0.0) {
+            /* OK. */
+        }
+        else {
+            g_free(s);
+            err_INVALID(error, "Size");
+            return FALSE;
+        }
+        g_free(s);
+    }
+    else {
+        err_MISSING_FIELD(error, "Size");
+        return FALSE;
+    }
+    gwy_debug("xreal %g, yreal %g", naofile->xreal, naofile->yreal);
+
+    return TRUE;
+}
+
+static gboolean
+find_spectrum_abscissa(NAOSpectrum *spectrum, GError **error)
+{
+    GHashTable *hash = spectrum->hash;
+    const gchar *value;
+
+    /* Ensure the parameter hash table exists. */
+    if (!hash) {
+        err_MISSING_FIELD(error, "SweepFromValue");
+        return FALSE;
+    }
+
+    if ((value = g_hash_table_lookup(hash, "SweepFromValue"))) {
+        spectrum->sweep_from = g_ascii_strtod(value, NULL);
+    }
+    else {
+        err_MISSING_FIELD(error, "SweepFromValue");
+        return FALSE;
+    }
+
+    if ((value = g_hash_table_lookup(hash, "SweepToValue"))) {
+        spectrum->sweep_to = g_ascii_strtod(value, NULL);
+    }
+    else {
+        err_MISSING_FIELD(error, "SweepToValue");
+        return FALSE;
+    }
+    gwy_debug("sweep from %g to %g", spectrum->sweep_from, spectrum->sweep_to);
+
+    if ((value = g_hash_table_lookup(hash, "SweepSignalUnitName"))
+        || (value = g_hash_table_lookup(hash, "SweepSignalUnitSymbol"))) {
+        spectrum->sweep_unit = g_strdup(value);
+    }
+    else {
+        err_MISSING_FIELD(error, "SweepSignalUnitName");
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+static const gchar*
+find_attribute(const gchar **attribute_names, const gchar **attribute_values,
+               const gchar *attrname)
 {
     guint i;
 
-    for (i = 0; i < naofile->nstreams; i++) {
-        g_free(naofile->streams[i].name);
-        g_free(naofile->streams[i].units);
+    if (!attribute_names)
+        return NULL;
+
+    for (i = 0; attribute_names[i]; i++) {
+        if (gwy_strequal(attribute_names[i], attrname))
+            return attribute_values[i];
+    }
+
+    return NULL;
+}
+
+static void
+nao_file_free(NAOFile *naofile)
+{
+    guint i, j;
+
+    if (naofile->streams) {
+        for (i = 0; i < naofile->streams->len; i++) {
+            NAOStream *stream = &g_array_index(naofile->streams, NAOStream, i);
+            g_free(stream->name);
+            g_free(stream->units);
+            g_free(stream->filename);
+            g_free(stream->dir);
+        }
+        g_array_free(naofile->streams, TRUE);
+    }
+    if (naofile->spectra) {
+        GArray *spectra = naofile->spectra;
+        for (i = 0; i < spectra->len; i++) {
+            NAOSpectrum *spectrum = &g_array_index(spectra, NAOSpectrum, i);
+            if (spectrum->specdata) {
+                GArray *specdatas = spectrum->specdata;
+                for (j = 0; j < specdatas->len; j++) {
+                    NAOSpectrumData *specdata = &g_array_index(specdatas,
+                                                               NAOSpectrumData,
+                                                               j);
+                    g_free(specdata->dir);
+                    g_free(specdata->name);
+                    g_free(specdata->unit);
+                    g_free(specdata->values);
+                }
+                g_array_free(specdatas, TRUE);
+            }
+            if (spectrum->hash)
+                g_hash_table_destroy(spectrum->hash);
+            g_free(spectrum->sweep_unit);
+            g_free(spectrum->spectro_parameters);
+            g_free(spectrum->current_name);
+            g_free(spectrum->current_unit);
+            g_free(spectrum->filename);
+        }
+        g_array_free(naofile->spectra, TRUE);
     }
     if (naofile->hash) {
         g_hash_table_destroy(naofile->hash);
@@ -512,7 +1391,9 @@ nao_file_free(NAOFile *naofile)
         g_string_free(naofile->path, TRUE);
         naofile->path = NULL;
     }
-    g_free(naofile->streams);
+    g_free(naofile->current_name);
+    g_free(naofile->imaging_parameters);
+    GWY_OBJECT_UNREF(naofile->meta);
 }
 
 /* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/file/nanoscan.c b/modules/file/nanoscan.c
index abe4365..0bfa7bd 100644
--- a/modules/file/nanoscan.c
+++ b/modules/file/nanoscan.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: nanoscan.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: nanoscan.c 20152 2017-08-03 08:50:44Z yeti-dn $
  *  Copyright (C) 2009 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -44,6 +44,7 @@
 #include <libgwyddion/gwymath.h>
 #include <libgwyddion/gwyutils.h>
 #include <libprocess/stats.h>
+#include <libprocess/correct.h>
 #include <libgwymodule/gwymodule-file.h>
 #include <app/gwymoduleutils-file.h>
 #include <app/data-browser.h>
@@ -101,6 +102,7 @@ typedef struct {
     gchar *name;
     gchar *zunits;
     gfloat *data;
+    guint ndata;  /* May be smaller than expected for incomplete measurement. */
     NanoScanDirection direction;
     gboolean already_added;
 } NanoScanChannel;
@@ -180,6 +182,7 @@ static void          add_meta            (NanoScanFile *nfile,
                                           gchar *value);
 static gfloat*       read_channel_data   (const gchar *value,
                                           guint npixels,
+                                          guint *actual_npixels,
                                           GError **error);
 
 static GwyModuleInfo module_info = {
@@ -187,12 +190,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Imports NanoScan XML files."),
     "Yeti <yeti at gwyddion.net>",
-    "0.5",
+    "0.7",
     "David Nečas (Yeti)",
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, nanoscan)
 
 static gboolean
 module_register(void)
@@ -367,42 +370,62 @@ add_channel(GwyContainer *container,
             NanoScanChannel *channel,
             gint id)
 {
-    GwyDataField *dfield;
+    GwyDataField *dfield, *mask = NULL;
     GwySIUnit *unit;
-    gint power10;
     gdouble *d;
     GQuark quark;
-    gchar *key, *title;
-    gdouble q = 1.0;
-    gint i, j;
-
-    dfield = gwy_data_field_new(nfile->xres, nfile->yres,
-                                nfile->xreal, nfile->yreal,
+    gchar *title;
+    gdouble yreal, q = 1.0;
+    gint nrows, i, power10;
+
+    nrows = (channel->ndata + nfile->xres-1)/nfile->xres;
+    gwy_debug("nrows %d, yres %d", nrows, nfile->yres);
+    yreal = nfile->yreal*nrows/nfile->yres;
+    dfield = gwy_data_field_new(nfile->xres, nrows, nfile->xreal, yreal,
                                 FALSE);
     if (nfile->xyunits) {
         unit = gwy_data_field_get_si_unit_xy(dfield);
         gwy_si_unit_set_from_string_parse(unit, nfile->xyunits, &power10);
         gwy_data_field_set_xreal(dfield, pow10(power10)*nfile->xreal);
-        gwy_data_field_set_yreal(dfield, pow10(power10)*nfile->yreal);
+        gwy_data_field_set_yreal(dfield, pow10(power10)*yreal);
     }
     if (channel->zunits) {
         unit = gwy_data_field_get_si_unit_z(dfield);
         gwy_si_unit_set_from_string_parse(unit, channel->zunits, &power10);
         q = pow10(power10);
     }
+
     d = gwy_data_field_get_data(dfield);
-    for (i = 0; i < nfile->yres; i++) {
-        for (j = 0; j < nfile->xres; j++) {
-            d[(nfile->yres-1 - i)*nfile->xres + j]
-                = q*channel->data[i*nfile->xres + j];
-        }
+    for (i = 0; i < channel->ndata; i++)
+        d[i] = q*channel->data[i];
+    gwy_data_field_invert(dfield, TRUE, FALSE, FALSE);
+
+    /* Create a mask that is the union of invalid and missing values. */
+    mask = gwy_app_channel_mask_of_nans(dfield, FALSE);
+    if (channel->ndata % nfile->xres != 0) {
+        if (!mask)
+            mask = gwy_data_field_new_alike(dfield, TRUE);
+
+        d = gwy_data_field_get_data(mask);
+        for (i = channel->ndata; i < nfile->xres*nrows; i++)
+            d[i] = 1.0;
     }
+
+    if (mask)
+        gwy_data_field_laplace_solve(dfield, mask, -1, 1.0);
+
     quark = gwy_app_get_data_key_for_id(id);
     gwy_container_set_object(container, quark, dfield);
     g_object_unref(dfield);
 
+    if (mask) {
+        quark = gwy_app_get_mask_key_for_id(id);
+        gwy_container_set_object(container, quark, mask);
+        g_object_unref(mask);
+    }
+
     if (channel->name) {
-        key = g_strconcat(g_quark_to_string(quark), "/title", NULL);
+        quark = gwy_app_get_data_title_key_for_id(id);
         if (channel->direction == SCAN_FORWARD)
             title = g_strconcat(channel->name, " [Forward]", NULL);
         else if (channel->direction == SCAN_BACKWARD)
@@ -411,8 +434,7 @@ add_channel(GwyContainer *container,
             title = channel->name;
             channel->name = NULL;
         }
-        gwy_container_set_string_by_name(container, key, title);
-        g_free(key);
+        gwy_container_set_string(container, quark, title);
     }
     gwy_file_channel_import_log_add(container, id, NULL, filename);
     channel->already_added = TRUE;
@@ -466,8 +488,8 @@ add_curve_model(NanoScanFile *nfile,
     gdouble *d;
     gint power10, j;
 
-    real = axis0->stop - axis0->start;
-    dline = gwy_data_line_new(nfile->xres, real, FALSE);
+    real = (axis0->stop - axis0->start)*channel->ndata/nfile->xres;
+    dline = gwy_data_line_new(channel->ndata, real, FALSE);
     gwy_data_line_set_offset(dline, axis0->start);
     if (axis0->units) {
         unit = gwy_data_line_get_si_unit_x(dline);
@@ -481,9 +503,8 @@ add_curve_model(NanoScanFile *nfile,
         q = pow10(power10);
     }
     d = gwy_data_line_get_data(dline);
-    for (j = 0; j < nfile->xres; j++) {
+    for (j = 0; j < channel->ndata; j++)
         d[j] = q*channel->data[j];
-    }
     gcmodel = gwy_graph_curve_model_new();
     gwy_graph_curve_model_set_data_from_dataline(gcmodel, dline, 0, 0);
     g_object_set(gcmodel,
@@ -558,10 +579,16 @@ add_multicurve_model(NanoScanFile *nfile,
     gdouble real, yval, q = 1.0;
     gdouble *d;
     gchar *descr;
-    gint power10, j;
+    gint start, npts, power10, j;
 
-    real = axis0->stop - axis0->start;
-    dline = gwy_data_line_new(nfile->xres, real, FALSE);
+    /* Completely missing line. */
+    start = i*nfile->xres;
+    if (start >= channel->ndata)
+        return;
+
+    npts = MAX(channel->ndata - start, nfile->xres);
+    real = (axis0->stop - axis0->start)*npts/nfile->xres;
+    dline = gwy_data_line_new(nfile->xres, real, TRUE);
     gwy_data_line_set_offset(dline, axis0->start);
     if (axis0->units) {
         unit = gwy_data_line_get_si_unit_x(dline);
@@ -575,9 +602,8 @@ add_multicurve_model(NanoScanFile *nfile,
         q = pow10(power10);
     }
     d = gwy_data_line_get_data(dline);
-    for (j = 0; j < nfile->xres; j++) {
-        d[j] = q*channel->data[i*nfile->xres + j];
-    }
+    for (j = 0; j < npts; j++)
+        d[j] = q*channel->data[start + j];
     gcmodel = gwy_graph_curve_model_new();
     gwy_graph_curve_model_set_data_from_dataline(gcmodel, dline, 0, 0);
     yval = i/(nfile->yres - 1.0)*(axis1->stop - axis1->start) + axis1->start;
@@ -825,7 +851,7 @@ text(G_GNUC_UNUSED GMarkupParseContext *context,
         else if (gwy_strequal(path, "/data")) {
             g_free(channel->data);
             channel->data = read_channel_data(val, nfile->xres * nfile->yres,
-                                              error);
+                                              &channel->ndata, error);
             gwy_debug("DATA: %p", channel->data);
         }
     }
@@ -899,19 +925,22 @@ add_meta(NanoScanFile *nfile,
 static gfloat*
 read_channel_data(const gchar *value,
                   guint npixels,
+                  guint *actual_npixels,
                   GError **error)
 {
     guchar *mem;
     gsize len;
 
     mem = g_base64_decode(value, &len);
-    if (len != npixels*sizeof(gfloat)) {
+    if (!len || len % sizeof(gfloat) != 0 || len > npixels*sizeof(gfloat)) {
         g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
                     _("Wrong size of Base64 encoded data."));
         g_free(mem);
+        *actual_npixels = 0;
         return NULL;
     }
 
+    *actual_npixels = len/sizeof(gfloat);
     return (gfloat*)mem;
 }
 
diff --git a/modules/file/nanoscope-ii.c b/modules/file/nanoscope-ii.c
index cd6dc89..69676a7 100644
--- a/modules/file/nanoscope-ii.c
+++ b/modules/file/nanoscope-ii.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: nanoscope-ii.c 16387 2014-07-10 10:41:50Z yeti-dn $
+ *  @(#) $Id: nanoscope-ii.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -90,7 +90,7 @@ static GwyModuleInfo module_info = {
     "2007",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, nanoscope_ii)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/nanoscope.c b/modules/file/nanoscope.c
index 7aa5874..1432700 100644
--- a/modules/file/nanoscope.c
+++ b/modules/file/nanoscope.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: nanoscope.c 19044 2016-10-08 19:10:46Z yeti-dn $
- *  Copyright (C) 2004-2015 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: nanoscope.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2004-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -25,6 +25,7 @@
  *   <comment>Nanoscope III SPM data</comment>
  *   <magic priority="80">
  *     <match type="string" offset="0" value="\\*File list\r\n"/>
+ *     <match type="string" offset="0" value="\\*EC File list\r\n"/>
  *     <match type="string" offset="0" value="?*File list\r\n"/>
  *   </magic>
  * </mime-type>
@@ -35,6 +36,7 @@
  * # Nanoscope III
  * # Two header variants.
  * 0 string \\*File\ list\x0d\x0a Nanoscope III SPM binary data
+ * 0 string \\*EC\ File\ list\x0d\x0a Nanoscope III electrochemistry SPM binary data
  * 0 string ?*File\ list\x0d\x0a Nanoscope III SPM text data
  **/
 
@@ -72,6 +74,9 @@
 #define MAGIC_FORCE_BIN "\\*Force file list\r\n"
 #define MAGIC_FORCE_SIZE (sizeof(MAGIC_FORCE_BIN)-1)
 
+#define MAGIC_EC_BIN "\\*EC File list\r\n"
+#define MAGIC_EC_SIZE (sizeof(MAGIC_EC_BIN)-1)
+
 typedef enum {
     NANOSCOPE_FILE_TYPE_NONE = 0,
     NANOSCOPE_FILE_TYPE_BIN,
@@ -207,12 +212,12 @@ static GwyModuleInfo module_info = {
     N_("Imports Veeco (Digital Instruments) Nanoscope data files, "
        "version 3 or newer."),
     "Yeti <yeti at gwyddion.net>",
-    "0.34",
+    "0.35",
     "David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, nanoscope)
 
 static gboolean
 module_register(void)
@@ -239,7 +244,8 @@ nanoscope_detect(const GwyFileDetectInfo *fileinfo,
     if (fileinfo->buffer_len > MAGIC_SIZE
         && (!memcmp(fileinfo->head, MAGIC_TXT_PARTIAL, MAGIC_SIZE_PARTIAL)
             || !memcmp(fileinfo->head, MAGIC_BIN_PARTIAL, MAGIC_SIZE_PARTIAL)
-            || !memcmp(fileinfo->head, MAGIC_FORCE_BIN, MAGIC_FORCE_SIZE)))
+            || !memcmp(fileinfo->head, MAGIC_FORCE_BIN, MAGIC_FORCE_SIZE)
+            || !memcmp(fileinfo->head, MAGIC_EC_BIN, MAGIC_EC_SIZE)))
         score = 100;
 
     return score;
@@ -275,7 +281,8 @@ nanoscope_load(const gchar *filename,
     if (size > MAGIC_SIZE) {
         if (!memcmp(buffer, MAGIC_TXT, MAGIC_SIZE))
             file_type = NANOSCOPE_FILE_TYPE_TXT;
-        else if (!memcmp(buffer, MAGIC_BIN, MAGIC_SIZE))
+        else if (!memcmp(buffer, MAGIC_BIN, MAGIC_SIZE)
+                 || !memcmp(buffer, MAGIC_EC_BIN, MAGIC_EC_SIZE))
             file_type = NANOSCOPE_FILE_TYPE_BIN;
         else if (!memcmp(buffer, MAGIC_FORCE_BIN, MAGIC_FORCE_SIZE))
             file_type = NANOSCOPE_FILE_TYPE_FORCE_BIN;
diff --git a/modules/file/nanotop.c b/modules/file/nanotop.c
index 5e6009a..7c443eb 100644
--- a/modules/file/nanotop.c
+++ b/modules/file/nanotop.c
@@ -111,7 +111,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, nanotop)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/netcdf.c b/modules/file/netcdf.c
index 3939fc6..15ae51b 100644
--- a/modules/file/netcdf.c
+++ b/modules/file/netcdf.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: netcdf.c 16816 2014-11-21 10:34:00Z yeti-dn $
+ *  @(#) $Id: netcdf.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2006 David Necas (Yeti), Petr Klapetek, Niv Levy.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, nivl2000 at gmail.com.
  *
@@ -193,7 +193,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, netcdf)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/nmmxyz.c b/modules/file/nmmxyz.c
index 87451fe..a7d24c3 100644
--- a/modules/file/nmmxyz.c
+++ b/modules/file/nmmxyz.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: nmmxyz.c 19280 2016-11-16 17:31:41Z yeti-dn $
+ *  $Id: nmmxyz.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2016 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -206,7 +206,7 @@ static GwyModuleInfo module_info = {
     "2016",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, nmmxyz)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/nt-mdt.c b/modules/file/nt-mdt.c
index 7df83fb..78e0356 100644
--- a/modules/file/nt-mdt.c
+++ b/modules/file/nt-mdt.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: nt-mdt.c 19131 2016-10-30 11:28:17Z dn2010 $
+ *  @(#) $Id: nt-mdt.c 20185 2017-08-07 13:59:41Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -148,7 +148,8 @@ typedef enum {
     MDT_UNIT_RESERVED_DOS1   = 36,
     MDT_UNIT_RESERVED_DOS2   = 37,
     MDT_UNIT_RESERVED_DOS3   = 38,
-    MDT_UNIT_RESERVED_DOS4   = 39
+    MDT_UNIT_RESERVED_DOS4   = 39,
+    MDT_UNIT_HERZ            = 1170
 } MDTUnit;
 
 typedef enum {
@@ -342,8 +343,11 @@ typedef struct {
     gint sp_4u;
     gint sp_4i;
     gint sp_nx;
-    gchar sp_reserved[3];
-    gchar sp_ev2;
+    gchar sp_reserved[95];
+    gchar sp_ver;
+    guint scn_guid;
+
+    //gchar sp_ev2;
     /* XXX: much more stuff can be here */
 
     /* Frame mode stuff */
@@ -360,6 +364,7 @@ typedef struct {
     guint title_len;
     const guchar *title;
     gchar *xmlstuff;
+    MDTFrameType frame_type;
 } MDTSpectroscopyDataFrame;
 
 typedef struct {
@@ -621,7 +626,7 @@ static const GwyEnum frame_types[] = {
     { "MDA",          MDT_FRAME_MDA },
     { "Palette",      MDT_FRAME_PALETTE },
     { "Curves",       MDT_FRAME_CURVES },
-    { "New Curves",       MDT_FRAME_CURVES_NEW }
+    { "New Curves",   MDT_FRAME_CURVES_NEW }
 };
 #endif
 
@@ -677,6 +682,7 @@ static const GwyEnum mdt_units[] = {
     { "",     MDT_UNIT_RESERVED_DOS2 },
     { "",     MDT_UNIT_RESERVED_DOS3 },
     { "",     MDT_UNIT_RESERVED_DOS4 },
+    { "Hz",   MDT_UNIT_HERZ },
 };
 #else  /* {{{ */
 /* This code block was GENERATED by flatten.py.
@@ -686,7 +692,7 @@ static const gchar mdt_units_name[] =
     "1/cm\000\000\000\000\000m\000cm\000mm\000µm\000nm\000Å\000nA\000V"
     "\000\000kHz\000deg\000%\000°C\000V\000s\000ms\000µs\000ns\000\000px"
     "\000\000\000\000\000\000A\000mA\000µA\000nA\000pA\000V\000mV\000µV"
-    "\000nV\000pV\000N\000mN\000µN\000nN\000pN\000\000\000\000\000";
+    "\000nV\000pV\000N\000mN\000µN\000nN\000pN\000\000\000\000\000\000Hz";
 
 static const GwyFlatEnum mdt_units[] = {
     { 0, MDT_UNIT_RAMAN_SHIFT },
@@ -739,6 +745,7 @@ static const GwyFlatEnum mdt_units[] = {
     { 117, MDT_UNIT_RESERVED_DOS2 },
     { 118, MDT_UNIT_RESERVED_DOS3 },
     { 119, MDT_UNIT_RESERVED_DOS4 },
+    { 120, MDT_UNIT_HERZ },
 };
 #endif  /* }}} */
 
@@ -842,12 +849,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Imports NT-MDT data files."),
     "Yeti <yeti at gwyddion.net>",
-    "0.22",
+    "0.23",
     "David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, nt_mdt)
 
 static gboolean
 module_register(void)
@@ -1512,7 +1519,7 @@ mdt_scanned_data_vars(const guchar *p,
         p += 14 + frame->fm_ndots * 16;
     }
 
-    if (frame->fm_xres * frame->fm_yres) {
+    if (frame->fm_xres && frame->fm_yres) {
         frame->image = p;
         p += sizeof(gint16)*frame->fm_xres*frame->fm_yres;
     }
@@ -1619,10 +1626,13 @@ mdt_spectroscopy_data_vars(const guchar *p,
                                     (guint)(frame_size - (p - fstart)));
     if (frame->fm_ndots) {
         frame->dots = p;
-        p += 14 + frame->fm_ndots * 16;
+        if (frame->frame_type == MDT_FRAME_SPECTROSCOPY)
+            p += frame->fm_ndots * 4;
+        else if (frame->frame_type == MDT_FRAME_CURVES)
+            p += 14 + frame->fm_ndots * 16;
     }
 
-    if (frame->fm_xres * frame->fm_yres) {
+    if (frame->fm_xres && frame->fm_yres) {
         frame->data = p;
         p += sizeof(gint16)*frame->fm_xres*frame->fm_yres;
     }
@@ -1930,6 +1940,7 @@ mdt_real_load(const guchar *buffer,
             }
 
             spframe = g_new0(MDTSpectroscopyDataFrame, 1);
+            spframe->frame_type = frame->type;
             if (!mdt_spectroscopy_data_vars(p, fstart, spframe,
                                        frame->size, frame->var_size, error))
                 return FALSE;
@@ -2059,6 +2070,7 @@ extract_scanned_spectrum (MDTSpectroscopyDataFrame *dataframe, guint number)
     const gint16 *p;
     const gchar *unit;
     gchar *framename;
+
     unit = gwy_flat_enum_to_string(dataframe->x_scale.unit,
                                    G_N_ELEMENTS(mdt_units),
                                    mdt_units, mdt_units_name);
@@ -2256,7 +2268,7 @@ static GwySpectra* extract_sps_curve (MDTSpectroscopyDataFrame *dataframe,
     gdouble *ydata = NULL;
     G_GNUC_UNUSED gdouble xreal, zscale;
     gdouble deltax;
-    gint power10x, power10z, power10coordxy;
+    gint power10x, power10z, power10coordxy = 0;
     const guchar *p;
     const gchar *unit;
     gchar *framename;
@@ -2285,13 +2297,19 @@ static GwySpectra* extract_sps_curve (MDTSpectroscopyDataFrame *dataframe,
     coordheader.headersize = gwy_get_gint32_le(&p);
     coordheader.coordsize = gwy_get_gint32_le(&p);
     coordheader.version = gwy_get_gint32_le(&p);
-    coordheader.xyunits = (MDTUnit)gwy_get_gint16_le(&p);
+    coordheader.xyunits = gwy_get_gint16_le(&p);
+    gwy_debug("headersize=%d coordsize=%d ver=%d xyunits=%d",
+              coordheader.headersize,
+              coordheader.coordsize,
+              coordheader.version,
+              coordheader.xyunits);
 
     spectra = gwy_spectra_new();
 
     unit = gwy_flat_enum_to_string(coordheader.xyunits,
                                    G_N_ELEMENTS(mdt_units),
                                    mdt_units, mdt_units_name);
+    gwy_debug("unit=%s", unit);
     siunitcoordxy = gwy_si_unit_new_parse(unit, &power10coordxy);
     gwy_spectra_set_si_unit_xy(spectra, siunitcoordxy);
     g_object_unref(siunitcoordxy);
@@ -2304,6 +2322,11 @@ static GwySpectra* extract_sps_curve (MDTSpectroscopyDataFrame *dataframe,
         coordinates[i].coordy = gwy_get_gfloat_le(&p);
         coordinates[i].forward_size = gwy_get_gint32_le(&p);
         coordinates[i].backward_size = gwy_get_gint32_le(&p);
+        gwy_debug("i=%d x=%g y=%g forw_size=%d backw_size=%d", i,
+                  coordinates[i].coordx,
+                  coordinates[i].coordy,
+                  coordinates[i].forward_size,
+                  coordinates[i].backward_size);
     }
 
     p = dataframe->data;
diff --git a/modules/file/nxiifile.c b/modules/file/nxiifile.c
index f4f417e..3b84742 100644
--- a/modules/file/nxiifile.c
+++ b/modules/file/nxiifile.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: nxiifile.c 16650 2014-10-08 07:47:07Z yeti-dn $
+ *  @(#) $Id: nxiifile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -120,7 +120,7 @@ static GwyModuleInfo module_info = {
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, nxiifile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/oldmda.c b/modules/file/oldmda.c
index fedf064..72200ae 100644
--- a/modules/file/oldmda.c
+++ b/modules/file/oldmda.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: oldmda.c 18234 2016-01-27 14:57:31Z yeti-dn $
+ *  $Id: oldmda.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2010-2011 David Necas (Yeti), Petr Klapetek,
  *  Daniil Bratashov (dn2010)
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, dn2010 at gmail.com
@@ -155,7 +155,7 @@ static GwyModuleInfo module_info = {
     "2012",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, oldmda)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/ols.c b/modules/file/ols.c
index 8fc8d32..4c6f313 100644
--- a/modules/file/ols.c
+++ b/modules/file/ols.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: ols.c 16387 2014-07-10 10:41:50Z yeti-dn $
+ *  @(#) $Id: ols.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -69,7 +69,7 @@ static GwyModuleInfo module_info = {
     "2008",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, ols)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/ometiff.c b/modules/file/ometiff.c
index 5520cf9..1b88c3a 100644
--- a/modules/file/ometiff.c
+++ b/modules/file/ometiff.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: ometiff.c 18616 2016-04-21 15:06:40Z yeti-dn $
+ *  @(#) $Id: ometiff.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2013-2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -158,7 +158,7 @@ static GwyModuleInfo module_info = {
     "2013",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, ometiff)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/omicron.c b/modules/file/omicron.c
index 33f7bdf..0101519 100644
--- a/modules/file/omicron.c
+++ b/modules/file/omicron.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: omicron.c 19071 2016-10-14 09:02:41Z yeti-dn $
+ *  $Id: omicron.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2006-2011 David Necas (Yeti), Petr Klapetek, Markus Pristovsek
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net,
  *  prissi at gift.physik.tu-berlin.de.
@@ -168,7 +168,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, omicron)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/omicronflat.c b/modules/file/omicronflat.c
index 7409784..9631022 100644
--- a/modules/file/omicronflat.c
+++ b/modules/file/omicronflat.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: omicronflat.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: omicronflat.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2015 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -362,7 +362,7 @@ static GwyModuleInfo module_info = {
     "2015",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, omicronflat)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/omicronmatrix.c b/modules/file/omicronmatrix.c
index ad28b34..ba20a29 100644
--- a/modules/file/omicronmatrix.c
+++ b/modules/file/omicronmatrix.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: omicronmatrix.c 18440 2016-03-15 18:44:30Z yeti-dn $
+ *  @(#) $Id: omicronmatrix.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2008, Philipp Rahe, David Necas
  *  E-mail: hquerquadrat at gmail.com
  *
@@ -204,7 +204,7 @@ static GwyModuleInfo module_info = {
     "2008",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, omicronmatrix)
 
 static gboolean module_register(void)
 {
diff --git a/modules/file/opdfile.c b/modules/file/opdfile.c
index 5ae59a2..3c40776 100644
--- a/modules/file/opdfile.c
+++ b/modules/file/opdfile.c
@@ -1,6 +1,6 @@
 /*
- *  $Id: opdfile.c 19044 2016-10-08 19:10:46Z yeti-dn $
- *  Copyright (C) 2008 David Necas (Yeti).
+ *  $Id: opdfile.c 20092 2017-07-26 10:28:17Z yeti-dn $
+ *  Copyright (C) 2008-2017 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -82,7 +82,7 @@
 #define MAGIC_SIZE (sizeof(MAGIC)-1)
 #define EXTENSION ".opd"
 
-#define MAGIC_ASC "Wyko ASCII Data File Format 0\t0\t1"
+#define MAGIC_ASC "Wyko ASCII Data File Format "
 #define MAGIC_ASC_SIZE (sizeof(MAGIC_ASC)-1)
 #define EXTENSION_ASC ".asc"
 
@@ -105,6 +105,10 @@ enum {
     OPD_FLOAT = 7,
     OPD_DOUBLE = 8,
     OPD_LONG = 12,
+    /* Serialised structs; some look like bits of OPDx, some do not.  If this
+     * appears positions in the file are off.  Unfortunately not just of the
+     * binary stuff but apparently also of other things. */
+    OPD_BINARY_STUFF = 15,
 } OPDDataType;
 
 typedef enum {
@@ -113,6 +117,12 @@ typedef enum {
     OPD_ARRAY_BYTE = 1,
 } OPDArrayType;
 
+typedef enum {
+    OPD_STANDARD_IMAGE = 0,
+    OPD_XYZ_PIXEL = 1,
+    OPD_XYZ_REAL = 2,
+} OPDArrayFormat;
+
 /* The header consists of a sequence of these creatures. */
 typedef struct {
     /* This is in the file */
@@ -159,6 +169,7 @@ static void          store_asc_meta    (gpointer key,
                                         gpointer value,
                                         gpointer user_data);
 static GwyDataField* get_asc_data_field(gchar **p,
+                                        OPDArrayFormat format,
                                         guint xres,
                                         guint yres,
                                         gdouble pixel_size,
@@ -187,12 +198,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Imports Wyko OPD and ASC files."),
     "Yeti <yeti at gwyddion.net>",
-    "0.8",
+    "0.11",
     "David Nečas (Yeti)",
     "2008",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, opdfile)
 
 static gboolean
 module_register(void)
@@ -303,6 +314,11 @@ opd_load(const gchar *filename,
     }
     nblocks = j;
 
+    /* XXX: There can be a block called "\xcaxtendedKe\xfds" at the end that
+     * provides mapping from the names truncated to 16 bytes to full names.
+     * Unfortunately, it is of type OPD_BINARY_STUFF and therefore in a
+     * different position in the file than @pos says... */
+
     if (!check_sizes(header, nblocks, error))
         goto fail;
 
@@ -416,10 +432,16 @@ get_block(OPDBlock *block, const guchar **p)
     if (strncmp(block->name, "AdjustVSI_", sizeof("AdjustVSI_")-1) == 0
         && block->type == 7
         && block->size == 2) {
-        g_warning("Changing the type of field %s from float to short.",
-                  block->name);
+        gwy_info("Changing the type of field %s from float to short.",
+                 block->name);
         block->type = 6;
     }
+    if (gwy_strequal(block->name, "ImageModificat~0")
+        && block->type == 7
+        && block->size == 40) {
+        gwy_info("Changing the size of field %s from 40 to 4.", block->name);
+        block->size = 4;
+    }
 }
 
 static gboolean
@@ -705,6 +727,9 @@ opd_asc_load(const gchar *filename,
     gchar *line, *p, *s, *buffer = NULL;
     GHashTable *hash = NULL;
     guint j, xres = 0, yres = 0;
+    OPDArrayFormat format;
+    gint tmp;
+    gboolean real_units, is_float;
     gsize size;
     GError *err = NULL;
 
@@ -715,10 +740,22 @@ opd_asc_load(const gchar *filename,
 
     p = buffer;
     line = gwy_str_next_line(&p);
-    if (!gwy_strequal(line, MAGIC_ASC)) {
+    if (!g_str_has_prefix(line, MAGIC_ASC)) {
         err_FILE_TYPE(error, "Wyko ASC data");
         goto fail;
     }
+    if (sscanf(line + MAGIC_ASC_SIZE, "%d %d %d",
+               &tmp, &real_units, &is_float) != 3) {
+        err_INVALID(error, "Data File Format");
+        goto fail;
+    }
+    format = tmp;
+    gwy_debug("array format %d, real units %d, is float %d",
+              format, real_units, is_float);
+    if (format < 0 || format > 2) {
+        err_UNSUPPORTED(error, "Array Format");
+        goto fail;
+    }
 
     container = gwy_container_new();
     hash = g_hash_table_new(g_str_hash, g_str_equal);
@@ -754,7 +791,7 @@ opd_asc_load(const gchar *filename,
         if (gwy_stramong(line, "OPD", "SAMPLE_DATA", "RAW_DATA", "RAW DATA",
                          "Image", "Intensity", "SecArr_0", "Raw",
                          NULL)) {
-            gdouble pixel_size, wavelength, mult = 1.0, aspect = 1.0;
+            gdouble pixel_size, wavelength, mult = 1.0, aspect = 1.0, zcalib;
             gboolean intensity;
             gchar *k;
 
@@ -782,27 +819,28 @@ opd_asc_load(const gchar *filename,
 
             if ((s = g_hash_table_lookup(hash, "Aspect")))
                 aspect = g_ascii_strtod(s, NULL);
+            /* Should only occur in integer-data files.  Have not seen any... */
             if ((s = g_hash_table_lookup(hash, "Mult")))
                 mult = g_ascii_strtod(s, NULL);
 
-            /* TODO: mult, aspect */
+            intensity = gwy_stramong(line,
+                                     "Image", "Intensity", "SecArr_0", NULL);
 
-            wavelength *= Nanometer;
             pixel_size *= Milimeter;
-            wavelength /= mult;
+            zcalib = Nanometer*mult;
+            if (!intensity && !real_units)
+                zcalib *= wavelength;
 
             dfield = mfield = NULL;
-            intensity = gwy_stramong(line,
-                                     "Image", "Intensity", "SecArr_0", NULL);
-            dfield = get_asc_data_field(&p, xres, yres,
-                                        pixel_size, aspect,
-                                        intensity ? 1.0 : wavelength,
+            dfield = get_asc_data_field(&p, format, xres, yres,
+                                        pixel_size, aspect, zcalib,
                                         intensity ? "" : "m",
                                         intensity ? NULL : &mfield);
             if (!dfield) {
                 g_set_error(error, GWY_MODULE_FILE_ERROR,
                             GWY_MODULE_FILE_ERROR_DATA,
                             _("Truncated data in block %s"), line);
+                GWY_OBJECT_UNREF(container);
                 goto fail;
             }
 
@@ -851,7 +889,7 @@ opd_asc_load(const gchar *filename,
         g_object_unref(meta);
     }
     else {
-        g_object_unref(container);
+        GWY_OBJECT_UNREF(container);
         err_NO_DATA(error);
     }
 
@@ -881,14 +919,15 @@ store_asc_meta(gpointer key,
 
 static GwyDataField*
 get_asc_data_field(gchar **p,
-                   guint xres, guint yres,
-                   gdouble pixel_size, gdouble aspect, gdouble wavelength,
+                   OPDArrayFormat format, guint xres, guint yres,
+                   gdouble pixel_size, gdouble aspect, gdouble zcalib,
                    const gchar *zunits,
                    GwyDataField **maskfield)
 {
     GwyDataField *dfield, *mfield;
     GwySIUnit *siunit;
     gdouble *data, *mdata;
+    const gchar *sprev;
     guint mcount, i, j;
     gchar *s;
 
@@ -912,27 +951,60 @@ get_asc_data_field(gchar **p,
     data = gwy_data_field_get_data(dfield);
     mdata = gwy_data_field_get_data(mfield);
 
-    for (j = 0; j < xres; j++) {
-        if (!(s = gwy_str_next_line(p)))
-            goto fail;
+    if (format == OPD_XYZ_PIXEL || format == OPD_XYZ_REAL) {
+        gwy_debug("assuming XYZ format");
+        for (j = 0; j < xres; j++) {
+            for (i = yres; i; i--) {
+                if (!(s = gwy_str_next_line(p)))
+                    goto fail;
+
+                /* Y and X, we just ignore them */
+                if (!(s = strchr(s, '\t')))
+                    goto fail;
+                s++;
+                if (!(s = strchr(s, '\t')))
+                    goto fail;
+                s++;
 
-        for (i = yres; i; i--) {
-            const gchar *sprev = s;
+                sprev = s;
+                if (strncmp(s, "Bad", 3) == 0) {
+                    mdata[(i - 1)*xres + j] = 0.0;
+                    s += 3;
+                }
+                else
+                    data[(i - 1)*xres + j] = g_ascii_strtod(s, &s)*zcalib;
 
-            if (strncmp(s, "Bad", 3) == 0) {
-                mdata[(i - 1)*xres + j] = 0.0;
-                s += 3;
+                if (s == sprev)
+                    goto fail;
             }
-            else
-                data[(i - 1)*xres + j] = g_ascii_strtod(s, &s)*wavelength;
+        }
+    }
+    else if (format == OPD_STANDARD_IMAGE) {
+        gwy_debug("assuming data matrix format");
+        for (j = 0; j < xres; j++) {
+            if (!(s = gwy_str_next_line(p)))
+                goto fail;
 
-            while (g_ascii_isspace(*s))
-                s++;
+            for (i = yres; i; i--) {
+                sprev = s;
+                if (strncmp(s, "Bad", 3) == 0) {
+                    mdata[(i - 1)*xres + j] = 0.0;
+                    s += 3;
+                }
+                else
+                    data[(i - 1)*xres + j] = g_ascii_strtod(s, &s)*zcalib;
 
-            if (s == sprev)
-                goto fail;
+                while (g_ascii_isspace(*s))
+                    s++;
+
+                if (s == sprev)
+                    goto fail;
+            }
         }
     }
+    else {
+        g_assert_not_reached();
+    }
 
     mcount = gwy_app_channel_remove_bad_data(dfield, mfield);
 
diff --git a/modules/file/pltfile.c b/modules/file/pltfile.c
index 88ddb86..1a0de19 100644
--- a/modules/file/pltfile.c
+++ b/modules/file/pltfile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: pltfile.c 17718 2015-11-06 08:04:04Z pecold $
+ *  $Id: pltfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2009 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -83,7 +83,7 @@ static GwyModuleInfo module_info = {
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, pltfile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/pnifile.c b/modules/file/pnifile.c
index 3023fce..c91b63f 100644
--- a/modules/file/pnifile.c
+++ b/modules/file/pnifile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: pnifile.c 16387 2014-07-10 10:41:50Z yeti-dn $
+ *  $Id: pnifile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -125,7 +125,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, pnifile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/princetonspe.c b/modules/file/princetonspe.c
index 439dc5b..4e15d29 100644
--- a/modules/file/princetonspe.c
+++ b/modules/file/princetonspe.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: princetonspe.c 17639 2015-10-23 07:38:32Z yeti-dn $
+ *  $Id: princetonspe.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2015 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -114,7 +114,7 @@ static GwyModuleInfo module_info = {
     "2015",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, princetonspe)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/psia.c b/modules/file/psia.c
index 79b5b5c..224348b 100644
--- a/modules/file/psia.c
+++ b/modules/file/psia.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: psia.c 18034 2016-01-08 14:02:03Z yeti-dn $
+ *  @(#) $Id: psia.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -245,7 +245,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, psia)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/pt3file.c b/modules/file/pt3file.c
index 2093179..593090a 100644
--- a/modules/file/pt3file.c
+++ b/modules/file/pt3file.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: pt3file.c 19216 2016-11-09 10:39:06Z yeti-dn $
+ *  $Id: pt3file.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2009 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -300,7 +300,7 @@ static GwyModuleInfo module_info = {
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, pt3file)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/quesant.c b/modules/file/quesant.c
index 7b57089..7c78eaf 100644
--- a/modules/file/quesant.c
+++ b/modules/file/quesant.c
@@ -72,7 +72,7 @@ static GwyModuleInfo module_info = {
     "2008",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, quesant)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/rawfile.c b/modules/file/rawfile.c
index 4234492..e3954e0 100644
--- a/modules/file/rawfile.c
+++ b/modules/file/rawfile.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: rawfile.c 17842 2015-12-14 22:02:16Z yeti-dn $
+ *  @(#) $Id: rawfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003,2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -315,7 +315,7 @@ static const gboolean xymeasureeq_default = TRUE;
 /* for read_ascii_data() error reporting */
 static GQuark error_domain = 0;
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, rawfile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/rawgraph.c b/modules/file/rawgraph.c
index 0c56b45..0e7928e 100644
--- a/modules/file/rawgraph.c
+++ b/modules/file/rawgraph.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: rawgraph.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: rawgraph.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2009 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -111,7 +111,7 @@ static GwyModuleInfo module_info = {
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, rawgraph)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/rawxyz.c b/modules/file/rawxyz.c
index 052dac5..1d7564e 100644
--- a/modules/file/rawxyz.c
+++ b/modules/file/rawxyz.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: rawxyz.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: rawxyz.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2009-2016 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -104,7 +104,7 @@ static GwyModuleInfo module_info = {
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, rawxyz)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/renishaw.c b/modules/file/renishaw.c
index 05970bd..2f5b287 100644
--- a/modules/file/renishaw.c
+++ b/modules/file/renishaw.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: renishaw.c 18238 2016-01-27 21:14:14Z yeti-dn $
+ *  $Id: renishaw.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014 Daniil Bratashov (dn2010), David Necas (Yeti)..
  *  Data structures and constants are copyright (c) 2011 Renishaw plc.
  *
@@ -372,7 +372,7 @@ static GwyModuleInfo module_info = {
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, renishaw)
 
 static gboolean
 module_register(void)
@@ -715,6 +715,9 @@ wdf_load(const gchar *filename,
         gwy_graph_curve_model_set_data(gcmodel, xdata, ydata, zres);
         g_free(xdata);
         g_free(ydata);
+        if (!gwy_graph_curve_model_is_ordered(gcmodel)) {
+            gwy_graph_curve_model_enforce_order(gcmodel);
+        }
         gwy_graph_model_add_curve(gmodel, gcmodel);
         g_object_unref(gcmodel);
         g_free(title);
@@ -764,6 +767,9 @@ wdf_load(const gchar *filename,
             g_free(title);
             gwy_graph_curve_model_set_data(gcmodel, xdata, ydata, zres);
             g_free(ydata);
+            if (!gwy_graph_curve_model_is_ordered(gcmodel)) {
+                gwy_graph_curve_model_enforce_order(gcmodel);
+            }
             gwy_graph_model_add_curve(gmodel, gcmodel);
             g_object_unref(gcmodel);
         }
@@ -1235,6 +1241,9 @@ wdf_load(const gchar *filename,
                                        NULL);
                 gwy_graph_curve_model_set_data(gcmodel,
                                                xdata, ydata, zres);
+                if (!gwy_graph_curve_model_is_ordered(gcmodel)) {
+                    gwy_graph_curve_model_enforce_order(gcmodel);
+                }                                               
                 gwy_graph_model_add_curve(gmodel, gcmodel);
                 g_object_unref(gcmodel);
                 g_free(title);
diff --git a/modules/file/rhk-sm3.c b/modules/file/rhk-sm3.c
index 1e6b8e4..e6aee64 100644
--- a/modules/file/rhk-sm3.c
+++ b/modules/file/rhk-sm3.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: rhk-sm3.c 17795 2015-11-30 13:56:39Z yeti-dn $
+ *  $Id: rhk-sm3.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2005,2008 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -247,7 +247,7 @@ static const GwyEnum scan_directions[] = {
     { "Down",  RHK_SCAN_DOWN,  },
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, rhk_sm3)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/rhk-spm32.c b/modules/file/rhk-spm32.c
index 07ddd1e..d3584c3 100644
--- a/modules/file/rhk-spm32.c
+++ b/modules/file/rhk-spm32.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: rhk-spm32.c 19216 2016-11-09 10:39:06Z yeti-dn $
+ *  $Id: rhk-spm32.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -187,7 +187,7 @@ static const GwyEnum scan_directions[] = {
     { "Down",  RHK_SCAN_DOWN,  },
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, rhk_spm32)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/robotics.c b/modules/file/robotics.c
index e5a316c..3d10012 100644
--- a/modules/file/robotics.c
+++ b/modules/file/robotics.c
@@ -85,7 +85,7 @@ static GwyModuleInfo module_info = {
     "2011",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, robotics)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/s94file.c b/modules/file/s94file.c
index c2ca1a2..e8b7db4 100644
--- a/modules/file/s94file.c
+++ b/modules/file/s94file.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: s94file.c 17718 2015-11-06 08:04:04Z pecold $
+ *  @(#) $Id: s94file.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2013 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -100,7 +100,7 @@ static GwyModuleInfo module_info = {
     "2013",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, s94file)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/sdfile.c b/modules/file/sdfile.c
index 486c3c9..11d8727 100644
--- a/modules/file/sdfile.c
+++ b/modules/file/sdfile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: sdfile.c 17718 2015-11-06 08:04:04Z pecold $
+ *  $Id: sdfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -161,7 +161,7 @@ static GwyModuleInfo module_info = {
 
 static const guint type_sizes[] = { 1, 2, 4, 4, 1, 2, 4, 8 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, sdfile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/seiko.c b/modules/file/seiko.c
index 97863b5..ac3cb6f 100644
--- a/modules/file/seiko.c
+++ b/modules/file/seiko.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: seiko.c 18613 2016-04-19 19:35:15Z yeti-dn $
+ *  $Id: seiko.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2006 David Necas (Yeti), Markus Pristovsek.
  *  E-mail: yeti at gwyddion.net, prissi at gift.physik.tu-berlin.de.
  *
@@ -117,12 +117,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Imports Seiko XQB, XQD, XQT and XQP files."),
     "Yeti <yeti at gwyddion.net>",
-    "0.12",
+    "0.13",
     "David Nečas (Yeti) & Markus Pristovsek",
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, seiko)
 
 static gboolean
 module_register(void)
@@ -183,6 +183,7 @@ seiko_load(const gchar *filename,
     GwyDataField *dfield = NULL;
     SeikoDataType datatype = SEIKO_TOPOGRAPHY;
     gchar *comment;
+    const gchar *extension;
 
     if (!gwy_file_get_contents(filename, &buffer, &size, &err)) {
         err_GET_FILE_CONTENTS(error, &err);
@@ -206,12 +207,12 @@ seiko_load(const gchar *filename,
 
     /* FIXME: I was not able to reverse-engineer what identifies the type.
      * May need a large set of files.  */
-    if (g_str_has_suffix(filename, ".xqp")
-        || g_str_has_suffix(filename, ".XQP"))
-        datatype = SEIKO_PHASE;
-    else if (g_str_has_suffix(filename, ".xqi")
-        || g_str_has_suffix(filename, ".XQI"))
-        datatype = SEIKO_CURRENT;
+    if ((extension = strrchr(filename, '.'))) {
+       if (gwy_stramong(extension+1, "xqp", "XQP", "xqpx", "XQPX", NULL))
+           datatype = SEIKO_PHASE;
+       else if (gwy_stramong(extension+1, "xqi", "XQI", "xqix", "XQIX", NULL))
+           datatype = SEIKO_CURRENT;
+    }
 
     dfield = read_data_field(buffer, size, datatype, error);
     if (!dfield) {
@@ -258,7 +259,7 @@ read_data_field(const guchar *buffer,
     };
     gint xres, yres;
     G_GNUC_UNUSED guint version;
-    guint endfile, datastart;
+    guint endfile, datastart, imgsize;
     gdouble xreal, yreal, q, z0;
     GwyDataField *dfield;
     GwySIUnit *siunit;
@@ -284,9 +285,18 @@ read_data_field(const guchar *buffer,
     if (err_DIMENSION(error, xres) || err_DIMENSION(error, yres))
         return NULL;
 
-    if (err_SIZE_MISMATCH(error, xres*yres*sizeof(gint16), endfile - datastart,
-                          TRUE))
-        return NULL;
+    imgsize = xres*yres*sizeof(guint16);
+    if (err_SIZE_MISMATCH(error, imgsize, endfile - datastart, TRUE)) {
+        /* The XQ?X files can have multiple images.  And each also comes with
+         * an extra headers.  We at least try to import the first one. */
+        guint nimages = (endfile - datastart)/imgsize;
+
+        gwy_debug("nimages: %u", nimages);
+        if (endfile - datastart == nimages*imgsize + (nimages-1)*HEADER_SIZE)
+            g_clear_error(error);
+        else
+            return NULL;
+    }
 
     p = buffer + XSCALE_OFFSET;
     xreal = gwy_get_gdouble_le(&p) * Nanometer;
diff --git a/modules/file/sensofar.c b/modules/file/sensofar.c
index 792d8a8..56902db 100644
--- a/modules/file/sensofar.c
+++ b/modules/file/sensofar.c
@@ -205,7 +205,7 @@ static GwyModuleInfo module_info = {
     "2008",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, sensofar)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/sensolytics.c b/modules/file/sensolytics.c
index d4c8ced..fb2bd89 100644
--- a/modules/file/sensolytics.c
+++ b/modules/file/sensolytics.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: sensolytics.c 17718 2015-11-06 08:04:04Z pecold $
+ *  $Id: sensolytics.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2009 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -115,7 +115,7 @@ static GwyModuleInfo module_info = {
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, sensolytics)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/shimadzu.c b/modules/file/shimadzu.c
index 39d5e7f..9a8fbc7 100644
--- a/modules/file/shimadzu.c
+++ b/modules/file/shimadzu.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: shimadzu.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: shimadzu.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2007 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -137,7 +137,7 @@ static GwyModuleInfo module_info = {
     "2007",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, shimadzu)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/sicmfile.c b/modules/file/sicmfile.c
index 26d4495..009e6db 100644
--- a/modules/file/sicmfile.c
+++ b/modules/file/sicmfile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: sicmfile.c 16387 2014-07-10 10:41:50Z yeti-dn $
+ *  $Id: sicmfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  IonScope SICM file format importer
  *  Copyright (C) 2008-2010 Matthew Caldwell.
  *  E-mail: m.caldwell at ucl.ac.uk
@@ -198,7 +198,7 @@ static GwyModuleInfo module_info =
     "Matthew Caldwell",
     "2007-2010",
 };
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, sicmfile)
 
 /*--------------------------------------------------------------------------*/
 
diff --git a/modules/file/sis.c b/modules/file/sis.c
index fe77a08..ed389b5 100644
--- a/modules/file/sis.c
+++ b/modules/file/sis.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: sis.c 19216 2016-11-09 10:39:06Z yeti-dn $
+ *  @(#) $Id: sis.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -468,7 +468,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, sis)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/spip-asc.c b/modules/file/spip-asc.c
index 03ce2a8..1cf0ef4 100644
--- a/modules/file/spip-asc.c
+++ b/modules/file/spip-asc.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: spip-asc.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: spip-asc.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2009 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -95,7 +95,7 @@ static GwyModuleInfo module_info = {
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, spip_asc)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/spmlab.c b/modules/file/spmlab.c
index cf71dc4..9aa5199 100644
--- a/modules/file/spmlab.c
+++ b/modules/file/spmlab.c
@@ -1,6 +1,6 @@
 /*
- *  $Id: spmlab.c 17550 2015-10-12 22:28:25Z yeti-dn $
- *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
+ *  $Id: spmlab.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2004-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  Roughly based on code in Kasgira by MV <kasigra at seznam.cz>.
@@ -108,34 +108,78 @@
 #include <libprocess/datafield.h>
 #include <libgwymodule/gwymodule-file.h>
 #include <app/gwymoduleutils-file.h>
+#include <app/data-browser.h>
 
 #include "err.h"
 
-static gboolean      module_register(void);
-static gint          spmlab_detect  (const GwyFileDetectInfo *fileinfo,
-                                     gboolean only_name);
-static GwyContainer* spmlab_load    (const gchar *filename,
-                                     GwyRunType mode,
-                                     GError **error);
-static GwyDataField* read_data_field(const guchar *buffer,
-                                     guint size,
-                                     guchar version,
-                                     gchar **title,
-                                     gint *direction,
-                                     GError **error);
-static gchar*        type_to_title  (guint type);
+typedef struct {
+    guint dataoffset;
+    guint xres;
+    guint yres;
+    guint nlayers;
+    gint datatype;
+    gchar version;
+    gint direction;
+    gint datamode;
+    gint probetype;
+    gint stagetype;
+    gdouble xoff;
+    gdouble yoff;
+    gdouble xreal;
+    gdouble yreal;
+    gdouble q;
+    gdouble z0;
+    gdouble qrate;
+    gdouble layers_from;
+    gdouble layers_to;
+    GwySIUnit *unitxy;
+    GwySIUnit *unitz;
+    GwySIUnit *unitrate;
+    gchar *datatype_str;
+    gchar *probetype_str;
+    gchar *datamode_str;
+    gchar *model_str;
+    gchar *release;
+    gchar *datetime;
+    gchar *description;
+    gchar *scantype;
+} SPMLabFile;
+
+static gboolean      module_register    (void);
+static gint          spmlab_detect      (const GwyFileDetectInfo *fileinfo,
+                                         gboolean only_name);
+static GwyContainer* spmlab_load        (const gchar *filename,
+                                         GwyRunType mode,
+                                         GError **error);
+static gboolean      spmlab_read_header (SPMLabFile *slfile,
+                                         const guchar *buffer,
+                                         guint size,
+                                         GError **error);
+static void          read_data_field    (SPMLabFile *slfile,
+                                         const guchar *buffer,
+                                         GwyContainer *container,
+                                         guint i);
+static void          add_meta           (SPMLabFile *slfile,
+                                         GwyContainer *container,
+                                         guint i);
+static void          spmlab_file_free   (SPMLabFile *slfile);
+static const gchar*  datatype_to_string (gint type);
+static const gchar*  datamode_to_string (gint mode);
+static const gchar*  stagetype_to_string(gint type);
+static const gchar*  probetype_to_string(gint type);
+static const gchar*  direction_to_string(gint type);
 
 static GwyModuleInfo module_info = {
     GWY_MODULE_ABI_VERSION,
     &module_register,
     N_("Imports Thermicroscopes SpmLab R3 to R7 data files."),
     "Yeti <yeti at gwyddion.net>",
-    "0.11",
+    "0.12",
     "David Nečas (Yeti) & Petr Klapetek",
     "2005",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, spmlab)
 
 static gboolean
 module_register(void)
@@ -195,60 +239,60 @@ spmlab_load(const gchar *filename,
 {
     GwyContainer *container = NULL;
     guchar *buffer = NULL;
-    gsize size = 0;
+    gsize size = 0, datablocksize;
     GError *err = NULL;
-    GwyDataField *dfield = NULL;
-    gchar *title = NULL;
-    gint dir;
+    SPMLabFile slfile;
+    guint i;
 
     if (!gwy_file_get_contents(filename, &buffer, &size, &err)) {
         err_GET_FILE_CONTENTS(error, &err);
         return NULL;
     }
-    /* 2048 is wrong. moreover it differs for r5 and r4, kasigra uses 5752 for
-     * r5 */
-    if (size < 2048) {
-        err_TOO_SHORT(error);
-        gwy_file_abandon_contents(buffer, size, NULL);
-        return NULL;
-    }
+    gwy_clear(&slfile, 1);
     if (buffer[0] != '#' || buffer[1] != 'R') {
         err_FILE_TYPE(error, "Thermicroscopes SpmLab");
-        gwy_file_abandon_contents(buffer, size, NULL);
-        return NULL;
+        goto fail;
     }
-    switch (buffer[2]) {
-        case '3':
-        case '4':
-        case '5':
-        case '6':
-        case '7':
-        dfield = read_data_field(buffer, size, buffer[2], &title, &dir, error);
-        break;
-
-        default:
+    slfile.version = buffer[2];
+    if (slfile.version < '3' || slfile.version > '7') {
         g_set_error(error, GWY_MODULE_FILE_ERROR, GWY_MODULE_FILE_ERROR_DATA,
                     _("Unknown format version %c."), buffer[2]);
-        break;
+        goto fail;
+    }
+    /* 2048 is wrong; moreover, it differs for r5 and r4, kasigra uses 5752 for
+     * r5.  But we essentially need a value larger than the last thing we read
+     * from the header. */
+    if (size < 2048 || (slfile.version == 7 && size < 3216)) {
+        err_TOO_SHORT(error);
+        goto fail;
     }
 
-    gwy_file_abandon_contents(buffer, size, NULL);
-    if (!dfield)
-        return NULL;
-
-    container = gwy_container_new();
-    gwy_container_set_object_by_name(container, "/0/data", dfield);
-    g_object_unref(dfield);
-
-    if (title)
-        gwy_container_set_string_by_name(container, "/0/data/title", title);
-    else
-        gwy_app_channel_title_fall_back(container, 0);
+    if (!spmlab_read_header(&slfile, buffer, size, error))
+        goto fail;
 
+    if (!slfile.nlayers) {
+        g_warning("Zero nlayers.");
+        slfile.nlayers = 1;
+    }
+    datablocksize = slfile.xres*slfile.yres*sizeof(guint16);
+    /* err_SIZE_MISMATCH() gets hairy with multiple channels and integer
+     * overflow possibility... */
+    if (slfile.dataoffset >= size
+        || (size - slfile.dataoffset)/datablocksize < slfile.nlayers) {
+        g_set_error(error, GWY_MODULE_FILE_ERROR, GWY_MODULE_FILE_ERROR_DATA,
+                    _("Data block is truncated."));
+        goto fail;
+    }
 
-    gwy_file_channel_import_log_add(container, 0, NULL, filename);
-    /* TODO: Store direction to metadata, if known */
+    container = gwy_container_new();
+    for (i = 0; i < slfile.nlayers; i++) {
+        read_data_field(&slfile, buffer, container, i);
+        gwy_file_channel_import_log_add(container, i, NULL, filename);
+    }
 
+fail:
+    spmlab_file_free(&slfile);
+    gwy_file_abandon_contents(buffer, size, NULL);
     return container;
 }
 
@@ -258,48 +302,64 @@ get_gfloat_le_as_double(const guchar **p)
     return gwy_get_gfloat_le(p);
 }
 
-static GwyDataField*
-read_data_field(const guchar *buffer,
-                guint size,
-                guchar version,
-                gchar **title,
-                gint *direction,
-                GError **error)
+static gboolean
+spmlab_read_header(SPMLabFile *slfile,
+                   const guchar *buffer, guint size, GError **error)
 {
-    enum { MIN_REMAINDER = 2620 };
-    /* information offsets in different versions, in r5+ relative to data
-     * start, in order:
-     * data offset,
-     * pixel dimensions,
-     * physical dimensions,
-     * value multiplier,
-     * unit string,
-     * data type,       (if zero, use channel title)
-     * channel title    (if zero, use data type)
-     */
-    const guint offsets34[] = {
-        0x0104, 0x0196, 0x01a2, 0x01b2, 0x01c2, 0x0400, 0x0000
+    enum {
+        UNIT_LEN = 10,
+        RELEASE_LEN = 16,
+        DATETIME_LEN = 20,
+        DESCRIPTION_LEN = 40,
+        STRING_LEN = 64,
+        TITLE_LEN = 256,
+        SCANTYPE_LEN = 6,
+        MIN_REMAINDER = 2620,
     };
-    const guint offsets56[] = {
-        0x0104, 0x025c, 0x0268, 0x0288, 0x02a0, 0x0708, 0x0000
+    /* Different version have the same information at different offsets.
+     * Use an indirect indexing to find things... */
+    enum {
+        DATASTART_IDX = 0,
+        PIXDIM_IDX    = 1,
+        PHYSDIM_IDX   = 2,
+        SCALING_IDX   = 3,
+        UNITSTR_IDX   = 4,
+        DATATYPE_IDX  = 5,   /* if offset is zero use channel title */
+        STRINGS_IDX   = 6,   /* if offset is zero use data type */
+        NLAYERS_IDX   = 7,
+        SCANTYPE_IDX  = 8,
+        LAYERPOS_IDX  = 9,
+        NOFFSETS
     };
-    const guint offsets7[] = {
-        0x0104, 0x029c, 0x02a8, 0x02c8, 0x02e0, 0x0000, 0x0b90
+    /* Information offsets in the various versions, in r5+ relative to data
+     * start. */
+    const guint offsets34[NOFFSETS] = {
+        0x0104, 0x0196, 0x01a2, 0x01b2, 0x01c2, 0x0400, 0x0000, 0x01e0, 0x0458,
+        0x0000,
     };
-    gint xres, yres, doffset, i, power10, type;
-    gdouble xreal, yreal, q, z0;
-    GwyDataField *dfield;
-    GwySIUnit *unitxy, *unitz;
-    gdouble *data;
-    const guint *offset;
+    const guint offsets56[NOFFSETS] = {
+        0x0104, 0x025c, 0x0268, 0x0288, 0x02a0, 0x0708, 0x0000, 0x02be, 0x0798,
+        0x08c0,
+    };
+    const guint offsets7[NOFFSETS] = {
+        0x0104, 0x029c, 0x02a8, 0x02c8, 0x02e0, 0x0000, 0x0a58, 0x02fe, 0x0000,
+        0x0000,
+    };
+    gint power10;
+    const guint *offsets;
     const guchar *p, *r, *last;
+    gchar *s;
+    gchar version = slfile->version;
     /* get floats in single precision from r4 but double from r5+ */
     gdouble (*getflt)(const guchar**);
 
-    *title = NULL;
-    *direction = -1;
+    slfile->datatype = -1;
+    slfile->direction = -1;
+    slfile->datamode = -1;
+    slfile->probetype = -1;
+    slfile->stagetype = -1;
 
-    if (version == '5' || version == '6' || version == '7') {
+    if (version >= '5' && version <= '7') {
         /* There are more headers in r5,
          * try to find something that looks like #R5. */
         last = r = buffer;
@@ -312,112 +372,333 @@ read_data_field(const guchar *buffer,
             else
                 r = p + 1;
         }
-        offset = (version == '7') ? &offsets7[0] : &offsets56[0];
+        offsets = (version == '7' ? offsets7 : offsets56);
+        /* Everything is relative to data start in r5+. */
+        slfile->dataoffset += last - buffer;
         buffer = last;
         getflt = &gwy_get_gdouble_le;
     }
     else {
-        offset = &offsets34[0];
+        offsets = offsets34;
         getflt = &get_gfloat_le_as_double;
     }
 
-    p = buffer + *(offset++);
-    doffset = gwy_get_guint32_le(&p);  /* this appears to be the same number
-                                          as in the ASCII miniheader -- so get
-                                          it here since it's easier */
-    gwy_debug("data offset = %u", doffset);
-    p = buffer + *(offset++);
-    xres = gwy_get_guint32_le(&p);
-    yres = gwy_get_guint32_le(&p);
-    if (err_DIMENSION(error, xres) || err_DIMENSION(error, yres))
-        return NULL;
-    p = buffer + *(offset++);
-    xreal = -getflt(&p);
-    xreal += getflt(&p);
-    yreal = -getflt(&p);
-    yreal += getflt(&p);
-    if (!((xreal = fabs(xreal)) > 0)) {
+    /* This appears to be the same number as in the ASCII miniheader -- so get
+     * it here since it's easier */
+    p = buffer + offsets[DATASTART_IDX];
+    slfile->dataoffset += gwy_get_guint32_le(&p);
+    gwy_debug("data offset = %u", slfile->dataoffset);
+
+    /* The release string includes also header size of it needs to be cleaned
+     * up for metadata. */
+    slfile->release = g_strndup(p, RELEASE_LEN);
+    p += RELEASE_LEN;
+    slfile->datetime = g_strndup(p, DATETIME_LEN);
+    p += DATETIME_LEN;
+    slfile->description = g_strndup(p, DESCRIPTION_LEN);
+    p += DESCRIPTION_LEN;
+
+    gwy_debug("release %s", slfile->release);
+    gwy_debug("datetime %s", slfile->datetime);
+
+    p = buffer + offsets[NLAYERS_IDX];
+    slfile->nlayers = gwy_get_guint16_le(&p);
+    gwy_debug("nlayers %u", slfile->nlayers);
+
+    p = buffer + offsets[PIXDIM_IDX];
+    slfile->xres = gwy_get_guint32_le(&p);
+    slfile->yres = gwy_get_guint32_le(&p);
+    if (err_DIMENSION(error, slfile->xres)
+        || err_DIMENSION(error, slfile->yres))
+        return FALSE;
+
+    p = buffer + offsets[PHYSDIM_IDX];
+    slfile->xoff = -getflt(&p);
+    slfile->xreal = getflt(&p) - slfile->xoff;
+    if (!((slfile->xreal = fabs(slfile->xreal)) > 0)) {
         g_warning("Real x size is 0.0, fixing to 1.0");
-        xreal = 1.0;
+        slfile->xreal = 1.0;
     }
-    if (!((yreal = fabs(yreal)) > 0)) {
+    slfile->yoff = -getflt(&p);
+    slfile->yreal = getflt(&p) - slfile->yoff;
+    if (!((slfile->yreal = fabs(slfile->yreal)) > 0)) {
         g_warning("Real y size is 0.0, fixing to 1.0");
-        yreal = 1.0;
+        slfile->yreal = 1.0;
     }
-    p = buffer + *(offset++);
-    q = getflt(&p);
-    z0 = getflt(&p);
+
+    p = buffer + offsets[SCALING_IDX];
+    slfile->q = getflt(&p);
+    slfile->z0 = getflt(&p);
     gwy_debug("xreal.raw = %g, yreal.raw = %g, q.raw = %g, z0.raw = %g",
-              xreal, yreal, q, z0);
-    p = buffer + *(offset++);
-    unitz = gwy_si_unit_new_parse(p, &power10);
-    q *= pow10(power10);
-    z0 *= pow10(power10);
-    unitxy = gwy_si_unit_new_parse(p + 10, &power10);
-    xreal *= pow10(power10);
-    yreal *= pow10(power10);
+              slfile->xreal, slfile->yreal, slfile->q, slfile->z0);
+
+    p = buffer + offsets[UNITSTR_IDX];
+    s = g_strndup(p, UNIT_LEN);
+    slfile->unitz = gwy_si_unit_new_parse(s, &power10);
+    g_free(s);
+    slfile->q *= pow10(power10);
+    slfile->z0 *= pow10(power10);
+
+    p += UNIT_LEN;
+    s = g_strndup(p, UNIT_LEN);
+    slfile->unitxy = gwy_si_unit_new_parse(s, &power10);
+    g_free(s);
+    slfile->xreal *= pow10(power10);
+    slfile->yreal *= pow10(power10);
+    slfile->xoff *= pow10(power10);
+    slfile->yoff *= pow10(power10);
     gwy_debug("xres = %d, yres = %d, xreal = %g, yreal = %g, q = %g, z0 = %g",
-              xres, yres, xreal, yreal, q, z0);
-    gwy_debug("unitxy = %s, unitz = %s", p, p + 10);
-
-    if (offset[1]) {
-        /* We know channel title */
-        offset++;
-        p = buffer + *(offset++);
-        *title = g_strndup(p, size - (p - buffer));
-        gwy_debug("title = <%s>", *title);
+              slfile->xres, slfile->yres, slfile->xreal, slfile->yreal,
+              slfile->q, slfile->z0);
+
+    p += UNIT_LEN;
+    s = g_strndup(p, UNIT_LEN);
+    slfile->unitrate = gwy_si_unit_new_parse(s, &power10);
+    g_free(s);
+    slfile->qrate = pow10(power10);
+
+    /* Optional stuff, i.e. this that either exists only in some version or
+     * we only know how to read in certain versions. */
+    if (offsets[STRINGS_IDX]) {
+        p = buffer + offsets[STRINGS_IDX];
+        slfile->probetype_str = g_strndup(p, size - (p - buffer));
+        p += STRING_LEN;
+        slfile->model_str = g_strndup(p, size - (p - buffer));
+        p += STRING_LEN;
+        p += 184;   /* No idea why.  Perhaps there can be something between. */
+        slfile->datatype_str = g_strndup(p, size - (p - buffer));
+        p += TITLE_LEN;
+        slfile->datamode_str = g_strndup(p, size - (p - buffer));
+        gwy_debug("title = <%s>", slfile->datatype_str);
     }
-    else {
-        /* We know data type */
-        p = buffer + *(offset++);
-        type = gwy_get_guint16_le(&p);
-        *direction = gwy_get_guint16_le(&p);
-        gwy_debug("type = %d, dir = %d", type, *direction);
-        offset++;
-        *title = type_to_title(type);
+    if (offsets[DATATYPE_IDX]) {
+        p = buffer + offsets[DATATYPE_IDX];
+        slfile->datatype = gwy_get_gint16_le(&p);
+        slfile->direction = gwy_get_gint16_le(&p);
+        slfile->datamode = gwy_get_gint16_le(&p);
+        gwy_debug("type = %d, dir = %d", slfile->datatype, slfile->direction);
+    }
+    if (offsets[SCANTYPE_IDX]) {
+        p = buffer + offsets[SCANTYPE_IDX];
+        slfile->scantype = g_strndup(p, SCANTYPE_LEN);
+        p += SCANTYPE_LEN;
+        slfile->probetype = gwy_get_gint16_le(&p);
+        slfile->stagetype = gwy_get_gint16_le(&p);
+    }
+    if (offsets[LAYERPOS_IDX]) {
+        p = buffer + offsets[LAYERPOS_IDX];
+        slfile->layers_from = getflt(&p);
+        slfile->layers_to = getflt(&p);
     }
 
-    p = buffer + doffset;
-    if (err_SIZE_MISMATCH(error, 2*xres*yres, size - (p - buffer), FALSE))
-        return NULL;
+    if (!slfile->datatype_str)
+        slfile->datatype_str = g_strdup(datatype_to_string(slfile->datatype));
+
+    return TRUE;
+}
+
+static void
+read_data_field(SPMLabFile *slfile, const guchar *buffer,
+                GwyContainer *container, guint i)
+{
+    const guchar *p = buffer + slfile->dataoffset;
+    guint xres = slfile->xres, yres = slfile->yres, nlayers = slfile->nlayers;
+    gsize datablocksize;
+    GwyDataField *dfield;
+    GQuark key;
+
+    datablocksize = slfile->xres*slfile->yres*sizeof(guint16);
+    dfield = gwy_data_field_new(xres, yres, slfile->xreal, slfile->yreal,
+                                FALSE);
+    gwy_serializable_clone(G_OBJECT(slfile->unitxy),
+                           G_OBJECT(gwy_data_field_get_si_unit_xy(dfield)));
+    gwy_serializable_clone(G_OBJECT(slfile->unitz),
+                           G_OBJECT(gwy_data_field_get_si_unit_z(dfield)));
+    gwy_convert_raw_data(p + i*datablocksize, xres*yres, 1,
+                         GWY_RAW_DATA_UINT16, GWY_BYTE_ORDER_LITTLE_ENDIAN,
+                         gwy_data_field_get_data(dfield),
+                         slfile->q, slfile->z0);
+
+    key = gwy_app_get_data_key_for_id(i);
+    gwy_container_set_object(container, key, dfield);
+    g_object_unref(dfield);
+
+    if (slfile->datatype_str) {
+        key = gwy_app_get_data_title_key_for_id(i);
+        if (nlayers < 2) {
+            gwy_container_set_const_string(container, key,
+                                           slfile->datatype_str);
+        }
+        else {
+            gdouble from = slfile->layers_from, to = slfile->layers_to, z;
+            gchar *title;
+
+            if (from || to) {
+                z = (i*(to - from)/(nlayers - 1.0) + from);
+                title = g_strdup_printf("%s (%g nm)", slfile->datatype_str, z);
+            }
+            else
+                title = g_strdup_printf("%s %u", slfile->datatype_str, i+1);
+            gwy_container_set_string(container, key, (const guchar*)title);
+        }
+    }
+    else
+        gwy_app_channel_title_fall_back(container, i);
 
-    dfield = gwy_data_field_new(xres, yres, xreal, yreal, FALSE);
-    gwy_data_field_set_si_unit_xy(dfield, unitxy);
-    g_object_unref(unitxy);
-    gwy_data_field_set_si_unit_z(dfield, unitz);
-    g_object_unref(unitz);
-    data = gwy_data_field_get_data(dfield);
-    for (i = 0; i < xres*yres; i++)
-        data[i] = (p[2*i] + 256.0*p[2*i + 1])*q + z0;
+    add_meta(slfile, container, i);
+}
+
+static void
+add_meta(SPMLabFile *slfile, GwyContainer *container, guint i)
+{
+    GwyContainer *meta = gwy_container_new();
+    const gchar *s;
+    GQuark key;
+
+    if ((s = slfile->datetime) && *s)
+        gwy_container_set_const_string_by_name(meta, "Date and time", s);
+    if ((s = slfile->description) && *s)
+        gwy_container_set_const_string_by_name(meta, "Description", s);
+    if ((s = slfile->scantype) && *s)
+        gwy_container_set_const_string_by_name(meta, "Scan type", s);
+    if ((s = slfile->model_str) && *s)
+        gwy_container_set_const_string_by_name(meta, "Scan type", s);
+
+    if (slfile->release && (s = strrchr(slfile->release, '#'))) {
+        gwy_container_set_string_by_name(meta, "Version",
+                                         g_strndup(slfile->release,
+                                                   s+1 - slfile->release));
+    }
+
+    if (((s = slfile->datatype_str) && *s)
+        || (s = datatype_to_string(slfile->datatype)))
+        gwy_container_set_const_string_by_name(meta, "Data type", s);
 
-    return dfield;
+    if (((s = slfile->datamode_str) && *s)
+        || (s = datamode_to_string(slfile->datamode)))
+        gwy_container_set_const_string_by_name(meta, "Data mode", s);
+
+    if (((s = slfile->probetype_str) && *s)
+        || (s = probetype_to_string(slfile->probetype)))
+        gwy_container_set_const_string_by_name(meta, "Probe type", s);
+
+    if ((s = stagetype_to_string(slfile->stagetype)))
+        gwy_container_set_const_string_by_name(meta, "Stage type", s);
+    if ((s = direction_to_string(slfile->direction)))
+        gwy_container_set_const_string_by_name(meta, "Direction", s);
+
+    if (gwy_container_get_n_items(meta)) {
+        key = gwy_app_get_data_meta_key_for_id(i);
+        gwy_container_set_object(container, key, meta);
+    }
+    g_object_unref(meta);
 }
 
-static gchar*
-type_to_title(guint type)
+static void
+spmlab_file_free(SPMLabFile *slfile)
 {
-    const gchar *title;
-
-    title = gwy_enuml_to_string(type,
-                                "Height", 0,
-                                "Current", 1,
-                                "FFM", 2,
-                                "Spect", 3,
-                                "SpectV", 4,
-                                "ADC1", 5,
-                                "ADC2", 6,
-                                "TipV", 7,
-                                "DAC1", 8,
-                                "DAC2", 9,
-                                "ZPiezo", 10,
-                                "Height error", 11,
-                                "Linearized Z", 12,
-                                "Feedback", 13,
-                                NULL);
-    if (*title)
-        return g_strdup(title);
-
-    return NULL;
+    GWY_OBJECT_UNREF(slfile->unitxy);
+    GWY_OBJECT_UNREF(slfile->unitz);
+    GWY_OBJECT_UNREF(slfile->unitrate);
+    g_free(slfile->release);
+    g_free(slfile->datetime);
+    g_free(slfile->description);
+    g_free(slfile->datatype_str);
+    g_free(slfile->probetype_str);
+    g_free(slfile->datamode_str);
+    g_free(slfile->model_str);
+}
+
+static const gchar*
+datatype_to_string(gint type)
+{
+    const gchar *str;
+
+    str = gwy_enuml_to_string(type,
+                              "Height", 0,
+                              "Current", 1,
+                              "FFM", 2,
+                              "Spect", 3,
+                              "SpectV", 4,
+                              "ADC1", 5,
+                              "ADC2", 6,
+                              "TipV", 7,
+                              "DAC1", 8,
+                              "DAC2", 9,
+                              "ZPiezo", 10,
+                              "Height error", 11,
+                              "Linearized Z", 12,
+                              "Feedback", 13,
+                              NULL);
+    return *str ? str : NULL;
+}
+
+static const gchar*
+datamode_to_string(gint mode)
+{
+    const gchar *str;
+
+    str = gwy_enuml_to_string(mode,
+                              "Image", 0,
+                              "Cits", 1,
+                              "Dits", 2,
+                              "FIS", 3,
+                              "MFM", 4,
+                              "EFM", 5,
+                              "IV", 10,
+                              "IS", 11,
+                              "FS", 12,
+                              "MS", 13,
+                              "ES", 14,
+                              "Electrochemistry", 15,
+                              "Electrochemistry_Line_Average", 16,
+                              NULL);
+    return *str ? str : NULL;
+}
+
+static const gchar*
+stagetype_to_string(gint type)
+{
+    const gchar *str;
+
+    str = gwy_enuml_to_string(type,
+                              "Discoverer_AFM", 0,
+                              "Discoverer_STM", 2,
+                              "Explorer_AFM", 3,
+                              "Explorer_STM", 4,
+                              "Universal", 5,
+                              "SNOM", 6,
+                              "Observer_AFM", 7,
+                              "Observer_STM", 8,
+                              "Topocron_AFM", 9,
+                              "Topocron_STM", 10,
+                              "Topocron", 12,
+                              NULL);
+    return *str ? str : NULL;
+}
+
+static const gchar*
+probetype_to_string(gint type)
+{
+    const gchar *str;
+
+    str = gwy_enuml_to_string(type,
+                              "AFM", 0,
+                              "STM", 1,
+                              NULL);
+    return *str ? str : NULL;
+}
+
+static const gchar*
+direction_to_string(gint type)
+{
+    const gchar *str;
+
+    str = gwy_enuml_to_string(type,
+                              "Forward", 0,
+                              "Reverse", 1,
+                              NULL);
+    return *str ? str : NULL;
 }
 
 /* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/file/spmlabf.c b/modules/file/spmlabf.c
index 4e3876e..ec0cb1b 100644
--- a/modules/file/spmlabf.c
+++ b/modules/file/spmlabf.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: spmlabf.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: spmlabf.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2008 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -83,7 +83,7 @@ static GwyModuleInfo module_info = {
     "2008",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, spmlabf)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/stmprg.c b/modules/file/stmprg.c
index efa6a32..b40c645 100644
--- a/modules/file/stmprg.c
+++ b/modules/file/stmprg.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: stmprg.c 16611 2014-09-27 15:59:35Z yeti-dn $
+ *  $Id: stmprg.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004 Rok Zitko
  *  E-mail: rok.zitko at ijs.si
  *
@@ -236,7 +236,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, stmprg)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/stpfile.c b/modules/file/stpfile.c
index c8fa165..080bb9a 100644
--- a/modules/file/stpfile.c
+++ b/modules/file/stpfile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: stpfile.c 19216 2016-11-09 10:39:06Z yeti-dn $
+ *  $Id: stpfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2005 David Necas (Yeti), Petr Klstptek.
  *  E-mail: yeti at gwyddion.net, klstptek at gwyddion.net.
  *
@@ -144,7 +144,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, stpfile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/surffile.c b/modules/file/surffile.c
index 97813f3..67313df 100644
--- a/modules/file/surffile.c
+++ b/modules/file/surffile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: surffile.c 17719 2015-11-06 08:46:13Z pecold $
+ *  $Id: surffile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -296,7 +296,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, surffile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/tescan.c b/modules/file/tescan.c
index eab0102..ff83726 100644
--- a/modules/file/tescan.c
+++ b/modules/file/tescan.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: tescan.c 16387 2014-07-10 10:41:50Z yeti-dn $
+ *  @(#) $Id: tescan.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2013 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -98,7 +98,7 @@ static GwyModuleInfo module_info = {
     "2013",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, tescan)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/tiaser.c b/modules/file/tiaser.c
index cf6f4e1..37ad4d5 100644
--- a/modules/file/tiaser.c
+++ b/modules/file/tiaser.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: tiaser.c 17718 2015-11-06 08:04:04Z pecold $
+ *  @(#) $Id: tiaser.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2012 David Necas (Yeti), Daniil Bratashov (dn2010).
  *  E-mail: yeti at gwyddion.net, dn2010 at gmail.com.
  *
@@ -183,7 +183,7 @@ static GwyModuleInfo module_info = {
     "2012",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, tiaser)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/unisoku.c b/modules/file/unisoku.c
index 6bf90da..9760045 100644
--- a/modules/file/unisoku.c
+++ b/modules/file/unisoku.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: unisoku.c 16387 2014-07-10 10:41:50Z yeti-dn $
+ *  $Id: unisoku.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -151,7 +151,7 @@ static GwyModuleInfo module_info = {
 
 static const guint type_sizes[] = { 0, 0, 1, 1, 2, 2, 0, 0, 4 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, unisoku)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/vtkfile.c b/modules/file/vtkfile.c
index b84b22a..76120de 100644
--- a/modules/file/vtkfile.c
+++ b/modules/file/vtkfile.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: vtkfile.c 17719 2015-11-06 08:46:13Z pecold $
+ *  @(#) $Id: vtkfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2012 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -58,7 +58,7 @@ static GwyModuleInfo module_info = {
     "2012",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, vtkfile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/win_stm.c b/modules/file/win_stm.c
index 8d0c9a1..53b79f8 100644
--- a/modules/file/win_stm.c
+++ b/modules/file/win_stm.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: win_stm.c 17718 2015-11-06 08:04:04Z pecold $
+ *  @(#) $Id: win_stm.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014 Jeffrey J. Schwartz.
  *  E-mail: schwartz at physics.ucla.edu
  *
@@ -85,7 +85,7 @@ static GwyModuleInfo module_info = {
     "April 2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, win_stm)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/wipfile.c b/modules/file/wipfile.c
index 9bf81b2..a63f1b1 100644
--- a/modules/file/wipfile.c
+++ b/modules/file/wipfile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: wipfile.c 19130 2016-10-27 20:58:23Z dn2010 $
+ *  $Id: wipfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2010-2011 David Necas (Yeti), Petr Klapetek,
  *  Daniil Bratashov (dn2010)
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, dn2010 at gmail.com
@@ -77,6 +77,9 @@
 
 #define EXTENSION ".wip"
 
+#define H (4.135667662E-15)
+#define C (299792458)
+
 typedef enum {
     WIP_TAG_LIST     = 0, /* list of other tags */
     WIP_TAG_EXTENDED = 1, /* x86 FPU native type, 10 bytes */
@@ -155,6 +158,13 @@ typedef struct {
     gchar   *unitname; /* nm */
 } WIPSpectralTransform;
 
+/* TDSpectralInterpretation for spectra */
+typedef struct {
+    guint        id;
+    WIPUnitIndex unitindex;
+    gdouble      excitation_wavelength;
+} WIPSpectralInterpretation;
+
 typedef struct {
     guint id;
     gchar *unitname;
@@ -185,6 +195,7 @@ typedef struct {
 } WIPGraph;
 
 typedef struct {
+    guint version;
     guint sizex;
     guint sizey;
     guint postransformid;
@@ -217,66 +228,64 @@ typedef struct {
     GNode *node;
 } WIPIdNode;
 
-static gboolean      module_register           (void);
-static gint          wip_detect (const GwyFileDetectInfo *fileinfo,
-                                 gboolean only_name);
-static WIPTag*       wip_read_tag              (guchar **pos,
-                                                gsize *start,
-                                                gsize *end);
-static void          wip_free_tag              (WIPTag *tag);
-static GwyContainer* wip_load                  (const gchar *filename,
-                                                GwyRunType mode,
-                                                GError **error);
-static void          wip_read_all_tags         (const guchar *buffer,
-                                                gsize start, gsize end,
-                                                GNode *tagtree, gint n);
-static gboolean      wip_free_leave            (GNode *node,
-                                           G_GNUC_UNUSED gpointer data);
-static gboolean      wip_read_graph_tags       (GNode *node,
-                                                gpointer header);
-static gboolean      wip_read_sp_transform_tags(GNode *node,
-                                                gpointer transform);
-static gboolean      wip_read_space_tr_tag     (GNode *node,
-                                                gpointer transform);
-static gboolean      wip_read_axis_tags        (GNode *node,
-                                                gpointer axis);
-static gboolean      wip_read_bitmap_tags      (GNode *node,
-                                                gpointer data);
-static gboolean      wip_find_by_id            (GNode *node,
-                                                gpointer idnode);
-static gboolean      wip_read_caption          (GNode *node,
-                                                gpointer caption);
-static GwyDataField *
-                     wip_read_bmp              (const guchar *bmpdata,
-                                                gsize datasize,
-                                                gdouble xscale,
-                                                gdouble yscale,
-                                                gint power10xy);
-static gdouble       wip_pixel_to_lambda       (gint i,
-                                       WIPSpectralTransform *transform);
-static GwyGraphModel*
-                     wip_read_graph            (GNode *node);
-static GwyBrick*     wip_read_graph_image      (GNode *node);
-static void          wip_flip_xy               (GwyDataField *source,
-                                                GwyDataField *dest);
-static GwyDataField *
-                     wip_read_image            (GNode *node);
-static GwyDataField *
-                     wip_read_bitmap           (GNode *node);
-static gboolean      wip_read_data             (GNode *node,
-                                                gpointer filedata);
+static gboolean       module_register           (void);
+static gint           wip_detect                (const GwyFileDetectInfo *fileinfo,
+                                                 gboolean only_name);
+static WIPTag*        wip_read_tag              (guchar **pos,
+                                                 gsize *start,
+                                                 gsize *end);
+static void           wip_free_tag              (WIPTag *tag);
+static GwyContainer*  wip_load                  (const gchar *filename,
+                                                 GwyRunType mode,
+                                                 GError **error);
+static void           wip_read_all_tags         (const guchar *buffer,
+                                                 gsize start,
+                                                 gsize end,
+                                                 GNode *tagtree,
+                                                 gint n);
+static gboolean       wip_free_leave            (GNode *node,
+                                                 G_GNUC_UNUSED gpointer data);
+static gboolean       wip_read_graph_tags       (GNode *node,
+                                                 gpointer header);
+static gboolean       wip_read_sp_transform_tags(GNode *node,
+                                                 gpointer transform);
+static gboolean       wip_read_sp_interpr_tags  (GNode *node,
+                                                 gpointer interp);
+static gboolean       wip_read_space_tr_tag     (GNode *node,
+                                                 gpointer transform);
+static gboolean       wip_read_axis_tags        (GNode *node,
+                                                 gpointer axis);
+static gboolean       wip_read_bitmap_tags      (GNode *node,
+                                                 gpointer data);
+static gboolean       wip_find_by_id            (GNode *node,
+                                                 gpointer idnode);
+static gboolean       wip_read_caption          (GNode *node,
+                                                 gpointer caption);
+static GwyDataField*  wip_read_bmp              (const guchar *bmpdata,
+                                                 gsize datasize,
+                                                 gdouble xscale,
+                                                 gdouble yscale,
+                                                 gint power10xy);
+static gdouble        wip_pixel_to_lambda       (gint i,
+                                                 WIPSpectralTransform *transform);
+static GwyGraphModel* wip_read_graph            (GNode *node);
+static GwyBrick*      wip_read_graph_image      (GNode *node);
+static GwyDataField*  wip_read_image            (GNode *node);
+static GwyDataField*  wip_read_bitmap           (GNode *node);
+static gboolean       wip_read_data             (GNode *node,
+                                                 gpointer filedata);
 
 static GwyModuleInfo module_info = {
     GWY_MODULE_ABI_VERSION,
     &module_register,
     N_("Imports WItec Project data files."),
     "Daniil Bratashov <dn2010 at gmail.com>",
-    "0.6",
+    "0.8",
     "David Nečas (Yeti) & Petr Klapetek & Daniil Bratashov",
     "2010",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, wipfile)
 
 static gboolean
 module_register(void)
@@ -338,8 +347,9 @@ wip_read_tag(guchar **pos, gsize *start, gsize *end)
     }
     tag->data = (gpointer)p;
 
-    gwy_debug("%d %s %d %lld %lld\n",  tag->name_length,
-              tag->name, tag->type, tag->data_start, tag->data_end);
+    gwy_debug("%d %s %d %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT "\n",
+              tag->name_length, tag->name, tag->type, tag->data_start,
+              tag->data_end);
 
     *pos = (guchar *)p;
 
@@ -438,7 +448,9 @@ wip_read_image_tags(GNode *node, gpointer header)
     tag = node->data;
     imageheader = (WIPImage *)header;
     p = tag->data;
-    if (!strncmp(tag->name, "SizeX", 5))
+    if (!strncmp(tag->name, "Version", 7))
+        imageheader->version = gwy_get_gint32_le(&p);
+    else if (!strncmp(tag->name, "SizeX", 5))
         imageheader->sizex = gwy_get_gint32_le(&p);
     else if (!strncmp(tag->name, "SizeY", 5))
         imageheader->sizey = gwy_get_gint32_le(&p);
@@ -510,6 +522,25 @@ wip_read_sp_transform_tags(GNode *node,
 }
 
 static gboolean
+wip_read_sp_interpr_tags(GNode *node,
+                         gpointer interp)
+{
+    WIPTag *tag;
+    WIPSpectralInterpretation *sp_interp;
+    const guchar *p;
+
+    tag = node->data;
+    sp_interp = (WIPSpectralInterpretation *)interp;
+    p = tag->data;
+    if (!strncmp(tag->name, "UnitIndex", 9))
+        sp_interp->unitindex = gwy_get_gint32_le(&p);
+    else if (!strncmp(tag->name, "ExcitationWaveLength", 20))
+        sp_interp->excitation_wavelength = gwy_get_gdouble_le(&p);
+
+    return FALSE;
+}
+
+static gboolean
 wip_read_space_tr_tag(GNode *node, gpointer transform)
 {
     WIPTag *tag;
@@ -733,6 +764,7 @@ wip_read_graph(GNode *node)
 {
     WIPGraph *header;
     WIPSpectralTransform *xtransform;
+    WIPSpectralInterpretation *xinterp;
     WIPAxis *yaxis;
     WIPIdNode *idnode;
     GwyGraphModel *gmodel;
@@ -801,10 +833,69 @@ wip_read_graph(GNode *node)
             xdata[i] = wip_pixel_to_lambda(i, xtransform);
     }
 
+    idnode->id = header->xinterpid;
+    g_node_traverse(g_node_get_root(node),
+                    G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
+                    wip_find_by_id, (gpointer)idnode);
+
+    xinterp = g_new0(WIPSpectralInterpretation, 1);
+    g_node_traverse(idnode->node->parent->parent,
+                    G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
+                    wip_read_sp_interpr_tags,
+                    (gpointer)xinterp);
+
+    /* recalculating to right units */
     if (xtransform->unitname != NULL) {
-        siunitx = gwy_si_unit_new("m");
-        for (i = 0; i < numpoints; i++)
-            xdata[i] = xdata[i] * 1e-9;
+        if ((xinterp->unitindex == WIP_UNIT_NANOMETER)
+         || (xinterp->unitindex == WIP_UNIT_MIKROMETER)) {
+            siunitx = gwy_si_unit_new("m");
+            for (i = 0; i < numpoints; i++)
+                xdata[i] = xdata[i] * 1e-9;
+        }
+        else if (xinterp->unitindex == WIP_UNIT_SM_1) {
+            siunitx = gwy_si_unit_new("1/m");
+            for (i = 0; i < numpoints; i++)
+                xdata[i] = 1.0 / (xdata[i] * 1e-9);
+        }
+        else if (xinterp->unitindex == WIP_UNIT_RAMAN_SHIFT) {
+            if (xinterp->excitation_wavelength == 0.0) {
+                siunitx = gwy_si_unit_new("m");
+                for (i = 0; i < numpoints; i++)
+                    xdata[i] = xdata[i] * 1e-9;
+            }
+            else {
+                siunitx = gwy_si_unit_new("1/m");
+                for (i = 0; i < numpoints; i++)
+                    xdata[i]
+                         = 1.0 / (xinterp->excitation_wavelength * 1e-9)
+                                              - 1.0 / (xdata[i] * 1e-9);
+            }
+        }
+        else if ((xinterp->unitindex == WIP_UNIT_EV)
+              || (xinterp->unitindex == WIP_UNIT_MEV)) {
+            siunitx = gwy_si_unit_new("eV");
+            for (i = 0; i < numpoints; i++)
+                xdata[i] = H * C / (xdata[i] * 1e-9);
+        }
+        else if ((xinterp->unitindex == WIP_UNIT_EV_REL)
+              || (xinterp->unitindex == WIP_UNIT_MEV_REL)) {
+            if (xinterp->excitation_wavelength == 0.0) {
+                siunitx = gwy_si_unit_new("m");
+                for (i = 0; i < numpoints; i++)
+                    xdata[i] = xdata[i] * 1e-9;
+            }
+            else {
+                siunitx = gwy_si_unit_new("eV");
+                for (i = 0; i < numpoints; i++)
+                    xdata[i] = (H * C / (xinterp->excitation_wavelength * 1e-9)
+                                - H * C / (xdata[i] * 1e-9));
+            }
+        }
+        else {
+            siunitx = gwy_si_unit_new("m");
+            for (i = 0; i < numpoints; i++)
+                xdata[i] = xdata[i] * 1e-9;
+        }
     }
     else
         siunitx = gwy_si_unit_new("pixels");
@@ -813,21 +904,22 @@ wip_read_graph(GNode *node)
         g_free(xtransform->unitname);
     }
     g_free(xtransform);
+    g_free(xinterp);
 
     /* Try to read y units */
     idnode->id = header->zinterpid;
     g_node_traverse(g_node_get_root(node),
-                     G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
-                     wip_find_by_id, (gpointer)idnode);
+                    G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
+                    wip_find_by_id, (gpointer)idnode);
     yaxis = g_new0(WIPAxis, 1);
     g_node_traverse(idnode->node->parent->parent,
-                     G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
-                     wip_read_axis_tags,
-                     (gpointer)yaxis);
+                    G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
+                    wip_read_axis_tags,
+                    (gpointer)yaxis);
     if (yaxis->unitname)
         siunity = gwy_si_unit_new(yaxis->unitname);
     else
-        siunity = gwy_si_unit_new("");
+        siunity = gwy_si_unit_new(NULL);
     g_free(yaxis);
 
     /* Packing */
@@ -847,6 +939,9 @@ wip_read_graph(GNode *node)
     gwy_graph_curve_model_set_data(gcmodel, xdata, ydata, numpoints);
     g_free(xdata);
     g_free(ydata);
+    if (!gwy_graph_curve_model_is_ordered(gcmodel)) {
+        gwy_graph_curve_model_enforce_order(gcmodel);
+    }
     gwy_graph_model_add_curve(gmodel, gcmodel);
     g_object_unref(gcmodel);
     g_string_free(caption, TRUE);
@@ -860,6 +955,7 @@ wip_read_graph_image(GNode *node)
 {
     WIPGraph *header;
     WIPSpectralTransform *xtransform;
+    WIPSpectralInterpretation *xinterp;
     WIPAxis *waxis;
     WIPSpaceTransform *xyaxis;
     WIPIdNode *idnode;
@@ -893,13 +989,13 @@ wip_read_graph_image(GNode *node)
     yres = header->sizey;
     zres = header->sizegraph;
 
-    gwy_debug("numpoints * databytes = %d, datasize = %d\n",
-            xres * yres * zres * WIPDataSize[header->datatype],
-            header->datasize);
+    gwy_debug("numpoints * databytes = %" G_GSIZE_FORMAT ", datasize = %" G_GSIZE_FORMAT "\n",
+              xres * yres * zres * WIPDataSize[header->datatype],
+              header->datasize);
     if ((xres * yres * zres <= 0)
-     || (header->datatype > 10)
-     || (header->datasize != WIPDataSize[header->datatype]
-                           * xres * yres * zres)) {
+        || (header->datatype > 10)
+        || (header->datasize != (WIPDataSize[header->datatype]
+                                 * xres * yres * zres))) {
         g_free(header);
         return NULL;
     }
@@ -908,18 +1004,18 @@ wip_read_graph_image(GNode *node)
     idnode = g_new0(WIPIdNode, 1);
     idnode->id = header->spacetransformid;
     g_node_traverse(g_node_get_root(node),
-                     G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
-                     wip_find_by_id, (gpointer)idnode);
+                    G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
+                    wip_find_by_id, (gpointer)idnode);
 
     xyaxis = g_new0(WIPSpaceTransform, 1);
     g_node_traverse(idnode->node->parent->parent,
-                     G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
-                     wip_read_space_tr_tag, (gpointer)xyaxis);
+                    G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
+                    wip_read_space_tr_tag, (gpointer)xyaxis);
 
     if (xyaxis->unitname)
         siunitxy = gwy_si_unit_new_parse(xyaxis->unitname, &power10xy);
     else
-        siunitxy = gwy_si_unit_new("");
+        siunitxy = gwy_si_unit_new(NULL);
     xscale = xyaxis->scale[0];
     yscale = xyaxis->scale[4];
     if (xscale == 0.0) {
@@ -941,17 +1037,17 @@ wip_read_graph_image(GNode *node)
     /* Try to read w units */
     idnode->id = header->zinterpid;
     g_node_traverse(g_node_get_root(node),
-                     G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
-                     wip_find_by_id, (gpointer)idnode);
+                    G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
+                    wip_find_by_id, (gpointer)idnode);
     waxis = g_new0(WIPAxis, 1);
     g_node_traverse(idnode->node->parent->parent,
-                     G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
-                     wip_read_axis_tags,
-                     (gpointer)waxis);
+                    G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
+                    wip_read_axis_tags,
+                    (gpointer)waxis);
     if (waxis->unitname)
         siunitw = gwy_si_unit_new_parse(waxis->unitname, &power10w);
     else
-        siunitw = gwy_si_unit_new("");
+        siunitw = gwy_si_unit_new(NULL);
     g_free(waxis);
     wscale = pow(10.0, power10w);
     if (wscale == 0.0)
@@ -1065,6 +1161,17 @@ wip_read_graph_image(GNode *node)
             g_warning("Wrong datatype");
     }
 
+    idnode->id = header->xinterpid;
+    g_node_traverse(g_node_get_root(node),
+                    G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
+                    wip_find_by_id, (gpointer)idnode);
+
+    xinterp = g_new0(WIPSpectralInterpretation, 1);
+    g_node_traverse(idnode->node->parent->parent,
+                    G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
+                    wip_read_sp_interpr_tags,
+                    (gpointer)xinterp);
+
     /* Try to read zcalibration */
     idnode->id = header->xtransformid;
     g_node_traverse(g_node_get_root(node),
@@ -1087,13 +1194,63 @@ wip_read_graph_image(GNode *node)
         for (i = 0; i < zres; i++)
             data[i] = wip_pixel_to_lambda(i, xtransform);
 
+        /* recalculating to right units */
         if (xtransform->unitname != NULL) {
-            siunitz = gwy_si_unit_new("m");
-            for (i = 0; i < zres; i++)
-                data[i] *= 1e-9;
+            if ((xinterp->unitindex == WIP_UNIT_NANOMETER)
+             || (xinterp->unitindex == WIP_UNIT_MIKROMETER)) {
+                siunitz = gwy_si_unit_new("m");
+                for (i = 0; i < zres; i++)
+                    data[i] = data[i] * 1e-9;
+            }
+            else if (xinterp->unitindex == WIP_UNIT_SM_1) {
+                siunitz = gwy_si_unit_new("1/m");
+                for (i = 0; i < zres; i++)
+                    data[i] = 1.0 / (data[i] * 1e-9);
+            }
+            else if (xinterp->unitindex == WIP_UNIT_RAMAN_SHIFT) {
+                if (xinterp->excitation_wavelength == 0.0) {
+                    siunitz = gwy_si_unit_new("m");
+                    for (i = 0; i < zres; i++)
+                        data[i] = data[i] * 1e-9;
+                }
+                else {
+                    siunitz = gwy_si_unit_new("1/m");
+                    for (i = 0; i < zres; i++)
+                        data[i]
+                         = 1.0 / (xinterp->excitation_wavelength * 1e-9)
+                                               - 1.0 / (data[i] * 1e-9);
+                }
+            }
+            else if ((xinterp->unitindex == WIP_UNIT_EV)
+                  || (xinterp->unitindex == WIP_UNIT_MEV)) {
+                siunitz = gwy_si_unit_new("eV");
+                for (i = 0; i < zres; i++)
+                    data[i] = H * C / (data[i] * 1e-9);
+            }
+            else if ((xinterp->unitindex == WIP_UNIT_EV_REL)
+                  || (xinterp->unitindex == WIP_UNIT_MEV_REL)) {
+                if (xinterp->excitation_wavelength == 0.0) {
+                    siunitz = gwy_si_unit_new("m");
+                    for (i = 0; i < zres; i++)
+                        data[i] = data[i] * 1e-9;
+                }
+                else {
+                    siunitz = gwy_si_unit_new("eV");
+                    for (i = 0; i < zres; i++)
+                        data[i]
+                         = H*C / (xinterp->excitation_wavelength * 1e-9)
+                                             - H * C / (data[i] * 1e-9);
+                }
+            }
+            else {
+                siunitz = gwy_si_unit_new("m");
+                for (i = 0; i < zres; i++)
+                    data[i] = data[i] * 1e-9;
+            }
         }
         else
             siunitz = gwy_si_unit_new("pixels");
+
         gwy_data_line_set_si_unit_y(cal, siunitz);
         gwy_brick_set_zcalibration(brick, cal);
         g_object_unref(cal);
@@ -1106,6 +1263,7 @@ wip_read_graph_image(GNode *node)
         g_free(xtransform->unitname);
     }
     g_free(xtransform);
+    g_free(xinterp);
 
     gwy_brick_set_si_unit_x(brick, siunitxy);
     gwy_brick_set_si_unit_y(brick, siunitxy);
@@ -1121,29 +1279,6 @@ wip_read_graph_image(GNode *node)
     return brick;
 }
 
-static void
-wip_flip_xy(GwyDataField *source, GwyDataField *dest)
-{
-    gint xres, yres, i, j;
-    gdouble *dd;
-    const gdouble *sd;
-
-    xres = gwy_data_field_get_xres(source);
-    yres = gwy_data_field_get_yres(source);
-    gwy_data_field_resample(dest, yres, xres, GWY_INTERPOLATION_NONE);
-    sd = gwy_data_field_get_data_const(source);
-    dd = gwy_data_field_get_data(dest);
-
-    for (i = 0; i < xres; i++) {
-        for (j = 0; j < yres; j++) {
-            dd[i*yres + (yres - 1 - j)] = sd[j*xres + i];
-        }
-    }
-
-    gwy_data_field_set_xreal(dest, gwy_data_field_get_yreal(source));
-    gwy_data_field_set_yreal(dest, gwy_data_field_get_xreal(source));
-}
-
 static GwyDataField*
 wip_read_image(GNode *node)
 {
@@ -1165,13 +1300,13 @@ wip_read_image(GNode *node)
     header = g_new0(WIPImage, 1);
 
     g_node_traverse(node, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
-                     wip_read_image_tags, (gpointer)header);
+                    wip_read_image_tags, (gpointer)header);
 
     if ((header->datatype > 11)
-     || (header->sizex != header->xrange)
-     || (header->sizey != header->yrange)
-     || (header->datasize != WIPDataSize[header->datatype]
-       * header->sizex * header->sizey)) {
+        || (header->sizex != header->xrange)
+        || (header->sizey != header->yrange)
+        || (header->datasize != (WIPDataSize[header->datatype]
+                                 * header->sizex * header->sizey))) {
         g_free(header);
         return NULL;
     }
@@ -1180,32 +1315,32 @@ wip_read_image(GNode *node)
     idnode = g_new0(WIPIdNode, 1);
     idnode->id = header->zinterpid;
     g_node_traverse(g_node_get_root(node),
-                     G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
-                     wip_find_by_id, (gpointer)idnode);
+                    G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
+                    wip_find_by_id, (gpointer)idnode);
     zaxis = g_new0(WIPAxis, 1);
     g_node_traverse(idnode->node->parent->parent,
-                     G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
-                     wip_read_axis_tags,
-                     (gpointer)zaxis);
+                    G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
+                    wip_read_axis_tags,
+                    (gpointer)zaxis);
     if (zaxis->unitname)
         siunitz = gwy_si_unit_new_parse(zaxis->unitname, &power10z);
     else
-        siunitz = gwy_si_unit_new("");
+        siunitz = gwy_si_unit_new(NULL);
     g_free(zaxis);
 
     /* Try to read xy units and scale */
     idnode->id = header->postransformid;
     g_node_traverse(g_node_get_root(node),
-                     G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
-                     wip_find_by_id, (gpointer)idnode);
+                    G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
+                    wip_find_by_id, (gpointer)idnode);
     xyaxis = g_new0(WIPSpaceTransform, 1);
     g_node_traverse(idnode->node->parent->parent,
-                     G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
-                     wip_read_space_tr_tag, (gpointer)xyaxis);
+                    G_LEVEL_ORDER, G_TRAVERSE_ALL, -1,
+                    wip_read_space_tr_tag, (gpointer)xyaxis);
     if (xyaxis->unitname)
         siunitxy = gwy_si_unit_new_parse(xyaxis->unitname, &power10xy);
     else
-        siunitxy = gwy_si_unit_new("");
+        siunitxy = gwy_si_unit_new(NULL);
     xscale = xyaxis->scale[0];
     yscale = xyaxis->scale[4];
     if (yscale == 0.0) {
@@ -1227,79 +1362,141 @@ wip_read_image(GNode *node)
     g_free(xyaxis);
     g_free(idnode);
 
+    zscale = pow(10.0, power10z);
+    if (zscale == 0.0)
+        zscale = 1.0;
+    p = header->data;
+
     /* Reading actual data
+     *
+     * FIXME
+     *
      * data is stored in strange way in TDImage, so it is more
      * simple to swap X and Y axes here to read them correctly
      * and rotate datafield in the end of procedure */
-    dfield2 = gwy_data_field_new(header->sizey, header->sizex,
-                          header->sizey * pow(10.0, power10xy) * yscale,
-                          header->sizex * pow(10.0, power10xy) * xscale,
-                          FALSE);
-    data = gwy_data_field_get_data(dfield2);
+    if (header->version == 0) {
+        dfield2 = gwy_data_field_new(header->sizey, header->sizex,
+                                     header->sizey * pow(10.0, power10xy) * yscale,
+                                     header->sizex * pow(10.0, power10xy) * xscale,
+                                     FALSE);
+        data = gwy_data_field_get_data(dfield2);
+
+        switch (header->datatype) {
+            case WIP_DATA_LIST:
+            case WIP_DATA_EXTENDED:
+                /* cannot read this */
+                break;
+            case WIP_DATA_FLOAT:
+                for (i = 0; i < header->sizex * header->sizey; i++)
+                    data[i] = zscale * gwy_get_gfloat_le(&p);
+                break;
+            case WIP_DATA_DOUBLE:
+                for (i = 0; i < header->sizex * header->sizey; i++)
+                    data[i] = zscale * gwy_get_gdouble_le(&p);
+                break;
+            case WIP_DATA_INT8:
+            case WIP_DATA_UINT8:
+            case WIP_DATA_BOOL:
+                for (i = 0; i < header->sizex * header->sizey; i++)
+                    data[i] = *(p++) * zscale;
+                break;
+            case WIP_DATA_INT64:
+                for (i = 0; i < header->sizex * header->sizey; i++) {
+                    data[i] = GINT64_FROM_LE(*(const gint64 *)p) * zscale;
+                    p += 8;
+                }
+                break;
+            case WIP_DATA_INT32:
+                for (i = 0; i < header->sizex * header->sizey; i++) {
+                    data[i] = GINT32_FROM_LE(*(const gint32 *)p) * zscale;
+                    p += 4;
+                }
+                break;
+            case WIP_DATA_INT16:
+                for (i = 0; i < header->sizex * header->sizey; i++) {
+                    data[i] = GINT16_FROM_LE(*(const gint16 *)p) * zscale;
+                    p += 2;
+                }
+                break;
+            case WIP_DATA_UINT32:
+                for (i = 0; i < header->sizex * header->sizey; i++) {
+                    data[i] = GUINT32_FROM_LE(*(const guint32 *)p) * zscale;
+                    p += 4;
+                }
+                break;
+            case WIP_DATA_UINT16:
+                for (i = 0; i < header->sizex * header->sizey; i++) {
+                    data[i] = GUINT16_FROM_LE(*(const guint16 *)p) * zscale;
+                    p += 2;
+                }
+                break;
+            default:
+                g_warning("Wrong datatype");
+        }
 
-    zscale = pow(10.0, power10z);
-    if (zscale == 0.0)
-        zscale = 1.0;
-    p = header->data;
-    switch (header->datatype) {
-        case WIP_DATA_LIST:
-        case WIP_DATA_EXTENDED:
-            /* cannot read this */
-            break;
-        case WIP_DATA_FLOAT:
-            for (i = 0; i < header->sizex * header->sizey; i++)
-                data[i] = zscale * gwy_get_gfloat_le(&p);
-            break;
-        case WIP_DATA_DOUBLE:
-            for (i = 0; i < header->sizex * header->sizey; i++)
-                data[i] = zscale * gwy_get_gdouble_le(&p);
-            break;
-        case WIP_DATA_INT8:
-        case WIP_DATA_UINT8:
-        case WIP_DATA_BOOL:
-            for (i = 0; i < header->sizex * header->sizey; i++)
-                data[i] = *(p++) * zscale;
-            break;
-        case WIP_DATA_INT64:
-            for (i = 0; i < header->sizex * header->sizey; i++) {
-                data[i] = GINT64_FROM_LE(*(const gint64 *)p) * zscale;
-                p += 8;
-            }
-            break;
-        case WIP_DATA_INT32:
-            for (i = 0; i < header->sizex * header->sizey; i++) {
-                data[i] = GINT32_FROM_LE(*(const gint32 *)p) * zscale;
-                p += 4;
-            }
-            break;
-        case WIP_DATA_INT16:
-            for (i = 0; i < header->sizex * header->sizey; i++) {
-                data[i] = GINT16_FROM_LE(*(const gint16 *)p) * zscale;
-                p += 2;
-            }
-            break;
-        case WIP_DATA_UINT32:
-            for (i = 0; i < header->sizex * header->sizey; i++) {
-                data[i] = GUINT32_FROM_LE(*(const guint32 *)p) * zscale;
-                p += 4;
-            }
-            break;
-        case WIP_DATA_UINT16:
-            for (i = 0; i < header->sizex * header->sizey; i++) {
-                data[i] = GUINT16_FROM_LE(*(const guint16 *)p) * zscale;
-                p += 2;
-            }
-            break;
-        default:
-            g_warning("Wrong datatype");
+        dfield = gwy_data_field_new_rotated_90(dfield2, TRUE);
+        g_object_unref(dfield2);
     }
+    else {
+        dfield = gwy_data_field_new(header->sizex, header->sizey,
+                                     header->sizex * pow(10.0, power10xy) * xscale,
+                                     header->sizey * pow(10.0, power10xy) * yscale,
+                                     FALSE);
+        data = gwy_data_field_get_data(dfield);
 
-    dfield = gwy_data_field_new(header->sizex, header->sizey,
-                          header->sizex * pow(10.0, power10xy) * xscale,
-                          header->sizey * pow(10.0, power10xy) * yscale,
-                          FALSE);
-    wip_flip_xy(dfield2, dfield);
-    g_object_unref(dfield2);
+        switch (header->datatype) {
+            case WIP_DATA_LIST:
+            case WIP_DATA_EXTENDED:
+                /* cannot read this */
+                break;
+            case WIP_DATA_FLOAT:
+                for (i = 0; i < header->sizex * header->sizey; i++)
+                    data[i] = zscale * gwy_get_gfloat_le(&p);
+                break;
+            case WIP_DATA_DOUBLE:
+                for (i = 0; i < header->sizex * header->sizey; i++)
+                    data[i] = zscale * gwy_get_gdouble_le(&p);
+                break;
+            case WIP_DATA_INT8:
+            case WIP_DATA_UINT8:
+            case WIP_DATA_BOOL:
+                for (i = 0; i < header->sizex * header->sizey; i++)
+                    data[i] = *(p++) * zscale;
+                break;
+            case WIP_DATA_INT64:
+                for (i = 0; i < header->sizex * header->sizey; i++) {
+                    data[i] = GINT64_FROM_LE(*(const gint64 *)p) * zscale;
+                    p += 8;
+                }
+                break;
+            case WIP_DATA_INT32:
+                for (i = 0; i < header->sizex * header->sizey; i++) {
+                    data[i] = GINT32_FROM_LE(*(const gint32 *)p) * zscale;
+                    p += 4;
+                }
+                break;
+            case WIP_DATA_INT16:
+                for (i = 0; i < header->sizex * header->sizey; i++) {
+                    data[i] = GINT16_FROM_LE(*(const gint16 *)p) * zscale;
+                    p += 2;
+                }
+                break;
+            case WIP_DATA_UINT32:
+                for (i = 0; i < header->sizex * header->sizey; i++) {
+                    data[i] = GUINT32_FROM_LE(*(const guint32 *)p) * zscale;
+                    p += 4;
+                }
+                break;
+            case WIP_DATA_UINT16:
+                for (i = 0; i < header->sizex * header->sizey; i++) {
+                    data[i] = GUINT16_FROM_LE(*(const guint16 *)p) * zscale;
+                    p += 2;
+                }
+                break;
+            default:
+                g_warning("Wrong datatype");
+        }
+    }
 
     gwy_data_field_set_si_unit_z(dfield, siunitz);
     gwy_data_field_set_si_unit_xy(dfield, siunitxy);
@@ -1343,7 +1540,7 @@ wip_read_bitmap(GNode *node)
     if (xyaxis->unitname)
         siunitxy = gwy_si_unit_new_parse(xyaxis->unitname, &power10xy);
     else
-        siunitxy = gwy_si_unit_new("");
+        siunitxy = gwy_si_unit_new(NULL);
     xscale = xyaxis->scale[0];
     yscale = xyaxis->scale[4];
     if (yscale == 0.0) {
diff --git a/modules/file/witec-asc.c b/modules/file/witec-asc.c
index 8c5a37d..f82c71a 100644
--- a/modules/file/witec-asc.c
+++ b/modules/file/witec-asc.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: witec-asc.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: witec-asc.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2011 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -78,7 +78,7 @@ static GwyModuleInfo module_info = {
     "2011",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, witec_asc)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/witfile.c b/modules/file/witfile.c
index 27070fd..51ab9ea 100644
--- a/modules/file/witfile.c
+++ b/modules/file/witfile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: witfile.c 16387 2014-07-10 10:41:50Z yeti-dn $
+ *  $Id: witfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -215,7 +215,7 @@ static GwyModuleInfo module_info = {
     "2005",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, witfile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/wsffile.c b/modules/file/wsffile.c
index 116e19f..4b1642a 100644
--- a/modules/file/wsffile.c
+++ b/modules/file/wsffile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: wsffile.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: wsffile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2011 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -88,7 +88,7 @@ static GwyModuleInfo module_info = {
     "2011",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, wsffile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/wsxmfile.c b/modules/file/wsxmfile.c
index a6b1dd9..136acda 100644
--- a/modules/file/wsxmfile.c
+++ b/modules/file/wsxmfile.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: wsxmfile.c 18379 2016-03-03 11:42:28Z yeti-dn $
+ *  $Id: wsxmfile.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2005 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -102,7 +102,7 @@ static GwyModuleInfo module_info = {
     "2005",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, wsxmfile)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/xyzexport.c b/modules/file/xyzexport.c
index 6cb49e8..9d9e7b1 100644
--- a/modules/file/xyzexport.c
+++ b/modules/file/xyzexport.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: xyzexport.c 18474 2016-03-21 10:33:53Z yeti-dn $
+ *  @(#) $Id: xyzexport.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2015-2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -93,7 +93,7 @@ static GwyModuleInfo module_info = {
     "2015",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, xyzexport)
 
 static gboolean
 module_register(void)
@@ -210,6 +210,9 @@ xyzexport_export(G_GNUC_UNUSED GwyContainer *data,
                                  &title);
     }
 
+    if (!title)
+        title = _("Untitled");
+
     if (mode == GWY_RUN_INTERACTIVE) {
         ok = xyzexport_export_dialog(&args, !!mfield, needs_decimal_dot,
                                      pageno, title);
diff --git a/modules/file/zeiss.c b/modules/file/zeiss.c
index cd7c0d6..aa9a6a2 100644
--- a/modules/file/zeiss.c
+++ b/modules/file/zeiss.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: zeiss.c 17800 2015-12-03 15:01:54Z yeti-dn $
+ *  @(#) $Id: zeiss.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2011 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -65,7 +65,7 @@ static GwyModuleInfo module_info = {
     "2011",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, zeiss)
 
 static gboolean
 module_register(void)
diff --git a/modules/file/zeisslsm.c b/modules/file/zeisslsm.c
new file mode 100644
index 0000000..b597821
--- /dev/null
+++ b/modules/file/zeisslsm.c
@@ -0,0 +1,1552 @@
+/*
+ *  $Id: zeisslsm.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2017 David Necas (Yeti), Daniil Bratashov (dn2010).
+ *  E-mail: dn2010 at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+ /*
+  * It is easier to re-implement parts of (not so) TIFF loading here
+  * than to add kludges into GwyTIFF.
+  *
+  * LZW Compression is unimplemented now.
+  *
+  * It is based on LSMfile description from:
+  * http://ibb.gsf.de/homepage/karsten.rodenacker/IDL/Lsmfile.doc
+  * Please note that it has incorrect TIF_CZ_LSMINFO tag layout,
+  * 3 elements of type gdouble with X, Y and Z offsets are skipped
+  * there.
+  *
+  * Also BioImage XD source code was used as more modern reference
+  * about format features.
+  */
+
+/**
+ * [FILE-MAGIC-FREEDESKTOP]
+ * <mime-type type="application/x-zeiss-lsm-spm">
+ *   <comment>Carl Zeiss CLSM images</comment>
+ *   <glob pattern="*.lsm"/>
+ *   <glob pattern="*.LSM"/>
+ * </mime-type>
+ **/
+
+/**
+ * [FILE-MAGIC-USERGUIDE]
+ * Carl Zeiss CLSM images
+ * .lsm
+ * Read Volume
+ **/
+
+#include "config.h"
+#include <stdlib.h>
+#include <libgwyddion/gwymath.h>
+#include <libprocess/stats.h>
+#include <app/gwymoduleutils-file.h>
+#include <app/data-browser.h>
+#include "err.h"
+#include "gwytiff.h"
+
+#define EXTENSION ".lsm"
+
+enum {
+    ZEISS_LSM_HEADER_TAG = 34412,
+};
+
+typedef enum {
+    LSM_TIFF_SUB_FILE_TYPE_IMAGE     = 0,
+    LSM_TIFF_SUB_FILE_TYPE_THUMBNAIL = 1,
+} LSMTIFFSubFileType;
+
+typedef enum {
+    LSM_SCANTYPE_XYZ                 = 0,
+    LSM_SCANTYPE_XZ                  = 1,
+    LSM_SCANTYPE_LINE                = 2,
+    LSM_SCANTYPE_TIMESERIES_XY       = 3,
+    LSM_SCANTYPE_TIMESERIES_XZ       = 4,
+    LSM_SCANTYPE_TIMESERIES_MEAN_ROI = 5,
+    LSM_SCANTYPE_TIMESERIES_XYZ      = 6,
+    LSM_SCANTYPE_SPLINE              = 7,
+    LSM_SCANTYPE_SPLINE_XZ           = 8,
+    LSM_SCANTYPE_TIMESERIES_SPLINE   = 9,
+    LSM_SCANTYPE_TIMESERIES_POINT    = 10,
+} LSMHeaderScanType;
+
+typedef enum {
+    LSM_LUT_NORMAL   = 0,
+    LSM_LUT_ORIGINAL = 1,
+    LSM_LUT_RAMP     = 2,
+    LSM_LUT_POLYLINE = 3,
+    LSM_LUT_SPLINE   = 4,
+    LSM_LUT_GAMMA    = 5,
+} LSMLUTType;
+
+typedef enum {
+    LSM_SUBBLOCK_RECORDING              = 0x10000000,
+    LSM_SUBBLOCK_LASERS                 = 0x30000000,
+    LSM_SUBBLOCK_LASER                  = 0x50000000,
+    LSM_SUBBLOCK_TRACKS                 = 0x20000000,
+    LSM_SUBBLOCK_TRACK                  = 0x40000000,
+    LSM_SUBBLOCK_DETECTION_CHANNELS     = 0x60000000,
+    LSM_SUBBLOCK_DETECTION_CHANNEL      = 0x70000000,
+    LSM_SUBBLOCK_ILLUMINATION_CHANNELS  = 0x80000000,
+    LSM_SUBBLOCK_ILLUMINATION_CHANNEL   = 0x90000000,
+    LSM_SUBBLOCK_BEAM_SPLITTERS         = 0xA0000000,
+    LSM_SUBBLOCK_BEAM_SPLITTER          = 0xB0000000,
+    LSM_SUBBLOCK_DATA_CHANNELS          = 0xC0000000,
+    LSM_SUBBLOCK_DATA_CHANNEL           = 0xD0000000,
+    LSM_SUBBLOCK_TIMERS                 = 0x11000000,
+    LSM_SUBBLOCK_TIMER                  = 0x12000000,
+    LSM_SUBBLOCK_MARKERS                = 0x13000000,
+    LSM_SUBBLOCK_MARKER                 = 0x14000000,
+    LSM_SUBBLOCK_END                    = 0xFFFFFFFF,
+} LSMScanInfoEntry;
+
+typedef enum {
+    LSM_RECORDING_ENTRY_NAME                    = 0x10000001,
+    LSM_RECORDING_ENTRY_DESCRIPTION             = 0x10000002,
+    LSM_RECORDING_ENTRY_NOTES                   = 0x10000003,
+    LSM_RECORDING_ENTRY_OBJECTIVE               = 0x10000004,
+    LSM_RECORDING_ENTRY_PROCESSING_SUMMARY      = 0x10000005,
+    LSM_RECORDING_ENTRY_SPECIAL_SCAN_MODE       = 0x10000006,
+    LSM_RECORDING_ENTRY_SCAN_TYPE               = 0x10000007,
+    LSM_RECORDING_ENTRY_SCAN_MODE               = 0x10000008,
+    LSM_RECORDING_ENTRY_NUMBER_OF_STACKS        = 0x10000009,
+    LSM_RECORDING_ENTRY_LINES_PER_PLANE         = 0x1000000A,
+    LSM_RECORDING_ENTRY_SAMPLES_PER_LINE        = 0x1000000B,
+    LSM_RECORDING_ENTRY_PLANES_PER_VOLUME       = 0x1000000C,
+    LSM_RECORDING_ENTRY_IMAGES_WIDTH            = 0x1000000D,
+    LSM_RECORDING_ENTRY_IMAGES_HEIGHT           = 0x1000000E,
+    LSM_RECORDING_ENTRY_IMAGES_NUMBER_PLANES    = 0x1000000F,
+    LSM_RECORDING_ENTRY_IMAGES_NUMBER_STACKS    = 0x10000010,
+    LSM_RECORDING_ENTRY_IMAGES_NUMBER_CHANNELS  = 0x10000011,
+    LSM_RECORDING_ENTRY_LINSCAN_XY_SIZE         = 0x10000012,
+    LSM_RECORDING_ENTRY_SCAN_DIRECTION          = 0x10000013,
+    LSM_RECORDING_ENTRY_TIME_SERIES             = 0x10000014,
+    LSM_RECORDING_ENTRY_ORIGINAL_SCAN_DATA      = 0x10000015,
+    LSM_RECORDING_ENTRY_ZOOM_X                  = 0x10000016,
+    LSM_RECORDING_ENTRY_ZOOM_Y                  = 0x10000017,
+    LSM_RECORDING_ENTRY_ZOOM_Z                  = 0x10000018,
+    LSM_RECORDING_ENTRY_SAMPLE_0X               = 0x10000019,
+    LSM_RECORDING_ENTRY_SAMPLE_0Y               = 0x1000001A,
+    LSM_RECORDING_ENTRY_SAMPLE_0Z               = 0x1000001B,
+    LSM_RECORDING_ENTRY_SAMPLE_SPACING          = 0x1000001C,
+    LSM_RECORDING_ENTRY_LINE_SPACING            = 0x1000001D,
+    LSM_RECORDING_ENTRY_PLANE_SPACING           = 0x1000001E,
+    LSM_RECORDING_ENTRY_PLANE_WIDTH             = 0x1000001F,
+    LSM_RECORDING_ENTRY_PLANE_HEIGHT            = 0x10000020,
+    LSM_RECORDING_ENTRY_VOLUME_DEPTH            = 0x10000021,
+    LSM_RECORDING_ENTRY_ROTATION                = 0x10000034,
+    LSM_RECORDING_ENTRY_NUTATION                = 0x10000023,
+    LSM_RECORDING_ENTRY_PRECESSION              = 0x10000035,
+    LSM_RECORDING_ENTRY_SAMPLE_0TIME            = 0x10000036,
+    LSM_RECORDING_ENTRY_START_SCAN_TRIGGER_IN   = 0x10000037,
+    LSM_RECORDING_ENTRY_START_SCAN_TRIGGER_OUT  = 0x10000038,
+    LSM_RECORDING_ENTRY_START_SCAN_EVENT        = 0x10000039,
+    LSM_RECORDING_ENTRY_START_SCAN_TIME         = 0x10000040,
+    LSM_RECORDING_ENTRY_STOP_SCAN_TRIGGER_IN    = 0x10000041,
+    LSM_RECORDING_ENTRY_STOP_SCAN_TRIGGER_OUT   = 0x10000042,
+    LSM_RECORDING_ENTRY_STOP_SCAN_EVENT         = 0x10000043,
+    LSM_RECORDING_ENTRY_STOP_SCAN_TIME          = 0x10000044,
+    LSM_RECORDING_ENTRY_USE_ROIS                = 0x10000045,
+    LSM_RECORDING_ENTRY_USE_REDUCED_MEMORY_ROIS,
+} LSMEntryRecordingMarkers;
+
+typedef enum {
+    LSM_TRACK_ENTRY_MULTIPLEX_TYPE              = 0x40000001,
+    LSM_TRACK_ENTRY_MULTIPLEX_ORDER             = 0x40000002,
+    LSM_TRACK_ENTRY_SAMPLING_MODE               = 0x40000003,
+    LSM_TRACK_ENTRY_SAMPLING_METHOD             = 0x40000004,
+    LSM_TRACK_ENTRY_SAMPLING_NUMBER             = 0x40000005,
+    LSM_TRACK_ENTRY_ACQUIRE                     = 0x40000006,
+    LSM_TRACK_ENTRY_SAMPLE_OBSERVATION_TIME     = 0x40000007,
+    LSM_TRACK_ENTRY_TIME_BETWEEN_STACKS         = 0x4000000B,
+    LSM_TRACK_ENTRY_NAME                        = 0x4000000C,
+    LSM_TRACK_ENTRY_COLLIMATOR1_NAME            = 0x4000000D,
+    LSM_TRACK_ENTRY_COLLIMATOR1_POSITION        = 0x4000000E,
+    LSM_TRACK_ENTRY_COLLIMATOR2_NAME            = 0x4000000F,
+    LSM_TRACK_ENTRY_COLLIMATOR2_POSITION        = 0x40000010,
+    LSM_TRACK_ENTRY_IS_BLEACH_TRACK             = 0x40000011,
+    LSM_TRACK_ENTRY_IS_BLEACH_AFTER_SCAN_NUMBER = 0x40000012,
+    LSM_TRACK_ENTRY_BLEACH_SCAN_NUMBER          = 0x40000013,
+    LSM_TRACK_ENTRY_TRIGGER_IN                  = 0x40000014,
+    LSM_TRACK_ENTRY_TRIGGER_OUT                 = 0x40000015,
+    LSM_TRACK_ENTRY_IS_RATIO_TRACK              = 0x40000016,
+    LSM_TRACK_ENTRY_BLEACH_COUNT                = 0x40000017,
+} LSMTrackMarkers;
+
+typedef enum {
+    LSM_LASER_ENTRY_NAME                        = 0x50000001,
+    LSM_LASER_ENTRY_ACQUIRE                     = 0x50000002,
+    LSM_LASER_ENTRY_POWER                       = 0x50000003,
+} LSMLaserMarkers;
+
+typedef enum {
+    LSM_DETCHANNEL_ENTRY_INTEGRATION_MODE       = 0x70000001,
+    LSM_DETCHANNEL_ENTRY_SPECIAL_MODE           = 0x70000002,
+    LSM_DETCHANNEL_ENTRY_DETECTOR_GAIN_FIRST    = 0x70000003,
+    LSM_DETCHANNEL_ENTRY_DETECTOR_GAIN_LAST     = 0x70000004,
+    LSM_DETCHANNEL_ENTRY_AMPLIFIER_GAIN_FIRST   = 0x70000005,
+    LSM_DETCHANNEL_ENTRY_AMPLIFIER_GAIN_LAST    = 0x70000006,
+    LSM_DETCHANNEL_ENTRY_AMPLIFIER_OFFS_FIRST   = 0x70000007,
+    LSM_DETCHANNEL_ENTRY_AMPLIFIER_OFFS_LAST    = 0x70000008,
+    LSM_DETCHANNEL_ENTRY_PINHOLE_DIAMETER       = 0x70000009,
+    LSM_DETCHANNEL_ENTRY_COUNTING_TRIGGER       = 0x7000000A,
+    LSM_DETCHANNEL_ENTRY_ACQUIRE                = 0x7000000B,
+    LSM_DETCHANNEL_POINT_DETECTOR_NAME          = 0x7000000C,
+    LSM_DETCHANNEL_AMPLIFIER_NAME               = 0x7000000D,
+    LSM_DETCHANNEL_PINHOLE_NAME                 = 0x7000000E,
+    LSM_DETCHANNEL_FILTER_SET_NAME              = 0x7000000F,
+    LSM_DETCHANNEL_FILTER_NAME                  = 0x70000010,
+    LSM_DETCHANNEL_INTEGRATOR_NAME              = 0x70000013,
+    LSM_DETCHANNEL_DETECTION_CHANNEL_NAME       = 0x70000014,
+} LSMDetectorMarkers;
+
+typedef enum {
+    LSM_TYPE_SUBBLOCK = 0,
+    LSM_TYPE_LONG     = 4,
+    LSM_TYPE_RATIONAL = 5,
+    LSM_TYPE_ASCII    = 2,
+} LSMScanInfoType;
+
+typedef struct {
+    LSMTIFFSubFileType filetype;
+    guint64 image_width;
+    guint64 image_height;
+    guint strips_number;
+    guint *bits_per_sample;
+    GwyTIFFCompression  compression;
+    GwyTIFFPhotometric  photometric;
+    guint32 *strip_offsets;
+    guint samples_per_pixel;
+    guint32 *strip_byte_counts;
+    GwyTIFFPlanarConfig planar_config;
+} LSMTIFFDirectory;
+
+typedef struct {
+    guint32 magic_number;
+    gint32  size;
+    gint32  xres;
+    gint32  yres;
+    gint32  zres;
+    gint32  channels;
+    gint32  time_res;
+    gint32  intensity_datatype;
+    gint32  thumbnail_xres;
+    gint32  thumbnail_yres;
+    gdouble x_voxel_size;
+    gdouble y_voxel_size;
+    gdouble z_voxel_size;
+    gdouble x_origin;
+    gdouble y_origin;
+    gdouble z_origin;
+    guint32 scan_type;
+    guint32 datatype;
+    guint32 offset_vector_overlay;
+    guint32 offset_input_lut;
+    guint32 offset_output_lut;
+    guint32 offset_channel_colors_names;
+    gdouble time_interval;
+    guint32 offset_channel_data_types;
+    guint32 offset_scan_information;
+    guint32 offset_ks_data;
+    guint32 offset_timestamps;
+    guint32 offset_events_list;
+    guint32 offset_roi;
+    guint32 offset_bleach_roi;
+    guint32 offset_next_recording;
+    guint32 reserved[90]; /* Must be zeros */
+} LSMHeaderTag;
+
+typedef struct {
+    gint32 block_size;
+    gint32 numcolors;
+    gint32 numnames;
+    gint32 offset_colors;
+    gint32 offset_names;
+    gint32 mono;
+    GArray *colors;
+    GPtrArray *names;
+} LSMNamesColors;
+
+typedef struct {
+    guint32 block_size;
+    guint32 number_of_subblocks;
+    guint32 channels_number;
+    LSMLUTType lut_type; /* guint32 */
+    guint32 advanced;
+    guint32 actual_channel;
+    guint32 reserved[9];
+} LSMLookupTable;
+
+typedef struct {
+    guint32          entry; /* guint32 */
+    LSMScanInfoType  type;  /* guint32 */
+    guint32          size;
+    gpointer         data;
+} LSMEntry;
+
+typedef struct {
+    gchar *name;
+    gchar *description;
+    gchar *notes;
+    gchar *objective;
+    gchar *processing_summary;
+    gchar *special_scan_mode;
+    gchar *scan_mode;
+    guint32 number_of_stacks;
+    guint32 lines_per_plane;
+    guint32 samples_per_line;
+    guint32 planes_per_volume;
+    guint32 images_width;
+    guint32 images_height;
+    guint32 images_number_planes;
+    guint32 images_number_stacks;
+    guint32 images_number_channels;
+    guint32 linscan_xy_size;
+    guint32 scan_direction;
+    guint32 time_series;
+    guint32 original_scan_data;
+    gdouble zoomx;
+    gdouble zoomy;
+    gdouble zoomz;
+    gdouble sample0x;
+    gdouble sample0y;
+    gdouble sample0z;
+    gdouble sample_spacing;
+    gdouble line_spacing;
+    gdouble plane_spacing;
+    gdouble plane_width;
+    gdouble plane_height;
+    gdouble volume_depth;
+    gdouble rotation;
+    gdouble nutation;
+    gdouble precession;
+    gdouble sample0_time;
+    gchar *start_scan_trigger_in;
+    gchar *start_scan_trigger_out;
+    guint32 start_scan_event;
+    gdouble start_scan_time;
+    gchar *stop_scan_trigger_in;
+    gchar *stop_scan_trigger_out;
+    guint32 stop_scan_event;
+    gdouble stop_scan_time;
+    guint32 use_rois;
+    guint32 use_reduced_memory_rois;
+    gchar *laser_name;
+    guint32 laser_acquire;
+    gdouble laser_power;
+} LSMEntryRecording;
+
+static gboolean           module_register       (void);
+static gint               lsm_detect            (const GwyFileDetectInfo *fileinfo,
+                                                 gboolean only_name);
+static GwyContainer*      lsm_load              (const gchar *filename,
+                                                 GwyRunType mode,
+                                                 GError **error);
+static GwyContainer*      lsm_load_tiff         (const GwyTIFF *tiff,
+                                                 const gchar *filename,
+                                                 GError **error);
+static LSMTIFFDirectory*  lsm_read_directory    (const GwyTIFF *tiff,
+                                                 guint dirno,
+                                                 GError **error);
+static LSMHeaderTag*      lsm_read_header_tag   (const GwyTIFF *tiff,
+                                                 const GwyTIFFEntry *tag,
+                                                 GError **error);
+static LSMNamesColors*    lsm_read_names_colors (const GwyTIFF *tiff,
+                                                 guint32 offset,
+                                                 GError **error);
+static LSMEntryRecording* lsm_read_recording    (const GwyTIFF *tiff,
+                                                 GwyContainer *meta,
+                                                 guint32 offset,
+                                                 GError **error);
+static LSMEntry*          lsm_read_entry        (const GwyTIFF *tiff,
+                                                 guint32 offset,
+                                                 GError **error);
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION,
+    module_register,
+    N_("Imports Carl Zeiss CLSM images."),
+    "Daniil Bratashov <dn2010 at gwyddion.net>",
+    "0.3",
+    "Daniil Bratashov (dn2010), David Nečas (Yeti)",
+    "2017",
+};
+
+GWY_MODULE_QUERY2(module_info, zeisslsm)
+
+static gboolean
+module_register(void)
+{
+    gwy_file_func_register("zeisslsm",
+                           N_("Carl Zeiss CLSM images (.lsm)"),
+                           (GwyFileDetectFunc)&lsm_detect,
+                           (GwyFileLoadFunc)&lsm_load,
+                           NULL,
+                           NULL);
+
+    return TRUE;
+}
+
+static gint
+lsm_detect(const GwyFileDetectInfo *fileinfo, gboolean only_name)
+{
+    GwyTIFF *tiff = NULL;
+    gint score = 0;
+    GwyTIFFVersion version = GWY_TIFF_CLASSIC;
+    guint byteorder = G_LITTLE_ENDIAN;
+    const GwyTIFFEntry *lsm_tag = NULL;
+
+    if (only_name)
+        return (g_str_has_suffix(fileinfo->name_lowercase, EXTENSION))
+                ? 20 : 0;
+
+    /* Weed out non-TIFFs */
+    if (!gwy_tiff_detect(fileinfo->head, fileinfo->buffer_len,
+                         &version, &byteorder))
+        return 0;
+
+    if ((tiff = gwy_tiff_load(fileinfo->name, NULL))
+     && (lsm_tag = gwy_tiff_find_tag(tiff, 0, ZEISS_LSM_HEADER_TAG))) {
+        score = 100;
+    }
+
+    if (tiff)
+        g_free(tiff);
+
+    return score;
+}
+
+static GwyContainer*
+lsm_load(const gchar *filename,
+         G_GNUC_UNUSED GwyRunType mode,
+         GError **error)
+{
+
+    GwyTIFF *tiff;
+    GwyContainer *container = NULL;
+
+    tiff = gwy_tiff_load(filename, error);
+    if (!tiff)
+        return NULL;
+
+    container = lsm_load_tiff(tiff, filename, error);
+
+    gwy_tiff_free(tiff);
+
+    return container;
+}
+
+static GwyContainer*
+lsm_load_tiff(const GwyTIFF *tiff,
+              const gchar *filename,
+              GError **error)
+{
+    GwyContainer *container = NULL, *meta = NULL;
+    GwyDataLine *dataline = NULL;
+    GwyGraphCurveModel *gcmodel;
+    GwyGraphModel *gmodel = NULL;
+    GwyDataField *dfield = NULL, *preview;
+    GwyBrick *brick;
+    GwySIUnit *siunit;
+    gint i, j, k, l, volumes, ndirs, z, xres = 0, yres = 0, zres = 0;
+    gint color;
+    gdouble xreal = 1.0, yreal = 1.0, zreal = 1.0;
+    gchar *key, *name, *lutname;
+    gdouble *data, *bdata;
+    const GwyTIFFEntry *lsm_tag;
+    LSMTIFFDirectory *directory;
+    LSMHeaderTag *header_tag = NULL;
+    LSMNamesColors *names_colors = NULL;
+    LSMEntryRecording *recording = NULL;
+    const guchar *p;
+    gboolean is_image = FALSE, is_volume = FALSE, is_line = FALSE;
+    GArray *bricks, *bricks_preview;
+
+    if (!(lsm_tag = gwy_tiff_find_tag(tiff, 0, ZEISS_LSM_HEADER_TAG))) {
+        err_FILE_TYPE(error, "Carl Zeiss LSM");
+        goto fail;
+    }
+
+    if (!(header_tag = lsm_read_header_tag(tiff, lsm_tag, error))) {
+        err_FILE_TYPE(error, "Carl Zeiss LSM");
+        goto fail;
+    }
+
+    names_colors = lsm_read_names_colors(tiff,
+                                         header_tag->offset_channel_colors_names,
+                                         error);
+    meta = gwy_container_new();
+    recording = lsm_read_recording(tiff, meta,
+                                   header_tag->offset_scan_information,
+                                   error);
+
+    ndirs = gwy_tiff_get_n_dirs(tiff);
+    gwy_debug("ndirs=%u", ndirs);
+
+    container = gwy_container_new();
+    k = 0; /* number of images in resulting file */
+    volumes = 0;
+
+    is_image = FALSE;
+    is_volume = FALSE;
+    is_line = FALSE;
+    bricks = g_array_new(FALSE, FALSE, sizeof(GwyBrick*));
+    bricks_preview = g_array_new(FALSE, FALSE, sizeof(GwyBrick*));
+
+    for (i = 0; i < ndirs; i++) {
+        gwy_debug("directory #%u", i);
+        if (!(directory = lsm_read_directory(tiff, i, error))) {
+            err_FILE_TYPE(error, "Carl Zeiss LSM");
+            goto fail;
+        }
+
+        switch (header_tag->scan_type) {
+            case LSM_SCANTYPE_XYZ:
+                xres = directory->image_width;
+                yres = directory->image_height;
+                zres = header_tag->zres;
+                xreal = xres * header_tag->x_voxel_size;
+                yreal = yres * header_tag->y_voxel_size;
+                zreal = zres * header_tag->z_voxel_size;
+                if (directory->image_width != header_tag->xres) {
+                    xreal = header_tag->xres * header_tag->x_voxel_size;
+                    yreal = header_tag->yres * header_tag->y_voxel_size;
+                }
+                if (header_tag->zres > 1)
+                    is_volume = TRUE;
+                else
+                    is_image = TRUE;
+            break;
+            case LSM_SCANTYPE_XZ:
+                xres = directory->image_width;
+                yres = directory->image_height;
+                xreal = xres * header_tag->x_voxel_size;
+                yreal = yres * header_tag->z_voxel_size;
+                if (directory->image_width != header_tag->xres) {
+                    xreal = header_tag->xres * header_tag->x_voxel_size;
+                    yreal = header_tag->zres * header_tag->z_voxel_size;
+                }
+                is_image = TRUE;
+            break;
+            case LSM_SCANTYPE_LINE:
+                xres = directory->image_width;
+                yres = directory->image_height;
+                xreal = xres * header_tag->x_voxel_size;
+                yreal = 1.0;
+                if (directory->image_width != header_tag->xres)
+                    xreal = header_tag->xres * header_tag->x_voxel_size;
+                is_line = TRUE;
+                siunit = gwy_si_unit_new("m");
+                gmodel = g_object_new(GWY_TYPE_GRAPH_MODEL,
+                                      "si-unit-x", siunit,
+                                      NULL);
+                g_object_unref(siunit);
+            break;
+            case LSM_SCANTYPE_TIMESERIES_XY:
+                xres = directory->image_width;
+                yres = directory->image_height;
+                zres = ndirs / 2;
+                xreal = xres * header_tag->x_voxel_size;
+                yreal = yres * header_tag->y_voxel_size;
+                if (directory->image_width != header_tag->xres) {
+                    xreal = header_tag->xres * header_tag->x_voxel_size;
+                    yreal = header_tag->yres * header_tag->y_voxel_size;
+                }
+                zreal = ndirs / 2 * header_tag->time_interval;
+                is_volume = TRUE;
+            break;
+            case LSM_SCANTYPE_TIMESERIES_XZ:
+                xres = directory->image_width;
+                yres = directory->image_height;
+                zres = ndirs / 2;
+                xreal = xres * header_tag->x_voxel_size;
+                yreal = yres * header_tag->z_voxel_size;
+                zreal = ndirs / 2 * header_tag->time_interval;
+                if (directory->image_width != header_tag->xres) {
+                    xreal = header_tag->xres * header_tag->x_voxel_size;
+                    yreal = header_tag->zres * header_tag->z_voxel_size;
+                }
+                is_volume = TRUE;
+            break;
+            case LSM_SCANTYPE_TIMESERIES_MEAN_ROI:
+                xres = directory->image_width;
+                yres = directory->image_height;
+                xreal = directory->image_width;
+                yreal = directory->image_height * header_tag->time_interval;
+                is_image = TRUE;
+            break;
+            default:
+                // FIXME: there is files with broken scantype
+                xres = directory->image_width;
+                yres = directory->image_height;
+                zres = header_tag->zres;
+                xreal = xres * header_tag->x_voxel_size;
+                yreal = yres * header_tag->y_voxel_size;
+                zreal = zres * header_tag->z_voxel_size;
+                if (directory->image_width != header_tag->xres) {
+                    xreal = header_tag->xres * header_tag->x_voxel_size;
+                    yreal = header_tag->yres * header_tag->y_voxel_size;
+                }
+                if (header_tag->zres > 1)
+                    is_volume = TRUE;
+                else
+                    is_image = TRUE;
+            break;
+        }
+
+        for (j = 0; j < directory->strips_number; j++) {
+            if ((is_image) || (is_volume)) {
+                dfield = gwy_data_field_new(xres, yres,
+                                            xreal, yreal, TRUE);
+                data = gwy_data_field_get_data(dfield);
+            }
+            else if (is_line) {
+                dataline = gwy_data_line_new(xres, xreal, TRUE);
+                data = gwy_data_line_get_data(dataline);
+            }
+            else {
+                err_FILE_TYPE(error, "Carl Zeiss LSM");
+                goto fail;
+            }
+
+            p = tiff->data + directory->strip_offsets[j];
+            if (directory->bits_per_sample[j] == 8)
+                for (l = 0; l < xres * yres; l++)
+                    *(data++) = *(p++);
+            else if ((directory->bits_per_sample[j] == 12)
+                  || (directory->bits_per_sample[j] == 16))
+                for (l = 0; l < xres * yres; l++)
+                    *(data++) = gwy_get_guint16_le(&p);
+            else if (directory->bits_per_sample[j] == 32)
+                for (l = 0; l < xres * yres; l++)
+                    *(data++) = gwy_get_gfloat_le(&p);
+            else {
+                if (is_line)
+                    g_object_unref(dataline);
+                else
+                    g_object_unref(dfield);
+                continue;
+            }
+
+            if (is_line) {
+                gcmodel = g_object_new(GWY_TYPE_GRAPH_CURVE_MODEL,
+                                       "mode", GWY_GRAPH_CURVE_LINE,
+                                       "color", gwy_graph_get_preset_color(k),
+                                       NULL);
+                gwy_graph_curve_model_set_data_from_dataline(gcmodel,
+                                                             dataline,
+                                                             0, 0);
+                gwy_graph_model_add_curve(gmodel, gcmodel);
+                g_object_unref(gcmodel);
+            }
+
+            if (is_image) {
+                siunit = gwy_si_unit_new("m");
+                gwy_data_field_set_si_unit_xy(dfield, siunit);
+                g_object_unref(siunit);
+                key = g_strdup_printf("/%d/data", k);
+                gwy_container_set_object_by_name(container,
+                                                 key, dfield);
+                g_free(key);
+                g_object_unref(dfield);
+                if (gwy_container_get_n_items(meta)) {
+                    key = g_strdup_printf("/%d/meta", k);
+                    gwy_container_set_object_by_name(container, key,
+                                                     meta);
+                    g_free(key);
+                }
+                gwy_file_channel_import_log_add(container,
+                                                k, NULL, filename);
+
+                if (names_colors && (i % 2 == 0)) {
+                    key = g_strdup_printf("/%d/data/title", k);
+                    name = (gchar *)g_ptr_array_index(names_colors->names,
+                                                      j);
+                    gwy_container_set_string_by_name(container, key,
+                                                     g_strdup(name));
+                    g_free(key);
+
+                    color = g_array_index(names_colors->colors,
+                                          gint32, j);
+                    if (color == 255) {
+                        lutname = g_strdup_printf("RGB-Red");
+                    }
+                    else if (color == 65280) {
+                        lutname = g_strdup_printf("RGB-Green");
+                    }
+                    else if (color == 16711680) {
+                        lutname = g_strdup_printf("RGB-Blue");
+                    }
+                    else {
+                        lutname = g_strdup_printf("Gray");
+                    }
+                    key = g_strdup_printf("/%u/base/palette",
+                                          k);
+                    gwy_container_set_string_by_name(container,
+                                                     key,
+                                                     lutname);
+                    g_free(key);
+                }
+                else {
+                    key = g_strdup_printf("/%d/data/title", k);
+                    gwy_container_set_string_by_name(container, key,
+                            g_strdup_printf("LSM Image %u (channel %u)",
+                                            i / 2, j));
+                    g_free(key);
+
+                    if ((directory->photometric
+                                            == GWY_TIFF_PHOTOMETRIC_RGB)
+                     && (j == 0))
+                        lutname = g_strdup_printf("RGB-Red");
+                    else if ((directory->photometric
+                                            == GWY_TIFF_PHOTOMETRIC_RGB)
+                     && (j == 1))
+                        lutname = g_strdup_printf("RGB-Green");
+                    else if ((directory->photometric
+                                            == GWY_TIFF_PHOTOMETRIC_RGB)
+                     && (j == 2))
+                        lutname = g_strdup_printf("RGB-Blue");
+                    else  {
+                        lutname = g_strdup_printf("Gray");
+                    }
+                    key = g_strdup_printf("/%u/base/palette", k);
+                    gwy_container_set_string_by_name(container,
+                                                     key,
+                                                     lutname);
+                } /* else */
+            }
+
+            if (is_volume) {
+                if ((i % (zres * 2) == 0)
+                    || (i % (zres * 2) == 1)) {
+                    brick = gwy_brick_new(xres, yres, zres,
+                                          xreal, yreal, zreal,
+                                          TRUE);
+
+                    siunit = gwy_si_unit_new("m");
+                    gwy_brick_set_si_unit_x(brick, siunit);
+                    g_object_unref(siunit);
+                    siunit = gwy_si_unit_new("m");
+                    gwy_brick_set_si_unit_y(brick, siunit);
+                    g_object_unref(siunit);
+                    if (header_tag->scan_type == LSM_SCANTYPE_XYZ) {
+                        siunit = gwy_si_unit_new("m");
+                        gwy_brick_set_si_unit_x(brick, siunit);
+                        g_object_unref(siunit);
+                    }
+                    else {
+                        siunit = gwy_si_unit_new("s");
+                        gwy_brick_set_si_unit_x(brick, siunit);
+                        g_object_unref(siunit);
+                    }
+
+                    if (i % (zres * 2) == 0)
+                        g_array_insert_val(bricks, j, brick);
+                    else
+                        g_array_insert_val(bricks_preview, j, brick);
+
+                    key = g_strdup_printf("/brick/%d", volumes + 1);
+                    gwy_container_set_object_by_name(container,
+                                                     key, brick);
+                    g_free(key);
+                    g_object_unref(brick);
+
+                    if (gwy_container_get_n_items(meta)) {
+                        key = g_strdup_printf("brick/%d/meta",
+                                              volumes + 1);
+                        gwy_container_set_object_by_name(container, key,
+                                                         meta);
+                        g_free(key);
+                    }
+
+                    if (names_colors && (i % 2 == 0)) {
+                        key = g_strdup_printf("/brick/%d/title",
+                                              volumes + 1);
+                        name = (gchar *)g_ptr_array_index(names_colors->names,
+                                                          j);
+                        gwy_container_set_string_by_name(container, key,
+                                                         g_strdup(name));
+                        g_free(key);
+
+                        color = g_array_index(names_colors->colors,
+                                              gint32, j);
+                        if (color == 255) {
+                            lutname = g_strdup_printf("RGB-Red");
+                        }
+                        else if (color == 65280) {
+                            lutname = g_strdup_printf("RGB-Green");
+                        }
+                        else if (color == 16711680) {
+                            lutname = g_strdup_printf("RGB-Blue");
+                        }
+                        else {
+                            lutname = g_strdup_printf("Gray");
+                        }
+                        key = g_strdup_printf("/brick/%d/preview/palette",
+                                              volumes + 1);
+                        gwy_container_set_string_by_name(container,
+                                                         key,
+                                                         lutname);
+                        g_free(key);
+                    }
+                    else {
+                        key = g_strdup_printf("/brick/%d/title",
+                                              volumes + 1);
+                        gwy_container_set_string_by_name(container, key,
+                           g_strdup_printf("LSM Volume %d (channel %u)",
+                                           i / 2 / zres,
+                                           j));
+                        g_free(key);
+
+                        if ((directory->photometric
+                                                == GWY_TIFF_PHOTOMETRIC_RGB)
+                         && (j == 0))
+                            lutname = g_strdup_printf("RGB-Red");
+                        else if ((directory->photometric
+                                                == GWY_TIFF_PHOTOMETRIC_RGB)
+                         && (j == 1))
+                            lutname = g_strdup_printf("RGB-Green");
+                        else if ((directory->photometric
+                                                == GWY_TIFF_PHOTOMETRIC_RGB)
+                         && (j == 2))
+                            lutname = g_strdup_printf("RGB-Blue");
+                        else  {
+                            lutname = g_strdup_printf("Gray");
+                        }
+                        key = g_strdup_printf("/brick/%d/preview/palette",
+                                              volumes + 1);
+                        gwy_container_set_string_by_name(container,
+                                                         key,
+                                                         lutname);
+                        g_free(key);
+                    } /* else */
+                    volumes++;
+                }
+
+                z = (i % zres) / 2;
+                if (i % 2)
+                    brick = g_array_index(bricks_preview, GwyBrick*, j);
+                else
+                    brick = g_array_index(bricks, GwyBrick*, j);
+
+                bdata = gwy_brick_get_data(brick);
+                data = gwy_data_field_get_data(dfield);
+                memcpy(bdata + z * directory->image_width * directory->image_height,
+                       data, directory->image_width * directory->image_height * sizeof(gdouble));
+            }
+            k++;
+        } /* for j */
+
+        g_free(directory->bits_per_sample);
+        g_free(directory->strip_offsets);
+        g_free(directory->strip_byte_counts);
+        g_free(directory);
+    } /* for i */
+
+    g_array_free(bricks, TRUE);
+    g_array_free(bricks_preview, TRUE);
+
+    if (is_volume) {
+        for (i = 0; i < volumes; i++) {
+            key = g_strdup_printf("/brick/%d", i + 1);
+            gwy_container_gis_object_by_name(container,
+                                             key,
+                                             &brick);
+            g_free(key);
+
+            xres = gwy_brick_get_xres(brick);
+            yres = gwy_brick_get_yres(brick);
+            preview = gwy_data_field_new(xres, yres,
+                                         1.0, 1.0, FALSE);
+            gwy_brick_mean_plane(brick, preview,
+                                 0, 0, 0,
+                                 xres, yres, -1,
+                                 FALSE);
+            key = g_strdup_printf("/brick/%d/preview", i + 1);
+            gwy_container_set_object_by_name(container,
+                                             key,
+                                             preview);
+            g_free(key);
+            g_object_unref(preview);
+
+            gwy_file_volume_import_log_add(container,
+                                           i+1, NULL, filename);
+        }
+    }
+
+    if (is_line) {
+        gwy_container_set_object_by_name(container,
+                                         "/0/graph/graph/1", gmodel);
+        g_object_unref(gmodel);
+    }
+
+fail:
+    if (header_tag) {
+        g_free(header_tag);
+    }
+    if (names_colors) {
+        g_array_free(names_colors->colors, TRUE);
+        g_ptr_array_free(names_colors->names, TRUE);
+        g_free(names_colors);
+    }
+    /* The strings are already eaten by meta. */
+    g_free(recording);
+
+    return container;
+}
+
+static LSMTIFFDirectory*
+lsm_read_directory(const GwyTIFF *tiff, guint dirno, GError **error)
+{
+    guint i, j, offset;
+    GArray *direntries;
+    GwyTIFFEntry *tag;
+    const guchar *p;
+    LSMTIFFDirectory *lsmdir;
+
+    lsmdir = g_new(LSMTIFFDirectory, 1);
+    direntries = g_ptr_array_index(tiff->dirs, dirno);
+    for (i = 0; i < direntries->len; i++) {
+        tag = &g_array_index(direntries, GwyTIFFEntry, i);
+        gwy_debug("tag=%u type=%d count=%" G_GUINT64_FORMAT "",
+                  tag->tag, tag->type, tag->count);
+        switch (tag->tag) {
+            case GWY_TIFFTAG_SUB_FILE_TYPE:
+                p = tag->value;
+                lsmdir->filetype = gwy_get_guint32_le(&p);
+                gwy_debug("filetype=%d", lsmdir->filetype);
+            break;
+            case GWY_TIFFTAG_IMAGE_WIDTH:
+                p = tag->value;
+                lsmdir->image_width = gwy_get_guint32_le(&p);
+                gwy_debug("imgwidth=%" G_GUINT64_FORMAT "",
+                          lsmdir->image_width);
+            break;
+            case GWY_TIFFTAG_IMAGE_LENGTH:
+                p = tag->value;
+                lsmdir->image_height = gwy_get_guint32_le(&p);
+                gwy_debug("imgheight=%" G_GUINT64_FORMAT "",
+                          lsmdir->image_height);
+            break;
+            case GWY_TIFFTAG_BITS_PER_SAMPLE:
+                p = tag->value;
+                offset = gwy_get_guint32_le(&p);
+                gwy_debug("offset = %d", offset);
+                lsmdir->bits_per_sample
+                                    = g_new0(guint, MAX(tag->count, 1));
+                if (tag->count == 1)
+                    lsmdir->bits_per_sample[0] = offset;
+                else {
+                    p = tiff->data + offset;
+                    for (j = 0; j < tag->count; j++) {
+                        lsmdir->bits_per_sample[j]
+                                               = gwy_get_guint16_le(&p);
+                        gwy_debug("bps[%d]=%d",
+                                  j , lsmdir->bits_per_sample[j]);
+                    }
+                }
+            break;
+            case GWY_TIFFTAG_COMPRESSION:
+                p = tag->value;
+                lsmdir->compression = gwy_get_guint16_le(&p);
+                gwy_debug("compression=%d", lsmdir->compression);
+                if (lsmdir->compression != GWY_TIFF_COMPRESSION_NONE) {
+                    // FIXME: LZW is unsupported
+                    g_set_error(error,
+                                GWY_MODULE_FILE_ERROR,
+                                GWY_MODULE_FILE_ERROR_DATA,
+                                _("Compression type %u is not supported."),
+                                lsmdir->compression);
+                    g_free(lsmdir);
+                    return NULL;
+                }
+            break;
+            case GWY_TIFFTAG_PHOTOMETRIC:
+                p = tag->value;
+                lsmdir->photometric = gwy_get_guint16_le(&p);
+                gwy_debug("photometric=%d", lsmdir->photometric);
+            break;
+            case GWY_TIFFTAG_STRIP_OFFSETS:
+                p = tag->value;
+                offset = gwy_get_guint32_le(&p);
+                gwy_debug("offset = %d", offset);
+                lsmdir->strips_number = tag->count;
+                lsmdir->strip_offsets= g_new0(guint, MAX(tag->count, 1));
+                if (tag->count == 1)
+                    lsmdir->strip_offsets[0] = offset;
+                else {
+                    p = tiff->data + offset;
+                    for (j = 0; j < tag->count; j++) {
+
+                        lsmdir->strip_offsets[j]
+                                               = gwy_get_guint32_le(&p);
+                        gwy_debug("strip offset[%d]=%d",
+                                  j , lsmdir->strip_offsets[j]);
+                    }
+                }
+            break;
+            case GWY_TIFFTAG_SAMPLES_PER_PIXEL:
+                p = tag->value;
+                lsmdir->samples_per_pixel = gwy_get_guint16_le(&p);
+                gwy_debug("samples per pixel=%d",
+                          lsmdir->samples_per_pixel);
+            break;
+            case GWY_TIFFTAG_STRIP_BYTE_COUNTS:
+                p = tag->value;
+                offset = gwy_get_guint32_le(&p);
+                gwy_debug("offset = %d", offset);
+                lsmdir->strip_byte_counts
+                                    = g_new0(guint, MAX(tag->count, 1));
+                if (tag->count == 1)
+                    lsmdir->strip_byte_counts[0] = offset;
+                else {
+                    p = tiff->data + offset;
+                    for (j = 0; j < tag->count; j++) {
+                        lsmdir->strip_byte_counts[j]
+                                               = gwy_get_guint32_le(&p);
+                        gwy_debug("strip byte counts[%d]=%d",
+                                  j , lsmdir->strip_byte_counts[j]);
+                    }
+                }
+            break;
+            case GWY_TIFFTAG_PLANAR_CONFIG:
+                p = tag->value;
+                lsmdir->planar_config = gwy_get_guint16_le(&p);
+                gwy_debug("planar config=%d", lsmdir->planar_config);
+            break;
+            case ZEISS_LSM_HEADER_TAG:
+            break;
+            default:
+            break;
+        }
+    }
+
+    return lsmdir;
+}
+
+static LSMHeaderTag*
+lsm_read_header_tag(const GwyTIFF *tiff,
+                    const GwyTIFFEntry *tag, GError **error)
+{
+    LSMHeaderTag *header_tag;
+    guint offset;
+    const guchar *p;
+
+    header_tag = g_new0(LSMHeaderTag, 1);
+    p = tag->value;
+    offset = gwy_get_guint32_le(&p);
+    p = tiff->data + offset;
+    header_tag->magic_number = gwy_get_guint32_le(&p);
+    if ((header_tag->magic_number != 0x00300494C)
+     && (header_tag->magic_number != 0x00400494C)) {
+        err_FILE_TYPE(error, "Carl Zeiss LSM");
+        g_free(header_tag);
+        return NULL;
+    }
+    gwy_debug("magic=%x", header_tag->magic_number);
+    header_tag->size = gwy_get_gint32_le(&p);
+    header_tag->xres = gwy_get_gint32_le(&p);
+    header_tag->yres = gwy_get_gint32_le(&p);
+    header_tag->zres = gwy_get_gint32_le(&p);
+    header_tag->channels = gwy_get_gint32_le(&p);
+    header_tag->time_res = gwy_get_gint32_le(&p);
+    header_tag->intensity_datatype = gwy_get_gint32_le(&p);
+    header_tag->thumbnail_xres = gwy_get_gint32_le(&p);
+    header_tag->thumbnail_yres = gwy_get_gint32_le(&p);
+    header_tag->x_voxel_size = gwy_get_gdouble_le(&p);
+    header_tag->y_voxel_size = gwy_get_gdouble_le(&p);
+    header_tag->z_voxel_size = gwy_get_gdouble_le(&p);
+    header_tag->x_origin = gwy_get_gdouble_le(&p);
+    header_tag->y_origin = gwy_get_gdouble_le(&p);
+    header_tag->z_origin = gwy_get_gdouble_le(&p);
+    header_tag->scan_type = gwy_get_guint32_le(&p);
+    header_tag->datatype = gwy_get_guint32_le(&p);
+    header_tag->offset_vector_overlay = gwy_get_guint32_le(&p);
+    header_tag->offset_input_lut = gwy_get_guint32_le(&p);
+    header_tag->offset_output_lut = gwy_get_guint32_le(&p);
+    header_tag->offset_channel_colors_names = gwy_get_guint32_le(&p);
+    header_tag->time_interval = gwy_get_gdouble_le(&p);
+    header_tag->offset_channel_data_types = gwy_get_guint32_le(&p);
+    header_tag->offset_scan_information = gwy_get_guint32_le(&p);
+    header_tag->offset_ks_data = gwy_get_guint32_le(&p);
+    header_tag->offset_timestamps = gwy_get_guint32_le(&p);
+    header_tag->offset_events_list = gwy_get_guint32_le(&p);
+    header_tag->offset_roi = gwy_get_guint32_le(&p);
+    header_tag->offset_bleach_roi = gwy_get_guint32_le(&p);
+    header_tag->offset_next_recording = gwy_get_guint32_le(&p);
+
+    gwy_debug("channels=%d", header_tag->channels);
+    gwy_debug("scan type=%u", header_tag->scan_type);
+    gwy_debug("xres=%d yres=%d zres=%d",
+              header_tag->xres,
+              header_tag->yres,
+              header_tag->zres);
+    gwy_debug("xsize=%g, ysize=%g zsize=%g timesize=%g",
+              header_tag->x_voxel_size,
+              header_tag->y_voxel_size,
+              header_tag->z_voxel_size,
+              header_tag->time_interval);
+    return header_tag;
+}
+
+static LSMNamesColors *
+lsm_read_names_colors(const GwyTIFF *tiff,
+                      guint32 offset,
+                      G_GNUC_UNUSED GError **error)
+{
+    LSMNamesColors *names_colors;
+    const guchar *p;
+    gchar *name, *nameu;
+    gint32 color;
+    gint i;
+    gsize len, size;
+
+    if (offset == 0) {
+        gwy_debug("No names and colors structure");
+        return NULL;
+    }
+    names_colors = g_new0(LSMNamesColors, 1);
+    p = tiff->data + offset;
+
+    names_colors->block_size = gwy_get_gint32_le(&p);
+    names_colors->numcolors = gwy_get_gint32_le(&p);
+    names_colors->numnames = gwy_get_gint32_le(&p);
+    names_colors->offset_colors = gwy_get_gint32_le(&p);
+    names_colors->offset_names = gwy_get_gint32_le(&p);
+    names_colors->mono = gwy_get_gint32_le(&p);
+    names_colors->colors = g_array_sized_new(FALSE, TRUE,
+                                             sizeof(gint32),
+                                             names_colors->numcolors);
+    p = tiff->data + offset + names_colors->offset_colors;
+    for (i = 0; i < names_colors->numcolors; i++) {
+        color = gwy_get_gint32_le(&p);
+        g_array_append_val (names_colors->colors, color);
+        gwy_debug("color [%d] = %d", i, color);
+    }
+    p = tiff->data + offset + names_colors->offset_names;
+    names_colors->names = g_ptr_array_sized_new(names_colors->numnames);
+    gwy_debug("num names=%d", names_colors->numnames);
+    len = 0;
+    size = names_colors->block_size - names_colors->offset_names - len;
+    for (i = 0; i < names_colors->numnames; i++) {
+        name = g_malloc0(size + 1);
+        while ((*(p++) < 32) && ((len++) < size));
+        while ((*p) && (len < size)) {
+            *(name + (len++)) = *(p++);
+        }
+        gwy_debug("name[%d]=%s", i, name);
+        nameu = g_convert(name, len, "UTF-8", "ISO-8859-1",
+                          NULL, NULL, NULL);
+        g_free(name);
+        g_ptr_array_add(names_colors->names, (gpointer)nameu);
+    }
+
+    return names_colors;
+}
+
+static LSMEntryRecording*
+lsm_read_recording (const GwyTIFF *tiff,
+                    GwyContainer *meta,
+                    guint32 offset,
+                    G_GNUC_UNUSED GError **error)
+{
+    LSMEntryRecording *recording;
+    LSMEntry *entry;
+    const guchar *p;
+
+    if (offset == 0) {
+        gwy_debug("No recordings");
+        return NULL;
+    }
+
+    p = tiff->data + offset;
+    entry = g_new0(LSMEntry, 1);
+    recording = g_new0(LSMEntryRecording, 1);
+    while (entry->entry != LSM_SUBBLOCK_END) {
+        if (entry)
+            g_free(entry);
+        entry = lsm_read_entry(tiff, offset, error);
+
+        gwy_debug("entry = %x type=%d size=%d",
+                  entry->entry, entry->type, entry->size);
+        if (entry->entry == LSM_RECORDING_ENTRY_NAME) {
+            recording->name = g_convert(entry->data, entry->size,
+                                        "UTF-8", "ISO-8859-1",
+                                        NULL, NULL, NULL);
+            gwy_container_set_string_by_name(meta, "Name",
+                                             recording->name);
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_DESCRIPTION) {
+            recording->description = g_convert(entry->data, entry->size,
+                                               "UTF-8", "ISO-8859-1",
+                                               NULL, NULL, NULL);
+            gwy_container_set_string_by_name(meta, "Description",
+                                             recording->description);
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_NOTES) {
+            recording->notes = g_convert(entry->data, entry->size,
+                                         "UTF-8", "ISO-8859-1",
+                                         NULL, NULL, NULL);
+            gwy_container_set_string_by_name(meta, "Notes",
+                                             recording->notes);
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_OBJECTIVE) {
+            recording->objective = g_convert(entry->data, entry->size,
+                                             "UTF-8", "ISO-8859-1",
+                                             NULL, NULL, NULL);
+            gwy_container_set_string_by_name(meta, "Objective",
+                                             recording->objective);
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_PROCESSING_SUMMARY) {
+            recording->processing_summary = g_convert(entry->data,
+                                                      entry->size,
+                                                      "UTF-8",
+                                                      "ISO-8859-1",
+                                                      NULL, NULL, NULL);
+            gwy_container_set_string_by_name(meta, "Processing summary",
+                                             recording->processing_summary);
+
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_SPECIAL_SCAN_MODE) {
+            recording->special_scan_mode = g_convert(entry->data,
+                                                     entry->size,
+                                                     "UTF-8",
+                                                     "ISO-8859-1",
+                                                     NULL, NULL, NULL);
+            gwy_container_set_string_by_name(meta, "Special scan mode",
+                                             recording->special_scan_mode);
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_SCAN_TYPE) {
+            /* Should be empty string */
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_SCAN_MODE) {
+            recording->scan_mode = g_convert(entry->data, entry->size,
+                                             "UTF-8", "ISO-8859-1",
+                                             NULL, NULL, NULL);
+            gwy_container_set_string_by_name(meta, "Scan mode",
+                                             recording->scan_mode);
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_NUMBER_OF_STACKS) {
+            p = entry->data;
+            recording->number_of_stacks = gwy_get_guint32_le(&p);
+            gwy_container_set_string_by_name(meta, "Number of stacks",
+                    g_strdup_printf("%d", recording->number_of_stacks));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_LINES_PER_PLANE) {
+            p = entry->data;
+            recording->lines_per_plane = gwy_get_guint32_le(&p);
+            gwy_container_set_string_by_name(meta, "Lines per plane",
+                     g_strdup_printf("%d", recording->lines_per_plane));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_SAMPLES_PER_LINE) {
+            p = entry->data;
+            recording->samples_per_line = gwy_get_guint32_le(&p);
+            gwy_container_set_string_by_name(meta, "Samples per line",
+                     g_strdup_printf("%d", recording->samples_per_line));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_PLANES_PER_VOLUME) {
+            p = entry->data;
+            recording->planes_per_volume = gwy_get_guint32_le(&p);
+            gwy_container_set_string_by_name(meta, "Planes per volume",
+                   g_strdup_printf("%d", recording->planes_per_volume));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_IMAGES_WIDTH) {
+            p = entry->data;
+            recording->images_width = gwy_get_guint32_le(&p);
+            gwy_container_set_string_by_name(meta, "Images width",
+                        g_strdup_printf("%d", recording->images_width));
+
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_IMAGES_HEIGHT) {
+            p = entry->data;
+            recording->images_height = gwy_get_guint32_le(&p);
+            gwy_container_set_string_by_name(meta, "Images height",
+                       g_strdup_printf("%d", recording->images_height));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_IMAGES_NUMBER_PLANES) {
+            p = entry->data;
+            recording->images_number_planes = gwy_get_guint32_le(&p);
+            gwy_container_set_string_by_name(meta,
+                                             "Images number of planes",
+                      g_strdup_printf("%d",
+                                      recording->images_number_planes));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_IMAGES_NUMBER_STACKS) {
+            p = entry->data;
+            recording->images_number_stacks = gwy_get_guint32_le(&p);
+            gwy_container_set_string_by_name(meta,
+                                             "Images number of stacks",
+                      g_strdup_printf("%d",
+                                      recording->images_number_stacks));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_IMAGES_NUMBER_CHANNELS) {
+            p = entry->data;
+            recording->images_number_channels = gwy_get_guint32_le(&p);
+            gwy_container_set_string_by_name(meta,
+                                             "Images number of channels",
+                    g_strdup_printf("%d",
+                                    recording->images_number_channels));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_LINSCAN_XY_SIZE) {
+            p = entry->data;
+            recording->linscan_xy_size = gwy_get_guint32_le(&p);
+            gwy_container_set_string_by_name(meta, "Linescan XY size",
+                     g_strdup_printf("%d", recording->linscan_xy_size));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_SCAN_DIRECTION) {
+            p = entry->data;
+            recording->scan_direction = gwy_get_guint32_le(&p);
+            gwy_container_set_string_by_name(meta, "Scan direction",
+                g_strdup_printf("%s", recording->scan_direction ?
+                                   "Bidirectional" : "Unidirectional"));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_TIME_SERIES) {
+            p = entry->data;
+            recording->time_series = gwy_get_guint32_le(&p);
+            gwy_container_set_string_by_name(meta, "Time series",
+                g_strdup_printf("%s", recording->time_series ?
+                                                     "True" : "False"));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_ORIGINAL_SCAN_DATA) {
+            p = entry->data;
+            recording->original_scan_data = gwy_get_guint32_le(&p);
+            gwy_container_set_string_by_name(meta, "Original scan data",
+                g_strdup_printf("%s", recording->original_scan_data ?
+                                              "Original" : "Modified"));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_ZOOM_X) {
+            p = entry->data;
+            recording->zoomx = gwy_get_gdouble_le(&p);
+            gwy_container_set_string_by_name(meta, "X zoom",
+                               g_strdup_printf("%g", recording->zoomx));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_ZOOM_Y) {
+            p = entry->data;
+            recording->zoomy = gwy_get_gdouble_le(&p);
+            gwy_container_set_string_by_name(meta, "Y zoom",
+                               g_strdup_printf("%g", recording->zoomy));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_ZOOM_Z) {
+            p = entry->data;
+            recording->zoomz = gwy_get_gdouble_le(&p);
+            gwy_container_set_string_by_name(meta, "Z zoom",
+                               g_strdup_printf("%g", recording->zoomz));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_SAMPLE_0X) {
+            p = entry->data;
+            recording->sample0x = gwy_get_gdouble_le(&p);
+            gwy_container_set_string_by_name(meta, "Sample 0 X",
+                        g_strdup_printf("%g mkm", recording->sample0x));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_SAMPLE_0Y) {
+            p = entry->data;
+            recording->sample0y = gwy_get_gdouble_le(&p);
+            gwy_container_set_string_by_name(meta, "Sample 0 Y",
+                        g_strdup_printf("%g mkm", recording->sample0y));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_SAMPLE_0Z) {
+            p = entry->data;
+            recording->sample0z = gwy_get_gdouble_le(&p);
+            gwy_container_set_string_by_name(meta, "Sample 0 Z",
+                        g_strdup_printf("%g mkm", recording->sample0z));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_SAMPLE_SPACING) {
+            p = entry->data;
+            recording->sample_spacing = gwy_get_gdouble_le(&p);
+            gwy_container_set_string_by_name(meta, "Sample spacing",
+                  g_strdup_printf("%g mkm", recording->sample_spacing));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_LINE_SPACING) {
+            p = entry->data;
+            recording->line_spacing = gwy_get_gdouble_le(&p);
+            gwy_container_set_string_by_name(meta, "Line spacing",
+                    g_strdup_printf("%g mkm", recording->line_spacing));
+
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_PLANE_SPACING) {
+            p = entry->data;
+            recording->plane_spacing = gwy_get_gdouble_le(&p);
+            gwy_container_set_string_by_name(meta, "Plane spacing",
+                   g_strdup_printf("%g mkm", recording->plane_spacing));
+
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_PLANE_WIDTH) {
+            p = entry->data;
+            recording->plane_width = gwy_get_gdouble_le(&p);
+            gwy_container_set_string_by_name(meta, "Plane width",
+                     g_strdup_printf("%g mkm", recording->plane_width));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_PLANE_HEIGHT) {
+            p = entry->data;
+            recording->plane_height = gwy_get_gdouble_le(&p);
+            gwy_container_set_string_by_name(meta, "Plane height",
+                    g_strdup_printf("%g mkm", recording->plane_height));
+
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_VOLUME_DEPTH) {
+            p = entry->data;
+            recording->volume_depth = gwy_get_gdouble_le(&p);
+            gwy_container_set_string_by_name(meta, "Volume depth",
+                    g_strdup_printf("%g mkm", recording->volume_depth));
+
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_ROTATION) {
+            p = entry->data;
+            recording->rotation = gwy_get_gdouble_le(&p);
+            gwy_container_set_string_by_name(meta, "Rotation",
+                    g_strdup_printf("%g degrees", recording->rotation));
+
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_NUTATION) {
+            p = entry->data;
+            recording->nutation = gwy_get_gdouble_le(&p);
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_PRECESSION) {
+            p = entry->data;
+            recording->precession = gwy_get_gdouble_le(&p);
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_SAMPLE_0TIME) {
+            p = entry->data;
+            recording->sample0_time = gwy_get_gdouble_le(&p);
+            gwy_container_set_string_by_name(meta, "Sample 0 time",
+                        g_strdup_printf("%g", recording->sample0_time));
+
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_START_SCAN_TRIGGER_IN) {
+            recording->start_scan_trigger_in = g_convert(entry->data,
+                                                         entry->size,
+                                                         "UTF-8",
+                                                         "ISO-8859-1",
+                                                         NULL, NULL,
+                                                         NULL);
+            gwy_container_set_string_by_name(meta, "Start scan trigger in",
+                                             recording->start_scan_trigger_in);
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_START_SCAN_TRIGGER_OUT) {
+            recording->start_scan_trigger_out = g_convert(entry->data,
+                                                          entry->size,
+                                                          "UTF-8",
+                                                          "ISO-8859-1",
+                                                          NULL, NULL,
+                                                          NULL);
+            gwy_container_set_string_by_name(meta, "Start scan trigger out",
+                                             recording->start_scan_trigger_out);
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_START_SCAN_EVENT) {
+            p = entry->data;
+            recording->start_scan_event = gwy_get_guint32_le(&p);
+            gwy_container_set_string_by_name(meta, "Start scan event",
+                    g_strdup_printf("%d", recording->start_scan_event));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_START_SCAN_TIME) {
+            p = entry->data;
+            recording->start_scan_time = gwy_get_gdouble_le(&p);
+            gwy_container_set_string_by_name(meta, "Start scan time",
+                     g_strdup_printf("%g", recording->start_scan_time));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_STOP_SCAN_TRIGGER_IN) {
+            recording->stop_scan_trigger_in = g_convert(entry->data,
+                                                        entry->size,
+                                                        "UTF-8",
+                                                        "ISO-8859-1",
+                                                        NULL, NULL,
+                                                        NULL);
+            gwy_container_set_string_by_name(meta, "Stop scan trigger in",
+                                             recording->stop_scan_trigger_in);
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_STOP_SCAN_TRIGGER_OUT) {
+            recording->stop_scan_trigger_out = g_convert(entry->data,
+                                                         entry->size,
+                                                         "UTF-8",
+                                                         "ISO-8859-1",
+                                                         NULL, NULL,
+                                                         NULL);
+            gwy_container_set_string_by_name(meta, "Stop scan trigger out",
+                                             recording->start_scan_trigger_out);
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_STOP_SCAN_EVENT) {
+            p = entry->data;
+            recording->stop_scan_event = gwy_get_guint32_le(&p);
+            gwy_container_set_string_by_name(meta, "Stop scan event",
+                    g_strdup_printf("%d", recording->stop_scan_event));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_STOP_SCAN_TIME) {
+            p = entry->data;
+            recording->stop_scan_time = gwy_get_gdouble_le(&p);
+            gwy_container_set_string_by_name(meta, "Stop scan time",
+                     g_strdup_printf("%g", recording->stop_scan_time));
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_USE_ROIS) {
+            p = entry->data;
+            recording->use_rois = gwy_get_guint32_le(&p);
+        }
+        else if (entry->entry == LSM_RECORDING_ENTRY_USE_REDUCED_MEMORY_ROIS) {
+            p = entry->data;
+            recording->use_reduced_memory_rois = gwy_get_guint32_le(&p);
+        }
+        else if (entry->entry == LSM_LASER_ENTRY_NAME) {
+            recording->laser_name = g_convert(entry->data, entry->size,
+                                              "UTF-8", "ISO-8859-1",
+                                              NULL, NULL, NULL);
+            gwy_container_set_string_by_name(meta, "Laser name",
+                                             recording->laser_name);
+        }
+        else if (entry->entry == LSM_LASER_ENTRY_ACQUIRE) {
+            p = entry->data;
+            recording->laser_acquire = gwy_get_guint32_le(&p);
+            gwy_container_set_string_by_name(meta, "Laser acquire",
+                g_strdup_printf("%s", recording->laser_acquire ?
+                                               "Enabled" : "Disabled"));
+        }
+        else if (entry->entry == LSM_LASER_ENTRY_POWER) {
+            p = entry->data;
+            recording->laser_power = gwy_get_gdouble_le(&p);
+            gwy_container_set_string_by_name(meta, "Laser power",
+                     g_strdup_printf("%g mW", recording->laser_power));
+        }
+
+        offset += 12 + entry->size;
+    }
+
+
+    if (entry) {
+        g_free(entry);
+    }
+
+    return recording;
+}
+
+static LSMEntry*
+lsm_read_entry (const GwyTIFF *tiff,
+                guint32 offset,
+                G_GNUC_UNUSED GError **error)
+{
+    LSMEntry *entry;
+    const guchar *p;
+
+    entry = g_new0(LSMEntry, 1);
+    p = tiff->data + offset;
+    entry->entry = gwy_get_guint32_le(&p);
+    entry->type = gwy_get_guint32_le(&p);
+    entry->size = gwy_get_guint32_le(&p);
+    entry->data = (gpointer)p;
+
+    return entry;
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/file/zemax.c b/modules/file/zemax.c
index a5e6f8c..51cbadb 100644
--- a/modules/file/zemax.c
+++ b/modules/file/zemax.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: zemax.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: zemax.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2013 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net
  *
@@ -76,7 +76,7 @@ static GwyModuleInfo module_info = {
     "2013",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, zemax)
 
 static gboolean
 module_register(void)
diff --git a/modules/graph/Makefile.am b/modules/graph/Makefile.am
index 794a6d1..99fb769 100644
--- a/modules/graph/Makefile.am
+++ b/modules/graph/Makefile.am
@@ -1,8 +1,11 @@
-# @(#) $Id: Makefile.am 19205 2016-11-08 10:24:40Z yeti-dn $
+# @(#) $Id: Makefile.am 20001 2017-06-29 21:52:24Z yeti-dn $
 
 graphdir = $(pkglibdir)/modules/graph
 
-graph_LTLIBRARIES = \
+# Only bundle modules without own dependencies.  If something goes wrong with
+# any required libraries at run-time, it will at most break these individual
+# unbundled modules, not the bundle.
+bundlable_modules = \
 	graph_align.la \
 	graph_cd.la \
 	graph_cut.la \
@@ -15,16 +18,25 @@ graph_LTLIBRARIES = \
 	graph_fit.la \
 	graph_level.la \
 	graph_logscale.la \
-	graph_peaks.la
+	graph_peaks.la \
+	graph_stats.la
+
+# graph_modules is either the bundle or all the individual modules.
+if MODULE_BUNDLING
+graph_modules = graph.la
+BUILT_SOURCES = graph.c
+graph_la_CFLAGS = $(AM_CFLAGS) -DGWY_MODULE_BUNDLING
+else
+graph_modules = $(bundlable_modules)
+endif
+
+graph_LTLIBRARIES = \
+	$(graph_modules)
 
 if OS_MSWIN
 no_undefined = -no-undefined
 endif
 
-AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
-AM_CFLAGS = @COMMON_CFLAGS@
-AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
-
 if MODULE_DEPENDENCIES
 module_libadd = \
 	$(top_builddir)/app/libgwyapp2.la \
@@ -36,6 +48,11 @@ module_libadd = \
 	@GTK_LIBS@
 endif
 
+AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
+AM_CFLAGS = @COMMON_CFLAGS@
+AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
+
+# Bundlable modules, must be listed in tools_la_SOURCES below.
 graph_align_la_SOURCES         = graph_align.c
 graph_cd_la_SOURCES            = graph_cd.c
 graph_cut_la_SOURCES           = graph_cut.c
@@ -49,6 +66,29 @@ graph_fit_la_SOURCES           = graph_fit.c
 graph_level_la_SOURCES         = graph_level.c
 graph_logscale_la_SOURCES      = graph_logscale.c
 graph_peaks_la_SOURCES         = graph_peaks.c
+graph_stats_la_SOURCES         = graph_stats.c
+
+graph_la_SOURCES = \
+	$(graph_align_la_SOURCES) \
+	$(graph_cd_la_SOURCES) \
+	$(graph_cut_la_SOURCES) \
+	$(graph_dos_spectrum_la_SOURCES) \
+	$(graph_export_ascii_la_SOURCES) \
+	$(graph_export_bitmap_la_SOURCES) \
+	$(graph_export_vector_la_SOURCES) \
+	$(graph_fdfit_la_SOURCES) \
+	$(graph_filter_la_SOURCES) \
+	$(graph_fit_la_SOURCES) \
+	$(graph_level_la_SOURCES) \
+	$(graph_logscale_la_SOURCES) \
+	$(graph_peaks_la_SOURCES) \
+	$(graph_stats_la_SOURCES) \
+	graph.c
+
+graph.c: $(srcdir)/Makefile.am $(top_srcdir)/utils/gen-module-bundle.sh
+	$(SHELL) $(top_srcdir)/utils/gen-module-bundle.sh graph.c $(bundlable_modules)
+
+CLEAN_FILES = graph.c
 
 clean-local:
 	rm -f core.* *~
diff --git a/modules/graph/Makefile.in b/modules/graph/Makefile.in
index e0f2632..645cc43 100644
--- a/modules/graph/Makefile.in
+++ b/modules/graph/Makefile.in
@@ -14,7 +14,7 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 19205 2016-11-08 10:24:40Z yeti-dn $
+# @(#) $Id: Makefile.am 20001 2017-06-29 21:52:24Z yeti-dn $
 
 VPATH = @srcdir@
 am__is_gnu_make = { \
@@ -138,49 +138,96 @@ am__uninstall_files_from_dir = { \
   }
 am__installdirs = "$(DESTDIR)$(graphdir)"
 LTLIBRARIES = $(graph_LTLIBRARIES)
-graph_align_la_LIBADD =
-am_graph_align_la_OBJECTS = graph_align.lo
-graph_align_la_OBJECTS = $(am_graph_align_la_OBJECTS)
+graph_la_LIBADD =
+am__objects_1 = graph_la-graph_align.lo
+am__objects_2 = graph_la-graph_cd.lo
+am__objects_3 = graph_la-graph_cut.lo
+am__objects_4 = graph_la-graph_dos_spectrum.lo
+am__objects_5 = graph_la-graph_export_ascii.lo
+am__objects_6 = graph_la-graph_export_bitmap.lo
+am__objects_7 = graph_la-graph_export_vector.lo
+am__objects_8 = graph_la-graph_fdfit.lo
+am__objects_9 = graph_la-graph_filter.lo
+am__objects_10 = graph_la-graph_fit.lo
+am__objects_11 = graph_la-graph_level.lo
+am__objects_12 = graph_la-graph_logscale.lo
+am__objects_13 = graph_la-graph_peaks.lo
+am__objects_14 = graph_la-graph_stats.lo
+am_graph_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
+	$(am__objects_3) $(am__objects_4) $(am__objects_5) \
+	$(am__objects_6) $(am__objects_7) $(am__objects_8) \
+	$(am__objects_9) $(am__objects_10) $(am__objects_11) \
+	$(am__objects_12) $(am__objects_13) $(am__objects_14) \
+	graph_la-graph.lo
+graph_la_OBJECTS = $(am_graph_la_OBJECTS)
 AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
+graph_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(graph_la_CFLAGS) \
+	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+ at MODULE_BUNDLING_TRUE@am_graph_la_rpath = -rpath $(graphdir)
+graph_align_la_LIBADD =
+am_graph_align_la_OBJECTS = graph_align.lo
+graph_align_la_OBJECTS = $(am_graph_align_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_graph_align_la_rpath = -rpath $(graphdir)
 graph_cd_la_LIBADD =
 am_graph_cd_la_OBJECTS = graph_cd.lo
 graph_cd_la_OBJECTS = $(am_graph_cd_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_graph_cd_la_rpath = -rpath $(graphdir)
 graph_cut_la_LIBADD =
 am_graph_cut_la_OBJECTS = graph_cut.lo
 graph_cut_la_OBJECTS = $(am_graph_cut_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_graph_cut_la_rpath = -rpath $(graphdir)
 graph_dos_spectrum_la_LIBADD =
 am_graph_dos_spectrum_la_OBJECTS = graph_dos_spectrum.lo
 graph_dos_spectrum_la_OBJECTS = $(am_graph_dos_spectrum_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_graph_dos_spectrum_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(graphdir)
 graph_export_ascii_la_LIBADD =
 am_graph_export_ascii_la_OBJECTS = graph_export_ascii.lo
 graph_export_ascii_la_OBJECTS = $(am_graph_export_ascii_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_graph_export_ascii_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(graphdir)
 graph_export_bitmap_la_LIBADD =
 am_graph_export_bitmap_la_OBJECTS = graph_export_bitmap.lo
 graph_export_bitmap_la_OBJECTS = $(am_graph_export_bitmap_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_graph_export_bitmap_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(graphdir)
 graph_export_vector_la_LIBADD =
 am_graph_export_vector_la_OBJECTS = graph_export_vector.lo
 graph_export_vector_la_OBJECTS = $(am_graph_export_vector_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_graph_export_vector_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(graphdir)
 graph_fdfit_la_LIBADD =
 am_graph_fdfit_la_OBJECTS = graph_fdfit.lo
 graph_fdfit_la_OBJECTS = $(am_graph_fdfit_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_graph_fdfit_la_rpath = -rpath $(graphdir)
 graph_filter_la_LIBADD =
 am_graph_filter_la_OBJECTS = graph_filter.lo
 graph_filter_la_OBJECTS = $(am_graph_filter_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_graph_filter_la_rpath = -rpath $(graphdir)
 graph_fit_la_LIBADD =
 am_graph_fit_la_OBJECTS = graph_fit.lo
 graph_fit_la_OBJECTS = $(am_graph_fit_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_graph_fit_la_rpath = -rpath $(graphdir)
 graph_level_la_LIBADD =
 am_graph_level_la_OBJECTS = graph_level.lo
 graph_level_la_OBJECTS = $(am_graph_level_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_graph_level_la_rpath = -rpath $(graphdir)
 graph_logscale_la_LIBADD =
 am_graph_logscale_la_OBJECTS = graph_logscale.lo
 graph_logscale_la_OBJECTS = $(am_graph_logscale_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_graph_logscale_la_rpath = -rpath $(graphdir)
 graph_peaks_la_LIBADD =
 am_graph_peaks_la_OBJECTS = graph_peaks.lo
 graph_peaks_la_OBJECTS = $(am_graph_peaks_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_graph_peaks_la_rpath = -rpath $(graphdir)
+graph_stats_la_LIBADD =
+am_graph_stats_la_OBJECTS = graph_stats.lo
+graph_stats_la_OBJECTS = $(am_graph_stats_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_graph_stats_la_rpath = -rpath $(graphdir)
 AM_V_P = $(am__v_P_ at AM_V@)
 am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -215,22 +262,24 @@ AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = $(graph_align_la_SOURCES) $(graph_cd_la_SOURCES) \
-	$(graph_cut_la_SOURCES) $(graph_dos_spectrum_la_SOURCES) \
+SOURCES = $(graph_la_SOURCES) $(graph_align_la_SOURCES) \
+	$(graph_cd_la_SOURCES) $(graph_cut_la_SOURCES) \
+	$(graph_dos_spectrum_la_SOURCES) \
 	$(graph_export_ascii_la_SOURCES) \
 	$(graph_export_bitmap_la_SOURCES) \
 	$(graph_export_vector_la_SOURCES) $(graph_fdfit_la_SOURCES) \
 	$(graph_filter_la_SOURCES) $(graph_fit_la_SOURCES) \
 	$(graph_level_la_SOURCES) $(graph_logscale_la_SOURCES) \
-	$(graph_peaks_la_SOURCES)
-DIST_SOURCES = $(graph_align_la_SOURCES) $(graph_cd_la_SOURCES) \
-	$(graph_cut_la_SOURCES) $(graph_dos_spectrum_la_SOURCES) \
+	$(graph_peaks_la_SOURCES) $(graph_stats_la_SOURCES)
+DIST_SOURCES = $(graph_la_SOURCES) $(graph_align_la_SOURCES) \
+	$(graph_cd_la_SOURCES) $(graph_cut_la_SOURCES) \
+	$(graph_dos_spectrum_la_SOURCES) \
 	$(graph_export_ascii_la_SOURCES) \
 	$(graph_export_bitmap_la_SOURCES) \
 	$(graph_export_vector_la_SOURCES) $(graph_fdfit_la_SOURCES) \
 	$(graph_filter_la_SOURCES) $(graph_fit_la_SOURCES) \
 	$(graph_level_la_SOURCES) $(graph_logscale_la_SOURCES) \
-	$(graph_peaks_la_SOURCES)
+	$(graph_peaks_la_SOURCES) $(graph_stats_la_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -296,10 +345,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -309,6 +355,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -333,7 +381,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -391,6 +441,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -399,17 +450,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -495,7 +542,11 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 graphdir = $(pkglibdir)/modules/graph
-graph_LTLIBRARIES = \
+
+# Only bundle modules without own dependencies.  If something goes wrong with
+# any required libraries at run-time, it will at most break these individual
+# unbundled modules, not the bundle.
+bundlable_modules = \
 	graph_align.la \
 	graph_cd.la \
 	graph_cut.la \
@@ -508,12 +559,19 @@ graph_LTLIBRARIES = \
 	graph_fit.la \
 	graph_level.la \
 	graph_logscale.la \
-	graph_peaks.la
+	graph_peaks.la \
+	graph_stats.la
+
+ at MODULE_BUNDLING_FALSE@graph_modules = $(bundlable_modules)
+
+# graph_modules is either the bundle or all the individual modules.
+ at MODULE_BUNDLING_TRUE@graph_modules = graph.la
+ at MODULE_BUNDLING_TRUE@BUILT_SOURCES = graph.c
+ at MODULE_BUNDLING_TRUE@graph_la_CFLAGS = $(AM_CFLAGS) -DGWY_MODULE_BUNDLING
+graph_LTLIBRARIES = \
+	$(graph_modules)
 
 @OS_MSWIN_TRUE at no_undefined = -no-undefined
-AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
-AM_CFLAGS = @COMMON_CFLAGS@
-AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
 @MODULE_DEPENDENCIES_TRUE at module_libadd = \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/app/libgwyapp2.la \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libdraw/libgwydraw2.la \
@@ -523,6 +581,11 @@ AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libprocess/libgwyprocess2.la \
 @MODULE_DEPENDENCIES_TRUE@	@GTK_LIBS@
 
+AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
+AM_CFLAGS = @COMMON_CFLAGS@
+AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
+
+# Bundlable modules, must be listed in tools_la_SOURCES below.
 graph_align_la_SOURCES = graph_align.c
 graph_cd_la_SOURCES = graph_cd.c
 graph_cut_la_SOURCES = graph_cut.c
@@ -536,7 +599,27 @@ graph_fit_la_SOURCES = graph_fit.c
 graph_level_la_SOURCES = graph_level.c
 graph_logscale_la_SOURCES = graph_logscale.c
 graph_peaks_la_SOURCES = graph_peaks.c
-all: all-am
+graph_stats_la_SOURCES = graph_stats.c
+graph_la_SOURCES = \
+	$(graph_align_la_SOURCES) \
+	$(graph_cd_la_SOURCES) \
+	$(graph_cut_la_SOURCES) \
+	$(graph_dos_spectrum_la_SOURCES) \
+	$(graph_export_ascii_la_SOURCES) \
+	$(graph_export_bitmap_la_SOURCES) \
+	$(graph_export_vector_la_SOURCES) \
+	$(graph_fdfit_la_SOURCES) \
+	$(graph_filter_la_SOURCES) \
+	$(graph_fit_la_SOURCES) \
+	$(graph_level_la_SOURCES) \
+	$(graph_logscale_la_SOURCES) \
+	$(graph_peaks_la_SOURCES) \
+	$(graph_stats_la_SOURCES) \
+	graph.c
+
+CLEAN_FILES = graph.c
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
 
 .SUFFIXES:
 .SUFFIXES: .c .lo .o .obj
@@ -605,44 +688,50 @@ clean-graphLTLIBRARIES:
 	  rm -f $${locs}; \
 	}
 
+graph.la: $(graph_la_OBJECTS) $(graph_la_DEPENDENCIES) $(EXTRA_graph_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(graph_la_LINK) $(am_graph_la_rpath) $(graph_la_OBJECTS) $(graph_la_LIBADD) $(LIBS)
+
 graph_align.la: $(graph_align_la_OBJECTS) $(graph_align_la_DEPENDENCIES) $(EXTRA_graph_align_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(graphdir) $(graph_align_la_OBJECTS) $(graph_align_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_graph_align_la_rpath) $(graph_align_la_OBJECTS) $(graph_align_la_LIBADD) $(LIBS)
 
 graph_cd.la: $(graph_cd_la_OBJECTS) $(graph_cd_la_DEPENDENCIES) $(EXTRA_graph_cd_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(graphdir) $(graph_cd_la_OBJECTS) $(graph_cd_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_graph_cd_la_rpath) $(graph_cd_la_OBJECTS) $(graph_cd_la_LIBADD) $(LIBS)
 
 graph_cut.la: $(graph_cut_la_OBJECTS) $(graph_cut_la_DEPENDENCIES) $(EXTRA_graph_cut_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(graphdir) $(graph_cut_la_OBJECTS) $(graph_cut_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_graph_cut_la_rpath) $(graph_cut_la_OBJECTS) $(graph_cut_la_LIBADD) $(LIBS)
 
 graph_dos_spectrum.la: $(graph_dos_spectrum_la_OBJECTS) $(graph_dos_spectrum_la_DEPENDENCIES) $(EXTRA_graph_dos_spectrum_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(graphdir) $(graph_dos_spectrum_la_OBJECTS) $(graph_dos_spectrum_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_graph_dos_spectrum_la_rpath) $(graph_dos_spectrum_la_OBJECTS) $(graph_dos_spectrum_la_LIBADD) $(LIBS)
 
 graph_export_ascii.la: $(graph_export_ascii_la_OBJECTS) $(graph_export_ascii_la_DEPENDENCIES) $(EXTRA_graph_export_ascii_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(graphdir) $(graph_export_ascii_la_OBJECTS) $(graph_export_ascii_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_graph_export_ascii_la_rpath) $(graph_export_ascii_la_OBJECTS) $(graph_export_ascii_la_LIBADD) $(LIBS)
 
 graph_export_bitmap.la: $(graph_export_bitmap_la_OBJECTS) $(graph_export_bitmap_la_DEPENDENCIES) $(EXTRA_graph_export_bitmap_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(graphdir) $(graph_export_bitmap_la_OBJECTS) $(graph_export_bitmap_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_graph_export_bitmap_la_rpath) $(graph_export_bitmap_la_OBJECTS) $(graph_export_bitmap_la_LIBADD) $(LIBS)
 
 graph_export_vector.la: $(graph_export_vector_la_OBJECTS) $(graph_export_vector_la_DEPENDENCIES) $(EXTRA_graph_export_vector_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(graphdir) $(graph_export_vector_la_OBJECTS) $(graph_export_vector_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_graph_export_vector_la_rpath) $(graph_export_vector_la_OBJECTS) $(graph_export_vector_la_LIBADD) $(LIBS)
 
 graph_fdfit.la: $(graph_fdfit_la_OBJECTS) $(graph_fdfit_la_DEPENDENCIES) $(EXTRA_graph_fdfit_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(graphdir) $(graph_fdfit_la_OBJECTS) $(graph_fdfit_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_graph_fdfit_la_rpath) $(graph_fdfit_la_OBJECTS) $(graph_fdfit_la_LIBADD) $(LIBS)
 
 graph_filter.la: $(graph_filter_la_OBJECTS) $(graph_filter_la_DEPENDENCIES) $(EXTRA_graph_filter_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(graphdir) $(graph_filter_la_OBJECTS) $(graph_filter_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_graph_filter_la_rpath) $(graph_filter_la_OBJECTS) $(graph_filter_la_LIBADD) $(LIBS)
 
 graph_fit.la: $(graph_fit_la_OBJECTS) $(graph_fit_la_DEPENDENCIES) $(EXTRA_graph_fit_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(graphdir) $(graph_fit_la_OBJECTS) $(graph_fit_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_graph_fit_la_rpath) $(graph_fit_la_OBJECTS) $(graph_fit_la_LIBADD) $(LIBS)
 
 graph_level.la: $(graph_level_la_OBJECTS) $(graph_level_la_DEPENDENCIES) $(EXTRA_graph_level_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(graphdir) $(graph_level_la_OBJECTS) $(graph_level_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_graph_level_la_rpath) $(graph_level_la_OBJECTS) $(graph_level_la_LIBADD) $(LIBS)
 
 graph_logscale.la: $(graph_logscale_la_OBJECTS) $(graph_logscale_la_DEPENDENCIES) $(EXTRA_graph_logscale_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(graphdir) $(graph_logscale_la_OBJECTS) $(graph_logscale_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_graph_logscale_la_rpath) $(graph_logscale_la_OBJECTS) $(graph_logscale_la_LIBADD) $(LIBS)
 
 graph_peaks.la: $(graph_peaks_la_OBJECTS) $(graph_peaks_la_DEPENDENCIES) $(EXTRA_graph_peaks_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(graphdir) $(graph_peaks_la_OBJECTS) $(graph_peaks_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_graph_peaks_la_rpath) $(graph_peaks_la_OBJECTS) $(graph_peaks_la_LIBADD) $(LIBS)
+
+graph_stats.la: $(graph_stats_la_OBJECTS) $(graph_stats_la_DEPENDENCIES) $(EXTRA_graph_stats_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_graph_stats_la_rpath) $(graph_stats_la_OBJECTS) $(graph_stats_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -660,9 +749,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_fdfit.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_filter.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_fit.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_la-graph.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_la-graph_align.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_la-graph_cd.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_la-graph_cut.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_la-graph_dos_spectrum.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_la-graph_export_ascii.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_la-graph_export_bitmap.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_la-graph_export_vector.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_la-graph_fdfit.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_la-graph_filter.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_la-graph_fit.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_la-graph_level.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_la-graph_logscale.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_la-graph_peaks.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_la-graph_stats.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_level.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_logscale.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_peaks.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/graph_stats.Plo at am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -685,6 +790,111 @@ distclean-compile:
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
+graph_la-graph_align.lo: graph_align.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -MT graph_la-graph_align.lo -MD -MP -MF $(DEPDIR)/graph_la-graph_align.Tpo -c -o graph_la-graph_align.lo `test -f 'graph_align.c' || echo '$(srcdir)/'`graph_align.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/graph_la-graph_align.Tpo $(DEPDIR)/graph_la-graph_align.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='graph_align.c' object='graph_la-graph_align.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -c -o graph_la-graph_align.lo `test -f 'graph_align.c' || echo '$(srcdir)/'`graph_align.c
+
+graph_la-graph_cd.lo: graph_cd.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -MT graph_la-graph_cd.lo -MD -MP -MF $(DEPDIR)/graph_la-graph_cd.Tpo -c -o graph_la-graph_cd.lo `test -f 'graph_cd.c' || echo '$(srcdir)/'`graph_cd.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/graph_la-graph_cd.Tpo $(DEPDIR)/graph_la-graph_cd.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='graph_cd.c' object='graph_la-graph_cd.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -c -o graph_la-graph_cd.lo `test -f 'graph_cd.c' || echo '$(srcdir)/'`graph_cd.c
+
+graph_la-graph_cut.lo: graph_cut.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -MT graph_la-graph_cut.lo -MD -MP -MF $(DEPDIR)/graph_la-graph_cut.Tpo -c -o graph_la-graph_cut.lo `test -f 'graph_cut.c' || echo '$(srcdir)/'`graph_cut.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/graph_la-graph_cut.Tpo $(DEPDIR)/graph_la-graph_cut.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='graph_cut.c' object='graph_la-graph_cut.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -c -o graph_la-graph_cut.lo `test -f 'graph_cut.c' || echo '$(srcdir)/'`graph_cut.c
+
+graph_la-graph_dos_spectrum.lo: graph_dos_spectrum.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -MT graph_la-graph_dos_spectrum.lo -MD -MP -MF $(DEPDIR)/graph_la-graph_dos_spectrum.Tpo -c -o graph_la-graph_dos_spectrum.lo `test -f 'graph_dos_spectrum.c' || echo '$(srcdir)/'`graph_dos_spectrum.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/graph_la-graph_dos_spectrum.Tpo $(DEPDIR)/graph_la-graph_dos_spectrum.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='graph_dos_spectrum.c' object='graph_la-graph_dos_spectrum.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -c -o graph_la-graph_dos_spectrum.lo `test -f 'graph_dos_spectrum.c' || echo '$(srcdir)/'`graph_dos_spectrum.c
+
+graph_la-graph_export_ascii.lo: graph_export_ascii.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -MT graph_la-graph_export_ascii.lo -MD -MP -MF $(DEPDIR)/graph_la-graph_export_ascii.Tpo -c -o graph_la-graph_export_ascii.lo `test -f 'graph_export_ascii.c' || echo '$(srcdir)/'`graph_export_ascii.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/graph_la-graph_export_ascii.Tpo $(DEPDIR)/graph_la-graph_export_ascii.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='graph_export_ascii.c' object='graph_la-graph_export_ascii.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -c -o graph_la-graph_export_ascii.lo `test -f 'graph_export_ascii.c' || echo '$(srcdir)/'`graph_export_ascii.c
+
+graph_la-graph_export_bitmap.lo: graph_export_bitmap.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -MT graph_la-graph_export_bitmap.lo -MD -MP -MF $(DEPDIR)/graph_la-graph_export_bitmap.Tpo -c -o graph_la-graph_export_bitmap.lo `test -f 'graph_export_bitmap.c' || echo '$(srcdir)/'`graph_export_bitmap.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/graph_la-graph_export_bitmap.Tpo $(DEPDIR)/graph_la-graph_export_bitmap.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='graph_export_bitmap.c' object='graph_la-graph_export_bitmap.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -c -o graph_la-graph_export_bitmap.lo `test -f 'graph_export_bitmap.c' || echo '$(srcdir)/'`graph_export_bitmap.c
+
+graph_la-graph_export_vector.lo: graph_export_vector.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -MT graph_la-graph_export_vector.lo -MD -MP -MF $(DEPDIR)/graph_la-graph_export_vector.Tpo -c -o graph_la-graph_export_vector.lo `test -f 'graph_export_vector.c' || echo '$(srcdir)/'`graph_export_vector.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/graph_la-graph_export_vector.Tpo $(DEPDIR)/graph_la-graph_export_vector.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='graph_export_vector.c' object='graph_la-graph_export_vector.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -c -o graph_la-graph_export_vector.lo `test -f 'graph_export_vector.c' || echo '$(srcdir)/'`graph_export_vector.c
+
+graph_la-graph_fdfit.lo: graph_fdfit.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -MT graph_la-graph_fdfit.lo -MD -MP -MF $(DEPDIR)/graph_la-graph_fdfit.Tpo -c -o graph_la-graph_fdfit.lo `test -f 'graph_fdfit.c' || echo '$(srcdir)/'`graph_fdfit.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/graph_la-graph_fdfit.Tpo $(DEPDIR)/graph_la-graph_fdfit.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='graph_fdfit.c' object='graph_la-graph_fdfit.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -c -o graph_la-graph_fdfit.lo `test -f 'graph_fdfit.c' || echo '$(srcdir)/'`graph_fdfit.c
+
+graph_la-graph_filter.lo: graph_filter.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -MT graph_la-graph_filter.lo -MD -MP -MF $(DEPDIR)/graph_la-graph_filter.Tpo -c -o graph_la-graph_filter.lo `test -f 'graph_filter.c' || echo '$(srcdir)/'`graph_filter.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/graph_la-graph_filter.Tpo $(DEPDIR)/graph_la-graph_filter.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='graph_filter.c' object='graph_la-graph_filter.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -c -o graph_la-graph_filter.lo `test -f 'graph_filter.c' || echo '$(srcdir)/'`graph_filter.c
+
+graph_la-graph_fit.lo: graph_fit.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -MT graph_la-graph_fit.lo -MD -MP -MF $(DEPDIR)/graph_la-graph_fit.Tpo -c -o graph_la-graph_fit.lo `test -f 'graph_fit.c' || echo '$(srcdir)/'`graph_fit.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/graph_la-graph_fit.Tpo $(DEPDIR)/graph_la-graph_fit.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='graph_fit.c' object='graph_la-graph_fit.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -c -o graph_la-graph_fit.lo `test -f 'graph_fit.c' || echo '$(srcdir)/'`graph_fit.c
+
+graph_la-graph_level.lo: graph_level.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -MT graph_la-graph_level.lo -MD -MP -MF $(DEPDIR)/graph_la-graph_level.Tpo -c -o graph_la-graph_level.lo `test -f 'graph_level.c' || echo '$(srcdir)/'`graph_level.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/graph_la-graph_level.Tpo $(DEPDIR)/graph_la-graph_level.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='graph_level.c' object='graph_la-graph_level.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -c -o graph_la-graph_level.lo `test -f 'graph_level.c' || echo '$(srcdir)/'`graph_level.c
+
+graph_la-graph_logscale.lo: graph_logscale.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -MT graph_la-graph_logscale.lo -MD -MP -MF $(DEPDIR)/graph_la-graph_logscale.Tpo -c -o graph_la-graph_logscale.lo `test -f 'graph_logscale.c' || echo '$(srcdir)/'`graph_logscale.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/graph_la-graph_logscale.Tpo $(DEPDIR)/graph_la-graph_logscale.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='graph_logscale.c' object='graph_la-graph_logscale.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -c -o graph_la-graph_logscale.lo `test -f 'graph_logscale.c' || echo '$(srcdir)/'`graph_logscale.c
+
+graph_la-graph_peaks.lo: graph_peaks.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -MT graph_la-graph_peaks.lo -MD -MP -MF $(DEPDIR)/graph_la-graph_peaks.Tpo -c -o graph_la-graph_peaks.lo `test -f 'graph_peaks.c' || echo '$(srcdir)/'`graph_peaks.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/graph_la-graph_peaks.Tpo $(DEPDIR)/graph_la-graph_peaks.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='graph_peaks.c' object='graph_la-graph_peaks.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -c -o graph_la-graph_peaks.lo `test -f 'graph_peaks.c' || echo '$(srcdir)/'`graph_peaks.c
+
+graph_la-graph_stats.lo: graph_stats.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -MT graph_la-graph_stats.lo -MD -MP -MF $(DEPDIR)/graph_la-graph_stats.Tpo -c -o graph_la-graph_stats.lo `test -f 'graph_stats.c' || echo '$(srcdir)/'`graph_stats.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/graph_la-graph_stats.Tpo $(DEPDIR)/graph_la-graph_stats.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='graph_stats.c' object='graph_la-graph_stats.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -c -o graph_la-graph_stats.lo `test -f 'graph_stats.c' || echo '$(srcdir)/'`graph_stats.c
+
+graph_la-graph.lo: graph.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -MT graph_la-graph.lo -MD -MP -MF $(DEPDIR)/graph_la-graph.Tpo -c -o graph_la-graph.lo `test -f 'graph.c' || echo '$(srcdir)/'`graph.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/graph_la-graph.Tpo $(DEPDIR)/graph_la-graph.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='graph.c' object='graph_la-graph.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(graph_la_CFLAGS) $(CFLAGS) -c -o graph_la-graph.lo `test -f 'graph.c' || echo '$(srcdir)/'`graph.c
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
@@ -774,13 +984,15 @@ distdir: $(DISTFILES)
 	  fi; \
 	done
 check-am: all-am
-check: check-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
 all-am: Makefile $(LTLIBRARIES)
 installdirs:
 	for dir in "$(DESTDIR)$(graphdir)"; do \
 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
-install: install-am
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
 install-exec: install-exec-am
 install-data: install-data-am
 uninstall: uninstall-am
@@ -810,6 +1022,7 @@ distclean-generic:
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
 clean: clean-am
 
 clean-am: clean-generic clean-graphLTLIBRARIES clean-libtool \
@@ -881,7 +1094,7 @@ ps-am:
 
 uninstall-am: uninstall-graphLTLIBRARIES
 
-.MAKE: install-am install-strip
+.MAKE: all check install install-am install-strip
 
 .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
 	clean-graphLTLIBRARIES clean-libtool clean-local cscopelist-am \
@@ -901,6 +1114,9 @@ uninstall-am: uninstall-graphLTLIBRARIES
 .PRECIOUS: Makefile
 
 
+graph.c: $(srcdir)/Makefile.am $(top_srcdir)/utils/gen-module-bundle.sh
+	$(SHELL) $(top_srcdir)/utils/gen-module-bundle.sh graph.c $(bundlable_modules)
+
 clean-local:
 	rm -f core.* *~
 
diff --git a/modules/graph/graph.c b/modules/graph/graph.c
new file mode 100644
index 0000000..ef7a8db
--- /dev/null
+++ b/modules/graph/graph.c
@@ -0,0 +1,52 @@
+/* This is a GENERATED file. */
+#include <glib.h>
+#include <libgwymodule/gwymodule.h>
+
+static const GwyModuleRecord* register_bundle(void);
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION | GWY_MODULE_BUNDLE_FLAG,
+    (GwyModuleRegisterFunc)&register_bundle,
+    NULL, NULL, NULL, NULL, NULL,
+};
+
+GWY_MODULE_QUERY(module_info)
+
+GwyModuleInfo* _gwy_module_query__graph_align(void);
+GwyModuleInfo* _gwy_module_query__graph_cd(void);
+GwyModuleInfo* _gwy_module_query__graph_cut(void);
+GwyModuleInfo* _gwy_module_query__graph_dos_spectrum(void);
+GwyModuleInfo* _gwy_module_query__graph_export_ascii(void);
+GwyModuleInfo* _gwy_module_query__graph_export_bitmap(void);
+GwyModuleInfo* _gwy_module_query__graph_export_vector(void);
+GwyModuleInfo* _gwy_module_query__graph_fdfit(void);
+GwyModuleInfo* _gwy_module_query__graph_filter(void);
+GwyModuleInfo* _gwy_module_query__graph_fit(void);
+GwyModuleInfo* _gwy_module_query__graph_level(void);
+GwyModuleInfo* _gwy_module_query__graph_logscale(void);
+GwyModuleInfo* _gwy_module_query__graph_peaks(void);
+GwyModuleInfo* _gwy_module_query__graph_stats(void);
+
+static const GwyModuleRecord modules[] = {
+  { _gwy_module_query__graph_align, "graph_align", },
+  { _gwy_module_query__graph_cd, "graph_cd", },
+  { _gwy_module_query__graph_cut, "graph_cut", },
+  { _gwy_module_query__graph_dos_spectrum, "graph_dos_spectrum", },
+  { _gwy_module_query__graph_export_ascii, "graph_export_ascii", },
+  { _gwy_module_query__graph_export_bitmap, "graph_export_bitmap", },
+  { _gwy_module_query__graph_export_vector, "graph_export_vector", },
+  { _gwy_module_query__graph_fdfit, "graph_fdfit", },
+  { _gwy_module_query__graph_filter, "graph_filter", },
+  { _gwy_module_query__graph_fit, "graph_fit", },
+  { _gwy_module_query__graph_level, "graph_level", },
+  { _gwy_module_query__graph_logscale, "graph_logscale", },
+  { _gwy_module_query__graph_peaks, "graph_peaks", },
+  { _gwy_module_query__graph_stats, "graph_stats", },
+  { NULL, NULL, },
+};
+
+static const GwyModuleRecord*
+register_bundle(void)
+{
+    return modules;
+}
diff --git a/modules/graph/graph_align.c b/modules/graph/graph_align.c
index b7270dc..9b50693 100644
--- a/modules/graph/graph_align.c
+++ b/modules/graph/graph_align.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: graph_align.c 18293 2016-02-18 23:46:53Z yeti-dn $
- *  Copyright (C) 2015 David Necas (Yeti).
+ *  @(#) $Id: graph_align.c 20068 2017-07-11 14:17:55Z yeti-dn $
+ *  Copyright (C) 2015-2017 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -23,6 +23,7 @@
 #include <stdlib.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
+#include <libprocess/correct.h>
 #include <libgwydgets/gwygraphmodel.h>
 #include <libgwydgets/gwystock.h>
 #include <libgwymodule/gwymodule-graph.h>
@@ -40,7 +41,9 @@ static void     align_two_curves(GwyGraphCurveModel *base,
 static gdouble  find_best_offset(const gdouble *a,
                                  gint na,
                                  const gdouble *b,
-                                 gint nb);
+                                 gint nb,
+                                 gint off_from,
+                                 gint off_to);
 static gdouble* regularise      (const PointXY *xydata,
                                  gint ndata,
                                  gdouble dx,
@@ -56,12 +59,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Aligns graph curves."),
     "Yeti <yeti at gwyddion.net>",
-    "1.1",
+    "1.2",
     "David Nečas (Yeti)",
     "2015",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, graph_align)
 
 static gboolean
 module_register(void)
@@ -165,8 +168,9 @@ align_two_curves(GwyGraphCurveModel *base,
 {
     PointXY *cxydata, *bxydata;
     gdouble *cline, *bline, *newcxdata, *newcydata;
-    gint cndata, bndata, cn, bn, i;
+    gint cndata, bndata, cn, bn, i, off_from, off_to;
     gdouble clen, dx, blen, off;
+    gboolean sane_dx = TRUE;
 
     bndata = gwy_graph_curve_model_get_ndata(base);
     bxydata = extract_xy_data(base);
@@ -183,6 +187,7 @@ align_two_curves(GwyGraphCurveModel *base,
      * without going insane. */
     dx = clen/120.0;
     if ((bxydata[bndata-1].x - bxydata[0].x)/dx > 1e5) {
+        sane_dx = FALSE;
         dx = 1e5/blen;
         if (clen/dx < cndata)
             return;
@@ -190,16 +195,36 @@ align_two_curves(GwyGraphCurveModel *base,
 
     bline = regularise(bxydata, bndata, dx, &bn);
     cline = regularise(cxydata, cndata, dx, &cn);
-    off = find_best_offset(cline, cn, bline, bn);
+
+    off_from = -((2*cn + 1)/5);
+    off_to = bn - (3*cn + 1)/5;
+    gwy_debug("regularised base n: %d, curve n: %d", bn, cn);
+    off = find_best_offset(bline, bn, cline, cn, off_from, off_to);
 
     g_free(bline);
     g_free(cline);
 
-    off = dx*off + (cxydata[0].x - bxydata[0].x);
+    /* Perform a second stage finer search when we have lots of points. */
+    if (sane_dx && bndata > 300 && cndata > 300 && bndata + cndata > 800) {
+        dx = clen/1200.0;
+        if ((bxydata[bndata-1].x - bxydata[0].x)/dx < 1e5) {
+            bline = regularise(bxydata, bndata, dx, &bn);
+            cline = regularise(cxydata, cndata, dx, &cn);
+
+            off_from = (gint)floor((off - 1)*10 - 1);
+            off_to = (gint)ceil((off + 1)*10 + 1);
+            off = find_best_offset(bline, bn, cline, cn, off_from, off_to);
+
+            g_free(bline);
+            g_free(cline);
+        }
+    }
+
+    off = dx*off + (bxydata[0].x - cxydata[0].x);
     newcxdata = g_new(gdouble, cndata);
     newcydata = g_new(gdouble, cndata);
     for (i = 0; i < cndata; i++) {
-        newcxdata[i] = cxydata[i].x - off;
+        newcxdata[i] = cxydata[i].x + off;
         newcydata[i] = cxydata[i].y;
     }
 
@@ -210,19 +235,20 @@ align_two_curves(GwyGraphCurveModel *base,
     g_free(bxydata);
 }
 
+/* Generally, @a should be the longer (base) curve, @b the shorter (being
+ * aligned) curve. */
 static gdouble
 find_best_offset(const gdouble *a, gint na,
-                 const gdouble *b, gint nb)
+                 const gdouble *b, gint nb,
+                 gint off_from, gint off_to)
 {
     gdouble scores[3] = { 0.0, 0.0, 0.0 };
     gdouble prev, score = G_MAXDOUBLE, bestscore = G_MAXDOUBLE;
-    gint off, off_from, off_to, bestoff = 0;
+    gint off, bestoff = 0;
     gdouble off0, subpixoff = 0.0;
 
     g_assert(nb > 4);
 
-    off_from = -((2*na + 1)/5);
-    off_to = na - (3*na + 1)/5;
     off0 = 0.5*(off_from + off_to);
 
     gwy_debug("off range [%d, %d]", off_from, off_to);
@@ -240,7 +266,7 @@ find_best_offset(const gdouble *a, gint na,
         if (off == bestoff+1) {
             scores[2] = score;
         }
-        /*g_printerr("%d %g\n", off, score);*/
+        //g_printerr("%d %g\n", off, score);
     }
 
     gwy_debug("best offset %d [%g %g %g]",
@@ -256,6 +282,9 @@ find_best_offset(const gdouble *a, gint na,
     return bestoff + subpixoff;
 }
 
+/* @boff is how much we move @b.  If @boff < 0 we move it to the left and
+ * if @boff > 0 we move it to the right.  If @boff = 0 then @a and @b left
+ * edges are aligned. */
 static gdouble
 difference_score(const gdouble *a, gint na,
                  const gdouble *b, gint nb,
@@ -281,7 +310,7 @@ difference_score(const gdouble *a, gint na,
     b += bfrom;
     for (i = 0; i < len; i++) {
         gdouble d = a[i] - b[i];
-        s += fabs(d);
+        s += d*d;
     }
 
     return s/len;
@@ -291,11 +320,14 @@ static gdouble*
 regularise(const PointXY *xydata, gint ndata, gdouble dx, gint *pn)
 {
     gint n = floor((xydata[ndata-1].x - xydata[0].x)/dx) + 1;
-    gint i, j, k, ic;
+    gint i, ic, nzero;
+    GwyDataLine *dline, *wline;
     gdouble *data, *weight;
 
-    data = g_new0(gdouble, n);
-    weight = g_new0(gdouble, n);
+    dline = gwy_data_line_new(n, n, TRUE);
+    wline = gwy_data_line_new(n, n, TRUE);
+    data = gwy_data_line_get_data(dline);
+    weight = gwy_data_line_get_data(wline);
     *pn = n;
 
     for (ic = 0; ic < ndata; ic++) {
@@ -306,42 +338,33 @@ regularise(const PointXY *xydata, gint ndata, gdouble dx, gint *pn)
         weight[i] += 1.0;
     }
 
+    nzero = 0;
     for (i = 0; i < n; i++) {
         if (weight[i])
             data[i] /= weight[i];
+        else
+            nzero++;
     }
     if (!weight[0]) {
         data[0] = xydata[0].y;
         weight[0] = 1.0;
+        nzero--;
     }
     if (!weight[n-1]) {
         data[n-1] = xydata[ndata-1].y;
         weight[n-1] = 1.0;
+        nzero--;
     }
 
-    i = 1;
-    while (i < n-1) {
-        gdouble yf, yt;
-
-        if (weight[i]) {
-            i++;
-            continue;
-        }
-
-        for (j = i+1; !weight[j]; j++)
-            ;
-
-        i--;
-        yf = xydata[i].y;
-        yt = xydata[j].y;
-        for (k = i; k < j; k++) {
-            data[k] = (yf*(j - k) + yt*(k - i))/(j - i);
-        }
-
-        i = j+1;
+    if (nzero) {
+        for (i = 0; i < n; i++)
+            weight[i] = (weight[i] <= 0.0);
+        gwy_data_line_correct_laplace(dline, wline);
     }
+    data = g_memdup(data, n*sizeof(gdouble));
 
-    g_free(weight);
+    g_object_unref(dline);
+    g_object_unref(wline);
 
     return data;
 }
diff --git a/modules/graph/graph_cd.c b/modules/graph/graph_cd.c
index 8fab4fd..a9ebff8 100644
--- a/modules/graph/graph_cd.c
+++ b/modules/graph/graph_cd.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: graph_cd.c 18290 2016-02-18 20:54:52Z yeti-dn $
+ *  @(#) $Id: graph_cd.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -140,7 +140,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, graph_cd)
 
 static gboolean
 module_register(void)
diff --git a/modules/graph/graph_cut.c b/modules/graph/graph_cut.c
index e98261d..24a7631 100644
--- a/modules/graph/graph_cut.c
+++ b/modules/graph/graph_cut.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: graph_cut.c 18953 2016-09-13 09:47:56Z yeti-dn $
+ *  @(#) $Id: graph_cut.c 19999 2017-06-29 21:48:28Z yeti-dn $
  *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -52,7 +52,6 @@ typedef struct {
     GtkWidget *from;
     GtkWidget *to;
     GtkWidget *curve;
-    GtkWidget *curve_label;
     GtkWidget *all;
 } CutControls;
 
@@ -92,7 +91,7 @@ static GwyModuleInfo module_info = {
     "2007",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, graph_cut)
 
 static gboolean
 module_register(void)
@@ -163,25 +162,19 @@ cut_dialog(CutArgs *args)
     row = 0;
 
     /* Curve to cut */
-    controls.curve_label = gtk_label_new_with_mnemonic(_("_Graph curve:"));
-    gtk_misc_set_alignment(GTK_MISC(controls.curve_label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), controls.curve_label,
-                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
-    controls.curve
-        = gwy_combo_box_graph_curve_new(G_CALLBACK(curve_changed), &controls,
-                                        gmodel, args->curve);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(controls.curve_label),
-                                  controls.curve);
-    gtk_table_attach(GTK_TABLE(table), controls.curve,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    controls.curve = gwy_combo_box_graph_curve_new(G_CALLBACK(curve_changed),
+                                                   &controls,
+                                                   gmodel, args->curve);
+    gwy_table_attach_adjbar(table, row, _("_Graph curve:"), NULL,
+                            GTK_OBJECT(controls.curve),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     controls.all = gtk_check_button_new_with_mnemonic(_("Cut _all curves"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.all),
                                                    args->all);
     gtk_table_attach(GTK_TABLE(table), controls.all,
-                     0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls.all, "toggled",
                      G_CALLBACK(all_changed), &controls);
     row++;
@@ -243,26 +236,12 @@ cut_dialog(CutArgs *args)
     pick_curves(&controls);
     update_sensitivity(&controls);
 
-    do {
-        response = gtk_dialog_run(GTK_DIALOG(dialog));
+    response = gtk_dialog_run(GTK_DIALOG(dialog));
+    if (response == GTK_RESPONSE_OK)
         cut_fetch_entry(&controls);
-        switch (response) {
-            case GTK_RESPONSE_CANCEL:
-            case GTK_RESPONSE_DELETE_EVENT:
-            gtk_widget_destroy(dialog);
-            return;
-            break;
-
-            case GTK_RESPONSE_OK:
-            do_cut(args);
-            gtk_widget_destroy(dialog);
-            break;
-
-            default:
-            g_assert_not_reached();
-            break;
-        }
-    } while (response != GTK_RESPONSE_OK);
+    gtk_widget_destroy(dialog);
+    if (response == GTK_RESPONSE_OK)
+        do_cut(args);
 }
 
 static void
@@ -411,7 +390,6 @@ graph_selected(GwySelection* selection,
 
 }
 
-
 static void
 range_changed(GtkWidget *entry,
               CutControls *controls)
@@ -491,8 +469,7 @@ update_sensitivity(CutControls *controls)
 {
     gboolean csens = !controls->args->all;
 
-    gtk_widget_set_sensitive(controls->curve, csens);
-    gtk_widget_set_sensitive(controls->curve_label, csens);
+    gwy_table_hscale_set_sensitive(GTK_OBJECT(controls->curve), csens);
 }
 
 static const gchar all_key[] = "/module/graph_cut/all";
diff --git a/modules/graph/graph_dos_spectrum.c b/modules/graph/graph_dos_spectrum.c
index c79e0d2..d4b5e7b 100644
--- a/modules/graph/graph_dos_spectrum.c
+++ b/modules/graph/graph_dos_spectrum.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: graph_dos_spectrum.c 18256 2016-02-05 19:53:16Z yeti-dn $
+ *  @(#) $Id: graph_dos_spectrum.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2010, David Necas (Yeti), Petr Klapetek, Daniil Bratashov
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, dn2010 at gmail.com
  *
@@ -46,7 +46,7 @@ static GwyModuleInfo module_info = {
     "2010",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, graph_dos_spectrum)
 
 static gboolean
 module_register(void)
diff --git a/modules/graph/graph_export_ascii.c b/modules/graph/graph_export_ascii.c
index 321fda2..8cc8493 100644
--- a/modules/graph/graph_export_ascii.c
+++ b/modules/graph/graph_export_ascii.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: graph_export_ascii.c 19205 2016-11-08 10:24:40Z yeti-dn $
+ *  @(#) $Id: graph_export_ascii.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2006,2014-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -67,7 +67,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, graph_export_ascii)
 
 static gboolean
 module_register(void)
diff --git a/modules/graph/graph_export_bitmap.c b/modules/graph/graph_export_bitmap.c
index ccf795f..7e20c69 100644
--- a/modules/graph/graph_export_bitmap.c
+++ b/modules/graph/graph_export_bitmap.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: graph_export_bitmap.c 18256 2016-02-05 19:53:16Z yeti-dn $
+ *  @(#) $Id: graph_export_bitmap.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -40,7 +40,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, graph_export_bitmap)
 
 static gboolean
 module_register(void)
diff --git a/modules/graph/graph_export_vector.c b/modules/graph/graph_export_vector.c
index 0f293cd..3e9cf7d 100644
--- a/modules/graph/graph_export_vector.c
+++ b/modules/graph/graph_export_vector.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: graph_export_vector.c 18234 2016-01-27 14:57:31Z yeti-dn $
+ *  @(#) $Id: graph_export_vector.c 20278 2017-08-14 15:11:19Z yeti-dn $
  *  Copyright (C) 2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -23,6 +23,7 @@
 #include <gtk/gtk.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwydgets/gwygraphmodel.h>
+#include <libgwydgets/gwystock.h>
 #include <libgwymodule/gwymodule-graph.h>
 #include <app/gwyapp.h>
 
@@ -39,7 +40,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, graph_export_vector)
 
 static gboolean
 module_register(void)
@@ -47,7 +48,7 @@ module_register(void)
     gwy_graph_func_register("graph_export_vector",
                             (GwyGraphFunc)&export,
                             N_("/Export _PostScript"),
-                            NULL,
+                            GWY_STOCK_GRAPH_EXPORT_VECTOR,
                             GWY_MENU_FLAG_GRAPH,
                             N_("Export graph to PostScript"));
 
diff --git a/modules/graph/graph_fdfit.c b/modules/graph/graph_fdfit.c
index 0aced03..61d0665 100644
--- a/modules/graph/graph_fdfit.c
+++ b/modules/graph/graph_fdfit.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: graph_fdfit.c 19147 2016-10-31 16:30:37Z yeti-dn $
- *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: graph_fdfit.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -44,6 +44,7 @@ enum {
     RESPONSE_FIT,
     RESPONSE_PLOT,
     RESPONSE_SAVE,
+    RESPONSE_COPY,
 };
 
 typedef struct {
@@ -167,12 +168,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Fit force-distance data"),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "1.4",
+    "1.5",
     "David Nečas (Yeti) & Petr Klapetek",
     "2007",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, graph_fdfit)
 
 static gboolean
 module_register(void)
@@ -229,6 +230,8 @@ fit_dialog(FitArgs *args)
     FitControls controls;
     gint response, row, ncurves;
     GString *report;
+    GtkClipboard *clipboard;
+    GdkDisplay *display;
     gdouble xmin, xmax;
 
     controls.args = args;
@@ -256,7 +259,11 @@ fit_dialog(FitArgs *args)
     gtk_dialog_add_button(GTK_DIALOG(dialog),
                           _("_Plot Inits"), RESPONSE_PLOT);
     gtk_dialog_add_button(GTK_DIALOG(dialog),
+                          GTK_STOCK_COPY, RESPONSE_COPY);
+    gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), RESPONSE_COPY, FALSE);
+    gtk_dialog_add_button(GTK_DIALOG(dialog),
                           GTK_STOCK_SAVE, RESPONSE_SAVE);
+    gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), RESPONSE_SAVE, FALSE);
     gtk_dialog_add_button(GTK_DIALOG(dialog),
                           GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
     gtk_dialog_add_button(GTK_DIALOG(dialog),
@@ -493,6 +500,15 @@ fit_dialog(FitArgs *args)
             g_string_free(report, TRUE);
             break;
 
+            case RESPONSE_COPY:
+            report = create_fit_report(args);
+            display = gtk_widget_get_display(dialog);
+            clipboard = gtk_clipboard_get_for_display(display,
+                                                      GDK_SELECTION_CLIPBOARD);
+            gtk_clipboard_set_text(clipboard, report->str, -1);
+            g_string_free(report, TRUE);
+            break;
+
             case RESPONSE_ESTIMATE:
             fit_estimate(&controls);
             break;
@@ -772,7 +788,7 @@ fit_do(FitControls *controls)
     for (i = 0; i < nparams; i++) {
         arg = &g_array_index(args->param, FitParamArg, i);
         arg->value = param[i];
-        arg->error = error[i];
+        arg->error = arg->fix ? 0.0 : error[i];
         fit_param_row_update_value(controls, i, errorknown);
     }
 
@@ -912,6 +928,8 @@ fit_set_state(FitControls *controls,
 
     gtk_dialog_set_response_sensitive(GTK_DIALOG(controls->dialog),
                                       RESPONSE_SAVE, is_fitted);
+    gtk_dialog_set_response_sensitive(GTK_DIALOG(controls->dialog),
+                                      RESPONSE_COPY, is_fitted);
 
     if (args->is_fitted && !is_fitted) {
         if (gwy_graph_model_get_n_curves(args->graph_model) == 2)
diff --git a/modules/graph/graph_filter.c b/modules/graph/graph_filter.c
index e47171a..c56feef 100644
--- a/modules/graph/graph_filter.c
+++ b/modules/graph/graph_filter.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: graph_filter.c 18262 2016-02-07 07:19:02Z yeti-dn $
+ *  @(#) $Id: graph_filter.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2012 David Necas (Yeti), Petr Klapetek,
  *  Daniil Bratashov.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, dn2010 at gmail.com.
@@ -44,7 +44,7 @@ static GwyModuleInfo module_info = {
     "2012",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, graph_filter)
 
 static gboolean
 module_register(void)
diff --git a/modules/graph/graph_fit.c b/modules/graph/graph_fit.c
index a43f862..7ae82a1 100644
--- a/modules/graph/graph_fit.c
+++ b/modules/graph/graph_fit.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: graph_fit.c 19147 2016-10-31 16:30:37Z yeti-dn $
- *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: graph_fit.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -44,6 +44,7 @@ enum {
     RESPONSE_FIT,
     RESPONSE_PLOT,
     RESPONSE_SAVE,
+    RESPONSE_COPY,
 };
 
 typedef struct {
@@ -180,12 +181,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Fit graph with function"),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "2.9",
+    "2.10",
     "David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, graph_fit)
 
 static gboolean
 module_register(void)
@@ -246,6 +247,8 @@ fit_dialog(FitArgs *args, GwyContainer *container)
     FitControls controls;
     gint response, row, ncurves;
     GString *report;
+    GtkClipboard *clipboard;
+    GdkDisplay *display;
     gdouble xmin, xmax;
 
     controls.args = args;
@@ -275,7 +278,11 @@ fit_dialog(FitArgs *args, GwyContainer *container)
     gtk_dialog_add_button(GTK_DIALOG(dialog),
                           _("_Plot Inits"), RESPONSE_PLOT);
     gtk_dialog_add_button(GTK_DIALOG(dialog),
+                          GTK_STOCK_COPY, RESPONSE_COPY);
+    gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), RESPONSE_COPY, FALSE);
+    gtk_dialog_add_button(GTK_DIALOG(dialog),
                           GTK_STOCK_SAVE, RESPONSE_SAVE);
+    gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), RESPONSE_SAVE, FALSE);
     gtk_dialog_add_button(GTK_DIALOG(dialog),
                           GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
     gtk_dialog_add_button(GTK_DIALOG(dialog),
@@ -533,6 +540,15 @@ fit_dialog(FitArgs *args, GwyContainer *container)
             g_string_free(report, TRUE);
             break;
 
+            case RESPONSE_COPY:
+            report = create_fit_report(args);
+            display = gtk_widget_get_display(dialog);
+            clipboard = gtk_clipboard_get_for_display(display,
+                                                      GDK_SELECTION_CLIPBOARD);
+            gtk_clipboard_set_text(clipboard, report->str, -1);
+            g_string_free(report, TRUE);
+            break;
+
             case RESPONSE_ESTIMATE:
             fit_estimate(&controls);
             break;
@@ -826,7 +842,7 @@ fit_do(FitControls *controls)
     for (i = 0; i < nparams; i++) {
         arg = &g_array_index(args->param, FitParamArg, i);
         arg->value = param[i];
-        arg->error = error[i];
+        arg->error = arg->fix ? 0.0 : error[i];
         fit_param_row_update_value(controls, i, errorknown);
     }
 
@@ -987,6 +1003,8 @@ fit_set_state(FitControls *controls,
 
     gtk_dialog_set_response_sensitive(GTK_DIALOG(controls->dialog),
                                       RESPONSE_SAVE, is_fitted);
+    gtk_dialog_set_response_sensitive(GTK_DIALOG(controls->dialog),
+                                      RESPONSE_COPY, is_fitted);
 
     if (args->is_fitted && !is_fitted) {
         if (gwy_graph_model_get_n_curves(args->graph_model) == 2)
diff --git a/modules/graph/graph_level.c b/modules/graph/graph_level.c
index 543298f..0b76e7d 100644
--- a/modules/graph/graph_level.c
+++ b/modules/graph/graph_level.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: graph_level.c 18262 2016-02-07 07:19:02Z yeti-dn $
+ *  @(#) $Id: graph_level.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -43,7 +43,7 @@ static GwyModuleInfo module_info = {
     "2005",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, graph_level)
 
 static gboolean
 module_register(void)
diff --git a/modules/graph/graph_logscale.c b/modules/graph/graph_logscale.c
index c1e8b35..ab1aef0 100644
--- a/modules/graph/graph_logscale.c
+++ b/modules/graph/graph_logscale.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: graph_logscale.c 19252 2016-11-14 08:43:05Z yeti-dn $
+ *  @(#) $Id: graph_logscale.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -83,7 +83,7 @@ static GwyModuleInfo module_info = {
     "2016",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, graph_logscale)
 
 static gboolean
 module_register(void)
diff --git a/modules/graph/graph_peaks.c b/modules/graph/graph_peaks.c
index 2776e43..43efd29 100644
--- a/modules/graph/graph_peaks.c
+++ b/modules/graph/graph_peaks.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: graph_peaks.c 19071 2016-10-14 09:02:41Z yeti-dn $
+ *  @(#) $Id: graph_peaks.c 19999 2017-06-29 21:48:28Z yeti-dn $
  *  Copyright (C) 2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -117,12 +117,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Finds peaks on graph curves."),
     "Yeti <yeti at gwyddion.net>",
-    "1.2",
+    "1.3",
     "David Nečas (Yeti)",
     "2016",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, graph_peaks)
 
 static gboolean
 module_register(void)
@@ -141,11 +141,9 @@ static void
 graph_peaks(GwyGraph *graph)
 {
     PeaksArgs args;
-    GwyGraphModel *parent_gmodel;
 
-    parent_gmodel = gwy_graph_get_model(graph);
     load_args(gwy_app_settings_get(), &args);
-    graph_peaks_dialogue(parent_gmodel, &args);
+    graph_peaks_dialogue(gwy_graph_get_model(graph), &args);
     save_args(gwy_app_settings_get(), &args);
 }
 
@@ -162,11 +160,11 @@ graph_peaks_dialogue(GwyGraphModel *parent_gmodel, PeaksArgs *args)
         { N_("Bilateral minimum"), GWY_PEAK_BACKGROUND_MMSTEP, },
     };
 
-    GtkWidget *dialogue, *hbox, *table, *label, *scwin, *hbox2, *button;
+    GtkWidget *dialogue, *hbox, *table, *scwin, *hbox2, *button;
     GwyGraphModel *gmodel;
     GwyGraphArea *area;
     PeaksControls controls;
-    gint response, row;
+    gint row;
 
     gwy_clear(&controls, 1);
     controls.args = args;
@@ -177,10 +175,9 @@ graph_peaks_dialogue(GwyGraphModel *parent_gmodel, PeaksArgs *args)
 
     dialogue = gtk_dialog_new_with_buttons(_("Graph Peaks"), NULL, 0, NULL);
     controls.dialogue = dialogue;
-    gtk_dialog_add_button(GTK_DIALOG(dialogue),
-                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
-    gtk_dialog_add_button(GTK_DIALOG(dialogue),
-                          GTK_STOCK_OK, GTK_RESPONSE_OK);
+    gtk_dialog_add_button(GTK_DIALOG(dialogue), GTK_STOCK_OK, GTK_RESPONSE_OK);
+    gtk_dialog_add_button(GTK_DIALOG(dialogue), GTK_STOCK_CANCEL,
+                          GTK_RESPONSE_CANCEL);
     gwy_help_add_to_graph_dialog(GTK_DIALOG(dialogue), GWY_HELP_DEFAULT);
     gtk_dialog_set_default_response(GTK_DIALOG(dialogue), GTK_RESPONSE_OK);
 
@@ -189,58 +186,44 @@ graph_peaks_dialogue(GwyGraphModel *parent_gmodel, PeaksArgs *args)
                        TRUE, TRUE, 0);
 
     /* Parameters */
-    table = gtk_table_new(6, 4, FALSE);
+    table = gtk_table_new(6, 2, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 0);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
     row = 0;
 
-    label = gtk_label_new_with_mnemonic(_("_Graph curve:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
-    controls.curve
-        = gwy_combo_box_graph_curve_new(G_CALLBACK(curve_changed), &controls,
-                                        parent_gmodel, args->curve);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.curve);
-    gtk_table_attach(GTK_TABLE(table), controls.curve,
-                     1, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    controls.curve = gwy_combo_box_graph_curve_new(G_CALLBACK(curve_changed),
+                                                   &controls,
+                                                   parent_gmodel, args->curve);
+    gwy_table_attach_adjbar(table, row, _("_Graph curve:"), NULL,
+                            GTK_OBJECT(controls.curve),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
-    label = gtk_label_new_with_mnemonic(_("_Background type:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
-    controls.background
-        = gwy_enum_combo_box_new(background_types,
-                                 G_N_ELEMENTS(background_types),
-                                 G_CALLBACK(background_changed), &controls,
-                                 args->background, TRUE);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.background);
-    gtk_table_attach(GTK_TABLE(table), controls.background,
-                     1, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    controls.background = gwy_enum_combo_box_new(background_types,
+                                                 G_N_ELEMENTS(background_types),
+                                                 G_CALLBACK(background_changed),
+                                                 &controls,
+                                                 args->background, TRUE);
+    gwy_table_attach_adjbar(table, row, _("_Background type:"), NULL,
+                            GTK_OBJECT(controls.background),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
-    label = gtk_label_new_with_mnemonic(_("Order peaks _by:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
-    controls.order
-        = gwy_enum_combo_box_new(order_types, G_N_ELEMENTS(order_types),
-                                 G_CALLBACK(order_changed), &controls,
-                                 args->order, TRUE);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.order);
-    gtk_table_attach(GTK_TABLE(table), controls.order,
-                     1, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    controls.order = gwy_enum_combo_box_new(order_types,
+                                            G_N_ELEMENTS(order_types),
+                                            G_CALLBACK(order_changed),
+                                            &controls,
+                                            args->order, TRUE);
+    gwy_table_attach_adjbar(table, row, _("Order peaks _by:"), NULL,
+                            GTK_OBJECT(controls.order),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     controls.npeaks = gtk_adjustment_new(args->npeaks, 1, 128, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("Number of _peaks:"), NULL,
-                            controls.npeaks, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("Number of _peaks:"), NULL,
+                            controls.npeaks, GWY_HSCALE_SQRT | GWY_HSCALE_SNAP);
     g_signal_connect(controls.npeaks, "value-changed",
                      G_CALLBACK(npeaks_changed), &controls);
     row++;
@@ -252,13 +235,12 @@ graph_peaks_dialogue(GwyGraphModel *parent_gmodel, PeaksArgs *args)
                                    GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
     gtk_container_add(GTK_CONTAINER(scwin), controls.peaklist);
     gtk_table_attach(GTK_TABLE(table), scwin,
-                     0, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
     row++;
 
     hbox2 = gtk_hbox_new(FALSE, 0);
     gtk_table_attach(GTK_TABLE(table), hbox2,
-                     0, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
 
     button = add_aux_button(hbox2, GTK_STOCK_SAVE, _("Save table to a file"));
     g_signal_connect_swapped(button, "clicked",
@@ -284,25 +266,8 @@ graph_peaks_dialogue(GwyGraphModel *parent_gmodel, PeaksArgs *args)
     curve_changed(GTK_COMBO_BOX(controls.curve), &controls);
 
     gtk_widget_show_all(dialogue);
-
-    do {
-        response = gtk_dialog_run(GTK_DIALOG(dialogue));
-        switch (response) {
-            case GTK_RESPONSE_CANCEL:
-            case GTK_RESPONSE_DELETE_EVENT:
-            gtk_widget_destroy(dialogue);
-            return;
-            break;
-
-            case GTK_RESPONSE_OK:
-            gtk_widget_destroy(dialogue);
-            break;
-
-            default:
-            g_assert_not_reached();
-            break;
-        }
-    } while (response != GTK_RESPONSE_OK);
+    gtk_dialog_run(GTK_DIALOG(dialogue));
+    gtk_widget_destroy(dialogue);
 
     g_array_free(controls.peaks_sorted, TRUE);
     g_array_free(controls.peaks, TRUE);
@@ -454,7 +419,6 @@ curve_changed(GtkComboBox *combo,
     g_object_set(controls->npeaks,
                  "upper", (gdouble)controls->peaks->len,
                  NULL);
-
 }
 
 static void
diff --git a/modules/graph/graph_stats.c b/modules/graph/graph_stats.c
new file mode 100644
index 0000000..068b6c6
--- /dev/null
+++ b/modules/graph/graph_stats.c
@@ -0,0 +1,953 @@
+/*
+ *  @(#) $Id: graph_stats.c 20004 2017-06-30 10:21:20Z yeti-dn $
+ *  Copyright (C) 2016 David Necas (Yeti).
+ *  E-mail: yeti at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <stdlib.h>
+#include <string.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libprocess/linestats.h>
+#include <libgwydgets/gwygraphmodel.h>
+#include <libgwydgets/gwycombobox.h>
+#include <libgwydgets/gwynullstore.h>
+#include <libgwydgets/gwystock.h>
+#include <libgwydgets/gwydgetutils.h>
+#include <libgwymodule/gwymodule-graph.h>
+#include <app/gwymoduleutils.h>
+#include <app/gwyapp.h>
+
+typedef struct {
+    const gchar *name;
+    gsize offset;
+} StatsLabel;
+
+typedef struct {
+    guint pos;
+    guint npts;
+
+    /* Valid from 1 points. */
+    gdouble min;
+    gdouble max;
+    gdouble avg;
+    gdouble median;
+    /* Valid from 2 points. */
+    gdouble ra;
+    gdouble rms;
+    gdouble skew;
+    gdouble kurtosis;
+    gdouble projlen;
+    gdouble length;
+    gdouble variation;
+    gdouble integralavg;
+    gdouble integral;
+    gdouble integralp;
+    gdouble integraln;
+    gdouble integral2;
+} StatsResults;
+
+typedef struct {
+    gint curve;
+    gdouble from;
+    gdouble to;
+} StatsArgs;
+
+typedef struct {
+    GwyGraphModel *parent_gmodel;
+    StatsArgs *args;
+    StatsResults stats;
+    GwySIValueFormat *xvf;
+    GwySIValueFormat *yvf;
+    GwySIValueFormat *areavf;
+    GwySIValueFormat *lenvf;
+    GwySIValueFormat *varvf;
+    gulong recalculate_id;
+
+    GtkWidget *dialogue;
+    GtkWidget *graph;
+    GtkWidget *curve;
+    GtkWidget *from;
+    GtkWidget *to;
+    GtkWidget *npts;
+
+    GtkWidget *min;
+    GtkWidget *max;
+    GtkWidget *avg;
+    GtkWidget *median;
+    GtkWidget *ra;
+    GtkWidget *rms;
+    GtkWidget *skew;
+    GtkWidget *kurtosis;
+    GtkWidget *projlen;
+    GtkWidget *length;
+    GtkWidget *variation;
+    GtkWidget *integralavg;
+    GtkWidget *integral;
+    GtkWidget *integralp;
+    GtkWidget *integraln;
+    GtkWidget *integral2;
+} StatsControls;
+
+static gboolean   module_register       (void);
+static void       graph_stats           (GwyGraph *graph);
+static void       graph_stats_dialogue  (GwyGraphModel *gmodel,
+                                         StatsArgs *args);
+static GtkWidget* add_aux_button        (GtkWidget *hbox,
+                                         const gchar *stock_id,
+                                         const gchar *tooltip);
+static void       curve_changed         (GtkComboBox *combo,
+                                         StatsControls *controls);
+static void       range_changed         (GtkWidget *entry,
+                                         StatsControls *controls);
+static void       stats_limit_selection (StatsControls *controls,
+                                         gboolean curve_switch);
+static void       stats_get_full_x_range(StatsControls *controls,
+                                         gdouble *xmin,
+                                         gdouble *xmax);
+static void       graph_selected        (GwySelection* selection,
+                                         gint i,
+                                         StatsControls *controls);
+static gboolean   update_stats_table    (gpointer user_data);
+static void       invalidate            (StatsControls *controls);
+static void       graph_stats_save      (StatsControls *controls);
+static void       graph_stats_copy      (StatsControls *controls);
+static gchar*     format_report         (StatsControls *controls);
+static void       compute_stats         (GwyGraphCurveModel *gcmodel,
+                                         StatsResults *stats,
+                                         gdouble from,
+                                         gdouble to);
+
+/* There are no presistent settings. */
+static const StatsArgs stats_defaults = {
+    0, -G_MAXDOUBLE, G_MAXDOUBLE,
+};
+
+/* NB: The order of the values is important for create_report()! */
+
+/* Simple values, disregarding abscissa */
+static const StatsLabel values_simple[] = {
+    { N_("Minimum:"),          G_STRUCT_OFFSET(StatsControls, min),         },
+    { N_("Maximum:"),          G_STRUCT_OFFSET(StatsControls, max),         },
+    { N_("Average value:"),    G_STRUCT_OFFSET(StatsControls, avg),         },
+    { N_("Median:"),           G_STRUCT_OFFSET(StatsControls, median),      },
+    { N_("Ra:"),               G_STRUCT_OFFSET(StatsControls, ra),          },
+    { N_("Rms (Rq):"),         G_STRUCT_OFFSET(StatsControls, rms),         },
+    { N_("Skew:"),             G_STRUCT_OFFSET(StatsControls, skew),        },
+    { N_("Kurtosis:"),         G_STRUCT_OFFSET(StatsControls, kurtosis),    },
+};
+
+/* Integrals */
+static const StatsLabel values_integral[] = {
+    { N_("Projected length:"), G_STRUCT_OFFSET(StatsControls, projlen),     },
+    { N_("Developed length:"), G_STRUCT_OFFSET(StatsControls, length),      },
+    { N_("Variation:"),        G_STRUCT_OFFSET(StatsControls, variation),   },
+    { N_("Average value:"),    G_STRUCT_OFFSET(StatsControls, integralavg), },
+    { N_("Area under curve:"), G_STRUCT_OFFSET(StatsControls, integral),    },
+    { N_("Positive area:"),    G_STRUCT_OFFSET(StatsControls, integralp),   },
+    { N_("Negative area:"),    G_STRUCT_OFFSET(StatsControls, integraln),   },
+    { N_("Root mean square:"), G_STRUCT_OFFSET(StatsControls, integral2),   },
+};
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION,
+    &module_register,
+    N_("Calculates simple graph curve statistics."),
+    "Yeti <yeti at gwyddion.net>",
+    "1.0",
+    "David Nečas (Yeti)",
+    "2017",
+};
+
+GWY_MODULE_QUERY2(module_info, graph_stats)
+
+static gboolean
+module_register(void)
+{
+    gwy_graph_func_register("graph_stats",
+                            (GwyGraphFunc)&graph_stats,
+                            N_("/_Statistics..."),
+                            NULL,
+                            GWY_MENU_FLAG_GRAPH,
+                            N_("Calculate graph curve statistics"));
+
+    return TRUE;
+}
+
+static void
+graph_stats(GwyGraph *graph)
+{
+    StatsArgs args = stats_defaults;
+
+    graph_stats_dialogue(gwy_graph_get_model(graph), &args);
+}
+
+/* This seems to be the safe way of doing things.  Calling g_source_remove()
+ * and gtk_widget_destroy() seems a race. */
+static void
+cancel_update(gpointer p, G_GNUC_UNUSED GObject *dialogue)
+{
+    gulong *sid = (gulong*)p;
+
+    if (*sid) {
+        g_source_remove(*sid);
+        *sid = 0;
+    }
+}
+
+static void
+graph_stats_dialogue(GwyGraphModel *parent_gmodel, StatsArgs *args)
+{
+    GtkWidget *dialogue, *hbox, *table, *hbox2, *button, *label;
+    GtkWidget **plabel;
+    GwyGraphArea *area;
+    GwyGraphModel *gmodel;
+    GwySelection *selection;
+    StatsControls controls;
+    gint row;
+    gdouble xrange, min, max;
+    GwySIUnit *xunit;
+    guint i;
+
+    gwy_clear(&controls, 1);
+    controls.args = args;
+    controls.parent_gmodel = parent_gmodel;
+    gmodel = gwy_graph_model_new_alike(parent_gmodel);
+
+    g_object_get(parent_gmodel, "si-unit-x", &xunit, NULL);
+    gwy_graph_model_get_x_range(parent_gmodel, &min, &max);
+    xrange = MAX(fabs(max), fabs(min));
+    controls.xvf
+        = gwy_si_unit_get_format_with_digits(xunit, GWY_SI_UNIT_FORMAT_VFMARKUP,
+                                             xrange, 3, NULL);
+    g_object_unref(xunit);
+
+    dialogue = gtk_dialog_new_with_buttons(_("Graph Statistics"),
+                                           NULL, 0, NULL);
+    controls.dialogue = dialogue;
+    gtk_dialog_add_button(GTK_DIALOG(dialogue), GTK_STOCK_OK, GTK_RESPONSE_OK);
+    gtk_dialog_add_button(GTK_DIALOG(dialogue), GTK_STOCK_CANCEL,
+                          GTK_RESPONSE_CANCEL);
+    gwy_help_add_to_graph_dialog(GTK_DIALOG(dialogue), GWY_HELP_DEFAULT);
+    gtk_dialog_set_default_response(GTK_DIALOG(dialogue), GTK_RESPONSE_OK);
+
+    hbox = gtk_hbox_new(FALSE, 2);
+    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), hbox,
+                       TRUE, TRUE, 0);
+
+    /* Parameters */
+    table = gtk_table_new(6
+                          + G_N_ELEMENTS(values_simple)
+                          + G_N_ELEMENTS(values_integral),
+                          2, FALSE);
+    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
+    gtk_table_set_col_spacings(GTK_TABLE(table), 6);
+    gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 0);
+    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
+    row = 0;
+
+    controls.curve = gwy_combo_box_graph_curve_new(G_CALLBACK(curve_changed),
+                                                   &controls,
+                                                   parent_gmodel, args->curve);
+    gwy_table_attach_adjbar(table, row, _("_Graph curve:"), NULL,
+                            GTK_OBJECT(controls.curve),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    row++;
+
+    /* Range */
+    hbox2 = gtk_hbox_new(FALSE, 6);
+    gtk_table_attach(GTK_TABLE(table), hbox2,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    row++;
+
+    label = gtk_label_new(_("Range:"));
+    gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
+
+    controls.from = gtk_entry_new();
+    g_object_set_data(G_OBJECT(controls.from), "id", (gpointer)"from");
+    gtk_entry_set_width_chars(GTK_ENTRY(controls.from), 8);
+    gtk_box_pack_start(GTK_BOX(hbox2), controls.from, FALSE, FALSE, 0);
+    g_signal_connect(controls.from, "activate",
+                     G_CALLBACK(range_changed), &controls);
+    gwy_widget_set_activate_on_unfocus(controls.from, TRUE);
+
+    label = gtk_label_new(gwy_sgettext("range|to"));
+    gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
+
+    controls.to = gtk_entry_new();
+    g_object_set_data(G_OBJECT(controls.to), "id", (gpointer)"to");
+    gtk_entry_set_width_chars(GTK_ENTRY(controls.to), 8);
+    gtk_box_pack_start(GTK_BOX(hbox2), controls.to, FALSE, FALSE, 0);
+    g_signal_connect(controls.to, "activate",
+                     G_CALLBACK(range_changed), &controls);
+    gwy_widget_set_activate_on_unfocus(controls.to, TRUE);
+
+    label = gtk_label_new(NULL);
+    gtk_label_set_markup(GTK_LABEL(label), controls.xvf->units);
+    gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
+
+    label = gtk_label_new(_("Number of points:"));
+    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+    gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1,
+                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+
+    controls.npts = gtk_label_new(NULL);
+    gtk_misc_set_alignment(GTK_MISC(controls.npts), 1.0, 0.5);
+    gtk_label_set_selectable(GTK_LABEL(controls.npts), TRUE);
+    gtk_table_attach(GTK_TABLE(table), controls.npts, 1, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
+    row++;
+
+    /* Results */
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    gtk_table_attach(GTK_TABLE(table),
+                     gwy_label_new_header(_("Simple Parameters")),
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    row++;
+
+    for (i = 0; i < G_N_ELEMENTS(values_simple); i++) {
+        label = gtk_label_new(_(values_simple[i].name));
+        gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+        gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1,
+                         GTK_EXPAND | GTK_FILL, 0, 0, 0);
+
+        plabel = (GtkWidget**)G_STRUCT_MEMBER_P(&controls,
+                                                values_simple[i].offset);
+        *plabel = gtk_label_new(NULL);
+        gtk_misc_set_alignment(GTK_MISC(*plabel), 1.0, 0.5);
+        gtk_label_set_selectable(GTK_LABEL(*plabel), TRUE);
+        gtk_table_attach(GTK_TABLE(table), *plabel, 1, 2, row, row+1,
+                         GTK_FILL, 0, 0, 0);
+
+        row++;
+    }
+
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Integrals")),
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    row++;
+
+    for (i = 0; i < G_N_ELEMENTS(values_integral); i++) {
+        label = gtk_label_new(_(values_integral[i].name));
+        gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+        gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1,
+                         GTK_EXPAND | GTK_FILL, 0, 0, 0);
+
+        plabel = (GtkWidget**)G_STRUCT_MEMBER_P(&controls,
+                                                values_integral[i].offset);
+        *plabel = gtk_label_new(NULL);
+        gtk_misc_set_alignment(GTK_MISC(*plabel), 1.0, 0.5);
+        gtk_label_set_selectable(GTK_LABEL(*plabel), TRUE);
+        gtk_table_attach(GTK_TABLE(table), *plabel, 1, 2, row, row+1,
+                         GTK_FILL, 0, 0, 0);
+
+        row++;
+    }
+
+    hbox2 = gtk_hbox_new(FALSE, 0);
+    gtk_table_attach(GTK_TABLE(table), hbox2,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+
+    button = add_aux_button(hbox2, GTK_STOCK_SAVE, _("Save table to a file"));
+    g_signal_connect_swapped(button, "clicked",
+                             G_CALLBACK(graph_stats_save), &controls);
+
+    button = add_aux_button(hbox2, GTK_STOCK_COPY, _("Copy table to clipboard"));
+    g_signal_connect_swapped(button, "clicked",
+                             G_CALLBACK(graph_stats_copy), &controls);
+    row++;
+
+    /* Graph */
+    controls.graph = gwy_graph_new(gmodel);
+    g_object_unref(gmodel);
+    gtk_widget_set_size_request(controls.graph, 400, 300);
+
+    gwy_graph_enable_user_input(GWY_GRAPH(controls.graph), FALSE);
+    gtk_box_pack_start(GTK_BOX(hbox), controls.graph, TRUE, TRUE, 0);
+    gwy_graph_set_status(GWY_GRAPH(controls.graph), GWY_GRAPH_STATUS_XSEL);
+
+    area = GWY_GRAPH_AREA(gwy_graph_get_area(GWY_GRAPH(controls.graph)));
+    selection = gwy_graph_area_get_selection(area, GWY_GRAPH_STATUS_XSEL);
+    gwy_selection_set_max_objects(selection, 1);
+    g_signal_connect(selection, "changed",
+                     G_CALLBACK(graph_selected), &controls);
+
+    curve_changed(GTK_COMBO_BOX(controls.curve), &controls);
+    graph_selected(selection, -1, &controls);
+
+    g_object_weak_ref(G_OBJECT(dialogue), cancel_update,
+                      &controls.recalculate_id);
+    gtk_widget_show_all(dialogue);
+    gtk_dialog_run(GTK_DIALOG(dialogue));
+    gtk_widget_destroy(dialogue);
+
+    gwy_si_unit_value_format_free(controls.xvf);
+    if (controls.yvf)
+        gwy_si_unit_value_format_free(controls.yvf);
+    if (controls.areavf)
+        gwy_si_unit_value_format_free(controls.areavf);
+    if (controls.lenvf)
+        gwy_si_unit_value_format_free(controls.lenvf);
+    if (controls.varvf)
+        gwy_si_unit_value_format_free(controls.varvf);
+}
+
+static GtkWidget*
+add_aux_button(GtkWidget *hbox,
+               const gchar *stock_id,
+               const gchar *tooltip)
+{
+    GtkTooltips *tips;
+    GtkWidget *button;
+
+    tips = gwy_app_get_tooltips();
+    button = gtk_button_new();
+    gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
+    gtk_tooltips_set_tip(tips, button, tooltip, NULL);
+    gtk_container_add(GTK_CONTAINER(button),
+                      gtk_image_new_from_stock(stock_id,
+                                               GTK_ICON_SIZE_SMALL_TOOLBAR));
+    gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+
+    return button;
+}
+
+static void
+curve_changed(GtkComboBox *combo, StatsControls *controls)
+{
+    StatsArgs *args = controls->args;
+    GwyGraphModel *gmodel;
+    GwyGraphCurveModel *gcmodel;
+
+    args->curve = gwy_enum_combo_box_get_active(combo);
+    gmodel = gwy_graph_get_model(GWY_GRAPH(controls->graph));
+    gwy_graph_model_remove_all_curves(gmodel);
+    gcmodel = gwy_graph_model_get_curve(controls->parent_gmodel, args->curve);
+    if (gwy_graph_curve_model_is_ordered(gcmodel))
+        gwy_graph_model_add_curve(gmodel, gcmodel);
+    else {
+        gcmodel = gwy_graph_curve_model_duplicate(gcmodel);
+        gwy_graph_curve_model_enforce_order(gcmodel);
+        gwy_graph_model_add_curve(gmodel, gcmodel);
+        g_object_unref(gcmodel);
+    }
+    invalidate(controls);
+}
+
+static void
+range_changed(GtkWidget *entry, StatsControls *controls)
+{
+    const gchar *id;
+    gdouble *x, newval;
+
+    id = g_object_get_data(G_OBJECT(entry), "id");
+    if (gwy_strequal(id, "from"))
+        x = &controls->args->from;
+    else
+        x = &controls->args->to;
+
+    newval = atof(gtk_entry_get_text(GTK_ENTRY(entry)));
+    newval *= controls->xvf->magnitude;
+    if (newval == *x)
+        return;
+    *x = newval;
+    stats_limit_selection(controls, FALSE);
+}
+
+static void
+stats_limit_selection(StatsControls *controls, gboolean curve_switch)
+{
+    GwySelection *selection;
+    GwyGraphArea *area;
+    gdouble xmin, xmax;
+
+    area = GWY_GRAPH_AREA(gwy_graph_get_area(GWY_GRAPH(controls->graph)));
+    selection = gwy_graph_area_get_selection(area, GWY_GRAPH_STATUS_XSEL);
+
+    if (curve_switch && !gwy_selection_get_data(selection, NULL)) {
+        graph_selected(selection, -1, controls);
+        return;
+    }
+
+    stats_get_full_x_range(controls, &xmin, &xmax);
+    controls->args->from = CLAMP(controls->args->from, xmin, xmax);
+    controls->args->to = CLAMP(controls->args->to, xmin, xmax);
+
+    if (controls->args->from == xmin && controls->args->to == xmax)
+        gwy_selection_clear(selection);
+    else {
+        gdouble range[2];
+
+        range[0] = controls->args->from;
+        range[1] = controls->args->to;
+        gwy_selection_set_object(selection, 0, range);
+    }
+}
+
+static void
+stats_get_full_x_range(StatsControls *controls,
+                       gdouble *xmin, gdouble *xmax)
+{
+    GwyGraphModel *gmodel;
+    GwyGraphCurveModel *gcmodel;
+
+    gmodel = gwy_graph_get_model(GWY_GRAPH(controls->graph));
+    gcmodel = gwy_graph_model_get_curve(gmodel, 0);
+    gwy_graph_curve_model_get_x_range(gcmodel, xmin, xmax);
+}
+
+static void
+graph_selected(GwySelection* selection,
+               gint i,
+               StatsControls *controls)
+{
+    GwySIValueFormat *xvf = controls->xvf;
+    StatsArgs *args;
+    gchar buffer[24];
+    gdouble range[2];
+    gint nselections;
+    gdouble power10;
+
+    g_return_if_fail(i <= 0);
+
+    args = controls->args;
+    nselections = gwy_selection_get_data(selection, NULL);
+    gwy_selection_get_object(selection, 0, range);
+
+    if (nselections <= 0 || range[0] == range[1])
+        stats_get_full_x_range(controls, &args->from, &args->to);
+    else {
+        args->from = MIN(range[0], range[1]);
+        args->to = MAX(range[0], range[1]);
+    }
+    power10 = pow10(xvf->precision);
+    g_snprintf(buffer, sizeof(buffer), "%.*f",
+               xvf->precision,
+               floor(args->from*power10/xvf->magnitude)/power10);
+    gtk_entry_set_text(GTK_ENTRY(controls->from), buffer);
+    g_snprintf(buffer, sizeof(buffer), "%.*f",
+               xvf->precision,
+               ceil(args->to*power10/xvf->magnitude)/power10);
+    gtk_entry_set_text(GTK_ENTRY(controls->to), buffer);
+
+    invalidate(controls);
+}
+
+static void
+invalidate(StatsControls *controls)
+{
+    if (controls->recalculate_id)
+        return;
+
+    controls->recalculate_id = g_idle_add(update_stats_table, controls);
+}
+
+static void
+update_label(GwySIValueFormat *units,
+             GtkWidget *label,
+             gdouble value)
+{
+    static gchar buffer[64];
+
+    g_return_if_fail(units);
+    g_return_if_fail(GTK_IS_LABEL(label));
+
+    g_snprintf(buffer, sizeof(buffer), "%.*f%s%s",
+               units->precision, value/units->magnitude,
+               *units->units ? " " : "", units->units);
+    gtk_label_set_markup(GTK_LABEL(label), buffer);
+}
+
+static gboolean
+update_stats_table(gpointer user_data)
+{
+    StatsControls *controls = (StatsControls*)user_data;
+    StatsArgs *args = controls->args;
+    StatsResults *stats = &controls->stats;
+    GwyGraphModel *gmodel;
+    GwyGraphCurveModel *gcmodel;
+    GwySIUnit *xunit = NULL, *yunit = NULL, *areaunit = NULL;
+    gboolean same_units;
+    gchar buffer[64];
+
+    gmodel = gwy_graph_get_model(GWY_GRAPH(controls->graph));
+    gcmodel = gwy_graph_model_get_curve(gmodel, 0);
+    compute_stats(gcmodel, &controls->stats, args->from, args->to);
+
+    g_snprintf(buffer, sizeof(buffer), "%u", stats->npts);
+    gtk_label_set_text(GTK_LABEL(controls->npts), buffer);
+
+    if (stats->npts < 2) {
+        gtk_label_set_text(GTK_LABEL(controls->ra), NULL);
+        gtk_label_set_text(GTK_LABEL(controls->rms), NULL);
+        gtk_label_set_text(GTK_LABEL(controls->skew), NULL);
+        gtk_label_set_text(GTK_LABEL(controls->kurtosis), NULL);
+        gtk_label_set_text(GTK_LABEL(controls->projlen), NULL);
+        gtk_label_set_text(GTK_LABEL(controls->length), NULL);
+        gtk_label_set_text(GTK_LABEL(controls->variation), NULL);
+        gtk_label_set_text(GTK_LABEL(controls->integralavg), NULL);
+        gtk_label_set_text(GTK_LABEL(controls->integral), NULL);
+        gtk_label_set_text(GTK_LABEL(controls->integralp), NULL);
+        gtk_label_set_text(GTK_LABEL(controls->integraln), NULL);
+        gtk_label_set_text(GTK_LABEL(controls->integral2), NULL);
+    }
+
+    if (stats->npts < 1) {
+        gtk_label_set_text(GTK_LABEL(controls->min), NULL);
+        gtk_label_set_text(GTK_LABEL(controls->max), NULL);
+        gtk_label_set_text(GTK_LABEL(controls->avg), NULL);
+        gtk_label_set_text(GTK_LABEL(controls->median), NULL);
+        goto finish;
+    }
+
+    g_object_get(gmodel,
+                 "si-unit-x", &xunit,
+                 "si-unit-y", &yunit,
+                 NULL);
+    same_units = gwy_si_unit_equal(xunit, yunit);
+    areaunit = gwy_si_unit_multiply(xunit, yunit, NULL);
+
+    controls->yvf
+        = gwy_si_unit_get_format_with_digits(yunit, GWY_SI_UNIT_FORMAT_VFMARKUP,
+                                             MAX(fabs(stats->min),
+                                                 fabs(stats->max)),
+                                             3, controls->yvf);
+    controls->areavf
+        = gwy_si_unit_get_format_with_digits(areaunit,
+                                             GWY_SI_UNIT_FORMAT_VFMARKUP,
+                                             MAX(fabs(stats->integralp),
+                                                 fabs(stats->integraln)),
+                                             3, controls->areavf);
+    controls->lenvf
+        = gwy_si_unit_get_format_with_digits(xunit,
+                                             GWY_SI_UNIT_FORMAT_VFMARKUP,
+                                             stats->length, 3, controls->lenvf);
+    controls->varvf
+        = gwy_si_unit_get_format_with_digits(xunit,
+                                             GWY_SI_UNIT_FORMAT_VFMARKUP,
+                                             stats->variation,
+                                             3, controls->varvf);
+
+    update_label(controls->yvf, controls->min, stats->min);
+    update_label(controls->yvf, controls->max, stats->max);
+    update_label(controls->yvf, controls->avg, stats->avg);
+    update_label(controls->yvf, controls->median, stats->median);
+    update_label(controls->yvf, controls->rms, stats->rms);
+    update_label(controls->yvf, controls->ra, stats->ra);
+
+    g_snprintf(buffer, sizeof(buffer), "%.3g", stats->skew);
+    gtk_label_set_text(GTK_LABEL(controls->skew), buffer);
+    g_snprintf(buffer, sizeof(buffer), "%.3g", stats->kurtosis);
+    gtk_label_set_text(GTK_LABEL(controls->kurtosis), buffer);
+
+    update_label(controls->xvf, controls->projlen, stats->projlen);
+    if (same_units)
+        update_label(controls->lenvf, controls->length, stats->length);
+    else
+        gtk_label_set_text(GTK_LABEL(controls->length), _("N.A."));
+
+    update_label(controls->varvf, controls->variation, stats->variation);
+    update_label(controls->yvf, controls->integralavg, stats->integralavg);
+    update_label(controls->areavf, controls->integral, stats->integral);
+    update_label(controls->areavf, controls->integralp, stats->integralp);
+    update_label(controls->areavf, controls->integraln, stats->integraln);
+    update_label(controls->yvf, controls->integral2, stats->integral2);
+
+finish:
+    GWY_OBJECT_UNREF(areaunit);
+    GWY_OBJECT_UNREF(yunit);
+    GWY_OBJECT_UNREF(xunit);
+
+    controls->recalculate_id = 0;
+    return FALSE;
+}
+
+static void
+graph_stats_save(StatsControls *controls)
+{
+    gchar *text = format_report(controls);
+
+    gwy_save_auxiliary_data(_("Save Curve Statistics"),
+                            GTK_WINDOW(controls->dialogue),
+                            -1, text);
+    g_free(text);
+}
+
+static void
+graph_stats_copy(StatsControls *controls)
+{
+    GtkClipboard *clipboard;
+    GdkDisplay *display;
+    gchar *text = format_report(controls);
+
+    display = gtk_widget_get_display(controls->dialogue);
+    clipboard = gtk_clipboard_get_for_display(display, GDK_SELECTION_CLIPBOARD);
+    gtk_clipboard_set_text(clipboard, text, -1);
+    g_free(text);
+}
+
+static void
+append_report_line_label(GString *report, const gchar *label, guint width)
+{
+    guint len = g_utf8_strlen(label, -1);
+
+    g_string_append(report, label);
+    while (len++ < width)
+        g_string_append_c(report, ' ');
+}
+
+static void
+append_report_line_vf(GString *report, const gchar *label, gdouble value,
+                      GwySIValueFormat *vf, guint width)
+{
+    append_report_line_label(report, label, width);
+    g_string_append_printf(report, "%.*f%s%s\n",
+                           vf->precision + 1, value/vf->magnitude,
+                           *vf->units ? " " : "", vf->units);
+}
+
+static void
+append_report_line_plain(GString *report, const gchar *label, gdouble value,
+                         const gchar *format, guint width)
+{
+    append_report_line_label(report, label, width);
+    g_string_append_printf(report, format, value);
+    g_string_append_c(report, '\n');
+}
+
+static gchar*
+format_report(StatsControls *controls)
+{
+    StatsResults *stats = &controls->stats;
+    StatsArgs *args = controls->args;
+    const StatsLabel *labels;
+    GString *report = g_string_new(NULL);
+    GwySIValueFormat *xvf, *yvf, *areavf, *lenvf, *varvf;
+    GwySIUnit *xunit = NULL, *yunit = NULL, *areaunit = NULL;
+    GwyGraphModel *gmodel = gwy_graph_get_model(GWY_GRAPH(controls->graph));
+    GwyGraphCurveModel *gcmodel;
+    gdouble xrange, min, max;
+    gboolean same_units;
+    guint maxw, i;
+
+    if (controls->recalculate_id) {
+        gcmodel = gwy_graph_model_get_curve(gmodel, 0);
+        g_source_remove(controls->recalculate_id);
+        controls->recalculate_id = 0;
+        compute_stats(gcmodel, &controls->stats, args->from, args->to);
+    }
+
+    maxw = g_utf8_strlen(_("Number of points:"), -1);
+    labels = values_simple;
+    for (i = 0; i < G_N_ELEMENTS(values_simple); i++) {
+        guint len = g_utf8_strlen(_(labels[i].name), -1);
+        maxw = MAX(maxw, len);
+    }
+    labels = values_integral;
+    for (i = 0; i < G_N_ELEMENTS(values_integral); i++) {
+        guint len = g_utf8_strlen(_(labels[i].name), -1);
+        maxw = MAX(maxw, len);
+    }
+    maxw++;
+
+    g_object_get(gmodel,
+                 "si-unit-x", &xunit,
+                 "si-unit-y", &yunit,
+                 NULL);
+    same_units = gwy_si_unit_equal(xunit, yunit);
+    areaunit = gwy_si_unit_multiply(xunit, yunit, NULL);
+
+    gwy_graph_model_get_x_range(gmodel, &min, &max);
+    xrange = MAX(fabs(max), fabs(min));
+    xvf = gwy_si_unit_get_format_with_digits(xunit, GWY_SI_UNIT_FORMAT_PLAIN,
+                                             xrange, 3, NULL);
+    yvf = gwy_si_unit_get_format_with_digits(yunit, GWY_SI_UNIT_FORMAT_PLAIN,
+                                             MAX(fabs(stats->min),
+                                                 fabs(stats->max)), 3, NULL);
+    areavf = gwy_si_unit_get_format_with_digits(areaunit,
+                                                GWY_SI_UNIT_FORMAT_PLAIN,
+                                                MAX(fabs(stats->integralp),
+                                                    fabs(stats->integraln)),
+                                                3, NULL);
+    lenvf = gwy_si_unit_get_format_with_digits(xunit, GWY_SI_UNIT_FORMAT_PLAIN,
+                                               stats->length, 3, NULL);
+    varvf = gwy_si_unit_get_format_with_digits(xunit, GWY_SI_UNIT_FORMAT_PLAIN,
+                                               stats->variation, 3, NULL);
+
+    append_report_line_label(report, _("Range:"), maxw);
+    g_string_append_printf(report, "%.*f %s %.*f %s\n",
+                           xvf->precision, args->from/xvf->magnitude,
+                           gwy_sgettext("range|to"),
+                           xvf->precision, args->to/xvf->magnitude,
+                           xvf->units);
+
+    append_report_line_plain(report, _("Number of points:"), stats->npts,
+                             "%.0f", maxw);
+    g_string_append_c(report, '\n');
+
+    if (stats->npts < 1)
+        goto finish;
+
+    append_report_line_label(report, _("Simple Parameters"), maxw);
+    g_string_append_c(report, '\n');
+
+    labels = values_simple;
+    append_report_line_vf(report, _(labels[0].name), stats->min, yvf, maxw);
+    append_report_line_vf(report, _(labels[1].name), stats->max, yvf, maxw);
+    append_report_line_vf(report, _(labels[2].name), stats->avg, yvf, maxw);
+    append_report_line_vf(report, _(labels[3].name), stats->median, yvf, maxw);
+    if (stats->npts < 2)
+        goto finish;
+
+    append_report_line_vf(report, _(labels[4].name), stats->ra, yvf, maxw);
+    append_report_line_vf(report, _(labels[5].name), stats->rms, yvf, maxw);
+    append_report_line_plain(report, _(labels[6].name),
+                             stats->skew, "%.4g", maxw);
+    append_report_line_plain(report, _(labels[7].name),
+                             stats->kurtosis, "%.4g", maxw);
+    g_string_append_c(report, '\n');
+
+    append_report_line_label(report, _("Integrals"), maxw);
+    g_string_append_c(report, '\n');
+
+    labels = values_integral;
+    append_report_line_vf(report, _(labels[0].name), stats->projlen, xvf, maxw);
+    if (same_units) {
+        append_report_line_vf(report, _(labels[1].name), stats->length,
+                              lenvf, maxw);
+    }
+    append_report_line_vf(report, _(labels[2].name), stats->variation,
+                          varvf, maxw);
+    append_report_line_vf(report, _(labels[3].name), stats->integralavg,
+                          yvf, maxw);
+    append_report_line_vf(report, _(labels[4].name), stats->integral,
+                          areavf, maxw);
+    append_report_line_vf(report, _(labels[5].name), stats->integralp,
+                          areavf, maxw);
+    append_report_line_vf(report, _(labels[6].name), stats->integraln,
+                          areavf, maxw);
+    append_report_line_vf(report, _(labels[7].name), stats->integral2,
+                          controls->yvf, maxw);
+
+finish:
+    g_object_unref(xunit);
+    g_object_unref(yunit);
+    g_object_unref(areaunit);
+    gwy_si_unit_value_format_free(xvf);
+    gwy_si_unit_value_format_free(yvf);
+    gwy_si_unit_value_format_free(areavf);
+    gwy_si_unit_value_format_free(lenvf);
+    gwy_si_unit_value_format_free(varvf);
+
+    return g_string_free(report, FALSE);
+}
+
+static void
+compute_stats(GwyGraphCurveModel *gcmodel,
+              StatsResults *stats,
+              gdouble from, gdouble to)
+{
+    GwyDataLine *dline;
+    const gdouble *xdata, *ydata;
+    guint ndata, i, pos, len;
+
+    gwy_clear(stats, 1);
+    xdata = gwy_graph_curve_model_get_xdata(gcmodel);
+    ydata = gwy_graph_curve_model_get_ydata(gcmodel);
+    ndata = gwy_graph_curve_model_get_ndata(gcmodel);
+
+    for (pos = 0; pos < ndata && xdata[pos] < from; pos++)
+        pos++;
+    for (len = ndata; len && xdata[len-1] > to; len--)
+        len--;
+
+    if (len <= pos)
+        return;
+
+    len -= pos;
+    stats->pos = pos;
+    stats->npts = len;
+
+    /* Calculate simple quantities only depending on the value distribution
+     * using DataLine methods. */
+    dline = gwy_data_line_new(len, 1.0, FALSE);
+    gwy_assign(gwy_data_line_get_data(dline), ydata + pos, len);
+    gwy_data_line_get_min_max(dline, &stats->min, &stats->max);
+    stats->avg = gwy_data_line_get_avg(dline);
+    stats->median = gwy_data_line_get_median(dline);
+    if (len > 1) {
+        stats->rms = gwy_data_line_get_rms(dline);
+        stats->ra = gwy_data_line_get_ra(dline);
+        stats->skew = gwy_data_line_get_skew(dline);
+        stats->kurtosis = gwy_data_line_get_kurtosis(dline);
+    }
+    g_object_unref(dline);
+    if (len < 2)
+        return;
+
+    stats->projlen = xdata[pos + len-1] - xdata[pos];
+    for (i = 0; i < len-1; i++) {
+        gdouble y1 = ydata[pos + i], y2 = ydata[pos + i+1];
+        gdouble dx = xdata[pos + i+1] - xdata[pos + i];
+        gdouble x, dpos = 0.0, dneg = 0.0, d2 = 0.0;
+
+        stats->length += sqrt((y2 - y1)*(y2 - y1) + dx*dx);
+        stats->variation += fabs(y2 - y1);
+        if (dx <= 0.0)
+            continue;
+
+        if (y1 >= 0.0 && y2 >= 0.0) {
+            dpos = (y1 + y2)*dx;
+            d2 = (y1*y1 + y2*y2)*dx;
+        }
+        else if (y1 <= 0.0 && y2 <= 0.0) {
+            dneg = (y1 + y2)*dx;
+            d2 = (y1*y1 + y2*y2)*dx;
+        }
+        else if (y1 > 0.0 && y2 < 0.0) {
+            x = y1/(y1 - y2)*dx;
+            dpos = y1*x;
+            dneg = y2*(dx - x);
+            d2 = (y1*y1*x + y2*y2*(dx - x));
+        }
+        else if (y1 < 0.0 && y2 > 0.0) {
+            x = y2/(y2 - y1)*dx;
+            dpos = y2*x;
+            dneg = y1*(dx - x);
+            d2 = (y1*y1*(dx - x) + y2*y2*x);
+        }
+        else {
+            g_warning("Impossible curve value signs.");
+            continue;
+        }
+        stats->integralp += dpos;
+        stats->integraln += dneg;
+        stats->integral += dpos + dneg;
+        stats->integral2 += d2;
+    }
+
+    stats->integralp *= 0.5;
+    stats->integraln *= 0.5;
+    stats->integral *= 0.5;
+    stats->integral2 *= 0.5;
+    stats->integralavg = stats->integral/stats->projlen;
+    stats->integral2 = sqrt(stats->integral2/stats->projlen);
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/layer/Makefile.am b/modules/layer/Makefile.am
index e38333d..bef554b 100644
--- a/modules/layer/Makefile.am
+++ b/modules/layer/Makefile.am
@@ -1,8 +1,11 @@
-# @(#) $Id: Makefile.am 18127 2016-01-19 15:51:06Z yeti-dn $
+# @(#) $Id: Makefile.am 20001 2017-06-29 21:52:24Z yeti-dn $
 
 layerdir = $(pkglibdir)/modules/layer
 
-layer_LTLIBRARIES = \
+# Only bundle modules without own dependencies.  If something goes wrong with
+# any required libraries at run-time, it will at most break these individual
+# unbundled modules, not the bundle.
+bundlable_modules = \
 	axis.la \
 	ellipse.la \
 	lattice.la \
@@ -11,6 +14,18 @@ layer_LTLIBRARIES = \
 	point.la \
 	rectangle.la
 
+# layer_modules is either the bundle or all the individual modules.
+if MODULE_BUNDLING
+layer_modules = layer.la
+BUILT_SOURCES = layer.c
+layer_la_CFLAGS = $(AM_CFLAGS) -DGWY_MODULE_BUNDLING
+else
+layer_modules = $(bundlable_modules)
+endif
+
+layer_LTLIBRARIES = \
+	$(layer_modules)
+
 noinst_HEADERS = \
 	layer.h
 
@@ -18,10 +33,6 @@ if OS_MSWIN
 no_undefined = -no-undefined
 endif
 
-AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
-AM_CFLAGS = @COMMON_CFLAGS@
-AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
-
 if MODULE_DEPENDENCIES
 module_libadd = \
 	$(top_builddir)/app/libgwyapp2.la \
@@ -33,6 +44,11 @@ module_libadd = \
 	@GTK_LIBS@
 endif
 
+AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
+AM_CFLAGS = @COMMON_CFLAGS@
+AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
+
+# Bundlable modules, must be listed in layer_la_SOURCES below.
 axis_la_SOURCES =      axis.c
 ellipse_la_SOURCES =   ellipse.c
 lattice_la_SOURCES =   lattice.c
@@ -41,5 +57,21 @@ path_la_SOURCES =      path.c
 point_la_SOURCES =     point.c
 rectangle_la_SOURCES = rectangle.c
 
+layer_la_SOURCES = \
+	$(axis_la_SOURCES) \
+	$(ellipse_la_SOURCES) \
+	$(lattice_la_SOURCES) \
+	$(line_la_SOURCES) \
+	$(path_la_SOURCES) \
+	$(point_la_SOURCES) \
+	$(rectangle_la_SOURCES) \
+	layer.h \
+	layer.c
+
+layer.c: $(srcdir)/Makefile.am $(top_srcdir)/utils/gen-module-bundle.sh
+	$(SHELL) $(top_srcdir)/utils/gen-module-bundle.sh layer.c $(bundlable_modules)
+
+CLEAN_FILES = layer.c
+
 clean-local:
 	rm -f core.* *~
diff --git a/modules/layer/Makefile.in b/modules/layer/Makefile.in
index d15f693..b3177a8 100644
--- a/modules/layer/Makefile.in
+++ b/modules/layer/Makefile.in
@@ -14,7 +14,7 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 18127 2016-01-19 15:51:06Z yeti-dn $
+# @(#) $Id: Makefile.am 20001 2017-06-29 21:52:24Z yeti-dn $
 
 
 VPATH = @srcdir@
@@ -147,24 +147,47 @@ AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
+ at MODULE_BUNDLING_FALSE@am_axis_la_rpath = -rpath $(layerdir)
 ellipse_la_LIBADD =
 am_ellipse_la_OBJECTS = ellipse.lo
 ellipse_la_OBJECTS = $(am_ellipse_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_ellipse_la_rpath = -rpath $(layerdir)
 lattice_la_LIBADD =
 am_lattice_la_OBJECTS = lattice.lo
 lattice_la_OBJECTS = $(am_lattice_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_lattice_la_rpath = -rpath $(layerdir)
+layer_la_LIBADD =
+am__objects_1 = layer_la-axis.lo
+am__objects_2 = layer_la-ellipse.lo
+am__objects_3 = layer_la-lattice.lo
+am__objects_4 = layer_la-line.lo
+am__objects_5 = layer_la-path.lo
+am__objects_6 = layer_la-point.lo
+am__objects_7 = layer_la-rectangle.lo
+am_layer_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
+	$(am__objects_3) $(am__objects_4) $(am__objects_5) \
+	$(am__objects_6) $(am__objects_7) layer_la-layer.lo
+layer_la_OBJECTS = $(am_layer_la_OBJECTS)
+layer_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(layer_la_CFLAGS) \
+	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+ at MODULE_BUNDLING_TRUE@am_layer_la_rpath = -rpath $(layerdir)
 line_la_LIBADD =
 am_line_la_OBJECTS = line.lo
 line_la_OBJECTS = $(am_line_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_line_la_rpath = -rpath $(layerdir)
 path_la_LIBADD =
 am_path_la_OBJECTS = path.lo
 path_la_OBJECTS = $(am_path_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_path_la_rpath = -rpath $(layerdir)
 point_la_LIBADD =
 am_point_la_OBJECTS = point.lo
 point_la_OBJECTS = $(am_point_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_point_la_rpath = -rpath $(layerdir)
 rectangle_la_LIBADD =
 am_rectangle_la_OBJECTS = rectangle.lo
 rectangle_la_OBJECTS = $(am_rectangle_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_rectangle_la_rpath = -rpath $(layerdir)
 AM_V_P = $(am__v_P_ at AM_V@)
 am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -200,11 +223,11 @@ am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
 SOURCES = $(axis_la_SOURCES) $(ellipse_la_SOURCES) \
-	$(lattice_la_SOURCES) $(line_la_SOURCES) $(path_la_SOURCES) \
-	$(point_la_SOURCES) $(rectangle_la_SOURCES)
+	$(lattice_la_SOURCES) $(layer_la_SOURCES) $(line_la_SOURCES) \
+	$(path_la_SOURCES) $(point_la_SOURCES) $(rectangle_la_SOURCES)
 DIST_SOURCES = $(axis_la_SOURCES) $(ellipse_la_SOURCES) \
-	$(lattice_la_SOURCES) $(line_la_SOURCES) $(path_la_SOURCES) \
-	$(point_la_SOURCES) $(rectangle_la_SOURCES)
+	$(lattice_la_SOURCES) $(layer_la_SOURCES) $(line_la_SOURCES) \
+	$(path_la_SOURCES) $(point_la_SOURCES) $(rectangle_la_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -271,10 +294,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -284,6 +304,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -308,7 +330,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -366,6 +390,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -374,17 +399,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -470,7 +491,11 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 layerdir = $(pkglibdir)/modules/layer
-layer_LTLIBRARIES = \
+
+# Only bundle modules without own dependencies.  If something goes wrong with
+# any required libraries at run-time, it will at most break these individual
+# unbundled modules, not the bundle.
+bundlable_modules = \
 	axis.la \
 	ellipse.la \
 	lattice.la \
@@ -479,13 +504,19 @@ layer_LTLIBRARIES = \
 	point.la \
 	rectangle.la
 
+ at MODULE_BUNDLING_FALSE@layer_modules = $(bundlable_modules)
+
+# layer_modules is either the bundle or all the individual modules.
+ at MODULE_BUNDLING_TRUE@layer_modules = layer.la
+ at MODULE_BUNDLING_TRUE@BUILT_SOURCES = layer.c
+ at MODULE_BUNDLING_TRUE@layer_la_CFLAGS = $(AM_CFLAGS) -DGWY_MODULE_BUNDLING
+layer_LTLIBRARIES = \
+	$(layer_modules)
+
 noinst_HEADERS = \
 	layer.h
 
 @OS_MSWIN_TRUE at no_undefined = -no-undefined
-AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
-AM_CFLAGS = @COMMON_CFLAGS@
-AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
 @MODULE_DEPENDENCIES_TRUE at module_libadd = \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/app/libgwyapp2.la \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libdraw/libgwydraw2.la \
@@ -495,6 +526,11 @@ AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libprocess/libgwyprocess2.la \
 @MODULE_DEPENDENCIES_TRUE@	@GTK_LIBS@
 
+AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
+AM_CFLAGS = @COMMON_CFLAGS@
+AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
+
+# Bundlable modules, must be listed in layer_la_SOURCES below.
 axis_la_SOURCES = axis.c
 ellipse_la_SOURCES = ellipse.c
 lattice_la_SOURCES = lattice.c
@@ -502,7 +538,20 @@ line_la_SOURCES = line.c
 path_la_SOURCES = path.c
 point_la_SOURCES = point.c
 rectangle_la_SOURCES = rectangle.c
-all: all-am
+layer_la_SOURCES = \
+	$(axis_la_SOURCES) \
+	$(ellipse_la_SOURCES) \
+	$(lattice_la_SOURCES) \
+	$(line_la_SOURCES) \
+	$(path_la_SOURCES) \
+	$(point_la_SOURCES) \
+	$(rectangle_la_SOURCES) \
+	layer.h \
+	layer.c
+
+CLEAN_FILES = layer.c
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
 
 .SUFFIXES:
 .SUFFIXES: .c .lo .o .obj
@@ -572,25 +621,28 @@ clean-layerLTLIBRARIES:
 	}
 
 axis.la: $(axis_la_OBJECTS) $(axis_la_DEPENDENCIES) $(EXTRA_axis_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(layerdir) $(axis_la_OBJECTS) $(axis_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_axis_la_rpath) $(axis_la_OBJECTS) $(axis_la_LIBADD) $(LIBS)
 
 ellipse.la: $(ellipse_la_OBJECTS) $(ellipse_la_DEPENDENCIES) $(EXTRA_ellipse_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(layerdir) $(ellipse_la_OBJECTS) $(ellipse_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_ellipse_la_rpath) $(ellipse_la_OBJECTS) $(ellipse_la_LIBADD) $(LIBS)
 
 lattice.la: $(lattice_la_OBJECTS) $(lattice_la_DEPENDENCIES) $(EXTRA_lattice_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(layerdir) $(lattice_la_OBJECTS) $(lattice_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_lattice_la_rpath) $(lattice_la_OBJECTS) $(lattice_la_LIBADD) $(LIBS)
+
+layer.la: $(layer_la_OBJECTS) $(layer_la_DEPENDENCIES) $(EXTRA_layer_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(layer_la_LINK) $(am_layer_la_rpath) $(layer_la_OBJECTS) $(layer_la_LIBADD) $(LIBS)
 
 line.la: $(line_la_OBJECTS) $(line_la_DEPENDENCIES) $(EXTRA_line_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(layerdir) $(line_la_OBJECTS) $(line_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_line_la_rpath) $(line_la_OBJECTS) $(line_la_LIBADD) $(LIBS)
 
 path.la: $(path_la_OBJECTS) $(path_la_DEPENDENCIES) $(EXTRA_path_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(layerdir) $(path_la_OBJECTS) $(path_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_path_la_rpath) $(path_la_OBJECTS) $(path_la_LIBADD) $(LIBS)
 
 point.la: $(point_la_OBJECTS) $(point_la_DEPENDENCIES) $(EXTRA_point_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(layerdir) $(point_la_OBJECTS) $(point_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_point_la_rpath) $(point_la_OBJECTS) $(point_la_LIBADD) $(LIBS)
 
 rectangle.la: $(rectangle_la_OBJECTS) $(rectangle_la_DEPENDENCIES) $(EXTRA_rectangle_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(layerdir) $(rectangle_la_OBJECTS) $(rectangle_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_rectangle_la_rpath) $(rectangle_la_OBJECTS) $(rectangle_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -601,6 +653,14 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/axis.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ellipse.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/lattice.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/layer_la-axis.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/layer_la-ellipse.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/layer_la-lattice.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/layer_la-layer.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/layer_la-line.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/layer_la-path.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/layer_la-point.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/layer_la-rectangle.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/line.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/path.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/point.Plo at am__quote@
@@ -627,6 +687,62 @@ distclean-compile:
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
+layer_la-axis.lo: axis.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(layer_la_CFLAGS) $(CFLAGS) -MT layer_la-axis.lo -MD -MP -MF $(DEPDIR)/layer_la-axis.Tpo -c -o layer_la-axis.lo `test -f 'axis.c' || echo '$(srcdir)/'`axis.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/layer_la-axis.Tpo $(DEPDIR)/layer_la-axis.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='axis.c' object='layer_la-axis.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(layer_la_CFLAGS) $(CFLAGS) -c -o layer_la-axis.lo `test -f 'axis.c' || echo '$(srcdir)/'`axis.c
+
+layer_la-ellipse.lo: ellipse.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(layer_la_CFLAGS) $(CFLAGS) -MT layer_la-ellipse.lo -MD -MP -MF $(DEPDIR)/layer_la-ellipse.Tpo -c -o layer_la-ellipse.lo `test -f 'ellipse.c' || echo '$(srcdir)/'`ellipse.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/layer_la-ellipse.Tpo $(DEPDIR)/layer_la-ellipse.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ellipse.c' object='layer_la-ellipse.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(layer_la_CFLAGS) $(CFLAGS) -c -o layer_la-ellipse.lo `test -f 'ellipse.c' || echo '$(srcdir)/'`ellipse.c
+
+layer_la-lattice.lo: lattice.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(layer_la_CFLAGS) $(CFLAGS) -MT layer_la-lattice.lo -MD -MP -MF $(DEPDIR)/layer_la-lattice.Tpo -c -o layer_la-lattice.lo `test -f 'lattice.c' || echo '$(srcdir)/'`lattice.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/layer_la-lattice.Tpo $(DEPDIR)/layer_la-lattice.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lattice.c' object='layer_la-lattice.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(layer_la_CFLAGS) $(CFLAGS) -c -o layer_la-lattice.lo `test -f 'lattice.c' || echo '$(srcdir)/'`lattice.c
+
+layer_la-line.lo: line.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(layer_la_CFLAGS) $(CFLAGS) -MT layer_la-line.lo -MD -MP -MF $(DEPDIR)/layer_la-line.Tpo -c -o layer_la-line.lo `test -f 'line.c' || echo '$(srcdir)/'`line.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/layer_la-line.Tpo $(DEPDIR)/layer_la-line.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='line.c' object='layer_la-line.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(layer_la_CFLAGS) $(CFLAGS) -c -o layer_la-line.lo `test -f 'line.c' || echo '$(srcdir)/'`line.c
+
+layer_la-path.lo: path.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(layer_la_CFLAGS) $(CFLAGS) -MT layer_la-path.lo -MD -MP -MF $(DEPDIR)/layer_la-path.Tpo -c -o layer_la-path.lo `test -f 'path.c' || echo '$(srcdir)/'`path.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/layer_la-path.Tpo $(DEPDIR)/layer_la-path.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='path.c' object='layer_la-path.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(layer_la_CFLAGS) $(CFLAGS) -c -o layer_la-path.lo `test -f 'path.c' || echo '$(srcdir)/'`path.c
+
+layer_la-point.lo: point.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(layer_la_CFLAGS) $(CFLAGS) -MT layer_la-point.lo -MD -MP -MF $(DEPDIR)/layer_la-point.Tpo -c -o layer_la-point.lo `test -f 'point.c' || echo '$(srcdir)/'`point.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/layer_la-point.Tpo $(DEPDIR)/layer_la-point.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='point.c' object='layer_la-point.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(layer_la_CFLAGS) $(CFLAGS) -c -o layer_la-point.lo `test -f 'point.c' || echo '$(srcdir)/'`point.c
+
+layer_la-rectangle.lo: rectangle.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(layer_la_CFLAGS) $(CFLAGS) -MT layer_la-rectangle.lo -MD -MP -MF $(DEPDIR)/layer_la-rectangle.Tpo -c -o layer_la-rectangle.lo `test -f 'rectangle.c' || echo '$(srcdir)/'`rectangle.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/layer_la-rectangle.Tpo $(DEPDIR)/layer_la-rectangle.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='rectangle.c' object='layer_la-rectangle.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(layer_la_CFLAGS) $(CFLAGS) -c -o layer_la-rectangle.lo `test -f 'rectangle.c' || echo '$(srcdir)/'`rectangle.c
+
+layer_la-layer.lo: layer.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(layer_la_CFLAGS) $(CFLAGS) -MT layer_la-layer.lo -MD -MP -MF $(DEPDIR)/layer_la-layer.Tpo -c -o layer_la-layer.lo `test -f 'layer.c' || echo '$(srcdir)/'`layer.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/layer_la-layer.Tpo $(DEPDIR)/layer_la-layer.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='layer.c' object='layer_la-layer.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(layer_la_CFLAGS) $(CFLAGS) -c -o layer_la-layer.lo `test -f 'layer.c' || echo '$(srcdir)/'`layer.c
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
@@ -716,13 +832,15 @@ distdir: $(DISTFILES)
 	  fi; \
 	done
 check-am: all-am
-check: check-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
 all-am: Makefile $(LTLIBRARIES) $(HEADERS)
 installdirs:
 	for dir in "$(DESTDIR)$(layerdir)"; do \
 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
-install: install-am
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
 install-exec: install-exec-am
 install-data: install-data-am
 uninstall: uninstall-am
@@ -752,6 +870,7 @@ distclean-generic:
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
 clean: clean-am
 
 clean-am: clean-generic clean-layerLTLIBRARIES clean-libtool \
@@ -823,7 +942,7 @@ ps-am:
 
 uninstall-am: uninstall-layerLTLIBRARIES
 
-.MAKE: install-am install-strip
+.MAKE: all check install install-am install-strip
 
 .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
 	clean-layerLTLIBRARIES clean-libtool clean-local cscopelist-am \
@@ -843,6 +962,9 @@ uninstall-am: uninstall-layerLTLIBRARIES
 .PRECIOUS: Makefile
 
 
+layer.c: $(srcdir)/Makefile.am $(top_srcdir)/utils/gen-module-bundle.sh
+	$(SHELL) $(top_srcdir)/utils/gen-module-bundle.sh layer.c $(bundlable_modules)
+
 clean-local:
 	rm -f core.* *~
 
diff --git a/modules/layer/axis.c b/modules/layer/axis.c
index b66a1fa..4ccfdbe 100644
--- a/modules/layer/axis.c
+++ b/modules/layer/axis.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: axis.c 17612 2015-10-19 12:54:58Z yeti-dn $
+ *  @(#) $Id: axis.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -147,7 +147,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, axis)
 
 G_DEFINE_TYPE_EXTENDED
     (GwySelectionAxis, gwy_selection_axis, GWY_TYPE_SELECTION, 0,
diff --git a/modules/layer/ellipse.c b/modules/layer/ellipse.c
index 1b5919b..7be0811 100644
--- a/modules/layer/ellipse.c
+++ b/modules/layer/ellipse.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: ellipse.c 17612 2015-10-19 12:54:58Z yeti-dn $
+ *  @(#) $Id: ellipse.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2005-2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -147,7 +147,7 @@ static GwyModuleInfo module_info = {
     "2005",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, ellipse)
 
 G_DEFINE_TYPE(GwySelectionEllipse, gwy_selection_ellipse,
               GWY_TYPE_SELECTION)
diff --git a/modules/layer/lattice.c b/modules/layer/lattice.c
index 8486a20..87c7898 100644
--- a/modules/layer/lattice.c
+++ b/modules/layer/lattice.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: lattice.c 15691 2013-12-02 00:07:14Z yeti-dn $
+ *  @(#) $Id: lattice.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2013 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -130,7 +130,7 @@ static GwyModuleInfo module_info = {
     "2013",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, lattice)
 
 G_DEFINE_TYPE(GwySelectionLattice, gwy_selection_lattice, GWY_TYPE_SELECTION)
 G_DEFINE_TYPE(GwyLayerLattice, gwy_layer_lattice, GWY_TYPE_VECTOR_LAYER)
diff --git a/modules/layer/layer.c b/modules/layer/layer.c
new file mode 100644
index 0000000..0d34054
--- /dev/null
+++ b/modules/layer/layer.c
@@ -0,0 +1,38 @@
+/* This is a GENERATED file. */
+#include <glib.h>
+#include <libgwymodule/gwymodule.h>
+
+static const GwyModuleRecord* register_bundle(void);
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION | GWY_MODULE_BUNDLE_FLAG,
+    (GwyModuleRegisterFunc)&register_bundle,
+    NULL, NULL, NULL, NULL, NULL,
+};
+
+GWY_MODULE_QUERY(module_info)
+
+GwyModuleInfo* _gwy_module_query__axis(void);
+GwyModuleInfo* _gwy_module_query__ellipse(void);
+GwyModuleInfo* _gwy_module_query__lattice(void);
+GwyModuleInfo* _gwy_module_query__line(void);
+GwyModuleInfo* _gwy_module_query__path(void);
+GwyModuleInfo* _gwy_module_query__point(void);
+GwyModuleInfo* _gwy_module_query__rectangle(void);
+
+static const GwyModuleRecord modules[] = {
+  { _gwy_module_query__axis, "axis", },
+  { _gwy_module_query__ellipse, "ellipse", },
+  { _gwy_module_query__lattice, "lattice", },
+  { _gwy_module_query__line, "line", },
+  { _gwy_module_query__path, "path", },
+  { _gwy_module_query__point, "point", },
+  { _gwy_module_query__rectangle, "rectangle", },
+  { NULL, NULL, },
+};
+
+static const GwyModuleRecord*
+register_bundle(void)
+{
+    return modules;
+}
diff --git a/modules/layer/line.c b/modules/layer/line.c
index a8e5d87..f821959 100644
--- a/modules/layer/line.c
+++ b/modules/layer/line.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: line.c 18148 2016-01-21 16:26:38Z yeti-dn $
+ *  @(#) $Id: line.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2008 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -181,7 +181,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, line)
 
 G_DEFINE_TYPE(GwySelectionLine, gwy_selection_line, GWY_TYPE_SELECTION)
 G_DEFINE_TYPE(GwyLayerLine, gwy_layer_line, GWY_TYPE_VECTOR_LAYER)
diff --git a/modules/layer/path.c b/modules/layer/path.c
index b61350e..a25399c 100644
--- a/modules/layer/path.c
+++ b/modules/layer/path.c
@@ -175,7 +175,7 @@ static GwyModuleInfo module_info = {
     "2016",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, path)
 
 G_DEFINE_TYPE_EXTENDED
     (GwySelectionPath, gwy_selection_path, GWY_TYPE_SELECTION, 0,
diff --git a/modules/layer/point.c b/modules/layer/point.c
index 13b898a..8654ab2 100644
--- a/modules/layer/point.c
+++ b/modules/layer/point.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: point.c 18234 2016-01-27 14:57:31Z yeti-dn $
+ *  @(#) $Id: point.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -174,7 +174,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, point)
 
 G_DEFINE_TYPE(GwySelectionPoint, gwy_selection_point, GWY_TYPE_SELECTION)
 G_DEFINE_TYPE(GwyLayerPoint, gwy_layer_point, GWY_TYPE_VECTOR_LAYER)
diff --git a/modules/layer/rectangle.c b/modules/layer/rectangle.c
index 748c520..0677b6e 100644
--- a/modules/layer/rectangle.c
+++ b/modules/layer/rectangle.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: rectangle.c 17612 2015-10-19 12:54:58Z yeti-dn $
+ *  @(#) $Id: rectangle.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -151,7 +151,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, rectangle)
 
 G_DEFINE_TYPE(GwySelectionRectangle, gwy_selection_rectangle,
               GWY_TYPE_SELECTION)
diff --git a/modules/process/Makefile.am b/modules/process/Makefile.am
index bbf62fd..4ba03f8 100644
--- a/modules/process/Makefile.am
+++ b/modules/process/Makefile.am
@@ -1,4 +1,4 @@
-# @(#) $Id: Makefile.am 18853 2016-08-17 19:14:16Z yeti-dn $
+# @(#) $Id: Makefile.am 20104 2017-07-29 09:23:41Z yeti-dn $
 
 # Put sources that are for some reason disabled yet present in svn checkouts
 # here.  This makes them distributed and translations of their messages are
@@ -9,7 +9,10 @@ disabled_sources = \
 
 processdir = $(pkglibdir)/modules/process
 
-process_LTLIBRARIES = \
+# Only bundle modules without own dependencies.  If something goes wrong with
+# any required libraries at run-time, it will at most break these individual
+# unbundled modules, not the bundle.
+bundlable_modules = \
 	acf2d.la \
 	angle_dist.la \
 	arithmetic.la \
@@ -46,6 +49,7 @@ process_LTLIBRARIES = \
 	fft_filter_2d.la \
 	fft_profile.la \
 	fft_synth.la \
+	fibre_synth.la \
 	fit-shape.la \
 	flatten_base.la \
 	fraccor.la \
@@ -77,22 +81,31 @@ process_LTLIBRARIES = \
 	mask_distribute.la \
 	mask_edt.la \
 	mask_morph.la \
+	mask_noisify.la \
 	maskops.la \
 	mcrop.la \
 	measure_lattice.la \
 	median-bg.la \
 	merge.la \
+	mfm_current.la \
+	mfm_field.la \
+	mfm_findshift.la \
+	mfm_parallel.la \
+	mfm_shift.la \
 	neural.la \
 	noise_synth.la \
 	obj_synth.la \
 	otsu_threshold.la \
 	outliers.la \
 	pat_synth.la \
+	phase_synth.la \
 	pid.la \
 	polylevel.la \
 	polydistort.la \
 	presentationops.la \
 	psdf_logphi.la \
+	psf.la \
+	psf-fit.la \
 	rank.la \
 	rotate.la \
 	semsim.la \
@@ -101,6 +114,7 @@ process_LTLIBRARIES = \
 	shade.la \
 	slope_dist.la \
 	sphere-revolve.la \
+	stitch.la \
 	straighten_path.la \
 	threshold.la \
 	tilt.la \
@@ -115,6 +129,18 @@ process_LTLIBRARIES = \
 	xydenoise.la \
 	xyzize.la
 
+# process_modules is either the bundle or all the individual modules.
+if MODULE_BUNDLING
+process_modules = process.la
+BUILT_SOURCES = process.c
+process_la_CFLAGS = $(AM_CFLAGS) -DGWY_MODULE_BUNDLING
+else
+process_modules = $(bundlable_modules)
+endif
+
+process_LTLIBRARIES = \
+	$(process_modules)
+
 EXTRA_DIST = \
 	$(disabled_sources)
 
@@ -122,10 +148,6 @@ if OS_MSWIN
 no_undefined = -no-undefined
 endif
 
-AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
-AM_CFLAGS = @COMMON_CFLAGS@
-AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
-
 if MODULE_DEPENDENCIES
 module_libadd = \
 	$(top_builddir)/app/libgwyapp2.la \
@@ -137,6 +159,11 @@ module_libadd = \
 	@GTK_LIBS@
 endif
 
+AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
+AM_CFLAGS = @COMMON_CFLAGS@
+AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
+
+# Bundlable modules, must be listed in process_la_SOURCES below.
 acf2d_la_SOURCES               = acf2d.c
 angle_dist_la_SOURCES          = angle_dist.c preview.h
 arithmetic_la_SOURCES          = arithmetic.c preview.h
@@ -157,6 +184,7 @@ cwt_la_SOURCES                 = cwt.c preview.h
 curvature_la_SOURCES           = curvature.c preview.h
 deposit_synth_la_SOURCES       = deposit_synth.c dimensions.h preview.h
 diff_synth_la_SOURCES          = diff_synth.c dimensions.h synth.h preview.h
+domain_synth_la_SOURCES        = domain_synth.c dimensions.h preview.h
 drift_la_SOURCES               = drift.c preview.h
 dwt_la_SOURCES                 = dwt.c preview.h
 dwtanisotropy_la_SOURCES       = dwtanisotropy.c
@@ -172,6 +200,7 @@ fft_filter_2d_la_SOURCES       = fft_filter_2d.c preview.h
 fft_profile_la_SOURCES         = fft_profile.c preview.h
 fft_la_SOURCES                 = fft.c preview.h
 fft_synth_la_SOURCES           = fft_synth.c dimensions.h synth.h preview.h
+fibre_synth_la_SOURCES         = fibre_synth.c dimensions.h synth.h preview.h
 fit_shape_la_SOURCES           = fit-shape.c preview.h
 flatten_base_la_SOURCES        = flatten_base.c
 fractal_la_SOURCES             = fractal.c preview.h
@@ -203,11 +232,17 @@ maskcor_la_SOURCES             = maskcor.c
 mask_distribute_la_SOURCES     = mask_distribute.c preview.h
 mask_edt_la_SOURCES            = mask_edt.c
 mask_morph_la_SOURCES          = mask_morph.c
+mask_noisify_la_SOURCES        = mask_noisify.c
 maskops_la_SOURCES             = maskops.c
 mcrop_la_SOURCES               = mcrop.c
 measure_lattice_la_SOURCES     = measure_lattice.c preview.h
 median_bg_la_SOURCES           = median-bg.c preview.h
 merge_la_SOURCES               = merge.c
+mfm_current_la_SOURCES         = mfm_current.c mfmops.h
+mfm_field_la_SOURCES           = mfm_field.c mfmops.h
+mfm_findshift_la_SOURCES       = mfm_findshift.c mfmops.h
+mfm_parallel_la_SOURCES        = mfm_parallel.c mfmops.h
+mfm_shift_la_SOURCES           = mfm_shift.c mfmops.h
 #nanoindent_adjust_la_SOURCES  = nanoindent_adjust.c
 neural_la_SOURCES              = neural.c neuraldata.h
 noise_synth_la_SOURCES         = noise_synth.c dimensions.h synth.h preview.h
@@ -215,11 +250,14 @@ obj_synth_la_SOURCES           = obj_synth.c dimensions.h synth.h preview.h
 otsu_threshold_la_SOURCES      = otsu_threshold.c
 outliers_la_SOURCES            = outliers.c
 pat_synth_la_SOURCES           = pat_synth.c dimensions.h synth.h preview.h
+phase_synth_la_SOURCES         = phase_synth.c dimensions.h synth.h preview.h
 pid_la_SOURCES                 = pid.c preview.h
 polylevel_la_SOURCES           = polylevel.c preview.h
 polydistort_la_SOURCES         = polydistort.c preview.h
 presentationops_la_SOURCES     = presentationops.c
 psdf_logphi_la_SOURCES         = psdf_logphi.c preview.h
+psf_la_SOURCES                 = psf.c preview.h mfmops.h
+psf_fit_la_SOURCES             = psf-fit.c
 rank_la_SOURCES                = rank.c preview.h
 rotate_la_SOURCES              = rotate.c preview.h
 scale_la_SOURCES               = scale.c preview.h
@@ -228,6 +266,7 @@ semsim_la_SOURCES              = semsim.c preview.h
 shade_la_SOURCES               = shade.c preview.h
 slope_dist_la_SOURCES          = slope_dist.c preview.h
 sphere_revolve_la_SOURCES      = sphere-revolve.c preview.h
+stitch_la_SOURCES              = stitch.c
 straighten_path_la_SOURCES     = straighten_path.c preview.h
 #superresolution_la_SOURCES    = superresolution.c
 threshold_la_SOURCES           = threshold.c preview.h
@@ -243,6 +282,129 @@ wpour_mark_la_SOURCES          = wpour_mark.c preview.h
 xydenoise_la_SOURCES           = xydenoise.c
 xyzize_la_SOURCES              = xyzize.c
 
+process_la_SOURCES = \
+	$(acf2d_la_SOURCES) \
+	$(angle_dist_la_SOURCES) \
+	$(arithmetic_la_SOURCES) \
+	$(averaging_la_SOURCES) \
+	$(basicops_la_SOURCES) \
+	$(bdep_synth_la_SOURCES) \
+	$(calcoefs_load_la_SOURCES) \
+	$(calcoefs_new_la_SOURCES) \
+	$(calcoefs_simple_la_SOURCES) \
+	$(calcoefs_view_la_SOURCES) \
+	$(calibrate_la_SOURCES) \
+	$(coerce_la_SOURCES) \
+	$(col_synth_la_SOURCES) \
+	$(convolution_filter_la_SOURCES) \
+	$(correct_affine_la_SOURCES) \
+	$(crosscor_la_SOURCES) \
+	$(cwt_la_SOURCES) \
+	$(curvature_la_SOURCES) \
+	$(deposit_synth_la_SOURCES) \
+	$(diff_synth_la_SOURCES) \
+	$(domain_synth_la_SOURCES) \
+	$(drift_la_SOURCES) \
+	$(dwt_la_SOURCES) \
+	$(dwtanisotropy_la_SOURCES) \
+	$(edge_la_SOURCES) \
+	$(entropy_la_SOURCES) \
+	$(extend_la_SOURCES) \
+	$(extract_path_la_SOURCES) \
+	$(facet_analysis_la_SOURCES) \
+	$(facet_level_la_SOURCES) \
+	$(fbm_synth_la_SOURCES) \
+	$(fft_filter_1d_la_SOURCES) \
+	$(fft_filter_2d_la_SOURCES) \
+	$(fft_profile_la_SOURCES) \
+	$(fft_la_SOURCES) \
+	$(fft_synth_la_SOURCES) \
+	$(fibre_synth_la_SOURCES) \
+	$(fit_shape_la_SOURCES) \
+	$(flatten_base_la_SOURCES) \
+	$(fractal_la_SOURCES) \
+	$(fraccor_la_SOURCES) \
+	$(gradient_la_SOURCES) \
+	$(grain_cross_la_SOURCES) \
+	$(grain_dist_la_SOURCES) \
+	$(grain_edge_la_SOURCES) \
+	$(grain_filter_la_SOURCES) \
+	$(grain_mark_la_SOURCES) \
+	$(grain_stat_la_SOURCES) \
+	$(grain_wshed_la_SOURCES) \
+	$(hough_la_SOURCES) \
+	$(immerse_la_SOURCES) \
+	$(indent_analyze_la_SOURCES) \
+	$(laplace_la_SOURCES) \
+	$(lat_synth_la_SOURCES) \
+	$(latsim_la_SOURCES) \
+	$(level_la_SOURCES) \
+	$(level_grains_la_SOURCES) \
+	$(linecorrect_la_SOURCES) \
+	$(linematch_la_SOURCES) \
+	$(lno_synth_la_SOURCES) \
+	$(local_contrast_la_SOURCES) \
+	$(logistic_la_SOURCES) \
+	$(mark_disconn_la_SOURCES) \
+	$(mark_with_la_SOURCES) \
+	$(maskcor_la_SOURCES) \
+	$(mask_distribute_la_SOURCES) \
+	$(mask_edt_la_SOURCES) \
+	$(mask_morph_la_SOURCES) \
+	$(mask_noisify_la_SOURCES) \
+	$(maskops_la_SOURCES) \
+	$(mcrop_la_SOURCES) \
+	$(measure_lattice_la_SOURCES) \
+	$(median_bg_la_SOURCES) \
+	$(merge_la_SOURCES) \
+	$(mfm_current_la_SOURCES) \
+	$(mfm_field_la_SOURCES) \
+	$(mfm_findshift_la_SOURCES) \
+	$(mfm_parallel_la_SOURCES) \
+	$(mfm_shift_la_SOURCES) \
+	$(neural_la_SOURCES) \
+	$(noise_synth_la_SOURCES) \
+	$(obj_synth_la_SOURCES) \
+	$(otsu_threshold_la_SOURCES) \
+	$(outliers_la_SOURCES) \
+	$(pat_synth_la_SOURCES) \
+	$(phase_synth_la_SOURCES) \
+	$(pid_la_SOURCES) \
+	$(polylevel_la_SOURCES) \
+	$(polydistort_la_SOURCES) \
+	$(presentationops_la_SOURCES) \
+	$(psdf_logphi_la_SOURCES) \
+	$(psf_la_SOURCES) \
+	$(psf_fit_la_SOURCES) \
+	$(rank_la_SOURCES) \
+	$(rotate_la_SOURCES) \
+	$(scale_la_SOURCES) \
+	$(scars_la_SOURCES) \
+	$(semsim_la_SOURCES) \
+	$(shade_la_SOURCES) \
+	$(slope_dist_la_SOURCES) \
+	$(sphere_revolve_la_SOURCES) \
+	$(stitch_la_SOURCES) \
+	$(straighten_path_la_SOURCES) \
+	$(threshold_la_SOURCES) \
+	$(tilt_la_SOURCES) \
+	$(tip_blind_la_SOURCES) \
+	$(tip_model_la_SOURCES) \
+	$(tipops_la_SOURCES) \
+	$(unrotate_la_SOURCES) \
+	$(volumize_la_SOURCES) \
+	$(volumize_layers_la_SOURCES) \
+	$(wave_synth_la_SOURCES) \
+	$(wpour_mark_la_SOURCES) \
+	$(xydenoise_la_SOURCES) \
+	$(xyzize_la_SOURCES) \
+	process.c
+
+process.c: $(srcdir)/Makefile.am $(top_srcdir)/utils/gen-module-bundle.sh
+	$(SHELL) $(top_srcdir)/utils/gen-module-bundle.sh process.c $(bundlable_modules)
+
+CLEAN_FILES = process.c
+
 clean-local:
 	rm -f core.* *~
 
diff --git a/modules/process/Makefile.in b/modules/process/Makefile.in
index c55a390..2247232 100644
--- a/modules/process/Makefile.in
+++ b/modules/process/Makefile.in
@@ -14,7 +14,7 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 18853 2016-08-17 19:14:16Z yeti-dn $
+# @(#) $Id: Makefile.am 20104 2017-07-29 09:23:41Z yeti-dn $
 
 VPATH = @srcdir@
 am__is_gnu_make = { \
@@ -145,315 +145,643 @@ AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
+ at MODULE_BUNDLING_FALSE@am_acf2d_la_rpath = -rpath $(processdir)
 angle_dist_la_LIBADD =
 am_angle_dist_la_OBJECTS = angle_dist.lo
 angle_dist_la_OBJECTS = $(am_angle_dist_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_angle_dist_la_rpath = -rpath $(processdir)
 arithmetic_la_LIBADD =
 am_arithmetic_la_OBJECTS = arithmetic.lo
 arithmetic_la_OBJECTS = $(am_arithmetic_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_arithmetic_la_rpath = -rpath $(processdir)
 averaging_la_LIBADD =
 am_averaging_la_OBJECTS = averaging.lo
 averaging_la_OBJECTS = $(am_averaging_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_averaging_la_rpath = -rpath $(processdir)
 basicops_la_LIBADD =
 am_basicops_la_OBJECTS = basicops.lo
 basicops_la_OBJECTS = $(am_basicops_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_basicops_la_rpath = -rpath $(processdir)
 bdep_synth_la_LIBADD =
 am_bdep_synth_la_OBJECTS = bdep_synth.lo
 bdep_synth_la_OBJECTS = $(am_bdep_synth_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_bdep_synth_la_rpath = -rpath $(processdir)
 calcoefs_load_la_LIBADD =
 am_calcoefs_load_la_OBJECTS = calcoefs_load.lo
 calcoefs_load_la_OBJECTS = $(am_calcoefs_load_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_calcoefs_load_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
 calcoefs_new_la_LIBADD =
 am_calcoefs_new_la_OBJECTS = calcoefs_new.lo
 calcoefs_new_la_OBJECTS = $(am_calcoefs_new_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_calcoefs_new_la_rpath = -rpath $(processdir)
 calcoefs_simple_la_LIBADD =
 am_calcoefs_simple_la_OBJECTS = calcoefs_simple.lo
 calcoefs_simple_la_OBJECTS = $(am_calcoefs_simple_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_calcoefs_simple_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
 calcoefs_view_la_LIBADD =
 am_calcoefs_view_la_OBJECTS = calcoefs_view.lo
 calcoefs_view_la_OBJECTS = $(am_calcoefs_view_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_calcoefs_view_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
 calibrate_la_LIBADD =
 am_calibrate_la_OBJECTS = calibrate.lo
 calibrate_la_OBJECTS = $(am_calibrate_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_calibrate_la_rpath = -rpath $(processdir)
 coerce_la_LIBADD =
 am_coerce_la_OBJECTS = coerce.lo
 coerce_la_OBJECTS = $(am_coerce_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_coerce_la_rpath = -rpath $(processdir)
 col_synth_la_LIBADD =
 am_col_synth_la_OBJECTS = col_synth.lo
 col_synth_la_OBJECTS = $(am_col_synth_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_col_synth_la_rpath = -rpath $(processdir)
 convolution_filter_la_LIBADD =
 am_convolution_filter_la_OBJECTS = convolution_filter.lo
 convolution_filter_la_OBJECTS = $(am_convolution_filter_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_convolution_filter_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
 correct_affine_la_LIBADD =
 am_correct_affine_la_OBJECTS = correct_affine.lo
 correct_affine_la_OBJECTS = $(am_correct_affine_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_correct_affine_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
 crosscor_la_LIBADD =
 am_crosscor_la_OBJECTS = crosscor.lo
 crosscor_la_OBJECTS = $(am_crosscor_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_crosscor_la_rpath = -rpath $(processdir)
 curvature_la_LIBADD =
 am_curvature_la_OBJECTS = curvature.lo
 curvature_la_OBJECTS = $(am_curvature_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_curvature_la_rpath = -rpath $(processdir)
 cwt_la_LIBADD =
 am_cwt_la_OBJECTS = cwt.lo
 cwt_la_OBJECTS = $(am_cwt_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_cwt_la_rpath = -rpath $(processdir)
 deposit_synth_la_LIBADD =
 am_deposit_synth_la_OBJECTS = deposit_synth.lo
 deposit_synth_la_OBJECTS = $(am_deposit_synth_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_deposit_synth_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
 diff_synth_la_LIBADD =
 am_diff_synth_la_OBJECTS = diff_synth.lo
 diff_synth_la_OBJECTS = $(am_diff_synth_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_diff_synth_la_rpath = -rpath $(processdir)
 domain_synth_la_LIBADD =
-domain_synth_la_SOURCES = domain_synth.c
-domain_synth_la_OBJECTS = domain_synth.lo
+am_domain_synth_la_OBJECTS = domain_synth.lo
+domain_synth_la_OBJECTS = $(am_domain_synth_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_domain_synth_la_rpath = -rpath $(processdir)
 drift_la_LIBADD =
 am_drift_la_OBJECTS = drift.lo
 drift_la_OBJECTS = $(am_drift_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_drift_la_rpath = -rpath $(processdir)
 dwt_la_LIBADD =
 am_dwt_la_OBJECTS = dwt.lo
 dwt_la_OBJECTS = $(am_dwt_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_dwt_la_rpath = -rpath $(processdir)
 dwtanisotropy_la_LIBADD =
 am_dwtanisotropy_la_OBJECTS = dwtanisotropy.lo
 dwtanisotropy_la_OBJECTS = $(am_dwtanisotropy_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_dwtanisotropy_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
 edge_la_LIBADD =
 am_edge_la_OBJECTS = edge.lo
 edge_la_OBJECTS = $(am_edge_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_edge_la_rpath = -rpath $(processdir)
 entropy_la_LIBADD =
 am_entropy_la_OBJECTS = entropy.lo
 entropy_la_OBJECTS = $(am_entropy_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_entropy_la_rpath = -rpath $(processdir)
 extend_la_LIBADD =
 am_extend_la_OBJECTS = extend.lo
 extend_la_OBJECTS = $(am_extend_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_extend_la_rpath = -rpath $(processdir)
 extract_path_la_LIBADD =
 am_extract_path_la_OBJECTS = extract_path.lo
 extract_path_la_OBJECTS = $(am_extract_path_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_extract_path_la_rpath = -rpath $(processdir)
 facet_level_la_LIBADD =
 am_facet_level_la_OBJECTS = facet-level.lo
 facet_level_la_OBJECTS = $(am_facet_level_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_facet_level_la_rpath = -rpath $(processdir)
 facet_analysis_la_LIBADD =
 am_facet_analysis_la_OBJECTS = facet_analysis.lo
 facet_analysis_la_OBJECTS = $(am_facet_analysis_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_facet_analysis_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
 fbm_synth_la_LIBADD =
 am_fbm_synth_la_OBJECTS = fbm_synth.lo
 fbm_synth_la_OBJECTS = $(am_fbm_synth_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_fbm_synth_la_rpath = -rpath $(processdir)
 fft_la_LIBADD =
 am_fft_la_OBJECTS = fft.lo
 fft_la_OBJECTS = $(am_fft_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_fft_la_rpath = -rpath $(processdir)
 fft_filter_1d_la_LIBADD =
 am_fft_filter_1d_la_OBJECTS = fft_filter_1d.lo
 fft_filter_1d_la_OBJECTS = $(am_fft_filter_1d_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_fft_filter_1d_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
 fft_filter_2d_la_LIBADD =
 am_fft_filter_2d_la_OBJECTS = fft_filter_2d.lo
 fft_filter_2d_la_OBJECTS = $(am_fft_filter_2d_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_fft_filter_2d_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
 fft_profile_la_LIBADD =
 am_fft_profile_la_OBJECTS = fft_profile.lo
 fft_profile_la_OBJECTS = $(am_fft_profile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_fft_profile_la_rpath = -rpath $(processdir)
 fft_synth_la_LIBADD =
 am_fft_synth_la_OBJECTS = fft_synth.lo
 fft_synth_la_OBJECTS = $(am_fft_synth_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_fft_synth_la_rpath = -rpath $(processdir)
+fibre_synth_la_LIBADD =
+am_fibre_synth_la_OBJECTS = fibre_synth.lo
+fibre_synth_la_OBJECTS = $(am_fibre_synth_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_fibre_synth_la_rpath = -rpath $(processdir)
 fit_shape_la_LIBADD =
 am_fit_shape_la_OBJECTS = fit-shape.lo
 fit_shape_la_OBJECTS = $(am_fit_shape_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_fit_shape_la_rpath = -rpath $(processdir)
 flatten_base_la_LIBADD =
 am_flatten_base_la_OBJECTS = flatten_base.lo
 flatten_base_la_OBJECTS = $(am_flatten_base_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_flatten_base_la_rpath = -rpath $(processdir)
 fraccor_la_LIBADD =
 am_fraccor_la_OBJECTS = fraccor.lo
 fraccor_la_OBJECTS = $(am_fraccor_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_fraccor_la_rpath = -rpath $(processdir)
 fractal_la_LIBADD =
 am_fractal_la_OBJECTS = fractal.lo
 fractal_la_OBJECTS = $(am_fractal_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_fractal_la_rpath = -rpath $(processdir)
 gradient_la_LIBADD =
 am_gradient_la_OBJECTS = gradient.lo
 gradient_la_OBJECTS = $(am_gradient_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_gradient_la_rpath = -rpath $(processdir)
 grain_cross_la_LIBADD =
 am_grain_cross_la_OBJECTS = grain_cross.lo
 grain_cross_la_OBJECTS = $(am_grain_cross_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_grain_cross_la_rpath = -rpath $(processdir)
 grain_dist_la_LIBADD =
 am_grain_dist_la_OBJECTS = grain_dist.lo
 grain_dist_la_OBJECTS = $(am_grain_dist_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_grain_dist_la_rpath = -rpath $(processdir)
 grain_edge_la_LIBADD =
 am_grain_edge_la_OBJECTS = grain_edge.lo
 grain_edge_la_OBJECTS = $(am_grain_edge_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_grain_edge_la_rpath = -rpath $(processdir)
 grain_filter_la_LIBADD =
 am_grain_filter_la_OBJECTS = grain_filter.lo
 grain_filter_la_OBJECTS = $(am_grain_filter_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_grain_filter_la_rpath = -rpath $(processdir)
 grain_mark_la_LIBADD =
 am_grain_mark_la_OBJECTS = grain_mark.lo
 grain_mark_la_OBJECTS = $(am_grain_mark_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_grain_mark_la_rpath = -rpath $(processdir)
 grain_stat_la_LIBADD =
 am_grain_stat_la_OBJECTS = grain_stat.lo
 grain_stat_la_OBJECTS = $(am_grain_stat_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_grain_stat_la_rpath = -rpath $(processdir)
 grain_wshed_la_LIBADD =
 am_grain_wshed_la_OBJECTS = grain_wshed.lo
 grain_wshed_la_OBJECTS = $(am_grain_wshed_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_grain_wshed_la_rpath = -rpath $(processdir)
 hough_la_LIBADD =
 am_hough_la_OBJECTS = hough.lo
 hough_la_OBJECTS = $(am_hough_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_hough_la_rpath = -rpath $(processdir)
 immerse_la_LIBADD =
 am_immerse_la_OBJECTS = immerse.lo
 immerse_la_OBJECTS = $(am_immerse_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_immerse_la_rpath = -rpath $(processdir)
 indent_analyze_la_LIBADD =
 am_indent_analyze_la_OBJECTS = indent_analyze.lo
 indent_analyze_la_OBJECTS = $(am_indent_analyze_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_indent_analyze_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
 laplace_la_LIBADD =
 am_laplace_la_OBJECTS = laplace.lo
 laplace_la_OBJECTS = $(am_laplace_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_laplace_la_rpath = -rpath $(processdir)
 lat_synth_la_LIBADD =
 am_lat_synth_la_OBJECTS = lat_synth.lo
 lat_synth_la_OBJECTS = $(am_lat_synth_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_lat_synth_la_rpath = -rpath $(processdir)
 latsim_la_LIBADD =
 am_latsim_la_OBJECTS = latsim.lo
 latsim_la_OBJECTS = $(am_latsim_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_latsim_la_rpath = -rpath $(processdir)
 level_la_LIBADD =
 am_level_la_OBJECTS = level.lo
 level_la_OBJECTS = $(am_level_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_level_la_rpath = -rpath $(processdir)
 level_grains_la_LIBADD =
 am_level_grains_la_OBJECTS = level_grains.lo
 level_grains_la_OBJECTS = $(am_level_grains_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_level_grains_la_rpath = -rpath $(processdir)
 linecorrect_la_LIBADD =
 am_linecorrect_la_OBJECTS = linecorrect.lo
 linecorrect_la_OBJECTS = $(am_linecorrect_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_linecorrect_la_rpath = -rpath $(processdir)
 linematch_la_LIBADD =
 am_linematch_la_OBJECTS = linematch.lo
 linematch_la_OBJECTS = $(am_linematch_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_linematch_la_rpath = -rpath $(processdir)
 lno_synth_la_LIBADD =
 am_lno_synth_la_OBJECTS = lno_synth.lo
 lno_synth_la_OBJECTS = $(am_lno_synth_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_lno_synth_la_rpath = -rpath $(processdir)
 local_contrast_la_LIBADD =
 am_local_contrast_la_OBJECTS = local_contrast.lo
 local_contrast_la_OBJECTS = $(am_local_contrast_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_local_contrast_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
 logistic_la_LIBADD =
 am_logistic_la_OBJECTS = logistic.lo
 logistic_la_OBJECTS = $(am_logistic_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_logistic_la_rpath = -rpath $(processdir)
 mark_disconn_la_LIBADD =
 am_mark_disconn_la_OBJECTS = mark_disconn.lo
 mark_disconn_la_OBJECTS = $(am_mark_disconn_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_mark_disconn_la_rpath = -rpath $(processdir)
 mark_with_la_LIBADD =
 am_mark_with_la_OBJECTS = mark_with.lo
 mark_with_la_OBJECTS = $(am_mark_with_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_mark_with_la_rpath = -rpath $(processdir)
 mask_distribute_la_LIBADD =
 am_mask_distribute_la_OBJECTS = mask_distribute.lo
 mask_distribute_la_OBJECTS = $(am_mask_distribute_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_mask_distribute_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
 mask_edt_la_LIBADD =
 am_mask_edt_la_OBJECTS = mask_edt.lo
 mask_edt_la_OBJECTS = $(am_mask_edt_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_mask_edt_la_rpath = -rpath $(processdir)
 mask_morph_la_LIBADD =
 am_mask_morph_la_OBJECTS = mask_morph.lo
 mask_morph_la_OBJECTS = $(am_mask_morph_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_mask_morph_la_rpath = -rpath $(processdir)
+mask_noisify_la_LIBADD =
+am_mask_noisify_la_OBJECTS = mask_noisify.lo
+mask_noisify_la_OBJECTS = $(am_mask_noisify_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_mask_noisify_la_rpath = -rpath $(processdir)
 maskcor_la_LIBADD =
 am_maskcor_la_OBJECTS = maskcor.lo
 maskcor_la_OBJECTS = $(am_maskcor_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_maskcor_la_rpath = -rpath $(processdir)
 maskops_la_LIBADD =
 am_maskops_la_OBJECTS = maskops.lo
 maskops_la_OBJECTS = $(am_maskops_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_maskops_la_rpath = -rpath $(processdir)
 mcrop_la_LIBADD =
 am_mcrop_la_OBJECTS = mcrop.lo
 mcrop_la_OBJECTS = $(am_mcrop_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_mcrop_la_rpath = -rpath $(processdir)
 measure_lattice_la_LIBADD =
 am_measure_lattice_la_OBJECTS = measure_lattice.lo
 measure_lattice_la_OBJECTS = $(am_measure_lattice_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_measure_lattice_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
 median_bg_la_LIBADD =
 am_median_bg_la_OBJECTS = median-bg.lo
 median_bg_la_OBJECTS = $(am_median_bg_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_median_bg_la_rpath = -rpath $(processdir)
 merge_la_LIBADD =
 am_merge_la_OBJECTS = merge.lo
 merge_la_OBJECTS = $(am_merge_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_merge_la_rpath = -rpath $(processdir)
+mfm_current_la_LIBADD =
+am_mfm_current_la_OBJECTS = mfm_current.lo
+mfm_current_la_OBJECTS = $(am_mfm_current_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_mfm_current_la_rpath = -rpath $(processdir)
+mfm_field_la_LIBADD =
+am_mfm_field_la_OBJECTS = mfm_field.lo
+mfm_field_la_OBJECTS = $(am_mfm_field_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_mfm_field_la_rpath = -rpath $(processdir)
+mfm_findshift_la_LIBADD =
+am_mfm_findshift_la_OBJECTS = mfm_findshift.lo
+mfm_findshift_la_OBJECTS = $(am_mfm_findshift_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_mfm_findshift_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
+mfm_parallel_la_LIBADD =
+am_mfm_parallel_la_OBJECTS = mfm_parallel.lo
+mfm_parallel_la_OBJECTS = $(am_mfm_parallel_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_mfm_parallel_la_rpath = -rpath $(processdir)
+mfm_shift_la_LIBADD =
+am_mfm_shift_la_OBJECTS = mfm_shift.lo
+mfm_shift_la_OBJECTS = $(am_mfm_shift_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_mfm_shift_la_rpath = -rpath $(processdir)
 neural_la_LIBADD =
 am_neural_la_OBJECTS = neural.lo
 neural_la_OBJECTS = $(am_neural_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_neural_la_rpath = -rpath $(processdir)
 noise_synth_la_LIBADD =
 am_noise_synth_la_OBJECTS = noise_synth.lo
 noise_synth_la_OBJECTS = $(am_noise_synth_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_noise_synth_la_rpath = -rpath $(processdir)
 obj_synth_la_LIBADD =
 am_obj_synth_la_OBJECTS = obj_synth.lo
 obj_synth_la_OBJECTS = $(am_obj_synth_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_obj_synth_la_rpath = -rpath $(processdir)
 otsu_threshold_la_LIBADD =
 am_otsu_threshold_la_OBJECTS = otsu_threshold.lo
 otsu_threshold_la_OBJECTS = $(am_otsu_threshold_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_otsu_threshold_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
 outliers_la_LIBADD =
 am_outliers_la_OBJECTS = outliers.lo
 outliers_la_OBJECTS = $(am_outliers_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_outliers_la_rpath = -rpath $(processdir)
 pat_synth_la_LIBADD =
 am_pat_synth_la_OBJECTS = pat_synth.lo
 pat_synth_la_OBJECTS = $(am_pat_synth_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_pat_synth_la_rpath = -rpath $(processdir)
+phase_synth_la_LIBADD =
+am_phase_synth_la_OBJECTS = phase_synth.lo
+phase_synth_la_OBJECTS = $(am_phase_synth_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_phase_synth_la_rpath = -rpath $(processdir)
 pid_la_LIBADD =
 am_pid_la_OBJECTS = pid.lo
 pid_la_OBJECTS = $(am_pid_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_pid_la_rpath = -rpath $(processdir)
 polydistort_la_LIBADD =
 am_polydistort_la_OBJECTS = polydistort.lo
 polydistort_la_OBJECTS = $(am_polydistort_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_polydistort_la_rpath = -rpath $(processdir)
 polylevel_la_LIBADD =
 am_polylevel_la_OBJECTS = polylevel.lo
 polylevel_la_OBJECTS = $(am_polylevel_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_polylevel_la_rpath = -rpath $(processdir)
 presentationops_la_LIBADD =
 am_presentationops_la_OBJECTS = presentationops.lo
 presentationops_la_OBJECTS = $(am_presentationops_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_presentationops_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
+process_la_LIBADD =
+am__objects_1 = process_la-acf2d.lo
+am__objects_2 = process_la-angle_dist.lo
+am__objects_3 = process_la-arithmetic.lo
+am__objects_4 = process_la-averaging.lo
+am__objects_5 = process_la-basicops.lo
+am__objects_6 = process_la-bdep_synth.lo
+am__objects_7 = process_la-calcoefs_load.lo
+am__objects_8 = process_la-calcoefs_new.lo
+am__objects_9 = process_la-calcoefs_simple.lo
+am__objects_10 = process_la-calcoefs_view.lo
+am__objects_11 = process_la-calibrate.lo
+am__objects_12 = process_la-coerce.lo
+am__objects_13 = process_la-col_synth.lo
+am__objects_14 = process_la-convolution_filter.lo
+am__objects_15 = process_la-correct_affine.lo
+am__objects_16 = process_la-crosscor.lo
+am__objects_17 = process_la-cwt.lo
+am__objects_18 = process_la-curvature.lo
+am__objects_19 = process_la-deposit_synth.lo
+am__objects_20 = process_la-diff_synth.lo
+am__objects_21 = process_la-domain_synth.lo
+am__objects_22 = process_la-drift.lo
+am__objects_23 = process_la-dwt.lo
+am__objects_24 = process_la-dwtanisotropy.lo
+am__objects_25 = process_la-edge.lo
+am__objects_26 = process_la-entropy.lo
+am__objects_27 = process_la-extend.lo
+am__objects_28 = process_la-extract_path.lo
+am__objects_29 = process_la-facet_analysis.lo
+am__objects_30 = process_la-facet-level.lo
+am__objects_31 = process_la-fbm_synth.lo
+am__objects_32 = process_la-fft_filter_1d.lo
+am__objects_33 = process_la-fft_filter_2d.lo
+am__objects_34 = process_la-fft_profile.lo
+am__objects_35 = process_la-fft.lo
+am__objects_36 = process_la-fft_synth.lo
+am__objects_37 = process_la-fibre_synth.lo
+am__objects_38 = process_la-fit-shape.lo
+am__objects_39 = process_la-flatten_base.lo
+am__objects_40 = process_la-fractal.lo
+am__objects_41 = process_la-fraccor.lo
+am__objects_42 = process_la-gradient.lo
+am__objects_43 = process_la-grain_cross.lo
+am__objects_44 = process_la-grain_dist.lo
+am__objects_45 = process_la-grain_edge.lo
+am__objects_46 = process_la-grain_filter.lo
+am__objects_47 = process_la-grain_mark.lo
+am__objects_48 = process_la-grain_stat.lo
+am__objects_49 = process_la-grain_wshed.lo
+am__objects_50 = process_la-hough.lo
+am__objects_51 = process_la-immerse.lo
+am__objects_52 = process_la-indent_analyze.lo
+am__objects_53 = process_la-laplace.lo
+am__objects_54 = process_la-lat_synth.lo
+am__objects_55 = process_la-latsim.lo
+am__objects_56 = process_la-level.lo
+am__objects_57 = process_la-level_grains.lo
+am__objects_58 = process_la-linecorrect.lo
+am__objects_59 = process_la-linematch.lo
+am__objects_60 = process_la-lno_synth.lo
+am__objects_61 = process_la-local_contrast.lo
+am__objects_62 = process_la-logistic.lo
+am__objects_63 = process_la-mark_disconn.lo
+am__objects_64 = process_la-mark_with.lo
+am__objects_65 = process_la-maskcor.lo
+am__objects_66 = process_la-mask_distribute.lo
+am__objects_67 = process_la-mask_edt.lo
+am__objects_68 = process_la-mask_morph.lo
+am__objects_69 = process_la-mask_noisify.lo
+am__objects_70 = process_la-maskops.lo
+am__objects_71 = process_la-mcrop.lo
+am__objects_72 = process_la-measure_lattice.lo
+am__objects_73 = process_la-median-bg.lo
+am__objects_74 = process_la-merge.lo
+am__objects_75 = process_la-mfm_current.lo
+am__objects_76 = process_la-mfm_field.lo
+am__objects_77 = process_la-mfm_findshift.lo
+am__objects_78 = process_la-mfm_parallel.lo
+am__objects_79 = process_la-mfm_shift.lo
+am__objects_80 = process_la-neural.lo
+am__objects_81 = process_la-noise_synth.lo
+am__objects_82 = process_la-obj_synth.lo
+am__objects_83 = process_la-otsu_threshold.lo
+am__objects_84 = process_la-outliers.lo
+am__objects_85 = process_la-pat_synth.lo
+am__objects_86 = process_la-phase_synth.lo
+am__objects_87 = process_la-pid.lo
+am__objects_88 = process_la-polylevel.lo
+am__objects_89 = process_la-polydistort.lo
+am__objects_90 = process_la-presentationops.lo
+am__objects_91 = process_la-psdf_logphi.lo
+am__objects_92 = process_la-psf.lo
+am__objects_93 = process_la-psf-fit.lo
+am__objects_94 = process_la-rank.lo
+am__objects_95 = process_la-rotate.lo
+am__objects_96 = process_la-scale.lo
+am__objects_97 = process_la-scars.lo
+am__objects_98 = process_la-semsim.lo
+am__objects_99 = process_la-shade.lo
+am__objects_100 = process_la-slope_dist.lo
+am__objects_101 = process_la-sphere-revolve.lo
+am__objects_102 = process_la-stitch.lo
+am__objects_103 = process_la-straighten_path.lo
+am__objects_104 = process_la-threshold.lo
+am__objects_105 = process_la-tilt.lo
+am__objects_106 = process_la-tip_blind.lo
+am__objects_107 = process_la-tip_model.lo
+am__objects_108 = process_la-tipops.lo
+am__objects_109 = process_la-unrotate.lo
+am__objects_110 = process_la-volumize.lo
+am__objects_111 = process_la-volumize_layers.lo
+am__objects_112 = process_la-wave_synth.lo
+am__objects_113 = process_la-wpour_mark.lo
+am__objects_114 = process_la-xydenoise.lo
+am__objects_115 = process_la-xyzize.lo
+am_process_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
+	$(am__objects_3) $(am__objects_4) $(am__objects_5) \
+	$(am__objects_6) $(am__objects_7) $(am__objects_8) \
+	$(am__objects_9) $(am__objects_10) $(am__objects_11) \
+	$(am__objects_12) $(am__objects_13) $(am__objects_14) \
+	$(am__objects_15) $(am__objects_16) $(am__objects_17) \
+	$(am__objects_18) $(am__objects_19) $(am__objects_20) \
+	$(am__objects_21) $(am__objects_22) $(am__objects_23) \
+	$(am__objects_24) $(am__objects_25) $(am__objects_26) \
+	$(am__objects_27) $(am__objects_28) $(am__objects_29) \
+	$(am__objects_30) $(am__objects_31) $(am__objects_32) \
+	$(am__objects_33) $(am__objects_34) $(am__objects_35) \
+	$(am__objects_36) $(am__objects_37) $(am__objects_38) \
+	$(am__objects_39) $(am__objects_40) $(am__objects_41) \
+	$(am__objects_42) $(am__objects_43) $(am__objects_44) \
+	$(am__objects_45) $(am__objects_46) $(am__objects_47) \
+	$(am__objects_48) $(am__objects_49) $(am__objects_50) \
+	$(am__objects_51) $(am__objects_52) $(am__objects_53) \
+	$(am__objects_54) $(am__objects_55) $(am__objects_56) \
+	$(am__objects_57) $(am__objects_58) $(am__objects_59) \
+	$(am__objects_60) $(am__objects_61) $(am__objects_62) \
+	$(am__objects_63) $(am__objects_64) $(am__objects_65) \
+	$(am__objects_66) $(am__objects_67) $(am__objects_68) \
+	$(am__objects_69) $(am__objects_70) $(am__objects_71) \
+	$(am__objects_72) $(am__objects_73) $(am__objects_74) \
+	$(am__objects_75) $(am__objects_76) $(am__objects_77) \
+	$(am__objects_78) $(am__objects_79) $(am__objects_80) \
+	$(am__objects_81) $(am__objects_82) $(am__objects_83) \
+	$(am__objects_84) $(am__objects_85) $(am__objects_86) \
+	$(am__objects_87) $(am__objects_88) $(am__objects_89) \
+	$(am__objects_90) $(am__objects_91) $(am__objects_92) \
+	$(am__objects_93) $(am__objects_94) $(am__objects_95) \
+	$(am__objects_96) $(am__objects_97) $(am__objects_98) \
+	$(am__objects_99) $(am__objects_100) $(am__objects_101) \
+	$(am__objects_102) $(am__objects_103) $(am__objects_104) \
+	$(am__objects_105) $(am__objects_106) $(am__objects_107) \
+	$(am__objects_108) $(am__objects_109) $(am__objects_110) \
+	$(am__objects_111) $(am__objects_112) $(am__objects_113) \
+	$(am__objects_114) $(am__objects_115) process_la-process.lo
+process_la_OBJECTS = $(am_process_la_OBJECTS)
+process_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(process_la_CFLAGS) \
+	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+ at MODULE_BUNDLING_TRUE@am_process_la_rpath = -rpath $(processdir)
 psdf_logphi_la_LIBADD =
 am_psdf_logphi_la_OBJECTS = psdf_logphi.lo
 psdf_logphi_la_OBJECTS = $(am_psdf_logphi_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_psdf_logphi_la_rpath = -rpath $(processdir)
+psf_fit_la_LIBADD =
+am_psf_fit_la_OBJECTS = psf-fit.lo
+psf_fit_la_OBJECTS = $(am_psf_fit_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_psf_fit_la_rpath = -rpath $(processdir)
+psf_la_LIBADD =
+am_psf_la_OBJECTS = psf.lo
+psf_la_OBJECTS = $(am_psf_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_psf_la_rpath = -rpath $(processdir)
 rank_la_LIBADD =
 am_rank_la_OBJECTS = rank.lo
 rank_la_OBJECTS = $(am_rank_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_rank_la_rpath = -rpath $(processdir)
 rotate_la_LIBADD =
 am_rotate_la_OBJECTS = rotate.lo
 rotate_la_OBJECTS = $(am_rotate_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_rotate_la_rpath = -rpath $(processdir)
 scale_la_LIBADD =
 am_scale_la_OBJECTS = scale.lo
 scale_la_OBJECTS = $(am_scale_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_scale_la_rpath = -rpath $(processdir)
 scars_la_LIBADD =
 am_scars_la_OBJECTS = scars.lo
 scars_la_OBJECTS = $(am_scars_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_scars_la_rpath = -rpath $(processdir)
 semsim_la_LIBADD =
 am_semsim_la_OBJECTS = semsim.lo
 semsim_la_OBJECTS = $(am_semsim_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_semsim_la_rpath = -rpath $(processdir)
 shade_la_LIBADD =
 am_shade_la_OBJECTS = shade.lo
 shade_la_OBJECTS = $(am_shade_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_shade_la_rpath = -rpath $(processdir)
 slope_dist_la_LIBADD =
 am_slope_dist_la_OBJECTS = slope_dist.lo
 slope_dist_la_OBJECTS = $(am_slope_dist_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_slope_dist_la_rpath = -rpath $(processdir)
 sphere_revolve_la_LIBADD =
 am_sphere_revolve_la_OBJECTS = sphere-revolve.lo
 sphere_revolve_la_OBJECTS = $(am_sphere_revolve_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_sphere_revolve_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
+stitch_la_LIBADD =
+am_stitch_la_OBJECTS = stitch.lo
+stitch_la_OBJECTS = $(am_stitch_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_stitch_la_rpath = -rpath $(processdir)
 straighten_path_la_LIBADD =
 am_straighten_path_la_OBJECTS = straighten_path.lo
 straighten_path_la_OBJECTS = $(am_straighten_path_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_straighten_path_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
 threshold_la_LIBADD =
 am_threshold_la_OBJECTS = threshold.lo
 threshold_la_OBJECTS = $(am_threshold_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_threshold_la_rpath = -rpath $(processdir)
 tilt_la_LIBADD =
 am_tilt_la_OBJECTS = tilt.lo
 tilt_la_OBJECTS = $(am_tilt_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_tilt_la_rpath = -rpath $(processdir)
 tip_blind_la_LIBADD =
 am_tip_blind_la_OBJECTS = tip_blind.lo
 tip_blind_la_OBJECTS = $(am_tip_blind_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_tip_blind_la_rpath = -rpath $(processdir)
 tip_model_la_LIBADD =
 am_tip_model_la_OBJECTS = tip_model.lo
 tip_model_la_OBJECTS = $(am_tip_model_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_tip_model_la_rpath = -rpath $(processdir)
 tipops_la_LIBADD =
 am_tipops_la_OBJECTS = tipops.lo
 tipops_la_OBJECTS = $(am_tipops_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_tipops_la_rpath = -rpath $(processdir)
 unrotate_la_LIBADD =
 am_unrotate_la_OBJECTS = unrotate.lo
 unrotate_la_OBJECTS = $(am_unrotate_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_unrotate_la_rpath = -rpath $(processdir)
 volumize_la_LIBADD =
 am_volumize_la_OBJECTS = volumize.lo
 volumize_la_OBJECTS = $(am_volumize_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_volumize_la_rpath = -rpath $(processdir)
 volumize_layers_la_LIBADD =
 am_volumize_layers_la_OBJECTS = volumize_layers.lo
 volumize_layers_la_OBJECTS = $(am_volumize_layers_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_volumize_layers_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(processdir)
 wave_synth_la_LIBADD =
 am_wave_synth_la_OBJECTS = wave_synth.lo
 wave_synth_la_OBJECTS = $(am_wave_synth_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_wave_synth_la_rpath = -rpath $(processdir)
 wpour_mark_la_LIBADD =
 am_wpour_mark_la_OBJECTS = wpour_mark.lo
 wpour_mark_la_OBJECTS = $(am_wpour_mark_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_wpour_mark_la_rpath = -rpath $(processdir)
 xydenoise_la_LIBADD =
 am_xydenoise_la_OBJECTS = xydenoise.lo
 xydenoise_la_OBJECTS = $(am_xydenoise_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_xydenoise_la_rpath = -rpath $(processdir)
 xyzize_la_LIBADD =
 am_xyzize_la_OBJECTS = xyzize.lo
 xyzize_la_OBJECTS = $(am_xyzize_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_xyzize_la_rpath = -rpath $(processdir)
 AM_V_P = $(am__v_P_ at AM_V@)
 am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -498,40 +826,46 @@ SOURCES = $(acf2d_la_SOURCES) $(angle_dist_la_SOURCES) \
 	$(correct_affine_la_SOURCES) $(crosscor_la_SOURCES) \
 	$(curvature_la_SOURCES) $(cwt_la_SOURCES) \
 	$(deposit_synth_la_SOURCES) $(diff_synth_la_SOURCES) \
-	domain_synth.c $(drift_la_SOURCES) $(dwt_la_SOURCES) \
-	$(dwtanisotropy_la_SOURCES) $(edge_la_SOURCES) \
-	$(entropy_la_SOURCES) $(extend_la_SOURCES) \
+	$(domain_synth_la_SOURCES) $(drift_la_SOURCES) \
+	$(dwt_la_SOURCES) $(dwtanisotropy_la_SOURCES) \
+	$(edge_la_SOURCES) $(entropy_la_SOURCES) $(extend_la_SOURCES) \
 	$(extract_path_la_SOURCES) $(facet_level_la_SOURCES) \
 	$(facet_analysis_la_SOURCES) $(fbm_synth_la_SOURCES) \
 	$(fft_la_SOURCES) $(fft_filter_1d_la_SOURCES) \
 	$(fft_filter_2d_la_SOURCES) $(fft_profile_la_SOURCES) \
-	$(fft_synth_la_SOURCES) $(fit_shape_la_SOURCES) \
-	$(flatten_base_la_SOURCES) $(fraccor_la_SOURCES) \
-	$(fractal_la_SOURCES) $(gradient_la_SOURCES) \
-	$(grain_cross_la_SOURCES) $(grain_dist_la_SOURCES) \
-	$(grain_edge_la_SOURCES) $(grain_filter_la_SOURCES) \
-	$(grain_mark_la_SOURCES) $(grain_stat_la_SOURCES) \
-	$(grain_wshed_la_SOURCES) $(hough_la_SOURCES) \
-	$(immerse_la_SOURCES) $(indent_analyze_la_SOURCES) \
-	$(laplace_la_SOURCES) $(lat_synth_la_SOURCES) \
-	$(latsim_la_SOURCES) $(level_la_SOURCES) \
-	$(level_grains_la_SOURCES) $(linecorrect_la_SOURCES) \
-	$(linematch_la_SOURCES) $(lno_synth_la_SOURCES) \
-	$(local_contrast_la_SOURCES) $(logistic_la_SOURCES) \
-	$(mark_disconn_la_SOURCES) $(mark_with_la_SOURCES) \
-	$(mask_distribute_la_SOURCES) $(mask_edt_la_SOURCES) \
-	$(mask_morph_la_SOURCES) $(maskcor_la_SOURCES) \
+	$(fft_synth_la_SOURCES) $(fibre_synth_la_SOURCES) \
+	$(fit_shape_la_SOURCES) $(flatten_base_la_SOURCES) \
+	$(fraccor_la_SOURCES) $(fractal_la_SOURCES) \
+	$(gradient_la_SOURCES) $(grain_cross_la_SOURCES) \
+	$(grain_dist_la_SOURCES) $(grain_edge_la_SOURCES) \
+	$(grain_filter_la_SOURCES) $(grain_mark_la_SOURCES) \
+	$(grain_stat_la_SOURCES) $(grain_wshed_la_SOURCES) \
+	$(hough_la_SOURCES) $(immerse_la_SOURCES) \
+	$(indent_analyze_la_SOURCES) $(laplace_la_SOURCES) \
+	$(lat_synth_la_SOURCES) $(latsim_la_SOURCES) \
+	$(level_la_SOURCES) $(level_grains_la_SOURCES) \
+	$(linecorrect_la_SOURCES) $(linematch_la_SOURCES) \
+	$(lno_synth_la_SOURCES) $(local_contrast_la_SOURCES) \
+	$(logistic_la_SOURCES) $(mark_disconn_la_SOURCES) \
+	$(mark_with_la_SOURCES) $(mask_distribute_la_SOURCES) \
+	$(mask_edt_la_SOURCES) $(mask_morph_la_SOURCES) \
+	$(mask_noisify_la_SOURCES) $(maskcor_la_SOURCES) \
 	$(maskops_la_SOURCES) $(mcrop_la_SOURCES) \
 	$(measure_lattice_la_SOURCES) $(median_bg_la_SOURCES) \
-	$(merge_la_SOURCES) $(neural_la_SOURCES) \
-	$(noise_synth_la_SOURCES) $(obj_synth_la_SOURCES) \
-	$(otsu_threshold_la_SOURCES) $(outliers_la_SOURCES) \
-	$(pat_synth_la_SOURCES) $(pid_la_SOURCES) \
+	$(merge_la_SOURCES) $(mfm_current_la_SOURCES) \
+	$(mfm_field_la_SOURCES) $(mfm_findshift_la_SOURCES) \
+	$(mfm_parallel_la_SOURCES) $(mfm_shift_la_SOURCES) \
+	$(neural_la_SOURCES) $(noise_synth_la_SOURCES) \
+	$(obj_synth_la_SOURCES) $(otsu_threshold_la_SOURCES) \
+	$(outliers_la_SOURCES) $(pat_synth_la_SOURCES) \
+	$(phase_synth_la_SOURCES) $(pid_la_SOURCES) \
 	$(polydistort_la_SOURCES) $(polylevel_la_SOURCES) \
-	$(presentationops_la_SOURCES) $(psdf_logphi_la_SOURCES) \
-	$(rank_la_SOURCES) $(rotate_la_SOURCES) $(scale_la_SOURCES) \
-	$(scars_la_SOURCES) $(semsim_la_SOURCES) $(shade_la_SOURCES) \
-	$(slope_dist_la_SOURCES) $(sphere_revolve_la_SOURCES) \
+	$(presentationops_la_SOURCES) $(process_la_SOURCES) \
+	$(psdf_logphi_la_SOURCES) $(psf_fit_la_SOURCES) \
+	$(psf_la_SOURCES) $(rank_la_SOURCES) $(rotate_la_SOURCES) \
+	$(scale_la_SOURCES) $(scars_la_SOURCES) $(semsim_la_SOURCES) \
+	$(shade_la_SOURCES) $(slope_dist_la_SOURCES) \
+	$(sphere_revolve_la_SOURCES) $(stitch_la_SOURCES) \
 	$(straighten_path_la_SOURCES) $(threshold_la_SOURCES) \
 	$(tilt_la_SOURCES) $(tip_blind_la_SOURCES) \
 	$(tip_model_la_SOURCES) $(tipops_la_SOURCES) \
@@ -549,40 +883,46 @@ DIST_SOURCES = $(acf2d_la_SOURCES) $(angle_dist_la_SOURCES) \
 	$(correct_affine_la_SOURCES) $(crosscor_la_SOURCES) \
 	$(curvature_la_SOURCES) $(cwt_la_SOURCES) \
 	$(deposit_synth_la_SOURCES) $(diff_synth_la_SOURCES) \
-	domain_synth.c $(drift_la_SOURCES) $(dwt_la_SOURCES) \
-	$(dwtanisotropy_la_SOURCES) $(edge_la_SOURCES) \
-	$(entropy_la_SOURCES) $(extend_la_SOURCES) \
+	$(domain_synth_la_SOURCES) $(drift_la_SOURCES) \
+	$(dwt_la_SOURCES) $(dwtanisotropy_la_SOURCES) \
+	$(edge_la_SOURCES) $(entropy_la_SOURCES) $(extend_la_SOURCES) \
 	$(extract_path_la_SOURCES) $(facet_level_la_SOURCES) \
 	$(facet_analysis_la_SOURCES) $(fbm_synth_la_SOURCES) \
 	$(fft_la_SOURCES) $(fft_filter_1d_la_SOURCES) \
 	$(fft_filter_2d_la_SOURCES) $(fft_profile_la_SOURCES) \
-	$(fft_synth_la_SOURCES) $(fit_shape_la_SOURCES) \
-	$(flatten_base_la_SOURCES) $(fraccor_la_SOURCES) \
-	$(fractal_la_SOURCES) $(gradient_la_SOURCES) \
-	$(grain_cross_la_SOURCES) $(grain_dist_la_SOURCES) \
-	$(grain_edge_la_SOURCES) $(grain_filter_la_SOURCES) \
-	$(grain_mark_la_SOURCES) $(grain_stat_la_SOURCES) \
-	$(grain_wshed_la_SOURCES) $(hough_la_SOURCES) \
-	$(immerse_la_SOURCES) $(indent_analyze_la_SOURCES) \
-	$(laplace_la_SOURCES) $(lat_synth_la_SOURCES) \
-	$(latsim_la_SOURCES) $(level_la_SOURCES) \
-	$(level_grains_la_SOURCES) $(linecorrect_la_SOURCES) \
-	$(linematch_la_SOURCES) $(lno_synth_la_SOURCES) \
-	$(local_contrast_la_SOURCES) $(logistic_la_SOURCES) \
-	$(mark_disconn_la_SOURCES) $(mark_with_la_SOURCES) \
-	$(mask_distribute_la_SOURCES) $(mask_edt_la_SOURCES) \
-	$(mask_morph_la_SOURCES) $(maskcor_la_SOURCES) \
+	$(fft_synth_la_SOURCES) $(fibre_synth_la_SOURCES) \
+	$(fit_shape_la_SOURCES) $(flatten_base_la_SOURCES) \
+	$(fraccor_la_SOURCES) $(fractal_la_SOURCES) \
+	$(gradient_la_SOURCES) $(grain_cross_la_SOURCES) \
+	$(grain_dist_la_SOURCES) $(grain_edge_la_SOURCES) \
+	$(grain_filter_la_SOURCES) $(grain_mark_la_SOURCES) \
+	$(grain_stat_la_SOURCES) $(grain_wshed_la_SOURCES) \
+	$(hough_la_SOURCES) $(immerse_la_SOURCES) \
+	$(indent_analyze_la_SOURCES) $(laplace_la_SOURCES) \
+	$(lat_synth_la_SOURCES) $(latsim_la_SOURCES) \
+	$(level_la_SOURCES) $(level_grains_la_SOURCES) \
+	$(linecorrect_la_SOURCES) $(linematch_la_SOURCES) \
+	$(lno_synth_la_SOURCES) $(local_contrast_la_SOURCES) \
+	$(logistic_la_SOURCES) $(mark_disconn_la_SOURCES) \
+	$(mark_with_la_SOURCES) $(mask_distribute_la_SOURCES) \
+	$(mask_edt_la_SOURCES) $(mask_morph_la_SOURCES) \
+	$(mask_noisify_la_SOURCES) $(maskcor_la_SOURCES) \
 	$(maskops_la_SOURCES) $(mcrop_la_SOURCES) \
 	$(measure_lattice_la_SOURCES) $(median_bg_la_SOURCES) \
-	$(merge_la_SOURCES) $(neural_la_SOURCES) \
-	$(noise_synth_la_SOURCES) $(obj_synth_la_SOURCES) \
-	$(otsu_threshold_la_SOURCES) $(outliers_la_SOURCES) \
-	$(pat_synth_la_SOURCES) $(pid_la_SOURCES) \
+	$(merge_la_SOURCES) $(mfm_current_la_SOURCES) \
+	$(mfm_field_la_SOURCES) $(mfm_findshift_la_SOURCES) \
+	$(mfm_parallel_la_SOURCES) $(mfm_shift_la_SOURCES) \
+	$(neural_la_SOURCES) $(noise_synth_la_SOURCES) \
+	$(obj_synth_la_SOURCES) $(otsu_threshold_la_SOURCES) \
+	$(outliers_la_SOURCES) $(pat_synth_la_SOURCES) \
+	$(phase_synth_la_SOURCES) $(pid_la_SOURCES) \
 	$(polydistort_la_SOURCES) $(polylevel_la_SOURCES) \
-	$(presentationops_la_SOURCES) $(psdf_logphi_la_SOURCES) \
-	$(rank_la_SOURCES) $(rotate_la_SOURCES) $(scale_la_SOURCES) \
-	$(scars_la_SOURCES) $(semsim_la_SOURCES) $(shade_la_SOURCES) \
-	$(slope_dist_la_SOURCES) $(sphere_revolve_la_SOURCES) \
+	$(presentationops_la_SOURCES) $(process_la_SOURCES) \
+	$(psdf_logphi_la_SOURCES) $(psf_fit_la_SOURCES) \
+	$(psf_la_SOURCES) $(rank_la_SOURCES) $(rotate_la_SOURCES) \
+	$(scale_la_SOURCES) $(scars_la_SOURCES) $(semsim_la_SOURCES) \
+	$(shade_la_SOURCES) $(slope_dist_la_SOURCES) \
+	$(sphere_revolve_la_SOURCES) $(stitch_la_SOURCES) \
 	$(straighten_path_la_SOURCES) $(threshold_la_SOURCES) \
 	$(tilt_la_SOURCES) $(tip_blind_la_SOURCES) \
 	$(tip_model_la_SOURCES) $(tipops_la_SOURCES) \
@@ -655,10 +995,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -668,6 +1005,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -692,7 +1031,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -750,6 +1091,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -758,17 +1100,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -862,7 +1200,11 @@ disabled_sources = \
 	superresolution.c
 
 processdir = $(pkglibdir)/modules/process
-process_LTLIBRARIES = \
+
+# Only bundle modules without own dependencies.  If something goes wrong with
+# any required libraries at run-time, it will at most break these individual
+# unbundled modules, not the bundle.
+bundlable_modules = \
 	acf2d.la \
 	angle_dist.la \
 	arithmetic.la \
@@ -899,6 +1241,7 @@ process_LTLIBRARIES = \
 	fft_filter_2d.la \
 	fft_profile.la \
 	fft_synth.la \
+	fibre_synth.la \
 	fit-shape.la \
 	flatten_base.la \
 	fraccor.la \
@@ -930,22 +1273,31 @@ process_LTLIBRARIES = \
 	mask_distribute.la \
 	mask_edt.la \
 	mask_morph.la \
+	mask_noisify.la \
 	maskops.la \
 	mcrop.la \
 	measure_lattice.la \
 	median-bg.la \
 	merge.la \
+	mfm_current.la \
+	mfm_field.la \
+	mfm_findshift.la \
+	mfm_parallel.la \
+	mfm_shift.la \
 	neural.la \
 	noise_synth.la \
 	obj_synth.la \
 	otsu_threshold.la \
 	outliers.la \
 	pat_synth.la \
+	phase_synth.la \
 	pid.la \
 	polylevel.la \
 	polydistort.la \
 	presentationops.la \
 	psdf_logphi.la \
+	psf.la \
+	psf-fit.la \
 	rank.la \
 	rotate.la \
 	semsim.la \
@@ -954,6 +1306,7 @@ process_LTLIBRARIES = \
 	shade.la \
 	slope_dist.la \
 	sphere-revolve.la \
+	stitch.la \
 	straighten_path.la \
 	threshold.la \
 	tilt.la \
@@ -968,13 +1321,19 @@ process_LTLIBRARIES = \
 	xydenoise.la \
 	xyzize.la
 
+ at MODULE_BUNDLING_FALSE@process_modules = $(bundlable_modules)
+
+# process_modules is either the bundle or all the individual modules.
+ at MODULE_BUNDLING_TRUE@process_modules = process.la
+ at MODULE_BUNDLING_TRUE@BUILT_SOURCES = process.c
+ at MODULE_BUNDLING_TRUE@process_la_CFLAGS = $(AM_CFLAGS) -DGWY_MODULE_BUNDLING
+process_LTLIBRARIES = \
+	$(process_modules)
+
 EXTRA_DIST = \
 	$(disabled_sources)
 
 @OS_MSWIN_TRUE at no_undefined = -no-undefined
-AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
-AM_CFLAGS = @COMMON_CFLAGS@
-AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
 @MODULE_DEPENDENCIES_TRUE at module_libadd = \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/app/libgwyapp2.la \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libdraw/libgwydraw2.la \
@@ -984,6 +1343,11 @@ AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libprocess/libgwyprocess2.la \
 @MODULE_DEPENDENCIES_TRUE@	@GTK_LIBS@
 
+AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
+AM_CFLAGS = @COMMON_CFLAGS@
+AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
+
+# Bundlable modules, must be listed in process_la_SOURCES below.
 acf2d_la_SOURCES = acf2d.c
 angle_dist_la_SOURCES = angle_dist.c preview.h
 arithmetic_la_SOURCES = arithmetic.c preview.h
@@ -1004,6 +1368,7 @@ cwt_la_SOURCES = cwt.c preview.h
 curvature_la_SOURCES = curvature.c preview.h
 deposit_synth_la_SOURCES = deposit_synth.c dimensions.h preview.h
 diff_synth_la_SOURCES = diff_synth.c dimensions.h synth.h preview.h
+domain_synth_la_SOURCES = domain_synth.c dimensions.h preview.h
 drift_la_SOURCES = drift.c preview.h
 dwt_la_SOURCES = dwt.c preview.h
 dwtanisotropy_la_SOURCES = dwtanisotropy.c
@@ -1019,6 +1384,7 @@ fft_filter_2d_la_SOURCES = fft_filter_2d.c preview.h
 fft_profile_la_SOURCES = fft_profile.c preview.h
 fft_la_SOURCES = fft.c preview.h
 fft_synth_la_SOURCES = fft_synth.c dimensions.h synth.h preview.h
+fibre_synth_la_SOURCES = fibre_synth.c dimensions.h synth.h preview.h
 fit_shape_la_SOURCES = fit-shape.c preview.h
 flatten_base_la_SOURCES = flatten_base.c
 fractal_la_SOURCES = fractal.c preview.h
@@ -1050,11 +1416,17 @@ maskcor_la_SOURCES = maskcor.c
 mask_distribute_la_SOURCES = mask_distribute.c preview.h
 mask_edt_la_SOURCES = mask_edt.c
 mask_morph_la_SOURCES = mask_morph.c
+mask_noisify_la_SOURCES = mask_noisify.c
 maskops_la_SOURCES = maskops.c
 mcrop_la_SOURCES = mcrop.c
 measure_lattice_la_SOURCES = measure_lattice.c preview.h
 median_bg_la_SOURCES = median-bg.c preview.h
 merge_la_SOURCES = merge.c
+mfm_current_la_SOURCES = mfm_current.c mfmops.h
+mfm_field_la_SOURCES = mfm_field.c mfmops.h
+mfm_findshift_la_SOURCES = mfm_findshift.c mfmops.h
+mfm_parallel_la_SOURCES = mfm_parallel.c mfmops.h
+mfm_shift_la_SOURCES = mfm_shift.c mfmops.h
 #nanoindent_adjust_la_SOURCES  = nanoindent_adjust.c
 neural_la_SOURCES = neural.c neuraldata.h
 noise_synth_la_SOURCES = noise_synth.c dimensions.h synth.h preview.h
@@ -1062,11 +1434,14 @@ obj_synth_la_SOURCES = obj_synth.c dimensions.h synth.h preview.h
 otsu_threshold_la_SOURCES = otsu_threshold.c
 outliers_la_SOURCES = outliers.c
 pat_synth_la_SOURCES = pat_synth.c dimensions.h synth.h preview.h
+phase_synth_la_SOURCES = phase_synth.c dimensions.h synth.h preview.h
 pid_la_SOURCES = pid.c preview.h
 polylevel_la_SOURCES = polylevel.c preview.h
 polydistort_la_SOURCES = polydistort.c preview.h
 presentationops_la_SOURCES = presentationops.c
 psdf_logphi_la_SOURCES = psdf_logphi.c preview.h
+psf_la_SOURCES = psf.c preview.h mfmops.h
+psf_fit_la_SOURCES = psf-fit.c
 rank_la_SOURCES = rank.c preview.h
 rotate_la_SOURCES = rotate.c preview.h
 scale_la_SOURCES = scale.c preview.h
@@ -1075,6 +1450,7 @@ semsim_la_SOURCES = semsim.c preview.h
 shade_la_SOURCES = shade.c preview.h
 slope_dist_la_SOURCES = slope_dist.c preview.h
 sphere_revolve_la_SOURCES = sphere-revolve.c preview.h
+stitch_la_SOURCES = stitch.c
 straighten_path_la_SOURCES = straighten_path.c preview.h
 #superresolution_la_SOURCES    = superresolution.c
 threshold_la_SOURCES = threshold.c preview.h
@@ -1089,7 +1465,127 @@ wave_synth_la_SOURCES = wave_synth.c dimensions.h synth.h preview.h
 wpour_mark_la_SOURCES = wpour_mark.c preview.h
 xydenoise_la_SOURCES = xydenoise.c
 xyzize_la_SOURCES = xyzize.c
-all: all-am
+process_la_SOURCES = \
+	$(acf2d_la_SOURCES) \
+	$(angle_dist_la_SOURCES) \
+	$(arithmetic_la_SOURCES) \
+	$(averaging_la_SOURCES) \
+	$(basicops_la_SOURCES) \
+	$(bdep_synth_la_SOURCES) \
+	$(calcoefs_load_la_SOURCES) \
+	$(calcoefs_new_la_SOURCES) \
+	$(calcoefs_simple_la_SOURCES) \
+	$(calcoefs_view_la_SOURCES) \
+	$(calibrate_la_SOURCES) \
+	$(coerce_la_SOURCES) \
+	$(col_synth_la_SOURCES) \
+	$(convolution_filter_la_SOURCES) \
+	$(correct_affine_la_SOURCES) \
+	$(crosscor_la_SOURCES) \
+	$(cwt_la_SOURCES) \
+	$(curvature_la_SOURCES) \
+	$(deposit_synth_la_SOURCES) \
+	$(diff_synth_la_SOURCES) \
+	$(domain_synth_la_SOURCES) \
+	$(drift_la_SOURCES) \
+	$(dwt_la_SOURCES) \
+	$(dwtanisotropy_la_SOURCES) \
+	$(edge_la_SOURCES) \
+	$(entropy_la_SOURCES) \
+	$(extend_la_SOURCES) \
+	$(extract_path_la_SOURCES) \
+	$(facet_analysis_la_SOURCES) \
+	$(facet_level_la_SOURCES) \
+	$(fbm_synth_la_SOURCES) \
+	$(fft_filter_1d_la_SOURCES) \
+	$(fft_filter_2d_la_SOURCES) \
+	$(fft_profile_la_SOURCES) \
+	$(fft_la_SOURCES) \
+	$(fft_synth_la_SOURCES) \
+	$(fibre_synth_la_SOURCES) \
+	$(fit_shape_la_SOURCES) \
+	$(flatten_base_la_SOURCES) \
+	$(fractal_la_SOURCES) \
+	$(fraccor_la_SOURCES) \
+	$(gradient_la_SOURCES) \
+	$(grain_cross_la_SOURCES) \
+	$(grain_dist_la_SOURCES) \
+	$(grain_edge_la_SOURCES) \
+	$(grain_filter_la_SOURCES) \
+	$(grain_mark_la_SOURCES) \
+	$(grain_stat_la_SOURCES) \
+	$(grain_wshed_la_SOURCES) \
+	$(hough_la_SOURCES) \
+	$(immerse_la_SOURCES) \
+	$(indent_analyze_la_SOURCES) \
+	$(laplace_la_SOURCES) \
+	$(lat_synth_la_SOURCES) \
+	$(latsim_la_SOURCES) \
+	$(level_la_SOURCES) \
+	$(level_grains_la_SOURCES) \
+	$(linecorrect_la_SOURCES) \
+	$(linematch_la_SOURCES) \
+	$(lno_synth_la_SOURCES) \
+	$(local_contrast_la_SOURCES) \
+	$(logistic_la_SOURCES) \
+	$(mark_disconn_la_SOURCES) \
+	$(mark_with_la_SOURCES) \
+	$(maskcor_la_SOURCES) \
+	$(mask_distribute_la_SOURCES) \
+	$(mask_edt_la_SOURCES) \
+	$(mask_morph_la_SOURCES) \
+	$(mask_noisify_la_SOURCES) \
+	$(maskops_la_SOURCES) \
+	$(mcrop_la_SOURCES) \
+	$(measure_lattice_la_SOURCES) \
+	$(median_bg_la_SOURCES) \
+	$(merge_la_SOURCES) \
+	$(mfm_current_la_SOURCES) \
+	$(mfm_field_la_SOURCES) \
+	$(mfm_findshift_la_SOURCES) \
+	$(mfm_parallel_la_SOURCES) \
+	$(mfm_shift_la_SOURCES) \
+	$(neural_la_SOURCES) \
+	$(noise_synth_la_SOURCES) \
+	$(obj_synth_la_SOURCES) \
+	$(otsu_threshold_la_SOURCES) \
+	$(outliers_la_SOURCES) \
+	$(pat_synth_la_SOURCES) \
+	$(phase_synth_la_SOURCES) \
+	$(pid_la_SOURCES) \
+	$(polylevel_la_SOURCES) \
+	$(polydistort_la_SOURCES) \
+	$(presentationops_la_SOURCES) \
+	$(psdf_logphi_la_SOURCES) \
+	$(psf_la_SOURCES) \
+	$(psf_fit_la_SOURCES) \
+	$(rank_la_SOURCES) \
+	$(rotate_la_SOURCES) \
+	$(scale_la_SOURCES) \
+	$(scars_la_SOURCES) \
+	$(semsim_la_SOURCES) \
+	$(shade_la_SOURCES) \
+	$(slope_dist_la_SOURCES) \
+	$(sphere_revolve_la_SOURCES) \
+	$(stitch_la_SOURCES) \
+	$(straighten_path_la_SOURCES) \
+	$(threshold_la_SOURCES) \
+	$(tilt_la_SOURCES) \
+	$(tip_blind_la_SOURCES) \
+	$(tip_model_la_SOURCES) \
+	$(tipops_la_SOURCES) \
+	$(unrotate_la_SOURCES) \
+	$(volumize_la_SOURCES) \
+	$(volumize_layers_la_SOURCES) \
+	$(wave_synth_la_SOURCES) \
+	$(wpour_mark_la_SOURCES) \
+	$(xydenoise_la_SOURCES) \
+	$(xyzize_la_SOURCES) \
+	process.c
+
+CLEAN_FILES = process.c
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
 
 .SUFFIXES:
 .SUFFIXES: .c .lo .o .obj
@@ -1159,316 +1655,352 @@ clean-processLTLIBRARIES:
 	}
 
 acf2d.la: $(acf2d_la_OBJECTS) $(acf2d_la_DEPENDENCIES) $(EXTRA_acf2d_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(acf2d_la_OBJECTS) $(acf2d_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_acf2d_la_rpath) $(acf2d_la_OBJECTS) $(acf2d_la_LIBADD) $(LIBS)
 
 angle_dist.la: $(angle_dist_la_OBJECTS) $(angle_dist_la_DEPENDENCIES) $(EXTRA_angle_dist_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(angle_dist_la_OBJECTS) $(angle_dist_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_angle_dist_la_rpath) $(angle_dist_la_OBJECTS) $(angle_dist_la_LIBADD) $(LIBS)
 
 arithmetic.la: $(arithmetic_la_OBJECTS) $(arithmetic_la_DEPENDENCIES) $(EXTRA_arithmetic_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(arithmetic_la_OBJECTS) $(arithmetic_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_arithmetic_la_rpath) $(arithmetic_la_OBJECTS) $(arithmetic_la_LIBADD) $(LIBS)
 
 averaging.la: $(averaging_la_OBJECTS) $(averaging_la_DEPENDENCIES) $(EXTRA_averaging_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(averaging_la_OBJECTS) $(averaging_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_averaging_la_rpath) $(averaging_la_OBJECTS) $(averaging_la_LIBADD) $(LIBS)
 
 basicops.la: $(basicops_la_OBJECTS) $(basicops_la_DEPENDENCIES) $(EXTRA_basicops_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(basicops_la_OBJECTS) $(basicops_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_basicops_la_rpath) $(basicops_la_OBJECTS) $(basicops_la_LIBADD) $(LIBS)
 
 bdep_synth.la: $(bdep_synth_la_OBJECTS) $(bdep_synth_la_DEPENDENCIES) $(EXTRA_bdep_synth_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(bdep_synth_la_OBJECTS) $(bdep_synth_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_bdep_synth_la_rpath) $(bdep_synth_la_OBJECTS) $(bdep_synth_la_LIBADD) $(LIBS)
 
 calcoefs_load.la: $(calcoefs_load_la_OBJECTS) $(calcoefs_load_la_DEPENDENCIES) $(EXTRA_calcoefs_load_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(calcoefs_load_la_OBJECTS) $(calcoefs_load_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_calcoefs_load_la_rpath) $(calcoefs_load_la_OBJECTS) $(calcoefs_load_la_LIBADD) $(LIBS)
 
 calcoefs_new.la: $(calcoefs_new_la_OBJECTS) $(calcoefs_new_la_DEPENDENCIES) $(EXTRA_calcoefs_new_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(calcoefs_new_la_OBJECTS) $(calcoefs_new_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_calcoefs_new_la_rpath) $(calcoefs_new_la_OBJECTS) $(calcoefs_new_la_LIBADD) $(LIBS)
 
 calcoefs_simple.la: $(calcoefs_simple_la_OBJECTS) $(calcoefs_simple_la_DEPENDENCIES) $(EXTRA_calcoefs_simple_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(calcoefs_simple_la_OBJECTS) $(calcoefs_simple_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_calcoefs_simple_la_rpath) $(calcoefs_simple_la_OBJECTS) $(calcoefs_simple_la_LIBADD) $(LIBS)
 
 calcoefs_view.la: $(calcoefs_view_la_OBJECTS) $(calcoefs_view_la_DEPENDENCIES) $(EXTRA_calcoefs_view_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(calcoefs_view_la_OBJECTS) $(calcoefs_view_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_calcoefs_view_la_rpath) $(calcoefs_view_la_OBJECTS) $(calcoefs_view_la_LIBADD) $(LIBS)
 
 calibrate.la: $(calibrate_la_OBJECTS) $(calibrate_la_DEPENDENCIES) $(EXTRA_calibrate_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(calibrate_la_OBJECTS) $(calibrate_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_calibrate_la_rpath) $(calibrate_la_OBJECTS) $(calibrate_la_LIBADD) $(LIBS)
 
 coerce.la: $(coerce_la_OBJECTS) $(coerce_la_DEPENDENCIES) $(EXTRA_coerce_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(coerce_la_OBJECTS) $(coerce_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_coerce_la_rpath) $(coerce_la_OBJECTS) $(coerce_la_LIBADD) $(LIBS)
 
 col_synth.la: $(col_synth_la_OBJECTS) $(col_synth_la_DEPENDENCIES) $(EXTRA_col_synth_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(col_synth_la_OBJECTS) $(col_synth_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_col_synth_la_rpath) $(col_synth_la_OBJECTS) $(col_synth_la_LIBADD) $(LIBS)
 
 convolution_filter.la: $(convolution_filter_la_OBJECTS) $(convolution_filter_la_DEPENDENCIES) $(EXTRA_convolution_filter_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(convolution_filter_la_OBJECTS) $(convolution_filter_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_convolution_filter_la_rpath) $(convolution_filter_la_OBJECTS) $(convolution_filter_la_LIBADD) $(LIBS)
 
 correct_affine.la: $(correct_affine_la_OBJECTS) $(correct_affine_la_DEPENDENCIES) $(EXTRA_correct_affine_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(correct_affine_la_OBJECTS) $(correct_affine_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_correct_affine_la_rpath) $(correct_affine_la_OBJECTS) $(correct_affine_la_LIBADD) $(LIBS)
 
 crosscor.la: $(crosscor_la_OBJECTS) $(crosscor_la_DEPENDENCIES) $(EXTRA_crosscor_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(crosscor_la_OBJECTS) $(crosscor_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_crosscor_la_rpath) $(crosscor_la_OBJECTS) $(crosscor_la_LIBADD) $(LIBS)
 
 curvature.la: $(curvature_la_OBJECTS) $(curvature_la_DEPENDENCIES) $(EXTRA_curvature_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(curvature_la_OBJECTS) $(curvature_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_curvature_la_rpath) $(curvature_la_OBJECTS) $(curvature_la_LIBADD) $(LIBS)
 
 cwt.la: $(cwt_la_OBJECTS) $(cwt_la_DEPENDENCIES) $(EXTRA_cwt_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(cwt_la_OBJECTS) $(cwt_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_cwt_la_rpath) $(cwt_la_OBJECTS) $(cwt_la_LIBADD) $(LIBS)
 
 deposit_synth.la: $(deposit_synth_la_OBJECTS) $(deposit_synth_la_DEPENDENCIES) $(EXTRA_deposit_synth_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(deposit_synth_la_OBJECTS) $(deposit_synth_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_deposit_synth_la_rpath) $(deposit_synth_la_OBJECTS) $(deposit_synth_la_LIBADD) $(LIBS)
 
 diff_synth.la: $(diff_synth_la_OBJECTS) $(diff_synth_la_DEPENDENCIES) $(EXTRA_diff_synth_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(diff_synth_la_OBJECTS) $(diff_synth_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_diff_synth_la_rpath) $(diff_synth_la_OBJECTS) $(diff_synth_la_LIBADD) $(LIBS)
 
 domain_synth.la: $(domain_synth_la_OBJECTS) $(domain_synth_la_DEPENDENCIES) $(EXTRA_domain_synth_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(domain_synth_la_OBJECTS) $(domain_synth_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_domain_synth_la_rpath) $(domain_synth_la_OBJECTS) $(domain_synth_la_LIBADD) $(LIBS)
 
 drift.la: $(drift_la_OBJECTS) $(drift_la_DEPENDENCIES) $(EXTRA_drift_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(drift_la_OBJECTS) $(drift_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_drift_la_rpath) $(drift_la_OBJECTS) $(drift_la_LIBADD) $(LIBS)
 
 dwt.la: $(dwt_la_OBJECTS) $(dwt_la_DEPENDENCIES) $(EXTRA_dwt_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(dwt_la_OBJECTS) $(dwt_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_dwt_la_rpath) $(dwt_la_OBJECTS) $(dwt_la_LIBADD) $(LIBS)
 
 dwtanisotropy.la: $(dwtanisotropy_la_OBJECTS) $(dwtanisotropy_la_DEPENDENCIES) $(EXTRA_dwtanisotropy_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(dwtanisotropy_la_OBJECTS) $(dwtanisotropy_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_dwtanisotropy_la_rpath) $(dwtanisotropy_la_OBJECTS) $(dwtanisotropy_la_LIBADD) $(LIBS)
 
 edge.la: $(edge_la_OBJECTS) $(edge_la_DEPENDENCIES) $(EXTRA_edge_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(edge_la_OBJECTS) $(edge_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_edge_la_rpath) $(edge_la_OBJECTS) $(edge_la_LIBADD) $(LIBS)
 
 entropy.la: $(entropy_la_OBJECTS) $(entropy_la_DEPENDENCIES) $(EXTRA_entropy_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(entropy_la_OBJECTS) $(entropy_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_entropy_la_rpath) $(entropy_la_OBJECTS) $(entropy_la_LIBADD) $(LIBS)
 
 extend.la: $(extend_la_OBJECTS) $(extend_la_DEPENDENCIES) $(EXTRA_extend_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(extend_la_OBJECTS) $(extend_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_extend_la_rpath) $(extend_la_OBJECTS) $(extend_la_LIBADD) $(LIBS)
 
 extract_path.la: $(extract_path_la_OBJECTS) $(extract_path_la_DEPENDENCIES) $(EXTRA_extract_path_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(extract_path_la_OBJECTS) $(extract_path_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_extract_path_la_rpath) $(extract_path_la_OBJECTS) $(extract_path_la_LIBADD) $(LIBS)
 
 facet-level.la: $(facet_level_la_OBJECTS) $(facet_level_la_DEPENDENCIES) $(EXTRA_facet_level_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(facet_level_la_OBJECTS) $(facet_level_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_facet_level_la_rpath) $(facet_level_la_OBJECTS) $(facet_level_la_LIBADD) $(LIBS)
 
 facet_analysis.la: $(facet_analysis_la_OBJECTS) $(facet_analysis_la_DEPENDENCIES) $(EXTRA_facet_analysis_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(facet_analysis_la_OBJECTS) $(facet_analysis_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_facet_analysis_la_rpath) $(facet_analysis_la_OBJECTS) $(facet_analysis_la_LIBADD) $(LIBS)
 
 fbm_synth.la: $(fbm_synth_la_OBJECTS) $(fbm_synth_la_DEPENDENCIES) $(EXTRA_fbm_synth_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(fbm_synth_la_OBJECTS) $(fbm_synth_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_fbm_synth_la_rpath) $(fbm_synth_la_OBJECTS) $(fbm_synth_la_LIBADD) $(LIBS)
 
 fft.la: $(fft_la_OBJECTS) $(fft_la_DEPENDENCIES) $(EXTRA_fft_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(fft_la_OBJECTS) $(fft_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_fft_la_rpath) $(fft_la_OBJECTS) $(fft_la_LIBADD) $(LIBS)
 
 fft_filter_1d.la: $(fft_filter_1d_la_OBJECTS) $(fft_filter_1d_la_DEPENDENCIES) $(EXTRA_fft_filter_1d_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(fft_filter_1d_la_OBJECTS) $(fft_filter_1d_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_fft_filter_1d_la_rpath) $(fft_filter_1d_la_OBJECTS) $(fft_filter_1d_la_LIBADD) $(LIBS)
 
 fft_filter_2d.la: $(fft_filter_2d_la_OBJECTS) $(fft_filter_2d_la_DEPENDENCIES) $(EXTRA_fft_filter_2d_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(fft_filter_2d_la_OBJECTS) $(fft_filter_2d_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_fft_filter_2d_la_rpath) $(fft_filter_2d_la_OBJECTS) $(fft_filter_2d_la_LIBADD) $(LIBS)
 
 fft_profile.la: $(fft_profile_la_OBJECTS) $(fft_profile_la_DEPENDENCIES) $(EXTRA_fft_profile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(fft_profile_la_OBJECTS) $(fft_profile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_fft_profile_la_rpath) $(fft_profile_la_OBJECTS) $(fft_profile_la_LIBADD) $(LIBS)
 
 fft_synth.la: $(fft_synth_la_OBJECTS) $(fft_synth_la_DEPENDENCIES) $(EXTRA_fft_synth_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(fft_synth_la_OBJECTS) $(fft_synth_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_fft_synth_la_rpath) $(fft_synth_la_OBJECTS) $(fft_synth_la_LIBADD) $(LIBS)
+
+fibre_synth.la: $(fibre_synth_la_OBJECTS) $(fibre_synth_la_DEPENDENCIES) $(EXTRA_fibre_synth_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_fibre_synth_la_rpath) $(fibre_synth_la_OBJECTS) $(fibre_synth_la_LIBADD) $(LIBS)
 
 fit-shape.la: $(fit_shape_la_OBJECTS) $(fit_shape_la_DEPENDENCIES) $(EXTRA_fit_shape_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(fit_shape_la_OBJECTS) $(fit_shape_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_fit_shape_la_rpath) $(fit_shape_la_OBJECTS) $(fit_shape_la_LIBADD) $(LIBS)
 
 flatten_base.la: $(flatten_base_la_OBJECTS) $(flatten_base_la_DEPENDENCIES) $(EXTRA_flatten_base_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(flatten_base_la_OBJECTS) $(flatten_base_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_flatten_base_la_rpath) $(flatten_base_la_OBJECTS) $(flatten_base_la_LIBADD) $(LIBS)
 
 fraccor.la: $(fraccor_la_OBJECTS) $(fraccor_la_DEPENDENCIES) $(EXTRA_fraccor_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(fraccor_la_OBJECTS) $(fraccor_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_fraccor_la_rpath) $(fraccor_la_OBJECTS) $(fraccor_la_LIBADD) $(LIBS)
 
 fractal.la: $(fractal_la_OBJECTS) $(fractal_la_DEPENDENCIES) $(EXTRA_fractal_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(fractal_la_OBJECTS) $(fractal_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_fractal_la_rpath) $(fractal_la_OBJECTS) $(fractal_la_LIBADD) $(LIBS)
 
 gradient.la: $(gradient_la_OBJECTS) $(gradient_la_DEPENDENCIES) $(EXTRA_gradient_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(gradient_la_OBJECTS) $(gradient_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_gradient_la_rpath) $(gradient_la_OBJECTS) $(gradient_la_LIBADD) $(LIBS)
 
 grain_cross.la: $(grain_cross_la_OBJECTS) $(grain_cross_la_DEPENDENCIES) $(EXTRA_grain_cross_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(grain_cross_la_OBJECTS) $(grain_cross_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_grain_cross_la_rpath) $(grain_cross_la_OBJECTS) $(grain_cross_la_LIBADD) $(LIBS)
 
 grain_dist.la: $(grain_dist_la_OBJECTS) $(grain_dist_la_DEPENDENCIES) $(EXTRA_grain_dist_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(grain_dist_la_OBJECTS) $(grain_dist_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_grain_dist_la_rpath) $(grain_dist_la_OBJECTS) $(grain_dist_la_LIBADD) $(LIBS)
 
 grain_edge.la: $(grain_edge_la_OBJECTS) $(grain_edge_la_DEPENDENCIES) $(EXTRA_grain_edge_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(grain_edge_la_OBJECTS) $(grain_edge_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_grain_edge_la_rpath) $(grain_edge_la_OBJECTS) $(grain_edge_la_LIBADD) $(LIBS)
 
 grain_filter.la: $(grain_filter_la_OBJECTS) $(grain_filter_la_DEPENDENCIES) $(EXTRA_grain_filter_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(grain_filter_la_OBJECTS) $(grain_filter_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_grain_filter_la_rpath) $(grain_filter_la_OBJECTS) $(grain_filter_la_LIBADD) $(LIBS)
 
 grain_mark.la: $(grain_mark_la_OBJECTS) $(grain_mark_la_DEPENDENCIES) $(EXTRA_grain_mark_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(grain_mark_la_OBJECTS) $(grain_mark_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_grain_mark_la_rpath) $(grain_mark_la_OBJECTS) $(grain_mark_la_LIBADD) $(LIBS)
 
 grain_stat.la: $(grain_stat_la_OBJECTS) $(grain_stat_la_DEPENDENCIES) $(EXTRA_grain_stat_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(grain_stat_la_OBJECTS) $(grain_stat_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_grain_stat_la_rpath) $(grain_stat_la_OBJECTS) $(grain_stat_la_LIBADD) $(LIBS)
 
 grain_wshed.la: $(grain_wshed_la_OBJECTS) $(grain_wshed_la_DEPENDENCIES) $(EXTRA_grain_wshed_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(grain_wshed_la_OBJECTS) $(grain_wshed_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_grain_wshed_la_rpath) $(grain_wshed_la_OBJECTS) $(grain_wshed_la_LIBADD) $(LIBS)
 
 hough.la: $(hough_la_OBJECTS) $(hough_la_DEPENDENCIES) $(EXTRA_hough_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(hough_la_OBJECTS) $(hough_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_hough_la_rpath) $(hough_la_OBJECTS) $(hough_la_LIBADD) $(LIBS)
 
 immerse.la: $(immerse_la_OBJECTS) $(immerse_la_DEPENDENCIES) $(EXTRA_immerse_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(immerse_la_OBJECTS) $(immerse_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_immerse_la_rpath) $(immerse_la_OBJECTS) $(immerse_la_LIBADD) $(LIBS)
 
 indent_analyze.la: $(indent_analyze_la_OBJECTS) $(indent_analyze_la_DEPENDENCIES) $(EXTRA_indent_analyze_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(indent_analyze_la_OBJECTS) $(indent_analyze_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_indent_analyze_la_rpath) $(indent_analyze_la_OBJECTS) $(indent_analyze_la_LIBADD) $(LIBS)
 
 laplace.la: $(laplace_la_OBJECTS) $(laplace_la_DEPENDENCIES) $(EXTRA_laplace_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(laplace_la_OBJECTS) $(laplace_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_laplace_la_rpath) $(laplace_la_OBJECTS) $(laplace_la_LIBADD) $(LIBS)
 
 lat_synth.la: $(lat_synth_la_OBJECTS) $(lat_synth_la_DEPENDENCIES) $(EXTRA_lat_synth_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(lat_synth_la_OBJECTS) $(lat_synth_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_lat_synth_la_rpath) $(lat_synth_la_OBJECTS) $(lat_synth_la_LIBADD) $(LIBS)
 
 latsim.la: $(latsim_la_OBJECTS) $(latsim_la_DEPENDENCIES) $(EXTRA_latsim_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(latsim_la_OBJECTS) $(latsim_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_latsim_la_rpath) $(latsim_la_OBJECTS) $(latsim_la_LIBADD) $(LIBS)
 
 level.la: $(level_la_OBJECTS) $(level_la_DEPENDENCIES) $(EXTRA_level_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(level_la_OBJECTS) $(level_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_level_la_rpath) $(level_la_OBJECTS) $(level_la_LIBADD) $(LIBS)
 
 level_grains.la: $(level_grains_la_OBJECTS) $(level_grains_la_DEPENDENCIES) $(EXTRA_level_grains_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(level_grains_la_OBJECTS) $(level_grains_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_level_grains_la_rpath) $(level_grains_la_OBJECTS) $(level_grains_la_LIBADD) $(LIBS)
 
 linecorrect.la: $(linecorrect_la_OBJECTS) $(linecorrect_la_DEPENDENCIES) $(EXTRA_linecorrect_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(linecorrect_la_OBJECTS) $(linecorrect_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_linecorrect_la_rpath) $(linecorrect_la_OBJECTS) $(linecorrect_la_LIBADD) $(LIBS)
 
 linematch.la: $(linematch_la_OBJECTS) $(linematch_la_DEPENDENCIES) $(EXTRA_linematch_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(linematch_la_OBJECTS) $(linematch_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_linematch_la_rpath) $(linematch_la_OBJECTS) $(linematch_la_LIBADD) $(LIBS)
 
 lno_synth.la: $(lno_synth_la_OBJECTS) $(lno_synth_la_DEPENDENCIES) $(EXTRA_lno_synth_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(lno_synth_la_OBJECTS) $(lno_synth_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_lno_synth_la_rpath) $(lno_synth_la_OBJECTS) $(lno_synth_la_LIBADD) $(LIBS)
 
 local_contrast.la: $(local_contrast_la_OBJECTS) $(local_contrast_la_DEPENDENCIES) $(EXTRA_local_contrast_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(local_contrast_la_OBJECTS) $(local_contrast_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_local_contrast_la_rpath) $(local_contrast_la_OBJECTS) $(local_contrast_la_LIBADD) $(LIBS)
 
 logistic.la: $(logistic_la_OBJECTS) $(logistic_la_DEPENDENCIES) $(EXTRA_logistic_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(logistic_la_OBJECTS) $(logistic_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_logistic_la_rpath) $(logistic_la_OBJECTS) $(logistic_la_LIBADD) $(LIBS)
 
 mark_disconn.la: $(mark_disconn_la_OBJECTS) $(mark_disconn_la_DEPENDENCIES) $(EXTRA_mark_disconn_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(mark_disconn_la_OBJECTS) $(mark_disconn_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_mark_disconn_la_rpath) $(mark_disconn_la_OBJECTS) $(mark_disconn_la_LIBADD) $(LIBS)
 
 mark_with.la: $(mark_with_la_OBJECTS) $(mark_with_la_DEPENDENCIES) $(EXTRA_mark_with_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(mark_with_la_OBJECTS) $(mark_with_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_mark_with_la_rpath) $(mark_with_la_OBJECTS) $(mark_with_la_LIBADD) $(LIBS)
 
 mask_distribute.la: $(mask_distribute_la_OBJECTS) $(mask_distribute_la_DEPENDENCIES) $(EXTRA_mask_distribute_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(mask_distribute_la_OBJECTS) $(mask_distribute_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_mask_distribute_la_rpath) $(mask_distribute_la_OBJECTS) $(mask_distribute_la_LIBADD) $(LIBS)
 
 mask_edt.la: $(mask_edt_la_OBJECTS) $(mask_edt_la_DEPENDENCIES) $(EXTRA_mask_edt_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(mask_edt_la_OBJECTS) $(mask_edt_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_mask_edt_la_rpath) $(mask_edt_la_OBJECTS) $(mask_edt_la_LIBADD) $(LIBS)
 
 mask_morph.la: $(mask_morph_la_OBJECTS) $(mask_morph_la_DEPENDENCIES) $(EXTRA_mask_morph_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(mask_morph_la_OBJECTS) $(mask_morph_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_mask_morph_la_rpath) $(mask_morph_la_OBJECTS) $(mask_morph_la_LIBADD) $(LIBS)
+
+mask_noisify.la: $(mask_noisify_la_OBJECTS) $(mask_noisify_la_DEPENDENCIES) $(EXTRA_mask_noisify_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_mask_noisify_la_rpath) $(mask_noisify_la_OBJECTS) $(mask_noisify_la_LIBADD) $(LIBS)
 
 maskcor.la: $(maskcor_la_OBJECTS) $(maskcor_la_DEPENDENCIES) $(EXTRA_maskcor_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(maskcor_la_OBJECTS) $(maskcor_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_maskcor_la_rpath) $(maskcor_la_OBJECTS) $(maskcor_la_LIBADD) $(LIBS)
 
 maskops.la: $(maskops_la_OBJECTS) $(maskops_la_DEPENDENCIES) $(EXTRA_maskops_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(maskops_la_OBJECTS) $(maskops_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_maskops_la_rpath) $(maskops_la_OBJECTS) $(maskops_la_LIBADD) $(LIBS)
 
 mcrop.la: $(mcrop_la_OBJECTS) $(mcrop_la_DEPENDENCIES) $(EXTRA_mcrop_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(mcrop_la_OBJECTS) $(mcrop_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_mcrop_la_rpath) $(mcrop_la_OBJECTS) $(mcrop_la_LIBADD) $(LIBS)
 
 measure_lattice.la: $(measure_lattice_la_OBJECTS) $(measure_lattice_la_DEPENDENCIES) $(EXTRA_measure_lattice_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(measure_lattice_la_OBJECTS) $(measure_lattice_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_measure_lattice_la_rpath) $(measure_lattice_la_OBJECTS) $(measure_lattice_la_LIBADD) $(LIBS)
 
 median-bg.la: $(median_bg_la_OBJECTS) $(median_bg_la_DEPENDENCIES) $(EXTRA_median_bg_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(median_bg_la_OBJECTS) $(median_bg_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_median_bg_la_rpath) $(median_bg_la_OBJECTS) $(median_bg_la_LIBADD) $(LIBS)
 
 merge.la: $(merge_la_OBJECTS) $(merge_la_DEPENDENCIES) $(EXTRA_merge_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(merge_la_OBJECTS) $(merge_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_merge_la_rpath) $(merge_la_OBJECTS) $(merge_la_LIBADD) $(LIBS)
+
+mfm_current.la: $(mfm_current_la_OBJECTS) $(mfm_current_la_DEPENDENCIES) $(EXTRA_mfm_current_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_mfm_current_la_rpath) $(mfm_current_la_OBJECTS) $(mfm_current_la_LIBADD) $(LIBS)
+
+mfm_field.la: $(mfm_field_la_OBJECTS) $(mfm_field_la_DEPENDENCIES) $(EXTRA_mfm_field_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_mfm_field_la_rpath) $(mfm_field_la_OBJECTS) $(mfm_field_la_LIBADD) $(LIBS)
+
+mfm_findshift.la: $(mfm_findshift_la_OBJECTS) $(mfm_findshift_la_DEPENDENCIES) $(EXTRA_mfm_findshift_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_mfm_findshift_la_rpath) $(mfm_findshift_la_OBJECTS) $(mfm_findshift_la_LIBADD) $(LIBS)
+
+mfm_parallel.la: $(mfm_parallel_la_OBJECTS) $(mfm_parallel_la_DEPENDENCIES) $(EXTRA_mfm_parallel_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_mfm_parallel_la_rpath) $(mfm_parallel_la_OBJECTS) $(mfm_parallel_la_LIBADD) $(LIBS)
+
+mfm_shift.la: $(mfm_shift_la_OBJECTS) $(mfm_shift_la_DEPENDENCIES) $(EXTRA_mfm_shift_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_mfm_shift_la_rpath) $(mfm_shift_la_OBJECTS) $(mfm_shift_la_LIBADD) $(LIBS)
 
 neural.la: $(neural_la_OBJECTS) $(neural_la_DEPENDENCIES) $(EXTRA_neural_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(neural_la_OBJECTS) $(neural_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_neural_la_rpath) $(neural_la_OBJECTS) $(neural_la_LIBADD) $(LIBS)
 
 noise_synth.la: $(noise_synth_la_OBJECTS) $(noise_synth_la_DEPENDENCIES) $(EXTRA_noise_synth_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(noise_synth_la_OBJECTS) $(noise_synth_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_noise_synth_la_rpath) $(noise_synth_la_OBJECTS) $(noise_synth_la_LIBADD) $(LIBS)
 
 obj_synth.la: $(obj_synth_la_OBJECTS) $(obj_synth_la_DEPENDENCIES) $(EXTRA_obj_synth_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(obj_synth_la_OBJECTS) $(obj_synth_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_obj_synth_la_rpath) $(obj_synth_la_OBJECTS) $(obj_synth_la_LIBADD) $(LIBS)
 
 otsu_threshold.la: $(otsu_threshold_la_OBJECTS) $(otsu_threshold_la_DEPENDENCIES) $(EXTRA_otsu_threshold_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(otsu_threshold_la_OBJECTS) $(otsu_threshold_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_otsu_threshold_la_rpath) $(otsu_threshold_la_OBJECTS) $(otsu_threshold_la_LIBADD) $(LIBS)
 
 outliers.la: $(outliers_la_OBJECTS) $(outliers_la_DEPENDENCIES) $(EXTRA_outliers_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(outliers_la_OBJECTS) $(outliers_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_outliers_la_rpath) $(outliers_la_OBJECTS) $(outliers_la_LIBADD) $(LIBS)
 
 pat_synth.la: $(pat_synth_la_OBJECTS) $(pat_synth_la_DEPENDENCIES) $(EXTRA_pat_synth_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(pat_synth_la_OBJECTS) $(pat_synth_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_pat_synth_la_rpath) $(pat_synth_la_OBJECTS) $(pat_synth_la_LIBADD) $(LIBS)
+
+phase_synth.la: $(phase_synth_la_OBJECTS) $(phase_synth_la_DEPENDENCIES) $(EXTRA_phase_synth_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_phase_synth_la_rpath) $(phase_synth_la_OBJECTS) $(phase_synth_la_LIBADD) $(LIBS)
 
 pid.la: $(pid_la_OBJECTS) $(pid_la_DEPENDENCIES) $(EXTRA_pid_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(pid_la_OBJECTS) $(pid_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_pid_la_rpath) $(pid_la_OBJECTS) $(pid_la_LIBADD) $(LIBS)
 
 polydistort.la: $(polydistort_la_OBJECTS) $(polydistort_la_DEPENDENCIES) $(EXTRA_polydistort_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(polydistort_la_OBJECTS) $(polydistort_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_polydistort_la_rpath) $(polydistort_la_OBJECTS) $(polydistort_la_LIBADD) $(LIBS)
 
 polylevel.la: $(polylevel_la_OBJECTS) $(polylevel_la_DEPENDENCIES) $(EXTRA_polylevel_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(polylevel_la_OBJECTS) $(polylevel_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_polylevel_la_rpath) $(polylevel_la_OBJECTS) $(polylevel_la_LIBADD) $(LIBS)
 
 presentationops.la: $(presentationops_la_OBJECTS) $(presentationops_la_DEPENDENCIES) $(EXTRA_presentationops_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(presentationops_la_OBJECTS) $(presentationops_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_presentationops_la_rpath) $(presentationops_la_OBJECTS) $(presentationops_la_LIBADD) $(LIBS)
+
+process.la: $(process_la_OBJECTS) $(process_la_DEPENDENCIES) $(EXTRA_process_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(process_la_LINK) $(am_process_la_rpath) $(process_la_OBJECTS) $(process_la_LIBADD) $(LIBS)
 
 psdf_logphi.la: $(psdf_logphi_la_OBJECTS) $(psdf_logphi_la_DEPENDENCIES) $(EXTRA_psdf_logphi_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(psdf_logphi_la_OBJECTS) $(psdf_logphi_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_psdf_logphi_la_rpath) $(psdf_logphi_la_OBJECTS) $(psdf_logphi_la_LIBADD) $(LIBS)
+
+psf-fit.la: $(psf_fit_la_OBJECTS) $(psf_fit_la_DEPENDENCIES) $(EXTRA_psf_fit_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_psf_fit_la_rpath) $(psf_fit_la_OBJECTS) $(psf_fit_la_LIBADD) $(LIBS)
+
+psf.la: $(psf_la_OBJECTS) $(psf_la_DEPENDENCIES) $(EXTRA_psf_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_psf_la_rpath) $(psf_la_OBJECTS) $(psf_la_LIBADD) $(LIBS)
 
 rank.la: $(rank_la_OBJECTS) $(rank_la_DEPENDENCIES) $(EXTRA_rank_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(rank_la_OBJECTS) $(rank_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_rank_la_rpath) $(rank_la_OBJECTS) $(rank_la_LIBADD) $(LIBS)
 
 rotate.la: $(rotate_la_OBJECTS) $(rotate_la_DEPENDENCIES) $(EXTRA_rotate_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(rotate_la_OBJECTS) $(rotate_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_rotate_la_rpath) $(rotate_la_OBJECTS) $(rotate_la_LIBADD) $(LIBS)
 
 scale.la: $(scale_la_OBJECTS) $(scale_la_DEPENDENCIES) $(EXTRA_scale_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(scale_la_OBJECTS) $(scale_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_scale_la_rpath) $(scale_la_OBJECTS) $(scale_la_LIBADD) $(LIBS)
 
 scars.la: $(scars_la_OBJECTS) $(scars_la_DEPENDENCIES) $(EXTRA_scars_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(scars_la_OBJECTS) $(scars_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_scars_la_rpath) $(scars_la_OBJECTS) $(scars_la_LIBADD) $(LIBS)
 
 semsim.la: $(semsim_la_OBJECTS) $(semsim_la_DEPENDENCIES) $(EXTRA_semsim_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(semsim_la_OBJECTS) $(semsim_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_semsim_la_rpath) $(semsim_la_OBJECTS) $(semsim_la_LIBADD) $(LIBS)
 
 shade.la: $(shade_la_OBJECTS) $(shade_la_DEPENDENCIES) $(EXTRA_shade_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(shade_la_OBJECTS) $(shade_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_shade_la_rpath) $(shade_la_OBJECTS) $(shade_la_LIBADD) $(LIBS)
 
 slope_dist.la: $(slope_dist_la_OBJECTS) $(slope_dist_la_DEPENDENCIES) $(EXTRA_slope_dist_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(slope_dist_la_OBJECTS) $(slope_dist_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_slope_dist_la_rpath) $(slope_dist_la_OBJECTS) $(slope_dist_la_LIBADD) $(LIBS)
 
 sphere-revolve.la: $(sphere_revolve_la_OBJECTS) $(sphere_revolve_la_DEPENDENCIES) $(EXTRA_sphere_revolve_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(sphere_revolve_la_OBJECTS) $(sphere_revolve_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_sphere_revolve_la_rpath) $(sphere_revolve_la_OBJECTS) $(sphere_revolve_la_LIBADD) $(LIBS)
+
+stitch.la: $(stitch_la_OBJECTS) $(stitch_la_DEPENDENCIES) $(EXTRA_stitch_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_stitch_la_rpath) $(stitch_la_OBJECTS) $(stitch_la_LIBADD) $(LIBS)
 
 straighten_path.la: $(straighten_path_la_OBJECTS) $(straighten_path_la_DEPENDENCIES) $(EXTRA_straighten_path_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(straighten_path_la_OBJECTS) $(straighten_path_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_straighten_path_la_rpath) $(straighten_path_la_OBJECTS) $(straighten_path_la_LIBADD) $(LIBS)
 
 threshold.la: $(threshold_la_OBJECTS) $(threshold_la_DEPENDENCIES) $(EXTRA_threshold_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(threshold_la_OBJECTS) $(threshold_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_threshold_la_rpath) $(threshold_la_OBJECTS) $(threshold_la_LIBADD) $(LIBS)
 
 tilt.la: $(tilt_la_OBJECTS) $(tilt_la_DEPENDENCIES) $(EXTRA_tilt_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(tilt_la_OBJECTS) $(tilt_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_tilt_la_rpath) $(tilt_la_OBJECTS) $(tilt_la_LIBADD) $(LIBS)
 
 tip_blind.la: $(tip_blind_la_OBJECTS) $(tip_blind_la_DEPENDENCIES) $(EXTRA_tip_blind_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(tip_blind_la_OBJECTS) $(tip_blind_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_tip_blind_la_rpath) $(tip_blind_la_OBJECTS) $(tip_blind_la_LIBADD) $(LIBS)
 
 tip_model.la: $(tip_model_la_OBJECTS) $(tip_model_la_DEPENDENCIES) $(EXTRA_tip_model_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(tip_model_la_OBJECTS) $(tip_model_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_tip_model_la_rpath) $(tip_model_la_OBJECTS) $(tip_model_la_LIBADD) $(LIBS)
 
 tipops.la: $(tipops_la_OBJECTS) $(tipops_la_DEPENDENCIES) $(EXTRA_tipops_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(tipops_la_OBJECTS) $(tipops_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_tipops_la_rpath) $(tipops_la_OBJECTS) $(tipops_la_LIBADD) $(LIBS)
 
 unrotate.la: $(unrotate_la_OBJECTS) $(unrotate_la_DEPENDENCIES) $(EXTRA_unrotate_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(unrotate_la_OBJECTS) $(unrotate_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_unrotate_la_rpath) $(unrotate_la_OBJECTS) $(unrotate_la_LIBADD) $(LIBS)
 
 volumize.la: $(volumize_la_OBJECTS) $(volumize_la_DEPENDENCIES) $(EXTRA_volumize_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(volumize_la_OBJECTS) $(volumize_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_volumize_la_rpath) $(volumize_la_OBJECTS) $(volumize_la_LIBADD) $(LIBS)
 
 volumize_layers.la: $(volumize_layers_la_OBJECTS) $(volumize_layers_la_DEPENDENCIES) $(EXTRA_volumize_layers_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(volumize_layers_la_OBJECTS) $(volumize_layers_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_volumize_layers_la_rpath) $(volumize_layers_la_OBJECTS) $(volumize_layers_la_LIBADD) $(LIBS)
 
 wave_synth.la: $(wave_synth_la_OBJECTS) $(wave_synth_la_DEPENDENCIES) $(EXTRA_wave_synth_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(wave_synth_la_OBJECTS) $(wave_synth_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_wave_synth_la_rpath) $(wave_synth_la_OBJECTS) $(wave_synth_la_LIBADD) $(LIBS)
 
 wpour_mark.la: $(wpour_mark_la_OBJECTS) $(wpour_mark_la_DEPENDENCIES) $(EXTRA_wpour_mark_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(wpour_mark_la_OBJECTS) $(wpour_mark_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_wpour_mark_la_rpath) $(wpour_mark_la_OBJECTS) $(wpour_mark_la_LIBADD) $(LIBS)
 
 xydenoise.la: $(xydenoise_la_OBJECTS) $(xydenoise_la_DEPENDENCIES) $(EXTRA_xydenoise_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(xydenoise_la_OBJECTS) $(xydenoise_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_xydenoise_la_rpath) $(xydenoise_la_OBJECTS) $(xydenoise_la_LIBADD) $(LIBS)
 
 xyzize.la: $(xyzize_la_OBJECTS) $(xyzize_la_DEPENDENCIES) $(EXTRA_xyzize_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(processdir) $(xyzize_la_OBJECTS) $(xyzize_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_xyzize_la_rpath) $(xyzize_la_OBJECTS) $(xyzize_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -1512,6 +2044,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fft_filter_2d.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fft_profile.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fft_synth.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fibre_synth.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fit-shape.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/flatten_base.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fraccor.Plo at am__quote@
@@ -1542,23 +2075,148 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mask_distribute.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mask_edt.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mask_morph.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mask_noisify.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maskcor.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maskops.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mcrop.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/measure_lattice.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/median-bg.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/merge.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mfm_current.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mfm_field.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mfm_findshift.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mfm_parallel.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mfm_shift.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/neural.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/noise_synth.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/obj_synth.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/otsu_threshold.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/outliers.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pat_synth.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/phase_synth.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pid.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polydistort.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polylevel.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/presentationops.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-acf2d.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-angle_dist.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-arithmetic.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-averaging.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-basicops.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-bdep_synth.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-calcoefs_load.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-calcoefs_new.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-calcoefs_simple.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-calcoefs_view.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-calibrate.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-coerce.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-col_synth.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-convolution_filter.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-correct_affine.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-crosscor.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-curvature.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-cwt.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-deposit_synth.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-diff_synth.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-domain_synth.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-drift.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-dwt.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-dwtanisotropy.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-edge.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-entropy.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-extend.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-extract_path.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-facet-level.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-facet_analysis.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-fbm_synth.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-fft.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-fft_filter_1d.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-fft_filter_2d.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-fft_profile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-fft_synth.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-fibre_synth.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-fit-shape.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-flatten_base.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-fraccor.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-fractal.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-gradient.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-grain_cross.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-grain_dist.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-grain_edge.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-grain_filter.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-grain_mark.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-grain_stat.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-grain_wshed.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-hough.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-immerse.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-indent_analyze.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-laplace.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-lat_synth.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-latsim.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-level.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-level_grains.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-linecorrect.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-linematch.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-lno_synth.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-local_contrast.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-logistic.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-mark_disconn.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-mark_with.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-mask_distribute.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-mask_edt.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-mask_morph.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-mask_noisify.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-maskcor.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-maskops.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-mcrop.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-measure_lattice.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-median-bg.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-merge.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-mfm_current.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-mfm_field.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-mfm_findshift.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-mfm_parallel.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-mfm_shift.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-neural.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-noise_synth.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-obj_synth.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-otsu_threshold.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-outliers.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-pat_synth.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-phase_synth.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-pid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-polydistort.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-polylevel.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-presentationops.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-process.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-psdf_logphi.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-psf-fit.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-psf.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-rank.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-rotate.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-scale.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-scars.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-semsim.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-shade.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-slope_dist.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-sphere-revolve.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-stitch.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-straighten_path.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-threshold.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-tilt.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-tip_blind.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-tip_model.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-tipops.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-unrotate.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-volumize.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-volumize_layers.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-wave_synth.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-wpour_mark.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-xydenoise.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/process_la-xyzize.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/psdf_logphi.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/psf-fit.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/psf.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/rank.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/rotate.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/scale.Plo at am__quote@
@@ -1567,6 +2225,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/shade.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/slope_dist.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/sphere-revolve.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/stitch.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/straighten_path.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/threshold.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tilt.Plo at am__quote@
@@ -1602,6 +2261,818 @@ distclean-compile:
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
+process_la-acf2d.lo: acf2d.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-acf2d.lo -MD -MP -MF $(DEPDIR)/process_la-acf2d.Tpo -c -o process_la-acf2d.lo `test -f 'acf2d.c' || echo '$(srcdir)/'`acf2d.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-acf2d.Tpo $(DEPDIR)/process_la-acf2d.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='acf2d.c' object='process_la-acf2d.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-acf2d.lo `test -f 'acf2d.c' || echo '$(srcdir)/'`acf2d.c
+
+process_la-angle_dist.lo: angle_dist.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-angle_dist.lo -MD -MP -MF $(DEPDIR)/process_la-angle_dist.Tpo -c -o process_la-angle_dist.lo `test -f 'angle_dist.c' || echo '$(srcdir)/'`angle_dist.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-angle_dist.Tpo $(DEPDIR)/process_la-angle_dist.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='angle_dist.c' object='process_la-angle_dist.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-angle_dist.lo `test -f 'angle_dist.c' || echo '$(srcdir)/'`angle_dist.c
+
+process_la-arithmetic.lo: arithmetic.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-arithmetic.lo -MD -MP -MF $(DEPDIR)/process_la-arithmetic.Tpo -c -o process_la-arithmetic.lo `test -f 'arithmetic.c' || echo '$(srcdir)/'`arithmetic.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-arithmetic.Tpo $(DEPDIR)/process_la-arithmetic.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='arithmetic.c' object='process_la-arithmetic.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-arithmetic.lo `test -f 'arithmetic.c' || echo '$(srcdir)/'`arithmetic.c
+
+process_la-averaging.lo: averaging.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-averaging.lo -MD -MP -MF $(DEPDIR)/process_la-averaging.Tpo -c -o process_la-averaging.lo `test -f 'averaging.c' || echo '$(srcdir)/'`averaging.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-averaging.Tpo $(DEPDIR)/process_la-averaging.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='averaging.c' object='process_la-averaging.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-averaging.lo `test -f 'averaging.c' || echo '$(srcdir)/'`averaging.c
+
+process_la-basicops.lo: basicops.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-basicops.lo -MD -MP -MF $(DEPDIR)/process_la-basicops.Tpo -c -o process_la-basicops.lo `test -f 'basicops.c' || echo '$(srcdir)/'`basicops.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-basicops.Tpo $(DEPDIR)/process_la-basicops.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='basicops.c' object='process_la-basicops.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-basicops.lo `test -f 'basicops.c' || echo '$(srcdir)/'`basicops.c
+
+process_la-bdep_synth.lo: bdep_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-bdep_synth.lo -MD -MP -MF $(DEPDIR)/process_la-bdep_synth.Tpo -c -o process_la-bdep_synth.lo `test -f 'bdep_synth.c' || echo '$(srcdir)/'`bdep_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-bdep_synth.Tpo $(DEPDIR)/process_la-bdep_synth.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='bdep_synth.c' object='process_la-bdep_synth.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-bdep_synth.lo `test -f 'bdep_synth.c' || echo '$(srcdir)/'`bdep_synth.c
+
+process_la-calcoefs_load.lo: calcoefs_load.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-calcoefs_load.lo -MD -MP -MF $(DEPDIR)/process_la-calcoefs_load.Tpo -c -o process_la-calcoefs_load.lo `test -f 'calcoefs_load.c' || echo '$(srcdir)/'`calcoefs_load.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-calcoefs_load.Tpo $(DEPDIR)/process_la-calcoefs_load.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='calcoefs_load.c' object='process_la-calcoefs_load.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-calcoefs_load.lo `test -f 'calcoefs_load.c' || echo '$(srcdir)/'`calcoefs_load.c
+
+process_la-calcoefs_new.lo: calcoefs_new.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-calcoefs_new.lo -MD -MP -MF $(DEPDIR)/process_la-calcoefs_new.Tpo -c -o process_la-calcoefs_new.lo `test -f 'calcoefs_new.c' || echo '$(srcdir)/'`calcoefs_new.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-calcoefs_new.Tpo $(DEPDIR)/process_la-calcoefs_new.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='calcoefs_new.c' object='process_la-calcoefs_new.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-calcoefs_new.lo `test -f 'calcoefs_new.c' || echo '$(srcdir)/'`calcoefs_new.c
+
+process_la-calcoefs_simple.lo: calcoefs_simple.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-calcoefs_simple.lo -MD -MP -MF $(DEPDIR)/process_la-calcoefs_simple.Tpo -c -o process_la-calcoefs_simple.lo `test -f 'calcoefs_simple.c' || echo '$(srcdir)/'`calcoefs_simple.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-calcoefs_simple.Tpo $(DEPDIR)/process_la-calcoefs_simple.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='calcoefs_simple.c' object='process_la-calcoefs_simple.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-calcoefs_simple.lo `test -f 'calcoefs_simple.c' || echo '$(srcdir)/'`calcoefs_simple.c
+
+process_la-calcoefs_view.lo: calcoefs_view.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-calcoefs_view.lo -MD -MP -MF $(DEPDIR)/process_la-calcoefs_view.Tpo -c -o process_la-calcoefs_view.lo `test -f 'calcoefs_view.c' || echo '$(srcdir)/'`calcoefs_view.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-calcoefs_view.Tpo $(DEPDIR)/process_la-calcoefs_view.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='calcoefs_view.c' object='process_la-calcoefs_view.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-calcoefs_view.lo `test -f 'calcoefs_view.c' || echo '$(srcdir)/'`calcoefs_view.c
+
+process_la-calibrate.lo: calibrate.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-calibrate.lo -MD -MP -MF $(DEPDIR)/process_la-calibrate.Tpo -c -o process_la-calibrate.lo `test -f 'calibrate.c' || echo '$(srcdir)/'`calibrate.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-calibrate.Tpo $(DEPDIR)/process_la-calibrate.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='calibrate.c' object='process_la-calibrate.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-calibrate.lo `test -f 'calibrate.c' || echo '$(srcdir)/'`calibrate.c
+
+process_la-coerce.lo: coerce.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-coerce.lo -MD -MP -MF $(DEPDIR)/process_la-coerce.Tpo -c -o process_la-coerce.lo `test -f 'coerce.c' || echo '$(srcdir)/'`coerce.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-coerce.Tpo $(DEPDIR)/process_la-coerce.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='coerce.c' object='process_la-coerce.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-coerce.lo `test -f 'coerce.c' || echo '$(srcdir)/'`coerce.c
+
+process_la-col_synth.lo: col_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-col_synth.lo -MD -MP -MF $(DEPDIR)/process_la-col_synth.Tpo -c -o process_la-col_synth.lo `test -f 'col_synth.c' || echo '$(srcdir)/'`col_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-col_synth.Tpo $(DEPDIR)/process_la-col_synth.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='col_synth.c' object='process_la-col_synth.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-col_synth.lo `test -f 'col_synth.c' || echo '$(srcdir)/'`col_synth.c
+
+process_la-convolution_filter.lo: convolution_filter.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-convolution_filter.lo -MD -MP -MF $(DEPDIR)/process_la-convolution_filter.Tpo -c -o process_la-convolution_filter.lo `test -f 'convolution_filter.c' || echo '$(srcdir)/'`convolution_filter.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-convolution_filter.Tpo $(DEPDIR)/process_la-convolution_filter.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='convolution_filter.c' object='process_la-convolution_filter.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-convolution_filter.lo `test -f 'convolution_filter.c' || echo '$(srcdir)/'`convolution_filter.c
+
+process_la-correct_affine.lo: correct_affine.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-correct_affine.lo -MD -MP -MF $(DEPDIR)/process_la-correct_affine.Tpo -c -o process_la-correct_affine.lo `test -f 'correct_affine.c' || echo '$(srcdir)/'`correct_affine.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-correct_affine.Tpo $(DEPDIR)/process_la-correct_affine.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='correct_affine.c' object='process_la-correct_affine.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-correct_affine.lo `test -f 'correct_affine.c' || echo '$(srcdir)/'`correct_affine.c
+
+process_la-crosscor.lo: crosscor.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-crosscor.lo -MD -MP -MF $(DEPDIR)/process_la-crosscor.Tpo -c -o process_la-crosscor.lo `test -f 'crosscor.c' || echo '$(srcdir)/'`crosscor.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-crosscor.Tpo $(DEPDIR)/process_la-crosscor.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='crosscor.c' object='process_la-crosscor.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-crosscor.lo `test -f 'crosscor.c' || echo '$(srcdir)/'`crosscor.c
+
+process_la-cwt.lo: cwt.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-cwt.lo -MD -MP -MF $(DEPDIR)/process_la-cwt.Tpo -c -o process_la-cwt.lo `test -f 'cwt.c' || echo '$(srcdir)/'`cwt.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-cwt.Tpo $(DEPDIR)/process_la-cwt.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='cwt.c' object='process_la-cwt.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-cwt.lo `test -f 'cwt.c' || echo '$(srcdir)/'`cwt.c
+
+process_la-curvature.lo: curvature.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-curvature.lo -MD -MP -MF $(DEPDIR)/process_la-curvature.Tpo -c -o process_la-curvature.lo `test -f 'curvature.c' || echo '$(srcdir)/'`curvature.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-curvature.Tpo $(DEPDIR)/process_la-curvature.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='curvature.c' object='process_la-curvature.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-curvature.lo `test -f 'curvature.c' || echo '$(srcdir)/'`curvature.c
+
+process_la-deposit_synth.lo: deposit_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-deposit_synth.lo -MD -MP -MF $(DEPDIR)/process_la-deposit_synth.Tpo -c -o process_la-deposit_synth.lo `test -f 'deposit_synth.c' || echo '$(srcdir)/'`deposit_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-deposit_synth.Tpo $(DEPDIR)/process_la-deposit_synth.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='deposit_synth.c' object='process_la-deposit_synth.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-deposit_synth.lo `test -f 'deposit_synth.c' || echo '$(srcdir)/'`deposit_synth.c
+
+process_la-diff_synth.lo: diff_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-diff_synth.lo -MD -MP -MF $(DEPDIR)/process_la-diff_synth.Tpo -c -o process_la-diff_synth.lo `test -f 'diff_synth.c' || echo '$(srcdir)/'`diff_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-diff_synth.Tpo $(DEPDIR)/process_la-diff_synth.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='diff_synth.c' object='process_la-diff_synth.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-diff_synth.lo `test -f 'diff_synth.c' || echo '$(srcdir)/'`diff_synth.c
+
+process_la-domain_synth.lo: domain_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-domain_synth.lo -MD -MP -MF $(DEPDIR)/process_la-domain_synth.Tpo -c -o process_la-domain_synth.lo `test -f 'domain_synth.c' || echo '$(srcdir)/'`domain_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-domain_synth.Tpo $(DEPDIR)/process_la-domain_synth.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='domain_synth.c' object='process_la-domain_synth.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-domain_synth.lo `test -f 'domain_synth.c' || echo '$(srcdir)/'`domain_synth.c
+
+process_la-drift.lo: drift.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-drift.lo -MD -MP -MF $(DEPDIR)/process_la-drift.Tpo -c -o process_la-drift.lo `test -f 'drift.c' || echo '$(srcdir)/'`drift.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-drift.Tpo $(DEPDIR)/process_la-drift.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='drift.c' object='process_la-drift.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-drift.lo `test -f 'drift.c' || echo '$(srcdir)/'`drift.c
+
+process_la-dwt.lo: dwt.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-dwt.lo -MD -MP -MF $(DEPDIR)/process_la-dwt.Tpo -c -o process_la-dwt.lo `test -f 'dwt.c' || echo '$(srcdir)/'`dwt.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-dwt.Tpo $(DEPDIR)/process_la-dwt.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dwt.c' object='process_la-dwt.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-dwt.lo `test -f 'dwt.c' || echo '$(srcdir)/'`dwt.c
+
+process_la-dwtanisotropy.lo: dwtanisotropy.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-dwtanisotropy.lo -MD -MP -MF $(DEPDIR)/process_la-dwtanisotropy.Tpo -c -o process_la-dwtanisotropy.lo `test -f 'dwtanisotropy.c' || echo '$(srcdir)/'`dwtanisotropy.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-dwtanisotropy.Tpo $(DEPDIR)/process_la-dwtanisotropy.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dwtanisotropy.c' object='process_la-dwtanisotropy.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-dwtanisotropy.lo `test -f 'dwtanisotropy.c' || echo '$(srcdir)/'`dwtanisotropy.c
+
+process_la-edge.lo: edge.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-edge.lo -MD -MP -MF $(DEPDIR)/process_la-edge.Tpo -c -o process_la-edge.lo `test -f 'edge.c' || echo '$(srcdir)/'`edge.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-edge.Tpo $(DEPDIR)/process_la-edge.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='edge.c' object='process_la-edge.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-edge.lo `test -f 'edge.c' || echo '$(srcdir)/'`edge.c
+
+process_la-entropy.lo: entropy.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-entropy.lo -MD -MP -MF $(DEPDIR)/process_la-entropy.Tpo -c -o process_la-entropy.lo `test -f 'entropy.c' || echo '$(srcdir)/'`entropy.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-entropy.Tpo $(DEPDIR)/process_la-entropy.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='entropy.c' object='process_la-entropy.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-entropy.lo `test -f 'entropy.c' || echo '$(srcdir)/'`entropy.c
+
+process_la-extend.lo: extend.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-extend.lo -MD -MP -MF $(DEPDIR)/process_la-extend.Tpo -c -o process_la-extend.lo `test -f 'extend.c' || echo '$(srcdir)/'`extend.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-extend.Tpo $(DEPDIR)/process_la-extend.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='extend.c' object='process_la-extend.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-extend.lo `test -f 'extend.c' || echo '$(srcdir)/'`extend.c
+
+process_la-extract_path.lo: extract_path.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-extract_path.lo -MD -MP -MF $(DEPDIR)/process_la-extract_path.Tpo -c -o process_la-extract_path.lo `test -f 'extract_path.c' || echo '$(srcdir)/'`extract_path.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-extract_path.Tpo $(DEPDIR)/process_la-extract_path.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='extract_path.c' object='process_la-extract_path.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-extract_path.lo `test -f 'extract_path.c' || echo '$(srcdir)/'`extract_path.c
+
+process_la-facet_analysis.lo: facet_analysis.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-facet_analysis.lo -MD -MP -MF $(DEPDIR)/process_la-facet_analysis.Tpo -c -o process_la-facet_analysis.lo `test -f 'facet_analysis.c' || echo '$(srcdir)/'`facet_analysis.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-facet_analysis.Tpo $(DEPDIR)/process_la-facet_analysis.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='facet_analysis.c' object='process_la-facet_analysis.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-facet_analysis.lo `test -f 'facet_analysis.c' || echo '$(srcdir)/'`facet_analysis.c
+
+process_la-facet-level.lo: facet-level.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-facet-level.lo -MD -MP -MF $(DEPDIR)/process_la-facet-level.Tpo -c -o process_la-facet-level.lo `test -f 'facet-level.c' || echo '$(srcdir)/'`facet-level.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-facet-level.Tpo $(DEPDIR)/process_la-facet-level.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='facet-level.c' object='process_la-facet-level.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-facet-level.lo `test -f 'facet-level.c' || echo '$(srcdir)/'`facet-level.c
+
+process_la-fbm_synth.lo: fbm_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-fbm_synth.lo -MD -MP -MF $(DEPDIR)/process_la-fbm_synth.Tpo -c -o process_la-fbm_synth.lo `test -f 'fbm_synth.c' || echo '$(srcdir)/'`fbm_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-fbm_synth.Tpo $(DEPDIR)/process_la-fbm_synth.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='fbm_synth.c' object='process_la-fbm_synth.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-fbm_synth.lo `test -f 'fbm_synth.c' || echo '$(srcdir)/'`fbm_synth.c
+
+process_la-fft_filter_1d.lo: fft_filter_1d.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-fft_filter_1d.lo -MD -MP -MF $(DEPDIR)/process_la-fft_filter_1d.Tpo -c -o process_la-fft_filter_1d.lo `test -f 'fft_filter_1d.c' || echo '$(srcdir)/'`fft_filter_1d.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-fft_filter_1d.Tpo $(DEPDIR)/process_la-fft_filter_1d.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='fft_filter_1d.c' object='process_la-fft_filter_1d.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-fft_filter_1d.lo `test -f 'fft_filter_1d.c' || echo '$(srcdir)/'`fft_filter_1d.c
+
+process_la-fft_filter_2d.lo: fft_filter_2d.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-fft_filter_2d.lo -MD -MP -MF $(DEPDIR)/process_la-fft_filter_2d.Tpo -c -o process_la-fft_filter_2d.lo `test -f 'fft_filter_2d.c' || echo '$(srcdir)/'`fft_filter_2d.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-fft_filter_2d.Tpo $(DEPDIR)/process_la-fft_filter_2d.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='fft_filter_2d.c' object='process_la-fft_filter_2d.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-fft_filter_2d.lo `test -f 'fft_filter_2d.c' || echo '$(srcdir)/'`fft_filter_2d.c
+
+process_la-fft_profile.lo: fft_profile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-fft_profile.lo -MD -MP -MF $(DEPDIR)/process_la-fft_profile.Tpo -c -o process_la-fft_profile.lo `test -f 'fft_profile.c' || echo '$(srcdir)/'`fft_profile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-fft_profile.Tpo $(DEPDIR)/process_la-fft_profile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='fft_profile.c' object='process_la-fft_profile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-fft_profile.lo `test -f 'fft_profile.c' || echo '$(srcdir)/'`fft_profile.c
+
+process_la-fft.lo: fft.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-fft.lo -MD -MP -MF $(DEPDIR)/process_la-fft.Tpo -c -o process_la-fft.lo `test -f 'fft.c' || echo '$(srcdir)/'`fft.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-fft.Tpo $(DEPDIR)/process_la-fft.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='fft.c' object='process_la-fft.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-fft.lo `test -f 'fft.c' || echo '$(srcdir)/'`fft.c
+
+process_la-fft_synth.lo: fft_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-fft_synth.lo -MD -MP -MF $(DEPDIR)/process_la-fft_synth.Tpo -c -o process_la-fft_synth.lo `test -f 'fft_synth.c' || echo '$(srcdir)/'`fft_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-fft_synth.Tpo $(DEPDIR)/process_la-fft_synth.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='fft_synth.c' object='process_la-fft_synth.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-fft_synth.lo `test -f 'fft_synth.c' || echo '$(srcdir)/'`fft_synth.c
+
+process_la-fibre_synth.lo: fibre_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-fibre_synth.lo -MD -MP -MF $(DEPDIR)/process_la-fibre_synth.Tpo -c -o process_la-fibre_synth.lo `test -f 'fibre_synth.c' || echo '$(srcdir)/'`fibre_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-fibre_synth.Tpo $(DEPDIR)/process_la-fibre_synth.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='fibre_synth.c' object='process_la-fibre_synth.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-fibre_synth.lo `test -f 'fibre_synth.c' || echo '$(srcdir)/'`fibre_synth.c
+
+process_la-fit-shape.lo: fit-shape.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-fit-shape.lo -MD -MP -MF $(DEPDIR)/process_la-fit-shape.Tpo -c -o process_la-fit-shape.lo `test -f 'fit-shape.c' || echo '$(srcdir)/'`fit-shape.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-fit-shape.Tpo $(DEPDIR)/process_la-fit-shape.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='fit-shape.c' object='process_la-fit-shape.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-fit-shape.lo `test -f 'fit-shape.c' || echo '$(srcdir)/'`fit-shape.c
+
+process_la-flatten_base.lo: flatten_base.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-flatten_base.lo -MD -MP -MF $(DEPDIR)/process_la-flatten_base.Tpo -c -o process_la-flatten_base.lo `test -f 'flatten_base.c' || echo '$(srcdir)/'`flatten_base.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-flatten_base.Tpo $(DEPDIR)/process_la-flatten_base.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='flatten_base.c' object='process_la-flatten_base.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-flatten_base.lo `test -f 'flatten_base.c' || echo '$(srcdir)/'`flatten_base.c
+
+process_la-fractal.lo: fractal.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-fractal.lo -MD -MP -MF $(DEPDIR)/process_la-fractal.Tpo -c -o process_la-fractal.lo `test -f 'fractal.c' || echo '$(srcdir)/'`fractal.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-fractal.Tpo $(DEPDIR)/process_la-fractal.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='fractal.c' object='process_la-fractal.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-fractal.lo `test -f 'fractal.c' || echo '$(srcdir)/'`fractal.c
+
+process_la-fraccor.lo: fraccor.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-fraccor.lo -MD -MP -MF $(DEPDIR)/process_la-fraccor.Tpo -c -o process_la-fraccor.lo `test -f 'fraccor.c' || echo '$(srcdir)/'`fraccor.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-fraccor.Tpo $(DEPDIR)/process_la-fraccor.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='fraccor.c' object='process_la-fraccor.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-fraccor.lo `test -f 'fraccor.c' || echo '$(srcdir)/'`fraccor.c
+
+process_la-gradient.lo: gradient.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-gradient.lo -MD -MP -MF $(DEPDIR)/process_la-gradient.Tpo -c -o process_la-gradient.lo `test -f 'gradient.c' || echo '$(srcdir)/'`gradient.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-gradient.Tpo $(DEPDIR)/process_la-gradient.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gradient.c' object='process_la-gradient.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-gradient.lo `test -f 'gradient.c' || echo '$(srcdir)/'`gradient.c
+
+process_la-grain_cross.lo: grain_cross.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-grain_cross.lo -MD -MP -MF $(DEPDIR)/process_la-grain_cross.Tpo -c -o process_la-grain_cross.lo `test -f 'grain_cross.c' || echo '$(srcdir)/'`grain_cross.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-grain_cross.Tpo $(DEPDIR)/process_la-grain_cross.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='grain_cross.c' object='process_la-grain_cross.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-grain_cross.lo `test -f 'grain_cross.c' || echo '$(srcdir)/'`grain_cross.c
+
+process_la-grain_dist.lo: grain_dist.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-grain_dist.lo -MD -MP -MF $(DEPDIR)/process_la-grain_dist.Tpo -c -o process_la-grain_dist.lo `test -f 'grain_dist.c' || echo '$(srcdir)/'`grain_dist.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-grain_dist.Tpo $(DEPDIR)/process_la-grain_dist.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='grain_dist.c' object='process_la-grain_dist.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-grain_dist.lo `test -f 'grain_dist.c' || echo '$(srcdir)/'`grain_dist.c
+
+process_la-grain_edge.lo: grain_edge.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-grain_edge.lo -MD -MP -MF $(DEPDIR)/process_la-grain_edge.Tpo -c -o process_la-grain_edge.lo `test -f 'grain_edge.c' || echo '$(srcdir)/'`grain_edge.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-grain_edge.Tpo $(DEPDIR)/process_la-grain_edge.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='grain_edge.c' object='process_la-grain_edge.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-grain_edge.lo `test -f 'grain_edge.c' || echo '$(srcdir)/'`grain_edge.c
+
+process_la-grain_filter.lo: grain_filter.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-grain_filter.lo -MD -MP -MF $(DEPDIR)/process_la-grain_filter.Tpo -c -o process_la-grain_filter.lo `test -f 'grain_filter.c' || echo '$(srcdir)/'`grain_filter.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-grain_filter.Tpo $(DEPDIR)/process_la-grain_filter.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='grain_filter.c' object='process_la-grain_filter.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-grain_filter.lo `test -f 'grain_filter.c' || echo '$(srcdir)/'`grain_filter.c
+
+process_la-grain_mark.lo: grain_mark.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-grain_mark.lo -MD -MP -MF $(DEPDIR)/process_la-grain_mark.Tpo -c -o process_la-grain_mark.lo `test -f 'grain_mark.c' || echo '$(srcdir)/'`grain_mark.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-grain_mark.Tpo $(DEPDIR)/process_la-grain_mark.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='grain_mark.c' object='process_la-grain_mark.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-grain_mark.lo `test -f 'grain_mark.c' || echo '$(srcdir)/'`grain_mark.c
+
+process_la-grain_stat.lo: grain_stat.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-grain_stat.lo -MD -MP -MF $(DEPDIR)/process_la-grain_stat.Tpo -c -o process_la-grain_stat.lo `test -f 'grain_stat.c' || echo '$(srcdir)/'`grain_stat.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-grain_stat.Tpo $(DEPDIR)/process_la-grain_stat.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='grain_stat.c' object='process_la-grain_stat.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-grain_stat.lo `test -f 'grain_stat.c' || echo '$(srcdir)/'`grain_stat.c
+
+process_la-grain_wshed.lo: grain_wshed.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-grain_wshed.lo -MD -MP -MF $(DEPDIR)/process_la-grain_wshed.Tpo -c -o process_la-grain_wshed.lo `test -f 'grain_wshed.c' || echo '$(srcdir)/'`grain_wshed.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-grain_wshed.Tpo $(DEPDIR)/process_la-grain_wshed.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='grain_wshed.c' object='process_la-grain_wshed.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-grain_wshed.lo `test -f 'grain_wshed.c' || echo '$(srcdir)/'`grain_wshed.c
+
+process_la-hough.lo: hough.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-hough.lo -MD -MP -MF $(DEPDIR)/process_la-hough.Tpo -c -o process_la-hough.lo `test -f 'hough.c' || echo '$(srcdir)/'`hough.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-hough.Tpo $(DEPDIR)/process_la-hough.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='hough.c' object='process_la-hough.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-hough.lo `test -f 'hough.c' || echo '$(srcdir)/'`hough.c
+
+process_la-immerse.lo: immerse.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-immerse.lo -MD -MP -MF $(DEPDIR)/process_la-immerse.Tpo -c -o process_la-immerse.lo `test -f 'immerse.c' || echo '$(srcdir)/'`immerse.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-immerse.Tpo $(DEPDIR)/process_la-immerse.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='immerse.c' object='process_la-immerse.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-immerse.lo `test -f 'immerse.c' || echo '$(srcdir)/'`immerse.c
+
+process_la-indent_analyze.lo: indent_analyze.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-indent_analyze.lo -MD -MP -MF $(DEPDIR)/process_la-indent_analyze.Tpo -c -o process_la-indent_analyze.lo `test -f 'indent_analyze.c' || echo '$(srcdir)/'`indent_analyze.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-indent_analyze.Tpo $(DEPDIR)/process_la-indent_analyze.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='indent_analyze.c' object='process_la-indent_analyze.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-indent_analyze.lo `test -f 'indent_analyze.c' || echo '$(srcdir)/'`indent_analyze.c
+
+process_la-laplace.lo: laplace.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-laplace.lo -MD -MP -MF $(DEPDIR)/process_la-laplace.Tpo -c -o process_la-laplace.lo `test -f 'laplace.c' || echo '$(srcdir)/'`laplace.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-laplace.Tpo $(DEPDIR)/process_la-laplace.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='laplace.c' object='process_la-laplace.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-laplace.lo `test -f 'laplace.c' || echo '$(srcdir)/'`laplace.c
+
+process_la-lat_synth.lo: lat_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-lat_synth.lo -MD -MP -MF $(DEPDIR)/process_la-lat_synth.Tpo -c -o process_la-lat_synth.lo `test -f 'lat_synth.c' || echo '$(srcdir)/'`lat_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-lat_synth.Tpo $(DEPDIR)/process_la-lat_synth.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lat_synth.c' object='process_la-lat_synth.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-lat_synth.lo `test -f 'lat_synth.c' || echo '$(srcdir)/'`lat_synth.c
+
+process_la-latsim.lo: latsim.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-latsim.lo -MD -MP -MF $(DEPDIR)/process_la-latsim.Tpo -c -o process_la-latsim.lo `test -f 'latsim.c' || echo '$(srcdir)/'`latsim.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-latsim.Tpo $(DEPDIR)/process_la-latsim.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='latsim.c' object='process_la-latsim.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-latsim.lo `test -f 'latsim.c' || echo '$(srcdir)/'`latsim.c
+
+process_la-level.lo: level.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-level.lo -MD -MP -MF $(DEPDIR)/process_la-level.Tpo -c -o process_la-level.lo `test -f 'level.c' || echo '$(srcdir)/'`level.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-level.Tpo $(DEPDIR)/process_la-level.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='level.c' object='process_la-level.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-level.lo `test -f 'level.c' || echo '$(srcdir)/'`level.c
+
+process_la-level_grains.lo: level_grains.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-level_grains.lo -MD -MP -MF $(DEPDIR)/process_la-level_grains.Tpo -c -o process_la-level_grains.lo `test -f 'level_grains.c' || echo '$(srcdir)/'`level_grains.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-level_grains.Tpo $(DEPDIR)/process_la-level_grains.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='level_grains.c' object='process_la-level_grains.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-level_grains.lo `test -f 'level_grains.c' || echo '$(srcdir)/'`level_grains.c
+
+process_la-linecorrect.lo: linecorrect.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-linecorrect.lo -MD -MP -MF $(DEPDIR)/process_la-linecorrect.Tpo -c -o process_la-linecorrect.lo `test -f 'linecorrect.c' || echo '$(srcdir)/'`linecorrect.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-linecorrect.Tpo $(DEPDIR)/process_la-linecorrect.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='linecorrect.c' object='process_la-linecorrect.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-linecorrect.lo `test -f 'linecorrect.c' || echo '$(srcdir)/'`linecorrect.c
+
+process_la-linematch.lo: linematch.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-linematch.lo -MD -MP -MF $(DEPDIR)/process_la-linematch.Tpo -c -o process_la-linematch.lo `test -f 'linematch.c' || echo '$(srcdir)/'`linematch.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-linematch.Tpo $(DEPDIR)/process_la-linematch.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='linematch.c' object='process_la-linematch.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-linematch.lo `test -f 'linematch.c' || echo '$(srcdir)/'`linematch.c
+
+process_la-lno_synth.lo: lno_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-lno_synth.lo -MD -MP -MF $(DEPDIR)/process_la-lno_synth.Tpo -c -o process_la-lno_synth.lo `test -f 'lno_synth.c' || echo '$(srcdir)/'`lno_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-lno_synth.Tpo $(DEPDIR)/process_la-lno_synth.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lno_synth.c' object='process_la-lno_synth.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-lno_synth.lo `test -f 'lno_synth.c' || echo '$(srcdir)/'`lno_synth.c
+
+process_la-local_contrast.lo: local_contrast.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-local_contrast.lo -MD -MP -MF $(DEPDIR)/process_la-local_contrast.Tpo -c -o process_la-local_contrast.lo `test -f 'local_contrast.c' || echo '$(srcdir)/'`local_contrast.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-local_contrast.Tpo $(DEPDIR)/process_la-local_contrast.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='local_contrast.c' object='process_la-local_contrast.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-local_contrast.lo `test -f 'local_contrast.c' || echo '$(srcdir)/'`local_contrast.c
+
+process_la-logistic.lo: logistic.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-logistic.lo -MD -MP -MF $(DEPDIR)/process_la-logistic.Tpo -c -o process_la-logistic.lo `test -f 'logistic.c' || echo '$(srcdir)/'`logistic.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-logistic.Tpo $(DEPDIR)/process_la-logistic.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='logistic.c' object='process_la-logistic.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-logistic.lo `test -f 'logistic.c' || echo '$(srcdir)/'`logistic.c
+
+process_la-mark_disconn.lo: mark_disconn.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-mark_disconn.lo -MD -MP -MF $(DEPDIR)/process_la-mark_disconn.Tpo -c -o process_la-mark_disconn.lo `test -f 'mark_disconn.c' || echo '$(srcdir)/'`mark_disconn.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-mark_disconn.Tpo $(DEPDIR)/process_la-mark_disconn.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mark_disconn.c' object='process_la-mark_disconn.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-mark_disconn.lo `test -f 'mark_disconn.c' || echo '$(srcdir)/'`mark_disconn.c
+
+process_la-mark_with.lo: mark_with.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-mark_with.lo -MD -MP -MF $(DEPDIR)/process_la-mark_with.Tpo -c -o process_la-mark_with.lo `test -f 'mark_with.c' || echo '$(srcdir)/'`mark_with.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-mark_with.Tpo $(DEPDIR)/process_la-mark_with.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mark_with.c' object='process_la-mark_with.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-mark_with.lo `test -f 'mark_with.c' || echo '$(srcdir)/'`mark_with.c
+
+process_la-maskcor.lo: maskcor.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-maskcor.lo -MD -MP -MF $(DEPDIR)/process_la-maskcor.Tpo -c -o process_la-maskcor.lo `test -f 'maskcor.c' || echo '$(srcdir)/'`maskcor.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-maskcor.Tpo $(DEPDIR)/process_la-maskcor.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='maskcor.c' object='process_la-maskcor.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-maskcor.lo `test -f 'maskcor.c' || echo '$(srcdir)/'`maskcor.c
+
+process_la-mask_distribute.lo: mask_distribute.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-mask_distribute.lo -MD -MP -MF $(DEPDIR)/process_la-mask_distribute.Tpo -c -o process_la-mask_distribute.lo `test -f 'mask_distribute.c' || echo '$(srcdir)/'`mask_distribute.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-mask_distribute.Tpo $(DEPDIR)/process_la-mask_distribute.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mask_distribute.c' object='process_la-mask_distribute.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-mask_distribute.lo `test -f 'mask_distribute.c' || echo '$(srcdir)/'`mask_distribute.c
+
+process_la-mask_edt.lo: mask_edt.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-mask_edt.lo -MD -MP -MF $(DEPDIR)/process_la-mask_edt.Tpo -c -o process_la-mask_edt.lo `test -f 'mask_edt.c' || echo '$(srcdir)/'`mask_edt.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-mask_edt.Tpo $(DEPDIR)/process_la-mask_edt.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mask_edt.c' object='process_la-mask_edt.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-mask_edt.lo `test -f 'mask_edt.c' || echo '$(srcdir)/'`mask_edt.c
+
+process_la-mask_morph.lo: mask_morph.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-mask_morph.lo -MD -MP -MF $(DEPDIR)/process_la-mask_morph.Tpo -c -o process_la-mask_morph.lo `test -f 'mask_morph.c' || echo '$(srcdir)/'`mask_morph.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-mask_morph.Tpo $(DEPDIR)/process_la-mask_morph.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mask_morph.c' object='process_la-mask_morph.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-mask_morph.lo `test -f 'mask_morph.c' || echo '$(srcdir)/'`mask_morph.c
+
+process_la-mask_noisify.lo: mask_noisify.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-mask_noisify.lo -MD -MP -MF $(DEPDIR)/process_la-mask_noisify.Tpo -c -o process_la-mask_noisify.lo `test -f 'mask_noisify.c' || echo '$(srcdir)/'`mask_noisify.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-mask_noisify.Tpo $(DEPDIR)/process_la-mask_noisify.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mask_noisify.c' object='process_la-mask_noisify.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-mask_noisify.lo `test -f 'mask_noisify.c' || echo '$(srcdir)/'`mask_noisify.c
+
+process_la-maskops.lo: maskops.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-maskops.lo -MD -MP -MF $(DEPDIR)/process_la-maskops.Tpo -c -o process_la-maskops.lo `test -f 'maskops.c' || echo '$(srcdir)/'`maskops.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-maskops.Tpo $(DEPDIR)/process_la-maskops.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='maskops.c' object='process_la-maskops.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-maskops.lo `test -f 'maskops.c' || echo '$(srcdir)/'`maskops.c
+
+process_la-mcrop.lo: mcrop.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-mcrop.lo -MD -MP -MF $(DEPDIR)/process_la-mcrop.Tpo -c -o process_la-mcrop.lo `test -f 'mcrop.c' || echo '$(srcdir)/'`mcrop.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-mcrop.Tpo $(DEPDIR)/process_la-mcrop.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mcrop.c' object='process_la-mcrop.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-mcrop.lo `test -f 'mcrop.c' || echo '$(srcdir)/'`mcrop.c
+
+process_la-measure_lattice.lo: measure_lattice.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-measure_lattice.lo -MD -MP -MF $(DEPDIR)/process_la-measure_lattice.Tpo -c -o process_la-measure_lattice.lo `test -f 'measure_lattice.c' || echo '$(srcdir)/'`measure_lattice.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-measure_lattice.Tpo $(DEPDIR)/process_la-measure_lattice.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='measure_lattice.c' object='process_la-measure_lattice.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-measure_lattice.lo `test -f 'measure_lattice.c' || echo '$(srcdir)/'`measure_lattice.c
+
+process_la-median-bg.lo: median-bg.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-median-bg.lo -MD -MP -MF $(DEPDIR)/process_la-median-bg.Tpo -c -o process_la-median-bg.lo `test -f 'median-bg.c' || echo '$(srcdir)/'`median-bg.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-median-bg.Tpo $(DEPDIR)/process_la-median-bg.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='median-bg.c' object='process_la-median-bg.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-median-bg.lo `test -f 'median-bg.c' || echo '$(srcdir)/'`median-bg.c
+
+process_la-merge.lo: merge.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-merge.lo -MD -MP -MF $(DEPDIR)/process_la-merge.Tpo -c -o process_la-merge.lo `test -f 'merge.c' || echo '$(srcdir)/'`merge.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-merge.Tpo $(DEPDIR)/process_la-merge.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='merge.c' object='process_la-merge.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-merge.lo `test -f 'merge.c' || echo '$(srcdir)/'`merge.c
+
+process_la-mfm_current.lo: mfm_current.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-mfm_current.lo -MD -MP -MF $(DEPDIR)/process_la-mfm_current.Tpo -c -o process_la-mfm_current.lo `test -f 'mfm_current.c' || echo '$(srcdir)/'`mfm_current.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-mfm_current.Tpo $(DEPDIR)/process_la-mfm_current.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mfm_current.c' object='process_la-mfm_current.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-mfm_current.lo `test -f 'mfm_current.c' || echo '$(srcdir)/'`mfm_current.c
+
+process_la-mfm_field.lo: mfm_field.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-mfm_field.lo -MD -MP -MF $(DEPDIR)/process_la-mfm_field.Tpo -c -o process_la-mfm_field.lo `test -f 'mfm_field.c' || echo '$(srcdir)/'`mfm_field.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-mfm_field.Tpo $(DEPDIR)/process_la-mfm_field.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mfm_field.c' object='process_la-mfm_field.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-mfm_field.lo `test -f 'mfm_field.c' || echo '$(srcdir)/'`mfm_field.c
+
+process_la-mfm_findshift.lo: mfm_findshift.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-mfm_findshift.lo -MD -MP -MF $(DEPDIR)/process_la-mfm_findshift.Tpo -c -o process_la-mfm_findshift.lo `test -f 'mfm_findshift.c' || echo '$(srcdir)/'`mfm_findshift.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-mfm_findshift.Tpo $(DEPDIR)/process_la-mfm_findshift.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mfm_findshift.c' object='process_la-mfm_findshift.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-mfm_findshift.lo `test -f 'mfm_findshift.c' || echo '$(srcdir)/'`mfm_findshift.c
+
+process_la-mfm_parallel.lo: mfm_parallel.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-mfm_parallel.lo -MD -MP -MF $(DEPDIR)/process_la-mfm_parallel.Tpo -c -o process_la-mfm_parallel.lo `test -f 'mfm_parallel.c' || echo '$(srcdir)/'`mfm_parallel.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-mfm_parallel.Tpo $(DEPDIR)/process_la-mfm_parallel.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mfm_parallel.c' object='process_la-mfm_parallel.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-mfm_parallel.lo `test -f 'mfm_parallel.c' || echo '$(srcdir)/'`mfm_parallel.c
+
+process_la-mfm_shift.lo: mfm_shift.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-mfm_shift.lo -MD -MP -MF $(DEPDIR)/process_la-mfm_shift.Tpo -c -o process_la-mfm_shift.lo `test -f 'mfm_shift.c' || echo '$(srcdir)/'`mfm_shift.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-mfm_shift.Tpo $(DEPDIR)/process_la-mfm_shift.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mfm_shift.c' object='process_la-mfm_shift.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-mfm_shift.lo `test -f 'mfm_shift.c' || echo '$(srcdir)/'`mfm_shift.c
+
+process_la-neural.lo: neural.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-neural.lo -MD -MP -MF $(DEPDIR)/process_la-neural.Tpo -c -o process_la-neural.lo `test -f 'neural.c' || echo '$(srcdir)/'`neural.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-neural.Tpo $(DEPDIR)/process_la-neural.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='neural.c' object='process_la-neural.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-neural.lo `test -f 'neural.c' || echo '$(srcdir)/'`neural.c
+
+process_la-noise_synth.lo: noise_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-noise_synth.lo -MD -MP -MF $(DEPDIR)/process_la-noise_synth.Tpo -c -o process_la-noise_synth.lo `test -f 'noise_synth.c' || echo '$(srcdir)/'`noise_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-noise_synth.Tpo $(DEPDIR)/process_la-noise_synth.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='noise_synth.c' object='process_la-noise_synth.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-noise_synth.lo `test -f 'noise_synth.c' || echo '$(srcdir)/'`noise_synth.c
+
+process_la-obj_synth.lo: obj_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-obj_synth.lo -MD -MP -MF $(DEPDIR)/process_la-obj_synth.Tpo -c -o process_la-obj_synth.lo `test -f 'obj_synth.c' || echo '$(srcdir)/'`obj_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-obj_synth.Tpo $(DEPDIR)/process_la-obj_synth.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='obj_synth.c' object='process_la-obj_synth.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-obj_synth.lo `test -f 'obj_synth.c' || echo '$(srcdir)/'`obj_synth.c
+
+process_la-otsu_threshold.lo: otsu_threshold.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-otsu_threshold.lo -MD -MP -MF $(DEPDIR)/process_la-otsu_threshold.Tpo -c -o process_la-otsu_threshold.lo `test -f 'otsu_threshold.c' || echo '$(srcdir)/'`otsu_threshold.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-otsu_threshold.Tpo $(DEPDIR)/process_la-otsu_threshold.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='otsu_threshold.c' object='process_la-otsu_threshold.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-otsu_threshold.lo `test -f 'otsu_threshold.c' || echo '$(srcdir)/'`otsu_threshold.c
+
+process_la-outliers.lo: outliers.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-outliers.lo -MD -MP -MF $(DEPDIR)/process_la-outliers.Tpo -c -o process_la-outliers.lo `test -f 'outliers.c' || echo '$(srcdir)/'`outliers.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-outliers.Tpo $(DEPDIR)/process_la-outliers.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='outliers.c' object='process_la-outliers.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-outliers.lo `test -f 'outliers.c' || echo '$(srcdir)/'`outliers.c
+
+process_la-pat_synth.lo: pat_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-pat_synth.lo -MD -MP -MF $(DEPDIR)/process_la-pat_synth.Tpo -c -o process_la-pat_synth.lo `test -f 'pat_synth.c' || echo '$(srcdir)/'`pat_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-pat_synth.Tpo $(DEPDIR)/process_la-pat_synth.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pat_synth.c' object='process_la-pat_synth.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-pat_synth.lo `test -f 'pat_synth.c' || echo '$(srcdir)/'`pat_synth.c
+
+process_la-phase_synth.lo: phase_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-phase_synth.lo -MD -MP -MF $(DEPDIR)/process_la-phase_synth.Tpo -c -o process_la-phase_synth.lo `test -f 'phase_synth.c' || echo '$(srcdir)/'`phase_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-phase_synth.Tpo $(DEPDIR)/process_la-phase_synth.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='phase_synth.c' object='process_la-phase_synth.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-phase_synth.lo `test -f 'phase_synth.c' || echo '$(srcdir)/'`phase_synth.c
+
+process_la-pid.lo: pid.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-pid.lo -MD -MP -MF $(DEPDIR)/process_la-pid.Tpo -c -o process_la-pid.lo `test -f 'pid.c' || echo '$(srcdir)/'`pid.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-pid.Tpo $(DEPDIR)/process_la-pid.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pid.c' object='process_la-pid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-pid.lo `test -f 'pid.c' || echo '$(srcdir)/'`pid.c
+
+process_la-polylevel.lo: polylevel.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-polylevel.lo -MD -MP -MF $(DEPDIR)/process_la-polylevel.Tpo -c -o process_la-polylevel.lo `test -f 'polylevel.c' || echo '$(srcdir)/'`polylevel.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-polylevel.Tpo $(DEPDIR)/process_la-polylevel.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='polylevel.c' object='process_la-polylevel.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-polylevel.lo `test -f 'polylevel.c' || echo '$(srcdir)/'`polylevel.c
+
+process_la-polydistort.lo: polydistort.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-polydistort.lo -MD -MP -MF $(DEPDIR)/process_la-polydistort.Tpo -c -o process_la-polydistort.lo `test -f 'polydistort.c' || echo '$(srcdir)/'`polydistort.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-polydistort.Tpo $(DEPDIR)/process_la-polydistort.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='polydistort.c' object='process_la-polydistort.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-polydistort.lo `test -f 'polydistort.c' || echo '$(srcdir)/'`polydistort.c
+
+process_la-presentationops.lo: presentationops.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-presentationops.lo -MD -MP -MF $(DEPDIR)/process_la-presentationops.Tpo -c -o process_la-presentationops.lo `test -f 'presentationops.c' || echo '$(srcdir)/'`presentationops.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-presentationops.Tpo $(DEPDIR)/process_la-presentationops.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='presentationops.c' object='process_la-presentationops.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-presentationops.lo `test -f 'presentationops.c' || echo '$(srcdir)/'`presentationops.c
+
+process_la-psdf_logphi.lo: psdf_logphi.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-psdf_logphi.lo -MD -MP -MF $(DEPDIR)/process_la-psdf_logphi.Tpo -c -o process_la-psdf_logphi.lo `test -f 'psdf_logphi.c' || echo '$(srcdir)/'`psdf_logphi.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-psdf_logphi.Tpo $(DEPDIR)/process_la-psdf_logphi.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='psdf_logphi.c' object='process_la-psdf_logphi.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-psdf_logphi.lo `test -f 'psdf_logphi.c' || echo '$(srcdir)/'`psdf_logphi.c
+
+process_la-psf.lo: psf.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-psf.lo -MD -MP -MF $(DEPDIR)/process_la-psf.Tpo -c -o process_la-psf.lo `test -f 'psf.c' || echo '$(srcdir)/'`psf.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-psf.Tpo $(DEPDIR)/process_la-psf.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='psf.c' object='process_la-psf.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-psf.lo `test -f 'psf.c' || echo '$(srcdir)/'`psf.c
+
+process_la-psf-fit.lo: psf-fit.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-psf-fit.lo -MD -MP -MF $(DEPDIR)/process_la-psf-fit.Tpo -c -o process_la-psf-fit.lo `test -f 'psf-fit.c' || echo '$(srcdir)/'`psf-fit.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-psf-fit.Tpo $(DEPDIR)/process_la-psf-fit.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='psf-fit.c' object='process_la-psf-fit.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-psf-fit.lo `test -f 'psf-fit.c' || echo '$(srcdir)/'`psf-fit.c
+
+process_la-rank.lo: rank.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-rank.lo -MD -MP -MF $(DEPDIR)/process_la-rank.Tpo -c -o process_la-rank.lo `test -f 'rank.c' || echo '$(srcdir)/'`rank.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-rank.Tpo $(DEPDIR)/process_la-rank.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='rank.c' object='process_la-rank.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-rank.lo `test -f 'rank.c' || echo '$(srcdir)/'`rank.c
+
+process_la-rotate.lo: rotate.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-rotate.lo -MD -MP -MF $(DEPDIR)/process_la-rotate.Tpo -c -o process_la-rotate.lo `test -f 'rotate.c' || echo '$(srcdir)/'`rotate.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-rotate.Tpo $(DEPDIR)/process_la-rotate.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='rotate.c' object='process_la-rotate.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-rotate.lo `test -f 'rotate.c' || echo '$(srcdir)/'`rotate.c
+
+process_la-scale.lo: scale.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-scale.lo -MD -MP -MF $(DEPDIR)/process_la-scale.Tpo -c -o process_la-scale.lo `test -f 'scale.c' || echo '$(srcdir)/'`scale.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-scale.Tpo $(DEPDIR)/process_la-scale.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='scale.c' object='process_la-scale.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-scale.lo `test -f 'scale.c' || echo '$(srcdir)/'`scale.c
+
+process_la-scars.lo: scars.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-scars.lo -MD -MP -MF $(DEPDIR)/process_la-scars.Tpo -c -o process_la-scars.lo `test -f 'scars.c' || echo '$(srcdir)/'`scars.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-scars.Tpo $(DEPDIR)/process_la-scars.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='scars.c' object='process_la-scars.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-scars.lo `test -f 'scars.c' || echo '$(srcdir)/'`scars.c
+
+process_la-semsim.lo: semsim.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-semsim.lo -MD -MP -MF $(DEPDIR)/process_la-semsim.Tpo -c -o process_la-semsim.lo `test -f 'semsim.c' || echo '$(srcdir)/'`semsim.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-semsim.Tpo $(DEPDIR)/process_la-semsim.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='semsim.c' object='process_la-semsim.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-semsim.lo `test -f 'semsim.c' || echo '$(srcdir)/'`semsim.c
+
+process_la-shade.lo: shade.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-shade.lo -MD -MP -MF $(DEPDIR)/process_la-shade.Tpo -c -o process_la-shade.lo `test -f 'shade.c' || echo '$(srcdir)/'`shade.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-shade.Tpo $(DEPDIR)/process_la-shade.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='shade.c' object='process_la-shade.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-shade.lo `test -f 'shade.c' || echo '$(srcdir)/'`shade.c
+
+process_la-slope_dist.lo: slope_dist.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-slope_dist.lo -MD -MP -MF $(DEPDIR)/process_la-slope_dist.Tpo -c -o process_la-slope_dist.lo `test -f 'slope_dist.c' || echo '$(srcdir)/'`slope_dist.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-slope_dist.Tpo $(DEPDIR)/process_la-slope_dist.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='slope_dist.c' object='process_la-slope_dist.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-slope_dist.lo `test -f 'slope_dist.c' || echo '$(srcdir)/'`slope_dist.c
+
+process_la-sphere-revolve.lo: sphere-revolve.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-sphere-revolve.lo -MD -MP -MF $(DEPDIR)/process_la-sphere-revolve.Tpo -c -o process_la-sphere-revolve.lo `test -f 'sphere-revolve.c' || echo '$(srcdir)/'`sphere-revolve.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-sphere-revolve.Tpo $(DEPDIR)/process_la-sphere-revolve.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='sphere-revolve.c' object='process_la-sphere-revolve.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-sphere-revolve.lo `test -f 'sphere-revolve.c' || echo '$(srcdir)/'`sphere-revolve.c
+
+process_la-stitch.lo: stitch.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-stitch.lo -MD -MP -MF $(DEPDIR)/process_la-stitch.Tpo -c -o process_la-stitch.lo `test -f 'stitch.c' || echo '$(srcdir)/'`stitch.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-stitch.Tpo $(DEPDIR)/process_la-stitch.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='stitch.c' object='process_la-stitch.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-stitch.lo `test -f 'stitch.c' || echo '$(srcdir)/'`stitch.c
+
+process_la-straighten_path.lo: straighten_path.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-straighten_path.lo -MD -MP -MF $(DEPDIR)/process_la-straighten_path.Tpo -c -o process_la-straighten_path.lo `test -f 'straighten_path.c' || echo '$(srcdir)/'`straighten_path.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-straighten_path.Tpo $(DEPDIR)/process_la-straighten_path.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='straighten_path.c' object='process_la-straighten_path.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-straighten_path.lo `test -f 'straighten_path.c' || echo '$(srcdir)/'`straighten_path.c
+
+process_la-threshold.lo: threshold.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-threshold.lo -MD -MP -MF $(DEPDIR)/process_la-threshold.Tpo -c -o process_la-threshold.lo `test -f 'threshold.c' || echo '$(srcdir)/'`threshold.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-threshold.Tpo $(DEPDIR)/process_la-threshold.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='threshold.c' object='process_la-threshold.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-threshold.lo `test -f 'threshold.c' || echo '$(srcdir)/'`threshold.c
+
+process_la-tilt.lo: tilt.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-tilt.lo -MD -MP -MF $(DEPDIR)/process_la-tilt.Tpo -c -o process_la-tilt.lo `test -f 'tilt.c' || echo '$(srcdir)/'`tilt.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-tilt.Tpo $(DEPDIR)/process_la-tilt.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tilt.c' object='process_la-tilt.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-tilt.lo `test -f 'tilt.c' || echo '$(srcdir)/'`tilt.c
+
+process_la-tip_blind.lo: tip_blind.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-tip_blind.lo -MD -MP -MF $(DEPDIR)/process_la-tip_blind.Tpo -c -o process_la-tip_blind.lo `test -f 'tip_blind.c' || echo '$(srcdir)/'`tip_blind.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-tip_blind.Tpo $(DEPDIR)/process_la-tip_blind.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tip_blind.c' object='process_la-tip_blind.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-tip_blind.lo `test -f 'tip_blind.c' || echo '$(srcdir)/'`tip_blind.c
+
+process_la-tip_model.lo: tip_model.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-tip_model.lo -MD -MP -MF $(DEPDIR)/process_la-tip_model.Tpo -c -o process_la-tip_model.lo `test -f 'tip_model.c' || echo '$(srcdir)/'`tip_model.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-tip_model.Tpo $(DEPDIR)/process_la-tip_model.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tip_model.c' object='process_la-tip_model.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-tip_model.lo `test -f 'tip_model.c' || echo '$(srcdir)/'`tip_model.c
+
+process_la-tipops.lo: tipops.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-tipops.lo -MD -MP -MF $(DEPDIR)/process_la-tipops.Tpo -c -o process_la-tipops.lo `test -f 'tipops.c' || echo '$(srcdir)/'`tipops.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-tipops.Tpo $(DEPDIR)/process_la-tipops.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tipops.c' object='process_la-tipops.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-tipops.lo `test -f 'tipops.c' || echo '$(srcdir)/'`tipops.c
+
+process_la-unrotate.lo: unrotate.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-unrotate.lo -MD -MP -MF $(DEPDIR)/process_la-unrotate.Tpo -c -o process_la-unrotate.lo `test -f 'unrotate.c' || echo '$(srcdir)/'`unrotate.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-unrotate.Tpo $(DEPDIR)/process_la-unrotate.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='unrotate.c' object='process_la-unrotate.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-unrotate.lo `test -f 'unrotate.c' || echo '$(srcdir)/'`unrotate.c
+
+process_la-volumize.lo: volumize.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-volumize.lo -MD -MP -MF $(DEPDIR)/process_la-volumize.Tpo -c -o process_la-volumize.lo `test -f 'volumize.c' || echo '$(srcdir)/'`volumize.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-volumize.Tpo $(DEPDIR)/process_la-volumize.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='volumize.c' object='process_la-volumize.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-volumize.lo `test -f 'volumize.c' || echo '$(srcdir)/'`volumize.c
+
+process_la-volumize_layers.lo: volumize_layers.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-volumize_layers.lo -MD -MP -MF $(DEPDIR)/process_la-volumize_layers.Tpo -c -o process_la-volumize_layers.lo `test -f 'volumize_layers.c' || echo '$(srcdir)/'`volumize_layers.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-volumize_layers.Tpo $(DEPDIR)/process_la-volumize_layers.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='volumize_layers.c' object='process_la-volumize_layers.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-volumize_layers.lo `test -f 'volumize_layers.c' || echo '$(srcdir)/'`volumize_layers.c
+
+process_la-wave_synth.lo: wave_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-wave_synth.lo -MD -MP -MF $(DEPDIR)/process_la-wave_synth.Tpo -c -o process_la-wave_synth.lo `test -f 'wave_synth.c' || echo '$(srcdir)/'`wave_synth.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-wave_synth.Tpo $(DEPDIR)/process_la-wave_synth.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='wave_synth.c' object='process_la-wave_synth.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-wave_synth.lo `test -f 'wave_synth.c' || echo '$(srcdir)/'`wave_synth.c
+
+process_la-wpour_mark.lo: wpour_mark.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-wpour_mark.lo -MD -MP -MF $(DEPDIR)/process_la-wpour_mark.Tpo -c -o process_la-wpour_mark.lo `test -f 'wpour_mark.c' || echo '$(srcdir)/'`wpour_mark.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-wpour_mark.Tpo $(DEPDIR)/process_la-wpour_mark.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='wpour_mark.c' object='process_la-wpour_mark.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-wpour_mark.lo `test -f 'wpour_mark.c' || echo '$(srcdir)/'`wpour_mark.c
+
+process_la-xydenoise.lo: xydenoise.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-xydenoise.lo -MD -MP -MF $(DEPDIR)/process_la-xydenoise.Tpo -c -o process_la-xydenoise.lo `test -f 'xydenoise.c' || echo '$(srcdir)/'`xydenoise.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-xydenoise.Tpo $(DEPDIR)/process_la-xydenoise.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='xydenoise.c' object='process_la-xydenoise.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-xydenoise.lo `test -f 'xydenoise.c' || echo '$(srcdir)/'`xydenoise.c
+
+process_la-xyzize.lo: xyzize.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-xyzize.lo -MD -MP -MF $(DEPDIR)/process_la-xyzize.Tpo -c -o process_la-xyzize.lo `test -f 'xyzize.c' || echo '$(srcdir)/'`xyzize.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-xyzize.Tpo $(DEPDIR)/process_la-xyzize.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='xyzize.c' object='process_la-xyzize.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-xyzize.lo `test -f 'xyzize.c' || echo '$(srcdir)/'`xyzize.c
+
+process_la-process.lo: process.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -MT process_la-process.lo -MD -MP -MF $(DEPDIR)/process_la-process.Tpo -c -o process_la-process.lo `test -f 'process.c' || echo '$(srcdir)/'`process.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/process_la-process.Tpo $(DEPDIR)/process_la-process.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='process.c' object='process_la-process.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(process_la_CFLAGS) $(CFLAGS) -c -o process_la-process.lo `test -f 'process.c' || echo '$(srcdir)/'`process.c
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
@@ -1691,13 +3162,15 @@ distdir: $(DISTFILES)
 	  fi; \
 	done
 check-am: all-am
-check: check-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
 all-am: Makefile $(LTLIBRARIES)
 installdirs:
 	for dir in "$(DESTDIR)$(processdir)"; do \
 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
-install: install-am
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
 install-exec: install-exec-am
 install-data: install-data-am
 uninstall: uninstall-am
@@ -1727,6 +3200,7 @@ distclean-generic:
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
 clean: clean-am
 
 clean-am: clean-generic clean-libtool clean-local \
@@ -1798,7 +3272,7 @@ ps-am:
 
 uninstall-am: uninstall-processLTLIBRARIES
 
-.MAKE: install-am install-strip
+.MAKE: all check install install-am install-strip
 
 .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
 	clean-libtool clean-local clean-processLTLIBRARIES \
@@ -1818,6 +3292,9 @@ uninstall-am: uninstall-processLTLIBRARIES
 .PRECIOUS: Makefile
 
 
+process.c: $(srcdir)/Makefile.am $(top_srcdir)/utils/gen-module-bundle.sh
+	$(SHELL) $(top_srcdir)/utils/gen-module-bundle.sh process.c $(bundlable_modules)
+
 clean-local:
 	rm -f core.* *~
 
diff --git a/modules/process/acf2d.c b/modules/process/acf2d.c
index 63727fe..549b697 100644
--- a/modules/process/acf2d.c
+++ b/modules/process/acf2d.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: acf2d.c 16388 2014-07-10 14:26:53Z yeti-dn $
+ *  @(#) $Id: acf2d.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2007 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -41,7 +41,7 @@ static GwyModuleInfo module_info = {
     "2007",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, acf2d)
 
 static gboolean
 module_register(void)
diff --git a/modules/process/angle_dist.c b/modules/process/angle_dist.c
index a4e76d3..2004f67 100644
--- a/modules/process/angle_dist.c
+++ b/modules/process/angle_dist.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: angle_dist.c 18665 2016-04-26 20:42:48Z yeti-dn $
+ *  @(#) $Id: angle_dist.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -102,12 +102,12 @@ static GwyModuleInfo module_info = {
     N_("Calculates two-dimensional distribution of angles, "
        "that is projections of slopes to all directions."),
     "Yeti <yeti at gwyddion.net>",
-    "1.8",
+    "1.9",
     "David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, angle_dist)
 
 static gboolean
 module_register(void)
@@ -176,7 +176,7 @@ angle_dialog(AngleArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(5, 4, FALSE);
+    table = gtk_table_new(5, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -185,33 +185,33 @@ angle_dialog(AngleArgs *args)
     row = 0;
 
     controls.size = gtk_adjustment_new(args->size, 10, MAX_OUT_SIZE, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("Output _size:"), "px",
-                            controls.size, 0);
+    gwy_table_attach_adjbar(table, row, _("Output _size:"), _("px"),
+                            controls.size, GWY_HSCALE_SQRT);
     row++;
 
     controls.steps = gtk_adjustment_new(args->steps, 6, MAX_STEPS, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("_Number of steps:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Number of steps:"), NULL,
                             controls.steps, GWY_HSCALE_SQRT);
     row++;
 
     controls.logscale
         = gtk_check_button_new_with_mnemonic(_("_Logarithmic value scale"));
     gtk_table_attach(GTK_TABLE(table), controls.logscale,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.fit_plane
         = gtk_check_button_new_with_mnemonic(_("Use local plane _fitting"));
     gtk_table_attach(GTK_TABLE(table), controls.fit_plane,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls.fit_plane, "toggled",
                      G_CALLBACK(angle_fit_plane_cb), &controls);
     row++;
 
     controls.kernel_size = gtk_adjustment_new(args->kernel_size,
                                               2, 16, 1, 4, 0);
-    gwy_table_attach_hscale(table, row, _("_Plane size:"), "px",
-                            controls.kernel_size, 0);
+    gwy_table_attach_adjbar(table, row, _("_Plane size:"), _("px"),
+                            controls.kernel_size, GWY_HSCALE_LINEAR);
     row++;
 
     angle_dialog_update_controls(&controls, args);
diff --git a/modules/process/arithmetic.c b/modules/process/arithmetic.c
index 1527c2a..bbb9c58 100644
--- a/modules/process/arithmetic.c
+++ b/modules/process/arithmetic.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: arithmetic.c 19216 2016-11-09 10:39:06Z yeti-dn $
+ *  @(#) $Id: arithmetic.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2013 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -144,7 +144,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, arithmetic)
 
 static gboolean
 module_register(void)
@@ -270,7 +270,7 @@ arithmetic_dialog(GwyContainer *data,
     label = gtk_label_new_with_mnemonic(_("_Expression:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     row++;
 
     entry = gtk_combo_box_entry_new_with_model(args->history, 0);
@@ -285,22 +285,22 @@ arithmetic_dialog(GwyContainer *data,
     gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry);
     row++;
 
-    controls.result = label = gtk_label_new("");
+    controls.result = label = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     row++;
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gtk_label_new(_("Operands"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
 
     label = gtk_label_new(_("Units"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label, 2, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     row++;
 
     controls.dataunits = NULL;
@@ -311,7 +311,7 @@ arithmetic_dialog(GwyContainer *data,
         gwy_strkill(args->name[i], "_");
         gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
         gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1,
-                         GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                         GTK_FILL, 0, 0, 0);
 
         args->name[NARGS*ARITHMETIC_MASK + i] = g_strdup_printf("m%d", i+1);
         args->name[NARGS*ARITHMETIC_DER_X + i] = g_strdup_printf("bx%d", i+1);
@@ -348,7 +348,7 @@ arithmetic_dialog(GwyContainer *data,
 
     hbox2 = gtk_hbox_new(FALSE, 6);
     gtk_table_attach(GTK_TABLE(table), hbox2, 0, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
 
     label = gtk_label_new_with_mnemonic(_("Specify un_its:"));
     gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
diff --git a/modules/process/averaging.c b/modules/process/averaging.c
index 0a19f64..812b072 100644
--- a/modules/process/averaging.c
+++ b/modules/process/averaging.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: averaging.c 18234 2016-01-27 14:57:31Z yeti-dn $
+ *  @(#) $Id: averaging.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2011, David Necas (Yeti), Petr Klapetek, Daniil Bratashov
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, dn2010 at gmail.com
  *
@@ -57,7 +57,7 @@ static GwyModuleInfo module_info = {
     "2011",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, averaging)
 
 static gboolean
 module_register(void)
diff --git a/modules/process/basicops.c b/modules/process/basicops.c
index 9fd5c18..8c821ab 100644
--- a/modules/process/basicops.c
+++ b/modules/process/basicops.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: basicops.c 18937 2016-09-09 09:04:59Z yeti-dn $
+ *  @(#) $Id: basicops.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -58,7 +58,7 @@ static GwyModuleInfo module_info = {
     "2003",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, basicops)
 
 static gboolean
 module_register(void)
@@ -116,7 +116,7 @@ module_register(void)
     gwy_process_func_register("null_offsets",
                               (GwyProcessFunc)&null_offsets,
                               N_("/_Basic Operations/_Null Offsets"),
-                              NULL,
+                              GWY_STOCK_NULL_OFFSETS,
                               BASICOPS_RUN_MODES,
                               GWY_MENU_FLAG_DATA,
                               N_("Null horizontal offsets, moving the origin "
diff --git a/modules/process/bdep_synth.c b/modules/process/bdep_synth.c
index 82e858b..789358a 100644
--- a/modules/process/bdep_synth.c
+++ b/modules/process/bdep_synth.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: bdep_synth.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: bdep_synth.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2015 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -149,19 +149,19 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Generates surfaces by ballistic deposition."),
     "Yeti <yeti at gwyddion.net>",
-    "1.1",
+    "1.2",
     "David Nečas (Yeti)",
     "2015",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, bdep_synth)
 
 static gboolean
 module_register(void)
 {
     gwy_process_func_register("bdep_synth",
                               (GwyProcessFunc)&bdep_synth,
-                              N_("/S_ynthetic/_Ballistic..."),
+                              N_("/S_ynthetic/_Deposition/_Ballistic..."),
                               GWY_STOCK_SYNTHETIC_BALLISTIC_DEPOSITION,
                               BDEP_SYNTH_RUN_MODES,
                               0,
@@ -406,7 +406,7 @@ bdep_synth_dialog(BDepSynthArgs *args,
                              gwy_dimensions_get_widget(controls.dims),
                              gtk_label_new(_("Dimensions")));
 
-    table = gtk_table_new(4 + (dfield_template ? 1 : 0), 4, FALSE);
+    table = gtk_table_new(4 + (dfield_template ? 1 : 0), 3, FALSE);
     /* This is used only for synt.h helpers. */
     controls.table = GTK_TABLE(table);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
@@ -419,7 +419,7 @@ bdep_synth_dialog(BDepSynthArgs *args,
     controls.coverage = gtk_adjustment_new(args->coverage,
                                            0.01, 10000.0, 0.01, 1.0, 0);
     g_object_set_data(G_OBJECT(controls.coverage), "target", &args->coverage);
-    gwy_table_attach_hscale(table, row, _("Co_verage:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("Co_verage:"), NULL,
                             controls.coverage, GWY_HSCALE_LOG);
     g_signal_connect_swapped(controls.coverage, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
@@ -431,11 +431,11 @@ bdep_synth_dialog(BDepSynthArgs *args,
 
     if (dfield_template) {
         controls.height_init
-            = gtk_button_new_with_mnemonic(_("_Like Current Channel"));
+            = gtk_button_new_with_mnemonic(_("_Like Current Image"));
         g_signal_connect_swapped(controls.height_init, "clicked",
                                  G_CALLBACK(height_init_clicked), &controls);
         gtk_table_attach(GTK_TABLE(table), controls.height_init,
-                         1, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
     }
 
@@ -443,7 +443,7 @@ bdep_synth_dialog(BDepSynthArgs *args,
                                     &controls.height_noise,
                                     &args->height_noise);
 
-    table = gtk_table_new(1 + GRAPH_NFLAGS, 4, FALSE);
+    table = gtk_table_new(1 + GRAPH_NFLAGS, 3, FALSE);
     /* This is used only for synt.h helpers. */
     controls.table = GTK_TABLE(table);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
@@ -456,7 +456,7 @@ bdep_synth_dialog(BDepSynthArgs *args,
     label = gtk_label_new(_("Plot graphs:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     for (i = 0; i < GRAPH_NFLAGS; i++) {
diff --git a/modules/process/calcoefs_load.c b/modules/process/calcoefs_load.c
index 24d9514..d663397 100644
--- a/modules/process/calcoefs_load.c
+++ b/modules/process/calcoefs_load.c
@@ -89,7 +89,7 @@ static GwyModuleInfo module_info = {
     "2010",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, calcoefs_load)
 
 static gboolean
 module_register(void)
diff --git a/modules/process/calcoefs_new.c b/modules/process/calcoefs_new.c
index b1b2e35..2d5186b 100644
--- a/modules/process/calcoefs_new.c
+++ b/modules/process/calcoefs_new.c
@@ -177,7 +177,7 @@ static GwyModuleInfo module_info = {
     "2010",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, calcoefs_new)
 
 static gboolean
 module_register(void)
diff --git a/modules/process/calcoefs_simple.c b/modules/process/calcoefs_simple.c
index 3787705..5d6f35c 100644
--- a/modules/process/calcoefs_simple.c
+++ b/modules/process/calcoefs_simple.c
@@ -173,7 +173,7 @@ static GwyModuleInfo module_info = {
     "2010",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, calcoefs_simple)
 
 static gboolean
 module_register(void)
diff --git a/modules/process/calcoefs_view.c b/modules/process/calcoefs_view.c
index 11ea0c1..d0791ab 100644
--- a/modules/process/calcoefs_view.c
+++ b/modules/process/calcoefs_view.c
@@ -240,7 +240,7 @@ static GwyModuleInfo module_info = {
     "2010",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, calcoefs_view)
 
 static gboolean
 module_register(void)
diff --git a/modules/process/calibrate.c b/modules/process/calibrate.c
index 389d259..349e415 100644
--- a/modules/process/calibrate.c
+++ b/modules/process/calibrate.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: calibrate.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: calibrate.c 19967 2017-06-23 20:54:47Z yeti-dn $
  *  Copyright (C) 2003-2013 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -77,10 +77,6 @@ typedef struct {
     GtkObject *xratio;
     GtkObject *yratio;
     GtkObject *zratio;
-    GtkWidget *xratio_spin;
-    GtkWidget *xratio_label;
-    GtkWidget *yratio_spin;
-    GtkWidget *yratio_label;
     GtkWidget *match_size;
     GtkWidget *size_chooser;
     GtkWidget *xyexponent;
@@ -93,10 +89,6 @@ typedef struct {
     GtkObject *xreal;
     GtkObject *yreal;
     GtkObject *zreal;
-    GtkWidget *xreal_spin;
-    GtkWidget *xreal_label;
-    GtkWidget *yreal_spin;
-    GtkWidget *yreal_label;
     GtkObject *x0;
     GtkObject *y0;
     GtkObject *zshift;
@@ -179,12 +171,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Recalibrates scan lateral dimensions or value range."),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "2.14",
+    "2.16",
     "David Nečas (Yeti) & Petr Klapetek",
     "2003",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, calibrate)
 
 static gboolean
 module_register(void)
@@ -381,7 +373,7 @@ static gboolean
 calibrate_dialog(CalibrateArgs *args,
                  GwyDataField *dfield)
 {
-    GtkWidget *dialog, *spin, *table, *label;
+    GtkWidget *dialog, *spin, *table, *label, *hbox;
     GwyDataChooser *chooser;
     GwySIUnit *unit;
     CalibrateControls controls;
@@ -408,211 +400,173 @@ calibrate_dialog(CalibrateArgs *args,
     row = 0;
 
     /***** New Real Dimensions *****/
-    label = gwy_label_new_header(_("New Real Dimensions"));
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    row++;
 
-    controls.match_size
-        = gtk_check_button_new_with_mnemonic(_("_Match pixel size:"));
-    gtk_table_attach(GTK_TABLE(table), controls.match_size,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    g_signal_connect(controls.match_size, "toggled",
-                     G_CALLBACK(match_size_changed), &controls);
+    gtk_table_attach(GTK_TABLE(table),
+                     gwy_label_new_header(_("New Real Dimensions")),
+                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    row++;
 
     controls.size_chooser = gwy_data_chooser_new_channels();
     chooser = GWY_DATA_CHOOSER(controls.size_chooser);
-    gtk_widget_set_sensitive(controls.size_chooser, FALSE);
     gwy_data_chooser_set_filter(chooser, mould_filter, &args->targetid, NULL);
     if (!gwy_data_chooser_set_active_id(chooser, &args->sizeid))
         args->match_size = FALSE;
 
+    gwy_table_attach_adjbar(table, row, _("_Match pixel size:"), NULL,
+                            GTK_OBJECT(controls.size_chooser),
+                            GWY_HSCALE_CHECK | GWY_HSCALE_WIDGET_NO_EXPAND);
+    controls.match_size
+        = gwy_table_hscale_get_check(GTK_OBJECT(controls.size_chooser));
+    g_signal_connect(controls.match_size, "toggled",
+                     G_CALLBACK(match_size_changed), &controls);
+
     if (gwy_data_chooser_get_active(chooser, NULL)) {
+        /* XXX: Extend the chooser one column to the right.  Dirty. */
+        if ((hbox = gtk_widget_get_parent(controls.size_chooser))
+            && GTK_IS_HBOX(hbox)) {
+            gtk_container_child_set(GTK_CONTAINER(table), hbox,
+                                    "right-attach", 3,
+                                    NULL);
+        }
         g_signal_connect(controls.size_chooser, "changed",
                          G_CALLBACK(size_channel_changed), &controls);
     }
     else {
-        gtk_widget_set_sensitive(controls.match_size, FALSE);
+        gwy_table_hscale_set_sensitive(GTK_OBJECT(controls.size_chooser),
+                                       FALSE);
         gtk_widget_set_no_show_all(controls.match_size, TRUE);
         gtk_widget_set_no_show_all(controls.size_chooser, TRUE);
         args->match_size = FALSE;
     }
-    gtk_table_attach_defaults(GTK_TABLE(table), controls.size_chooser,
-                              1, 3, row, row+1);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.match_size),
+                                 args->match_size);
     row++;
 
-    label = gtk_label_new_with_mnemonic(_("_X range:"));
-    controls.xreal_label = label;
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
     controls.xreal = gtk_adjustment_new(args->xreal/pow10(args->xyexponent),
                                         0.01, 10000, 1, 10, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.xreal), 1, 2);
-    controls.xreal_spin = spin;
-    gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
-    gtk_table_attach(GTK_TABLE(table), spin,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("_X range:"), NULL,
+                                   controls.xreal, GWY_HSCALE_LOG);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
 
     unit = gwy_data_field_get_si_unit_xy(dfield);
     controls.xyexponent
         = gwy_combo_box_metric_unit_new(G_CALLBACK(xyexponent_changed),
                                         &controls, -15, 6, unit,
                                         args->xyexponent);
-    gtk_table_attach(GTK_TABLE(table), controls.xyexponent, 2, 3, row, row+2,
-                     GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), controls.xyexponent,
+                     2, 3, row, row+2, GTK_FILL | GTK_SHRINK, 0, 0, 0);
 
     controls.xyunits = gtk_button_new_with_label(gwy_sgettext("verb|Change"));
     g_object_set_data(G_OBJECT(controls.xyunits), "id", (gpointer)"xy");
     gtk_table_attach(GTK_TABLE(table), controls.xyunits,
-                     3, 4, row, row+2,
-                     GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0);
+                     3, 4, row, row+2, GTK_FILL | GTK_SHRINK, 0, 0, 0);
     row++;
 
-    label = gtk_label_new_with_mnemonic(_("_Y range:"));
-    controls.yreal_label = label;
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
     controls.yreal = gtk_adjustment_new(args->yreal/pow10(args->xyexponent),
                                         0.01, 10000, 1, 10, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.yreal), 1, 2);
-    controls.yreal_spin = spin;
-    gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
-    gtk_table_attach(GTK_TABLE(table), spin,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("_Y range:"), NULL,
+                                   controls.yreal, GWY_HSCALE_LOG);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
     row++;
 
-    controls.square
-        = gtk_check_button_new_with_mnemonic(_("_Square samples"));
+    controls.square = gtk_check_button_new_with_mnemonic(_("_Square samples"));
     gtk_table_attach(GTK_TABLE(table), controls.square,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     /***** Lateral Offsets *****/
 
-    label = gtk_label_new_with_mnemonic(_("_X offset:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
     controls.x0 = gtk_adjustment_new(args->x0/pow10(args->xyexponent),
                                      -10000, 10000, 1, 10, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.x0), 1, 2);
-    gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
-    gtk_table_attach(GTK_TABLE(table), spin,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("_X offset:"), NULL,
+                                   controls.x0, GWY_HSCALE_SQRT);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2);
     row++;
 
-    label = gtk_label_new_with_mnemonic(_("_Y offset:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
     controls.y0 = gtk_adjustment_new(args->y0/pow10(args->xyexponent),
                                      -10000, 10000, 1, 10, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.y0), 1, 2);
-    gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
-    gtk_table_attach(GTK_TABLE(table), spin,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+    spin = gwy_table_attach_adjbar(table, row, _("_Y offset:"), NULL,
+                                   controls.y0, GWY_HSCALE_SQRT);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2);
     row++;
 
     /***** Value Range *****/
-    label = gwy_label_new_header(_("Value Range"));
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    row++;
 
-    label = gtk_label_new_with_mnemonic(_("_Z range:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Value Range")),
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    row++;
 
-    controls.zreal = gtk_adjustment_new(args->zreal/pow10(args->zexponent),
-                                        -10000, 10000, 1, 10, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.zreal), 1, 2);
-    gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
-    gtk_table_attach(GTK_TABLE(table), spin,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    controls.zreal = gtk_adjustment_new(args->zreal/pow10(args->xyexponent),
+                                     -10000, 10000, 1, 10, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("_Z range:"), NULL,
+                                   controls.zreal, GWY_HSCALE_SQRT);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2);
 
     unit = gwy_data_field_get_si_unit_z(dfield);
     controls.zexponent
         = gwy_combo_box_metric_unit_new(G_CALLBACK(zexponent_changed),
                                         &controls, -15, 6, unit,
                                         args->zexponent);
-    gtk_table_attach(GTK_TABLE(table), controls.zexponent, 2, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), controls.zexponent,
+                     2, 3, row, row+1, GTK_FILL | GTK_SHRINK, 0, 0, 0);
 
     controls.zunits = gtk_button_new_with_label(gwy_sgettext("verb|Change"));
     g_object_set_data(G_OBJECT(controls.zunits), "id", (gpointer)"z");
     gtk_table_attach(GTK_TABLE(table), controls.zunits,
-                     3, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0);
+                     3, 4, row, row+1, GTK_FILL | GTK_SHRINK, 0, 0, 0);
     row++;
 
     /***** Value Shift *****/
 
-    label = gtk_label_new_with_mnemonic(_("Z shi_ft:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    controls.zshift = gtk_adjustment_new(args->zshift/pow10(args->zexponent),
-                                         -10000, 10000, 1, 10, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.zshift), 1, 2);
-    gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
-    gtk_table_attach(GTK_TABLE(table), spin,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+    controls.zshift = gtk_adjustment_new(args->zshift/pow10(args->xyexponent),
+                                     -10000, 10000, 1, 10, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("Z shi_ft:"), NULL,
+                                   controls.zshift, GWY_HSCALE_SQRT);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2);
     row++;
 
     /***** Calibration Coefficients *****/
-    label = gwy_label_new_header(_("Calibration Coefficients"));
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    gtk_table_attach(GTK_TABLE(table),
+                     gwy_label_new_header(_("Calibration Coefficients")),
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.xratio = gtk_adjustment_new(args->xratio, 0.001, 1000, 0.1, 1, 0);
-    spin = gwy_table_attach_spinbutton(table, row,
-                                       _("_X calibration factor:"), "",
-                                       controls.xratio);
-    controls.xratio_spin = spin;
-    controls.xratio_label = gwy_table_get_child_widget(table, row, 0);
-    controls.xpower10 = gwy_table_get_child_widget(table, row, 2);
+    spin = gwy_table_attach_adjbar(table, row, _("_X calibration factor:"), " ",
+                                   controls.xratio, GWY_HSCALE_LOG);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
+    controls.xpower10 = gwy_table_hscale_get_units(controls.xratio);
     row++;
 
     controls.yratio = gtk_adjustment_new(args->yratio, 0.001, 1000, 0.1, 1, 0);
-    spin = gwy_table_attach_spinbutton(table, row,
-                                       _("_Y calibration factor:"), "",
-                                       controls.yratio);
-    controls.yratio_spin = spin;
-    controls.yratio_label = gwy_table_get_child_widget(table, row, 0);
-    controls.ypower10 = gwy_table_get_child_widget(table, row, 2);
+    spin = gwy_table_attach_adjbar(table, row, _("_Y calibration factor:"), " ",
+                                   controls.yratio, GWY_HSCALE_LOG);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
+    controls.ypower10 = gwy_table_hscale_get_units(controls.yratio);
     row++;
 
     controls.zratio = gtk_adjustment_new(args->zratio, -1000, 1000, 0.1, 1, 0);
-    spin = gwy_table_attach_spinbutton(table, row,
-                                       _("_Z calibration factor:"), "",
-                                       controls.zratio);
-    controls.zpower10 = gwy_table_get_child_widget(table, row, 2);
+    spin = gwy_table_attach_adjbar(table, row, _("_Z calibration factor:"), " ",
+                                   controls.zratio, GWY_HSCALE_SQRT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
+    controls.zpower10 = gwy_table_hscale_get_units(controls.zratio);
     row++;
 
     /***** Options *****/
+
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gwy_label_new_header(_("Options"));
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.new_channel
-        = gtk_check_button_new_with_mnemonic(_("Create new channel"));
+        = gtk_check_button_new_with_mnemonic(_("Create new image"));
     gtk_table_attach(GTK_TABLE(table), controls.new_channel,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     g_signal_connect(controls.xreal, "value-changed",
@@ -718,6 +672,12 @@ dialog_reset(CalibrateControls *controls,
                              calibrate_defaults.zshift);
 
     calibrate_dialog_update(controls, args);
+
+    args->zreal = args->zorig;
+    args->xreal = args->xorig;
+    args->yreal = args->yorig;
+    args->x0 = args->x0orig;
+    args->y0 = args->y0orig;
 }
 
 static void
@@ -725,13 +685,22 @@ xratio_changed(GtkAdjustment *adj,
                CalibrateControls *controls)
 {
     CalibrateArgs *args = controls->args;
+    gdouble newratio;
 
     if (controls->in_update)
         return;
 
     controls->in_update = TRUE;
-    args->xratio = gtk_adjustment_get_value(adj)
-                   * pow10(args->xyexponent - args->xyorigexp);
+    newratio = gtk_adjustment_get_value(adj) * pow10(args->xyexponent
+                                                     - args->xyorigexp);
+    /* XXX: Sometimes a strange infinite update cycle far in non-significant
+     * digits can occur.  Not sure why. */
+    if (fabs(log(newratio/args->xratio)) < 1e-8) {
+        controls->in_update = FALSE;
+        return;
+    }
+
+    args->xratio = newratio;
     args->xreal = args->xratio * args->xorig;
     if (args->square) {
         args->yreal = args->xreal/args->xres * args->yres;
@@ -746,13 +715,22 @@ yratio_changed(GtkAdjustment *adj,
                CalibrateControls *controls)
 {
     CalibrateArgs *args = controls->args;
+    gdouble newratio;
 
     if (controls->in_update)
         return;
 
     controls->in_update = TRUE;
-    args->yratio = gtk_adjustment_get_value(adj)
-                   * pow10(args->xyexponent - args->xyorigexp);
+    newratio = gtk_adjustment_get_value(adj) * pow10(args->xyexponent
+                                                     - args->xyorigexp);
+    /* XXX: Sometimes a strange infinite update cycle far in non-significant
+     * digits can occur.  Not sure why. */
+    if (fabs(log(newratio/args->yratio)) < 1e-8) {
+        controls->in_update = FALSE;
+        return;
+    }
+
+    args->yratio = newratio;
     args->yreal = args->yratio * args->yorig;
     if (args->square) {
         args->xreal = args->yreal/args->yres * args->xres;
@@ -767,16 +745,23 @@ zratio_changed(GtkAdjustment *adj,
                CalibrateControls *controls)
 {
     CalibrateArgs *args = controls->args;
+    gdouble newratio;
 
     if (controls->in_update)
         return;
 
     controls->in_update = TRUE;
-    args->zratio = gtk_adjustment_get_value(adj)
-                   * pow10(args->zexponent - args->zorigexp);
+    newratio = gtk_adjustment_get_value(adj) * pow10(args->zexponent
+                                                     - args->zorigexp);
+    /* XXX: Sometimes a strange infinite update cycle far in non-significant
+     * digits can occur.  Not sure why. */
+    if (fabs(log(newratio/args->zratio)) < 1e-8) {
+        controls->in_update = FALSE;
+        return;
+    }
 
+    args->zratio = newratio;
     args->zreal = args->zratio * args->zorig;
-
     calibrate_dialog_update(controls, args);
     controls->in_update = FALSE;
 }
@@ -786,12 +771,21 @@ xreal_changed(GtkAdjustment *adj,
               CalibrateControls *controls)
 {
     CalibrateArgs *args = controls->args;
+    gdouble newxreal;
 
     if (controls->in_update)
         return;
 
     controls->in_update = TRUE;
-    args->xreal = gtk_adjustment_get_value(adj) * pow10(args->xyexponent);
+    newxreal = gtk_adjustment_get_value(adj) * pow10(args->xyexponent);
+    /* XXX: Sometimes a strange infinite update cycle far in non-significant
+     * digits can occur.  Not sure why. */
+    if (fabs(log(newxreal/args->xreal)) < 1e-8) {
+        controls->in_update = FALSE;
+        return;
+    }
+
+    args->xreal = newxreal;
     args->xratio = args->xreal/args->xorig;
     if (args->square) {
         args->yreal = args->xreal/args->xres * args->yres;
@@ -807,13 +801,21 @@ yreal_changed(GtkAdjustment *adj,
               CalibrateControls *controls)
 {
     CalibrateArgs *args = controls->args;
+    gdouble newyreal;
 
     if (controls->in_update)
         return;
 
     controls->in_update = TRUE;
+    newyreal = gtk_adjustment_get_value(adj) * pow10(args->xyexponent);
+    /* XXX: Sometimes a strange infinite update cycle far in non-significant
+     * digits can occur.  Not sure why. */
+    if (fabs(log(newyreal/args->yreal)) < 1e-8) {
+        controls->in_update = FALSE;
+        return;
+    }
 
-    args->yreal = gtk_adjustment_get_value(adj) * pow10(args->xyexponent);
+    args->yreal = newyreal;
     args->yratio = args->yreal/args->yorig;
     if (args->square) {
         args->xreal = args->yreal/args->yres * args->xres;
@@ -828,15 +830,23 @@ x0_changed(GtkAdjustment *adj,
            CalibrateControls *controls)
 {
     CalibrateArgs *args = controls->args;
+    gdouble newx0;
 
     if (controls->in_update)
         return;
 
     controls->in_update = TRUE;
-    args->x0 = gtk_adjustment_get_value(adj) * pow10(args->xyexponent);
+    newx0 = gtk_adjustment_get_value(adj) * pow10(args->xyexponent);
+    /* XXX: Sometimes a strange infinite update cycle far in non-significant
+     * digits can occur.  Not sure why. */
+    if (newx0 == args->x0 || fabs(log(newx0/args->x0)) < 1e-8) {
+        controls->in_update = FALSE;
+        return;
+    }
+
+    args->x0 = newx0;
     calibrate_dialog_update(controls, args);
     controls->in_update = FALSE;
-
 }
 
 static void
@@ -844,13 +854,21 @@ y0_changed(GtkAdjustment *adj,
            CalibrateControls *controls)
 {
     CalibrateArgs *args = controls->args;
+    gdouble newy0;
 
     if (controls->in_update)
         return;
 
     controls->in_update = TRUE;
+    newy0 = gtk_adjustment_get_value(adj) * pow10(args->xyexponent);
+    /* XXX: Sometimes a strange infinite update cycle far in non-significant
+     * digits can occur.  Not sure why. */
+    if (newy0 == args->y0 || fabs(log(newy0/args->y0)) < 1e-8) {
+        controls->in_update = FALSE;
+        return;
+    }
 
-    args->y0 = gtk_adjustment_get_value(adj) * pow10(args->xyexponent);
+    args->y0 = newy0;
     calibrate_dialog_update(controls, args);
     controls->in_update = FALSE;
 }
@@ -860,13 +878,21 @@ zshift_changed(GtkAdjustment *adj,
                CalibrateControls *controls)
 {
     CalibrateArgs *args = controls->args;
+    gdouble newzshift;
 
     if (controls->in_update)
         return;
 
     controls->in_update = TRUE;
+    newzshift = gtk_adjustment_get_value(adj) * pow10(args->zexponent);
+    /* XXX: Sometimes a strange infinite update cycle far in non-significant
+     * digits can occur.  Not sure why. */
+    if (newzshift == args->zshift || fabs(log(newzshift/args->zshift)) < 1e-8) {
+        controls->in_update = FALSE;
+        return;
+    }
 
-    args->zshift = gtk_adjustment_get_value(adj) * pow10(args->zexponent);
+    args->zshift = newzshift;
     calibrate_dialog_update(controls, args);
     controls->in_update = FALSE;
 }
@@ -876,13 +902,21 @@ zreal_changed(GtkAdjustment *adj,
               CalibrateControls *controls)
 {
     CalibrateArgs *args = controls->args;
+    gdouble newzreal;
 
     if (controls->in_update)
         return;
 
     controls->in_update = TRUE;
+    newzreal = gtk_adjustment_get_value(adj) * pow10(args->zexponent);
+    /* XXX: Sometimes a strange infinite update cycle far in non-significant
+     * digits can occur.  Not sure why. */
+    if (fabs(log(newzreal/args->zreal)) < 1e-8) {
+        controls->in_update = FALSE;
+        return;
+    }
 
-    args->zreal = gtk_adjustment_get_value(adj) * pow10(args->zexponent);
+    args->zreal = newzreal;
     args->zratio = args->zreal/args->zorig;
     calibrate_dialog_update(controls, args);
     controls->in_update = FALSE;
@@ -1029,15 +1063,10 @@ match_size_changed(GtkToggleButton *toggle,
     gboolean matching = gtk_toggle_button_get_active(toggle);
 
     controls->args->match_size = matching;
-    gtk_widget_set_sensitive(controls->size_chooser, matching);
-    gtk_widget_set_sensitive(controls->xreal_spin, !matching);
-    gtk_widget_set_sensitive(controls->xreal_label, !matching);
-    gtk_widget_set_sensitive(controls->yreal_spin, !matching);
-    gtk_widget_set_sensitive(controls->yreal_label, !matching);
-    gtk_widget_set_sensitive(controls->xratio_spin, !matching);
-    gtk_widget_set_sensitive(controls->xratio_label, !matching);
-    gtk_widget_set_sensitive(controls->yratio_spin, !matching);
-    gtk_widget_set_sensitive(controls->yratio_label, !matching);
+    gwy_table_hscale_set_sensitive(controls->xreal, !matching);
+    gwy_table_hscale_set_sensitive(controls->yreal, !matching);
+    gwy_table_hscale_set_sensitive(controls->xratio, !matching);
+    gwy_table_hscale_set_sensitive(controls->yratio, !matching);
     gtk_widget_set_sensitive(controls->xyunits, !matching);
     gtk_widget_set_sensitive(controls->xyexponent, !matching);
     gtk_widget_set_sensitive(controls->square, !matching);
@@ -1046,9 +1075,10 @@ match_size_changed(GtkToggleButton *toggle,
     gtk_dialog_set_response_sensitive(GTK_DIALOG(controls->dialog),
                                       GTK_RESPONSE_OK, !matching);
 
-    if (matching)
+    if (matching) {
         size_channel_changed(GWY_DATA_CHOOSER(controls->size_chooser),
                              controls);
+    }
 }
 
 static void
diff --git a/modules/process/coerce.c b/modules/process/coerce.c
index b181ed5..3706623 100644
--- a/modules/process/coerce.c
+++ b/modules/process/coerce.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: coerce.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: coerce.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -163,7 +163,7 @@ static GwyModuleInfo module_info = {
     "2016",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, coerce)
 
 static gboolean
 module_register(void)
@@ -279,7 +279,7 @@ coerce_dialogue(CoerceArgs *args, GwyContainer *data, gint id)
     gtk_box_pack_start(GTK_BOX(vbox), controls.view, FALSE, FALSE, 0);
 
     table = gtk_table_new(COERCE_NDISTRIBUTIONS + COERCE_NPROCESSING + 6,
-                          4, FALSE);
+                          3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -289,7 +289,7 @@ coerce_dialogue(CoerceArgs *args, GwyContainer *data, gint id)
     label = gtk_label_new(_("Coerce value distribution to:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.distribution
@@ -300,8 +300,8 @@ coerce_dialogue(CoerceArgs *args, GwyContainer *data, gint id)
         GtkWidget *widget = GTK_WIDGET(l->data);
         CoerceDistributionType dist = gwy_radio_button_get_value(widget);
 
-        gtk_table_attach(GTK_TABLE(table), widget, 0, 3, row, row + 1,
-                         GTK_EXPAND | GTK_FILL, 0, 0, 0);
+        gtk_table_attach(GTK_TABLE(table), widget, 0, 2, row, row + 1,
+                         GTK_FILL, 0, 0, 0);
         row++;
 
         if (dist == COERCE_DISTRIBUTION_DATA) {
@@ -312,9 +312,9 @@ coerce_dialogue(CoerceArgs *args, GwyContainer *data, gint id)
                                         &template_filter, dfield, NULL);
             gwy_data_chooser_set_active_id(chooser, &args->template);
             gwy_data_chooser_get_active_id(chooser, &args->template);
-            gwy_table_attach_hscale(table, row, _("_Template:"), NULL,
+            gwy_table_attach_adjbar(table, row, _("_Template:"), NULL,
                                     GTK_OBJECT(controls.template),
-                                    GWY_HSCALE_WIDGET);
+                                    GWY_HSCALE_WIDGET_NO_EXPAND);
             g_signal_connect(controls.template, "changed",
                              G_CALLBACK(template_changed), &controls);
             row++;
@@ -328,15 +328,15 @@ coerce_dialogue(CoerceArgs *args, GwyContainer *data, gint id)
                                           _("Same area"),
                                           COERCE_LEVELS_EQUIAREA,
                                           NULL);
-            gwy_table_attach_hscale(table, row, _("_Type:"), NULL,
+            gwy_table_attach_adjbar(table, row, _("_Type:"), NULL,
                                     GTK_OBJECT(controls.level_type),
-                                    GWY_HSCALE_WIDGET);
+                                    GWY_HSCALE_WIDGET_NO_EXPAND);
             row++;
 
             controls.nlevels = gtk_adjustment_new(args->nlevels,
                                                   2.0, 16384.0,
                                                   1.0, 100.0, 0.0);
-            gwy_table_attach_hscale(table, row, _("Number of _levels:"), NULL,
+            gwy_table_attach_adjbar(table, row, _("Number of _levels:"), NULL,
                                     controls.nlevels, GWY_HSCALE_LOG);
             g_signal_connect(controls.nlevels, "value-changed",
                              G_CALLBACK(nlevels_changed), &controls);
@@ -349,7 +349,7 @@ coerce_dialogue(CoerceArgs *args, GwyContainer *data, gint id)
     label = gtk_label_new(_("Data processing:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.processing
@@ -357,20 +357,19 @@ coerce_dialogue(CoerceArgs *args, GwyContainer *data, gint id)
                                    G_CALLBACK(processing_changed), &controls,
                                    args->processing);
     row = gwy_radio_buttons_attach_to_table(controls.processing,
-                                            GTK_TABLE(table),
-                                            3, row);
+                                            GTK_TABLE(table), 2, row);
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gwy_label_new_header(_("Options"));
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.update = gtk_check_button_new_with_mnemonic(_("I_nstant updates"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.update),
                                  args->update);
     gtk_table_attach(GTK_TABLE(table), controls.update,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls.update, "toggled",
                      G_CALLBACK(update_changed), &controls);
     row++;
diff --git a/modules/process/col_synth.c b/modules/process/col_synth.c
index 032c107..72a2553 100644
--- a/modules/process/col_synth.c
+++ b/modules/process/col_synth.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: col_synth.c 19124 2016-10-25 19:12:11Z yeti-dn $
+ *  @(#) $Id: col_synth.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -198,14 +198,14 @@ static GwyModuleInfo module_info = {
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, col_synth)
 
 static gboolean
 module_register(void)
 {
     gwy_process_func_register("col_synth",
                               (GwyProcessFunc)&col_synth,
-                              N_("/S_ynthetic/_Columnar..."),
+                              N_("/S_ynthetic/_Deposition/_Columnar..."),
                               GWY_STOCK_SYNTHETIC_COLUMNAR,
                               COL_SYNTH_RUN_MODES,
                               0,
@@ -457,7 +457,7 @@ col_synth_dialog(ColSynthArgs *args,
                              gwy_dimensions_get_widget(controls.dims),
                              gtk_label_new(_("Dimensions")));
 
-    table = gtk_table_new(20 + (dfield_template ? 1 : 0), 4, FALSE);
+    table = gtk_table_new(20 + (dfield_template ? 1 : 0), 3, FALSE);
     /* This is used only for synt.h helpers. */
     controls.table = GTK_TABLE(table);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
@@ -470,7 +470,7 @@ col_synth_dialog(ColSynthArgs *args,
     controls.coverage = gtk_adjustment_new(args->coverage,
                                            0.001, 2000.0, 0.001, 1.0, 0);
     g_object_set_data(G_OBJECT(controls.coverage), "target", &args->coverage);
-    gwy_table_attach_hscale(table, row, _("Co_verage:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("Co_verage:"), NULL,
                             controls.coverage, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.coverage, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
@@ -478,12 +478,12 @@ col_synth_dialog(ColSynthArgs *args,
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Particle Size")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.height = gtk_adjustment_new(args->height, 0.1, 10.0, 0.1, 1.0, 0);
     g_object_set_data(G_OBJECT(controls.height), "target", &args->height);
-    gwy_table_attach_hscale(table, row, _("_Height:"), "px",
+    gwy_table_attach_adjbar(table, row, _("_Height:"), _("px"),
                             controls.height, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.height, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
@@ -496,7 +496,7 @@ col_synth_dialog(ColSynthArgs *args,
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     gtk_table_attach(GTK_TABLE(table),
                      gwy_label_new_header(_("Incidence")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     row = gwy_synth_attach_angle(&controls, row, &controls.theta, &args->theta,
@@ -514,24 +514,25 @@ col_synth_dialog(ColSynthArgs *args,
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     gtk_table_attach(GTK_TABLE(table),
                      gwy_label_new_header(_("Options")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.relaxation = relaxation_selector_new(&controls);
-    gwy_table_attach_hscale(table, row, _("Relaxation type:"), NULL,
-                            GTK_OBJECT(controls.relaxation), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("Relaxation type:"), NULL,
+                            GTK_OBJECT(controls.relaxation),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     controls.melting = gtk_adjustment_new(args->melting,
                                           0.0, 1.0, 0.0001, 0.01, 0);
     g_object_set_data(G_OBJECT(controls.melting), "target", &args->melting);
-    gwy_table_attach_hscale(table, row, _("_Melting:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Melting:"), NULL,
                             controls.melting, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.melting, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
     row++;
 
-    table = gtk_table_new(1 + GRAPH_NFLAGS, 4, FALSE);
+    table = gtk_table_new(1 + GRAPH_NFLAGS, 3, FALSE);
     /* This is used only for synt.h helpers. */
     controls.table = GTK_TABLE(table);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
@@ -554,7 +555,7 @@ col_synth_dialog(ColSynthArgs *args,
         toggle = GTK_TOGGLE_BUTTON(controls.graph_flags[i]);
         gtk_toggle_button_set_active(toggle, args->graph_flags[i]);
         gtk_table_attach(GTK_TABLE(table), controls.graph_flags[i],
-                         0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         g_signal_connect(toggle, "toggled",
                          G_CALLBACK(gwy_synth_boolean_changed_silent),
                          &args->graph_flags[i]);
diff --git a/modules/process/convolution_filter.c b/modules/process/convolution_filter.c
index f5d0eec..50ba5a3 100644
--- a/modules/process/convolution_filter.c
+++ b/modules/process/convolution_filter.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: convolution_filter.c 19216 2016-11-09 10:39:06Z yeti-dn $
+ *  @(#) $Id: convolution_filter.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -136,7 +136,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, convolution_filter)
 
 static gboolean
 module_register(void)
@@ -347,7 +347,7 @@ convolution_filter_create_filter_tab(ConvolutionControls *controls)
     gtk_box_pack_start(GTK_BOX(hbox2), table, FALSE, FALSE, 0);
 
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Size")),
-                     0, 1, 0, 1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 1, 0, 1, GTK_FILL, 0, 0, 0);
     controls->sizes
         = gwy_radio_buttons_create(sizes, nsizes,
                                    G_CALLBACK(convolution_filter_size_changed),
@@ -390,7 +390,7 @@ convolution_filter_create_filter_tab(ConvolutionControls *controls)
 
     controls->divisor_auto = gtk_check_button_new_with_mnemonic(_("_automatic"));
     gtk_table_attach(GTK_TABLE(table), controls->divisor_auto,
-                     2, 3, 0, 1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     2, 3, 0, 1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls->divisor_auto, "toggled",
                      G_CALLBACK(convolution_filter_autodiv_changed), controls);
 
diff --git a/modules/process/correct_affine.c b/modules/process/correct_affine.c
index 41973e8..7931225 100644
--- a/modules/process/correct_affine.c
+++ b/modules/process/correct_affine.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: correct_affine.c 18537 2016-03-28 18:11:19Z yeti-dn $
- *  Copyright (C) 2013-2014 David Necas (Yeti).
+ *  @(#) $Id: correct_affine.c 20137 2017-08-02 11:21:46Z yeti-dn $
+ *  Copyright (C) 2013-2017 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -29,6 +29,7 @@
 #include <libprocess/arithmetic.h>
 #include <libprocess/stats.h>
 #include <libprocess/correct.h>
+#include <libprocess/elliptic.h>
 #include <libgwydgets/gwyradiobuttons.h>
 #include <libgwydgets/gwycombobox.h>
 #include <libgwydgets/gwystock.h>
@@ -69,12 +70,6 @@ typedef enum {
     ZOOM_16 = 16
 } ZoomType;
 
-typedef enum {
-    SCALING_AS_GIVEN,
-    SCALING_PRESERVE_AREA,
-    SCALING_PRESERVE_X,
-} ScalingType;
-
 typedef struct {
     gdouble a1;
     gdouble a2;
@@ -86,9 +81,10 @@ typedef struct {
     gdouble a2;
     gdouble phi;
     gboolean different_lengths;
-    gboolean avoid_rotation;
+    gboolean distribute;
+    gboolean fix_hacf;
     GwyInterpolationType interp;
-    ScalingType scaling;
+    GwyAffineScalingType scaling;
     gint preset;
 
     ZoomType zoom;
@@ -108,6 +104,8 @@ typedef struct {
     GtkWidget *acffield;
     GtkWidget *interp;
     GtkWidget *scaling;
+    GtkWidget *distribute;
+    GtkWidget *fix_hacf;
     GwySIValueFormat *vf;
     GwySIValueFormat *vfphi;
     /* Actual */
@@ -120,7 +118,6 @@ typedef struct {
     GtkWidget *a2_len;
     GtkWidget *a2_phi;
     GtkWidget *phi;
-    GtkWidget *refine;
     GtkWidget *preset;
     gdouble xy[4];
     /* Correct (wanted) */
@@ -134,89 +131,81 @@ typedef struct {
     gulong recalculate_id;
 } AffcorControls;
 
-static gboolean   module_register          (void);
-static void       correct_affine           (GwyContainer *data,
-                                            GwyRunType run);
-static gint       affcor_dialog            (AffcorArgs *args,
-                                            GwyContainer *data,
-                                            GwyDataField *dfield,
-                                            gint id);
-static GtkWidget* make_lattice_table       (AffcorControls *controls);
-static GtkWidget* add_lattice_entry        (GtkTable *table,
-                                            const gchar *name,
-                                            gdouble value,
-                                            GwySensitivityGroup *sens,
-                                            guint flags,
-                                            gint *row,
-                                            GwySIValueFormat *vf);
-static gboolean   filter_acffield          (GwyContainer *data,
-                                            gint id,
-                                            gpointer user_data);
-static void       a1_changed_manually      (GtkEntry *entry,
-                                            AffcorControls *controls);
-static void       a2_changed_manually      (GtkEntry *entry,
-                                            AffcorControls *controls);
-static void       init_selection           (GwySelection *selection,
-                                            GwyDataField *dfield);
-static void       image_mode_changed       (GtkToggleButton *button,
-                                            AffcorControls *controls);
-static void       zoom_changed             (GtkRadioButton *button,
-                                            AffcorControls *controls);
-static void       preset_changed           (GtkComboBox *combo,
-                                            AffcorControls *controls);
-static void       a1_changed               (AffcorControls *controls,
-                                            GtkEntry *entry);
-static void       a2_changed               (AffcorControls *controls,
-                                            GtkEntry *entry);
-static void       phi_changed              (AffcorControls *controls,
-                                            GtkEntry *entry);
-static void       acffield_changed         (AffcorControls *controls,
-                                            GwyDataChooser *chooser);
-static void       calculate_acffield_full  (AffcorControls *controls,
-                                            GwyDataField *dfield);
-static void       calculate_acffield       (AffcorControls *controls);
-static void       different_lengths_toggled(AffcorControls *controls,
-                                            GtkToggleButton *toggle);
-static void       refine                   (AffcorControls *controls);
-static void       selection_changed        (AffcorControls *controls);
-static void       interp_changed           (GtkComboBox *combo,
-                                            AffcorControls *controls);
-static void       scaling_changed          (GtkComboBox *combo,
-                                            AffcorControls *controls);
-static void       invalidate               (AffcorControls *controls);
-static gboolean   recalculate              (gpointer user_data);
-static void       do_correction            (AffcorControls *controls);
-static void       corner_max               (gdouble x,
-                                            gdouble y,
-                                            const gdouble *m,
-                                            gdouble *vmax);
-static void       solve_transform_real     (const gdouble *a1a2,
-                                            const gdouble *a1a2_corr,
-                                            gdouble *m);
-static void       find_maximum             (GwyDataField *dfield,
-                                            gdouble *x,
-                                            gdouble *y,
-                                            gint xwinsize,
-                                            gint ywinsize);
-static void       matrix_vector            (gdouble *dest,
-                                            const gdouble *m,
-                                            const gdouble *src);
-static void       matrix_matrix            (gdouble *dest,
-                                            const gdouble *m,
-                                            const gdouble *src);
-static void       invert_matrix            (gdouble *dest,
-                                            const gdouble *src);
-static gdouble    matrix_det               (const gdouble *m);
-static void       affcor_load_args         (GwyContainer *container,
-                                            AffcorArgs *args);
-static void       affcor_save_args         (GwyContainer *container,
-                                            AffcorArgs *args);
-static void       affcor_sanitize_args     (AffcorArgs *args);
+static gboolean      module_register          (void);
+static void          correct_affine           (GwyContainer *data,
+                                               GwyRunType run);
+static gint          affcor_dialog            (AffcorArgs *args,
+                                               GwyContainer *data,
+                                               GwyDataField *dfield,
+                                               gint id,
+                                               gdouble *a1a2);
+static GtkWidget*    make_lattice_table       (AffcorControls *controls);
+static GtkWidget*    add_lattice_entry        (GtkTable *table,
+                                               const gchar *name,
+                                               gdouble value,
+                                               GwySensitivityGroup *sens,
+                                               guint flags,
+                                               gint *row,
+                                               GwySIValueFormat *vf);
+static gboolean      filter_acffield          (GwyContainer *data,
+                                               gint id,
+                                               gpointer user_data);
+static void          a1_changed_manually      (GtkEntry *entry,
+                                               AffcorControls *controls);
+static void          a2_changed_manually      (GtkEntry *entry,
+                                               AffcorControls *controls);
+static void          init_selection           (AffcorControls *controls);
+static void          image_mode_changed       (GtkToggleButton *button,
+                                               AffcorControls *controls);
+static void          zoom_changed             (GtkRadioButton *button,
+                                               AffcorControls *controls);
+static void          preset_changed           (GtkComboBox *combo,
+                                               AffcorControls *controls);
+static void          a1_changed               (AffcorControls *controls,
+                                               GtkEntry *entry);
+static void          a2_changed               (AffcorControls *controls,
+                                               GtkEntry *entry);
+static void          phi_changed              (AffcorControls *controls,
+                                               GtkEntry *entry);
+static void          acffield_changed         (AffcorControls *controls,
+                                               GwyDataChooser *chooser);
+static void          calculate_acffield_full  (AffcorControls *controls,
+                                               GwyDataField *dfield);
+static GwyDataField* get_full_acffield        (AffcorControls *controls);
+static void          calculate_acffield       (AffcorControls *controls);
+static void          different_lengths_changed(AffcorControls *controls,
+                                               GtkToggleButton *toggle);
+static void          distribute_changed       (AffcorControls *controls,
+                                               GtkToggleButton *toggle);
+static void          fix_hacf_changed         (AffcorControls *controls,
+                                               GtkToggleButton *toggle);
+static void          refine                   (AffcorControls *controls);
+static void          do_estimate              (AffcorControls *controls);
+static void          selection_changed        (AffcorControls *controls);
+static void          interp_changed           (GtkComboBox *combo,
+                                               AffcorControls *controls);
+static void          scaling_changed          (GtkComboBox *combo,
+                                               AffcorControls *controls);
+static void          invalidate               (AffcorControls *controls);
+static gboolean      recalculate              (gpointer user_data);
+static void          do_correction            (AffcorControls *controls);
+static void          fill_correct_vectors     (const AffcorArgs *args,
+                                               gdouble *a1a2);
+static GwyDataField* create_corrected_dfield  (GwyDataField *dfield,
+                                               const gdouble *a1a2,
+                                               gdouble *a1a2_corr,
+                                               GwyInterpolationType interp,
+                                               GwyAffineScalingType scaling);
+static void          affcor_load_args         (GwyContainer *container,
+                                               AffcorArgs *args);
+static void          affcor_save_args         (GwyContainer *container,
+                                               AffcorArgs *args);
+static void          affcor_sanitize_args     (AffcorArgs *args);
 
 static const AffcorArgs affcor_defaults = {
     1.0, 1.0, 90.0, FALSE,
-    TRUE,
-    GWY_INTERPOLATION_LINEAR, SCALING_AS_GIVEN,
+    FALSE, FALSE,
+    GWY_INTERPOLATION_LINEAR, GWY_AFFINE_SCALING_AS_GIVEN,
     -1,
     ZOOM_1, IMAGE_DATA,
 };
@@ -231,12 +220,12 @@ static GwyModuleInfo module_info = {
     N_("Corrects affine distortion of images by matching image Bravais "
        "lattice to the true one."),
     "Yeti <yeti at gwyddion.net>",
-    "1.6",
+    "2.0",
     "David Nečas (Yeti)",
     "2013",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, correct_affine)
 
 static gboolean
 module_register(void)
@@ -255,9 +244,19 @@ module_register(void)
 static void
 correct_affine(GwyContainer *data, GwyRunType run)
 {
+    const guint compat_flags = (GWY_DATA_COMPATIBILITY_RES
+                                | GWY_DATA_COMPATIBILITY_REAL
+                                | GWY_DATA_COMPATIBILITY_LATERAL);
     AffcorArgs args;
-    GwyDataField *dfield;
-    gint id, newid;
+    GwyDataField *dfield, *ofield, *corrected;
+    gint id, newid, corrid;
+    gint *all_channels;
+    gdouble a1a2_corr[4], a1a2[4];
+    GType type;
+    GwySelection *selection;
+    gchar *s, *t;
+    GQuark quark;
+    guint i;
 
     g_return_if_fail(run & AFFINE_RUN_MODES);
     g_return_if_fail(g_type_from_name("GwyLayerLattice"));
@@ -267,17 +266,63 @@ correct_affine(GwyContainer *data, GwyRunType run)
                                      0);
     g_return_if_fail(dfield);
 
-    newid = affcor_dialog(&args, data, dfield, id);
+    newid = affcor_dialog(&args, data, dfield, id, a1a2);
     affcor_save_args(gwy_app_settings_get(), &args);
-    if (newid != -1)
-        gwy_app_channel_log_add_proc(data, id, newid);
+    if (newid == -1)
+        return;
+
+    gwy_app_channel_log_add_proc(data, id, newid);
+
+    if (!args.distribute)
+        return;
+
+    all_channels = gwy_app_data_browser_get_data_ids(data);
+    type = g_type_from_name("GwySelectionLattice");
+    for (i = 0; all_channels[i] != -1; i++) {
+        if (all_channels[i] == id || all_channels[i] == newid)
+            continue;
+
+        quark = gwy_app_get_data_key_for_id(all_channels[i]);
+        ofield = gwy_container_get_object(data, quark);
+        if (gwy_data_field_check_compatibility(dfield, ofield, compat_flags))
+            continue;
+
+        fill_correct_vectors(&args, a1a2_corr);
+        corrected = create_corrected_dfield(ofield, a1a2, a1a2_corr,
+                                            args.interp, args.scaling);
+        corrid = gwy_app_data_browser_add_data_field(corrected, data, FALSE);
+        gwy_app_sync_data_items(data, data, all_channels[i], corrid, FALSE,
+                                GWY_DATA_ITEM_RANGE_TYPE,
+                                GWY_DATA_ITEM_RANGE,
+                                GWY_DATA_ITEM_GRADIENT,
+                                0);
+        g_object_unref(corrected);
+
+        selection = g_object_newv(type, 0, NULL);
+        gwy_selection_set_data(selection, 1, a1a2_corr);
+        s = g_strdup_printf("/%d/select/lattice", corrid);
+        gwy_container_set_object_by_name(data, s, selection);
+        g_object_unref(selection);
+        g_free(s);
+
+        s = gwy_app_get_data_field_title(data, all_channels[i]);
+        t = g_strconcat(s, " ", _("Corrected"), NULL);
+        quark = gwy_app_get_data_title_key_for_id(corrid);
+        gwy_container_set_string(data, quark, (const guchar*)t);
+        g_free(s);
+
+        gwy_app_channel_log_add_proc(data, all_channels[i], corrid);
+    }
+
+    g_free(all_channels);
 }
 
 static gint
 affcor_dialog(AffcorArgs *args,
               GwyContainer *data,
               GwyDataField *dfield,
-              gint id)
+              gint id,
+              gdouble *a1a2)
 {
     GtkWidget *hbox, *hbox2, *label, *button, *lattable, *alignment;
     GtkDialog *dialog;
@@ -288,8 +333,8 @@ affcor_dialog(AffcorArgs *args,
     gint response, row, newid = -1;
     GObject *selection;
     gchar selkey[40];
-    GwySIUnit *unitphi;
     guint flags;
+    gchar *s, *t;
 
     gwy_clear(&controls, 1);
     controls.args = args;
@@ -299,6 +344,9 @@ affcor_dialog(AffcorArgs *args,
                                                   NULL, 0, NULL);
     dialog = GTK_DIALOG(controls.dialog);
     gtk_dialog_add_button(dialog, _("_Reset"), RESPONSE_RESET);
+    gtk_dialog_add_button(dialog, gwy_sgettext("verb|_Estimate"),
+                          RESPONSE_ESTIMATE);
+    gtk_dialog_add_button(dialog, _("_Refine"), RESPONSE_REFINE);
     gtk_dialog_add_button(dialog, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
     button = gtk_dialog_add_button(dialog, GTK_STOCK_OK, GTK_RESPONSE_OK);
     gtk_dialog_set_default_response(dialog, GTK_RESPONSE_OK);
@@ -341,16 +389,16 @@ affcor_dialog(AffcorArgs *args,
 
     gtk_container_add(GTK_CONTAINER(alignment), controls.view);
 
-    table = GTK_TABLE(gtk_table_new(17, 4, FALSE));
+    table = GTK_TABLE(gtk_table_new(20, 4, FALSE));
     gtk_table_set_row_spacings(table, 2);
     gtk_table_set_col_spacings(table, 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
-    gtk_box_pack_end(GTK_BOX(hbox), GTK_WIDGET(table), FALSE, FALSE, 0);
+    gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(table), TRUE, TRUE, 0);
     row = 0;
 
     label = gwy_label_new_header(_("Preview Options"));
     gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     row++;
 
     label = gtk_label_new(_("Display:"));
@@ -373,7 +421,7 @@ affcor_dialog(AffcorArgs *args,
 
     hbox2 = gtk_hbox_new(FALSE, 8);
     gtk_table_attach(GTK_TABLE(table), hbox2, 0, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     label = gtk_label_new(_("ACF zoom:"));
     gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
 
@@ -390,6 +438,16 @@ affcor_dialog(AffcorArgs *args,
     }
     row++;
 
+    controls.fix_hacf
+        = gtk_check_button_new_with_mnemonic(_("Interpolate _horizontal ACF"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.fix_hacf),
+                                 args->fix_hacf);
+    gtk_table_attach(table, controls.fix_hacf,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    g_signal_connect_swapped(controls.fix_hacf, "toggled",
+                             G_CALLBACK(fix_hacf_changed), &controls);
+    row++;
+
     gtk_table_set_row_spacing(table, row-1, 8);
     label = gwy_label_new_header(_("Lattice Vectors"));
     gtk_table_attach(table, label, 0, 5, row, row+1, GTK_FILL, 0, 0, 0);
@@ -400,18 +458,10 @@ affcor_dialog(AffcorArgs *args,
                                              GWY_SI_UNIT_FORMAT_MARKUP, NULL);
     controls.vf->precision += 2;
 
-    unitphi = gwy_si_unit_new("deg");
-    controls.vfphi
-        = gwy_si_unit_get_format_with_resolution(unitphi,
-                                                 GWY_SI_UNIT_FORMAT_MARKUP,
-                                                 180.0, 0.01, NULL);
-    g_object_unref(unitphi);
+    controls.vfphi = gwy_si_unit_value_format_new(G_PI/180.0, 2, _("deg"));
 
     lattable = make_lattice_table(&controls);
-    gtk_table_attach(table, lattable,
-                     0, 5, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    g_signal_connect_swapped(controls.refine, "clicked",
-                             G_CALLBACK(refine), &controls);
+    gtk_table_attach(table, lattable, 0, 5, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_table_set_row_spacing(table, row, 8);
     row++;
 
@@ -431,7 +481,7 @@ affcor_dialog(AffcorArgs *args,
                                   "HOPG", 0,
                                   NULL);
     gtk_table_attach(table, controls.preset,
-                     2, 5, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     2, 5, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.preset);
     row++;
 
@@ -450,7 +500,7 @@ affcor_dialog(AffcorArgs *args,
     gtk_table_attach(table, controls.different_lengths,
                      3, 5, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.different_lengths, "toggled",
-                             G_CALLBACK(different_lengths_toggled), &controls);
+                             G_CALLBACK(different_lengths_changed), &controls);
 
     controls.a2_corr = add_lattice_entry(table, "a<sub>2</sub>:", args->a2,
                                          controls.sens,
@@ -460,7 +510,7 @@ affcor_dialog(AffcorArgs *args,
     g_signal_connect_swapped(controls.a2_corr, "changed",
                              G_CALLBACK(a2_changed), &controls);
 
-    controls.phi_corr = add_lattice_entry(table, "ϕ:", args->phi*180.0/G_PI,
+    controls.phi_corr = add_lattice_entry(table, "ϕ:", args->phi,
                                           controls.sens, SENS_USER_LATTICE,
                                           &row, controls.vfphi);
     g_signal_connect_swapped(controls.phi_corr, "changed",
@@ -495,7 +545,7 @@ affcor_dialog(AffcorArgs *args,
                                  args->interp, TRUE);
     gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.interp);
     gtk_table_attach(table, controls.interp,
-                     2, 5, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     2, 5, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     label = gtk_label_new_with_mnemonic(_("_Scaling:"));
@@ -505,13 +555,27 @@ affcor_dialog(AffcorArgs *args,
     controls.scaling
         = gwy_enum_combo_box_newl(G_CALLBACK(scaling_changed), &controls,
                                   args->scaling,
-                                  _("Exactly as specified"), SCALING_AS_GIVEN,
-                                  _("Preserve area"), SCALING_PRESERVE_AREA,
-                                  _("Preserve X scale"), SCALING_PRESERVE_X,
+                                  _("Exactly as specified"),
+                                  GWY_AFFINE_SCALING_AS_GIVEN,
+                                  _("Preserve area"),
+                                  GWY_AFFINE_SCALING_PRESERVE_AREA,
+                                  _("Preserve X scale"),
+                                  GWY_AFFINE_SCALING_PRESERVE_X,
                                   NULL);
     gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.scaling);
     gtk_table_attach(table, controls.scaling,
-                     2, 5, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     2, 5, row, row+1, GTK_FILL, 0, 0, 0);
+    row++;
+
+    controls.distribute
+        = gtk_check_button_new_with_mnemonic(_("_Apply to all "
+                                               "compatible images"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.distribute),
+                                 args->distribute);
+    gtk_table_attach(table, controls.distribute,
+                     0, 4, row, row+1, GTK_FILL, 0, 0, 0);
+    g_signal_connect_swapped(controls.distribute, "toggled",
+                             G_CALLBACK(distribute_changed), &controls);
     row++;
 
     g_snprintf(selkey, sizeof(selkey), "/%d/select/lattice", id);
@@ -519,10 +583,9 @@ affcor_dialog(AffcorArgs *args,
         && gwy_selection_get_data(GWY_SELECTION(selection), NULL) == 1)
         gwy_serializable_clone(selection, G_OBJECT(controls.selection));
     else
-        init_selection(controls.selection, dfield);
+        do_estimate(&controls);
 
-    controls.selection_corr
-        = GWY_SELECTION(gwy_serializable_duplicate(G_OBJECT(controls.selection)));
+    controls.selection_corr = gwy_selection_duplicate(controls.selection);
 
     flags = args->different_lengths ? SENS_DIFFERENT_LENGTHS : 0;
     gwy_sensitivity_group_set_state(controls.sens,
@@ -544,7 +607,15 @@ affcor_dialog(AffcorArgs *args,
             break;
 
             case RESPONSE_RESET:
-            init_selection(controls.selection, dfield);
+            init_selection(&controls);
+            break;
+
+            case RESPONSE_ESTIMATE:
+            do_estimate(&controls);
+            break;
+
+            case RESPONSE_REFINE:
+            refine(&controls);
             break;
 
             default:
@@ -556,9 +627,14 @@ affcor_dialog(AffcorArgs *args,
     if (!controls.calculated)
         do_correction(&controls);
 
+    gwy_selection_get_object(controls.selection, 0, a1a2);
     corrected = gwy_container_get_object_by_name(controls.mydata, "/2/data");
     newid = gwy_app_data_browser_add_data_field(corrected, data, TRUE);
-    gwy_app_set_data_field_title(data, newid, _("Corrected"));
+    s = gwy_app_get_data_field_title(data, id);
+    t = g_strconcat(s, " ", _("Corrected"), NULL);
+    gwy_container_set_string(data, gwy_app_get_data_title_key_for_id(newid),
+                             (const guchar*)t);
+    g_free(s);
     gwy_app_sync_data_items(data, data, id, newid, FALSE,
                             GWY_DATA_ITEM_RANGE_TYPE,
                             GWY_DATA_ITEM_RANGE,
@@ -592,7 +668,7 @@ finalize:
 static GtkWidget*
 make_lattice_table(AffcorControls *controls)
 {
-    GtkWidget *table, *label, *button, *entry;
+    GtkWidget *table, *label, *entry;
     GString *str = g_string_new(NULL);
 
     table = gtk_table_new(4, 5, FALSE);
@@ -638,7 +714,8 @@ make_lattice_table(AffcorControls *controls)
     gtk_entry_set_width_chars(GTK_ENTRY(entry), 8);
     g_object_set_data(G_OBJECT(entry), "id", (gpointer)"x");
     gwy_widget_set_activate_on_unfocus(entry, TRUE);
-    gtk_table_attach(GTK_TABLE(table), entry, 1, 2, 1, 2, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), entry, 1, 2, 1, 2,
+                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
     g_signal_connect(entry, "activate",
                      G_CALLBACK(a1_changed_manually), controls);
 
@@ -646,7 +723,8 @@ make_lattice_table(AffcorControls *controls)
     gtk_entry_set_width_chars(GTK_ENTRY(entry), 8);
     g_object_set_data(G_OBJECT(entry), "id", (gpointer)"y");
     gwy_widget_set_activate_on_unfocus(entry, TRUE);
-    gtk_table_attach(GTK_TABLE(table), entry, 2, 3, 1, 2, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), entry, 2, 3, 1, 2,
+                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
     g_signal_connect(entry, "activate",
                      G_CALLBACK(a1_changed_manually), controls);
 
@@ -654,7 +732,8 @@ make_lattice_table(AffcorControls *controls)
     gtk_entry_set_width_chars(GTK_ENTRY(entry), 8);
     g_object_set_data(G_OBJECT(entry), "id", (gpointer)"len");
     gwy_widget_set_activate_on_unfocus(entry, TRUE);
-    gtk_table_attach(GTK_TABLE(table), entry, 3, 4, 1, 2, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), entry, 3, 4, 1, 2,
+                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
     g_signal_connect(entry, "activate",
                      G_CALLBACK(a1_changed_manually), controls);
 
@@ -662,7 +741,8 @@ make_lattice_table(AffcorControls *controls)
     gtk_entry_set_width_chars(GTK_ENTRY(entry), 8);
     g_object_set_data(G_OBJECT(entry), "id", (gpointer)"phi");
     gwy_widget_set_activate_on_unfocus(entry, TRUE);
-    gtk_table_attach(GTK_TABLE(table), entry, 4, 5, 1, 2, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), entry, 4, 5, 1, 2,
+                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
     g_signal_connect(entry, "activate",
                      G_CALLBACK(a1_changed_manually), controls);
 
@@ -676,7 +756,8 @@ make_lattice_table(AffcorControls *controls)
     gtk_entry_set_width_chars(GTK_ENTRY(entry), 8);
     g_object_set_data(G_OBJECT(entry), "id", (gpointer)"x");
     gwy_widget_set_activate_on_unfocus(entry, TRUE);
-    gtk_table_attach(GTK_TABLE(table), entry, 1, 2, 2, 3, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), entry, 1, 2, 2, 3,
+                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
     g_signal_connect(entry, "activate",
                      G_CALLBACK(a2_changed_manually), controls);
 
@@ -684,7 +765,8 @@ make_lattice_table(AffcorControls *controls)
     gtk_entry_set_width_chars(GTK_ENTRY(entry), 8);
     g_object_set_data(G_OBJECT(entry), "id", (gpointer)"y");
     gwy_widget_set_activate_on_unfocus(entry, TRUE);
-    gtk_table_attach(GTK_TABLE(table), entry, 2, 3, 2, 3, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), entry, 2, 3, 2, 3,
+                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
     g_signal_connect(entry, "activate",
                      G_CALLBACK(a2_changed_manually), controls);
 
@@ -692,7 +774,8 @@ make_lattice_table(AffcorControls *controls)
     gtk_entry_set_width_chars(GTK_ENTRY(entry), 8);
     g_object_set_data(G_OBJECT(entry), "id", (gpointer)"len");
     gwy_widget_set_activate_on_unfocus(entry, TRUE);
-    gtk_table_attach(GTK_TABLE(table), entry, 3, 4, 2, 3, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), entry, 3, 4, 2, 3,
+                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
     g_signal_connect(entry, "activate",
                      G_CALLBACK(a2_changed_manually), controls);
 
@@ -700,7 +783,8 @@ make_lattice_table(AffcorControls *controls)
     gtk_entry_set_width_chars(GTK_ENTRY(entry), 8);
     g_object_set_data(G_OBJECT(entry), "id", (gpointer)"phi");
     gwy_widget_set_activate_on_unfocus(entry, TRUE);
-    gtk_table_attach(GTK_TABLE(table), entry, 4, 5, 2, 3, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), entry, 4, 5, 2, 3,
+                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
     g_signal_connect(entry, "activate",
                      G_CALLBACK(a2_changed_manually), controls);
 
@@ -714,10 +798,6 @@ make_lattice_table(AffcorControls *controls)
     gtk_misc_set_alignment(GTK_MISC(label), .0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label, 4, 5, 3, 4, GTK_FILL, 0, 0, 0);
 
-    controls->refine = button = gtk_button_new_with_mnemonic(_("Re_fine"));
-    gtk_table_attach(GTK_TABLE(table), button,
-                     0, 3, 3, 4, GTK_FILL, 0, 0, 0);
-
     g_string_free(str, TRUE);
 
     return table;
@@ -753,7 +833,7 @@ add_lattice_entry(GtkTable *table,
     gtk_entry_set_width_chars(GTK_ENTRY(entry), 6);
     g_free(buf);
     gtk_table_attach(table, entry,
-                     1, 2, *row, *row+1, GTK_FILL, 0, 0, 0);
+                     1, 2, *row, *row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
     gwy_sensitivity_group_add_widget(sens, entry, flags);
 
     (*row)++;
@@ -863,14 +943,15 @@ a2_changed_manually(GtkEntry *entry,
 }
 
 static void
-init_selection(GwySelection *selection,
-               GwyDataField *dfield)
+init_selection(AffcorControls *controls)
 {
+    GwyDataField *dfield;
     gdouble xy[4] = { 0.0, 0.0, 0.0, 0.0 };
 
+    dfield = gwy_container_get_object_by_name(controls->mydata, "/0/data");
     xy[0] = dfield->xreal/20;
     xy[3] = -dfield->yreal/20;
-    gwy_selection_set_data(selection, 1, xy);
+    gwy_selection_set_data(controls->selection, 1, xy);
 }
 
 static void
@@ -966,7 +1047,7 @@ preset_changed(GtkComboBox *combo,
     gtk_entry_set_text(GTK_ENTRY(controls->a1_corr), str->str);
     g_string_printf(str, "%g", preset->a2/controls->vf->magnitude);
     gtk_entry_set_text(GTK_ENTRY(controls->a2_corr), str->str);
-    g_string_printf(str, "%g", preset->phi/G_PI*180.0/controls->vfphi->magnitude);
+    g_string_printf(str, "%g", preset->phi/controls->vfphi->magnitude);
     gtk_entry_set_text(GTK_ENTRY(controls->phi_corr), str->str);
     g_string_free(str, TRUE);
 
@@ -982,7 +1063,7 @@ a1_changed(AffcorControls *controls,
     guint flags;
 
     buf = gtk_entry_get_text(entry);
-    args->a1 = g_strtod(buf, NULL);
+    args->a1 = g_strtod(buf, NULL) * controls->vf->magnitude;
     if (args->a1 > 0.0)
         controls->invalid_corr &= ~INVALID_A1;
     else
@@ -1005,7 +1086,7 @@ a2_changed(AffcorControls *controls,
     guint flags;
 
     buf = gtk_entry_get_text(entry);
-    args->a2 = g_strtod(buf, NULL);
+    args->a2 = g_strtod(buf, NULL) * controls->vf->magnitude;
     if (args->a2 > 0.0)
         controls->invalid_corr &= ~INVALID_A2;
     else
@@ -1054,7 +1135,8 @@ static void
 calculate_acffield_full(AffcorControls *controls,
                         GwyDataField *dfield)
 {
-    GwyDataField *acf;
+    GwyDataField *acf, *mid, *mask;
+    GwyDataLine *hacf;
     guint acfwidth, acfheight;
 
     dfield = gwy_data_field_duplicate(dfield);
@@ -1068,22 +1150,68 @@ calculate_acffield_full(AffcorControls *controls,
     gwy_container_set_object_by_name(controls->mydata, "/1/data/full", acf);
     g_object_unref(acf);
 
+    /* Remember the middle row as we may replace it. */
+    acfheight = gwy_data_field_get_yres(acf);
+    acfwidth = gwy_data_field_get_xres(acf);
+    hacf = gwy_data_line_new(acfwidth, 1.0, FALSE);
+    gwy_data_field_get_row(acf, hacf, acfheight/2);
+    gwy_container_set_object_by_name(controls->mydata, "/1/hacf", hacf);
+    g_object_unref(hacf);
+
+    /* Remember interpolated middle row. */
+    mid = gwy_data_field_area_extract(acf, 0, acfheight/2-1, acfwidth, 3);
+    mask = gwy_data_field_new(acfwidth, 3, acfwidth, 3, TRUE);
+    gwy_data_field_area_fill(mask, 0, 1, acfwidth, 1, 1.0);
+    gwy_data_field_set_val(mask, acfwidth/2, 1, 0.0);
+    gwy_data_field_laplace_solve(mid, mask, -1, 1.0);
+    hacf = gwy_data_line_new(acfwidth, 1.0, FALSE);
+    gwy_data_field_get_row(mid, hacf, 1);
+    gwy_container_set_object_by_name(controls->mydata, "/1/hacf-fixed", hacf);
+    g_object_unref(hacf);
+    g_object_unref(mask);
+    g_object_unref(mid);
+
     calculate_acffield(controls);
 }
 
+static GwyDataField*
+get_full_acffield(AffcorControls *controls)
+{
+    GwyDataField *acf;
+    GwyDataLine *hacf;
+    guint yres;
+    const gchar *key;
+
+    acf = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata,
+                                                          "/1/data/full"));
+    yres = gwy_data_field_get_yres(acf);
+
+    if (controls->args->fix_hacf)
+        key = "/1/hacf-fixed";
+    else
+        key = "/1/hacf";
+
+    hacf = GWY_DATA_LINE(gwy_container_get_object_by_name(controls->mydata,
+                                                          key));
+    gwy_data_field_set_row(acf, hacf, yres/2);
+
+    return acf;
+}
+
 static void
 calculate_acffield(AffcorControls *controls)
 {
     ZoomType zoom = controls->args->zoom;
     GwyDataField *acf;
+    guint xres, yres, width, height;
+
+    acf = get_full_acffield(controls);
+    xres = gwy_data_field_get_xres(acf);
+    yres = gwy_data_field_get_yres(acf);
 
-    acf = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata,
-                                                          "/1/data/full"));
     if (zoom != ZOOM_1) {
-        guint xres = acf->xres;
-        guint yres = acf->yres;
-        guint width = (xres/zoom) | 1;
-        guint height = (yres/zoom) | 1;
+        width = (xres/zoom) | 1;
+        height = (yres/zoom) | 1;
 
         if (width < 17)
             width = MAX(width, MIN(17, xres));
@@ -1098,13 +1226,14 @@ calculate_acffield(AffcorControls *controls)
         gwy_data_field_set_yoffset(acf, -0.5*acf->yreal);
     }
     gwy_container_set_object_by_name(controls->mydata, "/1/data", acf);
+    gwy_data_field_data_changed(acf);
 
     if (controls->args->image_mode == IMAGE_ACF)
         gwy_set_data_preview_size(GWY_DATA_VIEW(controls->view), PREVIEW_SIZE);
 }
 
 static void
-different_lengths_toggled(AffcorControls *controls,
+different_lengths_changed(AffcorControls *controls,
                           GtkToggleButton *toggle)
 {
     AffcorArgs *args = controls->args;
@@ -1121,34 +1250,49 @@ different_lengths_toggled(AffcorControls *controls,
 }
 
 static void
+distribute_changed(AffcorControls *controls,
+                   GtkToggleButton *toggle)
+{
+    AffcorArgs *args = controls->args;
+
+    args->distribute = gtk_toggle_button_get_active(toggle);
+}
+
+static void
+fix_hacf_changed(AffcorControls *controls,
+                 GtkToggleButton *toggle)
+{
+    AffcorArgs *args = controls->args;
+
+    args->fix_hacf = gtk_toggle_button_get_active(toggle);
+    calculate_acffield(controls);
+}
+
+static void
 refine(AffcorControls *controls)
 {
     GwyDataField *acf;
-    gint xwinsize, ywinsize;
     gdouble xy[4];
 
     if (!gwy_selection_get_object(controls->selection, 0, xy))
         return;
 
-    acf = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata,
-                                                          "/1/data"));
-    xwinsize = (gint)(0.32*MAX(fabs(xy[0]), fabs(xy[2]))
-                      /gwy_data_field_get_xmeasure(acf) + 0.5);
-    ywinsize = (gint)(0.32*MAX(fabs(xy[1]), fabs(xy[3]))
-                      /gwy_data_field_get_ymeasure(acf) + 0.5);
-    gwy_debug("window size: %dx%d", xwinsize, ywinsize);
-
-    xy[0] = (xy[0] - acf->xoff)/gwy_data_field_get_xmeasure(acf);
-    xy[1] = (xy[1] - acf->yoff)/gwy_data_field_get_ymeasure(acf);
-    xy[2] = (xy[2] - acf->xoff)/gwy_data_field_get_xmeasure(acf);
-    xy[3] = (xy[3] - acf->yoff)/gwy_data_field_get_ymeasure(acf);
-    find_maximum(acf, xy + 0, xy + 1, xwinsize, ywinsize);
-    find_maximum(acf, xy + 2, xy + 3, xwinsize, ywinsize);
-    xy[0] = (xy[0] + 0.5)*gwy_data_field_get_xmeasure(acf) + acf->xoff;
-    xy[1] = (xy[1] + 0.5)*gwy_data_field_get_ymeasure(acf) + acf->yoff;
-    xy[2] = (xy[2] + 0.5)*gwy_data_field_get_xmeasure(acf) + acf->xoff;
-    xy[3] = (xy[3] + 0.5)*gwy_data_field_get_ymeasure(acf) + acf->yoff;
-    gwy_selection_set_object(controls->selection, 0, xy);
+    acf = get_full_acffield(controls);
+    if (gwy_data_field_measure_lattice_psdf(acf, xy))
+        gwy_selection_set_object(controls->selection, 0, xy);
+}
+
+static void
+do_estimate(AffcorControls *controls)
+{
+    GwyDataField *acf;
+
+    acf = get_full_acffield(controls);
+    gwy_clear(controls->xy, 4);
+    if (gwy_data_field_measure_lattice_acf(acf, controls->xy))
+        gwy_selection_set_object(controls->selection, 0, controls->xy);
+    else
+        init_selection(controls);
 }
 
 static void
@@ -1185,7 +1329,7 @@ selection_changed(AffcorControls *controls)
 
     vf = controls->vfphi;
     phi1 = atan2(-xy[1], xy[0]);
-    g_string_printf(str, "%.*f", vf->precision, 180.0/G_PI*phi1/vf->magnitude);
+    g_string_printf(str, "%.*f", vf->precision, phi1/vf->magnitude);
     gtk_entry_set_text(GTK_ENTRY(controls->a1_phi), str->str);
 
     vf = controls->vf;
@@ -1201,13 +1345,13 @@ selection_changed(AffcorControls *controls)
 
     vf = controls->vfphi;
     phi2 = atan2(-xy[3], xy[2]);
-    g_string_printf(str, "%.*f", vf->precision, 180.0/G_PI*phi2/vf->magnitude);
+    g_string_printf(str, "%.*f", vf->precision, phi2/vf->magnitude);
     gtk_entry_set_text(GTK_ENTRY(controls->a2_phi), str->str);
 
     phi = phi2 - phi1;
     if (phi < 0.0)
         phi += 2.0*G_PI;
-    g_string_printf(str, "%.*f", vf->precision, 180.0/G_PI*phi/vf->magnitude);
+    g_string_printf(str, "%.*f", vf->precision, phi/vf->magnitude);
     gtk_label_set_text(GTK_LABEL(controls->phi), str->str);
 
     g_string_free(str, TRUE);
@@ -1273,255 +1417,62 @@ do_correction(AffcorControls *controls)
 {
     AffcorArgs *args = controls->args;
     GwyDataField *dfield, *corrected;
-    gdouble dx, dy, q = 1.0;
-    gdouble a1a2_corr[4], a1a2[4], m[6], vmax[2], tmp[4];
-    guint xres, yres, i;
-
-    gwy_selection_get_object(controls->selection, 0, a1a2);
-    gwy_debug("a1a2 %g %g %g %g", a1a2[0], a1a2[1], a1a2[2], a1a2[3]);
-    a1a2_corr[0] = args->a1 * controls->vf->magnitude;
-    a1a2_corr[1] = 0.0;
-    a1a2_corr[2] = args->a2 * controls->vf->magnitude * cos(args->phi);
-    a1a2_corr[3] = -args->a2 * controls->vf->magnitude * sin(args->phi);
-    gwy_debug("a1a2_corr %g %g %g %g",
-              a1a2_corr[0], a1a2_corr[1], a1a2_corr[2], a1a2_corr[3]);
-    /* This is an approximate rotation correction to get the base more or less
-     * oriented in the plane as expected and not upside down. */
-    if (args->avoid_rotation) {
-        gdouble alpha = atan2(-a1a2[1], a1a2[0]);
-        tmp[0] = tmp[3] = cos(alpha);
-        tmp[1] = sin(alpha);
-        tmp[2] = -sin(alpha);
-        matrix_vector(a1a2_corr, tmp, a1a2_corr);
-        matrix_vector(a1a2_corr + 2, tmp, a1a2_corr + 2);
-    }
-    solve_transform_real(a1a2, a1a2_corr, m);
-    gwy_debug("m %g %g %g %g", m[0], m[1], m[2], m[3]);
-
-    /* This is the exact rotation correction. */
-    if (args->avoid_rotation) {
-        gdouble alpha = atan2(m[2], m[0]);
-        tmp[0] = tmp[3] = cos(alpha);
-        tmp[1] = sin(alpha);
-        tmp[2] = -sin(alpha);
-        matrix_matrix(m, tmp, m);
-    }
-
-    if (args->scaling == SCALING_PRESERVE_AREA)
-        q = 1.0/sqrt(matrix_det(m));
-    else if (args->scaling == SCALING_PRESERVE_X)
-        q = 1.0/hypot(m[0], m[2]);
-
-    for (i = 0; i < 4; i++) {
-        m[i] *= q;
-        /* To create the corrected lattice selection on result. */
-        a1a2_corr[i] *= q;
-    }
-
-    /* Now save the corrected lattice selection on result. */
-    gwy_selection_set_data(controls->selection_corr, 1, a1a2_corr);
+    gdouble a1a2_corr[4], a1a2[4];
 
     dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata,
                                                              "/0/data"));
-
-    vmax[0] = vmax[1] = 0.0;
-    corner_max(dfield->xreal, dfield->yreal, m, vmax);
-    corner_max(-dfield->xreal, dfield->yreal, m, vmax);
-    corner_max(dfield->xreal, -dfield->yreal, m, vmax);
-    corner_max(-dfield->xreal, -dfield->yreal, m, vmax);
-
-    /* Prevent information loss by using a sufficient resolution to represent
-     * original pixels. */
-    tmp[0] = gwy_data_field_get_xmeasure(dfield);
-    tmp[1] = tmp[2] = 0.0;
-    tmp[3] = gwy_data_field_get_ymeasure(dfield);
-    gwy_debug("dxdy %g %g", tmp[0], tmp[3]);
-    matrix_matrix(tmp, m, tmp);
-    gwy_debug("pix_corr %g %g %g %g", tmp[0], tmp[1], tmp[2], tmp[3]);
-    dx = hypot(tmp[0]/G_SQRT2, tmp[1]/G_SQRT2);
-    dy = hypot(tmp[2]/G_SQRT2, tmp[3]/G_SQRT2);
-    dx = dy = MIN(dx, dy);
-    xres = GWY_ROUND(vmax[0]/dx);
-    yres = GWY_ROUND(vmax[1]/dy);
-    gwy_debug("dxdy_corr %g %g", dx, dy);
-    gwy_debug("res %u %u", xres, yres);
-
-    corrected = gwy_data_field_new(xres, yres, dx*xres, dy*yres, FALSE);
-    gwy_serializable_clone(G_OBJECT(gwy_data_field_get_si_unit_xy(dfield)),
-                           G_OBJECT(gwy_data_field_get_si_unit_xy(corrected)));
-    gwy_serializable_clone(G_OBJECT(gwy_data_field_get_si_unit_z(dfield)),
-                           G_OBJECT(gwy_data_field_get_si_unit_z(corrected)));
-
-    invert_matrix(m, m);
-    gwy_debug("minv %g %g %g %g", m[0], m[1], m[2], m[3]);
-
-    /* Multiply from right by pixel-to-real matrix in the corrected field. */
-    tmp[0] = gwy_data_field_get_xmeasure(corrected);
-    tmp[1] = tmp[2] = 0.0;
-    tmp[3] = gwy_data_field_get_ymeasure(corrected);
-    matrix_matrix(m, m, tmp);
-    /* and from left by real-to-pixel matrix in the original field. */
-    tmp[0] = 1.0/gwy_data_field_get_xmeasure(dfield);
-    tmp[1] = tmp[2] = 0.0;
-    tmp[3] = 1.0/gwy_data_field_get_ymeasure(dfield);
-    matrix_matrix(m, tmp, m);
-    gwy_debug("minvpix %g %g %g %g", m[0], m[1], m[2], m[3]);
-
-    m[4] = 0.5*corrected->xres;
-    m[5] = 0.5*corrected->yres;
-    matrix_vector(m + 4, m, m + 4);
-    m[4] = 0.5*dfield->xres - m[4];
-    m[5] = 0.5*dfield->yres - m[5];
-    gwy_debug("b %g %g", m[4], m[5]);
-    gwy_data_field_affine(dfield, corrected, m, controls->args->interp,
-                          GWY_EXTERIOR_FIXED_VALUE,
-                          gwy_data_field_get_avg(dfield));
-
+    gwy_selection_get_object(controls->selection, 0, a1a2);
+    fill_correct_vectors(args, a1a2_corr);
+    corrected = create_corrected_dfield(dfield, a1a2, a1a2_corr,
+                                        args->interp, args->scaling);
     gwy_container_set_object_by_name(controls->mydata, "/2/data", corrected);
     g_object_unref(corrected);
-    controls->calculated = TRUE;
-}
-
-static void
-corner_max(gdouble x, gdouble y, const gdouble *m, gdouble *vmax)
-{
-    gdouble v[2];
-
-    v[0] = x;
-    v[1] = y;
-    matrix_vector(v, m, v);
-    vmax[0] = MAX(vmax[0], fabs(v[0]));
-    vmax[1] = MAX(vmax[1], fabs(v[1]));
-}
-
-static void
-solve_transform_real(const gdouble *a1a2,
-                     const gdouble *a1a2_corr,
-                     gdouble *m)
-{
-    gdouble tmp[4];
-    tmp[0] = a1a2[0];
-    tmp[1] = a1a2[2];
-    tmp[2] = a1a2[1];
-    tmp[3] = a1a2[3];
-    invert_matrix(m, tmp);
-    tmp[0] = a1a2_corr[0];
-    tmp[1] = a1a2_corr[2];
-    tmp[2] = a1a2_corr[1];
-    tmp[3] = a1a2_corr[3];
-    matrix_matrix(m, tmp, m);
-}
-
-static void
-find_maximum(GwyDataField *dfield,
-             gdouble *x, gdouble *y,
-             gint xwinsize, gint ywinsize)
-{
-    gint xj = (gint)*x, yi = (gint)*y;
-    gdouble v, max = -G_MAXDOUBLE;
-    gint mi = yi, mj = xj, i, j;
-    gint xres = dfield->xres, yres = dfield->yres;
-    const gdouble *d = dfield->data;
-    gdouble z[9];
-
-    gwy_debug("searching from: %g, %g", *x, *y);
-    for (i = -ywinsize; i <= ywinsize; i++) {
-        if (i + yi < 0 || i + yi > yres-1)
-            continue;
-        for (j = -xwinsize; j <= xwinsize; j++) {
-            if (j + xj < 0 || j + xj > xres-1)
-                continue;
-
-            v = d[(i + yi)*xres + (j + xj)];
-            if (v > max) {
-                max = v;
-                mi = i + yi;
-                mj = j + xj;
-            }
-        }
-    }
-    gwy_debug("pixel maximum at: %d, %d", *mj, *mi);
 
-    /* Don't try any sub-pixel refinement if it's on the edge. */
-    if (mi >= 1 && mi+1 <= yres-1 && mj >= 1 && mj+1 <= xres-1) {
-        for (i = -1; i <= 1; i++) {
-            for (j = -1; j <= 1; j++)
-                z[3*(i + 1) + (j + 1)] = d[(mi + i)*xres + (mj + j)];
-        }
-        gwy_math_refine_maximum(z, x, y);
-        gwy_debug("refinement by (%g, %g)", *x, *y);
-    }
-    else {
-        *x = *y = 0.0;
-    }
-
-    *x += mj;
-    *y += mi;
-}
-
-/* Permit dest = src */
-static void
-matrix_vector(gdouble *dest,
-              const gdouble *m,
-              const gdouble *src)
-{
-    gdouble xy[2];
+    /* Now save the corrected lattice selection on result. */
+    gwy_selection_set_data(controls->selection_corr, 1, a1a2_corr);
 
-    xy[0] = m[0]*src[0] + m[1]*src[1];
-    xy[1] = m[2]*src[0] + m[3]*src[1];
-    dest[0] = xy[0];
-    dest[1] = xy[1];
+    controls->calculated = TRUE;
 }
 
-/* Permit dest = src */
 static void
-matrix_matrix(gdouble *dest,
-              const gdouble *m,
-              const gdouble *src)
+fill_correct_vectors(const AffcorArgs *args, gdouble *a1a2)
 {
-    gdouble xy[4];
-
-    xy[0] = m[0]*src[0] + m[1]*src[2];
-    xy[1] = m[0]*src[1] + m[1]*src[3];
-    xy[2] = m[2]*src[0] + m[3]*src[2];
-    xy[3] = m[2]*src[1] + m[3]*src[3];
-    dest[0] = xy[0];
-    dest[1] = xy[1];
-    dest[2] = xy[2];
-    dest[3] = xy[3];
+    a1a2[0] = args->a1;
+    a1a2[1] = 0.0;
+    a1a2[2] = args->a2 * cos(args->phi);
+    a1a2[3] = -args->a2 * sin(args->phi);
 }
 
-/* Permit dest = src */
-static void
-invert_matrix(gdouble *dest,
-              const gdouble *src)
+/* NB: a1a2_corr is modified according to scaling to be correct for the
+ * returned data field. */
+static GwyDataField*
+create_corrected_dfield(GwyDataField *dfield,
+                        const gdouble *a1a2,
+                        gdouble *a1a2_corr,
+                        GwyInterpolationType interp,
+                        GwyAffineScalingType scaling)
 {
-    gdouble D = matrix_det(src);
-    gdouble xy[4];
+    GwyDataField *corrected;
+    gdouble invtrans[6];
 
-    gwy_debug("D %g", D);
-    xy[0] = src[3]/D;
-    xy[1] = -src[1]/D;
-    xy[2] = -src[2]/D;
-    xy[3] = src[0]/D;
-    dest[0] = xy[0];
-    dest[1] = xy[1];
-    dest[2] = xy[2];
-    dest[3] = xy[3];
-}
+    corrected = gwy_data_field_new(1, 1, 1.0, 1.0, FALSE);
+    gwy_data_field_affine_prepare(dfield, corrected, a1a2, a1a2_corr, invtrans,
+                                  scaling, TRUE, 1.0);
+    gwy_data_field_affine(dfield, corrected, invtrans, interp,
+                          GWY_EXTERIOR_FIXED_VALUE,
+                          gwy_data_field_get_avg(dfield));
 
-static gdouble
-matrix_det(const gdouble *m)
-{
-    return m[0]*m[3] - m[1]*m[2];
+    return corrected;
 }
 
-static const gchar preset_key[]            = "/module/correct_affine/preset";
 static const gchar a1_key[]                = "/module/correct_affine/a1";
 static const gchar a2_key[]                = "/module/correct_affine/a2";
-static const gchar phi_key[]               = "/module/correct_affine/phi";
 static const gchar different_lengths_key[] = "/module/correct_affine/different-lengths";
+static const gchar distribute_key[]        = "/module/correct_affine/distribute";
+static const gchar fix_hacf_key[]          = "/module/correct_affine/fix_hacf";
 static const gchar interp_key[]            = "/module/correct_affine/interpolation";
+static const gchar phi_key[]               = "/module/correct_affine/phi";
+static const gchar preset_key[]            = "/module/correct_affine/preset";
 static const gchar scaling_key[]           = "/module/correct_affine/scaling";
 static const gchar zoom_key[]              = "/module/correct_affine/zoom";
 
@@ -1530,10 +1481,12 @@ affcor_sanitize_args(AffcorArgs *args)
 {
     args->interp = gwy_enum_sanitize_value(args->interp,
                                            GWY_TYPE_INTERPOLATION_TYPE);
-    args->scaling = MIN(args->scaling, SCALING_PRESERVE_X);
+    args->scaling = MIN(args->scaling, GWY_AFFINE_SCALING_PRESERVE_X);
     args->preset = CLAMP(args->preset,
                          USER_DEFINED_LATTICE,
                          (gint)G_N_ELEMENTS(lattice_presets)-1);
+    args->fix_hacf = !!args->fix_hacf;
+    args->distribute = !!args->distribute;
     if (args->zoom != ZOOM_1 && args->zoom != ZOOM_4 && args->zoom != ZOOM_16)
         args->zoom = affcor_defaults.zoom;
 
@@ -1576,6 +1529,9 @@ affcor_load_args(GwyContainer *container,
     gwy_container_gis_enum_by_name(container, scaling_key, &args->scaling);
     gwy_container_gis_int32_by_name(container, preset_key, &args->preset);
     gwy_container_gis_enum_by_name(container, zoom_key, &args->zoom);
+    gwy_container_gis_boolean_by_name(container, fix_hacf_key, &args->fix_hacf);
+    gwy_container_gis_boolean_by_name(container, distribute_key,
+                                      &args->distribute);
 
     affcor_sanitize_args(args);
 }
@@ -1593,6 +1549,9 @@ affcor_save_args(GwyContainer *container,
     gwy_container_set_enum_by_name(container, scaling_key, args->scaling);
     gwy_container_set_int32_by_name(container, preset_key, args->preset);
     gwy_container_set_enum_by_name(container, zoom_key, args->zoom);
+    gwy_container_set_boolean_by_name(container, fix_hacf_key, args->fix_hacf);
+    gwy_container_set_boolean_by_name(container, distribute_key,
+                                      args->distribute);
 }
 
 /* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/process/crosscor.c b/modules/process/crosscor.c
index 4617824..2790168 100644
--- a/modules/process/crosscor.c
+++ b/modules/process/crosscor.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: crosscor.c 19089 2016-10-16 12:47:38Z yeti-dn $
+ *  @(#) $Id: crosscor.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -156,12 +156,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Calculates cross-correlation of two data fields."),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "1.10",
+    "1.11",
     "David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, crosscor)
 
 static gboolean
 module_register(void)
@@ -204,7 +204,7 @@ static gboolean
 crosscor_dialog(CrosscorArgs *args)
 {
     CrosscorControls controls;
-    GtkWidget *dialog, *table, *label, *combo, *button, *spin;
+    GtkWidget *dialog, *table, *label, *combo, *button;
     GwyDataChooser *chooser;
     gint row, response;
     gboolean ok = FALSE;
@@ -218,7 +218,7 @@ crosscor_dialog(CrosscorArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(9, 4, FALSE);
+    table = gtk_table_new(9, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -235,113 +235,90 @@ crosscor_dialog(CrosscorArgs *args)
     g_signal_connect(chooser, "changed",
                      G_CALLBACK(crosscor_data_changed), &args->op2);
     crosscor_data_changed(chooser, &args->op2);
-    gwy_table_attach_hscale(table, row, _("Co_rrelate with:"), NULL,
-                            GTK_OBJECT(chooser), GWY_HSCALE_WIDGET);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+    gwy_table_attach_adjbar(table, row, _("Co_rrelate with:"), NULL,
+                            GTK_OBJECT(chooser), GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     /* Search size */
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gtk_label_new(_("Search size"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label, 0, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
     row++;
 
     controls.search_area_x = gtk_adjustment_new(args->search_x,
                                                 0.0, 200.0, 1, 5, 0);
-    gwy_table_attach_hscale(table, row, _("_Width:"), "px",
-                            controls.search_area_x, 0);
-
+    gwy_table_attach_adjbar(table, row, _("_Width:"), _("px"),
+                            controls.search_area_x, GWY_HSCALE_SQRT);
     g_signal_connect(controls.search_area_x, "value-changed",
-                     G_CALLBACK(crosscor_update_areas_cb),
-                     &controls);
-
+                     G_CALLBACK(crosscor_update_areas_cb), &controls);
     row++;
 
     controls.search_area_y = gtk_adjustment_new(args->search_y,
                                                 0.0, 200.0, 1, 5, 0);
-    gwy_table_attach_hscale(table, row, _("H_eight:"), "px",
-                            controls.search_area_y, 0);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+    gwy_table_attach_adjbar(table, row, _("H_eight:"), _("px"),
+                            controls.search_area_y, GWY_HSCALE_SQRT);
     g_signal_connect(controls.search_area_y, "value-changed",
-                     G_CALLBACK(crosscor_update_areas_cb),
-                     &controls);
-
+                     G_CALLBACK(crosscor_update_areas_cb), &controls);
     row++;
 
-    label = gtk_label_new(_("Global offset of 2nd channel"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     button = gtk_button_new_with_mnemonic(_("_Guess"));
-    gtk_table_attach(GTK_TABLE(table), button, 2, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gwy_table_attach_adjbar(table, row, _("Global offset of 2nd channel"), NULL,
+                            GTK_OBJECT(button), GWY_HSCALE_WIDGET_NO_EXPAND);
     g_signal_connect_swapped(button, "clicked",
-                        G_CALLBACK(guess_offsets), &controls);
-
-
+                             G_CALLBACK(guess_offsets), &controls);
     row++;
 
-
     controls.search_area_xoffset = gtk_adjustment_new(args->search_xoffset,
                                                 -200.0, 200.0, 1, 5, 0);
-    gwy_table_attach_hscale(table, row, _("_X offset:"), "px",
-                            controls.search_area_xoffset, 0);
-
+    gwy_table_attach_adjbar(table, row, _("_X offset:"), _("px"),
+                            controls.search_area_xoffset, GWY_HSCALE_SQRT);
     g_signal_connect(controls.search_area_xoffset, "value-changed",
-                     G_CALLBACK(crosscor_update_areas_cb),
-                     &controls);
-
+                     G_CALLBACK(crosscor_update_areas_cb), &controls);
     row++;
 
     controls.search_area_yoffset = gtk_adjustment_new(args->search_yoffset,
                                                 -200.0, 200.0, 1, 5, 0);
-    gwy_table_attach_hscale(table, row, _("_Y offset:"), "px",
-                            controls.search_area_yoffset, 0);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+    gwy_table_attach_adjbar(table, row, _("_Y offset:"), _("px"),
+                            controls.search_area_yoffset, GWY_HSCALE_SQRT);
     g_signal_connect(controls.search_area_yoffset, "value-changed",
-                     G_CALLBACK(crosscor_update_areas_cb),
-                     &controls);
-
+                     G_CALLBACK(crosscor_update_areas_cb), &controls);
     row++;
 
-
     /* Window size */
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gtk_label_new(_("Window size"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label, 0, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
     row++;
 
     controls.window_area_x = gtk_adjustment_new(args->window_x,
                                                 0.0, 100.0, 1, 5, 0);
-    gwy_table_attach_hscale(table, row, _("W_idth:"), "px",
-                            controls.window_area_x, 0);
+    gwy_table_attach_adjbar(table, row, _("W_idth:"), _("px"),
+                            controls.window_area_x, GWY_HSCALE_SQRT);
     g_signal_connect(controls.window_area_x, "value-changed",
-                     G_CALLBACK(crosscor_update_areas_cb),
-                     &controls);
-
+                     G_CALLBACK(crosscor_update_areas_cb), &controls);
     row++;
 
     controls.window_area_y = gtk_adjustment_new(args->window_y,
                                                 0.0, 100.0, 1, 5, 0);
-    gwy_table_attach_hscale(table, row, _("Hei_ght:"), "px",
-                            controls.window_area_y, 0);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+    gwy_table_attach_adjbar(table, row, _("Hei_ght:"), _("px"),
+                            controls.window_area_y, GWY_HSCALE_SQRT);
     g_signal_connect(controls.window_area_y, "value-changed",
-                     G_CALLBACK(crosscor_update_areas_cb),
-                     &controls);
+                     G_CALLBACK(crosscor_update_areas_cb), &controls);
     row++;
 
-
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     controls.window
         = gwy_enum_combo_box_new(gwy_windowing_type_get_enum(), -1,
                                  G_CALLBACK(gwy_enum_combo_box_update_int),
                                  &args->window, args->window, TRUE);
-    gwy_table_attach_hscale(table, row, _("_Windowing type:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Windowing type:"), NULL,
                             GTK_OBJECT(controls.window),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     /* Result */
@@ -354,15 +331,15 @@ crosscor_dialog(CrosscorArgs *args)
                                     _("Angle"), GWY_CROSSCOR_DIR,
                                     _("Score"), GWY_CROSSCOR_SCORE,
                                     NULL);
-    gwy_table_attach_hscale(table, row, _("Output _type:"), NULL,
-                            GTK_OBJECT(combo), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("Output _type:"), NULL,
+                            GTK_OBJECT(combo), GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     /* Do mask of thresholds */
     controls.add_ls_mask = gtk_check_button_new_with_mnemonic
                                            (_("Add _low score results mask"));
-    gtk_table_attach(GTK_TABLE(table), controls.add_ls_mask, 0, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), controls.add_ls_mask, 0, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.add_ls_mask),
                                  args->add_ls_mask);
     g_signal_connect(controls.add_ls_mask, "toggled",
@@ -371,16 +348,17 @@ crosscor_dialog(CrosscorArgs *args)
 
     controls.threshold = gtk_adjustment_new(args->threshold,
                                             -1, 1, 0.005, 0.05, 0);
-    gwy_table_attach_hscale(table, row, _("T_hreshold:"), NULL,
-                            controls.threshold, 0);
+    gwy_table_attach_adjbar(table, row, _("T_hreshold:"), NULL,
+                            controls.threshold, GWY_HSCALE_LINEAR);
     gwy_table_hscale_set_sensitive(controls.threshold, args->add_ls_mask);
     row++;
 
     /* Allow multiple channel cross-correlation */
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     controls.multiple = gtk_check_button_new_with_mnemonic
                                            (_("Multichannel cross-corelation"));
-    gtk_table_attach(GTK_TABLE(table), controls.multiple, 0, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), controls.multiple, 0, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.multiple),
                                  args->multiple);
     g_signal_connect(controls.multiple, "toggled",
@@ -397,11 +375,10 @@ crosscor_dialog(CrosscorArgs *args)
     g_signal_connect(controls.chooser_op3, "changed",
                      G_CALLBACK(crosscor_data_changed), &args->op3);
     crosscor_data_changed(chooser, &args->op3);
-    gwy_table_attach_hscale(table, row, _("Second _source data:"), NULL,
-                            GTK_OBJECT(controls.chooser_op3), GWY_HSCALE_WIDGET);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+    gwy_table_attach_adjbar(table, row, _("Second _source data:"), NULL,
+                            GTK_OBJECT(controls.chooser_op3),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     gtk_widget_set_sensitive(controls.chooser_op3, args->multiple);
-
     row++;
 
     /* Second set to correlate with: second data */
@@ -414,60 +391,56 @@ crosscor_dialog(CrosscorArgs *args)
     g_signal_connect(controls.chooser_op4, "changed",
                      G_CALLBACK(crosscor_data_changed), &args->op4);
     crosscor_data_changed(chooser, &args->op4);
-    gwy_table_attach_hscale(table, row, _("Correlate with:"), NULL,
-                            GTK_OBJECT(controls.chooser_op4), GWY_HSCALE_WIDGET);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+    gwy_table_attach_adjbar(table, row, _("Correlate with:"), NULL,
+                            GTK_OBJECT(controls.chooser_op4),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     gtk_widget_set_sensitive(controls.chooser_op4, args->multiple);
     row++;
 
     /*postprocessing*/
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gtk_label_new(_("Postprocess:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label, 0, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
     row++;
 
-    controls.gaussian = gtk_check_button_new_with_mnemonic
-                                           (_("Apply Ga_ussian filter of width: "));
-    gtk_table_attach(GTK_TABLE(table), controls.gaussian, 0, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    controls.gaussian_width = gtk_adjustment_new(args->gaussian_width,
+                                                 2, 100, 1, 5, 0);
+    gwy_table_attach_adjbar(table, row,
+                            _("Apply Ga_ussian filter of width:"), NULL,
+                            controls.gaussian_width,
+                            GWY_HSCALE_CHECK | GWY_HSCALE_SQRT);
+    controls.gaussian = gwy_table_hscale_get_check(controls.gaussian_width);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.gaussian),
                                  args->gaussian);
     g_signal_connect(controls.gaussian, "toggled",
                      G_CALLBACK(gaussian_changed_cb), &controls);
-
-    controls.gaussian_width = gtk_adjustment_new(args->gaussian_width, 2, 100, 1, 5, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.gaussian_width), 1, 2);
     g_signal_connect(controls.gaussian_width, "value-changed",
                      G_CALLBACK(gaussian_width_changed_cb), &controls);
-
-    gtk_table_attach(GTK_TABLE(table), spin, 3, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-
     row++;
 
-    controls.extend = gtk_check_button_new_with_mnemonic
-                                           (_("Extend results to borders"));
-    gtk_table_attach(GTK_TABLE(table), controls.extend, 0, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    controls.extend
+        = gtk_check_button_new_with_label(_("Extend results to borders"));
+    gtk_table_attach(GTK_TABLE(table), controls.extend, 0, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.extend),
                                  args->extend);
     g_signal_connect(controls.extend, "toggled",
                      G_CALLBACK(extend_changed_cb), &controls);
     row++;
 
-    controls.correct = gtk_check_button_new_with_mnemonic
-                                           (_("Create corrected data from 2nd channel"));
-    gtk_table_attach(GTK_TABLE(table), controls.correct, 0, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    controls.correct = gtk_check_button_new_with_label(_("Create corrected "
+                                                         "data from 2nd "
+                                                         "channel"));
+    gtk_table_attach(GTK_TABLE(table), controls.correct, 0, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.correct),
                                  args->correct);
     g_signal_connect(controls.correct, "toggled",
                      G_CALLBACK(correct_changed_cb), &controls);
     row++;
 
-
     gtk_widget_show_all(dialog);
 
     do {
diff --git a/modules/process/curvature.c b/modules/process/curvature.c
index 0201682..856783c 100644
--- a/modules/process/curvature.c
+++ b/modules/process/curvature.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: curvature.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: curvature.c 20064 2017-07-11 12:06:26Z yeti-dn $
  *  Copyright (C) 2009-2015 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.net.
  *
@@ -67,7 +67,6 @@ typedef struct {
     GtkWidget *set_selection;
     GtkWidget *plot_graph;
     GtkWidget *target_graph;
-    GtkWidget *target_hbox;
     GtkWidget *view;
     GtkWidget *graph;
     GtkWidget *warning;
@@ -162,12 +161,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Calculates overall curvature."),
     "Yeti <yeti at gwyddion.net>",
-    "1.3",
+    "1.5",
     "David Nečas (Yeti)",
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, curvature)
 
 static gboolean
 module_register(void)
@@ -395,6 +394,9 @@ curvature_calculate(GwyDataField *dfield,
                                       xreal, yreal, i1 + i, i2 + i);
     }
 
+    params[PARAM_X0] += gwy_data_field_get_xoffset(dfield);
+    params[PARAM_Y0] += gwy_data_field_get_yoffset(dfield);
+
     return ok;
 }
 
@@ -594,7 +596,7 @@ curvature_dialog(CurvatureArgs *args,
                  GwyDataField *mfield,
                  gint id)
 {
-    GtkWidget *dialog, *table, *label, *hbox, *vbox, *treeview, *button, *hbox2;
+    GtkWidget *dialog, *table, *label, *hbox, *vbox, *treeview, *button;
     GwyDataChooser *chooser;
     GtkTreeSelection *selection;
     GtkTreeViewColumn *column;
@@ -644,7 +646,7 @@ curvature_dialog(CurvatureArgs *args,
     g_object_set(controls.selection, "max-objects", 2, NULL);
     gtk_box_pack_start(GTK_BOX(vbox), controls.view, FALSE, FALSE, 4);
 
-    table = gtk_table_new(5 + (mfield ? 4 : 0), 4, FALSE);
+    table = gtk_table_new(5 + (mfield ? 4 : 0), 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
@@ -653,13 +655,13 @@ curvature_dialog(CurvatureArgs *args,
     label = gwy_label_new_header(_("Output Type"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.set_selection
         = gtk_check_button_new_with_mnemonic(_("_Set selection"));
     gtk_table_attach(GTK_TABLE(table), controls.set_selection,
-                     0, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.set_selection),
                                  args->set_selection);
     g_signal_connect(controls.set_selection, "toggled",
@@ -669,7 +671,7 @@ curvature_dialog(CurvatureArgs *args,
     controls.plot_graph
         = gtk_check_button_new_with_mnemonic(_("_Plot graph"));
     gtk_table_attach(GTK_TABLE(table), controls.plot_graph,
-                     0, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.plot_graph),
                                  args->plot_graph);
     g_signal_connect(controls.plot_graph, "toggled",
@@ -677,15 +679,6 @@ curvature_dialog(CurvatureArgs *args,
     row++;
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
-    controls.target_hbox = hbox2 = gtk_hbox_new(FALSE, 6);
-    gtk_widget_set_sensitive(controls.target_hbox, args->plot_graph);
-    gtk_table_attach(GTK_TABLE(table), hbox2,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    label = gtk_label_new_with_mnemonic(_("Target _graph:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
-
     controls.target_graph = gwy_data_chooser_new_graphs();
     chooser = GWY_DATA_CHOOSER(controls.target_graph);
     gwy_data_chooser_set_none(chooser, _("New graph"));
@@ -693,8 +686,11 @@ curvature_dialog(CurvatureArgs *args,
     gwy_data_chooser_set_filter(chooser, filter_target_graphs, &controls, NULL);
     gwy_data_chooser_set_active_id(chooser, &args->target_graph);
     gwy_data_chooser_get_active_id(chooser, &args->target_graph);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.target_graph);
-    gtk_box_pack_end(GTK_BOX(hbox2), controls.target_graph, FALSE, FALSE, 0);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row, _("Target _graph:"), NULL,
+                            GTK_OBJECT(controls.target_graph),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    gwy_table_hscale_set_sensitive(GTK_OBJECT(controls.target_graph),
+                                   args->plot_graph);
     g_signal_connect_swapped(controls.target_graph, "changed",
                              G_CALLBACK(target_graph_changed), &controls);
     row++;
@@ -726,6 +722,7 @@ curvature_dialog(CurvatureArgs *args,
     gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
 
     controls.graph = gwy_graph_new(controls.gmodel);
+    gwy_graph_enable_user_input(GWY_GRAPH(controls.graph), FALSE);
     gtk_widget_set_size_request(controls.graph, 320, 260);
     g_object_unref(controls.gmodel);
 
@@ -858,7 +855,8 @@ curvature_plot_graph_changed(GtkToggleButton *button,
     CurvatureArgs *args = controls->args;
 
     args->plot_graph = gtk_toggle_button_get_active(button);
-    gtk_widget_set_sensitive(controls->target_hbox, args->plot_graph);
+    gwy_table_hscale_set_sensitive(GTK_OBJECT(controls->target_graph),
+                                   args->plot_graph);
 }
 
 static void
diff --git a/modules/process/cwt.c b/modules/process/cwt.c
index 59124e4..d0c9092 100644
--- a/modules/process/cwt.c
+++ b/modules/process/cwt.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: cwt.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: cwt.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -65,12 +65,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Two-dimensional CWT (Continuous Wavelet Transform)."),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "1.5",
+    "1.6",
     "David Nečas (Yeti) & Petr Klapetek",
     "2003",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, cwt)
 
 static gboolean
 module_register(void)
@@ -129,7 +129,7 @@ cwt_dialog(CWTArgs *args)
 {
     GtkWidget *dialog, *table;
     CWTControls controls;
-    gint response;
+    gint response, row;
 
     dialog = gtk_dialog_new_with_buttons(_("2D CWT"), NULL, 0,
                                          _("_Reset"), RESPONSE_RESET,
@@ -139,24 +139,27 @@ cwt_dialog(CWTArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(4, 4, FALSE);
+    table = gtk_table_new(2, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table,
                        FALSE, FALSE, 4);
-
+    row = 0;
 
     controls.scale = gtk_adjustment_new(args->scale, 0.0, 1000.0, 1, 10, 0);
-    gwy_table_attach_spinbutton(table, 1, _("_Scale:"), _("pixels"),
-                                controls.scale);
+    gwy_table_attach_adjbar(table, row, _("_Scale:"), _("px"),
+                            controls.scale, GWY_HSCALE_DEFAULT);
+    row++;
 
     controls.wavelet
         = gwy_enum_combo_box_new(gwy_2d_cwt_wavelet_type_get_enum(), -1,
                                  G_CALLBACK(gwy_enum_combo_box_update_int),
                                  &args->wavelet, args->wavelet, TRUE);
-    gwy_table_attach_row(table, 3, _("_Wavelet type:"), "",
-                         controls.wavelet);
+    gwy_table_attach_adjbar(table, row, _("_Wavelet type:"), NULL,
+                            GTK_OBJECT(controls.wavelet),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    row++;
 
     gtk_widget_show_all(dialog);
     do {
diff --git a/modules/process/deposit_synth.c b/modules/process/deposit_synth.c
index bda0056..6ffad2b 100644
--- a/modules/process/deposit_synth.c
+++ b/modules/process/deposit_synth.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: deposit_synth.c 19071 2016-10-14 09:02:41Z yeti-dn $
+ *  @(#) $Id: deposit_synth.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2007,2009,2010 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -169,19 +169,19 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Generates particles using simple dynamical model"),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "1.4",
+    "1.5",
     "Petr Klapetek",
     "2010",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, deposit_synth)
 
 static gboolean
 module_register(void)
 {
     gwy_process_func_register("deposit_synth",
                               (GwyProcessFunc)&deposit_synth,
-                              N_("/S_ynthetic/_Particles..."),
+                              N_("/S_ynthetic/_Deposition/_Particles..."),
                               GWY_STOCK_SYNTHETIC_PARTICLES,
                               DEPOSIT_SYNTH_RUN_MODES,
                               0,
@@ -339,6 +339,7 @@ deposit_synth_dialog(DepositSynthArgs *args,
     gboolean finished;
     gint response;
     gint row, newid;
+    gdouble power10;
 
     gwy_clear(&controls, 1);
     controls.in_init = TRUE;
@@ -410,11 +411,13 @@ deposit_synth_dialog(DepositSynthArgs *args,
     gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
                              gwy_dimensions_get_widget(controls.dims),
                              gtk_label_new(_("Dimensions")));
-    if (controls.dims->add)
+    if (controls.dims->add) {
         g_signal_connect_swapped(controls.dims->add, "toggled",
-                                 G_CALLBACK(deposit_synth_invalidate), &controls);
+                                 G_CALLBACK(deposit_synth_invalidate),
+                                 &controls);
+    }
 
-    table = gtk_table_new(12 + (dfield_template ? 1 : 0), 5, FALSE);
+    table = gtk_table_new(12 + (dfield_template ? 1 : 0), 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -422,10 +425,12 @@ deposit_synth_dialog(DepositSynthArgs *args,
                              gtk_label_new(_("Generator")));
     row = 0;
 
-    controls.size = gtk_adjustment_new(args->size/pow10(controls.dims->args->xypow10),
-                                        0, 100.0, 0.1, 1.0, 0);
-    spin = gwy_table_attach_hscale(table, row, _("Particle r_adius:"), controls.dims->args->xyunits,
-                                   controls.size, GWY_HSCALE_DEFAULT);
+    power10 = pow10(controls.dims->args->xypow10);
+    controls.size = gtk_adjustment_new(args->size/power10,
+                                       0, 100.0, 0.1, 1.0, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("Particle r_adius:"),
+                                   controls.dims->args->xyunits,
+                                   controls.size, GWY_HSCALE_SQRT);
     gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(spin), FALSE);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 4);
     controls.size_units = gwy_table_hscale_get_units(controls.size);
@@ -433,10 +438,11 @@ deposit_synth_dialog(DepositSynthArgs *args,
                              G_CALLBACK(size_changed), &controls);
     row++;
 
-    controls.width = gtk_adjustment_new(args->width/pow10(controls.dims->args->xypow10),
+    controls.width = gtk_adjustment_new(args->width/power10,
                                         0, 100.0, 0.1, 1.0, 0);
-    spin = gwy_table_attach_hscale(table, row, _("Distribution _width:"), controls.dims->args->xyunits,
-                                   controls.width, GWY_HSCALE_DEFAULT);
+    spin = gwy_table_attach_adjbar(table, row, _("Distribution _width:"),
+                                   controls.dims->args->xyunits,
+                                   controls.width, GWY_HSCALE_SQRT);
     gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(spin), FALSE);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 4);
     controls.width_units = gwy_table_hscale_get_units(controls.width);
@@ -446,31 +452,25 @@ deposit_synth_dialog(DepositSynthArgs *args,
 
     controls.coverage = gtk_adjustment_new(args->coverage,
                                            0.0, 100, 0.1, 1, 0);
-    gwy_table_attach_hscale(table, row, _("Surface _coverage:"),
-                            "%",
-                            controls.coverage, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("Co_verage:"), "%",
+                            controls.coverage, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls.coverage, "value-changed",
                              G_CALLBACK(coverage_changed), &controls);
     row++;
 
-    controls.revise = gtk_adjustment_new(args->revise,
-                                           0.0, 10000, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("_Relax steps:"),
-                            "",
-                            controls.revise, GWY_HSCALE_DEFAULT);
+    controls.revise = gtk_adjustment_new(args->revise, 0.0, 10000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("_Relax steps:"), NULL,
+                            controls.revise, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.revise, "value-changed",
                              G_CALLBACK(revise_changed), &controls);
     row++;
 
-
-    controls.message = gtk_label_new("");
+    controls.message = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(controls.message), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), controls.message,
                      0, 4, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
-
-
     gtk_widget_show_all(dialog);
     controls.in_init = FALSE;
     /* Must be done when widgets are shown, see GtkNotebook docs */
@@ -602,7 +602,8 @@ update_controls(DepositSynthControls *controls,
     gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->seed), args->seed);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->randomize),
                                  args->randomize);
-    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->size), args->size/pow10(controls->dims->args->xypow10));
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->size),
+                             args->size/pow10(controls->dims->args->xypow10));
     gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->width),
                              args->width/pow10(controls->dims->args->xypow10));
     gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->coverage),
@@ -694,14 +695,11 @@ page_switched(DepositSynthControls *controls,
         GwyDimensions *dims = controls->dims;
 
         if (controls->size_units)
-          gtk_label_set_markup(GTK_LABEL(controls->size_units),
-                             dims->xyvf->units);
+            gtk_label_set_markup(GTK_LABEL(controls->size_units),
+                                 dims->xyvf->units);
         if (controls->width_units)
-          gtk_label_set_markup(GTK_LABEL(controls->width_units),
-                             dims->xyvf->units);
-
-        //update_size_value(controls);
-        //update_width_value(controls);
+            gtk_label_set_markup(GTK_LABEL(controls->width_units),
+                                 dims->xyvf->units);
     }
 }
 
@@ -724,36 +722,38 @@ static void
 size_changed(DepositSynthControls *controls,
              GtkAdjustment *adj)
 {
-    controls->args->size = gtk_adjustment_get_value(adj)*pow10(controls->dims->args->xypow10);
-    deposit_synth_invalidate(controls);
+    gdouble power10 = pow10(controls->dims->args->xypow10);
 
+    controls->args->size = gtk_adjustment_get_value(adj)*power10;
+    deposit_synth_invalidate(controls);
 }
+
 static void
 width_changed(DepositSynthControls *controls,
              GtkAdjustment *adj)
 {
-    controls->args->width = gtk_adjustment_get_value(adj)*pow10(controls->dims->args->xypow10);
-    deposit_synth_invalidate(controls);
+    gdouble power10 = pow10(controls->dims->args->xypow10);
 
+    controls->args->width = gtk_adjustment_get_value(adj)*power10;
+    deposit_synth_invalidate(controls);
 }
+
 static void
 coverage_changed(DepositSynthControls *controls,
              GtkAdjustment *adj)
 {
     controls->args->coverage = gtk_adjustment_get_value(adj);
     deposit_synth_invalidate(controls);
-
 }
+
 static void
 revise_changed(DepositSynthControls *controls,
              GtkAdjustment *adj)
 {
     controls->args->revise = gtk_adjustment_get_value(adj);
     deposit_synth_invalidate(controls);
-
 }
 
-
 static void
 deposit_synth_invalidate(DepositSynthControls *controls)
 {
@@ -776,7 +776,6 @@ preview_gsource(gpointer user_data)
     return FALSE;
 }
 
-
 static void
 preview(DepositSynthControls *controls)
 {
diff --git a/modules/process/diff_synth.c b/modules/process/diff_synth.c
index b03d9fd..643e038 100644
--- a/modules/process/diff_synth.c
+++ b/modules/process/diff_synth.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: diff_synth.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: diff_synth.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -218,14 +218,14 @@ static GwyModuleInfo module_info = {
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, diff_synth)
 
 static gboolean
 module_register(void)
 {
     gwy_process_func_register("diff_synth",
                               (GwyProcessFunc)&diff_synth,
-                              N_("/S_ynthetic/_Diffusion..."),
+                              N_("/S_ynthetic/_Deposition/_Diffusion..."),
                               GWY_STOCK_SYNTHETIC_DIFFUSION,
                               DIFF_SYNTH_RUN_MODES,
                               0,
@@ -476,7 +476,7 @@ diff_synth_dialog(DiffSynthArgs *args,
                              gwy_dimensions_get_widget(controls.dims),
                              gtk_label_new(_("Dimensions")));
 
-    table = gtk_table_new(15 + (dfield_template ? 1 : 0), 4, FALSE);
+    table = gtk_table_new(15 + (dfield_template ? 1 : 0), 3, FALSE);
     /* This is used only for synt.h helpers. */
     controls.table = GTK_TABLE(table);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
@@ -489,7 +489,7 @@ diff_synth_dialog(DiffSynthArgs *args,
     controls.coverage = gtk_adjustment_new(args->coverage,
                                            0.0, 16.0, 0.001, 1.0, 0);
     g_object_set_data(G_OBJECT(controls.coverage), "target", &args->coverage);
-    gwy_table_attach_hscale(table, row, _("Co_verage:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("Co_verage:"), NULL,
                             controls.coverage, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.coverage, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
@@ -497,8 +497,8 @@ diff_synth_dialog(DiffSynthArgs *args,
 
     controls.flux = gtk_adjustment_new(args->flux, -13.0, -3.0, 0.01, 1.0, 0);
     g_object_set_data(G_OBJECT(controls.flux), "target", &args->flux);
-    gwy_table_attach_hscale(table, row, _("_Flux:"), "log<sub>10</sub>",
-                            controls.flux, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("_Flux:"), "log<sub>10</sub>",
+                            controls.flux, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls.flux, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
     row++;
@@ -509,25 +509,24 @@ diff_synth_dialog(DiffSynthArgs *args,
 
     if (dfield_template) {
         controls.height_init
-            = gtk_button_new_with_mnemonic(_("_Like Current Channel"));
+            = gtk_button_new_with_mnemonic(_("_Like Current Image"));
         g_signal_connect_swapped(controls.height_init, "clicked",
                                  G_CALLBACK(height_init_clicked), &controls);
         gtk_table_attach(GTK_TABLE(table), controls.height_init,
-                         1, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
     }
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
-
     label = gwy_label_new_header(_("Probabilities"));
-    gtk_table_attach(GTK_TABLE(table), label, 0, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
     row++;
 
     controls.p_stick = gtk_adjustment_new(args->p_stick,
                                           0.0, 1.0, 0.0001, 0.1, 0);
     g_object_set_data(G_OBJECT(controls.p_stick), "target", &args->p_stick);
-    gwy_table_attach_hscale(table, row, _("_Sticking:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Sticking:"), NULL,
                             controls.p_stick, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.p_stick, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
@@ -536,7 +535,7 @@ diff_synth_dialog(DiffSynthArgs *args,
     controls.p_break = gtk_adjustment_new(args->p_break,
                                           0.0, 1.0, 0.0001, 0.1, 0);
     g_object_set_data(G_OBJECT(controls.p_break), "target", &args->p_break);
-    gwy_table_attach_hscale(table, row, _("_Activation:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Activation:"), NULL,
                             controls.p_break, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.p_break, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
@@ -545,14 +544,14 @@ diff_synth_dialog(DiffSynthArgs *args,
     controls.schwoebel = gtk_adjustment_new(args->schwoebel,
                                             -12.0, 0.0, 0.01, 1.0, 0);
     g_object_set_data(G_OBJECT(controls.schwoebel), "target", &args->schwoebel);
-    gwy_table_attach_hscale(table, row, _("Passing Sch_woebel:"),
+    gwy_table_attach_adjbar(table, row, _("Passing Sch_woebel:"),
                             "log<sub>10</sub>",
-                            controls.schwoebel, GWY_HSCALE_DEFAULT);
+                            controls.schwoebel, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls.schwoebel, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
     row++;
 
-    table = gtk_table_new(1 + GRAPH_NFLAGS, 4, FALSE);
+    table = gtk_table_new(1 + GRAPH_NFLAGS, 3, FALSE);
     /* This is used only for synt.h helpers. */
     controls.table = GTK_TABLE(table);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
@@ -575,7 +574,7 @@ diff_synth_dialog(DiffSynthArgs *args,
         toggle = GTK_TOGGLE_BUTTON(controls.graph_flags[i]);
         gtk_toggle_button_set_active(toggle, args->graph_flags[i]);
         gtk_table_attach(GTK_TABLE(table), controls.graph_flags[i],
-                         0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         g_signal_connect(toggle, "toggled",
                          G_CALLBACK(gwy_synth_boolean_changed_silent),
                          &args->graph_flags[i]);
diff --git a/modules/process/dimensions.h b/modules/process/dimensions.h
index 434cad6..eb09a19 100644
--- a/modules/process/dimensions.h
+++ b/modules/process/dimensions.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: dimensions.h 18278 2016-02-13 16:57:55Z yeti-dn $
+ *  @(#) $Id: dimensions.h 19907 2017-06-11 18:03:15Z yeti-dn $
  *  Copyright (C) 2009 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -37,7 +37,7 @@ typedef struct {
     gchar *zunits;
     gint xypow10;
     gint zpow10;
-    gboolean replace;    /* do not create a new channel */
+    gboolean replace;    /* do not create a new image */
     gboolean add;        /* starts from the current, but may create new */
 } GwyDimensionArgs;
 
@@ -68,6 +68,9 @@ typedef struct {
     GtkWidget *zunits;
     GtkWidget *replace;
     GtkWidget *add;
+    GtkWidget *units_label;
+    GtkWidget *unit_xy_label;
+    GtkWidget *unit_z_label;
     gboolean in_update;
 } GwyDimensions;
 
@@ -78,28 +81,19 @@ gwy_dimensions_make_res(GtkTable *table,
                         const gchar *name,
                         gint value)
 {
-    GtkWidget *label, *spin;
-    GtkAdjustment *adj;
+    GtkWidget *spin;
     GtkObject *obj;
 
-    label = gtk_label_new_with_mnemonic(name);
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gwy_sensitivity_group_add_widget(sensgroup, label, GWY_DIMENSIONS_SENS);
-    gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
     obj = gtk_adjustment_new(value, 2, 32768, 1, 100, 0);
-    adj = GTK_ADJUSTMENT(obj);
-    spin = gtk_spin_button_new(adj, 0, 0);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), spin);
+    spin = gwy_table_attach_adjbar(GTK_WIDGET(table), row, name, _("px"),
+                                   obj, GWY_HSCALE_LOG);
     gwy_sensitivity_group_add_widget(sensgroup, spin, GWY_DIMENSIONS_SENS);
-    gtk_table_attach(table, spin, 1, 2, row, row+1, GTK_FILL, 0, 0, 0);
-
-    label = gtk_label_new("px");
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gwy_sensitivity_group_add_widget(sensgroup, label, GWY_DIMENSIONS_SENS);
-    gtk_table_attach(table, label, 2, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    gwy_sensitivity_group_add_widget(sensgroup, gwy_table_hscale_get_label(obj),
+                                     GWY_DIMENSIONS_SENS);
+    gwy_sensitivity_group_add_widget(sensgroup, gwy_table_hscale_get_units(obj),
+                                     GWY_DIMENSIONS_SENS);
 
-    return adj;
+    return GTK_ADJUSTMENT(obj);
 }
 
 static GtkAdjustment*
@@ -111,29 +105,19 @@ gwy_dimensions_make_real(GtkTable *table,
                          const gchar *units,
                          GtkWidget **unitlab)
 {
-    GtkWidget *label, *spin;
-    GtkAdjustment *adj;
+    GtkWidget *spin;
     GtkObject *obj;
 
-    label = gtk_label_new_with_mnemonic(name);
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gwy_sensitivity_group_add_widget(sensgroup, label, GWY_DIMENSIONS_SENS);
-    gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
     obj = gtk_adjustment_new(value, 0.001, 10000.0, 1, 100, 0);
-    adj = GTK_ADJUSTMENT(obj);
-    spin = gtk_spin_button_new(adj, 0, 3);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), spin);
+    spin = gwy_table_attach_adjbar(GTK_WIDGET(table), row, name, units,
+                                   obj, GWY_HSCALE_LOG);
     gwy_sensitivity_group_add_widget(sensgroup, spin, GWY_DIMENSIONS_SENS);
-    gtk_table_attach(table, spin, 1, 2, row, row+1, GTK_FILL, 0, 0, 0);
-
-    *unitlab = gtk_label_new(units);
-    gtk_label_set_use_markup(GTK_LABEL(*unitlab), TRUE);
-    gtk_misc_set_alignment(GTK_MISC(*unitlab), 0.0, 0.5);
+    gwy_sensitivity_group_add_widget(sensgroup, gwy_table_hscale_get_label(obj),
+                                     GWY_DIMENSIONS_SENS);
+    *unitlab = gwy_table_hscale_get_units(obj);
     gwy_sensitivity_group_add_widget(sensgroup, *unitlab, GWY_DIMENSIONS_SENS);
-    gtk_table_attach(table, *unitlab, 2, 3, row, row+1, GTK_FILL, 0, 0, 0);
 
-    return adj;
+    return GTK_ADJUSTMENT(obj);
 }
 
 static GtkWidget*
@@ -143,20 +127,18 @@ gwy_dimensions_make_units(GtkTable *table,
                           const gchar *name,
                           gint pwr,
                           GwySIUnit *siunit,
-                          GtkWidget **combo)
+                          GtkWidget **combo,
+                          GtkWidget **label)
 {
-    GtkWidget *label, *changer;
-
-    label = gtk_label_new_with_mnemonic(name);
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gwy_sensitivity_group_add_widget(sensgroup, label, GWY_DIMENSIONS_SENS);
-    gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
+    GtkWidget *changer;
 
     *combo = gwy_combo_box_metric_unit_new(NULL, NULL,
                                            pwr - 6, pwr + 6, siunit, pwr);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), *combo);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row, name, NULL,
+                            GTK_OBJECT(*combo), GWY_HSCALE_WIDGET_NO_EXPAND);
     gwy_sensitivity_group_add_widget(sensgroup, *combo, GWY_DIMENSIONS_SENS);
-    gtk_table_attach(table, *combo, 1, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    *label = gwy_table_hscale_get_label(GTK_OBJECT(*combo));
+    gwy_sensitivity_group_add_widget(sensgroup, *label, GWY_DIMENSIONS_SENS);
 
     changer = gtk_button_new_with_label(gwy_sgettext("verb|Change"));
     gwy_sensitivity_group_add_widget(sensgroup, changer, GWY_DIMENSIONS_SENS);
@@ -444,7 +426,7 @@ gwy_dimensions_new(GwyDimensionArgs *args,
     /* Resolution */
     label = gwy_label_new_header(_("Resolution"));
     gwy_sensitivity_group_add_widget(sensgroup, label, GWY_DIMENSIONS_SENS);
-    gtk_table_attach(table, label, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, label, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     dims->xres = gwy_dimensions_make_res(table, sensgroup, row++,
@@ -459,14 +441,14 @@ gwy_dimensions_new(GwyDimensionArgs *args,
                                  args->xres == args->yres);
     gwy_sensitivity_group_add_widget(sensgroup, dims->xyreseq,
                                      GWY_DIMENSIONS_SENS);
-    gtk_table_attach(table, dims->xyreseq, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, dims->xyreseq, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_table_set_row_spacing(table, row, 12);
     row++;
 
     /* Physical dimensions */
     label = gwy_label_new_header(_("Physical Dimensions"));
     gwy_sensitivity_group_add_widget(sensgroup, label, GWY_DIMENSIONS_SENS);
-    gtk_table_attach(table, label, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, label, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     dims->xreal = gwy_dimensions_make_real(table, sensgroup, row++,
@@ -480,30 +462,35 @@ gwy_dimensions_new(GwyDimensionArgs *args,
     gtk_table_set_row_spacing(table, row-1, 12);
 
     /* Units */
-    label = gwy_label_new_header(_("Units"));
-    gwy_sensitivity_group_add_widget(sensgroup, label, GWY_DIMENSIONS_SENS);
-    gtk_table_attach(table, label, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    dims->units_label = gwy_label_new_header(_("Units"));
+    gwy_sensitivity_group_add_widget(sensgroup, dims->units_label,
+                                     GWY_DIMENSIONS_SENS);
+    gtk_table_attach(table, dims->units_label, 0, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
     row++;
 
     dims->xyunits = gwy_dimensions_make_units(table, sensgroup, row++,
                                               _("_Dimension units:"),
                                               args->xypow10, dims->xysiunit,
-                                              &dims->xypow10);
+                                              &dims->xypow10,
+                                              &dims->unit_xy_label);
 
     dims->zunits = gwy_dimensions_make_units(table, sensgroup, row++,
                                              _("_Value units:"),
                                              args->zpow10, dims->zsiunit,
-                                             &dims->zpow10);
+                                             &dims->zpow10,
+                                             &dims->unit_z_label);
 
     /* Template */
     if (dims->template_) {
         gtk_table_set_row_spacing(table, row-1, 12);
 
-        label = gwy_label_new_header(_("Current Channel"));
-        gtk_table_attach(table, label, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+        label = gwy_label_new_header(_("Current Image"));
+        gtk_table_attach(table, label, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
 
-        button = gtk_button_new_with_mnemonic(_("_Take Dimensions from Current Channel"));
+        button = gtk_button_new_with_mnemonic(_("_Take Dimensions from "
+                                                "Current Image"));
         gwy_sensitivity_group_add_widget(sensgroup, button,
                                          GWY_DIMENSIONS_SENS);
         gtk_table_attach(table, button, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
@@ -512,19 +499,19 @@ gwy_dimensions_new(GwyDimensionArgs *args,
         row++;
 
         button = gtk_check_button_new_with_mnemonic(_("_Replace the current "
-                                                      "channel"));
+                                                      "image"));
         dims->replace = button;
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), args->replace);
-        gtk_table_attach(table, button, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+        gtk_table_attach(table, button, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         g_signal_connect_swapped(button, "toggled",
                                  G_CALLBACK(gwy_dimensions_replace), dims);
         row++;
 
         button = gtk_check_button_new_with_mnemonic(_("_Start from the current "
-                                                      "channel"));
+                                                      "image"));
         dims->add = button;
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), args->add);
-        gtk_table_attach(table, button, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+        gtk_table_attach(table, button, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         g_signal_connect_swapped(button, "toggled",
                                  G_CALLBACK(gwy_dimensions_add), dims);
         row++;
diff --git a/modules/process/domain_synth.c b/modules/process/domain_synth.c
index 6b5e468..0bb778b 100644
--- a/modules/process/domain_synth.c
+++ b/modules/process/domain_synth.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: domain_synth.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: domain_synth.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -169,7 +169,7 @@ static GwyModuleInfo module_info = {
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, domain_synth)
 
 static gboolean
 module_register(void)
@@ -429,7 +429,7 @@ domain_synth_dialog(DomainSynthArgs *args,
                              gwy_dimensions_get_widget(controls.dims),
                              gtk_label_new(_("Dimensions")));
 
-    table = gtk_table_new(12 + (dfield_template ? 1 : 0), 4, FALSE);
+    table = gtk_table_new(12 + (dfield_template ? 1 : 0), 3, FALSE);
     controls.table = GTK_TABLE(table);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
@@ -439,28 +439,28 @@ domain_synth_dialog(DomainSynthArgs *args,
     row = 0;
 
     controls.preview_quantity = preview_quantity_selector_new(&controls);
-    gwy_table_attach_hscale(table, row, _("_Preview quantity:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Preview quantity:"), NULL,
                             GTK_OBJECT(controls.preview_quantity),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     gtk_table_attach(GTK_TABLE(table),
                      gwy_label_new_header(_("Simulation Parameters")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.niters = gtk_adjustment_new(args->niters, 1, 10000, 1, 10, 0);
     g_object_set_data(G_OBJECT(controls.niters), "target", &args->niters);
-    gwy_table_attach_hscale(table, row, _("_Number of iterations:"), NULL,
-                            GTK_OBJECT(controls.niters), GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(table, row, _("_Number of iterations:"), NULL,
+                            GTK_OBJECT(controls.niters), GWY_HSCALE_LOG);
     g_signal_connect_swapped(controls.niters, "value-changed",
                              G_CALLBACK(gwy_synth_int_changed), &controls);
     row++;
 
     controls.T = gtk_adjustment_new(args->T, 0.001, 5.0, 0.001, 0.1, 0);
     g_object_set_data(G_OBJECT(controls.T), "target", &args->T);
-    gwy_table_attach_hscale(table, row, _("_Temperature:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Temperature:"), NULL,
                             GTK_OBJECT(controls.T), GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.T, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
@@ -468,7 +468,7 @@ domain_synth_dialog(DomainSynthArgs *args,
 
     controls.B = gtk_adjustment_new(args->B, 0.001, 100.0, 0.1, 10, 0);
     g_object_set_data(G_OBJECT(controls.B), "target", &args->B);
-    gwy_table_attach_hscale(table, row, _("_Inhibitor strength:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Inhibitor strength:"), NULL,
                             GTK_OBJECT(controls.B), GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.B, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
@@ -476,7 +476,7 @@ domain_synth_dialog(DomainSynthArgs *args,
 
     controls.mu = gtk_adjustment_new(args->mu, 0.001, 100.0, 0.1, 10, 0);
     g_object_set_data(G_OBJECT(controls.mu), "target", &args->mu);
-    gwy_table_attach_hscale(table, row, _("In_hibitor coupling:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("In_hibitor coupling:"), NULL,
                             GTK_OBJECT(controls.mu), GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.mu, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
@@ -484,7 +484,7 @@ domain_synth_dialog(DomainSynthArgs *args,
 
     controls.nu = gtk_adjustment_new(args->nu, -5.0, 5.0, 0.001, 0.1, 0);
     g_object_set_data(G_OBJECT(controls.nu), "target", &args->nu);
-    gwy_table_attach_hscale(table, row, _("_Bias:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Bias:"), NULL,
                             GTK_OBJECT(controls.nu), GWY_HSCALE_DEFAULT);
     g_signal_connect_swapped(controls.nu, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
@@ -492,7 +492,7 @@ domain_synth_dialog(DomainSynthArgs *args,
 
     controls.dt = gtk_adjustment_new(args->dt, 0.001, 1000.0, 0.001, 1.0, 0);
     g_object_set_data(G_OBJECT(controls.dt), "target", &args->dt);
-    gwy_table_attach_hscale(table, row, _("_Monte Carlo time step:"), 
+    gwy_table_attach_adjbar(table, row, _("_Monte Carlo time step:"), 
                             "×10<sup>-3</sup>",
                             GTK_OBJECT(controls.dt), GWY_HSCALE_LOG);
     g_signal_connect_swapped(controls.dt, "value-changed",
@@ -511,11 +511,11 @@ domain_synth_dialog(DomainSynthArgs *args,
 
     if (dfield_template) {
         controls.height_init
-            = gtk_button_new_with_mnemonic(_("_Like Current Channel"));
+            = gtk_button_new_with_mnemonic(_("_Like Current Image"));
         g_signal_connect_swapped(controls.height_init, "clicked",
                                  G_CALLBACK(height_init_clicked), &controls);
         gtk_table_attach(GTK_TABLE(table), controls.height_init,
-                         1, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
     }
 
@@ -523,7 +523,7 @@ domain_synth_dialog(DomainSynthArgs *args,
     label = gtk_label_new(_("Output type:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     for (i = 0; i < QUANTITY_NTYPES; i++) {
@@ -534,7 +534,7 @@ domain_synth_dialog(DomainSynthArgs *args,
         g_object_set_data(G_OBJECT(controls.quantity[i]), "value",
                           GUINT_TO_POINTER(i));
         gtk_table_attach(GTK_TABLE(table), controls.quantity[i],
-                         0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         g_signal_connect(controls.quantity[i], "toggled",
                          G_CALLBACK(output_quantity_toggled), &controls);
         row++;
diff --git a/modules/process/drift.c b/modules/process/drift.c
index 3dd7aef..a61ef8f 100644
--- a/modules/process/drift.c
+++ b/modules/process/drift.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: drift.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: drift.c 20116 2017-07-31 10:28:57Z yeti-dn $
  *  Copyright (C) 2007,2008 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -163,7 +163,7 @@ static const DriftArgs drift_defaults = {
     FALSE,
     GWY_INTERPOLATION_BSPLINE,
     FALSE,
-    FALSE,
+    TRUE,
     GWY_APP_DATA_ID_NONE,
 };
 
@@ -179,7 +179,7 @@ static GwyModuleInfo module_info = {
     "2007",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, drift)
 
 static gboolean
 module_register(void)
@@ -276,7 +276,7 @@ drift_dialog(DriftArgs *args,
                  "si-unit-y", unit,
                  NULL);
 
-    table = gtk_table_new(11, 4, FALSE);
+    table = gtk_table_new(11, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -284,8 +284,9 @@ drift_dialog(DriftArgs *args,
     row = 0;
 
     controls.range = gtk_adjustment_new(args->range, 1.0, 50.0, 1.0, 5.0, 0);
-    gwy_table_attach_hscale(table, row, _("_Search range:"), _("rows"),
-                            controls.range, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("_Search range:"), _("rows"),
+                            controls.range,
+                            GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(controls.range, "value-changed",
                              G_CALLBACK(range_changed), &controls);
     row++;
@@ -294,7 +295,7 @@ drift_dialog(DriftArgs *args,
         = gwy_enum_combo_box_new(gwy_interpolation_type_get_enum(), -1,
                                  G_CALLBACK(gwy_enum_combo_box_update_int),
                                  &args->interp, args->interp, TRUE);
-    gwy_table_attach_hscale(table, row, _("_Interpolation type:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Interpolation type:"), NULL,
                             GTK_OBJECT(controls.interp),
                             GWY_HSCALE_WIDGET_NO_EXPAND);
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
@@ -305,7 +306,7 @@ drift_dialog(DriftArgs *args,
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.do_correct),
                                  args->do_correct);
     gtk_table_attach(GTK_TABLE(table), controls.do_correct,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.do_correct, "toggled",
                              G_CALLBACK(do_correct_changed), &controls);
     row++;
@@ -315,7 +316,7 @@ drift_dialog(DriftArgs *args,
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.exclude_linear),
                                  args->exclude_linear);
     gtk_table_attach(GTK_TABLE(table), controls.exclude_linear,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.exclude_linear, "toggled",
                              G_CALLBACK(exclude_linear_changed), &controls);
     row++;
@@ -325,7 +326,7 @@ drift_dialog(DriftArgs *args,
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.do_graph),
                                  args->do_graph);
     gtk_table_attach(GTK_TABLE(table), controls.do_graph,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.do_graph, "toggled",
                              G_CALLBACK(do_graph_changed), &controls);
     row++;
@@ -334,10 +335,6 @@ drift_dialog(DriftArgs *args,
     gtk_table_attach(GTK_TABLE(table), hbox2,
                      0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
 
-    label = gtk_label_new_with_mnemonic(_("Target _graph:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
-
     controls.target_graph = gwy_data_chooser_new_graphs();
     chooser = GWY_DATA_CHOOSER(controls.target_graph);
     gwy_data_chooser_set_none(chooser, _("New graph"));
@@ -345,9 +342,11 @@ drift_dialog(DriftArgs *args,
     gwy_data_chooser_set_filter(chooser, filter_target_graphs, &controls, NULL);
     gwy_data_chooser_set_active_id(chooser, &args->target_graph);
     gwy_data_chooser_get_active_id(chooser, &args->target_graph);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.target_graph);
-    gtk_widget_set_sensitive(hbox2, args->do_graph);
-    gtk_box_pack_end(GTK_BOX(hbox2), controls.target_graph, FALSE, FALSE, 0);
+    gwy_table_attach_adjbar(table, row, _("Target _graph:"), NULL,
+                            GTK_OBJECT(controls.target_graph),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    gwy_table_hscale_set_sensitive(GTK_OBJECT(controls.target_graph),
+                                   args->do_graph);
     g_signal_connect_swapped(controls.target_graph, "changed",
                              G_CALLBACK(target_graph_changed), &controls);
     row++;
@@ -356,7 +355,7 @@ drift_dialog(DriftArgs *args,
     label = gtk_label_new(_("Preview:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.preview_type
@@ -366,30 +365,32 @@ drift_dialog(DriftArgs *args,
                                     _("Drift _lines"), PREVIEW_MASK,
                                     NULL);
     row = gwy_radio_buttons_attach_to_table(controls.preview_type,
-                                            GTK_TABLE(table), 3, row);
+                                            GTK_TABLE(table), 2, row);
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
 
     controls.color_button = create_mask_color_button(controls.mydata, dialog,
                                                      0);
-    gwy_table_attach_hscale(table, row, _("_Mask color:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Mask color:"), NULL,
                             GTK_OBJECT(controls.color_button),
                             GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
-    controls.distribute = gtk_check_button_new_with_label(_("Distribute"));
+    controls.distribute
+        = gtk_check_button_new_with_mnemonic(_("_Apply to all "
+                                               "compatible images"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.distribute),
                                  args->distribute);
-    gtk_table_attach(GTK_TABLE(table), controls.distribute, 0, 3,
-                     row, row +1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), controls.distribute,
+                     0, 2, row, row +1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.distribute, "toggled",
                              G_CALLBACK(distribute_changed), &controls);
     row++;
 
-    controls.replace = gtk_check_button_new_with_label(_("Replace"));
+    controls.replace = gtk_check_button_new_with_label(_("Create new image"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.replace),
-                                 args->replace);
-    gtk_table_attach(GTK_TABLE(table), controls.replace, 0, 3,
-                     row, row +1, GTK_FILL, 0, 0, 0);
+                                 !args->replace);
+    gtk_table_attach(GTK_TABLE(table), controls.replace,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.replace, "toggled",
                              G_CALLBACK(replace_changed), &controls);
     row++;
@@ -660,7 +661,8 @@ do_graph_changed(DriftControls *controls,
 {
     DriftArgs *args = controls->args;
     args->do_graph = gtk_toggle_button_get_active(toggle);
-    gtk_widget_set_sensitive(controls->target_hbox, args->do_graph);
+    gwy_table_hscale_set_sensitive(GTK_OBJECT(controls->target_graph),
+                                   args->do_graph);
     update_target_graphs(controls);
     drift_invalidate(controls);
 }
@@ -693,7 +695,7 @@ static void
 replace_changed(DriftControls *controls,
                 GtkToggleButton *toggle)
 {
-    controls->args->replace = gtk_toggle_button_get_active(toggle);
+    controls->args->replace = !gtk_toggle_button_get_active(toggle);
     drift_invalidate(controls);
 }
 
diff --git a/modules/process/dwt.c b/modules/process/dwt.c
index cfb5e80..7d74229 100644
--- a/modules/process/dwt.c
+++ b/modules/process/dwt.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: dwt.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: dwt.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -77,7 +77,7 @@ static GwyModuleInfo module_info = {
     "2003",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, dwt)
 
 static gboolean
 module_register(void)
diff --git a/modules/process/dwtanisotropy.c b/modules/process/dwtanisotropy.c
index 746f6dd..acff5ef 100644
--- a/modules/process/dwtanisotropy.c
+++ b/modules/process/dwtanisotropy.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: dwtanisotropy.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: dwtanisotropy.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -54,9 +54,9 @@ static gboolean module_register             (void);
 static void     dwt_anisotropy              (GwyContainer *data,
                                              GwyRunType run);
 static gboolean dwt_anisotropy_dialog       (DWTAnisotropyArgs *args);
-static void     ratio_changed_cb            (GtkAdjustment *adj,
+static void     ratio_changed               (GtkAdjustment *adj,
                                              DWTAnisotropyArgs *args);
-static void     lowlimit_changed_cb         (GtkAdjustment *adj,
+static void     lowlimit_changed            (GtkAdjustment *adj,
                                              DWTAnisotropyArgs *args);
 static void     dwt_anisotropy_dialog_update(DWTAnisotropyControls *controls,
                                              DWTAnisotropyArgs *args);
@@ -79,12 +79,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("2D DWT anisotropy detection based on X/Y components ratio."),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "1.7",
+    "1.8",
     "David Nečas (Yeti) & Petr Klapetek",
     "2003",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, dwtanisotropy)
 
 static gboolean
 module_register(void)
@@ -176,9 +176,9 @@ dwt_anisotropy(GwyContainer *data, GwyRunType run)
 static gboolean
 dwt_anisotropy_dialog(DWTAnisotropyArgs *args)
 {
-    GtkWidget *dialog, *table;
+    GtkWidget *dialog, *table, *spin;
     DWTAnisotropyControls controls;
-    gint response;
+    gint response, row;
 
     dialog = gtk_dialog_new_with_buttons(_("2D DWT Anisotropy"), NULL, 0,
                                          _("_Reset"), RESPONSE_RESET,
@@ -188,41 +188,46 @@ dwt_anisotropy_dialog(DWTAnisotropyArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(2, 5, FALSE);
+    table = gtk_table_new(4, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table,
                        FALSE, FALSE, 4);
+    row = 0;
 
     controls.interp
         = gwy_enum_combo_box_new(gwy_interpolation_type_get_enum(), -1,
                                  G_CALLBACK(gwy_enum_combo_box_update_int),
                                  &args->interp, args->interp, TRUE);
-    gwy_table_attach_row(table, 1, _("_Interpolation type:"), "",
-                         controls.interp);
+    gwy_table_attach_adjbar(table, row, _("_Interpolation type:"), NULL,
+                            GTK_OBJECT(controls.interp),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    row++;
 
     controls.wavelet
         = gwy_enum_combo_box_new(gwy_dwt_type_get_enum(), -1,
                                  G_CALLBACK(gwy_enum_combo_box_update_int),
                                  &args->wavelet, args->wavelet, TRUE);
-    gwy_table_attach_row(table, 2, _("_Wavelet type:"), "", controls.wavelet);
-
-    controls.ratio = gtk_adjustment_new(args->ratio,
-                                        0.0001, 10.0, 1, 0.1, 0);
-    gwy_table_attach_spinbutton(table, 3,
-                                _("X/Y ratio threshold:"), NULL,
-                                controls.ratio);
+    gwy_table_attach_adjbar(table, row, _("_Wavelet type:"), NULL,
+                            GTK_OBJECT(controls.wavelet),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    row++;
+
+    controls.ratio = gtk_adjustment_new(args->ratio, 0.0001, 10.0, 1, 0.1, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("X/Y ratio threshold:"), NULL,
+                                   controls.ratio, GWY_HSCALE_LOG);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 4);
     g_signal_connect(controls.ratio, "value-changed",
-                     G_CALLBACK(ratio_changed_cb), args);
+                     G_CALLBACK(ratio_changed), args);
+    row++;
 
-    controls.lowlimit = gtk_adjustment_new(args->lowlimit,
-                                           1, 20, 1, 1, 0);
-    gwy_table_attach_spinbutton(table, 4,
-                                _("Low level exclude limit:"), NULL,
-                                controls.lowlimit);
+    controls.lowlimit = gtk_adjustment_new(args->lowlimit, 1, 20, 1, 1, 0);
+    gwy_table_attach_adjbar(table, row, _("Low level exclude limit:"), NULL,
+                            controls.lowlimit,
+                            GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_signal_connect(controls.lowlimit, "value-changed",
-                     G_CALLBACK(lowlimit_changed_cb), args);
+                     G_CALLBACK(lowlimit_changed), args);
 
     gtk_widget_show_all(dialog);
     do {
@@ -255,13 +260,13 @@ dwt_anisotropy_dialog(DWTAnisotropyArgs *args)
 }
 
 static void
-ratio_changed_cb(GtkAdjustment *adj, DWTAnisotropyArgs *args)
+ratio_changed(GtkAdjustment *adj, DWTAnisotropyArgs *args)
 {
     args->ratio = gtk_adjustment_get_value(adj);
 }
 
 static void
-lowlimit_changed_cb(GtkAdjustment *adj, DWTAnisotropyArgs *args)
+lowlimit_changed(GtkAdjustment *adj, DWTAnisotropyArgs *args)
 {
     args->lowlimit = gtk_adjustment_get_value(adj);
 }
diff --git a/modules/process/edge.c b/modules/process/edge.c
index 3cbf7ff..8c21658 100644
--- a/modules/process/edge.c
+++ b/modules/process/edge.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: edge.c 19216 2016-11-09 10:39:06Z yeti-dn $
+ *  @(#) $Id: edge.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2007,2012 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -148,7 +148,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, edge)
 
 static gboolean
 module_register(void)
@@ -660,7 +660,7 @@ zero_crossing_dialog(ZeroCrossingArgs *args,
     controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, FALSE);
     gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4);
 
-    table = gtk_table_new(7, 4, FALSE);
+    table = gtk_table_new(7, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -669,8 +669,8 @@ zero_crossing_dialog(ZeroCrossingArgs *args,
 
     adj = gtk_adjustment_new(args->gaussian_fwhm, 0.0, 20.0, 0.1, 1.0, 0);
     controls.gaussian_fwhm = adj;
-    gwy_table_attach_hscale(table, row, _("_Gaussian FWHM:"), "px", adj,
-                            GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("_Gaussian FWHM:"), _("px"),
+                            adj, GWY_HSCALE_SQRT);
     g_signal_connect(adj, "value-changed",
                      G_CALLBACK(zero_crossing_gaussian_fwhm_changed),
                      &controls);
@@ -678,8 +678,8 @@ zero_crossing_dialog(ZeroCrossingArgs *args,
 
     adj = gtk_adjustment_new(args->threshold, 0.0, 3.0, 0.01, 0.1, 0);
     controls.threshold = adj;
-    gwy_table_attach_hscale(table, row, _("_Threshold:"), _("NRMS"), adj,
-                            GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("_Threshold:"), _("NRMS"), adj,
+                            GWY_HSCALE_SQRT);
     g_signal_connect(adj, "value-changed",
                      G_CALLBACK(zero_crossing_threshold_changed), &controls);
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
@@ -688,7 +688,7 @@ zero_crossing_dialog(ZeroCrossingArgs *args,
     label = gtk_label_new(gwy_sgettext("verb|Display"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.display_group
@@ -699,14 +699,14 @@ zero_crossing_dialog(ZeroCrossingArgs *args,
                                     _("Detected st_ep"), DISPLAY_SHOW,
                                     NULL);
     row = gwy_radio_buttons_attach_to_table(controls.display_group,
-                                            GTK_TABLE(table), 3, row);
+                                            GTK_TABLE(table), 2, row);
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
 
     controls.update = gtk_check_button_new_with_mnemonic(_("I_nstant updates"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.update),
                                  args->update);
     gtk_table_attach(GTK_TABLE(table), controls.update,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls.update, "toggled",
                      G_CALLBACK(zero_crossing_update_changed), &controls);
 
diff --git a/modules/process/entropy.c b/modules/process/entropy.c
index 7074afe..751b99b 100644
--- a/modules/process/entropy.c
+++ b/modules/process/entropy.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: entropy.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: entropy.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2015 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -111,12 +111,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Visualizes entropy calculation for value and slope distribution."),
     "Yeti <yeti at gwyddion.net>",
-    "1.0",
+    "1.1",
     "David Nečas (Yeti)",
     "2015",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, entropy)
 
 static gboolean
 module_register(void)
@@ -190,7 +190,7 @@ entropy_dialog(EntropyArgs *args, GwyDataField *dfield, GwyDataField *mfield)
     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox,
                        TRUE, TRUE, 0);
 
-    table = gtk_table_new(8 + 4*(!!mfield), 4, FALSE);
+    table = gtk_table_new(8 + 4*(!!mfield), 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -208,12 +208,12 @@ entropy_dialog(EntropyArgs *args, GwyDataField *dfield, GwyDataField *mfield)
                                     ENTROPY_ANGLES,
                                     NULL);
     row = gwy_radio_buttons_attach_to_table(controls.mode,
-                                            GTK_TABLE(table), 3, row);
+                                            GTK_TABLE(table), 2, row);
     if (mfield) {
         gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
         label = gwy_label_new_header(_("Masking Mode"));
         gtk_table_attach(GTK_TABLE(table), label,
-                        0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                        0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
 
         controls.masking
@@ -221,7 +221,7 @@ entropy_dialog(EntropyArgs *args, GwyDataField *dfield, GwyDataField *mfield)
                                        G_CALLBACK(masking_changed), &controls,
                                        args->masking);
         row = gwy_radio_buttons_attach_to_table(controls.masking,
-                                                GTK_TABLE(table), 3, row);
+                                                GTK_TABLE(table), 2, row);
     }
     else
         controls.masking = NULL;
@@ -232,15 +232,15 @@ entropy_dialog(EntropyArgs *args, GwyDataField *dfield, GwyDataField *mfield)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.fit_plane),
                                  args->fit_plane);
     gtk_table_attach(GTK_TABLE(table), controls.fit_plane,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.fit_plane, "toggled",
                              G_CALLBACK(fit_plane_changed), &controls);
     row++;
 
     controls.kernel_size = gtk_adjustment_new(args->kernel_size,
                                               2, 16, 1, 4, 0);
-    gwy_table_attach_hscale(table, row, _("_Plane size:"), "px",
-                            controls.kernel_size, 0);
+    gwy_table_attach_adjbar(table, row, _("_Plane size:"), _("px"),
+                            controls.kernel_size, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls.kernel_size, "value-changed",
                              G_CALLBACK(kernel_size_changed), &controls);
     row++;
@@ -251,7 +251,7 @@ entropy_dialog(EntropyArgs *args, GwyDataField *dfield, GwyDataField *mfield)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.zoom_in),
                                  args->zoom_in);
     gtk_table_attach(GTK_TABLE(table), controls.zoom_in,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.zoom_in, "toggled",
                              G_CALLBACK(zoom_in_changed), &controls);
     row++;
@@ -259,22 +259,22 @@ entropy_dialog(EntropyArgs *args, GwyDataField *dfield, GwyDataField *mfield)
     label = gtk_label_new(_("Entropy:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
     label = gtk_label_new("");
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     2, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     1, 2, row, row+1, GTK_FILL, 0, 0, 0);
     controls.entropy = label;
     row++;
 
     label = gtk_label_new(_("Entropy deficit:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
     label = gtk_label_new("");
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     2, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     1, 2, row, row+1, GTK_FILL, 0, 0, 0);
     controls.entropydef = label;
     row++;
 
@@ -283,6 +283,7 @@ entropy_dialog(EntropyArgs *args, GwyDataField *dfield, GwyDataField *mfield)
     gmodel = gwy_graph_model_new();
     controls.graph = gwy_graph_new(gmodel);
     g_object_unref(gmodel);
+    gwy_graph_enable_user_input(GWY_GRAPH(controls.graph), FALSE);
     gtk_widget_set_size_request(controls.graph, 400, 320);
     gtk_box_pack_start(GTK_BOX(hbox), controls.graph, TRUE, TRUE, 0);
 
diff --git a/modules/process/extend.c b/modules/process/extend.c
index b51bcac..f647c1a 100644
--- a/modules/process/extend.c
+++ b/modules/process/extend.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: extend.c 18537 2016-03-28 18:11:19Z yeti-dn $
- *  Copyright (C) 2010-2014 David Necas (Yeti).
+ *  @(#) $Id: extend.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2010-2017 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -106,12 +106,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Extends image by adding borders."),
     "Yeti <yeti at gwyddion.net>",
-    "1.2",
+    "1.3",
     "David Nečas (Yeti)",
     "2012",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, extend)
 
 static gboolean
 module_register(void)
@@ -213,33 +213,33 @@ extend_dialog(ExtendArgs *args)
     /* Borders */
     label = gwy_label_new_header(_("Borders"));
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.up = gtk_adjustment_new(args->up, 0, EXTEND_MAX, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("_Up:"), "px",
-                            controls.up, GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(table, row, _("_Up:"), _("px"),
+                            controls.up, GWY_HSCALE_DEFAULT);
     g_signal_connect(controls.up, "value-changed",
                      G_CALLBACK(up_changed), &controls);
     row++;
 
     controls.down = gtk_adjustment_new(args->down, 0, EXTEND_MAX, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("_Down:"), "px",
-                            controls.down, GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(table, row, _("_Down:"), _("px"),
+                            controls.down, GWY_HSCALE_DEFAULT);
     g_signal_connect(controls.down, "value-changed",
                      G_CALLBACK(down_changed), &controls);
     row++;
 
     controls.left = gtk_adjustment_new(args->left, 0, EXTEND_MAX, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("_Left:"), "px",
-                            controls.left, GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(table, row, _("_Left:"), _("px"),
+                            controls.left, GWY_HSCALE_DEFAULT);
     g_signal_connect(controls.left, "value-changed",
                      G_CALLBACK(left_changed), &controls);
     row++;
 
     controls.right = gtk_adjustment_new(args->right, 0, EXTEND_MAX, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("_Right:"), "px",
-                            controls.right, GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(table, row, _("_Right:"), _("px"),
+                            controls.right, GWY_HSCALE_DEFAULT);
     g_signal_connect(controls.right, "value-changed",
                      G_CALLBACK(right_changed), &controls);
     row++;
@@ -249,7 +249,7 @@ extend_dialog(ExtendArgs *args)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.symmetrical),
                                  controls.is_symmetrical);
     gtk_table_attach(GTK_TABLE(table), controls.symmetrical,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls.symmetrical, "toggled",
                      G_CALLBACK(symmetrical_toggled), &controls);
     row++;
@@ -258,7 +258,7 @@ extend_dialog(ExtendArgs *args)
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gwy_label_new_header(_("Options"));
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.exterior
@@ -272,7 +272,7 @@ extend_dialog(ExtendArgs *args)
                                   gwy_sgettext("exterior|Periodic"),
                                   GWY_EXTERIOR_PERIODIC,
                                   NULL);
-    gwy_table_attach_hscale(table, row, _("_Exterior type:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Exterior type:"), NULL,
                             GTK_OBJECT(controls.exterior),
                             GWY_HSCALE_WIDGET_NO_EXPAND);
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
@@ -284,17 +284,17 @@ extend_dialog(ExtendArgs *args)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.keep_offsets),
                                  args->keep_offsets);
     gtk_table_attach(GTK_TABLE(table), controls.keep_offsets,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls.keep_offsets, "toggled",
                      G_CALLBACK(keep_offsets_toggled), &controls);
     row++;
 
     controls.new_channel
-        = gtk_check_button_new_with_mnemonic(_("Create new channel"));
+        = gtk_check_button_new_with_mnemonic(_("Create new image"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.new_channel),
                                  args->new_channel);
     gtk_table_attach(GTK_TABLE(table), controls.new_channel,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls.new_channel, "toggled",
                      G_CALLBACK(new_channel_toggled), &controls);
     row++;
diff --git a/modules/process/extract_path.c b/modules/process/extract_path.c
index 95f1d39..a0a90eb 100644
--- a/modules/process/extract_path.c
+++ b/modules/process/extract_path.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: extract_path.c 18886 2016-08-26 08:26:22Z yeti-dn $
+ *  @(#) $Id: extract_path.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -91,7 +91,7 @@ static GwyModuleInfo module_info = {
     "2016",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, extract_path)
 
 static gboolean
 module_register(void)
diff --git a/modules/process/facet-level.c b/modules/process/facet-level.c
index 304efb6..cc0412c 100644
--- a/modules/process/facet-level.c
+++ b/modules/process/facet-level.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: facet-level.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: facet-level.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004,2008 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -70,7 +70,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, facet_level)
 
 static gboolean
 module_register(void)
@@ -206,14 +206,14 @@ level_dialog(LevelArgs *args,
 
     label = gwy_label_new_header(_("Masking Mode"));
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.masking = gwy_radio_buttons_create(gwy_masking_type_get_enum(), -1,
                                                 G_CALLBACK(masking_changed),
                                                 &controls, args->masking);
     row = gwy_radio_buttons_attach_to_table(controls.masking, GTK_TABLE(table),
-                                            3, row);
+                                            2, row);
 
     gtk_widget_show_all(dialog);
     do {
diff --git a/modules/process/facet_analysis.c b/modules/process/facet_analysis.c
index fb58c24..8be86dd 100644
--- a/modules/process/facet_analysis.c
+++ b/modules/process/facet_analysis.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: facet_analysis.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: facet_analysis.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2015 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -35,6 +35,7 @@
 #include <libprocess/filters.h>
 #include <libprocess/grains.h>
 #include <libgwydgets/gwycombobox.h>
+#include <libgwydgets/gwyradiobuttons.h>
 #include <libgwymodule/gwymodule-process.h>
 #include <app/gwymoduleutils.h>
 #include <app/gwyapp.h>
@@ -73,7 +74,7 @@ typedef struct {
     GtkObject *tolerance;
     GtkObject *kernel_size;
     GtkWidget *combine;
-    GtkWidget *combine_type;
+    GSList *combine_type;
     GtkWidget *color_button;
     GwyContainer *mydata;
     GwyContainer *fdata;
@@ -112,10 +113,9 @@ static void     update_average_angle             (FacetsControls *controls,
 static void     preview_selection_updated        (GwySelection *selection,
                                                   gint id,
                                                   FacetsControls *controls);
-static void     combine_changed                  (GtkToggleButton *toggle,
-                                                  FacetsControls *controls);
-static void     combine_type_changed             (GtkComboBox *combo,
-                                                  FacetsControls *controls);
+static void     combine_changed                  (FacetsControls *controls,
+                                                  GtkToggleButton *toggle);
+static void     combine_type_changed             (FacetsControls *controls);
 static void     gwy_data_field_mark_facets       (GwyDataField *dtheta,
                                                   GwyDataField *dphi,
                                                   gdouble theta0,
@@ -163,12 +163,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Visualizes, marks and measures facet orientation."),
     "Yeti <yeti at gwyddion.net>",
-    "1.9",
+    "1.11",
     "David Nečas (Yeti) & Petr Klapetek",
     "2005",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, facet_analysis)
 
 static gboolean
 module_register(void)
@@ -227,7 +227,7 @@ add_angle_label(GtkWidget *table,
     GtkWidget *label;
     GtkRequisition req;
 
-    label = gtk_label_new("-188.00 deg");
+    label = gtk_label_new("-188.00");
     gtk_widget_size_request(label, &req);
 
     gtk_label_set_text(GTK_LABEL(label), name);
@@ -235,11 +235,16 @@ add_angle_label(GtkWidget *table,
     gtk_table_attach(GTK_TABLE(table), label,
                      0, 1, *row, *row+1, GTK_FILL, 0, 0, 0);
 
+    label = gtk_label_new(_("deg"));
+    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+    gtk_table_attach(GTK_TABLE(table), label,
+                     2, 3, *row, *row+1, GTK_FILL, 0, 0, 0);
+
     label = gtk_label_new(NULL);
     gtk_widget_set_size_request(label, req.width, -1);
     gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     1, 2, *row, *row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     1, 2, *row, *row+1, GTK_FILL, 0, 0, 0);
     (*row)++;
 
     return label;
@@ -255,7 +260,6 @@ facets_dialog(FacetsArgs *args,
               GQuark mquark)
 {
     GtkWidget *dialog, *table, *hbox, *hbox2, *vbox, *label, *scale, *button;
-    GtkWidget *spin;
     FacetsControls controls;
     gint response;
     GwySelection *selection;
@@ -314,7 +318,7 @@ facets_dialog(FacetsArgs *args,
 
 
     /* Info table */
-    table = gtk_table_new(7, 2, FALSE);
+    table = gtk_table_new(7, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -332,12 +336,12 @@ facets_dialog(FacetsArgs *args,
 
     button = gtk_button_new_with_mnemonic(_("_Find Maximum"));
     gtk_table_attach(GTK_TABLE(table), button,
-                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(button, "clicked",
                              G_CALLBACK(facet_view_reset_maximum), &controls);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
     row++;
 
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gwy_label_new_header(_("Mean Normal"));
     gtk_table_attach(GTK_TABLE(table), label,
                      0, 2, row, row+1, GTK_FILL, 0, 0, 0);
@@ -345,66 +349,45 @@ facets_dialog(FacetsArgs *args,
 
     controls.mtheta_label = add_angle_label(table, _("θ:"), &row);
     controls.mphi_label = add_angle_label(table, _("φ:"), &row);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
 
-    label = gtk_label_new_with_mnemonic(_("Facet plane size:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
-    row++;
+    table = gtk_table_new(5 + 1*(!!mfield), 3, FALSE);
+    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
+    gtk_table_set_col_spacings(GTK_TABLE(table), 6);
+    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
+    gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 4);
+    row = 0;
 
     controls.kernel_size = gtk_adjustment_new(args->kernel_size,
                                               0.0, MAX_PLANE_SIZE, 1.0, 1.0, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.kernel_size), 0.0, 0);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), spin);
-    gtk_table_attach(GTK_TABLE(table), spin,
-                     0, 1, row, row+1, 0, 0, 0, 0);
+    gwy_table_attach_adjbar(table, row, _("Facet plane size:"), _("px"),
+                            controls.kernel_size, GWY_HSCALE_LINEAR);
     g_signal_connect(controls.kernel_size, "value-changed",
                      G_CALLBACK(facet_view_recompute), &controls);
     row++;
 
-    table = gtk_table_new(4 + 2*(!!mfield), 4, FALSE);
-    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
-    gtk_table_set_col_spacings(GTK_TABLE(table), 6);
-    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
-    gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 4);
-    row = 0;
-
     controls.tolerance = gtk_adjustment_new(args->tolerance*180.0/G_PI,
                                             0.0, 15.0, 0.01, 0.1, 0);
-    scale = gwy_table_attach_hscale(table, row++, _("_Tolerance:"), _("deg"),
-                                    controls.tolerance, 0);
+    scale = gwy_table_attach_adjbar(table, row++, _("_Tolerance:"), _("deg"),
+                                    controls.tolerance, GWY_HSCALE_SQRT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(scale), 3);
     g_signal_connect(controls.tolerance, "value-changed",
                      G_CALLBACK(facets_tolerance_changed), &controls);
 
     if (mfield) {
         gwy_container_set_object_by_name(controls.fdata, "/1/mask", mfield);
-        controls.combine
-            = gtk_check_button_new_with_mnemonic(_("Com_bine with "
-                                                   "existing mask"));
-        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.combine),
-                                     args->combine);
-        gtk_table_attach(GTK_TABLE(table), controls.combine,
-                         0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-        g_signal_connect(controls.combine, "toggled",
-                         G_CALLBACK(combine_changed), &controls);
-        row++;
-
-        controls.combine_type
-            = gwy_enum_combo_box_new(gwy_merge_type_get_enum(), -1,
-                                     G_CALLBACK(combine_type_changed), &controls,
-                                     args->combine_type, TRUE);
-        gwy_table_attach_hscale(table, row, _("Operation:"), NULL,
-                                GTK_OBJECT(controls.combine_type),
-                                GWY_HSCALE_WIDGET);
-        gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+        create_mask_merge_buttons(table, row, NULL,
+                                  args->combine,
+                                  G_CALLBACK(combine_changed),
+                                  args->combine_type,
+                                  G_CALLBACK(combine_type_changed),
+                                  &controls,
+                                  &controls.combine, &controls.combine_type);
         row++;
     }
 
     controls.color_button = create_mask_color_button(controls.mydata, dialog,
                                                      0);
-    gwy_table_attach_hscale(table, row, _("_Mask color:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Mask color:"), NULL,
                             GTK_OBJECT(controls.color_button),
                             GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
@@ -417,7 +400,7 @@ facets_dialog(FacetsArgs *args,
         gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
         gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
         gtk_table_attach(GTK_TABLE(table), label,
-                         0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                         0, 3, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
     }
 
@@ -581,11 +564,11 @@ facet_view_selection_updated(GwySelection *selection,
     y = xy[1] - G_SQRT2/q;
     xy_to_angles(x, y, &theta, &phi);
 
-    g_snprintf(s, sizeof(s), "%.2f deg", 180.0/G_PI*theta);
+    g_snprintf(s, sizeof(s), "%.2f", 180.0/G_PI*theta);
     gtk_label_set_text(GTK_LABEL(controls->theta_label), s);
     controls->args->theta0 = theta;
 
-    g_snprintf(s, sizeof(s), "%.2f deg", 180.0/G_PI*phi);
+    g_snprintf(s, sizeof(s), "%.2f", 180.0/G_PI*phi);
     gtk_label_set_text(GTK_LABEL(controls->phi_label), s);
     controls->args->phi0 = phi;
 
@@ -614,9 +597,9 @@ update_average_angle(FacetsControls *controls,
                                                            "/0/mask"));
     calculate_average_angle(dtheta, dphi, mask, &theta, &phi);
 
-    g_snprintf(s, sizeof(s), "%.2f deg", 180.0/G_PI*theta);
+    g_snprintf(s, sizeof(s), "%.2f", 180.0/G_PI*theta);
     gtk_label_set_text(GTK_LABEL(controls->mtheta_label), s);
-    g_snprintf(s, sizeof(s), "%.2f deg", 180.0/G_PI*phi);
+    g_snprintf(s, sizeof(s), "%.2f", 180.0/G_PI*phi);
     gtk_label_set_text(GTK_LABEL(controls->mphi_label), s);
 }
 
@@ -691,21 +674,20 @@ gwy_data_field_mark_facets(GwyDataField *dtheta,
                            GwyDataField *mask)
 {
     gdouble cr, cth0, sth0, cro;
-    const gdouble *xd, *yd;
+    const gdouble *td, *fd;
     gdouble *md;
-    gint i;
+    guint i, n;
 
     cr = cos(tolerance);
     cth0 = cos(theta0);
     sth0 = sin(theta0);
 
-    xd = gwy_data_field_get_data_const(dtheta);
-    yd = gwy_data_field_get_data_const(dphi);
+    td = gwy_data_field_get_data_const(dtheta);
+    fd = gwy_data_field_get_data_const(dphi);
     md = gwy_data_field_get_data(mask);
-    for (i = gwy_data_field_get_xres(dtheta)*gwy_data_field_get_yres(dtheta);
-         i;
-         i--, xd++, yd++, md++) {
-        cro = cth0*cos(*xd) + sth0*sin(*xd)*cos(*yd - phi0);
+    n = gwy_data_field_get_xres(dtheta)*gwy_data_field_get_yres(dtheta);
+    for (i = n; i; i--, td++, fd++, md++) {
+        cro = cth0*cos(*td) + sth0*sin(*td)*cos(*fd - phi0);
         *md = (cro >= cr);
     }
 }
@@ -921,15 +903,16 @@ facets_tolerance_changed(GtkAdjustment *adj,
 }
 
 static void
-combine_changed(GtkToggleButton *toggle, FacetsControls *controls)
+combine_changed(FacetsControls *controls, GtkToggleButton *toggle)
 {
     controls->args->combine = gtk_toggle_button_get_active(toggle);
 }
 
 static void
-combine_type_changed(GtkComboBox *combo, FacetsControls *controls)
+combine_type_changed(FacetsControls *controls)
 {
-    controls->args->combine_type = gwy_enum_combo_box_get_active(combo);
+    controls->args->combine_type
+        = gwy_radio_buttons_get_current(controls->combine_type);
 }
 
 static void
diff --git a/modules/process/fbm_synth.c b/modules/process/fbm_synth.c
index a88abac..12f8afa 100644
--- a/modules/process/fbm_synth.c
+++ b/modules/process/fbm_synth.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: fbm_synth.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: fbm_synth.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -161,12 +161,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Generates random surfaces similar to fractional Brownian motion."),
     "Yeti <yeti at gwyddion.net>",
-    "1.0",
+    "1.1",
     "David Nečas (Yeti)",
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, fbm_synth)
 
 static gboolean
 module_register(void)
@@ -362,7 +362,7 @@ fbm_synth_dialog(FBMSynthArgs *args,
         g_signal_connect_swapped(controls.dims->add, "toggled",
                                  G_CALLBACK(fbm_synth_invalidate), &controls);
 
-    table = gtk_table_new(6 + (dfield_template ? 1 : 0), 4, FALSE);
+    table = gtk_table_new(6 + (dfield_template ? 1 : 0), 3, FALSE);
     controls.table = GTK_TABLE(table);
     gtk_table_set_row_spacings(controls.table, 2);
     gtk_table_set_col_spacings(controls.table, 6);
@@ -372,28 +372,28 @@ fbm_synth_dialog(FBMSynthArgs *args,
     row = 0;
 
     controls.H = gtk_adjustment_new(args->H, -0.999, 0.999, 0.001, 0.1, 0);
-    gwy_table_attach_hscale(table, row, _("_Hurst exponent:"), NULL,
-                            controls.H, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("_Hurst exponent:"), NULL,
+                            controls.H, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls.H, "value-changed",
                              G_CALLBACK(H_changed), &controls);
     row++;
 
     controls.hom_scale = gtk_adjustment_new(args->hom_scale,
                                             2, 8192, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("_Stationarity scale:"), "px",
+    gwy_table_attach_adjbar(table, row, _("_Stationarity scale:"), _("px"),
                             controls.hom_scale, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.hom_scale, "value-changed",
                              G_CALLBACK(hom_scale_changed), &controls);
     row++;
 
     controls.distribution = distribution_selector_new(&controls);
-    gwy_table_attach_hscale(table, row, _("_Distribution:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Distribution:"), NULL,
                             GTK_OBJECT(controls.distribution),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     controls.power = gtk_adjustment_new(args->power, 2.01, 12.0, 0.01, 0.1, 0);
-    gwy_table_attach_hscale(table, row, _("Po_wer:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("Po_wer:"), NULL,
                             controls.power, GWY_HSCALE_SQRT);
     gwy_table_hscale_set_sensitive(controls.power,
                                    args->distribution == FBM_DISTRIBUTION_POWER);
@@ -402,18 +402,17 @@ fbm_synth_dialog(FBMSynthArgs *args,
     row++;
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
-
     row = gwy_synth_attach_height(&controls, row,
                                   &controls.sigma, &args->sigma,
                                   _("_RMS:"), NULL, &controls.sigma_units);
 
     if (dfield_template) {
         controls.sigma_init
-            = gtk_button_new_with_mnemonic(_("_Like Current Channel"));
+            = gtk_button_new_with_mnemonic(_("_Like Current Image"));
         g_signal_connect_swapped(controls.sigma_init, "clicked",
                                  G_CALLBACK(sigma_init_clicked), &controls);
         gtk_table_attach(GTK_TABLE(table), controls.sigma_init,
-                         1, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
     }
 
diff --git a/modules/process/fft.c b/modules/process/fft.c
index f332cf5..1a57c9a 100644
--- a/modules/process/fft.c
+++ b/modules/process/fft.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: fft.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: fft.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2015 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -124,12 +124,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Two-dimensional FFT (Fast Fourier Transform)."),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "2.1",
+    "2.2",
     "David Nečas (Yeti) & Petr Klapetek",
     "2003",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, fft)
 
 static gboolean
 module_register(void)
@@ -340,7 +340,7 @@ fft_dialog(FFTArgs *args,
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(7, 4, FALSE);
+    table = gtk_table_new(7, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -351,7 +351,7 @@ fft_dialog(FFTArgs *args,
     controls.raw_transform
         = gtk_check_button_new_with_mnemonic(_("Ra_w transform"));
     gtk_table_attach(GTK_TABLE(table), controls.raw_transform,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.raw_transform),
                                  args->raw_transform);
     g_signal_connect(controls.raw_transform, "toggled",
@@ -363,15 +363,13 @@ fft_dialog(FFTArgs *args,
                                 fft_imgpart_filter, dfield, NULL);
     gwy_data_chooser_set_active_id(GWY_DATA_CHOOSER(controls.imgpart),
                                    &args->imgpart);
-    gwy_table_attach_hscale(table, row, _("I_maginary part:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("I_maginary part:"), NULL,
                             GTK_OBJECT(controls.imgpart),
-                            GWY_HSCALE_WIDGET | GWY_HSCALE_CHECK);
+                            GWY_HSCALE_WIDGET_NO_EXPAND | GWY_HSCALE_CHECK);
     controls.use_imgpart
         = gwy_table_hscale_get_check(GTK_OBJECT(controls.imgpart));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.use_imgpart),
                                  args->use_imgpart);
-    gwy_table_hscale_set_sensitive(GTK_OBJECT(controls.imgpart),
-                                   args->use_imgpart);
     g_signal_connect(controls.imgpart, "changed",
                      G_CALLBACK(imgpart_changed), args);
     g_signal_connect(controls.use_imgpart, "toggled",
@@ -381,7 +379,7 @@ fft_dialog(FFTArgs *args,
     controls.inverse_transform
         = gtk_check_button_new_with_mnemonic(_("_Inverse transform"));
     gtk_table_attach(GTK_TABLE(table), controls.inverse_transform,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.inverse_transform),
                                  args->inverse_transform);
     g_signal_connect(controls.inverse_transform, "toggled",
@@ -392,9 +390,9 @@ fft_dialog(FFTArgs *args,
         = gwy_enum_combo_box_new(fft_outputs, G_N_ELEMENTS(fft_outputs),
                                  G_CALLBACK(gwy_enum_combo_box_update_int),
                                  &args->out, args->out, TRUE);
-    gwy_table_attach_hscale(table, row, _("Output _type:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("Output _type:"), NULL,
                             GTK_OBJECT(controls.out),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
@@ -402,16 +400,16 @@ fft_dialog(FFTArgs *args,
         = gwy_enum_combo_box_new(gwy_windowing_type_get_enum(), -1,
                                  G_CALLBACK(gwy_enum_combo_box_update_int),
                                  &args->window, args->window, TRUE);
-    gwy_table_attach_hscale(table, row, _("_Windowing type:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Windowing type:"), NULL,
                             GTK_OBJECT(controls.window),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     controls.zeromean
         = gtk_check_button_new_with_mnemonic(_("Subtract mean _value "
                                                "beforehand"));
     gtk_table_attach(GTK_TABLE(table), controls.zeromean,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.zeromean),
                                  args->zeromean);
     g_signal_connect(controls.zeromean, "toggled",
@@ -421,7 +419,7 @@ fft_dialog(FFTArgs *args,
     controls.preserverms
         = gtk_check_button_new_with_mnemonic(_("_Preserve RMS"));
     gtk_table_attach(GTK_TABLE(table), controls.preserverms,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.preserverms),
                                  args->preserverms);
     g_signal_connect(controls.preserverms, "toggled",
diff --git a/modules/process/fft_filter_1d.c b/modules/process/fft_filter_1d.c
index 93a5726..b754a9c 100644
--- a/modules/process/fft_filter_1d.c
+++ b/modules/process/fft_filter_1d.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: fft_filter_1d.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: fft_filter_1d.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -30,6 +30,7 @@
 #include <libprocess/arithmetic.h>
 #include <libgwydgets/gwygraph.h>
 #include <libgwydgets/gwycombobox.h>
+#include <libgwydgets/gwystock.h>
 #include <libgwymodule/gwymodule-process.h>
 #include <app/gwymoduleutils.h>
 #include <app/gwyapp.h>
@@ -121,7 +122,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, fft_filter_1d)
 
 static gboolean
 module_register(void)
@@ -129,7 +130,7 @@ module_register(void)
     gwy_process_func_register("fft_filter_1d",
                               (GwyProcessFunc)&fftf_1d,
                               N_("/_Correct Data/1D _FFT Filtering..."),
-                              NULL,
+                              GWY_STOCK_FFT_FILTER_1D,
                               FFTF_1D_RUN_MODES,
                               GWY_MENU_FLAG_DATA,
                               N_("1D FFT Filtering"));
@@ -239,6 +240,7 @@ fftf_1d_dialog(Fftf1dArgs *args,
     controls.graph = gwy_graph_new(controls.gmodel);
     gwy_graph_set_status(GWY_GRAPH(controls.graph), GWY_GRAPH_STATUS_XSEL);
     gtk_widget_set_size_request(controls.graph, -1, PREVIEW_HALF_SIZE);
+    gwy_graph_enable_user_input(GWY_GRAPH(controls.graph), FALSE);
     gtk_box_pack_start(GTK_BOX(hbox), controls.graph, TRUE, TRUE, 4);
 
     area = GWY_GRAPH_AREA(gwy_graph_get_area(GWY_GRAPH(controls.graph)));
diff --git a/modules/process/fft_filter_2d.c b/modules/process/fft_filter_2d.c
index 5132304..fe64b59 100644
--- a/modules/process/fft_filter_2d.c
+++ b/modules/process/fft_filter_2d.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: fft_filter_2d.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  $Id: fft_filter_2d.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2005 Christopher Anderson, Molecular Imaging Corp.
  *  E-mail: Chris Anderson (sidewinder.asu at gmail.com)
  *  Copyright (C) 2011 David Necas (Yeti).
@@ -162,7 +162,7 @@ static GwyModuleInfo module_info = {
     "2005",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, fft_filter_2d)
 
 static gboolean
 module_register(void)
@@ -454,12 +454,12 @@ run_dialog(ControlsType *controls)
 
     label = gwy_label_new_header(_("Filter Mask"));
     gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     row++;
 
     hbox2 = gtk_hbox_new(FALSE, 0);
     gtk_table_attach(GTK_TABLE(table), hbox2, 0, 1, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
 
     /* MODE/SHAPE Buttons */
     group = NULL;
@@ -485,7 +485,7 @@ run_dialog(ControlsType *controls)
     /* Remaining controls: */
     hbox2 = gtk_vbox_new(FALSE, 0);
     gtk_table_attach(GTK_TABLE(table), hbox2, 1, 2, row, row+3,
-                     GTK_EXPAND | GTK_FILL, 0, 4, 0);
+                     GTK_FILL, 0, 4, 0);
 
     button = gwy_stock_like_button_new(_("_Undo"), GTK_STOCK_UNDO);
     gwy_sensitivity_group_add_widget(controls->sensgroup, button,
@@ -519,7 +519,7 @@ run_dialog(ControlsType *controls)
     gtk_tooltips_set_tip(tips, button,
                          g_hash_table_lookup(hash_tips, "origin"), NULL);
     gtk_table_attach(GTK_TABLE(table), button, 0, 1, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     set_toggled(button, controls->snap);
     g_signal_connect(button, "clicked", G_CALLBACK(snap_cb), controls);
 
@@ -529,7 +529,7 @@ run_dialog(ControlsType *controls)
 
     label = gwy_label_new_header(_("Preview Options"));
     gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     row++;
 
     label = gtk_label_new(_("Display:"));
@@ -540,7 +540,7 @@ run_dialog(ControlsType *controls)
 
     hbox2 = gtk_vbox_new(FALSE, 0);
     gtk_table_attach(GTK_TABLE(table), hbox2, 0, 1, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
 
     group = NULL;
     for (i = 0; i < G_N_ELEMENTS(prev_modes); i++) {
@@ -561,7 +561,7 @@ run_dialog(ControlsType *controls)
     /* Zoom */
     hbox2 = gtk_hbox_new(FALSE, 8);
     gtk_table_attach(GTK_TABLE(table), hbox2, 0, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     label = gtk_label_new(_("Zoom:"));
     gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
     gwy_sensitivity_group_add_widget(controls->sensgroup, label, SENS_EDIT);
@@ -585,13 +585,13 @@ run_dialog(ControlsType *controls)
     /* Output */
     label = gwy_label_new_header(_("Output Options"));
     gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     row++;
 
     label = gtk_label_new(_("Output type:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 2);
+                     GTK_FILL, 0, 0, 2);
     row++;
 
     for (i = 0; i < G_N_ELEMENTS(out_modes); i++) {
@@ -601,7 +601,7 @@ run_dialog(ControlsType *controls)
         if (controls->out_mode & out_modes[i].out_mode)
             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE);
         gtk_table_attach(GTK_TABLE(table), check, 0, 2, row, row+1,
-                         GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                         GTK_FILL, 0, 0, 0);
         g_signal_connect(check, "toggled",
                          G_CALLBACK(out_mode_changed), controls);
         row++;
diff --git a/modules/process/fft_profile.c b/modules/process/fft_profile.c
index 75b748e..0effcbe 100644
--- a/modules/process/fft_profile.c
+++ b/modules/process/fft_profile.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: fft_profile.c 18626 2016-04-22 10:15:13Z yeti-dn $
+ *  @(#) $Id: fft_profile.c 20063 2017-07-11 11:03:01Z yeti-dn $
  *  Copyright (C) 2009 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -70,7 +70,6 @@ typedef struct {
     GwyGraphModel *gmodel;
     GtkWidget *separate;
     GtkWidget *target_graph;
-    GtkWidget *target_hbox;
     GwyContainer *mydata;
 } ProfControls;
 
@@ -125,12 +124,12 @@ static GwyModuleInfo module_info = {
     N_("Reads radial sections of two-dimensional power spectrum density "
        "function."),
     "Yeti <yeti at gwyddion.net>",
-    "1.3",
+    "1.4",
     "David Nečas (Yeti)",
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, fft_profile)
 
 static gboolean
 module_register(void)
@@ -171,7 +170,7 @@ prof_dialog(ProfArgs *args,
             GwyDataField *dfield,
             gint id)
 {
-    GtkWidget *hbox, *hbox2, *vbox, *label;
+    GtkWidget *hbox, *vbox;
     GwyDataChooser *chooser;
     GtkTable *table;
     GtkDialog *dialog;
@@ -253,7 +252,7 @@ prof_dialog(ProfArgs *args,
     gwy_graph_area_enable_user_input(area, FALSE);
     gtk_box_pack_start(GTK_BOX(vbox), controls.graph, TRUE, TRUE, 0);
 
-    table = GTK_TABLE(gtk_table_new(4, 4, FALSE));
+    table = GTK_TABLE(gtk_table_new(4, 3, FALSE));
     gtk_table_set_row_spacings(table, 2);
     gtk_table_set_col_spacings(table, 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -263,7 +262,8 @@ prof_dialog(ProfArgs *args,
     controls.resolution = gtk_adjustment_new(controls.args->resolution,
                                              MIN_RESOLUTION, MAX_RESOLUTION,
                                              1, 10, 0);
-    gwy_table_attach_hscale(GTK_WIDGET(table), row, _("_Fix res.:"), NULL,
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row,
+                            _("_Fixed resolution:"), NULL,
                             controls.resolution,
                             GWY_HSCALE_CHECK | GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.resolution, "value-changed",
@@ -273,44 +273,28 @@ prof_dialog(ProfArgs *args,
                                  controls.args->fixres);
     g_signal_connect_swapped(controls.fixres, "toggled",
                              G_CALLBACK(prof_fixres_changed), &controls);
-    gwy_table_hscale_set_sensitive(controls.resolution, controls.args->fixres);
     row++;
 
     controls.separate = gtk_check_button_new_with_mnemonic(_("_Separate curves"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.separate),
                                  args->separate);
     gtk_table_attach(table, controls.separate,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.separate, "toggled",
                              G_CALLBACK(prof_separate_changed), &controls);
     row++;
 
-    hbox2 = gtk_hbox_new(FALSE, 6);
-    gtk_table_attach(table, hbox2,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    label = gtk_label_new_with_mnemonic(_("_Interpolation type:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
-
     controls.interpolation
         = gwy_enum_combo_box_new(gwy_interpolation_type_get_enum(), -1,
                                  G_CALLBACK(prof_interpolation_changed),
                                  &controls,
                                  controls.args->interpolation, TRUE);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.interpolation);
-    gtk_box_pack_end(GTK_BOX(hbox2), controls.interpolation, FALSE, FALSE, 0);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row,
+                            _("_Interpolation type:"), NULL,
+                            GTK_OBJECT(controls.interpolation),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
-    controls.target_hbox = hbox2 = gtk_hbox_new(FALSE, 6);
-    gtk_widget_set_sensitive(hbox2, !args->separate);
-    gtk_table_attach(GTK_TABLE(table), hbox2,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    label = gtk_label_new_with_mnemonic(_("Target _graph:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
-
     controls.target_graph = gwy_data_chooser_new_graphs();
     chooser = GWY_DATA_CHOOSER(controls.target_graph);
     gwy_data_chooser_set_none(chooser, _("New graph"));
@@ -318,8 +302,10 @@ prof_dialog(ProfArgs *args,
     gwy_data_chooser_set_filter(chooser, filter_target_graphs, &controls, NULL);
     gwy_data_chooser_set_active_id(chooser, &args->target_graph);
     gwy_data_chooser_get_active_id(chooser, &args->target_graph);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.target_graph);
-    gtk_box_pack_end(GTK_BOX(hbox2), controls.target_graph, FALSE, FALSE, 0);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row,
+                            _("Target _graph:"), NULL,
+                            GTK_OBJECT(controls.target_graph),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     g_signal_connect_swapped(controls.target_graph, "changed",
                              G_CALLBACK(target_graph_changed), &controls);
     row++;
@@ -388,7 +374,8 @@ prof_separate_changed(ProfControls *controls)
     ProfArgs *args = controls->args;
     args->separate
         = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(controls->separate));
-    gtk_widget_set_sensitive(controls->target_hbox, !args->separate);
+    gwy_table_hscale_set_sensitive(GTK_OBJECT(controls->target_graph),
+                                   !args->separate);
     update_target_graphs(controls);
 }
 
diff --git a/modules/process/fft_synth.c b/modules/process/fft_synth.c
index dbcbe4d..14490ce 100644
--- a/modules/process/fft_synth.c
+++ b/modules/process/fft_synth.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: fft_synth.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: fft_synth.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2007,2009,2010,2013 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -178,12 +178,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Generates random surfaces using spectral synthesis."),
     "Yeti <yeti at gwyddion.net>",
-    "1.5",
+    "1.6",
     "David Nečas (Yeti)",
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, fft_synth)
 
 static gboolean
 module_register(void)
@@ -400,7 +400,7 @@ fft_synth_dialog(FFTSynthArgs *args,
         g_signal_connect_swapped(controls.dims->add, "toggled",
                                  G_CALLBACK(fft_synth_invalidate), &controls);
 
-    table = gtk_table_new(14 + (dfield_template ? 1 : 0), 5, FALSE);
+    table = gtk_table_new(14 + (dfield_template ? 1 : 0), 3, FALSE);
     controls.table = GTK_TABLE(table);
     gtk_table_set_row_spacings(controls.table, 2);
     gtk_table_set_col_spacings(controls.table, 6);
@@ -415,19 +415,19 @@ fft_synth_dialog(FFTSynthArgs *args,
 
     if (dfield_template) {
         controls.sigma_init
-            = gtk_button_new_with_mnemonic(_("_Like Current Channel"));
+            = gtk_button_new_with_mnemonic(_("_Like Current Image"));
         g_signal_connect_swapped(controls.sigma_init, "clicked",
                                  G_CALLBACK(sigma_init_clicked), &controls);
         gtk_table_attach(GTK_TABLE(table), controls.sigma_init,
-                         1, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
     }
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
 
     controls.freq_min = gtk_adjustment_new(args->freq_min,
                                            0.0, G_SQRT2*G_PI, 0.001, 0.1, 0);
-    gwy_table_attach_hscale(table, row, _("M_inimum frequency:"),
-                            "px<sup>-1</sup>",
+    gwy_table_attach_adjbar(table, row,
+                            _("M_inimum frequency:"), _("px<sup>-1</sup>"),
                             controls.freq_min, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.freq_min, "value-changed",
                              G_CALLBACK(freq_min_changed), &controls);
@@ -436,18 +436,18 @@ fft_synth_dialog(FFTSynthArgs *args,
     controls.freq_min_value = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(controls.freq_min_value), 1.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), controls.freq_min_value,
-                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     1, 2, row, row+1, GTK_FILL, 0, 0, 0);
 
     controls.freq_min_units = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(controls.freq_min_units), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), controls.freq_min_units,
-                     3, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.freq_max = gtk_adjustment_new(args->freq_max,
                                            0.0, G_SQRT2*G_PI, 0.001, 0.1, 0);
-    gwy_table_attach_hscale(table, row, _("Ma_ximum frequency:"),
-                            "px<sup>-1</sup>",
+    gwy_table_attach_adjbar(table, row,
+                            _("Ma_ximum frequency:"), _("px<sup>-1</sup>"),
                             controls.freq_max, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.freq_max, "value-changed",
                              G_CALLBACK(freq_max_changed), &controls);
@@ -456,12 +456,12 @@ fft_synth_dialog(FFTSynthArgs *args,
     controls.freq_max_value = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(controls.freq_max_value), 1.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), controls.freq_max_value,
-                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     1, 2, row, row+1, GTK_FILL, 0, 0, 0);
 
     controls.freq_max_units = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(controls.freq_max_units), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), controls.freq_max_units,
-                     3, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
     row++;
 
@@ -470,7 +470,7 @@ fft_synth_dialog(FFTSynthArgs *args,
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.gauss_enable),
                                  args->gauss_enable);
     gtk_table_attach(GTK_TABLE(table), controls.gauss_enable,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.gauss_enable, "toggled",
                              G_CALLBACK(gauss_enable_changed), &controls);
     row++;
@@ -493,7 +493,7 @@ fft_synth_dialog(FFTSynthArgs *args,
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.lorentz_enable),
                                  args->lorentz_enable);
     gtk_table_attach(GTK_TABLE(table), controls.lorentz_enable,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.lorentz_enable, "toggled",
                              G_CALLBACK(lorentz_enable_changed), &controls);
     row++;
@@ -523,7 +523,7 @@ fft_synth_dialog(FFTSynthArgs *args,
 
     controls.power_p = gtk_adjustment_new(args->power_p,
                                           0.0, 5.0, 0.01, 0.1, 0);
-    spin = gwy_table_attach_hscale(table, row, _("Po_wer:"), NULL,
+    spin = gwy_table_attach_adjbar(table, row, _("Po_wer:"), NULL,
                                    controls.power_p, 0);
     gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(spin), FALSE);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
@@ -843,7 +843,7 @@ fft_synth_do(const FFTSynthArgs *args,
         gdouble y = (i <= yres/2 ? i : yres-i)/(0.5*yres);
         for (j = 0; j < xres; j++) {
             gdouble x = (j <= xres/2 ? j : xres-j)/(0.5*xres);
-            gdouble r = hypot(x, y);
+            gdouble r = sqrt(x*x + y*y);
 
             if (r < freq_min || r > freq_max) {
                 /* XXX: This is necessary for stability! */
diff --git a/modules/process/fibre_synth.c b/modules/process/fibre_synth.c
new file mode 100644
index 0000000..627119f
--- /dev/null
+++ b/modules/process/fibre_synth.c
@@ -0,0 +1,1617 @@
+/*
+ *  @(#) $Id: fibre_synth.c 20267 2017-08-14 11:07:02Z yeti-dn $
+ *  Copyright (C) 2009-2017 David Necas (Yeti).
+ *  E-mail: yeti at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <string.h>
+#include <gtk/gtk.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libgwyddion/gwyrandgenset.h>
+#include <libprocess/stats.h>
+#include <libprocess/arithmetic.h>
+#include <libprocess/spline.h>
+#include <libgwydgets/gwystock.h>
+#include <libgwymodule/gwymodule-process.h>
+#include <app/gwyapp.h>
+#include "dimensions.h"
+#include "preview.h"
+
+#define FIBRE_SYNTH_RUN_MODES (GWY_RUN_IMMEDIATE | GWY_RUN_INTERACTIVE)
+
+/* Large spline oversampling is OK because straight segments converge very
+ * quickly so we only get substantial oversampling in sharp turns – and we want
+ * it there. */
+#define OVERSAMPLE 12.0
+
+/* Always consume this many random numbers from RNG_DEFORM when creating
+ * a spline for generator stability. */
+enum {
+    FIBRE_MAX_POINTS = 80,
+};
+
+enum {
+    PAGE_DIMENSIONS = 0,
+    PAGE_GENERATOR  = 1,
+    PAGE_PLACEMENT  = 2,
+    PAGE_NPAGES
+};
+
+typedef enum {
+    RNG_WIDTH,
+    RNG_HEIGHT,
+    RNG_POSITION,
+    RNG_ANGLE,
+    RNG_HTRUNC,
+    RNG_DEFORM,
+    RNG_SEGVAR,
+    RNG_NRNGS
+} FibreSynthRng;
+
+typedef enum {
+    FIBRE_SYNTH_CIRCLE    = 0,
+    FIBRE_SYNTH_TRIANGLE  = 1,
+    FIBRE_SYNTH_SQUARE    = 2,
+    FIBRE_SYNTH_PARABOLA  = 3,
+    FIBRE_SYNTH_QUADRATIC = 4,
+    FIBRE_SYNTH_NTYPES
+} FibreSynthType;
+
+typedef struct _FibreSynthControls FibreSynthControls;
+
+typedef struct {
+    guint size;
+    guint len;
+    gint *data;
+} IntList;
+
+typedef struct {
+    gdouble u;
+    gdouble wfactor;
+    gdouble hfactor;
+} FibreSegmentVar;
+
+typedef gdouble (*FibreShapeFunc)(gdouble v);
+
+/* This scheme makes the object type list easily reordeable in the GUI without
+ * changing the ids.  */
+typedef struct {
+    FibreSynthType type;
+    const gchar *name;
+} FibreSynthFeature;
+
+typedef struct {
+    gint active_page;
+    gint seed;
+    gboolean randomize;
+    gboolean update;
+    FibreSynthType type;
+    gdouble coverage;
+    gdouble width;
+    gdouble width_noise;
+    gdouble width_var;
+    gdouble height;
+    gboolean height_bound;
+    gdouble height_noise;
+    gdouble height_var;
+    gdouble htrunc;
+    gdouble htrunc_noise;
+    gdouble angle;
+    gdouble angle_noise;
+    gdouble latdeform;
+    gdouble latdeform_noise;
+    gdouble lendeform;
+    gdouble lendeform_noise;
+    gdouble deform_density;
+} FibreSynthArgs;
+
+struct _FibreSynthControls {
+    FibreSynthArgs *args;
+    GwyDimensions *dims;
+    GwyRandGenSet *rngset;
+    GtkWidget *dialog;
+    GtkWidget *view;
+    GtkWidget *update;
+    GtkWidget *update_now;
+    GtkObject *seed;
+    GtkWidget *randomize;
+    GtkTable *table;
+    GtkWidget *type;
+    GtkObject *coverage;
+    GtkWidget *coverage_value;
+    GtkWidget *coverage_units;
+    GtkObject *width;
+    GtkWidget *width_value;
+    GtkWidget *width_units;
+    GtkObject *width_noise;
+    GtkObject *width_var;
+    GtkObject *height;
+    GtkWidget *height_units;
+    GtkWidget *height_init;
+    GtkWidget *height_bound;
+    GtkObject *height_noise;
+    GtkObject *height_var;
+    GtkObject *htrunc;
+    GtkObject *htrunc_noise;
+    GtkObject *angle;
+    GtkObject *angle_noise;
+    GtkObject *latdeform;
+    GtkObject *latdeform_noise;
+    GtkObject *lendeform;
+    GtkObject *lendeform_noise;
+    GtkObject *deform_density;
+    GwyContainer *mydata;
+    GwyDataField *surface;
+    gdouble pxsize;
+    gdouble zscale;
+    gboolean in_init;
+    gulong sid;
+};
+
+static gboolean   module_register       (void);
+static void       fibre_synth           (GwyContainer *data,
+                                         GwyRunType run);
+static void       run_noninteractive    (FibreSynthArgs *args,
+                                         const GwyDimensionArgs *dimsargs,
+                                         GwyRandGenSet *rngset,
+                                         GwyContainer *data,
+                                         GwyDataField *dfield,
+                                         gint oldid,
+                                         GQuark quark);
+static gboolean   fibre_synth_dialog    (FibreSynthArgs *args,
+                                         GwyDimensionArgs *dimsargs,
+                                         GwyRandGenSet *rngset,
+                                         GwyContainer *data,
+                                         GwyDataField *dfield,
+                                         gint id);
+static GtkWidget* shape_selector_new    (FibreSynthControls *controls);
+static void       update_controls       (FibreSynthControls *controls,
+                                         FibreSynthArgs *args);
+static void       page_switched         (FibreSynthControls *controls,
+                                         GtkNotebookPage *page,
+                                         gint pagenum);
+static void       update_values         (FibreSynthControls *controls);
+static void       shape_selected        (GtkComboBox *combo,
+                                         FibreSynthControls *controls);
+static void       height_init_clicked   (FibreSynthControls *controls);
+static void       update_coverage_value (FibreSynthControls *controls);
+static gint       attach_deformation    (FibreSynthControls *controls,
+                                         const gchar *name,
+                                         gint row,
+                                         GtkObject **adj,
+                                         gdouble *target);
+static gint       attach_segvar         (FibreSynthControls *controls,
+                                         gint row,
+                                         GtkObject **adj,
+                                         gdouble *target);
+static void       fibre_synth_invalidate(FibreSynthControls *controls);
+static gboolean   preview_gsource       (gpointer user_data);
+static void       preview               (FibreSynthControls *controls);
+static gboolean   fibre_synth_do        (const FibreSynthArgs *args,
+                                         const GwyDimensionArgs *dimsargs,
+                                         GwyRandGenSet *rngset,
+                                         GwyDataField *dfield,
+                                         GwySetMessageFunc set_message,
+                                         GwySetFractionFunc set_fraction);
+static void       fibre_synth_add_one   (GwyDataField *surface,
+                                         GwyDataField *fibre,
+                                         GwyDataField *ucoord,
+                                         IntList *usedpts,
+                                         GwySpline *spline,
+                                         GArray *segvar,
+                                         const FibreSynthArgs *args,
+                                         const GwyDimensionArgs *dimsargs,
+                                         GwyRandGenSet *rngset);
+static glong      calculate_n_fibres    (const FibreSynthArgs *args,
+                                         guint xres,
+                                         guint yres);
+static void       fibre_synth_load_args (GwyContainer *container,
+                                         FibreSynthArgs *args,
+                                         GwyDimensionArgs *dimsargs);
+static void       fibre_synth_save_args (GwyContainer *container,
+                                         const FibreSynthArgs *args,
+                                         const GwyDimensionArgs *dimsargs);
+
+#define GWY_SYNTH_CONTROLS FibreSynthControls
+#define GWY_SYNTH_INVALIDATE(controls) \
+    update_coverage_value(controls); \
+    fibre_synth_invalidate(controls)
+
+#include "synth.h"
+
+static const FibreSynthArgs fibre_synth_defaults = {
+    PAGE_DIMENSIONS,
+    42, TRUE, TRUE,
+    FIBRE_SYNTH_CIRCLE,
+    0.5,
+    5.0, 0.0, 0.0,
+    1.0, TRUE, 0.0, 0.0,
+    1.0, 0.0,
+    0.0, 0.0,
+    0.1, 0.0,
+    0.05, 0.0,
+    5.0,
+};
+
+static const GwyDimensionArgs dims_defaults = GWY_DIMENSION_ARGS_INIT;
+
+static const FibreSynthFeature features[] = {
+    { FIBRE_SYNTH_CIRCLE,    N_("Semi-circle"),      },
+    { FIBRE_SYNTH_TRIANGLE,  N_("Triangle"),         },
+    { FIBRE_SYNTH_SQUARE,    N_("Rectangle"),        },
+    { FIBRE_SYNTH_PARABOLA,  N_("Parabola"),         },
+    { FIBRE_SYNTH_QUADRATIC, N_("Quadratic spline"), },
+};
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION,
+    &module_register,
+    N_("Generates surfaces composed from randomly placed fibers."),
+    "Yeti <yeti at gwyddion.net>",
+    "1.0",
+    "David Nečas (Yeti)",
+    "2017",
+};
+
+GWY_MODULE_QUERY2(module_info, fibre_synth)
+
+static gboolean
+module_register(void)
+{
+    gwy_process_func_register("fibre_synth",
+                              (GwyProcessFunc)&fibre_synth,
+                              N_("/S_ynthetic/_Deposition/_Fibers..."),
+                              GWY_STOCK_SYNTHETIC_FIBRES,
+                              FIBRE_SYNTH_RUN_MODES,
+                              0,
+                              N_("Generate surface of randomly placed fibers"));
+
+    return TRUE;
+}
+
+static void
+fibre_synth(GwyContainer *data, GwyRunType run)
+{
+    FibreSynthArgs args;
+    GwyDimensionArgs dimsargs;
+    GwyRandGenSet *rngset;
+    GwyDataField *dfield;
+    GQuark quark;
+    gint id;
+
+    g_return_if_fail(run & FIBRE_SYNTH_RUN_MODES);
+    fibre_synth_load_args(gwy_app_settings_get(), &args, &dimsargs);
+    gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &dfield,
+                                     GWY_APP_DATA_FIELD_ID, &id,
+                                     GWY_APP_DATA_FIELD_KEY, &quark,
+                                     0);
+
+    rngset = gwy_rand_gen_set_new(RNG_NRNGS);
+    if (run == GWY_RUN_IMMEDIATE
+        || fibre_synth_dialog(&args, &dimsargs, rngset, data, dfield, id))
+        run_noninteractive(&args, &dimsargs, rngset, data, dfield, id, quark);
+
+    if (run == GWY_RUN_INTERACTIVE)
+        fibre_synth_save_args(gwy_app_settings_get(), &args, &dimsargs);
+
+    gwy_rand_gen_set_free(rngset);
+    gwy_dimensions_free_args(&dimsargs);
+}
+
+static void
+run_noninteractive(FibreSynthArgs *args,
+                   const GwyDimensionArgs *dimsargs,
+                   GwyRandGenSet *rngset,
+                   GwyContainer *data,
+                   GwyDataField *dfield,
+                   gint oldid,
+                   GQuark quark)
+{
+    GwyDataField *newfield;
+    GwySIUnit *siunit;
+    gboolean replace = dimsargs->replace && dfield;
+    gboolean add = dimsargs->add && dfield;
+    gboolean ok;
+    gint newid;
+
+    if (args->randomize)
+        args->seed = g_random_int() & 0x7fffffff;
+
+    if (add || replace) {
+        if (add)
+            newfield = gwy_data_field_duplicate(dfield);
+        else
+            newfield = gwy_data_field_new_alike(dfield, TRUE);
+    }
+    else {
+        gdouble mag = pow10(dimsargs->xypow10) * dimsargs->measure;
+        newfield = gwy_data_field_new(dimsargs->xres, dimsargs->yres,
+                                      mag*dimsargs->xres, mag*dimsargs->yres,
+                                      TRUE);
+
+        siunit = gwy_data_field_get_si_unit_xy(newfield);
+        gwy_si_unit_set_from_string(siunit, dimsargs->xyunits);
+
+        siunit = gwy_data_field_get_si_unit_z(newfield);
+        gwy_si_unit_set_from_string(siunit, dimsargs->zunits);
+    }
+
+    gwy_app_wait_start(gwy_app_find_window_for_channel(data, oldid),
+                       _("Initializing..."));
+    ok = fibre_synth_do(args, dimsargs, rngset, newfield,
+                        gwy_app_wait_set_message, gwy_app_wait_set_fraction);
+    gwy_app_wait_finish();
+
+    if (!ok) {
+        g_object_unref(newfield);
+        return;
+    }
+
+    if (replace) {
+        gwy_app_undo_qcheckpointv(data, 1, &quark);
+        gwy_container_set_object(data, gwy_app_get_data_key_for_id(oldid),
+                                 newfield);
+        gwy_app_channel_log_add_proc(data, oldid, oldid);
+        g_object_unref(newfield);
+        newid = oldid;
+    }
+    else {
+        if (data) {
+            newid = gwy_app_data_browser_add_data_field(newfield, data, TRUE);
+            if (oldid != -1)
+                gwy_app_sync_data_items(data, data, oldid, newid, FALSE,
+                                        GWY_DATA_ITEM_GRADIENT,
+                                        0);
+        }
+        else {
+            newid = 0;
+            data = gwy_container_new();
+            gwy_container_set_object(data, gwy_app_get_data_key_for_id(newid),
+                                     newfield);
+            gwy_app_data_browser_add(data);
+            gwy_app_data_browser_reset_visibility(data,
+                                                  GWY_VISIBILITY_RESET_SHOW_ALL);
+            g_object_unref(data);
+        }
+
+        gwy_app_set_data_field_title(data, newid, _("Generated"));
+        gwy_app_channel_log_add_proc(data, add ? oldid : -1, newid);
+        g_object_unref(newfield);
+    }
+}
+
+static gboolean
+fibre_synth_dialog(FibreSynthArgs *args,
+                   GwyDimensionArgs *dimsargs,
+                   GwyRandGenSet *rngset,
+                   GwyContainer *data,
+                   GwyDataField *dfield_template,
+                   gint id)
+{
+    GtkWidget *dialog, *table, *vbox, *hbox, *notebook;
+    FibreSynthControls controls;
+    GwyDataField *dfield;
+    gboolean finished;
+    gint response;
+    gint row;
+
+    gwy_clear(&controls, 1);
+    controls.in_init = TRUE;
+    controls.args = args;
+    controls.rngset = rngset;
+    controls.pxsize = 1.0;
+    dialog = gtk_dialog_new_with_buttons(_("Random Fibers"),
+                                         NULL, 0,
+                                         _("_Reset"), RESPONSE_RESET,
+                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                         GTK_STOCK_OK, GTK_RESPONSE_OK,
+                                         NULL);
+    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
+    gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
+    controls.dialog = dialog;
+
+    hbox = gtk_hbox_new(FALSE, 2);
+    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox,
+                       FALSE, FALSE, 4);
+
+    vbox = gtk_vbox_new(FALSE, 4);
+    gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 4);
+
+    controls.mydata = gwy_container_new();
+    dfield = gwy_data_field_new(PREVIEW_SIZE, PREVIEW_SIZE,
+                                dimsargs->measure*PREVIEW_SIZE,
+                                dimsargs->measure*PREVIEW_SIZE,
+                                TRUE);
+    gwy_container_set_object_by_name(controls.mydata, "/0/data", dfield);
+    if (dfield_template) {
+        gwy_app_sync_data_items(data, controls.mydata, id, 0, FALSE,
+                                GWY_DATA_ITEM_PALETTE,
+                                0);
+        controls.surface = gwy_synth_surface_for_preview(dfield_template,
+                                                         PREVIEW_SIZE);
+        controls.zscale = 3.0*gwy_data_field_get_rms(dfield_template);
+    }
+    controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, FALSE);
+    gtk_box_pack_start(GTK_BOX(vbox), controls.view, FALSE, FALSE, 0);
+
+    gtk_box_pack_start(GTK_BOX(vbox),
+                       gwy_synth_instant_updates_new(&controls,
+                                                     &controls.update_now,
+                                                     &controls.update,
+                                                     &args->update),
+                       FALSE, FALSE, 0);
+    g_signal_connect_swapped(controls.update_now, "clicked",
+                             G_CALLBACK(preview), &controls);
+
+    gtk_box_pack_start(GTK_BOX(vbox),
+                       gwy_synth_random_seed_new(&controls,
+                                                 &controls.seed, &args->seed),
+                       FALSE, FALSE, 0);
+
+    controls.randomize = gwy_synth_randomize_new(&args->randomize);
+    gtk_box_pack_start(GTK_BOX(vbox), controls.randomize, FALSE, FALSE, 0);
+
+    notebook = gtk_notebook_new();
+    gtk_box_pack_start(GTK_BOX(hbox), notebook, TRUE, TRUE, 4);
+    g_signal_connect_swapped(notebook, "switch-page",
+                             G_CALLBACK(page_switched), &controls);
+
+    controls.dims = gwy_dimensions_new(dimsargs, dfield_template);
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
+                             gwy_dimensions_get_widget(controls.dims),
+                             gtk_label_new(_("Dimensions")));
+    if (controls.dims->add)
+        g_signal_connect_swapped(controls.dims->add, "toggled",
+                                 G_CALLBACK(fibre_synth_invalidate), &controls);
+
+    table = gtk_table_new(15 + (dfield_template ? 1 : 0), 3, FALSE);
+    controls.table = GTK_TABLE(table);
+    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
+    gtk_table_set_col_spacings(GTK_TABLE(table), 6);
+    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table,
+                             gtk_label_new(_("Generator")));
+    row = 0;
+
+    controls.type = shape_selector_new(&controls);
+    gwy_table_attach_adjbar(table, row, _("_Shape:"), NULL,
+                            GTK_OBJECT(controls.type),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    row++;
+
+    controls.coverage = gtk_adjustment_new(args->coverage,
+                                           0.001, 20.0, 0.001, 1.0, 0);
+    g_object_set_data(G_OBJECT(controls.coverage), "target", &args->coverage);
+    gwy_table_attach_adjbar(table, row, _("Co_verage:"), NULL,
+                            controls.coverage, GWY_HSCALE_SQRT);
+    g_signal_connect_swapped(controls.coverage, "value-changed",
+                             G_CALLBACK(gwy_synth_double_changed), &controls);
+    row++;
+
+    controls.coverage_value = gtk_label_new(NULL);
+    gtk_misc_set_alignment(GTK_MISC(controls.coverage_value), 1.0, 0.5);
+    gtk_table_attach(controls.table, controls.coverage_value,
+                     1, 2, row, row+1, GTK_FILL, 0, 0, 0);
+
+    controls.coverage_units = gtk_label_new(_("obj."));
+    gtk_misc_set_alignment(GTK_MISC(controls.coverage_units), 0.0, 0.5);
+    gtk_table_attach(GTK_TABLE(table), controls.coverage_units,
+                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+    row++;
+
+    gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Size")),
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    row++;
+
+    controls.width = gtk_adjustment_new(args->width, 1.0, 1000.0, 0.1, 10.0, 0);
+    row = gwy_synth_attach_lateral(&controls, row, controls.width, &args->width,
+                                   _("_Width:"), GWY_HSCALE_LOG, NULL,
+                                   &controls.width_value,
+                                   &controls.width_units);
+    row = gwy_synth_attach_variance(&controls, row,
+                                    &controls.width_noise, &args->width_noise);
+    row = attach_segvar(&controls, row, &controls.width_var, &args->width_var);
+
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Height")),
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    row++;
+
+    row = gwy_synth_attach_height(&controls, row,
+                                  &controls.height, &args->height,
+                                  _("_Height:"), NULL, &controls.height_units);
+
+    if (dfield_template) {
+        controls.height_init
+            = gtk_button_new_with_mnemonic(_("_Like Current Image"));
+        g_signal_connect_swapped(controls.height_init, "clicked",
+                                 G_CALLBACK(height_init_clicked), &controls);
+        gtk_table_attach(GTK_TABLE(table), controls.height_init,
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+        row++;
+    }
+
+    controls.height_bound
+        = gtk_check_button_new_with_mnemonic(_("Scales _with width"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.height_bound),
+                                 args->height_bound);
+    g_object_set_data(G_OBJECT(controls.height_bound),
+                      "target", &args->height_bound);
+    gtk_table_attach(GTK_TABLE(table), controls.height_bound,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    g_signal_connect_swapped(controls.height_bound, "toggled",
+                             G_CALLBACK(gwy_synth_boolean_changed), &controls);
+    row++;
+
+    row = gwy_synth_attach_variance(&controls, row,
+                                    &controls.height_noise,
+                                    &args->height_noise);
+    row = attach_segvar(&controls, row, &controls.height_var,
+                        &args->height_var);
+
+    row = gwy_synth_attach_truncation(&controls, row,
+                                      &controls.htrunc, &args->htrunc);
+    row = gwy_synth_attach_variance(&controls, row,
+                                    &controls.htrunc_noise,
+                                    &args->htrunc_noise);
+
+    table = gtk_table_new(8, 3, FALSE);
+    controls.table = GTK_TABLE(table);
+    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
+    gtk_table_set_col_spacings(GTK_TABLE(table), 6);
+    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table,
+                             gtk_label_new(_("Placement")));
+    row = 0;
+
+    row = gwy_synth_attach_orientation(&controls, row,
+                                       &controls.angle, &args->angle);
+    row = gwy_synth_attach_variance(&controls, row,
+                                    &controls.angle_noise, &args->angle_noise);
+
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Deformation")),
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    row++;
+
+    controls.deform_density
+        = gtk_adjustment_new(args->deform_density,
+                             0.5, FIBRE_MAX_POINTS - 1.0, 0.01, 1.0, 0.0);
+    g_object_set_data(G_OBJECT(controls.deform_density), "target",
+                      &args->deform_density);
+    gwy_table_attach_adjbar(table, row, _("Densi_ty:"), NULL,
+                            controls.deform_density, GWY_HSCALE_SQRT);
+    g_signal_connect_swapped(controls.deform_density, "value-changed",
+                             G_CALLBACK(gwy_synth_double_changed), &controls);
+    row++;
+
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    row = attach_deformation(&controls, _("_Lateral:"), row,
+                             &controls.latdeform, &args->latdeform);
+    row = gwy_synth_attach_variance(&controls, row,
+                                    &controls.latdeform_noise,
+                                    &args->latdeform_noise);
+
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    row = attach_deformation(&controls, _("Le_ngthwise:"), row,
+                             &controls.lendeform, &args->lendeform);
+    row = gwy_synth_attach_variance(&controls, row,
+                                    &controls.lendeform_noise,
+                                    &args->lendeform_noise);
+
+    gtk_widget_show_all(dialog);
+    controls.in_init = FALSE;
+    /* Must be done when widgets are shown, see GtkNotebook docs */
+    gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), args->active_page);
+    update_values(&controls);
+    fibre_synth_invalidate(&controls);
+
+    finished = FALSE;
+    while (!finished) {
+        response = gtk_dialog_run(GTK_DIALOG(dialog));
+        switch (response) {
+            case GTK_RESPONSE_CANCEL:
+            case GTK_RESPONSE_DELETE_EVENT:
+            case GTK_RESPONSE_OK:
+            gtk_widget_destroy(dialog);
+            case GTK_RESPONSE_NONE:
+            finished = TRUE;
+            break;
+
+            case RESPONSE_RESET:
+            {
+                gboolean temp = args->update;
+                gint temp2 = args->active_page;
+                *args = fibre_synth_defaults;
+                args->active_page = temp2;
+                args->update = temp;
+            }
+            controls.in_init = TRUE;
+            update_controls(&controls, args);
+            controls.in_init = FALSE;
+            if (args->update)
+                preview(&controls);
+            break;
+
+            default:
+            g_assert_not_reached();
+            break;
+        }
+    }
+
+    if (controls.sid) {
+        g_source_remove(controls.sid);
+        controls.sid = 0;
+    }
+    g_object_unref(controls.mydata);
+    GWY_OBJECT_UNREF(controls.surface);
+    gwy_dimensions_free(controls.dims);
+
+    return response == GTK_RESPONSE_OK;
+}
+
+static GtkWidget*
+shape_selector_new(FibreSynthControls *controls)
+{
+    GtkWidget *combo;
+    GwyEnum *model;
+    guint n, i;
+
+    n = G_N_ELEMENTS(features);
+    model = g_new(GwyEnum, n);
+    for (i = 0; i < n; i++) {
+        model[i].value = features[i].type;
+        model[i].name = features[i].name;
+    }
+
+    combo = gwy_enum_combo_box_new(model, n,
+                                   G_CALLBACK(shape_selected), controls,
+                                   controls->args->type, TRUE);
+    g_object_weak_ref(G_OBJECT(combo), (GWeakNotify)g_free, model);
+
+    return combo;
+}
+
+static void
+update_controls(FibreSynthControls *controls,
+                FibreSynthArgs *args)
+{
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->update),
+                                 args->update);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->seed), args->seed);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->randomize),
+                                 args->randomize);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->coverage),
+                             args->coverage);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->width), args->width);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->width_noise),
+                             args->width_noise);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->height), args->height);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->height_noise),
+                             args->height_noise);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->htrunc), args->htrunc);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->htrunc_noise),
+                             args->htrunc_noise);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->angle), args->angle);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->angle_noise),
+                             args->angle_noise);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->height_bound),
+                                 args->height_bound);
+    gwy_enum_combo_box_set_active(GTK_COMBO_BOX(controls->type), args->type);
+}
+
+static void
+page_switched(FibreSynthControls *controls,
+              G_GNUC_UNUSED GtkNotebookPage *page,
+              gint pagenum)
+{
+    if (controls->in_init)
+        return;
+
+    controls->args->active_page = pagenum;
+    if (pagenum == PAGE_GENERATOR)
+        update_values(controls);
+}
+
+static void
+update_values(FibreSynthControls *controls)
+{
+    GwyDimensions *dims = controls->dims;
+
+    controls->pxsize = dims->args->measure * pow10(dims->args->xypow10);
+    if (controls->height_units)
+        gtk_label_set_markup(GTK_LABEL(controls->height_units),
+                             dims->zvf->units);
+    gtk_label_set_markup(GTK_LABEL(controls->width_units),
+                         dims->xyvf->units);
+
+    gwy_synth_update_lateral(controls, GTK_ADJUSTMENT(controls->width));
+    update_coverage_value(controls);
+}
+
+static void
+shape_selected(GtkComboBox *combo,
+               FibreSynthControls *controls)
+{
+    controls->args->type = gwy_enum_combo_box_get_active(combo);
+    update_coverage_value(controls);
+    fibre_synth_invalidate(controls);
+}
+
+static void
+height_init_clicked(FibreSynthControls *controls)
+{
+    gdouble mag = pow10(controls->dims->args->zpow10);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->height),
+                             controls->zscale/mag);
+}
+
+static void
+update_coverage_value(FibreSynthControls *controls)
+{
+    glong nobjects;
+    guchar buf[32];
+
+    if (controls->in_init)
+        return;
+
+    nobjects = calculate_n_fibres(controls->args,
+                                  controls->dims->args->xres,
+                                  controls->dims->args->yres);
+    g_snprintf(buf, sizeof(buf), "%ld", nobjects);
+    gtk_label_set_text(GTK_LABEL(controls->coverage_value), buf);
+}
+
+static gint
+attach_deformation(FibreSynthControls *controls,
+                   const gchar *name,
+                   gint row,
+                   GtkObject **adj,
+                   gdouble *target)
+{
+    GtkWidget *spin;
+
+    *adj = gtk_adjustment_new(*target, 0.0, 1.0, 0.001, 0.1, 0);
+    g_object_set_data(G_OBJECT(*adj), "target", target);
+
+    spin = gwy_table_attach_adjbar(GTK_WIDGET(controls->table),
+                                   row, name, NULL, *adj,
+                                   GWY_HSCALE_SQRT);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
+    g_signal_connect_swapped(*adj, "value-changed",
+                             G_CALLBACK(gwy_synth_double_changed), controls);
+
+    row++;
+
+    return row;
+}
+
+static gint
+attach_segvar(FibreSynthControls *controls,
+              gint row,
+              GtkObject **adj,
+              gdouble *target)
+{
+    GtkWidget *spin;
+
+    *adj = gtk_adjustment_new(*target, 0.0, 1.0, 0.001, 0.1, 0);
+    g_object_set_data(G_OBJECT(*adj), "target", target);
+
+    spin = gwy_table_attach_adjbar(GTK_WIDGET(controls->table),
+                                   row, _("Along fiber:"), NULL, *adj,
+                                   GWY_HSCALE_SQRT);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
+    g_signal_connect_swapped(*adj, "value-changed",
+                             G_CALLBACK(gwy_synth_double_changed), controls);
+
+    row++;
+
+    return row;
+}
+
+static void
+fibre_synth_invalidate(FibreSynthControls *controls)
+{
+    /* create preview if instant updates are on */
+    if (controls->args->update && !controls->in_init && !controls->sid) {
+        controls->sid = g_idle_add_full(G_PRIORITY_LOW, preview_gsource,
+                                        controls, NULL);
+    }
+}
+
+static gboolean
+preview_gsource(gpointer user_data)
+{
+    FibreSynthControls *controls = (FibreSynthControls*)user_data;
+    controls->sid = 0;
+
+    preview(controls);
+
+    return FALSE;
+}
+
+static void
+preview(FibreSynthControls *controls)
+{
+    FibreSynthArgs *args = controls->args;
+    GwyDataField *dfield;
+    gboolean ok;
+
+    dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata,
+                                                             "/0/data"));
+    if (controls->dims->args->add && controls->surface)
+        gwy_data_field_copy(controls->surface, dfield, FALSE);
+    else
+        gwy_data_field_clear(dfield);
+
+    if (args->update) {
+        fibre_synth_do(args, controls->dims->args, controls->rngset, dfield,
+                       NULL, NULL);
+        gwy_data_field_data_changed(dfield);
+        return;
+    }
+
+    gwy_app_wait_start(GTK_WINDOW(controls->dialog), _("Initializing..."));
+    ok = fibre_synth_do(args, controls->dims->args, controls->rngset, dfield,
+                        gwy_app_wait_set_message, gwy_app_wait_set_fraction);
+    gwy_app_wait_finish();
+
+    if (!ok) {
+        if (controls->dims->args->add && controls->surface)
+            gwy_data_field_copy(controls->surface, dfield, FALSE);
+        else
+            gwy_data_field_clear(dfield);
+    }
+    gwy_data_field_data_changed(dfield);
+}
+
+static inline IntList*
+int_list_new(guint prealloc)
+{
+    IntList *list = g_slice_new0(IntList);
+    prealloc = MAX(prealloc, 16);
+    list->size = prealloc;
+    list->data = g_new(gint, list->size);
+    return list;
+}
+
+static inline void
+int_list_add(IntList *list, gint i)
+{
+    if (G_UNLIKELY(list->len == list->size)) {
+        list->size = MAX(2*list->size, 16);
+        list->data = g_renew(gint, list->data, list->size);
+    }
+
+    list->data[list->len] = i;
+    list->len++;
+}
+
+static inline void
+int_list_free(IntList *list)
+{
+    g_free(list->data);
+    g_slice_free(IntList, list);
+}
+
+static inline GwyXY
+vecdiff(const GwyXY *a, const GwyXY *b)
+{
+    GwyXY r;
+
+    r.x = a->x - b->x;
+    r.y = a->y - b->y;
+
+    return r;
+}
+
+static inline GwyXY
+veclincomb(const GwyXY *a, gdouble qa, const GwyXY *b, gdouble qb)
+{
+    GwyXY r;
+
+    r.x = qa*a->x + qb*b->x;
+    r.y = qa*a->y + qb*b->y;
+
+    return r;
+}
+
+static inline gdouble
+dotprod(const GwyXY *a, const GwyXY *b)
+{
+    return a->x*b->x + a->y*b->y;
+}
+
+static inline gdouble
+vecnorm2(const GwyXY *a)
+{
+    return a->x*a->x + a->y*a->y;
+}
+
+static inline gdouble
+vecprodz(const GwyXY *a, const GwyXY *b)
+{
+    return a->x*b->y - a->y*b->x;
+}
+
+static void
+order_trapezoid_vertically(const GwyXY *p, const GwyXY *q,
+                           const GwyXY *pp, const GwyXY *qq,
+                           const GwyXY **top, const GwyXY **m1,
+                           const GwyXY **m2, const GwyXY **bottom)
+{
+    const GwyXY *pts[4];
+    guint i, j;
+
+    pts[0] = p;
+    pts[1] = q;
+    pts[2] = pp;
+    pts[3] = qq;
+    for (i = 0; i < 3; i++) {
+        for (j = i; j < 4; j++) {
+            if (pts[i]->y > pts[j]->y
+                || (pts[i]->y == pts[j]->y && pts[i]->x == pts[j]->x))
+                GWY_SWAP(const GwyXY*, pts[i], pts[j]);
+        }
+    }
+
+    *top = pts[0];
+    *m1 = pts[1];
+    *m2 = pts[2];
+    *bottom = pts[3];
+}
+
+static void
+fill_vsegment(const GwyXY *lfrom, const GwyXY *lto,
+              const GwyXY *rfrom, const GwyXY *rto,
+              gdouble *fdata, gdouble *udata, gint xres, gint yres,
+              gint ifrom, gint ito,
+              const GwyXY *r, const GwyXY *rp, const GwyXY *rq, const GwyXY *d,
+              gdouble wp, gdouble wq, gdouble lp, gdouble lq,
+              gboolean positive,
+              IntList *usedpts)
+{
+    gdouble denoml, denomr;
+    gint i, j, jfrom, jto, jleftlim, jrightlim;
+    gdouble tl, tr, u, v, s, w, dnorm;
+    gdouble *frow, *urow;
+    GwyXY pt, rr;
+
+    dnorm = vecnorm2(d);
+    denoml = MAX(lto->y - lfrom->y, 1e-9);
+    denomr = MAX(rto->y - rfrom->y, 1e-9);
+
+    jleftlim = (gint)floor(fmin(lfrom->x, lto->x) - 1.0);
+    jleftlim = MAX(jleftlim, 0);
+    jrightlim = (gint)ceil(fmax(rfrom->x, rto->x) + 1.0);
+    jrightlim = MIN(jrightlim, xres-1);
+
+    for (i = ifrom; i <= ito; i++) {
+        tl = (i - lfrom->y)/denoml;
+        jfrom = (gint)floor(tl*lto->x + (1.0 - tl)*lfrom->x);
+        jfrom = MAX(jfrom, jleftlim);
+
+        tr = (i - rfrom->y)/denomr;
+        jto = (gint)ceil(tr*rto->x + (1.0 - tr)*rfrom->x);
+        jto = MIN(jto, jrightlim);
+
+        pt.y = i - r->y;
+        frow = fdata + i*xres;
+        urow = udata + i*xres;
+        g_assert_cmpint(i, >=, 0);
+        g_assert_cmpint(i, <, yres);
+        for (j = jfrom; j <= jto; j++) {
+            pt.x = j - r->x;
+            /* u is the approximate coordinate along the segment
+             * v is the approximate distance from the centre
+             * both are from [0, 1] inside the trapezoid.
+             * Exact coordinates can be introduced and calculated but it
+             * seems to require solving some ugly quadratic equations and is
+             * not necessary for rendering the fibre.  If we want fibre height
+             * varying continuously along its length we also need to remember u
+             * coordinates somewhere. */
+            u = dotprod(&pt, d)/dnorm + 0.5;
+            u = CLAMP(u, 0.0, 1.0);
+            w = wp*(1.0 - u) + wq*u;
+            rr = veclincomb(rp, 1.0 - u, rq, u);
+            /* This is one Newton iteration of w*|r'| from initial estimate
+             * |r'| ≈ w, which should be always good.  It avoid slow sqrt()
+             * and as a bonus, it is a sum of two positive terms so it has to
+             * behave nicely. */
+            s = 0.5*(w*w + vecnorm2(&rr));
+            v = dotprod(&pt, &rr)/s;
+            g_assert_cmpint(j, >=, 0);
+            g_assert_cmpint(j, <, xres);
+            if (v >= 0.0 && v <= 1.0 && v < fabs(frow[j])) {
+                /* Only add the pixel when first encountering it. */
+                if (frow[j] == G_MAXDOUBLE)
+                    int_list_add(usedpts, i*xres + j);
+                frow[j] = positive ? v : -v;
+                urow[j] = lp*(1.0 - u) + lq*u;
+            }
+        }
+    }
+}
+
+/* p-q is the fibre ‘spine’, pp-qq is the outer boundary. */
+static void
+fill_trapezoid(gdouble *fdata, gdouble *udata, gint xres, gint yres,
+               const GwyXY *p, const GwyXY *q,
+               const GwyXY *pp, const GwyXY *qq,
+               gdouble wp, gdouble wq, gdouble lp, gdouble lq,
+               gboolean positive, IntList *usedpts)
+{
+    const GwyXY *top, *mid1, *mid2, *bottom;
+    const GwyXY *lfrom, *lto, *rfrom, *rto;
+    GwyXY d, dd, diag, s, r, rp, rq;
+    gboolean mid1_is_right, mid2_is_right;
+    gint ifrom, ito;
+
+    /* If we are totally outside, abort.  This does not detect trapezoids
+     * hugging the rectangle boundary line, but there are only a small
+     * fraction of them. */
+    if (fmin(fmin(p->x, q->x), fmin(pp->x, qq->x)) > xres+1.0)
+        return;
+    if (fmin(fmin(p->y, q->y), fmin(pp->y, qq->y)) > yres+1.0)
+        return;
+    if (fmax(fmax(p->x, q->x), fmax(pp->x, qq->x)) < -1.0)
+        return;
+    if (fmax(fmax(p->y, q->y), fmax(pp->y, qq->y)) < -1.0)
+        return;
+
+    /* If the points on the outer boundary are in reverse order (too large
+     * width compared to local curvature), just invert the order to get some
+     * kind of untwisted trapezoid.  The result still does not have to be
+     * convex, but the filling does not fail if the outer boundary is weird
+     * because we do not use the pp-qq vector. */
+    d = vecdiff(q, p);
+    dd = vecdiff(qq, pp);
+    if (dotprod(&d, &dd) < 0.0) {
+        GWY_SWAP(const GwyXY*, pp, qq);
+    }
+
+    r = veclincomb(p, 0.5, q, 0.5);
+    rp = vecdiff(pp, p);
+    rq = vecdiff(qq, q);
+
+    order_trapezoid_vertically(p, q, pp, qq, &top, &mid1, &mid2, &bottom);
+    diag = vecdiff(bottom, top);
+    s = vecdiff(mid1, top);
+    mid1_is_right = (vecprodz(&s, &diag) >= 0.0);
+    s = vecdiff(mid2, top);
+    mid2_is_right = (vecprodz(&s, &diag) > 0.0);
+
+    /* The top triangle.  May be skipped if the top line is horizontal. */
+    if (mid1->y > top->y + 1e-9) {
+        ifrom = (gint)floor(top->y);
+        ifrom = MAX(ifrom, 0);
+        ito = (gint)ceil(mid1->y);
+        ito = MIN(ito, yres-1);
+
+        lfrom = rfrom = top;
+        rto = mid1_is_right ? mid1 : (mid2_is_right ? mid2 : bottom);
+        lto = mid1_is_right ? (mid2_is_right ? bottom : mid2) : mid1;
+        fill_vsegment(lfrom, lto, rfrom, rto,
+                      fdata, udata, xres, yres, ifrom, ito,
+                      &r, &rp, &rq, &d, wp, wq, lp, lq, positive, usedpts);
+    }
+
+    /* The middle part.  May be skipped if the mid1 and mid2 are on the same
+     * horizontal line.*/
+    if (mid2->y > mid1->y + 1e-9) {
+        ifrom = (gint)floor(mid1->y);
+        ifrom = MAX(ifrom, 0);
+        ito = (gint)ceil(mid2->y);
+        ito = MIN(ito, yres-1);
+
+        lfrom = mid1_is_right ? top : mid1;
+        rfrom = mid1_is_right ? mid1 : top;
+        lto = mid2_is_right ? bottom : mid2;
+        rto = mid2_is_right ? mid2 : bottom;
+        fill_vsegment(lfrom, lto, rfrom, rto,
+                      fdata, udata, xres, yres, ifrom, ito,
+                      &r, &rp, &rq, &d, wp, wq, lp, lq, positive, usedpts);
+    }
+
+    /* The bottom triangle.  May be skipped if the bottom line is horizontal. */
+    if (bottom->y > mid2->y + 1e-9) {
+        ifrom = (gint)floor(mid2->y);
+        ifrom = MAX(ifrom, 0);
+        ito = (gint)ceil(bottom->y);
+        ito = MIN(ito, yres-1);
+
+        lfrom = mid2_is_right ? (mid1_is_right ? bottom : mid1) : mid2;
+        rfrom = mid2_is_right ? mid2 : (mid1_is_right ? mid1 : top);
+        lto = rto = bottom;
+        fill_vsegment(lfrom, lto, rfrom, rto,
+                      fdata, udata, xres, yres, ifrom, ito,
+                      &r, &rp, &rq, &d, wp, wq, lp, lq, positive, usedpts);
+    }
+}
+
+static gboolean
+fibre_synth_do(const FibreSynthArgs *args,
+               const GwyDimensionArgs *dimsargs,
+               GwyRandGenSet *rngset,
+               GwyDataField *dfield,
+               GwySetMessageFunc set_message,
+               GwySetFractionFunc set_fraction)
+{
+    GwyDataField *fibre, *ucoord, *extfield;
+    GwySpline *spline;
+    GArray *segvar;
+    IntList *usedpts;
+    guint i, nfib, xres, yres, extw;
+    gboolean ok = FALSE;
+
+    gwy_rand_gen_set_init(rngset, args->seed);
+
+    xres = gwy_data_field_get_xres(dfield);
+    yres = gwy_data_field_get_yres(dfield);
+    extw = MIN(xres, yres)/8 + GWY_ROUND(2*args->width) + 16;
+    extfield = gwy_data_field_extend(dfield, extw, extw, extw, extw,
+                                     GWY_EXTERIOR_BORDER_EXTEND, 0.0, FALSE);
+
+    usedpts = int_list_new(0);
+    segvar = g_array_new(FALSE, FALSE, sizeof(FibreSegmentVar));
+    fibre = gwy_data_field_new_alike(extfield, TRUE);
+    ucoord = gwy_data_field_new_alike(extfield, TRUE);
+    spline = gwy_spline_new();
+    gwy_data_field_fill(fibre, G_MAXDOUBLE);
+
+    if (set_message && !set_message(_("Generating fibers...")))
+        goto finish;
+
+    nfib = calculate_n_fibres(args, xres, yres);
+    for (i = 0; i < nfib; i++) {
+        fibre_synth_add_one(extfield, fibre, ucoord, usedpts, spline, segvar,
+                            args, dimsargs, rngset);
+        if (set_fraction && !set_fraction((i + 1.0)/nfib))
+            goto finish;
+    }
+    gwy_data_field_area_copy(extfield, dfield, extw, extw, xres, yres, 0, 0);
+
+    ok = TRUE;
+
+finish:
+    g_array_free(segvar, TRUE);
+    gwy_spline_free(spline);
+    int_list_free(usedpts);
+    g_object_unref(extfield);
+    g_object_unref(fibre);
+    g_object_unref(ucoord);
+
+    return ok;
+}
+
+static gdouble
+generate_deformed(GwyRandGenSet *rngset, gdouble deformation, gdouble noise)
+{
+    gdouble delta;
+
+    delta = gwy_rand_gen_set_gaussian(rngset, RNG_DEFORM, noise);
+    delta = deformation*exp(delta);
+    return gwy_rand_gen_set_gaussian(rngset, RNG_DEFORM, delta);
+}
+
+static void
+calculate_segment_var(const GwyXY *xy, guint n, GArray *segvar,
+                      GwyRandGenSet *rngset, gdouble ptstep,
+                      gdouble width_var,
+                      gdouble height_var, gboolean height_bound)
+{
+    FibreSegmentVar *segvardata;
+    gdouble s, l;
+    guint i;
+
+    g_array_set_size(segvar, n);
+    segvardata = &g_array_index(segvar, FibreSegmentVar, 0);
+    segvardata[0].u = 0.0;
+    segvardata[0].wfactor = 0.0;
+    segvardata[0].hfactor = 0.0;
+    for (i = 1; i < n; i++) {
+        GwyXY d = vecdiff(xy + i, xy + i-1);
+
+        l = sqrt(vecnorm2(&d))/OVERSAMPLE;
+        segvardata[i].u = segvardata[i-1].u + l;
+
+        /* Mix a new random number with the previous one for short segments. */
+        l = fmin(l/ptstep, 1.0);
+        l *= l;
+        s = gwy_rand_gen_set_gaussian(rngset, RNG_SEGVAR, width_var);
+        segvardata[i].wfactor = (1.0 - l)*segvardata[i-1].wfactor + l*s;
+        s = gwy_rand_gen_set_gaussian(rngset, RNG_SEGVAR, height_var);
+        segvardata[i].hfactor = (1.0 - l)*segvardata[i-1].hfactor + l*s;
+    }
+
+    for (i = 0; i < n; i++) {
+        segvardata[i].wfactor = exp(2.0*segvardata[i].wfactor);
+        segvardata[i].hfactor = exp(2.0*segvardata[i].hfactor);
+        if (height_bound)
+            segvardata[i].hfactor *= segvardata[i].wfactor;
+    }
+}
+
+static void
+generate_fibre_spline(gint xres, gint yres,
+                      GwySpline *spline,
+                      GArray *segvar,
+                      const FibreSynthArgs *args,
+                      GwyRandGenSet *rngset)
+{
+    static GwyXY points[2*FIBRE_MAX_POINTS + 1];
+
+    const GwyXY *xy;
+    gdouble angle = args->angle, ca, sa;
+    gdouble xoff, yoff, x, y, s, ptstep;
+    guint i, npts;
+
+    angle = args->angle;
+    if (args->angle_noise)
+        angle += gwy_rand_gen_set_gaussian(rngset, RNG_ANGLE,
+                                           2*args->angle_noise);
+    ca = cos(angle);
+    sa = sin(angle);
+
+    s = hypot(xres, yres);
+    x = s*(gwy_rand_gen_set_double(rngset, RNG_POSITION) - 0.5);
+    y = s*(gwy_rand_gen_set_double(rngset, RNG_POSITION) - 0.5);
+    xoff = xres/2 + ca*x + sa*y;
+    yoff = yres/2 - sa*x + ca*y;
+    ptstep = s/args->deform_density;
+
+    /* Generate the full number of points for image stability when parameters
+     * change. */
+    points[FIBRE_MAX_POINTS].x = xoff;
+    points[FIBRE_MAX_POINTS].y = yoff;
+    for (i = 1; i < FIBRE_MAX_POINTS; i++) {
+        x = ptstep*(i + generate_deformed(rngset,
+                                          args->lendeform,
+                                          args->lendeform_noise));
+        y = ptstep*generate_deformed(rngset,
+                                     args->latdeform, args->latdeform_noise);
+        points[FIBRE_MAX_POINTS + i].x = ca*x + sa*y + xoff;
+        points[FIBRE_MAX_POINTS + i].y = -sa*x + ca*y + yoff;
+
+        x = -ptstep*(i + generate_deformed(rngset,
+                                           args->lendeform,
+                                           args->lendeform_noise));
+        y = ptstep*generate_deformed(rngset,
+                                     args->latdeform, args->latdeform_noise);
+        points[FIBRE_MAX_POINTS - i].x = ca*x + sa*y + xoff;
+        points[FIBRE_MAX_POINTS - i].y = -sa*x + ca*y + yoff;
+    }
+
+    /* Generate the last point always undisturbed so it cannot lie inside. */
+    x = ptstep*FIBRE_MAX_POINTS;
+    points[2*FIBRE_MAX_POINTS].x = ca*x + xoff;
+    points[2*FIBRE_MAX_POINTS].y = -sa*x + yoff;
+
+    x = -ptstep*FIBRE_MAX_POINTS;
+    points[0].x = ca*x + xoff;
+    points[0].y = -sa*x + yoff;
+
+    for (i = 0; i < G_N_ELEMENTS(points); i++) {
+        points[i].x *= OVERSAMPLE;
+        points[i].y *= OVERSAMPLE;
+    }
+
+    gwy_spline_set_points(spline, points, 2*FIBRE_MAX_POINTS + 1);
+
+    /* XXX: This depends on spline not freeing xy[] before it makes a copy. */
+    xy = gwy_spline_sample_naturally(spline, &npts);
+    gwy_spline_set_points(spline, xy, npts);
+
+    calculate_segment_var(xy, npts, segvar, rngset, ptstep,
+                          args->width_var,
+                          args->height_var, args->height_bound);
+}
+
+static void
+fibre_synth_add_one(GwyDataField *surface,
+                    GwyDataField *fibre,
+                    GwyDataField *ucoord,
+                    IntList *usedpts,
+                    GwySpline *spline,
+                    GArray *segvar,
+                    const FibreSynthArgs *args,
+                    const GwyDimensionArgs *dimsargs,
+                    GwyRandGenSet *rngset)
+{
+    gdouble height_base = args->height * pow10(dimsargs->zpow10);
+    FibreSegmentVar *segvardata;
+    gdouble z, m, width, height, htrunc, u;
+    guint i, k, npts;
+    const GwyXY *xy, *txy;
+    gint j, xres, yres;
+    gdouble *data, *fdata, *udata;
+    gboolean needs_heightvar;
+
+    xres = gwy_data_field_get_xres(fibre);
+    yres = gwy_data_field_get_yres(fibre);
+    fdata = gwy_data_field_get_data(fibre);
+    udata = gwy_data_field_get_data(ucoord);
+    data = gwy_data_field_get_data(surface);
+
+    needs_heightvar = (args->height_var > 0.0
+                       || (args->width_var > 0.0 && args->height_bound));
+
+    width = 0.5*args->width;
+    if (args->width_noise) {
+        width *= exp(gwy_rand_gen_set_gaussian(rngset, RNG_WIDTH,
+                                               args->width_noise));
+    }
+
+    height = height_base;
+    if (args->height_bound)
+        height *= width/args->width;
+    if (args->height_noise) {
+        height *= exp(gwy_rand_gen_set_gaussian(rngset, RNG_HEIGHT,
+                                                args->height_noise));
+    }
+
+    /* Use a specific distribution for htrunc. */
+    if (args->htrunc_noise) {
+        gdouble q = exp(gwy_rand_gen_set_gaussian(rngset, RNG_HTRUNC,
+                                                  args->htrunc_noise));
+        htrunc = q/(q + 1.0/args->htrunc - 1.0);
+    }
+    else
+        htrunc = args->htrunc;
+
+    generate_fibre_spline(xres, yres, spline, segvar, args, rngset);
+    npts = gwy_spline_get_npoints(spline);
+    xy = gwy_spline_get_points(spline);
+    txy = gwy_spline_get_tangents(spline);
+    segvardata = &g_array_index(segvar, FibreSegmentVar, 0);
+
+    for (k = 0; k+1 < npts; k++) {
+        GwyXY p, q, pp, qq;
+        gdouble wp = width*segvardata[k].wfactor;
+        gdouble wq = width*segvardata[k+1].wfactor;
+
+        p.x = xy[k].x/OVERSAMPLE;
+        p.y = xy[k].y/OVERSAMPLE;
+        q.x = xy[k+1].x/OVERSAMPLE;
+        q.y = xy[k+1].y/OVERSAMPLE;
+
+        pp.x = p.x - wp*txy[k].y;
+        pp.y = p.y + wp*txy[k].x;
+        qq.x = q.x - wq*txy[k+1].y;
+        qq.y = q.y + wq*txy[k+1].x;
+        fill_trapezoid(fdata, udata, xres, yres, &p, &q, &pp, &qq,
+                       wp, wq, k, k+1, TRUE, usedpts);
+
+        pp.x = p.x + wp*txy[k].y;
+        pp.y = p.y - wp*txy[k].x;
+        qq.x = q.x + wq*txy[k+1].y;
+        qq.y = q.y - wq*txy[k+1].x;
+        fill_trapezoid(fdata, udata, xres, yres, &p, &q, &pp, &qq,
+                       wp, wq, k, k+1, FALSE, usedpts);
+    }
+
+    m = G_MAXDOUBLE;
+    for (k = 0; k < usedpts->len; k++)
+        m = fmin(m, data[usedpts->data[k]]);
+    for (k = 0; k < usedpts->len; k++) {
+        i = usedpts->data[k];
+        z = fdata[i];
+        if (args->type == FIBRE_SYNTH_CIRCLE)
+            z = sqrt(1.0 - fmin(z*z, 1.0));
+        else if (args->type == FIBRE_SYNTH_TRIANGLE)
+            z = 1.0 - fabs(z);
+        else if (args->type == FIBRE_SYNTH_SQUARE)
+            z = 1.0;
+        else if (args->type == FIBRE_SYNTH_PARABOLA)
+            z = 1.0 - z*z;
+        else if (args->type == FIBRE_SYNTH_QUADRATIC) {
+            z = fabs(z);
+            z = (z <= 1.0/3.0) ? 0.75*(1.0 - 3*z*z) : 1.125*(1.0 - z)*(1.0 - z);
+        }
+        else {
+            g_assert_not_reached();
+        }
+
+        if (z > htrunc)
+            z = htrunc;
+        z *= height;
+
+        if (needs_heightvar) {
+            u = udata[i];
+            j = floor(u);
+            u -= j;
+            if (G_UNLIKELY(j >= npts-1)) {
+                j = npts-2;
+                u = 1.0;
+            }
+            else if (G_UNLIKELY(j < 0)) {
+                j = 0;
+                u = 0.0;
+            }
+            z *= (1.0 - u)*segvardata[j].hfactor + u*segvardata[j+1].hfactor;
+        }
+
+        data[i] = fmax(data[i], m + z);
+        fdata[i] = G_MAXDOUBLE;
+    }
+    usedpts->len = 0;
+}
+
+static glong
+calculate_n_fibres(const FibreSynthArgs *args, guint xres, guint yres)
+{
+    /* The distribution of area differs from the distribution of widths. */
+    gdouble noise_corr = exp(args->width_noise*args->width_noise);
+    /* FIXME: Should correct for deformation which increases the length,
+     * possibly for orientation distribution (orthogonal are shorter but
+     * more likely completely inside, so the dependence is unclear). */
+    gdouble length = hypot(xres, yres);
+    gdouble mean_fibre_area = 0.125*args->width * length * noise_corr;
+    gdouble must_cover = args->coverage*xres*yres;
+    return (glong)ceil(must_cover/mean_fibre_area);
+}
+
+static const gchar active_page_key[]     = "/module/fibre_synth/active_page";
+static const gchar angle_key[]           = "/module/fibre_synth/angle";
+static const gchar angle_noise_key[]     = "/module/fibre_synth/angle_noise";
+static const gchar coverage_key[]        = "/module/fibre_synth/coverage";
+static const gchar deform_density_key[]  = "/module/fibre_synth/deform_density";
+static const gchar height_bound_key[]    = "/module/fibre_synth/height_bound";
+static const gchar height_key[]          = "/module/fibre_synth/height";
+static const gchar height_noise_key[]    = "/module/fibre_synth/height_noise";
+static const gchar htrunc_key[]          = "/module/fibre_synth/htrunc";
+static const gchar htrunc_noise_key[]    = "/module/fibre_synth/htrunc_noise";
+static const gchar latdeform_key[]       = "/module/fibre_synth/latdeform";
+static const gchar latdeform_noise_key[] = "/module/fibre_synth/latdeform_noise";
+static const gchar lendeform_key[]       = "/module/fibre_synth/lendeform";
+static const gchar lendeform_noise_key[] = "/module/fibre_synth/lendeform_noise";
+static const gchar prefix[]              = "/module/fibre_synth";
+static const gchar randomize_key[]       = "/module/fibre_synth/randomize";
+static const gchar seed_key[]            = "/module/fibre_synth/seed";
+static const gchar type_key[]            = "/module/fibre_synth/type";
+static const gchar update_key[]          = "/module/fibre_synth/update";
+static const gchar width_key[]           = "/module/fibre_synth/width";
+static const gchar width_noise_key[]     = "/module/fibre_synth/width_noise";
+static const gchar width_var_key[]       = "/module/fibre_synth/width_var";
+static const gchar height_var_key[]      = "/module/fibre_synth/height_var";
+
+static void
+fibre_synth_sanitize_args(FibreSynthArgs *args)
+{
+    args->active_page = CLAMP(args->active_page,
+                              PAGE_DIMENSIONS, PAGE_NPAGES-1);
+    args->update = !!args->update;
+    args->seed = MAX(0, args->seed);
+    args->randomize = !!args->randomize;
+    args->type = MIN(args->type, FIBRE_SYNTH_NTYPES-1);
+    args->coverage = CLAMP(args->coverage, 0.001, 20.0);
+    args->width = CLAMP(args->width, 1.0, 1000.0);
+    args->width_noise = CLAMP(args->width_noise, 0.0, 1.0);
+    args->width_var = CLAMP(args->width_var, 0.0, 1.0);
+    args->height = CLAMP(args->height, 0.001, 10000.0);
+    args->height_noise = CLAMP(args->height_noise, 0.0, 1.0);
+    args->height_var = CLAMP(args->height_var, 0.0, 1.0);
+    args->height_bound = !!args->height_bound;
+    args->htrunc = CLAMP(args->htrunc, 0.001, 1.0);
+    args->htrunc_noise = CLAMP(args->htrunc_noise, 0.0, 1.0);
+    args->angle = CLAMP(args->angle, -G_PI, G_PI);
+    args->angle_noise = CLAMP(args->angle_noise, 0.0, 1.0);
+    args->latdeform = CLAMP(args->latdeform, 0.0, 1.0);
+    args->latdeform_noise = CLAMP(args->latdeform_noise, 0.0, 1.0);
+    args->lendeform = CLAMP(args->lendeform, 0.0, 1.0);
+    args->lendeform_noise = CLAMP(args->lendeform_noise, 0.0, 1.0);
+    args->deform_density = CLAMP(args->deform_density,
+                                 0.5, FIBRE_MAX_POINTS - 1.0);
+}
+
+static void
+fibre_synth_load_args(GwyContainer *container,
+                      FibreSynthArgs *args,
+                      GwyDimensionArgs *dimsargs)
+{
+    *args = fibre_synth_defaults;
+
+    gwy_container_gis_int32_by_name(container, active_page_key,
+                                    &args->active_page);
+    gwy_container_gis_boolean_by_name(container, update_key, &args->update);
+    gwy_container_gis_int32_by_name(container, seed_key, &args->seed);
+    gwy_container_gis_boolean_by_name(container, randomize_key,
+                                      &args->randomize);
+    gwy_container_gis_enum_by_name(container, type_key, &args->type);
+    gwy_container_gis_double_by_name(container, coverage_key, &args->coverage);
+    gwy_container_gis_double_by_name(container, width_key, &args->width);
+    gwy_container_gis_double_by_name(container, width_noise_key,
+                                     &args->width_noise);
+    gwy_container_gis_double_by_name(container, width_var_key,
+                                     &args->width_var);
+    gwy_container_gis_double_by_name(container, height_key, &args->height);
+    gwy_container_gis_double_by_name(container, height_noise_key,
+                                     &args->height_noise);
+    gwy_container_gis_double_by_name(container, height_var_key,
+                                     &args->height_var);
+    gwy_container_gis_boolean_by_name(container, height_bound_key,
+                                      &args->height_bound);
+    gwy_container_gis_double_by_name(container, htrunc_key, &args->htrunc);
+    gwy_container_gis_double_by_name(container, htrunc_noise_key,
+                                     &args->htrunc_noise);
+    gwy_container_gis_double_by_name(container, angle_key, &args->angle);
+    gwy_container_gis_double_by_name(container, angle_noise_key,
+                                     &args->angle_noise);
+    gwy_container_gis_double_by_name(container, latdeform_key,
+                                     &args->latdeform);
+    gwy_container_gis_double_by_name(container, latdeform_noise_key,
+                                     &args->latdeform_noise);
+    gwy_container_gis_double_by_name(container, lendeform_key,
+                                     &args->lendeform);
+    gwy_container_gis_double_by_name(container, lendeform_noise_key,
+                                     &args->lendeform_noise);
+    gwy_container_gis_double_by_name(container, deform_density_key,
+                                     &args->deform_density);
+    fibre_synth_sanitize_args(args);
+
+    gwy_clear(dimsargs, 1);
+    gwy_dimensions_copy_args(&dims_defaults, dimsargs);
+    gwy_dimensions_load_args(dimsargs, container, prefix);
+}
+
+static void
+fibre_synth_save_args(GwyContainer *container,
+                      const FibreSynthArgs *args,
+                      const GwyDimensionArgs *dimsargs)
+{
+    gwy_container_set_int32_by_name(container, active_page_key,
+                                    args->active_page);
+    gwy_container_set_boolean_by_name(container, update_key, args->update);
+    gwy_container_set_int32_by_name(container, seed_key, args->seed);
+    gwy_container_set_boolean_by_name(container, randomize_key,
+                                      args->randomize);
+    gwy_container_set_enum_by_name(container, type_key, args->type);
+    gwy_container_set_double_by_name(container, coverage_key, args->coverage);
+    gwy_container_set_double_by_name(container, width_key, args->width);
+    gwy_container_set_double_by_name(container, width_noise_key,
+                                     args->width_noise);
+    gwy_container_set_double_by_name(container, width_var_key, args->width_var);
+    gwy_container_set_double_by_name(container, height_key, args->height);
+    gwy_container_set_double_by_name(container, height_noise_key,
+                                     args->height_noise);
+    gwy_container_set_double_by_name(container, height_var_key,
+                                     args->height_var);
+    gwy_container_set_boolean_by_name(container, height_bound_key,
+                                      args->height_bound);
+    gwy_container_set_double_by_name(container, htrunc_key, args->htrunc);
+    gwy_container_set_double_by_name(container, htrunc_noise_key,
+                                     args->htrunc_noise);
+    gwy_container_set_double_by_name(container, angle_key, args->angle);
+    gwy_container_set_double_by_name(container, angle_noise_key,
+                                     args->angle_noise);
+    gwy_container_set_double_by_name(container, latdeform_key, args->latdeform);
+    gwy_container_set_double_by_name(container, latdeform_noise_key,
+                                     args->latdeform_noise);
+    gwy_container_set_double_by_name(container, lendeform_key, args->lendeform);
+    gwy_container_set_double_by_name(container, lendeform_noise_key,
+                                     args->lendeform_noise);
+    gwy_container_set_double_by_name(container, deform_density_key,
+                                     args->deform_density);
+
+    gwy_dimensions_save_args(dimsargs, container, prefix);
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/process/fit-shape.c b/modules/process/fit-shape.c
index 537d0c2..7f086b8 100644
--- a/modules/process/fit-shape.c
+++ b/modules/process/fit-shape.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: fit-shape.c 19147 2016-10-31 16:30:37Z yeti-dn $
- *  Copyright (C) 2016 David Necas (Yeti).
+ *  @(#) $Id: fit-shape.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2016-2017 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -40,6 +40,7 @@
 #include <libprocess/gwyshapefitpreset.h>
 #include <libgwydgets/gwycombobox.h>
 #include <libgwydgets/gwyradiobuttons.h>
+#include <libgwydgets/gwystock.h>
 #include <libgwydgets/gwyinventorystore.h>
 #include <libgwymodule/gwymodule-process.h>
 #include <libgwymodule/gwymodule-xyz.h>
@@ -219,7 +220,7 @@ static void         update_correl_table       (FitShapeControls *controls,
                                                GwyNLFitter *fitter);
 static void         update_secondary_table    (FitShapeControls *controls);
 static void         fit_shape_estimate        (FitShapeControls *controls);
-static void         fit_shape_reduced_fit     (FitShapeControls *controls);
+static void         fit_shape_quick_fit       (FitShapeControls *controls);
 static void         fit_shape_full_fit        (FitShapeControls *controls);
 static void         fit_copy_correl_matrix    (FitShapeControls *controls,
                                                GwyNLFitter *fitter);
@@ -234,22 +235,15 @@ static void         fit_context_resize_params (FitShapeContext *ctx,
 static void         fit_context_free          (FitShapeContext *ctx);
 static GwyNLFitter* fit                       (GwyShapeFitPreset *preset,
                                                const FitShapeContext *ctx,
-                                               guint maxiter,
                                                gdouble *param,
                                                gdouble *rss,
                                                GwySetFractionFunc set_fraction,
                                                GwySetMessageFunc set_message,
+                                               gboolean quick_fit,
                                                gboolean geometric_fit);
-static GwyNLFitter* fit_reduced               (GwyShapeFitPreset *preset,
-                                               const FitShapeContext *ctx,
-                                               gdouble *param,
-                                               gdouble *rss);
 static void         calculate_field           (GwyShapeFitPreset *preset,
                                                const gdouble *params,
                                                GwyDataField *dfield);
-static void         reduce_data_size          (const GwyXYZ *xyzsrc,
-                                               guint nsrc,
-                                               GwySurface *dest);
 static GString*     create_fit_report         (FitShapeControls *controls);
 static void         fit_shape_load_args       (GwyContainer *container,
                                                FitShapeArgs *args);
@@ -269,12 +263,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Fits predefined geometrical shapes to data."),
     "Yeti <yeti at gwyddion.net>",
-    "1.1",
+    "1.3",
     "David Nečas (Yeti)",
     "2016",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, fit_shape)
 
 static gboolean
 module_register(void)
@@ -282,14 +276,14 @@ module_register(void)
     gwy_process_func_register("fit_shape",
                               (GwyProcessFunc)&fit_shape,
                               N_("/_Level/_Fit Shape..."),
-                              NULL,
+                              GWY_STOCK_FIT_SHAPE,
                               FIT_SHAPE_RUN_MODES,
                               GWY_MENU_FLAG_DATA,
                               N_("Fit geometrical shapes"));
     gwy_xyz_func_register("xyz_fit_shape",
                           (GwyXYZFunc)&fit_shape_xyz,
                           N_("/_Fit Shape..."),
-                          NULL,
+                          GWY_STOCK_FIT_SHAPE,
                           FIT_SHAPE_RUN_MODES,
                           GWY_MENU_FLAG_XYZ,
                           N_("Fit geometrical shapes"));
@@ -348,6 +342,8 @@ fit_shape_dialogue(FitShapeArgs *args,
 {
     GtkWidget *dialogue, *notebook, *widget, *vbox, *hbox, *alignment,
               *hbox2, *label;
+    GtkClipboard *clipboard;
+    GdkDisplay *display;
     FitShapeControls controls;
     FitShapeContext ctx;
     GwyDataField *mydfield = NULL;
@@ -361,13 +357,11 @@ fit_shape_dialogue(FitShapeArgs *args,
     controls.ctx = &ctx;
     controls.id = id;
 
-    xyunit = gwy_data_field_get_si_unit_xy(dfield);
-    zunit = gwy_data_field_get_si_unit_z(dfield);
-    controls.same_units = gwy_si_unit_equal(xyunit, zunit);
-
     if (surface) {
         controls.pageno = GWY_PAGE_XYZS;
         controls.title = gwy_app_get_surface_title(data, id);
+        xyunit = gwy_surface_get_si_unit_xy(surface);
+        zunit = gwy_surface_get_si_unit_z(surface);
         mydfield = gwy_data_field_new(1, 1, 1.0, 1.0, FALSE);
         gwy_preview_surface_to_datafield(surface, mydfield,
                                          PREVIEW_SIZE, PREVIEW_SIZE,
@@ -377,17 +371,24 @@ fit_shape_dialogue(FitShapeArgs *args,
     else if (dfield) {
         controls.pageno = GWY_PAGE_CHANNELS;
         controls.title = gwy_app_get_data_field_title(data, id);
+        xyunit = gwy_data_field_get_si_unit_xy(dfield);
+        zunit = gwy_data_field_get_si_unit_z(dfield);
+
     }
     else {
         g_return_if_reached();
     }
 
+    controls.same_units = gwy_si_unit_equal(xyunit, zunit);
+
     controls.diff_gradient = gwy_inventory_new_item(gwy_gradients(),
                                                     GWY_GRADIENT_DEFAULT,
                                                     FIT_GRADIENT_NAME);
     gwy_resource_use(GWY_RESOURCE(controls.diff_gradient));
 
     dialogue = gtk_dialog_new_with_buttons(_("Fit Shape"), NULL, 0,
+                                           GTK_STOCK_COPY,
+                                           RESPONSE_COPY,
                                            GTK_STOCK_SAVE,
                                            RESPONSE_SAVE,
                                            gwy_sgettext("verb|_Fit"),
@@ -510,7 +511,7 @@ fit_shape_dialogue(FitShapeArgs *args,
             break;
 
             case RESPONSE_CALCULATE:
-            fit_shape_reduced_fit(&controls);
+            fit_shape_quick_fit(&controls);
             break;
 
             case RESPONSE_ESTIMATE:
@@ -524,6 +525,15 @@ fit_shape_dialogue(FitShapeArgs *args,
             g_string_free(report, TRUE);
             break;
 
+            case RESPONSE_COPY:
+            report = create_fit_report(&controls);
+            display = gtk_widget_get_display(dialogue);
+            clipboard = gtk_clipboard_get_for_display(display,
+                                                      GDK_SELECTION_CLIPBOARD);
+            gtk_clipboard_set_text(clipboard, report->str, -1);
+            g_string_free(report, TRUE);
+            break;
+
             default:
             g_assert_not_reached();
             break;
@@ -669,7 +679,7 @@ basic_tab_new(FitShapeControls *controls, GwyDataField *mfield)
 
     hbox = gtk_hbox_new(FALSE, 0);
 
-    table = gtk_table_new(8 + !!controls->same_units + 4*(!!mfield), 4, FALSE);
+    table = gtk_table_new(8 + !!controls->same_units + 4*(!!mfield), 3, FALSE);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
@@ -677,23 +687,25 @@ basic_tab_new(FitShapeControls *controls, GwyDataField *mfield)
     row = 0;
 
     controls->function = function_menu_new(args->function, controls);
-    gwy_table_attach_hscale(table, row, _("_Function type:"), NULL,
-                            GTK_OBJECT(controls->function), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("_Function type:"), NULL,
+                            GTK_OBJECT(controls->function),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     controls->output
         = gwy_enum_combo_box_new(outputs, G_N_ELEMENTS(outputs),
                                  G_CALLBACK(output_changed), controls,
                                  args->output, TRUE);
-    gwy_table_attach_hscale(table, row, _("Output _type:"), NULL,
-                            GTK_OBJECT(controls->output), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("Output _type:"), NULL,
+                            GTK_OBJECT(controls->output),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gtk_label_new(_("Preview:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls->display
@@ -701,7 +713,7 @@ basic_tab_new(FitShapeControls *controls, GwyDataField *mfield)
                                    G_CALLBACK(display_changed),
                                    controls, args->display);
     row = gwy_radio_buttons_attach_to_table(controls->display,
-                                            GTK_TABLE(table), 3, row);
+                                            GTK_TABLE(table), 2, row);
     row++;
 
     controls->diff_colourmap
@@ -710,7 +722,7 @@ basic_tab_new(FitShapeControls *controls, GwyDataField *mfield)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->diff_colourmap),
                                  args->diff_colourmap);
     gtk_table_attach(GTK_TABLE(table), controls->diff_colourmap,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls->diff_colourmap, "toggled",
                      G_CALLBACK(diff_colourmap_changed), controls);
     row++;
@@ -721,7 +733,7 @@ basic_tab_new(FitShapeControls *controls, GwyDataField *mfield)
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->geometric_fit),
                                      args->geometric_fit);
         gtk_table_attach(GTK_TABLE(table), controls->geometric_fit,
-                         0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         g_signal_connect(controls->geometric_fit, "toggled",
                          G_CALLBACK(geometric_fit_changed), controls);
         row++;
@@ -742,7 +754,7 @@ basic_tab_add_masking(FitShapeControls *controls, GtkWidget *table, gint row)
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gwy_label_new_header(_("Masking Mode"));
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls->masking
@@ -750,7 +762,7 @@ basic_tab_add_masking(FitShapeControls *controls, GtkWidget *table, gint row)
                                    G_CALLBACK(masking_changed),
                                    controls, args->masking);
     row = gwy_radio_buttons_attach_to_table(controls->masking,
-                                            GTK_TABLE(table), 3, row);
+                                            GTK_TABLE(table), 2, row);
     row++;
 
     controls->diff_excluded
@@ -759,7 +771,7 @@ basic_tab_add_masking(FitShapeControls *controls, GtkWidget *table, gint row)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->diff_excluded),
                                  args->diff_excluded);
     gtk_table_attach(GTK_TABLE(table), controls->diff_excluded,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls->diff_excluded, "toggled",
                      G_CALLBACK(diff_excluded_changed), controls);
     row++;
@@ -1588,7 +1600,7 @@ fit_shape_estimate(FitShapeControls *controls)
 }
 
 static void
-fit_shape_reduced_fit(FitShapeControls *controls)
+fit_shape_quick_fit(FitShapeControls *controls)
 {
     const FitShapeContext *ctx = controls->ctx;
     GwyNLFitter *fitter;
@@ -1596,11 +1608,13 @@ fit_shape_reduced_fit(FitShapeControls *controls)
     guint nparams;
 
     gwy_app_wait_cursor_start(GTK_WINDOW(controls->dialogue));
-    gwy_debug("start reduced fit");
+    gwy_debug("start quick fit");
     update_all_param_values(controls);
     nparams = gwy_shape_fit_preset_get_nparams(controls->preset);
     gwy_assign(controls->alt_param, controls->param, nparams);
-    fitter = fit_reduced(controls->preset, ctx, controls->param, &rss);
+    fitter = fit(controls->preset, ctx, controls->param, &rss, NULL, NULL,
+                 TRUE, controls->args->geometric_fit);
+
     if (rss >= 0.0)
         controls->state = FIT_SHAPE_QUICK_FITTED;
     else
@@ -1634,9 +1648,9 @@ fit_shape_full_fit(FitShapeControls *controls)
     nparams = gwy_shape_fit_preset_get_nparams(controls->preset);
     update_all_param_values(controls);
     gwy_assign(controls->alt_param, controls->param, nparams);
-    fitter = fit(controls->preset, ctx, G_MAXUINT, controls->param, &rss,
+    fitter = fit(controls->preset, ctx, controls->param, &rss,
                  gwy_app_wait_set_fraction, gwy_app_wait_set_message,
-                 controls->args->geometric_fit);
+                 FALSE, controls->args->geometric_fit);
 
     if (rss >= 0.0)
         controls->state = FIT_SHAPE_FITTED;
@@ -1860,6 +1874,9 @@ update_fit_state(FitShapeControls *controls)
     gtk_dialog_set_response_sensitive(GTK_DIALOG(controls->dialogue),
                                       RESPONSE_SAVE,
                                       controls->state == FIT_SHAPE_FITTED);
+    gtk_dialog_set_response_sensitive(GTK_DIALOG(controls->dialogue),
+                                      RESPONSE_COPY,
+                                      controls->state == FIT_SHAPE_FITTED);
 }
 
 static void
@@ -1889,8 +1906,12 @@ update_fit_results(FitShapeControls *controls, GwyNLFitter *fitter)
 
     if (is_fitted) {
         nparams = gwy_shape_fit_preset_get_nparams(controls->preset);
-        for (i = 0; i < nparams; i++)
-            controls->param_err[i] = gwy_math_nlfit_get_sigma(fitter, i);
+        for (i = 0; i < nparams; i++) {
+            if (ctx->param_fixed[i])
+                controls->param_err[i] = 0.0;
+            else
+                controls->param_err[i] = gwy_math_nlfit_get_sigma(fitter, i);
+        }
     }
 
     dfield = gwy_container_get_object_by_name(controls->mydata, "/0/data");
@@ -1966,54 +1987,31 @@ fit_context_free(FitShapeContext *ctx)
 
 static GwyNLFitter*
 fit(GwyShapeFitPreset *preset, const FitShapeContext *ctx,
-    guint maxiter, gdouble *param, gdouble *rss,
+    gdouble *param, gdouble *rss,
     GwySetFractionFunc set_fraction, GwySetMessageFunc set_message,
-    gboolean geometric_fit)
+    gboolean quick_fit, gboolean geometric_fit)
 {
     GwyNLFitter *fitter;
 
     fitter = gwy_shape_fit_preset_create_fitter(preset);
     if (set_fraction || set_message)
         gwy_math_nlfit_set_callbacks(fitter, set_fraction, set_message);
-    if (maxiter != G_MAXUINT)
-        gwy_math_nlfit_set_max_iterations(fitter, maxiter);
     if (geometric_fit)
         gwy_math_nlfit_set_approx_geometric(fitter, TRUE);
 
-    gwy_shape_fit_preset_fit(preset, fitter, ctx->xyz, ctx->n,
-                             param, ctx->param_fixed, rss);
+    if (quick_fit) {
+        gwy_shape_fit_preset_quick_fit(preset, fitter, ctx->xyz, ctx->n,
+                                       param, ctx->param_fixed, rss);
+    }
+    else {
+        gwy_shape_fit_preset_fit(preset, fitter, ctx->xyz, ctx->n,
+                                 param, ctx->param_fixed, rss);
+    }
     gwy_debug("rss from nlfit %g", *rss);
 
     return fitter;
 }
 
-/* XXX XXX XXX XXX XXX This is duplicated in gwyshapefitpreset.c and it should
- * probably go to the library.  There we can do something better in the future
- * than random choice, for instance a mix of spatially uniform and random
- * choice. */
-static GwyNLFitter*
-fit_reduced(GwyShapeFitPreset *preset, const FitShapeContext *ctx,
-            gdouble *param, gdouble *rss)
-{
-    GwyNLFitter *fitter;
-    FitShapeContext ctxred;
-    guint nred = (guint)sqrt(ctx->n*(gdouble)NREDLIM);
-
-    if (nred >= ctx->n)
-        return fit(preset, ctx, 30, param, rss, NULL, NULL, FALSE);
-
-    ctxred = *ctx;
-    ctxred.n = nred;
-    ctxred.surface = gwy_surface_new_sized(nred);
-    ctxred.xyz = gwy_surface_get_data_const(ctxred.surface);
-    reduce_data_size(gwy_surface_get_data_const(ctx->surface), ctx->n,
-                     ctxred.surface);
-    fitter = fit(preset, &ctxred, 30, param, rss, NULL, NULL, FALSE);
-    g_object_unref(ctxred.surface);
-
-    return fitter;
-}
-
 static void
 calculate_field(GwyShapeFitPreset *preset, const gdouble *params,
                 GwyDataField *dfield)
@@ -2030,22 +2028,6 @@ calculate_field(GwyShapeFitPreset *preset, const gdouble *params,
     g_object_unref(surface);
 }
 
-static void
-reduce_data_size(const GwyXYZ *xyzsrc, guint nsrc, GwySurface *dest)
-{
-    GwyRandGenSet *rngset = gwy_rand_gen_set_new(1);
-    guint ndest = gwy_surface_get_npoints(dest);
-    guint *redindex = gwy_rand_gen_set_choose_shuffle(rngset, 0, nsrc, ndest);
-    GwyXYZ *xyzdest = gwy_surface_get_data(dest);
-    guint i;
-
-    for (i = 0; i < ndest; i++)
-        xyzdest[i] = xyzsrc[redindex[i]];
-
-    g_free(redindex);
-    gwy_rand_gen_set_free(rngset);
-}
-
 static GString*
 create_fit_report(FitShapeControls *controls)
 {
@@ -2250,6 +2232,8 @@ fit_shape_save_args(GwyContainer *container,
                                       args->diff_colourmap);
     gwy_container_set_boolean_by_name(container, diff_excluded_key,
                                       args->diff_excluded);
+    gwy_container_set_boolean_by_name(container, geometric_fit_key,
+                                      args->geometric_fit);
 }
 
 /* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/process/flatten_base.c b/modules/process/flatten_base.c
index 301e029..603fe2c 100644
--- a/modules/process/flatten_base.c
+++ b/modules/process/flatten_base.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: flatten_base.c 19155 2016-11-01 08:49:49Z yeti-dn $
+ *  @(#) $Id: flatten_base.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -48,7 +48,7 @@ static GwyModuleInfo module_info = {
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, flatten_base)
 
 static gboolean
 module_register(void)
diff --git a/modules/process/fraccor.c b/modules/process/fraccor.c
index 674b162..e7466ca 100644
--- a/modules/process/fraccor.c
+++ b/modules/process/fraccor.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: fraccor.c 16388 2014-07-10 14:26:53Z yeti-dn $
+ *  @(#) $Id: fraccor.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -23,6 +23,7 @@
 #include <libgwyddion/gwymacros.h>
 #include <libprocess/datafield.h>
 #include <libprocess/fractals.h>
+#include <libgwydgets/gwystock.h>
 #include <libgwymodule/gwymodule-process.h>
 #include <app/gwyapp.h>
 
@@ -42,7 +43,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, fraccor)
 
 static gboolean
 module_register(void)
@@ -50,7 +51,7 @@ module_register(void)
     gwy_process_func_register("fraccor",
                               (GwyProcessFunc)&fraccor,
                               N_("/_Correct Data/_Fractal Correction"),
-                              NULL,
+                              GWY_STOCK_FRACTAL_CORRECTION,
                               FRACCOR_RUN_MODES,
                               GWY_MENU_FLAG_DATA_MASK | GWY_MENU_FLAG_DATA,
                               N_("Interpolate data under mask with fractal "
diff --git a/modules/process/fractal.c b/modules/process/fractal.c
index a1f9f26..b7b1370 100644
--- a/modules/process/fractal.c
+++ b/modules/process/fractal.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: fractal.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: fractal.c 19972 2017-06-24 09:15:44Z yeti-dn $
  *  Copyright (C) 2003-2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -85,10 +85,6 @@ static void       fractal                 (GwyContainer *data,
                                            GwyRunType run);
 static void       fractal_dialog          (FractalArgs *args,
                                            GwyContainer *data);
-static GtkWidget* attach_value_row        (GtkWidget *table,
-                                           gint row,
-                                           const gchar *description,
-                                           const gchar *value);
 static void       interp_changed_cb       (GtkWidget *combo,
                                            FractalArgs *args);
 static void       out_changed_cb          (GtkWidget *combo,
@@ -173,12 +169,12 @@ static GwyModuleInfo module_info = {
     N_("Calculates fractal dimension using several methods "
        "(partitioning, box counting, triangulation, power spectrum)."),
     "Jindřich Bilek & Petr Klapetek <klapetek at gwyddion.net>",
-    "1.8",
+    "1.9",
     "David Nečas (Yeti) & Petr Klapetek & Jindřich Bílek",
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, fractal)
 
 static gboolean
 module_register(void)
@@ -186,7 +182,7 @@ module_register(void)
     gwy_process_func_register("fractal",
                               (GwyProcessFunc)&fractal,
                               N_("/_Statistics/_Fractal Dimension..."),
-                              GWY_STOCK_FRACTAL,
+                              GWY_STOCK_FRACTAL_MEASURE,
                               FRACTAL_RUN_MODES,
                               GWY_MENU_FLAG_DATA,
                               N_("Calculate fractal dimension"));
@@ -208,7 +204,7 @@ fractal(GwyContainer *data, GwyRunType run)
 static void
 fractal_dialog(FractalArgs *args, GwyContainer *data)
 {
-    GtkWidget *dialog, *table, *hbox, *vbox, *label, *button, *hbox2;
+    GtkWidget *dialog, *table, *hbox, *vbox;
     GwyDataChooser *chooser;
     GwyGraphArea *area;
     GwySelection *selection;
@@ -225,8 +221,9 @@ fractal_dialog(FractalArgs *args, GwyContainer *data)
     /* The axes should be unitless so no unit initialisation is necessary. */
 
     dialog = gtk_dialog_new_with_buttons(_("Fractal Dimension"), NULL, 0, NULL);
-    button = gwy_stock_like_button_new(_("Reco_mpute"), GTK_STOCK_EXECUTE);
-    gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button,
+    gtk_dialog_add_action_widget(GTK_DIALOG(dialog),
+                                 gwy_stock_like_button_new(_("_Update"),
+                                                           GTK_STOCK_EXECUTE),
                                  RESPONSE_CALCULATE);
     gtk_dialog_add_button(GTK_DIALOG(dialog), _("_Reset"), RESPONSE_RESET);
     gtk_dialog_add_button(GTK_DIALOG(dialog),
@@ -244,70 +241,51 @@ fractal_dialog(FractalArgs *args, GwyContainer *data)
     gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
 
     /* Parameters */
-    table = gtk_table_new(4, 2, FALSE);
+    table = gtk_table_new(GWY_FRACTAL_NMETHODS + 7, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
     row = 0;
 
-    label = gtk_label_new_with_mnemonic(_("_Interpolation type:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    controls.out = gwy_enum_combo_box_new(methods, G_N_ELEMENTS(methods),
+                                          G_CALLBACK(out_changed_cb), &controls,
+                                          args->out, TRUE);
+    gwy_table_attach_adjbar(table, row, _("_Method:"), NULL,
+                            GTK_OBJECT(controls.out),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     controls.interp
         = gwy_enum_combo_box_new(gwy_interpolation_type_get_enum(), -1,
                                  G_CALLBACK(interp_changed_cb), args,
                                  args->interp, TRUE);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.interp);
-    gtk_table_attach(GTK_TABLE(table), controls.interp,
-                     0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
-    row++;
-
-    label = gtk_label_new_with_mnemonic(_("_Method:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    row++;
-
-    controls.out = gwy_enum_combo_box_new(methods, G_N_ELEMENTS(methods),
-                                          G_CALLBACK(out_changed_cb), &controls,
-                                          args->out, TRUE);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.out);
-    gtk_table_attach(GTK_TABLE(table), controls.out,
-                     0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gwy_table_attach_adjbar(table, row, _("_Interpolation type:"), NULL,
+                            GTK_OBJECT(controls.interp),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     /* Area */
-    table = gtk_table_new(3, 2, FALSE);
-    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
-    gtk_table_set_col_spacings(GTK_TABLE(table), 6);
-    gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
-    row = 0;
-
-    label = gwy_label_new_header(_("Fit Area"));
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Fit Area")),
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
-    controls.from = attach_value_row(table, row, _("From:"), _("minimum"));
+    controls.from = gtk_label_new(_("minimum"));
+    gwy_table_attach_adjbar(table, row, _("From:"), NULL,
+                            GTK_OBJECT(controls.from),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
-    controls.to = attach_value_row(table, row, _("To:"), _("maximum"));
+    controls.to = gtk_label_new(_("maximum"));
+    gwy_table_attach_adjbar(table, row, _("To:"), NULL,
+                            GTK_OBJECT(controls.to),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     /* Results */
-    table = gtk_table_new(GWY_FRACTAL_NMETHODS + 1, 2, FALSE);
-    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
-    gtk_table_set_col_spacings(GTK_TABLE(table), 6);
-    gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
-    row = 0;
-
-    label = gwy_label_new_header(_("Result"));
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Result")),
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     /* FIXME: This is a latinism. */
@@ -315,20 +293,16 @@ fractal_dialog(FractalArgs *args, GwyContainer *data)
     for (i = 0; i < GWY_FRACTAL_NMETHODS; i++) {
         g_string_assign(str, _(methods[i].name));
         g_string_append_c(str, ':');
-        controls.results[i] = attach_value_row(table, row, str->str, NULL);
+        controls.results[i] = gtk_label_new(NULL);
+        gwy_table_attach_adjbar(table, row, str->str, NULL,
+                                GTK_OBJECT(controls.results[i]),
+                                GWY_HSCALE_WIDGET_NO_EXPAND);
         gtk_label_set_selectable(GTK_LABEL(controls.results[i]), TRUE);
         row++;
     }
     g_string_free(str, TRUE);
     row++;
 
-    hbox2 = gtk_hbox_new(FALSE, 6);
-    gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0);
-
-    label = gtk_label_new_with_mnemonic(_("Target _graph:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
-
     controls.target_graph = gwy_data_chooser_new_graphs();
     chooser = GWY_DATA_CHOOSER(controls.target_graph);
     gwy_data_chooser_set_none(chooser, _("New graph"));
@@ -336,8 +310,9 @@ fractal_dialog(FractalArgs *args, GwyContainer *data)
     gwy_data_chooser_set_filter(chooser, filter_target_graphs, &controls, NULL);
     gwy_data_chooser_set_active_id(chooser, &args->target_graph);
     gwy_data_chooser_get_active_id(chooser, &args->target_graph);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.target_graph);
-    gtk_box_pack_end(GTK_BOX(hbox2), controls.target_graph, FALSE, FALSE, 0);
+    gwy_table_attach_adjbar(table, row, _("Target _graph:"), NULL,
+                            GTK_OBJECT(controls.target_graph),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     g_signal_connect_swapped(controls.target_graph, "changed",
                              G_CALLBACK(target_graph_changed), &controls);
     row++;
@@ -394,25 +369,6 @@ fractal_dialog(FractalArgs *args, GwyContainer *data)
     gtk_widget_destroy(dialog);
 }
 
-static GtkWidget*
-attach_value_row(GtkWidget *table, gint row,
-                 const gchar *description, const gchar *value)
-{
-    GtkWidget *label;
-
-    label = gtk_label_new(description);
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    label = gtk_label_new(value);
-    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    return label;
-}
-
 static void
 interp_changed_cb(GtkWidget *combo,
                   FractalArgs *args)
diff --git a/modules/process/gradient.c b/modules/process/gradient.c
index c67b755..0fbf0ee 100644
--- a/modules/process/gradient.c
+++ b/modules/process/gradient.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gradient.c 16388 2014-07-10 14:26:53Z yeti-dn $
+ *  @(#) $Id: gradient.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -48,7 +48,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, gradient)
 
 static gboolean
 module_register(void)
diff --git a/modules/process/grain_cross.c b/modules/process/grain_cross.c
index 1c19bde..9a12960 100644
--- a/modules/process/grain_cross.c
+++ b/modules/process/grain_cross.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: grain_cross.c 18626 2016-04-22 10:15:13Z yeti-dn $
+ *  @(#) $Id: grain_cross.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2007 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -105,7 +105,7 @@ static GwyModuleInfo module_info = {
     "2007",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, grain_cross)
 
 static gboolean
 module_register(void)
@@ -233,6 +233,7 @@ grain_cross_dialog(GrainCrossArgs *args,
     gmodel = create_corr_graph(args, dfield);
     controls.graph = gwy_graph_new(gmodel);
     gtk_widget_set_size_request(controls.graph, 320, -1);
+    gwy_graph_enable_user_input(GWY_GRAPH(controls.graph), FALSE);
     g_object_unref(gmodel);
     gtk_table_attach(GTK_TABLE(table), controls.graph, 0, 1, 0, 3,
                      GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
diff --git a/modules/process/grain_dist.c b/modules/process/grain_dist.c
index dbfd5ab..aa128c6 100644
--- a/modules/process/grain_dist.c
+++ b/modules/process/grain_dist.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: grain_dist.c 18537 2016-03-28 18:11:19Z yeti-dn $
- *  Copyright (C) 2003-2012 David Necas (Yeti), Petr Klapetek, Sven Neumann.
+ *  @(#) $Id: grain_dist.c 20063 2017-07-11 11:03:01Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek, Sven Neumann.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, neumann at jpk.com.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -153,7 +153,7 @@ static GwyModuleInfo module_info = {
     N_("Evaluates distribution of grains (continuous parts of mask)."),
     "Petr Klapetek <petr at klapetek.cz>, Sven Neumann <neumann at jpk.com>, "
         "Yeti <yeti at gwyddion.net>",
-    "4.2",
+    "4.3",
     "David Nečas (Yeti) & Petr Klapetek & Sven Neumann",
     "2003",
 };
@@ -165,7 +165,7 @@ static const gchar add_comment_key[] = "/module/grain_dist/add_comment";
 static const gchar selected_key[]    = "/module/grain_dist/selected";
 static const gchar expanded_key[]    = "/module/grain_dist/expanded";
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, grain_dist)
 
 static gboolean
 module_register(void)
@@ -256,6 +256,7 @@ grain_dist_dialog(GrainDistArgs *args,
     gmodel = gwy_graph_model_new();
     controls.graph = gwy_graph_new(gmodel);
     gtk_widget_set_size_request(controls.graph, 360, -1);
+    gwy_graph_enable_user_input(GWY_GRAPH(controls.graph), FALSE);
     g_object_unref(gmodel);
     gtk_box_pack_start(GTK_BOX(hbox), controls.graph, TRUE, TRUE, 4);
 
@@ -291,7 +292,7 @@ grain_dist_dialog(GrainDistArgs *args,
                              G_CALLBACK(selected_changed), &controls);
 
     /* Options */
-    table = GTK_TABLE(gtk_table_new(5, 4, FALSE));
+    table = GTK_TABLE(gtk_table_new(5, 3, FALSE));
     gtk_table_set_row_spacings(table, 2);
     gtk_table_set_col_spacings(table, 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -304,12 +305,12 @@ grain_dist_dialog(GrainDistArgs *args,
                                              args->mode);
 
     gtk_table_attach(table, gwy_label_new_header(_("Options")),
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     l = controls.mode;
     gtk_table_attach(table, GTK_WIDGET(l->data),
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     l = g_slist_next(l);
     row++;
 
@@ -319,13 +320,13 @@ grain_dist_dialog(GrainDistArgs *args,
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.add_comment),
                                  args->add_comment);
     gtk_table_attach(table, controls.add_comment,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.add_comment, "toggled",
                              G_CALLBACK(add_comment_changed), &controls);
     row++;
 
     gtk_table_attach(table, GTK_WIDGET(l->data),
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     l = g_slist_next(l);
     gtk_table_set_row_spacing(table, row, 8);
     row++;
@@ -333,7 +334,8 @@ grain_dist_dialog(GrainDistArgs *args,
     controls.resolution = gtk_adjustment_new(args->resolution,
                                              MIN_RESOLUTION, MAX_RESOLUTION,
                                              1, 10, 0);
-    gwy_table_attach_hscale(GTK_WIDGET(table), row, _("_Fix res.:"), NULL,
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row,
+                            _("_Fixed resolution:"), NULL,
                             controls.resolution, GWY_HSCALE_CHECK);
     controls.fixres = gwy_table_hscale_get_check(controls.resolution);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.fixres),
@@ -438,24 +440,16 @@ static void
 update_sensitivity(GrainDistControls *controls, GrainDistArgs *args)
 {
     GtkTreeView *treeview;
-    GtkWidget *check, *w;
 
-    check = gwy_table_hscale_get_check(controls->resolution);
     switch (args->mode) {
         case MODE_GRAPH:
         gtk_widget_set_sensitive(controls->add_comment, FALSE);
-        gtk_widget_set_sensitive(check, TRUE);
-        gtk_toggle_button_toggled(GTK_TOGGLE_BUTTON(check));
-        gtk_toggle_button_toggled(GTK_TOGGLE_BUTTON(check));
+        gwy_table_hscale_set_sensitive(controls->resolution, TRUE);
         break;
 
         case MODE_RAW:
         gtk_widget_set_sensitive(controls->add_comment, TRUE);
-        gtk_widget_set_sensitive(check, FALSE);
-        w = gwy_table_hscale_get_scale(controls->resolution);
-        gtk_widget_set_sensitive(w, FALSE);
-        w = gwy_table_hscale_get_middle_widget(controls->resolution);
-        gtk_widget_set_sensitive(w, FALSE);
+        gwy_table_hscale_set_sensitive(controls->resolution, FALSE);
         break;
 
         default:
diff --git a/modules/process/grain_edge.c b/modules/process/grain_edge.c
index 9887fa7..892ea7c 100644
--- a/modules/process/grain_edge.c
+++ b/modules/process/grain_edge.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: grain_edge.c 18673 2016-05-03 13:08:36Z dn2010 $
+ *  @(#) $Id: grain_edge.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2011 David Necas (Yeti), Petr Klapetek, Daniil Bratashov.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, dn2010 at gmail.com.
  *
@@ -27,6 +27,7 @@
 #include <libprocess/grains.h>
 #include <libprocess/stats.h>
 #include <libgwydgets/gwycombobox.h>
+#include <libgwydgets/gwyradiobuttons.h>
 #include <libgwydgets/gwystock.h>
 #include <libgwymodule/gwymodule-process.h>
 #include <app/gwymoduleutils.h>
@@ -48,7 +49,7 @@ typedef struct {
     GwyContainer *mydata;
     GtkObject *threshold_laplasian;
     GtkWidget *combine;
-    GtkWidget *combine_type;
+    GSList *combine_type;
     GtkWidget *color_button;
     GtkWidget *update;
     GEdgeArgs *args;
@@ -75,8 +76,6 @@ static void     gedge_dialog_update_values  (GEdgeControls *controls,
                                              GEdgeArgs *args);
 static void     update_changed              (GEdgeControls *controls);
 static void     gedge_invalidate            (GEdgeControls *controls);
-static void     gedge_invalidate2           (gpointer instance,
-                                             GEdgeControls *controls);
 static void     preview                     (GEdgeControls *controls,
                                              GEdgeArgs *args);
 static void     gedge_process               (GwyDataField *dfield,
@@ -99,12 +98,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Marks grains by edge detection method."),
     "Daniil Bratashov <dn2010 at gmail.com>",
-    "0.3",
+    "0.5",
     "David Nečas (Yeti) & Petr Klapetek & Daniil Bratashov",
     "2011",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, grain_edge)
 
 static gboolean
 module_register(void)
@@ -151,7 +150,7 @@ table_attach_threshold(GtkWidget *table, gint *row, const gchar *name,
                        gpointer data)
 {
     *adj = gtk_adjustment_new(value, 0.0, 100.0, 0.1, 5, 0);
-    gwy_table_attach_hscale(table, *row, name, "%", *adj, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, *row, name, "%", *adj, GWY_HSCALE_DEFAULT);
     g_signal_connect_swapped(*adj, "value-changed",
                              G_CALLBACK(gedge_invalidate), data);
     (*row)++;
@@ -235,7 +234,7 @@ gedge_dialog(GEdgeArgs *args,
     controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, TRUE);
     gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4);
 
-    table = gtk_table_new(5, 4, FALSE);
+    table = gtk_table_new(5, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -243,7 +242,7 @@ gedge_dialog(GEdgeArgs *args,
     row = 0;
 
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Threshold")),
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     table_attach_threshold(table, &row, _("_Laplacian:"),
@@ -253,36 +252,24 @@ gedge_dialog(GEdgeArgs *args,
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
 
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Options")),
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     if (mfield) {
         gwy_container_set_object_by_name(controls.mydata, "/1/mask", mfield);
-        controls.combine
-            = gtk_check_button_new_with_mnemonic(_("Com_bine with "
-                                                   "existing mask"));
-        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.combine),
-                                     args->combine);
-        gtk_table_attach(GTK_TABLE(table), controls.combine,
-                         0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-        g_signal_connect_swapped(controls.combine, "toggled",
-                                 G_CALLBACK(gedge_invalidate), &controls);
-        row++;
-
-        controls.combine_type
-            = gwy_enum_combo_box_new(gwy_merge_type_get_enum(), -1,
-                                     G_CALLBACK(gedge_invalidate2), &controls,
-                                     args->combine_type, TRUE);
-        gwy_table_attach_hscale(table, row, _("Operation:"), NULL,
-                                GTK_OBJECT(controls.combine_type),
-                                GWY_HSCALE_WIDGET);
-        gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+        create_mask_merge_buttons(table, row, NULL,
+                                  args->combine,
+                                  G_CALLBACK(gedge_invalidate),
+                                  args->combine_type,
+                                  G_CALLBACK(gedge_invalidate),
+                                  &controls,
+                                  &controls.combine, &controls.combine_type);
         row++;
     }
 
     controls.color_button = create_mask_color_button(controls.mydata, dialog,
                                                      0);
-    gwy_table_attach_hscale(table, row, _("_Mask color:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Mask color:"), NULL,
                             GTK_OBJECT(controls.color_button),
                             GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
@@ -291,7 +278,7 @@ gedge_dialog(GEdgeArgs *args,
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.update),
                                  args->update);
     gtk_table_attach(GTK_TABLE(table), controls.update,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.update, "toggled",
                              G_CALLBACK(update_changed), &controls);
 
@@ -367,13 +354,12 @@ gedge_dialog_update_controls(GEdgeControls *controls,
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->update),
                                  args->update);
 
-    if (!controls->combine)
-        return;
-
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->combine),
-                                 args->combine);
-    gwy_enum_combo_box_set_active(GTK_COMBO_BOX(controls->combine_type),
-                                  args->combine_type);
+    if (controls->combine) {
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->combine),
+                                     args->combine);
+        gwy_radio_buttons_set_current(controls->combine_type,
+                                      args->combine_type);
+    }
 }
 
 static void
@@ -385,13 +371,12 @@ gedge_dialog_update_values(GEdgeControls *controls,
     args->update
         = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(controls->update));
 
-    if (!controls->combine)
-        return;
-
-    args->combine
-        = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(controls->combine));
-    args->combine_type
-        = gwy_enum_combo_box_get_active(GTK_COMBO_BOX(controls->combine_type));
+    if (controls->combine) {
+        args->combine
+            = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(controls->combine));
+        args->combine_type
+            = gwy_radio_buttons_get_current(controls->combine_type);
+    }
 }
 
 static void
@@ -405,13 +390,6 @@ gedge_invalidate(GEdgeControls *controls)
 }
 
 static void
-gedge_invalidate2(G_GNUC_UNUSED gpointer instance,
-                  GEdgeControls *controls)
-{
-    gedge_invalidate(controls);
-}
-
-static void
 preview(GEdgeControls *controls,
         GEdgeArgs *args)
 {
diff --git a/modules/process/grain_filter.c b/modules/process/grain_filter.c
index 9bbc8d1..fc51b6e 100644
--- a/modules/process/grain_filter.c
+++ b/modules/process/grain_filter.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: grain_filter.c 18537 2016-03-28 18:11:19Z yeti-dn $
- *  Copyright (C) 2014 David Necas (Yeti).
+ *  @(#) $Id: grain_filter.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2014-2017 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -29,6 +29,7 @@
 #include <libprocess/grains.h>
 #include <libgwydgets/gwystock.h>
 #include <libgwydgets/gwycombobox.h>
+#include <libgwydgets/gwyadjustbar.h>
 #include <libgwydgets/gwygrainvaluemenu.h>
 #include <libgwymodule/gwymodule-process.h>
 #include <app/gwymoduleutils.h>
@@ -94,12 +95,10 @@ typedef struct {
     GwySIValueFormat *vf[NQUANTITIES];
     GtkWidget *header[NQUANTITIES];
     GtkObject *lower[NQUANTITIES];
-    GtkWidget *lower_label[NQUANTITIES];
     GtkWidget *lower_scale[NQUANTITIES];
     GtkWidget *lower_entry[NQUANTITIES];
     GtkWidget *lower_units[NQUANTITIES];
     GtkObject *upper[NQUANTITIES];
-    GtkWidget *upper_label[NQUANTITIES];
     GtkWidget *upper_scale[NQUANTITIES];
     GtkWidget *upper_entry[NQUANTITIES];
     GtkWidget *upper_units[NQUANTITIES];
@@ -195,12 +194,12 @@ static GwyModuleInfo module_info = {
     N_("Filters grains by their properties, using logical expressions "
        "and thresholds."),
     "Yeti <yeti at gwyddion.net>",
-    "1.1",
+    "1.2",
     "David Nečas (Yeti)",
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, grain_filter)
 
 static gboolean
 module_register(void)
@@ -362,7 +361,7 @@ gfilter_dialog(GFilterArgs *args,
     gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.color_button);
     gtk_box_pack_start(GTK_BOX(hbox2), controls.color_button, FALSE, FALSE, 0);
 
-    table = gtk_table_new(10, 4, FALSE);
+    table = gtk_table_new(10, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -373,8 +372,8 @@ gfilter_dialog(GFilterArgs *args,
     scwin = gtk_scrolled_window_new(NULL, NULL);
     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin),
                                    GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
-    gtk_table_attach(GTK_TABLE(table), scwin, 0, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), scwin, 0, 3, row, row+1,
+                     GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
 
     controls.values = gwy_grain_value_tree_view_new(FALSE,
                                                     "name", "symbol_markup",
@@ -401,7 +400,7 @@ gfilter_dialog(GFilterArgs *args,
         g_signal_connect_swapped(controls.set_as[i], "clicked",
                                  G_CALLBACK(set_as_clicked), &controls);
     }
-    gwy_table_attach_hscale(table, row++,
+    gwy_table_attach_adjbar(table, row++,
                             _("Set selected as:"), NULL,
                             GTK_OBJECT(hbox2), GWY_HSCALE_WIDGET_NO_EXPAND);
 
@@ -416,7 +415,7 @@ gfilter_dialog(GFilterArgs *args,
                                   "(A ∧ B) ∨ C", GRAIN_LOGICAL_A_AND_B_OR_C,
                                   "(A ∨ B) ∧ C", GRAIN_LOGICAL_A_OR_B_AND_C,
                                   NULL);
-    gwy_table_attach_hscale(table, row++,
+    gwy_table_attach_adjbar(table, row++,
                             _("Keep grains satisfying:"), NULL,
                             GTK_OBJECT(controls.logical_op),
                             GWY_HSCALE_WIDGET);
@@ -427,33 +426,25 @@ gfilter_dialog(GFilterArgs *args,
         controls.header[i] = gtk_label_new(NULL);
         gtk_misc_set_alignment(GTK_MISC(controls.header[i]), 0.0, 0.5);
         gtk_table_attach(GTK_TABLE(table), controls.header[i],
-                         0, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
 
         /* The values are set properly later. */
-        controls.lower_label[i] = gtk_label_new(_("Lower threshold:"));
-        gtk_misc_set_alignment(GTK_MISC(controls.lower_label[i]), 0.0, 0.5);
-        gtk_table_attach(GTK_TABLE(table), controls.lower_label[i],
-                         0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
-        controls.lower[i] = gtk_adjustment_new(0.0, 0.0, 0.0,
-                                               1.0, 10.0, 0.0);
+        controls.lower[i] = gtk_adjustment_new(0.0, 0.0, 0.0, 1.0, 10.0, 0.0);
         g_object_set_data(G_OBJECT(controls.lower[i]), "id",
                           GUINT_TO_POINTER(i));
         g_signal_connect_swapped(controls.lower[i], "value-changed",
                                  G_CALLBACK(threshold_changed), &controls);
         controls.lower_scale[i]
-            = gtk_hscale_new(GTK_ADJUSTMENT(controls.lower[i]));
-        gtk_scale_set_draw_value(GTK_SCALE(controls.lower_scale[i]), FALSE);
-        gtk_widget_set_size_request(controls.lower_scale[i],
-                                    GWY_HSCALE_WIDTH, -1);
+            = gwy_adjust_bar_new(GTK_ADJUSTMENT(controls.lower[i]),
+                                 _("Lower threshold:"));
         gtk_table_attach(GTK_TABLE(table), controls.lower_scale[i],
-                         1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                         0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
 
         controls.lower_entry[i] = gtk_entry_new();
         gtk_entry_set_width_chars(GTK_ENTRY(controls.lower_entry[i]), 8);
         gtk_table_attach(GTK_TABLE(table), controls.lower_entry[i],
-                         2, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                         1, 2, row, row+1, GTK_FILL, 0, 0, 0);
         gwy_widget_set_activate_on_unfocus(controls.lower_entry[i], TRUE);
         g_object_set_data(G_OBJECT(controls.lower_entry[i]), "id",
                           GUINT_TO_POINTER(i));
@@ -463,32 +454,24 @@ gfilter_dialog(GFilterArgs *args,
         controls.lower_units[i] = gtk_label_new(NULL);
         gtk_misc_set_alignment(GTK_MISC(controls.lower_units[i]), 0.0, 0.5);
         gtk_table_attach(GTK_TABLE(table), controls.lower_units[i],
-                         3, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                         2, 3, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
 
-        controls.upper_label[i] = gtk_label_new(_("Upper threshold:"));
-        gtk_misc_set_alignment(GTK_MISC(controls.upper_label[i]), 0.0, 0.5);
-        gtk_table_attach(GTK_TABLE(table), controls.upper_label[i],
-                         0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
-        controls.upper[i] = gtk_adjustment_new(0.0, 0.0, 0.0,
-                                               1.0, 10.0, 0.0);
+        controls.upper[i] = gtk_adjustment_new(0.0, 0.0, 0.0, 1.0, 10.0, 0.0);
         g_object_set_data(G_OBJECT(controls.upper[i]), "id",
                           GUINT_TO_POINTER(i | IS_UPPER));
         g_signal_connect_swapped(controls.upper[i], "value-changed",
                                  G_CALLBACK(threshold_changed), &controls);
         controls.upper_scale[i]
-            = gtk_hscale_new(GTK_ADJUSTMENT(controls.upper[i]));
-        gtk_scale_set_draw_value(GTK_SCALE(controls.upper_scale[i]), FALSE);
-        gtk_widget_set_size_request(controls.upper_scale[i],
-                                    GWY_HSCALE_WIDTH, -1);
+            = gwy_adjust_bar_new(GTK_ADJUSTMENT(controls.upper[i]),
+                                 _("Upper threshold:"));
         gtk_table_attach(GTK_TABLE(table), controls.upper_scale[i],
-                         1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                         0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
 
         controls.upper_entry[i] = gtk_entry_new();
         gtk_entry_set_width_chars(GTK_ENTRY(controls.upper_entry[i]), 8);
         gtk_table_attach(GTK_TABLE(table), controls.upper_entry[i],
-                         2, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                         1, 2, row, row+1, GTK_FILL, 0, 0, 0);
         gwy_widget_set_activate_on_unfocus(controls.upper_entry[i], TRUE);
         g_object_set_data(G_OBJECT(controls.upper_entry[i]), "id",
                           GUINT_TO_POINTER(i | IS_UPPER));
@@ -498,7 +481,7 @@ gfilter_dialog(GFilterArgs *args,
         controls.upper_units[i] = gtk_label_new(NULL);
         gtk_misc_set_alignment(GTK_MISC(controls.upper_units[i]), 0.0, 0.5);
         gtk_table_attach(GTK_TABLE(table), controls.upper_units[i],
-                         3, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                         2, 3, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
     }
 
@@ -775,11 +758,9 @@ logical_op_changed(GtkComboBox *combo, GFilterControls *controls)
         if (sens) {
             gtk_widget_show(controls->set_as[i]);
             gtk_widget_show(controls->header[i]);
-            gtk_widget_show(controls->lower_label[i]);
             gtk_widget_show(controls->lower_scale[i]);
             gtk_widget_show(controls->lower_entry[i]);
             gtk_widget_show(controls->lower_units[i]);
-            gtk_widget_show(controls->upper_label[i]);
             gtk_widget_show(controls->upper_scale[i]);
             gtk_widget_show(controls->upper_entry[i]);
             gtk_widget_show(controls->upper_units[i]);
@@ -787,11 +768,9 @@ logical_op_changed(GtkComboBox *combo, GFilterControls *controls)
         else {
             gtk_widget_hide(controls->set_as[i]);
             gtk_widget_hide(controls->header[i]);
-            gtk_widget_hide(controls->lower_label[i]);
             gtk_widget_hide(controls->lower_scale[i]);
             gtk_widget_hide(controls->lower_entry[i]);
             gtk_widget_hide(controls->lower_units[i]);
-            gtk_widget_hide(controls->upper_label[i]);
             gtk_widget_hide(controls->upper_scale[i]);
             gtk_widget_hide(controls->upper_entry[i]);
             gtk_widget_hide(controls->upper_units[i]);
diff --git a/modules/process/grain_mark.c b/modules/process/grain_mark.c
index a550d25..07f555e 100644
--- a/modules/process/grain_mark.c
+++ b/modules/process/grain_mark.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: grain_mark.c 18537 2016-03-28 18:11:19Z yeti-dn $
- *  Copyright (C) 2004-2015 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: grain_mark.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2004-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -27,7 +27,7 @@
 #include <libprocess/grains.h>
 #include <libprocess/stats.h>
 #include <libgwydgets/gwycombobox.h>
-#include <libgwydgets/gwystock.h>
+#include <libgwydgets/gwyradiobuttons.h>
 #include <libgwymodule/gwymodule-process.h>
 #include <app/gwymoduleutils.h>
 #include <app/gwyapp.h>
@@ -70,9 +70,9 @@ typedef struct {
     GwySIValueFormat *format_height;
     GtkObject *threshold_slope;
     GtkObject *threshold_lap;
-    GtkWidget *merge;
+    GSList *merge_type;
     GtkWidget *combine;
-    GtkWidget *combine_type;
+    GSList *combine_type;
     GtkWidget *color_button;
     GtkWidget *update;
     GwyContainer *mydata;
@@ -103,8 +103,6 @@ static void        mark_dialog_update_values  (MarkControls *controls,
 static void        update_threshold_value     (MarkControls *controls);
 static void        update_change_cb           (MarkControls *controls);
 static void        mark_invalidate            (MarkControls *controls);
-static void        mark_invalidate2           (gpointer whatever,
-                                               MarkControls *controls);
 static void        preview                    (MarkControls *controls,
                                                MarkArgs *args);
 static void        mask_process               (GwyDataField *dfield,
@@ -138,12 +136,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Marks grains by thresholding (height, slope, curvature)."),
     "Petr Klapetek <petr at klapetek.cz>",
-    "1.18",
+    "1.20",
     "David Nečas (Yeti) & Petr Klapetek",
     "2003",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, grain_mark)
 
 static gboolean
 module_register(void)
@@ -192,7 +190,8 @@ table_attach_threshold(GtkWidget *table, gint *row, const gchar *name,
                        gpointer data)
 {
     *adj = gtk_adjustment_new(value, 0.0, 100.0, 0.1, 5, 0);
-    gwy_table_attach_hscale(table, *row, name, "%", *adj, GWY_HSCALE_CHECK);
+    gwy_table_attach_adjbar(table, *row, name, "%", *adj,
+                            GWY_HSCALE_CHECK | GWY_HSCALE_LINEAR);
     *check = gwy_table_hscale_get_check(*adj);
     g_signal_connect_swapped(*adj, "value-changed",
                              G_CALLBACK(mark_invalidate), data);
@@ -271,7 +270,7 @@ mark_dialog(MarkArgs *args,
     controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, TRUE);
     gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4);
 
-    table = gtk_table_new(10 + 2*(!!existing_mask), 4, FALSE);
+    table = gtk_table_new(10 + 1*(!!existing_mask), 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -279,7 +278,7 @@ mark_dialog(MarkArgs *args,
     row = 0;
 
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Threshold by")),
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     table_attach_threshold(table, &row, _("_Height:"),
@@ -290,7 +289,7 @@ mark_dialog(MarkArgs *args,
     controls.value_height = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(controls.value_height), 1.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), controls.value_height,
-                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     1, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.threshold_height, "value-changed",
                              G_CALLBACK(update_threshold_value), &controls);
     gwy_widget_sync_sensitivity(pivot, controls.value_height);
@@ -302,7 +301,7 @@ mark_dialog(MarkArgs *args,
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_label_set_markup(GTK_LABEL(label), controls.format_height->units);
     gtk_table_attach(GTK_TABLE(table), label,
-                     3, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
     gwy_widget_sync_sensitivity(pivot, label);
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
@@ -317,63 +316,49 @@ mark_dialog(MarkArgs *args,
                            &controls.is_lap, &controls);
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
 
-    controls.merge
-        = gwy_enum_combo_box_new(gwy_merge_type_get_enum(), -1,
-                                 G_CALLBACK(mark_invalidate2), &controls,
-                                 args->merge_type, TRUE);
-    gwy_table_attach_hscale(table, row, _("Criteria combination:"), NULL,
-                            GTK_OBJECT(controls.merge), GWY_HSCALE_WIDGET);
-    row++;
-
     controls.inverted = gtk_check_button_new_with_mnemonic(_("_Invert height"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.inverted),
                                  args->inverted);
     gtk_table_attach(GTK_TABLE(table), controls.inverted,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.inverted, "toggled",
                              G_CALLBACK(mark_invalidate), &controls);
     row++;
 
+    create_mask_merge_buttons(table, row, _("Criteria combination:"),
+                              TRUE, NULL,
+                              args->merge_type, G_CALLBACK(mark_invalidate),
+                              &controls, NULL, &controls.merge_type);
+    row++;
+
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Options")),
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
-    if (existing_mask) {
-        controls.combine
-            = gtk_check_button_new_with_mnemonic(_("Com_bine with "
-                                                   "existing mask"));
-        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.combine),
-                                     args->combine);
-        gtk_table_attach(GTK_TABLE(table), controls.combine,
-                         0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-        g_signal_connect_swapped(controls.combine, "toggled",
-                                 G_CALLBACK(mark_invalidate), &controls);
-        row++;
-
-        controls.combine_type
-            = gwy_enum_combo_box_new(gwy_merge_type_get_enum(), -1,
-                                     G_CALLBACK(mark_invalidate2), &controls,
-                                     args->combine_type, TRUE);
-        gwy_table_attach_hscale(table, row, _("Operation:"), NULL,
-                                GTK_OBJECT(controls.combine_type),
-                                GWY_HSCALE_WIDGET);
-        gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
-        row++;
-    }
-
     controls.color_button = create_mask_color_button(controls.mydata, dialog,
                                                      0);
-    gwy_table_attach_hscale(table, row++, _("_Mask color:"), NULL,
+    gwy_table_attach_adjbar(table, row++, _("_Mask color:"), NULL,
                             GTK_OBJECT(controls.color_button),
                             GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
+    if (existing_mask) {
+        create_mask_merge_buttons(table, row, NULL,
+                                  args->combine,
+                                  G_CALLBACK(mark_invalidate),
+                                  args->combine_type,
+                                  G_CALLBACK(mark_invalidate),
+                                  &controls,
+                                  &controls.combine, &controls.combine_type);
+        row++;
+    }
+
     controls.update = gtk_check_button_new_with_mnemonic(_("I_nstant updates"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.update),
                                  args->update);
     gtk_table_attach(GTK_TABLE(table), controls.update,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.update, "toggled",
                              G_CALLBACK(update_change_cb), &controls);
 
@@ -485,12 +470,11 @@ mark_dialog_update_controls(MarkControls *controls,
                                  args->is_lap);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->update),
                                  args->update);
-    gwy_enum_combo_box_set_active(GTK_COMBO_BOX(controls->merge),
-                                  args->merge_type);
+    gwy_radio_buttons_set_current(controls->merge_type, args->merge_type);
     if (controls->combine) {
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->combine),
                                      args->combine);
-        gwy_enum_combo_box_set_active(GTK_COMBO_BOX(controls->combine_type),
+        gwy_radio_buttons_set_current(controls->combine_type,
                                       args->combine_type);
     }
 }
@@ -515,13 +499,12 @@ mark_dialog_update_values(MarkControls *controls,
         = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(controls->is_lap));
     args->update
         = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(controls->update));
-    args->merge_type
-        = gwy_enum_combo_box_get_active(GTK_COMBO_BOX(controls->merge));
+    args->merge_type = gwy_radio_buttons_get_current(controls->merge_type);
     if (controls->combine) {
         args->combine = gtk_toggle_button_get_active
                                        (GTK_TOGGLE_BUTTON(controls->combine));
-        args->combine_type = gwy_enum_combo_box_get_active
-                                      (GTK_COMBO_BOX(controls->combine_type));
+        args->combine_type
+            = gwy_radio_buttons_get_current(controls->combine_type);
     }
 }
 
@@ -567,12 +550,6 @@ update_change_cb(MarkControls *controls)
 }
 
 static void
-mark_invalidate2(G_GNUC_UNUSED gpointer whatever, MarkControls *controls)
-{
-    mark_invalidate(controls);
-}
-
-static void
 preview(MarkControls *controls,
         MarkArgs *args)
 {
diff --git a/modules/process/grain_stat.c b/modules/process/grain_stat.c
index c87c58f..ccbe3c8 100644
--- a/modules/process/grain_stat.c
+++ b/modules/process/grain_stat.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: grain_stat.c 18877 2016-08-24 14:48:29Z yeti-dn $
+ *  @(#) $Id: grain_stat.c 19950 2017-06-22 15:03:32Z yeti-dn $
  *  Copyright (C) 2014 David Necas (Yeti), Petr Klapetek, Sven Neumann.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, neumann at jpk.com.
  *
@@ -59,7 +59,7 @@ static GwyModuleInfo module_info = {
     "2015",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, grain_stat)
 
 static gboolean
 module_register(void)
@@ -74,7 +74,7 @@ module_register(void)
     gwy_process_func_register("grain_inscribe_discs",
                               (GwyProcessFunc)&grain_inscribe_discs,
                               N_("/_Grains/Select _Inscribed Discs"),
-                              GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE,
+                              GWY_STOCK_GRAIN_INSCRIBED_CIRCLE,
                               INSCRIBE_RUN_MODES,
                               GWY_MENU_FLAG_DATA | GWY_MENU_FLAG_DATA_MASK,
                               N_("Create a selection visualizing discs "
@@ -82,7 +82,7 @@ module_register(void)
     gwy_process_func_register("grain_exscribe_circles",
                               (GwyProcessFunc)&grain_exscribe_circles,
                               N_("/_Grains/Select _Circumscribed Circles"),
-                              GWY_STOCK_GRAIN_INSCRIBED_CIRCLE,
+                              GWY_STOCK_GRAIN_EXSCRIBED_CIRCLE,
                               INSCRIBE_RUN_MODES,
                               GWY_MENU_FLAG_DATA | GWY_MENU_FLAG_DATA_MASK,
                               N_("Create a selection visualizing grain "
diff --git a/modules/process/grain_wshed.c b/modules/process/grain_wshed.c
index 2377f9d..16936b6 100644
--- a/modules/process/grain_wshed.c
+++ b/modules/process/grain_wshed.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: grain_wshed.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: grain_wshed.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -26,6 +26,7 @@
 #include <libprocess/stats.h>
 #include <libprocess/grains.h>
 #include <libgwydgets/gwystock.h>
+#include <libgwydgets/gwydgetutils.h>
 #include <libgwymodule/gwymodule-process.h>
 #include <app/gwymoduleutils.h>
 #include <app/gwyapp.h>
@@ -100,12 +101,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Marks grains by watershed algorithm."),
     "Petr Klapetek <petr at klapetek.cz>",
-    "1.17",
+    "1.18",
     "David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, grain_wshed)
 
 static gboolean
 module_register(void)
@@ -189,7 +190,7 @@ wshed_dialog(WshedArgs *args,
     controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, TRUE);
     gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4);
 
-    table = gtk_table_new(9, 4, FALSE);
+    table = gtk_table_new(9, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -198,20 +199,21 @@ wshed_dialog(WshedArgs *args,
 
     label = gwy_label_new_header(_("Grain Location"));
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.locate_steps = gtk_adjustment_new(args->locate_steps,
                                                1.0, 100.0, 1, 5, 0);
-    gwy_table_attach_hscale(table, row, _("_Number of steps:"), "",
-                            controls.locate_steps, 0);
+    gwy_table_attach_adjbar(table, row, _("_Number of steps:"), NULL,
+                            controls.locate_steps,
+                            GWY_HSCALE_SQRT | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(controls.locate_steps, "value-changed",
                              G_CALLBACK(wshed_invalidate), &controls);
     row++;
 
     controls.locate_dropsize = gtk_adjustment_new(args->locate_dropsize,
                                                   0.01, 100.0, 0.1, 5, 0);
-    spin = gwy_table_attach_hscale(table, row, _("_Drop size:"), "%",
+    spin = gwy_table_attach_adjbar(table, row, _("_Drop size:"), "%",
                                    controls.locate_dropsize, 0);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2);
     g_signal_connect_swapped(controls.locate_dropsize, "value-changed",
@@ -220,28 +222,30 @@ wshed_dialog(WshedArgs *args,
     row++;
     controls.locate_thresh = gtk_adjustment_new(args->locate_thresh,
                                                 0.0, 100.0, 1, 5, 0);
-    gwy_table_attach_hscale(table, row, _("T_hreshold:"), "px<sup>2</sup>",
-                            controls.locate_thresh, 0);
+    gwy_table_attach_adjbar(table, row, _("T_hreshold:"), "px<sup>2</sup>",
+                            controls.locate_thresh,
+                            GWY_HSCALE_SQRT | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(controls.locate_thresh, "value-changed",
                              G_CALLBACK(wshed_invalidate), &controls);
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
     row++;
 
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Segmentation")),
-                     0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.wshed_steps = gtk_adjustment_new(args->wshed_steps,
                                               1.0, 1000.0, 1, 5, 0);
-    gwy_table_attach_hscale(table, row, _("Num_ber of steps:"), "",
-                            controls.wshed_steps, 0);
+    gwy_table_attach_adjbar(table, row, _("Num_ber of steps:"), NULL,
+                            controls.wshed_steps,
+                            GWY_HSCALE_SQRT | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(controls.wshed_steps, "value-changed",
                              G_CALLBACK(wshed_invalidate), &controls);
     row++;
 
     controls.wshed_dropsize = gtk_adjustment_new(args->wshed_dropsize,
                                                  0.01, 100.0, 0.1, 5, 0);
-    spin = gwy_table_attach_hscale(table, row, _("Dr_op size:"), "%",
+    spin = gwy_table_attach_adjbar(table, row, _("Dr_op size:"), "%",
                                    controls.wshed_dropsize, 0);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2);
     g_signal_connect_swapped(controls.wshed_dropsize, "value-changed",
@@ -250,21 +254,21 @@ wshed_dialog(WshedArgs *args,
     row++;
 
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Options")),
-                     0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.inverted = gtk_check_button_new_with_mnemonic(_("_Invert height"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.inverted),
                                  args->inverted);
     gtk_table_attach(GTK_TABLE(table), controls.inverted,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.inverted, "toggled",
                              G_CALLBACK(wshed_invalidate), &controls);
     row++;
 
     controls.color_button = create_mask_color_button(controls.mydata, dialog,
                                                      0);
-    gwy_table_attach_hscale(table, row, _("_Mask color:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Mask color:"), NULL,
                             GTK_OBJECT(controls.color_button),
                             GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
diff --git a/modules/process/hough.c b/modules/process/hough.c
index 1c09749..ecc0105 100644
--- a/modules/process/hough.c
+++ b/modules/process/hough.c
@@ -1,4 +1,5 @@
 /*
+ *  @(#) $Id: hough.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -45,23 +46,24 @@ typedef struct {
 } HoughArgs;
 
 typedef struct {
+    HoughArgs *args;
     GtkWidget *output;
     GtkObject *circle_size;
     GtkWidget *circle_spin;
 } HoughControls;
 
-static gboolean    module_register            (void);
-static void        hough                      (GwyContainer *data,
-                                               GwyRunType run);
-static gboolean    hough_dialog               (HoughArgs *args);
-static void        hough_load_args            (GwyContainer *container,
-                                               HoughArgs *args);
-static void        hough_save_args            (GwyContainer *container,
-                                               HoughArgs *args);
-static void        hough_dialog_update        (HoughControls *controls,
-                                               HoughArgs *args);
-static void        type_changed_cb            (GtkComboBox *combo,
-                                               HoughControls *controls);
+static gboolean module_register    (void);
+static void     hough              (GwyContainer *data,
+                                    GwyRunType run);
+static gboolean hough_dialog       (HoughArgs *args);
+static void     hough_load_args    (GwyContainer *container,
+                                    HoughArgs *args);
+static void     hough_save_args    (GwyContainer *container,
+                                    HoughArgs *args);
+static void     hough_dialog_update(HoughControls *controls,
+                                    HoughArgs *args);
+static void     output_changed     (GtkComboBox *combo,
+                                    HoughControls *controls);
 
 static const HoughArgs hough_defaults = {
     GWY_HOUGH_OUTPUT_LINE,
@@ -73,12 +75,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Hough transform."),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "1.2",
+    "1.3",
     "David Nečas (Yeti) & Petr Klapetek",
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, hough)
 
 static gboolean
 module_register(void)
@@ -102,7 +104,7 @@ hough(GwyContainer *data, GwyRunType run)
     gboolean ok;
     HoughArgs args;
     gint id, newid;
-    gchar title[30];
+    gchar *title;
 
     g_return_if_fail(run & HOUGH_RUN_MODES);
     gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &dfield,
@@ -132,21 +134,12 @@ hough(GwyContainer *data, GwyRunType run)
     gwy_data_field_filter_sobel(f1, GWY_ORIENTATION_HORIZONTAL);
     gwy_data_field_filter_sobel(f2, GWY_ORIENTATION_VERTICAL);
     if (args.output == GWY_HOUGH_OUTPUT_LINE) {
-        g_snprintf(title, sizeof(title), "Hough line");
-        gwy_data_field_hough_line(edgefield,
-                              f1,
-                              f2,
-                              result,
-                              1,
-                              FALSE);
+        title = g_strdup(_("Hough line"));
+        gwy_data_field_hough_line(edgefield, f1, f2, result, 1, FALSE);
     }
     else  {
-        g_snprintf(title, sizeof(title), "Hough circle r=%d px",
-                   args.circle_size);
-        gwy_data_field_hough_circle(edgefield,
-                                    f1,
-                                    f2,
-                                    result,
+        title = g_strdup_printf(_("Hough circle r=%d"), args.circle_size);
+        gwy_data_field_hough_circle(edgefield, f1, f2, result,
                                     args.circle_size);
     }
 
@@ -158,11 +151,11 @@ hough(GwyContainer *data, GwyRunType run)
     g_object_unref(edgefield);
     g_object_unref(f1);
     g_object_unref(f2);
+    g_free(title);
 
     gwy_app_channel_log_add_proc(data, id, newid);
 }
 
-
 static gboolean
 hough_dialog(HoughArgs *args)
 {
@@ -175,6 +168,8 @@ hough_dialog(HoughArgs *args)
     HoughControls controls;
     gint response, row;
 
+    controls.args = args;
+
     dialog = gtk_dialog_new_with_buttons(_("Hough Transform"), NULL, 0,
                                          _("_Reset"), RESPONSE_RESET,
                                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
@@ -183,13 +178,12 @@ hough_dialog(HoughArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(4, 4, FALSE);
+    table = gtk_table_new(4, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table,
                        FALSE, FALSE, 4);
-
     row = 0;
 
     controls.output
@@ -197,20 +191,19 @@ hough_dialog(HoughArgs *args)
                                  G_CALLBACK(gwy_enum_combo_box_update_int),
                                  &args->output, args->output, TRUE);
     g_signal_connect(GTK_COMBO_BOX(controls.output), "changed",
-                     G_CALLBACK(type_changed_cb), &controls);
-    gwy_table_attach_row(table, row, _("_Transform type:"), NULL,
-                         controls.output);
-
-
-
+                     G_CALLBACK(output_changed), &controls);
+    gwy_table_attach_adjbar(table, row, _("_Transform type:"), NULL,
+                            GTK_OBJECT(controls.output),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
-
-    controls.circle_size
-        = gtk_adjustment_new(args->circle_size, 1.0, 1000.0, 1, 10, 0);
-    controls.circle_spin
-        = gwy_table_attach_spinbutton(table, 1, _("_Circle size:"), _("pixels"),
-                                      controls.circle_size);
+    controls.circle_size = gtk_adjustment_new(args->circle_size,
+                                              1.0, 1000.0, 1, 10, 0);
+    controls.circle_spin = gwy_table_attach_adjbar(table, 1,
+                                                   _("_Circle size:"), _("px"),
+                                                   controls.circle_size,
+                                                   GWY_HSCALE_DEFAULT);
+    row++;
 
     hough_dialog_update(&controls, args);
 
@@ -249,24 +242,22 @@ hough_dialog(HoughArgs *args)
 }
 
 static void
-type_changed_cb(GtkComboBox *combo, HoughControls *controls)
+output_changed(GtkComboBox *combo, HoughControls *controls)
 {
-    if (gwy_enum_combo_box_get_active(combo) == GWY_HOUGH_OUTPUT_CIRCLE)
-        gtk_widget_set_sensitive(controls->circle_spin, TRUE);
-    else
-        gtk_widget_set_sensitive(controls->circle_spin, FALSE);
+    gboolean is_circ;
+
+    controls->args->output = gwy_enum_combo_box_get_active(combo);
+    is_circ = (controls->args->output == GWY_HOUGH_OUTPUT_CIRCLE);
+    gwy_table_hscale_set_sensitive(controls->circle_size, is_circ);
 }
 
 static void
-hough_dialog_update(HoughControls *controls,
-                  HoughArgs *args)
+hough_dialog_update(HoughControls *controls, HoughArgs *args)
 {
+    gwy_enum_combo_box_set_active(GTK_COMBO_BOX(controls->output),
+                                  args->output);
     gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->circle_size),
                              args->circle_size);
-    if (args->output == GWY_HOUGH_OUTPUT_CIRCLE)
-        gtk_widget_set_sensitive(controls->circle_spin, TRUE);
-    else
-        gtk_widget_set_sensitive(controls->circle_spin, FALSE);
 }
 
 static const gchar output_key[]      = "/module/hough/output";
@@ -280,8 +271,7 @@ hough_sanitize_args(HoughArgs *args)
 }
 
 static void
-hough_load_args(GwyContainer *container,
-              HoughArgs *args)
+hough_load_args(GwyContainer *container, HoughArgs *args)
 {
     *args = hough_defaults;
 
@@ -292,8 +282,7 @@ hough_load_args(GwyContainer *container,
 }
 
 static void
-hough_save_args(GwyContainer *container,
-              HoughArgs *args)
+hough_save_args(GwyContainer *container, HoughArgs *args)
 {
     gwy_container_set_enum_by_name(container, output_key, args->output);
     gwy_container_set_int32_by_name(container, circle_size_key,
diff --git a/modules/process/immerse.c b/modules/process/immerse.c
index 8b6fa0e..6fdba95 100644
--- a/modules/process/immerse.c
+++ b/modules/process/immerse.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: immerse.c 19216 2016-11-09 10:39:06Z yeti-dn $
+ *  @(#) $Id: immerse.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -78,6 +78,7 @@ typedef struct {
     GwyContainer *mydata;
     GtkWidget *view;
     GtkWidget *pos;
+    GtkWidget *pos_units;
     GSList *sampling;
     GSList *leveling;
     GtkWidget *draw_frame;
@@ -161,12 +162,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Immerse high resolution detail into overall image."),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "2.5",
+    "2.6",
     "David Nečas (Yeti) & Petr Klapetek",
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, immerse)
 
 static gboolean
 module_register(void)
@@ -287,7 +288,7 @@ immerse_dialog(ImmerseArgs *args)
     gwy_data_chooser_get_active_id(GWY_DATA_CHOOSER(chooser), &args->detail);
     g_signal_connect(chooser, "changed",
                      G_CALLBACK(immerse_detail_cb), &controls);
-    gwy_table_attach_hscale(table, row, _("_Detail image:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Detail image:"), NULL,
                             GTK_OBJECT(chooser), GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
@@ -298,17 +299,22 @@ immerse_dialog(ImmerseArgs *args)
                      0, 1, row, row+1, GTK_FILL, 0, 0, 0);
 
     controls.pos = gtk_label_new(NULL);
-    gtk_misc_set_alignment(GTK_MISC(controls.pos), 0.0, 0.5);
+    gtk_misc_set_alignment(GTK_MISC(controls.pos), 1.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), controls.pos,
-                     1, 3, row, row+1, GTK_FILL, 0, 0, 0);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+                     1, 2, row, row+1, GTK_FILL, 0, 0, 0);
+
+    controls.pos_units = gtk_label_new(NULL);
+    gtk_misc_set_alignment(GTK_MISC(controls.pos_units), 0.0, 0.5);
+    gtk_table_attach(GTK_TABLE(table), controls.pos_units,
+                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     /* Sampling */
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gtk_label_new(_("Result Sampling"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.sampling
@@ -329,7 +335,7 @@ immerse_dialog(ImmerseArgs *args)
     label = gtk_label_new(_("Detail Leveling"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.leveling
@@ -342,13 +348,13 @@ immerse_dialog(ImmerseArgs *args)
                                     NULL);
 
     row = gwy_radio_buttons_attach_to_table(controls.leveling, GTK_TABLE(table),
-                                            4, row);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+                                            2, row);
 
     /* Draw frame */
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     controls.draw_frame = gtk_check_button_new_with_mnemonic(_("Show _frame"));
     gtk_table_attach(GTK_TABLE(table), controls.draw_frame,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.draw_frame),
                                  args->draw_frame);
     g_signal_connect(controls.draw_frame, "toggled",
@@ -968,15 +974,16 @@ immerse_clamp_detail_offset(ImmerseControls *controls,
 
         controls->args->xpos = xpos;
         controls->args->ypos = ypos;
-        s = g_strdup_printf("(%.*f, %.*f) %s",
+        s = g_strdup_printf("(%.*f, %.*f)",
                             controls->vf->precision + 1,
                             xpos/controls->vf->magnitude,
                             controls->vf->precision + 1,
-                            ypos/controls->vf->magnitude,
-                            controls->vf->units);
+                            ypos/controls->vf->magnitude);
         gtk_label_set_text(GTK_LABEL(controls->pos), s);
         g_free(s);
 
+        gtk_label_set_text(GTK_LABEL(controls->pos_units), controls->vf->units);
+
         if (GTK_WIDGET_DRAWABLE(controls->view))
             gtk_widget_queue_draw(controls->view);
         return TRUE;
diff --git a/modules/process/indent_analyze.c b/modules/process/indent_analyze.c
index 3a7e68e..37802df 100644
--- a/modules/process/indent_analyze.c
+++ b/modules/process/indent_analyze.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: indent_analyze.c 19216 2016-11-09 10:39:06Z yeti-dn $
+ *  @(#) $Id: indent_analyze.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2006 Lukas Chvatal, David Necas (Yeti), Petr Klapetek.
  *  E-mail: chvatal at physics.muni.cz, yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -104,7 +104,6 @@ typedef struct {
     gdouble plane_tol;  /* what to consider as belonging to plane/percents
                            of max-min */
     gdouble phi_tol;
-    gdouble theta_tol;    /* XXX: not implemented */
 
     gdouble plane_x;
     gdouble plane_y;
@@ -135,22 +134,20 @@ typedef struct {
 
     gint what_mark;
     gint how_mark;
-    gint plane_correct;    /* XXX: not implemented */
 
     GwyIndentorType indentor;
     gint nof_sides;
 } IndentAnalyzeArgs;
 
 typedef struct {
-    GtkWidget *w_plane_correct;
-    GtkWidget *w_how_mark;
-    GtkWidget *w_what_mark;
-    GtkWidget *w_indentor;
+    GtkWidget *how_mark;
+    GtkWidget *what_mark;
+    GtkWidget *indentor;
 
-    GtkObject *w_plane_tol;
-    GtkObject *w_nof_sides;
-    GtkObject *w_phi_tol;
-    GtkObject *w_theta_tol;
+    GtkObject *plane_tol;
+    GtkObject *nof_sides;
+    GtkObject *phi_tol;
+    GtkObject *theta_tol;
 
     GtkWidget *view;
     GwyContainer *mydata;
@@ -159,32 +156,23 @@ typedef struct {
     gboolean computed;
 
     /* labels */
-    GtkWidget *w_min_xy;
-    GtkWidget *w_max_xy;
-    GtkWidget *w_minmax;
+    GtkWidget *min_xy;
+    GtkWidget *max_xy;
+    GtkWidget *minmax;
 
-    GtkWidget *w_volume_above;
-    GtkWidget *w_volume_below;
-    GtkWidget *w_volume_dif;
+    GtkWidget *volume_dif;
 
-    GtkWidget *w_area_above;
-    GtkWidget *w_area_below;
-    GtkWidget *w_area_plane;
+    GtkWidget *volume_indent;
+    GtkWidget *surface_indent;
+    GtkWidget *area_indent;
 
-    GtkWidget *w_surface_above;
-    GtkWidget *w_surface_below;
+    GtkWidget *area_indent_exp;
+    GtkWidget *surface_indent_exp;
 
-    GtkWidget *w_volume_indent;
-    GtkWidget *w_surface_indent;
-    GtkWidget *w_area_indent;
-
-    GtkWidget *w_area_indent_exp;
-    GtkWidget *w_surface_indent_exp;
-
-    GtkWidget *w_surface_innerpileup;
-    GtkWidget *w_surface_outerpileup;
-    GtkWidget *w_area_innerpileup;
-    GtkWidget *w_area_outerpileup;
+    GtkWidget *surface_innerpileup;
+    GtkWidget *surface_outerpileup;
+    GtkWidget *area_innerpileup;
+    GtkWidget *area_outerpileup;
 
     GtkFileSelection *filesel;
 
@@ -209,9 +197,6 @@ static gboolean indent_analyze(GwyContainer *data, GwyRunType run);
 static gboolean indent_analyze_dialog(GwyContainer *data,
                                       IndentAnalyzeArgs *args);
 
-static void dialog_update(IndentAnalyzeControls *controls,
-                          IndentAnalyzeArgs *args);
-
 /*static void plane_correct_cb(GtkWidget *item, IndentAnalyzeControls *controls);*/
 static void how_mark_cb(GtkWidget *item, IndentAnalyzeControls *controls);
 static void what_mark_cb(GtkWidget *item, IndentAnalyzeControls *controls);
@@ -302,15 +287,12 @@ static GwyModuleInfo module_info = {
     (GwyModuleRegisterFunc) &module_register,
     N_("Analyses nanoindentation structure (volumes, surfaces, ...)."),
     "Lukáš Chvátal <chvatal at physics.muni.cz>",
-    "0.1.4",
+    "0.1.5",
     "Lukáš Chvátal",
     "2005",
 };
 
-/* This is the ONLY exported symbol.  The argument is the module info.
- * NO semicolon after. */
-GWY_MODULE_QUERY(module_info)
-
+GWY_MODULE_QUERY2(module_info, indent_analyze);
 
 static gboolean
 module_register(void)
@@ -340,7 +322,8 @@ indent_analyze(GwyContainer *data, GwyRunType run)
        load_args(gwy_app_settings_get(), &args);
        indent_analyze_dialog(data, &args);
        save_args(gwy_app_settings_get(), &args);
-    } else {
+    }
+    else {
        g_warning("Non-interactive mode not supported.");
     }
 
@@ -361,7 +344,6 @@ create_preview_data(IndentAnalyzeControls *controls)
     GwyDataField *dfield = NULL, *mask;
     gint oldid;
     // No zoom, zoom disorder final result
-    // gdouble zoomval;
     const GwyRGBA mask_color = { 1.0, 0.0, 0.00, 0.5 };
 
     gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &dfield,
@@ -373,12 +355,6 @@ create_preview_data(IndentAnalyzeControls *controls)
       preview_container = gwy_container_new();
       dfield = gwy_data_field_duplicate(dfield);
 
-      // No zoom because it disorder mask on original image.
-      // zoomval = (gdouble)PREVIEW_SIZE/MAX(xres, yres);
-      // gwy_data_field_resample(dfield, xres*zoomval, yres*zoomval,
-      //                        GWY_INTERPOLATION_LINEAR);
-
-
       gwy_container_set_object_by_name(preview_container, "/0/data", dfield);
       mask = create_mask_field(dfield);
       gwy_data_field_clear(mask);
@@ -393,11 +369,19 @@ create_preview_data(IndentAnalyzeControls *controls)
       */
 
       gwy_rgba_store_to_container(gwy_rgba_copy(&mask_color),
-            preview_container, "/0/mask");
+                                  preview_container, "/0/mask");
    }
 
     return preview_container;
 }
+
+static void
+use_markup_in_label(GtkObject *pivot)
+{
+    GtkWidget *label = gwy_table_hscale_get_label(pivot);
+    gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
+}
+
 /** Create table with statistical info.
  *
  * \param  controls build object
@@ -407,221 +391,163 @@ create_preview_data(IndentAnalyzeControls *controls)
 static GtkWidget*
 create_parameters_table(IndentAnalyzeControls * controls)
 {
-   IndentAnalyzeArgs * args = controls->args;
-   int row = 0;
-   GtkWidget *table = 0, *label;
-   GwyDataField *dfield;
-   GwySIValueFormat *siformat;
-   GString *siu;
-
-   /* TABLE */
-   table = gtk_table_new(8, 3, FALSE);
-   gtk_table_set_row_spacings(GTK_TABLE(table), 2);
-   gtk_table_set_col_spacings(GTK_TABLE(table), 6);
-   gtk_container_set_border_width(GTK_CONTAINER(table), 4);
-
-   /*
-    controls.w_plane_correct
-    = gwy_option_menu_create(plane_correct_enum,
-    G_N_ELEMENTS(plane_correct_enum),
-    "menu_plane_correct",
-    G_CALLBACK(plane_correct_cb), &controls,
-    args->plane_correct);
-    gwy_table_attach_hscale(table, row, _("Data field _leveling:"), NULL,
-    GTK_OBJECT(controls.w_plane_correct),
-    GWY_HSCALE_WIDGET);
+    IndentAnalyzeArgs * args = controls->args;
+    int row = 0;
+    GtkWidget *table = NULL;
+    GwyDataField *dfield;
+    GwySIValueFormat *siformat;
+    GString *siu;
+
+    /* TABLE */
+    table = gtk_table_new(8, 3, FALSE);
+    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
+    gtk_table_set_col_spacings(GTK_TABLE(table), 6);
+    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
+
+    controls->what_mark = gwy_enum_combo_box_new(what_mark_enum,
+                                                   G_N_ELEMENTS(what_mark_enum), G_CALLBACK(what_mark_cb), controls,
+                                                   args->what_mark, TRUE);
+    gwy_table_attach_adjbar(table, row++, _("Marked _areas:"), NULL,
+                            GTK_OBJECT(controls->what_mark),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+
+    controls->indentor = gwy_enum_combo_box_new(indentor_enum,
+                                                  G_N_ELEMENTS(indentor_enum),
+                                                  G_CALLBACK(indentor_changed_cb),
+                                                  controls, args->indentor,
+                                                  TRUE);
+    gwy_table_attach_adjbar(table, row++, _("_Indentor type:"), NULL,
+                            GTK_OBJECT(controls->indentor),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+
+    controls->how_mark = gwy_enum_combo_box_new(how_mark_enum,
+                                                  G_N_ELEMENTS(how_mark_enum),
+                                                  G_CALLBACK(how_mark_cb),
+                                                  controls, args->how_mark,
+                                                  TRUE);
+    gwy_table_attach_adjbar(table, row++, _("_Mask creation type:"), NULL,
+                            GTK_OBJECT(controls->how_mark),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+
+    controls->plane_tol = gtk_adjustment_new(args->plane_tol, 0, 100, 0.1, 1,
+                                               0);
+    gwy_table_attach_adjbar(table, row++, _("Ref. plane _tolerance:"), "%",
+                            controls->plane_tol, GWY_HSCALE_SQRT);
+
+    controls->phi_tol = gtk_adjustment_new(args->phi_tol, 0, 180, 0.1, 10, 0);
+    gwy_table_attach_adjbar(table, row++, _("Angle _1 tolerance:"), _("deg"),
+                            controls->phi_tol, GWY_HSCALE_SQRT);
+
+    /* "statistical" labels */
+    dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata,
+                                                             "/0/data"));
+    if (!dfield) {
+        g_warning("Cannot get /0/data from controls->mydata.");
+    }
+    siformat = gwy_data_field_get_value_format_xy(dfield,
+                                                  GWY_SI_UNIT_FORMAT_PLAIN,
+                                                  NULL);
+    if (!siformat) {
+        g_warning("Cannot get siformat from /0/data");
+    }
+    siu = g_string_new(siformat->units);
+
+    controls->min_xy = gtk_label_new(NULL);
+    gwy_table_attach_adjbar(table, row++, _("Indent center at"), siu->str,
+                            GTK_OBJECT(controls->min_xy),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    controls->max_xy = gtk_label_new(NULL);
+    gwy_table_attach_adjbar(table, row++, _("Maximum at"), siu->str,
+                            GTK_OBJECT(controls->max_xy),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    controls->minmax = gtk_label_new(NULL);
+    gwy_table_attach_adjbar(table, row++, _("Max-min difference"), siu->str,
+                            GTK_OBJECT(controls->minmax),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+
+    /* XXX: Wrong, must actually square the units. */
+    g_string_append(siu, "<sup>2</sup>");
+
+    controls->surface_indent_exp = gtk_label_new(NULL);
+    gwy_table_attach_adjbar(table, row, _("Expected A<sub>d</sub>:"), siu->str,
+                            GTK_OBJECT(controls->surface_indent_exp),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    use_markup_in_label(GTK_OBJECT(controls->surface_indent_exp));
     row++;
-    */
 
-   controls->w_what_mark = gwy_enum_combo_box_new(what_mark_enum,
-         G_N_ELEMENTS(what_mark_enum), G_CALLBACK(what_mark_cb), controls,
-         args->what_mark, TRUE);
-   gwy_table_attach_hscale(table, row++, _("Marked _areas:"), NULL,
-         GTK_OBJECT(controls->w_what_mark), GWY_HSCALE_WIDGET);
-
-   controls->w_indentor = gwy_enum_combo_box_new(indentor_enum,
-         G_N_ELEMENTS(indentor_enum), G_CALLBACK(indentor_changed_cb),
-         controls, args->indentor, TRUE);
-   gwy_table_attach_hscale(table, row++, _("_Indentor type:"), NULL,
-         GTK_OBJECT(controls->w_indentor), GWY_HSCALE_WIDGET);
-
-   controls->w_how_mark = gwy_enum_combo_box_new(how_mark_enum,
-         G_N_ELEMENTS(how_mark_enum), G_CALLBACK(how_mark_cb), controls,
-         args->how_mark, TRUE);
-   gwy_table_attach_hscale(table, row++, _("_Mask creation type:"), NULL,
-         GTK_OBJECT(controls->w_how_mark), GWY_HSCALE_WIDGET);
-
-   controls->w_plane_tol = gtk_adjustment_new(args->plane_tol, 0, 100, 0.1, 1,
-                                              0);
-   gwy_table_attach_hscale(table, row++, _("Ref. plane _tolerance:"), "%",
-         controls->w_plane_tol, 0);
-
-   controls->w_phi_tol = gtk_adjustment_new(args->phi_tol, 0, 180, 0.1, 10, 0);
-   gwy_table_attach_hscale(table, row++, _("Angle _1 tolerance:"), _("deg"),
-         controls->w_phi_tol, 0);
-
-   /* XXX: what the hell is this for?
-    controls.w_theta_tol = gtk_adjustment_new(args->theta_tol,
-    0, 90, 0.1, 10, 0);
-    spin = gwy_table_attach_hscale(table, row, _("T_heta range:"), _("deg"),
-    controls.w_theta_tol, 0);
+    controls->area_indent_exp = gtk_label_new(NULL);
+    gwy_table_attach_adjbar(table, row, _("Expected A<sub>p</sub>:"), siu->str,
+                            GTK_OBJECT(controls->area_indent_exp),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    use_markup_in_label(GTK_OBJECT(controls->area_indent_exp));
     row++;
-    */
-
-   /* "statistical" labels */
-   dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata,
-         "/0/data"));
-   if (!dfield) {
-      g_warning("Cannot get /0/data from controls->mydata.");
-   }
-   siformat = gwy_data_field_get_value_format_xy(dfield,
-         GWY_SI_UNIT_FORMAT_PLAIN, NULL);
-   if (!siformat) {
-      g_warning("Cannot get siformat from /0/data");
-   }
-   siu = g_string_new(siformat->units);
-
-   controls->w_min_xy = gtk_label_new("");
-   gwy_table_attach_row(table, row++, _("Indent center at"), siu->str,
-         controls->w_min_xy);
-   controls->w_max_xy = gtk_label_new("");
-   gwy_table_attach_row(table, row++, _("Maximum at"), siu->str,
-         controls->w_max_xy);
-   controls->w_minmax = gtk_label_new("");
-   gwy_table_attach_row(table, row++, _("Max-min difference"), siu->str,
-         controls->w_minmax);
-
-   g_string_append(siu, "<sup>2</sup>");
-
-   controls->w_surface_indent_exp = gtk_label_new("");
-   gwy_table_attach_row(table, row, _("Expected A<sub>d</sub>:"), siu->str,
-         controls->w_surface_indent_exp);
-   if ( (label = gwy_table_get_child_widget(table, row, 0)) ) {
-      gtk_label_set_markup_with_mnemonic(GTK_LABEL(label),
-            gtk_label_get_text(GTK_LABEL(label)) );
-   }
-   row++;
-   controls->w_area_indent_exp = gtk_label_new("");
-   gwy_table_attach_row(table, row, _("Expected A<sub>p</sub>:"), siu->str,
-         controls->w_area_indent_exp);
-   if ( (label = gwy_table_get_child_widget(table, row, 0)) ) {
-      gtk_label_set_markup_with_mnemonic(GTK_LABEL(label),
-            gtk_label_get_text(GTK_LABEL(label)) );
-   }
-   row++;
 
-   gtk_table_attach(GTK_TABLE(table), gtk_hseparator_new(), 0, 2, row, row + 1,
-         (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND
-               | GTK_FILL), 0, 0);
-   row++;
-
-   /*
-    controls.w_area_above = gtk_label_new ("");
-    gtk_label_set_justify( &controls.w_area_above, GTK_JUSTIFY_RIGHT);
-    gwy_table_attach_row(table, row, _("Area above"), siu->str,controls.w_area_above);
-    row++;
-    controls.w_area_below = gtk_label_new ("");
-    gwy_table_attach_row(table, row, _("Area below"), siu->str,controls.w_area_below);
-    row++;
-    controls.w_area_plane = gtk_label_new ("");
-    gwy_table_attach_row(table, row, _("Area of plane"), siu->str,controls.w_area_plane);
+    /* XXX: Wrong, must actually cube the units. */
+    g_string_assign(siu, siformat->units);
+    g_string_append(siu, "<sup>3</sup>");
+    controls->volume_dif = gtk_label_new(NULL);
+    gwy_table_attach_adjbar(table, row++, _("Volume above-below"), siu->str,
+                            GTK_OBJECT(controls->volume_dif),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+
+    controls->volume_indent = gtk_label_new(NULL);
+    gwy_table_attach_adjbar(table, row++, _("Indent. volume"), siu->str,
+                            GTK_OBJECT(controls->volume_indent),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+
+    /* XXX: Wrong, must actually square the units. */
+    g_string_assign(siu, siformat->units);
+    g_string_append(siu, "<sup>2</sup>");
+    controls->surface_indent = gtk_label_new(NULL);
+    gwy_table_attach_adjbar(table, row, _("Indent. A<sub>d</sub>"), siu->str,
+                            GTK_OBJECT(controls->surface_indent),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    use_markup_in_label(GTK_OBJECT(controls->surface_indent));
     row++;
 
-    controls.w_surface_above = gtk_label_new ("");
-    gwy_table_attach_row(table, row, _("Surface above"), siu->str,controls.w_surface_above);
-    row++;
-    controls.w_surface_below = gtk_label_new ("");
-    gwy_table_attach_row(table, row, _("Surface below"), siu->str,controls.w_surface_below);
+    controls->area_indent = gtk_label_new(NULL);
+    gwy_table_attach_adjbar(table, row, _("Indent. A<sub>p</sub>"), siu->str,
+                            GTK_OBJECT(controls->area_indent),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    use_markup_in_label(GTK_OBJECT(controls->area_indent));
     row++;
-    */
 
-   g_string_assign(siu, siformat->units);
-   g_string_append(siu, "<sup>3</sup>");
-   /*
-    controls.w_volume_above = gtk_label_new ("");
-    gwy_table_attach_row(table, row, _("Volume above"), siu->str,controls.w_volume_above);
+    controls->surface_innerpileup = gtk_label_new(NULL);
+    gwy_table_attach_adjbar(table, row,
+                            _("Inner Pile-Up A<sub>d</sub>"), siu->str,
+                            GTK_OBJECT(controls->surface_innerpileup),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    use_markup_in_label(GTK_OBJECT(controls->surface_innerpileup));
     row++;
-    controls.w_volume_below = gtk_label_new ("");
-    gwy_table_attach_row(table, row, _("Volume below"), siu->str,controls.w_volume_below);
-    row++;
-    */
-   controls->w_volume_dif = gtk_label_new("");
-   gwy_table_attach_row(table, row++, _("Volume above-below"), siu->str,
-         controls->w_volume_dif);
-
-   gtk_table_attach(GTK_TABLE(table), gtk_hseparator_new(), 0, 2, row, row + 1,
-         (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND
-               | GTK_FILL), 0, 0);
-   row++;
-
-   controls->w_volume_indent = gtk_label_new("");
-   gwy_table_attach_row(table, row++, _("Indent. volume"), siu->str,
-         controls->w_volume_indent);
-
-   g_string_assign(siu, siformat->units);
-   g_string_append(siu, "<sup>2</sup>");
-   controls->w_surface_indent = gtk_label_new("");
-   gwy_table_attach_row(table, row, _("Indent. A<sub>d</sub>"), siu->str,
-         controls->w_surface_indent);
-   if ( (label = gwy_table_get_child_widget(table, row, 0)) ) {
-      gtk_label_set_markup_with_mnemonic(GTK_LABEL(label),
-            gtk_label_get_text(GTK_LABEL(label)) );
-   }
-   row++;
-
-   controls->w_area_indent = gtk_label_new("");
-   gwy_table_attach_row(table, row, _("Indent. A<sub>p</sub>"), siu->str,
-         controls->w_area_indent);
-   if ( (label = gwy_table_get_child_widget(table, row, 0)) ) {
-      gtk_label_set_markup_with_mnemonic(GTK_LABEL(label),
-            gtk_label_get_text(GTK_LABEL(label)) );
-   }
-   row++;
-
-   gtk_table_attach(GTK_TABLE(table), gtk_hseparator_new(), 0, 2, row, row + 1,
-         (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND
-               | GTK_FILL), 0, 0);
-   row++;
-
-   controls->w_surface_innerpileup = gtk_label_new("");
-   gwy_table_attach_row(table, row, _("Inner Pile-Up A<sub>d</sub>"), siu->str,
-         controls->w_surface_innerpileup);
-   if ( (label = gwy_table_get_child_widget(table, row, 0)) ) {
-      gtk_label_set_markup_with_mnemonic(GTK_LABEL(label),
-            gtk_label_get_text(GTK_LABEL(label)) );
-   }
 
-   row++;
-   controls->w_area_innerpileup = gtk_label_new("");
-   gwy_table_attach_row(table, row, _("Inner Pile-Up A<sub>p</sub>"), siu->str,
-         controls->w_area_innerpileup);
-   if ( (label = gwy_table_get_child_widget(table, row, 0)) ) {
-      gtk_label_set_markup_with_mnemonic(GTK_LABEL(label),
-            gtk_label_get_text(GTK_LABEL(label)) );
-   }
+    controls->area_innerpileup = gtk_label_new(NULL);
+    gwy_table_attach_adjbar(table, row,
+                            _("Inner Pile-Up A<sub>p</sub>"), siu->str,
+                            GTK_OBJECT(controls->area_innerpileup),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    use_markup_in_label(GTK_OBJECT(controls->area_innerpileup));
+    row++;
 
-   row++;
-   controls->w_surface_outerpileup = gtk_label_new("");
-   gwy_table_attach_row(table, row, _("Outer Pile-Up A<sub>d</sub>"), siu->str,
-         controls->w_surface_outerpileup);
-   if ( (label = gwy_table_get_child_widget(table, row, 0)) ) {
-      gtk_label_set_markup_with_mnemonic(GTK_LABEL(label),
-            gtk_label_get_text(GTK_LABEL(label)) );
-   }
+    controls->surface_outerpileup = gtk_label_new(NULL);
+    gwy_table_attach_adjbar(table, row,
+                            _("Outer Pile-Up A<sub>d</sub>"), siu->str,
+                            GTK_OBJECT(controls->surface_outerpileup),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    use_markup_in_label(GTK_OBJECT(controls->surface_outerpileup));
+    row++;
 
-   row++;
-   controls->w_area_outerpileup = gtk_label_new("");
-   gwy_table_attach_row(table, row, _("Outer Pile-Up A<sub>p</sub>"), siu->str,
-         controls->w_area_outerpileup);
-   if ( (label = gwy_table_get_child_widget(table, row, 0)) ) {
-      gtk_label_set_markup_with_mnemonic(GTK_LABEL(label),
-            gtk_label_get_text(GTK_LABEL(label)) );
-   }
+    controls->area_outerpileup = gtk_label_new(NULL);
+    gwy_table_attach_adjbar(table, row,
+                            _("Outer Pile-Up A<sub>p</sub>"), siu->str,
+                            GTK_OBJECT(controls->area_outerpileup),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    use_markup_in_label(GTK_OBJECT(controls->area_outerpileup));
+    row++;
 
-   g_string_free(siu, TRUE);
-   gwy_si_unit_value_format_free(siformat);
+    g_string_free(siu, TRUE);
+    gwy_si_unit_value_format_free(siformat);
 
-   return table;
+    return table;
 }
 
 /** Create and run analyze dialog
@@ -637,7 +563,6 @@ indent_analyze_dialog(GwyContainer *data, IndentAnalyzeArgs * args)
     GtkWidget *dialog, *table, *hbox;
     IndentAnalyzeControls controls;
     gint response;
-    //gdouble zoomval;
     GtkObject *layer;
 
     controls.args = args;
@@ -669,7 +594,8 @@ indent_analyze_dialog(GwyContainer *data, IndentAnalyzeArgs * args)
     gwy_data_view_set_alpha_layer(GWY_DATA_VIEW(controls.view),
                                   GWY_PIXMAP_LAYER(layer));
     gtk_box_pack_start(GTK_BOX(hbox), controls.view, TRUE, TRUE, 4);
-    //gtk_widget_show_all(GTK_WIDGET(controls.view));
+    gwy_data_view_set_data_prefix(GWY_DATA_VIEW(controls.view), "/0/data");
+    gwy_set_data_preview_size(GWY_DATA_VIEW(controls.view), PREVIEW_SIZE);
 
     table = create_parameters_table(&controls);
     gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 4);
@@ -843,31 +769,24 @@ set_mask_at(GwyDataField *mask, gint x, gint y, gdouble m, gint how)
 
     switch (how) {
         case GWY_HOW_MARK_NEW:
-            act_mask = im;
-            break;
+        act_mask = im;
+        break;
 
         case GWY_HOW_MARK_AND:
-            act_mask = (act_mask && im);
-            break;
+        act_mask = (act_mask && im);
+        break;
 
         case GWY_HOW_MARK_OR:
-            act_mask = (act_mask || im);
-            /*    if(act_mask){
-               FILE* fl = gwy_fopen ("setmask.txt","a");
-               gwy_fprintf(fl, "[%d %d]%d %d %lf\n", x,y,act_mask, im, (double)(act_mask || im));
-               fclose(fl);
-               }
-               gwy_data_field_area_fill(mask,10,10,20,20,(double)act_mask);
-             */
-            break;
+        act_mask = (act_mask || im);
+        break;
 
         case GWY_HOW_MARK_NOT:
-            act_mask = !im;
-            break;
+        act_mask = !im;
+        break;
 
         case GWY_HOW_MARK_XOR:
-            act_mask = !(act_mask || im);
-            break;
+        act_mask = !(act_mask || im);
+        break;
     }
     gwy_data_field_set_val(mask, x, y, (double)act_mask);
 }
@@ -891,27 +810,8 @@ level_data(IndentAnalyzeControls *c)
                                     &(args->plane_y));
     }
 
-/*
-    switch(args->plane_correct)
-    {
-        case GWY_PLANE_LEVEL:
-            while (iter--) {
-               gwy_data_field_plane_level(dfield, args->plane_c, args->plane_x, args->plane_y);
-               get_field_slope_from_border (dfield, &(args->plane_c), &(args->plane_x), &(args->plane_y));
-            }
-            break;
-
-        case GWY_PLANE_ROTATE:
-            gwy_data_field_plane_rotate(dfield,
-                                180/G_PI*atan2(args->plane_x, 1),
-                                180/G_PI*atan2(args->plane_y, 1),
-                                GWY_INTERPOLATION_LINEAR);
-            break;
-    }
-*/
 }
 
-
 typedef struct {
     gint x;
     gint y;
@@ -924,8 +824,11 @@ typedef struct {
 
 #define   FLOOD_MAX_DEPTH  1000
 
-static void indentmask_flood_fill(GwyDataField *indentmask, gint i, gint j,
-      GwyDataField *dfield, FloodFillInfo * ffi)
+/* XXX XXX XXX: This could probably just mask areas according to a condition,
+ * number grains, and keep just a selected grain.  But who knows... */
+static void
+indentmask_flood_fill(GwyDataField *indentmask, gint i, gint j,
+                      GwyDataField *dfield, FloodFillInfo * ffi)
 {
    gint test = 0;
    gdouble c_f, c_t;
@@ -986,10 +889,10 @@ static void indentmask_flood_fill(GwyDataField *indentmask, gint i, gint j,
                if (s || rr) {
                   // check if point is inside datafield
                   if (tail->x + rr >= 0 && tail->x + rr < dfield_xres
-                        && tail->y + s >= 0 && tail->y + s < dfield_yres)
-                  {
-                     gdouble val = gwy_data_field_get_val(indentmask, tail->x
-                           + rr, tail->y + s);
+                        && tail->y + s >= 0 && tail->y + s < dfield_yres) {
+                     gdouble val = gwy_data_field_get_val(indentmask,
+                                                          tail->x + rr,
+                                                          tail->y + s);
                      if (!val) {
                         head->x = tail->x + rr;
                         head->y = tail->y + s;
@@ -1001,9 +904,6 @@ static void indentmask_flood_fill(GwyDataField *indentmask, gint i, gint j,
                         gwy_data_field_set_val(indentmask, tail->x + rr,
                               tail->y + s, FLOOD_QUEUED);
                      }
-                  } else {
-                     printf("start %d %d, want to set %d %d, dimensions %d %d\n", i, j, tail->x
-                           + rr, tail->y + s, dfield_xres, dfield_yres);
                   }
                }
             }
@@ -1276,7 +1176,7 @@ indent_analyze_ok(GwyContainer *data, IndentAnalyzeControls * controls)
 {
     //GwyDataField *dfield;
     GObject *maskfield;
-    GString *mask_name = g_string_new("");
+    GString *mask_name = g_string_new(NULL);
 
     // get right ID of datafield
     g_string_printf(mask_name, "/%d/mask", controls->dfield_id);
@@ -1304,9 +1204,8 @@ compute_and_preview(IndentAnalyzeControls * controls)
     GwyDataField *maskfield = 0, *dfield;
     GwyPixmapLayer *layer;
 
-    dfield =
-        GWY_DATA_FIELD(gwy_container_get_object_by_name
-                       (controls->mydata, "/0/data"));
+    dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name
+                            (controls->mydata, "/0/data"));
 
     read_data_from_controls(controls);
 
@@ -1340,79 +1239,34 @@ compute_and_preview(IndentAnalyzeControls * controls)
 /* =========== dialog control functions ========================= */
 
 static void
-dialog_update(G_GNUC_UNUSED IndentAnalyzeControls *controls,
-              G_GNUC_UNUSED IndentAnalyzeArgs *args)
-{
-
-    /*
-    gwy_option_menu_set_history(controls->w_plane_correct, "menu_plane_correct",
-                                args->plane_correct);
-                                */
-   /*
-    gwy_option_menu_set_history(controls->w_how_mark, "menu_how_mark",
-                                args->how_mark);
-    gwy_option_menu_set_history(controls->w_what_mark, "menu_what_mark",
-                                args->what_mark);
-                                */
-}
-
-/*
-static void
-plane_correct_cb(GtkWidget *item, IndentAnalyzeControls * controls)
-{
-    controls->args->plane_correct
-        =
-        GPOINTER_TO_UINT(g_object_get_data
-                         (G_OBJECT(item), "menu_plane_correct"));
-    dialog_update(controls, controls->args);
-}
-*/
-
-static void
 what_mark_cb(GtkWidget *item, IndentAnalyzeControls * controls)
 {
-    controls->args->what_mark
-        = gtk_combo_box_get_active(GTK_COMBO_BOX(item));
-        //= GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(item), "menu_what_mark"));
-    dialog_update(controls, controls->args);
+    controls->args->what_mark = gtk_combo_box_get_active(GTK_COMBO_BOX(item));
 }
 
 static void
 how_mark_cb(GtkWidget *item, IndentAnalyzeControls * controls)
 {
-    controls->args->how_mark
-        = gtk_combo_box_get_active(GTK_COMBO_BOX(item));
-        //= GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(item), "menu_how_mark"));
-    dialog_update(controls, controls->args);
+    controls->args->how_mark = gtk_combo_box_get_active(GTK_COMBO_BOX(item));
 }
 
 static void
 indentor_changed_cb(GtkWidget *item, IndentAnalyzeControls * controls)
 {
-    controls->args->indentor =
-        gtk_combo_box_get_active(GTK_COMBO_BOX(item));
-        //= GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(item), "indentor-type"));
-
-
-    dialog_update(controls, controls->args);
-    printf("indentor type %d\n", controls->args->indentor);
+    controls->args->indentor = gtk_combo_box_get_active(GTK_COMBO_BOX(item));
     gtk_combo_box_get_active(GTK_COMBO_BOX(item));
 }
 
-
 static const gchar *what_mark_key = "/module/nanoindent/what_mark";
 static const gchar *how_mark_key = "/module/nanoindent/how_mark";
-static const gchar *plane_correct_key = "/module/nanoindent/plane_correct";
 static const gchar *indentor_key = "/module/nanoindent/indentor";
 
 static const gchar *plane_tol_key = "/module/nanoindent/plane_tol";
 static const gchar *phi_tol_key = "/module/nanoindent/phi_tol";
-static const gchar *theta_tol_key = "/module/nanoindent/theta_tol";
 
 static void
 sanitize_args(IndentAnalyzeArgs * args)
 {
-    args->plane_correct = MIN(args->plane_correct, GWY_PLANE_ROTATE);
     args->what_mark = MIN(args->what_mark, GWY_WHAT_MARK_FACESBORDER);
     args->how_mark = MIN(args->how_mark, GWY_HOW_MARK_XOR);
     args->indentor = MIN(args->indentor, GWY_INDENTOR_CUBECORNER);
@@ -1422,16 +1276,12 @@ sanitize_args(IndentAnalyzeArgs * args)
 static void
 load_args(GwyContainer *container, IndentAnalyzeArgs * args)
 {
-    args->plane_correct = GWY_PLANE_LEVEL;
     args->what_mark = GWY_WHAT_MARK_NOTHING;
     args->how_mark = GWY_HOW_MARK_NEW;
     args->indentor = GWY_INDENTOR_VICKERS;
     args->plane_tol = 1.0;
     args->phi_tol = 8.0;
-    args->theta_tol = 8.0;
 
-    gwy_container_gis_enum_by_name(container, plane_correct_key,
-                                   &args->plane_correct);
     gwy_container_gis_enum_by_name(container, what_mark_key,
                                    &args->what_mark);
     gwy_container_gis_enum_by_name(container, how_mark_key,
@@ -1443,18 +1293,12 @@ load_args(GwyContainer *container, IndentAnalyzeArgs * args)
                                      &args->plane_tol);
     gwy_container_gis_double_by_name(container, phi_tol_key,
                                      &args->phi_tol);
-    gwy_container_gis_double_by_name(container, theta_tol_key,
-                                     &args->theta_tol);
     sanitize_args(args);
 }
 
 static void
 save_args(GwyContainer *container, IndentAnalyzeArgs * args)
 {
-    /*
-    gwy_container_set_enum_by_name(container, plane_correct_key,
-                                   args->plane_correct);
-                                   */
     gwy_container_set_enum_by_name(container, what_mark_key, args->what_mark);
     gwy_container_set_enum_by_name(container, how_mark_key, args->how_mark);
     gwy_container_set_enum_by_name(container, indentor_key, args->indentor);
@@ -1462,7 +1306,6 @@ save_args(GwyContainer *container, IndentAnalyzeArgs * args)
     gwy_container_set_double_by_name(container, plane_tol_key, args->plane_tol);
     /*
     gwy_container_set_double_by_name(container, phi_tol_key, args->phi_tol);
-    gwy_container_set_double_by_name(container, theta_tol_key, args->theta_tol);
     */
 }
 
@@ -1471,11 +1314,9 @@ static void
 read_data_from_controls(IndentAnalyzeControls *c)
 {
     c->args->plane_tol =
-        gtk_adjustment_get_value(GTK_ADJUSTMENT(c->w_plane_tol));
+        gtk_adjustment_get_value(GTK_ADJUSTMENT(c->plane_tol));
     /*
-    c->args->phi_tol = gtk_adjustment_get_value(GTK_ADJUSTMENT(c->w_phi_tol));
-    c->args->theta_tol =
-        gtk_adjustment_get_value(GTK_ADJUSTMENT(c->w_theta_tol));
+    c->args->phi_tol = gtk_adjustment_get_value(GTK_ADJUSTMENT(c->phi_tol));
      */
 }
 
@@ -1494,56 +1335,38 @@ update_data_labels(IndentAnalyzeControls *c)
 
     g_snprintf(str, str_len, "[%d, %d]px: %lf", c->args->minx, c->args->miny,
             c->args->min_val/mag);
-    gtk_label_set_text(GTK_LABEL(c->w_min_xy), str);
+    gtk_label_set_text(GTK_LABEL(c->min_xy), str);
 
     g_snprintf(str, str_len, "[%d, %d]px: %lf", c->args->maxx, c->args->maxy,
             c->args->max_val/mag);
-    gtk_label_set_text(GTK_LABEL(c->w_max_xy), str);
+    gtk_label_set_text(GTK_LABEL(c->max_xy), str);
 
     g_snprintf(str, str_len, "%lf", (c->args->max_val - c->args->min_val)/mag);
-    gtk_label_set_text(GTK_LABEL(c->w_minmax), str);
-/*
-    sprintf (str, "%g (%.1lf %%)", c->args->area_above/mag/mag, 100.*(c->args->area_above/sxy));
-    gtk_label_set_text(c->w_area_above, str);
-    sprintf (str, "%g (%.1lf %%)", c->args->area_below/mag/mag, 100.*(c->args->area_below/sxy));
-    gtk_label_set_text(c->w_area_below, str);
-    sprintf (str, "%g (%.1lf %%)", c->args->area_plane/mag/mag, 100.*(c->args->area_plane/sxy));
-    gtk_label_set_text(c->w_area_plane, str);
-
-    sprintf (str, "%g (+%.1f %%)", c->args->surface_above/mag/mag, 100.*c->args->surface_above/c->args->area_above);
-    gtk_label_set_text(c->w_surface_above, str);
-    sprintf (str, "%g (+%.1lf %%)", c->args->surface_below/mag/mag, 100.*c->args->surface_below/c->args->surface_below);
-    gtk_label_set_text(c->w_surface_below, str);
-
-    sprintf (str, "%g", c->args->volume_above/mag/mag/mag);
-    gtk_label_set_text(c->w_volume_above, str);
-    sprintf (str, "%g", c->args->volume_below/mag/mag/mag);
-    gtk_label_set_text(c->w_volume_below, str);
-*/
+    gtk_label_set_text(GTK_LABEL(c->minmax), str);
     g_snprintf(str, str_len, "%g",
             (c->args->volume_above - c->args->volume_below)/mag/mag/mag);
-    gtk_label_set_text(GTK_LABEL(c->w_volume_dif), str);
+    gtk_label_set_text(GTK_LABEL(c->volume_dif), str);
 
     g_snprintf(str, str_len, "%g", c->args->volume_indent/mag/mag/mag);
-    gtk_label_set_text(GTK_LABEL(c->w_volume_indent), str);
+    gtk_label_set_text(GTK_LABEL(c->volume_indent), str);
     g_snprintf(str, str_len, "%g", c->args->surface_indent/mag/mag);
-    gtk_label_set_text(GTK_LABEL(c->w_surface_indent), str);
+    gtk_label_set_text(GTK_LABEL(c->surface_indent), str);
     g_snprintf(str, str_len, "%g", (c->args->area_indent)/mag/mag);
-    gtk_label_set_text(GTK_LABEL(c->w_area_indent), str);
+    gtk_label_set_text(GTK_LABEL(c->area_indent), str);
 
     g_snprintf(str, str_len, "%g", c->args->surface_indent_exp/mag/mag);
-    gtk_label_set_text(GTK_LABEL(c->w_surface_indent_exp), str);
+    gtk_label_set_text(GTK_LABEL(c->surface_indent_exp), str);
     g_snprintf(str, str_len, "%g", (c->args->area_indent_exp)/mag/mag);
-    gtk_label_set_text(GTK_LABEL(c->w_area_indent_exp), str);
+    gtk_label_set_text(GTK_LABEL(c->area_indent_exp), str);
 
     g_snprintf(str, str_len, "%g", c->args->surface_innerpileup/mag/mag);
-    gtk_label_set_text(GTK_LABEL(c->w_surface_innerpileup), str);
+    gtk_label_set_text(GTK_LABEL(c->surface_innerpileup), str);
     g_snprintf(str, str_len, "%g", (c->args->area_innerpileup)/mag/mag);
-    gtk_label_set_text(GTK_LABEL(c->w_area_innerpileup), str);
+    gtk_label_set_text(GTK_LABEL(c->area_innerpileup), str);
     g_snprintf(str, str_len, "%g", c->args->surface_outerpileup/mag/mag);
-    gtk_label_set_text(GTK_LABEL(c->w_surface_outerpileup), str);
+    gtk_label_set_text(GTK_LABEL(c->surface_outerpileup), str);
     g_snprintf(str, str_len, "%g", (c->args->area_outerpileup)/mag/mag);
-    gtk_label_set_text(GTK_LABEL(c->w_area_outerpileup), str);
+    gtk_label_set_text(GTK_LABEL(c->area_outerpileup), str);
 }
 
 static void
@@ -1597,7 +1420,7 @@ save_statistics_dialog(IndentAnalyzeControls *c,
     sxy = gwy_data_field_get_xreal(dfield) * gwy_data_field_get_yreal(dfield);
     vf = gwy_data_field_get_value_format_xy(dfield, GWY_SI_UNIT_FORMAT_PLAIN, NULL);
     /*
-    siunit = gwy_si_unit_new("");
+    siunit = gwy_si_unit_new(NULL);
     gwy_si_unit_power(gwy_data_field_get_si_unit_xy(dfield), 2, siunit);
     vf2 = gwy_si_unit_get_format(siunit, args->area_plane, NULL);
     gwy_si_unit_multiply(siunit, gwy_data_field_get_si_unit_z(dfield), siunit);
diff --git a/modules/process/laplace.c b/modules/process/laplace.c
index 540ea69..af35ddb 100644
--- a/modules/process/laplace.c
+++ b/modules/process/laplace.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: laplace.c 19089 2016-10-16 12:47:38Z yeti-dn $
+ *  @(#) $Id: laplace.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -46,7 +46,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, laplace)
 
 static gboolean
 module_register(void)
diff --git a/modules/process/lat_synth.c b/modules/process/lat_synth.c
index 038f26e..0bd041a 100644
--- a/modules/process/lat_synth.c
+++ b/modules/process/lat_synth.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: lat_synth.c 19122 2016-10-24 18:50:48Z yeti-dn $
+ *  @(#) $Id: lat_synth.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014-2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -404,12 +404,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Generates surfaces based on regular or random lattices."),
     "Yeti <yeti at gwyddion.net>",
-    "1.1",
+    "1.2",
     "David Nečas (Yeti)",
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, lat_synth)
 
 static gboolean
 module_register(void)
@@ -628,7 +628,7 @@ lat_synth_dialog(LatSynthArgs *args,
         g_signal_connect_swapped(controls.dims->add, "toggled",
                                  G_CALLBACK(lat_synth_invalidate), &controls);
 
-    table = gtk_table_new(5, 4, FALSE);
+    table = gtk_table_new(5, 3, FALSE);
     controls.table = GTK_TABLE(table);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
@@ -641,9 +641,9 @@ lat_synth_dialog(LatSynthArgs *args,
         = gwy_enum_combo_box_new(lattice_types, G_N_ELEMENTS(lattice_types),
                                  G_CALLBACK(lattice_type_selected), &controls,
                                  args->lattice_type, TRUE);
-    gwy_table_attach_hscale(table, row, _("_Lattice:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Lattice:"), NULL,
                             GTK_OBJECT(controls.lattice_type),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     controls.size = gtk_adjustment_new(args->size, 4.0, 1000.0, 0.1, 10.0, 0);
@@ -659,7 +659,7 @@ lat_synth_dialog(LatSynthArgs *args,
                                               0.0, 16.0, 0.001, 0.1, 0);
     g_object_set_data(G_OBJECT(controls.lrelaxation),
                       "target", &args->lrelaxation);
-    gwy_table_attach_hscale(table, row, _("Lattice rela_xation:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("Lattice rela_xation:"), NULL,
                             controls.lrelaxation, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.lrelaxation, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
@@ -671,7 +671,7 @@ lat_synth_dialog(LatSynthArgs *args,
                                              0.0, 200.0, 0.01, 10.0, 0);
     g_object_set_data(G_OBJECT(controls.hrelaxation),
                       "target", &args->hrelaxation);
-    gwy_table_attach_hscale(table, row, _("_Height relaxation:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Height relaxation:"), NULL,
                             controls.hrelaxation, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.hrelaxation, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
@@ -696,7 +696,7 @@ lat_synth_dialog(LatSynthArgs *args,
     g_signal_connect_swapped(controls.sigma, "value-changed",
                              G_CALLBACK(invalidate_lattice), &controls);
 
-    table = gtk_table_new(9, 4, FALSE);
+    table = gtk_table_new(9, 3, FALSE);
     controls.table = GTK_TABLE(table);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
@@ -709,43 +709,43 @@ lat_synth_dialog(LatSynthArgs *args,
     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin),
                                    GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
     gtk_widget_set_size_request(scwin, -1, 240);
-    gtk_table_attach(GTK_TABLE(table), scwin, 0, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), scwin, 0, 3, row, row+1,
+                     GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
 
     create_surface_treeview(&controls);
     gtk_container_add(GTK_CONTAINER(scwin), controls.surfaces);
     row++;
 
-    controls.surface_header = gtk_label_new("");
+    controls.surface_header = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(controls.surface_header), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), controls.surface_header,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.weight = gtk_adjustment_new(0.0, -1.0, 1.0, 0.001, 0.1, 0);
-    gwy_table_attach_hscale(table, row, _("_Weight:"), NULL,
-                            controls.weight, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("_Weight:"), NULL,
+                            controls.weight, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls.weight, "value-changed",
                              G_CALLBACK(weight_changed), &controls);
     row++;
 
     controls.lower = gtk_adjustment_new(0.0, 0.0, 1.0, 0.001, 0.1, 0);
-    gwy_table_attach_hscale(table, row, _("Lower threshold:"), NULL,
-                            controls.lower, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("Lower threshold:"), NULL,
+                            controls.lower, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls.lower, "value-changed",
                              G_CALLBACK(lower_changed), &controls);
     row++;
 
     controls.upper = gtk_adjustment_new(0.0, 0.0, 1.0, 0.001, 0.1, 0);
-    gwy_table_attach_hscale(table, row, _("Upper threshold:"), NULL,
-                            controls.upper, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("Upper threshold:"), NULL,
+                            controls.upper, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls.upper, "value-changed",
                              G_CALLBACK(upper_changed), &controls);
     row++;
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Height")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     row = gwy_synth_attach_height(&controls, row,
@@ -755,11 +755,11 @@ lat_synth_dialog(LatSynthArgs *args,
 
     if (dfield_template) {
         controls.height_init
-            = gtk_button_new_with_mnemonic(_("_Like Current Channel"));
+            = gtk_button_new_with_mnemonic(_("_Like Current Image"));
         g_signal_connect_swapped(controls.height_init, "clicked",
                                  G_CALLBACK(height_init_clicked), &controls);
         gtk_table_attach(GTK_TABLE(table), controls.height_init,
-                         1, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
     }
 
diff --git a/modules/process/latsim.c b/modules/process/latsim.c
index ed1365f..8a07a07 100644
--- a/modules/process/latsim.c
+++ b/modules/process/latsim.c
@@ -75,12 +75,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Lateral force simulator"),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "1.1",
+    "1.2",
     "David Nečas (Yeti) & Petr Klapetek",
     "2012",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, latsim)
 
 static gboolean
 module_register(void)
@@ -172,25 +172,23 @@ latsim_dialog(LatSimArgs *args)
 
 
     controls.mu = gtk_adjustment_new(args->mu, 0.001, 100, 0.1, 1, 0);
-    spin = gwy_table_attach_spinbutton(table, row, _("_Friction coef.:"), "",
-                                controls.mu);
+    spin = gwy_table_attach_adjbar(table, row, _("_Friction coef.:"), NULL,
+                                   controls.mu, GWY_HSCALE_LOG);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 1);
     row++;
 
     controls.load = gtk_adjustment_new(args->load, 0.0, 1000, 1, 10, 0);
-    spin = gwy_table_attach_spinbutton(table, row, _("_Normal force:"), "nN",
-                                controls.load);
+    spin = gwy_table_attach_adjbar(table, row, _("_Normal force:"), "nN",
+                                   controls.load, GWY_HSCALE_SQRT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 1);
 
     row++;
     controls.adhesion = gtk_adjustment_new(args->adhesion, 0.0, 1000, 1, 10, 0);
-    spin = gwy_table_attach_spinbutton(table, row, _("_Adhesion force:"), "nN",
-                                controls.adhesion);
+    spin = gwy_table_attach_adjbar(table, row, _("_Adhesion force:"), "nN",
+                                   controls.adhesion, GWY_HSCALE_SQRT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 1);
     row++;
 
-
-
     gtk_widget_show_all(dialog);
     do {
         response = gtk_dialog_run(GTK_DIALOG(dialog));
diff --git a/modules/process/level.c b/modules/process/level.c
index 166dc6e..e0ad482 100644
--- a/modules/process/level.c
+++ b/modules/process/level.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: level.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: level.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -78,7 +78,7 @@ static GwyModuleInfo module_info = {
     "2003",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, level)
 
 static gboolean
 module_register(void)
@@ -258,7 +258,7 @@ level_dialog(LevelArgs *args,
 
     label = gwy_label_new_header(_("Masking Mode"));
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.masking = gwy_radio_buttons_create(gwy_masking_type_get_enum(), -1,
diff --git a/modules/process/level_grains.c b/modules/process/level_grains.c
index 56e5934..b9351a8 100644
--- a/modules/process/level_grains.c
+++ b/modules/process/level_grains.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: level_grains.c 19089 2016-10-16 12:47:38Z yeti-dn $
+ *  @(#) $Id: level_grains.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2011 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -89,7 +89,7 @@ static GwyModuleInfo module_info = {
     "2011",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, level_grains)
 
 static gboolean
 module_register(void)
diff --git a/modules/process/linecorrect.c b/modules/process/linecorrect.c
index ea260dc..af77cf8 100644
--- a/modules/process/linecorrect.c
+++ b/modules/process/linecorrect.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: linecorrect.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: linecorrect.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek, Luke Somers.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, lsomers at sas.upenn.edu.
  *
@@ -35,8 +35,6 @@
 
 #define LINECORR_RUN_MODES GWY_RUN_IMMEDIATE
 
-#define GOLDEN_RATIO .6180339887498948482
-
 typedef struct {
     gdouble *a;
     gdouble *b;
@@ -58,7 +56,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, linecorrect)
 
 static gboolean
 module_register(void)
diff --git a/modules/process/linematch.c b/modules/process/linematch.c
index 5fbbf47..f7f194e 100644
--- a/modules/process/linematch.c
+++ b/modules/process/linematch.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: linematch.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: linematch.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2015 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -106,9 +106,6 @@ static void     slope_level_row_shifts  (GwyDataLine *shifts);
 static void     apply_row_shifts        (GwyDataField *dfield,
                                          GwyDataField *bg,
                                          GwyDataLine *shifts);
-static void     flip_xy                 (GwyDataField *source,
-                                         GwyDataField *dest,
-                                         gboolean minor);
 static gboolean linematch_dialog        (LineMatchArgs *args,
                                          GwyContainer *data,
                                          GwyDataField *dfield,
@@ -167,12 +164,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Aligns rows by various methods."),
     "Yeti <yeti at gwyddion.net>",
-    "1.4",
+    "1.5",
     "David Nečas (Yeti)",
     "2015",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, linematch)
 
 static gboolean
 module_register(void)
@@ -295,11 +292,11 @@ linematch_do(GwyDataField *mask,
     mymask = mask;
     if (args->direction == GWY_ORIENTATION_VERTICAL) {
         tmpresult = gwy_data_field_new_alike(args->result, FALSE);
-        flip_xy(args->result, tmpresult, FALSE);
+        gwy_data_field_flip_xy(args->result, tmpresult, FALSE);
         GWY_SWAP(GwyDataField*, args->result, tmpresult);
         if (mask) {
             mymask = gwy_data_field_new_alike(mask, FALSE);
-            flip_xy(mask, mymask, FALSE);
+            gwy_data_field_flip_xy(mask, mymask, FALSE);
         }
     }
 
@@ -328,9 +325,9 @@ linematch_do(GwyDataField *mask,
     /* Transpose back if necessary. */
     if (args->direction == GWY_ORIENTATION_VERTICAL) {
         GWY_OBJECT_UNREF(mymask);
-        flip_xy(args->result, tmpresult, TRUE);
+        gwy_data_field_flip_xy(args->result, tmpresult, TRUE);
         GWY_SWAP(GwyDataField*, args->result, tmpresult);
-        flip_xy(args->bg, tmpresult, TRUE);
+        gwy_data_field_flip_xy(args->bg, tmpresult, TRUE);
         gwy_data_field_resample(args->bg,
                                 args->result->xres, args->result->yres,
                                 GWY_INTERPOLATION_NONE);
@@ -740,36 +737,6 @@ apply_row_shifts(GwyDataField *dfield, GwyDataField *bg,
     }
 }
 
-static void
-flip_xy(GwyDataField *source, GwyDataField *dest, gboolean minor)
-{
-    gint xres, yres, i, j;
-    gdouble *dd;
-    const gdouble *sd;
-
-    xres = gwy_data_field_get_xres(source);
-    yres = gwy_data_field_get_yres(source);
-    gwy_data_field_resample(dest, yres, xres, GWY_INTERPOLATION_NONE);
-    sd = gwy_data_field_get_data_const(source);
-    dd = gwy_data_field_get_data(dest);
-    if (minor) {
-        for (i = 0; i < xres; i++) {
-            for (j = 0; j < yres; j++) {
-                dd[i*yres + j] = sd[j*xres + (xres - 1 - i)];
-            }
-        }
-    }
-    else {
-        for (i = 0; i < xres; i++) {
-            for (j = 0; j < yres; j++) {
-                dd[i*yres + (yres - 1 - j)] = sd[j*xres + i];
-            }
-        }
-    }
-    gwy_data_field_set_xreal(dest, gwy_data_field_get_yreal(source));
-    gwy_data_field_set_yreal(dest, gwy_data_field_get_xreal(source));
-}
-
 static gboolean
 linematch_dialog(LineMatchArgs *args,
                  GwyContainer *data,
@@ -818,7 +785,7 @@ linematch_dialog(LineMatchArgs *args,
     gtk_container_add(GTK_CONTAINER(alignment), controls.dataview);
     gtk_box_pack_start(GTK_BOX(hbox), alignment, FALSE, FALSE, 4);
 
-    table = gtk_table_new(7 + LINE_LEVEL_NMETHODS + (mfield ? 4 : 0), 4, FALSE);
+    table = gtk_table_new(7 + LINE_LEVEL_NMETHODS + (mfield ? 4 : 0), 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -828,7 +795,7 @@ linematch_dialog(LineMatchArgs *args,
     label = gtk_label_new(_("Method:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.method_group
@@ -836,13 +803,13 @@ linematch_dialog(LineMatchArgs *args,
                                    G_CALLBACK(method_changed),
                                    &controls, args->method);
     row = gwy_radio_buttons_attach_to_table(controls.method_group,
-                                            GTK_TABLE(table), 3, row);
+                                            GTK_TABLE(table), 2, row);
 
     controls.max_degree = gtk_adjustment_new(args->max_degree,
                                              0, MAX_DEGREE, 1, 1, 0);
-    gwy_table_attach_hscale(table, row++,
-                            _("_Polynomial degree:"), NULL,
-                            controls.max_degree, 0);
+    gwy_table_attach_adjbar(table, row++, _("_Polynomial degree:"), NULL,
+                            controls.max_degree,
+                            GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     gwy_table_hscale_set_sensitive(GTK_OBJECT(controls.max_degree),
                                    args->method == LINE_LEVEL_POLY);
     g_signal_connect_swapped(controls.max_degree, "value-changed",
@@ -851,15 +818,16 @@ linematch_dialog(LineMatchArgs *args,
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gwy_label_new_header(_("Options"));
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.direction
         = gwy_enum_combo_box_new(gwy_orientation_get_enum(), -1,
                                  G_CALLBACK(direction_changed), &controls,
                                  args->direction, TRUE);
-    gwy_table_attach_row(table, row, _("_Direction:"), NULL,
-                         controls.direction);
+    gwy_table_attach_adjbar(table, row, _("_Direction:"), NULL,
+                            GTK_OBJECT(controls.direction),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     controls.do_extract
@@ -882,11 +850,6 @@ linematch_dialog(LineMatchArgs *args,
                              G_CALLBACK(do_plot_changed), &controls);
     row++;
 
-    label = gtk_label_new_with_mnemonic(_("Target _graph:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
     controls.target_graph = gwy_data_chooser_new_graphs();
     chooser = GWY_DATA_CHOOSER(controls.target_graph);
     gwy_data_chooser_set_none(chooser, _("New graph"));
@@ -894,9 +857,9 @@ linematch_dialog(LineMatchArgs *args,
     gwy_data_chooser_set_filter(chooser, filter_target_graphs, &controls, NULL);
     gwy_data_chooser_set_active_id(chooser, &args->target_graph);
     gwy_data_chooser_get_active_id(chooser, &args->target_graph);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.target_graph);
-    gtk_table_attach(GTK_TABLE(table), controls.target_graph,
-                     1, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    gwy_table_attach_adjbar(table, row, _("Target _graph:"), NULL,
+                            GTK_OBJECT(controls.target_graph),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     g_signal_connect_swapped(controls.target_graph, "changed",
                              G_CALLBACK(target_graph_changed), &controls);
     row++;
@@ -905,7 +868,7 @@ linematch_dialog(LineMatchArgs *args,
         gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
         label = gwy_label_new_header(_("Masking Mode"));
         gtk_table_attach(GTK_TABLE(table), label,
-                        0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                        0, 3, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
 
         controls.masking_group
diff --git a/modules/process/lno_synth.c b/modules/process/lno_synth.c
index d899f89..ccf1491 100644
--- a/modules/process/lno_synth.c
+++ b/modules/process/lno_synth.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: lno_synth.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: lno_synth.c 20105 2017-07-29 09:24:09Z yeti-dn $
  *  Copyright (C) 2010 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -35,8 +35,6 @@
 #include "dimensions.h"
 #include "preview.h"
 
-#define GWY_SQRT6 2.449489742783178098197284074705
-
 #define LNO_SYNTH_RUN_MODES (GWY_RUN_IMMEDIATE | GWY_RUN_INTERACTIVE)
 
 #define DECLARE_LNOISE(name) \
@@ -279,7 +277,7 @@ static GwyModuleInfo module_info = {
     "2010",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, lno_synth)
 
 static gboolean
 module_register(void)
@@ -492,7 +490,7 @@ lno_synth_dialog(LNoSynthArgs *args,
         g_signal_connect_swapped(controls.dims->add, "toggled",
                                  G_CALLBACK(lno_synth_invalidate), &controls);
 
-    table = gtk_table_new(9 + (dfield_template ? 1 : 0), 4, FALSE);
+    table = gtk_table_new(9 + (dfield_template ? 1 : 0), 3, FALSE);
     controls.table = GTK_TABLE(table);
     gtk_table_set_row_spacings(controls.table, 2);
     gtk_table_set_col_spacings(controls.table, 6);
@@ -502,18 +500,18 @@ lno_synth_dialog(LNoSynthArgs *args,
     row = 0;
 
     gtk_table_attach(controls.table, gwy_label_new_header(_("Distribution")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.distribution = distribution_selector_new(&controls);
-    gwy_table_attach_hscale(table, row, _("_Distribution:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Distribution:"), NULL,
                             GTK_OBJECT(controls.distribution),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
-    label = gtk_label_new(_("Direction:"));
+    label = gtk_label_new(_("Noise type:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1,
+    gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
                      GTK_FILL, 0, 0, 0);
     row++;
 
@@ -525,7 +523,7 @@ lno_synth_dialog(LNoSynthArgs *args,
                                     _("One-sided _negative"), LNO_DIRECTION_DOWN,
                                     NULL);
     row = gwy_radio_buttons_attach_to_table(controls.direction,
-                                            GTK_TABLE(table), 3, row);
+                                            GTK_TABLE(table), 2, row);
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
 
     row = gwy_synth_attach_height(&controls, row,
@@ -534,22 +532,23 @@ lno_synth_dialog(LNoSynthArgs *args,
 
     if (dfield_template) {
         controls.sigma_init
-            = gtk_button_new_with_mnemonic(_("_Like Current Channel"));
+            = gtk_button_new_with_mnemonic(_("_Like Current Image"));
         g_signal_connect_swapped(controls.sigma_init, "clicked",
                                  G_CALLBACK(sigma_init_clicked), &controls);
         gtk_table_attach(GTK_TABLE(table), controls.sigma_init,
-                         1, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
     }
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     gtk_table_attach(controls.table, gwy_label_new_header(_("Noise Type")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.type = noise_selector_new(&controls);
-    gwy_table_attach_hscale(table, row, _("_Noise type:"), NULL,
-                            GTK_OBJECT(controls.type), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("_Noise type:"), NULL,
+                            GTK_OBJECT(controls.type),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     g_object_set_data(G_OBJECT(controls.table),
@@ -849,9 +848,9 @@ create_gui_steps(LNoSynthControls *controls)
                                             0.001, 100.0, 0.001, 1.0, 0);
     g_object_set_data(G_OBJECT(pcontrols->density),
                       "target", &pargs->density);
-    gwy_table_attach_hscale(GTK_WIDGET(controls->table),
-                            row, _("Densi_ty:"), NULL, pcontrols->density,
-                            GWY_HSCALE_LOG);
+    gwy_table_attach_adjbar(GTK_WIDGET(controls->table), row,
+                            _("Densi_ty:"), NULL,
+                            pcontrols->density, GWY_HSCALE_LOG);
     g_signal_connect_swapped(pcontrols->density, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), controls);
     row++;
@@ -860,9 +859,9 @@ create_gui_steps(LNoSynthControls *controls)
                                              0.0, 1.0, 0.001, 0.1, 0);
     g_object_set_data(G_OBJECT(pcontrols->lineprob),
                       "target", &pargs->lineprob);
-    gwy_table_attach_hscale(GTK_WIDGET(controls->table),
-                            row, _("_Within line:"), NULL, pcontrols->lineprob,
-                            GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(GTK_WIDGET(controls->table), row,
+                            _("_Within line:"), NULL,
+                            pcontrols->lineprob, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(pcontrols->lineprob, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), controls);
     row++;
@@ -874,7 +873,7 @@ create_gui_steps(LNoSynthControls *controls)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcontrols->cumulative),
                                  pargs->cumulative);
     gtk_table_attach(controls->table, pcontrols->cumulative,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(pcontrols->cumulative, "toggled",
                              G_CALLBACK(gwy_synth_boolean_changed), controls);
     row++;
@@ -1038,8 +1037,9 @@ create_gui_scars(LNoSynthControls *controls)
 
     pcontrols->coverage = gtk_adjustment_new(pargs->coverage,
                                              0.0001, 10.0, 0.0001, 0.1, 0);
-    gwy_table_attach_hscale(GTK_WIDGET(controls->table), row, _("Co_verage:"),
-                            NULL, pcontrols->coverage, GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(GTK_WIDGET(controls->table), row,
+                            _("Co_verage:"), NULL,
+                            pcontrols->coverage, GWY_HSCALE_SQRT);
     g_object_set_data(G_OBJECT(pcontrols->coverage),
                       "target", &pargs->coverage);
     g_signal_connect_swapped(pcontrols->coverage, "value-changed",
@@ -1218,9 +1218,9 @@ create_gui_ridges(LNoSynthControls *controls)
                                             0.001, 100.0, 0.001, 1.0, 0);
     g_object_set_data(G_OBJECT(pcontrols->density),
                       "target", &pargs->density);
-    gwy_table_attach_hscale(GTK_WIDGET(controls->table),
-                            row, _("Densi_ty:"), NULL, pcontrols->density,
-                            GWY_HSCALE_LOG);
+    gwy_table_attach_adjbar(GTK_WIDGET(controls->table), row,
+                            _("Densi_ty:"), NULL,
+                            pcontrols->density, GWY_HSCALE_LOG);
     g_signal_connect_swapped(pcontrols->density, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), controls);
     row++;
@@ -1229,9 +1229,9 @@ create_gui_ridges(LNoSynthControls *controls)
                                              0.0, 1.0, 0.001, 0.1, 0);
     g_object_set_data(G_OBJECT(pcontrols->lineprob),
                       "target", &pargs->lineprob);
-    gwy_table_attach_hscale(GTK_WIDGET(controls->table),
-                            row, _("_Within line:"), NULL, pcontrols->lineprob,
-                            GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(GTK_WIDGET(controls->table), row,
+                            _("_Within line:"), NULL,
+                            pcontrols->lineprob, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(pcontrols->lineprob, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), controls);
     row++;
@@ -1239,9 +1239,9 @@ create_gui_ridges(LNoSynthControls *controls)
     pcontrols->width = gtk_adjustment_new(pargs->width,
                                           0.0001, 1.0, 0.0001, 0.01, 0);
     g_object_set_data(G_OBJECT(pcontrols->width), "target", &pargs->width);
-    gwy_table_attach_hscale(GTK_WIDGET(controls->table),
-                            row, _("Wi_dth:"), NULL, pcontrols->width,
-                            GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(GTK_WIDGET(controls->table), row,
+                            _("Wi_dth:"), NULL,
+                            pcontrols->width, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(pcontrols->width, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), controls);
     row++;
diff --git a/modules/process/local_contrast.c b/modules/process/local_contrast.c
index 64c3963..f589ae9 100644
--- a/modules/process/local_contrast.c
+++ b/modules/process/local_contrast.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: local_contrast.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: local_contrast.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -76,12 +76,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Maximizes local contrast."),
     "Yeti <yeti at gwyddion.net>",
-    "1.3",
+    "1.4",
     "David Nečas (Yeti) & Petr Klapetek",
     "2005",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, local_contrast)
 
 static gboolean
 module_register(void)
@@ -134,7 +134,7 @@ contrast_dialog(ContrastArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(3, 4, FALSE);
+    table = gtk_table_new(3, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -143,16 +143,16 @@ contrast_dialog(ContrastArgs *args)
     row = 0;
 
     controls.size = gtk_adjustment_new(args->size, 1, MAX_SIZE, 1, 5, 0);
-    gwy_table_attach_hscale(table, row++, _("Kernel _size:"), "px",
-                            controls.size, 0);
+    gwy_table_attach_adjbar(table, row++, _("Kernel _size:"), _("px"),
+                            controls.size, GWY_HSCALE_LINEAR);
 
     controls.depth = gtk_adjustment_new(args->depth, 2, MAX_DEPTH, 1, 2, 0);
-    gwy_table_attach_hscale(table, row++, _("Blending _depth:"), NULL,
-                            controls.depth, 0);
+    gwy_table_attach_adjbar(table, row++, _("Blending _depth:"), NULL,
+                            controls.depth, GWY_HSCALE_LINEAR);
 
     controls.weight = gtk_adjustment_new(args->weight, 0.0, 1.0, 0.01, 0.1, 0);
-    gwy_table_attach_hscale(table, row++, _("_Weight:"), NULL,
-                            controls.weight, 0);
+    gwy_table_attach_adjbar(table, row++, _("_Weight:"), NULL,
+                            controls.weight, GWY_HSCALE_LINEAR);
 
     gtk_widget_show_all(dialog);
     do {
diff --git a/modules/process/logistic.c b/modules/process/logistic.c
index 73e8b5f..4f69e5d 100644
--- a/modules/process/logistic.c
+++ b/modules/process/logistic.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: logistic.c 19068 2016-10-13 18:41:54Z dn2010 $
- *  Copyright (C) 2016 David Necas (Yeti), Petr Klapetek,
+ *  @(#) $Id: logistic.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2016-2017 David Necas (Yeti), Petr Klapetek,
  *  Daniil Bratashov.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net,
  *  dn2010 at gwyddion.net
@@ -30,8 +30,8 @@
 #include <libprocess/stats.h>
 #include <libprocess/filters.h>
 #include <libgwydgets/gwystock.h>
+#include <libgwydgets/gwyradiobuttons.h>
 #include <libgwydgets/gwydgetutils.h>
-#include <libgwydgets/gwydgets.h>
 #include <libgwymodule/gwymodule-process.h>
 #include <app/gwyapp.h>
 #include <string.h>
@@ -121,12 +121,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Trains logistic regression to mark grains."),
     "Daniil Bratashov <dn2010 at gwyddion.net>",
-    "0.2",
+    "0.3",
     "David Nečas (Yeti) & Petr Klapetek & Daniil Bratashov",
     "2016",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, logistic)
 
 static gboolean
 module_register(void)
@@ -241,7 +241,7 @@ logistic_dialog(G_GNUC_UNUSED GwyContainer *data, LogisticArgs *args)
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
     controls.dialog = dialog;
 
-    table = gtk_table_new(9, 4, FALSE);
+    table = gtk_table_new(9, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -257,18 +257,17 @@ logistic_dialog(G_GNUC_UNUSED GwyContainer *data, LogisticArgs *args)
                                               LOGISTIC_MODE_TRAIN,
                                               NULL);
     button = gwy_radio_buttons_find(controls.mode, LOGISTIC_MODE_TRAIN);
-    gtk_table_attach(GTK_TABLE(table), button, 0, 3, row, row+1,
+    gtk_table_attach(GTK_TABLE(table), button, 0, 2, row, row+1,
                      GTK_FILL, 0, 0, 0);
     row++;
 
     button = gwy_radio_buttons_find(controls.mode, LOGISTIC_MODE_USE);
-    gtk_table_attach(GTK_TABLE(table), button, 0, 3, row, row+1,
+    gtk_table_attach(GTK_TABLE(table), button, 0, 2, row, row+1,
                      GTK_FILL, 0, 0, 0);
     row++;
 
-    gtk_table_attach(GTK_TABLE(table),
-                     gwy_label_new_header(_("Features")),
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Features")),
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.use_gaussians
@@ -276,20 +275,18 @@ logistic_dialog(G_GNUC_UNUSED GwyContainer *data, LogisticArgs *args)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.use_gaussians),
                                  args->use_gaussians);
     gtk_table_attach(GTK_TABLE(table), controls.use_gaussians,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.use_gaussians, "toggled",
-                             G_CALLBACK(logistic_invalidate),
-                             &controls);
+                             G_CALLBACK(logistic_invalidate), &controls);
     row++;
 
-    controls.ngaussians
-                 = gtk_adjustment_new(args->ngaussians, 1, 10, 1, 2, 0);
-    gwy_table_attach_hscale(table, row,
+    controls.ngaussians = gtk_adjustment_new(args->ngaussians, 1, 10, 1, 2, 0);
+    gwy_table_attach_adjbar(table, row,
                             _("_Number of Gaussians:"), NULL,
-                            controls.ngaussians, GWY_HSCALE_DEFAULT);
+                            controls.ngaussians,
+                            GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(controls.ngaussians, "value-changed",
-                             G_CALLBACK(logistic_invalidate),
-                             &controls);
+                             G_CALLBACK(logistic_invalidate), &controls);
     row++;
 
     controls.use_sobel
@@ -297,10 +294,9 @@ logistic_dialog(G_GNUC_UNUSED GwyContainer *data, LogisticArgs *args)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.use_sobel),
                                  args->use_sobel);
     gtk_table_attach(GTK_TABLE(table), controls.use_sobel,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.use_sobel, "toggled",
-                             G_CALLBACK(logistic_invalidate),
-                             &controls);
+                             G_CALLBACK(logistic_invalidate), &controls);
     row++;
 
     controls.use_laplasian
@@ -308,10 +304,9 @@ logistic_dialog(G_GNUC_UNUSED GwyContainer *data, LogisticArgs *args)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.use_laplasian),
                                  args->use_laplasian);
     gtk_table_attach(GTK_TABLE(table), controls.use_laplasian,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.use_laplasian, "toggled",
-                             G_CALLBACK(logistic_invalidate),
-                             &controls);
+                             G_CALLBACK(logistic_invalidate), &controls);
     row++;
 
     controls.use_hessian
@@ -319,20 +314,18 @@ logistic_dialog(G_GNUC_UNUSED GwyContainer *data, LogisticArgs *args)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.use_hessian),
                                  args->use_hessian);
     gtk_table_attach(GTK_TABLE(table), controls.use_hessian,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.use_hessian, "toggled",
-                             G_CALLBACK(logistic_invalidate),
-                             &controls);
+                             G_CALLBACK(logistic_invalidate), &controls);
     row++;
 
     controls.lambda
              = gtk_adjustment_new(args->lambda, 0.0, 10.0, 0.1, 1.0, 0);
-    gwy_table_attach_hscale(table, row,
+    gwy_table_attach_adjbar(table, row,
                             _("_Regularization parameter:"), NULL,
                             controls.lambda, GWY_HSCALE_DEFAULT);
     g_signal_connect_swapped(controls.lambda, "value-changed",
-                             G_CALLBACK(logistic_invalidate),
-                             &controls);
+                             G_CALLBACK(logistic_invalidate), &controls);
     row++;
 
     logistic_dialog_update(&controls, args);
diff --git a/modules/process/mark_disconn.c b/modules/process/mark_disconn.c
index 6347cd4..c77cdac 100644
--- a/modules/process/mark_disconn.c
+++ b/modules/process/mark_disconn.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: mark_disconn.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: mark_disconn.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2015 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -31,6 +31,7 @@
 #include <libprocess/linestats.h>
 #include <libgwydgets/gwyradiobuttons.h>
 #include <libgwydgets/gwycombobox.h>
+#include <libgwydgets/gwystock.h>
 #include <libgwymodule/gwymodule-process.h>
 #include <app/gwymoduleutils.h>
 #include <app/gwyapp.h>
@@ -62,7 +63,7 @@ typedef struct {
     GtkWidget *view;
     GtkWidget *color_button;
     GtkWidget *combine;
-    GtkWidget *combine_type;
+    GSList *combine_type;
 } DisconnControls;
 
 static gboolean module_register      (void);
@@ -83,10 +84,9 @@ static void     size_changed         (GtkAdjustment *adj,
                                       DisconnControls *controls);
 static void     threshold_changed    (GtkAdjustment *adj,
                                       DisconnControls *controls);
-static void     combine_changed      (GtkToggleButton *toggle,
-                                      DisconnControls *controls);
-static void     combine_type_changed (GtkComboBox *combo,
-                                      DisconnControls *controls);
+static void     combine_changed      (DisconnControls *controls,
+                                      GtkToggleButton *toggle);
+static void     combine_type_changed (DisconnControls *controls);
 static void     disconn_load_args    (GwyContainer *container,
                                       DisconnArgs *args);
 static void     disconn_save_args    (GwyContainer *container,
@@ -103,12 +103,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Creates mask of values disconnected to the rest."),
     "Yeti <yeti at gwyddion.net>",
-    "1.2",
+    "1.4",
     "David Nečas (Yeti)",
     "2015",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, mark_disconn)
 
 static gboolean
 module_register(void)
@@ -116,7 +116,7 @@ module_register(void)
     gwy_process_func_register("mark_disconn",
                               (GwyProcessFunc)&mark_disconn,
                               N_("/_Correct Data/Mask of _Disconnected..."),
-                              NULL,
+                              GWY_STOCK_DISCONNECTED,
                               DISCONN_RUN_MODES,
                               GWY_MENU_FLAG_DATA,
                               N_("Mark data disconnected from other values"));
@@ -148,8 +148,8 @@ mark_disconn(GwyContainer *data,
                            _("Initializing..."));
         if (!disconn_do(dfield, maskfield, &args))
             GWY_OBJECT_UNREF(maskfield);
-        disconn_save_args(gwy_app_settings_get(), &args);
     }
+    disconn_save_args(gwy_app_settings_get(), &args);
 
     if (!maskfield)
         return;
@@ -239,7 +239,7 @@ disconn_dialog(DisconnArgs *args, GwyContainer *data, gint id)
     controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, TRUE);
     gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4);
 
-    table = gtk_table_new(8 + 2*(!!existing_mask), 4, FALSE);
+    table = gtk_table_new(8 + 2*(!!existing_mask), 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -249,27 +249,28 @@ disconn_dialog(DisconnArgs *args, GwyContainer *data, gint id)
     label = gtk_label_new(_("Defect type:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     group = gwy_radio_buttons_create(types, G_N_ELEMENTS(types),
                                      G_CALLBACK(type_changed), &controls,
                                      args->type);
     controls.type = group;
-    row = gwy_radio_buttons_attach_to_table(group, GTK_TABLE(table), 3, row);
+    row = gwy_radio_buttons_attach_to_table(group, GTK_TABLE(table), 2, row);
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     controls.size = gtk_adjustment_new(args->size, 1, 256, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("Defect _radius:"), "px",
-                            controls.size, GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(table, row, _("Defect _radius:"), _("px"),
+                            controls.size,
+                            GWY_HSCALE_SQRT | GWY_HSCALE_SNAP);
     g_signal_connect(controls.size, "value-changed",
                      G_CALLBACK(size_changed), &controls);
     row++;
 
     controls.threshold = gtk_adjustment_new(args->threshold,
                                             0.0, 1.0, 0.001, 0.1, 0);
-    spin = gwy_table_attach_hscale(table, row, _("_Threshold:"), NULL,
-                                   controls.threshold, GWY_HSCALE_SQRT);
+    spin = gwy_table_attach_adjbar(table, row, _("_Threshold:"), NULL,
+                                   controls.threshold, GWY_HSCALE_DEFAULT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 4);
     g_signal_connect(controls.threshold, "value-changed",
                      G_CALLBACK(threshold_changed), &controls);
@@ -278,36 +279,23 @@ disconn_dialog(DisconnArgs *args, GwyContainer *data, gint id)
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gwy_label_new_header(_("Options"));
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     if (existing_mask) {
-        controls.combine
-            = gtk_check_button_new_with_mnemonic(_("Com_bine with "
-                                                   "existing mask"));
-        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.combine),
-                                     args->combine);
-        gtk_table_attach(GTK_TABLE(table), controls.combine,
-                         0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-        g_signal_connect(controls.combine, "toggled",
-                         G_CALLBACK(combine_changed), &controls);
-        row++;
-
-        controls.combine_type
-            = gwy_enum_combo_box_new(gwy_merge_type_get_enum(), -1,
-                                     G_CALLBACK(combine_type_changed),
-                                     &controls,
-                                     args->combine_type, TRUE);
-        gwy_table_attach_hscale(table, row, _("Operation:"), NULL,
-                                GTK_OBJECT(controls.combine_type),
-                                GWY_HSCALE_WIDGET);
-        gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+        create_mask_merge_buttons(table, row, NULL,
+                                  args->combine,
+                                  G_CALLBACK(combine_changed),
+                                  args->combine_type,
+                                  G_CALLBACK(combine_type_changed),
+                                  &controls,
+                                  &controls.combine, &controls.combine_type);
         row++;
     }
 
     controls.color_button = create_mask_color_button(controls.mydata, dialog,
                                                      0);
-    gwy_table_attach_hscale(table, row, _("_Mask color:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Mask color:"), NULL,
                             GTK_OBJECT(controls.color_button),
                             GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
@@ -410,15 +398,16 @@ threshold_changed(GtkAdjustment *adj, DisconnControls *controls)
 }
 
 static void
-combine_changed(GtkToggleButton *toggle, DisconnControls *controls)
+combine_changed(DisconnControls *controls, GtkToggleButton *toggle)
 {
     controls->args->combine = gtk_toggle_button_get_active(toggle);
 }
 
 static void
-combine_type_changed(GtkComboBox *combo, DisconnControls *controls)
+combine_type_changed(DisconnControls *controls)
 {
-    controls->args->combine_type = gwy_enum_combo_box_get_active(combo);
+    controls->args->combine_type
+        = gwy_radio_buttons_get_current(controls->combine_type);
 }
 
 /* Remove from mask pixels with values that do not belong to the largest
diff --git a/modules/process/mark_with.c b/modules/process/mark_with.c
index 30661fa..dfb084a 100644
--- a/modules/process/mark_with.c
+++ b/modules/process/mark_with.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: mark_with.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: mark_with.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2009 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -138,12 +138,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Creates or modifies a mask using other channels."),
     "Yeti <yeti at gwyddion.net>",
-    "1.4",
+    "1.5",
     "David Nečas (Yeti)",
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, mark_with)
 
 static gboolean
 module_register(void)
@@ -180,11 +180,12 @@ static void
 mark_dialog(MarkArgs *args,
             GQuark mquark)
 {
-    GtkWidget *dialog, *hbox, *vbox, *label, *vbox2;
+    GtkWidget *dialog, *hbox, *vbox, *label, *vbox2, *hbox2;
     GtkTable *table;
     MarkControls controls;
     GwyContainer *data;
     GwyDataField *dfield;
+    GtkSizeGroup *combosizes;
     GSList *l;
     gint response, row;
     guint i;
@@ -220,7 +221,7 @@ mark_dialog(MarkArgs *args,
     gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
 
     /* Controls */
-    table = GTK_TABLE(gtk_table_new(13, 4, FALSE));
+    table = GTK_TABLE(gtk_table_new(13, 3, FALSE));
     gtk_table_set_row_spacings(table, 2);
     gtk_table_set_col_spacings(table, 6);
     gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(table), FALSE, TRUE, 0);
@@ -240,7 +241,7 @@ mark_dialog(MarkArgs *args,
                                     _("_Subtract mask"), MASK_EDIT_REMOVE,
                                     _("_Intersect masks"), MASK_EDIT_INTERSECT,
                                     NULL);
-    row = gwy_radio_buttons_attach_to_table(controls.operation, table, 3, row);
+    row = gwy_radio_buttons_attach_to_table(controls.operation, table, 2, row);
     gtk_table_set_row_spacing(table, row-1, 8);
 
     /* Mark with */
@@ -259,11 +260,13 @@ mark_dialog(MarkArgs *args,
                                     gwy_sgettext("with|_Presentation"),
                                     MARK_WITH_SHOW,
                                     NULL);
+    combosizes = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
     for (l = controls.mark_with; l; l = g_slist_next(l)) {
         GwyDataChooser *chooser;
 
-        gtk_table_attach(table, GTK_WIDGET(l->data),
-                         0, 1, row, row+1, GTK_FILL, 0, 0, 0);
+        hbox2 = gtk_hbox_new(FALSE, 6);
+        gtk_table_attach(table, hbox2, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+        gtk_box_pack_start(GTK_BOX(hbox2), GTK_WIDGET(l->data), FALSE, TRUE, 0);
         i = gwy_radio_button_get_value(GTK_WIDGET(l->data));
         controls.channels[i] = gwy_data_chooser_new_channels();
         chooser = GWY_DATA_CHOOSER(controls.channels[i]);
@@ -278,28 +281,29 @@ mark_dialog(MarkArgs *args,
         else
             gwy_data_chooser_set_filter(chooser, &show_attach_filter,
                                         &args->target, NULL);
-        gtk_table_attach(table, controls.channels[i],
-                         1, 3, row, row+1, GTK_FILL, 0, 0, 0);
+        gtk_box_pack_end(GTK_BOX(hbox2), controls.channels[i], FALSE, TRUE, 0);
+        gtk_size_group_add_widget(combosizes, controls.channels[i]);
         controls.has_any[i] = !!gwy_data_chooser_get_active(chooser, NULL);
-        gtk_widget_set_sensitive(GTK_WIDGET(l->data), controls.has_any[i]);
+        gtk_widget_set_sensitive(hbox2, controls.has_any[i]);
         gwy_data_chooser_get_active_id(chooser, args->source + i);
         g_signal_connect(chooser, "changed",
                          G_CALLBACK(channel_changed), &controls);
         row++;
     }
+    g_object_unref(combosizes);
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
 
     /* Range */
     label = gtk_label_new(_("Marked data range:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, label, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     /* Minimum */
     controls.min = GTK_ADJUSTMENT(gtk_adjustment_new(100.0*args->min,
                                                      0.0, 100.0, 0.01, 1.0, 0));
-    gwy_table_attach_hscale(GTK_WIDGET(table), row, _("_Minimum:"), "%",
-                            GTK_OBJECT(controls.min), 0);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row, _("_Minimum:"), "%",
+                            GTK_OBJECT(controls.min), GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls.min, "value-changed",
                              G_CALLBACK(min_changed), &controls);
     row++;
@@ -307,8 +311,8 @@ mark_dialog(MarkArgs *args,
     /* Maximum */
     controls.max = GTK_ADJUSTMENT(gtk_adjustment_new(100.0*args->max,
                                                      0.0, 100.0, 0.01, 1.0, 0));
-    gwy_table_attach_hscale(GTK_WIDGET(table), row, _("M_aximum:"), "%",
-                            GTK_OBJECT(controls.max), 0);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row, _("M_aximum:"), "%",
+                            GTK_OBJECT(controls.max), GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls.max, "value-changed",
                              G_CALLBACK(max_changed), &controls);
     gtk_table_set_row_spacing(table, row, 8);
diff --git a/modules/process/mask_distribute.c b/modules/process/mask_distribute.c
index 6ad8864..7c07b49 100644
--- a/modules/process/mask_distribute.c
+++ b/modules/process/mask_distribute.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: mask_distribute.c 18626 2016-04-22 10:15:13Z yeti-dn $
+ *  @(#) $Id: mask_distribute.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -91,7 +91,7 @@ static GwyModuleInfo module_info = {
     "2015",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, mask_distribute)
 
 static gboolean
 module_register(void)
@@ -165,7 +165,7 @@ mask_distrib_dialog(MaskDistribArgs *args)
 
     label = gwy_label_new_header(_("Distribute to:"));
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.mode = gwy_radio_buttons_create(modes, G_N_ELEMENTS(modes),
@@ -180,7 +180,7 @@ mask_distrib_dialog(MaskDistribArgs *args)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.keep_existing),
                                  args->keep_existing);
     gtk_table_attach(GTK_TABLE(table), controls.keep_existing,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls.keep_existing, "toggled",
                      G_CALLBACK(keep_existing_changed), &controls);
     row++;
diff --git a/modules/process/mask_edt.c b/modules/process/mask_edt.c
index bd0ac1e..803cbf1 100644
--- a/modules/process/mask_edt.c
+++ b/modules/process/mask_edt.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: mask_edt.c 18960 2016-09-15 21:32:48Z yeti-dn $
+ *  @(#) $Id: mask_edt.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014-2015 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -43,11 +43,6 @@ typedef enum {
 } MaskEdtType;
 
 typedef struct {
-    gdouble dist, ndist;
-    gint j, i;
-} ThinCandidate;
-
-typedef struct {
     MaskEdtType mask_type;
     GwyDistanceTransformType dist_type;
     gboolean from_border;
@@ -64,7 +59,6 @@ typedef struct {
 static gboolean      module_register              (void);
 static void          mask_thin                    (GwyContainer *data,
                                                    GwyRunType run);
-static void          thin_mask                    (GwyDataField *mask);
 static void          mask_edt                     (GwyContainer *data,
                                                    GwyRunType run);
 static gboolean      maskedt_dialog               (MaskEdtArgs *args);
@@ -94,12 +88,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Performs simple and true Euclidean distance transforms of masks."),
     "Yeti <yeti at gwyddion.net>",
-    "2.1",
+    "2.2",
     "David Nečas (Yeti)",
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, mask_edt)
 
 static gboolean
 module_register(void)
@@ -137,171 +131,11 @@ mask_thin(GwyContainer *data, GwyRunType run)
     g_return_if_fail(mfield);
 
     gwy_app_undo_qcheckpointv(data, 1, &quark);
-    thin_mask(mfield);
+    gwy_data_field_grains_thin(mfield);
     gwy_data_field_data_changed(mfield);
     gwy_app_channel_log_add_proc(data, id, id);
 }
 
-static gint
-compare_candidate(gconstpointer pa, gconstpointer pb)
-{
-    const ThinCandidate *a = (const ThinCandidate*)pa;
-    const ThinCandidate *b = (const ThinCandidate*)pb;
-
-    /* Take pixels with lowest Euclidean distances first. */
-    if (a->dist < b->dist)
-        return -1;
-    if (a->dist > b->dist)
-        return 1;
-
-    /* If equal, take pixels with largest Euclidean distance *of their
-     * neighbours* first.  This essentially mean flat edges go before corners,
-     * preserving useful branches. */
-    if (a->ndist > b->ndist)
-        return -1;
-    if (a->ndist < b->ndist)
-        return 1;
-
-    /* When desperate, sort bottom and right coordinates first so that we try
-     * to remove them first.  Anyway we must impose some rule to make the
-     * sort stable. */
-    if (a->i > b->i)
-        return -1;
-    if (a->i < b->i)
-        return 1;
-    if (a->j > b->j)
-        return -1;
-    if (a->j < b->j)
-        return 1;
-
-    return 0;
-}
-
-static void
-thin_mask(GwyDataField *mask)
-{
-    /* TRUE means removing the central pixel in a 3x3 pixel configuration does
-     * not break any currently connected parts. */
-    static const gboolean ok_to_remove[0x100] = {
-        TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
-        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  TRUE,  TRUE,
-        TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
-        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  TRUE,  TRUE,
-        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  FALSE, FALSE,
-        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
-        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  FALSE, FALSE,
-        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  TRUE,  TRUE,
-        TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
-        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  TRUE,  TRUE,
-        TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
-        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  TRUE,  TRUE,
-        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  FALSE, FALSE,
-        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
-        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  FALSE, FALSE,
-        TRUE,  TRUE,  FALSE, FALSE, TRUE,  TRUE,  TRUE,  TRUE,
-        TRUE,  TRUE,  FALSE, TRUE,  TRUE,  TRUE,  FALSE, TRUE,
-        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
-        TRUE,  TRUE,  FALSE, TRUE,  TRUE,  TRUE,  FALSE, TRUE,
-        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
-        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
-        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
-        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
-        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
-        TRUE,  TRUE,  FALSE, TRUE,  TRUE,  TRUE,  FALSE, TRUE,
-        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
-        TRUE,  TRUE,  FALSE, TRUE,  TRUE,  TRUE,  FALSE, TRUE,
-        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
-        TRUE,  TRUE,  FALSE, TRUE,  TRUE,  TRUE,  FALSE, TRUE,
-        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
-        TRUE,  TRUE,  FALSE, TRUE,  TRUE,  TRUE,  FALSE, TRUE,
-        TRUE,  TRUE,  FALSE, TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
-    };
-
-    GwyDataField *dfield;
-    gint i, j, k, xres = mask->xres, yres = mask->yres, ncand;
-    gdouble *d, *m;
-    ThinCandidate *candidates;
-
-    dfield = gwy_data_field_duplicate(mask);
-    gwy_data_field_copy(mask, dfield, FALSE);
-    gwy_data_field_grain_distance_transform(dfield);
-    d = gwy_data_field_get_data(dfield);
-    m = gwy_data_field_get_data(mask);
-
-    ncand = 0;
-    for (k = 0; k < xres*yres; k++) {
-        if (d[k] > 0.0)
-            ncand++;
-    }
-
-    candidates = g_new(ThinCandidate, ncand);
-    k = 0;
-    for (i = 0; i < yres; i++) {
-        for (j = 0; j < xres; j++) {
-            if (d[i*xres + j] > 0.0) {
-                gdouble ndist = 0.0;
-                candidates[k].i = i;
-                candidates[k].j = j;
-                candidates[k].dist = d[i*xres + j];
-
-                if (i && j)
-                   ndist += d[(i-1)*xres + (j-1)];
-                if (i)
-                   ndist += d[(i-1)*xres + j];
-                if (i && j < xres-1)
-                    ndist += d[(i-1)*xres + (j+1)];
-                if (j < xres-1)
-                    ndist += d[i*xres + (j+1)];
-                if (i < yres-1 && j < xres-1)
-                    ndist += d[(i+1)*xres + (j+1)];
-                if (i < yres-1)
-                    ndist += d[(i+1)*xres + j];
-                if (i < yres-1 && j)
-                    ndist += d[(i+1)*xres + (j-1)];
-                if (j)
-                   ndist += d[i*xres + (j-1)];
-
-                candidates[k].ndist = ndist;
-                k++;
-            }
-        }
-    }
-    g_assert(k == ncand);
-
-    qsort(candidates, ncand, sizeof(ThinCandidate), &compare_candidate);
-
-    for (k = 0; k < ncand; k++) {
-        guint b = 0;
-
-        i = candidates[k].i;
-        j = candidates[k].j;
-        if (i && j && d[(i-1)*xres + (j-1)] > 0.0)
-            b |= 1;
-        if (i && d[(i-1)*xres + j] > 0.0)
-            b |= 2;
-        if (i && j < xres-1 && d[(i-1)*xres + (j+1)] > 0.0)
-            b |= 4;
-        if (j < xres-1 && d[i*xres + (j+1)] > 0.0)
-            b |= 8;
-        if (i < yres-1 && j < xres-1 && d[(i+1)*xres + (j+1)] > 0.0)
-            b |= 16;
-        if (i < yres-1 && d[(i+1)*xres + j] > 0.0)
-            b |= 32;
-        if (i < yres-1 && j && d[(i+1)*xres + (j-1)] > 0.0)
-            b |= 64;
-        if (j && d[i*xres + (j-1)] > 0.0)
-            b |= 128;
-
-        if (ok_to_remove[b]) {
-            d[i*xres + j] = 0.0;
-            m[i*xres + j] = 0.0;
-        }
-    }
-
-    g_free(candidates);
-    g_object_unref(dfield);
-}
-
 static void
 mask_edt(GwyContainer *data, GwyRunType run)
 {
@@ -360,7 +194,7 @@ maskedt_dialog(MaskEdtArgs *args)
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
     controls.dialog = dialog;
 
-    table = gtk_table_new(6, 4, FALSE);
+    table = gtk_table_new(6, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -370,14 +204,14 @@ maskedt_dialog(MaskEdtArgs *args)
         = gwy_enum_combo_box_new(gwy_distance_transform_type_get_enum(), -1,
                                  G_CALLBACK(dist_type_changed), &controls,
                                   args->dist_type, TRUE);
-    gwy_table_attach_hscale(table, row++, _("_Distance type:"), NULL,
+    gwy_table_attach_adjbar(table, row++, _("_Distance type:"), NULL,
                             GTK_OBJECT(controls.dist_type),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
 
     label = gtk_label_new(_("Output type:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.mask_type = gwy_radio_buttons_create(mask_types,
@@ -387,15 +221,15 @@ maskedt_dialog(MaskEdtArgs *args)
                                                   args->mask_type);
     row = gwy_radio_buttons_attach_to_table(controls.mask_type,
                                             GTK_TABLE(table),
-                                            3, row);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+                                            2, row);
 
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     controls.from_border
         = gtk_check_button_new_with_mnemonic(_("Shrink from _border"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.from_border),
                                  args->from_border);
     gtk_table_attach(GTK_TABLE(table), controls.from_border,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls.from_border, "toggled",
                      G_CALLBACK(from_border_changed), &controls);
     row++;
diff --git a/modules/process/mask_morph.c b/modules/process/mask_morph.c
index 9ce8ad5..495ba84 100644
--- a/modules/process/mask_morph.c
+++ b/modules/process/mask_morph.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: mask_morph.c 18626 2016-04-22 10:15:13Z yeti-dn $
+ *  @(#) $Id: mask_morph.c 20105 2017-07-29 09:24:09Z yeti-dn $
  *  Copyright (C) 2015 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -35,7 +35,6 @@
 #include <app/gwymoduleutils.h>
 
 #define MASKMORPH_RUN_MODES (GWY_RUN_IMMEDIATE | GWY_RUN_INTERACTIVE)
-#define MASKTHIN_RUN_MODES GWY_RUN_IMMEDIATE
 
 typedef enum {
     MASKMORPH_EROSION     = 0,
@@ -116,19 +115,19 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Performs basic morphological operations with masks."),
     "Yeti <yeti at gwyddion.net>",
-    "1.0",
+    "1.1",
     "David Nečas (Yeti)",
     "2015",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, mask_morph)
 
 static gboolean
 module_register(void)
 {
     gwy_process_func_register("mask_morph",
                               (GwyProcessFunc)&mask_morph,
-                              N_("/_Mask/Morphological Operation..."),
+                              N_("/_Mask/Morpho_logical Operation..."),
                               GWY_STOCK_MASK_MORPH,
                               MASKMORPH_RUN_MODES,
                               GWY_MENU_FLAG_DATA_MASK | GWY_MENU_FLAG_DATA,
@@ -201,7 +200,7 @@ maskmorph_dialog(MaskMorphArgs *args, GwyDataField *mask)
     controls.dialog = dialog;
 
     table = gtk_table_new(MASKMORPH_NOPERATIONS + MASKMORPH_NSHAPES + 5,
-                          4, FALSE);
+                          3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -210,7 +209,7 @@ maskmorph_dialog(MaskMorphArgs *args, GwyDataField *mask)
     label = gtk_label_new(_("Operation:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.mode
@@ -218,13 +217,13 @@ maskmorph_dialog(MaskMorphArgs *args, GwyDataField *mask)
                                    G_CALLBACK(mode_changed), &controls,
                                    args->mode);
     row = gwy_radio_buttons_attach_to_table(controls.mode, GTK_TABLE(table),
-                                            3, row);
+                                            2, row);
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gtk_label_new(_("Structuring element:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.shape
@@ -232,11 +231,11 @@ maskmorph_dialog(MaskMorphArgs *args, GwyDataField *mask)
                                    G_CALLBACK(shape_changed), &controls,
                                    args->shape);
     row = gwy_radio_buttons_attach_to_table(controls.shape, GTK_TABLE(table),
-                                            3, row);
+                                            2, row);
 
     controls.radius = gtk_adjustment_new(args->radius, 1, 1025, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("_Radius:"), "px", controls.radius,
-                            GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(table, row, _("_Radius:"), _("px"),
+                            controls.radius, GWY_HSCALE_SQRT);
     g_signal_connect(controls.radius, "value-changed",
                      G_CALLBACK(radius_changed), &controls);
     row++;
@@ -246,8 +245,9 @@ maskmorph_dialog(MaskMorphArgs *args, GwyDataField *mask)
                                    &args->kernel);
     gwy_data_chooser_set_filter(GWY_DATA_CHOOSER(controls.kernel),
                                 &kernel_filter, mask, NULL);
-    gwy_table_attach_hscale(table, row, _("_Mask:"), NULL,
-                            GTK_OBJECT(controls.kernel), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("_Mask:"), NULL,
+                            GTK_OBJECT(controls.kernel),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     has_kernel = gwy_data_chooser_get_active_id(GWY_DATA_CHOOSER(controls.kernel),
                                                 &args->kernel);
     g_signal_connect(controls.kernel, "changed",
@@ -259,7 +259,7 @@ maskmorph_dialog(MaskMorphArgs *args, GwyDataField *mask)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.crop_kernel),
                                  args->crop_kernel);
     gtk_table_attach(GTK_TABLE(table), controls.crop_kernel,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls.crop_kernel, "toggled",
                      G_CALLBACK(crop_kernel_changed), &controls);
 
diff --git a/modules/process/mask_noisify.c b/modules/process/mask_noisify.c
new file mode 100644
index 0000000..dd6b58c
--- /dev/null
+++ b/modules/process/mask_noisify.c
@@ -0,0 +1,333 @@
+/*
+ *  @(#) $Id: mask_noisify.c 20104 2017-07-29 09:23:41Z yeti-dn $
+ *  Copyright (C) 2017 David Necas (Yeti).
+ *  E-mail: yeti at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <stdlib.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwyrandgenset.h>
+#include <libprocess/grains.h>
+#include <libgwydgets/gwyradiobuttons.h>
+#include <libgwydgets/gwystock.h>
+#include <libgwydgets/gwydgetutils.h>
+#include <libgwymodule/gwymodule-process.h>
+#include <app/gwyapp.h>
+
+#define NOSIFYMASK_RUN_MODES (GWY_RUN_IMMEDIATE | GWY_RUN_INTERACTIVE)
+
+typedef enum {
+    NOISE_DIRECTION_BOTH = 0,
+    NOISE_DIRECTION_UP   = 1,
+    NOISE_DIRECTION_DOWN = 2,
+    NOISE_DIRECTION_NTYPES
+} NoiseDirectionType;
+
+typedef struct {
+    NoiseDirectionType direction;
+    gdouble density;
+    gboolean only_boundaries;
+} MaskNoiseArgs;
+
+typedef struct {
+    MaskNoiseArgs *args;
+    GtkWidget *dialog;
+    GSList *direction;
+    GtkObject *density;
+    GtkWidget *only_boundaries;
+} MaskNoiseControls;
+
+static gboolean module_register        (void);
+static void     mask_noisify           (GwyContainer *data,
+                                        GwyRunType run);
+static gboolean masknoise_dialog       (MaskNoiseArgs *args);
+static void     direction_type_changed (GtkWidget *button,
+                                        MaskNoiseControls *controls);
+static void     density_changed        (GtkAdjustment *adj,
+                                        MaskNoiseControls *controls);
+static void     only_boundaries_changed(GtkToggleButton *toggle,
+                                        MaskNoiseControls *controls);
+static void     masknoise_do           (GwyDataField *mfield,
+                                        MaskNoiseArgs *args);
+static void     masknoise_sanitize_args(MaskNoiseArgs *args);
+static void     masknoise_load_args    (GwyContainer *settings,
+                                        MaskNoiseArgs *args);
+static void     masknoise_save_args    (GwyContainer *settings,
+                                        MaskNoiseArgs *args);
+
+static const MaskNoiseArgs masknoise_defaults = {
+    NOISE_DIRECTION_BOTH,
+    0.1,
+    FALSE,
+};
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION,
+    &module_register,
+    N_("Adds salt and/or pepper noise to mask."),
+    "Yeti <yeti at gwyddion.net>",
+    "1.0",
+    "David Nečas (Yeti)",
+    "2017",
+};
+
+GWY_MODULE_QUERY2(module_info, mask_noisify)
+
+static gboolean
+module_register(void)
+{
+    gwy_process_func_register("mask_noisify",
+                              (GwyProcessFunc)&mask_noisify,
+                              N_("/_Mask/_Noisify..."),
+                              NULL,
+                              NOSIFYMASK_RUN_MODES,
+                              GWY_MENU_FLAG_DATA_MASK | GWY_MENU_FLAG_DATA,
+                              N_("Add noise to mask"));
+
+    return TRUE;
+}
+
+static void
+mask_noisify(GwyContainer *data, GwyRunType run)
+{
+    GwyDataField *mfield;
+    MaskNoiseArgs args;
+    GQuark quark;
+    gint id;
+
+    g_return_if_fail(run & NOSIFYMASK_RUN_MODES);
+    gwy_app_data_browser_get_current(GWY_APP_MASK_FIELD, &mfield,
+                                     GWY_APP_MASK_FIELD_KEY, &quark,
+                                     GWY_APP_DATA_FIELD_ID, &id,
+                                     0);
+    g_return_if_fail(mfield);
+
+    masknoise_load_args(gwy_app_settings_get(), &args);
+    if (run == GWY_RUN_IMMEDIATE || masknoise_dialog(&args)) {
+        gwy_app_undo_qcheckpointv(data, 1, &quark);
+        masknoise_do(mfield, &args);
+        gwy_data_field_data_changed(mfield);
+        gwy_app_channel_log_add_proc(data, id, id);
+    }
+    masknoise_save_args(gwy_app_settings_get(), &args);
+}
+
+static gboolean
+masknoise_dialog(MaskNoiseArgs *args)
+{
+    MaskNoiseControls controls;
+    GtkWidget *dialog;
+    GtkWidget *table, *label;
+    gint response, row = 0;
+
+    controls.args = args;
+
+    dialog = gtk_dialog_new_with_buttons(_("Noisify Mask"),
+                                         NULL, 0,
+                                         GTK_STOCK_CANCEL,
+                                         GTK_RESPONSE_CANCEL,
+                                         GTK_STOCK_OK,
+                                         GTK_RESPONSE_OK,
+                                         NULL);
+    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
+    gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
+    controls.dialog = dialog;
+
+    table = gtk_table_new(NOISE_DIRECTION_NTYPES + 3, 3, FALSE);
+    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
+    gtk_table_set_col_spacings(GTK_TABLE(table), 6);
+    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
+    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table, TRUE, TRUE, 0);
+
+    label = gtk_label_new(_("Noise type:"));
+    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+    gtk_table_attach(GTK_TABLE(table), label,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    row++;
+
+    controls.direction
+        = gwy_radio_buttons_createl(G_CALLBACK(direction_type_changed),
+                                    &controls, args->direction,
+                                    _("S_ymmetrical"), NOISE_DIRECTION_BOTH,
+                                    _("One-sided _positive"), NOISE_DIRECTION_UP,
+                                    _("One-sided _negative"), NOISE_DIRECTION_DOWN,
+                                    NULL);
+    row = gwy_radio_buttons_attach_to_table(controls.direction,
+                                            GTK_TABLE(table), 2, row);
+
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    controls.density = gtk_adjustment_new(args->density, 0.0, 1.0, 0.0001, 0.1,
+                                          0);
+    gwy_table_attach_adjbar(table, row, _("Densi_ty:"), NULL,
+                            controls.density, GWY_HSCALE_SQRT);
+    g_signal_connect(controls.density, "value-changed",
+                     G_CALLBACK(density_changed), &controls);
+    row++;
+
+    controls.only_boundaries
+        = gtk_check_button_new_with_mnemonic(_("_Alter only boundaries"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.only_boundaries),
+                                 args->only_boundaries);
+    gtk_table_attach(GTK_TABLE(table), controls.only_boundaries,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    g_signal_connect(controls.only_boundaries, "toggled",
+                     G_CALLBACK(only_boundaries_changed), &controls);
+
+    gtk_widget_show_all(dialog);
+
+    do {
+        response = gtk_dialog_run(GTK_DIALOG(dialog));
+        switch (response) {
+            case GTK_RESPONSE_CANCEL:
+            case GTK_RESPONSE_DELETE_EVENT:
+            gtk_widget_destroy(dialog);
+            case GTK_RESPONSE_NONE:
+            return FALSE;
+            break;
+
+            case GTK_RESPONSE_OK:
+            break;
+
+            default:
+            g_assert_not_reached();
+            break;
+        }
+    } while (response != GTK_RESPONSE_OK);
+
+    gtk_widget_destroy(dialog);
+
+    return TRUE;
+}
+
+static void
+direction_type_changed(GtkWidget *button, MaskNoiseControls *controls)
+{
+    controls->args->direction = gwy_radio_button_get_value(button);
+}
+
+static void
+density_changed(GtkAdjustment *adj, MaskNoiseControls *controls)
+{
+    controls->args->density = gtk_adjustment_get_value(adj);
+}
+
+static void
+only_boundaries_changed(GtkToggleButton *toggle, MaskNoiseControls *controls)
+{
+    controls->args->only_boundaries = gtk_toggle_button_get_active(toggle);
+}
+
+static void
+masknoise_do(GwyDataField *mask, MaskNoiseArgs *args)
+{
+    GwyRandGenSet *rngset = gwy_rand_gen_set_new(1);
+    NoiseDirectionType direction = args->direction;
+    gboolean only_boundaries = args->only_boundaries, on_boundary;
+    guint xres, yres, iter, i, j, n, nind, k, have_bits = 0;
+    gint is_m, change_to;
+    guint *indices;
+    gdouble *m;
+    guint32 r;
+
+    xres = gwy_data_field_get_xres(mask);
+    yres = gwy_data_field_get_yres(mask);
+    n = xres*yres;
+    nind = GWY_ROUND(n*args->density);
+    indices = gwy_rand_gen_set_choose_shuffle(rngset, 0, n, nind);
+    m = gwy_data_field_get_data(mask);
+
+    for (iter = 0; iter < nind; iter++) {
+        k = indices[iter];
+
+        /* No-ops. */
+        is_m = (m[k] > 0.0);
+        if (direction == NOISE_DIRECTION_UP)
+            change_to = 1;
+        else if (direction == NOISE_DIRECTION_DOWN)
+            change_to = 0;
+        else {
+            if (!have_bits) {
+                r = gwy_rand_gen_set_int(rngset, 0);
+                have_bits = 32;
+            }
+            change_to = (r & 1);
+            have_bits--;
+        }
+        if (!change_to == !is_m)
+            continue;
+
+        /* Are we on a boundary?  This cannot be pre-determined because we
+         * allow progressive boundary alteration. */
+        if (only_boundaries) {
+            on_boundary = FALSE;
+            i = k/xres;
+            j = k % xres;
+            if (!on_boundary && i > 0 && !is_m == !(m[k-xres] <= 0.0))
+                on_boundary = TRUE;
+            if (!on_boundary && j > 0 && !is_m == !(m[k-1] <= 0.0))
+                on_boundary = TRUE;
+            if (!on_boundary && j < xres-1 && !is_m == !(m[k+1] <= 0.0))
+                on_boundary = TRUE;
+            if (!on_boundary && i < yres-1 && !is_m == !(m[k+xres] <= 0.0))
+                on_boundary = TRUE;
+            if (!on_boundary)
+                continue;
+        }
+
+        m[k] = change_to;
+    }
+
+    g_free(indices);
+}
+
+static const gchar density_key[]         = "/module/mask_noisify/density";
+static const gchar direction_key[]       = "/module/mask_noisify/direction";
+static const gchar only_boundaries_key[] = "/module/mask_noisify/only_boundaries";
+
+static void
+masknoise_sanitize_args(MaskNoiseArgs *args)
+{
+    args->direction = MIN(args->direction, NOISE_DIRECTION_NTYPES-1);
+    args->density = CLAMP(args->density, 0.0, 1.0);
+    args->only_boundaries = !!args->only_boundaries;
+}
+
+static void
+masknoise_load_args(GwyContainer *settings,
+                    MaskNoiseArgs *args)
+{
+    *args = masknoise_defaults;
+    gwy_container_gis_enum_by_name(settings, direction_key, &args->direction);
+    gwy_container_gis_double_by_name(settings, density_key, &args->density);
+    gwy_container_gis_boolean_by_name(settings, only_boundaries_key,
+                                      &args->only_boundaries);
+    masknoise_sanitize_args(args);
+}
+
+static void
+masknoise_save_args(GwyContainer *settings,
+                    MaskNoiseArgs *args)
+{
+    gwy_container_set_enum_by_name(settings, direction_key, args->direction);
+    gwy_container_set_double_by_name(settings, density_key, args->density);
+    gwy_container_set_boolean_by_name(settings, only_boundaries_key,
+                                      args->only_boundaries);
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/process/maskcor.c b/modules/process/maskcor.c
index ec22d07..c6c8f83 100644
--- a/modules/process/maskcor.c
+++ b/modules/process/maskcor.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: maskcor.c 18665 2016-04-26 20:42:48Z yeti-dn $
+ *  @(#) $Id: maskcor.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -27,6 +27,7 @@
 #include <libprocess/filters.h>
 #include <libgwydgets/gwydgetutils.h>
 #include <libgwydgets/gwycombobox.h>
+#include <libgwydgets/gwystock.h>
 #include <libgwymodule/gwymodule-process.h>
 #include <app/gwymoduleutils.h>
 #include <app/gwyapp.h>
@@ -85,12 +86,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Creates mask by correlation with another data."),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "1.8",
+    "1.9",
     "David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, maskcor)
 
 static gboolean
 module_register(void)
@@ -98,7 +99,7 @@ module_register(void)
     gwy_process_func_register("maskcor",
                               (GwyProcessFunc)&maskcor,
                               N_("/M_ultidata/_Mask by Correlation..."),
-                              NULL,
+                              GWY_STOCK_CORRELATION_MASK,
                               MASKCOR_RUN_MODES,
                               GWY_MENU_FLAG_DATA,
                               N_("Create mask by correlation with another "
@@ -145,7 +146,7 @@ maskcor_dialog(MaskcorArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(5, 4, FALSE);
+    table = gtk_table_new(5, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -162,8 +163,8 @@ maskcor_dialog(MaskcorArgs *args)
     gwy_data_chooser_get_active_id(GWY_DATA_CHOOSER(chooser), &args->kernel);
     g_signal_connect(chooser, "changed",
                      G_CALLBACK(maskcor_kernel_changed), &args->kernel);
-    gwy_table_attach_hscale(table, row, _("Correlation _kernel:"), NULL,
-                            GTK_OBJECT(chooser), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("Correlation _kernel:"), NULL,
+                            GTK_OBJECT(chooser), GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     /* Result */
@@ -173,19 +174,22 @@ maskcor_dialog(MaskcorArgs *args)
                                     _("Correlation maxima"), GWY_MASKCOR_MAXIMA,
                                     _("Correlation score"), GWY_MASKCOR_SCORE,
                                     NULL);
-    gwy_table_attach_row(table, row, _("Output _type:"), NULL, combo);
+    gwy_table_attach_adjbar(table, row, _("Output _type:"), NULL,
+                            GTK_OBJECT(combo), GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     /* Parameters */
     method = gwy_enum_combo_box_new(gwy_correlation_type_get_enum(), -1,
                                     G_CALLBACK(gwy_enum_combo_box_update_int),
                                     &args->method, args->method, TRUE);
-    gwy_table_attach_row(table, row, _("Correlation _method:"), NULL, method);
+    gwy_table_attach_adjbar(table, row, _("Correlation _method:"), NULL,
+                            GTK_OBJECT(method), GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     adj = gtk_adjustment_new(args->threshold, -1.0, 1.0, 0.01, 0.1, 0);
     controls.threshold = adj;
-    spin = gwy_table_attach_hscale(table, row, _("T_hreshold:"), NULL, adj, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("T_hreshold:"), NULL,
+                                   adj, GWY_HSCALE_LINEAR);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
     gwy_table_hscale_set_sensitive(adj, args->result != GWY_MASKCOR_SCORE);
     g_signal_connect(adj, "value-changed",
diff --git a/modules/process/maskops.c b/modules/process/maskops.c
index 462e749..eb5bfdd 100644
--- a/modules/process/maskops.c
+++ b/modules/process/maskops.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: maskops.c 18960 2016-09-15 21:32:48Z yeti-dn $
+ *  @(#) $Id: maskops.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -50,7 +50,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, maskops)
 
 static gboolean
 module_register(void)
@@ -75,7 +75,7 @@ module_register(void)
                               GWY_STOCK_MASK_EXTRACT,
                               MASKOPS_RUN_MODES,
                               GWY_MENU_FLAG_DATA_MASK | GWY_MENU_FLAG_DATA,
-                              N_("Extract mask to a new channel"));
+                              N_("Extract mask to a new image"));
     gwy_process_func_register("grain_rem_touching",
                               (GwyProcessFunc)&remove_touching,
                               N_("/_Grains/_Remove Edge-Touching"),
diff --git a/modules/process/mcrop.c b/modules/process/mcrop.c
index f1b7079..65c4eb2 100644
--- a/modules/process/mcrop.c
+++ b/modules/process/mcrop.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: mcrop.c 18960 2016-09-15 21:32:48Z yeti-dn $
+ *  @(#) $Id: mcrop.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2010, David Necas (Yeti), Petr Klapetek, Daniil Bratashov
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, dn2010 at gmail.com
  *
@@ -64,7 +64,7 @@ static GwyModuleInfo module_info = {
     "2010",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, mcrop)
 
 static gboolean
 module_register(void)
@@ -168,11 +168,10 @@ static gboolean mcrop_dialog (GwyAppDataId *op1, GwyAppDataId *op2)
     g_object_set_data(G_OBJECT(chooser), "dialog", dialog);
     gwy_data_chooser_set_filter(GWY_DATA_CHOOSER(chooser),
                                 mcrop_data_filter, op1, NULL);
-    g_signal_connect(chooser, "changed",
-                     G_CALLBACK(mcrop_data_cb), op2);
+    g_signal_connect(chooser, "changed", G_CALLBACK(mcrop_data_cb), op2);
     mcrop_data_cb(GWY_DATA_CHOOSER(chooser), op2);
-    gwy_table_attach_hscale(table, 1, _("_Select second argument:"), NULL,
-                            GTK_OBJECT(chooser), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, 0, _("_Select second argument:"), NULL,
+                            GTK_OBJECT(chooser), GWY_HSCALE_WIDGET_NO_EXPAND);
 
     gtk_widget_show_all(dialog);
 
diff --git a/modules/process/measure_lattice.c b/modules/process/measure_lattice.c
index a25dbdb..ce34906 100644
--- a/modules/process/measure_lattice.c
+++ b/modules/process/measure_lattice.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: measure_lattice.c 19044 2016-10-08 19:10:46Z yeti-dn $
- *  Copyright (C) 2015 David Necas (Yeti).
+ *  @(#) $Id: measure_lattice.c 20136 2017-08-02 11:21:20Z yeti-dn $
+ *  Copyright (C) 2015-2017 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -31,6 +31,7 @@
 #include <libprocess/correct.h>
 #include <libprocess/filters.h>
 #include <libprocess/grains.h>
+#include <libprocess/elliptic.h>
 #include <libprocess/inttrans.h>
 #include <libgwydgets/gwydataview.h>
 #include <libgwydgets/gwylayer-basic.h>
@@ -66,19 +67,11 @@ typedef enum {
 } ZoomType;
 
 typedef struct {
-    gdouble max;
-    gdouble x;
-    gdouble y;
-    gdouble d;
-    gdouble q;
-    guint basecount;
-} MaximumInfo;
-
-typedef struct {
     ImageMode image_mode;
     SelectionMode selection_mode;
     ZoomType zoom_acf;
     ZoomType zoom_psdf;
+    gboolean fix_hacf;
     /* Cache */
     GType lattice_layer;
     GType point_layer;
@@ -98,6 +91,7 @@ typedef struct {
     GSList *zoom;
     GSList *image_mode;
     GSList *selection_mode;
+    GtkWidget *fix_hacf;
     GwySIValueFormat *vf;
     GwySIValueFormat *vfphi;
     GtkWidget *a1_x;
@@ -128,8 +122,8 @@ static void       lat_meas_copy         (LatMeasControls *controls);
 static void       lat_meas_save         (LatMeasControls *controls);
 static gchar*     format_report         (LatMeasControls *controls);
 static void       do_estimate           (LatMeasControls *controls);
+static void       refine                (LatMeasControls *controls);
 static void       init_selection        (LatMeasControls *controls);
-static gboolean   smart_init_selection  (LatMeasControls *controls);
 static void       set_selection         (LatMeasControls *controls,
                                          const gdouble *xy);
 static gboolean   get_selection         (LatMeasControls *controls,
@@ -140,18 +134,14 @@ static void       selection_mode_changed(GtkToggleButton *button,
                                          LatMeasControls *controls);
 static void       zoom_changed          (GtkRadioButton *button,
                                          LatMeasControls *controls);
+static void       fix_hacf_changed      (LatMeasControls *controls,
+                                         GtkToggleButton *toggle);
 static void       calculate_acf_full    (LatMeasControls *controls,
                                          GwyDataField *dfield);
 static void       calculate_psdf_full   (LatMeasControls *controls,
                                          GwyDataField *dfield);
 static void       calculate_zoomed_field(LatMeasControls *controls);
-static void       refine                (LatMeasControls *controls);
 static void       selection_changed     (LatMeasControls *controls);
-static void       find_maximum          (GwyDataField *dfield,
-                                         gdouble *x,
-                                         gdouble *y,
-                                         gint xwinsize,
-                                         gint ywinsize);
 static gboolean   transform_selection   (gdouble *xy);
 static void       invert_matrix         (gdouble *dest,
                                          const gdouble *src);
@@ -164,6 +154,7 @@ static void       sanitize_args         (LatMeasArgs *args);
 
 static const LatMeasArgs lat_meas_defaults = {
     IMAGE_DATA, SELECTION_LATTICE, ZOOM_1, ZOOM_1,
+    FALSE,
     /* Cache */
     0, 0, 0, 0,
 };
@@ -173,12 +164,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Measures parameters of two-dimensional lattices."),
     "Yeti <yeti at gwyddion.net>",
-    "1.0",
+    "2.0",
     "David Nečas (Yeti)",
     "2015",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, measure_lattice)
 
 static gboolean
 module_register(void)
@@ -236,7 +227,6 @@ lat_meas_dialog(LatMeasArgs *args,
     GwyPixmapLayer *layer;
     GwyVectorLayer *vlayer;
     GwySelection *selection;
-    GwySIUnit *unitphi;
     gchar selkey[40];
 
     gwy_clear(&controls, 1);
@@ -311,7 +301,7 @@ lat_meas_dialog(LatMeasArgs *args,
 
     gtk_container_add(GTK_CONTAINER(alignment), controls.view);
 
-    table = GTK_TABLE(gtk_table_new(10, 4, FALSE));
+    table = GTK_TABLE(gtk_table_new(11, 4, FALSE));
     gtk_table_set_row_spacings(table, 2);
     gtk_table_set_col_spacings(table, 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -335,7 +325,7 @@ lat_meas_dialog(LatMeasArgs *args,
 
     hbox2 = gtk_hbox_new(FALSE, 8);
     gtk_table_attach(GTK_TABLE(table), hbox2, 0, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     label = controls.zoom_label = gtk_label_new(_("Zoom:"));
     gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
 
@@ -352,6 +342,16 @@ lat_meas_dialog(LatMeasArgs *args,
     }
     row++;
 
+    controls.fix_hacf
+        = gtk_check_button_new_with_mnemonic(_("Interpolate _horizontal ACF"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.fix_hacf),
+                                 args->fix_hacf);
+    gtk_table_attach(table, controls.fix_hacf,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    g_signal_connect_swapped(controls.fix_hacf, "toggled",
+                             G_CALLBACK(fix_hacf_changed), &controls);
+    row++;
+
     gtk_table_set_row_spacing(table, row-1, 8);
     label = gtk_label_new(_("Show lattice as:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
@@ -378,16 +378,10 @@ lat_meas_dialog(LatMeasArgs *args,
                                              GWY_SI_UNIT_FORMAT_MARKUP, NULL);
     controls.vf->precision += 2;
 
-    unitphi = gwy_si_unit_new("deg");
-    controls.vfphi
-        = gwy_si_unit_get_format_with_resolution(unitphi,
-                                                 GWY_SI_UNIT_FORMAT_MARKUP,
-                                                 180.0, 0.01, NULL);
-    g_object_unref(unitphi);
+    controls.vfphi = gwy_si_unit_value_format_new(G_PI/180.0, 2, _("deg"));
 
     lattable = make_lattice_table(&controls);
-    gtk_table_attach(table, lattable,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, lattable, 0, 4, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     hbox = gtk_hbox_new(FALSE, 0);
@@ -407,9 +401,8 @@ lat_meas_dialog(LatMeasArgs *args,
         if (gwy_selection_get_object(selection, 0, controls.xy))
             set_selection(&controls, controls.xy);
     }
-    else {
+    else
         do_estimate(&controls);
-    }
 
     gwy_radio_buttons_set_current(controls.selection_mode, selection_mode);
     gwy_radio_buttons_set_current(controls.image_mode, image_mode);
@@ -646,7 +639,7 @@ format_report(LatMeasControls *controls)
                         vf->precision, h/vf->magnitude, vf->units);
         g_ptr_array_add(report, g_strdup(str->str));
 
-        phi = 180.0/G_PI*atan2(-xy[2*i + 1], xy[2*i + 0]);
+        phi = atan2(-xy[2*i + 1], xy[2*i + 0]);
         g_string_printf(str, _("Angle %d:"), i+1);
         g_ptr_array_add(report, g_strdup(str->str));
         g_string_printf(str, "%.*f %s",
@@ -660,7 +653,6 @@ format_report(LatMeasControls *controls)
     phi = atan2(-xy[3], xy[2]) - atan2(-xy[1], xy[0]);
     if (phi < 0.0)
         phi += 2.0*G_PI;
-    phi *= 180.0/G_PI;
 
     g_string_assign(str, _("Angle:"));
     g_ptr_array_add(report, g_strdup(str->str));
@@ -697,24 +689,53 @@ format_report(LatMeasControls *controls)
     return g_string_free(str, FALSE);
 }
 
+static GwyDataField*
+get_full_dfield_for_mode(LatMeasControls *controls)
+{
+    LatMeasArgs *args = controls->args;
+    GwyDataField *dfield;
+    GwyDataLine *hacf;
+    const gchar *key;
+
+    if (args->image_mode == IMAGE_PSDF)
+        key = "/3/data/full";
+    else
+        key = "/2/data/full";
+
+    dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata,
+                                                             key));
+
+    if (args->image_mode == IMAGE_ACF) {
+        if (args->fix_hacf)
+            key = "/2/hacf-fixed";
+        else
+            key = "/2/hacf";
+
+        hacf = GWY_DATA_LINE(gwy_container_get_object_by_name(controls->mydata,
+                                                              key));
+        gwy_data_field_set_row(dfield, hacf, gwy_data_field_get_yres(dfield)/2);
+    }
+
+    return dfield;
+}
+
 static void
 do_estimate(LatMeasControls *controls)
 {
-    if (smart_init_selection(controls)) {
-        GwyDataField *dfield;
-        gdouble dh;
+    GwyDataField *dfield;
+    gboolean ok;
 
-        refine(controls);
-        /* Check if refine() did not produce two of the same vector which can
-         * sometime happen with very skewed patterns. */
-        dfield = gwy_container_get_object_by_name(controls->mydata, "/0/data");
-        dh = hypot(gwy_data_field_get_xmeasure(dfield),
-                   gwy_data_field_get_ymeasure(dfield));
-        if (hypot(controls->xy[0] - controls->xy[2],
-                  controls->xy[1] - controls->xy[3]) > 1.8*dh)
-            return;
-    }
-    init_selection(controls);
+    dfield = get_full_dfield_for_mode(controls);
+    gwy_clear(controls->xy, 4);
+    if (controls->args->image_mode == IMAGE_PSDF)
+        ok = gwy_data_field_measure_lattice_psdf(dfield, controls->xy);
+    else
+        ok = gwy_data_field_measure_lattice_acf(dfield, controls->xy);
+
+    if (ok)
+        set_selection(controls, controls->xy);
+    else
+        init_selection(controls);
 }
 
 static void
@@ -730,207 +751,6 @@ init_selection(LatMeasControls *controls)
     set_selection(controls, controls->xy);
 }
 
-static gint
-compare_maxima(gconstpointer pa, gconstpointer pb)
-{
-    const MaximumInfo *a = (const MaximumInfo*)pa;
-    const MaximumInfo *b = (const MaximumInfo*)pb;
-
-    if (a->basecount*a->q > b->basecount*b->q)
-        return -1;
-    if (a->basecount*a->q < b->basecount*b->q)
-        return 1;
-
-    if (a->q > b->q)
-        return -1;
-    if (a->q < b->q)
-        return 1;
-
-    /* Ensure comparison stability.  This should play no role in significance
-     * sorting. */
-    if (a->y < b->y)
-        return -1;
-    if (a->y > b->y)
-        return 1;
-    if (a->x < b->x)
-        return -1;
-    if (a->x > b->x)
-        return 1;
-    return 0;
-}
-
-/* Intended for ACF (or PSDF, but that requires transformation), not the
- * original data. */
-static gboolean
-smart_init_selection(LatMeasControls *controls)
-{
-    enum { nquantities = 3 };
-    GwyGrainQuantity quantities[nquantities] = {
-        GWY_GRAIN_VALUE_MAXIMUM,
-        GWY_GRAIN_VALUE_CENTER_X,
-        GWY_GRAIN_VALUE_CENTER_Y,
-    };
-    GwyDataField *dfield, *smoothed, *mask;
-    gdouble *values[nquantities];
-    MaximumInfo *maxima;
-    gint *grains;
-    guint i, j, k, ngrains;
-    gboolean ok = FALSE;
-    gdouble dh, cphi, sphi;
-
-    dfield = gwy_container_get_object_by_name(controls->mydata, "/2/data/full");
-    smoothed = gwy_data_field_duplicate(dfield);
-    mask = gwy_data_field_new_alike(dfield, FALSE);
-
-    /* Mark local maxima. */
-    gwy_data_field_filter_gaussian(smoothed, 0.5);
-    gwy_data_field_mark_extrema(smoothed, mask, TRUE);
-    grains = g_new0(gint, dfield->xres*dfield->yres);
-    ngrains = gwy_data_field_number_grains(mask, grains);
-    GWY_OBJECT_UNREF(mask);
-
-    /* Find the position and value of each. */
-    for (i = 0; i < nquantities; i++)
-        values[i] = g_new(gdouble, ngrains+1);
-
-    gwy_data_field_grains_get_quantities(smoothed, values,
-                                         quantities, nquantities,
-                                         ngrains, grains);
-    GWY_OBJECT_UNREF(smoothed);
-
-    maxima = g_new(MaximumInfo, ngrains);
-    dh = hypot(gwy_data_field_get_xmeasure(dfield),
-               gwy_data_field_get_ymeasure(dfield));
-    for (i = 0; i < ngrains; i++) {
-        maxima[i].max = values[0][i+1];
-        maxima[i].x = values[1][i+1];
-        maxima[i].y = values[2][i+1];
-        maxima[i].d = hypot(maxima[i].x, maxima[i].y);
-        maxima[i].q = maxima[i].max/(maxima[i].d + 5.0*dh);
-        maxima[i].basecount = 0;
-    }
-    for (i = 0; i < nquantities; i++)
-        g_free(values[i]);
-
-    /* Remove the central peak, i.e. anything too close to the centre */
-    i = j = 0;
-    while (i < ngrains) {
-        gdouble d = maxima[i].d;
-        maxima[j] = maxima[i];
-        if (d >= 1.8*dh)
-            j++;
-        i++;
-    }
-    ngrains = j;
-
-    if (ngrains < 10) {
-        gwy_debug("Too few maxima (after centre removal): %d.", ngrains);
-        g_free(maxima);
-        return FALSE;
-    }
-
-    qsort(maxima, ngrains, sizeof(MaximumInfo), compare_maxima);
-#ifdef DEBUG
-    for (i = 0; i < ngrains; i++) {
-        gwy_debug("[%u] (%g, %g) %g :: %g",
-                  i, maxima[i].x, maxima[i].y, maxima[i].max, maxima[i].q);
-    }
-#endif
-
-    /* Remove anything with direction opposite to the first vector.  But we
-     * must carefully accept ortohogonal vectors.  This is just a half-plane
-     * selection though it influences the preferred vectors, of course. */
-    gwy_debug("Base-plane selector [%u] (%g, %g) %g",
-              0, maxima[0].x, maxima[0].y, maxima[0].max);
-    cphi = maxima[0].x/maxima[0].d;
-    sphi = maxima[0].y/maxima[0].d;
-    i = j = 1;
-    while (i < ngrains) {
-        gdouble x = cphi*maxima[i].x + sphi*maxima[i].y,
-                y = cphi*maxima[i].y - sphi*maxima[i].x;
-        maxima[j] = maxima[i];
-        if (x > 1e-9*dh || (x > -1e-9*dh && y > 1e-9*dh))
-            j++;
-        i++;
-    }
-    ngrains = j;
-
-    if (ngrains < 10) {
-        gwy_debug("Too few maxima (after half-plane removal): %d.", ngrains);
-        g_free(maxima);
-        return FALSE;
-    }
-
-    /* Locate the most important maxima. */
-    ngrains = MIN(ngrains, 12);
-    for (i = 0; i < ngrains; i++) {
-        for (j = i+1; j < ngrains; j++) {
-            gdouble x = maxima[i].x + maxima[j].x;
-            gdouble y = maxima[i].y + maxima[j].y;
-            for (k = 0; k < ngrains; k++) {
-                if (fabs(maxima[k].x - x) < dh && fabs(maxima[k].y - y) < dh) {
-                    maxima[i].basecount++;
-                    maxima[j].basecount++;
-                }
-            }
-        }
-    }
-    qsort(maxima, ngrains, sizeof(MaximumInfo), compare_maxima);
-#ifdef DEBUG
-    for (i = 0; i < ngrains; i++) {
-        gwy_debug("[%u] (%g, %g) %g #%u",
-                  i, maxima[i].x, maxima[i].y, maxima[i].max,
-                  maxima[i].basecount);
-    }
-#endif
-
-    if (maxima[1].basecount >= 3) {
-        gdouble xy[4];
-
-        xy[0] = maxima[0].x;
-        xy[1] = maxima[0].y;
-        dh = maxima[0].d;
-        /* Exclude maxima that appear to be collinear with the first one,
-         * otherwise take the next one with the highest basecount. */
-        for (i = 1; i < ngrains; i++) {
-            for (k = 2; k < 5; k++) {
-                if (fabs(maxima[i].x/k - xy[0]) < 0.2*dh
-                    && fabs(maxima[i].y/k - xy[1]) < 0.2*dh) {
-                    gwy_debug("Excluding #%u for collinearity (%u).", i, k);
-                    break;
-                }
-            }
-            if (k == 5) {
-                xy[2] = maxima[i].x;
-                xy[3] = maxima[i].y;
-                ok = TRUE;
-                break;
-            }
-        }
-
-        if (ok) {
-            gdouble phi;
-
-            /* Try to choose some sensible vectors among the equivalent
-             * choices. */
-            for (i = 0; i < 4; i++)
-                xy[i] = -xy[i];
-
-            phi = fmod(atan2(xy[1], xy[0]) + 4.0*G_PI - atan2(xy[3], xy[2]),
-                       2.0*G_PI);
-            if (phi > G_PI) {
-                GWY_SWAP(gdouble, xy[0], xy[2]);
-                GWY_SWAP(gdouble, xy[1], xy[3]);
-            }
-            set_selection(controls, xy);
-        }
-    }
-
-    g_free(maxima);
-
-    return ok;
-}
-
 static void
 set_selection(LatMeasControls *controls, const gdouble *xy)
 {
@@ -1060,7 +880,7 @@ image_mode_changed(G_GNUC_UNUSED GtkToggleButton *button,
         if (mode == IMAGE_ACF)
             gwy_container_set_enum_by_name(controls->mydata,
                                            "/1/base/range-type",
-                                           GWY_LAYER_BASIC_RANGE_FULL);
+                                           GWY_LAYER_BASIC_RANGE_AUTO);
         else
             gwy_container_set_enum_by_name(controls->mydata,
                                            "/1/base/range-type",
@@ -1163,22 +983,55 @@ zoom_changed(GtkRadioButton *button,
 }
 
 static void
+fix_hacf_changed(LatMeasControls *controls,
+                 GtkToggleButton *toggle)
+{
+    LatMeasArgs *args = controls->args;
+
+    args->fix_hacf = gtk_toggle_button_get_active(toggle);
+    if (args->image_mode == IMAGE_ACF)
+        calculate_zoomed_field(controls);
+}
+
+static void
 calculate_acf_full(LatMeasControls *controls,
                    GwyDataField *dfield)
 {
-    GwyDataField *acf;
+    GwyDataField *acf, *mid, *mask;
+    GwyDataLine *hacf;
     guint acfwidth, acfheight;
 
     dfield = gwy_data_field_duplicate(dfield);
     gwy_data_field_add(dfield, -gwy_data_field_get_avg(dfield));
     acf = gwy_data_field_new_alike(dfield, FALSE);
-    acfwidth = MIN(MAX(3*dfield->xres/8, 64), dfield->xres/2);
-    acfheight = MIN(MAX(3*dfield->yres/8, 64), dfield->yres/2);
+    acfwidth = dfield->xres/2;
+    acfheight = dfield->yres/2;
     gwy_data_field_area_2dacf(dfield, acf, 0, 0, dfield->xres, dfield->yres,
                               acfwidth, acfheight);
     g_object_unref(dfield);
     gwy_container_set_object_by_name(controls->mydata, "/2/data/full", acf);
     g_object_unref(acf);
+
+    /* Remember the middle row as we may replace it. */
+    acfheight = gwy_data_field_get_yres(acf);
+    acfwidth = gwy_data_field_get_xres(acf);
+    hacf = gwy_data_line_new(acfwidth, 1.0, FALSE);
+    gwy_data_field_get_row(acf, hacf, acfheight/2);
+    gwy_container_set_object_by_name(controls->mydata, "/2/hacf", hacf);
+    g_object_unref(hacf);
+
+    /* Remember interpolated middle row. */
+    mid = gwy_data_field_area_extract(acf, 0, acfheight/2-1, acfwidth, 3);
+    mask = gwy_data_field_new(acfwidth, 3, acfwidth, 3, TRUE);
+    gwy_data_field_area_fill(mask, 0, 1, acfwidth, 1, 1.0);
+    gwy_data_field_set_val(mask, acfwidth/2, 1, 0.0);
+    gwy_data_field_laplace_solve(mid, mask, -1, 1.0);
+    hacf = gwy_data_line_new(acfwidth, 1.0, FALSE);
+    gwy_data_field_get_row(mid, hacf, 1);
+    gwy_container_set_object_by_name(controls->mydata, "/2/hacf-fixed", hacf);
+    g_object_unref(hacf);
+    g_object_unref(mask);
+    g_object_unref(mid);
 }
 
 static gint
@@ -1229,29 +1082,25 @@ calculate_zoomed_field(LatMeasControls *controls)
     LatMeasArgs *args = controls->args;
     ZoomType zoom;
     GwyDataField *zoomed;
-    const gchar *key = NULL;
+    guint xres, yres, width, height;
 
-    if (args->image_mode == IMAGE_ACF) {
+    if (args->image_mode == IMAGE_ACF)
         zoom = args->zoom_acf;
-        key = "/2/data/full";
-    }
-    else if (args->image_mode == IMAGE_PSDF) {
+    else if (args->image_mode == IMAGE_PSDF)
         zoom = args->zoom_psdf;
-        key = "/3/data/full";
-    }
     else
         return;
 
-    zoomed = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata,
-                                                             key));
+    zoomed = get_full_dfield_for_mode(controls);
+    xres = gwy_data_field_get_xres(zoomed);
+    yres = gwy_data_field_get_yres(zoomed);
+
     if (zoom == ZOOM_1) {
         g_object_ref(zoomed);
     }
     else {
-        guint xres = zoomed->xres;
-        guint yres = zoomed->yres;
-        guint width = (xres/zoom) | 1;
-        guint height = (yres/zoom) | 1;
+        width = (xres/zoom) | 1;
+        height = (yres/zoom) | 1;
 
         if (width < 17)
             width = MAX(width, MIN(17, xres));
@@ -1274,45 +1123,20 @@ static void
 refine(LatMeasControls *controls)
 {
     GwyDataField *dfield;
-    gint xwinsize, ywinsize;
-    const gchar *key = NULL;
     gdouble xy[4];
+    gboolean ok;
 
     if (!get_selection(controls, xy))
         return;
 
-    if (controls->args->image_mode == IMAGE_PSDF) {
-        /* For refine we need selection coordinates for the visible image
-         * which is PSDF, not the real-space lattice. */
-        transform_selection(xy);
-        key = "/3/data/full";
-    }
-    else
-        key = "/2/data/full";
-
-    dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata,
-                                                             key));
-    xwinsize = (gint)(0.32*MAX(fabs(xy[0]), fabs(xy[2]))
-                      /gwy_data_field_get_xmeasure(dfield) + 0.5);
-    ywinsize = (gint)(0.32*MAX(fabs(xy[1]), fabs(xy[3]))
-                      /gwy_data_field_get_ymeasure(dfield) + 0.5);
-    gwy_debug("window size: %dx%d", xwinsize, ywinsize);
-
-    xy[0] = (xy[0] - dfield->xoff)/gwy_data_field_get_xmeasure(dfield);
-    xy[1] = (xy[1] - dfield->yoff)/gwy_data_field_get_ymeasure(dfield);
-    xy[2] = (xy[2] - dfield->xoff)/gwy_data_field_get_xmeasure(dfield);
-    xy[3] = (xy[3] - dfield->yoff)/gwy_data_field_get_ymeasure(dfield);
-    find_maximum(dfield, xy + 0, xy + 1, xwinsize, ywinsize);
-    find_maximum(dfield, xy + 2, xy + 3, xwinsize, ywinsize);
-    xy[0] = (xy[0] + 0.5)*gwy_data_field_get_xmeasure(dfield) + dfield->xoff;
-    xy[1] = (xy[1] + 0.5)*gwy_data_field_get_ymeasure(dfield) + dfield->yoff;
-    xy[2] = (xy[2] + 0.5)*gwy_data_field_get_xmeasure(dfield) + dfield->xoff;
-    xy[3] = (xy[3] + 0.5)*gwy_data_field_get_ymeasure(dfield) + dfield->yoff;
-
+    dfield = get_full_dfield_for_mode(controls);
     if (controls->args->image_mode == IMAGE_PSDF)
-        transform_selection(xy);
+        ok = gwy_data_field_measure_lattice_psdf(dfield, xy);
+    else
+        ok = gwy_data_field_measure_lattice_acf(dfield, xy);
 
-    set_selection(controls, xy);
+    if (ok)
+        set_selection(controls, xy);
 }
 
 static void
@@ -1339,7 +1163,7 @@ selection_changed(LatMeasControls *controls)
 
     vf = controls->vfphi;
     phi1 = atan2(-xy[1], xy[0]);
-    g_string_printf(str, "%.*f", vf->precision, 180.0/G_PI*phi1/vf->magnitude);
+    g_string_printf(str, "%.*f", vf->precision, phi1/vf->magnitude);
     gtk_label_set_text(GTK_LABEL(controls->a1_phi), str->str);
 
     vf = controls->vf;
@@ -1355,65 +1179,18 @@ selection_changed(LatMeasControls *controls)
 
     vf = controls->vfphi;
     phi2 = atan2(-xy[3], xy[2]);
-    g_string_printf(str, "%.*f", vf->precision, 180.0/G_PI*phi2/vf->magnitude);
+    g_string_printf(str, "%.*f", vf->precision, phi2/vf->magnitude);
     gtk_label_set_text(GTK_LABEL(controls->a2_phi), str->str);
 
     phi = phi2 - phi1;
     if (phi < 0.0)
         phi += 2.0*G_PI;
-    g_string_printf(str, "%.*f", vf->precision, 180.0/G_PI*phi/vf->magnitude);
+    g_string_printf(str, "%.*f", vf->precision, phi/vf->magnitude);
     gtk_label_set_text(GTK_LABEL(controls->phi), str->str);
 
     g_string_free(str, TRUE);
 }
 
-static void
-find_maximum(GwyDataField *dfield,
-             gdouble *x, gdouble *y,
-             gint xwinsize, gint ywinsize)
-{
-    gint xj = (gint)*x, yi = (gint)*y;
-    gdouble v, max = -G_MAXDOUBLE;
-    gint mi = yi, mj = xj, i, j;
-    gint xres = dfield->xres, yres = dfield->yres;
-    const gdouble *d = dfield->data;
-    gdouble z[9];
-
-    gwy_debug("searching from: %g, %g", *x, *y);
-    for (i = -ywinsize; i <= ywinsize; i++) {
-        if (i + yi < 0 || i + yi > yres-1)
-            continue;
-        for (j = -xwinsize; j <= xwinsize; j++) {
-            if (j + xj < 0 || j + xj > xres-1)
-                continue;
-
-            v = d[(i + yi)*xres + (j + xj)];
-            if (v > max) {
-                max = v;
-                mi = i + yi;
-                mj = j + xj;
-            }
-        }
-    }
-    gwy_debug("pixel maximum at: %d, %d", *mj, *mi);
-
-    /* Don't try any sub-pixel refinement if it's on the edge. */
-    if (mi >= 1 && mi+1 <= yres-1 && mj >= 1 && mj+1 <= xres-1) {
-        for (i = -1; i <= 1; i++) {
-            for (j = -1; j <= 1; j++)
-                z[3*(i + 1) + (j + 1)] = d[(mi + i)*xres + (mj + j)];
-        }
-        gwy_math_refine_maximum(z, x, y);
-        gwy_debug("refinement by (%g, %g)", *x, *y);
-    }
-    else {
-        *x = *y = 0.0;
-    }
-
-    *x += mj;
-    *y += mi;
-}
-
 static gboolean
 transform_selection(gdouble *xy)
 {
@@ -1454,6 +1231,7 @@ matrix_det(const gdouble *m)
     return m[0]*m[3] - m[1]*m[2];
 }
 
+static const gchar fix_hacf_key[]       = "/module/measure_lattice/fix_hacf";
 static const gchar image_mode_key[]     = "/module/measure_lattice/image_mode";
 static const gchar selection_mode_key[] = "/module/measure_lattice/selection_mode";
 static const gchar zoom_acf_key[]       = "/module/measure_lattice/zoom_acf";
@@ -1464,6 +1242,7 @@ sanitize_args(LatMeasArgs *args)
 {
     args->selection_mode = MIN(args->selection_mode, SELECTION_NMODES-1);
     args->image_mode = MIN(args->image_mode, IMAGE_NMODES-1);
+    args->fix_hacf = !!args->fix_hacf;
     if (args->zoom_acf != ZOOM_1
         && args->zoom_acf != ZOOM_4
         && args->zoom_acf != ZOOM_16)
@@ -1485,6 +1264,7 @@ load_args(GwyContainer *container, LatMeasArgs *args)
                                    &args->selection_mode);
     gwy_container_gis_enum_by_name(container, zoom_acf_key, &args->zoom_acf);
     gwy_container_gis_enum_by_name(container, zoom_psdf_key, &args->zoom_psdf);
+    gwy_container_gis_boolean_by_name(container, fix_hacf_key, &args->fix_hacf);
     sanitize_args(args);
 }
 
@@ -1497,6 +1277,7 @@ save_args(GwyContainer *container, LatMeasArgs *args)
                                    args->selection_mode);
     gwy_container_set_enum_by_name(container, zoom_acf_key, args->zoom_acf);
     gwy_container_set_enum_by_name(container, zoom_psdf_key, args->zoom_psdf);
+    gwy_container_set_boolean_by_name(container, fix_hacf_key, args->fix_hacf);
 }
 
 /* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/process/median-bg.c b/modules/process/median-bg.c
index 0b7c1f8..f93941d 100644
--- a/modules/process/median-bg.c
+++ b/modules/process/median-bg.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: median-bg.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: median-bg.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -82,12 +82,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Subtracts background using a rank-based algorithm."),
     "Yeti <yeti at gwyddion.net>",
-    "1.5",
+    "1.6",
     "David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, median_bg)
 
 static gboolean
 module_register(void)
@@ -184,7 +184,7 @@ median_dialog(MedianBgArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(5, 4, FALSE);
+    table = gtk_table_new(5, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -196,7 +196,7 @@ median_dialog(MedianBgArgs *args)
     q = args->pixelsize/args->valform->magnitude;
     gwy_debug("q = %f", q);
     controls.radius = gtk_adjustment_new(q*args->size, q, 1024*q, q, 10*q, 0);
-    spin = gwy_table_attach_hscale(table, row, _("Real _radius:"),
+    spin = gwy_table_attach_adjbar(table, row, _("Real _radius:"),
                                    args->valform->units,
                                    controls.radius, GWY_HSCALE_SQRT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), args->valform->precision);
@@ -206,7 +206,7 @@ median_dialog(MedianBgArgs *args)
     row++;
 
     controls.size = gtk_adjustment_new(args->size, 1, 1024, 1, 10, 0);
-    spin = gwy_table_attach_hscale(table, row, _("_Pixel radius:"), "px",
+    spin = gwy_table_attach_adjbar(table, row, _("_Pixel radius:"), _("px"),
                                    controls.size, GWY_HSCALE_SQRT);
     g_object_set_data(G_OBJECT(controls.size), "controls", &controls);
     g_signal_connect(controls.size, "value-changed",
@@ -216,7 +216,7 @@ median_dialog(MedianBgArgs *args)
     controls.do_extract
         = gtk_check_button_new_with_mnemonic(_("E_xtract background"));
     gtk_table_attach(GTK_TABLE(table), controls.do_extract,
-                     0, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.do_extract),
                                  args->do_extract);
     g_signal_connect(controls.do_extract, "toggled",
diff --git a/modules/process/merge.c b/modules/process/merge.c
index 9f38565..d167337 100644
--- a/modules/process/merge.c
+++ b/modules/process/merge.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: merge.c 19071 2016-10-14 09:02:41Z yeti-dn $
+ *  @(#) $Id: merge.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004,2014-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -219,7 +219,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, merge)
 
 static gboolean
 module_register(void)
@@ -282,7 +282,7 @@ merge_dialog(MergeArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(6, 4, FALSE);
+    table = gtk_table_new(6, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -299,8 +299,8 @@ merge_dialog(MergeArgs *args)
     g_signal_connect_swapped(chooser, "changed",
                              G_CALLBACK(merge_data_changed), &controls);
     merge_data_changed(&controls, chooser);
-    gwy_table_attach_hscale(table, row, _("_Merge with:"), NULL,
-                            GTK_OBJECT(chooser), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("_Merge with:"), NULL,
+                            GTK_OBJECT(chooser), GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     /* Parameters */
@@ -308,15 +308,15 @@ merge_dialog(MergeArgs *args)
                                    G_CALLBACK(merge_direction_changed),
                                    &controls,
                                    args->direction, TRUE);
-    gwy_table_attach_hscale(table, row, _("_Put second operand:"), NULL,
-                            GTK_OBJECT(combo), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("_Put second operand:"), NULL,
+                            GTK_OBJECT(combo), GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     combo = gwy_enum_combo_box_new(modes, G_N_ELEMENTS(modes),
                                    G_CALLBACK(merge_mode_changed), &controls,
                                    args->mode, TRUE);
-    gwy_table_attach_hscale(table, row, _("_Align second operand:"), NULL,
-                            GTK_OBJECT(combo), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("_Align second operand:"), NULL,
+                            GTK_OBJECT(combo), GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     combo = gwy_enum_combo_box_new(boundaries, G_N_ELEMENTS(boundaries),
@@ -324,8 +324,8 @@ merge_dialog(MergeArgs *args)
                                    &controls,
                                    args->boundary, TRUE);
     controls.boundary = combo;
-    gwy_table_attach_hscale(table, row, _("_Boundary treatment:"), NULL,
-                            GTK_OBJECT(combo), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("_Boundary treatment:"), NULL,
+                            GTK_OBJECT(combo), GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     check = gtk_check_button_new_with_mnemonic(_("Crop result to _avoid "
@@ -334,7 +334,7 @@ merge_dialog(MergeArgs *args)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
                                  args->crop_to_rectangle);
     gtk_table_attach(GTK_TABLE(table), check,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(check, "toggled",
                              G_CALLBACK(crop_to_rectangle_changed), &controls);
     row++;
@@ -343,7 +343,7 @@ merge_dialog(MergeArgs *args)
     controls.create_mask = check;
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), args->create_mask);
     gtk_table_attach(GTK_TABLE(table), check,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(check, "toggled",
                              G_CALLBACK(create_mask_changed), &controls);
     row++;
diff --git a/modules/process/mfm_current.c b/modules/process/mfm_current.c
new file mode 100644
index 0000000..58f71d9
--- /dev/null
+++ b/modules/process/mfm_current.c
@@ -0,0 +1,923 @@
+/*
+ *  @(#) $Id: mfm_current.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2017 David Necas (Yeti), Petr Klapetek.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <string.h>
+#include <gtk/gtk.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libgwyddion/gwyrandgenset.h>
+#include <libprocess/stats.h>
+#include <libprocess/arithmetic.h>
+#include <libgwydgets/gwyradiobuttons.h>
+#include <libgwydgets/gwystock.h>
+#include <libgwymodule/gwymodule-process.h>
+#include <app/gwyapp.h>
+#include "preview.h"
+#include "dimensions.h"
+#include "mfmops.h"
+
+#define MFM_CURRENT_RUN_MODES (GWY_RUN_IMMEDIATE | GWY_RUN_INTERACTIVE)
+
+enum {
+    PAGE_DIMENSIONS = 0,
+    PAGE_GENERATOR  = 1,
+    PAGE_NPAGES
+};
+
+typedef enum {
+    GWY_MFM_CURRENT_OUTPUT_HX   = 0,
+    GWY_MFM_CURRENT_OUTPUT_HZ   = 1,
+    GWY_MFM_CURRENT_OUTPUT_FORCE   = 2,
+    GWY_MFM_CURRENT_OUTPUT_FORCE_DX = 3,
+    GWY_MFM_CURRENT_OUTPUT_FORCE_DDX  = 4
+} GwyMfmCurrentOutputType;
+
+typedef struct {
+    gint active_page;
+    gboolean update;
+    GwyMfmCurrentOutputType out;
+    GwyMfmProbeType probe;
+    gdouble height;
+    gdouble current;
+    gdouble width;
+    gdouble position;
+    gdouble mtip;
+    gdouble bx;
+    gdouble by;
+    gdouble length;
+
+} MfmCurrentArgs;
+
+typedef struct {
+    MfmCurrentArgs *args;
+    GwyDimensions *dims;
+    GtkWidget *dialog;
+    GtkWidget *view;
+    GtkWidget *update;
+    GtkWidget *update_now;
+    GtkWidget *out;
+    GtkWidget *probe;
+    GtkObject *height;
+    GtkObject *current;
+    GtkObject *mtip;
+    GtkObject *bx;
+    GtkObject *by;
+    GtkObject *length;
+    GtkObject *width;
+    GtkObject *position;
+    GtkObject *size_b;
+    GtkObject *size_c;
+    GtkTable *table;
+    GwyContainer *mydata;
+    GwyDataField *surface;
+    gdouble pxsize;
+    gdouble zscale;
+    gboolean in_init;
+    gulong sid;
+} MfmCurrentControls;
+
+static gboolean      module_register           (void);
+static void          mfm_current               (GwyContainer *data,
+                                                GwyRunType run);
+static void          run_noninteractive        (MfmCurrentArgs *args,
+                                                const GwyDimensionArgs *dimsargs,
+                                                GwyContainer *data,
+                                                GwyDataField *dfield,
+                                                gint oldid,
+                                                GQuark quark);
+static gboolean      mfm_current_dialog        (MfmCurrentArgs *args,
+                                                GwyDimensionArgs *dimsargs,
+                                                GwyContainer *data,
+                                                GwyDataField *dfield,
+                                                gint id);
+static void          update_controls           (MfmCurrentControls *controls,
+                                                MfmCurrentArgs *args);
+static void          page_switched             (MfmCurrentControls *controls,
+                                                GtkNotebookPage *page,
+                                                gint pagenum);
+static void          update_values             (MfmCurrentControls *controls);
+static void          mfm_current_invalidate    (MfmCurrentControls *controls);
+static gboolean      preview_gsource           (gpointer user_data);
+static void          preview                   (MfmCurrentControls *controls);
+static void          mfm_current_do            (const MfmCurrentArgs *args,
+                                                const GwyDimensionArgs *dimsargs,
+                                                GwyDataField *dfield);
+static void          mfm_current_load_args     (GwyContainer *container,
+                                                MfmCurrentArgs *args,
+                                                GwyDimensionArgs *dimsargs);
+static void          mfm_current_save_args     (GwyContainer *container,
+                                                const MfmCurrentArgs *args,
+                                                const GwyDimensionArgs *dimsargs);
+static void          probe_changed             (GtkComboBox *combo,
+                                                MfmCurrentControls *controls);
+static void          out_changed               (GtkComboBox *combo,
+                                                MfmCurrentControls *controls);
+
+static void          update_sensitivity        (MfmCurrentControls *controls);
+static void          xyunits_changed           (MfmCurrentControls *controls);
+
+
+#define GWY_SYNTH_CONTROLS MfmCurrentControls
+#define GWY_SYNTH_INVALIDATE(controls) \
+    mfm_current_invalidate(controls)
+
+#include "synth.h"
+
+
+static const MfmCurrentArgs mfm_current_defaults = {
+    PAGE_DIMENSIONS, TRUE,
+    GWY_MFM_CURRENT_OUTPUT_HZ,
+    GWY_MFM_PROBE_CHARGE,
+    100, 1, 100,
+    50, 1,
+    10, 10, 500,
+
+};
+
+
+static const GwyDimensionArgs dims_defaults = MFM_DIMENSION_ARGS_INIT;
+
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION,
+    &module_register,
+    N_("Simulation of current line magnetic field"),
+    "Petr Klapetek <klapetek at gwyddion.net>",
+    "1.1",
+    "David Nečas (Yeti) & Petr Klapetek",
+    "2017",
+};
+
+GWY_MODULE_QUERY2(module_info, mfm_current)
+
+static gboolean
+module_register(void)
+{
+    gwy_process_func_register("mfm_current",
+                              (GwyProcessFunc)&mfm_current,
+                              N_("/SPM M_odes/_MFM/_Current Line Field..."),
+                              NULL,
+                              MFM_CURRENT_RUN_MODES,
+                              0,
+                              N_("Simulate stray field above current line"));
+
+    return TRUE;
+}
+
+
+static void
+mfm_current(GwyContainer *data, GwyRunType run)
+{
+    MfmCurrentArgs args;
+    GwyDimensionArgs dimsargs;
+    GwyDataField *dfield;
+    GQuark quark;
+    gint id;
+
+    g_return_if_fail(run & MFM_CURRENT_RUN_MODES);
+    mfm_current_load_args(gwy_app_settings_get(), &args, &dimsargs);
+
+    //this should be always in meters at start
+    dimsargs.xyunits = g_strdup("m");
+
+    gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &dfield,
+                                     GWY_APP_DATA_FIELD_ID, &id,
+                                     GWY_APP_DATA_FIELD_KEY, &quark,
+                                     0);
+
+    if (run == GWY_RUN_IMMEDIATE
+        || mfm_current_dialog(&args, &dimsargs, data, dfield, id))
+        run_noninteractive(&args, &dimsargs, data, dfield, id, quark);
+
+    if (run == GWY_RUN_INTERACTIVE)
+        mfm_current_save_args(gwy_app_settings_get(), &args, &dimsargs);
+
+    gwy_dimensions_free_args(&dimsargs);
+}
+
+static void
+run_noninteractive(MfmCurrentArgs *args,
+                   const GwyDimensionArgs *dimsargs,
+                   GwyContainer *data,
+                   GwyDataField *dfield,
+                   gint oldid,
+                   GQuark quark)
+{
+    GwySIUnit *siunit;
+    gboolean replace = dimsargs->replace && dfield;
+    gboolean add = dimsargs->add && dfield;
+    gint newid;
+
+    if (replace) {
+        /* Always take a reference so that we can always unref. */
+        g_object_ref(dfield);
+
+        gwy_app_undo_qcheckpointv(data, 1, &quark);
+        if (!add)
+            gwy_data_field_clear(dfield);
+
+        gwy_app_channel_log_add_proc(data, oldid, oldid);
+    }
+    else {
+        if (add)
+            dfield = gwy_data_field_duplicate(dfield);
+        else {
+            gdouble mag = pow10(dimsargs->xypow10) * dimsargs->measure;
+            dfield = gwy_data_field_new(dimsargs->xres, dimsargs->yres,
+                                        mag*dimsargs->xres, mag*dimsargs->yres,
+                                        TRUE);
+
+            siunit = gwy_data_field_get_si_unit_xy(dfield);
+            gwy_si_unit_set_from_string(siunit, dimsargs->xyunits);
+
+            siunit = gwy_data_field_get_si_unit_z(dfield);
+            gwy_si_unit_set_from_string(siunit, dimsargs->zunits);
+        }
+    }
+
+    mfm_current_do(args, dimsargs, dfield);
+
+    if (replace)
+        gwy_data_field_data_changed(dfield);
+    else {
+        if (data) {
+            newid = gwy_app_data_browser_add_data_field(dfield, data, TRUE);
+            if (oldid != -1)
+                gwy_app_sync_data_items(data, data, oldid, newid, FALSE,
+                                        GWY_DATA_ITEM_GRADIENT,
+                                        0);
+        }
+        else {
+            newid = 0;
+            data = gwy_container_new();
+            gwy_container_set_object(data, gwy_app_get_data_key_for_id(newid),
+                                     dfield);
+            gwy_app_data_browser_add(data);
+            gwy_app_data_browser_reset_visibility(data,
+                                                  GWY_VISIBILITY_RESET_SHOW_ALL);
+            g_object_unref(data);
+        }
+
+        gwy_app_set_data_field_title(data, newid, _("Simulated field"));
+        gwy_app_channel_log_add_proc(data, add ? oldid : -1, newid);
+    }
+    g_object_unref(dfield);
+}
+
+static gboolean
+mfm_current_dialog(MfmCurrentArgs *args,
+                 GwyDimensionArgs *dimsargs,
+                 GwyContainer *data,
+                 GwyDataField *dfield_template,
+                 gint id)
+{
+    GtkWidget *dialog, *table, *vbox, *hbox, *notebook;
+    MfmCurrentControls controls;
+    GwyDataField *dfield;
+    gboolean finished;
+    gint response;
+    gint row;
+    static const GwyEnum mfm_current_outputs[] = {
+        {
+            "H<sub>x</sub>",
+            GWY_MFM_CURRENT_OUTPUT_HX,
+        },
+        {
+            "H<sub>z</sub>",
+            GWY_MFM_CURRENT_OUTPUT_HZ,
+        },
+        {
+            "F<sub>z</sub>",
+            GWY_MFM_CURRENT_OUTPUT_FORCE,
+        },
+        {
+            "dF<sub>z</sub>/dz",
+            GWY_MFM_CURRENT_OUTPUT_FORCE_DX,
+        },
+        {
+            "d<sup>2</sup>F<sub>z</sub>/dz<sup>2</sup>",
+            GWY_MFM_CURRENT_OUTPUT_FORCE_DDX,
+        },
+    };
+    static const GwyEnum mfm_current_probes[] = {
+        { N_("Point charge"), GWY_MFM_PROBE_CHARGE, },
+        { N_("Bar"),          GWY_MFM_PROBE_BAR,   },
+    };
+
+
+    gwy_clear(&controls, 1);
+    controls.in_init = TRUE;
+    controls.args = args;
+    dialog = gtk_dialog_new_with_buttons(_("Current Line Stray Field"),
+                                         NULL, 0,
+                                         _("_Reset"), RESPONSE_RESET,
+                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                         GTK_STOCK_OK, GTK_RESPONSE_OK,
+                                         NULL);
+    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
+    gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
+    controls.dialog = dialog;
+
+    hbox = gtk_hbox_new(FALSE, 2);
+    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox,
+                       FALSE, FALSE, 4);
+
+    vbox = gtk_vbox_new(FALSE, 4);
+    gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 4);
+
+    controls.mydata = gwy_container_new();
+    dfield = gwy_data_field_new(PREVIEW_SIZE, PREVIEW_SIZE,
+                                pow10(dimsargs->xypow10)*dimsargs->measure*PREVIEW_SIZE,
+                                pow10(dimsargs->xypow10)*dimsargs->measure*PREVIEW_SIZE,
+                                TRUE);
+    gwy_container_set_object_by_name(controls.mydata, "/0/data", dfield);
+    if (dfield_template) {
+        gwy_app_sync_data_items(data, controls.mydata, id, 0, FALSE,
+                                GWY_DATA_ITEM_PALETTE,
+                                0);
+        controls.surface = gwy_synth_surface_for_preview(dfield_template,
+                                                         PREVIEW_SIZE);
+        controls.zscale = gwy_data_field_get_rms(dfield_template);
+    }
+    controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, FALSE);
+    gtk_box_pack_start(GTK_BOX(vbox), controls.view, FALSE, FALSE, 0);
+
+    gtk_box_pack_start(GTK_BOX(vbox),
+                       gwy_synth_instant_updates_new(&controls,
+                                                     &controls.update_now,
+                                                     &controls.update,
+                                                     &args->update),
+                       FALSE, FALSE, 0);
+    g_signal_connect_swapped(controls.update_now, "clicked",
+                             G_CALLBACK(preview), &controls);
+
+
+
+    notebook = gtk_notebook_new();
+    gtk_box_pack_start(GTK_BOX(hbox), notebook, TRUE, TRUE, 4);
+    g_signal_connect_swapped(notebook, "switch-page",
+                             G_CALLBACK(page_switched), &controls);
+
+    controls.dims = gwy_dimensions_new(dimsargs, dfield_template);
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
+                             gwy_dimensions_get_widget(controls.dims),
+                             gtk_label_new(_("Dimensions")));
+    if (controls.dims->add)
+        g_signal_connect_swapped(controls.dims->add, "toggled",
+                                 G_CALLBACK(mfm_current_invalidate), &controls);
+
+    g_signal_connect_swapped(controls.dims->xypow10, "changed",
+                             G_CALLBACK(xyunits_changed), &controls);
+    g_signal_connect_swapped(controls.dims->xreal, "value-changed",
+                             G_CALLBACK(xyunits_changed), &controls);
+    g_signal_connect_swapped(controls.dims->yreal, "value-changed",
+                             G_CALLBACK(xyunits_changed), &controls);
+
+
+    gtk_widget_set_no_show_all(controls.dims->xyunits, TRUE);
+    gtk_widget_hide(controls.dims->xyunits);
+    gtk_widget_set_no_show_all(controls.dims->zunits, TRUE);
+    gtk_widget_hide(controls.dims->zunits);
+    gtk_widget_set_no_show_all(controls.dims->zpow10, TRUE);
+    gtk_widget_hide(controls.dims->zpow10);
+    gtk_widget_set_no_show_all(controls.dims->unit_z_label, TRUE);
+    gtk_widget_hide(controls.dims->unit_z_label);
+
+
+    table = gtk_table_new(8 + (dfield_template ? 1 : 0), 3, FALSE);
+    controls.table = GTK_TABLE(table);
+    gtk_table_set_row_spacings(controls.table, 2);
+    gtk_table_set_col_spacings(controls.table, 6);
+    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table,
+                             gtk_label_new(_("Generator")));
+    row = 0;
+
+    gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Output")),
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    row++;
+
+    controls.height = gtk_adjustment_new(args->height, 1, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("_Output plane height:"), "nm",
+                            controls.height, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.height), "controls", &controls);
+    g_signal_connect_swapped(controls.height, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+    controls.width = gtk_adjustment_new(args->width, 1, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("_Stripe width:"), "nm",
+                            controls.width, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.width), "controls", &controls);
+    g_signal_connect_swapped(controls.width, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+    controls.current = gtk_adjustment_new(args->current, -1000, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Stripe _current:"), "mA",
+                            controls.current, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.current), "controls", &controls);
+    g_signal_connect_swapped(controls.current, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+    controls.position = gtk_adjustment_new(args->position, 0, 100, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("_Position:"), "%",
+                            controls.position, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.position), "controls", &controls);
+    g_signal_connect_swapped(controls.position, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+    controls.out = gwy_enum_combo_box_new(mfm_current_outputs,
+                                          G_N_ELEMENTS(mfm_current_outputs),
+                                          G_CALLBACK(out_changed),
+                                          &controls, args->out, TRUE);
+    gwy_table_attach_adjbar(table, row, _("Output _type:"), NULL,
+                            GTK_OBJECT(controls.out),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    row++;
+
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Probe")),
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    row++;
+
+    controls.probe = gwy_enum_combo_box_new(mfm_current_probes,
+                                            G_N_ELEMENTS(mfm_current_probes),
+                                            G_CALLBACK(probe_changed),
+                                            &controls, args->probe, TRUE);
+    gwy_table_attach_adjbar(table, row, _("P_robe type:"), NULL,
+                            GTK_OBJECT(controls.probe),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    row++;
+
+    controls.mtip = gtk_adjustment_new(args->mtip, 1, 10000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Tip _magnetization:"), "kA/m",
+                            controls.mtip, GWY_HSCALE_LOG);
+    g_object_set_data(G_OBJECT(controls.mtip), "controls", &controls);
+    g_signal_connect_swapped(controls.mtip, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+
+    controls.bx = gtk_adjustment_new(args->bx, 1, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Bar width _x:"), "nm",
+                            controls.bx, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.bx), "controls", &controls);
+    g_signal_connect_swapped(controls.bx, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+
+    controls.by = gtk_adjustment_new(args->by, 1, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Bar width _y:"), "nm",
+                            controls.by, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.by), "controls", &controls);
+    g_signal_connect_swapped(controls.by, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+
+    controls.length = gtk_adjustment_new(args->length, 1, 10000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Bar length (_z):"), "nm",
+                            controls.length, GWY_HSCALE_LOG);
+    g_object_set_data(G_OBJECT(controls.length), "controls", &controls);
+    g_signal_connect_swapped(controls.length, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+
+    update_sensitivity(&controls);
+
+    gtk_widget_show_all(dialog);
+    controls.in_init = FALSE;
+    /* Must be done when widgets are shown, see GtkNotebook docs */
+    gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), args->active_page);
+    update_values(&controls);
+    mfm_current_invalidate(&controls);
+
+    finished = FALSE;
+    while (!finished) {
+        response = gtk_dialog_run(GTK_DIALOG(dialog));
+        switch (response) {
+            case GTK_RESPONSE_CANCEL:
+            case GTK_RESPONSE_DELETE_EVENT:
+            case GTK_RESPONSE_OK:
+            gtk_widget_destroy(dialog);
+            case GTK_RESPONSE_NONE:
+            finished = TRUE;
+            break;
+
+            case RESPONSE_RESET:
+            {
+                gboolean temp = args->update;
+                gint temp2 = args->active_page;
+                *args = mfm_current_defaults;
+                args->active_page = temp2;
+                args->update = temp;
+            }
+            controls.in_init = TRUE;
+            update_controls(&controls, args);
+            controls.in_init = FALSE;
+            if (args->update)
+                preview(&controls);
+            break;
+
+            default:
+            g_assert_not_reached();
+            break;
+        }
+    }
+
+    if (controls.sid) {
+        g_source_remove(controls.sid);
+        controls.sid = 0;
+    }
+    g_object_unref(controls.mydata);
+    GWY_OBJECT_UNREF(controls.surface);
+    gwy_dimensions_free(controls.dims);
+
+    return response == GTK_RESPONSE_OK;
+}
+
+
+static void
+update_controls(MfmCurrentControls *controls,
+                MfmCurrentArgs *args)
+{
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->update),
+                                 args->update);
+
+    gwy_enum_combo_box_set_active(GTK_COMBO_BOX(controls->out),
+                                  args->out);
+    gwy_enum_combo_box_set_active(GTK_COMBO_BOX(controls->probe),
+                                  args->probe);
+
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->height), args->height);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->current), args->current);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->position), args->position);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->width), args->width);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->mtip), args->mtip);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->bx), args->bx);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->by), args->by);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->length), args->length);
+}
+
+static void
+update_sensitivity(MfmCurrentControls *controls)
+{
+    gboolean is_force = TRUE, is_bar = FALSE;
+
+    if (controls->args->out == GWY_MFM_CURRENT_OUTPUT_HZ
+        || controls->args->out == GWY_MFM_CURRENT_OUTPUT_HX)
+        is_force = FALSE;
+    if (controls->args->probe == GWY_MFM_PROBE_BAR)
+        is_bar = TRUE;
+    if (!is_force)
+        is_bar = FALSE;
+
+    gwy_table_hscale_set_sensitive(GTK_OBJECT(controls->probe), is_force);
+    gwy_table_hscale_set_sensitive(controls->mtip, is_bar);
+    gwy_table_hscale_set_sensitive(controls->bx, is_bar);
+    gwy_table_hscale_set_sensitive(controls->by, is_bar);
+    gwy_table_hscale_set_sensitive(controls->length, is_bar);
+}
+
+static void
+xyunits_changed(MfmCurrentControls *controls)
+{
+    gdouble mag;
+    GwyDataField *dfield;
+
+    update_values(controls);
+
+    dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata,
+                                                             "/0/data"));
+
+    mag = pow10(controls->dims->args->xypow10) * controls->dims->args->measure;
+    gwy_data_field_set_xreal(dfield, mag*controls->dims->args->xres);
+    gwy_data_field_set_yreal(dfield, mag*controls->dims->args->yres);
+
+    mfm_current_invalidate(controls);
+}
+
+static void
+probe_changed(GtkComboBox *combo, MfmCurrentControls *controls)
+{
+    controls->args->probe = gwy_enum_combo_box_get_active(combo);
+    update_sensitivity(controls);
+    mfm_current_invalidate(controls);
+}
+
+static void
+out_changed(GtkComboBox *combo, MfmCurrentControls *controls)
+{
+    controls->args->out = gwy_enum_combo_box_get_active(combo);
+    update_sensitivity(controls);
+    mfm_current_invalidate(controls);
+}
+
+
+static void
+page_switched(MfmCurrentControls *controls,
+              G_GNUC_UNUSED GtkNotebookPage *page,
+              gint pagenum)
+{
+    if (controls->in_init)
+        return;
+
+    controls->args->active_page = pagenum;
+
+    if (pagenum == PAGE_GENERATOR)
+        update_values(controls);
+}
+
+static void
+update_values(MfmCurrentControls *controls)
+{
+    GwyDimensions *dims = controls->dims;
+
+    controls->pxsize = dims->args->measure * pow10(dims->args->xypow10);
+
+    controls->args->current = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->current));
+    controls->args->position = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->position));
+    controls->args->width = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->width));
+    controls->args->height = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->height));
+    controls->args->mtip = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->mtip));
+    controls->args->bx = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->bx));
+    controls->args->by = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->by));
+    controls->args->length = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->length));
+
+    controls->args->probe = gwy_enum_combo_box_get_active(GTK_COMBO_BOX(controls->probe));
+    controls->args->out = gwy_enum_combo_box_get_active(GTK_COMBO_BOX(controls->out));
+
+    update_sensitivity(controls);
+    mfm_current_invalidate(controls);
+
+
+}
+
+static void
+mfm_current_invalidate(MfmCurrentControls *controls)
+{
+    /* create preview if instant updates are on */
+    if (controls->args->update && !controls->in_init && !controls->sid) {
+        controls->sid = g_idle_add_full(G_PRIORITY_LOW, preview_gsource,
+                                        controls, NULL);
+    }
+}
+
+static gboolean
+preview_gsource(gpointer user_data)
+{
+    MfmCurrentControls *controls = (MfmCurrentControls*)user_data;
+    controls->sid = 0;
+
+    preview(controls);
+
+    return FALSE;
+}
+
+static void
+preview(MfmCurrentControls *controls)
+{
+    MfmCurrentArgs *args = controls->args;
+    GwyDataField *dfield;
+
+    dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata,
+                                                             "/0/data"));
+    if (controls->dims->args->add && controls->surface)
+        gwy_data_field_copy(controls->surface, dfield, FALSE);
+    else
+        gwy_data_field_clear(dfield);
+
+    mfm_current_do(args, controls->dims->args, dfield);
+
+    gwy_data_field_data_changed(dfield);
+}
+
+static void
+mfm_current_do(const MfmCurrentArgs *args,
+               G_GNUC_UNUSED const GwyDimensionArgs *dimsargs,
+               GwyDataField *dfield)
+{
+    GwyDataField  *fz=NULL, *fza, *fzb, *fzc;
+    gdouble dd = 1.0e-9;
+    gdouble position = args->position*gwy_data_field_get_xreal(dfield)/100.0;
+
+    if (args->out == GWY_MFM_CURRENT_OUTPUT_HX)
+    {
+        mfm_current_create_h(dfield, args->height*1e-9, args->width*1e-9,
+                       position, args->current*1e-3,
+                       GWY_MFM_COMPONENT_HX);
+        gwy_data_field_set_si_unit_z(dfield, gwy_si_unit_new("A/m"));
+
+    }
+    else if (args->out == GWY_MFM_CURRENT_OUTPUT_HZ || args->out == GWY_MFM_CURRENT_OUTPUT_FORCE)
+    {
+        mfm_current_create_h(dfield, args->height*1e-9, args->width*1e-9,
+                       position, args->current*1e-3,
+                       GWY_MFM_COMPONENT_HZ);
+
+        if (args->out == GWY_MFM_CURRENT_OUTPUT_FORCE)
+        {
+            fz = gwy_data_field_new_alike(dfield, TRUE);
+
+            mfm_perpendicular_force_from_field(dfield, fz,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+            gwy_data_field_copy(fz, dfield, FALSE);
+            gwy_data_field_set_si_unit_z(dfield, gwy_si_unit_new("N"));
+
+            gwy_object_unref(fz);
+        } else {
+            gwy_data_field_set_si_unit_z(dfield, gwy_si_unit_new("A/m"));
+        }
+    }
+
+    else if (args->out == GWY_MFM_CURRENT_OUTPUT_FORCE_DX) //this is done numerically now
+    {
+        fza = gwy_data_field_new_alike(dfield, TRUE);
+        fzb = gwy_data_field_new_alike(dfield, TRUE);
+        fz = gwy_data_field_new_alike(dfield, TRUE);
+
+
+        mfm_current_create_h(dfield, args->height*1e-9-dd, args->width*1e-9,
+                       position, args->current*1e-3,
+                       GWY_MFM_COMPONENT_HZ);
+
+        mfm_perpendicular_force_from_field(dfield, fza,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+
+        mfm_current_create_h(dfield, args->height*1e-9+dd, args->width*1e-9,
+                       position, args->current*1e-3,
+                       GWY_MFM_COMPONENT_HZ);
+
+        mfm_perpendicular_force_from_field(dfield, fzb,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+
+        gwy_data_field_subtract_fields(fz, fza, fzb);
+        gwy_data_field_multiply(fz, 0.5/dd);
+
+        gwy_object_unref(fza);
+        gwy_object_unref(fzb);
+
+        gwy_data_field_copy(fz, dfield, FALSE);
+        gwy_data_field_set_si_unit_z(dfield, gwy_si_unit_new("N/m"));
+
+        gwy_object_unref(fz);
+
+    }
+    else if (args->out == GWY_MFM_CURRENT_OUTPUT_FORCE_DDX) //this is done numerically now
+    {
+        fza = gwy_data_field_new_alike(dfield, TRUE);
+        fzb = gwy_data_field_new_alike(dfield, TRUE);
+        fzc = gwy_data_field_new_alike(dfield, TRUE);
+        fz = gwy_data_field_new_alike(dfield, TRUE);
+
+
+        mfm_current_create_h(dfield, args->height*1e-9-dd, args->width*1e-9,
+                       position, args->current*1e-3,
+                       GWY_MFM_COMPONENT_HZ);
+
+        mfm_perpendicular_force_from_field(dfield, fza,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+
+        mfm_current_create_h(dfield, args->height*1e-9, args->width*1e-9,
+                       position, args->current*1e-3,
+                       GWY_MFM_COMPONENT_HZ);
+
+        mfm_perpendicular_force_from_field(dfield, fzb,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+
+        mfm_current_create_h(dfield, args->height*1e-9+dd, args->width*1e-9,
+                       position, args->current*1e-3,
+                       GWY_MFM_COMPONENT_HZ);
+
+        mfm_perpendicular_force_from_field(dfield, fzc,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+
+        gwy_data_field_multiply(fzb, 2.0);
+        gwy_data_field_sum_fields(fz, fza, fzc);
+        gwy_data_field_subtract_fields(fz, fz, fzb);
+
+        gwy_data_field_multiply(fz, 1.0/(dd*dd));
+
+        gwy_object_unref(fza);
+        gwy_object_unref(fzb);
+        gwy_object_unref(fzc);
+
+        gwy_data_field_copy(fz, dfield, FALSE);
+        gwy_data_field_set_si_unit_z(dfield, gwy_si_unit_new("N/m²"));
+
+       gwy_object_unref(fz);
+
+     }
+}
+
+
+static const gchar prefix[]            = "/module/mfm_current";
+static const gchar active_page_key[]   = "/module/mfm_current/active_page";
+static const gchar update_key[]        = "/module/mfm_current/update";
+static const gchar out_key[]           = "/module/mfm_current/out";
+static const gchar probe_key[]         = "/module/mfm_current/probe";
+static const gchar height_key[]        = "/module/mfm_current/height";
+static const gchar current_key[]       = "/module/mfm_current/current";
+static const gchar width_key[]         = "/module/mfm_current/width";
+static const gchar position_key[]      = "/module/mfm_current/position";
+static const gchar mtip_key[]          = "/module/mfm_current/mtip";
+static const gchar bx_key[]            = "/module/mfm_current/bx";
+static const gchar by_key[]            = "/module/mfm_current/by";
+static const gchar length_key[]        = "/module/mfm_current/length";
+
+
+static void
+mfm_current_sanitize_args(MfmCurrentArgs *args)
+{
+    args->active_page = CLAMP(args->active_page,
+                              PAGE_DIMENSIONS, PAGE_NPAGES-1);
+    args->update = !!args->update;
+    args->out = CLAMP(args->out, 0, GWY_MFM_CURRENT_OUTPUT_FORCE_DDX);
+    args->probe = CLAMP(args->probe, 0, GWY_MFM_PROBE_BAR);
+    args->position = CLAMP(args->position, 0, 100);
+}
+
+static void
+mfm_current_load_args(GwyContainer *container,
+                      MfmCurrentArgs *args,
+                      GwyDimensionArgs *dimsargs)
+{
+    *args = mfm_current_defaults;
+
+    gwy_container_gis_int32_by_name(container, active_page_key,
+                                    &args->active_page);
+    gwy_container_gis_boolean_by_name(container, update_key, &args->update);
+
+    gwy_container_gis_enum_by_name(container, probe_key, &args->probe);
+    gwy_container_gis_enum_by_name(container, out_key, &args->out);
+    gwy_container_gis_double_by_name(container, height_key, &args->height);
+    gwy_container_gis_double_by_name(container, current_key, &args->current);
+    gwy_container_gis_double_by_name(container, width_key, &args->width);
+    gwy_container_gis_double_by_name(container, position_key, &args->position);
+    gwy_container_gis_double_by_name(container, mtip_key, &args->mtip);
+    gwy_container_gis_double_by_name(container, bx_key, &args->bx);
+    gwy_container_gis_double_by_name(container, by_key, &args->by);
+    gwy_container_gis_double_by_name(container, length_key, &args->length);
+
+    mfm_current_sanitize_args(args);
+
+    gwy_clear(dimsargs, 1);
+    gwy_dimensions_copy_args(&dims_defaults, dimsargs);
+    gwy_dimensions_load_args(dimsargs, container, prefix);
+}
+
+static void
+mfm_current_save_args(GwyContainer *container,
+                      const MfmCurrentArgs *args,
+                      const GwyDimensionArgs *dimsargs)
+{
+    gwy_container_set_int32_by_name(container, active_page_key,
+                                    args->active_page);
+    gwy_container_set_boolean_by_name(container, update_key, args->update);
+
+    gwy_container_set_enum_by_name(container, probe_key, args->probe);
+    gwy_container_set_enum_by_name(container, out_key, args->out);
+    gwy_container_set_double_by_name(container, height_key, args->height);
+    gwy_container_set_double_by_name(container, current_key, args->current);
+    gwy_container_set_double_by_name(container, width_key, args->width);
+    gwy_container_set_double_by_name(container, position_key, args->position);
+    gwy_container_set_double_by_name(container, mtip_key, args->mtip);
+    gwy_container_set_double_by_name(container, bx_key, args->bx);
+    gwy_container_set_double_by_name(container, by_key, args->by);
+    gwy_container_set_double_by_name(container, length_key, args->length);
+
+
+    gwy_dimensions_save_args(dimsargs, container, prefix);
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/process/mfm_field.c b/modules/process/mfm_field.c
new file mode 100644
index 0000000..fcd7348
--- /dev/null
+++ b/modules/process/mfm_field.c
@@ -0,0 +1,789 @@
+/*
+ *  @(#) $Id: mfm_field.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2003-2015 David Necas (Yeti), Petr Klapetek.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <gtk/gtk.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libprocess/gwyprocesstypes.h>
+#include <libprocess/arithmetic.h>
+#include <libprocess/inttrans.h>
+#include <libprocess/stats.h>
+#include <libgwydgets/gwydgetutils.h>
+#include <libgwydgets/gwycombobox.h>
+#include <libgwydgets/gwystock.h>
+#include <libgwymodule/gwymodule-process.h>
+#include <app/gwymoduleutils.h>
+#include <app/gwyapp.h>
+#include "mfmops.h"
+#include "preview.h"
+
+#define MFM_FIELD_RUN_MODES (GWY_RUN_IMMEDIATE | GWY_RUN_INTERACTIVE)
+
+typedef enum {
+    GWY_MFM_FIELD_OUTPUT_FIELD   = 0,
+    GWY_MFM_FIELD_OUTPUT_FORCE   = 1,
+    GWY_MFM_FIELD_OUTPUT_FORCE_DX = 2,
+    GWY_MFM_FIELD_OUTPUT_FORCE_DDX  = 3
+} GwyMfmFieldOutputType;
+
+
+typedef struct {
+    GwyMfmFieldOutputType out;
+    GwyMfmProbeType probe;
+    gboolean walls;
+    gdouble height;
+    gdouble thickness;
+    gdouble sigma;
+    gdouble mtip;
+    gdouble bx;
+    gdouble by;
+    gdouble length;
+    gdouble wall_a;
+    gdouble wall_kn;
+    gboolean update;
+} MfmFieldArgs;
+
+typedef struct {
+    MfmFieldArgs *args;
+    GtkWidget *out;
+    GtkWidget *probe;
+    GtkWidget *walls;
+    GtkWidget *update;
+    GtkObject *height;
+    GtkObject *thickness;
+    GtkObject *sigma;
+    GtkObject *mtip;
+    GtkObject *bx;
+    GtkObject *by;
+    GtkObject *length;
+    GtkObject *wall_a;
+    GtkObject *wall_kn;
+    GwyDataField *result;
+    GwyDataField *mfield;
+    GtkWidget *view;
+    GwyContainer *mydata;
+
+} MfmFieldControls;
+
+static gboolean module_register          (void);
+static void     mfm_field                 (GwyContainer *data,
+                                          GwyRunType run);
+static void     mfm_field_do             (MfmFieldArgs *args,
+                                          GwyDataField *mfield,
+                                          GwyDataField *out);
+static gboolean mfm_field_dialog         (MfmFieldArgs *args,
+                                          GwyContainer *data);
+static void     walls_changed            (GtkToggleButton *button,
+                                          MfmFieldControls *controls);
+static void     update_changed           (GtkToggleButton *button,
+                                          MfmFieldControls *controls);
+static void     update_sensitivity       (MfmFieldControls *controls);
+static void     preview                  (MfmFieldControls *controls,
+                                          MfmFieldArgs *args);
+static void     mfm_field_load_args      (GwyContainer *container,
+                                          MfmFieldArgs *args);
+static void     mfm_field_save_args      (GwyContainer *container,
+                                          MfmFieldArgs *args);
+static void     mfm_field_sanitize_args  (MfmFieldArgs *args);
+static void     sigma_changed            (GtkAdjustment *adj,
+                                          MfmFieldControls *controls);
+static void     height_changed           (GtkAdjustment *adj,
+                                          MfmFieldControls *controls);
+static void     thickness_changed        (GtkAdjustment *adj,
+                                          MfmFieldControls *controls);
+static void     wall_a_changed           (GtkAdjustment *adj,
+                                          MfmFieldControls *controls);
+static void     wall_kn_changed           (GtkAdjustment *adj,
+                                          MfmFieldControls *controls);
+static void     bx_changed               (GtkAdjustment *adj,
+                                          MfmFieldControls *controls);
+static void     by_changed               (GtkAdjustment *adj,
+                                          MfmFieldControls *controls);
+static void     mtip_changed             (GtkAdjustment *adj,
+                                          MfmFieldControls *controls);
+static void     length_changed           (GtkAdjustment *adj,
+                                          MfmFieldControls *controls);
+static void     probe_changed            (GtkComboBox *combo,
+                                          MfmFieldControls *controls);
+static void     out_changed              (GtkComboBox *combo,
+                                          MfmFieldControls *controls);
+static void     mfm_field_dialog_update  (MfmFieldControls *controls,
+                                          MfmFieldArgs *args);
+
+static const MfmFieldArgs mfm_field_defaults = {
+    GWY_MFM_FIELD_OUTPUT_FIELD,
+    GWY_MFM_PROBE_CHARGE,
+    FALSE,
+    100, 100, 1,
+    1, 10, 10, 1000,
+    28, 540,
+    FALSE,
+};
+
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION,
+    &module_register,
+    N_("Simulation of magnetic field above perpendicular media"),
+    "Petr Klapetek <klapetek at gwyddion.net>",
+    "1.1",
+    "David Nečas (Yeti) & Petr Klapetek",
+    "2017",
+};
+
+GWY_MODULE_QUERY2(module_info, mfm_field)
+
+static gboolean
+module_register(void)
+{
+    gwy_process_func_register("mfm_field",
+                              (GwyProcessFunc)&mfm_field,
+                              N_("/SPM M_odes/_MFM/_Perpendicular Media Field..."),
+                              NULL,
+                              MFM_FIELD_RUN_MODES,
+                              GWY_MENU_FLAG_DATA | GWY_MENU_FLAG_DATA_MASK,
+                              N_("Compute stray field above perpendicular magnetic medium"));
+
+    return TRUE;
+}
+
+static void
+mfm_field(GwyContainer *data, GwyRunType run)
+{
+    GwyDataField *mfield, *out;
+    MfmFieldArgs args;
+    gboolean ok;
+    gint id, newid, datano;
+    g_return_if_fail(run & MFM_FIELD_RUN_MODES);
+
+    gwy_app_data_browser_get_current(GWY_APP_MASK_FIELD, &mfield,
+                                     GWY_APP_DATA_FIELD_ID, &id,
+                                     GWY_APP_CONTAINER_ID, &datano,
+                                     0);
+    g_return_if_fail(mfield);
+
+    mfm_field_load_args(gwy_app_settings_get(), &args);
+
+    if (run == GWY_RUN_INTERACTIVE) {
+        ok = mfm_field_dialog(&args, data);
+        mfm_field_save_args(gwy_app_settings_get(), &args);
+        if (!ok)
+            return;
+    }
+
+    //do the computation
+
+    out = gwy_data_field_new_alike(mfield, FALSE);
+    mfm_field_do(&args, mfield, out);
+
+    if (args.out == GWY_MFM_FIELD_OUTPUT_FIELD) {
+        newid = gwy_app_data_browser_add_data_field(out, data, TRUE);
+        gwy_app_sync_data_items(data, data, id, newid, FALSE,
+                            GWY_DATA_ITEM_GRADIENT,
+                            GWY_DATA_ITEM_MASK_COLOR,
+                            0);
+
+        gwy_app_set_data_field_title(data, newid, "Hz");
+        gwy_app_channel_log_add_proc(data, id, newid);
+    }
+    else if (args.out == GWY_MFM_FIELD_OUTPUT_FORCE) {
+        newid = gwy_app_data_browser_add_data_field(out, data, TRUE);
+        gwy_app_sync_data_items(data, data, id, newid, FALSE,
+                            GWY_DATA_ITEM_GRADIENT,
+                            GWY_DATA_ITEM_MASK_COLOR,
+                            0);
+
+        gwy_app_set_data_field_title(data, newid, "Fz");
+        gwy_app_channel_log_add_proc(data, id, newid);
+    }
+    else if (args.out == GWY_MFM_FIELD_OUTPUT_FORCE_DX) {
+        newid = gwy_app_data_browser_add_data_field(out, data, TRUE);
+        gwy_app_sync_data_items(data, data, id, newid, FALSE,
+                            GWY_DATA_ITEM_GRADIENT,
+                            GWY_DATA_ITEM_MASK_COLOR,
+                            0);
+
+        gwy_app_set_data_field_title(data, newid, "dFz/dz");
+        gwy_app_channel_log_add_proc(data, id, newid);
+    }
+    else if (args.out == GWY_MFM_FIELD_OUTPUT_FORCE_DDX) {
+        newid = gwy_app_data_browser_add_data_field(out, data, TRUE);
+        gwy_app_sync_data_items(data, data, id, newid, FALSE,
+                            GWY_DATA_ITEM_GRADIENT,
+                            GWY_DATA_ITEM_MASK_COLOR,
+                            0);
+
+        gwy_app_set_data_field_title(data, newid, "d²Fz/dz²");
+        gwy_app_channel_log_add_proc(data, id, newid);
+
+    }
+
+    g_object_unref(out);
+}
+
+
+static gboolean
+mfm_field_dialog(MfmFieldArgs *args, GwyContainer *data)
+{
+    static const GwyEnum mfm_field_outputs[] = {
+        {
+            "H<sub>z</sub>",
+            GWY_MFM_FIELD_OUTPUT_FIELD,
+        },
+        {
+            "F<sub>z</sub>",
+            GWY_MFM_FIELD_OUTPUT_FORCE,
+        },
+        {
+            "dF<sub>z</sub>/dz",
+            GWY_MFM_FIELD_OUTPUT_FORCE_DX,
+        },
+        {
+            "d<sup>2</sup>F<sub>z</sub>/dz<sup>2</sup>",
+            GWY_MFM_FIELD_OUTPUT_FORCE_DDX,
+        },
+    };
+    static const GwyEnum mfm_field_probes[] = {
+        { N_("Point charge"), GWY_MFM_PROBE_CHARGE, },
+        { N_("Bar"),          GWY_MFM_PROBE_BAR,    },
+    };
+    GtkWidget *dialog, *table, *hbox;
+    MfmFieldControls controls;
+    gint response, row, id, datano;
+
+    controls.args = args;
+
+
+    dialog = gtk_dialog_new_with_buttons(_("Perpendicular Media Stray Field"), NULL, 0, NULL);
+    gtk_dialog_add_action_widget(GTK_DIALOG(dialog),
+                                 gwy_stock_like_button_new(_("_Update"),
+                                                           GTK_STOCK_EXECUTE),
+                                 RESPONSE_PREVIEW);
+    gtk_dialog_add_button(GTK_DIALOG(dialog), _("_Reset"), RESPONSE_RESET);
+    gtk_dialog_add_button(GTK_DIALOG(dialog),
+                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+    gtk_dialog_add_button(GTK_DIALOG(dialog),
+                          GTK_STOCK_OK, GTK_RESPONSE_OK);
+    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
+    gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
+
+
+    hbox = gtk_hbox_new(FALSE, 2);
+    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), GTK_WIDGET(hbox),
+                       FALSE, FALSE, 4);
+
+    gwy_app_data_browser_get_current(GWY_APP_MASK_FIELD, &controls.mfield,
+                                     GWY_APP_DATA_FIELD_ID, &id,
+                                     GWY_APP_CONTAINER_ID, &datano,
+                                     0);
+    controls.result = gwy_data_field_new_alike(controls.mfield, TRUE);
+
+    controls.mydata = gwy_container_new();
+    gwy_container_set_object_by_name(controls.mydata, "/0/data", controls.result);
+    gwy_app_sync_data_items(data, controls.mydata, id, 0, FALSE,
+                            GWY_DATA_ITEM_PALETTE,
+                            GWY_DATA_ITEM_MASK_COLOR,
+                            GWY_DATA_ITEM_RANGE,
+                            GWY_DATA_ITEM_REAL_SQUARE,
+                            0);
+    controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, TRUE);
+    gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4);
+
+    table = gtk_table_new(13, 3, FALSE);
+    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
+    gtk_table_set_col_spacings(GTK_TABLE(table), 6);
+    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
+    gtk_box_pack_start(GTK_BOX(hbox), table,
+                       FALSE, FALSE, 4);
+    row = 0;
+
+    controls.height = gtk_adjustment_new(args->height, 0, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("_Output plane height:"), "nm",
+                            controls.height, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.height), "controls", &controls);
+    g_signal_connect(controls.height, "value-changed",
+                     G_CALLBACK(height_changed), &controls);
+    row++;
+
+    controls.thickness = gtk_adjustment_new(args->thickness, 0, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("_Film thickness:"), "nm",
+                            controls.thickness, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.thickness), "controls", &controls);
+    g_signal_connect(controls.thickness, "value-changed",
+                     G_CALLBACK(thickness_changed), &controls);
+    row++;
+
+    controls.sigma = gtk_adjustment_new(args->sigma, 1, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("_Magnetic charge:"), "kA/m",
+                            controls.sigma, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.sigma), "controls", &controls);
+    g_signal_connect(controls.sigma, "value-changed",
+                     G_CALLBACK(sigma_changed), &controls);
+    row++;
+
+    controls.walls
+        = gtk_check_button_new_with_mnemonic(_("Include domain _walls"));
+    gtk_table_attach(GTK_TABLE(table), controls.walls,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.walls),
+                                 args->walls);
+    g_signal_connect(controls.walls, "toggled",
+                     G_CALLBACK(walls_changed), &controls);
+    row++;
+
+    controls.wall_a = gtk_adjustment_new(args->wall_a, 1, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("_Exchange constant:"), "pJ/m",
+                            controls.wall_a, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.wall_a), "controls", &controls);
+    g_signal_connect(controls.wall_a, "value-changed",
+                     G_CALLBACK(wall_a_changed), &controls);
+    row++;
+
+    controls.wall_kn = gtk_adjustment_new(args->wall_kn, 1, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("_Uniaxial anisotropy:"), "kJ/m³",
+                            controls.wall_kn, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.wall_kn), "controls", &controls);
+    g_signal_connect(controls.wall_kn, "value-changed",
+                     G_CALLBACK(wall_kn_changed), &controls);
+    row++;
+
+    controls.out = gwy_enum_combo_box_new(mfm_field_outputs,
+                                          G_N_ELEMENTS(mfm_field_outputs),
+                                          G_CALLBACK(out_changed),
+                                          &controls, args->out, TRUE);
+    gwy_table_attach_adjbar(table, row, _("Output _type:"), NULL,
+                            GTK_OBJECT(controls.out),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    row++;
+
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    controls.probe = gwy_enum_combo_box_new(mfm_field_probes,
+                                            G_N_ELEMENTS(mfm_field_probes),
+                                            G_CALLBACK(probe_changed),
+                                            &controls, args->probe, TRUE);
+    gwy_table_attach_adjbar(table, row, _("_Probe type:"), NULL,
+                            GTK_OBJECT(controls.probe),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    row++;
+
+    controls.mtip = gtk_adjustment_new(args->mtip, 1, 10000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Tip _magnetization:"), "kA/m",
+                            controls.mtip, GWY_HSCALE_LOG);
+    g_object_set_data(G_OBJECT(controls.mtip), "controls", &controls);
+    g_signal_connect(controls.mtip, "value-changed",
+                     G_CALLBACK(mtip_changed), &controls);
+    row++;
+
+    controls.bx = gtk_adjustment_new(args->bx, 1, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Bar width _x:"), "nm",
+                            controls.bx, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.bx), "controls", &controls);
+    g_signal_connect(controls.bx, "value-changed",
+                     G_CALLBACK(bx_changed), &controls);
+    row++;
+
+    controls.by = gtk_adjustment_new(args->by, 1, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Bar width _y:"), "nm",
+                            controls.by, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.by), "controls", &controls);
+    g_signal_connect(controls.by, "value-changed",
+                     G_CALLBACK(by_changed), &controls);
+    row++;
+
+    controls.length = gtk_adjustment_new(args->length, 1, 10000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Bar length (_z):"), "nm",
+                            controls.length, GWY_HSCALE_LOG);
+    g_object_set_data(G_OBJECT(controls.length), "controls", &controls);
+    g_signal_connect(controls.length, "value-changed",
+                     G_CALLBACK(length_changed), &controls);
+    row++;
+
+    controls.update = gtk_check_button_new_with_mnemonic(_("I_nstant updates"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.update),
+                                 args->update);
+    gtk_table_attach(GTK_TABLE(table), controls.update,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    g_signal_connect(controls.update, "toggled",
+                     G_CALLBACK(update_changed), &controls);
+    row++;
+
+    update_sensitivity(&controls);
+    if (args->update)
+        preview(&controls, args);
+
+    gtk_widget_show_all(dialog);
+    do {
+        response = gtk_dialog_run(GTK_DIALOG(dialog));
+        switch (response) {
+            case GTK_RESPONSE_CANCEL:
+            case GTK_RESPONSE_DELETE_EVENT:
+            gtk_widget_destroy(dialog);
+            case GTK_RESPONSE_NONE:
+            return FALSE;
+            break;
+
+            case GTK_RESPONSE_OK:
+            break;
+
+            case RESPONSE_PREVIEW:
+            preview(&controls, args);
+            break;
+
+            case RESPONSE_RESET:
+            {
+                *args = mfm_field_defaults;
+                mfm_field_dialog_update(&controls, args);
+            }
+            break;
+
+            default:
+            g_assert_not_reached();
+            break;
+        }
+    } while (response != GTK_RESPONSE_OK);
+
+    gtk_widget_destroy(dialog);
+
+    return TRUE;
+}
+
+
+static void
+sigma_changed(GtkAdjustment *adj, MfmFieldControls *controls)
+{
+    controls->args->sigma = gtk_adjustment_get_value(adj);
+}
+
+static void
+mfm_field_do(MfmFieldArgs *args, GwyDataField *mfield, GwyDataField *out)
+{
+    GwyDataField  *fz=NULL, *fza, *fzb, *fzc;
+    gdouble dd = 1.0e-9;
+
+
+    if (args->out == GWY_MFM_FIELD_OUTPUT_FIELD || args->out == GWY_MFM_FIELD_OUTPUT_FORCE) {
+        mfm_perpendicular_stray_field(mfield, out, args->height*1e-9, args->thickness*1e-9, args->sigma,
+                                                      args->walls, args->wall_a*1e-12, args->wall_kn*1e3);
+
+        if (args->out == GWY_MFM_FIELD_OUTPUT_FORCE)
+        {
+            fz = gwy_data_field_new_alike(out, TRUE);
+
+            mfm_perpendicular_force_from_field(out, fz,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+            gwy_data_field_copy(fz, out, FALSE);
+            gwy_object_unref(fz);
+        }
+    }
+    else if (args->out == GWY_MFM_FIELD_OUTPUT_FORCE_DX) //this is done numerically now
+    {
+        fza = gwy_data_field_new_alike(out, TRUE);
+        fzb = gwy_data_field_new_alike(out, TRUE);
+        fz = gwy_data_field_new_alike(out, TRUE);
+
+
+        mfm_perpendicular_stray_field(mfield, out, args->height*1e-9-dd, args->thickness*1e-9, args->sigma,
+                                                     args->walls, args->wall_a*1e-12, args->wall_kn*1e3);
+        mfm_perpendicular_force_from_field(out, fza,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+
+        mfm_perpendicular_stray_field(mfield, out, args->height*1e-9+dd, args->thickness*1e-9, args->sigma,
+                                                     args->walls, args->wall_a*1e-12, args->wall_kn*1e3);
+        mfm_perpendicular_force_from_field(out, fzb,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+
+        gwy_data_field_subtract_fields(fz, fza, fzb);
+        gwy_data_field_multiply(fz, 0.5/dd);
+
+        gwy_object_unref(fza);
+        gwy_object_unref(fzb);
+
+        gwy_data_field_copy(fz, out, FALSE);
+        gwy_object_unref(fz);
+
+    }
+    else if (args->out == GWY_MFM_FIELD_OUTPUT_FORCE_DDX) //this is done numerically now
+    {
+        fza = gwy_data_field_new_alike(out, TRUE);
+        fzb = gwy_data_field_new_alike(out, TRUE);
+        fzc = gwy_data_field_new_alike(out, TRUE);
+        fz = gwy_data_field_new_alike(out, TRUE);
+
+
+        mfm_perpendicular_stray_field(mfield, out, args->height*1e-9-dd, args->thickness*1e-9, args->sigma,
+                                                     args->walls, args->wall_a*1e-12, args->wall_kn*1e3);
+        mfm_perpendicular_force_from_field(out, fza,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+
+        mfm_perpendicular_stray_field(mfield, out, args->height*1e-9, args->thickness*1e-9, args->sigma,
+                                                     args->walls, args->wall_a*1e-12, args->wall_kn*1e3);
+        mfm_perpendicular_force_from_field(out, fzb,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+
+        mfm_perpendicular_stray_field(mfield, out, args->height*1e-9+dd, args->thickness*1e-9, args->sigma,
+                                                     args->walls, args->wall_a*1e-12, args->wall_kn*1e3);
+        mfm_perpendicular_force_from_field(out, fzc,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+
+        gwy_data_field_multiply(fzb, 2.0);
+        gwy_data_field_sum_fields(fz, fza, fzc);
+        gwy_data_field_subtract_fields(fz, fz, fzb);
+
+        gwy_data_field_multiply(fz, 1.0/(dd*dd));
+
+        gwy_object_unref(fza);
+        gwy_object_unref(fzb);
+        gwy_object_unref(fzc);
+
+        gwy_data_field_copy(fz, out, FALSE);
+        gwy_object_unref(fz);
+
+    }
+}
+
+
+static void
+preview(MfmFieldControls *controls,
+        MfmFieldArgs *args)
+{
+    mfm_field_do(args, controls->mfield, controls->result);
+    gwy_data_field_data_changed(controls->result);
+}
+
+
+static void
+wall_a_changed(GtkAdjustment *adj, MfmFieldControls *controls)
+{
+    controls->args->wall_a = gtk_adjustment_get_value(adj);
+    if (controls->args->update) preview(controls, controls->args);
+}
+
+static void
+wall_kn_changed(GtkAdjustment *adj, MfmFieldControls *controls)
+{
+    controls->args->wall_kn = gtk_adjustment_get_value(adj);
+    if (controls->args->update) preview(controls, controls->args);
+}
+
+static void
+height_changed(GtkAdjustment *adj, MfmFieldControls *controls)
+{
+    controls->args->height = gtk_adjustment_get_value(adj);
+    if (controls->args->update) preview(controls, controls->args);
+}
+
+static void
+thickness_changed(GtkAdjustment *adj, MfmFieldControls *controls)
+{
+    controls->args->thickness = gtk_adjustment_get_value(adj);
+    if (controls->args->update) preview(controls, controls->args);
+}
+
+static void
+mtip_changed(GtkAdjustment *adj, MfmFieldControls *controls)
+{
+    controls->args->mtip = gtk_adjustment_get_value(adj);
+    if (controls->args->update) preview(controls, controls->args);
+}
+
+static void
+bx_changed(GtkAdjustment *adj, MfmFieldControls *controls)
+{
+    controls->args->bx = gtk_adjustment_get_value(adj);
+    if (controls->args->update) preview(controls, controls->args);
+}
+
+static void
+by_changed(GtkAdjustment *adj, MfmFieldControls *controls)
+{
+    controls->args->by = gtk_adjustment_get_value(adj);
+    if (controls->args->update) preview(controls, controls->args);
+}
+
+static void
+length_changed(GtkAdjustment *adj, MfmFieldControls *controls)
+{
+    controls->args->length = gtk_adjustment_get_value(adj);
+    if (controls->args->update) preview(controls, controls->args);
+}
+
+static void
+update_changed(GtkToggleButton *button, MfmFieldControls *controls)
+{
+    controls->args->update = gtk_toggle_button_get_active(button);
+    if (controls->args->update) preview(controls, controls->args);
+}
+
+static void
+walls_changed(GtkToggleButton *button, MfmFieldControls *controls)
+{
+    controls->args->walls = gtk_toggle_button_get_active(button);
+    update_sensitivity(controls);
+    if (controls->args->update) preview(controls, controls->args);
+}
+
+static void
+probe_changed(GtkComboBox *combo,
+                MfmFieldControls *controls)
+{
+    controls->args->probe = gwy_enum_combo_box_get_active(combo);
+    update_sensitivity(controls);
+    if (controls->args->update) preview(controls, controls->args);
+}
+
+static void
+out_changed(GtkComboBox *combo,
+                MfmFieldControls *controls)
+{
+    controls->args->out = gwy_enum_combo_box_get_active(combo);
+    update_sensitivity(controls);
+    if (controls->args->update) preview(controls, controls->args);
+}
+
+
+static void
+update_sensitivity(MfmFieldControls *controls)
+{
+    gboolean is_walls = controls->args->walls;
+    gboolean is_force = TRUE, is_bar = FALSE;
+
+    if (controls->args->out == GWY_MFM_FIELD_OUTPUT_FIELD)
+        is_force = FALSE;
+    if (controls->args->probe == GWY_MFM_PROBE_BAR)
+        is_bar = TRUE;
+    if (!is_force)
+        is_bar = FALSE;
+
+    gtk_widget_set_sensitive(controls->probe, is_force);
+
+    gwy_table_hscale_set_sensitive(controls->wall_a, is_walls);
+    gwy_table_hscale_set_sensitive(controls->wall_kn, is_walls);
+
+    gwy_table_hscale_set_sensitive(controls->mtip, is_bar);
+    gwy_table_hscale_set_sensitive(controls->bx, is_bar);
+    gwy_table_hscale_set_sensitive(controls->by, is_bar);
+    gwy_table_hscale_set_sensitive(controls->length, is_bar);
+
+}
+
+static void
+mfm_field_dialog_update(MfmFieldControls *controls,
+                  MfmFieldArgs *args)
+{
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->walls),
+                                 args->walls);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->update),
+                                 args->update);
+    gwy_enum_combo_box_set_active(GTK_COMBO_BOX(controls->out),
+                                  args->out);
+    gwy_enum_combo_box_set_active(GTK_COMBO_BOX(controls->probe),
+                                  args->probe);
+
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->height), args->height);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->thickness), args->thickness);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->sigma), args->sigma);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->wall_a), args->wall_a);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->wall_kn), args->wall_kn);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->mtip), args->mtip);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->bx), args->bx);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->by), args->by);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->length), args->length);
+
+}
+static const gchar walls_key[]       = "/module/mfm_field/walls";
+static const gchar update_key[]      = "/module/mfm_field/update";
+static const gchar out_key[]         = "/module/mfm_field/out";
+static const gchar probe_key[]       = "/module/mfm_field/probe";
+static const gchar height_key[]      = "/module/mfm_field/height";
+static const gchar thickness_key[]   = "/module/mfm_field/thickness";
+static const gchar sigma_key[]       = "/module/mfm_field/sigma";
+static const gchar wall_a_key[]      = "/module/mfm_field/wall_a";
+static const gchar wall_kn_key[]     = "/module/mfm_field/wall_kn";
+static const gchar mtip_key[]        = "/module/mfm_field/mtip";
+static const gchar bx_key[]          = "/module/mfm_field/bx";
+static const gchar by_key[]          = "/module/mfm_field/by";
+static const gchar length_key[]      = "/module/mfm_field/length";
+
+static void
+mfm_field_sanitize_args(MfmFieldArgs *args)
+{
+    args->walls = !!args->walls;
+    args->update = !!args->update;
+    args->out = CLAMP(args->out, 0, GWY_MFM_FIELD_OUTPUT_FORCE_DDX);
+    args->probe = CLAMP(args->probe, 0, GWY_MFM_PROBE_BAR);
+}
+
+static void
+mfm_field_load_args(GwyContainer *container,
+              MfmFieldArgs *args)
+{
+    *args = mfm_field_defaults;
+
+    gwy_container_gis_boolean_by_name(container, walls_key,
+                                      &args->walls);
+    gwy_container_gis_boolean_by_name(container, update_key,
+                                      &args->update);
+    gwy_container_gis_enum_by_name(container, probe_key, &args->probe);
+    gwy_container_gis_enum_by_name(container, out_key, &args->out);
+    gwy_container_gis_double_by_name(container, height_key, &args->height);
+    gwy_container_gis_double_by_name(container, thickness_key, &args->thickness);
+    gwy_container_gis_double_by_name(container, sigma_key, &args->sigma);
+    gwy_container_gis_double_by_name(container, wall_a_key, &args->wall_a);
+    gwy_container_gis_double_by_name(container, wall_kn_key, &args->wall_kn);
+    gwy_container_gis_double_by_name(container, mtip_key, &args->mtip);
+    gwy_container_gis_double_by_name(container, bx_key, &args->bx);
+    gwy_container_gis_double_by_name(container, by_key, &args->by);
+    gwy_container_gis_double_by_name(container, length_key, &args->length);
+
+
+    mfm_field_sanitize_args(args);
+}
+
+static void
+mfm_field_save_args(GwyContainer *container,
+              MfmFieldArgs *args)
+{
+    gwy_container_set_boolean_by_name(container, walls_key,
+                                      args->walls);
+    gwy_container_set_boolean_by_name(container, update_key,
+                                      args->update);
+    gwy_container_set_enum_by_name(container, probe_key, args->probe);
+    gwy_container_set_enum_by_name(container, out_key, args->out);
+    gwy_container_set_double_by_name(container, height_key, args->height);
+    gwy_container_set_double_by_name(container, thickness_key, args->thickness);
+    gwy_container_set_double_by_name(container, sigma_key, args->sigma);
+    gwy_container_set_double_by_name(container, wall_a_key, args->wall_a);
+    gwy_container_set_double_by_name(container, wall_kn_key, args->wall_kn);
+    gwy_container_set_double_by_name(container, mtip_key, args->mtip);
+    gwy_container_set_double_by_name(container, bx_key, args->bx);
+    gwy_container_set_double_by_name(container, by_key, args->by);
+    gwy_container_set_double_by_name(container, length_key, args->length);
+
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/process/mfm_findshift.c b/modules/process/mfm_findshift.c
new file mode 100644
index 0000000..7e7321a
--- /dev/null
+++ b/modules/process/mfm_findshift.c
@@ -0,0 +1,404 @@
+/*
+ *  @(#) $Id: mfm_findshift.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2017 David Necas (Yeti), Petr Klapetek.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <gtk/gtk.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libprocess/gwyprocesstypes.h>
+#include <libprocess/arithmetic.h>
+#include <libprocess/inttrans.h>
+#include <libprocess/stats.h>
+#include <libgwydgets/gwydgetutils.h>
+#include <libgwydgets/gwycombobox.h>
+#include <libgwydgets/gwystock.h>
+#include <libgwymodule/gwymodule-process.h>
+#include <app/gwymoduleutils.h>
+#include <app/gwyapp.h>
+#include "mfmops.h"
+#include "preview.h"
+
+#define MFM_FINDSHIFT_RUN_MODES (GWY_RUN_IMMEDIATE | GWY_RUN_INTERACTIVE)
+
+typedef struct {
+    gdouble start;
+    gdouble stop;
+    GwyAppDataId op1;
+    GwyAppDataId op2;
+} MfmFindshiftArgs;
+
+typedef struct {
+    MfmFindshiftArgs *args;
+    GtkObject *start;
+    GtkObject *stop;
+    GtkWidget *chooser_op2;
+} MfmFindshiftControls;
+
+static gboolean module_register             (void);
+static void     mfm_findshift               (GwyContainer *data,
+                                             GwyRunType run);
+static gboolean mfm_findshift_dialog        (MfmFindshiftArgs *args);
+
+static void     mfm_findshift_load_args     (GwyContainer *container,
+                                             MfmFindshiftArgs *args);
+static void     mfm_findshift_save_args     (GwyContainer *container,
+                                             MfmFindshiftArgs *args);
+static void     mfm_findshift_sanitize_args (MfmFindshiftArgs *args);
+static void     start_changed               (GtkAdjustment *adj,
+                                             MfmFindshiftControls *controls);
+static void     stop_changed                (GtkAdjustment *adj,
+                                             MfmFindshiftControls *controls);
+static void     mfm_findshift_dialog_update (MfmFindshiftControls *controls,
+                                             MfmFindshiftArgs *args);
+static void     mfm_findshift_data_changed  (GwyDataChooser *chooser,
+                                             GwyAppDataId *object);
+static gboolean mfm_findshift_data_filter   (GwyContainer *data,
+                                             gint id,
+                                             gpointer user_data);
+
+
+static GwyAppDataId op2_id = GWY_APP_DATA_ID_NONE;
+
+static const MfmFindshiftArgs mfm_findshift_defaults = {
+    10, 20, GWY_APP_DATA_ID_NONE, GWY_APP_DATA_ID_NONE,
+};
+
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION,
+    &module_register,
+    N_("Lift height difference estimation from data blur"),
+    "Petr Klapetek <klapetek at gwyddion.net>",
+    "1.1",
+    "David Nečas (Yeti) & Petr Klapetek",
+    "2017",
+};
+
+GWY_MODULE_QUERY2(module_info, mfm_findshift)
+
+static gboolean
+module_register(void)
+{
+    gwy_process_func_register("mfm_findshift",
+                              (GwyProcessFunc)&mfm_findshift,
+                              N_("/SPM M_odes/_MFM/_Estimate Shift in Z..."),
+                              NULL,
+                              MFM_FINDSHIFT_RUN_MODES,
+                              GWY_MENU_FLAG_DATA,
+                              N_("Estimate lift height difference in MFM data"));
+
+    return TRUE;
+}
+
+static void
+mfm_findshift(GwyContainer *data, GwyRunType run)
+{
+    GwyDataField *dfield1, *dfield2, *out;
+    GtkWidget *dialog;
+    MfmFindshiftArgs args;
+    gboolean ok;
+    gint newid;
+    GQuark quark;
+    GwyContainer *mydata;
+    gdouble diff, mindiff, shift, minshift=0;
+    gdouble shiftstep, shiftstart, shiftstop;
+    gint level;
+
+    g_return_if_fail(run & MFM_FINDSHIFT_RUN_MODES);
+
+    mfm_findshift_load_args(gwy_app_settings_get(), &args);
+
+    gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD_ID, &args.op1.id,
+                                     GWY_APP_CONTAINER_ID, &args.op1.datano,
+                                     0);
+
+    if (run == GWY_RUN_INTERACTIVE) {
+        ok = mfm_findshift_dialog(&args);
+        mfm_findshift_save_args(gwy_app_settings_get(), &args);
+        if (!ok)
+            return;
+    }
+
+    //do the computation
+
+    mydata = gwy_app_data_browser_get(args.op1.datano);
+    quark = gwy_app_get_data_key_for_id(args.op1.id);
+    dfield1 = GWY_DATA_FIELD(gwy_container_get_object(mydata, quark));
+
+    mydata = gwy_app_data_browser_get(args.op2.datano);
+    quark = gwy_app_get_data_key_for_id(args.op2.id);
+    dfield2 = GWY_DATA_FIELD(gwy_container_get_object(mydata, quark));
+
+
+    out = gwy_data_field_new_alike(dfield1, FALSE);
+
+    shiftstart = args.start*1e-9;
+    shiftstop = args.stop*1e-9;
+
+    if (shiftstop<shiftstart) {
+       shift = shiftstart;
+       shiftstart = shiftstop;
+       shiftstop = shift;
+    }
+
+    //simple brute force search for beginning
+    shiftstep = (shiftstop-shiftstart)/4.0;
+
+    gwy_app_wait_start(gwy_app_find_window_for_channel(data, args.op1.id),
+                       _("Searching..."));
+
+    for (level = 0; level < 10; level++) {
+        mindiff = G_MAXDOUBLE;
+        for (shift = shiftstart; shift <= shiftstop; shift += shiftstep) {
+            mfm_shift_z(dfield1, out, -shift);
+            gwy_data_field_subtract_fields(out, dfield2, out);
+            diff = gwy_data_field_get_rms(out);
+
+            if (diff<mindiff) {
+                minshift = shift;
+                mindiff = diff;
+            }
+        }
+
+        shiftstart = minshift - shiftstep;
+        shiftstop = minshift + shiftstep;
+        shiftstep = (shiftstop - shiftstart)/5.0;
+
+        gwy_app_wait_set_fraction((gdouble)level/10.0);
+
+        if (shiftstep < 0.1e-9)
+            break;
+    }
+
+    dialog = gtk_message_dialog_new(gwy_app_find_window_for_channel(data, args.op1.id),
+                                    GTK_DIALOG_DESTROY_WITH_PARENT,
+                                    GTK_MESSAGE_INFO,
+                                    GTK_BUTTONS_CLOSE,
+                                    "%s %g nm",
+                                    _("Estimated shift:"), minshift*1e9);
+    gtk_dialog_run(GTK_DIALOG(dialog));
+    gtk_widget_destroy(dialog);
+
+    mfm_shift_z(dfield1, out, -minshift);
+    gwy_data_field_subtract_fields(out, dfield2, out);
+
+    gwy_app_wait_finish();
+
+    newid = gwy_app_data_browser_add_data_field(out, data, TRUE);
+    gwy_app_sync_data_items(data, data, args.op1.id, newid, FALSE,
+                        GWY_DATA_ITEM_GRADIENT,
+                        GWY_DATA_ITEM_MASK_COLOR,
+                        0);
+
+    gwy_app_set_data_field_title(data, newid, _("Shifted field difference"));
+    gwy_app_channel_log_add_proc(data, args.op1.id, newid);
+
+    g_object_unref(out);
+}
+
+
+static gboolean
+mfm_findshift_dialog(MfmFindshiftArgs *args)
+{
+    GtkWidget *dialog, *table;
+    GwyDataChooser *chooser;
+    MfmFindshiftControls controls;
+    gint response, row;
+
+    controls.args = args;
+
+    dialog = gtk_dialog_new_with_buttons(_("Estimate Lift Height Shift"),
+                                         NULL, 0, NULL);
+    gtk_dialog_add_button(GTK_DIALOG(dialog), _("_Reset"), RESPONSE_RESET);
+    gtk_dialog_add_button(GTK_DIALOG(dialog),
+                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+    gtk_dialog_add_button(GTK_DIALOG(dialog),
+                          GTK_STOCK_OK, GTK_RESPONSE_OK);
+    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
+    gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
+
+    table = gtk_table_new(7, 3, FALSE);
+    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
+    gtk_table_set_col_spacings(GTK_TABLE(table), 6);
+    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
+    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table,
+                       FALSE, FALSE, 4);
+    row = 0;
+
+    controls.chooser_op2 = gwy_data_chooser_new_channels();
+    chooser = GWY_DATA_CHOOSER(controls.chooser_op2);
+    g_object_set_data(G_OBJECT(chooser), "dialog", dialog);
+    gwy_data_chooser_set_active_id(chooser, &args->op2);
+    gwy_data_chooser_set_filter(chooser,
+                                mfm_findshift_data_filter, &args->op1, NULL);
+    g_signal_connect(chooser, "changed",
+                     G_CALLBACK(mfm_findshift_data_changed), &args->op2);
+    mfm_findshift_data_changed(chooser, &args->op2);
+    gwy_table_attach_adjbar(table, row, _("Data to compare:"), NULL,
+                            GTK_OBJECT(chooser), GWY_HSCALE_WIDGET_NO_EXPAND);
+    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+    row++;
+
+    controls.start = gtk_adjustment_new(args->start, -1000, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Search _from:"), "nm",
+                            controls.start, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.start), "controls", &controls);
+    g_signal_connect(controls.start, "value-changed",
+                     G_CALLBACK(start_changed), &controls);
+    row++;
+
+    controls.stop = gtk_adjustment_new(args->stop, -1000, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Search _to:"), "nm",
+                            controls.stop, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.stop), "controls", &controls);
+    g_signal_connect(controls.stop, "value-changed",
+                     G_CALLBACK(stop_changed), &controls);
+    row++;
+
+    gtk_widget_show_all(dialog);
+    do {
+        response = gtk_dialog_run(GTK_DIALOG(dialog));
+        switch (response) {
+            case GTK_RESPONSE_CANCEL:
+            case GTK_RESPONSE_DELETE_EVENT:
+            gtk_widget_destroy(dialog);
+            case GTK_RESPONSE_NONE:
+            return FALSE;
+            break;
+
+            case GTK_RESPONSE_OK:
+            break;
+
+            case RESPONSE_RESET:
+            {
+                *args = mfm_findshift_defaults;
+                mfm_findshift_dialog_update(&controls, args);
+            }
+            break;
+
+            default:
+            g_assert_not_reached();
+            break;
+        }
+    } while (response != GTK_RESPONSE_OK);
+
+    gtk_widget_destroy(dialog);
+
+    return TRUE;
+}
+
+
+static void
+start_changed(GtkAdjustment *adj, MfmFindshiftControls *controls)
+{
+    controls->args->start = gtk_adjustment_get_value(adj);
+}
+
+static void
+stop_changed(GtkAdjustment *adj, MfmFindshiftControls *controls)
+{
+    controls->args->stop = gtk_adjustment_get_value(adj);
+}
+
+static void
+mfm_findshift_data_changed(GwyDataChooser *chooser,
+                           GwyAppDataId *object)
+{
+    GtkWidget *dialog;
+
+    gwy_data_chooser_get_active_id(chooser, object);
+    gwy_debug("data: %d %d", object->datano, object->id);
+
+    dialog = g_object_get_data(G_OBJECT(chooser), "dialog");
+    g_assert(GTK_IS_DIALOG(dialog));
+    gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK,
+                                      object->datano);
+}
+
+static gboolean
+mfm_findshift_data_filter(GwyContainer *data,
+                          gint id,
+                          gpointer user_data)
+{
+
+    GwyAppDataId *object = (GwyAppDataId*)user_data;
+    GwyDataField *op1, *op2;
+    GQuark quark;
+
+    quark = gwy_app_get_data_key_for_id(id);
+    op1 = GWY_DATA_FIELD(gwy_container_get_object(data, quark));
+
+    data = gwy_app_data_browser_get(object->datano);
+    quark = gwy_app_get_data_key_for_id(object->id);
+    op2 = GWY_DATA_FIELD(gwy_container_get_object(data, quark));
+
+    /* It does not make sense to crosscorrelate with itself */
+    if (op1 == op2)
+        return FALSE;
+
+    return !gwy_data_field_check_compatibility(op1, op2,
+                                               GWY_DATA_COMPATIBILITY_RES
+                                               | GWY_DATA_COMPATIBILITY_REAL
+                                               | GWY_DATA_COMPATIBILITY_LATERAL
+                                               | GWY_DATA_COMPATIBILITY_VALUE);
+}
+
+static void
+mfm_findshift_dialog_update(MfmFindshiftControls *controls,
+                            MfmFindshiftArgs *args)
+{
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->start), args->start);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->stop), args->stop);
+
+}
+
+static const gchar start_key[] = "/module/mfm_findshift/start";
+static const gchar stop_key[]  = "/module/mfm_findshift/stop";
+
+static void
+mfm_findshift_sanitize_args(MfmFindshiftArgs *args)
+{
+    gwy_app_data_id_verify_channel(&args->op2);
+}
+
+static void
+mfm_findshift_load_args(GwyContainer *container,
+              MfmFindshiftArgs *args)
+{
+    *args = mfm_findshift_defaults;
+
+    gwy_container_gis_double_by_name(container, start_key, &args->start);
+    gwy_container_gis_double_by_name(container, stop_key, &args->stop);
+    args->op2 = op2_id;
+
+    mfm_findshift_sanitize_args(args);
+}
+
+static void
+mfm_findshift_save_args(GwyContainer *container,
+              MfmFindshiftArgs *args)
+{
+    op2_id = args->op2;
+    gwy_container_set_double_by_name(container, start_key, args->start);
+    gwy_container_set_double_by_name(container, stop_key, args->stop);
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/process/mfm_parallel.c b/modules/process/mfm_parallel.c
new file mode 100644
index 0000000..e502b25
--- /dev/null
+++ b/modules/process/mfm_parallel.c
@@ -0,0 +1,937 @@
+/*
+ *  @(#) $Id: mfm_parallel.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2017 David Necas (Yeti), Petr Klapetek.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <string.h>
+#include <gtk/gtk.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libgwyddion/gwyrandgenset.h>
+#include <libprocess/stats.h>
+#include <libprocess/arithmetic.h>
+#include <libgwydgets/gwyradiobuttons.h>
+#include <libgwydgets/gwystock.h>
+#include <libgwymodule/gwymodule-process.h>
+#include <app/gwyapp.h>
+#include "preview.h"
+#include "dimensions.h"
+#include "mfmops.h"
+
+#define MFM_PARALLEL_RUN_MODES (GWY_RUN_IMMEDIATE | GWY_RUN_INTERACTIVE)
+
+enum {
+    PAGE_DIMENSIONS = 0,
+    PAGE_GENERATOR  = 1,
+    PAGE_NPAGES
+};
+
+typedef enum {
+    GWY_MFM_PARALLEL_OUTPUT_HX   = 0,
+    GWY_MFM_PARALLEL_OUTPUT_HZ   = 1,
+    GWY_MFM_PARALLEL_OUTPUT_FORCE   = 2,
+    GWY_MFM_PARALLEL_OUTPUT_FORCE_DX = 3,
+    GWY_MFM_PARALLEL_OUTPUT_FORCE_DDX  = 4
+} GwyMfmParallelOutputType;
+
+typedef struct {
+    gint active_page;
+    gboolean update;
+    GwyMfmParallelOutputType out;
+    GwyMfmProbeType probe;
+    gdouble height;
+    gdouble thickness;
+    gdouble magnetisation;
+    gdouble size_a;
+    gdouble size_b;
+    gdouble size_c;
+    gdouble mtip;
+    gdouble bx;
+    gdouble by;
+    gdouble length;
+
+} MfmParallelArgs;
+
+typedef struct {
+    MfmParallelArgs *args;
+    GwyDimensions *dims;
+    GtkWidget *dialog;
+    GtkWidget *view;
+    GtkWidget *update;
+    GtkWidget *update_now;
+    GtkWidget *out;
+    GtkWidget *probe;
+    GtkObject *height;
+    GtkObject *thickness;
+    GtkObject *magnetisation;
+    GtkObject *mtip;
+    GtkObject *bx;
+    GtkObject *by;
+    GtkObject *length;
+    GtkObject *size_a;
+    GtkObject *size_b;
+    GtkObject *size_c;
+    GtkTable *table;
+    GwyContainer *mydata;
+    GwyDataField *surface;
+    gdouble pxsize;
+    gdouble zscale;
+    gboolean in_init;
+    gulong sid;
+} MfmParallelControls;
+
+static gboolean      module_register           (void);
+static void          mfm_parallel               (GwyContainer *data,
+                                                GwyRunType run);
+static void          run_noninteractive        (MfmParallelArgs *args,
+                                                const GwyDimensionArgs *dimsargs,
+                                                GwyContainer *data,
+                                                GwyDataField *dfield,
+                                                gint oldid,
+                                                GQuark quark);
+static gboolean      mfm_parallel_dialog        (MfmParallelArgs *args,
+                                                GwyDimensionArgs *dimsargs,
+                                                GwyContainer *data,
+                                                GwyDataField *dfield,
+                                                gint id);
+static void          update_controls           (MfmParallelControls *controls,
+                                                MfmParallelArgs *args);
+static void          page_switched             (MfmParallelControls *controls,
+                                                GtkNotebookPage *page,
+                                                gint pagenum);
+static void          update_values             (MfmParallelControls *controls);
+static void          mfm_parallel_invalidate    (MfmParallelControls *controls);
+static gboolean      preview_gsource           (gpointer user_data);
+static void          preview                   (MfmParallelControls *controls);
+static void          mfm_parallel_do            (const MfmParallelArgs *args,
+                                                const GwyDimensionArgs *dimsargs,
+                                                GwyDataField *dfield);
+static void          mfm_parallel_load_args     (GwyContainer *container,
+                                                MfmParallelArgs *args,
+                                                GwyDimensionArgs *dimsargs);
+static void          mfm_parallel_save_args     (GwyContainer *container,
+                                                const MfmParallelArgs *args,
+                                                const GwyDimensionArgs *dimsargs);
+static void          probe_changed             (GtkComboBox *combo,
+                                                MfmParallelControls *controls);
+static void          out_changed               (GtkComboBox *combo,
+                                                MfmParallelControls *controls);
+
+static void          update_sensitivity        (MfmParallelControls *controls);
+static void          xyunits_changed           (MfmParallelControls *controls);
+
+
+
+#define GWY_SYNTH_CONTROLS MfmParallelControls
+#define GWY_SYNTH_INVALIDATE(controls) \
+    mfm_parallel_invalidate(controls)
+
+#include "synth.h"
+
+
+static const MfmParallelArgs mfm_parallel_defaults = {
+    PAGE_DIMENSIONS, TRUE,
+    GWY_MFM_PARALLEL_OUTPUT_HZ,
+    GWY_MFM_PROBE_CHARGE,
+    100, 100, 1,
+    200, 200, 10, 1,
+    10, 10, 500,
+
+};
+
+static const GwyDimensionArgs dims_defaults = MFM_DIMENSION_ARGS_INIT;
+
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION,
+    &module_register,
+    N_("Simulation of parallel magnetic media"),
+    "Petr Klapetek <klapetek at gwyddion.net>",
+    "1.1",
+    "David Nečas (Yeti) & Petr Klapetek",
+    "2017",
+};
+
+GWY_MODULE_QUERY2(module_info, mfm_parallel)
+
+static gboolean
+module_register(void)
+{
+    gwy_process_func_register("mfm_parallel",
+                              (GwyProcessFunc)&mfm_parallel,
+                              N_("/SPM M_odes/_MFM/Para_llel Media Field..."),
+                              NULL,
+                              MFM_PARALLEL_RUN_MODES,
+                              0,
+                              N_("Simulate stray field above parallel magnetic medium"));
+
+    return TRUE;
+}
+
+
+static void
+mfm_parallel(GwyContainer *data, GwyRunType run)
+{
+    MfmParallelArgs args;
+    GwyDimensionArgs dimsargs;
+    GwyDataField *dfield;
+    GQuark quark;
+    gint id;
+
+    g_return_if_fail(run & MFM_PARALLEL_RUN_MODES);
+    mfm_parallel_load_args(gwy_app_settings_get(), &args, &dimsargs);
+
+    //this should be always in meters at start
+    dimsargs.xyunits = g_strdup("m");
+
+    gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &dfield,
+                                     GWY_APP_DATA_FIELD_ID, &id,
+                                     GWY_APP_DATA_FIELD_KEY, &quark,
+                                     0);
+
+    if (run == GWY_RUN_IMMEDIATE
+        || mfm_parallel_dialog(&args, &dimsargs, data, dfield, id))
+        run_noninteractive(&args, &dimsargs, data, dfield, id, quark);
+
+    if (run == GWY_RUN_INTERACTIVE)
+        mfm_parallel_save_args(gwy_app_settings_get(), &args, &dimsargs);
+
+    gwy_dimensions_free_args(&dimsargs);
+}
+
+static void
+run_noninteractive(MfmParallelArgs *args,
+                   const GwyDimensionArgs *dimsargs,
+                   GwyContainer *data,
+                   GwyDataField *dfield,
+                   gint oldid,
+                   GQuark quark)
+{
+    GwySIUnit *siunit;
+    gboolean replace = dimsargs->replace && dfield;
+    gboolean add = dimsargs->add && dfield;
+    gint newid;
+
+    if (replace) {
+        /* Always take a reference so that we can always unref. */
+        g_object_ref(dfield);
+
+        gwy_app_undo_qcheckpointv(data, 1, &quark);
+        if (!add)
+            gwy_data_field_clear(dfield);
+
+        gwy_app_channel_log_add_proc(data, oldid, oldid);
+    }
+    else {
+        if (add)
+            dfield = gwy_data_field_duplicate(dfield);
+        else {
+            gdouble mag = pow10(dimsargs->xypow10) * dimsargs->measure;
+            dfield = gwy_data_field_new(dimsargs->xres, dimsargs->yres,
+                                        mag*dimsargs->xres, mag*dimsargs->yres,
+                                        TRUE);
+
+            siunit = gwy_data_field_get_si_unit_xy(dfield);
+            gwy_si_unit_set_from_string(siunit, dimsargs->xyunits);
+
+            siunit = gwy_data_field_get_si_unit_z(dfield);
+            gwy_si_unit_set_from_string(siunit, dimsargs->zunits);
+        }
+    }
+
+    mfm_parallel_do(args, dimsargs, dfield);
+
+    if (replace)
+        gwy_data_field_data_changed(dfield);
+    else {
+        if (data) {
+            newid = gwy_app_data_browser_add_data_field(dfield, data, TRUE);
+            if (oldid != -1)
+                gwy_app_sync_data_items(data, data, oldid, newid, FALSE,
+                                        GWY_DATA_ITEM_GRADIENT,
+                                        0);
+        }
+        else {
+            newid = 0;
+            data = gwy_container_new();
+            gwy_container_set_object(data, gwy_app_get_data_key_for_id(newid),
+                                     dfield);
+            gwy_app_data_browser_add(data);
+            gwy_app_data_browser_reset_visibility(data,
+                                                  GWY_VISIBILITY_RESET_SHOW_ALL);
+            g_object_unref(data);
+        }
+
+        gwy_app_set_data_field_title(data, newid, _("Simulated field"));
+        gwy_app_channel_log_add_proc(data, add ? oldid : -1, newid);
+    }
+    g_object_unref(dfield);
+}
+
+static gboolean
+mfm_parallel_dialog(MfmParallelArgs *args,
+                 GwyDimensionArgs *dimsargs,
+                 GwyContainer *data,
+                 GwyDataField *dfield_template,
+                 gint id)
+{
+    GtkWidget *dialog, *table, *vbox, *hbox, *notebook;
+    MfmParallelControls controls;
+    GwyDataField *dfield;
+    gboolean finished;
+    gint response;
+    gint row;
+    static const GwyEnum mfm_parallel_outputs[] = {
+        {
+            "H<sub>x</sub>",
+            GWY_MFM_PARALLEL_OUTPUT_HX,
+        },
+        {
+            "H<sub>z</sub>",
+            GWY_MFM_PARALLEL_OUTPUT_HZ,
+        },
+        {
+            "F<sub>z</sub>",
+            GWY_MFM_PARALLEL_OUTPUT_FORCE,
+        },
+        {
+            "dF<sub>z</sub>/dz",
+            GWY_MFM_PARALLEL_OUTPUT_FORCE_DX,
+        },
+        {
+            "d<sup>2</sup>F<sub>z</sub>/dz<sup>2</sup>",
+            GWY_MFM_PARALLEL_OUTPUT_FORCE_DDX,
+        },
+    };
+    static const GwyEnum mfm_parallel_probes[] = {
+        { N_("Point charge"), GWY_MFM_PROBE_CHARGE, },
+        { N_("Bar"),          GWY_MFM_PROBE_BAR,    },
+    };
+
+    gwy_clear(&controls, 1);
+    controls.in_init = TRUE;
+    controls.args = args;
+    dialog = gtk_dialog_new_with_buttons(_("Parallel Media Stray Field"),
+                                         NULL, 0,
+                                         _("_Reset"), RESPONSE_RESET,
+                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                         GTK_STOCK_OK, GTK_RESPONSE_OK,
+                                         NULL);
+    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
+    gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
+    controls.dialog = dialog;
+
+    hbox = gtk_hbox_new(FALSE, 2);
+    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox,
+                       FALSE, FALSE, 4);
+
+    vbox = gtk_vbox_new(FALSE, 4);
+    gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 4);
+
+    controls.mydata = gwy_container_new();
+    dfield = gwy_data_field_new(PREVIEW_SIZE, PREVIEW_SIZE,
+                                pow10(dimsargs->xypow10)*dimsargs->measure*PREVIEW_SIZE,
+                                pow10(dimsargs->xypow10)*dimsargs->measure*PREVIEW_SIZE,
+                                TRUE);
+    gwy_container_set_object_by_name(controls.mydata, "/0/data", dfield);
+    if (dfield_template) {
+        gwy_app_sync_data_items(data, controls.mydata, id, 0, FALSE,
+                                GWY_DATA_ITEM_PALETTE,
+                                0);
+        controls.surface = gwy_synth_surface_for_preview(dfield_template,
+                                                         PREVIEW_SIZE);
+        controls.zscale = gwy_data_field_get_rms(dfield_template);
+    }
+    controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, FALSE);
+    gtk_box_pack_start(GTK_BOX(vbox), controls.view, FALSE, FALSE, 0);
+
+    gtk_box_pack_start(GTK_BOX(vbox),
+                       gwy_synth_instant_updates_new(&controls,
+                                                     &controls.update_now,
+                                                     &controls.update,
+                                                     &args->update),
+                       FALSE, FALSE, 0);
+    g_signal_connect_swapped(controls.update_now, "clicked",
+                             G_CALLBACK(preview), &controls);
+
+
+
+    notebook = gtk_notebook_new();
+    gtk_box_pack_start(GTK_BOX(hbox), notebook, TRUE, TRUE, 4);
+    g_signal_connect_swapped(notebook, "switch-page",
+                             G_CALLBACK(page_switched), &controls);
+
+    controls.dims = gwy_dimensions_new(dimsargs, dfield_template);
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
+                             gwy_dimensions_get_widget(controls.dims),
+                             gtk_label_new(_("Dimensions")));
+    if (controls.dims->add)
+        g_signal_connect_swapped(controls.dims->add, "toggled",
+                                 G_CALLBACK(mfm_parallel_invalidate), &controls);
+
+    g_signal_connect_swapped(controls.dims->xypow10, "changed",
+                             G_CALLBACK(xyunits_changed), &controls);
+    g_signal_connect_swapped(controls.dims->xreal, "value-changed",
+                             G_CALLBACK(xyunits_changed), &controls);
+    g_signal_connect_swapped(controls.dims->yreal, "value-changed",
+                             G_CALLBACK(xyunits_changed), &controls);
+
+    gtk_widget_set_no_show_all(controls.dims->xyunits, TRUE);
+    gtk_widget_hide(controls.dims->xyunits);
+    gtk_widget_set_no_show_all(controls.dims->zunits, TRUE);
+    gtk_widget_hide(controls.dims->zunits);
+    gtk_widget_set_no_show_all(controls.dims->zpow10, TRUE);
+    gtk_widget_hide(controls.dims->zpow10);
+    gtk_widget_set_no_show_all(controls.dims->unit_z_label, TRUE);
+    gtk_widget_hide(controls.dims->unit_z_label);
+
+    table = gtk_table_new(12 + (dfield_template ? 1 : 0), 3, FALSE);
+    controls.table = GTK_TABLE(table);
+    gtk_table_set_row_spacings(controls.table, 2);
+    gtk_table_set_col_spacings(controls.table, 6);
+    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table,
+                             gtk_label_new(_("Generator")));
+    row = 0;
+
+    controls.height = gtk_adjustment_new(args->height, 1, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("_Output plane height:"), "nm",
+                            controls.height, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.height), "controls", &controls);
+    g_signal_connect_swapped(controls.height, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+    controls.thickness = gtk_adjustment_new(args->thickness, 0, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("_Film thickness:"), "nm",
+                            controls.thickness, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.thickness), "controls", &controls);
+    g_signal_connect_swapped(controls.thickness, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+    controls.magnetisation = gtk_adjustment_new(args->magnetisation, 1, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("_Remanent magnetization:"), "kA/m",
+                            controls.magnetisation, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.magnetisation), "controls", &controls);
+    g_signal_connect_swapped(controls.magnetisation, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+    controls.size_a = gtk_adjustment_new(args->size_a, 1, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Size _A (dir. left):"), "nm",
+                            controls.size_a, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.size_a), "controls", &controls);
+    g_signal_connect_swapped(controls.size_a, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+    controls.size_b = gtk_adjustment_new(args->size_b, 1, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Size _B (dir. right):"), "nm",
+                            controls.size_b, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.size_b), "controls", &controls);
+    g_signal_connect_swapped(controls.size_b, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+    controls.size_c = gtk_adjustment_new(args->size_c, 1, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("_Gap size:"), "nm",
+                            controls.size_c, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.size_c), "controls", &controls);
+    g_signal_connect_swapped(controls.size_c, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+    controls.out = gwy_enum_combo_box_new(mfm_parallel_outputs,
+                                          G_N_ELEMENTS(mfm_parallel_outputs),
+                                          G_CALLBACK(out_changed),
+                                          &controls, args->out, TRUE);
+    gwy_table_attach_adjbar(table, row, _("Output _type:"), NULL,
+                            GTK_OBJECT(controls.out),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    row++;
+
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    controls.probe = gwy_enum_combo_box_new(mfm_parallel_probes,
+                                            G_N_ELEMENTS(mfm_parallel_probes),
+                                            G_CALLBACK(probe_changed),
+                                            &controls, args->probe, TRUE);
+    gwy_table_attach_adjbar(table, row, _("_Probe type:"), NULL,
+                            GTK_OBJECT(controls.probe),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    row++;
+
+    controls.mtip = gtk_adjustment_new(args->mtip, 1, 10000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Tip _magnetization:"), "kA/m",
+                            controls.mtip, GWY_HSCALE_LOG);
+    g_object_set_data(G_OBJECT(controls.mtip), "controls", &controls);
+    g_signal_connect_swapped(controls.mtip, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+
+    controls.bx = gtk_adjustment_new(args->bx, 1, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Bar width _x:"), "nm",
+                            controls.bx, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.bx), "controls", &controls);
+    g_signal_connect_swapped(controls.bx, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+
+    controls.by = gtk_adjustment_new(args->by, 1, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Bar width _y:"), "nm",
+                            controls.by, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.by), "controls", &controls);
+    g_signal_connect_swapped(controls.by, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+
+    controls.length = gtk_adjustment_new(args->length, 1, 10000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Bar length (_z):"), "nm",
+                            controls.length, GWY_HSCALE_LOG);
+    g_object_set_data(G_OBJECT(controls.length), "controls", &controls);
+    g_signal_connect_swapped(controls.length, "value-changed",
+                     G_CALLBACK(update_values), &controls);
+    row++;
+
+    update_sensitivity(&controls);
+
+    gtk_widget_show_all(dialog);
+    controls.in_init = FALSE;
+    /* Must be done when widgets are shown, see GtkNotebook docs */
+    gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), args->active_page);
+    update_values(&controls);
+    mfm_parallel_invalidate(&controls);
+
+    finished = FALSE;
+    while (!finished) {
+        response = gtk_dialog_run(GTK_DIALOG(dialog));
+        switch (response) {
+            case GTK_RESPONSE_CANCEL:
+            case GTK_RESPONSE_DELETE_EVENT:
+            case GTK_RESPONSE_OK:
+            gtk_widget_destroy(dialog);
+            case GTK_RESPONSE_NONE:
+            finished = TRUE;
+            break;
+
+            case RESPONSE_RESET:
+            {
+                gboolean temp = args->update;
+                gint temp2 = args->active_page;
+                *args = mfm_parallel_defaults;
+                args->active_page = temp2;
+                args->update = temp;
+            }
+            controls.in_init = TRUE;
+            update_controls(&controls, args);
+            controls.in_init = FALSE;
+            if (args->update)
+                preview(&controls);
+            break;
+
+            default:
+            g_assert_not_reached();
+            break;
+        }
+    }
+
+    if (controls.sid) {
+        g_source_remove(controls.sid);
+        controls.sid = 0;
+    }
+    g_object_unref(controls.mydata);
+    GWY_OBJECT_UNREF(controls.surface);
+    gwy_dimensions_free(controls.dims);
+
+    return response == GTK_RESPONSE_OK;
+}
+
+
+static void
+update_controls(MfmParallelControls *controls,
+                MfmParallelArgs *args)
+{
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->update),
+                                 args->update);
+
+    gwy_enum_combo_box_set_active(GTK_COMBO_BOX(controls->out),
+                                  args->out);
+    gwy_enum_combo_box_set_active(GTK_COMBO_BOX(controls->probe),
+                                  args->probe);
+
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->height), args->height);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->thickness), args->thickness);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->magnetisation), args->magnetisation);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->size_a), args->size_a);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->size_b), args->size_b);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->size_c), args->size_c);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->mtip), args->mtip);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->bx), args->bx);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->by), args->by);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->length), args->length);
+
+}
+
+static void
+update_sensitivity(MfmParallelControls *controls)
+{
+    gboolean is_force = TRUE, is_bar = FALSE;
+
+    if (controls->args->out == GWY_MFM_PARALLEL_OUTPUT_HZ
+        || controls->args->out == GWY_MFM_PARALLEL_OUTPUT_HX)
+        is_force = FALSE;
+    if (controls->args->probe == GWY_MFM_PROBE_BAR)
+        is_bar = TRUE;
+    if (!is_force)
+        is_bar = FALSE;
+
+    gwy_table_hscale_set_sensitive(GTK_OBJECT(controls->probe), is_force);
+    gwy_table_hscale_set_sensitive(controls->mtip, is_bar);
+    gwy_table_hscale_set_sensitive(controls->bx, is_bar);
+    gwy_table_hscale_set_sensitive(controls->by, is_bar);
+    gwy_table_hscale_set_sensitive(controls->length, is_bar);
+}
+
+static void
+xyunits_changed(MfmParallelControls *controls)
+{
+    gdouble mag;
+    GwyDataField *dfield;
+
+    update_values(controls);
+
+    dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata,
+                                                             "/0/data"));
+
+    mag = pow10(controls->dims->args->xypow10) * controls->dims->args->measure;
+    gwy_data_field_set_xreal(dfield, mag*controls->dims->args->xres);
+    gwy_data_field_set_yreal(dfield, mag*controls->dims->args->yres);
+
+    mfm_parallel_invalidate(controls);
+}
+
+
+
+static void
+probe_changed(GtkComboBox *combo,
+                MfmParallelControls *controls)
+{
+    controls->args->probe = gwy_enum_combo_box_get_active(combo);
+    update_sensitivity(controls);
+    mfm_parallel_invalidate(controls);
+}
+
+static void
+out_changed(GtkComboBox *combo,
+                MfmParallelControls *controls)
+{
+    controls->args->out = gwy_enum_combo_box_get_active(combo);
+    update_sensitivity(controls);
+    mfm_parallel_invalidate(controls);
+}
+
+
+static void
+page_switched(MfmParallelControls *controls,
+              G_GNUC_UNUSED GtkNotebookPage *page,
+              gint pagenum)
+{
+    if (controls->in_init)
+        return;
+
+    controls->args->active_page = pagenum;
+
+    if (pagenum == PAGE_GENERATOR)
+        update_values(controls);
+}
+
+static void
+update_values(MfmParallelControls *controls)
+{
+    GwyDimensions *dims = controls->dims;
+
+    controls->pxsize = dims->args->measure * pow10(dims->args->xypow10);
+
+    controls->args->magnetisation = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->magnetisation));
+    controls->args->size_a = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->size_a));
+    controls->args->size_b = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->size_b));
+    controls->args->size_c = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->size_c));
+    controls->args->height = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->height));
+    controls->args->thickness = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->thickness));
+    controls->args->mtip = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->mtip));
+    controls->args->bx = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->bx));
+    controls->args->by = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->by));
+    controls->args->length = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->length));
+
+    controls->args->probe = gwy_enum_combo_box_get_active(GTK_COMBO_BOX(controls->probe));
+    controls->args->out = gwy_enum_combo_box_get_active(GTK_COMBO_BOX(controls->out));
+
+    update_sensitivity(controls);
+    mfm_parallel_invalidate(controls);
+
+
+}
+
+static void
+mfm_parallel_invalidate(MfmParallelControls *controls)
+{
+    /* create preview if instant updates are on */
+    if (controls->args->update && !controls->in_init && !controls->sid) {
+        controls->sid = g_idle_add_full(G_PRIORITY_LOW, preview_gsource,
+                                        controls, NULL);
+    }
+}
+
+static gboolean
+preview_gsource(gpointer user_data)
+{
+    MfmParallelControls *controls = (MfmParallelControls*)user_data;
+    controls->sid = 0;
+
+    preview(controls);
+
+    return FALSE;
+}
+
+static void
+preview(MfmParallelControls *controls)
+{
+    MfmParallelArgs *args = controls->args;
+    GwyDataField *dfield;
+
+    dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata,
+                                                             "/0/data"));
+    if (controls->dims->args->add && controls->surface)
+        gwy_data_field_copy(controls->surface, dfield, FALSE);
+    else
+        gwy_data_field_clear(dfield);
+
+    mfm_parallel_do(args, controls->dims->args, dfield);
+
+    gwy_data_field_data_changed(dfield);
+}
+
+static void
+mfm_parallel_do(const MfmParallelArgs *args,
+               G_GNUC_UNUSED const GwyDimensionArgs *dimsargs,
+               GwyDataField *dfield)
+{
+    GwyDataField  *fz=NULL, *fza, *fzb, *fzc;
+    gdouble dd = 1.0e-9;
+
+
+    if (args->out == GWY_MFM_PARALLEL_OUTPUT_HX) {
+        mfm_parallel_create_h(dfield, args->height*1e-9, args->size_a*1e-9,
+                       args->size_b*1e-9, args->size_c*1e-9, args->magnetisation,
+                       args->thickness*1e-9, GWY_MFM_COMPONENT_HX);
+        gwy_data_field_set_si_unit_z(dfield, gwy_si_unit_new("A/m"));
+    }
+    else if (args->out == GWY_MFM_PARALLEL_OUTPUT_HZ || args->out == GWY_MFM_PARALLEL_OUTPUT_FORCE)
+    {
+        mfm_parallel_create_h(dfield, args->height*1e-9, args->size_a*1e-9,
+                       args->size_b*1e-9, args->size_c*1e-9, args->magnetisation,
+                       args->thickness*1e-9, GWY_MFM_COMPONENT_HZ);
+
+        if (args->out == GWY_MFM_PARALLEL_OUTPUT_FORCE)
+        {
+            fz = gwy_data_field_new_alike(dfield, TRUE);
+
+            mfm_perpendicular_force_from_field(dfield, fz,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+            gwy_data_field_copy(fz, dfield, FALSE);
+            gwy_data_field_set_si_unit_z(dfield, gwy_si_unit_new("N"));
+            gwy_object_unref(fz);
+        } else {
+            gwy_data_field_set_si_unit_z(dfield, gwy_si_unit_new("A/m"));
+        }
+    }
+
+    else if (args->out == GWY_MFM_PARALLEL_OUTPUT_FORCE_DX) //this is done numerically now
+    {
+        fza = gwy_data_field_new_alike(dfield, TRUE);
+        fzb = gwy_data_field_new_alike(dfield, TRUE);
+        fz = gwy_data_field_new_alike(dfield, TRUE);
+
+
+        mfm_parallel_create_h(dfield, args->height*1e-9-dd, args->size_a*1e-9,
+                       args->size_b*1e-9, args->size_c*1e-9, args->magnetisation,
+                       args->thickness*1e-9, GWY_MFM_COMPONENT_HZ);
+
+        mfm_perpendicular_force_from_field(dfield, fza,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+
+        mfm_parallel_create_h(dfield, args->height*1e-9+dd, args->size_a*1e-9,
+                       args->size_b*1e-9, args->size_c*1e-9, args->magnetisation,
+                       args->thickness*1e-9, GWY_MFM_COMPONENT_HZ);
+
+        mfm_perpendicular_force_from_field(dfield, fzb,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+
+        gwy_data_field_subtract_fields(fz, fza, fzb);
+        gwy_data_field_multiply(fz, 0.5/dd);
+
+        gwy_object_unref(fza);
+        gwy_object_unref(fzb);
+
+        gwy_data_field_copy(fz, dfield, FALSE);
+        gwy_data_field_set_si_unit_z(dfield, gwy_si_unit_new("N/m"));
+        gwy_object_unref(fz);
+
+    }
+    else if (args->out == GWY_MFM_PARALLEL_OUTPUT_FORCE_DDX) //this is done numerically now
+    {
+        fza = gwy_data_field_new_alike(dfield, TRUE);
+        fzb = gwy_data_field_new_alike(dfield, TRUE);
+        fzc = gwy_data_field_new_alike(dfield, TRUE);
+        fz = gwy_data_field_new_alike(dfield, TRUE);
+
+
+        mfm_parallel_create_h(dfield, args->height*1e-9-dd, args->size_a*1e-9,
+                       args->size_b*1e-9, args->size_c*1e-9, args->magnetisation,
+                       args->thickness*1e-9, GWY_MFM_COMPONENT_HZ);
+
+        mfm_perpendicular_force_from_field(dfield, fza,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+
+        mfm_parallel_create_h(dfield, args->height*1e-9, args->size_a*1e-9,
+                       args->size_b*1e-9, args->size_c*1e-9, args->magnetisation,
+                       args->thickness*1e-9, GWY_MFM_COMPONENT_HZ);
+
+        mfm_perpendicular_force_from_field(dfield, fzb,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+
+        mfm_parallel_create_h(dfield, args->height*1e-9+dd, args->size_a*1e-9,
+                       args->size_b*1e-9, args->size_c*1e-9, args->magnetisation,
+                       args->thickness*1e-9, GWY_MFM_COMPONENT_HZ);
+
+        mfm_perpendicular_force_from_field(dfield, fzc,
+                                  args->probe, args->mtip*1e3,
+                                  args->bx*1e-9, args->by*1e-9, args->length*1e-9);
+
+        gwy_data_field_multiply(fzb, 2.0);
+        gwy_data_field_sum_fields(fz, fza, fzc);
+        gwy_data_field_subtract_fields(fz, fz, fzb);
+
+        gwy_data_field_multiply(fz, 1.0/(dd*dd));
+
+        gwy_object_unref(fza);
+        gwy_object_unref(fzb);
+        gwy_object_unref(fzc);
+
+        gwy_data_field_copy(fz, dfield, FALSE);
+        gwy_data_field_set_si_unit_z(dfield, gwy_si_unit_new("N/m²"));
+        gwy_object_unref(fz);
+
+     }
+}
+
+
+static const gchar prefix[]            = "/module/mfm_parallel";
+static const gchar active_page_key[]   = "/module/mfm_parallel/active_page";
+static const gchar update_key[]        = "/module/mfm_parallel/update";
+static const gchar out_key[]           = "/module/mfm_parallel/out";
+static const gchar probe_key[]         = "/module/mfm_parallel/probe";
+static const gchar height_key[]        = "/module/mfm_parallel/height";
+static const gchar thickness_key[]     = "/module/mfm_parallel/thickness";
+static const gchar magnetisation_key[] = "/module/mfm_parallel/magnetisation";
+static const gchar size_a_key[]        = "/module/mfm_parallel/size_a";
+static const gchar size_b_key[]        = "/module/mfm_parallel/size_b";
+static const gchar size_c_key[]        = "/module/mfm_parallel/size_c";
+static const gchar mtip_key[]          = "/module/mfm_parallel/mtip";
+static const gchar bx_key[]            = "/module/mfm_parallel/bx";
+static const gchar by_key[]            = "/module/mfm_parallel/by";
+static const gchar length_key[]        = "/module/mfm_parallel/length";
+
+
+static void
+mfm_parallel_sanitize_args(MfmParallelArgs *args)
+{
+    args->active_page = CLAMP(args->active_page,
+                              PAGE_DIMENSIONS, PAGE_NPAGES-1);
+    args->update = !!args->update;
+    args->out = CLAMP(args->out, 0, GWY_MFM_PARALLEL_OUTPUT_FORCE_DDX);
+    args->probe = CLAMP(args->probe, 0, GWY_MFM_PROBE_BAR);
+}
+
+static void
+mfm_parallel_load_args(GwyContainer *container,
+                      MfmParallelArgs *args,
+                      GwyDimensionArgs *dimsargs)
+{
+    *args = mfm_parallel_defaults;
+
+    gwy_container_gis_int32_by_name(container, active_page_key,
+                                    &args->active_page);
+    gwy_container_gis_boolean_by_name(container, update_key, &args->update);
+
+    gwy_container_gis_enum_by_name(container, probe_key, &args->probe);
+    gwy_container_gis_enum_by_name(container, out_key, &args->out);
+    gwy_container_gis_double_by_name(container, height_key, &args->height);
+    gwy_container_gis_double_by_name(container, thickness_key, &args->thickness);
+    gwy_container_gis_double_by_name(container, magnetisation_key, &args->magnetisation);
+    gwy_container_gis_double_by_name(container, size_a_key, &args->size_a);
+    gwy_container_gis_double_by_name(container, size_b_key, &args->size_b);
+    gwy_container_gis_double_by_name(container, size_c_key, &args->size_c);
+    gwy_container_gis_double_by_name(container, mtip_key, &args->mtip);
+    gwy_container_gis_double_by_name(container, bx_key, &args->bx);
+    gwy_container_gis_double_by_name(container, by_key, &args->by);
+    gwy_container_gis_double_by_name(container, length_key, &args->length);
+
+    mfm_parallel_sanitize_args(args);
+
+    gwy_clear(dimsargs, 1);
+    gwy_dimensions_copy_args(&dims_defaults, dimsargs);
+    gwy_dimensions_load_args(dimsargs, container, prefix);
+}
+
+static void
+mfm_parallel_save_args(GwyContainer *container,
+                      const MfmParallelArgs *args,
+                      const GwyDimensionArgs *dimsargs)
+{
+    gwy_container_set_int32_by_name(container, active_page_key,
+                                    args->active_page);
+    gwy_container_set_boolean_by_name(container, update_key, args->update);
+
+    gwy_container_set_enum_by_name(container, probe_key, args->probe);
+    gwy_container_set_enum_by_name(container, out_key, args->out);
+    gwy_container_set_double_by_name(container, height_key, args->height);
+    gwy_container_set_double_by_name(container, thickness_key, args->thickness);
+    gwy_container_set_double_by_name(container, magnetisation_key, args->magnetisation);
+    gwy_container_set_double_by_name(container, size_a_key, args->size_a);
+    gwy_container_set_double_by_name(container, size_b_key, args->size_b);
+    gwy_container_set_double_by_name(container, size_c_key, args->size_c);
+    gwy_container_set_double_by_name(container, mtip_key, args->mtip);
+    gwy_container_set_double_by_name(container, bx_key, args->bx);
+    gwy_container_set_double_by_name(container, by_key, args->by);
+    gwy_container_set_double_by_name(container, length_key, args->length);
+
+    gwy_dimensions_save_args(dimsargs, container, prefix);
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/process/mfm_shift.c b/modules/process/mfm_shift.c
new file mode 100644
index 0000000..f01dde0
--- /dev/null
+++ b/modules/process/mfm_shift.c
@@ -0,0 +1,333 @@
+/*
+ *  @(#) $Id: mfm_shift.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2017 David Necas (Yeti), Petr Klapetek.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <gtk/gtk.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libprocess/gwyprocesstypes.h>
+#include <libprocess/arithmetic.h>
+#include <libprocess/inttrans.h>
+#include <libprocess/stats.h>
+#include <libgwydgets/gwydgetutils.h>
+#include <libgwydgets/gwycombobox.h>
+#include <libgwydgets/gwystock.h>
+#include <libgwymodule/gwymodule-process.h>
+#include <app/gwymoduleutils.h>
+#include <app/gwyapp.h>
+#include "mfmops.h"
+#include "preview.h"
+
+#define MFM_SHIFT_RUN_MODES (GWY_RUN_IMMEDIATE | GWY_RUN_INTERACTIVE)
+
+typedef struct {
+    gdouble height;
+    gboolean update;
+} MfmShiftArgs;
+
+typedef struct {
+    MfmShiftArgs *args;
+    GtkObject *height;
+    GtkWidget *update;
+    GwyDataField *result;
+    GwyDataField *dfield;
+    GtkWidget *view;
+    GwyContainer *mydata;
+} MfmShiftControls;
+
+static gboolean module_register          (void);
+static void     mfm_shift                 (GwyContainer *data,
+                                          GwyRunType run);
+static void     mfm_shift_do             (MfmShiftArgs *args,
+                                          GwyDataField *dfield,
+                                          GwyDataField *out);
+static gboolean mfm_shift_dialog         (MfmShiftArgs *args,
+                                          GwyContainer *data);
+
+static void     mfm_shift_load_args      (GwyContainer *container,
+                                          MfmShiftArgs *args);
+static void     mfm_shift_save_args      (GwyContainer *container,
+                                          MfmShiftArgs *args);
+static void     mfm_shift_sanitize_args  (MfmShiftArgs *args);
+static void     height_changed           (GtkAdjustment *adj,
+                                          MfmShiftControls *controls);
+static void     update_changed           (GtkToggleButton *button,
+                                          MfmShiftControls *controls);
+static void     preview                  (MfmShiftControls *controls,
+                                          MfmShiftArgs *args);
+static void     mfm_shift_dialog_update  (MfmShiftControls *controls,
+                                          MfmShiftArgs *args);
+
+static const MfmShiftArgs mfm_shift_defaults = {
+    10, TRUE,
+};
+
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION,
+    &module_register,
+    N_("Simulation of magnetic field z component change for another level"),
+    "Petr Klapetek <klapetek at gwyddion.net>",
+    "1.0",
+    "David Nečas (Yeti) & Petr Klapetek",
+    "2017",
+};
+
+GWY_MODULE_QUERY2(module_info, mfm_shift)
+
+static gboolean
+module_register(void)
+{
+    gwy_process_func_register("mfm_shift",
+                              (GwyProcessFunc)&mfm_shift,
+                              N_("/SPM M_odes/_MFM/_Field Shift in Z..."),
+                              NULL,
+                              MFM_SHIFT_RUN_MODES,
+                              GWY_MENU_FLAG_DATA,
+                              N_("Compute stray field shift for another z level"));
+
+    return TRUE;
+}
+
+static void
+mfm_shift(GwyContainer *data, GwyRunType run)
+{
+    GwyDataField *dfield, *out;
+    MfmShiftArgs args;
+    gboolean ok;
+    gint id, newid, datano;
+
+    g_return_if_fail(run & MFM_SHIFT_RUN_MODES);
+
+    gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &dfield,
+                                     GWY_APP_DATA_FIELD_ID, &id,
+                                     GWY_APP_CONTAINER_ID, &datano,
+                                     0);
+    g_return_if_fail(dfield);
+
+    mfm_shift_load_args(gwy_app_settings_get(), &args);
+
+    if (run == GWY_RUN_INTERACTIVE) {
+        ok = mfm_shift_dialog(&args, data);
+        mfm_shift_save_args(gwy_app_settings_get(), &args);
+        if (!ok)
+            return;
+    }
+
+    //do the computation
+
+    out = gwy_data_field_new_alike(dfield, FALSE);
+    mfm_shift_do(&args, dfield, out);
+
+    newid = gwy_app_data_browser_add_data_field(out, data, TRUE);
+    gwy_app_sync_data_items(data, data, id, newid, FALSE,
+                        GWY_DATA_ITEM_GRADIENT,
+                        GWY_DATA_ITEM_MASK_COLOR,
+                        0);
+
+    gwy_app_set_data_field_title(data, newid, _("Shifted field"));
+    gwy_app_channel_log_add_proc(data, id, newid);
+
+    g_object_unref(out);
+
+
+}
+
+
+static gboolean
+mfm_shift_dialog(MfmShiftArgs *args, GwyContainer *data)
+{
+    GtkWidget *dialog, *table, *hbox;
+    MfmShiftControls controls;
+    gint response, row, id, datano;
+
+    controls.args = args;
+
+    dialog = gtk_dialog_new_with_buttons(_("Stray Field Plane Shift"),
+                                         NULL, 0, NULL);
+    gtk_dialog_add_action_widget(GTK_DIALOG(dialog),
+                                 gwy_stock_like_button_new(_("_Update"),
+                                                           GTK_STOCK_EXECUTE),
+                                 RESPONSE_PREVIEW);
+    gtk_dialog_add_button(GTK_DIALOG(dialog), _("_Reset"), RESPONSE_RESET);
+    gtk_dialog_add_button(GTK_DIALOG(dialog),
+                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+    gtk_dialog_add_button(GTK_DIALOG(dialog),
+                          GTK_STOCK_OK, GTK_RESPONSE_OK);
+    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
+    gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
+
+
+    hbox = gtk_hbox_new(FALSE, 2);
+    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), GTK_WIDGET(hbox),
+                       FALSE, FALSE, 4);
+
+    gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &controls.dfield,
+                                     GWY_APP_DATA_FIELD_ID, &id,
+                                     GWY_APP_CONTAINER_ID, &datano,
+                                     0);
+    controls.result = gwy_data_field_new_alike(controls.dfield, TRUE);
+
+    controls.mydata = gwy_container_new();
+    gwy_container_set_object_by_name(controls.mydata, "/0/data", controls.result);
+    gwy_app_sync_data_items(data, controls.mydata, id, 0, FALSE,
+                            GWY_DATA_ITEM_PALETTE,
+                            GWY_DATA_ITEM_MASK_COLOR,
+                            GWY_DATA_ITEM_RANGE,
+                            GWY_DATA_ITEM_REAL_SQUARE,
+                            0);
+    controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, TRUE);
+    gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4);
+
+
+    table = gtk_table_new(2, 3, FALSE);
+    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
+    gtk_table_set_col_spacings(GTK_TABLE(table), 6);
+    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
+    gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 4);
+    row = 0;
+
+    controls.height = gtk_adjustment_new(args->height, -1000, 1000, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("_Z shift by:"), "nm",
+                            controls.height, GWY_HSCALE_SQRT);
+    g_object_set_data(G_OBJECT(controls.height), "controls", &controls);
+    g_signal_connect(controls.height, "value-changed",
+                     G_CALLBACK(height_changed), &controls);
+    row++;
+
+    controls.update = gtk_check_button_new_with_mnemonic(_("I_nstant updates"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.update),
+                                 args->update);
+    gtk_table_attach(GTK_TABLE(table), controls.update,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    g_signal_connect(controls.update, "toggled",
+                     G_CALLBACK(update_changed), &controls);
+    row++;
+
+    if (args->update)
+        preview(&controls, args);
+
+    gtk_widget_show_all(dialog);
+    do {
+        response = gtk_dialog_run(GTK_DIALOG(dialog));
+        switch (response) {
+            case GTK_RESPONSE_CANCEL:
+            case GTK_RESPONSE_DELETE_EVENT:
+            gtk_widget_destroy(dialog);
+            case GTK_RESPONSE_NONE:
+            return FALSE;
+            break;
+
+            case GTK_RESPONSE_OK:
+            break;
+
+            case RESPONSE_PREVIEW:
+            preview(&controls, args);
+            break;
+
+            case RESPONSE_RESET:
+            {
+                *args = mfm_shift_defaults;
+                mfm_shift_dialog_update(&controls, args);
+            }
+            break;
+
+            default:
+            g_assert_not_reached();
+            break;
+        }
+    } while (response != GTK_RESPONSE_OK);
+
+    gtk_widget_destroy(dialog);
+
+    return TRUE;
+}
+
+static void
+preview(MfmShiftControls *controls,
+        MfmShiftArgs *args)
+{
+    mfm_shift_do(args, controls->dfield, controls->result);
+    gwy_data_field_data_changed(controls->result);
+}
+
+static void
+mfm_shift_do(MfmShiftArgs *args, GwyDataField *dfield, GwyDataField *out)
+{
+    mfm_shift_z(dfield, out, -args->height*1e-9);
+}
+
+static void
+height_changed(GtkAdjustment *adj, MfmShiftControls *controls)
+{
+    controls->args->height = gtk_adjustment_get_value(adj);
+    if (controls->args->update)
+        preview(controls, controls->args);
+}
+
+static void
+update_changed(GtkToggleButton *button, MfmShiftControls *controls)
+{
+    controls->args->update = gtk_toggle_button_get_active(button);
+    if (controls->args->update)
+        preview(controls, controls->args);
+}
+
+static void
+mfm_shift_dialog_update(MfmShiftControls *controls,
+                  MfmShiftArgs *args)
+{
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->height), args->height);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->update),
+                                 args->update);
+}
+
+static const gchar update_key[] = "/module/mfm_shift/update";
+static const gchar height_key[] = "/module/mfm_shift/height";
+
+static void
+mfm_shift_sanitize_args(MfmShiftArgs *args)
+{
+    args->update = !!args->update;
+}
+
+static void
+mfm_shift_load_args(GwyContainer *container,
+              MfmShiftArgs *args)
+{
+    *args = mfm_shift_defaults;
+
+    gwy_container_gis_boolean_by_name(container, update_key,
+                                      &args->update);
+    gwy_container_gis_double_by_name(container, height_key, &args->height);
+    mfm_shift_sanitize_args(args);
+}
+
+static void
+mfm_shift_save_args(GwyContainer *container,
+              MfmShiftArgs *args)
+{
+    gwy_container_set_boolean_by_name(container, update_key,
+                                      args->update);
+    gwy_container_set_double_by_name(container, height_key, args->height);
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/process/mfmops.h b/modules/process/mfmops.h
new file mode 100644
index 0000000..142c7b0
--- /dev/null
+++ b/modules/process/mfmops.h
@@ -0,0 +1,435 @@
+/*
+ *  @(#) $Id: mfmops.h 19810 2017-05-30 07:38:06Z yeti-dn $
+ *  Copyright (C) 2017 David Necas (Yeti), Petr Klapetek.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GWY_PROCESS_MFMOPS_H__
+#define __GWY_PROCESS_MFMOPS_H__
+
+#include <libprocess/gwyprocesstypes.h>
+#include <libprocess/arithmetic.h>
+#include <libprocess/inttrans.h>
+#include <libprocess/filters.h>
+#include <libprocess/stats.h>
+
+#define MU_0 1.256637061435917295e-6
+#define EPSILON_0 8.854187817620389850e-12
+
+#define MFM_DIMENSION_ARGS_INIT \
+    { 256, 256, 5.0, (gpointer)"m", NULL, -9, 0, FALSE, FALSE }
+
+typedef enum {
+    GWY_MFM_PROBE_CHARGE = 0,
+    GWY_MFM_PROBE_BAR    = 1
+} GwyMfmProbeType;
+
+typedef enum {
+    GWY_MFM_COMPONENT_HX = 0,
+    GWY_MFM_COMPONENT_HY = 1,
+    GWY_MFM_COMPONENT_HZ = 2
+} GwyMfmComponentType;
+
+G_GNUC_UNUSED
+static void
+mfm_perpendicular_create_field_mask(GwyDataField *fieldmask, gdouble height,
+                                    gdouble thickness)
+{
+    gint i, j;
+    gdouble kx, ky, k;
+    gdouble *data = gwy_data_field_get_data(fieldmask);
+
+    gint xres = gwy_data_field_get_xres(fieldmask);
+    gint yres = gwy_data_field_get_yres(fieldmask);
+    gdouble xreal = gwy_data_field_get_xreal(fieldmask);
+    gdouble yreal = gwy_data_field_get_yreal(fieldmask);
+
+    for (i = 0; i < yres; i++) {
+        for (j = 0; j < xres; j++) {
+
+            kx = fabs(i - xres/2)/xreal;
+            ky = fabs(j - yres/2)/yreal;
+
+            k = hypot(kx, ky);
+
+            data[i*xres + j] = 0.5*(exp(-k*height)*(1.0-exp(-k*thickness)));
+
+        }
+    }
+}
+
+G_GNUC_UNUSED
+static void
+mfm_perpendicular_create_wall_mask(GwyDataField *wm, gdouble a, gdouble kn)
+{
+    gint i, j;
+    gdouble x, y, s, *data;
+    gdouble delta = G_PI*sqrt(a/kn);
+
+    gint xres = gwy_data_field_get_xres(wm);
+    gint yres = gwy_data_field_get_yres(wm);
+    gdouble xreal = gwy_data_field_get_xreal(wm);
+    gdouble yreal = gwy_data_field_get_yreal(wm);
+
+    data = gwy_data_field_get_data(wm);
+    for (i = 0; i < yres; i++) {
+        for (j = 0; j < xres; j++) {
+
+            x = fabs(i - xres/2)*xreal/(gdouble)xres;
+            y = fabs(j - yres/2)*yreal/(gdouble)yres;
+
+            s = hypot(x, y);
+
+            data[i*xres + j] = 1.0/(cosh(G_PI*s/delta));
+        }
+    }
+}
+
+G_GNUC_UNUSED
+static inline gdouble
+mysinc(gdouble x)
+{
+    if (x == 0.0)
+        return 1;
+    else
+        return sin(x)/x;
+}
+
+G_GNUC_UNUSED
+static void
+mfm_perpendicular_create_ftf(GwyDataField *ftf, gdouble mtip,
+                             gdouble bx, gdouble by, gdouble length,
+                             GwyMfmProbeType type)
+{
+    gint i, j;
+    gdouble kx, ky, k, *data;
+
+
+    gint xres = gwy_data_field_get_xres(ftf);
+    gint yres = gwy_data_field_get_yres(ftf);
+    gdouble xreal = gwy_data_field_get_xreal(ftf);
+    gdouble yreal = gwy_data_field_get_yreal(ftf);
+
+    if (type == GWY_MFM_PROBE_CHARGE)
+        gwy_data_field_fill(ftf, -MU_0*mtip*bx*by);
+    else {
+        data = gwy_data_field_get_data(ftf);
+        for (i = 0; i < yres; i++) {
+            for (j = 0; j < xres; j++) {
+                kx = fabs(i - xres/2)/xreal;
+                ky = fabs(j - yres/2)/yreal;
+
+                k = hypot(kx, ky);
+
+                data[i*xres + j] = -MU_0*mtip*bx*by*mysinc(kx*bx/2)*mysinc(ky*by/2)
+                                   *(1-exp(-k*length));
+            }
+        }
+    }
+}
+
+G_GNUC_UNUSED
+static void
+mfm_perpendicular_stray_field(GwyDataField *mfield, GwyDataField *out,
+                              gdouble height, gdouble thickness,
+                              gdouble sigma,
+                              gboolean walls, gdouble wall_a, gdouble wall_kn)
+{
+    GwyDataField *rea, *ima, *reb, *imb, *fieldmask, *wallmask;
+
+    rea = gwy_data_field_new_alike(mfield, TRUE);
+    reb = gwy_data_field_new_alike(mfield, TRUE);
+    ima = gwy_data_field_new_alike(mfield, TRUE);
+    imb = gwy_data_field_new_alike(mfield, TRUE);
+    fieldmask = gwy_data_field_new_alike(mfield, TRUE);
+    wallmask = gwy_data_field_new_alike(mfield, TRUE);
+
+    gwy_data_field_copy(mfield, rea, FALSE);
+    gwy_data_field_multiply(rea, 2*sigma);
+    gwy_data_field_add(rea, -sigma);
+
+    if (walls) {
+        mfm_perpendicular_create_wall_mask(wallmask, wall_a, wall_kn);
+        gwy_data_field_area_ext_convolve(rea,
+                                         0, 0,
+                                         gwy_data_field_get_xres(rea),
+                                         gwy_data_field_get_yres(rea),
+                                         rea, wallmask,
+                                         GWY_EXTERIOR_MIRROR_EXTEND, 0.0,
+                                         FALSE);
+    }
+
+    gwy_data_field_2dfft_raw(rea, NULL, reb, imb,
+                             GWY_TRANSFORM_DIRECTION_FORWARD);
+
+    gwy_data_field_2dfft_humanize(reb);
+    gwy_data_field_2dfft_humanize(imb);
+
+    mfm_perpendicular_create_field_mask(fieldmask, height, thickness);
+
+    gwy_data_field_multiply_fields(reb, reb, fieldmask);
+    gwy_data_field_multiply_fields(imb, imb, fieldmask);
+
+    gwy_data_field_2dfft_dehumanize(reb);
+    gwy_data_field_2dfft_dehumanize(imb);
+    gwy_data_field_2dfft_raw(reb, imb, rea, ima,
+                             GWY_TRANSFORM_DIRECTION_BACKWARD);
+
+    gwy_data_field_copy(rea, out, FALSE);
+
+    gwy_object_unref(rea);
+    gwy_object_unref(reb);
+    gwy_object_unref(ima);
+    gwy_object_unref(imb);
+    gwy_object_unref(fieldmask);
+    gwy_object_unref(wallmask);
+}
+
+G_GNUC_UNUSED
+static void
+mfm_perpendicular_force_from_field(GwyDataField *hz, GwyDataField *fz,
+                                  GwyMfmProbeType type, gdouble mtip,
+                                  gdouble bx, gdouble by, gdouble length)
+{
+    GwyDataField *rea, *ima, *reb, *imb, *ftf;
+
+    rea = gwy_data_field_new_alike(hz, TRUE);
+    reb = gwy_data_field_new_alike(hz, TRUE);
+    ima = gwy_data_field_new_alike(hz, TRUE);
+    imb = gwy_data_field_new_alike(hz, TRUE);
+    ftf = gwy_data_field_new_alike(hz, TRUE);
+
+    gwy_data_field_copy(hz, rea, FALSE);
+
+    gwy_data_field_2dfft_raw(rea, NULL, reb, imb,
+                             GWY_TRANSFORM_DIRECTION_FORWARD);
+
+    gwy_data_field_2dfft_humanize(reb);
+    gwy_data_field_2dfft_humanize(imb);
+
+    mfm_perpendicular_create_ftf(ftf, mtip,
+                             bx, by, length, type);
+
+    gwy_data_field_multiply_fields(reb, reb, ftf);
+    gwy_data_field_multiply_fields(imb, imb, ftf);
+
+    gwy_data_field_2dfft_dehumanize(reb);
+    gwy_data_field_2dfft_dehumanize(imb);
+    gwy_data_field_2dfft_raw(reb, imb, rea, ima,
+                             GWY_TRANSFORM_DIRECTION_BACKWARD);
+
+
+    gwy_data_field_copy(rea, fz, FALSE);
+
+    gwy_object_unref(rea);
+    gwy_object_unref(reb);
+    gwy_object_unref(ima);
+    gwy_object_unref(imb);
+    gwy_object_unref(ftf);
+
+}
+
+G_GNUC_UNUSED
+static void
+mfm_create_ztf(GwyDataField *ztf, gdouble zdiff)
+{
+    gint i, j;
+    gdouble kx, ky, k, *data;
+
+    gint xres = gwy_data_field_get_xres(ztf);
+    gint yres = gwy_data_field_get_yres(ztf);
+    gdouble xreal = gwy_data_field_get_xreal(ztf);
+    gdouble yreal = gwy_data_field_get_yreal(ztf);
+
+    data = gwy_data_field_get_data(ztf);
+
+    for (i = 0; i < yres; i++) {
+        for (j = 0; j < xres; j++) {
+            kx = fabs(i - xres/2)/xreal;
+            ky = fabs(j - yres/2)/yreal;
+
+            k = hypot(kx, ky);
+
+            data[i*xres + j] = exp(k*zdiff);
+        }
+    }
+
+}
+
+G_GNUC_UNUSED
+static void
+mfm_shift_z(GwyDataField *dfield, GwyDataField *out, gdouble zdiff)
+{
+
+    GwyDataField *rea, *ima, *reb, *imb, *ztf;
+
+    rea = gwy_data_field_new_alike(dfield, TRUE);
+    reb = gwy_data_field_new_alike(dfield, TRUE);
+    ima = gwy_data_field_new_alike(dfield, TRUE);
+    imb = gwy_data_field_new_alike(dfield, TRUE);
+    ztf = gwy_data_field_new_alike(dfield, TRUE);
+
+    gwy_data_field_copy(dfield, rea, FALSE);
+
+    gwy_data_field_2dfft_raw(rea, NULL, reb, imb,
+                             GWY_TRANSFORM_DIRECTION_FORWARD);
+
+    gwy_data_field_2dfft_humanize(reb);
+    gwy_data_field_2dfft_humanize(imb);
+
+    mfm_create_ztf(ztf, zdiff);
+
+    gwy_data_field_multiply_fields(reb, reb, ztf);
+    gwy_data_field_multiply_fields(imb, imb, ztf);
+
+    gwy_data_field_2dfft_dehumanize(reb);
+    gwy_data_field_2dfft_dehumanize(imb);
+    gwy_data_field_2dfft_raw(reb, imb, rea, ima,
+                             GWY_TRANSFORM_DIRECTION_BACKWARD);
+
+
+    gwy_data_field_copy(rea, out, FALSE);
+
+    gwy_object_unref(rea);
+    gwy_object_unref(reb);
+    gwy_object_unref(ima);
+    gwy_object_unref(imb);
+    gwy_object_unref(ztf);
+}
+
+G_GNUC_UNUSED
+static void
+mfm_parallel_create_h(GwyDataField *h, gdouble height, gdouble size_a,
+                      gdouble size_b, gdouble size_c, gdouble magnetisation,
+                      gdouble thickness, GwyMfmComponentType component)
+{
+    gint i, j, k;
+    gdouble x, pos, *data, val;
+
+    gint *xlist, *dirlist, nlist;
+
+    gint xres = gwy_data_field_get_xres(h);
+    gint yres = gwy_data_field_get_yres(h);
+    gdouble xreal = gwy_data_field_get_xreal(h);
+
+    xlist = g_new(gint, 100*xres);
+    dirlist = g_new(gint, 100*xres);
+
+    nlist = 0;
+    pos = -20*(size_a+size_b+thickness+height);
+
+    xlist[nlist] = pos*(gdouble)xres/xreal;
+    dirlist[nlist] = 1;
+    nlist++;
+
+    do {
+       pos += size_a + size_c/2;
+       xlist[nlist] = pos*(gdouble)xres/xreal;
+       dirlist[nlist] = -1;
+       nlist++;
+
+       pos += size_b + size_c/2;
+       xlist[nlist] = pos*(gdouble)xres/xreal;
+       dirlist[nlist] = 1;
+       nlist++;
+
+    } while (pos < xreal+20*(size_a+size_b+thickness+height)
+             && nlist < 10*xres-1);
+
+    data = gwy_data_field_get_data(h);
+
+    for (k = 0; k < nlist; k++) {
+        for (j = 0; j < xres; j++) {
+
+            x = ((gdouble)j - xlist[k])*xreal/(gdouble)xres;
+
+            if (component == GWY_MFM_COMPONENT_HX)
+                val = -dirlist[k]*4*magnetisation
+                     *(atan((x*(thickness+height))/(x*x + size_c*size_c + size_c*(thickness+height)))
+                     -atan((x*height)/(x*x + size_c*size_c + size_c*height)));
+            else if (component == GWY_MFM_COMPONENT_HY)
+                val = 0;
+            else if (component == GWY_MFM_COMPONENT_HZ)
+                val = dirlist[k]*2*magnetisation
+                     *log((x*x + (size_c + height + thickness)*(size_c + height + thickness))
+                             /(x*x + (size_c + height)*(size_c + height)));
+            else {
+                g_return_if_reached();
+            }
+
+            for (i = 0; i < yres; i++) {
+                data[i*xres + j] += val;
+            }
+        }
+    }
+
+    g_free(xlist);
+    g_free(dirlist);
+}
+
+G_GNUC_UNUSED
+static void
+mfm_current_create_h(GwyDataField *h, gdouble height, gdouble width,
+                     gdouble position, gdouble current,
+                     GwyMfmComponentType component)
+{
+    gint i, j;
+    gdouble x, *data, val;
+    gint xres = gwy_data_field_get_xres(h);
+    gint yres = gwy_data_field_get_yres(h);
+    gdouble xreal = gwy_data_field_get_xreal(h);
+
+    data = gwy_data_field_get_data(h);
+
+    for (j = 0; j < xres; j++) {
+        x = j*xreal/xres - position;
+
+        if (component == GWY_MFM_COMPONENT_HX)
+            val = -current/(2*G_PI*width)*(atan((x-width/2)/height) - atan((x+width/2)/height));
+        else if (component == GWY_MFM_COMPONENT_HY)
+            val = 0;
+        else if (component == GWY_MFM_COMPONENT_HZ)
+            val = current/(2*G_PI*width)*log(fabs(cos(atan((x+width/2)/height))/cos(atan((x-width/2)/height))));
+        else {
+            g_return_if_reached();
+        }
+
+        for (i = 0; i < yres; i++) {
+            data[i*xres + j] += val;
+        }
+    }
+}
+
+G_GNUC_UNUSED
+static void
+set_transfer_function_units(GwyDataField *source, GwyDataField *image,
+                            GwyDataField *transferfunc)
+{
+    GwySIUnit *sunit, *iunit, *tunit, *xyunit;
+
+    xyunit = gwy_data_field_get_si_unit_xy(image);
+    sunit = gwy_data_field_get_si_unit_z(source);
+    iunit = gwy_data_field_get_si_unit_z(image);
+    tunit = gwy_data_field_get_si_unit_z(transferfunc);
+    gwy_si_unit_divide(iunit, sunit, tunit);
+    gwy_si_unit_power_multiply(tunit, 1, xyunit, -2, tunit);
+}
+
+#endif
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/process/nanoindent_adjust.c b/modules/process/nanoindent_adjust.c
index 6709eb5..cf1335f 100644
--- a/modules/process/nanoindent_adjust.c
+++ b/modules/process/nanoindent_adjust.c
@@ -1,4 +1,4 @@
-/*  @(#) $Id: nanoindent_adjust.c 18158 2016-01-22 19:36:39Z yeti-dn $
+/*  @(#) $Id: nanoindent_adjust.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -93,7 +93,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, nanoindent_adjust)
 
 static gboolean
 module_register(void)
@@ -226,8 +226,9 @@ nanoindent_adjust_window_construct(NanoindentAdjustArgs *args)
         = gwy_enum_combo_box_new(gwy_interpolation_type_get_enum(), -1,
                                  G_CALLBACK(interp_changed_cb), args,
                                  args->interp, TRUE);
-    gwy_table_attach_hscale(table, 5, _("_Interpolation type:"), NULL,
-                            GTK_OBJECT(controls.interp), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, 5, _("_Interpolation type:"), NULL,
+                            GTK_OBJECT(controls.interp),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
 
 
     gtk_widget_show_all(dialog);
diff --git a/modules/process/neural.c b/modules/process/neural.c
index 8f24d01..dc73833 100644
--- a/modules/process/neural.c
+++ b/modules/process/neural.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: neural.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: neural.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2012 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -203,12 +203,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Neural network SPM data processing"),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "2.2",
+    "2.3",
     "David Nečas (Yeti) & Petr Klapetek",
     "2012",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, neural)
 
 static gboolean
 module_register(void)
@@ -455,7 +455,7 @@ neural_train_dialog(NeuralTrainArgs *args)
     NeuralTrainControls controls;
     NeuralNetworkData *nndata;
     GwyContainer *mydata;
-    GtkWidget *dialog, *table, *label, *spin, *hbox, *bbox, *vbox, *notebook,
+    GtkWidget *dialog, *table, *label, *hbox, *bbox, *vbox, *notebook,
               *scroll, *button;
     GtkTreeModel *filtermodel;
     GtkTreeSelection *tselect;
@@ -497,6 +497,7 @@ neural_train_dialog(NeuralTrainArgs *args)
                  NULL);
     controls.errgraph = gwy_graph_new(controls.gmodel);
     gtk_widget_set_size_request(controls.errgraph, -1, 200);
+    gwy_graph_enable_user_input(GWY_GRAPH(controls.errgraph), FALSE);
     gtk_box_pack_start(GTK_BOX(vbox), controls.errgraph, TRUE, TRUE, 0);
 
     gcmodel = gwy_graph_curve_model_new();
@@ -508,7 +509,7 @@ neural_train_dialog(NeuralTrainArgs *args)
     gtk_box_pack_start(GTK_BOX(hbox), notebook, TRUE, TRUE, 4);
 
     /* Training */
-    table = gtk_table_new(14, 4, FALSE);
+    table = gtk_table_new(14, 3, FALSE);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
@@ -517,8 +518,9 @@ neural_train_dialog(NeuralTrainArgs *args)
     row = 0;
 
     controls.tmodel = gwy_data_chooser_new_channels();
-    gwy_table_attach_hscale(table, row, _("_Model:"), NULL,
-                            GTK_OBJECT(controls.tmodel), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("_Model:"), NULL,
+                            GTK_OBJECT(controls.tmodel),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     gwy_data_chooser_set_active_id(GWY_DATA_CHOOSER(controls.tmodel),
                                    &args->tmodel);
     g_object_set_data(G_OBJECT(controls.tmodel), "id", (gpointer)"model");
@@ -527,8 +529,9 @@ neural_train_dialog(NeuralTrainArgs *args)
     row++;
 
     controls.tsignal = gwy_data_chooser_new_channels();
-    gwy_table_attach_hscale(table, row, _("_Signal:"), NULL,
-                            GTK_OBJECT(controls.tsignal), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("_Signal:"), NULL,
+                            GTK_OBJECT(controls.tsignal),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     gwy_data_chooser_set_active_id(GWY_DATA_CHOOSER(controls.tsignal),
                                    &args->tsignal);
     g_object_set_data(G_OBJECT(controls.tsignal), "id", (gpointer)"signal");
@@ -538,8 +541,9 @@ neural_train_dialog(NeuralTrainArgs *args)
 
     controls.trainsteps = gtk_adjustment_new(args->trainsteps,
                                              0, 10000, 1, 100, 0);
-    gwy_table_attach_hscale(table, row, _("Training ste_ps:"), NULL,
-                            GTK_OBJECT(controls.trainsteps), GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(table, row, _("Training ste_ps:"), NULL,
+                            GTK_OBJECT(controls.trainsteps),
+                            GWY_HSCALE_SQRT | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(controls.trainsteps, "value-changed",
                              G_CALLBACK(train_steps_changed), &controls);
     row++;
@@ -570,7 +574,7 @@ neural_train_dialog(NeuralTrainArgs *args)
     bbox = gtk_hbutton_box_new();
     gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_START);
     gtk_table_attach(GTK_TABLE(table), bbox,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
 
     controls.train = gtk_button_new_with_mnemonic(gwy_sgettext("verb|_Train"));
     gtk_container_add(GTK_CONTAINER(bbox), controls.train);
@@ -592,7 +596,7 @@ neural_train_dialog(NeuralTrainArgs *args)
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     controls.masking_label = label = gwy_label_new_header(_("Masking Mode"));
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     group = gwy_radio_buttons_create(gwy_masking_type_get_enum(), -1,
@@ -612,29 +616,29 @@ neural_train_dialog(NeuralTrainArgs *args)
 
     label = gwy_label_new_header(_("Network"));
     gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     row++;
 
     controls.width = gtk_adjustment_new(nndata->width, 1, 100, 1, 10, 0);
-    spin = gwy_table_attach_spinbutton(table, row, _("Window _width:"), "px",
-                                       controls.width);
-    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 0);
+    gwy_table_attach_adjbar(table, row, _("Window _width:"), _("px"),
+                            controls.width,
+                            GWY_HSCALE_SQRT | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(controls.width, "value-changed",
                              G_CALLBACK(width_changed), &controls);
     row++;
 
     controls.height = gtk_adjustment_new(nndata->height, 1, 100, 1, 10, 0);
-    spin = gwy_table_attach_spinbutton(table, row, _("Window h_eight:"), "px",
-                                       controls.height);
-    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 0);
+    gwy_table_attach_adjbar(table, row, _("Window h_eight:"), _("px"),
+                            controls.height,
+                            GWY_HSCALE_SQRT | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(controls.height, "value-changed",
                              G_CALLBACK(height_changed), &controls);
     row++;
 
     controls.nhidden = gtk_adjustment_new(nndata->nhidden, 1, 30, 1, 10, 0);
-    spin = gwy_table_attach_spinbutton(table, row, _("_Hidden nodes:"), NULL,
-                                       controls.nhidden);
-    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 0);
+    gwy_table_attach_adjbar(table, row, _("_Hidden nodes:"), NULL,
+                            controls.nhidden,
+                            GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(controls.nhidden, "value-changed",
                              G_CALLBACK(nhidden_changed), &controls);
     row++;
@@ -647,24 +651,27 @@ neural_train_dialog(NeuralTrainArgs *args)
 
     controls.inpowerxy = gtk_adjustment_new(nndata->inpowerxy,
                                             -12, 12, 1, 10, 0);
-    spin = gwy_table_attach_spinbutton(table, row, _("Power of source _XY:"),
-                                       NULL, controls.inpowerxy);
+    gwy_table_attach_adjbar(table, row, _("Power of source _XY:"), NULL,
+                            controls.inpowerxy,
+                            GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(controls.inpowerxy, "value-changed",
                              G_CALLBACK(inpowerxy_changed), &controls);
     row++;
 
     controls.inpowerz = gtk_adjustment_new(nndata->inpowerz,
-                                            -12, 12, 1, 10, 0);
-    spin = gwy_table_attach_spinbutton(table, row, _("Power of source _Z:"),
-                                       NULL, controls.inpowerz);
+                                           -12, 12, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Power of source _Z:"), NULL,
+                            controls.inpowerz,
+                            GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(controls.inpowerz, "value-changed",
                              G_CALLBACK(inpowerz_changed), &controls);
     row++;
 
     controls.outunits = gtk_entry_new();
     gtk_entry_set_text(GTK_ENTRY(controls.outunits), nndata->outunits);
-    gwy_table_attach_row(table, row, _("_Fixed units:"), NULL,
-                         controls.outunits);
+    gwy_table_attach_adjbar(table, row, _("_Fixed units:"), NULL,
+                            GTK_OBJECT(controls.outunits),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     g_signal_connect_swapped(controls.outunits, "changed",
                              G_CALLBACK(outunits_changed), &controls);
     row++;
diff --git a/modules/process/noise_synth.c b/modules/process/noise_synth.c
index a17effd..76d68d4 100644
--- a/modules/process/noise_synth.c
+++ b/modules/process/noise_synth.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: noise_synth.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: noise_synth.c 20105 2017-07-29 09:24:09Z yeti-dn $
  *  Copyright (C) 2010 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -34,8 +34,6 @@
 #include "preview.h"
 #include "dimensions.h"
 
-#define GWY_SQRT6 2.449489742783178098197284074705
-
 #define NOISE_SYNTH_RUN_MODES (GWY_RUN_IMMEDIATE | GWY_RUN_INTERACTIVE)
 
 #define DECLARE_NOISE(name) \
@@ -195,12 +193,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Generates uncorrelated random noise."),
     "Yeti <yeti at gwyddion.net>",
-    "1.2",
+    "1.3",
     "David Nečas (Yeti)",
     "2010",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, noise_synth)
 
 static gboolean
 module_register(void)
@@ -316,10 +314,10 @@ run_noninteractive(NoiseSynthArgs *args,
 
 static gboolean
 noise_synth_dialog(NoiseSynthArgs *args,
-                 GwyDimensionArgs *dimsargs,
-                 GwyContainer *data,
-                 GwyDataField *dfield_template,
-                 gint id)
+                   GwyDimensionArgs *dimsargs,
+                   GwyContainer *data,
+                   GwyDataField *dfield_template,
+                   gint id)
 {
     GtkWidget *dialog, *table, *vbox, *hbox, *notebook, *label;
     NoiseSynthControls controls;
@@ -396,7 +394,7 @@ noise_synth_dialog(NoiseSynthArgs *args,
         g_signal_connect_swapped(controls.dims->add, "toggled",
                                  G_CALLBACK(noise_synth_invalidate), &controls);
 
-    table = gtk_table_new(6 + (dfield_template ? 1 : 0), 4, FALSE);
+    table = gtk_table_new(6 + (dfield_template ? 1 : 0), 3, FALSE);
     controls.table = GTK_TABLE(table);
     gtk_table_set_row_spacings(controls.table, 2);
     gtk_table_set_col_spacings(controls.table, 6);
@@ -406,14 +404,14 @@ noise_synth_dialog(NoiseSynthArgs *args,
     row = 0;
 
     controls.distribution = distribution_selector_new(&controls);
-    gwy_table_attach_hscale(table, row, _("_Distribution:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Distribution:"), NULL,
                             GTK_OBJECT(controls.distribution),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
-    label = gtk_label_new(_("Direction:"));
+    label = gtk_label_new(_("Noise type:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1,
+    gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
                      GTK_FILL, 0, 0, 0);
     row++;
 
@@ -425,7 +423,7 @@ noise_synth_dialog(NoiseSynthArgs *args,
                                     _("One-sided _negative"), NOISE_DIRECTION_DOWN,
                                     NULL);
     row = gwy_radio_buttons_attach_to_table(controls.direction,
-                                            GTK_TABLE(table), 3, row);
+                                            GTK_TABLE(table), 2, row);
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
 
     row = gwy_synth_attach_height(&controls, row,
@@ -434,11 +432,11 @@ noise_synth_dialog(NoiseSynthArgs *args,
 
     if (dfield_template) {
         controls.sigma_init
-            = gtk_button_new_with_mnemonic(_("_Like Current Channel"));
+            = gtk_button_new_with_mnemonic(_("_Like Current Image"));
         g_signal_connect_swapped(controls.sigma_init, "clicked",
                                  G_CALLBACK(sigma_init_clicked), &controls);
         gtk_table_attach(GTK_TABLE(table), controls.sigma_init,
-                         1, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
     }
 
diff --git a/modules/process/obj_synth.c b/modules/process/obj_synth.c
index bed936e..41cf2de 100644
--- a/modules/process/obj_synth.c
+++ b/modules/process/obj_synth.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: obj_synth.c 19189 2016-11-06 20:09:54Z yeti-dn $
+ *  @(#) $Id: obj_synth.c 20038 2017-07-07 10:43:16Z yeti-dn $
  *  Copyright (C) 2009-2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -194,10 +194,6 @@ static void       shape_selected       (GtkComboBox *combo,
 static void       sculpt_type_changed  (GtkComboBox *combo,
                                         ObjSynthControls *controls);
 static void       height_init_clicked  (ObjSynthControls *controls);
-static gint       attach_truncation    (ObjSynthControls *controls,
-                                        gint row,
-                                        GtkObject **adj,
-                                        gdouble *target);
 static void       update_coverage_value(ObjSynthControls *controls);
 static void       obj_synth_invalidate (ObjSynthControls *controls);
 static gboolean   preview_gsource      (gpointer user_data);
@@ -295,14 +291,14 @@ static GwyModuleInfo module_info = {
     "2009",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, obj_synth)
 
 static gboolean
 module_register(void)
 {
     gwy_process_func_register("obj_synth",
                               (GwyProcessFunc)&obj_synth,
-                              N_("/S_ynthetic/_Objects..."),
+                              N_("/S_ynthetic/_Deposition/_Objects..."),
                               GWY_STOCK_SYNTHETIC_OBJECTS,
                               OBJ_SYNTH_RUN_MODES,
                               0,
@@ -330,10 +326,11 @@ obj_synth(GwyContainer *data, GwyRunType run)
 
     rngset = gwy_rand_gen_set_new(RNG_NRNGS);
     if (run == GWY_RUN_IMMEDIATE
-        || obj_synth_dialog(&args, &dimsargs, rngset, data, dfield, id)) {
-        obj_synth_save_args(gwy_app_settings_get(), &args, &dimsargs);
+        || obj_synth_dialog(&args, &dimsargs, rngset, data, dfield, id))
         run_noninteractive(&args, &dimsargs, rngset, data, dfield, id, quark);
-    }
+
+    if (run == GWY_RUN_INTERACTIVE)
+        obj_synth_save_args(gwy_app_settings_get(), &args, &dimsargs);
 
     gwy_rand_gen_set_free(rngset);
     gwy_dimensions_free_args(&dimsargs);
@@ -500,7 +497,7 @@ obj_synth_dialog(ObjSynthArgs *args,
         g_signal_connect_swapped(controls.dims->add, "toggled",
                                  G_CALLBACK(obj_synth_invalidate), &controls);
 
-    table = gtk_table_new(19 + (dfield_template ? 1 : 0), 4, FALSE);
+    table = gtk_table_new(19 + (dfield_template ? 1 : 0), 3, FALSE);
     controls.table = GTK_TABLE(table);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
@@ -510,14 +507,15 @@ obj_synth_dialog(ObjSynthArgs *args,
     row = 0;
 
     controls.type = shape_selector_new(&controls);
-    gwy_table_attach_hscale(table, row, _("_Shape:"), NULL,
-                            GTK_OBJECT(controls.type), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("_Shape:"), NULL,
+                            GTK_OBJECT(controls.type),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     controls.coverage = gtk_adjustment_new(args->coverage,
                                            0.001, 50.0, 0.001, 1.0, 0);
     g_object_set_data(G_OBJECT(controls.coverage), "target", &args->coverage);
-    gwy_table_attach_hscale(table, row, _("Co_verage:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("Co_verage:"), NULL,
                             controls.coverage, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.coverage, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
@@ -526,17 +524,17 @@ obj_synth_dialog(ObjSynthArgs *args,
     controls.coverage_value = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(controls.coverage_value), 1.0, 0.5);
     gtk_table_attach(controls.table, controls.coverage_value,
-                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     1, 2, row, row+1, GTK_FILL, 0, 0, 0);
 
     controls.coverage_units = gtk_label_new(_("obj."));
     gtk_misc_set_alignment(GTK_MISC(controls.coverage_units), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), controls.coverage_units,
-                     3, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
     row++;
 
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Size")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.size = gtk_adjustment_new(args->size, 1.0, 1000.0, 0.1, 10.0, 0);
@@ -549,13 +547,13 @@ obj_synth_dialog(ObjSynthArgs *args,
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     gtk_table_attach(controls.table, gwy_label_new_header(_("Aspect Ratio")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.aspect = gtk_adjustment_new(args->aspect,
                                          0.2, 5.0, 0.01, 1.0, 0);
     g_object_set_data(G_OBJECT(controls.aspect), "target", &args->aspect);
-    gwy_table_attach_hscale(table, row, _("_Aspect ratio:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Aspect ratio:"), NULL,
                             controls.aspect, GWY_HSCALE_LOG);
     g_signal_connect_swapped(controls.aspect, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
@@ -567,7 +565,7 @@ obj_synth_dialog(ObjSynthArgs *args,
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Height")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     row = gwy_synth_attach_height(&controls, row,
@@ -576,11 +574,11 @@ obj_synth_dialog(ObjSynthArgs *args,
 
     if (dfield_template) {
         controls.height_init
-            = gtk_button_new_with_mnemonic(_("_Like Current Channel"));
+            = gtk_button_new_with_mnemonic(_("_Like Current Image"));
         g_signal_connect_swapped(controls.height_init, "clicked",
                                  G_CALLBACK(height_init_clicked), &controls);
         gtk_table_attach(GTK_TABLE(table), controls.height_init,
-                         1, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
     }
 
@@ -591,7 +589,7 @@ obj_synth_dialog(ObjSynthArgs *args,
     g_object_set_data(G_OBJECT(controls.height_bound),
                       "target", &args->height_bound);
     gtk_table_attach(GTK_TABLE(table), controls.height_bound,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.height_bound, "toggled",
                              G_CALLBACK(gwy_synth_boolean_changed), &controls);
     row++;
@@ -600,7 +598,8 @@ obj_synth_dialog(ObjSynthArgs *args,
                                     &controls.height_noise,
                                     &args->height_noise);
 
-    row = attach_truncation(&controls, row, &controls.htrunc, &args->htrunc);
+    row = gwy_synth_attach_truncation(&controls, row,
+                                      &controls.htrunc, &args->htrunc);
     row = gwy_synth_attach_variance(&controls, row,
                                     &controls.htrunc_noise,
                                     &args->htrunc_noise);
@@ -609,7 +608,7 @@ obj_synth_dialog(ObjSynthArgs *args,
         = gwy_enum_combo_box_new(sculpt_types, G_N_ELEMENTS(sculpt_types),
                                  G_CALLBACK(sculpt_type_changed), &controls,
                                  args->sculpt, TRUE);
-    gwy_table_attach_hscale(table, row, _("_Feature type:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Feature type:"), NULL,
                             GTK_OBJECT(controls.sculpt), GWY_HSCALE_WIDGET);
     row++;
 
@@ -790,31 +789,6 @@ height_init_clicked(ObjSynthControls *controls)
                              controls->zscale/mag);
 }
 
-static gint
-attach_truncation(ObjSynthControls *controls,
-                  gint row,
-                  GtkObject **adj,
-                  gdouble *target)
-{
-    GtkWidget *spin;
-
-    gtk_table_set_row_spacing(controls->table, row-1, 8);
-    *adj = gtk_adjustment_new(*target,
-                              0.001, 1.0, 0.001, 0.1, 0);
-    g_object_set_data(G_OBJECT(*adj), "target", target);
-
-    spin = gwy_table_attach_hscale(GTK_WIDGET(controls->table),
-                                   row, _("_Truncate:"), NULL, *adj,
-                                   GWY_HSCALE_DEFAULT);
-    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
-    g_signal_connect_swapped(*adj, "value-changed",
-                             G_CALLBACK(gwy_synth_double_changed), controls);
-
-    row++;
-
-    return row;
-}
-
 static void
 update_coverage_value(ObjSynthControls *controls)
 {
@@ -966,7 +940,7 @@ object_synth_iter(GwyDataField *surface,
             angle += gwy_rand_gen_set_gaussian(rngset, RNG_ANGLE,
                                                2*args->angle_noise);
 
-        // Use a specific distribution for htrunc.
+        /* Use a specific distribution for htrunc. */
         if (args->htrunc_noise) {
             gdouble q = exp(gwy_rand_gen_set_gaussian(rngset, RNG_HTRUNC,
                                                       args->htrunc_noise));
diff --git a/modules/process/otsu_threshold.c b/modules/process/otsu_threshold.c
index 7734e1c..a7eb3db 100644
--- a/modules/process/otsu_threshold.c
+++ b/modules/process/otsu_threshold.c
@@ -1,4 +1,5 @@
 /*
+ *  @(#) $Id: otsu_threshold.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2013 Brazilian Nanotechnology National Laboratory
  *  E-mail: Vinicius Barboza <vinicius.barboza at lnnano.cnpem.br>
  *
@@ -44,7 +45,7 @@ static GwyModuleInfo module_info = {
 };
 
 /* Module query */
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, otsu_threshold)
 
 /* Module register */
 static gboolean
@@ -52,13 +53,12 @@ module_register(void)
 {
     gwy_process_func_register("otsu-threshold",
                               (GwyProcessFunc)&otsu_threshold,
-                              N_("/_Grains/_Mark by Otsu's..."),
+                              N_("/_Grains/_Mark by Otsu's"),
                               NULL,
                               OTSU_RUN_MODES,
                               GWY_MENU_FLAG_DATA,
                               N_("Automated threshold using Otsu's method "
-                                 "on heights.")
-                             );
+                                 "on heights."));
     return TRUE;
 }
 
diff --git a/modules/process/outliers.c b/modules/process/outliers.c
index 665dd0c..f7c64fa 100644
--- a/modules/process/outliers.c
+++ b/modules/process/outliers.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: outliers.c 17691 2015-11-01 10:27:46Z yeti-dn $
+ *  @(#) $Id: outliers.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004,2008 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -24,6 +24,7 @@
 #include <libgwyddion/gwymath.h>
 #include <libprocess/correct.h>
 #include <libprocess/stats.h>
+#include <libgwydgets/gwystock.h>
 #include <libgwymodule/gwymodule-process.h>
 #include <app/gwyapp.h>
 #include "preview.h"
@@ -39,12 +40,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Creates mask of outliers."),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "1.4",
+    "1.5",
     "David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, outliers)
 
 static gboolean
 module_register(void)
@@ -52,7 +53,7 @@ module_register(void)
     gwy_process_func_register("outliers",
                               (GwyProcessFunc)&outliers,
                               N_("/_Correct Data/Mask of _Outliers"),
-                              NULL,
+                              GWY_STOCK_MARK_OUTLIERS,
                               OUTLIERS_RUN_MODES,
                               GWY_MENU_FLAG_DATA,
                               N_("Mark data farther than 3σ from mean value"));
@@ -78,12 +79,7 @@ outliers(GwyContainer *data, GwyRunType run)
                                      0);
     g_return_if_fail(dfield && dquark);
     has_mask = !!maskfield;
-
-    /* Always owning a reference simplifies the logic. */
-    if (has_mask)
-        g_object_ref(maskfield);
-    else
-        maskfield = create_mask_field(dfield);
+    maskfield = create_mask_field(dfield);
 
     gwy_data_field_mask_outliers(dfield, maskfield, thresh);
 
@@ -96,22 +92,16 @@ outliers(GwyContainer *data, GwyRunType run)
                                        0.0, 0.0, &count, NULL);
     count = xres*yres - count;
 
-    if (count || has_mask)
+    if (count || has_mask) {
         gwy_app_undo_qcheckpointv(data, 1, &mquark);
 
-    if (count) {
-        if (has_mask)
-            gwy_data_field_data_changed(maskfield);
-        else
+        if (count)
             gwy_container_set_object(data, mquark, maskfield);
-    }
-    else {
-        if (has_mask)
+        else
             gwy_container_remove(data, mquark);
-        /* otherwise: do nothing */
-    }
-    gwy_app_channel_log_add_proc(data, id, id);
 
+        gwy_app_channel_log_add_proc(data, id, id);
+    }
     g_object_unref(maskfield);
 }
 
diff --git a/modules/process/pat_synth.c b/modules/process/pat_synth.c
index 4db4730..090f43f 100644
--- a/modules/process/pat_synth.c
+++ b/modules/process/pat_synth.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: pat_synth.c 19044 2016-10-08 19:10:46Z yeti-dn $
- *  Copyright (C) 2010,2011 David Necas (Yeti).
+ *  @(#) $Id: pat_synth.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2010-2017 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -221,12 +221,12 @@ static GwyModuleInfo module_info = {
     N_("Generates surfaces representing simple patterns "
        "(steps, ridges, ...)."),
     "Yeti <yeti at gwyddion.net>",
-    "1.5",
+    "1.6",
     "David Nečas (Yeti)",
     "2010",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, pat_synth)
 
 static gboolean
 module_register(void)
@@ -444,7 +444,7 @@ pat_synth_dialog(PatSynthArgs *args,
         g_signal_connect_swapped(controls.dims->add, "toggled",
                                  G_CALLBACK(pat_synth_invalidate), &controls);
 
-    table = gtk_table_new(1, 4, FALSE);
+    table = gtk_table_new(1, 3, FALSE);
     controls.table_parameters = GTK_TABLE(table);
     gtk_table_set_row_spacings(controls.table_parameters, 2);
     gtk_table_set_col_spacings(controls.table_parameters, 6);
@@ -455,8 +455,9 @@ pat_synth_dialog(PatSynthArgs *args,
     row = 0;
 
     controls.type = pattern_selector_new(&controls);
-    gwy_table_attach_hscale(table, row, _("_Pattern:"), NULL,
-                            GTK_OBJECT(controls.type), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("_Pattern:"), NULL,
+                            GTK_OBJECT(controls.type),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
     g_object_set_data(G_OBJECT(table), "base-rows", GINT_TO_POINTER(row));
 
diff --git a/modules/process/phase_synth.c b/modules/process/phase_synth.c
new file mode 100644
index 0000000..f6e3212
--- /dev/null
+++ b/modules/process/phase_synth.c
@@ -0,0 +1,808 @@
+/*
+ *  @(#) $Id: phase_synth.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2017 David Necas (Yeti).
+ *  E-mail: yeti at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <string.h>
+#include <stdlib.h>
+#include <gtk/gtk.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libgwyddion/gwyrandgenset.h>
+#include <libprocess/arithmetic.h>
+#include <libprocess/elliptic.h>
+#include <libprocess/filters.h>
+#include <libprocess/grains.h>
+#include <libprocess/inttrans.h>
+#include <libprocess/stats.h>
+#include <libgwymodule/gwymodule-process.h>
+#include <libgwydgets/gwystock.h>
+#include <app/gwyapp.h>
+#include "preview.h"
+#include "dimensions.h"
+
+#define PHASE_SYNTH_RUN_MODES (GWY_RUN_IMMEDIATE | GWY_RUN_INTERACTIVE)
+
+enum {
+    PAGE_DIMENSIONS = 0,
+    PAGE_GENERATOR  = 1,
+    PAGE_NPAGES
+};
+
+typedef struct {
+    gint active_page;
+    gint seed;
+    gboolean randomize;
+    gboolean update;
+    gdouble size;
+    gdouble size_noise;
+    gdouble height;
+} PhaseSynthArgs;
+
+typedef struct {
+    PhaseSynthArgs *args;
+    GwyDimensions *dims;
+    GtkWidget *dialog;
+    GtkWidget *view;
+    GtkWidget *update;
+    GtkWidget *update_now;
+    GtkObject *seed;
+    GtkTable *table;
+    GtkWidget *randomize;
+    GtkObject *size;
+    GtkWidget *size_value;
+    GtkWidget *size_units;
+    GtkObject *size_noise;
+    GtkObject *height;
+    GtkWidget *height_units;
+    GtkWidget *height_init;
+    GwyContainer *mydata;
+    GwyDataField *surface;
+    GwyDataField *phases;
+    gdouble pxsize;
+    gdouble zscale;
+    gboolean in_init;
+    gulong sid;
+} PhaseSynthControls;
+
+static gboolean module_register       (void);
+static void     phase_synth           (GwyContainer *data,
+                                       GwyRunType run);
+static void     run_noninteractive    (PhaseSynthArgs *args,
+                                       const GwyDimensionArgs *dimsargs,
+                                       GwyContainer *data,
+                                       GwyDataField *dfield,
+                                       gint oldid,
+                                       GQuark quark);
+static gboolean phase_synth_dialog    (PhaseSynthArgs *args,
+                                       GwyDimensionArgs *dimsargs,
+                                       GwyContainer *data,
+                                       GwyDataField *dfield,
+                                       gint id);
+static void     update_controls       (PhaseSynthControls *controls,
+                                       PhaseSynthArgs *args);
+static void     page_switched         (PhaseSynthControls *controls,
+                                       GtkNotebookPage *page,
+                                       gint pagenum);
+static void     update_values         (PhaseSynthControls *controls);
+static void     height_init_clicked   (PhaseSynthControls *controls);
+static void     phase_synth_invalidate(PhaseSynthControls *controls);
+static gboolean preview_gsource       (gpointer user_data);
+static void     preview               (PhaseSynthControls *controls);
+static void     phase_synth_do        (const PhaseSynthArgs *args,
+                                       const GwyDimensionArgs *dimsargs,
+                                       GwyDataField *dfield);
+static void     phase_synth_load_args (GwyContainer *container,
+                                       PhaseSynthArgs *args,
+                                       GwyDimensionArgs *dimsargs);
+static void     phase_synth_save_args (GwyContainer *container,
+                                       const PhaseSynthArgs *args,
+                                       const GwyDimensionArgs *dimsargs);
+
+#define GWY_SYNTH_CONTROLS PhaseSynthControls
+#define GWY_SYNTH_INVALIDATE(controls) \
+    phase_synth_invalidate(controls)
+
+#include "synth.h"
+
+static const PhaseSynthArgs phase_synth_defaults = {
+    PAGE_DIMENSIONS,
+    42, TRUE, TRUE,
+    20.0, 0.05, 1.0,
+};
+
+static const GwyDimensionArgs dims_defaults = GWY_DIMENSION_ARGS_INIT;
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION,
+    &module_register,
+    N_("Generates phase-separated structures."),
+    "Yeti <yeti at gwyddion.net>",
+    "1.1",
+    "David Nečas (Yeti)",
+    "2017",
+};
+
+GWY_MODULE_QUERY2(module_info, phase_synth)
+
+static gboolean
+module_register(void)
+{
+    gwy_process_func_register("phase_synth",
+                              (GwyProcessFunc)&phase_synth,
+                              N_("/S_ynthetic/P_hases..."),
+                              GWY_STOCK_SYNTHETIC_PHASES,
+                              PHASE_SYNTH_RUN_MODES,
+                              0,
+                              N_("Generate surface with separated phases"));
+
+    return TRUE;
+}
+
+static void
+phase_synth(GwyContainer *data, GwyRunType run)
+{
+    PhaseSynthArgs args;
+    GwyDimensionArgs dimsargs;
+    GwyDataField *dfield;
+    GQuark quark;
+    gint id;
+
+    g_return_if_fail(run & PHASE_SYNTH_RUN_MODES);
+    phase_synth_load_args(gwy_app_settings_get(), &args, &dimsargs);
+    gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &dfield,
+                                     GWY_APP_DATA_FIELD_ID, &id,
+                                     GWY_APP_DATA_FIELD_KEY, &quark,
+                                     0);
+
+    if (run == GWY_RUN_IMMEDIATE
+        || phase_synth_dialog(&args, &dimsargs, data, dfield, id))
+        run_noninteractive(&args, &dimsargs, data, dfield, id, quark);
+
+    if (run == GWY_RUN_INTERACTIVE)
+        phase_synth_save_args(gwy_app_settings_get(), &args, &dimsargs);
+
+    gwy_dimensions_free_args(&dimsargs);
+}
+
+static gboolean
+phase_synth_dialog(PhaseSynthArgs *args,
+                   GwyDimensionArgs *dimsargs,
+                   GwyContainer *data,
+                   GwyDataField *dfield_template,
+                   gint id)
+{
+    GtkWidget *dialog, *table, *vbox, *hbox, *notebook, *spin;
+    PhaseSynthControls controls;
+    GwyDataField *dfield;
+    GtkObject *adj;
+    gboolean finished;
+    gint response;
+    gint row;
+
+    gwy_clear(&controls, 1);
+    controls.in_init = TRUE;
+    controls.args = args;
+    dialog = gtk_dialog_new_with_buttons(_("Separated Phases"),
+                                         NULL, 0,
+                                         _("_Reset"), RESPONSE_RESET,
+                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                         GTK_STOCK_OK, GTK_RESPONSE_OK,
+                                         NULL);
+    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
+    gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
+    controls.dialog = dialog;
+
+    hbox = gtk_hbox_new(FALSE, 2);
+    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox,
+                       FALSE, FALSE, 4);
+
+    vbox = gtk_vbox_new(FALSE, 4);
+    gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 4);
+
+    controls.mydata = gwy_container_new();
+    dfield = gwy_data_field_new(PREVIEW_SIZE, PREVIEW_SIZE,
+                                dimsargs->measure*PREVIEW_SIZE,
+                                dimsargs->measure*PREVIEW_SIZE,
+                                TRUE);
+    gwy_container_set_object_by_name(controls.mydata, "/0/data", dfield);
+    controls.phases = gwy_data_field_new_alike(dfield, FALSE);
+    if (dfield_template) {
+        gwy_app_sync_data_items(data, controls.mydata, id, 0, FALSE,
+                                GWY_DATA_ITEM_PALETTE,
+                                0);
+        controls.surface = gwy_synth_surface_for_preview(dfield_template,
+                                                         PREVIEW_SIZE);
+        controls.zscale = gwy_data_field_get_rms(dfield_template);
+    }
+    controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, FALSE);
+    gtk_box_pack_start(GTK_BOX(vbox), controls.view, FALSE, FALSE, 0);
+
+    gtk_box_pack_start(GTK_BOX(vbox),
+                       gwy_synth_instant_updates_new(&controls,
+                                                     &controls.update_now,
+                                                     &controls.update,
+                                                     &args->update),
+                       FALSE, FALSE, 0);
+    g_signal_connect_swapped(controls.update_now, "clicked",
+                             G_CALLBACK(preview), &controls);
+
+    gtk_box_pack_start(GTK_BOX(vbox),
+                       gwy_synth_random_seed_new(&controls,
+                                                 &controls.seed, &args->seed),
+                       FALSE, FALSE, 0);
+
+    controls.randomize = gwy_synth_randomize_new(&args->randomize);
+    gtk_box_pack_start(GTK_BOX(vbox), controls.randomize, FALSE, FALSE, 0);
+
+    notebook = gtk_notebook_new();
+    gtk_box_pack_start(GTK_BOX(hbox), notebook, TRUE, TRUE, 4);
+    g_signal_connect_swapped(notebook, "switch-page",
+                             G_CALLBACK(page_switched), &controls);
+
+    controls.dims = gwy_dimensions_new(dimsargs, dfield_template);
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
+                             gwy_dimensions_get_widget(controls.dims),
+                             gtk_label_new(_("Dimensions")));
+    if (controls.dims->add)
+        g_signal_connect_swapped(controls.dims->add, "toggled",
+                                 G_CALLBACK(phase_synth_invalidate), &controls);
+
+    table = gtk_table_new(3 + (dfield_template ? 1 : 0), 3, FALSE);
+    controls.table = GTK_TABLE(table);
+    gtk_table_set_row_spacings(controls.table, 2);
+    gtk_table_set_col_spacings(controls.table, 6);
+    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table,
+                             gtk_label_new(_("Generator")));
+    row = 0;
+
+    controls.size = gtk_adjustment_new(args->size, 1.0, 1000.0, 0.1, 10.0, 0);
+    row = gwy_synth_attach_lateral(&controls, row, controls.size, &args->size,
+                                   _("_Size:"), GWY_HSCALE_LOG,
+                                   NULL,
+                                   &controls.size_value, &controls.size_units);
+
+    adj = gtk_adjustment_new(args->size_noise, 0.001, 0.5, 0.001, 0.1, 0);
+    g_object_set_data(G_OBJECT(adj), "target", &args->size_noise);
+
+    spin = gwy_table_attach_adjbar(GTK_WIDGET(controls.table),
+                                   row, _("Size s_pread:"), NULL, adj,
+                                   GWY_HSCALE_SQRT);
+    gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(spin), FALSE);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
+    g_signal_connect_swapped(adj, "value-changed",
+                             G_CALLBACK(gwy_synth_double_changed), &controls);
+    row++;
+
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    row = gwy_synth_attach_height(&controls, row,
+                                  &controls.height, &args->height,
+                                  _("_Height:"), NULL, &controls.height_units);
+
+    if (dfield_template) {
+        controls.height_init
+            = gtk_button_new_with_mnemonic(_("_Like Current Image"));
+        g_signal_connect_swapped(controls.height_init, "clicked",
+                                 G_CALLBACK(height_init_clicked), &controls);
+        gtk_table_attach(GTK_TABLE(table), controls.height_init,
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+        row++;
+    }
+
+    gtk_widget_show_all(dialog);
+    controls.in_init = FALSE;
+    /* Must be done when widgets are shown, see GtkNotebook docs */
+    gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), args->active_page);
+    update_values(&controls);
+    phase_synth_invalidate(&controls);
+
+    finished = FALSE;
+    while (!finished) {
+        response = gtk_dialog_run(GTK_DIALOG(dialog));
+        switch (response) {
+            case GTK_RESPONSE_CANCEL:
+            case GTK_RESPONSE_DELETE_EVENT:
+            case GTK_RESPONSE_OK:
+            gtk_widget_destroy(dialog);
+            case GTK_RESPONSE_NONE:
+            finished = TRUE;
+            break;
+
+            case RESPONSE_RESET:
+            {
+                gboolean temp = args->update;
+                gint temp2 = args->active_page;
+                *args = phase_synth_defaults;
+                args->active_page = temp2;
+                args->update = temp;
+            }
+            controls.in_init = TRUE;
+            update_controls(&controls, args);
+            controls.in_init = FALSE;
+            if (args->update)
+                preview(&controls);
+            break;
+
+            default:
+            g_assert_not_reached();
+            break;
+        }
+    }
+
+    if (controls.sid) {
+        g_source_remove(controls.sid);
+        controls.sid = 0;
+    }
+    g_object_unref(controls.mydata);
+    GWY_OBJECT_UNREF(controls.surface);
+    GWY_OBJECT_UNREF(controls.phases);
+    gwy_dimensions_free(controls.dims);
+
+    return response == GTK_RESPONSE_OK;
+}
+
+static void
+update_controls(PhaseSynthControls *controls,
+                PhaseSynthArgs *args)
+{
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->update),
+                                 args->update);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->seed), args->seed);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->randomize),
+                                 args->randomize);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->height), args->height);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->size),
+                             args->size);
+}
+
+static void
+page_switched(PhaseSynthControls *controls,
+              G_GNUC_UNUSED GtkNotebookPage *page,
+              gint pagenum)
+{
+    if (controls->in_init)
+        return;
+
+    controls->args->active_page = pagenum;
+
+    if (pagenum == PAGE_GENERATOR)
+        update_values(controls);
+}
+
+static void
+update_values(PhaseSynthControls *controls)
+{
+    GwyDimensions *dims = controls->dims;
+
+    controls->pxsize = dims->args->measure * pow10(dims->args->xypow10);
+    if (controls->height_units)
+        gtk_label_set_markup(GTK_LABEL(controls->height_units),
+                             dims->zvf->units);
+    gtk_label_set_markup(GTK_LABEL(controls->size_units),
+                         dims->xyvf->units);
+
+    gwy_synth_update_lateral(controls, GTK_ADJUSTMENT(controls->size));
+}
+
+static void
+height_init_clicked(PhaseSynthControls *controls)
+{
+    gdouble mag = pow10(controls->dims->args->zpow10);
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->height),
+                             controls->zscale/mag);
+}
+
+static void
+phase_synth_invalidate(PhaseSynthControls *controls)
+{
+    /* create preview if instant updates are on */
+    if (controls->args->update && !controls->in_init && !controls->sid) {
+        controls->sid = g_idle_add_full(G_PRIORITY_LOW, preview_gsource,
+                                        controls, NULL);
+    }
+}
+
+static gboolean
+preview_gsource(gpointer user_data)
+{
+    PhaseSynthControls *controls = (PhaseSynthControls*)user_data;
+    controls->sid = 0;
+
+    preview(controls);
+
+    return FALSE;
+}
+
+static void
+preview(PhaseSynthControls *controls)
+{
+    PhaseSynthArgs *args = controls->args;
+    GwyDataField *dfield;
+
+    dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata,
+                                                             "/0/data"));
+    if (controls->dims->args->add && controls->surface)
+        gwy_data_field_copy(controls->surface, dfield, FALSE);
+    else
+        gwy_data_field_clear(dfield);
+
+    phase_synth_do(args, controls->dims->args, dfield);
+
+    gwy_data_field_data_changed(dfield);
+}
+
+static void
+run_noninteractive(PhaseSynthArgs *args,
+                   const GwyDimensionArgs *dimsargs,
+                   GwyContainer *data,
+                   GwyDataField *dfield,
+                   gint oldid,
+                   GQuark quark)
+{
+    GwySIUnit *siunit;
+    gboolean replace = dimsargs->replace && dfield;
+    gboolean add = dimsargs->add && dfield;
+    gint newid;
+
+    if (args->randomize)
+        args->seed = g_random_int() & 0x7fffffff;
+
+    if (replace) {
+        /* Always take a reference so that we can always unref. */
+        g_object_ref(dfield);
+
+        gwy_app_undo_qcheckpointv(data, 1, &quark);
+        if (!add)
+            gwy_data_field_clear(dfield);
+
+        gwy_app_channel_log_add_proc(data, oldid, oldid);
+    }
+    else {
+        if (add)
+            dfield = gwy_data_field_duplicate(dfield);
+        else {
+            gdouble mag = pow10(dimsargs->xypow10) * dimsargs->measure;
+            dfield = gwy_data_field_new(dimsargs->xres, dimsargs->yres,
+                                        mag*dimsargs->xres, mag*dimsargs->yres,
+                                        TRUE);
+
+            siunit = gwy_data_field_get_si_unit_xy(dfield);
+            gwy_si_unit_set_from_string(siunit, dimsargs->xyunits);
+
+            siunit = gwy_data_field_get_si_unit_z(dfield);
+            gwy_si_unit_set_from_string(siunit, dimsargs->zunits);
+        }
+    }
+
+    phase_synth_do(args, dimsargs, dfield);
+
+    if (replace)
+        gwy_data_field_data_changed(dfield);
+    else {
+        if (data) {
+            newid = gwy_app_data_browser_add_data_field(dfield, data, TRUE);
+            if (oldid != -1)
+                gwy_app_sync_data_items(data, data, oldid, newid, FALSE,
+                                        GWY_DATA_ITEM_GRADIENT,
+                                        0);
+        }
+        else {
+            newid = 0;
+            data = gwy_container_new();
+            gwy_container_set_object(data, gwy_app_get_data_key_for_id(newid),
+                                     dfield);
+            gwy_app_data_browser_add(data);
+            gwy_app_data_browser_reset_visibility(data,
+                                                  GWY_VISIBILITY_RESET_SHOW_ALL);
+            g_object_unref(data);
+        }
+
+        gwy_app_set_data_field_title(data, newid, _("Generated"));
+        gwy_app_channel_log_add_proc(data, add ? oldid : -1, newid);
+    }
+    g_object_unref(dfield);
+}
+
+#ifdef HAVE_SINCOS
+#define _gwy_sincos sincos
+#else
+static inline void
+_gwy_sincos(gdouble x, gdouble *s, gdouble *c)
+{
+    *s = sin(x);
+    *c = cos(x);
+}
+#endif
+
+static void
+generate_narrow_freq_surface(gdouble freq, gdouble freq_range,
+                             GwyDataField *buf_re, GwyDataField *buf_im,
+                             GwyDataField *out_re, GwyDataField *out_im,
+                             GRand *rng)
+{
+    gdouble *re, *im;
+    gint xres, yres, i, j, k;
+
+    re = gwy_data_field_get_data(buf_re);
+    im = gwy_data_field_get_data(buf_im);
+
+    xres = gwy_data_field_get_xres(out_re);
+    yres = gwy_data_field_get_yres(out_re);
+
+    freq /= G_PI;
+    freq_range /= G_PI;
+
+    k = 0;
+    for (i = 0; i < yres; i++) {
+        gdouble y = (i <= yres/2 ? i : yres-i)/(0.5*yres);
+        for (j = 0; j < xres; j++) {
+            gdouble x = (j <= xres/2 ? j : xres-j)/(0.5*xres);
+            gdouble r = sqrt(x*x + y*y);
+            gdouble f, phi, s, c;
+
+            phi = 2.0*G_PI*g_rand_double(rng);
+            f = g_rand_double(rng);
+            r = fabs((r - freq)/freq_range);
+            if (r > 30.0)
+                re[k] = im[k] = 0.0;
+            else {
+                _gwy_sincos(phi, &s, &c);
+                r = exp(r);
+                f /= r + 1.0/r;
+                re[k] = f*s;
+                im[k] = f*c;
+            }
+            k++;
+        }
+    }
+    re[0] = im[0] = 0.0;
+
+    gwy_data_field_2dfft_raw(buf_re, buf_im, out_re, out_im,
+                             GWY_TRANSFORM_DIRECTION_BACKWARD);
+}
+
+static void
+threshold_based_on_distance(GwyDataField *dfield,
+                            GwyDataField *buf1,
+                            GwyDataField *buf2,
+                            GwyDataField *result)
+{
+    gdouble thresh;
+
+    thresh = gwy_data_field_otsu_threshold(dfield);
+
+    gwy_data_field_copy(dfield, buf1, FALSE);
+    gwy_data_field_threshold(buf1, thresh, 0.0, 1.0);
+    gwy_data_field_grains_invert(buf1);
+    gwy_data_field_grains_thin(buf1);
+    gwy_data_field_mark_extrema(dfield, result, FALSE);
+    gwy_data_field_max_of_fields(buf1, result, buf1);
+    gwy_data_field_grains_invert(buf1);
+    gwy_data_field_grain_distance_transform(buf1);
+
+    gwy_data_field_copy(dfield, buf2, FALSE);
+    gwy_data_field_threshold(buf2, thresh, 0.0, 1.0);
+    gwy_data_field_grains_thin(buf2);
+    gwy_data_field_mark_extrema(dfield, result, TRUE);
+    gwy_data_field_max_of_fields(buf2, result, buf2);
+    gwy_data_field_grains_invert(buf2);
+    gwy_data_field_grain_distance_transform(buf2);
+
+    gwy_data_field_subtract_fields(result, buf1, buf2);
+    gwy_data_field_threshold(result, 0.0, 0.0, 1.0);
+}
+
+#if 0
+static GwyXY*
+find_extrema_pointset(GwyDataField *dfield, GwyDataField *buf, gboolean maxima,
+                      guint *npoints)
+{
+    const GwyGrainQuantity quantities[] = {
+        GWY_GRAIN_VALUE_CENTER_X, GWY_GRAIN_VALUE_CENTER_Y,
+    };
+    guint xres = gwy_data_field_get_xres(dfield);
+    guint yres = gwy_data_field_get_yres(dfield);
+    gint *grains = g_new0(gint, xres*yres);
+    gdouble **values;
+    guint ngrains, i;
+    GwyXY *coords;
+
+    gwy_data_field_mark_extrema(dfield, buf, maxima);
+    ngrains = gwy_data_field_number_grains(buf, grains);
+
+    values = gwy_data_field_grains_get_quantities(dfield, NULL, quantities, 2,
+                                                  ngrains, grains);
+    coords = g_new(GwyXY, ngrains);
+    for (i = 0; i < ngrains; i++) {
+        coords[i].x = values[0][i+1];
+        coords[i].y = values[1][i+1];
+    }
+
+    g_free(grains);
+    g_free(values[0]);
+    g_free(values[1]);
+    g_free(values);
+
+    *npoints = ngrains;
+    return coords;
+}
+#endif
+
+static void
+regularise_with_asf(GwyDataField *dfield, GwyDataField *buf,
+                    GwyDataField *kernel, guint maxksize)
+{
+    guint i, res, xres = dfield->xres, yres = dfield->yres;
+
+    gwy_data_field_copy(dfield, buf, FALSE);
+    for (i = 1; i <= maxksize; i++) {
+        res = 2*i + 1;
+        gwy_data_field_resample(kernel, res, res, GWY_INTERPOLATION_NONE);
+        gwy_data_field_clear(kernel);
+        gwy_data_field_elliptic_area_fill(kernel, 0, 0, res, res, 1.0);
+
+        gwy_data_field_area_filter_min_max(dfield, kernel,
+                                           GWY_MIN_MAX_FILTER_OPENING,
+                                           0, 0, xres, yres);
+        gwy_data_field_area_filter_min_max(dfield, kernel,
+                                           GWY_MIN_MAX_FILTER_CLOSING,
+                                           0, 0, xres, yres);
+
+        gwy_data_field_area_filter_min_max(buf, kernel,
+                                           GWY_MIN_MAX_FILTER_CLOSING,
+                                           0, 0, xres, yres);
+        gwy_data_field_area_filter_min_max(buf, kernel,
+                                           GWY_MIN_MAX_FILTER_OPENING,
+                                           0, 0, xres, yres);
+    }
+    gwy_data_field_sum_fields(dfield, buf, dfield);
+    gwy_data_field_multiply(dfield, 0.5);
+}
+
+static void
+phase_synth_do(const PhaseSynthArgs *args,
+               const GwyDimensionArgs *dimsargs,
+               GwyDataField *dfield)
+{
+    GwyDataField *buf1, *buf2, *buf3, *kernel, *tmp;
+    guint xres, yres, kxres, kyres, extsize, asfradius;
+    GwyRandGenSet *rngset;
+    gdouble freq_range = args->size_noise, freq = G_PI/args->size;
+
+    /* spread is relative */
+    freq_range *= freq;
+    /* rough mean frequency correction */
+    freq /= 1.0 + pow(freq_range/freq, 2)/3.0;
+
+    kxres = GWY_ROUND(2.0*G_PI/freq * 1.2) | 1;
+    kyres = GWY_ROUND(2.0*G_PI/freq * 1.2) | 1;
+    extsize = GWY_ROUND(G_PI/freq);
+    asfradius = GWY_ROUND(0.08*2.0*G_PI/freq);
+    gwy_debug("kernel %ux%u, extsize %u, asf %u",
+              kxres, kyres, extsize, asfradius);
+
+    xres = gwy_data_field_get_xres(dfield);
+    yres = gwy_data_field_get_yres(dfield);
+
+    buf1 = gwy_data_field_new_alike(dfield, FALSE);
+    buf2 = gwy_data_field_new_alike(dfield, FALSE);
+    buf3 = gwy_data_field_new_alike(dfield, FALSE);
+
+    rngset = gwy_rand_gen_set_new(1);
+    gwy_rand_gen_set_init(rngset, args->seed);
+
+    generate_narrow_freq_surface(freq, freq_range, buf1, buf2, dfield, buf3,
+                                 gwy_rand_gen_set_rng(rngset, 0));
+    tmp = gwy_data_field_extend(dfield, extsize, extsize, extsize, extsize,
+                                GWY_EXTERIOR_PERIODIC, 0.0, FALSE);
+    gwy_data_field_resample(buf1, tmp->xres, tmp->yres, GWY_INTERPOLATION_NONE);
+    gwy_data_field_resample(buf2, tmp->xres, tmp->yres, GWY_INTERPOLATION_NONE);
+    gwy_data_field_resample(buf3, tmp->xres, tmp->yres, GWY_INTERPOLATION_NONE);
+
+    kernel = gwy_data_field_new(kxres, kyres, 1.0, 1.0, TRUE);
+    gwy_data_field_elliptic_area_fill(kernel, 0, 0, kxres, kyres, 1.0);
+    gwy_data_field_area_filter_min_max(dfield, kernel,
+                                       GWY_MIN_MAX_FILTER_NORMALIZATION,
+                                       0, 0, xres, yres);
+    gwy_data_field_copy(tmp, buf3, FALSE);
+    threshold_based_on_distance(buf3, buf1, buf2, tmp);
+    regularise_with_asf(tmp, buf1, kernel, asfradius);
+
+    gwy_data_field_area_copy(tmp, dfield,
+                             extsize, extsize, dfield->xres, dfield->yres,
+                             0, 0);
+    gwy_data_field_multiply(dfield, args->height * pow10(dimsargs->zpow10));
+
+    g_object_unref(kernel);
+    g_object_unref(tmp);
+    g_object_unref(buf1);
+    g_object_unref(buf2);
+    g_object_unref(buf3);
+
+    gwy_rand_gen_set_free(rngset);
+}
+
+static const gchar prefix[]          = "/module/phase_synth";
+static const gchar active_page_key[] = "/module/phase_synth/active_page";
+static const gchar height_key[]      = "/module/phase_synth/height";
+static const gchar randomize_key[]   = "/module/phase_synth/randomize";
+static const gchar seed_key[]        = "/module/phase_synth/seed";
+static const gchar size_key[]        = "/module/phase_synth/size";
+static const gchar size_noise_key[]  = "/module/phase_synth/size_noise";
+static const gchar update_key[]      = "/module/phase_synth/update";
+
+static void
+phase_synth_sanitize_args(PhaseSynthArgs *args)
+{
+    args->active_page = CLAMP(args->active_page,
+                              PAGE_DIMENSIONS, PAGE_NPAGES-1);
+    args->update = !!args->update;
+    args->seed = MAX(0, args->seed);
+    args->randomize = !!args->randomize;
+    args->size = CLAMP(args->size, 1.0, 1000.0);
+    args->size_noise = CLAMP(args->size_noise, 0.001, 0.5);
+    args->height = CLAMP(args->height, 0.001, 10000.0);
+}
+
+static void
+phase_synth_load_args(GwyContainer *container,
+                      PhaseSynthArgs *args,
+                      GwyDimensionArgs *dimsargs)
+{
+    *args = phase_synth_defaults;
+
+    gwy_container_gis_int32_by_name(container, active_page_key,
+                                    &args->active_page);
+    gwy_container_gis_boolean_by_name(container, update_key, &args->update);
+    gwy_container_gis_int32_by_name(container, seed_key, &args->seed);
+    gwy_container_gis_boolean_by_name(container, randomize_key,
+                                      &args->randomize);
+    gwy_container_gis_double_by_name(container, height_key, &args->height);
+    gwy_container_gis_double_by_name(container, size_key, &args->size);
+    gwy_container_gis_double_by_name(container, size_noise_key,
+                                     &args->size_noise);
+    phase_synth_sanitize_args(args);
+
+    gwy_clear(dimsargs, 1);
+    gwy_dimensions_copy_args(&dims_defaults, dimsargs);
+    gwy_dimensions_load_args(dimsargs, container, prefix);
+}
+
+static void
+phase_synth_save_args(GwyContainer *container,
+                      const PhaseSynthArgs *args,
+                      const GwyDimensionArgs *dimsargs)
+{
+    gwy_container_set_int32_by_name(container, active_page_key,
+                                    args->active_page);
+    gwy_container_set_boolean_by_name(container, update_key, args->update);
+    gwy_container_set_int32_by_name(container, seed_key, args->seed);
+    gwy_container_set_boolean_by_name(container, randomize_key,
+                                      args->randomize);
+    gwy_container_set_double_by_name(container, height_key, args->height);
+    gwy_container_set_double_by_name(container, size_key, args->size);
+    gwy_container_set_double_by_name(container, size_noise_key,
+                                     args->size_noise);
+
+    gwy_dimensions_save_args(dimsargs, container, prefix);
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/process/pid.c b/modules/process/pid.c
index 8cc7884..b24bd18 100644
--- a/modules/process/pid.c
+++ b/modules/process/pid.c
@@ -78,7 +78,6 @@ static gboolean    run_pid                    (GwyDataField *dfield,
 static void        pid_values_update          (PIDControls *controls,
                                                PIDArgs *args);
 
-
 static const PIDArgs pid_defaults = {
     1,
     1,
@@ -100,7 +99,7 @@ static GwyModuleInfo module_info = {
     "2012",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, pid)
 
 static gboolean
 module_register(void)
@@ -191,9 +190,8 @@ static gboolean
 pid_dialog(PIDArgs *args)
 {
     GtkWidget *dialog, *table, *spin;
-    gint row = 0;
+    gint response, row = 0;
     PIDControls controls;
-    gint response;
 
     dialog = gtk_dialog_new_with_buttons(_("PID simulation"), NULL, 0,
                                          _("_Reset"), RESPONSE_RESET,
@@ -203,7 +201,7 @@ pid_dialog(PIDArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(4, 4, FALSE);
+    table = gtk_table_new(4, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -211,57 +209,60 @@ pid_dialog(PIDArgs *args)
                        FALSE, FALSE, 4);
 
 
-    controls.proportional = gtk_adjustment_new(args->proportional, 0.0, 100, 0.1, 1, 0);
-    spin = gwy_table_attach_spinbutton(table, row, _("_Proportional:"), "",
-                                controls.proportional);
+    controls.proportional = gtk_adjustment_new(args->proportional,
+                                               0.0, 100, 0.1, 1, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("_Proportional:"), NULL,
+                                   controls.proportional, GWY_HSCALE_SQRT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 1);
     row++;
 
     controls.integral = gtk_adjustment_new(args->integral, 0.0, 100, 0.1, 1, 0);
-    spin = gwy_table_attach_spinbutton(table, row, _("_Integral:"), "",
-                                controls.integral);
+    spin = gwy_table_attach_adjbar(table, row, _("_Integral:"), NULL,
+                                   controls.integral, GWY_HSCALE_SQRT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 1);
     row++;
 
     controls.tau = gtk_adjustment_new(args->tau, 2, 100, 1, 1, 0);
-    spin = gwy_table_attach_spinbutton(table, row, _("_Integration steps:"), "",
-                                controls.tau);
+    spin = gwy_table_attach_adjbar(table, row, _("_Integration steps:"), NULL,
+                                   controls.tau,
+                                   GWY_HSCALE_SQRT | GWY_HSCALE_SNAP);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 0);
     row++;
 
-
-    controls.derivative = gtk_adjustment_new(args->derivative, 0.0, 100, 0.1, 1, 0);
-    spin = gwy_table_attach_spinbutton(table, row, _("_Derivative:"), "",
-                                controls.derivative);
+    controls.derivative = gtk_adjustment_new(args->derivative,
+                                             0.0, 100, 0.1, 1, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("_Derivative:"), NULL,
+                                   controls.derivative, GWY_HSCALE_SQRT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 1);
-
     row++;
 
     controls.ratio = gtk_adjustment_new(args->ratio, 1, 1000, 1, 10, 0);
-    gwy_table_attach_spinbutton(table, row, _("PID/scan speed _ratio:"), "",
-                                controls.ratio);
+    gwy_table_attach_adjbar(table, row, _("PID/scan speed _ratio:"), NULL,
+                            controls.ratio, GWY_HSCALE_SQRT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 0);
     row++;
 
-/*    controls.fpower = gtk_adjustment_new(args->fpower, 1, 20, 1, 10, 0);
-    gwy_table_attach_spinbutton(table, row, _("Force power law:"), "",
-                                controls.fpower);
+    /*
+    controls.fpower = gtk_adjustment_new(args->fpower, 1, 20, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Force power law:"), NULL,
+                            controls.fpower,
+                            GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 0);
-    row++;*/
+    row++;
+    */
 
     controls.fstrength = gtk_adjustment_new(args->fstrength, 0, 1000, 1, 10, 0);
-    gwy_table_attach_spinbutton(table, row, _("Force strength:"), "",
-                                controls.fstrength);
+    gwy_table_attach_adjbar(table, row, _("Force strength:"), NULL,
+                            controls.fstrength, GWY_HSCALE_SQRT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 1);
     row++;
 
     controls.fsetpoint = gtk_adjustment_new(args->fsetpoint, 0, 1000, 1, 10, 0);
-    gwy_table_attach_spinbutton(table, row, _("Force setpoint:"), "",
-                                controls.fsetpoint);
+    gwy_table_attach_adjbar(table, row, _("Force setpoint:"), NULL,
+                            controls.fsetpoint, GWY_HSCALE_SQRT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 1);
     row++;
 
-
     gtk_widget_show_all(dialog);
     do {
         response = gtk_dialog_run(GTK_DIALOG(dialog));
@@ -349,7 +350,6 @@ run_pid(GwyDataField *dfield, GwyContainer *data, gint id, GwyDataField *fw, Gwy
     dfrev = gwy_data_field_get_data(frev);
     surface = gwy_data_field_get_data(dfield);
 
-
     /*primitive normalisation*/
     zpos = surface[0];
     setpoint = args->fsetpoint;
@@ -359,36 +359,41 @@ run_pid(GwyDataField *dfield, GwyContainer *data, gint id, GwyDataField *fw, Gwy
     nprev = args->tau;
 
     /*scan, forming forward and backward data and error signals*/
-    if (!gwy_app_wait_set_message(_("Scanning..."))) return 0;
+    if (!gwy_app_wait_set_message(_("Scanning..."))) {
+        gwy_app_wait_finish();
+        return FALSE;
+    }
 
-    for (trow=-2; trow<(2*yres); trow++) //start with one complete scan line that is then throwen away
-    {
+    //start with one complete scan line that is then throwen away
+    for (trow = -2; trow < 2*yres; trow++) {
         revdir = trow%2;
         row = MAX(0, trow/2);
 
-        for (tcol=0; tcol<xres; tcol++)
-        {
-            if (revdir) col = xres-tcol-1;
-            else col = tcol;
+        for (tcol=0; tcol<xres; tcol++) {
+            if (revdir)
+                col = xres-tcol-1;
+            else
+                col = tcol;
 
-            for (i=0; i<args->ratio; i++) { //here comes the ratio between scanning and feedback bandwidth
+            for (i = 0; i < args->ratio; i++) { //here comes the ratio between scanning and feedback bandwidth
                 force = strength*(surface[row*xres + col]-zpos);
                 //force = strength*pow((surface[row*xres + col]-zpos), args->fpower);
 
-                for (j=nprev; j>0; j--)
-                    previous[j]=previous[j-1];
-                previous[0] = (force-setpoint);
+                for (j = nprev; j > 0; j--)
+                    previous[j] = previous[j-1];
+                previous[0] = force - setpoint;
 
                 accumulator = 0;
-                for (j=0; j<nprev; j++) accumulator += previous[j]*(gdouble)(nprev-j)/(gdouble)nprev;
+                for (j = 0; j < nprev; j++)
+                    accumulator += previous[j]*(nprev-j)/nprev;
                 accumulator/=nprev;
 
                 zpos += (args->proportional*(force-setpoint)
                         + args->integral*accumulator
                         + args->derivative*(previous[0]-previous[1])/args->ratio)*zrange;
             }
-            if (gwy_isinf(zpos) || gwy_isnan(zpos) || gwy_isinf(force) || gwy_isnan(force))
-            {
+            if (gwy_isinf(zpos) || gwy_isnan(zpos)
+                || gwy_isinf(force) || gwy_isnan(force)) {
                 dialog = gtk_message_dialog_new(GTK_WINDOW(gwy_app_find_window_for_channel(data, id)),
                                                 GTK_DIALOG_DESTROY_WITH_PARENT,
                                                 GTK_MESSAGE_ERROR,
@@ -398,7 +403,7 @@ run_pid(GwyDataField *dfield, GwyContainer *data, gint id, GwyDataField *fw, Gwy
                 gtk_widget_destroy(dialog);
 
                 gwy_app_wait_finish();
-                return 0;
+                return FALSE;
             }
 
             if (trow >= 0) {
@@ -413,12 +418,14 @@ run_pid(GwyDataField *dfield, GwyContainer *data, gint id, GwyDataField *fw, Gwy
             }
 
         }
-        if (!gwy_app_wait_set_fraction((gdouble)row/(gdouble)yres))
-            return 0;
+        if (!gwy_app_wait_set_fraction((gdouble)row/(gdouble)yres)) {
+            gwy_app_wait_finish();
+            return FALSE;
+        }
     }
     gwy_app_wait_finish();
 
-    return 1;
+    return TRUE;
 }
 
 static void
@@ -463,7 +470,6 @@ pid_sanitize_args(PIDArgs *args)
     args->fpower = CLAMP(args->fpower, 1, 20);
     args->fstrength = CLAMP(args->fstrength, 0.0, 1000.0);
     args->fsetpoint = CLAMP(args->fsetpoint, 0.0, 1000.0);
-
 }
 
 static void
@@ -480,7 +486,6 @@ pid_load_args(GwyContainer *container,
     gwy_container_gis_int32_by_name(container, fpower_key, &args->fpower);
     gwy_container_gis_double_by_name(container, fstrength_key, &args->fstrength);
     gwy_container_gis_double_by_name(container, fsetpoint_key, &args->fsetpoint);
-
     pid_sanitize_args(args);
 }
 
@@ -496,7 +501,6 @@ pid_save_args(GwyContainer *container,
     gwy_container_set_int32_by_name(container, fpower_key, args->fpower);
     gwy_container_set_double_by_name(container, fstrength_key, args->fstrength);
     gwy_container_gis_double_by_name(container, fsetpoint_key, &args->fsetpoint);
-
 }
 
 /* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/process/polydistort.c b/modules/process/polydistort.c
index cddfadd..0578d6d 100644
--- a/modules/process/polydistort.c
+++ b/modules/process/polydistort.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: polydistort.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: polydistort.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2007,2008 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -138,7 +138,7 @@ static GwyModuleInfo module_info = {
     "2007",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, polydistort)
 
 static gboolean
 module_register(void)
@@ -190,7 +190,7 @@ distort_dialog(DistortArgs *args,
                GwyDataField *sfield,
                gint id)
 {
-    GtkWidget *dialog, *table, *hbox, *label;
+    GtkWidget *dialog, *table, *hbox, *label, *align;
     DistortControls controls;
     gint response;
     GSList *l;
@@ -221,6 +221,9 @@ distort_dialog(DistortArgs *args,
     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox,
                        FALSE, FALSE, 4);
 
+    align = gtk_alignment_new(0.0, 0.0, 0.0, 0.0);
+    gtk_box_pack_start(GTK_BOX(hbox), align, FALSE, FALSE, 4);
+
     controls.mydata = gwy_container_new();
     gwy_container_set_object_by_name(controls.mydata, "/0/data", dfield);
     gwy_app_sync_data_items(data, controls.mydata, id, 0, FALSE,
@@ -231,9 +234,9 @@ distort_dialog(DistortArgs *args,
                             0);
     controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, FALSE);
     g_object_unref(controls.mydata);
-    gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4);
+    gtk_container_add(GTK_CONTAINER(align), controls.view);
 
-    table = gtk_table_new(7, 4, FALSE);
+    table = gtk_table_new(7, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -244,7 +247,7 @@ distort_dialog(DistortArgs *args,
         = gwy_enum_combo_box_new(gwy_interpolation_type_get_enum(), -1,
                                  G_CALLBACK(interp_changed), &controls,
                                  args->interp, TRUE);
-    gwy_table_attach_hscale(table, row, _("_Interpolation type:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Interpolation type:"), NULL,
                             GTK_OBJECT(controls.interp),
                             GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
@@ -260,7 +263,7 @@ distort_dialog(DistortArgs *args,
                                   gwy_sgettext("exterior|Periodic"),
                                   GWY_EXTERIOR_PERIODIC,
                                   NULL);
-    gwy_table_attach_hscale(table, row, _("_Exterior type:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Exterior type:"), NULL,
                             GTK_OBJECT(controls.exterior),
                             GWY_HSCALE_WIDGET_NO_EXPAND);
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
@@ -268,7 +271,7 @@ distort_dialog(DistortArgs *args,
 
     hbox = gtk_hbox_new(FALSE, 6);
     gtk_table_attach(GTK_TABLE(table), hbox,
-                     0, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
     row++;
 
@@ -295,13 +298,13 @@ distort_dialog(DistortArgs *args,
                              G_CALLBACK(g_free), controls.xcoeff);
     gtk_table_attach(GTK_TABLE(table),
                      coeff_table_new(controls.xcoeff, (gpointer)"x", &controls),
-                     0, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
     row++;
 
     gtk_table_attach(GTK_TABLE(table),
                      gwy_label_new_header(_("Y Coefficients")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.ycoeff = g_new0(GtkWidget*, NCOEFF);
@@ -309,7 +312,7 @@ distort_dialog(DistortArgs *args,
                              G_CALLBACK(g_free), controls.ycoeff);
     gtk_table_attach(GTK_TABLE(table),
                      coeff_table_new(controls.ycoeff, (gpointer)"y", &controls),
-                     0, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
     row++;
 
@@ -317,7 +320,7 @@ distort_dialog(DistortArgs *args,
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.update),
                                  args->update);
     gtk_table_attach(GTK_TABLE(table), controls.update,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls.update, "toggled",
                      G_CALLBACK(update_changed), &controls);
     row++;
diff --git a/modules/process/polylevel.c b/modules/process/polylevel.c
index 81fae80..32ddd9c 100644
--- a/modules/process/polylevel.c
+++ b/modules/process/polylevel.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: polylevel.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: polylevel.c 19976 2017-06-24 10:47:58Z yeti-dn $
  *  Copyright (C) 2004,2008 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -142,12 +142,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Subtracts polynomial background."),
     "Yeti <yeti at gwyddion.net>",
-    "3.2",
+    "3.3",
     "David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, polylevel)
 
 static gboolean
 module_register(void)
@@ -155,7 +155,7 @@ module_register(void)
     gwy_process_func_register("polylevel",
                               (GwyProcessFunc)&poly_level,
                               N_("/_Level/_Polynomial Background..."),
-                              GWY_STOCK_POLYNOM,
+                              GWY_STOCK_POLYNOM_LEVEL,
                               POLYLEVEL_RUN_MODES,
                               GWY_MENU_FLAG_DATA,
                               N_("Remove polynomial background"));
@@ -412,15 +412,15 @@ poly_level_dialog(PolyLevelArgs *args,
     label = gtk_label_new(_("Leveled data"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1,
-                     GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+                     GTK_FILL, GTK_FILL, 0, 0);
 
     label = gtk_label_new(_("Background"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label, 1, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+                     GTK_FILL, GTK_FILL, 0, 0);
     row++;
 
-    table = gtk_table_new(7 + (mfield ? 4 : 0), 4, FALSE);
+    table = gtk_table_new(7 + (mfield ? 4 : 0), 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -433,29 +433,31 @@ poly_level_dialog(PolyLevelArgs *args,
                                    &controls,
                                    args->independent);
     gtk_table_attach(GTK_TABLE(table), GTK_WIDGET(controls.type_group->data),
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.col_degree = gtk_adjustment_new(args->col_degree,
                                              0, MAX_DEGREE, 1, 1, 0);
-    gwy_table_attach_hscale(table, row++,
+    gwy_table_attach_adjbar(table, row++,
                             _("_Horizontal polynom degree:"), NULL,
-                            controls.col_degree, 0);
+                            controls.col_degree,
+                            GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_signal_connect(controls.col_degree, "value-changed",
                      G_CALLBACK(poly_level_degree_changed), &controls);
 
     controls.row_degree = gtk_adjustment_new(args->row_degree,
                                              0, MAX_DEGREE, 1, 1, 0);
-    gwy_table_attach_hscale(table, row++,
+    gwy_table_attach_adjbar(table, row++,
                             _("_Vertical polynom degree:"), NULL,
-                            controls.row_degree, 0);
+                            controls.row_degree,
+                            GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_signal_connect(controls.row_degree, "value-changed",
                      G_CALLBACK(poly_level_degree_changed), &controls);
 
     controls.same_degree
         = gtk_check_button_new_with_mnemonic(_("_Same degrees"));
     gtk_table_attach(GTK_TABLE(table), controls.same_degree,
-                     0, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.same_degree),
                                  args->same_degree);
     g_signal_connect(controls.same_degree, "toggled",
@@ -465,14 +467,15 @@ poly_level_dialog(PolyLevelArgs *args,
 
     gtk_table_attach(GTK_TABLE(table),
                      GTK_WIDGET(controls.type_group->next->data),
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.max_degree = gtk_adjustment_new(args->max_degree,
                                              0, MAX_DEGREE, 1, 1, 0);
-    gwy_table_attach_hscale(table, row,
+    gwy_table_attach_adjbar(table, row,
                             _("_Maximum polynom degree:"), NULL,
-                            controls.max_degree, 0);
+                            controls.max_degree,
+                            GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_signal_connect(controls.max_degree, "value-changed",
                      G_CALLBACK(poly_level_max_degree_changed), &controls);
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
@@ -481,7 +484,7 @@ poly_level_dialog(PolyLevelArgs *args,
     controls.do_extract
         = gtk_check_button_new_with_mnemonic(_("E_xtract background"));
     gtk_table_attach(GTK_TABLE(table), controls.do_extract,
-                     0, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.do_extract),
                                  args->do_extract);
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
@@ -490,7 +493,7 @@ poly_level_dialog(PolyLevelArgs *args,
     if (mfield) {
         label = gwy_label_new_header(_("Masking Mode"));
         gtk_table_attach(GTK_TABLE(table), label,
-                        0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                        0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
 
         controls.masking_group
@@ -498,7 +501,7 @@ poly_level_dialog(PolyLevelArgs *args,
                                        G_CALLBACK(poly_level_masking_changed),
                                        &controls, args->masking);
         row = gwy_radio_buttons_attach_to_table(controls.masking_group,
-                                                GTK_TABLE(table), 3, row);
+                                                GTK_TABLE(table), 2, row);
     }
     else
         controls.masking_group = NULL;
diff --git a/modules/process/presentationops.c b/modules/process/presentationops.c
index fe89426..348a41b 100644
--- a/modules/process/presentationops.c
+++ b/modules/process/presentationops.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: presentationops.c 17087 2015-05-02 10:38:25Z yeti-dn $
+ *  @(#) $Id: presentationops.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -60,7 +60,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, presentationops)
 
 static gboolean
 module_register(void)
@@ -78,7 +78,7 @@ module_register(void)
                               NULL,
                               PRESENTATIONOPS_RUN_MODES,
                               GWY_MENU_FLAG_DATA_SHOW | GWY_MENU_FLAG_DATA,
-                              N_("Extract presentation to a new channel"));
+                              N_("Extract presentation to a new image"));
     gwy_process_func_register("presentation_attach",
                               (GwyProcessFunc)&presentation_attach,
                               N_("/_Presentation/_Attach Presentation..."),
@@ -230,7 +230,7 @@ presentation_attach(GwyContainer *data,
     label = gtk_label_new_with_mnemonic(_("_Data to attach:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
 
     chooser = gwy_data_chooser_new_channels();
     gwy_data_chooser_set_filter(GWY_DATA_CHOOSER(chooser),
@@ -238,7 +238,7 @@ presentation_attach(GwyContainer *data,
     gwy_data_chooser_set_active_id(GWY_DATA_CHOOSER(chooser),
                                    &attach_source_id);
     gtk_table_attach(GTK_TABLE(table), chooser, 1, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     gtk_label_set_mnemonic_widget(GTK_LABEL(label), chooser);
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
     row++;
diff --git a/modules/process/preview.h b/modules/process/preview.h
index f6a6fd7..8ad2385 100644
--- a/modules/process/preview.h
+++ b/modules/process/preview.h
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: preview.h 18537 2016-03-28 18:11:19Z yeti-dn $
- *  Copyright (C) 2015 David Necas (Yeti).
+ *  @(#) $Id: preview.h 19887 2017-06-09 18:26:57Z yeti-dn $
+ *  Copyright (C) 2015-2017 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -27,7 +27,10 @@
 #include <libgwydgets/gwydataview.h>
 #include <libgwydgets/gwylayer-basic.h>
 #include <libgwydgets/gwylayer-mask.h>
+#include <libgwydgets/gwystock.h>
+#include <libgwydgets/gwyradiobuttons.h>
 #include <libgwydgets/gwydgetutils.h>
+#include <app/menu.h>
 #include <app/gwymoduleutils.h>
 #include <app/data-browser.h>
 
@@ -50,6 +53,7 @@ enum {
     RESPONSE_CALCULATE = 7,
     RESPONSE_LOAD      = 8,
     RESPONSE_SAVE      = 9,
+    RESPONSE_COPY      = 10,
 };
 
 G_GNUC_UNUSED
@@ -215,6 +219,90 @@ create_mask_field(GwyDataField *dfield)
     return dfield;
 }
 
+static void
+mask_merge_enabled_changed(GtkToggleButton *toggle, GtkWidget *widget)
+{
+    gtk_widget_set_sensitive(widget, gtk_toggle_button_get_active(toggle));
+}
+
+/* Pass NULL @pcheck if you do not want a checkbox.
+ * XXX: Cannot work with both hscale and adjbar.  Must use with adjbar. */
+G_GNUC_UNUSED
+static void
+create_mask_merge_buttons(GtkWidget *table, gint row, const gchar *name,
+                          gboolean enabled, GCallback enabled_callback,
+                          GwyMergeType merge, GCallback merge_type_callback,
+                          gpointer user_data,
+                          GtkWidget **pcheck, GSList **ptype)
+{
+    GtkTooltips *tips;
+    GSList *group, *l;
+    GtkWidget *hbox, *button, *label;
+    GQuark quark = g_quark_from_string("gwy-radiobuttons-key");
+    gint value;
+
+    if (!name)
+        name = _("Combine with existing mask:");
+
+    tips = gwy_app_get_tooltips();
+
+    button = gtk_radio_button_new(NULL);
+    g_object_set_qdata(G_OBJECT(button), quark,
+                       GINT_TO_POINTER(GWY_MERGE_INTERSECTION));
+    gtk_container_add(GTK_CONTAINER(button),
+                      gtk_image_new_from_stock(GWY_STOCK_MASK_INTERSECT,
+                                               GTK_ICON_SIZE_BUTTON));
+    gtk_tooltips_set_tip(tips, button, _("Intersection"), NULL);
+
+    button = gtk_radio_button_new_from_widget(GTK_RADIO_BUTTON(button));
+    g_object_set_qdata(G_OBJECT(button), quark,
+                       GINT_TO_POINTER(GWY_MERGE_UNION));
+    gtk_container_add(GTK_CONTAINER(button),
+                      gtk_image_new_from_stock(GWY_STOCK_MASK_ADD,
+                                               GTK_ICON_SIZE_BUTTON));
+    gtk_tooltips_set_tip(tips, button, _("Union"), NULL);
+
+    group = *ptype = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
+    hbox = gtk_hbox_new(FALSE, 0);
+    gtk_table_attach(GTK_TABLE(table), hbox,
+                     1, 2, row, row+1, GTK_FILL, 0, 0, 0);
+
+    for (l = group; l; l = g_slist_next(l)) {
+        button = (GtkWidget*)l->data;
+        gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(button), FALSE);
+        gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+
+        value = GPOINTER_TO_INT(g_object_get_qdata(G_OBJECT(button), quark));
+        if (value == merge)
+            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+    }
+
+    if (merge_type_callback) {
+        for (l = group; l; l = g_slist_next(l)) {
+            g_signal_connect_swapped(l->data, "clicked",
+                                     merge_type_callback, user_data);
+        }
+    }
+
+    if (pcheck) {
+        label = *pcheck = gtk_check_button_new_with_mnemonic(name);
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(label), enabled);
+        gtk_widget_set_sensitive(hbox, enabled);
+        g_signal_connect(label, "toggled",
+                         G_CALLBACK(mask_merge_enabled_changed), hbox);
+        if (enabled_callback) {
+            g_signal_connect_swapped(*pcheck, "toggled",
+                                     enabled_callback, user_data);
+        }
+    }
+    else {
+        label = gtk_label_new(name);
+        gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+    }
+    gtk_table_attach(GTK_TABLE(table), label,
+                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
+}
+
 #endif
 
 /* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/process/process.c b/modules/process/process.c
new file mode 100644
index 0000000..411dc65
--- /dev/null
+++ b/modules/process/process.c
@@ -0,0 +1,254 @@
+/* This is a GENERATED file. */
+#include <glib.h>
+#include <libgwymodule/gwymodule.h>
+
+static const GwyModuleRecord* register_bundle(void);
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION | GWY_MODULE_BUNDLE_FLAG,
+    (GwyModuleRegisterFunc)&register_bundle,
+    NULL, NULL, NULL, NULL, NULL,
+};
+
+GWY_MODULE_QUERY(module_info)
+
+GwyModuleInfo* _gwy_module_query__acf2d(void);
+GwyModuleInfo* _gwy_module_query__angle_dist(void);
+GwyModuleInfo* _gwy_module_query__arithmetic(void);
+GwyModuleInfo* _gwy_module_query__averaging(void);
+GwyModuleInfo* _gwy_module_query__basicops(void);
+GwyModuleInfo* _gwy_module_query__bdep_synth(void);
+GwyModuleInfo* _gwy_module_query__calcoefs_load(void);
+GwyModuleInfo* _gwy_module_query__calcoefs_new(void);
+GwyModuleInfo* _gwy_module_query__calcoefs_simple(void);
+GwyModuleInfo* _gwy_module_query__calcoefs_view(void);
+GwyModuleInfo* _gwy_module_query__calibrate(void);
+GwyModuleInfo* _gwy_module_query__coerce(void);
+GwyModuleInfo* _gwy_module_query__col_synth(void);
+GwyModuleInfo* _gwy_module_query__convolution_filter(void);
+GwyModuleInfo* _gwy_module_query__correct_affine(void);
+GwyModuleInfo* _gwy_module_query__crosscor(void);
+GwyModuleInfo* _gwy_module_query__curvature(void);
+GwyModuleInfo* _gwy_module_query__cwt(void);
+GwyModuleInfo* _gwy_module_query__deposit_synth(void);
+GwyModuleInfo* _gwy_module_query__diff_synth(void);
+GwyModuleInfo* _gwy_module_query__domain_synth(void);
+GwyModuleInfo* _gwy_module_query__drift(void);
+GwyModuleInfo* _gwy_module_query__dwt(void);
+GwyModuleInfo* _gwy_module_query__dwtanisotropy(void);
+GwyModuleInfo* _gwy_module_query__edge(void);
+GwyModuleInfo* _gwy_module_query__entropy(void);
+GwyModuleInfo* _gwy_module_query__extend(void);
+GwyModuleInfo* _gwy_module_query__extract_path(void);
+GwyModuleInfo* _gwy_module_query__facet_level(void);
+GwyModuleInfo* _gwy_module_query__facet_analysis(void);
+GwyModuleInfo* _gwy_module_query__fbm_synth(void);
+GwyModuleInfo* _gwy_module_query__fft(void);
+GwyModuleInfo* _gwy_module_query__fft_filter_1d(void);
+GwyModuleInfo* _gwy_module_query__fft_filter_2d(void);
+GwyModuleInfo* _gwy_module_query__fft_profile(void);
+GwyModuleInfo* _gwy_module_query__fft_synth(void);
+GwyModuleInfo* _gwy_module_query__fibre_synth(void);
+GwyModuleInfo* _gwy_module_query__fit_shape(void);
+GwyModuleInfo* _gwy_module_query__flatten_base(void);
+GwyModuleInfo* _gwy_module_query__fraccor(void);
+GwyModuleInfo* _gwy_module_query__fractal(void);
+GwyModuleInfo* _gwy_module_query__gradient(void);
+GwyModuleInfo* _gwy_module_query__grain_cross(void);
+GwyModuleInfo* _gwy_module_query__grain_dist(void);
+GwyModuleInfo* _gwy_module_query__grain_edge(void);
+GwyModuleInfo* _gwy_module_query__grain_filter(void);
+GwyModuleInfo* _gwy_module_query__grain_mark(void);
+GwyModuleInfo* _gwy_module_query__grain_stat(void);
+GwyModuleInfo* _gwy_module_query__grain_wshed(void);
+GwyModuleInfo* _gwy_module_query__hough(void);
+GwyModuleInfo* _gwy_module_query__immerse(void);
+GwyModuleInfo* _gwy_module_query__indent_analyze(void);
+GwyModuleInfo* _gwy_module_query__laplace(void);
+GwyModuleInfo* _gwy_module_query__latsim(void);
+GwyModuleInfo* _gwy_module_query__lat_synth(void);
+GwyModuleInfo* _gwy_module_query__level(void);
+GwyModuleInfo* _gwy_module_query__level_grains(void);
+GwyModuleInfo* _gwy_module_query__linecorrect(void);
+GwyModuleInfo* _gwy_module_query__linematch(void);
+GwyModuleInfo* _gwy_module_query__lno_synth(void);
+GwyModuleInfo* _gwy_module_query__local_contrast(void);
+GwyModuleInfo* _gwy_module_query__logistic(void);
+GwyModuleInfo* _gwy_module_query__mark_disconn(void);
+GwyModuleInfo* _gwy_module_query__mark_with(void);
+GwyModuleInfo* _gwy_module_query__maskcor(void);
+GwyModuleInfo* _gwy_module_query__mask_distribute(void);
+GwyModuleInfo* _gwy_module_query__mask_edt(void);
+GwyModuleInfo* _gwy_module_query__mask_morph(void);
+GwyModuleInfo* _gwy_module_query__mask_noisify(void);
+GwyModuleInfo* _gwy_module_query__maskops(void);
+GwyModuleInfo* _gwy_module_query__mcrop(void);
+GwyModuleInfo* _gwy_module_query__measure_lattice(void);
+GwyModuleInfo* _gwy_module_query__median_bg(void);
+GwyModuleInfo* _gwy_module_query__merge(void);
+GwyModuleInfo* _gwy_module_query__mfm_current(void);
+GwyModuleInfo* _gwy_module_query__mfm_field(void);
+GwyModuleInfo* _gwy_module_query__mfm_findshift(void);
+GwyModuleInfo* _gwy_module_query__mfm_parallel(void);
+GwyModuleInfo* _gwy_module_query__mfm_shift(void);
+GwyModuleInfo* _gwy_module_query__neural(void);
+GwyModuleInfo* _gwy_module_query__noise_synth(void);
+GwyModuleInfo* _gwy_module_query__obj_synth(void);
+GwyModuleInfo* _gwy_module_query__otsu_threshold(void);
+GwyModuleInfo* _gwy_module_query__outliers(void);
+GwyModuleInfo* _gwy_module_query__pat_synth(void);
+GwyModuleInfo* _gwy_module_query__phase_synth(void);
+GwyModuleInfo* _gwy_module_query__pid(void);
+GwyModuleInfo* _gwy_module_query__polylevel(void);
+GwyModuleInfo* _gwy_module_query__polydistort(void);
+GwyModuleInfo* _gwy_module_query__presentationops(void);
+GwyModuleInfo* _gwy_module_query__psdf_logphi(void);
+GwyModuleInfo* _gwy_module_query__psf(void);
+GwyModuleInfo* _gwy_module_query__psf_fit(void);
+GwyModuleInfo* _gwy_module_query__rank(void);
+GwyModuleInfo* _gwy_module_query__rotate(void);
+GwyModuleInfo* _gwy_module_query__semsim(void);
+GwyModuleInfo* _gwy_module_query__scale(void);
+GwyModuleInfo* _gwy_module_query__scars(void);
+GwyModuleInfo* _gwy_module_query__shade(void);
+GwyModuleInfo* _gwy_module_query__slope_dist(void);
+GwyModuleInfo* _gwy_module_query__sphere_revolve(void);
+GwyModuleInfo* _gwy_module_query__stitch(void);
+GwyModuleInfo* _gwy_module_query__straighten_path(void);
+GwyModuleInfo* _gwy_module_query__threshold(void);
+GwyModuleInfo* _gwy_module_query__tilt(void);
+GwyModuleInfo* _gwy_module_query__tip_blind(void);
+GwyModuleInfo* _gwy_module_query__tip_model(void);
+GwyModuleInfo* _gwy_module_query__tipops(void);
+GwyModuleInfo* _gwy_module_query__unrotate(void);
+GwyModuleInfo* _gwy_module_query__volumize(void);
+GwyModuleInfo* _gwy_module_query__volumize_layers(void);
+GwyModuleInfo* _gwy_module_query__wave_synth(void);
+GwyModuleInfo* _gwy_module_query__wpour_mark(void);
+GwyModuleInfo* _gwy_module_query__xydenoise(void);
+GwyModuleInfo* _gwy_module_query__xyzize(void);
+
+static const GwyModuleRecord modules[] = {
+  { _gwy_module_query__acf2d, "acf2d", },
+  { _gwy_module_query__angle_dist, "angle_dist", },
+  { _gwy_module_query__arithmetic, "arithmetic", },
+  { _gwy_module_query__averaging, "averaging", },
+  { _gwy_module_query__basicops, "basicops", },
+  { _gwy_module_query__bdep_synth, "bdep_synth", },
+  { _gwy_module_query__calcoefs_load, "calcoefs_load", },
+  { _gwy_module_query__calcoefs_new, "calcoefs_new", },
+  { _gwy_module_query__calcoefs_simple, "calcoefs_simple", },
+  { _gwy_module_query__calcoefs_view, "calcoefs_view", },
+  { _gwy_module_query__calibrate, "calibrate", },
+  { _gwy_module_query__coerce, "coerce", },
+  { _gwy_module_query__col_synth, "col_synth", },
+  { _gwy_module_query__convolution_filter, "convolution_filter", },
+  { _gwy_module_query__correct_affine, "correct_affine", },
+  { _gwy_module_query__crosscor, "crosscor", },
+  { _gwy_module_query__curvature, "curvature", },
+  { _gwy_module_query__cwt, "cwt", },
+  { _gwy_module_query__deposit_synth, "deposit_synth", },
+  { _gwy_module_query__diff_synth, "diff_synth", },
+  { _gwy_module_query__domain_synth, "domain_synth", },
+  { _gwy_module_query__drift, "drift", },
+  { _gwy_module_query__dwt, "dwt", },
+  { _gwy_module_query__dwtanisotropy, "dwtanisotropy", },
+  { _gwy_module_query__edge, "edge", },
+  { _gwy_module_query__entropy, "entropy", },
+  { _gwy_module_query__extend, "extend", },
+  { _gwy_module_query__extract_path, "extract_path", },
+  { _gwy_module_query__facet_level, "facet-level", },
+  { _gwy_module_query__facet_analysis, "facet_analysis", },
+  { _gwy_module_query__fbm_synth, "fbm_synth", },
+  { _gwy_module_query__fft, "fft", },
+  { _gwy_module_query__fft_filter_1d, "fft_filter_1d", },
+  { _gwy_module_query__fft_filter_2d, "fft_filter_2d", },
+  { _gwy_module_query__fft_profile, "fft_profile", },
+  { _gwy_module_query__fft_synth, "fft_synth", },
+  { _gwy_module_query__fibre_synth, "fibre_synth", },
+  { _gwy_module_query__fit_shape, "fit-shape", },
+  { _gwy_module_query__flatten_base, "flatten_base", },
+  { _gwy_module_query__fraccor, "fraccor", },
+  { _gwy_module_query__fractal, "fractal", },
+  { _gwy_module_query__gradient, "gradient", },
+  { _gwy_module_query__grain_cross, "grain_cross", },
+  { _gwy_module_query__grain_dist, "grain_dist", },
+  { _gwy_module_query__grain_edge, "grain_edge", },
+  { _gwy_module_query__grain_filter, "grain_filter", },
+  { _gwy_module_query__grain_mark, "grain_mark", },
+  { _gwy_module_query__grain_stat, "grain_stat", },
+  { _gwy_module_query__grain_wshed, "grain_wshed", },
+  { _gwy_module_query__hough, "hough", },
+  { _gwy_module_query__immerse, "immerse", },
+  { _gwy_module_query__indent_analyze, "indent_analyze", },
+  { _gwy_module_query__laplace, "laplace", },
+  { _gwy_module_query__latsim, "latsim", },
+  { _gwy_module_query__lat_synth, "lat_synth", },
+  { _gwy_module_query__level, "level", },
+  { _gwy_module_query__level_grains, "level_grains", },
+  { _gwy_module_query__linecorrect, "linecorrect", },
+  { _gwy_module_query__linematch, "linematch", },
+  { _gwy_module_query__lno_synth, "lno_synth", },
+  { _gwy_module_query__local_contrast, "local_contrast", },
+  { _gwy_module_query__logistic, "logistic", },
+  { _gwy_module_query__mark_disconn, "mark_disconn", },
+  { _gwy_module_query__mark_with, "mark_with", },
+  { _gwy_module_query__maskcor, "maskcor", },
+  { _gwy_module_query__mask_distribute, "mask_distribute", },
+  { _gwy_module_query__mask_edt, "mask_edt", },
+  { _gwy_module_query__mask_morph, "mask_morph", },
+  { _gwy_module_query__mask_noisify, "mask_noisify", },
+  { _gwy_module_query__maskops, "maskops", },
+  { _gwy_module_query__mcrop, "mcrop", },
+  { _gwy_module_query__measure_lattice, "measure_lattice", },
+  { _gwy_module_query__median_bg, "median-bg", },
+  { _gwy_module_query__merge, "merge", },
+  { _gwy_module_query__mfm_current, "mfm_current", },
+  { _gwy_module_query__mfm_field, "mfm_field", },
+  { _gwy_module_query__mfm_findshift, "mfm_findshift", },
+  { _gwy_module_query__mfm_parallel, "mfm_parallel", },
+  { _gwy_module_query__mfm_shift, "mfm_shift", },
+  { _gwy_module_query__neural, "neural", },
+  { _gwy_module_query__noise_synth, "noise_synth", },
+  { _gwy_module_query__obj_synth, "obj_synth", },
+  { _gwy_module_query__otsu_threshold, "otsu_threshold", },
+  { _gwy_module_query__outliers, "outliers", },
+  { _gwy_module_query__pat_synth, "pat_synth", },
+  { _gwy_module_query__phase_synth, "phase_synth", },
+  { _gwy_module_query__pid, "pid", },
+  { _gwy_module_query__polylevel, "polylevel", },
+  { _gwy_module_query__polydistort, "polydistort", },
+  { _gwy_module_query__presentationops, "presentationops", },
+  { _gwy_module_query__psdf_logphi, "psdf_logphi", },
+  { _gwy_module_query__psf, "psf", },
+  { _gwy_module_query__psf_fit, "psf-fit", },
+  { _gwy_module_query__rank, "rank", },
+  { _gwy_module_query__rotate, "rotate", },
+  { _gwy_module_query__semsim, "semsim", },
+  { _gwy_module_query__scale, "scale", },
+  { _gwy_module_query__scars, "scars", },
+  { _gwy_module_query__shade, "shade", },
+  { _gwy_module_query__slope_dist, "slope_dist", },
+  { _gwy_module_query__sphere_revolve, "sphere-revolve", },
+  { _gwy_module_query__stitch, "stitch", },
+  { _gwy_module_query__straighten_path, "straighten_path", },
+  { _gwy_module_query__threshold, "threshold", },
+  { _gwy_module_query__tilt, "tilt", },
+  { _gwy_module_query__tip_blind, "tip_blind", },
+  { _gwy_module_query__tip_model, "tip_model", },
+  { _gwy_module_query__tipops, "tipops", },
+  { _gwy_module_query__unrotate, "unrotate", },
+  { _gwy_module_query__volumize, "volumize", },
+  { _gwy_module_query__volumize_layers, "volumize_layers", },
+  { _gwy_module_query__wave_synth, "wave_synth", },
+  { _gwy_module_query__wpour_mark, "wpour_mark", },
+  { _gwy_module_query__xydenoise, "xydenoise", },
+  { _gwy_module_query__xyzize, "xyzize", },
+  { NULL, NULL, },
+};
+
+static const GwyModuleRecord*
+register_bundle(void)
+{
+    return modules;
+}
diff --git a/modules/process/psdf_logphi.c b/modules/process/psdf_logphi.c
index 297ac57..f5d5366 100644
--- a/modules/process/psdf_logphi.c
+++ b/modules/process/psdf_logphi.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: psdf_logphi.c 18626 2016-04-22 10:15:13Z yeti-dn $
+ *  @(#) $Id: psdf_logphi.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2015 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -76,12 +76,12 @@ static GwyModuleInfo module_info = {
     N_("Two-dimensional FFT (Fast Fourier Transform) transformed to "
        "coordinates (log-frequency, angle)."),
     "Yeti <yeti at gwyddion.net>",
-    "1.0",
+    "1.1",
     "David Nečas (Yeti)",
     "2015",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, psdf_logphi)
 
 static gboolean
 module_register(void)
@@ -253,7 +253,7 @@ psdflp_dialog(PSDFLPArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(2, 4, FALSE);
+    table = gtk_table_new(2, 2, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -265,14 +265,15 @@ psdflp_dialog(PSDFLPArgs *args)
         = gwy_enum_combo_box_new(gwy_windowing_type_get_enum(), -1,
                                  G_CALLBACK(gwy_enum_combo_box_update_int),
                                  &args->window, args->window, TRUE);
-    gwy_table_attach_row(table, row, _("_Windowing type:"), NULL,
-                         controls.window);
+    gwy_table_attach_adjbar(table, row, _("_Windowing type:"), NULL,
+                            GTK_OBJECT(controls.window),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     g_signal_connect_swapped(controls.window, "changed",
                              G_CALLBACK(windowing_changed), &controls);
     row++;
 
     controls.sigma = gtk_adjustment_new(args->sigma, 0.0, 40.0, 0.01, 1.0, 0);
-    gwy_table_attach_hscale(table, row, _("Gaussian _smoothing:"), "px",
+    gwy_table_attach_adjbar(table, row, _("Gaussian _smoothing:"), _("px"),
                             controls.sigma, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.sigma, "value-changed",
                              G_CALLBACK(sigma_changed), &controls);
diff --git a/modules/process/psf-fit.c b/modules/process/psf-fit.c
new file mode 100644
index 0000000..44f1cc0
--- /dev/null
+++ b/modules/process/psf-fit.c
@@ -0,0 +1,841 @@
+/*
+ *  @(#) $Id: psf-fit.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2017 David Necas (Yeti), Petr Klapetek.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <gtk/gtk.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libgwyddion/gwynlfit.h>
+#include <libprocess/gwyprocesstypes.h>
+#include <libprocess/arithmetic.h>
+#include <libprocess/inttrans.h>
+#include <libgwydgets/gwycombobox.h>
+#include <libgwydgets/gwystock.h>
+#include <libgwymodule/gwymodule-process.h>
+#include <app/gwymoduleutils.h>
+#include <app/gwyapp.h>
+#include "mfmops.h"
+
+#define PSF_RUN_MODES (GWY_RUN_IMMEDIATE | GWY_RUN_INTERACTIVE)
+
+#define DECLARE_PSF(name) \
+    static gdouble  psf_##name##_fit_func   (guint i, \
+                                             const gdouble *param, \
+                                             gpointer user_data, \
+                                             gboolean *success); \
+    static void     psf_##name##_fit_diff   (guint i, \
+                                             const gdouble *param, \
+                                             const gboolean *fixed_param, \
+                                             GwyNLFitIdxFunc func, \
+                                             gpointer user_data, \
+                                             gdouble *der, \
+                                             gboolean *success); \
+    static gboolean psf_##name##_init_params(GwyDataField *model_re, \
+                                             GwyDataField *model_im, \
+                                             GwyDataField *data_re, \
+                                             GwyDataField *data_im, \
+                                             GwyDataField *freq_x, \
+                                             GwyDataField *freq_y, \
+                                             gdouble *params); \
+    static void     psf_##name##_fill_psf   (GwyDataField *freq_x, \
+                                             GwyDataField *freq_y, \
+                                             GwyDataField *buf_re, \
+                                             GwyDataField *buf_im, \
+                                             GwyDataField *psf, \
+                                             GwyDataField *psf_fft, \
+                                             const gdouble *param);
+
+typedef enum {
+    PSF_FUNC_GAUSSIAN = 0,
+    PSF_FUNC_AGAUSSIAN = 1,
+    PSF_FUNC_NFUNCTIONS,
+} PSFFunctionType;
+
+typedef struct {
+    PSFFunctionType function;
+    GwyAppDataId op1;
+    GwyAppDataId op2;
+} PSFArgs;
+
+typedef gboolean (*PSFParamInitFunc)(GwyDataField *model_re,
+                                     GwyDataField *model_im,
+                                     GwyDataField *data_re,
+                                     GwyDataField *data_im,
+                                     GwyDataField *freq_x,
+                                     GwyDataField *freq_y,
+                                     gdouble *params);
+typedef void (*PSFFillFunc)(GwyDataField *freq_x,
+                            GwyDataField *freq_y,
+                            GwyDataField *buf_re,
+                            GwyDataField *buf_im,
+                            GwyDataField *psf,
+                            GwyDataField *psf_fft,
+                            const gdouble *params);
+
+typedef struct {
+    const gchar *name;
+    GwyNLFitIdxFunc func;
+    GwyNLFitIdxDiffFunc diff;
+    PSFParamInitFunc initpar;
+    PSFFillFunc fill;
+    guint nparams;
+} PSFFunction;
+
+typedef struct {
+    guint xres;
+    guint yres;
+    gdouble *xfreq;
+    gdouble *yfreq;
+    gdouble *model_re;
+    gdouble *model_im;
+    gdouble *data_re;
+    gdouble *data_im;
+} PSFEstimateData;
+
+typedef struct {
+    PSFArgs *args;
+    GtkWidget *chooser_op2;
+    GtkWidget *function;
+    GtkWidget *dialogue;
+} PSFControls;
+
+static gboolean   module_register     (void);
+static void       psf                 (GwyContainer *data,
+                                       GwyRunType run);
+static gboolean   psf_dialogue        (PSFArgs *args);
+static GtkWidget* create_function_menu(GCallback callback,
+                                       gpointer cbdata,
+                                       gint current);
+static void       psf_data_changed    (GwyDataChooser *chooser,
+                                       GwyAppDataId *object);
+static gboolean   psf_data_filter     (GwyContainer *data,
+                                       gint id,
+                                       gpointer user_data);
+static void       function_changed    (GtkComboBox *combo,
+                                       PSFControls *controls);
+static void       fit_psf             (GwyDataField *model,
+                                       GwyDataField *data,
+                                       GwyDataField *psf,
+                                       GwyDataField *convolved,
+                                       const PSFFunction *func);
+static void       psf_load_args       (GwyContainer *container,
+                                       PSFArgs *args);
+static void       psf_save_args       (GwyContainer *container,
+                                       PSFArgs *args);
+static void       psf_sanitize_args   (PSFArgs *args);
+
+DECLARE_PSF(gaussian);
+DECLARE_PSF(agaussian);
+
+static GwyAppDataId op2_id = GWY_APP_DATA_ID_NONE;
+
+static const PSFArgs psf_defaults = {
+    PSF_FUNC_GAUSSIAN,
+    GWY_APP_DATA_ID_NONE, GWY_APP_DATA_ID_NONE
+};
+
+static const PSFFunction functions[] = {
+    {
+        N_("Gaussian"),
+        psf_gaussian_fit_func,
+        psf_gaussian_fit_diff,
+        psf_gaussian_init_params,
+        psf_gaussian_fill_psf,
+        2,
+    },
+    {
+        N_("Gaussian (asymmetric)"),
+        psf_agaussian_fit_func,
+        psf_agaussian_fit_diff,
+        psf_agaussian_init_params,
+        psf_agaussian_fill_psf,
+        3,
+    },
+};
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION,
+    &module_register,
+    N_("Point spread function estimation by fitting explicit function form."),
+    "Yeti <yeti at gwyddion.net>",
+    "1.1",
+    "David Nečas (Yeti) & Petr Klapetek",
+    "2017",
+};
+
+GWY_MODULE_QUERY2(module_info, psf_fit)
+
+static gboolean
+module_register(void)
+{
+    gwy_process_func_register("psf-fit",
+                              (GwyProcessFunc)&psf,
+                              N_("/_Statistics/_PSF Fit..."),
+                              NULL,
+                              PSF_RUN_MODES,
+                              GWY_MENU_FLAG_DATA,
+                              N_("Fit PSF from known data and image"));
+
+    return TRUE;
+}
+
+static void
+psf(GwyContainer *data, GwyRunType run)
+{
+    GwyDataField *model, *dfield, *psf, *convolved;
+    PSFArgs args;
+    gboolean ok;
+    GQuark quark;
+    GwyContainer *mydata;
+    gint newid;
+    gdouble q;
+
+    g_return_if_fail(run & PSF_RUN_MODES);
+
+    psf_load_args(gwy_app_settings_get(), &args);
+
+    gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD_ID, &args.op1.id,
+                                     GWY_APP_CONTAINER_ID, &args.op1.datano,
+                                     0);
+
+    ok = psf_dialogue(&args);
+    psf_save_args(gwy_app_settings_get(), &args);
+    if (!ok)
+        return;
+
+    mydata = gwy_app_data_browser_get(args.op1.datano);
+    quark = gwy_app_get_data_key_for_id(args.op1.id);
+    dfield = GWY_DATA_FIELD(gwy_container_get_object(mydata, quark));
+
+    mydata = gwy_app_data_browser_get(args.op2.datano);
+    quark = gwy_app_get_data_key_for_id(args.op2.id);
+    model = GWY_DATA_FIELD(gwy_container_get_object(mydata, quark));
+
+    psf = gwy_data_field_new_alike(dfield, FALSE);
+    convolved = gwy_data_field_new_alike(dfield, FALSE);
+    fit_psf(model, dfield, psf, convolved, functions + args.function);
+
+    /* See psf.c for normalisation convention. */
+    q = sqrt(gwy_data_field_get_xres(dfield)*gwy_data_field_get_yres(dfield))
+        /(gwy_data_field_get_xreal(dfield)*gwy_data_field_get_yreal(dfield));
+
+    gwy_data_field_multiply(psf, q);
+    newid = gwy_app_data_browser_add_data_field(psf, data, TRUE);
+    gwy_app_sync_data_items(data, data, args.op1.id, newid, FALSE,
+                            GWY_DATA_ITEM_GRADIENT,
+                            GWY_DATA_ITEM_MASK_COLOR,
+                            0);
+    gwy_app_set_data_field_title(data, newid, _("PSF"));
+    gwy_app_channel_log_add_proc(data, args.op1.id, newid);
+
+    newid = gwy_app_data_browser_add_data_field(convolved, data, TRUE);
+    gwy_app_sync_data_items(data, data, args.op1.id, newid, FALSE,
+                            GWY_DATA_ITEM_GRADIENT,
+                            GWY_DATA_ITEM_MASK_COLOR,
+                            0);
+    gwy_app_set_data_field_title(data, newid, _("PSF*P"));
+    gwy_app_channel_log_add_proc(data, args.op1.id, newid);
+
+    g_object_unref(psf);
+    g_object_unref(convolved);
+}
+
+static gboolean
+psf_dialogue(PSFArgs *args)
+{
+    PSFControls controls;
+    GtkWidget *dialogue, *table, *label;
+    GwyDataChooser *chooser;
+    gint response, row;
+
+    controls.args = args;
+
+    dialogue = gtk_dialog_new_with_buttons(_("Fit PSF"), NULL, 0,
+                                           GTK_STOCK_CANCEL,
+                                           GTK_RESPONSE_CANCEL,
+                                           GTK_STOCK_OK,
+                                           GTK_RESPONSE_OK,
+                                           NULL);
+    gtk_dialog_set_default_response(GTK_DIALOG(dialogue), GTK_RESPONSE_OK);
+    gwy_help_add_to_proc_dialog(GTK_DIALOG(dialogue), GWY_HELP_DEFAULT);
+    controls.dialogue = dialogue;
+
+    table = gtk_table_new(2, 2, FALSE);
+    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
+    gtk_table_set_col_spacings(GTK_TABLE(table), 6);
+    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
+    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), table,
+                       TRUE, TRUE, 4);
+    row = 0;
+
+    label = gtk_label_new_with_mnemonic(_("_Ideal response:"));
+    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+    gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1,
+                     GTK_FILL, 0, 0, 0);
+
+    controls.chooser_op2 = gwy_data_chooser_new_channels();
+    chooser = GWY_DATA_CHOOSER(controls.chooser_op2);
+    g_object_set_data(G_OBJECT(chooser), "dialog", dialogue);
+    gwy_data_chooser_set_active_id(chooser, &args->op2);
+    gwy_data_chooser_set_filter(chooser,
+                                psf_data_filter, &args->op1, NULL);
+    gtk_table_attach(GTK_TABLE(table), controls.chooser_op2, 1, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
+    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.chooser_op2);
+    g_signal_connect(chooser, "changed",
+                     G_CALLBACK(psf_data_changed), &args->op2);
+    psf_data_changed(chooser, &args->op2);
+    row++;
+
+    label = gtk_label_new_with_mnemonic(_("_Function type:"));
+    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+    gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1,
+                     GTK_FILL, 0, 0, 0);
+
+    controls.function = create_function_menu(G_CALLBACK(function_changed),
+                                             &controls,
+                                             args->function);
+    gtk_table_attach(GTK_TABLE(table), controls.function, 1, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
+    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.function);
+    row++;
+
+    gtk_widget_show_all(dialogue);
+
+    do {
+        response = gtk_dialog_run(GTK_DIALOG(dialogue));
+        switch (response) {
+            case GTK_RESPONSE_CANCEL:
+            case GTK_RESPONSE_DELETE_EVENT:
+            gtk_widget_destroy(dialogue);
+            case GTK_RESPONSE_NONE:
+            return FALSE;
+            break;
+
+            case GTK_RESPONSE_OK:
+            break;
+
+            default:
+            g_assert_not_reached();
+            break;
+        }
+    } while (response != GTK_RESPONSE_OK);
+
+    gtk_widget_destroy(dialogue);
+
+    return TRUE;
+}
+
+static GtkWidget*
+create_function_menu(GCallback callback, gpointer cbdata, gint current)
+{
+    static GwyEnum *entries = NULL;
+
+    if (!entries) {
+        guint i;
+
+        entries = g_new(GwyEnum, PSF_FUNC_NFUNCTIONS);
+        for (i = 0; i < PSF_FUNC_NFUNCTIONS; i++) {
+            entries[i].value = i;
+            entries[i].name = functions[i].name;
+        }
+    }
+
+    return gwy_enum_combo_box_new(entries, PSF_FUNC_NFUNCTIONS,
+                                  callback, cbdata, current, TRUE);
+}
+
+static void
+psf_data_changed(GwyDataChooser *chooser, GwyAppDataId *object)
+{
+    GtkWidget *dialog;
+
+    gwy_data_chooser_get_active_id(chooser, object);
+    gwy_debug("data: %d %d", object->datano, object->id);
+
+    dialog = g_object_get_data(G_OBJECT(chooser), "dialog");
+    g_assert(GTK_IS_DIALOG(dialog));
+    gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK,
+                                      object->datano);
+}
+
+static gboolean
+psf_data_filter(GwyContainer *data, gint id, gpointer user_data)
+{
+
+    GwyAppDataId *object = (GwyAppDataId*)user_data;
+    GwyDataField *op1, *op2;
+    GQuark quark;
+
+    quark = gwy_app_get_data_key_for_id(id);
+    op1 = GWY_DATA_FIELD(gwy_container_get_object(data, quark));
+
+    data = gwy_app_data_browser_get(object->datano);
+    quark = gwy_app_get_data_key_for_id(object->id);
+    op2 = GWY_DATA_FIELD(gwy_container_get_object(data, quark));
+
+    if (op1 == op2)
+        return FALSE;
+
+    return !gwy_data_field_check_compatibility(op1, op2,
+                                               GWY_DATA_COMPATIBILITY_RES
+                                               | GWY_DATA_COMPATIBILITY_REAL
+                                               | GWY_DATA_COMPATIBILITY_LATERAL);
+}
+
+static void
+function_changed(GtkComboBox *combo, PSFControls *controls)
+{
+    controls->args->function = gwy_enum_combo_box_get_active(combo);
+}
+
+static gdouble
+calculate_root_mean_square_complex(const gdouble *pre, const gdouble *pim,
+                                   guint xres, guint yres)
+{
+    guint k;
+    gdouble sum = 0.0;
+
+    for (k = 0; k < xres*yres; k++)
+        sum += pre[k]*pre[k] + pim[k]*pim[k];
+
+    return sqrt(sum);
+}
+
+static void
+precaulcate_frequencies(GwyDataField *model,
+                        GwyDataField *freq_x, GwyDataField *freq_y)
+{
+    guint xres = gwy_data_field_get_xres(model),
+          yres = gwy_data_field_get_yres(model);
+    gdouble sx = 2.0*G_PI/gwy_data_field_get_xreal(model),
+            sy = 2.0*G_PI/gwy_data_field_get_yreal(model);
+    gdouble *fx = gwy_data_field_get_data(freq_x);
+    gdouble *fy = gwy_data_field_get_data(freq_y);
+    gdouble vx, vy;
+    guint i, j;
+
+    fx[0] = fy[0] = 0.0;
+
+    for (j = 1; j <= xres/2; j++) {
+        vx = j*sx;
+        fx[xres-j] = -vx;
+        fx[j] = vx;
+        fy[j] = fy[xres-1] = 0.0;
+    }
+
+    for (i = 1; i <= yres/2; i++) {
+        vy = i*sy;
+        fx[i*xres] = fx[(yres-i)*xres] = 0.0;
+        fy[(yres-i)*xres] = -vy;
+        fy[i*xres] = vy;
+    }
+
+    for (i = 1; i <= yres/2; i++) {
+        vy = i*sy;
+        for (j = 1; j <= xres/2; j++) {
+            vx = j*sx;
+            fx[(yres-i)*xres + xres-j] = -vx;
+            fx[i*xres + xres-j] = -vx;
+            fx[(yres-i)*xres + j] = vx;
+            fx[i*xres + j] = vx;
+            fy[(yres-i)*xres + xres-j] = -vy;
+            fy[(yres-i)*xres + j] = -vy;
+            fy[i*xres + xres-j] = vy;
+            fy[i*xres + j] = vy;
+        }
+    }
+}
+
+/* Suppress higher frequencies somewhat; they are lots of them and contain
+ * noise.
+ * Do not bother with weighting inside the fitting when we can just
+ * premultiply model and data to achieve the same effect on cheap. */
+static void
+weight_fourier_components(GwyDataField *fftfield,
+                          GwyDataField *freq_x, GwyDataField *freq_y)
+{
+    guint xres = gwy_data_field_get_xres(fftfield),
+          yres = gwy_data_field_get_yres(fftfield);
+    const gdouble *fx = gwy_data_field_get_data(freq_x);
+    const gdouble *fy = gwy_data_field_get_data(freq_y);
+    gdouble *d = gwy_data_field_get_data(fftfield);
+    guint k = (yres/2)*xres + xres/2;
+    gdouble fmax2 = fx[k]*fx[k] + fy[k]*fy[k];
+    gdouble factor = 3.0/fmax2;
+
+    for (k = 0; k < xres*yres; k++)
+        d[k] /= 1.0 + factor*(fx[k]*fx[k] + fy[k]*fy[k]);
+}
+
+#ifdef DEBUG
+static void
+debug_print_params(const PSFFunction *func, const gdouble *params)
+{
+    GString *str = g_string_new(NULL);
+    guint i;
+
+    for (i = 0; i < func->nparams; i++)
+        g_string_append_printf(str, " %g", params[i]);
+    gwy_debug("params %s", str->str);
+    g_string_free(str, TRUE);
+}
+#else
+#define debug_print_params(func,params) /* */
+#endif
+
+static void
+fit_psf(GwyDataField *model, GwyDataField *data,
+        GwyDataField *psf, GwyDataField *convolved,
+        const PSFFunction *func)
+{
+    PSFEstimateData psfedata;
+    guint xres = gwy_data_field_get_xres(model),
+          yres = gwy_data_field_get_yres(model);
+    GwyDataField *model_re, *model_im, *data_re, *data_im, *freq_x, *freq_y;
+    GwyNLFitter *fitter = NULL;
+    gdouble rss;
+    gdouble *params = g_new(gdouble, func->nparams);
+
+    freq_x = gwy_data_field_new_alike(model, FALSE);
+    freq_y = gwy_data_field_new_alike(model, FALSE);
+    precaulcate_frequencies(model, freq_x, freq_y);
+
+    model_re = gwy_data_field_new_alike(model, FALSE);
+    model_im = gwy_data_field_new_alike(model, FALSE);
+    gwy_data_field_2dfft_raw(model, NULL, model_re, model_im,
+                             GWY_TRANSFORM_DIRECTION_FORWARD);
+
+    data_re = gwy_data_field_new_alike(data, FALSE);
+    data_im = gwy_data_field_new_alike(data, FALSE);
+    gwy_data_field_2dfft_raw(data, NULL, data_re, data_im,
+                             GWY_TRANSFORM_DIRECTION_FORWARD);
+
+    /* There can be a constant offset between the two fields.  Ignore it. */
+    gwy_data_field_set_val(model_re, 0, 0, 0.0);
+    gwy_data_field_set_val(data_re, 0, 0, 0.0);
+
+    if (!func->initpar(model_re, model_im, data_re, data_im,
+                       freq_x, freq_y, params)) {
+        g_warning("Initial parameter estimation failed.");
+        gwy_data_field_clear(psf);
+        gwy_data_field_set_val(psf, 0, 0, 1.0);
+        goto fail;
+    }
+
+    weight_fourier_components(model_re, freq_x, freq_y);
+    weight_fourier_components(model_im, freq_x, freq_y);
+    weight_fourier_components(data_re, freq_x, freq_y);
+    weight_fourier_components(data_im, freq_x, freq_y);
+
+    psfedata.xres = xres;
+    psfedata.yres = yres;
+    psfedata.model_re = gwy_data_field_get_data(model_re);
+    psfedata.model_im = gwy_data_field_get_data(model_im);
+    psfedata.data_re = gwy_data_field_get_data(data_re);
+    psfedata.data_im = gwy_data_field_get_data(data_im);
+    psfedata.xfreq = gwy_data_field_get_data(freq_x);
+    psfedata.yfreq = gwy_data_field_get_data(freq_y);
+
+    fitter = gwy_math_nlfit_new_idx(func->func, func->diff);
+    rss = gwy_math_nlfit_fit_idx(fitter, 2*xres*yres,
+                                 func->nparams, params, &psfedata);
+    gwy_debug("Fitted rss %g", rss);
+    if (!(rss >= 0.0)) {
+        g_warning("Initial parameter estimation failed.");
+        gwy_data_field_clear(psf);
+        gwy_data_field_set_val(psf, 0, 0, 1.0);
+        goto fail;
+    }
+    debug_print_params(func, params);
+
+    /* Use freq_x as a buffer for FFT(psf) */
+    func->fill(freq_x, freq_y, data_re, data_im, psf, freq_x, params);
+    /* Must do FFT again because we weighted the fields. */
+    gwy_data_field_2dfft_raw(model, NULL, model_re, model_im,
+                             GWY_TRANSFORM_DIRECTION_FORWARD);
+
+    gwy_data_field_multiply_fields(data_re, model_re, freq_x);
+    gwy_data_field_multiply_fields(data_im, model_im, freq_x);
+    gwy_data_field_2dfft_raw(data_re, data_im, convolved, model_im,
+                             GWY_TRANSFORM_DIRECTION_BACKWARD);
+
+    set_transfer_function_units(model, data, psf);
+
+fail:
+    if (fitter)
+        gwy_math_nlfit_free(fitter);
+    g_free(params);
+    g_object_unref(freq_x);
+    g_object_unref(freq_y);
+    g_object_unref(data_im);
+    g_object_unref(data_re);
+    g_object_unref(model_re);
+    g_object_unref(model_im);
+}
+
+static gdouble
+estimate_width(const gdouble *pre, const gdouble *pim,
+               const gdouble *fx, const gdouble *fy,
+               guint xres, guint yres)
+{
+    guint k;
+    gdouble sum = 0.0;
+
+    for (k = 0; k < xres*yres; k++)
+        sum += (fx[k]*fx[k] + fy[k]*fy[k])*(pre[k]*pre[k] + pim[k]*pim[k]);
+
+    return sqrt(sum);
+}
+
+/* We fit G*model on data, so our residuum function is G*model-data. */
+static gdouble
+psf_gaussian_fit_func(guint i, const gdouble *param, gpointer user_data,
+                      gboolean *success)
+{
+    PSFEstimateData *psfedata = (PSFEstimateData*)user_data;
+    guint k = i/2;
+    gdouble A = param[0], width = param[1];
+    gdouble fx = psfedata->xfreq[k], fy = psfedata->yfreq[k];
+    gdouble r2 = (fx*fx + fy*fy)/(width*width);
+    gdouble g, m, d;
+
+    if (G_UNLIKELY(width == 0.0)) {
+        *success = FALSE;
+        return 0.0;
+    }
+
+    *success = TRUE;
+    g = exp(-r2);
+    m = (i % 2) ? psfedata->model_im[k] : psfedata->model_re[k];
+    d = (i % 2) ? psfedata->data_im[k] : psfedata->data_re[k];
+    return A*g*m - d;
+}
+
+static void
+psf_gaussian_fit_diff(guint i,
+                      const gdouble *param, const gboolean *fixed_param,
+                      G_GNUC_UNUSED GwyNLFitIdxFunc func, gpointer user_data,
+                      gdouble *der,
+                      gboolean *success)
+{
+    PSFEstimateData *psfedata = (PSFEstimateData*)user_data;
+    guint k = i/2;
+    gdouble A = param[0], width = param[1];
+    gdouble fx = psfedata->xfreq[k], fy = psfedata->yfreq[k];
+    gdouble r2 = (fx*fx + fy*fy)/(width*width);
+    gdouble g, m;
+
+    if (G_UNLIKELY(width == 0.0)) {
+        *success = FALSE;
+        return;
+    }
+
+    *success = TRUE;
+    g = exp(-r2);
+    m = (i % 2) ? psfedata->model_im[k] : psfedata->model_re[k];
+    der[0] = (fixed_param && fixed_param[0]) ? 0.0 : g*m;
+    der[1] = (fixed_param && fixed_param[1]) ? 0.0 : 2.0*A/width*r2*g*m;
+}
+
+static gboolean
+psf_gaussian_init_params(GwyDataField *model_re, GwyDataField *model_im,
+                         GwyDataField *data_re, GwyDataField *data_im,
+                         GwyDataField *freq_x, GwyDataField *freq_y,
+                         gdouble *params)
+{
+    guint xres = gwy_data_field_get_xres(model_re),
+          yres = gwy_data_field_get_yres(model_re);
+    const gdouble *mre = gwy_data_field_get_data_const(model_re);
+    const gdouble *mim = gwy_data_field_get_data_const(model_im);
+    const gdouble *dre = gwy_data_field_get_data_const(data_re);
+    const gdouble *dim = gwy_data_field_get_data_const(data_im);
+    const gdouble *fx = gwy_data_field_get_data_const(freq_x);
+    const gdouble *fy = gwy_data_field_get_data_const(freq_y);
+    gdouble q_model, q_data, w_model, w_data;
+
+    /* Amplitude. */
+    q_model = calculate_root_mean_square_complex(mre, mim, xres, yres);
+    q_data = calculate_root_mean_square_complex(dre, dim, xres, yres);
+    if (!q_model || !q_data)
+        params[0] = 0.0;
+    else
+        params[0] = q_data/q_model;
+    gwy_debug("q_model %g, q_data %g => amplitude %g",
+              q_model, q_data, params[0]);
+
+    /* Width. */
+    w_model = estimate_width(mre, mim, fx, fy, xres, yres)/q_model;
+    w_data = estimate_width(dre, dim, fx, fy, xres, yres)/q_data;
+    params[1] = 0.7*sqrt(fmax(w_model*w_model - w_data*w_data, 0.0))
+                + 0.3*MIN(w_model, w_data);
+    gwy_debug("w_model %g, w_data %g => width %g",
+              w_model, w_data, params[1]);
+
+    return params[0] > 0.0 && params[1] > 0.0;
+}
+
+static void
+psf_gaussian_fill_psf(GwyDataField *freq_x, GwyDataField *freq_y,
+                      G_GNUC_UNUSED GwyDataField *buf_re, GwyDataField *buf_im,
+                      GwyDataField *psf, GwyDataField *psf_fft,
+                      const gdouble *param)
+{
+    gdouble A = param[0], w = param[1];
+    guint xres = gwy_data_field_get_xres(freq_x),
+          yres = gwy_data_field_get_yres(freq_x);
+    const gdouble *fx = gwy_data_field_get_data_const(freq_x);
+    const gdouble *fy = gwy_data_field_get_data_const(freq_y);
+    gdouble *pf = gwy_data_field_get_data(psf_fft);
+    gdouble r2, g;
+    guint k;
+
+    for (k = 0; k < xres*yres; k++) {
+        r2 = (fx[k]*fx[k] + fy[k]*fy[k])/(w*w);
+        g = exp(-r2);
+        pf[k] = A*g;
+    }
+
+    gwy_data_field_2dfft_raw(psf_fft, NULL, psf, buf_im,
+                             GWY_TRANSFORM_DIRECTION_BACKWARD);
+    gwy_data_field_2dfft_humanize(psf);
+}
+
+static gdouble
+psf_agaussian_fit_func(guint i, const gdouble *param, gpointer user_data,
+                       gboolean *success)
+{
+    PSFEstimateData *psfedata = (PSFEstimateData*)user_data;
+    guint k = i/2;
+    gdouble A = param[0], widthx = param[1], widthy = param[2];
+    gdouble fx = psfedata->xfreq[k]/widthx, fy = psfedata->yfreq[k]/widthy;
+    gdouble r2 = fx*fx + fy*fy;
+    gdouble g, m, d;
+
+    if (G_UNLIKELY(widthx == 0.0 || widthy == 0.0)) {
+        *success = FALSE;
+        return 0.0;
+    }
+
+    *success = TRUE;
+    g = exp(-r2);
+    m = (i % 2) ? psfedata->model_im[k] : psfedata->model_re[k];
+    d = (i % 2) ? psfedata->data_im[k] : psfedata->data_re[k];
+    return A*g*m - d;
+}
+
+static void
+psf_agaussian_fit_diff(guint i,
+                       const gdouble *param, const gboolean *fixed_param,
+                       G_GNUC_UNUSED GwyNLFitIdxFunc func, gpointer user_data,
+                       gdouble *der,
+                       gboolean *success)
+{
+    PSFEstimateData *psfedata = (PSFEstimateData*)user_data;
+    guint k = i/2;
+    gdouble A = param[0], widthx = param[1], widthy = param[2];
+    gdouble fx = psfedata->xfreq[k]/widthx, fy = psfedata->yfreq[k]/widthy;
+    gdouble r2 = fx*fx + fy*fy;
+    gdouble g, m;
+
+    if (G_UNLIKELY(widthx == 0.0 || widthy == 0.0)) {
+        *success = FALSE;
+        return;
+    }
+
+    *success = TRUE;
+    g = exp(-r2);
+    m = (i % 2) ? psfedata->model_im[k] : psfedata->model_re[k];
+    der[0] = (fixed_param && fixed_param[0]) ? 0.0 : g*m;
+    der[1] = (fixed_param && fixed_param[1]) ? 0.0 : 2.0*A/widthx*fx*fx*g*m;
+    der[2] = (fixed_param && fixed_param[2]) ? 0.0 : 2.0*A/widthy*fy*fy*g*m;
+}
+
+static gboolean
+psf_agaussian_init_params(GwyDataField *model_re, GwyDataField *model_im,
+                          GwyDataField *data_re, GwyDataField *data_im,
+                          GwyDataField *freq_x, GwyDataField *freq_y,
+                          gdouble *params)
+{
+    if (!psf_gaussian_init_params(model_re, model_im, data_re, data_im,
+                                  freq_x, freq_y, params))
+        return FALSE;
+
+    params[2] = params[1];
+    return TRUE;
+}
+
+static void
+psf_agaussian_fill_psf(GwyDataField *freq_x, GwyDataField *freq_y,
+                       G_GNUC_UNUSED GwyDataField *buf_re, GwyDataField *buf_im,
+                       GwyDataField *psf, GwyDataField *psf_fft,
+                       const gdouble *param)
+{
+    gdouble A = param[0], wx = param[1], wy = param[2];
+    guint xres = gwy_data_field_get_xres(freq_x),
+          yres = gwy_data_field_get_yres(freq_x);
+    const gdouble *fx = gwy_data_field_get_data_const(freq_x);
+    const gdouble *fy = gwy_data_field_get_data_const(freq_y);
+    gdouble *pf = gwy_data_field_get_data(psf_fft);
+    gdouble r2, g;
+    guint k;
+
+    for (k = 0; k < xres*yres; k++) {
+        r2 = fx[k]*fx[k]/(wx*wx) + fy[k]*fy[k]/(wy*wy);
+        g = exp(-r2);
+        pf[k] = A*g;
+    }
+
+    gwy_data_field_2dfft_raw(psf_fft, NULL, psf, buf_im,
+                             GWY_TRANSFORM_DIRECTION_BACKWARD);
+    gwy_data_field_2dfft_humanize(psf);
+}
+
+static const gchar function_key[] = "/module/psf-fit/function";
+
+static void
+psf_sanitize_args(PSFArgs *args)
+{
+    args->function = CLAMP(args->function, 0, PSF_FUNC_NFUNCTIONS-1);
+    gwy_app_data_id_verify_channel(&args->op2);
+}
+
+static void
+psf_load_args(GwyContainer *container,
+              PSFArgs *args)
+{
+    *args = psf_defaults;
+
+    gwy_container_gis_enum_by_name(container, function_key, &args->function);
+    args->op2 = op2_id;
+    psf_sanitize_args(args);
+}
+
+static void
+psf_save_args(GwyContainer *container,
+              PSFArgs *args)
+{
+    op2_id = args->op2;
+
+    gwy_container_set_enum_by_name(container, function_key, args->function);
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/process/psf.c b/modules/process/psf.c
new file mode 100644
index 0000000..c6805f4
--- /dev/null
+++ b/modules/process/psf.c
@@ -0,0 +1,750 @@
+/*
+ *  @(#) $Id: psf.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2017 David Necas (Yeti), Petr Klapetek.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <gtk/gtk.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libprocess/gwyprocesstypes.h>
+#include <libprocess/arithmetic.h>
+#include <libprocess/inttrans.h>
+#include <libprocess/stats.h>
+#include <libgwydgets/gwydgetutils.h>
+#include <libgwydgets/gwycombobox.h>
+#include <libgwydgets/gwystock.h>
+#include <libgwymodule/gwymodule-process.h>
+#include <app/gwymoduleutils.h>
+#include <app/gwyapp.h>
+#include "mfmops.h"
+#include "preview.h"
+
+#define PSF_RUN_MODES GWY_RUN_INTERACTIVE
+
+#define field_convolve_default(field, kernel) \
+    gwy_data_field_area_ext_convolve((field), \
+                                     0, 0, \
+                                     gwy_data_field_get_xres(field), \
+                                     gwy_data_field_get_yres(field), \
+                                     (field), (kernel), \
+                                     GWY_EXTERIOR_MIRROR_EXTEND, 0.0, TRUE)
+
+typedef enum {
+    GWY_PSF_DISPLAY_DATA   = 0,
+    GWY_PSF_DISPLAY_RESULT = 1,
+    GWY_PSF_DISPLAY_CONVOLVED = 2,
+    GWY_PSF_DISPLAY_DIFF   = 3
+} GwyPsfDisplayType;
+
+typedef struct {
+    gdouble sigma;
+    GwyAppDataId op1;
+    GwyAppDataId op2;
+    gboolean update;
+    GwyPsfDisplayType display;
+} PsfArgs;
+
+typedef struct {
+    PsfArgs *args;
+    GtkObject *sigma;
+    GtkWidget *chooser_op2;
+    GtkWidget *update;
+    GtkWidget *display;
+    GwyDataField *result;
+    GwyDataField *dfield;
+    GtkWidget *view;
+    GwyContainer *mydata;
+    GtkWidget *dialog;
+} PsfControls;
+
+static gboolean module_register      (void);
+static void     psf                  (GwyContainer *data,
+                                      GwyRunType run);
+static gboolean psf_dialog           (PsfArgs *args,
+                                      GwyContainer *data);
+static void     psf_load_args        (GwyContainer *container,
+                                      PsfArgs *args);
+static void     psf_save_args        (GwyContainer *container,
+                                      PsfArgs *args);
+static void     psf_sanitize_args    (PsfArgs *args);
+static void     sigma_changed        (GtkAdjustment *adj,
+                                      PsfControls *controls);
+static void     psf_data_changed     (GwyDataChooser *chooser,
+                                      GwyAppDataId *object);
+static gboolean psf_data_filter      (GwyContainer *data,
+                                      gint id,
+                                      gpointer user_data);
+static void     update_changed       (GtkToggleButton *button,
+                                      PsfControls *controls);
+static void     preview              (PsfControls *controls,
+                                      PsfArgs *args);
+static void     display_changed      (GtkComboBox *combo,
+                                      PsfControls *controls);
+static void     calculate_psf        (GwyDataField *measured,
+                                      GwyDataField *ideal,
+                                      GwyDataField *psf,
+                                      gdouble sigma);
+static gboolean fit                  (PsfArgs *args,
+                                      GwySetFractionFunc set_fraction);
+
+static GwyAppDataId op2_id = GWY_APP_DATA_ID_NONE;
+
+static const PsfArgs psf_defaults = {
+    10, GWY_APP_DATA_ID_NONE, GWY_APP_DATA_ID_NONE, TRUE, GWY_PSF_DISPLAY_RESULT,
+};
+
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION,
+    &module_register,
+    N_("Point spread function estimation"),
+    "Petr Klapetek <klapetek at gwyddion.net>",
+    "1.1",
+    "David Nečas (Yeti) & Petr Klapetek",
+    "2017",
+};
+
+GWY_MODULE_QUERY2(module_info, psf)
+
+static gboolean
+module_register(void)
+{
+    gwy_process_func_register("psf",
+                              (GwyProcessFunc)&psf,
+                              N_("/_Statistics/_PSF Guess..."),
+                              NULL,
+                              PSF_RUN_MODES,
+                              GWY_MENU_FLAG_DATA,
+                              N_("Estimate PSF from known data and image"));
+
+    return TRUE;
+}
+
+static void
+psf(GwyContainer *data, GwyRunType run)
+{
+    GwyDataField *dfield1, *dfield2, *psf, *psfb, *convolved, *subtracted;
+    PsfArgs args;
+    gboolean ok;
+    GQuark quark;
+    GwyContainer *mydata;
+    gint newid;
+
+    g_return_if_fail(run & PSF_RUN_MODES);
+
+    psf_load_args(gwy_app_settings_get(), &args);
+
+    gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD_ID, &args.op1.id,
+                                     GWY_APP_CONTAINER_ID, &args.op1.datano,
+                                     0);
+
+    ok = psf_dialog(&args, data);
+    psf_save_args(gwy_app_settings_get(), &args);
+    if (!ok)
+        return;
+
+    mydata = gwy_app_data_browser_get(args.op1.datano);
+    quark = gwy_app_get_data_key_for_id(args.op1.id);
+    dfield1 = GWY_DATA_FIELD(gwy_container_get_object(mydata, quark));
+
+    mydata = gwy_app_data_browser_get(args.op2.datano);
+    quark = gwy_app_get_data_key_for_id(args.op2.id);
+    dfield2 = GWY_DATA_FIELD(gwy_container_get_object(mydata, quark));
+
+    psf = gwy_data_field_new_alike(dfield1, TRUE);
+    calculate_psf(dfield1, dfield2, psf, args.sigma/100);
+
+    psfb = gwy_data_field_duplicate(psf);
+    newid = gwy_app_data_browser_add_data_field(psfb, data, TRUE);
+    gwy_app_sync_data_items(data, data, args.op1.id, newid, FALSE,
+                        GWY_DATA_ITEM_GRADIENT,
+                        GWY_DATA_ITEM_MASK_COLOR,
+                        0);
+
+    gwy_app_set_data_field_title(data, newid, _("PSF"));
+    gwy_app_channel_log_add_proc(data, args.op1.id, newid);
+    gwy_object_unref(psfb);
+
+    convolved = gwy_data_field_new_alike(dfield1, TRUE);
+    gwy_data_field_copy(dfield2, convolved, TRUE);
+    field_convolve_default(convolved, psf);
+
+    newid = gwy_app_data_browser_add_data_field(convolved, data, TRUE);
+    gwy_app_sync_data_items(data, data, args.op1.id, newid, FALSE,
+                        GWY_DATA_ITEM_GRADIENT,
+                        GWY_DATA_ITEM_MASK_COLOR,
+                        0);
+
+    gwy_app_set_data_field_title(data, newid, _("PSF*P"));
+    gwy_app_channel_log_add_proc(data, args.op1.id, newid);
+
+
+    subtracted = gwy_data_field_duplicate(convolved);
+    gwy_data_field_subtract_fields(subtracted, convolved, dfield1);
+
+    newid = gwy_app_data_browser_add_data_field(subtracted, data, TRUE);
+    gwy_app_sync_data_items(data, data, args.op1.id, newid, FALSE,
+                        GWY_DATA_ITEM_GRADIENT,
+                        GWY_DATA_ITEM_MASK_COLOR,
+                        0);
+
+    gwy_app_set_data_field_title(data, newid, _("PSF*P - I"));
+    gwy_app_channel_log_add_proc(data, args.op1.id, newid);
+
+
+    g_object_unref(psf);
+    g_object_unref(convolved);
+    g_object_unref(subtracted);
+}
+
+static gboolean
+psf_dialog(PsfArgs *args, GwyContainer *data)
+{
+    GtkWidget *dialog, *table, *hbox, *spin;
+    GwyDataChooser *chooser;
+    PsfControls controls;
+    gint response, row, G_GNUC_UNUSED datano, id;
+    GQuark quark;
+    GwyContainer *mydata;
+    gboolean ok;
+
+    static const GwyEnum psf_outputs[] = {
+        { N_("Data"),              GWY_PSF_DISPLAY_DATA,      },
+        { N_("PSF"),               GWY_PSF_DISPLAY_RESULT,    },
+        { N_("Convolved"),         GWY_PSF_DISPLAY_CONVOLVED,    },
+        { N_("Difference"),        GWY_PSF_DISPLAY_DIFF,      },
+    };
+
+    controls.args = args;
+
+    dialog = gtk_dialog_new_with_buttons(_("Estimate PSF"), NULL, 0,
+                                         _("_Fit"), RESPONSE_ESTIMATE,
+                                         _("_Plot Inits"), RESPONSE_PREVIEW,
+                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                         GTK_STOCK_OK, GTK_RESPONSE_OK,
+                                         NULL);
+    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
+    gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), RESPONSE_PREVIEW,
+                                      !args->update);
+    controls.dialog = dialog;
+
+    hbox = gtk_hbox_new(FALSE, 2);
+    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), GTK_WIDGET(hbox),
+                       FALSE, FALSE, 4);
+
+    mydata = gwy_app_data_browser_get(args->op1.datano);
+    quark = gwy_app_get_data_key_for_id(args->op1.id);
+    datano = args->op1.datano;
+    id = args->op1.id;
+    controls.dfield = GWY_DATA_FIELD(gwy_container_get_object(mydata, quark));
+    controls.result = gwy_data_field_new_alike(controls.dfield, TRUE);
+
+    controls.mydata = gwy_container_new();
+    gwy_container_set_object_by_name(controls.mydata, "/0/data",
+                                     controls.result);
+    gwy_app_sync_data_items(data, controls.mydata, id, 0, FALSE,
+                            GWY_DATA_ITEM_PALETTE,
+                            GWY_DATA_ITEM_MASK_COLOR,
+                            GWY_DATA_ITEM_RANGE,
+                            GWY_DATA_ITEM_REAL_SQUARE,
+                            0);
+    controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, TRUE);
+    gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4);
+
+    table = gtk_table_new(7, 3, FALSE);
+    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
+    gtk_table_set_col_spacings(GTK_TABLE(table), 6);
+    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
+    gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 4);
+    row = 0;
+
+    controls.chooser_op2 = gwy_data_chooser_new_channels();
+    chooser = GWY_DATA_CHOOSER(controls.chooser_op2);
+    g_object_set_data(G_OBJECT(chooser), "dialog", dialog);
+    gwy_data_chooser_set_active_id(chooser, &args->op2);
+    gwy_data_chooser_set_filter(chooser, psf_data_filter, &args->op1, NULL);
+    g_signal_connect(chooser, "changed",
+                     G_CALLBACK(psf_data_changed), &args->op2);
+    psf_data_changed(chooser, &args->op2);
+    gwy_table_attach_adjbar(table, row, _("_Ideal response:"), NULL,
+                            GTK_OBJECT(chooser), GWY_HSCALE_WIDGET_NO_EXPAND);
+    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+    row++;
+
+    controls.display
+        = gwy_enum_combo_box_new(psf_outputs, G_N_ELEMENTS(psf_outputs),
+                                 G_CALLBACK(display_changed),
+                                 &controls, args->display, TRUE);
+    gwy_table_attach_adjbar(table, row, _("_Display:"), NULL,
+                            GTK_OBJECT(controls.display),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    row++;
+
+    controls.sigma = gtk_adjustment_new(args->sigma, 1e-5, 1e2, 1e-5, 1, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("_Sigma init:"), "%",
+                                   controls.sigma, GWY_HSCALE_LOG);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 7);
+    g_object_set_data(G_OBJECT(controls.sigma), "controls", &controls);
+    g_signal_connect(controls.sigma, "value-changed",
+                     G_CALLBACK(sigma_changed), &controls);
+    row++;
+
+    controls.update = gtk_check_button_new_with_mnemonic(_("I_nstant updates"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.update),
+                                 args->update);
+    gtk_table_attach(GTK_TABLE(table), controls.update,
+                     0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    g_signal_connect(controls.update, "toggled",
+                     G_CALLBACK(update_changed), &controls);
+    row++;
+
+    if (controls.args->update)
+        preview(&controls, controls.args);
+
+    gtk_widget_show_all(dialog);
+    do {
+        response = gtk_dialog_run(GTK_DIALOG(dialog));
+        switch (response) {
+            case GTK_RESPONSE_CANCEL:
+            case GTK_RESPONSE_DELETE_EVENT:
+            gtk_widget_destroy(dialog);
+            case GTK_RESPONSE_NONE:
+            return FALSE;
+            break;
+
+            case GTK_RESPONSE_OK:
+            break;
+
+            case RESPONSE_PREVIEW:
+            preview(&controls, args);
+            break;
+
+            case RESPONSE_ESTIMATE:
+            gwy_app_wait_start(GTK_WINDOW(dialog), _("Searching..."));
+            gwy_app_wait_set_fraction(0.0);
+            ok = fit(args, gwy_app_wait_set_fraction);
+            gwy_app_wait_finish();
+            if (ok) {
+                gtk_adjustment_set_value(GTK_ADJUSTMENT(controls.sigma),
+                                         args->sigma);
+                if (!controls.args->update)
+                    preview(&controls, args);
+            }
+            break;
+
+            default:
+            g_assert_not_reached();
+            break;
+        }
+    } while (response != GTK_RESPONSE_OK);
+
+    gtk_widget_destroy(dialog);
+
+    return TRUE;
+}
+
+static void
+display_changed(GtkComboBox *combo, PsfControls *controls)
+{
+    controls->args->display = gwy_enum_combo_box_get_active(combo);
+    if (controls->args->update)
+        preview(controls, controls->args);
+}
+
+static void
+sigma_changed(GtkAdjustment *adj, PsfControls *controls)
+{
+    controls->args->sigma = gtk_adjustment_get_value(adj);
+    if (controls->args->update)
+        preview(controls, controls->args);
+}
+
+static void
+update_changed(GtkToggleButton *button, PsfControls *controls)
+{
+    controls->args->update = gtk_toggle_button_get_active(button);
+    gtk_dialog_set_response_sensitive(GTK_DIALOG(controls->dialog),
+                                      RESPONSE_PREVIEW,
+                                      !controls->args->update);
+    if (controls->args->update)
+        preview(controls, controls->args);
+}
+
+static gdouble
+mean_square(GwyDataField *dfield)
+{
+    const gdouble *d = gwy_data_field_get_data_const(dfield);
+    guint i, n = dfield->xres * dfield->yres;
+    gdouble s = 0.0;
+
+    for (i = 0; i < n; i++)
+        s += d[i]*d[i];
+
+    return s/n;
+}
+
+static gdouble
+normalised_square_gradient_integral(GwyDataField *dfield)
+{
+    const gdouble *d = gwy_data_field_get_data_const(dfield);
+    guint i, j, k, xres = dfield->xres, yres = dfield->yres;
+    gdouble s = 0.0, m, min, max, dx, dy, hx, hy;
+
+    gwy_data_field_get_min_max(dfield, &min, &max);
+    hx = gwy_data_field_get_xmeasure(dfield);
+    hy = gwy_data_field_get_ymeasure(dfield);
+    if (fabs(log(hx/hy) - 1.0) < 1e-5) {
+        /* We can factor out the step here. */
+        for (i = 0; i < yres-1; i++) {
+            k = i*xres;
+            for (j = 0; j < xres-1; j++, k++) {
+                dx = d[k+1] - d[k];
+                dy = d[k+xres] - d[k];
+                s += dx*dx + dy*dy;
+            }
+        }
+        /* Convert the plain sum to an integral. */
+        s /= hx*hy;
+    }
+    else {
+        for (i = 0; i < yres-1; i++) {
+            k = i*xres;
+            for (j = 0; j < xres-1; j++, k++) {
+                dx = (d[k+1] - d[k])/hx;
+                dy = (d[k+xres] - d[k])/hy;
+                s += dx*dx + dy*dy;
+            }
+        }
+        /* Convert the plain sum to an integral. */
+        s *= hx*hy;
+    }
+
+    /* Normalise. */
+    m = fmax(fabs(min), fabs(max));
+    return s/(G_PI*m*m);
+}
+
+static gboolean
+fit(PsfArgs *args, GwySetFractionFunc set_fraction)
+{
+    GwyDataField *dfield1, *dfield2, *psf, *convolved;
+    GQuark quark;
+    GwyContainer *mydata;
+    gdouble sigma, msq, m;
+    gint isigma;
+    guint i, im, n;
+    GArray *results;
+
+    mydata = gwy_app_data_browser_get(args->op1.datano);
+    quark = gwy_app_get_data_key_for_id(args->op1.id);
+    dfield1 = GWY_DATA_FIELD(gwy_container_get_object(mydata, quark));
+
+    mydata = gwy_app_data_browser_get(args->op2.datano);
+    quark = gwy_app_get_data_key_for_id(args->op2.id);
+    dfield2 = GWY_DATA_FIELD(gwy_container_get_object(mydata, quark));
+
+    psf = gwy_data_field_new_alike(dfield1, TRUE);
+    convolved = gwy_data_field_new_alike(dfield1, TRUE);
+
+    results = g_array_new(FALSE, FALSE, sizeof(gdouble));
+    for (isigma = -14; isigma <= 0; isigma += 1) {
+        sigma = pow10(0.5*isigma);
+        g_array_append_val(results, sigma);
+
+        calculate_psf(dfield1, dfield2, psf, sigma);
+        msq = normalised_square_gradient_integral(psf);
+        g_array_append_val(results, msq);
+
+        gwy_data_field_copy(dfield2, convolved, TRUE);
+        field_convolve_default(convolved, psf);
+        gwy_data_field_subtract_fields(convolved, convolved, dfield1);
+        /* Differences must be calculated from zero, not mean plane. */
+        msq = mean_square(convolved);
+        g_array_append_val(results, msq);
+
+        if (set_fraction && !set_fraction((isigma + 14.0)/15.0)) {
+            g_object_unref(convolved);
+            g_object_unref(psf);
+            g_array_free(results, TRUE);
+            return FALSE;
+        }
+    }
+    g_object_unref(convolved);
+    g_object_unref(psf);
+
+    n = results->len/3;
+
+    /* Normalise both square sums using the edge (maximum) values. */
+    m = g_array_index(results, gdouble, 1);
+    for (i = 1; i < n; i++) {
+        msq = g_array_index(results, gdouble, 3*i + 1);
+        if (msq > m)
+            m = msq;
+    }
+    for (i = 0; i < n; i++)
+        g_array_index(results, gdouble, 3*i + 1) /= m;
+
+    m = g_array_index(results, gdouble, 2);
+    for (i = 1; i < n; i++) {
+        msq = g_array_index(results, gdouble, 3*i + 2);
+        if (msq > m)
+            m = msq;
+    }
+    for (i = 0; i < n; i++)
+        g_array_index(results, gdouble, 3*i + 2) /= m;
+
+    /* Find minimum. */
+    m = G_MAXDOUBLE;
+    im = 0;
+    for (i = 0; i < n; i++) {
+        msq = (g_array_index(results, gdouble, 3*i + 1)
+               + g_array_index(results, gdouble, 3*i + 2));
+        if (msq < m) {
+            im = i;
+            m = msq;
+        }
+    }
+
+    /* Attempt to refine minimum position. */
+    if (im > 0 && im < n-1) {
+        gdouble c[3];
+        gdouble x, sigma1, sigma2;
+
+        for (i = 0; i < 3; i++) {
+            c[i] = -(g_array_index(results, gdouble, 3*(im-1 + i) + 1)
+                     + g_array_index(results, gdouble, 3*(im-1 + i) + 2));
+        }
+        gwy_math_refine_maximum_1d(c, &x);
+        if (x < 0.0) {
+            x += 1.0;
+            im -= 1;
+        }
+        sigma1 = g_array_index(results, gdouble, 3*im);
+        sigma2 = g_array_index(results, gdouble, 3*(im + 1));
+        sigma = exp((1.0 - x)*log(sigma1) + x*log(sigma2));
+    }
+    else
+        sigma = g_array_index(results, gdouble, 3*im);
+
+    args->sigma = 100.0*sigma;
+    g_array_free(results, TRUE);
+
+    return TRUE;
+}
+
+static void
+preview(PsfControls *controls, PsfArgs *args)
+{
+    GwyDataField *dfield1, *dfield2, *psf, *convolved;
+    GQuark quark;
+    GwyContainer *mydata;
+    gdouble realsigma;
+
+    mydata = gwy_app_data_browser_get(args->op1.datano);
+    quark = gwy_app_get_data_key_for_id(args->op1.id);
+    dfield1 = GWY_DATA_FIELD(gwy_container_get_object(mydata, quark));
+
+    if (args->op2.datano < 0 || args->op2.id < 0) {
+        if (args->display == GWY_PSF_DISPLAY_DATA)
+            gwy_data_field_copy(dfield1, controls->result, TRUE);
+        else
+            gwy_data_field_clear(controls->result);
+        gwy_data_field_data_changed(controls->result);
+        return;
+    }
+
+    mydata = gwy_app_data_browser_get(args->op2.datano);
+    quark = gwy_app_get_data_key_for_id(args->op2.id);
+    dfield2 = GWY_DATA_FIELD(gwy_container_get_object(mydata, quark));
+
+    psf = gwy_data_field_new_alike(dfield1, TRUE);
+
+    realsigma = args->sigma/100.0;
+    calculate_psf(dfield1, dfield2, psf, realsigma);
+
+    if (args->display == GWY_PSF_DISPLAY_DATA) {
+        gwy_data_field_copy(dfield1, controls->result, TRUE);
+        gwy_data_field_data_changed(controls->result);
+    }
+    else if (args->display == GWY_PSF_DISPLAY_RESULT) {
+        gwy_data_field_copy(psf, controls->result, TRUE);
+        gwy_data_field_data_changed(controls->result);
+    }
+    else if (args->display == GWY_PSF_DISPLAY_CONVOLVED) {
+        convolved = gwy_data_field_new_alike(dfield1, TRUE);
+        gwy_data_field_copy(dfield2, convolved, TRUE);
+        field_convolve_default(convolved, psf);
+        gwy_data_field_copy(convolved, controls->result, TRUE);
+        gwy_data_field_data_changed(controls->result);
+        gwy_object_unref(convolved);
+
+    }
+    else {
+        convolved = gwy_data_field_new_alike(dfield1, TRUE);
+        gwy_data_field_copy(dfield2, convolved, TRUE);
+        field_convolve_default(convolved, psf);
+        gwy_data_field_subtract_fields(convolved, convolved, dfield1);
+        gwy_data_field_copy(convolved, controls->result, TRUE);
+        gwy_data_field_data_changed(controls->result);
+        gwy_object_unref(convolved);
+    }
+}
+
+static void
+psf_data_changed(GwyDataChooser *chooser, GwyAppDataId *object)
+{
+    GtkWidget *dialog;
+
+    gwy_data_chooser_get_active_id(chooser, object);
+    gwy_debug("data: %d %d", object->datano, object->id);
+
+    dialog = g_object_get_data(G_OBJECT(chooser), "dialog");
+    g_assert(GTK_IS_DIALOG(dialog));
+    gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK,
+                                      object->datano);
+}
+
+static gboolean
+psf_data_filter(GwyContainer *data, gint id, gpointer user_data)
+{
+
+    GwyAppDataId *object = (GwyAppDataId*)user_data;
+    GwyDataField *op1, *op2;
+    GQuark quark;
+
+    quark = gwy_app_get_data_key_for_id(id);
+    op1 = GWY_DATA_FIELD(gwy_container_get_object(data, quark));
+
+    data = gwy_app_data_browser_get(object->datano);
+    quark = gwy_app_get_data_key_for_id(object->id);
+    op2 = GWY_DATA_FIELD(gwy_container_get_object(data, quark));
+
+    /* It does not make sense to crosscorrelate with itself */
+    if (op1 == op2)
+        return FALSE;
+
+    return !gwy_data_field_check_compatibility(op1, op2,
+                                               GWY_DATA_COMPATIBILITY_RES
+                                               | GWY_DATA_COMPATIBILITY_REAL
+                                               | GWY_DATA_COMPATIBILITY_LATERAL);
+}
+
+/*
+ * XXX: I*P should be an integral.  The plain convolution sum needs to be
+ * multiplied by area/npixels to approximate the integral.  This also means
+ * we have to *divide* the estimated PSF by the same factor.
+ */
+static void
+calculate_psf(GwyDataField *measured, GwyDataField *ideal,
+              GwyDataField *psf, gdouble sigma)
+{
+    GwyDataField *frideal, *fiideal, *frmeasured, *fimeasured,
+                 *frpsf, *fipsf, *ipsf;
+    gint i;
+    gint xres = gwy_data_field_get_xres(measured);
+    gint yres = gwy_data_field_get_yres(measured);
+    gdouble *frmdata, *fimdata, *fridata, *fiidata, *frpsfdata, *fipsfdata;
+    gdouble rv, iv, inorm, realsigma, rs2, min, max, q;
+
+    frideal = gwy_data_field_new_alike(measured, TRUE);
+    fiideal = gwy_data_field_new_alike(measured, TRUE);
+    frmeasured = gwy_data_field_new_alike(measured, TRUE);
+    fimeasured = gwy_data_field_new_alike(measured, TRUE);
+    frpsf = gwy_data_field_new_alike(measured, TRUE);
+    fipsf = gwy_data_field_new_alike(measured, TRUE);
+    ipsf = gwy_data_field_new_alike(measured, TRUE);
+
+    gwy_data_field_2dfft_raw(measured, NULL, frmeasured, fimeasured,
+                             GWY_TRANSFORM_DIRECTION_FORWARD);
+    gwy_data_field_2dfft_raw(ideal, NULL, frideal, fiideal,
+                             GWY_TRANSFORM_DIRECTION_FORWARD);
+
+    frmdata = gwy_data_field_get_data(frmeasured);
+    fimdata = gwy_data_field_get_data(fimeasured);
+    fridata = gwy_data_field_get_data(frideal);
+    fiidata = gwy_data_field_get_data(fiideal);
+
+    frpsfdata = gwy_data_field_get_data(frpsf);
+    fipsfdata = gwy_data_field_get_data(fipsf);
+
+    gwy_data_field_get_min_max(frideal, &min, &max);
+    realsigma = sigma*(max - min);
+    rs2 = realsigma*realsigma;
+    q = sqrt(xres*yres)/(gwy_data_field_get_xreal(ideal)
+                         * gwy_data_field_get_yreal(ideal));
+
+    for (i = 0; i < xres*yres; i++) {
+        inorm = fridata[i]*fridata[i] + fiidata[i]*fiidata[i];
+
+        rv = (frmdata[i]*fridata[i] + fimdata[i]*fiidata[i])/(inorm + rs2);
+        iv = (-frmdata[i]*fiidata[i] + fimdata[i]*fridata[i])/(inorm + rs2);
+
+        frpsfdata[i] = rv*q;
+        fipsfdata[i] = iv*q;
+    }
+
+    gwy_data_field_2dfft_raw(frpsf, fipsf, psf, ipsf,
+                             GWY_TRANSFORM_DIRECTION_BACKWARD);
+    gwy_data_field_2dfft_humanize(psf);
+    set_transfer_function_units(ideal, measured, psf);
+
+    gwy_object_unref(frideal);
+    gwy_object_unref(fiideal);
+    gwy_object_unref(frmeasured);
+    gwy_object_unref(fimeasured);
+    gwy_object_unref(frpsf);
+    gwy_object_unref(fipsf);
+    gwy_object_unref(ipsf);
+}
+
+static const gchar sigma_key[]   = "/module/psf/sigma";
+static const gchar update_key[]  = "/module/psf/update";
+static const gchar display_key[] = "/module/psf/display";
+
+static void
+psf_sanitize_args(PsfArgs *args)
+{
+    gwy_app_data_id_verify_channel(&args->op2);
+}
+
+static void
+psf_load_args(GwyContainer *container, PsfArgs *args)
+{
+    *args = psf_defaults;
+
+    gwy_container_gis_boolean_by_name(container, update_key, &args->update);
+    gwy_container_gis_enum_by_name(container, display_key, &args->display);
+    gwy_container_gis_double_by_name(container, sigma_key, &args->sigma);
+    args->op2 = op2_id;
+
+    psf_sanitize_args(args);
+}
+
+static void
+psf_save_args(GwyContainer *container, PsfArgs *args)
+{
+    op2_id = args->op2;
+
+    gwy_container_set_boolean_by_name(container, update_key, args->update);
+    gwy_container_set_enum_by_name(container, display_key, args->display);
+    gwy_container_set_double_by_name(container, sigma_key, args->sigma);
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/process/rank.c b/modules/process/rank.c
index d6fffbd..a2a492e 100644
--- a/modules/process/rank.c
+++ b/modules/process/rank.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: rank.c 18665 2016-04-26 20:42:48Z yeti-dn $
+ *  @(#) $Id: rank.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014-2015 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -91,12 +91,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Enhances local contrast using a rank transform."),
     "Yeti <yeti at gwyddion.net>",
-    "2.1",
+    "2.2",
     "David Nečas (Yeti) & Petr Klapetek",
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, rank)
 
 static gboolean
 module_register(void)
@@ -162,7 +162,7 @@ rank_dialog(RankArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(2 + G_N_ELEMENTS(types), 4, FALSE);
+    table = gtk_table_new(2 + G_N_ELEMENTS(types), 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -172,7 +172,7 @@ rank_dialog(RankArgs *args)
 
     label = gtk_label_new(_("Filter type:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label, 0, 3, row, row+1,
+    gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
                      GTK_FILL, 0, 0, 0);
     row++;
 
@@ -181,12 +181,12 @@ rank_dialog(RankArgs *args)
                                              &controls,
                                              args->type);
     row = gwy_radio_buttons_attach_to_table(controls.type, GTK_TABLE(table),
-                                            3, row);
+                                            2, row);
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     controls.size = gtk_adjustment_new(args->size, 1, MAX_SIZE, 1, 10, 0);
-    gwy_table_attach_hscale(table, row++, _("Kernel _size:"), "px",
-                            controls.size, 0);
+    gwy_table_attach_adjbar(table, row++, _("Kernel _size:"), _("px"),
+                            controls.size, GWY_HSCALE_DEFAULT);
     g_signal_connect_swapped(controls.size, "value-changed",
                              G_CALLBACK(size_changed), &controls);
 
diff --git a/modules/process/rotate.c b/modules/process/rotate.c
index 42be52d..8ecc0e6 100644
--- a/modules/process/rotate.c
+++ b/modules/process/rotate.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: rotate.c 18945 2016-09-11 10:39:11Z yeti-dn $
- *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: rotate.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -95,12 +95,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Rotates data by arbitrary angle."),
     "Yeti <yeti at gwyddion.net>",
-    "2.0",
+    "2.2",
     "David Nečas (Yeti) & Petr Klapetek",
     "2003",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, rotate)
 
 static gboolean
 module_register(void)
@@ -252,7 +252,7 @@ rotate_dialog(RotateArgs *args,
     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox,
                        FALSE, FALSE, 4);
 
-    table = gtk_table_new(8, 4, FALSE);
+    table = gtk_table_new(8, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -261,8 +261,8 @@ rotate_dialog(RotateArgs *args,
 
     controls.angle = gtk_adjustment_new(args->angle*180.0/G_PI,
                                         -360, 360, 0.01, 5, 0);
-    gwy_table_attach_hscale(table, row, _("Rotate by _angle:"), _("deg"),
-                            controls.angle, 0);
+    gwy_table_attach_adjbar(table, row, _("Rotate by _angle:"), _("deg"),
+                            controls.angle, GWY_HSCALE_LINEAR);
     g_signal_connect(controls.angle, "value-changed",
                      G_CALLBACK(angle_changed), &controls);
     row++;
@@ -271,7 +271,7 @@ rotate_dialog(RotateArgs *args,
         = gwy_enum_combo_box_new(gwy_interpolation_type_get_enum(), -1,
                                  G_CALLBACK(interp_changed), &controls,
                                  args->interp, TRUE);
-    gwy_table_attach_hscale(table, row, _("_Interpolation type:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Interpolation type:"), NULL,
                             GTK_OBJECT(controls.interp),
                             GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
@@ -281,7 +281,7 @@ rotate_dialog(RotateArgs *args,
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.show_grid),
                                  args->show_grid);
     gtk_table_attach(GTK_TABLE(table), controls.show_grid,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls.show_grid, "toggled",
                      G_CALLBACK(show_grid_changed), &controls);
     row++;
@@ -291,7 +291,7 @@ rotate_dialog(RotateArgs *args,
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.create_mask),
                                  args->create_mask);
     gtk_table_attach(GTK_TABLE(table), controls.create_mask,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls.create_mask, "toggled",
                      G_CALLBACK(create_mask_changed), &controls);
     row++;
@@ -300,7 +300,7 @@ rotate_dialog(RotateArgs *args,
     label = gtk_label_new(_("Result size:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.resize
@@ -314,13 +314,13 @@ rotate_dialog(RotateArgs *args,
                                     GWY_ROTATE_RESIZE_CUT,
                                     NULL);
     row = gwy_radio_buttons_attach_to_table(controls.resize,
-                                            GTK_TABLE(table), 4, row);
+                                            GTK_TABLE(table), 2, row);
 
     controls.data = create_preview_data(data);
     controls.data_view = create_preview(controls.data, 0, PREVIEW_SIZE, FALSE);
     g_object_unref(controls.data);
     controls.selection = create_vector_layer(GWY_DATA_VIEW(controls.data_view),
-                                             0, "Lattice", TRUE);
+                                             0, "Lattice", FALSE);
     gwy_selection_set_max_objects(controls.selection, 1);
     gtk_box_pack_start(GTK_BOX(hbox), controls.data_view, FALSE, FALSE, 8);
 
diff --git a/modules/process/scale.c b/modules/process/scale.c
index da4062d..e526552 100644
--- a/modules/process/scale.c
+++ b/modules/process/scale.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: scale.c 18537 2016-03-28 18:11:19Z yeti-dn $
- *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: scale.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -56,25 +56,25 @@ typedef struct {
     gboolean in_update;
 } ScaleControls;
 
-static gboolean    module_register           (void);
-static void        scale                     (GwyContainer *data,
-                                              GwyRunType run);
-static gboolean    scale_dialog              (ScaleArgs *args);
-static void        proportional_changed_cb   (GtkToggleButton *check_button,
-                                              ScaleArgs *args);
-static void        scale_changed_cb          (GtkAdjustment *adj,
-                                              ScaleArgs *args);
-static void        width_changed_cb          (GtkAdjustment *adj,
-                                              ScaleArgs *args);
-static void        height_changed_cb         (GtkAdjustment *adj,
-                                              ScaleArgs *args);
-static void        scale_dialog_update       (ScaleControls *controls,
-                                              ScaleArgs *args);
-static void        scale_sanitize_args       (ScaleArgs *args);
-static void        scale_load_args           (GwyContainer *container,
-                                              ScaleArgs *args);
-static void        scale_save_args           (GwyContainer *container,
-                                              ScaleArgs *args);
+static gboolean module_register     (void);
+static void     scale               (GwyContainer *data,
+                                     GwyRunType run);
+static gboolean scale_dialog        (ScaleArgs *args);
+static void     proportional_changed(GtkToggleButton *check_button,
+                                     ScaleArgs *args);
+static void     scale_changed       (GtkAdjustment *adj,
+                                     ScaleArgs *args);
+static void     width_changed       (GtkAdjustment *adj,
+                                     ScaleArgs *args);
+static void     height_changed      (GtkAdjustment *adj,
+                                     ScaleArgs *args);
+static void     scale_dialog_update (ScaleControls *controls,
+                                     ScaleArgs *args);
+static void     scale_sanitize_args (ScaleArgs *args);
+static void     scale_load_args     (GwyContainer *container,
+                                     ScaleArgs *args);
+static void     scale_save_args     (GwyContainer *container,
+                                     ScaleArgs *args);
 
 static const ScaleArgs scale_defaults = {
     1.0,
@@ -92,12 +92,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Scales data by arbitrary factor."),
     "Yeti <yeti at gwyddion.net>",
-    "1.7",
+    "1.8",
     "David Nečas (Yeti) & Petr Klapetek & Dirk Kähler",
     "2003",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, scale)
 
 static gboolean
 module_register(void)
@@ -190,7 +190,7 @@ scale_dialog(ScaleArgs *args)
     GtkWidget *dialog, *table, *spin;
     ScaleControls controls;
     gdouble adjmin, step = 1e-4;
-    gint response;
+    gint response, row;
 
     dialog = gtk_dialog_new_with_buttons(gwy_sgettext("verb|Scale"), NULL, 0,
                                          _("_Reset"), RESPONSE_RESET,
@@ -200,12 +200,13 @@ scale_dialog(ScaleArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(4, 5, FALSE);
+    table = gtk_table_new(4, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table,
                        FALSE, FALSE, 4);
+    row = 0;
 
     adjmin = GWY_ROUND(2.0/MIN(args->org_xres, args->org_yres)/step)*step;
     controls.ratio = gtk_adjustment_new(args->ratio,
@@ -213,50 +214,55 @@ scale_dialog(ScaleArgs *args)
                                         16384.0/MAX(args->org_xres,
                                                     args->org_yres),
                                         step, 0.1, 0);
-    spin = gwy_table_attach_hscale(table, 0, _("Scale by _ratio:"), NULL,
+    spin = gwy_table_attach_adjbar(table, row, _("Scale by _ratio:"), NULL,
                                    controls.ratio, GWY_HSCALE_LOG);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 4);
     g_object_set_data(G_OBJECT(controls.ratio), "controls", &controls);
     g_signal_connect(controls.ratio, "value-changed",
-                     G_CALLBACK(scale_changed_cb), args);
+                     G_CALLBACK(scale_changed), args);
 
     controls.proportional
         = gtk_check_button_new_with_mnemonic(_("_proportional"));
-    gtk_table_attach_defaults(GTK_TABLE(table), controls.proportional,
-                              3, 4, 0, 1);
+    gtk_table_attach(GTK_TABLE(table), controls.proportional, 2, 3, row, row+1,
+                     GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.proportional),
                                  args->proportional);
     g_object_set_data(G_OBJECT(controls.proportional), "controls", &controls);
     g_signal_connect(controls.proportional, "toggled",
-                     G_CALLBACK(proportional_changed_cb), args);
+                     G_CALLBACK(proportional_changed), args);
+    row++;
 
     controls.xres = gtk_adjustment_new(args->ratio*args->xres,
-                                       2, 16384, 1, 10, 0);
-    spin = gwy_table_attach_hscale(table, 1, _("New _width:"), "px",
+                                       row, 16384, 1, 10, 0);
+    spin = gwy_table_attach_adjbar(table, 1, _("New _width:"), _("px"),
                                    controls.xres, GWY_HSCALE_LOG);
     g_object_set_data(G_OBJECT(controls.xres), "controls", &controls);
     g_signal_connect(controls.xres, "value-changed",
-                     G_CALLBACK(width_changed_cb), args);
+                     G_CALLBACK(width_changed), args);
+    row++;
 
     controls.yres = gtk_adjustment_new(args->ratio*args->yres,
                                        2, 16384, 1, 10, 0);
-    spin = gwy_table_attach_hscale(table, 2, _("New _height:"), "px",
+    spin = gwy_table_attach_adjbar(table, row, _("New _height:"), _("px"),
                                    controls.yres, GWY_HSCALE_LOG);
     g_object_set_data(G_OBJECT(controls.yres), "controls", &controls);
     g_signal_connect(controls.yres, "value-changed",
-                     G_CALLBACK(height_changed_cb), args);
+                     G_CALLBACK(height_changed), args);
+    row++;
 
     controls.interp
         = gwy_enum_combo_box_new(gwy_interpolation_type_get_enum(), -1,
                                  G_CALLBACK(gwy_enum_combo_box_update_int),
                                  &args->interp, args->interp, TRUE);
-    gwy_table_attach_hscale(table, 3, _("_Interpolation type:"), NULL,
-                            GTK_OBJECT(controls.interp), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("_Interpolation type:"), NULL,
+                            GTK_OBJECT(controls.interp),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
+    row++;
 
     controls.in_update = FALSE;
     scale_dialog_update(&controls, args);
-
     gtk_widget_show_all(dialog);
+
     do {
         response = gtk_dialog_run(GTK_DIALOG(dialog));
         switch (response) {
@@ -295,8 +301,7 @@ scale_dialog(ScaleArgs *args)
 }
 
 static void
-proportional_changed_cb(GtkToggleButton *check_button,
-                        ScaleArgs *args)
+proportional_changed(GtkToggleButton *check_button, ScaleArgs *args)
 {
     ScaleControls *controls;
 
@@ -315,8 +320,7 @@ proportional_changed_cb(GtkToggleButton *check_button,
 }
 
 static void
-scale_changed_cb(GtkAdjustment *adj,
-                 ScaleArgs *args)
+scale_changed(GtkAdjustment *adj, ScaleArgs *args)
 {
     ScaleControls *controls;
 
@@ -334,8 +338,7 @@ scale_changed_cb(GtkAdjustment *adj,
 }
 
 static void
-width_changed_cb(GtkAdjustment *adj,
-                 ScaleArgs *args)
+width_changed(GtkAdjustment *adj, ScaleArgs *args)
 {
     ScaleControls *controls;
 
@@ -355,8 +358,7 @@ width_changed_cb(GtkAdjustment *adj,
 }
 
 static void
-height_changed_cb(GtkAdjustment *adj,
-                  ScaleArgs *args)
+height_changed(GtkAdjustment *adj, ScaleArgs *args)
 {
     ScaleControls *controls;
 
diff --git a/modules/process/scars.c b/modules/process/scars.c
index f10d126..84a252f 100644
--- a/modules/process/scars.c
+++ b/modules/process/scars.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: scars.c 18966 2016-09-18 10:56:19Z yeti-dn $
+ *  @(#) $Id: scars.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -24,6 +24,7 @@
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
 #include <libprocess/arithmetic.h>
+#include <libprocess/grains.h>
 #include <libprocess/correct.h>
 #include <libgwydgets/gwystock.h>
 #include <libgwydgets/gwyradiobuttons.h>
@@ -51,6 +52,8 @@ typedef struct {
     gint min_len;
     gint max_width;
     gboolean update;
+    gboolean combine;
+    GwyMergeType combine_type;
 } ScarsArgs;
 
 typedef struct {
@@ -64,6 +67,8 @@ typedef struct {
     GtkObject *max_width;
     GtkWidget *color_button;
     GtkWidget *update;
+    GtkWidget *combine;
+    GSList *combine_type;
     GwyContainer *mydata;
     gboolean computed;
     gboolean in_init;
@@ -77,10 +82,12 @@ static void     scars_mark                         (GwyContainer *data,
 static void     run_noninteractive                 (ScarsArgs *args,
                                                     GwyContainer *data,
                                                     GwyDataField *dfield,
+                                                    GwyDataField *existing_mask,
                                                     GQuark mquark);
 static void     scars_mark_dialog                  (ScarsArgs *args,
                                                     GwyContainer *data,
                                                     GwyDataField *dfield,
+                                                    GwyDataField *existing_mask,
                                                     gint id,
                                                     GQuark mquark);
 static void     scars_mark_dialog_update_controls  (ScarsControls *controls,
@@ -105,6 +112,8 @@ static const ScarsArgs scars_defaults = {
     16,
     4,
     TRUE,
+    FALSE,
+    GWY_MERGE_UNION,
 };
 
 static GwyModuleInfo module_info = {
@@ -112,12 +121,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Marks and/or removes scars (horizontal linear artifacts)."),
     "Yeti <yeti at gwyddion.net>",
-    "1.13",
+    "1.15",
     "David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, scars)
 
 static gboolean
 module_register(void)
@@ -125,7 +134,7 @@ module_register(void)
     gwy_process_func_register("scars_mark",
                               (GwyProcessFunc)&scars_mark,
                               N_("/_Correct Data/M_ark Scars..."),
-                              GWY_STOCK_SCARS,
+                              GWY_STOCK_MARK_SCARS,
                               SCARS_MARK_RUN_MODES,
                               GWY_MENU_FLAG_DATA,
                               N_("Mark horizontal scars (strokes)"));
@@ -231,7 +240,7 @@ static void
 scars_mark(GwyContainer *data, GwyRunType run)
 {
     ScarsArgs args;
-    GwyDataField *dfield;
+    GwyDataField *dfield, *mask;
     GQuark mquark;
     gint id;
 
@@ -239,24 +248,26 @@ scars_mark(GwyContainer *data, GwyRunType run)
     scars_mark_load_args(gwy_app_settings_get(), &args);
     gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &dfield,
                                      GWY_APP_MASK_FIELD_KEY, &mquark,
+                                     GWY_APP_MASK_FIELD, &mask,
                                      GWY_APP_DATA_FIELD_ID, &id,
                                      0);
     g_return_if_fail(dfield && mquark);
 
     if (run == GWY_RUN_IMMEDIATE) {
-        run_noninteractive(&args, data, dfield, mquark);
+        run_noninteractive(&args, data, dfield, mask, mquark);
         gwy_app_channel_log_add(data, id, id, "proc::scars_remove",
                                 "settings-name", "scars",
                                 NULL);
     }
     else
-        scars_mark_dialog(&args, data, dfield, id, mquark);
+        scars_mark_dialog(&args, data, dfield, mask, id, mquark);
 }
 
 static void
 run_noninteractive(ScarsArgs *args,
                    GwyContainer *data,
                    GwyDataField *dfield,
+                   GwyDataField *existing_mask,
                    GQuark mquark)
 {
     GwyDataField *mfield;
@@ -264,6 +275,12 @@ run_noninteractive(ScarsArgs *args,
     gwy_app_undo_qcheckpointv(data, 1, &mquark);
     mfield = create_mask_field(dfield);
     mark_scars(dfield, mfield, args);
+    if (existing_mask && args->combine) {
+        if (args->combine_type == GWY_MERGE_UNION)
+            gwy_data_field_grains_add(mfield, existing_mask);
+        else if (args->combine_type == GWY_MERGE_INTERSECTION)
+            gwy_data_field_grains_intersect(mfield, existing_mask);
+    }
     gwy_container_set_object(data, mquark, mfield);
     g_object_unref(mfield);
 }
@@ -272,6 +289,7 @@ static void
 scars_mark_dialog(ScarsArgs *args,
                   GwyContainer *data,
                   GwyDataField *dfield,
+                  GwyDataField *existing_mask,
                   gint id,
                   GQuark mquark)
 {
@@ -288,6 +306,7 @@ scars_mark_dialog(ScarsArgs *args,
     gboolean temp;
     gint row;
 
+    gwy_clear(&controls, 1);
     controls.in_init = TRUE;
     controls.args = args;
     dialog = gtk_dialog_new_with_buttons(_("Mark Scars"), NULL, 0, NULL);
@@ -310,6 +329,9 @@ scars_mark_dialog(ScarsArgs *args,
 
     controls.mydata = gwy_container_new();
     gwy_container_set_object_by_name(controls.mydata, "/0/data", dfield);
+    if (existing_mask)
+        gwy_container_set_object_by_name(controls.mydata, "/1/mask",
+                                         existing_mask);
     gwy_app_sync_data_items(data, controls.mydata, id, 0, FALSE,
                             GWY_DATA_ITEM_PALETTE,
                             GWY_DATA_ITEM_MASK_COLOR,
@@ -319,7 +341,7 @@ scars_mark_dialog(ScarsArgs *args,
     controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, TRUE);
     gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4);
 
-    table = gtk_table_new(11, 4, FALSE);
+    table = gtk_table_new(11 + 1*(!!existing_mask), 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -328,30 +350,32 @@ scars_mark_dialog(ScarsArgs *args,
 
     controls.max_width = gtk_adjustment_new(args->max_width,
                                             1.0, 16.0, 1, 3, 0);
-    gwy_table_attach_hscale(table, row++, _("Maximum _width:"), "px",
-                            controls.max_width, 0);
+    gwy_table_attach_adjbar(table, row++, _("Maximum _width:"), _("px"),
+                            controls.max_width,
+                            GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(controls.max_width, "value-changed",
                              G_CALLBACK(scars_invalidate), &controls);
 
     controls.min_len = gtk_adjustment_new(args->min_len,
                                           1.0, MAX_LENGTH, 1, 10, 0);
-    gwy_table_attach_hscale(table, row++, _("Minimum _length:"), "px",
-                            controls.min_len, GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(table, row++, _("Minimum _length:"), _("px"),
+                            controls.min_len,
+                            GWY_HSCALE_DEFAULT | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(controls.min_len, "value-changed",
                              G_CALLBACK(scars_invalidate), &controls);
 
     controls.threshold_high = gtk_adjustment_new(args->threshold_high,
                                                  0.0, 2.0, 0.01, 0.1, 0);
-    gwy_table_attach_hscale(table, row++, _("_Hard threshold:"),
-                            _("RMS"), controls.threshold_high, 0);
+    gwy_table_attach_adjbar(table, row++, _("_Hard threshold:"), _("RMS"),
+                            controls.threshold_high, GWY_HSCALE_LINEAR);
     g_signal_connect(controls.threshold_high, "value-changed",
                      G_CALLBACK(scars_mark_dialog_update_thresholds),
                      &controls);
 
     controls.threshold_low = gtk_adjustment_new(args->threshold_low,
                                                 0.0, 2.0, 0.01, 0.1, 0);
-    gwy_table_attach_hscale(table, row, _("_Soft threshold:"), _("RMS"),
-                            controls.threshold_low, 0);
+    gwy_table_attach_adjbar(table, row, _("_Soft threshold:"), _("RMS"),
+                            controls.threshold_low, GWY_HSCALE_LINEAR);
     g_signal_connect(controls.threshold_low, "value-changed",
                      G_CALLBACK(scars_mark_dialog_update_thresholds),
                      &controls);
@@ -361,7 +385,7 @@ scars_mark_dialog(ScarsArgs *args,
     label = gtk_label_new(_("Scars type:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     group = gwy_radio_buttons_create(types, G_N_ELEMENTS(types),
@@ -369,7 +393,7 @@ scars_mark_dialog(ScarsArgs *args,
     controls.type = group;
     while (group) {
         gtk_table_attach(GTK_TABLE(table), GTK_WIDGET(group->data),
-                         0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         g_signal_connect_swapped(group->data, "toggled",
                                  G_CALLBACK(scars_invalidate), &controls);
         group = g_slist_next(group);
@@ -378,16 +402,27 @@ scars_mark_dialog(ScarsArgs *args,
 
     controls.color_button = create_mask_color_button(controls.mydata, dialog,
                                                      0);
-    gwy_table_attach_hscale(table, row, _("_Mask color:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Mask color:"), NULL,
                             GTK_OBJECT(controls.color_button),
                             GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
+    if (existing_mask) {
+        create_mask_merge_buttons(table, row, NULL,
+                                  args->combine,
+                                  G_CALLBACK(scars_invalidate),
+                                  args->combine_type,
+                                  G_CALLBACK(scars_invalidate),
+                                  &controls,
+                                  &controls.combine, &controls.combine_type);
+        row++;
+    }
+
     controls.update = gtk_check_button_new_with_mnemonic(_("I_nstant updates"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.update),
                                  args->update);
     gtk_table_attach(GTK_TABLE(table), controls.update,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.update, "toggled",
                              G_CALLBACK(update_change_cb), &controls);
     row++;
@@ -455,7 +490,7 @@ scars_mark_dialog(ScarsArgs *args,
     }
     else {
         g_object_unref(controls.mydata);
-        run_noninteractive(args, data, dfield, mquark);
+        run_noninteractive(args, data, dfield, existing_mask, mquark);
     }
 
     gwy_app_channel_log_add(data, id, id, "proc::scars_remove",
@@ -508,6 +543,12 @@ scars_mark_dialog_update_controls(ScarsControls *controls,
     gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->max_width),
                              args->max_width);
     gwy_radio_buttons_set_current(controls->type, args->type);
+    if (controls->combine) {
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->combine),
+                                     args->combine);
+        gwy_radio_buttons_set_current(controls->combine_type,
+                                      args->combine_type);
+    }
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->update),
                                  args->update);
 }
@@ -523,6 +564,12 @@ scars_mark_dialog_update_values(ScarsControls *controls,
     args->min_len = gwy_adjustment_get_int(controls->min_len);
     args->max_width = gwy_adjustment_get_int(controls->max_width);
     args->type = gwy_radio_buttons_get_current(controls->type);
+    if (controls->combine) {
+        args->combine
+            = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(controls->combine));
+        args->combine_type
+            = gwy_radio_buttons_get_current(controls->combine_type);
+    }
     args->update
         = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(controls->update));
 }
@@ -557,7 +604,7 @@ static void
 preview(ScarsControls *controls,
         ScarsArgs *args)
 {
-    GwyDataField *mask, *dfield;
+    GwyDataField *mask, *dfield, *existing_mask = NULL;
 
     dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata,
                                                              "/0/data"));
@@ -570,6 +617,15 @@ preview(ScarsControls *controls,
     }
     gwy_data_field_copy(dfield, mask, FALSE);
     mark_scars(dfield, mask, args);
+
+    gwy_container_gis_object_by_name(controls->mydata, "/1/mask",
+                                     &existing_mask);
+    if (existing_mask && args->combine) {
+        if (args->combine_type == GWY_MERGE_UNION)
+            gwy_data_field_grains_add(mask, existing_mask);
+        else if (args->combine_type == GWY_MERGE_INTERSECTION)
+            gwy_data_field_grains_intersect(mask, existing_mask);
+    }
     gwy_data_field_data_changed(mask);
 
     controls->computed = TRUE;
diff --git a/modules/process/semsim.c b/modules/process/semsim.c
index 276274b..7ad25c2 100644
--- a/modules/process/semsim.c
+++ b/modules/process/semsim.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: semsim.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: semsim.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -117,12 +117,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Simple SEM image simulation from topography."),
     "Yeti <yeti at gwyddion.net>",
-    "1.0",
+    "1.1",
     "David Nečas (Yeti)",
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, semsim)
 
 static gboolean
 module_register(void)
@@ -215,7 +215,7 @@ semsim_dialog(SEMsimArgs *args, GwyDataField *dfield)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(6, 4, FALSE);
+    table = gtk_table_new(6, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -224,8 +224,8 @@ semsim_dialog(SEMsimArgs *args, GwyDataField *dfield)
     row = 0;
 
     controls.sigma = gtk_adjustment_new(args->sigma, 0.5, MAX_SIZE, 0.1, 10, 0);
-    gwy_table_attach_hscale(table, row++, _("_Integration radius:"), "px",
-                            controls.sigma, GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(table, row++, _("_Integration radius:"), _("px"),
+                            controls.sigma, GWY_HSCALE_DEFAULT);
     g_signal_connect_swapped(controls.sigma, "value-changed",
                              G_CALLBACK(sigma_changed), &controls);
     row++;
@@ -233,7 +233,7 @@ semsim_dialog(SEMsimArgs *args, GwyDataField *dfield)
     controls.value_sigma = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(controls.value_sigma), 1.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), controls.value_sigma,
-                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     1, 2, row, row+1, GTK_FILL, 0, 0, 0);
 
     controls.format_sigma
         = gwy_data_field_get_value_format_xy(dfield,
@@ -243,13 +243,13 @@ semsim_dialog(SEMsimArgs *args, GwyDataField *dfield)
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_label_set_markup(GTK_LABEL(label), controls.format_sigma->units);
     gtk_table_attach(GTK_TABLE(table), label,
-                     3, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     label = gtk_label_new(_("Method:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.method
@@ -261,11 +261,11 @@ semsim_dialog(SEMsimArgs *args, GwyDataField *dfield)
                                     SEMSIM_METHOD_MONTECARLO,
                                     NULL);
     row = gwy_radio_buttons_attach_to_table(controls.method, GTK_TABLE(table),
-                                            3, row);
+                                            2, row);
 
     controls.quality = gtk_adjustment_new(args->quality, 1.0, 7.0, 0.1, 1.0, 0);
-    gwy_table_attach_hscale(table, row++, _("_Quality:"), NULL,
-                            controls.quality, GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(table, row++, _("_Quality:"), NULL,
+                            controls.quality, GWY_HSCALE_DEFAULT);
     g_signal_connect_swapped(controls.quality, "value-changed",
                              G_CALLBACK(quality_changed), &controls);
     row++;
diff --git a/modules/process/shade.c b/modules/process/shade.c
index 1582c94..1d18c68 100644
--- a/modules/process/shade.c
+++ b/modules/process/shade.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: shade.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: shade.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -53,31 +53,33 @@ typedef struct {
     gboolean in_update;
 } ShadeControls;
 
-static gboolean    module_register              (void);
-static void        shade                        (GwyContainer *data,
-                                                 GwyRunType run);
-static gboolean    shade_dialog                 (ShadeArgs *args,
-                                                 GwyContainer *data,
-                                                 GwyDataField *dfield,
-                                                 gint id);
-static void        shade_changed_cb             (GtkWidget *shader,
-                                                 ShadeControls *controls);
-static void        theta_changed_cb             (GtkObject *adj,
-                                                 ShadeControls *controls);
-static void        phi_changed_cb               (GtkObject *adj,
-                                                 ShadeControls *controls);
-static void        mix_changed_cb               (ShadeControls *controls);
-static void        shade_dialog_update          (ShadeControls *controls,
-                                                 ShadeArgs *args);
-static void        shade_mix_with_plane         (GwyDataField *shaded,
-                                                 GwyDataField *plane,
-                                                 gdouble mixpercent);
-static void        load_args                    (GwyContainer *container,
-                                                 ShadeArgs *args);
-static void        save_args                    (GwyContainer *container,
-                                                 ShadeArgs *args);
-static void        sanitize_args                (ShadeArgs *args);
-
+static gboolean module_register     (void);
+static void     shade               (GwyContainer *data,
+                                     GwyRunType run);
+static gboolean shade_dialog        (ShadeArgs *args,
+                                     GwyContainer *data,
+                                     GwyDataField *dfield,
+                                     gint id);
+static void     shade_changed       (GtkWidget *shader,
+                                     ShadeControls *controls);
+static void     theta_changed       (GtkAdjustment *adj,
+                                     ShadeControls *controls);
+static void     phi_changed         (GtkAdjustment *adj,
+                                     ShadeControls *controls);
+static void     mix_changed         (GtkAdjustment *adj,
+                                     ShadeControls *controls);
+static void     do_mix_changed      (GtkToggleButton *toggle,
+                                     ShadeControls *controls);
+static void     shade_dialog_update (ShadeControls *controls,
+                                     ShadeArgs *args);
+static void     shade_mix_with_plane(GwyDataField *shaded,
+                                     GwyDataField *plane,
+                                     gdouble mixpercent);
+static void     load_args           (GwyContainer *container,
+                                     ShadeArgs *args);
+static void     save_args           (GwyContainer *container,
+                                     ShadeArgs *args);
+static void     sanitize_args       (ShadeArgs *args);
 
 static const ShadeArgs shade_defaults = {
     0,
@@ -91,12 +93,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Creates a shaded presentation of data."),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "2.5",
+    "2.6",
     "David Nečas (Yeti) & Petr Klapetek",
     "2003",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, shade)
 
 static gboolean
 module_register(void)
@@ -142,7 +144,7 @@ shade(GwyContainer *data, GwyRunType run)
     gwy_app_undo_qcheckpointv(data, 1, &squark);
     if (!shadefield) {
         shadefield = gwy_data_field_new_alike(dfield, FALSE);
-        siunit = gwy_si_unit_new("");
+        siunit = gwy_si_unit_new(NULL);
         gwy_data_field_set_si_unit_z(shadefield, siunit);
         g_object_unref(siunit);
         gwy_container_set_object(data, squark, shadefield);
@@ -195,7 +197,7 @@ shade_dialog(ShadeArgs *args,
              GwyDataField *dfield,
              gint id)
 {
-    GtkWidget *dialog, *hbox, *table;
+    GtkWidget *dialog, *hbox, *table, *align;
     const guchar *pal;
     ShadeControls controls;
     gint response, row;
@@ -212,63 +214,61 @@ shade_dialog(ShadeArgs *args,
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    hbox = gtk_hbox_new(FALSE, 8);
+    align = gtk_alignment_new(0.5, 0.5, 1.0, 1.0);
+    gtk_alignment_set_padding(GTK_ALIGNMENT(align), 4, 4, 4, 4);
+    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
+                       align, FALSE, FALSE, 0);
+
+    controls.data_view = create_preview(controls.data, 0, PREVIEW_SIZE, FALSE);
+    gtk_container_add(GTK_CONTAINER(align), controls.data_view);
+    g_object_unref(controls.data);
+
+    hbox = gtk_hbox_new(FALSE, 12);
     gtk_container_set_border_width(GTK_CONTAINER(hbox), 4);
     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 4);
 
-    table = gtk_table_new(3, 3, FALSE);
-    gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 0);
-    row = 0;
-
     pal = NULL;
     gwy_container_gis_string_by_name(controls.data, "/0/base/palette", &pal);
     controls.shader = gwy_shader_new(pal);
     gwy_shader_set_angle(GWY_SHADER(controls.shader), args->theta, args->phi);
-    gtk_widget_set_size_request(controls.shader, 72, 72);
+    gtk_widget_set_size_request(controls.shader, 80, 80);
     g_signal_connect(controls.shader, "angle_changed",
-                     G_CALLBACK(shade_changed_cb), &controls);
-    gtk_table_attach(GTK_TABLE(table), controls.shader, 0, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 2, 2);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
-    row++;
+                     G_CALLBACK(shade_changed), &controls);
+    gtk_box_pack_start(GTK_BOX(hbox), controls.shader, FALSE, TRUE, 0);
+
+    table = gtk_table_new(3, 3, FALSE);
+    gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 0);
+    row = 0;
 
     controls.theta = gtk_adjustment_new(args->theta*180.0/G_PI,
                                         0.0, 90.0, 1.0, 15.0, 0.0);
-    gwy_table_attach_hscale(table, row, _("θ:"), _("deg"),
-                            controls.theta, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("θ:"), _("deg"),
+                            controls.theta, GWY_HSCALE_LINEAR);
     g_signal_connect(controls.theta, "value-changed",
-                     G_CALLBACK(theta_changed_cb), &controls);
+                     G_CALLBACK(theta_changed), &controls);
     row++;
 
     controls.phi = gtk_adjustment_new(args->phi*180.0/G_PI,
                                       0.0, 360.0, 1.0, 30.0, 0.0);
-    gwy_table_attach_hscale(table, row, _("φ:"), _("deg"),
-                            controls.phi, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("φ:"), _("deg"),
+                            controls.phi, GWY_HSCALE_LINEAR);
     g_signal_connect(controls.phi, "value-changed",
-                     G_CALLBACK(phi_changed_cb), &controls);
+                     G_CALLBACK(phi_changed), &controls);
     row++;
 
     controls.mix = gtk_adjustment_new(args->mix, 0.0, 100.0, 1, 5, 0);
+    gwy_table_attach_adjbar(table, row, _("_Mix:"), "%",
+                            controls.mix, GWY_HSCALE_LINEAR | GWY_HSCALE_CHECK);
+    g_signal_connect(controls.mix, "value-changed",
+                     G_CALLBACK(mix_changed), &controls);
 
-    gwy_table_attach_hscale(table, row, _("_Mix:"), "%",
-                            controls.mix, GWY_HSCALE_CHECK);
-
-    controls.do_mix = g_object_get_data(G_OBJECT(controls.mix), "check");
-
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.do_mix),
-                                 !args->do_mix);
+    controls.do_mix = gwy_table_hscale_get_check(controls.mix);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.do_mix),
                                  args->do_mix);
-    g_signal_connect_swapped(controls.mix, "value-changed",
-                             G_CALLBACK(mix_changed_cb), &controls);
-
-    g_signal_connect_swapped(controls.do_mix, "toggled",
-                             G_CALLBACK(mix_changed_cb), &controls);
+    g_signal_connect(controls.do_mix, "toggled",
+                     G_CALLBACK(do_mix_changed), &controls);
 
     row++;
-    controls.data_view = create_preview(controls.data, 0, PREVIEW_SIZE, FALSE);
-    g_object_unref(controls.data);
-    gtk_box_pack_start(GTK_BOX(hbox), controls.data_view, FALSE, FALSE, 8);
 
     controls.in_update = FALSE;
     shade_dialog_update(&controls, args);
@@ -291,8 +291,6 @@ shade_dialog(ShadeArgs *args,
             *args = shade_defaults;
             gtk_adjustment_set_value(GTK_ADJUSTMENT(controls.mix), args->mix);
             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.do_mix),
-                                         !args->do_mix);
-            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.do_mix),
                                          args->do_mix);
             gwy_shader_set_angle(GWY_SHADER(controls.shader),
                                  args->theta, args->phi);
@@ -310,16 +308,14 @@ shade_dialog(ShadeArgs *args,
 }
 
 static void
-shade_changed_cb(GtkWidget *shader,
-                 ShadeControls *controls)
+shade_changed(GtkWidget *shader, ShadeControls *controls)
 {
-    ShadeArgs *args;
+    ShadeArgs *args = controls->args;
 
     if (controls->in_update)
         return;
 
     controls->in_update = TRUE;
-    args = controls->args;
     args->theta = gwy_shader_get_theta(GWY_SHADER(shader));
     args->phi = gwy_shader_get_phi(GWY_SHADER(shader));
     gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->theta),
@@ -331,16 +327,14 @@ shade_changed_cb(GtkWidget *shader,
 }
 
 static void
-theta_changed_cb(GtkObject *adj,
-                 ShadeControls *controls)
+theta_changed(GtkAdjustment *adj, ShadeControls *controls)
 {
-    ShadeArgs *args;
+    ShadeArgs *args = controls->args;
 
     if (controls->in_update)
         return;
 
     controls->in_update = TRUE;
-    args = controls->args;
     args->theta = gtk_adjustment_get_value(GTK_ADJUSTMENT(adj))/180.0*G_PI;
     gwy_shader_set_theta(GWY_SHADER(controls->shader), args->theta);
     shade_dialog_update(controls, args);
@@ -348,43 +342,50 @@ theta_changed_cb(GtkObject *adj,
 }
 
 static void
-phi_changed_cb(GtkObject *adj,
-               ShadeControls *controls)
+phi_changed(GtkAdjustment *adj, ShadeControls *controls)
 {
-    ShadeArgs *args;
+    ShadeArgs *args = controls->args;
 
     if (controls->in_update)
         return;
 
     controls->in_update = TRUE;
-    args = controls->args;
-    args->phi = gtk_adjustment_get_value(GTK_ADJUSTMENT(adj))/180.0*G_PI;
+    args->phi = gtk_adjustment_get_value(adj)/180.0*G_PI;
     gwy_shader_set_phi(GWY_SHADER(controls->shader), args->phi);
     shade_dialog_update(controls, args);
     controls->in_update = FALSE;
 }
 
 static void
-mix_changed_cb(ShadeControls *controls)
+mix_changed(GtkAdjustment *adj, ShadeControls *controls)
 {
-    ShadeArgs *args;
+    ShadeArgs *args = controls->args;
 
     if (controls->in_update)
         return;
 
     controls->in_update = TRUE;
-    args = controls->args;
-    args->mix = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->mix));
-    args->do_mix = gtk_toggle_button_get_active(
-                                         GTK_TOGGLE_BUTTON(controls->do_mix));
+    args->mix = gtk_adjustment_get_value(adj);
     shade_dialog_update(controls, args);
     controls->in_update = FALSE;
 }
 
+static void
+do_mix_changed(GtkToggleButton *toggle, ShadeControls *controls)
+{
+    ShadeArgs *args = controls->args;
+
+    if (controls->in_update)
+        return;
+
+    controls->in_update = TRUE;
+    args->do_mix = gtk_toggle_button_get_active(toggle);
+    shade_dialog_update(controls, args);
+    controls->in_update = FALSE;
+}
 
 static void
-shade_dialog_update(ShadeControls *controls,
-                    ShadeArgs *args)
+shade_dialog_update(ShadeControls *controls, ShadeArgs *args)
 {
     GwyDataField *dfield, *shader;
 
@@ -394,9 +395,8 @@ shade_dialog_update(ShadeControls *controls,
                                                              "/0/data"));
     gwy_data_field_shade(dfield, shader, args->theta, args->phi);
 
-    if (args->do_mix) {
+    if (args->do_mix)
         shade_mix_with_plane(shader, dfield, args->mix);
-    }
 
     gwy_data_field_data_changed(shader);
 }
@@ -410,7 +410,7 @@ shade_mix_with_plane(GwyDataField *shaded,
     gdouble plane_min, plane_max, shade_min, shade_max;
     gdouble plane_range, shade_range;
 
-    mixpercent /= 100;
+    mixpercent /= 100.0;
 
     gwy_data_field_get_min_max(plane, &plane_min, &plane_max);
     gwy_data_field_get_min_max(shaded, &shade_min, &shade_max);
@@ -424,7 +424,6 @@ shade_mix_with_plane(GwyDataField *shaded,
     gwy_data_field_sum_fields(shaded, shaded, mix);
 
     g_object_unref(mix);
-
 }
 
 static const gchar theta_key[]  = "/module/shade/theta";
diff --git a/modules/process/slope_dist.c b/modules/process/slope_dist.c
index 2a8789f..f32eaef 100644
--- a/modules/process/slope_dist.c
+++ b/modules/process/slope_dist.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: slope_dist.c 18626 2016-04-22 10:15:13Z yeti-dn $
+ *  @(#) $Id: slope_dist.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -72,7 +72,6 @@ typedef struct {
     GtkWidget *update;
     GtkObject *kernel_size;
     GtkWidget *target_graph;
-    GtkWidget *target_hbox;
     GSList *masking;
 
     GwyDataField *dfield;
@@ -161,12 +160,12 @@ static GwyModuleInfo module_info = {
     N_("Calculates one- or two-dimensional distribution of slopes "
        "or graph of their angular distribution."),
     "Yeti <yeti at gwyddion.net>",
-    "2.2",
+    "2.3",
     "David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, slope_dist)
 
 static gboolean
 module_register(void)
@@ -255,7 +254,7 @@ slope_dialog(SlopeArgs *args, gboolean same_units,
         { N_("_Inclination (θ) graph"),        SLOPE_DIST_GRAPH_THETA,    },
         { N_("Inclination (gra_dient) graph"), SLOPE_DIST_GRAPH_GRADIENT, },
     };
-    GtkWidget *dialog, *table, *label, *hbox, *hbox2, *vbox, *button;
+    GtkWidget *dialog, *table, *label, *hbox, *vbox, *button;
     GwyDataChooser *chooser;
     GwyGraphModel *gmodel;
     SlopeControls controls;
@@ -308,12 +307,13 @@ slope_dialog(SlopeArgs *args, gboolean same_units,
     set_graph_model_units(gmodel, dfield, args->output_type);
     controls.graph = gwy_graph_new(gmodel);
     gtk_widget_set_size_request(controls.graph, PREVIEW_SIZE, -1);
+    gwy_graph_enable_user_input(GWY_GRAPH(controls.graph), FALSE);
     g_object_unref(gmodel);
     gtk_box_pack_start(GTK_BOX(vbox), controls.graph, TRUE, TRUE, 0);
     if (args->output_type == SLOPE_DIST_2D_DIST)
         gtk_widget_set_no_show_all(controls.graph, TRUE);
 
-    table = gtk_table_new(11 + (mfield ? 4 : 0), 4, FALSE);
+    table = gtk_table_new(11 + (mfield ? 4 : 0), 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -323,7 +323,7 @@ slope_dialog(SlopeArgs *args, gboolean same_units,
     label = gtk_label_new(_("Output type:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.output_type
@@ -332,7 +332,7 @@ slope_dialog(SlopeArgs *args, gboolean same_units,
                                    &controls,
                                    args->output_type);
     row = gwy_radio_buttons_attach_to_table(controls.output_type,
-                                            GTK_TABLE(table), 4, row);
+                                            GTK_TABLE(table), 2, row);
     if (!same_units) {
         GtkWidget *radio;
 
@@ -342,14 +342,6 @@ slope_dialog(SlopeArgs *args, gboolean same_units,
     }
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
-    controls.target_hbox = hbox2 = gtk_hbox_new(FALSE, 6);
-    gtk_table_attach(GTK_TABLE(table), hbox2,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    label = gtk_label_new_with_mnemonic(_("Target _graph:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
-
     controls.target_graph = gwy_data_chooser_new_graphs();
     chooser = GWY_DATA_CHOOSER(controls.target_graph);
     gwy_data_chooser_set_none(chooser, _("New graph"));
@@ -357,8 +349,8 @@ slope_dialog(SlopeArgs *args, gboolean same_units,
     gwy_data_chooser_set_filter(chooser, filter_target_graphs, &controls, NULL);
     gwy_data_chooser_set_active_id(chooser, &args->target_graph);
     gwy_data_chooser_get_active_id(chooser, &args->target_graph);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.target_graph);
-    gtk_box_pack_end(GTK_BOX(hbox2), controls.target_graph, FALSE, FALSE, 0);
+    gwy_table_attach_adjbar(table, row, _("Target _graph:"), NULL,
+                            GTK_OBJECT(chooser), GWY_HSCALE_WIDGET_NO_EXPAND);
     g_signal_connect_swapped(controls.target_graph, "changed",
                              G_CALLBACK(target_graph_changed), &controls);
     row++;
@@ -366,11 +358,11 @@ slope_dialog(SlopeArgs *args, gboolean same_units,
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     label = gwy_label_new_header(_("Options"));
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.size = gtk_adjustment_new(args->size, 10, MAX_OUT_SIZE, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("Output _size:"), "px",
+    gwy_table_attach_adjbar(table, row, _("Output _size:"), _("px"),
                             controls.size, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.size, "value-changed",
                              G_CALLBACK(size_changed), &controls);
@@ -381,7 +373,7 @@ slope_dialog(SlopeArgs *args, gboolean same_units,
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.logscale),
                                  args->logscale);
     gtk_table_attach(GTK_TABLE(table), controls.logscale,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.logscale, "toggled",
                              G_CALLBACK(logscale_changed), &controls);
     row++;
@@ -391,15 +383,16 @@ slope_dialog(SlopeArgs *args, gboolean same_units,
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.fit_plane),
                                  args->fit_plane);
     gtk_table_attach(GTK_TABLE(table), controls.fit_plane,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.fit_plane, "toggled",
                              G_CALLBACK(fit_plane_changed), &controls);
     row++;
 
     controls.kernel_size = gtk_adjustment_new(args->kernel_size,
                                               2, 16, 1, 4, 0);
-    gwy_table_attach_hscale(table, row, _("_Plane size:"), "px",
-                            controls.kernel_size, 0);
+    gwy_table_attach_adjbar(table, row, _("_Plane size:"), _("px"),
+                            controls.kernel_size,
+                            GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(controls.kernel_size, "value-changed",
                              G_CALLBACK(kernel_size_changed), &controls);
     row++;
@@ -408,7 +401,7 @@ slope_dialog(SlopeArgs *args, gboolean same_units,
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.update),
                                  args->update);
     gtk_table_attach(GTK_TABLE(table), controls.update,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.update, "toggled",
                              G_CALLBACK(update_changed), &controls);
     row++;
@@ -417,7 +410,7 @@ slope_dialog(SlopeArgs *args, gboolean same_units,
         gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
         label = gwy_label_new_header(_("Masking Mode"));
         gtk_table_attach(GTK_TABLE(table), label,
-                        0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                        0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
 
         controls.masking
@@ -425,7 +418,7 @@ slope_dialog(SlopeArgs *args, gboolean same_units,
                                        G_CALLBACK(masking_changed), &controls,
                                        args->masking);
         row = gwy_radio_buttons_attach_to_table(controls.masking,
-                                                GTK_TABLE(table), 3, row);
+                                                GTK_TABLE(table), 2, row);
     }
     else
         controls.masking = NULL;
@@ -531,7 +524,8 @@ output_type_changed(GtkToggleButton *button, SlopeControls *controls)
     otype = gwy_radio_buttons_get_current(controls->output_type);
     controls->args->output_type = otype;
     gtk_widget_set_sensitive(controls->logscale, otype == SLOPE_DIST_2D_DIST);
-    gtk_widget_set_sensitive(controls->target_hbox, otype != SLOPE_DIST_2D_DIST);
+    gwy_table_hscale_set_sensitive(GTK_OBJECT(controls->target_graph),
+                                   otype != SLOPE_DIST_2D_DIST);
     if (otype == SLOPE_DIST_2D_DIST) {
         gtk_widget_set_no_show_all(controls->graph, TRUE);
         gtk_widget_set_no_show_all(controls->view, FALSE);
diff --git a/modules/process/sphere-revolve.c b/modules/process/sphere-revolve.c
index b5bbf45..666f38d 100644
--- a/modules/process/sphere-revolve.c
+++ b/modules/process/sphere-revolve.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: sphere-revolve.c 19044 2016-10-08 19:10:46Z yeti-dn $
- *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: sphere-revolve.c 20013 2017-07-03 12:01:55Z yeti-dn $
+ *  Copyright (C) 2004-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -20,12 +20,13 @@
  */
 
 #include "config.h"
-#include <libgwyddion/gwymacros.h>
 #include <string.h>
 #include <gtk/gtk.h>
+#include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
 #include <libprocess/stats.h>
 #include <libprocess/arithmetic.h>
+#include <libprocess/filters.h>
 #include <libgwydgets/gwydgetutils.h>
 #include <libgwydgets/gwyradiobuttons.h>
 #include <libgwymodule/gwymodule-process.h>
@@ -38,16 +39,16 @@ typedef enum {
     SPHREV_HORIZONTAL = 1,
     SPHREV_VERTICAL,
     SPHREV_BOTH
-} Sphrev1DDirection;
+} SphrevDirection;
 
 typedef struct {
-    Sphrev1DDirection direction;
     gdouble size;
     gboolean do_extract;
+    SphrevDirection direction;  /* only in 1D */
     /* interface only */
     GwySIValueFormat *valform;
     gdouble pixelsize;
-} Sphrev1DArgs;
+} SphrevArgs;
 
 typedef struct {
     GSList *direction;
@@ -55,38 +56,51 @@ typedef struct {
     GtkObject *size;
     GtkWidget *do_extract;
     gboolean in_update;
-} Sphrev1DControls;
-
-static gboolean      module_register           (void);
-static void          sphrev                    (GwyContainer *data,
-                                                GwyRunType run);
-static GwyDataField* sphrev_horizontal         (Sphrev1DArgs *args,
-                                                GwyDataField *dfield);
-static GwyDataField* sphrev_vertical           (Sphrev1DArgs *args,
-                                                GwyDataField *dfield);
-static GwyDataLine*  sphrev_make_sphere        (gdouble radius,
-                                                gint maxres);
-static gboolean      sphrev_dialog             (Sphrev1DArgs *args);
-static void          direction_changed_cb      (GtkWidget *radio,
-                                                Sphrev1DArgs *args);
-static void          radius_changed_cb         (GtkAdjustment *adj,
-                                                Sphrev1DArgs *args);
-static void          size_changed_cb           (GtkAdjustment *adj,
-                                                Sphrev1DArgs *args);
-static void          do_extract_changed_cb     (GtkWidget *check,
-                                                Sphrev1DArgs *args);
-static void          sphrev_dialog_update      (Sphrev1DControls *controls,
-                                                Sphrev1DArgs *args);
-static void          sphrev_sanitize_args      (Sphrev1DArgs *args);
-static void          sphrev_load_args          (GwyContainer *container,
-                                                Sphrev1DArgs *args);
-static void          sphrev_save_args          (GwyContainer *container,
-                                                Sphrev1DArgs *args);
-
-static const Sphrev1DArgs sphrev_defaults = {
-    SPHREV_HORIZONTAL,
+} SphrevControls;
+
+static gboolean      module_register     (void);
+static void          arcrev              (GwyContainer *data,
+                                          GwyRunType run);
+static void          sphrev              (GwyContainer *data,
+                                          GwyRunType run);
+static gboolean      sphrev_dialog       (SphrevArgs *args,
+                                          gboolean is_2d);
+static void          direction_changed   (GtkWidget *radio,
+                                          SphrevArgs *args);
+static void          radius_changed      (GtkAdjustment *adj,
+                                          SphrevArgs *args);
+static void          size_changed        (GtkAdjustment *adj,
+                                          SphrevArgs *args);
+static void          do_extract_changed  (GtkWidget *check,
+                                          SphrevArgs *args);
+static void          sphrev_dialog_update(SphrevControls *controls,
+                                          SphrevArgs *args);
+static GwyDataField* arcrev_horizontal   (SphrevArgs *args,
+                                          GwyDataField *dfield);
+static GwyDataField* arcrev_vertical     (SphrevArgs *args,
+                                          GwyDataField *dfield);
+static GwyDataLine*  arcrev_make_arc     (gdouble radius,
+                                          gint maxres);
+static GwyDataField* sphrev_make_sphere  (gdouble radius,
+                                          gint maxres);
+static GwyDataField* sphrev_2d           (SphrevArgs *args,
+                                          GwyDataField *dfield,
+                                          GwySetMessageFunc set_message,
+                                          GwySetFractionFunc set_fraction);
+static void          sphrev_sanitize_args(SphrevArgs *args);
+static void          arcrev_load_args    (GwyContainer *container,
+                                          SphrevArgs *args);
+static void          arcrev_save_args    (GwyContainer *container,
+                                          SphrevArgs *args);
+static void          sphrev_load_args    (GwyContainer *container,
+                                          SphrevArgs *args);
+static void          sphrev_save_args    (GwyContainer *container,
+                                          SphrevArgs *args);
+
+static const SphrevArgs sphrev_defaults = {
     20,
     FALSE,
+    SPHREV_HORIZONTAL,
     NULL,
     0,
 };
@@ -96,34 +110,40 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Subtracts background by arc or sphere revolution."),
     "Yeti <yeti at gwyddion.net>",
-    "1.6",
+    "2.0",
     "David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, sphere_revolve)
 
 static gboolean
 module_register(void)
 {
-    /* The name mismatch is intentional, there should be a sphere_revolve
-     * function too */
     gwy_process_func_register("arc_revolve",
-                              (GwyProcessFunc)&sphrev,
+                              (GwyProcessFunc)&arcrev,
                               N_("/_Level/Revolve _Arc..."),
                               NULL,
                               SPHREV_RUN_MODES,
                               GWY_MENU_FLAG_DATA,
                               N_("Level data by arc revolution"));
+    gwy_process_func_register("sphere_revolve",
+                              (GwyProcessFunc)&sphrev,
+                              N_("/_Level/Revolve _Sphere..."),
+                              NULL,
+                              SPHREV_RUN_MODES,
+                              GWY_MENU_FLAG_DATA,
+                              N_("Level data by sphere revolution"));
 
     return TRUE;
 }
 
 static void
-sphrev(GwyContainer *data, GwyRunType run)
+arcrev(GwyContainer *data, GwyRunType run)
 {
     GwyDataField *dfield, *background = NULL;
-    Sphrev1DArgs args;
+    GwyContainer *settings;
+    SphrevArgs args;
     gint oldid, newid;
     GQuark dquark;
     gdouble xr, yr;
@@ -136,7 +156,8 @@ sphrev(GwyContainer *data, GwyRunType run)
                                      0);
     g_return_if_fail(dfield && dquark);
 
-    sphrev_load_args(gwy_app_settings_get(), &args);
+    settings = gwy_app_settings_get();
+    arcrev_load_args(settings, &args);
 
     /* FIXME: this is bogus for non-square pixels anyway */
     xr = gwy_data_field_get_xreal(dfield)/gwy_data_field_get_xres(dfield);
@@ -150,8 +171,8 @@ sphrev(GwyContainer *data, GwyRunType run)
               args.valform->units);
 
     if (run == GWY_RUN_INTERACTIVE) {
-        ok = sphrev_dialog(&args);
-        sphrev_save_args(gwy_app_settings_get(), &args);
+        ok = sphrev_dialog(&args, FALSE);
+        arcrev_save_args(settings, &args);
     }
 
     gwy_si_unit_value_format_free(args.valform);
@@ -161,18 +182,18 @@ sphrev(GwyContainer *data, GwyRunType run)
     gwy_app_undo_qcheckpointv(data, 1, &dquark);
     switch (args.direction) {
         case SPHREV_HORIZONTAL:
-        background = sphrev_horizontal(&args, dfield);
+        background = arcrev_horizontal(&args, dfield);
         break;
 
         case SPHREV_VERTICAL:
-        background = sphrev_vertical(&args, dfield);
+        background = arcrev_vertical(&args, dfield);
         break;
 
         case SPHREV_BOTH: {
             GwyDataField *tmp;
 
-            background = sphrev_horizontal(&args, dfield);
-            tmp = sphrev_vertical(&args, dfield);
+            background = arcrev_horizontal(&args, dfield);
+            tmp = arcrev_vertical(&args, dfield);
             gwy_data_field_sum_fields(background, background, tmp);
             g_object_unref(tmp);
             gwy_data_field_multiply(background, 0.5);
@@ -201,20 +222,98 @@ sphrev(GwyContainer *data, GwyRunType run)
     gwy_app_channel_log_add(data, oldid, newid, NULL, NULL);
 }
 
+static void
+sphrev(GwyContainer *data, GwyRunType run)
+{
+    GwyDataField *dfield, *background = NULL;
+    GtkWindow *window;
+    GwyContainer *settings;
+    SphrevArgs args;
+    gint oldid, newid;
+    GQuark dquark;
+    gdouble xr, yr;
+    gboolean ok = TRUE;
+
+    g_return_if_fail(run & SPHREV_RUN_MODES);
+    gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &dfield,
+                                     GWY_APP_DATA_FIELD_KEY, &dquark,
+                                     GWY_APP_DATA_FIELD_ID, &oldid,
+                                     0);
+    g_return_if_fail(dfield && dquark);
+
+    settings = gwy_app_settings_get();
+    sphrev_load_args(settings, &args);
+
+    /* FIXME: this is bogus for non-square pixels anyway */
+    xr = gwy_data_field_get_xreal(dfield)/gwy_data_field_get_xres(dfield);
+    yr = gwy_data_field_get_yreal(dfield)/gwy_data_field_get_yres(dfield);
+    args.pixelsize = hypot(xr, yr);
+    args.valform
+        = gwy_data_field_get_value_format_xy(dfield,
+                                             GWY_SI_UNIT_FORMAT_VFMARKUP, NULL);
+    gwy_debug("pixelsize = %g, vf = (%g, %d, %s)",
+              args.pixelsize, args.valform->magnitude, args.valform->precision,
+              args.valform->units);
+
+    if (run == GWY_RUN_INTERACTIVE) {
+        ok = sphrev_dialog(&args, TRUE);
+        sphrev_save_args(settings, &args);
+    }
+
+    gwy_si_unit_value_format_free(args.valform);
+    if (!ok)
+        return;
+
+    window = gwy_app_find_window_for_channel(data, oldid);
+    if (window) {
+        gwy_app_wait_start(window, _("Initializing..."));
+        background = sphrev_2d(&args, dfield,
+                               gwy_app_wait_set_message,
+                               gwy_app_wait_set_fraction);
+        gwy_app_wait_finish();
+        if (!background)
+            return;
+    }
+    else
+        background = sphrev_2d(&args, dfield, NULL, NULL);
+
+    gwy_app_undo_qcheckpointv(data, 1, &dquark);
+    gwy_data_field_subtract_fields(dfield, dfield, background);
+    gwy_data_field_data_changed(dfield);
+    gwy_app_channel_log_add_proc(data, oldid, oldid);
+
+    if (!args.do_extract) {
+        g_object_unref(background);
+        return;
+    }
+
+    newid = gwy_app_data_browser_add_data_field(background, data, TRUE);
+    g_object_unref(background);
+    gwy_app_sync_data_items(data, data, oldid, newid, FALSE,
+                            GWY_DATA_ITEM_GRADIENT,
+                            0);
+    gwy_app_set_data_field_title(data, newid, _("Background"));
+    gwy_app_channel_log_add(data, oldid, newid, NULL, NULL);
+}
+
 static gboolean
-sphrev_dialog(Sphrev1DArgs *args)
+sphrev_dialog(SphrevArgs *args, gboolean is_2d)
 {
     const GwyEnum directions[] = {
         { N_("_Horizontal direction"), SPHREV_HORIZONTAL, },
         { N_("_Vertical direction"),   SPHREV_VERTICAL,   },
         { N_("_Both directions"),      SPHREV_BOTH,   },
     };
-    GtkWidget *dialog, *table, *spin;
-    Sphrev1DControls controls;
+    GtkWidget *dialog, *table, *spin, *label;
+    SphrevControls controls;
     gint response, row;
+    const gchar *title;
     gdouble q;
 
-    dialog = gtk_dialog_new_with_buttons(_("Revolve Arc"), NULL, 0,
+    gwy_clear(&controls, 1);
+
+    title = is_2d ? _("Revolve Sphere") : _("Revolve Arc");
+    dialog = gtk_dialog_new_with_buttons(title, NULL, 0,
                                          _("_Reset"), RESPONSE_RESET,
                                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                          GTK_STOCK_OK, GTK_RESPONSE_OK,
@@ -222,7 +321,7 @@ sphrev_dialog(Sphrev1DArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(5, 4, FALSE);
+    table = gtk_table_new(3 + 4*(!is_2d), 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -233,40 +332,49 @@ sphrev_dialog(Sphrev1DArgs *args)
 
     q = args->pixelsize/args->valform->magnitude;
     gwy_debug("q = %f", q);
-    controls.radius = gtk_adjustment_new(q*args->size, q, 16384*q, q, 10*q, 0);
-    spin = gwy_table_attach_hscale(table, row, _("Real _radius:"),
+    controls.radius = gtk_adjustment_new(q*args->size, q, 1024*q, q, 10*q, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("Real _radius:"),
                                    args->valform->units, controls.radius,
                                    GWY_HSCALE_SQRT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), args->valform->precision);
     g_object_set_data(G_OBJECT(controls.radius), "controls", &controls);
     g_signal_connect(controls.radius, "value-changed",
-                     G_CALLBACK(radius_changed_cb), args);
+                     G_CALLBACK(radius_changed), args);
     row++;
 
-    controls.size = gtk_adjustment_new(args->size, 1, 16384, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("_Pixel radius:"), "px",
-                            controls.size, GWY_HSCALE_SQRT);
+    controls.size = gtk_adjustment_new(args->size, 1, 1024, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("_Pixel radius:"), _("px"),
+                            controls.size, GWY_HSCALE_SQRT | GWY_HSCALE_SNAP);
     g_object_set_data(G_OBJECT(controls.size), "controls", &controls);
     g_signal_connect(controls.size, "value-changed",
-                     G_CALLBACK(size_changed_cb), args);
+                     G_CALLBACK(size_changed), args);
     row++;
 
-    controls.direction
-        = gwy_radio_buttons_create(directions, G_N_ELEMENTS(directions),
-                                   G_CALLBACK(direction_changed_cb), args,
-                                   args->direction);
-    row = gwy_radio_buttons_attach_to_table(controls.direction,
-                                            GTK_TABLE(table), 4, row);
+    if (!is_2d) {
+        gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+        label = gtk_label_new(_("Direction:"));
+        gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+        gtk_table_attach(GTK_TABLE(table), label,
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+        row++;
+
+        controls.direction
+            = gwy_radio_buttons_create(directions, G_N_ELEMENTS(directions),
+                                       G_CALLBACK(direction_changed), args,
+                                       args->direction);
+        row = gwy_radio_buttons_attach_to_table(controls.direction,
+                                                GTK_TABLE(table), 2, row);
+    }
 
-    row += 3;
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     controls.do_extract
         = gtk_check_button_new_with_mnemonic(_("E_xtract background"));
     gtk_table_attach(GTK_TABLE(table), controls.do_extract,
-                     0, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.do_extract),
                                  args->do_extract);
     g_signal_connect(controls.do_extract, "toggled",
-                     G_CALLBACK(do_extract_changed_cb), args);
+                     G_CALLBACK(do_extract_changed), args);
     row++;
 
     controls.in_update = FALSE;
@@ -304,8 +412,7 @@ sphrev_dialog(Sphrev1DArgs *args)
 }
 
 static void
-direction_changed_cb(GtkWidget *radio,
-                     Sphrev1DArgs *args)
+direction_changed(GtkWidget *radio, SphrevArgs *args)
 {
     if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio)))
         return;
@@ -314,10 +421,9 @@ direction_changed_cb(GtkWidget *radio,
 }
 
 static void
-radius_changed_cb(GtkAdjustment *adj,
-                  Sphrev1DArgs *args)
+radius_changed(GtkAdjustment *adj, SphrevArgs *args)
 {
-    Sphrev1DControls *controls;
+    SphrevControls *controls;
 
     controls = g_object_get_data(G_OBJECT(adj), "controls");
     if (controls->in_update)
@@ -331,10 +437,9 @@ radius_changed_cb(GtkAdjustment *adj,
 }
 
 static void
-size_changed_cb(GtkAdjustment *adj,
-                Sphrev1DArgs *args)
+size_changed(GtkAdjustment *adj, SphrevArgs *args)
 {
-    Sphrev1DControls *controls;
+    SphrevControls *controls;
 
     controls = g_object_get_data(G_OBJECT(adj), "controls");
     if (controls->in_update)
@@ -347,21 +452,20 @@ size_changed_cb(GtkAdjustment *adj,
 }
 
 static void
-do_extract_changed_cb(GtkWidget *check,
-                      Sphrev1DArgs *args)
+do_extract_changed(GtkWidget *check, SphrevArgs *args)
 {
     args->do_extract = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check));
 }
 
 static void
-sphrev_dialog_update(Sphrev1DControls *controls,
-                     Sphrev1DArgs *args)
+sphrev_dialog_update(SphrevControls *controls, SphrevArgs *args)
 {
     gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->radius),
                              args->size
                              * args->pixelsize/args->valform->magnitude);
     gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->size), args->size);
-    gwy_radio_buttons_set_current(controls->direction, args->direction);
+    if (controls->direction)
+        gwy_radio_buttons_set_current(controls->direction, args->direction);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->do_extract),
                                  args->do_extract);
 }
@@ -369,7 +473,7 @@ sphrev_dialog_update(Sphrev1DControls *controls,
 /* An efficient summing algorithm.  Although I'm author of this code, don't
  * ask me how it works... */
 static void
-moving_sums(gint res, gdouble *row, gdouble *buffer, gint size)
+moving_sums(gint res, const gdouble *row, gdouble *buffer, gint size)
 {
     gdouble *sum, *sum2;
     gint i, ls2, rs2;
@@ -427,27 +531,27 @@ moving_sums(gint res, gdouble *row, gdouble *buffer, gint size)
 }
 
 static GwyDataField*
-sphrev_horizontal(Sphrev1DArgs *args,
-                  GwyDataField *dfield)
+arcrev_horizontal(SphrevArgs *args, GwyDataField *dfield)
 {
     GwyDataField *rfield;
     GwyDataLine *sphere;
-    gdouble *data, *rdata, *sphdata, *sum, *sum2, *weight, *tmp;
+    gdouble *rdata, *sphdata, *sum, *sum2, *weight, *tmp;
+    const gdouble *data;
     gdouble q;
     gint i, j, k, size, xres, yres;
 
-    data = gwy_data_field_get_data(dfield);
+    data = gwy_data_field_get_data_const(dfield);
     rfield = gwy_data_field_duplicate(dfield);
     xres = gwy_data_field_get_xres(rfield);
     yres = gwy_data_field_get_yres(rfield);
     rdata = gwy_data_field_get_data(rfield);
 
     q = gwy_data_field_get_rms(dfield)/sqrt(2.0/3.0 - G_PI/16.0);
-    sphere = sphrev_make_sphere(args->size, gwy_data_field_get_xres(dfield));
+    sphere = arcrev_make_arc(args->size, gwy_data_field_get_xres(dfield));
 
     /* Scale-freeing.
      * Data is normalized to have the same RMS as if it was composed from
-     * spheres of radius args->radius.  Actually we normalize the sphere
+     * arcs of radius args->radius.  Actually we normalize the sphere
      * instead, but the effect is the same.  */
     gwy_data_line_multiply(sphere, -q);
     sphdata = gwy_data_line_get_data(sphere);
@@ -465,8 +569,8 @@ sphrev_horizontal(Sphrev1DArgs *args,
     gwy_assign(weight, sum, xres);
 
     for (i = 0; i < yres; i++) {
+        const gdouble *drow = data + i*xres;
         gdouble *rrow = rdata + i*xres;
-        gdouble *drow = data + i*xres;
 
         /* Kill data that stick down too much */
         moving_sums(xres, data + i*xres, sum, size);
@@ -489,8 +593,9 @@ sphrev_horizontal(Sphrev1DArgs *args,
             to = MIN(j+size, xres-1) - j;
             min = G_MAXDOUBLE;
             for (k = from; k <= to; k++) {
-                if (-(sphdata[size+k] - row[k]) < min)
-                    min = -(sphdata[size+k] - row[k]);
+                gdouble d = -sphdata[size+k] + row[k];
+                if (d < min)
+                    min = d;
             }
             rrow[j] = min;
         }
@@ -503,100 +608,172 @@ sphrev_horizontal(Sphrev1DArgs *args,
 }
 
 static GwyDataField*
-sphrev_vertical(Sphrev1DArgs *args,
-                GwyDataField *dfield)
+arcrev_vertical(SphrevArgs *args, GwyDataField *dfield)
 {
-    GwyDataField *rfield;
-    GwyDataLine *sphere;
-    gdouble *data, *rdata, *sphdata, *sum, *sum2, *weight, *tmp;
+    GwyDataField *result, *flipped;
+
+    flipped = gwy_data_field_new_alike(dfield, FALSE);
+    gwy_data_field_flip_xy(dfield, flipped, FALSE);
+    result = arcrev_horizontal(args, flipped);
+    gwy_data_field_flip_xy(result, flipped, FALSE);
+    g_object_unref(result);
+
+    return flipped;
+}
+
+static GwyDataLine*
+arcrev_make_arc(gdouble radius, gint maxres)
+{
+    GwyDataLine *arc;
+    gdouble *data;
+    gint i, size;
+
+    size = GWY_ROUND(MIN(radius, maxres));
+    arc = gwy_data_line_new(2*size+1, 1.0, FALSE);
+    data = gwy_data_line_get_data(arc);
+
+    if (radius/8 > maxres) {
+        /* Pathological case: very flat sphere */
+        for (i = 0; i <= size; i++) {
+            gdouble u = i/radius;
+
+            data[size+i] = data[size-i] = u*u/2.0*(1.0 + u*u/4.0*(1 + u*u/2.0));
+        }
+    }
+    else {
+        /* Normal sphere */
+        for (i = 0; i <= size; i++) {
+            gdouble u = i/radius;
+
+            if (G_UNLIKELY(u > 1.0))
+                data[size+i] = data[size-i] = 1.0;
+            else
+                data[size+i] = data[size-i] = 1.0 - sqrt(1.0 - u*u);
+        }
+    }
+
+    return arc;
+}
+
+static GwyDataField*
+sphrev_2d(SphrevArgs *args, GwyDataField *dfield,
+          GwySetMessageFunc set_message, GwySetFractionFunc set_fraction)
+{
+    GwyDataField *meanfield, *rmsfield, *rfield, *sphere;
+    gdouble *rdata, *sphdata, *tmp;
+    gint i, j, ii, jj, sres, size, xres, yres, sc;
     gdouble q;
-    gint i, j, k, size, xres, yres;
+    gboolean ok = FALSE;
 
-    data = gwy_data_field_get_data(dfield);
     rfield = gwy_data_field_duplicate(dfield);
     xres = gwy_data_field_get_xres(rfield);
     yres = gwy_data_field_get_yres(rfield);
     rdata = gwy_data_field_get_data(rfield);
 
-    q = gwy_data_field_get_rms(dfield)/sqrt(2.0/3.0 - G_PI/16.0);
-    sphere = sphrev_make_sphere(args->size, gwy_data_field_get_yres(dfield));
+    q = gwy_data_field_get_rms(dfield)/sqrt(5.0/6.0);
+    sphere = sphrev_make_sphere(args->size, gwy_data_field_get_xres(dfield));
 
     /* Scale-freeing.
      * Data is normalized to have the same RMS as if it was composed from
      * spheres of radius args->radius.  Actually we normalize the sphere
      * instead, but the effect is the same.  */
-    gwy_data_line_multiply(sphere, -q);
-    sphdata = gwy_data_line_get_data(sphere);
-    size = gwy_data_line_get_res(sphere)/2;
+    gwy_data_field_multiply(sphere, -q);
+    sphdata = gwy_data_field_get_data(sphere);
+    sres = gwy_data_field_get_xres(sphere);
+    size = sres/2;
+    sc = size*sres + size;
 
-    sum = g_new(gdouble, 4*yres);
-    sum2 = sum + yres;
-    weight = sum + 2*yres;
-    tmp = sum + 3*yres;
+    meanfield = gwy_data_field_duplicate(dfield);
+    rmsfield = gwy_data_field_duplicate(dfield);
+    /* XXX: 1D apparently uses size/2 here.  Not sure why, mimic it. */
+    gwy_data_field_filter_mean(meanfield, size/2);
+    gwy_data_field_filter_rms(rmsfield, size/2);
 
-    /* Weights for RMS filter.  The xresl-proof way is to sum 1's. */
-    for (j = 0; j < yres; j++)
-        weight[j] = 1.0;
-    moving_sums(yres, weight, sum, size);
-    gwy_assign(weight, sum, yres);
+    /* Transform mean value data to avg - 2.5*rms for outlier cut-off.
+     * Allows using rmsfield as a scratch buffer for the trimmed data. */
+    gwy_data_field_multiply(rmsfield, 2.5);
+    gwy_data_field_subtract_fields(meanfield, meanfield, rmsfield);
 
-    for (i = 0; i < xres; i++) {
-        gdouble *rcol = rdata + i;
-        gdouble *dcol = data + i;
+    gwy_data_field_max_of_fields(rmsfield, meanfield, dfield);
 
-        /* Kill data that stick down too much */
-        for (j = 0; j < yres; j++)
-            tmp[j] = dcol[j*xres];
-        moving_sums(yres, tmp, sum, size);
-        for (j = 0; j < yres; j++) {
-            /* transform to avg - 2.5*rms */
-            sum[j] = sum[j]/weight[j];
-            sum2[j] = 2.5*sqrt(sum2[j]/weight[j] - sum[j]*sum[j]);
-            sum[j] -= sum2[j];
-        }
-        for (j = 0; j < yres; j++)
-            tmp[j] = MAX(dcol[j*xres], sum[j]);
+    if (set_message && !set_message(_("Revolving sphere...")))
+        goto finish;
 
-        /* Find the touching point */
-        for (j = 0; j < yres; j++) {
-            gdouble *col = tmp + j;
-            gint from, to;
+    tmp = gwy_data_field_get_data(rmsfield);
+
+    for (i = 0; i < yres; i++) {
+        gint ifrom, ito;
+
+        ifrom = MAX(0, i-size) - i;
+        ito = MIN(i+size, yres-1) - i;
+        for (j = 0; j < xres; j++) {
+            gint jfrom, jto;
             gdouble min;
 
-            from = MAX(0, j-size) - j;
-            to = MIN(j+size, yres-1) - j;
+            jfrom = MAX(0, j-size) - j;
+            jto = MIN(j+size, xres-1) - j;
+
+            /* Find the touching point */
             min = G_MAXDOUBLE;
-            for (k = from; k <= to; k++) {
-                if (-(sphdata[size+k] - col[k]) < min)
-                    min = -(sphdata[size+k] - col[k]);
+            for (ii = ifrom; ii <= ito; ii++) {
+                const gdouble *srow = sphdata + (sc + ii*sres + jfrom);
+                const gdouble *drow = tmp + ((i + ii)*xres + j + jfrom);
+
+                for (jj = jto+1 - jfrom; jj; jj--, srow++, drow++) {
+                    gdouble s = *srow, d = *drow;
+
+                    if (s >= -q) {
+                        d -= s;
+                        if (d < min)
+                            min = d;
+                    }
+                }
             }
-            rcol[j*xres] = min;
+            rdata[i*xres + j] = min;
         }
+        if (set_fraction && !set_fraction((i + 1.0)/yres))
+            goto finish;
     }
 
-    g_free(sum);
+    ok = TRUE;
+
+finish:
+    g_object_unref(rmsfield);
+    g_object_unref(meanfield);
     g_object_unref(sphere);
 
+    if (!ok)
+        GWY_OBJECT_UNREF(rfield);
+
     return rfield;
 }
 
-static GwyDataLine*
+static GwyDataField*
 sphrev_make_sphere(gdouble radius, gint maxres)
 {
-    GwyDataLine *dline;
+    GwyDataField *sphere;
     gdouble *data;
-    gint i, size;
+    gint i, j, size, res, sc;
 
     size = GWY_ROUND(MIN(radius, maxres));
-    dline = gwy_data_line_new(2*size+1, 1.0, FALSE);
-    data = gwy_data_line_get_data(dline);
+    res = 2*size + 1;
+    sphere = gwy_data_field_new(res, res, 1.0, 1.0, FALSE);
+    data = gwy_data_field_get_data(sphere);
+    sc = size*res + size;
 
     if (radius/8 > maxres) {
         /* Pathological case: very flat sphere */
         for (i = 0; i <= size; i++) {
             gdouble u = i/radius;
 
-            data[size+i] = data[size-i] = u*u/2.0*(1.0 + u*u/4.0*(1 + u*u/2.0));
+            for (j = 0; j <= size; j++) {
+                gdouble v = j/radius;
+                gdouble r2 = u*u + v*v;
+                gdouble z = r2/2.0*(1.0 + r2/4.0*(1 + r2/2.0));
+
+                data[sc - res*i - j] = data[sc - res*i + j] = z;
+                data[sc + res*i - j] = data[sc + res*i + j] = z;
+            }
         }
     }
     else {
@@ -604,48 +781,74 @@ sphrev_make_sphere(gdouble radius, gint maxres)
         for (i = 0; i <= size; i++) {
             gdouble u = i/radius;
 
-            if (G_UNLIKELY(u > 1.0))
-                data[size+i] = data[size-i] = 1.0;
-            else
-                data[size+i] = data[size-i] = 1.0 - sqrt(1.0 - u*u);
+            for (j = 0; j <= size; j++) {
+                gdouble v = j/radius;
+                gdouble r2 = u*u + v*v;
+                gdouble z = r2 > 1.0 ? 2.0 : 1.0 - sqrt(1.0 - r2);
+
+                data[sc - res*i - j] = data[sc - res*i + j] = z;
+                data[sc + res*i - j] = data[sc + res*i + j] = z;
+            }
         }
     }
 
-    return dline;
+    return sphere;
 }
 
-static const gchar radius_key[]     = "/module/arc_revolve/radius";
-static const gchar direction_key[]  = "/module/arc_revolve/direction";
-static const gchar do_extract_key[] = "/module/arc_revolve/do_extract";
+static const gchar arc_radius_key[]     = "/module/arc_revolve/radius";
+static const gchar arc_direction_key[]  = "/module/arc_revolve/direction";
+static const gchar arc_do_extract_key[] = "/module/arc_revolve/do_extract";
+
+static const gchar sph_radius_key[]     = "/module/sphere_revolve/radius";
+static const gchar sph_do_extract_key[] = "/module/sphere_revolve/do_extract";
 
 static void
-sphrev_sanitize_args(Sphrev1DArgs *args)
+sphrev_sanitize_args(SphrevArgs *args)
 {
-    args->size = CLAMP(args->size, 1, 16384);
+    args->size = CLAMP(args->size, 1, 1024);
     args->direction = CLAMP(args->direction, SPHREV_HORIZONTAL, SPHREV_BOTH);
     args->do_extract = !!args->do_extract;
 }
 
 static void
-sphrev_load_args(GwyContainer *container,
-                 Sphrev1DArgs *args)
+arcrev_load_args(GwyContainer *container, SphrevArgs *args)
+{
+    *args = sphrev_defaults;
+
+    gwy_container_gis_double_by_name(container, arc_radius_key, &args->size);
+    gwy_container_gis_enum_by_name(container, arc_direction_key,
+                                   &args->direction);
+    gwy_container_gis_boolean_by_name(container, arc_do_extract_key,
+                                      &args->do_extract);
+    sphrev_sanitize_args(args);
+}
+
+static void
+arcrev_save_args(GwyContainer *container, SphrevArgs *args)
+{
+    gwy_container_set_double_by_name(container, arc_radius_key, args->size);
+    gwy_container_set_enum_by_name(container, arc_direction_key,
+                                   args->direction);
+    gwy_container_set_boolean_by_name(container, arc_do_extract_key,
+                                      args->do_extract);
+}
+
+static void
+sphrev_load_args(GwyContainer *container, SphrevArgs *args)
 {
     *args = sphrev_defaults;
 
-    gwy_container_gis_double_by_name(container, radius_key, &args->size);
-    gwy_container_gis_enum_by_name(container, direction_key, &args->direction);
-    gwy_container_gis_boolean_by_name(container, do_extract_key,
+    gwy_container_gis_double_by_name(container, sph_radius_key, &args->size);
+    gwy_container_gis_boolean_by_name(container, sph_do_extract_key,
                                       &args->do_extract);
     sphrev_sanitize_args(args);
 }
 
 static void
-sphrev_save_args(GwyContainer *container,
-                 Sphrev1DArgs *args)
+sphrev_save_args(GwyContainer *container, SphrevArgs *args)
 {
-    gwy_container_set_double_by_name(container, radius_key, args->size);
-    gwy_container_set_enum_by_name(container, direction_key, args->direction);
-    gwy_container_set_boolean_by_name(container, do_extract_key,
+    gwy_container_set_double_by_name(container, sph_radius_key, args->size);
+    gwy_container_set_boolean_by_name(container, sph_do_extract_key,
                                       args->do_extract);
 }
 
diff --git a/modules/process/stitch.c b/modules/process/stitch.c
new file mode 100644
index 0000000..bb694d5
--- /dev/null
+++ b/modules/process/stitch.c
@@ -0,0 +1,800 @@
+/*
+ *  @(#) $Id: stitch.c 20293 2017-08-15 14:14:17Z yeti-dn $
+ *  Copyright (C) 2017 David Necas (Yeti), Petr Klapetek, Petr Grolich.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, pgrolich at cmi.cz.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <string.h>
+#include <glib/gstdio.h>
+#include <gtk/gtk.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libgwyddion/gwyexpr.h>
+#include <libprocess/arithmetic.h>
+#include <libprocess/stats.h>
+#include <libprocess/filters.h>
+#include <libgwydgets/gwystock.h>
+#include <libgwydgets/gwyradiobuttons.h>
+#include <libgwymodule/gwymodule-process.h>
+#include <app/gwyapp.h>
+#include <app/gwymoduleutils.h>
+#include "preview.h"
+
+#define STITCH_RUN_MODES GWY_RUN_INTERACTIVE
+
+enum {
+    NARGS = 8,
+    USER_UNITS_ID = G_MAXINT,
+};
+
+enum {
+    SENS_EXPR_OK = 1 << 0,
+    SENS_USERUINTS = 1 << 1
+};
+
+enum {
+    STITCH_VALUE,
+    STITCH_MASK,
+    STITCH_DER_X,
+    STITCH_DER_Y,
+    STITCH_NVARS,
+};
+
+enum {
+    STITCH_NARGS = NARGS * STITCH_NVARS + 2  /* 2 for x and y */
+};
+
+enum {
+    STITCH_OK      = 0,
+    STITCH_DATA    = 1,
+};
+
+typedef GwyDataField* (*MakeFieldFunc)(GwyDataField *dfield);
+
+typedef struct {
+    guint err;
+    GwyAppDataId objects[NARGS];
+    gint nobjects_in_chooser;
+    gint choosers[NARGS];
+    gint toggle_buttons[NARGS];
+    gdouble xoffset[NARGS];
+    gdouble yoffset[NARGS];
+    gdouble zoffset[NARGS];
+    gboolean instant_update;
+    gboolean initialized;
+    GwySIValueFormat *format;
+} StitchArgs;
+
+typedef struct {
+    StitchArgs *args;
+    GtkWidget *dialog;
+    GtkWidget *view;
+    GtkWidget *choosers[NARGS];
+    GtkWidget *toggle_buttons[NARGS];
+    GtkWidget *push_buttons[NARGS];
+    GtkObject *xoffset[NARGS];
+    GtkWidget *xoffset_spin[NARGS];
+    GtkObject *yoffset[NARGS];
+    GtkWidget *yoffset_spin[NARGS];
+    GtkObject *zoffset[NARGS];
+    GtkWidget *zoffset_spin[NARGS];
+    GtkWidget *instant_update;
+    GwyContainer *mydata;
+} StitchControls;
+
+static gboolean      module_register        (void);
+static void          stitch                 (GwyContainer *data,
+                                             GwyRunType run);
+static void          stitch_load_args       (GwyContainer *settings,
+                                            StitchArgs *args);
+static void          stitch_save_args       (GwyContainer *settings,
+                                             StitchArgs *args);
+static gboolean      stitch_dialog          (GwyContainer *data,
+                                             gint id,
+                                             StitchArgs *args);
+static void          stitch_data_chosen     (GwyDataChooser *chooser,
+                                             StitchControls *controls);
+static void          stitch_data_checked    (StitchControls *controls);
+static void          stitch_offset_changed  (StitchControls *controls);
+static void          stitch_restore_offset  (GtkWidget *button,
+                                             StitchControls *controls);
+static void          stitch_instant_update_changed(GtkToggleButton *check,
+                                                   StitchControls *controls);
+static void          stitch_show_sensitive  (StitchControls *controls);
+static void          stitch_preview         (StitchControls *controls);
+static GwyDataField* stitch_do              (StitchArgs *args);
+static void          get_object_ids         (GwyContainer *container,
+                                             gpointer *obsolete);
+static void          stitch_format_value    (StitchControls *controls,
+                                             GtkAdjustment *adjustment,
+                                             gdouble value);
+static void          update_data_from_controls(StitchControls *controls);
+
+
+static const gchar instant_update_key[] = "/module/stitch/instant_update";
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION,
+    &module_register,
+    N_("Stitch multiple images based on offsets of origins."),
+    "Petr Grolich <pgrolich.cmi.cz>",
+    "1.1",
+    "Petr Klapetek & Petr Grolich",
+    "2017",
+};
+
+GWY_MODULE_QUERY2(module_info, stitch)
+
+static gboolean
+module_register(void)
+{
+    gwy_process_func_register("stitch",
+                              (GwyProcessFunc)&stitch,
+                              N_("/M_ultidata/_Stitch..."),
+                              NULL,
+                              STITCH_RUN_MODES,
+                              GWY_MENU_FLAG_DATA,
+                              N_("Stitch images using offsets"));
+
+    return TRUE;
+}
+
+static gboolean
+stitch_chooser_filter(GwyContainer *data,
+                      gint id,
+                      gpointer user_data)
+{
+    GwyAppDataId *object = (GwyAppDataId*)user_data;
+    GwyDataField *op1, *op2;
+    GQuark quark;
+
+    quark = gwy_app_get_data_key_for_id(id);
+    op1 = GWY_DATA_FIELD(gwy_container_get_object(data, quark));
+
+    data = gwy_app_data_browser_get(object->datano);
+    quark = gwy_app_get_data_key_for_id(object->id);
+    op2 = GWY_DATA_FIELD(gwy_container_get_object(data, quark));
+
+    return !gwy_data_field_check_compatibility(op1, op2,
+                                               GWY_DATA_COMPATIBILITY_MEASURE);
+}
+
+static void
+get_object_ids(GwyContainer *container, gpointer *data)
+{
+    gint *ids;
+    guint i;
+    StitchArgs *args = (StitchArgs*)data;
+
+    if (args->nobjects_in_chooser > NARGS)
+        return;
+
+    ids = gwy_app_data_browser_get_data_ids(container);
+    for (i = 0; ids[i] >= 0; i++) {
+        args->objects[args->nobjects_in_chooser].id = ids[i];
+        args->objects[args->nobjects_in_chooser].datano
+            = gwy_app_data_browser_get_number(container);
+        args->nobjects_in_chooser++;
+    }
+    g_free(ids);
+}
+
+static void
+stitch_format_value(StitchControls *controls,
+                    GtkAdjustment *adjustment,
+                    gdouble value)
+{
+    gtk_adjustment_set_value(adjustment,
+                             value / controls->args->format->magnitude);
+}
+
+void
+stitch(GwyContainer *data, GwyRunType run)
+{
+    StitchArgs args;
+    GwyContainer *settings;
+    gboolean dorun;
+    gint datano, id, newid;
+
+    g_return_if_fail(run & STITCH_RUN_MODES);
+
+    args.nobjects_in_chooser = 0;
+    gwy_app_data_browser_foreach((GwyAppDataForeachFunc)get_object_ids, &args);
+
+    gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD_ID, &id,
+                                     GWY_APP_CONTAINER_ID, &datano,
+                                     0);
+
+    settings = gwy_app_settings_get();
+    stitch_load_args(settings, &args);
+
+    dorun = stitch_dialog(data, id, &args);
+    stitch_save_args(settings, &args);
+    if (dorun) {
+        GwyDataField *result = stitch_do(&args);
+
+        newid = gwy_app_data_browser_add_data_field(result, data, TRUE);
+        g_object_unref(result);
+        gwy_app_set_data_field_title(data, newid, _("Calculated"));
+        gwy_app_sync_data_items(data, data, id, newid, FALSE,
+                                GWY_DATA_ITEM_GRADIENT,
+                                GWY_DATA_ITEM_REAL_SQUARE,
+                                0);
+        gwy_app_channel_log_add_proc(data, -1, newid);
+    }
+
+    gwy_si_unit_value_format_free(args.format);
+}
+
+static gboolean
+stitch_dialog(GwyContainer *container, gint id, StitchArgs *args)
+{
+    GQuark quark;
+    GwyContainer *data;
+    GtkTooltips *tooltips;
+    StitchControls controls;
+    gint i;
+    guint row, response;
+    gboolean is_active;
+    gdouble xoffset, yoffset, zoffset;
+    gchar* title;
+    GwyDataField *dfield_preview, *dfield_current, *dfield;
+    GtkWidget *dialog, *hbox, *vbox, *table, *chooser, *label, *spin;
+    GwyAppDataId* active_object;
+
+    controls.args = args;
+    controls.args->initialized = FALSE;
+
+    gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &dfield_current, 0);
+    controls.args->format = gwy_data_field_get_value_format_xy
+                            (dfield_current, GWY_SI_UNIT_FORMAT_VFMARKUP, NULL);
+    tooltips = gwy_app_get_tooltips();
+
+    dialog = gtk_dialog_new_with_buttons(_("Stitch"), NULL, 0, NULL);
+    controls.dialog = dialog;
+    gtk_dialog_add_action_widget(GTK_DIALOG(dialog),
+                                 gwy_stock_like_button_new(_("_Update"),
+                                                           GTK_STOCK_EXECUTE),
+                                 RESPONSE_PREVIEW);
+    gtk_dialog_add_button(GTK_DIALOG(dialog),
+                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+    gtk_dialog_add_button(GTK_DIALOG(dialog),
+                          GTK_STOCK_OK, GTK_RESPONSE_OK);
+    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
+    gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
+
+    hbox = gtk_hbox_new(FALSE, 2);
+    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox,
+                       FALSE, FALSE, 4);
+
+    vbox = gtk_vbox_new(FALSE, 4);
+    /* Ensure no wild changes of the dialog size due to non-square data. */
+    gtk_widget_set_size_request(vbox, PREVIEW_SIZE, PREVIEW_SIZE);
+    gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 4);
+
+    controls.mydata = gwy_container_new();
+    dfield_preview = gwy_data_field_new(PREVIEW_SIZE, PREVIEW_SIZE,
+                                        1.0, 1.0, TRUE);
+    gwy_container_set_object_by_name(controls.mydata,
+                                     "/0/data", dfield_preview);
+    g_object_unref(dfield_preview);
+    gwy_app_sync_data_items(container, controls.mydata, id, 0, FALSE,
+                            GWY_DATA_ITEM_GRADIENT,
+                            GWY_DATA_ITEM_REAL_SQUARE,
+                            0);
+    controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, FALSE);
+    gtk_box_pack_start(GTK_BOX(vbox), controls.view, FALSE, FALSE, 0);
+    gwy_set_data_preview_size(GWY_DATA_VIEW(controls.view), PREVIEW_SIZE);
+
+    table = gtk_table_new(5 + NARGS, 9, FALSE);
+    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
+    gtk_table_set_col_spacings(GTK_TABLE(table), 6);
+    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
+    gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 4);
+    row = 0;
+
+    label = gtk_label_new(_("Channels"));
+    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+    gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1,
+                     GTK_FILL, 0, 0, 0);
+
+    title = g_strdup_printf("X offset [%s]", controls.args->format->units);
+    label = gtk_label_new(title);
+    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+    gtk_table_attach(GTK_TABLE(table), label, 2, 3, row, row + 1,
+                     GTK_FILL, 0, 0, 0);
+    g_free(title);
+
+    title = g_strdup_printf("Y offset [%s]", controls.args->format->units);
+    label = gtk_label_new(title);
+    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+    gtk_table_attach(GTK_TABLE(table), label, 3, 4, row, row + 1,
+                     GTK_FILL, 0, 0, 0);
+    g_free(title);
+
+    title = g_strdup_printf("Z offset [%s]", controls.args->format->units);
+    label = gtk_label_new(title);
+    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+    gtk_table_attach(GTK_TABLE(table), label, 4, 5, row, row + 1,
+                     GTK_FILL, 0, 0, 0);
+    g_free(title);
+
+    row++;
+
+    for (i = 0; i < NARGS; i++) {
+        chooser = gwy_data_chooser_new_channels();
+        gwy_data_chooser_set_filter(GWY_DATA_CHOOSER(chooser),
+                                    stitch_chooser_filter,
+                                    &args->objects,
+                                    NULL);
+        if (i < args->nobjects_in_chooser) {
+            active_object = args->objects + i;
+            /*gwy_data_chooser_set_active_id(GWY_DATA_CHOOSER(chooser),
+                                           active_object);*/
+        }else {
+            active_object = args->objects + args->nobjects_in_chooser - 1;
+            /*gwy_data_chooser_set_none(GWY_DATA_CHOOSER(chooser), _(""));
+            gwy_data_chooser_set_active(GWY_DATA_CHOOSER(chooser), NULL, 0);*/
+        }
+
+        gwy_data_chooser_set_active_id(GWY_DATA_CHOOSER(chooser),
+                                       active_object);
+
+        g_signal_connect(chooser, "changed",
+                         G_CALLBACK(stitch_data_chosen), &controls);
+        g_object_set_data(G_OBJECT(chooser), "index", GUINT_TO_POINTER(i));
+        gtk_table_attach(GTK_TABLE(table), chooser, 0, 1, row, row+1,
+                         GTK_FILL, 0, 0, 0);
+        gtk_label_set_mnemonic_widget(GTK_LABEL(label), chooser);
+        controls.choosers[i] = chooser;
+
+        controls.toggle_buttons[i] = gtk_check_button_new();
+        is_active = (i < args->nobjects_in_chooser);
+        gtk_toggle_button_set_active
+            (GTK_TOGGLE_BUTTON(controls.toggle_buttons[i]), is_active);
+        args->toggle_buttons[i] = is_active;
+        gtk_tooltips_set_tip
+            (tooltips, controls.toggle_buttons[i], "Stitch data", NULL);
+        gtk_table_attach
+            (GTK_TABLE(table), controls.toggle_buttons[i], 1, 2, row, row+1,
+             0, 0, 0, 0);
+        g_signal_connect_swapped(controls.toggle_buttons[i], "clicked",
+                                 G_CALLBACK(stitch_data_checked),
+                                 &controls);
+
+        data = gwy_app_data_browser_get(active_object->datano);
+
+        xoffset = yoffset = zoffset = 0;
+        if (NULL != data) {
+            quark = gwy_app_get_data_key_for_id(active_object->id);
+            dfield = GWY_DATA_FIELD(gwy_container_get_object(data, quark));
+            xoffset = gwy_data_field_get_xoffset(dfield);
+            yoffset = gwy_data_field_get_yoffset(dfield);
+            zoffset = gwy_data_field_get_avg(dfield);
+        }
+
+        controls.xoffset[i] = gtk_adjustment_new(0, -10000, 10000, 0.1, 1, 0);
+        spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.xoffset[i]), 1, 2);
+        controls.xoffset_spin[i] = spin;
+        gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
+        gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin),
+                                   controls.args->format->precision + 2);
+        g_signal_connect_swapped(controls.xoffset[i], "value-changed",
+                                 G_CALLBACK(stitch_offset_changed), &controls);
+        stitch_format_value(&controls, GTK_ADJUSTMENT(controls.xoffset[i]),
+                            xoffset);
+        gtk_table_attach(GTK_TABLE(table), spin,
+                         2, 3, row, row + 1, GTK_FILL, 0, 0, 0);
+
+
+        args->yoffset[i] = 0;
+        controls.yoffset[i] = gtk_adjustment_new(0, -10000, 10000, 0.1, 1, 0);
+        spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.yoffset[i]), 1, 2);
+        controls.yoffset_spin[i] = spin;
+        gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
+        gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin),
+                                   controls.args->format->precision + 2);
+        g_signal_connect_swapped(controls.yoffset[i], "value-changed",
+                                 G_CALLBACK(stitch_offset_changed), &controls);
+        stitch_format_value(&controls, GTK_ADJUSTMENT(controls.yoffset[i]),
+                            yoffset);
+        gtk_table_attach(GTK_TABLE(table), spin,
+                         3, 4, row, row + 1, GTK_FILL, 0, 0, 0);
+
+        args->zoffset[i] = 0;
+        controls.zoffset[i] = gtk_adjustment_new(0, -10000, 10000, 0.01, 1, 0);
+        spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.zoffset[i]), 1, 2);
+        controls.zoffset_spin[i] = spin;
+        gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
+        gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin),
+                                   controls.args->format->precision + 2);
+        g_signal_connect_swapped(controls.zoffset[i], "value-changed",
+                                 G_CALLBACK(stitch_offset_changed), &controls);
+        stitch_format_value(&controls, GTK_ADJUSTMENT(controls.zoffset[i]),
+                            zoffset);
+        gtk_table_attach(GTK_TABLE(table), spin,
+                         4, 5, row, row + 1, GTK_FILL, 0, 0, 0);
+
+
+        controls.push_buttons[i] = gtk_button_new_with_label(_("Restore"));
+        gtk_table_attach(GTK_TABLE(table), controls.push_buttons[i],
+                         5, 6, row, row + 1, 0, 0, 0, 0);
+        g_signal_connect(controls.push_buttons[i], "clicked",
+                         G_CALLBACK(stitch_restore_offset), &controls);
+
+        row++;
+    }
+
+    controls.instant_update = gtk_check_button_new_with_mnemonic
+                                (_("_Instant updates"));
+    gtk_table_attach(GTK_TABLE(table), controls.instant_update,
+                     0, 3, row, row + 1, GTK_FILL, 0, 0, 0);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.instant_update),
+                                 args->instant_update);
+    g_signal_connect(controls.instant_update, "toggled",
+                     G_CALLBACK(stitch_instant_update_changed),
+                     &controls);
+    row++;
+
+    gtk_widget_show_all(dialog);
+
+    controls.args->err = STITCH_OK;
+    controls.args->initialized = TRUE;
+
+    stitch_show_sensitive(&controls);
+    if (controls.args->instant_update)
+        stitch_preview(&controls);
+
+    do {
+        response = gtk_dialog_run(GTK_DIALOG(dialog));
+        switch (response) {
+            case GTK_RESPONSE_CANCEL:
+            case GTK_RESPONSE_DELETE_EVENT:
+                gtk_widget_destroy(dialog);
+            case GTK_RESPONSE_NONE:
+            return FALSE;
+            break;
+
+            case RESPONSE_PREVIEW:
+                stitch_preview(&controls);
+            break;
+
+            case GTK_RESPONSE_OK:
+            break;
+
+            default:
+            g_assert_not_reached();
+            break;
+        }
+    } while (response != GTK_RESPONSE_OK);
+
+    gtk_widget_destroy(dialog);
+
+    return TRUE;
+}
+
+static void
+stitch_data_chosen(GwyDataChooser *chooser,
+                   StitchControls *controls)
+{
+    gint chooser_index;
+    GQuark quark;
+    GwyContainer *data;
+    GwyDataField *dfield;
+    StitchArgs *args = controls->args;
+
+    for (chooser_index = 0; chooser_index < NARGS; chooser_index++) {
+        if (GWY_DATA_CHOOSER(controls->choosers[chooser_index]) == chooser)
+            break;
+    }
+
+    gwy_data_chooser_get_active_id
+        (GWY_DATA_CHOOSER(controls->choosers[chooser_index]),
+         &args->objects[chooser_index]);
+    data = gwy_app_data_browser_get(args->objects[chooser_index].datano);
+
+    g_return_if_fail(data);
+
+    quark = gwy_app_get_data_key_for_id(args->objects[chooser_index].id);
+    dfield = GWY_DATA_FIELD(gwy_container_get_object(data, quark));
+    stitch_format_value(controls,
+                        GTK_ADJUSTMENT(controls->xoffset[chooser_index]),
+                        gwy_data_field_get_xoffset(dfield));
+    stitch_format_value(controls,
+                        GTK_ADJUSTMENT(controls->yoffset[chooser_index]),
+                        gwy_data_field_get_yoffset(dfield));
+    stitch_format_value(controls,
+                        GTK_ADJUSTMENT(controls->zoffset[chooser_index]),
+                        gwy_data_field_get_avg(dfield));
+}
+
+static void
+stitch_data_checked(StitchControls *controls)
+{
+    gint i, ntoggled = 0;
+    StitchArgs *args = controls->args;
+
+    for (i = 0; i < NARGS; i++) {
+        args->toggle_buttons[i]
+            = gtk_toggle_button_get_active
+              (GTK_TOGGLE_BUTTON(controls->toggle_buttons[i]));
+        if (args->toggle_buttons[i])
+            ntoggled++;
+    }
+
+    if (ntoggled == 0)
+        args->err |= STITCH_DATA;
+    else
+        args->err &= ~STITCH_DATA;
+    stitch_show_sensitive(controls);
+
+    if (controls->args->instant_update)
+        stitch_preview(controls);
+}
+
+static void
+stitch_offset_changed(StitchControls *controls)
+{
+    gint i;
+    if (controls->args->initialized) {
+        for (i = 0; i < NARGS; i++) {
+            controls->args->xoffset[i]
+                = gtk_adjustment_get_value
+                  (GTK_ADJUSTMENT(controls->xoffset[i]));
+            controls->args->yoffset[i]
+                = gtk_adjustment_get_value
+                  (GTK_ADJUSTMENT(controls->yoffset[i]));
+            controls->args->zoffset[i]
+                = gtk_adjustment_get_value
+                  (GTK_ADJUSTMENT(controls->zoffset[i]));
+        }
+
+        if (controls->args->instant_update)
+            stitch_preview(controls);
+    }
+}
+
+static void
+stitch_restore_offset(GtkWidget *button, StitchControls *controls)
+{
+    gint pb_index;
+    GQuark quark;
+    GwyContainer *data;
+    GwyDataField *dfield;
+    StitchArgs *args = controls->args;
+
+    for (pb_index = 0; pb_index < NARGS; pb_index++) {
+        if (controls->push_buttons[pb_index] == button)
+            break;
+    }
+
+    gwy_data_chooser_get_active_id
+        (GWY_DATA_CHOOSER(controls->choosers[pb_index]),
+         &args->objects[pb_index]);
+    data = gwy_app_data_browser_get(args->objects[pb_index].datano);
+
+    g_return_if_fail(data);
+
+    quark = gwy_app_get_data_key_for_id(args->objects[pb_index].id);
+    dfield = GWY_DATA_FIELD(gwy_container_get_object(data, quark));
+    stitch_format_value(controls,
+                        GTK_ADJUSTMENT(controls->xoffset[pb_index]),
+                        gwy_data_field_get_xoffset(dfield));
+    stitch_format_value(controls,
+                        GTK_ADJUSTMENT(controls->yoffset[pb_index]),
+                        gwy_data_field_get_yoffset(dfield));
+    stitch_format_value(controls,
+                        GTK_ADJUSTMENT(controls->zoffset[pb_index]),
+                        gwy_data_field_get_avg(dfield));
+}
+
+static void stitch_instant_update_changed(GtkToggleButton *check,
+                                          StitchControls *controls)
+{
+    controls->args->instant_update = gtk_toggle_button_get_active(check);
+    if (controls->args->instant_update)
+        stitch_preview(controls);
+    stitch_show_sensitive(controls);
+}
+
+static void
+stitch_show_sensitive(StitchControls *controls)
+{
+    StitchArgs *args = controls->args;
+    GtkDialog *dialog = GTK_DIALOG(controls->dialog);
+    gboolean ok, sensitive;
+    gint i;
+
+    for (i = 0; i < NARGS; i++) {
+        controls->args->toggle_buttons[i] = gtk_toggle_button_get_active
+            (GTK_TOGGLE_BUTTON(controls->toggle_buttons[i]));
+        sensitive = args->toggle_buttons[i];
+        gtk_widget_set_sensitive(controls->choosers[i], sensitive);
+        gtk_widget_set_sensitive(controls->xoffset_spin[i], sensitive);
+        gtk_widget_set_sensitive(controls->yoffset_spin[i], sensitive);
+        gtk_widget_set_sensitive(controls->zoffset_spin[i], sensitive);
+        gtk_widget_set_sensitive(controls->push_buttons[i], sensitive);
+    }
+
+    ok = (args->err == STITCH_OK);
+    gtk_dialog_set_response_sensitive(dialog, GTK_RESPONSE_OK, ok);
+    gtk_dialog_set_response_sensitive(dialog, RESPONSE_PREVIEW,
+                                      (ok && !args->instant_update));
+}
+
+static void
+stitch_preview(StitchControls *controls)
+{
+    GwyDataField *result;
+
+    /* We can also get here by activation of the entry so check again. */
+    if (controls->args->err != STITCH_OK) {
+        gwy_container_set_object_by_name(controls->mydata, "/0/data", NULL);
+        return;
+    }
+
+    update_data_from_controls(controls);
+
+    result = stitch_do(controls->args);
+    g_return_if_fail(result);
+
+    gwy_container_set_object_by_name(controls->mydata, "/0/data", result);
+    gwy_data_field_data_changed(result);
+    gwy_set_data_preview_size(GWY_DATA_VIEW(controls->view), PREVIEW_SIZE);
+    g_object_unref(result);
+}
+
+static GwyDataField*
+stitch_do(StitchArgs *args)
+{
+    GQuark quark;
+    GwyContainer *data;
+    GwyDataField *dfield, *df_shift, *result = NULL;
+    gint i;
+    gint xres, yres, nfields, destcol, destrow;
+    gdouble xreal, yreal, left, top, right, bottom, avg, x, y;
+
+    dfield = NULL;
+    xres = yres = nfields = 0;
+    xreal = yreal = left = top = right = bottom = avg = 0.0f;
+
+    for (i = 0; i < NARGS; i++) {
+        if (args->toggle_buttons[i] == 1) {
+            data = gwy_app_data_browser_get(args->objects[i].datano);
+            g_return_val_if_fail(data, NULL);
+
+            quark = gwy_app_get_data_key_for_id(args->objects[i].id);
+            dfield = GWY_DATA_FIELD(gwy_container_get_object(data, quark));
+
+            if (nfields == 0) {
+                left = args->xoffset[i] * args->format->magnitude;
+                top = args->yoffset[i] * args->format->magnitude;
+                right = (args->xoffset[i] * args->format->magnitude)
+                        + gwy_data_field_get_xreal(dfield);
+                bottom = (args->yoffset[i] * args->format->magnitude)
+                        + gwy_data_field_get_yreal(dfield);
+            }else {
+                left = MIN(left, args->xoffset[i] * args->format->magnitude);
+                top = MIN(top, args->yoffset[i] * args->format->magnitude);
+                right = MAX(right,
+                            (args->xoffset[i] * args->format->magnitude)
+                        + gwy_data_field_get_xreal(dfield));
+                bottom = MAX(bottom,
+                            (args->yoffset[i] * args->format->magnitude)
+                        + gwy_data_field_get_yreal(dfield));
+            }
+
+            nfields++;
+        }
+    }
+
+    xreal = right - left;
+    yreal = bottom - top;
+
+    g_return_val_if_fail((xreal > 0) && (yreal > 0) && (nfields > 0)
+                         && (dfield != NULL), NULL);
+
+    xres = (gint)(gwy_data_field_rtoj(dfield, xreal) + 0.5f);
+    yres = (gint)(gwy_data_field_rtoi(dfield, yreal) + 0.5f);
+
+    result = gwy_data_field_new(xres, yres, xreal, yreal, TRUE);
+    gwy_data_field_fill(result, 0);
+
+    for (i = 0; i < NARGS; i++) {
+        if (args->toggle_buttons[i] == 1) {
+            data = gwy_app_data_browser_get(args->objects[i].datano);
+
+            g_return_val_if_fail(data, NULL);
+
+            quark = gwy_app_get_data_key_for_id(args->objects[i].id);
+            dfield = GWY_DATA_FIELD(gwy_container_get_object(data, quark));
+
+            /* shift data to provide consistent data */
+            df_shift = gwy_data_field_duplicate(dfield);
+            avg = args->zoffset[i] * args->format->magnitude;
+            gwy_data_field_add(df_shift, -1.0f * avg);
+
+            x = (args->xoffset[i] * args->format->magnitude) - left;
+            y = (args->yoffset[i] * args->format->magnitude) - top;
+            destcol = (gint)(gwy_data_field_rtoj(df_shift, x) + 0.5f);
+            destrow = (gint)(gwy_data_field_rtoi(df_shift, y) + 0.5f);
+            gwy_data_field_area_copy(df_shift,
+                                     result,
+                                     0,
+                                     0,
+                                     gwy_data_field_get_xres(df_shift),
+                                     gwy_data_field_get_yres(df_shift),
+                                     destcol,
+                                     destrow);
+
+            g_object_unref(df_shift);
+        }
+    }
+
+    return result;
+}
+
+
+static void
+stitch_load_args(GwyContainer *settings,
+                 StitchArgs *args)
+{
+    gint i;
+
+    gwy_container_gis_boolean_by_name(settings, instant_update_key,
+                                      &args->instant_update);
+
+    for (i = 1; i < args->nobjects_in_chooser; i++) {
+        if (!gwy_app_data_id_verify_channel(args->objects + i))
+            args->objects[i] = args->objects[0];
+    }
+}
+
+static void
+stitch_save_args(GwyContainer *settings,
+                 StitchArgs *args)
+{
+    gwy_container_set_boolean_by_name(settings, instant_update_key,
+                                      args->instant_update);
+}
+
+static void
+update_data_from_controls(StitchControls *controls)
+{
+    gint i;
+    StitchArgs *args = controls->args;
+    for (i = 0; i < NARGS; i++) {
+        args->toggle_buttons[i] = gtk_toggle_button_get_active
+            (GTK_TOGGLE_BUTTON(controls->toggle_buttons[i]));
+        gwy_data_chooser_get_active
+            (GWY_DATA_CHOOSER(controls->choosers[i]), &args->choosers[i]);
+
+        args->xoffset[i] = gtk_adjustment_get_value
+            (GTK_ADJUSTMENT(controls->xoffset[i]));
+        args->yoffset[i] = gtk_adjustment_get_value
+            (GTK_ADJUSTMENT(controls->yoffset[i]));
+        args->zoffset[i] = gtk_adjustment_get_value
+            (GTK_ADJUSTMENT(controls->zoffset[i]));
+
+        args->toggle_buttons[i] = gtk_toggle_button_get_active
+            (GTK_TOGGLE_BUTTON(controls->toggle_buttons[i]));
+    }
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/process/straighten_path.c b/modules/process/straighten_path.c
index f85a4f9..9eef0e3 100644
--- a/modules/process/straighten_path.c
+++ b/modules/process/straighten_path.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: straighten_path.c 19044 2016-10-08 19:10:46Z yeti-dn $
- *  Copyright (C) 2016 David Necas (Yeti).
+ *  @(#) $Id: straighten_path.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2016-2017 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -125,12 +125,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Extracts a straightened part of image along a curve."),
     "Yeti <yeti at gwyddion.net>",
-    "1.0",
+    "1.1",
     "David Nečas (Yeti)",
     "2016",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, straighten_path)
 
 static gboolean
 module_register(void)
@@ -230,7 +230,7 @@ straighten_dialogue(StraightenArgs *args,
                             GWY_DATA_ITEM_MASK_COLOR,
                             0);
 
-    table = GTK_TABLE(gtk_table_new(6, 4, FALSE));
+    table = GTK_TABLE(gtk_table_new(6, 3, FALSE));
     gtk_table_set_row_spacings(table, 2);
     gtk_table_set_col_spacings(table, 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -238,13 +238,12 @@ straighten_dialogue(StraightenArgs *args,
     row = 0;
 
     scwin = create_coord_list(&controls);
-    gtk_table_attach(table, scwin, 0, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+    gtk_table_attach(table, scwin, 0, 3, row, row+1,
+                     GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
     row++;
 
     hbox2 = gtk_hbox_new(TRUE, 0);
-    gtk_table_attach(table, hbox2, 0, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, hbox2, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
 
     button = gtk_button_new_with_mnemonic(_("_Reset"));
     gtk_box_pack_start(GTK_BOX(hbox2), button, TRUE, TRUE, 0);
@@ -267,24 +266,26 @@ straighten_dialogue(StraightenArgs *args,
         = gwy_enum_combo_box_new(gwy_interpolation_type_get_enum(), -1,
                                  G_CALLBACK(interpolation_changed), &controls,
                                  args->interp, TRUE);
-    gwy_table_attach_hscale(GTK_WIDGET(table), row,
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row,
                             _("_Interpolation type:"), NULL,
-                            GTK_OBJECT(controls.interp), GWY_HSCALE_WIDGET);
+                            GTK_OBJECT(controls.interp),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     args->thickness = MIN(args->thickness, maxthickness);
     controls.thickness = gtk_adjustment_new(args->thickness, 3.0, maxthickness,
                                             1.0, 10.0, 0.0);
-    gwy_table_attach_hscale(GTK_WIDGET(table), row, _("_Thickness:"), "px",
-                            controls.thickness, GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row, _("_Thickness:"), _("px"),
+                            controls.thickness,
+                            GWY_HSCALE_SQRT | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(controls.thickness, "value-changed",
                              G_CALLBACK(thickness_changed), &controls);
     row++;
 
     controls.slackness = gtk_adjustment_new(args->slackness, 0.0, G_SQRT2,
                                             0.001, 0.1, 0.0);
-    gwy_table_attach_hscale(GTK_WIDGET(table), row, _("_Slackness:"), NULL,
-                            controls.slackness, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row, _("_Slackness:"), NULL,
+                            controls.slackness, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls.slackness, "value-changed",
                              G_CALLBACK(slackness_changed), &controls);
     row++;
@@ -293,7 +294,7 @@ straighten_dialogue(StraightenArgs *args,
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.closed),
                                  args->closed);
     gtk_table_attach(table, controls.closed,
-                     0, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.closed, "toggled",
                              G_CALLBACK(closed_changed), &controls);
     row++;
diff --git a/modules/process/superresolution.c b/modules/process/superresolution.c
index fae0795..6d65ae0 100644
--- a/modules/process/superresolution.c
+++ b/modules/process/superresolution.c
@@ -71,7 +71,7 @@ static void         supres_data_cb        (GwyDataChooser *chooser,
 static void         supres_maybe_preview  (SupresControls *controls);
 static const gchar* supres_check          (SupresArgs *args);
 static void         supres_do             (SupresArgs *args);
-static GwyDataField*       make_superresolution  (GwyDataField *result, 
+static GwyDataField*       make_superresolution  (GwyDataField *result,
                                            GPtrArray *fields,
                                            SupresArgs *args);
 
@@ -88,7 +88,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, superresolution)
 
 static gboolean
 module_register(void)
@@ -156,7 +156,7 @@ supres_dialog(SupresArgs *args)
     label = gtk_label_new(_("Operands:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
     row++;
 
     for (i = 0; i < NARGS; i++) {
@@ -165,7 +165,7 @@ supres_dialog(SupresArgs *args)
         gwy_strkill(args->name[i], "_");
         gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
         gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1,
-                         GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                         GTK_FILL, 0, 0, 0);
 
         chooser = gwy_data_chooser_new_channels();
         gwy_data_chooser_set_active_id(GWY_DATA_CHOOSER(chooser),
@@ -174,23 +174,23 @@ supres_dialog(SupresArgs *args)
                          G_CALLBACK(supres_data_cb), &controls);
         g_object_set_data(G_OBJECT(chooser), "index", GUINT_TO_POINTER(i));
         gtk_table_attach(GTK_TABLE(table), chooser, 1, 2, row, row+1,
-                         GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                         GTK_FILL, 0, 0, 0);
         gtk_label_set_mnemonic_widget(GTK_LABEL(label), chooser);
         controls.data[i] = chooser;
 
         row++;
     }
-    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
 
-    controls.result = label = gtk_label_new("");
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    controls.result = label = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     GTK_FILL, 0, 0, 0);
 
 
     args->err = SUPRES_OK;
     supres_data_cb(controls.data[0], &controls);
-    
+
 
     gtk_widget_show_all(dialog);
     do {
@@ -231,7 +231,6 @@ supres_data_cb(GwyDataChooser *chooser,
         supres_maybe_preview(controls);
 }
 
-
 static void
 supres_maybe_preview(SupresControls *controls)
 {
@@ -375,9 +374,9 @@ typedef struct {
 } SDataPoint;
 
 static gdouble
-get_mean_correlation(GwyDataField *dfield, 
-                     GwyDataField *last, 
-                     gdouble *xmean, 
+get_mean_correlation(GwyDataField *dfield,
+                     GwyDataField *last,
+                     gdouble *xmean,
                      gdouble *ymean,
                      SupresArgs *args
                      )
@@ -393,17 +392,17 @@ get_mean_correlation(GwyDataField *dfield,
 
     newxres = gwy_data_field_get_xres(dfield)/2;
     newyres = gwy_data_field_get_yres(dfield)/2;
-    sm_dfield = gwy_data_field_new_resampled(dfield, 
+    sm_dfield = gwy_data_field_new_resampled(dfield,
                                              newxres,
                                              newyres,
                                              GWY_INTERPOLATION_LINEAR);
-    sm_last = gwy_data_field_new_resampled(last, 
+    sm_last = gwy_data_field_new_resampled(last,
                                              newxres,
                                              newyres,
                                              GWY_INTERPOLATION_LINEAR);
 
-    dfield_kernel = gwy_data_field_area_extract(sm_dfield, 
-                                                newxres/2 - newxres/6, 
+    dfield_kernel = gwy_data_field_area_extract(sm_dfield,
+                                                newxres/2 - newxres/6,
                                                 newyres/2 - newyres/6,
                                                 newxres/3,
                                                 newyres/3);
@@ -442,7 +441,7 @@ get_mean_correlation(GwyDataField *dfield,
                                      -1,
                                      TRUE));
 
-    
+
     *xmean -= newxres/2 - 1;
     *ymean -= newyres/2 - 1;
     g_object_unref(score);
@@ -472,7 +471,7 @@ make_superresolution(GwyDataField *result, GPtrArray *fields, SupresArgs *args)
 
     values = g_array_new(FALSE, FALSE, sizeof(SDataPoint));
     locals = g_array_new(FALSE, FALSE, sizeof(int));
-    
+
     last = GWY_DATA_FIELD(g_ptr_array_index(fields, fields->len - 1));
     xres = gwy_data_field_get_xres(last);
     yres = gwy_data_field_get_yres(last);
@@ -490,13 +489,13 @@ make_superresolution(GwyDataField *result, GPtrArray *fields, SupresArgs *args)
     for (m=0; m<(fields->len - 1); m++)
     {
         dfield = GWY_DATA_FIELD(g_ptr_array_index(fields, m));
-        
+
         /*compute overall correlation for downsampled data center to save time*/
 /*        if (get_mean_correlation(dfield, last, &xmean, &ymean, args) < mean_threshold)
             continue;
 TODO: use this when the rest works well.
             */
-        
+
         /*compute detailed correlation of each point*/
         /*compute crosscorelation */
         data = gwy_app_data_browser_get(args->objects[0].datano);
@@ -528,18 +527,18 @@ TODO: use this when the rest works well.
         scdata = gwy_data_field_get_data(score);
         for (col=5; col<(xres-5); col++) {
             for (row=5; row<(yres-5); row++) {
-               
-                if (scdata[row*xres + col] > local_threshold) 
-                { 
+
+                if (scdata[row*xres + col] > local_threshold)
+                {
                     sdp.xval = col + gwy_data_field_rtoi(dfieldx, xdata[row*xres + col]);
                     sdp.yval = row + gwy_data_field_rtoj(dfieldy, ydata[row*xres + col]);
                     sdp.score = scdata[row*xres + col];
                     sdp.zval = gwy_data_field_get_val(dfield, col, row);
-                    g_array_append_val(values, sdp); 
+                    g_array_append_val(values, sdp);
                 }
             }
         }
-        
+
 
     }
 
@@ -573,8 +572,8 @@ TODO: use this when the rest works well.
             }
             /*compute weighted average TODO in future recalculate also points from grid*/
             if (((col%2) || (row%2)) && locals->len){
-               
-                /*add last image data*/ 
+
+                /*add last image data*/
                 distance = 1.41421356;
                 rdist = 4.0/(distance*distance + 1e-18);
                 weight = rdist;
@@ -584,7 +583,7 @@ TODO: use this when the rest works well.
                 for (m=0; m<locals->len; m++)
                 {
                     pdp = &g_array_index(values, SDataPoint, g_array_index(locals, int, m));
-                    distance = sqrt((2*(pdp->xval) - col)*(2*(pdp->xval) - col) 
+                    distance = sqrt((2*(pdp->xval) - col)*(2*(pdp->xval) - col)
                                  + (2*(pdp->yval) - row)*(2*(pdp->yval) - row));
                     rdist = 1.0/(distance*distance + 1e-18);
                     weight += rdist;
@@ -593,8 +592,8 @@ TODO: use this when the rest works well.
                 gwy_data_field_set_val(result, col, row, sum/weight);
 
             }
-            
-        } 
+
+        }
     }
     gwy_app_wait_finish();
 
diff --git a/modules/process/synth.h b/modules/process/synth.h
index 88f81d6..84b65ae 100644
--- a/modules/process/synth.h
+++ b/modules/process/synth.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: synth.h 17224 2015-07-31 12:00:52Z yeti-dn $
+ *  @(#) $Id: synth.h 20046 2017-07-08 18:15:12Z yeti-dn $
  *  Copyright (C) 2009,2010 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -276,8 +276,8 @@ gwy_synth_attach_lateral(GWY_SYNTH_CONTROLS *controls,
 
     g_object_set_data(G_OBJECT(adj), "target", target);
 
-    spin = gwy_table_attach_hscale(GTK_WIDGET(controls->table),
-                                   row, name, "px", adj, hscale_style);
+    spin = gwy_table_attach_adjbar(GTK_WIDGET(controls->table),
+                                   row, name, _("px"), adj, hscale_style);
     if (pspin)
         *pspin = spin;
     row++;
@@ -285,13 +285,13 @@ gwy_synth_attach_lateral(GWY_SYNTH_CONTROLS *controls,
     *pvalue = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(*pvalue), 1.0, 0.5);
     gtk_table_attach(controls->table, *pvalue,
-                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     1, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_object_set_data(G_OBJECT(adj), "value-label", *pvalue);
 
     *punits = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(*punits), 0.0, 0.5);
     gtk_table_attach(controls->table, *punits,
-                     3, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     g_signal_connect_swapped(adj, "value-changed",
@@ -317,7 +317,7 @@ gwy_synth_attach_height(GWY_SYNTH_CONTROLS *controls,
     *adj = gtk_adjustment_new(*target, 0.0001, 10000.0, 0.1, 10.0, 0);
     g_object_set_data(G_OBJECT(*adj), "target", target);
 
-    spin = gwy_table_attach_hscale(GTK_WIDGET(controls->table),
+    spin = gwy_table_attach_adjbar(GTK_WIDGET(controls->table),
                                    row, name, "", *adj, GWY_HSCALE_LOG);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 4);
     gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(spin), FALSE);
@@ -339,17 +339,18 @@ gwy_synth_attach_roundness(GWY_SYNTH_CONTROLS *controls,
                            GtkObject **adj,
                            gdouble *target)
 {
-    gtk_table_set_row_spacing(controls->table, row-1, 8);
+    if (row > 0)
+        gtk_table_set_row_spacing(controls->table, row-1, 8);
     gtk_table_attach(controls->table, gwy_label_new_header(_("Roundness")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     *adj = gtk_adjustment_new(*target, 0.0, 1.0, 0.001, 0.1, 0);
     g_object_set_data(G_OBJECT(*adj), "target", target);
 
-    gwy_table_attach_hscale(GTK_WIDGET(controls->table),
+    gwy_table_attach_adjbar(GTK_WIDGET(controls->table),
                             row, _("Roundn_ess:"), NULL, *adj,
-                            GWY_HSCALE_DEFAULT);
+                            GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(*adj, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), controls);
 
@@ -374,9 +375,9 @@ gwy_synth_attach_angle(GWY_SYNTH_CONTROLS *controls,
                               1.0, 10.0, 0);
     g_object_set_data(G_OBJECT(*adj), "target", target);
 
-    spin = gwy_table_attach_hscale(GTK_WIDGET(controls->table),
-                                   row, name, "deg", *adj,
-                                   GWY_HSCALE_DEFAULT);
+    spin = gwy_table_attach_adjbar(GTK_WIDGET(controls->table),
+                                   row, name, _("deg"), *adj,
+                                   GWY_HSCALE_LINEAR);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 1);
     g_signal_connect_swapped(*adj, "value-changed",
                              G_CALLBACK(gwy_synth_angle_changed), controls);
@@ -395,18 +396,19 @@ gwy_synth_attach_orientation(GWY_SYNTH_CONTROLS *controls,
 {
     GtkWidget *spin;
 
-    gtk_table_set_row_spacing(controls->table, row-1, 8);
+    if (row > 0)
+        gtk_table_set_row_spacing(controls->table, row-1, 8);
     gtk_table_attach(controls->table, gwy_label_new_header(_("Orientation")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     *adj = gtk_adjustment_new(*target * 180.0/G_PI,
                               -180.0, 180.0, 1.0, 10.0, 0);
     g_object_set_data(G_OBJECT(*adj), "target", target);
 
-    spin = gwy_table_attach_hscale(GTK_WIDGET(controls->table),
-                                   row, _("Orien_tation:"), "deg", *adj,
-                                   GWY_HSCALE_DEFAULT);
+    spin = gwy_table_attach_adjbar(GTK_WIDGET(controls->table),
+                                   row, _("Orien_tation:"), _("deg"), *adj,
+                                   GWY_HSCALE_LINEAR);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 1);
     g_signal_connect_swapped(*adj, "value-changed",
                              G_CALLBACK(gwy_synth_angle_changed), controls);
@@ -418,6 +420,32 @@ gwy_synth_attach_orientation(GWY_SYNTH_CONTROLS *controls,
 
 G_GNUC_UNUSED
 static gint
+gwy_synth_attach_truncation(GWY_SYNTH_CONTROLS *controls,
+                            gint row,
+                            GtkObject **adj,
+                            gdouble *target)
+{
+    GtkWidget *spin;
+
+    if (row > 0)
+        gtk_table_set_row_spacing(controls->table, row-1, 8);
+    *adj = gtk_adjustment_new(*target, 0.001, 1.0, 0.001, 0.1, 0);
+    g_object_set_data(G_OBJECT(*adj), "target", target);
+
+    spin = gwy_table_attach_adjbar(GTK_WIDGET(controls->table),
+                                   row, _("_Truncate:"), NULL, *adj,
+                                   GWY_HSCALE_SQRT);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
+    g_signal_connect_swapped(*adj, "value-changed",
+                             G_CALLBACK(gwy_synth_double_changed), controls);
+
+    row++;
+
+    return row;
+}
+
+G_GNUC_UNUSED
+static gint
 gwy_synth_attach_variance(GWY_SYNTH_CONTROLS *controls,
                           gint row,
                           GtkObject **adj,
@@ -428,7 +456,7 @@ gwy_synth_attach_variance(GWY_SYNTH_CONTROLS *controls,
     *adj = gtk_adjustment_new(*target, 0.0, 1.0, 0.01, 0.1, 0);
     g_object_set_data(G_OBJECT(*adj), "target", target);
 
-    spin = gwy_table_attach_hscale(GTK_WIDGET(controls->table),
+    spin = gwy_table_attach_adjbar(GTK_WIDGET(controls->table),
                                    row, _("Variance:"), NULL, *adj,
                                    GWY_HSCALE_SQRT);
     gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(spin), FALSE);
@@ -452,15 +480,16 @@ gwy_synth_attach_deformation(GWY_SYNTH_CONTROLS  *controls,
                              GtkWidget **pvalue_tau,
                              GtkWidget **punits_tau)
 {
-    gtk_table_set_row_spacing(controls->table, row-1, 8);
+    if (row > 0)
+        gtk_table_set_row_spacing(controls->table, row-1, 8);
     gtk_table_attach(controls->table, gwy_label_new_header(_("Deformation")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     *adj_sigma = gtk_adjustment_new(*target_sigma, 0.0, 100.0, 0.01, 1.0, 0);
     g_object_set_data(G_OBJECT(*adj_sigma), "target", target_sigma);
 
-    gwy_table_attach_hscale(GTK_WIDGET(controls->table),
+    gwy_table_attach_adjbar(GTK_WIDGET(controls->table),
                             row, _("_Amplitude:"), NULL, *adj_sigma,
                             GWY_HSCALE_SQRT);
     row++;
@@ -468,21 +497,21 @@ gwy_synth_attach_deformation(GWY_SYNTH_CONTROLS  *controls,
     *adj_tau = gtk_adjustment_new(*target_tau, 0.1, 1000.0, 0.01, 1.0, 0);
     g_object_set_data(G_OBJECT(*adj_tau), "target", target_tau);
 
-    gwy_table_attach_hscale(GTK_WIDGET(controls->table),
-                            row, _("_Lateral scale:"), "px", *adj_tau,
+    gwy_table_attach_adjbar(GTK_WIDGET(controls->table),
+                            row, _("_Lateral scale:"), _("px"), *adj_tau,
                             GWY_HSCALE_LOG);
     row++;
 
     *pvalue_tau = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(*pvalue_tau), 1.0, 0.5);
     gtk_table_attach(controls->table, *pvalue_tau,
-                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     1, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_object_set_data(G_OBJECT(*adj_tau), "value-label", *pvalue_tau);
 
     *punits_tau = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(*punits_tau), 0.0, 0.5);
     gtk_table_attach(controls->table, *punits_tau,
-                     3, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     g_signal_connect_swapped(*adj_sigma, "value-changed",
diff --git a/modules/process/threshold.c b/modules/process/threshold.c
index 9a08e6c..b9bee67 100644
--- a/modules/process/threshold.c
+++ b/modules/process/threshold.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: threshold.c 18739 2016-07-20 10:06:44Z yeti-dn $
+ *  @(#) $Id: threshold.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2010 David Necas (Yeti)
  *  E-mail: yeti at gwyddion.net
  *
@@ -117,12 +117,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Limit the data range using a lower/upper threshold."),
     "Yeti <yeti at gwyddion.net>",
-    "1.4",
+    "1.5",
     "David Nečas (Yeti)",
     "2010",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, threshold)
 
 static gboolean
 module_register(void)
@@ -203,19 +203,14 @@ threshold_entry_attach(ThresholdControls *controls,
                        gdouble value,
                        const gchar *name)
 {
-    GtkWidget *label, *entry;
+    GtkWidget *entry;
 
-    label = gtk_label_new_with_mnemonic(name);
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
     entry = gtk_entry_new();
     gwy_widget_set_activate_on_unfocus(entry, TRUE);
     threshold_format_value(controls, GTK_ENTRY(entry), value);
-    gtk_table_attach(table, entry, 1, 3, row, row+1, GTK_FILL, 0, 0, 0);
-    label = gtk_label_new(controls->format->units);
-    gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 3, 4, row, row+1, GTK_FILL, 0, 0, 0);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row,
+                            name, controls->format->units,
+                            GTK_OBJECT(entry), GWY_HSCALE_WIDGET_NO_EXPAND);
 
     return entry;
 }
@@ -269,7 +264,7 @@ threshold_dialog(ThresholdArgs *args,
     controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, FALSE);
     gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4);
 
-    table = GTK_TABLE(gtk_table_new(5, 4, FALSE));
+    table = GTK_TABLE(gtk_table_new(5, 3, FALSE));
     gtk_table_set_row_spacings(table, 2);
     gtk_table_set_col_spacings(table, 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -287,7 +282,7 @@ threshold_dialog(ThresholdArgs *args,
                                               NULL);
 
     button = gwy_radio_buttons_find(controls.mode, THRESHOLD_RANGE_USER);
-    gtk_table_attach(table, button, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, button, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.lower = threshold_entry_attach(&controls, table, row, args->lower,
@@ -303,7 +298,7 @@ threshold_dialog(ThresholdArgs *args,
     row++;
 
     button = gtk_button_new_with_mnemonic(_("Set to _Full Range"));
-    gtk_table_attach(table, button, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, button, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(button, "clicked",
                              G_CALLBACK(threshold_set_to_full_range),
                              &controls);
@@ -311,7 +306,7 @@ threshold_dialog(ThresholdArgs *args,
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     button = gwy_radio_buttons_find(controls.mode, THRESHOLD_RANGE_DISPLAY);
-    gtk_table_attach(table, button, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, button, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     /* TRANSLATORS: This is a range: 123 to 456. */
@@ -323,23 +318,23 @@ threshold_dialog(ThresholdArgs *args,
     label = gtk_label_new(s);
     g_free(s);
     gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
-    gtk_table_attach(table, label, 1, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, label, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
 
     label = gtk_label_new(controls.format->units);
     gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 3, 4, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, label, 2, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     button = gwy_radio_buttons_find(controls.mode, THRESHOLD_RANGE_OUTLIERS);
-    gtk_table_attach(table, button, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, button, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.sigma = gtk_adjustment_new(args->sigma, 1.0, 12.0, 0.01, 1.0, 0);
-    gwy_table_attach_hscale(GTK_WIDGET(table), row,
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row,
                             _("F_arther than:"), _("RMS"),
-                            controls.sigma, GWY_HSCALE_SQRT);
+                            controls.sigma, GWY_HSCALE_DEFAULT);
     g_signal_connect_swapped(controls.sigma, "value-changed",
                              G_CALLBACK(sigma_changed), &controls);
 
diff --git a/modules/process/tilt.c b/modules/process/tilt.c
index ef1eae3..7694516 100644
--- a/modules/process/tilt.c
+++ b/modules/process/tilt.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: tilt.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: tilt.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2008 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -75,12 +75,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Tilts image by specified amount."),
     "Yeti <yeti at gwyddion.net>",
-    "1.1",
+    "1.2",
     "David Nečas (Yeti)",
     "2008",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, tilt)
 
 static gboolean
 module_register(void)
@@ -178,21 +178,21 @@ tilt_dialog(TiltArgs *args,
     /* Slopes */
     label = gwy_label_new_header(_("Slopes"));
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
-    controls.dx = gtk_adjustment_new(args->dx, -100, 100, 1e-4, 1e-2, 0);
-    spin = gwy_table_attach_hscale(table, row, _("_X:"), unitstr,
-                                   controls.dx, GWY_HSCALE_NO_SCALE);
+    controls.dx = gtk_adjustment_new(args->dx, -100.0, 100.0, 1e-4, 1e-2, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("_X:"), unitstr,
+                                   controls.dx, GWY_HSCALE_DEFAULT);
     gwy_widget_set_activate_on_unfocus(spin, TRUE);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 6);
     g_signal_connect(controls.dx, "value-changed",
                      G_CALLBACK(tilt_dx_changed), &controls);
     row++;
 
-    controls.dy = gtk_adjustment_new(args->dy, -100, 100, 1e-4, 1e-2, 0);
-    spin = gwy_table_attach_hscale(table, row, _("_Y:"), unitstr,
-                                   controls.dy, GWY_HSCALE_NO_SCALE);
+    controls.dy = gtk_adjustment_new(args->dy, -100.0, 100.0, 1e-4, 1e-2, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("_Y:"), unitstr,
+                                   controls.dy, GWY_HSCALE_DEFAULT);
     gwy_widget_set_activate_on_unfocus(spin, TRUE);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 6);
     g_signal_connect(controls.dy, "value-changed",
@@ -203,13 +203,13 @@ tilt_dialog(TiltArgs *args,
     /* Angles (adjustment values will be calculated later) */
     label = gwy_label_new_header(_("Angles"));
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     if (units_equal) {
-        controls.theta = gtk_adjustment_new(0, 0, 89.6, 1e-2, 1.0, 0);
-        spin = gwy_table_attach_hscale(table, row, _("θ:"), _("deg"),
-                                       controls.theta, GWY_HSCALE_NO_SCALE);
+        controls.theta = gtk_adjustment_new(0.0, 0.0, 89.6, 1e-2, 1.0, 0);
+        spin = gwy_table_attach_adjbar(table, row, _("θ:"), _("deg"),
+                                       controls.theta, GWY_HSCALE_DEFAULT);
         gwy_widget_set_activate_on_unfocus(spin, TRUE);
         gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 4);
         g_signal_connect_swapped(controls.theta, "value-changed",
@@ -219,9 +219,9 @@ tilt_dialog(TiltArgs *args,
     else
         controls.theta = gtk_adjustment_new(0, 0, 90.0, 1e-2, 1.0, 0);
 
-    controls.phi = gtk_adjustment_new(0, -180, 180, 1e-2, 1.0, 0);
-    spin = gwy_table_attach_hscale(table, row, _("φ:"), _("deg"),
-                                   controls.phi, GWY_HSCALE_NO_SCALE);
+    controls.phi = gtk_adjustment_new(0.0, -180.0, 180.0, 1e-2, 1.0, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("φ:"), _("deg"),
+                                   controls.phi, GWY_HSCALE_LINEAR);
     gwy_widget_set_activate_on_unfocus(spin, TRUE);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 4);
     g_signal_connect_swapped(controls.phi, "value-changed",
diff --git a/modules/process/tip_blind.c b/modules/process/tip_blind.c
index 31149ee..7a3b102 100644
--- a/modules/process/tip_blind.c
+++ b/modules/process/tip_blind.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: tip_blind.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: tip_blind.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -80,7 +80,6 @@ typedef struct {
     GtkWidget *data;
     GtkWidget *type;
     GtkObject *threshold;
-    GtkWidget *threshold_spin;
     GtkWidget *threshold_unit;
     GtkWidget *boundaries;
     GwyDataField *tip;
@@ -182,7 +181,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, tip_blind)
 
 static gboolean
 module_register(void)
@@ -292,6 +291,7 @@ tip_blind_dialog(TipBlindArgs *args)
     gmodel = gwy_graph_model_new();
     controls.graph = gwy_graph_new(gmodel);
     g_object_unref(gmodel);
+    gwy_graph_enable_user_input(GWY_GRAPH(controls.graph), FALSE);
     gwy_axis_set_visible(gwy_graph_get_axis(GWY_GRAPH(controls.graph),
                                             GTK_POS_LEFT),
                          FALSE);
@@ -304,7 +304,7 @@ tip_blind_dialog(TipBlindArgs *args)
                            G_CALLBACK(gtk_widget_hide), NULL);
     gtk_box_pack_start(GTK_BOX(vbox), controls.graph, TRUE, TRUE, 0);
 
-    table = gtk_table_new(13, 4, FALSE);
+    table = gtk_table_new(13, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -318,26 +318,29 @@ tip_blind_dialog(TipBlindArgs *args)
                                    &args->source);
     g_signal_connect(controls.data, "changed",
                      G_CALLBACK(data_changed), &args->source);
-    gwy_table_attach_hscale(table, row, _("Related _data:"), NULL,
-                            GTK_OBJECT(controls.data), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("Related _data:"), NULL,
+                            GTK_OBJECT(controls.data),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
     row++;
 
     label = gtk_label_new(_("Estimated Tip Size"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 4, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.xres = gtk_adjustment_new(args->xres, MIN_RES, MAX_RES, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("_Width:"), "px", controls.xres, 0);
+    gwy_table_attach_adjbar(table, row, _("_Width:"), _("px"),
+                            controls.xres, GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_object_set_data(G_OBJECT(controls.xres), "controls", &controls);
     g_signal_connect(controls.xres, "value-changed",
                      G_CALLBACK(width_changed), &controls);
     row++;
 
     controls.yres = gtk_adjustment_new(args->yres, MIN_RES, MAX_RES, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("_Height:"), "px", controls.yres, 0);
+    gwy_table_attach_adjbar(table, row, _("_Height:"), _("px"),
+                            controls.yres, GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_object_set_data(G_OBJECT(controls.yres), "controls", &controls);
     g_signal_connect(controls.yres, "value-changed",
                      G_CALLBACK(height_changed), &controls);
@@ -346,7 +349,7 @@ tip_blind_dialog(TipBlindArgs *args)
     controls.same_resolution
         = gtk_check_button_new_with_mnemonic(_("_Same resolution"));
     gtk_table_attach(GTK_TABLE(table), controls.same_resolution,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.same_resolution),
                                  args->same_resolution);
     g_signal_connect(controls.same_resolution, "toggled",
@@ -355,57 +358,50 @@ tip_blind_dialog(TipBlindArgs *args)
     row++;
 
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Options")),
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
-    controls.threshold = gtk_adjustment_new(1.0, 0.01, 1000.0, 0.01, 1.0, 0.0);
-    controls.threshold_spin
-        = gtk_spin_button_new(GTK_ADJUSTMENT(controls.threshold), 0.1, 2);
-    gtk_table_attach(GTK_TABLE(table), controls.threshold_spin,
-                     2, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    label = gtk_label_new_with_mnemonic(_("Noise suppression t_hreshold:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.threshold_spin);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
     unit = gwy_data_field_get_si_unit_z(dfield);
     controls.threshold_unit
         = gwy_combo_box_metric_unit_new(G_CALLBACK(thresh_changed),
                                         &controls,
                                         -12, -3, unit, -9);
     gtk_table_attach(GTK_TABLE(table), controls.threshold_unit,
-                     3, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    /* Do this last to get correct initial sensitivity. */
+    controls.threshold = gtk_adjustment_new(1.0, 0.01, 1000.0, 0.01, 1.0, 0.0);
+    g_object_set_data(G_OBJECT(controls.threshold), "units",
+                      controls.threshold_unit);
+    gwy_table_attach_adjbar(table, row,
+                            _("Noise suppression t_hreshold:"), NULL,
+                            controls.threshold, GWY_HSCALE_LOG);
     g_signal_connect(controls.threshold, "value-changed",
                      G_CALLBACK(thresh_changed), &controls);
     sci_entry_set_value(GTK_ADJUSTMENT(controls.threshold),
-                        GTK_COMBO_BOX(controls.threshold_unit),
-                        args->thresh);
+                        GTK_COMBO_BOX(controls.threshold_unit), args->thresh);
     row++;
 
-    controls.boundaries
-                    = gtk_check_button_new_with_mnemonic(_("Use _boundaries"));
+    controls.boundaries = gtk_check_button_new_with_mnemonic(_("Use "
+                                                               "_boundaries"));
     gtk_table_attach(GTK_TABLE(table), controls.boundaries,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.boundaries),
-                                                 args->use_boundaries);
+                                 args->use_boundaries);
     g_signal_connect(controls.boundaries, "toggled",
                      G_CALLBACK(bound_changed), args);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
     row++;
 
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Stripes")),
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.nstripes = gtk_adjustment_new(args->nstripes,
                                            MIN_STRIPES, MAX_STRIPES, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("_Split to stripes:"), NULL,
-                            controls.nstripes, GWY_HSCALE_CHECK);
+    gwy_table_attach_adjbar(table, row, _("_Split to stripes:"), NULL,
+                            controls.nstripes,
+                            GWY_HSCALE_CHECK | GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     controls.split_to_stripes = gwy_table_hscale_get_check(controls.nstripes);
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.split_to_stripes),
-                                 !args->split_to_stripes);
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.split_to_stripes),
-                                 args->split_to_stripes);
     g_signal_connect(controls.split_to_stripes, "toggled",
                      G_CALLBACK(split_to_stripes_changed), &controls);
     g_signal_connect(controls.nstripes, "value-changed",
@@ -413,8 +409,9 @@ tip_blind_dialog(TipBlindArgs *args)
     row++;
 
     controls.stripeno = gtk_adjustment_new(1, 1, args->nstripes, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("_Preview stripe:"), NULL,
-                            controls.stripeno, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("_Preview stripe:"), NULL,
+                            controls.stripeno,
+                            GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_signal_connect(controls.stripeno, "value-changed",
                      G_CALLBACK(stripeno_changed), &controls);
     row++;
@@ -424,7 +421,7 @@ tip_blind_dialog(TipBlindArgs *args)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.plot_size_graph),
                                  args->plot_size_graph);
     gtk_table_attach(GTK_TABLE(table), controls.plot_size_graph,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls.plot_size_graph, "toggled",
                      G_CALLBACK(plot_size_graph_changed), &controls);
     row++;
@@ -434,7 +431,7 @@ tip_blind_dialog(TipBlindArgs *args)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.create_images),
                                  args->create_images);
     gtk_table_attach(GTK_TABLE(table), controls.create_images,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(controls.create_images, "toggled",
                      G_CALLBACK(create_images_changed), &controls);
     row++;
diff --git a/modules/process/tip_model.c b/modules/process/tip_model.c
index e18f275..a89c6f1 100644
--- a/modules/process/tip_model.c
+++ b/modules/process/tip_model.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: tip_model.c 19080 2016-10-14 13:59:02Z yeti-dn $
+ *  @(#) $Id: tip_model.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -53,9 +53,7 @@ typedef struct {
     GtkWidget *view;
     GtkWidget *type;
     GtkObject *radius;
-    GtkWidget *radius_spin;
     GtkWidget *radius_unit;
-    GtkWidget *radius_label;
     GtkObject *angle;
     GtkObject *theta;
     GtkObject *nsides;
@@ -69,38 +67,38 @@ typedef struct {
     gboolean tipdone;
 } TipModelControls;
 
-static gboolean    module_register                 (void);
-static void        tip_model                       (GwyContainer *data,
-                                                    GwyRunType run);
-static void        tip_model_dialog                (TipModelArgs *args);
-static void        tip_model_dialog_update_controls(TipModelControls *controls,
-                                                    TipModelArgs *args);
-static void        tip_model_dialog_update_values  (TipModelControls *controls,
-                                                    TipModelArgs *args);
-static void        preview                         (TipModelControls *controls,
-                                                    TipModelArgs *args);
-static void        tip_model_do                    (TipModelArgs *args,
-                                                    TipModelControls *controls);
-static void        tip_process                     (TipModelArgs *args,
-                                                    TipModelControls *controls);
-static void        tip_model_load_args             (GwyContainer *container,
-                                                    TipModelArgs *args);
-static void        tip_model_save_args             (GwyContainer *container,
-                                                    TipModelArgs *args);
-static void        tip_model_sanitize_args         (TipModelArgs *args);
-static void        sci_entry_set_value             (GtkAdjustment *adj,
-                                                    GtkComboBox *metric,
-                                                    gdouble val);
-static void        tip_type_cb                     (GtkWidget *combo,
-                                                    TipModelControls *controls);
-static GtkWidget*  create_preset_menu              (GCallback callback,
-                                                    gpointer cbdata,
-                                                    gint current);
-static void        tip_update                      (TipModelControls *controls,
-                                                    TipModelArgs *args);
-static void        radius_changed_cb               (gpointer object,
-                                                    TipModelControls *controls);
-static void        tip_model_dialog_abandon        (TipModelControls *controls);
+static gboolean   module_register                 (void);
+static void       tip_model                       (GwyContainer *data,
+                                                   GwyRunType run);
+static void       tip_model_dialog                (TipModelArgs *args);
+static void       tip_model_dialog_update_controls(TipModelControls *controls,
+                                                   TipModelArgs *args);
+static void       tip_model_dialog_update_values  (TipModelControls *controls,
+                                                   TipModelArgs *args);
+static void       preview                         (TipModelControls *controls,
+                                                   TipModelArgs *args);
+static void       tip_model_do                    (TipModelArgs *args,
+                                                   TipModelControls *controls);
+static void       tip_process                     (TipModelArgs *args,
+                                                   TipModelControls *controls);
+static void       tip_model_load_args             (GwyContainer *container,
+                                                   TipModelArgs *args);
+static void       tip_model_save_args             (GwyContainer *container,
+                                                   TipModelArgs *args);
+static void       tip_model_sanitize_args         (TipModelArgs *args);
+static void       sci_entry_set_value             (GtkAdjustment *adj,
+                                                   GtkComboBox *metric,
+                                                   gdouble val);
+static void       tip_type_changed                (GtkWidget *combo,
+                                                   TipModelControls *controls);
+static GtkWidget* create_preset_menu              (GCallback callback,
+                                                   gpointer cbdata,
+                                                   gint current);
+static void       tip_update                      (TipModelControls *controls,
+                                                   TipModelArgs *args);
+static void       radius_changed                  (gpointer object,
+                                                   TipModelControls *controls);
+static void       tip_model_dialog_abandon        (TipModelControls *controls);
 
 
 static const TipModelArgs tip_model_defaults = {
@@ -113,12 +111,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Models SPM tip."),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "2.0",
+    "2.1",
     "David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, tip_model)
 
 static gboolean
 module_register(void)
@@ -212,69 +210,67 @@ tip_model_dialog(TipModelArgs *args)
     /* set up tip model controls */
     gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4);
 
-    table = gtk_table_new(7, 4, FALSE);
+    table = gtk_table_new(7, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
     gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 4);
     row = 0;
 
-    controls.type = create_preset_menu(G_CALLBACK(tip_type_cb),
+    controls.type = create_preset_menu(G_CALLBACK(tip_type_changed),
                                        &controls, args->type);
-    gwy_table_attach_hscale(table, row, _("Tip _type:"), NULL,
-                            GTK_OBJECT(controls.type), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("Tip _type:"), NULL,
+                            GTK_OBJECT(controls.type),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     controls.nsides = gtk_adjustment_new(args->nsides, 3, 24, 1, 5, 0);
-    gwy_table_attach_hscale(table, row, _("_Number of sides:"), NULL,
-                            controls.nsides, 0);
+    gwy_table_attach_adjbar(table, row, _("_Number of sides:"), NULL,
+                            controls.nsides,
+                            GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     row++;
 
     controls.angle = gtk_adjustment_new(args->angle, 0.1, 89.9, 0.1, 1, 0);
-    spin = gwy_table_attach_hscale(table, row, _("Tip _slope:"), _("deg"),
-                                   controls.angle, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("Tip _slope:"), _("deg"),
+                                   controls.angle, GWY_HSCALE_LINEAR);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2);
     row++;
 
     controls.theta = gtk_adjustment_new(args->theta, 0, 360, 0.1, 1, 0);
-    spin = gwy_table_attach_hscale(table, row, _("Tip _rotation:"), _("deg"),
-                                   controls.theta, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("Tip _rotation:"), _("deg"),
+                                   controls.theta, GWY_HSCALE_LINEAR);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2);
     row++;
 
-    controls.radius = gtk_adjustment_new(1.0, 0.01, 1000.0, 0.01, 1.0, 0.0);
-    controls.radius_spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.radius),
-                                               0.1, 2);
-    gtk_table_attach(GTK_TABLE(table), controls.radius_spin,
-                     2, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    controls.radius_label = gtk_label_new_with_mnemonic(_("Tip _apex radius:"));
-    gtk_misc_set_alignment(GTK_MISC(controls.radius_label), 0.0, 0.5);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(controls.radius_label),
-                                  controls.radius_spin);
-    gtk_table_attach(GTK_TABLE(table), controls.radius_label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
     unit = gwy_data_field_get_si_unit_xy(dfield);
     controls.radius_unit
-        = gwy_combo_box_metric_unit_new(G_CALLBACK(radius_changed_cb),
+        = gwy_combo_box_metric_unit_new(G_CALLBACK(radius_changed),
                                         &controls,
                                         -12, -3, unit, -9);
     gtk_table_attach(GTK_TABLE(table), controls.radius_unit,
-                     3, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    /* Do this last to get correct initial sensitivity. */
+    controls.radius = gtk_adjustment_new(1.0, 0.01, 1000.0, 0.01, 1.0, 0.0);
+    g_object_set_data(G_OBJECT(controls.radius), "units", controls.radius_unit);
+    gwy_table_attach_adjbar(table, row, _("Tip _apex radius:"), NULL,
+                            controls.radius, GWY_HSCALE_LOG);
     g_signal_connect(controls.radius, "value-changed",
-                     G_CALLBACK(radius_changed_cb), &controls);
+                     G_CALLBACK(radius_changed), &controls);
+    sci_entry_set_value(GTK_ADJUSTMENT(controls.radius),
+                        GTK_COMBO_BOX(controls.radius_unit), args->radius);
     row++;
 
     controls.anisotropy = gtk_adjustment_new(args->anisotropy,
                                              0.1, 10.0, 0.001, 1.0, 0);
-    spin = gwy_table_attach_hscale(table, row, _("Tip _anisotropy:"), NULL,
-                                   controls.anisotropy, 0);
+    gwy_table_attach_adjbar(table, row, _("Tip _anisotropy:"), NULL,
+                            controls.anisotropy, GWY_HSCALE_SQRT);
     row++;
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     controls.labsize = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(controls.labsize), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), controls.labsize,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.tipdone = FALSE;
@@ -347,15 +343,15 @@ sci_entry_set_value(GtkAdjustment *adj,
     mag = 3*(gint)floor(log10(val)/3.0);
     mag = CLAMP(mag, -12, -3);
     g_signal_handlers_block_matched(metric, G_SIGNAL_MATCH_FUNC,
-                                    0, 0, 0, radius_changed_cb, 0);
+                                    0, 0, 0, radius_changed, 0);
     gwy_enum_combo_box_set_active(GTK_COMBO_BOX(metric), mag);
     g_signal_handlers_unblock_matched(metric, G_SIGNAL_MATCH_FUNC,
-                                      0, 0, 0, radius_changed_cb, 0);
+                                      0, 0, 0, radius_changed, 0);
     gtk_adjustment_set_value(adj, val/pow10(mag));
 }
 
 static void
-tip_type_cb(GtkWidget *combo, TipModelControls *controls)
+tip_type_changed(GtkWidget *combo, TipModelControls *controls)
 {
     controls->args->type = gwy_enum_combo_box_get_active(GTK_COMBO_BOX(combo));
     tip_model_dialog_update_controls(controls, controls->args);
@@ -435,9 +431,7 @@ tip_model_dialog_update_controls(TipModelControls *controls,
     gwy_table_hscale_set_sensitive(controls->theta, rotation_sens);
     gwy_table_hscale_set_sensitive(controls->nsides, nsides_sens);
     gwy_table_hscale_set_sensitive(controls->anisotropy, anisotropy_sens);
-    gtk_widget_set_sensitive(controls->radius_spin, radius_sens);
-    gtk_widget_set_sensitive(controls->radius_unit, radius_sens);
-    gtk_widget_set_sensitive(controls->radius_label, radius_sens);
+    gwy_table_hscale_set_sensitive(controls->radius, radius_sens);
 }
 
 static void
@@ -570,8 +564,7 @@ tip_process(TipModelArgs *args,
 }
 
 static void
-radius_changed_cb(G_GNUC_UNUSED gpointer object,
-                  TipModelControls *controls)
+radius_changed(G_GNUC_UNUSED gpointer object, TipModelControls *controls)
 {
     gint p10;
     gdouble val;
diff --git a/modules/process/tipops.c b/modules/process/tipops.c
index 510e1d7..213f516 100644
--- a/modules/process/tipops.c
+++ b/modules/process/tipops.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: tipops.c 18254 2016-02-03 14:56:26Z yeti-dn $
+ *  @(#) $Id: tipops.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004-2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -71,7 +71,7 @@ static GwyModuleInfo module_info = {
     "2006",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, tipops)
 
 static gboolean
 module_register(void)
@@ -163,7 +163,7 @@ tipops_dialog(TipOpsArgs *args,
     label = gtk_label_new_with_mnemonic(_("_Tip morphology:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
 
     chooser = gwy_data_chooser_new_channels();
     g_object_set_data(G_OBJECT(chooser), "dialog", dialog);
@@ -180,7 +180,7 @@ tipops_dialog(TipOpsArgs *args,
     label = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_object_set_data(G_OBJECT(chooser), "warning-label", label);
 
     tipops_tip_changed(GWY_DATA_CHOOSER(chooser), args);
diff --git a/modules/process/unrotate.c b/modules/process/unrotate.c
index 4e4fa90..c09b3bc 100644
--- a/modules/process/unrotate.c
+++ b/modules/process/unrotate.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: unrotate.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: unrotate.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2004 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -88,7 +88,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, unrotate)
 
 static gboolean
 module_register(void)
@@ -237,19 +237,19 @@ unrotate_dialog(UnrotateArgs *args,
     row = 0;
 
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Structure")),
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     label = gtk_label_new(_("Detected:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
     s = gwy_sgettext(gwy_enum_to_string(guess, gwy_plane_symmetry_get_enum(),
                                         -1));
     label = gtk_label_new(_(s));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     1, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.symmetry
@@ -262,11 +262,11 @@ unrotate_dialog(UnrotateArgs *args,
     label = gtk_label_new(_("Correction:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
     controls.corrlabel = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(controls.corrlabel), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), controls.corrlabel,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     1, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
     row++;
 
diff --git a/modules/process/volumize.c b/modules/process/volumize.c
index da311bb..86087f2 100644
--- a/modules/process/volumize.c
+++ b/modules/process/volumize.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: volumize.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: volumize.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2015-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -46,14 +46,14 @@ static GwyModuleInfo module_info = {
     "2013",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, volumize)
 
 static gboolean
 module_register(void)
 {
     gwy_process_func_register("volumize",
                               (GwyProcessFunc)&volumize,
-                              N_("/_Basic Operations/Volumize..."),
+                              N_("/_Basic Operations/Volumize"),
                               GWY_STOCK_VOLUMIZE,
                               VOLUMIZE_RUN_MODES,
                               GWY_MENU_FLAG_DATA,
diff --git a/modules/process/volumize_layers.c b/modules/process/volumize_layers.c
index 56887dd..1e36fc6 100644
--- a/modules/process/volumize_layers.c
+++ b/modules/process/volumize_layers.c
@@ -1,6 +1,6 @@
 /*
  *  @(#) $Id: volumize_layers.c 14879 2013-04-15 21:04:16Z yeti-dn $
- *  Copyright (C) 2015-2016 David Necas (Yeti), Petr Klapetek.
+ *  Copyright (C) 2015-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -85,12 +85,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Converts all datafields to 3D volume data."),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "2.0",
+    "2.1",
     "David Nečas (Yeti) & Petr Klapetek",
     "2013",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, volumize_layers)
 
 static gboolean
 module_register(void)
@@ -237,29 +237,28 @@ volumize_layers_dialog(VolumizeLayersArgs *args,
     args->zres = zres;
 
     controls.xres = gtk_adjustment_new(args->xres, 1.0, 1000.0, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("_X resolution:"), "pixels",
-                            controls.xres, GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(table, row, _("_X resolution:"), _("px"),
+                            controls.xres, GWY_HSCALE_DEFAULT);
     row++;
 
     controls.yres = gtk_adjustment_new(args->yres, 1.0, 1000.0, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("_Y resolution:"), "pixels",
-                            controls.yres, GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(table, row, _("_Y resolution:"), _("px"),
+                            controls.yres, GWY_HSCALE_DEFAULT);
     row++;
 
     controls.zres = gtk_adjustment_new(args->zres, 1.0, 1000.0, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("_Z resolution:"), "pixels",
-                            controls.zres, GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(table, row, _("_Z resolution:"), _("px"),
+                            controls.zres, GWY_HSCALE_DEFAULT);
     row++;
 
     controls.zreal = gtk_adjustment_new(args->zreal,
                                         0.01, 10000.0, 0.01, 1.0, 0);
-    gwy_table_attach_hscale(table, row, _("Z _range:"), args->zunit,
-                            controls.zreal, GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(table, row, _("Z _range:"), args->zunit,
+                            controls.zreal, GWY_HSCALE_DEFAULT);
 
     zunitbutton = gtk_button_new_with_label(gwy_sgettext("verb|Change"));
     gtk_table_attach(GTK_TABLE(table), zunitbutton,
-                     4, 5, row, row+2,
-                     GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0);
+                     3, 4, row, row+2, GTK_FILL | GTK_SHRINK, 0, 0, 0);
     g_signal_connect_swapped(zunitbutton, "clicked",
                              G_CALLBACK(change_zunits), &controls);
     row++;
diff --git a/modules/process/wave_synth.c b/modules/process/wave_synth.c
index 3f3f96d..896d2ea 100644
--- a/modules/process/wave_synth.c
+++ b/modules/process/wave_synth.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: wave_synth.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: wave_synth.c 20058 2017-07-10 11:22:20Z yeti-dn $
  *  Copyright (C) 2014 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -69,6 +69,7 @@ typedef struct {
     gdouble y;
     gdouble z;
     gdouble k;
+    gdouble decay;
 } GwyWaveSource;
 
 typedef struct _WaveSynthArgs WaveSynthArgs;
@@ -90,6 +91,8 @@ struct _WaveSynthArgs {
     gdouble amplitude_noise;
     gdouble k;
     gdouble k_noise;
+    gdouble decay;
+    gdouble decay_noise;
     /* Dynamic state */
     gfloat *wave_table;
 };
@@ -120,6 +123,8 @@ struct _WaveSynthControls {
     GtkObject *k;
     GtkWidget *k_units;
     GtkObject *k_noise;
+    GtkObject *decay;
+    GtkObject *decay_noise;
     GwyContainer *mydata;
     GwyDataField *surface;
     gdouble pxsize;
@@ -158,9 +163,11 @@ static void       amplitude_init_clicked (WaveSynthControls *controls);
 static void       wave_synth_invalidate  (WaveSynthControls *controls);
 static gboolean   preview_gsource        (gpointer user_data);
 static void       preview                (WaveSynthControls *controls);
-static void       wave_synth_do          (const WaveSynthArgs *args,
+static gboolean   wave_synth_do          (const WaveSynthArgs *args,
                                           const GwyDimensionArgs *dimsargs,
-                                          GwyDataField *dfield);
+                                          GwyDataField *dfield,
+                                          GwySetMessageFunc set_message,
+                                          GwySetFractionFunc set_fraction);
 static void       precalculate_wave_table(gfloat *tab,
                                           guint n,
                                           WaveTypeType type);
@@ -198,7 +205,8 @@ static const WaveSynthArgs wave_synth_defaults = {
     0.0, 0.3,
     0.0, 0.3,
     1.0, 0.0,
-    80.0, 0.02,
+    30.0, 0.02,
+    -5.0, 0.0,
     /* Dynamic state */
     NULL,
 };
@@ -210,12 +218,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Generates various kinds of waves."),
     "Yeti <yeti at gwyddion.net>",
-    "1.1",
+    "1.2",
     "David Nečas (Yeti)",
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, wave_synth)
 
 static gboolean
 module_register(void)
@@ -264,46 +272,57 @@ run_noninteractive(WaveSynthArgs *args,
                    gint oldid,
                    GQuark quark)
 {
+    GwyDataField *newfield;
     GwySIUnit *siunit;
     gboolean replace = dimsargs->replace && dfield;
     gboolean add = dimsargs->add && dfield;
     gint newid;
+    gboolean ok;
 
     if (args->randomize)
         args->seed = g_random_int() & 0x7fffffff;
 
-    if (replace) {
-        /* Always take a reference so that we can always unref. */
-        g_object_ref(dfield);
-
-        gwy_app_undo_qcheckpointv(data, 1, &quark);
-        if (!add)
-            gwy_data_field_clear(dfield);
-
-        gwy_app_channel_log_add_proc(data, oldid, oldid);
+    if (add || replace) {
+        if (add)
+            newfield = gwy_data_field_duplicate(dfield);
+        else
+            newfield = gwy_data_field_new_alike(dfield, TRUE);
     }
     else {
-        if (add)
-            dfield = gwy_data_field_duplicate(dfield);
-        else {
-            gdouble mag = pow10(dimsargs->xypow10) * dimsargs->measure;
-            dfield = gwy_data_field_new(dimsargs->xres, dimsargs->yres,
-                                        mag*dimsargs->xres, mag*dimsargs->yres,
-                                        TRUE);
+        gdouble mag = pow10(dimsargs->xypow10) * dimsargs->measure;
+        newfield = gwy_data_field_new(dimsargs->xres, dimsargs->yres,
+                                      mag*dimsargs->xres, mag*dimsargs->yres,
+                                      TRUE);
 
-            siunit = gwy_data_field_get_si_unit_xy(dfield);
-            gwy_si_unit_set_from_string(siunit, dimsargs->xyunits);
+        siunit = gwy_data_field_get_si_unit_xy(newfield);
+        gwy_si_unit_set_from_string(siunit, dimsargs->xyunits);
 
-            siunit = gwy_data_field_get_si_unit_z(dfield);
-            gwy_si_unit_set_from_string(siunit, dimsargs->zunits);
-        }
+        siunit = gwy_data_field_get_si_unit_z(newfield);
+        gwy_si_unit_set_from_string(siunit, dimsargs->zunits);
     }
 
-    wave_synth_do(args, dimsargs, dfield);
+    gwy_app_wait_start(gwy_app_find_window_for_channel(data, oldid),
+                       _("Initializing..."));
+    ok = wave_synth_do(args, dimsargs, newfield,
+                       gwy_app_wait_set_message, gwy_app_wait_set_fraction);
+    gwy_app_wait_finish();
+
+    if (!ok) {
+        g_object_unref(newfield);
+        return;
+    }
 
-    if (!replace) {
+    if (replace) {
+        gwy_app_undo_qcheckpointv(data, 1, &quark);
+        gwy_container_set_object(data, gwy_app_get_data_key_for_id(oldid),
+                                 newfield);
+        gwy_app_channel_log_add_proc(data, oldid, oldid);
+        g_object_unref(newfield);
+        newid = oldid;
+    }
+    else {
         if (data) {
-            newid = gwy_app_data_browser_add_data_field(dfield, data, TRUE);
+            newid = gwy_app_data_browser_add_data_field(newfield, data, TRUE);
             if (oldid != -1)
                 gwy_app_sync_data_items(data, data, oldid, newid, FALSE,
                                         GWY_DATA_ITEM_GRADIENT,
@@ -313,7 +332,7 @@ run_noninteractive(WaveSynthArgs *args,
             newid = 0;
             data = gwy_container_new();
             gwy_container_set_object(data, gwy_app_get_data_key_for_id(newid),
-                                     dfield);
+                                     newfield);
             gwy_app_data_browser_add(data);
             gwy_app_data_browser_reset_visibility(data,
                                                   GWY_VISIBILITY_RESET_SHOW_ALL);
@@ -322,8 +341,8 @@ run_noninteractive(WaveSynthArgs *args,
 
         gwy_app_set_data_field_title(data, newid, _("Generated"));
         gwy_app_channel_log_add_proc(data, add ? oldid : -1, newid);
+        g_object_unref(newfield);
     }
-    g_object_unref(dfield);
 }
 
 static gboolean
@@ -333,7 +352,7 @@ wave_synth_dialog(WaveSynthArgs *args,
                   GwyDataField *dfield_template,
                   gint id)
 {
-    GtkWidget *dialog, *table, *vbox, *hbox, *notebook;
+    GtkWidget *dialog, *table, *vbox, *hbox, *notebook, *spin;
     WaveSynthControls controls;
     GwyDataField *dfield;
     gboolean finished;
@@ -409,7 +428,7 @@ wave_synth_dialog(WaveSynthArgs *args,
         g_signal_connect_swapped(controls.dims->add, "toggled",
                                  G_CALLBACK(wave_synth_invalidate), &controls);
 
-    table = gtk_table_new(16, 4, FALSE);
+    table = gtk_table_new(18, 4, FALSE);
     controls.table = GTK_TABLE(table);
     gtk_table_set_row_spacings(controls.table, 2);
     gtk_table_set_col_spacings(controls.table, 6);
@@ -419,14 +438,14 @@ wave_synth_dialog(WaveSynthArgs *args,
     row = 0;
 
     controls.quantity = quantity_selector_new(&controls);
-    gwy_table_attach_hscale(table, row, _("_Quantity:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Quantity:"), NULL,
                             GTK_OBJECT(controls.quantity),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     controls.nwaves = gtk_adjustment_new(args->nwaves, 1, 1000, 1, 10, 0);
     g_object_set_data(G_OBJECT(controls.nwaves), "target", &args->nwaves);
-    gwy_table_attach_hscale(table, row, _("_Number of waves:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Number of waves:"), NULL,
                             GTK_OBJECT(controls.nwaves), GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.nwaves, "value-changed",
                              G_CALLBACK(gwy_synth_int_changed), &controls);
@@ -434,13 +453,13 @@ wave_synth_dialog(WaveSynthArgs *args,
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Amplitude")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.type = type_selector_new(&controls);
-    gwy_table_attach_hscale(table, row, _("_Wave form:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Wave form:"), NULL,
                             GTK_OBJECT(controls.type),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     row = gwy_synth_attach_height(&controls, row,
@@ -450,11 +469,11 @@ wave_synth_dialog(WaveSynthArgs *args,
 
     if (dfield_template) {
         controls.amplitude_init
-            = gtk_button_new_with_mnemonic(_("_Like Current Channel"));
+            = gtk_button_new_with_mnemonic(_("_Like Current Image"));
         g_signal_connect_swapped(controls.amplitude_init, "clicked",
                                  G_CALLBACK(amplitude_init_clicked), &controls);
         gtk_table_attach(GTK_TABLE(table), controls.amplitude_init,
-                         1, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                         0, 2, row, row+1, GTK_FILL, 0, 0, 0);
         row++;
     }
 
@@ -463,13 +482,25 @@ wave_synth_dialog(WaveSynthArgs *args,
                                     &args->amplitude_noise);
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    controls.decay = gtk_adjustment_new(args->decay, -5.0, 0.0, 0.001, 1, 0);
+    g_object_set_data(G_OBJECT(controls.decay), "target", &args->decay);
+    gwy_table_attach_adjbar(table, row, _("_Decay:"), "log<sub>10</sub>",
+                            GTK_OBJECT(controls.decay), GWY_HSCALE_LINEAR);
+    g_signal_connect_swapped(controls.decay, "value-changed",
+                             G_CALLBACK(gwy_synth_double_changed), &controls);
+    row++;
+
+    row = gwy_synth_attach_variance(&controls, row,
+                                    &controls.decay_noise, &args->decay_noise);
+
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Frequency")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.k = gtk_adjustment_new(args->k, 0.01, 1000.0, 0.01, 10, 0);
     g_object_set_data(G_OBJECT(controls.k), "target", &args->k);
-    gwy_table_attach_hscale(table, row, _("_Spatial frequency:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Spatial frequency:"), NULL,
                             GTK_OBJECT(controls.k), GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.k, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
@@ -480,30 +511,34 @@ wave_synth_dialog(WaveSynthArgs *args,
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Position")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.x = gtk_adjustment_new(args->x, -1000.0, 1000.0, 0.01, 1, 0);
     g_object_set_data(G_OBJECT(controls.x), "target", &args->x);
-    gwy_table_attach_hscale(table, row, _("_X center:"), NULL,
-                            GTK_OBJECT(controls.x), GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("_X center:"), NULL,
+                            GTK_OBJECT(controls.x), GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.x, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
     row++;
 
     row = gwy_synth_attach_variance(&controls, row,
                                     &controls.x_noise, &args->x_noise);
+    spin = gwy_table_hscale_get_middle_widget(controls.x_noise);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 4);
 
     controls.y = gtk_adjustment_new(args->y, -1000.0, 1000.0, 0.01, 1, 0);
     g_object_set_data(G_OBJECT(controls.y), "target", &args->y);
-    gwy_table_attach_hscale(table, row, _("_Y center:"), NULL,
-                            GTK_OBJECT(controls.y), GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("_Y center:"), NULL,
+                            GTK_OBJECT(controls.y), GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.y, "value-changed",
                              G_CALLBACK(gwy_synth_double_changed), &controls);
     row++;
 
     row = gwy_synth_attach_variance(&controls, row,
                                     &controls.y_noise, &args->y_noise);
+    spin = gwy_table_hscale_get_middle_widget(controls.y_noise);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 4);
 
     gtk_widget_show_all(dialog);
     controls.in_init = FALSE;
@@ -694,6 +729,7 @@ preview(WaveSynthControls *controls)
 {
     WaveSynthArgs *args = controls->args;
     GwyDataField *dfield;
+    gboolean ok;
 
     dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata,
                                                              "/0/data"));
@@ -702,7 +738,24 @@ preview(WaveSynthControls *controls)
     else
         gwy_data_field_clear(dfield);
 
-    wave_synth_do(args, controls->dims->args, dfield);
+    if (args->update) {
+        wave_synth_do(args, controls->dims->args, dfield, NULL, NULL);
+        gwy_data_field_data_changed(dfield);
+        return;
+    }
+
+    gwy_app_wait_start(GTK_WINDOW(controls->dialog), _("Initializing..."));
+    ok = wave_synth_do(args, controls->dims->args, dfield,
+                       gwy_app_wait_set_message, gwy_app_wait_set_fraction);
+    gwy_app_wait_finish();
+
+    if (!ok) {
+        if (controls->dims->args->add && controls->surface)
+            gwy_data_field_copy(controls->surface, dfield, FALSE);
+        else
+            gwy_data_field_clear(dfield);
+    }
+    gwy_data_field_data_changed(dfield);
 }
 
 static inline void
@@ -720,10 +773,12 @@ approx_wave_c(const gfloat *tab, gdouble x)
     return tab[xi];
 }
 
-static void
+static gboolean
 wave_synth_do(const WaveSynthArgs *args,
               const GwyDimensionArgs *dimsargs,
-              GwyDataField *dfield)
+              GwyDataField *dfield,
+              GwySetMessageFunc set_message,
+              GwySetFractionFunc set_fraction)
 {
     GwyRandGenSet *rngset;
     GwyWaveSource *sources;
@@ -732,6 +787,7 @@ wave_synth_do(const WaveSynthArgs *args,
     gdouble *d;
     const gfloat *tab;
     gdouble q;
+    gboolean ok = FALSE;
 
     sources = g_new(GwyWaveSource, args->nwaves);
     rngset = gwy_rand_gen_set_new(1);
@@ -739,7 +795,10 @@ wave_synth_do(const WaveSynthArgs *args,
     randomize_sources(rngset, sources, args, dimsargs, xres, yres);
     gwy_rand_gen_set_free(rngset);
 
-    d = dfield->data;
+    if (set_message && !set_message(_("Rendering surface...")))
+        goto finish;
+
+    d = gwy_data_field_get_data(dfield);
     tab = args->wave_table;
     if (args->quantity == WAVE_QUANTITY_DISPLACEMENT) {
         q = 2.0/sqrt(nwaves);
@@ -750,11 +809,14 @@ wave_synth_do(const WaveSynthArgs *args,
 
                 for (k = nwaves; k; k--, source++) {
                     gdouble x = j - source->x, y = i - source->y;
-                    gdouble r = sqrt(x*x + y*y);
-                    z += source->z * approx_wave_c(tab, source->k*r);
+                    gdouble kr = source->k * sqrt(x*x + y*y);
+                    gdouble dec = exp(-kr*source->decay);
+                    z += dec*source->z * approx_wave_c(tab, kr);
                 }
                 *(d++) += q*z;
             }
+            if (set_fraction && !set_fraction((i + 1.0)/yres))
+                goto finish;
         }
     }
     else if (args->quantity == WAVE_QUANTITY_AMPLITUDE) {
@@ -766,14 +828,17 @@ wave_synth_do(const WaveSynthArgs *args,
 
                 for (k = nwaves; k; k--, source++) {
                     gdouble x = j - source->x, y = i - source->y;
-                    gdouble r = sqrt(x*x + y*y);
+                    gdouble kr = source->k * sqrt(x*x + y*y);
+                    gdouble dec = exp(-kr*source->decay);
                     gfloat c, s;
-                    approx_wave_sc(tab, source->k*r, &s, &c);
-                    zs += source->z*s;
-                    zc += source->z*c;
+                    approx_wave_sc(tab, kr, &s, &c);
+                    zs += dec*source->z*s;
+                    zc += dec*source->z*c;
                 }
                 *(d++) += q*sqrt(zc*zc + zs*zs);
             }
+            if (set_fraction && !set_fraction((i + 1.0)/yres))
+                goto finish;
         }
     }
     else if (args->quantity == WAVE_QUANTITY_PHASE) {
@@ -785,24 +850,29 @@ wave_synth_do(const WaveSynthArgs *args,
 
                 for (k = nwaves; k; k--, source++) {
                     gdouble x = j - source->x, y = i - source->y;
-                    gdouble r = sqrt(x*x + y*y);
+                    gdouble kr = source->k * sqrt(x*x + y*y);
+                    gdouble dec = exp(-kr*source->decay);
                     gfloat c, s;
-                    approx_wave_sc(tab, source->k*r, &s, &c);
-                    zs += source->z*s;
-                    zc += source->z*c;
+                    approx_wave_sc(tab, kr, &s, &c);
+                    zs += dec*source->z*s;
+                    zc += dec*source->z*c;
                 }
                 *(d++) += q*atan2(zs, zc);
             }
+            if (set_fraction && !set_fraction((i + 1.0)/yres))
+                goto finish;
         }
     }
     else {
         g_assert_not_reached();
     }
 
+    ok = TRUE;
+
+finish:
     g_free(sources);
 
-    gwy_data_field_invalidate(dfield);
-    gwy_data_field_data_changed(dfield);
+    return ok;
 }
 
 static void
@@ -911,24 +981,31 @@ randomize_sources(GwyRandGenSet *rngset,
         sources[i].z = (args->amplitude * pow10(dimsargs->zpow10)
                         * exp(rng_gaussian(rngset, 0,
                                            4.0*args->amplitude_noise)));
+        /* Phase is already scaled so this is measured in wavelengths as it
+         * should. */
+        sources[i].decay = exp(G_LN10*(args->decay
+                                       + rng_gaussian(rngset, 0,
+                                              4.0*args->decay_noise)));
     }
 }
 
 static const gchar active_page_key[]     = "/module/wave_synth/active_page";
-static const gchar update_key[]          = "/module/wave_synth/update";
+static const gchar amplitude_key[]       = "/module/wave_synth/amplitude";
+static const gchar amplitude_noise_key[] = "/module/wave_synth/amplitude_noise";
+static const gchar decay_key[]           = "/module/wave_synth/decay";
+static const gchar decay_noise_key[]     = "/module/wave_synth/decay_noise";
+static const gchar k_key[]               = "/module/wave_synth/k";
+static const gchar k_noise_key[]         = "/module/wave_synth/k_noise";
+static const gchar nwaves_key[]          = "/module/wave_synth/nwaves";
+static const gchar quantity_key[]        = "/module/wave_synth/quantity";
 static const gchar randomize_key[]       = "/module/wave_synth/randomize";
 static const gchar seed_key[]            = "/module/wave_synth/seed";
 static const gchar type_key[]            = "/module/wave_synth/type";
-static const gchar quantity_key[]        = "/module/wave_synth/quantity";
-static const gchar nwaves_key[]          = "/module/wave_synth/nwaves";
+static const gchar update_key[]          = "/module/wave_synth/update";
 static const gchar x_key[]               = "/module/wave_synth/x";
 static const gchar x_noise_key[]         = "/module/wave_synth/x_noise";
 static const gchar y_key[]               = "/module/wave_synth/y";
 static const gchar y_noise_key[]         = "/module/wave_synth/y_noise";
-static const gchar amplitude_key[]       = "/module/wave_synth/amplitude";
-static const gchar amplitude_noise_key[] = "/module/wave_synth/amplitude_noise";
-static const gchar k_key[]               = "/module/wave_synth/k";
-static const gchar k_noise_key[]         = "/module/wave_synth/k_noise";
 
 static void
 wave_synth_sanitize_args(WaveSynthArgs *args)
@@ -949,6 +1026,8 @@ wave_synth_sanitize_args(WaveSynthArgs *args)
     args->amplitude_noise = CLAMP(args->amplitude_noise, 0.0, 1.0);
     args->k = CLAMP(args->k, 0.01, 1000.0);
     args->k_noise = CLAMP(args->k_noise, 0.0, 1.0);
+    args->decay = CLAMP(args->decay, -5.0, 0.0);
+    args->decay_noise = CLAMP(args->decay_noise, 0.0, 1.0);
 }
 
 static void
@@ -977,6 +1056,9 @@ wave_synth_load_args(GwyContainer *container,
                                      &args->amplitude_noise);
     gwy_container_gis_double_by_name(container, k_key, &args->k);
     gwy_container_gis_double_by_name(container, k_noise_key, &args->k_noise);
+    gwy_container_gis_double_by_name(container, decay_key, &args->decay);
+    gwy_container_gis_double_by_name(container, decay_noise_key,
+                                     &args->decay_noise);
     wave_synth_sanitize_args(args);
 
     args->wave_table = g_new(gfloat, 2*APPROX_WAVE_SIZE);
@@ -1012,6 +1094,9 @@ wave_synth_save_args(GwyContainer *container,
                                      args->amplitude_noise);
     gwy_container_set_double_by_name(container, k_key, args->k);
     gwy_container_set_double_by_name(container, k_noise_key, args->k_noise);
+    gwy_container_set_double_by_name(container, decay_key, args->decay);
+    gwy_container_set_double_by_name(container, decay_noise_key,
+                                     args->decay_noise);
 
     gwy_dimensions_save_args(dimsargs, container, prefix);
 }
diff --git a/modules/process/wpour_mark.c b/modules/process/wpour_mark.c
index 57022b6..e1561dd 100644
--- a/modules/process/wpour_mark.c
+++ b/modules/process/wpour_mark.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: wpour_mark.c 18537 2016-03-28 18:11:19Z yeti-dn $
+ *  @(#) $Id: wpour_mark.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2014 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -188,12 +188,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Segments image using watershed with pre- and postprocessing."),
     "Yeti <yeti at gwyddion.net>",
-    "1.0",
+    "1.1",
     "David Nečas (Yeti)",
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, wpour_mark)
 
 static gboolean
 module_register(void)
@@ -302,7 +302,7 @@ wpour_dialog(WPourArgs *args,
     controls.mlayer = gwy_data_view_get_alpha_layer(GWY_DATA_VIEW(controls.view));
     gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4);
 
-    table = gtk_table_new(10, 4, FALSE);
+    table = gtk_table_new(10, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -310,14 +310,14 @@ wpour_dialog(WPourArgs *args,
     row = 0;
 
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Preprocessing")),
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     gtkobj = gtk_adjustment_new(args->blur_fwhm, 0.0, 20.0, 0.01, 0.1, 0);
     controls.blur_fwhm = GTK_ADJUSTMENT(gtkobj);
     g_object_set_data(G_OBJECT(gtkobj), "target", &args->blur_fwhm);
-    gwy_table_attach_hscale(table, row,
-                            _("Gaussian _smoothing:"), "px", gtkobj,
+    gwy_table_attach_adjbar(table, row,
+                            _("Gaussian _smoothing:"), _("px"), gtkobj,
                             GWY_HSCALE_SQRT);
     g_signal_connect_swapped(gtkobj, "value-changed",
                              G_CALLBACK(wpour_update_double), &controls);
@@ -346,27 +346,27 @@ wpour_dialog(WPourArgs *args,
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
 
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Postprocessing")),
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
 
     gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Options")),
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.inverted = gtk_check_button_new_with_mnemonic(_("_Invert height"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.inverted),
                                  args->inverted);
     gtk_table_attach(GTK_TABLE(table), controls.inverted,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.inverted, "toggled",
                              G_CALLBACK(inverted_changed), &controls);
     row++;
 
     controls.color_button = create_mask_color_button(controls.mydata, dialog,
                                                      0);
-    gwy_table_attach_hscale(table, row, _("_Mask color:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Mask color:"), NULL,
                             GTK_OBJECT(controls.color_button),
                             GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
@@ -379,9 +379,9 @@ wpour_dialog(WPourArgs *args,
                                   _("Preprocessed image"),
                                   IMAGE_PREVIEW_PREPROC,
                                   NULL);
-    gwy_table_attach_hscale(table, row++, _("_Image preview:"), NULL,
+    gwy_table_attach_adjbar(table, row++, _("_Image preview:"), NULL,
                             GTK_OBJECT(controls.image_preview),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
 
     controls.mask_preview
         = gwy_enum_combo_box_newl(G_CALLBACK(mask_preview_changed), &controls,
@@ -393,9 +393,9 @@ wpour_dialog(WPourArgs *args,
                                   _("Postprocessed"),
                                   MASK_PREVIEW_POSTPROCESSED,
                                   NULL);
-    gwy_table_attach_hscale(table, row++, _("_Mask preview:"), NULL,
+    gwy_table_attach_adjbar(table, row++, _("_Mask preview:"), NULL,
                             GTK_OBJECT(controls.mask_preview),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
 
     controls.update
         = gwy_enum_combo_box_newl(G_CALLBACK(update_changed), &controls,
@@ -407,9 +407,9 @@ wpour_dialog(WPourArgs *args,
                                   _("Preprocess and mark"),
                                   UPDATE_MARK,
                                   NULL);
-    gwy_table_attach_hscale(table, row++, _("Instant:"), NULL,
+    gwy_table_attach_adjbar(table, row++, _("Instant:"), NULL,
                             GTK_OBJECT(controls.update),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     controls.in_init = FALSE;
@@ -538,7 +538,7 @@ table_attach_threshold(GtkWidget *table, gint *row, const gchar *name,
 
     adj = gtk_adjustment_new(*value, 0.0, 100.0, 0.01, 1.0, 0);
     g_object_set_data(G_OBJECT(adj), "target", value);
-    gwy_table_attach_hscale(table, *row, name, "%", adj, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, *row, name, "%", adj, GWY_HSCALE_DEFAULT);
     g_signal_connect_swapped(adj, "value-changed",
                              G_CALLBACK(wpour_update_double), controls);
     (*row)++;
diff --git a/modules/process/xydenoise.c b/modules/process/xydenoise.c
index 4e4a414..2c24997 100644
--- a/modules/process/xydenoise.c
+++ b/modules/process/xydenoise.c
@@ -30,6 +30,7 @@
 #include <libgwymodule/gwymodule-process.h>
 #include <libgwydgets/gwydgetutils.h>
 #include <libgwydgets/gwycombobox.h>
+#include <libgwydgets/gwystock.h>
 #include <app/gwymoduleutils.h>
 #include <app/gwyapp.h>
 
@@ -61,7 +62,7 @@ static GwyModuleInfo module_info = {
     "2012",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, xydenoise)
 
 static gboolean
 module_register(void)
@@ -69,7 +70,7 @@ module_register(void)
     gwy_process_func_register("xydenoise",
                               (GwyProcessFunc)&xydenoise,
                               N_("/M_ultidata/_XY denoise..."),
-                              NULL,
+                              GWY_STOCK_XY_DENOISE,
                               XYDENOISE_RUN_MODES,
                               GWY_MENU_FLAG_DATA,
                               N_("Denoises horizontal/vertical measurement."));
@@ -106,7 +107,7 @@ xydenoise_dialog(XYdenoiseArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(9, 4, FALSE);
+    table = gtk_table_new(1, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -121,8 +122,8 @@ xydenoise_dialog(XYdenoiseArgs *args)
     g_signal_connect(chooser, "changed",
                      G_CALLBACK(xydenoise_data_cb), &args->op2);
     xydenoise_data_cb(GWY_DATA_CHOOSER(chooser), &args->op2);
-    gwy_table_attach_hscale(table, row, _("Second direction:"), NULL,
-                            GTK_OBJECT(chooser), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("Second direction:"), NULL,
+                            GTK_OBJECT(chooser), GWY_HSCALE_WIDGET_NO_EXPAND);
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
     row++;
 
diff --git a/modules/process/xyzize.c b/modules/process/xyzize.c
index 1ade991..5c89dd6 100644
--- a/modules/process/xyzize.c
+++ b/modules/process/xyzize.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: xyzize.c 18951 2016-09-12 08:35:17Z yeti-dn $
+ *  @(#) $Id: xyzize.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -45,7 +45,7 @@ static GwyModuleInfo module_info = {
     "2016",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, xyzize)
 
 static gboolean
 module_register(void)
diff --git a/modules/pygwy/Makefile.am b/modules/pygwy/Makefile.am
index 19cfbfb..49b64fc 100644
--- a/modules/pygwy/Makefile.am
+++ b/modules/pygwy/Makefile.am
@@ -1,4 +1,4 @@
-# @(#) $Id: Makefile.am 19213 2016-11-09 08:53:16Z yeti-dn $
+# @(#) $Id: Makefile.am 20158 2017-08-03 15:20:40Z yeti-dn $
 
 moduledir = $(pkglibdir)/modules
 pygwyutildir = $(pkgdatadir)/pygwy
@@ -30,6 +30,7 @@ PYGWY_H_FILES = \
 	$(top_srcdir)/libprocess/peaks.h \
 	$(top_srcdir)/libprocess/simplefft.h \
 	$(top_srcdir)/libprocess/spectra.h \
+	$(top_srcdir)/libprocess/spline.h \
 	$(top_srcdir)/libprocess/stats.h \
 	$(top_srcdir)/libprocess/surface.h \
 	$(top_srcdir)/libprocess/tip.h \
@@ -192,8 +193,8 @@ EXTRA_DIST = \
 	override.defs \
 	pygwy-codegen.py \
 	pygwy-generate-doc.py \
-	pygwy-fix-defs.py \
-	pygwy-fix-defs.sed \
+	pygwy-fix-defs-1.py \
+	pygwy-fix-defs-2.py \
 	gwyutils.py
 
 if OS_MSWIN
@@ -220,12 +221,12 @@ if ENABLE_PYGWY
 BUILT_SOURCES = pygwywrap.c
 pygwy_la_SOURCES = pygwy.c wrap_calls.c pygwy-console.c
 pygwy_la_CFLAGS = @COMMON_CFLAGS@ @PYTHON_EXTRA_CFLAGS@ @GTKSOURCEVIEW_CFLAGS@ $(PYTHON_INCLUDES) $(PYGTK_CFLAGS)
-pygwy_la_LIBADD = $(module_libadd) $(PYTHON_LIBS) $(PYGTK_LIBS) @GTKSOURCEVIEW_LIBS@
+pygwy_la_LIBADD = $(module_libadd) $(PYTHON_LDFLAGS) $(PYGTK_LIBS) @GTKSOURCEVIEW_LIBS@
 
-pygwy.defs: $(PYGWY_H_FILES) Makefile.am pygwy-fix-defs.py pygwy-fix-defs.sed extra.defs
+pygwy.defs: $(PYGWY_H_FILES) Makefile.am pygwy-fix-defs-1.py pygwy-fix-defs-2.py extra.defs
 	$(AM_V_GEN)$(PYTHON) $(PYGTK_CODEGENDIR)/h2def.py $(PYGWY_H_FILES) \
-		| sed -f pygwy-fix-defs.sed >pygwy.defs.tmp
-	$(PYTHON) $(srcdir)/pygwy-fix-defs.py --codegendir=$(PYGTK_CODEGENDIR) >pygwy.defs
+		| $(PYTHON) $(srcdir)/pygwy-fix-defs-1.py >pygwy.defs.tmp
+	$(PYTHON) $(srcdir)/pygwy-fix-defs-2.py --codegendir=$(PYGTK_CODEGENDIR) >pygwy.defs
 	rm pygwy.defs.tmp
 
 pygwy.lang: pygwy.defs override.defs
@@ -262,10 +263,11 @@ gwy_la_LIBADD = \
 	@PNG_LIBS@ @ZLIB@ @BZIP2@ @EXR_LIBS@ @XML2_LIBS@ @MINIZIP_LIBS@ @CFITSIO_LIBS@
 
 gwy_la_LDFLAGS = -avoid-version -module $(no_undefined)
+if MODULE_DEPENDENCIES
+gwy_la_LDFLAGS += $(PYTHON_LDFLAGS)
+endif
 if OS_DARWIN
 gwy_la_LDFLAGS += -undefined dynamic_lookup
-else
-gwy_la_LIBADD += $(PYTHON_LIBS)
 endif
 
 if OS_MSWIN
diff --git a/modules/pygwy/Makefile.in b/modules/pygwy/Makefile.in
index b450d94..b191adc 100644
--- a/modules/pygwy/Makefile.in
+++ b/modules/pygwy/Makefile.in
@@ -14,7 +14,7 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 19213 2016-11-09 08:53:16Z yeti-dn $
+# @(#) $Id: Makefile.am 20158 2017-08-03 15:20:40Z yeti-dn $
 
 
 
@@ -93,8 +93,8 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 @ENABLE_PYGWY_FALSE at am__append_1 = pygwy.c gwy.c pygwy-console.c wrap_calls.c
- at ENABLE_PYGWY_TRUE@@OS_DARWIN_TRUE at am__append_2 = -undefined dynamic_lookup
- at ENABLE_PYGWY_TRUE@@OS_DARWIN_FALSE at am__append_3 = $(PYTHON_LIBS)
+ at ENABLE_PYGWY_TRUE@@MODULE_DEPENDENCIES_TRUE at am__append_2 = $(PYTHON_LDFLAGS)
+ at ENABLE_PYGWY_TRUE@@OS_DARWIN_TRUE at am__append_3 = -undefined dynamic_lookup
 subdir = modules/pygwy
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/gconf-2.m4 \
@@ -146,8 +146,6 @@ am__installdirs = "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(pyexecdir)" \
 	"$(DESTDIR)$(langdir)" "$(DESTDIR)$(pygwyutildir)"
 LTLIBRARIES = $(module_LTLIBRARIES) $(pyexec_LTLIBRARIES)
 am__DEPENDENCIES_1 =
- at ENABLE_PYGWY_TRUE@@OS_DARWIN_FALSE at am__DEPENDENCIES_2 =  \
- at ENABLE_PYGWY_TRUE@@OS_DARWIN_FALSE@	$(am__DEPENDENCIES_1)
 @ENABLE_PYGWY_TRUE at gwy_la_DEPENDENCIES =  \
 @ENABLE_PYGWY_TRUE@	$(top_builddir)/app/libgwyapp2.la \
 @ENABLE_PYGWY_TRUE@	$(top_builddir)/libdraw/libgwydraw2.la \
@@ -155,7 +153,7 @@ am__DEPENDENCIES_1 =
 @ENABLE_PYGWY_TRUE@	$(top_builddir)/libgwydgets/libgwydgets2.la \
 @ENABLE_PYGWY_TRUE@	$(top_builddir)/libgwymodule/libgwymodule2.la \
 @ENABLE_PYGWY_TRUE@	$(top_builddir)/libprocess/libgwyprocess2.la \
- at ENABLE_PYGWY_TRUE@	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+ at ENABLE_PYGWY_TRUE@	$(am__DEPENDENCIES_1)
 am__gwy_la_SOURCES_DIST = gwy.c wrap_calls.c
 @ENABLE_PYGWY_TRUE at am_gwy_la_OBJECTS = gwy_la-gwy.lo \
 @ENABLE_PYGWY_TRUE@	gwy_la-wrap_calls.lo
@@ -168,14 +166,14 @@ gwy_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(gwy_la_CFLAGS) $(CFLAGS) \
 	$(gwy_la_LDFLAGS) $(LDFLAGS) -o $@
 @ENABLE_PYGWY_TRUE at am_gwy_la_rpath = -rpath $(pyexecdir)
- at MODULE_DEPENDENCIES_TRUE@am__DEPENDENCIES_3 =  \
+ at MODULE_DEPENDENCIES_TRUE@am__DEPENDENCIES_2 =  \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/app/libgwyapp2.la \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libdraw/libgwydraw2.la \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libgwyddion/libgwyddion2.la \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libgwydgets/libgwydgets2.la \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libgwymodule/libgwymodule2.la \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libprocess/libgwyprocess2.la
- at ENABLE_PYGWY_TRUE@pygwy_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \
+ at ENABLE_PYGWY_TRUE@pygwy_la_DEPENDENCIES = $(am__DEPENDENCIES_2) \
 @ENABLE_PYGWY_TRUE@	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
 am__pygwy_la_SOURCES_DIST = pygwy.c wrap_calls.c pygwy-console.c
 @ENABLE_PYGWY_TRUE at am_pygwy_la_OBJECTS = pygwy_la-pygwy.lo \
@@ -289,10 +287,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -302,6 +297,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -326,7 +323,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -384,6 +383,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -392,17 +392,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -516,6 +512,7 @@ PYGWY_H_FILES = \
 	$(top_srcdir)/libprocess/peaks.h \
 	$(top_srcdir)/libprocess/simplefft.h \
 	$(top_srcdir)/libprocess/spectra.h \
+	$(top_srcdir)/libprocess/spline.h \
 	$(top_srcdir)/libprocess/stats.h \
 	$(top_srcdir)/libprocess/surface.h \
 	$(top_srcdir)/libprocess/tip.h \
@@ -670,8 +667,8 @@ EXTRA_DIST = \
 	override.defs \
 	pygwy-codegen.py \
 	pygwy-generate-doc.py \
-	pygwy-fix-defs.py \
-	pygwy-fix-defs.sed \
+	pygwy-fix-defs-1.py \
+	pygwy-fix-defs-2.py \
 	gwyutils.py
 
 @OS_MSWIN_TRUE at no_undefined = -no-undefined
@@ -690,23 +687,24 @@ AM_LDFLAGS = -avoid-version -module $(no_undefined)
 @ENABLE_PYGWY_TRUE at BUILT_SOURCES = pygwywrap.c
 @ENABLE_PYGWY_TRUE at pygwy_la_SOURCES = pygwy.c wrap_calls.c pygwy-console.c
 @ENABLE_PYGWY_TRUE at pygwy_la_CFLAGS = @COMMON_CFLAGS@ @PYTHON_EXTRA_CFLAGS@ @GTKSOURCEVIEW_CFLAGS@ $(PYTHON_INCLUDES) $(PYGTK_CFLAGS)
- at ENABLE_PYGWY_TRUE@pygwy_la_LIBADD = $(module_libadd) $(PYTHON_LIBS) $(PYGTK_LIBS) @GTKSOURCEVIEW_LIBS@
+ at ENABLE_PYGWY_TRUE@pygwy_la_LIBADD = $(module_libadd) $(PYTHON_LDFLAGS) $(PYGTK_LIBS) @GTKSOURCEVIEW_LIBS@
 @ENABLE_PYGWY_TRUE at gwy_la_SOURCES = gwy.c wrap_calls.c
 @ENABLE_PYGWY_TRUE at gwy_la_CFLAGS = @COMMON_CFLAGS@ @PYTHON_EXTRA_CFLAGS@ $(PYTHON_INCLUDES) $(PYGTK_CFLAGS)
 # Link with all libraries modules are linked with.  This is excessive but done
 # to prevent some nested dlopening ‘can't find DLL’ problems in Win32.
- at ENABLE_PYGWY_TRUE@gwy_la_LIBADD = $(top_builddir)/app/libgwyapp2.la \
+ at ENABLE_PYGWY_TRUE@gwy_la_LIBADD = \
+ at ENABLE_PYGWY_TRUE@	$(top_builddir)/app/libgwyapp2.la \
 @ENABLE_PYGWY_TRUE@	$(top_builddir)/libdraw/libgwydraw2.la \
 @ENABLE_PYGWY_TRUE@	$(top_builddir)/libgwyddion/libgwyddion2.la \
 @ENABLE_PYGWY_TRUE@	$(top_builddir)/libgwydgets/libgwydgets2.la \
 @ENABLE_PYGWY_TRUE@	$(top_builddir)/libgwymodule/libgwymodule2.la \
 @ENABLE_PYGWY_TRUE@	$(top_builddir)/libprocess/libgwyprocess2.la \
- at ENABLE_PYGWY_TRUE@	$(PYGTK_LIBS) @GTK_LIBS@ @PNG_LIBS@ @ZLIB@ \
- at ENABLE_PYGWY_TRUE@	@BZIP2@ @EXR_LIBS@ @XML2_LIBS@ \
- at ENABLE_PYGWY_TRUE@	@MINIZIP_LIBS@ @CFITSIO_LIBS@ \
- at ENABLE_PYGWY_TRUE@	$(am__append_3)
+ at ENABLE_PYGWY_TRUE@	$(PYGTK_LIBS) @GTK_LIBS@ \
+ at ENABLE_PYGWY_TRUE@	@PNG_LIBS@ @ZLIB@ @BZIP2@ @EXR_LIBS@ @XML2_LIBS@ @MINIZIP_LIBS@ @CFITSIO_LIBS@
+
 @ENABLE_PYGWY_TRUE at gwy_la_LDFLAGS = -avoid-version -module \
- at ENABLE_PYGWY_TRUE@	$(no_undefined) $(am__append_2)
+ at ENABLE_PYGWY_TRUE@	$(no_undefined) $(am__append_2) \
+ at ENABLE_PYGWY_TRUE@	$(am__append_3)
 CLEANFILES = gwy.py gwy.pyc gwy.pyo pygwy.lang boxed.override
 DISTCLEANFILES = pygwy.defs pygwywrap.c
 all: $(BUILT_SOURCES)
@@ -1163,10 +1161,10 @@ uninstall-am: uninstall-langDATA uninstall-moduleLTLIBRARIES \
 .PRECIOUS: Makefile
 
 
- at ENABLE_PYGWY_TRUE@pygwy.defs: $(PYGWY_H_FILES) Makefile.am pygwy-fix-defs.py pygwy-fix-defs.sed extra.defs
+ at ENABLE_PYGWY_TRUE@pygwy.defs: $(PYGWY_H_FILES) Makefile.am pygwy-fix-defs-1.py pygwy-fix-defs-2.py extra.defs
 @ENABLE_PYGWY_TRUE@	$(AM_V_GEN)$(PYTHON) $(PYGTK_CODEGENDIR)/h2def.py $(PYGWY_H_FILES) \
- at ENABLE_PYGWY_TRUE@		| sed -f pygwy-fix-defs.sed >pygwy.defs.tmp
- at ENABLE_PYGWY_TRUE@	$(PYTHON) $(srcdir)/pygwy-fix-defs.py --codegendir=$(PYGTK_CODEGENDIR) >pygwy.defs
+ at ENABLE_PYGWY_TRUE@		| $(PYTHON) $(srcdir)/pygwy-fix-defs-1.py >pygwy.defs.tmp
+ at ENABLE_PYGWY_TRUE@	$(PYTHON) $(srcdir)/pygwy-fix-defs-2.py --codegendir=$(PYGTK_CODEGENDIR) >pygwy.defs
 @ENABLE_PYGWY_TRUE@	rm pygwy.defs.tmp
 
 @ENABLE_PYGWY_TRUE at pygwy.lang: pygwy.defs override.defs
diff --git a/modules/pygwy/README.pygwy b/modules/pygwy/README.pygwy
index c92b824..226ddf4 100644
--- a/modules/pygwy/README.pygwy
+++ b/modules/pygwy/README.pygwy
@@ -3,7 +3,7 @@ Pygwy - Python binding for Gwyddion
 
 Requirements
 ============
-Python >= 2.4 
+Python >= 2.4
 Pygtk >= 2.10, PyGObject >= 2.12, PyCairo >= 1.2: http://www.pygtk.org/
 
 Compilation
@@ -14,7 +14,7 @@ By configure script:
 Script location
 ================
 The Python modules are stored in a Gwyddion user directory (~/.gwyddion/pygwy
-or %USER_DIRECTORY%/gwyddion/pygwy). The 'pygwy' directory is automatically 
+or %USER_DIRECTORY%/gwyddion/pygwy). The 'pygwy' directory is automatically
 created when it does not exist.
 
 Documentation and API can be generated by using command 'make pygwy-doc' from
@@ -39,7 +39,7 @@ File module is used to import and export data. Complete module implements
 following functions:
 - detect_by_name(filename)
   filename: string containing full path to file
-  return value: return score <0,100> where value 0 reflects unknown type, 
+  return value: return score <0,100> where value 0 reflects unknown type,
                 value 100 reflects known type
 
 - detect_by_content(filename, head, tail, filesize)
@@ -47,7 +47,7 @@ following functions:
   head: string containing few bytes from beginning of the file
   tail: string containing few bytes from end of the file
   filesize: lenght of file in bytes
-  return value: return score <0,100> where value 0 reflects unknown type, 
+  return value: return score <0,100> where value 0 reflects unknown type,
                 value 100 reflects known type
 
 - load(filename)
@@ -57,7 +57,7 @@ following functions:
 - save(data, filename)
   data: container of data used for export
   filename: full path to output file
-  return value: True when export is successful, False otherwise 
+  return value: True when export is successful, False otherwise
 
 
 Volume module
@@ -71,12 +71,12 @@ the current data container.
 
 Module variables
 ================
-Every module must have defined variables which are used to determine 
+Every module must have defined variables which are used to determine
 the module type, location in menu and description.
 
 Required variables for file type module (example):
 plugin_type = "FILE"
-plugin_desc = "High definition stable format store (.hdsf)" 
+plugin_desc = "High definition stable format store (.hdsf)"
 
 Required variables for process type module (example):
 plugin_menu = "/Poodle" # the plugin will be located in Data Process/Poodle
@@ -88,7 +88,7 @@ plugin_type = "VOLUME"
 
 Module debuging
 ===============
-Currently there is not much options to perform module debugging. 
+Currently there is not much options to perform module debugging.
 Only Python exceptions are written to standard output.
 
 Example process module
@@ -142,12 +142,12 @@ def load(filename):
 
 def save(data, filename):
    f = open(filename, "w")
-   datafield_num = 1   
+   datafield_num = 1
    for key in data.keys():
       if isinstance(data.get_object(key), gwy.DataField):
          d = data.get_object(key)
          f.write("Datafield "+ str(datafield_num) + '\n')
-         datafield_num += 1         
+         datafield_num += 1
          for row in range(d.get_yres()):
             for col in range(d.get_xres()):
                f.write(str(d.get_val(col, row))+'\n')
@@ -210,7 +210,7 @@ Bending C API to work in Python
    and then putting the generic code than handles them here.  It will
    automatically appear in methods.
 
-3. Modifying the .defs file: in extra.defs and pygwy-fix-defs.py.
+3. Modifying the .defs file: in extra.defs and pygwy-fix-defs-{1,2}.py.
 
    Extra definition in extra.defs are simply included in pygwy.defs.  Some
    things, such as boxed types, are easier to just write directly here.  For
@@ -220,7 +220,7 @@ Bending C API to work in Python
    Here we rewrite argument types and add attributes to arguments or functions.
    Arguments and functions can be skipped here or attain default values.
 
-   In addition, pygwy-fix-defs.py generates some direct code into
+   In addition, pygwy-fix-defs-2.py generates some direct code into
    boxed.override defining setters for plain C structs.  There may be some
    reasonable way of teaching codegen to do this automatically by patching
    Wrapper.write_getsets() but this may be too fragile.
@@ -239,12 +239,12 @@ easily into Python:
 
 A) Plain structs and pointer types.  We handle them by boxing them in C.
    Explicit boxed type record in extra.defs is necessary.  Setters for some
-   field types are directly generated by pygwy-fix-defs.py, other have to
+   field types are directly generated by pygwy-fix-defs-2.py, other have to
    be explicitly defined in pygwy.override.
 
 B) Multiple return values, passed as pointers to things-to-fill.  This is now
    relatively simple.  We rewrite them to GwyWhateverOutArg in
-   pygwy-fix-defs.py and the function writer in pygwy-codegen.py knows how
+   pygwy-fix-defs-2.py and the function writer in pygwy-codegen.py knows how
    to sort arguments to input and output and write a function that returns a
    tuple if necessary.
 
diff --git a/modules/pygwy/extra.defs b/modules/pygwy/extra.defs
index 36e4e01..75f170e 100644
--- a/modules/pygwy/extra.defs
+++ b/modules/pygwy/extra.defs
@@ -52,6 +52,11 @@
   (gtype-id "GWY_TYPE_PEAKS")
 )
 
+(define-boxed Spline
+  (c-name "GwySpline")
+  (gtype-id "GWY_TYPE_SPLINE")
+)
+
 (define-method set_string_by_name
   (of-object "GwyContainer")
   (c-name "gwy_container_set_const_string_by_name")
@@ -72,3 +77,23 @@
   )
 )
 
+(define-enum CWT2DWaveletType
+  (in-module "Gwy")
+  (c-name "Gwy2DCWTWaveletType")
+  (gtype-id "GWY_TYPE_2D_CWT_WAVELET_TYPE")
+  (values
+    '("gauss" "GWY_2DCWT_GAUSS")
+    '("hat" "GWY_2DCWT_HAT")
+  )
+)
+
+(define-pointer ComputationState
+  (c-name "GwyComputationState")
+  (gtype-id "GWY_TYPE_COMPUTATION_STATE")
+)
+
+(define-pointer TipModelPreset
+  (c-name "GwyTipModelPreset")
+  (gtype-id "GWY_TYPE_TIP_MODEL_PRESET")
+)
+
diff --git a/modules/pygwy/gwy.c b/modules/pygwy/gwy.c
index a3b9deb..5ddb3b3 100644
--- a/modules/pygwy/gwy.c
+++ b/modules/pygwy/gwy.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: gwy.c 19289 2016-11-18 10:30:23Z yeti-dn $
+ *  @(#) $Id: gwy.c 19573 2017-04-04 09:40:08Z yeti-dn $
  *  Copyright (C) 2012-2016 David Necas (Yeti), Petr Klapetek, Jozef Vesely.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, vesely at gjh.sk.
  *
@@ -20,7 +20,7 @@
  */
 
 #include "config.h"
-#include <pygtk-2.0/pygobject.h>
+#include <pygobject.h>
 #include <app/gwyapp.h>
 #include "wrap_calls.h"
 #include "pygwy.h"
@@ -72,7 +72,8 @@ load_modules(void)
 }
 
 /* FIXME: It would be better to just fix the flags using RTLD_NOLOAD because
- * the libraries are surely loaded. */
+ * the libraries are surely loaded.  But that is not possible using the
+ * GModule API.  */
 static gboolean
 reload_libraries(void)
 {
@@ -83,12 +84,20 @@ reload_libraries(void)
         "libgwyddion2", "libgwyprocess2", "libgwydraw2", "libgwydgets2",
         "libgwymodule2", "libgwyapp2",
     };
+#ifdef __APPLE__
+    /* Darwin has soname_spec='$libname$release$major$shared_ext' */
+    static const gchar *soname_format = "%s.0.%s";
+#else
+    /* ELF systems generally have
+     * soname_spec='$libname$release$shared_ext$major' */
+    static const gchar *soname_format = "%s.%s.0";
+#endif
     guint i;
 
     for (i = 0; i < G_N_ELEMENTS(gwyddion_libs); i++) {
-        gchar *filename = g_strconcat(gwyddion_libs[i],
-                                      ".", GWY_SHARED_LIBRARY_EXTENSION, ".0",
-                                      NULL);
+        gchar *filename = g_strdup_printf(soname_format,
+                                          gwyddion_libs[i],
+                                          GWY_SHARED_LIBRARY_EXTENSION);
         GModule *modhandle = g_module_open(filename, G_MODULE_BIND_LAZY);
         if (!modhandle) {
             gchar *excstr = g_strdup_printf("Cannot dlopen() %s.", filename);
diff --git a/modules/pygwy/pygwy-codegen.py b/modules/pygwy/pygwy-codegen.py
index 60c747e..acb11bb 100644
--- a/modules/pygwy/pygwy-codegen.py
+++ b/modules/pygwy/pygwy-codegen.py
@@ -1,5 +1,5 @@
 #!/usr/bin/python
-# $Id: pygwy-codegen.py 19172 2016-11-03 15:37:05Z yeti-dn $
+# $Id: pygwy-codegen.py 20146 2017-08-02 20:31:56Z yeti-dn $
 # Runtime for pygtk module codegen.py and overriden functions for Gwyddion data
 # types.
 # Public domain
@@ -320,9 +320,49 @@ class GwyIntArrayOutArg(argtypes.ArgType):
     def write_param(self, ptype, pname, pdflt, pnull, info):
         info.varlist.add('GArray', '*'+pname)
         info.arglist.append(pname)
-        info.codebefore.append('    '+pname+' = g_array_new(FALSE, FALSE, sizeof(gdouble));\n')
+        info.codebefore.append('    '+pname+' = g_array_new(FALSE, FALSE, sizeof(gint));\n')
         info.codeafter.append('    PyTuple_SetItem(py_tuple_ret, py_tuple_index++, create_list_consume_int_garray('+pname+'));\n')
 
+class GwyStringArray(argtypes.ArgType):
+    def write_param(self, ptype, pname, pdflt, pnull, info):
+        # NB: We do not free the GArray.  The callee must always do it.  This
+        # makes memory leaks less likely when we raise exceptions and have
+        # multiple arrays.
+        info.varlist.add('GArray', '*'+pname + ' = NULL');
+        info.varlist.add('PyObject', '*'+pname+'_pyobj')
+        if pnull:
+            info.add_parselist('|O', ['&'+pname+'_pyobj'], [pname])
+        else:
+            info.add_parselist('O', ['&'+pname+'_pyobj'], [pname])
+        info.arglist.append(pname)
+        xnull = pname + '_pyobj && ' if pnull else ''
+        info.codebefore.append('    if ('+xnull+'!('+pname+' = create_string_garray_from_sequence('+pname+'_pyobj))) {\n')
+        info.codebefore.append('        PyErr_SetString(PyExc_TypeError, "Parameter \''+pname+'\' must be a sequence of strings");\n')
+        info.codebefore.append('        return NULL;\n')
+        info.codebefore.append('    }\n')
+
+    def write_return(self, ptype, ownsreturn, info):
+        info.varlist.add('GArray', '*ret')
+        info.codeafter.append('    return create_list_consume_string_garray(ret);\n')
+
+class GwyConstStringArray(argtypes.ArgType):
+    def write_param(self, ptype, pname, pdflt, pnull, info):
+        # We cannot get input const array because strings from Python are
+        # duplicated to handle the string/unicode duality.
+        assert not 'Reached'
+
+    def write_return(self, ptype, ownsreturn, info):
+        info.varlist.add('GArray', '*ret')
+        info.codeafter.append('    return create_list_consume_const_string_garray(ret);\n')
+
+# Pointer/boxed argument types
+class GwyConstPointerArg(argtypes.PointerArg):
+    "Pointers that have const (like presets)."
+    def write_return(self, ptype, ownsreturn, info):
+        assert ptype[-1] == '*'
+        info.varlist.add('const '+self.typename, '*ret')
+        info.codeafter.append('    return pyg_pointer_new('+self.typecode+', (gpointer)ret);\n')
+
 # GTK+ types we need because they appear as arguments?
 # We certainly get `No ArgType' messages for types we do not list here.
 argtypes.matcher.register_object('GdkGC', None, 'GDK_TYPE_GC')
@@ -378,6 +418,11 @@ argtypes.matcher.register('GwyDoubleArray*', GwyDoubleArray())
 argtypes.matcher.register('GwyDoubleArrayOutArg', GwyDoubleArrayOutArg())
 argtypes.matcher.register('GwyIntArray*', GwyIntArray())
 argtypes.matcher.register('GwyIntArrayOutArg', GwyIntArrayOutArg())
+argtypes.matcher.register('GwyStringArray*', GwyStringArray())
+argtypes.matcher.register('GwyConstStringArray*', GwyConstStringArray())
+
+# Pointer/boxed stuff
+argtypes.matcher.register('const-GwyTipModelPreset*', GwyConstPointerArg('GwyTipModelPreset', 'GWY_TYPE_TIP_MODEL_PRESET'))
 
 # Run codegen
 sys.exit(main(sys.argv))
diff --git a/modules/pygwy/pygwy-console.c b/modules/pygwy/pygwy-console.c
index 399d492..7e47b13 100644
--- a/modules/pygwy/pygwy-console.c
+++ b/modules/pygwy/pygwy-console.c
@@ -1,7 +1,9 @@
 /*
- *  @(#) $Id: pygwy-console.c 19265 2016-11-15 12:22:37Z yeti-dn $
+ *  @(#) $Id: pygwy-console.c 19331 2016-11-29 23:17:13Z yeti-dn $
  *  Copyright (C) 2008 Jan Horak
  *  E-mail: xhorak at gmail.com
+ *  Copyright (C) 2014-2016 David Necas (Yeti).
+ *  E-mail: yeti at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -22,8 +24,8 @@
  */
 
 #include "config.h"
-#include "pygwy-console.h"
-#include "pygwy.h"
+#include <Python.h>
+#include <glib/gstdio.h>
 #include <gdk/gdkkeysyms.h>
 #include <libgwyddion/gwymacros.h>
 #include <libgwydgets/gwystock.h>
@@ -35,23 +37,65 @@
 #include <gtksourceview/gtksourcelanguagemanager.h>
 #endif
 
-static void pygwy_console_save_as_file   (GtkToolButton *btn,
-                                          gpointer user_data);
-static void pygwy_console_run            (GwyContainer *data,
-                                          GwyRunType run,
-                                          const gchar *name);
-static void pygwy_console_command_execute(GtkEntry *entry,
-                                          gpointer user_data);
-static void pygwy_console_clear_output   (GtkToolButton *btn,
-                                          gpointer user_data);
+#include "pygwy-console.h"
+#include "pygwy.h"
+
+enum {
+    NRECENT = 12
+};
+
+typedef struct {
+   GtkWidget *window;
+   PyObject *std_err;
+   PyObject *dictionary;
+   GtkWidget *console_output;
+   GtkWidget *console_file_content;
+   GtkToolItem *open_item;
+   gchar *script_filename;
+   GArray *recent_scripts;
+} PygwyConsoleSetup;
+
+static void       pygwy_console_open               (GtkToolButton *btn,
+                                                    gpointer user_data);
+static void       pygwy_console_save               (GtkToolButton *button,
+                                                    gpointer user_data);
+static void       pygwy_console_save_as            (GtkToolButton *button,
+                                                    gpointer user_data);
+static void       pygwy_console_run                (GtkToolButton *button,
+                                                    gpointer user_data);
+static void       pygwy_console                    (GwyContainer *data,
+                                                    GwyRunType run,
+                                                    const gchar *name);
+static void       pygwy_console_command_execute    (GtkEntry *entry,
+                                                    gpointer user_data);
+static void       pygwy_console_clear_output       (GtkToolButton *btn,
+                                                    gpointer user_data);
+static void       pygwy_console_append_message     (const gchar *message);
+static gboolean   pygwy_console_add_scriptfile     (const gchar *filename);
+static void       pygwy_console_load_recent        (void);
+static void       pygwy_console_save_recent        (void);
+static void       pygwy_console_rebuild_recent_menu(void);
+static GtkWidget* pygwy_console_create_recent_menu (void);
+static void       pygwy_console_open_recent        (GtkMenuItem *item,
+                                                    gpointer user_data);
 
 static PygwyConsoleSetup *console_setup = NULL;
 
 void
 pygwy_register_console(void)
 {
+    gchar *path;
+
+    path = g_build_filename(gwy_get_user_dir(), "pygwy_console", NULL);
+    if (!g_file_test(path, G_FILE_TEST_IS_DIR)) {
+        g_mkdir(path, 0700);
+        if (!g_file_test(path, G_FILE_TEST_IS_DIR))
+            g_warning("Cannot create pygwy console data directory.");
+    }
+    g_free(path);
+
     gwy_process_func_register("pygwy_console",
-                              pygwy_console_run,
+                              pygwy_console,
                               N_("/Pygwy Console"),
                               GWY_STOCK_PYGWY,
                               GWY_RUN_IMMEDIATE,
@@ -59,7 +103,7 @@ pygwy_register_console(void)
                               N_("Python wrapper console"));
 }
 
-static char*
+static const char*
 pygwy_console_run_command(const gchar *cmd, int mode)
 {
     if (!cmd) {
@@ -71,7 +115,7 @@ pygwy_console_run_command(const gchar *cmd, int mode)
         g_warning("Console setup structure is not defined!");
         return NULL;
     }
-    /* store _pygwy_stderr_redir location */
+    /* store _pygwy_output_redir location */
     pygwy_run_string(cmd,
                      mode,
                      console_setup->dictionary,
@@ -85,212 +129,6 @@ pygwy_console_run_command(const gchar *cmd, int mode)
                                                   "_pygwy_stderr_string"));
 }
 
-static void
-pygwy_console_append(gchar *msg)
-{
-    GtkTextBuffer *console_buf;
-    GtkTextIter start_iter, end_iter;
-    GtkTextView *textview;
-    GString *output;
-    GtkTextMark *end_mark;
-
-    if (!msg) {
-        g_warning("No message to append.");
-        return;
-    }
-    if (!console_setup) {
-        g_warning("Console setup structure is not defined!");
-        return;
-    }
-    /* read string which contain last command output */
-    textview = GTK_TEXT_VIEW(console_setup->console_output);
-    console_buf = gtk_text_view_get_buffer(textview);
-    gtk_text_buffer_get_bounds(console_buf, &start_iter, &end_iter);
-
-    /* get output widget content */
-    output = g_string_new(gtk_text_buffer_get_text(console_buf,
-                                                   &start_iter, &end_iter,
-                                                   FALSE));
-
-    /* append input line */
-    output = g_string_append(output, msg);
-    gtk_text_buffer_set_text(console_buf, output->str, -1);
-    g_string_free(output, TRUE);
-
-    /* scroll to end */
-    gtk_text_buffer_get_end_iter(console_buf, &end_iter);
-    end_mark = gtk_text_buffer_create_mark(console_buf, "cursor", &end_iter,
-                                           FALSE);
-    g_object_ref(end_mark);
-    gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(console_setup->console_output),
-                                 end_mark, 0.0, FALSE, 0.0, 0.0);
-    g_object_unref(end_mark);
-
-}
-
-static void
-pygwy_console_run_file(GtkToolButton *btn, gpointer user_data)
-{
-    GtkTextView *textview;
-    GtkTextBuffer *console_file_buf;
-    GtkTextIter start_iter, end_iter;
-    gchar *output, *file_info_line, *script;
-
-    textview = GTK_TEXT_VIEW(console_setup->console_file_content);
-    console_file_buf = gtk_text_view_get_buffer(textview);
-
-    file_info_line = g_strdup_printf(_(">>> Running the script above\n"));
-    pygwy_console_append(file_info_line);
-
-    gtk_text_buffer_get_bounds(console_file_buf, &start_iter, &end_iter);
-    script = gtk_text_buffer_get_text(console_file_buf,
-                                      &start_iter, &end_iter, FALSE);
-    output = pygwy_console_run_command(script, Py_file_input);
-    g_free(script);
-    pygwy_console_append(output);
-}
-
-static void
-fix_eols_to_unix(gchar *text)
-{
-    gchar *p = strchr(text, '\r');
-    guint i, j;
-
-    /* Unix */
-    if (!p)
-        return;
-
-    /* Mac */
-    if (p[1] != '\n') {
-        do {
-            *p = '\n';
-        } while ((p = strchr(p+1, '\r')));
-
-        return;
-    }
-
-    /* MS-DOS */
-    for (i = 0, j = 0; text[i]; i++) {
-        if (text[i] != '\r') {
-            text[j] = text[i];
-            j++;
-        }
-    }
-    text[j] = '\0';
-}
-
-static void
-pygwy_console_open_file(GtkToolButton *btn, gpointer user_data)
-{
-    GtkWidget *file_chooser;
-    GtkFileFilter *filter = gtk_file_filter_new();
-    GtkTextBuffer *console_file_buf;
-    GtkTextView *textview;
-
-    gtk_file_filter_add_mime_type(filter, "text/x-python");
-    gtk_file_filter_add_pattern(filter, "*.py");
-
-    file_chooser
-        = gtk_file_chooser_dialog_new(_("Open Python script"),
-                                      NULL,
-                                      GTK_FILE_CHOOSER_ACTION_OPEN,
-                                      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                      GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
-                                      NULL);
-    gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(file_chooser), filter);
-    if (gtk_dialog_run(GTK_DIALOG(file_chooser)) == GTK_RESPONSE_ACCEPT) {
-        gchar *file_content;
-        GError *err = NULL;
-
-        g_free(console_setup->script_filename);
-        console_setup->script_filename = gtk_file_chooser_get_filename
-                                               (GTK_FILE_CHOOSER(file_chooser));
-        if (!g_file_get_contents(console_setup->script_filename,
-                                 &file_content,
-                                 NULL,
-                                 &err)) {
-            gchar *message = g_strdup_printf("Cannot read content of file "
-                                             "'%s': %s",
-                                             console_setup->script_filename,
-                                             err->message);
-            g_clear_error(&err);
-            pygwy_console_append(message);
-            g_free(message);
-            g_free(console_setup->script_filename);
-        }
-        else {
-            fix_eols_to_unix(file_content);
-
-            /* read string which contain last command output */
-            textview = GTK_TEXT_VIEW(console_setup->console_file_content);
-            console_file_buf = gtk_text_view_get_buffer(textview);
-
-            /* append input line */
-            gtk_text_buffer_set_text(console_file_buf, file_content, -1);
-
-            g_free(file_content);
-        }
-    }
-    gtk_widget_destroy(GTK_WIDGET(file_chooser));
-}
-
-static void
-pygwy_console_save_file(GtkToolButton *btn, gpointer user_data)
-{
-    GtkTextView *textview;
-    GtkTextBuffer *buf;
-    GtkTextIter start_iter, end_iter;
-    gchar *script;
-    FILE *f;
-
-    if (console_setup->script_filename == NULL) {
-        pygwy_console_save_as_file(btn, user_data);
-    }
-    else {
-        textview = GTK_TEXT_VIEW(console_setup->console_file_content);
-        buf = gtk_text_view_get_buffer(textview);
-        gtk_text_buffer_get_bounds(buf, &start_iter, &end_iter);
-        script = gtk_text_buffer_get_text(buf, &start_iter, &end_iter, FALSE);
-        f = gwy_fopen(console_setup->script_filename, "wb");
-        if (f) {
-            fwrite(script, 1, strlen(script), f);
-            fclose(f);
-        }
-        else {
-            gchar *message = g_strdup_printf("Cannot open file '%s': %s",
-                                             console_setup->script_filename,
-                                             g_strerror(errno));
-            pygwy_console_append(message);
-            g_free(message);
-        }
-        g_free(script);
-    }
-}
-
-static void
-pygwy_console_save_as_file(GtkToolButton *btn, gpointer user_data)
-{
-    GtkWidget *dialog;
-
-    dialog = gtk_file_chooser_dialog_new(_("Save Script as"),
-                                         NULL,
-                                         GTK_FILE_CHOOSER_ACTION_SAVE,
-                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                         GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
-                                         NULL);
-    gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE);
-
-    /*gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), default_folder_for_saving); */
-    gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog),
-                                      "Untitled document");
-
-    if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
-        console_setup->script_filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
-        pygwy_console_save_file(btn, user_data);
-    }
-    gtk_widget_destroy(dialog);
-}
-
 static gboolean
 key_pressed(GtkWidget *widget, GdkEventKey *event,
             G_GNUC_UNUSED PygwyConsoleSetup *setup)
@@ -307,9 +145,9 @@ static void
 pygwy_console_create_gui(void)
 {
     GtkWidget *console_win, *vbox1, *console_scrolledwin, *file_scrolledwin,
-              *vpaned, *frame, *image_clear;
-    GtkWidget *entry_input, *button_bar, *button_open, *button_run,
-              *button_save, *button_save_as, *button_clearout;
+              *vpaned, *frame, *icon;
+    GtkWidget *entry_input, *button_bar;
+    GtkToolItem *item;
     GtkTextView *file_textview, *output_textview;
     PangoFontDescription *font_desc;
     GtkAccelGroup *accel_group;
@@ -321,55 +159,77 @@ pygwy_console_create_gui(void)
 #endif
 
     /* create static structure; */
-    console_setup = g_new(PygwyConsoleSetup, 1);
+    console_setup = g_new0(PygwyConsoleSetup, 1);
+    console_setup->recent_scripts = g_array_new(FALSE, FALSE, sizeof(gchar*));
+    pygwy_console_load_recent();
+
     /* create GUI */
     console_win = console_setup->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     gtk_window_set_title(GTK_WINDOW(console_win), _("Pygwy Console"));
-
-    vbox1 = gtk_vbox_new(FALSE, 0);
-    gtk_container_add(GTK_CONTAINER(console_win), vbox1);
-
-    /* buttons */
-    button_open = GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_OPEN));
-    button_save = GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_SAVE));
-    button_save_as = GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_SAVE_AS));
-    button_run = GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_EXECUTE));
-    image_clear = gtk_image_new_from_stock(GTK_STOCK_CLEAR,
-                                           GTK_ICON_SIZE_LARGE_TOOLBAR);
-    button_clearout = GTK_WIDGET(gtk_tool_button_new(image_clear,
-                                                     _("Clear Log")));
-    button_bar_tips = gtk_tooltips_new();
-    gtk_tooltips_set_tip(GTK_TOOLTIPS(button_bar_tips),
-                         button_open,
-                         _("Open script in Python language (Ctrl-O)"), "");
-    gtk_tooltips_set_tip(GTK_TOOLTIPS(button_bar_tips),
-                         button_save, _("Save script (Ctrl-S)"), "");
-    gtk_tooltips_set_tip(GTK_TOOLTIPS(button_bar_tips),
-                         button_run, _("Execute script (Ctrl-E)"), "");
     accel_group = gtk_accel_group_new();
-    gtk_widget_add_accelerator(button_run, "clicked", accel_group,
-                               GDK_E, (GdkModifierType)GDK_CONTROL_MASK,
-                               GTK_ACCEL_VISIBLE);
-    gtk_widget_add_accelerator(button_open, "clicked", accel_group,
-                               GDK_O, (GdkModifierType)GDK_CONTROL_MASK,
-                               GTK_ACCEL_VISIBLE);
-    gtk_widget_add_accelerator(button_save, "clicked", accel_group,
-                               GDK_S, (GdkModifierType)GDK_CONTROL_MASK,
-                               GTK_ACCEL_VISIBLE);
     gtk_window_add_accel_group(GTK_WINDOW(console_win), accel_group);
     g_signal_connect(console_win, "key-press-event",
                      G_CALLBACK(key_pressed), console_setup);
 
+    vbox1 = gtk_vbox_new(FALSE, 0);
+    gtk_container_add(GTK_CONTAINER(console_win), vbox1);
+
+    /* Buttons. */
     button_bar = gtk_toolbar_new();
-    gtk_toolbar_insert(GTK_TOOLBAR(button_bar), GTK_TOOL_ITEM(button_open), -1);
-    gtk_toolbar_insert(GTK_TOOLBAR(button_bar), GTK_TOOL_ITEM(button_save), -1);
-    gtk_toolbar_insert(GTK_TOOLBAR(button_bar), GTK_TOOL_ITEM(button_save_as), -1);
-    gtk_toolbar_insert(GTK_TOOLBAR(button_bar), GTK_TOOL_ITEM(button_run), -1);
-    gtk_toolbar_insert(GTK_TOOLBAR(button_bar), GTK_TOOL_ITEM(button_clearout), -1);
+    button_bar_tips = gtk_tooltips_new();
     gtk_box_pack_start(GTK_BOX(vbox1), button_bar, FALSE, FALSE, 0);
     gtk_toolbar_set_style(GTK_TOOLBAR(button_bar), GTK_TOOLBAR_BOTH);
 
-    /* window */
+    /* Open. */
+    item = gtk_menu_tool_button_new_from_stock(GTK_STOCK_OPEN);
+    console_setup->open_item = item;
+    gtk_tooltips_set_tip(button_bar_tips, GTK_WIDGET(item),
+                         _("Open script in Python language (Ctrl-O)"), NULL);
+    gtk_widget_add_accelerator(GTK_WIDGET(item), "clicked", accel_group,
+                               GDK_O, GDK_CONTROL_MASK,
+                               GTK_ACCEL_VISIBLE);
+    gtk_toolbar_insert(GTK_TOOLBAR(button_bar), item, -1);
+    g_signal_connect(item, "clicked", G_CALLBACK(pygwy_console_open), NULL);
+
+    /* Save. */
+    item = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE);
+    gtk_tooltips_set_tip(button_bar_tips, GTK_WIDGET(item),
+                         _("Save script (Ctrl-S)"), NULL);
+    gtk_widget_add_accelerator(GTK_WIDGET(item), "clicked", accel_group,
+                               GDK_S, GDK_CONTROL_MASK,
+                               GTK_ACCEL_VISIBLE);
+    gtk_toolbar_insert(GTK_TOOLBAR(button_bar), item, -1);
+    g_signal_connect(item, "clicked", G_CALLBACK(pygwy_console_save), NULL);
+
+    /* Save as. */
+    item = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE_AS);
+    gtk_tooltips_set_tip(button_bar_tips, GTK_WIDGET(item),
+                         _("Save script as (Ctrl-Shift-S)"), NULL);
+    gtk_widget_add_accelerator(GTK_WIDGET(item), "clicked", accel_group,
+                               GDK_S, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
+                               GTK_ACCEL_VISIBLE);
+    gtk_toolbar_insert(GTK_TOOLBAR(button_bar), item, -1);
+    g_signal_connect(item, "clicked", G_CALLBACK(pygwy_console_save_as), NULL);
+
+    /* Run. */
+    item = gtk_tool_button_new_from_stock(GTK_STOCK_EXECUTE);
+    gtk_tooltips_set_tip(button_bar_tips, GTK_WIDGET(item),
+                         _("Execute script (Ctrl-E)"), NULL);
+    gtk_widget_add_accelerator(GTK_WIDGET(item), "clicked", accel_group,
+                               GDK_E, GDK_CONTROL_MASK,
+                               GTK_ACCEL_VISIBLE);
+    gtk_toolbar_insert(GTK_TOOLBAR(button_bar), item, -1);
+    g_signal_connect(item, "clicked", G_CALLBACK(pygwy_console_run), NULL);
+
+    /* Clear. */
+    icon = gtk_image_new_from_stock(GTK_STOCK_CLEAR,
+                                    GTK_ICON_SIZE_LARGE_TOOLBAR);
+    item = gtk_tool_button_new(icon, _("Clear Log"));
+    gtk_toolbar_insert(GTK_TOOLBAR(button_bar), item, -1);
+    g_signal_connect(item, "clicked",
+                     G_CALLBACK(pygwy_console_clear_output), NULL);
+
+    /* Text areas. */
     vpaned = gtk_vpaned_new();
     gtk_box_pack_start(GTK_BOX(vbox1), vpaned, TRUE, TRUE, 0);
     file_scrolledwin = gtk_scrolled_window_new(NULL, NULL);
@@ -387,7 +247,6 @@ pygwy_console_create_gui(void)
     gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(console_scrolledwin),
                                         GTK_SHADOW_IN);
 
-
     /* console output */
     console_setup->console_output = gtk_text_view_new();
     output_textview = GTK_TEXT_VIEW(console_setup->console_output);
@@ -434,17 +293,8 @@ pygwy_console_create_gui(void)
     /* entry widget on ENTER */
     g_signal_connect(entry_input, "activate",
                      G_CALLBACK(pygwy_console_command_execute), NULL);
-    /* open script signal connect */
-    g_signal_connect(button_open, "clicked",
-                     G_CALLBACK(pygwy_console_open_file), NULL);
-    g_signal_connect(button_run, "clicked",
-                     G_CALLBACK(pygwy_console_run_file), NULL);
-    g_signal_connect(button_save, "clicked",
-                     G_CALLBACK(pygwy_console_save_file), NULL);
-    g_signal_connect(button_save_as, "clicked",
-                     G_CALLBACK(pygwy_console_save_as_file), NULL);
-    g_signal_connect(button_clearout, "clicked",
-                     G_CALLBACK(pygwy_console_clear_output), NULL);
+
+    pygwy_console_rebuild_recent_menu();
 
     /* connect on window close() */
     g_signal_connect(console_win, "delete-event",
@@ -455,7 +305,7 @@ pygwy_console_create_gui(void)
 }
 
 static void
-pygwy_console_run(GwyContainer *data, GwyRunType run, const gchar *name)
+pygwy_console(GwyContainer *data, GwyRunType run, const gchar *name)
 {
     PyObject *d;
 
@@ -483,7 +333,7 @@ pygwy_console_run(GwyContainer *data, GwyRunType run, const gchar *name)
                      d);
 
     /* store values for closing console */
-    console_setup->std_err = PyDict_GetItemString(d, "_pygwy_stderr_redir");
+    console_setup->std_err = PyDict_GetItemString(d, "_pygwy_output_redir");
     Py_INCREF(console_setup->std_err);
     console_setup->dictionary = d;
 }
@@ -492,23 +342,373 @@ static void
 pygwy_console_command_execute(GtkEntry *entry,
                               G_GNUC_UNUSED gpointer user_data)
 {
-    gchar *input_line;
-    const gchar *command;
-    GString *output;
+    const gchar *command, *output;
+    gchar *message;
 
     command = gtk_entry_get_text(entry);
     if (!strlen(command))
         return;
 
-    input_line = g_strconcat(">>> ", command, "\n", NULL);
-    output = g_string_new(input_line);
-    g_string_append(output,
-                    pygwy_console_run_command(command, Py_single_input));
+    output = pygwy_console_run_command(command, Py_single_input);
+    message = g_strconcat(">>> ", command, "\n", output, NULL);
+    pygwy_console_append_message(message);
+    g_free(message);
+    gtk_editable_select_region(GTK_EDITABLE(entry), 0, -1);
+}
 
-    pygwy_console_append(output->str);
-    g_string_free(output, TRUE);
+static void
+pygwy_console_run(GtkToolButton *button, gpointer user_data)
+{
+    GtkTextView *textview;
+    GtkTextBuffer *console_file_buf;
+    GtkTextIter start_iter, end_iter;
+    const gchar *output;
+    gchar *script;
 
-    gtk_editable_select_region(GTK_EDITABLE(entry), 0, -1);
+    textview = GTK_TEXT_VIEW(console_setup->console_file_content);
+    console_file_buf = gtk_text_view_get_buffer(textview);
+
+    pygwy_console_append_message(_(">>> Running the script above\n"));
+    gtk_text_buffer_get_bounds(console_file_buf, &start_iter, &end_iter);
+    script = gtk_text_buffer_get_text(console_file_buf,
+                                      &start_iter, &end_iter, FALSE);
+    output = pygwy_console_run_command(script, Py_file_input);
+    g_free(script);
+    pygwy_console_append_message(output);
+}
+
+static void
+fix_eols_to_unix(gchar *text)
+{
+    gchar *p = strchr(text, '\r');
+    guint i, j;
+
+    /* Unix */
+    if (!p)
+        return;
+
+    /* Mac */
+    if (p[1] != '\n') {
+        do {
+            *p = '\n';
+        } while ((p = strchr(p+1, '\r')));
+
+        return;
+    }
+
+    /* MS-DOS */
+    for (i = 0, j = 0; text[i]; i++) {
+        if (text[i] != '\r') {
+            text[j] = text[i];
+            j++;
+        }
+    }
+    text[j] = '\0';
+}
+
+/* The file chooser dialogue cannot be meaningfully switched between modes
+ * (button labels stays saying Open/Save, ...).  So having two means we need
+ * to sync them. */
+static GtkFileChooser*
+ensure_pygwy_file_dialogue(GtkFileChooserAction action, const gchar *filename)
+{
+    static GtkFileChooser *open_chooser = NULL;
+    static GtkFileChooser *save_chooser = NULL;
+
+    GtkWidget *widget;
+    GtkFileChooser *chooser;
+    gboolean is_save = (action == GTK_FILE_CHOOSER_ACTION_SAVE);
+    const gchar *title;
+
+    if (is_save) {
+        chooser = save_chooser;
+        title = _("Save Python Script as");
+    }
+    else {
+        chooser = open_chooser;
+        title = _("Open Python Script");
+    }
+
+    if (!chooser) {
+        GtkFileFilter *filter = gtk_file_filter_new();
+
+        gtk_file_filter_add_mime_type(filter, "text/x-python");
+        gtk_file_filter_add_pattern(filter, "*.py");
+
+        widget = gtk_file_chooser_dialog_new(title, NULL, action,
+                                             GTK_STOCK_CANCEL,
+                                             GTK_RESPONSE_CANCEL,
+                                             GTK_STOCK_OPEN,
+                                             GTK_RESPONSE_ACCEPT,
+                                             NULL);
+        chooser = GTK_FILE_CHOOSER(widget);
+        gtk_file_chooser_set_filter(chooser, filter);
+        g_signal_connect(widget, "delete-event",
+                         G_CALLBACK(gtk_widget_hide_on_delete), NULL);
+
+        if (is_save) {
+            gtk_file_chooser_set_do_overwrite_confirmation(chooser, TRUE);
+            save_chooser = chooser;
+        }
+        else
+            open_chooser = chooser;
+    }
+
+    /* Sync the state between open and save choosers. */
+    if (filename)
+        gtk_file_chooser_set_filename(chooser, filename);
+
+    return chooser;
+}
+
+static void
+update_script_filename(const gchar *filename)
+{
+    gchar *title, *basename;
+
+    if (console_setup->script_filename
+        && gwy_strequal(filename, console_setup->script_filename))
+        return;
+
+    g_free(console_setup->script_filename);
+    console_setup->script_filename = g_strdup(filename);
+    if (pygwy_console_add_scriptfile(filename)) {
+        pygwy_console_save_recent();
+        pygwy_console_rebuild_recent_menu();
+    }
+
+    basename = g_path_get_basename(filename);
+    title = g_strconcat(_("Pygwy Console"), " – ", basename, NULL);
+    gtk_window_set_title(GTK_WINDOW(console_setup->window), title);
+    g_free(basename);
+    g_free(title);
+}
+
+static void
+pygwy_console_load_script(const gchar *filename)
+{
+    GtkTextBuffer *console_file_buf;
+    GtkTextView *textview;
+    gchar *file_content, *message;
+    GError *err = NULL;
+
+    if (g_file_get_contents(filename, &file_content, NULL, &err)) {
+        fix_eols_to_unix(file_content);
+        textview = GTK_TEXT_VIEW(console_setup->console_file_content);
+        console_file_buf = gtk_text_view_get_buffer(textview);
+        gtk_text_buffer_set_text(console_file_buf, file_content, -1);
+        g_free(file_content);
+        update_script_filename(filename);
+    }
+    else {
+        message = g_strdup_printf(_("Cannot read from file: %s."), err->message);
+        pygwy_console_append_message(message);
+        g_clear_error(&err);
+        g_free(message);
+    }
+}
+
+static void
+pygwy_console_save_script(const gchar *filename)
+{
+    GtkTextView *textview;
+    GtkTextBuffer *buf;
+    GtkTextIter start_iter, end_iter;
+    gchar *script, *message;
+    GError *err = NULL;
+
+    textview = GTK_TEXT_VIEW(console_setup->console_file_content);
+    buf = gtk_text_view_get_buffer(textview);
+    gtk_text_buffer_get_bounds(buf, &start_iter, &end_iter);
+    script = gtk_text_buffer_get_text(buf, &start_iter, &end_iter, FALSE);
+    if (g_file_set_contents(filename, script, -1, &err)) {
+        update_script_filename(filename);
+    }
+    else {
+        message = g_strdup_printf(_("Cannot write to file: %s."), err->message);
+        pygwy_console_append_message(message);
+        g_clear_error(&err);
+        g_free(message);
+    }
+    g_free(script);
+}
+
+static void
+pygwy_console_open(GtkToolButton *button, gpointer user_data)
+{
+    GtkFileChooser *chooser;
+    gchar *filename;
+    gboolean ok;
+
+    chooser = ensure_pygwy_file_dialogue(GTK_FILE_CHOOSER_ACTION_OPEN,
+                                         console_setup->script_filename);
+    gtk_window_present(GTK_WINDOW(chooser));
+    ok = (gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT);
+    gtk_widget_hide(GTK_WIDGET(chooser));
+    if (ok) {
+        filename = gtk_file_chooser_get_filename(chooser);
+        pygwy_console_load_script(filename);
+        g_free(filename);
+    }
+}
+
+static void
+pygwy_console_save(GtkToolButton *button, gpointer user_data)
+{
+    if (!console_setup->script_filename) 
+        pygwy_console_save_as(button, user_data);
+    else
+        pygwy_console_save_script(console_setup->script_filename);
+}
+
+static void
+pygwy_console_save_as(GtkToolButton *button, gpointer user_data)
+{
+    GtkFileChooser *chooser;
+    gchar *filename;
+    gboolean ok;
+
+    chooser = ensure_pygwy_file_dialogue(GTK_FILE_CHOOSER_ACTION_SAVE,
+                                         console_setup->script_filename);
+    gtk_window_present(GTK_WINDOW(chooser));
+    ok = (gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT);
+    gtk_widget_hide(GTK_WIDGET(chooser));
+    if (ok) {
+        filename = gtk_file_chooser_get_filename(chooser);
+        pygwy_console_save_script(filename);
+        g_free(filename);
+    }
+}
+
+static gboolean
+pygwy_console_add_scriptfile(const gchar *filename)
+{
+    GArray *recent = console_setup->recent_scripts;
+    gchar *rfilename;
+    guint i;
+
+    for (i = 0; i < recent->len; i++) {
+        rfilename = g_array_index(recent, gchar*, i);
+        if (gwy_strequal(filename, rfilename)) {
+            if (i == 0)
+                return FALSE;
+
+            /* Move it to the front. */
+            g_array_remove_index(recent, i);
+            g_array_prepend_val(recent, rfilename);
+            return TRUE;
+        }
+    }
+
+    rfilename = g_strdup(filename);
+    g_array_prepend_val(recent, rfilename);
+    if (recent->len > NRECENT)
+        g_array_set_size(recent, NRECENT);
+    return TRUE;
+}
+
+static void
+pygwy_console_load_recent(void)
+{
+    GArray *recent = console_setup->recent_scripts;
+    gchar *path, *text, *line, *p;
+
+    path = g_build_filename(gwy_get_user_dir(), "pygwy_console", "recent-files",
+                            NULL);
+    if (g_file_get_contents(path, &text, NULL, NULL)) {
+        p = text;
+        for (line = gwy_str_next_line(&p); line; line = gwy_str_next_line(&p)) {
+            if (strchr(line, '\\')) {
+                line = g_strcompress(line);
+                if (strlen(line))
+                    pygwy_console_add_scriptfile(line);
+                g_free(line);
+            }
+            else if (strlen(line))
+                pygwy_console_add_scriptfile(line);
+
+            if (recent->len == NRECENT)
+                break;
+        }
+        g_free(text);
+    }
+    g_free(path);
+}
+
+static void
+pygwy_console_save_recent(void)
+{
+    GArray *recent = console_setup->recent_scripts;
+    GString *text = g_string_new(NULL);
+    gchar *path, *line;
+    guint i;
+
+    for (i = 0; i < recent->len; i++) {
+        /* Put the most recent last; it will end up first. */
+        line = g_strescape(g_array_index(recent, gchar*, recent->len-1 - i),
+                           NULL);
+        g_string_append(text, line);
+        g_string_append_c(text, '\n');
+    }
+
+    path = g_build_filename(gwy_get_user_dir(), "pygwy_console", "recent-files",
+                            NULL);
+    g_file_set_contents(path, text->str, -1, NULL);
+    g_free(path);
+    g_string_free(text, TRUE);
+}
+
+static void
+pygwy_console_rebuild_recent_menu(void)
+{
+    GtkToolItem *item = console_setup->open_item;
+    GtkWidget *menu;
+
+    g_return_if_fail(item);
+    menu = gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(item));
+    if (menu) {
+        gtk_widget_destroy(menu);
+        g_object_unref(menu);
+    }
+    menu = pygwy_console_create_recent_menu();
+    g_object_ref(menu);
+    gtk_widget_show_all(menu);
+    gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(item), menu);
+}
+
+static GtkWidget*
+pygwy_console_create_recent_menu(void)
+{
+    GArray *recent = console_setup->recent_scripts;
+    GtkWidget *menu, *item;
+    GtkMenuShell *menushell;
+    const gchar *path;
+    gchar *filename;
+    guint i;
+
+    menu = gtk_menu_new();
+    menushell = GTK_MENU_SHELL(menu);
+    for (i = 0; i < recent->len; i++) {
+        path = g_array_index(recent, gchar*, i);
+        filename = g_path_get_basename(path);
+        item = gtk_menu_item_new_with_label(filename);
+        g_free(filename);
+        gtk_menu_shell_append(menushell, item);
+        g_signal_connect(item, "activate",
+                         G_CALLBACK(pygwy_console_open_recent),
+                         GUINT_TO_POINTER(i));
+    }
+    return menu;
+}
+
+static void
+pygwy_console_open_recent(GtkMenuItem *item, gpointer user_data)
+{
+    GArray *recent = console_setup->recent_scripts;
+    guint i = GPOINTER_TO_UINT(user_data);
+
+    g_return_if_fail(i < recent->len);
+    pygwy_console_load_script(g_array_index(recent, gchar*, i));
 }
 
 static void
@@ -525,4 +725,46 @@ pygwy_console_clear_output(GtkToolButton *btn,
     gtk_text_buffer_delete(console_buf, &start_iter, &end_iter);
 }
 
+static void
+pygwy_console_append_message(const gchar *message)
+{
+    GtkTextBuffer *console_buf;
+    GtkTextIter start_iter, end_iter;
+    GtkTextView *textview;
+    GString *output;
+    GtkTextMark *end_mark;
+
+    if (!message) {
+        g_warning("No message to append.");
+        return;
+    }
+    if (!console_setup) {
+        g_warning("Console setup structure is not defined!");
+        return;
+    }
+    /* read string which contain last command output */
+    textview = GTK_TEXT_VIEW(console_setup->console_output);
+    console_buf = gtk_text_view_get_buffer(textview);
+    gtk_text_buffer_get_bounds(console_buf, &start_iter, &end_iter);
+
+    /* get output widget content */
+    output = g_string_new(gtk_text_buffer_get_text(console_buf,
+                                                   &start_iter, &end_iter,
+                                                   FALSE));
+
+    /* append input line */
+    output = g_string_append(output, message);
+    gtk_text_buffer_set_text(console_buf, output->str, -1);
+    g_string_free(output, TRUE);
+
+    /* scroll to end */
+    gtk_text_buffer_get_end_iter(console_buf, &end_iter);
+    end_mark = gtk_text_buffer_create_mark(console_buf, "cursor", &end_iter,
+                                           FALSE);
+    g_object_ref(end_mark);
+    gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(console_setup->console_output),
+                                 end_mark, 0.0, FALSE, 0.0, 0.0);
+    g_object_unref(end_mark);
+}
+
 /* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/pygwy/pygwy-console.h b/modules/pygwy/pygwy-console.h
index 27b684d..37e3224 100644
--- a/modules/pygwy/pygwy-console.h
+++ b/modules/pygwy/pygwy-console.h
@@ -1,5 +1,3 @@
-#ifndef _PYGWY_CONSOLE_H
-#define _PYGWY_CONSOLE_H
 /*
  *  Copyright (C) 2008 Jan Horak
  *  E-mail: xhorak at gmail.com
@@ -21,17 +19,9 @@
  *
  *  Description: This file contains pygwy console module.
  */
+#ifndef __PYGWY_CONSOLE_H__
+#define __PYGWY_CONSOLE_H__
 
-#include <Python.h>
-#include <gtk/gtk.h>
-typedef struct {
-   GtkWidget *window;
-   PyObject *std_err;
-   PyObject *dictionary;
-   GtkWidget *console_output;
-   GtkWidget *console_file_content;
-   gchar *script_filename;
-} PygwyConsoleSetup;
+void pygwy_register_console(void);
 
-void              pygwy_register_console             (void);
 #endif
diff --git a/modules/pygwy/pygwy-fix-defs-1.py b/modules/pygwy/pygwy-fix-defs-1.py
new file mode 100644
index 0000000..2048537
--- /dev/null
+++ b/modules/pygwy/pygwy-fix-defs-1.py
@@ -0,0 +1,32 @@
+#!/usr/bin/python
+# $Id: pygwy-fix-defs-1.py 19311 2016-11-23 18:06:51Z yeti-dn $
+# perform simple text-transform fixes on the defs file
+import sys, re
+
+fixes = [
+    (r'\(define-object Serializable', r'(define-interface Serializable'),
+    (r'\bGWY_TYPE_SELECTION_GRAPH1_DAREA\b', r'GWY_TYPE_SELECTION_GRAPH_1DAREA'),
+    (r'\bGWY_TYPE_NL_FIT_PRESET\b', r'GWY_TYPE_NLFIT_PRESET'),
+    (r'\bGWY_TYPE_CD_LINE\b', r'GWY_TYPE_CDLINE'),
+    (r'\bGwyXyz\b', r'GwyXYZ'),
+    (r'\bGwyXy\b', r'GwyXY'),
+    (r'\bGwyRgba\b', r'GwyRGBA'),
+    (r'\bGwySiUnit\b', r'GwySIUnit'),
+    (r'\bGwySiValueFormat\b', r'GwySIValueFormat'),
+    (r'\bGwyCdLine\b', r'GwyCDLine'),
+    (r'\bGwyGl([A-Z])', r'GwyGL\1'),
+    (r'\bGwy([HV])ruler\b', r'Gwy\1Ruler'),
+    (r'\bGwy([HV])marker', r'Gwy\1Marker'),
+    (r'\bGwyNLFitter\b', r'GwyMathNLFit'),
+    (r'\bGwyMathNlfit\b', r'GwyMathNLFit'),
+    (r'\(define-method ([1-3]d)([a-z]+)', r'(define-method \2\1'),
+    (r'"(as|assert|def|exec|from|global|import|in|is|lambda|pass|print|raise|with|yield)"\)', r'"\1_")'),
+]
+
+text = sys.stdin.read()
+for fix in fixes:
+    text, nsub = re.subn(fix[0], fix[1], text)
+    if nsub:
+        continue
+    sys.stderr.write('Fix-regexp %s did not match anything.\n' % repr(fix[0]))
+sys.stdout.write(text)
diff --git a/modules/pygwy/pygwy-fix-defs-2.py b/modules/pygwy/pygwy-fix-defs-2.py
new file mode 100644
index 0000000..ffac282
--- /dev/null
+++ b/modules/pygwy/pygwy-fix-defs-2.py
@@ -0,0 +1,603 @@
+#!/usr/bin/python
+# $Id: pygwy-fix-defs-2.py 20179 2017-08-07 09:17:50Z yeti-dn $
+# alter defs, fix parameters and return types
+import sys, re
+from optparse import OptionParser
+
+parser = OptionParser(usage='''\
+pygwy-fix-defs.py --codegendir=DIR
+Reads pygwy.defs.tmp.
+Generated pygwy.defs and boxed.override.''')
+
+parser.add_option('-c', '--codegendir', dest='codegendir', type='string',
+                  default='', metavar='DIR',
+                  help='Directory with codegen python modules')
+
+(options, args) = parser.parse_args()
+if options.codegendir:
+    sys.path.insert(0, options.codegendir)
+assert not args
+
+import defsparser, definitions
+
+# Arguments we need to fix for various functions.  The syntax is natural:
+# in each fix-list we list the affected arguments as the function arguments.
+# Note original C names (func.c_name) are used even for foo_pygwy functions.
+GwyDoubleOut_args = '''
+gwy_3d_view_get_scale_range(min_scale, max_scale)
+gwy_cdline_get_value(value)
+gwy_axis_get_range(min, max)
+gwy_axis_get_requested_range(min, max)
+gwy_color_axis_get_range(min, max)
+gwy_container_gis_double(value)
+gwy_data_field_area_fit_plane(pa, pbx, pby)
+gwy_data_field_area_get_inclination(theta, phi)
+gwy_data_field_area_get_min_max_mask(min, max)
+gwy_data_field_area_get_min_max(min, max)
+gwy_data_field_area_get_normal_coeffs(nx, ny, nz)
+gwy_data_field_area_get_stats(avg, ra, rms, skew, kurtosis)
+gwy_data_field_area_get_stats_mask(avg, ra, rms, skew, kurtosis)
+gwy_data_field_correct_laplace_iteration(error)
+gwy_data_field_fit_facet_plane(pa, pbx, pby)
+gwy_data_field_fit_plane(pa, pbx, pby)
+gwy_data_field_fractal_cubecounting_dim(a, b)
+gwy_data_field_fractal_partitioning_dim(a, b)
+gwy_data_field_fractal_psdf_dim(a, b)
+gwy_data_field_fractal_triangulation_dim(a, b)
+gwy_data_field_get_autorange(from_, to)
+gwy_data_field_get_inclination(theta, phi)
+gwy_data_field_get_min_max(min, max)
+gwy_data_field_get_normal_coeffs(nx, ny, nz)
+gwy_data_field_get_stats(avg, ra, rms, skew, kurtosis)
+gwy_data_field_hough_datafield_line_to_polar(rho, theta)
+gwy_data_field_local_maximum(x_out, y_out)
+gwy_data_line_get_line_coeffs(av, bv)
+gwy_data_line_get_min_max(min, max)
+gwy_data_line_part_get_min_max(min, max)
+gwy_data_view_coords_real_to_xy_float(xscr, yscr)
+gwy_data_view_coords_xy_to_real(xreal, yreal)
+gwy_data_view_get_real_data_offsets(xoffset, yoffset)
+gwy_data_view_get_real_data_sizes(xreal, yreal)
+gwy_data_view_get_real_data_sizes(xreal, yreal)
+gwy_graph_area_get_cursor(x_cursor, y_cursor)
+gwy_graph_curve_model_get_ranges(x_min, y_min, x_max, y_max)
+gwy_graph_curve_model_get_x_range(x_min, x_max)
+gwy_graph_curve_model_get_y_range(y_min, y_max)
+gwy_graph_model_get_ranges(x_min, y_min, x_max, y_max)
+gwy_graph_model_get_x_range(x_min, x_max)
+gwy_graph_model_get_y_range(y_min, y_max)
+gwy_layer_basic_get_range(min, max)
+gwy_math_curvature(kappa1, kappa2, phi1, phi2, xc, yc, zc)
+gwy_math_refine_maximum(x, y)
+gwy_math_refine_maximum_2d(x, y)
+gwy_math_refine_maximum_1d(x)
+gwy_ruler_get_range(lower, upper, position, max_size)
+gwy_ruler_get_range(lower, upper, position, max_size)
+gwy_spectra_itoxy(x, y)
+gwy_surface_get_min_max(min, max)
+gwy_surface_get_xrange(min, max)
+gwy_surface_get_yrange(min, max)
+gwy_math_find_nearest_line(d2min)
+gwy_math_find_nearest_point(d2min)
+gwy_interpolation_get_dval_of_equidists(result)
+gwy_interpolation_interpolate_1d(result)
+gwy_interpolation_interpolate_2d(result)
+'''
+
+GwyIntOut_args = '''
+gwy_container_gis_enum(value)
+gwy_container_gis_int32(value)
+gwy_container_gis_int64(value)
+gwy_data_chooser_get_active(id)
+gwy_data_field_area_count_in_range(nbelow, nabove)
+gwy_data_field_grains_autocrop(left, right, up, down)
+gwy_data_field_hough_polar_line_to_datafield(px1, px2, py1, py2)
+gwy_data_view_coords_real_to_xy(xscr, yscr)
+gwy_data_view_coords_xy_clamp(xscr, yscr)
+gwy_data_view_get_pixel_data_sizes(xres, yres)
+gwy_enum_combo_box_update_int(integer)
+gwy_file_detect_with_score(score)
+gwy_gradient_get_points(npoints)
+gwy_gradient_get_samples(nsamples)
+gwy_math_curvature(dimen)
+gwy_math_humanize_numbers(precision)
+gwy_si_unit_new_parse(power10)
+gwy_si_unit_set_from_string_parse(power10)
+gwy_tip_estimate_full(count)
+gwy_tip_estimate_partial(count)
+gwy_peaks_analyze(npeaks)
+gwy_math_find_nearest_line(idx)
+gwy_math_find_nearest_point(idx)
+'''
+
+GwyBooleanOut_args = '''
+gwy_cdline_get_value(fres)
+gwy_nlfit_preset_guess(fres)
+gwy_math_is_in_polygon(is_inside)
+gwy_math_refine_maximum(refined)
+gwy_math_refine_maximum_2d(refined)
+gwy_math_refine_maximum_1d(refined)
+gwy_data_field_measure_lattice_acf(succeeded)
+gwy_data_field_measure_lattice_psdf(succeeded)
+'''
+
+GwyRGBAOut_args = '''
+gwy_color_button_get_color(color)
+'''
+
+GwyIntInOut_args = '''
+gwy_data_view_coords_xy_clamp(xscr, yscr)
+gwy_data_view_coords_xy_cut_line(x0scr, y0scr, x1scr, y1scr)
+'''
+
+GObject_args = '''
+gwy_container_set_object(value)
+gwy_container_get_object(return)
+'''
+
+constgchar_args = '''
+gwy_container_get_string(return)
+gwy_container_set_const_string(value)
+gwy_container_set_const_string_by_name(value)
+'''
+
+nullable_args = '''
+gwy_app_data_browser_add_brick(data, preview)
+gwy_app_data_browser_add_data_field(data)
+gwy_app_data_browser_add_spectra(data)
+gwy_app_data_browser_add_graph_model(data)
+gwy_app_data_browser_add_surface(data)
+gwy_math_find_nearest_line(metric)
+gwy_math_find_nearest_point(metric)
+gwy_app_file_load(name)
+gwy_app_file_write(name)
+gwy_data_line_fft(isrc)
+gwy_data_line_fft_raw(isrc)
+gwy_data_line_part_fft(isrc)
+gwy_data_field_1dfft(iin)
+gwy_data_field_1dfft_raw(iin)
+gwy_data_field_area_1dfft(iin)
+gwy_data_field_2dfft(iin)
+gwy_data_field_2dfft_raw(iin)
+gwy_data_field_area_2dfft(iin)
+gwy_data_field_area_fit_plane(mask)
+gwy_data_field_area_row_acf(weights, mask)
+gwy_data_field_area_row_hhcf(weights, mask)
+gwy_data_field_area_get_line_stats(mask)
+'''
+
+skip_args = '''
+gwy_app_file_load(filename_sys=NULL)
+gwy_app_file_write(filename_sys=NULL)
+gwy_tip_estimate_partial(set_fraction=NULL, set_message=NULL)
+gwy_tip_estimate_full(set_fraction=NULL, set_message=NULL)
+gwy_graph_export_postscript(str=NULL)
+gwy_graph_model_export_ascii(string=NULL)
+gwy_data_field_get_profile(data_line=NULL)
+gwy_brick_get_value_format_x(format=NULL)
+gwy_brick_get_value_format_y(format=NULL)
+gwy_brick_get_value_format_z(format=NULL)
+gwy_brick_get_value_format_w(format=NULL)
+gwy_data_field_get_value_format_xy(format=NULL)
+gwy_data_field_get_value_format_z(format=NULL)
+gwy_data_line_get_value_format_x(format=NULL)
+gwy_data_line_get_value_format_y(format=NULL)
+gwy_surface_get_value_format_xy(format=NULL)
+gwy_surface_get_value_format_z(format=NULL)
+'''
+
+default_args = '''
+gwy_data_field_affine(fill_value=0.0)
+gwy_interpolation_shift_block_1d(fill_value=0.0)
+gwy_data_line_new(nullme=TRUE)
+gwy_data_line_new_alike(nullme=TRUE)
+gwy_data_field_new(nullme=TRUE)
+gwy_data_field_new_alike(nullme=TRUE)
+gwy_brick_new(nullme=TRUE)
+gwy_brick_new_alike(nullme=TRUE)
+gwy_data_line_fft(interpolation=GWY_INTERPOLATION_LINEAR)
+gwy_data_line_part_fft(interpolation=GWY_INTERPOLATION_LINEAR)
+gwy_data_field_1dfft(interpolation=GWY_INTERPOLATION_LINEAR)
+gwy_data_field_area_1dfft(interpolation=GWY_INTERPOLATION_LINEAR)
+gwy_data_field_2dfft(interpolation=GWY_INTERPOLATION_LINEAR)
+gwy_data_field_area_2dfft(interpolation=GWY_INTERPOLATION_LINEAR)
+gwy_data_field_area_row_acf(masking=GWY_MASK_INCLUDE)
+gwy_data_field_area_row_hhcf(masking=GWY_MASK_INCLUDE)
+gwy_data_field_area_row_psdf(masking=GWY_MASK_INCLUDE)
+gwy_data_field_area_row_asg(masking=GWY_MASK_INCLUDE)
+gwy_file_load(mode=GWY_RUN_NONINTERACTIVE)
+gwy_file_save(mode=GWY_RUN_NONINTERACTIVE)
+'''
+
+# Lists of functions that should have various attributes
+caller_owns_return_funcs = '''
+gwy_app_file_load
+gwy_brick_duplicate
+gwy_brick_new_alike
+gwy_brick_new_part
+gwy_construct_grain_quantity_units
+gwy_container_duplicate
+gwy_container_duplicate_by_prefix
+gwy_data_chooser_new_channels
+gwy_data_chooser_new_graphs
+gwy_data_chooser_new_volumes
+gwy_data_chooser_new_xyzs
+gwy_data_field_area_row_acf
+gwy_data_field_area_row_hhcf
+gwy_data_field_area_row_psdf
+gwy_data_field_area_row_asg
+gwy_data_field_duplicate
+gwy_data_field_new_alike
+gwy_data_field_new_resampled
+gwy_data_field_new_rotated
+gwy_data_field_new_rotated_90
+gwy_data_line_duplicate
+gwy_data_line_new_alike
+gwy_data_line_new_resampled
+gwy_file_load
+gwy_graph_curve_model_duplicate
+gwy_graph_curve_model_new_alike
+gwy_graph_model_duplicate
+gwy_graph_model_new_alike
+gwy_si_unit_duplicate
+gwy_si_unit_new_parse
+gwy_si_unit_get_format
+gwy_si_unit_get_format_for_power10
+gwy_si_unit_get_format_with_digits
+gwy_si_unit_get_format_with_resolution
+gwy_spectra_duplicate
+gwy_spectra_new_alike
+gwy_spline_new_from_points
+gwy_surface_duplicate
+gwy_surface_new_alike
+gwy_surface_new_part
+gwy_surface_reduce_points
+gwy_nlfit_preset_get_param_units
+gwy_nlfit_preset_create_fitter
+gwy_cdline_get_param_units
+gwy_shape_fit_preset_get_param_units
+gwy_shape_fit_preset_get_secondary_units
+gwy_shape_fit_preset_create_fitter
+gwy_brick_get_value_format_x
+gwy_brick_get_value_format_y
+gwy_brick_get_value_format_z
+gwy_brick_get_value_format_w
+gwy_data_field_get_value_format_xy
+gwy_data_field_get_value_format_z
+gwy_data_line_get_value_format_x
+gwy_data_line_get_value_format_y
+gwy_surface_get_value_format_xy
+gwy_surface_get_value_format_z
+'''
+
+remove_funcs = '''
+gwy_math_lin_solve_rewrite
+gwy_gradient_get_samples
+gwy_gradient_sample
+gwy_vector_layer_button_press
+gwy_vector_layer_button_release
+gwy_vector_layer_motion_notify
+gwy_vector_layer_key_press
+gwy_vector_layer_key_release
+gwy_md5_get_digest
+gwy_gstring_replace
+gwy_gstring_to_native_eol
+gwy_app_data_browser_get_current
+gwy_container_set_string
+gwy_container_get_value
+gwy_container_set_value
+gwy_container_set_value_by_name
+gwy_si_value_format_set_units
+gwy_si_unit_value_format_set_units
+gwy_tip_model_get_preset_params
+gwy_tip_model_get_preset_nparams
+'''
+
+pygwy_added_funcs = '''
+gwy_key_from_name
+gwy_name_from_key
+gwy_data_line_set_data
+gwy_data_field_set_data
+gwy_brick_set_data
+gwy_data_field_create_full_mask
+gwy_get_grain_quantity_needs_same_units
+gwy_construct_grain_quantity_units
+gwy_tip_model_preset_get_params
+'''
+
+boxed_sequence_likes = '''
+XY
+XYZ
+RGBA
+AppDataId
+'''
+
+# This is a hack; functions that are renamed to other functions and we want to
+# remove the originals because they would be generated too.
+remove_methods = '''
+GwyContainer.set_const_string
+GwyContainer.set_const_string_by_name
+'''
+
+def unwrap_name(fname, fail_if_not_wrapped=False):
+    if fname.endswith('_pygwy'):
+        return fname[:-6]
+    if fail_if_not_wrapped:
+        assert fname.endswith('_pygwy')
+    return fname
+
+def get_python_name(c_name):
+    py_name = c_name.capitalize()
+    letters = list(re.findall(r'_[a-z]', c_name))
+    for match in letters:
+        py_name = py_name.replace(match, match.upper()[1])
+    return py_name.replace('_', '')
+
+def parse_fix_args_spec(ffargs, spec, argattr):
+    re_fnmatch = re.compile(r'(?m)^(?P<cname>[a-zA-Z0-9_]+)'
+                            r'\((?P<args>[^)]+)\)$')
+    re_argsplit = re.compile(r'\s*,\s*').split
+    for m in re_fnmatch.finditer(spec):
+        name = m.group('cname')
+        if name not in ffargs:
+            ffargs[name] = {}
+        for arg in re_argsplit(m.group('args')):
+            # skip(foobar=NULL), default(foobar=1) or whatever
+            argval = None
+            if '=' in arg:
+                arg, argval = arg.split('=')
+
+            if arg not in ffargs[name]:
+                ffargs[name][arg] = set()
+
+            if argval is None:
+                ffargs[name][arg].add(argattr)
+            else:
+                ffargs[name][arg].add(argattr + argval)
+
+def parse_fix_func_props(ffprops, spec, argattr):
+    for m in re.finditer(r'\w+', spec):
+        name = m.group()
+        if name not in ffprops:
+            ffprops[name] = set()
+        ffprops[name].add(argattr)
+
+fix_function_args = {}
+parse_fix_args_spec(fix_function_args, GwyBooleanOut_args, 'type:GwyBooleanOutArg')
+parse_fix_args_spec(fix_function_args, GwyIntOut_args, 'type:GwyIntOutArg')
+parse_fix_args_spec(fix_function_args, GwyDoubleOut_args, 'type:GwyDoubleOutArg')
+parse_fix_args_spec(fix_function_args, GwyRGBAOut_args, 'type:GwyRGBAOutArg')
+parse_fix_args_spec(fix_function_args, GwyIntInOut_args, 'type:GwyIntInOutArg')
+parse_fix_args_spec(fix_function_args, GObject_args, 'type:GObject*')
+parse_fix_args_spec(fix_function_args, constgchar_args, 'type:const-gchar*')
+parse_fix_args_spec(fix_function_args, skip_args, 'skip:')
+parse_fix_args_spec(fix_function_args, default_args, 'default:')
+parse_fix_args_spec(fix_function_args, nullable_args, 'nullable')
+
+fix_function_props = {}
+parse_fix_func_props(fix_function_props, caller_owns_return_funcs, 'caller-owns-return')
+parse_fix_func_props(fix_function_props, remove_funcs, 'remove')
+
+added_functions_in_wrap_calls = {}
+parse_fix_func_props(added_functions_in_wrap_calls, pygwy_added_funcs, 'pygwy-added')
+
+remove_methods = set([x for x in remove_methods.split() if x])
+boxed_sequence_likes = set([x for x in boxed_sequence_likes.split() if x])
+
+parser = defsparser.DefsParser("pygwy.defs.tmp")
+parser.startParsing()
+parser.include('extra.defs')
+
+# We want to discard the originals of wrapped functions so that we do not see
+# `could-not-write-method messages' in the log for functions we did wrap.
+wrapped_funcs = {}
+for f in parser.functions:
+    assert not f.name[0].isdigit()
+    if f.name.endswith('_pygwy'):
+        wrapped_funcs[unwrap_name(f.c_name, True)] = None
+
+for i, f in enumerate(parser.functions):
+    if f.c_name in wrapped_funcs:
+        assert wrapped_funcs[f.c_name] is None
+        wrapped_funcs[f.c_name] = i
+        continue
+
+    f.name = unwrap_name(f.name)
+    c_name = unwrap_name(f.c_name)
+    if c_name in fix_function_props:
+        for funcprop in fix_function_props[c_name]:
+            if funcprop == 'caller-owns-return':
+                f.caller_owns_return = True
+            elif funcprop == 'remove':
+                wrapped_funcs[f.c_name] = i
+            else:
+                assert not 'Reached'
+
+        del fix_function_props[c_name]
+
+    if hasattr(f, 'of_object'):
+        qname = f.of_object + '.' + f.name
+        if qname in remove_methods:
+            wrapped_funcs[qname] = i
+
+    if c_name in fix_function_args:
+        to_fix = fix_function_args[c_name]
+        for p in f.params:
+            if p.pname not in to_fix:
+                continue
+            for argattr in to_fix[p.pname]:
+                if argattr == 'nullable':
+                    p.pnull = True
+                    p.pdflt = 'NULL'
+                elif argattr.startswith('default:'):
+                    p.pdflt = argattr.split(':')[1]
+                elif argattr.startswith('skip:'):
+                    # To skip a parameter completely we define it to be of
+                    # GwySkipArg and provide a default value.  The codegen
+                    # handler for that type then just passed this value without
+                    # putting any correspding arg into the Python protptype.
+                    p.ptype = 'GwySkipArg'
+                    p.pdflt = argattr.split(':')[1]
+                elif argattr.startswith('type:'):
+                    p.ptype = argattr.split(':')[1]
+                else:
+                    assert not 'Reached'
+            del to_fix[p.pname]
+        if 'return' in to_fix:
+            for argattr in to_fix['return']:
+                if argattr.startswith('type:'):
+                    f.ret = argattr.split(':')[1]
+                else:
+                    assert not 'Reached'
+            del to_fix['return']
+
+        if not fix_function_args[c_name]:
+            del fix_function_args[c_name]
+
+# Unused fix items mean potential errors.
+for f in fix_function_args.items():
+    sys.stderr.write('Warning: unused fixarg %s: %s\n' % (f[0], str(f[1])))
+for f in fix_function_props.items():
+    sys.stderr.write('Warning: unused fixfunc %s: %s\n' % (f[0], str(f[1])))
+for f, i in wrapped_funcs.items():
+    if f in added_functions_in_wrap_calls:
+        continue
+    if i is None:
+        sys.stderr.write('Warning: wrapper for %s does not wrap existing function\n' % f)
+
+for i in reversed(sorted(wrapped_funcs.values())):
+    if i is not None:
+        del parser.functions[i]
+
+parser.write_defs()
+
+# Generate setters and sequence-like wrappers for boxed types.  Generally, if
+# we declare something as boxed type with some fields we want it work as a
+# plain C struct.
+boxed_setter_template = '''\
+%%%%
+override-attr %(cname)s.%(attr)s
+static int
+_wrap_%(lcname)s__set_%(attr)s(PyGBoxed *self, PyObject *value, void *closure)
+{
+    return assign_%(convertor)s(value, &pyg_boxed_get(self, %(cname)s)->%(attr)s, "%(pyname)s.%(attr)s");
+}
+'''
+
+boxed_sequence_template = '''\
+%%%%
+override-slot %(cname)s.tp_as_sequence
+
+static ssize_t
+_sq_%(lcname)s_length(G_GNUC_UNUSED PyGObject *self)
+{
+    return %(nfields)u;
+}
+
+static PyObject*
+_sq_%(lcname)s_item(PyGObject *self, Py_ssize_t i)
+{
+    const %(cname)s *%(name)s = pyg_boxed_get(self, %(cname)s);
+
+%(get_fields)s
+    PyErr_SetString(PyExc_IndexError, "%(pyname)s index out of range");
+    return NULL;
+}
+
+static int
+_sq_%(lcname)s_ass_item(PyGObject *self, Py_ssize_t i, PyObject *item)
+{
+    %(cname)s *%(name)s = pyg_boxed_get(self, %(cname)s);
+
+%(set_fields)s
+    PyErr_SetString(PyExc_IndexError, "%(pyname)s index out of range");
+    return -1;
+}
+
+static const PySequenceMethods _wrap_%(lcname)s_tp_as_sequence = {
+    (lenfunc)_sq_%(lcname)s_length,
+    NULL,
+    NULL,
+    (ssizeargfunc)_sq_%(lcname)s_item,
+    NULL,
+    (ssizeobjargproc)_sq_%(lcname)s_ass_item,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+};
+'''
+
+boxed_sequence_get_field_template = '''\
+    if (i == %(i)u)
+        return %(convertor)s(%(name)s->%(attr)s);
+'''
+
+boxed_sequence_set_field_template = '''\
+    if (i == %(i)u)
+        return assign_%(convertor)s(item, &%(name)s->%(attr)s, "%(pyname)s %(attr)s item");
+'''
+
+extract_convertors = {
+    'gdouble': 'PyFloat_FromDouble',
+    'gint': 'PyInt_FromLong',
+}
+
+assign_convertors = {
+    'gdouble': 'number_as_double',
+    'gint': 'number_as_int',
+}
+
+boxed_overrides = ['/* This is a %s file */' % 'GENERATED']
+for b in parser.boxes:
+    if not b.fields:
+        continue
+
+    substdict = {
+        'cname': b.c_name,
+        'pyname': b.name,
+        'lcname': b.typecode.lower().replace('_type_', '_', 1),
+        'name': b.name.lower(),
+    }
+    for typ, attr in b.fields:
+        if typ not in assign_convertors:
+            continue
+
+        substdict['attr'] = attr
+        substdict['convertor'] = assign_convertors[typ]
+        setter = boxed_setter_template % substdict
+        boxed_overrides.append(setter)
+
+    if b.name not in boxed_sequence_likes:
+        continue
+
+    sq_getters = []
+    sq_setters = []
+    i = 0
+    for typ, attr in b.fields:
+        if typ not in extract_convertors or typ not in assign_convertors:
+            continue
+
+        substdict['attr'] = attr
+        substdict['i'] = i
+        substdict['convertor'] = extract_convertors[typ]
+        sq_getters.append(boxed_sequence_get_field_template % substdict)
+        substdict['convertor'] = assign_convertors[typ]
+        sq_setters.append(boxed_sequence_set_field_template % substdict)
+        boxed_overrides.append(setter)
+        i += 1
+
+    if not i:
+        continue
+
+    del substdict['attr']
+    del substdict['convertor']
+    del substdict['i']
+    substdict['get_fields'] = '\n'.join(sq_getters)
+    substdict['set_fields'] = '\n'.join(sq_setters)
+    substdict['nfields'] = i
+    sq_override = boxed_sequence_template % substdict
+    boxed_overrides.append(sq_override)
+
+file('boxed.override', 'w').write('\n'.join(boxed_overrides))
+
diff --git a/modules/pygwy/pygwy-fix-defs.py b/modules/pygwy/pygwy-fix-defs.py
deleted file mode 100644
index ee4eaa2..0000000
--- a/modules/pygwy/pygwy-fix-defs.py
+++ /dev/null
@@ -1,560 +0,0 @@
-#!/usr/bin/python
-# $Id: pygwy-fix-defs.py 19268 2016-11-15 12:48:19Z yeti-dn $
-# alter defs, fix parameters and return types
-import sys, re
-from optparse import OptionParser
-
-parser = OptionParser(usage='''\
-pygwy-fix-defs.py --codegendir=DIR
-Reads pygwy.defs.tmp.
-Generated pygwy.defs and boxed.override.''')
-
-parser.add_option('-c', '--codegendir', dest='codegendir', type='string',
-                  default='', metavar='DIR',
-                  help='Directory with codegen python modules')
-
-(options, args) = parser.parse_args()
-if options.codegendir:
-    sys.path.insert(0, options.codegendir)
-assert not args
-
-import defsparser, definitions
-
-# Arguments we need to fix for various functions.  The syntax is natural:
-# in each fix-list we list the affected arguments as the function arguments.
-# Note original C names (func.c_name) are used even for foo_pygwy functions.
-GwyDoubleOut_args = '''
-gwy_3d_view_get_scale_range(min_scale, max_scale)
-gwy_cdline_get_value(value)
-gwy_axis_get_range(min, max)
-gwy_axis_get_requested_range(min, max)
-gwy_color_axis_get_range(min, max)
-gwy_container_gis_double(value)
-gwy_data_field_area_fit_plane(pa, pbx, pby)
-gwy_data_field_area_get_inclination(theta, phi)
-gwy_data_field_area_get_min_max_mask(min, max)
-gwy_data_field_area_get_min_max(min, max)
-gwy_data_field_area_get_normal_coeffs(nx, ny, nz)
-gwy_data_field_area_get_stats(avg, ra, rms, skew, kurtosis)
-gwy_data_field_area_get_stats_mask(avg, ra, rms, skew, kurtosis)
-gwy_data_field_correct_laplace_iteration(error)
-gwy_data_field_fit_facet_plane(pa, pbx, pby)
-gwy_data_field_fit_plane(pa, pbx, pby)
-gwy_data_field_fractal_cubecounting_dim(a, b)
-gwy_data_field_fractal_partitioning_dim(a, b)
-gwy_data_field_fractal_psdf_dim(a, b)
-gwy_data_field_fractal_triangulation_dim(a, b)
-gwy_data_field_get_autorange(from_, to)
-gwy_data_field_get_inclination(theta, phi)
-gwy_data_field_get_min_max(min, max)
-gwy_data_field_get_normal_coeffs(nx, ny, nz)
-gwy_data_field_get_stats(avg, ra, rms, skew, kurtosis)
-gwy_data_field_hough_datafield_line_to_polar(rho, theta)
-gwy_data_line_get_line_coeffs(av, bv)
-gwy_data_line_get_min_max(min, max)
-gwy_data_line_part_get_min_max(min, max)
-gwy_data_view_coords_real_to_xy_float(xscr, yscr)
-gwy_data_view_coords_xy_to_real(xreal, yreal)
-gwy_data_view_get_real_data_offsets(xoffset, yoffset)
-gwy_data_view_get_real_data_sizes(xreal, yreal)
-gwy_data_view_get_real_data_sizes(xreal, yreal)
-gwy_graph_area_get_cursor(x_cursor, y_cursor)
-gwy_graph_curve_model_get_ranges(x_min, y_min, x_max, y_max)
-gwy_graph_curve_model_get_x_range(x_min, x_max)
-gwy_graph_curve_model_get_y_range(y_min, y_max)
-gwy_graph_model_get_ranges(x_min, y_min, x_max, y_max)
-gwy_graph_model_get_x_range(x_min, x_max)
-gwy_graph_model_get_y_range(y_min, y_max)
-gwy_layer_basic_get_range(min, max)
-gwy_math_curvature(kappa1, kappa2, phi1, phi2, xc, yc, zc)
-gwy_math_refine_maximum(x, y)
-gwy_ruler_get_range(lower, upper, position, max_size)
-gwy_ruler_get_range(lower, upper, position, max_size)
-gwy_spectra_itoxy(x, y)
-gwy_surface_get_min_max(min, max)
-gwy_surface_get_xrange(min, max)
-gwy_surface_get_yrange(min, max)
-gwy_math_find_nearest_line(d2min)
-gwy_math_find_nearest_point(d2min)
-'''
-
-GwyIntOut_args = '''
-gwy_container_gis_enum(value)
-gwy_container_gis_int32(value)
-gwy_container_gis_int64(value)
-gwy_data_chooser_get_active(id)
-gwy_data_field_area_count_in_range(nbelow, nabove)
-gwy_data_field_circular_area_extract_with_pos(xpos, ypos)
-gwy_data_field_grains_autocrop(left, right, up, down)
-gwy_data_field_hough_polar_line_to_datafield(px1, px2, py1, py2)
-gwy_data_view_coords_real_to_xy(xscr, yscr)
-gwy_data_view_coords_xy_clamp(xscr, yscr)
-gwy_data_view_get_pixel_data_sizes(xres, yres)
-gwy_enum_combo_box_update_int(integer)
-gwy_file_detect_with_score(score)
-gwy_gradient_get_points(npoints)
-gwy_gradient_get_samples(nsamples)
-gwy_math_curvature(dimen)
-gwy_math_humanize_numbers(precision)
-gwy_si_unit_new_parse(power10)
-gwy_si_unit_set_from_string_parse(power10)
-gwy_tip_estimate_full(count)
-gwy_tip_estimate_partial(count)
-gwy_peaks_analyze(npeaks)
-gwy_math_find_nearest_line(idx)
-gwy_math_find_nearest_point(idx)
-'''
-
-GwyBooleanOut_args = '''
-gwy_cdline_get_value(fres)
-gwy_nlfit_preset_guess(fres)
-gwy_math_is_in_polygon(is_inside)
-gwy_math_refine_maximum(refined)
-'''
-
-GwyRGBAOut_args = '''
-gwy_color_button_get_color(color)
-'''
-
-GwyIntInOut_args = '''
-gwy_data_view_coords_xy_clamp(xscr, yscr)
-gwy_data_view_coords_xy_cut_line(x0scr, y0scr, x1scr, y1scr)
-'''
-
-GObject_args = '''
-gwy_container_set_object(value)
-gwy_container_get_object(return)
-'''
-
-constgchar_args = '''
-gwy_container_get_string(return)
-gwy_container_set_const_string(value)
-gwy_container_set_const_string_by_name(value)
-'''
-
-nullable_args = '''
-gwy_app_data_browser_add_brick(data, preview)
-gwy_app_data_browser_add_data_field(data)
-gwy_app_data_browser_add_spectra(data)
-gwy_app_data_browser_add_graph_model(data)
-gwy_app_data_browser_add_surface(data)
-gwy_math_find_nearest_line(metric)
-gwy_math_find_nearest_point(metric)
-gwy_app_file_load(name)
-gwy_app_file_write(name)
-'''
-
-skip_args = '''
-gwy_app_file_load(filename_sys=NULL)
-gwy_app_file_write(filename_sys=NULL)
-gwy_tip_estimate_partial(set_fraction=NULL, set_message=NULL)
-gwy_tip_estimate_full(set_fraction=NULL, set_message=NULL)
-gwy_graph_export_postscript(str=NULL)
-gwy_graph_model_export_ascii(string=NULL)
-gwy_data_field_get_profile(data_line=NULL)
-gwy_brick_get_value_format_x(format=NULL)
-gwy_brick_get_value_format_y(format=NULL)
-gwy_brick_get_value_format_z(format=NULL)
-gwy_brick_get_value_format_w(format=NULL)
-gwy_data_field_get_value_format_xy(format=NULL)
-gwy_data_field_get_value_format_z(format=NULL)
-gwy_data_line_get_value_format_x(format=NULL)
-gwy_data_line_get_value_format_y(format=NULL)
-gwy_surface_get_value_format_xy(format=NULL)
-gwy_surface_get_value_format_z(format=NULL)
-'''
-
-default_args = '''
-gwy_data_field_affine(fill_value=0.0)
-gwy_data_line_new(nullme=TRUE)
-gwy_data_line_new_alike(nullme=TRUE)
-gwy_data_field_new(nullme=TRUE)
-gwy_data_field_new_alike(nullme=TRUE)
-gwy_brick_new(nullme=TRUE)
-gwy_brick_new_alike(nullme=TRUE)
-'''
-
-# Lists of functions that should have various attributes
-caller_owns_return_funcs = '''
-gwy_app_file_load
-gwy_brick_duplicate
-gwy_brick_new_alike
-gwy_brick_new_part
-gwy_construct_grain_quantity_units
-gwy_container_duplicate
-gwy_container_duplicate_by_prefix
-gwy_data_chooser_new_channels
-gwy_data_chooser_new_graphs
-gwy_data_chooser_new_volumes
-gwy_data_chooser_new_xyzs
-gwy_data_field_duplicate
-gwy_data_field_new_alike
-gwy_data_field_new_resampled
-gwy_data_field_new_rotated
-gwy_data_field_new_rotated_90
-gwy_data_line_duplicate
-gwy_data_line_new_alike
-gwy_data_line_new_resampled
-gwy_file_load
-gwy_graph_curve_model_duplicate
-gwy_graph_curve_model_new_alike
-gwy_graph_model_duplicate
-gwy_graph_model_new_alike
-gwy_si_unit_duplicate
-gwy_si_unit_new_parse
-gwy_si_unit_get_format
-gwy_si_unit_get_format_for_power10
-gwy_si_unit_get_format_with_digits
-gwy_si_unit_get_format_with_resolution
-gwy_spectra_duplicate
-gwy_spectra_new_alike
-gwy_surface_duplicate
-gwy_surface_new_alike
-gwy_surface_new_part
-gwy_nlfit_preset_get_param_units
-gwy_nlfit_preset_create_fitter
-gwy_cdline_get_param_units
-gwy_shape_fit_preset_get_param_units
-gwy_shape_fit_preset_get_secondary_units
-gwy_shape_fit_preset_create_fitter
-gwy_brick_get_value_format_x
-gwy_brick_get_value_format_y
-gwy_brick_get_value_format_z
-gwy_brick_get_value_format_w
-gwy_data_field_get_value_format_xy
-gwy_data_field_get_value_format_z
-gwy_data_line_get_value_format_x
-gwy_data_line_get_value_format_y
-gwy_surface_get_value_format_xy
-gwy_surface_get_value_format_z
-'''
-
-remove_funcs = '''
-gwy_math_lin_solve_rewrite
-gwy_gradient_get_samples
-gwy_gradient_sample
-gwy_vector_layer_button_press
-gwy_vector_layer_button_release
-gwy_vector_layer_motion_notify
-gwy_vector_layer_key_press
-gwy_vector_layer_key_release
-gwy_md5_get_digest
-gwy_gstring_replace
-gwy_gstring_to_native_eol
-gwy_app_data_browser_get_current
-gwy_container_set_string
-gwy_container_keys_by_name
-gwy_container_get_value
-gwy_container_set_value
-gwy_container_set_value_by_name
-gwy_si_value_format_set_units
-gwy_si_unit_value_format_set_units
-'''
-
-pygwy_added_funcs = '''
-gwy_key_from_name
-gwy_name_from_key
-gwy_data_line_set_data
-gwy_data_field_set_data
-gwy_brick_set_data
-gwy_data_field_create_full_mask
-gwy_get_grain_quantity_needs_same_units
-gwy_construct_grain_quantity_units
-'''
-
-boxed_sequence_likes = '''
-XY
-XYZ
-RGBA
-AppDataId
-'''
-
-# This is a hack; functions that are renamed to other functions and we want to
-# remove the originals because they would be generated too.
-remove_methods = '''
-GwyContainer.set_const_string
-GwyContainer.set_const_string_by_name
-'''
-
-def unwrap_name(fname, fail_if_not_wrapped=False):
-    if fname.endswith('_pygwy'):
-        return fname[:-6]
-    if fail_if_not_wrapped:
-        assert fname.endswith('_pygwy')
-    return fname
-
-def get_python_name(c_name):
-    py_name = c_name.capitalize()
-    letters = list(re.findall(r'_[a-z]', c_name))
-    for match in letters:
-        py_name = py_name.replace(match, match.upper()[1])
-    return py_name.replace('_', '')
-
-def parse_fix_args_spec(ffargs, spec, argattr):
-    re_fnmatch = re.compile(r'(?m)^(?P<cname>[a-zA-Z0-9_]+)'
-                            r'\((?P<args>[^)]+)\)$')
-    re_argsplit = re.compile(r'\s*,\s*').split
-    for m in re_fnmatch.finditer(spec):
-        name = m.group('cname')
-        if name not in ffargs:
-            ffargs[name] = {}
-        for arg in re_argsplit(m.group('args')):
-            # skip(foobar=NULL), default(foobar=1) or whatever
-            argval = None
-            if '=' in arg:
-                arg, argval = arg.split('=')
-
-            if arg not in ffargs[name]:
-                ffargs[name][arg] = set()
-
-            if argval is None:
-                ffargs[name][arg].add(argattr)
-            else:
-                ffargs[name][arg].add(argattr + argval)
-
-def parse_fix_func_props(ffprops, spec, argattr):
-    for m in re.finditer(r'\w+', spec):
-        name = m.group()
-        if name not in ffprops:
-            ffprops[name] = set()
-        ffprops[name].add(argattr)
-
-fix_function_args = {}
-parse_fix_args_spec(fix_function_args, GwyBooleanOut_args, 'type:GwyBooleanOutArg')
-parse_fix_args_spec(fix_function_args, GwyIntOut_args, 'type:GwyIntOutArg')
-parse_fix_args_spec(fix_function_args, GwyDoubleOut_args, 'type:GwyDoubleOutArg')
-parse_fix_args_spec(fix_function_args, GwyRGBAOut_args, 'type:GwyRGBAOutArg')
-parse_fix_args_spec(fix_function_args, GwyIntInOut_args, 'type:GwyIntInOutArg')
-parse_fix_args_spec(fix_function_args, GObject_args, 'type:GObject*')
-parse_fix_args_spec(fix_function_args, constgchar_args, 'type:const-gchar*')
-parse_fix_args_spec(fix_function_args, skip_args, 'skip:')
-parse_fix_args_spec(fix_function_args, default_args, 'default:')
-parse_fix_args_spec(fix_function_args, nullable_args, 'nullable')
-
-fix_function_props = {}
-parse_fix_func_props(fix_function_props, caller_owns_return_funcs, 'caller-owns-return')
-parse_fix_func_props(fix_function_props, remove_funcs, 'remove')
-
-added_functions_in_wrap_calls = {}
-parse_fix_func_props(added_functions_in_wrap_calls, pygwy_added_funcs, 'pygwy-added')
-
-remove_methods = set([x for x in remove_methods.split() if x])
-boxed_sequence_likes = set([x for x in boxed_sequence_likes.split() if x])
-
-parser = defsparser.DefsParser("pygwy.defs.tmp")
-parser.startParsing()
-parser.include('extra.defs')
-
-# We want to discard the originals of wrapped functions so that we do not see
-# `could-not-write-method messages' in the log for functions we did wrap.
-wrapped_funcs = {}
-for f in parser.functions:
-    assert not f.name[0].isdigit()
-    if f.name.endswith('_pygwy'):
-        wrapped_funcs[unwrap_name(f.c_name, True)] = None
-
-for i, f in enumerate(parser.functions):
-    if f.c_name in wrapped_funcs:
-        assert wrapped_funcs[f.c_name] is None
-        wrapped_funcs[f.c_name] = i
-        continue
-
-    f.name = unwrap_name(f.name)
-    c_name = unwrap_name(f.c_name)
-    if c_name in fix_function_props:
-        for funcprop in fix_function_props[c_name]:
-            if funcprop == 'caller-owns-return':
-                f.caller_owns_return = True
-            elif funcprop == 'remove':
-                wrapped_funcs[f.c_name] = i
-            else:
-                assert not 'Reached'
-
-        del fix_function_props[c_name]
-
-    if hasattr(f, 'of_object'):
-        qname = f.of_object + '.' + f.name
-        if qname in remove_methods:
-            wrapped_funcs[qname] = i
-
-    if c_name in fix_function_args:
-        to_fix = fix_function_args[c_name]
-        for p in f.params:
-            if p.pname not in to_fix:
-                continue
-            for argattr in to_fix[p.pname]:
-                if argattr == 'nullable':
-                    p.pnull = True
-                    p.pdflt = 'NULL'
-                elif argattr.startswith('default:'):
-                    p.pdflt = argattr.split(':')[1]
-                elif argattr.startswith('skip:'):
-                    # To skip a parameter completely we define it to be of
-                    # GwySkipArg and provide a default value.  The codegen
-                    # handler for that type then just passed this value without
-                    # putting any correspding arg into the Python protptype.
-                    p.ptype = 'GwySkipArg'
-                    p.pdflt = argattr.split(':')[1]
-                elif argattr.startswith('type:'):
-                    p.ptype = argattr.split(':')[1]
-                else:
-                    assert not 'Reached'
-            del to_fix[p.pname]
-        if 'return' in to_fix:
-            for argattr in to_fix['return']:
-                if argattr.startswith('type:'):
-                    f.ret = argattr.split(':')[1]
-                else:
-                    assert not 'Reached'
-            del to_fix['return']
-
-        if not fix_function_args[c_name]:
-            del fix_function_args[c_name]
-
-# Unused fix items mean potential errors.
-for f in fix_function_args.items():
-    sys.stderr.write('Warning: unused fixarg %s: %s\n' % (f[0], str(f[1])))
-for f in fix_function_props.items():
-    sys.stderr.write('Warning: unused fixfunc %s: %s\n' % (f[0], str(f[1])))
-for f, i in wrapped_funcs.items():
-    if f in added_functions_in_wrap_calls:
-        continue
-    if i is None:
-        sys.stderr.write('Warning: wrapper for %s does not wrap existing function\n' % f)
-
-for i in reversed(sorted(wrapped_funcs.values())):
-    if i is not None:
-        del parser.functions[i]
-
-parser.write_defs()
-
-# Generate setters and sequence-like wrappers for boxed types.  Generally, if
-# we declare something as boxed type with some fields we want it work as a
-# plain C struct.
-boxed_setter_template = '''\
-%%%%
-override-attr %(cname)s.%(attr)s
-static int
-_wrap_%(lcname)s__set_%(attr)s(PyGBoxed *self, PyObject *value, void *closure)
-{
-    return assign_%(convertor)s(value, &pyg_boxed_get(self, %(cname)s)->%(attr)s, "%(pyname)s.%(attr)s");
-}
-'''
-
-boxed_sequence_template = '''\
-%%%%
-override-slot %(cname)s.tp_as_sequence
-
-static ssize_t
-_sq_%(lcname)s_length(G_GNUC_UNUSED PyGObject *self)
-{
-    return %(nfields)u;
-}
-
-static PyObject*
-_sq_%(lcname)s_item(PyGObject *self, Py_ssize_t i)
-{
-    const %(cname)s *%(name)s = pyg_boxed_get(self, %(cname)s);
-
-%(get_fields)s
-    PyErr_SetString(PyExc_IndexError, "%(pyname)s index out of range");
-    return NULL;
-}
-
-static int
-_sq_%(lcname)s_ass_item(PyGObject *self, Py_ssize_t i, PyObject *item)
-{
-    %(cname)s *%(name)s = pyg_boxed_get(self, %(cname)s);
-
-%(set_fields)s
-    PyErr_SetString(PyExc_IndexError, "%(pyname)s index out of range");
-    return -1;
-}
-
-static const PySequenceMethods _wrap_%(lcname)s_tp_as_sequence = {
-    (lenfunc)_sq_%(lcname)s_length,
-    NULL,
-    NULL,
-    (ssizeargfunc)_sq_%(lcname)s_item,
-    NULL,
-    (ssizeobjargproc)_sq_%(lcname)s_ass_item,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-};
-'''
-
-boxed_sequence_get_field_template = '''\
-    if (i == %(i)u)
-        return %(convertor)s(%(name)s->%(attr)s);
-'''
-
-boxed_sequence_set_field_template = '''\
-    if (i == %(i)u)
-        return assign_%(convertor)s(item, &%(name)s->%(attr)s, "%(pyname)s %(attr)s item");
-'''
-
-extract_convertors = {
-    'gdouble': 'PyFloat_FromDouble',
-    'gint': 'PyInt_FromLong',
-}
-
-assign_convertors = {
-    'gdouble': 'number_as_double',
-    'gint': 'number_as_int',
-}
-
-boxed_overrides = ['/* This is a %s file */' % 'GENERATED']
-for b in parser.boxes:
-    if not b.fields:
-        continue
-
-    substdict = {
-        'cname': b.c_name,
-        'pyname': b.name,
-        'lcname': b.typecode.lower().replace('_type_', '_', 1),
-        'name': b.name.lower(),
-    }
-    for typ, attr in b.fields:
-        if typ not in assign_convertors:
-            continue
-
-        substdict['attr'] = attr
-        substdict['convertor'] = assign_convertors[typ]
-        setter = boxed_setter_template % substdict
-        boxed_overrides.append(setter)
-
-    if b.name not in boxed_sequence_likes:
-        continue
-
-    sq_getters = []
-    sq_setters = []
-    i = 0
-    for typ, attr in b.fields:
-        if typ not in extract_convertors or typ not in assign_convertors:
-            continue
-
-        substdict['attr'] = attr
-        substdict['i'] = i
-        substdict['convertor'] = extract_convertors[typ]
-        sq_getters.append(boxed_sequence_get_field_template % substdict)
-        substdict['convertor'] = assign_convertors[typ]
-        sq_setters.append(boxed_sequence_set_field_template % substdict)
-        boxed_overrides.append(setter)
-        i += 1
-
-    if not i:
-        continue
-
-    del substdict['attr']
-    del substdict['convertor']
-    del substdict['i']
-    substdict['get_fields'] = '\n'.join(sq_getters)
-    substdict['set_fields'] = '\n'.join(sq_setters)
-    substdict['nfields'] = i
-    sq_override = boxed_sequence_template % substdict
-    boxed_overrides.append(sq_override)
-
-file('boxed.override', 'w').write('\n'.join(boxed_overrides))
-
diff --git a/modules/pygwy/pygwy-fix-defs.sed b/modules/pygwy/pygwy-fix-defs.sed
deleted file mode 100644
index df05898..0000000
--- a/modules/pygwy/pygwy-fix-defs.sed
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/sed -f
-s/define-object Serializable/define-interface Serializable/
-s/GWY_TYPE_SELECTION_GRAPH1_DAREA\>/GWY_TYPE_SELECTION_GRAPH_1DAREA/
-s/GWY_TYPE_NL_FIT_PRESET\>/GWY_TYPE_NLFIT_PRESET/
-s/GWY_TYPE_CD_LINE\>/GWY_TYPE_CDLINE/
-s/GwyXyz\>/GwyXYZ/
-s/GwyXy\>/GwyXY/
-s/GwyRgba\>/GwyRGBA/
-s/GwySiUnit\>/GwySIUnit/
-s/GwySiValueFormat\>/GwySIValueFormat/
-s/GwyCdLine\>/GwyCDLine/
-s/GwyGl\([A-Z]\)/GwyGL\1/
-s/Gwy\([HV]\)ruler\>/Gwy\1Ruler/
-s/Gwy\([HV]\)marker/Gwy\1Marker/
-s/GwyNLFitter\>/GwyMathNLFit/
-s/GwyMathNlfit\>/GwyMathNLFit/
-s/define-method \([1-3]d\)\([a-z]\+\)/define-method \2\1/
-s/"\(as\|assert\|def\|exec\|from\|global\|import\|in\|is\|lambda\|pass\|print\|raise\|with\|yield\)")/"\1_")/
diff --git a/modules/pygwy/pygwy-generate-doc.py b/modules/pygwy/pygwy-generate-doc.py
index 8939229..2fd3533 100644
--- a/modules/pygwy/pygwy-generate-doc.py
+++ b/modules/pygwy/pygwy-generate-doc.py
@@ -1,5 +1,5 @@
 #!/usr/bin/python
-# $Id: pygwy-generate-doc.py 19221 2016-11-09 21:11:19Z yeti-dn $
+# $Id: pygwy-generate-doc.py 19323 2016-11-28 21:01:00Z yeti-dn $
 # Script for generation of gwy.py dummy file. The file contains empty function bodies with comments.
 # Used for generation of documentation by using epydoc.
 # Public domain
@@ -102,7 +102,10 @@ def rep_location(r):
 
 def replace_special(s):
     s = re.sub(r'<warning>', r'@warning:', s)
-    s = re.sub(r'</warning>', '', s)
+    s = re.sub(r'</warning>', r'', s)
+    s = re.sub(r'<(emphasis|guimenu|guimenuitem)>(.*?)</\1>', r'I{\2}', s)
+    s = re.sub(r'<literal>(.*?)</literal>', r'C{\1}', s)
+    s = re.sub(r'<!--\s+-->', r'', s)
     s = re.sub(r'%([a-zA-Z0-9_]+)', rep_code, s)
     s = re.sub(r'@([a-zA-Z0-9_]+)', rep_code, s)
     s = re.sub(r'#([a-zA-Z0-9_]+)', rep_code, s)
diff --git a/modules/pygwy/pygwy.c b/modules/pygwy/pygwy.c
index 441b810..6a11913 100644
--- a/modules/pygwy/pygwy.c
+++ b/modules/pygwy/pygwy.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: pygwy.c 19265 2016-11-15 12:22:37Z yeti-dn $
- *  Copyright (C) 2004-2016 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: pygwy.c 20181 2017-08-07 09:26:23Z yeti-dn $
+ *  Copyright (C) 2004-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -28,11 +28,12 @@
 #include "config.h"
 
 /* include this first, before NO_IMPORT_PYGOBJECT is defined */
-#include <pygtk-2.0/pygobject.h>
-#include <app/gwyapp.h>
+#include <pygobject.h>
 #include "wrap_calls.h"
 #include <stdarg.h>
 #include <glib/gstdio.h>
+#include <Python.h>
+
 #include "pygwy.h"
 
 #include "pygwywrap.c"
@@ -63,6 +64,15 @@ typedef struct {
     PyObject *code;
     time_t m_time;
     PygwyModuleType type;
+
+    /* Used only during registration and may become dangling pointers
+     * afterwards. */
+    const gchar *desc;
+    const gchar *menu_path;
+    const gchar *icon;
+    GwyMenuSensFlags sens;
+    GwyRunType run;
+
     /* Used dynamically during execution */
     PyObject *module;
     PyObject *dict;
@@ -89,6 +99,7 @@ static gint             pygwy_file_detect_run         (const GwyFileDetectInfo *
                                                        gboolean only_name,
                                                        const gchar *name);
 static void             pygwy_register_modules        (void);
+static gchar**          find_module_candidates        (gchar **module_dir_name);
 static void             free_module_info              (PygwyModuleInfo *info);
 static gboolean         update_module_code            (PygwyModuleInfo *info);
 static PygwyModuleInfo* pygwy_find_module             (const gchar* name);
@@ -119,7 +130,7 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Pygwy, the Gwyddion Python wrapper."),
     "Jan Hořák <xhorak at gmail.com>, Yeti <yeti at gwyddion.net>",
-    "2.0",
+    "2.3",
     "Jan Hořák & David Nečas (Yeti)",
     "2007"
 };
@@ -172,6 +183,7 @@ check_pygtk_availability(void)
         return FALSE;
     }
 
+    gwy_debug("python path %s", pythondir);
     filename = g_build_filename(pythondir, "Lib", "site-packages", "gtk-2.0",
                                 "gobject", "__init__.py", NULL);
     if (!g_file_test(filename, G_FILE_TEST_IS_REGULAR)) {
@@ -236,7 +248,7 @@ pygwy_initialize(void)
         init_pygobject();
 
         gwy_debug("Init module gwy");
-        m = Py_InitModule("gwy", (PyMethodDef*) pygwy_functions);
+        m = Py_InitModule("gwy", (PyMethodDef*)pygwy_functions);
         gwy_debug("Get dict");
         pygwy_dict = PyModule_GetDict(m);
 
@@ -302,16 +314,20 @@ pygwy_finalize_stderr_redirect(PyObject *d)
 }
 
 static void
-pygwy_add_sys_path(PyObject *dir, gchar *path)
+pygwy_add_sys_path(PyObject *dir, const gchar *path)
 {
-    gchar *sys_path_append;
+    static const gchar sys_path_append_template[] =
+        "import sys\n"
+        "if '%s' not in sys.path:\n"
+        "    sys.path.append('%s')\n"
+        "\n";
 
     if (g_file_test(path, G_FILE_TEST_IS_DIR)) {
-        sys_path_append = g_strdup_printf("import sys\n"
-                                          "sys.path.append('%s')\n",
-                                          path);
-        pygwy_run_string(sys_path_append, Py_file_input, dir, dir);
-        g_free(sys_path_append);
+        gchar *p = gwy_strreplace(path, "'", "\\'", (gsize)-1);
+        gchar *command = g_strdup_printf(sys_path_append_template, p, p);
+        g_free(p);
+        pygwy_run_string(command, Py_file_input, dir, dir);
+        g_free(command);
     }
     else {
         g_warning("Cannot add non-existent path '%s'.", path);
@@ -385,31 +401,49 @@ err_PYTHON(GError **error)
 }
 
 static const gchar*
-pygwy_read_val_from_dict(PyObject *dict, char *v, const gchar *f)
+pygwy_read_str_from_dict(PyObject *dict, char *v, const gchar *filename,
+                         gboolean required)
 {
-    const char *ret;
     PyObject *py_str;
+    const char *ret;
 
     if ((py_str = PyDict_GetItemString(dict, v))) {
         if (PyArg_Parse(py_str, "s", &ret)) {
-            gwy_debug("Read value '%s' from '%s': %s", v, f, ret);
+            gwy_debug("Read value '%s' from '%s': %s", v, filename, ret);
             return ret;
         }
     }
-    g_warning("Value '%s' not found in '%s'.", v, f);
+    if (required) {
+        g_warning("Value '%s' not found in '%s'.", v, filename);
+    }
     return NULL;
 }
 
+static gboolean
+pygwy_read_flags_from_dict(PyObject *dict, char *v, const gchar *filename,
+                           guint *ret)
+{
+    PyObject *py_flags;
+
+    if ((py_flags = PyDict_GetItemString(dict, v))) {
+        if (PyArg_Parse(py_flags, "I", ret)) {
+            gwy_debug("Read value '%s' from '%s': %u", v, filename, *ret);
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
 /* Contract: It must either return NULL or PygwyModuleInfo that is correct
  * for given module type with all required fields filled. */
 static PygwyModuleInfo*
-pygwy_get_module_info(const gchar *fullpath, const gchar *filename,
-                      const gchar **desc, const gchar **menu_path)
+pygwy_get_module_info(const gchar *fullpath, const gchar *filename)
 {
     PygwyModuleInfo *info = NULL;
     gchar *suffix;
     const gchar *type_str;
     PyObject *module = NULL, *d, *module_dict;
+    gboolean type_is_dataprocess;
 
     info = g_new0(PygwyModuleInfo, 1);
     info->fullpath = g_strdup(fullpath);
@@ -436,7 +470,8 @@ pygwy_get_module_info(const gchar *fullpath, const gchar *filename,
 
     /* Get parameters from dict */
     module_dict = PyModule_GetDict(module);
-    type_str = pygwy_read_val_from_dict(module_dict, "plugin_type", fullpath);
+    type_str = pygwy_read_str_from_dict(module_dict, "plugin_type", fullpath,
+                                        TRUE);
     gwy_debug("read values: %s %p", type_str, type_str);
     if (!type_str) {
         g_warning("Undefined module type, cannot load.");
@@ -448,27 +483,62 @@ pygwy_get_module_info(const gchar *fullpath, const gchar *filename,
         g_warning("Unrecognised module type %s, cannot load.", type_str);
         goto fail;
     }
+    type_is_dataprocess = (info->type == PYGWY_PROCESS
+                           || info->type == PYGWY_GRAPH
+                           || info->type == PYGWY_VOLUME
+                           || info->type == PYGWY_XYZ);
 
     /* plugin_desc is required for file modules (as the file type) */
-    *desc = pygwy_read_val_from_dict(module_dict, "plugin_desc", fullpath);
-    if (info->type == PYGWY_FILE && !*desc) {
+    info->desc = pygwy_read_str_from_dict(module_dict, "plugin_desc", fullpath,
+                                          TRUE);
+    if (info->type == PYGWY_FILE && !info->desc) {
         info->type = PYGWY_UNDEFINED;
         goto fail;
     }
-    else if (!*desc)
-        *desc = N_("Function written in Python");  /* Not very descriptive. */
-
-    /* menu path is required for all something-processing  modules */
-    if (info->type == PYGWY_PROCESS || info->type == PYGWY_GRAPH
-        || info->type == PYGWY_VOLUME || info->type == PYGWY_XYZ) {
-        *menu_path = pygwy_read_val_from_dict(module_dict, "plugin_menu",
-                                              fullpath);
-        if (!*menu_path) {
+    else if (!info->desc) {
+        /* Not very descriptive... */
+        info->desc = N_("Function written in Python");
+    }
+    gwy_debug("desc: %s", info->desc);
+
+    /* menu path is required for all something-processing modules */
+    if (type_is_dataprocess) {
+        info->menu_path = pygwy_read_str_from_dict(module_dict, "plugin_menu",
+                                                   fullpath, TRUE);
+        if (!info->menu_path) {
             info->type = PYGWY_UNDEFINED;
             goto fail;
         }
+        gwy_debug("menu_path: %s", info->menu_path);
+    }
+
+    /* icon is optional for something-processing modules */
+    if (type_is_dataprocess) {
+        info->icon = pygwy_read_str_from_dict(module_dict, "plugin_icon",
+                                              fullpath, FALSE);
+        gwy_debug("icon: %s", info->icon);
+    }
+
+    /* run mode and sensitivity are optional for something-processing modules */
+    if (type_is_dataprocess) {
+        if (info->type == PYGWY_PROCESS)
+            info->sens = GWY_MENU_FLAG_DATA;
+        else if (info->type == PYGWY_GRAPH)
+            info->sens = GWY_MENU_FLAG_GRAPH;
+        else if (info->type == PYGWY_VOLUME)
+            info->sens = GWY_MENU_FLAG_VOLUME;
+        else if (info->type == PYGWY_XYZ)
+            info->sens = GWY_MENU_FLAG_XYZ;
+
+        pygwy_read_flags_from_dict(module_dict, "plugin_sens", fullpath,
+                                   &info->sens);
+        gwy_debug("sens: 0x%04x", info->sens);
+
+        info->run = (GWY_RUN_INTERACTIVE | GWY_RUN_IMMEDIATE);
+        pygwy_read_flags_from_dict(module_dict, "plugin_run", fullpath,
+                                   &info->run);
+        gwy_debug("run: 0x%04x", info->run);
     }
-    gwy_debug("read values: %s %s", *desc, *menu_path);
 
 fail:
     if (info->type == PYGWY_UNDEFINED) {
@@ -497,57 +567,28 @@ free_module_info(PygwyModuleInfo *info)
 static void
 pygwy_register_modules(void)
 {
-    GDir *module_dir;
     gchar *fullpath, *module_dir_name;
-    const gchar *desc, *menu_path, *filename;
     PygwyModuleInfo *info;
-    GError *err = NULL;
     gboolean ok;
+    gchar **candidates;
+    guint i;
 
-    module_dir_name = g_build_filename(gwy_get_user_dir(),
-                                       pygwy_module_dir_name,
-                                       NULL);
-    gwy_debug("Module path: %s", module_dir_name);
-
-    module_dir = g_dir_open(module_dir_name, 0, &err);
-    if (module_dir == NULL && err) {
-        if (err->code == G_FILE_ERROR_NOENT) {
-            /* directory not found/does not exist */
-            if (g_mkdir(module_dir_name, 0700)) {
-                g_warning("Cannot create pygwy module directory %s",
-                          module_dir_name);
-            }
-            else {
-                gwy_debug("Pygwy directory created: %s", module_dir_name);
-            }
-        }
-        else {
-            g_warning("Cannot open pygwy directory: %s, reason: %s",
-                      module_dir_name, err->message);
-        }
+    candidates = find_module_candidates(&module_dir_name);
+    if (!candidates) {
         g_free(module_dir_name);
-        /* Whether the directory has been created or not, there is no reason
-           to continue by reading scripts as long as no script is available */
         return;
     }
 
-    /* Initialize python iterpret and init gwy module */
+    /* Initialize the python interpret and init gwy module.  Only do it here
+     * if we find any potential python modules.  Otherwise postpone the cost
+     * to pygwy console invocation, if if ever comes. */
     pygwy_initialize();
-    while ((filename = g_dir_read_name(module_dir))) {
-        if (!g_str_has_suffix(filename, ".py")
-            && !g_str_has_suffix(filename, ".PY")
-            && !g_str_has_suffix(filename, ".Py")) {
-            gwy_debug("Skipping file with wrong extension: %s", filename);
-            continue;
-        }
-
+    for (i = 0; candidates[i]; i++) {
         /* Read content of module file */
-        fullpath = g_build_filename(module_dir_name, filename, NULL);
+        fullpath = g_build_filename(module_dir_name, candidates[i], NULL);
 
         /* get module's metadata */
-        desc = NULL;
-        menu_path = NULL;
-        info = pygwy_get_module_info(fullpath, filename, &desc, &menu_path);
+        info = pygwy_get_module_info(fullpath, candidates[i]);
         g_free(fullpath);
         if (!info)
             continue;
@@ -556,15 +597,12 @@ pygwy_register_modules(void)
         if (info->type == PYGWY_PROCESS) {
             gwy_debug("Registering proc func.");
             ok = gwy_process_func_register(info->name, pygwy_procvolxyz_run,
-                                           menu_path,
-                                           NULL,
-                                           GWY_RUN_INTERACTIVE | GWY_RUN_IMMEDIATE,
-                                           GWY_MENU_FLAG_DATA, desc);
+                                           info->menu_path, info->icon,
+                                           info->run, info->sens, info->desc);
         }
         else if (info->type == PYGWY_FILE) {
             gwy_debug("Registering file func.");
-            ok = gwy_file_func_register(info->name,
-                                        desc,
+            ok = gwy_file_func_register(info->name, info->desc,
                                         pygwy_file_detect_run,
                                         pygwy_file_load_run,
                                         NULL,
@@ -572,32 +610,22 @@ pygwy_register_modules(void)
         }
         else if (info->type == PYGWY_GRAPH) {
             gwy_debug("Registering graph func.");
-            ok = gwy_graph_func_register(info->name,
-                                         pygwy_graph_run,
-                                         menu_path,
-                                         GWY_STOCK_GRAPH_FUNCTION,
-                                         GWY_MENU_FLAG_GRAPH,
-                                         desc);
+            ok = gwy_graph_func_register(info->name, pygwy_graph_run,
+                                         info->menu_path, info->icon,
+                                         info->sens, info->desc);
         }
         else if (info->type == PYGWY_VOLUME) {
             gwy_debug("Registering volume func.");
-            ok = gwy_volume_func_register(info->name,
-                                          pygwy_procvolxyz_run,
-                                          menu_path,
-                                          NULL,
-                                          GWY_RUN_IMMEDIATE,
-                                          GWY_MENU_FLAG_VOLUME,
-                                          desc);
+            ok = gwy_volume_func_register(info->name, pygwy_procvolxyz_run,
+                                          info->menu_path, info->icon,
+                                          info->run, info->sens, info->desc);
         }
         else if (info->type == PYGWY_XYZ) {
             gwy_debug("Registering xyz func.");
             ok = gwy_volume_func_register(info->name,
                                           pygwy_procvolxyz_run,
-                                          menu_path,
-                                          NULL,
-                                          GWY_RUN_IMMEDIATE,
-                                          GWY_MENU_FLAG_XYZ,
-                                          desc);
+                                          info->menu_path, info->icon,
+                                          info->run, info->sens, info->desc);
         }
         else {
             g_assert_not_reached();
@@ -608,8 +636,65 @@ pygwy_register_modules(void)
         else
             free_module_info(info);
     }
-    g_dir_close(module_dir);
     g_free(module_dir_name);
+    g_strfreev(candidates);
+}
+
+static gchar**
+find_module_candidates(gchar **module_dir_name)
+{
+    GDir *module_dir;
+    const gchar *filename, *dot;
+    GPtrArray *candidates = NULL;
+    GError *err = NULL;
+
+    *module_dir_name = g_build_filename(gwy_get_user_dir(),
+                                        pygwy_module_dir_name,
+                                        NULL);
+    gwy_debug("Module path: %s", *module_dir_name);
+
+    module_dir = g_dir_open(*module_dir_name, 0, &err);
+    if (module_dir == NULL && err) {
+        if (err->code == G_FILE_ERROR_NOENT) {
+            /* directory not found/does not exist */
+            if (g_mkdir(*module_dir_name, 0700)) {
+                g_warning("Cannot create pygwy module directory %s",
+                          *module_dir_name);
+            }
+            else {
+                gwy_debug("Pygwy directory created: %s", *module_dir_name);
+            }
+        }
+        else {
+            g_warning("Cannot open pygwy directory: %s, reason: %s",
+                      *module_dir_name, err->message);
+        }
+        /* Whether the directory has been created or not, there is no reason
+           to continue by reading scripts as long as no script is available */
+        return NULL;
+    }
+
+    while ((filename = g_dir_read_name(module_dir))) {
+        if (!(dot = strrchr(filename, '.'))) {
+            gwy_debug("Skipping file with no extension: %s", filename);
+            continue;
+        }
+        if (g_ascii_strcasecmp(dot+1, "py") != 0) {
+            gwy_debug("Skipping file with wrong extension: %s", filename);
+            continue;
+        }
+
+        if (!candidates)
+            candidates = g_ptr_array_new();
+        g_ptr_array_add(candidates, g_strdup(filename));
+    }
+    g_dir_close(module_dir);
+
+    if (!candidates)
+        return NULL;
+
+    g_ptr_array_add(candidates, NULL);
+    return (gchar**)g_ptr_array_free(candidates, FALSE);
 }
 
 /* (Re)load module code.  The function succeeds if, after finishing, we have
diff --git a/modules/pygwy/pygwy.h b/modules/pygwy/pygwy.h
index c0ea5ba..9bcfc1c 100644
--- a/modules/pygwy/pygwy.h
+++ b/modules/pygwy/pygwy.h
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: pygwy.h 19267 2016-11-15 12:25:40Z yeti-dn $
+ *  @(#) $Id: pygwy.h 19294 2016-11-20 08:27:30Z yeti-dn $
  *  Copyright (C) 2008 Jan Horak
  *  E-mail: xhorak at gmail.com
  *
@@ -27,21 +27,25 @@
 
 #define pygwy_stderr_redirect_setup_code \
     "import sys, tempfile\n" \
-    "_pygwy_stderr_redir = tempfile.TemporaryFile()\n" \
+    "_pygwy_output_redir = tempfile.TemporaryFile()\n" \
     "_pygwy_stderr_orig = sys.stderr\n" \
-    "sys.stderr = _pygwy_stderr_redir\n"
+    "_pygwy_stdout_orig = sys.stdout\n" \
+    "sys.stderr = _pygwy_output_redir\n" \
+    "sys.stdout = _pygwy_output_redir\n"
 
 #define pygwy_stderr_redirect_restore_code \
-    "_pygwy_stderr_redir.seek(0)\n" \
-    "_pygwy_stderr_string = _pygwy_stderr_redir.read()\n" \
-    "_pygwy_stderr_redir.close()\n" \
-    "sys.stderr = _pygwy_stderr_orig\n"
+    "_pygwy_output_redir.seek(0)\n" \
+    "_pygwy_stderr_string = _pygwy_output_redir.read()\n" \
+    "_pygwy_output_redir.close()\n" \
+    "sys.stderr = _pygwy_stderr_orig\n" \
+    "sys.stdout = _pygwy_stdout_orig\n"
 
 #define pygwy_stderr_redirect_readstr_code \
-    "_pygwy_stderr_pos = _pygwy_stderr_redir.tell()\n" \
-    "_pygwy_stderr_redir.seek(0)\n" \
-    "_pygwy_stderr_string = _pygwy_stderr_redir.read(_pygwy_stderr_pos)\n" \
-    "_pygwy_stderr_redir.seek(0)"
+    "_pygwy_output_redir.flush()\n" \
+    "_pygwy_stderr_pos = _pygwy_output_redir.tell()\n" \
+    "_pygwy_output_redir.seek(0)\n" \
+    "_pygwy_stderr_string = _pygwy_output_redir.read(_pygwy_stderr_pos)\n" \
+    "_pygwy_output_redir.seek(0)"
 
 PyObject* pygwy_create_environment (const gchar *filename,
                                     gboolean show_errors);
diff --git a/modules/pygwy/pygwy.override b/modules/pygwy/pygwy.override
index 616a8e5..37c81ef 100644
--- a/modules/pygwy/pygwy.override
+++ b/modules/pygwy/pygwy.override
@@ -1,5 +1,5 @@
 /*
- *  $Id: pygwy.override 19233 2016-11-10 19:31:14Z yeti-dn $
+ *  $Id: pygwy.override 19325 2016-11-28 22:26:23Z yeti-dn $
  *  Copyright (C) 2008 Jan Horak, 2015-2016 David Necas (Yeti)
  *  E-mail: xhorak at gmail.com, yeti at gwyddion.net.
  *
@@ -45,9 +45,6 @@ typedef gdouble GwyDoubleOutArg;
 typedef gdouble GwyDoubleInOutArg;
 typedef GwyRGBA GwyRGBAOutArg;
 
-typedef gchar keep_gchar;       // do not delete when returning
-typedef gchar pass_owner_gchar; // do not delete in wrapped function
-
 typedef GwyNLFitter GwyMathNLFit;
 
 #define gwy_si_value_format_new gwy_si_unit_value_format_new
@@ -158,6 +155,105 @@ create_list_consume_int_garray(GArray *array)
     return list;
 }
 
+static gchar*
+extract_stringlike_as_new_string(PyObject *value)
+{
+    if (PyString_Check(value))
+        return g_strdup(PyString_AsString(value));
+
+    if (PyUnicode_Check(value)) {
+        PyObject *utf8value = PyUnicode_AsUTF8String(value);
+        gchar *ret;
+
+        if (!utf8value)
+            return NULL;
+        ret = g_strdup(PyString_AsString(utf8value));
+        Py_DECREF(utf8value);
+        return ret;
+    }
+
+    return NULL;
+}
+
+static void
+free_string_array(GArray *array)
+{
+    gsize i, n = array->len;
+    gchar *s;
+
+    for (i = 0; i < n; i++) {
+        s = g_array_index(array, gchar*, i);
+        if (!s)
+            break;
+        g_free(s);
+    }
+    g_array_free(array, TRUE);
+}
+
+static GArray*
+create_string_garray_from_sequence(PyObject *object)
+{
+    GArray *array;
+    gchar **a;
+    gsize n, i;
+
+    if (!PySequence_Check(object))
+        return NULL;
+
+    n = PySequence_Size(object);
+    array = g_array_new(FALSE, TRUE, sizeof(gchar*));
+    g_array_set_size(array, n);
+    a = (gchar**)array->data;
+    for (i = 0; i < n; i++) {
+        PyObject *item = PySequence_GetItem(object, i);
+        if (!(a[i] = extract_stringlike_as_new_string(item))) {
+            free_string_array(array);
+            return NULL;
+        }
+    }
+    return array;
+}
+
+static PyObject*
+create_list_consume_string_garray(GArray *array)
+{
+    PyObject *list;
+    const gchar **a;
+    gsize n, i;
+
+    n = array->len;
+    if (!(list = PyList_New(n))) {
+        free_string_array(array);
+        /* Should we raise an exception, or who does it? */
+        return NULL;
+    }
+    a = (const gchar**)array->data;
+    for (i = 0; i < n; i++)
+        PyList_SetItem(list, i, PyString_FromString(a[i]));
+    free_string_array(array);
+    return list;
+}
+
+static PyObject*
+create_list_consume_const_string_garray(GArray *array)
+{
+    PyObject *list;
+    const gchar **a;
+    gsize n, i;
+
+    n = array->len;
+    if (!(list = PyList_New(n))) {
+        g_array_free(array, TRUE);
+        /* Should we raise an exception, or who does it? */
+        return NULL;
+    }
+    a = (const gchar**)array->data;
+    for (i = 0; i < n; i++)
+        PyList_SetItem(list, i, PyString_FromString(a[i]));
+    g_array_free(array, TRUE);
+    return list;
+}
+
 static PyObject*
 create_string_consume_gstring(GString *str)
 {
@@ -516,27 +612,6 @@ static const PyMappingMethods _wrap_gwy_container_tp_as_mapping = {
 };
 
 %%
-define GwyContainer.keys_by_name noargs
-static PyObject*
-_wrap_gwy_container_keys_by_name(PyGObject *self)
-{
-    gint i;
-    const gchar **keys;
-    PyObject *tuple;
-
-    keys = gwy_container_keys_by_name(GWY_CONTAINER(self->obj));
-    tuple = PyTuple_New(gwy_container_get_n_items(GWY_CONTAINER(self->obj)));
-    if (!tuple)
-        return NULL;
-    // fill tuple with keys
-    for (i = 0 ; i < gwy_container_get_n_items(GWY_CONTAINER(self->obj)); i++) {
-        PyTuple_SetItem(tuple, i, PyString_FromString(keys[i]));
-    }
-    g_free(keys);
-    return tuple;
-}
-
-%%
 define GwyContainer.get_value_by_name kwargs
 static PyObject *
 _wrap_gwy_container_get_value_by_name(PyGObject *self, PyObject *args, PyObject *kwargs)
@@ -880,18 +955,11 @@ static int
 _wrap_gwy_si_value_format__set_units(PyGBoxed *self, PyObject *value, void *closure)
 {
     GwySIValueFormat *vf = pyg_boxed_get(self, GwySIValueFormat);
+    gchar *s;
 
-    if (PyString_Check(value)) {
-        gwy_si_value_format_set_units(vf, PyString_AsString(value));
-        return 0;
-    }
-    if (PyUnicode_Check(value)) {
-        PyObject *utf8value = PyUnicode_AsUTF8String(value);
-
-        if (!utf8value)
-            return -1;
-        gwy_si_value_format_set_units(vf, PyString_AsString(utf8value));
-        Py_DECREF(utf8value);
+    if ((s = extract_stringlike_as_new_string(value))) {
+        gwy_si_value_format_set_units(vf, s);
+        g_free(s);
         return 0;
     }
     PyErr_SetString(PyExc_TypeError, "Units must be a string.");
diff --git a/modules/pygwy/wrap_calls.c b/modules/pygwy/wrap_calls.c
index 1cc1e9b..0ec40f5 100644
--- a/modules/pygwy/wrap_calls.c
+++ b/modules/pygwy/wrap_calls.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: wrap_calls.c 19279 2016-11-16 16:52:15Z yeti-dn $
+ *  $Id: wrap_calls.c 20180 2017-08-07 09:18:25Z yeti-dn $
  *  Copyright (C) 2008 Jan Horak, 2015-2016 David Necas (Yeti)
  *  E-mail: xhorak at gmail.com, yeti at gwyddion.net.
  *
@@ -47,6 +47,42 @@ create_int_array(const gint *data, guint len, gboolean free_data)
    return ret;
 }
 
+static void
+free_string_array(GwyStringArray *array)
+{
+    gsize i, n = array->len;
+    gchar *s;
+
+    for (i = 0; i < n; i++) {
+        s = g_array_index(array, gchar*, i);
+        if (!s)
+            break;
+        g_free(s);
+    }
+    g_array_free(array, TRUE);
+}
+
+static GwyStringArray*
+create_string_array(const gchar **data, guint len, gboolean free_data)
+{
+   GArray *ret = g_array_new(FALSE, FALSE, sizeof(gchar*));
+   g_array_append_vals(ret, data, len);
+   if (free_data)
+      g_free((gpointer)data);
+   return ret;
+}
+
+static GwyConstStringArray*
+create_const_string_array(const gchar *const *data, guint len,
+                          gboolean free_data)
+{
+   GArray *ret = g_array_new(FALSE, FALSE, sizeof(gchar*));
+   g_array_append_vals(ret, data, len);
+   if (free_data)
+      g_free((gpointer)data);
+   return ret;
+}
+
 gdouble
 gwy_math_median_pygwy(GwyDoubleArray *array)
 {
@@ -71,8 +107,8 @@ gwy_math_curvature_pygwy(GwyDoubleArray *coeffs, gint *dimen,
 }
 
 GwyArrayFuncStatus
-gwy_math_refine_maximum_pygwy (GwyDoubleArray *z,
-                               gdouble *x, gdouble *y, gboolean *refined)
+gwy_math_refine_maximum_pygwy(GwyDoubleArray *z,
+                              gdouble *x, gdouble *y, gboolean *refined)
 {
     gboolean ok = (z->len == 9);
     if (ok)
@@ -82,6 +118,28 @@ gwy_math_refine_maximum_pygwy (GwyDoubleArray *z,
 }
 
 GwyArrayFuncStatus
+gwy_math_refine_maximum_2d_pygwy(GwyDoubleArray *z,
+                                 gdouble *x, gdouble *y, gboolean *refined)
+{
+    gboolean ok = (z->len == 9);
+    if (ok)
+        *refined = gwy_math_refine_maximum_2d((gdouble*)z->data, x, y);
+    g_array_free(z, TRUE);
+    return ok;
+}
+
+GwyArrayFuncStatus
+gwy_math_refine_maximum_1d_pygwy(GwyDoubleArray *y,
+                                 gdouble *x, gboolean *refined)
+{
+    gboolean ok = (y->len == 3);
+    if (ok)
+        *refined = gwy_math_refine_maximum_1d((gdouble*)y->data, x);
+    g_array_free(y, TRUE);
+    return ok;
+}
+
+GwyArrayFuncStatus
 gwy_math_is_in_polygon_pygwy(gdouble x, gdouble y, GwyDoubleArray *poly,
                              gboolean *is_inside)
 {
@@ -155,6 +213,131 @@ gwy_fft_window_pygwy(GwyDoubleArray *data, GwyWindowingType windowing)
     return data;
 }
 
+GwyDoubleArray*
+gwy_interpolation_resolve_coeffs_1d_pygwy(GwyDoubleArray *data,
+                                          GwyInterpolationType interpolation)
+{
+    gwy_interpolation_resolve_coeffs_1d(data->len, (gdouble*)data->data,
+                                        interpolation);
+    /* This is the same as freeing data and returning a new array. */
+    return data;
+}
+
+GwyDoubleArray*
+gwy_interpolation_resolve_coeffs_2d_pygwy(gint width,
+                                          gint height,
+                                          gint rowstride,
+                                          GwyDoubleArray *data,
+                                          GwyInterpolationType interpolation)
+{
+    g_return_val_if_fail(data->len == height*rowstride, data);
+    g_return_val_if_fail(width <= rowstride, data);
+    gwy_interpolation_resolve_coeffs_2d(width, height, rowstride,
+                                        (gdouble*)data->data,
+                                        interpolation);
+    /* This is the same as freeing data and returning a new array. */
+    return data;
+}
+
+GwyArrayFuncStatus
+gwy_interpolation_get_dval_of_equidists_pygwy(gdouble x,
+                                              GwyDoubleArray *data,
+                                              GwyInterpolationType interpolation,
+                                              gdouble *result)
+{
+    guint suplen = gwy_interpolation_get_support_size(interpolation);
+    gboolean ok = (data->len == suplen || suplen == 0);
+    if (ok) {
+        *result = gwy_interpolation_get_dval_of_equidists(x, (gdouble*)data->data,
+                                                          interpolation);
+    }
+    g_array_free(data, TRUE);
+    return ok;
+}
+
+GwyArrayFuncStatus
+gwy_interpolation_interpolate_1d_pygwy(gdouble x,
+                                       GwyDoubleArray *coeff,
+                                       GwyInterpolationType interpolation,
+                                       gdouble *result)
+{
+    guint suplen = gwy_interpolation_get_support_size(interpolation);
+    gboolean ok = (coeff->len == suplen || suplen == 0);
+    if (ok) {
+        *result = gwy_interpolation_interpolate_1d(x, (gdouble*)coeff->data,
+                                                   interpolation);
+    }
+    g_array_free(coeff, TRUE);
+    return ok;
+}
+
+GwyArrayFuncStatus
+gwy_interpolation_interpolate_2d_pygwy(gdouble x, gdouble y,
+                                       gint rowstride,
+                                       GwyDoubleArray *coeff,
+                                       GwyInterpolationType interpolation,
+                                       gdouble *result)
+{
+    guint suplen = gwy_interpolation_get_support_size(interpolation);
+    gboolean ok = (coeff->len == suplen*rowstride || suplen == 0);
+    if (ok) {
+        *result = gwy_interpolation_interpolate_2d(x, y, rowstride,
+                                                   (gdouble*)coeff->data,
+                                                   interpolation);
+    }
+    g_array_free(coeff, TRUE);
+    return ok;
+}
+
+GwyDoubleArray*
+gwy_interpolation_resample_block_1d_pygwy(GwyDoubleArray *data,
+                                          gint newlength,
+                                          GwyInterpolationType interpolation)
+{
+    GwyDoubleArray *ret = g_array_new(FALSE, FALSE, sizeof(gdouble));
+    g_array_set_size(ret, newlength);
+    gwy_interpolation_resample_block_1d(data->len, (gdouble*)data->data,
+                                        newlength, (gdouble*)ret->data,
+                                        interpolation, FALSE);
+    return ret;
+}
+
+GwyDoubleArray*
+gwy_interpolation_resample_block_2d_pygwy(GwyDoubleArray *data,
+                                          gint width,
+                                          gint height,
+                                          gint rowstride,
+                                          gint newwidth,
+                                          gint newheight,
+                                          gint newrowstride,
+                                          GwyInterpolationType interpolation)
+{
+    GwyDoubleArray *ret = g_array_new(FALSE, TRUE, sizeof(gdouble));
+    g_array_set_size(ret, newrowstride*newheight);
+    g_return_val_if_fail(data->len == height*rowstride, ret);
+    gwy_interpolation_resample_block_2d(width, height, rowstride,
+                                        (gdouble*)data->data,
+                                        newwidth, newheight, newrowstride,
+                                        (gdouble*)ret->data,
+                                        interpolation, FALSE);
+    return ret;
+}
+
+GwyDoubleArray*
+gwy_interpolation_shift_block_1d_pygwy(GwyDoubleArray *data,
+                                       gdouble offset,
+                                       GwyInterpolationType interpolation,
+                                       GwyExteriorType exterior,
+                                       gdouble fill_value)
+{
+    GwyDoubleArray *ret = g_array_new(FALSE, FALSE, sizeof(gdouble));
+    gwy_interpolation_shift_block_1d(data->len, (gdouble*)data->data,
+                                     offset, (gdouble*)ret->data,
+                                     interpolation, exterior, fill_value,
+                                     FALSE);
+    return ret;
+}
+
 /**
  * gwy_selection_get_data_pygwy:
  * @selection: A selection.
@@ -702,6 +885,36 @@ gwy_data_field_circular_area_unextract_pygwy(GwyDataField *data_field,
     return ok;
 }
 
+GwyDoubleArray*
+gwy_data_field_circular_area_extract_with_pos_pygwy(GwyDataField *data_field,
+                                                    gint col, gint row,
+                                                    gdouble radius,
+                                                    GwyIntArrayOutArg xpos,
+                                                    GwyIntArrayOutArg ypos)
+{
+    GwyDoubleArray *array = g_array_new(FALSE, FALSE, sizeof(gdouble));
+    guint size = gwy_data_field_get_circular_area_size(radius);
+    g_array_set_size(array, size);
+    g_array_set_size(xpos, size);
+    g_array_set_size(ypos, size);
+    gwy_data_field_circular_area_extract_with_pos(data_field, col, row, radius,
+                                                  (gdouble*)array->data,
+                                                  (gint*)xpos->data,
+                                                  (gint*)ypos->data);
+    return array;
+}
+
+gboolean
+gwy_data_field_local_maximum_pygwy(GwyDataField *dfield,
+                                   gdouble x, gdouble y,
+                                   gint ax, gint ay,
+                                   gdouble *x_out, gdouble *y_out)
+{
+    *x_out = x;
+    *y_out = y;
+    return gwy_data_field_local_maximum(dfield, x_out, y_out, ax, ay);
+}
+
 GwyArrayFuncStatus
 gwy_data_field_affine_pygwy(GwyDataField *data_field,
                             GwyDataField *dest,
@@ -719,6 +932,90 @@ gwy_data_field_affine_pygwy(GwyDataField *data_field,
     return ok;
 }
 
+GwyArrayFuncStatus
+gwy_data_field_affine_prepare_pygwy(GwyDataField *source,
+                                    GwyDataField *dest,
+                                    GwyDoubleArray *a1a2,
+                                    GwyDoubleArray *a1a2_corr,
+                                    GwyAffineScalingType scaling,
+                                    gboolean prevent_rotation,
+                                    gdouble oversampling,
+                                    GwyDoubleArrayOutArg a1a2_corr_out,
+                                    GwyDoubleArrayOutArg invtrans)
+{
+    gboolean ok = (a1a2->len == 4 && a1a2_corr->len == 4);
+    g_array_set_size(a1a2_corr_out, 4);
+    g_array_set_size(invtrans, 6);
+    gwy_clear((gdouble*)invtrans->data, 6);
+    if (ok) {
+        gwy_assign((gdouble*)a1a2_corr_out->data, (gdouble*)a1a2_corr->data, 4);
+        gwy_data_field_affine_prepare(source, dest,
+                                      (const gdouble*)a1a2->data,
+                                      (gdouble*)a1a2_corr_out->data,
+                                      (gdouble*)invtrans->data,
+                                      scaling, prevent_rotation, oversampling);
+    }
+    else {
+        gwy_clear((gdouble*)a1a2_corr_out->data, 4);
+    }
+    g_array_free(a1a2, TRUE);
+    g_array_free(a1a2_corr, TRUE);
+    return ok;
+}
+
+GwyArrayFuncStatus
+gwy_data_field_measure_lattice_acf_pygwy(GwyDataField *acf2d,
+                                         GwyDoubleArray *a1a2,
+                                         GwyDoubleArrayOutArg a1a2_out,
+                                         gboolean *succeeded)
+{
+    gboolean ok = (a1a2->len == 4);
+    g_array_set_size(a1a2_out, 4);
+    gwy_clear((gdouble*)a1a2_out->data, 4);
+    *succeeded = FALSE;
+    if (ok) {
+        gwy_assign((gdouble*)a1a2_out->data, (gdouble*)a1a2->data, 4);
+        *succeeded = gwy_data_field_measure_lattice_acf(acf2d,
+                                                        (gdouble*)a1a2_out->data);
+    }
+    if (!*succeeded || !ok)
+        gwy_clear((gdouble*)a1a2_out->data, 4);
+    g_array_free(a1a2, TRUE);
+    return ok;
+}
+
+GwyArrayFuncStatus
+gwy_data_field_measure_lattice_psdf_pygwy(GwyDataField *psdf2d,
+                                          GwyDoubleArray *a1a2,
+                                          GwyDoubleArrayOutArg a1a2_out,
+                                          gboolean *succeeded)
+{
+    gboolean ok = (a1a2->len == 4);
+    g_array_set_size(a1a2_out, 4);
+    gwy_clear((gdouble*)a1a2_out->data, 4);
+    *succeeded = FALSE;
+    if (ok) {
+        gwy_assign((gdouble*)a1a2_out->data, (gdouble*)a1a2->data, 4);
+        *succeeded = gwy_data_field_measure_lattice_psdf(psdf2d,
+                                                         (gdouble*)a1a2_out->data);
+    }
+    if (!*succeeded || !ok)
+        gwy_clear((gdouble*)a1a2_out->data, 4);
+    g_array_free(a1a2, TRUE);
+    return ok;
+}
+
+gint
+gwy_data_field_waterpour_pygwy(GwyDataField *data_field,
+                               GwyDataField *result,
+                               GwyIntArrayOutArg grains)
+{
+    guint n = data_field->xres*data_field->yres;
+    g_array_set_size(grains, n);
+    gwy_clear(((gint*)grains->data), n);
+    return gwy_data_field_waterpour(data_field, result, (gint*)grains->data);
+}
+
 void
 gwy_data_field_get_local_maxima_list_pygwy(GwyDataField *dfield,
                                            GwyDoubleArrayOutArg xdata,
@@ -836,6 +1133,37 @@ gwy_container_keys_pygwy(GwyContainer *container)
                             gwy_container_get_n_items(container), TRUE);
 }
 
+GwyConstStringArray*
+gwy_container_keys_by_name_pygwy(GwyContainer *container)
+{
+    const gchar **keys = gwy_container_keys_by_name(container);
+    return create_const_string_array((const gchar*const*)keys,
+                                     gwy_container_get_n_items(container),
+                                     TRUE);
+}
+
+GwyContainer*
+gwy_container_duplicate_by_prefix_pygwy(GwyContainer *container,
+                                        GwyStringArray *keys)
+{
+    GwyContainer *ret;
+    ret = gwy_container_duplicate_by_prefixv(container,
+                                             keys->len,
+                                             (const gchar**)keys->data);
+    free_string_array(keys);
+    return ret;
+}
+
+GwyStringArray*
+gwy_container_serialize_to_text_pygwy(GwyContainer *container)
+{
+    GPtrArray *strs = gwy_container_serialize_to_text(container);
+    GwyStringArray *array = create_string_array((const gchar**)strs->pdata,
+                                                strs->len, FALSE);
+    g_ptr_array_free(strs, TRUE);
+    return array;
+}
+
 static GwyIntArray*
 create_id_array(gint *ids)
 {
@@ -1327,15 +1655,54 @@ gwy_axis_get_major_ticks_pygwy(GwyAxis *axis)
 }
 
 gulong
+gwy_undo_qcheckpoint_pygwy(GwyContainer *container, GwyIntArray *keys)
+{
+    gulong id = 0;
+    g_assert(sizeof(GQuark) == sizeof(gint));
+    if (keys->len) {
+        id = gwy_undo_qcheckpointv(container, keys->len, (GQuark*)keys->data);
+    }
+    g_array_free(keys, TRUE);
+    return id;
+}
+
+gulong
+gwy_undo_checkpoint_pygwy(GwyContainer *container, GwyStringArray *keys)
+{
+    gulong id = 0;
+    if (keys->len) {
+        id = gwy_undo_checkpointv(container, keys->len,
+                                  (const gchar**)keys->data);
+    }
+    free_string_array(keys);
+    return id;
+}
+
+gulong
 gwy_app_undo_qcheckpoint_pygwy(GwyContainer *container, GwyIntArray *keys)
 {
-    gulong id;
+    gulong id = 0;
     g_assert(sizeof(GQuark) == sizeof(gint));
-    id = gwy_app_undo_qcheckpointv(container, keys->len, (GQuark*)keys->data);
+    if (keys->len) {
+        id = gwy_app_undo_qcheckpointv(container,
+                                       keys->len, (GQuark*)keys->data);
+    }
     g_array_free(keys, TRUE);
     return id;
 }
 
+gulong
+gwy_app_undo_checkpoint_pygwy(GwyContainer *container, GwyStringArray *keys)
+{
+    gulong id = 0;
+    if (keys->len) {
+        id = gwy_app_undo_checkpointv(container,
+                                      keys->len, (const gchar**)keys->data);
+    }
+    free_string_array(keys);
+    return id;
+}
+
 GObject*
 gwy_inventory_get_item_pygwy(GwyInventory *inventory,
                              const gchar *name)
@@ -1510,6 +1877,97 @@ gwy_peaks_get_quantity_pygwy(GwyPeaks *peaks,
     return array;
 }
 
+GwyIntArray*
+gwy_tip_model_preset_get_params_pygwy(const GwyTipModelPreset *preset)
+{
+    GwyIntArray *array = g_array_new(FALSE, FALSE, sizeof(guint));
+    guint i, n = gwy_tip_model_get_preset_nparams(preset);
+    const GwyTipParamType *paramtypes = gwy_tip_model_get_preset_params(preset);
+    g_array_set_size(array, n);
+    for (i = 0; i < n; i++)
+        g_array_index(array, guint, i) = paramtypes[i];
+    return array;
+}
+
+GwyArrayFuncStatus
+gwy_tip_model_preset_create_pygwy(const GwyTipModelPreset *preset,
+                                  GwyDataField *tip,
+                                  GwyDoubleArray *params)
+{
+    gboolean ok = (params->len == gwy_tip_model_get_preset_nparams(preset));
+    if (ok)
+        gwy_tip_model_preset_create(preset, tip, (const gdouble*)params->data);
+    return ok;
+}
+
+GwyArrayFuncStatus
+gwy_tip_model_preset_create_for_zrange_pygwy(const GwyTipModelPreset *preset,
+                                             GwyDataField *tip,
+                                             gdouble zrange,
+                                             gboolean square,
+                                             GwyDoubleArray *params)
+{
+    gboolean ok = (params->len == gwy_tip_model_get_preset_nparams(preset));
+    if (ok) {
+        gwy_tip_model_preset_create_for_zrange(preset, tip, zrange, square,
+                                               (const gdouble*)params->data);
+    }
+    return ok;
+}
+
+GwySpline*
+gwy_spline_new_from_points_pygwy(GwyDoubleArray *xy)
+{
+    return gwy_spline_new_from_points((GwyXY*)xy->data, xy->len/2);
+}
+
+GwyDoubleArray*
+gwy_spline_get_points_pygwy(GwySpline *spline)
+{
+    GwyDoubleArray *array = g_array_new(FALSE, FALSE, sizeof(gdouble));
+    guint n = gwy_spline_get_npoints(spline);
+    g_array_set_size(array, 2*n);
+    gwy_assign((gdouble*)array->data,
+               (const gdouble*)gwy_spline_get_points(spline),
+               2*n);
+    return array;
+}
+
+GwyDoubleArray*
+gwy_spline_get_tangents_pygwy(GwySpline *spline)
+{
+    GwyDoubleArray *array = g_array_new(FALSE, FALSE, sizeof(gdouble));
+    guint n = gwy_spline_get_npoints(spline);
+    g_array_set_size(array, 2*n);
+    gwy_assign((gdouble*)array->data,
+               (const gdouble*)gwy_spline_get_tangents(spline),
+               2*n);
+    return array;
+}
+
+GwyDoubleArray*
+gwy_spline_sample_naturally_pygwy(GwySpline *spline)
+{
+    guint n;
+    const GwyXY *xy = gwy_spline_sample_naturally(spline, &n);
+    GwyDoubleArray *array = g_array_new(FALSE, FALSE, sizeof(gdouble));
+    g_array_set_size(array, 2*n);
+    gwy_assign((gdouble*)array->data, (const gdouble*)xy, 2*n);
+    return array;
+}
+
+gdouble
+gwy_spline_sample_uniformly_pygwy(GwySpline *spline,
+                                  GwyDoubleArrayOutArg xy,
+                                  GwyDoubleArrayOutArg t,
+                                  guint n)
+{
+    g_array_set_size(xy, 2*n);
+    g_array_set_size(t, 2*n);
+    return gwy_spline_sample_uniformly(spline,
+                                       (GwyXY*)xy->data, (GwyXY*)t->data, n);
+}
+
 GwyDoubleArray*
 gwy_marker_box_get_markers_pygwy(GwyMarkerBox *mbox)
 {
@@ -1526,4 +1984,14 @@ gwy_marker_box_set_markers_pygwy(GwyMarkerBox *mbox,
     g_array_free(markers, TRUE);
 }
 
+void
+gwy_app_sync_data_items_pygwy(GwyContainer *source, GwyContainer *dest,
+                              gint from_id, gint to_id, gboolean delete_too,
+                              GwyIntArray *items)
+{
+    g_assert(sizeof(GwyDataItem) == sizeof(gint));
+    gwy_app_sync_data_itemsv(source, dest, from_id, to_id, delete_too,
+                             (GwyDataItem*)items->data, items->len);
+}
+
 /* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/pygwy/wrap_calls.h b/modules/pygwy/wrap_calls.h
index b8c5643..8174c7a 100644
--- a/modules/pygwy/wrap_calls.h
+++ b/modules/pygwy/wrap_calls.h
@@ -1,5 +1,5 @@
 /*
- *  $Id: wrap_calls.h 19268 2016-11-15 12:48:19Z yeti-dn $
+ *  $Id: wrap_calls.h 20158 2017-08-03 15:20:40Z yeti-dn $
  *  Copyright (C) 2008 Jan Horak, 2015-2016 David Necas (Yeti)
  *  E-mail: xhorak at gmail.com, yeti at gwyddion.net.
  *
@@ -38,304 +38,416 @@ typedef GArray *GwyDoubleArrayOutArg;
 typedef GArray GwyDoubleArray;
 typedef GArray *GwyIntArrayOutArg;
 typedef GArray GwyIntArray;
+typedef GArray GwyStringArray;        /* Must be freed. */
+typedef GArray GwyConstStringArray;   /* Must not be touched. */
 
-gdouble            gwy_math_median_pygwy                           (GwyDoubleArray *array);
-GwyArrayFuncStatus gwy_math_curvature_pygwy                        (GwyDoubleArray *coeffs,
-                                                                    gint *dimen,
-                                                                    gdouble *kappa1,
-                                                                    gdouble *kappa2,
-                                                                    gdouble *phi1,
-                                                                    gdouble *phi2,
-                                                                    gdouble *xc,
-                                                                    gdouble *yc,
-                                                                    gdouble *zc);
-GwyArrayFuncStatus gwy_math_refine_maximum_pygwy                   (GwyDoubleArray *z,
-                                                                    gdouble *x,
-                                                                    gdouble *y,
-                                                                    gboolean *refined);
-GwyArrayFuncStatus gwy_math_is_in_polygon_pygwy                    (gdouble x,
-                                                                    gdouble y,
-                                                                    GwyDoubleArray *poly,
-                                                                    gboolean *is_inside);
-GwyArrayFuncStatus gwy_math_find_nearest_line_pygwy                (gdouble x,
-                                                                    gdouble y,
-                                                                    GwyDoubleArray *coords,
-                                                                    GwyDoubleArray *metric,
-                                                                    gint *idx,
-                                                                    gdouble *d2min);
-GwyArrayFuncStatus gwy_math_find_nearest_point_pygwy               (gdouble x,
-                                                                    gdouble y,
-                                                                    GwyDoubleArray *coords,
-                                                                    GwyDoubleArray *metric,
-                                                                    gint *idx,
-                                                                    gdouble *d2min);
-GwyArrayFuncStatus gwy_math_fit_polynom_pygwy                      (GwyDoubleArray *xdata,
-                                                                    GwyDoubleArray *ydata,
-                                                                    gint n,
-                                                                    GwyDoubleArrayOutArg coeffs);
-GwyDoubleArray*    gwy_fft_window_pygwy                            (GwyDoubleArray *data,
-                                                                    GwyWindowingType windowing);
-GwyDoubleArray*    gwy_selection_get_data_pygwy                    (GwySelection *selection);
-GwyDoubleArray*    gwy_selection_get_object_pygwy                  (GwySelection *selection,
-                                                                    gint i);
-GwyArrayFuncStatus gwy_selection_set_data_pygwy                    (GwySelection *selection,
-                                                                    GwyDoubleArray *data);
-GwyArrayFuncStatus gwy_selection_set_object_pygwy                  (GwySelection *selection,
-                                                                    gint i,
-                                                                    GwyDoubleArray *data);
-GwyDoubleArray*    gwy_data_line_get_data_pygwy                    (GwyDataLine *data_line);
-GwyDoubleArray*    gwy_data_field_get_data_pygwy                   (GwyDataField *data_field);
-GwyDoubleArray*    gwy_brick_get_data_pygwy                        (GwyBrick *brick);
-GwyArrayFuncStatus gwy_data_line_set_data_pygwy                    (GwyDataLine *data_line,
-                                                                    GwyDoubleArray *data);
-GwyArrayFuncStatus gwy_data_field_set_data_pygwy                   (GwyDataField *data_field,
-                                                                    GwyDoubleArray *data);
-GwyArrayFuncStatus gwy_brick_set_data_pygwy                        (GwyBrick *brick,
-                                                                    GwyDoubleArray *data);
-GwyDoubleArray*    gwy_data_field_fit_polynom_pygwy                (GwyDataField *data_field,
-                                                                    gint col_degree,
-                                                                    gint row_degree);
-GwyDoubleArray*    gwy_data_field_area_fit_polynom_pygwy           (GwyDataField *data_field,
-                                                                    gint col,
-                                                                    gint row,
-                                                                    gint width,
-                                                                    gint height,
-                                                                    gint col_degree,
-                                                                    gint row_degree);
-GwyArrayFuncStatus gwy_data_field_subtract_polynom_pygwy           (GwyDataField *data_field,
-                                                                    gint col_degree,
-                                                                    gint row_degree,
-                                                                    GwyDoubleArray *coeffs);
-GwyArrayFuncStatus gwy_data_field_area_subtract_polynom_pygwy      (GwyDataField *data_field,
-                                                                    gint col,
-                                                                    gint row,
-                                                                    gint width,
-                                                                    gint height,
-                                                                    gint col_degree,
-                                                                    gint row_degree,
-                                                                    GwyDoubleArray *coeffs);
-GwyDoubleArray*    gwy_data_field_fit_legendre_pygwy               (GwyDataField *data_field,
-                                                                    gint col_degree,
-                                                                    gint row_degree);
-GwyDoubleArray*    gwy_data_field_area_fit_legendre_pygwy          (GwyDataField *data_field,
-                                                                    gint col,
-                                                                    gint row,
-                                                                    gint width,
-                                                                    gint height,
-                                                                    gint col_degree,
-                                                                    gint row_degree);
-GwyArrayFuncStatus gwy_data_field_subtract_legendre_pygwy          (GwyDataField *data_field,
-                                                                    gint col_degree,
-                                                                    gint row_degree,
-                                                                    GwyDoubleArray *coeffs);
-GwyArrayFuncStatus gwy_data_field_area_subtract_legendre_pygwy     (GwyDataField *data_field,
-                                                                    gint col,
-                                                                    gint row,
-                                                                    gint width,
-                                                                    gint height,
-                                                                    gint col_degree,
-                                                                    gint row_degree,
-                                                                    GwyDoubleArray *coeffs);
-GwyDoubleArray*    gwy_data_field_fit_poly_max_pygwy               (GwyDataField *data_field,
-                                                                    gint max_degree);
-GwyDoubleArray*    gwy_data_field_area_fit_poly_max_pygwy          (GwyDataField *data_field,
-                                                                    gint col,
-                                                                    gint row,
-                                                                    gint width,
-                                                                    gint height,
-                                                                    gint max_degree);
-GwyArrayFuncStatus gwy_data_field_subtract_poly_max_pygwy          (GwyDataField *data_field,
-                                                                    gint max_degree,
-                                                                    GwyDoubleArray *coeffs);
-GwyArrayFuncStatus gwy_data_field_area_subtract_poly_max_pygwy     (GwyDataField *data_field,
-                                                                    gint col,
-                                                                    gint row,
-                                                                    gint width,
-                                                                    gint height,
-                                                                    gint max_degree,
-                                                                    GwyDoubleArray *coeffs);
-GwyArrayFuncStatus gwy_data_field_fit_poly_pygwy                   (GwyDataField *data_field,
-                                                                    GwyDataField *mask_field,
-                                                                    GwyIntArray *term_powers,
-                                                                    gboolean exclude,
-                                                                    GwyDoubleArrayOutArg coeffs);
-GwyArrayFuncStatus gwy_data_field_area_fit_poly_pygwy              (GwyDataField *data_field,
-                                                                    GwyDataField *mask_field,
-                                                                    gint col,
-                                                                    gint row,
-                                                                    gint width,
-                                                                    gint height,
-                                                                    GwyIntArray *term_powers,
-                                                                    gboolean exclude,
-                                                                    GwyDoubleArrayOutArg coeffs);
-GwyArrayFuncStatus gwy_data_field_subtract_poly_pygwy              (GwyDataField *data_field,
-                                                                    GwyIntArray *term_powers,
-                                                                    GwyDoubleArray *coeffs);
-GwyArrayFuncStatus gwy_data_field_area_subtract_poly_pygwy         (GwyDataField *data_field,
-                                                                    gint col,
-                                                                    gint row,
-                                                                    gint width,
-                                                                    gint height,
-                                                                    GwyIntArray *term_powers,
-                                                                    GwyDoubleArray *coeffs);
-GwyDoubleArray*    gwy_data_field_elliptic_area_extract_pygwy      (GwyDataField *data_field,
-                                                                    gint col,
-                                                                    gint row,
-                                                                    gint width,
-                                                                    gint height);
-GwyArrayFuncStatus gwy_data_field_elliptic_area_unextract_pygwy    (GwyDataField *data_field,
-                                                                    gint col,
-                                                                    gint row,
-                                                                    gint width,
-                                                                    gint height,
-                                                                    GwyDoubleArray *data);
-GwyDoubleArray*    gwy_data_field_circular_area_extract_pygwy      (GwyDataField *data_field,
-                                                                    gint col,
-                                                                    gint row,
-                                                                    gdouble radius);
-GwyArrayFuncStatus gwy_data_field_circular_area_unextract_pygwy    (GwyDataField *data_field,
-                                                                    gint col,
-                                                                    gint row,
-                                                                    gdouble radius,
-                                                                    GwyDoubleArray *data);
-GwyArrayFuncStatus gwy_data_field_affine_pygwy                     (GwyDataField *data_field,
-                                                                    GwyDataField *dest,
-                                                                    GwyDoubleArray *affine,
-                                                                    GwyInterpolationType interp,
-                                                                    GwyExteriorType exterior,
-                                                                    gdouble fill_value);
-void               gwy_data_field_get_local_maxima_list_pygwy      (GwyDataField *dfield,
-                                                                    GwyDoubleArrayOutArg xdata,
-                                                                    GwyDoubleArrayOutArg ydata,
-                                                                    GwyDoubleArrayOutArg zdata,
-                                                                    gint ndata,
-                                                                    gint skip,
-                                                                    gdouble threshold,
-                                                                    gboolean subpixel);
-GwyPlaneSymmetry   gwy_data_field_unrotate_find_corrections_pygwy  (GwyDataLine *derdist,
-                                                                    GwyDoubleArrayOutArg correction);
-GwyDoubleArray*    gwy_data_line_part_fit_polynom_pygwy            (GwyDataLine *data_line,
-                                                                    gint n,
-                                                                    gint from,
-                                                                    gint to);
-GwyDoubleArray*    gwy_data_line_fit_polynom_pygwy                 (GwyDataLine *data_line,
-                                                                    gint n);
-void               gwy_data_line_part_subtract_polynom_pygwy       (GwyDataLine *data_line,
-                                                                    GwyDoubleArray *coeffs,
-                                                                    gint from,
-                                                                    gint to);
-void               gwy_data_line_subtract_polynom_pygwy            (GwyDataLine *data_line,
-                                                                    GwyDoubleArray *coeffs);
-GQuark             gwy_key_from_name_pygwy                         (const gchar *name);
-const gchar*       gwy_name_from_key_pygwy                         (GQuark key);
-GwyIntArray*       gwy_container_keys_pygwy                        (GwyContainer *container);
-GwyIntArray*       gwy_app_data_browser_get_data_ids_pygwy         (GwyContainer *container);
-GwyIntArray*       gwy_app_data_browser_get_graph_ids_pygwy        (GwyContainer *container);
-GwyIntArray*       gwy_app_data_browser_get_spectra_ids_pygwy      (GwyContainer *container);
-GwyIntArray*       gwy_app_data_browser_get_volume_ids_pygwy       (GwyContainer *container);
-GwyIntArray*       gwy_app_data_browser_get_xyz_ids_pygwy          (GwyContainer *container);
-GwyIntArray*       gwy_app_data_browser_find_data_by_title_pygwy   (GwyContainer *data,
-                                                                    const gchar *titleglob);
-GwyIntArray*       gwy_app_data_browser_find_graphs_by_title_pygwy (GwyContainer *data,
-                                                                    const gchar *titleglob);
-GwyIntArray*       gwy_app_data_browser_find_spectra_by_title_pygwy(GwyContainer *data,
-                                                                    const gchar *titleglob);
-GwyIntArray*       gwy_app_data_browser_find_volume_by_title_pygwy (GwyContainer *data,
-                                                                    const gchar *titleglob);
-GwyIntArray*       gwy_app_data_browser_find_xyz_by_title_pygwy    (GwyContainer *data,
-                                                                    const gchar *titleglob);
-GwyIntArray*       gwy_data_field_number_grains_pygwy              (GwyDataField *mask_field);
-GwyIntArray*       gwy_data_field_number_grains_periodic_pygwy     (GwyDataField *mask_field);
-GwyArrayFuncStatus gwy_data_field_get_grain_sizes_pygwy            (GwyDataField *data_field,
-                                                                    GwyIntArray *grains,
-                                                                    GwyIntArrayOutArg sizes);
-GwyArrayFuncStatus gwy_data_field_get_grain_bounding_boxes_pygwy   (GwyDataField *data_field,
-                                                                    GwyIntArray *grains,
-                                                                    GwyIntArrayOutArg bboxes);
-GwyArrayFuncStatus gwy_data_field_grains_get_values_pygwy          (GwyDataField *data_field,
-                                                                    GwyIntArray *grains,
-                                                                    GwyGrainQuantity quantity,
-                                                                    GwyDoubleArrayOutArg values);
-GwyDataLine*       gwy_data_field_grains_get_distribution_pygwy    (GwyDataField *data_field,
-                                                                    GwyDataField *grain_field,
-                                                                    GwyIntArray *grains,
-                                                                    GwyGrainQuantity quantity,
-                                                                    gint nstats);
-GwyDataField*      gwy_tip_dilation_pygwy                          (GwyDataField *tip,
-                                                                    GwyDataField *surface);
-GwyDataField*      gwy_tip_erosion_pygwy                           (GwyDataField *tip,
-                                                                    GwyDataField *surface);
-GwyDataField*      gwy_tip_cmap_pygwy                              (GwyDataField *tip,
-                                                                    GwyDataField *surface);
-GwyDataField*      gwy_data_field_create_full_mask_pygwy           (GwyDataField *d);
-gboolean           gwy_get_grain_quantity_needs_same_units_pygwy   (GwyGrainQuantity quantity);
-GwySIUnit*         gwy_construct_grain_quantity_units_pygwy        (GwyGrainQuantity quantity,
-                                                                    GwySIUnit *siunitxy,
-                                                                    GwySIUnit *siunitz);
-void               gwy_surface_set_pygwy                           (GwySurface *surface,
-                                                                    guint pos,
-                                                                    const GwyXYZ *point);
-GwyIntArray*       gwy_spectra_find_nearest_pygwy                  (GwySpectra *spectra,
-                                                                    gdouble x,
-                                                                    gdouble y,
-                                                                    guint n);
-GwyDoubleArray*    gwy_graph_curve_model_get_xdata_pygwy           (GwyGraphCurveModel *gcmodel);
-GwyDoubleArray*    gwy_graph_curve_model_get_ydata_pygwy           (GwyGraphCurveModel *gcmodel);
-GwyArrayFuncStatus gwy_graph_curve_model_set_data_pygwy            (GwyGraphCurveModel *gcmodel,
-                                                                    GwyDoubleArray *xdata,
-                                                                    GwyDoubleArray *ydata);
-GwyArrayFuncStatus gwy_graph_curve_model_set_data_interleaved_pygwy(GwyGraphCurveModel *gcmodel,
-                                                                    GwyDoubleArray *xydata);
-void               gwy_graph_area_set_x_grid_data_pygwy            (GwyGraphArea *area,
-                                                                    GwyDoubleArray *grid_data);
-void               gwy_graph_area_set_y_grid_data_pygwy            (GwyGraphArea *area,
-                                                                    GwyDoubleArray *grid_data);
-GwyDoubleArray*    gwy_graph_area_get_x_grid_data_pygwy            (GwyGraphArea *area);
-GwyDoubleArray*    gwy_graph_area_get_y_grid_data_pygwy            (GwyGraphArea *area);
-GwyDoubleArray*    gwy_draw_data_field_map_adaptive_pygwy          (GwyDataField *data_field,
-                                                                    GwyDoubleArray *z);
-GwyDoubleArray*    gwy_data_view_get_metric_pygwy                  (GwyDataView *data_view);
-GwyDoubleArray*    gwy_axis_get_major_ticks_pygwy                  (GwyAxis *axis);
-gulong             gwy_app_undo_qcheckpoint_pygwy                  (GwyContainer *container,
-                                                                    GwyIntArray *keys);
-GObject*           gwy_inventory_get_item_pygwy                    (GwyInventory *inventory,
-                                                                    const gchar *name);
-GObject*           gwy_inventory_get_item_or_default_pygwy         (GwyInventory *inventory,
-                                                                    const gchar *name);
-GObject*           gwy_inventory_get_nth_item_pygwy                (GwyInventory *inventory,
-                                                                    guint n);
-GObject*           gwy_inventory_get_default_item_pygwy            (GwyInventory *inventory);
-void               gwy_inventory_insert_item_pygwy                 (GwyInventory *inventory,
-                                                                    GObject *object);
-void               gwy_inventory_insert_nth_item_pygwy             (GwyInventory *inventory,
-                                                                    GObject *object,
-                                                                    guint n);
-void               gwy_inventory_rename_item_pygwy                 (GwyInventory *inventory,
-                                                                    const gchar *name,
-                                                                    const gchar *newname);
-GObject*           gwy_inventory_new_item_pygwy                    (GwyInventory *inventory,
-                                                                    const gchar *name,
-                                                                    const gchar *newname);
-GwyArrayFuncStatus gwy_cdline_fit_pygwy                            (GwyCDLine *cdline,
-                                                                    GwyDoubleArray *x,
-                                                                    GwyDoubleArray *y,
-                                                                    GwyDoubleArrayOutArg params,
-                                                                    GwyDoubleArrayOutArg err);
-GwyArrayFuncStatus gwy_cdline_get_value_pygwy                      (GwyCDLine *cdline,
-                                                                    gdouble x,
-                                                                    GwyDoubleArray *params,
-                                                                    gdouble *value,
-                                                                    gboolean *fres);
-GwyArrayFuncStatus gwy_peaks_analyze_pygwy                         (GwyPeaks *peaks,
-                                                                    GwyDoubleArray *xdata,
-                                                                    GwyDoubleArray *ydata,
-                                                                    guint maxpeaks,
-                                                                    guint *npeaks);
-GwyDoubleArray*    gwy_peaks_get_quantity_pygwy                    (GwyPeaks *peaks,
-                                                                    GwyPeakQuantity quantity);
-GwyDoubleArray*    gwy_marker_box_get_markers_pygwy                (GwyMarkerBox *mbox);
-void               gwy_marker_box_set_markers_pygwy                (GwyMarkerBox *mbox,
-                                                                    GwyDoubleArray *markers);
+gdouble              gwy_math_median_pygwy                              (GwyDoubleArray *array);
+GwyArrayFuncStatus   gwy_math_curvature_pygwy                           (GwyDoubleArray *coeffs,
+                                                                         gint *dimen,
+                                                                         gdouble *kappa1,
+                                                                         gdouble *kappa2,
+                                                                         gdouble *phi1,
+                                                                         gdouble *phi2,
+                                                                         gdouble *xc,
+                                                                         gdouble *yc,
+                                                                         gdouble *zc);
+GwyArrayFuncStatus   gwy_math_refine_maximum_pygwy                      (GwyDoubleArray *z,
+                                                                         gdouble *x,
+                                                                         gdouble *y,
+                                                                         gboolean *refined);
+GwyArrayFuncStatus   gwy_math_refine_maximum_2d_pygwy                   (GwyDoubleArray *z,
+                                                                         gdouble *x,
+                                                                         gdouble *y,
+                                                                         gboolean *refined);
+GwyArrayFuncStatus   gwy_math_refine_maximum_1d_pygwy                   (GwyDoubleArray *y,
+                                                                         gdouble *x,
+                                                                         gboolean *refined);
+GwyArrayFuncStatus   gwy_math_is_in_polygon_pygwy                       (gdouble x,
+                                                                         gdouble y,
+                                                                         GwyDoubleArray *poly,
+                                                                         gboolean *is_inside);
+GwyArrayFuncStatus   gwy_math_find_nearest_line_pygwy                   (gdouble x,
+                                                                         gdouble y,
+                                                                         GwyDoubleArray *coords,
+                                                                         GwyDoubleArray *metric,
+                                                                         gint *idx,
+                                                                         gdouble *d2min);
+GwyArrayFuncStatus   gwy_math_find_nearest_point_pygwy                  (gdouble x,
+                                                                         gdouble y,
+                                                                         GwyDoubleArray *coords,
+                                                                         GwyDoubleArray *metric,
+                                                                         gint *idx,
+                                                                         gdouble *d2min);
+GwyArrayFuncStatus   gwy_math_fit_polynom_pygwy                         (GwyDoubleArray *xdata,
+                                                                         GwyDoubleArray *ydata,
+                                                                         gint n,
+                                                                         GwyDoubleArrayOutArg coeffs);
+GwyDoubleArray*      gwy_fft_window_pygwy                               (GwyDoubleArray *data,
+                                                                         GwyWindowingType windowing);
+GwyDoubleArray*      gwy_interpolation_resolve_coeffs_1d_pygwy          (GwyDoubleArray *data,
+                                                                         GwyInterpolationType interpolation);
+GwyDoubleArray*      gwy_interpolation_resolve_coeffs_2d_pygwy          (gint width,
+                                                                         gint height,
+                                                                         gint rowstride,
+                                                                         GwyDoubleArray *data,
+                                                                         GwyInterpolationType interpolation);
+GwyArrayFuncStatus   gwy_interpolation_get_dval_of_equidists_pygwy      (gdouble x,
+                                                                         GwyDoubleArray *data,
+                                                                         GwyInterpolationType interpolation,
+                                                                         gdouble *result);
+GwyArrayFuncStatus   gwy_interpolation_interpolate_1d_pygwy             (gdouble x,
+                                                                         GwyDoubleArray *coeff,
+                                                                         GwyInterpolationType interpolation,
+                                                                         gdouble *result);
+GwyArrayFuncStatus   gwy_interpolation_interpolate_2d_pygwy             (gdouble x,
+                                                                         gdouble y,
+                                                                         gint rowstride,
+                                                                         GwyDoubleArray *coeff,
+                                                                         GwyInterpolationType interpolation,
+                                                                         gdouble *result);
+GwyDoubleArray*      gwy_interpolation_resample_block_1d_pygwy          (GwyDoubleArray *data,
+                                                                         gint newlength,
+                                                                         GwyInterpolationType interpolation);
+GwyDoubleArray*      gwy_interpolation_resample_block_2d_pygwy          (GwyDoubleArray *data,
+                                                                         gint width,
+                                                                         gint height,
+                                                                         gint rowstride,
+                                                                         gint newwidth,
+                                                                         gint newheight,
+                                                                         gint newrowstride,
+                                                                         GwyInterpolationType interpolation);
+GwyDoubleArray*      gwy_interpolation_shift_block_1d_pygwy             (GwyDoubleArray *data,
+                                                                         gdouble offset,
+                                                                         GwyInterpolationType interpolation,
+                                                                         GwyExteriorType exterior,
+                                                                         gdouble fill_value);
+GwyDoubleArray*      gwy_selection_get_data_pygwy                       (GwySelection *selection);
+GwyDoubleArray*      gwy_selection_get_object_pygwy                     (GwySelection *selection,
+                                                                         gint i);
+GwyArrayFuncStatus   gwy_selection_set_data_pygwy                       (GwySelection *selection,
+                                                                         GwyDoubleArray *data);
+GwyArrayFuncStatus   gwy_selection_set_object_pygwy                     (GwySelection *selection,
+                                                                         gint i,
+                                                                         GwyDoubleArray *data);
+GwyDoubleArray*      gwy_data_line_get_data_pygwy                       (GwyDataLine *data_line);
+GwyDoubleArray*      gwy_data_field_get_data_pygwy                      (GwyDataField *data_field);
+GwyDoubleArray*      gwy_brick_get_data_pygwy                           (GwyBrick *brick);
+GwyArrayFuncStatus   gwy_data_line_set_data_pygwy                       (GwyDataLine *data_line,
+                                                                         GwyDoubleArray *data);
+GwyArrayFuncStatus   gwy_data_field_set_data_pygwy                      (GwyDataField *data_field,
+                                                                         GwyDoubleArray *data);
+GwyArrayFuncStatus   gwy_brick_set_data_pygwy                           (GwyBrick *brick,
+                                                                         GwyDoubleArray *data);
+GwyDoubleArray*      gwy_data_field_fit_polynom_pygwy                   (GwyDataField *data_field,
+                                                                         gint col_degree,
+                                                                         gint row_degree);
+GwyDoubleArray*      gwy_data_field_area_fit_polynom_pygwy              (GwyDataField *data_field,
+                                                                         gint col,
+                                                                         gint row,
+                                                                         gint width,
+                                                                         gint height,
+                                                                         gint col_degree,
+                                                                         gint row_degree);
+GwyArrayFuncStatus   gwy_data_field_subtract_polynom_pygwy              (GwyDataField *data_field,
+                                                                         gint col_degree,
+                                                                         gint row_degree,
+                                                                         GwyDoubleArray *coeffs);
+GwyArrayFuncStatus   gwy_data_field_area_subtract_polynom_pygwy         (GwyDataField *data_field,
+                                                                         gint col,
+                                                                         gint row,
+                                                                         gint width,
+                                                                         gint height,
+                                                                         gint col_degree,
+                                                                         gint row_degree,
+                                                                         GwyDoubleArray *coeffs);
+GwyDoubleArray*      gwy_data_field_fit_legendre_pygwy                  (GwyDataField *data_field,
+                                                                         gint col_degree,
+                                                                         gint row_degree);
+GwyDoubleArray*      gwy_data_field_area_fit_legendre_pygwy             (GwyDataField *data_field,
+                                                                         gint col,
+                                                                         gint row,
+                                                                         gint width,
+                                                                         gint height,
+                                                                         gint col_degree,
+                                                                         gint row_degree);
+GwyArrayFuncStatus   gwy_data_field_subtract_legendre_pygwy             (GwyDataField *data_field,
+                                                                         gint col_degree,
+                                                                         gint row_degree,
+                                                                         GwyDoubleArray *coeffs);
+GwyArrayFuncStatus   gwy_data_field_area_subtract_legendre_pygwy        (GwyDataField *data_field,
+                                                                         gint col,
+                                                                         gint row,
+                                                                         gint width,
+                                                                         gint height,
+                                                                         gint col_degree,
+                                                                         gint row_degree,
+                                                                         GwyDoubleArray *coeffs);
+GwyDoubleArray*      gwy_data_field_fit_poly_max_pygwy                  (GwyDataField *data_field,
+                                                                         gint max_degree);
+GwyDoubleArray*      gwy_data_field_area_fit_poly_max_pygwy             (GwyDataField *data_field,
+                                                                         gint col,
+                                                                         gint row,
+                                                                         gint width,
+                                                                         gint height,
+                                                                         gint max_degree);
+GwyArrayFuncStatus   gwy_data_field_subtract_poly_max_pygwy             (GwyDataField *data_field,
+                                                                         gint max_degree,
+                                                                         GwyDoubleArray *coeffs);
+GwyArrayFuncStatus   gwy_data_field_area_subtract_poly_max_pygwy        (GwyDataField *data_field,
+                                                                         gint col,
+                                                                         gint row,
+                                                                         gint width,
+                                                                         gint height,
+                                                                         gint max_degree,
+                                                                         GwyDoubleArray *coeffs);
+GwyArrayFuncStatus   gwy_data_field_fit_poly_pygwy                      (GwyDataField *data_field,
+                                                                         GwyDataField *mask_field,
+                                                                         GwyIntArray *term_powers,
+                                                                         gboolean exclude,
+                                                                         GwyDoubleArrayOutArg coeffs);
+GwyArrayFuncStatus   gwy_data_field_area_fit_poly_pygwy                 (GwyDataField *data_field,
+                                                                         GwyDataField *mask_field,
+                                                                         gint col,
+                                                                         gint row,
+                                                                         gint width,
+                                                                         gint height,
+                                                                         GwyIntArray *term_powers,
+                                                                         gboolean exclude,
+                                                                         GwyDoubleArrayOutArg coeffs);
+GwyArrayFuncStatus   gwy_data_field_subtract_poly_pygwy                 (GwyDataField *data_field,
+                                                                         GwyIntArray *term_powers,
+                                                                         GwyDoubleArray *coeffs);
+GwyArrayFuncStatus   gwy_data_field_area_subtract_poly_pygwy            (GwyDataField *data_field,
+                                                                         gint col,
+                                                                         gint row,
+                                                                         gint width,
+                                                                         gint height,
+                                                                         GwyIntArray *term_powers,
+                                                                         GwyDoubleArray *coeffs);
+GwyDoubleArray*      gwy_data_field_elliptic_area_extract_pygwy         (GwyDataField *data_field,
+                                                                         gint col,
+                                                                         gint row,
+                                                                         gint width,
+                                                                         gint height);
+GwyArrayFuncStatus   gwy_data_field_elliptic_area_unextract_pygwy       (GwyDataField *data_field,
+                                                                         gint col,
+                                                                         gint row,
+                                                                         gint width,
+                                                                         gint height,
+                                                                         GwyDoubleArray *data);
+GwyDoubleArray*      gwy_data_field_circular_area_extract_pygwy         (GwyDataField *data_field,
+                                                                         gint col,
+                                                                         gint row,
+                                                                         gdouble radius);
+GwyArrayFuncStatus   gwy_data_field_circular_area_unextract_pygwy       (GwyDataField *data_field,
+                                                                         gint col,
+                                                                         gint row,
+                                                                         gdouble radius,
+                                                                         GwyDoubleArray *data);
+GwyDoubleArray*      gwy_data_field_circular_area_extract_with_pos_pygwy(GwyDataField *data_field,
+                                                                         gint col,
+                                                                         gint row,
+                                                                         gdouble radius,
+                                                                         GwyIntArrayOutArg xpos,
+                                                                         GwyIntArrayOutArg ypos);
+gboolean             gwy_data_field_local_maximum_pygwy                 (GwyDataField *dfield,
+                                                                         gdouble x,
+                                                                         gdouble y,
+                                                                         gint ax,
+                                                                         gint ay,
+                                                                         gdouble *x_out,
+                                                                         gdouble *y_out);
+GwyArrayFuncStatus   gwy_data_field_affine_pygwy                        (GwyDataField *data_field,
+                                                                         GwyDataField *dest,
+                                                                         GwyDoubleArray *affine,
+                                                                         GwyInterpolationType interp,
+                                                                         GwyExteriorType exterior,
+                                                                         gdouble fill_value);
+GwyArrayFuncStatus   gwy_data_field_affine_prepare_pygwy                (GwyDataField *source,
+                                                                         GwyDataField *dest,
+                                                                         GwyDoubleArray *a1a2,
+                                                                         GwyDoubleArray *a1a2_corr,
+                                                                         GwyAffineScalingType scaling,
+                                                                         gboolean prevent_rotation,
+                                                                         gdouble oversampling,
+                                                                         GwyDoubleArrayOutArg a1a2_corr_out,
+                                                                         GwyDoubleArrayOutArg invtrans);
+gint                 gwy_data_field_waterpour_pygwy                     (GwyDataField *data_field,
+                                                                         GwyDataField *result,
+                                                                         GwyIntArrayOutArg grains);
+GwyArrayFuncStatus   gwy_data_field_measure_lattice_acf_pygwy           (GwyDataField *acf2d,
+                                                                         GwyDoubleArray *a1a2,
+                                                                         GwyDoubleArrayOutArg a1a2_out,
+                                                                         gboolean *succeeded);
+GwyArrayFuncStatus   gwy_data_field_measure_lattice_psdf_pygwy          (GwyDataField *psdf2d,
+                                                                         GwyDoubleArray *a1a2,
+                                                                         GwyDoubleArrayOutArg a1a2_out,
+                                                                         gboolean *succeeded);
+void                 gwy_data_field_get_local_maxima_list_pygwy         (GwyDataField *dfield,
+                                                                         GwyDoubleArrayOutArg xdata,
+                                                                         GwyDoubleArrayOutArg ydata,
+                                                                         GwyDoubleArrayOutArg zdata,
+                                                                         gint ndata,
+                                                                         gint skip,
+                                                                         gdouble threshold,
+                                                                         gboolean subpixel);
+GwyPlaneSymmetry     gwy_data_field_unrotate_find_corrections_pygwy     (GwyDataLine *derdist,
+                                                                         GwyDoubleArrayOutArg correction);
+GwyDoubleArray*      gwy_data_line_part_fit_polynom_pygwy               (GwyDataLine *data_line,
+                                                                         gint n,
+                                                                         gint from,
+                                                                         gint to);
+GwyDoubleArray*      gwy_data_line_fit_polynom_pygwy                    (GwyDataLine *data_line,
+                                                                         gint n);
+void                 gwy_data_line_part_subtract_polynom_pygwy          (GwyDataLine *data_line,
+                                                                         GwyDoubleArray *coeffs,
+                                                                         gint from,
+                                                                         gint to);
+void                 gwy_data_line_subtract_polynom_pygwy               (GwyDataLine *data_line,
+                                                                         GwyDoubleArray *coeffs);
+GQuark               gwy_key_from_name_pygwy                            (const gchar *name);
+const gchar*         gwy_name_from_key_pygwy                            (GQuark key);
+GwyIntArray*         gwy_container_keys_pygwy                           (GwyContainer *container);
+GwyConstStringArray* gwy_container_keys_by_name_pygwy                   (GwyContainer *container);
+GwyContainer*        gwy_container_duplicate_by_prefix_pygwy            (GwyContainer *container,
+                                                                         GwyStringArray *keys);
+GwyStringArray*      gwy_container_serialize_to_text_pygwy              (GwyContainer *container);
+GwyIntArray*         gwy_app_data_browser_get_data_ids_pygwy            (GwyContainer *container);
+GwyIntArray*         gwy_app_data_browser_get_graph_ids_pygwy           (GwyContainer *container);
+GwyIntArray*         gwy_app_data_browser_get_spectra_ids_pygwy         (GwyContainer *container);
+GwyIntArray*         gwy_app_data_browser_get_volume_ids_pygwy          (GwyContainer *container);
+GwyIntArray*         gwy_app_data_browser_get_xyz_ids_pygwy             (GwyContainer *container);
+GwyIntArray*         gwy_app_data_browser_find_data_by_title_pygwy      (GwyContainer *data,
+                                                                         const gchar *titleglob);
+GwyIntArray*         gwy_app_data_browser_find_graphs_by_title_pygwy    (GwyContainer *data,
+                                                                         const gchar *titleglob);
+GwyIntArray*         gwy_app_data_browser_find_spectra_by_title_pygwy   (GwyContainer *data,
+                                                                         const gchar *titleglob);
+GwyIntArray*         gwy_app_data_browser_find_volume_by_title_pygwy    (GwyContainer *data,
+                                                                         const gchar *titleglob);
+GwyIntArray*         gwy_app_data_browser_find_xyz_by_title_pygwy       (GwyContainer *data,
+                                                                         const gchar *titleglob);
+GwyIntArray*         gwy_data_field_number_grains_pygwy                 (GwyDataField *mask_field);
+GwyIntArray*         gwy_data_field_number_grains_periodic_pygwy        (GwyDataField *mask_field);
+GwyArrayFuncStatus   gwy_data_field_get_grain_sizes_pygwy               (GwyDataField *data_field,
+                                                                         GwyIntArray *grains,
+                                                                         GwyIntArrayOutArg sizes);
+GwyArrayFuncStatus   gwy_data_field_get_grain_bounding_boxes_pygwy      (GwyDataField *data_field,
+                                                                         GwyIntArray *grains,
+                                                                         GwyIntArrayOutArg bboxes);
+GwyArrayFuncStatus   gwy_data_field_grains_get_values_pygwy             (GwyDataField *data_field,
+                                                                         GwyIntArray *grains,
+                                                                         GwyGrainQuantity quantity,
+                                                                         GwyDoubleArrayOutArg values);
+GwyDataLine*         gwy_data_field_grains_get_distribution_pygwy       (GwyDataField *data_field,
+                                                                         GwyDataField *grain_field,
+                                                                         GwyIntArray *grains,
+                                                                         GwyGrainQuantity quantity,
+                                                                         gint nstats);
+GwyDataField*        gwy_tip_dilation_pygwy                             (GwyDataField *tip,
+                                                                         GwyDataField *surface);
+GwyDataField*        gwy_tip_erosion_pygwy                              (GwyDataField *tip,
+                                                                         GwyDataField *surface);
+GwyDataField*        gwy_tip_cmap_pygwy                                 (GwyDataField *tip,
+                                                                         GwyDataField *surface);
+GwyDataField*        gwy_data_field_create_full_mask_pygwy              (GwyDataField *d);
+gboolean             gwy_get_grain_quantity_needs_same_units_pygwy      (GwyGrainQuantity quantity);
+GwySIUnit*           gwy_construct_grain_quantity_units_pygwy           (GwyGrainQuantity quantity,
+                                                                         GwySIUnit *siunitxy,
+                                                                         GwySIUnit *siunitz);
+GwyIntArray*         gwy_tip_model_preset_get_params_pygwy              (const GwyTipModelPreset *preset);
+GwyArrayFuncStatus   gwy_tip_model_preset_create_pygwy                  (const GwyTipModelPreset *preset,
+                                                                         GwyDataField *tip,
+                                                                         GwyDoubleArray *params);
+GwyArrayFuncStatus   gwy_tip_model_preset_create_for_zrange_pygwy       (const GwyTipModelPreset *preset,
+                                                                         GwyDataField *tip,
+                                                                         gdouble zrange,
+                                                                         gboolean square,
+                                                                         GwyDoubleArray *params);
+GwySpline*           gwy_spline_new_from_points_pygwy                   (GwyDoubleArray *xy);
+GwyDoubleArray*      gwy_spline_get_points_pygwy                        (GwySpline *spline);
+GwyDoubleArray*      gwy_spline_get_tangents_pygwy                      (GwySpline *spline);
+GwyDoubleArray*      gwy_spline_sample_naturally_pygwy                  (GwySpline *spline);
+gdouble              gwy_spline_sample_uniformly_pygwy                  (GwySpline *spline,
+                                                                         GwyDoubleArrayOutArg xy,
+                                                                         GwyDoubleArrayOutArg t,
+                                                                         guint n);
+void                 gwy_surface_set_pygwy                              (GwySurface *surface,
+                                                                         guint pos,
+                                                                         const GwyXYZ *point);
+GwyIntArray*         gwy_spectra_find_nearest_pygwy                     (GwySpectra *spectra,
+                                                                         gdouble x,
+                                                                         gdouble y,
+                                                                         guint n);
+GwyDoubleArray*      gwy_graph_curve_model_get_xdata_pygwy              (GwyGraphCurveModel *gcmodel);
+GwyDoubleArray*      gwy_graph_curve_model_get_ydata_pygwy              (GwyGraphCurveModel *gcmodel);
+GwyArrayFuncStatus   gwy_graph_curve_model_set_data_pygwy               (GwyGraphCurveModel *gcmodel,
+                                                                         GwyDoubleArray *xdata,
+                                                                         GwyDoubleArray *ydata);
+GwyArrayFuncStatus   gwy_graph_curve_model_set_data_interleaved_pygwy   (GwyGraphCurveModel *gcmodel,
+                                                                         GwyDoubleArray *xydata);
+void                 gwy_graph_area_set_x_grid_data_pygwy               (GwyGraphArea *area,
+                                                                         GwyDoubleArray *grid_data);
+void                 gwy_graph_area_set_y_grid_data_pygwy               (GwyGraphArea *area,
+                                                                         GwyDoubleArray *grid_data);
+GwyDoubleArray*      gwy_graph_area_get_x_grid_data_pygwy               (GwyGraphArea *area);
+GwyDoubleArray*      gwy_graph_area_get_y_grid_data_pygwy               (GwyGraphArea *area);
+GwyDoubleArray*      gwy_draw_data_field_map_adaptive_pygwy             (GwyDataField *data_field,
+                                                                         GwyDoubleArray *z);
+GwyDoubleArray*      gwy_data_view_get_metric_pygwy                     (GwyDataView *data_view);
+GwyDoubleArray*      gwy_axis_get_major_ticks_pygwy                     (GwyAxis *axis);
+gulong               gwy_undo_checkpoint_pygwy                          (GwyContainer *container,
+                                                                         GwyStringArray *keys);
+gulong               gwy_undo_qcheckpoint_pygwy                         (GwyContainer *container,
+                                                                         GwyIntArray *keys);
+gulong               gwy_app_undo_checkpoint_pygwy                      (GwyContainer *container,
+                                                                         GwyStringArray *keys);
+gulong               gwy_app_undo_qcheckpoint_pygwy                     (GwyContainer *container,
+                                                                         GwyIntArray *keys);
+GObject*             gwy_inventory_get_item_pygwy                       (GwyInventory *inventory,
+                                                                         const gchar *name);
+GObject*             gwy_inventory_get_item_or_default_pygwy            (GwyInventory *inventory,
+                                                                         const gchar *name);
+GObject*             gwy_inventory_get_nth_item_pygwy                   (GwyInventory *inventory,
+                                                                         guint n);
+GObject*             gwy_inventory_get_default_item_pygwy               (GwyInventory *inventory);
+void                 gwy_inventory_insert_item_pygwy                    (GwyInventory *inventory,
+                                                                         GObject *object);
+void                 gwy_inventory_insert_nth_item_pygwy                (GwyInventory *inventory,
+                                                                         GObject *object,
+                                                                         guint n);
+void                 gwy_inventory_rename_item_pygwy                    (GwyInventory *inventory,
+                                                                         const gchar *name,
+                                                                         const gchar *newname);
+GObject*             gwy_inventory_new_item_pygwy                       (GwyInventory *inventory,
+                                                                         const gchar *name,
+                                                                         const gchar *newname);
+GwyArrayFuncStatus   gwy_cdline_fit_pygwy                               (GwyCDLine *cdline,
+                                                                         GwyDoubleArray *x,
+                                                                         GwyDoubleArray *y,
+                                                                         GwyDoubleArrayOutArg params,
+                                                                         GwyDoubleArrayOutArg err);
+GwyArrayFuncStatus   gwy_cdline_get_value_pygwy                         (GwyCDLine *cdline,
+                                                                         gdouble x,
+                                                                         GwyDoubleArray *params,
+                                                                         gdouble *value,
+                                                                         gboolean *fres);
+GwyArrayFuncStatus   gwy_peaks_analyze_pygwy                            (GwyPeaks *peaks,
+                                                                         GwyDoubleArray *xdata,
+                                                                         GwyDoubleArray *ydata,
+                                                                         guint maxpeaks,
+                                                                         guint *npeaks);
+GwyDoubleArray*      gwy_peaks_get_quantity_pygwy                       (GwyPeaks *peaks,
+                                                                         GwyPeakQuantity quantity);
+GwyDoubleArray*      gwy_marker_box_get_markers_pygwy                   (GwyMarkerBox *mbox);
+void                 gwy_marker_box_set_markers_pygwy                   (GwyMarkerBox *mbox,
+                                                                         GwyDoubleArray *markers);
+void                 gwy_app_sync_data_items_pygwy                      (GwyContainer *source,
+                                                                         GwyContainer *dest,
+                                                                         gint from_id,
+                                                                         gint to_id,
+                                                                         gboolean delete_too,
+                                                                         GwyIntArray *items);
 
 #endif
 
diff --git a/modules/tools/Makefile.am b/modules/tools/Makefile.am
index fc7d5b9..c2533b7 100644
--- a/modules/tools/Makefile.am
+++ b/modules/tools/Makefile.am
@@ -1,8 +1,11 @@
-# @(#) $Id: Makefile.am 17246 2015-08-05 09:03:40Z yeti-dn $
+# @(#) $Id: Makefile.am 20001 2017-06-29 21:52:24Z yeti-dn $
 
 toolsdir = $(pkglibdir)/modules/tool
 
-tools_LTLIBRARIES = \
+# Only bundle modules without own dependencies.  If something goes wrong with
+# any required libraries at run-time, it will at most break these individual
+# unbundled modules, not the bundle.
+bundlable_modules = \
 	crop.la \
 	distance.la \
 	filter.la \
@@ -22,14 +25,22 @@ tools_LTLIBRARIES = \
 	spectro.la \
 	stats.la
 
+# tools_modules is either the bundle or all the individual modules.
+if MODULE_BUNDLING
+tools_modules = tools.la
+BUILT_SOURCES = tools.c
+tools_la_CFLAGS = $(AM_CFLAGS) -DGWY_MODULE_BUNDLING
+else
+tools_modules = $(bundlable_modules)
+endif
+
+tools_LTLIBRARIES = \
+	$(tools_modules)
+
 if OS_MSWIN
 no_undefined = -no-undefined
 endif
 
-AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
-AM_CFLAGS = @COMMON_CFLAGS@
-AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
-
 if MODULE_DEPENDENCIES
 module_libadd = \
 	$(top_builddir)/app/libgwyapp2.la \
@@ -41,6 +52,11 @@ module_libadd = \
 	@GTK_LIBS@
 endif
 
+AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
+AM_CFLAGS = @COMMON_CFLAGS@
+AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
+
+# Bundlable modules, must be listed in tools_la_SOURCES below.
 crop_la_SOURCES             = crop.c
 distance_la_SOURCES         = distance.c
 filter_la_SOURCES           = filter.c
@@ -60,5 +76,31 @@ sfunctions_la_SOURCES       = sfunctions.c
 spectro_la_SOURCES          = spectro.c
 spotremove_la_SOURCES       = spotremove.c
 
+tools_la_SOURCES = \
+	$(crop_la_SOURCES) \
+	$(distance_la_SOURCES) \
+	$(filter_la_SOURCES) \
+	$(grainmeasure_la_SOURCES) \
+	$(grainremover_la_SOURCES) \
+	$(icolorange_la_SOURCES) \
+	$(level3_la_SOURCES) \
+	$(linestats_la_SOURCES) \
+	$(maskedit_la_SOURCES) \
+	$(pathlevel_la_SOURCES) \
+	$(profile_la_SOURCES) \
+	$(readvalue_la_SOURCES) \
+	$(roughness_la_SOURCES) \
+	$(stats_la_SOURCES) \
+	$(selectionmanager_la_SOURCES) \
+	$(sfunctions_la_SOURCES) \
+	$(spectro_la_SOURCES) \
+	$(spotremove_la_SOURCES) \
+	tools.c
+
+tools.c: $(srcdir)/Makefile.am $(top_srcdir)/utils/gen-module-bundle.sh
+	$(SHELL) $(top_srcdir)/utils/gen-module-bundle.sh tools.c $(bundlable_modules)
+
+CLEAN_FILES = tools.c
+
 clean-local:
 	rm -f core.* *~
diff --git a/modules/tools/Makefile.in b/modules/tools/Makefile.in
index a756e2d..ce0825b 100644
--- a/modules/tools/Makefile.in
+++ b/modules/tools/Makefile.in
@@ -14,7 +14,7 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 17246 2015-08-05 09:03:40Z yeti-dn $
+# @(#) $Id: Makefile.am 20001 2017-06-29 21:52:24Z yeti-dn $
 
 VPATH = @srcdir@
 am__is_gnu_make = { \
@@ -145,57 +145,107 @@ AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
+ at MODULE_BUNDLING_FALSE@am_crop_la_rpath = -rpath $(toolsdir)
 distance_la_LIBADD =
 am_distance_la_OBJECTS = distance.lo
 distance_la_OBJECTS = $(am_distance_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_distance_la_rpath = -rpath $(toolsdir)
 filter_la_LIBADD =
 am_filter_la_OBJECTS = filter.lo
 filter_la_OBJECTS = $(am_filter_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_filter_la_rpath = -rpath $(toolsdir)
 grainmeasure_la_LIBADD =
 am_grainmeasure_la_OBJECTS = grainmeasure.lo
 grainmeasure_la_OBJECTS = $(am_grainmeasure_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_grainmeasure_la_rpath = -rpath $(toolsdir)
 grainremover_la_LIBADD =
 am_grainremover_la_OBJECTS = grainremover.lo
 grainremover_la_OBJECTS = $(am_grainremover_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_grainremover_la_rpath = -rpath $(toolsdir)
 icolorange_la_LIBADD =
 am_icolorange_la_OBJECTS = icolorange.lo
 icolorange_la_OBJECTS = $(am_icolorange_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_icolorange_la_rpath = -rpath $(toolsdir)
 level3_la_LIBADD =
 am_level3_la_OBJECTS = level3.lo
 level3_la_OBJECTS = $(am_level3_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_level3_la_rpath = -rpath $(toolsdir)
 linestats_la_LIBADD =
 am_linestats_la_OBJECTS = linestats.lo
 linestats_la_OBJECTS = $(am_linestats_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_linestats_la_rpath = -rpath $(toolsdir)
 maskedit_la_LIBADD =
 am_maskedit_la_OBJECTS = maskedit.lo
 maskedit_la_OBJECTS = $(am_maskedit_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_maskedit_la_rpath = -rpath $(toolsdir)
 pathlevel_la_LIBADD =
 am_pathlevel_la_OBJECTS = pathlevel.lo
 pathlevel_la_OBJECTS = $(am_pathlevel_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_pathlevel_la_rpath = -rpath $(toolsdir)
 profile_la_LIBADD =
 am_profile_la_OBJECTS = profile.lo
 profile_la_OBJECTS = $(am_profile_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_profile_la_rpath = -rpath $(toolsdir)
 readvalue_la_LIBADD =
 am_readvalue_la_OBJECTS = readvalue.lo
 readvalue_la_OBJECTS = $(am_readvalue_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_readvalue_la_rpath = -rpath $(toolsdir)
 roughness_la_LIBADD =
 am_roughness_la_OBJECTS = roughness.lo
 roughness_la_OBJECTS = $(am_roughness_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_roughness_la_rpath = -rpath $(toolsdir)
 selectionmanager_la_LIBADD =
 am_selectionmanager_la_OBJECTS = selectionmanager.lo
 selectionmanager_la_OBJECTS = $(am_selectionmanager_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_selectionmanager_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(toolsdir)
 sfunctions_la_LIBADD =
 am_sfunctions_la_OBJECTS = sfunctions.lo
 sfunctions_la_OBJECTS = $(am_sfunctions_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_sfunctions_la_rpath = -rpath $(toolsdir)
 spectro_la_LIBADD =
 am_spectro_la_OBJECTS = spectro.lo
 spectro_la_OBJECTS = $(am_spectro_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_spectro_la_rpath = -rpath $(toolsdir)
 spotremove_la_LIBADD =
 am_spotremove_la_OBJECTS = spotremove.lo
 spotremove_la_OBJECTS = $(am_spotremove_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_spotremove_la_rpath = -rpath $(toolsdir)
 stats_la_LIBADD =
 am_stats_la_OBJECTS = stats.lo
 stats_la_OBJECTS = $(am_stats_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_stats_la_rpath = -rpath $(toolsdir)
+tools_la_LIBADD =
+am__objects_1 = tools_la-crop.lo
+am__objects_2 = tools_la-distance.lo
+am__objects_3 = tools_la-filter.lo
+am__objects_4 = tools_la-grainmeasure.lo
+am__objects_5 = tools_la-grainremover.lo
+am__objects_6 = tools_la-icolorange.lo
+am__objects_7 = tools_la-level3.lo
+am__objects_8 = tools_la-linestats.lo
+am__objects_9 = tools_la-maskedit.lo
+am__objects_10 = tools_la-pathlevel.lo
+am__objects_11 = tools_la-profile.lo
+am__objects_12 = tools_la-readvalue.lo
+am__objects_13 = tools_la-roughness.lo
+am__objects_14 = tools_la-stats.lo
+am__objects_15 = tools_la-selectionmanager.lo
+am__objects_16 = tools_la-sfunctions.lo
+am__objects_17 = tools_la-spectro.lo
+am__objects_18 = tools_la-spotremove.lo
+am_tools_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
+	$(am__objects_3) $(am__objects_4) $(am__objects_5) \
+	$(am__objects_6) $(am__objects_7) $(am__objects_8) \
+	$(am__objects_9) $(am__objects_10) $(am__objects_11) \
+	$(am__objects_12) $(am__objects_13) $(am__objects_14) \
+	$(am__objects_15) $(am__objects_16) $(am__objects_17) \
+	$(am__objects_18) tools_la-tools.lo
+tools_la_OBJECTS = $(am_tools_la_OBJECTS)
+tools_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(tools_la_CFLAGS) \
+	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+ at MODULE_BUNDLING_TRUE@am_tools_la_rpath = -rpath $(toolsdir)
 AM_V_P = $(am__v_P_ at AM_V@)
 am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -238,7 +288,8 @@ SOURCES = $(crop_la_SOURCES) $(distance_la_SOURCES) \
 	$(profile_la_SOURCES) $(readvalue_la_SOURCES) \
 	$(roughness_la_SOURCES) $(selectionmanager_la_SOURCES) \
 	$(sfunctions_la_SOURCES) $(spectro_la_SOURCES) \
-	$(spotremove_la_SOURCES) $(stats_la_SOURCES)
+	$(spotremove_la_SOURCES) $(stats_la_SOURCES) \
+	$(tools_la_SOURCES)
 DIST_SOURCES = $(crop_la_SOURCES) $(distance_la_SOURCES) \
 	$(filter_la_SOURCES) $(grainmeasure_la_SOURCES) \
 	$(grainremover_la_SOURCES) $(icolorange_la_SOURCES) \
@@ -247,7 +298,8 @@ DIST_SOURCES = $(crop_la_SOURCES) $(distance_la_SOURCES) \
 	$(profile_la_SOURCES) $(readvalue_la_SOURCES) \
 	$(roughness_la_SOURCES) $(selectionmanager_la_SOURCES) \
 	$(sfunctions_la_SOURCES) $(spectro_la_SOURCES) \
-	$(spotremove_la_SOURCES) $(stats_la_SOURCES)
+	$(spotremove_la_SOURCES) $(stats_la_SOURCES) \
+	$(tools_la_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -313,10 +365,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -326,6 +375,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -350,7 +401,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -408,6 +461,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -416,17 +470,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -512,7 +562,11 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 toolsdir = $(pkglibdir)/modules/tool
-tools_LTLIBRARIES = \
+
+# Only bundle modules without own dependencies.  If something goes wrong with
+# any required libraries at run-time, it will at most break these individual
+# unbundled modules, not the bundle.
+bundlable_modules = \
 	crop.la \
 	distance.la \
 	filter.la \
@@ -532,10 +586,16 @@ tools_LTLIBRARIES = \
 	spectro.la \
 	stats.la
 
+ at MODULE_BUNDLING_FALSE@tools_modules = $(bundlable_modules)
+
+# tools_modules is either the bundle or all the individual modules.
+ at MODULE_BUNDLING_TRUE@tools_modules = tools.la
+ at MODULE_BUNDLING_TRUE@BUILT_SOURCES = tools.c
+ at MODULE_BUNDLING_TRUE@tools_la_CFLAGS = $(AM_CFLAGS) -DGWY_MODULE_BUNDLING
+tools_LTLIBRARIES = \
+	$(tools_modules)
+
 @OS_MSWIN_TRUE at no_undefined = -no-undefined
-AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
-AM_CFLAGS = @COMMON_CFLAGS@
-AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
 @MODULE_DEPENDENCIES_TRUE at module_libadd = \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/app/libgwyapp2.la \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libdraw/libgwydraw2.la \
@@ -545,6 +605,11 @@ AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libprocess/libgwyprocess2.la \
 @MODULE_DEPENDENCIES_TRUE@	@GTK_LIBS@
 
+AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
+AM_CFLAGS = @COMMON_CFLAGS@
+AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
+
+# Bundlable modules, must be listed in tools_la_SOURCES below.
 crop_la_SOURCES = crop.c
 distance_la_SOURCES = distance.c
 filter_la_SOURCES = filter.c
@@ -563,7 +628,30 @@ selectionmanager_la_SOURCES = selectionmanager.c
 sfunctions_la_SOURCES = sfunctions.c
 spectro_la_SOURCES = spectro.c
 spotremove_la_SOURCES = spotremove.c
-all: all-am
+tools_la_SOURCES = \
+	$(crop_la_SOURCES) \
+	$(distance_la_SOURCES) \
+	$(filter_la_SOURCES) \
+	$(grainmeasure_la_SOURCES) \
+	$(grainremover_la_SOURCES) \
+	$(icolorange_la_SOURCES) \
+	$(level3_la_SOURCES) \
+	$(linestats_la_SOURCES) \
+	$(maskedit_la_SOURCES) \
+	$(pathlevel_la_SOURCES) \
+	$(profile_la_SOURCES) \
+	$(readvalue_la_SOURCES) \
+	$(roughness_la_SOURCES) \
+	$(stats_la_SOURCES) \
+	$(selectionmanager_la_SOURCES) \
+	$(sfunctions_la_SOURCES) \
+	$(spectro_la_SOURCES) \
+	$(spotremove_la_SOURCES) \
+	tools.c
+
+CLEAN_FILES = tools.c
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
 
 .SUFFIXES:
 .SUFFIXES: .c .lo .o .obj
@@ -633,58 +721,61 @@ clean-toolsLTLIBRARIES:
 	}
 
 crop.la: $(crop_la_OBJECTS) $(crop_la_DEPENDENCIES) $(EXTRA_crop_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(crop_la_OBJECTS) $(crop_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_crop_la_rpath) $(crop_la_OBJECTS) $(crop_la_LIBADD) $(LIBS)
 
 distance.la: $(distance_la_OBJECTS) $(distance_la_DEPENDENCIES) $(EXTRA_distance_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(distance_la_OBJECTS) $(distance_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_distance_la_rpath) $(distance_la_OBJECTS) $(distance_la_LIBADD) $(LIBS)
 
 filter.la: $(filter_la_OBJECTS) $(filter_la_DEPENDENCIES) $(EXTRA_filter_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(filter_la_OBJECTS) $(filter_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_filter_la_rpath) $(filter_la_OBJECTS) $(filter_la_LIBADD) $(LIBS)
 
 grainmeasure.la: $(grainmeasure_la_OBJECTS) $(grainmeasure_la_DEPENDENCIES) $(EXTRA_grainmeasure_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(grainmeasure_la_OBJECTS) $(grainmeasure_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_grainmeasure_la_rpath) $(grainmeasure_la_OBJECTS) $(grainmeasure_la_LIBADD) $(LIBS)
 
 grainremover.la: $(grainremover_la_OBJECTS) $(grainremover_la_DEPENDENCIES) $(EXTRA_grainremover_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(grainremover_la_OBJECTS) $(grainremover_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_grainremover_la_rpath) $(grainremover_la_OBJECTS) $(grainremover_la_LIBADD) $(LIBS)
 
 icolorange.la: $(icolorange_la_OBJECTS) $(icolorange_la_DEPENDENCIES) $(EXTRA_icolorange_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(icolorange_la_OBJECTS) $(icolorange_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_icolorange_la_rpath) $(icolorange_la_OBJECTS) $(icolorange_la_LIBADD) $(LIBS)
 
 level3.la: $(level3_la_OBJECTS) $(level3_la_DEPENDENCIES) $(EXTRA_level3_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(level3_la_OBJECTS) $(level3_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_level3_la_rpath) $(level3_la_OBJECTS) $(level3_la_LIBADD) $(LIBS)
 
 linestats.la: $(linestats_la_OBJECTS) $(linestats_la_DEPENDENCIES) $(EXTRA_linestats_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(linestats_la_OBJECTS) $(linestats_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_linestats_la_rpath) $(linestats_la_OBJECTS) $(linestats_la_LIBADD) $(LIBS)
 
 maskedit.la: $(maskedit_la_OBJECTS) $(maskedit_la_DEPENDENCIES) $(EXTRA_maskedit_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(maskedit_la_OBJECTS) $(maskedit_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_maskedit_la_rpath) $(maskedit_la_OBJECTS) $(maskedit_la_LIBADD) $(LIBS)
 
 pathlevel.la: $(pathlevel_la_OBJECTS) $(pathlevel_la_DEPENDENCIES) $(EXTRA_pathlevel_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(pathlevel_la_OBJECTS) $(pathlevel_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_pathlevel_la_rpath) $(pathlevel_la_OBJECTS) $(pathlevel_la_LIBADD) $(LIBS)
 
 profile.la: $(profile_la_OBJECTS) $(profile_la_DEPENDENCIES) $(EXTRA_profile_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(profile_la_OBJECTS) $(profile_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_profile_la_rpath) $(profile_la_OBJECTS) $(profile_la_LIBADD) $(LIBS)
 
 readvalue.la: $(readvalue_la_OBJECTS) $(readvalue_la_DEPENDENCIES) $(EXTRA_readvalue_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(readvalue_la_OBJECTS) $(readvalue_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_readvalue_la_rpath) $(readvalue_la_OBJECTS) $(readvalue_la_LIBADD) $(LIBS)
 
 roughness.la: $(roughness_la_OBJECTS) $(roughness_la_DEPENDENCIES) $(EXTRA_roughness_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(roughness_la_OBJECTS) $(roughness_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_roughness_la_rpath) $(roughness_la_OBJECTS) $(roughness_la_LIBADD) $(LIBS)
 
 selectionmanager.la: $(selectionmanager_la_OBJECTS) $(selectionmanager_la_DEPENDENCIES) $(EXTRA_selectionmanager_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(selectionmanager_la_OBJECTS) $(selectionmanager_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_selectionmanager_la_rpath) $(selectionmanager_la_OBJECTS) $(selectionmanager_la_LIBADD) $(LIBS)
 
 sfunctions.la: $(sfunctions_la_OBJECTS) $(sfunctions_la_DEPENDENCIES) $(EXTRA_sfunctions_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(sfunctions_la_OBJECTS) $(sfunctions_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_sfunctions_la_rpath) $(sfunctions_la_OBJECTS) $(sfunctions_la_LIBADD) $(LIBS)
 
 spectro.la: $(spectro_la_OBJECTS) $(spectro_la_DEPENDENCIES) $(EXTRA_spectro_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(spectro_la_OBJECTS) $(spectro_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_spectro_la_rpath) $(spectro_la_OBJECTS) $(spectro_la_LIBADD) $(LIBS)
 
 spotremove.la: $(spotremove_la_OBJECTS) $(spotremove_la_DEPENDENCIES) $(EXTRA_spotremove_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(spotremove_la_OBJECTS) $(spotremove_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_spotremove_la_rpath) $(spotremove_la_OBJECTS) $(spotremove_la_LIBADD) $(LIBS)
 
 stats.la: $(stats_la_OBJECTS) $(stats_la_DEPENDENCIES) $(EXTRA_stats_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(toolsdir) $(stats_la_OBJECTS) $(stats_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_stats_la_rpath) $(stats_la_OBJECTS) $(stats_la_LIBADD) $(LIBS)
+
+tools.la: $(tools_la_OBJECTS) $(tools_la_DEPENDENCIES) $(EXTRA_tools_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(tools_la_LINK) $(am_tools_la_rpath) $(tools_la_OBJECTS) $(tools_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -710,6 +801,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/spectro.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/spotremove.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/stats.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-crop.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-distance.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-filter.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-grainmeasure.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-grainremover.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-icolorange.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-level3.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-linestats.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-maskedit.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-pathlevel.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-profile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-readvalue.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-roughness.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-selectionmanager.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-sfunctions.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-spectro.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-spotremove.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-stats.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools_la-tools.Plo at am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -732,6 +842,139 @@ distclean-compile:
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
+tools_la-crop.lo: crop.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-crop.lo -MD -MP -MF $(DEPDIR)/tools_la-crop.Tpo -c -o tools_la-crop.lo `test -f 'crop.c' || echo '$(srcdir)/'`crop.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-crop.Tpo $(DEPDIR)/tools_la-crop.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='crop.c' object='tools_la-crop.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-crop.lo `test -f 'crop.c' || echo '$(srcdir)/'`crop.c
+
+tools_la-distance.lo: distance.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-distance.lo -MD -MP -MF $(DEPDIR)/tools_la-distance.Tpo -c -o tools_la-distance.lo `test -f 'distance.c' || echo '$(srcdir)/'`distance.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-distance.Tpo $(DEPDIR)/tools_la-distance.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='distance.c' object='tools_la-distance.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-distance.lo `test -f 'distance.c' || echo '$(srcdir)/'`distance.c
+
+tools_la-filter.lo: filter.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-filter.lo -MD -MP -MF $(DEPDIR)/tools_la-filter.Tpo -c -o tools_la-filter.lo `test -f 'filter.c' || echo '$(srcdir)/'`filter.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-filter.Tpo $(DEPDIR)/tools_la-filter.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='filter.c' object='tools_la-filter.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-filter.lo `test -f 'filter.c' || echo '$(srcdir)/'`filter.c
+
+tools_la-grainmeasure.lo: grainmeasure.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-grainmeasure.lo -MD -MP -MF $(DEPDIR)/tools_la-grainmeasure.Tpo -c -o tools_la-grainmeasure.lo `test -f 'grainmeasure.c' || echo '$(srcdir)/'`grainmeasure.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-grainmeasure.Tpo $(DEPDIR)/tools_la-grainmeasure.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='grainmeasure.c' object='tools_la-grainmeasure.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-grainmeasure.lo `test -f 'grainmeasure.c' || echo '$(srcdir)/'`grainmeasure.c
+
+tools_la-grainremover.lo: grainremover.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-grainremover.lo -MD -MP -MF $(DEPDIR)/tools_la-grainremover.Tpo -c -o tools_la-grainremover.lo `test -f 'grainremover.c' || echo '$(srcdir)/'`grainremover.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-grainremover.Tpo $(DEPDIR)/tools_la-grainremover.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='grainremover.c' object='tools_la-grainremover.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-grainremover.lo `test -f 'grainremover.c' || echo '$(srcdir)/'`grainremover.c
+
+tools_la-icolorange.lo: icolorange.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-icolorange.lo -MD -MP -MF $(DEPDIR)/tools_la-icolorange.Tpo -c -o tools_la-icolorange.lo `test -f 'icolorange.c' || echo '$(srcdir)/'`icolorange.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-icolorange.Tpo $(DEPDIR)/tools_la-icolorange.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='icolorange.c' object='tools_la-icolorange.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-icolorange.lo `test -f 'icolorange.c' || echo '$(srcdir)/'`icolorange.c
+
+tools_la-level3.lo: level3.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-level3.lo -MD -MP -MF $(DEPDIR)/tools_la-level3.Tpo -c -o tools_la-level3.lo `test -f 'level3.c' || echo '$(srcdir)/'`level3.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-level3.Tpo $(DEPDIR)/tools_la-level3.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='level3.c' object='tools_la-level3.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-level3.lo `test -f 'level3.c' || echo '$(srcdir)/'`level3.c
+
+tools_la-linestats.lo: linestats.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-linestats.lo -MD -MP -MF $(DEPDIR)/tools_la-linestats.Tpo -c -o tools_la-linestats.lo `test -f 'linestats.c' || echo '$(srcdir)/'`linestats.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-linestats.Tpo $(DEPDIR)/tools_la-linestats.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='linestats.c' object='tools_la-linestats.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-linestats.lo `test -f 'linestats.c' || echo '$(srcdir)/'`linestats.c
+
+tools_la-maskedit.lo: maskedit.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-maskedit.lo -MD -MP -MF $(DEPDIR)/tools_la-maskedit.Tpo -c -o tools_la-maskedit.lo `test -f 'maskedit.c' || echo '$(srcdir)/'`maskedit.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-maskedit.Tpo $(DEPDIR)/tools_la-maskedit.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='maskedit.c' object='tools_la-maskedit.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-maskedit.lo `test -f 'maskedit.c' || echo '$(srcdir)/'`maskedit.c
+
+tools_la-pathlevel.lo: pathlevel.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-pathlevel.lo -MD -MP -MF $(DEPDIR)/tools_la-pathlevel.Tpo -c -o tools_la-pathlevel.lo `test -f 'pathlevel.c' || echo '$(srcdir)/'`pathlevel.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-pathlevel.Tpo $(DEPDIR)/tools_la-pathlevel.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pathlevel.c' object='tools_la-pathlevel.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-pathlevel.lo `test -f 'pathlevel.c' || echo '$(srcdir)/'`pathlevel.c
+
+tools_la-profile.lo: profile.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-profile.lo -MD -MP -MF $(DEPDIR)/tools_la-profile.Tpo -c -o tools_la-profile.lo `test -f 'profile.c' || echo '$(srcdir)/'`profile.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-profile.Tpo $(DEPDIR)/tools_la-profile.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='profile.c' object='tools_la-profile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-profile.lo `test -f 'profile.c' || echo '$(srcdir)/'`profile.c
+
+tools_la-readvalue.lo: readvalue.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-readvalue.lo -MD -MP -MF $(DEPDIR)/tools_la-readvalue.Tpo -c -o tools_la-readvalue.lo `test -f 'readvalue.c' || echo '$(srcdir)/'`readvalue.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-readvalue.Tpo $(DEPDIR)/tools_la-readvalue.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='readvalue.c' object='tools_la-readvalue.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-readvalue.lo `test -f 'readvalue.c' || echo '$(srcdir)/'`readvalue.c
+
+tools_la-roughness.lo: roughness.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-roughness.lo -MD -MP -MF $(DEPDIR)/tools_la-roughness.Tpo -c -o tools_la-roughness.lo `test -f 'roughness.c' || echo '$(srcdir)/'`roughness.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-roughness.Tpo $(DEPDIR)/tools_la-roughness.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='roughness.c' object='tools_la-roughness.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-roughness.lo `test -f 'roughness.c' || echo '$(srcdir)/'`roughness.c
+
+tools_la-stats.lo: stats.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-stats.lo -MD -MP -MF $(DEPDIR)/tools_la-stats.Tpo -c -o tools_la-stats.lo `test -f 'stats.c' || echo '$(srcdir)/'`stats.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-stats.Tpo $(DEPDIR)/tools_la-stats.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='stats.c' object='tools_la-stats.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-stats.lo `test -f 'stats.c' || echo '$(srcdir)/'`stats.c
+
+tools_la-selectionmanager.lo: selectionmanager.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-selectionmanager.lo -MD -MP -MF $(DEPDIR)/tools_la-selectionmanager.Tpo -c -o tools_la-selectionmanager.lo `test -f 'selectionmanager.c' || echo '$(srcdir)/'`selectionmanager.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-selectionmanager.Tpo $(DEPDIR)/tools_la-selectionmanager.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='selectionmanager.c' object='tools_la-selectionmanager.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-selectionmanager.lo `test -f 'selectionmanager.c' || echo '$(srcdir)/'`selectionmanager.c
+
+tools_la-sfunctions.lo: sfunctions.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-sfunctions.lo -MD -MP -MF $(DEPDIR)/tools_la-sfunctions.Tpo -c -o tools_la-sfunctions.lo `test -f 'sfunctions.c' || echo '$(srcdir)/'`sfunctions.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-sfunctions.Tpo $(DEPDIR)/tools_la-sfunctions.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='sfunctions.c' object='tools_la-sfunctions.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-sfunctions.lo `test -f 'sfunctions.c' || echo '$(srcdir)/'`sfunctions.c
+
+tools_la-spectro.lo: spectro.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-spectro.lo -MD -MP -MF $(DEPDIR)/tools_la-spectro.Tpo -c -o tools_la-spectro.lo `test -f 'spectro.c' || echo '$(srcdir)/'`spectro.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-spectro.Tpo $(DEPDIR)/tools_la-spectro.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='spectro.c' object='tools_la-spectro.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-spectro.lo `test -f 'spectro.c' || echo '$(srcdir)/'`spectro.c
+
+tools_la-spotremove.lo: spotremove.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-spotremove.lo -MD -MP -MF $(DEPDIR)/tools_la-spotremove.Tpo -c -o tools_la-spotremove.lo `test -f 'spotremove.c' || echo '$(srcdir)/'`spotremove.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-spotremove.Tpo $(DEPDIR)/tools_la-spotremove.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='spotremove.c' object='tools_la-spotremove.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-spotremove.lo `test -f 'spotremove.c' || echo '$(srcdir)/'`spotremove.c
+
+tools_la-tools.lo: tools.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -MT tools_la-tools.lo -MD -MP -MF $(DEPDIR)/tools_la-tools.Tpo -c -o tools_la-tools.lo `test -f 'tools.c' || echo '$(srcdir)/'`tools.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/tools_la-tools.Tpo $(DEPDIR)/tools_la-tools.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tools.c' object='tools_la-tools.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_la_CFLAGS) $(CFLAGS) -c -o tools_la-tools.lo `test -f 'tools.c' || echo '$(srcdir)/'`tools.c
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
@@ -821,13 +1064,15 @@ distdir: $(DISTFILES)
 	  fi; \
 	done
 check-am: all-am
-check: check-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
 all-am: Makefile $(LTLIBRARIES)
 installdirs:
 	for dir in "$(DESTDIR)$(toolsdir)"; do \
 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
-install: install-am
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
 install-exec: install-exec-am
 install-data: install-data-am
 uninstall: uninstall-am
@@ -857,6 +1102,7 @@ distclean-generic:
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
 clean: clean-am
 
 clean-am: clean-generic clean-libtool clean-local \
@@ -928,7 +1174,7 @@ ps-am:
 
 uninstall-am: uninstall-toolsLTLIBRARIES
 
-.MAKE: install-am install-strip
+.MAKE: all check install install-am install-strip
 
 .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
 	clean-libtool clean-local clean-toolsLTLIBRARIES cscopelist-am \
@@ -948,6 +1194,9 @@ uninstall-am: uninstall-toolsLTLIBRARIES
 .PRECIOUS: Makefile
 
 
+tools.c: $(srcdir)/Makefile.am $(top_srcdir)/utils/gen-module-bundle.sh
+	$(SHELL) $(top_srcdir)/utils/gen-module-bundle.sh tools.c $(bundlable_modules)
+
 clean-local:
 	rm -f core.* *~
 
diff --git a/modules/tools/crop.c b/modules/tools/crop.c
index aa3b3f0..1ce5bed 100644
--- a/modules/tools/crop.c
+++ b/modules/tools/crop.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: crop.c 17820 2015-12-11 15:06:32Z yeti-dn $
+ *  @(#) $Id: crop.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -96,7 +96,7 @@ static const ToolArgs default_args = {
     TRUE,
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, crop)
 
 G_DEFINE_TYPE(GwyToolCrop, gwy_tool_crop, GWY_TYPE_PLAIN_TOOL)
 
@@ -203,18 +203,18 @@ gwy_tool_crop_init_dialog(GwyToolCrop *tool)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tool->keep_offsets),
                                  tool->args.keep_offsets);
     gtk_table_attach(table, tool->keep_offsets,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(tool->keep_offsets, "toggled",
                              G_CALLBACK(gwy_tool_crop_keep_offsets_toggled),
                              tool);
     row++;
 
     tool->new_channel
-        = gtk_check_button_new_with_mnemonic(_("Create new channel"));
+        = gtk_check_button_new_with_mnemonic(_("Create new image"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tool->new_channel),
                                  tool->args.new_channel);
     gtk_table_attach(table, tool->new_channel,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(tool->new_channel, "toggled",
                              G_CALLBACK(gwy_tool_crop_new_data_toggled),
                              tool);
diff --git a/modules/tools/distance.c b/modules/tools/distance.c
index 047a4d1..2285122 100644
--- a/modules/tools/distance.c
+++ b/modules/tools/distance.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: distance.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: distance.c 20111 2017-07-30 14:08:43Z yeti-dn $
  *  Copyright (C) 2003-2008 Nenad Ocelic, David Necas (Yeti), Petr Klapetek.
  *  E-mail: ocelic at biochem.mpg.de, yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -110,7 +110,7 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Distance measurement tool, measures distances and angles."),
     "Nenad Ocelic <ocelic at biochem.mpg.de>",
-    "2.13",
+    "2.14",
     "Nenad Ocelic & David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
@@ -121,7 +121,7 @@ static const ToolArgs default_args = {
     TRUE,
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, distance)
 
 G_DEFINE_TYPE(GwyToolDistance, gwy_tool_distance, GWY_TYPE_PLAIN_TOOL)
 
@@ -194,7 +194,7 @@ gwy_tool_distance_init(GwyToolDistance *tool)
     gwy_container_gis_boolean_by_name(settings, number_lines_key,
                                       &tool->args.number_lines);
 
-    tool->angle_format = gwy_si_unit_value_format_new(1.0, 1, "deg");
+    tool->angle_format = gwy_si_unit_value_format_new(1.0, 1, _("deg"));
     gwy_plain_tool_connect_selection(plain_tool, tool->layer_type_line,
                                      "line");
 
@@ -623,7 +623,7 @@ gwy_tool_distance_create_report(GwyToolDistance *tool)
     plain_tool = GWY_PLAIN_TOOL(tool);
     text = g_string_new(NULL);
     g_string_append_printf(text,
-                           "n Δx [%s] Δy [%s] φ [%s] R [%s] Δz [%s]\n",
+                           "n\tΔx [%s]\tΔy [%s]\tφ [%s]\tR [%s]\tΔz [%s]\n",
                            plain_tool->coord_format->units,
                            plain_tool->coord_format->units,
                            tool->angle_format->units,
@@ -654,7 +654,7 @@ gwy_tool_distance_create_report(GwyToolDistance *tool)
         val_dz -= gwy_data_field_get_val(plain_tool->data_field, x, y);
         vf_dz = plain_tool->value_format;
 
-        g_string_append_printf(text, "%d %.*f %.*f %.*f %.*f %.*f\n",
+        g_string_append_printf(text, "%d\t%.*f\t%.*f\t%.*f\t%.*f\t%.*f\n",
                                i+1,
                                vf_dx->precision+1, val_dx/vf_dx->magnitude,
                                vf_dy->precision+1, val_dy/vf_dy->magnitude,
diff --git a/modules/tools/filter.c b/modules/tools/filter.c
index a8c9771..6a89ab0 100644
--- a/modules/tools/filter.c
+++ b/modules/tools/filter.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: filter.c 19039 2016-10-08 10:54:58Z yeti-dn $
- *  Copyright (C) 2003-2006 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: filter.c 19948 2017-06-22 14:05:41Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -30,6 +30,7 @@
 #include <libprocess/linestats.h>
 #include <libgwydgets/gwystock.h>
 #include <libgwydgets/gwycombobox.h>
+#include <libgwydgets/gwyadjustbar.h>
 #include <libgwydgets/gwyradiobuttons.h>
 #include <libgwydgets/gwydgetutils.h>
 #include <app/gwyapp.h>
@@ -128,7 +129,7 @@ static GwyModuleInfo module_info = {
     N_("Filter tool, processes selected part of data with a filter "
        "(conservative denoise, mean, median. Kuwahara, minimum, maximum)."),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "3.12",
+    "3.13",
     "David Nečas (Yeti) & Petr Klapetek",
     "2003",
 };
@@ -145,7 +146,7 @@ static const ToolArgs default_args = {
     5.0,
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, filter)
 
 G_DEFINE_TYPE(GwyToolFilter, gwy_tool_filter, GWY_TYPE_PLAIN_TOOL)
 
@@ -263,7 +264,7 @@ gwy_tool_filter_init_dialog(GwyToolFilter *tool)
                        FALSE, FALSE, 0);
 
     /* Options */
-    table = GTK_TABLE(gtk_table_new(4, 4, FALSE));
+    table = GTK_TABLE(gtk_table_new(4, 3, FALSE));
     gtk_table_set_col_spacings(table, 6);
     gtk_table_set_row_spacings(table, 2);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -272,8 +273,7 @@ gwy_tool_filter_init_dialog(GwyToolFilter *tool)
     row = 0;
 
     label = gwy_label_new_header(_("Filter"));
-    gtk_table_attach(table, label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, label, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     tool->filter_type = gwy_enum_combo_box_new
@@ -281,14 +281,15 @@ gwy_tool_filter_init_dialog(GwyToolFilter *tool)
                                       G_CALLBACK(gwy_tool_filter_type_changed),
                                       tool,
                                       tool->args.filter_type, TRUE);
-    gwy_table_attach_hscale(GTK_WIDGET(table), row, _("_Type:"), NULL,
-                            GTK_OBJECT(tool->filter_type), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row, _("_Type:"), NULL,
+                            GTK_OBJECT(tool->filter_type),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     tool->size = gtk_adjustment_new(0.0, 0.0, 1.0, 0.1, 1.0, 0);
     tool->size_spin
-        = gwy_table_attach_hscale(GTK_WIDGET(table), row, _("Si_ze:"), "px",
-                                  tool->size, 0);
+        = gwy_table_attach_adjbar(GTK_WIDGET(table), row, _("Si_ze:"), _("px"),
+                                  tool->size, GWY_HSCALE_SQRT);
     gwy_table_hscale_set_sensitive
                  (tool->size, gwy_tool_filter_is_sized(tool->args.filter_type));
     setup_size_adjustment(tool);
@@ -298,8 +299,7 @@ gwy_tool_filter_init_dialog(GwyToolFilter *tool)
 
     gtk_table_set_row_spacing(table, row-1, 8);
     label = gwy_label_new_header(_("Masking Mode"));
-    gtk_table_attach(table, label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, label, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     tool->masking
@@ -307,7 +307,7 @@ gwy_tool_filter_init_dialog(GwyToolFilter *tool)
                                    G_CALLBACK(gwy_tool_filter_masking_changed),
                                    tool,
                                    tool->args.masking);
-    row = gwy_radio_buttons_attach_to_table(tool->masking, table, 3, row);
+    row = gwy_radio_buttons_attach_to_table(tool->masking, table, 2, row);
 
     gwy_plain_tool_add_clear_button(GWY_PLAIN_TOOL(tool));
     gwy_tool_add_hide_button(GWY_TOOL(tool), FALSE);
@@ -457,6 +457,8 @@ static void
 setup_size_adjustment(GwyToolFilter *tool)
 {
     GtkAdjustment *adj = GTK_ADJUSTMENT(tool->size);
+    GtkWidget *adjbar = gwy_table_hscale_get_scale(tool->size);
+
     if (gwy_tool_filter_is_float_sized(tool->args.filter_type)) {
         g_object_set(adj,
                      "lower", 0.01,
@@ -466,6 +468,7 @@ setup_size_adjustment(GwyToolFilter *tool)
                      "value", tool->args.gauss_size,
                      NULL);
         gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tool->size_spin), 2);
+        gwy_adjust_bar_set_snap_to_ticks(GWY_ADJUST_BAR(adjbar), FALSE);
     }
     else {
         g_object_set(adj,
@@ -476,6 +479,7 @@ setup_size_adjustment(GwyToolFilter *tool)
                      "value", (gdouble)tool->args.size,
                      NULL);
         gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tool->size_spin), 0);
+        gwy_adjust_bar_set_snap_to_ticks(GWY_ADJUST_BAR(adjbar), TRUE);
     }
 }
 
diff --git a/modules/tools/grainmeasure.c b/modules/tools/grainmeasure.c
index 7bf37f9..4d118a9 100644
--- a/modules/tools/grainmeasure.c
+++ b/modules/tools/grainmeasure.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: grainmeasure.c 19039 2016-10-08 10:54:58Z yeti-dn $
+ *  @(#) $Id: grainmeasure.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2007 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -99,7 +99,7 @@ static GwyModuleInfo module_info = {
 
 static const gchar expanded_key[] = "/module/grainmeasure/expanded";
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, grainmeasure)
 
 G_DEFINE_TYPE(GwyToolGrainMeasure, gwy_tool_grain_measure, GWY_TYPE_PLAIN_TOOL)
 
diff --git a/modules/tools/grainremover.c b/modules/tools/grainremover.c
index baaf39a..6637cf9 100644
--- a/modules/tools/grainremover.c
+++ b/modules/tools/grainremover.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: grainremover.c 16437 2014-07-24 20:38:55Z yeti-dn $
+ *  @(#) $Id: grainremover.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -120,7 +120,7 @@ static const ToolArgs default_args = {
     GRAIN_REMOVE_LAPLACE,
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, grainremover)
 
 G_DEFINE_TYPE(GwyToolGrainRemover, gwy_tool_grain_remover, GWY_TYPE_PLAIN_TOOL)
 
diff --git a/modules/tools/icolorange.c b/modules/tools/icolorange.c
index c8b3a9b..ffcf2f2 100644
--- a/modules/tools/icolorange.c
+++ b/modules/tools/icolorange.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: icolorange.c 19039 2016-10-08 10:54:58Z yeti-dn $
+ *  @(#) $Id: icolorange.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -134,7 +134,7 @@ static GwyModuleInfo module_info = {
     "2004",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, icolorange)
 
 G_DEFINE_TYPE(GwyToolColorRange, gwy_tool_color_range, GWY_TYPE_PLAIN_TOOL)
 
diff --git a/modules/tools/level3.c b/modules/tools/level3.c
index 2d90dc1..d9a28bc 100644
--- a/modules/tools/level3.c
+++ b/modules/tools/level3.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: level3.c 19039 2016-10-08 10:54:58Z yeti-dn $
+ *  @(#) $Id: level3.c 20103 2017-07-29 04:31:07Z yeti-dn $
  *  Copyright (C) 2003-2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -35,6 +35,8 @@
 #define GWY_IS_TOOL_LEVEL3(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), GWY_TYPE_TOOL_LEVEL3))
 #define GWY_TOOL_LEVEL3_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), GWY_TYPE_TOOL_LEVEL3, GwyToolLevel3Class))
 
+enum { RADIUS_MAX = 32 };
+
 enum {
     COLUMN_I, COLUMN_X, COLUMN_Y, COLUMN_Z, NCOLUMNS
 };
@@ -106,7 +108,7 @@ static GwyModuleInfo module_info = {
     N_("Three-point level tool, levels data by subtracting a plane fitted "
        "through three selected points."),
     "Yeti <yeti at gwyddion.net>",
-    "2.7",
+    "2.8",
     "David Nečas (Yeti) & Petr Klapetek",
     "2003",
 };
@@ -118,7 +120,7 @@ static const ToolArgs default_args = {
     FALSE,
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, level3)
 
 G_DEFINE_TYPE(GwyToolLevel3, gwy_tool_level3, GWY_TYPE_PLAIN_TOOL)
 
@@ -205,6 +207,7 @@ gwy_tool_level3_init_dialog(GwyToolLevel3 *tool)
     GtkWidget *label, *table;
     GwyNullStore *store;
     guint i;
+    gint row;
 
     dialog = GTK_DIALOG(GWY_TOOL(tool)->dialog);
 
@@ -234,31 +237,35 @@ gwy_tool_level3_init_dialog(GwyToolLevel3 *tool)
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
     gtk_box_pack_start(GTK_BOX(dialog->vbox), table, TRUE, TRUE, 0);
+    row = 0;
 
-    tool->radius = gtk_adjustment_new(tool->args.radius, 1, 16, 1, 5, 0);
-    gwy_table_attach_spinbutton(table, 1, _("_Averaging radius:"), "px",
-                                tool->radius);
+    tool->radius = gtk_adjustment_new(tool->args.radius, 1, RADIUS_MAX, 1, 5,
+                                      0);
+    gwy_table_attach_adjbar(table, row, _("_Averaging radius:"), _("px"),
+                            tool->radius, GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(tool->radius, "value-changed",
                              G_CALLBACK(gwy_tool_level3_radius_changed), tool);
-    gtk_table_set_row_spacing(GTK_TABLE(table), 1, 8);
+    row++;
 
     tool->instant_apply
             = gtk_check_button_new_with_mnemonic(_("_Instant apply"));
-    gtk_table_attach(GTK_TABLE(table), tool->instant_apply, 0, 3, 2, 3,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), tool->instant_apply, 0, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tool->instant_apply),
                                  tool->args.instant_apply);
     g_signal_connect(tool->instant_apply, "toggled",
                      G_CALLBACK(gwy_tool_level3_instant_apply_changed), tool);
+    row++;
 
     tool->set_zero
             = gtk_check_button_new_with_mnemonic(_("Set plane to _zero"));
-    gtk_table_attach(GTK_TABLE(table), tool->set_zero, 0, 3, 3, 4,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), tool->set_zero, 0, 2, row, row+1,
+                     GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tool->set_zero),
                                  tool->args.set_zero);
     g_signal_connect(tool->set_zero, "toggled",
                      G_CALLBACK(gwy_tool_level3_set_zero_changed), tool);
+    row++;
 
     gwy_plain_tool_add_clear_button(GWY_PLAIN_TOOL(tool));
     gwy_tool_add_hide_button(GWY_TOOL(tool), FALSE);
diff --git a/modules/tools/linestats.c b/modules/tools/linestats.c
index fe68b0a..89eda12 100644
--- a/modules/tools/linestats.c
+++ b/modules/tools/linestats.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: linestats.c 19039 2016-10-08 10:54:58Z yeti-dn $
+ *  @(#) $Id: linestats.c 20102 2017-07-29 04:29:28Z yeti-dn $
  *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -179,7 +179,7 @@ static const GwyEnum sf_types[] =  {
     { N_("Kurtosis"),           GWY_LINE_STAT_KURTOSIS,  },
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, linestats)
 
 G_DEFINE_TYPE(GwyToolLineStats, gwy_tool_line_stats, GWY_TYPE_PLAIN_TOOL)
 
@@ -332,7 +332,7 @@ gwy_tool_line_stats_init_dialog(GwyToolLineStats *tool)
     /* Output type */
     hbox2 = gtk_hbox_new(FALSE, 8);
     gtk_container_set_border_width(GTK_CONTAINER(hbox2), 4);
-    gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0);
+    gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, TRUE, 0);
 
     label = gtk_label_new_with_mnemonic(_("_Quantity:"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
@@ -344,7 +344,7 @@ gwy_tool_line_stats_init_dialog(GwyToolLineStats *tool)
                             tool,
                             tool->args.output_type, TRUE);
     gtk_label_set_mnemonic_widget(GTK_LABEL(label), tool->output_type);
-    gtk_box_pack_start(GTK_BOX(hbox2), tool->output_type, FALSE, FALSE, 0);
+    gtk_box_pack_end(GTK_BOX(hbox2), tool->output_type, FALSE, FALSE, 0);
 
     /* Average */
     hbox2 = gtk_hbox_new(FALSE, 8);
diff --git a/modules/tools/maskedit.c b/modules/tools/maskedit.c
index 8cc087d..3afab6d 100644
--- a/modules/tools/maskedit.c
+++ b/modules/tools/maskedit.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: maskedit.c 19071 2016-10-14 09:02:41Z yeti-dn $
- *  Copyright (C) 2003-2006 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: maskedit.c 19987 2017-06-26 11:50:55Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -170,7 +170,7 @@ static GwyModuleInfo module_info = {
     N_("Mask editor tool, allows interactive modification of parts "
        "of the mask."),
     "Yeti <yeti at gwyddion.net>",
-    "3.8",
+    "3.11",
     "David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
@@ -203,7 +203,7 @@ static const ToolArgs default_args = {
     FALSE,
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, maskedit)
 
 G_DEFINE_TYPE(GwyToolMaskEditor, gwy_tool_mask_editor, GWY_TYPE_PLAIN_TOOL)
 
@@ -322,7 +322,7 @@ gwy_tool_mask_editor_init_dialog(GwyToolMaskEditor *tool)
     const modes[] = {
         {
             MASK_EDIT_SET,
-            GWY_STOCK_MASK,
+            GWY_STOCK_MASK_SET,
             N_("Set mask to selection"),
         },
         {
@@ -382,7 +382,7 @@ gwy_tool_mask_editor_init_dialog(GwyToolMaskEditor *tool)
     };
 
     GtkRadioButton *group;
-    GtkSizeGroup *sizegroup;
+    GtkSizeGroup *sizegroup, *labelsize;
     GtkTooltips *tips;
     GtkDialog *dialog;
     GtkTable *table;
@@ -394,9 +394,10 @@ gwy_tool_mask_editor_init_dialog(GwyToolMaskEditor *tool)
     dialog = GTK_DIALOG(GWY_TOOL(tool)->dialog);
     tips = gwy_app_get_tooltips();
     sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_BOTH);
+    labelsize = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
     tool->sensgroup = gwy_sensitivity_group_new();
 
-    table = GTK_TABLE(gtk_table_new(15, 4, FALSE));
+    table = GTK_TABLE(gtk_table_new(15, 3, FALSE));
     gtk_table_set_col_spacings(table, 6);
     gtk_table_set_row_spacings(table, 2);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -413,20 +414,21 @@ gwy_tool_mask_editor_init_dialog(GwyToolMaskEditor *tool)
     button = gtk_radio_button_new_with_mnemonic(NULL, _("_Shapes"));
     tool->style = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
     gwy_radio_button_set_value(button, MASK_EDIT_STYLE_SHAPES);
-    gtk_table_attach(table, button, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, button, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(button, "clicked",
                              G_CALLBACK(gwy_tool_mask_editor_style_changed),
                              tool);
     row++;
 
     /* Mode */
-    label = gtk_label_new(_("Mode:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
     hbox = GTK_BOX(gtk_hbox_new(FALSE, 0));
     gtk_table_attach(table, GTK_WIDGET(hbox),
-                     1, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+
+    label = gtk_label_new(_("Mode:"));
+    gtk_size_group_add_widget(labelsize, label);
+    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+    gtk_box_pack_start(hbox, label, FALSE, TRUE, 4);
 
     group = NULL;
     for (i = 0; i < G_N_ELEMENTS(modes); i++) {
@@ -449,13 +451,14 @@ gwy_tool_mask_editor_init_dialog(GwyToolMaskEditor *tool)
     row++;
 
     /* Shape */
-    label = gtk_label_new(_("Shape:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
     hbox = GTK_BOX(gtk_hbox_new(FALSE, 0));
     gtk_table_attach(table, GTK_WIDGET(hbox),
-                     1, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+
+    label = gtk_label_new(_("Shape:"));
+    gtk_size_group_add_widget(labelsize, label);
+    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+    gtk_box_pack_start(hbox, label, FALSE, TRUE, 4);
 
     group = NULL;
     for (i = 0; i < G_N_ELEMENTS(shapes); i++) {
@@ -483,20 +486,21 @@ gwy_tool_mask_editor_init_dialog(GwyToolMaskEditor *tool)
                                                 _("_Drawing Tools"));
     tool->style = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
     gwy_radio_button_set_value(button, MASK_EDIT_STYLE_DRAWING);
-    gtk_table_attach(table, button, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, button, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(button, "clicked",
                              G_CALLBACK(gwy_tool_mask_editor_style_changed),
                              tool);
     row++;
 
     /* Tool */
-    label = gtk_label_new(_("Tool:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
     hbox = GTK_BOX(gtk_hbox_new(FALSE, 0));
     gtk_table_attach(table, GTK_WIDGET(hbox),
-                     1, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+
+    label = gtk_label_new(_("Tool:"));
+    gtk_size_group_add_widget(labelsize, label);
+    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+    gtk_box_pack_start(hbox, label, FALSE, TRUE, 4);
 
     group = NULL;
     for (i = 0; i < G_N_ELEMENTS(tools); i++) {
@@ -521,8 +525,10 @@ gwy_tool_mask_editor_init_dialog(GwyToolMaskEditor *tool)
     /* Radius */
     tool->radius = gtk_adjustment_new(tool->args.radius, 1.0, 15.0,
                                       1.0, 1.0, 0.0);
-    gwy_table_attach_hscale(GTK_WIDGET(table), row, _("_Radius:"), "px",
-                            tool->radius, 0);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row, _("_Radius:"), _("px"),
+                            tool->radius, GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
+    gtk_size_group_add_widget(labelsize,
+                              gwy_table_hscale_get_label(tool->radius));
     g_signal_connect(tool->radius, "value-changed",
                      G_CALLBACK(gwy_tool_mask_editor_radius_changed), tool);
     row++;
@@ -535,7 +541,7 @@ gwy_tool_mask_editor_init_dialog(GwyToolMaskEditor *tool)
 
     hbox = GTK_BOX(gtk_hbox_new(FALSE, 0));
     gtk_table_attach(table, GTK_WIDGET(hbox),
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
 
     button = gwy_stock_like_button_new(_("_Invert"), GWY_STOCK_MASK_INVERT);
     gtk_size_group_add_widget(sizegroup, button);
@@ -566,7 +572,7 @@ gwy_tool_mask_editor_init_dialog(GwyToolMaskEditor *tool)
 
     hbox = GTK_BOX(gtk_hbox_new(FALSE, 0));
     gtk_table_attach(table, GTK_WIDGET(hbox),
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
 
     button = gtk_button_new_with_mnemonic(_("Fill _Voids"));
     gtk_size_group_add_widget(sizegroup, button);
@@ -589,13 +595,13 @@ gwy_tool_mask_editor_init_dialog(GwyToolMaskEditor *tool)
 
     /* Grow/Shrink */
     label = gwy_label_new_header(_("Grow/Shrink"));
-    gtk_table_attach(table, label, 0, 4, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, label, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     /* Buttons */
     hbox = GTK_BOX(gtk_hbox_new(FALSE, 0));
     gtk_table_attach(table, GTK_WIDGET(hbox),
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
 
     button = gwy_stock_like_button_new(_("_Grow"), GWY_STOCK_MASK_GROW);
     gtk_size_group_add_widget(sizegroup, button);
@@ -620,8 +626,8 @@ gwy_tool_mask_editor_init_dialog(GwyToolMaskEditor *tool)
     /* Options */
     tool->gsamount = gtk_adjustment_new(tool->args.gsamount, 1.0, 256.0,
                                         1.0, 10.0, 0.0);
-    gwy_table_attach_hscale(GTK_WIDGET(table), row, _("_Amount:"), "px",
-                            tool->gsamount, 0);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row, _("_Amount:"), _("px"),
+                            tool->gsamount, GWY_HSCALE_SQRT | GWY_HSCALE_SNAP);
     g_signal_connect(tool->gsamount, "value-changed",
                      G_CALLBACK(gwy_tool_mask_editor_gsamount_changed), tool);
     row++;
@@ -630,10 +636,10 @@ gwy_tool_mask_editor_init_dialog(GwyToolMaskEditor *tool)
                            (gwy_distance_transform_type_get_enum(), -1,
                             G_CALLBACK(gwy_tool_mask_editor_dist_type_changed),
                             tool, tool->args.dist_type, TRUE);
-    gwy_table_attach_hscale(GTK_WIDGET(table), row++,
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row++,
                             _("_Distance type:"), NULL,
                             GTK_OBJECT(tool->dist_type),
-                            GWY_HSCALE_WIDGET);
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     tool->from_border
@@ -641,7 +647,7 @@ gwy_tool_mask_editor_init_dialog(GwyToolMaskEditor *tool)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tool->from_border),
                                  tool->args.from_border);
     gtk_table_attach(table, tool->from_border,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(tool->from_border, "toggled",
                      G_CALLBACK(gwy_tool_mask_editor_from_border_changed),
                      tool);
@@ -653,7 +659,7 @@ gwy_tool_mask_editor_init_dialog(GwyToolMaskEditor *tool)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tool->prevent_merge),
                                  tool->args.prevent_merge);
     gtk_table_attach(table, tool->prevent_merge,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(tool->prevent_merge, "toggled",
                      G_CALLBACK(gwy_tool_mask_editor_prevent_merge_changed),
                      tool);
@@ -664,6 +670,7 @@ gwy_tool_mask_editor_init_dialog(GwyToolMaskEditor *tool)
     gwy_radio_buttons_set_current(tool->style, style);
 
     g_object_unref(sizegroup);
+    g_object_unref(labelsize);
     g_object_unref(tool->sensgroup);
     gtk_widget_show_all(dialog->vbox);
 }
@@ -1128,7 +1135,8 @@ gwy_tool_mask_editor_selection_finished(GwyPlainTool *plain_tool)
             return;
         }
         gwy_tool_mask_editor_bucket_fill(tool, isel[0], isel[1]);
-        gwy_data_field_data_changed(plain_tool->mask_field);
+        if (plain_tool->mask_field)
+            gwy_data_field_data_changed(plain_tool->mask_field);
         return;
     }
 
@@ -1330,6 +1338,11 @@ gwy_data_field_paint_wide_line(GwyDataField *dfield,
 {
     gint i, q;
 
+    if (!width && !height) {
+        gwy_data_field_circular_area_fill(dfield, col, row, radius, value);
+        return;
+    }
+
     if (ABS(height) >= width) {
         q = width/2;
         if (height > 0) {
@@ -1417,8 +1430,8 @@ gwy_tool_mask_editor_selection_changed(GwyPlainTool *plain_tool,
                 GWY_SWAP(gdouble, xy[0], xy[2]);
                 GWY_SWAP(gdouble, xy[1], xy[3]);
             }
-            xy[2] -= xy[0] - 1;
-            xy[3] -= xy[1] - 1;
+            xy[2] -= xy[0];
+            xy[3] -= xy[1];
             gwy_data_field_paint_wide_line(mfield, xy[0], xy[1], xy[2], xy[3],
                                            r, fillvalue);
         }
diff --git a/modules/tools/pathlevel.c b/modules/tools/pathlevel.c
index b3c8b89..e9f96ca 100644
--- a/modules/tools/pathlevel.c
+++ b/modules/tools/pathlevel.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: pathlevel.c 19039 2016-10-08 10:54:58Z yeti-dn $
+ *  @(#) $Id: pathlevel.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2007 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -110,7 +110,7 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Path level tool, performs row leveling along on user-set lines."),
     "Yeti <yeti at gwyddion.net>",
-    "1.8",
+    "1.9",
     "David Nečas (Yeti)",
     "2007",
 };
@@ -119,7 +119,7 @@ static const ToolArgs default_args = {
     1,
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, pathlevel)
 
 G_DEFINE_TYPE(GwyToolPathLevel, gwy_tool_path_level, GWY_TYPE_PLAIN_TOOL)
 
@@ -243,7 +243,7 @@ gwy_tool_path_level_init_dialog(GwyToolPathLevel *tool)
     gtk_container_add(GTK_CONTAINER(scwin), GTK_WIDGET(tool->treeview));
     gtk_box_pack_start(GTK_BOX(dialog->vbox), scwin, TRUE, TRUE, 0);
 
-    table = GTK_TABLE(gtk_table_new(1, 4, FALSE));
+    table = GTK_TABLE(gtk_table_new(1, 3, FALSE));
     gtk_table_set_col_spacings(table, 6);
     gtk_table_set_row_spacings(table, 2);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -253,8 +253,8 @@ gwy_tool_path_level_init_dialog(GwyToolPathLevel *tool)
 
     tool->thickness = gtk_adjustment_new(tool->args.thickness,
                                          1, MAX_THICKNESS, 1, 10, 0);
-    gwy_table_attach_hscale(GTK_WIDGET(table), row, _("_Thickness:"), "px",
-                            tool->thickness, GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row, _("_Thickness:"), _("px"),
+                            tool->thickness, GWY_HSCALE_SQRT | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(tool->thickness, "value-changed",
                              G_CALLBACK(gwy_tool_path_level_thickness_changed),
                              tool);
diff --git a/modules/tools/profile.c b/modules/tools/profile.c
index 21b3849..9598217 100644
--- a/modules/tools/profile.c
+++ b/modules/tools/profile.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: profile.c 19044 2016-10-08 19:10:46Z yeti-dn $
- *  Copyright (C) 2003-2015 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: profile.c 20072 2017-07-12 09:51:51Z yeti-dn $
+ *  Copyright (C) 2003-2017 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -37,6 +37,8 @@
 #include <app/gwymoduleutils.h>
 #include <app/gwyapp.h>
 
+#include <libgwymodule/gwymodule-file.h>
+
 #define GWY_TYPE_TOOL_PROFILE            (gwy_tool_profile_get_type())
 #define GWY_TOOL_PROFILE(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), GWY_TYPE_TOOL_PROFILE, GwyToolProfile))
 #define GWY_IS_TOOL_PROFILE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), GWY_TYPE_TOOL_PROFILE))
@@ -52,6 +54,11 @@ typedef enum {
     GWY_CC_DISPLAY_Z_UNC = 6,
 } GwyCCDisplayType;
 
+typedef enum {
+    PROFILE_MODE_LINEAR = 0,
+    PROFILE_MODE_RADIAL = 1,
+} ProfileMode;
+
 enum {
     NLINES = 1024,
     MAX_THICKNESS = 128,
@@ -76,7 +83,7 @@ typedef struct {
     gboolean separate;
     gboolean both;
     gboolean number_lines;
-    gboolean radial_profiles;
+    ProfileMode mode;
     GwyAppDataId target;
 } ToolArgs;
 
@@ -94,16 +101,13 @@ struct _GwyToolProfile {
     GdkPixbuf *colorpixbuf;
 
     GtkWidget *options;
-    GtkWidget *radial_profiles;
-    GtkWidget *symm_hbox;
-    GtkWidget *symmetrize;
-    GtkWidget *symmetrize_all;
+    GtkWidget *mode;
+    GtkWidget *improve;
+    GtkWidget *improve_all;
     GtkObject *thickness;
     GtkObject *resolution;
     GtkWidget *fixres;
-    GtkWidget *interp_hbox;
     GtkWidget *interpolation;
-    GtkWidget *interpolation_label;
     GtkWidget *number_lines;
     GtkWidget *separate;
     GtkWidget *apply;
@@ -111,7 +115,6 @@ struct _GwyToolProfile {
     GtkWidget *callabel;
     GtkWidget *both;
     GtkWidget *target_graph;
-    GtkWidget *target_hbox;
     GSList *masking;
 
     GwyDataField *xerr;
@@ -143,85 +146,76 @@ struct _GwyToolProfileClass {
 
 static gboolean module_register(void);
 
-static GType      gwy_tool_profile_get_type               (void)                                G_GNUC_CONST;
-static void       gwy_tool_profile_finalize               (GObject *object);
-static void       gwy_tool_profile_init_dialog            (GwyToolProfile *tool);
-static void       gwy_tool_profile_data_switched          (GwyTool *gwytool,
-                                                           GwyDataView *data_view);
-static void       gwy_tool_profile_response               (GwyTool *tool,
-                                                           gint response_id);
-static void       gwy_tool_profile_data_changed           (GwyPlainTool *plain_tool);
-static void       gwy_tool_profile_selection_changed      (GwyPlainTool *plain_tool,
-                                                           gint hint);
-static void       gwy_tool_profile_update_symm_sensitivty (GwyToolProfile *tool);
-static void       gwy_tool_profile_update_curve           (GwyToolProfile *tool,
-                                                           gint i);
-static void       gwy_tool_profile_update_all_curves      (GwyToolProfile *tool);
-static void       gwy_tool_profile_symmetrize_all         (GwyToolProfile *tool);
-static void       gwy_tool_profile_symmetrize             (GwyToolProfile *tool);
-static void       gwy_tool_profile_symmetrize_profile     (GwyToolProfile *tool,
-                                                           gint id);
-static gint       get_profile_with_masking                (GwyDataField *dfield,
-                                                           gdouble **xdata,
-                                                           gdouble **ydata,
-                                                           GwyDataField *mask,
-                                                           GwyMaskingType masking,
-                                                           gdouble xfrom,
-                                                           gdouble yfrom,
-                                                           gdouble xto,
-                                                           gdouble yto,
-                                                           gint res,
-                                                           gint thickness,
-                                                           GwyInterpolationType interpolation);
-static void       gwy_tool_profile_render_cell            (GtkCellLayout *layout,
-                                                           GtkCellRenderer *renderer,
-                                                           GtkTreeModel *model,
-                                                           GtkTreeIter *iter,
-                                                           gpointer user_data);
-static void       gwy_tool_profile_render_color           (GtkCellLayout *layout,
-                                                           GtkCellRenderer *renderer,
-                                                           GtkTreeModel *model,
-                                                           GtkTreeIter *iter,
-                                                           gpointer user_data);
-static void       gwy_tool_profile_options_expanded       (GtkExpander *expander,
-                                                           GParamSpec *pspec,
-                                                           GwyToolProfile *tool);
-static void       gwy_tool_profile_thickness_changed      (GwyToolProfile *tool,
-                                                           GtkAdjustment *adj);
-static void       gwy_tool_profile_resolution_changed     (GwyToolProfile *tool,
-                                                           GtkAdjustment *adj);
-static void       gwy_tool_profile_fixres_changed         (GtkToggleButton *check,
-                                                           GwyToolProfile *tool);
-static void       gwy_tool_profile_number_lines_changed   (GtkToggleButton *check,
-                                                           GwyToolProfile *tool);
-static void       gwy_tool_profile_radial_profiles_changed(GtkToggleButton *check,
-                                                           GwyToolProfile *tool);
-static void       gwy_tool_profile_separate_changed       (GtkToggleButton *check,
-                                                           GwyToolProfile *tool);
-static void       gwy_tool_profile_both_changed           (GtkToggleButton *check,
-                                                           GwyToolProfile *tool);
-static void       gwy_tool_profile_interpolation_changed  (GtkComboBox *combo,
-                                                           GwyToolProfile *tool);
-static void       gwy_tool_profile_update_target_graphs   (GwyToolProfile *tool);
-static gboolean   filter_target_graphs                    (GwyContainer *data,
-                                                           gint id,
-                                                           gpointer user_data);
-static void       gwy_tool_profile_target_changed         (GwyToolProfile *tool);
-static void       gwy_tool_profile_masking_changed        (GtkWidget *button,
-                                                           GwyToolProfile *tool);
-static void       gwy_tool_profile_apply                  (GwyToolProfile *tool);
-static GtkWidget* menu_display                            (GCallback callback,
-                                                           gpointer cbdata,
-                                                           GwyCCDisplayType current);
-static void       display_changed                         (GtkComboBox *combo,
-                                                           GwyToolProfile *tool);
+static GType      gwy_tool_profile_get_type              (void)                      G_GNUC_CONST;
+static void       gwy_tool_profile_finalize              (GObject *object);
+static void       gwy_tool_profile_init_dialog           (GwyToolProfile *tool);
+static void       gwy_tool_profile_data_switched         (GwyTool *gwytool,
+                                                          GwyDataView *data_view);
+static void       gwy_tool_profile_response              (GwyTool *tool,
+                                                          gint response_id);
+static void       gwy_tool_profile_data_changed          (GwyPlainTool *plain_tool);
+static void       gwy_tool_profile_selection_changed     (GwyPlainTool *plain_tool,
+                                                          gint hint);
+static void       gwy_tool_profile_update_symm_sensitivty(GwyToolProfile *tool);
+static void       gwy_tool_profile_update_curve          (GwyToolProfile *tool,
+                                                          gint i);
+static void       gwy_tool_profile_update_all_curves     (GwyToolProfile *tool);
+static void       gwy_tool_profile_improve_all           (GwyToolProfile *tool);
+static void       gwy_tool_profile_improve               (GwyToolProfile *tool);
+static void       gwy_tool_profile_symmetrize_profile    (GwyToolProfile *tool,
+                                                          gint id);
+static void       gwy_tool_profile_straighten_profile    (GwyToolProfile *tool,
+                                                          gint id);
+static void       gwy_tool_profile_render_cell           (GtkCellLayout *layout,
+                                                          GtkCellRenderer *renderer,
+                                                          GtkTreeModel *model,
+                                                          GtkTreeIter *iter,
+                                                          gpointer user_data);
+static void       gwy_tool_profile_render_color          (GtkCellLayout *layout,
+                                                          GtkCellRenderer *renderer,
+                                                          GtkTreeModel *model,
+                                                          GtkTreeIter *iter,
+                                                          gpointer user_data);
+static void       gwy_tool_profile_options_expanded      (GtkExpander *expander,
+                                                          GParamSpec *pspec,
+                                                          GwyToolProfile *tool);
+static void       gwy_tool_profile_thickness_changed     (GwyToolProfile *tool,
+                                                          GtkAdjustment *adj);
+static void       gwy_tool_profile_resolution_changed    (GwyToolProfile *tool,
+                                                          GtkAdjustment *adj);
+static void       gwy_tool_profile_fixres_changed        (GtkToggleButton *check,
+                                                          GwyToolProfile *tool);
+static void       gwy_tool_profile_number_lines_changed  (GtkToggleButton *check,
+                                                          GwyToolProfile *tool);
+static void       gwy_tool_profile_mode_changed          (GtkComboBox *combo,
+                                                          GwyToolProfile *tool);
+static void       gwy_tool_profile_update_mode           (GwyToolProfile *tool);
+static void       gwy_tool_profile_separate_changed      (GtkToggleButton *check,
+                                                          GwyToolProfile *tool);
+static void       gwy_tool_profile_both_changed          (GtkToggleButton *check,
+                                                          GwyToolProfile *tool);
+static void       gwy_tool_profile_interpolation_changed (GtkComboBox *combo,
+                                                          GwyToolProfile *tool);
+static void       gwy_tool_profile_update_target_graphs  (GwyToolProfile *tool);
+static gboolean   filter_target_graphs                   (GwyContainer *data,
+                                                          gint id,
+                                                          gpointer user_data);
+static void       gwy_tool_profile_target_changed        (GwyToolProfile *tool);
+static void       gwy_tool_profile_masking_changed       (GtkWidget *button,
+                                                          GwyToolProfile *tool);
+static void       gwy_tool_profile_apply                 (GwyToolProfile *tool);
+static GtkWidget* menu_display                           (GCallback callback,
+                                                          gpointer cbdata,
+                                                          GwyCCDisplayType current);
+static void       display_changed                        (GtkComboBox *combo,
+                                                          GwyToolProfile *tool);
 
 static GwyModuleInfo module_info = {
     GWY_MODULE_ABI_VERSION,
     &module_register,
     N_("Profile tool, creates profile graphs from selected lines."),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "3.4",
+    "4.0",
     "David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
@@ -251,7 +245,7 @@ static const ToolArgs default_args = {
     GWY_APP_DATA_ID_NONE,
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, profile)
 
 G_DEFINE_TYPE(GwyToolProfile, gwy_tool_profile, GWY_TYPE_PLAIN_TOOL)
 
@@ -313,7 +307,7 @@ gwy_tool_profile_finalize(GObject *object)
     gwy_container_set_boolean_by_name(settings, number_lines_key,
                                       tool->args.number_lines);
     gwy_container_set_boolean_by_name(settings, radial_profiles_key,
-                                      tool->args.radial_profiles);
+                                      tool->args.mode == PROFILE_MODE_RADIAL);
 
     GWY_OBJECT_UNREF(tool->line);
     if (tool->model) {
@@ -334,6 +328,7 @@ gwy_tool_profile_init(GwyToolProfile *tool)
     GwyPlainTool *plain_tool;
     GwyContainer *settings;
     gint width, height;
+    gboolean is_rprof;
 
     plain_tool = GWY_PLAIN_TOOL(tool);
     tool->layer_type_line = gwy_plain_tool_check_layer_type(plain_tool,
@@ -346,6 +341,7 @@ gwy_tool_profile_init(GwyToolProfile *tool)
 
     settings = gwy_app_settings_get();
     tool->args = default_args;
+    is_rprof = (tool->args.mode == PROFILE_MODE_RADIAL);
     gwy_container_gis_boolean_by_name(settings, options_visible_key,
                                       &tool->args.options_visible);
     gwy_container_gis_int32_by_name(settings, thickness_key,
@@ -370,15 +366,15 @@ gwy_tool_profile_init(GwyToolProfile *tool)
                                       &tool->args.both);
     gwy_container_gis_boolean_by_name(settings, number_lines_key,
                                       &tool->args.number_lines);
-    gwy_container_gis_boolean_by_name(settings, radial_profiles_key,
-                                      &tool->args.radial_profiles);
+    gwy_container_gis_boolean_by_name(settings, radial_profiles_key, &is_rprof);
+    tool->args.mode = (is_rprof ? PROFILE_MODE_RADIAL : PROFILE_MODE_LINEAR);
 
     gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &width, &height);
     height |= 1;
     tool->colorpixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8,
                                        height, height);
 
-    tool->pixel_format = gwy_si_unit_value_format_new(1.0, 0, "px");
+    tool->pixel_format = gwy_si_unit_value_format_new(1.0, 0, _("px"));
     gwy_plain_tool_connect_selection(plain_tool, tool->layer_type_line,
                                      "line");
 
@@ -469,43 +465,43 @@ gwy_tool_profile_init_dialog(GwyToolProfile *tool)
                      G_CALLBACK(gwy_tool_profile_options_expanded), tool);
     gtk_box_pack_start(GTK_BOX(vbox), tool->options, FALSE, FALSE, 0);
 
-    table = GTK_TABLE(gtk_table_new(11, 4, FALSE));
+    table = GTK_TABLE(gtk_table_new(11, 3, FALSE));
     gtk_table_set_col_spacings(table, 6);
     gtk_table_set_row_spacings(table, 2);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
     gtk_container_add(GTK_CONTAINER(tool->options), GTK_WIDGET(table));
     row = 0;
 
-    tool->radial_profiles
-        = gtk_check_button_new_with_mnemonic(_("_Radial profiles"));
-    gtk_table_attach(table, tool->radial_profiles,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tool->radial_profiles),
-                                 tool->args.radial_profiles);
-    g_signal_connect(tool->radial_profiles, "toggled",
-                     G_CALLBACK(gwy_tool_profile_radial_profiles_changed),
-                     tool);
+    tool->mode = gwy_enum_combo_box_newl(G_CALLBACK(gwy_tool_profile_mode_changed),
+                                         tool,
+                                         tool->args.mode,
+                                         _("Linear profiles"),
+                                         PROFILE_MODE_LINEAR,
+                                         _("Radial profiles"),
+                                         PROFILE_MODE_RADIAL,
+                                         NULL);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row, _("_Mode:"), NULL,
+                            GTK_OBJECT(tool->mode),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
-    hbox2 = tool->symm_hbox = gtk_hbox_new(FALSE, 6);
-    gtk_table_attach(table, hbox2,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    tool->symmetrize_all = gtk_button_new_with_mnemonic(_("Symmetrize _All"));
-    gtk_box_pack_end(GTK_BOX(hbox2), tool->symmetrize_all, FALSE, FALSE, 0);
-    g_signal_connect_swapped(tool->symmetrize_all, "clicked",
-                             G_CALLBACK(gwy_tool_profile_symmetrize_all),
-                             tool);
-    tool->symmetrize = gtk_button_new_with_mnemonic(_("S_ymmetrize"));
-    gtk_box_pack_end(GTK_BOX(hbox2), tool->symmetrize, FALSE, FALSE, 0);
-    g_signal_connect_swapped(tool->symmetrize, "clicked",
-                             G_CALLBACK(gwy_tool_profile_symmetrize),
-                             tool);
+    gtk_table_set_row_spacing(table, row-1, 8);
+    hbox2 = gtk_hbox_new(FALSE, 2);
+    gtk_table_attach(table, hbox2, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    tool->improve_all = gtk_button_new_with_label("");
+    gtk_box_pack_end(GTK_BOX(hbox2), tool->improve_all, FALSE, FALSE, 0);
+    g_signal_connect_swapped(tool->improve_all, "clicked",
+                             G_CALLBACK(gwy_tool_profile_improve_all), tool);
+    tool->improve = gtk_button_new_with_label("");
+    gtk_box_pack_end(GTK_BOX(hbox2), tool->improve, FALSE, FALSE, 0);
+    g_signal_connect_swapped(tool->improve, "clicked",
+                             G_CALLBACK(gwy_tool_profile_improve), tool);
     row++;
 
     tool->thickness = gtk_adjustment_new(tool->args.thickness,
                                          1, MAX_THICKNESS, 1, 10, 0);
-    gwy_table_attach_hscale(GTK_WIDGET(table), row, _("_Thickness:"), "px",
-                            tool->thickness, GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row, _("_Thickness:"), _("px"),
+                            tool->thickness, GWY_HSCALE_SQRT | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(tool->thickness, "value-changed",
                              G_CALLBACK(gwy_tool_profile_thickness_changed),
                              tool);
@@ -514,9 +510,9 @@ gwy_tool_profile_init_dialog(GwyToolProfile *tool)
     tool->resolution = gtk_adjustment_new(tool->args.resolution,
                                           MIN_RESOLUTION, MAX_RESOLUTION,
                                           1, 10, 0);
-    gwy_table_attach_hscale(GTK_WIDGET(table), row, _("_Fix res.:"), NULL,
-                            tool->resolution,
-                            GWY_HSCALE_CHECK | GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row,
+                            _("_Fixed resolution:"), NULL,
+                            tool->resolution, GWY_HSCALE_CHECK);
     g_signal_connect_swapped(tool->resolution, "value-changed",
                              G_CALLBACK(gwy_tool_profile_resolution_changed),
                              tool);
@@ -525,13 +521,12 @@ gwy_tool_profile_init_dialog(GwyToolProfile *tool)
                                  tool->args.fixres);
     g_signal_connect(tool->fixres, "toggled",
                      G_CALLBACK(gwy_tool_profile_fixres_changed), tool);
-    gwy_table_hscale_set_sensitive(tool->resolution, tool->args.fixres);
     row++;
 
     tool->number_lines
         = gtk_check_button_new_with_mnemonic(_("_Number lines"));
     gtk_table_attach(table, tool->number_lines,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tool->number_lines),
                                  tool->args.number_lines);
     g_signal_connect(tool->number_lines, "toggled",
@@ -541,47 +536,33 @@ gwy_tool_profile_init_dialog(GwyToolProfile *tool)
     tool->separate
         = gtk_check_button_new_with_mnemonic(_("_Separate profiles"));
     gtk_table_attach(table, tool->separate,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tool->separate),
                                  tool->args.separate);
     g_signal_connect(tool->separate, "toggled",
                      G_CALLBACK(gwy_tool_profile_separate_changed), tool);
     row++;
 
-    hbox2 = tool->interp_hbox = gtk_hbox_new(FALSE, 6);
-    gtk_table_attach(table, hbox2,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    label = gtk_label_new_with_mnemonic(_("_Interpolation type:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
-    tool->interpolation_label = label;
-
     tool->interpolation = gwy_enum_combo_box_new
                             (gwy_interpolation_type_get_enum(), -1,
                              G_CALLBACK(gwy_tool_profile_interpolation_changed),
                              tool,
                              tool->args.interpolation, TRUE);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), tool->interpolation);
-    gtk_box_pack_end(GTK_BOX(hbox2), tool->interpolation, FALSE, FALSE, 0);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row,
+                            _("_Interpolation type:"), NULL,
+                            GTK_OBJECT(tool->interpolation),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
-    tool->target_hbox = hbox2 = gtk_hbox_new(FALSE, 6);
-    gtk_table_attach(table, hbox2,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    label = gtk_label_new_with_mnemonic(_("Target _graph:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
-
     tool->target_graph = gwy_data_chooser_new_graphs();
     gwy_data_chooser_set_none(GWY_DATA_CHOOSER(tool->target_graph),
                               _("New graph"));
     gwy_data_chooser_set_active(GWY_DATA_CHOOSER(tool->target_graph), NULL, -1);
     gwy_data_chooser_set_filter(GWY_DATA_CHOOSER(tool->target_graph),
                                 filter_target_graphs, tool, NULL);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), tool->target_graph);
-    gtk_box_pack_end(GTK_BOX(hbox2), tool->target_graph, FALSE, FALSE, 0);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row, _("Target _graph:"), NULL,
+                            GTK_OBJECT(tool->target_graph),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     g_signal_connect_swapped(tool->target_graph, "changed",
                              G_CALLBACK(gwy_tool_profile_target_changed),
                              tool);
@@ -590,7 +571,7 @@ gwy_tool_profile_init_dialog(GwyToolProfile *tool)
     gtk_table_set_row_spacing(table, row-1, 8);
     label = gwy_label_new_header(_("Masking Mode"));
     gtk_table_attach(table, label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     tool->masking
@@ -598,12 +579,11 @@ gwy_tool_profile_init_dialog(GwyToolProfile *tool)
                                    G_CALLBACK(gwy_tool_profile_masking_changed),
                                    tool,
                                    tool->args.masking);
-    row = gwy_radio_buttons_attach_to_table(tool->masking, table, 3, row);
+    row = gwy_radio_buttons_attach_to_table(tool->masking, table, 2, row);
     gtk_table_set_row_spacing(table, row-1, 8);
 
     hbox2 = gtk_hbox_new(FALSE, 6);
-    gtk_table_attach(table, hbox2,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, hbox2, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     tool->callabel = gtk_label_new_with_mnemonic(_("_Calibration data:"));
     gtk_misc_set_alignment(GTK_MISC(tool->callabel), 0.0, 0.5);
     gtk_box_pack_start(GTK_BOX(hbox2), tool->callabel, FALSE, FALSE, 0);
@@ -618,8 +598,7 @@ gwy_tool_profile_init_dialog(GwyToolProfile *tool)
     row++;
 
     tool->both = gtk_check_button_new_with_mnemonic(_("_Show profile"));
-    gtk_table_attach(table, tool->both,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, tool->both, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tool->both),
                                  tool->args.both);
     g_signal_connect(tool->both, "toggled",
@@ -631,10 +610,7 @@ gwy_tool_profile_init_dialog(GwyToolProfile *tool)
 
     tool->graph = gwy_graph_new(tool->gmodel);
     gwy_graph_enable_user_input(GWY_GRAPH(tool->graph), FALSE);
-    g_object_set(tool->gmodel,
-                 "label-visible", FALSE,
-                 "axis-label-bottom", tool->args.radial_profiles ? "r" : "x",
-                 NULL);
+    g_object_set(tool->gmodel, "label-visible", FALSE, NULL);
     gtk_box_pack_start(GTK_BOX(hbox), tool->graph, TRUE, TRUE, 2);
 
     gwy_plain_tool_add_clear_button(GWY_PLAIN_TOOL(tool));
@@ -644,7 +620,7 @@ gwy_tool_profile_init_dialog(GwyToolProfile *tool)
     gtk_dialog_set_default_response(dialog, GTK_RESPONSE_APPLY);
     gtk_dialog_set_response_sensitive(dialog, GTK_RESPONSE_APPLY, FALSE);
     gwy_help_add_to_tool_dialog(dialog, GWY_TOOL(tool), GWY_HELP_NO_BUTTON);
-    gwy_tool_profile_update_symm_sensitivty(tool);
+    gwy_tool_profile_update_mode(tool);
 
     gtk_widget_show_all(dialog->vbox);
 }
@@ -674,7 +650,7 @@ gwy_tool_profile_data_switched(GwyTool *gwytool,
 
     tool = GWY_TOOL_PROFILE(gwytool);
     if (data_view) {
-        is_rprof = tool->args.radial_profiles;
+        is_rprof = (tool->args.mode == PROFILE_MODE_RADIAL);
         gwy_object_set_or_reset(plain_tool->layer,
                                 tool->layer_type_line,
                                 "line-numbers", tool->args.number_lines,
@@ -811,21 +787,19 @@ gwy_tool_profile_update_symm_sensitivty(GwyToolProfile *tool)
     selection = gtk_tree_view_get_selection(tool->treeview);
     is_selected = gtk_tree_selection_get_selected(selection, &model, &iter);
     has_lines = (model && gtk_tree_model_iter_n_children(model, NULL) > 0);
-    is_rprof = tool->args.radial_profiles;
+    is_rprof = (tool->args.mode == PROFILE_MODE_RADIAL);
 
     gwy_table_hscale_set_sensitive(tool->thickness, !is_rprof);
-    gtk_widget_set_sensitive(tool->interpolation, !is_rprof);
-    gtk_widget_set_sensitive(tool->interpolation_label, !is_rprof);
-    gtk_widget_set_sensitive(tool->symmetrize, is_rprof && is_selected);
-    gtk_widget_set_sensitive(tool->symmetrize_all, is_rprof && has_lines);
+    gwy_table_hscale_set_sensitive(GTK_OBJECT(tool->interpolation), !is_rprof);
+    gtk_widget_set_sensitive(tool->improve, is_selected);
+    gtk_widget_set_sensitive(tool->improve_all, has_lines);
 
-    show_hide_widget(tool->interp_hbox, !is_rprof);
+    show_hide_widget(gtk_widget_get_parent(tool->interpolation), !is_rprof);
     show_hide_widget(gwy_table_hscale_get_label(tool->thickness), !is_rprof);
     show_hide_widget(gwy_table_hscale_get_middle_widget(tool->thickness),
                      !is_rprof);
     show_hide_widget(gwy_table_hscale_get_scale(tool->thickness), !is_rprof);
     show_hide_widget(gwy_table_hscale_get_units(tool->thickness), !is_rprof);
-    show_hide_widget(tool->symm_hbox, is_rprof);
 }
 
 static void
@@ -1014,18 +988,18 @@ gwy_tool_profile_update_curve(GwyToolProfile *tool,
     gchar *desc;
     const GwyRGBA *color;
     gboolean has_calibration, is_rprof, is_masking;
-    gdouble *xdata = NULL, *ydata = NULL;
-    GwyDataField *data_field;
+    GwyXY *xydata = NULL;
+    GwyDataField *data_field, *mask;
     GwyDataLine *upunc = NULL, *lowunc = NULL;
 
     plain_tool = GWY_PLAIN_TOOL(tool);
     g_return_if_fail(plain_tool->selection);
     g_return_if_fail(gwy_selection_get_object(plain_tool->selection, i, line));
     data_field = plain_tool->data_field;
+    mask = plain_tool->mask_field;
 
-    is_rprof = tool->args.radial_profiles;
-    is_masking = (plain_tool->mask_field
-                  && tool->args.masking != GWY_MASK_IGNORE);
+    is_rprof = (tool->args.mode == PROFILE_MODE_RADIAL);
+    is_masking = (mask && tool->args.masking != GWY_MASK_IGNORE);
     has_calibration = tool->has_calibration && (!is_rprof && !is_masking);
 
     multpos = has_calibration ? 9 : 1;
@@ -1052,8 +1026,7 @@ gwy_tool_profile_update_curve(GwyToolProfile *tool,
             tool->line = gwy_data_line_new(1, 1.0, FALSE);
         r = MAX(r, hypot(gwy_data_field_get_xmeasure(data_field),
                          gwy_data_field_get_ymeasure(data_field)));
-        gwy_data_field_angular_average(data_field, tool->line,
-                                       plain_tool->mask_field,
+        gwy_data_field_angular_average(data_field, tool->line, mask,
                                        tool->args.masking,
                                        xc, yc, r, lineres);
     }
@@ -1066,14 +1039,22 @@ gwy_tool_profile_update_curve(GwyToolProfile *tool,
                                                 tool->args.interpolation);
     }
     else {
-        lineres = get_profile_with_masking(data_field,
-                                           &xdata, &ydata,
-                                           plain_tool->mask_field,
-                                           tool->args.masking,
-                                           line[0], line[1], line[2], line[3],
-                                           lineres,
-                                           tool->args.thickness,
-                                           tool->args.interpolation);
+        xydata = gwy_data_field_get_profile_mask(data_field, &lineres, mask,
+                                                 tool->args.masking,
+                                                 line[0], line[1],
+                                                 line[2], line[3],
+                                                 lineres,
+                                                 tool->args.thickness,
+                                                 tool->args.interpolation);
+        if (!xydata) {
+            xydata = g_new(GwyXY, 1);
+            xydata[0].x = 0.0;
+            xydata[0].y = gwy_data_field_get_dval_real(data_field,
+                                                       0.5*(line[0] + line[2]),
+                                                       0.5*(line[1] + line[3]),
+                                                       GWY_INTERPOLATION_ROUND);
+            lineres = 1;
+        }
     }
 
     if (has_calibration) {
@@ -1091,8 +1072,10 @@ gwy_tool_profile_update_curve(GwyToolProfile *tool,
     n = gwy_graph_model_get_n_curves(tool->gmodel);
     if (i < n) {
         gcmodel = gwy_graph_model_get_curve(tool->gmodel, i);
-        if (xdata && ydata) {
-            gwy_graph_curve_model_set_data(gcmodel, xdata, ydata, lineres);
+        if (xydata) {
+            gwy_graph_curve_model_set_data_interleaved(gcmodel,
+                                                       (gdouble*)xydata,
+                                                       lineres);
         }
         else {
             gwy_graph_curve_model_set_data_from_dataline(gcmodel,
@@ -1112,8 +1095,10 @@ gwy_tool_profile_update_curve(GwyToolProfile *tool,
                      "color", color,
                      NULL);
         g_free(desc);
-        if (xdata && ydata) {
-            gwy_graph_curve_model_set_data(gcmodel, xdata, ydata, lineres);
+        if (xydata) {
+            gwy_graph_curve_model_set_data_interleaved(gcmodel,
+                                                       (gdouble*)xydata,
+                                                       lineres);
         }
         else {
             gwy_graph_curve_model_set_data_from_dataline(gcmodel,
@@ -1143,12 +1128,11 @@ gwy_tool_profile_update_curve(GwyToolProfile *tool,
             add_hidden_unc_curves(tool, i/multpos+1, color, upunc, lowunc);
     }
 
-    g_free(xdata);
-    g_free(ydata);
+    g_free(xydata);
 }
 
 static void
-gwy_tool_profile_symmetrize(GwyToolProfile *tool)
+gwy_tool_profile_improve(GwyToolProfile *tool)
 {
     GtkTreeSelection *selection;
     GtkTreeModel *model;
@@ -1162,12 +1146,15 @@ gwy_tool_profile_symmetrize(GwyToolProfile *tool)
 
     path = gtk_tree_model_get_path(model, &iter);
     indices = gtk_tree_path_get_indices(path);
-    gwy_tool_profile_symmetrize_profile(tool, indices[0]);
+    if (tool->args.mode == PROFILE_MODE_RADIAL)
+        gwy_tool_profile_symmetrize_profile(tool, indices[0]);
+    else
+        gwy_tool_profile_straighten_profile(tool, indices[0]);
     gtk_tree_path_free(path);
 }
 
 static void
-gwy_tool_profile_symmetrize_all(GwyToolProfile *tool)
+gwy_tool_profile_improve_all(GwyToolProfile *tool)
 {
     GwyPlainTool *plain_tool;
     gint n, i;
@@ -1177,8 +1164,12 @@ gwy_tool_profile_symmetrize_all(GwyToolProfile *tool)
         || !(n = gwy_selection_get_data(plain_tool->selection, NULL)))
         return;
 
-    for (i = 0; i < n; i++)
-        gwy_tool_profile_symmetrize_profile(tool, i);
+    for (i = 0; i < n; i++) {
+        if (tool->args.mode == PROFILE_MODE_RADIAL)
+            gwy_tool_profile_symmetrize_profile(tool, i);
+        else
+            gwy_tool_profile_straighten_profile(tool, i);
+    }
 }
 
 static void
@@ -1199,7 +1190,8 @@ gwy_tool_profile_update_all_curves(GwyToolProfile *tool)
 }
 
 static gdouble
-estimate_variation(GwyDataField *dfield, GwyDataLine *tmp, const gdouble *line)
+estimate_angular_variation(GwyDataField *dfield, GwyDataLine *tmp,
+                           const gdouble *line)
 {
     gdouble xc, yc, r, dx, dy, h;
     gdouble *s, *s2;
@@ -1273,10 +1265,9 @@ symmetrize_at_scale(GwyDataField *dfield,
                     gdouble *line)
 {
     gdouble xreal = dfield->xreal, yreal = dfield->yreal;
+    gint i, j, besti = 0, bestj = 0;
     gdouble dx = gwy_data_field_get_xmeasure(dfield);
     gdouble dy = gwy_data_field_get_ymeasure(dfield);
-    gint istep = (gint)ceil(r/dy), jstep = (gint)ceil(r/dx);
-    gint i, j, besti = 0, bestj = 0;
     gdouble allvar[25], z[9];
     gdouble var, bestvar = G_MAXDOUBLE;
     gboolean ok;
@@ -1284,8 +1275,8 @@ symmetrize_at_scale(GwyDataField *dfield,
     for (i = -2; i <= 2; i++) {
         for (j = -2; j <= 2; j++) {
             gdouble offline[4] = {
-                line[0] + j*jstep*dx, line[1] + i*istep*dy,
-                line[2] + j*jstep*dx, line[3] + i*istep*dy,
+                line[0] + j*r, line[1] + i*r,
+                line[2] + j*r, line[3] + i*r,
             };
 
             allvar[5*(i + 2) + (j + 2)] = G_MAXDOUBLE;
@@ -1293,7 +1284,7 @@ symmetrize_at_scale(GwyDataField *dfield,
                 || offline[1] < 0.0 || offline[3] > yreal)
                 continue;
 
-            var = estimate_variation(dfield, tmpline, offline);
+            var = estimate_angular_variation(dfield, tmpline, offline);
             allvar[5*(i + 2) + (j + 2)] = var;
             if (i*j + j*j <= 5 && var < bestvar) {
                 besti = i;
@@ -1303,16 +1294,14 @@ symmetrize_at_scale(GwyDataField *dfield,
         }
     }
 
-    line[0] += bestj*jstep*dx;
-    line[1] += besti*istep*dy;
-    line[2] += bestj*jstep*dx;
-    line[3] += besti*istep*dy;
+    line[0] += bestj*r;
+    line[1] += besti*r;
+    line[2] += bestj*r;
+    line[3] += besti*r;
 
-    /* If steps are larger than one pixel, just choose the maximum and
-     * continue. */
-    if (MAX(istep, jstep) > 1) {
-        gwy_debug("symmetrize at scale %g (%d,%d): (%d,%d)",
-                  r, jstep, istep, bestj, besti);
+    /* If steps are large, just choose the maximum and continue. */
+    if (r > 0.7 * 2*dx*dy/(dx + dy)) {
+        gwy_debug("symmetrize at scale %g: (%d,%d)", r, bestj, besti);
         return FALSE;
     }
 
@@ -1340,20 +1329,19 @@ symmetrize_at_scale(GwyDataField *dfield,
     }
     if (ok) {
         gdouble x, y;
-        gwy_math_refine_maximum(z, &x, &y);
+        gwy_math_refine_maximum_2d(z, &x, &y);
         gwy_debug("subpixel refinement (%g,%g)", x, y);
-        line[0] += x*dx;
-        line[1] += y*dy;
-        line[2] += x*dx;
-        line[3] += y*dy;
+        line[0] += x*r;
+        line[1] += y*r;
+        line[2] += x*r;
+        line[3] += y*r;
     }
 
     return TRUE;
 }
 
 static void
-gwy_tool_profile_symmetrize_profile(GwyToolProfile *tool,
-                                    gint id)
+gwy_tool_profile_symmetrize_profile(GwyToolProfile *tool, gint id)
 {
     GwyPlainTool *plain_tool;
     GwyDataField *dfield;
@@ -1382,112 +1370,153 @@ gwy_tool_profile_symmetrize_profile(GwyToolProfile *tool,
     g_object_unref(tmpline);
 }
 
-static gint
-get_profile_with_masking(GwyDataField *dfield,
-                         gdouble **xdata, gdouble **ydata,
-                         GwyDataField *mask,
-                         GwyMaskingType masking,
-                         gdouble xfrom, gdouble yfrom,
-                         gdouble xto, gdouble yto,
-                         gint res,
-                         gint thickness,
-                         GwyInterpolationType interpolation)
+static gdouble
+estimate_orthogonal_variation(GwyDataField *dfield,
+                              const gdouble *line, gint thickness)
 {
-    gint k, i, j, kk;
-    gdouble xreal, yreal, dx, dy, xstep, ystep, step, size, tx, ty, h;
-    gint xres, yres, tres, n;
-    const gdouble *m;
-
-    if (masking == GWY_MASK_IGNORE)
-        mask = NULL;
-    else if (!mask)
-        masking = GWY_MASK_IGNORE;
-    m = mask ? mask->data : NULL;
-
-    xres = dfield->xres;
-    yres = dfield->yres;
-    xreal = dfield->xreal;
-    yreal = dfield->yreal;
-    dx = xreal/xres;
-    dy = yreal/yres;
-
-    size = hypot(fabs(xto - xfrom)/dx + 1, fabs(yto - yfrom)/dy + 1);
-    size = MAX(size, 1.0);
-    if (res <= 0)
-        res = GWY_ROUND(size);
-
-    gwy_debug("size: %g, res: %d", size, res);
-    if (xto == xfrom && yto == yfrom) {
-        xto += 0.2*dx;
-        yto += 0.2*dy;
-        xfrom -= 0.2*dx;
-        yfrom -= 0.2*dy;
-    }
-    xstep = (xto - xfrom)/(res - 1.0);
-    ystep = (yto - yfrom)/(res - 1.0);
-    step = hypot(xstep, ystep);
-    gwy_debug("step (%g, %g)", xstep, ystep);
-
-    if (thickness <= 1) {
-        tres = 0;
-        tx = ty = 0.0;
-    }
-    else {
-        tres = 2*(thickness - 1);
-        tx = (yto - yfrom)/dy;
-        ty = (xto - xfrom)/dx;
-        h = hypot(tx, ty);
-        tx *= dx/h * 0.5*thickness/tres;
-        ty *= dy/h * 0.5*thickness/tres;
-    }
-    gwy_debug("tres: %d, tstep (%g, %g)", tres, tx, ty);
+    gdouble lx, ly, l, dx, dy, h, xreal, yreal;
+    gdouble xfrom0, xfrom1, yfrom0, yfrom1, xto0, xto1, yto0, yto1;
+    gdouble variation = 0.0;
+    gint ir, res, i, j, n;
 
-    *xdata = g_new0(gdouble, res);
-    *ydata = g_new0(gdouble, res);
+    /* Ignore offsets here we do not call any function that uses them. */
+    lx = line[2] - line[0];
+    ly = line[3] - line[1];
+    l = hypot(lx, ly);
 
+    dx = gwy_data_field_get_xmeasure(dfield);
+    dy = gwy_data_field_get_ymeasure(dfield);
+    h = 2.0*dx*dy/(dx + dy);
+
+    /* First orthogonal profile is (xfrom0,yfrom0)--(xto0,yto0),
+     * the last is (xfrom1,yfrom1)--(xto1,yto1), between them we interpolate. */
+    xfrom0 = line[0] + ly/l*thickness*h;
+    xto0 = line[0] - ly/l*thickness*h;
+    yfrom0 = line[1] - lx/l*thickness*h;
+    yto0 = line[1] + lx/l*thickness*h;
+    xfrom1 = line[2] + ly/l*thickness*h;
+    xto1 = line[2] - ly/l*thickness*h;
+    yfrom1 = line[3] - lx/l*thickness*h;
+    yto1 = line[3] + lx/l*thickness*h;
+
+    xreal = gwy_data_field_get_xreal(dfield);
+    yreal = gwy_data_field_get_yreal(dfield);
+    ir = pow(l/h + 1.0, 2.0/3.0);
+    res = thickness+1;
     n = 0;
-    for (k = 0; k < res; k++) {
-        gdouble xc = xfrom + xstep*k;
-        gdouble yc = yfrom + ystep*k;
-        gdouble z = 0.0;
-        gint w = 0;
-
-        for (kk = -tres; kk <= tres; kk++) {
-            gdouble x = xc + kk*tx;
-            gdouble y = yc + kk*ty;
-
-            x = CLAMP(x, 0.0, 0.999999*xreal);
-            y = CLAMP(y, 0.0, 0.999999*yreal);
-
-            if (masking != GWY_MASK_IGNORE) {
-                i = (gint)floor(y/dy);
-                j = (gint)floor(x/dx);
-                if ((masking == GWY_MASK_INCLUDE && m[i*xres + j] <= 0.0)
-                    || (masking == GWY_MASK_EXCLUDE && m[i*xres + j] >= 1.0))
-                    continue;
-            }
 
-            z += gwy_data_field_get_dval_real(dfield, x, y, interpolation);
-            w++;
-        }
-        gwy_debug("[%d] %d", k, w);
-        if (w) {
-            (*xdata)[n] = step*k;
-            (*ydata)[n] = z/w;
-            n++;
-        }
+    for (i = 0; i <= ir; i++) {
+        gdouble t = i/(gdouble)ir;
+        gdouble xl1 = xfrom0*(1.0 - t) + xfrom1*t;
+        gdouble yl1 = yfrom0*(1.0 - t) + yfrom1*t;
+        gdouble xl2 = xto0*(1.0 - t) + xto1*t;
+        gdouble yl2 = yto0*(1.0 - t) + yto1*t;
+        gdouble mu = 0.0;
+        gint nxy;
+        GwyXY *xy;
+
+        if (xl1 < 0.5*dx || xl1 > xreal - 0.5*dx)
+            continue;
+        if (yl1 < 0.5*dy || yl1 > yreal - 0.5*dy)
+            continue;
+        if (xl2 < 0.5*dx || xl2 > xreal - 0.5*dx)
+            continue;
+        if (yl2 < 0.5*dy || yl2 > yreal - 0.5*dy)
+            continue;
+
+        xy = gwy_data_field_get_profile_mask(dfield, &nxy,
+                                             NULL, GWY_MASK_IGNORE,
+                                             xl1, yl1, xl2, yl2,
+                                             res, 1, GWY_INTERPOLATION_LINEAR);
+        if (!xy)
+            continue;
+
+        for (j = 0; j < nxy; j++)
+            mu += xy[j].y;
+        mu /= nxy;
+
+        for (j = 0; j < nxy; j++)
+            variation += (xy[j].y - mu)*(xy[j].y - mu);
+        n += nxy;
+
+        g_free(xy);
+    }
+
+    return variation/n;
+}
+
+static void
+straighten_at_scale(GwyDataField *dfield, gdouble *line,
+                    gint thickness, gdouble phistep, gint n)
+{
+    gdouble r, xc, yc, phi0, phi, cphi, sphi, t;
+    gdouble *var;
+    gint i, besti;
+
+    xc = 0.5*(line[0] + line[2]);
+    yc = 0.5*(line[1] + line[3]);
+    r = 0.5*hypot(line[2] - line[0], line[3] - line[1]);
+    phi0 = atan2(line[3] - line[1], line[2] - line[0]);
+
+    var = g_new(gdouble, 2*n + 1);
+    for (i = -n; i <= n; i++) {
+        phi = i*phistep + phi0;
+        cphi = cos(phi);
+        sphi = sin(phi);
+        line[0] = xc + cphi*r;
+        line[1] = yc + sphi*r;
+        line[2] = xc - cphi*r;
+        line[3] = yc - sphi*r;
+        var[n + i] = estimate_orthogonal_variation(dfield, line, thickness);
+        gwy_debug("%g %g", phi, var[n + i]);
     }
 
-    if (!n) {
-        (*xdata)[0] = 0.0;
-        (*ydata)[0] = gwy_data_field_get_dval_real(dfield,
-                                                   0.5*(xfrom + xto),
-                                                   0.5*(yfrom + yto),
-                                                   GWY_INTERPOLATION_ROUND);
-        n = 1;
+    besti = 0;
+    for (i = -n; i <= n; i++) {
+        if (var[n + i] < var[n + besti])
+            besti = i;
     }
 
-    return n;
+    phi0 += besti*phistep;
+    if (ABS(besti) < n) {
+        gwy_math_refine_maximum_1d(var + (n + besti - 1), &t);
+        phi0 += t*phistep;
+    }
+    cphi = cos(phi0);
+    sphi = sin(phi0);
+    line[0] = xc + cphi*r;
+    line[1] = yc + sphi*r;
+    line[2] = xc - cphi*r;
+    line[3] = yc - sphi*r;
+
+    g_free(var);
+}
+
+static void
+gwy_tool_profile_straighten_profile(GwyToolProfile *tool, gint id)
+{
+    GwyPlainTool *plain_tool;
+    GwyDataField *dfield;
+    gdouble line[4];
+    gdouble dx, dy;
+    gint thickness = tool->args.thickness;
+
+    plain_tool = GWY_PLAIN_TOOL(tool);
+    g_return_if_fail(plain_tool->selection);
+    g_return_if_fail(gwy_selection_get_object(plain_tool->selection, id, line));
+    dfield = plain_tool->data_field;
+    dx = gwy_data_field_get_xmeasure(dfield);
+    dy = gwy_data_field_get_ymeasure(dfield);
+    thickness = MAX((thickness + 1)/2, 4);
+
+    /* Don't attempt to optimise very short lines. It would end up in tears. */
+    if (hypot((line[2] - line[0])/dx, (line[3] - line[1])/dy) < 4.0)
+        return;
+
+    straighten_at_scale(dfield, line, thickness, 0.02, 15);
+    straighten_at_scale(dfield, line, thickness, 0.002, 12);
+
+    gwy_selection_set_object(plain_tool->selection, id, line);
 }
 
 static void
@@ -1562,10 +1591,7 @@ gwy_tool_profile_render_color(G_GNUC_UNUSED GtkCellLayout *layout,
     gtk_tree_model_get(model, iter, 0, &idx, -1);
     gcmodel = gwy_graph_model_get_curve(tool->gmodel, idx);
     g_object_get(gcmodel, "color", &rgba, NULL);
-    pixel = 0xff
-        | ((guint32)(guchar)floor(255.99999*rgba->b) << 8)
-        | ((guint32)(guchar)floor(255.99999*rgba->g) << 16)
-        | ((guint32)(guchar)floor(255.99999*rgba->r) << 24);
+    pixel = 0xff | gwy_rgba_to_pixbuf_pixel(rgba);
     gwy_rgba_free(rgba);
     gdk_pixbuf_fill(tool->colorpixbuf, pixel);
 }
@@ -1579,13 +1605,20 @@ gwy_tool_profile_options_expanded(GtkExpander *expander,
 }
 
 static void
-gwy_tool_profile_radial_profiles_changed(GtkToggleButton *check,
-                                         GwyToolProfile *tool)
+gwy_tool_profile_mode_changed(GtkComboBox *combo, GwyToolProfile *tool)
+{
+    tool->args.mode = gwy_enum_combo_box_get_active(combo);
+    gwy_tool_profile_update_mode(tool);
+    gwy_tool_profile_update_all_curves(tool);
+}
+
+static void
+gwy_tool_profile_update_mode(GwyToolProfile *tool)
 {
     GwyPlainTool *plain_tool = GWY_PLAIN_TOOL(tool);
     gboolean is_rprof;
 
-    tool->args.radial_profiles = is_rprof = gtk_toggle_button_get_active(check);
+    is_rprof = (tool->args.mode == PROFILE_MODE_RADIAL);
     gwy_tool_profile_update_symm_sensitivty(tool);
     if (plain_tool->layer) {
         g_object_set(plain_tool->layer,
@@ -1598,7 +1631,21 @@ gwy_tool_profile_radial_profiles_changed(GtkToggleButton *check,
                      "axis-label-bottom", is_rprof ? "r" : "x",
                      NULL);
     }
-    gwy_tool_profile_update_all_curves(tool);
+
+    if (is_rprof) {
+        gtk_button_set_label(GTK_BUTTON(tool->improve),
+                             _("S_ymmetrize"));
+        gtk_button_set_label(GTK_BUTTON(tool->improve_all),
+                             _("Symmetrize _All"));
+    }
+    else {
+        gtk_button_set_label(GTK_BUTTON(tool->improve),
+                             _("Improve _Direction"));
+        gtk_button_set_label(GTK_BUTTON(tool->improve_all),
+                             _("Improve _All"));
+    }
+    gtk_button_set_use_underline(GTK_BUTTON(tool->improve), TRUE);
+    gtk_button_set_use_underline(GTK_BUTTON(tool->improve_all), TRUE);
 }
 
 static void
@@ -1609,8 +1656,9 @@ gwy_tool_profile_thickness_changed(GwyToolProfile *tool,
 
     tool->args.thickness = gwy_adjustment_get_int(adj);
     if (plain_tool->layer) {
-        gboolean is_rprof = tool->args.radial_profiles;
+        gboolean is_rprof;
 
+        is_rprof = (tool->args.mode == PROFILE_MODE_RADIAL);
         g_object_set(plain_tool->layer,
                      "thickness", is_rprof ? 1 : tool->args.thickness,
                      NULL);
@@ -1654,7 +1702,8 @@ gwy_tool_profile_separate_changed(GtkToggleButton *check,
                                   GwyToolProfile *tool)
 {
     tool->args.separate = gtk_toggle_button_get_active(check);
-    gtk_widget_set_sensitive(tool->target_hbox, !tool->args.separate);
+    gwy_table_hscale_set_sensitive(GTK_OBJECT(tool->target_graph),
+                                   !tool->args.separate);
     if (tool->args.separate)
         gwy_data_chooser_set_active(GWY_DATA_CHOOSER(tool->target_graph),
                                     NULL, -1);
@@ -1734,7 +1783,7 @@ gwy_tool_profile_apply(GwyToolProfile *tool)
     n = gwy_selection_get_data(plain_tool->selection, NULL);
     g_return_if_fail(n);
 
-    is_rprof = tool->args.radial_profiles;
+    is_rprof = (tool->args.mode == PROFILE_MODE_RADIAL);
     has_calibration = tool->has_calibration && !is_rprof;
 
     if (tool->args.target.datano) {
@@ -1835,7 +1884,7 @@ display_changed(G_GNUC_UNUSED GtkComboBox *combo, GwyToolProfile *tool)
     gint i, n;
     gint multpos = 9;
 
-    if (!tool->has_calibration || tool->args.radial_profiles)
+    if (!tool->has_calibration || tool->args.mode != PROFILE_MODE_LINEAR)
         return;
 
     plain_tool = GWY_PLAIN_TOOL(tool);
diff --git a/modules/tools/readvalue.c b/modules/tools/readvalue.c
index f46085d..87aa739 100644
--- a/modules/tools/readvalue.c
+++ b/modules/tools/readvalue.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: readvalue.c 19044 2016-10-08 19:10:46Z yeti-dn $
+ *  @(#) $Id: readvalue.c 20100 2017-07-29 04:22:16Z yeti-dn $
  *  Copyright (C) 2003-2007,2014 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -30,13 +30,13 @@
 #include <libgwydgets/gwydgetutils.h>
 #include <app/gwyapp.h>
 
-enum { RADIUS_MAX = 32 };
-
 #define GWY_TYPE_TOOL_READ_VALUE            (gwy_tool_read_value_get_type())
 #define GWY_TOOL_READ_VALUE(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), GWY_TYPE_TOOL_READ_VALUE, GwyToolReadValue))
 #define GWY_IS_TOOL_READ_VALUE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), GWY_TYPE_TOOL_READ_VALUE))
 #define GWY_TOOL_READ_VALUE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), GWY_TYPE_TOOL_READ_VALUE, GwyToolReadValueClass))
 
+enum { RADIUS_MAX = 32 };
+
 typedef struct _GwyToolReadValue      GwyToolReadValue;
 typedef struct _GwyToolReadValueClass GwyToolReadValueClass;
 
@@ -136,7 +136,7 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Pointer tool, reads value under pointer."),
     "Yeti <yeti at gwyddion.net>",
-    "2.12",
+    "2.14",
     "David Nečas (Yeti) & Petr Klapetek",
     "2003",
 };
@@ -145,7 +145,7 @@ static const ToolArgs default_args = {
     1, FALSE,
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, readvalue)
 
 G_DEFINE_TYPE(GwyToolReadValue, gwy_tool_read_value, GWY_TYPE_PLAIN_TOOL)
 
@@ -219,8 +219,8 @@ gwy_tool_read_value_init(GwyToolReadValue *tool)
     gwy_container_gis_boolean_by_name(settings, show_selection_key,
                                       &tool->args.show_selection);
 
-    tool->pixel_format = gwy_si_unit_value_format_new(1.0, 0, "px");
-    tool->angle_format = gwy_si_unit_value_format_new(1.0, 1, "deg");
+    tool->pixel_format = gwy_si_unit_value_format_new(1.0, 0, _("px"));
+    tool->angle_format = gwy_si_unit_value_format_new(1.0, 1, _("deg"));
     gwy_plain_tool_connect_selection(plain_tool, tool->layer_type_point,
                                      "pointer");
 
@@ -240,21 +240,24 @@ gwy_tool_read_value_init_dialog(GwyToolReadValue *tool)
     dialog = GTK_DIALOG(GWY_TOOL(tool)->dialog);
     tips = gwy_app_get_tooltips();
 
-    table = GTK_TABLE(gtk_table_new(13, 3, FALSE));
+    align = gtk_alignment_new(0.0, 0.0, 1.0, 0.0);
+    gtk_box_pack_start(GTK_BOX(dialog->vbox), align, FALSE, TRUE, 0);
+
+    table = GTK_TABLE(gtk_table_new(12, 3, FALSE));
     gtk_table_set_col_spacings(table, 6);
     gtk_table_set_row_spacings(table, 2);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
-    gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(table),
-                       FALSE, FALSE, 0);
+    gtk_container_add(GTK_CONTAINER(align), GTK_WIDGET(table));
     row = 0;
 
     gtk_table_attach(table, gwy_label_new_header(_("Position")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
     row++;
 
     label = gtk_label_new("X");
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, label, 0, 1, row, row+1,
+                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
 
     tool->xpx = gtk_label_new("123456 px");
     gtk_widget_size_request(tool->xpx, &req);
@@ -270,7 +273,8 @@ gwy_tool_read_value_init_dialog(GwyToolReadValue *tool)
 
     label = gtk_label_new("Y");
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, label, 0, 1, row, row+1,
+                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
 
     tool->ypx = gtk_label_new(NULL);
     gtk_widget_set_size_request(tool->xpx, req.width, -1);
@@ -284,22 +288,21 @@ gwy_tool_read_value_init_dialog(GwyToolReadValue *tool)
     row++;
 
     gtk_table_attach(table, gwy_label_new_header(_("Value")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
     row++;
 
     label = gtk_label_new("Z");
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, label, 0, 1, row, row+1,
+                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
 
     tool->z = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(tool->z), 1.0, 0.5);
-    gtk_table_attach(table, tool->z,
-                     2, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, tool->z, 2, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     align = gtk_alignment_new(1.0, 0.5, 0.0, 0.0);
-    gtk_table_attach(table, align,
-                     1, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, align, 1, 3, row, row+1, GTK_FILL, 0, 0, 0);
 
     tool->set_zero = gtk_button_new_with_mnemonic(_("Set _Zero"));
     gtk_container_add(GTK_CONTAINER(align), tool->set_zero);
@@ -313,55 +316,55 @@ gwy_tool_read_value_init_dialog(GwyToolReadValue *tool)
     row++;
 
     gtk_table_attach(table, gwy_label_new_header(_("Facet")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
     row++;
 
     label = gtk_label_new(_("Inclination θ"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, label, 0, 1, row, row+1,
+                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
 
     tool->theta = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(tool->theta), 1.0, 0.5);
-    gtk_table_attach(table, tool->theta,
-                     2, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, tool->theta, 2, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     label = gtk_label_new(_("Inclination φ"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, label, 0, 1, row, row+1,
+                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
 
     tool->phi = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(tool->phi), 1.0, 0.5);
-    gtk_table_attach(table, tool->phi,
-                     2, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, tool->phi, 2, 3, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_table_set_row_spacing(table, row, 8);
     row++;
 
     gtk_table_attach(table, gwy_label_new_header(_("Curvatures")),
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
     row++;
 
     label = gtk_label_new(_("Curvature 1"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, label, 0, 1, row, row+1,
+                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
 
     tool->curv1 = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(tool->curv1), 1.0, 0.5);
-    gtk_table_attach(table, tool->curv1,
-                     2, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, tool->curv1, 2, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     label = gtk_label_new(_("Curvature 2"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, label, 0, 1, row, row+1,
+                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
 
     tool->curv2 = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(tool->curv2), 1.0, 0.5);
-    gtk_table_attach(table, tool->curv2,
-                     2, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, tool->curv2, 2, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
-    table = GTK_TABLE(gtk_table_new(2, 4, FALSE));
+    table = GTK_TABLE(gtk_table_new(2, 3, FALSE));
     gtk_table_set_col_spacings(table, 6);
     gtk_table_set_row_spacings(table, 2);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -371,8 +374,9 @@ gwy_tool_read_value_init_dialog(GwyToolReadValue *tool)
 
     tool->radius = gtk_adjustment_new(tool->args.radius,
                                       1, RADIUS_MAX, 1, 5, 0);
-    gwy_table_attach_spinbutton(GTK_WIDGET(table), row,
-                                _("_Averaging radius:"), "px", tool->radius);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row,
+                            _("_Averaging radius:"), _("px"),
+                            tool->radius, GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_signal_connect_swapped(tool->radius, "value-changed",
                              G_CALLBACK(gwy_tool_read_value_radius_changed),
                              tool);
@@ -383,7 +387,7 @@ gwy_tool_read_value_init_dialog(GwyToolReadValue *tool)
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tool->show_selection),
                                  tool->args.show_selection);
     gtk_table_attach(GTK_TABLE(table), tool->show_selection,
-                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect(tool->show_selection, "toggled",
                      G_CALLBACK(gwy_tool_read_value_show_selection_changed),
                              tool);
@@ -400,15 +404,14 @@ static void
 gwy_tool_read_value_data_switched(GwyTool *gwytool,
                                   GwyDataView *data_view)
 {
-    GwyPlainTool *plain_tool;
+    GwyPlainTool *plain_tool = GWY_PLAIN_TOOL(gwytool);
+    GwyContainer *container;
     GwyToolReadValue *tool;
     gboolean ignore;
     gchar xukey[24];
     gchar yukey[24];
     gchar zukey[24];
 
-
-    plain_tool = GWY_PLAIN_TOOL(gwytool);
     ignore = (data_view == plain_tool->data_view);
 
     GWY_TOOL_CLASS(gwy_tool_read_value_parent_class)->data_switched(gwytool,
@@ -419,6 +422,7 @@ gwy_tool_read_value_data_switched(GwyTool *gwytool,
 
     tool = GWY_TOOL_READ_VALUE(gwytool);
     if (data_view) {
+        container = plain_tool->container;
         gwy_object_set_or_reset(plain_tool->layer,
                                 tool->layer_type_point,
                                 "draw-marker", tool->args.show_selection,
@@ -429,19 +433,15 @@ gwy_tool_read_value_data_switched(GwyTool *gwytool,
         gwy_selection_set_max_objects(plain_tool->selection, 1);
         gwy_tool_read_value_update_units(tool);
 
-
         g_snprintf(xukey, sizeof(xukey), "/%d/data/cal_xunc", plain_tool->id);
         g_snprintf(yukey, sizeof(yukey), "/%d/data/cal_yunc", plain_tool->id);
         g_snprintf(zukey, sizeof(zukey), "/%d/data/cal_zunc", plain_tool->id);
 
-        if (gwy_container_gis_object_by_name(plain_tool->container, xukey, &(tool->xunc))
-            && gwy_container_gis_object_by_name(plain_tool->container, yukey, &(tool->yunc))
-            && gwy_container_gis_object_by_name(plain_tool->container, zukey, &(tool->zunc)))
-        {
+        tool->has_calibration = FALSE;
+        if (gwy_container_gis_object_by_name(container, xukey, &tool->xunc)
+            && gwy_container_gis_object_by_name(container, yukey, &tool->yunc)
+            && gwy_container_gis_object_by_name(container, zukey, &tool->zunc))
             tool->has_calibration = TRUE;
-        } else {
-            tool->has_calibration = FALSE;
-        }
     }
 }
 
@@ -461,24 +461,23 @@ gwy_tool_read_value_update_units(GwyToolReadValue *tool)
 static void
 gwy_tool_read_value_data_changed(GwyPlainTool *plain_tool)
 {
+    GwyToolReadValue *tool = GWY_TOOL_READ_VALUE(plain_tool);
+    GwyContainer *container = plain_tool->container;
     gchar xukey[24];
     gchar yukey[24];
     gchar zukey[24];
 
+    tool->has_calibration = FALSE;
     g_snprintf(xukey, sizeof(xukey), "/%d/data/cal_xunc", plain_tool->id);
     g_snprintf(yukey, sizeof(yukey), "/%d/data/cal_yunc", plain_tool->id);
     g_snprintf(zukey, sizeof(zukey), "/%d/data/cal_zunc", plain_tool->id);
 
-    if (gwy_container_gis_object_by_name(plain_tool->container, xukey, &(GWY_TOOL_READ_VALUE(plain_tool)->xunc))
-        && gwy_container_gis_object_by_name(plain_tool->container, yukey, &(GWY_TOOL_READ_VALUE(plain_tool)->yunc))
-        && gwy_container_gis_object_by_name(plain_tool->container, zukey, &(GWY_TOOL_READ_VALUE(plain_tool)->zunc)))
-    {
-        GWY_TOOL_READ_VALUE(plain_tool)->has_calibration = TRUE;
-    } else {
-        GWY_TOOL_READ_VALUE(plain_tool)->has_calibration = FALSE;
-    }
+    if (gwy_container_gis_object_by_name(container, xukey, &tool->xunc)
+        && gwy_container_gis_object_by_name(container, yukey, &tool->yunc)
+        && gwy_container_gis_object_by_name(container, zukey, &tool->zunc))
+        tool->has_calibration = TRUE;
 
-    gwy_tool_read_value_update_values(GWY_TOOL_READ_VALUE(plain_tool));
+    gwy_tool_read_value_update_values(tool);
 }
 
 static void
@@ -503,10 +502,11 @@ gwy_tool_read_value_radius_changed(GwyToolReadValue *tool)
 
     tool->args.radius = gwy_adjustment_get_int(tool->radius);
     plain_tool = GWY_PLAIN_TOOL(tool);
-    if (plain_tool->layer)
+    if (plain_tool->layer) {
         g_object_set(plain_tool->layer,
                      "marker-radius", tool->args.radius,
                      NULL);
+    }
     if (plain_tool->selection)
         gwy_tool_read_value_update_values(tool);
 }
diff --git a/modules/tools/roughness.c b/modules/tools/roughness.c
index 5e3a2b0..5f8e8eb 100644
--- a/modules/tools/roughness.c
+++ b/modules/tools/roughness.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: roughness.c 19071 2016-10-14 09:02:41Z yeti-dn $
+ *  @(#) $Id: roughness.c 20256 2017-08-11 17:27:25Z yeti-dn $
  *  Copyright (C) 2006-2008 Martin Hason, David Necas (Yeti), Petr Klapetek.
  *  E-mail: hasonm at physics.muni.cz, yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -186,9 +186,10 @@ struct _GwyToolRoughness {
 
     GtkObject *thickness;
     GtkObject *cutoff;
+    GtkWidget *cutoff_value;
+    GtkWidget *cutoff_units;
     GtkWidget *interpolation;
     GtkWidget *target_graph;
-    GtkWidget *target_hbox;
 
     GtkBox *aux_box;
     GtkWidget *message_label;
@@ -614,7 +615,7 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Calculate surface profile parameters."),
     "Martin Hasoň <hasonm at physics.muni.cz>, Yeti <yeti at gwyddion.net>",
-    "1.13",
+    "1.15",
     "Martin Hasoň & David Nečas (Yeti)",
     "2006",
 };
@@ -624,7 +625,7 @@ static const gchar cutoff_key[]        = "/module/roughness/cutoff";
 static const gchar thickness_key[]     = "/module/roughness/thickness";
 static const gchar expanded_key[]      = "/module/roughness/expanded";
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, roughness)
 
 G_DEFINE_TYPE(GwyToolRoughness, gwy_tool_roughness, GWY_TYPE_PLAIN_TOOL)
 
@@ -778,8 +779,8 @@ gwy_tool_roughness_init_dialog(GwyToolRoughness *tool)
 
     GtkDialog *dialog;
     GtkSizeGroup *sizegroup;
-    GtkWidget *dialog_vbox, *hbox, *vbox_left, *vbox_right, *table, *hbox2;
-    GtkWidget *scwin, *treeview, *spin, *label;
+    GtkWidget *dialog_vbox, *hbox, *vbox_left, *vbox_right, *table;
+    GtkWidget *scwin, *treeview, *spin;
     GwyAxis *axis;
     gint row;
 
@@ -824,7 +825,7 @@ gwy_tool_roughness_init_dialog(GwyToolRoughness *tool)
     g_signal_connect_swapped(tool->copy, "clicked",
                              G_CALLBACK(gwy_tool_roughness_copy), tool);
 
-    table = gtk_table_new(5, 4, FALSE);
+    table = gtk_table_new(6, 3, FALSE);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -835,24 +836,38 @@ gwy_tool_roughness_init_dialog(GwyToolRoughness *tool)
         = gwy_enum_combo_box_new(graph_types, G_N_ELEMENTS(graph_types),
                                  G_CALLBACK(gwy_tool_roughness_graph_changed),
                                  tool, tool->graph_type, TRUE);
-    gwy_table_attach_hscale(table, row, _("_Graph:"), NULL,
-                            GTK_OBJECT(tool->graph_out), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("_Graph:"), NULL,
+                            GTK_OBJECT(tool->graph_out),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     /* cut-off */
     tool->cutoff = gtk_adjustment_new(tool->args.cutoff,
                                       0.0, 0.3, 0.001, 0.1, 0);
-    spin = gwy_table_attach_hscale(table, row, _("C_ut-off:"), NULL,
+    spin = gwy_table_attach_adjbar(table, row, _("C_ut-off:"), NULL,
                                    tool->cutoff, GWY_HSCALE_DEFAULT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 4);
     g_signal_connect(tool->cutoff, "value-changed",
                      G_CALLBACK(gwy_tool_roughness_cutoff_changed), tool);
     row++;
 
+    tool->cutoff_value = gtk_label_new(NULL);
+    gtk_misc_set_alignment(GTK_MISC(tool->cutoff_value), 1.0, 0.5);
+    gtk_table_attach(GTK_TABLE(table), tool->cutoff_value,
+                     1, 2, row, row+1, GTK_FILL, 0, 0, 0);
+
+    tool->cutoff_units = gtk_label_new(NULL);
+    gtk_misc_set_alignment(GTK_MISC(tool->cutoff_units), 0.0, 0.5);
+    gtk_table_attach(GTK_TABLE(table), tool->cutoff_units,
+                     2, 3, row, row+1, GTK_FILL, 0, 0, 0);
+    row++;
+
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     tool->thickness = gtk_adjustment_new(tool->args.thickness,
                                          1, 128, 1, 10, 0);
-    gwy_table_attach_hscale(table, row, _("_Thickness:"), "px",
-                            tool->thickness, GWY_HSCALE_DEFAULT);
+    gwy_table_attach_adjbar(table, row, _("_Thickness:"), _("px"),
+                            tool->thickness,
+                            GWY_HSCALE_DEFAULT | GWY_HSCALE_SNAP);
     g_signal_connect(tool->thickness, "value-changed",
                      G_CALLBACK(gwy_tool_roughness_thickness_changed), tool);
     row++;
@@ -861,26 +876,20 @@ gwy_tool_roughness_init_dialog(GwyToolRoughness *tool)
                            (gwy_interpolation_type_get_enum(), -1,
                             G_CALLBACK(gwy_tool_roughness_interpolation_changed),
                             tool, tool->args.interpolation, TRUE);
-    gwy_table_attach_hscale(table, row, _("_Interpolation type:"), NULL,
-                            GTK_OBJECT(tool->interpolation), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("_Interpolation type:"), NULL,
+                            GTK_OBJECT(tool->interpolation),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
-    tool->target_hbox = hbox2 = gtk_hbox_new(FALSE, 6);
-    gtk_table_attach(GTK_TABLE(table), hbox2,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    label = gtk_label_new_with_mnemonic(_("Target _graph:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
-
     tool->target_graph = gwy_data_chooser_new_graphs();
     gwy_data_chooser_set_none(GWY_DATA_CHOOSER(tool->target_graph),
                               _("New graph"));
     gwy_data_chooser_set_active(GWY_DATA_CHOOSER(tool->target_graph), NULL, -1);
     gwy_data_chooser_set_filter(GWY_DATA_CHOOSER(tool->target_graph),
                                 filter_target_graphs, tool, NULL);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), tool->target_graph);
-    gtk_box_pack_end(GTK_BOX(hbox2), tool->target_graph, FALSE, FALSE, 0);
+    gwy_table_attach_adjbar(table, row, _("Target _graph:"), NULL,
+                            GTK_OBJECT(tool->target_graph),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     g_signal_connect_swapped(tool->target_graph, "changed",
                              G_CALLBACK(gwy_tool_roughness_target_changed),
                              tool);
@@ -1154,6 +1163,12 @@ gwy_tool_roughness_data_switched(GwyTool *gwytool,
                                 NULL);
         gwy_selection_set_max_objects(plain_tool->selection, 1);
         gwy_tool_roughness_update_units(tool);
+        gtk_label_set_markup(GTK_LABEL(tool->cutoff_units),
+                             plain_tool->coord_format->units);
+    }
+    else {
+        gtk_label_set_markup(GTK_LABEL(tool->cutoff_value), NULL);
+        gtk_label_set_markup(GTK_LABEL(tool->cutoff_units), NULL);
     }
 
     gwy_tool_roughness_update(tool);
@@ -1183,7 +1198,9 @@ gwy_tool_roughness_selection_changed(GwyPlainTool *plain_tool,
 
     if (plain_tool->selection) {
         n = gwy_selection_get_data(plain_tool->selection, NULL);
-        g_return_if_fail(n == 0 || n == 1);
+        /* We can get here before set-max-objects takes effect. */
+        if (!(n == 0 || n == 1))
+            return;
     }
 
     gwy_tool_roughness_update(tool);
@@ -1312,16 +1329,21 @@ gwy_tool_roughness_update(GwyToolRoughness *tool)
     gdouble line[4];
     gint xl1, yl1, xl2, yl2;
     gint n, lineres;
+    gdouble dx;
+    gchar buf[24];
 
     plain_tool = GWY_PLAIN_TOOL(tool);
     if (!plain_tool->selection
         || !(n = gwy_selection_get_data(plain_tool->selection, NULL))) {
         tool->have_data = FALSE;
         gwy_tool_roughness_update_graphs(tool);
-        gtk_tree_model_foreach(GTK_TREE_MODEL(tool->store),
-                               emit_row_changed, NULL);
+        if (tool->store) {
+            gtk_tree_model_foreach(GTK_TREE_MODEL(tool->store),
+                                   emit_row_changed, NULL);
+        }
         gtk_label_set_text(GTK_LABEL(tool->message_label),
                            _("No profile selected."));
+        gtk_label_set_text(GTK_LABEL(tool->cutoff_value), NULL);
         return;
     }
 
@@ -1346,6 +1368,11 @@ gwy_tool_roughness_update(GwyToolRoughness *tool)
                                                 lineres,
                                                 tool->args.thickness,
                                                 tool->args.interpolation);
+    dx = gwy_data_line_get_real(tool->dataline)/gwy_data_line_get_res(tool->dataline);
+    g_snprintf(buf, sizeof(buf), "%.*f",
+               plain_tool->coord_format->precision+1,
+               2*dx/tool->args.cutoff/plain_tool->coord_format->magnitude);
+    gtk_label_set_text(GTK_LABEL(tool->cutoff_value), buf);
 
     gwy_tool_roughness_set_data_from_profile(&tool->profiles,
                                              tool->dataline,
diff --git a/modules/tools/selectionmanager.c b/modules/tools/selectionmanager.c
index 251fbf4..17c3c66 100644
--- a/modules/tools/selectionmanager.c
+++ b/modules/tools/selectionmanager.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: selectionmanager.c 19039 2016-10-08 10:54:58Z yeti-dn $
+ *  @(#) $Id: selectionmanager.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2009,2012 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -149,7 +149,7 @@ static const ToolArgs default_args = {
     FALSE,
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, selectionmanager)
 
 G_DEFINE_TYPE(GwyToolSelectionManager, gwy_tool_selection_manager, GWY_TYPE_PLAIN_TOOL)
 
diff --git a/modules/tools/sfunctions.c b/modules/tools/sfunctions.c
index 3303b6a..e74e1bb 100644
--- a/modules/tools/sfunctions.c
+++ b/modules/tools/sfunctions.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: sfunctions.c 19095 2016-10-17 09:26:16Z yeti-dn $
+ *  @(#) $Id: sfunctions.c 20099 2017-07-29 03:58:05Z yeti-dn $
  *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -55,6 +55,8 @@ typedef enum {
     GWY_SF_RPSDF                  = 10,
     GWY_SF_RACF                   = 11,
     GWY_SF_RANGE                  = 12,
+    GWY_SF_ASG                    = 13,
+    GWY_SF_NFUNCTIONS
 } GwySFOutputType;
 
 enum {
@@ -87,6 +89,9 @@ struct _GwyToolSFunctions {
 
     GwyDataLine *line;
 
+    GwyDataField *cached_flipped_field;
+    GwyDataField *cached_fp_mask; /* Always INCLUDE, possibly flipped. */
+
     GtkWidget *graph;
     GwyGraphModel *gmodel;
 
@@ -97,14 +102,12 @@ struct _GwyToolSFunctions {
     GtkObject *resolution;
     GtkWidget *fixres;
     GtkWidget *interpolation;
-    GtkWidget *interpolation_label;
     GtkWidget *update;
     GtkWidget *apply;
     GtkWidget *separate;
     GSList *masking;
     GtkWidget *masking_label;
     GtkWidget *target_graph;
-    GtkWidget *target_hbox;
 
     gboolean has_calibration;
     gboolean has_uline;
@@ -172,8 +175,10 @@ static void     gwy_data_field_area_range                 (GwyDataField *dfield,
                                                            gint lineres);
 static void     update_unc_fields                         (GwyPlainTool *plain_tool);
 static gboolean sfunction_supports_masking                (GwySFOutputType type);
-static gboolean sfunction_has_explicit_resampling         (GwySFOutputType type);
+static gboolean sfunction_has_native_sampling             (GwySFOutputType type);
+static gboolean sfunction_has_interpolation               (GwySFOutputType type);
 static gboolean sfunction_has_direction                   (GwySFOutputType type);
+static gboolean sfunction_is_only_row_wise                (GwySFOutputType type);
 
 static GwyModuleInfo module_info = {
     GWY_MODULE_ABI_VERSION,
@@ -182,7 +187,7 @@ static GwyModuleInfo module_info = {
        "functions (height distribution, correlations, PSDF, Minkowski "
        "functionals) of selected part of data."),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "2.15",
+    "2.18",
     "David Nečas (Yeti) & Petr Klapetek",
     "2004",
 };
@@ -224,9 +229,10 @@ static const GwyEnum sf_types[] =  {
     { N_("Minkowski boundary"),          GWY_SF_MINKOWSKI_BOUNDARY,     },
     { N_("Minkowski connectivity"),      GWY_SF_MINKOWSKI_CONNECTIVITY, },
     { N_("Range"),                       GWY_SF_RANGE,                  },
+    { N_("Area scale graph"),            GWY_SF_ASG,                    },
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, sfunctions)
 
 G_DEFINE_TYPE(GwyToolSFunctions, gwy_tool_sfunctions, GWY_TYPE_PLAIN_TOOL)
 
@@ -294,6 +300,8 @@ gwy_tool_sfunctions_finalize(GObject *object)
     GWY_OBJECT_UNREF(tool->xunc);
     GWY_OBJECT_UNREF(tool->yunc);
     GWY_OBJECT_UNREF(tool->zunc);
+    GWY_OBJECT_UNREF(tool->cached_flipped_field);
+    GWY_OBJECT_UNREF(tool->cached_fp_mask);
 
     G_OBJECT_CLASS(gwy_tool_sfunctions_parent_class)->finalize(object);
 }
@@ -319,6 +327,8 @@ gwy_tool_sfunctions_init(GwyToolSFunctions *tool)
                                    &tool->args.masking);
     gwy_container_gis_enum_by_name(settings, output_type_key,
                                    &tool->args.output_type);
+    tool->args.output_type = CLAMP(tool->args.output_type,
+                                   0, GWY_SF_NFUNCTIONS);
     gwy_container_gis_boolean_by_name(settings, options_visible_key,
                                       &tool->args.options_visible);
     gwy_container_gis_boolean_by_name(settings, instant_update_key,
@@ -419,7 +429,7 @@ gwy_tool_sfunctions_init_dialog(GwyToolSFunctions *tool)
                      G_CALLBACK(gwy_tool_sfunctions_options_expanded), tool);
     gtk_box_pack_start(GTK_BOX(vbox), tool->options, FALSE, FALSE, 0);
 
-    table = GTK_TABLE(gtk_table_new(10, 4, FALSE));
+    table = GTK_TABLE(gtk_table_new(10, 3, FALSE));
     gtk_table_set_col_spacings(table, 6);
     gtk_table_set_row_spacings(table, 2);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -429,7 +439,7 @@ gwy_tool_sfunctions_init_dialog(GwyToolSFunctions *tool)
     tool->instant_update
         = gtk_check_button_new_with_mnemonic(_("_Instant updates"));
     gtk_table_attach(table, tool->instant_update,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tool->instant_update),
                                  tool->args.instant_update);
     g_signal_connect(tool->instant_update, "toggled",
@@ -440,7 +450,8 @@ gwy_tool_sfunctions_init_dialog(GwyToolSFunctions *tool)
     tool->resolution = gtk_adjustment_new(tool->args.resolution,
                                           MIN_RESOLUTION, MAX_RESOLUTION,
                                           1, 10, 0);
-    gwy_table_attach_hscale(GTK_WIDGET(table), row, _("_Fix res.:"), NULL,
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row,
+                            _("_Fixed resolution:"), NULL,
                             tool->resolution,
                             GWY_HSCALE_CHECK | GWY_HSCALE_SQRT);
     g_signal_connect_swapped(tool->resolution, "value-changed",
@@ -458,43 +469,29 @@ gwy_tool_sfunctions_init_dialog(GwyToolSFunctions *tool)
                         (directions, G_N_ELEMENTS(directions),
                         G_CALLBACK(gwy_tool_sfunctions_direction_changed), tool,
                         tool->args.direction);
-    row = gwy_radio_buttons_attach_to_table(tool->direction, table, 3, row);
+    row = gwy_radio_buttons_attach_to_table(tool->direction, table, 2, row);
     gtk_table_set_row_spacing(table, row-1, 8);
 
-    hbox2 = gtk_hbox_new(FALSE, 4);
-    gtk_table_attach(table, hbox2,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    label = gtk_label_new_with_mnemonic(_("_Interpolation type:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
-    tool->interpolation_label = label;
-
     tool->interpolation = gwy_enum_combo_box_new
                          (gwy_interpolation_type_get_enum(), -1,
                           G_CALLBACK(gwy_tool_sfunctions_interpolation_changed),
                           tool,
                           tool->args.interpolation, TRUE);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), tool->interpolation);
-    gtk_box_pack_end(GTK_BOX(hbox2), tool->interpolation, FALSE, FALSE, 0);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row,
+                            _("_Interpolation type:"), NULL,
+                            GTK_OBJECT(tool->interpolation),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
-    tool->target_hbox = hbox2 = gtk_hbox_new(FALSE, 6);
-    gtk_table_attach(table, hbox2,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    label = gtk_label_new_with_mnemonic(_("Target _graph:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
-
     tool->target_graph = gwy_data_chooser_new_graphs();
     gwy_data_chooser_set_none(GWY_DATA_CHOOSER(tool->target_graph),
                               _("New graph"));
     gwy_data_chooser_set_active(GWY_DATA_CHOOSER(tool->target_graph), NULL, -1);
     gwy_data_chooser_set_filter(GWY_DATA_CHOOSER(tool->target_graph),
                                 filter_target_graphs, tool, NULL);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), tool->target_graph);
-    gtk_box_pack_end(GTK_BOX(hbox2), tool->target_graph, FALSE, FALSE, 0);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row, _("Target _graph:"), NULL,
+                            GTK_OBJECT(tool->target_graph),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     g_signal_connect_swapped(tool->target_graph, "changed",
                              G_CALLBACK(gwy_tool_sfunctions_target_changed),
                              tool);
@@ -507,7 +504,7 @@ gwy_tool_sfunctions_init_dialog(GwyToolSFunctions *tool)
     g_signal_connect(tool->separate, "toggled",
                      G_CALLBACK(gwy_tool_sfunctions_separate_changed), tool);
     gtk_table_attach(table, tool->separate,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
 
     row++;
 
@@ -515,7 +512,7 @@ gwy_tool_sfunctions_init_dialog(GwyToolSFunctions *tool)
     gtk_table_set_row_spacing(table, row-1, 8);
     label = tool->masking_label = gwy_label_new_header(_("Masking Mode"));
     gtk_table_attach(table, label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     tool->masking
@@ -523,7 +520,7 @@ gwy_tool_sfunctions_init_dialog(GwyToolSFunctions *tool)
                                    G_CALLBACK(gwy_tool_sfunctions_masking_changed),
                                    tool,
                                    tool->args.masking);
-    row = gwy_radio_buttons_attach_to_table(tool->masking, table, 3, row);
+    row = gwy_radio_buttons_attach_to_table(tool->masking, table, 2, row);
 
     tool->gmodel = gwy_graph_model_new();
 
@@ -565,6 +562,9 @@ gwy_tool_sfunctions_data_switched(GwyTool *gwytool,
         return;
 
     tool = GWY_TOOL_SFUNCTIONS(gwytool);
+    GWY_OBJECT_UNREF(tool->cached_flipped_field);
+    GWY_OBJECT_UNREF(tool->cached_fp_mask);
+
     if (data_view) {
         gwy_object_set_or_reset(plain_tool->layer,
                                 tool->layer_type_rect,
@@ -595,9 +595,12 @@ gwy_tool_sfunctions_response(GwyTool *tool,
 static void
 gwy_tool_sfunctions_data_changed(GwyPlainTool *plain_tool)
 {
+    GwyToolSFunctions *tool = GWY_TOOL_SFUNCTIONS(plain_tool);
+
+    GWY_OBJECT_UNREF(tool->cached_flipped_field);
     update_unc_fields(plain_tool);
-    gwy_tool_sfunctions_update_curve(GWY_TOOL_SFUNCTIONS(plain_tool));
-    gwy_tool_sfunctions_update_target_graphs(GWY_TOOL_SFUNCTIONS(plain_tool));
+    gwy_tool_sfunctions_update_curve(tool);
+    gwy_tool_sfunctions_update_target_graphs(tool);
 }
 
 static void
@@ -605,6 +608,7 @@ gwy_tool_sfunctions_mask_changed(GwyPlainTool *plain_tool)
 {
     GwyToolSFunctions *tool = GWY_TOOL_SFUNCTIONS(plain_tool);
 
+    GWY_OBJECT_UNREF(tool->cached_fp_mask);
     if (sfunction_supports_masking(tool->args.output_type))
         gwy_tool_sfunctions_update_curve(tool);
 }
@@ -637,22 +641,23 @@ gwy_tool_sfunctions_selection_changed(GwyPlainTool *plain_tool,
 static void
 gwy_tool_sfunctions_update_sensitivity(GwyToolSFunctions *tool)
 {
+    ToolArgs *args = &tool->args;
     gboolean sensitive;
     GSList *l;
 
-    gtk_widget_set_sensitive(tool->update, !tool->args.instant_update);
-    gwy_table_hscale_set_sensitive(tool->resolution, tool->args.fixres);
+    gtk_widget_set_sensitive(tool->update, !args->instant_update);
+    sensitive = !sfunction_has_native_sampling(args->output_type);
+    gwy_table_hscale_set_sensitive(tool->resolution, sensitive);
 
-    sensitive = (sfunction_has_explicit_resampling(tool->args.output_type)
-                 && tool->args.fixres);
-    gtk_widget_set_sensitive(tool->interpolation, sensitive);
-    gtk_widget_set_sensitive(tool->interpolation_label, sensitive);
+    sensitive = (sfunction_has_interpolation(args->output_type)
+                 && args->fixres);
+    gwy_table_hscale_set_sensitive(GTK_OBJECT(tool->interpolation), sensitive);
 
-    sensitive = sfunction_has_direction(tool->args.output_type);
+    sensitive = sfunction_has_direction(args->output_type);
     for (l = tool->direction; l; l = g_slist_next(l))
         gtk_widget_set_sensitive(GTK_WIDGET(l->data), sensitive);
 
-    sensitive = sfunction_supports_masking(tool->args.output_type);
+    sensitive = sfunction_supports_masking(args->output_type);
     gtk_widget_set_sensitive(tool->masking_label, sensitive);
     for (l = tool->masking; l; l = g_slist_next(l))
         gtk_widget_set_sensitive(GTK_WIDGET(l->data), sensitive);
@@ -662,7 +667,7 @@ static void
 gwy_tool_sfunctions_update_curve(GwyToolSFunctions *tool)
 {
     GwyPlainTool *plain_tool;
-    GwyDataField *dfield, *mask, *tmp_mask = NULL;
+    GwyDataField *dfield, *mask, *mask_to_use = NULL, *field_to_use;
     GwyOrientation dir = tool->args.direction;
     GwyInterpolationType interp = tool->args.interpolation;
     GwyGraphModel *gmodel = tool->gmodel;
@@ -671,6 +676,7 @@ gwy_tool_sfunctions_update_curve(GwyToolSFunctions *tool)
     gint isel[4] = { sizeof("Die, die, GCC!"), 0, 0, 0 };
     gint n, nsel, lineres, w = sizeof("Die, die, GCC!"), h = 0;
     const gchar *title, *xlabel, *ylabel;
+    gboolean xy_is_flipped;
 
     plain_tool = GWY_PLAIN_TOOL(tool);
     dfield = plain_tool->data_field;
@@ -712,24 +718,51 @@ gwy_tool_sfunctions_update_curve(GwyToolSFunctions *tool)
 
     tool->has_uline = FALSE;
     lineres = tool->args.fixres ? tool->args.resolution : -1;
-    if (sfunction_supports_masking(tool->args.output_type) && mask) {
-        if (tool->args.masking == GWY_MASK_EXCLUDE) {
-            tmp_mask = gwy_data_field_duplicate(mask);
-            gwy_data_field_grains_invert(tmp_mask);
+
+    /* Create transformed/inverted mask as necesary and remember it.  Keep
+     * mask_to_use as NULL if we do not want masking.  */
+    if (sfunction_supports_masking(tool->args.output_type)
+        && tool->args.masking != GWY_MASK_IGNORE
+        && mask) {
+        if (!tool->cached_fp_mask) {
+            if (sfunction_is_only_row_wise(tool->args.output_type)
+                && tool->args.direction == GWY_ORIENTATION_VERTICAL) {
+                tool->cached_fp_mask = gwy_data_field_new_alike(mask, FALSE);
+                gwy_data_field_flip_xy(mask, tool->cached_fp_mask, FALSE);
+            }
+            else
+                tool->cached_fp_mask = gwy_data_field_duplicate(mask);
+
+            if (tool->args.masking == GWY_MASK_EXCLUDE)
+                gwy_data_field_grains_invert(tool->cached_fp_mask);
+        }
+        mask_to_use = tool->cached_fp_mask;
+    }
+
+    field_to_use = dfield;
+    xy_is_flipped = FALSE;
+    if (sfunction_is_only_row_wise(tool->args.output_type)
+        && tool->args.direction == GWY_ORIENTATION_VERTICAL) {
+        if (!tool->cached_flipped_field) {
+            tool->cached_flipped_field = gwy_data_field_new_alike(dfield,
+                                                                  FALSE);
+            gwy_data_field_flip_xy(dfield, tool->cached_flipped_field, FALSE);
         }
-        else if (tool->args.masking == GWY_MASK_INCLUDE)
-            tmp_mask = g_object_ref(mask);
-        /* Otherwise keep tmp_mask as NULL. */
+        field_to_use = tool->cached_flipped_field;
+        xy_is_flipped = TRUE;
+        GWY_SWAP(gint, isel[0], isel[1]);
+        GWY_SWAP(gint, w, h);
     }
 
     switch (tool->args.output_type) {
         case GWY_SF_DH:
-        gwy_data_field_area_dh(dfield, tmp_mask, tool->line,
+        gwy_data_field_area_dh(field_to_use, mask_to_use, tool->line,
                                isel[0], isel[1], w, h, lineres);
         xlabel = "z";
         ylabel = "ρ";
         if (tool->has_calibration) {
-            gwy_data_field_area_dh_uncertainty(dfield, tool->zunc, tmp_mask,
+            gwy_data_field_area_dh_uncertainty(field_to_use, tool->zunc,
+                                               mask_to_use,
                                                tool->uline,
                                                isel[0], isel[1], w, h,
                                                lineres);
@@ -738,12 +771,13 @@ gwy_tool_sfunctions_update_curve(GwyToolSFunctions *tool)
         break;
 
         case GWY_SF_CDH:
-        gwy_data_field_area_cdh(dfield, tmp_mask, tool->line,
+        gwy_data_field_area_cdh(field_to_use, mask_to_use, tool->line,
                                 isel[0], isel[1], w, h, lineres);
         xlabel = "z";
         ylabel = "D";
         if (tool->has_calibration) {
-            gwy_data_field_area_cdh_uncertainty(dfield, tool->zunc, tmp_mask,
+            gwy_data_field_area_cdh_uncertainty(field_to_use,
+                                                tool->zunc, mask_to_use,
                                                 tool->uline,
                                                 isel[0], isel[1], w, h,
                                                 lineres);
@@ -752,26 +786,30 @@ gwy_tool_sfunctions_update_curve(GwyToolSFunctions *tool)
         break;
 
         case GWY_SF_DA:
-        gwy_data_field_area_da(dfield, tool->line, isel[0], isel[1], w, h,
-                               dir, lineres);
+        gwy_data_field_area_da_mask(field_to_use, mask_to_use, tool->line,
+                                    isel[0], isel[1], w, h, dir, lineres);
         xlabel = "tan β";
         ylabel = "ρ";
         break;
 
         case GWY_SF_CDA:
-        gwy_data_field_area_cda(dfield, tool->line, isel[0], isel[1], w, h,
-                                dir, lineres);
+        gwy_data_field_area_cda_mask(field_to_use, mask_to_use, tool->line,
+                                     isel[0], isel[1], w, h, dir, lineres);
         xlabel = "tan β";
         ylabel = "D";
         break;
 
         case GWY_SF_ACF:
-        gwy_data_field_area_acf(dfield, tool->line, isel[0], isel[1], w, h,
-                                dir, interp, lineres);
+        g_object_unref(tool->line);
+        tool->line = gwy_data_field_area_row_acf(field_to_use,
+                                                 mask_to_use, GWY_MASK_INCLUDE,
+                                                 isel[0], isel[1], w, h, 1,
+                                                 NULL);
         xlabel = "τ";
         ylabel = "G";
-        if (tool->has_calibration) {
-            gwy_data_field_area_acf_uncertainty(dfield, tool->zunc, tool->uline,
+        if (tool->has_calibration && !xy_is_flipped) {
+            gwy_data_field_area_acf_uncertainty(field_to_use,
+                                                tool->zunc, tool->uline,
                                                 isel[0], isel[1], w, h,
                                                 dir, interp, lineres);
             tool->has_uline = TRUE;
@@ -779,12 +817,16 @@ gwy_tool_sfunctions_update_curve(GwyToolSFunctions *tool)
         break;
 
         case GWY_SF_HHCF:
-        gwy_data_field_area_hhcf(dfield, tool->line, isel[0], isel[1], w, h,
-                                 dir, interp, lineres);
+        g_object_unref(tool->line);
+        tool->line = gwy_data_field_area_row_hhcf(field_to_use,
+                                                  mask_to_use, GWY_MASK_INCLUDE,
+                                                  isel[0], isel[1], w, h, 1,
+                                                  NULL);
         xlabel = "τ";
         ylabel = "H";
-        if (tool->has_calibration) {
-            gwy_data_field_area_hhcf_uncertainty(dfield, tool->zunc, tool->uline,
+        if (tool->has_calibration && !xy_is_flipped) {
+            gwy_data_field_area_hhcf_uncertainty(field_to_use,
+                                                 tool->zunc, tool->uline,
                                                  isel[0], isel[1], w, h,
                                                  dir, interp, lineres);
             tool->has_uline = TRUE;
@@ -792,59 +834,73 @@ gwy_tool_sfunctions_update_curve(GwyToolSFunctions *tool)
         break;
 
         case GWY_SF_PSDF:
-        gwy_data_field_area_psdf(dfield, tool->line, isel[0], isel[1], w, h,
-                                 dir, interp, GWY_WINDOWING_HANN, lineres);
+        g_object_unref(tool->line);
+        tool->line = gwy_data_field_area_row_psdf(field_to_use,
+                                                  mask_to_use, GWY_MASK_INCLUDE,
+                                                  isel[0], isel[1], w, h,
+                                                  GWY_WINDOWING_HANN, 1);
         xlabel = "k";
         ylabel = "W<sub>1</sub>";
         break;
 
         case GWY_SF_MINKOWSKI_VOLUME:
-        gwy_data_field_area_minkowski_volume(dfield, tool->line,
+        gwy_data_field_area_minkowski_volume(field_to_use, tool->line,
                                              isel[0], isel[1], w, h, lineres);
         xlabel = "z";
         ylabel = "V";
         break;
 
         case GWY_SF_MINKOWSKI_BOUNDARY:
-        gwy_data_field_area_minkowski_boundary(dfield, tool->line,
+        gwy_data_field_area_minkowski_boundary(field_to_use, tool->line,
                                                isel[0], isel[1], w, h, lineres);
         xlabel = "z";
         ylabel = "S";
         break;
 
         case GWY_SF_MINKOWSKI_CONNECTIVITY:
-        gwy_data_field_area_minkowski_euler(dfield, tool->line,
+        gwy_data_field_area_minkowski_euler(field_to_use, tool->line,
                                             isel[0], isel[1], w, h, lineres);
         xlabel = "z";
         ylabel = "χ";
         break;
 
         case GWY_SF_RPSDF:
-        gwy_data_field_area_rpsdf(dfield, tool->line, isel[0], isel[1], w, h,
+        gwy_data_field_area_rpsdf(field_to_use, tool->line,
+                                  isel[0], isel[1], w, h,
                                   interp, GWY_WINDOWING_HANN, lineres);
         xlabel = "k";
         ylabel = "W<sub>r</sub>";
         break;
 
         case GWY_SF_RACF:
-        gwy_data_field_area_racf(dfield, tool->line, isel[0], isel[1], w, h,
+        gwy_data_field_area_racf(field_to_use, tool->line,
+                                 isel[0], isel[1], w, h,
                                  lineres);
         xlabel = "τ";
         ylabel = "G<sub>r</sub>";
         break;
 
         case GWY_SF_RANGE:
-        gwy_data_field_area_range(dfield, tool->line, isel[0], isel[1], w, h,
+        gwy_data_field_area_range(field_to_use, tool->line,
+                                  isel[0], isel[1], w, h,
                                   dir, interp, lineres);
         xlabel = "τ";
         ylabel = "R";
         break;
 
+        case GWY_SF_ASG:
+        g_object_unref(tool->line);
+        tool->line = gwy_data_field_area_row_asg(field_to_use,
+                                                 mask_to_use, GWY_MASK_INCLUDE,
+                                                 isel[0], isel[1], w, h, 1);
+        xlabel = "τ";
+        ylabel = "A<sub>excess</sub>";
+        break;
+
         default:
         g_return_if_reached();
         break;
     }
-    GWY_OBJECT_UNREF(tmp_mask);
 
     if (nsel > 0 && n == 0) {
         gcmodel = gwy_graph_curve_model_new();
@@ -942,6 +998,7 @@ gwy_tool_sfunctions_direction_changed(G_GNUC_UNUSED GObject *button,
                                       GwyToolSFunctions *tool)
 {
     tool->args.direction = gwy_radio_buttons_get_current(tool->direction);
+    GWY_OBJECT_UNREF(tool->cached_fp_mask);
     gwy_tool_sfunctions_update_curve(tool);
 }
 
@@ -979,6 +1036,7 @@ gwy_tool_sfunctions_masking_changed(GtkWidget *button,
 
     plain_tool = GWY_PLAIN_TOOL(tool);
     tool->args.masking = gwy_radio_button_get_value(button);
+    GWY_OBJECT_UNREF(tool->cached_fp_mask);
     if (plain_tool->data_field && plain_tool->mask_field)
         gwy_tool_sfunctions_update_curve(tool);
 }
@@ -1172,22 +1230,40 @@ update_unc_fields(GwyPlainTool *plain_tool)
 static gboolean
 sfunction_supports_masking(GwySFOutputType type)
 {
-    return (type == GWY_SF_DH || type == GWY_SF_CDH);
+    return (type == GWY_SF_DH || type == GWY_SF_CDH
+            || type == GWY_SF_DA || type == GWY_SF_CDA
+            || type == GWY_SF_ACF || type == GWY_SF_HHCF || type == GWY_SF_ASG
+            || type == GWY_SF_PSDF);
 }
 
 static gboolean
-sfunction_has_explicit_resampling(GwySFOutputType type)
+sfunction_has_native_sampling(GwySFOutputType type)
 {
-    return (type == GWY_SF_ACF || type == GWY_SF_HHCF
-            || type == GWY_SF_PSDF || type == GWY_SF_RPSDF
+    return (type == GWY_SF_ACF || type == GWY_SF_HHCF || type == GWY_SF_ASG
+            || type == GWY_SF_PSDF
             || type == GWY_SF_RANGE);
 }
 
 static gboolean
+sfunction_has_interpolation(GwySFOutputType type)
+{
+    /* RACF has no interpolation argument and all the other related functions
+     * have native sampling so we do not want interpolation. */
+    return (type == GWY_SF_RPSDF);
+}
+
+static gboolean
 sfunction_has_direction(GwySFOutputType type)
 {
     return (type == GWY_SF_DA || type == GWY_SF_CDA
-            || type == GWY_SF_ACF || type == GWY_SF_HHCF
+            || type == GWY_SF_ACF || type == GWY_SF_HHCF || type == GWY_SF_ASG
+            || type == GWY_SF_PSDF);
+}
+
+static gboolean
+sfunction_is_only_row_wise(GwySFOutputType type)
+{
+    return (type == GWY_SF_ACF || type == GWY_SF_HHCF || type == GWY_SF_ASG
             || type == GWY_SF_PSDF);
 }
 
diff --git a/modules/tools/spectro.c b/modules/tools/spectro.c
index e84b800..9e262d2 100644
--- a/modules/tools/spectro.c
+++ b/modules/tools/spectro.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: spectro.c 19039 2016-10-08 10:54:58Z yeti-dn $
+ *  @(#) $Id: spectro.c 20071 2017-07-12 07:49:00Z yeti-dn $
  *  Copyright (C) 2003-2014 Owain Davies, David Necas (Yeti), Petr Klapetek.
  *  E-mail: owain.davies at blueyonder.co.uk, yeti at gwyddion.net,
  *          klapetek at gwyddion.net.
@@ -71,6 +71,7 @@ struct _GwyToolSpectro {
     GtkTreeModel *model;
 
     GwyDataLine *line;
+    GwyDataLine *weights;
     GtkWidget *graph;
     GwyGraphModel *gmodel;
     GwySpectra *spectra;
@@ -119,8 +120,10 @@ static void     gwy_tool_spectro_show_curve          (GwyToolSpectro *tool,
                                                       gint i);
 static void     gwy_tool_spectro_gather_curve        (GwyToolSpectro *tool,
                                                       gint i);
-static void     gwy_tool_spectro_show_averaged       (GwyToolSpectro *tool,
-                                                      guint nsel);
+static void     accumulate_lines                     (GwyDataLine *accum,
+                                                      GwyDataLine *dline,
+                                                      GwyDataLine *weights);
+static void     gwy_tool_spectro_show_averaged       (GwyToolSpectro *tool);
 static void     gwy_tool_spectro_update_header       (GwyToolSpectro *tool,
                                                       guint col,
                                                       GString *str,
@@ -150,7 +153,7 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Point Spectrum, extracts point spectra to a graph."),
     "Owain Davies <owain.davies at blueyonder.co.uk>",
-    "0.10",
+    "0.11",
     "Owain Davies, David Nečas (Yeti) & Petr Klapetek",
     "2006",
 };
@@ -166,7 +169,7 @@ static const ToolArgs default_args = {
     GWY_APP_DATA_ID_NONE,
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, spectro)
 
 G_DEFINE_TYPE(GwyToolSpectro, gwy_tool_spectro, GWY_TYPE_PLAIN_TOOL)
 
@@ -650,7 +653,7 @@ gwy_tool_spectro_tree_sel_changed(GtkTreeSelection *selection,
     }
 
     if (tool->args.average && nsel)
-        gwy_tool_spectro_show_averaged(tool, nsel);
+        gwy_tool_spectro_show_averaged(tool);
 }
 
 static void
@@ -739,33 +742,73 @@ gwy_tool_spectro_gather_curve(GwyToolSpectro *tool,
 {
     GwyPlainTool *plain_tool;
     GwyDataLine *spectrum;
-    gint i, n;
 
     plain_tool = GWY_PLAIN_TOOL(tool);
     g_return_if_fail(plain_tool->selection);
 
     spectrum = gwy_spectra_get_spectrum(tool->spectra, id);
-    if (!tool->line)
+    if (!tool->line) {
+        /* Use the first selected line as the template. */
         tool->line = gwy_data_line_duplicate(spectrum);
+        tool->weights = gwy_data_line_new_alike(spectrum, TRUE);
+        gwy_data_line_fill(tool->weights, 1.0);
+    }
     else {
-        gdouble *sdata, *data;
-
+        /* Accumulate the others. */
         g_return_if_fail(tool->line);
-        n = gwy_data_line_get_res(tool->line);
-        g_return_if_fail(gwy_data_line_get_res(spectrum) == n);
-        sdata = gwy_data_line_get_data(spectrum);
-        data = gwy_data_line_get_data(tool->line);
-        for (i = 0; i < n; i++)
-            data[i] += sdata[i];
+        g_return_if_fail(tool->weights);
+        accumulate_lines(tool->line, spectrum, tool->weights);
+    }
+}
+
+static void
+accumulate_lines(GwyDataLine *accum, GwyDataLine *dline, GwyDataLine *weights)
+{
+    gint i, n, n1;
+    gdouble *adata, *data, *wdata;
+    gdouble real, off, real1, off1;
+
+    n = gwy_data_line_get_res(accum);
+    n1 = gwy_data_line_get_res(dline);
+    data = gwy_data_line_get_data(dline);
+    adata = gwy_data_line_get_data(accum);
+    real = gwy_data_line_get_real(accum);
+    real1 = gwy_data_line_get_real(dline);
+    off = gwy_data_line_get_offset(accum);
+    off1 = gwy_data_line_get_offset(dline);
+
+    if (n1 == n
+        && fabs(real1 - real) <= 1e-9*(fabs(real1) + fabs(real))
+        && fabs(off1 - off) <= 1e-9*(fabs(off1) + fabs(off))) {
+        for (i = 0; i < n1; i++)
+            adata[i] += data[i];
+        gwy_data_line_add(weights, 1.0);
+        return;
+    }
+
+    if (off1 >= real + off || off >= real1 + off1)
+        return;
+
+    /* This is not very good but better than a CRTICIAL message we used to
+     * do here... */
+    wdata = gwy_data_line_get_data(weights);
+    for (i = 0; i < n; i++) {
+        gdouble x = (i + 0.5)*real/n + off;
+        gint j = floor((x - off1)/real1*n1);
+        if (j >= 0 && j+1 < n1) {
+            adata[i] += data[j];
+            wdata[i] += 1.0;
+        }
     }
 }
 
 static void
-gwy_tool_spectro_show_averaged(GwyToolSpectro *tool,
-                               guint nsel)
+gwy_tool_spectro_show_averaged(GwyToolSpectro *tool)
 {
     GwyGraphCurveModel *gcmodel;
     const GwyRGBA *rgba;
+    gdouble *adata, *wdata;
+    gint i, n;
 
     gcmodel = gwy_graph_curve_model_new();
     rgba = gwy_graph_get_preset_color(0);
@@ -774,13 +817,18 @@ gwy_tool_spectro_show_averaged(GwyToolSpectro *tool,
                  "description", gwy_spectra_get_title(tool->spectra),
                  "color", rgba,
                  NULL);
-    gwy_data_line_multiply(tool->line, 1.0/nsel);
+    n = gwy_data_line_get_res(tool->line);
+    adata = gwy_data_line_get_data(tool->line);
+    wdata = gwy_data_line_get_data(tool->weights);
+    for (i = 0; i < n; i++)
+        adata[i] /= wdata[i];
     gwy_graph_curve_model_set_data_from_dataline(gcmodel, tool->line, 0, 0);
     gwy_graph_model_add_curve(tool->gmodel, gcmodel);
     g_object_unref(gcmodel);
 
     gwy_graph_model_set_units_from_data_line(tool->gmodel, tool->line);
     GWY_OBJECT_UNREF(tool->line);
+    GWY_OBJECT_UNREF(tool->weights);
 }
 
 static void
@@ -872,10 +920,7 @@ gwy_tool_spectro_render_color(G_GNUC_UNUSED GtkCellLayout *layout,
             if (GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(gcmodel),
                                                    "sid")) == idx) {
                 g_object_get(gcmodel, "color", &rgba, NULL);
-                pixel = 0xff
-                    | ((guint32)(guchar)floor(255.99999*rgba->b) << 8)
-                    | ((guint32)(guchar)floor(255.99999*rgba->g) << 16)
-                    | ((guint32)(guchar)floor(255.99999*rgba->r) << 24);
+                pixel = 0xff | gwy_rgba_to_pixbuf_pixel(rgba);
                 gwy_rgba_free(rgba);
                 break;
             }
diff --git a/modules/tools/spotremove.c b/modules/tools/spotremove.c
index 2ca1464..ec911a1 100644
--- a/modules/tools/spotremove.c
+++ b/modules/tools/spotremove.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: spotremove.c 19039 2016-10-08 10:54:58Z yeti-dn $
+ *  @(#) $Id: spotremove.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2003-2006 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -176,7 +176,7 @@ static const InterpolateFunc method_functions[] = {
     &fractal_average,
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, spotremove)
 
 G_DEFINE_TYPE(GwyToolSpotRemover, gwy_tool_spot_remover, GWY_TYPE_PLAIN_TOOL)
 
diff --git a/modules/tools/stats.c b/modules/tools/stats.c
index b1bf617..e7de682 100644
--- a/modules/tools/stats.c
+++ b/modules/tools/stats.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: stats.c 19041 2016-10-08 13:12:34Z yeti-dn $
+ *  @(#) $Id: stats.c 20111 2017-07-30 14:08:43Z yeti-dn $
  *  Copyright (C) 2003-2016 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
@@ -236,7 +236,7 @@ static const ToolArgs default_args = {
     GWY_MASK_IGNORE,
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, stats)
 
 G_DEFINE_TYPE(GwyToolStats, gwy_tool_stats, GWY_TYPE_PLAIN_TOOL)
 
@@ -305,7 +305,7 @@ gwy_tool_stats_init(GwyToolStats *tool)
         return;
 
     plain_tool->lazy_updates = TRUE;
-    plain_tool->unit_style = GWY_SI_UNIT_FORMAT_MARKUP;
+    plain_tool->unit_style = GWY_SI_UNIT_FORMAT_VFMARKUP;
 
     settings = gwy_app_settings_get();
     tool->args = default_args;
@@ -316,7 +316,7 @@ gwy_tool_stats_init(GwyToolStats *tool)
     tool->args.masking = gwy_enum_sanitize_value(tool->args.masking,
                                                  GWY_TYPE_MASKING_TYPE);
 
-    tool->angle_format = gwy_si_unit_value_format_new(1.0, 1, "deg");
+    tool->angle_format = gwy_si_unit_value_format_new(1.0, 1, _("deg"));
     gwy_plain_tool_connect_selection(plain_tool, tool->layer_type_rect,
                                      "rectangle");
 
@@ -387,8 +387,7 @@ gwy_tool_stats_init_dialog(GwyToolStats *tool)
     row = 0;
 
     label = gwy_label_new_header(_("Masking Mode"));
-    gtk_table_attach(table, label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, label, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     tool->masking
@@ -400,14 +399,13 @@ gwy_tool_stats_init_dialog(GwyToolStats *tool)
     gtk_table_set_row_spacing(table, row-1, 8);
 
     label = gwy_label_new_header(_("Options"));
-    gtk_table_attach(table, label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, label, 0, 3, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     tool->instant_update
         = gtk_check_button_new_with_mnemonic(_("_Instant updates"));
     gtk_table_attach(table, tool->instant_update,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 3, row, row+1, GTK_FILL, 0, 0, 0);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tool->instant_update),
                                  tool->args.instant_update);
     g_signal_connect(tool->instant_update, "toggled",
@@ -423,21 +421,20 @@ gwy_tool_stats_init_dialog(GwyToolStats *tool)
     row = 0;
 
     gtk_table_attach(table, gwy_label_new_header(_("Parameters")),
-                     0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     for (i = 0; i < G_N_ELEMENTS(values); i++) {
         label = gtk_label_new(_(values[i].name));
         gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-        gtk_table_attach(table, label,
-                         0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+        gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
 
         plabel = (GtkWidget**)G_STRUCT_MEMBER_P(tool, values[i].offset);
         *plabel = gtk_label_new(NULL);
         gtk_misc_set_alignment(GTK_MISC(*plabel), 1.0, 0.5);
         gtk_label_set_selectable(GTK_LABEL(*plabel), TRUE);
-        gtk_table_attach(table, *plabel,
-                         1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+        gtk_table_attach(table, *plabel, 1, 2, row, row+1,
+                         GTK_EXPAND | GTK_FILL, 0, 0, 0);
 
         row++;
     }
@@ -513,7 +510,6 @@ gwy_tool_stats_data_switched(GwyTool *gwytool,
 
     gtk_widget_set_sensitive(tool->copy, data_view != NULL);
     gtk_widget_set_sensitive(tool->save, data_view != NULL);
-
 }
 
 static void
diff --git a/modules/tools/tools.c b/modules/tools/tools.c
new file mode 100644
index 0000000..0638db3
--- /dev/null
+++ b/modules/tools/tools.c
@@ -0,0 +1,60 @@
+/* This is a GENERATED file. */
+#include <glib.h>
+#include <libgwymodule/gwymodule.h>
+
+static const GwyModuleRecord* register_bundle(void);
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION | GWY_MODULE_BUNDLE_FLAG,
+    (GwyModuleRegisterFunc)&register_bundle,
+    NULL, NULL, NULL, NULL, NULL,
+};
+
+GWY_MODULE_QUERY(module_info)
+
+GwyModuleInfo* _gwy_module_query__crop(void);
+GwyModuleInfo* _gwy_module_query__distance(void);
+GwyModuleInfo* _gwy_module_query__filter(void);
+GwyModuleInfo* _gwy_module_query__grainmeasure(void);
+GwyModuleInfo* _gwy_module_query__grainremover(void);
+GwyModuleInfo* _gwy_module_query__icolorange(void);
+GwyModuleInfo* _gwy_module_query__level3(void);
+GwyModuleInfo* _gwy_module_query__linestats(void);
+GwyModuleInfo* _gwy_module_query__maskedit(void);
+GwyModuleInfo* _gwy_module_query__pathlevel(void);
+GwyModuleInfo* _gwy_module_query__profile(void);
+GwyModuleInfo* _gwy_module_query__readvalue(void);
+GwyModuleInfo* _gwy_module_query__roughness(void);
+GwyModuleInfo* _gwy_module_query__selectionmanager(void);
+GwyModuleInfo* _gwy_module_query__sfunctions(void);
+GwyModuleInfo* _gwy_module_query__spotremove(void);
+GwyModuleInfo* _gwy_module_query__spectro(void);
+GwyModuleInfo* _gwy_module_query__stats(void);
+
+static const GwyModuleRecord modules[] = {
+  { _gwy_module_query__crop, "crop", },
+  { _gwy_module_query__distance, "distance", },
+  { _gwy_module_query__filter, "filter", },
+  { _gwy_module_query__grainmeasure, "grainmeasure", },
+  { _gwy_module_query__grainremover, "grainremover", },
+  { _gwy_module_query__icolorange, "icolorange", },
+  { _gwy_module_query__level3, "level3", },
+  { _gwy_module_query__linestats, "linestats", },
+  { _gwy_module_query__maskedit, "maskedit", },
+  { _gwy_module_query__pathlevel, "pathlevel", },
+  { _gwy_module_query__profile, "profile", },
+  { _gwy_module_query__readvalue, "readvalue", },
+  { _gwy_module_query__roughness, "roughness", },
+  { _gwy_module_query__selectionmanager, "selectionmanager", },
+  { _gwy_module_query__sfunctions, "sfunctions", },
+  { _gwy_module_query__spotremove, "spotremove", },
+  { _gwy_module_query__spectro, "spectro", },
+  { _gwy_module_query__stats, "stats", },
+  { NULL, NULL, },
+};
+
+static const GwyModuleRecord*
+register_bundle(void)
+{
+    return modules;
+}
diff --git a/modules/volume/Makefile.am b/modules/volume/Makefile.am
index 63c2d7d..eb6e36d 100644
--- a/modules/volume/Makefile.am
+++ b/modules/volume/Makefile.am
@@ -1,4 +1,4 @@
-# @(#) $Id: Makefile.am 17426 2015-09-20 09:16:12Z yeti-dn $
+# @(#) $Id: Makefile.am 20017 2017-07-03 21:44:28Z yeti-dn $
 
 # Put sources that are for some reason disabled yet present in svn checkouts
 # here.  This makes them distributed and translations of their messages are
@@ -7,7 +7,10 @@ disabled_sources =
 
 volumedir = $(pkglibdir)/modules/volume
 
-volume_LTLIBRARIES = \
+# Only bundle modules without own dependencies.  If something goes wrong with
+# any required libraries at run-time, it will at most break these individual
+# unbundled modules, not the bundle.
+bundlable_modules = \
 	volume_calibrate.la \
 	volume_extract.la \
 	volume_fdfit.la \
@@ -16,7 +19,21 @@ volume_LTLIBRARIES = \
 	volume_kmedians.la \
 	volume_linestat.la \
 	volume_slice.la \
-	volume_zcal.la
+	volume_swaxes.la \
+	volume_zcal.la \
+	volumeops.la
+
+# volume_modules is either the bundle or all the individual modules.
+if MODULE_BUNDLING
+volume_modules = volume.la
+BUILT_SOURCES = volume.c
+volume_la_CFLAGS = $(AM_CFLAGS) -DGWY_MODULE_BUNDLING
+else
+volume_modules = $(bundlable_modules)
+endif
+
+volume_LTLIBRARIES = \
+	$(volume_modules)
 
 EXTRA_DIST = \
 	$(disabled_sources)
@@ -25,10 +42,6 @@ if OS_MSWIN
 no_undefined = -no-undefined
 endif
 
-AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
-AM_CFLAGS = @COMMON_CFLAGS@
-AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
-
 if MODULE_DEPENDENCIES
 module_libadd = \
 	$(top_builddir)/app/libgwyapp2.la \
@@ -40,6 +53,10 @@ module_libadd = \
 	@GTK_LIBS@
 endif
 
+AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
+AM_CFLAGS = @COMMON_CFLAGS@
+AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
+
 volume_calibrate_la_SOURCES = volume_calibrate.c
 volume_extract_la_SOURCES   = volume_extract.c
 volume_fdfit_la_SOURCES     = volume_fdfit.c
@@ -48,7 +65,28 @@ volume_kmeans_la_SOURCES    = volume_kmeans.c
 volume_kmedians_la_SOURCES  = volume_kmedians.c
 volume_linestat_la_SOURCES  = volume_linestat.c
 volume_slice_la_SOURCES     = volume_slice.c
+volume_swaxes_la_SOURCES    = volume_swaxes.c
 volume_zcal_la_SOURCES      = volume_zcal.c
+volumeops_la_SOURCES        = volumeops.c
+
+volume_la_SOURCES = \
+	$(volume_calibrate_la_SOURCES) \
+	$(volume_extract_la_SOURCES) \
+	$(volume_fdfit_la_SOURCES) \
+	$(volume_invert_la_SOURCES) \
+	$(volume_kmeans_la_SOURCES) \
+	$(volume_kmedians_la_SOURCES) \
+	$(volume_linestat_la_SOURCES) \
+	$(volume_slice_la_SOURCES) \
+	$(volume_swaxes_la_SOURCES) \
+	$(volume_zcal_la_SOURCES) \
+	$(volumeops_la_SOURCES) \
+	volume.c
+
+volume.c: $(srcdir)/Makefile.am $(top_srcdir)/utils/gen-module-bundle.sh
+	$(SHELL) $(top_srcdir)/utils/gen-module-bundle.sh volume.c $(bundlable_modules)
+
+CLEAN_FILES = volume.c
 
 clean-local:
 	rm -f core.* *~
diff --git a/modules/volume/Makefile.in b/modules/volume/Makefile.in
index 41327b7..fe97cee 100644
--- a/modules/volume/Makefile.in
+++ b/modules/volume/Makefile.in
@@ -14,7 +14,7 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 17426 2015-09-20 09:16:12Z yeti-dn $
+# @(#) $Id: Makefile.am 20017 2017-07-03 21:44:28Z yeti-dn $
 
 VPATH = @srcdir@
 am__is_gnu_make = { \
@@ -138,37 +138,80 @@ am__uninstall_files_from_dir = { \
   }
 am__installdirs = "$(DESTDIR)$(volumedir)"
 LTLIBRARIES = $(volume_LTLIBRARIES)
-volume_calibrate_la_LIBADD =
-am_volume_calibrate_la_OBJECTS = volume_calibrate.lo
-volume_calibrate_la_OBJECTS = $(am_volume_calibrate_la_OBJECTS)
+volume_la_LIBADD =
+am__objects_1 = volume_la-volume_calibrate.lo
+am__objects_2 = volume_la-volume_extract.lo
+am__objects_3 = volume_la-volume_fdfit.lo
+am__objects_4 = volume_la-volume_invert.lo
+am__objects_5 = volume_la-volume_kmeans.lo
+am__objects_6 = volume_la-volume_kmedians.lo
+am__objects_7 = volume_la-volume_linestat.lo
+am__objects_8 = volume_la-volume_slice.lo
+am__objects_9 = volume_la-volume_swaxes.lo
+am__objects_10 = volume_la-volume_zcal.lo
+am__objects_11 = volume_la-volumeops.lo
+am_volume_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
+	$(am__objects_3) $(am__objects_4) $(am__objects_5) \
+	$(am__objects_6) $(am__objects_7) $(am__objects_8) \
+	$(am__objects_9) $(am__objects_10) $(am__objects_11) \
+	volume_la-volume.lo
+volume_la_OBJECTS = $(am_volume_la_OBJECTS)
 AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
+volume_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(volume_la_CFLAGS) \
+	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+ at MODULE_BUNDLING_TRUE@am_volume_la_rpath = -rpath $(volumedir)
+volume_calibrate_la_LIBADD =
+am_volume_calibrate_la_OBJECTS = volume_calibrate.lo
+volume_calibrate_la_OBJECTS = $(am_volume_calibrate_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_volume_calibrate_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(volumedir)
 volume_extract_la_LIBADD =
 am_volume_extract_la_OBJECTS = volume_extract.lo
 volume_extract_la_OBJECTS = $(am_volume_extract_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_volume_extract_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(volumedir)
 volume_fdfit_la_LIBADD =
 am_volume_fdfit_la_OBJECTS = volume_fdfit.lo
 volume_fdfit_la_OBJECTS = $(am_volume_fdfit_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_volume_fdfit_la_rpath = -rpath $(volumedir)
 volume_invert_la_LIBADD =
 am_volume_invert_la_OBJECTS = volume_invert.lo
 volume_invert_la_OBJECTS = $(am_volume_invert_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_volume_invert_la_rpath = -rpath $(volumedir)
 volume_kmeans_la_LIBADD =
 am_volume_kmeans_la_OBJECTS = volume_kmeans.lo
 volume_kmeans_la_OBJECTS = $(am_volume_kmeans_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_volume_kmeans_la_rpath = -rpath $(volumedir)
 volume_kmedians_la_LIBADD =
 am_volume_kmedians_la_OBJECTS = volume_kmedians.lo
 volume_kmedians_la_OBJECTS = $(am_volume_kmedians_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_volume_kmedians_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(volumedir)
 volume_linestat_la_LIBADD =
 am_volume_linestat_la_OBJECTS = volume_linestat.lo
 volume_linestat_la_OBJECTS = $(am_volume_linestat_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_volume_linestat_la_rpath = -rpath \
+ at MODULE_BUNDLING_FALSE@	$(volumedir)
 volume_slice_la_LIBADD =
 am_volume_slice_la_OBJECTS = volume_slice.lo
 volume_slice_la_OBJECTS = $(am_volume_slice_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_volume_slice_la_rpath = -rpath $(volumedir)
+volume_swaxes_la_LIBADD =
+am_volume_swaxes_la_OBJECTS = volume_swaxes.lo
+volume_swaxes_la_OBJECTS = $(am_volume_swaxes_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_volume_swaxes_la_rpath = -rpath $(volumedir)
 volume_zcal_la_LIBADD =
 am_volume_zcal_la_OBJECTS = volume_zcal.lo
 volume_zcal_la_OBJECTS = $(am_volume_zcal_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_volume_zcal_la_rpath = -rpath $(volumedir)
+volumeops_la_LIBADD =
+am_volumeops_la_OBJECTS = volumeops.lo
+volumeops_la_OBJECTS = $(am_volumeops_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_volumeops_la_rpath = -rpath $(volumedir)
 AM_V_P = $(am__v_P_ at AM_V@)
 am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -203,16 +246,18 @@ AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = $(volume_calibrate_la_SOURCES) $(volume_extract_la_SOURCES) \
-	$(volume_fdfit_la_SOURCES) $(volume_invert_la_SOURCES) \
-	$(volume_kmeans_la_SOURCES) $(volume_kmedians_la_SOURCES) \
-	$(volume_linestat_la_SOURCES) $(volume_slice_la_SOURCES) \
-	$(volume_zcal_la_SOURCES)
-DIST_SOURCES = $(volume_calibrate_la_SOURCES) \
+SOURCES = $(volume_la_SOURCES) $(volume_calibrate_la_SOURCES) \
 	$(volume_extract_la_SOURCES) $(volume_fdfit_la_SOURCES) \
 	$(volume_invert_la_SOURCES) $(volume_kmeans_la_SOURCES) \
 	$(volume_kmedians_la_SOURCES) $(volume_linestat_la_SOURCES) \
-	$(volume_slice_la_SOURCES) $(volume_zcal_la_SOURCES)
+	$(volume_slice_la_SOURCES) $(volume_swaxes_la_SOURCES) \
+	$(volume_zcal_la_SOURCES) $(volumeops_la_SOURCES)
+DIST_SOURCES = $(volume_la_SOURCES) $(volume_calibrate_la_SOURCES) \
+	$(volume_extract_la_SOURCES) $(volume_fdfit_la_SOURCES) \
+	$(volume_invert_la_SOURCES) $(volume_kmeans_la_SOURCES) \
+	$(volume_kmedians_la_SOURCES) $(volume_linestat_la_SOURCES) \
+	$(volume_slice_la_SOURCES) $(volume_swaxes_la_SOURCES) \
+	$(volume_zcal_la_SOURCES) $(volumeops_la_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -278,10 +323,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -291,6 +333,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -315,7 +359,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -373,6 +419,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -381,17 +428,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -482,7 +525,11 @@ top_srcdir = @top_srcdir@
 # kept.  If we remove them completely, various bits can get lost.
 disabled_sources = 
 volumedir = $(pkglibdir)/modules/volume
-volume_LTLIBRARIES = \
+
+# Only bundle modules without own dependencies.  If something goes wrong with
+# any required libraries at run-time, it will at most break these individual
+# unbundled modules, not the bundle.
+bundlable_modules = \
 	volume_calibrate.la \
 	volume_extract.la \
 	volume_fdfit.la \
@@ -491,15 +538,23 @@ volume_LTLIBRARIES = \
 	volume_kmedians.la \
 	volume_linestat.la \
 	volume_slice.la \
-	volume_zcal.la
+	volume_swaxes.la \
+	volume_zcal.la \
+	volumeops.la
+
+ at MODULE_BUNDLING_FALSE@volume_modules = $(bundlable_modules)
+
+# volume_modules is either the bundle or all the individual modules.
+ at MODULE_BUNDLING_TRUE@volume_modules = volume.la
+ at MODULE_BUNDLING_TRUE@BUILT_SOURCES = volume.c
+ at MODULE_BUNDLING_TRUE@volume_la_CFLAGS = $(AM_CFLAGS) -DGWY_MODULE_BUNDLING
+volume_LTLIBRARIES = \
+	$(volume_modules)
 
 EXTRA_DIST = \
 	$(disabled_sources)
 
 @OS_MSWIN_TRUE at no_undefined = -no-undefined
-AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
-AM_CFLAGS = @COMMON_CFLAGS@
-AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
 @MODULE_DEPENDENCIES_TRUE at module_libadd = \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/app/libgwyapp2.la \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libdraw/libgwydraw2.la \
@@ -509,6 +564,9 @@ AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libprocess/libgwyprocess2.la \
 @MODULE_DEPENDENCIES_TRUE@	@GTK_LIBS@
 
+AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
+AM_CFLAGS = @COMMON_CFLAGS@
+AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
 volume_calibrate_la_SOURCES = volume_calibrate.c
 volume_extract_la_SOURCES = volume_extract.c
 volume_fdfit_la_SOURCES = volume_fdfit.c
@@ -517,8 +575,26 @@ volume_kmeans_la_SOURCES = volume_kmeans.c
 volume_kmedians_la_SOURCES = volume_kmedians.c
 volume_linestat_la_SOURCES = volume_linestat.c
 volume_slice_la_SOURCES = volume_slice.c
+volume_swaxes_la_SOURCES = volume_swaxes.c
 volume_zcal_la_SOURCES = volume_zcal.c
-all: all-am
+volumeops_la_SOURCES = volumeops.c
+volume_la_SOURCES = \
+	$(volume_calibrate_la_SOURCES) \
+	$(volume_extract_la_SOURCES) \
+	$(volume_fdfit_la_SOURCES) \
+	$(volume_invert_la_SOURCES) \
+	$(volume_kmeans_la_SOURCES) \
+	$(volume_kmedians_la_SOURCES) \
+	$(volume_linestat_la_SOURCES) \
+	$(volume_slice_la_SOURCES) \
+	$(volume_swaxes_la_SOURCES) \
+	$(volume_zcal_la_SOURCES) \
+	$(volumeops_la_SOURCES) \
+	volume.c
+
+CLEAN_FILES = volume.c
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
 
 .SUFFIXES:
 .SUFFIXES: .c .lo .o .obj
@@ -587,32 +663,41 @@ clean-volumeLTLIBRARIES:
 	  rm -f $${locs}; \
 	}
 
+volume.la: $(volume_la_OBJECTS) $(volume_la_DEPENDENCIES) $(EXTRA_volume_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(volume_la_LINK) $(am_volume_la_rpath) $(volume_la_OBJECTS) $(volume_la_LIBADD) $(LIBS)
+
 volume_calibrate.la: $(volume_calibrate_la_OBJECTS) $(volume_calibrate_la_DEPENDENCIES) $(EXTRA_volume_calibrate_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(volumedir) $(volume_calibrate_la_OBJECTS) $(volume_calibrate_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_volume_calibrate_la_rpath) $(volume_calibrate_la_OBJECTS) $(volume_calibrate_la_LIBADD) $(LIBS)
 
 volume_extract.la: $(volume_extract_la_OBJECTS) $(volume_extract_la_DEPENDENCIES) $(EXTRA_volume_extract_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(volumedir) $(volume_extract_la_OBJECTS) $(volume_extract_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_volume_extract_la_rpath) $(volume_extract_la_OBJECTS) $(volume_extract_la_LIBADD) $(LIBS)
 
 volume_fdfit.la: $(volume_fdfit_la_OBJECTS) $(volume_fdfit_la_DEPENDENCIES) $(EXTRA_volume_fdfit_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(volumedir) $(volume_fdfit_la_OBJECTS) $(volume_fdfit_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_volume_fdfit_la_rpath) $(volume_fdfit_la_OBJECTS) $(volume_fdfit_la_LIBADD) $(LIBS)
 
 volume_invert.la: $(volume_invert_la_OBJECTS) $(volume_invert_la_DEPENDENCIES) $(EXTRA_volume_invert_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(volumedir) $(volume_invert_la_OBJECTS) $(volume_invert_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_volume_invert_la_rpath) $(volume_invert_la_OBJECTS) $(volume_invert_la_LIBADD) $(LIBS)
 
 volume_kmeans.la: $(volume_kmeans_la_OBJECTS) $(volume_kmeans_la_DEPENDENCIES) $(EXTRA_volume_kmeans_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(volumedir) $(volume_kmeans_la_OBJECTS) $(volume_kmeans_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_volume_kmeans_la_rpath) $(volume_kmeans_la_OBJECTS) $(volume_kmeans_la_LIBADD) $(LIBS)
 
 volume_kmedians.la: $(volume_kmedians_la_OBJECTS) $(volume_kmedians_la_DEPENDENCIES) $(EXTRA_volume_kmedians_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(volumedir) $(volume_kmedians_la_OBJECTS) $(volume_kmedians_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_volume_kmedians_la_rpath) $(volume_kmedians_la_OBJECTS) $(volume_kmedians_la_LIBADD) $(LIBS)
 
 volume_linestat.la: $(volume_linestat_la_OBJECTS) $(volume_linestat_la_DEPENDENCIES) $(EXTRA_volume_linestat_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(volumedir) $(volume_linestat_la_OBJECTS) $(volume_linestat_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_volume_linestat_la_rpath) $(volume_linestat_la_OBJECTS) $(volume_linestat_la_LIBADD) $(LIBS)
 
 volume_slice.la: $(volume_slice_la_OBJECTS) $(volume_slice_la_DEPENDENCIES) $(EXTRA_volume_slice_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(volumedir) $(volume_slice_la_OBJECTS) $(volume_slice_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_volume_slice_la_rpath) $(volume_slice_la_OBJECTS) $(volume_slice_la_LIBADD) $(LIBS)
+
+volume_swaxes.la: $(volume_swaxes_la_OBJECTS) $(volume_swaxes_la_DEPENDENCIES) $(EXTRA_volume_swaxes_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_volume_swaxes_la_rpath) $(volume_swaxes_la_OBJECTS) $(volume_swaxes_la_LIBADD) $(LIBS)
 
 volume_zcal.la: $(volume_zcal_la_OBJECTS) $(volume_zcal_la_DEPENDENCIES) $(EXTRA_volume_zcal_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(volumedir) $(volume_zcal_la_OBJECTS) $(volume_zcal_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_volume_zcal_la_rpath) $(volume_zcal_la_OBJECTS) $(volume_zcal_la_LIBADD) $(LIBS)
+
+volumeops.la: $(volumeops_la_OBJECTS) $(volumeops_la_DEPENDENCIES) $(EXTRA_volumeops_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_volumeops_la_rpath) $(volumeops_la_OBJECTS) $(volumeops_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -626,9 +711,23 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_invert.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_kmeans.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_kmedians.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_la-volume.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_la-volume_calibrate.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_la-volume_extract.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_la-volume_fdfit.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_la-volume_invert.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_la-volume_kmeans.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_la-volume_kmedians.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_la-volume_linestat.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_la-volume_slice.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_la-volume_swaxes.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_la-volume_zcal.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_la-volumeops.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_linestat.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_slice.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_swaxes.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volume_zcal.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/volumeops.Plo at am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -651,6 +750,90 @@ distclean-compile:
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
+volume_la-volume_calibrate.lo: volume_calibrate.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -MT volume_la-volume_calibrate.lo -MD -MP -MF $(DEPDIR)/volume_la-volume_calibrate.Tpo -c -o volume_la-volume_calibrate.lo `test -f 'volume_calibrate.c' || echo '$(srcdir)/'`volume_calibrate.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/volume_la-volume_calibrate.Tpo $(DEPDIR)/volume_la-volume_calibrate.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='volume_calibrate.c' object='volume_la-volume_calibrate.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -c -o volume_la-volume_calibrate.lo `test -f 'volume_calibrate.c' || echo '$(srcdir)/'`volume_calibrate.c
+
+volume_la-volume_extract.lo: volume_extract.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -MT volume_la-volume_extract.lo -MD -MP -MF $(DEPDIR)/volume_la-volume_extract.Tpo -c -o volume_la-volume_extract.lo `test -f 'volume_extract.c' || echo '$(srcdir)/'`volume_extract.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/volume_la-volume_extract.Tpo $(DEPDIR)/volume_la-volume_extract.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='volume_extract.c' object='volume_la-volume_extract.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -c -o volume_la-volume_extract.lo `test -f 'volume_extract.c' || echo '$(srcdir)/'`volume_extract.c
+
+volume_la-volume_fdfit.lo: volume_fdfit.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -MT volume_la-volume_fdfit.lo -MD -MP -MF $(DEPDIR)/volume_la-volume_fdfit.Tpo -c -o volume_la-volume_fdfit.lo `test -f 'volume_fdfit.c' || echo '$(srcdir)/'`volume_fdfit.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/volume_la-volume_fdfit.Tpo $(DEPDIR)/volume_la-volume_fdfit.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='volume_fdfit.c' object='volume_la-volume_fdfit.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -c -o volume_la-volume_fdfit.lo `test -f 'volume_fdfit.c' || echo '$(srcdir)/'`volume_fdfit.c
+
+volume_la-volume_invert.lo: volume_invert.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -MT volume_la-volume_invert.lo -MD -MP -MF $(DEPDIR)/volume_la-volume_invert.Tpo -c -o volume_la-volume_invert.lo `test -f 'volume_invert.c' || echo '$(srcdir)/'`volume_invert.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/volume_la-volume_invert.Tpo $(DEPDIR)/volume_la-volume_invert.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='volume_invert.c' object='volume_la-volume_invert.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -c -o volume_la-volume_invert.lo `test -f 'volume_invert.c' || echo '$(srcdir)/'`volume_invert.c
+
+volume_la-volume_kmeans.lo: volume_kmeans.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -MT volume_la-volume_kmeans.lo -MD -MP -MF $(DEPDIR)/volume_la-volume_kmeans.Tpo -c -o volume_la-volume_kmeans.lo `test -f 'volume_kmeans.c' || echo '$(srcdir)/'`volume_kmeans.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/volume_la-volume_kmeans.Tpo $(DEPDIR)/volume_la-volume_kmeans.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='volume_kmeans.c' object='volume_la-volume_kmeans.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -c -o volume_la-volume_kmeans.lo `test -f 'volume_kmeans.c' || echo '$(srcdir)/'`volume_kmeans.c
+
+volume_la-volume_kmedians.lo: volume_kmedians.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -MT volume_la-volume_kmedians.lo -MD -MP -MF $(DEPDIR)/volume_la-volume_kmedians.Tpo -c -o volume_la-volume_kmedians.lo `test -f 'volume_kmedians.c' || echo '$(srcdir)/'`volume_kmedians.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/volume_la-volume_kmedians.Tpo $(DEPDIR)/volume_la-volume_kmedians.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='volume_kmedians.c' object='volume_la-volume_kmedians.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -c -o volume_la-volume_kmedians.lo `test -f 'volume_kmedians.c' || echo '$(srcdir)/'`volume_kmedians.c
+
+volume_la-volume_linestat.lo: volume_linestat.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -MT volume_la-volume_linestat.lo -MD -MP -MF $(DEPDIR)/volume_la-volume_linestat.Tpo -c -o volume_la-volume_linestat.lo `test -f 'volume_linestat.c' || echo '$(srcdir)/'`volume_linestat.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/volume_la-volume_linestat.Tpo $(DEPDIR)/volume_la-volume_linestat.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='volume_linestat.c' object='volume_la-volume_linestat.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -c -o volume_la-volume_linestat.lo `test -f 'volume_linestat.c' || echo '$(srcdir)/'`volume_linestat.c
+
+volume_la-volume_slice.lo: volume_slice.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -MT volume_la-volume_slice.lo -MD -MP -MF $(DEPDIR)/volume_la-volume_slice.Tpo -c -o volume_la-volume_slice.lo `test -f 'volume_slice.c' || echo '$(srcdir)/'`volume_slice.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/volume_la-volume_slice.Tpo $(DEPDIR)/volume_la-volume_slice.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='volume_slice.c' object='volume_la-volume_slice.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -c -o volume_la-volume_slice.lo `test -f 'volume_slice.c' || echo '$(srcdir)/'`volume_slice.c
+
+volume_la-volume_swaxes.lo: volume_swaxes.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -MT volume_la-volume_swaxes.lo -MD -MP -MF $(DEPDIR)/volume_la-volume_swaxes.Tpo -c -o volume_la-volume_swaxes.lo `test -f 'volume_swaxes.c' || echo '$(srcdir)/'`volume_swaxes.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/volume_la-volume_swaxes.Tpo $(DEPDIR)/volume_la-volume_swaxes.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='volume_swaxes.c' object='volume_la-volume_swaxes.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -c -o volume_la-volume_swaxes.lo `test -f 'volume_swaxes.c' || echo '$(srcdir)/'`volume_swaxes.c
+
+volume_la-volume_zcal.lo: volume_zcal.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -MT volume_la-volume_zcal.lo -MD -MP -MF $(DEPDIR)/volume_la-volume_zcal.Tpo -c -o volume_la-volume_zcal.lo `test -f 'volume_zcal.c' || echo '$(srcdir)/'`volume_zcal.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/volume_la-volume_zcal.Tpo $(DEPDIR)/volume_la-volume_zcal.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='volume_zcal.c' object='volume_la-volume_zcal.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -c -o volume_la-volume_zcal.lo `test -f 'volume_zcal.c' || echo '$(srcdir)/'`volume_zcal.c
+
+volume_la-volumeops.lo: volumeops.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -MT volume_la-volumeops.lo -MD -MP -MF $(DEPDIR)/volume_la-volumeops.Tpo -c -o volume_la-volumeops.lo `test -f 'volumeops.c' || echo '$(srcdir)/'`volumeops.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/volume_la-volumeops.Tpo $(DEPDIR)/volume_la-volumeops.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='volumeops.c' object='volume_la-volumeops.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -c -o volume_la-volumeops.lo `test -f 'volumeops.c' || echo '$(srcdir)/'`volumeops.c
+
+volume_la-volume.lo: volume.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -MT volume_la-volume.lo -MD -MP -MF $(DEPDIR)/volume_la-volume.Tpo -c -o volume_la-volume.lo `test -f 'volume.c' || echo '$(srcdir)/'`volume.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/volume_la-volume.Tpo $(DEPDIR)/volume_la-volume.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='volume.c' object='volume_la-volume.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_la_CFLAGS) $(CFLAGS) -c -o volume_la-volume.lo `test -f 'volume.c' || echo '$(srcdir)/'`volume.c
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
@@ -740,13 +923,15 @@ distdir: $(DISTFILES)
 	  fi; \
 	done
 check-am: all-am
-check: check-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
 all-am: Makefile $(LTLIBRARIES)
 installdirs:
 	for dir in "$(DESTDIR)$(volumedir)"; do \
 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
-install: install-am
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
 install-exec: install-exec-am
 install-data: install-data-am
 uninstall: uninstall-am
@@ -776,6 +961,7 @@ distclean-generic:
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
 clean: clean-am
 
 clean-am: clean-generic clean-libtool clean-local \
@@ -847,7 +1033,7 @@ ps-am:
 
 uninstall-am: uninstall-volumeLTLIBRARIES
 
-.MAKE: install-am install-strip
+.MAKE: all check install install-am install-strip
 
 .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
 	clean-libtool clean-local clean-volumeLTLIBRARIES \
@@ -867,6 +1053,9 @@ uninstall-am: uninstall-volumeLTLIBRARIES
 .PRECIOUS: Makefile
 
 
+volume.c: $(srcdir)/Makefile.am $(top_srcdir)/utils/gen-module-bundle.sh
+	$(SHELL) $(top_srcdir)/utils/gen-module-bundle.sh volume.c $(bundlable_modules)
+
 clean-local:
 	rm -f core.* *~
 
diff --git a/modules/volume/volume.c b/modules/volume/volume.c
new file mode 100644
index 0000000..8b00fa3
--- /dev/null
+++ b/modules/volume/volume.c
@@ -0,0 +1,46 @@
+/* This is a GENERATED file. */
+#include <glib.h>
+#include <libgwymodule/gwymodule.h>
+
+static const GwyModuleRecord* register_bundle(void);
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION | GWY_MODULE_BUNDLE_FLAG,
+    (GwyModuleRegisterFunc)&register_bundle,
+    NULL, NULL, NULL, NULL, NULL,
+};
+
+GWY_MODULE_QUERY(module_info)
+
+GwyModuleInfo* _gwy_module_query__volume_calibrate(void);
+GwyModuleInfo* _gwy_module_query__volume_extract(void);
+GwyModuleInfo* _gwy_module_query__volume_fdfit(void);
+GwyModuleInfo* _gwy_module_query__volume_invert(void);
+GwyModuleInfo* _gwy_module_query__volume_kmeans(void);
+GwyModuleInfo* _gwy_module_query__volume_kmedians(void);
+GwyModuleInfo* _gwy_module_query__volume_linestat(void);
+GwyModuleInfo* _gwy_module_query__volume_slice(void);
+GwyModuleInfo* _gwy_module_query__volume_swaxes(void);
+GwyModuleInfo* _gwy_module_query__volume_zcal(void);
+GwyModuleInfo* _gwy_module_query__volumeops(void);
+
+static const GwyModuleRecord modules[] = {
+  { _gwy_module_query__volume_calibrate, "volume_calibrate", },
+  { _gwy_module_query__volume_extract, "volume_extract", },
+  { _gwy_module_query__volume_fdfit, "volume_fdfit", },
+  { _gwy_module_query__volume_invert, "volume_invert", },
+  { _gwy_module_query__volume_kmeans, "volume_kmeans", },
+  { _gwy_module_query__volume_kmedians, "volume_kmedians", },
+  { _gwy_module_query__volume_linestat, "volume_linestat", },
+  { _gwy_module_query__volume_slice, "volume_slice", },
+  { _gwy_module_query__volume_swaxes, "volume_swaxes", },
+  { _gwy_module_query__volume_zcal, "volume_zcal", },
+  { _gwy_module_query__volumeops, "volumeops", },
+  { NULL, NULL, },
+};
+
+static const GwyModuleRecord*
+register_bundle(void)
+{
+    return modules;
+}
diff --git a/modules/volume/volume_calibrate.c b/modules/volume/volume_calibrate.c
index 2669676..3a3c0df 100644
--- a/modules/volume/volume_calibrate.c
+++ b/modules/volume/volume_calibrate.c
@@ -1,6 +1,6 @@
 /*
  *  @(#) $Id: volcal.c 14954 2013-04-23 15:43:19Z klapetek $
- *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
+ *  Copyright (C) 2013 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -174,12 +174,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Recalibrate volume data dimensions or value range."),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "1.1",
+    "1.2",
     "David Nečas (Yeti) & Petr Klapetek",
     "2013",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, volume_calibrate)
 
 static gboolean
 module_register(void)
@@ -361,7 +361,7 @@ volcal_dialog(VolcalArgs *args,
               GwyBrick *brick)
 {
     enum { RESPONSE_RESET = 1};
-    GtkWidget *dialog, *spin, *table, *label;
+    GtkWidget *dialog, *spin, *table;
     GwySIUnit *unit;
     VolcalControls controls;
     gint row, response;
@@ -371,7 +371,8 @@ volcal_dialog(VolcalArgs *args,
                                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                          NULL);
 
-    controls.ok = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_OK, GTK_RESPONSE_OK);
+    controls.ok = gtk_dialog_add_button(GTK_DIALOG(dialog),
+                                        GTK_STOCK_OK, GTK_RESPONSE_OK);
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_volume_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
@@ -386,22 +387,16 @@ volcal_dialog(VolcalArgs *args,
     row = 0;
 
     /***** New Real Dimensions *****/
-    label = gwy_label_new_header(_("New Real Dimensions"));
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table),
+                     gwy_label_new_header(_("New Real Dimensions")),
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
-    label = gtk_label_new_with_mnemonic(_("_X range:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
     controls.xreal = gtk_adjustment_new(args->xreal/pow10(args->xexponent),
                                         0.01, 10000, 1, 10, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.xreal), 1, 2);
-    gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
-    gtk_table_attach(GTK_TABLE(table), spin,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("_X range:"), NULL,
+                                   controls.xreal, GWY_HSCALE_LOG);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
 
     unit = gwy_brick_get_si_unit_x(brick);
     controls.xexponent
@@ -409,202 +404,147 @@ volcal_dialog(VolcalArgs *args,
                                         &controls, -15, 6, unit,
                                         args->xexponent);
     gtk_table_attach(GTK_TABLE(table), controls.xexponent, 2, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0);
+                     GTK_FILL | GTK_SHRINK, 0, 0, 0);
 
     controls.xunits = gtk_button_new_with_label(gwy_sgettext("verb|Change"));
     g_object_set_data(G_OBJECT(controls.xunits), "id", (gpointer)"x");
     gtk_table_attach(GTK_TABLE(table), controls.xunits,
-                     3, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0);
+                     3, 4, row, row+1, GTK_FILL | GTK_SHRINK, 0, 0, 0);
     row++;
 
-    label = gtk_label_new_with_mnemonic(_("_Y range:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
     controls.yreal = gtk_adjustment_new(args->yreal/pow10(args->yexponent),
                                         0.01, 10000, 1, 10, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.yreal), 1, 2);
-    gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
-    gtk_table_attach(GTK_TABLE(table), spin,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("_Y range:"), NULL,
+                                   controls.yreal, GWY_HSCALE_LOG);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
 
     unit = gwy_brick_get_si_unit_y(brick);
     controls.yexponent
         = gwy_combo_box_metric_unit_new(G_CALLBACK(yexponent_changed_cb),
                                         &controls, -15, 6, unit,
                                         args->yexponent);
-    gtk_table_attach(GTK_TABLE(table), controls.yexponent, 2, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), controls.yexponent,
+                     2, 3, row, row+1, GTK_FILL | GTK_SHRINK, 0, 0, 0);
 
     controls.yunits = gtk_button_new_with_label(gwy_sgettext("verb|Change"));
     g_object_set_data(G_OBJECT(controls.yunits), "id", (gpointer)"y");
     gtk_table_attach(GTK_TABLE(table), controls.yunits,
-                     3, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0);
+                     3, 4, row, row+1, GTK_FILL | GTK_SHRINK, 0, 0, 0);
     row++;
 
-    label = gtk_label_new_with_mnemonic(_("_Z range:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
     controls.zreal = gtk_adjustment_new(args->zreal/pow10(args->zexponent),
                                         0.01, 10000, 1, 10, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.zreal), 1, 2);
-    gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
-    gtk_table_attach(GTK_TABLE(table), spin,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("_Z range:"), NULL,
+                                   controls.zreal, GWY_HSCALE_LOG);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
 
     unit = gwy_brick_get_si_unit_z(brick);
     controls.zexponent
         = gwy_combo_box_metric_unit_new(G_CALLBACK(zexponent_changed_cb),
                                         &controls, -15, 6, unit,
                                         args->zexponent);
-    gtk_table_attach(GTK_TABLE(table), controls.zexponent, 2, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), controls.zexponent,
+                     2, 3, row, row+1, GTK_FILL | GTK_SHRINK, 0, 0, 0);
 
     controls.zunits = gtk_button_new_with_label(gwy_sgettext("verb|Change"));
     g_object_set_data(G_OBJECT(controls.zunits), "id", (gpointer)"z");
     gtk_table_attach(GTK_TABLE(table), controls.zunits,
-                     3, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0);
+                     3, 4, row, row+1, GTK_FILL | GTK_SHRINK, 0, 0, 0);
     row++;
 
 
     /***** Lateral Offsets *****/
 
-    label = gtk_label_new_with_mnemonic(_("_X offset:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
     controls.x0 = gtk_adjustment_new(args->x0/pow10(args->xexponent),
                                      -10000, 10000, 1, 10, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.x0), 1, 2);
-    gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
-    gtk_table_attach(GTK_TABLE(table), spin,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("_X offset:"), NULL,
+                                   controls.x0, GWY_HSCALE_SQRT);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2);
     row++;
 
-    label = gtk_label_new_with_mnemonic(_("_Y offset:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    controls.y0 = gtk_adjustment_new(args->y0/pow10(args->yexponent),
+    controls.y0 = gtk_adjustment_new(args->y0/pow10(args->xexponent),
                                      -10000, 10000, 1, 10, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.y0), 1, 2);
-    gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
-    gtk_table_attach(GTK_TABLE(table), spin,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+    spin = gwy_table_attach_adjbar(table, row, _("_Y offset:"), NULL,
+                                   controls.y0, GWY_HSCALE_SQRT);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2);
     row++;
 
-    label = gtk_label_new_with_mnemonic(_("_Z offset:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-    controls.z0 = gtk_adjustment_new(args->z0/pow10(args->zexponent),
+    controls.z0 = gtk_adjustment_new(args->z0/pow10(args->xexponent),
                                      -10000, 10000, 1, 10, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.z0), 1, 2);
-    gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
-    gtk_table_attach(GTK_TABLE(table), spin,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+    spin = gwy_table_attach_adjbar(table, row, _("_Z offset:"), NULL,
+                                   controls.z0, GWY_HSCALE_SQRT);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2);
     row++;
 
-
     /***** Value Range *****/
-    label = gwy_label_new_header(_("Value Range"));
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Value Range")),
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
-    label = gtk_label_new_with_mnemonic(_("_Value range:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
     controls.wreal = gtk_adjustment_new(args->wreal/pow10(args->wexponent),
                                         -10000, 10000, 1, 10, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.wreal), 1, 2);
-    gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
-    gtk_table_attach(GTK_TABLE(table), spin,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    spin = gwy_table_attach_adjbar(table, row, _("_Value range:"), NULL,
+                                   controls.wreal, GWY_HSCALE_SQRT);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2);
 
     unit = gwy_brick_get_si_unit_w(brick);
     controls.wexponent
         = gwy_combo_box_metric_unit_new(G_CALLBACK(wexponent_changed_cb),
                                         &controls, -15, 6, unit,
                                         args->wexponent);
-    gtk_table_attach(GTK_TABLE(table), controls.wexponent, 2, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table), controls.wexponent,
+                     2, 3, row, row+1, GTK_FILL | GTK_SHRINK, 0, 0, 0);
 
     controls.wunits = gtk_button_new_with_label(gwy_sgettext("verb|Change"));
     g_object_set_data(G_OBJECT(controls.wunits), "id", (gpointer)"w");
     gtk_table_attach(GTK_TABLE(table), controls.wunits,
-                     3, 4, row, row+1,
-                     GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0);
+                     3, 4, row, row+1, GTK_FILL | GTK_SHRINK, 0, 0, 0);
     row++;
 
     /***** Value Shift *****/
 
-    label = gtk_label_new_with_mnemonic(_("Value shi_ft:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
     controls.wshift = gtk_adjustment_new(args->wshift/pow10(args->wexponent),
                                          -10000, 10000, 1, 10, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.wshift), 1, 2);
-    gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
-    gtk_table_attach(GTK_TABLE(table), spin,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
+    spin = gwy_table_attach_adjbar(table, row, _("Value shi_ft:"), NULL,
+                                   controls.wshift, GWY_HSCALE_SQRT);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2);
     row++;
 
     /***** Calibration Coefficients *****/
-    label = gwy_label_new_header(_("Calibration Coefficients"));
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_table_attach(GTK_TABLE(table),
+                     gwy_label_new_header(_("Calibration Coefficients")),
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.xratio = gtk_adjustment_new(args->xratio, 0.001, 1000, 0.1, 1, 0);
-    spin = gwy_table_attach_spinbutton(table, row,
-                                       _("_X calibration factor:"), "",
-                                       controls.xratio);
-    controls.xpower10 = gwy_table_get_child_widget(table, row, 2);
+    spin = gwy_table_attach_adjbar(table, row, _("_X calibration factor:"), " ",
+                                   controls.xratio, GWY_HSCALE_LOG);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
+    controls.xpower10 = gwy_table_hscale_get_units(controls.xratio);
     row++;
 
     controls.yratio = gtk_adjustment_new(args->yratio, 0.001, 1000, 0.1, 1, 0);
-    spin = gwy_table_attach_spinbutton(table, row,
-                                       _("_Y calibration factor:"), "",
-                                       controls.yratio);
-    controls.ypower10 = gwy_table_get_child_widget(table, row, 2);
+    spin = gwy_table_attach_adjbar(table, row, _("_Y calibration factor:"), " ",
+                                   controls.yratio, GWY_HSCALE_LOG);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
+    controls.ypower10 = gwy_table_hscale_get_units(controls.xratio);
     row++;
 
     controls.zratio = gtk_adjustment_new(args->zratio, -1000, 1000, 0.1, 1, 0);
-    spin = gwy_table_attach_spinbutton(table, row,
-                                       _("_Z calibration factor:"), "",
-                                       controls.zratio);
-    controls.zpower10 = gwy_table_get_child_widget(table, row, 2);
+    spin = gwy_table_attach_adjbar(table, row, _("_Z calibration factor:"), " ",
+                                   controls.zratio, GWY_HSCALE_LOG);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
+    controls.zpower10 = gwy_table_hscale_get_units(controls.zratio);
     row++;
 
     controls.wratio = gtk_adjustment_new(args->wratio, -1000, 1000, 0.1, 1, 0);
-    spin = gwy_table_attach_spinbutton(table, row,
-                                       _("_Value calibration factor:"), "",
-                                       controls.wratio);
-    controls.wpower10 = gwy_table_get_child_widget(table, row, 2);
+    spin = gwy_table_attach_adjbar(table, row,
+                                   _("_Value calibration factor:"), " ",
+                                   controls.wratio, GWY_HSCALE_SQRT);
     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
+    controls.wpower10 = gwy_table_hscale_get_units(controls.zratio);
     row++;
 
-
     g_signal_connect(controls.xreal, "value-changed",
                      G_CALLBACK(xreal_changed_cb), &controls);
     g_signal_connect(controls.yreal, "value-changed",
diff --git a/modules/volume/volume_extract.c b/modules/volume/volume_extract.c
index eb11740..0dc086b 100644
--- a/modules/volume/volume_extract.c
+++ b/modules/volume/volume_extract.c
@@ -1,6 +1,6 @@
 /*
- *  @(#) $Id: volume_extract.c 18729 2016-07-19 15:26:29Z yeti-dn $
- *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
+ *  @(#) $Id: volume_extract.c 20007 2017-07-02 20:42:02Z yeti-dn $
+ *  Copyright (C) 2013 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -136,70 +136,63 @@ typedef struct {
     cairo_surface_t *image;
 } ExtractControls;
 
-static gboolean module_register                    (void);
-static void     extract                            (GwyContainer *data,
-                                                    GwyRunType run);
-static void     extract_dialog                     (ExtractArgs *args,
-                                                    GwyContainer *data,
-                                                    GwyBrick *brick,
-                                                    gint id);
-
-static void     extract_dialog_update_controls  (ExtractControls *controls,
-                                                    ExtractArgs *args);
-static void     extract_dialog_update_values    (ExtractControls *controls,
-                                                    ExtractArgs *args);
-static void     extract_load_data               (ExtractControls *controls,
-                                                    ExtractArgs *args);
-static void     extract_invalidate                   (ExtractControls *controls);
-static void     update_change_cb                   (ExtractControls *controls);
-static void     gupdate_change_cb                   (ExtractControls *controls);
-
-static void     preview                            (ExtractControls *controls,
-                                                    ExtractArgs *args);
-static void     extract_load_args               (GwyContainer *container,
-                                                    ExtractArgs *args);
-static void     extract_save_args               (GwyContainer *container,
-                                                    ExtractArgs *args);
-static void     type_changed_cb                   (GtkWidget *combo,
-                                                   ExtractControls *controls);
-static void     gtype_changed_cb                   (GtkWidget *combo,
-                                                   ExtractControls *controls);
-static void     page_switched                      (ExtractControls *controls,
-                                                    GtkNotebookPage *page,
-                                                    gint pagenum);
-static void     graph_selection_finished_cb        (GwySelection *selection,
-                                                    ExtractControls *controls);
-static void     p3d_build                           (ExtractControls *controls,
-                                                     ExtractArgs *args);
-static void     p3d_prepare_wdata                   (ExtractControls *controls,
-                                                     ExtractArgs *args);
-static void     extract_zscale_cb                (ExtractControls *controls);
-static void     extract_opacity_cb                (ExtractControls *controls);
-static void     extract_threshold_cb                (ExtractControls *controls);
-//static gboolean p3d_on_draw_event                  (GtkWidget *widget,
-//                                                   cairo_t *cr,
-//                                                   ExtractControls *controls);
-static gboolean p3d_on_draw_event                  (GtkWidget *widget,
-                                                    GdkEventExpose *event,
-                                                    ExtractControls *controls);
-static gboolean p3d_clicked                        (GtkWidget *widget,
-                                                   GdkEventButton *event,
-                                                   ExtractControls *controls);
-static gboolean p3d_released                        (GtkWidget *widget,
-                                                   GdkEventButton *event,
-                                                   ExtractControls *controls);
-static gboolean p3d_moved                         (GtkWidget *widget,
-                                                   GdkEventMotion *event,
-                                                   ExtractControls *controls);
-static void p3d_xview_cb                          (ExtractControls *controls);
-static void p3d_yview_cb                          (ExtractControls *controls);
-static void p3d_zview_cb                          (ExtractControls *controls);
-static void perspective_change_cb                 (ExtractControls *controls);
-static void render_change_cb                 (ExtractControls *controls);
-
-static void p3d_set_axes                          (ExtractControls *controls);
-static void p3d_add_wireframe                     (ExtractControls *controls);
-
+static gboolean module_register               (void);
+static void     extract                       (GwyContainer *data,
+                                               GwyRunType run);
+static void     extract_dialog                (ExtractArgs *args,
+                                               GwyContainer *data,
+                                               GwyBrick *brick,
+                                               gint id);
+static void     extract_dialog_update_controls(ExtractControls *controls,
+                                               ExtractArgs *args);
+static void     extract_dialog_update_values  (ExtractControls *controls,
+                                               ExtractArgs *args);
+static void     extract_load_data             (ExtractControls *controls,
+                                               ExtractArgs *args);
+static void     extract_invalidate            (ExtractControls *controls);
+static void     update_change_cb              (ExtractControls *controls);
+static void     gupdate_change_cb             (ExtractControls *controls);
+static void     preview                       (ExtractControls *controls,
+                                               ExtractArgs *args);
+static void     extract_load_args             (GwyContainer *container,
+                                               ExtractArgs *args);
+static void     extract_save_args             (GwyContainer *container,
+                                               ExtractArgs *args);
+static void     type_changed_cb               (GtkWidget *combo,
+                                               ExtractControls *controls);
+static void     gtype_changed_cb              (GtkWidget *combo,
+                                               ExtractControls *controls);
+static void     page_switched                 (ExtractControls *controls,
+                                               GtkNotebookPage *page,
+                                               gint pagenum);
+static void     graph_selection_finished_cb   (GwySelection *selection,
+                                               ExtractControls *controls);
+static void     p3d_build                     (ExtractControls *controls,
+                                               ExtractArgs *args);
+static void     p3d_prepare_wdata             (ExtractControls *controls,
+                                               ExtractArgs *args);
+static void     extract_zscale_cb             (ExtractControls *controls);
+static void     extract_opacity_cb            (ExtractControls *controls);
+static void     extract_threshold_cb          (ExtractControls *controls);
+static gboolean p3d_expose                    (GtkWidget *widget,
+                                               GdkEventExpose *event,
+                                               ExtractControls *controls);
+static gboolean p3d_clicked                   (GtkWidget *widget,
+                                               GdkEventButton *event,
+                                               ExtractControls *controls);
+static gboolean p3d_released                  (GtkWidget *widget,
+                                               GdkEventButton *event,
+                                               ExtractControls *controls);
+static gboolean p3d_moved                     (GtkWidget *widget,
+                                               GdkEventMotion *event,
+                                               ExtractControls *controls);
+static void     p3d_xview_cb                  (ExtractControls *controls);
+static void     p3d_yview_cb                  (ExtractControls *controls);
+static void     p3d_zview_cb                  (ExtractControls *controls);
+static void     perspective_change_cb         (ExtractControls *controls);
+static void     render_change_cb              (ExtractControls *controls);
+static void     p3d_set_axes                  (ExtractControls *controls);
+static void     p3d_add_wireframe             (ExtractControls *controls);
 
 static const ExtractArgs extract_defaults = {
     CUT_DIRX,
@@ -227,14 +220,14 @@ static GwyModuleInfo module_info = {
     "2013",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, volume_extract)
 
 static gboolean
 module_register(void)
 {
     gwy_volume_func_register("extract",
                              (GwyVolumeFunc)&extract,
-                             N_("/Show and _extract..."),
+                             N_("/Show and _Extract..."),
                              NULL,
                              EXTRACT_RUN_MODES,
                              GWY_MENU_FLAG_VOLUME,
@@ -280,7 +273,7 @@ extract_dialog(ExtractArgs *args,
         { N_("Z direction"), GRAPH_DIRZ, },
     };
 
-    GtkWidget *dialog, *table, *hbox, *label, *notebook, *button;
+    GtkWidget *dialog, *table, *hbox, *notebook, *button, *hbox2;
     GwyDataField *dfield;
     GwyDataLine *dline, *calibration;
     ExtractControls controls;
@@ -346,7 +339,7 @@ extract_dialog(ExtractArgs *args,
     g_signal_connect_swapped(notebook, "switch-page",
                                  G_CALLBACK(page_switched), &controls);
 
-    /////////////////////////////  projections page ///////////////////////////////////////
+    /***** Projections *****/
 
     hbox = gtk_hbox_new(FALSE, 2);
     gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
@@ -379,45 +372,39 @@ extract_dialog(ExtractArgs *args,
 
     gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4);
 
-    table = gtk_table_new(11, 4, FALSE);
+    table = gtk_table_new(7, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
     gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 4);
     row = 0;
-    controls.xpos = gtk_adjustment_new(args->xpos,
-                                            0.0, 100, 1, 10, 0);
-    gwy_table_attach_hscale(table, row++, _("X position"), "%",
-                            controls.xpos, 0);
+
+    controls.xpos = gtk_adjustment_new(args->xpos, 0.0, 100, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row++, _("X position"), "%",
+                            controls.xpos, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls.xpos, "value-changed",
                              G_CALLBACK(extract_invalidate), &controls);
 
-    controls.ypos = gtk_adjustment_new(args->ypos,
-                                            0.0, 100, 1, 10, 0);
-    gwy_table_attach_hscale(table, row++, _("Y position"), "%",
-                            controls.ypos, 0);
+    controls.ypos = gtk_adjustment_new(args->ypos, 0.0, 100, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row++, _("Y position"), "%",
+                            controls.ypos, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls.ypos, "value-changed",
                              G_CALLBACK(extract_invalidate), &controls);
 
-    controls.zpos = gtk_adjustment_new(args->zpos,
-                                            0.0, 100, 1, 10, 0);
-    gwy_table_attach_hscale(table, row++, _("Z position"), "%",
-                            controls.zpos, 0);
+    controls.zpos = gtk_adjustment_new(args->zpos, 0.0, 100, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row++, _("Z position"), "%",
+                            controls.zpos, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls.zpos, "value-changed",
                              G_CALLBACK(extract_invalidate), &controls);
 
-    label = gtk_label_new(_("Shown cut direction:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    row++;
-
-    controls.type
-        = gwy_enum_combo_box_new(types, G_N_ELEMENTS(types),
-                                 G_CALLBACK(type_changed_cb), &controls,
-                                 args->type, TRUE);
-    gwy_table_attach_hscale(table, row, _("Show mode:"), NULL,
-                            GTK_OBJECT(controls.type), GWY_HSCALE_WIDGET);
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    controls.type = gwy_enum_combo_box_new(types, G_N_ELEMENTS(types),
+                                           G_CALLBACK(type_changed_cb),
+                                           &controls,
+                                           args->type, TRUE);
+    gwy_table_attach_adjbar(table, row, _("Shown cut direction:"), NULL,
+                            GTK_OBJECT(controls.type),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     type_changed_cb(controls.type, &controls);
     row++;
 
@@ -425,32 +412,34 @@ extract_dialog(ExtractArgs *args,
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.update),
                                  args->update);
     gtk_table_attach(GTK_TABLE(table), controls.update,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.update, "toggled",
                              G_CALLBACK(update_change_cb), &controls);
     row++;
 
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     controls.info = gtk_label_new(_("No data loaded"));
     gtk_misc_set_alignment(GTK_MISC(controls.info), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), controls.info,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
-    /////////////////////////////  graphs page ///////////////////////////////////////
+    /***** Graphs page *****/
 
     hbox = gtk_hbox_new(FALSE, 2);
-    gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
-                               hbox,
-                               gtk_label_new(_("Graphs")));
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), hbox,
+                             gtk_label_new(_("Graphs")));
 
     dfield = gwy_data_field_new(PREVIEW_SIZE, PREVIEW_SIZE,
                                 PREVIEW_SIZE, PREVIEW_SIZE,
                                 TRUE);
     gwy_container_set_object_by_name(controls.mydata, "/1/data", dfield);
 
-    if (data) gwy_app_sync_data_items(data, controls.mydata, id, 1, FALSE,
-                            GWY_DATA_ITEM_PALETTE,
-                            0);
+    if (data) {
+        gwy_app_sync_data_items(data, controls.mydata, id, 1, FALSE,
+                                GWY_DATA_ITEM_PALETTE,
+                                0);
+    }
 
     controls.gview = gwy_data_view_new(controls.mydata);
     layer = gwy_layer_basic_new();
@@ -473,12 +462,13 @@ extract_dialog(ExtractArgs *args,
 
 
     gtk_box_pack_start(GTK_BOX(hbox), controls.gview, FALSE, FALSE, 4);
-    table = gtk_table_new(11, 4, FALSE);
+    table = gtk_table_new(3, 4, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
     gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 4);
     row = 0;
+
     controls.gmodel = gwy_graph_model_new();
     controls.graph = gwy_graph_new(controls.gmodel);
     gwy_graph_enable_user_input(GWY_GRAPH(controls.graph), FALSE);
@@ -487,18 +477,14 @@ extract_dialog(ExtractArgs *args,
                      0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
     row++;
 
-    label = gtk_label_new(_("Graph cut direction:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    row++;
-
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     controls.gtype
         = gwy_enum_combo_box_new(gtypes, G_N_ELEMENTS(gtypes),
                                  G_CALLBACK(gtype_changed_cb), &controls,
                                  args->gtype, TRUE);
-    gwy_table_attach_hscale(table, row, _("Show mode:"), NULL,
-                            GTK_OBJECT(controls.gtype), GWY_HSCALE_WIDGET);
+    gwy_table_attach_adjbar(table, row, _("Graph cut direction:"), NULL,
+                            GTK_OBJECT(controls.gtype),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     gtype_changed_cb(controls.gtype, &controls);
     row++;
 
@@ -506,29 +492,32 @@ extract_dialog(ExtractArgs *args,
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.gupdate),
                                  args->update);
     gtk_table_attach(GTK_TABLE(table), controls.gupdate,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.gupdate, "toggled",
                              G_CALLBACK(gupdate_change_cb), &controls);
     row++;
 
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
     controls.ginfo = gtk_label_new(_("No data loaded"));
     gtk_misc_set_alignment(GTK_MISC(controls.ginfo), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), controls.ginfo,
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
-    /////////////////////////////  3D page ///////////////////////////////////////
+    /***** 3D *****/
 
     hbox = gtk_hbox_new(FALSE, 2);
-    gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
-                               hbox,
-                               gtk_label_new(_("3D view")));
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), hbox,
+                             gtk_label_new(_("3D view")));
 
     controls.drawarea = gtk_drawing_area_new();
-    gtk_widget_add_events(controls.drawarea, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK);
+    gtk_widget_add_events(controls.drawarea,
+                          GDK_BUTTON_PRESS_MASK
+                          | GDK_BUTTON_RELEASE_MASK
+                          | GDK_POINTER_MOTION_MASK);
 
-    g_signal_connect(GTK_DRAWING_AREA(controls.drawarea), "expose-event", //should be "draw" for newer Gtk+
-                     G_CALLBACK(p3d_on_draw_event), &controls);
+    g_signal_connect(GTK_DRAWING_AREA(controls.drawarea), "expose-event",
+                     G_CALLBACK(p3d_expose), &controls);
     g_signal_connect(controls.drawarea, "button-press-event",
                      G_CALLBACK(p3d_clicked), &controls);
     g_signal_connect(controls.drawarea, "button-release-event",
@@ -539,77 +528,74 @@ extract_dialog(ExtractArgs *args,
     gtk_box_pack_start(GTK_BOX(hbox), controls.drawarea, FALSE, FALSE, 4);
     gtk_widget_set_size_request(controls.drawarea, PREVIEW_SIZE, PREVIEW_SIZE);
 
-    table = gtk_table_new(11, 4, FALSE);
+    table = gtk_table_new(7, 4, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
     gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 4);
     row = 0;
-    controls.size = gtk_adjustment_new(args->size,
-                                            1, 100, 1, 10, 0);
-    gwy_table_attach_hscale(table, row++, _("Zoom"), "%",
-                            controls.size, 0);
+    controls.size = gtk_adjustment_new(args->size, 1, 100, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row++, _("Zoom"), "%",
+                            controls.size, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.size, "value-changed",
                              G_CALLBACK(extract_invalidate), &controls);
     row++;
 
-    controls.threshold = gtk_adjustment_new(args->threshold,
-                                            1, 100, 1, 10, 0);
-    gwy_table_attach_hscale(table, row++, _("Wireframe threshold"), "%",
-                            controls.threshold, 0);
+    controls.threshold = gtk_adjustment_new(args->threshold, 1, 100, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row++, _("Wireframe threshold"), "%",
+                            controls.threshold, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls.threshold, "value-changed",
                              G_CALLBACK(extract_threshold_cb), &controls);
     row++;
 
-    controls.zscale = gtk_adjustment_new(args->zscale,
-                                            1, 100, 1, 10, 0);
-    gwy_table_attach_hscale(table, row++, _("Z scale"), "%",
-                            controls.zscale, 0);
+    controls.zscale = gtk_adjustment_new(args->zscale, 1, 100, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row++, _("Z scale"), "%",
+                            controls.zscale, GWY_HSCALE_SQRT);
     g_signal_connect_swapped(controls.zscale, "value-changed",
                              G_CALLBACK(extract_zscale_cb), &controls);
     row++;
 
-    controls.opacity = gtk_adjustment_new(args->opacity,
-                                            1, 100, 1, 10, 0);
-    gwy_table_attach_hscale(table, row++, _("Opacity scale"), "%",
-                            controls.opacity, 0);
+    controls.opacity = gtk_adjustment_new(args->opacity, 1, 100, 1, 10, 0);
+    gwy_table_attach_adjbar(table, row++, _("Opacity scale"), "%",
+                            controls.opacity, GWY_HSCALE_LINEAR);
     g_signal_connect_swapped(controls.opacity, "value-changed",
                              G_CALLBACK(extract_opacity_cb), &controls);
     row++;
 
-    controls.perspective = gtk_check_button_new_with_mnemonic(_("apply perspective"));
+    controls.perspective = gtk_check_button_new_with_label(_("Apply perspective"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.perspective),
                                  args->perspective);
     gtk_table_attach(GTK_TABLE(table), controls.perspective,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.perspective, "toggled",
                              G_CALLBACK(perspective_change_cb), &controls);
     row++;
 
-    controls.render = gtk_check_button_new_with_mnemonic(_("instant 3D render"));
+    controls.render = gtk_check_button_new_with_label(_("Instant 3D render"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.render),
                                  args->render);
     gtk_table_attach(GTK_TABLE(table), controls.render,
-                     0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.render, "toggled",
                              G_CALLBACK(render_change_cb), &controls);
     row++;
 
+    hbox2 = gtk_hbox_new(TRUE, 2);
+    gtk_table_attach(GTK_TABLE(table), hbox2,
+                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
+
     button = gtk_button_new_with_mnemonic(_("X view"));
-    gtk_table_attach(GTK_TABLE(table), button,
-                     0, 1, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_box_pack_start(GTK_BOX(hbox2), button, TRUE, TRUE, 0);
     g_signal_connect_swapped(button, "clicked",
                              G_CALLBACK(p3d_xview_cb), &controls);
 
     button = gtk_button_new_with_mnemonic(_("Y view"));
-    gtk_table_attach(GTK_TABLE(table), button,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_box_pack_start(GTK_BOX(hbox2), button, TRUE, TRUE, 0);
     g_signal_connect_swapped(button, "clicked",
                              G_CALLBACK(p3d_yview_cb), &controls);
 
     button = gtk_button_new_with_mnemonic(_("Z view"));
-    gtk_table_attach(GTK_TABLE(table), button,
-                     2, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gtk_box_pack_start(GTK_BOX(hbox2), button, TRUE, TRUE, 0);
     g_signal_connect_swapped(button, "clicked",
                              G_CALLBACK(p3d_zview_cb), &controls);
 
@@ -1460,9 +1446,9 @@ raysum(ExtractControls *controls, gdouble pos[3], gdouble dir[3], gdouble min, g
 }
 
 static gboolean
-//p3d_on_draw_event(GtkWidget *widget, cairo_t *cr,
-//              ExtractControls *controls)
-p3d_on_draw_event(GtkWidget *widget, G_GNUC_UNUSED GdkEventExpose *event, ExtractControls *controls)
+p3d_expose(GtkWidget *widget,
+           G_GNUC_UNUSED GdkEventExpose *event,
+           ExtractControls *controls)
 {
     cairo_t *ci, *cr = gdk_cairo_create(GDK_WINDOW(widget->window));
     gdouble sx, sy;
@@ -1942,41 +1928,32 @@ p3d_prepare_wdata(ExtractControls *controls, ExtractArgs *args)
 }
 
 static gboolean
-gothere(gdouble *data, gdouble *vdata, gint xres, gint yres, gint col, gint row, gint dir, gdouble threshold)
+gothere(gdouble *data, gdouble *vdata, gint xres, gint yres, gint col, gint row, gdouble threshold)
 {
-    if (vdata[col+xres*row] == 1) return FALSE;
-    if (row < 1 || row>=(yres-1)) return FALSE;
-    if (col < 1 || col>=(xres-1)) return FALSE;
-
-    if (dir == 0) /*y const*/ {
-    if ((data[row + yres*col]>threshold) &&
-                                     ((data[row-1 + yres*col]<threshold) || (data[row + yres*(col-1)]<threshold)
-                                      || (data[row+1 + yres*col]<threshold) || (data[row + yres*(col+1)]<threshold)
-                                      || (data[row+1 + yres*(col+1)]<threshold) || (data[row-1 + yres*(col-1)]<threshold)
-                                      || (data[row+1 + yres*(col-1)]<threshold) || (data[row-1 + yres*(col+1)]<threshold))) return TRUE;
-
-    } else if (dir == 1) /*y const;  HUH? shouldn't this be x const or something?*/ {
-        if (data[col + xres*row]>threshold &&
-                                     (data[col-1 + xres*row]<threshold || data[col + xres*(row-1)]<threshold
-                                      || data[col+1 + xres*row]<threshold || data[col + xres*(row+1)]<threshold
-                                      || data[col+1 + xres*(row+1)]<threshold || data[col-1 + xres*(row-1)]<threshold
-                                      || data[col+1 + xres*(row-1)]<threshold || data[col-1 + xres*(row+1)]<threshold)) return TRUE;
-    } else {
-        if (data[col + xres*row]>threshold &&
-                                     (data[col-1 + xres*row]<threshold || data[col + xres*(row-1)]<threshold
-                                      || data[col+1 + xres*row]<threshold || data[col + xres*(row+1)]<threshold
-                                      || data[col+1 + xres*(row+1)]<threshold || data[col-1 + xres*(row-1)]<threshold
-                                      || data[col+1 + xres*(row-1)]<threshold || data[col-1 + xres*(row+1)]<threshold)) return TRUE;
-     }
-
-    vdata[col+xres*row] = 1;
+    guint k = row + yres*col;
+
+    if (vdata[k] == 1)
+        return FALSE;
+    if (row < 1 || row >= yres-1)
+        return FALSE;
+    if (col < 1 || col >= xres-1)
+        return FALSE;
+
+    if ((data[k] > threshold) &&
+        ((data[k-1] < threshold) || (data[k-yres] < threshold)
+         || (data[k+1] < threshold) || (data[k+yres] < threshold)
+         || (data[k+yres+1] < threshold) || (data[k-yres-1] < threshold)
+         || (data[k-yres+1] < threshold) || (data[k+yres-1] < threshold)))
+        return TRUE;
+
+    vdata[k] = 1;
     return FALSE;
-
 }
 
 static void
 visitme(ExtractControls *controls, gint *actual_nps, gdouble *data, gdouble *vdata, gint xres, gint yres, gint zres, gint col, gint row, gint dir, gint tval, gboolean *move, gdouble threshold)
 {
+    gint first_res, second_res;
     /*detect ad add a segment of necessary*/
     //printf("pos %d %d ", col, row);
 
@@ -1993,11 +1970,13 @@ visitme(ExtractControls *controls, gint *actual_nps, gdouble *data, gdouble *vda
         controls->px[controls->nps] = 2*controls->bwidth*(gdouble)tval/(gdouble)xres - controls->bwidth;
         controls->py[controls->nps] = 2*controls->bheight*(gdouble)col/(gdouble)yres - controls->bheight;
         controls->pz[controls->nps] = 2*controls->bdepth*(gdouble)row/(gdouble)zres - controls->bdepth;
-    } else if (dir==1) /*y const*/ {
+    }
+    else if (dir == 1) /*y const*/ {
         controls->px[controls->nps] = 2*controls->bwidth*(gdouble)col/(gdouble)xres - controls->bwidth;
         controls->py[controls->nps] = 2*controls->bheight*(gdouble)tval/(gdouble)yres - controls->bheight;
         controls->pz[controls->nps] = 2*controls->bdepth*(gdouble)row/(gdouble)zres - controls->bdepth;
-    } else {
+    }
+    else {
         controls->px[controls->nps] = 2*controls->bwidth*(gdouble)col/(gdouble)xres - controls->bwidth;
         controls->py[controls->nps] = 2*controls->bheight*(gdouble)row/(gdouble)yres - controls->bheight;
         controls->pz[controls->nps] = 2*controls->bdepth*(gdouble)tval/(gdouble)zres - controls->bdepth;
@@ -2011,24 +1990,36 @@ visitme(ExtractControls *controls, gint *actual_nps, gdouble *data, gdouble *vda
     controls->nps += 1;
     vdata[col+xres*row] = 1;
 
+    if (dir == 0) {
+        first_res = yres;
+        second_res = zres;
+    }
+    else if (dir == 1) {
+        first_res = xres;
+        second_res = zres;
+    }
+    else {
+        first_res = xres;
+        second_res = yres;
+    }
+
     /*go to neighbor positions*/
-    if (gothere(data, vdata, xres, yres, col+1, row, dir, threshold))
+    if (gothere(data, vdata, first_res, second_res, col+1, row, threshold))
         visitme(controls, actual_nps,data, vdata, xres, yres, zres, col+1, row, dir, tval, move, threshold);
-    else if (gothere(data, vdata, xres, yres, col-1, row, dir, threshold))
-             visitme(controls, actual_nps, data, vdata, xres, yres, zres, col-1, row, dir, tval, move, threshold);
-    else if (gothere(data, vdata, xres, yres, col, row+1, dir, threshold))
-             visitme(controls, actual_nps, data, vdata, xres, yres, zres, col, row+1, dir, tval, move, threshold);
-    else if (gothere(data, vdata, xres, yres, col, row-1, dir, threshold))
-             visitme(controls, actual_nps, data, vdata, xres, yres, zres, col, row-1, dir, tval, move, threshold);
-    else if (gothere(data, vdata, xres, yres, col+1, row+1, dir, threshold))
-             visitme(controls, actual_nps, data, vdata, xres, yres, zres, col+1, row+1, dir, tval, move, threshold);
-    else if (gothere(data, vdata, xres, yres, col-1, row-1, dir, threshold))
-             visitme(controls, actual_nps, data, vdata, xres, yres, zres, col-1, row-1, dir, tval, move, threshold);
-    else if (gothere(data, vdata, xres, yres, col+1, row-1, dir, threshold))
-             visitme(controls, actual_nps, data, vdata, xres, yres, zres, col+1, row-1, dir, tval, move, threshold);
-    else if (gothere(data, vdata, xres, yres, col-1, row+1, dir, threshold))
-             visitme(controls, actual_nps, data, vdata, xres, yres, zres, col-1, row+1, dir, tval, move, threshold);
-
+    else if (gothere(data, vdata, first_res, second_res, col-1, row, threshold))
+        visitme(controls, actual_nps, data, vdata, xres, yres, zres, col-1, row, dir, tval, move, threshold);
+    else if (gothere(data, vdata, first_res, second_res, col, row+1, threshold))
+        visitme(controls, actual_nps, data, vdata, xres, yres, zres, col, row+1, dir, tval, move, threshold);
+    else if (gothere(data, vdata, first_res, second_res, col, row-1, threshold))
+        visitme(controls, actual_nps, data, vdata, xres, yres, zres, col, row-1, dir, tval, move, threshold);
+    else if (gothere(data, vdata, first_res, second_res, col+1, row+1, threshold))
+        visitme(controls, actual_nps, data, vdata, xres, yres, zres, col+1, row+1, dir, tval, move, threshold);
+    else if (gothere(data, vdata, first_res, second_res, col-1, row-1, threshold))
+        visitme(controls, actual_nps, data, vdata, xres, yres, zres, col-1, row-1, dir, tval, move, threshold);
+    else if (gothere(data, vdata, first_res, second_res, col+1, row-1, threshold))
+        visitme(controls, actual_nps, data, vdata, xres, yres, zres, col+1, row-1, dir, tval, move, threshold);
+    else if (gothere(data, vdata, first_res, second_res, col-1, row+1, threshold))
+        visitme(controls, actual_nps, data, vdata, xres, yres, zres, col-1, row+1, dir, tval, move, threshold);
 }
 
 static void
@@ -2055,8 +2046,8 @@ p3d_add_wireframe(ExtractControls *controls)
     threshold = gwy_brick_get_min(controls->brick)
         + (gwy_brick_get_max(controls->brick) - gwy_brick_get_min(controls->brick))/100.0*controls->args->threshold;
 
-    for (i=0; i<xres; i+=spacing) // why use 40 as a magic number - choose xres / 15 or something like that?
-    {
+    for (i = 0; i < xres; i += spacing) { // why use 40 as a magic number - choose xres / 15 or something like that?
+        /* Extract yz plane. */
         gwy_brick_extract_plane(controls->brick, cut, i, 0, 0, -1, yres, zres, FALSE);
         data = gwy_data_field_get_data(cut);
         gwy_data_field_clear(visited);
@@ -2064,12 +2055,10 @@ p3d_add_wireframe(ExtractControls *controls)
         gwy_data_field_threshold(cut, threshold, 0, 1);
         move = 1;
         /*here comes the algorithm*/
-        for (col=1; col<zres-1; col++)
-        {
-        for (row=1; row<yres-1; row++)
-            {
+        for (col=1; col < zres-1; col++) {
+            for (row=1; row < yres-1; row++) {
                 move = 1;
-        if (gothere(data, vdata, zres, yres, col, row, 0, threshold)) {
+                if (gothere(data, vdata, yres, zres, col, row, threshold)) {
                     visitme(controls, &actual_nps, data, vdata, xres, yres, zres, col, row, 0, i, &move, threshold);
                 }
             }
@@ -2078,8 +2067,8 @@ p3d_add_wireframe(ExtractControls *controls)
 
     gwy_data_field_resample(visited, xres, zres, GWY_INTERPOLATION_NONE);
 
-    for (i=0; i<yres; i+=spacing)
-    {
+    for (i = 0; i < yres; i += spacing) {
+        /* Extract xz plane. */
         gwy_brick_extract_plane(controls->brick, cut, 0, i, 0, xres, -1, zres, FALSE);
         data = gwy_data_field_get_data(cut);
 
@@ -2091,21 +2080,19 @@ p3d_add_wireframe(ExtractControls *controls)
         move = 1;
 
         /*here comes the algorithm*/
-        for (col=1; col<xres; col++)
-        {
-            for (row=1; row<zres; row++)
-            {
-                    move = 1;
-                    if (gothere(data, vdata, xres, yres, col, row, 1, threshold))
-                        visitme(controls, &actual_nps, data, vdata, xres, yres, zres, col, row, 1, i, &move, threshold);
+        for (col = 1; col < xres; col++) {
+            for (row = 1; row < zres; row++) {
+                move = 1;
+                if (gothere(data, vdata, xres, zres, col, row, threshold))
+                    visitme(controls, &actual_nps, data, vdata, xres, yres, zres, col, row, 1, i, &move, threshold);
             }
         }
     }
 
     gwy_data_field_resample(visited, xres, yres, GWY_INTERPOLATION_NONE);
 
-    for (i=0; i<zres; i+=spacing)
-    {
+    for (i = 0; i < zres; i += spacing) {
+        /* Extract xy plane. */
         gwy_brick_extract_plane(controls->brick, cut, 0, 0, i, xres, yres, -1, FALSE);
         data = gwy_data_field_get_data(cut);
 
@@ -2117,26 +2104,20 @@ p3d_add_wireframe(ExtractControls *controls)
         move = 1;
 
         /*here comes the algorithm*/
-        for (col=1; col<xres; col++)
-        {
-            for (row=1; row<yres; row++)
-            {
-                    move = 1;
-                    if (gothere(data, vdata, xres, yres, col, row, 2, threshold))
-                        visitme(controls, &actual_nps, data, vdata, xres, yres, zres, col, row, 2, i, &move, threshold);
+        for (col = 1; col < xres; col++) {
+            for (row = 1; row < yres; row++) {
+                move = 1;
+                if (gothere(data, vdata, xres, yres, col, row, threshold))
+                    visitme(controls, &actual_nps, data, vdata, xres, yres, zres, col, row, 2, i, &move, threshold);
             }
         }
     }
 //    printf("we have %d segments at the end\nRunning simplification:\n", controls->nps);
-    controls->nps = simplify(controls->px, controls->py, controls->pz, controls->ps, controls->nps);
-
-    if (controls->wpx) g_free(controls->wpx);
-    if (controls->wpy) g_free(controls->wpy);
-    if (controls->wpz) g_free(controls->wpz);
-
-    controls->wpx = g_new(gdouble, controls->nps);
-    controls->wpy = g_new(gdouble, controls->nps);
-    controls->wpz = g_new(gdouble, controls->nps);
+    controls->nps = simplify(controls->px, controls->py, controls->pz,
+                             controls->ps, controls->nps);
+    controls->wpx = g_renew(gdouble, controls->wpx, controls->nps);
+    controls->wpy = g_renew(gdouble, controls->wpy, controls->nps);
+    controls->wpz = g_renew(gdouble, controls->wpz, controls->nps);
 
 //    printf("we have %d segments after simplification\n", controls->nps);
 }
diff --git a/modules/volume/volume_fdfit.c b/modules/volume/volume_fdfit.c
index b3d5036..9e05a05 100644
--- a/modules/volume/volume_fdfit.c
+++ b/modules/volume/volume_fdfit.c
@@ -198,19 +198,19 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Evaluate volume force-distance data"),
     "Petr Klapetek <klapetek at gwyddion.net>",
-    "1.0",
+    "1.1",
     "David Nečas (Yeti) & Petr Klapetek",
     "2013",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, volume_fdfit)
 
 static gboolean
 module_register(void)
 {
     gwy_volume_func_register("volume_fdfit",
                             (GwyVolumeFunc)&volfit,
-                            N_("/_Evaluate FD data..."),
+                            N_("/_Evaluate FD Data..."),
                             GWY_STOCK_VOLUME_FD,
                             VOLFIT_RUN_MODES,
                             GWY_MENU_FLAG_VOLUME,
@@ -264,7 +264,7 @@ volfit(GwyContainer *data, GwyRunType run)
 static void
 volfit_dialog(VolfitArgs *args)
 {
-    GtkWidget *label, *dialog, *hbox, *hbox2, *table, *align, *expander, *scroll, *spin;
+    GtkWidget *label, *dialog, *hbox, *hbox2, *table, *align, *expander, *scroll;
     GtkTable *table2;
     GwyGraphArea *area;
     GwySelection *selection;
@@ -365,54 +365,30 @@ volfit_dialog(VolfitArgs *args)
     row = 0;
 
     /* Curve to volfit selected by xpos, ypos*/
-    label = gtk_label_new_with_mnemonic(_("Curve _X position:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
     controls.xpos = gtk_adjustment_new(args->xpos,
-                                        0, gwy_brick_get_xres(args->brick)-1, 1, 10, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.xpos), 1, 2);
-    gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
-    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 0);
-    gtk_table_attach(GTK_TABLE(table), spin,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                                       0, gwy_brick_get_xres(args->brick)-1,
+                                       1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Curve _X position:"), NULL,
+                            controls.xpos, GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_signal_connect(controls.xpos, "value-changed",
                      G_CALLBACK(xpos_changed_cb), &controls);
-
-
-
     row++;
-    label = gtk_label_new_with_mnemonic(_("Curve _Y position:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
 
     controls.ypos = gtk_adjustment_new(args->ypos,
-                                       0, gwy_brick_get_yres(args->brick)-1, 1, 10, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.ypos), 1, 2);
-    gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
-    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 0);
-    gtk_table_attach(GTK_TABLE(table), spin,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                                       0, gwy_brick_get_yres(args->brick)-1,
+                                       1, 10, 0);
+    gwy_table_attach_adjbar(table, row, _("Curve _Y position:"), NULL,
+                            controls.ypos, GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
     g_signal_connect(controls.ypos, "value-changed",
                      G_CALLBACK(ypos_changed_cb), &controls);
-
     row++;
 
-
     /* Fitted function */
-    label = gtk_label_new_with_mnemonic(_("F_unction:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(GTK_TABLE(table), label,
-                     0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
     controls.function = function_selector_new(G_CALLBACK(function_changed),
                                               &controls, args->function_type);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.function);
-
-    gtk_table_attach(GTK_TABLE(table), controls.function,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    gwy_table_attach_adjbar(table, row, _("F_unction:"), NULL,
+                            GTK_OBJECT(controls.function),
+                            GWY_HSCALE_WIDGET_NO_EXPAND);
     row++;
 
     controls.formula = gtk_label_new("f(x) =");
@@ -466,7 +442,7 @@ volfit_dialog(VolfitArgs *args)
     controls.chisq = gtk_label_new(NULL);
     gtk_misc_set_alignment(GTK_MISC(controls.chisq), 0.0, 0.5);
     gtk_table_attach(GTK_TABLE(table), controls.chisq,
-                     1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+                     1, 2, row, row+1, GTK_FILL, 0, 0, 0);
 
     gtk_table_set_row_spacing(GTK_TABLE(table), row, 8);
     row++;
diff --git a/modules/volume/volume_invert.c b/modules/volume/volume_invert.c
index 4ed8588..9c6dd21 100644
--- a/modules/volume/volume_invert.c
+++ b/modules/volume/volume_invert.c
@@ -1,6 +1,6 @@
 /*
  *  @(#) $Id: volume_volume_invert.c 14914 2013-04-18 12:27:28Z klapetek $
- *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
+ *  Copyright (C) 2013 David Necas (Yeti), Petr Klapetek.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -21,29 +21,17 @@
 
 #include "config.h"
 #include <gtk/gtk.h>
-#include <cairo.h>
 #include <libgwyddion/gwymacros.h>
-#include <libgwyddion/gwymath.h>
-#include <libprocess/arithmetic.h>
-#include <libprocess/stats.h>
 #include <libprocess/brick.h>
-#include <libprocess/filters.h>
 #include <libgwydgets/gwystock.h>
-#include <libgwydgets/gwydataview.h>
-#include <libgwydgets/gwylayer-basic.h>
-#include <libgwydgets/gwylayer-mask.h>
-#include <libgwydgets/gwycombobox.h>
-#include <libgwydgets/gwydgetutils.h>
 #include <libgwymodule/gwymodule-volume.h>
 #include <app/gwyapp.h>
 
 #define VOLUME_INVERT_RUN_MODES (GWY_RUN_IMMEDIATE)
 
-static gboolean module_register                    (void);
-static void     volume_invert                         (GwyContainer *data,
-                                                    GwyRunType run);
-
-
+static gboolean module_register(void);
+static void     volume_invert  (GwyContainer *data,
+                                GwyRunType run);
 
 static GwyModuleInfo module_info = {
     GWY_MODULE_ABI_VERSION,
@@ -55,18 +43,18 @@ static GwyModuleInfo module_info = {
     "2013",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, volume_invert)
 
 static gboolean
 module_register(void)
 {
     gwy_volume_func_register("volume_invert",
-                              (GwyVolumeFunc)&volume_invert,
-                              N_("/_Invert value"),
-                              GWY_STOCK_VOLUME_INVERT,
-                              VOLUME_INVERT_RUN_MODES,
-                              GWY_MENU_FLAG_VOLUME,
-                              N_("Invert value in volume data"));
+                             (GwyVolumeFunc)&volume_invert,
+                             N_("/_Invert Value"),
+                             GWY_STOCK_VOLUME_INVERT,
+                             VOLUME_INVERT_RUN_MODES,
+                             GWY_MENU_FLAG_VOLUME,
+                             N_("Invert value in volume data"));
 
     return TRUE;
 }
@@ -76,7 +64,7 @@ volume_invert(GwyContainer *data, GwyRunType run)
 {
     GwyBrick *brick = NULL;
     GwyDataField *dfield = NULL;
-    gchar key[50];
+    GQuark quark;
     gint id, newid;
 
     g_return_if_fail(run & VOLUME_INVERT_RUN_MODES);
@@ -85,8 +73,8 @@ volume_invert(GwyContainer *data, GwyRunType run)
                                      GWY_APP_BRICK_ID, &id,
                                      0);
 
-    g_snprintf(key, sizeof(key), "/brick/%d/preview", id);
-    dfield = gwy_data_field_duplicate((GwyDataField *)gwy_container_get_object(data, g_quark_from_string(key)));
+    quark = gwy_app_get_brick_preview_key_for_id(id);
+    dfield = gwy_data_field_duplicate(gwy_container_get_object(data, quark));
     brick = gwy_brick_duplicate(brick);
 
     g_return_if_fail(GWY_IS_BRICK(brick));
diff --git a/modules/volume/volume_kmeans.c b/modules/volume/volume_kmeans.c
index a44b59b..3b0709a 100644
--- a/modules/volume/volume_kmeans.c
+++ b/modules/volume/volume_kmeans.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: volume_kmeans.c 19058 2016-10-12 15:08:10Z dn2010 $
+ *  @(#) $Id: volume_kmeans.c 20088 2017-07-25 20:44:20Z dn2010 $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek,
  *  Daniil Bratashov, Evgeniy Ryabov.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net, dn2010 at gmail.com.
@@ -60,24 +60,25 @@ typedef struct {
     GtkObject *outliers_threshold;
 } KMeansControls;
 
-static gboolean  module_register     (void);
-static void      volume_kmeans       (GwyContainer *data,
-                                      GwyRunType run);
-static void      kmeans_dialog       (GwyContainer *data,
-                                      KMeansArgs *args);
-static void  remove_outliers_toggled (KMeansControls *controls);
-static void      kmeans_dialog_update(KMeansControls *controls,
-                                      KMeansArgs *args);
-static void      kmeans_values_update(KMeansControls *controls,
-                                      KMeansArgs *args);
-static GwyBrick* normalize_brick     (GwyBrick *brick,
-                                      GwyDataField *intfield);
-static void      volume_kmeans_do    (GwyContainer *data,
-                                      KMeansArgs *args);
-static void      kmeans_load_args    (GwyContainer *container,
-                                      KMeansArgs *args);
-static void      kmeans_save_args    (GwyContainer *container,
-                                      KMeansArgs *args);
+static gboolean  module_register        (void);
+static void      volume_kmeans          (GwyContainer *data,
+                                         GwyRunType run);
+static void      kmeans_dialog          (GwyContainer *data,
+                                         KMeansArgs *args);
+static void      remove_outliers_toggled(KMeansControls *controls,
+                                         GtkToggleButton *toggle);
+static void      kmeans_dialog_update   (KMeansControls *controls,
+                                         KMeansArgs *args);
+static void      kmeans_values_update   (KMeansControls *controls,
+                                         KMeansArgs *args);
+static GwyBrick* normalize_brick        (GwyBrick *brick,
+                                         GwyDataField *intfield);
+static void      volume_kmeans_do       (GwyContainer *data,
+                                         KMeansArgs *args);
+static void      kmeans_load_args       (GwyContainer *container,
+                                         KMeansArgs *args);
+static void      kmeans_save_args       (GwyContainer *container,
+                                         KMeansArgs *args);
 
 static const KMeansArgs kmeans_defaults = {
     10,
@@ -93,19 +94,19 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Calculates K-means clustering on volume data."),
     "Daniil Bratashov <dn2010 at gmail.com> & Evgeniy Ryabov <k1u2r3ka at mail.ru>",
-    "1.4",
+    "1.5",
     "David Nečas (Yeti) & Petr Klapetek & Daniil Bratashov & Evgeniy Ryabov",
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, volume_kmeans)
 
 static gboolean
 module_register(void)
 {
     gwy_volume_func_register("kmeans",
                               (GwyVolumeFunc)&volume_kmeans,
-                              N_("/_K-means clustering..."),
+                              N_("/_K-Means Clustering..."),
                               GWY_STOCK_VOLUME_KMEANS,
                               KMEANS_RUN_MODES,
                               GWY_MENU_FLAG_VOLUME,
@@ -158,7 +159,7 @@ kmeans_dialog(GwyContainer *data, KMeansArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_volume_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(6, 4, FALSE);
+    table = gtk_table_new(6, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -166,50 +167,42 @@ kmeans_dialog(GwyContainer *data, KMeansArgs *args)
                        TRUE, TRUE, 4);
 
     controls.k = gtk_adjustment_new(args->k, 2, 100, 1, 10, 0);
-    gwy_table_attach_hscale(table, row,
-                            _("_Number of clusters:"), NULL,
-                            controls.k, GWY_HSCALE_SQRT);
+    gwy_table_attach_adjbar(table, row, _("_Number of clusters:"), NULL,
+                            controls.k, GWY_HSCALE_SQRT | GWY_HSCALE_SNAP);
     row++;
 
     controls.epsilon = gtk_adjustment_new(-log10(args->epsilon),
                                           1.0, 20.0, 0.01, 1.0, 0);
-    gwy_table_attach_hscale(table, row,
+    gwy_table_attach_adjbar(table, row,
                             _("Convergence _precision digits:"), NULL,
-                            controls.epsilon, GWY_HSCALE_DEFAULT);
+                            controls.epsilon, GWY_HSCALE_LINEAR);
     row++;
 
     controls.max_iterations = gtk_adjustment_new(args->max_iterations,
                                                  1, 10000, 1, 1, 0);
-    gwy_table_attach_hscale(table, row,
-                            _("_Max. iterations:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Max. iterations:"), NULL,
                             controls.max_iterations, GWY_HSCALE_LOG);
     row++;
 
-    controls.normalize
-                  = gtk_check_button_new_with_mnemonic(_("_Normalize"));
-    gtk_table_attach_defaults(GTK_TABLE(table), controls.normalize,
-                              0, 3, row, row+1);
+    controls.normalize = gtk_check_button_new_with_mnemonic(_("_Normalize"));
+    gtk_table_attach(GTK_TABLE(table), controls.normalize,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     row++;
 
     controls.remove_outliers
         = gtk_check_button_new_with_mnemonic(_("_Remove outliers"));
-    gtk_table_attach_defaults(GTK_TABLE(table),
-                              controls.remove_outliers,
-                              0, 3, row, row+1);
+    gtk_table_attach(GTK_TABLE(table), controls.remove_outliers,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(controls.remove_outliers, "toggled",
-                             G_CALLBACK(remove_outliers_toggled),
-                             &controls);
+                             G_CALLBACK(remove_outliers_toggled), &controls);
     row++;
 
-    controls.outliers_threshold
-                          = gtk_adjustment_new(args->outliers_threshold,
-                                               1.0, 10.0, 0.1, 1, 0);
-    gwy_table_attach_hscale(table, row,
-                            _("Outliers _threshold:"), NULL,
-                            controls.outliers_threshold,
-                            GWY_HSCALE_DEFAULT);
+    controls.outliers_threshold = gtk_adjustment_new(args->outliers_threshold,
+                                                     1.0, 10.0, 0.1, 1, 0);
+    gwy_table_attach_adjbar(table, row, _("Outliers _threshold:"), NULL,
+                            controls.outliers_threshold, GWY_HSCALE_LINEAR);
     gwy_table_hscale_set_sensitive(controls.outliers_threshold,
-                                   gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(controls.remove_outliers)));
+                                   args->remove_outliers);
     row++;
 
     kmeans_dialog_update(&controls, args);
@@ -245,10 +238,11 @@ kmeans_dialog(GwyContainer *data, KMeansArgs *args)
     volume_kmeans_do(data, args);
 }
 
-static void remove_outliers_toggled (KMeansControls *controls)
+static void
+remove_outliers_toggled(KMeansControls *controls, GtkToggleButton *toggle)
 {
     gwy_table_hscale_set_sensitive(controls->outliers_threshold,
-                                   gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(controls->remove_outliers)));
+                                   gtk_toggle_button_get_active(toggle));
 }
 
 /* XXX: Duplicate with volume_kmedians.c */
@@ -702,6 +696,9 @@ volume_kmeans_do(GwyContainer *container, KMeansArgs *args)
                      g_strdup_printf(_("K-means center %d"), c + 1),
                      "color", rgba,
                      NULL);
+        if (!gwy_graph_curve_model_is_ordered(gcmodel)) {
+            gwy_graph_curve_model_enforce_order(gcmodel);
+        }
         gwy_graph_model_add_curve(gmodel, gcmodel);
         g_object_unref(gcmodel);
     }
diff --git a/modules/volume/volume_kmedians.c b/modules/volume/volume_kmedians.c
index c1607d7..9961f6b 100644
--- a/modules/volume/volume_kmedians.c
+++ b/modules/volume/volume_kmedians.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: volume_kmedians.c 18886 2016-08-26 08:26:22Z yeti-dn $
+ *  @(#) $Id: volume_kmedians.c 20088 2017-07-25 20:44:20Z dn2010 $
  *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek,
  *  Daniil Bratashov, Evgeniy Ryabov.
  *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net,
@@ -87,19 +87,19 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Calculates K-medians clustering on volume data."),
     "Daniil Bratashov <dn2010 at gmail.com> & Evgeniy Ryabov <k1u2r3ka at mail.ru>",
-    "1.1",
+    "1.2",
     "David Nečas (Yeti) & Petr Klapetek & Daniil Bratashov & Evgeniy Ryabov",
     "2014",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, volume_kmedians)
 
 static gboolean
 module_register(void)
 {
     gwy_volume_func_register("kmedians",
                              (GwyVolumeFunc)&volume_kmedians,
-                             N_("/_K-medians clustering..."),
+                             N_("/_K-Medians Clustering..."),
                              GWY_STOCK_VOLUME_KMEDIANS,
                              KMEDIANS_RUN_MODES,
                              GWY_MENU_FLAG_VOLUME,
@@ -152,7 +152,7 @@ kmedians_dialog(GwyContainer *data, KMediansArgs *args)
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
     gwy_help_add_to_volume_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
 
-    table = gtk_table_new(4, 4, FALSE);
+    table = gtk_table_new(4, 3, FALSE);
     gtk_table_set_row_spacings(GTK_TABLE(table), 2);
     gtk_table_set_col_spacings(GTK_TABLE(table), 6);
     gtk_container_set_border_width(GTK_CONTAINER(table), 4);
@@ -160,29 +160,27 @@ kmedians_dialog(GwyContainer *data, KMediansArgs *args)
                        TRUE, TRUE, 4);
 
     controls.k = gtk_adjustment_new(args->k, 2, 100, 1, 10, 0);
-    gwy_table_attach_hscale(table, row,
-                            _("_Number of clusters:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Number of clusters:"), NULL,
                             controls.k, GWY_HSCALE_SQRT);
     row++;
 
     controls.epsilon = gtk_adjustment_new(-log10(args->epsilon),
                                           1.0, 20.0, 0.01, 1.0, 0);
-    gwy_table_attach_hscale(table, row,
+    gwy_table_attach_adjbar(table, row,
                             _("Convergence _precision digits:"), NULL,
-                            controls.epsilon, GWY_HSCALE_DEFAULT);
+                            controls.epsilon, GWY_HSCALE_LINEAR);
     row++;
 
     controls.max_iterations = gtk_adjustment_new(args->max_iterations,
                                                  1, 10000, 1, 1, 0);
-    gwy_table_attach_hscale(table, row,
-                            _("_Max. iterations:"), NULL,
+    gwy_table_attach_adjbar(table, row, _("_Max. iterations:"), NULL,
                             controls.max_iterations, GWY_HSCALE_LOG);
     row++;
 
     controls.normalize
         = gtk_check_button_new_with_mnemonic(_("_Normalize"));
-    gtk_table_attach_defaults(GTK_TABLE(table), controls.normalize,
-                              0, 3, row, row+1);
+    gtk_table_attach(GTK_TABLE(table), controls.normalize,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
 
     kmedians_dialog_update(&controls, args);
     gtk_widget_show_all(dialog);
@@ -546,6 +544,9 @@ volume_kmedians_do(GwyContainer *container, KMediansArgs *args)
                      g_strdup_printf(_("K-medians center %d"), c + 1),
                      "color", rgba,
                      NULL);
+        if (!gwy_graph_curve_model_is_ordered(gcmodel)) {
+            gwy_graph_curve_model_enforce_order(gcmodel);
+        }
         gwy_graph_model_add_curve(gmodel, gcmodel);
         g_object_unref(gcmodel);
     }
diff --git a/modules/volume/volume_linestat.c b/modules/volume/volume_linestat.c
index da414be..2391655 100644
--- a/modules/volume/volume_linestat.c
+++ b/modules/volume/volume_linestat.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: volume_linestat.c 17511 2015-10-05 21:09:24Z yeti-dn $
+ *  @(#) $Id: volume_linestat.c 20173 2017-08-07 04:58:08Z dn2010 $
  *  Copyright (C) 2015 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -143,6 +143,8 @@ static const GwyEnum quantities[] =  {
     { N_("Median"),             GWY_LINE_STAT_MEDIAN,    },
     { N_("Minimum"),            GWY_LINE_STAT_MINIMUM,   },
     { N_("Maximum"),            GWY_LINE_STAT_MAXIMUM,   },
+    { N_("Min. position"),      GWY_LINE_STAT_MINPOS,    },
+    { N_("Max. position"),      GWY_LINE_STAT_MAXPOS,    },
     { N_("Range"),              GWY_LINE_STAT_RANGE,     },
     { N_("Slope"),              GWY_LINE_STAT_SLOPE,     },
     { N_("tan β<sub>0</sub>"),  GWY_LINE_STAT_TAN_BETA0, },
@@ -170,12 +172,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Summarizes profiles of volume data to a channel."),
     "Yeti <yeti at gwyddion.net>",
-    "1.0",
+    "1.2",
     "David Nečas (Yeti)",
     "2015",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, volume_linestat)
 
 static gboolean
 module_register(void)
@@ -215,7 +217,7 @@ line_stat(GwyContainer *data, GwyRunType run)
             != gwy_data_line_get_res(args.calibration)))
         args.calibration = NULL;
 
-    wunit = gwy_brick_get_si_unit_z(brick);
+    wunit = gwy_brick_get_si_unit_w(brick);
     if (args.calibration)
         zunit = gwy_data_line_get_si_unit_y(args.calibration);
     else
@@ -255,6 +257,7 @@ line_stat_dialog(LineStatArgs *args, GwyContainer *data, gint id)
     GwyDataField *dfield;
     GwyGraphCurveModel *gcmodel;
     GwyGraphModel *gmodel;
+    GwySIUnit *siunitz;
     gint response, row;
     GwyPixmapLayer *layer;
     GwyVectorLayer *vlayer = NULL;
@@ -263,23 +266,25 @@ line_stat_dialog(LineStatArgs *args, GwyContainer *data, gint id)
     const guchar *gradient;
     gchar key[40];
     gdouble xy[2];
+    gdouble zmax;
     guint nquantities;
 
     controls.args = args;
 
     brick = args->brick;
     if (args->calibration) {
-        controls.zvf
-            = gwy_data_line_get_value_format_y(args->calibration,
-                                               GWY_SI_UNIT_FORMAT_VFMARKUP,
-                                               NULL);
+        siunitz = gwy_data_line_get_si_unit_y(args->calibration);
+        zmax = gwy_data_line_get_max(args->calibration);
     }
     else {
-        controls.zvf
-            = gwy_brick_get_value_format_z(brick,
-                                           GWY_SI_UNIT_FORMAT_VFMARKUP,
-                                           NULL);
+        siunitz = gwy_brick_get_si_unit_z(brick);
+        zmax = gwy_brick_get_zreal(brick);
     }
+    controls.zvf = gwy_si_unit_get_format_with_digits(siunitz,
+                                                      GWY_SI_UNIT_FORMAT_VFMARKUP,
+                                                      zmax,
+                                                      5, /* 5 digits */
+                                                      NULL);
 
     dialog = gtk_dialog_new_with_buttons(_("Summarize Volume Profiles"),
                                          NULL, 0, NULL);
@@ -710,6 +715,8 @@ extract_summary_image(const LineStatArgs *args, GwyDataField *dfield)
         { GWY_LINE_STAT_MEDIAN,    gwy_data_line_get_median,    },
         { GWY_LINE_STAT_MINIMUM,   gwy_data_line_get_min,       },
         { GWY_LINE_STAT_MAXIMUM,   gwy_data_line_get_max,       },
+        { GWY_LINE_STAT_MINPOS,    gwy_data_line_min_pos_i,     },
+        { GWY_LINE_STAT_MAXPOS,    gwy_data_line_max_pos_i,     },
         { GWY_LINE_STAT_RANGE,     get_data_line_range,         },
         { GWY_LINE_STAT_LENGTH,    gwy_data_line_get_length,    },
         { GWY_LINE_STAT_TAN_BETA0, gwy_data_line_get_tan_beta0, },
@@ -726,12 +733,13 @@ extract_summary_image(const LineStatArgs *args, GwyDataField *dfield)
     GwyLineStatQuantity quantity = args->quantity;
     GwyBrick *brick = args->brick;
     GwySIUnit *imgunit, *zunit, *wunit;
-    gint xres = brick->xres, yres = brick->yres;
+    gint xres = brick->xres, yres = brick->yres, zres = brick->zres;
     gint zfrom = args->zfrom, zto = args->zto;
     LineStatIter iter;
     LineStatFunc lsfunc = NULL;
-    gint i;
+    gint i, j;
     guint k;
+    gdouble *data, val, zreal, zoffset;
 
     if (zfrom == -1 && zto == -1) {
         zfrom = 0;
@@ -765,25 +773,49 @@ extract_summary_image(const LineStatArgs *args, GwyDataField *dfield)
     }
     line_stat_iter_free(&iter);
 
+    if ((quantity == GWY_LINE_STAT_MINPOS)
+        || (quantity == GWY_LINE_STAT_MAXPOS)) {
+        gwy_data_field_add(dfield, zfrom);
+        if (args->calibration) {
+            data = gwy_data_field_get_data(dfield);
+            for (i = 0; i < xres * yres; i++) {
+                j = *(data);
+                val = gwy_data_line_get_val(args->calibration, j);
+                *(data++) = val;
+            }
+            gwy_data_field_data_changed(dfield);
+        }
+        else {
+            zreal = gwy_brick_get_zreal(args->brick);
+            zoffset = gwy_brick_get_zoffset(args->brick);
+            gwy_data_field_multiply(dfield, zreal/zres);
+            gwy_data_field_add(dfield, zoffset);
+        }
+    }
+
     imgunit = gwy_data_field_get_si_unit_z(dfield);
-    wunit = gwy_brick_get_si_unit_z(brick);
+    wunit = gwy_brick_get_si_unit_w(brick);
     if (args->calibration)
         zunit = gwy_data_line_get_si_unit_y(args->calibration);
     else
         zunit = gwy_brick_get_si_unit_z(brick);
 
-    if (quantity == GWY_LINE_STAT_TAN_BETA0
-        || quantity == GWY_LINE_STAT_SLOPE)
+    if ((quantity == GWY_LINE_STAT_MINPOS)
+        || (quantity == GWY_LINE_STAT_MAXPOS)) {
+        gwy_serializable_clone(G_OBJECT(zunit),
+                               G_OBJECT(gwy_data_field_get_si_unit_z(dfield)));
+    }
+    else if ((quantity == GWY_LINE_STAT_TAN_BETA0)
+             || (quantity == GWY_LINE_STAT_SLOPE))
         gwy_si_unit_divide(wunit, zunit, imgunit);
-    else if (quantity == GWY_LINE_STAT_SKEW
-             || quantity == GWY_LINE_STAT_KURTOSIS)
+    else if ((quantity == GWY_LINE_STAT_SKEW)
+             || (quantity == GWY_LINE_STAT_KURTOSIS))
         gwy_si_unit_set_from_string(imgunit, NULL);
     else if (quantity == GWY_LINE_STAT_VARIATION)
         gwy_si_unit_multiply(wunit, zunit, imgunit);
 
     gwy_data_field_invalidate(dfield);
     gwy_data_field_data_changed(dfield);
-
 }
 
 static void
diff --git a/modules/volume/volume_slice.c b/modules/volume/volume_slice.c
index c8d938c..0b0f84c 100644
--- a/modules/volume/volume_slice.c
+++ b/modules/volume/volume_slice.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: volume_slice.c 18886 2016-08-26 08:26:22Z yeti-dn $
+ *  @(#) $Id: volume_slice.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2015-2016 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -25,6 +25,7 @@
 #include <libgwyddion/gwymacros.h>
 #include <libgwyddion/gwymath.h>
 #include <libprocess/brick.h>
+#include <libprocess/gwyprocess.h>
 #include <libgwydgets/gwydataview.h>
 #include <libgwydgets/gwylayer-basic.h>
 #include <libgwydgets/gwyradiobuttons.h>
@@ -170,7 +171,6 @@ static void     extract_graph_curve    (const SliceArgs *args,
                                         gboolean use_calibration);
 static void     extract_gmodel         (const SliceArgs *args,
                                         GwyGraphModel *gmodel);
-static void     flip_xy                (GwyDataField *dfield);
 static void     slice_sanitize_args    (SliceArgs *args);
 static void     slice_load_args        (GwyContainer *container,
                                         SliceArgs *args);
@@ -195,12 +195,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Extracts image planes and line graphs from volume data."),
     "Yeti <yeti at gwyddion.net>",
-    "2.2",
+    "2.3",
     "David Nečas (Yeti)",
     "2015",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, volume_slice)
 
 static gboolean
 module_register(void)
@@ -275,6 +275,8 @@ slice_dialog(SliceArgs *args, GwyContainer *data, gint id)
     GwyDataLine *calibration;
     GwyGraphCurveModel *gcmodel;
     GwyGraphModel *gmodel;
+    GwySIUnit *siunitz;
+    gdouble zmax;
     gint response, row;
     GwyPixmapLayer *layer;
     GwyVectorLayer *vlayer = NULL;
@@ -441,7 +443,10 @@ slice_dialog(SliceArgs *args, GwyContainer *data, gint id)
 
     controls.xpos = gtk_adjustment_new(args->currpos.x, 0.0, brick->xres-1.0,
                                        1.0, 10.0, 0);
-    gwy_table_attach_spinbutton(table, row, _("_X:"), "px", controls.xpos);
+    gwy_table_attach_adjbar(table, row, _("_X:"), _("px"),
+                            controls.xpos, GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
+    gtk_widget_set_size_request(gwy_table_hscale_get_scale(controls.xpos),
+                                96, -1);
     g_signal_connect_swapped(controls.xpos, "value-changed",
                              G_CALLBACK(xpos_changed), &controls);
 
@@ -461,7 +466,10 @@ slice_dialog(SliceArgs *args, GwyContainer *data, gint id)
 
     controls.ypos = gtk_adjustment_new(args->currpos.y, 0.0, brick->yres-1.0,
                                        1.0, 10.0, 0);
-    gwy_table_attach_spinbutton(table, row, _("_Y:"), "px", controls.ypos);
+    gwy_table_attach_adjbar(table, row, _("_Y:"), _("px"),
+                            controls.ypos, GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
+    gtk_widget_set_size_request(gwy_table_hscale_get_scale(controls.xpos),
+                                96, -1);
     g_signal_connect_swapped(controls.ypos, "value-changed",
                              G_CALLBACK(ypos_changed), &controls);
 
@@ -481,7 +489,10 @@ slice_dialog(SliceArgs *args, GwyContainer *data, gint id)
 
     controls.zpos = gtk_adjustment_new(args->currpos.z, 0.0, brick->zres-1.0,
                                        1.0, 10.0, 0);
-    gwy_table_attach_spinbutton(table, row, _("_Z:"), "px", controls.zpos);
+    gwy_table_attach_adjbar(table, row, _("_Z:"), _("px"),
+                            controls.zpos, GWY_HSCALE_LINEAR | GWY_HSCALE_SNAP);
+    gtk_widget_set_size_request(gwy_table_hscale_get_scale(controls.xpos),
+                                96, -1);
     g_signal_connect_swapped(controls.zpos, "value-changed",
                              G_CALLBACK(zpos_changed), &controls);
 
@@ -490,15 +501,18 @@ slice_dialog(SliceArgs *args, GwyContainer *data, gint id)
     gtk_table_attach(GTK_TABLE(table), controls.zposreal,
                      3, 4, row, row+1, GTK_FILL, 0, 0, 0);
     if ((calibration = gwy_brick_get_zcalibration(brick))) {
-        controls.zvf = gwy_data_line_get_value_format_y(calibration,
-                                                        GWY_SI_UNIT_FORMAT_VFMARKUP,
-                                                        NULL);
+        siunitz = gwy_data_line_get_si_unit_y(calibration);
+        zmax = gwy_data_line_get_max(calibration);
     }
     else {
-        controls.zvf = gwy_brick_get_value_format_z(brick,
-                                                    GWY_SI_UNIT_FORMAT_VFMARKUP,
-                                                    NULL);
+        siunitz = gwy_brick_get_si_unit_z(brick);
+        zmax = gwy_brick_get_zreal(brick);
     }
+    controls.zvf = gwy_si_unit_get_format_with_digits(siunitz,
+                                                      GWY_SI_UNIT_FORMAT_VFMARKUP,
+                                                      zmax,
+                                                      5, /* 5 digits */
+                                                      NULL);
     label = gtk_label_new(controls.zvf->units);
     gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
@@ -518,6 +532,7 @@ slice_dialog(SliceArgs *args, GwyContainer *data, gint id)
     update_position(&controls, &pos);
     controls.in_update = FALSE;
     multiselect_changed(&controls, GTK_TOGGLE_BUTTON(controls.multiselect));
+    update_target_graphs(&controls);
 
     gtk_widget_show_all(dialog);
     do {
@@ -730,7 +745,7 @@ plane_selection_changed(SliceControls *controls,
     if (base_plane == PLANE_YZ || base_plane == PLANE_ZY)
         pos.x = CLAMP(gwy_brick_rtoi(brick, r - brick->xoff), 0, brick->xres-1);
     else if (base_plane == PLANE_YX || base_plane == PLANE_XY)
-        pos.z = CLAMP(gwy_brick_rtok(brick, r - brick->zoff), 0, brick->zres-1);
+        pos.z = CLAMP(gwy_brick_rtok_cal(brick, r), 0, brick->zres-1);
     else if (base_plane == PLANE_XZ || base_plane == PLANE_ZX)
         pos.y = CLAMP(gwy_brick_rtoj(brick, r - brick->yoff), 0, brick->yres-1);
     else {
@@ -924,14 +939,14 @@ update_position(SliceControls *controls,
         xy[1] = gwy_brick_jtor(brick, pos->y);
         if (base_plane != PLANE_XY)
             GWY_SWAP(gdouble, xy[0], xy[1]);
-        z = gwy_brick_ktor(brick, pos->z) + brick->zoff;
+        z = gwy_brick_ktor_cal(brick, pos->z);
         point_changed = (pos->x != args->currpos.x
                          || pos->y != args->currpos.y);
         plane_changed = (pos->z != args->currpos.z);
     }
     else if (base_plane == PLANE_XZ || base_plane == PLANE_ZX) {
         xy[0] = gwy_brick_itor(brick, pos->x);
-        xy[1] = gwy_brick_ktor(brick, pos->z);
+        xy[1] = gwy_brick_ktor_cal(brick, pos->z);
         if (base_plane != PLANE_XZ)
             GWY_SWAP(gdouble, xy[0], xy[1]);
         z = gwy_brick_jtor(brick, pos->y) + brick->yoff;
@@ -941,7 +956,7 @@ update_position(SliceControls *controls,
     }
     else if (base_plane == PLANE_YZ || base_plane == PLANE_ZY) {
         xy[0] = gwy_brick_jtor(brick, pos->y);
-        xy[1] = gwy_brick_ktor(brick, pos->z);
+        xy[1] = gwy_brick_ktor_cal(brick, pos->z);
         if (base_plane != PLANE_YZ)
             GWY_SWAP(gdouble, xy[0], xy[1]);
         z = gwy_brick_itor(brick, pos->x) + brick->xoff;
@@ -973,7 +988,7 @@ update_position(SliceControls *controls,
         extract_gmodel(args, gmodel);
 
         gcmodel = gwy_graph_model_get_curve(gmodel, 0);
-        extract_graph_curve(args, gcmodel, controls->current_object, FALSE);
+        extract_graph_curve(args, gcmodel, controls->current_object, TRUE);
     }
 
     if (plane_changed) {
@@ -1033,7 +1048,6 @@ update_labels(SliceControls *controls)
 {
     SliceArgs *args = controls->args;
     GwyBrick *brick = args->brick;
-    GwyDataLine *calibration;
     gdouble x, y, z;
     gchar buf[64];
 
@@ -1047,9 +1061,7 @@ update_labels(SliceControls *controls)
                controls->xvf->precision, y/controls->yvf->magnitude);
     gtk_label_set_markup(GTK_LABEL(controls->yposreal), buf);
 
-    z = gwy_brick_ktor(brick, args->currpos.z);
-    if ((calibration = gwy_brick_get_zcalibration(brick)))
-        z = gwy_data_line_get_val(calibration, args->currpos.z);
+    z = gwy_brick_ktor_cal(brick, args->currpos.z);
     g_snprintf(buf, sizeof(buf), "%.*f",
                controls->zvf->precision, z/controls->zvf->magnitude);
     gtk_label_set_markup(GTK_LABEL(controls->zposreal), buf);
@@ -1141,14 +1153,13 @@ extract_one_image(SliceArgs *args, GwyContainer *data, gint id, gint idx)
 
     if (base_plane == PLANE_XY || base_plane == PLANE_YX) {
         i = pos->z;
+        r = gwy_brick_ktor_cal(brick, i);
         if ((calibration = gwy_brick_get_zcalibration(brick))) {
-            r = gwy_data_line_get_val(calibration, i);
             vf = gwy_data_line_get_value_format_y(calibration,
                                                   GWY_SI_UNIT_FORMAT_VFMARKUP,
                                                   NULL);
         }
         else {
-            r = gwy_brick_ktor(brick, i);
             vf = gwy_brick_get_value_format_z(brick,
                                               GWY_SI_UNIT_FORMAT_VFMARKUP,
                                               NULL);
@@ -1217,8 +1228,11 @@ extract_image_plane(const SliceArgs *args, GwyDataField *dfield)
                                 FALSE);
     }
 
-    if (do_flip)
-        flip_xy(dfield);
+    if (do_flip) {
+        GwyDataField *tmp = gwy_data_field_duplicate(dfield);
+        gwy_data_field_flip_xy(tmp, dfield, FALSE);
+        g_object_unref(tmp);
+    }
 }
 
 static void
@@ -1291,6 +1305,10 @@ extract_graph_curve(const SliceArgs *args,
     else
         gwy_graph_curve_model_set_data_from_dataline(gcmodel, line, 0, 0);
 
+    if (!gwy_graph_curve_model_is_ordered(gcmodel)) {
+        gwy_graph_curve_model_enforce_order(gcmodel);
+    }
+
     g_object_unref(line);
 }
 
@@ -1331,7 +1349,7 @@ extract_gmodel(const SliceArgs *args, GwyGraphModel *gmodel)
     calibration = gwy_brick_get_zcalibration(brick);
     if (base_plane == PLANE_XY || base_plane == PLANE_YX) {
         if (calibration)
-            xunit = gwy_data_line_get_si_unit_x(calibration);
+            xunit = gwy_data_line_get_si_unit_y(calibration);
         else
             xunit = gwy_brick_get_si_unit_z(brick);
     }
@@ -1353,30 +1371,6 @@ extract_gmodel(const SliceArgs *args, GwyGraphModel *gmodel)
     g_object_unref(yunit);
 }
 
-static void
-flip_xy(GwyDataField *dfield)
-{
-    GwyDataField *tmp;
-    gint xres, yres, i, j;
-    gdouble *dd;
-    const gdouble *sd;
-
-    xres = gwy_data_field_get_xres(dfield);
-    yres = gwy_data_field_get_yres(dfield);
-    tmp = gwy_data_field_duplicate(dfield);
-    gwy_data_field_resample(dfield, yres, xres, GWY_INTERPOLATION_NONE);
-    sd = gwy_data_field_get_data_const(tmp);
-    dd = gwy_data_field_get_data(dfield);
-    for (i = 0; i < xres; i++) {
-        for (j = 0; j < yres; j++) {
-            dd[i*yres + j] = sd[j*xres + i];
-        }
-    }
-    gwy_data_field_set_xreal(dfield, gwy_data_field_get_yreal(tmp));
-    gwy_data_field_set_yreal(dfield, gwy_data_field_get_xreal(tmp));
-    g_object_unref(tmp);
-}
-
 static const gchar base_plane_key[]  = "/module/volume_slice/base_plane";
 static const gchar multiselect_key[] = "/module/volume_slice/multiselect";
 static const gchar output_type_key[] = "/module/volume_slice/output_type";
diff --git a/modules/volume/volume_swaxes.c b/modules/volume/volume_swaxes.c
new file mode 100644
index 0000000..ca29366
--- /dev/null
+++ b/modules/volume/volume_swaxes.c
@@ -0,0 +1,716 @@
+/*
+ *  @(#) $Id: volume_swaxes.c 20021 2017-07-04 12:01:06Z yeti-dn $
+ *  Copyright (C) 2017 David Necas (Yeti).
+ *  E-mail: yeti at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <string.h>
+#include <gtk/gtk.h>
+#include <libgwyddion/gwymacros.h>
+#include <libgwyddion/gwymath.h>
+#include <libprocess/brick.h>
+#include <libgwydgets/gwycombobox.h>
+#include <libgwydgets/gwystock.h>
+#include <libgwydgets/gwydgetutils.h>
+#include <libgwymodule/gwymodule-volume.h>
+#include <app/gwyapp.h>
+#include <app/gwymoduleutils.h>
+
+#define SWAXES_RUN_MODES (GWY_RUN_IMMEDIATE | GWY_RUN_INTERACTIVE)
+
+typedef enum {
+    AXIS_XPOS = 0,
+    AXIS_XNEG = 1,
+    AXIS_YPOS = 2,
+    AXIS_YNEG = 3,
+    AXIS_ZPOS = 4,
+    AXIS_ZNEG = 5,
+    NAXES
+} AxisType;
+
+typedef struct {
+    AxisType x;
+    AxisType y;
+    AxisType z;
+    gboolean new_channel;
+} SwapAxesArgs;
+
+typedef struct {
+    SwapAxesArgs *args;
+    GwyBrick *brick;
+    gboolean has_zcal;
+    gint last_changed;
+    gint second_last_changed;
+    GtkWidget *dialog;
+    GtkWidget *x;
+    GtkWidget *y;
+    GtkWidget *z;
+    GtkWidget *new_channel;
+    GtkWidget *message;
+} SwapAxesControls;
+
+static gboolean module_register     (void);
+static void     volume_swaxes       (GwyContainer *data,
+                                     GwyRunType run);
+static gboolean swaxes_dialog       (SwapAxesArgs *args,
+                                     GwyBrick *brick);
+static void     new_channel_changed (GtkToggleButton *toggle,
+                                     SwapAxesControls *controls);
+static void     xaxis_changed       (GtkComboBox *combo,
+                                     SwapAxesControls *controls);
+static void     yaxis_changed       (GtkComboBox *combo,
+                                     SwapAxesControls *controls);
+static void     zaxis_changed       (GtkComboBox *combo,
+                                     SwapAxesControls *controls);
+static void     update_sensitivity  (SwapAxesControls *controls);
+static void     update_third_axis   (SwapAxesControls *controls,
+                                     gint changed_axis);
+static void     update_message      (SwapAxesControls *controls);
+static gboolean axes_are_consistent (const SwapAxesArgs *args);
+static void     swaxes_do           (GwyContainer *data,
+                                     gint id,
+                                     GwyBrick *brick,
+                                     SwapAxesArgs *args);
+static void     swaxes_sanitize_args(SwapAxesArgs *args);
+static void     swaxes_load_args    (GwyContainer *container,
+                                     SwapAxesArgs *args);
+static void     swaxes_save_args    (GwyContainer *container,
+                                     SwapAxesArgs *args);
+
+static const SwapAxesArgs swaxes_defaults = {
+    AXIS_XPOS, AXIS_YPOS, AXIS_ZPOS,
+    FALSE,
+};
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION,
+    &module_register,
+    N_("Swaps axes of volume data."),
+    "Yeti <yeti at gwyddion.net>",
+    "1.0",
+    "David Nečas (Yeti)",
+    "2017",
+};
+
+GWY_MODULE_QUERY2(module_info, volume_swaxes)
+
+static gboolean
+module_register(void)
+{
+    gwy_volume_func_register("volume_swaxes",
+                             (GwyVolumeFunc)&volume_swaxes,
+                             N_("/S_wap axes..."),
+                             NULL,
+                             SWAXES_RUN_MODES,
+                             GWY_MENU_FLAG_VOLUME,
+                             N_("Swap axes"));
+
+    return TRUE;
+}
+
+static void
+volume_swaxes(GwyContainer *data, GwyRunType run)
+{
+    SwapAxesArgs args;
+    GwyBrick *brick = NULL;
+    gboolean ok = TRUE;
+    gint id;
+
+    g_return_if_fail(run & SWAXES_RUN_MODES);
+
+    swaxes_load_args(gwy_app_settings_get(), &args);
+    gwy_app_data_browser_get_current(GWY_APP_BRICK, &brick,
+                                     GWY_APP_BRICK_ID, &id,
+                                     0);
+    g_return_if_fail(GWY_IS_BRICK(brick));
+
+    if (run == GWY_RUN_INTERACTIVE) {
+        ok = swaxes_dialog(&args, brick);
+        swaxes_save_args(gwy_app_settings_get(), &args);
+    }
+
+    if (ok)
+        swaxes_do(data, id, brick, &args);
+}
+
+static gboolean
+swaxes_dialog(SwapAxesArgs *args, GwyBrick *brick)
+{
+    static const GwyEnum axes[] = {
+        { N_("X"),           AXIS_XPOS,  },
+        { N_("X, reversed"), AXIS_XNEG,  },
+        { N_("Y"),           AXIS_YPOS,  },
+        { N_("Y, reversed"), AXIS_YNEG,  },
+        { N_("Z"),           AXIS_ZPOS,  },
+        { N_("Z, reversed"), AXIS_ZNEG,  },
+    };
+
+    GtkWidget *dialog, *table;
+    GtkSizeGroup *sizegroup;
+    SwapAxesControls controls;
+    gint response, row;
+
+    gwy_clear(&controls, 1);
+    controls.args = args;
+    controls.last_changed = 1;
+    controls.second_last_changed = 0;
+    controls.has_zcal = !!gwy_brick_get_zcalibration(brick);
+
+    dialog = gtk_dialog_new_with_buttons(_("Swap Volume Axes"),
+                                         NULL, 0,
+                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                         GTK_STOCK_OK, GTK_RESPONSE_OK,
+                                         NULL);
+    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
+    gwy_help_add_to_volume_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT);
+    controls.dialog = dialog;
+
+    table = gtk_table_new(5, 2, FALSE);
+    gtk_container_set_border_width(GTK_CONTAINER(table), 4);
+    gtk_table_set_col_spacings(GTK_TABLE(table), 6);
+    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
+    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table, TRUE, TRUE, 4);
+    row = 0;
+
+    sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+
+    controls.x = gwy_enum_combo_box_new(axes, G_N_ELEMENTS(axes),
+                                        G_CALLBACK(xaxis_changed), &controls,
+                                        args->x, TRUE);
+    gwy_table_attach_adjbar(table, row, _("Current _X axis will become:"), NULL,
+                            GTK_OBJECT(controls.x), GWY_HSCALE_WIDGET);
+    gtk_size_group_add_widget(sizegroup, controls.x);
+    row++;
+
+    controls.y = gwy_enum_combo_box_new(axes, G_N_ELEMENTS(axes),
+                                        G_CALLBACK(yaxis_changed), &controls,
+                                        args->y, TRUE);
+    gwy_table_attach_adjbar(table, row, _("Current _Y axis will become:"), NULL,
+                            GTK_OBJECT(controls.y), GWY_HSCALE_WIDGET);
+    gtk_size_group_add_widget(sizegroup, controls.y);
+    row++;
+
+    controls.z = gwy_enum_combo_box_new(axes, G_N_ELEMENTS(axes),
+                                        G_CALLBACK(zaxis_changed), &controls,
+                                        args->z, TRUE);
+    gwy_table_attach_adjbar(table, row, _("Current _Z axis will become:"), NULL,
+                            GTK_OBJECT(controls.z), GWY_HSCALE_WIDGET);
+    gtk_size_group_add_widget(sizegroup, controls.z);
+    row++;
+
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    controls.new_channel
+        = gtk_check_button_new_with_mnemonic(_("Create new volume data"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.new_channel),
+                                 args->new_channel);
+    gtk_table_attach(GTK_TABLE(table), controls.new_channel,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    g_signal_connect(controls.new_channel, "toggled",
+                     G_CALLBACK(new_channel_changed), &controls);
+    row++;
+
+    gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8);
+    controls.message = gtk_label_new(NULL);
+    gtk_misc_set_alignment(GTK_MISC(controls.message), 0.0, 0.5);
+    gtk_table_attach(GTK_TABLE(table), controls.message,
+                     0, 2, row, row+1, GTK_FILL, 0, 0, 0);
+    row++;
+
+    g_object_unref(sizegroup);
+    update_message(&controls);
+    update_sensitivity(&controls);
+
+    gtk_widget_show_all(dialog);
+
+    response = gtk_dialog_run(GTK_DIALOG(dialog));
+    gtk_widget_destroy(dialog);
+
+    return response == GTK_RESPONSE_OK;
+}
+
+static void
+new_channel_changed(GtkToggleButton *toggle, SwapAxesControls *controls)
+{
+    controls->args->new_channel = gtk_toggle_button_get_active(toggle);
+    update_sensitivity(controls);
+}
+
+static void
+xaxis_changed(GtkComboBox *combo, SwapAxesControls *controls)
+{
+    controls->args->x = gwy_enum_combo_box_get_active(combo);
+    update_third_axis(controls, 0);
+}
+
+static void
+yaxis_changed(GtkComboBox *combo, SwapAxesControls *controls)
+{
+    controls->args->y = gwy_enum_combo_box_get_active(combo);
+    update_third_axis(controls, 1);
+}
+
+static void
+zaxis_changed(GtkComboBox *combo, SwapAxesControls *controls)
+{
+    controls->args->z = gwy_enum_combo_box_get_active(combo);
+    update_third_axis(controls, 2);
+    update_message(controls);
+}
+
+static void
+update_message(SwapAxesControls *controls)
+{
+    if (!controls->has_zcal)
+        return;
+
+    if (controls->args->z == AXIS_ZPOS || controls->args->z == AXIS_ZNEG)
+        gtk_label_set_text(GTK_LABEL(controls->message), NULL);
+    else {
+        gtk_label_set_text(GTK_LABEL(controls->message),
+                           _("Z axis calibration will be lost."));
+    }
+}
+
+static void
+update_sensitivity(SwapAxesControls *controls)
+{
+    SwapAxesArgs *args = controls->args;
+    gboolean is_noop;
+
+    is_noop = (args->x == AXIS_XPOS
+               && args->y == AXIS_YPOS
+               && args->z == AXIS_ZPOS
+               && !args->new_channel);
+    gtk_dialog_set_response_sensitive(GTK_DIALOG(controls->dialog),
+                                      GTK_RESPONSE_OK, !is_noop);
+}
+
+static void
+update_third_axis(SwapAxesControls *controls, gint changed_axis)
+{
+    SwapAxesArgs *args = controls->args;
+    AxisType xyz[3];
+    gint third, axis_to_fix;
+
+    if (changed_axis == controls->last_changed) {
+        /* Dd nothing. */
+    }
+    else if (changed_axis == controls->second_last_changed)
+        GWY_SWAP(gint, controls->last_changed, controls->second_last_changed);
+    else {
+        controls->second_last_changed = controls->last_changed;
+        controls->last_changed = changed_axis;
+    }
+
+    if (axes_are_consistent(args)) {
+        update_sensitivity(controls);
+        return;
+    }
+
+    third = 3 - (controls->last_changed + controls->second_last_changed);
+    xyz[0] = args->x;
+    xyz[1] = args->y;
+    xyz[2] = args->z;
+
+    if (xyz[third]/2 == xyz[controls->last_changed]/2)
+        axis_to_fix = third;
+    else
+        axis_to_fix = controls->second_last_changed;
+
+    if (axis_to_fix == 0) {
+        args->x = (2*(3 - args->y/2 - args->z/2)) | (args->x & 1);
+        g_assert(axes_are_consistent(args));
+        gwy_enum_combo_box_set_active(GTK_COMBO_BOX(controls->x), args->x);
+    }
+    else if (axis_to_fix == 1) {
+        args->y = (2*(3 - args->z/2 - args->x/2)) | (args->y & 1);
+        g_assert(axes_are_consistent(args));
+        gwy_enum_combo_box_set_active(GTK_COMBO_BOX(controls->y), args->y);
+    }
+    else if (axis_to_fix == 2) {
+        args->z = (2*(3 - args->x/2 - args->y/2)) | (args->z & 1);
+        g_assert(axes_are_consistent(args));
+        gwy_enum_combo_box_set_active(GTK_COMBO_BOX(controls->z), args->z);
+    }
+    else {
+        g_assert_not_reached();
+    }
+}
+
+static gboolean
+axes_are_consistent(const SwapAxesArgs *args)
+{
+    if (args->y/2 == args->x/2)
+        return FALSE;
+    if (args->z/2 == args->y/2)
+        return FALSE;
+    if (args->x/2 == args->z/2)
+        return FALSE;
+
+    return TRUE;
+}
+
+static void
+swaxes_do(GwyContainer *data, gint id, GwyBrick *brick, SwapAxesArgs *args)
+{
+    AxisType ax = args->x, ay = args->y, az = args->z;
+    AxisType bx = 2*(ax/2), by = 2*(ay/2), bz = 2*(az/2);
+    gboolean xinv = ax & 1, yinv = ay & 1, zinv = az & 1;
+    guint oldxres = gwy_brick_get_xres(brick),
+          oldyres = gwy_brick_get_yres(brick),
+          oldzres = gwy_brick_get_zres(brick),
+          xres = oldxres, yres = oldyres, zres = oldzres;
+    gdouble xreal = gwy_brick_get_xreal(brick),
+            yreal = gwy_brick_get_yreal(brick),
+            zreal = gwy_brick_get_zreal(brick),
+            newxreal = xreal, newyreal = yreal, newzreal = zreal;
+    gdouble xoff = gwy_brick_get_xoffset(brick),
+            yoff = gwy_brick_get_yoffset(brick),
+            zoff = gwy_brick_get_zoffset(brick),
+            newxoff = xoff, newyoff = yoff, newzoff = zoff;
+    GwyBrick *result;
+    GwyDataField *preview = NULL;
+    GwyDataLine *zcal = gwy_brick_get_zcalibration(brick);
+    guint i, j, k, n;
+    const gdouble *bdata = gwy_brick_get_data_const(brick);
+    GwySIUnit *oldunit[4], *unit[4];
+    gdouble *rdata, *r1, *r2;
+    GQuark quarks[2];
+
+    /* There are 48 different combinations, which is way too much.  Implement
+     * the transformation in two steps:
+     * 1. Reshaping, without regard of axis inversion (6 types, one trivial). */
+    if (bx == AXIS_XPOS && by == AXIS_YPOS && bz == AXIS_ZPOS) {
+        result = gwy_brick_duplicate(brick);
+    }
+    else if (bx == AXIS_XPOS && by == AXIS_ZPOS && bz == AXIS_YPOS) {
+        /* Y <-> Z */
+        GWY_SWAP(guint, yres, zres);
+        GWY_SWAP(gdouble, newyreal, newzreal);
+        GWY_SWAP(gdouble, newyoff, newzoff);
+        result = gwy_brick_new(xres, yres, zres,
+                               newxreal, newyreal, newzreal,
+                               FALSE);
+        rdata = gwy_brick_get_data(result);
+
+        for (i = 0; i < zres; i++) {
+            for (j = 0; j < yres; j++) {
+                for (k = 0; k < xres; k++, rdata++)
+                    *rdata = bdata[(j*oldyres + i)*oldxres + k];
+            }
+        }
+    }
+    else if (bx == AXIS_YPOS && by == AXIS_XPOS && bz == AXIS_ZPOS) {
+        /* X <-> Y */
+        GWY_SWAP(guint, xres, yres);
+        GWY_SWAP(gdouble, newxreal, newyreal);
+        GWY_SWAP(gdouble, newxoff, newyoff);
+        result = gwy_brick_new(xres, yres, zres,
+                               newxreal, newyreal, newzreal,
+                               FALSE);
+        rdata = gwy_brick_get_data(result);
+
+        for (i = 0; i < zres; i++) {
+            for (j = 0; j < yres; j++) {
+                for (k = 0; k < xres; k++, rdata++)
+                    *rdata = bdata[(i*oldyres + k)*oldxres + j];
+            }
+        }
+
+        if (zcal) {
+            zcal = gwy_data_line_duplicate(zcal);
+            gwy_brick_set_zcalibration(result, zcal);
+            g_object_unref(zcal);
+        }
+    }
+    else if (bx == AXIS_ZPOS && by == AXIS_YPOS && bz == AXIS_XPOS) {
+        /* Z <-> X */
+        GWY_SWAP(guint, zres, xres);
+        GWY_SWAP(gdouble, newzreal, newxreal);
+        GWY_SWAP(gdouble, newzoff, newxoff);
+        result = gwy_brick_new(xres, yres, zres,
+                               newxreal, newyreal, newzreal,
+                               FALSE);
+        rdata = gwy_brick_get_data(result);
+
+        for (i = 0; i < zres; i++) {
+            for (j = 0; j < yres; j++) {
+                for (k = 0; k < xres; k++, rdata++)
+                    *rdata = bdata[(k*oldyres + j)*oldxres + i];
+            }
+        }
+    }
+    else if (bx == AXIS_YPOS && by == AXIS_ZPOS && bz == AXIS_XPOS) {
+        /* X -> Y -> Z -> X */
+        xres = oldzres;
+        yres = oldxres;
+        zres = oldyres;
+        newxreal = zreal;
+        newyreal = xreal;
+        newzreal = yreal;
+        newxoff = zoff;
+        newyoff = xoff;
+        newzoff = yoff;
+        result = gwy_brick_new(xres, yres, zres,
+                               newxreal, newyreal, newzreal,
+                               FALSE);
+        rdata = gwy_brick_get_data(result);
+
+        for (i = 0; i < zres; i++) {
+            for (j = 0; j < yres; j++) {
+                for (k = 0; k < xres; k++, rdata++)
+                    *rdata = bdata[(k*oldyres + i)*oldxres + j];
+            }
+        }
+    }
+    else if (bx == AXIS_ZPOS && by == AXIS_XPOS && bz == AXIS_YPOS) {
+        /* X -> Z -> Y -> X */
+        xres = oldyres;
+        yres = oldzres;
+        zres = oldxres;
+        newxreal = yreal;
+        newyreal = zreal;
+        newzreal = xreal;
+        newxoff = yoff;
+        newyoff = zoff;
+        newzoff = xoff;
+        result = gwy_brick_new(xres, yres, zres,
+                               newxreal, newyreal, newzreal,
+                               FALSE);
+        rdata = gwy_brick_get_data(result);
+
+        for (i = 0; i < zres; i++) {
+            for (j = 0; j < yres; j++) {
+                for (k = 0; k < xres; k++, rdata++)
+                    *rdata = bdata[(j*oldyres + k)*oldxres + i];
+            }
+        }
+    }
+    else {
+        g_assert_not_reached();
+    }
+
+    /* 2. Reverse along axes (8 types, one trivial). */
+    rdata = gwy_brick_get_data(result);
+    if (!xinv && !yinv && !zinv) {
+        /* Do nothing. */
+    }
+    else if (xinv && yinv && zinv) {
+        n = xres*yres*zres;
+        r1 = rdata;
+        r2 = rdata + n-1;
+        for (i = n/2; i; i--, r1++, r2--)
+            GWY_SWAP(gdouble, *r1, *r2);
+    }
+    else if (!xinv && !yinv && zinv) {
+        n = xres*yres;
+        for (i = 0; i < zres/2; i++) {
+            r1 = rdata + i*n;
+            r2 = rdata + (zres-1 - i)*n;
+            for (j = n; j; j--, r1++, r2++)
+                GWY_SWAP(gdouble, *r1, *r2);
+        }
+    }
+    else if (xinv && !yinv && !zinv) {
+        n = yres*zres;
+        for (i = 0; i < n; i++) {
+            r1 = rdata + i*xres;
+            r2 = r1 + xres-1;
+            for (j = xres/2; j; j--, r1++, r2--)
+                GWY_SWAP(gdouble, *r1, *r2);
+        }
+    }
+    else if (!xinv && yinv && !zinv) {
+        for (i = 0; i < zres; i++) {
+            for (j = 0; j < yres/2; j++) {
+                r1 = rdata + (i*yres + j)*xres;
+                r2 = rdata + (i*yres + yres-1 - j)*xres;
+                for (k = xres; k; k--, r1++, r2++)
+                    GWY_SWAP(gdouble, *r1, *r2);
+            }
+        }
+    }
+    else if (xinv && yinv && !zinv) {
+        n = xres*yres;
+        for (i = 0; i < zres; i++) {
+            r1 = rdata + i*n;
+            r2 = r1 + n-1;
+            for (j = n/2; j; j--, r1++, r2--)
+                GWY_SWAP(gdouble, *r1, *r2);
+        }
+    }
+    else if (xinv && !yinv && zinv) {
+        for (i = 0; i < zres/2; i++) {
+            for (j = 0; j < yres; j++) {
+                r1 = rdata + (i*yres + j)*xres;
+                r2 = rdata + ((zres-1 - i)*yres + j)*xres + xres-1;
+                for (k = xres; k; k--, r1++, r2--)
+                    GWY_SWAP(gdouble, *r1, *r2);
+            }
+        }
+    }
+    else if (!xinv && yinv && zinv) {
+        for (i = 0; i < zres/2; i++) {
+            for (j = 0; j < yres; j++) {
+                r1 = rdata + (i*yres + j)*xres;
+                r2 = rdata + ((zres-1 - i)*yres + (yres-1 - j))*xres;
+                for (k = xres; k; k--, r1++, r2++)
+                    GWY_SWAP(gdouble, *r1, *r2);
+            }
+        }
+    }
+    else {
+        g_assert_not_reached();
+    }
+
+    /* The result can only have a calibration if Z axis was preserved. */
+    if (zinv && (zcal = gwy_brick_get_zcalibration(result))) {
+        gwy_data_line_invert(zcal, TRUE, FALSE);
+    }
+
+    gwy_brick_set_xoffset(result, xoff);
+    gwy_brick_set_yoffset(result, yoff);
+    gwy_brick_set_zoffset(result, zoff);
+
+    /* Reuse the old preview if the XY plane is preserved. */
+    if (gwy_container_gis_object(data, gwy_app_get_brick_preview_key_for_id(id),
+                                 &preview)
+        && (bx == AXIS_XPOS || bx == AXIS_YPOS)
+        && (by == AXIS_XPOS || by == AXIS_YPOS)) {
+        GwyDataField *tmp;
+
+        if (ax == AXIS_YPOS && ay == AXIS_XNEG)
+            tmp = gwy_data_field_new_rotated_90(preview, TRUE);
+        else if (ax == AXIS_YNEG && ay == AXIS_XPOS)
+            tmp = gwy_data_field_new_rotated_90(preview, FALSE);
+        else {
+            tmp = gwy_data_field_duplicate(preview);
+            if (ax == AXIS_XPOS && ay == AXIS_YPOS) {
+                /* Do nothing. */
+            }
+            else if (ax == AXIS_XNEG && ay == AXIS_YNEG)
+                gwy_data_field_invert(tmp, TRUE, TRUE, FALSE);
+            else if (ax == AXIS_XNEG && ay == AXIS_YPOS)
+                gwy_data_field_invert(tmp, FALSE, TRUE, FALSE);
+            else if (ax == AXIS_XPOS && ay == AXIS_YNEG)
+                gwy_data_field_invert(tmp, TRUE, FALSE, FALSE);
+            else if (ax == AXIS_YPOS && ay == AXIS_XPOS)
+                gwy_data_field_flip_xy(preview, tmp, FALSE);
+            else if (ax == AXIS_YNEG && ay == AXIS_XNEG)
+                gwy_data_field_flip_xy(preview, tmp, TRUE);
+            else {
+                g_assert_not_reached();
+            }
+        }
+        GWY_SWAP(GwyDataField*, tmp, preview);
+
+        gwy_data_field_set_xoffset(preview, xoff);
+        gwy_data_field_set_yoffset(preview, yoff);
+    }
+    else {
+        preview = gwy_data_field_new(xres, yres, newxreal, yres, FALSE);
+        gwy_brick_mean_plane(result, preview, 0, 0, 0, xres, yres, -1, TRUE);
+    }
+
+    /* Set units. */
+    oldunit[0] = gwy_brick_get_si_unit_x(brick);
+    oldunit[1] = gwy_brick_get_si_unit_y(brick);
+    oldunit[2] = gwy_brick_get_si_unit_z(brick);
+    oldunit[3] = gwy_brick_get_si_unit_w(brick);
+    unit[0] = gwy_brick_get_si_unit_x(result);
+    unit[1] = gwy_brick_get_si_unit_y(result);
+    unit[2] = gwy_brick_get_si_unit_z(result);
+    unit[3] = gwy_brick_get_si_unit_w(result);
+    gwy_serializable_clone(G_OBJECT(oldunit[0]), G_OBJECT(unit[bx/2]));
+    gwy_serializable_clone(G_OBJECT(oldunit[1]), G_OBJECT(unit[by/2]));
+    gwy_serializable_clone(G_OBJECT(oldunit[2]), G_OBJECT(unit[bz/2]));
+    gwy_serializable_clone(G_OBJECT(oldunit[3]), G_OBJECT(unit[3]));
+
+    /* Create new channel or modify the current one. */
+    if (args->new_channel) {
+        gint newid;
+        const guchar *gradient;
+
+        newid = gwy_app_data_browser_add_brick(result, preview, data, TRUE);
+        gwy_app_set_brick_title(data, id, _("Rotated Data"));
+        gwy_app_volume_log_add_volume(data, id, newid);
+
+        quarks[0] = gwy_app_get_brick_palette_key_for_id(id);
+        quarks[1] = gwy_app_get_brick_palette_key_for_id(newid);
+        if (gwy_container_gis_string(data, quarks[0], &gradient))
+            gwy_container_set_const_string(data, quarks[1], gradient);
+    }
+    else {
+        quarks[0] = gwy_app_get_brick_key_for_id(id);
+        quarks[1] = gwy_app_get_brick_preview_key_for_id(id);
+        gwy_app_undo_qcheckpointv(data, G_N_ELEMENTS(quarks), quarks);
+        gwy_container_set_object(data, quarks[0], result);
+        gwy_container_set_object(data, quarks[1], preview);
+        gwy_app_volume_log_add_volume(data, id, id);
+    }
+
+    g_object_unref(result);
+    g_object_unref(preview);
+}
+
+static const gchar x_key[]           = "/module/volume_swaxes/x";
+static const gchar y_key[]           = "/module/volume_swaxes/y";
+static const gchar z_key[]           = "/module/volume_swaxes/z";
+static const gchar new_channel_key[] = "/module/volume_swaxes/new_channel";
+
+static void
+swaxes_sanitize_args(SwapAxesArgs *args)
+{
+    args->x = MIN(args->x, NAXES-1);
+    args->y = MIN(args->y, NAXES-1);
+    args->z = MIN(args->z, NAXES-1);
+    args->new_channel = !!args->new_channel;
+
+    /* Do not bother fixing invalid configurations, reset to no-op. */
+    if (!axes_are_consistent(args)) {
+        args->x = swaxes_defaults.x;
+        args->y = swaxes_defaults.y;
+        args->z = swaxes_defaults.z;
+    }
+}
+
+static void
+swaxes_load_args(GwyContainer *container, SwapAxesArgs *args)
+{
+    *args = swaxes_defaults;
+
+    gwy_container_gis_enum_by_name(container, x_key, &args->x);
+    gwy_container_gis_enum_by_name(container, y_key, &args->y);
+    gwy_container_gis_enum_by_name(container, z_key, &args->z);
+    gwy_container_gis_boolean_by_name(container, new_channel_key,
+                                      &args->new_channel);
+    swaxes_sanitize_args(args);
+}
+
+static void
+swaxes_save_args(GwyContainer *container, SwapAxesArgs *args)
+{
+    gwy_container_set_enum_by_name(container, x_key, args->x);
+    gwy_container_set_enum_by_name(container, y_key, args->y);
+    gwy_container_set_enum_by_name(container, z_key, args->z);
+    gwy_container_set_boolean_by_name(container, new_channel_key,
+                                      args->new_channel);
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/volume/volume_zcal.c b/modules/volume/volume_zcal.c
index d59b171..20a804e 100644
--- a/modules/volume/volume_zcal.c
+++ b/modules/volume/volume_zcal.c
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: volume_zcal.c 18626 2016-04-22 10:15:13Z yeti-dn $
+ *  @(#) $Id: volume_zcal.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2015 David Necas (Yeti).
  *  E-mail: yeti at gwyddion.net.
  *
@@ -108,7 +108,7 @@ static GwyModuleInfo module_info = {
     "2015",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, volume_zcal)
 
 static gboolean
 module_register(void)
diff --git a/modules/volume/volumeops.c b/modules/volume/volumeops.c
new file mode 100644
index 0000000..8d6c817
--- /dev/null
+++ b/modules/volume/volumeops.c
@@ -0,0 +1,89 @@
+/*
+ *  @(#) $Id: volumeops.c 20008 2017-07-02 20:54:14Z yeti-dn $
+ *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
+ *  E-mail: yeti at gwyddion.net, klapetek at gwyddion.net.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <gtk/gtk.h>
+#include <libgwyddion/gwymacros.h>
+#include <libprocess/brick.h>
+#include <libgwydgets/gwystock.h>
+#include <libgwymodule/gwymodule-volume.h>
+#include <app/gwyapp.h>
+
+#define VOLUMEOPS_RUN_MODES (GWY_RUN_IMMEDIATE)
+
+static gboolean module_register(void);
+static void     extract_preview(GwyContainer *data,
+                                GwyRunType run);
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION,
+    &module_register,
+    N_("Inverts value in volume data"),
+    "Yeti <yeti at gwyddion.net>",
+    "1.1",
+    "David Nečas (Yeti)",
+    "2017",
+};
+
+GWY_MODULE_QUERY2(module_info, volumeops)
+
+static gboolean
+module_register(void)
+{
+    gwy_volume_func_register("extract_preview",
+                             (GwyVolumeFunc)&extract_preview,
+                             N_("/Extract _Preview"),
+                             NULL,
+                             VOLUMEOPS_RUN_MODES,
+                             GWY_MENU_FLAG_VOLUME,
+                             N_("Extract volume data preview to an image"));
+
+    return TRUE;
+}
+
+static void
+extract_preview(GwyContainer *data, GwyRunType run)
+{
+    GwyDataField *dfield = NULL;
+    GQuark quark;
+    gint id, newid;
+    gchar *title;
+
+    g_return_if_fail(run & VOLUMEOPS_RUN_MODES);
+
+    gwy_app_data_browser_get_current(GWY_APP_BRICK_ID, &id, 0);
+
+    quark = gwy_app_get_brick_preview_key_for_id(id);
+    dfield = gwy_data_field_duplicate(gwy_container_get_object(data, quark));
+    title = gwy_app_get_brick_title(data, id);
+
+    g_return_if_fail(GWY_IS_DATA_FIELD(dfield));
+
+    newid = gwy_app_data_browser_add_data_field(dfield, data, TRUE);
+    g_object_unref(dfield);
+
+    quark = gwy_app_get_data_title_key_for_id(newid);
+    gwy_container_set_string(data, quark, (guchar*)title);
+
+    gwy_app_channel_log_add(data, -1, newid, "volume::extract_preview", NULL);
+}
+
+/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/xyz/Makefile.am b/modules/xyz/Makefile.am
index 163e51c..55f863a 100644
--- a/modules/xyz/Makefile.am
+++ b/modules/xyz/Makefile.am
@@ -1,4 +1,4 @@
-# @(#) $Id: Makefile.am 18893 2016-08-27 08:49:04Z yeti-dn $
+# @(#) $Id: Makefile.am 20001 2017-06-29 21:52:24Z yeti-dn $
 
 # Put sources that are for some reason disabled yet present in svn checkouts
 # here.  This makes them distributed and translations of their messages are
@@ -7,11 +7,26 @@ disabled_sources =
 
 xyzdir = $(pkglibdir)/modules/xyz
 
-xyz_LTLIBRARIES = \
+# Only bundle modules without own dependencies.  If something goes wrong with
+# any required libraries at run-time, it will at most break these individual
+# unbundled modules, not the bundle.
+bundlable_modules = \
 	xyz_drift.la \
 	xyz_level.la \
 	xyz_raster.la
 
+# xyz_modules is either the bundle or all the individual modules.
+if MODULE_BUNDLING
+xyz_modules = xyz.la
+BUILT_SOURCES = xyz.c
+xyz_la_CFLAGS = $(AM_CFLAGS) -DGWY_MODULE_BUNDLING
+else
+xyz_modules = $(bundlable_modules)
+endif
+
+xyz_LTLIBRARIES = \
+	$(xyz_modules)
+
 EXTRA_DIST = \
 	$(disabled_sources)
 
@@ -19,10 +34,6 @@ if OS_MSWIN
 no_undefined = -no-undefined
 endif
 
-AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
-AM_CFLAGS = @COMMON_CFLAGS@
-AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
-
 if MODULE_DEPENDENCIES
 module_libadd = \
 	$(top_builddir)/app/libgwyapp2.la \
@@ -34,10 +45,26 @@ module_libadd = \
 	@GTK_LIBS@
 endif
 
+AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
+AM_CFLAGS = @COMMON_CFLAGS@
+AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
+
+# Bundlable modules, must be listed in xyz_la_SOURCES below.
 xyz_drift_la_SOURCES  = xyz_drift.c
 xyz_level_la_SOURCES  = xyz_level.c
 xyz_raster_la_SOURCES = xyz_raster.c
 
+xyz_la_SOURCES = \
+	$(xyz_drift_la_SOURCES) \
+	$(xyz_level_la_SOURCES) \
+	$(xyz_raster_la_SOURCES) \
+	xyz.c
+
+xyz.c: $(srcdir)/Makefile.am $(top_srcdir)/utils/gen-module-bundle.sh
+	$(SHELL) $(top_srcdir)/utils/gen-module-bundle.sh xyz.c $(bundlable_modules)
+
+CLEAN_FILES = xyz.c
+
 clean-local:
 	rm -f core.* *~
 
diff --git a/modules/xyz/Makefile.in b/modules/xyz/Makefile.in
index fe32db1..ab6ffa5 100644
--- a/modules/xyz/Makefile.in
+++ b/modules/xyz/Makefile.in
@@ -14,7 +14,7 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 18893 2016-08-27 08:49:04Z yeti-dn $
+# @(#) $Id: Makefile.am 20001 2017-06-29 21:52:24Z yeti-dn $
 
 VPATH = @srcdir@
 am__is_gnu_make = { \
@@ -138,19 +138,33 @@ am__uninstall_files_from_dir = { \
   }
 am__installdirs = "$(DESTDIR)$(xyzdir)"
 LTLIBRARIES = $(xyz_LTLIBRARIES)
-xyz_drift_la_LIBADD =
-am_xyz_drift_la_OBJECTS = xyz_drift.lo
-xyz_drift_la_OBJECTS = $(am_xyz_drift_la_OBJECTS)
+xyz_la_LIBADD =
+am__objects_1 = xyz_la-xyz_drift.lo
+am__objects_2 = xyz_la-xyz_level.lo
+am__objects_3 = xyz_la-xyz_raster.lo
+am_xyz_la_OBJECTS = $(am__objects_1) $(am__objects_2) $(am__objects_3) \
+	xyz_la-xyz.lo
+xyz_la_OBJECTS = $(am_xyz_la_OBJECTS)
 AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
+xyz_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(xyz_la_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+ at MODULE_BUNDLING_TRUE@am_xyz_la_rpath = -rpath $(xyzdir)
+xyz_drift_la_LIBADD =
+am_xyz_drift_la_OBJECTS = xyz_drift.lo
+xyz_drift_la_OBJECTS = $(am_xyz_drift_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_xyz_drift_la_rpath = -rpath $(xyzdir)
 xyz_level_la_LIBADD =
 am_xyz_level_la_OBJECTS = xyz_level.lo
 xyz_level_la_OBJECTS = $(am_xyz_level_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_xyz_level_la_rpath = -rpath $(xyzdir)
 xyz_raster_la_LIBADD =
 am_xyz_raster_la_OBJECTS = xyz_raster.lo
 xyz_raster_la_OBJECTS = $(am_xyz_raster_la_OBJECTS)
+ at MODULE_BUNDLING_FALSE@am_xyz_raster_la_rpath = -rpath $(xyzdir)
 AM_V_P = $(am__v_P_ at AM_V@)
 am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -185,10 +199,10 @@ AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = $(xyz_drift_la_SOURCES) $(xyz_level_la_SOURCES) \
-	$(xyz_raster_la_SOURCES)
-DIST_SOURCES = $(xyz_drift_la_SOURCES) $(xyz_level_la_SOURCES) \
-	$(xyz_raster_la_SOURCES)
+SOURCES = $(xyz_la_SOURCES) $(xyz_drift_la_SOURCES) \
+	$(xyz_level_la_SOURCES) $(xyz_raster_la_SOURCES)
+DIST_SOURCES = $(xyz_la_SOURCES) $(xyz_drift_la_SOURCES) \
+	$(xyz_level_la_SOURCES) $(xyz_raster_la_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -254,10 +268,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -267,6 +278,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -291,7 +304,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -349,6 +364,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -357,17 +373,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -458,18 +470,28 @@ top_srcdir = @top_srcdir@
 # kept.  If we remove them completely, various bits can get lost.
 disabled_sources = 
 xyzdir = $(pkglibdir)/modules/xyz
-xyz_LTLIBRARIES = \
+
+# Only bundle modules without own dependencies.  If something goes wrong with
+# any required libraries at run-time, it will at most break these individual
+# unbundled modules, not the bundle.
+bundlable_modules = \
 	xyz_drift.la \
 	xyz_level.la \
 	xyz_raster.la
 
+ at MODULE_BUNDLING_FALSE@xyz_modules = $(bundlable_modules)
+
+# xyz_modules is either the bundle or all the individual modules.
+ at MODULE_BUNDLING_TRUE@xyz_modules = xyz.la
+ at MODULE_BUNDLING_TRUE@BUILT_SOURCES = xyz.c
+ at MODULE_BUNDLING_TRUE@xyz_la_CFLAGS = $(AM_CFLAGS) -DGWY_MODULE_BUNDLING
+xyz_LTLIBRARIES = \
+	$(xyz_modules)
+
 EXTRA_DIST = \
 	$(disabled_sources)
 
 @OS_MSWIN_TRUE at no_undefined = -no-undefined
-AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
-AM_CFLAGS = @COMMON_CFLAGS@
-AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
 @MODULE_DEPENDENCIES_TRUE at module_libadd = \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/app/libgwyapp2.la \
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libdraw/libgwydraw2.la \
@@ -479,10 +501,23 @@ AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
 @MODULE_DEPENDENCIES_TRUE@	$(top_builddir)/libprocess/libgwyprocess2.la \
 @MODULE_DEPENDENCIES_TRUE@	@GTK_LIBS@
 
+AM_CPPFLAGS = -I$(top_srcdir) -DG_LOG_DOMAIN=\"Module\"
+AM_CFLAGS = @COMMON_CFLAGS@
+AM_LDFLAGS = -avoid-version -module $(no_undefined) $(module_libadd)
+
+# Bundlable modules, must be listed in xyz_la_SOURCES below.
 xyz_drift_la_SOURCES = xyz_drift.c
 xyz_level_la_SOURCES = xyz_level.c
 xyz_raster_la_SOURCES = xyz_raster.c
-all: all-am
+xyz_la_SOURCES = \
+	$(xyz_drift_la_SOURCES) \
+	$(xyz_level_la_SOURCES) \
+	$(xyz_raster_la_SOURCES) \
+	xyz.c
+
+CLEAN_FILES = xyz.c
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
 
 .SUFFIXES:
 .SUFFIXES: .c .lo .o .obj
@@ -551,14 +586,17 @@ clean-xyzLTLIBRARIES:
 	  rm -f $${locs}; \
 	}
 
+xyz.la: $(xyz_la_OBJECTS) $(xyz_la_DEPENDENCIES) $(EXTRA_xyz_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(xyz_la_LINK) $(am_xyz_la_rpath) $(xyz_la_OBJECTS) $(xyz_la_LIBADD) $(LIBS)
+
 xyz_drift.la: $(xyz_drift_la_OBJECTS) $(xyz_drift_la_DEPENDENCIES) $(EXTRA_xyz_drift_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(xyzdir) $(xyz_drift_la_OBJECTS) $(xyz_drift_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_xyz_drift_la_rpath) $(xyz_drift_la_OBJECTS) $(xyz_drift_la_LIBADD) $(LIBS)
 
 xyz_level.la: $(xyz_level_la_OBJECTS) $(xyz_level_la_DEPENDENCIES) $(EXTRA_xyz_level_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(xyzdir) $(xyz_level_la_OBJECTS) $(xyz_level_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_xyz_level_la_rpath) $(xyz_level_la_OBJECTS) $(xyz_level_la_LIBADD) $(LIBS)
 
 xyz_raster.la: $(xyz_raster_la_OBJECTS) $(xyz_raster_la_DEPENDENCIES) $(EXTRA_xyz_raster_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) -rpath $(xyzdir) $(xyz_raster_la_OBJECTS) $(xyz_raster_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK) $(am_xyz_raster_la_rpath) $(xyz_raster_la_OBJECTS) $(xyz_raster_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -567,6 +605,10 @@ distclean-compile:
 	-rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/xyz_drift.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/xyz_la-xyz.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/xyz_la-xyz_drift.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/xyz_la-xyz_level.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/xyz_la-xyz_raster.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/xyz_level.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/xyz_raster.Plo at am__quote@
 
@@ -591,6 +633,34 @@ distclean-compile:
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
+xyz_la-xyz_drift.lo: xyz_drift.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xyz_la_CFLAGS) $(CFLAGS) -MT xyz_la-xyz_drift.lo -MD -MP -MF $(DEPDIR)/xyz_la-xyz_drift.Tpo -c -o xyz_la-xyz_drift.lo `test -f 'xyz_drift.c' || echo '$(srcdir)/'`xyz_drift.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/xyz_la-xyz_drift.Tpo $(DEPDIR)/xyz_la-xyz_drift.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='xyz_drift.c' object='xyz_la-xyz_drift.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xyz_la_CFLAGS) $(CFLAGS) -c -o xyz_la-xyz_drift.lo `test -f 'xyz_drift.c' || echo '$(srcdir)/'`xyz_drift.c
+
+xyz_la-xyz_level.lo: xyz_level.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xyz_la_CFLAGS) $(CFLAGS) -MT xyz_la-xyz_level.lo -MD -MP -MF $(DEPDIR)/xyz_la-xyz_level.Tpo -c -o xyz_la-xyz_level.lo `test -f 'xyz_level.c' || echo '$(srcdir)/'`xyz_level.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/xyz_la-xyz_level.Tpo $(DEPDIR)/xyz_la-xyz_level.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='xyz_level.c' object='xyz_la-xyz_level.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xyz_la_CFLAGS) $(CFLAGS) -c -o xyz_la-xyz_level.lo `test -f 'xyz_level.c' || echo '$(srcdir)/'`xyz_level.c
+
+xyz_la-xyz_raster.lo: xyz_raster.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xyz_la_CFLAGS) $(CFLAGS) -MT xyz_la-xyz_raster.lo -MD -MP -MF $(DEPDIR)/xyz_la-xyz_raster.Tpo -c -o xyz_la-xyz_raster.lo `test -f 'xyz_raster.c' || echo '$(srcdir)/'`xyz_raster.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/xyz_la-xyz_raster.Tpo $(DEPDIR)/xyz_la-xyz_raster.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='xyz_raster.c' object='xyz_la-xyz_raster.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xyz_la_CFLAGS) $(CFLAGS) -c -o xyz_la-xyz_raster.lo `test -f 'xyz_raster.c' || echo '$(srcdir)/'`xyz_raster.c
+
+xyz_la-xyz.lo: xyz.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xyz_la_CFLAGS) $(CFLAGS) -MT xyz_la-xyz.lo -MD -MP -MF $(DEPDIR)/xyz_la-xyz.Tpo -c -o xyz_la-xyz.lo `test -f 'xyz.c' || echo '$(srcdir)/'`xyz.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/xyz_la-xyz.Tpo $(DEPDIR)/xyz_la-xyz.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='xyz.c' object='xyz_la-xyz.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xyz_la_CFLAGS) $(CFLAGS) -c -o xyz_la-xyz.lo `test -f 'xyz.c' || echo '$(srcdir)/'`xyz.c
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
@@ -680,13 +750,15 @@ distdir: $(DISTFILES)
 	  fi; \
 	done
 check-am: all-am
-check: check-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
 all-am: Makefile $(LTLIBRARIES)
 installdirs:
 	for dir in "$(DESTDIR)$(xyzdir)"; do \
 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
-install: install-am
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
 install-exec: install-exec-am
 install-data: install-data-am
 uninstall: uninstall-am
@@ -716,6 +788,7 @@ distclean-generic:
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
 clean: clean-am
 
 clean-am: clean-generic clean-libtool clean-local clean-xyzLTLIBRARIES \
@@ -787,7 +860,7 @@ ps-am:
 
 uninstall-am: uninstall-xyzLTLIBRARIES
 
-.MAKE: install-am install-strip
+.MAKE: all check install install-am install-strip
 
 .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
 	clean-libtool clean-local clean-xyzLTLIBRARIES cscopelist-am \
@@ -806,6 +879,9 @@ uninstall-am: uninstall-xyzLTLIBRARIES
 .PRECIOUS: Makefile
 
 
+xyz.c: $(srcdir)/Makefile.am $(top_srcdir)/utils/gen-module-bundle.sh
+	$(SHELL) $(top_srcdir)/utils/gen-module-bundle.sh xyz.c $(bundlable_modules)
+
 clean-local:
 	rm -f core.* *~
 
diff --git a/modules/xyz/xyz.c b/modules/xyz/xyz.c
new file mode 100644
index 0000000..6bd4e72
--- /dev/null
+++ b/modules/xyz/xyz.c
@@ -0,0 +1,30 @@
+/* This is a GENERATED file. */
+#include <glib.h>
+#include <libgwymodule/gwymodule.h>
+
+static const GwyModuleRecord* register_bundle(void);
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION | GWY_MODULE_BUNDLE_FLAG,
+    (GwyModuleRegisterFunc)&register_bundle,
+    NULL, NULL, NULL, NULL, NULL,
+};
+
+GWY_MODULE_QUERY(module_info)
+
+GwyModuleInfo* _gwy_module_query__xyz_drift(void);
+GwyModuleInfo* _gwy_module_query__xyz_level(void);
+GwyModuleInfo* _gwy_module_query__xyz_raster(void);
+
+static const GwyModuleRecord modules[] = {
+  { _gwy_module_query__xyz_drift, "xyz_drift", },
+  { _gwy_module_query__xyz_level, "xyz_level", },
+  { _gwy_module_query__xyz_raster, "xyz_raster", },
+  { NULL, NULL, },
+};
+
+static const GwyModuleRecord*
+register_bundle(void)
+{
+    return modules;
+}
diff --git a/modules/xyz/xyz_drift.c b/modules/xyz/xyz_drift.c
index 43d20ef..3029020 100644
--- a/modules/xyz/xyz_drift.c
+++ b/modules/xyz/xyz_drift.c
@@ -84,7 +84,7 @@ typedef struct {
     gdouble zdrift_b;
     gdouble zdrift_c;
     gint zdrift_average;
-  
+
     gboolean fit_xdrift;
     gboolean fit_ydrift;
     gboolean fit_zdrift;
@@ -95,8 +95,8 @@ typedef struct {
 
     gdouble threshold_time;
     gdouble threshold_length;
-    gdouble neighbors;   
-    gint iterations; 
+    gdouble neighbors;
+    gint iterations;
 
     /* Interface only. */
     gdouble xmin;
@@ -225,9 +225,9 @@ static void          threshold_changed      (XYZDriftControls *controls,
                                              GtkAdjustment *adj);
 static void          iterations_changed     (XYZDriftControls *controls,
                                              GtkAdjustment *adj);
-static void          zdrift_type_changed    (GtkWidget *combo, 
+static void          zdrift_type_changed    (GtkWidget *combo,
                                              XYZDriftControls *controls);
-static void          graph_changed          (GtkWidget *combo, 
+static void          graph_changed          (GtkWidget *combo,
                                              XYZDriftControls *controls);
 static void          reset_ranges           (XYZDriftControls *controls);
 static void          preview                (XYZDriftControls *controls);
@@ -244,12 +244,12 @@ static void          xyzdrift_load_args       (GwyContainer *container,
 static void          xyzdrift_save_args       (GwyContainer *container,
                                              XYZDriftArgs *args);
 
-static void          correct_drift          (GwyXYZ *points, 
-                                             gint npoints, 
-                                             gdouble *xdrift, 
-                                             gdouble *ydrift, 
+static void          correct_drift          (GwyXYZ *points,
+                                             gint npoints,
+                                             gdouble *xdrift,
+                                             gdouble *ydrift,
                                              gdouble *zdrift,
-                                             GwyXYZ *corpoints, 
+                                             GwyXYZ *corpoints,
                                              gboolean correctz);
 
 static const XYZDriftArgs xyzdrift_defaults = {
@@ -271,7 +271,7 @@ static GwyModuleInfo module_info = {
     "2016",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, xyz_drift)
 
 static gboolean
 module_register(void)
@@ -343,7 +343,7 @@ xyzdrift(GwyContainer *data, GwyRunType run)
        siunit = gwy_surface_get_si_unit_z(timesurface);
 
        if (gwy_si_unit_equal(siunit, siunits)
-           || gwy_strequal(title, "Timestamp")) {
+           || g_ascii_strcasecmp(title, "Timestamp") == 0) {
           rdata.timesurface = gwy_container_get_object(data, key);
           rdata.timepoints = rdata.timesurface->data;
           rdata.ntimepoints = rdata.timesurface->n;
@@ -364,7 +364,7 @@ xyzdrift(GwyContainer *data, GwyRunType run)
        gtk_widget_destroy (dialog);
        return;
     }
-    
+
 
     initialize_ranges(&rdata, &args);
 
@@ -396,7 +396,7 @@ xyzdrift(GwyContainer *data, GwyRunType run)
                      NULL);
 
         gcmodel = gwy_graph_curve_model_new();
-        gwy_graph_curve_model_set_data(gcmodel, rdata.time, rdata.xdrift, 
+        gwy_graph_curve_model_set_data(gcmodel, rdata.time, rdata.xdrift,
                                        rdata.npoints);
 
         g_object_set(gcmodel, "description", _("x-axis drift"), NULL);
@@ -415,7 +415,7 @@ xyzdrift(GwyContainer *data, GwyRunType run)
                      NULL);
 
         gcmodel = gwy_graph_curve_model_new();
-        gwy_graph_curve_model_set_data(gcmodel, rdata.time, rdata.ydrift, 
+        gwy_graph_curve_model_set_data(gcmodel, rdata.time, rdata.ydrift,
                                        rdata.npoints);
 
         g_object_set(gcmodel, "description", _("y-axis drift"), NULL);
@@ -434,7 +434,7 @@ xyzdrift(GwyContainer *data, GwyRunType run)
                      NULL);
 
         gcmodel = gwy_graph_curve_model_new();
-        gwy_graph_curve_model_set_data(gcmodel, rdata.time, rdata.zdrift, 
+        gwy_graph_curve_model_set_data(gcmodel, rdata.time, rdata.zdrift,
                                        rdata.npoints);
 
         g_object_set(gcmodel, "description", _("z-axis drift"), NULL);
@@ -735,7 +735,7 @@ construct_resolutions(XYZDriftControls *controls,
     gtk_label_set_mnemonic_widget(GTK_LABEL(label), spin);
     gtk_table_attach(table, spin, 1, 2, row, row+1,
                      GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    label = gtk_label_new("px");
+    label = gtk_label_new(_("px"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(table, label, 2, 3, row, row+1,
                      GTK_EXPAND | GTK_FILL, 0, 0, 0);
@@ -750,7 +750,7 @@ construct_resolutions(XYZDriftControls *controls,
     gtk_label_set_mnemonic_widget(GTK_LABEL(label), spin);
     gtk_table_attach(table, spin, 1, 2, row, row+1,
                      GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    label = gtk_label_new("px");
+    label = gtk_label_new(_("px"));
     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
     gtk_table_attach(table, label, 2, 3, row, row+1,
                      GTK_EXPAND | GTK_FILL, 0, 0, 0);
@@ -834,7 +834,7 @@ construct_options(XYZDriftControls *controls,
     GwySurface *surface = controls->rdata->surface;
     GwySIValueFormat *vf;
 
- 
+
     GtkWidget *label, *spin, *button;
     static const GwyEnum zdrifts[] = {
         { N_("2nd order polynom"),  GWY_XYZDRIFT_ZMETHOD_POLYNOM,  },
@@ -1107,7 +1107,7 @@ construct_options(XYZDriftControls *controls,
                      G_CALLBACK(x_to_inits_cb), controls);
 
 
- 
+
     row++;
 
     label = gtk_label_new(_("Y drift:"));
@@ -1142,7 +1142,7 @@ construct_options(XYZDriftControls *controls,
                      G_CALLBACK(z_to_inits_cb), controls);
 
    gwy_si_unit_value_format_free(vf);
- 
+
 
     return row;
 }
@@ -1322,7 +1322,7 @@ zdrift_changed(XYZDriftControls *controls,
     //args->zdrift_average = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls->zdrift_average));
 }
 
-static void          
+static void
 zdrift_type_changed(G_GNUC_UNUSED GtkWidget *combo, XYZDriftControls *controls)
 {
 
@@ -1380,7 +1380,7 @@ find_next_pos(double px, G_GNUC_UNUSED double ppx, double pv, double ppv, double
 
 
 
-static void          
+static void
 graph_changed(G_GNUC_UNUSED GtkWidget *combo, XYZDriftControls *controls)
 {
     GwyGraphCurveModel *gcmodel;
@@ -1528,7 +1528,7 @@ get_bining(GwyXYZ *points, gint npoints, gint ***bin, gint **nbin, gdouble xreal
 }
 
 static gint
-find_closest_point_bining(GwyXYZ *points, gdouble *time, gdouble tt, gdouble pt, gint index, gint ***bin, gint **nbin, 
+find_closest_point_bining(GwyXYZ *points, gdouble *time, gdouble tt, gdouble pt, gint index, gint ***bin, gint **nbin,
                           gdouble xreal, gdouble yreal, gdouble xoffset, gdouble yoffset)
 {
     gint bi, bj, i, j, k, bindex;
@@ -1552,16 +1552,16 @@ find_closest_point_bining(GwyXYZ *points, gdouble *time, gdouble tt, gdouble pt,
 
                      sdist = (points[index].x - points[bindex].x)*(points[index].x - points[bindex].x) +
                          (points[index].y - points[bindex].y)*(points[index].y - points[bindex].y);
-                      
+
     //                 printf("%d %d   %g %g    %g %g   %g\n", index, bindex, points[index].x, points[index].y, points[bindex].x, points[bindex].y, sdist);
- 
+
                      if (sdist<spt) {
                         if (sdist<mindist) {
                            mindist = sdist;
                             closest = bindex;
                         }
                      }
-                  }  
+                  }
             }
         }
     }
@@ -1570,7 +1570,7 @@ find_closest_point_bining(GwyXYZ *points, gdouble *time, gdouble tt, gdouble pt,
 }
 
 
-static gint 
+static gint
 find_neighbors(gint *nbfrom, gint *nbto, GwyXYZ *points, gdouble *time, gint npoints, gdouble timethreshold, gdouble posthreshold,
                gdouble xreal, gdouble yreal, gdouble xoffset, gdouble yoffset, gdouble neighbors, gdouble fraction)
 {
@@ -1629,7 +1629,7 @@ fit_func_to_curve(gdouble *xdata, gdouble *ydata, gint ndata, const gchar *name,
     guint i, n;
 
 
-   /* 
+   /*
     FILE *fw = fopen("fitdata.txt", "w");
     for (i=0; i<ndata; i++) {
         fprintf(fw, "%g %g\n", xdata[i], ydata[i]);
@@ -1744,7 +1744,7 @@ check_nbs_errors(GtkWidget *window, gint nnbs)
                                   GTK_BUTTONS_CLOSE,
                                   _("No neighbors found"));
         gtk_dialog_run (GTK_DIALOG (dialog));
-        gtk_widget_destroy (dialog); 
+        gtk_widget_destroy (dialog);
         return FALSE;
     }
 
@@ -1753,7 +1753,6 @@ check_nbs_errors(GtkWidget *window, gint nnbs)
     }
 
     return TRUE;
-
 }
 
 static gboolean
@@ -1768,13 +1767,13 @@ get_zdrift(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gint n
     gboolean fixed[3];
     gboolean ok=0;
 
-    gdouble timethreshold = controls->args->threshold_time; 
-    gdouble posthreshold = controls->args->threshold_length; 
+    gdouble timethreshold = controls->args->threshold_time;
+    gdouble posthreshold = controls->args->threshold_length;
 
     //FILE *fw = fopen("driftdata.txt", "w");
 
     //set drift arrays
-    set_drift(controls, npoints, time, xdrift, ydrift, zdrift, 
+    set_drift(controls, npoints, time, xdrift, ydrift, zdrift,
                     bx, cx, by, cy, *bz, *cz);
 
     //correct xy data (corpoints) for drift, don't correct z as this will be fitted
@@ -1783,24 +1782,24 @@ get_zdrift(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gint n
 
     //find neigbors for error evaluation
     nnbs = find_neighbors(nbfrom, nbto, corpoints, time, npoints, timethreshold, posthreshold,
-                          controls->args->xmax - controls->args->xmin, controls->args->ymax - controls->args->ymin, controls->args->xmin, controls->args->ymin, 
+                          controls->args->xmax - controls->args->xmin, controls->args->ymax - controls->args->ymin, controls->args->xmin, controls->args->ymin,
                           controls->args->neighbors, controls->fraction);
 
     if (!check_nbs_errors(controls->dialog, nnbs)) return FALSE;
-    
+
     dtime = g_new(gdouble, nnbs);
     drift = g_new(gdouble, nnbs);
 
     for (i=0; i<nnbs; i++) {
         dtime[i] = (time[nbfrom[i]]+time[nbto[i]])/2;
         drift[i] = (corpoints[nbto[i]].z - corpoints[nbfrom[i]].z)/(time[nbto[i]] - time[nbfrom[i]]);
-    }    
+    }
 
     if (controls->args->zdrift_type==GWY_XYZDRIFT_ZMETHOD_POLYNOM) {
         params[0] = *bz;
         params[1] = 2*(*cz);
         fixed[0] = 0;
-        fixed[1] = 0; 
+        fixed[1] = 0;
 
         ok = fit_func_to_curve(dtime, drift, nnbs, _("Polynomial (order 1)"), params, errors, fixed);
 
@@ -1813,7 +1812,7 @@ get_zdrift(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gint n
         params[1] = (*bz)/(*cz);
         params[2] = *cz;
         fixed[0] = 1;
-        fixed[1] = 0; 
+        fixed[1] = 0;
         fixed[2] = 0;
 
         ok = fit_func_to_curve(dtime, drift, nnbs, _("Exponential"), params, errors, fixed);
@@ -1824,7 +1823,7 @@ get_zdrift(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gint n
     }
 
     /*
-    printf("Fitting completed with %d: %g %g\n", ok, *bz, *cz);  
+    printf("Fitting completed with %d: %g %g\n", ok, *bz, *cz);
 
 
     for (i=0; i<nnbs; i++) {
@@ -1841,19 +1840,20 @@ get_zdrift(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gint n
 
     return ok;
 }
+
 static gdouble
 get_xydrift_error(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gint npoints, gdouble *time, gdouble *xdrift, gdouble *ydrift, gdouble *zdrift,
                   gdouble bx, gdouble cx, gdouble by, gdouble cy, gdouble bz, gdouble cz, gint *nbfrom, gint *nbto)
 {
     gint nnbs;
-    gdouble timethreshold = controls->args->threshold_time; 
-    gdouble posthreshold = controls->args->threshold_length; 
+    gdouble timethreshold = controls->args->threshold_time;
+    gdouble posthreshold = controls->args->threshold_length;
 
     if (!gwy_app_wait_set_fraction(controls->fraction)) return -1;
 
 
     //set drift arrays
-    set_drift(controls, npoints, time, xdrift, ydrift, zdrift, 
+    set_drift(controls, npoints, time, xdrift, ydrift, zdrift,
                      bx, cx, by, cy, bz, cz);
 
     //correct xyz data (corpoints) for drift
@@ -1862,7 +1862,7 @@ get_xydrift_error(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints,
 
     //find neigbors for error evaluation
     nnbs = find_neighbors(nbfrom, nbto, corpoints, time, npoints, timethreshold, posthreshold,
-                          controls->args->xmax - controls->args->xmin, controls->args->ymax - controls->args->ymin, controls->args->xmin, controls->args->ymin, 
+                          controls->args->xmax - controls->args->xmin, controls->args->ymax - controls->args->ymin, controls->args->xmin, controls->args->ymin,
                           controls->args->neighbors, controls->fraction);
 
     //printf("%d neighbors for parameter; %g %g\n", nnbs, timethreshold, posthreshold);
@@ -1906,13 +1906,13 @@ estimate_drift(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gi
     cdiff = controls->cdiff;
 
 //    bdiff = 1e-12; //gesi, poly
-//    cdiff = 1e-15;   
+//    cdiff = 1e-15;
 //    bdiff = 1e-8;  //gesi, exp
 //    cdiff = 500;
- 
+
 
 //    bdiff = 1e-8; //gen, poly
-//    cdiff = 1e-12;    
+//    cdiff = 1e-12;
 //    bdiff = 1e-5; //gen, exp
 //    cdiff = 100;
 
@@ -1938,7 +1938,7 @@ estimate_drift(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gi
            }
 
 
-           if (controls->args->fit_xdrift) 
+           if (controls->args->fit_xdrift)
            {
                //iterate through bx
                pbx = bx;
@@ -1948,8 +1948,8 @@ estimate_drift(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gi
                vpbx = get_xydrift_error(controls, points, corpoints, npoints, time, xdrift, ydrift, zdrift,
                       bx, cx, by, cy, bz, cz, nbfrom, nbto);
 
-               if (vpbx==-1) break; 
- 
+               if (vpbx==-1) break;
+
                diff = bdiff;
                mindiff = diff/100;
                bx = pbx+diff;
@@ -1979,12 +1979,12 @@ estimate_drift(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gi
 
                   intit++;
                } while (!done && intit<100);
-  
+
                sofar += 1;
                controls->fraction = sofar/total;
                if (!gwy_app_wait_set_fraction(controls->fraction)) break;
            }
-           if (controls->args->fit_xdrift) 
+           if (controls->args->fit_xdrift)
            {
                //iterate through cx
                pcx = cx;
@@ -1993,7 +1993,7 @@ estimate_drift(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gi
                vpcx = get_xydrift_error(controls, points, corpoints, npoints, time, xdrift, ydrift, zdrift,
                       bx, cx, by, cy, bz, cz, nbfrom, nbto);
 
-               if (vpcx==-1) break; 
+               if (vpcx==-1) break;
 
                diff = cdiff;
                mindiff = diff/100;
@@ -2025,12 +2025,12 @@ estimate_drift(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gi
                   intit++;
                } while (!done && intit<100);
                sofar += 1;
-              
+
                controls->fraction = sofar/total;
                if (!gwy_app_wait_set_fraction(controls->fraction)) break;
            }
 
-           if (controls->args->fit_ydrift) 
+           if (controls->args->fit_ydrift)
            {
                //iterate through by
                pby = by;
@@ -2040,7 +2040,7 @@ estimate_drift(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gi
                       bx, cx, by, cy, bz, cz, nbfrom, nbto);
 
                if (vpby==-1) break;
- 
+
                diff = bdiff;
                mindiff = bdiff/100;
                by = pby+diff;
@@ -2071,11 +2071,11 @@ estimate_drift(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gi
                   intit++;
                } while (!done && intit<100);
                sofar += 1;
-              
+
                controls->fraction = sofar/total;
                if (!gwy_app_wait_set_fraction(controls->fraction)) break;
            }
-           if (controls->args->fit_ydrift) 
+           if (controls->args->fit_ydrift)
            {
                //iterate through cy
                pcy = cy;
@@ -2083,7 +2083,7 @@ estimate_drift(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gi
 
                vpcy = get_xydrift_error(controls, points, corpoints, npoints, time, xdrift, ydrift, zdrift,
                       bx, cx, by, cy, bz, cz, nbfrom, nbto);
- 
+
                if (vpcy==-1) break;
 
                diff = cdiff;
@@ -2116,7 +2116,7 @@ estimate_drift(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gi
                   intit++;
                } while (!done && intit<100);
                sofar += 1;
-              
+
 
                controls->fraction = sofar/total;
                if (!gwy_app_wait_set_fraction(controls->fraction)) break;
@@ -2135,8 +2135,8 @@ estimate_drift(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gi
     rdata->zdrift_b_result = bz;
     rdata->zdrift_c_result = cz;
 
-    
-    /*printf("Resulting drifts: x %g %g    y %g %g    z %g %g\n", 
+
+    /*printf("Resulting drifts: x %g %g    y %g %g    z %g %g\n",
                               rdata->xdrift_b_result, rdata->xdrift_c_result,
                               rdata->ydrift_b_result, rdata->ydrift_c_result,
                               rdata->zdrift_b_result, rdata->zdrift_c_result
@@ -2146,8 +2146,6 @@ estimate_drift(XYZDriftControls *controls, GwyXYZ *points, GwyXYZ *corpoints, gi
 
     free(nbfrom);
     free(nbto);
-
-
 }
 
 
@@ -2159,7 +2157,7 @@ guess(XYZDriftControls *controls)
     XYZDriftData *rdata = controls->rdata;
 
     timespan = rdata->timepoints[rdata->npoints-1].z - rdata->timepoints[0].z;
-    xspan = args->xmax - args->xmin; 
+    xspan = args->xmax - args->xmin;
 
     controls->in_update = 1;
 
@@ -2175,7 +2173,7 @@ guess(XYZDriftControls *controls)
     controls->in_update = 0;
 
 }
- 
+
 
 static void
 preview(XYZDriftControls *controls)
@@ -2204,25 +2202,25 @@ preview(XYZDriftControls *controls)
     init_drift(controls, rdata->timepoints, rdata->npoints, rdata->time);
 
     /*estimate the drift using some fitting routine, returning filled xdrift, ydrift and zdrift arrays*/
-    if (args->fit_xdrift || args->fit_ydrift || args->fit_zdrift) 
+    if (args->fit_xdrift || args->fit_ydrift || args->fit_zdrift)
         estimate_drift(controls, rdata->points, rdata->corpoints, rdata->npoints, rdata->time,
                        rdata->xdrift, rdata->ydrift, rdata->zdrift);
 
     /*correct data for drift, creating corpoints from points*/
-    set_drift(controls, rdata->npoints, rdata->time, rdata->xdrift, rdata->ydrift, rdata->zdrift, 
-                    rdata->xdrift_b_result, rdata->xdrift_c_result, 
-                    rdata->ydrift_b_result, rdata->ydrift_c_result, 
+    set_drift(controls, rdata->npoints, rdata->time, rdata->xdrift, rdata->ydrift, rdata->zdrift,
+                    rdata->xdrift_b_result, rdata->xdrift_c_result,
+                    rdata->ydrift_b_result, rdata->ydrift_c_result,
                     rdata->zdrift_b_result, rdata->zdrift_c_result);
 
     correct_drift(rdata->points, rdata->npoints, rdata->xdrift, rdata->ydrift, rdata->zdrift,
                   rdata->corpoints, TRUE);
 
     g_snprintf(buffer, sizeof(buffer), "b = %g,  c = %g", rdata->xdrift_b_result, rdata->xdrift_c_result);
-    gtk_label_set_text(GTK_LABEL(controls->result_x), buffer); 
+    gtk_label_set_text(GTK_LABEL(controls->result_x), buffer);
     g_snprintf(buffer, sizeof(buffer), "b = %g,  c = %g", rdata->ydrift_b_result, rdata->ydrift_c_result);
-    gtk_label_set_text(GTK_LABEL(controls->result_y), buffer); 
+    gtk_label_set_text(GTK_LABEL(controls->result_y), buffer);
     g_snprintf(buffer, sizeof(buffer), "b = %g,  c = %g", rdata->zdrift_b_result, rdata->zdrift_c_result);
-    gtk_label_set_text(GTK_LABEL(controls->result_z), buffer); 
+    gtk_label_set_text(GTK_LABEL(controls->result_z), buffer);
 
 
     /*render preview*/
@@ -2249,9 +2247,6 @@ preview(XYZDriftControls *controls)
 
     gwy_container_set_object_by_name(controls->mydata, "/0/data", dfield);
     g_object_unref(dfield);
-
- 
-
 }
 
 
@@ -2343,26 +2338,25 @@ initialize_ranges(const XYZDriftData *rdata,
 }
 
 
-
-static const gchar xres_key[]          = "/module/xyz_drift/xres";
-static const gchar yres_key[]          = "/module/xyz_drift/yres";
-static const gchar xdrift_b_key[]          = "/module/xyz_drift/xdrift_b";
-static const gchar xdrift_c_key[]          = "/module/xyz_drift/xdrift_c";
-static const gchar ydrift_b_key[]          = "/module/xyz_drift/ydrift_b";
-static const gchar ydrift_c_key[]          = "/module/xyz_drift/ydrift_c";
-static const gchar zdrift_b_key[]          = "/module/xyz_drift/zdrift_b";
-static const gchar zdrift_c_key[]          = "/module/xyz_drift/zdrift_c";
-static const gchar fit_xdrift_key[]          = "/module/xyz_drift/fit_xdrift";
-static const gchar fit_ydrift_key[]          = "/module/xyz_drift/fit_ydrift";
-static const gchar fit_zdrift_key[]          = "/module/xyz_drift/fit_zdrift";
-static const gchar graph_type_key[]          = "/module/xyz_drift/graph_type";
-static const gchar threshold_time_key[]          = "/module/xyz_drift/threshold_time";
-static const gchar threshold_length_key[]          = "/module/xyz_drift/threshold_length";
-static const gchar neighbors_key[]          = "/module/xyz_drift/neighbors";
-static const gchar iterations_key[]          = "/module/xyz_drift/iterations";
-static const gchar xdrift_type_key[]          = "/module/xyz_drift/xdrift_type_key";
-static const gchar ydrift_type_key[]          = "/module/xyz_drift/ydrift_type_key";
-static const gchar zdrift_type_key[]          = "/module/xyz_drift/zdrift_type_key";
+static const gchar xres_key[]             = "/module/xyz_drift/xres";
+static const gchar yres_key[]             = "/module/xyz_drift/yres";
+static const gchar xdrift_b_key[]         = "/module/xyz_drift/xdrift_b";
+static const gchar xdrift_c_key[]         = "/module/xyz_drift/xdrift_c";
+static const gchar ydrift_b_key[]         = "/module/xyz_drift/ydrift_b";
+static const gchar ydrift_c_key[]         = "/module/xyz_drift/ydrift_c";
+static const gchar zdrift_b_key[]         = "/module/xyz_drift/zdrift_b";
+static const gchar zdrift_c_key[]         = "/module/xyz_drift/zdrift_c";
+static const gchar fit_xdrift_key[]       = "/module/xyz_drift/fit_xdrift";
+static const gchar fit_ydrift_key[]       = "/module/xyz_drift/fit_ydrift";
+static const gchar fit_zdrift_key[]       = "/module/xyz_drift/fit_zdrift";
+static const gchar graph_type_key[]       = "/module/xyz_drift/graph_type";
+static const gchar threshold_time_key[]   = "/module/xyz_drift/threshold_time";
+static const gchar threshold_length_key[] = "/module/xyz_drift/threshold_length";
+static const gchar neighbors_key[]        = "/module/xyz_drift/neighbors";
+static const gchar iterations_key[]       = "/module/xyz_drift/iterations";
+static const gchar xdrift_type_key[]      = "/module/xyz_drift/xdrift_type_key";
+static const gchar ydrift_type_key[]      = "/module/xyz_drift/ydrift_type_key";
+static const gchar zdrift_type_key[]      = "/module/xyz_drift/zdrift_type_key";
 
 static void
 xyzdrift_sanitize_args(XYZDriftArgs *args)
@@ -2376,7 +2370,7 @@ xyzdrift_sanitize_args(XYZDriftArgs *args)
     args->ydrift_type = MIN(args->ydrift_type, GWY_XYZDRIFT_METHOD_EXPONENTIAL);
     args->zdrift_type = MIN(args->zdrift_type, GWY_XYZDRIFT_ZMETHOD_AVERAGE);
     args->graph_type = MIN(args->graph_type, GWY_XYZDRIFT_GRAPH_Z);
- 
+
     args->xres = CLAMP(args->xres, 2, 16384);
     args->yres = CLAMP(args->yres, 2, 16384);
 
@@ -2440,8 +2434,6 @@ xyzdrift_save_args(GwyContainer *container,
 
 }
 
-
-
            /* //automatic estimation of start difference, skip for now
 
            vbx = get_xydrift_error(controls, points, corpoints, npoints, time, xdrift, ydrift, zdrift,
@@ -2461,8 +2453,6 @@ xyzdrift_save_args(GwyContainer *container,
            printf("diff found: %g\n", mindiff);
 
            */
- 
-
 
 
 /* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
diff --git a/modules/xyz/xyz_level.c b/modules/xyz/xyz_level.c
index d74e49b..30d6432 100644
--- a/modules/xyz/xyz_level.c
+++ b/modules/xyz/xyz_level.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: xyz_level.c 19013 2016-09-29 07:56:27Z yeti-dn $
+ *  $Id: xyz_level.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2016 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -97,7 +97,7 @@ static GwyModuleInfo module_info = {
     "2016",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, xyz_level)
 
 static gboolean
 module_register(void)
diff --git a/modules/xyz/xyz_raster.c b/modules/xyz/xyz_raster.c
index 5a5ea54..5a87be1 100644
--- a/modules/xyz/xyz_raster.c
+++ b/modules/xyz/xyz_raster.c
@@ -1,5 +1,5 @@
 /*
- *  $Id: xyz_raster.c 18606 2016-04-14 12:41:22Z yeti-dn $
+ *  $Id: xyz_raster.c 19948 2017-06-22 14:05:41Z yeti-dn $
  *  Copyright (C) 2016 David Necas (Yeti).
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -114,75 +114,72 @@ typedef struct {
     guint size;
 } WorkQueue;
 
-static gboolean      module_register        (void);
-static void          xyzras                 (GwyContainer *data,
-                                             GwyRunType run);
-static gboolean      xyzras_dialog          (XYZRasArgs *arg,
-                                             XYZRasData *rdata,
-                                             GwyContainer *data,
-                                             gint id);
-static void          add_dfield_to_data     (GwyDataField *dfield,
-                                             GwyContainer *data,
-                                             gint id);
-static gint          construct_resolutions  (XYZRasControls *controls,
-                                             GtkTable *table,
-                                             gint row);
-static gint          construct_physical_dims(XYZRasControls *controls,
-                                             GtkTable *table,
-                                             gint row);
-static gint          construct_options      (XYZRasControls *controls,
-                                             GtkTable *table,
-                                             gint row);
-static void          make_pixels_square     (XYZRasControls *controls);
-static void          xres_changed           (XYZRasControls *controls,
-                                             GtkAdjustment *adj);
-static void          yres_changed           (XYZRasControls *controls,
-                                             GtkAdjustment *adj);
-static void          xmin_changed           (XYZRasControls *controls,
-                                             GtkEntry *entry);
-static void          xmax_changed           (XYZRasControls *controls,
-                                             GtkEntry *entry);
-static void          ymin_changed           (XYZRasControls *controls,
-                                             GtkEntry *entry);
-static void          ymax_changed           (XYZRasControls *controls,
-                                             GtkEntry *entry);
-static void          interpolation_changed  (XYZRasControls *controls,
-                                             GtkComboBox *combo);
-static void          exterior_changed       (XYZRasControls *controls,
-                                             GtkComboBox *combo);
-static void          reset_ranges           (XYZRasControls *controls);
-static void          update_selection       (XYZRasControls *controls);
-static void          selection_changed      (XYZRasControls *controls,
-                                             gint hint,
-                                             GwySelection *selection);
-static void          clear_selection        (XYZRasControls *controls);
-static void          preview                (XYZRasControls *controls);
-static void          triangulation_info     (XYZRasControls *controls);
-static void          render_regular_directly(XYZRasControls *controls);
-static GwyDataField* xyzras_do              (XYZRasData *rdata,
-                                             const XYZRasArgs *args,
-                                             GtkWindow *dialog,
-                                             gchar **error);
-static gboolean      interpolate_field      (guint npoints,
-                                             const GwyXYZ *points,
-                                             GwyDataField *dfield,
-                                             GwySetFractionFunc set_fraction,
-                                             GwySetMessageFunc set_message);
-static gboolean      extend_borders         (XYZRasData *rdata,
-                                             const XYZRasArgs *args,
-                                             gboolean check_for_changes,
-                                             gdouble epsrel);
-static void          xyzras_free            (XYZRasData *rdata);
-static void          initialize_ranges      (const XYZRasData *rdata,
-                                             XYZRasArgs *args);
-static void          invalidate_raster      (XYZRasData *rdata);
-static void          analyse_points         (XYZRasData *rdata,
-                                             double epsrel);
-static GwyDataField* check_regular_grid     (GwySurface *surface);
-static void          xyzras_load_args       (GwyContainer *container,
-                                             XYZRasArgs *args);
-static void          xyzras_save_args       (GwyContainer *container,
-                                             XYZRasArgs *args);
+static gboolean      module_register          (void);
+static void          xyzras                   (GwyContainer *data,
+                                               GwyRunType run);
+static gboolean      xyzras_dialog            (XYZRasArgs *arg,
+                                               XYZRasData *rdata,
+                                               GwyContainer *data,
+                                               gint id);
+static void          add_dfield_to_data       (GwyDataField *dfield,
+                                               GwyContainer *data,
+                                               gint id);
+static gint          construct_physical_dims  (XYZRasControls *controls,
+                                               GtkTable *table,
+                                               gint row);
+static gint          construct_options        (XYZRasControls *controls,
+                                               GtkTable *table,
+                                               gint row);
+static void          make_pixels_square       (XYZRasControls *controls);
+static void          xres_changed             (XYZRasControls *controls,
+                                               GtkAdjustment *adj);
+static void          yres_changed             (XYZRasControls *controls,
+                                               GtkAdjustment *adj);
+static void          xmin_changed             (XYZRasControls *controls,
+                                               GtkEntry *entry);
+static void          xmax_changed             (XYZRasControls *controls,
+                                               GtkEntry *entry);
+static void          ymin_changed             (XYZRasControls *controls,
+                                               GtkEntry *entry);
+static void          ymax_changed             (XYZRasControls *controls,
+                                               GtkEntry *entry);
+static void          interpolation_changed    (XYZRasControls *controls,
+                                               GtkComboBox *combo);
+static void          exterior_changed         (XYZRasControls *controls,
+                                               GtkComboBox *combo);
+static void          reset_ranges             (XYZRasControls *controls);
+static void          update_selection         (XYZRasControls *controls);
+static void          selection_changed        (XYZRasControls *controls,
+                                               gint hint,
+                                               GwySelection *selection);
+static void          clear_selection          (XYZRasControls *controls);
+static void          preview                  (XYZRasControls *controls);
+static void          triangulation_info       (XYZRasControls *controls);
+static void          render_regular_directly  (XYZRasControls *controls);
+static GwyDataField* xyzras_do                (XYZRasData *rdata,
+                                               const XYZRasArgs *args,
+                                               GtkWindow *dialog,
+                                               gchar **error);
+static gboolean      interpolate_field        (guint npoints,
+                                               const GwyXYZ *points,
+                                               GwyDataField *dfield,
+                                               GwySetFractionFunc set_fraction,
+                                               GwySetMessageFunc set_message);
+static gboolean      extend_borders           (XYZRasData *rdata,
+                                               const XYZRasArgs *args,
+                                               gboolean check_for_changes,
+                                               gdouble epsrel);
+static void          xyzras_free              (XYZRasData *rdata);
+static void          initialize_ranges        (const XYZRasData *rdata,
+                                               XYZRasArgs *args);
+static void          invalidate_raster        (XYZRasData *rdata);
+static void          analyse_points           (XYZRasData *rdata,
+                                               double epsrel);
+static GwyDataField* check_regular_grid       (GwySurface *surface);
+static void          xyzras_load_args         (GwyContainer *container,
+                                               XYZRasArgs *args);
+static void          xyzras_save_args         (GwyContainer *container,
+                                               XYZRasArgs *args);
 
 static const XYZRasArgs xyzras_defaults = {
     GWY_INTERPOLATION_LINEAR, GWY_EXTERIOR_MIRROR_EXTEND,
@@ -196,12 +193,12 @@ static GwyModuleInfo module_info = {
     &module_register,
     N_("Rasterizes XYZ data to images."),
     "Yeti <yeti at gwyddion.net>",
-    "1.0",
+    "1.1",
     "David Nečas (Yeti)",
     "2016",
 };
 
-GWY_MODULE_QUERY(module_info)
+GWY_MODULE_QUERY2(module_info, xyz_raster)
 
 static gboolean
 module_register(void)
@@ -318,7 +315,7 @@ xyzras_dialog(XYZRasArgs *args,
               GwyContainer *data,
               gint id)
 {
-    GtkWidget *dialog, *vbox, *align, *label, *hbox, *button;
+    GtkWidget *dialog, *vbox, *label, *hbox, *button;
     GwyPixmapLayer *player;
     GwyVectorLayer *vlayer;
     GwyDataField *dfield;
@@ -367,35 +364,52 @@ xyzras_dialog(XYZRasArgs *args,
     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 0);
 
     /* Left column */
-    align = gtk_alignment_new(0.0, 0.0, 0.0, 0.0);
-    gtk_box_pack_start(GTK_BOX(hbox), align, FALSE, FALSE, 0);
+    vbox = gtk_vbox_new(FALSE, 8);
+    gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
 
-    table = GTK_TABLE(gtk_table_new(10, 5, FALSE));
+    table = GTK_TABLE(gtk_table_new(4, 5, FALSE));
     gtk_table_set_row_spacings(table, 2);
     gtk_table_set_col_spacings(table, 6);
-    gtk_container_add(GTK_CONTAINER(align), GTK_WIDGET(table));
+    gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(table), FALSE, FALSE, 0);
     row = 0;
 
-    row = construct_resolutions(&controls, table, row);
+    gtk_table_attach(table, gwy_label_new_header(_("Resolution")),
+                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+    row++;
+
+    controls.xres = gtk_adjustment_new(args->xres, 2, 16384, 1, 100, 0);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row,
+                            _("_Horizontal size:"), _("px"),
+                            controls.xres, GWY_HSCALE_LOG | GWY_HSCALE_SNAP);
+    row++;
+
+    controls.yres = gtk_adjustment_new(args->yres, 2, 16384, 1, 100, 0);
+    gwy_table_attach_adjbar(GTK_WIDGET(table), row,
+                            _("_Vertical size:"), _("px"),
+                            controls.yres, GWY_HSCALE_LOG | GWY_HSCALE_SNAP);
+    row++;
 
     button = gtk_button_new_with_mnemonic(_("Make Pixels S_quare"));
-    gtk_table_attach(table, button, 1, 4, row, row+1,
-                     GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, button, 0, 2, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(button, "clicked",
                              G_CALLBACK(make_pixels_square), &controls);
-    gtk_table_set_row_spacing(table, row, 8);
     row++;
 
+    table = GTK_TABLE(gtk_table_new(7, 5, FALSE));
+    gtk_table_set_row_spacings(table, 2);
+    gtk_table_set_col_spacings(table, 6);
+    gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(table), FALSE, FALSE, 0);
+    row = 0;
+
     row = construct_physical_dims(&controls, table, row);
 
     button = gtk_button_new_with_mnemonic(_("Reset Ran_ges"));
-    gtk_table_attach(table, button, 1, 4, row, row+1,
-                     GTK_FILL, 0, 0, 0);
+    gtk_table_attach(table, button, 0, 4, row, row+1, GTK_FILL, 0, 0, 0);
     g_signal_connect_swapped(button, "clicked",
                              G_CALLBACK(reset_ranges), &controls);
-    gtk_table_set_row_spacing(table, row, 8);
     row++;
 
+    gtk_table_set_row_spacing(table, row-1, 8);
     row = construct_options(&controls, table, row);
 
     /* Right column */
@@ -507,51 +521,6 @@ xyzras_dialog(XYZRasArgs *args,
 }
 
 static gint
-construct_resolutions(XYZRasControls *controls,
-                      GtkTable *table,
-                      gint row)
-{
-    XYZRasArgs *args = controls->args;
-    GtkWidget *spin, *label;
-
-    gtk_table_attach(table, gwy_label_new_header(_("Resolution")),
-                     0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    row++;
-
-    label = gtk_label_new_with_mnemonic(_("_Horizontal size:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 0, 1, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    controls->xres = gtk_adjustment_new(args->xres, 2, 16384, 1, 100, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls->xres), 0, 0);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), spin);
-    gtk_table_attach(table, spin, 1, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    label = gtk_label_new("px");
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 2, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    row++;
-
-    label = gtk_label_new_with_mnemonic(_("_Vertical size:"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 0, 1, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    controls->yres = gtk_adjustment_new(args->yres, 2, 16384, 1, 100, 0);
-    spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls->yres), 0, 0);
-    gtk_label_set_mnemonic_widget(GTK_LABEL(label), spin);
-    gtk_table_attach(table, spin, 1, 2, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    label = gtk_label_new("px");
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_table_attach(table, label, 2, 3, row, row+1,
-                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
-    row++;
-
-    return row;
-}
-
-static gint
 construct_physical_dims(XYZRasControls *controls,
                         GtkTable *table,
                         gint row)
@@ -1050,13 +1019,18 @@ xyzras_do(XYZRasData *rdata,
             gwy_debug("must triangulate");
             if (!triangulation)
                 rdata->triangulation = triangulation = gwy_triangulation_new();
+            /* This can fail for two different reasons:
+             * 1) numerical failure
+             * 2) cancellation
+             * In the second case we do not want another attempt at the
+             * triangulation and should stop immediately. */
             ok = gwy_triangulation_triangulate_iterative(triangulation,
                                                          points->len,
                                                          points->data,
                                                          sizeof(GwyXYZ),
                                                          set_fraction,
                                                          set_message);
-            if (!ok) {
+            if (!ok && !gwy_app_wait_was_canceled()) {
                 /* Try again with a small jitter.  The jitter is small
                  * compared to pixel size, not typical point distance, so
                  * it should be insubstantial in the raster image. */
@@ -1638,91 +1612,26 @@ analyse_points(XYZRasData *rdata,
 static GwyDataField*
 check_regular_grid(GwySurface *surface)
 {
-    gdouble ymaxstep, xmin, xmax, ymin, ymax, dx, dy;
+    GwyXY xymin, dxy;
     guint n, xres, yres, k;
     GwyDataField *dfield;
-    gdouble *yvalues, *data;
-    gboolean *encountered;
-    gboolean ok = TRUE;
+    gdouble *data;
+    guint *map;
 
     n = surface->n;
-    if (n < 4)
-        return NULL;
-
-    /* Do not create Nx1 or 1xN fields. */
-    gwy_surface_get_xrange(surface, &xmin, &xmax);
-    gwy_surface_get_yrange(surface, &ymin, &ymax);
-    if (xmin == xmax || ymin == ymax)
-        return NULL;
-
-    yvalues = g_new(gdouble, n);
-    for (k = 0; k < n; k++)
-        yvalues[k] = surface->data[k].y;
-    gwy_math_sort(n, yvalues);
-
-    ymaxstep = 0.0;
-    for (k = 1; k < n; k++) {
-        if (yvalues[k] - yvalues[k-1] > ymaxstep)
-            ymaxstep = yvalues[k] - yvalues[k-1];
-    }
-    gwy_debug("ymaxstep %g", ymaxstep);
-    yres = (gint)ceil((ymax - ymin)/ymaxstep) + 1;
-    gwy_debug("estimated yres %d", yres);
-    g_free(yvalues);
-
-    if (n % yres != 0)
+    if (!(map = gwy_check_regular_2d_grid((const gdouble*)surface->data, 3, n,
+                                          -1.0, &xres, &yres, &xymin, &dxy)))
         return NULL;
 
-    xres = n/yres;
-    gwy_debug("yres %d", xres);
-    dx = (xmax - xmin)/(xres - 1);
-    dy = (ymax - ymin)/(yres - 1);
-    xmin -= 0.5*dx;
-    xmax += 0.5*dx;
-    ymin -= 0.5*dy;
-    ymax += 0.5*dy;
-
-    dfield = gwy_data_field_new(xres, yres, xmax - xmin, ymax - ymin, FALSE);
+    dfield = gwy_data_field_new(xres, yres, xres*dxy.x, yres*dxy.y, FALSE);
     data = gwy_data_field_get_data(dfield);
-    encountered = g_new0(gboolean, n);
-    for (k = 0; k < n; k++) {
-        gdouble y = (surface->data[k].y - ymin)/dy;
-        gdouble x = (surface->data[k].x - xmin)/dx;
-        gint i = (gint)floor(y);
-        gint j = (gint)floor(x);
-
-        if (fabs(x - j - 0.5) > 0.01) {
-            gwy_debug("point (%d,%d) too far in x %g", j, i, x - j - 0.5);
-            ok = FALSE;
-            break;
-        }
-        if (fabs(y - i - 0.5) > 0.01) {
-            gwy_debug("point (%d,%d) too far in y %g", j, i, y - i - 0.5);
-            ok = FALSE;
-            break;
-        }
-        if (encountered[i*xres + j]) {
-            gwy_debug("point (%d,%d) encountered twice", j, i);
-            ok = FALSE;
-            break;
-        }
-
-        encountered[i*xres + j] = TRUE;
-        data[i*xres + j] = surface->data[k].z;
-    }
-
-    g_free(encountered);
-    if (!ok) {
-        g_object_unref(dfield);
-        return NULL;
-    }
+    for (k = 0; k < n; k++)
+        data[k] = surface->data[map[k]].z;
+    g_free(map);
 
-    gwy_data_field_set_xoffset(dfield, xmin);
-    gwy_data_field_set_yoffset(dfield, ymin);
-    gwy_serializable_clone(G_OBJECT(gwy_surface_get_si_unit_xy(surface)),
-                           G_OBJECT(gwy_data_field_get_si_unit_xy(dfield)));
-    gwy_serializable_clone(G_OBJECT(gwy_surface_get_si_unit_z(surface)),
-                           G_OBJECT(gwy_data_field_get_si_unit_z(dfield)));
+    gwy_data_field_set_xoffset(dfield, xymin.x);
+    gwy_data_field_set_yoffset(dfield, xymin.y);
+    gwy_surface_copy_units_to_data_field(surface, dfield);
     return dfield;
 }
 
diff --git a/perl/Makefile.in b/perl/Makefile.in
index 87a8c16..a1505a3 100644
--- a/perl/Makefile.in
+++ b/perl/Makefile.in
@@ -199,10 +199,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -212,6 +209,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -236,7 +235,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -294,6 +295,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -302,17 +304,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/pixmaps/Makefile.am b/pixmaps/Makefile.am
index f5ecc88..7aecfbd 100644
--- a/pixmaps/Makefile.am
+++ b/pixmaps/Makefile.am
@@ -1,32 +1,10 @@
-# @(#) $Id: Makefile.am 18961 2016-09-17 07:38:23Z yeti-dn $
+# @(#) $Id: Makefile.am 20261 2017-08-12 09:00:35Z yeti-dn $
+
+SUBDIRS = src
 
 pixmapdatadir = $(pkgdatadir)/pixmaps
 icondatadir = $(datadir)/icons/hicolor/48x48/apps
 
-# Present in svn but not included in the tarball now:
-# gwy_hough-24.png
-# gwy_local_slope-24.png
-# gwy_presentation_attach-24.png
-# gwy_presentation_edge_canny-24.png
-# gwy_presentation_edge_harris_corner-24.png
-# gwy_presentation_edge_hough-24.png
-# gwy_presentation_edge_inclination-24.png
-# gwy_presentation_edge_laplace_gauss-24.png
-# gwy_presentation_edge_local_non_linearity-24.png
-# gwy_presentation_edge_prewitt-24.png
-# gwy_presentation_edge_rms_edge-24.png
-# gwy_presentation_edge_rms-24.png
-# gwy_presentation_edge_sobel-24.png
-# gwy_presentation_edge_step-24.png
-# gwy_presentation_edge_zero_crossing-24.png
-# gwy_presentation_extract-24.png
-# gwy_presentation_local_contrast-24.png
-# gwy_presentation_log-24.png
-# gwy_presentation_rank-24.png
-# gwy_presentation_remove-24.png
-# gwy_presentation_sem-24.png
-# gwy_presentation_shading-24.png
-
 # Since 2.3: arithmetic data_measure drift immerse merge
 # Since 2.7: path_level spectrum iso_roughness grains_measure gl_material
 # Since 2.7: color_range_auto color_range_full color_range_fixed
@@ -38,36 +16,59 @@ icondatadir = $(datadir)/icons/hicolor/48x48/apps
 # Since 2.38: synthetic_diffusion
 # Since 2.45: convolution distribution_angle distribution_slope entropy graph_fd fft_filter_2d fft_2d find_peaks grain_correlation grain_exscribed_circle grain_inscribed_circle grains_edge graph_align graph_cut graph_dos graph_export_ascii graph_export_png graph_export_vector graph_filter level_flatten_base level_median load_debug load_info load_warning mask_distribute mask_extract mask_morph mask_thin measure_lattice neural_apply neural_train psdf_log_phi psdf_section synthetic_ballisti [...]
 # Since 2.46: distance_transform extract_path enforce_distribution grains_edge_remove mutual_crop poly_distort straighten_path tip_indent_analyze tip_lateral_force volume_fd volume_kmeans volume_kmedians volume_slice volumize
+# Since 2.48: correlation_mask disconnected fft_filter_1d fit_shape fractal_correction mark_outliers mark_scars null_offsets xy_denoise synthetic_phases
+# Since 2.49: next previous fractal_measure mask_set synthetic_fibres rotate_3d
 #
-# If you add new stock icons here, add them to a `Since' line above and run
-# ./utils/stockgen.py from the top-level directory to update source code
-# declarations.
+# If you add new stock icons here
+# - Add them to a `Since' line above (one Gwyddion version = one line).
+# - If they have source files add them to src/ and if they can be generated
+#   automatically (the usual case) add them to the built_pixmaps.
+# - Run ./utils/stockgen.py from the top-level directory to update the PNG
+#   build rules and source code declarations.
+# - After that the icon should be probably set as the default for some module
+#   or elswhere in the source code.
 pixmapdata_DATA = \
+	$(built_pixmaps) \
 	cd_line.png \
 	cd_rline.png \
 	cd_rstep.png \
 	cd_step.png \
 	circle_down.png \
 	circle_up.png \
+	gwy_drift-24.png \
+	gwy_favourite-24.png \
+	gwy_gl_material-16.png \
+	gwy_gwyddion-32.png \
+	gwy_gwyddion-60.png \
+	gwy_psdf_log_phi-24.png \
+	gwy_psdf_section-24.png \
+	gwyddion.ico \
+	splash.png
+
+icondata_DATA = \
+	gwyddion.png
+
+built_pixmaps = \
 	gwy_3d_base-24.png \
 	gwy_arithmetic-24.png \
 	gwy_bold-20.png \
 	gwy_cantilever-24.png \
+	gwy_color_range-24.png \
 	gwy_color_range_adaptive-24.png \
 	gwy_color_range_auto-24.png \
 	gwy_color_range_fixed-24.png \
 	gwy_color_range_full-24.png \
-	gwy_color_range-24.png \
 	gwy_convolution-24.png \
 	gwy_correct_affine-24.png \
+	gwy_correlation_mask-24.png \
 	gwy_crop-24.png \
 	gwy_cwt-24.png \
 	gwy_data_measure-24.png \
+	gwy_disconnected-24.png \
 	gwy_distance-24.png \
 	gwy_distance_transform-24.png \
 	gwy_distribution_angle-24.png \
 	gwy_distribution_slope-24.png \
-	gwy_drift-24.png \
 	gwy_dwt-24.png \
 	gwy_edge-24.png \
 	gwy_enforce_distribution-24.png \
@@ -76,28 +77,33 @@ pixmapdata_DATA = \
 	gwy_extract_path-24.png \
 	gwy_facet_level-24.png \
 	gwy_favourite-24.png \
-	gwy_fft_filter_2d-24.png \
 	gwy_fft-24.png \
 	gwy_fft_2d-24.png \
+	gwy_fft_filter_1d-24.png \
+	gwy_fft_filter_2d-24.png \
 	gwy_filter-24.png \
 	gwy_find_peaks-24.png \
+	gwy_fit_shape-24.png \
 	gwy_fix_zero-24.png \
 	gwy_flip_horizontally-24.png \
 	gwy_flip_vertically-24.png \
 	gwy_fractal-24.png \
+	gwy_fractal_measure-24.png \
+	gwy_fractal_correction-24.png \
 	gwy_gl_material-16.png \
 	gwy_gradient_horizontal-24.png \
 	gwy_gradient_vertical-24.png \
 	gwy_grain_correlation-24.png \
 	gwy_grain_exscribed_circle-24.png \
 	gwy_grain_inscribed_circle-24.png \
+	gwy_grains-24.png \
 	gwy_grains_edge-24.png \
 	gwy_grains_edge_remove-24.png \
 	gwy_grains_graph-24.png \
 	gwy_grains_measure-24.png \
 	gwy_grains_remove-24.png \
 	gwy_grains_water-24.png \
-	gwy_grains-24.png \
+	gwy_graph-24.png \
 	gwy_graph_align-24.png \
 	gwy_graph_cut-24.png \
 	gwy_graph_dos-24.png \
@@ -117,18 +123,15 @@ pixmapdata_DATA = \
 	gwy_graph_zoom_fit-24.png \
 	gwy_graph_zoom_in-24.png \
 	gwy_graph_zoom_out-24.png \
-	gwy_graph-24.png \
-	gwy_gwyddion-32.png \
-	gwy_gwyddion-60.png \
 	gwy_hough-24.png \
 	gwy_immerse-24.png \
 	gwy_iso_roughness-24.png \
 	gwy_italic-20.png \
 	gwy_less-24.png \
+	gwy_level-24.png \
 	gwy_level_flatten_base-24.png \
 	gwy_level_median-24.png \
 	gwy_level_triangle-24.png \
-	gwy_level-24.png \
 	gwy_light_rotate-24.png \
 	gwy_line_level-24.png \
 	gwy_load_debug-20.png \
@@ -137,15 +140,19 @@ pixmapdata_DATA = \
 	gwy_local_slope-24.png \
 	gwy_logscale_horizontal-24.png \
 	gwy_logscale_vertical-24.png \
+	gwy_mark_outliers-24.png \
+	gwy_mark_scars-24.png \
 	gwy_mark_with-24.png \
+	gwy_mask-16.png \
+	gwy_mask-24.png \
 	gwy_mask_add-24.png \
+	gwy_mask_circle-24.png \
 	gwy_mask_circle_exclusive-24.png \
 	gwy_mask_circle_inclusive-24.png \
-	gwy_mask_circle-24.png \
 	gwy_mask_distribute-24.png \
 	gwy_mask_editor-24.png \
-	gwy_mask_exclude_circle-24.png \
 	gwy_mask_exclude-24.png \
+	gwy_mask_exclude_circle-24.png \
 	gwy_mask_extract-24.png \
 	gwy_mask_fill_draw-24.png \
 	gwy_mask_fill_erase-24.png \
@@ -159,36 +166,37 @@ pixmapdata_DATA = \
 	gwy_mask_rect_exclusive-24.png \
 	gwy_mask_rect_inclusive-24.png \
 	gwy_mask_remove-24.png \
+	gwy_mask_set-24.png \
 	gwy_mask_shrink-24.png \
 	gwy_mask_subtract-24.png \
 	gwy_mask_thin-24.png \
-	gwy_mask-16.png \
-	gwy_mask-24.png \
 	gwy_measure_lattice-24.png \
 	gwy_merge-24.png \
 	gwy_more-24.png \
 	gwy_mutual_crop-24.png \
 	gwy_neural_apply-24.png \
 	gwy_neural_train-24.png \
+	gwy_next-24.png \
+	gwy_null_offsets-24.png \
 	gwy_palettes-16.png \
 	gwy_palettes-24.png \
 	gwy_path_level-24.png \
 	gwy_pointer_measure-24.png \
 	gwy_poly_distort-24.png \
-	gwy_polynom_level-24.png \
 	gwy_polynom-24.png \
+	gwy_polynom_level-24.png \
+	gwy_previous-24.png \
 	gwy_profile-24.png \
-	gwy_psdf_log_phi-24.png \
-	gwy_psdf_section-24.png \
 	gwy_pygwy-24.png \
 	gwy_remove_under_mask-24.png \
 	gwy_rotate_180-24.png \
+	gwy_rotate_3d-24.png \
+	gwy_rotate-24.png \
 	gwy_rotate_90_ccw-24.png \
 	gwy_rotate_90_cw-24.png \
-	gwy_rotate-24.png \
+	gwy_scale-24.png \
 	gwy_scale_horizontally-24.png \
 	gwy_scale_vertically-24.png \
-	gwy_scale-24.png \
 	gwy_scars-24.png \
 	gwy_selections-24.png \
 	gwy_shader-24.png \
@@ -203,12 +211,14 @@ pixmapdata_DATA = \
 	gwy_synthetic_columnar-24.png \
 	gwy_synthetic_diffusion-24.png \
 	gwy_synthetic_domains-24.png \
+	gwy_synthetic_fibres-24.png \
 	gwy_synthetic_lattice-24.png \
 	gwy_synthetic_line_noise-24.png \
 	gwy_synthetic_noise-24.png \
 	gwy_synthetic_objects-24.png \
 	gwy_synthetic_particles-24.png \
 	gwy_synthetic_pattern-24.png \
+	gwy_synthetic_phases-24.png \
 	gwy_synthetic_spectral-24.png \
 	gwy_synthetic_waves-24.png \
 	gwy_tilt-24.png \
@@ -232,89 +242,1044 @@ pixmapdata_DATA = \
 	gwy_volume_slice-24.png \
 	gwy_volumize-24.png \
 	gwy_volumize_layers-24.png \
+	gwy_xy_denoise-24.png \
 	gwy_zero_mean-24.png \
 	gwy_zoom_1_1-24.png \
 	gwy_zoom_fit-24.png \
 	gwy_zoom_in-24.png \
-	gwy_zoom_out-24.png \
-	gwyddion.ico \
-	splash.png
+	gwy_zoom_out-24.png
 
-icondata_DATA = \
-	gwyddion.png
+INKSCAPE_RENDER_PNG = $(INKSCAPE) --without-gui --export-area-page
+
+# Not built automatically:
+# gwy_drift-24.png - must render to 96x96 first, then downsize due to
+#                    Inkscape gradient mesh issues
+#
+# cd_line.png
+# cd_rline.png
+# cd_rstep.png
+# cd_step.png
+# circle_down.png
+# circle_up.png - no SVG
+#
+# gwy_psdf_log_phi-24.png
+# gwy_psdf_section-24.png
+#
+# gwy_gwyddion-32.png
+# gwy_gwyddion-60.png - no SVG
 
 # Note: splash screen source is too big to distribute in every tarball,
 # check it out from Subversion
-xcf_sources = \
-	cd_line.xcf \
-	cd_rline.xcf \
-	cd_rstep.xcf \
-	cd_step.xcf \
-	gwy_3d_base-24.xcf \
-	gwy_arithmetic-24.xcf \
-	gwy_cantilever-24.xcf \
-	gwy_color_range-24.xcf \
-	gwy_crop-24.xcf \
-	gwy_direction-24.xcf \
-	gwy_edge-24.xcf \
-	gwy_extract_path-24.xcf \
-	gwy_favourite-24.xcf \
-	gwy_fft-24.xcf \
-	gwy_filter-24.xcf \
-	gwy_flip_horizontally-24.xcf \
-	gwy_flip_vertically-24.xcf \
-	gwy_gl_material-16.xcf \
-	gwy_gradient-24.xcf \
-	gwy_grains-24.xcf \
-	gwy_graph-24.xcf \
-	gwy_graph_zoom-24.xcf \
-	gwy_iso_roughness-24.xcf \
-	gwy_less-24.xcf \
-	gwy_level-24.xcf \
-	gwy_light_rotate-24.xcf \
-	gwy_load_message-20.xcf \
-	gwy_markup-20.xcf \
-	gwy_mask-16.xcf \
-	gwy_mask-24.xcf \
-	gwy_measure-24.xcf \
-	gwy_more-24.xcf \
-	gwy_palette-24.xcf \
-	gwy_palettes-16.xcf \
-	gwy_polynom-24.xcf \
-	gwy_presentation-24.xcf \
-	gwy_presentation_ops-24.xcf \
-	gwy_profile-24.xcf \
-	gwy_pygwy-24.xcf \
-	gwy_remove_under_mask-24.xcf \
-	gwy_rotate-24.xcf \
-	gwy_rotate_180-24.xcf \
-	gwy_rotate_90_ccw-24.xcf \
-	gwy_rotate_90_cw-24.xcf \
-	gwy_scale-24.xcf \
-	gwy_scale_horizontally-24.xcf \
-	gwy_scale_vertically-24.xcf \
-	gwy_selection-24.xcf \
-	gwy_shader-24.xcf \
-	gwy_spectrum-24.xcf \
-	gwy_spot_remove-24.xcf \
-	gwy_stat_quantities-24.xcf \
-	gwy_stats-24.xcf \
-	gwy_synthetic-24.xcf \
-	gwy_tip-24.xcf \
-	gwy_transform-24.xcf \
-	gwy_unrotate-24.xcf \
-	gwy_value_invert-24.xcf \
-	gwy_zoom-24.xcf
-
-svg_sources = \
-	gwy_path.svg \
-	gwy_neural.svg \
-	gwy_poly_distort.svg \
-	gwy_volume.svg
 
 EXTRA_DIST = \
 	gwyddion.icns \
 	$(icondata_DATA) \
-	$(pixmapdata_DATA) \
-	$(xcf_sources) \
-	$(svg_sources)
+	$(pixmapdata_DATA)
+
+MAINTAINERCLEANFILES = $(built_pixmaps)
+
+list-icons:
+	@echo ICONLIST $(pixmapdata_DATA)
+
+list-built-icons:
+	@echo ICONLIST $(built_pixmaps)
+
+if MAINTAINER_MODE
+# @@@ GENERATED STOCK LIST BEGIN @@@
+gwy_3d_base-24.png: $(srcdir)/src/gwy_3d_base-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_3d_base-24.png" --file="$(srcdir)/src/gwy_3d_base-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_3d_base-24.png" "gwy_3d_base-24.crush.png"
+	if test -s "gwy_3d_base-24.crush.png"; then mv -f "gwy_3d_base-24.crush.png" "gwy_3d_base-24.png"; fi
+
+gwy_arithmetic-24.png: $(srcdir)/src/gwy_arithmetic-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_arithmetic-24.png" --file="$(srcdir)/src/gwy_arithmetic-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_arithmetic-24.png" "gwy_arithmetic-24.crush.png"
+	if test -s "gwy_arithmetic-24.crush.png"; then mv -f "gwy_arithmetic-24.crush.png" "gwy_arithmetic-24.png"; fi
+
+gwy_bold-20.png: $(srcdir)/src/gwy_bold-20.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=20 --export-height=20 --export-png="gwy_bold-20.png" --file="$(srcdir)/src/gwy_bold-20.svg"
+	$(PNGCRUSH) -q -brute "gwy_bold-20.png" "gwy_bold-20.crush.png"
+	if test -s "gwy_bold-20.crush.png"; then mv -f "gwy_bold-20.crush.png" "gwy_bold-20.png"; fi
+
+gwy_cantilever-24.png: $(srcdir)/src/gwy_cantilever-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_cantilever-24.png" --file="$(srcdir)/src/gwy_cantilever-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_cantilever-24.png" "gwy_cantilever-24.crush.png"
+	if test -s "gwy_cantilever-24.crush.png"; then mv -f "gwy_cantilever-24.crush.png" "gwy_cantilever-24.png"; fi
+
+gwy_color_range-24.png: $(srcdir)/src/gwy_color_range-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_color_range-24.png" --file="$(srcdir)/src/gwy_color_range-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_color_range-24.png" "gwy_color_range-24.crush.png"
+	if test -s "gwy_color_range-24.crush.png"; then mv -f "gwy_color_range-24.crush.png" "gwy_color_range-24.png"; fi
+
+gwy_color_range_adaptive-24.png: $(srcdir)/src/gwy_color_range_adaptive-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_color_range_adaptive-24.png" --file="$(srcdir)/src/gwy_color_range_adaptive-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_color_range_adaptive-24.png" "gwy_color_range_adaptive-24.crush.png"
+	if test -s "gwy_color_range_adaptive-24.crush.png"; then mv -f "gwy_color_range_adaptive-24.crush.png" "gwy_color_range_adaptive-24.png"; fi
+
+gwy_color_range_auto-24.png: $(srcdir)/src/gwy_color_range_auto-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_color_range_auto-24.png" --file="$(srcdir)/src/gwy_color_range_auto-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_color_range_auto-24.png" "gwy_color_range_auto-24.crush.png"
+	if test -s "gwy_color_range_auto-24.crush.png"; then mv -f "gwy_color_range_auto-24.crush.png" "gwy_color_range_auto-24.png"; fi
+
+gwy_color_range_fixed-24.png: $(srcdir)/src/gwy_color_range_fixed-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_color_range_fixed-24.png" --file="$(srcdir)/src/gwy_color_range_fixed-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_color_range_fixed-24.png" "gwy_color_range_fixed-24.crush.png"
+	if test -s "gwy_color_range_fixed-24.crush.png"; then mv -f "gwy_color_range_fixed-24.crush.png" "gwy_color_range_fixed-24.png"; fi
+
+gwy_color_range_full-24.png: $(srcdir)/src/gwy_color_range_full-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_color_range_full-24.png" --file="$(srcdir)/src/gwy_color_range_full-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_color_range_full-24.png" "gwy_color_range_full-24.crush.png"
+	if test -s "gwy_color_range_full-24.crush.png"; then mv -f "gwy_color_range_full-24.crush.png" "gwy_color_range_full-24.png"; fi
+
+gwy_convolution-24.png: $(srcdir)/src/gwy_convolution-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_convolution-24.png" --file="$(srcdir)/src/gwy_convolution-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_convolution-24.png" "gwy_convolution-24.crush.png"
+	if test -s "gwy_convolution-24.crush.png"; then mv -f "gwy_convolution-24.crush.png" "gwy_convolution-24.png"; fi
+
+gwy_correct_affine-24.png: $(srcdir)/src/gwy_correct_affine-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_correct_affine-24.png" --file="$(srcdir)/src/gwy_correct_affine-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_correct_affine-24.png" "gwy_correct_affine-24.crush.png"
+	if test -s "gwy_correct_affine-24.crush.png"; then mv -f "gwy_correct_affine-24.crush.png" "gwy_correct_affine-24.png"; fi
+
+gwy_correlation_mask-24.png: $(srcdir)/src/gwy_correlation_mask-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_correlation_mask-24.png" --file="$(srcdir)/src/gwy_correlation_mask-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_correlation_mask-24.png" "gwy_correlation_mask-24.crush.png"
+	if test -s "gwy_correlation_mask-24.crush.png"; then mv -f "gwy_correlation_mask-24.crush.png" "gwy_correlation_mask-24.png"; fi
+
+gwy_crop-24.png: $(srcdir)/src/gwy_crop-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_crop-24.png" --file="$(srcdir)/src/gwy_crop-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_crop-24.png" "gwy_crop-24.crush.png"
+	if test -s "gwy_crop-24.crush.png"; then mv -f "gwy_crop-24.crush.png" "gwy_crop-24.png"; fi
+
+gwy_cwt-24.png: $(srcdir)/src/gwy_cwt-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_cwt-24.png" --file="$(srcdir)/src/gwy_cwt-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_cwt-24.png" "gwy_cwt-24.crush.png"
+	if test -s "gwy_cwt-24.crush.png"; then mv -f "gwy_cwt-24.crush.png" "gwy_cwt-24.png"; fi
+
+gwy_data_measure-24.png: $(srcdir)/src/gwy_data_measure-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_data_measure-24.png" --file="$(srcdir)/src/gwy_data_measure-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_data_measure-24.png" "gwy_data_measure-24.crush.png"
+	if test -s "gwy_data_measure-24.crush.png"; then mv -f "gwy_data_measure-24.crush.png" "gwy_data_measure-24.png"; fi
+
+gwy_disconnected-24.png: $(srcdir)/src/gwy_disconnected-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_disconnected-24.png" --file="$(srcdir)/src/gwy_disconnected-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_disconnected-24.png" "gwy_disconnected-24.crush.png"
+	if test -s "gwy_disconnected-24.crush.png"; then mv -f "gwy_disconnected-24.crush.png" "gwy_disconnected-24.png"; fi
+
+gwy_distance-24.png: $(srcdir)/src/gwy_distance-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_distance-24.png" --file="$(srcdir)/src/gwy_distance-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_distance-24.png" "gwy_distance-24.crush.png"
+	if test -s "gwy_distance-24.crush.png"; then mv -f "gwy_distance-24.crush.png" "gwy_distance-24.png"; fi
+
+gwy_distance_transform-24.png: $(srcdir)/src/gwy_distance_transform-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_distance_transform-24.png" --file="$(srcdir)/src/gwy_distance_transform-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_distance_transform-24.png" "gwy_distance_transform-24.crush.png"
+	if test -s "gwy_distance_transform-24.crush.png"; then mv -f "gwy_distance_transform-24.crush.png" "gwy_distance_transform-24.png"; fi
+
+gwy_distribution_angle-24.png: $(srcdir)/src/gwy_distribution_angle-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_distribution_angle-24.png" --file="$(srcdir)/src/gwy_distribution_angle-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_distribution_angle-24.png" "gwy_distribution_angle-24.crush.png"
+	if test -s "gwy_distribution_angle-24.crush.png"; then mv -f "gwy_distribution_angle-24.crush.png" "gwy_distribution_angle-24.png"; fi
+
+gwy_distribution_slope-24.png: $(srcdir)/src/gwy_distribution_slope-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_distribution_slope-24.png" --file="$(srcdir)/src/gwy_distribution_slope-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_distribution_slope-24.png" "gwy_distribution_slope-24.crush.png"
+	if test -s "gwy_distribution_slope-24.crush.png"; then mv -f "gwy_distribution_slope-24.crush.png" "gwy_distribution_slope-24.png"; fi
+
+gwy_dwt-24.png: $(srcdir)/src/gwy_dwt-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_dwt-24.png" --file="$(srcdir)/src/gwy_dwt-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_dwt-24.png" "gwy_dwt-24.crush.png"
+	if test -s "gwy_dwt-24.crush.png"; then mv -f "gwy_dwt-24.crush.png" "gwy_dwt-24.png"; fi
+
+gwy_edge-24.png: $(srcdir)/src/gwy_edge-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_edge-24.png" --file="$(srcdir)/src/gwy_edge-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_edge-24.png" "gwy_edge-24.crush.png"
+	if test -s "gwy_edge-24.crush.png"; then mv -f "gwy_edge-24.crush.png" "gwy_edge-24.png"; fi
+
+gwy_enforce_distribution-24.png: $(srcdir)/src/gwy_enforce_distribution-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_enforce_distribution-24.png" --file="$(srcdir)/src/gwy_enforce_distribution-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_enforce_distribution-24.png" "gwy_enforce_distribution-24.crush.png"
+	if test -s "gwy_enforce_distribution-24.crush.png"; then mv -f "gwy_enforce_distribution-24.crush.png" "gwy_enforce_distribution-24.png"; fi
+
+gwy_entropy-24.png: $(srcdir)/src/gwy_entropy-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_entropy-24.png" --file="$(srcdir)/src/gwy_entropy-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_entropy-24.png" "gwy_entropy-24.crush.png"
+	if test -s "gwy_entropy-24.crush.png"; then mv -f "gwy_entropy-24.crush.png" "gwy_entropy-24.png"; fi
+
+gwy_extend-24.png: $(srcdir)/src/gwy_extend-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_extend-24.png" --file="$(srcdir)/src/gwy_extend-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_extend-24.png" "gwy_extend-24.crush.png"
+	if test -s "gwy_extend-24.crush.png"; then mv -f "gwy_extend-24.crush.png" "gwy_extend-24.png"; fi
+
+gwy_extract_path-24.png: $(srcdir)/src/gwy_extract_path-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_extract_path-24.png" --file="$(srcdir)/src/gwy_extract_path-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_extract_path-24.png" "gwy_extract_path-24.crush.png"
+	if test -s "gwy_extract_path-24.crush.png"; then mv -f "gwy_extract_path-24.crush.png" "gwy_extract_path-24.png"; fi
+
+gwy_facet_level-24.png: $(srcdir)/src/gwy_facet_level-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_facet_level-24.png" --file="$(srcdir)/src/gwy_facet_level-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_facet_level-24.png" "gwy_facet_level-24.crush.png"
+	if test -s "gwy_facet_level-24.crush.png"; then mv -f "gwy_facet_level-24.crush.png" "gwy_facet_level-24.png"; fi
+
+gwy_favourite-24.png: $(srcdir)/src/gwy_favourite-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_favourite-24.png" --file="$(srcdir)/src/gwy_favourite-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_favourite-24.png" "gwy_favourite-24.crush.png"
+	if test -s "gwy_favourite-24.crush.png"; then mv -f "gwy_favourite-24.crush.png" "gwy_favourite-24.png"; fi
+
+gwy_fft-24.png: $(srcdir)/src/gwy_fft-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fft-24.png" --file="$(srcdir)/src/gwy_fft-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_fft-24.png" "gwy_fft-24.crush.png"
+	if test -s "gwy_fft-24.crush.png"; then mv -f "gwy_fft-24.crush.png" "gwy_fft-24.png"; fi
+
+gwy_fft_2d-24.png: $(srcdir)/src/gwy_fft_2d-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fft_2d-24.png" --file="$(srcdir)/src/gwy_fft_2d-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_fft_2d-24.png" "gwy_fft_2d-24.crush.png"
+	if test -s "gwy_fft_2d-24.crush.png"; then mv -f "gwy_fft_2d-24.crush.png" "gwy_fft_2d-24.png"; fi
+
+gwy_fft_filter_1d-24.png: $(srcdir)/src/gwy_fft_filter_1d-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fft_filter_1d-24.png" --file="$(srcdir)/src/gwy_fft_filter_1d-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_fft_filter_1d-24.png" "gwy_fft_filter_1d-24.crush.png"
+	if test -s "gwy_fft_filter_1d-24.crush.png"; then mv -f "gwy_fft_filter_1d-24.crush.png" "gwy_fft_filter_1d-24.png"; fi
+
+gwy_fft_filter_2d-24.png: $(srcdir)/src/gwy_fft_filter_2d-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fft_filter_2d-24.png" --file="$(srcdir)/src/gwy_fft_filter_2d-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_fft_filter_2d-24.png" "gwy_fft_filter_2d-24.crush.png"
+	if test -s "gwy_fft_filter_2d-24.crush.png"; then mv -f "gwy_fft_filter_2d-24.crush.png" "gwy_fft_filter_2d-24.png"; fi
+
+gwy_filter-24.png: $(srcdir)/src/gwy_filter-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_filter-24.png" --file="$(srcdir)/src/gwy_filter-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_filter-24.png" "gwy_filter-24.crush.png"
+	if test -s "gwy_filter-24.crush.png"; then mv -f "gwy_filter-24.crush.png" "gwy_filter-24.png"; fi
+
+gwy_find_peaks-24.png: $(srcdir)/src/gwy_find_peaks-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_find_peaks-24.png" --file="$(srcdir)/src/gwy_find_peaks-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_find_peaks-24.png" "gwy_find_peaks-24.crush.png"
+	if test -s "gwy_find_peaks-24.crush.png"; then mv -f "gwy_find_peaks-24.crush.png" "gwy_find_peaks-24.png"; fi
+
+gwy_fit_shape-24.png: $(srcdir)/src/gwy_fit_shape-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fit_shape-24.png" --file="$(srcdir)/src/gwy_fit_shape-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_fit_shape-24.png" "gwy_fit_shape-24.crush.png"
+	if test -s "gwy_fit_shape-24.crush.png"; then mv -f "gwy_fit_shape-24.crush.png" "gwy_fit_shape-24.png"; fi
+
+gwy_fix_zero-24.png: $(srcdir)/src/gwy_fix_zero-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fix_zero-24.png" --file="$(srcdir)/src/gwy_fix_zero-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_fix_zero-24.png" "gwy_fix_zero-24.crush.png"
+	if test -s "gwy_fix_zero-24.crush.png"; then mv -f "gwy_fix_zero-24.crush.png" "gwy_fix_zero-24.png"; fi
+
+gwy_flip_horizontally-24.png: $(srcdir)/src/gwy_flip_horizontally-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_flip_horizontally-24.png" --file="$(srcdir)/src/gwy_flip_horizontally-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_flip_horizontally-24.png" "gwy_flip_horizontally-24.crush.png"
+	if test -s "gwy_flip_horizontally-24.crush.png"; then mv -f "gwy_flip_horizontally-24.crush.png" "gwy_flip_horizontally-24.png"; fi
+
+gwy_flip_vertically-24.png: $(srcdir)/src/gwy_flip_vertically-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_flip_vertically-24.png" --file="$(srcdir)/src/gwy_flip_vertically-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_flip_vertically-24.png" "gwy_flip_vertically-24.crush.png"
+	if test -s "gwy_flip_vertically-24.crush.png"; then mv -f "gwy_flip_vertically-24.crush.png" "gwy_flip_vertically-24.png"; fi
+
+gwy_fractal-24.png: $(srcdir)/src/gwy_fractal-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fractal-24.png" --file="$(srcdir)/src/gwy_fractal-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_fractal-24.png" "gwy_fractal-24.crush.png"
+	if test -s "gwy_fractal-24.crush.png"; then mv -f "gwy_fractal-24.crush.png" "gwy_fractal-24.png"; fi
+
+gwy_fractal_correction-24.png: $(srcdir)/src/gwy_fractal_correction-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fractal_correction-24.png" --file="$(srcdir)/src/gwy_fractal_correction-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_fractal_correction-24.png" "gwy_fractal_correction-24.crush.png"
+	if test -s "gwy_fractal_correction-24.crush.png"; then mv -f "gwy_fractal_correction-24.crush.png" "gwy_fractal_correction-24.png"; fi
+
+gwy_fractal_measure-24.png: $(srcdir)/src/gwy_fractal_measure-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fractal_measure-24.png" --file="$(srcdir)/src/gwy_fractal_measure-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_fractal_measure-24.png" "gwy_fractal_measure-24.crush.png"
+	if test -s "gwy_fractal_measure-24.crush.png"; then mv -f "gwy_fractal_measure-24.crush.png" "gwy_fractal_measure-24.png"; fi
+
+gwy_gl_material-16.png: $(srcdir)/src/gwy_gl_material-16.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=16 --export-height=16 --export-png="gwy_gl_material-16.png" --file="$(srcdir)/src/gwy_gl_material-16.svg"
+	$(PNGCRUSH) -q -brute "gwy_gl_material-16.png" "gwy_gl_material-16.crush.png"
+	if test -s "gwy_gl_material-16.crush.png"; then mv -f "gwy_gl_material-16.crush.png" "gwy_gl_material-16.png"; fi
+
+gwy_gradient_horizontal-24.png: $(srcdir)/src/gwy_gradient_horizontal-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_gradient_horizontal-24.png" --file="$(srcdir)/src/gwy_gradient_horizontal-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_gradient_horizontal-24.png" "gwy_gradient_horizontal-24.crush.png"
+	if test -s "gwy_gradient_horizontal-24.crush.png"; then mv -f "gwy_gradient_horizontal-24.crush.png" "gwy_gradient_horizontal-24.png"; fi
+
+gwy_gradient_vertical-24.png: $(srcdir)/src/gwy_gradient_vertical-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_gradient_vertical-24.png" --file="$(srcdir)/src/gwy_gradient_vertical-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_gradient_vertical-24.png" "gwy_gradient_vertical-24.crush.png"
+	if test -s "gwy_gradient_vertical-24.crush.png"; then mv -f "gwy_gradient_vertical-24.crush.png" "gwy_gradient_vertical-24.png"; fi
+
+gwy_grain_correlation-24.png: $(srcdir)/src/gwy_grain_correlation-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grain_correlation-24.png" --file="$(srcdir)/src/gwy_grain_correlation-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_grain_correlation-24.png" "gwy_grain_correlation-24.crush.png"
+	if test -s "gwy_grain_correlation-24.crush.png"; then mv -f "gwy_grain_correlation-24.crush.png" "gwy_grain_correlation-24.png"; fi
+
+gwy_grain_exscribed_circle-24.png: $(srcdir)/src/gwy_grain_exscribed_circle-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grain_exscribed_circle-24.png" --file="$(srcdir)/src/gwy_grain_exscribed_circle-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_grain_exscribed_circle-24.png" "gwy_grain_exscribed_circle-24.crush.png"
+	if test -s "gwy_grain_exscribed_circle-24.crush.png"; then mv -f "gwy_grain_exscribed_circle-24.crush.png" "gwy_grain_exscribed_circle-24.png"; fi
+
+gwy_grain_inscribed_circle-24.png: $(srcdir)/src/gwy_grain_inscribed_circle-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grain_inscribed_circle-24.png" --file="$(srcdir)/src/gwy_grain_inscribed_circle-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_grain_inscribed_circle-24.png" "gwy_grain_inscribed_circle-24.crush.png"
+	if test -s "gwy_grain_inscribed_circle-24.crush.png"; then mv -f "gwy_grain_inscribed_circle-24.crush.png" "gwy_grain_inscribed_circle-24.png"; fi
+
+gwy_grains-24.png: $(srcdir)/src/gwy_grains-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grains-24.png" --file="$(srcdir)/src/gwy_grains-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_grains-24.png" "gwy_grains-24.crush.png"
+	if test -s "gwy_grains-24.crush.png"; then mv -f "gwy_grains-24.crush.png" "gwy_grains-24.png"; fi
+
+gwy_grains_edge-24.png: $(srcdir)/src/gwy_grains_edge-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grains_edge-24.png" --file="$(srcdir)/src/gwy_grains_edge-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_grains_edge-24.png" "gwy_grains_edge-24.crush.png"
+	if test -s "gwy_grains_edge-24.crush.png"; then mv -f "gwy_grains_edge-24.crush.png" "gwy_grains_edge-24.png"; fi
+
+gwy_grains_edge_remove-24.png: $(srcdir)/src/gwy_grains_edge_remove-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grains_edge_remove-24.png" --file="$(srcdir)/src/gwy_grains_edge_remove-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_grains_edge_remove-24.png" "gwy_grains_edge_remove-24.crush.png"
+	if test -s "gwy_grains_edge_remove-24.crush.png"; then mv -f "gwy_grains_edge_remove-24.crush.png" "gwy_grains_edge_remove-24.png"; fi
+
+gwy_grains_graph-24.png: $(srcdir)/src/gwy_grains_graph-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grains_graph-24.png" --file="$(srcdir)/src/gwy_grains_graph-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_grains_graph-24.png" "gwy_grains_graph-24.crush.png"
+	if test -s "gwy_grains_graph-24.crush.png"; then mv -f "gwy_grains_graph-24.crush.png" "gwy_grains_graph-24.png"; fi
+
+gwy_grains_measure-24.png: $(srcdir)/src/gwy_grains_measure-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grains_measure-24.png" --file="$(srcdir)/src/gwy_grains_measure-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_grains_measure-24.png" "gwy_grains_measure-24.crush.png"
+	if test -s "gwy_grains_measure-24.crush.png"; then mv -f "gwy_grains_measure-24.crush.png" "gwy_grains_measure-24.png"; fi
+
+gwy_grains_remove-24.png: $(srcdir)/src/gwy_grains_remove-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grains_remove-24.png" --file="$(srcdir)/src/gwy_grains_remove-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_grains_remove-24.png" "gwy_grains_remove-24.crush.png"
+	if test -s "gwy_grains_remove-24.crush.png"; then mv -f "gwy_grains_remove-24.crush.png" "gwy_grains_remove-24.png"; fi
+
+gwy_grains_water-24.png: $(srcdir)/src/gwy_grains_water-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grains_water-24.png" --file="$(srcdir)/src/gwy_grains_water-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_grains_water-24.png" "gwy_grains_water-24.crush.png"
+	if test -s "gwy_grains_water-24.crush.png"; then mv -f "gwy_grains_water-24.crush.png" "gwy_grains_water-24.png"; fi
+
+gwy_graph-24.png: $(srcdir)/src/gwy_graph-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph-24.png" --file="$(srcdir)/src/gwy_graph-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph-24.png" "gwy_graph-24.crush.png"
+	if test -s "gwy_graph-24.crush.png"; then mv -f "gwy_graph-24.crush.png" "gwy_graph-24.png"; fi
+
+gwy_graph_align-24.png: $(srcdir)/src/gwy_graph_align-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_align-24.png" --file="$(srcdir)/src/gwy_graph_align-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_align-24.png" "gwy_graph_align-24.crush.png"
+	if test -s "gwy_graph_align-24.crush.png"; then mv -f "gwy_graph_align-24.crush.png" "gwy_graph_align-24.png"; fi
+
+gwy_graph_cut-24.png: $(srcdir)/src/gwy_graph_cut-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_cut-24.png" --file="$(srcdir)/src/gwy_graph_cut-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_cut-24.png" "gwy_graph_cut-24.crush.png"
+	if test -s "gwy_graph_cut-24.crush.png"; then mv -f "gwy_graph_cut-24.crush.png" "gwy_graph_cut-24.png"; fi
+
+gwy_graph_dos-24.png: $(srcdir)/src/gwy_graph_dos-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_dos-24.png" --file="$(srcdir)/src/gwy_graph_dos-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_dos-24.png" "gwy_graph_dos-24.crush.png"
+	if test -s "gwy_graph_dos-24.crush.png"; then mv -f "gwy_graph_dos-24.crush.png" "gwy_graph_dos-24.png"; fi
+
+gwy_graph_export_ascii-24.png: $(srcdir)/src/gwy_graph_export_ascii-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_export_ascii-24.png" --file="$(srcdir)/src/gwy_graph_export_ascii-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_export_ascii-24.png" "gwy_graph_export_ascii-24.crush.png"
+	if test -s "gwy_graph_export_ascii-24.crush.png"; then mv -f "gwy_graph_export_ascii-24.crush.png" "gwy_graph_export_ascii-24.png"; fi
+
+gwy_graph_export_png-24.png: $(srcdir)/src/gwy_graph_export_png-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_export_png-24.png" --file="$(srcdir)/src/gwy_graph_export_png-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_export_png-24.png" "gwy_graph_export_png-24.crush.png"
+	if test -s "gwy_graph_export_png-24.crush.png"; then mv -f "gwy_graph_export_png-24.crush.png" "gwy_graph_export_png-24.png"; fi
+
+gwy_graph_export_vector-24.png: $(srcdir)/src/gwy_graph_export_vector-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_export_vector-24.png" --file="$(srcdir)/src/gwy_graph_export_vector-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_export_vector-24.png" "gwy_graph_export_vector-24.crush.png"
+	if test -s "gwy_graph_export_vector-24.crush.png"; then mv -f "gwy_graph_export_vector-24.crush.png" "gwy_graph_export_vector-24.png"; fi
+
+gwy_graph_fd-24.png: $(srcdir)/src/gwy_graph_fd-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_fd-24.png" --file="$(srcdir)/src/gwy_graph_fd-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_fd-24.png" "gwy_graph_fd-24.crush.png"
+	if test -s "gwy_graph_fd-24.crush.png"; then mv -f "gwy_graph_fd-24.crush.png" "gwy_graph_fd-24.png"; fi
+
+gwy_graph_filter-24.png: $(srcdir)/src/gwy_graph_filter-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_filter-24.png" --file="$(srcdir)/src/gwy_graph_filter-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_filter-24.png" "gwy_graph_filter-24.crush.png"
+	if test -s "gwy_graph_filter-24.crush.png"; then mv -f "gwy_graph_filter-24.crush.png" "gwy_graph_filter-24.png"; fi
+
+gwy_graph_function-24.png: $(srcdir)/src/gwy_graph_function-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_function-24.png" --file="$(srcdir)/src/gwy_graph_function-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_function-24.png" "gwy_graph_function-24.crush.png"
+	if test -s "gwy_graph_function-24.crush.png"; then mv -f "gwy_graph_function-24.crush.png" "gwy_graph_function-24.png"; fi
+
+gwy_graph_halfgauss-24.png: $(srcdir)/src/gwy_graph_halfgauss-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_halfgauss-24.png" --file="$(srcdir)/src/gwy_graph_halfgauss-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_halfgauss-24.png" "gwy_graph_halfgauss-24.crush.png"
+	if test -s "gwy_graph_halfgauss-24.crush.png"; then mv -f "gwy_graph_halfgauss-24.crush.png" "gwy_graph_halfgauss-24.png"; fi
+
+gwy_graph_level-24.png: $(srcdir)/src/gwy_graph_level-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_level-24.png" --file="$(srcdir)/src/gwy_graph_level-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_level-24.png" "gwy_graph_level-24.crush.png"
+	if test -s "gwy_graph_level-24.crush.png"; then mv -f "gwy_graph_level-24.crush.png" "gwy_graph_level-24.png"; fi
+
+gwy_graph_measure-24.png: $(srcdir)/src/gwy_graph_measure-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_measure-24.png" --file="$(srcdir)/src/gwy_graph_measure-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_measure-24.png" "gwy_graph_measure-24.crush.png"
+	if test -s "gwy_graph_measure-24.crush.png"; then mv -f "gwy_graph_measure-24.crush.png" "gwy_graph_measure-24.png"; fi
+
+gwy_graph_palette-24.png: $(srcdir)/src/gwy_graph_palette-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_palette-24.png" --file="$(srcdir)/src/gwy_graph_palette-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_palette-24.png" "gwy_graph_palette-24.crush.png"
+	if test -s "gwy_graph_palette-24.crush.png"; then mv -f "gwy_graph_palette-24.crush.png" "gwy_graph_palette-24.png"; fi
+
+gwy_graph_pointer-24.png: $(srcdir)/src/gwy_graph_pointer-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_pointer-24.png" --file="$(srcdir)/src/gwy_graph_pointer-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_pointer-24.png" "gwy_graph_pointer-24.crush.png"
+	if test -s "gwy_graph_pointer-24.crush.png"; then mv -f "gwy_graph_pointer-24.crush.png" "gwy_graph_pointer-24.png"; fi
+
+gwy_graph_ruler-24.png: $(srcdir)/src/gwy_graph_ruler-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_ruler-24.png" --file="$(srcdir)/src/gwy_graph_ruler-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_ruler-24.png" "gwy_graph_ruler-24.crush.png"
+	if test -s "gwy_graph_ruler-24.crush.png"; then mv -f "gwy_graph_ruler-24.crush.png" "gwy_graph_ruler-24.png"; fi
+
+gwy_graph_vertical-24.png: $(srcdir)/src/gwy_graph_vertical-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_vertical-24.png" --file="$(srcdir)/src/gwy_graph_vertical-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_vertical-24.png" "gwy_graph_vertical-24.crush.png"
+	if test -s "gwy_graph_vertical-24.crush.png"; then mv -f "gwy_graph_vertical-24.crush.png" "gwy_graph_vertical-24.png"; fi
+
+gwy_graph_zoom_fit-24.png: $(srcdir)/src/gwy_graph_zoom_fit-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_zoom_fit-24.png" --file="$(srcdir)/src/gwy_graph_zoom_fit-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_zoom_fit-24.png" "gwy_graph_zoom_fit-24.crush.png"
+	if test -s "gwy_graph_zoom_fit-24.crush.png"; then mv -f "gwy_graph_zoom_fit-24.crush.png" "gwy_graph_zoom_fit-24.png"; fi
+
+gwy_graph_zoom_in-24.png: $(srcdir)/src/gwy_graph_zoom_in-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_zoom_in-24.png" --file="$(srcdir)/src/gwy_graph_zoom_in-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_zoom_in-24.png" "gwy_graph_zoom_in-24.crush.png"
+	if test -s "gwy_graph_zoom_in-24.crush.png"; then mv -f "gwy_graph_zoom_in-24.crush.png" "gwy_graph_zoom_in-24.png"; fi
+
+gwy_graph_zoom_out-24.png: $(srcdir)/src/gwy_graph_zoom_out-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_zoom_out-24.png" --file="$(srcdir)/src/gwy_graph_zoom_out-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_graph_zoom_out-24.png" "gwy_graph_zoom_out-24.crush.png"
+	if test -s "gwy_graph_zoom_out-24.crush.png"; then mv -f "gwy_graph_zoom_out-24.crush.png" "gwy_graph_zoom_out-24.png"; fi
+
+gwy_hough-24.png: $(srcdir)/src/gwy_hough-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_hough-24.png" --file="$(srcdir)/src/gwy_hough-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_hough-24.png" "gwy_hough-24.crush.png"
+	if test -s "gwy_hough-24.crush.png"; then mv -f "gwy_hough-24.crush.png" "gwy_hough-24.png"; fi
+
+gwy_immerse-24.png: $(srcdir)/src/gwy_immerse-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_immerse-24.png" --file="$(srcdir)/src/gwy_immerse-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_immerse-24.png" "gwy_immerse-24.crush.png"
+	if test -s "gwy_immerse-24.crush.png"; then mv -f "gwy_immerse-24.crush.png" "gwy_immerse-24.png"; fi
+
+gwy_iso_roughness-24.png: $(srcdir)/src/gwy_iso_roughness-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_iso_roughness-24.png" --file="$(srcdir)/src/gwy_iso_roughness-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_iso_roughness-24.png" "gwy_iso_roughness-24.crush.png"
+	if test -s "gwy_iso_roughness-24.crush.png"; then mv -f "gwy_iso_roughness-24.crush.png" "gwy_iso_roughness-24.png"; fi
+
+gwy_italic-20.png: $(srcdir)/src/gwy_italic-20.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=20 --export-height=20 --export-png="gwy_italic-20.png" --file="$(srcdir)/src/gwy_italic-20.svg"
+	$(PNGCRUSH) -q -brute "gwy_italic-20.png" "gwy_italic-20.crush.png"
+	if test -s "gwy_italic-20.crush.png"; then mv -f "gwy_italic-20.crush.png" "gwy_italic-20.png"; fi
+
+gwy_less-24.png: $(srcdir)/src/gwy_less-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_less-24.png" --file="$(srcdir)/src/gwy_less-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_less-24.png" "gwy_less-24.crush.png"
+	if test -s "gwy_less-24.crush.png"; then mv -f "gwy_less-24.crush.png" "gwy_less-24.png"; fi
+
+gwy_level-24.png: $(srcdir)/src/gwy_level-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_level-24.png" --file="$(srcdir)/src/gwy_level-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_level-24.png" "gwy_level-24.crush.png"
+	if test -s "gwy_level-24.crush.png"; then mv -f "gwy_level-24.crush.png" "gwy_level-24.png"; fi
+
+gwy_level_flatten_base-24.png: $(srcdir)/src/gwy_level_flatten_base-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_level_flatten_base-24.png" --file="$(srcdir)/src/gwy_level_flatten_base-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_level_flatten_base-24.png" "gwy_level_flatten_base-24.crush.png"
+	if test -s "gwy_level_flatten_base-24.crush.png"; then mv -f "gwy_level_flatten_base-24.crush.png" "gwy_level_flatten_base-24.png"; fi
+
+gwy_level_median-24.png: $(srcdir)/src/gwy_level_median-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_level_median-24.png" --file="$(srcdir)/src/gwy_level_median-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_level_median-24.png" "gwy_level_median-24.crush.png"
+	if test -s "gwy_level_median-24.crush.png"; then mv -f "gwy_level_median-24.crush.png" "gwy_level_median-24.png"; fi
+
+gwy_level_triangle-24.png: $(srcdir)/src/gwy_level_triangle-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_level_triangle-24.png" --file="$(srcdir)/src/gwy_level_triangle-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_level_triangle-24.png" "gwy_level_triangle-24.crush.png"
+	if test -s "gwy_level_triangle-24.crush.png"; then mv -f "gwy_level_triangle-24.crush.png" "gwy_level_triangle-24.png"; fi
+
+gwy_light_rotate-24.png: $(srcdir)/src/gwy_light_rotate-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_light_rotate-24.png" --file="$(srcdir)/src/gwy_light_rotate-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_light_rotate-24.png" "gwy_light_rotate-24.crush.png"
+	if test -s "gwy_light_rotate-24.crush.png"; then mv -f "gwy_light_rotate-24.crush.png" "gwy_light_rotate-24.png"; fi
+
+gwy_line_level-24.png: $(srcdir)/src/gwy_line_level-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_line_level-24.png" --file="$(srcdir)/src/gwy_line_level-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_line_level-24.png" "gwy_line_level-24.crush.png"
+	if test -s "gwy_line_level-24.crush.png"; then mv -f "gwy_line_level-24.crush.png" "gwy_line_level-24.png"; fi
+
+gwy_load_debug-20.png: $(srcdir)/src/gwy_load_debug-20.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=20 --export-height=20 --export-png="gwy_load_debug-20.png" --file="$(srcdir)/src/gwy_load_debug-20.svg"
+	$(PNGCRUSH) -q -brute "gwy_load_debug-20.png" "gwy_load_debug-20.crush.png"
+	if test -s "gwy_load_debug-20.crush.png"; then mv -f "gwy_load_debug-20.crush.png" "gwy_load_debug-20.png"; fi
+
+gwy_load_info-20.png: $(srcdir)/src/gwy_load_info-20.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=20 --export-height=20 --export-png="gwy_load_info-20.png" --file="$(srcdir)/src/gwy_load_info-20.svg"
+	$(PNGCRUSH) -q -brute "gwy_load_info-20.png" "gwy_load_info-20.crush.png"
+	if test -s "gwy_load_info-20.crush.png"; then mv -f "gwy_load_info-20.crush.png" "gwy_load_info-20.png"; fi
+
+gwy_load_warning-20.png: $(srcdir)/src/gwy_load_warning-20.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=20 --export-height=20 --export-png="gwy_load_warning-20.png" --file="$(srcdir)/src/gwy_load_warning-20.svg"
+	$(PNGCRUSH) -q -brute "gwy_load_warning-20.png" "gwy_load_warning-20.crush.png"
+	if test -s "gwy_load_warning-20.crush.png"; then mv -f "gwy_load_warning-20.crush.png" "gwy_load_warning-20.png"; fi
+
+gwy_local_slope-24.png: $(srcdir)/src/gwy_local_slope-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_local_slope-24.png" --file="$(srcdir)/src/gwy_local_slope-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_local_slope-24.png" "gwy_local_slope-24.crush.png"
+	if test -s "gwy_local_slope-24.crush.png"; then mv -f "gwy_local_slope-24.crush.png" "gwy_local_slope-24.png"; fi
+
+gwy_logscale_horizontal-24.png: $(srcdir)/src/gwy_logscale_horizontal-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_logscale_horizontal-24.png" --file="$(srcdir)/src/gwy_logscale_horizontal-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_logscale_horizontal-24.png" "gwy_logscale_horizontal-24.crush.png"
+	if test -s "gwy_logscale_horizontal-24.crush.png"; then mv -f "gwy_logscale_horizontal-24.crush.png" "gwy_logscale_horizontal-24.png"; fi
+
+gwy_logscale_vertical-24.png: $(srcdir)/src/gwy_logscale_vertical-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_logscale_vertical-24.png" --file="$(srcdir)/src/gwy_logscale_vertical-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_logscale_vertical-24.png" "gwy_logscale_vertical-24.crush.png"
+	if test -s "gwy_logscale_vertical-24.crush.png"; then mv -f "gwy_logscale_vertical-24.crush.png" "gwy_logscale_vertical-24.png"; fi
+
+gwy_mark_outliers-24.png: $(srcdir)/src/gwy_mark_outliers-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mark_outliers-24.png" --file="$(srcdir)/src/gwy_mark_outliers-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mark_outliers-24.png" "gwy_mark_outliers-24.crush.png"
+	if test -s "gwy_mark_outliers-24.crush.png"; then mv -f "gwy_mark_outliers-24.crush.png" "gwy_mark_outliers-24.png"; fi
+
+gwy_mark_scars-24.png: $(srcdir)/src/gwy_mark_scars-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mark_scars-24.png" --file="$(srcdir)/src/gwy_mark_scars-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mark_scars-24.png" "gwy_mark_scars-24.crush.png"
+	if test -s "gwy_mark_scars-24.crush.png"; then mv -f "gwy_mark_scars-24.crush.png" "gwy_mark_scars-24.png"; fi
+
+gwy_mark_with-24.png: $(srcdir)/src/gwy_mark_with-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mark_with-24.png" --file="$(srcdir)/src/gwy_mark_with-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mark_with-24.png" "gwy_mark_with-24.crush.png"
+	if test -s "gwy_mark_with-24.crush.png"; then mv -f "gwy_mark_with-24.crush.png" "gwy_mark_with-24.png"; fi
+
+gwy_mask-16.png: $(srcdir)/src/gwy_mask-16.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=16 --export-height=16 --export-png="gwy_mask-16.png" --file="$(srcdir)/src/gwy_mask-16.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask-16.png" "gwy_mask-16.crush.png"
+	if test -s "gwy_mask-16.crush.png"; then mv -f "gwy_mask-16.crush.png" "gwy_mask-16.png"; fi
+
+gwy_mask-24.png: $(srcdir)/src/gwy_mask-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask-24.png" --file="$(srcdir)/src/gwy_mask-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask-24.png" "gwy_mask-24.crush.png"
+	if test -s "gwy_mask-24.crush.png"; then mv -f "gwy_mask-24.crush.png" "gwy_mask-24.png"; fi
+
+gwy_mask_add-24.png: $(srcdir)/src/gwy_mask_add-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_add-24.png" --file="$(srcdir)/src/gwy_mask_add-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_add-24.png" "gwy_mask_add-24.crush.png"
+	if test -s "gwy_mask_add-24.crush.png"; then mv -f "gwy_mask_add-24.crush.png" "gwy_mask_add-24.png"; fi
+
+gwy_mask_circle-24.png: $(srcdir)/src/gwy_mask_circle-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_circle-24.png" --file="$(srcdir)/src/gwy_mask_circle-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_circle-24.png" "gwy_mask_circle-24.crush.png"
+	if test -s "gwy_mask_circle-24.crush.png"; then mv -f "gwy_mask_circle-24.crush.png" "gwy_mask_circle-24.png"; fi
+
+gwy_mask_circle_exclusive-24.png: $(srcdir)/src/gwy_mask_circle_exclusive-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_circle_exclusive-24.png" --file="$(srcdir)/src/gwy_mask_circle_exclusive-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_circle_exclusive-24.png" "gwy_mask_circle_exclusive-24.crush.png"
+	if test -s "gwy_mask_circle_exclusive-24.crush.png"; then mv -f "gwy_mask_circle_exclusive-24.crush.png" "gwy_mask_circle_exclusive-24.png"; fi
+
+gwy_mask_circle_inclusive-24.png: $(srcdir)/src/gwy_mask_circle_inclusive-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_circle_inclusive-24.png" --file="$(srcdir)/src/gwy_mask_circle_inclusive-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_circle_inclusive-24.png" "gwy_mask_circle_inclusive-24.crush.png"
+	if test -s "gwy_mask_circle_inclusive-24.crush.png"; then mv -f "gwy_mask_circle_inclusive-24.crush.png" "gwy_mask_circle_inclusive-24.png"; fi
+
+gwy_mask_distribute-24.png: $(srcdir)/src/gwy_mask_distribute-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_distribute-24.png" --file="$(srcdir)/src/gwy_mask_distribute-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_distribute-24.png" "gwy_mask_distribute-24.crush.png"
+	if test -s "gwy_mask_distribute-24.crush.png"; then mv -f "gwy_mask_distribute-24.crush.png" "gwy_mask_distribute-24.png"; fi
+
+gwy_mask_editor-24.png: $(srcdir)/src/gwy_mask_editor-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_editor-24.png" --file="$(srcdir)/src/gwy_mask_editor-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_editor-24.png" "gwy_mask_editor-24.crush.png"
+	if test -s "gwy_mask_editor-24.crush.png"; then mv -f "gwy_mask_editor-24.crush.png" "gwy_mask_editor-24.png"; fi
+
+gwy_mask_exclude-24.png: $(srcdir)/src/gwy_mask_exclude-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_exclude-24.png" --file="$(srcdir)/src/gwy_mask_exclude-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_exclude-24.png" "gwy_mask_exclude-24.crush.png"
+	if test -s "gwy_mask_exclude-24.crush.png"; then mv -f "gwy_mask_exclude-24.crush.png" "gwy_mask_exclude-24.png"; fi
+
+gwy_mask_exclude_circle-24.png: $(srcdir)/src/gwy_mask_exclude_circle-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_exclude_circle-24.png" --file="$(srcdir)/src/gwy_mask_exclude_circle-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_exclude_circle-24.png" "gwy_mask_exclude_circle-24.crush.png"
+	if test -s "gwy_mask_exclude_circle-24.crush.png"; then mv -f "gwy_mask_exclude_circle-24.crush.png" "gwy_mask_exclude_circle-24.png"; fi
+
+gwy_mask_extract-24.png: $(srcdir)/src/gwy_mask_extract-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_extract-24.png" --file="$(srcdir)/src/gwy_mask_extract-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_extract-24.png" "gwy_mask_extract-24.crush.png"
+	if test -s "gwy_mask_extract-24.crush.png"; then mv -f "gwy_mask_extract-24.crush.png" "gwy_mask_extract-24.png"; fi
+
+gwy_mask_fill_draw-24.png: $(srcdir)/src/gwy_mask_fill_draw-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_fill_draw-24.png" --file="$(srcdir)/src/gwy_mask_fill_draw-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_fill_draw-24.png" "gwy_mask_fill_draw-24.crush.png"
+	if test -s "gwy_mask_fill_draw-24.crush.png"; then mv -f "gwy_mask_fill_draw-24.crush.png" "gwy_mask_fill_draw-24.png"; fi
+
+gwy_mask_fill_erase-24.png: $(srcdir)/src/gwy_mask_fill_erase-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_fill_erase-24.png" --file="$(srcdir)/src/gwy_mask_fill_erase-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_fill_erase-24.png" "gwy_mask_fill_erase-24.crush.png"
+	if test -s "gwy_mask_fill_erase-24.crush.png"; then mv -f "gwy_mask_fill_erase-24.crush.png" "gwy_mask_fill_erase-24.png"; fi
+
+gwy_mask_grow-24.png: $(srcdir)/src/gwy_mask_grow-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_grow-24.png" --file="$(srcdir)/src/gwy_mask_grow-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_grow-24.png" "gwy_mask_grow-24.crush.png"
+	if test -s "gwy_mask_grow-24.crush.png"; then mv -f "gwy_mask_grow-24.crush.png" "gwy_mask_grow-24.png"; fi
+
+gwy_mask_intersect-24.png: $(srcdir)/src/gwy_mask_intersect-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_intersect-24.png" --file="$(srcdir)/src/gwy_mask_intersect-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_intersect-24.png" "gwy_mask_intersect-24.crush.png"
+	if test -s "gwy_mask_intersect-24.crush.png"; then mv -f "gwy_mask_intersect-24.crush.png" "gwy_mask_intersect-24.png"; fi
+
+gwy_mask_invert-24.png: $(srcdir)/src/gwy_mask_invert-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_invert-24.png" --file="$(srcdir)/src/gwy_mask_invert-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_invert-24.png" "gwy_mask_invert-24.crush.png"
+	if test -s "gwy_mask_invert-24.crush.png"; then mv -f "gwy_mask_invert-24.crush.png" "gwy_mask_invert-24.png"; fi
+
+gwy_mask_line-24.png: $(srcdir)/src/gwy_mask_line-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_line-24.png" --file="$(srcdir)/src/gwy_mask_line-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_line-24.png" "gwy_mask_line-24.crush.png"
+	if test -s "gwy_mask_line-24.crush.png"; then mv -f "gwy_mask_line-24.crush.png" "gwy_mask_line-24.png"; fi
+
+gwy_mask_morph-24.png: $(srcdir)/src/gwy_mask_morph-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_morph-24.png" --file="$(srcdir)/src/gwy_mask_morph-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_morph-24.png" "gwy_mask_morph-24.crush.png"
+	if test -s "gwy_mask_morph-24.crush.png"; then mv -f "gwy_mask_morph-24.crush.png" "gwy_mask_morph-24.png"; fi
+
+gwy_mask_paint_draw-24.png: $(srcdir)/src/gwy_mask_paint_draw-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_paint_draw-24.png" --file="$(srcdir)/src/gwy_mask_paint_draw-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_paint_draw-24.png" "gwy_mask_paint_draw-24.crush.png"
+	if test -s "gwy_mask_paint_draw-24.crush.png"; then mv -f "gwy_mask_paint_draw-24.crush.png" "gwy_mask_paint_draw-24.png"; fi
+
+gwy_mask_paint_erase-24.png: $(srcdir)/src/gwy_mask_paint_erase-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_paint_erase-24.png" --file="$(srcdir)/src/gwy_mask_paint_erase-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_paint_erase-24.png" "gwy_mask_paint_erase-24.crush.png"
+	if test -s "gwy_mask_paint_erase-24.crush.png"; then mv -f "gwy_mask_paint_erase-24.crush.png" "gwy_mask_paint_erase-24.png"; fi
+
+gwy_mask_rect_exclusive-24.png: $(srcdir)/src/gwy_mask_rect_exclusive-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_rect_exclusive-24.png" --file="$(srcdir)/src/gwy_mask_rect_exclusive-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_rect_exclusive-24.png" "gwy_mask_rect_exclusive-24.crush.png"
+	if test -s "gwy_mask_rect_exclusive-24.crush.png"; then mv -f "gwy_mask_rect_exclusive-24.crush.png" "gwy_mask_rect_exclusive-24.png"; fi
+
+gwy_mask_rect_inclusive-24.png: $(srcdir)/src/gwy_mask_rect_inclusive-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_rect_inclusive-24.png" --file="$(srcdir)/src/gwy_mask_rect_inclusive-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_rect_inclusive-24.png" "gwy_mask_rect_inclusive-24.crush.png"
+	if test -s "gwy_mask_rect_inclusive-24.crush.png"; then mv -f "gwy_mask_rect_inclusive-24.crush.png" "gwy_mask_rect_inclusive-24.png"; fi
+
+gwy_mask_remove-24.png: $(srcdir)/src/gwy_mask_remove-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_remove-24.png" --file="$(srcdir)/src/gwy_mask_remove-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_remove-24.png" "gwy_mask_remove-24.crush.png"
+	if test -s "gwy_mask_remove-24.crush.png"; then mv -f "gwy_mask_remove-24.crush.png" "gwy_mask_remove-24.png"; fi
+
+gwy_mask_set-24.png: $(srcdir)/src/gwy_mask_set-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_set-24.png" --file="$(srcdir)/src/gwy_mask_set-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_set-24.png" "gwy_mask_set-24.crush.png"
+	if test -s "gwy_mask_set-24.crush.png"; then mv -f "gwy_mask_set-24.crush.png" "gwy_mask_set-24.png"; fi
+
+gwy_mask_shrink-24.png: $(srcdir)/src/gwy_mask_shrink-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_shrink-24.png" --file="$(srcdir)/src/gwy_mask_shrink-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_shrink-24.png" "gwy_mask_shrink-24.crush.png"
+	if test -s "gwy_mask_shrink-24.crush.png"; then mv -f "gwy_mask_shrink-24.crush.png" "gwy_mask_shrink-24.png"; fi
+
+gwy_mask_subtract-24.png: $(srcdir)/src/gwy_mask_subtract-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_subtract-24.png" --file="$(srcdir)/src/gwy_mask_subtract-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_subtract-24.png" "gwy_mask_subtract-24.crush.png"
+	if test -s "gwy_mask_subtract-24.crush.png"; then mv -f "gwy_mask_subtract-24.crush.png" "gwy_mask_subtract-24.png"; fi
+
+gwy_mask_thin-24.png: $(srcdir)/src/gwy_mask_thin-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_thin-24.png" --file="$(srcdir)/src/gwy_mask_thin-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mask_thin-24.png" "gwy_mask_thin-24.crush.png"
+	if test -s "gwy_mask_thin-24.crush.png"; then mv -f "gwy_mask_thin-24.crush.png" "gwy_mask_thin-24.png"; fi
+
+gwy_measure_lattice-24.png: $(srcdir)/src/gwy_measure_lattice-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_measure_lattice-24.png" --file="$(srcdir)/src/gwy_measure_lattice-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_measure_lattice-24.png" "gwy_measure_lattice-24.crush.png"
+	if test -s "gwy_measure_lattice-24.crush.png"; then mv -f "gwy_measure_lattice-24.crush.png" "gwy_measure_lattice-24.png"; fi
+
+gwy_merge-24.png: $(srcdir)/src/gwy_merge-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_merge-24.png" --file="$(srcdir)/src/gwy_merge-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_merge-24.png" "gwy_merge-24.crush.png"
+	if test -s "gwy_merge-24.crush.png"; then mv -f "gwy_merge-24.crush.png" "gwy_merge-24.png"; fi
+
+gwy_more-24.png: $(srcdir)/src/gwy_more-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_more-24.png" --file="$(srcdir)/src/gwy_more-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_more-24.png" "gwy_more-24.crush.png"
+	if test -s "gwy_more-24.crush.png"; then mv -f "gwy_more-24.crush.png" "gwy_more-24.png"; fi
+
+gwy_mutual_crop-24.png: $(srcdir)/src/gwy_mutual_crop-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mutual_crop-24.png" --file="$(srcdir)/src/gwy_mutual_crop-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_mutual_crop-24.png" "gwy_mutual_crop-24.crush.png"
+	if test -s "gwy_mutual_crop-24.crush.png"; then mv -f "gwy_mutual_crop-24.crush.png" "gwy_mutual_crop-24.png"; fi
+
+gwy_neural_apply-24.png: $(srcdir)/src/gwy_neural_apply-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_neural_apply-24.png" --file="$(srcdir)/src/gwy_neural_apply-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_neural_apply-24.png" "gwy_neural_apply-24.crush.png"
+	if test -s "gwy_neural_apply-24.crush.png"; then mv -f "gwy_neural_apply-24.crush.png" "gwy_neural_apply-24.png"; fi
+
+gwy_neural_train-24.png: $(srcdir)/src/gwy_neural_train-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_neural_train-24.png" --file="$(srcdir)/src/gwy_neural_train-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_neural_train-24.png" "gwy_neural_train-24.crush.png"
+	if test -s "gwy_neural_train-24.crush.png"; then mv -f "gwy_neural_train-24.crush.png" "gwy_neural_train-24.png"; fi
+
+gwy_next-24.png: $(srcdir)/src/gwy_next-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_next-24.png" --file="$(srcdir)/src/gwy_next-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_next-24.png" "gwy_next-24.crush.png"
+	if test -s "gwy_next-24.crush.png"; then mv -f "gwy_next-24.crush.png" "gwy_next-24.png"; fi
+
+gwy_null_offsets-24.png: $(srcdir)/src/gwy_null_offsets-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_null_offsets-24.png" --file="$(srcdir)/src/gwy_null_offsets-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_null_offsets-24.png" "gwy_null_offsets-24.crush.png"
+	if test -s "gwy_null_offsets-24.crush.png"; then mv -f "gwy_null_offsets-24.crush.png" "gwy_null_offsets-24.png"; fi
+
+gwy_palettes-16.png: $(srcdir)/src/gwy_palettes-16.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=16 --export-height=16 --export-png="gwy_palettes-16.png" --file="$(srcdir)/src/gwy_palettes-16.svg"
+	$(PNGCRUSH) -q -brute "gwy_palettes-16.png" "gwy_palettes-16.crush.png"
+	if test -s "gwy_palettes-16.crush.png"; then mv -f "gwy_palettes-16.crush.png" "gwy_palettes-16.png"; fi
+
+gwy_palettes-24.png: $(srcdir)/src/gwy_palettes-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_palettes-24.png" --file="$(srcdir)/src/gwy_palettes-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_palettes-24.png" "gwy_palettes-24.crush.png"
+	if test -s "gwy_palettes-24.crush.png"; then mv -f "gwy_palettes-24.crush.png" "gwy_palettes-24.png"; fi
+
+gwy_path_level-24.png: $(srcdir)/src/gwy_path_level-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_path_level-24.png" --file="$(srcdir)/src/gwy_path_level-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_path_level-24.png" "gwy_path_level-24.crush.png"
+	if test -s "gwy_path_level-24.crush.png"; then mv -f "gwy_path_level-24.crush.png" "gwy_path_level-24.png"; fi
+
+gwy_pointer_measure-24.png: $(srcdir)/src/gwy_pointer_measure-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_pointer_measure-24.png" --file="$(srcdir)/src/gwy_pointer_measure-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_pointer_measure-24.png" "gwy_pointer_measure-24.crush.png"
+	if test -s "gwy_pointer_measure-24.crush.png"; then mv -f "gwy_pointer_measure-24.crush.png" "gwy_pointer_measure-24.png"; fi
+
+gwy_poly_distort-24.png: $(srcdir)/src/gwy_poly_distort-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_poly_distort-24.png" --file="$(srcdir)/src/gwy_poly_distort-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_poly_distort-24.png" "gwy_poly_distort-24.crush.png"
+	if test -s "gwy_poly_distort-24.crush.png"; then mv -f "gwy_poly_distort-24.crush.png" "gwy_poly_distort-24.png"; fi
+
+gwy_polynom-24.png: $(srcdir)/src/gwy_polynom-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_polynom-24.png" --file="$(srcdir)/src/gwy_polynom-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_polynom-24.png" "gwy_polynom-24.crush.png"
+	if test -s "gwy_polynom-24.crush.png"; then mv -f "gwy_polynom-24.crush.png" "gwy_polynom-24.png"; fi
+
+gwy_polynom_level-24.png: $(srcdir)/src/gwy_polynom_level-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_polynom_level-24.png" --file="$(srcdir)/src/gwy_polynom_level-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_polynom_level-24.png" "gwy_polynom_level-24.crush.png"
+	if test -s "gwy_polynom_level-24.crush.png"; then mv -f "gwy_polynom_level-24.crush.png" "gwy_polynom_level-24.png"; fi
+
+gwy_previous-24.png: $(srcdir)/src/gwy_previous-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_previous-24.png" --file="$(srcdir)/src/gwy_previous-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_previous-24.png" "gwy_previous-24.crush.png"
+	if test -s "gwy_previous-24.crush.png"; then mv -f "gwy_previous-24.crush.png" "gwy_previous-24.png"; fi
+
+gwy_profile-24.png: $(srcdir)/src/gwy_profile-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_profile-24.png" --file="$(srcdir)/src/gwy_profile-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_profile-24.png" "gwy_profile-24.crush.png"
+	if test -s "gwy_profile-24.crush.png"; then mv -f "gwy_profile-24.crush.png" "gwy_profile-24.png"; fi
+
+gwy_pygwy-24.png: $(srcdir)/src/gwy_pygwy-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_pygwy-24.png" --file="$(srcdir)/src/gwy_pygwy-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_pygwy-24.png" "gwy_pygwy-24.crush.png"
+	if test -s "gwy_pygwy-24.crush.png"; then mv -f "gwy_pygwy-24.crush.png" "gwy_pygwy-24.png"; fi
+
+gwy_remove_under_mask-24.png: $(srcdir)/src/gwy_remove_under_mask-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_remove_under_mask-24.png" --file="$(srcdir)/src/gwy_remove_under_mask-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_remove_under_mask-24.png" "gwy_remove_under_mask-24.crush.png"
+	if test -s "gwy_remove_under_mask-24.crush.png"; then mv -f "gwy_remove_under_mask-24.crush.png" "gwy_remove_under_mask-24.png"; fi
+
+gwy_rotate-24.png: $(srcdir)/src/gwy_rotate-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_rotate-24.png" --file="$(srcdir)/src/gwy_rotate-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_rotate-24.png" "gwy_rotate-24.crush.png"
+	if test -s "gwy_rotate-24.crush.png"; then mv -f "gwy_rotate-24.crush.png" "gwy_rotate-24.png"; fi
+
+gwy_rotate_180-24.png: $(srcdir)/src/gwy_rotate_180-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_rotate_180-24.png" --file="$(srcdir)/src/gwy_rotate_180-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_rotate_180-24.png" "gwy_rotate_180-24.crush.png"
+	if test -s "gwy_rotate_180-24.crush.png"; then mv -f "gwy_rotate_180-24.crush.png" "gwy_rotate_180-24.png"; fi
+
+gwy_rotate_3d-24.png: $(srcdir)/src/gwy_rotate_3d-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_rotate_3d-24.png" --file="$(srcdir)/src/gwy_rotate_3d-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_rotate_3d-24.png" "gwy_rotate_3d-24.crush.png"
+	if test -s "gwy_rotate_3d-24.crush.png"; then mv -f "gwy_rotate_3d-24.crush.png" "gwy_rotate_3d-24.png"; fi
+
+gwy_rotate_90_ccw-24.png: $(srcdir)/src/gwy_rotate_90_ccw-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_rotate_90_ccw-24.png" --file="$(srcdir)/src/gwy_rotate_90_ccw-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_rotate_90_ccw-24.png" "gwy_rotate_90_ccw-24.crush.png"
+	if test -s "gwy_rotate_90_ccw-24.crush.png"; then mv -f "gwy_rotate_90_ccw-24.crush.png" "gwy_rotate_90_ccw-24.png"; fi
+
+gwy_rotate_90_cw-24.png: $(srcdir)/src/gwy_rotate_90_cw-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_rotate_90_cw-24.png" --file="$(srcdir)/src/gwy_rotate_90_cw-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_rotate_90_cw-24.png" "gwy_rotate_90_cw-24.crush.png"
+	if test -s "gwy_rotate_90_cw-24.crush.png"; then mv -f "gwy_rotate_90_cw-24.crush.png" "gwy_rotate_90_cw-24.png"; fi
+
+gwy_scale-24.png: $(srcdir)/src/gwy_scale-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_scale-24.png" --file="$(srcdir)/src/gwy_scale-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_scale-24.png" "gwy_scale-24.crush.png"
+	if test -s "gwy_scale-24.crush.png"; then mv -f "gwy_scale-24.crush.png" "gwy_scale-24.png"; fi
+
+gwy_scale_horizontally-24.png: $(srcdir)/src/gwy_scale_horizontally-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_scale_horizontally-24.png" --file="$(srcdir)/src/gwy_scale_horizontally-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_scale_horizontally-24.png" "gwy_scale_horizontally-24.crush.png"
+	if test -s "gwy_scale_horizontally-24.crush.png"; then mv -f "gwy_scale_horizontally-24.crush.png" "gwy_scale_horizontally-24.png"; fi
+
+gwy_scale_vertically-24.png: $(srcdir)/src/gwy_scale_vertically-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_scale_vertically-24.png" --file="$(srcdir)/src/gwy_scale_vertically-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_scale_vertically-24.png" "gwy_scale_vertically-24.crush.png"
+	if test -s "gwy_scale_vertically-24.crush.png"; then mv -f "gwy_scale_vertically-24.crush.png" "gwy_scale_vertically-24.png"; fi
+
+gwy_scars-24.png: $(srcdir)/src/gwy_scars-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_scars-24.png" --file="$(srcdir)/src/gwy_scars-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_scars-24.png" "gwy_scars-24.crush.png"
+	if test -s "gwy_scars-24.crush.png"; then mv -f "gwy_scars-24.crush.png" "gwy_scars-24.png"; fi
+
+gwy_selections-24.png: $(srcdir)/src/gwy_selections-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_selections-24.png" --file="$(srcdir)/src/gwy_selections-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_selections-24.png" "gwy_selections-24.crush.png"
+	if test -s "gwy_selections-24.crush.png"; then mv -f "gwy_selections-24.crush.png" "gwy_selections-24.png"; fi
+
+gwy_shader-24.png: $(srcdir)/src/gwy_shader-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_shader-24.png" --file="$(srcdir)/src/gwy_shader-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_shader-24.png" "gwy_shader-24.crush.png"
+	if test -s "gwy_shader-24.crush.png"; then mv -f "gwy_shader-24.crush.png" "gwy_shader-24.png"; fi
+
+gwy_spectrum-24.png: $(srcdir)/src/gwy_spectrum-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_spectrum-24.png" --file="$(srcdir)/src/gwy_spectrum-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_spectrum-24.png" "gwy_spectrum-24.crush.png"
+	if test -s "gwy_spectrum-24.crush.png"; then mv -f "gwy_spectrum-24.crush.png" "gwy_spectrum-24.png"; fi
+
+gwy_spot_remove-24.png: $(srcdir)/src/gwy_spot_remove-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_spot_remove-24.png" --file="$(srcdir)/src/gwy_spot_remove-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_spot_remove-24.png" "gwy_spot_remove-24.crush.png"
+	if test -s "gwy_spot_remove-24.crush.png"; then mv -f "gwy_spot_remove-24.crush.png" "gwy_spot_remove-24.png"; fi
+
+gwy_stat_quantities-24.png: $(srcdir)/src/gwy_stat_quantities-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_stat_quantities-24.png" --file="$(srcdir)/src/gwy_stat_quantities-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_stat_quantities-24.png" "gwy_stat_quantities-24.crush.png"
+	if test -s "gwy_stat_quantities-24.crush.png"; then mv -f "gwy_stat_quantities-24.crush.png" "gwy_stat_quantities-24.png"; fi
+
+gwy_straighten_path-24.png: $(srcdir)/src/gwy_straighten_path-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_straighten_path-24.png" --file="$(srcdir)/src/gwy_straighten_path-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_straighten_path-24.png" "gwy_straighten_path-24.crush.png"
+	if test -s "gwy_straighten_path-24.crush.png"; then mv -f "gwy_straighten_path-24.crush.png" "gwy_straighten_path-24.png"; fi
+
+gwy_subscript-20.png: $(srcdir)/src/gwy_subscript-20.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=20 --export-height=20 --export-png="gwy_subscript-20.png" --file="$(srcdir)/src/gwy_subscript-20.svg"
+	$(PNGCRUSH) -q -brute "gwy_subscript-20.png" "gwy_subscript-20.crush.png"
+	if test -s "gwy_subscript-20.crush.png"; then mv -f "gwy_subscript-20.crush.png" "gwy_subscript-20.png"; fi
+
+gwy_superscript-20.png: $(srcdir)/src/gwy_superscript-20.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=20 --export-height=20 --export-png="gwy_superscript-20.png" --file="$(srcdir)/src/gwy_superscript-20.svg"
+	$(PNGCRUSH) -q -brute "gwy_superscript-20.png" "gwy_superscript-20.crush.png"
+	if test -s "gwy_superscript-20.crush.png"; then mv -f "gwy_superscript-20.crush.png" "gwy_superscript-20.png"; fi
+
+gwy_synthetic_ballistic_deposition-24.png: $(srcdir)/src/gwy_synthetic_ballistic_deposition-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_ballistic_deposition-24.png" --file="$(srcdir)/src/gwy_synthetic_ballistic_deposition-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_synthetic_ballistic_deposition-24.png" "gwy_synthetic_ballistic_deposition-24.crush.png"
+	if test -s "gwy_synthetic_ballistic_deposition-24.crush.png"; then mv -f "gwy_synthetic_ballistic_deposition-24.crush.png" "gwy_synthetic_ballistic_deposition-24.png"; fi
+
+gwy_synthetic_brownian_motion-24.png: $(srcdir)/src/gwy_synthetic_brownian_motion-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_brownian_motion-24.png" --file="$(srcdir)/src/gwy_synthetic_brownian_motion-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_synthetic_brownian_motion-24.png" "gwy_synthetic_brownian_motion-24.crush.png"
+	if test -s "gwy_synthetic_brownian_motion-24.crush.png"; then mv -f "gwy_synthetic_brownian_motion-24.crush.png" "gwy_synthetic_brownian_motion-24.png"; fi
+
+gwy_synthetic_columnar-24.png: $(srcdir)/src/gwy_synthetic_columnar-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_columnar-24.png" --file="$(srcdir)/src/gwy_synthetic_columnar-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_synthetic_columnar-24.png" "gwy_synthetic_columnar-24.crush.png"
+	if test -s "gwy_synthetic_columnar-24.crush.png"; then mv -f "gwy_synthetic_columnar-24.crush.png" "gwy_synthetic_columnar-24.png"; fi
+
+gwy_synthetic_diffusion-24.png: $(srcdir)/src/gwy_synthetic_diffusion-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_diffusion-24.png" --file="$(srcdir)/src/gwy_synthetic_diffusion-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_synthetic_diffusion-24.png" "gwy_synthetic_diffusion-24.crush.png"
+	if test -s "gwy_synthetic_diffusion-24.crush.png"; then mv -f "gwy_synthetic_diffusion-24.crush.png" "gwy_synthetic_diffusion-24.png"; fi
+
+gwy_synthetic_domains-24.png: $(srcdir)/src/gwy_synthetic_domains-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_domains-24.png" --file="$(srcdir)/src/gwy_synthetic_domains-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_synthetic_domains-24.png" "gwy_synthetic_domains-24.crush.png"
+	if test -s "gwy_synthetic_domains-24.crush.png"; then mv -f "gwy_synthetic_domains-24.crush.png" "gwy_synthetic_domains-24.png"; fi
+
+gwy_synthetic_fibres-24.png: $(srcdir)/src/gwy_synthetic_fibres-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_fibres-24.png" --file="$(srcdir)/src/gwy_synthetic_fibres-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_synthetic_fibres-24.png" "gwy_synthetic_fibres-24.crush.png"
+	if test -s "gwy_synthetic_fibres-24.crush.png"; then mv -f "gwy_synthetic_fibres-24.crush.png" "gwy_synthetic_fibres-24.png"; fi
+
+gwy_synthetic_lattice-24.png: $(srcdir)/src/gwy_synthetic_lattice-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_lattice-24.png" --file="$(srcdir)/src/gwy_synthetic_lattice-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_synthetic_lattice-24.png" "gwy_synthetic_lattice-24.crush.png"
+	if test -s "gwy_synthetic_lattice-24.crush.png"; then mv -f "gwy_synthetic_lattice-24.crush.png" "gwy_synthetic_lattice-24.png"; fi
+
+gwy_synthetic_line_noise-24.png: $(srcdir)/src/gwy_synthetic_line_noise-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_line_noise-24.png" --file="$(srcdir)/src/gwy_synthetic_line_noise-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_synthetic_line_noise-24.png" "gwy_synthetic_line_noise-24.crush.png"
+	if test -s "gwy_synthetic_line_noise-24.crush.png"; then mv -f "gwy_synthetic_line_noise-24.crush.png" "gwy_synthetic_line_noise-24.png"; fi
+
+gwy_synthetic_noise-24.png: $(srcdir)/src/gwy_synthetic_noise-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_noise-24.png" --file="$(srcdir)/src/gwy_synthetic_noise-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_synthetic_noise-24.png" "gwy_synthetic_noise-24.crush.png"
+	if test -s "gwy_synthetic_noise-24.crush.png"; then mv -f "gwy_synthetic_noise-24.crush.png" "gwy_synthetic_noise-24.png"; fi
+
+gwy_synthetic_objects-24.png: $(srcdir)/src/gwy_synthetic_objects-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_objects-24.png" --file="$(srcdir)/src/gwy_synthetic_objects-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_synthetic_objects-24.png" "gwy_synthetic_objects-24.crush.png"
+	if test -s "gwy_synthetic_objects-24.crush.png"; then mv -f "gwy_synthetic_objects-24.crush.png" "gwy_synthetic_objects-24.png"; fi
+
+gwy_synthetic_particles-24.png: $(srcdir)/src/gwy_synthetic_particles-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_particles-24.png" --file="$(srcdir)/src/gwy_synthetic_particles-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_synthetic_particles-24.png" "gwy_synthetic_particles-24.crush.png"
+	if test -s "gwy_synthetic_particles-24.crush.png"; then mv -f "gwy_synthetic_particles-24.crush.png" "gwy_synthetic_particles-24.png"; fi
+
+gwy_synthetic_pattern-24.png: $(srcdir)/src/gwy_synthetic_pattern-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_pattern-24.png" --file="$(srcdir)/src/gwy_synthetic_pattern-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_synthetic_pattern-24.png" "gwy_synthetic_pattern-24.crush.png"
+	if test -s "gwy_synthetic_pattern-24.crush.png"; then mv -f "gwy_synthetic_pattern-24.crush.png" "gwy_synthetic_pattern-24.png"; fi
+
+gwy_synthetic_phases-24.png: $(srcdir)/src/gwy_synthetic_phases-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_phases-24.png" --file="$(srcdir)/src/gwy_synthetic_phases-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_synthetic_phases-24.png" "gwy_synthetic_phases-24.crush.png"
+	if test -s "gwy_synthetic_phases-24.crush.png"; then mv -f "gwy_synthetic_phases-24.crush.png" "gwy_synthetic_phases-24.png"; fi
+
+gwy_synthetic_spectral-24.png: $(srcdir)/src/gwy_synthetic_spectral-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_spectral-24.png" --file="$(srcdir)/src/gwy_synthetic_spectral-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_synthetic_spectral-24.png" "gwy_synthetic_spectral-24.crush.png"
+	if test -s "gwy_synthetic_spectral-24.crush.png"; then mv -f "gwy_synthetic_spectral-24.crush.png" "gwy_synthetic_spectral-24.png"; fi
+
+gwy_synthetic_waves-24.png: $(srcdir)/src/gwy_synthetic_waves-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_waves-24.png" --file="$(srcdir)/src/gwy_synthetic_waves-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_synthetic_waves-24.png" "gwy_synthetic_waves-24.crush.png"
+	if test -s "gwy_synthetic_waves-24.crush.png"; then mv -f "gwy_synthetic_waves-24.crush.png" "gwy_synthetic_waves-24.png"; fi
+
+gwy_tilt-24.png: $(srcdir)/src/gwy_tilt-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tilt-24.png" --file="$(srcdir)/src/gwy_tilt-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_tilt-24.png" "gwy_tilt-24.crush.png"
+	if test -s "gwy_tilt-24.crush.png"; then mv -f "gwy_tilt-24.crush.png" "gwy_tilt-24.png"; fi
+
+gwy_tip_dilation-24.png: $(srcdir)/src/gwy_tip_dilation-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tip_dilation-24.png" --file="$(srcdir)/src/gwy_tip_dilation-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_tip_dilation-24.png" "gwy_tip_dilation-24.crush.png"
+	if test -s "gwy_tip_dilation-24.crush.png"; then mv -f "gwy_tip_dilation-24.crush.png" "gwy_tip_dilation-24.png"; fi
+
+gwy_tip_erosion-24.png: $(srcdir)/src/gwy_tip_erosion-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tip_erosion-24.png" --file="$(srcdir)/src/gwy_tip_erosion-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_tip_erosion-24.png" "gwy_tip_erosion-24.crush.png"
+	if test -s "gwy_tip_erosion-24.crush.png"; then mv -f "gwy_tip_erosion-24.crush.png" "gwy_tip_erosion-24.png"; fi
+
+gwy_tip_estimation-24.png: $(srcdir)/src/gwy_tip_estimation-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tip_estimation-24.png" --file="$(srcdir)/src/gwy_tip_estimation-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_tip_estimation-24.png" "gwy_tip_estimation-24.crush.png"
+	if test -s "gwy_tip_estimation-24.crush.png"; then mv -f "gwy_tip_estimation-24.crush.png" "gwy_tip_estimation-24.png"; fi
+
+gwy_tip_indent_analyze-24.png: $(srcdir)/src/gwy_tip_indent_analyze-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tip_indent_analyze-24.png" --file="$(srcdir)/src/gwy_tip_indent_analyze-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_tip_indent_analyze-24.png" "gwy_tip_indent_analyze-24.crush.png"
+	if test -s "gwy_tip_indent_analyze-24.crush.png"; then mv -f "gwy_tip_indent_analyze-24.crush.png" "gwy_tip_indent_analyze-24.png"; fi
+
+gwy_tip_lateral_force-24.png: $(srcdir)/src/gwy_tip_lateral_force-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tip_lateral_force-24.png" --file="$(srcdir)/src/gwy_tip_lateral_force-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_tip_lateral_force-24.png" "gwy_tip_lateral_force-24.crush.png"
+	if test -s "gwy_tip_lateral_force-24.crush.png"; then mv -f "gwy_tip_lateral_force-24.crush.png" "gwy_tip_lateral_force-24.png"; fi
+
+gwy_tip_map-24.png: $(srcdir)/src/gwy_tip_map-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tip_map-24.png" --file="$(srcdir)/src/gwy_tip_map-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_tip_map-24.png" "gwy_tip_map-24.crush.png"
+	if test -s "gwy_tip_map-24.crush.png"; then mv -f "gwy_tip_map-24.crush.png" "gwy_tip_map-24.png"; fi
+
+gwy_tip_model-24.png: $(srcdir)/src/gwy_tip_model-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tip_model-24.png" --file="$(srcdir)/src/gwy_tip_model-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_tip_model-24.png" "gwy_tip_model-24.crush.png"
+	if test -s "gwy_tip_model-24.crush.png"; then mv -f "gwy_tip_model-24.crush.png" "gwy_tip_model-24.png"; fi
+
+gwy_tip_pid-24.png: $(srcdir)/src/gwy_tip_pid-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tip_pid-24.png" --file="$(srcdir)/src/gwy_tip_pid-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_tip_pid-24.png" "gwy_tip_pid-24.crush.png"
+	if test -s "gwy_tip_pid-24.crush.png"; then mv -f "gwy_tip_pid-24.crush.png" "gwy_tip_pid-24.png"; fi
+
+gwy_unrotate-24.png: $(srcdir)/src/gwy_unrotate-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_unrotate-24.png" --file="$(srcdir)/src/gwy_unrotate-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_unrotate-24.png" "gwy_unrotate-24.crush.png"
+	if test -s "gwy_unrotate-24.crush.png"; then mv -f "gwy_unrotate-24.crush.png" "gwy_unrotate-24.png"; fi
+
+gwy_value_invert-24.png: $(srcdir)/src/gwy_value_invert-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_value_invert-24.png" --file="$(srcdir)/src/gwy_value_invert-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_value_invert-24.png" "gwy_value_invert-24.crush.png"
+	if test -s "gwy_value_invert-24.crush.png"; then mv -f "gwy_value_invert-24.crush.png" "gwy_value_invert-24.png"; fi
+
+gwy_volume-24.png: $(srcdir)/src/gwy_volume-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volume-24.png" --file="$(srcdir)/src/gwy_volume-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_volume-24.png" "gwy_volume-24.crush.png"
+	if test -s "gwy_volume-24.crush.png"; then mv -f "gwy_volume-24.crush.png" "gwy_volume-24.png"; fi
+
+gwy_volume_calibrate-24.png: $(srcdir)/src/gwy_volume_calibrate-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volume_calibrate-24.png" --file="$(srcdir)/src/gwy_volume_calibrate-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_volume_calibrate-24.png" "gwy_volume_calibrate-24.crush.png"
+	if test -s "gwy_volume_calibrate-24.crush.png"; then mv -f "gwy_volume_calibrate-24.crush.png" "gwy_volume_calibrate-24.png"; fi
+
+gwy_volume_dimensions-24.png: $(srcdir)/src/gwy_volume_dimensions-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volume_dimensions-24.png" --file="$(srcdir)/src/gwy_volume_dimensions-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_volume_dimensions-24.png" "gwy_volume_dimensions-24.crush.png"
+	if test -s "gwy_volume_dimensions-24.crush.png"; then mv -f "gwy_volume_dimensions-24.crush.png" "gwy_volume_dimensions-24.png"; fi
+
+gwy_volume_fd-24.png: $(srcdir)/src/gwy_volume_fd-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volume_fd-24.png" --file="$(srcdir)/src/gwy_volume_fd-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_volume_fd-24.png" "gwy_volume_fd-24.crush.png"
+	if test -s "gwy_volume_fd-24.crush.png"; then mv -f "gwy_volume_fd-24.crush.png" "gwy_volume_fd-24.png"; fi
+
+gwy_volume_invert-24.png: $(srcdir)/src/gwy_volume_invert-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volume_invert-24.png" --file="$(srcdir)/src/gwy_volume_invert-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_volume_invert-24.png" "gwy_volume_invert-24.crush.png"
+	if test -s "gwy_volume_invert-24.crush.png"; then mv -f "gwy_volume_invert-24.crush.png" "gwy_volume_invert-24.png"; fi
+
+gwy_volume_kmeans-24.png: $(srcdir)/src/gwy_volume_kmeans-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volume_kmeans-24.png" --file="$(srcdir)/src/gwy_volume_kmeans-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_volume_kmeans-24.png" "gwy_volume_kmeans-24.crush.png"
+	if test -s "gwy_volume_kmeans-24.crush.png"; then mv -f "gwy_volume_kmeans-24.crush.png" "gwy_volume_kmeans-24.png"; fi
+
+gwy_volume_kmedians-24.png: $(srcdir)/src/gwy_volume_kmedians-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volume_kmedians-24.png" --file="$(srcdir)/src/gwy_volume_kmedians-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_volume_kmedians-24.png" "gwy_volume_kmedians-24.crush.png"
+	if test -s "gwy_volume_kmedians-24.crush.png"; then mv -f "gwy_volume_kmedians-24.crush.png" "gwy_volume_kmedians-24.png"; fi
+
+gwy_volume_slice-24.png: $(srcdir)/src/gwy_volume_slice-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volume_slice-24.png" --file="$(srcdir)/src/gwy_volume_slice-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_volume_slice-24.png" "gwy_volume_slice-24.crush.png"
+	if test -s "gwy_volume_slice-24.crush.png"; then mv -f "gwy_volume_slice-24.crush.png" "gwy_volume_slice-24.png"; fi
+
+gwy_volumize-24.png: $(srcdir)/src/gwy_volumize-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volumize-24.png" --file="$(srcdir)/src/gwy_volumize-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_volumize-24.png" "gwy_volumize-24.crush.png"
+	if test -s "gwy_volumize-24.crush.png"; then mv -f "gwy_volumize-24.crush.png" "gwy_volumize-24.png"; fi
+
+gwy_volumize_layers-24.png: $(srcdir)/src/gwy_volumize_layers-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volumize_layers-24.png" --file="$(srcdir)/src/gwy_volumize_layers-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_volumize_layers-24.png" "gwy_volumize_layers-24.crush.png"
+	if test -s "gwy_volumize_layers-24.crush.png"; then mv -f "gwy_volumize_layers-24.crush.png" "gwy_volumize_layers-24.png"; fi
+
+gwy_xy_denoise-24.png: $(srcdir)/src/gwy_xy_denoise-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_xy_denoise-24.png" --file="$(srcdir)/src/gwy_xy_denoise-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_xy_denoise-24.png" "gwy_xy_denoise-24.crush.png"
+	if test -s "gwy_xy_denoise-24.crush.png"; then mv -f "gwy_xy_denoise-24.crush.png" "gwy_xy_denoise-24.png"; fi
+
+gwy_zero_mean-24.png: $(srcdir)/src/gwy_zero_mean-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_zero_mean-24.png" --file="$(srcdir)/src/gwy_zero_mean-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_zero_mean-24.png" "gwy_zero_mean-24.crush.png"
+	if test -s "gwy_zero_mean-24.crush.png"; then mv -f "gwy_zero_mean-24.crush.png" "gwy_zero_mean-24.png"; fi
+
+gwy_zoom_1_1-24.png: $(srcdir)/src/gwy_zoom_1_1-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_zoom_1_1-24.png" --file="$(srcdir)/src/gwy_zoom_1_1-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_zoom_1_1-24.png" "gwy_zoom_1_1-24.crush.png"
+	if test -s "gwy_zoom_1_1-24.crush.png"; then mv -f "gwy_zoom_1_1-24.crush.png" "gwy_zoom_1_1-24.png"; fi
+
+gwy_zoom_fit-24.png: $(srcdir)/src/gwy_zoom_fit-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_zoom_fit-24.png" --file="$(srcdir)/src/gwy_zoom_fit-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_zoom_fit-24.png" "gwy_zoom_fit-24.crush.png"
+	if test -s "gwy_zoom_fit-24.crush.png"; then mv -f "gwy_zoom_fit-24.crush.png" "gwy_zoom_fit-24.png"; fi
+
+gwy_zoom_in-24.png: $(srcdir)/src/gwy_zoom_in-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_zoom_in-24.png" --file="$(srcdir)/src/gwy_zoom_in-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_zoom_in-24.png" "gwy_zoom_in-24.crush.png"
+	if test -s "gwy_zoom_in-24.crush.png"; then mv -f "gwy_zoom_in-24.crush.png" "gwy_zoom_in-24.png"; fi
+
+gwy_zoom_out-24.png: $(srcdir)/src/gwy_zoom_out-24.svg
+	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_zoom_out-24.png" --file="$(srcdir)/src/gwy_zoom_out-24.svg"
+	$(PNGCRUSH) -q -brute "gwy_zoom_out-24.png" "gwy_zoom_out-24.crush.png"
+	if test -s "gwy_zoom_out-24.crush.png"; then mv -f "gwy_zoom_out-24.crush.png" "gwy_zoom_out-24.png"; fi
+# @@@ GENERATED STOCK LIST END @@@
+endif
+
diff --git a/pixmaps/Makefile.in b/pixmaps/Makefile.in
index efa57c7..3a7b18d 100644
--- a/pixmaps/Makefile.in
+++ b/pixmaps/Makefile.in
@@ -14,7 +14,7 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 18961 2016-09-17 07:38:23Z yeti-dn $
+# @(#) $Id: Makefile.am 20261 2017-08-12 09:00:35Z yeti-dn $
 
 VPATH = @srcdir@
 am__is_gnu_make = { \
@@ -123,6 +123,14 @@ am__v_at_0 = @
 am__v_at_1 = 
 SOURCES =
 DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -158,9 +166,61 @@ am__uninstall_files_from_dir = { \
 am__installdirs = "$(DESTDIR)$(icondatadir)" \
 	"$(DESTDIR)$(pixmapdatadir)"
 DATA = $(icondata_DATA) $(pixmapdata_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
 am__DIST_COMMON = $(srcdir)/Makefile.in
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -200,10 +260,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -213,6 +270,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -237,7 +296,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -295,6 +356,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -303,17 +365,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -398,33 +456,10 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+SUBDIRS = src
 pixmapdatadir = $(pkgdatadir)/pixmaps
 icondatadir = $(datadir)/icons/hicolor/48x48/apps
 
-# Present in svn but not included in the tarball now:
-# gwy_hough-24.png
-# gwy_local_slope-24.png
-# gwy_presentation_attach-24.png
-# gwy_presentation_edge_canny-24.png
-# gwy_presentation_edge_harris_corner-24.png
-# gwy_presentation_edge_hough-24.png
-# gwy_presentation_edge_inclination-24.png
-# gwy_presentation_edge_laplace_gauss-24.png
-# gwy_presentation_edge_local_non_linearity-24.png
-# gwy_presentation_edge_prewitt-24.png
-# gwy_presentation_edge_rms_edge-24.png
-# gwy_presentation_edge_rms-24.png
-# gwy_presentation_edge_sobel-24.png
-# gwy_presentation_edge_step-24.png
-# gwy_presentation_edge_zero_crossing-24.png
-# gwy_presentation_extract-24.png
-# gwy_presentation_local_contrast-24.png
-# gwy_presentation_log-24.png
-# gwy_presentation_rank-24.png
-# gwy_presentation_remove-24.png
-# gwy_presentation_sem-24.png
-# gwy_presentation_shading-24.png
-
 # Since 2.3: arithmetic data_measure drift immerse merge
 # Since 2.7: path_level spectrum iso_roughness grains_measure gl_material
 # Since 2.7: color_range_auto color_range_full color_range_fixed
@@ -436,36 +471,59 @@ icondatadir = $(datadir)/icons/hicolor/48x48/apps
 # Since 2.38: synthetic_diffusion
 # Since 2.45: convolution distribution_angle distribution_slope entropy graph_fd fft_filter_2d fft_2d find_peaks grain_correlation grain_exscribed_circle grain_inscribed_circle grains_edge graph_align graph_cut graph_dos graph_export_ascii graph_export_png graph_export_vector graph_filter level_flatten_base level_median load_debug load_info load_warning mask_distribute mask_extract mask_morph mask_thin measure_lattice neural_apply neural_train psdf_log_phi psdf_section synthetic_ballisti [...]
 # Since 2.46: distance_transform extract_path enforce_distribution grains_edge_remove mutual_crop poly_distort straighten_path tip_indent_analyze tip_lateral_force volume_fd volume_kmeans volume_kmedians volume_slice volumize
+# Since 2.48: correlation_mask disconnected fft_filter_1d fit_shape fractal_correction mark_outliers mark_scars null_offsets xy_denoise synthetic_phases
+# Since 2.49: next previous fractal_measure mask_set synthetic_fibres rotate_3d
 #
-# If you add new stock icons here, add them to a `Since' line above and run
-# ./utils/stockgen.py from the top-level directory to update source code
-# declarations.
+# If you add new stock icons here
+# - Add them to a `Since' line above (one Gwyddion version = one line).
+# - If they have source files add them to src/ and if they can be generated
+#   automatically (the usual case) add them to the built_pixmaps.
+# - Run ./utils/stockgen.py from the top-level directory to update the PNG
+#   build rules and source code declarations.
+# - After that the icon should be probably set as the default for some module
+#   or elswhere in the source code.
 pixmapdata_DATA = \
+	$(built_pixmaps) \
 	cd_line.png \
 	cd_rline.png \
 	cd_rstep.png \
 	cd_step.png \
 	circle_down.png \
 	circle_up.png \
+	gwy_drift-24.png \
+	gwy_favourite-24.png \
+	gwy_gl_material-16.png \
+	gwy_gwyddion-32.png \
+	gwy_gwyddion-60.png \
+	gwy_psdf_log_phi-24.png \
+	gwy_psdf_section-24.png \
+	gwyddion.ico \
+	splash.png
+
+icondata_DATA = \
+	gwyddion.png
+
+built_pixmaps = \
 	gwy_3d_base-24.png \
 	gwy_arithmetic-24.png \
 	gwy_bold-20.png \
 	gwy_cantilever-24.png \
+	gwy_color_range-24.png \
 	gwy_color_range_adaptive-24.png \
 	gwy_color_range_auto-24.png \
 	gwy_color_range_fixed-24.png \
 	gwy_color_range_full-24.png \
-	gwy_color_range-24.png \
 	gwy_convolution-24.png \
 	gwy_correct_affine-24.png \
+	gwy_correlation_mask-24.png \
 	gwy_crop-24.png \
 	gwy_cwt-24.png \
 	gwy_data_measure-24.png \
+	gwy_disconnected-24.png \
 	gwy_distance-24.png \
 	gwy_distance_transform-24.png \
 	gwy_distribution_angle-24.png \
 	gwy_distribution_slope-24.png \
-	gwy_drift-24.png \
 	gwy_dwt-24.png \
 	gwy_edge-24.png \
 	gwy_enforce_distribution-24.png \
@@ -474,28 +532,33 @@ pixmapdata_DATA = \
 	gwy_extract_path-24.png \
 	gwy_facet_level-24.png \
 	gwy_favourite-24.png \
-	gwy_fft_filter_2d-24.png \
 	gwy_fft-24.png \
 	gwy_fft_2d-24.png \
+	gwy_fft_filter_1d-24.png \
+	gwy_fft_filter_2d-24.png \
 	gwy_filter-24.png \
 	gwy_find_peaks-24.png \
+	gwy_fit_shape-24.png \
 	gwy_fix_zero-24.png \
 	gwy_flip_horizontally-24.png \
 	gwy_flip_vertically-24.png \
 	gwy_fractal-24.png \
+	gwy_fractal_measure-24.png \
+	gwy_fractal_correction-24.png \
 	gwy_gl_material-16.png \
 	gwy_gradient_horizontal-24.png \
 	gwy_gradient_vertical-24.png \
 	gwy_grain_correlation-24.png \
 	gwy_grain_exscribed_circle-24.png \
 	gwy_grain_inscribed_circle-24.png \
+	gwy_grains-24.png \
 	gwy_grains_edge-24.png \
 	gwy_grains_edge_remove-24.png \
 	gwy_grains_graph-24.png \
 	gwy_grains_measure-24.png \
 	gwy_grains_remove-24.png \
 	gwy_grains_water-24.png \
-	gwy_grains-24.png \
+	gwy_graph-24.png \
 	gwy_graph_align-24.png \
 	gwy_graph_cut-24.png \
 	gwy_graph_dos-24.png \
@@ -515,18 +578,15 @@ pixmapdata_DATA = \
 	gwy_graph_zoom_fit-24.png \
 	gwy_graph_zoom_in-24.png \
 	gwy_graph_zoom_out-24.png \
-	gwy_graph-24.png \
-	gwy_gwyddion-32.png \
-	gwy_gwyddion-60.png \
 	gwy_hough-24.png \
 	gwy_immerse-24.png \
 	gwy_iso_roughness-24.png \
 	gwy_italic-20.png \
 	gwy_less-24.png \
+	gwy_level-24.png \
 	gwy_level_flatten_base-24.png \
 	gwy_level_median-24.png \
 	gwy_level_triangle-24.png \
-	gwy_level-24.png \
 	gwy_light_rotate-24.png \
 	gwy_line_level-24.png \
 	gwy_load_debug-20.png \
@@ -535,15 +595,19 @@ pixmapdata_DATA = \
 	gwy_local_slope-24.png \
 	gwy_logscale_horizontal-24.png \
 	gwy_logscale_vertical-24.png \
+	gwy_mark_outliers-24.png \
+	gwy_mark_scars-24.png \
 	gwy_mark_with-24.png \
+	gwy_mask-16.png \
+	gwy_mask-24.png \
 	gwy_mask_add-24.png \
+	gwy_mask_circle-24.png \
 	gwy_mask_circle_exclusive-24.png \
 	gwy_mask_circle_inclusive-24.png \
-	gwy_mask_circle-24.png \
 	gwy_mask_distribute-24.png \
 	gwy_mask_editor-24.png \
-	gwy_mask_exclude_circle-24.png \
 	gwy_mask_exclude-24.png \
+	gwy_mask_exclude_circle-24.png \
 	gwy_mask_extract-24.png \
 	gwy_mask_fill_draw-24.png \
 	gwy_mask_fill_erase-24.png \
@@ -557,36 +621,37 @@ pixmapdata_DATA = \
 	gwy_mask_rect_exclusive-24.png \
 	gwy_mask_rect_inclusive-24.png \
 	gwy_mask_remove-24.png \
+	gwy_mask_set-24.png \
 	gwy_mask_shrink-24.png \
 	gwy_mask_subtract-24.png \
 	gwy_mask_thin-24.png \
-	gwy_mask-16.png \
-	gwy_mask-24.png \
 	gwy_measure_lattice-24.png \
 	gwy_merge-24.png \
 	gwy_more-24.png \
 	gwy_mutual_crop-24.png \
 	gwy_neural_apply-24.png \
 	gwy_neural_train-24.png \
+	gwy_next-24.png \
+	gwy_null_offsets-24.png \
 	gwy_palettes-16.png \
 	gwy_palettes-24.png \
 	gwy_path_level-24.png \
 	gwy_pointer_measure-24.png \
 	gwy_poly_distort-24.png \
-	gwy_polynom_level-24.png \
 	gwy_polynom-24.png \
+	gwy_polynom_level-24.png \
+	gwy_previous-24.png \
 	gwy_profile-24.png \
-	gwy_psdf_log_phi-24.png \
-	gwy_psdf_section-24.png \
 	gwy_pygwy-24.png \
 	gwy_remove_under_mask-24.png \
 	gwy_rotate_180-24.png \
+	gwy_rotate_3d-24.png \
+	gwy_rotate-24.png \
 	gwy_rotate_90_ccw-24.png \
 	gwy_rotate_90_cw-24.png \
-	gwy_rotate-24.png \
+	gwy_scale-24.png \
 	gwy_scale_horizontally-24.png \
 	gwy_scale_vertically-24.png \
-	gwy_scale-24.png \
 	gwy_scars-24.png \
 	gwy_selections-24.png \
 	gwy_shader-24.png \
@@ -601,12 +666,14 @@ pixmapdata_DATA = \
 	gwy_synthetic_columnar-24.png \
 	gwy_synthetic_diffusion-24.png \
 	gwy_synthetic_domains-24.png \
+	gwy_synthetic_fibres-24.png \
 	gwy_synthetic_lattice-24.png \
 	gwy_synthetic_line_noise-24.png \
 	gwy_synthetic_noise-24.png \
 	gwy_synthetic_objects-24.png \
 	gwy_synthetic_particles-24.png \
 	gwy_synthetic_pattern-24.png \
+	gwy_synthetic_phases-24.png \
 	gwy_synthetic_spectral-24.png \
 	gwy_synthetic_waves-24.png \
 	gwy_tilt-24.png \
@@ -630,95 +697,41 @@ pixmapdata_DATA = \
 	gwy_volume_slice-24.png \
 	gwy_volumize-24.png \
 	gwy_volumize_layers-24.png \
+	gwy_xy_denoise-24.png \
 	gwy_zero_mean-24.png \
 	gwy_zoom_1_1-24.png \
 	gwy_zoom_fit-24.png \
 	gwy_zoom_in-24.png \
-	gwy_zoom_out-24.png \
-	gwyddion.ico \
-	splash.png
+	gwy_zoom_out-24.png
 
-icondata_DATA = \
-	gwyddion.png
+INKSCAPE_RENDER_PNG = $(INKSCAPE) --without-gui --export-area-page
 
+# Not built automatically:
+# gwy_drift-24.png - must render to 96x96 first, then downsize due to
+#                    Inkscape gradient mesh issues
+#
+# cd_line.png
+# cd_rline.png
+# cd_rstep.png
+# cd_step.png
+# circle_down.png
+# circle_up.png - no SVG
+#
+# gwy_psdf_log_phi-24.png
+# gwy_psdf_section-24.png
+#
+# gwy_gwyddion-32.png
+# gwy_gwyddion-60.png - no SVG
 
 # Note: splash screen source is too big to distribute in every tarball,
 # check it out from Subversion
-xcf_sources = \
-	cd_line.xcf \
-	cd_rline.xcf \
-	cd_rstep.xcf \
-	cd_step.xcf \
-	gwy_3d_base-24.xcf \
-	gwy_arithmetic-24.xcf \
-	gwy_cantilever-24.xcf \
-	gwy_color_range-24.xcf \
-	gwy_crop-24.xcf \
-	gwy_direction-24.xcf \
-	gwy_edge-24.xcf \
-	gwy_extract_path-24.xcf \
-	gwy_favourite-24.xcf \
-	gwy_fft-24.xcf \
-	gwy_filter-24.xcf \
-	gwy_flip_horizontally-24.xcf \
-	gwy_flip_vertically-24.xcf \
-	gwy_gl_material-16.xcf \
-	gwy_gradient-24.xcf \
-	gwy_grains-24.xcf \
-	gwy_graph-24.xcf \
-	gwy_graph_zoom-24.xcf \
-	gwy_iso_roughness-24.xcf \
-	gwy_less-24.xcf \
-	gwy_level-24.xcf \
-	gwy_light_rotate-24.xcf \
-	gwy_load_message-20.xcf \
-	gwy_markup-20.xcf \
-	gwy_mask-16.xcf \
-	gwy_mask-24.xcf \
-	gwy_measure-24.xcf \
-	gwy_more-24.xcf \
-	gwy_palette-24.xcf \
-	gwy_palettes-16.xcf \
-	gwy_polynom-24.xcf \
-	gwy_presentation-24.xcf \
-	gwy_presentation_ops-24.xcf \
-	gwy_profile-24.xcf \
-	gwy_pygwy-24.xcf \
-	gwy_remove_under_mask-24.xcf \
-	gwy_rotate-24.xcf \
-	gwy_rotate_180-24.xcf \
-	gwy_rotate_90_ccw-24.xcf \
-	gwy_rotate_90_cw-24.xcf \
-	gwy_scale-24.xcf \
-	gwy_scale_horizontally-24.xcf \
-	gwy_scale_vertically-24.xcf \
-	gwy_selection-24.xcf \
-	gwy_shader-24.xcf \
-	gwy_spectrum-24.xcf \
-	gwy_spot_remove-24.xcf \
-	gwy_stat_quantities-24.xcf \
-	gwy_stats-24.xcf \
-	gwy_synthetic-24.xcf \
-	gwy_tip-24.xcf \
-	gwy_transform-24.xcf \
-	gwy_unrotate-24.xcf \
-	gwy_value_invert-24.xcf \
-	gwy_zoom-24.xcf
-
-svg_sources = \
-	gwy_path.svg \
-	gwy_neural.svg \
-	gwy_poly_distort.svg \
-	gwy_volume.svg
-
 EXTRA_DIST = \
 	gwyddion.icns \
 	$(icondata_DATA) \
-	$(pixmapdata_DATA) \
-	$(xcf_sources) \
-	$(svg_sources)
+	$(pixmapdata_DATA)
 
-all: all-am
+MAINTAINERCLEANFILES = $(built_pixmaps)
+all: all-recursive
 
 .SUFFIXES:
 $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
@@ -798,12 +811,105 @@ uninstall-pixmapdataDATA:
 	@list='$(pixmapdata_DATA)'; test -n "$(pixmapdatadir)" || list=; \
 	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
 	dir='$(DESTDIR)$(pixmapdatadir)'; $(am__uninstall_files_from_dir)
-tags TAGS:
 
-ctags CTAGS:
-
-cscope cscopelist:
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
 
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
 	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -835,22 +941,48 @@ distdir: $(DISTFILES)
 	    || exit 1; \
 	  fi; \
 	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
 check-am: all-am
-check: check-am
+check: check-recursive
 all-am: Makefile $(DATA)
-installdirs:
+installdirs: installdirs-recursive
+installdirs-am:
 	for dir in "$(DESTDIR)$(icondatadir)" "$(DESTDIR)$(pixmapdatadir)"; do \
 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
 
 install-am: all-am
 	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
 
-installcheck: installcheck-am
+installcheck: installcheck-recursive
 install-strip:
 	if test -z '$(STRIP)'; then \
 	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
@@ -872,90 +1004,1096 @@ distclean-generic:
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-recursive
 
 clean-am: clean-generic clean-libtool mostlyclean-am
 
-distclean: distclean-am
+distclean: distclean-recursive
 	-rm -f Makefile
-distclean-am: clean-am distclean-generic
+distclean-am: clean-am distclean-generic distclean-tags
 
-dvi: dvi-am
+dvi: dvi-recursive
 
 dvi-am:
 
-html: html-am
+html: html-recursive
 
 html-am:
 
-info: info-am
+info: info-recursive
 
 info-am:
 
 install-data-am: install-icondataDATA install-pixmapdataDATA
 
-install-dvi: install-dvi-am
+install-dvi: install-dvi-recursive
 
 install-dvi-am:
 
 install-exec-am:
 
-install-html: install-html-am
+install-html: install-html-recursive
 
 install-html-am:
 
-install-info: install-info-am
+install-info: install-info-recursive
 
 install-info-am:
 
 install-man:
 
-install-pdf: install-pdf-am
+install-pdf: install-pdf-recursive
 
 install-pdf-am:
 
-install-ps: install-ps-am
+install-ps: install-ps-recursive
 
 install-ps-am:
 
 installcheck-am:
 
-maintainer-clean: maintainer-clean-am
+maintainer-clean: maintainer-clean-recursive
 	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
-mostlyclean: mostlyclean-am
+mostlyclean: mostlyclean-recursive
 
 mostlyclean-am: mostlyclean-generic mostlyclean-libtool
 
-pdf: pdf-am
+pdf: pdf-recursive
 
 pdf-am:
 
-ps: ps-am
+ps: ps-recursive
 
 ps-am:
 
 uninstall-am: uninstall-icondataDATA uninstall-pixmapdataDATA
 
-.MAKE: install-am install-strip
+.MAKE: $(am__recursive_targets) install-am install-strip
 
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	cscopelist-am ctags-am distclean distclean-generic \
-	distclean-libtool distdir dvi dvi-am html html-am info info-am \
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+	check-am clean clean-generic clean-libtool cscopelist-am ctags \
+	ctags-am distclean distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
 	install install-am install-data install-data-am install-dvi \
 	install-dvi-am install-exec install-exec-am install-html \
 	install-html-am install-icondataDATA install-info \
 	install-info-am install-man install-pdf install-pdf-am \
 	install-pixmapdataDATA install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
-	uninstall-am uninstall-icondataDATA uninstall-pixmapdataDATA
+	installcheck installcheck-am installdirs installdirs-am \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am uninstall-icondataDATA \
+	uninstall-pixmapdataDATA
 
 .PRECIOUS: Makefile
 
 
+list-icons:
+	@echo ICONLIST $(pixmapdata_DATA)
+
+list-built-icons:
+	@echo ICONLIST $(built_pixmaps)
+
+# @@@ GENERATED STOCK LIST BEGIN @@@
+ at MAINTAINER_MODE_TRUE@gwy_3d_base-24.png: $(srcdir)/src/gwy_3d_base-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_3d_base-24.png" --file="$(srcdir)/src/gwy_3d_base-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_3d_base-24.png" "gwy_3d_base-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_3d_base-24.crush.png"; then mv -f "gwy_3d_base-24.crush.png" "gwy_3d_base-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_arithmetic-24.png: $(srcdir)/src/gwy_arithmetic-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_arithmetic-24.png" --file="$(srcdir)/src/gwy_arithmetic-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_arithmetic-24.png" "gwy_arithmetic-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_arithmetic-24.crush.png"; then mv -f "gwy_arithmetic-24.crush.png" "gwy_arithmetic-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_bold-20.png: $(srcdir)/src/gwy_bold-20.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=20 --export-height=20 --export-png="gwy_bold-20.png" --file="$(srcdir)/src/gwy_bold-20.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_bold-20.png" "gwy_bold-20.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_bold-20.crush.png"; then mv -f "gwy_bold-20.crush.png" "gwy_bold-20.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_cantilever-24.png: $(srcdir)/src/gwy_cantilever-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_cantilever-24.png" --file="$(srcdir)/src/gwy_cantilever-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_cantilever-24.png" "gwy_cantilever-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_cantilever-24.crush.png"; then mv -f "gwy_cantilever-24.crush.png" "gwy_cantilever-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_color_range-24.png: $(srcdir)/src/gwy_color_range-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_color_range-24.png" --file="$(srcdir)/src/gwy_color_range-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_color_range-24.png" "gwy_color_range-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_color_range-24.crush.png"; then mv -f "gwy_color_range-24.crush.png" "gwy_color_range-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_color_range_adaptive-24.png: $(srcdir)/src/gwy_color_range_adaptive-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_color_range_adaptive-24.png" --file="$(srcdir)/src/gwy_color_range_adaptive-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_color_range_adaptive-24.png" "gwy_color_range_adaptive-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_color_range_adaptive-24.crush.png"; then mv -f "gwy_color_range_adaptive-24.crush.png" "gwy_color_range_adaptive-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_color_range_auto-24.png: $(srcdir)/src/gwy_color_range_auto-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_color_range_auto-24.png" --file="$(srcdir)/src/gwy_color_range_auto-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_color_range_auto-24.png" "gwy_color_range_auto-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_color_range_auto-24.crush.png"; then mv -f "gwy_color_range_auto-24.crush.png" "gwy_color_range_auto-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_color_range_fixed-24.png: $(srcdir)/src/gwy_color_range_fixed-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_color_range_fixed-24.png" --file="$(srcdir)/src/gwy_color_range_fixed-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_color_range_fixed-24.png" "gwy_color_range_fixed-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_color_range_fixed-24.crush.png"; then mv -f "gwy_color_range_fixed-24.crush.png" "gwy_color_range_fixed-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_color_range_full-24.png: $(srcdir)/src/gwy_color_range_full-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_color_range_full-24.png" --file="$(srcdir)/src/gwy_color_range_full-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_color_range_full-24.png" "gwy_color_range_full-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_color_range_full-24.crush.png"; then mv -f "gwy_color_range_full-24.crush.png" "gwy_color_range_full-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_convolution-24.png: $(srcdir)/src/gwy_convolution-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_convolution-24.png" --file="$(srcdir)/src/gwy_convolution-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_convolution-24.png" "gwy_convolution-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_convolution-24.crush.png"; then mv -f "gwy_convolution-24.crush.png" "gwy_convolution-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_correct_affine-24.png: $(srcdir)/src/gwy_correct_affine-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_correct_affine-24.png" --file="$(srcdir)/src/gwy_correct_affine-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_correct_affine-24.png" "gwy_correct_affine-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_correct_affine-24.crush.png"; then mv -f "gwy_correct_affine-24.crush.png" "gwy_correct_affine-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_correlation_mask-24.png: $(srcdir)/src/gwy_correlation_mask-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_correlation_mask-24.png" --file="$(srcdir)/src/gwy_correlation_mask-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_correlation_mask-24.png" "gwy_correlation_mask-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_correlation_mask-24.crush.png"; then mv -f "gwy_correlation_mask-24.crush.png" "gwy_correlation_mask-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_crop-24.png: $(srcdir)/src/gwy_crop-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_crop-24.png" --file="$(srcdir)/src/gwy_crop-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_crop-24.png" "gwy_crop-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_crop-24.crush.png"; then mv -f "gwy_crop-24.crush.png" "gwy_crop-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_cwt-24.png: $(srcdir)/src/gwy_cwt-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_cwt-24.png" --file="$(srcdir)/src/gwy_cwt-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_cwt-24.png" "gwy_cwt-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_cwt-24.crush.png"; then mv -f "gwy_cwt-24.crush.png" "gwy_cwt-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_data_measure-24.png: $(srcdir)/src/gwy_data_measure-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_data_measure-24.png" --file="$(srcdir)/src/gwy_data_measure-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_data_measure-24.png" "gwy_data_measure-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_data_measure-24.crush.png"; then mv -f "gwy_data_measure-24.crush.png" "gwy_data_measure-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_disconnected-24.png: $(srcdir)/src/gwy_disconnected-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_disconnected-24.png" --file="$(srcdir)/src/gwy_disconnected-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_disconnected-24.png" "gwy_disconnected-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_disconnected-24.crush.png"; then mv -f "gwy_disconnected-24.crush.png" "gwy_disconnected-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_distance-24.png: $(srcdir)/src/gwy_distance-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_distance-24.png" --file="$(srcdir)/src/gwy_distance-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_distance-24.png" "gwy_distance-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_distance-24.crush.png"; then mv -f "gwy_distance-24.crush.png" "gwy_distance-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_distance_transform-24.png: $(srcdir)/src/gwy_distance_transform-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_distance_transform-24.png" --file="$(srcdir)/src/gwy_distance_transform-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_distance_transform-24.png" "gwy_distance_transform-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_distance_transform-24.crush.png"; then mv -f "gwy_distance_transform-24.crush.png" "gwy_distance_transform-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_distribution_angle-24.png: $(srcdir)/src/gwy_distribution_angle-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_distribution_angle-24.png" --file="$(srcdir)/src/gwy_distribution_angle-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_distribution_angle-24.png" "gwy_distribution_angle-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_distribution_angle-24.crush.png"; then mv -f "gwy_distribution_angle-24.crush.png" "gwy_distribution_angle-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_distribution_slope-24.png: $(srcdir)/src/gwy_distribution_slope-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_distribution_slope-24.png" --file="$(srcdir)/src/gwy_distribution_slope-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_distribution_slope-24.png" "gwy_distribution_slope-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_distribution_slope-24.crush.png"; then mv -f "gwy_distribution_slope-24.crush.png" "gwy_distribution_slope-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_dwt-24.png: $(srcdir)/src/gwy_dwt-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_dwt-24.png" --file="$(srcdir)/src/gwy_dwt-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_dwt-24.png" "gwy_dwt-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_dwt-24.crush.png"; then mv -f "gwy_dwt-24.crush.png" "gwy_dwt-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_edge-24.png: $(srcdir)/src/gwy_edge-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_edge-24.png" --file="$(srcdir)/src/gwy_edge-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_edge-24.png" "gwy_edge-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_edge-24.crush.png"; then mv -f "gwy_edge-24.crush.png" "gwy_edge-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_enforce_distribution-24.png: $(srcdir)/src/gwy_enforce_distribution-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_enforce_distribution-24.png" --file="$(srcdir)/src/gwy_enforce_distribution-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_enforce_distribution-24.png" "gwy_enforce_distribution-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_enforce_distribution-24.crush.png"; then mv -f "gwy_enforce_distribution-24.crush.png" "gwy_enforce_distribution-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_entropy-24.png: $(srcdir)/src/gwy_entropy-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_entropy-24.png" --file="$(srcdir)/src/gwy_entropy-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_entropy-24.png" "gwy_entropy-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_entropy-24.crush.png"; then mv -f "gwy_entropy-24.crush.png" "gwy_entropy-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_extend-24.png: $(srcdir)/src/gwy_extend-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_extend-24.png" --file="$(srcdir)/src/gwy_extend-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_extend-24.png" "gwy_extend-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_extend-24.crush.png"; then mv -f "gwy_extend-24.crush.png" "gwy_extend-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_extract_path-24.png: $(srcdir)/src/gwy_extract_path-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_extract_path-24.png" --file="$(srcdir)/src/gwy_extract_path-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_extract_path-24.png" "gwy_extract_path-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_extract_path-24.crush.png"; then mv -f "gwy_extract_path-24.crush.png" "gwy_extract_path-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_facet_level-24.png: $(srcdir)/src/gwy_facet_level-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_facet_level-24.png" --file="$(srcdir)/src/gwy_facet_level-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_facet_level-24.png" "gwy_facet_level-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_facet_level-24.crush.png"; then mv -f "gwy_facet_level-24.crush.png" "gwy_facet_level-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_favourite-24.png: $(srcdir)/src/gwy_favourite-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_favourite-24.png" --file="$(srcdir)/src/gwy_favourite-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_favourite-24.png" "gwy_favourite-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_favourite-24.crush.png"; then mv -f "gwy_favourite-24.crush.png" "gwy_favourite-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_fft-24.png: $(srcdir)/src/gwy_fft-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fft-24.png" --file="$(srcdir)/src/gwy_fft-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_fft-24.png" "gwy_fft-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_fft-24.crush.png"; then mv -f "gwy_fft-24.crush.png" "gwy_fft-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_fft_2d-24.png: $(srcdir)/src/gwy_fft_2d-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fft_2d-24.png" --file="$(srcdir)/src/gwy_fft_2d-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_fft_2d-24.png" "gwy_fft_2d-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_fft_2d-24.crush.png"; then mv -f "gwy_fft_2d-24.crush.png" "gwy_fft_2d-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_fft_filter_1d-24.png: $(srcdir)/src/gwy_fft_filter_1d-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fft_filter_1d-24.png" --file="$(srcdir)/src/gwy_fft_filter_1d-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_fft_filter_1d-24.png" "gwy_fft_filter_1d-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_fft_filter_1d-24.crush.png"; then mv -f "gwy_fft_filter_1d-24.crush.png" "gwy_fft_filter_1d-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_fft_filter_2d-24.png: $(srcdir)/src/gwy_fft_filter_2d-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fft_filter_2d-24.png" --file="$(srcdir)/src/gwy_fft_filter_2d-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_fft_filter_2d-24.png" "gwy_fft_filter_2d-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_fft_filter_2d-24.crush.png"; then mv -f "gwy_fft_filter_2d-24.crush.png" "gwy_fft_filter_2d-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_filter-24.png: $(srcdir)/src/gwy_filter-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_filter-24.png" --file="$(srcdir)/src/gwy_filter-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_filter-24.png" "gwy_filter-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_filter-24.crush.png"; then mv -f "gwy_filter-24.crush.png" "gwy_filter-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_find_peaks-24.png: $(srcdir)/src/gwy_find_peaks-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_find_peaks-24.png" --file="$(srcdir)/src/gwy_find_peaks-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_find_peaks-24.png" "gwy_find_peaks-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_find_peaks-24.crush.png"; then mv -f "gwy_find_peaks-24.crush.png" "gwy_find_peaks-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_fit_shape-24.png: $(srcdir)/src/gwy_fit_shape-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fit_shape-24.png" --file="$(srcdir)/src/gwy_fit_shape-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_fit_shape-24.png" "gwy_fit_shape-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_fit_shape-24.crush.png"; then mv -f "gwy_fit_shape-24.crush.png" "gwy_fit_shape-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_fix_zero-24.png: $(srcdir)/src/gwy_fix_zero-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fix_zero-24.png" --file="$(srcdir)/src/gwy_fix_zero-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_fix_zero-24.png" "gwy_fix_zero-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_fix_zero-24.crush.png"; then mv -f "gwy_fix_zero-24.crush.png" "gwy_fix_zero-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_flip_horizontally-24.png: $(srcdir)/src/gwy_flip_horizontally-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_flip_horizontally-24.png" --file="$(srcdir)/src/gwy_flip_horizontally-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_flip_horizontally-24.png" "gwy_flip_horizontally-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_flip_horizontally-24.crush.png"; then mv -f "gwy_flip_horizontally-24.crush.png" "gwy_flip_horizontally-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_flip_vertically-24.png: $(srcdir)/src/gwy_flip_vertically-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_flip_vertically-24.png" --file="$(srcdir)/src/gwy_flip_vertically-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_flip_vertically-24.png" "gwy_flip_vertically-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_flip_vertically-24.crush.png"; then mv -f "gwy_flip_vertically-24.crush.png" "gwy_flip_vertically-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_fractal-24.png: $(srcdir)/src/gwy_fractal-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fractal-24.png" --file="$(srcdir)/src/gwy_fractal-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_fractal-24.png" "gwy_fractal-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_fractal-24.crush.png"; then mv -f "gwy_fractal-24.crush.png" "gwy_fractal-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_fractal_correction-24.png: $(srcdir)/src/gwy_fractal_correction-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fractal_correction-24.png" --file="$(srcdir)/src/gwy_fractal_correction-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_fractal_correction-24.png" "gwy_fractal_correction-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_fractal_correction-24.crush.png"; then mv -f "gwy_fractal_correction-24.crush.png" "gwy_fractal_correction-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_fractal_measure-24.png: $(srcdir)/src/gwy_fractal_measure-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_fractal_measure-24.png" --file="$(srcdir)/src/gwy_fractal_measure-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_fractal_measure-24.png" "gwy_fractal_measure-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_fractal_measure-24.crush.png"; then mv -f "gwy_fractal_measure-24.crush.png" "gwy_fractal_measure-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_gl_material-16.png: $(srcdir)/src/gwy_gl_material-16.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=16 --export-height=16 --export-png="gwy_gl_material-16.png" --file="$(srcdir)/src/gwy_gl_material-16.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_gl_material-16.png" "gwy_gl_material-16.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_gl_material-16.crush.png"; then mv -f "gwy_gl_material-16.crush.png" "gwy_gl_material-16.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_gradient_horizontal-24.png: $(srcdir)/src/gwy_gradient_horizontal-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_gradient_horizontal-24.png" --file="$(srcdir)/src/gwy_gradient_horizontal-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_gradient_horizontal-24.png" "gwy_gradient_horizontal-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_gradient_horizontal-24.crush.png"; then mv -f "gwy_gradient_horizontal-24.crush.png" "gwy_gradient_horizontal-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_gradient_vertical-24.png: $(srcdir)/src/gwy_gradient_vertical-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_gradient_vertical-24.png" --file="$(srcdir)/src/gwy_gradient_vertical-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_gradient_vertical-24.png" "gwy_gradient_vertical-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_gradient_vertical-24.crush.png"; then mv -f "gwy_gradient_vertical-24.crush.png" "gwy_gradient_vertical-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_grain_correlation-24.png: $(srcdir)/src/gwy_grain_correlation-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grain_correlation-24.png" --file="$(srcdir)/src/gwy_grain_correlation-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_grain_correlation-24.png" "gwy_grain_correlation-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_grain_correlation-24.crush.png"; then mv -f "gwy_grain_correlation-24.crush.png" "gwy_grain_correlation-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_grain_exscribed_circle-24.png: $(srcdir)/src/gwy_grain_exscribed_circle-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grain_exscribed_circle-24.png" --file="$(srcdir)/src/gwy_grain_exscribed_circle-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_grain_exscribed_circle-24.png" "gwy_grain_exscribed_circle-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_grain_exscribed_circle-24.crush.png"; then mv -f "gwy_grain_exscribed_circle-24.crush.png" "gwy_grain_exscribed_circle-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_grain_inscribed_circle-24.png: $(srcdir)/src/gwy_grain_inscribed_circle-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grain_inscribed_circle-24.png" --file="$(srcdir)/src/gwy_grain_inscribed_circle-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_grain_inscribed_circle-24.png" "gwy_grain_inscribed_circle-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_grain_inscribed_circle-24.crush.png"; then mv -f "gwy_grain_inscribed_circle-24.crush.png" "gwy_grain_inscribed_circle-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_grains-24.png: $(srcdir)/src/gwy_grains-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grains-24.png" --file="$(srcdir)/src/gwy_grains-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_grains-24.png" "gwy_grains-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_grains-24.crush.png"; then mv -f "gwy_grains-24.crush.png" "gwy_grains-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_grains_edge-24.png: $(srcdir)/src/gwy_grains_edge-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grains_edge-24.png" --file="$(srcdir)/src/gwy_grains_edge-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_grains_edge-24.png" "gwy_grains_edge-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_grains_edge-24.crush.png"; then mv -f "gwy_grains_edge-24.crush.png" "gwy_grains_edge-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_grains_edge_remove-24.png: $(srcdir)/src/gwy_grains_edge_remove-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grains_edge_remove-24.png" --file="$(srcdir)/src/gwy_grains_edge_remove-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_grains_edge_remove-24.png" "gwy_grains_edge_remove-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_grains_edge_remove-24.crush.png"; then mv -f "gwy_grains_edge_remove-24.crush.png" "gwy_grains_edge_remove-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_grains_graph-24.png: $(srcdir)/src/gwy_grains_graph-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grains_graph-24.png" --file="$(srcdir)/src/gwy_grains_graph-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_grains_graph-24.png" "gwy_grains_graph-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_grains_graph-24.crush.png"; then mv -f "gwy_grains_graph-24.crush.png" "gwy_grains_graph-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_grains_measure-24.png: $(srcdir)/src/gwy_grains_measure-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grains_measure-24.png" --file="$(srcdir)/src/gwy_grains_measure-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_grains_measure-24.png" "gwy_grains_measure-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_grains_measure-24.crush.png"; then mv -f "gwy_grains_measure-24.crush.png" "gwy_grains_measure-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_grains_remove-24.png: $(srcdir)/src/gwy_grains_remove-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grains_remove-24.png" --file="$(srcdir)/src/gwy_grains_remove-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_grains_remove-24.png" "gwy_grains_remove-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_grains_remove-24.crush.png"; then mv -f "gwy_grains_remove-24.crush.png" "gwy_grains_remove-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_grains_water-24.png: $(srcdir)/src/gwy_grains_water-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_grains_water-24.png" --file="$(srcdir)/src/gwy_grains_water-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_grains_water-24.png" "gwy_grains_water-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_grains_water-24.crush.png"; then mv -f "gwy_grains_water-24.crush.png" "gwy_grains_water-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph-24.png: $(srcdir)/src/gwy_graph-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph-24.png" --file="$(srcdir)/src/gwy_graph-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph-24.png" "gwy_graph-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph-24.crush.png"; then mv -f "gwy_graph-24.crush.png" "gwy_graph-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_align-24.png: $(srcdir)/src/gwy_graph_align-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_align-24.png" --file="$(srcdir)/src/gwy_graph_align-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_align-24.png" "gwy_graph_align-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_align-24.crush.png"; then mv -f "gwy_graph_align-24.crush.png" "gwy_graph_align-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_cut-24.png: $(srcdir)/src/gwy_graph_cut-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_cut-24.png" --file="$(srcdir)/src/gwy_graph_cut-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_cut-24.png" "gwy_graph_cut-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_cut-24.crush.png"; then mv -f "gwy_graph_cut-24.crush.png" "gwy_graph_cut-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_dos-24.png: $(srcdir)/src/gwy_graph_dos-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_dos-24.png" --file="$(srcdir)/src/gwy_graph_dos-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_dos-24.png" "gwy_graph_dos-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_dos-24.crush.png"; then mv -f "gwy_graph_dos-24.crush.png" "gwy_graph_dos-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_export_ascii-24.png: $(srcdir)/src/gwy_graph_export_ascii-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_export_ascii-24.png" --file="$(srcdir)/src/gwy_graph_export_ascii-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_export_ascii-24.png" "gwy_graph_export_ascii-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_export_ascii-24.crush.png"; then mv -f "gwy_graph_export_ascii-24.crush.png" "gwy_graph_export_ascii-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_export_png-24.png: $(srcdir)/src/gwy_graph_export_png-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_export_png-24.png" --file="$(srcdir)/src/gwy_graph_export_png-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_export_png-24.png" "gwy_graph_export_png-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_export_png-24.crush.png"; then mv -f "gwy_graph_export_png-24.crush.png" "gwy_graph_export_png-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_export_vector-24.png: $(srcdir)/src/gwy_graph_export_vector-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_export_vector-24.png" --file="$(srcdir)/src/gwy_graph_export_vector-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_export_vector-24.png" "gwy_graph_export_vector-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_export_vector-24.crush.png"; then mv -f "gwy_graph_export_vector-24.crush.png" "gwy_graph_export_vector-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_fd-24.png: $(srcdir)/src/gwy_graph_fd-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_fd-24.png" --file="$(srcdir)/src/gwy_graph_fd-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_fd-24.png" "gwy_graph_fd-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_fd-24.crush.png"; then mv -f "gwy_graph_fd-24.crush.png" "gwy_graph_fd-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_filter-24.png: $(srcdir)/src/gwy_graph_filter-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_filter-24.png" --file="$(srcdir)/src/gwy_graph_filter-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_filter-24.png" "gwy_graph_filter-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_filter-24.crush.png"; then mv -f "gwy_graph_filter-24.crush.png" "gwy_graph_filter-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_function-24.png: $(srcdir)/src/gwy_graph_function-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_function-24.png" --file="$(srcdir)/src/gwy_graph_function-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_function-24.png" "gwy_graph_function-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_function-24.crush.png"; then mv -f "gwy_graph_function-24.crush.png" "gwy_graph_function-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_halfgauss-24.png: $(srcdir)/src/gwy_graph_halfgauss-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_halfgauss-24.png" --file="$(srcdir)/src/gwy_graph_halfgauss-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_halfgauss-24.png" "gwy_graph_halfgauss-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_halfgauss-24.crush.png"; then mv -f "gwy_graph_halfgauss-24.crush.png" "gwy_graph_halfgauss-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_level-24.png: $(srcdir)/src/gwy_graph_level-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_level-24.png" --file="$(srcdir)/src/gwy_graph_level-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_level-24.png" "gwy_graph_level-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_level-24.crush.png"; then mv -f "gwy_graph_level-24.crush.png" "gwy_graph_level-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_measure-24.png: $(srcdir)/src/gwy_graph_measure-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_measure-24.png" --file="$(srcdir)/src/gwy_graph_measure-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_measure-24.png" "gwy_graph_measure-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_measure-24.crush.png"; then mv -f "gwy_graph_measure-24.crush.png" "gwy_graph_measure-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_palette-24.png: $(srcdir)/src/gwy_graph_palette-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_palette-24.png" --file="$(srcdir)/src/gwy_graph_palette-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_palette-24.png" "gwy_graph_palette-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_palette-24.crush.png"; then mv -f "gwy_graph_palette-24.crush.png" "gwy_graph_palette-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_pointer-24.png: $(srcdir)/src/gwy_graph_pointer-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_pointer-24.png" --file="$(srcdir)/src/gwy_graph_pointer-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_pointer-24.png" "gwy_graph_pointer-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_pointer-24.crush.png"; then mv -f "gwy_graph_pointer-24.crush.png" "gwy_graph_pointer-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_ruler-24.png: $(srcdir)/src/gwy_graph_ruler-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_ruler-24.png" --file="$(srcdir)/src/gwy_graph_ruler-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_ruler-24.png" "gwy_graph_ruler-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_ruler-24.crush.png"; then mv -f "gwy_graph_ruler-24.crush.png" "gwy_graph_ruler-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_vertical-24.png: $(srcdir)/src/gwy_graph_vertical-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_vertical-24.png" --file="$(srcdir)/src/gwy_graph_vertical-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_vertical-24.png" "gwy_graph_vertical-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_vertical-24.crush.png"; then mv -f "gwy_graph_vertical-24.crush.png" "gwy_graph_vertical-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_zoom_fit-24.png: $(srcdir)/src/gwy_graph_zoom_fit-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_zoom_fit-24.png" --file="$(srcdir)/src/gwy_graph_zoom_fit-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_zoom_fit-24.png" "gwy_graph_zoom_fit-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_zoom_fit-24.crush.png"; then mv -f "gwy_graph_zoom_fit-24.crush.png" "gwy_graph_zoom_fit-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_zoom_in-24.png: $(srcdir)/src/gwy_graph_zoom_in-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_zoom_in-24.png" --file="$(srcdir)/src/gwy_graph_zoom_in-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_zoom_in-24.png" "gwy_graph_zoom_in-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_zoom_in-24.crush.png"; then mv -f "gwy_graph_zoom_in-24.crush.png" "gwy_graph_zoom_in-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_graph_zoom_out-24.png: $(srcdir)/src/gwy_graph_zoom_out-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_graph_zoom_out-24.png" --file="$(srcdir)/src/gwy_graph_zoom_out-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_graph_zoom_out-24.png" "gwy_graph_zoom_out-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_graph_zoom_out-24.crush.png"; then mv -f "gwy_graph_zoom_out-24.crush.png" "gwy_graph_zoom_out-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_hough-24.png: $(srcdir)/src/gwy_hough-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_hough-24.png" --file="$(srcdir)/src/gwy_hough-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_hough-24.png" "gwy_hough-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_hough-24.crush.png"; then mv -f "gwy_hough-24.crush.png" "gwy_hough-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_immerse-24.png: $(srcdir)/src/gwy_immerse-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_immerse-24.png" --file="$(srcdir)/src/gwy_immerse-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_immerse-24.png" "gwy_immerse-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_immerse-24.crush.png"; then mv -f "gwy_immerse-24.crush.png" "gwy_immerse-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_iso_roughness-24.png: $(srcdir)/src/gwy_iso_roughness-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_iso_roughness-24.png" --file="$(srcdir)/src/gwy_iso_roughness-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_iso_roughness-24.png" "gwy_iso_roughness-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_iso_roughness-24.crush.png"; then mv -f "gwy_iso_roughness-24.crush.png" "gwy_iso_roughness-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_italic-20.png: $(srcdir)/src/gwy_italic-20.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=20 --export-height=20 --export-png="gwy_italic-20.png" --file="$(srcdir)/src/gwy_italic-20.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_italic-20.png" "gwy_italic-20.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_italic-20.crush.png"; then mv -f "gwy_italic-20.crush.png" "gwy_italic-20.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_less-24.png: $(srcdir)/src/gwy_less-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_less-24.png" --file="$(srcdir)/src/gwy_less-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_less-24.png" "gwy_less-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_less-24.crush.png"; then mv -f "gwy_less-24.crush.png" "gwy_less-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_level-24.png: $(srcdir)/src/gwy_level-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_level-24.png" --file="$(srcdir)/src/gwy_level-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_level-24.png" "gwy_level-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_level-24.crush.png"; then mv -f "gwy_level-24.crush.png" "gwy_level-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_level_flatten_base-24.png: $(srcdir)/src/gwy_level_flatten_base-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_level_flatten_base-24.png" --file="$(srcdir)/src/gwy_level_flatten_base-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_level_flatten_base-24.png" "gwy_level_flatten_base-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_level_flatten_base-24.crush.png"; then mv -f "gwy_level_flatten_base-24.crush.png" "gwy_level_flatten_base-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_level_median-24.png: $(srcdir)/src/gwy_level_median-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_level_median-24.png" --file="$(srcdir)/src/gwy_level_median-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_level_median-24.png" "gwy_level_median-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_level_median-24.crush.png"; then mv -f "gwy_level_median-24.crush.png" "gwy_level_median-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_level_triangle-24.png: $(srcdir)/src/gwy_level_triangle-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_level_triangle-24.png" --file="$(srcdir)/src/gwy_level_triangle-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_level_triangle-24.png" "gwy_level_triangle-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_level_triangle-24.crush.png"; then mv -f "gwy_level_triangle-24.crush.png" "gwy_level_triangle-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_light_rotate-24.png: $(srcdir)/src/gwy_light_rotate-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_light_rotate-24.png" --file="$(srcdir)/src/gwy_light_rotate-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_light_rotate-24.png" "gwy_light_rotate-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_light_rotate-24.crush.png"; then mv -f "gwy_light_rotate-24.crush.png" "gwy_light_rotate-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_line_level-24.png: $(srcdir)/src/gwy_line_level-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_line_level-24.png" --file="$(srcdir)/src/gwy_line_level-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_line_level-24.png" "gwy_line_level-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_line_level-24.crush.png"; then mv -f "gwy_line_level-24.crush.png" "gwy_line_level-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_load_debug-20.png: $(srcdir)/src/gwy_load_debug-20.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=20 --export-height=20 --export-png="gwy_load_debug-20.png" --file="$(srcdir)/src/gwy_load_debug-20.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_load_debug-20.png" "gwy_load_debug-20.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_load_debug-20.crush.png"; then mv -f "gwy_load_debug-20.crush.png" "gwy_load_debug-20.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_load_info-20.png: $(srcdir)/src/gwy_load_info-20.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=20 --export-height=20 --export-png="gwy_load_info-20.png" --file="$(srcdir)/src/gwy_load_info-20.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_load_info-20.png" "gwy_load_info-20.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_load_info-20.crush.png"; then mv -f "gwy_load_info-20.crush.png" "gwy_load_info-20.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_load_warning-20.png: $(srcdir)/src/gwy_load_warning-20.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=20 --export-height=20 --export-png="gwy_load_warning-20.png" --file="$(srcdir)/src/gwy_load_warning-20.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_load_warning-20.png" "gwy_load_warning-20.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_load_warning-20.crush.png"; then mv -f "gwy_load_warning-20.crush.png" "gwy_load_warning-20.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_local_slope-24.png: $(srcdir)/src/gwy_local_slope-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_local_slope-24.png" --file="$(srcdir)/src/gwy_local_slope-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_local_slope-24.png" "gwy_local_slope-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_local_slope-24.crush.png"; then mv -f "gwy_local_slope-24.crush.png" "gwy_local_slope-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_logscale_horizontal-24.png: $(srcdir)/src/gwy_logscale_horizontal-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_logscale_horizontal-24.png" --file="$(srcdir)/src/gwy_logscale_horizontal-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_logscale_horizontal-24.png" "gwy_logscale_horizontal-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_logscale_horizontal-24.crush.png"; then mv -f "gwy_logscale_horizontal-24.crush.png" "gwy_logscale_horizontal-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_logscale_vertical-24.png: $(srcdir)/src/gwy_logscale_vertical-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_logscale_vertical-24.png" --file="$(srcdir)/src/gwy_logscale_vertical-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_logscale_vertical-24.png" "gwy_logscale_vertical-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_logscale_vertical-24.crush.png"; then mv -f "gwy_logscale_vertical-24.crush.png" "gwy_logscale_vertical-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mark_outliers-24.png: $(srcdir)/src/gwy_mark_outliers-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mark_outliers-24.png" --file="$(srcdir)/src/gwy_mark_outliers-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mark_outliers-24.png" "gwy_mark_outliers-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mark_outliers-24.crush.png"; then mv -f "gwy_mark_outliers-24.crush.png" "gwy_mark_outliers-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mark_scars-24.png: $(srcdir)/src/gwy_mark_scars-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mark_scars-24.png" --file="$(srcdir)/src/gwy_mark_scars-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mark_scars-24.png" "gwy_mark_scars-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mark_scars-24.crush.png"; then mv -f "gwy_mark_scars-24.crush.png" "gwy_mark_scars-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mark_with-24.png: $(srcdir)/src/gwy_mark_with-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mark_with-24.png" --file="$(srcdir)/src/gwy_mark_with-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mark_with-24.png" "gwy_mark_with-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mark_with-24.crush.png"; then mv -f "gwy_mark_with-24.crush.png" "gwy_mark_with-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask-16.png: $(srcdir)/src/gwy_mask-16.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=16 --export-height=16 --export-png="gwy_mask-16.png" --file="$(srcdir)/src/gwy_mask-16.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask-16.png" "gwy_mask-16.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask-16.crush.png"; then mv -f "gwy_mask-16.crush.png" "gwy_mask-16.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask-24.png: $(srcdir)/src/gwy_mask-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask-24.png" --file="$(srcdir)/src/gwy_mask-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask-24.png" "gwy_mask-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask-24.crush.png"; then mv -f "gwy_mask-24.crush.png" "gwy_mask-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_add-24.png: $(srcdir)/src/gwy_mask_add-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_add-24.png" --file="$(srcdir)/src/gwy_mask_add-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_add-24.png" "gwy_mask_add-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_add-24.crush.png"; then mv -f "gwy_mask_add-24.crush.png" "gwy_mask_add-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_circle-24.png: $(srcdir)/src/gwy_mask_circle-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_circle-24.png" --file="$(srcdir)/src/gwy_mask_circle-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_circle-24.png" "gwy_mask_circle-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_circle-24.crush.png"; then mv -f "gwy_mask_circle-24.crush.png" "gwy_mask_circle-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_circle_exclusive-24.png: $(srcdir)/src/gwy_mask_circle_exclusive-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_circle_exclusive-24.png" --file="$(srcdir)/src/gwy_mask_circle_exclusive-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_circle_exclusive-24.png" "gwy_mask_circle_exclusive-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_circle_exclusive-24.crush.png"; then mv -f "gwy_mask_circle_exclusive-24.crush.png" "gwy_mask_circle_exclusive-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_circle_inclusive-24.png: $(srcdir)/src/gwy_mask_circle_inclusive-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_circle_inclusive-24.png" --file="$(srcdir)/src/gwy_mask_circle_inclusive-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_circle_inclusive-24.png" "gwy_mask_circle_inclusive-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_circle_inclusive-24.crush.png"; then mv -f "gwy_mask_circle_inclusive-24.crush.png" "gwy_mask_circle_inclusive-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_distribute-24.png: $(srcdir)/src/gwy_mask_distribute-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_distribute-24.png" --file="$(srcdir)/src/gwy_mask_distribute-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_distribute-24.png" "gwy_mask_distribute-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_distribute-24.crush.png"; then mv -f "gwy_mask_distribute-24.crush.png" "gwy_mask_distribute-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_editor-24.png: $(srcdir)/src/gwy_mask_editor-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_editor-24.png" --file="$(srcdir)/src/gwy_mask_editor-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_editor-24.png" "gwy_mask_editor-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_editor-24.crush.png"; then mv -f "gwy_mask_editor-24.crush.png" "gwy_mask_editor-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_exclude-24.png: $(srcdir)/src/gwy_mask_exclude-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_exclude-24.png" --file="$(srcdir)/src/gwy_mask_exclude-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_exclude-24.png" "gwy_mask_exclude-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_exclude-24.crush.png"; then mv -f "gwy_mask_exclude-24.crush.png" "gwy_mask_exclude-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_exclude_circle-24.png: $(srcdir)/src/gwy_mask_exclude_circle-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_exclude_circle-24.png" --file="$(srcdir)/src/gwy_mask_exclude_circle-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_exclude_circle-24.png" "gwy_mask_exclude_circle-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_exclude_circle-24.crush.png"; then mv -f "gwy_mask_exclude_circle-24.crush.png" "gwy_mask_exclude_circle-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_extract-24.png: $(srcdir)/src/gwy_mask_extract-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_extract-24.png" --file="$(srcdir)/src/gwy_mask_extract-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_extract-24.png" "gwy_mask_extract-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_extract-24.crush.png"; then mv -f "gwy_mask_extract-24.crush.png" "gwy_mask_extract-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_fill_draw-24.png: $(srcdir)/src/gwy_mask_fill_draw-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_fill_draw-24.png" --file="$(srcdir)/src/gwy_mask_fill_draw-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_fill_draw-24.png" "gwy_mask_fill_draw-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_fill_draw-24.crush.png"; then mv -f "gwy_mask_fill_draw-24.crush.png" "gwy_mask_fill_draw-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_fill_erase-24.png: $(srcdir)/src/gwy_mask_fill_erase-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_fill_erase-24.png" --file="$(srcdir)/src/gwy_mask_fill_erase-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_fill_erase-24.png" "gwy_mask_fill_erase-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_fill_erase-24.crush.png"; then mv -f "gwy_mask_fill_erase-24.crush.png" "gwy_mask_fill_erase-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_grow-24.png: $(srcdir)/src/gwy_mask_grow-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_grow-24.png" --file="$(srcdir)/src/gwy_mask_grow-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_grow-24.png" "gwy_mask_grow-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_grow-24.crush.png"; then mv -f "gwy_mask_grow-24.crush.png" "gwy_mask_grow-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_intersect-24.png: $(srcdir)/src/gwy_mask_intersect-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_intersect-24.png" --file="$(srcdir)/src/gwy_mask_intersect-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_intersect-24.png" "gwy_mask_intersect-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_intersect-24.crush.png"; then mv -f "gwy_mask_intersect-24.crush.png" "gwy_mask_intersect-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_invert-24.png: $(srcdir)/src/gwy_mask_invert-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_invert-24.png" --file="$(srcdir)/src/gwy_mask_invert-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_invert-24.png" "gwy_mask_invert-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_invert-24.crush.png"; then mv -f "gwy_mask_invert-24.crush.png" "gwy_mask_invert-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_line-24.png: $(srcdir)/src/gwy_mask_line-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_line-24.png" --file="$(srcdir)/src/gwy_mask_line-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_line-24.png" "gwy_mask_line-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_line-24.crush.png"; then mv -f "gwy_mask_line-24.crush.png" "gwy_mask_line-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_morph-24.png: $(srcdir)/src/gwy_mask_morph-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_morph-24.png" --file="$(srcdir)/src/gwy_mask_morph-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_morph-24.png" "gwy_mask_morph-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_morph-24.crush.png"; then mv -f "gwy_mask_morph-24.crush.png" "gwy_mask_morph-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_paint_draw-24.png: $(srcdir)/src/gwy_mask_paint_draw-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_paint_draw-24.png" --file="$(srcdir)/src/gwy_mask_paint_draw-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_paint_draw-24.png" "gwy_mask_paint_draw-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_paint_draw-24.crush.png"; then mv -f "gwy_mask_paint_draw-24.crush.png" "gwy_mask_paint_draw-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_paint_erase-24.png: $(srcdir)/src/gwy_mask_paint_erase-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_paint_erase-24.png" --file="$(srcdir)/src/gwy_mask_paint_erase-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_paint_erase-24.png" "gwy_mask_paint_erase-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_paint_erase-24.crush.png"; then mv -f "gwy_mask_paint_erase-24.crush.png" "gwy_mask_paint_erase-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_rect_exclusive-24.png: $(srcdir)/src/gwy_mask_rect_exclusive-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_rect_exclusive-24.png" --file="$(srcdir)/src/gwy_mask_rect_exclusive-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_rect_exclusive-24.png" "gwy_mask_rect_exclusive-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_rect_exclusive-24.crush.png"; then mv -f "gwy_mask_rect_exclusive-24.crush.png" "gwy_mask_rect_exclusive-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_rect_inclusive-24.png: $(srcdir)/src/gwy_mask_rect_inclusive-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_rect_inclusive-24.png" --file="$(srcdir)/src/gwy_mask_rect_inclusive-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_rect_inclusive-24.png" "gwy_mask_rect_inclusive-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_rect_inclusive-24.crush.png"; then mv -f "gwy_mask_rect_inclusive-24.crush.png" "gwy_mask_rect_inclusive-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_remove-24.png: $(srcdir)/src/gwy_mask_remove-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_remove-24.png" --file="$(srcdir)/src/gwy_mask_remove-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_remove-24.png" "gwy_mask_remove-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_remove-24.crush.png"; then mv -f "gwy_mask_remove-24.crush.png" "gwy_mask_remove-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_set-24.png: $(srcdir)/src/gwy_mask_set-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_set-24.png" --file="$(srcdir)/src/gwy_mask_set-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_set-24.png" "gwy_mask_set-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_set-24.crush.png"; then mv -f "gwy_mask_set-24.crush.png" "gwy_mask_set-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_shrink-24.png: $(srcdir)/src/gwy_mask_shrink-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_shrink-24.png" --file="$(srcdir)/src/gwy_mask_shrink-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_shrink-24.png" "gwy_mask_shrink-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_shrink-24.crush.png"; then mv -f "gwy_mask_shrink-24.crush.png" "gwy_mask_shrink-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_subtract-24.png: $(srcdir)/src/gwy_mask_subtract-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_subtract-24.png" --file="$(srcdir)/src/gwy_mask_subtract-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_subtract-24.png" "gwy_mask_subtract-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_subtract-24.crush.png"; then mv -f "gwy_mask_subtract-24.crush.png" "gwy_mask_subtract-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mask_thin-24.png: $(srcdir)/src/gwy_mask_thin-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mask_thin-24.png" --file="$(srcdir)/src/gwy_mask_thin-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mask_thin-24.png" "gwy_mask_thin-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mask_thin-24.crush.png"; then mv -f "gwy_mask_thin-24.crush.png" "gwy_mask_thin-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_measure_lattice-24.png: $(srcdir)/src/gwy_measure_lattice-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_measure_lattice-24.png" --file="$(srcdir)/src/gwy_measure_lattice-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_measure_lattice-24.png" "gwy_measure_lattice-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_measure_lattice-24.crush.png"; then mv -f "gwy_measure_lattice-24.crush.png" "gwy_measure_lattice-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_merge-24.png: $(srcdir)/src/gwy_merge-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_merge-24.png" --file="$(srcdir)/src/gwy_merge-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_merge-24.png" "gwy_merge-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_merge-24.crush.png"; then mv -f "gwy_merge-24.crush.png" "gwy_merge-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_more-24.png: $(srcdir)/src/gwy_more-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_more-24.png" --file="$(srcdir)/src/gwy_more-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_more-24.png" "gwy_more-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_more-24.crush.png"; then mv -f "gwy_more-24.crush.png" "gwy_more-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_mutual_crop-24.png: $(srcdir)/src/gwy_mutual_crop-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_mutual_crop-24.png" --file="$(srcdir)/src/gwy_mutual_crop-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_mutual_crop-24.png" "gwy_mutual_crop-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_mutual_crop-24.crush.png"; then mv -f "gwy_mutual_crop-24.crush.png" "gwy_mutual_crop-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_neural_apply-24.png: $(srcdir)/src/gwy_neural_apply-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_neural_apply-24.png" --file="$(srcdir)/src/gwy_neural_apply-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_neural_apply-24.png" "gwy_neural_apply-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_neural_apply-24.crush.png"; then mv -f "gwy_neural_apply-24.crush.png" "gwy_neural_apply-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_neural_train-24.png: $(srcdir)/src/gwy_neural_train-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_neural_train-24.png" --file="$(srcdir)/src/gwy_neural_train-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_neural_train-24.png" "gwy_neural_train-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_neural_train-24.crush.png"; then mv -f "gwy_neural_train-24.crush.png" "gwy_neural_train-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_next-24.png: $(srcdir)/src/gwy_next-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_next-24.png" --file="$(srcdir)/src/gwy_next-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_next-24.png" "gwy_next-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_next-24.crush.png"; then mv -f "gwy_next-24.crush.png" "gwy_next-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_null_offsets-24.png: $(srcdir)/src/gwy_null_offsets-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_null_offsets-24.png" --file="$(srcdir)/src/gwy_null_offsets-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_null_offsets-24.png" "gwy_null_offsets-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_null_offsets-24.crush.png"; then mv -f "gwy_null_offsets-24.crush.png" "gwy_null_offsets-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_palettes-16.png: $(srcdir)/src/gwy_palettes-16.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=16 --export-height=16 --export-png="gwy_palettes-16.png" --file="$(srcdir)/src/gwy_palettes-16.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_palettes-16.png" "gwy_palettes-16.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_palettes-16.crush.png"; then mv -f "gwy_palettes-16.crush.png" "gwy_palettes-16.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_palettes-24.png: $(srcdir)/src/gwy_palettes-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_palettes-24.png" --file="$(srcdir)/src/gwy_palettes-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_palettes-24.png" "gwy_palettes-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_palettes-24.crush.png"; then mv -f "gwy_palettes-24.crush.png" "gwy_palettes-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_path_level-24.png: $(srcdir)/src/gwy_path_level-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_path_level-24.png" --file="$(srcdir)/src/gwy_path_level-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_path_level-24.png" "gwy_path_level-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_path_level-24.crush.png"; then mv -f "gwy_path_level-24.crush.png" "gwy_path_level-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_pointer_measure-24.png: $(srcdir)/src/gwy_pointer_measure-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_pointer_measure-24.png" --file="$(srcdir)/src/gwy_pointer_measure-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_pointer_measure-24.png" "gwy_pointer_measure-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_pointer_measure-24.crush.png"; then mv -f "gwy_pointer_measure-24.crush.png" "gwy_pointer_measure-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_poly_distort-24.png: $(srcdir)/src/gwy_poly_distort-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_poly_distort-24.png" --file="$(srcdir)/src/gwy_poly_distort-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_poly_distort-24.png" "gwy_poly_distort-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_poly_distort-24.crush.png"; then mv -f "gwy_poly_distort-24.crush.png" "gwy_poly_distort-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_polynom-24.png: $(srcdir)/src/gwy_polynom-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_polynom-24.png" --file="$(srcdir)/src/gwy_polynom-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_polynom-24.png" "gwy_polynom-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_polynom-24.crush.png"; then mv -f "gwy_polynom-24.crush.png" "gwy_polynom-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_polynom_level-24.png: $(srcdir)/src/gwy_polynom_level-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_polynom_level-24.png" --file="$(srcdir)/src/gwy_polynom_level-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_polynom_level-24.png" "gwy_polynom_level-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_polynom_level-24.crush.png"; then mv -f "gwy_polynom_level-24.crush.png" "gwy_polynom_level-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_previous-24.png: $(srcdir)/src/gwy_previous-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_previous-24.png" --file="$(srcdir)/src/gwy_previous-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_previous-24.png" "gwy_previous-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_previous-24.crush.png"; then mv -f "gwy_previous-24.crush.png" "gwy_previous-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_profile-24.png: $(srcdir)/src/gwy_profile-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_profile-24.png" --file="$(srcdir)/src/gwy_profile-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_profile-24.png" "gwy_profile-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_profile-24.crush.png"; then mv -f "gwy_profile-24.crush.png" "gwy_profile-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_pygwy-24.png: $(srcdir)/src/gwy_pygwy-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_pygwy-24.png" --file="$(srcdir)/src/gwy_pygwy-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_pygwy-24.png" "gwy_pygwy-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_pygwy-24.crush.png"; then mv -f "gwy_pygwy-24.crush.png" "gwy_pygwy-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_remove_under_mask-24.png: $(srcdir)/src/gwy_remove_under_mask-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_remove_under_mask-24.png" --file="$(srcdir)/src/gwy_remove_under_mask-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_remove_under_mask-24.png" "gwy_remove_under_mask-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_remove_under_mask-24.crush.png"; then mv -f "gwy_remove_under_mask-24.crush.png" "gwy_remove_under_mask-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_rotate-24.png: $(srcdir)/src/gwy_rotate-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_rotate-24.png" --file="$(srcdir)/src/gwy_rotate-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_rotate-24.png" "gwy_rotate-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_rotate-24.crush.png"; then mv -f "gwy_rotate-24.crush.png" "gwy_rotate-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_rotate_180-24.png: $(srcdir)/src/gwy_rotate_180-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_rotate_180-24.png" --file="$(srcdir)/src/gwy_rotate_180-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_rotate_180-24.png" "gwy_rotate_180-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_rotate_180-24.crush.png"; then mv -f "gwy_rotate_180-24.crush.png" "gwy_rotate_180-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_rotate_3d-24.png: $(srcdir)/src/gwy_rotate_3d-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_rotate_3d-24.png" --file="$(srcdir)/src/gwy_rotate_3d-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_rotate_3d-24.png" "gwy_rotate_3d-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_rotate_3d-24.crush.png"; then mv -f "gwy_rotate_3d-24.crush.png" "gwy_rotate_3d-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_rotate_90_ccw-24.png: $(srcdir)/src/gwy_rotate_90_ccw-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_rotate_90_ccw-24.png" --file="$(srcdir)/src/gwy_rotate_90_ccw-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_rotate_90_ccw-24.png" "gwy_rotate_90_ccw-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_rotate_90_ccw-24.crush.png"; then mv -f "gwy_rotate_90_ccw-24.crush.png" "gwy_rotate_90_ccw-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_rotate_90_cw-24.png: $(srcdir)/src/gwy_rotate_90_cw-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_rotate_90_cw-24.png" --file="$(srcdir)/src/gwy_rotate_90_cw-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_rotate_90_cw-24.png" "gwy_rotate_90_cw-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_rotate_90_cw-24.crush.png"; then mv -f "gwy_rotate_90_cw-24.crush.png" "gwy_rotate_90_cw-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_scale-24.png: $(srcdir)/src/gwy_scale-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_scale-24.png" --file="$(srcdir)/src/gwy_scale-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_scale-24.png" "gwy_scale-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_scale-24.crush.png"; then mv -f "gwy_scale-24.crush.png" "gwy_scale-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_scale_horizontally-24.png: $(srcdir)/src/gwy_scale_horizontally-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_scale_horizontally-24.png" --file="$(srcdir)/src/gwy_scale_horizontally-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_scale_horizontally-24.png" "gwy_scale_horizontally-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_scale_horizontally-24.crush.png"; then mv -f "gwy_scale_horizontally-24.crush.png" "gwy_scale_horizontally-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_scale_vertically-24.png: $(srcdir)/src/gwy_scale_vertically-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_scale_vertically-24.png" --file="$(srcdir)/src/gwy_scale_vertically-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_scale_vertically-24.png" "gwy_scale_vertically-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_scale_vertically-24.crush.png"; then mv -f "gwy_scale_vertically-24.crush.png" "gwy_scale_vertically-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_scars-24.png: $(srcdir)/src/gwy_scars-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_scars-24.png" --file="$(srcdir)/src/gwy_scars-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_scars-24.png" "gwy_scars-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_scars-24.crush.png"; then mv -f "gwy_scars-24.crush.png" "gwy_scars-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_selections-24.png: $(srcdir)/src/gwy_selections-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_selections-24.png" --file="$(srcdir)/src/gwy_selections-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_selections-24.png" "gwy_selections-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_selections-24.crush.png"; then mv -f "gwy_selections-24.crush.png" "gwy_selections-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_shader-24.png: $(srcdir)/src/gwy_shader-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_shader-24.png" --file="$(srcdir)/src/gwy_shader-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_shader-24.png" "gwy_shader-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_shader-24.crush.png"; then mv -f "gwy_shader-24.crush.png" "gwy_shader-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_spectrum-24.png: $(srcdir)/src/gwy_spectrum-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_spectrum-24.png" --file="$(srcdir)/src/gwy_spectrum-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_spectrum-24.png" "gwy_spectrum-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_spectrum-24.crush.png"; then mv -f "gwy_spectrum-24.crush.png" "gwy_spectrum-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_spot_remove-24.png: $(srcdir)/src/gwy_spot_remove-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_spot_remove-24.png" --file="$(srcdir)/src/gwy_spot_remove-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_spot_remove-24.png" "gwy_spot_remove-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_spot_remove-24.crush.png"; then mv -f "gwy_spot_remove-24.crush.png" "gwy_spot_remove-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_stat_quantities-24.png: $(srcdir)/src/gwy_stat_quantities-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_stat_quantities-24.png" --file="$(srcdir)/src/gwy_stat_quantities-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_stat_quantities-24.png" "gwy_stat_quantities-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_stat_quantities-24.crush.png"; then mv -f "gwy_stat_quantities-24.crush.png" "gwy_stat_quantities-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_straighten_path-24.png: $(srcdir)/src/gwy_straighten_path-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_straighten_path-24.png" --file="$(srcdir)/src/gwy_straighten_path-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_straighten_path-24.png" "gwy_straighten_path-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_straighten_path-24.crush.png"; then mv -f "gwy_straighten_path-24.crush.png" "gwy_straighten_path-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_subscript-20.png: $(srcdir)/src/gwy_subscript-20.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=20 --export-height=20 --export-png="gwy_subscript-20.png" --file="$(srcdir)/src/gwy_subscript-20.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_subscript-20.png" "gwy_subscript-20.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_subscript-20.crush.png"; then mv -f "gwy_subscript-20.crush.png" "gwy_subscript-20.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_superscript-20.png: $(srcdir)/src/gwy_superscript-20.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=20 --export-height=20 --export-png="gwy_superscript-20.png" --file="$(srcdir)/src/gwy_superscript-20.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_superscript-20.png" "gwy_superscript-20.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_superscript-20.crush.png"; then mv -f "gwy_superscript-20.crush.png" "gwy_superscript-20.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_synthetic_ballistic_deposition-24.png: $(srcdir)/src/gwy_synthetic_ballistic_deposition-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_ballistic_deposition-24.png" --file="$(srcdir)/src/gwy_synthetic_ballistic_deposition-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_synthetic_ballistic_deposition-24.png" "gwy_synthetic_ballistic_deposition-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_synthetic_ballistic_deposition-24.crush.png"; then mv -f "gwy_synthetic_ballistic_deposition-24.crush.png" "gwy_synthetic_ballistic_deposition-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_synthetic_brownian_motion-24.png: $(srcdir)/src/gwy_synthetic_brownian_motion-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_brownian_motion-24.png" --file="$(srcdir)/src/gwy_synthetic_brownian_motion-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_synthetic_brownian_motion-24.png" "gwy_synthetic_brownian_motion-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_synthetic_brownian_motion-24.crush.png"; then mv -f "gwy_synthetic_brownian_motion-24.crush.png" "gwy_synthetic_brownian_motion-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_synthetic_columnar-24.png: $(srcdir)/src/gwy_synthetic_columnar-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_columnar-24.png" --file="$(srcdir)/src/gwy_synthetic_columnar-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_synthetic_columnar-24.png" "gwy_synthetic_columnar-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_synthetic_columnar-24.crush.png"; then mv -f "gwy_synthetic_columnar-24.crush.png" "gwy_synthetic_columnar-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_synthetic_diffusion-24.png: $(srcdir)/src/gwy_synthetic_diffusion-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_diffusion-24.png" --file="$(srcdir)/src/gwy_synthetic_diffusion-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_synthetic_diffusion-24.png" "gwy_synthetic_diffusion-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_synthetic_diffusion-24.crush.png"; then mv -f "gwy_synthetic_diffusion-24.crush.png" "gwy_synthetic_diffusion-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_synthetic_domains-24.png: $(srcdir)/src/gwy_synthetic_domains-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_domains-24.png" --file="$(srcdir)/src/gwy_synthetic_domains-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_synthetic_domains-24.png" "gwy_synthetic_domains-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_synthetic_domains-24.crush.png"; then mv -f "gwy_synthetic_domains-24.crush.png" "gwy_synthetic_domains-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_synthetic_fibres-24.png: $(srcdir)/src/gwy_synthetic_fibres-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_fibres-24.png" --file="$(srcdir)/src/gwy_synthetic_fibres-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_synthetic_fibres-24.png" "gwy_synthetic_fibres-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_synthetic_fibres-24.crush.png"; then mv -f "gwy_synthetic_fibres-24.crush.png" "gwy_synthetic_fibres-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_synthetic_lattice-24.png: $(srcdir)/src/gwy_synthetic_lattice-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_lattice-24.png" --file="$(srcdir)/src/gwy_synthetic_lattice-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_synthetic_lattice-24.png" "gwy_synthetic_lattice-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_synthetic_lattice-24.crush.png"; then mv -f "gwy_synthetic_lattice-24.crush.png" "gwy_synthetic_lattice-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_synthetic_line_noise-24.png: $(srcdir)/src/gwy_synthetic_line_noise-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_line_noise-24.png" --file="$(srcdir)/src/gwy_synthetic_line_noise-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_synthetic_line_noise-24.png" "gwy_synthetic_line_noise-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_synthetic_line_noise-24.crush.png"; then mv -f "gwy_synthetic_line_noise-24.crush.png" "gwy_synthetic_line_noise-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_synthetic_noise-24.png: $(srcdir)/src/gwy_synthetic_noise-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_noise-24.png" --file="$(srcdir)/src/gwy_synthetic_noise-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_synthetic_noise-24.png" "gwy_synthetic_noise-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_synthetic_noise-24.crush.png"; then mv -f "gwy_synthetic_noise-24.crush.png" "gwy_synthetic_noise-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_synthetic_objects-24.png: $(srcdir)/src/gwy_synthetic_objects-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_objects-24.png" --file="$(srcdir)/src/gwy_synthetic_objects-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_synthetic_objects-24.png" "gwy_synthetic_objects-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_synthetic_objects-24.crush.png"; then mv -f "gwy_synthetic_objects-24.crush.png" "gwy_synthetic_objects-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_synthetic_particles-24.png: $(srcdir)/src/gwy_synthetic_particles-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_particles-24.png" --file="$(srcdir)/src/gwy_synthetic_particles-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_synthetic_particles-24.png" "gwy_synthetic_particles-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_synthetic_particles-24.crush.png"; then mv -f "gwy_synthetic_particles-24.crush.png" "gwy_synthetic_particles-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_synthetic_pattern-24.png: $(srcdir)/src/gwy_synthetic_pattern-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_pattern-24.png" --file="$(srcdir)/src/gwy_synthetic_pattern-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_synthetic_pattern-24.png" "gwy_synthetic_pattern-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_synthetic_pattern-24.crush.png"; then mv -f "gwy_synthetic_pattern-24.crush.png" "gwy_synthetic_pattern-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_synthetic_phases-24.png: $(srcdir)/src/gwy_synthetic_phases-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_phases-24.png" --file="$(srcdir)/src/gwy_synthetic_phases-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_synthetic_phases-24.png" "gwy_synthetic_phases-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_synthetic_phases-24.crush.png"; then mv -f "gwy_synthetic_phases-24.crush.png" "gwy_synthetic_phases-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_synthetic_spectral-24.png: $(srcdir)/src/gwy_synthetic_spectral-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_spectral-24.png" --file="$(srcdir)/src/gwy_synthetic_spectral-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_synthetic_spectral-24.png" "gwy_synthetic_spectral-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_synthetic_spectral-24.crush.png"; then mv -f "gwy_synthetic_spectral-24.crush.png" "gwy_synthetic_spectral-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_synthetic_waves-24.png: $(srcdir)/src/gwy_synthetic_waves-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_synthetic_waves-24.png" --file="$(srcdir)/src/gwy_synthetic_waves-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_synthetic_waves-24.png" "gwy_synthetic_waves-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_synthetic_waves-24.crush.png"; then mv -f "gwy_synthetic_waves-24.crush.png" "gwy_synthetic_waves-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_tilt-24.png: $(srcdir)/src/gwy_tilt-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tilt-24.png" --file="$(srcdir)/src/gwy_tilt-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_tilt-24.png" "gwy_tilt-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_tilt-24.crush.png"; then mv -f "gwy_tilt-24.crush.png" "gwy_tilt-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_tip_dilation-24.png: $(srcdir)/src/gwy_tip_dilation-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tip_dilation-24.png" --file="$(srcdir)/src/gwy_tip_dilation-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_tip_dilation-24.png" "gwy_tip_dilation-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_tip_dilation-24.crush.png"; then mv -f "gwy_tip_dilation-24.crush.png" "gwy_tip_dilation-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_tip_erosion-24.png: $(srcdir)/src/gwy_tip_erosion-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tip_erosion-24.png" --file="$(srcdir)/src/gwy_tip_erosion-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_tip_erosion-24.png" "gwy_tip_erosion-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_tip_erosion-24.crush.png"; then mv -f "gwy_tip_erosion-24.crush.png" "gwy_tip_erosion-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_tip_estimation-24.png: $(srcdir)/src/gwy_tip_estimation-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tip_estimation-24.png" --file="$(srcdir)/src/gwy_tip_estimation-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_tip_estimation-24.png" "gwy_tip_estimation-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_tip_estimation-24.crush.png"; then mv -f "gwy_tip_estimation-24.crush.png" "gwy_tip_estimation-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_tip_indent_analyze-24.png: $(srcdir)/src/gwy_tip_indent_analyze-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tip_indent_analyze-24.png" --file="$(srcdir)/src/gwy_tip_indent_analyze-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_tip_indent_analyze-24.png" "gwy_tip_indent_analyze-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_tip_indent_analyze-24.crush.png"; then mv -f "gwy_tip_indent_analyze-24.crush.png" "gwy_tip_indent_analyze-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_tip_lateral_force-24.png: $(srcdir)/src/gwy_tip_lateral_force-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tip_lateral_force-24.png" --file="$(srcdir)/src/gwy_tip_lateral_force-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_tip_lateral_force-24.png" "gwy_tip_lateral_force-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_tip_lateral_force-24.crush.png"; then mv -f "gwy_tip_lateral_force-24.crush.png" "gwy_tip_lateral_force-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_tip_map-24.png: $(srcdir)/src/gwy_tip_map-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tip_map-24.png" --file="$(srcdir)/src/gwy_tip_map-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_tip_map-24.png" "gwy_tip_map-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_tip_map-24.crush.png"; then mv -f "gwy_tip_map-24.crush.png" "gwy_tip_map-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_tip_model-24.png: $(srcdir)/src/gwy_tip_model-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tip_model-24.png" --file="$(srcdir)/src/gwy_tip_model-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_tip_model-24.png" "gwy_tip_model-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_tip_model-24.crush.png"; then mv -f "gwy_tip_model-24.crush.png" "gwy_tip_model-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_tip_pid-24.png: $(srcdir)/src/gwy_tip_pid-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_tip_pid-24.png" --file="$(srcdir)/src/gwy_tip_pid-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_tip_pid-24.png" "gwy_tip_pid-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_tip_pid-24.crush.png"; then mv -f "gwy_tip_pid-24.crush.png" "gwy_tip_pid-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_unrotate-24.png: $(srcdir)/src/gwy_unrotate-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_unrotate-24.png" --file="$(srcdir)/src/gwy_unrotate-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_unrotate-24.png" "gwy_unrotate-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_unrotate-24.crush.png"; then mv -f "gwy_unrotate-24.crush.png" "gwy_unrotate-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_value_invert-24.png: $(srcdir)/src/gwy_value_invert-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_value_invert-24.png" --file="$(srcdir)/src/gwy_value_invert-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_value_invert-24.png" "gwy_value_invert-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_value_invert-24.crush.png"; then mv -f "gwy_value_invert-24.crush.png" "gwy_value_invert-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_volume-24.png: $(srcdir)/src/gwy_volume-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volume-24.png" --file="$(srcdir)/src/gwy_volume-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_volume-24.png" "gwy_volume-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_volume-24.crush.png"; then mv -f "gwy_volume-24.crush.png" "gwy_volume-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_volume_calibrate-24.png: $(srcdir)/src/gwy_volume_calibrate-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volume_calibrate-24.png" --file="$(srcdir)/src/gwy_volume_calibrate-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_volume_calibrate-24.png" "gwy_volume_calibrate-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_volume_calibrate-24.crush.png"; then mv -f "gwy_volume_calibrate-24.crush.png" "gwy_volume_calibrate-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_volume_dimensions-24.png: $(srcdir)/src/gwy_volume_dimensions-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volume_dimensions-24.png" --file="$(srcdir)/src/gwy_volume_dimensions-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_volume_dimensions-24.png" "gwy_volume_dimensions-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_volume_dimensions-24.crush.png"; then mv -f "gwy_volume_dimensions-24.crush.png" "gwy_volume_dimensions-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_volume_fd-24.png: $(srcdir)/src/gwy_volume_fd-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volume_fd-24.png" --file="$(srcdir)/src/gwy_volume_fd-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_volume_fd-24.png" "gwy_volume_fd-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_volume_fd-24.crush.png"; then mv -f "gwy_volume_fd-24.crush.png" "gwy_volume_fd-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_volume_invert-24.png: $(srcdir)/src/gwy_volume_invert-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volume_invert-24.png" --file="$(srcdir)/src/gwy_volume_invert-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_volume_invert-24.png" "gwy_volume_invert-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_volume_invert-24.crush.png"; then mv -f "gwy_volume_invert-24.crush.png" "gwy_volume_invert-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_volume_kmeans-24.png: $(srcdir)/src/gwy_volume_kmeans-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volume_kmeans-24.png" --file="$(srcdir)/src/gwy_volume_kmeans-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_volume_kmeans-24.png" "gwy_volume_kmeans-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_volume_kmeans-24.crush.png"; then mv -f "gwy_volume_kmeans-24.crush.png" "gwy_volume_kmeans-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_volume_kmedians-24.png: $(srcdir)/src/gwy_volume_kmedians-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volume_kmedians-24.png" --file="$(srcdir)/src/gwy_volume_kmedians-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_volume_kmedians-24.png" "gwy_volume_kmedians-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_volume_kmedians-24.crush.png"; then mv -f "gwy_volume_kmedians-24.crush.png" "gwy_volume_kmedians-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_volume_slice-24.png: $(srcdir)/src/gwy_volume_slice-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volume_slice-24.png" --file="$(srcdir)/src/gwy_volume_slice-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_volume_slice-24.png" "gwy_volume_slice-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_volume_slice-24.crush.png"; then mv -f "gwy_volume_slice-24.crush.png" "gwy_volume_slice-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_volumize-24.png: $(srcdir)/src/gwy_volumize-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volumize-24.png" --file="$(srcdir)/src/gwy_volumize-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_volumize-24.png" "gwy_volumize-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_volumize-24.crush.png"; then mv -f "gwy_volumize-24.crush.png" "gwy_volumize-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_volumize_layers-24.png: $(srcdir)/src/gwy_volumize_layers-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_volumize_layers-24.png" --file="$(srcdir)/src/gwy_volumize_layers-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_volumize_layers-24.png" "gwy_volumize_layers-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_volumize_layers-24.crush.png"; then mv -f "gwy_volumize_layers-24.crush.png" "gwy_volumize_layers-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_xy_denoise-24.png: $(srcdir)/src/gwy_xy_denoise-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_xy_denoise-24.png" --file="$(srcdir)/src/gwy_xy_denoise-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_xy_denoise-24.png" "gwy_xy_denoise-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_xy_denoise-24.crush.png"; then mv -f "gwy_xy_denoise-24.crush.png" "gwy_xy_denoise-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_zero_mean-24.png: $(srcdir)/src/gwy_zero_mean-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_zero_mean-24.png" --file="$(srcdir)/src/gwy_zero_mean-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_zero_mean-24.png" "gwy_zero_mean-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_zero_mean-24.crush.png"; then mv -f "gwy_zero_mean-24.crush.png" "gwy_zero_mean-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_zoom_1_1-24.png: $(srcdir)/src/gwy_zoom_1_1-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_zoom_1_1-24.png" --file="$(srcdir)/src/gwy_zoom_1_1-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_zoom_1_1-24.png" "gwy_zoom_1_1-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_zoom_1_1-24.crush.png"; then mv -f "gwy_zoom_1_1-24.crush.png" "gwy_zoom_1_1-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_zoom_fit-24.png: $(srcdir)/src/gwy_zoom_fit-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_zoom_fit-24.png" --file="$(srcdir)/src/gwy_zoom_fit-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_zoom_fit-24.png" "gwy_zoom_fit-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_zoom_fit-24.crush.png"; then mv -f "gwy_zoom_fit-24.crush.png" "gwy_zoom_fit-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_zoom_in-24.png: $(srcdir)/src/gwy_zoom_in-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_zoom_in-24.png" --file="$(srcdir)/src/gwy_zoom_in-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_zoom_in-24.png" "gwy_zoom_in-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_zoom_in-24.crush.png"; then mv -f "gwy_zoom_in-24.crush.png" "gwy_zoom_in-24.png"; fi
+
+ at MAINTAINER_MODE_TRUE@gwy_zoom_out-24.png: $(srcdir)/src/gwy_zoom_out-24.svg
+ at MAINTAINER_MODE_TRUE@	$(INKSCAPE_RENDER_PNG) --export-width=24 --export-height=24 --export-png="gwy_zoom_out-24.png" --file="$(srcdir)/src/gwy_zoom_out-24.svg"
+ at MAINTAINER_MODE_TRUE@	$(PNGCRUSH) -q -brute "gwy_zoom_out-24.png" "gwy_zoom_out-24.crush.png"
+ at MAINTAINER_MODE_TRUE@	if test -s "gwy_zoom_out-24.crush.png"; then mv -f "gwy_zoom_out-24.crush.png" "gwy_zoom_out-24.png"; fi
+# @@@ GENERATED STOCK LIST END @@@
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/pixmaps/gwy_3d_base-24.png b/pixmaps/gwy_3d_base-24.png
index e401b4c..6f5f143 100644
Binary files a/pixmaps/gwy_3d_base-24.png and b/pixmaps/gwy_3d_base-24.png differ
diff --git a/pixmaps/gwy_arithmetic-24.png b/pixmaps/gwy_arithmetic-24.png
index 1f5fa6f..5c44344 100644
Binary files a/pixmaps/gwy_arithmetic-24.png and b/pixmaps/gwy_arithmetic-24.png differ
diff --git a/pixmaps/gwy_arithmetic-24.xcf b/pixmaps/gwy_arithmetic-24.xcf
deleted file mode 100644
index 45e9e07..0000000
Binary files a/pixmaps/gwy_arithmetic-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_bold-20.png b/pixmaps/gwy_bold-20.png
index 547d29b..d3e0d70 100644
Binary files a/pixmaps/gwy_bold-20.png and b/pixmaps/gwy_bold-20.png differ
diff --git a/pixmaps/gwy_cantilever-24.png b/pixmaps/gwy_cantilever-24.png
index 9540e6a..5a31698 100644
Binary files a/pixmaps/gwy_cantilever-24.png and b/pixmaps/gwy_cantilever-24.png differ
diff --git a/pixmaps/gwy_cantilever-24.xcf b/pixmaps/gwy_cantilever-24.xcf
deleted file mode 100644
index 521cbf6..0000000
Binary files a/pixmaps/gwy_cantilever-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_color_range-24.png b/pixmaps/gwy_color_range-24.png
index c86d1b2..b2de5e6 100644
Binary files a/pixmaps/gwy_color_range-24.png and b/pixmaps/gwy_color_range-24.png differ
diff --git a/pixmaps/gwy_color_range-24.xcf b/pixmaps/gwy_color_range-24.xcf
deleted file mode 100644
index 4e3cd93..0000000
Binary files a/pixmaps/gwy_color_range-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_color_range_adaptive-24.png b/pixmaps/gwy_color_range_adaptive-24.png
index a13f95a..5425360 100644
Binary files a/pixmaps/gwy_color_range_adaptive-24.png and b/pixmaps/gwy_color_range_adaptive-24.png differ
diff --git a/pixmaps/gwy_color_range_auto-24.png b/pixmaps/gwy_color_range_auto-24.png
index b6b1102..81e5b8b 100644
Binary files a/pixmaps/gwy_color_range_auto-24.png and b/pixmaps/gwy_color_range_auto-24.png differ
diff --git a/pixmaps/gwy_color_range_fixed-24.png b/pixmaps/gwy_color_range_fixed-24.png
index 5a3c5ac..6eb4a09 100644
Binary files a/pixmaps/gwy_color_range_fixed-24.png and b/pixmaps/gwy_color_range_fixed-24.png differ
diff --git a/pixmaps/gwy_color_range_full-24.png b/pixmaps/gwy_color_range_full-24.png
index db2c219..f2039c4 100644
Binary files a/pixmaps/gwy_color_range_full-24.png and b/pixmaps/gwy_color_range_full-24.png differ
diff --git a/pixmaps/gwy_convolution-24.png b/pixmaps/gwy_convolution-24.png
index c2834c0..df7a926 100644
Binary files a/pixmaps/gwy_convolution-24.png and b/pixmaps/gwy_convolution-24.png differ
diff --git a/pixmaps/gwy_correct_affine-24.png b/pixmaps/gwy_correct_affine-24.png
index d7af10e..b0c0490 100644
Binary files a/pixmaps/gwy_correct_affine-24.png and b/pixmaps/gwy_correct_affine-24.png differ
diff --git a/pixmaps/gwy_correlation_mask-24.png b/pixmaps/gwy_correlation_mask-24.png
new file mode 100644
index 0000000..fac36f4
Binary files /dev/null and b/pixmaps/gwy_correlation_mask-24.png differ
diff --git a/pixmaps/gwy_crop-24.png b/pixmaps/gwy_crop-24.png
index 34137a9..69f5112 100644
Binary files a/pixmaps/gwy_crop-24.png and b/pixmaps/gwy_crop-24.png differ
diff --git a/pixmaps/gwy_crop-24.xcf b/pixmaps/gwy_crop-24.xcf
deleted file mode 100644
index eb697a8..0000000
Binary files a/pixmaps/gwy_crop-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_cwt-24.png b/pixmaps/gwy_cwt-24.png
index de2ae1b..abc8b1f 100644
Binary files a/pixmaps/gwy_cwt-24.png and b/pixmaps/gwy_cwt-24.png differ
diff --git a/pixmaps/gwy_data_measure-24.png b/pixmaps/gwy_data_measure-24.png
index b2bfd9b..f146f37 100644
Binary files a/pixmaps/gwy_data_measure-24.png and b/pixmaps/gwy_data_measure-24.png differ
diff --git a/pixmaps/gwy_direction-24.xcf b/pixmaps/gwy_direction-24.xcf
deleted file mode 100644
index 81b8781..0000000
Binary files a/pixmaps/gwy_direction-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_disconnected-24.png b/pixmaps/gwy_disconnected-24.png
new file mode 100644
index 0000000..4a7be6b
Binary files /dev/null and b/pixmaps/gwy_disconnected-24.png differ
diff --git a/pixmaps/gwy_distance-24.png b/pixmaps/gwy_distance-24.png
index 16ec0e2..a0d3d53 100644
Binary files a/pixmaps/gwy_distance-24.png and b/pixmaps/gwy_distance-24.png differ
diff --git a/pixmaps/gwy_distance_transform-24.png b/pixmaps/gwy_distance_transform-24.png
index dbc766c..035196b 100644
Binary files a/pixmaps/gwy_distance_transform-24.png and b/pixmaps/gwy_distance_transform-24.png differ
diff --git a/pixmaps/gwy_distribution_angle-24.png b/pixmaps/gwy_distribution_angle-24.png
index 4ad82c9..330004a 100644
Binary files a/pixmaps/gwy_distribution_angle-24.png and b/pixmaps/gwy_distribution_angle-24.png differ
diff --git a/pixmaps/gwy_distribution_slope-24.png b/pixmaps/gwy_distribution_slope-24.png
index 86a891e..ac2ef7e 100644
Binary files a/pixmaps/gwy_distribution_slope-24.png and b/pixmaps/gwy_distribution_slope-24.png differ
diff --git a/pixmaps/gwy_drift-24.png b/pixmaps/gwy_drift-24.png
index 1661032..51472c1 100644
Binary files a/pixmaps/gwy_drift-24.png and b/pixmaps/gwy_drift-24.png differ
diff --git a/pixmaps/gwy_dwt-24.png b/pixmaps/gwy_dwt-24.png
index 92f8059..8424682 100644
Binary files a/pixmaps/gwy_dwt-24.png and b/pixmaps/gwy_dwt-24.png differ
diff --git a/pixmaps/gwy_edge-24.png b/pixmaps/gwy_edge-24.png
index be816b1..9b6937c 100644
Binary files a/pixmaps/gwy_edge-24.png and b/pixmaps/gwy_edge-24.png differ
diff --git a/pixmaps/gwy_edge-24.xcf b/pixmaps/gwy_edge-24.xcf
deleted file mode 100644
index cf81845..0000000
Binary files a/pixmaps/gwy_edge-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_enforce_distribution-24.png b/pixmaps/gwy_enforce_distribution-24.png
index 6912bf2..7152df2 100644
Binary files a/pixmaps/gwy_enforce_distribution-24.png and b/pixmaps/gwy_enforce_distribution-24.png differ
diff --git a/pixmaps/gwy_entropy-24.png b/pixmaps/gwy_entropy-24.png
index c3b0027..baaae0a 100644
Binary files a/pixmaps/gwy_entropy-24.png and b/pixmaps/gwy_entropy-24.png differ
diff --git a/pixmaps/gwy_extend-24.png b/pixmaps/gwy_extend-24.png
index ab46f12..dd9abce 100644
Binary files a/pixmaps/gwy_extend-24.png and b/pixmaps/gwy_extend-24.png differ
diff --git a/pixmaps/gwy_extract_path-24.png b/pixmaps/gwy_extract_path-24.png
index 7609af4..3929ae9 100644
Binary files a/pixmaps/gwy_extract_path-24.png and b/pixmaps/gwy_extract_path-24.png differ
diff --git a/pixmaps/gwy_extract_path-24.xcf b/pixmaps/gwy_extract_path-24.xcf
deleted file mode 100644
index 972370f..0000000
Binary files a/pixmaps/gwy_extract_path-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_facet_level-24.png b/pixmaps/gwy_facet_level-24.png
index ddb9e71..e16dd0b 100644
Binary files a/pixmaps/gwy_facet_level-24.png and b/pixmaps/gwy_facet_level-24.png differ
diff --git a/pixmaps/gwy_favourite-24.png b/pixmaps/gwy_favourite-24.png
index ee6b598..a097321 100644
Binary files a/pixmaps/gwy_favourite-24.png and b/pixmaps/gwy_favourite-24.png differ
diff --git a/pixmaps/gwy_favourite-24.xcf b/pixmaps/gwy_favourite-24.xcf
deleted file mode 100644
index 96c4b18..0000000
Binary files a/pixmaps/gwy_favourite-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_fft-24.png b/pixmaps/gwy_fft-24.png
index 0fa3b30..ed6fb92 100644
Binary files a/pixmaps/gwy_fft-24.png and b/pixmaps/gwy_fft-24.png differ
diff --git a/pixmaps/gwy_fft-24.xcf b/pixmaps/gwy_fft-24.xcf
deleted file mode 100644
index 44e053c..0000000
Binary files a/pixmaps/gwy_fft-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_fft_2d-24.png b/pixmaps/gwy_fft_2d-24.png
index 1d0565c..895582a 100644
Binary files a/pixmaps/gwy_fft_2d-24.png and b/pixmaps/gwy_fft_2d-24.png differ
diff --git a/pixmaps/gwy_fft_filter_1d-24.png b/pixmaps/gwy_fft_filter_1d-24.png
new file mode 100644
index 0000000..d123ffd
Binary files /dev/null and b/pixmaps/gwy_fft_filter_1d-24.png differ
diff --git a/pixmaps/gwy_fft_filter_2d-24.png b/pixmaps/gwy_fft_filter_2d-24.png
index 898f74f..78cdfd8 100644
Binary files a/pixmaps/gwy_fft_filter_2d-24.png and b/pixmaps/gwy_fft_filter_2d-24.png differ
diff --git a/pixmaps/gwy_filter-24.png b/pixmaps/gwy_filter-24.png
index 907adce..51b2792 100644
Binary files a/pixmaps/gwy_filter-24.png and b/pixmaps/gwy_filter-24.png differ
diff --git a/pixmaps/gwy_filter-24.xcf b/pixmaps/gwy_filter-24.xcf
deleted file mode 100644
index e74265e..0000000
Binary files a/pixmaps/gwy_filter-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_find_peaks-24.png b/pixmaps/gwy_find_peaks-24.png
index 548aa29..dabc05e 100644
Binary files a/pixmaps/gwy_find_peaks-24.png and b/pixmaps/gwy_find_peaks-24.png differ
diff --git a/pixmaps/gwy_fit_shape-24.png b/pixmaps/gwy_fit_shape-24.png
new file mode 100644
index 0000000..222fdcf
Binary files /dev/null and b/pixmaps/gwy_fit_shape-24.png differ
diff --git a/pixmaps/gwy_fix_zero-24.png b/pixmaps/gwy_fix_zero-24.png
index 2ff6836..a9c36e4 100644
Binary files a/pixmaps/gwy_fix_zero-24.png and b/pixmaps/gwy_fix_zero-24.png differ
diff --git a/pixmaps/gwy_flip_horizontally-24.png b/pixmaps/gwy_flip_horizontally-24.png
index 1b2a999..4a3e8ed 100644
Binary files a/pixmaps/gwy_flip_horizontally-24.png and b/pixmaps/gwy_flip_horizontally-24.png differ
diff --git a/pixmaps/gwy_flip_horizontally-24.xcf b/pixmaps/gwy_flip_horizontally-24.xcf
deleted file mode 100644
index e6b49de..0000000
Binary files a/pixmaps/gwy_flip_horizontally-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_flip_vertically-24.png b/pixmaps/gwy_flip_vertically-24.png
index d5f3d44..3169edb 100644
Binary files a/pixmaps/gwy_flip_vertically-24.png and b/pixmaps/gwy_flip_vertically-24.png differ
diff --git a/pixmaps/gwy_flip_vertically-24.xcf b/pixmaps/gwy_flip_vertically-24.xcf
deleted file mode 100644
index 0a15a0c..0000000
Binary files a/pixmaps/gwy_flip_vertically-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_fractal-24.png b/pixmaps/gwy_fractal-24.png
index a5020fe..11635e5 100644
Binary files a/pixmaps/gwy_fractal-24.png and b/pixmaps/gwy_fractal-24.png differ
diff --git a/pixmaps/gwy_fractal_correction-24.png b/pixmaps/gwy_fractal_correction-24.png
new file mode 100644
index 0000000..62a93ff
Binary files /dev/null and b/pixmaps/gwy_fractal_correction-24.png differ
diff --git a/pixmaps/gwy_fractal_measure-24.png b/pixmaps/gwy_fractal_measure-24.png
new file mode 100644
index 0000000..69eb8f8
Binary files /dev/null and b/pixmaps/gwy_fractal_measure-24.png differ
diff --git a/pixmaps/gwy_gl_material-16.png b/pixmaps/gwy_gl_material-16.png
index 01d8395..d8d6dee 100644
Binary files a/pixmaps/gwy_gl_material-16.png and b/pixmaps/gwy_gl_material-16.png differ
diff --git a/pixmaps/gwy_gl_material-16.xcf b/pixmaps/gwy_gl_material-16.xcf
deleted file mode 100644
index c72e80b..0000000
Binary files a/pixmaps/gwy_gl_material-16.xcf and /dev/null differ
diff --git a/pixmaps/gwy_gradient-24.xcf b/pixmaps/gwy_gradient-24.xcf
deleted file mode 100644
index 2a0c5f8..0000000
Binary files a/pixmaps/gwy_gradient-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_gradient_horizontal-24.png b/pixmaps/gwy_gradient_horizontal-24.png
index 0cbf614..0a7fdc9 100644
Binary files a/pixmaps/gwy_gradient_horizontal-24.png and b/pixmaps/gwy_gradient_horizontal-24.png differ
diff --git a/pixmaps/gwy_gradient_vertical-24.png b/pixmaps/gwy_gradient_vertical-24.png
index 39bf6bc..efbb7d8 100644
Binary files a/pixmaps/gwy_gradient_vertical-24.png and b/pixmaps/gwy_gradient_vertical-24.png differ
diff --git a/pixmaps/gwy_grain_correlation-24.png b/pixmaps/gwy_grain_correlation-24.png
index 0889d2d..44c6577 100644
Binary files a/pixmaps/gwy_grain_correlation-24.png and b/pixmaps/gwy_grain_correlation-24.png differ
diff --git a/pixmaps/gwy_grain_exscribed_circle-24.png b/pixmaps/gwy_grain_exscribed_circle-24.png
index ad5cbba..def1093 100644
Binary files a/pixmaps/gwy_grain_exscribed_circle-24.png and b/pixmaps/gwy_grain_exscribed_circle-24.png differ
diff --git a/pixmaps/gwy_grain_inscribed_circle-24.png b/pixmaps/gwy_grain_inscribed_circle-24.png
index 0d80bd1..eba6ac1 100644
Binary files a/pixmaps/gwy_grain_inscribed_circle-24.png and b/pixmaps/gwy_grain_inscribed_circle-24.png differ
diff --git a/pixmaps/gwy_grains-24.png b/pixmaps/gwy_grains-24.png
index 2d77de1..339081e 100644
Binary files a/pixmaps/gwy_grains-24.png and b/pixmaps/gwy_grains-24.png differ
diff --git a/pixmaps/gwy_grains-24.xcf b/pixmaps/gwy_grains-24.xcf
deleted file mode 100644
index dc0c8d8..0000000
Binary files a/pixmaps/gwy_grains-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_grains_edge-24.png b/pixmaps/gwy_grains_edge-24.png
index 9620f41..1481114 100644
Binary files a/pixmaps/gwy_grains_edge-24.png and b/pixmaps/gwy_grains_edge-24.png differ
diff --git a/pixmaps/gwy_grains_edge_remove-24.png b/pixmaps/gwy_grains_edge_remove-24.png
index 21666de..51dd823 100644
Binary files a/pixmaps/gwy_grains_edge_remove-24.png and b/pixmaps/gwy_grains_edge_remove-24.png differ
diff --git a/pixmaps/gwy_grains_graph-24.png b/pixmaps/gwy_grains_graph-24.png
index fd453a8..de6b5ed 100644
Binary files a/pixmaps/gwy_grains_graph-24.png and b/pixmaps/gwy_grains_graph-24.png differ
diff --git a/pixmaps/gwy_grains_measure-24.png b/pixmaps/gwy_grains_measure-24.png
index 6991688..594f902 100644
Binary files a/pixmaps/gwy_grains_measure-24.png and b/pixmaps/gwy_grains_measure-24.png differ
diff --git a/pixmaps/gwy_grains_remove-24.png b/pixmaps/gwy_grains_remove-24.png
index f0a57b9..1331f36 100644
Binary files a/pixmaps/gwy_grains_remove-24.png and b/pixmaps/gwy_grains_remove-24.png differ
diff --git a/pixmaps/gwy_grains_water-24.png b/pixmaps/gwy_grains_water-24.png
index c61d533..ce98629 100644
Binary files a/pixmaps/gwy_grains_water-24.png and b/pixmaps/gwy_grains_water-24.png differ
diff --git a/pixmaps/gwy_graph-24.png b/pixmaps/gwy_graph-24.png
index 2311387..08bc1fb 100644
Binary files a/pixmaps/gwy_graph-24.png and b/pixmaps/gwy_graph-24.png differ
diff --git a/pixmaps/gwy_graph-24.xcf b/pixmaps/gwy_graph-24.xcf
deleted file mode 100644
index a34de05..0000000
Binary files a/pixmaps/gwy_graph-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_graph_align-24.png b/pixmaps/gwy_graph_align-24.png
index e54ccfc..7d5d8ab 100644
Binary files a/pixmaps/gwy_graph_align-24.png and b/pixmaps/gwy_graph_align-24.png differ
diff --git a/pixmaps/gwy_graph_cut-24.png b/pixmaps/gwy_graph_cut-24.png
index e9667bc..afbb068 100644
Binary files a/pixmaps/gwy_graph_cut-24.png and b/pixmaps/gwy_graph_cut-24.png differ
diff --git a/pixmaps/gwy_graph_dos-24.png b/pixmaps/gwy_graph_dos-24.png
index be176ea..0b23839 100644
Binary files a/pixmaps/gwy_graph_dos-24.png and b/pixmaps/gwy_graph_dos-24.png differ
diff --git a/pixmaps/gwy_graph_export_ascii-24.png b/pixmaps/gwy_graph_export_ascii-24.png
index f87cb0e..ebcf1cc 100644
Binary files a/pixmaps/gwy_graph_export_ascii-24.png and b/pixmaps/gwy_graph_export_ascii-24.png differ
diff --git a/pixmaps/gwy_graph_export_png-24.png b/pixmaps/gwy_graph_export_png-24.png
index bc4ecc2..ec0ba64 100644
Binary files a/pixmaps/gwy_graph_export_png-24.png and b/pixmaps/gwy_graph_export_png-24.png differ
diff --git a/pixmaps/gwy_graph_export_vector-24.png b/pixmaps/gwy_graph_export_vector-24.png
index 71b6539..9fc43c3 100644
Binary files a/pixmaps/gwy_graph_export_vector-24.png and b/pixmaps/gwy_graph_export_vector-24.png differ
diff --git a/pixmaps/gwy_graph_fd-24.png b/pixmaps/gwy_graph_fd-24.png
index c2f3b7a..a28e54b 100644
Binary files a/pixmaps/gwy_graph_fd-24.png and b/pixmaps/gwy_graph_fd-24.png differ
diff --git a/pixmaps/gwy_graph_filter-24.png b/pixmaps/gwy_graph_filter-24.png
index 80cf236..5b3ba6a 100644
Binary files a/pixmaps/gwy_graph_filter-24.png and b/pixmaps/gwy_graph_filter-24.png differ
diff --git a/pixmaps/gwy_graph_function-24.png b/pixmaps/gwy_graph_function-24.png
index 8d3c0c5..7e868b2 100644
Binary files a/pixmaps/gwy_graph_function-24.png and b/pixmaps/gwy_graph_function-24.png differ
diff --git a/pixmaps/gwy_graph_halfgauss-24.png b/pixmaps/gwy_graph_halfgauss-24.png
index ed0ef6c..83b030f 100644
Binary files a/pixmaps/gwy_graph_halfgauss-24.png and b/pixmaps/gwy_graph_halfgauss-24.png differ
diff --git a/pixmaps/gwy_graph_level-24.png b/pixmaps/gwy_graph_level-24.png
index dee1168..fc824fa 100644
Binary files a/pixmaps/gwy_graph_level-24.png and b/pixmaps/gwy_graph_level-24.png differ
diff --git a/pixmaps/gwy_graph_measure-24.png b/pixmaps/gwy_graph_measure-24.png
index 7b02b42..bc563d1 100644
Binary files a/pixmaps/gwy_graph_measure-24.png and b/pixmaps/gwy_graph_measure-24.png differ
diff --git a/pixmaps/gwy_graph_palette-24.png b/pixmaps/gwy_graph_palette-24.png
index 73298e9..7669ef1 100644
Binary files a/pixmaps/gwy_graph_palette-24.png and b/pixmaps/gwy_graph_palette-24.png differ
diff --git a/pixmaps/gwy_graph_pointer-24.png b/pixmaps/gwy_graph_pointer-24.png
index c7059fe..37a53c8 100644
Binary files a/pixmaps/gwy_graph_pointer-24.png and b/pixmaps/gwy_graph_pointer-24.png differ
diff --git a/pixmaps/gwy_graph_ruler-24.png b/pixmaps/gwy_graph_ruler-24.png
index d7c016a..a0a1585 100644
Binary files a/pixmaps/gwy_graph_ruler-24.png and b/pixmaps/gwy_graph_ruler-24.png differ
diff --git a/pixmaps/gwy_graph_vertical-24.png b/pixmaps/gwy_graph_vertical-24.png
index ab82996..708736c 100644
Binary files a/pixmaps/gwy_graph_vertical-24.png and b/pixmaps/gwy_graph_vertical-24.png differ
diff --git a/pixmaps/gwy_graph_zoom-24.xcf b/pixmaps/gwy_graph_zoom-24.xcf
deleted file mode 100644
index ef446d0..0000000
Binary files a/pixmaps/gwy_graph_zoom-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_graph_zoom_fit-24.png b/pixmaps/gwy_graph_zoom_fit-24.png
index 25d61be..173423b 100644
Binary files a/pixmaps/gwy_graph_zoom_fit-24.png and b/pixmaps/gwy_graph_zoom_fit-24.png differ
diff --git a/pixmaps/gwy_graph_zoom_in-24.png b/pixmaps/gwy_graph_zoom_in-24.png
index 4d1a4c6..a07015e 100644
Binary files a/pixmaps/gwy_graph_zoom_in-24.png and b/pixmaps/gwy_graph_zoom_in-24.png differ
diff --git a/pixmaps/gwy_graph_zoom_out-24.png b/pixmaps/gwy_graph_zoom_out-24.png
index 599752c..d39e0ec 100644
Binary files a/pixmaps/gwy_graph_zoom_out-24.png and b/pixmaps/gwy_graph_zoom_out-24.png differ
diff --git a/pixmaps/gwy_hough-24.png b/pixmaps/gwy_hough-24.png
index e5d0aee..e1291f7 100644
Binary files a/pixmaps/gwy_hough-24.png and b/pixmaps/gwy_hough-24.png differ
diff --git a/pixmaps/gwy_immerse-24.png b/pixmaps/gwy_immerse-24.png
index 47bf80f..92f8ff2 100644
Binary files a/pixmaps/gwy_immerse-24.png and b/pixmaps/gwy_immerse-24.png differ
diff --git a/pixmaps/gwy_iso_roughness-24.png b/pixmaps/gwy_iso_roughness-24.png
index 6892a15..c110932 100644
Binary files a/pixmaps/gwy_iso_roughness-24.png and b/pixmaps/gwy_iso_roughness-24.png differ
diff --git a/pixmaps/gwy_iso_roughness-24.xcf b/pixmaps/gwy_iso_roughness-24.xcf
deleted file mode 100644
index e7a7744..0000000
Binary files a/pixmaps/gwy_iso_roughness-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_italic-20.png b/pixmaps/gwy_italic-20.png
index c72d6c0..81fbb46 100644
Binary files a/pixmaps/gwy_italic-20.png and b/pixmaps/gwy_italic-20.png differ
diff --git a/pixmaps/gwy_less-24.png b/pixmaps/gwy_less-24.png
index d29b178..65b46a9 100644
Binary files a/pixmaps/gwy_less-24.png and b/pixmaps/gwy_less-24.png differ
diff --git a/pixmaps/gwy_less-24.xcf b/pixmaps/gwy_less-24.xcf
deleted file mode 100644
index 485c053..0000000
Binary files a/pixmaps/gwy_less-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_level-24.png b/pixmaps/gwy_level-24.png
index 495f59a..4cf0fb8 100644
Binary files a/pixmaps/gwy_level-24.png and b/pixmaps/gwy_level-24.png differ
diff --git a/pixmaps/gwy_level-24.xcf b/pixmaps/gwy_level-24.xcf
deleted file mode 100644
index 64fa71a..0000000
Binary files a/pixmaps/gwy_level-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_level_flatten_base-24.png b/pixmaps/gwy_level_flatten_base-24.png
index d1a2be0..d2abfa5 100644
Binary files a/pixmaps/gwy_level_flatten_base-24.png and b/pixmaps/gwy_level_flatten_base-24.png differ
diff --git a/pixmaps/gwy_level_median-24.png b/pixmaps/gwy_level_median-24.png
index 5d5bfee..dfc9653 100644
Binary files a/pixmaps/gwy_level_median-24.png and b/pixmaps/gwy_level_median-24.png differ
diff --git a/pixmaps/gwy_level_triangle-24.png b/pixmaps/gwy_level_triangle-24.png
index 2e62aee..9bf2a46 100644
Binary files a/pixmaps/gwy_level_triangle-24.png and b/pixmaps/gwy_level_triangle-24.png differ
diff --git a/pixmaps/gwy_light_rotate-24.png b/pixmaps/gwy_light_rotate-24.png
index 78267d7..9a62056 100644
Binary files a/pixmaps/gwy_light_rotate-24.png and b/pixmaps/gwy_light_rotate-24.png differ
diff --git a/pixmaps/gwy_light_rotate-24.xcf b/pixmaps/gwy_light_rotate-24.xcf
deleted file mode 100644
index 91fc5f2..0000000
Binary files a/pixmaps/gwy_light_rotate-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_line_level-24.png b/pixmaps/gwy_line_level-24.png
index b7829a2..9b47092 100644
Binary files a/pixmaps/gwy_line_level-24.png and b/pixmaps/gwy_line_level-24.png differ
diff --git a/pixmaps/gwy_load_debug-20.png b/pixmaps/gwy_load_debug-20.png
index 5ae1c78..31d40ce 100644
Binary files a/pixmaps/gwy_load_debug-20.png and b/pixmaps/gwy_load_debug-20.png differ
diff --git a/pixmaps/gwy_load_info-20.png b/pixmaps/gwy_load_info-20.png
index f8b1cd7..9de7202 100644
Binary files a/pixmaps/gwy_load_info-20.png and b/pixmaps/gwy_load_info-20.png differ
diff --git a/pixmaps/gwy_load_message-20.xcf b/pixmaps/gwy_load_message-20.xcf
deleted file mode 100644
index 998a841..0000000
Binary files a/pixmaps/gwy_load_message-20.xcf and /dev/null differ
diff --git a/pixmaps/gwy_load_warning-20.png b/pixmaps/gwy_load_warning-20.png
index b2d6bca..3c38083 100644
Binary files a/pixmaps/gwy_load_warning-20.png and b/pixmaps/gwy_load_warning-20.png differ
diff --git a/pixmaps/gwy_local_slope-24.png b/pixmaps/gwy_local_slope-24.png
index 250abd8..5d1edf9 100644
Binary files a/pixmaps/gwy_local_slope-24.png and b/pixmaps/gwy_local_slope-24.png differ
diff --git a/pixmaps/gwy_logscale_horizontal-24.png b/pixmaps/gwy_logscale_horizontal-24.png
index 0424b6c..c4c47b4 100644
Binary files a/pixmaps/gwy_logscale_horizontal-24.png and b/pixmaps/gwy_logscale_horizontal-24.png differ
diff --git a/pixmaps/gwy_logscale_vertical-24.png b/pixmaps/gwy_logscale_vertical-24.png
index 0365405..9173e0d 100644
Binary files a/pixmaps/gwy_logscale_vertical-24.png and b/pixmaps/gwy_logscale_vertical-24.png differ
diff --git a/pixmaps/gwy_mark_outliers-24.png b/pixmaps/gwy_mark_outliers-24.png
new file mode 100644
index 0000000..79b60f0
Binary files /dev/null and b/pixmaps/gwy_mark_outliers-24.png differ
diff --git a/pixmaps/gwy_mark_scars-24.png b/pixmaps/gwy_mark_scars-24.png
new file mode 100644
index 0000000..df843dd
Binary files /dev/null and b/pixmaps/gwy_mark_scars-24.png differ
diff --git a/pixmaps/gwy_mark_with-24.png b/pixmaps/gwy_mark_with-24.png
index a8a5a38..dde1a2a 100644
Binary files a/pixmaps/gwy_mark_with-24.png and b/pixmaps/gwy_mark_with-24.png differ
diff --git a/pixmaps/gwy_markup-20.xcf b/pixmaps/gwy_markup-20.xcf
deleted file mode 100644
index 75110cc..0000000
Binary files a/pixmaps/gwy_markup-20.xcf and /dev/null differ
diff --git a/pixmaps/gwy_mask-16.png b/pixmaps/gwy_mask-16.png
index ff6c0c0..24787e1 100644
Binary files a/pixmaps/gwy_mask-16.png and b/pixmaps/gwy_mask-16.png differ
diff --git a/pixmaps/gwy_mask-16.xcf b/pixmaps/gwy_mask-16.xcf
deleted file mode 100644
index 1182232..0000000
Binary files a/pixmaps/gwy_mask-16.xcf and /dev/null differ
diff --git a/pixmaps/gwy_mask-24.png b/pixmaps/gwy_mask-24.png
index 32be618..d96374f 100644
Binary files a/pixmaps/gwy_mask-24.png and b/pixmaps/gwy_mask-24.png differ
diff --git a/pixmaps/gwy_mask-24.xcf b/pixmaps/gwy_mask-24.xcf
deleted file mode 100644
index c8a6f23..0000000
Binary files a/pixmaps/gwy_mask-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_mask_add-24.png b/pixmaps/gwy_mask_add-24.png
index d125b2a..5d8db27 100644
Binary files a/pixmaps/gwy_mask_add-24.png and b/pixmaps/gwy_mask_add-24.png differ
diff --git a/pixmaps/gwy_mask_circle-24.png b/pixmaps/gwy_mask_circle-24.png
index bc2afd9..abacf74 100644
Binary files a/pixmaps/gwy_mask_circle-24.png and b/pixmaps/gwy_mask_circle-24.png differ
diff --git a/pixmaps/gwy_mask_circle_exclusive-24.png b/pixmaps/gwy_mask_circle_exclusive-24.png
index bcca426..4a70445 100644
Binary files a/pixmaps/gwy_mask_circle_exclusive-24.png and b/pixmaps/gwy_mask_circle_exclusive-24.png differ
diff --git a/pixmaps/gwy_mask_circle_inclusive-24.png b/pixmaps/gwy_mask_circle_inclusive-24.png
index 128a478..839bc61 100644
Binary files a/pixmaps/gwy_mask_circle_inclusive-24.png and b/pixmaps/gwy_mask_circle_inclusive-24.png differ
diff --git a/pixmaps/gwy_mask_distribute-24.png b/pixmaps/gwy_mask_distribute-24.png
index 6acf992..72a00af 100644
Binary files a/pixmaps/gwy_mask_distribute-24.png and b/pixmaps/gwy_mask_distribute-24.png differ
diff --git a/pixmaps/gwy_mask_editor-24.png b/pixmaps/gwy_mask_editor-24.png
index 65eeaa5..96a9f2f 100644
Binary files a/pixmaps/gwy_mask_editor-24.png and b/pixmaps/gwy_mask_editor-24.png differ
diff --git a/pixmaps/gwy_mask_exclude-24.png b/pixmaps/gwy_mask_exclude-24.png
index 72b8939..6a62863 100644
Binary files a/pixmaps/gwy_mask_exclude-24.png and b/pixmaps/gwy_mask_exclude-24.png differ
diff --git a/pixmaps/gwy_mask_exclude_circle-24.png b/pixmaps/gwy_mask_exclude_circle-24.png
index 2fdbadc..4a70445 100644
Binary files a/pixmaps/gwy_mask_exclude_circle-24.png and b/pixmaps/gwy_mask_exclude_circle-24.png differ
diff --git a/pixmaps/gwy_mask_extract-24.png b/pixmaps/gwy_mask_extract-24.png
index dbe8f30..e3943e6 100644
Binary files a/pixmaps/gwy_mask_extract-24.png and b/pixmaps/gwy_mask_extract-24.png differ
diff --git a/pixmaps/gwy_mask_fill_draw-24.png b/pixmaps/gwy_mask_fill_draw-24.png
index a412a3f..e2f59b6 100644
Binary files a/pixmaps/gwy_mask_fill_draw-24.png and b/pixmaps/gwy_mask_fill_draw-24.png differ
diff --git a/pixmaps/gwy_mask_fill_erase-24.png b/pixmaps/gwy_mask_fill_erase-24.png
index a8f7136..fd3450b 100644
Binary files a/pixmaps/gwy_mask_fill_erase-24.png and b/pixmaps/gwy_mask_fill_erase-24.png differ
diff --git a/pixmaps/gwy_mask_grow-24.png b/pixmaps/gwy_mask_grow-24.png
index f806456..01b63fc 100644
Binary files a/pixmaps/gwy_mask_grow-24.png and b/pixmaps/gwy_mask_grow-24.png differ
diff --git a/pixmaps/gwy_mask_intersect-24.png b/pixmaps/gwy_mask_intersect-24.png
index 7a08f4d..d2ca3c0 100644
Binary files a/pixmaps/gwy_mask_intersect-24.png and b/pixmaps/gwy_mask_intersect-24.png differ
diff --git a/pixmaps/gwy_mask_invert-24.png b/pixmaps/gwy_mask_invert-24.png
index 0af7c29..3796b3b 100644
Binary files a/pixmaps/gwy_mask_invert-24.png and b/pixmaps/gwy_mask_invert-24.png differ
diff --git a/pixmaps/gwy_mask_line-24.png b/pixmaps/gwy_mask_line-24.png
index a50c304..f7641d1 100644
Binary files a/pixmaps/gwy_mask_line-24.png and b/pixmaps/gwy_mask_line-24.png differ
diff --git a/pixmaps/gwy_mask_morph-24.png b/pixmaps/gwy_mask_morph-24.png
index e95e1b0..7acfc4a 100644
Binary files a/pixmaps/gwy_mask_morph-24.png and b/pixmaps/gwy_mask_morph-24.png differ
diff --git a/pixmaps/gwy_mask_paint_draw-24.png b/pixmaps/gwy_mask_paint_draw-24.png
index d2b6acd..7e740eb 100644
Binary files a/pixmaps/gwy_mask_paint_draw-24.png and b/pixmaps/gwy_mask_paint_draw-24.png differ
diff --git a/pixmaps/gwy_mask_paint_erase-24.png b/pixmaps/gwy_mask_paint_erase-24.png
index cf60f3f..ce13a16 100644
Binary files a/pixmaps/gwy_mask_paint_erase-24.png and b/pixmaps/gwy_mask_paint_erase-24.png differ
diff --git a/pixmaps/gwy_mask_rect_exclusive-24.png b/pixmaps/gwy_mask_rect_exclusive-24.png
index 0de5352..9d0d67a 100644
Binary files a/pixmaps/gwy_mask_rect_exclusive-24.png and b/pixmaps/gwy_mask_rect_exclusive-24.png differ
diff --git a/pixmaps/gwy_mask_rect_inclusive-24.png b/pixmaps/gwy_mask_rect_inclusive-24.png
index e0e8990..dc2075d 100644
Binary files a/pixmaps/gwy_mask_rect_inclusive-24.png and b/pixmaps/gwy_mask_rect_inclusive-24.png differ
diff --git a/pixmaps/gwy_mask_remove-24.png b/pixmaps/gwy_mask_remove-24.png
index eb82317..d1e69dc 100644
Binary files a/pixmaps/gwy_mask_remove-24.png and b/pixmaps/gwy_mask_remove-24.png differ
diff --git a/pixmaps/gwy_mask_set-24.png b/pixmaps/gwy_mask_set-24.png
new file mode 100644
index 0000000..98ad1ac
Binary files /dev/null and b/pixmaps/gwy_mask_set-24.png differ
diff --git a/pixmaps/gwy_mask_shrink-24.png b/pixmaps/gwy_mask_shrink-24.png
index a5e7c8c..1f295e0 100644
Binary files a/pixmaps/gwy_mask_shrink-24.png and b/pixmaps/gwy_mask_shrink-24.png differ
diff --git a/pixmaps/gwy_mask_subtract-24.png b/pixmaps/gwy_mask_subtract-24.png
index a452875..4b23180 100644
Binary files a/pixmaps/gwy_mask_subtract-24.png and b/pixmaps/gwy_mask_subtract-24.png differ
diff --git a/pixmaps/gwy_mask_thin-24.png b/pixmaps/gwy_mask_thin-24.png
index ed44191..bc6de13 100644
Binary files a/pixmaps/gwy_mask_thin-24.png and b/pixmaps/gwy_mask_thin-24.png differ
diff --git a/pixmaps/gwy_measure-24.xcf b/pixmaps/gwy_measure-24.xcf
deleted file mode 100644
index 6cceb5b..0000000
Binary files a/pixmaps/gwy_measure-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_measure_lattice-24.png b/pixmaps/gwy_measure_lattice-24.png
index cd72ade..4dcd3a2 100644
Binary files a/pixmaps/gwy_measure_lattice-24.png and b/pixmaps/gwy_measure_lattice-24.png differ
diff --git a/pixmaps/gwy_merge-24.png b/pixmaps/gwy_merge-24.png
index b143a65..194af80 100644
Binary files a/pixmaps/gwy_merge-24.png and b/pixmaps/gwy_merge-24.png differ
diff --git a/pixmaps/gwy_more-24.png b/pixmaps/gwy_more-24.png
index bf60a5d..7ddd42e 100644
Binary files a/pixmaps/gwy_more-24.png and b/pixmaps/gwy_more-24.png differ
diff --git a/pixmaps/gwy_more-24.xcf b/pixmaps/gwy_more-24.xcf
deleted file mode 100644
index c8b399f..0000000
Binary files a/pixmaps/gwy_more-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_mutual_crop-24.png b/pixmaps/gwy_mutual_crop-24.png
index e259352..3c5eb1a 100644
Binary files a/pixmaps/gwy_mutual_crop-24.png and b/pixmaps/gwy_mutual_crop-24.png differ
diff --git a/pixmaps/gwy_neural.svg b/pixmaps/gwy_neural.svg
deleted file mode 100644
index 12d2ac6..0000000
--- a/pixmaps/gwy_neural.svg
+++ /dev/null
@@ -1,347 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="125mm"
-   height="125mm"
-   viewBox="0 0 442.91338 442.91337"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r"
-   sodipodi:docname="neural.svg"
-   inkscape:export-filename="/home/lila/Documents/Gwyddion/gwy_neural_apply.png"
-   inkscape:export-xdpi="4.8768001"
-   inkscape:export-ydpi="4.8768001">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.7"
-     inkscape:cx="465.75863"
-     inkscape:cy="203.64894"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:window-width="1024"
-     inkscape:window-height="549"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Calque 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-56.179468,-49.87738)">
-    <g
-       id="g4607"
-       transform="matrix(0.83059615,0,0,0.83059615,718.07583,169.27567)">
-      <circle
-         r="32.335983"
-         cy="142.65666"
-         cx="206.99623"
-         id="path4138"
-         style="fill:#be89e4;fill-opacity:1;stroke:#000000;stroke-width:12.48838043;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <circle
-         r="32.335983"
-         cy="290.7991"
-         cx="298.31689"
-         id="path4138-5"
-         style="fill:#be89e4;fill-opacity:1;stroke:#000000;stroke-width:12.48838043;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <circle
-         r="32.335983"
-         cy="326.42545"
-         cx="198.42267"
-         id="path4138-5-5"
-         style="fill:#be89e4;fill-opacity:1;stroke:#000000;stroke-width:12.48838043;stroke-miterlimit:3.29999995;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <circle
-         r="32.335983"
-         cy="447.12732"
-         cx="272.71262"
-         id="path4138-5-5-3"
-         style="fill:#be89e4;fill-opacity:1;stroke:#000000;stroke-width:12.48838043;stroke-miterlimit:3.4333334;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <circle
-         r="32.335983"
-         cy="415.24612"
-         cx="107.86199"
-         id="path4138-5-5-3-8"
-         style="fill:#be89e4;fill-opacity:1;stroke:#000000;stroke-width:12.48838043;stroke-miterlimit:3.4333334;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <circle
-         r="32.335983"
-         cy="209.29955"
-         cx="103.33107"
-         id="path4138-5-5-3-8-6"
-         style="fill:#be89e4;fill-opacity:1;stroke:#000000;stroke-width:12.48838043;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path4217"
-         d="m 124.64433,234.27977 51.82498,69.82167"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:13.58111382;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path4217-7"
-         d="m 231.90847,319.8401 37.02404,-11.91653"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:13.58111382;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path4217-8"
-         d="m 217.46549,354.80637 41.20434,62.19794"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:13.58111382;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path4217-8-1"
-         d="m 175.58213,349.33607 -42.66718,43.46974"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:13.58111382;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path4217-8-1-7"
-         d="M 206.28141,174.90543 202.1514,292.78286"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:12.48838043;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3.4333334;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path4217-0-8-3"
-         d="m 180.54578,161.52771 -48.5166,32.77954"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:13.58111382;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path4217-0-8-3-9"
-         d="m 228.93778,170.69243 53.166,93.46256"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:12.48838043;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path4217-0-8-3-9-3"
-         d="M 295.40938,324.1353 281.7544,414.34061"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:13.58111382;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path4217-0-8-3-9-3-4"
-         d="M 241.61924,439.65851 141.04179,425.78292"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:12.48838043;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path4217-0-8-3-9-3-4-1"
-         d="M 107.18491,379.84582 98.797294,241.71368"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:12.48838043;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-opacity:1" />
-    </g>
-    <path
-       style="fill:#5a2084;fill-opacity:0.74594595;stroke:#000000;stroke-width:8.73450184;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 274.75101,255.53016 48.31243,0 0,-74.14964 c 0,-24.00352 10.80839,-32.52236 27.74386,-32.52236 l 70.5667,0 0,31.79503 70.5258,-59.56467 -70.5258,-59.472854 0,31.703176 c -32.61991,0.122852 -64.94575,-0.01307 -98.31056,-0.12123 -31.94445,0 -48.31243,26.397758 -48.31243,55.660548 z"
-       id="rect4663"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccc" />
-    <g
-       id="g4253"
-       transform="matrix(1.216543,0,0,1.216543,-332.72712,-408.0541)">
-      <path
-         inkscape:connector-curvature="0"
-         id="path4375"
-         d="m 923.05736,351.32414 0,141.48493"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:12.22952175;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path4375-8"
-         d="m 1017.9967,373.01522 0,144.74631"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:12.36967182;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path4375-8-8"
-         d="m 1112.9361,351.32414 0,141.40923"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:12.22624969;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="csc"
-         inkscape:connector-curvature="0"
-         id="path4407"
-         d="m 1016.9948,379.27229 c 0,0 23.1576,-18.2024 46.3569,-23.54832 16.293,-3.75447 55.8415,-4.81696 55.8415,-4.81696"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:13.21420383;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="csc"
-         inkscape:connector-curvature="0"
-         id="path4407-0"
-         d="m 1019.0048,379.27229 c 0,0 -23.15768,-18.2024 -46.35693,-23.54832 -16.293,-3.75447 -55.84148,-4.81696 -55.84148,-4.81696"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:13.21420383;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="csc"
-         inkscape:connector-curvature="0"
-         id="path4407-3"
-         d="m 1016.6534,514.6997 c 0,0 21.7331,-18.42055 43.5053,-23.83055 15.2908,-3.79944 52.4065,-4.87467 52.4065,-4.87467"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:12.87780857;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="csc"
-         inkscape:connector-curvature="0"
-         id="path4407-0-2"
-         d="m 1019.0166,514.71149 c 0,0 -21.63663,-18.43571 -43.3121,-23.85015 -15.22283,-3.80258 -52.17366,-4.87868 -52.17366,-4.87868"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:12.85445595;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <g
-         transform="matrix(1.6517755,0,0,1.6517755,392.66284,-128.35604)"
-         id="g4513">
-        <path
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5.51749945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 386.80068,324.77982 c 0,0 9.66933,-7.60028 19.35601,-9.83244 6.80303,-1.56765 23.31622,-2.01128 23.31622,-2.01128"
-           id="path4407-04"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="csc" />
-        <path
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5.51749945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 386.80068,343.3577 c 0,0 9.66933,-7.60028 19.35601,-9.83244 6.80303,-1.56765 23.31622,-2.01128 23.31622,-2.01128"
-           id="path4407-04-9"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="csc" />
-        <path
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5.51749945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 386.80068,361.93561 c 0,0 9.66933,-7.60028 19.35601,-9.83244 6.80303,-1.56765 23.31622,-2.01128 23.31622,-2.01128"
-           id="path4407-04-9-0"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="csc" />
-      </g>
-      <g
-         transform="matrix(1.6517755,0,0,1.6517755,243.74583,-141.9242)"
-         id="g4508">
-        <path
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5.51749945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 460.52074,333.21486 c 0,0 -9.66933,-7.60028 -19.35601,-9.83244 -6.80303,-1.56765 -23.31622,-2.01128 -23.31622,-2.01128"
-           id="path4407-04-4"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="csc" />
-        <path
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5.51749945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 460.52074,351.79274 c 0,0 -9.66933,-7.60028 -19.35601,-9.83244 -6.80303,-1.56765 -23.31622,-2.01128 -23.31622,-2.01128"
-           id="path4407-04-9-1"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="csc" />
-        <path
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5.51749945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 460.52074,370.37065 c 0,0 -9.66933,-7.60028 -19.35601,-9.83244 -6.80303,-1.56765 -23.31622,-2.01128 -23.31622,-2.01128"
-           id="path4407-04-9-0-4"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="csc" />
-      </g>
-    </g>
-    <circle
-       style="fill:#be89e4;fill-opacity:1;stroke:#000000;stroke-width:14.95060253;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4138-2"
-       cx="129.99648"
-       cy="134.00958"
-       r="38.711376" />
-    <circle
-       style="fill:#be89e4;fill-opacity:1;stroke:#000000;stroke-width:14.95060253;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4138-2-3"
-       cx="118.80893"
-       cy="426.12067"
-       r="38.711376" />
-    <circle
-       style="fill:#be89e4;fill-opacity:1;stroke:#000000;stroke-width:14.95060253;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4138-2-3-0"
-       cx="377.40799"
-       cy="430.16129"
-       r="38.711376" />
-    <circle
-       style="fill:#be89e4;fill-opacity:1;stroke:#000000;stroke-width:14.95060253;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4138-2-3-0-9"
-       cx="272.35211"
-       cy="331.16632"
-       r="38.711376" />
-    <circle
-       style="fill:#be89e4;fill-opacity:1;stroke:#000000;stroke-width:14.95060253;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4138-2-3-6"
-       cx="139.01196"
-       cy="286.71967"
-       r="38.711376" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:18;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 156.18457,428.14098 180.81731,2.02031"
-       id="path4325"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:18;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 303.16176,358.44047 45.45687,43.43656"
-       id="path4325-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:18;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 147.59827,404.40241 92.93404,-51.51778"
-       id="path4325-7-5"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:18;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 123.85968,386.21965 9.09138,-60.60915"
-       id="path4325-7-5-5"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:18;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 235.48154,322.07497 176.8927,303.89223"
-       id="path4325-7-5-5-4"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:18;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 249.1186,298.84146 155.17442,164.49118"
-       id="path4325-7-5-5-4-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:18;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 135.47644,245.80845 -8.08121,-72.73097"
-       id="path4325-7-5-5-4-9-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <circle
-       style="fill:#be89e4;fill-opacity:1;stroke:#000000;stroke-width:14.95060253;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4138-2-3-0-0"
-       cx="439.02728"
-       cy="334.19681"
-       r="38.711376" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:18;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 310.23283,333.69173 87.88327,-2.02031"
-       id="path4325-7-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:18;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 400.13641,395.81611 23.23351,-27.27413"
-       id="path4325-7-9-3"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-  </g>
-</svg>
diff --git a/pixmaps/gwy_neural_apply-24.png b/pixmaps/gwy_neural_apply-24.png
index c08795e..13c66fc 100644
Binary files a/pixmaps/gwy_neural_apply-24.png and b/pixmaps/gwy_neural_apply-24.png differ
diff --git a/pixmaps/gwy_neural_train-24.png b/pixmaps/gwy_neural_train-24.png
index 603da13..a6ca230 100644
Binary files a/pixmaps/gwy_neural_train-24.png and b/pixmaps/gwy_neural_train-24.png differ
diff --git a/pixmaps/gwy_next-24.png b/pixmaps/gwy_next-24.png
new file mode 100644
index 0000000..81fee13
Binary files /dev/null and b/pixmaps/gwy_next-24.png differ
diff --git a/pixmaps/gwy_null_offsets-24.png b/pixmaps/gwy_null_offsets-24.png
new file mode 100644
index 0000000..50ed894
Binary files /dev/null and b/pixmaps/gwy_null_offsets-24.png differ
diff --git a/pixmaps/gwy_palette-24.xcf b/pixmaps/gwy_palette-24.xcf
deleted file mode 100644
index 0504dd0..0000000
Binary files a/pixmaps/gwy_palette-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_palettes-16.png b/pixmaps/gwy_palettes-16.png
index fef2359..b2fd0c8 100644
Binary files a/pixmaps/gwy_palettes-16.png and b/pixmaps/gwy_palettes-16.png differ
diff --git a/pixmaps/gwy_palettes-16.xcf b/pixmaps/gwy_palettes-16.xcf
deleted file mode 100644
index b47da54..0000000
Binary files a/pixmaps/gwy_palettes-16.xcf and /dev/null differ
diff --git a/pixmaps/gwy_palettes-24.png b/pixmaps/gwy_palettes-24.png
index 9744b41..4980e7a 100644
Binary files a/pixmaps/gwy_palettes-24.png and b/pixmaps/gwy_palettes-24.png differ
diff --git a/pixmaps/gwy_path.svg b/pixmaps/gwy_path.svg
deleted file mode 100644
index 21bcc45..0000000
--- a/pixmaps/gwy_path.svg
+++ /dev/null
@@ -1,387 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="210mm"
-   height="210mm"
-   viewBox="0 0 744.09449 744.09448"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r"
-   sodipodi:docname="gwy_path.svg"
-   inkscape:export-filename="/home/lila/Documents/Gwyddion/gwy_straighten_path-24.png"
-   inkscape:export-xdpi="2.9028571"
-   inkscape:export-ydpi="2.9028571">
-  <defs
-     id="defs4">
-    <linearGradient
-       id="linearGradient6033"
-       inkscape:collect="always">
-      <stop
-         id="stop6035"
-         offset="0"
-         style="stop-color:#1585a5;stop-opacity:1" />
-      <stop
-         style="stop-color:#00d752;stop-opacity:1"
-         offset="0.24198121"
-         id="stop6037" />
-      <stop
-         id="stop6039"
-         offset="0.74367243"
-         style="stop-color:#00678b;stop-opacity:1" />
-      <stop
-         id="stop6041"
-         offset="1"
-         style="stop-color:#00ff00;stop-opacity:1" />
-    </linearGradient>
-    <inkscape:path-effect
-       effect="bend_path"
-       id="path-effect6021"
-       is_visible="true"
-       bendpath="m 189.12967,978.88092 c 0,0 -90.907864,-40.72346 -109.894267,-132.78374 -8.797219,-42.6555 20.567416,-124.09181 75.989567,-170.60157 29.80255,-25.01003 54.66733,-65.21512 62.08517,-95.21232 14.99897,-60.65472 -8.58689,-105.96061 -31.65892,-137.25726 -23.07204,-31.29666 -75.33016,-55.28051 -75.33016,-55.28051"
-       prop_scale="1"
-       scale_y_rel="false"
-       vertical="true"
-       bendpath-nodetypes="cssszc" />
-    <inkscape:path-effect
-       effect="bend_path"
-       id="path-effect5834"
-       is_visible="true"
-       bendpath="m 148.1797,682.87522 65.42999,63.50558"
-       prop_scale="1"
-       scale_y_rel="false"
-       vertical="false"
-       bendpath-nodetypes="cc" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5787">
-      <stop
-         style="stop-color:#1585a5;stop-opacity:1"
-         offset="0"
-         id="stop5789" />
-      <stop
-         id="stop5801"
-         offset="0.34077555"
-         style="stop-color:#00d752;stop-opacity:1" />
-      <stop
-         style="stop-color:#00678b;stop-opacity:1"
-         offset="0.75"
-         id="stop5803" />
-      <stop
-         style="stop-color:#00ff00;stop-opacity:1"
-         offset="1"
-         id="stop5791" />
-    </linearGradient>
-    <marker
-       inkscape:stockid="TriangleOutM"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="TriangleOutM"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path4437"
-         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow2Mend"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path4319"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
-         transform="scale(0.6) rotate(180) translate(0,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow2Lend"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path4313"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
-         transform="scale(1.1) rotate(180) translate(1,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Mend"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path4301"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Send"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow2Send"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path4325"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
-         transform="scale(0.3) rotate(180) translate(-2.3,0)" />
-    </marker>
-    <inkscape:path-effect
-       effect="bend_path"
-       id="path-effect4218"
-       is_visible="true"
-       bendpath="m 59.92989,760.93364 c 0,0 9.83878,-27.87346 51.49868,-74.28572 36.89793,-41.10706 152.09001,-64.14042 222.85714,2.85715 53.00246,50.17917 74.3552,97.32766 165.71429,99.99999 109.92334,3.21536 158.03681,-114.28571 158.03681,-114.28571"
-       prop_scale="1"
-       scale_y_rel="false"
-       vertical="false"
-       bendpath-nodetypes="csssc" />
-    <inkscape:path-effect
-       effect="bend_path"
-       id="path-effect4207"
-       is_visible="true"
-       bendpath="m 91.428571,283.79078 1,0"
-       prop_scale="1"
-       scale_y_rel="false"
-       vertical="false" />
-    <inkscape:path-effect
-       effect="bend_path"
-       id="path-effect4205"
-       is_visible="true"
-       bendpath="m 44.285711,283.79078 94.285719,0"
-       prop_scale="1"
-       scale_y_rel="false"
-       vertical="false" />
-    <inkscape:path-effect
-       effect="bend_path"
-       id="path-effect4203"
-       is_visible="true"
-       bendpath="m 44.285711,283.79078 94.285719,0"
-       prop_scale="1"
-       scale_y_rel="false"
-       vertical="false" />
-    <filter
-       style="color-interpolation-filters:sRGB"
-       id="filter4201"
-       inkscape:label="filtre1" />
-    <inkscape:path-effect
-       effect="bend_path"
-       id="path-effect4218-9"
-       is_visible="true"
-       bendpath="m 59.92989,760.93364 c 0,0 9.83878,-27.87346 51.49868,-74.28572 36.89793,-41.10706 152.09001,-64.14042 222.85714,2.85715 53.00246,50.17917 74.3552,97.32766 165.71429,99.99999 109.92334,3.21536 158.03681,-114.28571 158.03681,-114.28571"
-       prop_scale="1"
-       scale_y_rel="false"
-       vertical="false"
-       bendpath-nodetypes="csssc" />
-    <inkscape:path-effect
-       effect="bend_path"
-       id="path-effect4205-0"
-       is_visible="true"
-       bendpath="m 44.285711,283.79078 94.285719,0"
-       prop_scale="1"
-       scale_y_rel="false"
-       vertical="false" />
-    <inkscape:path-effect
-       effect="bend_path"
-       id="path-effect4207-1"
-       is_visible="true"
-       bendpath="m 91.428571,283.79078 1,0"
-       prop_scale="1"
-       scale_y_rel="false"
-       vertical="false" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5787"
-       id="linearGradient5795"
-       x1="529.21313"
-       y1="328.78351"
-       x2="527.28876"
-       y2="1017.7228"
-       gradientUnits="userSpaceOnUse"
-       spreadMethod="pad"
-       gradientTransform="translate(116.10716,7.8168575)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6033"
-       id="linearGradient5795-1"
-       x1="489.75098"
-       y1="357.35956"
-       x2="558.58636"
-       y2="979.6214"
-       gradientUnits="userSpaceOnUse"
-       spreadMethod="pad"
-       gradientTransform="translate(-379.19889,29.626072)" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.36744053"
-     inkscape:cx="436.537"
-     inkscape:cy="406.88827"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:window-width="1024"
-     inkscape:window-height="549"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Calque 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-308.26772)">
-    <path
-       style="fill:url(#linearGradient5795-1);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 166.00339,1029.6717 46.25255,-101.58154 c 0,0 0.009,0.004 0.009,0.004 0.003,0.001 0.0194,0.009 0.0221,0.0103 0.0244,0.0113 0.0306,0.0141 0.0185,0.009 0.0242,0.0117 -0.0155,-0.008 -0.1195,-0.0568 0,0 -1e-5,-10e-6 -1e-5,-10e-6 -0.39912,-0.18894 -0.91341,-0.44814 -1.54597,-0.77038 0,0 -3e-5,-10e-6 -3e-5,-10e-6 -2.33762,-1.19099 -4.8156,-2.59017 -7.44975,-4.15195 l -3e-5,-10e-6 c -8.94065,-5.32679 -17.46119,-11.49697 -25.40993,-18.35845 l -1e-5,-1e-5 c -10.58274,-9.24312 -19.8597 [...]
-       id="rect4198-9"
-       inkscape:path-effect="#path-effect6021"
-       inkscape:original-d="m 88.433105,362.25839 111.615865,0 0,688.93931 -111.615865,0 z" />
-    <rect
-       style="fill:url(#linearGradient5795);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4198"
-       width="111.61587"
-       height="688.93933"
-       x="583.73914"
-       y="340.44916" />
-    <g
-       id="g4209"
-       inkscape:path-effect="#path-effect4218"
-       transform="matrix(0,-0.98950589,0.98950589,0,-560.27686,1036.8442)">
-      <g
-         inkscape:path-effect="#path-effect4205"
-         transform="matrix(0,1.3803681,-1.3803681,0,742.14766,549.01427)"
-         id="g4193">
-        <path
-           inkscape:path-effect="#path-effect4207"
-           inkscape:original-d="m 91.428571,503.79078 0,-440.000004"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 150.35353,492.88198 c -0.17446,-0.0808 -0.34861,-0.16218 -0.52248,-0.24416 -3.64385,-1.71807 -7.16855,-3.68059 -10.62217,-5.75471 0,0 -1e-5,-10e-6 -2e-5,-10e-6 -14.18822,-8.52092 -27.18455,-18.90691 -39.500927,-29.96216 -4.055094,-3.63987 -7.481909,-7.94044 -10.451844,-12.50903 -10e-7,0 -4e-6,0 -7e-6,-10e-6 -3.432772,-5.28056 -6.257935,-10.94347 -8.613458,-16.78468 -5.412888,-13.42284 -8.405908,-27.78151 -9.268192,-42.22896 -0.941266,-15.77076 0.732609,-31.74081 5.416016, [...]
-           id="path4136"
-           inkscape:connector-curvature="0" />
-        <path
-           inkscape:original-d="m 44.285712,506.64792 94.285718,0"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 137.07761,538.41891 32.89236,-88.38009"
-           id="path4138"
-           inkscape:connector-curvature="0" />
-        <path
-           inkscape:original-d="m 44.285711,395.21935 94.285719,0"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="M 25.542265,401.48127 119.09692,389.33543"
-           id="path4138-0"
-           inkscape:connector-curvature="0" />
-        <path
-           inkscape:original-d="m 44.285712,60.933639 94.285718,0"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="M 73.581107,104.5135 109.27604,17.35378"
-           id="path4138-0-6"
-           inkscape:connector-curvature="0" />
-        <path
-           inkscape:original-d="m 44.285713,172.36221 94.285717,0"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 126.72349,165.59669 93.56098,-11.39217"
-           id="path4138-0-6-6"
-           inkscape:connector-curvature="0" />
-        <path
-           inkscape:original-d="m 44.285711,283.79079 94.285719,0"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 88.427762,242.47475 64.701418,68.60661"
-           id="path4138-0-6-63"
-           inkscape:connector-curvature="0" />
-      </g>
-    </g>
-    <g
-       id="g4209-1"
-       transform="matrix(0,-1.0828392,1.0828392,0,-91.606926,1064.3586)"
-       inkscape:transform-center-x="312.60492"
-       inkscape:transform-center-y="-56.053863">
-      <g
-         inkscape:path-effect="#path-effect4205-0"
-         transform="matrix(0,1.3803681,-1.3803681,0,742.14766,549.01427)"
-         id="g4193-0">
-        <path
-           inkscape:path-effect="#path-effect4207-1"
-           inkscape:original-d="m 91.428571,503.79078 0,-440.000004"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 91.428571,503.79078 0,-440.000004"
-           id="path4136-8"
-           inkscape:connector-curvature="0" />
-        <path
-           inkscape:original-d="m 44.285712,506.64792 94.285718,0"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 44.285712,506.64792 94.285718,0"
-           id="path4138-2"
-           inkscape:connector-curvature="0" />
-        <path
-           inkscape:original-d="m 44.285711,395.21935 94.285719,0"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 44.285711,395.21935 94.285719,0"
-           id="path4138-0-1"
-           inkscape:connector-curvature="0" />
-        <path
-           inkscape:original-d="m 44.285712,60.933639 94.285718,0"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 44.285712,60.933639 94.285718,0"
-           id="path4138-0-6-5"
-           inkscape:connector-curvature="0" />
-        <path
-           inkscape:original-d="m 44.285713,172.36221 94.285717,0"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 44.285713,172.36221 94.285717,0"
-           id="path4138-0-6-6-2"
-           inkscape:connector-curvature="0" />
-        <path
-           inkscape:original-d="m 44.285711,283.79079 94.285719,0"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 44.285711,283.79079 94.285719,0"
-           id="path4138-0-6-63-9"
-           inkscape:connector-curvature="0" />
-      </g>
-    </g>
-    <path
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#TriangleOutM)"
-       d="m 257.14285,685.21935 202.85714,0"
-       id="path4286"
-       inkscape:connector-curvature="0" />
-  </g>
-</svg>
diff --git a/pixmaps/gwy_path_level-24.png b/pixmaps/gwy_path_level-24.png
index 3f219db..486cbf4 100644
Binary files a/pixmaps/gwy_path_level-24.png and b/pixmaps/gwy_path_level-24.png differ
diff --git a/pixmaps/gwy_pointer_measure-24.png b/pixmaps/gwy_pointer_measure-24.png
index fb08713..a55127b 100644
Binary files a/pixmaps/gwy_pointer_measure-24.png and b/pixmaps/gwy_pointer_measure-24.png differ
diff --git a/pixmaps/gwy_poly_distort-24.png b/pixmaps/gwy_poly_distort-24.png
index c1b972d..d1ec76e 100644
Binary files a/pixmaps/gwy_poly_distort-24.png and b/pixmaps/gwy_poly_distort-24.png differ
diff --git a/pixmaps/gwy_poly_distort.svg b/pixmaps/gwy_poly_distort.svg
deleted file mode 100644
index 1fc2f41..0000000
--- a/pixmaps/gwy_poly_distort.svg
+++ /dev/null
@@ -1,301 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="210mm"
-   height="210mm"
-   viewBox="0 0 744.09449 744.09448"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r"
-   sodipodi:docname="gwy_poly_distort.svg"
-   inkscape:export-filename="/home/lila/Documents/Gwyddion/gwy_poly_distort-24.png"
-   inkscape:export-xdpi="2.9028571"
-   inkscape:export-ydpi="2.9028571">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.42953183"
-     inkscape:cx="277.11923"
-     inkscape:cy="389.94365"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:window-width="1024"
-     inkscape:window-height="549"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer2"
-     inkscape:label="Calque 2"
-     style="display:inline"
-     transform="translate(0,-308.26772)">
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#dd1941;stroke-width:22.34856033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 373.69817,424.98669 0,507.97782"
-       id="path4350"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#dd1941;stroke-width:22.34856033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 93.557643,677.35784 567.061697,0"
-       id="path4350-6"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#dd1941;stroke-width:22.34856033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 79.381114,515.58146 c 0,0 144.070306,36.87836 299.282566,35.59081 174.10869,-1.44432 289.83154,-35.59081 289.83154,-35.59081"
-       id="path4350-6-0"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="csc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#dd1941;stroke-width:22.34856033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 49.263772,352.00276 c 0,0 106.322508,65.66204 330.786008,71.1816 193.0102,4.74613 327.63565,-71.1816 327.63565,-71.1816"
-       id="path4350-6-0-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="csc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#dd1941;stroke-width:22.34856033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 79.174065,839.64236 c 0,0 144.070285,-36.87835 299.282555,-35.5908 174.10869,1.44431 289.83154,35.5908 289.83154,35.5908"
-       id="path4350-6-0-2"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="csc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#dd1941;stroke-width:22.34856033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 44.599646,1003.9809 c 0,0 106.322504,-65.66203 330.786004,-71.18157 193.0102,-4.74613 327.63564,71.18157 327.63564,71.18157"
-       id="path4350-6-0-7-2"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="csc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#dd1941;stroke-width:22.34856033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 713.26509,1008.3538 c 0,0 -45.96413,-101.28804 -51.33835,-331.82098 C 657.30557,478.30365 705.564,347.94728 705.564,347.94728"
-       id="path4350-6-0-7-2-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="csc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#dd1941;stroke-width:22.34856033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 38.540996,1013.6519 c 0,0 45.964126,-101.28805 51.338362,-331.82098 C 94.500529,483.60175 46.242086,353.24539 46.242086,353.24539"
-       id="path4350-6-0-7-2-8-5"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="csc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#dd1941;stroke-width:22.34856033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 209.79567,947.007 c 0,0 25.63932,-113.69221 24.38566,-273.10139 -1.4063,-178.81656 -24.38566,-271.30413 -24.38566,-271.30413"
-       id="path4350-6-0-0"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="csc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#dd1941;stroke-width:22.34856033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 541.87054,942.97127 c 0,0 -25.63932,-113.69222 -24.38566,-273.10139 1.40628,-178.81657 24.38566,-271.30414 24.38566,-271.30414"
-       id="path4350-6-0-0-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="csc" />
-  </g>
-  <g
-     inkscape:label="Calque 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     style="display:inline"
-     transform="translate(0,-308.26772)">
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136"
-       cx="46.302498"
-       cy="1002.5283"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5"
-       cx="210.51413"
-       cy="945.90656"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-2"
-       cx="374.72574"
-       cy="934.58228"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-2-1"
-       cx="538.93732"
-       cy="945.90656"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-2-1-1"
-       cx="703.14899"
-       cy="1002.5283"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-0"
-       cx="79.381088"
-       cy="838.0827"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-3"
-       cx="225.95081"
-       cy="813.16913"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-2-7"
-       cx="374.72574"
-       cy="806.37451"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-2-1-9"
-       cx="523.50067"
-       cy="813.16913"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-2-1-1-4"
-       cx="670.07037"
-       cy="838.0827"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-0-5"
-       cx="90.407288"
-       cy="678.16663"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-3-6"
-       cx="232.56653"
-       cy="678.16663"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-2-7-9"
-       cx="374.72574"
-       cy="678.16663"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-2-1-9-4"
-       cx="516.88495"
-       cy="678.16663"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-2-1-1-4-6"
-       cx="659.04419"
-       cy="678.16663"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-0-5-7"
-       cx="79.381088"
-       cy="518.25067"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-3-6-6"
-       cx="225.95081"
-       cy="543.16425"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-2-7-9-7"
-       cx="374.72574"
-       cy="549.95886"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-2-1-9-4-0"
-       cx="523.50067"
-       cy="543.16425"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-2-1-1-4-6-4"
-       cx="670.07037"
-       cy="518.25067"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-0-5-7-4"
-       cx="46.302498"
-       cy="353.80511"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-3-6-6-6"
-       cx="210.51413"
-       cy="410.42685"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-2-7-9-7-7"
-       cx="374.72574"
-       cy="421.75116"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-2-1-9-4-0-9"
-       cx="538.93732"
-       cy="410.42685"
-       rx="33.078598"
-       ry="33.973038" />
-    <ellipse
-       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4136-5-2-1-1-4-6-4-5"
-       cx="703.14899"
-       cy="353.80511"
-       rx="33.078598"
-       ry="33.973038" />
-  </g>
-</svg>
diff --git a/pixmaps/gwy_polynom-24.png b/pixmaps/gwy_polynom-24.png
index b7a1534..af5a9fe 100644
Binary files a/pixmaps/gwy_polynom-24.png and b/pixmaps/gwy_polynom-24.png differ
diff --git a/pixmaps/gwy_polynom-24.xcf b/pixmaps/gwy_polynom-24.xcf
deleted file mode 100644
index 7836300..0000000
Binary files a/pixmaps/gwy_polynom-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_polynom_level-24.png b/pixmaps/gwy_polynom_level-24.png
index 2929522..87555d0 100644
Binary files a/pixmaps/gwy_polynom_level-24.png and b/pixmaps/gwy_polynom_level-24.png differ
diff --git a/pixmaps/gwy_presentation_attach-24.png b/pixmaps/gwy_presentation_attach-24.png
deleted file mode 100644
index fa599df..0000000
Binary files a/pixmaps/gwy_presentation_attach-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_edge_canny-24.png b/pixmaps/gwy_presentation_edge_canny-24.png
deleted file mode 100644
index 11316f8..0000000
Binary files a/pixmaps/gwy_presentation_edge_canny-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_edge_harris_corner-24.png b/pixmaps/gwy_presentation_edge_harris_corner-24.png
deleted file mode 100644
index 572c1ee..0000000
Binary files a/pixmaps/gwy_presentation_edge_harris_corner-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_edge_hough-24.png b/pixmaps/gwy_presentation_edge_hough-24.png
deleted file mode 100644
index 5337279..0000000
Binary files a/pixmaps/gwy_presentation_edge_hough-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_edge_inclination-24.png b/pixmaps/gwy_presentation_edge_inclination-24.png
deleted file mode 100644
index dadc051..0000000
Binary files a/pixmaps/gwy_presentation_edge_inclination-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_edge_laplace_gauss-24.png b/pixmaps/gwy_presentation_edge_laplace_gauss-24.png
deleted file mode 100644
index 4d80b3d..0000000
Binary files a/pixmaps/gwy_presentation_edge_laplace_gauss-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_edge_local_non_linearity-24.png b/pixmaps/gwy_presentation_edge_local_non_linearity-24.png
deleted file mode 100644
index 3687640..0000000
Binary files a/pixmaps/gwy_presentation_edge_local_non_linearity-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_edge_prewitt-24.png b/pixmaps/gwy_presentation_edge_prewitt-24.png
deleted file mode 100644
index 3dae950..0000000
Binary files a/pixmaps/gwy_presentation_edge_prewitt-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_edge_rms-24.png b/pixmaps/gwy_presentation_edge_rms-24.png
deleted file mode 100644
index e8a4076..0000000
Binary files a/pixmaps/gwy_presentation_edge_rms-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_edge_rms_edge-24.png b/pixmaps/gwy_presentation_edge_rms_edge-24.png
deleted file mode 100644
index 7ee0b44..0000000
Binary files a/pixmaps/gwy_presentation_edge_rms_edge-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_edge_sobel-24.png b/pixmaps/gwy_presentation_edge_sobel-24.png
deleted file mode 100644
index 64d702e..0000000
Binary files a/pixmaps/gwy_presentation_edge_sobel-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_edge_step-24.png b/pixmaps/gwy_presentation_edge_step-24.png
deleted file mode 100644
index 91fe681..0000000
Binary files a/pixmaps/gwy_presentation_edge_step-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_edge_zero_crossing-24.png b/pixmaps/gwy_presentation_edge_zero_crossing-24.png
deleted file mode 100644
index e674d1c..0000000
Binary files a/pixmaps/gwy_presentation_edge_zero_crossing-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_extract-24.png b/pixmaps/gwy_presentation_extract-24.png
deleted file mode 100644
index 4d95715..0000000
Binary files a/pixmaps/gwy_presentation_extract-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_local_contrast-24.png b/pixmaps/gwy_presentation_local_contrast-24.png
deleted file mode 100644
index 64a2c22..0000000
Binary files a/pixmaps/gwy_presentation_local_contrast-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_log-24.png b/pixmaps/gwy_presentation_log-24.png
deleted file mode 100644
index 23fc661..0000000
Binary files a/pixmaps/gwy_presentation_log-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_rank-24.png b/pixmaps/gwy_presentation_rank-24.png
deleted file mode 100644
index faea2f0..0000000
Binary files a/pixmaps/gwy_presentation_rank-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_remove-24.png b/pixmaps/gwy_presentation_remove-24.png
deleted file mode 100644
index 397f0f9..0000000
Binary files a/pixmaps/gwy_presentation_remove-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_sem-24.png b/pixmaps/gwy_presentation_sem-24.png
deleted file mode 100644
index 5121ded..0000000
Binary files a/pixmaps/gwy_presentation_sem-24.png and /dev/null differ
diff --git a/pixmaps/gwy_presentation_shading-24.png b/pixmaps/gwy_presentation_shading-24.png
deleted file mode 100644
index b5595fe..0000000
Binary files a/pixmaps/gwy_presentation_shading-24.png and /dev/null differ
diff --git a/pixmaps/gwy_previous-24.png b/pixmaps/gwy_previous-24.png
new file mode 100644
index 0000000..a6a7142
Binary files /dev/null and b/pixmaps/gwy_previous-24.png differ
diff --git a/pixmaps/gwy_profile-24.png b/pixmaps/gwy_profile-24.png
index 5232d4c..1a946e3 100644
Binary files a/pixmaps/gwy_profile-24.png and b/pixmaps/gwy_profile-24.png differ
diff --git a/pixmaps/gwy_profile-24.xcf b/pixmaps/gwy_profile-24.xcf
deleted file mode 100644
index 421248c..0000000
Binary files a/pixmaps/gwy_profile-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_pygwy-24.png b/pixmaps/gwy_pygwy-24.png
index 7f11f1e..2d4303d 100644
Binary files a/pixmaps/gwy_pygwy-24.png and b/pixmaps/gwy_pygwy-24.png differ
diff --git a/pixmaps/gwy_pygwy-24.xcf b/pixmaps/gwy_pygwy-24.xcf
deleted file mode 100644
index 04d63bb..0000000
Binary files a/pixmaps/gwy_pygwy-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_remove_under_mask-24.png b/pixmaps/gwy_remove_under_mask-24.png
index 7645baf..11b1054 100644
Binary files a/pixmaps/gwy_remove_under_mask-24.png and b/pixmaps/gwy_remove_under_mask-24.png differ
diff --git a/pixmaps/gwy_remove_under_mask-24.xcf b/pixmaps/gwy_remove_under_mask-24.xcf
deleted file mode 100644
index dcd1a77..0000000
Binary files a/pixmaps/gwy_remove_under_mask-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_rotate-24.png b/pixmaps/gwy_rotate-24.png
index b1a2c9c..84ed68b 100644
Binary files a/pixmaps/gwy_rotate-24.png and b/pixmaps/gwy_rotate-24.png differ
diff --git a/pixmaps/gwy_rotate-24.xcf b/pixmaps/gwy_rotate-24.xcf
deleted file mode 100644
index ad34318..0000000
Binary files a/pixmaps/gwy_rotate-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_rotate_180-24.png b/pixmaps/gwy_rotate_180-24.png
index 390aa5f..df4f979 100644
Binary files a/pixmaps/gwy_rotate_180-24.png and b/pixmaps/gwy_rotate_180-24.png differ
diff --git a/pixmaps/gwy_rotate_180-24.xcf b/pixmaps/gwy_rotate_180-24.xcf
deleted file mode 100644
index 16a0bcb..0000000
Binary files a/pixmaps/gwy_rotate_180-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_rotate_3d-24.png b/pixmaps/gwy_rotate_3d-24.png
new file mode 100644
index 0000000..f4a9a34
Binary files /dev/null and b/pixmaps/gwy_rotate_3d-24.png differ
diff --git a/pixmaps/gwy_rotate_90_ccw-24.png b/pixmaps/gwy_rotate_90_ccw-24.png
index 825c228..9d58ad9 100644
Binary files a/pixmaps/gwy_rotate_90_ccw-24.png and b/pixmaps/gwy_rotate_90_ccw-24.png differ
diff --git a/pixmaps/gwy_rotate_90_ccw-24.xcf b/pixmaps/gwy_rotate_90_ccw-24.xcf
deleted file mode 100644
index 70e95e9..0000000
Binary files a/pixmaps/gwy_rotate_90_ccw-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_rotate_90_cw-24.png b/pixmaps/gwy_rotate_90_cw-24.png
index 14391a5..9aae77b 100644
Binary files a/pixmaps/gwy_rotate_90_cw-24.png and b/pixmaps/gwy_rotate_90_cw-24.png differ
diff --git a/pixmaps/gwy_rotate_90_cw-24.xcf b/pixmaps/gwy_rotate_90_cw-24.xcf
deleted file mode 100644
index a9bcc8f..0000000
Binary files a/pixmaps/gwy_rotate_90_cw-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_scale-24.png b/pixmaps/gwy_scale-24.png
index 136a4f2..d487c8f 100644
Binary files a/pixmaps/gwy_scale-24.png and b/pixmaps/gwy_scale-24.png differ
diff --git a/pixmaps/gwy_scale-24.xcf b/pixmaps/gwy_scale-24.xcf
deleted file mode 100644
index b8d9959..0000000
Binary files a/pixmaps/gwy_scale-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_scale_horizontally-24.png b/pixmaps/gwy_scale_horizontally-24.png
index d6e5dc4..250c610 100644
Binary files a/pixmaps/gwy_scale_horizontally-24.png and b/pixmaps/gwy_scale_horizontally-24.png differ
diff --git a/pixmaps/gwy_scale_horizontally-24.xcf b/pixmaps/gwy_scale_horizontally-24.xcf
deleted file mode 100644
index f9c42bf..0000000
Binary files a/pixmaps/gwy_scale_horizontally-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_scale_vertically-24.png b/pixmaps/gwy_scale_vertically-24.png
index 0730605..7894cb4 100644
Binary files a/pixmaps/gwy_scale_vertically-24.png and b/pixmaps/gwy_scale_vertically-24.png differ
diff --git a/pixmaps/gwy_scale_vertically-24.xcf b/pixmaps/gwy_scale_vertically-24.xcf
deleted file mode 100644
index 71a3025..0000000
Binary files a/pixmaps/gwy_scale_vertically-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_scars-24.png b/pixmaps/gwy_scars-24.png
index 3296df2..cbe9604 100644
Binary files a/pixmaps/gwy_scars-24.png and b/pixmaps/gwy_scars-24.png differ
diff --git a/pixmaps/gwy_selection-24.xcf b/pixmaps/gwy_selection-24.xcf
deleted file mode 100644
index a6f1e57..0000000
Binary files a/pixmaps/gwy_selection-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_selections-24.png b/pixmaps/gwy_selections-24.png
index 6f1fbcc..4796ba8 100644
Binary files a/pixmaps/gwy_selections-24.png and b/pixmaps/gwy_selections-24.png differ
diff --git a/pixmaps/gwy_shader-24.png b/pixmaps/gwy_shader-24.png
index 6b8c1c7..998ffab 100644
Binary files a/pixmaps/gwy_shader-24.png and b/pixmaps/gwy_shader-24.png differ
diff --git a/pixmaps/gwy_shader-24.xcf b/pixmaps/gwy_shader-24.xcf
deleted file mode 100644
index 4fc28f9..0000000
Binary files a/pixmaps/gwy_shader-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_spectrum-24.png b/pixmaps/gwy_spectrum-24.png
index 647900a..9b1ea59 100644
Binary files a/pixmaps/gwy_spectrum-24.png and b/pixmaps/gwy_spectrum-24.png differ
diff --git a/pixmaps/gwy_spectrum-24.xcf b/pixmaps/gwy_spectrum-24.xcf
deleted file mode 100644
index 0f7857d..0000000
Binary files a/pixmaps/gwy_spectrum-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_spot_remove-24.png b/pixmaps/gwy_spot_remove-24.png
index d99d062..1e31aec 100644
Binary files a/pixmaps/gwy_spot_remove-24.png and b/pixmaps/gwy_spot_remove-24.png differ
diff --git a/pixmaps/gwy_spot_remove-24.xcf b/pixmaps/gwy_spot_remove-24.xcf
deleted file mode 100644
index 63aaac9..0000000
Binary files a/pixmaps/gwy_spot_remove-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_stat_quantities-24.png b/pixmaps/gwy_stat_quantities-24.png
index d0f3d67..7636b9b 100644
Binary files a/pixmaps/gwy_stat_quantities-24.png and b/pixmaps/gwy_stat_quantities-24.png differ
diff --git a/pixmaps/gwy_stat_quantities-24.xcf b/pixmaps/gwy_stat_quantities-24.xcf
deleted file mode 100644
index 7bc6320..0000000
Binary files a/pixmaps/gwy_stat_quantities-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_stats-24.xcf b/pixmaps/gwy_stats-24.xcf
deleted file mode 100644
index f0b0a2e..0000000
Binary files a/pixmaps/gwy_stats-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_straighten_path-24.png b/pixmaps/gwy_straighten_path-24.png
index a6f2804..7751eb2 100644
Binary files a/pixmaps/gwy_straighten_path-24.png and b/pixmaps/gwy_straighten_path-24.png differ
diff --git a/pixmaps/gwy_subscript-20.png b/pixmaps/gwy_subscript-20.png
index c2277ec..953a18f 100644
Binary files a/pixmaps/gwy_subscript-20.png and b/pixmaps/gwy_subscript-20.png differ
diff --git a/pixmaps/gwy_superscript-20.png b/pixmaps/gwy_superscript-20.png
index 1baf2af..a01f57d 100644
Binary files a/pixmaps/gwy_superscript-20.png and b/pixmaps/gwy_superscript-20.png differ
diff --git a/pixmaps/gwy_synthetic-24.xcf b/pixmaps/gwy_synthetic-24.xcf
deleted file mode 100644
index 9cd14a4..0000000
Binary files a/pixmaps/gwy_synthetic-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_synthetic_ballistic_deposition-24.png b/pixmaps/gwy_synthetic_ballistic_deposition-24.png
index db325f7..d6368f7 100644
Binary files a/pixmaps/gwy_synthetic_ballistic_deposition-24.png and b/pixmaps/gwy_synthetic_ballistic_deposition-24.png differ
diff --git a/pixmaps/gwy_synthetic_brownian_motion-24.png b/pixmaps/gwy_synthetic_brownian_motion-24.png
index 98923a8..4751c3a 100644
Binary files a/pixmaps/gwy_synthetic_brownian_motion-24.png and b/pixmaps/gwy_synthetic_brownian_motion-24.png differ
diff --git a/pixmaps/gwy_synthetic_columnar-24.png b/pixmaps/gwy_synthetic_columnar-24.png
index b92e702..f711f91 100644
Binary files a/pixmaps/gwy_synthetic_columnar-24.png and b/pixmaps/gwy_synthetic_columnar-24.png differ
diff --git a/pixmaps/gwy_synthetic_diffusion-24.png b/pixmaps/gwy_synthetic_diffusion-24.png
index 5258d4b..024a088 100644
Binary files a/pixmaps/gwy_synthetic_diffusion-24.png and b/pixmaps/gwy_synthetic_diffusion-24.png differ
diff --git a/pixmaps/gwy_synthetic_domains-24.png b/pixmaps/gwy_synthetic_domains-24.png
index 2be5361..59f1eda 100644
Binary files a/pixmaps/gwy_synthetic_domains-24.png and b/pixmaps/gwy_synthetic_domains-24.png differ
diff --git a/pixmaps/gwy_synthetic_fibres-24.png b/pixmaps/gwy_synthetic_fibres-24.png
new file mode 100644
index 0000000..a375cee
Binary files /dev/null and b/pixmaps/gwy_synthetic_fibres-24.png differ
diff --git a/pixmaps/gwy_synthetic_lattice-24.png b/pixmaps/gwy_synthetic_lattice-24.png
index 3c0fbf6..afa711f 100644
Binary files a/pixmaps/gwy_synthetic_lattice-24.png and b/pixmaps/gwy_synthetic_lattice-24.png differ
diff --git a/pixmaps/gwy_synthetic_line_noise-24.png b/pixmaps/gwy_synthetic_line_noise-24.png
index 439b959..4e37032 100644
Binary files a/pixmaps/gwy_synthetic_line_noise-24.png and b/pixmaps/gwy_synthetic_line_noise-24.png differ
diff --git a/pixmaps/gwy_synthetic_noise-24.png b/pixmaps/gwy_synthetic_noise-24.png
index afd6ead..8633fc0 100644
Binary files a/pixmaps/gwy_synthetic_noise-24.png and b/pixmaps/gwy_synthetic_noise-24.png differ
diff --git a/pixmaps/gwy_synthetic_objects-24.png b/pixmaps/gwy_synthetic_objects-24.png
index f640fc2..bdb5a5d 100644
Binary files a/pixmaps/gwy_synthetic_objects-24.png and b/pixmaps/gwy_synthetic_objects-24.png differ
diff --git a/pixmaps/gwy_synthetic_particles-24.png b/pixmaps/gwy_synthetic_particles-24.png
index 651d2ce..d3db9cb 100644
Binary files a/pixmaps/gwy_synthetic_particles-24.png and b/pixmaps/gwy_synthetic_particles-24.png differ
diff --git a/pixmaps/gwy_synthetic_pattern-24.png b/pixmaps/gwy_synthetic_pattern-24.png
index c79bb7e..d67a779 100644
Binary files a/pixmaps/gwy_synthetic_pattern-24.png and b/pixmaps/gwy_synthetic_pattern-24.png differ
diff --git a/pixmaps/gwy_synthetic_phases-24.png b/pixmaps/gwy_synthetic_phases-24.png
new file mode 100644
index 0000000..63ecd8b
Binary files /dev/null and b/pixmaps/gwy_synthetic_phases-24.png differ
diff --git a/pixmaps/gwy_synthetic_spectral-24.png b/pixmaps/gwy_synthetic_spectral-24.png
index 1521b37..cbe79bb 100644
Binary files a/pixmaps/gwy_synthetic_spectral-24.png and b/pixmaps/gwy_synthetic_spectral-24.png differ
diff --git a/pixmaps/gwy_synthetic_waves-24.png b/pixmaps/gwy_synthetic_waves-24.png
index 3e63c87..eff1f79 100644
Binary files a/pixmaps/gwy_synthetic_waves-24.png and b/pixmaps/gwy_synthetic_waves-24.png differ
diff --git a/pixmaps/gwy_tilt-24.png b/pixmaps/gwy_tilt-24.png
index 74bba2f..181b61c 100644
Binary files a/pixmaps/gwy_tilt-24.png and b/pixmaps/gwy_tilt-24.png differ
diff --git a/pixmaps/gwy_tip-24.xcf b/pixmaps/gwy_tip-24.xcf
deleted file mode 100644
index 5cd2a8c..0000000
Binary files a/pixmaps/gwy_tip-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_tip_dilation-24.png b/pixmaps/gwy_tip_dilation-24.png
index 5704053..4b99c67 100644
Binary files a/pixmaps/gwy_tip_dilation-24.png and b/pixmaps/gwy_tip_dilation-24.png differ
diff --git a/pixmaps/gwy_tip_erosion-24.png b/pixmaps/gwy_tip_erosion-24.png
index fe8a7d4..48cc1e2 100644
Binary files a/pixmaps/gwy_tip_erosion-24.png and b/pixmaps/gwy_tip_erosion-24.png differ
diff --git a/pixmaps/gwy_tip_estimation-24.png b/pixmaps/gwy_tip_estimation-24.png
index 9426647..c87f50e 100644
Binary files a/pixmaps/gwy_tip_estimation-24.png and b/pixmaps/gwy_tip_estimation-24.png differ
diff --git a/pixmaps/gwy_tip_indent_analyze-24.png b/pixmaps/gwy_tip_indent_analyze-24.png
index 65305a2..67e2a8b 100644
Binary files a/pixmaps/gwy_tip_indent_analyze-24.png and b/pixmaps/gwy_tip_indent_analyze-24.png differ
diff --git a/pixmaps/gwy_tip_lateral_force-24.png b/pixmaps/gwy_tip_lateral_force-24.png
index 19038b0..b4a961a 100644
Binary files a/pixmaps/gwy_tip_lateral_force-24.png and b/pixmaps/gwy_tip_lateral_force-24.png differ
diff --git a/pixmaps/gwy_tip_map-24.png b/pixmaps/gwy_tip_map-24.png
index 7da7dd9..ff91df3 100644
Binary files a/pixmaps/gwy_tip_map-24.png and b/pixmaps/gwy_tip_map-24.png differ
diff --git a/pixmaps/gwy_tip_model-24.png b/pixmaps/gwy_tip_model-24.png
index 5bcc340..0f57f6c 100644
Binary files a/pixmaps/gwy_tip_model-24.png and b/pixmaps/gwy_tip_model-24.png differ
diff --git a/pixmaps/gwy_tip_pid-24.png b/pixmaps/gwy_tip_pid-24.png
index b7f74fa..2a3606d 100644
Binary files a/pixmaps/gwy_tip_pid-24.png and b/pixmaps/gwy_tip_pid-24.png differ
diff --git a/pixmaps/gwy_transform-24.xcf b/pixmaps/gwy_transform-24.xcf
deleted file mode 100644
index 59a25ed..0000000
Binary files a/pixmaps/gwy_transform-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_unrotate-24.png b/pixmaps/gwy_unrotate-24.png
index d77a1e7..954a469 100644
Binary files a/pixmaps/gwy_unrotate-24.png and b/pixmaps/gwy_unrotate-24.png differ
diff --git a/pixmaps/gwy_unrotate-24.xcf b/pixmaps/gwy_unrotate-24.xcf
deleted file mode 100644
index 74b464a..0000000
Binary files a/pixmaps/gwy_unrotate-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_value_invert-24.png b/pixmaps/gwy_value_invert-24.png
index e38a555..4f85f9b 100644
Binary files a/pixmaps/gwy_value_invert-24.png and b/pixmaps/gwy_value_invert-24.png differ
diff --git a/pixmaps/gwy_value_invert-24.xcf b/pixmaps/gwy_value_invert-24.xcf
deleted file mode 100644
index 6ae258d..0000000
Binary files a/pixmaps/gwy_value_invert-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_volume-24.png b/pixmaps/gwy_volume-24.png
index 5e3ddf2..d1effc9 100644
Binary files a/pixmaps/gwy_volume-24.png and b/pixmaps/gwy_volume-24.png differ
diff --git a/pixmaps/gwy_volume.svg b/pixmaps/gwy_volume.svg
deleted file mode 100644
index 03b6a16..0000000
--- a/pixmaps/gwy_volume.svg
+++ /dev/null
@@ -1,2277 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="210mm"
-   height="210mm"
-   viewBox="0 0 744.09449 744.09448"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r"
-   sodipodi:docname="gwy_volume.svg"
-   inkscape:export-filename="/home/lila/Documents/Gwyddion/gwy_volume_kmedians-24.png"
-   inkscape:export-xdpi="2.9028571"
-   inkscape:export-ydpi="2.9028571">
-  <defs
-     id="defs4">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="579.14785 : -1066.2599 : 1"
-       inkscape:vp_y="0 : 1062.7946 : 0"
-       inkscape:vp_z="2869.5315 : -732.23863 : 1"
-       inkscape:persp3d-origin="1672.1111 : -1632.2369 : 1"
-       id="perspective4576" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="-1083.3522 : 733.7401 : 1"
-       inkscape:vp_y="0 : 1062.7946 : 0"
-       inkscape:vp_z="1207.0314 : 1067.7614 : 1"
-       inkscape:persp3d-origin="9.6110069 : 167.7631 : 1"
-       id="perspective4393" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="-570.44355 : -1326.5787 : 1"
-       inkscape:vp_y="0 : 1038.2271 : 0"
-       inkscape:vp_z="1666.9957 : -1000.2787 : 1"
-       inkscape:persp3d-origin="497.25486 : -1879.4726 : 1"
-       id="perspective4417" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="-1139.5332 : 610.48281 : 1"
-       inkscape:vp_y="0 : 1178.0331 : 0"
-       inkscape:vp_z="1399.1962 : 980.72183 : 1"
-       inkscape:persp3d-origin="71.939798 : -16.862931 : 1"
-       id="perspective4377" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="-2103.2782 : -831.70025 : 1"
-       inkscape:vp_y="0 : 1288.1292 : 0"
-       inkscape:vp_z="672.71462 : -426.85955 : 1"
-       inkscape:persp3d-origin="-778.58386 : -1517.6762 : 1"
-       id="perspective4477" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="-2004.599 : 490.36857 : 1"
-       inkscape:vp_y="0 : 1327.8548 : 0"
-       inkscape:vp_z="384.17156 : 907.6944 : 1"
-       inkscape:persp3d-origin="-864.68595 : -216.76269 : 1"
-       id="perspective4559" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="-2013.9368 : 639.9549 : 1"
-       inkscape:vp_y="0 : 934.52637 : 0"
-       inkscape:vp_z="393.15886 : 933.6632 : 1"
-       inkscape:persp3d-origin="-865.27896 : 142.28541 : 1"
-       id="perspective4412" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="-1693.6484 : 630.52901 : 1"
-       inkscape:vp_y="0 : 1075.6437 : 0"
-       inkscape:vp_z="624.42587 : 968.58849 : 1"
-       inkscape:persp3d-origin="-587.47133 : 57.709386 : 1"
-       id="perspective4382" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="-1757.4494 : -266.39067 : 1"
-       inkscape:vp_y="0 : 1075.6437 : 0"
-       inkscape:vp_z="560.6249 : 71.668813 : 1"
-       inkscape:persp3d-origin="-651.2723 : -839.21029 : 1"
-       id="perspective4314" />
-    <linearGradient
-       osb:paint="gradient"
-       id="linearGradient5079">
-      <stop
-         style="stop-color:#d02222;stop-opacity:1"
-         offset="0.00000013"
-         id="stop5081" />
-      <stop
-         style="stop-color:#5e5df1;stop-opacity:0.15079366"
-         offset="1"
-         id="stop5083" />
-    </linearGradient>
-    <linearGradient
-       osb:paint="gradient"
-       id="linearGradient5063">
-      <stop
-         style="stop-color:#ff0000;stop-opacity:1;"
-         offset="1.2e-07"
-         id="stop5065" />
-      <stop
-         style="stop-color:#9897ff;stop-opacity:0"
-         offset="1"
-         id="stop5067" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4208"
-       inkscape:collect="always">
-      <stop
-         id="stop5007"
-         offset="0"
-         style="stop-color:#9897ff;stop-opacity:1" />
-      <stop
-         id="stop5009"
-         offset="0.99999988"
-         style="stop-color:#ff0027;stop-opacity:0" />
-    </linearGradient>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="1410.0668 : -474.74577 : 1"
-       inkscape:vp_y="0 : 892.05401 : 0"
-       inkscape:vp_z="3332.4946 : -194.38584 : 1"
-       inkscape:persp3d-origin="2327.4427 : -949.79717 : 1"
-       id="perspective4989" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="-380.5583 : 839.12927 : 1"
-       inkscape:vp_y="0 : 892.05401 : 0"
-       inkscape:vp_z="1541.8696 : 1119.4892 : 1"
-       inkscape:persp3d-origin="536.81771 : 364.07787 : 1"
-       id="perspective4915" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="-378.2612 : 798.32029 : 1"
-       inkscape:vp_y="0 : 892.05401 : 0"
-       inkscape:vp_z="1544.1667 : 1078.6802 : 1"
-       inkscape:persp3d-origin="539.1148 : 323.26889 : 1"
-       id="perspective4851" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="-640.86455 : 377.42912 : 1"
-       inkscape:vp_y="0 : 892.05401 : 0"
-       inkscape:vp_z="1281.5634 : 657.78898 : 1"
-       inkscape:persp3d-origin="276.51146 : -97.62229 : 1"
-       id="perspective6593" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="1127.9417 : -113.99576 : 1"
-       inkscape:vp_y="0 : 892.05401 : 0"
-       inkscape:vp_z="3050.3696 : 166.36417 : 1"
-       inkscape:persp3d-origin="2045.3177 : -589.04716 : 1"
-       id="perspective6446" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="1305.4583 : 569.93934 : 1"
-       inkscape:vp_y="0 : 916.75086 : 0"
-       inkscape:vp_z="3281.1093 : 858.06107 : 1"
-       inkscape:persp3d-origin="2248.2322 : 81.73598 : 1"
-       id="perspective5579" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="-1083.2832 : -298.89222 : 1"
-       inkscape:vp_y="0 : 1178.0331 : 0"
-       inkscape:vp_z="1455.4462 : 71.346802 : 1"
-       inkscape:persp3d-origin="128.1898 : -926.23796 : 1"
-       id="perspective5506" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="-107.02689 : -290.83127 : 1"
-       inkscape:vp_y="0 : 1130.0878 : 0"
-       inkscape:vp_z="2328.3776 : 64.339272 : 1"
-       inkscape:persp3d-origin="1055.1398 : -892.64435 : 1"
-       id="perspective4674" />
-    <linearGradient
-       id="linearGradient5011"
-       osb:paint="gradient">
-      <stop
-         id="stop4198"
-         offset="1.2e-07"
-         style="stop-color:#d02222;stop-opacity:1" />
-      <stop
-         id="stop4196"
-         offset="1"
-         style="stop-color:#5e5df1;stop-opacity:0.15079366" />
-    </linearGradient>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="367.05649 : 440.42131 : 1"
-       inkscape:vp_y="0 : 1038.2271 : 0"
-       inkscape:vp_z="2604.4957 : 766.72132 : 1"
-       inkscape:persp3d-origin="1434.7549 : -112.47257 : 1"
-       id="perspective4136" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4200"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249"
-       gradientTransform="matrix(1.0166406,-0.8880984,0.69777824,0.79877378,-278.89562,640.84743)"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5662"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0373999,-0.92204781,0.71202653,0.82930858,770.52018,1101.786)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5664"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0373999,-0.92204781,0.71202653,0.82930858,770.52018,1101.786)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5666"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0373999,-0.92204781,0.71202653,0.82930858,770.52018,1101.786)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5668"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0373999,-0.92204781,0.71202653,0.82930858,770.52018,1101.786)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5670"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0373999,-0.92204781,0.71202653,0.82930858,770.52018,1101.786)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5672"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0373999,-0.92204781,0.71202653,0.82930858,770.52018,1101.786)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5684"
-       cx="258.18161"
-       cy="528.27838"
-       fx="258.18161"
-       fy="528.27838"
-       r="252.85867"
-       gradientTransform="matrix(0.79279122,0,0,0.35620713,1241.4348,384.29822)"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5684-3"
-       cx="258.18161"
-       cy="528.27838"
-       fx="258.18161"
-       fy="528.27838"
-       r="252.85867"
-       gradientTransform="matrix(0.79279122,0,0,0.35620713,1241.4348,306.12707)"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5684-35"
-       cx="258.18161"
-       cy="528.27838"
-       fx="258.18161"
-       fy="528.27838"
-       r="252.85867"
-       gradientTransform="matrix(0.79279122,0,0,0.35620713,1241.4348,227.95582)"
-       gradientUnits="userSpaceOnUse" />
-    <marker
-       inkscape:stockid="TriangleOutS"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="TriangleOutS-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path5937-6"
-         d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
-         style="fill:#9e0046;fill-opacity:1;fill-rule:evenodd;stroke:#9e0046;stroke-width:1pt;stroke-opacity:1"
-         transform="scale(0.2,0.2)" />
-    </marker>
-    <marker
-       inkscape:stockid="TriangleOutS"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="TriangleOutS-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path5937-80"
-         d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
-         style="fill:#440e26;fill-opacity:1;fill-rule:evenodd;stroke:#440e26;stroke-width:1pt;stroke-opacity:1"
-         transform="scale(0.2,0.2)" />
-    </marker>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="-869.1167 : 654.4365 : 1"
-       inkscape:vp_y="0 : 888.9086 : 0"
-       inkscape:vp_z="1046.5326 : 933.80784 : 1"
-       inkscape:persp3d-origin="45.024701 : 181.06017 : 1"
-       id="perspective4136-2" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="290.88331 : 305.86508 : 1"
-       inkscape:vp_y="0 : 888.9086 : 0"
-       inkscape:vp_z="2206.5326 : 585.23642 : 1"
-       inkscape:persp3d-origin="1205.0247 : -167.51125 : 1"
-       id="perspective4136-1" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4676"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1291874,-1.0036291,0.77502551,0.90268449,103.56318,1927.8079)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4678"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1291874,-1.0036291,0.77502551,0.90268449,103.56318,1927.8079)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4680"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1291874,-1.0036291,0.77502551,0.90268449,103.56318,1927.8079)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4682"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1291874,-1.0036291,0.77502551,0.90268449,103.56318,1927.8079)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4684"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1291874,-1.0036291,0.77502551,0.90268449,103.56318,1927.8079)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4686"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1291874,-1.0036291,0.77502551,0.90268449,103.56318,1927.8079)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4688"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0166406,-0.8880984,0.69777824,0.79877378,-278.89562,640.84743)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5508"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1770945,-1.0462092,0.80790689,0.94098195,-625.48973,1907.0614)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5510"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1770945,-1.0462092,0.80790689,0.94098195,-625.48973,1907.0614)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5512"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1770945,-1.0462092,0.80790689,0.94098195,-625.48973,1907.0614)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5514"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1770945,-1.0462092,0.80790689,0.94098195,-625.48973,1907.0614)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5516"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1770945,-1.0462092,0.80790689,0.94098195,-625.48973,1907.0614)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5518"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1770945,-1.0462092,0.80790689,0.94098195,-625.48973,1907.0614)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5520"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.14223542,0.73057922,-0.88650873,0.17259302,287.33362,964.68678)"
-       cx="886.61011"
-       cy="98.95752"
-       fx="886.61011"
-       fy="98.95752"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5581"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.91602042,-0.81416486,0.62871691,0.73227655,-583.999,874.95438)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5583"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.91602042,-0.81416486,0.62871691,0.73227655,-583.999,874.95438)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5585"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.91602042,-0.81416486,0.62871691,0.73227655,-583.999,874.95438)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5587"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.91602042,-0.81416486,0.62871691,0.73227655,-583.999,874.95438)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5589"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.91602042,-0.81416486,0.62871691,0.73227655,-583.999,874.95438)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5591"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.91602042,-0.81416486,0.62871691,0.73227655,-583.999,874.95438)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient5593"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0166406,-0.8880984,0.69777824,0.79877378,-278.89562,640.84743)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient6448"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.89134326,-0.79223167,0.61177956,0.71254935,1474.6013,1587.2373)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient6450"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.89134326,-0.79223167,0.61177956,0.71254935,1474.6013,1587.2373)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient6452"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.89134326,-0.79223167,0.61177956,0.71254935,1474.6013,1587.2373)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient6454"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.89134326,-0.79223167,0.61177956,0.71254935,1474.6013,1587.2373)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient6456"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.89134326,-0.79223167,0.61177956,0.71254935,1474.6013,1587.2373)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient6458"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.89134326,-0.79223167,0.61177956,0.71254935,1474.6013,1587.2373)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient6460"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0166406,-0.8880984,0.69777824,0.79877378,-278.89562,640.84743)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="-638.87688 : 380.82872 : 1"
-       inkscape:vp_y="0 : 892.05401 : 0"
-       inkscape:vp_z="1283.5511 : 661.18865 : 1"
-       inkscape:persp3d-origin="278.49914 : -94.222677 : 1"
-       id="perspective6446-1" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5011"
-       id="radialGradient5075"
-       cx="513.76498"
-       cy="863.11524"
-       fx="513.76498"
-       fy="863.11524"
-       r="223.11502"
-       gradientTransform="matrix(1,0,0,0.84153748,2043.75,993.02145)"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5079"
-       id="radialGradient5077"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.8879503,-0.65829278,0.50117752,0.6760225,-375.00674,617.83768)"
-       cx="513.76495"
-       cy="863.11523"
-       fx="513.76495"
-       fy="863.11523"
-       r="223.11502" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5011"
-       id="radialGradient4278"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.84153748,2043.75,993.02145)"
-       cx="513.76498"
-       cy="863.11524"
-       fx="513.76498"
-       fy="863.11524"
-       r="223.11502" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5011"
-       id="radialGradient4280"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.84153748,2043.75,993.02145)"
-       cx="513.76498"
-       cy="863.11524"
-       fx="513.76498"
-       fy="863.11524"
-       r="223.11502" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5011"
-       id="radialGradient4282"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.84153748,2043.75,993.02145)"
-       cx="513.76498"
-       cy="863.11524"
-       fx="513.76498"
-       fy="863.11524"
-       r="223.11502" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5011"
-       id="radialGradient4284"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.84153748,2043.75,993.02145)"
-       cx="513.76498"
-       cy="863.11524"
-       fx="513.76498"
-       fy="863.11524"
-       r="223.11502" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5011"
-       id="radialGradient4286"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.84153748,2043.75,993.02145)"
-       cx="513.76498"
-       cy="863.11524"
-       fx="513.76498"
-       fy="863.11524"
-       r="223.11502" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4316"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0747867,-0.95527736,0.73768721,0.85919598,-1339.4453,1826.2515)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4318"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0747867,-0.95527736,0.73768721,0.85919598,-1339.4453,1826.2515)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4320"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0747867,-0.95527736,0.73768721,0.85919598,-1339.4453,1826.2515)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4322"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0747867,-0.95527736,0.73768721,0.85919598,-1339.4453,1826.2515)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4324"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0747867,-0.95527736,0.73768721,0.85919598,-1339.4453,1826.2515)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4326"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0747867,-0.95527736,0.73768721,0.85919598,-1339.4453,1826.2515)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4328"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.14223542,0.73057922,-0.88650873,0.17259302,287.33362,964.68678)"
-       cx="886.61011"
-       cy="98.95752"
-       fx="886.61011"
-       fy="98.95752"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4414"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.116062,-0.82995124,0.76601677,0.74647511,-1579.8801,853.32542)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4416"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.116062,-0.82995124,0.76601677,0.74647511,-1579.8801,853.32542)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4418"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.116062,-0.82995124,0.76601677,0.74647511,-1579.8801,853.32542)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4420"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.116062,-0.82995124,0.76601677,0.74647511,-1579.8801,853.32542)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4422"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.116062,-0.82995124,0.76601677,0.74647511,-1579.8801,853.32542)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4424"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.116062,-0.82995124,0.76601677,0.74647511,-1579.8801,853.32542)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4426"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.14223542,0.73057922,-0.88650873,0.17259302,287.33362,964.68678)"
-       cx="886.61011"
-       cy="98.95752"
-       fx="886.61011"
-       fy="98.95752"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4561"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1075655,-1.1792656,0.7601851,1.0606556,-1573.8468,1188.4878)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4563"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1075655,-1.1792656,0.7601851,1.0606556,-1573.8468,1188.4878)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4565"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1075655,-1.1792656,0.7601851,1.0606556,-1573.8468,1188.4878)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4567"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1075655,-1.1792656,0.7601851,1.0606556,-1573.8468,1188.4878)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4569"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1075655,-1.1792656,0.7601851,1.0606556,-1573.8468,1188.4878)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4571"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1075655,-1.1792656,0.7601851,1.0606556,-1573.8468,1188.4878)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4573"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.14223542,0.73057922,-0.88650873,0.17259302,287.33362,964.68678)"
-       cx="886.61011"
-       cy="98.95752"
-       fx="886.61011"
-       fy="98.95752"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4479"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.2871029,-1.1439854,0.88341189,1.0289238,-1602.7004,2491.8138)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4481"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.2871029,-1.1439854,0.88341189,1.0289238,-1602.7004,2491.8138)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4483"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.2871029,-1.1439854,0.88341189,1.0289238,-1602.7004,2491.8138)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4485"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.2871029,-1.1439854,0.88341189,1.0289238,-1602.7004,2491.8138)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4487"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.2871029,-1.1439854,0.88341189,1.0289238,-1602.7004,2491.8138)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4489"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.2871029,-1.1439854,0.88341189,1.0289238,-1602.7004,2491.8138)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4491"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.14223542,0.73057922,-0.88650873,0.17259302,287.33362,964.68678)"
-       cx="886.61011"
-       cy="98.95752"
-       fx="886.61011"
-       fy="98.95752"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4431"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0166406,-0.8880984,0.69777824,0.79877378,-278.89562,640.84743)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4433"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.77915915,-0.01183729,0.01214757,0.79958283,311.08572,1675.9881)"
-       cx="214.6425"
-       cy="724.03302"
-       fx="214.6425"
-       fy="724.03302"
-       r="252.85867" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="linearGradient4458"
-       x1="3.1249955"
-       y1="866.42468"
-       x2="331.25"
-       y2="860.17468"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0,1,-1,0,1642.9872,2450.6122)" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4395"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0619478,-0.94386608,0.72887515,0.84893244,-670.34135,820.0584)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4397"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0619478,-0.94386608,0.72887515,0.84893244,-670.34135,820.0584)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4399"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0619478,-0.94386608,0.72887515,0.84893244,-670.34135,820.0584)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4401"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0619478,-0.94386608,0.72887515,0.84893244,-670.34135,820.0584)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4403"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0619478,-0.94386608,0.72887515,0.84893244,-670.34135,820.0584)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4405"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0619478,-0.94386608,0.72887515,0.84893244,-670.34135,820.0584)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4407"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0166406,-0.8880984,0.69777824,0.79877378,-278.89562,640.84743)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4578"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0619478,-0.94386608,0.72887515,0.84893244,992.15865,2620.0584)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4580"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0619478,-0.94386608,0.72887515,0.84893244,992.15865,2620.0584)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4582"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0619478,-0.94386608,0.72887515,0.84893244,992.15865,2620.0584)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4584"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0619478,-0.94386608,0.72887515,0.84893244,992.15865,2620.0584)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4586"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0619478,-0.94386608,0.72887515,0.84893244,992.15865,2620.0584)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4588"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0619478,-0.94386608,0.72887515,0.84893244,992.15865,2620.0584)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4208"
-       id="radialGradient4590"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0166406,-0.8880984,0.69777824,0.79877378,-278.89562,640.84743)"
-       cx="634.46106"
-       cy="384.5603"
-       fx="634.46106"
-       fy="384.5603"
-       r="249.13249" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.45254833"
-     inkscape:cx="366.24401"
-     inkscape:cy="7.4441515"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:window-width="1024"
-     inkscape:window-height="549"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Calque 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-308.26772)">
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#00647e;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m -712.23849,1533.6569 268.75001,-125"
-       id="path4330-1"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#00647e;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m -455.98849,1408.6569 409.375022,43.75"
-       id="path4330-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <g
-       id="g5050">
-      <g
-         inkscape:corner7="-0.22247021 : 0.21005412 : 0.25 : 1"
-         inkscape:corner0="-0.018186238 : 0.43389687 : 0 : 1"
-         inkscape:perspectiveID="#perspective4136"
-         style="fill:url(#radialGradient4200);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="g4180"
-         sodipodi:type="inkscape:box3d">
-        <path
-           points="1740.2494,1042.5482 1950.5222,858.39117 1687.9203,817.51986 1454.532,952.95262 "
-           d="m 1454.532,952.95262 285.7174,89.59558 210.2728,-184.15703 -262.6019,-40.87131 z"
-           inkscape:box3dsidetype="13"
-           style="fill:url(#radialGradient5662);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.35959244;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4190"
-           sodipodi:type="inkscape:box3dside" />
-        <path
-           points="1454.532,952.95262 1687.9203,817.51986 1687.9203,628.85529 1454.532,716.24825 "
-           d="m 1454.532,716.24825 0,236.70437 233.3883,-135.43276 0,-188.66457 z"
-           inkscape:box3dsidetype="6"
-           style="fill:url(#radialGradient5664);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.35959244;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4182"
-           sodipodi:type="inkscape:box3dside" />
-        <path
-           points="1950.5222,632.21806 1950.5222,858.39117 1687.9203,817.51986 1687.9203,628.85529 "
-           d="m 1687.9203,628.85529 262.6019,3.36277 0,226.17311 -262.6019,-40.87131 z"
-           inkscape:box3dsidetype="11"
-           style="fill:url(#radialGradient5666);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.35959244;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4192"
-           sodipodi:type="inkscape:box3dside" />
-        <path
-           points="1740.2494,743.6534 1950.5222,632.21806 1687.9203,628.85529 1454.532,716.24825 "
-           d="m 1454.532,716.24825 285.7174,27.40515 210.2728,-111.43534 -262.6019,-3.36277 z"
-           inkscape:box3dsidetype="5"
-           style="fill:url(#radialGradient5668);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.35959244;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4184"
-           sodipodi:type="inkscape:box3dside" />
-        <path
-           points="1740.2494,1042.5482 1950.5222,858.39117 1950.5222,632.21806 1740.2494,743.6534 "
-           d="m 1740.2494,743.6534 0,298.8948 210.2728,-184.15703 0,-226.17311 z"
-           inkscape:box3dsidetype="14"
-           style="fill:url(#radialGradient5670);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.35959244;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4188"
-           sodipodi:type="inkscape:box3dside" />
-        <path
-           points="1740.2494,743.6534 1740.2494,1042.5482 1454.532,952.95262 1454.532,716.24825 "
-           d="m 1454.532,716.24825 285.7174,27.40515 0,298.8948 -285.7174,-89.59558 z"
-           inkscape:box3dsidetype="3"
-           style="fill:url(#radialGradient5672);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.35959244;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4186"
-           sodipodi:type="inkscape:box3dside" />
-      </g>
-      <path
-         inkscape:connector-curvature="0"
-         id="path5676"
-         d="m 1257.2906,593.83331 174.4141,-106.46053 203.8606,31.71164 -163.0885,138.17219 z"
-         style="fill:url(#radialGradient5684);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:18.42146873;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path5676-2"
-         d="m 1257.2906,515.66215 174.4141,-106.46052 203.8606,31.71164 -163.0885,138.17218 z"
-         style="fill:url(#radialGradient5684-3);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:18.42146873;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path5676-1"
-         d="m 1257.2906,437.49091 174.4141,-106.46052 203.8606,31.71164 -163.0885,138.17218 z"
-         style="fill:url(#radialGradient5684-35);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:18.42146873;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="cccccccccccc"
-         inkscape:connector-curvature="0"
-         id="rect4663"
-         d="m 1680.6537,337.08451 0,76.22829 92.9948,0 c 37.8732,0 51.3144,9.05369 51.3144,35.7748 l 0,47.34151 -50.1668,0 93.9822,111.27698 93.8375,-111.27698 -50.0219,0 c -0.1938,-51.46833 0.021,-30.47266 0.1913,-83.11631 0,-50.40257 -41.6509,-76.22829 -87.8223,-76.22829 z"
-         style="fill:#a270c6;fill-opacity:0.74594595;stroke:#000000;stroke-width:13.78146648;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    </g>
-    <g
-       id="g5276"
-       transform="translate(228.57143,-51.428571)">
-      <g
-         sodipodi:type="inkscape:box3d"
-         id="g4660"
-         style="fill:url(#radialGradient4688);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         inkscape:perspectiveID="#perspective4674"
-         inkscape:corner0="-0.018186238 : 0.43389687 : 0 : 1"
-         inkscape:corner7="-0.22247021 : 0.21005412 : 0.25 : 1">
-        <path
-           sodipodi:type="inkscape:box3dside"
-           id="path4662"
-           style="fill:url(#radialGradient4676);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:25.42641258;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           inkscape:box3dsidetype="13"
-           d="m 848.09529,1765.806 310.99731,97.5228 228.8774,-200.4509 -285.8365,-44.4876 z"
-           points="1159.0926,1863.3288 1387.97,1662.8779 1102.1335,1618.3903 848.09529,1765.806 " />
-        <path
-           sodipodi:type="inkscape:box3dside"
-           id="path4664"
-           style="fill:url(#radialGradient4678);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:25.42641258;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           inkscape:box3dsidetype="6"
-           d="m 848.09529,1508.1584 0,257.6476 254.03821,-147.4157 0,-205.3573 z"
-           points="848.09529,1765.806 1102.1335,1618.3903 1102.1335,1413.033 848.09529,1508.1584 " />
-        <path
-           sodipodi:type="inkscape:box3dside"
-           id="path4666"
-           style="fill:url(#radialGradient4680);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:25.42641258;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           inkscape:box3dsidetype="11"
-           d="m 1102.1335,1413.033 285.8365,3.6603 0,246.1846 -285.8365,-44.4876 z"
-           points="1387.97,1416.6933 1387.97,1662.8779 1102.1335,1618.3903 1102.1335,1413.033 " />
-        <path
-           sodipodi:type="inkscape:box3dside"
-           id="path4668"
-           style="fill:url(#radialGradient4682);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:25.42641258;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           inkscape:box3dsidetype="5"
-           d="m 848.09529,1508.1584 310.99731,29.8299 228.8774,-121.295 -285.8365,-3.6603 z"
-           points="1159.0926,1537.9883 1387.97,1416.6933 1102.1335,1413.033 848.09529,1508.1584 " />
-        <path
-           sodipodi:type="inkscape:box3dside"
-           id="path4670"
-           style="fill:url(#radialGradient4684);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:25.42641258;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           inkscape:box3dsidetype="14"
-           d="m 1159.0926,1537.9883 0,325.3405 228.8774,-200.4509 0,-246.1846 z"
-           points="1159.0926,1863.3288 1387.97,1662.8779 1387.97,1416.6933 1159.0926,1537.9883 " />
-        <path
-           sodipodi:type="inkscape:box3dside"
-           id="path4672"
-           style="fill:url(#radialGradient4686);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:25.42641258;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           inkscape:box3dsidetype="3"
-           d="m 848.09529,1508.1584 310.99731,29.8299 0,325.3405 -310.99731,-97.5228 z"
-           points="1159.0926,1537.9883 1159.0926,1863.3288 848.09529,1765.806 848.09529,1508.1584 " />
-      </g>
-      <g
-         style="stroke-width:41.50059509;stroke-miterlimit:4;stroke-dasharray:none"
-         transform="matrix(0.84587212,0,0,0.61777333,522.69194,659.43804)"
-         id="g5163">
-        <path
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:41.50059509;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 1133.0953,1201.8648 0,420.2235"
-           id="path5131"
-           inkscape:connector-curvature="0" />
-        <path
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:41.50059509;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 1195.7248,1214.2317 -125.259,0"
-           id="path5131-4"
-           inkscape:connector-curvature="0" />
-        <path
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:41.50059509;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 1195.7248,1608.2927 -125.259,0"
-           id="path5131-4-5"
-           inkscape:connector-curvature="0" />
-      </g>
-      <g
-         inkscape:transform-center-y="13.029297"
-         inkscape:transform-center-x="3.25732"
-         style="stroke-width:36.40202713;stroke-miterlimit:4;stroke-dasharray:none"
-         transform="matrix(0.68189651,0.68189651,-0.49801556,0.49801556,1308.7482,384.02081)"
-         id="g5163-6">
-        <path
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:36.40202713;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 1133.0953,1201.8648 0,420.2235"
-           id="path5131-7"
-           inkscape:connector-curvature="0" />
-        <path
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:36.40202713;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 1195.7248,1214.2317 -125.259,0"
-           id="path5131-4-52"
-           inkscape:connector-curvature="0" />
-        <path
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:36.40202713;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 1195.7248,1608.2927 -125.259,0"
-           id="path5131-4-5-1"
-           inkscape:connector-curvature="0" />
-      </g>
-      <g
-         style="stroke-width:34.53853989;stroke-miterlimit:4;stroke-dasharray:none"
-         transform="matrix(0.3661698,-0.98750893,0.7212162,0.26742806,-463.08972,2672.4643)"
-         id="g5163-4">
-        <path
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:34.53853989;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 1133.0953,1201.8648 0,420.2235"
-           id="path5131-5"
-           inkscape:connector-curvature="0" />
-        <path
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:34.53853989;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 1195.7248,1214.2317 -125.259,0"
-           id="path5131-4-7"
-           inkscape:connector-curvature="0" />
-        <path
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:34.53853989;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 1195.7248,1608.2927 -125.259,0"
-           id="path5131-4-5-6"
-           inkscape:connector-curvature="0" />
-      </g>
-    </g>
-    <g
-       sodipodi:type="inkscape:box3d"
-       id="g5468"
-       style="fill:url(#radialGradient5520);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       inkscape:perspectiveID="#perspective5506"
-       inkscape:corner0="-0.018186238 : 0.43389687 : 0 : 1"
-       inkscape:corner7="-0.22247021 : 0.21005412 : 0.25 : 1">
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path5470"
-         style="fill:url(#radialGradient5508);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:26.50515938;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="13"
-         d="m 150.63004,1738.1863 324.19169,101.6604 238.58784,-208.9553 -297.9635,-46.375 z"
-         points="474.82173,1839.8467 713.40957,1630.8914 415.44607,1584.5164 150.63004,1738.1863 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path5472"
-         style="fill:url(#radialGradient5510);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:26.50515938;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="6"
-         d="m 150.63004,1469.6077 0,268.5786 264.81603,-153.6699 0,-214.0699 z"
-         points="150.63004,1738.1863 415.44607,1584.5164 415.44607,1370.4465 150.63004,1469.6077 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path5474"
-         style="fill:url(#radialGradient5512);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:26.50515938;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="11"
-         d="m 415.44607,1370.4465 297.9635,3.8156 0,256.6293 -297.9635,-46.375 z"
-         points="713.40957,1374.2621 713.40957,1630.8914 415.44607,1584.5164 415.44607,1370.4465 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path5476"
-         style="fill:url(#radialGradient5514);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:26.50515938;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="5"
-         d="m 150.63004,1469.6077 324.19169,31.0955 238.58784,-126.4411 -297.9635,-3.8156 z"
-         points="474.82173,1500.7032 713.40957,1374.2621 415.44607,1370.4465 150.63004,1469.6077 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path5478"
-         style="fill:url(#radialGradient5516);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:26.50515938;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="14"
-         d="m 474.82173,1500.7032 0,339.1435 238.58784,-208.9553 0,-256.6293 z"
-         points="474.82173,1839.8467 713.40957,1630.8914 713.40957,1374.2621 474.82173,1500.7032 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path5480"
-         style="fill:url(#radialGradient5518);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:26.50515938;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="3"
-         d="m 150.63004,1469.6077 324.19169,31.0955 0,339.1435 -324.19169,-101.6604 z"
-         points="474.82173,1500.7032 474.82173,1839.8467 150.63004,1738.1863 150.63004,1469.6077 " />
-    </g>
-    <g
-       id="g6303"
-       transform="translate(2245.7143,40)">
-      <g
-         sodipodi:type="inkscape:box3d"
-         id="g5565"
-         style="fill:url(#radialGradient5593);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         inkscape:perspectiveID="#perspective5579"
-         inkscape:corner0="-0.018186238 : 0.43389687 : 0 : 1"
-         inkscape:corner7="-0.22247021 : 0.21005412 : 0.25 : 1">
-        <path
-           sodipodi:type="inkscape:box3dside"
-           id="path5567"
-           style="fill:url(#radialGradient5581);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.62644005;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           inkscape:box3dsidetype="13"
-           d="m 19.980991,743.53503 252.287469,79.11258 185.67017,-162.61 -231.87657,-36.08922 z"
-           points="272.26846,822.64761 457.93863,660.03761 226.06206,623.94839 19.980991,743.53503 " />
-        <path
-           sodipodi:type="inkscape:box3dside"
-           id="path5569"
-           style="fill:url(#radialGradient5583);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.62644005;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           inkscape:box3dsidetype="6"
-           d="m 19.980991,534.52591 0,209.00912 206.081069,-119.58664 0,-166.59015 z"
-           points="19.980991,743.53503 226.06206,623.94839 226.06206,457.35824 19.980991,534.52591 " />
-        <path
-           sodipodi:type="inkscape:box3dside"
-           id="path5571"
-           style="fill:url(#radialGradient5585);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.62644005;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           inkscape:box3dsidetype="11"
-           d="m 226.06206,457.35824 231.87657,2.96931 0,199.71006 -231.87657,-36.08922 z"
-           points="457.93863,460.32755 457.93863,660.03761 226.06206,623.94839 226.06206,457.35824 " />
-        <path
-           sodipodi:type="inkscape:box3dside"
-           id="path5573"
-           style="fill:url(#radialGradient5587);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.62644005;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           inkscape:box3dsidetype="5"
-           d="M 19.980991,534.52591 272.26846,558.72456 457.93863,460.32755 226.06206,457.35824 Z"
-           points="272.26846,558.72456 457.93863,460.32755 226.06206,457.35824 19.980991,534.52591 " />
-        <path
-           sodipodi:type="inkscape:box3dside"
-           id="path5575"
-           style="fill:url(#radialGradient5589);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.62644005;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           inkscape:box3dsidetype="14"
-           d="m 272.26846,558.72456 0,263.92305 185.67017,-162.61 0,-199.71006 z"
-           points="272.26846,822.64761 457.93863,660.03761 457.93863,460.32755 272.26846,558.72456 " />
-        <path
-           sodipodi:type="inkscape:box3dside"
-           id="path5577"
-           style="fill:url(#radialGradient5591);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.62644005;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           inkscape:box3dsidetype="3"
-           d="m 19.980991,534.52591 252.287469,24.19865 0,263.92305 -252.287469,-79.11258 z"
-           points="272.26846,558.72456 272.26846,822.64761 19.980991,743.53503 19.980991,534.52591 " />
-      </g>
-      <path
-         sodipodi:nodetypes="ccccc"
-         inkscape:connector-curvature="0"
-         id="rect5599"
-         d="m 651.1181,348.35242 79.27825,0 0,679.31838 -79.27825,0 z"
-         style="fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <path
-         inkscape:transform-center-y="8.1872131"
-         inkscape:transform-center-x="-1.4855337"
-         sodipodi:nodetypes="cccscc"
-         inkscape:connector-curvature="0"
-         id="rect5599-4"
-         d="m 730.39635,330.99237 0,100.1846 -319.17105,0 c 0,0 3.21751,-32.44724 23.63014,-47.05155 33.71507,-24.12161 170.10288,-53.13305 170.10288,-53.13305 z"
-         style="fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <path
-         inkscape:transform-center-y="-8.1872093"
-         inkscape:transform-center-x="-1.4855328"
-         sodipodi:nodetypes="cccscc"
-         inkscape:connector-curvature="0"
-         id="rect5599-4-4"
-         d="m 730.39635,836.54507 0,-100.18459 -319.171,0 c 0,0 3.21751,32.44723 23.63013,47.05153 33.71508,24.12162 170.10292,53.13306 170.10292,53.13306 z"
-         style="fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    </g>
-    <g
-       inkscape:corner7="-0.22247021 : 0.21005412 : 0.25 : 1"
-       inkscape:corner0="-0.018186238 : 0.43389687 : 0 : 1"
-       inkscape:perspectiveID="#perspective6446"
-       style="fill:url(#radialGradient6460);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="g6432"
-       sodipodi:type="inkscape:box3d">
-      <path
-         points="2307.8013,1536.3397 2488.4696,1378.1103 2262.8397,1342.9933 2062.3103,1459.3583 "
-         d="m 2062.3103,1459.3583 245.491,76.9814 180.6683,-158.2294 -225.6299,-35.117 z"
-         inkscape:box3dsidetype="13"
-         style="fill:url(#radialGradient6448);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.07077217;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path6434"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="2062.3103,1459.3583 2262.8397,1342.9933 2262.8397,1180.891 2062.3103,1255.9798 "
-         d="m 2062.3103,1255.9798 0,203.3785 200.5294,-116.365 0,-162.1023 z"
-         inkscape:box3dsidetype="6"
-         style="fill:url(#radialGradient6450);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.07077217;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path6436"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="2488.4696,1183.7803 2488.4696,1378.1103 2262.8397,1342.9933 2262.8397,1180.891 "
-         d="m 2262.8397,1180.891 225.6299,2.8893 0,194.33 -225.6299,-35.117 z"
-         inkscape:box3dsidetype="11"
-         style="fill:url(#radialGradient6452);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.07077217;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path6438"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="2307.8013,1279.5266 2488.4696,1183.7803 2262.8397,1180.891 2062.3103,1255.9798 "
-         d="m 2062.3103,1255.9798 245.491,23.5468 180.6683,-95.7463 -225.6299,-2.8893 z"
-         inkscape:box3dsidetype="5"
-         style="fill:url(#radialGradient6454);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.07077217;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path6440"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="2307.8013,1536.3397 2488.4696,1378.1103 2488.4696,1183.7803 2307.8013,1279.5266 "
-         d="m 2307.8013,1279.5266 0,256.8131 180.6683,-158.2294 0,-194.33 z"
-         inkscape:box3dsidetype="14"
-         style="fill:url(#radialGradient6456);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.07077217;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path6442"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="2307.8013,1279.5266 2307.8013,1536.3397 2062.3103,1459.3583 2062.3103,1255.9798 "
-         d="m 2062.3103,1255.9798 245.491,23.5468 0,256.8131 -245.491,-76.9814 z"
-         inkscape:box3dsidetype="3"
-         style="fill:url(#radialGradient6458);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.07077217;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path6444"
-         sodipodi:type="inkscape:box3dside" />
-    </g>
-    <g
-       sodipodi:type="inkscape:box3d"
-       id="g4975"
-       style="fill:url(#radialGradient5077);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       inkscape:perspectiveID="#perspective4989"
-       inkscape:corner0="-0.018186238 : 0.43389687 : 0 : 1"
-       inkscape:corner7="-0.22247021 : 0.21005412 : 0.25 : 1">
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4977"
-         style="fill:url(#radialGradient4278);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.07077217;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="13"
-         d="m 2344.4353,1820.1083 245.491,76.9814 180.6683,-158.2294 -225.6299,-35.117 z"
-         points="2589.9263,1897.0897 2770.5946,1738.8603 2544.9647,1703.7433 2344.4353,1820.1083 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4979"
-         style="fill:url(#radialGradient4280);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.07077217;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="6"
-         d="m 2344.4353,1616.7298 0,203.3785 200.5294,-116.365 0,-162.1023 z"
-         points="2344.4353,1820.1083 2544.9647,1703.7433 2544.9647,1541.641 2344.4353,1616.7298 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4981"
-         style="fill:url(#radialGradient4282);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.07077217;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="11"
-         d="m 2544.9647,1541.641 225.6299,2.8893 0,194.33 -225.6299,-35.117 z"
-         points="2770.5946,1544.5303 2770.5946,1738.8603 2544.9647,1703.7433 2544.9647,1541.641 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4983"
-         style="fill:url(#radialGradient4284);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.07077217;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="5"
-         d="m 2344.4353,1616.7298 245.491,23.5468 180.6683,-95.7463 -225.6299,-2.8893 z"
-         points="2589.9263,1640.2766 2770.5946,1544.5303 2544.9647,1541.641 2344.4353,1616.7298 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4985"
-         style="fill:url(#radialGradient4286);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.07077217;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="14"
-         d="m 2589.9263,1640.2766 0,256.8131 180.6683,-158.2294 0,-194.33 z"
-         points="2589.9263,1897.0897 2770.5946,1738.8603 2770.5946,1544.5303 2589.9263,1640.2766 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4987"
-         style="fill:url(#radialGradient5075);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20.07077217;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="3"
-         d="m 2344.4353,1616.7298 245.491,23.5468 0,256.8131 -245.491,-76.9814 z"
-         points="2589.9263,1640.2766 2589.9263,1897.0897 2344.4353,1820.1083 2344.4353,1616.7298 " />
-    </g>
-    <path
-       style="fill:#a270c6;fill-opacity:0.74594595;stroke:#000000;stroke-width:13.78146648;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 2534.3021,1212.0297 0,76.2283 44.9948,0 c 37.8732,0 51.3144,9.0537 51.3144,35.7748 l 0,71.3415 -50.1668,0 93.9822,111.277 93.8375,-111.277 -50.0219,0 c -0.1938,-51.4683 0.021,-54.4726 0.1913,-107.1163 0,-50.4025 -41.6509,-76.2283 -87.8223,-76.2283 z"
-       id="rect4663-5"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccc" />
-    <g
-       inkscape:corner7="-0.22247021 : 0.21005412 : 0.25 : 1"
-       inkscape:corner0="-0.018186238 : 0.43389687 : 0 : 1"
-       inkscape:perspectiveID="#perspective4314"
-       style="fill:url(#radialGradient4328);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="g4300"
-       sodipodi:type="inkscape:box3d">
-      <path
-         points="-334.76809,1764.8788 -116.91723,1574.085 -388.98305,1531.7407 -630.78246,1672.0543 "
-         d="m -630.78246,1672.0543 296.01437,92.8245 217.85086,-190.7938 -272.06582,-42.3443 z"
-         inkscape:box3dsidetype="13"
-         style="fill:url(#radialGradient4316);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:24.20144844;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4302"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="-630.78246,1672.0543 -388.98305,1531.7407 -388.98305,1336.2769 -630.78246,1426.8194 "
-         d="m -630.78246,1426.8194 0,245.2349 241.79941,-140.3136 0,-195.4638 z"
-         inkscape:box3dsidetype="6"
-         style="fill:url(#radialGradient4318);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:24.20144844;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4304"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="-116.91723,1339.7608 -116.91723,1574.085 -388.98305,1531.7407 -388.98305,1336.2769 "
-         d="m -388.98305,1336.2769 272.06582,3.4839 0,234.3242 -272.06582,-42.3443 z"
-         inkscape:box3dsidetype="11"
-         style="fill:url(#radialGradient4320);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:24.20144844;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4306"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="-334.76809,1455.2122 -116.91723,1339.7608 -388.98305,1336.2769 -630.78246,1426.8194 "
-         d="m -630.78246,1426.8194 296.01437,28.3928 217.85086,-115.4514 -272.06582,-3.4839 z"
-         inkscape:box3dsidetype="5"
-         style="fill:url(#radialGradient4322);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:24.20144844;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4308"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="-334.76809,1764.8788 -116.91723,1574.085 -116.91723,1339.7608 -334.76809,1455.2122 "
-         d="m -334.76809,1455.2122 0,309.6666 217.85086,-190.7938 0,-234.3242 z"
-         inkscape:box3dsidetype="14"
-         style="fill:url(#radialGradient4324);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:24.20144844;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4310"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="-334.76809,1455.2122 -334.76809,1764.8788 -630.78246,1672.0543 -630.78246,1426.8194 "
-         d="m -630.78246,1426.8194 296.01437,28.3928 0,309.6666 -296.01437,-92.8245 z"
-         inkscape:box3dsidetype="3"
-         style="fill:url(#radialGradient4326);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:24.20144844;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4312"
-         sodipodi:type="inkscape:box3dside" />
-    </g>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#00647e;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m -720.05099,1536.7819 481.25002,75"
-       id="path4330"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#00647e;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m -246.61348,1611.7819 198.437512,-162.5"
-       id="path4330-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <g
-       sodipodi:type="inkscape:box3d"
-       id="g4545"
-       style="fill:url(#radialGradient4573);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       inkscape:perspectiveID="#perspective4559"
-       inkscape:corner0="-0.020875419 : 0.34843243 : 0 : 1"
-       inkscape:corner7="-0.22247021 : 0.21005412 : 0.24804643 : 1">
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4547"
-         style="fill:url(#radialGradient4561);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:27.29643822;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="13"
-         d="m -840.38243,999.33317 301.85337,113.39163 223.16488,-234.13479 -277.5008,-52.0092 z"
-         points="-538.52906,1112.7248 -315.36418,878.59001 -592.86498,826.58081 -840.38243,999.33317 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4549"
-         style="fill:url(#radialGradient4563);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:27.29643822;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="6"
-         d="m -840.38243,811.66931 0,187.66386 247.51745,-172.75236 0,-149.73162 z"
-         points="-840.38243,999.33317 -592.86498,826.58081 -592.86498,676.84919 -840.38243,811.66931 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4551"
-         style="fill:url(#radialGradient4565);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:27.29643822;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="11"
-         d="m -592.86498,676.84919 277.5008,22.57685 0,179.16397 -277.5008,-52.0092 z"
-         points="-315.36418,699.42604 -315.36418,878.59001 -592.86498,826.58081 -592.86498,676.84919 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4553"
-         style="fill:url(#radialGradient4567);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:27.29643822;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="5"
-         d="m -840.38243,811.66931 301.85337,64.7349 223.16488,-176.97817 -277.5008,-22.57685 z"
-         points="-538.52906,876.40421 -315.36418,699.42604 -592.86498,676.84919 -840.38243,811.66931 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4555"
-         style="fill:url(#radialGradient4569);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:27.29643822;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="14"
-         d="m -538.52906,876.40421 0,236.32059 223.16488,-234.13479 0,-179.16397 z"
-         points="-538.52906,1112.7248 -315.36418,878.59001 -315.36418,699.42604 -538.52906,876.40421 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4557"
-         style="fill:url(#radialGradient4571);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:27.29643822;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="3"
-         d="m -840.38243,811.66931 301.85337,64.7349 0,236.32059 -301.85337,-113.39163 z"
-         points="-538.52906,876.40421 -538.52906,1112.7248 -840.38243,999.33317 -840.38243,811.66931 " />
-    </g>
-    <path
-       style="fill:#056e6e;fill-opacity:0.76190479;fill-rule:nonzero;stroke:#000000;stroke-width:19.16188049;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m -600.211,630.23733 391.07706,39.02955 -278.51442,274.2873 -469.63158,-116.05779 z"
-       id="rect4575"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <g
-       inkscape:corner7="-0.22247021 : 0.21005412 : 0.24804643 : 1"
-       inkscape:corner0="-0.020875419 : 0.39044879 : 0 : 1"
-       inkscape:perspectiveID="#perspective4412"
-       style="fill:url(#radialGradient4426);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="g4398"
-       sodipodi:type="inkscape:box3d">
-      <path
-         points="-536.61997,800.00452 -311.74315,635.22359 -591.37278,598.62021 -840.789,720.20101 "
-         d="m -840.789,720.20101 304.16903,79.80351 224.87682,-164.78093 -279.62963,-36.60338 z"
-         inkscape:box3dsidetype="13"
-         style="fill:url(#radialGradient4414);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:22.98719215;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4400"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="-840.789,720.20101 -591.37278,598.62021 -591.37278,461.24443 -840.789,548.02314 "
-         d="m -840.789,548.02314 0,172.17787 249.41622,-121.5808 0,-137.37578 z"
-         inkscape:box3dsidetype="6"
-         style="fill:url(#radialGradient4416);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:22.98719215;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4402"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="-311.74315,470.84422 -311.74315,635.22359 -591.37278,598.62021 -591.37278,461.24443 "
-         d="m -591.37278,461.24443 279.62963,9.59979 0,164.37937 -279.62963,-36.60338 z"
-         inkscape:box3dsidetype="11"
-         style="fill:url(#radialGradient4418);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:22.98719215;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4404"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="-536.61997,583.18507 -311.74315,470.84422 -591.37278,461.24443 -840.789,548.02314 "
-         d="m -840.789,548.02314 304.16903,35.16193 224.87682,-112.34085 -279.62963,-9.59979 z"
-         inkscape:box3dsidetype="5"
-         style="fill:url(#radialGradient4420);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:22.98719215;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4406"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="-536.61997,800.00452 -311.74315,635.22359 -311.74315,470.84422 -536.61997,583.18507 "
-         d="m -536.61997,583.18507 0,216.81945 224.87682,-164.78093 0,-164.37937 z"
-         inkscape:box3dsidetype="14"
-         style="fill:url(#radialGradient4422);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:22.98719215;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4408"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="-536.61997,583.18507 -536.61997,800.00452 -840.789,720.20101 -840.789,548.02314 "
-         d="m -840.789,548.02314 304.16903,35.16193 0,216.81945 -304.16903,-79.80351 z"
-         inkscape:box3dsidetype="3"
-         style="fill:url(#radialGradient4424);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:22.98719215;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4410"
-         sodipodi:type="inkscape:box3dside" />
-    </g>
-    <g
-       inkscape:corner7="-0.22247021 : 0.21005412 : 0.25 : 1"
-       inkscape:corner0="-0.018186238 : 0.43389687 : 0 : 1"
-       inkscape:perspectiveID="#perspective4477"
-       style="fill:url(#radialGradient4491);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="g4463"
-       sodipodi:type="inkscape:box3d">
-      <path
-         points="-399.55654,2418.3174 -138.67088,2189.8336 -464.48132,2139.1245 -754.0464,2307.156 "
-         d="m -754.0464,2307.156 354.48986,111.1614 260.88566,-228.4838 -325.81044,-50.7091 z"
-         inkscape:box3dsidetype="13"
-         style="fill:url(#radialGradient4479);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:28.98226738;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4465"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="-754.0464,2307.156 -464.48132,2139.1245 -464.48132,1905.0482 -754.0464,2013.4767 "
-         d="m -754.0464,2013.4767 0,293.6793 289.56508,-168.0315 0,-234.0763 z"
-         inkscape:box3dsidetype="6"
-         style="fill:url(#radialGradient4481);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:28.98226738;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4467"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="-138.67088,1909.2204 -138.67088,2189.8336 -464.48132,2139.1245 -464.48132,1905.0482 "
-         d="m -464.48132,1905.0482 325.81044,4.1722 0,280.6132 -325.81044,-50.7091 z"
-         inkscape:box3dsidetype="11"
-         style="fill:url(#radialGradient4483);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:28.98226738;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4469"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="-399.55654,2047.4784 -138.67088,1909.2204 -464.48132,1905.0482 -754.0464,2013.4767 "
-         d="m -754.0464,2013.4767 354.48986,34.0017 260.88566,-138.258 -325.81044,-4.1722 z"
-         inkscape:box3dsidetype="5"
-         style="fill:url(#radialGradient4485);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:28.98226738;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4471"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="-399.55654,2418.3174 -138.67088,2189.8336 -138.67088,1909.2204 -399.55654,2047.4784 "
-         d="m -399.55654,2047.4784 0,370.839 260.88566,-228.4838 0,-280.6132 z"
-         inkscape:box3dsidetype="14"
-         style="fill:url(#radialGradient4487);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:28.98226738;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4473"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="-399.55654,2047.4784 -399.55654,2418.3174 -754.0464,2307.156 -754.0464,2013.4767 "
-         d="m -754.0464,2013.4767 354.48986,34.0017 0,370.839 -354.48986,-111.1614 z"
-         inkscape:box3dsidetype="3"
-         style="fill:url(#radialGradient4489);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:28.98226738;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4475"
-         sodipodi:type="inkscape:box3dside" />
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:83.20240021px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="-724.07745"
-       y="2613.4546"
-       id="text4493"
-       sodipodi:linespacing="125%"><tspan
-         sodipodi:role="line"
-         id="tspan4495"
-         x="-724.07745"
-         y="2613.4546"
-         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:277.34133911px;font-family:'Droid Sans';-inkscape-font-specification:'Droid Sans Bold'">F - D</tspan></text>
-    <g
-       inkscape:corner7="-0.22247021 : 0.21005412 : 0.25 : 1"
-       inkscape:corner0="-0.018186238 : 0.43389687 : 0 : 1"
-       inkscape:perspectiveID="#perspective4417"
-       style="fill:url(#radialGradient4431);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="g4395"
-       sodipodi:type="inkscape:box3d">
-      <path
-         points="802.74937,2809.5482 1013.0222,2625.3912 750.42026,2584.5199 517.03194,2719.9527 "
-         d="m 517.03194,2719.9527 285.71743,89.5955 210.27283,-184.157 -262.60194,-40.8713 z"
-         inkscape:box3dsidetype="13"
-         style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.35959244;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4397"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="517.03194,2719.9527 750.42026,2584.5199 750.42026,2395.8553 517.03194,2483.2483 "
-         d="m 517.03194,2483.2483 0,236.7044 233.38832,-135.4328 0,-188.6646 z"
-         inkscape:box3dsidetype="6"
-         style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.35959244;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4399"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="1013.0222,2399.2181 1013.0222,2625.3912 750.42026,2584.5199 750.42026,2395.8553 "
-         d="m 750.42026,2395.8553 262.60194,3.3628 0,226.1731 -262.60194,-40.8713 z"
-         inkscape:box3dsidetype="11"
-         style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.35959244;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4401"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="802.74937,2809.5482 1013.0222,2625.3912 1013.0222,2399.2181 802.74937,2510.6534 "
-         d="m 802.74937,2510.6534 0,298.8948 210.27283,-184.157 0,-226.1731 z"
-         inkscape:box3dsidetype="14"
-         style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.35959244;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4405"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="802.74937,2510.6534 802.74937,2809.5482 517.03194,2719.9527 517.03194,2483.2483 "
-         d="m 517.03194,2483.2483 285.71743,27.4051 0,298.8948 -285.71743,-89.5955 z"
-         inkscape:box3dsidetype="3"
-         style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.35959244;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4407"
-         sodipodi:type="inkscape:box3dside" />
-    </g>
-    <path
-       inkscape:connector-curvature="0"
-       id="path4409"
-       d="m 338.09032,2390.5408 0,-286.0945 288.87814,0 0,286.0945 z"
-       style="fill:url(#radialGradient4433);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:18.10680008;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       sodipodi:nodetypes="cccccccccccc"
-       inkscape:connector-curvature="0"
-       id="path4415"
-       d="m 690.02871,2104.0845 0,76.2283 92.9948,0 c 37.8732,0 51.3144,9.0537 51.3144,35.7748 l 0,47.3415 -50.1668,0 93.9822,111.277 93.8375,-111.277 -50.0219,0 c -0.1938,-51.4683 0.021,-30.4726 0.1913,-83.1163 0,-50.4025 -41.6509,-76.2283 -87.8223,-76.2283 z"
-       style="fill:#a270c6;fill-opacity:0.74594595;stroke:#000000;stroke-width:13.78146648;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:" />
-    <path
-       style="fill:url(#linearGradient4458);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:20;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:"
-       d="m 1003.125,2628.7372 -204.68749,168.75 -268.75,-84.375 c 0,0 112.89908,-291.1009 239.97779,-286.0485 127.07872,5.0523 149.53474,66.8535 233.4597,201.6735 z"
-       id="rect4450"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccczc" />
-    <path
-       style="fill:none;fill-opacity:0.76190479;fill-rule:nonzero;stroke:#000000;stroke-width:24;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:"
-       d="m 802.66737,2510.6344 208.27013,-106.8972 1.5625,221.875 -208.45969,181.8187 z"
-       id="rect4461"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:none;fill-opacity:0.76190479;fill-rule:nonzero;stroke:#000000;stroke-width:24;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:"
-       d="m 516.94291,2483.5547 285.60996,27.895 0.45765,295.9002 -286.90438,-86.6608 z"
-       id="rect4461-3"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <g
-       sodipodi:type="inkscape:box3d"
-       id="g4379"
-       style="fill:url(#radialGradient4407);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       inkscape:perspectiveID="#perspective4393"
-       inkscape:corner0="-0.018186238 : 0.43389687 : 0 : 1"
-       inkscape:corner7="-0.22247021 : 0.21005412 : 0.25 : 1">
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4381"
-         style="fill:url(#radialGradient4395);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.9123497;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="13"
-         d="M 29.856077,667.70319 322.3344,759.41887 537.5829,570.90413 268.76705,529.06568 Z"
-         points="322.3344,759.41887 537.5829,570.90413 268.76705,529.06568 29.856077,667.70319 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4383"
-         style="fill:url(#radialGradient4397);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.9123497;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="6"
-         d="m 29.856077,425.3977 0,242.30549 238.910973,-138.63751 0,-193.12892 z"
-         points="29.856077,667.70319 268.76705,529.06568 268.76705,335.93676 29.856077,425.3977 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4385"
-         style="fill:url(#radialGradient4399);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.9123497;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="11"
-         d="m 268.76705,335.93676 268.81585,3.44233 0,231.52504 -268.81585,-41.83845 z"
-         points="537.5829,339.37909 537.5829,570.90413 268.76705,529.06568 268.76705,335.93676 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4387"
-         style="fill:url(#radialGradient4401);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.9123497;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="5"
-         d="M 29.856077,425.3977 322.3344,453.45134 537.5829,339.37909 268.76705,335.93676 Z"
-         points="322.3344,453.45134 537.5829,339.37909 268.76705,335.93676 29.856077,425.3977 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4389"
-         style="fill:url(#radialGradient4403);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.9123497;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="14"
-         d="m 322.3344,453.45134 0,305.96753 215.2485,-188.51474 0,-231.52504 z"
-         points="322.3344,759.41887 537.5829,570.90413 537.5829,339.37909 322.3344,453.45134 " />
-      <path
-         sodipodi:type="inkscape:box3dside"
-         id="path4391"
-         style="fill:url(#radialGradient4405);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.9123497;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:box3dsidetype="3"
-         d="m 29.856077,425.3977 292.478323,28.05364 0,305.96753 -292.478323,-91.71568 z"
-         points="322.3344,453.45134 322.3344,759.41887 29.856077,667.70319 29.856077,425.3977 " />
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:340.30142212px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="54.434803"
-       y="1023.5525"
-       id="text4409"
-       sodipodi:linespacing="125%"><tspan
-         sodipodi:role="line"
-         id="tspan4411"
-         x="54.434803"
-         y="1023.5525"
-         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">k</tspan></text>
-    <path
-       style="fill:#4d21ac;fill-opacity:0.76190478;fill-rule:nonzero;stroke:none;stroke-width:33.14562988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 708.96753,894.86804 c -16.367,-0.49543 -33.09923,0.89775 -49.58867,1.67374 -22.41797,2.07179 -47.38533,3.91935 -65.07735,19.51376 -13.13018,13.44556 -19.97455,31.54897 -27.60979,48.3924 -6.12944,15.4023 -12.09668,31.10039 -15.65583,47.27946 2.3865,4.6982 9.47721,2.7078 13.80468,3.6836 47.58806,1.3847 95.21038,0.4761 142.8125,0.7441 4.41007,-3.5954 0.85571,-11.6477 2,-16.99995 0,-34.25977 0,-68.51953 0,-102.7793 l -0.41389,-0.91032 -0.27165,-0.59749 z"
-       id="path4480"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#b72cba;fill-opacity:0.76190478;fill-rule:nonzero;stroke:none;stroke-width:33.14562988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 711.81923,871.97937 c -0.57919,-42.74963 0.23626,-85.59766 -0.3457,-128.33399 -2.35588,-5.15355 -9.64124,-1.91564 -14.1875,-2.9707 -23.3882,0.15739 -46.80299,0.67514 -70.16211,1.07812 -7.54874,0.1298 -9.44315,8.9739 -13.10156,14.13672 -7.76587,13.56528 -10.22523,29.61827 -7.36323,44.94357 3.86998,28.86375 13.20862,58.24323 32.42182,80.65214 4.29111,6.54747 12.31765,3.39 18.77562,3.58508 17.23921,-1.09449 34.84945,-0.74519 51.83054,-3.34795 2.31234,-2.32876 2.00678,-6.62538 2. [...]
-       id="path4482"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#bb1c58;fill-opacity:0.76190478;fill-rule:nonzero;stroke:none;stroke-width:33.14562988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 608.87587,849.81726 c -3.35826,-13.18922 -9.35851,-25.75394 -10.19922,-39.5586 -2.95695,-20.58694 -2.71828,-43.209 8.25196,-61.66796 1.77146,-3.89024 -0.82233,-8.204 -5.32698,-7.34259 -19.88786,-1.27402 -39.85863,-0.45524 -59.76677,-0.3957 -6.45975,0.28651 -14.59503,2.11458 -15.75391,9.65039 -2.70598,14.90113 -1.96405,31.0429 6.24414,44.25 12.17381,20.37744 31.66868,35.05688 50.76367,48.54688 7.04931,3.81447 13.49564,10.21105 21.64063,11.24805 2.49549,-0.0736 4.35436,-2.25245 [...]
-       id="path4484"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#2e5dff;fill-opacity:0.76190478;fill-rule:nonzero;stroke:none;stroke-width:33.14562988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 627.579,885.38757 c -3.19993,-11.77867 -14.78547,-19.08579 -26.02735,-22.08594 -26.52143,-10.75514 -49.40984,-29.58788 -68.20507,-50.59375 -5.28403,-5.75439 -8.29031,-14.19794 -14.51758,-18.55273 -8.36882,1.97178 -14.98369,8.43488 -21.06676,14.17692 -19.40024,20.8605 -23.21023,51.16519 -21.25577,78.43703 0.65063,13.65785 0.44187,28.08137 5.82057,40.82746 5.34714,5.50319 11.64592,-2.17085 16.66407,-4.2461 14.47969,-7.26358 31.01399,-12.36111 47.51953,-10.58008 9.30981,1.11987  [...]
-       id="path4486"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#ff00bc;fill-opacity:0.76190478;fill-rule:nonzero;stroke:none;stroke-width:33.14562988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 567.45009,931.89538 c -2.48569,-5.2873 -9.92811,-6.29646 -15.20898,-8.05664 -22.49197,-5.33216 -44.92494,5.03616 -62.742,18.0777 -22.01612,15.85071 -41.83541,36.52433 -52.11931,61.96136 -1.2088,4.3345 -2.6544,10.9221 1.4883,13.7832 28.91055,1.0622 57.87125,0.434 86.78121,0.072 5.16339,-0.6885 12.95231,-0.5803 13.81641,-7.2363 4.15551,-19.9186 12.18782,-38.91368 19.67297,-57.81124 2.50155,-6.99827 6.631,-13.63944 8.3114,-20.79034 z"
-       id="path4488"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#f23eff;fill-opacity:0.76190478;fill-rule:nonzero;stroke:none;stroke-width:33.14562988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 518.41493,778.14734 c -1.46174,-12.18947 1.63376,-24.59597 -1.44335,-36.66602 -5.93146,-4.67084 -14.73252,-2.18514 -21.85352,-2.85742 -18.05847,-0.14646 -36.26282,-0.037 -54.23436,-0.0645 -6.7795,1.62168 -8.2243,9.79434 -6.6055,15.58203 0.1657,72.1367 -0.3311,144.35667 0.2481,216.4414 2.4979,6.96201 12.1915,4.10387 14.5918,-1.45898 8.53578,-10.54382 20.36714,-18.54934 27.39847,-30.15477 -1.62771,-12.19128 -6.37659,-23.55792 -6.53492,-35.91916 -2.56591,-30.55598 -2.7709,-63.93 [...]
-       id="path4492"
-       inkscape:connector-curvature="0" />
-    <rect
-       style="fill:none;fill-opacity:0.76190479;fill-rule:nonzero;stroke:#000000;stroke-width:25.22850037;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4413"
-       width="295.64648"
-       height="295.64648"
-       x="731.10144"
-       y="-721.26074"
-       transform="matrix(0,1,-1,0,0,0)" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 712.5,889.86219 c 0,0 -84.56123,-7.80797 -117.72992,16.92976 C 561.60139,931.52967 540.625,1024.2372 540.625,1024.2372"
-       id="path4416"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="czc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 633.31433,730.98015 c 0,0 -41.98447,17.67767 -30.81208,76.81793 11.72086,62.04363 36.748,80.88354 36.748,80.88354"
-       id="path4416-3"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="csc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 574.5842,928.97494 c 0,0 -33.7147,-30.63517 -82.64975,4.40414 C 440.5971,970.13857 431.287,1002.982 431.287,1002.982"
-       id="path4416-3-6"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="csc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 525.82681,738.99301 c 0,0 -23.99703,38.72129 19.35293,80.47262 45.47812,43.80104 76.79172,44.67208 76.79172,44.67208"
-       id="path4416-3-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="csc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 528.11613,787.14477 c 0,0 -45.46572,2.8397 -54.42606,62.35529 -9.40025,62.43737 8.01184,88.47809 8.01184,88.47809"
-       id="path4416-3-7-5"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="csc" />
-    <g
-       inkscape:corner7="-0.22247021 : 0.21005412 : 0.25 : 1"
-       inkscape:corner0="-0.018186238 : 0.43389687 : 0 : 1"
-       inkscape:perspectiveID="#perspective4576"
-       style="fill:url(#radialGradient4590);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="g4532"
-       sodipodi:type="inkscape:box3d">
-      <path
-         points="1984.8345,2559.4189 2200.083,2370.9041 1931.2671,2329.0657 1692.3562,2467.7032 "
-         d="m 1692.3562,2467.7032 292.4783,91.7157 215.2485,-188.5148 -268.8159,-41.8384 z"
-         inkscape:box3dsidetype="13"
-         style="fill:url(#radialGradient4578);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.9123497;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4534"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="1692.3562,2467.7032 1931.2671,2329.0657 1931.2671,2135.9368 1692.3562,2225.3977 "
-         d="m 1692.3562,2225.3977 0,242.3055 238.9109,-138.6375 0,-193.1289 z"
-         inkscape:box3dsidetype="6"
-         style="fill:url(#radialGradient4580);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.9123497;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4536"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="2200.083,2139.3791 2200.083,2370.9041 1931.2671,2329.0657 1931.2671,2135.9368 "
-         d="m 1931.2671,2135.9368 268.8159,3.4423 0,231.525 -268.8159,-41.8384 z"
-         inkscape:box3dsidetype="11"
-         style="fill:url(#radialGradient4582);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.9123497;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4538"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="1984.8345,2253.4514 2200.083,2139.3791 1931.2671,2135.9368 1692.3562,2225.3977 "
-         d="m 1692.3562,2225.3977 292.4783,28.0537 215.2485,-114.0723 -268.8159,-3.4423 z"
-         inkscape:box3dsidetype="5"
-         style="fill:url(#radialGradient4584);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.9123497;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4540"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="1984.8345,2559.4189 2200.083,2370.9041 2200.083,2139.3791 1984.8345,2253.4514 "
-         d="m 1984.8345,2253.4514 0,305.9675 215.2485,-188.5148 0,-231.525 z"
-         inkscape:box3dsidetype="14"
-         style="fill:url(#radialGradient4586);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.9123497;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4542"
-         sodipodi:type="inkscape:box3dside" />
-      <path
-         points="1984.8345,2253.4514 1984.8345,2559.4189 1692.3562,2467.7032 1692.3562,2225.3977 "
-         d="m 1692.3562,2225.3977 292.4783,28.0537 0,305.9675 -292.4783,-91.7157 z"
-         inkscape:box3dsidetype="3"
-         style="fill:url(#radialGradient4588);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:23.9123497;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path4544"
-         sodipodi:type="inkscape:box3dside" />
-    </g>
-    <text
-       sodipodi:linespacing="125%"
-       id="text4546"
-       y="2823.5525"
-       x="1716.9348"
-       style="font-style:normal;font-weight:normal;font-size:340.30142212px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       xml:space="preserve"><tspan
-         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
-         y="2823.5525"
-         x="1716.9348"
-         id="tspan4548"
-         sodipodi:role="line">k</tspan></text>
-    <g
-       transform="matrix(0,1,-1,0,3114.8622,2105.4872)"
-       id="g4550">
-      <path
-         style="fill:#e64cd4;fill-opacity:0.76190479;fill-rule:nonzero;stroke:none;stroke-width:33.14562988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 589.38086,743.39467 c -0.49543,16.367 0.89775,33.09923 1.67374,49.58867 2.07179,22.41797 3.91935,47.38533 19.51376,65.07735 13.44556,13.13018 31.54897,19.97455 48.3924,27.60979 15.4023,6.12944 31.10039,12.09668 47.27947,15.65583 4.69817,-2.3865 2.7078,-9.47721 3.6836,-13.80468 1.38472,-47.58806 0.47611,-95.21038 0.74414,-142.8125 -3.59546,-4.41007 -11.64775,-0.85571 -17,-2 -34.25977,0 -68.51953,0 -102.7793,0 l -0.91032,0.41389 -0.59749,0.27165 z"
-         id="path4552"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#5b2cba;fill-opacity:0.76190479;fill-rule:nonzero;stroke:none;stroke-width:33.14562988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 566.49219,740.54297 c -42.74963,0.57919 -85.59766,-0.23626 -128.33399,0.3457 -5.15355,2.35588 -1.91564,9.64124 -2.9707,14.1875 0.15739,23.3882 0.67514,46.80299 1.07812,70.16211 0.1298,7.54874 8.9739,9.44315 14.13672,13.10156 13.56528,7.76587 29.61827,10.22523 44.94357,7.36323 28.86375,-3.86998 58.24323,-13.20862 80.65214,-32.42182 6.54747,-4.29111 3.39,-12.31765 3.58508,-18.77562 -1.09449,-17.23921 -0.74519,-34.84945 -3.34795,-51.83054 -2.32876,-2.31234 -6.62538,-2.00678 -9 [...]
-         id="path4554"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#4090ff;fill-opacity:0.76190479;fill-rule:nonzero;stroke:none;stroke-width:33.14562988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 544.33008,843.48633 c -13.18922,3.35826 -25.75394,9.35851 -39.5586,10.19922 -20.58694,2.95695 -43.209,2.71828 -61.66796,-8.25196 -3.89024,-1.77146 -8.204,0.82233 -7.34259,5.32698 -1.27402,19.88786 -0.45524,39.85863 -0.3957,59.76677 0.28651,6.45975 2.11458,14.59503 9.65039,15.75391 14.90113,2.70598 31.0429,1.96405 44.25,-6.24414 20.37744,-12.17381 35.05688,-31.66868 48.54688,-50.76367 3.81447,-7.04931 10.21105,-13.49564 11.24805,-21.64063 -0.0736,-2.49549 -2.25245,-4.35436 - [...]
-         id="path4556"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#ff2e91;fill-opacity:0.76190479;fill-rule:nonzero;stroke:none;stroke-width:33.14562988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 579.90039,824.7832 c -11.77867,3.19993 -19.08579,14.78547 -22.08594,26.02735 -10.75514,26.52143 -29.58788,49.40984 -50.59375,68.20507 -5.75439,5.28403 -14.19794,8.29031 -18.55273,14.51758 1.97178,8.36882 8.43488,14.98369 14.17692,21.06676 20.8605,19.40024 51.16519,23.21023 78.43703,21.25577 13.65785,-0.65063 28.08137,-0.44187 40.82746,-5.82057 5.50319,-5.34714 -2.17085,-11.64592 -4.2461,-16.66407 -7.26358,-14.47969 -12.36111,-31.01399 -10.58008,-47.51953 1.11987,-9.30981 5. [...]
-         id="path4558"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#6977ff;fill-opacity:0.76190479;fill-rule:nonzero;stroke:none;stroke-width:33.14562988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 626.4082,884.91211 c -5.2873,2.48569 -6.29646,9.92811 -8.05664,15.20898 -5.33216,22.49197 5.03616,44.92494 18.0777,62.742 15.85071,22.01612 36.52433,41.83541 61.96136,52.11931 4.33452,1.2088 10.9221,2.6544 13.78321,-1.4883 1.0622,-28.91055 0.43401,-57.87125 0.0723,-86.78121 -0.68851,-5.16339 -0.58033,-12.95231 -7.23632,-13.81641 -19.91859,-4.15551 -38.91367,-12.18782 -57.81123,-19.67297 -6.99827,-2.50155 -13.63944,-6.631 -20.79034,-8.3114 z"
-         id="path4560"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#3e4fff;fill-opacity:0.76190479;fill-rule:nonzero;stroke:none;stroke-width:33.14562988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 472.66016,933.94727 c -12.18947,1.46174 -24.59597,-1.63376 -36.66602,1.44335 -4.67084,5.93146 -2.18514,14.73252 -2.85742,21.85352 -0.14646,18.05847 -0.037,36.26282 -0.0645,54.23436 1.62168,6.7795 9.79434,8.2243 15.58203,6.6055 72.1367,-0.1657 144.35667,0.3311 216.4414,-0.2481 6.96201,-2.4979 4.10387,-12.1915 -1.45898,-14.5918 -10.54382,-8.53578 -18.54934,-20.36714 -30.15477,-27.39847 -12.19128,1.62771 -23.55792,6.37659 -35.91916,6.53492 -30.55598,2.56591 -63.93811,2.7709 -9 [...]
-         id="path4562"
-         inkscape:connector-curvature="0" />
-      <rect
-         style="fill:none;fill-opacity:0.76190479;fill-rule:nonzero;stroke:#000000;stroke-width:25.22850037;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect4564"
-         width="295.64648"
-         height="295.64648"
-         x="425.61426"
-         y="731.10144" />
-      <path
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         d="m 584.37501,739.8622 c 0,0 -7.80797,84.56123 16.92976,117.72992 24.73772,33.16869 117.44524,54.14508 117.44524,54.14508"
-         id="path4566"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="czc" />
-      <path
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         d="m 425.49297,819.04787 c 0,0 17.67767,41.98447 76.81793,30.81208 62.04363,-11.72086 80.88354,-36.748 80.88354,-36.748"
-         id="path4568"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="csc" />
-      <path
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         d="m 623.48776,877.778 c 0,0 -30.63517,33.7147 4.40414,82.64975 36.75949,51.33735 69.6029,60.64745 69.6029,60.64745"
-         id="path4570"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="csc" />
-      <path
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         d="m 433.50583,926.53539 c 0,0 38.72129,23.99703 80.47262,-19.35293 43.80104,-45.47812 44.67208,-76.79172 44.67208,-76.79172"
-         id="path4572"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="csc" />
-      <path
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         d="m 481.65759,924.24607 c 0,0 2.8397,45.46572 62.35529,54.42606 62.43737,9.40025 88.47809,-8.01184 88.47809,-8.01184"
-         id="path4574"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="csc" />
-    </g>
-  </g>
-</svg>
diff --git a/pixmaps/gwy_volume_calibrate-24.png b/pixmaps/gwy_volume_calibrate-24.png
index 2011863..c765049 100644
Binary files a/pixmaps/gwy_volume_calibrate-24.png and b/pixmaps/gwy_volume_calibrate-24.png differ
diff --git a/pixmaps/gwy_volume_dimensions-24.png b/pixmaps/gwy_volume_dimensions-24.png
index 6147235..faa0ba1 100644
Binary files a/pixmaps/gwy_volume_dimensions-24.png and b/pixmaps/gwy_volume_dimensions-24.png differ
diff --git a/pixmaps/gwy_volume_fd-24.png b/pixmaps/gwy_volume_fd-24.png
index e7a28e4..846421b 100644
Binary files a/pixmaps/gwy_volume_fd-24.png and b/pixmaps/gwy_volume_fd-24.png differ
diff --git a/pixmaps/gwy_volume_invert-24.png b/pixmaps/gwy_volume_invert-24.png
index 7c2450f..5d2e513 100644
Binary files a/pixmaps/gwy_volume_invert-24.png and b/pixmaps/gwy_volume_invert-24.png differ
diff --git a/pixmaps/gwy_volume_kmeans-24.png b/pixmaps/gwy_volume_kmeans-24.png
index d16773b..1e30b6e 100644
Binary files a/pixmaps/gwy_volume_kmeans-24.png and b/pixmaps/gwy_volume_kmeans-24.png differ
diff --git a/pixmaps/gwy_volume_kmedians-24.png b/pixmaps/gwy_volume_kmedians-24.png
index ba33d87..20be117 100644
Binary files a/pixmaps/gwy_volume_kmedians-24.png and b/pixmaps/gwy_volume_kmedians-24.png differ
diff --git a/pixmaps/gwy_volume_slice-24.png b/pixmaps/gwy_volume_slice-24.png
index ed1b502..13a3630 100644
Binary files a/pixmaps/gwy_volume_slice-24.png and b/pixmaps/gwy_volume_slice-24.png differ
diff --git a/pixmaps/gwy_volumize-24.png b/pixmaps/gwy_volumize-24.png
index 9bde137..dfcebcd 100644
Binary files a/pixmaps/gwy_volumize-24.png and b/pixmaps/gwy_volumize-24.png differ
diff --git a/pixmaps/gwy_volumize_layers-24.png b/pixmaps/gwy_volumize_layers-24.png
index 5e262c0..5349ff6 100644
Binary files a/pixmaps/gwy_volumize_layers-24.png and b/pixmaps/gwy_volumize_layers-24.png differ
diff --git a/pixmaps/gwy_xy_denoise-24.png b/pixmaps/gwy_xy_denoise-24.png
new file mode 100644
index 0000000..9758b6c
Binary files /dev/null and b/pixmaps/gwy_xy_denoise-24.png differ
diff --git a/pixmaps/gwy_zero_mean-24.png b/pixmaps/gwy_zero_mean-24.png
index 690a0cf..09ac938 100644
Binary files a/pixmaps/gwy_zero_mean-24.png and b/pixmaps/gwy_zero_mean-24.png differ
diff --git a/pixmaps/gwy_zoom-24.xcf b/pixmaps/gwy_zoom-24.xcf
deleted file mode 100644
index b4e618a..0000000
Binary files a/pixmaps/gwy_zoom-24.xcf and /dev/null differ
diff --git a/pixmaps/gwy_zoom_1_1-24.png b/pixmaps/gwy_zoom_1_1-24.png
index 4383133..2506a6a 100644
Binary files a/pixmaps/gwy_zoom_1_1-24.png and b/pixmaps/gwy_zoom_1_1-24.png differ
diff --git a/pixmaps/gwy_zoom_fit-24.png b/pixmaps/gwy_zoom_fit-24.png
index 45cdd33..0e84941 100644
Binary files a/pixmaps/gwy_zoom_fit-24.png and b/pixmaps/gwy_zoom_fit-24.png differ
diff --git a/pixmaps/gwy_zoom_in-24.png b/pixmaps/gwy_zoom_in-24.png
index cdd20ab..54d3e14 100644
Binary files a/pixmaps/gwy_zoom_in-24.png and b/pixmaps/gwy_zoom_in-24.png differ
diff --git a/pixmaps/gwy_zoom_out-24.png b/pixmaps/gwy_zoom_out-24.png
index c47199e..fb0ad41 100644
Binary files a/pixmaps/gwy_zoom_out-24.png and b/pixmaps/gwy_zoom_out-24.png differ
diff --git a/pixmaps/src/Makefile.am b/pixmaps/src/Makefile.am
new file mode 100644
index 0000000..498ac16
--- /dev/null
+++ b/pixmaps/src/Makefile.am
@@ -0,0 +1,242 @@
+# @(#) $Id: Makefile.am 20258 2017-08-12 08:17:43Z yeti-dn $
+
+svg_sources = \
+	gwy_3d_base-24.svg \
+	gwy_arithmetic-24.svg \
+	gwy_bold-20.svg \
+	gwy_cantilever-24.svg \
+	gwy_color_range-24.svg \
+	gwy_color_range_adaptive-24.svg \
+	gwy_color_range_auto-24.svg \
+	gwy_color_range_fixed-24.svg \
+	gwy_color_range_full-24.svg \
+	gwy_convolution-24.svg \
+	gwy_correct_affine-24.svg \
+	gwy_correlation_mask-24.svg \
+	gwy_crop-24.svg \
+	gwy_cwt-24.svg \
+	gwy_data_measure-24.svg \
+	gwy_disconnected-24.svg \
+	gwy_distance-24.svg \
+	gwy_distance_transform-24.svg \
+	gwy_distribution_angle-24.svg \
+	gwy_distribution_slope-24.svg \
+	gwy_drift-96.svg \
+	gwy_dwt-24.svg \
+	gwy_edge-24.svg \
+	gwy_enforce_distribution-24.svg \
+	gwy_entropy-24.svg \
+	gwy_extend-24.svg \
+	gwy_extract_path-24.svg \
+	gwy_facet_level-24.svg \
+	gwy_favourite-24.svg \
+	gwy_fft-24.svg \
+	gwy_fft_2d-24.svg \
+	gwy_fft_filter_1d-24.svg \
+	gwy_fft_filter_2d-24.svg \
+	gwy_filter-24.svg \
+	gwy_find_peaks-24.svg \
+	gwy_fit_shape-24.svg \
+	gwy_fix_zero-24.svg \
+	gwy_flip_horizontally-24.svg \
+	gwy_flip_vertically-24.svg \
+	gwy_fractal-24.svg \
+	gwy_fractal_measure-24.svg \
+	gwy_fractal_correction-24.svg \
+	gwy_gl_material-16.svg \
+	gwy_gradient_horizontal-24.svg \
+	gwy_gradient_vertical-24.svg \
+	gwy_grain_correlation-24.svg \
+	gwy_grain_exscribed_circle-24.svg \
+	gwy_grain_inscribed_circle-24.svg \
+	gwy_grains-24.svg \
+	gwy_grains_edge-24.svg \
+	gwy_grains_edge_remove-24.svg \
+	gwy_grains_graph-24.svg \
+	gwy_grains_measure-24.svg \
+	gwy_grains_remove-24.svg \
+	gwy_grains_water-24.svg \
+	gwy_graph-24.svg \
+	gwy_graph_align-24.svg \
+	gwy_graph_cut-24.svg \
+	gwy_graph_dos-24.svg \
+	gwy_graph_export_ascii-24.svg \
+	gwy_graph_export_png-24.svg \
+	gwy_graph_export_vector-24.svg \
+	gwy_graph_fd-24.svg \
+	gwy_graph_filter-24.svg \
+	gwy_graph_function-24.svg \
+	gwy_graph_halfgauss-24.svg \
+	gwy_graph_level-24.svg \
+	gwy_graph_measure-24.svg \
+	gwy_graph_palette-24.svg \
+	gwy_graph_pointer-24.svg \
+	gwy_graph_ruler-24.svg \
+	gwy_graph_vertical-24.svg \
+	gwy_graph_zoom_fit-24.svg \
+	gwy_graph_zoom_in-24.svg \
+	gwy_graph_zoom_out-24.svg \
+	gwy_hough-24.svg \
+	gwy_immerse-24.svg \
+	gwy_iso_roughness-24.svg \
+	gwy_italic-20.svg \
+	gwy_less-24.svg \
+	gwy_level-24.svg \
+	gwy_level_flatten_base-24.svg \
+	gwy_level_median-24.svg \
+	gwy_level_triangle-24.svg \
+	gwy_light_rotate-24.svg \
+	gwy_line_level-24.svg \
+	gwy_load_debug-20.svg \
+	gwy_load_info-20.svg \
+	gwy_load_warning-20.svg \
+	gwy_local_slope-24.svg \
+	gwy_logscale_horizontal-24.svg \
+	gwy_logscale_vertical-24.svg \
+	gwy_mark_outliers-24.svg \
+	gwy_mark_scars-24.svg \
+	gwy_mark_with-24.svg \
+	gwy_mask-16.svg \
+	gwy_mask-24.svg \
+	gwy_mask_add-24.svg \
+	gwy_mask_circle-24.svg \
+	gwy_mask_circle_exclusive-24.svg \
+	gwy_mask_circle_inclusive-24.svg \
+	gwy_mask_distribute-24.svg \
+	gwy_mask_editor-24.svg \
+	gwy_mask_exclude-24.svg \
+	gwy_mask_exclude_circle-24.svg \
+	gwy_mask_extract-24.svg \
+	gwy_mask_fill_draw-24.svg \
+	gwy_mask_fill_erase-24.svg \
+	gwy_mask_grow-24.svg \
+	gwy_mask_intersect-24.svg \
+	gwy_mask_invert-24.svg \
+	gwy_mask_line-24.svg \
+	gwy_mask_morph-24.svg \
+	gwy_mask_paint_draw-24.svg \
+	gwy_mask_paint_erase-24.svg \
+	gwy_mask_rect_exclusive-24.svg \
+	gwy_mask_rect_inclusive-24.svg \
+	gwy_mask_remove-24.svg \
+	gwy_mask_shrink-24.svg \
+	gwy_mask_subtract-24.svg \
+	gwy_mask_thin-24.svg \
+	gwy_measure_lattice-24.svg \
+	gwy_merge-24.svg \
+	gwy_more-24.svg \
+	gwy_mutual_crop-24.svg \
+	gwy_neural_apply-24.svg \
+	gwy_neural_train-24.svg \
+	gwy_next-24.svg \
+	gwy_null_offsets-24.svg \
+	gwy_palettes-16.svg \
+	gwy_palettes-24.svg \
+	gwy_path_level-24.svg \
+	gwy_pointer_measure-24.svg \
+	gwy_poly_distort-24.svg \
+	gwy_polynom-24.svg \
+	gwy_polynom_level-24.svg \
+	gwy_previous-24.svg \
+	gwy_profile-24.svg \
+	gwy_pygwy-24.svg \
+	gwy_remove_under_mask-24.svg \
+	gwy_rotate_180-24.svg \
+	gwy_rotate_3d-24.svg \
+	gwy_rotate-24.svg \
+	gwy_rotate_90_ccw-24.svg \
+	gwy_rotate_90_cw-24.svg \
+	gwy_scale-24.svg \
+	gwy_scale_horizontally-24.svg \
+	gwy_scale_vertically-24.svg \
+	gwy_scars-24.svg \
+	gwy_selections-24.svg \
+	gwy_shader-24.svg \
+	gwy_spectrum-24.svg \
+	gwy_spot_remove-24.svg \
+	gwy_stat_quantities-24.svg \
+	gwy_straighten_path-24.svg \
+	gwy_subscript-20.svg \
+	gwy_superscript-20.svg \
+	gwy_synthetic_ballistic_deposition-24.svg \
+	gwy_synthetic_brownian_motion-24.svg \
+	gwy_synthetic_columnar-24.svg \
+	gwy_synthetic_diffusion-24.svg \
+	gwy_synthetic_domains-24.svg \
+	gwy_synthetic_fibres-24.svg \
+	gwy_synthetic_lattice-24.svg \
+	gwy_synthetic_line_noise-24.svg \
+	gwy_synthetic_noise-24.svg \
+	gwy_synthetic_objects-24.svg \
+	gwy_synthetic_particles-24.svg \
+	gwy_synthetic_pattern-24.svg \
+	gwy_synthetic_phases-24.svg \
+	gwy_synthetic_spectral-24.svg \
+	gwy_synthetic_waves-24.svg \
+	gwy_tilt-24.svg \
+	gwy_tip_dilation-24.svg \
+	gwy_tip_erosion-24.svg \
+	gwy_tip_estimation-24.svg \
+	gwy_tip_indent_analyze-24.svg \
+	gwy_tip_lateral_force-24.svg \
+	gwy_tip_map-24.svg \
+	gwy_tip_model-24.svg \
+	gwy_tip_pid-24.svg \
+	gwy_unrotate-24.svg \
+	gwy_value_invert-24.svg \
+	gwy_volume-24.svg \
+	gwy_volume_calibrate-24.svg \
+	gwy_volume_dimensions-24.svg \
+	gwy_volume_fd-24.svg \
+	gwy_volume_invert-24.svg \
+	gwy_volume_kmeans-24.svg \
+	gwy_volume_kmedians-24.svg \
+	gwy_volume_slice-24.svg \
+	gwy_xy_denoise-24.svg \
+	gwy_zero_mean-24.svg \
+	gwy_zoom_1_1-24.svg \
+	gwy_zoom_fit-24.svg \
+	gwy_zoom_in-24.svg \
+	gwy_zoom_out-24.svg
+
+xcf_sources = \
+	cd_line.xcf \
+	cd_rline.xcf \
+	cd_rstep.xcf \
+	cd_step.xcf \
+	gwy_3d_base-24.xcf \
+	gwy_presentation-24.xcf \
+	gwy_presentation_ops-24.xcf \
+	gwy_transform-24.xcf
+
+# Not really sources, but PNG icons that were not included as API symbols.
+png_sources = \
+	gwy_hough-24.png \
+	gwy_local_slope-24.png \
+	gwy_presentation_attach-24.png \
+	gwy_presentation_edge_canny-24.png \
+	gwy_presentation_edge_harris_corner-24.png \
+	gwy_presentation_edge_hough-24.png \
+	gwy_presentation_edge_inclination-24.png \
+	gwy_presentation_edge_laplace_gauss-24.png \
+	gwy_presentation_edge_local_non_linearity-24.png \
+	gwy_presentation_edge_prewitt-24.png \
+	gwy_presentation_edge_rms_edge-24.png \
+	gwy_presentation_edge_rms-24.png \
+	gwy_presentation_edge_sobel-24.png \
+	gwy_presentation_edge_step-24.png \
+	gwy_presentation_edge_zero_crossing-24.png \
+	gwy_presentation_extract-24.png \
+	gwy_presentation_local_contrast-24.png \
+	gwy_presentation_log-24.png \
+	gwy_presentation_rank-24.png \
+	gwy_presentation_remove-24.png \
+	gwy_presentation_sem-24.png \
+	gwy_presentation_shading-24.png
+
+noinst_DATA = \
+	$(svg_sources) \
+	$(xcf_sources) \
+	$(png_sources)
+
+EXTRA_DIST = $(noinst_DATA)
diff --git a/pixmaps/src/Makefile.in b/pixmaps/src/Makefile.in
new file mode 100644
index 0000000..d9d105d
--- /dev/null
+++ b/pixmaps/src/Makefile.in
@@ -0,0 +1,805 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# @(#) $Id: Makefile.am 20258 2017-08-12 08:17:43Z yeti-dn $
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = pixmaps/src
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gconf-2.m4 \
+	$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \
+	$(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/gwy-cc-options.m4 \
+	$(top_srcdir)/m4/gwy-enable.m4 $(top_srcdir)/m4/gwy-math.m4 \
+	$(top_srcdir)/m4/gwy-python.m4 $(top_srcdir)/m4/iconv.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
+	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/m4/po.m4 \
+	$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DATA = $(noinst_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BASIC_LIBS = @BASIC_LIBS@
+BZIP2 = @BZIP2@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFITSIO_CFLAGS = @CFITSIO_CFLAGS@
+CFITSIO_LIBS = @CFITSIO_LIBS@
+CFLAGS = @CFLAGS@
+COMMON_CFLAGS = @COMMON_CFLAGS@
+COMMON_CXXFLAGS = @COMMON_CXXFLAGS@
+COMMON_LDFLAGS = @COMMON_LDFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EPYDOC = @EPYDOC@
+EXEEXT = @EXEEXT@
+EXR_CFLAGS = @EXR_CFLAGS@
+EXR_LIBS = @EXR_LIBS@
+FFTW3_CFLAGS = @FFTW3_CFLAGS@
+FFTW3_LIBS = @FFTW3_LIBS@
+FGREP = @FGREP@
+GCONFTOOL = @GCONFTOOL@
+GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@
+GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GREP = @GREP@
+GTKDOC_EXTRA_CFLAGS = @GTKDOC_EXTRA_CFLAGS@
+GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@
+GTKGLEXT_DEPENDENCY = @GTKGLEXT_DEPENDENCY@
+GTKGLEXT_LIBS = @GTKGLEXT_LIBS@
+GTKSOURCEVIEW_CFLAGS = @GTKSOURCEVIEW_CFLAGS@
+GTKSOURCEVIEW_DEPENDENCY = @GTKSOURCEVIEW_DEPENDENCY@
+GTKSOURCEVIEW_LIBS = @GTKSOURCEVIEW_LIBS@
+GTK_BASE_CFLAGS = @GTK_BASE_CFLAGS@
+GTK_BASE_LIBS = @GTK_BASE_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_DOC_PATH = @GTK_DOC_PATH@
+GTK_LIBS = @GTK_LIBS@
+GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@
+GTK_MAC_LIBS = @GTK_MAC_LIBS@
+GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
+GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
+GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
+HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+KDE4_CONFIG = @KDE4_CONFIG@
+KDE4_CPPFLAGS = @KDE4_CPPFLAGS@
+KDE4_LDFLAGS = @KDE4_LDFLAGS@
+KDE4_LIBS = @KDE4_LIBS@
+KDE4_MODULE_DIR = @KDE4_MODULE_DIR@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBRARY_RELEASE = @LIBRARY_RELEASE@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBXMU = @LIBXMU@
+LIBZIP_CFLAGS = @LIBZIP_CFLAGS@
+LIBZIP_LIBS = @LIBZIP_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MINIZIP_CFLAGS = @MINIZIP_CFLAGS@
+MINIZIP_LIBS = @MINIZIP_LIBS@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+MSWIN_BITS = @MSWIN_BITS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PASCAL = @PASCAL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
+PNG_CFLAGS = @PNG_CFLAGS@
+PNG_LIBS = @PNG_LIBS@
+POD2MAN = @POD2MAN@
+POSUB = @POSUB@
+PYGTK_CFLAGS = @PYGTK_CFLAGS@
+PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
+PYGTK_LIBS = @PYGTK_LIBS@
+PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
+PYTHON_INCLUDES = @PYTHON_INCLUDES@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+RUBY = @RUBY@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
+UNIQUE_LIBS = @UNIQUE_LIBS@
+UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@
+UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WEBP_CFLAGS = @WEBP_CFLAGS@
+WEBP_LIBS = @WEBP_LIBS@
+XDG_DATA_HOME_DIR = @XDG_DATA_HOME_DIR@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XMKMF = @XMKMF@
+XML2_CFLAGS = @XML2_CFLAGS@
+XML2_LIBS = @XML2_LIBS@
+XSLTPROC = @XSLTPROC@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB = @ZLIB@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+svg_sources = \
+	gwy_3d_base-24.svg \
+	gwy_arithmetic-24.svg \
+	gwy_bold-20.svg \
+	gwy_cantilever-24.svg \
+	gwy_color_range-24.svg \
+	gwy_color_range_adaptive-24.svg \
+	gwy_color_range_auto-24.svg \
+	gwy_color_range_fixed-24.svg \
+	gwy_color_range_full-24.svg \
+	gwy_convolution-24.svg \
+	gwy_correct_affine-24.svg \
+	gwy_correlation_mask-24.svg \
+	gwy_crop-24.svg \
+	gwy_cwt-24.svg \
+	gwy_data_measure-24.svg \
+	gwy_disconnected-24.svg \
+	gwy_distance-24.svg \
+	gwy_distance_transform-24.svg \
+	gwy_distribution_angle-24.svg \
+	gwy_distribution_slope-24.svg \
+	gwy_drift-96.svg \
+	gwy_dwt-24.svg \
+	gwy_edge-24.svg \
+	gwy_enforce_distribution-24.svg \
+	gwy_entropy-24.svg \
+	gwy_extend-24.svg \
+	gwy_extract_path-24.svg \
+	gwy_facet_level-24.svg \
+	gwy_favourite-24.svg \
+	gwy_fft-24.svg \
+	gwy_fft_2d-24.svg \
+	gwy_fft_filter_1d-24.svg \
+	gwy_fft_filter_2d-24.svg \
+	gwy_filter-24.svg \
+	gwy_find_peaks-24.svg \
+	gwy_fit_shape-24.svg \
+	gwy_fix_zero-24.svg \
+	gwy_flip_horizontally-24.svg \
+	gwy_flip_vertically-24.svg \
+	gwy_fractal-24.svg \
+	gwy_fractal_measure-24.svg \
+	gwy_fractal_correction-24.svg \
+	gwy_gl_material-16.svg \
+	gwy_gradient_horizontal-24.svg \
+	gwy_gradient_vertical-24.svg \
+	gwy_grain_correlation-24.svg \
+	gwy_grain_exscribed_circle-24.svg \
+	gwy_grain_inscribed_circle-24.svg \
+	gwy_grains-24.svg \
+	gwy_grains_edge-24.svg \
+	gwy_grains_edge_remove-24.svg \
+	gwy_grains_graph-24.svg \
+	gwy_grains_measure-24.svg \
+	gwy_grains_remove-24.svg \
+	gwy_grains_water-24.svg \
+	gwy_graph-24.svg \
+	gwy_graph_align-24.svg \
+	gwy_graph_cut-24.svg \
+	gwy_graph_dos-24.svg \
+	gwy_graph_export_ascii-24.svg \
+	gwy_graph_export_png-24.svg \
+	gwy_graph_export_vector-24.svg \
+	gwy_graph_fd-24.svg \
+	gwy_graph_filter-24.svg \
+	gwy_graph_function-24.svg \
+	gwy_graph_halfgauss-24.svg \
+	gwy_graph_level-24.svg \
+	gwy_graph_measure-24.svg \
+	gwy_graph_palette-24.svg \
+	gwy_graph_pointer-24.svg \
+	gwy_graph_ruler-24.svg \
+	gwy_graph_vertical-24.svg \
+	gwy_graph_zoom_fit-24.svg \
+	gwy_graph_zoom_in-24.svg \
+	gwy_graph_zoom_out-24.svg \
+	gwy_hough-24.svg \
+	gwy_immerse-24.svg \
+	gwy_iso_roughness-24.svg \
+	gwy_italic-20.svg \
+	gwy_less-24.svg \
+	gwy_level-24.svg \
+	gwy_level_flatten_base-24.svg \
+	gwy_level_median-24.svg \
+	gwy_level_triangle-24.svg \
+	gwy_light_rotate-24.svg \
+	gwy_line_level-24.svg \
+	gwy_load_debug-20.svg \
+	gwy_load_info-20.svg \
+	gwy_load_warning-20.svg \
+	gwy_local_slope-24.svg \
+	gwy_logscale_horizontal-24.svg \
+	gwy_logscale_vertical-24.svg \
+	gwy_mark_outliers-24.svg \
+	gwy_mark_scars-24.svg \
+	gwy_mark_with-24.svg \
+	gwy_mask-16.svg \
+	gwy_mask-24.svg \
+	gwy_mask_add-24.svg \
+	gwy_mask_circle-24.svg \
+	gwy_mask_circle_exclusive-24.svg \
+	gwy_mask_circle_inclusive-24.svg \
+	gwy_mask_distribute-24.svg \
+	gwy_mask_editor-24.svg \
+	gwy_mask_exclude-24.svg \
+	gwy_mask_exclude_circle-24.svg \
+	gwy_mask_extract-24.svg \
+	gwy_mask_fill_draw-24.svg \
+	gwy_mask_fill_erase-24.svg \
+	gwy_mask_grow-24.svg \
+	gwy_mask_intersect-24.svg \
+	gwy_mask_invert-24.svg \
+	gwy_mask_line-24.svg \
+	gwy_mask_morph-24.svg \
+	gwy_mask_paint_draw-24.svg \
+	gwy_mask_paint_erase-24.svg \
+	gwy_mask_rect_exclusive-24.svg \
+	gwy_mask_rect_inclusive-24.svg \
+	gwy_mask_remove-24.svg \
+	gwy_mask_shrink-24.svg \
+	gwy_mask_subtract-24.svg \
+	gwy_mask_thin-24.svg \
+	gwy_measure_lattice-24.svg \
+	gwy_merge-24.svg \
+	gwy_more-24.svg \
+	gwy_mutual_crop-24.svg \
+	gwy_neural_apply-24.svg \
+	gwy_neural_train-24.svg \
+	gwy_next-24.svg \
+	gwy_null_offsets-24.svg \
+	gwy_palettes-16.svg \
+	gwy_palettes-24.svg \
+	gwy_path_level-24.svg \
+	gwy_pointer_measure-24.svg \
+	gwy_poly_distort-24.svg \
+	gwy_polynom-24.svg \
+	gwy_polynom_level-24.svg \
+	gwy_previous-24.svg \
+	gwy_profile-24.svg \
+	gwy_pygwy-24.svg \
+	gwy_remove_under_mask-24.svg \
+	gwy_rotate_180-24.svg \
+	gwy_rotate_3d-24.svg \
+	gwy_rotate-24.svg \
+	gwy_rotate_90_ccw-24.svg \
+	gwy_rotate_90_cw-24.svg \
+	gwy_scale-24.svg \
+	gwy_scale_horizontally-24.svg \
+	gwy_scale_vertically-24.svg \
+	gwy_scars-24.svg \
+	gwy_selections-24.svg \
+	gwy_shader-24.svg \
+	gwy_spectrum-24.svg \
+	gwy_spot_remove-24.svg \
+	gwy_stat_quantities-24.svg \
+	gwy_straighten_path-24.svg \
+	gwy_subscript-20.svg \
+	gwy_superscript-20.svg \
+	gwy_synthetic_ballistic_deposition-24.svg \
+	gwy_synthetic_brownian_motion-24.svg \
+	gwy_synthetic_columnar-24.svg \
+	gwy_synthetic_diffusion-24.svg \
+	gwy_synthetic_domains-24.svg \
+	gwy_synthetic_fibres-24.svg \
+	gwy_synthetic_lattice-24.svg \
+	gwy_synthetic_line_noise-24.svg \
+	gwy_synthetic_noise-24.svg \
+	gwy_synthetic_objects-24.svg \
+	gwy_synthetic_particles-24.svg \
+	gwy_synthetic_pattern-24.svg \
+	gwy_synthetic_phases-24.svg \
+	gwy_synthetic_spectral-24.svg \
+	gwy_synthetic_waves-24.svg \
+	gwy_tilt-24.svg \
+	gwy_tip_dilation-24.svg \
+	gwy_tip_erosion-24.svg \
+	gwy_tip_estimation-24.svg \
+	gwy_tip_indent_analyze-24.svg \
+	gwy_tip_lateral_force-24.svg \
+	gwy_tip_map-24.svg \
+	gwy_tip_model-24.svg \
+	gwy_tip_pid-24.svg \
+	gwy_unrotate-24.svg \
+	gwy_value_invert-24.svg \
+	gwy_volume-24.svg \
+	gwy_volume_calibrate-24.svg \
+	gwy_volume_dimensions-24.svg \
+	gwy_volume_fd-24.svg \
+	gwy_volume_invert-24.svg \
+	gwy_volume_kmeans-24.svg \
+	gwy_volume_kmedians-24.svg \
+	gwy_volume_slice-24.svg \
+	gwy_xy_denoise-24.svg \
+	gwy_zero_mean-24.svg \
+	gwy_zoom_1_1-24.svg \
+	gwy_zoom_fit-24.svg \
+	gwy_zoom_in-24.svg \
+	gwy_zoom_out-24.svg
+
+xcf_sources = \
+	cd_line.xcf \
+	cd_rline.xcf \
+	cd_rstep.xcf \
+	cd_step.xcf \
+	gwy_3d_base-24.xcf \
+	gwy_presentation-24.xcf \
+	gwy_presentation_ops-24.xcf \
+	gwy_transform-24.xcf
+
+
+# Not really sources, but PNG icons that were not included as API symbols.
+png_sources = \
+	gwy_hough-24.png \
+	gwy_local_slope-24.png \
+	gwy_presentation_attach-24.png \
+	gwy_presentation_edge_canny-24.png \
+	gwy_presentation_edge_harris_corner-24.png \
+	gwy_presentation_edge_hough-24.png \
+	gwy_presentation_edge_inclination-24.png \
+	gwy_presentation_edge_laplace_gauss-24.png \
+	gwy_presentation_edge_local_non_linearity-24.png \
+	gwy_presentation_edge_prewitt-24.png \
+	gwy_presentation_edge_rms_edge-24.png \
+	gwy_presentation_edge_rms-24.png \
+	gwy_presentation_edge_sobel-24.png \
+	gwy_presentation_edge_step-24.png \
+	gwy_presentation_edge_zero_crossing-24.png \
+	gwy_presentation_extract-24.png \
+	gwy_presentation_local_contrast-24.png \
+	gwy_presentation_log-24.png \
+	gwy_presentation_rank-24.png \
+	gwy_presentation_remove-24.png \
+	gwy_presentation_sem-24.png \
+	gwy_presentation_shading-24.png
+
+noinst_DATA = \
+	$(svg_sources) \
+	$(xcf_sources) \
+	$(png_sources)
+
+EXTRA_DIST = $(noinst_DATA)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu pixmaps/src/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu pixmaps/src/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	cscopelist-am ctags-am distclean distclean-generic \
+	distclean-libtool distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/pixmaps/cd_line.xcf b/pixmaps/src/cd_line.xcf
similarity index 100%
rename from pixmaps/cd_line.xcf
rename to pixmaps/src/cd_line.xcf
diff --git a/pixmaps/cd_rline.xcf b/pixmaps/src/cd_rline.xcf
similarity index 100%
rename from pixmaps/cd_rline.xcf
rename to pixmaps/src/cd_rline.xcf
diff --git a/pixmaps/cd_rstep.xcf b/pixmaps/src/cd_rstep.xcf
similarity index 100%
rename from pixmaps/cd_rstep.xcf
rename to pixmaps/src/cd_rstep.xcf
diff --git a/pixmaps/cd_step.xcf b/pixmaps/src/cd_step.xcf
similarity index 100%
rename from pixmaps/cd_step.xcf
rename to pixmaps/src/cd_step.xcf
diff --git a/pixmaps/src/gwy_3d_base-24.svg b/pixmaps/src/gwy_3d_base-24.svg
new file mode 100644
index 0000000..84fdf35
--- /dev/null
+++ b/pixmaps/src/gwy_3d_base-24.svg
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_3d_base-24.svg"
+   inkscape:export-filename="gwy_3d_base-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs4">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8860">
+      <stop
+         style="stop-color:#f1f9ea;stop-opacity:1"
+         offset="0"
+         id="stop8856" />
+      <stop
+         id="stop8864"
+         offset="0.3756178"
+         style="stop-color:#76b638;stop-opacity:0.99328858" />
+      <stop
+         style="stop-color:#030401;stop-opacity:0.97315437"
+         offset="1"
+         id="stop8858" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient8428"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#4696db;stop-opacity:1;"
+         offset="0"
+         id="stop8430" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8860"
+       id="linearGradient8889"
+       x1="359.46628"
+       y1="531.59906"
+       x2="391.75754"
+       y2="553.18823"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61340763,0.20245078,-0.36437531,0.36077836,337.91212,262.04355)" />
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8940"
+       x="-0.069478748"
+       width="1.1389575"
+       y="-0.10543993"
+       height="1.2108799">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.66323168"
+         id="feGaussianBlur8942" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="15.289537"
+     inkscape:cx="-10.510206"
+     inkscape:cy="25.274973"
+     inkscape:document-units="px"
+     inkscape:current-layer="g8625"
+     showgrid="false"
+     inkscape:object-nodes="true"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true"
+     showguides="true"
+     units="px"
+     inkscape:snap-object-midpoints="true"
+     inkscape:object-paths="false"
+     inkscape:snap-grids="false"
+     inkscape:snap-intersection-paths="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-360.04032,-520.36218)">
+    <g
+       id="g8618"
+       transform="matrix(0.97194034,0,0,1,10.715714,0.03393)"
+       style="stroke-width:1.01433218">
+      <g
+         id="g8625"
+         transform="translate(-0.58662158)">
+        <path
+           sodipodi:nodetypes="ccccc"
+           inkscape:connector-curvature="0"
+           id="path8955"
+           d="m 370.30181,525.73125 13.49573,5.79373 -7.87094,11.8026 -15.03903,-8.29374 z"
+           style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.5;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.01433229px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate;font-variant-east_asian:normal;filter:url(#filter8940)" />
+        <path
+           style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:url(#linearGradient8889);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.01433229px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+           d="m 370.30181,521.92896 13.49573,5.79373 -7.87094,11.8026 -15.03903,-8.29374 z"
+           id="rect8881"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc" />
+        <g
+           id="g8814"
+           transform="matrix(0.17094832,0,0,0.17482069,303.29323,425.48409)"
+           style="stroke-width:5.86747646;stroke:none" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/gwy_3d_base-24.xcf b/pixmaps/src/gwy_3d_base-24.xcf
similarity index 100%
rename from pixmaps/gwy_3d_base-24.xcf
rename to pixmaps/src/gwy_3d_base-24.xcf
diff --git a/pixmaps/src/gwy_arithmetic-24.svg b/pixmaps/src/gwy_arithmetic-24.svg
new file mode 100644
index 0000000..594da19
--- /dev/null
+++ b/pixmaps/src/gwy_arithmetic-24.svg
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_arithmetic-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.2522308"
+     inkscape:cx="-130.23742"
+     inkscape:cy="7.8253693"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect11370"
+       width="15"
+       height="15"
+       x="197.86205"
+       y="472.83789" />
+    <rect
+       y="476.83789"
+       x="201.86205"
+       height="15"
+       width="15"
+       id="rect8183"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#b3d296;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#e8f0e0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8153"
+       width="15"
+       height="15"
+       x="205.86205"
+       y="480.83789" />
+    <g
+       id="g8079"
+       transform="translate(4,10)">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path7272"
+         d="m 209.36205,473.33789 0,6"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="cc"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 212.36205,476.33789 -6,0"
+         id="path8080"
+         inkscape:connector-curvature="0" />
+    </g>
+    <path
+       sodipodi:nodetypes="cc"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 216.36205,492.33789 -6,0"
+       id="path8159"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_bold-20.svg b/pixmaps/src/gwy_bold-20.svg
new file mode 100644
index 0000000..c87e6e7
--- /dev/null
+++ b/pixmaps/src/gwy_bold-20.svg
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="20"
+     height="20"
+     viewBox="0 0 20 20"
+     id="svg8833"
+     version="1.1"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_bold-20.svg">
+    <defs
+         id="defs8835">
+        <linearGradient
+             gradientTransform="translate(-11.142957,824.89612)"
+             xlink:href="#linearGradient4140"
+             id="linearGradient4171"
+             gradientUnits="userSpaceOnUse"
+             x1="207.50029"
+             y1="247.92804"
+             x2="272.91217"
+             y2="361.22473" />
+        <linearGradient
+             id="linearGradient4140">
+            <stop
+                 style="stop-color:#d7e3f4;stop-opacity:1;"
+                 offset="0"
+                 id="stop4142" />
+            <stop
+                 style="stop-color:#f1f5fb;stop-opacity:1"
+                 offset="1"
+                 id="stop4144" />
+        </linearGradient>
+    </defs>
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="17.645833"
+         inkscape:cx="11.961394"
+         inkscape:cy="10.410254"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         units="px"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:document-rotation="0">
+        <inkscape:grid
+             type="xygrid"
+             id="grid1px"
+             originx="0"
+             originy="0"
+             dotted="false"
+             snapvisiblegridlinesonly="false"
+             spacingx="0.5"
+             spacingy="0.5"
+             enabled="true"
+             visible="true"
+             units="px"
+             empspacing="2" />
+    </sodipodi:namedview>
+    <metadata
+         id="metadata8838">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-199.64375,-494.06708)">
+        <text
+             xml:space="preserve"
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:27.63895416px;line-height:120.00000477%;font-family:'Linux Libertine O';-inkscape-font-specification:'Linux Libertine O Bold';text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;shape-padding:0;overflow:visible;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.01118124;stroke-linecap:round;stroke-linejoin:round;paint-order [...]
+             x="201.05327"
+             y="512.97797"
+             id="text4304"><tspan
+                 sodipodi:role="line"
+                 id="tspan4302"
+                 x="201.05327"
+                 y="512.97797"
+                 style="stroke-width:1.01118124">B</tspan></text>
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_cantilever-24.svg b/pixmaps/src/gwy_cantilever-24.svg
new file mode 100644
index 0000000..fbe657d
--- /dev/null
+++ b/pixmaps/src/gwy_cantilever-24.svg
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_cantilever-24.svg"
+   inkscape:export-filename="gwy_cantilever-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8095">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8423">
+      <stop
+         style="stop-color:#6c7d92;stop-opacity:1"
+         offset="0"
+         id="stop8419" />
+      <stop
+         id="stop8427"
+         offset="0.49999958"
+         style="stop-color:#a3b8d2;stop-opacity:1" />
+      <stop
+         style="stop-color:#446a97;stop-opacity:1"
+         offset="1"
+         id="stop8421" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8458"
+       x="-0.12856513"
+       width="1.2571303"
+       y="-0.11250482"
+       height="1.2250096">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.16275744"
+         id="feGaussianBlur8460" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8423"
+       id="linearGradient8425"
+       x1="263.77811"
+       y1="602.10724"
+       x2="257.77811"
+       y2="602.10724"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="6.7254415"
+     inkscape:cx="9.8037647"
+     inkscape:cy="19.378478"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77811,-595.10722)">
+    <path
+       style="fill:url(#linearGradient8425);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 246.27811,600.60722 h 21 v 2 l -6.5,10.5 -6,-10.5 h -8.5 z"
+       id="path4763"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 260.56574,601.46532 c -0.0435,-1.8491 2.94024,0.22303 6.9605,0.15554 -2.37934,0.87001 -4.78447,3.12651 -6.54699,4.79868 -0.69731,-2.00112 -0.66057,-4.5027 -0.41351,-4.95422 z"
+       id="path8400"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc"
+       transform="rotate(96.15813,259.73583,603.10609)" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.88926172;fill-opacity:0.49803922"
+       d="m 254.77811,602.60722 h 12"
+       id="path8429"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="ccccccc"
+       inkscape:connector-curvature="0"
+       id="path8431"
+       d="m 246.27811,600.60722 h 21 v 2 l -6.5,10.5 -6,-10.5 h -8.5 z"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_color_range-24.svg b/pixmaps/src/gwy_color_range-24.svg
new file mode 100644
index 0000000..e5bb14e
--- /dev/null
+++ b/pixmaps/src/gwy_color_range-24.svg
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8691"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_color_range-24.svg">
+  <defs
+     id="defs8693">
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8648"
+       id="linearGradient8654"
+       x1="363.15701"
+       y1="549.86188"
+       x2="387.15701"
+       y2="549.86188"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-139.12864,-84.867386)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8648">
+      <stop
+         style="stop-color:#000200;stop-opacity:1"
+         offset="0"
+         id="stop8650" />
+      <stop
+         id="stop8714"
+         offset="0.25"
+         style="stop-color:#4696db;stop-opacity:1" />
+      <stop
+         id="stop8710"
+         offset="0.5"
+         style="stop-color:#ffbb00;stop-opacity:1" />
+      <stop
+         style="stop-color:#fd9044;stop-opacity:1"
+         offset="0.75"
+         id="stop8712" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop8652" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.6404928"
+     inkscape:cx="-105.79572"
+     inkscape:cy="17.632842"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8696">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-224.02837,-448.99442)">
+    <g
+       id="g8434"
+       transform="rotate(-90,236.02836,460.99441)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8716"
+         d="m 227.52838,472.99442 v -24"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 1;stroke-dashoffset:0;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 1;stroke-dashoffset:0;stroke-opacity:1"
+         d="m 244.52837,472.99442 v -24"
+         id="path8718"
+         inkscape:connector-curvature="0" />
+      <rect
+         y="461.49442"
+         x="224.52837"
+         height="7"
+         width="23"
+         id="rect8646"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8654);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <path
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="path8094"
+         d="m 233.02837,450.99442 -4,3 4,3 z"
+         style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 239.02837,450.99442 4,3 -4,3 z"
+         id="path8120"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8122"
+         d="m 233.02837,453.99442 h 6"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_color_range_adaptive-24.svg b/pixmaps/src/gwy_color_range_adaptive-24.svg
new file mode 100644
index 0000000..3a52f0f
--- /dev/null
+++ b/pixmaps/src/gwy_color_range_adaptive-24.svg
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8691"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_color_range_adaptive-24.svg"
+   inkscape:export-filename="gwy_color_range_adaptive-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8693">
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8648"
+       id="linearGradient8654"
+       x1="363.15701"
+       y1="549.86188"
+       x2="387.15701"
+       y2="549.86188"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-363.15701,-533.86181)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8648">
+      <stop
+         style="stop-color:#000200;stop-opacity:1"
+         offset="0"
+         id="stop8650" />
+      <stop
+         id="stop8714"
+         offset="0.25"
+         style="stop-color:#4696db;stop-opacity:1" />
+      <stop
+         id="stop8710"
+         offset="0.5"
+         style="stop-color:#ffbb00;stop-opacity:1" />
+      <stop
+         style="stop-color:#fd9044;stop-opacity:1"
+         offset="0.75"
+         id="stop8712" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop8652" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="8.8515965"
+     inkscape:cx="26.064741"
+     inkscape:cy="11.226428"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8696">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-224.02837,-448.99442)">
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8654);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="M 6.8691406,9.4160156 C 5.3997353,9.4160156 5.3157434,11.763204 1.4609375,12.5 H 0.5 V 12.634766 16 19.5 c 4.81945,0.40822 4.7857106,3.21875 6.3691406,3.21875 1.43275,0 1.4015794,-3.021484 5.1308594,-3.021484 3.72928,0 3.698119,3.021484 5.130859,3.021484 1.58344,0 1.549691,-2.81053 6.369141,-3.21875 V 12.634766 12.5 H 22.539062 C 18.684258,11.763204 18.600274,9.4160156 17.130859,9.4160156 15.698119,9.4160156 15.72928,12.4375 12,12.4375 8.27072,12.4375 8.3018906,9.4160156 6.8691 [...]
+       transform="translate(224.02837,448.99442)"
+       id="rect8646"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="scccccsssccccsss" />
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 247.52565,456.96512 c -4.81831,-0.51117 -4.78383,-4.65625 -6.36689,-4.65625 -1.43241,0 -1.402,4.41016 -5.13039,4.41016 -3.7284,0 -3.69798,-4.41016 -5.13039,-4.41016 -1.58306,0 -1.54858,4.14508 -6.3669,4.65625"
+       id="path8254-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cszsc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_color_range_auto-24.svg b/pixmaps/src/gwy_color_range_auto-24.svg
new file mode 100644
index 0000000..465eb07
--- /dev/null
+++ b/pixmaps/src/gwy_color_range_auto-24.svg
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8691"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_color_range_auto-24.svg"
+   inkscape:export-filename="gwy_color_range_auto.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8693">
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8648"
+       id="linearGradient8654"
+       x1="363.15701"
+       y1="549.86188"
+       x2="387.15701"
+       y2="549.86188"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-139.12864,-84.867386)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8648">
+      <stop
+         style="stop-color:#000200;stop-opacity:1"
+         offset="0"
+         id="stop8650" />
+      <stop
+         id="stop8714"
+         offset="0.25"
+         style="stop-color:#4696db;stop-opacity:1" />
+      <stop
+         id="stop8710"
+         offset="0.5"
+         style="stop-color:#ffbb00;stop-opacity:1" />
+      <stop
+         style="stop-color:#fd9044;stop-opacity:1"
+         offset="0.75"
+         id="stop8712" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop8652" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="50.858483"
+     inkscape:cx="9.1998494"
+     inkscape:cy="15.956754"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8696">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-224.02837,-448.99442)">
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 1;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 227.52838,472.99442 0,-24"
+       id="path8716"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8718"
+       d="m 244.52837,472.99442 0,-24"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 1;stroke-dashoffset:0;stroke-opacity:1" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8654);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8646"
+       width="23"
+       height="7"
+       x="224.52837"
+       y="461.49442" />
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 246.91542,459.03511 c -8.23457,-0.92032 -8.17577,-8.38243 -10.88124,-8.38243 -2.70547,0 -2.64666,7.46211 -10.88125,8.38243"
+       id="path8254-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="czc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_color_range_fixed-24.svg b/pixmaps/src/gwy_color_range_fixed-24.svg
new file mode 100644
index 0000000..1ef3f7a
--- /dev/null
+++ b/pixmaps/src/gwy_color_range_fixed-24.svg
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8691"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_color_range_fixed-24.svg"
+   inkscape:export-filename="gwy_color_range_fixed-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8693">
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8648"
+       id="linearGradient8654"
+       x1="363.15701"
+       y1="549.86188"
+       x2="387.15701"
+       y2="549.86188"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-139.12864,-84.867386)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8648">
+      <stop
+         style="stop-color:#000200;stop-opacity:1"
+         offset="0"
+         id="stop8650" />
+      <stop
+         id="stop8714"
+         offset="0.25"
+         style="stop-color:#4696db;stop-opacity:1" />
+      <stop
+         id="stop8710"
+         offset="0.5"
+         style="stop-color:#ffbb00;stop-opacity:1" />
+      <stop
+         style="stop-color:#fd9044;stop-opacity:1"
+         offset="0.75"
+         id="stop8712" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop8652" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="6.71745"
+     inkscape:cx="15.156461"
+     inkscape:cy="22.16459"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-smooth-nodes="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8696">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-224.02837,-448.99442)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8654);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8646"
+       width="23"
+       height="7"
+       x="224.52837"
+       y="461.49442" />
+    <path
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 224.52837,456.99442 3,4 3,-4 z"
+       id="path8094"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       sodipodi:nodetypes="cccc"
+       inkscape:connector-curvature="0"
+       id="path8120"
+       d="m 247.52837,456.99442 -3,4 -3,-4 z"
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cccc"
+       inkscape:connector-curvature="0"
+       id="path8106"
+       d="m 224.52837,472.99442 3,-4 3,4 z"
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 247.52837,472.99442 -3,-4 -3,4 z"
+       id="path8108"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 1;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8110"
+       width="0.99999607"
+       height="7.9999948"
+       x="227.02837"
+       y="460.99442" />
+    <rect
+       y="461.99442"
+       x="244.02837"
+       height="6"
+       width="1"
+       id="rect8112"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 1;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4.00000044, 2.0000002;stroke-dashoffset:75.59056091;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="M 3.5 1 A 2.5 3 0 0 0 1 4 A 2.5 3 0 0 0 3.5 7 A 2.5 3 0 0 0 6 4 A 2.5 3 0 0 0 3.5 1 z M 3.5 2 A 1.5 1.9999999 0 0 1 5 4 A 1.5 1.9999999 0 0 1 3.5 6 A 1.5 1.9999999 0 0 1 2 4 A 1.5 1.9999999 0 0 1 3.5 2 z "
+       transform="translate(224.02837,448.99442)"
+       id="path8492" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 242.02837,450.49442 h 4 c -1.61636,2.07326 -2.5,3.6917 -2.5,5.5"
+       id="path8500"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_color_range_full-24.svg b/pixmaps/src/gwy_color_range_full-24.svg
new file mode 100644
index 0000000..fc8a3e4
--- /dev/null
+++ b/pixmaps/src/gwy_color_range_full-24.svg
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8691"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_color_range_full-24.svg">
+  <defs
+     id="defs8693">
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8648"
+       id="linearGradient8654"
+       x1="363.15701"
+       y1="549.86188"
+       x2="387.15701"
+       y2="549.86188"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-139.12864,-84.867386)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8648">
+      <stop
+         style="stop-color:#000200;stop-opacity:1"
+         offset="0"
+         id="stop8650" />
+      <stop
+         id="stop8714"
+         offset="0.25"
+         style="stop-color:#4696db;stop-opacity:1" />
+      <stop
+         id="stop8710"
+         offset="0.5"
+         style="stop-color:#ffbb00;stop-opacity:1" />
+      <stop
+         style="stop-color:#fd9044;stop-opacity:1"
+         offset="0.75"
+         id="stop8712" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop8652" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="21.764465"
+     inkscape:cx="5.8858866"
+     inkscape:cy="6.6468112"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8696">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-224.02837,-448.99442)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8654);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8646"
+       width="23"
+       height="7"
+       x="224.52837"
+       y="461.49442" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_convolution-24.svg b/pixmaps/src/gwy_convolution-24.svg
new file mode 100644
index 0000000..f9860ac
--- /dev/null
+++ b/pixmaps/src/gwy_convolution-24.svg
@@ -0,0 +1,1050 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 6.3499998 6.3499998"
+   version="1.1"
+   id="svg8868"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_convolution-24.svg">
+  <defs
+     id="defs8862" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="20.259173"
+     inkscape:cx="10.27327"
+     inkscape:cy="15.793039"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     units="px">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8865">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-62.021635,-142.77082)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8641"
+       width="0.26456478"
+       height="0.26455694"
+       x="67.048721"
+       y="145.15207" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05830646;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8230"
+       width="3.174767"
+       height="6.349534"
+       x="62.021866"
+       y="142.77103" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8191"
+       width="6.0854106"
+       height="6.0854106"
+       x="62.153931"
+       y="142.90312" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8791"
+       width="0.26456475"
+       height="0.26455694"
+       x="63.87381"
+       y="145.41667" />
+    <rect
+       y="145.68124"
+       x="63.609249"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8793"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="145.9458"
+       x="63.87381"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8805"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="146.47493"
+       x="63.609249"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8813"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8815"
+       width="0.26456475"
+       height="0.26455694"
+       x="63.609249"
+       y="146.47493" />
+    <rect
+       y="147.00403"
+       x="62.815556"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8817"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="147.00403"
+       x="63.344685"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-9"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="147.26862"
+       x="63.344685"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-5"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="147.5332"
+       x="63.609249"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-1"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="147.79779"
+       x="63.08012"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-7"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="147.79779"
+       x="62.550991"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-4"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="148.0623"
+       x="63.344685"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-42"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="148.32689"
+       x="62.815556"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-8"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="147.26862"
+       x="62.550991"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-0"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="148.32689"
+       x="63.609249"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-6"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="148.59145"
+       x="63.609249"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-44"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="148.59145"
+       x="63.08012"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-99"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="148.59145"
+       x="63.344685"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-05"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="148.32689"
+       x="62.286427"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-43"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="148.0623"
+       x="62.286427"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-51"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="145.68124"
+       x="64.402939"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-91"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="146.21039"
+       x="64.402939"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-54"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="147.00403"
+       x="64.402939"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-92"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="147.5332"
+       x="64.402939"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-57"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="147.26862"
+       x="64.402939"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-45"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="148.0623"
+       x="63.87381"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-570"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="147.79779"
+       x="64.138374"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-997"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="147.00403"
+       x="64.138374"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-53"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="146.47493"
+       x="64.138374"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-01"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="-146.21039"
+       x="64.667496"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8817-04-01"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="scale(1,-1)" />
+    <rect
+       y="-147.26862"
+       x="64.667496"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8817-04-7"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="scale(1,-1)" />
+    <rect
+       y="-147.00403"
+       x="64.667496"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8817-04-5"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="scale(1,-1)" />
+    <rect
+       y="-147.79779"
+       x="64.667496"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8817-04-4"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="scale(1,-1)" />
+    <rect
+       y="-148.32689"
+       x="64.667496"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8817-04-60"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="scale(1,-1)" />
+    <rect
+       y="-148.59145"
+       x="64.402939"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8817-04-9"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="scale(1,-1)" />
+    <rect
+       y="-148.85602"
+       x="64.402939"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8817-04-79"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="scale(1,-1)" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9245-2"
+       width="0.26456481"
+       height="0.26455697"
+       x="64.932068"
+       y="145.41667" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9245-27"
+       width="0.26456481"
+       height="0.26455697"
+       x="64.932068"
+       y="147.00403" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9245-0"
+       width="0.26456481"
+       height="0.26455697"
+       x="64.932068"
+       y="147.79779" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9245-3"
+       width="0.26456481"
+       height="0.26455697"
+       x="64.932068"
+       y="148.32689" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8779-9"
+       width="0.26456475"
+       height="0.26455694"
+       x="62.286427"
+       y="147.26862" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8779-1"
+       width="0.26456475"
+       height="0.26455694"
+       x="62.021866"
+       y="147.79779" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8779-2"
+       width="0.26456475"
+       height="0.26455694"
+       x="62.550991"
+       y="148.85602" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8779-70"
+       width="0.26456475"
+       height="0.26455694"
+       x="63.609249"
+       y="148.85602" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8779-93"
+       width="0.26456475"
+       height="0.26455694"
+       x="64.667503"
+       y="148.85602" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8779-60"
+       width="0.26456475"
+       height="0.26455694"
+       x="63.87381"
+       y="148.85602" />
+    <rect
+       y="146.21039"
+       x="63.87381"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-54-3"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="145.41667"
+       x="64.402939"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-54-6"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="146.21039"
+       x="64.932068"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-54-7"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="145.41667"
+       x="64.138374"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-54-5"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="-146.73952"
+       x="64.667496"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8817-04-5-3"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="scale(1,-1)" />
+    <rect
+       y="-146.47493"
+       x="63.609245"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8817-04-5-7"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="scale(1,-1)" />
+    <rect
+       y="145.94583"
+       x="65.725815"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-83"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="146.47493"
+       x="64.932068"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-83-6"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="146.73952"
+       x="63.87381"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-24-9"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="143.03542"
+       x="62.286213"
+       height="3.7041543"
+       width="1.3229183"
+       id="rect9043"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="146.47516"
+       x="65.461311"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8701"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8703"
+       width="0.26456475"
+       height="0.26455694"
+       x="65.99044"
+       y="146.73972" />
+    <rect
+       y="147.00426"
+       x="65.725876"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8705"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8707"
+       width="0.26456475"
+       height="0.26455694"
+       x="66.519569"
+       y="147.00426" />
+    <rect
+       y="147.53343"
+       x="66.255005"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8709"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8711"
+       width="0.26456475"
+       height="0.26455694"
+       x="65.725876"
+       y="148.0625" />
+    <rect
+       y="147.53343"
+       x="65.461311"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8713"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8715"
+       width="0.26456475"
+       height="0.26455694"
+       x="65.725876"
+       y="147.53343" />
+    <rect
+       y="148.0625"
+       x="66.519569"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8717"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8719"
+       width="0.26456475"
+       height="0.26455694"
+       x="65.461311"
+       y="148.59163" />
+    <rect
+       y="148.59163"
+       x="65.99044"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8721"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8723"
+       width="0.26456475"
+       height="0.26455694"
+       x="66.255005"
+       y="148.32709" />
+    <rect
+       y="148.59163"
+       x="66.784134"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8725"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8727"
+       width="0.26456478"
+       height="0.26455694"
+       x="66.784134"
+       y="147.53343" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8729"
+       width="0.26456478"
+       height="0.26455694"
+       x="65.99044"
+       y="147.79797" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8735"
+       width="0.26456478"
+       height="0.26455694"
+       x="65.99044"
+       y="146.21057" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8737"
+       width="0.26456478"
+       height="0.26455694"
+       x="65.7258"
+       y="146.47501" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8739"
+       width="0.26456478"
+       height="0.26455694"
+       x="66.784134"
+       y="146.21057" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8741"
+       width="0.26456478"
+       height="0.26455694"
+       x="67.048698"
+       y="146.21057" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8743"
+       width="0.26456478"
+       height="0.26455694"
+       x="67.048698"
+       y="146.73972" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8747"
+       width="0.26456478"
+       height="0.26455694"
+       x="67.313263"
+       y="147.00426" />
+    <rect
+       transform="scale(1,-1)"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8749"
+       width="0.26456475"
+       height="0.26455694"
+       x="67.313255"
+       y="-147.79797" />
+    <rect
+       transform="scale(1,-1)"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8753"
+       width="0.26456475"
+       height="0.26455694"
+       x="67.57782"
+       y="-147.26881" />
+    <rect
+       transform="scale(1,-1)"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8755"
+       width="0.26456475"
+       height="0.26455694"
+       x="67.57782"
+       y="-147.79797" />
+    <rect
+       transform="scale(1,-1)"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8757"
+       width="0.26456475"
+       height="0.26455694"
+       x="67.57782"
+       y="-148.32709" />
+    <rect
+       transform="scale(1,-1)"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8759"
+       width="0.26456475"
+       height="0.26455694"
+       x="67.57782"
+       y="-148.59163" />
+    <rect
+       y="-146.73972"
+       x="67.842384"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8761"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="scale(1,-1)" />
+    <rect
+       y="147.26881"
+       x="67.842392"
+       height="0.26455697"
+       width="0.26456481"
+       id="rect8763"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="148.59163"
+       x="67.842392"
+       height="0.26455697"
+       width="0.26456481"
+       id="rect8765"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="148.0625"
+       x="65.196747"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8767"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="147.00426"
+       x="65.196747"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8770"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="146.21057"
+       x="64.932182"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8772"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="147.53343"
+       x="64.932182"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8774"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="145.946"
+       x="65.461311"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8776"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="145.946"
+       x="66.784134"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8778"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="145.946"
+       x="67.313263"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8782"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="145.946"
+       x="67.577827"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8784"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="145.946"
+       x="65.196747"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8786"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="146.73972"
+       x="65.461311"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8788"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8790"
+       width="0.26456478"
+       height="0.26455694"
+       x="67.313263"
+       y="148.59163" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8792"
+       width="0.26456478"
+       height="0.26455694"
+       x="67.048698"
+       y="148.59163" />
+    <rect
+       transform="scale(1,-1)"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8794"
+       width="0.26456475"
+       height="0.26455694"
+       x="67.048691"
+       y="-148.59163" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8796"
+       width="0.26456478"
+       height="0.26455694"
+       x="67.842392"
+       y="148.32709" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8798"
+       width="0.26456478"
+       height="0.26455694"
+       x="67.048698"
+       y="147.79797" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8800"
+       width="0.26456478"
+       height="0.26455694"
+       x="67.313263"
+       y="148.0625" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8802"
+       width="0.26456478"
+       height="0.26455694"
+       x="65.461311"
+       y="147.26881" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8804"
+       width="0.26456478"
+       height="0.26455694"
+       x="65.99044"
+       y="147.26881" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8806"
+       width="0.26456478"
+       height="0.26455694"
+       x="66.784134"
+       y="147.26881" />
+    <rect
+       y="144.88741"
+       x="66.51947"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-5-6"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="144.88753"
+       x="67.313316"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-1-1"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="145.41656"
+       x="66.254906"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-7-8"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="145.41656"
+       x="65.461197"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-4-7"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="145.68109"
+       x="66.784058"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-42-9"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="144.88741"
+       x="65.725784"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-0-2"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="145.68109"
+       x="65.46122"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-51-0"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="145.15198"
+       x="67.577728"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-57-9"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="144.88741"
+       x="67.577728"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-45-2"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="145.68109"
+       x="67.048599"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-570-2"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="-145.41656"
+       x="67.842285"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8817-04-4-2"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="scale(1,-1)" />
+    <rect
+       y="-145.94566"
+       x="67.842285"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8817-04-60-9"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="scale(1,-1)" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8779-9-9"
+       width="0.26456475"
+       height="0.26455694"
+       x="65.46122"
+       y="144.88741" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8779-1-4"
+       width="0.26456475"
+       height="0.26455694"
+       x="65.196655"
+       y="145.41656" />
+    <rect
+       y="145.946"
+       x="66.255081"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8786-63"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="147.26891"
+       x="66.255081"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8786-2"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="147.26891"
+       x="67.048836"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8786-0"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="148.32724"
+       x="66.519669"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8786-61"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="144.88766"
+       x="66.784248"
+       height="0.26455694"
+       width="0.26456475"
+       id="rect8786-5"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9045"
+       width="1.852071"
+       height="4.4977989"
+       x="143.03542"
+       y="-68.106956"
+       transform="rotate(90)" />
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 65.7258,145.41667 v 0.52917 h 1.058334 v 0.79375 l 1.058333,-1.05834 -1.058333,-1.05833 v 0.79375 z"
+       id="path8440"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccc" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8633"
+       width="1.3229166"
+       height="0.26458332"
+       x="65.46122"
+       y="145.15207" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8635"
+       width="0.26458332"
+       height="0.79374999"
+       x="66.519554"
+       y="144.35832" />
+    <path
+       style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 66.784135,144.35832 1.322917,1.32292 h -0.264583 l -1.058334,-1.05834 z"
+       id="path8637"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8639"
+       d="m 66.784135,147.00415 1.322917,-1.32292 h -0.264583 l -1.058334,1.05834 z"
+       style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <rect
+       y="145.94582"
+       x="65.328926"
+       height="0.26458332"
+       width="1.3229166"
+       id="rect8663"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="144.88741"
+       x="66.254951"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-0-2-3"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="146.73949"
+       x="66.254951"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-0-2-6"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="146.4749"
+       x="67.313286"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-0-2-7"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="146.21033"
+       x="66.254951"
+       height="0.26455694"
+       width="0.26456478"
+       id="rect8817-0-2-5"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52915323;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8422"
+       width="1.3229166"
+       height="1.3229166"
+       x="63.873718"
+       y="145.15207" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_correct_affine-24.svg b/pixmaps/src/gwy_correct_affine-24.svg
new file mode 100644
index 0000000..71b29bc
--- /dev/null
+++ b/pixmaps/src/gwy_correct_affine-24.svg
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.92+devel unknown"
+   sodipodi:docname="gwy_correct_affine-24.svg"
+   inkscape:export-filename="/home/lila/Documents/Gwyddion/gwy_poly_distort-24.png"
+   inkscape:export-xdpi="2.9028571"
+   inkscape:export-ydpi="2.9028571">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="37.374999"
+     inkscape:cx="12.298805"
+     inkscape:cy="7.6847778"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1149"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     units="px"
+     inkscape:snap-smooth-nodes="false"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-grids="true"
+     inkscape:object-nodes="true"
+     inkscape:document-rotation="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid1px"
+       originx="0"
+       originy="0"
+       dotted="false"
+       snapvisiblegridlinesonly="false"
+       spacingx="0.5"
+       spacingy="0.5"
+       enabled="true"
+       visible="true"
+       units="px"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Calque 2"
+     style="display:inline"
+     transform="translate(0,-1029.8622)" />
+  <g
+     inkscape:label="Calque 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="display:inline"
+     transform="translate(0,-1029.8622)">
+    <g
+       transform="matrix(1.0681162,0,0,1.0681162,-420.35261,321.51111)"
+       id="layer1-2"
+       inkscape:label="Layer 1"
+       style="fill:#8abce8;fill-opacity:1">
+      <rect
+         y="663.61682"
+         x="393.98462"
+         height="21.5625"
+         width="21.5625"
+         id="rect8276"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#8abce8;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.00271773;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 0.96942952,1032.8344 H 11.984378"
+       id="path8650"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.00271773;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 0.96942952,1040.8447 H 11.984378"
+       id="path8654"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#cde2f5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00135887;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8689"
+       width="11.014949"
+       height="22.029898"
+       x="11.984379"
+       y="1030.8317" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.00271773;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 10.982965,1030.3304 -4.0054351,23.0311"
+       id="path8676"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8678"
+       d="m 4.975346,1030.3304 -4.0054357,23.0311"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.00271773;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:2.00271773;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 14.988455,1030.8316 v 22.0299"
+       id="path8691"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8693"
+       d="m 20.996608,1030.8316 v 22.0299"
+       style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:2.00271773;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <g
+       id="g8703"
+       transform="matrix(0,1.0681162,-1.0681162,0,1130.0213,1022.8207)"
+       style="stroke:#db2424;stroke-width:1.875;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 9.375,1036.4252 v 10.3125"
+         id="path8697"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8699"
+         d="m 15,1036.4252 v 10.3125"
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="cc" />
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:2.00271773;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 22.99946,1044.8515 H 11.984511"
+       id="path8705"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8713"
+       d="M 22.99946,1050.859 H 11.984511"
+       style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:2.00271773;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8513"
+       d="M 0.96942986,1048.855 H 11.984378"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.00271773;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_correlation_mask-24.svg b/pixmaps/src/gwy_correlation_mask-24.svg
new file mode 100644
index 0000000..ed9f338
--- /dev/null
+++ b/pixmaps/src/gwy_correlation_mask-24.svg
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8798"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_correlation_mask-24.svg">
+  <defs
+     id="defs8800">
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient9160"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.70751116,0,0,0.70751116,-223.01835,60.733619)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8413">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop8415" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop8417" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient9156"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.70751116,0,0,0.70751116,-231.51835,51.233589)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="10.13228"
+     inkscape:cx="-155.1377"
+     inkscape:cy="-28.637061"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8803">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-18.260046,-413.54694)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect11370"
+       width="23.000002"
+       height="23.000002"
+       x="18.760046"
+       y="414.04694" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient9156);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle9154"
+       cx="27.760046"
+       cy="424.04694"
+       r="2.9999731" />
+    <circle
+       r="2.9999731"
+       cy="433.54694"
+       cx="36.260048"
+       id="circle9158"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient9160);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect4793"
+       width="4"
+       height="2.0000041"
+       x="21.260046"
+       y="431.54694" />
+    <rect
+       y="416.54694"
+       x="23.260046"
+       height="2.0000041"
+       width="4"
+       id="rect4801"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect4803"
+       width="7.0000019"
+       height="4.9999962"
+       x="32.760044"
+       y="424.04694" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect4805"
+       width="4"
+       height="2.0000041"
+       x="34.260048"
+       y="425.54694" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect4807"
+       width="9"
+       height="9"
+       x="32.760044"
+       y="414.04694" />
+    <rect
+       y="417.54694"
+       x="35.260048"
+       height="2.0000041"
+       width="4"
+       id="rect4809"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="430.04694"
+       x="19.760044"
+       height="4.9999962"
+       width="7.0000019"
+       id="rect8433"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8435"
+       width="7.0000019"
+       height="4.9999962"
+       x="21.760044"
+       y="415.04694" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_crop-24.svg b/pixmaps/src/gwy_crop-24.svg
new file mode 100644
index 0000000..d4f5987
--- /dev/null
+++ b/pixmaps/src/gwy_crop-24.svg
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8440"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_crop-24.svg"
+   inkscape:export-filename="gwy_crop-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8442">
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath8428-3">
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#eb0000;fill-opacity:0.41158537;fill-rule:evenodd;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8430-6"
+         width="92.534042"
+         height="72.344795"
+         x="77.848434"
+         y="-55.845753"
+         transform="matrix(0.51658212,0.85623765,0.85623765,-0.51658212,0,0)" />
+    </clipPath>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.0011664"
+     inkscape:cx="-65.068902"
+     inkscape:cy="-95.049348"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8445">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-18.260046,-276.07986)">
+    <g
+       id="g8093"
+       transform="matrix(1.5663594,0,0,1.5663594,-14.147555,-159.72079)">
+      <g
+         id="g8081">
+        <g
+           id="layer1-2-5"
+           transform="matrix(0.11133151,0,0,0.11133151,17.616735,273.82647)"
+           style="fill:#000000;stroke:none"
+           inkscape:export-filename="gwy_crop-24.png"
+           inkscape:export-xdpi="90"
+           inkscape:export-ydpi="90">
+          <g
+             transform="translate(-531.25,-536.32)"
+             id="g2648-3"
+             style="fill:#000000;stroke:none">
+            <path
+               style="fill:#000000;stroke:none"
+               d="m 224.67578,20.316406 -7.5957,0.789063 c -0.0434,0.162544 -3.23828,0.291015 -3.23828,0.291015 -0.57113,0.06012 -0.96398,0.156305 -1.17774,0.291016 -0.21041,0.134711 -0.1875,0.764698 -0.1875,1.066406 0,0.357374 0.18282,0.652923 0.54688,0.886719 0.36516,0.230456 0.83121,0.34375 1.40234,0.34375 1.2458,0 2.05226,-0.466593 2.42188,-1.398437 l 0.0586,-0.140626 c 0.11912,-0.297255 0.72363,-0.44334 0.7793,-0.435546 l 0.14257,0.01172 c 0.0356,0.0033 0.0811,0.0059 0.13672,0.0059  [...]
+               transform="matrix(8.9821822,0,0,8.9821822,-1346.7769,437.99079)"
+               id="path2580-5"
+               inkscape:connector-curvature="0" />
+            <path
+               d="m 617.23,638.2 9.62,-0.8 17.73,26.23 h -11.8 L 617.23,638.2"
+               style="fill:#000000;stroke:none"
+               id="path2578-6"
+               inkscape:connector-curvature="0" />
+            <path
+               d="m 616.96,633.39 c 1.6,0 2.41,-0.89 2.41,-2.67 0,-1.64 -0.95,-2.45 -2.84,-2.45 -1.6,0 -2.4,0.87 -2.4,2.61 0,1.68 0.94,2.51 2.83,2.51"
+               style="fill:#000000;stroke:none"
+               id="path2572-2"
+               inkscape:connector-curvature="0" />
+          </g>
+        </g>
+        <g
+           style="fill:#000000;fill-opacity:1;stroke:none"
+           transform="matrix(0.06752182,0.0885184,0.0885184,-0.06752182,13.120175,283.20038)"
+           id="g8412-9"
+           clip-path="url(#clipPath8428-3)"
+           inkscape:export-filename="gwy_crop-24.png"
+           inkscape:export-xdpi="90"
+           inkscape:export-ydpi="90">
+          <g
+             style="fill:#000000;fill-opacity:1;stroke:none"
+             id="g8414-1"
+             transform="translate(-531.25,-536.32)">
+            <path
+               inkscape:connector-curvature="0"
+               id="path8416-2"
+               transform="matrix(8.9821822,0,0,8.9821822,-1346.7769,437.99079)"
+               d="m 224.67578,20.316406 -7.5957,0.789063 c -0.0434,0.162544 -3.23828,0.291015 -3.23828,0.291015 -0.57113,0.06012 -0.96398,0.156305 -1.17774,0.291016 -0.21041,0.134711 -0.1875,0.764698 -0.1875,1.066406 0,0.357374 0.18282,0.652923 0.54688,0.886719 0.36516,0.230456 0.83121,0.34375 1.40234,0.34375 1.2458,0 2.05226,-0.466593 2.42188,-1.398437 l 0.0586,-0.140626 c 0.11912,-0.297255 0.72363,-0.44334 0.7793,-0.435546 l 0.14257,0.01172 c 0.0356,0.0033 0.0811,0.0059 0.13672,0.0059  [...]
+               style="fill:#000000;fill-opacity:1;stroke:none" />
+            <path
+               inkscape:connector-curvature="0"
+               id="path8418-7"
+               style="fill:#000000;fill-opacity:1;stroke:none"
+               d="m 617.23,638.2 9.62,-0.8 17.73,26.23 h -11.8 L 617.23,638.2" />
+            <path
+               inkscape:connector-curvature="0"
+               id="path8420-0"
+               style="fill:#000000;fill-opacity:1;stroke:none"
+               d="m 616.96,633.39 c 1.6,0 2.41,-0.89 2.41,-2.67 0,-1.64 -0.95,-2.45 -2.84,-2.45 -1.6,0 -2.4,0.87 -2.4,2.61 0,1.68 0.94,2.51 2.83,2.51" />
+          </g>
+        </g>
+      </g>
+    </g>
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2, 1;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 25.760046,289.57986 h 16.000002 v 10.00001 H 25.760046 Z"
+       id="rect11972-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_cwt-24.svg b/pixmaps/src/gwy_cwt-24.svg
new file mode 100644
index 0000000..27fcc96
--- /dev/null
+++ b/pixmaps/src/gwy_cwt-24.svg
@@ -0,0 +1,1632 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8233"
+     version="1.1"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_cwt-24.svg">
+    <defs
+         id="defs8235">
+        <circle
+             stroke-width="0.5"
+             r="0.5"
+             id="gpDot" />
+        <path
+             d="M-1,0 h2 M0,-1 v2"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt0" />
+        <path
+             d="M-1,-1 L1,1 M1,-1 L-1,1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt1" />
+        <path
+             d="M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt2" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt3" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             fill="currentColor"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt4" />
+        <circle
+             r="1"
+             cy="0"
+             cx="0"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt5" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt6"
+             xlink:href="#gpPt5" />
+        <path
+             d="M0,-1.33 L-1.33,0.67 L1.33,0.67 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt7" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt8"
+             xlink:href="#gpPt7" />
+        <use
+             transform="rotate(180)"
+             stroke="currentColor"
+             id="gpPt9"
+             xlink:href="#gpPt7" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt10"
+             xlink:href="#gpPt9" />
+        <use
+             transform="rotate(45)"
+             stroke="currentColor"
+             id="gpPt11"
+             xlink:href="#gpPt3" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt12"
+             xlink:href="#gpPt11" />
+        <path
+             d="M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt13" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt14"
+             xlink:href="#gpPt13" />
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="textbox">
+            <feFlood
+                 id="feFlood4495"
+                 result="bgnd"
+                 flood-opacity="1"
+                 flood-color="white" />
+            <feComposite
+                 id="feComposite4497"
+                 operator="atop"
+                 in2="bgnd"
+                 in="SourceGraphic" />
+        </filter>
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="greybox">
+            <feFlood
+                 id="feFlood4500"
+                 result="grey"
+                 flood-opacity="1"
+                 flood-color="lightgrey" />
+            <feComposite
+                 id="feComposite4502"
+                 operator="atop"
+                 in2="grey"
+                 in="SourceGraphic" />
+        </filter>
+        <circle
+             stroke-width="0.5"
+             r="0.5"
+             id="gpDot-4" />
+        <path
+             d="M-1,0 h2 M0,-1 v2"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt0-5" />
+        <path
+             d="M-1,-1 L1,1 M1,-1 L-1,1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt1-2" />
+        <path
+             d="M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt2-5" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt3-9" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             fill="currentColor"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt4-3" />
+        <circle
+             r="1"
+             cy="0"
+             cx="0"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt5-8" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt6-8"
+             xlink:href="#gpPt5-8" />
+        <path
+             d="M0,-1.33 L-1.33,0.67 L1.33,0.67 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt7-4" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt8-3"
+             xlink:href="#gpPt7-4" />
+        <use
+             transform="rotate(180)"
+             stroke="currentColor"
+             id="gpPt9-5"
+             xlink:href="#gpPt7-4" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt10-0"
+             xlink:href="#gpPt9-5" />
+        <use
+             transform="rotate(45)"
+             stroke="currentColor"
+             id="gpPt11-5"
+             xlink:href="#gpPt3-9" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt12-9"
+             xlink:href="#gpPt11-5" />
+        <path
+             d="M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt13-3" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt14-4"
+             xlink:href="#gpPt13-3" />
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="textbox-6">
+            <feFlood
+                 id="feFlood4756"
+                 result="bgnd"
+                 flood-opacity="1"
+                 flood-color="white" />
+            <feComposite
+                 id="feComposite4758"
+                 operator="atop"
+                 in2="bgnd"
+                 in="SourceGraphic" />
+        </filter>
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="greybox-2">
+            <feFlood
+                 id="feFlood4761"
+                 result="grey"
+                 flood-opacity="1"
+                 flood-color="lightgrey" />
+            <feComposite
+                 id="feComposite4763"
+                 operator="atop"
+                 in2="grey"
+                 in="SourceGraphic" />
+        </filter>
+        <circle
+             stroke-width="0.5"
+             r="0.5"
+             id="gpDot-5" />
+        <path
+             d="M-1,0 h2 M0,-1 v2"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt0-3" />
+        <path
+             d="M-1,-1 L1,1 M1,-1 L-1,1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt1-20" />
+        <path
+             d="M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt2-0" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt3-0" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             fill="currentColor"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt4-9" />
+        <circle
+             r="1"
+             cy="0"
+             cx="0"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt5-80" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt6-9"
+             xlink:href="#gpPt5-80" />
+        <path
+             d="M0,-1.33 L-1.33,0.67 L1.33,0.67 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt7-6" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt8-7"
+             xlink:href="#gpPt7-6" />
+        <use
+             transform="rotate(180)"
+             stroke="currentColor"
+             id="gpPt9-2"
+             xlink:href="#gpPt7-6" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt10-1"
+             xlink:href="#gpPt9-2" />
+        <use
+             transform="rotate(45)"
+             stroke="currentColor"
+             id="gpPt11-4"
+             xlink:href="#gpPt3-0" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt12-4"
+             xlink:href="#gpPt11-4" />
+        <path
+             d="M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt13-8" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt14-49"
+             xlink:href="#gpPt13-8" />
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="textbox-8">
+            <feFlood
+                 id="feFlood5017"
+                 result="bgnd"
+                 flood-opacity="1"
+                 flood-color="white" />
+            <feComposite
+                 id="feComposite5019"
+                 operator="atop"
+                 in2="bgnd"
+                 in="SourceGraphic" />
+        </filter>
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="greybox-4">
+            <feFlood
+                 id="feFlood5022"
+                 result="grey"
+                 flood-opacity="1"
+                 flood-color="lightgrey" />
+            <feComposite
+                 id="feComposite5024"
+                 operator="atop"
+                 in2="grey"
+                 in="SourceGraphic" />
+        </filter>
+        <defs
+             id="defs5027">
+            <circle
+                 cy="0"
+                 cx="0"
+                 id="circle5089"
+                 r="0.5"
+                 stroke-width="0.5" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path5091"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,0 H 1 M 0,-1 v 2" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path5093"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,-1 1,1 M 1,-1 -1,1" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path5095"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,0 H 1 M 0,-1 v 2 m -1,-2 2,2 m -2,0 2,-2" />
+            <rect
+                 id="rect5097"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 x="-1"
+                 y="-1"
+                 width="2"
+                 height="2" />
+            <rect
+                 id="rect5099"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 fill="currentColor"
+                 x="-1"
+                 y="-1"
+                 width="2"
+                 height="2" />
+            <circle
+                 id="circle5101"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 cx="0"
+                 cy="0"
+                 r="1" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt5-80"
+                 id="use5103"
+                 fill="currentColor"
+                 stroke="none" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path5105"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="m 0,-1.33 -1.33,2 h 2.66 z" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt7-6"
+                 id="use5107"
+                 fill="currentColor"
+                 stroke="none" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt7-6"
+                 id="use5109"
+                 stroke="currentColor"
+                 transform="scale(-1)" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt9-2"
+                 id="use5111"
+                 fill="currentColor"
+                 stroke="none" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt3-0"
+                 id="use5113"
+                 stroke="currentColor"
+                 transform="rotate(45)" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt11-4"
+                 id="use5115"
+                 fill="currentColor"
+                 stroke="none" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path5117"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M 0,1.33 1.265,0.411 0.782,-1.067 -0.782,-1.076 -1.265,0.411 Z" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt13-8"
+                 id="use5119"
+                 fill="currentColor"
+                 stroke="none" />
+            <filter
+                 id="filter5125"
+                 filterUnits="objectBoundingBox"
+                 x="0"
+                 y="0"
+                 height="1"
+                 width="1">
+                <feFlood
+                     flood-color="white"
+                     flood-opacity="1"
+                     result="bgnd"
+                     id="feFlood5121" />
+                <feComposite
+                     in="SourceGraphic"
+                     in2="bgnd"
+                     operator="atop"
+                     id="feComposite5123" />
+            </filter>
+            <filter
+                 id="filter5131"
+                 filterUnits="objectBoundingBox"
+                 x="0"
+                 y="0"
+                 height="1"
+                 width="1">
+                <feFlood
+                     flood-color="lightgrey"
+                     flood-opacity="1"
+                     result="grey"
+                     id="feFlood5127" />
+                <feComposite
+                     in="SourceGraphic"
+                     in2="grey"
+                     operator="atop"
+                     id="feComposite5129" />
+            </filter>
+        </defs>
+        <circle
+             stroke-width="0.5"
+             r="0.5"
+             id="gpDot-41" />
+        <path
+             d="M-1,0 h2 M0,-1 v2"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt0-9" />
+        <path
+             d="M-1,-1 L1,1 M1,-1 L-1,1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt1-6" />
+        <path
+             d="M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt2-8" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt3-09" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             fill="currentColor"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt4-36" />
+        <circle
+             r="1"
+             cy="0"
+             cx="0"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt5-3" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt6-89"
+             xlink:href="#gpPt5-3" />
+        <path
+             d="M0,-1.33 L-1.33,0.67 L1.33,0.67 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt7-5" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt8-0"
+             xlink:href="#gpPt7-5" />
+        <use
+             transform="rotate(180)"
+             stroke="currentColor"
+             id="gpPt9-1"
+             xlink:href="#gpPt7-5" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt10-7"
+             xlink:href="#gpPt9-1" />
+        <use
+             transform="rotate(45)"
+             stroke="currentColor"
+             id="gpPt11-1"
+             xlink:href="#gpPt3-09" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt12-98"
+             xlink:href="#gpPt11-1" />
+        <path
+             d="M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt13-2" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt14-6"
+             xlink:href="#gpPt13-2" />
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="textbox-7">
+            <feFlood
+                 id="feFlood6613"
+                 result="bgnd"
+                 flood-opacity="1"
+                 flood-color="white" />
+            <feComposite
+                 id="feComposite6615"
+                 operator="atop"
+                 in2="bgnd"
+                 in="SourceGraphic" />
+        </filter>
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="greybox-5">
+            <feFlood
+                 id="feFlood6618"
+                 result="grey"
+                 flood-opacity="1"
+                 flood-color="lightgrey" />
+            <feComposite
+                 id="feComposite6620"
+                 operator="atop"
+                 in2="grey"
+                 in="SourceGraphic" />
+        </filter>
+        <defs
+             id="defs6623">
+            <circle
+                 cy="0"
+                 cx="0"
+                 id="circle6685"
+                 r="0.5"
+                 stroke-width="0.5" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path6687"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,0 H 1 M 0,-1 v 2" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path6689"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,-1 1,1 M 1,-1 -1,1" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path6691"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,0 H 1 M 0,-1 v 2 m -1,-2 2,2 m -2,0 2,-2" />
+            <rect
+                 id="rect6693"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 x="-1"
+                 y="-1"
+                 width="2"
+                 height="2" />
+            <rect
+                 id="rect6695"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 fill="currentColor"
+                 x="-1"
+                 y="-1"
+                 width="2"
+                 height="2" />
+            <circle
+                 id="circle6697"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 cx="0"
+                 cy="0"
+                 r="1" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt5-3"
+                 id="use6699"
+                 fill="currentColor"
+                 stroke="none" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path6701"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="m 0,-1.33 -1.33,2 h 2.66 z" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt7-5"
+                 id="use6703"
+                 fill="currentColor"
+                 stroke="none" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt7-5"
+                 id="use6705"
+                 stroke="currentColor"
+                 transform="scale(-1)" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt9-1"
+                 id="use6707"
+                 fill="currentColor"
+                 stroke="none" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt3-09"
+                 id="use6709"
+                 stroke="currentColor"
+                 transform="rotate(45)" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt11-1"
+                 id="use6711"
+                 fill="currentColor"
+                 stroke="none" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path6713"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M 0,1.33 1.265,0.411 0.782,-1.067 -0.782,-1.076 -1.265,0.411 Z" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt13-2"
+                 id="use6715"
+                 fill="currentColor"
+                 stroke="none" />
+            <filter
+                 id="filter6721"
+                 filterUnits="objectBoundingBox"
+                 x="0"
+                 y="0"
+                 height="1"
+                 width="1">
+                <feFlood
+                     flood-color="white"
+                     flood-opacity="1"
+                     result="bgnd"
+                     id="feFlood6717" />
+                <feComposite
+                     in="SourceGraphic"
+                     in2="bgnd"
+                     operator="atop"
+                     id="feComposite6719" />
+            </filter>
+            <filter
+                 id="filter6727"
+                 filterUnits="objectBoundingBox"
+                 x="0"
+                 y="0"
+                 height="1"
+                 width="1">
+                <feFlood
+                     flood-color="lightgrey"
+                     flood-opacity="1"
+                     result="grey"
+                     id="feFlood6723" />
+                <feComposite
+                     in="SourceGraphic"
+                     in2="grey"
+                     operator="atop"
+                     id="feComposite6725" />
+            </filter>
+        </defs>
+        <circle
+             stroke-width="0.5"
+             r="0.5"
+             id="gpDot-9" />
+        <path
+             d="M-1,0 h2 M0,-1 v2"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt0-97" />
+        <path
+             d="M-1,-1 L1,1 M1,-1 L-1,1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt1-9" />
+        <path
+             d="M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt2-7" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt3-3" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             fill="currentColor"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt4-5" />
+        <circle
+             r="1"
+             cy="0"
+             cx="0"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt5-0" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt6-4"
+             xlink:href="#gpPt5-0" />
+        <path
+             d="M0,-1.33 L-1.33,0.67 L1.33,0.67 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt7-1" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt8-9"
+             xlink:href="#gpPt7-1" />
+        <use
+             transform="rotate(180)"
+             stroke="currentColor"
+             id="gpPt9-4"
+             xlink:href="#gpPt7-1" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt10-14"
+             xlink:href="#gpPt9-4" />
+        <use
+             transform="rotate(45)"
+             stroke="currentColor"
+             id="gpPt11-3"
+             xlink:href="#gpPt3-3" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt12-6"
+             xlink:href="#gpPt11-3" />
+        <path
+             d="M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt13-4" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt14-2"
+             xlink:href="#gpPt13-4" />
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="textbox-2">
+            <feFlood
+                 id="feFlood6925"
+                 result="bgnd"
+                 flood-opacity="1"
+                 flood-color="white" />
+            <feComposite
+                 id="feComposite6927"
+                 operator="atop"
+                 in2="bgnd"
+                 in="SourceGraphic" />
+        </filter>
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="greybox-7">
+            <feFlood
+                 id="feFlood6930"
+                 result="grey"
+                 flood-opacity="1"
+                 flood-color="lightgrey" />
+            <feComposite
+                 id="feComposite6932"
+                 operator="atop"
+                 in2="grey"
+                 in="SourceGraphic" />
+        </filter>
+        <circle
+             stroke-width="0.5"
+             r="0.5"
+             id="gpDot-8" />
+        <path
+             d="M-1,0 h2 M0,-1 v2"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt0-51" />
+        <path
+             d="M-1,-1 L1,1 M1,-1 L-1,1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt1-1" />
+        <path
+             d="M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt2-3" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt3-06" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             fill="currentColor"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt4-4" />
+        <circle
+             r="1"
+             cy="0"
+             cx="0"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt5-4" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt6-7"
+             xlink:href="#gpPt5-4" />
+        <path
+             d="M0,-1.33 L-1.33,0.67 L1.33,0.67 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt7-53" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt8-8"
+             xlink:href="#gpPt7-53" />
+        <use
+             transform="rotate(180)"
+             stroke="currentColor"
+             id="gpPt9-27"
+             xlink:href="#gpPt7-53" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt10-3"
+             xlink:href="#gpPt9-27" />
+        <use
+             transform="rotate(45)"
+             stroke="currentColor"
+             id="gpPt11-53"
+             xlink:href="#gpPt3-06" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt12-7"
+             xlink:href="#gpPt11-53" />
+        <path
+             d="M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt13-48" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt14-0"
+             xlink:href="#gpPt13-48" />
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="textbox-0">
+            <feFlood
+                 id="feFlood7186"
+                 result="bgnd"
+                 flood-opacity="1"
+                 flood-color="white" />
+            <feComposite
+                 id="feComposite7188"
+                 operator="atop"
+                 in2="bgnd"
+                 in="SourceGraphic" />
+        </filter>
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="greybox-1">
+            <feFlood
+                 id="feFlood7191"
+                 result="grey"
+                 flood-opacity="1"
+                 flood-color="lightgrey" />
+            <feComposite
+                 id="feComposite7193"
+                 operator="atop"
+                 in2="grey"
+                 in="SourceGraphic" />
+        </filter>
+        <defs
+             id="defs7196">
+            <circle
+                 cy="0"
+                 cx="0"
+                 id="circle7258"
+                 r="0.5"
+                 stroke-width="0.5" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path7260"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,0 H 1 M 0,-1 v 2" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path7262"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,-1 1,1 M 1,-1 -1,1" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path7264"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,0 H 1 M 0,-1 v 2 m -1,-2 2,2 m -2,0 2,-2" />
+            <rect
+                 id="rect7266"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 x="-1"
+                 y="-1"
+                 width="2"
+                 height="2" />
+            <rect
+                 id="rect7268"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 fill="currentColor"
+                 x="-1"
+                 y="-1"
+                 width="2"
+                 height="2" />
+            <circle
+                 id="circle7270"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 cx="0"
+                 cy="0"
+                 r="1" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt5-4"
+                 id="use7272"
+                 fill="currentColor"
+                 stroke="none" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path7274"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="m 0,-1.33 -1.33,2 h 2.66 z" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt7-53"
+                 id="use7276"
+                 fill="currentColor"
+                 stroke="none" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt7-53"
+                 id="use7278"
+                 stroke="currentColor"
+                 transform="scale(-1)" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt9-27"
+                 id="use7280"
+                 fill="currentColor"
+                 stroke="none" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt3-06"
+                 id="use7282"
+                 stroke="currentColor"
+                 transform="rotate(45)" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt11-53"
+                 id="use7284"
+                 fill="currentColor"
+                 stroke="none" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path7286"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M 0,1.33 1.265,0.411 0.782,-1.067 -0.782,-1.076 -1.265,0.411 Z" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt13-48"
+                 id="use7288"
+                 fill="currentColor"
+                 stroke="none" />
+            <filter
+                 id="filter7294"
+                 filterUnits="objectBoundingBox"
+                 x="0"
+                 y="0"
+                 height="1"
+                 width="1">
+                <feFlood
+                     flood-color="white"
+                     flood-opacity="1"
+                     result="bgnd"
+                     id="feFlood7290" />
+                <feComposite
+                     in="SourceGraphic"
+                     in2="bgnd"
+                     operator="atop"
+                     id="feComposite7292" />
+            </filter>
+            <filter
+                 id="filter7300"
+                 filterUnits="objectBoundingBox"
+                 x="0"
+                 y="0"
+                 height="1"
+                 width="1">
+                <feFlood
+                     flood-color="lightgrey"
+                     flood-opacity="1"
+                     result="grey"
+                     id="feFlood7296" />
+                <feComposite
+                     in="SourceGraphic"
+                     in2="grey"
+                     operator="atop"
+                     id="feComposite7298" />
+            </filter>
+        </defs>
+        <circle
+             stroke-width="0.5"
+             r="0.5"
+             id="gpDot-54" />
+        <path
+             d="M-1,0 h2 M0,-1 v2"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt0-6" />
+        <path
+             d="M-1,-1 L1,1 M1,-1 L-1,1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt1-3" />
+        <path
+             d="M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt2-1" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt3-2" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             fill="currentColor"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt4-0" />
+        <circle
+             r="1"
+             cy="0"
+             cx="0"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt5-6" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt6-5"
+             xlink:href="#gpPt5-6" />
+        <path
+             d="M0,-1.33 L-1.33,0.67 L1.33,0.67 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt7-19" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt8-4"
+             xlink:href="#gpPt7-19" />
+        <use
+             transform="rotate(180)"
+             stroke="currentColor"
+             id="gpPt9-46"
+             xlink:href="#gpPt7-19" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt10-8"
+             xlink:href="#gpPt9-46" />
+        <use
+             transform="rotate(45)"
+             stroke="currentColor"
+             id="gpPt11-10"
+             xlink:href="#gpPt3-2" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt12-8"
+             xlink:href="#gpPt11-10" />
+        <path
+             d="M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt13-1" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt14-29"
+             xlink:href="#gpPt13-1" />
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="textbox-88">
+            <feFlood
+                 id="feFlood7538"
+                 result="bgnd"
+                 flood-opacity="1"
+                 flood-color="white" />
+            <feComposite
+                 id="feComposite7540"
+                 operator="atop"
+                 in2="bgnd"
+                 in="SourceGraphic" />
+        </filter>
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="greybox-6">
+            <feFlood
+                 id="feFlood7543"
+                 result="grey"
+                 flood-opacity="1"
+                 flood-color="lightgrey" />
+            <feComposite
+                 id="feComposite7545"
+                 operator="atop"
+                 in2="grey"
+                 in="SourceGraphic" />
+        </filter>
+        <defs
+             id="defs7548">
+            <circle
+                 cy="0"
+                 cx="0"
+                 id="circle7603"
+                 r="0.5"
+                 stroke-width="0.5" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path7605"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,0 H 1 M 0,-1 v 2" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path7607"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,-1 1,1 M 1,-1 -1,1" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path7609"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,0 H 1 M 0,-1 v 2 m -1,-2 2,2 m -2,0 2,-2" />
+            <rect
+                 id="rect7611"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 x="-1"
+                 y="-1"
+                 width="2"
+                 height="2" />
+            <rect
+                 id="rect7613"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 fill="currentColor"
+                 x="-1"
+                 y="-1"
+                 width="2"
+                 height="2" />
+            <circle
+                 id="circle7615"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 cx="0"
+                 cy="0"
+                 r="1" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt5-6"
+                 id="use7617"
+                 fill="currentColor"
+                 stroke="none" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path7619"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="m 0,-1.33 -1.33,2 h 2.66 z" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt7-19"
+                 id="use7621"
+                 fill="currentColor"
+                 stroke="none" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt7-19"
+                 id="use7623"
+                 stroke="currentColor"
+                 transform="scale(-1)" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt9-46"
+                 id="use7625"
+                 fill="currentColor"
+                 stroke="none" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt3-2"
+                 id="use7627"
+                 stroke="currentColor"
+                 transform="rotate(45)" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt11-10"
+                 id="use7629"
+                 fill="currentColor"
+                 stroke="none" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path7631"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M 0,1.33 1.265,0.411 0.782,-1.067 -0.782,-1.076 -1.265,0.411 Z" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt13-1"
+                 id="use7633"
+                 fill="currentColor"
+                 stroke="none" />
+            <filter
+                 id="filter7639"
+                 filterUnits="objectBoundingBox"
+                 x="0"
+                 y="0"
+                 height="1"
+                 width="1">
+                <feFlood
+                     flood-color="white"
+                     flood-opacity="1"
+                     result="bgnd"
+                     id="feFlood7635" />
+                <feComposite
+                     in="SourceGraphic"
+                     in2="bgnd"
+                     operator="atop"
+                     id="feComposite7637" />
+            </filter>
+            <filter
+                 id="filter7645"
+                 filterUnits="objectBoundingBox"
+                 x="0"
+                 y="0"
+                 height="1"
+                 width="1">
+                <feFlood
+                     flood-color="lightgrey"
+                     flood-opacity="1"
+                     result="grey"
+                     id="feFlood7641" />
+                <feComposite
+                     in="SourceGraphic"
+                     in2="grey"
+                     operator="atop"
+                     id="feComposite7643" />
+            </filter>
+        </defs>
+    </defs>
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="25.673747"
+         inkscape:cx="14.002038"
+         inkscape:cy="8.4572256"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1379"
+         inkscape:window-height="1023"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="0"
+         inkscape:snap-object-midpoints="true"
+         inkscape:snap-grids="true"
+         inkscape:document-rotation="0"
+         units="px">
+        <inkscape:grid
+             type="xygrid"
+             id="grid1px"
+             originx="0"
+             originy="0"
+             dotted="false"
+             snapvisiblegridlinesonly="false"
+             spacingx="0.5"
+             spacingy="0.5"
+             enabled="true"
+             visible="true"
+             units="px"
+             empspacing="2" />
+    </sodipodi:namedview>
+    <metadata
+         id="metadata8238">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title />
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-393.51587,-663.14807)">
+        <path
+             inkscape:connector-curvature="0"
+             stroke="rgb(255,   0,   0)"
+             d="m 393.93464,680.50205 0.1941,0.01 0.1941,0.01 0.1941,0.01 0.19409,0.0194 0.1941,0.01 0.1941,0.0194 0.1941,0.0291 0.1941,0.0291 0.1941,0.0291 0.1941,0.0388 0.19409,0.0388 0.1941,0.0582 0.1941,0.0485 0.1941,0.0679 0.1941,0.0776 0.1941,0.0776 0.19409,0.097 0.1941,0.097 0.1941,0.10675 0.1941,0.11646 0.1941,0.12616 0.1941,0.13587 0.1941,0.13587 0.19409,0.14557 0.1941,0.14558 0.1941,0.14557 0.1941,0.13587 0.1941,0.13587 0.1941,0.12616 0.19409,0.11646 0.1941,0.0971 0.1941,0.0679 [...]
+             id="path7558"
+             style="color:#000000;vector-effect:none;fill:none;fill-opacity:1;stroke:#e91616;stroke-width:1.39999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;opacity:1" />
+        <text
+             id="text4357"
+             y="672.25159"
+             x="413.88821"
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:11.72398472px;line-height:1;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;text-anchor:middle;shape-padding:0;overflow:visible;vector-effect:none;fill:#000000;stroke-width:0.2;paint-order:fill markers stroke;font-var [...]
+             xml:space="preserve"><tspan
+                 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';stroke-width:0.2;font-size:11.72398472px;line-height:1;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;text-indent:0;text-align:c [...]
+                 y="672.25159"
+                 x="413.88821"
+                 id="tspan4355"
+                 sodipodi:role="line">T</tspan></text>
+        <text
+             xml:space="preserve"
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:11.72398472px;line-height:1;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;text-anchor:middle;shape-padding:0;overflow:visible;vector-effect:none;fill:#000000;stroke-width:0.2;paint-order:fill markers stroke;font-var [...]
+             x="405.52057"
+             y="672.25159"
+             id="text4361"><tspan
+                 sodipodi:role="line"
+                 id="tspan4359"
+                 x="405.52057"
+                 y="672.25159"
+                 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';stroke-width:0.2;font-size:11.72398472px;line-height:1;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;text-indent:0;text-align:c [...]
+        <text
+             id="text4365"
+             y="672.25159"
+             x="397.57727"
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:11.72398472px;line-height:1;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;text-anchor:middle;shape-padding:0;overflow:visible;vector-effect:none;fill:#000000;stroke-width:0.2;paint-order:fill markers stroke;font-var [...]
+             xml:space="preserve"><tspan
+                 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';stroke-width:0.2;font-size:11.72398472px;line-height:1;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;text-indent:0;text-align:c [...]
+                 y="672.25159"
+                 x="397.57727"
+                 id="tspan4363"
+                 sodipodi:role="line">C</tspan></text>
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_data_measure-24.svg b/pixmaps/src/gwy_data_measure-24.svg
new file mode 100644
index 0000000..6b3a017
--- /dev/null
+++ b/pixmaps/src/gwy_data_measure-24.svg
@@ -0,0 +1,574 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9772"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_data_measure-24.svg"
+   inkscape:export-filename="gwy_data_measure-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs9774">
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4171"
+       xlink:href="#linearGradient4140"
+       gradientTransform="translate(-11.142957,824.89612)" />
+    <linearGradient
+       id="linearGradient4140">
+      <stop
+         id="stop4142"
+         offset="0"
+         style="stop-color:#d7e3f4;stop-opacity:1;" />
+      <stop
+         id="stop4144"
+         offset="1"
+         style="stop-color:#f1f5fb;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient8503"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-53.914577,824.04971)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient11272"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-38.348167,832.54043)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(-78.589887,830.07148)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient9134"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="14.84682"
+     inkscape:cx="6.2294116"
+     inkscape:cy="9.127072"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9777">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.92537,-381.05775)">
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385"
+       y="714.96503"
+       x="-9.7732153">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487"
+       y="810.84119"
+       x="14.356759">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536"
+       y="750.25366"
+       x="-51.075951">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6"
+       style="opacity:1;fill:url(#linearGradient4171);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318"
+       transform="translate(-90.256557,549.58015)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386"
+       transform="translate(456.96468,21.382171)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162"
+       transform="translate(-237.67749,-135.37972)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="310.491"
+       y="938.9043"
+       id="text8015"><tspan
+         id="tspan8017"
+         x="310.491"
+         y="938.9043" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1262.6105"
+       y="-388.16058"
+       id="text9295"><tspan
+         id="tspan9297"
+         x="-1262.6105"
+         y="-388.16058" /></text>
+    <text
+       id="text7408-2"
+       class="fil7 fnt4"
+       y="-106.27875"
+       x="-1145.3977"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422"
+       class="fil7 fnt4"
+       y="-78.812134"
+       x="-1129.0248"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-9"
+       y="714.11859"
+       x="-52.544838">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-0"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-9"
+       y="809.99475"
+       x="-28.414862">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-1"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7"
+       y="749.40723"
+       x="-93.847572">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-7"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-1"
+       style="opacity:1;fill:url(#linearGradient8503);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-7"
+       transform="translate(-133.02816,548.73374)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-6"
+       transform="translate(414.19309,20.535761)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7"
+       transform="translate(-280.44909,-136.22613)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="267.71939"
+       y="938.05786"
+       id="text8015-3"><tspan
+         id="tspan8017-6"
+         x="267.71939"
+         y="938.05786" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1305.3821"
+       y="-389.00696"
+       id="text9295-5"><tspan
+         id="tspan9297-6"
+         x="-1305.3821"
+         y="-389.00696" /></text>
+    <text
+       id="text7408-2-3"
+       class="fil7 fnt4"
+       y="-107.12515"
+       x="-1188.1693"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-9"
+       class="fil7 fnt4"
+       y="-79.658539"
+       x="-1171.7964"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 142.42537,380.55774 h 8 v 25.00001 h -8 z"
+       id="rect16956-4"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path16962-8"
+       d="m 142.92537,390.5636 h 5"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path16970-1"
+       d="m 142.92537,402.5636 h 5"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8257"
+       d="m 142.92537,398.5636 h 3"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8276"
+       d="m 142.92537,386.5636 h 3"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 142.92537,382.5636 h 3"
+       id="path8356"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 142.92537,394.5636 h 3"
+       id="path8358"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-7"
+       y="722.60931"
+       x="-36.978432">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-2"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-3"
+       y="818.48547"
+       x="-12.848456">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-7"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-2"
+       y="757.89795"
+       x="-78.281166">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-5"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-3"
+       style="opacity:1;fill:url(#linearGradient11272);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-3"
+       transform="translate(-117.46176,557.22446)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-64"
+       transform="translate(429.75948,29.026481)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-03"
+       transform="translate(-264.88269,-127.73541)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="283.2858"
+       y="946.54858"
+       id="text8015-5"><tspan
+         id="tspan8017-85"
+         x="283.2858"
+         y="946.54858" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1289.8157"
+       y="-380.51624"
+       id="text9295-0"><tspan
+         id="tspan9297-9"
+         x="-1289.8157"
+         y="-380.51624" /></text>
+    <text
+       id="text7408-2-9"
+       class="fil7 fnt4"
+       y="-98.63443"
+       x="-1172.6029"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-8"
+       class="fil7 fnt4"
+       y="-71.167816"
+       x="-1156.23"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-2"
+       y="720.14038"
+       x="-77.220161">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-6"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-5"
+       y="816.01654"
+       x="-53.090187">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-8"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7-2"
+       y="755.42902"
+       x="-118.5229">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-9"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-6"
+       style="opacity:1;fill:url(#linearGradient9134);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-4"
+       transform="translate(-157.70346,554.75551)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-8"
+       transform="translate(389.51778,26.557531)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7-4"
+       transform="translate(-305.1244,-130.20437)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="243.04408"
+       y="944.07959"
+       id="text8015-0"><tspan
+         id="tspan8017-8"
+         x="243.04408"
+         y="944.07959" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1330.0574"
+       y="-382.98517"
+       id="text9295-6-9"><tspan
+         id="tspan9297-2"
+         x="-1330.0574"
+         y="-382.98517" /></text>
+    <text
+       id="text7408-2-4"
+       class="fil7 fnt4"
+       y="-101.10336"
+       x="-1212.8446"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-7"
+       class="fil7 fnt4"
+       y="-73.636749"
+       x="-1196.4717"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8265"
+       d="m 142.92537,383.5636 h 3"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 142.92537,387.5636 h 3"
+       id="path8267"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 142.92537,391.5636 h 5"
+       id="path8269"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8271"
+       d="m 142.92537,395.5636 h 3"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 142.92537,403.5636 h 5"
+       id="path8273"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 142.92537,399.5636 h 3"
+       id="path8275"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 131.42552,380.55774 h 6 v 25 h -6 z"
+       id="rect12874"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 131.92536,388.55787 h 3"
+       id="path12876"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 131.92536,385.55787 h 2.00001"
+       id="path12880"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path12882"
+       d="m 131.92536,382.55787 h 3"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 131.92536,397.55787 h 2.00001"
+       id="path12884"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 131.92536,391.55787 h 2.00001"
+       id="path12890"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path12892"
+       d="m 131.92536,394.55787 h 3"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 131.92536,400.55787 h 3"
+       id="path8091"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8509"
+       d="m 131.92536,403.55787 h 2.00001"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_disconnected-24.svg b/pixmaps/src/gwy_disconnected-24.svg
new file mode 100644
index 0000000..9554d01
--- /dev/null
+++ b/pixmaps/src/gwy_disconnected-24.svg
@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="6.3499999mm"
+   height="6.3499999mm"
+   viewBox="0 0 22.499999 22.499999"
+   id="svg8233"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_disconnected-24.svg">
+  <defs
+     id="defs8235">
+    <linearGradient
+       gradientTransform="matrix(0.91711503,0,0,0.91711503,63.562131,186.16072)"
+       gradientUnits="userSpaceOnUse"
+       y2="520.60657"
+       x2="360.2847"
+       y1="544.1178"
+       x1="383.79593"
+       id="linearGradient8314"
+       xlink:href="#linearGradient8308-6"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8308-6">
+      <stop
+         style="stop-color:#0c1e2d;stop-opacity:1"
+         offset="0"
+         id="stop8310-7" />
+      <stop
+         id="stop8351-5"
+         offset="0.5"
+         style="stop-color:#4696db;stop-opacity:1" />
+      <stop
+         style="stop-color:#c3ddf3;stop-opacity:1"
+         offset="1"
+         id="stop8312-3" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="9.9602376"
+     inkscape:cx="-84.022158"
+     inkscape:cy="27.429546"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8238">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-393.51587,-663.14807)">
+    <g
+       id="layer1-3"
+       inkscape:label="Layer 1">
+      <rect
+         y="663.61682"
+         x="393.98462"
+         height="21.5625"
+         width="21.5625"
+         id="rect8276-5"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8314);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    </g>
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499988;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9022"
+       width="1.8749999"
+       height="1.8749999"
+       x="396.32837"
+       y="665.96057" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9051-5"
+       width="3.7499995"
+       height="3.7499995"
+       x="401.95337"
+       y="672.52307" />
+    <rect
+       y="673.46057"
+       x="402.89087"
+       height="1.8749999"
+       width="1.8749999"
+       id="rect9024"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499988;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9051-9"
+       width="3.7499995"
+       height="3.7499995"
+       x="396.32837"
+       y="676.27307" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499988;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9026"
+       width="1.8749999"
+       height="1.8749999"
+       x="397.26587"
+       y="677.21057" />
+    <rect
+       y="681.89807"
+       x="411.32837"
+       height="1.8749999"
+       width="1.8749999"
+       id="rect9028"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499988;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9051-6"
+       width="3.7499995"
+       height="3.7499995"
+       x="406.64087"
+       y="675.33557" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9022-7"
+       width="1.8749998"
+       height="1.8749998"
+       x="407.57837"
+       y="676.27307" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9051-3"
+       width="3.7499995"
+       height="3.7499995"
+       x="405.70337"
+       y="664.08557" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9022-5"
+       width="1.8749998"
+       height="1.8749998"
+       x="406.64087"
+       y="665.02307" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_distance-24.svg b/pixmaps/src/gwy_distance-24.svg
new file mode 100644
index 0000000..db48310
--- /dev/null
+++ b/pixmaps/src/gwy_distance-24.svg
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8494"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   inkscape:export-filename="gwy_distance-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96"
+   sodipodi:docname="gwy_distance-24.svg">
+  <defs
+     id="defs8496" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.5383583"
+     inkscape:cx="34.239213"
+     inkscape:cy="19.53056"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8499">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1028.3622)">
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8161"
+       d="m 4.5,1045.9872 5,-11.25"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <g
+       transform="translate(23.97312,-17.1031)"
+       id="g8186">
+      <path
+         sodipodi:nodetypes="cc"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m -12.97312,1045.4653 v 6"
+         id="path8192"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m -15.97312,1048.4653 h 6.00001"
+         id="path8194"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cc" />
+    </g>
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect12874-3"
+       width="5.9999995"
+       height="22"
+       x="16.500149"
+       y="1028.8622" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 16.99999,1036.8623 3,0"
+       id="path12876-6"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 16.99999,1033.8623 2.00001,0"
+       id="path12880-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path12882-5"
+       d="m 16.99999,1030.8623 3,0"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 16.99999,1045.8623 2.00001,0"
+       id="path12884-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 16.99999,1039.8623 2.00001,0"
+       id="path12890-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path12892-6"
+       d="m 16.99999,1042.8623 3,0"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 16.99999,1048.8623 3,0"
+       id="path8091-2"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g4769"
+       transform="translate(15.97311,0.8969)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4765"
+         d="m -12.97312,1045.4653 v 6"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="cc" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path4767"
+         d="m -15.97312,1048.4653 h 6.00001"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_distance_transform-24.svg b/pixmaps/src/gwy_distance_transform-24.svg
new file mode 100644
index 0000000..d440403
--- /dev/null
+++ b/pixmaps/src/gwy_distance_transform-24.svg
@@ -0,0 +1,235 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92+devel unknown"
+   sodipodi:docname="gwy_distance_transform-24.svg">
+  <defs
+     id="defs8426">
+    <linearGradient
+       id="linearGradient8308-6-6"
+       inkscape:collect="always">
+      <stop
+         id="stop8310-7-7"
+         offset="0"
+         style="stop-color:#0c1e2d;stop-opacity:1" />
+      <stop
+         style="stop-color:#4696db;stop-opacity:1"
+         offset="0.5"
+         id="stop8351-5-5" />
+      <stop
+         id="stop8312-3-3"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(-138.33165,-613.34668)"
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308-6-6"
+       id="linearGradient4901-5"
+       x1="137.12454"
+       y1="614.84668"
+       x2="152.53876"
+       y2="614.84668"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308-6-6"
+       id="linearGradient4990"
+       gradientUnits="userSpaceOnUse"
+       x1="141.83165"
+       y1="623.84668"
+       x2="141.83165"
+       y2="627.34668"
+       gradientTransform="translate(2)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308-6-6"
+       id="linearGradient4992"
+       gradientUnits="userSpaceOnUse"
+       x1="141.83165"
+       y1="621.34668"
+       x2="138.33165"
+       y2="621.34668"
+       gradientTransform="translate(2)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308-6-6"
+       id="linearGradient4996"
+       gradientUnits="userSpaceOnUse"
+       x1="141.83165"
+       y1="620.34668"
+       x2="145.33165"
+       y2="620.34668"
+       gradientTransform="translate(2)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308-6-6"
+       id="linearGradient4996-3"
+       gradientUnits="userSpaceOnUse"
+       x1="141.83165"
+       y1="620.34668"
+       x2="145.33165"
+       y2="620.34668"
+       gradientTransform="translate(-141.83165,-614.84668)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308-6-6"
+       id="linearGradient5051"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(2)"
+       x1="145.83165"
+       y1="610.84668"
+       x2="149.33165"
+       y2="610.84668" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308-6-6"
+       id="linearGradient5065"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(2)"
+       x1="144.33165"
+       y1="612.84668"
+       x2="144.33165"
+       y2="609.34668" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308-6-6"
+       id="linearGradient5079"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(2)"
+       x1="143.83165"
+       y1="613.84668"
+       x2="141.33165"
+       y2="610.34668" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308-6-6"
+       id="linearGradient5093"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(2)"
+       x1="143.43417"
+       y1="612.02875"
+       x2="147.33165"
+       y2="615.34668" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="18.687497"
+     inkscape:cx="23.058564"
+     inkscape:cy="13.77322"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1149"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     inkscape:document-rotation="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid1px"
+       originx="0"
+       originy="0"
+       dotted="false"
+       snapvisiblegridlinesonly="false"
+       spacingx="0.5"
+       spacingy="0.5"
+       enabled="true"
+       visible="true"
+       units="px"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <path
+       style="opacity:1;vector-effect:none;fill:url(#linearGradient4992);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 143.83165,615.34668 v 8.5 l -4,4 v -16 z"
+       id="path4930"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="opacity:1;vector-effect:none;fill:url(#linearGradient4990);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 139.83165,627.84668 4,-4 4,4 z"
+       id="path4966"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:#c1665a;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;opacity:1;vector-effect:none;fill-opacity:1;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;marker:none;marker-start:none;marker-mid:none;marker-end:none"
+       d="m 128.83165,607.84668 v 16 h 8 v -10 l 4,-5 v -4 h -7 z"
+       id="path5000"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccc" />
+    <path
+       style="opacity:1;vector-effect:none;fill:url(#linearGradient5051);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 151.83165,608.84668 -2.5,2 2.5,2 z"
+       id="path5024"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="opacity:1;vector-effect:none;fill:url(#linearGradient5065);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 144.83165,608.84668 2,3.5 2.5,-1.5 2.5,-2 z"
+       id="path5053"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="opacity:1;vector-effect:none;fill:url(#linearGradient5079);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 139.83165,611.84668 4,3.5 0.5,-1 2.5,-2 -2,-3.5 z"
+       id="path5067"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="opacity:1;vector-effect:none;fill:url(#linearGradient5093);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 147.83165,617.84668 -3.5,-3.5 2.5,-2 2.5,-1.5 2.5,2 z"
+       id="path5081"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="opacity:1;vector-effect:none;fill:url(#linearGradient4996);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 147.83165,627.84668 -4,-4 v -8.5 l 0.5,-1 3.5,3.5 z"
+       id="path4978"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       sodipodi:nodetypes="cccccccc"
+       inkscape:connector-curvature="0"
+       id="use5006"
+       d="m 139.83165,611.84668 v 16 h 8 v -10 l 4,-5 v -4 h -7 z"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_distribution_angle-24.svg b/pixmaps/src/gwy_distribution_angle-24.svg
new file mode 100644
index 0000000..9cf517b
--- /dev/null
+++ b/pixmaps/src/gwy_distribution_angle-24.svg
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_distribution_angle-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689">
+    <linearGradient
+       gradientTransform="matrix(0.91711503,0,0,0.91711503,63.562131,186.16072)"
+       gradientUnits="userSpaceOnUse"
+       y2="520.60657"
+       x2="360.2847"
+       y1="544.1178"
+       x1="383.79593"
+       id="linearGradient8314"
+       xlink:href="#linearGradient8308-6"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8308-6">
+      <stop
+         style="stop-color:#0c1e2d;stop-opacity:1"
+         offset="0"
+         id="stop8310-7" />
+      <stop
+         id="stop8351-5"
+         offset="0.5"
+         style="stop-color:#4696db;stop-opacity:1" />
+      <stop
+         style="stop-color:#c3ddf3;stop-opacity:1"
+         offset="1"
+         id="stop8312-3" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="18.003839"
+     inkscape:cx="-20.309943"
+     inkscape:cy="31.170829"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 330.29821,671.57531 c -1.00099,-0.16447 -2.91976,-4.53691 -4.06525,-5.91207 -0.73824,-0.13896 -2.77292,5.78518 -3.71772,5.19574 -3.92805,-1.66584 -2.92828,-10.98586 -4.29773,-10.88204 -6.71328,5.23951 -5.46817,-6.49737 -7.64906,-7.02272 -2.23764,-0.53902 -2.23464,7.71431 -3.12715,10.44175 -0.11895,0.2631 -0.25043,0.56457 -0.52433,0.69992"
+       id="path8447"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccscc" />
+    <g
+       transform="matrix(0.32463768,0,0,0.32463768,178.89597,449.64029)"
+       id="layer1-6"
+       inkscape:label="Layer 1"
+       style="stroke-width:3.28571439">
+      <rect
+         y="663.61682"
+         x="393.98462"
+         height="21.5625"
+         width="21.5625"
+         id="rect8276"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8314);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.08035731;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8455"
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 323.67517,653.74133 q 0,0.73731 -0.20019,1.26465 -0.19532,0.52246 -0.55176,0.86426 -0.35156,0.3418 -0.83496,0.51758 -0.4834,0.1709 -1.05469,0.20019 v 1.98731 h -1.16211 v -1.97754 q -0.59082,-0.0244 -1.06934,-0.2002 -0.47363,-0.17578 -0.81054,-0.51269 -0.33203,-0.33692 -0.5127,-0.84473 -0.18066,-0.50781 -0.18066,-1.19629 0,-0.64941 0.14648,-1.12793 0.14649,-0.47851 0.42481,-0.80566 0.27832,-0.33203 0.68359,-0.52735 0.41016,-0.19531 0.9375,-0.2832 l 0.10254,0.87402 q -0.24902, [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path8457"
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 329.02185,653.56798 q 0,1.86035 -0.58594,2.76856 -0.58593,0.9082 -1.69922,0.9082 -0.52734,0 -0.94726,-0.22461 -0.41504,-0.22461 -0.70313,-0.67871 -0.28808,-0.4541 -0.43945,-1.14258 -0.15137,-0.69336 -0.15137,-1.63086 0,-1.82617 0.56641,-2.74414 0.57129,-0.91797 1.7041,-0.91797 0.59082,0 1.01563,0.22949 0.42968,0.22461 0.70312,0.6836 0.27344,0.45898 0.40527,1.14746 0.13184,0.68359 0.13184,1.60156 z m -2.28027,2.78809 q 0.19043,0 0.35644,-0.11231 0.16602,-0.11719 0.29297,-0.385 [...]
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_distribution_slope-24.svg b/pixmaps/src/gwy_distribution_slope-24.svg
new file mode 100644
index 0000000..7f24dad
--- /dev/null
+++ b/pixmaps/src/gwy_distribution_slope-24.svg
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_distribution_slope-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689">
+    <linearGradient
+       gradientTransform="matrix(0.91711503,0,0,0.91711503,63.562131,186.16072)"
+       gradientUnits="userSpaceOnUse"
+       y2="520.60657"
+       x2="360.2847"
+       y1="544.1178"
+       x1="383.79593"
+       id="linearGradient8314"
+       xlink:href="#linearGradient8308-6"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8308-6">
+      <stop
+         style="stop-color:#0c1e2d;stop-opacity:1"
+         offset="0"
+         id="stop8310-7" />
+      <stop
+         id="stop8351-5"
+         offset="0.5"
+         style="stop-color:#4696db;stop-opacity:1" />
+      <stop
+         style="stop-color:#c3ddf3;stop-opacity:1"
+         offset="1"
+         id="stop8312-3" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="9.0558014"
+     inkscape:cx="-50.818021"
+     inkscape:cy="73.40106"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 330.29821,671.57531 c -1.00099,-0.16447 -2.91976,-4.53691 -4.06525,-5.91207 -0.73824,-0.13896 -2.77292,5.78518 -3.71772,5.19574 -3.92805,-1.66584 -2.92828,-10.98586 -4.29773,-10.88204 -6.71328,5.23951 -5.46817,-6.49737 -7.64906,-7.02272 -2.23764,-0.53902 -2.23464,7.71431 -3.12715,10.44175 -0.11895,0.2631 -0.25043,0.56457 -0.52433,0.69992"
+       id="path8447"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccscc" />
+    <g
+       transform="matrix(0.32463768,0,0,0.32463768,178.89597,449.64029)"
+       id="layer1-6"
+       inkscape:label="Layer 1"
+       style="stroke-width:3.28571439">
+      <rect
+         y="663.61682"
+         x="393.98462"
+         height="21.5625"
+         width="21.5625"
+         id="rect8276"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8314);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.08035731;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    </g>
+    <g
+       aria-label="∇ z"
+       style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:10.23133183px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="text8443">
+      <path
+         d="m 319.63744,654.57144 1.66077,-3.99613 h -3 z m -0.83923,2.00387 -2.5,-7 h 7 l -3,7 z"
+         style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';letter-spacing:-1.59608769px;stroke-width:0.97738993px"
+         id="path8445"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccccc" />
+      <path
+         d="m 327.29821,652.57531 -2.32721,3.01687 2.32721,-0.0169 v 1 h -4 v -1 l 2.5,-3 h -2.5 v -1.03337 l 4,0.0334 z"
+         style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';letter-spacing:-1.59608769px;stroke-width:0.97738993px"
+         id="path8448"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccccccc" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_drift-96.svg b/pixmaps/src/gwy_drift-96.svg
new file mode 100644
index 0000000..e6f58f3
--- /dev/null
+++ b/pixmaps/src/gwy_drift-96.svg
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="6.3499999mm"
+   height="6.3499999mm"
+   viewBox="0 0 22.499999 22.499999"
+   id="svg8233"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_drift-24.svg"
+   inkscape:export-filename="gwy_drift-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8235">
+    <meshgradient
+       inkscape:collect="always"
+       id="meshgradient32017"
+       gradientUnits="userSpaceOnUse"
+       x="393.98462"
+       y="662.17932"
+       gradientTransform="matrix(0.93749992,0,0,0.93749992,24.624072,42.823765)">
+      <meshrow
+         id="meshrow36807">
+        <meshpatch
+           id="meshpatch36809">
+          <stop
+             path="c 0.766667,0  1.53333,0  2.3,0"
+             style="stop-color:#0c1e2d;stop-opacity:1"
+             id="stop36811" />
+          <stop
+             path="c -2.83718,7.99404  4.7144,15.006  0,23"
+             style="stop-color:#4696db;stop-opacity:1"
+             id="stop36813" />
+          <stop
+             path="c -0.766667,0  -1.53333,0  -2.3,0"
+             style="stop-color:#4696db;stop-opacity:1"
+             id="stop36815" />
+          <stop
+             path="c 0,-7.66667  0,-15.3333  0,-23"
+             style="stop-color:#0c1e2d;stop-opacity:1"
+             id="stop36817" />
+        </meshpatch>
+        <meshpatch
+           id="meshpatch36819">
+          <stop
+             path="c 0.766667,0  1.53333,0  2.3,0"
+             id="stop36821" />
+          <stop
+             path="c -4.51214,7.84634  5.65356,14.8968  0,23"
+             style="stop-color:#c3ddf3;stop-opacity:1"
+             id="stop36823" />
+          <stop
+             path="c -0.766667,0  -1.53333,0  -2.3,0"
+             style="stop-color:#c3ddf3;stop-opacity:1"
+             id="stop36825" />
+        </meshpatch>
+        <meshpatch
+           id="meshpatch36827">
+          <stop
+             path="c 0.766667,0  1.53333,0  2.3,0"
+             id="stop36829" />
+          <stop
+             path="c -6.65336,7.85239  5.73074,14.9899  0,23"
+             style="stop-color:#4696db;stop-opacity:1"
+             id="stop36831" />
+          <stop
+             path="c -0.766667,0  -1.53333,0  -2.3,0"
+             style="stop-color:#4696db;stop-opacity:1"
+             id="stop36833" />
+        </meshpatch>
+        <meshpatch
+           id="meshpatch36835">
+          <stop
+             path="c 0.766667,0  1.53333,0  2.3,0"
+             id="stop36837" />
+          <stop
+             path="c -8.81388,7.76529  6.09507,15.0285  0,23"
+             style="stop-color:#0c1e2d;stop-opacity:1"
+             id="stop36839" />
+          <stop
+             path="c -0.766667,0  -1.53333,0  -2.3,0"
+             style="stop-color:#0c1e2d;stop-opacity:1"
+             id="stop36841" />
+        </meshpatch>
+        <meshpatch
+           id="meshpatch36843">
+          <stop
+             path="c 0.766667,0  1.53333,0  2.3,0"
+             id="stop36845" />
+          <stop
+             path="c -8.55581,8.18968  5.80241,15.0632  0,23"
+             style="stop-color:#4696db;stop-opacity:1"
+             id="stop36847" />
+          <stop
+             path="c -0.766667,0  -1.53333,0  -2.3,0"
+             style="stop-color:#4696db;stop-opacity:1"
+             id="stop36849" />
+        </meshpatch>
+        <meshpatch
+           id="meshpatch36851">
+          <stop
+             path="c 0.766667,0  1.53333,0  2.3,0"
+             id="stop36853" />
+          <stop
+             path="c -8.52886,8.39856  5.87683,15.481  0,23"
+             style="stop-color:#c3ddf3;stop-opacity:1"
+             id="stop36855" />
+          <stop
+             path="c -0.766667,0  -1.53333,0  -2.3,0"
+             style="stop-color:#c3ddf3;stop-opacity:1"
+             id="stop36857" />
+        </meshpatch>
+        <meshpatch
+           id="meshpatch36859">
+          <stop
+             path="c 0.766667,0  1.53333,0  2.3,0"
+             id="stop36861" />
+          <stop
+             path="c -7.84103,8.29219  4.80319,15.4105  0,23"
+             style="stop-color:#4696db;stop-opacity:1"
+             id="stop36863" />
+          <stop
+             path="c -0.766667,0  -1.53333,0  -2.3,0"
+             style="stop-color:#4696db;stop-opacity:1"
+             id="stop36865" />
+        </meshpatch>
+        <meshpatch
+           id="meshpatch36867">
+          <stop
+             path="c 0.766667,0  1.53333,0  2.3,0"
+             id="stop36869" />
+          <stop
+             path="c -8.06316,8.31752  4.75411,15.3014  0,23"
+             style="stop-color:#0c1e2d;stop-opacity:1"
+             id="stop36871" />
+          <stop
+             path="c -0.766667,0  -1.53333,0  -2.3,0"
+             style="stop-color:#0c1e2d;stop-opacity:1"
+             id="stop36873" />
+        </meshpatch>
+        <meshpatch
+           id="meshpatch36875">
+          <stop
+             path="c 0.766667,0  1.53333,0  2.3,0"
+             id="stop36877" />
+          <stop
+             path="c -7.63602,8.28008  2.66915,15.4011  0,23"
+             style="stop-color:#4696db;stop-opacity:1"
+             id="stop36879" />
+          <stop
+             path="c -0.766667,0  -1.53333,0  -2.3,0"
+             style="stop-color:#4696db;stop-opacity:1"
+             id="stop36881" />
+        </meshpatch>
+        <meshpatch
+           id="meshpatch36883">
+          <stop
+             path="c 0.766667,0  1.53333,0  2.3,0"
+             id="stop36885" />
+          <stop
+             path="c 0,7.66667  0,15.3333  0,23"
+             style="stop-color:#c3ddf3;stop-opacity:1"
+             id="stop36887" />
+          <stop
+             path="c -0.766667,0  -1.53333,0  -2.3,0"
+             style="stop-color:#c3ddf3;stop-opacity:1"
+             id="stop36889" />
+        </meshpatch>
+      </meshrow>
+    </meshgradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="20.004599"
+     inkscape:cx="11.200356"
+     inkscape:cy="13.704729"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata8238">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-393.51587,-663.14807)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#meshgradient32017);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8276"
+       width="21.5625"
+       height="21.5625"
+       x="393.98462"
+       y="663.61682" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_dwt-24.svg b/pixmaps/src/gwy_dwt-24.svg
new file mode 100644
index 0000000..f987b68
--- /dev/null
+++ b/pixmaps/src/gwy_dwt-24.svg
@@ -0,0 +1,1352 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8233"
+     version="1.1"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_dwt-24.svg">
+    <defs
+         id="defs8235">
+        <circle
+             stroke-width="0.5"
+             r="0.5"
+             id="gpDot" />
+        <path
+             d="M-1,0 h2 M0,-1 v2"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt0" />
+        <path
+             d="M-1,-1 L1,1 M1,-1 L-1,1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt1" />
+        <path
+             d="M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt2" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt3" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             fill="currentColor"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt4" />
+        <circle
+             r="1"
+             cy="0"
+             cx="0"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt5" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt6"
+             xlink:href="#gpPt5" />
+        <path
+             d="M0,-1.33 L-1.33,0.67 L1.33,0.67 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt7" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt8"
+             xlink:href="#gpPt7" />
+        <use
+             transform="rotate(180)"
+             stroke="currentColor"
+             id="gpPt9"
+             xlink:href="#gpPt7" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt10"
+             xlink:href="#gpPt9" />
+        <use
+             transform="rotate(45)"
+             stroke="currentColor"
+             id="gpPt11"
+             xlink:href="#gpPt3" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt12"
+             xlink:href="#gpPt11" />
+        <path
+             d="M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt13" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt14"
+             xlink:href="#gpPt13" />
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="textbox">
+            <feFlood
+                 id="feFlood4495"
+                 result="bgnd"
+                 flood-opacity="1"
+                 flood-color="white" />
+            <feComposite
+                 id="feComposite4497"
+                 operator="atop"
+                 in2="bgnd"
+                 in="SourceGraphic" />
+        </filter>
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="greybox">
+            <feFlood
+                 id="feFlood4500"
+                 result="grey"
+                 flood-opacity="1"
+                 flood-color="lightgrey" />
+            <feComposite
+                 id="feComposite4502"
+                 operator="atop"
+                 in2="grey"
+                 in="SourceGraphic" />
+        </filter>
+        <circle
+             stroke-width="0.5"
+             r="0.5"
+             id="gpDot-4" />
+        <path
+             d="M-1,0 h2 M0,-1 v2"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt0-5" />
+        <path
+             d="M-1,-1 L1,1 M1,-1 L-1,1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt1-2" />
+        <path
+             d="M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt2-5" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt3-9" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             fill="currentColor"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt4-3" />
+        <circle
+             r="1"
+             cy="0"
+             cx="0"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt5-8" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt6-8"
+             xlink:href="#gpPt5-8" />
+        <path
+             d="M0,-1.33 L-1.33,0.67 L1.33,0.67 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt7-4" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt8-3"
+             xlink:href="#gpPt7-4" />
+        <use
+             transform="rotate(180)"
+             stroke="currentColor"
+             id="gpPt9-5"
+             xlink:href="#gpPt7-4" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt10-0"
+             xlink:href="#gpPt9-5" />
+        <use
+             transform="rotate(45)"
+             stroke="currentColor"
+             id="gpPt11-5"
+             xlink:href="#gpPt3-9" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt12-9"
+             xlink:href="#gpPt11-5" />
+        <path
+             d="M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt13-3" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt14-4"
+             xlink:href="#gpPt13-3" />
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="textbox-6">
+            <feFlood
+                 id="feFlood4756"
+                 result="bgnd"
+                 flood-opacity="1"
+                 flood-color="white" />
+            <feComposite
+                 id="feComposite4758"
+                 operator="atop"
+                 in2="bgnd"
+                 in="SourceGraphic" />
+        </filter>
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="greybox-2">
+            <feFlood
+                 id="feFlood4761"
+                 result="grey"
+                 flood-opacity="1"
+                 flood-color="lightgrey" />
+            <feComposite
+                 id="feComposite4763"
+                 operator="atop"
+                 in2="grey"
+                 in="SourceGraphic" />
+        </filter>
+        <circle
+             stroke-width="0.5"
+             r="0.5"
+             id="gpDot-5" />
+        <path
+             d="M-1,0 h2 M0,-1 v2"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt0-3" />
+        <path
+             d="M-1,-1 L1,1 M1,-1 L-1,1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt1-20" />
+        <path
+             d="M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt2-0" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt3-0" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             fill="currentColor"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt4-9" />
+        <circle
+             r="1"
+             cy="0"
+             cx="0"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt5-80" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt6-9"
+             xlink:href="#gpPt5-80" />
+        <path
+             d="M0,-1.33 L-1.33,0.67 L1.33,0.67 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt7-6" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt8-7"
+             xlink:href="#gpPt7-6" />
+        <use
+             transform="rotate(180)"
+             stroke="currentColor"
+             id="gpPt9-2"
+             xlink:href="#gpPt7-6" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt10-1"
+             xlink:href="#gpPt9-2" />
+        <use
+             transform="rotate(45)"
+             stroke="currentColor"
+             id="gpPt11-4"
+             xlink:href="#gpPt3-0" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt12-4"
+             xlink:href="#gpPt11-4" />
+        <path
+             d="M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt13-8" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt14-49"
+             xlink:href="#gpPt13-8" />
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="textbox-8">
+            <feFlood
+                 id="feFlood5017"
+                 result="bgnd"
+                 flood-opacity="1"
+                 flood-color="white" />
+            <feComposite
+                 id="feComposite5019"
+                 operator="atop"
+                 in2="bgnd"
+                 in="SourceGraphic" />
+        </filter>
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="greybox-4">
+            <feFlood
+                 id="feFlood5022"
+                 result="grey"
+                 flood-opacity="1"
+                 flood-color="lightgrey" />
+            <feComposite
+                 id="feComposite5024"
+                 operator="atop"
+                 in2="grey"
+                 in="SourceGraphic" />
+        </filter>
+        <defs
+             id="defs5027">
+            <circle
+                 cy="0"
+                 cx="0"
+                 id="circle5089"
+                 r="0.5"
+                 stroke-width="0.5" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path5091"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,0 H 1 M 0,-1 v 2" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path5093"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,-1 1,1 M 1,-1 -1,1" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path5095"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,0 H 1 M 0,-1 v 2 m -1,-2 2,2 m -2,0 2,-2" />
+            <rect
+                 id="rect5097"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 x="-1"
+                 y="-1"
+                 width="2"
+                 height="2" />
+            <rect
+                 id="rect5099"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 fill="currentColor"
+                 x="-1"
+                 y="-1"
+                 width="2"
+                 height="2" />
+            <circle
+                 id="circle5101"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 cx="0"
+                 cy="0"
+                 r="1" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt5-80"
+                 id="use5103"
+                 fill="currentColor"
+                 stroke="none" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path5105"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="m 0,-1.33 -1.33,2 h 2.66 z" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt7-6"
+                 id="use5107"
+                 fill="currentColor"
+                 stroke="none" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt7-6"
+                 id="use5109"
+                 stroke="currentColor"
+                 transform="scale(-1)" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt9-2"
+                 id="use5111"
+                 fill="currentColor"
+                 stroke="none" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt3-0"
+                 id="use5113"
+                 stroke="currentColor"
+                 transform="rotate(45)" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt11-4"
+                 id="use5115"
+                 fill="currentColor"
+                 stroke="none" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path5117"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M 0,1.33 1.265,0.411 0.782,-1.067 -0.782,-1.076 -1.265,0.411 Z" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt13-8"
+                 id="use5119"
+                 fill="currentColor"
+                 stroke="none" />
+            <filter
+                 id="filter5125"
+                 filterUnits="objectBoundingBox"
+                 x="0"
+                 y="0"
+                 height="1"
+                 width="1">
+                <feFlood
+                     flood-color="white"
+                     flood-opacity="1"
+                     result="bgnd"
+                     id="feFlood5121" />
+                <feComposite
+                     in="SourceGraphic"
+                     in2="bgnd"
+                     operator="atop"
+                     id="feComposite5123" />
+            </filter>
+            <filter
+                 id="filter5131"
+                 filterUnits="objectBoundingBox"
+                 x="0"
+                 y="0"
+                 height="1"
+                 width="1">
+                <feFlood
+                     flood-color="lightgrey"
+                     flood-opacity="1"
+                     result="grey"
+                     id="feFlood5127" />
+                <feComposite
+                     in="SourceGraphic"
+                     in2="grey"
+                     operator="atop"
+                     id="feComposite5129" />
+            </filter>
+        </defs>
+        <circle
+             stroke-width="0.5"
+             r="0.5"
+             id="gpDot-41" />
+        <path
+             d="M-1,0 h2 M0,-1 v2"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt0-9" />
+        <path
+             d="M-1,-1 L1,1 M1,-1 L-1,1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt1-6" />
+        <path
+             d="M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt2-8" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt3-09" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             fill="currentColor"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt4-36" />
+        <circle
+             r="1"
+             cy="0"
+             cx="0"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt5-3" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt6-89"
+             xlink:href="#gpPt5-3" />
+        <path
+             d="M0,-1.33 L-1.33,0.67 L1.33,0.67 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt7-5" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt8-0"
+             xlink:href="#gpPt7-5" />
+        <use
+             transform="rotate(180)"
+             stroke="currentColor"
+             id="gpPt9-1"
+             xlink:href="#gpPt7-5" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt10-7"
+             xlink:href="#gpPt9-1" />
+        <use
+             transform="rotate(45)"
+             stroke="currentColor"
+             id="gpPt11-1"
+             xlink:href="#gpPt3-09" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt12-98"
+             xlink:href="#gpPt11-1" />
+        <path
+             d="M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt13-2" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt14-6"
+             xlink:href="#gpPt13-2" />
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="textbox-7">
+            <feFlood
+                 id="feFlood6613"
+                 result="bgnd"
+                 flood-opacity="1"
+                 flood-color="white" />
+            <feComposite
+                 id="feComposite6615"
+                 operator="atop"
+                 in2="bgnd"
+                 in="SourceGraphic" />
+        </filter>
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="greybox-5">
+            <feFlood
+                 id="feFlood6618"
+                 result="grey"
+                 flood-opacity="1"
+                 flood-color="lightgrey" />
+            <feComposite
+                 id="feComposite6620"
+                 operator="atop"
+                 in2="grey"
+                 in="SourceGraphic" />
+        </filter>
+        <defs
+             id="defs6623">
+            <circle
+                 cy="0"
+                 cx="0"
+                 id="circle6685"
+                 r="0.5"
+                 stroke-width="0.5" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path6687"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,0 H 1 M 0,-1 v 2" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path6689"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,-1 1,1 M 1,-1 -1,1" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path6691"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,0 H 1 M 0,-1 v 2 m -1,-2 2,2 m -2,0 2,-2" />
+            <rect
+                 id="rect6693"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 x="-1"
+                 y="-1"
+                 width="2"
+                 height="2" />
+            <rect
+                 id="rect6695"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 fill="currentColor"
+                 x="-1"
+                 y="-1"
+                 width="2"
+                 height="2" />
+            <circle
+                 id="circle6697"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 cx="0"
+                 cy="0"
+                 r="1" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt5-3"
+                 id="use6699"
+                 fill="currentColor"
+                 stroke="none" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path6701"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="m 0,-1.33 -1.33,2 h 2.66 z" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt7-5"
+                 id="use6703"
+                 fill="currentColor"
+                 stroke="none" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt7-5"
+                 id="use6705"
+                 stroke="currentColor"
+                 transform="scale(-1)" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt9-1"
+                 id="use6707"
+                 fill="currentColor"
+                 stroke="none" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt3-09"
+                 id="use6709"
+                 stroke="currentColor"
+                 transform="rotate(45)" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt11-1"
+                 id="use6711"
+                 fill="currentColor"
+                 stroke="none" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path6713"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M 0,1.33 1.265,0.411 0.782,-1.067 -0.782,-1.076 -1.265,0.411 Z" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt13-2"
+                 id="use6715"
+                 fill="currentColor"
+                 stroke="none" />
+            <filter
+                 id="filter6721"
+                 filterUnits="objectBoundingBox"
+                 x="0"
+                 y="0"
+                 height="1"
+                 width="1">
+                <feFlood
+                     flood-color="white"
+                     flood-opacity="1"
+                     result="bgnd"
+                     id="feFlood6717" />
+                <feComposite
+                     in="SourceGraphic"
+                     in2="bgnd"
+                     operator="atop"
+                     id="feComposite6719" />
+            </filter>
+            <filter
+                 id="filter6727"
+                 filterUnits="objectBoundingBox"
+                 x="0"
+                 y="0"
+                 height="1"
+                 width="1">
+                <feFlood
+                     flood-color="lightgrey"
+                     flood-opacity="1"
+                     result="grey"
+                     id="feFlood6723" />
+                <feComposite
+                     in="SourceGraphic"
+                     in2="grey"
+                     operator="atop"
+                     id="feComposite6725" />
+            </filter>
+        </defs>
+        <circle
+             stroke-width="0.5"
+             r="0.5"
+             id="gpDot-9" />
+        <path
+             d="M-1,0 h2 M0,-1 v2"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt0-97" />
+        <path
+             d="M-1,-1 L1,1 M1,-1 L-1,1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt1-9" />
+        <path
+             d="M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt2-7" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt3-3" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             fill="currentColor"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt4-5" />
+        <circle
+             r="1"
+             cy="0"
+             cx="0"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt5-0" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt6-4"
+             xlink:href="#gpPt5-0" />
+        <path
+             d="M0,-1.33 L-1.33,0.67 L1.33,0.67 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt7-1" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt8-9"
+             xlink:href="#gpPt7-1" />
+        <use
+             transform="rotate(180)"
+             stroke="currentColor"
+             id="gpPt9-4"
+             xlink:href="#gpPt7-1" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt10-14"
+             xlink:href="#gpPt9-4" />
+        <use
+             transform="rotate(45)"
+             stroke="currentColor"
+             id="gpPt11-3"
+             xlink:href="#gpPt3-3" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt12-6"
+             xlink:href="#gpPt11-3" />
+        <path
+             d="M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt13-4" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt14-2"
+             xlink:href="#gpPt13-4" />
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="textbox-2">
+            <feFlood
+                 id="feFlood6925"
+                 result="bgnd"
+                 flood-opacity="1"
+                 flood-color="white" />
+            <feComposite
+                 id="feComposite6927"
+                 operator="atop"
+                 in2="bgnd"
+                 in="SourceGraphic" />
+        </filter>
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="greybox-7">
+            <feFlood
+                 id="feFlood6930"
+                 result="grey"
+                 flood-opacity="1"
+                 flood-color="lightgrey" />
+            <feComposite
+                 id="feComposite6932"
+                 operator="atop"
+                 in2="grey"
+                 in="SourceGraphic" />
+        </filter>
+        <circle
+             stroke-width="0.5"
+             r="0.5"
+             id="gpDot-8" />
+        <path
+             d="M-1,0 h2 M0,-1 v2"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt0-51" />
+        <path
+             d="M-1,-1 L1,1 M1,-1 L-1,1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt1-1" />
+        <path
+             d="M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt2-3" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt3-06" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             fill="currentColor"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt4-4" />
+        <circle
+             r="1"
+             cy="0"
+             cx="0"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt5-4" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt6-7"
+             xlink:href="#gpPt5-4" />
+        <path
+             d="M0,-1.33 L-1.33,0.67 L1.33,0.67 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt7-53" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt8-8"
+             xlink:href="#gpPt7-53" />
+        <use
+             transform="rotate(180)"
+             stroke="currentColor"
+             id="gpPt9-27"
+             xlink:href="#gpPt7-53" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt10-3"
+             xlink:href="#gpPt9-27" />
+        <use
+             transform="rotate(45)"
+             stroke="currentColor"
+             id="gpPt11-53"
+             xlink:href="#gpPt3-06" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt12-7"
+             xlink:href="#gpPt11-53" />
+        <path
+             d="M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt13-48" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt14-0"
+             xlink:href="#gpPt13-48" />
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="textbox-0">
+            <feFlood
+                 id="feFlood7186"
+                 result="bgnd"
+                 flood-opacity="1"
+                 flood-color="white" />
+            <feComposite
+                 id="feComposite7188"
+                 operator="atop"
+                 in2="bgnd"
+                 in="SourceGraphic" />
+        </filter>
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="greybox-1">
+            <feFlood
+                 id="feFlood7191"
+                 result="grey"
+                 flood-opacity="1"
+                 flood-color="lightgrey" />
+            <feComposite
+                 id="feComposite7193"
+                 operator="atop"
+                 in2="grey"
+                 in="SourceGraphic" />
+        </filter>
+        <defs
+             id="defs7196">
+            <circle
+                 cy="0"
+                 cx="0"
+                 id="circle7258"
+                 r="0.5"
+                 stroke-width="0.5" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path7260"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,0 H 1 M 0,-1 v 2" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path7262"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,-1 1,1 M 1,-1 -1,1" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path7264"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,0 H 1 M 0,-1 v 2 m -1,-2 2,2 m -2,0 2,-2" />
+            <rect
+                 id="rect7266"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 x="-1"
+                 y="-1"
+                 width="2"
+                 height="2" />
+            <rect
+                 id="rect7268"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 fill="currentColor"
+                 x="-1"
+                 y="-1"
+                 width="2"
+                 height="2" />
+            <circle
+                 id="circle7270"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 cx="0"
+                 cy="0"
+                 r="1" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt5-4"
+                 id="use7272"
+                 fill="currentColor"
+                 stroke="none" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path7274"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="m 0,-1.33 -1.33,2 h 2.66 z" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt7-53"
+                 id="use7276"
+                 fill="currentColor"
+                 stroke="none" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt7-53"
+                 id="use7278"
+                 stroke="currentColor"
+                 transform="scale(-1)" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt9-27"
+                 id="use7280"
+                 fill="currentColor"
+                 stroke="none" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt3-06"
+                 id="use7282"
+                 stroke="currentColor"
+                 transform="rotate(45)" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt11-53"
+                 id="use7284"
+                 fill="currentColor"
+                 stroke="none" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path7286"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M 0,1.33 1.265,0.411 0.782,-1.067 -0.782,-1.076 -1.265,0.411 Z" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt13-48"
+                 id="use7288"
+                 fill="currentColor"
+                 stroke="none" />
+            <filter
+                 id="filter7294"
+                 filterUnits="objectBoundingBox"
+                 x="0"
+                 y="0"
+                 height="1"
+                 width="1">
+                <feFlood
+                     flood-color="white"
+                     flood-opacity="1"
+                     result="bgnd"
+                     id="feFlood7290" />
+                <feComposite
+                     in="SourceGraphic"
+                     in2="bgnd"
+                     operator="atop"
+                     id="feComposite7292" />
+            </filter>
+            <filter
+                 id="filter7300"
+                 filterUnits="objectBoundingBox"
+                 x="0"
+                 y="0"
+                 height="1"
+                 width="1">
+                <feFlood
+                     flood-color="lightgrey"
+                     flood-opacity="1"
+                     result="grey"
+                     id="feFlood7296" />
+                <feComposite
+                     in="SourceGraphic"
+                     in2="grey"
+                     operator="atop"
+                     id="feComposite7298" />
+            </filter>
+        </defs>
+    </defs>
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="14.420833"
+         inkscape:cx="12.333892"
+         inkscape:cy="8.4572256"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1379"
+         inkscape:window-height="1023"
+         inkscape:window-x="531"
+         inkscape:window-y="33"
+         inkscape:window-maximized="0"
+         inkscape:snap-object-midpoints="true"
+         inkscape:snap-grids="true"
+         inkscape:document-rotation="0"
+         units="px">
+        <inkscape:grid
+             type="xygrid"
+             id="grid1px"
+             originx="0"
+             originy="0"
+             dotted="false"
+             snapvisiblegridlinesonly="false"
+             spacingx="0.5"
+             spacingy="0.5"
+             enabled="true"
+             visible="true"
+             units="px"
+             empspacing="2" />
+    </sodipodi:namedview>
+    <metadata
+         id="metadata8238">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title />
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-393.51587,-663.14807)">
+        <text
+             id="text4357"
+             y="672.25159"
+             x="413.88821"
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:11.72398472px;line-height:1;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;text-anchor:middle;shape-padding:0;overflow:visible;vector-effect:none;fill:#000000;stroke-width:0.2;paint-order:fill markers stroke;font-var [...]
+             xml:space="preserve"><tspan
+                 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';stroke-width:0.2;font-size:11.72398472px;line-height:1;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;text-indent:0;text-align:c [...]
+                 y="672.25159"
+                 x="413.88821"
+                 id="tspan4355"
+                 sodipodi:role="line">T</tspan></text>
+        <text
+             xml:space="preserve"
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:11.72398472px;line-height:1;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;text-anchor:middle;shape-padding:0;overflow:visible;vector-effect:none;fill:#000000;stroke-width:0.2;paint-order:fill markers stroke;font-var [...]
+             x="405.52057"
+             y="672.25159"
+             id="text4361"><tspan
+                 sodipodi:role="line"
+                 id="tspan4359"
+                 x="405.52057"
+                 y="672.25159"
+                 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';stroke-width:0.2;font-size:11.72398472px;line-height:1;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;text-indent:0;text-align:c [...]
+        <text
+             id="text4365"
+             y="672.25159"
+             x="397.34357"
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:11.72398472px;line-height:1;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;text-anchor:middle;shape-padding:0;overflow:visible;vector-effect:none;fill:#000000;stroke-width:0.2;paint-order:fill markers stroke;font-var [...]
+             xml:space="preserve"><tspan
+                 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';stroke-width:0.2;font-size:11.72398472px;line-height:1;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;text-indent:0;text-align:c [...]
+                 y="672.25159"
+                 x="397.34357"
+                 id="tspan4363"
+                 sodipodi:role="line">D</tspan></text>
+        <path
+             inkscape:connector-curvature="0"
+             stroke="rgb(  0,   0,   0)"
+             d="m 394.16204,679.02094 0.0289,-0.0289 0.0289,-0.01 0.0289,-0.0289 0.029,-0.01 0.0386,-0.01 0.029,-0.0193 0.0289,-0.0193 h 0.0289 l 0.029,-0.01 0.0289,-0.01 0.0289,-0.0193 0.0289,-0.01 0.0386,-0.01 0.029,-0.0193 0.0289,-0.01 h 0.029 0.0289 l 0.029,-0.01 0.0289,-0.01 0.0289,-0.01 0.0386,-0.01 h 0.0289 l 0.029,-0.01 0.0289,-0.0193 0.029,-0.01 0.0289,-0.01 0.029,-0.01 h 0.0289 l 0.0386,-0.01 0.0289,-0.01 0.0289,-0.01 h 0.029 0.0289 0.029 l 0.0289,-0.01 h 0.0289 l 0.0386,-0.01  [...]
+             id="path7206"
+             style="color:#000000;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.39999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;opacity:1" />
+        <path
+             inkscape:connector-curvature="0"
+             stroke="rgb(255,   0,   0)"
+             d="m 394.16204,678.85693 0.0289,-0.0965 0.0289,-0.0675 0.0289,-0.0868 0.029,-0.0289 0.0386,-0.0579 0.029,-0.0772 0.0289,-0.0579 0.0289,-0.01 0.029,-0.0386 0.0289,-0.0482 0.0289,-0.0386 0.0289,-0.0579 0.0386,-0.0482 0.029,-0.0386 0.0289,-0.0482 0.029,0.01 0.0289,-0.0193 0.029,-0.0289 0.0289,-0.029 0.0289,-0.0386 0.0386,-0.029 0.0289,-0.0289 0.029,-0.029 0.0289,-0.0482 0.029,-0.0386 0.0289,-0.0289 0.029,-0.0386 0.0289,-0.0289 0.0386,-0.0386 0.0289,-0.029 0.0289,-0.0386 0.029,0 [...]
+             id="path7213"
+             style="color:#000000;vector-effect:none;fill:none;fill-opacity:1;stroke:#e91616;stroke-width:1.39999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;opacity:1" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_edge-24.svg b/pixmaps/src/gwy_edge-24.svg
new file mode 100644
index 0000000..d90d16b
--- /dev/null
+++ b/pixmaps/src/gwy_edge-24.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_edge-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="39.531323"
+     inkscape:cx="13.939616"
+     inkscape:cy="12.958852"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 197.86205,472.83788 h 23 v 23 h -23 z"
+       id="rect11370"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8153"
+       width="12"
+       height="23"
+       x="209.36205"
+       y="472.83789" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path4911"
+       d="m 197.86205,472.83788 h 23 v 23 h -23 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 204.36205,475.33789 h 10 v 18 h -10 z"
+       id="rect4972"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_enforce_distribution-24.svg b/pixmaps/src/gwy_enforce_distribution-24.svg
new file mode 100644
index 0000000..c2cc38f
--- /dev/null
+++ b/pixmaps/src/gwy_enforce_distribution-24.svg
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_enforce_distribution-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689">
+    <linearGradient
+       gradientTransform="matrix(0.91711503,0,0,0.91711503,63.562131,186.16072)"
+       gradientUnits="userSpaceOnUse"
+       y2="520.60657"
+       x2="360.2847"
+       y1="544.1178"
+       x1="383.79593"
+       id="linearGradient8314"
+       xlink:href="#linearGradient8308-6"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8308-6">
+      <stop
+         style="stop-color:#0c1e2d;stop-opacity:1"
+         offset="0"
+         id="stop8310-7" />
+      <stop
+         id="stop8351-5"
+         offset="0.5"
+         style="stop-color:#4696db;stop-opacity:1" />
+      <stop
+         style="stop-color:#c3ddf3;stop-opacity:1"
+         offset="1"
+         id="stop8312-3" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="15.326213"
+     inkscape:cx="13.039938"
+     inkscape:cy="6.5033545"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 318.16343,664.09589 c -1.78708,-0.45041 -1.80159,-1.39652 -2.34623,-2.49635 -1.14024,-2.30258 -2.037,-12.80231 -2.38337,-11.63845 -2.65966,8.42634 -1.37816,0.55667 -3.89942,3.42243 -1.07858,1.22595 -1.21495,10.10934 -2.61744,10.71237"
+       id="path8447"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cscsc" />
+    <path
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0"
+       id="path8126"
+       d="m 330.06258,671.75715 c -4.13783,-1.00258 -4.45241,-15.46529 -7.73639,-15.27834 -3.38627,-0.52797 -3.41611,13.96132 -7.73638,15.27834"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <g
+       transform="matrix(0.32463768,0,0,0.32463768,178.89597,449.64029)"
+       id="layer1-6"
+       inkscape:label="Layer 1"
+       style="stroke-width:3.28571439">
+      <rect
+         y="663.61682"
+         x="393.98462"
+         height="21.5625"
+         width="21.5625"
+         id="rect8276"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8314);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.08035731;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    </g>
+    <g
+       id="g8451"
+       transform="translate(39.74171,23.40771)"
+       style="fill:#db2424;fill-opacity:1">
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="path8069"
+         d="m 269.56953,635.17774 1.99711,-1.99709 2.99275,2.99275 -1.99709,1.9971 z"
+         style="fill:#db2424;fill-rule:evenodd;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8071"
+         d="m 270.56519,640.1676 5.99131,-5.99131 v 5.99131 z"
+         style="fill:#db2424;fill-rule:evenodd;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_entropy-24.svg b/pixmaps/src/gwy_entropy-24.svg
new file mode 100644
index 0000000..20b5922
--- /dev/null
+++ b/pixmaps/src/gwy_entropy-24.svg
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8239"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_entropy-24.svg">
+  <defs
+     id="defs8241" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="17.525267"
+     inkscape:cx="-24.525089"
+     inkscape:cy="3.4093406"
+     inkscape:document-units="px"
+     inkscape:current-layer="g4871"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8244">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-235.29175,-670.91876)">
+    <g
+       id="g4871"
+       transform="translate(0,-1.0000011)">
+      <rect
+         y="683.41882"
+         x="235.79175"
+         height="2.9999461"
+         width="3"
+         id="rect12632"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4823"
+         d="m 235.29175,679.41876 h 24"
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <g
+         id="g8456">
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 244.79175,683.91876 v 10"
+           id="path4837"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4839"
+           d="m 249.79175,683.91876 v 10"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 249.29175,688.41876 h -4"
+           id="path4841"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path4843"
+           d="m 249.29175,689.41876 h -4"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 250.79175,683.91876 v 10"
+           id="path4845"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4847"
+           d="m 243.79175,683.91876 v 10"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           sodipodi:nodetypes="cc" />
+      </g>
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8458"
+         width="3"
+         height="2.9999461"
+         x="240.79175"
+         y="678.41882" />
+      <rect
+         y="677.41882"
+         x="245.79175"
+         height="2.9999461"
+         width="3"
+         id="rect8460"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8462"
+         width="3"
+         height="2.9999461"
+         x="250.79175"
+         y="677.41882" />
+      <rect
+         y="673.41882"
+         x="255.79175"
+         height="2.9999461"
+         width="3"
+         id="rect8464"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_extend-24.svg b/pixmaps/src/gwy_extend-24.svg
new file mode 100644
index 0000000..5198e46
--- /dev/null
+++ b/pixmaps/src/gwy_extend-24.svg
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 22.5 22.5"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_extend-24.svg"
+   inkscape:export-filename="gwy_scale-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8095">
+    <linearGradient
+       osb:paint="solid"
+       id="linearGradient8428">
+      <stop
+         id="stop8430"
+         offset="0"
+         style="stop-color:#4696db;stop-opacity:1;" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath8428-3-56">
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#eb0000;fill-opacity:0.41158537;fill-rule:evenodd;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8430-6-2"
+         width="92.534042"
+         height="72.344795"
+         x="77.848434"
+         y="-55.845753"
+         transform="matrix(0.51658212,0.85623765,0.85623765,-0.51658212,0,0)" />
+    </clipPath>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="6.3843396"
+     inkscape:cx="49.055092"
+     inkscape:cy="26.275921"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     units="px">
+    <inkscape:grid
+       type="xygrid"
+       id="grid1px"
+       originx="0"
+       originy="0"
+       dotted="false"
+       snapvisiblegridlinesonly="false"
+       spacingx="0.9375"
+       spacingy="0.9375"
+       enabled="true"
+       visible="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77814,-596.57599)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#e1ebd7;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.9375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.93750005, 1.87500010000000006;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect10104-2"
+       width="21.5625"
+       height="21.5625"
+       x="245.24689"
+       y="597.04474" />
+    <path
+       inkscape:connector-curvature="0"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:norma [...]
+       d="m 246.65314,598.45099 v 5.625 l 2.14966,-2.14966 3.75,3.75 1.32568,-1.32751 -3.75,-3.74817 v -0.002 l 2.14966,-2.14783 z"
+       id="path8441" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 249.46564,601.26349 3.75,3.75"
+       id="path8461"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <g
+       transform="matrix(0.9375,0,0,0.9375,56.498442,33.313463)"
+       id="layer1-5"
+       inkscape:label="Layer 1" />
+    <path
+       sodipodi:nodetypes="cccc"
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 252.27814,598.45099 -5.625,5.625 v -5.625 z"
+       id="path8499"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path8451"
+       d="m 246.65314,617.20099 v -5.625 l 2.14966,2.14966 3.75,-3.75 1.32568,1.32751 -3.75,3.74817 v 0.002 l 2.14966,2.14783 z"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:norma [...]
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8429"
+       d="m 249.46564,614.38849 3.75,-3.75"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8431"
+       d="m 252.27814,617.20099 -5.625,-5.625 v 5.625 z"
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cccc" />
+    <path
+       inkscape:connector-curvature="0"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:norma [...]
+       d="m 265.40297,617.20099 h -5.625 l 2.14966,-2.14966 -3.75,-3.75 1.32751,-1.32568 3.74817,3.75 h 0.002 l 2.14783,-2.14966 z"
+       id="path8453" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 262.59064,614.38849 -3.75,-3.75"
+       id="path8433"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cccc"
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 259.77814,617.20099 5.625,-5.625 v 5.625 z"
+       id="path8435"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path8449"
+       d="m 265.40297,598.45099 h -5.625 l 2.14966,2.14966 -3.75,3.75 1.32751,1.32568 3.74817,-3.75 h 0.002 l 2.14783,2.14966 z"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:norma [...]
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8437"
+       d="m 262.59064,601.26349 -3.75,3.75"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8439"
+       d="m 259.77814,598.45099 5.625,5.625 v -5.625 z"
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cccc" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8459"
+       d="m 251.80939,603.60724 h 8.4375 v 8.4375 h -8.4375 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#f8f8f8;stroke-width:2.8125;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.46875;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 251.80939,603.60724 h 8.4375 v 8.4375 h -8.4375 z"
+       id="rect10108-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_extract_path-24.svg b/pixmaps/src/gwy_extract_path-24.svg
new file mode 100644
index 0000000..89bbdff
--- /dev/null
+++ b/pixmaps/src/gwy_extract_path-24.svg
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_extract_path-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689">
+    <marker
+       inkscape:stockid="StopL"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="StopL"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path8658"
+         d="M 0.0,5.65 L 0.0,-5.65"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         transform="scale(0.8)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4.3638912"
+     inkscape:cx="-39.107137"
+     inkscape:cy="18.147819"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <g
+       id="g8886"
+       transform="translate(0,-1.10137)">
+      <g
+         transform="rotate(-90,318.8489,661.12599)"
+         id="g8458">
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 307.29821,668.07531 h 15"
+           id="path8446"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path8448"
+           d="m 307.29821,653.07531 h 15"
+           style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           sodipodi:nodetypes="cc" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path8450"
+           d="m 307.29821,663.07531 h 15"
+           style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 307.29821,658.07531 h 15"
+           id="path8452"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+      </g>
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,669.17667 h 22"
+         id="path8444"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8442"
+         d="m 307.29821,664.17667 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,659.17667 h 22"
+         id="path8440"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       id="g8481"
+       transform="matrix(0,1.8100351,-2.0095856,0,1633.1526,86.575948)"
+       style="stroke-width:0.52432823">
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.09731293;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 313.12992,649.53358 c -4.37265,4.67662 3.04249,5.18704 0,9.64007"
+         id="path8644"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cc" />
+      <path
+         sodipodi:nodetypes="csssc"
+         inkscape:connector-curvature="0"
+         id="path8642"
+         d="m 313.12992,649.53358 c -1.09316,1.16915 -1.44959,2.07792 -1.41686,2.853 0.0327,0.77508 0.4546,1.41648 0.91805,2.05088 0.46345,0.63441 0.96846,1.26183 1.16746,2.00896 0.19899,0.74713 0.092,1.61397 -0.66865,2.72723"
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.04865646;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <path
+       sodipodi:nodetypes="csssc"
+       inkscape:connector-curvature="0"
+       id="path8763"
+       d="m 327.85927,653.35209 c -2.34951,-1.97866 -4.17576,-2.62381 -5.73335,-2.56457 -1.55759,0.0592 -2.84653,0.82284 -4.12142,1.6617 -1.2749,0.83886 -2.53575,1.75295 -4.03717,2.11315 -1.50142,0.36018 -3.24341,0.16652 -5.4806,-1.21028"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-mid:url(#StopL);marker-start:url(#StopL);marker-end:url(#StopL)" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 306.37991,670.58948 c 0,0 4.31186,-1.92581 6.41555,-3.04179 2.3859,-1.26569 4.70477,-2.71122 7.02795,-4.13826 2.11799,-1.301 4.13666,-2.84305 6.2989,-4.03214 1.33669,-0.7351 4.11179,-1.90997 4.11179,-1.90997"
+       id="path8901"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="caaac" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 306.50584,668.43234 c 0,0 5.15855,-6.51902 7.91718,-6.89066 2.91791,-0.3931 5.66335,5.32851 8.58232,5.00405 2.46065,-0.27344 7.09472,-5.81118 7.09472,-5.81118"
+       id="path8899"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="caac" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_facet_level-24.svg b/pixmaps/src/gwy_facet_level-24.svg
new file mode 100644
index 0000000..f4b640b
--- /dev/null
+++ b/pixmaps/src/gwy_facet_level-24.svg
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 22.5 22.499999"
+     id="svg8509"
+     version="1.1"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_facet_level-24.svg"
+     inkscape:export-filename="gwy_facet_level-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <defs
+         id="defs8511">
+        <linearGradient
+             inkscape:collect="always"
+             id="linearGradient916">
+            <stop
+                 style="stop-color:#0c1e2d;stop-opacity:1"
+                 offset="0"
+                 id="stop910" />
+            <stop
+                 id="stop912"
+                 offset="0.5"
+                 style="stop-color:#4696db;stop-opacity:1" />
+            <stop
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1"
+                 id="stop914" />
+        </linearGradient>
+        <linearGradient
+             inkscape:collect="always"
+             id="linearGradient908">
+            <stop
+                 style="stop-color:#0c1e2d;stop-opacity:1"
+                 offset="0"
+                 id="stop902" />
+            <stop
+                 id="stop904"
+                 offset="0.5"
+                 style="stop-color:#4696db;stop-opacity:1" />
+            <stop
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1"
+                 id="stop906" />
+        </linearGradient>
+        <linearGradient
+             inkscape:collect="always"
+             id="linearGradient900">
+            <stop
+                 style="stop-color:#0c1e2d;stop-opacity:1"
+                 offset="0"
+                 id="stop894" />
+            <stop
+                 id="stop896"
+                 offset="0.5"
+                 style="stop-color:#4696db;stop-opacity:1" />
+            <stop
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1"
+                 id="stop898" />
+        </linearGradient>
+        <linearGradient
+             inkscape:collect="always"
+             id="linearGradient892">
+            <stop
+                 style="stop-color:#0c1e2d;stop-opacity:1"
+                 offset="0"
+                 id="stop886" />
+            <stop
+                 id="stop888"
+                 offset="0.5"
+                 style="stop-color:#4696db;stop-opacity:1" />
+            <stop
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1"
+                 id="stop890" />
+        </linearGradient>
+        <linearGradient
+             inkscape:collect="always"
+             id="linearGradient859">
+            <stop
+                 style="stop-color:#0c1e2d;stop-opacity:1"
+                 offset="0"
+                 id="stop853" />
+            <stop
+                 id="stop855"
+                 offset="0.5"
+                 style="stop-color:#4696db;stop-opacity:1" />
+            <stop
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1"
+                 id="stop857" />
+        </linearGradient>
+        <linearGradient
+             gradientTransform="matrix(-0.9375076,0,0,0.93750259,682.64548,4.9957464)"
+             inkscape:collect="always"
+             xlink:href="#linearGradient916"
+             id="linearGradient8668"
+             x1="375.73077"
+             y1="536.55804"
+             x2="383.08414"
+             y2="529.2876"
+             gradientUnits="userSpaceOnUse" />
+        <linearGradient
+             id="linearGradient8308"
+             inkscape:collect="always">
+            <stop
+                 id="stop8310"
+                 offset="0"
+                 style="stop-color:#0c1e2d;stop-opacity:1" />
+            <stop
+                 style="stop-color:#4696db;stop-opacity:1"
+                 offset="0.5"
+                 id="stop8351" />
+            <stop
+                 id="stop8312"
+                 offset="1"
+                 style="stop-color:#ffffff;stop-opacity:1" />
+        </linearGradient>
+        <linearGradient
+             gradientTransform="matrix(-0.9375076,0,0,0.93750259,682.64548,4.9957464)"
+             inkscape:collect="always"
+             xlink:href="#linearGradient8308"
+             id="linearGradient8688"
+             x1="377.00833"
+             y1="527.06122"
+             x2="382.4537"
+             y2="521.64996"
+             gradientUnits="userSpaceOnUse" />
+        <linearGradient
+             gradientTransform="matrix(-0.9375076,0,0,0.93750259,682.64548,4.9957464)"
+             inkscape:collect="always"
+             xlink:href="#linearGradient900"
+             id="linearGradient8660"
+             x1="369.80258"
+             y1="530.41608"
+             x2="374.7659"
+             y2="525.23682"
+             gradientUnits="userSpaceOnUse" />
+        <linearGradient
+             gradientTransform="matrix(-0.9375076,0,0,0.93750259,682.64548,4.9957464)"
+             inkscape:collect="always"
+             xlink:href="#linearGradient908"
+             id="linearGradient8652"
+             x1="360.47513"
+             y1="529.16833"
+             x2="368.6232"
+             y2="522.23163"
+             gradientUnits="userSpaceOnUse" />
+        <linearGradient
+             gradientTransform="matrix(-0.9375076,0,0,0.93750259,682.64548,4.9957464)"
+             inkscape:collect="always"
+             xlink:href="#linearGradient892"
+             id="linearGradient8644"
+             x1="358.22925"
+             y1="538.68414"
+             x2="369.73535"
+             y2="530.46136"
+             gradientUnits="userSpaceOnUse" />
+        <linearGradient
+             gradientTransform="matrix(-0.9375076,0,0,0.93750259,682.64548,4.9957464)"
+             inkscape:collect="always"
+             xlink:href="#linearGradient859"
+             id="linearGradient8339"
+             x1="369.86865"
+             y1="543.72437"
+             x2="377.40475"
+             y2="538.67938"
+             gradientUnits="userSpaceOnUse" />
+    </defs>
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="12.06387"
+         inkscape:cx="-0.43782614"
+         inkscape:cy="10.764537"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="false"
+         inkscape:window-width="1644"
+         inkscape:window-height="1023"
+         inkscape:window-x="266"
+         inkscape:window-y="33"
+         inkscape:window-maximized="0"
+         units="px"
+         inkscape:document-rotation="0"
+         inkscape:snap-global="false" />
+    <metadata
+         id="metadata8514">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title />
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-322.60477,-492.8367)">
+        <path
+             style="fill:url(#linearGradient8339);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 343.09707,514.58958 c -0.60704,-0.23346 -5.18315,-4.06244 -5.6034,-4.66946 -0.42026,-0.60703 -3.3739,-5.50639 -3.3739,-5.50639 0,0 -3.53695,1.58404 -4.19069,1.91089 -0.65372,0.32687 -3.31533,4.3893 -3.5955,5.13642 -0.28017,0.74712 -0.70042,3.03515 -0.70042,3.03515 z"
+             id="path8319"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="cscsccc" />
+        <path
+             style="fill:url(#linearGradient8644);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 334.14561,504.98819 c -0.18678,-0.70041 0.1728,-3.09956 0.59306,-3.75328 0.42026,-0.65373 3.82898,-2.28804 3.82898,-2.28804 l 2.98848,1.26075 2.98848,3.22194 -0.0934,11.3468 -5.21007,-0.14008 z"
+             id="path8321"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="cscccccc" />
+        <path
+             style="fill:url(#linearGradient8652);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 338.42756,499.36713 -2.14796,-3.22194 -2.10127,-2.61491 10.22619,-0.14009 0.18678,11.30012 z"
+             id="path8323"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="cccccc" />
+        <path
+             style="fill:url(#linearGradient8660);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 335.11223,493.62367 -1.58764,-0.0467 -4.62278,5.46329 -0.65374,2.14796 3.59552,5.88352 1.30745,-0.84051 c 0,0 3.50212,-4.43599 4.06246,-4.90293 0.56034,-0.46695 1.72772,-1.54094 1.72772,-1.54094 z"
+             id="path8325"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccccscc" />
+        <path
+             style="fill:url(#linearGradient8688);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 328.71502,501.74854 -5.88356,-1.21406 0.14009,-7.0042 11.9539,-0.14009 -4.94967,4.99634 z"
+             id="path8327"
+             inkscape:connector-curvature="0" />
+        <path
+             style="fill:url(#linearGradient8668);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 326.24019,515.00984 -3.12857,-0.28017 v -14.89561 l 6.11705,0.23348 c 0,0 1.86779,3.64218 1.91449,3.87565 0.0467,0.23348 0.56034,3.40872 0.79381,3.08186 0.23347,-0.32686 -1.77441,1.49422 -2.47482,1.91448 -0.70044,0.42026 -2.24136,3.64219 -2.28806,4.24921 -0.0467,0.60704 -0.9339,1.8211 -0.9339,1.8211 z"
+             id="path8329"
+             inkscape:connector-curvature="0" />
+        <rect
+             style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.9375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+             id="rect8276"
+             width="21.562677"
+             height="21.562561"
+             x="-344.6362"
+             y="493.30539"
+             transform="scale(-1,1)" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_favourite-24.svg b/pixmaps/src/gwy_favourite-24.svg
new file mode 100644
index 0000000..6be4cb5
--- /dev/null
+++ b/pixmaps/src/gwy_favourite-24.svg
@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92+devel unknown"
+   sodipodi:docname="gwy_favourite-24.svg">
+  <defs
+     id="defs8426">
+    <filter
+       style="color-interpolation-filters:sRGB;"
+       inkscape:label="Drop Shadow"
+       id="filter5063">
+      <feFlood
+         flood-opacity="1"
+         flood-color="rgb(0,0,0)"
+         result="flood"
+         id="feFlood5053" />
+      <feComposite
+         in="flood"
+         in2="SourceGraphic"
+         operator="in"
+         result="composite1"
+         id="feComposite5055" />
+      <feGaussianBlur
+         in="composite1"
+         stdDeviation="1"
+         result="blur"
+         id="feGaussianBlur5057" />
+      <feOffset
+         dx="0.9"
+         dy="0.9"
+         result="offset"
+         id="feOffset5059" />
+      <feComposite
+         in="SourceGraphic"
+         in2="offset"
+         operator="over"
+         result="composite2"
+         id="feComposite5061" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="18.687497"
+     inkscape:cx="23.633662"
+     inkscape:cy="10.453482"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1149"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     inkscape:document-rotation="0"
+     inkscape:snap-grids="true"
+     inkscape:object-paths="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:snap-object-midpoints="true"
+     inkscape:snap-center="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid1px"
+       originx="0"
+       originy="0"
+       dotted="false"
+       snapvisiblegridlinesonly="false"
+       spacingx="0.5"
+       spacingy="0.5"
+       enabled="true"
+       visible="true"
+       units="px"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <g
+       id="g4847"
+       transform="matrix(0.91523796,0,0,0.91523796,28.295059,50.836714)"
+       style="filter:url(#filter5063)">
+      <path
+         inkscape:transform-center-x="-4.5031347e-06"
+         inkscape:transform-center-y="-1.1612859"
+         d="m 122.33165,606.34669 c 0.82529,0 2.69089,7.05354 3.35856,7.53864 0.66768,0.48509 7.95249,0.0797 8.20752,0.86462 0.25503,0.7849 -5.87678,4.73885 -6.13181,5.52375 -0.25503,0.7849 2.38164,7.5879 1.71396,8.07299 -0.66767,0.4851 -6.32294,-4.12476 -7.14823,-4.12476 -0.82529,0 -6.48056,4.60986 -7.14823,4.12476 -0.66768,-0.48509 1.96899,-7.28809 1.71396,-8.07299 -0.25503,-0.7849 -6.38684,-4.73885 -6.13181,-5.52375 0.25503,-0.7849 7.53984,-0.37953 8.20752,-0.86462 0.66767,-0.4851 2.5 [...]
+         inkscape:randomized="0"
+         inkscape:rounded="0.1"
+         inkscape:flatsided="false"
+         sodipodi:arg2="-0.94247777"
+         sodipodi:arg1="-1.5707963"
+         sodipodi:r2="5.7139311"
+         sodipodi:r1="12.161301"
+         sodipodi:cy="618.508"
+         sodipodi:cx="122.33165"
+         sodipodi:sides="5"
+         id="path3740"
+         style="color:#000000;overflow:visible;vector-effect:none;fill:#ffdb15;fill-opacity:1;fill-rule:evenodd;stroke-width:1.05650628px"
+         sodipodi:type="star" />
+      <path
+         transform="translate(128.33165,604.34668)"
+         id="path4688"
+         d="m -6,2 c -0.8252936,0 -2.6916985,7.0539671 -3.359375,7.5390625 -0.667677,0.4850955 -7.952001,0.07838 -8.207031,0.8632815 -0.25503,0.784901 5.877783,4.74049 6.132812,5.52539 0.25503,0.784901 -2.38252,7.587171 -1.714844,8.072266 0.667677,0.485095 6.3231444,-4.125 7.148438,-4.125 0.8252936,0 6.48076097,4.610095 7.1484375,4.125 C 1.816114,23.514905 -0.82143601,16.712635 -0.56640625,15.927734 -0.31137649,15.142834 5.821436,11.187245 5.5664062,10.402344 5.3113765,9.6174429 -1.97294 [...]
+         style="color:#000000;overflow:visible;vector-effect:none;fill:#ffee8f;fill-opacity:1;fill-rule:evenodd;stroke-width:1.05650628px"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4706"
+         transform="translate(128.33165,604.34668)"
+         d="m -6,2 c -0.8246327,0 -2.6883631,7.0418987 -3.3574219,7.5371094 l 0.9316407,1.2812496 C -7.940222,10.447562 -6.5954968,5.3710937 -6,5.3710938 c 4.936e-4,0 0.00146,-7e-6 0.00195,0 V 2 C -5.998543,1.999995 -5.99951,2 -6,2 Z"
+         style="opacity:1;vector-effect:none;fill:#fcff17;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05650628px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4708"
+         transform="translate(128.33165,604.34668)"
+         d="m -2.640625,9.5390625 -0.9316406,1.2812495 c 6.564e-4,4.93e-4 0.0013,0.0034 0.00195,0.0039 0.4815839,0.349891 5.7197011,0.05937 5.9296875,0.621093 L 5.5664062,10.402344 C 5.3113765,9.6174427 -1.9729485,10.024158 -2.640625,9.5390625 Z"
+         style="opacity:1;vector-effect:none;fill:#fcff17;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05650628px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4710"
+         transform="translate(128.33165,604.34668)"
+         d="m -2.0664062,15.4375 c -4.45e-4,0.0013 -0.0035,0.0046 -0.00391,0.0059 -0.1839,0.565987 1.7101458,5.456437 1.2421875,5.832032 l 1.9785156,2.722656 c 0.661155,-0.495979 -1.97159773,-7.286116 -1.71679685,-8.070313 1.9859e-4,-6.11e-4 0.001747,-0.0013 0.001953,-0.002 z"
+         style="opacity:1;vector-effect:none;fill:#e4b700;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05650628px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4712"
+         transform="translate(128.33165,604.34668)"
+         d="m -6,18.298828 c -0.5968072,0 -4.687095,3.333216 -5.169922,2.982422 -5.98e-4,-4.35e-4 -0.0014,-0.0015 -0.002,-0.002 l -1.974609,2.71875 0.002,0.002 c 0.679749,0.471244 6.3203108,-4.125 7.144531,-4.125 4.552e-4,0 0.0015,-3e-6 0.00195,0 v -1.576172 c -3.431e-4,-2e-6 -0.00161,0 -0.00195,0 z"
+         style="opacity:1;vector-effect:none;fill:#b18e00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05650628px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4714"
+         transform="translate(128.33165,604.34668)"
+         d="m -17.564453,10.402344 -0.002,0.0039 c -0.238023,0.79215 5.878117,4.737611 6.132812,5.521484 l 1.5000002,-0.488281 c -0.1986512,-0.574466 -4.6137952,-3.423612 -4.4296872,-3.990234 7.12e-4,-0.0022 0.005,-0.0037 0.0059,-0.0059 z"
+         style="opacity:1;vector-effect:none;fill:#e4b700;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05650628px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4691"
+         d="m 122.37176,606.37085 v 3.3711 c 0.596,0 1.94322,5.08607 2.42773,5.44922 l 0.93164,-1.28125 c -0.66768,-0.4851 -2.53408,-7.53907 -3.35937,-7.53907 z"
+         style="opacity:1;vector-effect:none;fill:#e4b700;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05650628px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <path
+         id="path4698"
+         transform="translate(128.33165,604.34668)"
+         d="m -9.3574219,9.5371094 c -5.362e-4,3.969e-4 -0.00142,0.00156 -0.00195,0.00195 -0.6676771,0.4850956 -7.9520011,0.07838 -8.2070311,0.8632816 l 3.207031,1.042968 c 0.209986,-0.561724 5.4481036,-0.271202 5.9296876,-0.621093 8.137e-4,-5.91e-4 0.00309,-0.0033 0.00391,-0.0039 z"
+         style="opacity:1;vector-effect:none;fill:#fcff17;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05650628px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4700"
+         transform="translate(128.33165,604.34668)"
+         d="m -9.9335938,15.4375 -1.5019532,0.488281 c 2.06e-4,6.15e-4 0.0018,0.0013 0.002,0.002 0.25503,0.784901 -2.38252,7.587171 -1.714844,8.072266 l 1.976563,-2.720703 c -0.476317,-0.361658 1.4263824,-5.269043 1.2421875,-5.835938 -4.042e-4,-0.0012 -0.00346,-0.0046 -0.00391,-0.0059 z"
+         style="opacity:1;vector-effect:none;fill:#fcff17;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05650628px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4702"
+         transform="translate(128.33165,604.34668)"
+         d="M -6,18.298828 V 19.875 c 0.8252936,0 6.48076097,4.610095 7.1484375,4.125 L -0.828125,21.279297 c -5.9118e-4,4.49e-4 -0.001355,0.0015 -0.001953,0.002 C -1.3129053,21.632044 -5.4031928,18.298828 -6,18.298828 Z"
+         style="opacity:1;vector-effect:none;fill:#e4b700;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05650628px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path4704"
+         transform="translate(128.33165,604.34668)"
+         d="M 5.5664062,10.402344 2.359375,11.445312 c 5.421e-4,0.0015 0.00343,0.0024 0.00391,0.0039 0.1841778,0.56684 -4.2361667,3.417302 -4.4316406,3.990234 l 1.50195315,0.488281 c 0.25502976,-0.7849 6.38784225,-4.740489 6.13281245,-5.52539 z"
+         style="opacity:1;vector-effect:none;fill:#b18e00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05650628px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_fft-24.svg b/pixmaps/src/gwy_fft-24.svg
new file mode 100644
index 0000000..60c9d6d
--- /dev/null
+++ b/pixmaps/src/gwy_fft-24.svg
@@ -0,0 +1,656 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8233"
+     version="1.1"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_fft-24.svg">
+    <defs
+         id="defs8235">
+        <circle
+             stroke-width="0.5"
+             r="0.5"
+             id="gpDot" />
+        <path
+             d="M-1,0 h2 M0,-1 v2"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt0" />
+        <path
+             d="M-1,-1 L1,1 M1,-1 L-1,1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt1" />
+        <path
+             d="M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt2" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt3" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             fill="currentColor"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt4" />
+        <circle
+             r="1"
+             cy="0"
+             cx="0"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt5" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt6"
+             xlink:href="#gpPt5" />
+        <path
+             d="M0,-1.33 L-1.33,0.67 L1.33,0.67 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt7" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt8"
+             xlink:href="#gpPt7" />
+        <use
+             transform="rotate(180)"
+             stroke="currentColor"
+             id="gpPt9"
+             xlink:href="#gpPt7" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt10"
+             xlink:href="#gpPt9" />
+        <use
+             transform="rotate(45)"
+             stroke="currentColor"
+             id="gpPt11"
+             xlink:href="#gpPt3" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt12"
+             xlink:href="#gpPt11" />
+        <path
+             d="M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt13" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt14"
+             xlink:href="#gpPt13" />
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="textbox">
+            <feFlood
+                 id="feFlood4495"
+                 result="bgnd"
+                 flood-opacity="1"
+                 flood-color="white" />
+            <feComposite
+                 id="feComposite4497"
+                 operator="atop"
+                 in2="bgnd"
+                 in="SourceGraphic" />
+        </filter>
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="greybox">
+            <feFlood
+                 id="feFlood4500"
+                 result="grey"
+                 flood-opacity="1"
+                 flood-color="lightgrey" />
+            <feComposite
+                 id="feComposite4502"
+                 operator="atop"
+                 in2="grey"
+                 in="SourceGraphic" />
+        </filter>
+        <circle
+             stroke-width="0.5"
+             r="0.5"
+             id="gpDot-4" />
+        <path
+             d="M-1,0 h2 M0,-1 v2"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt0-5" />
+        <path
+             d="M-1,-1 L1,1 M1,-1 L-1,1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt1-2" />
+        <path
+             d="M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt2-5" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt3-9" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             fill="currentColor"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt4-3" />
+        <circle
+             r="1"
+             cy="0"
+             cx="0"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt5-8" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt6-8"
+             xlink:href="#gpPt5-8" />
+        <path
+             d="M0,-1.33 L-1.33,0.67 L1.33,0.67 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt7-4" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt8-3"
+             xlink:href="#gpPt7-4" />
+        <use
+             transform="rotate(180)"
+             stroke="currentColor"
+             id="gpPt9-5"
+             xlink:href="#gpPt7-4" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt10-0"
+             xlink:href="#gpPt9-5" />
+        <use
+             transform="rotate(45)"
+             stroke="currentColor"
+             id="gpPt11-5"
+             xlink:href="#gpPt3-9" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt12-9"
+             xlink:href="#gpPt11-5" />
+        <path
+             d="M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt13-3" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt14-4"
+             xlink:href="#gpPt13-3" />
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="textbox-6">
+            <feFlood
+                 id="feFlood4756"
+                 result="bgnd"
+                 flood-opacity="1"
+                 flood-color="white" />
+            <feComposite
+                 id="feComposite4758"
+                 operator="atop"
+                 in2="bgnd"
+                 in="SourceGraphic" />
+        </filter>
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="greybox-2">
+            <feFlood
+                 id="feFlood4761"
+                 result="grey"
+                 flood-opacity="1"
+                 flood-color="lightgrey" />
+            <feComposite
+                 id="feComposite4763"
+                 operator="atop"
+                 in2="grey"
+                 in="SourceGraphic" />
+        </filter>
+        <circle
+             stroke-width="0.5"
+             r="0.5"
+             id="gpDot-5" />
+        <path
+             d="M-1,0 h2 M0,-1 v2"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt0-3" />
+        <path
+             d="M-1,-1 L1,1 M1,-1 L-1,1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt1-20" />
+        <path
+             d="M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt2-0" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt3-0" />
+        <rect
+             height="2"
+             width="2"
+             y="-1"
+             x="-1"
+             fill="currentColor"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt4-9" />
+        <circle
+             r="1"
+             cy="0"
+             cx="0"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt5-80" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt6-9"
+             xlink:href="#gpPt5-80" />
+        <path
+             d="M0,-1.33 L-1.33,0.67 L1.33,0.67 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt7-6" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt8-7"
+             xlink:href="#gpPt7-6" />
+        <use
+             transform="rotate(180)"
+             stroke="currentColor"
+             id="gpPt9-2"
+             xlink:href="#gpPt7-6" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt10-1"
+             xlink:href="#gpPt9-2" />
+        <use
+             transform="rotate(45)"
+             stroke="currentColor"
+             id="gpPt11-4"
+             xlink:href="#gpPt3-0" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt12-4"
+             xlink:href="#gpPt11-4" />
+        <path
+             d="M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z"
+             stroke="currentColor"
+             stroke-width="0.222"
+             id="gpPt13-8" />
+        <use
+             stroke="none"
+             fill="currentColor"
+             id="gpPt14-49"
+             xlink:href="#gpPt13-8" />
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="textbox-8">
+            <feFlood
+                 id="feFlood5017"
+                 result="bgnd"
+                 flood-opacity="1"
+                 flood-color="white" />
+            <feComposite
+                 id="feComposite5019"
+                 operator="atop"
+                 in2="bgnd"
+                 in="SourceGraphic" />
+        </filter>
+        <filter
+             width="1"
+             height="1"
+             y="0"
+             x="0"
+             filterUnits="objectBoundingBox"
+             id="greybox-4">
+            <feFlood
+                 id="feFlood5022"
+                 result="grey"
+                 flood-opacity="1"
+                 flood-color="lightgrey" />
+            <feComposite
+                 id="feComposite5024"
+                 operator="atop"
+                 in2="grey"
+                 in="SourceGraphic" />
+        </filter>
+        <defs
+             id="defs5027">
+            <circle
+                 cy="0"
+                 cx="0"
+                 id="circle5089"
+                 r="0.5"
+                 stroke-width="0.5" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path5091"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,0 H 1 M 0,-1 v 2" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path5093"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,-1 1,1 M 1,-1 -1,1" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path5095"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M -1,0 H 1 M 0,-1 v 2 m -1,-2 2,2 m -2,0 2,-2" />
+            <rect
+                 id="rect5097"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 x="-1"
+                 y="-1"
+                 width="2"
+                 height="2" />
+            <rect
+                 id="rect5099"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 fill="currentColor"
+                 x="-1"
+                 y="-1"
+                 width="2"
+                 height="2" />
+            <circle
+                 id="circle5101"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 cx="0"
+                 cy="0"
+                 r="1" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt5-80"
+                 id="use5103"
+                 fill="currentColor"
+                 stroke="none" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path5105"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="m 0,-1.33 -1.33,2 h 2.66 z" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt7-6"
+                 id="use5107"
+                 fill="currentColor"
+                 stroke="none" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt7-6"
+                 id="use5109"
+                 stroke="currentColor"
+                 transform="scale(-1)" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt9-2"
+                 id="use5111"
+                 fill="currentColor"
+                 stroke="none" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt3-0"
+                 id="use5113"
+                 stroke="currentColor"
+                 transform="rotate(45)" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt11-4"
+                 id="use5115"
+                 fill="currentColor"
+                 stroke="none" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path5117"
+                 stroke-width="0.222"
+                 stroke="currentColor"
+                 d="M 0,1.33 1.265,0.411 0.782,-1.067 -0.782,-1.076 -1.265,0.411 Z" />
+            <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#gpPt13-8"
+                 id="use5119"
+                 fill="currentColor"
+                 stroke="none" />
+            <filter
+                 id="filter5125"
+                 filterUnits="objectBoundingBox"
+                 x="0"
+                 y="0"
+                 height="1"
+                 width="1">
+                <feFlood
+                     flood-color="white"
+                     flood-opacity="1"
+                     result="bgnd"
+                     id="feFlood5121" />
+                <feComposite
+                     in="SourceGraphic"
+                     in2="bgnd"
+                     operator="atop"
+                     id="feComposite5123" />
+            </filter>
+            <filter
+                 id="filter5131"
+                 filterUnits="objectBoundingBox"
+                 x="0"
+                 y="0"
+                 height="1"
+                 width="1">
+                <feFlood
+                     flood-color="lightgrey"
+                     flood-opacity="1"
+                     result="grey"
+                     id="feFlood5127" />
+                <feComposite
+                     in="SourceGraphic"
+                     in2="grey"
+                     operator="atop"
+                     id="feComposite5129" />
+            </filter>
+        </defs>
+    </defs>
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="31.047031"
+         inkscape:cx="11.604869"
+         inkscape:cy="12.046547"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:snap-object-midpoints="true"
+         inkscape:snap-grids="true"
+         inkscape:document-rotation="0"
+         units="px">
+        <inkscape:grid
+             type="xygrid"
+             id="grid1px"
+             originx="0"
+             originy="0"
+             dotted="false"
+             snapvisiblegridlinesonly="false"
+             spacingx="0.5"
+             spacingy="0.5"
+             enabled="true"
+             visible="true"
+             units="px"
+             empspacing="2" />
+    </sodipodi:namedview>
+    <metadata
+         id="metadata8238">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title />
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-393.51587,-663.14807)">
+        <text
+             id="text4357"
+             y="672.25159"
+             x="411.81357"
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:11.72398472px;line-height:1;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;text-anchor:middle;shape-padding:0;overflow:visible;vector-effect:none;fill:#000000;stroke-width:0.2;paint-order:fill markers stroke;stroke:# [...]
+             xml:space="preserve"><tspan
+                 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';stroke-width:0.2;stroke:#000000;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+                 y="672.25159"
+                 x="411.81357"
+                 id="tspan4355"
+                 sodipodi:role="line">T</tspan></text>
+        <text
+             xml:space="preserve"
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:11.72398472px;line-height:1;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;text-anchor:middle;shape-padding:0;overflow:visible;vector-effect:none;fill:#000000;stroke-width:0.2;paint-order:fill markers stroke;stroke:# [...]
+             x="405.14713"
+             y="672.25159"
+             id="text4361"><tspan
+                 sodipodi:role="line"
+                 id="tspan4359"
+                 x="405.14713"
+                 y="672.25159"
+                 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';stroke-width:0.2;stroke:#000000;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none">F</tspan></text>
+        <text
+             id="text4365"
+             y="672.25159"
+             x="398.79581"
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:11.72398472px;line-height:1;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;text-anchor:middle;shape-padding:0;overflow:visible;vector-effect:none;fill:#000000;stroke-width:0.2;paint-order:fill markers stroke;stroke:# [...]
+             xml:space="preserve"><tspan
+                 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Bold Condensed';stroke-width:0.2;stroke:#000000;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+                 y="672.25159"
+                 x="398.79581"
+                 id="tspan4363"
+                 sodipodi:role="line">F</tspan></text>
+        <path
+             style="color:#000000;fill:none;stroke-width:1.39999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none"
+             inkscape:connector-curvature="0"
+             stroke="rgb(  0,   0,   0)"
+             d="m 394.01435,675.74049 0.19193,0.01 0.19194,0.0192 0.19193,0.0288 0.19193,0.0384 0.19194,0.0576 0.19193,0.0576 0.19193,0.0768 0.19194,0.096 0.19193,0.096 0.19193,0.10556 0.19193,0.12476 0.19194,0.13435 0.19193,0.13436 0.19193,0.15354 0.19194,0.15355 0.19193,0.17274 0.19193,0.17274 0.19194,0.18234 0.19193,0.19193 0.19193,0.19193 0.19194,0.20153 0.19193,0.21113 0.19193,0.21112 0.19194,0.22073 0.19193,0.22072 0.19193,0.22072 0.19194,0.23032 0.19193,0.23032 0.19193,0.23032 0.1 [...]
+             id="path5037" />
+        <path
+             inkscape:connector-curvature="0"
+             stroke="rgb(255,   0,   0)"
+             d="m 394.01435,680.13576 0.19193,-0.22073 0.19194,-0.23032 0.19193,-0.23032 0.19193,-0.23032 0.19194,-0.22072 0.19193,-0.22072 0.19193,-0.22073 0.19194,-0.21112 0.19193,-0.21113 0.19193,-0.20153 0.19193,-0.19193 0.19194,-0.19193 0.19193,-0.18234 0.19193,-0.17274 0.19194,-0.17274 0.19193,-0.15355 0.19193,-0.15354 0.19194,-0.13436 0.19193,-0.13435 0.19193,-0.12476 0.19194,-0.10556 0.19193,-0.096 0.19193,-0.096 0.19194,-0.0768 0.19193,-0.0576 0.19193,-0.0576 0.19194,-0.0384 0.1 [...]
+             id="path5044"
+             style="color:#000000;fill:none;stroke:#e91616;stroke-width:1.39999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_fft_2d-24.svg b/pixmaps/src/gwy_fft_2d-24.svg
new file mode 100644
index 0000000..0191d76
--- /dev/null
+++ b/pixmaps/src/gwy_fft_2d-24.svg
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_fft_2d-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="30.397128"
+     inkscape:cx="4.1134703"
+     inkscape:cy="23.702158"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <defs
+     id="defs9689" />
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(-306.29821,-648.57531)"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Layer 1">
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#808080;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 318.29821,672.57531 v -12"
+       id="path8537"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       id="path8512"
+       title="sin(x)+sin(1.5*x)"
+       d="m 307.29822,656.63906 c 0.0783,-0.61248 0.15669,-1.22488 0.23504,-1.81643 0.0784,-0.59153 0.15669,-1.16198 0.23504,-1.69226 0.0783,-0.53028 0.1567,-1.02006 0.23504,-1.45345 0.0784,-0.4334 0.15669,-0.80999 0.23504,-1.11827 0.0784,-0.30827 0.15669,-0.54778 0.23504,-0.7122 0.0784,-0.16442 0.15669,-0.25329 0.23504,-0.26593 0.0784,-0.0126 0.15669,0.0514 0.23504,0.18725 0.0783,0.13585 0.15669,0.34386 0.23504,0.61406 0.0784,0.27021 0.15669,0.60291 0.23504,0.98392 0.0783,0.38101 0.1567 [...]
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:1.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8539"
+       d="m 306.29821,671.57531 h 24"
+       style="fill:none;fill-rule:evenodd;stroke:#808080;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 314.29821,662.57531 v 10"
+       id="path8529"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8535"
+       d="m 309.29821,662.57531 v 10"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8531"
+       d="m 322.29821,662.57531 v 10"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 327.29821,662.57531 v 10"
+       id="path8533"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_fft_filter_1d-24.svg b/pixmaps/src/gwy_fft_filter_1d-24.svg
new file mode 100644
index 0000000..34e8694
--- /dev/null
+++ b/pixmaps/src/gwy_fft_filter_1d-24.svg
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_fft_filter_1d-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.6356752"
+     inkscape:cx="46.155931"
+     inkscape:cy="29.736001"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <defs
+     id="defs9689" />
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8537"
+       d="m 318.29821,672.57531 v -12"
+       style="fill:none;fill-rule:evenodd;stroke:#808080;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#808080;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 306.29821,671.57531 h 24"
+       id="path8539"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8529"
+       d="m 314.29821,662.57531 v 10"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 309.29821,662.57531 v 10"
+       id="path8535"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 322.29821,662.57531 v 10"
+       id="path8531"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8533"
+       d="m 327.29821,662.57531 v 10"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <g
+       style="stroke:#db2424;stroke-width:1.21908247;stroke-opacity:1"
+       transform="matrix(1.2304337,0,0,1.2304337,-134.67046,19.736605)"
+       id="g8484">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8480"
+         d="m 373.44052,524.5011 4.02276,4.02277"
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.82862377;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.82862377;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 373.44052,528.52387 4.02276,-4.02277"
+         id="path8482"
+         inkscape:connector-curvature="0" />
+    </g>
+    <path
+       id="path8520"
+       title="sin(x)"
+       d="m 307.23798,654.5753 c 0.0776,-0.20987 0.15523,-0.41973 0.23285,-0.62549 0.0776,-0.20576 0.15523,-0.40737 0.23284,-0.60095 0.0776,-0.19356 0.15523,-0.37903 0.23285,-0.55281 0.0776,-0.17379 0.15524,-0.33583 0.23285,-0.48301 0.0776,-0.14718 0.15523,-0.27942 0.23285,-0.39423 0.0776,-0.1148 0.15523,-0.21207 0.23284,-0.28999 0.0776,-0.078 0.15524,-0.13638 0.23285,-0.17437 0.0776,-0.038 0.15523,-0.0554 0.23285,-0.052 0.0776,0.004 0.15523,0.0278 0.23284,0.0726 0.0776,0.0448 0.15524,0. [...]
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g8432"
+       transform="matrix(1.2304337,0,0,1.2304337,-152.67046,19.736605)"
+       style="stroke:#db2424;stroke-width:1.21908247;stroke-opacity:1">
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.82862377;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 373.44052,524.5011 4.02276,4.02277"
+         id="path8428"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8430"
+         d="m 373.44052,528.52387 4.02276,-4.02277"
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.82862377;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_fft_filter_2d-24.svg b/pixmaps/src/gwy_fft_filter_2d-24.svg
new file mode 100644
index 0000000..361e833
--- /dev/null
+++ b/pixmaps/src/gwy_fft_filter_2d-24.svg
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="6.3499999mm"
+   height="6.3499999mm"
+   viewBox="0 0 22.499999 22.499999"
+   id="svg8233"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_fft_filter_2d-24.svg">
+  <defs
+     id="defs8235" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="10.982445"
+     inkscape:cx="19.415703"
+     inkscape:cy="25.643841"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-object-midpoints="true"
+     inkscape:snap-grids="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8238">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-393.51587,-663.14807)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8276"
+       width="21.5625"
+       height="21.5625"
+       x="393.98462"
+       y="663.61682" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.76546752;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8447"
+       width="1.8750006"
+       height="0.93750441"
+       x="403.82837"
+       y="679.08557" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 393.98462,663.61682 h 21.5625 v 10.3125 h -21.5625 z"
+       id="rect8463"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8430-3"
+       width="1.8749998"
+       height="1.8749998"
+       x="408.51587"
+       y="676.27307" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499988;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8430"
+       width="1.8749999"
+       height="1.8749999"
+       x="399.14087"
+       y="680.96057" />
+    <rect
+       y="-405.23462"
+       x="678.61682"
+       height="0.93750441"
+       width="1.8750006"
+       id="rect8449"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.76546752;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="rotate(90)" />
+    <g
+       transform="matrix(0.62419693,0,0,0.62419693,166.90286,261.76225)"
+       id="g8711">
+      <g
+         id="g8709"
+         transform="translate(33.655007)">
+        <rect
+           y="669.32733"
+           x="336.15097"
+           height="7.4840126"
+           width="7.483994"
+           id="rect8701"
+           style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:0.49803922;fill-rule:evenodd;stroke:none;stroke-width:0.93749994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.93749996, 0.93749996;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+        <g
+           style="stroke:#db2424;stroke-opacity:1"
+           transform="matrix(1.4062499,0,0,1.4062499,-181.69234,-80.487314)"
+           id="g8707">
+          <path
+             style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 368.89943,533.85685 4.02276,4.02277"
+             id="path8703"
+             inkscape:connector-curvature="0" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path8705"
+             d="m 368.89943,537.87962 4.02276,-4.02277"
+             style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        </g>
+      </g>
+    </g>
+    <g
+       id="g8453"
+       transform="matrix(0.62419693,0,0,0.62419693,176.27786,257.07475)">
+      <g
+         transform="translate(33.655007)"
+         id="g8451">
+        <rect
+           style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:0.49803922;fill-rule:evenodd;stroke:none;stroke-width:0.93749994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.93749996, 0.93749996;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+           id="rect8443"
+           width="7.483994"
+           height="7.4840126"
+           x="336.15097"
+           y="669.32733" />
+        <g
+           id="g8449"
+           transform="matrix(1.4062499,0,0,1.4062499,-181.69234,-80.487314)"
+           style="stroke:#db2424;stroke-opacity:1">
+          <path
+             inkscape:connector-curvature="0"
+             id="path8445"
+             d="m 368.89943,533.85685 4.02276,4.02277"
+             style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+          <path
+             style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 368.89943,537.87962 4.02276,-4.02277"
+             id="path8447"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_filter-24.svg b/pixmaps/src/gwy_filter-24.svg
new file mode 100644
index 0000000..ae37f5d
--- /dev/null
+++ b/pixmaps/src/gwy_filter-24.svg
@@ -0,0 +1,895 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8181"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_filter-24.svg">
+  <defs
+     id="defs8183" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="29.204265"
+     inkscape:cx="12.705143"
+     inkscape:cy="15.825936"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     units="px">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8186">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(3.9111328e-6,-1029.8622)">
+    <g
+       id="g8876"
+       transform="translate(8.0173505e-4,1.4991743)">
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8780"
+         width="11.999124"
+         height="23.998245"
+         x="11.999186"
+         y="1028.3638" />
+      <rect
+         y="1028.3638"
+         x="6.6391345e-05"
+         height="23.99824"
+         width="11.99912"
+         id="rect8230"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.9998982;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1030.3638"
+         x="1.9999197"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8762"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8769"
+         width="0.99992979"
+         height="0.99990022"
+         x="3.999773"
+         y="1031.3636" />
+      <rect
+         y="1032.3635"
+         x="2.9998465"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8771"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8773"
+         width="0.99992979"
+         height="0.99990022"
+         x="5.9996262"
+         y="1032.3635" />
+      <rect
+         y="1034.3635"
+         x="4.9997001"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8775"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8777"
+         width="0.99992979"
+         height="0.99990022"
+         x="2.9998465"
+         y="1036.3632" />
+      <rect
+         y="1034.3635"
+         x="1.9999197"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8781"
+         width="0.99992979"
+         height="0.99990022"
+         x="2.9998465"
+         y="1034.3635" />
+      <rect
+         y="1036.3632"
+         x="5.9996262"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8783"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8785"
+         width="0.99992979"
+         height="0.99990022"
+         x="1.9999197"
+         y="1038.363" />
+      <rect
+         y="1038.363"
+         x="3.999773"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8787"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8789"
+         width="0.99992979"
+         height="0.99990022"
+         x="4.9997001"
+         y="1037.3632" />
+      <rect
+         y="1038.363"
+         x="6.9995532"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8791"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8793"
+         width="0.99992979"
+         height="0.99990022"
+         x="5.9996262"
+         y="1039.363" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8797"
+         width="0.99992979"
+         height="0.99990022"
+         x="2.9998465"
+         y="1039.363" />
+      <rect
+         y="1040.3629"
+         x="0.99999303"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8799"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8801"
+         width="0.99992979"
+         height="0.99990022"
+         x="2.9998465"
+         y="1040.3629" />
+      <rect
+         y="1040.3629"
+         x="4.9997001"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8803"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8805"
+         width="0.99992979"
+         height="0.99990022"
+         x="6.9995532"
+         y="1040.3629" />
+      <rect
+         y="1041.3629"
+         x="3.999773"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8807"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8809"
+         width="0.99992979"
+         height="0.99990022"
+         x="3.999773"
+         y="1042.3628" />
+      <rect
+         y="1042.3628"
+         x="1.9999197"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8811"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8813"
+         width="0.99992979"
+         height="0.99990022"
+         x="5.9996262"
+         y="1042.3628" />
+      <rect
+         y="1042.3628"
+         x="5.9996262"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8815"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817"
+         width="0.99992979"
+         height="0.99990022"
+         x="2.9998465"
+         y="1044.3625" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-9"
+         width="0.9999299"
+         height="0.99990028"
+         x="4.9997001"
+         y="1044.3625" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-5"
+         width="0.9999299"
+         height="0.99990028"
+         x="4.9997001"
+         y="1045.3625" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-1"
+         width="0.9999299"
+         height="0.99990028"
+         x="5.9996262"
+         y="1046.3625" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-7"
+         width="0.9999299"
+         height="0.99990028"
+         x="3.999773"
+         y="1047.3625" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-4"
+         width="0.9999299"
+         height="0.99990028"
+         x="1.9999197"
+         y="1047.3625" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-42"
+         width="0.9999299"
+         height="0.99990028"
+         x="4.9997001"
+         y="1048.3623" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-8"
+         width="0.9999299"
+         height="0.99990028"
+         x="2.9998465"
+         y="1049.3623" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-0"
+         width="0.9999299"
+         height="0.99990028"
+         x="1.9999197"
+         y="1045.3625" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-6"
+         width="0.9999299"
+         height="0.99990028"
+         x="5.9996262"
+         y="1049.3623" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-44"
+         width="0.9999299"
+         height="0.99990028"
+         x="5.9996262"
+         y="1050.3622" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-99"
+         width="0.9999299"
+         height="0.99990028"
+         x="3.999773"
+         y="1050.3622" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-05"
+         width="0.9999299"
+         height="0.99990028"
+         x="4.9997001"
+         y="1050.3622" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-43"
+         width="0.9999299"
+         height="0.99990028"
+         x="0.99999303"
+         y="1049.3623" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-51"
+         width="0.9999299"
+         height="0.99990028"
+         x="0.99999303"
+         y="1048.3623" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-431"
+         width="0.9999299"
+         height="0.99990028"
+         x="6.9995532"
+         y="1034.3635" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-2"
+         width="0.9999299"
+         height="0.99990028"
+         x="3.999773"
+         y="1035.3634" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-89"
+         width="0.9999299"
+         height="0.99990028"
+         x="4.9997001"
+         y="1035.3634" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-28"
+         width="0.9999299"
+         height="0.99990028"
+         x="5.9996262"
+         y="1035.3634" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-33"
+         width="0.9999299"
+         height="0.99990028"
+         x="3.999773"
+         y="1029.3638" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-90"
+         width="0.9999299"
+         height="0.99990028"
+         x="5.9996262"
+         y="1030.3638" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-79"
+         width="0.9999299"
+         height="0.99990028"
+         x="6.9995532"
+         y="1029.3638" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-3"
+         width="0.9999299"
+         height="0.99990028"
+         x="7.9994798"
+         y="1029.3638" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-52"
+         width="0.9999299"
+         height="0.99990028"
+         x="7.9994798"
+         y="1031.3636" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-96"
+         width="0.9999299"
+         height="0.99990028"
+         x="8.9994059"
+         y="1031.3636" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-41"
+         width="0.9999299"
+         height="0.99990028"
+         x="8.9994059"
+         y="1032.3635" />
+      <rect
+         transform="scale(1,-1)"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-04"
+         width="0.99992979"
+         height="0.99990022"
+         x="8.9993906"
+         y="-1035.3634" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-91"
+         width="0.9999299"
+         height="0.99990028"
+         x="8.9994059"
+         y="1039.363" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-54"
+         width="0.9999299"
+         height="0.99990028"
+         x="8.9994059"
+         y="1041.3629" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-92"
+         width="0.9999299"
+         height="0.99990028"
+         x="8.9994059"
+         y="1044.3625" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-57"
+         width="0.9999299"
+         height="0.99990028"
+         x="8.9994059"
+         y="1046.3625" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-45"
+         width="0.9999299"
+         height="0.99990028"
+         x="8.9994059"
+         y="1045.3625" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-570"
+         width="0.9999299"
+         height="0.99990028"
+         x="6.9995532"
+         y="1048.3623" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-997"
+         width="0.9999299"
+         height="0.99990028"
+         x="7.9994798"
+         y="1047.3625" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-53"
+         width="0.9999299"
+         height="0.99990028"
+         x="7.9994798"
+         y="1044.3625" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-01"
+         width="0.9999299"
+         height="0.99990028"
+         x="7.9994798"
+         y="1042.3628" />
+      <rect
+         transform="scale(1,-1)"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-04-0"
+         width="0.99992979"
+         height="0.99990022"
+         x="9.9993181"
+         y="-1031.3636" />
+      <rect
+         transform="scale(1,-1)"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-04-6"
+         width="0.99992979"
+         height="0.99990022"
+         x="9.9993181"
+         y="-1033.3634" />
+      <rect
+         transform="scale(1,-1)"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-04-64"
+         width="0.99992979"
+         height="0.99990022"
+         x="9.9993181"
+         y="-1035.3634" />
+      <rect
+         transform="scale(1,-1)"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-04-8"
+         width="0.99992979"
+         height="0.99990022"
+         x="9.9993181"
+         y="-1037.3632" />
+      <rect
+         transform="scale(1,-1)"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-04-2"
+         width="0.99992979"
+         height="0.99990022"
+         x="9.9993181"
+         y="-1038.363" />
+      <rect
+         transform="scale(1,-1)"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-04-01"
+         width="0.99992979"
+         height="0.99990022"
+         x="9.9993181"
+         y="-1041.3629" />
+      <rect
+         transform="scale(1,-1)"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-04-7"
+         width="0.99992979"
+         height="0.99990022"
+         x="9.9993181"
+         y="-1045.3625" />
+      <rect
+         transform="scale(1,-1)"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-04-5"
+         width="0.99992979"
+         height="0.99990022"
+         x="9.9993181"
+         y="-1044.3625" />
+      <rect
+         transform="scale(1,-1)"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-04-4"
+         width="0.99992979"
+         height="0.99990022"
+         x="9.9993181"
+         y="-1047.3625" />
+      <rect
+         transform="scale(1,-1)"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-04-60"
+         width="0.99992979"
+         height="0.99990022"
+         x="9.9993181"
+         y="-1049.3623" />
+      <rect
+         transform="scale(1,-1)"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-04-9"
+         width="0.99992979"
+         height="0.99990022"
+         x="8.9993906"
+         y="-1050.3622" />
+      <rect
+         transform="scale(1,-1)"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-04-79"
+         width="0.99992979"
+         height="0.99990022"
+         x="8.9993906"
+         y="-1051.3622" />
+      <rect
+         y="-1031.3636"
+         x="10.999245"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect9247"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         transform="scale(1,-1)" />
+      <rect
+         y="1033.3634"
+         x="10.99926"
+         height="0.99990034"
+         width="0.99992996"
+         id="rect9245"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1038.363"
+         x="10.99926"
+         height="0.99990034"
+         width="0.99992996"
+         id="rect9245-2"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1044.3625"
+         x="10.99926"
+         height="0.99990034"
+         width="0.99992996"
+         id="rect9245-27"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1047.3625"
+         x="10.99926"
+         height="0.99990034"
+         width="0.99992996"
+         id="rect9245-0"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1049.3623"
+         x="10.99926"
+         height="0.99990034"
+         width="0.99992996"
+         id="rect9245-3"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1036.3632"
+         x="0.99999303"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-3"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1032.3635"
+         x="0.99999303"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-6"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1029.3638"
+         x="6.6391345e-05"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-7"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1034.3635"
+         x="6.6391345e-05"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-5"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1039.363"
+         x="6.6391345e-05"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-35"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1042.3628"
+         x="6.6391345e-05"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-62"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1045.3625"
+         x="0.99999303"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-9"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1047.3625"
+         x="6.6391345e-05"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-1"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1051.3622"
+         x="1.9999197"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-2"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1051.3622"
+         x="5.9996262"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-70"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1051.3622"
+         x="9.9993334"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-93"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1051.3622"
+         x="6.9995532"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-60"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1028.3638"
+         x="1.9999197"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-626"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1028.3638"
+         x="6.9995532"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-18"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1028.3638"
+         x="8.9994059"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-79"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1028.3638"
+         x="9.9993334"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-23"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1028.3638"
+         x="0.99999303"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-75"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="1031.3636"
+         x="1.9999197"
+         height="0.99990022"
+         width="0.99992979"
+         id="rect8779-28"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-54-3"
+         width="0.9999299"
+         height="0.99990028"
+         x="6.9995532"
+         y="1041.3629" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-54-6"
+         width="0.9999299"
+         height="0.99990028"
+         x="8.9994059"
+         y="1038.363" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-54-7"
+         width="0.9999299"
+         height="0.99990028"
+         x="10.99926"
+         y="1041.3629" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-54-5"
+         width="0.9999299"
+         height="0.99990028"
+         x="7.9994798"
+         y="1038.363" />
+      <rect
+         transform="scale(1,-1)"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-04-5-3"
+         width="0.99992979"
+         height="0.99990022"
+         x="9.9993181"
+         y="-1043.3628" />
+      <rect
+         transform="scale(1,-1)"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-04-5-7"
+         width="0.99992979"
+         height="0.99990022"
+         x="5.9996109"
+         y="-1042.3628" />
+      <rect
+         transform="scale(1,-1)"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-04-5-35"
+         width="0.99992979"
+         height="0.99990022"
+         x="7.9994645"
+         y="-1038.363" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-83"
+         width="0.9999299"
+         height="0.99990028"
+         x="10.99926"
+         y="1037.3632" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-83-6"
+         width="0.9999299"
+         height="0.99990028"
+         x="10.99926"
+         y="1042.3628" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-24"
+         width="0.9999299"
+         height="0.99990028"
+         x="7.9994798"
+         y="1035.3634" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-24-2"
+         width="0.9999299"
+         height="0.99990028"
+         x="8.9994059"
+         y="1036.3632" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-24-9"
+         width="0.9999299"
+         height="0.99990028"
+         x="6.9995532"
+         y="1043.3628" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-24-1"
+         width="0.9999299"
+         height="0.99990028"
+         x="1.9999197"
+         y="1033.3634" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-24-27"
+         width="0.9999299"
+         height="0.99990028"
+         x="3.999773"
+         y="1033.3634" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.9999491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8817-24-93"
+         width="0.9999299"
+         height="0.99990028"
+         x="6.9995532"
+         y="1033.3634" />
+      <rect
+         y="1028.863"
+         x="0.4992058"
+         height="22.999977"
+         width="22.999977"
+         id="rect8191"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <path
+         sodipodi:nodetypes="cccccccc"
+         inkscape:connector-curvature="0"
+         id="path8188"
+         d="m 5.9996304,1038.3632 h 7.9994136 v -3.9997 l 5.99956,5.9995 -5.99956,5.9995 v -3.9998 H 5.9996304 v -3.9995"
+         style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:0.99997455px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_find_peaks-24.svg b/pixmaps/src/gwy_find_peaks-24.svg
new file mode 100644
index 0000000..bdb2d71
--- /dev/null
+++ b/pixmaps/src/gwy_find_peaks-24.svg
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_find_peaks-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="29.184747"
+     inkscape:cx="-28.950429"
+     inkscape:cy="11.205544"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8419"
+       width="23"
+       height="23"
+       x="306.79822"
+       y="649.07532" />
+    <g
+       id="g8458"
+       transform="rotate(-90,318.79821,660.07531)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 307.29821,668.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,653.07531 h 22"
+         id="path8448"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,663.07531 h 22"
+         id="path8450"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8452"
+         d="m 307.29821,658.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="m 307.29821,668.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,653.07531 h 22"
+       id="path8438"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,663.07531 h 22"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="m 307.29821,658.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 307.41696,670.57531 c 4.88125,0 4.88125,-12 4.88125,-12 0,0 1,12 3.28056,11.93457 1.71944,0.0654 2.71944,-5.93457 2.71944,-5.93457 0,0 1,6 4.04392,6 1.95608,0 1.95608,-11 1.95608,-11 0,0 0,11 5.04737,10.92517"
+       id="path8254-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccscc" />
+    <g
+       id="g8558"
+       transform="translate(1,1)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8451"
+         d="m 311.29821,655.57531 -3,-3 h 6 z"
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8453"
+         d="m 310.29821,652.57531 v -3 h 2 v 3 z"
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <g
+       id="g8564"
+       transform="translate(7,7)">
+      <path
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 311.29821,655.57531 -3,-3 h 6 z"
+         id="path8560"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 310.29821,652.57531 v -3 h 2 v 3 z"
+         id="path8562"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       transform="translate(13,2)"
+       id="g8570">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8566"
+         d="m 311.29821,655.57531 -3,-3 h 6 z"
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8568"
+         d="m 310.29821,652.57531 v -3 h 2 v 3 z"
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_fit_shape-24.svg b/pixmaps/src/gwy_fit_shape-24.svg
new file mode 100644
index 0000000..3bccefb
--- /dev/null
+++ b/pixmaps/src/gwy_fit_shape-24.svg
@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.92+devel unknown"
+   sodipodi:docname="gwy_fit_shape-24.svg"
+   inkscape:export-filename="/home/lila/Documents/Gwyddion/gwy_poly_distort-24.png"
+   inkscape:export-xdpi="2.9028571"
+   inkscape:export-ydpi="2.9028571">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient8308-6"
+       inkscape:collect="always">
+      <stop
+         id="stop8310-7"
+         offset="0"
+         style="stop-color:#0c1e2d;stop-opacity:1" />
+      <stop
+         style="stop-color:#4696db;stop-opacity:1"
+         offset="0.5"
+         id="stop8351-5" />
+      <stop
+         id="stop8312-3"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308-6"
+       id="linearGradient5224-9"
+       x1="12"
+       y1="1041.8622"
+       x2="2.6962378"
+       y2="1040.166"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3196771,0,0,1.3196771,-3.8361262,-1362.9219)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308-6"
+       id="linearGradient6040"
+       x1="13"
+       y1="1042.8622"
+       x2="13"
+       y2="1051.3622"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308-6"
+       id="linearGradient6052"
+       gradientUnits="userSpaceOnUse"
+       x1="13"
+       y1="1042.8622"
+       x2="13"
+       y2="1051.3622"
+       gradientTransform="rotate(-90,13,1042.8622)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308-6"
+       id="linearGradient6056"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="rotate(-180,13,1042.8622)"
+       x1="13"
+       y1="1042.8622"
+       x2="13"
+       y2="1051.3622" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308-6"
+       id="linearGradient6060"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="rotate(90,13,1042.8622)"
+       x1="13"
+       y1="1042.8622"
+       x2="13"
+       y2="1051.3622" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="22.625"
+     inkscape:cx="5.5410286"
+     inkscape:cy="8.5732675"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1149"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     units="px"
+     inkscape:snap-smooth-nodes="false"
+     inkscape:snap-intersection-paths="false"
+     inkscape:snap-grids="true"
+     inkscape:object-nodes="true"
+     inkscape:document-rotation="0"
+     inkscape:snap-object-midpoints="true"
+     inkscape:snap-midpoints="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid1px"
+       originx="0"
+       originy="0"
+       dotted="false"
+       snapvisiblegridlinesonly="false"
+       spacingx="0.5"
+       spacingy="0.5"
+       enabled="true"
+       visible="true"
+       units="px"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Layer"
+     style="display:inline"
+     transform="translate(0,-1029.8622)">
+    <path
+       inkscape:connector-curvature="0"
+       id="rect4497"
+       d="M 0.46874517,1030.331 23.5,1030.3622 v 23 l -23.03125483,0 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#e6f1fa;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00135899;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       sodipodi:nodetypes="ccccc" />
+    <g
+       id="g6087"
+       transform="rotate(10.481171,13.073064,1038.3378)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5412"
+         d="m 5,1050.8622 8,-8 8,8 z"
+         style="fill:url(#linearGradient6040);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:url(#linearGradient6052);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 21,1050.8622 -8,-8 8,-8 z"
+         id="path6050"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6054"
+         d="m 21,1034.8622 -8,8 -8,-8 z"
+         style="fill:url(#linearGradient6056);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:url(#linearGradient6060);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 5,1034.8622 8,8 -8,8 z"
+         id="path6058"
+         inkscape:connector-curvature="0" />
+      <rect
+         y="1034.8622"
+         x="5"
+         height="16"
+         width="16"
+         id="rect5410"
+         style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000005;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6062"
+         d="m 5,1034.8622 16,16"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.1500001;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6064"
+         d="m 5,1050.8622 16,-16"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.1500001;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none" />
+    </g>
+    <rect
+       style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00100005;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
+       id="rect5344"
+       width="23"
+       height="23.000017"
+       x="0.5"
+       y="1030.3622" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_fix_zero-24.svg b/pixmaps/src/gwy_fix_zero-24.svg
new file mode 100644
index 0000000..4caa28d
--- /dev/null
+++ b/pixmaps/src/gwy_fix_zero-24.svg
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8833"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_fix_zero-24.svg">
+  <defs
+     id="defs8835">
+    <linearGradient
+       gradientTransform="translate(-11.142957,824.89612)"
+       xlink:href="#linearGradient4140"
+       id="linearGradient4171"
+       gradientUnits="userSpaceOnUse"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       id="linearGradient4140">
+      <stop
+         style="stop-color:#d7e3f4;stop-opacity:1;"
+         offset="0"
+         id="stop4142" />
+      <stop
+         style="stop-color:#f1f5fb;stop-opacity:1"
+         offset="1"
+         id="stop4144" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.0508967"
+     inkscape:cx="134.69103"
+     inkscape:cy="33.464265"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8838">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-199.64375,-490.06708)">
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 200.64378,494.5671 2,3 c 0,0 0,2.5 1,2.5 h 2 l 1,-2.5 c 0,0 0,-3 1,-4 1,-1 4,-2 4,-2 l 2,4 h 2"
+       id="path8803"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccsccsccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 1;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 215.64378,510.5671 h -15"
+       id="path8805"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 204.64378,502.06708 v 5"
+       id="path8807"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 200.64375,505.06708 4,4 4,-4 z"
+       id="path8226"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 217.14391,489.56708 h 6 v 23 h -6 z"
+       id="rect12874"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#82d636;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 217.64374,498.56719 h 3"
+       id="path12876"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#82d636;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 217.64374,495.56719 h 2.00001"
+       id="path12880"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path12882"
+       d="m 217.64374,492.56719 h 3"
+       style="fill:#82d636;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:#82d636;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 217.64374,507.56719 h 2.00001"
+       id="path12884"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:#82d636;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 217.64374,501.56719 h 2.00001"
+       id="path12890"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path12892"
+       d="m 217.64374,504.56719 h 3"
+       style="fill:#82d636;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:#82d636;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 217.64374,510.56719 h 3"
+       id="path8091"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 200.64375,500.56708 h 15"
+       id="path4818"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_flip_horizontally-24.svg b/pixmaps/src/gwy_flip_horizontally-24.svg
new file mode 100644
index 0000000..12b662b
--- /dev/null
+++ b/pixmaps/src/gwy_flip_horizontally-24.svg
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="gwy_flip_horizontally.svg"
+   inkscape:export-filename="gwy_flip_horizontally-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8095">
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8458"
+       x="-0.12856513"
+       width="1.2571303"
+       y="-0.11250482"
+       height="1.2250096">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.16275744"
+         id="feGaussianBlur8460" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.9424621"
+     inkscape:cx="10.376708"
+     inkscape:cy="-14.352711"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77811,-595.10722)">
+    <path
+       style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 251.27811,602.60722 -4.75586,4.5 4.75586,4 0,-1.5 10.98242,0 0,1.5 4.75586,-4 -4.75586,-4.5 0,2 -10.96484,0 z"
+       id="path8069"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccc" />
+    <path
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 247.77811,607.10722 2.04551,-1.97639 0.89043,-1.02933 c 0,0 0.20217,1.02827 -0.81737,2.15403 -1.01955,1.12575 -1.29524,1.31798 -1.29524,1.31798 z"
+       id="path8400"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccscc" />
+    <path
+       sodipodi:nodetypes="ccccsc"
+       inkscape:connector-curvature="0"
+       id="path8462"
+       d="m 248.25595,597.40694 7.92078,7.64259 c 0.78644,-0.69253 0.27926,-0.20275 0.86026,-0.71903 0,0 0.41294,0.95999 -0.6066,2.08575 -0.31728,0.41341 -7.72954,-7.84089 -8.35149,-8.62932 -0.34388,-0.43593 -0.0819,-0.56315 0.17705,-0.37999 z"
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       transform="matrix(0.72160439,-0.69230564,0.69230564,0.72160439,-340.9462,345.93597)" />
+    <path
+       transform="matrix(0.72160439,-0.69230564,0.69230564,0.72160439,-352.64478,346.09382)"
+       style="opacity:0.26000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 253.47872,607.61144 1.81198,-1.81975 0.89043,-1.02933 c 0,0 0.0967,0.57698 -0.92284,1.70274 -1.01955,1.12575 -1.31704,1.26648 -1.31704,1.26648 z"
+       id="path8466"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccscc" />
+    <path
+       sodipodi:nodetypes="cccscc"
+       inkscape:connector-curvature="0"
+       id="path8468"
+       d="m 253.47872,607.61144 1.81198,-1.81975 0.89043,-1.02933 c 0,0 0.0967,0.57698 -0.92284,1.70274 -1.01955,1.12575 -1.31704,1.26648 -1.31704,1.26648 z"
+       style="opacity:0.26000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       transform="matrix(0.99413845,0.10811449,-0.10811449,0.99413845,76.644805,-22.049751)" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_flip_vertically-24.svg b/pixmaps/src/gwy_flip_vertically-24.svg
new file mode 100644
index 0000000..59dcdf4
--- /dev/null
+++ b/pixmaps/src/gwy_flip_vertically-24.svg
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="gwy_flip_vertically.svg"
+   inkscape:export-filename="gwy_flip_vertically-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8095">
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8458"
+       x="-0.12856513"
+       width="1.2571303"
+       y="-0.11250482"
+       height="1.2250096">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.16275744"
+         id="feGaussianBlur8460" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="6.8758481"
+     inkscape:cx="40.440276"
+     inkscape:cy="4.2224812"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77811,-595.10722)">
+    <path
+       style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 261.27782,601.61601 -4.5,-4.75586 -4,4.75586 1.5,0 0,10.98242 -1.5,0 4.00029,4.75586 4.49971,-4.75586 -2,0 0,-10.96484 z"
+       id="path8069"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccc" />
+    <path
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 247.77811,607.10722 2.04551,-1.97639 0.82671,-0.67886 c 0,0 0.26589,0.6778 -0.75365,1.80356 -1.01955,1.12575 -1.29524,1.31798 -1.29524,1.31798 z"
+       id="path8400"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccscc"
+       transform="matrix(0,1,1,0,-350.22145,350.3379)" />
+    <path
+       sodipodi:nodetypes="ccccsc"
+       inkscape:connector-curvature="0"
+       id="path8462"
+       d="m 248.61675,597.75309 7.55998,7.29644 c 0.78644,-0.69253 0.27926,-0.20275 0.86026,-0.71903 -0.13014,0.0245 0.32045,0.66081 -0.1642,1.68599 -0.31728,0.41341 -8.15784,-6.4268 -8.77979,-7.21523 -0.34388,-0.43593 0.2648,-1.23133 0.52375,-1.04817 z"
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       transform="matrix(-0.69230564,0.72160439,0.72160439,0.69230564,-3.9809235,9.3917012)" />
+    <path
+       transform="matrix(0.69230564,0.72160439,-0.72160439,0.69230564,517.85974,-1.3068788)"
+       style="opacity:0.26000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 253.11792,607.26529 1.81198,-1.81975 0.89043,-1.02933 c 0,0 0.0967,0.57698 -0.92284,1.70274 -1.01955,1.12575 -1.31704,1.26648 -1.31704,1.26648 z"
+       id="path8466"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccscc" />
+    <path
+       sodipodi:nodetypes="cccscc"
+       inkscape:connector-curvature="0"
+       id="path8468"
+       d="m 253.47872,607.61144 1.81198,-1.81975 0.89043,-1.02933 c 0,0 0.0967,0.57698 -0.92284,1.70274 -1.01955,1.12575 -1.31704,1.26648 -1.31704,1.26648 z"
+       style="opacity:0.26000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       transform="matrix(0.10811449,0.99413845,0.99413845,-0.10811449,-372.13411,426.79066)" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_fractal-24.svg b/pixmaps/src/gwy_fractal-24.svg
new file mode 100644
index 0000000..781e915
--- /dev/null
+++ b/pixmaps/src/gwy_fractal-24.svg
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8798"
+     version="1.1"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_fractal_measure-24.svg">
+    <defs
+         id="defs8800" />
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="30.228461"
+         inkscape:cx="12.720968"
+         inkscape:cy="10.017425"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:document-rotation="0"
+         inkscape:snap-nodes="true"
+         inkscape:snap-bbox="true"
+         inkscape:snap-global="false">
+        <inkscape:grid
+             type="xygrid"
+             id="grid1px"
+             originx="0"
+             originy="0"
+             dotted="false"
+             snapvisiblegridlinesonly="false"
+             spacingx="1.0"
+             spacingy="1.0"
+             enabled="true"
+             visible="true" />
+    </sodipodi:namedview>
+    <metadata
+         id="metadata8803">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-18.260046,-413.54694)">
+        <path
+             style="fill:#000000;stroke:#000000;stroke-width:0.29388463;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 34.979779,436.19982 c -0.274935,-0.11051 -0.433852,-0.33636 -0.433852,-0.61656 0,-0.15387 0.03091,-0.24406 0.147179,-0.42925 0.09086,-0.14472 0.09231,-0.15061 0.09003,-0.36372 -0.0025,-0.24994 0.02089,-0.34016 0.128469,-0.49185 l 0.0775,-0.10927 -0.18044,-0.009 c -0.212196,-0.0107 -0.325895,-0.0588 -0.461474,-0.19475 -0.05198,-0.0522 -0.121064,-0.10877 -0.153519,-0.12582 -0.115784,-0.0608 -0.301948,-0.21913 -0.358627,-0.30495 -0.08834,-0.13377 -0.118074,-0.25114 -0.1075 [...]
+             id="path6419"
+             inkscape:connector-curvature="0" />
+        <path
+             style="fill:#7db846;fill-opacity:1;stroke-width:0.02351093"
+             d="m 35.1409,435.60336 c -0.0087,-0.0229 9.72e-4,-0.0504 0.02425,-0.0672 0.02149,-0.0158 0.03909,-0.0463 0.03909,-0.0679 0,-0.0246 0.04402,-0.0589 0.117522,-0.0915 0.105319,-0.0466 0.117528,-0.0599 0.117556,-0.12655 1.5e-5,-0.041 0.0059,-0.0898 0.01311,-0.1086 0.0083,-0.0215 -0.0054,-0.0389 -0.03731,-0.0473 -0.06727,-0.0176 -0.05203,-0.0963 0.02067,-0.10658 0.04621,-0.006 0.05234,-0.0173 0.03934,-0.0691 -0.0084,-0.0337 -0.03584,-0.09 -0.06085,-0.12516 -0.02499,-0.0351 -0.045 [...]
+             id="path6421"
+             inkscape:connector-curvature="0" />
+        <rect
+             style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+             id="rect12874-3"
+             width="5.9999995"
+             height="22"
+             x="3.7601953"
+             y="413.04694" />
+        <path
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 4.2600362,421.04705 h 3"
+             id="path12876-6"
+             inkscape:connector-curvature="0" />
+        <path
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 4.2600362,418.04705 h 2.00001"
+             id="path12880-7"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="cc" />
+        <path
+             inkscape:connector-curvature="0"
+             id="path12882-5"
+             d="m 4.2600362,415.04705 h 3"
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 4.2600362,430.04705 h 2.00001"
+             id="path12884-3"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="cc" />
+        <path
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 4.2600362,424.04705 h 2.00001"
+             id="path12890-5"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="cc" />
+        <path
+             inkscape:connector-curvature="0"
+             id="path12892-6"
+             d="m 4.2600362,427.04705 h 3"
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 4.2600362,433.04705 h 3"
+             id="path8091-2"
+             inkscape:connector-curvature="0" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_fractal_correction-24.svg b/pixmaps/src/gwy_fractal_correction-24.svg
new file mode 100644
index 0000000..70a76e6
--- /dev/null
+++ b/pixmaps/src/gwy_fractal_correction-24.svg
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9100"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_fractal_correction-24.svg">
+  <defs
+     id="defs9102" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16.775663"
+     inkscape:cx="-21.984552"
+     inkscape:cy="7.9284822"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9105">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-442.76529,-683.29364)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect11370-6"
+       width="23.000002"
+       height="23.000002"
+       x="443.26529"
+       y="683.79364" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#daa39c;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000018, 3.00000017999999979;stroke-dashoffset:1.50000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate;font-variant-east_asian:normal;vector-effect:none"
+       d="M 2.5 2.5 L 2.5 13.5 L 10.5 13.5 L 10.5 21.5 L 21.5 21.5 L 21.5 10.5 L 13.5 10.5 L 13.5 2.5 L 2.5 2.5 z "
+       transform="translate(442.76529,683.29364)"
+       id="rect11972" />
+    <g
+       id="g8437"
+       transform="matrix(1.5,0,0,1.5,-104.3997,-90.510326)"
+       style="stroke:#db2424;stroke-opacity:1">
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 373.44052,524.5011 4.02276,4.02277"
+         id="path8433"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8435"
+         d="m 373.44052,528.52387 4.02276,-4.02277"
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <g
+       style="stroke:#db2424;stroke-opacity:1"
+       transform="matrix(1.5,0,0,1.5,-112.3997,-98.510326)"
+       id="g8083">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8085"
+         d="m 373.44052,524.5011 4.02276,4.02277"
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 373.44052,528.52387 4.02276,-4.02277"
+         id="path8087"
+         inkscape:connector-curvature="0" />
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 457.17859,702.02627 c -0.0183,-0.0772 -0.0329,-0.13919 -0.0547,-0.21875 -0.39553,-1.44599 -1.06043,-1.33656 -1.14034,-2.82804 -0.42549,1.48234 -0.7642,1.56111 -1.3019,2.93937 m 2.4969,0.10742 c 0.69617,2.93038 1.44529,3.5918 1.44529,3.5918 0,0 0.63269,-1.52319 1.73873,-2.28516 0.50287,-0.34643 1.06639,-0.91115 1.74806,0.32685 1.10603,1.43926 0.55328,1.86276 1.10629,1.43945 0.55302,-0.42331 0.70979,-1.83273 0.70979,-1.83273 l 0.0699,-0.95001 c 0,0 0.895,-3.0166 2.02959,-0.5926 [...]
+       id="path8538"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="csccccscsccccssscsc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_fractal_measure-24.svg b/pixmaps/src/gwy_fractal_measure-24.svg
new file mode 100644
index 0000000..65521b7
--- /dev/null
+++ b/pixmaps/src/gwy_fractal_measure-24.svg
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8798"
+     version="1.1"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_fractal_measure-24.svg">
+    <defs
+         id="defs8800" />
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="30.228461"
+         inkscape:cx="17.906784"
+         inkscape:cy="11.340681"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:document-rotation="0"
+         inkscape:snap-nodes="true"
+         inkscape:snap-bbox="true"
+         inkscape:snap-global="true"
+         inkscape:bbox-nodes="true">
+        <inkscape:grid
+             type="xygrid"
+             id="grid1px"
+             originx="0"
+             originy="0"
+             dotted="false"
+             snapvisiblegridlinesonly="false"
+             spacingx="0.5"
+             spacingy="0.5"
+             enabled="true"
+             visible="true"
+             units="px"
+             empspacing="2" />
+    </sodipodi:namedview>
+    <metadata
+         id="metadata8803">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-18.260046,-413.54694)">
+        <g
+             id="g7460"
+             transform="matrix(0.86347341,0,0,0.86347341,5.7445822,55.445971)">
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path6419"
+                 d="m 34.979779,436.19982 c -0.274935,-0.11051 -0.433852,-0.33636 -0.433852,-0.61656 0,-0.15387 0.03091,-0.24406 0.147179,-0.42925 0.09086,-0.14472 0.09231,-0.15061 0.09003,-0.36372 -0.0025,-0.24994 0.02089,-0.34016 0.128469,-0.49185 l 0.0775,-0.10927 -0.18044,-0.009 c -0.212196,-0.0107 -0.325895,-0.0588 -0.461474,-0.19475 -0.05198,-0.0522 -0.121064,-0.10877 -0.153519,-0.12582 -0.115784,-0.0608 -0.301948,-0.21913 -0.358627,-0.30495 -0.08834,-0.13377 -0.118074,-0.25114 -0. [...]
+                 style="fill:#000000;stroke:#000000;stroke-width:0.29388463;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+            <path
+                 inkscape:connector-curvature="0"
+                 id="path6421"
+                 d="m 35.1409,435.60336 c -0.0087,-0.0229 9.72e-4,-0.0504 0.02425,-0.0672 0.02149,-0.0158 0.03909,-0.0463 0.03909,-0.0679 0,-0.0246 0.04402,-0.0589 0.117522,-0.0915 0.105319,-0.0466 0.117528,-0.0599 0.117556,-0.12655 1.5e-5,-0.041 0.0059,-0.0898 0.01311,-0.1086 0.0083,-0.0215 -0.0054,-0.0389 -0.03731,-0.0473 -0.06727,-0.0176 -0.05203,-0.0963 0.02067,-0.10658 0.04621,-0.006 0.05234,-0.0173 0.03934,-0.0691 -0.0084,-0.0337 -0.03584,-0.09 -0.06085,-0.12516 -0.02499,-0.0351 -0 [...]
+                 style="fill:#7db846;fill-opacity:1;stroke-width:0.02351093" />
+        </g>
+        <rect
+             style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+             id="rect12874-3"
+             width="4.9999962"
+             height="22"
+             x="432.04694"
+             y="-40.760048"
+             transform="rotate(90)" />
+        <path
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 32.760046,432.54694 v 3"
+             id="path12876-6"
+             inkscape:connector-curvature="0" />
+        <path
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 35.760046,432.54693 v 2.00001"
+             id="path12880-7"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="cc" />
+        <path
+             inkscape:connector-curvature="0"
+             id="path12882-5"
+             d="m 38.760046,432.54694 v 3"
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 23.760046,432.54693 v 2.00001"
+             id="path12884-3"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="cc" />
+        <path
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 29.760046,432.54693 v 2.00001"
+             id="path12890-5"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="cc" />
+        <path
+             inkscape:connector-curvature="0"
+             id="path12892-6"
+             d="m 26.760046,432.54694 v 3"
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 20.760046,432.54694 v 3"
+             id="path8091-2"
+             inkscape:connector-curvature="0" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_gl_material-16.svg b/pixmaps/src/gwy_gl_material-16.svg
new file mode 100644
index 0000000..e5aba0a
--- /dev/null
+++ b/pixmaps/src/gwy_gl_material-16.svg
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="16"
+     height="16"
+     viewBox="0 0 16 16"
+     id="svg8691"
+     version="1.1"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_gl_material-16.svg"
+     inkscape:export-filename="gwy_palettes-16.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="21.764465"
+         inkscape:cx="2.7330245"
+         inkscape:cy="5.1532646"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1379"
+         inkscape:window-height="1023"
+         inkscape:window-x="531"
+         inkscape:window-y="33"
+         inkscape:window-maximized="0"
+         units="px"
+         inkscape:document-rotation="0">
+        <inkscape:grid
+             visible="true"
+             enabled="true"
+             spacingy="1.0"
+             spacingx="1.0"
+             snapvisiblegridlinesonly="false"
+             dotted="false"
+             originy="0"
+             originx="0"
+             id="grid1px"
+             type="xygrid" />
+    </sodipodi:namedview>
+    <defs
+         id="defs8693">
+        <linearGradient
+             gradientTransform="translate(-224.02837,-448.99442)"
+             gradientUnits="userSpaceOnUse"
+             y2="452.99442"
+             x2="247.02837"
+             y1="452.99442"
+             x1="224.02837"
+             id="linearGradient8128-3"
+             xlink:href="#linearGradient8122-6"
+             inkscape:collect="always" />
+        <linearGradient
+             id="linearGradient8122-6"
+             inkscape:collect="always">
+            <stop
+                 id="stop8124-7"
+                 offset="0"
+                 style="stop-color:#000000;stop-opacity:1;" />
+            <stop
+                 id="stop8126-5"
+                 offset="1"
+                 style="stop-color:#ffffff;stop-opacity:1" />
+        </linearGradient>
+    </defs>
+    <metadata
+         id="metadata8696">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title />
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         transform="translate(-224.02837,-456.99442)"
+         id="layer1"
+         inkscape:groupmode="layer"
+         inkscape:label="Layer 1">
+        <image
+             image-rendering="optimizeSpeed"
+             id="image144"
+             xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACvklEQVQ4y3WTPYgkRRzFf9Vd3b09
+3bszO3Pr7nkniicrB2KmnJGCgZkfnB+psZnBgYFccImBXHKioGKgiGCsJsohxiYaKQYnJwpy7vRM
+d091VXVXVxkseyx+/LMH7/d4wf8J/ude/vjdB0QUPdh3uuw36papm59vXnvb/dMnTotXPn0/ysri
+skzTN2MpHw3eMxiDaRrUcvXn5s7Rh2q5fOv7Dz7RJ0x8Cs63drY/L+e7V6dnFvvbsyl5USClBCB4
+X/pxfHJQ+qXpfee+vvPTL0uA6CQg2co+K3dnL8z39rjn4ICz955j/2Cf+WJOUZZk2RZJlpEUk8Mo
+jm/e/8Tj+3cDXvzoxqtpnj8/KQqm0x0Wu3MWO3Nm2zPKomQrzYjjGAEIIZBZdj6E8M7pBm/EcYSM
+ItJYkooYiSAGxOhhHAnO4QeHd47gPRAuF3uLh+TTV68cejc+PPYDzlqs6uhkSh9HaKXo6hrdbrBK
+0WuDMxbX93jvo+D9c3Lsh0ecsdiNQqU1CRGD6oiEwCpFXVU0R0u6dYNtW3ql6FWH6zTjMFyUtmkT
+U0yIpUSMHqc1TZoiQqDXBlU3tNUKVVXousE0LbZpMe0G78ZUdtXqtzhNIASc0eg6Q8YxwQecsRil
+6JoWXdd0qxq9WqNXa2zTAPwh1V/LH4CNd2PZT3LiJEEIQfCe0fb0WmM3CtO2mHVDV1WoZYWzPcB3
+cfXrbZfvzs4H7x9z/cCgNf1GYZoW3TToukava8xqfQwfVfTtBuAW8LoAWBxe2Esnkx/z3dlZmaUI
+ER03cAPOWHrVYdsWUzcM2kAIAXhm6PQ3d7dQnFlcSib5V0mez6NEQgiMg8NZy6ANzhi8cwABuDJ0
++vq/xpSWxUXgvUjKp46fBYIfCT6cWH4HXhs6/cV/rhEgmeQCuAQ8C1wAcuA28C3w5dBpe9r/Nxya
+icVQecKcAAAAAElFTkSuQmCC
+"
+             preserveAspectRatio="none"
+             height="16"
+             width="16"
+             x="224.02837"
+             y="456.99442" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_gradient_horizontal-24.svg b/pixmaps/src/gwy_gradient_horizontal-24.svg
new file mode 100644
index 0000000..f9b3322
--- /dev/null
+++ b/pixmaps/src/gwy_gradient_horizontal-24.svg
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="6.3499999mm"
+   height="6.3499999mm"
+   viewBox="0 0 22.499999 22.499999"
+   id="svg8233"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_gradient_horizontal-24.svg">
+  <defs
+     id="defs8235">
+    <linearGradient
+       id="linearGradient8308-6"
+       inkscape:collect="always">
+      <stop
+         style="stop-color:#c3ddf3;stop-opacity:1"
+         offset="0"
+         id="stop8312-3" />
+      <stop
+         id="stop8351-5"
+         offset="0.5"
+         style="stop-color:#4696db;stop-opacity:1" />
+      <stop
+         style="stop-color:#0c1e2d;stop-opacity:1"
+         offset="1"
+         id="stop8310-7" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308-6"
+       id="linearGradient8428"
+       x1="410.3909"
+       y1="674.39813"
+       x2="399.1409"
+       y2="674.39813"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.6666668,0,0,1.6666668,-269.84402,-449.59887)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="6.0134032"
+     inkscape:cx="-27.491756"
+     inkscape:cy="-7.3792275"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8238">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-393.51587,-663.14807)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8276"
+       width="21.5625"
+       height="21.5625"
+       x="393.98462"
+       y="663.61682" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:url(#linearGradient8428);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.93749982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.93749991, 0.93749991000000021;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path8420"
+       cx="404.76587"
+       cy="674.39807"
+       r="9.375" />
+    <circle
+       r="3.7499998"
+       cy="674.39807"
+       cx="404.76587"
+       id="circle8432"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.93749994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.93749991, 0.93749991;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_gradient_vertical-24.svg b/pixmaps/src/gwy_gradient_vertical-24.svg
new file mode 100644
index 0000000..21b947a
--- /dev/null
+++ b/pixmaps/src/gwy_gradient_vertical-24.svg
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="6.3499999mm"
+   height="6.3499999mm"
+   viewBox="0 0 22.499999 22.499999"
+   id="svg8233"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_gradient_vertical-24.svg">
+  <defs
+     id="defs8235">
+    <linearGradient
+       id="linearGradient8308-6"
+       inkscape:collect="always">
+      <stop
+         style="stop-color:#c3ddf3;stop-opacity:1"
+         offset="0"
+         id="stop8312-3" />
+      <stop
+         id="stop8351-5"
+         offset="0.5"
+         style="stop-color:#4696db;stop-opacity:1" />
+      <stop
+         style="stop-color:#0c1e2d;stop-opacity:1"
+         offset="1"
+         id="stop8310-7" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308-6"
+       id="linearGradient8428"
+       x1="410.3909"
+       y1="674.39813"
+       x2="399.1409"
+       y2="674.39813"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.6666668,0,0,1.6666668,-269.84402,-449.59887)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.009928"
+     inkscape:cx="28.772913"
+     inkscape:cy="3.116967"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8238">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-393.51587,-663.14807)">
+    <g
+       id="g8426"
+       transform="rotate(90,404.76587,674.39807)">
+      <rect
+         y="663.61682"
+         x="393.98462"
+         height="21.5625"
+         width="21.5625"
+         id="rect8276"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <circle
+         r="9.375"
+         cy="674.39807"
+         cx="404.76587"
+         id="path8420"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:url(#linearGradient8428);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.93749982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.93749991, 0.93749991;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <circle
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.93749994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.93749991, 0.93749991;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="circle8432"
+         cx="404.76587"
+         cy="674.39807"
+         r="3.7499998" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_grain_correlation-24.svg b/pixmaps/src/gwy_grain_correlation-24.svg
new file mode 100644
index 0000000..28883e2
--- /dev/null
+++ b/pixmaps/src/gwy_grain_correlation-24.svg
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8456"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_grain_correlation-24.svg"
+   inkscape:export-filename="gwy_grains_remove.svg.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8458">
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient9160"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.70751116,0,0,0.70751116,-147.80052,139.40973)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8413">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop8415" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop8417" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient9156"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.70751116,0,0,0.70751116,-154.80052,131.4097)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.85161289,0,0,0.85161289,-212.60885,62.477179)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8423"
+       gradientUnits="userSpaceOnUse"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776"
+       gradientTransform="matrix(0.79354837,0,0,0.79354837,-179.3302,86.073509)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8419"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-263.9876,-28.713451)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="15.297933"
+     inkscape:cx="-14.251904"
+     inkscape:cy="21.764567"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8461">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-93.477875,-492.22305)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect11370"
+       width="23.000002"
+       height="23.000002"
+       x="93.977875"
+       y="492.72305" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8419);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path8411"
+       cx="102.47787"
+       cy="498.22305"
+       r="4.2401776" />
+    <circle
+       r="3.3647861"
+       cy="504.22305"
+       cx="111.47787"
+       id="circle8421"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8423);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8427);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle8425"
+       cx="99.477875"
+       cy="511.22305"
+       r="3.61099" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient9156);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle9154"
+       cx="104.47787"
+       cy="504.22305"
+       r="2.9999731" />
+    <circle
+       r="2.9999731"
+       cy="512.22302"
+       cx="111.47787"
+       id="circle9158"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient9160);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect12632"
+       width="3"
+       height="2.9999461"
+       x="95.977875"
+       y="510.72305" />
+    <rect
+       y="505.72305"
+       x="99.977867"
+       height="2.9999461"
+       width="3"
+       id="rect8458"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8460"
+       width="3"
+       height="2.9999461"
+       x="103.97787"
+       y="500.72311" />
+    <rect
+       y="493.72305"
+       x="111.97787"
+       height="2.9999461"
+       width="3"
+       id="rect8462"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8464"
+       width="3"
+       height="2.9999461"
+       x="107.97787"
+       y="497.72311" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 98.477875,515.22305 17.999995,-19"
+       id="path8577"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_grain_exscribed_circle-24.svg b/pixmaps/src/gwy_grain_exscribed_circle-24.svg
new file mode 100644
index 0000000..ee0ee10
--- /dev/null
+++ b/pixmaps/src/gwy_grain_exscribed_circle-24.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_grain_exscribed_circle-24.svg">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="10.232297"
+     inkscape:cx="-3.4205242"
+     inkscape:cy="16.313673"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 132.83165,609.84668 h 15 v 13 h -15 z"
+       id="rect11972"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path8416"
+       cx="140.33165"
+       cy="616.34668"
+       r="11" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_grain_inscribed_circle-24.svg b/pixmaps/src/gwy_grain_inscribed_circle-24.svg
new file mode 100644
index 0000000..9d17fd5
--- /dev/null
+++ b/pixmaps/src/gwy_grain_inscribed_circle-24.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_grain_inscribed_circle-24.svg">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4.287914"
+     inkscape:cx="4.0362713"
+     inkscape:cy="-2.183264"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.99999993, 2.99999993;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 128.83165,604.84668 h 22.99999 v 23 h -22.99999 z"
+       id="rect11972"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path8416"
+       cx="140.33165"
+       cy="616.34668"
+       r="10" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_grains-24.svg b/pixmaps/src/gwy_grains-24.svg
new file mode 100644
index 0000000..a882e0d
--- /dev/null
+++ b/pixmaps/src/gwy_grains-24.svg
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8798"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="gwy_grains.svg">
+  <defs
+     id="defs8800">
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient9160"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.70751116,0,0,0.70751116,-223.01835,60.733619)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8413">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop8415" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop8417" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient9156"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.70751116,0,0,0.70751116,-230.01835,52.733589)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.85161289,0,0,0.85161289,-287.82667,-16.198931)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8423"
+       gradientUnits="userSpaceOnUse"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776"
+       gradientTransform="matrix(0.79354837,0,0,0.79354837,-254.54802,7.3973986)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8419"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-339.20542,-107.38956)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="17.863816"
+     inkscape:cx="13.485138"
+     inkscape:cy="20.439639"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata8803">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-18.260046,-413.54694)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect11370"
+       width="23.000002"
+       height="23.000002"
+       x="18.760046"
+       y="414.04694" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8419);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path8411"
+       cx="27.260046"
+       cy="419.54694"
+       r="4.2401776" />
+    <circle
+       r="3.3647861"
+       cy="425.54694"
+       cx="36.260048"
+       id="circle8421"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8423);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8427);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle8425"
+       cx="24.260046"
+       cy="432.54694"
+       r="3.61099" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient9156);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle9154"
+       cx="29.260046"
+       cy="425.54694"
+       r="2.9999731" />
+    <circle
+       r="2.9999731"
+       cy="433.54694"
+       cx="36.260048"
+       id="circle9158"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient9160);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_grains_edge-24.svg b/pixmaps/src/gwy_grains_edge-24.svg
new file mode 100644
index 0000000..c47100d
--- /dev/null
+++ b/pixmaps/src/gwy_grains_edge-24.svg
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8798"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_grains_edge-24.svg">
+  <defs
+     id="defs8800">
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient9160"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.70751116,0,0,0.70751116,-223.01835,60.733619)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8413">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop8415" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop8417" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient9156"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.70751116,0,0,0.70751116,-233.01835,53.233589)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.85161289,0,0,0.85161289,-287.82667,-16.198931)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8423"
+       gradientUnits="userSpaceOnUse"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776"
+       gradientTransform="matrix(0.79354837,0,0,0.79354837,-254.54802,7.3973986)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8419"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-342.20542,-107.38956)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4.6430859"
+     inkscape:cx="-167.03701"
+     inkscape:cy="61.221174"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg8798"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8803">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-18.260046,-413.54694)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect11370"
+       width="23.000002"
+       height="23.000002"
+       x="18.760046"
+       y="414.04694" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8419);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path8411"
+       cx="24.260046"
+       cy="419.54694"
+       r="4.2401776" />
+    <circle
+       r="3.3647861"
+       cy="425.54694"
+       cx="36.260048"
+       id="circle8421"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8423);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8427);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle8425"
+       cx="24.260046"
+       cy="432.54694"
+       r="3.61099" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient9156);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle9154"
+       cx="26.260046"
+       cy="426.04694"
+       r="2.9999731" />
+    <circle
+       r="2.9999731"
+       cy="433.54694"
+       cx="36.260048"
+       id="circle9158"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient9160);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+  </g>
+  <g
+     transform="matrix(0.4893616,0,0,0.47826111,-84.587175,-225.64567)"
+     id="layer1-6"
+     inkscape:label="Layer 1"
+     style="stroke-width:2.06705737">
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="rect11370-7"
+       d="m 195.33035,473.89525 22.46648,-0.0119 v 25.09091 l -22.46648,0.0119 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.06705737;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.06705737;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 207.59123,473.89526 h 12.26087 v 25.09089 h -12.26087 z"
+       id="rect8153"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="rect4972"
+       d="m 201.46079,478.07707 h 12.26087 v 16.72726 h -12.26087 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:4.13411474;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4.13411467;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 193.28688,473.89526 v 27.1818 h 26.56522"
+       id="path8599"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_grains_edge_remove-24.svg b/pixmaps/src/gwy_grains_edge_remove-24.svg
new file mode 100644
index 0000000..19445a7
--- /dev/null
+++ b/pixmaps/src/gwy_grains_edge_remove-24.svg
@@ -0,0 +1,296 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8456"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_grains_edge_remove-24.svg"
+   inkscape:export-filename="gwy_grains_remove.svg.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8458">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8413">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop8415" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop8417" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient4766"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-254.12726,-31.177879)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <radialGradient
+       r="4.2401776"
+       fy="526.93652"
+       fx="366.46545"
+       cy="526.93652"
+       cx="366.46545"
+       gradientTransform="matrix(0.70751116,0,0,0.70751116,-147.45521,139.48342)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient9160"
+       xlink:href="#linearGradient8413"
+       inkscape:collect="always" />
+    <radialGradient
+       r="4.2401776"
+       fy="526.93652"
+       fx="366.46545"
+       cy="526.93652"
+       cx="366.46545"
+       gradientTransform="matrix(0.70751116,0,0,0.70751116,-154.45521,131.48339)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient9156"
+       xlink:href="#linearGradient8413"
+       inkscape:collect="always" />
+    <radialGradient
+       r="4.2401776"
+       fy="526.93652"
+       fx="366.46545"
+       cy="526.93652"
+       cx="366.46545"
+       gradientTransform="matrix(0.85161289,0,0,0.85161289,-212.26353,62.550867)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient8427-7"
+       xlink:href="#linearGradient8413"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientTransform="matrix(0.79354837,0,0,0.79354837,-178.98488,86.147197)"
+       r="4.2401776"
+       fy="526.93652"
+       fx="366.46545"
+       cy="526.93652"
+       cx="366.46545"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient8423-5"
+       xlink:href="#linearGradient8413"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientTransform="translate(-263.64228,-28.639762)"
+       gradientUnits="userSpaceOnUse"
+       r="4.2401776"
+       fy="526.93652"
+       fx="366.46545"
+       cy="526.93652"
+       cx="366.46545"
+       id="radialGradient8419-3"
+       xlink:href="#linearGradient8413"
+       inkscape:collect="always" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient4815"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-270.14432,-23.694959)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient4825"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-259.64432,-13.694959)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="13.022743"
+     inkscape:cx="-12.787313"
+     inkscape:cy="18.679375"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8461">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-93.477875,-492.22305)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect11370"
+       width="23.000002"
+       height="23.000002"
+       x="93.977875"
+       y="492.72305" />
+    <circle
+       r="4.2401776"
+       cy="495.75861"
+       cx="112.3382"
+       id="circle4764"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient4766);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:0.49803922;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8488"
+       width="8"
+       height="8"
+       x="108.47787"
+       y="492.22305" />
+    <g
+       id="g8441"
+       transform="matrix(1.5,0,0,1.5,-443.88835,-307.5793)"
+       style="stroke:#db2424;stroke-opacity:1">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8429"
+         d="m 368.89943,533.85685 4.02276,4.02277"
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 368.89943,537.87962 4.02276,-4.02277"
+         id="path8431"
+         inkscape:connector-curvature="0" />
+    </g>
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8419-3);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path8411-9"
+       cx="102.82319"
+       cy="498.29672"
+       r="4.2401776" />
+    <circle
+       r="3.3647861"
+       cy="504.29672"
+       cx="111.82319"
+       id="circle8421-1"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8423-5);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8427-7);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle8425-2"
+       cx="99.823189"
+       cy="511.29675"
+       r="3.61099" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient9156);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle9154"
+       cx="104.82319"
+       cy="504.29672"
+       r="2.9999731" />
+    <circle
+       r="2.9999731"
+       cy="512.29675"
+       cx="111.82319"
+       id="circle9158"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient9160);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient4815);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle4807"
+       cx="96.321144"
+       cy="503.24152"
+       r="4.2401776" />
+    <rect
+       y="499.22305"
+       x="92.477875"
+       height="8"
+       width="8"
+       id="rect8490"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:0.49803922;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <g
+       style="stroke:#db2424;stroke-opacity:1"
+       transform="matrix(1.5,0,0,1.5,-459.90541,-300.56222)"
+       id="g4813">
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 368.89943,533.85685 4.02276,4.02277"
+         id="path4809"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4811"
+         d="m 368.89943,537.87962 4.02276,-4.02277"
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <circle
+       r="4.2401776"
+       cy="513.24152"
+       cx="106.82114"
+       id="circle4817"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient4825);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:0.49803922;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8492"
+       width="8"
+       height="8"
+       x="102.47787"
+       y="509.22305" />
+    <g
+       id="g4823"
+       transform="matrix(1.5,0,0,1.5,-449.90541,-290.59638)"
+       style="stroke:#db2424;stroke-opacity:1">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4819"
+         d="m 368.89943,533.85685 4.02276,4.02277"
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 368.89943,537.87962 4.02276,-4.02277"
+         id="path4821"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_grains_graph-24.svg b/pixmaps/src/gwy_grains_graph-24.svg
new file mode 100644
index 0000000..8601610
--- /dev/null
+++ b/pixmaps/src/gwy_grains_graph-24.svg
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8823"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_grains_graph-24.svg">
+  <defs
+     id="defs8825">
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient9160"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.70751116,0,0,0.70751116,164.08108,153.30522)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8413">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop8415" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop8417" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient9156"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.70751116,0,0,0.70751116,155.58111,160.80519)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.85161289,0,0,0.85161289,97.772786,91.872666)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8423"
+       gradientUnits="userSpaceOnUse"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776"
+       gradientTransform="matrix(0.79354837,0,0,0.79354837,131.05144,115.469)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8419"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(46.394036,0.68203603)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="29.412493"
+     inkscape:cx="11.894518"
+     inkscape:cy="9.8005953"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata8828">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-403.8595,-521.61853)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect11370"
+       width="23.000002"
+       height="23.000002"
+       x="404.3595"
+       y="522.11853" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8419);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path8411"
+       cx="412.8595"
+       cy="527.61853"
+       r="4.2401776" />
+    <circle
+       r="3.3647861"
+       cy="533.61853"
+       cx="421.8595"
+       id="circle8421"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8423);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8427);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle8425"
+       cx="409.8595"
+       cy="540.61853"
+       r="3.61099" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient9156);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle9154"
+       cx="414.8595"
+       cy="533.61853"
+       r="2.9999731" />
+    <circle
+       r="2.9999731"
+       cy="526.11853"
+       cx="423.35947"
+       id="circle9158"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient9160);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect12632"
+       d="m 404.3595,534.11853 3,0 0,11 -3,0 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect12642"
+       d="m 409.3595,530.11853 3,0 0,15 -3,0 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect12644"
+       d="m 414.3595,526.11853 3,0 0,19 -3,0 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect12648"
+       d="m 419.3595,534.11853 3,0 0,11 -3,0 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       inkscape:connector-curvature="0"
+       id="rect12650"
+       d="m 424.3595,540.11853 3,0 0,5 -3,0 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_grains_measure-24.svg b/pixmaps/src/gwy_grains_measure-24.svg
new file mode 100644
index 0000000..f72934e
--- /dev/null
+++ b/pixmaps/src/gwy_grains_measure-24.svg
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8813"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_grains_measure-24.svg">
+  <defs
+     id="defs8815" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.255446"
+     inkscape:cx="-16.128106"
+     inkscape:cy="-22.006109"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8818">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1028.3622)">
+    <path
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:6.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;mark [...]
+       d="m 1.6710318,1042.1392 c 0.15311,-2.5362 0.65088,-5.0307 2.20709,-6.8693 9.2188052,-14.4916 15.1218782,15.0923 4.7472198,13.4009 -4.1714398,0.4287 -7.2702198,-2.5418 -6.9543098,-6.5316 z"
+       id="path9326"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect12874"
+       width="5.9999995"
+       height="22"
+       x="16.500149"
+       y="1028.8622" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 16.99999,1036.8623 3,0"
+       id="path12876"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 16.99999,1033.8623 2.00001,0"
+       id="path12880"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path12882"
+       d="m 16.99999,1030.8623 3,0"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 16.99999,1045.8623 2.00001,0"
+       id="path12884"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 16.99999,1039.8623 2.00001,0"
+       id="path12890"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path12892"
+       d="m 16.99999,1042.8623 3,0"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 16.99999,1048.8623 3,0"
+       id="path8091"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_grains_remove-24.svg b/pixmaps/src/gwy_grains_remove-24.svg
new file mode 100644
index 0000000..948dc1a
--- /dev/null
+++ b/pixmaps/src/gwy_grains_remove-24.svg
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8456"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_grains_remove-24.svg"
+   inkscape:export-filename="gwy_grains_remove.svg.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8458">
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.85161289,0,0,0.85161289,-212.60884,62.477192)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8413">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop8415" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop8417" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8423"
+       gradientUnits="userSpaceOnUse"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776"
+       gradientTransform="matrix(0.79354837,0,0,0.79354837,-179.33019,86.073522)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8419"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-263.98759,-28.713438)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="26.454482"
+     inkscape:cx="-12.629167"
+     inkscape:cy="25.18183"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8461">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-93.477875,-492.22305)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect11370"
+       width="23.000002"
+       height="23.000002"
+       x="93.977875"
+       y="492.72305" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8419);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path8411"
+       cx="102.47787"
+       cy="498.22305"
+       r="4.2401776" />
+    <circle
+       r="3.3647861"
+       cy="504.22305"
+       cx="111.47787"
+       id="circle8421"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8423);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8427);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle8425"
+       cx="99.477875"
+       cy="511.22305"
+       r="3.61099" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:0.49803922;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 1;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="M 7 8 L 7 16 L 14 16 L 14 23 L 22 23 L 22 15 L 15 15 L 15 8 L 7 8 z "
+       transform="translate(93.477875,492.22305)"
+       id="rect8084" />
+    <g
+       id="g8441"
+       transform="matrix(1.5,0,0,1.5,-451.88834,-299.57926)"
+       style="stroke:#db2424;stroke-opacity:1">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8429"
+         d="m 368.89943,533.85685 4.02276,4.02277"
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 368.89943,537.87962 4.02276,-4.02277"
+         id="path8431"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       id="g8437"
+       transform="matrix(1.5,0,0,1.5,-451.69997,-278.54563)"
+       style="stroke:#db2424;stroke-opacity:1">
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 373.44052,524.5011 4.02276,4.02277"
+         id="path8433"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8435"
+         d="m 373.44052,528.52387 4.02276,-4.02277"
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_grains_water-24.svg b/pixmaps/src/gwy_grains_water-24.svg
new file mode 100644
index 0000000..b04e183
--- /dev/null
+++ b/pixmaps/src/gwy_grains_water-24.svg
@@ -0,0 +1,271 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8819"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_grains_water-24.svg"
+   inkscape:export-filename="gwy_grains_water.svg.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8821">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8104">
+      <stop
+         style="stop-color:#0c4359;stop-opacity:1"
+         offset="0"
+         id="stop8106" />
+      <stop
+         style="stop-color:#48b3ff;stop-opacity:1"
+         offset="1"
+         id="stop8108" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter9372"
+       x="-0.24718654"
+       width="1.4943731"
+       y="-0.10159132"
+       height="1.2031826">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.38629044"
+         id="feGaussianBlur9374" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter9285"
+       x="-0.24995747"
+       width="1.4999149"
+       y="-0.27971426"
+       height="1.5594285">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.3478981"
+         id="feGaussianBlur9287" />
+    </filter>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8775"
+       id="radialGradient8781"
+       cx="364.99338"
+       cy="560.16174"
+       fx="364.99338"
+       fy="560.16174"
+       r="5.6896586"
+       gradientTransform="matrix(1.1220435,1.9256242e-6,-3.2093364e-6,1.870051,-335.70458,-692.43152)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8775">
+      <stop
+         id="stop8779"
+         offset="0"
+         style="stop-color:#48ece2;stop-opacity:1" />
+      <stop
+         id="stop8777"
+         offset="1"
+         style="stop-color:#48b3ff;stop-opacity:1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient9160"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.70751116,0,0,0.70751116,-174.60228,-15.348786)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8413">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop8415" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop8417" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient9156"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.70751116,0,0,0.70751116,-180.60228,-23.348816)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.85161289,0,0,0.85161289,-239.29056,-92.403164)"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8423"
+       gradientUnits="userSpaceOnUse"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776"
+       gradientTransform="matrix(0.79354837,0,0,0.79354837,-206.13195,-68.685006)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8413"
+       id="radialGradient8419"
+       cx="366.46545"
+       cy="526.93652"
+       fx="366.46545"
+       fy="526.93652"
+       r="4.2401776"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-289.78935,-183.47197)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8104"
+       id="linearGradient8110"
+       x1="74.644516"
+       y1="359.47131"
+       x2="74.484619"
+       y2="345.40024"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0640071,0,0,1.0640071,-5.4200791,-23.048078)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.1747089"
+     inkscape:cx="227.41547"
+     inkscape:cy="168.87746"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata8824">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-66.676125,-337.46454)"
+     style="opacity:0.98">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect11370"
+       width="23.000002"
+       height="23.000002"
+       x="67.176125"
+       y="337.96454" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8419);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path8411"
+       cx="76.676125"
+       cy="343.46454"
+       r="4.2401776" />
+    <circle
+       r="3.3647861"
+       cy="349.46454"
+       cx="84.676125"
+       id="circle8421"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8423);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299990999999999;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient9156);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle9154"
+       cx="78.676125"
+       cy="349.46454"
+       r="2.9999731" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       id="path8337"
+       d="m 74.155876,359.43194 c -4.325732,-0.4839 -6.70465,-4.7929 -4.782329,-8.28322 0.503966,-1.96836 4.778226,-10.26149 5.50203,-9.87174 -1.091961,4.17438 3.076176,8.16316 4.062617,9.87174 1.743812,3.98813 -0.798474,8.20284 -4.782318,8.28322 z"
+       inkscape:connector-curvature="0"
+       style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <circle
+       r="2.9999731"
+       cy="357.46454"
+       cx="84.676125"
+       id="circle9158"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient9160);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299990999999999;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <circle
+       r="3.61099"
+       cy="356.34271"
+       cx="72.796158"
+       id="circle8425"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient8427);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.83099997;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.49299991, 2.49299991;stroke-dashoffset:1.32959986;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="fill:url(#radialGradient8781);fill-opacity:1;stroke:url(#linearGradient8110);stroke-width:1.06400001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.98039216"
+       inkscape:connector-curvature="0"
+       d="m 74.155876,359.43194 c -4.325732,-0.4839 -6.70465,-4.7929 -4.782329,-8.28322 0.503966,-1.96836 4.778226,-10.26149 5.50203,-9.87174 -1.091961,4.17438 3.076176,8.16316 4.062617,9.87174 1.743812,3.98813 -0.798474,8.20284 -4.782318,8.28322 z"
+       id="path8773"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="opacity:0.70200004;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter9285)"
+       d="m 74.817612,358.22038 c 1.63702,-0.6487 2.82132,-1.42621 3.34039,-2.98503"
+       id="path9039"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc"
+       transform="matrix(1.0640071,0,0,1.0640071,-5.4200791,-23.048078)" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter9372)"
+       d="m 74.464742,345.21665 c -0.819182,2.47752 -2.364741,4.3677 -3.18419,6.91287 -0.22188,0.65888 -0.96791,1.64099 -0.28461,2.20875 0.84867,0.074 1.56366,-0.86016 1.43912,-1.67891 0.52552,-2.30979 2.017734,-3.81282 1.99477,-6.30672 0.009,-0.37871 0.01,-0.75785 0.0349,-1.13599 z"
+       id="path9289"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc"
+       transform="matrix(1.0640071,0,0,1.0640071,-5.4200791,-23.048078)" />
+    <rect
+       y="337.96454"
+       x="67.176125"
+       height="23.000002"
+       width="23.000002"
+       id="rect8250"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph-24.svg b/pixmaps/src/gwy_graph-24.svg
new file mode 100644
index 0000000..a7aeda6
--- /dev/null
+++ b/pixmaps/src/gwy_graph-24.svg
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="50.46874"
+     inkscape:cx="-11.017304"
+     inkscape:cy="5.8477363"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8419"
+       width="23"
+       height="23"
+       x="306.79822"
+       y="649.07532" />
+    <g
+       id="g8458"
+       transform="rotate(-90,318.79821,660.07531)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 307.29821,668.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,653.07531 h 22"
+         id="path8448"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,663.07531 h 22"
+         id="path8450"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8452"
+         d="m 307.29821,658.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="m 307.29821,668.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,653.07531 h 22"
+       id="path8438"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,663.07531 h 22"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="m 307.29821,658.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 307.41696,671.45774 c 4.2216,-2.92784 3.67521,-17.90348 6.48838,-17.94716 2.81317,-0.0437 2.31267,9.51584 4.58671,9.51584 2.27404,0 1.86655,-4.93098 4.21944,-4.88568 2.35289,0.0453 3.02553,10.81894 6.90984,11.85974"
+       id="path8254-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="czzzc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_align-24.svg b/pixmaps/src/gwy_graph_align-24.svg
new file mode 100644
index 0000000..3b8ba8f
--- /dev/null
+++ b/pixmaps/src/gwy_graph_align-24.svg
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_align-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.544632"
+     inkscape:cx="54.182679"
+     inkscape:cy="-62.719188"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8419"
+       width="23"
+       height="23"
+       x="306.79822"
+       y="649.07532" />
+    <g
+       id="g8458"
+       transform="rotate(-90,318.79821,660.07531)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 307.29821,668.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,653.07531 h 22"
+         id="path8448"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,663.07531 h 22"
+         id="path8450"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8452"
+         d="m 307.29821,658.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="m 307.29821,668.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,653.07531 h 22"
+       id="path8438"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,663.07531 h 22"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="m 307.29821,658.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8571"
+       d="m 318.29821,649.57531 v 22"
+       style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 309.29821,663.07531 c 0,0 1.79815,-2 3,-2 1.20185,0 1.79815,2 3,2 1.20185,0 1.82508,-2.253 3,-2 3.07419,0.66198 2.3289,6.34045 5,8 1.42274,0.88395 5,0.5 5,0.5"
+       id="path8466"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="caaaac" />
+    <path
+       sodipodi:nodetypes="caaaac"
+       inkscape:connector-curvature="0"
+       id="path8468"
+       d="m 309.29821,655.07531 c 0,0 1.79815,-2 3,-2 1.20185,0 1.79815,2 3,2 1.20185,0 1.82508,-2.253 3,-2 3.07419,0.66198 2.3289,6.34045 5,8 1.42274,0.88395 5,0.5 5,0.5"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_cut-24.svg b/pixmaps/src/gwy_graph_cut-24.svg
new file mode 100644
index 0000000..7c5c255
--- /dev/null
+++ b/pixmaps/src/gwy_graph_cut-24.svg
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_cut-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="12.76868"
+     inkscape:cx="-73.160014"
+     inkscape:cy="30.351268"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8419"
+       width="23"
+       height="23"
+       x="306.79822"
+       y="649.07532" />
+    <g
+       id="g8458"
+       transform="rotate(-90,318.79821,660.07531)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 307.29821,668.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,653.07531 h 22"
+         id="path8448"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,663.07531 h 22"
+         id="path8450"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8452"
+         d="m 307.29821,658.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="m 307.29821,668.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,653.07531 h 22"
+       id="path8438"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,663.07531 h 22"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="m 307.29821,658.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 310.31615,665.42446 c 0.5864,-1.81638 0.50179,-1.96418 0.87316,-4.02186 0.37138,-2.05768 0.69874,-4.02522 1.10908,-5.48108 0.41034,-1.45585 0.90366,-2.40002 1.60695,-2.41094 2.81317,-0.0437 2.31267,9.51584 4.58671,9.51584 2.27404,0 1.86655,-4.93098 4.21944,-4.88568 1.17645,0.0226 1.93283,2.72738 2.88064,5.55656 0.23695,0.70729 0.48587,1.42236 0.7563,2.10525"
+       id="path8254-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cssszssc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 310.29821,649.57531 v 22"
+       id="path8569"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8571"
+       d="m 326.29821,649.57531 v 22"
+       style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_dos-24.svg b/pixmaps/src/gwy_graph_dos-24.svg
new file mode 100644
index 0000000..7d086ef
--- /dev/null
+++ b/pixmaps/src/gwy_graph_dos-24.svg
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_dos-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8425">
+      <stop
+         style="stop-color:#4696db;stop-opacity:1;"
+         offset="0"
+         id="stop8421" />
+      <stop
+         id="stop8429"
+         offset="0.92857146"
+         style="stop-color:#4696db;stop-opacity:0.94117647;" />
+      <stop
+         style="stop-color:#dfedf9;stop-opacity:0.88235295"
+         offset="1"
+         id="stop8423" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8425"
+       id="linearGradient8427"
+       x1="201.36205"
+       y1="495.33789"
+       x2="201.36205"
+       y2="481.33789"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient8423"
+       inkscape:collect="always">
+      <stop
+         id="stop8419"
+         offset="0"
+         style="stop-color:#6c7d92;stop-opacity:1" />
+      <stop
+         style="stop-color:#a3b8d2;stop-opacity:1"
+         offset="0.49999958"
+         id="stop8427" />
+      <stop
+         id="stop8421-7"
+         offset="1"
+         style="stop-color:#446a97;stop-opacity:1" />
+    </linearGradient>
+    <filter
+       height="1.2250096"
+       y="-0.11250482"
+       width="1.2571303"
+       x="-0.12856513"
+       id="filter8458"
+       style="color-interpolation-filters:sRGB"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur8460"
+         stdDeviation="0.16275744"
+         inkscape:collect="always" />
+    </filter>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="602.10724"
+       x2="257.77811"
+       y1="602.10724"
+       x1="263.77811"
+       id="linearGradient8425-5"
+       xlink:href="#linearGradient8423"
+       inkscape:collect="always"
+       gradientTransform="translate(-77.290842,-123.64796)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.0092836"
+     inkscape:cx="-53.585295"
+     inkscape:cy="51.442462"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:url(#linearGradient8427);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 197.86205,472.83789 h 8.5 c 0,0 -2.6364,1.63657 -3.5,2.875 -0.58037,0.83228 -1.19213,1.87871 -1,2.875 0.24047,1.247 2.43149,1.60687 2.5,2.875 0.063,1.16571 -1.92597,1.70994 -2,2.875 -0.0686,1.07875 1.42108,1.79696 1.5,2.875 0.0741,1.01194 -1.3324,1.91634 -1,2.875 0.58314,1.68177 3.91686,1.19323 4.5,2.875 0.3324,0.95866 -1,2.875 -1,2.875 h -8.5 z"
+       id="rect8418"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccsssssssccc" />
+    <path
+       sodipodi:nodetypes="csssssssc"
+       inkscape:connector-curvature="0"
+       id="path8431"
+       d="m 207.86205,485.693 c 0,0 0.89182,3.54699 1.56668,4.70888 0.45354,0.78083 1.02377,1.60389 1.56668,1.34541 0.67953,-0.32353 0.87564,-3.27133 1.56668,-3.3635 0.63524,-0.0848 0.9318,2.59119 1.56668,2.6908 0.58785,0.0923 0.97922,-1.91193 1.56669,-2.01811 0.55144,-0.0997 1.04427,1.79262 1.56668,1.3454 0.91645,-0.78454 0.65023,-5.26972 1.56668,-6.05428 0.52241,-0.44721 1.56668,1.3454 1.56668,1.3454"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <g
+       id="g8525"
+       transform="translate(30.87478,-6.12137)">
+      <path
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="path4763"
+         d="m 189.98727,478.95926 -6.5,10.5 -6,-10.5 z"
+         style="fill:url(#linearGradient8425-5);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         transform="rotate(96.15813,276.60268,506.58206)"
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="path8400"
+         d="m 260.56574,601.46532 c -0.0435,-1.8491 2.94024,0.22303 6.9605,0.15554 -2.37934,0.87001 -4.78447,3.12651 -6.54699,4.79868 -0.69731,-2.00112 -0.66057,-4.5027 -0.41351,-4.95422 z"
+         style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_export_ascii-24.svg b/pixmaps/src/gwy_graph_export_ascii-24.svg
new file mode 100644
index 0000000..0f30206
--- /dev/null
+++ b/pixmaps/src/gwy_graph_export_ascii-24.svg
@@ -0,0 +1,247 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_export_ascii-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.3837925"
+     inkscape:cx="97.016252"
+     inkscape:cy="-21.587931"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8419"
+       width="23"
+       height="23"
+       x="306.79822"
+       y="649.07532" />
+    <g
+       id="g8458"
+       transform="rotate(-90,318.79821,660.07531)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 307.29821,668.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,653.07531 h 22"
+         id="path8448"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,663.07531 h 22"
+         id="path8450"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8452"
+         d="m 307.29821,658.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,653.07531 h 22"
+       id="path8438"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,663.07531 h 22"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="m 307.29821,658.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 309.29821,656.57531 v 4 h 8 v -4"
+       id="path8520"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <g
+       id="g8691"
+       transform="translate(2,2)">
+      <path
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 311.29821,655.57531 -4,-4 h 8 z"
+         id="path8687"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc" />
+      <path
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 310.29821,652.57531 v -4 h 2 v 4 z"
+         id="path8689"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc" />
+    </g>
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot8781"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:justify;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+       transform="translate(306.29821,648.57531)"><flowRegion
+         id="flowRegion8783"
+         style="font-size:4px;text-anchor:start;text-align:justify;"><rect
+           id="rect8785"
+           width="8"
+           height="20"
+           x="14"
+           y="2"
+           style="font-size:4px;text-anchor:start;text-align:justify;" /></flowRegion><flowPara
+         id="flowPara8787">ASCA</flowPara></flowRoot>    <flowRoot
+       xml:space="preserve"
+       id="flowRoot8789"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.66666675px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       transform="translate(306.29821,648.57531)"><flowRegion
+         id="flowRegion8791"
+         style="font-size:2.66666675px;text-align:start;text-anchor:start"><rect
+           id="rect8793"
+           width="8"
+           height="20"
+           x="14"
+           y="2"
+           style="font-size:2.66666675px;text-align:start;text-anchor:start" /></flowRegion><flowPara
+         id="flowPara8797" /></flowRoot>    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 320.29821,651.57531 h 7 v 18 h -17.99999 v -5.99999"
+       id="rect8801"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 311.29821,666.07531 h 3"
+       id="path8803"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8814"
+       d="m 315.29821,666.07531 h 5"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8824"
+       d="m 311.29821,664.07531 h 3"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 322.29821,654.07531 h 3"
+       id="path8826"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8805-6"
+       d="m 319.29821,654.07531 h 2"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8820-8"
+       d="m 319.29821,656.07531 h 5"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 319.29821,658.07531 h 4"
+       id="path8816-8"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8805-4"
+       d="m 319.29821,660.07531 h 2"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8824-3"
+       d="m 322.29821,660.07531 h 3"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8824-1"
+       d="m 319.29821,662.07531 h 3"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8824-4"
+       d="m 315.29821,664.07531 h 3"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8814-9"
+       d="m 319.29821,664.07531 h 5"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_export_png-24.svg b/pixmaps/src/gwy_graph_export_png-24.svg
new file mode 100644
index 0000000..b4b0d70
--- /dev/null
+++ b/pixmaps/src/gwy_graph_export_png-24.svg
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_export_png-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="6.1516364"
+     inkscape:cx="-3.2201326"
+     inkscape:cy="1.9123596"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8419"
+       width="23"
+       height="23"
+       x="306.79822"
+       y="649.07532" />
+    <g
+       id="g8458"
+       transform="rotate(-90,318.79821,660.07531)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 307.29821,668.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,653.07531 h 22"
+         id="path8448"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,663.07531 h 22"
+         id="path8450"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8452"
+         d="m 307.29821,658.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="m 307.29821,668.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,653.07531 h 22"
+       id="path8438"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,663.07531 h 22"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="m 307.29821,658.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 309.29821,656.57531 v 4 h 8 v -4"
+       id="path8520"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot8781"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:justify;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+       transform="translate(306.29821,648.57531)"><flowRegion
+         id="flowRegion8783"
+         style="font-size:4px;text-anchor:start;text-align:justify;"><rect
+           id="rect8785"
+           width="8"
+           height="20"
+           x="14"
+           y="2"
+           style="font-size:4px;text-anchor:start;text-align:justify;" /></flowRegion><flowPara
+         id="flowPara8787">ASCA</flowPara></flowRoot>    <flowRoot
+       xml:space="preserve"
+       id="flowRoot8789"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.66666675px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       transform="translate(306.29821,648.57531)"><flowRegion
+         id="flowRegion8791"
+         style="font-size:2.66666675px;text-align:start;text-anchor:start"><rect
+           id="rect8793"
+           width="8"
+           height="20"
+           x="14"
+           y="2"
+           style="font-size:2.66666675px;text-align:start;text-anchor:start" /></flowRegion><flowPara
+         id="flowPara8797" /></flowRoot>    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 320.29821,651.57531 h 7 v 18 h -17.99999 v -5.99999"
+       id="rect8801"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8535"
+       width="3.9999921"
+       height="3.9999926"
+       x="321.29822"
+       y="653.57532" />
+    <rect
+       y="658.57532"
+       x="321.29822"
+       height="3.9999926"
+       width="3.9999921"
+       id="rect8537"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8539"
+       width="3.9999921"
+       height="3.9999926"
+       x="321.29822"
+       y="663.57532" />
+    <rect
+       y="663.57532"
+       x="316.29822"
+       height="3.9999926"
+       width="3.9999921"
+       id="rect8541"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#87c74a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8543"
+       width="3.9999921"
+       height="3.9999926"
+       x="311.29822"
+       y="663.57532" />
+    <g
+       id="g8691"
+       transform="translate(2,2)">
+      <path
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 311.29821,655.57531 -4,-4 h 8 z"
+         id="path8687"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc" />
+      <path
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 310.29821,652.57531 v -4 h 2 v 4 z"
+         id="path8689"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_export_vector-24.svg b/pixmaps/src/gwy_graph_export_vector-24.svg
new file mode 100644
index 0000000..3066a32
--- /dev/null
+++ b/pixmaps/src/gwy_graph_export_vector-24.svg
@@ -0,0 +1,216 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_export_vector-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.8682797"
+     inkscape:cx="83.099856"
+     inkscape:cy="-11.358031"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8419"
+       width="23"
+       height="23"
+       x="306.79822"
+       y="649.07532" />
+    <g
+       id="g8458"
+       transform="rotate(-90,318.79821,660.07531)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 307.29821,668.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,653.07531 h 22"
+         id="path8448"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,663.07531 h 22"
+         id="path8450"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8452"
+         d="m 307.29821,658.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="m 307.29821,668.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,653.07531 h 22"
+       id="path8438"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,663.07531 h 22"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="m 307.29821,658.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 309.29821,656.57531 v 4 h 8 v -4"
+       id="path8520"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot8781"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:justify;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+       transform="translate(306.29821,648.57531)"><flowRegion
+         id="flowRegion8783"
+         style="font-size:4px;text-anchor:start;text-align:justify;"><rect
+           id="rect8785"
+           width="8"
+           height="20"
+           x="14"
+           y="2"
+           style="font-size:4px;text-anchor:start;text-align:justify;" /></flowRegion><flowPara
+         id="flowPara8787">ASCA</flowPara></flowRoot>    <flowRoot
+       xml:space="preserve"
+       id="flowRoot8789"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.66666675px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       transform="translate(306.29821,648.57531)"><flowRegion
+         id="flowRegion8791"
+         style="font-size:2.66666675px;text-align:start;text-anchor:start"><rect
+           id="rect8793"
+           width="8"
+           height="20"
+           x="14"
+           y="2"
+           style="font-size:2.66666675px;text-align:start;text-anchor:start" /></flowRegion><flowPara
+         id="flowPara8797" /></flowRoot>    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 320.29821,651.57531 h 7 v 18 h -17.99999 v -5.99999"
+       id="rect8801"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 322.29821,656.57531 v 9"
+       id="path8837"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8839"
+       width="4.2425747"
+       height="4.2425747"
+       x="689.30548"
+       y="233.57536"
+       transform="rotate(45)" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8841"
+       d="m 322.79821,665.57531 h -10"
+       style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <rect
+       transform="rotate(45)"
+       y="240.61224"
+       x="696.41083"
+       height="4.2425747"
+       width="4.2425747"
+       id="rect8847"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8849"
+       width="4.2425747"
+       height="4.2425747"
+       x="690.04688"
+       y="246.97627"
+       transform="rotate(45)" />
+    <g
+       id="g8691"
+       transform="translate(2,2)">
+      <path
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 311.29821,655.57531 -4,-4 h 8 z"
+         id="path8687"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc" />
+      <path
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 310.29821,652.57531 v -4 h 2 v 4 z"
+         id="path8689"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_fd-24.svg b/pixmaps/src/gwy_graph_fd-24.svg
new file mode 100644
index 0000000..24da04e
--- /dev/null
+++ b/pixmaps/src/gwy_graph_fd-24.svg
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_fd-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.106426"
+     inkscape:cx="134.17322"
+     inkscape:cy="-2.85261"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8419"
+       width="23"
+       height="23"
+       x="306.79822"
+       y="649.07532" />
+    <g
+       id="g8458"
+       transform="rotate(-90,318.79821,660.07531)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 307.29821,668.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,653.07531 h 22"
+         id="path8448"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,663.07531 h 22"
+         id="path8450"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8452"
+         d="m 307.29821,658.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="m 307.29821,668.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,653.07531 h 22"
+       id="path8438"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,663.07531 h 22"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="m 307.29821,658.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.00000095;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 309.40218,650.3301 c 0,0.78383 0.3613,10.15943 1.03484,14.5527 0.61666,4.0223 3.27848,8.72304 6.36124,0.69251 2.26175,-5.5413 5.76783,-8.38368 11,-8.38368"
+       id="path12604"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cscc" />
+    <path
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0"
+       id="path8575"
+       d="m 310.90218,650.3301 c 0,1.56766 -0.51769,26.13988 3.96027,11.35415 2.26175,-5.5413 7.70359,-7.49262 12.93576,-7.49262"
+       style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:2.00000095;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_filter-24.svg b/pixmaps/src/gwy_graph_filter-24.svg
new file mode 100644
index 0000000..1a08efe
--- /dev/null
+++ b/pixmaps/src/gwy_graph_filter-24.svg
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_filter-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.544632"
+     inkscape:cx="27.003035"
+     inkscape:cy="-5.4785911"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8419"
+       width="23"
+       height="23"
+       x="306.79822"
+       y="649.07532" />
+    <g
+       id="g8458"
+       transform="rotate(-90,318.79821,660.07531)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 307.29821,668.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,653.07531 h 22"
+         id="path8448"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,663.07531 h 22"
+         id="path8450"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8452"
+         d="m 307.29821,658.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="m 307.29821,668.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,653.07531 h 22"
+       id="path8438"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,663.07531 h 22"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="m 307.29821,658.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
+       d="m 307.29821,671.57531 1,-3 1,4 1,-7 1,3 1,-18 1,6 1,-4 1,9 1,3 1,-3 1,2 1,-2 1,3 1,-8 1,4 1,-3 1,5 1,-1 1,7 1,-2 1,5 1,-3"
+       id="path8549"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccc" />
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 307.41696,671.45774 c 4.2216,-2.92784 3.67521,-17.90348 6.48838,-17.94716 2.81317,-0.0437 2.31267,9.51584 4.58671,9.51584 2.27404,0 1.86655,-4.93098 4.21944,-4.88568 2.35289,0.0453 3.02553,10.81894 6.90984,11.85974"
+       id="path8254-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="czzzc" />
+    <path
+       sodipodi:nodetypes="ccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path8551"
+       d="m 307.29821,671.57531 1,-3 1,4 1,-7 1,3 1,-18 1,6 1,-4 1,9 1,3 1,-3 1,2 1,-2 1,3 1,-8 1,4 1,-3 1,5 1,-1 1,7 1,-2 1,5 1,-3"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:0.35686275;fill-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_function-24.svg b/pixmaps/src/gwy_graph_function-24.svg
new file mode 100644
index 0000000..ace5214
--- /dev/null
+++ b/pixmaps/src/gwy_graph_function-24.svg
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_function-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="9.4546191"
+     inkscape:cx="-94.515608"
+     inkscape:cy="42.432073"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8419"
+       width="23"
+       height="23"
+       x="306.79822"
+       y="649.07532" />
+    <g
+       id="g8458"
+       transform="rotate(-90,318.79821,660.07531)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 307.29821,668.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,653.07531 h 22"
+         id="path8448"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,663.07531 h 22"
+         id="path8450"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8452"
+         d="m 307.29821,658.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="m 307.29821,668.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,653.07531 h 22"
+       id="path8438"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,663.07531 h 22"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="m 307.29821,658.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 329.17945,671.45774 c -8.23457,-0.92032 -8.17577,-17.38243 -10.88124,-17.38243 -2.70547,0 -2.64666,16.46211 -10.88125,17.38243"
+       id="path8254-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="czc" />
+    <path
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0"
+       id="path8126"
+       d="m 330.17945,668.95774 c -6.35472,-1.23908 -6.83783,-19.11349 -11.88124,-18.88243 -5.20051,-0.65253 -5.24634,17.25474 -11.88125,18.88243"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_halfgauss-24.svg b/pixmaps/src/gwy_graph_halfgauss-24.svg
new file mode 100644
index 0000000..fdda106
--- /dev/null
+++ b/pixmaps/src/gwy_graph_halfgauss-24.svg
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8239"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_halfgauss-24.svg">
+  <defs
+     id="defs8241" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="10.580721"
+     inkscape:cx="27.923554"
+     inkscape:cy="21.195878"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8244">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-235.29175,-670.91876)">
+    <g
+       id="g8474"
+       transform="translate(-34.999998,0.49999779)">
+      <rect
+         y="670.91876"
+         x="270.79175"
+         height="23"
+         width="23"
+         id="rect8419"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <g
+         transform="rotate(-90,311.7167,689.00027)"
+         id="g8458">
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 307.29821,668.07531 h 22"
+           id="path8446"
+           inkscape:connector-curvature="0" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path8448"
+           d="m 307.29821,653.07531 h 22"
+           style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path8450"
+           d="m 307.29821,663.07531 h 22"
+           style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 307.29821,658.07531 h 22"
+           id="path8452"
+           inkscape:connector-curvature="0" />
+      </g>
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 271.29175,689.91876 h 22"
+         id="path8444"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8438"
+         d="m 271.29175,674.91876 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8442"
+         d="m 271.29175,684.91876 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 271.29175,679.91876 h 22"
+         id="path8440"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path8254-7"
+         d="m 293.23598,691.80119 c -15.94423,0 -16.48811,-17.38243 -21.94424,-17.38243"
+         style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_level-24.svg b/pixmaps/src/gwy_graph_level-24.svg
new file mode 100644
index 0000000..67fc0d2
--- /dev/null
+++ b/pixmaps/src/gwy_graph_level-24.svg
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_level-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.2367323"
+     inkscape:cx="-41.043268"
+     inkscape:cy="22.6679"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8419"
+       width="23"
+       height="23"
+       x="306.79822"
+       y="649.07532" />
+    <g
+       id="g8458"
+       transform="rotate(-90,318.79821,660.07531)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 307.29821,668.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,653.07531 h 22"
+         id="path8448"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,663.07531 h 22"
+         id="path8450"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8452"
+         d="m 307.29821,658.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="m 307.29821,668.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,653.07531 h 22"
+       id="path8438"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,663.07531 h 22"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="m 307.29821,658.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 328.15519,649.13426 -20.55256,16.5"
+       id="path8571-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 307.41696,662.45774 c 4.2216,-2.92784 3.67521,-7.90348 6.48838,-7.94716 2.81317,-0.0437 2.31267,7.01584 4.58671,7.01584 2.27404,0 1.86655,-3.93098 4.21944,-3.88568 2.35289,0.0453 3.02553,-5.68106 6.90984,-4.64026"
+       id="path8254-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="czzzc" />
+    <path
+       sodipodi:nodetypes="czzssc"
+       inkscape:connector-curvature="0"
+       id="path8564"
+       d="m 307.41696,668.45774 c 4.08556,-1.505 4.03031,-4.33483 6.48838,-4.44716 2.45807,-0.11233 2.31267,6.51584 4.58671,6.51584 2.27404,0 1.86655,-1.93098 4.21944,-1.88568 1.17645,0.0226 0.43283,0.47738 1.38064,0.55656 0.94781,0.0792 3.58704,-0.21722 5.5292,0.30318"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <g
+       transform="translate(14,11)"
+       id="g8570">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8566"
+         d="m 311.29821,655.57531 -4,-4 h 8 z"
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         sodipodi:nodetypes="cccc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8568"
+         d="m 310.29821,651.57531 v -5 h 2 v 5 z"
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         sodipodi:nodetypes="ccccc" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_measure-24.svg b/pixmaps/src/gwy_graph_measure-24.svg
new file mode 100644
index 0000000..9c262bc
--- /dev/null
+++ b/pixmaps/src/gwy_graph_measure-24.svg
@@ -0,0 +1,1669 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8232"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_measure-24.svg"
+   inkscape:export-filename="gwy_graph_measure-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8234">
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4171"
+       xlink:href="#linearGradient4140"
+       gradientTransform="translate(77.59327,1051.5075)" />
+    <linearGradient
+       id="linearGradient4140">
+      <stop
+         id="stop4142"
+         offset="0"
+         style="stop-color:#d7e3f4;stop-opacity:1;" />
+      <stop
+         id="stop4144"
+         offset="1"
+         style="stop-color:#f1f5fb;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient8503"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(34.82165,1050.6611)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient11272"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(50.38806,1059.1518)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(10.14634,1056.6829)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient9134"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4171-3"
+       xlink:href="#linearGradient4140"
+       gradientTransform="translate(89.7437,1058.4951)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient8503-5"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(46.97208,1057.6487)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient11272-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(62.53849,1066.1394)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(22.29677,1063.6705)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient9134-5"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4171-36"
+       xlink:href="#linearGradient4140"
+       gradientTransform="translate(67.16669,1107.7768)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient8503-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(24.39507,1106.9304)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient11272-5"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(39.96148,1115.4211)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(-0.28024,1112.9522)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient9134-6"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4171-367"
+       xlink:href="#linearGradient4140"
+       gradientTransform="translate(36.81181,686.1225)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient8503-56"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-5.95981,685.2761)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient11272-2"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(9.6066,693.7668)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(-30.63512,691.2979)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient9134-9"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.41"
+     inkscape:cx="268.18032"
+     inkscape:cy="3.9902853"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="false"
+     inkscape:object-nodes="true"
+     showguides="false"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8237">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-277.38676,-597.20107)">
+    <g
+       id="g5943"
+       transform="translate(51.769939,3.2676594)">
+      <rect
+         y="594.43341"
+         x="226.11682"
+         height="23"
+         width="23"
+         id="rect8419"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <g
+         transform="rotate(-90,251.13657,673.09507)"
+         id="g8458">
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 307.29821,668.07531 h 22"
+           id="path8446"
+           inkscape:connector-curvature="0" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path8448"
+           d="m 307.29821,653.07531 h 22"
+           style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path8450"
+           d="m 307.29821,663.07531 h 22"
+           style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 307.29821,658.07531 h 22"
+           id="path8452"
+           inkscape:connector-curvature="0" />
+      </g>
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 226.61681,613.43343 h 22"
+         id="path8444"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8438"
+         d="m 226.61681,598.43343 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8442"
+         d="m 226.61681,608.43343 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 226.61681,603.43343 h 22"
+         id="path8440"
+         inkscape:connector-curvature="0" />
+    </g>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385"
+       y="941.57642"
+       x="78.963013">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487"
+       y="1037.4526"
+       x="103.09299">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536"
+       y="976.86511"
+       x="37.660278">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6"
+       style="opacity:1;fill:url(#linearGradient4171);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318"
+       transform="translate(-1.52033,776.19158)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386"
+       transform="translate(545.70091,247.9936)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162"
+       transform="translate(-148.94126,91.231707)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="399.22723"
+       y="1165.5157"
+       id="text8015"><tspan
+         id="tspan8017"
+         x="399.22723"
+         y="1165.5157" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1173.8743"
+       y="-161.54916"
+       id="text9295"><tspan
+         id="tspan9297"
+         x="-1173.8743"
+         y="-161.54916" /></text>
+    <text
+       id="text7408-2"
+       class="fil7 fnt4"
+       y="120.33269"
+       x="-1056.6615"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422"
+       class="fil7 fnt4"
+       y="147.7993"
+       x="-1040.2886"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-9"
+       y="940.73004"
+       x="36.191391">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-0"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-9"
+       y="1036.6062"
+       x="60.321365">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-1"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7"
+       y="976.01868"
+       x="-5.1113439">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-7"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-1"
+       style="opacity:1;fill:url(#linearGradient8503);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-7"
+       transform="translate(-44.29193,775.34517)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-6"
+       transform="translate(502.92932,247.14719)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7"
+       transform="translate(-191.71286,90.385297)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="356.45563"
+       y="1164.6693"
+       id="text8015-3"><tspan
+         id="tspan8017-6"
+         x="356.45563"
+         y="1164.6693" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1216.6459"
+       y="-162.39554"
+       id="text9295-5"><tspan
+         id="tspan9297-6"
+         x="-1216.6459"
+         y="-162.39554" /></text>
+    <text
+       id="text7408-2-3"
+       class="fil7 fnt4"
+       y="119.48628"
+       x="-1099.4331"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-9"
+       class="fil7 fnt4"
+       y="146.9529"
+       x="-1083.0602"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-7"
+       y="949.2207"
+       x="51.757797">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-2"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-3"
+       y="1045.0969"
+       x="75.887787">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-7"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-2"
+       y="984.5094"
+       x="10.455062">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-5"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-3"
+       style="opacity:1;fill:url(#linearGradient11272);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-3"
+       transform="translate(-28.72553,783.83589)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-64"
+       transform="translate(518.49571,255.63791)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-03"
+       transform="translate(-176.14646,98.876017)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="372.02203"
+       y="1173.16"
+       id="text8015-5"><tspan
+         id="tspan8017-85"
+         x="372.02203"
+         y="1173.16" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1201.0796"
+       y="-153.90482"
+       id="text9295-0"><tspan
+         id="tspan9297-9"
+         x="-1201.0796"
+         y="-153.90482" /></text>
+    <text
+       id="text7408-2-9"
+       class="fil7 fnt4"
+       y="127.97701"
+       x="-1083.8667"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-8"
+       class="fil7 fnt4"
+       y="155.44362"
+       x="-1067.4938"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-2"
+       y="946.75183"
+       x="11.516067">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-6"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-5"
+       y="1042.6279"
+       x="35.646042">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-8"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7-2"
+       y="982.04041"
+       x="-29.786667">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-9"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-6"
+       style="opacity:1;fill:url(#linearGradient9134);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-4"
+       transform="translate(-68.96723,781.36694)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-8"
+       transform="translate(478.25401,253.16896)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7-4"
+       transform="translate(-216.38817,96.407057)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="331.78033"
+       y="1170.691"
+       id="text8015-0"><tspan
+         id="tspan8017-8"
+         x="331.78033"
+         y="1170.691" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1241.3212"
+       y="-156.37375"
+       id="text9295-6-9"><tspan
+         id="tspan9297-2"
+         x="-1241.3212"
+         y="-156.37375" /></text>
+    <text
+       id="text7408-2-4"
+       class="fil7 fnt4"
+       y="125.50807"
+       x="-1124.1084"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-7"
+       class="fil7 fnt4"
+       y="152.97469"
+       x="-1107.7355"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-3"
+       y="948.56403"
+       x="91.113441">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-09"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-2"
+       y="1044.4402"
+       x="115.24342">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-5"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-4"
+       y="983.85272"
+       x="49.810707">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-0"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-5"
+       style="opacity:1;fill:url(#linearGradient4171-3);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-47"
+       transform="translate(10.6301,783.17919)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-7"
+       transform="translate(557.85134,254.98121)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-5"
+       transform="translate(-136.79083,98.219323)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="411.37766"
+       y="1172.5033"
+       id="text8015-4"><tspan
+         id="tspan8017-81"
+         x="411.37766"
+         y="1172.5033" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1161.7239"
+       y="-154.56154"
+       id="text9295-2"><tspan
+         id="tspan9297-8"
+         x="-1161.7239"
+         y="-154.56154" /></text>
+    <text
+       id="text7408-2-93"
+       class="fil7 fnt4"
+       y="127.3203"
+       x="-1044.5111"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-6"
+       class="fil7 fnt4"
+       y="154.78691"
+       x="-1028.1382"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-9-8"
+       y="947.71765"
+       x="48.34182">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-0-0"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-9-2"
+       y="1043.5938"
+       x="72.471794">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-1-1"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7-0"
+       y="983.00629"
+       x="7.0390859">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-7-5"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-1-1"
+       style="opacity:1;fill:url(#linearGradient8503-5);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-7-0"
+       transform="translate(-32.1415,782.33278)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-6-6"
+       transform="translate(515.07975,254.1348)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7-46"
+       transform="translate(-179.56243,97.372913)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="368.60605"
+       y="1171.6569"
+       id="text8015-3-2"><tspan
+         id="tspan8017-6-5"
+         x="368.60605"
+         y="1171.6569" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1204.4955"
+       y="-155.40791"
+       id="text9295-5-8"><tspan
+         id="tspan9297-6-6"
+         x="-1204.4955"
+         y="-155.40791" /></text>
+    <text
+       id="text7408-2-3-2"
+       class="fil7 fnt4"
+       y="126.4739"
+       x="-1087.2827"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-9-8"
+       class="fil7 fnt4"
+       y="153.94051"
+       x="-1070.9098"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-7-4"
+       y="956.20831"
+       x="63.908226">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-2-7"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-3-2"
+       y="1052.0845"
+       x="88.038216">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-7-4"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-2-0"
+       y="991.49701"
+       x="22.605492">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-5-6"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-3-2"
+       style="opacity:1;fill:url(#linearGradient11272-3);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-3-1"
+       transform="translate(-16.5751,790.8235)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-64-3"
+       transform="translate(530.64614,262.62552)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-03-1"
+       transform="translate(-163.99603,105.86363)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="384.17245"
+       y="1180.1476"
+       id="text8015-5-1"><tspan
+         id="tspan8017-85-0"
+         x="384.17245"
+         y="1180.1476" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1188.9291"
+       y="-146.91719"
+       id="text9295-0-3"><tspan
+         id="tspan9297-9-4"
+         x="-1188.9291"
+         y="-146.91719" /></text>
+    <text
+       id="text7408-2-9-0"
+       class="fil7 fnt4"
+       y="134.96461"
+       x="-1071.7163"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-8-3"
+       class="fil7 fnt4"
+       y="162.43123"
+       x="-1055.3434"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-2-9"
+       y="953.73944"
+       x="23.666496">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-6-1"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-5-9"
+       y="1049.6155"
+       x="47.796471">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-8-6"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7-2-9"
+       y="989.02802"
+       x="-17.636238">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-9-3"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-6-3"
+       style="opacity:1;fill:url(#linearGradient9134-5);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-4-6"
+       transform="translate(-56.8168,788.35455)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-8-4"
+       transform="translate(490.40444,260.15657)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7-4-0"
+       transform="translate(-204.23774,103.39467)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="343.93076"
+       y="1177.6786"
+       id="text8015-0-0"><tspan
+         id="tspan8017-8-4"
+         x="343.93076"
+         y="1177.6786" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1229.1708"
+       y="-149.38612"
+       id="text9295-6-9-6"><tspan
+         id="tspan9297-2-2"
+         x="-1229.1708"
+         y="-149.38612" /></text>
+    <text
+       id="text7408-2-4-6"
+       class="fil7 fnt4"
+       y="132.49568"
+       x="-1111.958"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-7-7"
+       class="fil7 fnt4"
+       y="159.9623"
+       x="-1095.5851"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-8"
+       y="997.8457"
+       x="68.53643">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-1"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-28"
+       y="1093.7219"
+       x="92.666405">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-9"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-3"
+       y="1033.1344"
+       x="27.233698">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-6"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-8"
+       style="opacity:1;fill:url(#linearGradient4171-36);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-1"
+       transform="translate(-11.94691,832.46088)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-1"
+       transform="translate(535.27433,304.2629)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-0"
+       transform="translate(-159.36784,147.50101)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="388.80066"
+       y="1221.785"
+       id="text8015-8"><tspan
+         id="tspan8017-5"
+         x="388.80066"
+         y="1221.785" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1184.3009"
+       y="-105.27985"
+       id="text9295-06"><tspan
+         id="tspan9297-4"
+         x="-1184.3009"
+         y="-105.27985" /></text>
+    <text
+       id="text7408-2-6"
+       class="fil7 fnt4"
+       y="176.60199"
+       x="-1067.0881"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-2"
+       class="fil7 fnt4"
+       y="204.0686"
+       x="-1050.7152"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-9-5"
+       y="996.99933"
+       x="25.764811">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-0-8"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-9-6"
+       y="1092.8755"
+       x="49.894783">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-1-2"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7-8"
+       y="1032.288"
+       x="-15.537924">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-7-4"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-1-7"
+       style="opacity:1;fill:url(#linearGradient8503-3);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-7-2"
+       transform="translate(-54.71851,831.61447)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-6-9"
+       transform="translate(492.50274,303.41649)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7-9"
+       transform="translate(-202.13944,146.6546)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="346.02905"
+       y="1220.9386"
+       id="text8015-3-0"><tspan
+         id="tspan8017-6-8"
+         x="346.02905"
+         y="1220.9386" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1227.0725"
+       y="-106.12623"
+       id="text9295-5-1"><tspan
+         id="tspan9297-6-3"
+         x="-1227.0725"
+         y="-106.12623" /></text>
+    <text
+       id="text7408-2-3-1"
+       class="fil7 fnt4"
+       y="175.75558"
+       x="-1109.8597"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-9-1"
+       class="fil7 fnt4"
+       y="203.2222"
+       x="-1093.4868"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-7-0"
+       y="1005.49"
+       x="41.331215">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-2-3"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-3-4"
+       y="1101.3662"
+       x="65.461205">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-7-0"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-2-3"
+       y="1040.7787"
+       x="0.028482242">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-5-9"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-3-1"
+       style="opacity:1;fill:url(#linearGradient11272-5);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-3-5"
+       transform="translate(-39.15211,840.10519)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-64-6"
+       transform="translate(508.06913,311.90721)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-03-6"
+       transform="translate(-186.57304,155.14532)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="361.59546"
+       y="1229.4293"
+       id="text8015-5-4"><tspan
+         id="tspan8017-85-00"
+         x="361.59546"
+         y="1229.4293" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1211.5061"
+       y="-97.635506"
+       id="text9295-0-4"><tspan
+         id="tspan9297-9-6"
+         x="-1211.5061"
+         y="-97.635506" /></text>
+    <text
+       id="text7408-2-9-2"
+       class="fil7 fnt4"
+       y="184.24631"
+       x="-1094.2933"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-8-6"
+       class="fil7 fnt4"
+       y="211.71292"
+       x="-1077.9204"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-2-7"
+       y="1003.0211"
+       x="1.0894868">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-6-5"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-5-6"
+       y="1098.8972"
+       x="25.219461">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-8-9"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7-2-8"
+       y="1038.3097"
+       x="-40.213249">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-9-7"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-6-2"
+       style="opacity:1;fill:url(#linearGradient9134-6);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-4-2"
+       transform="translate(-79.39381,837.63624)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-8-7"
+       transform="translate(467.82743,309.43826)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7-4-6"
+       transform="translate(-226.81475,152.67636)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="321.35376"
+       y="1226.9603"
+       id="text8015-0-1"><tspan
+         id="tspan8017-8-3"
+         x="321.35376"
+         y="1226.9603" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1251.7478"
+       y="-100.10444"
+       id="text9295-6-9-2"><tspan
+         id="tspan9297-2-1"
+         x="-1251.7478"
+         y="-100.10444" /></text>
+    <text
+       id="text7408-2-4-5"
+       class="fil7 fnt4"
+       y="181.77737"
+       x="-1134.535"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-7-9"
+       class="fil7 fnt4"
+       y="209.24399"
+       x="-1118.1621"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2, 2;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 281.38676,621.20107 v -24"
+       id="path9256"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path9258"
+       d="m 297.38676,621.20107 v -24"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2, 2;stroke-dashoffset:0;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 278.20777,618.70107 5.23583,-0.5 1.24528,-1.5 c 0.63779,-2.72928 0.35844,-5.39277 0.70482,-8.22865 l 1.031,-2.77135 c 0.6011,0.93087 1.0488,1.60565 1.49057,2.5 l 1.63483,-0.5 0.74527,-2 0.74529,3 c 0.82997,0.4772 0.58996,-1.03185 1.26815,-0.96041 0.61666,0.86004 0.59215,2.2944 1.16854,3.18596 0.0377,1.92213 0.009,3.84969 0.0182,5.77441 l 1.49056,2 5.51667,-0.5"
+       id="path9271"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccc" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-70"
+       y="576.19141"
+       x="38.181553">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-9"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-36"
+       y="672.06763"
+       x="62.311527">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-0"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-6"
+       y="611.4801"
+       x="-3.1211822">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-2"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-61"
+       style="opacity:1;fill:url(#linearGradient4171-367);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-8"
+       transform="translate(-42.30179,410.80656)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-79"
+       transform="translate(504.91945,-117.39142)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-2"
+       transform="translate(-189.72272,-274.15331)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="358.44577"
+       y="800.13074"
+       id="text8015-02"><tspan
+         id="tspan8017-3"
+         x="358.44577"
+         y="800.13074" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1214.6558"
+       y="-526.9342"
+       id="text9295-7"><tspan
+         id="tspan9297-5"
+         x="-1214.6558"
+         y="-526.9342" /></text>
+    <text
+       id="text7408-2-92"
+       class="fil7 fnt4"
+       y="-245.05234"
+       x="-1097.443"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-28"
+       class="fil7 fnt4"
+       y="-217.58572"
+       x="-1081.0701"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-9-9"
+       y="575.34503"
+       x="-4.5900698">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-0-7"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-9-3"
+       y="671.22119"
+       x="19.539906">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-1-6"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7-1"
+       y="610.63367"
+       x="-45.892803">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-7-2"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-1-9"
+       style="opacity:1;fill:url(#linearGradient8503-56);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-7-3"
+       transform="translate(-85.07339,409.96015)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-6-1"
+       transform="translate(462.14786,-118.23783)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7-94"
+       transform="translate(-232.49432,-274.99972)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="315.67416"
+       y="799.2843"
+       id="text8015-3-7"><tspan
+         id="tspan8017-6-84"
+         x="315.67416"
+         y="799.2843" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1257.4274"
+       y="-527.78058"
+       id="text9295-5-5"><tspan
+         id="tspan9297-6-0"
+         x="-1257.4274"
+         y="-527.78058" /></text>
+    <text
+       id="text7408-2-3-3"
+       class="fil7 fnt4"
+       y="-245.89874"
+       x="-1140.2146"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-9-6"
+       class="fil7 fnt4"
+       y="-218.43213"
+       x="-1123.8417"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-7-1"
+       y="583.83569"
+       x="10.976336">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-2-0"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-3-6"
+       y="679.71191"
+       x="35.106327">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-7-3"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-2-2"
+       y="619.12439"
+       x="-30.326397">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-5-0"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-3-6"
+       style="opacity:1;fill:url(#linearGradient11272-2);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-3-15"
+       transform="translate(-69.50699,418.45087)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-64-5"
+       transform="translate(477.71425,-109.74711)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-03-4"
+       transform="translate(-216.92792,-266.509)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="331.24057"
+       y="807.77502"
+       id="text8015-5-7"><tspan
+         id="tspan8017-85-6"
+         x="331.24057"
+         y="807.77502" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1241.861"
+       y="-519.28986"
+       id="text9295-0-5"><tspan
+         id="tspan9297-9-69"
+         x="-1241.861"
+         y="-519.28986" /></text>
+    <text
+       id="text7408-2-9-3"
+       class="fil7 fnt4"
+       y="-237.40802"
+       x="-1124.6482"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-8-7"
+       class="fil7 fnt4"
+       y="-209.94141"
+       x="-1108.2753"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-2-4"
+       y="581.36682"
+       x="-29.265392">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-6-52"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-5-5"
+       y="677.24292"
+       x="-5.1354189">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-8-4"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7-2-7"
+       y="616.6554"
+       x="-70.56813">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-9-4"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-6-4"
+       style="opacity:1;fill:url(#linearGradient9134-9);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-4-3"
+       transform="translate(-109.74869,415.98192)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-8-0"
+       transform="translate(437.47255,-112.21606)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7-4-7"
+       transform="translate(-257.16963,-268.97796)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="290.99887"
+       y="805.30603"
+       id="text8015-0-8"><tspan
+         id="tspan8017-8-6"
+         x="290.99887"
+         y="805.30603" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1282.1027"
+       y="-521.75879"
+       id="text9295-6-9-8"><tspan
+         id="tspan9297-2-8"
+         x="-1282.1027"
+         y="-521.75879" /></text>
+    <text
+       id="text7408-2-4-4"
+       class="fil7 fnt4"
+       y="-239.87695"
+       x="-1164.8899"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-7-3"
+       class="fil7 fnt4"
+       y="-212.41034"
+       x="-1148.517"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <g
+       id="g9008"
+       transform="matrix(0,-1,-1,0,897.59766,897.59766)">
+      <g
+         id="g9609-3"
+         transform="matrix(1.1398332,0,0,-1.0716348,-166.27518,1345.6635)">
+        <path
+           style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.90480703;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+           d="m 405.47382,680.22549 h 3.5 v 15.87216 h -3.5 z"
+           id="rect8336-5"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc" />
+      </g>
+      <path
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         d="m 296.39731,615.20114 h 2 v -1 h -2 z"
+         id="rect9666"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc" />
+      <rect
+         transform="scale(1,-1)"
+         y="-613.20117"
+         x="296.39731"
+         height="1"
+         width="1"
+         id="rect9666-6"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         transform="scale(1,-1)"
+         y="-609.20117"
+         x="296.39731"
+         height="1"
+         width="1"
+         id="rect9666-62"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         transform="scale(1,-1)"
+         y="-605.20117"
+         x="296.39731"
+         height="1"
+         width="1"
+         id="rect9666-8"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="path8975"
+         d="m 296.39731,611.20114 h 2 v -1 h -2 z"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <path
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         d="m 296.39731,607.20114 h 2 v -1 h -2 z"
+         id="path8977"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc" />
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="path8997"
+         d="m 296.39731,603.20114 h 2 v -1 h -2 z"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8714"
+         width="1"
+         height="1"
+         x="296.39731"
+         y="-601.20117"
+         transform="scale(1,-1)" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_palette-24.svg b/pixmaps/src/gwy_graph_palette-24.svg
new file mode 100644
index 0000000..c2026e0
--- /dev/null
+++ b/pixmaps/src/gwy_graph_palette-24.svg
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8691"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_palette-24.svg">
+  <defs
+     id="defs8693">
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8648"
+       id="linearGradient8654"
+       x1="363.15701"
+       y1="549.86188"
+       x2="387.15701"
+       y2="549.86188"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-139.12864,-80.867386)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8648">
+      <stop
+         style="stop-color:#000200;stop-opacity:1"
+         offset="0"
+         id="stop8650" />
+      <stop
+         id="stop8714"
+         offset="0.25"
+         style="stop-color:#4696db;stop-opacity:1" />
+      <stop
+         id="stop8710"
+         offset="0.5"
+         style="stop-color:#ffbb00;stop-opacity:1" />
+      <stop
+         style="stop-color:#fd9044;stop-opacity:1"
+         offset="0.75"
+         id="stop8712" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop8652" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="18.627844"
+     inkscape:cx="26.866213"
+     inkscape:cy="17.545002"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8696">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-224.02837,-448.99442)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8654);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8646"
+       width="23"
+       height="7"
+       x="224.52837"
+       y="465.49442" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 224.77711,462.99442 c 3.25126,0 4.86316,-2.23932 5,-5.5 1.39374,-0.18153 0.9258,-1.51887 1,-2.48255 -0.182,-1.71649 0.63545,-2.15286 2.00004,-3.51745 1.13008,0.40532 2.59771,1.42424 3.33256,1.67936 1.04301,-1.06546 3.56254,-3.70957 4.54238,-1.85851 1.46988,3.00602 1.49428,7.77847 4.20337,9.25849 1.4301,0.036 1.17291,1.92066 2.92169,1.92066"
+       id="path8113"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_pointer-24.svg b/pixmaps/src/gwy_graph_pointer-24.svg
new file mode 100644
index 0000000..3d1cc23
--- /dev/null
+++ b/pixmaps/src/gwy_graph_pointer-24.svg
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_pointer-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689">
+    <filter
+       id="filter115041"
+       style="color-interpolation-filters:sRGB"
+       inkscape:collect="always">
+      <feBlend
+         id="feBlend115043"
+         in2="BackgroundImage"
+         mode="normal"
+         inkscape:collect="always" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="21.60996"
+     inkscape:cx="-53.066858"
+     inkscape:cy="1.6884107"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8419"
+       width="23"
+       height="23"
+       x="306.79822"
+       y="649.07532" />
+    <g
+       id="g8458"
+       transform="rotate(-90,318.79821,660.07531)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 307.29821,668.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,653.07531 h 22"
+         id="path8448"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,663.07531 h 22"
+         id="path8450"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8452"
+         d="m 307.29821,658.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="m 307.29821,668.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,653.07531 h 22"
+       id="path8438"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,663.07531 h 22"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="m 307.29821,658.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 307.41696,671.45774 c 4.2216,-2.92784 3.67521,-17.90348 6.48838,-17.94716 2.81317,-0.0437 2.31267,9.51584 4.58671,9.51584 2.27404,0 1.86655,-4.93098 4.21944,-4.88568 2.35289,0.0453 3.02553,10.81894 6.90984,11.85974"
+       id="path8254-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="czzzc" />
+    <path
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:connector-curvature="0"
+       id="path12872"
+       d="m 449.58071,3770.0549 v -48.726 l 33.71627,33.8223 -13.57345,1.8041 9.54446,23.2356 -4.53023,2.0169 -4.53024,2.0169 -9.79569,-23.1237 z"
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3.16456819;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter115041);enable-background:new"
+       transform="matrix(0.31446558,0,0,0.31753939,176.48081,-530.56226)" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_ruler-24.svg b/pixmaps/src/gwy_graph_ruler-24.svg
new file mode 100644
index 0000000..aacf538
--- /dev/null
+++ b/pixmaps/src/gwy_graph_ruler-24.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_ruler-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="9.0558017"
+     inkscape:cx="-3.7152631"
+     inkscape:cy="-15.004706"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8419"
+       width="23"
+       height="23"
+       x="306.79822"
+       y="649.07532" />
+    <g
+       id="g8458"
+       transform="rotate(-90,318.7982,660.07531)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 307.29821,668.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,653.07531 h 22"
+         id="path8448"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,663.07531 h 22"
+         id="path8450"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8452"
+         d="m 307.29821,658.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="m 307.2982,668.0753 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.2982,653.0753 h 22"
+       id="path8438"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.2982,663.0753 h 22"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="m 307.2982,658.0753 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 307.41695,671.45773 c 4.2216,-2.92784 3.67521,-17.90348 6.48838,-17.94716 2.81317,-0.0437 2.31267,9.51584 4.58671,9.51584 2.27404,0 1.86655,-4.93098 4.21944,-4.88568 2.35289,0.0453 3.02553,10.81894 6.90984,11.85974"
+       id="path8254-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="czzzc" />
+    <g
+       id="g8500"
+       transform="translate(31.064415,-1.3540115)">
+      <rect
+         y="650.42932"
+         x="291.7338"
+         height="22"
+         width="5.9999995"
+         id="rect12874"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path12876"
+         d="m 292.23363,658.42945 h 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path12880"
+         d="m 292.23363,655.42945 h 2.00001"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 292.23363,652.42945 h 3"
+         id="path12882"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path12884"
+         d="m 292.23363,667.42945 h 2.00001"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path12890"
+         d="m 292.23363,661.42945 h 2.00001"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 292.23363,664.42945 h 3"
+         id="path12892"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8091"
+         d="m 292.23363,670.42945 h 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_vertical-24.svg b/pixmaps/src/gwy_graph_vertical-24.svg
new file mode 100644
index 0000000..3e0724b
--- /dev/null
+++ b/pixmaps/src/gwy_graph_vertical-24.svg
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_vertical-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.6914153"
+     inkscape:cx="-107.77045"
+     inkscape:cy="10.257864"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8419"
+       width="23"
+       height="23"
+       x="306.79822"
+       y="649.07532" />
+    <g
+       id="g8458"
+       transform="rotate(-90,318.79821,660.07531)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 307.29821,668.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,653.07531 h 22"
+         id="path8448"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,663.07531 h 22"
+         id="path8450"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8452"
+         d="m 307.29821,658.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="m 307.29821,668.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,653.07531 h 22"
+       id="path8438"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,663.07531 h 22"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="m 307.29821,658.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 309.23442,671.52196 c 2.92784,-4.2216 17.90348,-3.67521 17.94716,-6.48838 0.0437,-2.81317 -9.51584,-2.31267 -9.51584,-4.58671 0,-2.27404 4.93098,-1.86655 4.88568,-4.21944 -0.0453,-2.35289 -10.81894,-3.02553 -11.85974,-6.90984"
+       id="path8254-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="czzzc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_zoom_fit-24.svg b/pixmaps/src/gwy_graph_zoom_fit-24.svg
new file mode 100644
index 0000000..0087f7d
--- /dev/null
+++ b/pixmaps/src/gwy_graph_zoom_fit-24.svg
@@ -0,0 +1,405 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24.000002"
+   height="24.000002"
+   viewBox="0 0 6.3500004 6.3500004"
+   version="1.1"
+   id="svg8583"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_zoom_fit-24.svg">
+  <defs
+     id="defs8577">
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4782-7-2">
+      <circle
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="circle4784-1-2"
+         cx="276.29214"
+         cy="151.18121"
+         r="19.066629" />
+    </clipPath>
+    <filter
+       height="1.1263148"
+       y="-0.063157417"
+       width="1.1142865"
+       x="-0.057143249"
+       id="filter4238-9-3"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4240-4-6"
+         stdDeviation="2.4600469" />
+    </filter>
+    <filter
+       height="1.025263"
+       y="-0.012631484"
+       width="1.0228573"
+       x="-0.011428649"
+       id="filter4254-1-3"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4256-7-1"
+         stdDeviation="0.49200938" />
+    </filter>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath8518">
+      <g
+         style="fill:none"
+         id="g8532"
+         transform="matrix(0.91094965,0,0,0.91094965,17.85019,178.21156)">
+        <g
+           style="fill:none"
+           id="g8522"
+           clip-path="url(#clipPath4782-7-2)"
+           transform="matrix(-0.40789887,0.26719843,-0.26719843,-0.40789887,540.73338,515.16801)">
+          <path
+             id="path8520"
+             style="fill:none;stroke:#868789;stroke-width:1.4453578;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+             d="m 276.3071,132.25651 a 21.406287,18.906167 0 0 1 21.40628,18.90617 21.406287,18.906167 0 1 1 -21.40628,-18.90617 z"
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           style="fill:none"
+           id="g8530"
+           transform="matrix(-0.02114565,0.13039867,-0.13039867,-0.02114565,432.9912,502.16397)">
+          <circle
+             cx="242.94168"
+             cy="308.38486"
+             r="70.205605"
+             id="circle8524"
+             style="opacity:1;fill:none;fill-opacity:1;stroke:#505050;stroke-width:12.46485138;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path8526"
+             d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+             style="opacity:1;fill:none;fill-opacity:0.42452829;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4238-9-3)" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path8528"
+             d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+             style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4254-1-3)" />
+        </g>
+      </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath8514">
+      <circle
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="circle8512"
+         cx="276.29214"
+         cy="151.18121"
+         r="19.066629" />
+    </clipPath>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       id="linearGradient4146-6-8"
+       xlink:href="#linearGradient4270" />
+    <linearGradient
+       id="linearGradient4270">
+      <stop
+         style="stop-color:#3c98f4;stop-opacity:0.12156863"
+         offset="0"
+         id="stop4272" />
+      <stop
+         style="stop-color:#f1f5fb;stop-opacity:0.12156863"
+         offset="1"
+         id="stop4274" />
+    </linearGradient>
+    <filter
+       height="1.1263148"
+       y="-0.063157417"
+       width="1.1142865"
+       x="-0.057143249"
+       id="filter8522"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur8520"
+         stdDeviation="2.4600469" />
+    </filter>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="312.29819"
+       x2="227.00648"
+       y1="288.19104"
+       x1="214.93521"
+       id="linearGradient4204-9-1"
+       xlink:href="#linearGradient4198" />
+    <linearGradient
+       id="linearGradient4198">
+      <stop
+         id="stop4200-0"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0.39215687" />
+      <stop
+         id="stop4202"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0.3137255" />
+    </linearGradient>
+    <filter
+       height="1.025263"
+       y="-0.012631484"
+       width="1.0228573"
+       x="-0.011428649"
+       id="filter8530"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur8528"
+         stdDeviation="0.49200938" />
+    </filter>
+    <linearGradient
+       gradientTransform="matrix(0.26458333,0,0,0.26458333,-95.128371,152.83863)"
+       inkscape:collect="always"
+       xlink:href="#linearGradient12587-6"
+       id="linearGradient12593-3"
+       x1="363.08881"
+       y1="538.68573"
+       x2="365.21747"
+       y2="540.84064"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient12587-6">
+      <stop
+         style="stop-color:#6daa34;stop-opacity:1"
+         offset="0"
+         id="stop12589-7" />
+      <stop
+         id="stop13669-5"
+         offset="0.5"
+         style="stop-color:#7db846;stop-opacity:1" />
+      <stop
+         style="stop-color:#6daa34;stop-opacity:1"
+         offset="1"
+         id="stop12591-3" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter18492"
+       x="-0.047411256"
+       width="1.0948225"
+       y="-0.04860355"
+       height="1.0972071">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.42995752"
+         id="feGaussianBlur18494" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="49.397768"
+     inkscape:cx="12.202802"
+     inkscape:cy="13.788727"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata8580">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-4.3362379e-6,-290.65)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:0.26458338px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8419"
+       width="6.0854168"
+       height="6.0854168"
+       x="0.13229603"
+       y="290.78229" />
+    <g
+       id="g8458"
+       transform="matrix(0,-0.26458333,0.26458333,0,-171.33763,378.0414)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 307.29821,668.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,653.07531 h 22"
+         id="path8448"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,663.07531 h 22"
+         id="path8450"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8452"
+         d="m 307.29821,658.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="M 0.26458564,295.80937 H 6.0854189"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 0.26458564,291.84062 H 6.0854189"
+       id="path8438"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 0.26458564,294.48646 H 6.0854189"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 6.0780423,296.10276 c -4.2185774,0 -4.362479,-4.86368 -5.80608008,-4.86368"
+       id="path8254-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="M 0.26458564,293.16354 H 6.0854189"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <g
+       id="g18446"
+       transform="matrix(0.26458333,0,0,0.26458333,-94.674712,144.57226)"
+       style="opacity:0.5;filter:url(#filter18492)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path18369"
+         d="m 363.68784,568.4473 -5.08846,5.03989 c -0.0998,0.0989 -0.11276,0.3176 -0.0177,0.42101 l 1.80326,1.96183 c 0.095,0.10341 0.32123,0.11658 0.42097,0.0177 l 5.08846,-5.0399 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.99607843"
+         sodipodi:nodetypes="csssscc" />
+      <circle
+         transform="rotate(99.210991)"
+         cx="496.39133"
+         cy="-457.18619"
+         r="8.4484291"
+         id="circle18383"
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path4717-0-5"
+       d="m 1.7660008,294.51251 -1.3463217,1.33347 c -0.0264054,0.0262 -0.0298344,0.084 -0.004683,0.11139 l 0.23855614,0.25953 0.23855363,0.25954 c 0.0251354,0.0274 0.0849947,0.0308 0.11138433,0.005 l 1.3463217,-1.33347 -0.2919042,-0.31757 z"
+       style="fill:url(#linearGradient12593-3);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.07937501;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="csscssccc" />
+    <g
+       id="g18291"
+       transform="matrix(0.24102209,0,0,0.24102209,-89.770676,166.19959)">
+      <g
+         id="g4751-3"
+         clip-path="url(#clipPath4782-7-2)"
+         transform="matrix(-0.40789887,0.26719843,-0.26719843,-0.40789887,540.73338,515.16801)">
+        <path
+           id="path4532-9"
+           style="fill:#ffffff;stroke:#868789;stroke-width:1.4453578;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+           d="m 276.3071,132.25651 a 21.406287,18.906167 0 0 1 21.40628,18.90617 21.406287,18.906167 0 1 1 -21.40628,-18.90617 z"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         id="g4449-8"
+         transform="matrix(-0.02114565,0.13039867,-0.13039867,-0.02114565,432.9912,502.16397)">
+        <circle
+           cx="242.94168"
+           cy="308.38486"
+           r="70.205605"
+           id="path4138-5"
+           style="opacity:1;fill:url(#linearGradient4146-6-8);fill-opacity:1;stroke:#505050;stroke-width:12.46485138;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4138-7-0-6"
+           d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+           style="opacity:1;fill:#ffffff;fill-opacity:0.42452829;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4238-9-3)" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4138-7-1"
+           d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+           style="opacity:1;fill:url(#linearGradient4204-9-1);fill-opacity:1;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4254-1-3)" />
+      </g>
+    </g>
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:0.26458347;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 4.1010386,294.22195 h 0.5291667 v -0.52917"
+       id="path8218"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0"
+       id="path8220"
+       d="m 4.1010386,294.48653 h 0.79375 v -0.79375"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458347;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0"
+       id="path8224"
+       d="m 4.1010386,292.36986 h 0.5291667 v 0.52917"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:0.26458347;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458347;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 4.1010386,292.10528 h 0.79375 v 0.79375"
+       id="path8226"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0"
+       id="path8212"
+       d="M 3.3072886,294.22195 H 2.778122 v -0.52917"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:0.26458347;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458347;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="M 3.3072886,294.48653 H 2.5135387 v -0.79375"
+       id="path8214"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:0.26458347;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 2.778122,292.89903 v -0.52917 h 0.5291666"
+       id="path8248"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0"
+       id="path8204"
+       d="m 2.5135387,292.89903 v -0.79375 h 0.7937499"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458347;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_zoom_in-24.svg b/pixmaps/src/gwy_graph_zoom_in-24.svg
new file mode 100644
index 0000000..6363245
--- /dev/null
+++ b/pixmaps/src/gwy_graph_zoom_in-24.svg
@@ -0,0 +1,405 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_zoom_in-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689">
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4782-7-2">
+      <circle
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="circle4784-1-2"
+         cx="276.29214"
+         cy="151.18121"
+         r="19.066629" />
+    </clipPath>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       id="linearGradient4146-6-8"
+       xlink:href="#linearGradient4270" />
+    <linearGradient
+       id="linearGradient4270">
+      <stop
+         style="stop-color:#3c98f4;stop-opacity:0.12156863"
+         offset="0"
+         id="stop4272" />
+      <stop
+         style="stop-color:#f1f5fb;stop-opacity:0.12156863"
+         offset="1"
+         id="stop4274" />
+    </linearGradient>
+    <filter
+       height="1.1263148"
+       y="-0.063157417"
+       width="1.1142865"
+       x="-0.057143249"
+       id="filter4238-9-3"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4240-4-6"
+         stdDeviation="2.4600469" />
+    </filter>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="312.29819"
+       x2="227.00648"
+       y1="288.19104"
+       x1="214.93521"
+       id="linearGradient4204-9-1"
+       xlink:href="#linearGradient4198" />
+    <linearGradient
+       id="linearGradient4198">
+      <stop
+         id="stop4200-0"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0.39215687" />
+      <stop
+         id="stop4202"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0.3137255" />
+    </linearGradient>
+    <filter
+       height="1.025263"
+       y="-0.012631484"
+       width="1.0228573"
+       x="-0.011428649"
+       id="filter4254-1-3"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4256-7-1"
+         stdDeviation="0.49200938" />
+    </filter>
+    <linearGradient
+       gradientTransform="translate(-53.242097,127.71344)"
+       inkscape:collect="always"
+       xlink:href="#linearGradient12587-6"
+       id="linearGradient12593-3"
+       x1="363.08881"
+       y1="538.68573"
+       x2="365.21747"
+       y2="540.84064"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient12587-6">
+      <stop
+         style="stop-color:#6daa34;stop-opacity:1"
+         offset="0"
+         id="stop12589-7" />
+      <stop
+         id="stop13669-5"
+         offset="0.5"
+         style="stop-color:#7db846;stop-opacity:1" />
+      <stop
+         style="stop-color:#6daa34;stop-opacity:1"
+         offset="1"
+         id="stop12591-3" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter18492"
+       x="-0.047411256"
+       width="1.0948225"
+       y="-0.04860355"
+       height="1.0972071">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.42995752"
+         id="feGaussianBlur18494" />
+    </filter>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4782-7-2-3">
+      <circle
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="circle4784-1-2-6"
+         cx="276.29214"
+         cy="151.18121"
+         r="19.066629" />
+    </clipPath>
+    <filter
+       height="1.1263148"
+       y="-0.063157417"
+       width="1.1142865"
+       x="-0.057143249"
+       id="filter4238-9-3-7"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4240-4-6-5"
+         stdDeviation="2.4600469" />
+    </filter>
+    <filter
+       height="1.025263"
+       y="-0.012631484"
+       width="1.0228573"
+       x="-0.011428649"
+       id="filter4254-1-3-3"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4256-7-1-5"
+         stdDeviation="0.49200938" />
+    </filter>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath8518">
+      <g
+         style="fill:none"
+         id="g8532"
+         transform="matrix(0.91094965,0,0,0.91094965,17.85019,178.21156)">
+        <g
+           style="fill:none"
+           id="g8522"
+           clip-path="url(#clipPath4782-7-2-3)"
+           transform="matrix(-0.40789887,0.26719843,-0.26719843,-0.40789887,540.73338,515.16801)">
+          <path
+             id="path8520"
+             style="fill:none;stroke:#868789;stroke-width:1.4453578;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+             d="m 276.3071,132.25651 a 21.406287,18.906167 0 0 1 21.40628,18.90617 21.406287,18.906167 0 1 1 -21.40628,-18.90617 z"
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           style="fill:none"
+           id="g8530"
+           transform="matrix(-0.02114565,0.13039867,-0.13039867,-0.02114565,432.9912,502.16397)">
+          <circle
+             cx="242.94168"
+             cy="308.38486"
+             r="70.205605"
+             id="circle8524"
+             style="opacity:1;fill:none;fill-opacity:1;stroke:#505050;stroke-width:12.46485138;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path8526"
+             d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+             style="opacity:1;fill:none;fill-opacity:0.42452829;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4238-9-3-7)" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path8528"
+             d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+             style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4254-1-3-3)" />
+        </g>
+      </g>
+    </clipPath>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="17.244395"
+     inkscape:cx="28.140596"
+     inkscape:cy="7.1483865"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8419"
+       width="23"
+       height="23"
+       x="306.79822"
+       y="649.07532" />
+    <g
+       id="g8458"
+       transform="rotate(-90,318.79821,660.07531)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 307.29821,668.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,653.07531 h 22"
+         id="path8448"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,663.07531 h 22"
+         id="path8450"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8452"
+         d="m 307.29821,658.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="m 307.29821,668.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,653.07531 h 22"
+       id="path8438"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,663.07531 h 22"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="m 307.29821,658.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <g
+       id="g18446"
+       transform="translate(-51.527477,96.470462)"
+       style="opacity:0.5;filter:url(#filter18492)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path18369"
+         d="m 363.68784,568.4473 -5.08846,5.03989 c -0.0998,0.0989 -0.11276,0.3176 -0.0177,0.42101 l 1.80326,1.96183 c 0.095,0.10341 0.32123,0.11658 0.42097,0.0177 l 5.08846,-5.0399 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.99607843"
+         sodipodi:nodetypes="csssscc" />
+      <circle
+         transform="rotate(99.210991)"
+         cx="496.39133"
+         cy="-457.18619"
+         r="8.4484291"
+         id="circle18383"
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path4717-0-5"
+       d="m 312.97285,663.17376 -5.08846,5.03989 c -0.0998,0.0989 -0.11276,0.3176 -0.0177,0.42102 l 0.90163,0.98091 0.90162,0.98091 c 0.095,0.10341 0.32124,0.11658 0.42098,0.0177 l 5.08846,-5.0399 -1.10326,-1.20027 z"
+       style="fill:url(#linearGradient12593-3);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="csscssccc" />
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 329.27033,669.18417 c -15.94423,0 -16.48811,-18.38243 -21.94424,-18.38243"
+       id="path8254-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <g
+       id="g18291"
+       transform="matrix(0.91094965,0,0,0.91094965,-32.992537,178.21156)">
+      <g
+         id="g4751-3"
+         clip-path="url(#clipPath4782-7-2)"
+         transform="matrix(-0.40789887,0.26719843,-0.26719843,-0.40789887,540.73338,515.16801)">
+        <path
+           id="path4532-9"
+           style="fill:#ffffff;stroke:#868789;stroke-width:1.4453578;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+           d="m 276.3071,132.25651 a 21.406287,18.906167 0 0 1 21.40628,18.90617 21.406287,18.906167 0 1 1 -21.40628,-18.90617 z"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         id="g4449-8"
+         transform="matrix(-0.02114565,0.13039867,-0.13039867,-0.02114565,432.9912,502.16397)">
+        <circle
+           cx="242.94168"
+           cy="308.38486"
+           r="70.205605"
+           id="path4138-5"
+           style="opacity:1;fill:url(#linearGradient4146-6-8);fill-opacity:1;stroke:#505050;stroke-width:12.46485138;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4138-7-0-6"
+           d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+           style="opacity:1;fill:#ffffff;fill-opacity:0.42452829;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4238-9-3)" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4138-7-1"
+           d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+           style="opacity:1;fill:url(#linearGradient4204-9-1);fill-opacity:1;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4254-1-3)" />
+      </g>
+    </g>
+    <g
+       id="g8484">
+      <path
+         sodipodi:nodetypes="cc"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 324.32249,658.07558 h -8.00001"
+         id="path8234"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path8115"
+         d="m 324.29819,659.07558 h -8.00001"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <g
+       id="g8490"
+       transform="rotate(90,320.31033,658.57558)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8486"
+         d="m 324.32249,658.07558 h -8.00001"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 324.29819,659.07558 h -8.00001"
+         id="path8488"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cc" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_graph_zoom_out-24.svg b/pixmaps/src/gwy_graph_zoom_out-24.svg
new file mode 100644
index 0000000..5f3364d
--- /dev/null
+++ b/pixmaps/src/gwy_graph_zoom_out-24.svg
@@ -0,0 +1,386 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_graph_zoom_out-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689">
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4782-7-2">
+      <circle
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="circle4784-1-2"
+         cx="276.29214"
+         cy="151.18121"
+         r="19.066629" />
+    </clipPath>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       id="linearGradient4146-6-8"
+       xlink:href="#linearGradient4270" />
+    <linearGradient
+       id="linearGradient4270">
+      <stop
+         style="stop-color:#3c98f4;stop-opacity:0.12156863"
+         offset="0"
+         id="stop4272" />
+      <stop
+         style="stop-color:#f1f5fb;stop-opacity:0.12156863"
+         offset="1"
+         id="stop4274" />
+    </linearGradient>
+    <filter
+       height="1.1263148"
+       y="-0.063157417"
+       width="1.1142865"
+       x="-0.057143249"
+       id="filter4238-9-3"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4240-4-6"
+         stdDeviation="2.4600469" />
+    </filter>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="312.29819"
+       x2="227.00648"
+       y1="288.19104"
+       x1="214.93521"
+       id="linearGradient4204-9-1"
+       xlink:href="#linearGradient4198" />
+    <linearGradient
+       id="linearGradient4198">
+      <stop
+         id="stop4200-0"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0.39215687" />
+      <stop
+         id="stop4202"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0.3137255" />
+    </linearGradient>
+    <filter
+       height="1.025263"
+       y="-0.012631484"
+       width="1.0228573"
+       x="-0.011428649"
+       id="filter4254-1-3"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4256-7-1"
+         stdDeviation="0.49200938" />
+    </filter>
+    <linearGradient
+       gradientTransform="translate(-53.242097,127.71344)"
+       inkscape:collect="always"
+       xlink:href="#linearGradient12587-6"
+       id="linearGradient12593-3"
+       x1="363.08881"
+       y1="538.68573"
+       x2="365.21747"
+       y2="540.84064"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient12587-6">
+      <stop
+         style="stop-color:#6daa34;stop-opacity:1"
+         offset="0"
+         id="stop12589-7" />
+      <stop
+         id="stop13669-5"
+         offset="0.5"
+         style="stop-color:#7db846;stop-opacity:1" />
+      <stop
+         style="stop-color:#6daa34;stop-opacity:1"
+         offset="1"
+         id="stop12591-3" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter18492"
+       x="-0.047411256"
+       width="1.0948225"
+       y="-0.04860355"
+       height="1.0972071">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.42995752"
+         id="feGaussianBlur18494" />
+    </filter>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4782-7-2-3">
+      <circle
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="circle4784-1-2-6"
+         cx="276.29214"
+         cy="151.18121"
+         r="19.066629" />
+    </clipPath>
+    <filter
+       height="1.1263148"
+       y="-0.063157417"
+       width="1.1142865"
+       x="-0.057143249"
+       id="filter4238-9-3-7"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4240-4-6-5"
+         stdDeviation="2.4600469" />
+    </filter>
+    <filter
+       height="1.025263"
+       y="-0.012631484"
+       width="1.0228573"
+       x="-0.011428649"
+       id="filter4254-1-3-3"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4256-7-1-5"
+         stdDeviation="0.49200938" />
+    </filter>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath8518">
+      <g
+         style="fill:none"
+         id="g8532"
+         transform="matrix(0.91094965,0,0,0.91094965,17.85019,178.21156)">
+        <g
+           style="fill:none"
+           id="g8522"
+           clip-path="url(#clipPath4782-7-2-3)"
+           transform="matrix(-0.40789887,0.26719843,-0.26719843,-0.40789887,540.73338,515.16801)">
+          <path
+             id="path8520"
+             style="fill:none;stroke:#868789;stroke-width:1.4453578;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+             d="m 276.3071,132.25651 a 21.406287,18.906167 0 0 1 21.40628,18.90617 21.406287,18.906167 0 1 1 -21.40628,-18.90617 z"
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           style="fill:none"
+           id="g8530"
+           transform="matrix(-0.02114565,0.13039867,-0.13039867,-0.02114565,432.9912,502.16397)">
+          <circle
+             cx="242.94168"
+             cy="308.38486"
+             r="70.205605"
+             id="circle8524"
+             style="opacity:1;fill:none;fill-opacity:1;stroke:#505050;stroke-width:12.46485138;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path8526"
+             d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+             style="opacity:1;fill:none;fill-opacity:0.42452829;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4238-9-3-7)" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path8528"
+             d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+             style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4254-1-3-3)" />
+        </g>
+      </g>
+    </clipPath>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="10.411147"
+     inkscape:cx="-11.095701"
+     inkscape:cy="20.020839"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#4696db;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8419"
+       width="23"
+       height="23"
+       x="306.79822"
+       y="649.07532" />
+    <g
+       id="g8458"
+       transform="rotate(-90,318.79821,660.07531)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 307.29821,668.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,653.07531 h 22"
+         id="path8448"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 307.29821,663.07531 h 22"
+         id="path8450"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8452"
+         d="m 307.29821,658.07531 h 22"
+         style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="m 307.29821,668.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,653.07531 h 22"
+       id="path8438"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 307.29821,663.07531 h 22"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="m 307.29821,658.07531 h 22"
+       style="fill:none;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <g
+       id="g18446"
+       transform="translate(-51.527477,96.470462)"
+       style="opacity:0.5;filter:url(#filter18492)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path18369"
+         d="m 363.68784,568.4473 -5.08846,5.03989 c -0.0998,0.0989 -0.11276,0.3176 -0.0177,0.42101 l 1.80326,1.96183 c 0.095,0.10341 0.32123,0.11658 0.42097,0.0177 l 5.08846,-5.0399 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.99607843"
+         sodipodi:nodetypes="csssscc" />
+      <circle
+         transform="rotate(99.210991)"
+         cx="496.39133"
+         cy="-457.18619"
+         r="8.4484291"
+         id="circle18383"
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path4717-0-5"
+       d="m 312.97285,663.17376 -5.08846,5.03989 c -0.0998,0.0989 -0.11276,0.3176 -0.0177,0.42102 l 0.90163,0.98091 0.90162,0.98091 c 0.095,0.10341 0.32124,0.11658 0.42098,0.0177 l 5.08846,-5.0399 -1.10326,-1.20027 z"
+       style="fill:url(#linearGradient12593-3);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="csscssccc" />
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 329.27033,669.18417 c -15.94423,0 -16.48811,-18.38243 -21.94424,-18.38243"
+       id="path8254-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <g
+       id="g18291"
+       transform="matrix(0.91094965,0,0,0.91094965,-32.992537,178.21156)">
+      <g
+         id="g4751-3"
+         clip-path="url(#clipPath4782-7-2)"
+         transform="matrix(-0.40789887,0.26719843,-0.26719843,-0.40789887,540.73338,515.16801)">
+        <path
+           id="path4532-9"
+           style="fill:#ffffff;stroke:#868789;stroke-width:1.4453578;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+           d="m 276.3071,132.25651 a 21.406287,18.906167 0 0 1 21.40628,18.90617 21.406287,18.906167 0 1 1 -21.40628,-18.90617 z"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         id="g4449-8"
+         transform="matrix(-0.02114565,0.13039867,-0.13039867,-0.02114565,432.9912,502.16397)">
+        <circle
+           cx="242.94168"
+           cy="308.38486"
+           r="70.205605"
+           id="path4138-5"
+           style="opacity:1;fill:url(#linearGradient4146-6-8);fill-opacity:1;stroke:#505050;stroke-width:12.46485138;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4138-7-0-6"
+           d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+           style="opacity:1;fill:#ffffff;fill-opacity:0.42452829;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4238-9-3)" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4138-7-1"
+           d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+           style="opacity:1;fill:url(#linearGradient4204-9-1);fill-opacity:1;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4254-1-3)" />
+      </g>
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8234"
+       d="m 324.29819,658.07558 h -8.00001"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 324.29819,659.07558 h -8.00001"
+       id="path8115"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>
diff --git a/devel-docs/libgwydgets/html/gwy_hough-24.png b/pixmaps/src/gwy_hough-24.png
similarity index 100%
copy from devel-docs/libgwydgets/html/gwy_hough-24.png
copy to pixmaps/src/gwy_hough-24.png
diff --git a/pixmaps/src/gwy_hough-24.svg b/pixmaps/src/gwy_hough-24.svg
new file mode 100644
index 0000000..67c9784
--- /dev/null
+++ b/pixmaps/src/gwy_hough-24.svg
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_hough-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="25.938377"
+     inkscape:cx="50.686553"
+     inkscape:cy="17.648671"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#87c74a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8767"
+       width="8"
+       height="9"
+       x="321.79822"
+       y="649.07532" />
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 329.7595,669.22235 c -4.43202,-5.00162 -12.98066,-15.90723 -22.94023,-4.3682"
+       id="path8254-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="m 327.62006,669.26866 c -4.432,-5.00163 -11.02168,-16.83998 -21.11659,-6.05442"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 324.46208,669.12188 c -2.90671,-5.21571 -7.72836,-18.34692 -17.95861,-8.2262"
+       id="path8446"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8448"
+       d="m 322.53118,669.01649 c -0.71826,-3.4888 -6.06815,-21.14318 -16.02771,-11.59864"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:#e8f0e0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+       d="m 322.29821,653.57531 8,-1 -1,-3 h -7 z"
+       id="path8769"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <rect
+       y="649.07532"
+       x="321.79822"
+       height="9"
+       width="8"
+       id="rect8771"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot8781"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:justify;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       transform="translate(270.73512,691.14766)"><flowRegion
+         id="flowRegion8783"
+         style="font-size:4px;text-align:justify;text-anchor:start"><rect
+           id="rect8785"
+           width="8"
+           height="20"
+           x="14"
+           y="2"
+           style="font-size:4px;text-align:justify;text-anchor:start" /></flowRegion><flowPara
+         id="flowPara8787">ASCA</flowPara></flowRoot>    <flowRoot
+       xml:space="preserve"
+       id="flowRoot8789"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.66666675px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       transform="translate(270.73512,691.14766)"><flowRegion
+         id="flowRegion8791"
+         style="font-size:2.66666675px;text-align:start;text-anchor:start"><rect
+           id="rect8793"
+           width="8"
+           height="20"
+           x="14"
+           y="2"
+           style="font-size:2.66666675px;text-align:start;text-anchor:start" /></flowRegion><flowPara
+         id="flowPara8797" /></flowRoot>    <path
+       sodipodi:nodetypes="cccc"
+       inkscape:connector-curvature="0"
+       id="path8687"
+       d="m 318.29822,661.57531 -1e-5,6 -6,-6 z"
+       style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8689"
+       d="m 317.12664,664.83267 -5.65685,5.65686 -2,-2.00001 5.65685,-5.65687 z"
+       style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 321.92321,653.62218 8.125,-1.01562"
+       id="path8982"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_immerse-24.svg b/pixmaps/src/gwy_immerse-24.svg
new file mode 100644
index 0000000..b4eadb5
--- /dev/null
+++ b/pixmaps/src/gwy_immerse-24.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_immerse-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.247769"
+     inkscape:cx="-15.740329"
+     inkscape:cy="33.331094"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect11370"
+       width="23"
+       height="23"
+       x="197.86205"
+       y="472.83786" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#e8f0e0;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 1;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 204.86205,479.83789 h 14 v 14 h -14 z"
+       id="rect8153"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_iso_roughness-24.svg b/pixmaps/src/gwy_iso_roughness-24.svg
new file mode 100644
index 0000000..cf64237
--- /dev/null
+++ b/pixmaps/src/gwy_iso_roughness-24.svg
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8233"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_iso_roughness-24.svg"
+   inkscape:export-filename="gwy_iso_roughness-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8235" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.248757"
+     inkscape:cx="-15.541144"
+     inkscape:cy="27.382642"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-object-midpoints="true"
+     inkscape:snap-intersection-paths="false"
+     inkscape:snap-grids="false"
+     showguides="false"
+     inkscape:measure-start="17.2503,10.6451"
+     inkscape:measure-end="17.2705,8.98876">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8238">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-138.4993,-575.0819)">
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;ove [...]
+       d="m 154.93868,576.58914 -6.11084,8.58795 -2.41205,-2.90843 -1.91205,1.97711 2.91205,3.52289 h -6.5 v 2.81324 h 19 v -2.81324 h -9.5 l 6.5,-9.5 z"
+       id="path8254"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 152.84515,594.60342 c -0.0183,-0.0772 -0.0329,-0.13919 -0.0547,-0.21875 -0.39553,-1.44599 -1.06043,-1.33656 -1.14034,-2.82804 -0.42549,1.48234 -0.7642,1.56111 -1.3019,2.93937 m 2.4969,0.10742 c 0.69617,2.93038 1.44529,3.5918 1.44529,3.5918 0,0 0.63269,-1.52319 1.73873,-2.28516 0.50287,-0.34643 1.06639,-0.91115 1.74806,0.32685 1.10603,1.43926 0.55328,1.86276 1.10629,1.43945 0.55302,-0.42331 0.70979,-1.83273 0.70979,-1.83273 l 0.0699,-0.95001 c 0,0 0.895,-3.0166 2.02959,-0.5926 [...]
+       id="path8538"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="csccccscsccccssscsc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_italic-20.svg b/pixmaps/src/gwy_italic-20.svg
new file mode 100644
index 0000000..3a28bb9
--- /dev/null
+++ b/pixmaps/src/gwy_italic-20.svg
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="20"
+     height="20"
+     viewBox="0 0 20 20"
+     id="svg8833"
+     version="1.1"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_italic-20.svg">
+    <defs
+         id="defs8835">
+        <linearGradient
+             gradientTransform="translate(-11.142957,824.89612)"
+             xlink:href="#linearGradient4140"
+             id="linearGradient4171"
+             gradientUnits="userSpaceOnUse"
+             x1="207.50029"
+             y1="247.92804"
+             x2="272.91217"
+             y2="361.22473" />
+        <linearGradient
+             id="linearGradient4140">
+            <stop
+                 style="stop-color:#d7e3f4;stop-opacity:1;"
+                 offset="0"
+                 id="stop4142" />
+            <stop
+                 style="stop-color:#f1f5fb;stop-opacity:1"
+                 offset="1"
+                 id="stop4144" />
+        </linearGradient>
+    </defs>
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="47.274784"
+         inkscape:cx="9.999993"
+         inkscape:cy="8.3210188"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         units="px"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:document-rotation="0">
+        <inkscape:grid
+             type="xygrid"
+             id="grid1px"
+             originx="0"
+             originy="0"
+             dotted="false"
+             snapvisiblegridlinesonly="false"
+             spacingx="0.5"
+             spacingy="0.5"
+             enabled="true"
+             visible="true"
+             units="px"
+             empspacing="2" />
+    </sodipodi:namedview>
+    <metadata
+         id="metadata8838">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-199.64375,-494.06708)">
+        <text
+             xml:space="preserve"
+             style="color:#000000;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.63895416px;line-height:120.00000477%;font-family:'Linux Libertine O';-inkscape-font-specification:'Linux Libertine O Italic';text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;shape-padding:0;overflow:visible;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.01118124;stroke-linecap:round;stroke-linejoin:round;paint-o [...]
+             x="204.03304"
+             y="512.97797"
+             id="text4304"><tspan
+                 sodipodi:role="line"
+                 id="tspan4302"
+                 x="204.03304"
+                 y="512.97797"
+                 style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Linux Libertine O';-inkscape-font-specification:'Linux Libertine O Italic';stroke-width:1.01118124">I</tspan></text>
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_less-24.svg b/pixmaps/src/gwy_less-24.svg
new file mode 100644
index 0000000..2ae9a7b
--- /dev/null
+++ b/pixmaps/src/gwy_less-24.svg
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_less-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.0630899"
+     inkscape:cx="1.9641561"
+     inkscape:cy="11.987625"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <path
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolation:sRGB;color-interpolation-filters:linearRGB;fill:#4696db;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="M 14.333984 0.50195312 C 12.809464 0.50195312 14.091866 2.5088775 11.166016 2.7734375 C 7.6983256 3.0870375 9.6052044 -0.067941875 6.5214844 1.5488281 C 3.4377844 3.1656481 7.1189719 3.3925463 4.8886719 6.0664062 C 2.6584219 8.7402062 1.7756012 5.1586319 0.73828125 8.4824219 C -0.29901875 11.806212 2.4637537 9.3642713 2.7773438 12.832031 C 3.0909438 16.299741 -0.06595875 14.390839 1.5507812 17.474609 C 3.1675212 20.558379 3.3946094 16.879025 6.0683594 19.109375 C 8.7421594 21.3 [...]
+       transform="translate(197.36205,472.33789)"
+       id="path4236" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8080"
+       d="m 214.36205,484.33789 h -10"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_level-24.svg b/pixmaps/src/gwy_level-24.svg
new file mode 100644
index 0000000..d5f40ee
--- /dev/null
+++ b/pixmaps/src/gwy_level-24.svg
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 22.499999 22.499999"
+     id="svg8233"
+     version="1.1"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_level-24.svg">
+    <defs
+         id="defs8235">
+        <linearGradient
+             inkscape:collect="always"
+             xlink:href="#linearGradient8308-6"
+             id="linearGradient8314"
+             x1="383.79593"
+             y1="544.1178"
+             x2="360.2847"
+             y2="520.60657"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.91711503,0,0,0.91711503,63.562131,186.16072)" />
+        <linearGradient
+             id="linearGradient8308-6"
+             inkscape:collect="always">
+            <stop
+                 id="stop8310-7"
+                 offset="0"
+                 style="stop-color:#0c1e2d;stop-opacity:1" />
+            <stop
+                 style="stop-color:#4696db;stop-opacity:1"
+                 offset="0.5"
+                 id="stop8351-5" />
+            <stop
+                 id="stop8312-3"
+                 offset="1"
+                 style="stop-color:#ffffff;stop-opacity:1" />
+        </linearGradient>
+    </defs>
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="35.291665"
+         inkscape:cx="15.995277"
+         inkscape:cy="11.999998"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:document-rotation="0"
+         units="px">
+        <inkscape:grid
+             type="xygrid"
+             id="grid4270"
+             units="px"
+             spacingx="0.46874998"
+             spacingy="0.46874998"
+             empspacing="2" />
+    </sodipodi:namedview>
+    <metadata
+         id="metadata8238">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-393.51587,-663.14807)">
+        <rect
+             style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8314);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+             id="rect8276"
+             width="21.5625"
+             height="21.5625"
+             x="393.98462"
+             y="663.61682" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_level_flatten_base-24.svg b/pixmaps/src/gwy_level_flatten_base-24.svg
new file mode 100644
index 0000000..ecfe76e
--- /dev/null
+++ b/pixmaps/src/gwy_level_flatten_base-24.svg
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="6.3499999mm"
+   height="6.3499999mm"
+   viewBox="0 0 22.499999 22.499999"
+   id="svg8233"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_level_flatten_base-24.svg">
+  <defs
+     id="defs8235">
+    <linearGradient
+       id="linearGradient8476"
+       inkscape:collect="always">
+      <stop
+         id="stop8478"
+         offset="0"
+         style="stop-color:#84b9e7;stop-opacity:1;" />
+      <stop
+         id="stop8472"
+         offset="0.5"
+         style="stop-color:#4696db;stop-opacity:1" />
+      <stop
+         style="stop-color:#0c1e2d;stop-opacity:1"
+         offset="1"
+         id="stop8474" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8461">
+      <stop
+         id="stop8459"
+         offset="0"
+         style="stop-color:#c3ddf3;stop-opacity:1" />
+      <stop
+         style="stop-color:#4696db;stop-opacity:1"
+         offset="0.5"
+         id="stop8457" />
+      <stop
+         id="stop8455"
+         offset="1"
+         style="stop-color:#0c1e2d;stop-opacity:1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8461"
+       id="radialGradient8453"
+       cx="399.62149"
+       cy="669.53729"
+       fx="399.62149"
+       fy="669.53729"
+       r="4.6090899"
+       gradientTransform="matrix(1.6424449,0,0,1.5512699,-256.26603,-366.7521)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8476"
+       id="radialGradient8468"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0078432,0.12712806,-0.10931515,0.8666265,80.321789,48.28806)"
+       cx="399.62149"
+       cy="669.53729"
+       fx="399.62149"
+       fy="669.53729"
+       r="4.6090899" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8476"
+       id="radialGradient8482"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.41669688,0.72603327,-0.68429482,0.3950778,690.43818,126.42944)"
+       cx="399.62149"
+       cy="669.53729"
+       fx="399.62149"
+       fy="669.53729"
+       r="4.6090899" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8461"
+       id="radialGradient8486"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1368442,0,0,1.0761482,-43.107242,-50.997791)"
+       cx="399.62149"
+       cy="669.53729"
+       fx="399.62149"
+       fy="669.53729"
+       r="4.6090899" />
+    <linearGradient
+       gradientTransform="matrix(0.97825612,0,0,0.97825612,-64.808519,-63.250439)"
+       gradientUnits="userSpaceOnUse"
+       y2="522.59552"
+       x2="373.68384"
+       y1="543.81458"
+       x1="373.68384"
+       id="linearGradient8314-3"
+       xlink:href="#linearGradient8308"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient8308"
+       inkscape:collect="always">
+      <stop
+         id="stop8310"
+         offset="0"
+         style="stop-color:#0c1e2d;stop-opacity:1" />
+      <stop
+         style="stop-color:#4696db;stop-opacity:1"
+         offset="0.25"
+         id="stop8260" />
+      <stop
+         style="stop-color:#97c4eb;stop-opacity:1"
+         offset="0.5"
+         id="stop8351" />
+      <stop
+         id="stop8258"
+         offset="0.75"
+         style="stop-color:#4696db;stop-opacity:1" />
+      <stop
+         id="stop8312"
+         offset="1"
+         style="stop-color:#c3ddf3;stop-opacity:1" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="23.261527"
+     inkscape:cx="12.170529"
+     inkscape:cy="16.523995"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8238">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-393.51587,-663.14807)">
+    <g
+       transform="matrix(0.93749996,0,0,0.93749996,124.32009,245.45796)"
+       id="layer1-7"
+       inkscape:label="Layer 1">
+      <rect
+         y="446.03613"
+         x="287.64218"
+         height="23.000002"
+         width="23.000002"
+         id="rect8276-5"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8314-3);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    </g>
+    <path
+       style="fill:url(#radialGradient8453);fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:0.9375px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 398.28502,667.81028 c -5.98219,3.68926 1.07646,9.57049 3.99831,8.21802 2.57687,-1.13512 -0.50322,-9.63491 -3.99831,-8.21802 z"
+       id="path8431"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       sodipodi:nodetypes="sss"
+       inkscape:connector-curvature="0"
+       id="path8466"
+       d="m 408.4414,676.06619 c -4.27771,3.66034 1.40603,8.43968 3.20175,6.58883 4.37272,-4.50695 -1.25228,-8.25695 -3.20175,-6.58883 z"
+       style="fill:url(#radialGradient8468);fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:0.9375px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:url(#radialGradient8482);fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:0.93749994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 400.38912,678.89943 c -3.74951,-2.0262 -4.69969,3.47671 -3.10437,4.60304 3.34353,1.6021 5.98034,-2.70344 3.10437,-4.60304 z"
+       id="path8480"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0"
+       id="path8484"
+       d="m 409.96122,666.72358 c -4.1055,2.53758 0.73876,6.58285 2.74398,5.65259 1.89278,-0.80026 0.63704,-7.5158 -2.74398,-5.65259 z"
+       style="fill:url(#radialGradient8486);fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:0.9375px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_level_median-24.svg b/pixmaps/src/gwy_level_median-24.svg
new file mode 100644
index 0000000..16b1d8b
--- /dev/null
+++ b/pixmaps/src/gwy_level_median-24.svg
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="6.3499999mm"
+   height="6.3499999mm"
+   viewBox="0 0 22.499999 22.499999"
+   id="svg8233"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_level_median-24.svg">
+  <defs
+     id="defs8235">
+    <linearGradient
+       id="linearGradient8550"
+       inkscape:collect="always">
+      <stop
+         id="stop8544"
+         offset="0"
+         style="stop-color:#0c1e2d;stop-opacity:1" />
+      <stop
+         style="stop-color:#4696db;stop-opacity:1"
+         offset="0.50000018"
+         id="stop8546" />
+      <stop
+         id="stop8548"
+         offset="1"
+         style="stop-color:#c3ddf3;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8308-6">
+      <stop
+         style="stop-color:#0c1e2d;stop-opacity:1"
+         offset="0"
+         id="stop8310-7" />
+      <stop
+         id="stop8351-5"
+         offset="0.5"
+         style="stop-color:#4696db;stop-opacity:1" />
+      <stop
+         style="stop-color:#c3ddf3;stop-opacity:1"
+         offset="1"
+         id="stop8312-3" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308-6"
+       id="linearGradient8477"
+       x1="415.07837"
+       y1="682.83557"
+       x2="408.57648"
+       y2="675.53278"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8550"
+       id="linearGradient8542"
+       gradientUnits="userSpaceOnUse"
+       x1="406.81067"
+       y1="682.50177"
+       x2="399.05283"
+       y2="674.67419"
+       gradientTransform="matrix(1.0666667,0,0,1.0666667,-419.75028,-707.35797)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="8.2981426"
+     inkscape:cx="178.9366"
+     inkscape:cy="-48.272016"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8238">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-393.51587,-663.14807)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8276"
+       width="21.5625"
+       height="21.5625"
+       x="393.98462"
+       y="663.61682" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:url(#linearGradient8542);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 1;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 1,1 v 22 h 6 9 V 7 H 7 V 1 Z"
+       transform="matrix(0.93749996,0,0,0.93749996,393.51587,663.14807)"
+       id="rect8432"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccc" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8434"
+       width="5.6249995"
+       height="10.312502"
+       x="394.45337"
+       y="664.08557" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:1.87499988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8422"
+       width="4.6875"
+       height="4.6875"
+       x="398.20337"
+       y="668.77307" />
+    <rect
+       y="678.14807"
+       x="396.32837"
+       height="1.8749999"
+       width="1.8749999"
+       id="rect8452"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:url(#linearGradient8477);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 408.51587,664.08557 h 6.5625 v 20.625 h -6.5625 z"
+       id="rect8436"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 408.51587,664.08557 h 6.5625 v 5.625 h -6.5625 z"
+       id="rect8438"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:0.93749994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+       d="m 403.82837,669.71057 v 1.875 h 3.75 v 2.8125 l 3.75,-3.75 -3.75,-3.75 v 2.8125 z"
+       id="path8440"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccc" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8442"
+       width="1.8749999"
+       height="1.8749999"
+       x="403.82837"
+       y="665.02307" />
+    <rect
+       y="663.61682"
+       x="393.98462"
+       height="21.5625"
+       width="21.5625"
+       id="rect8454"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8446-3"
+       width="1.8749998"
+       height="1.8749998"
+       x="395.39087"
+       y="666.89807" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8446-6"
+       width="1.8749998"
+       height="1.8749998"
+       x="403.82837"
+       y="681.89807" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8446-5"
+       width="1.8749998"
+       height="1.8749998"
+       x="411.32837"
+       y="674.39807" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_level_triangle-24.svg b/pixmaps/src/gwy_level_triangle-24.svg
new file mode 100644
index 0000000..9236ed6
--- /dev/null
+++ b/pixmaps/src/gwy_level_triangle-24.svg
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="6.3499999mm"
+   height="6.3499999mm"
+   viewBox="0 0 22.499999 22.499999"
+   id="svg8235"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_level_triangle-24.svg">
+  <defs
+     id="defs8237">
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8308"
+       id="linearGradient8314"
+       x1="383.79593"
+       y1="544.1178"
+       x2="360.2847"
+       y2="520.60657"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.91711505,0,0,0.91711505,7.3336455,214.72289)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8308">
+      <stop
+         style="stop-color:#0c1e2d;stop-opacity:1"
+         offset="0"
+         id="stop8310" />
+      <stop
+         id="stop8351"
+         offset="0.5"
+         style="stop-color:#4696db;stop-opacity:1" />
+      <stop
+         style="stop-color:#c3ddf3;stop-opacity:1"
+         offset="1"
+         id="stop8312" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.6175628"
+     inkscape:cx="-17.376917"
+     inkscape:cy="17.152855"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata8240">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-337.28741,-691.71021)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8314);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8276"
+       width="21.5625"
+       height="21.5625"
+       x="337.75616"
+       y="692.17896" />
+    <path
+       sodipodi:type="star"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.50000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path8353"
+       sodipodi:sides="3"
+       sodipodi:cx="-6.9927492"
+       sodipodi:cy="-15.496084"
+       sodipodi:r1="8.4450436"
+       sodipodi:r2="8.4450436"
+       sodipodi:arg1="0.52359878"
+       sodipodi:arg2="1.5707963"
+       inkscape:flatsided="true"
+       inkscape:rounded="0"
+       inkscape:randomized="0.05"
+       d="m 0.31871757,-11.516488 -14.64170257,0.433875 7.5561854,-13.188873 z"
+       transform="rotate(-132.93201,327.18886,266.71786)"
+       inkscape:transform-center-x="-2.4492461"
+       inkscape:transform-center-y="-2.643661" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_light_rotate-24.svg b/pixmaps/src/gwy_light_rotate-24.svg
new file mode 100644
index 0000000..eeab09a
--- /dev/null
+++ b/pixmaps/src/gwy_light_rotate-24.svg
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   id="svg2160"
+   sodipodi:version="0.32"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_light_rotate-24.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.1"
+   inkscape:export-filename="gwy_rotate-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs2162">
+    <filter
+       height="1.2250096"
+       y="-0.11250482"
+       width="1.2571303"
+       x="-0.12856513"
+       id="filter8458"
+       style="color-interpolation-filters:sRGB"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur8460"
+         stdDeviation="0.16275744"
+         inkscape:collect="always" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="-157.99815"
+     inkscape:cy="-60.043148"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     showguides="false"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true"
+     inkscape:snap-intersection-paths="false"
+     inkscape:object-nodes="true"
+     inkscape:snap-smooth-nodes="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata2165">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-8)">
+    <path
+       style="fill:#7db846;fill-opacity:1;stroke:#000000;stroke-width:0.99998635;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 1.8496094,14.414062 1.2363281,6.875 1.4199219,-1.326171 C 7.347699,23.913715 15.0313,25.741322 19.935547,20.1875 l 1.179687,1.101562 1.236328,-6.875 -6.539062,1.417969 1.414062,1.378907 c 0,0 -1.746066,2.72188 -5.125,2.794921 C 8.7213585,19.93382 6.9746094,17.210938 6.9746094,17.210938 l 1.4140625,-1.378907 z"
+       transform="translate(0,8)"
+       id="path5078-9-4"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccc" />
+    <path
+       transform="matrix(0.99573837,-0.0455901,-0.0429025,-0.98645432,-215.19353,636.30694)"
+       sodipodi:nodetypes="cccscc"
+       inkscape:connector-curvature="0"
+       id="path8135"
+       d="m 247.77811,607.10722 2.04551,-1.97639 c 3.084,-2.18671 6.53572,-2.30166 9.97068,1.1396 -3.7021,-2.69151 -7.12396,-2.68218 -9.89762,-0.0149 -1.09475,1.05276 -1.29524,1.31798 -1.29524,1.31798 z"
+       style="opacity:0.75;fill:#ffdd7f;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458);fill-opacity:1" />
+    <path
+       transform="matrix(-0.85739481,-0.50081959,-0.50814335,0.85108772,529.84248,-362.00938)"
+       style="opacity:0.26000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 253.47872,607.61144 1.81198,-1.81975 0.89043,-1.02933 c 0,0 0.0967,0.57698 -0.92284,1.70274 -1.01955,1.12575 -1.31704,1.26648 -1.31704,1.26648 z"
+       id="path8141"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccscc" />
+    <path
+       style="opacity:0.75;fill:#ffdd7f;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458);fill-opacity:1"
+       d="m 247.77811,607.10722 2.04551,-1.97639 c 3.084,-2.18671 6.53572,-2.30166 9.97068,1.1396 -3.7021,-2.69151 -7.12396,-2.68218 -9.89762,-0.0149 -1.09475,1.05276 -1.29524,1.31798 -1.29524,1.31798 z"
+       id="path8520"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccscc"
+       transform="matrix(-0.99573837,-0.0455901,0.04290251,-0.98645431,239.39468,636.30694)" />
+    <path
+       sodipodi:nodetypes="cccscc"
+       inkscape:connector-curvature="0"
+       id="path8522"
+       d="m 253.47872,607.61144 1.81198,-1.81975 0.89043,-1.02933 c 0,0 0.0967,0.57698 -0.92284,1.70274 -1.01955,1.12575 -1.31704,1.26648 -1.31704,1.26648 z"
+       style="opacity:0.26000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       transform="matrix(0.85739481,-0.50081959,0.50814334,0.85108772,-505.64132,-362.00938)" />
+    <g
+       id="g8610"
+       transform="matrix(0.89086699,0,0,0.89086699,1.3095957,0.65789596)"
+       style="stroke-width:1.12250197">
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="path8604"
+         d="m 9.2579495,22.303462 v 2.775595 H 14.738929 V 22.303462 H 9.2579495"
+         style="fill:#b3b3b3;fill-rule:evenodd;stroke:#000000;stroke-width:1.12250197px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <g
+         transform="translate(1.4807662e-7,-1.9999993)"
+         id="g8598"
+         style="stroke-width:1.12250197">
+        <path
+           style="opacity:1;fill:#ffdd7f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.12250197;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 11.99844,10.802801 c -3.2052325,0.02969 -5.1845825,2.276669 -5.4185544,4.815007 -0.3198967,3.47053 2.5425835,5.386805 2.525121,6.840417 l 0.1529428,1.845236 c 1.5288716,1.208207 3.9487396,1.145923 5.4809796,0 l 0.156065,-1.845236 c -0.01746,-1.453612 2.845017,-3.369887 2.525121,-6.840417 -0.233972,-2.538338 -2.216444,-4.785316 -5.421675,-4.815007 z"
+           id="path8547"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="csccccsc" />
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.12250197px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+           d="m 11.136954,19.088537 -1.3343579,-3.770478 1.0987029,0.463355 1.098702,-0.524566 1.098703,0.48784 1.098702,-0.50008 -0.661058,1.83627"
+           id="path8094"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccccc" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_line_level-24.svg b/pixmaps/src/gwy_line_level-24.svg
new file mode 100644
index 0000000..c1489c7
--- /dev/null
+++ b/pixmaps/src/gwy_line_level-24.svg
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24.000002"
+   viewBox="0 0 24 24.000002"
+   id="svg8366"
+   version="1.1"
+   inkscape:version="0.92+devel unknown"
+   sodipodi:docname="gwy_line_level-24.svg">
+  <defs
+     id="defs8368" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="5.9999989"
+     inkscape:cy="33.749495"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1149"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     inkscape:document-rotation="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4272"
+       units="px"
+       spacingx="0.46875"
+       spacingy="0.5"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata8371">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-108.11022,-621.909)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8276"
+       width="23.050062"
+       height="23.000006"
+       x="108.56017"
+       y="622.409" />
+    <path
+       style="fill:#255278;fill-rule:evenodd;stroke:#336ea1;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
+       d="m 108.1102,625.39853 h 24"
+       id="path8537"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8539"
+       d="m 108.11022,628.409 h 24.00181"
+       style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#57a0de;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 108.11022,632.409 h 24"
+       id="path8541"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8543"
+       d="m 108.1102,636.40899 h 24"
+       style="fill:none;fill-rule:evenodd;stroke:#57a0de;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:1;vector-effect:none;fill-opacity:1;stroke-dashoffset:0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.0209229;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 108.16028,641.40901 h 24"
+       id="path8545"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:1;vector-effect:none;fill:#255278;fill-opacity:1;fill-rule:evenodd;stroke:#336ea1;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 108.11022,638.409 h 24"
+       id="path8549"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 108.11022,627.409 h 24.00181"
+       id="path4896"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4898"
+       d="m 108.11021,629.40901 h 24.00181"
+       style="fill:#255278;fill-rule:evenodd;stroke:#336ea1;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:1;vector-effect:none;fill-opacity:1;stroke-dashoffset:0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 108.11022,624.409 h 24.00181"
+       id="path4900"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4902"
+       d="m 108.11022,631.409 h 24.00181"
+       style="opacity:1;vector-effect:none;fill:#255278;fill-opacity:1;fill-rule:evenodd;stroke:#336ea1;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <path
+       style="fill:#eff6fc;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
+       d="m 108.15847,634.40901 h 24.00181"
+       id="path4904"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4906"
+       d="m 108.10841,637.409 h 24.00181"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:#255278;fill-rule:evenodd;stroke:#336ea1;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:1;vector-effect:none;fill-opacity:1;stroke-dashoffset:0"
+       d="m 108.15847,635.40901 h 24.00181"
+       id="path4908"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4910"
+       d="m 108.10841,633.409 h 24.00181"
+       style="fill:none;fill-rule:evenodd;stroke:#57a0de;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 108.15847,630.40901 h 24.00181"
+       id="path4912"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4914"
+       d="m 108.10841,639.409 h 24.00181"
+       style="opacity:1;vector-effect:none;fill:#eff6fc;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#57a0de;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:1;vector-effect:none;fill-opacity:1;stroke-dashoffset:0"
+       d="m 108.15847,642.40901 h 24.00181"
+       id="path4916"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4918"
+       d="m 108.15847,643.40901 h 24.00181"
+       style="fill:#255278;fill-rule:evenodd;stroke:#336ea1;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:1;vector-effect:none;fill-opacity:1;stroke-dashoffset:0" />
+    <rect
+       y="622.409"
+       x="108.61022"
+       height="23.000006"
+       width="23.050062"
+       id="rect4920"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="622.409"
+       x="108.56017"
+       height="23.000006"
+       width="23.050062"
+       id="rect4922"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_load_debug-20.svg b/pixmaps/src/gwy_load_debug-20.svg
new file mode 100644
index 0000000..7931f32
--- /dev/null
+++ b/pixmaps/src/gwy_load_debug-20.svg
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="20"
+   height="20"
+   viewBox="0 0 20 20"
+   id="svg8833"
+   version="1.1"
+   inkscape:version="0.92+devel unknown"
+   sodipodi:docname="gwy_load_debug-20.svg">
+  <defs
+     id="defs8835">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient980">
+      <stop
+         id="stop978"
+         offset="0"
+         style="stop-color:#e7e78e;stop-opacity:1" />
+      <stop
+         style="stop-color:#e8d665;stop-opacity:1"
+         offset="0.5"
+         id="stop976" />
+      <stop
+         id="stop974"
+         offset="1"
+         style="stop-color:#d4ad1c;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(-11.142957,824.89612)"
+       xlink:href="#linearGradient4140"
+       id="linearGradient4171"
+       gradientUnits="userSpaceOnUse"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       id="linearGradient4140">
+      <stop
+         style="stop-color:#d7e3f4;stop-opacity:1;"
+         offset="0"
+         id="stop4142" />
+      <stop
+         style="stop-color:#f1f5fb;stop-opacity:1"
+         offset="1"
+         id="stop4144" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient980"
+       id="radialGradient972"
+       cx="206.41296"
+       cy="502.06705"
+       fx="206.41296"
+       fy="502.06705"
+       r="10"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.5000009,1.7594542e-6,-1.8767497e-6,1.6,-102.97495,-301.24055)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="12.895588"
+     inkscape:cx="10.235174"
+     inkscape:cy="12.528501"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1149"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     inkscape:document-rotation="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid1px"
+       originx="0"
+       originy="0"
+       dotted="false"
+       snapvisiblegridlinesonly="false"
+       spacingx="0.5"
+       spacingy="0.5"
+       enabled="true"
+       visible="true"
+       units="px"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata8838">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-199.64375,-494.06708)">
+    <circle
+       style="color:#000000;overflow:visible;vector-effect:none;fill:url(#radialGradient972);fill-rule:evenodd;stroke:none;stroke-width:1.00000012;fill-opacity:1"
+       id="path101"
+       cx="209.64375"
+       cy="504.06708"
+       r="10" />
+    <path
+       style="fill:#000000;stroke-width:0.08205362"
+       d="m 212.59869,510.41856 c -1.06373,0.287 -2.25786,0.20514 -3.27268,-0.22433 -0.26885,-0.11378 -0.50132,-0.18223 -0.51659,-0.15209 -0.0153,0.0301 0.002,0.57048 0.0376,1.20076 0.0573,1.00248 0.0423,1.1691 -0.11912,1.33056 -0.2104,0.2104 -0.59971,0.2696 -0.75456,0.11475 -0.0575,-0.0575 -0.16104,-0.89257 -0.23009,-1.8557 l -0.12555,-1.75117 -0.31496,-0.31826 c -0.28017,-0.28266 -0.54887,-0.67016 -0.73569,-1.06018 -0.0461,-0.0964 -0.22245,0.27119 -0.66983,1.39671 -0.74984,1.88643 -0.9 [...]
+       id="path2113"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_load_info-20.svg b/pixmaps/src/gwy_load_info-20.svg
new file mode 100644
index 0000000..549b1ea
--- /dev/null
+++ b/pixmaps/src/gwy_load_info-20.svg
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="20"
+   height="20"
+   viewBox="0 0 20 20"
+   id="svg8833"
+   version="1.1"
+   inkscape:version="0.92+devel unknown"
+   sodipodi:docname="gwy_load_info-20.svg">
+  <defs
+     id="defs8835">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient980">
+      <stop
+         id="stop978"
+         offset="0"
+         style="stop-color:#70aee3;stop-opacity:1" />
+      <stop
+         style="stop-color:#3f88c7;stop-opacity:1"
+         offset="0.5"
+         id="stop976" />
+      <stop
+         id="stop974"
+         offset="1"
+         style="stop-color:#295a84;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(-11.142957,824.89612)"
+       xlink:href="#linearGradient4140"
+       id="linearGradient4171"
+       gradientUnits="userSpaceOnUse"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       id="linearGradient4140">
+      <stop
+         style="stop-color:#d7e3f4;stop-opacity:1;"
+         offset="0"
+         id="stop4142" />
+      <stop
+         style="stop-color:#f1f5fb;stop-opacity:1"
+         offset="1"
+         id="stop4144" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient980"
+       id="radialGradient972"
+       cx="206.41296"
+       cy="502.06705"
+       fx="206.41296"
+       fy="502.06705"
+       r="10"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.5000009,1.7594542e-6,-1.8767497e-6,1.6,-102.97495,-301.24055)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="44.85"
+     inkscape:cx="10.000003"
+     inkscape:cy="10.000002"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1149"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     inkscape:document-rotation="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid1px"
+       originx="0"
+       originy="0"
+       dotted="false"
+       snapvisiblegridlinesonly="false"
+       spacingx="0.5"
+       spacingy="0.5"
+       enabled="true"
+       visible="true"
+       units="px"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata8838">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-199.64375,-494.06708)">
+    <circle
+       style="color:#000000;overflow:visible;vector-effect:none;fill:url(#radialGradient972);fill-rule:evenodd;stroke:none;stroke-width:1.00000012;fill-opacity:1"
+       id="path101"
+       cx="209.64375"
+       cy="504.06708"
+       r="10" />
+    <g
+       id="g1007"
+       transform="translate(0,-0.39018934)">
+      <path
+         sodipodi:nodetypes="csccccssccscccc"
+         inkscape:connector-curvature="0"
+         id="path997"
+         d="m 211.32463,508.82231 v -5.14599 c 0,-1.29297 0.10342,-2.74108 0.10342,-2.74108 0,-0.28445 -0.23274,-0.4396 -0.59476,-0.4396 -0.74992,0.28445 -2.81866,0.49132 -4.60294,0.72405 -0.0517,0.15516 0,0.67234 0.0517,0.8275 1.39641,0.15515 1.68086,0.33616 1.68086,1.81015 v 4.96497 c 0,2.14631 -0.28445,2.19803 -1.86187,2.32732 -0.15515,0.15516 -0.15515,0.72407 0,0.87922 1.08609,-0.0259 2.14632,-0.0517 3.54271,-0.0517 1.37055,0 2.43077,0.0259 3.54271,0.0517 0.15516,-0.15515 0.15516,-0. [...]
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:120.00000477%;font-family:'Linux Libertine O';-inkscape-font-specification:'Linux Libertine O Bold';text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;shape-padding:0;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.94606912;stroke-linecap:round;stroke-linejoin:round;paint-order:fill markers stroke" />
+      <path
+         sodipodi:nodetypes="sssss"
+         inkscape:connector-curvature="0"
+         id="path991"
+         d="m 207.83362,497.99844 c 0,0.85334 0.62063,1.7067 1.655,1.7067 1.16367,0 1.83601,-0.93093 1.83601,-1.60327 0,-0.77578 -0.59476,-1.70671 -1.68086,-1.70671 -1.21537,0 -1.81015,0.82749 -1.81015,1.60328 z"
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:120.00000477%;font-family:'Linux Libertine O';-inkscape-font-specification:'Linux Libertine O Bold';text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;shape-padding:0;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.94606912;stroke-linecap:round;stroke-linejoin:round;paint-order:fill markers stroke" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_load_warning-20.svg b/pixmaps/src/gwy_load_warning-20.svg
new file mode 100644
index 0000000..43a49a9
--- /dev/null
+++ b/pixmaps/src/gwy_load_warning-20.svg
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="20"
+   height="20"
+   viewBox="0 0 20 20"
+   id="svg8833"
+   version="1.1"
+   inkscape:version="0.92+devel unknown"
+   sodipodi:docname="gwy_load_warning-20.svg">
+  <defs
+     id="defs8835">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient980">
+      <stop
+         id="stop978"
+         offset="0"
+         style="stop-color:#ffe538;stop-opacity:1" />
+      <stop
+         style="stop-color:#ffbb00;stop-opacity:1"
+         offset="0.5"
+         id="stop976" />
+      <stop
+         id="stop974"
+         offset="1"
+         style="stop-color:#d45a00;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(-11.142957,824.89612)"
+       xlink:href="#linearGradient4140"
+       id="linearGradient4171"
+       gradientUnits="userSpaceOnUse"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       id="linearGradient4140">
+      <stop
+         style="stop-color:#d7e3f4;stop-opacity:1;"
+         offset="0"
+         id="stop4142" />
+      <stop
+         style="stop-color:#f1f5fb;stop-opacity:1"
+         offset="1"
+         id="stop4144" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient980"
+       id="radialGradient972"
+       cx="206.41296"
+       cy="502.06705"
+       fx="206.41296"
+       fy="502.06705"
+       r="10"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.5000009,1.7594542e-6,-1.8767497e-6,1.6,-102.97495,-301.24055)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="31.713739"
+     inkscape:cx="14.934895"
+     inkscape:cy="8.3976954"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1149"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     inkscape:document-rotation="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid1px"
+       originx="0"
+       originy="0"
+       dotted="false"
+       snapvisiblegridlinesonly="false"
+       spacingx="0.5"
+       spacingy="0.5"
+       enabled="true"
+       visible="true"
+       units="px"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata8838">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-199.64375,-494.06708)">
+    <circle
+       style="color:#000000;overflow:visible;vector-effect:none;fill:url(#radialGradient972);fill-rule:evenodd;stroke:none;stroke-width:1.00000012;fill-opacity:1"
+       id="path101"
+       cx="209.64375"
+       cy="504.06708"
+       r="10" />
+    <g
+       id="g1938"
+       transform="translate(0.02011123,0.01629217)">
+      <g
+         transform="matrix(1.0905228,0,0,1.0905228,-18.945226,-45.163896)"
+         id="text4304"
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:23.31949234px;line-height:120.00000477%;font-family:'Linux Libertine O';-inkscape-font-specification:'Linux Libertine O Bold';text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;shape-padding:0;overflow:visible;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.85315216;stroke-linecap:round;stroke-linejoin:round;paint-order:fil [...]
+         aria-label="!">
+        <path
+           inkscape:connector-curvature="0"
+           id="path1933"
+           d="m 209.59568,496.13597 c -0.72291,0 -1.679,0.44307 -1.679,1.74896 0,0.90946 0.16323,1.58573 0.32647,2.40191 0.27983,1.65568 0.60631,4.45402 0.65294,5.55004 0.0233,0.79286 0.07,1.25925 0.69959,1.25925 0.53635,0 0.62963,-0.53635 0.65294,-0.97942 0.0233,-1.14265 0.30316,-3.4746 0.69959,-5.75991 0.13992,-0.76955 0.32647,-1.65569 0.32647,-2.47187 0,-1.18929 -0.81618,-1.74896 -1.679,-1.74896 z"
+           style="stroke-width:0.85315216" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path1928"
+           d="m 207.89336,509.52855 c 0,0.88614 0.74622,1.58573 1.679,1.58573 0.93278,0 1.72564,-0.74622 1.72564,-1.63237 0,-0.90946 -0.74622,-1.60904 -1.679,-1.60904 -0.93278,0 -1.72564,0.74622 -1.72564,1.65568 z"
+           style="stroke-width:0.85315216" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/devel-docs/libgwydgets/html/gwy_local_slope-24.png b/pixmaps/src/gwy_local_slope-24.png
similarity index 100%
copy from devel-docs/libgwydgets/html/gwy_local_slope-24.png
copy to pixmaps/src/gwy_local_slope-24.png
diff --git a/pixmaps/src/gwy_local_slope-24.svg b/pixmaps/src/gwy_local_slope-24.svg
new file mode 100644
index 0000000..722279e
--- /dev/null
+++ b/pixmaps/src/gwy_local_slope-24.svg
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 22.499999 22.499999"
+   id="svg8233"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_local_slope-24.svg">
+  <defs
+     id="defs8235">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8495">
+      <stop
+         id="stop8493"
+         offset="0"
+         style="stop-color:#030401;stop-opacity:0.97315437" />
+      <stop
+         style="stop-color:#76b638;stop-opacity:0.99328858"
+         offset="0.6243822"
+         id="stop8491" />
+      <stop
+         id="stop8489"
+         offset="1"
+         style="stop-color:#f1f9ea;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8495"
+       id="linearGradient8432"
+       x1="400.07837"
+       y1="680.96521"
+       x2="400.07837"
+       y2="670.64807"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.65217388,1,0,-269.63684,406.97601)" />
+    <linearGradient
+       osb:paint="solid"
+       id="linearGradient8428">
+      <stop
+         id="stop8430"
+         offset="0"
+         style="stop-color:#4696db;stop-opacity:1;" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.955247"
+     inkscape:cx="16.574185"
+     inkscape:cy="26.264908"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     units="px">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8238">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-393.51587,-663.14807)">
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#36531a;fill-opacity:0.98039216;fill-rule:evenodd;stroke:none;stroke-width:0.93750006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 408.51123,663.92248 v 6.72555 h 7.03125 v -6.72555 z"
+       id="rect8276"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:url(#linearGradient8432);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499988;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 401.01123,663.92248 v 6.72555 h 7.5 v -6.72555 z"
+       id="rect8424"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8436"
+       d="m 393.98462,664.08557 v 6.72555 h 7.03125 v -6.72555 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#f0f8e8;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.93750006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93749994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 393.97998,663.61678 v 6.72554 h 21.5625 v -6.72554 z"
+       id="rect8438"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8449"
+       d="m 408.04248,678.61678 v 6.5625 h 7.03125 v -6.5625 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#36531a;fill-opacity:0.98039216;fill-rule:evenodd;stroke:none;stroke-width:0.9375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#36531a;fill-opacity:0.98039216;fill-rule:evenodd;stroke:none;stroke-width:0.9375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 393.97998,678.61678 v 6.5625 h 7.03125 v -6.5625 z"
+       id="path8447"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8442"
+       d="m 401.01123,678.61678 v 6.5625 h 7.5 v -6.5625 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#f0f8e8;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499988;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="393.97998"
+       x="678.61676"
+       height="21.5625"
+       width="6.5625"
+       id="rect8440"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93749994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="matrix(0,1,1,0,0,0)" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.93749994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 393.51587,672.05432 h 7.5 l 7.5,4.6875 h 7.5"
+       id="path8452"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_logscale_horizontal-24.svg b/pixmaps/src/gwy_logscale_horizontal-24.svg
new file mode 100644
index 0000000..f0fb706
--- /dev/null
+++ b/pixmaps/src/gwy_logscale_horizontal-24.svg
@@ -0,0 +1,868 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_logscale_horizontal-24.svg"
+   inkscape:export-filename="gwy_logscale_horizontal-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689">
+    <linearGradient
+       gradientTransform="translate(119.22988,1103.9078)"
+       xlink:href="#linearGradient4140"
+       id="linearGradient4171"
+       gradientUnits="userSpaceOnUse"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       id="linearGradient4140">
+      <stop
+         style="stop-color:#d7e3f4;stop-opacity:1;"
+         offset="0"
+         id="stop4142" />
+      <stop
+         style="stop-color:#f1f5fb;stop-opacity:1"
+         offset="1"
+         id="stop4144" />
+    </linearGradient>
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(76.458263,1103.0614)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient8503"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(92.024673,1111.5521)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11272"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient9134"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(51.782953,1109.0832)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       gradientTransform="translate(129.22988,1088.9078)"
+       xlink:href="#linearGradient4140"
+       id="linearGradient4171-3"
+       gradientUnits="userSpaceOnUse"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(86.458263,1088.0614)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient8503-5"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(102.02467,1096.5521)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11272-3"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient9134-5"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(61.782953,1094.0832)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="17.577861"
+     inkscape:cx="2.8845727"
+     inkscape:cy="17.437022"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385"
+       y="993.97675"
+       x="120.59962">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487"
+       y="1089.8529"
+       x="144.7296">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536"
+       y="1029.2654"
+       x="79.29689">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6"
+       style="opacity:1;fill:url(#linearGradient4171);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318"
+       transform="translate(40.116283,828.59186)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386"
+       transform="translate(587.33752,300.39388)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162"
+       transform="translate(-107.30465,143.63199)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="440.86383"
+       y="1217.916"
+       id="text8015"><tspan
+         id="tspan8017"
+         x="440.86383"
+         y="1217.916" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1132.2377"
+       y="-109.14887"
+       id="text9295"><tspan
+         id="tspan9297"
+         x="-1132.2377"
+         y="-109.14887" /></text>
+    <text
+       id="text7408-2"
+       class="fil7 fnt4"
+       y="172.73296"
+       x="-1015.0248"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422"
+       class="fil7 fnt4"
+       y="200.19957"
+       x="-998.65192"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-9"
+       y="993.13031"
+       x="77.828003">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-0"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-9"
+       y="1089.0065"
+       x="101.95798">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-1"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7"
+       y="1028.4189"
+       x="36.525269">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-7"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-1"
+       style="opacity:1;fill:url(#linearGradient8503);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-7"
+       transform="translate(-2.65532,827.74545)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-6"
+       transform="translate(544.56593,299.54747)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7"
+       transform="translate(-150.07625,142.78558)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="398.09222"
+       y="1217.0696"
+       id="text8015-3"><tspan
+         id="tspan8017-6"
+         x="398.09222"
+         y="1217.0696" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1175.0093"
+       y="-109.99525"
+       id="text9295-5"><tspan
+         id="tspan9297-6"
+         x="-1175.0093"
+         y="-109.99525" /></text>
+    <text
+       id="text7408-2-3"
+       class="fil7 fnt4"
+       y="171.88655"
+       x="-1057.7965"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-9"
+       class="fil7 fnt4"
+       y="199.35316"
+       x="-1041.4236"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-7"
+       y="1001.621"
+       x="93.394409">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-2"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-3"
+       y="1097.4972"
+       x="117.52438">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-7"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-2"
+       y="1036.9097"
+       x="52.091675">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-5"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-3"
+       style="opacity:1;fill:url(#linearGradient11272);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-3"
+       transform="translate(12.91108,836.23617)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-64"
+       transform="translate(560.13232,308.03819)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-03"
+       transform="translate(-134.50985,151.2763)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="413.65863"
+       y="1225.5603"
+       id="text8015-5"><tspan
+         id="tspan8017-85"
+         x="413.65863"
+         y="1225.5603" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1159.4429"
+       y="-101.50452"
+       id="text9295-0"><tspan
+         id="tspan9297-9"
+         x="-1159.4429"
+         y="-101.50452" /></text>
+    <text
+       id="text7408-2-9"
+       class="fil7 fnt4"
+       y="180.37727"
+       x="-1042.2301"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-8"
+       class="fil7 fnt4"
+       y="207.84389"
+       x="-1025.8572"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-2"
+       y="999.1521"
+       x="53.152679">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-6"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-5"
+       y="1095.0282"
+       x="77.282654">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-8"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7-2"
+       y="1034.4407"
+       x="11.849936">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-9"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-6"
+       style="opacity:1;fill:url(#linearGradient9134);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-4"
+       transform="translate(-27.33062,833.76722)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-8"
+       transform="translate(519.89062,305.56924)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7-4"
+       transform="translate(-174.75156,148.80734)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="373.41693"
+       y="1223.0913"
+       id="text8015-0"><tspan
+         id="tspan8017-8"
+         x="373.41693"
+         y="1223.0913" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1199.6846"
+       y="-103.97346"
+       id="text9295-6-9"><tspan
+         id="tspan9297-2"
+         x="-1199.6846"
+         y="-103.97346" /></text>
+    <text
+       id="text7408-2-4"
+       class="fil7 fnt4"
+       y="177.90834"
+       x="-1082.4718"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-7"
+       class="fil7 fnt4"
+       y="205.37495"
+       x="-1066.0989"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-91"
+       y="978.97675"
+       x="130.59962">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-27"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-0"
+       y="1074.8529"
+       x="154.7296">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-9"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-3"
+       y="1014.2654"
+       x="89.29689">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-6"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-0"
+       style="opacity:1;fill:url(#linearGradient4171-3);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-6"
+       transform="translate(50.116283,813.59186)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-2"
+       transform="translate(597.33752,285.39388)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-6"
+       transform="translate(-97.30465,128.63199)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="450.86383"
+       y="1202.916"
+       id="text8015-1"><tspan
+         id="tspan8017-87"
+         x="450.86383"
+         y="1202.916" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1122.2377"
+       y="-124.14887"
+       id="text9295-9"><tspan
+         id="tspan9297-20"
+         x="-1122.2377"
+         y="-124.14887" /></text>
+    <text
+       id="text7408-2-2"
+       class="fil7 fnt4"
+       y="157.73296"
+       x="-1005.0248"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-3"
+       class="fil7 fnt4"
+       y="185.19957"
+       x="-988.65192"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-9-7"
+       y="978.13031"
+       x="87.828003">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-0-5"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-9-9"
+       y="1074.0065"
+       x="111.95798">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-1-2"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7-28"
+       y="1013.4189"
+       x="46.525269">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-7-9"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-1-7"
+       style="opacity:1;fill:url(#linearGradient8503-5);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-7-3"
+       transform="translate(7.34468,812.74545)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-6-6"
+       transform="translate(554.56593,284.54747)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7-1"
+       transform="translate(-140.07625,127.78558)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="408.09222"
+       y="1202.0696"
+       id="text8015-3-2"><tspan
+         id="tspan8017-6-9"
+         x="408.09222"
+         y="1202.0696" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1165.0093"
+       y="-124.99525"
+       id="text9295-5-3"><tspan
+         id="tspan9297-6-1"
+         x="-1165.0093"
+         y="-124.99525" /></text>
+    <text
+       id="text7408-2-3-9"
+       class="fil7 fnt4"
+       y="156.88655"
+       x="-1047.7965"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-9-4"
+       class="fil7 fnt4"
+       y="184.35316"
+       x="-1031.4236"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-7-7"
+       y="986.62103"
+       x="103.39441">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-2-8"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-3-4"
+       y="1082.4972"
+       x="127.52438">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-7-5"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-2-0"
+       y="1021.9097"
+       x="62.091675">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-5-3"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-3-6"
+       style="opacity:1;fill:url(#linearGradient11272-3);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-3-1"
+       transform="translate(22.91108,821.23617)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-64-0"
+       transform="translate(570.13232,293.03819)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-03-6"
+       transform="translate(-124.50985,136.2763)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="423.65863"
+       y="1210.5603"
+       id="text8015-5-3"><tspan
+         id="tspan8017-85-2"
+         x="423.65863"
+         y="1210.5603" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1149.4429"
+       y="-116.50452"
+       id="text9295-0-0"><tspan
+         id="tspan9297-9-6"
+         x="-1149.4429"
+         y="-116.50452" /></text>
+    <text
+       id="text7408-2-9-1"
+       class="fil7 fnt4"
+       y="165.37727"
+       x="-1032.2301"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-8-5"
+       class="fil7 fnt4"
+       y="192.84389"
+       x="-1015.8571"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-2-5"
+       y="984.1521"
+       x="63.152679">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-6-4"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-5-7"
+       y="1080.0282"
+       x="87.282654">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-8-6"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7-2-5"
+       y="1019.4407"
+       x="21.849937">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-9-6"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-6-9"
+       style="opacity:1;fill:url(#linearGradient9134-5);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-4-3"
+       transform="translate(-17.33062,818.76722)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-8-7"
+       transform="translate(529.89062,290.56924)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7-4-4"
+       transform="translate(-164.75156,133.80734)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="383.41693"
+       y="1208.0913"
+       id="text8015-0-5"><tspan
+         id="tspan8017-8-2"
+         x="383.41693"
+         y="1208.0913" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1189.6846"
+       y="-118.97346"
+       id="text9295-6-9-5"><tspan
+         id="tspan9297-2-4"
+         x="-1189.6846"
+         y="-118.97346" /></text>
+    <text
+       id="text7408-2-4-7"
+       class="fil7 fnt4"
+       y="162.90834"
+       x="-1072.4718"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-7-4"
+       class="fil7 fnt4"
+       y="190.37495"
+       x="-1056.0989"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <g
+       id="g8896"
+       transform="rotate(90,323.99319,640.89994)">
+      <path
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         d="m 349.16871,633.09479 h 6 v 26 h -6 z"
+         id="path8856"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 349.66855,657.09492 h 3"
+         id="path8858"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8860"
+         d="m 349.66855,650.09492 h 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8862"
+         d="m 349.66855,645.09492 h 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8864"
+         d="m 349.66855,639.09492 h 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 349.66855,642.09492 h 3"
+         id="path8866"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 349.66855,635.09492 h 3"
+         id="path8868"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 349.66855,637.09492 h 3"
+         id="path8886"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       aria-label="log"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.80000019px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:start;letter-spacing:0.38999999px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="text8572">
+      <path
+         d="m 313.1014,659.94999 q -0.5292,-0.01 -0.882,-0.1176 -0.343,-0.1078 -0.5488,-0.3038 -0.2058,-0.2058 -0.294,-0.4998 -0.0784,-0.3038 -0.0784,-0.686 v -5.8996 l 1.1858,-0.196 v 5.8702 q 0,0.2156 0.0294,0.3626 0.0392,0.147 0.1274,0.2548 0.0882,0.098 0.2352,0.1568 0.1568,0.049 0.392,0.0784 z"
+         style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:9.80000019px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:start;letter-spacing:0.38999999px;text-anchor:start"
+         id="path8567" />
+      <path
+         d="m 319.25258,657.28439 q 0,0.6076 -0.1764,1.1074 -0.1764,0.4998 -0.4998,0.8526 -0.3234,0.3528 -0.784,0.5488 -0.4508,0.196 -0.9996,0.196 -0.5488,0 -0.9996,-0.196 -0.4508,-0.196 -0.7742,-0.5488 -0.3234,-0.3528 -0.5096,-0.8526 -0.1764,-0.4998 -0.1764,-1.1074 0,-0.6076 0.1764,-1.0976 0.1862,-0.4998 0.5096,-0.8526 0.3332,-0.3528 0.784,-0.539 0.4508,-0.196 0.9898,-0.196 0.539,0 0.9898,0.196 0.4606,0.1862 0.784,0.539 0.3234,0.3528 0.4998,0.8526 0.1862,0.49 0.1862,1.0976 z m -1.2152,0 [...]
+         style="letter-spacing:-0.22px"
+         id="path8569" />
+      <path
+         d="m 321.18521,657.15699 q 0,0.7546 0.3234,1.1074 0.3332,0.343 0.8526,0.343 0.2842,0 0.5292,-0.0784 0.2548,-0.0784 0.4116,-0.1862 v -2.6558 q -0.1274,-0.0294 -0.3136,-0.049 -0.1862,-0.0294 -0.4704,-0.0294 -0.6468,0 -0.9898,0.4312 -0.343,0.4214 -0.343,1.1172 z m 3.3026,2.1756 q 0,1.225 -0.6272,1.7934 -0.6174,0.5684 -1.9012,0.5684 -0.4704,0 -0.9212,-0.0784 -0.441,-0.0784 -0.8036,-0.2058 l 0.2156,-1.0094 q 0.3038,0.1274 0.686,0.2058 0.392,0.0784 0.8428,0.0784 0.7154,0 1.0192,-0.294 [...]
+         style="letter-spacing:-0.22px"
+         id="path8571" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_logscale_vertical-24.svg b/pixmaps/src/gwy_logscale_vertical-24.svg
new file mode 100644
index 0000000..6eb7658
--- /dev/null
+++ b/pixmaps/src/gwy_logscale_vertical-24.svg
@@ -0,0 +1,872 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9687"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_logscale_vertical-24.svg"
+   inkscape:export-filename="gwy_graph_function-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9689">
+    <linearGradient
+       gradientTransform="translate(119.22988,1103.9078)"
+       xlink:href="#linearGradient4140"
+       id="linearGradient4171"
+       gradientUnits="userSpaceOnUse"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       id="linearGradient4140">
+      <stop
+         style="stop-color:#d7e3f4;stop-opacity:1;"
+         offset="0"
+         id="stop4142" />
+      <stop
+         style="stop-color:#f1f5fb;stop-opacity:1"
+         offset="1"
+         id="stop4144" />
+    </linearGradient>
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(76.458263,1103.0614)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient8503"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(92.024673,1111.5521)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11272"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient9134"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(51.782953,1109.0832)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       gradientTransform="translate(129.22988,1088.9078)"
+       xlink:href="#linearGradient4140"
+       id="linearGradient4171-3"
+       gradientUnits="userSpaceOnUse"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(86.458263,1088.0614)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient8503-5"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(102.02467,1096.5521)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11272-3"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient9134-5"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(61.782953,1094.0832)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.7858142"
+     inkscape:cx="-51.108476"
+     inkscape:cy="31.993101"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9692">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-306.29821,-648.57531)">
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385"
+       y="993.97675"
+       x="120.59962">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487"
+       y="1089.8529"
+       x="144.7296">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536"
+       y="1029.2654"
+       x="79.29689">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6"
+       style="opacity:1;fill:url(#linearGradient4171);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318"
+       transform="translate(40.116283,828.59186)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386"
+       transform="translate(587.33752,300.39388)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162"
+       transform="translate(-107.30465,143.63199)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="440.86383"
+       y="1217.916"
+       id="text8015"><tspan
+         id="tspan8017"
+         x="440.86383"
+         y="1217.916" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1132.2377"
+       y="-109.14887"
+       id="text9295"><tspan
+         id="tspan9297"
+         x="-1132.2377"
+         y="-109.14887" /></text>
+    <text
+       id="text7408-2"
+       class="fil7 fnt4"
+       y="172.73296"
+       x="-1015.0248"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422"
+       class="fil7 fnt4"
+       y="200.19957"
+       x="-998.65192"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-9"
+       y="993.13031"
+       x="77.828003">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-0"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-9"
+       y="1089.0065"
+       x="101.95798">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-1"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7"
+       y="1028.4189"
+       x="36.525269">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-7"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-1"
+       style="opacity:1;fill:url(#linearGradient8503);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-7"
+       transform="translate(-2.65532,827.74545)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-6"
+       transform="translate(544.56593,299.54747)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7"
+       transform="translate(-150.07625,142.78558)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="398.09222"
+       y="1217.0696"
+       id="text8015-3"><tspan
+         id="tspan8017-6"
+         x="398.09222"
+         y="1217.0696" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1175.0093"
+       y="-109.99525"
+       id="text9295-5"><tspan
+         id="tspan9297-6"
+         x="-1175.0093"
+         y="-109.99525" /></text>
+    <text
+       id="text7408-2-3"
+       class="fil7 fnt4"
+       y="171.88655"
+       x="-1057.7965"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-9"
+       class="fil7 fnt4"
+       y="199.35316"
+       x="-1041.4236"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-7"
+       y="1001.621"
+       x="93.394409">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-2"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-3"
+       y="1097.4972"
+       x="117.52438">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-7"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-2"
+       y="1036.9097"
+       x="52.091675">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-5"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-3"
+       style="opacity:1;fill:url(#linearGradient11272);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-3"
+       transform="translate(12.91108,836.23617)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-64"
+       transform="translate(560.13232,308.03819)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-03"
+       transform="translate(-134.50985,151.2763)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="413.65863"
+       y="1225.5603"
+       id="text8015-5"><tspan
+         id="tspan8017-85"
+         x="413.65863"
+         y="1225.5603" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1159.4429"
+       y="-101.50452"
+       id="text9295-0"><tspan
+         id="tspan9297-9"
+         x="-1159.4429"
+         y="-101.50452" /></text>
+    <text
+       id="text7408-2-9"
+       class="fil7 fnt4"
+       y="180.37727"
+       x="-1042.2301"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-8"
+       class="fil7 fnt4"
+       y="207.84389"
+       x="-1025.8572"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-2"
+       y="999.1521"
+       x="53.152679">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-6"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-5"
+       y="1095.0282"
+       x="77.282654">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-8"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7-2"
+       y="1034.4407"
+       x="11.849936">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-9"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-6"
+       style="opacity:1;fill:url(#linearGradient9134);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-4"
+       transform="translate(-27.33062,833.76722)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-8"
+       transform="translate(519.89062,305.56924)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7-4"
+       transform="translate(-174.75156,148.80734)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="373.41693"
+       y="1223.0913"
+       id="text8015-0"><tspan
+         id="tspan8017-8"
+         x="373.41693"
+         y="1223.0913" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1199.6846"
+       y="-103.97346"
+       id="text9295-6-9"><tspan
+         id="tspan9297-2"
+         x="-1199.6846"
+         y="-103.97346" /></text>
+    <text
+       id="text7408-2-4"
+       class="fil7 fnt4"
+       y="177.90834"
+       x="-1082.4718"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-7"
+       class="fil7 fnt4"
+       y="205.37495"
+       x="-1066.0989"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-91"
+       y="978.97675"
+       x="130.59962">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-27"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-0"
+       y="1074.8529"
+       x="154.7296">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-9"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-3"
+       y="1014.2654"
+       x="89.29689">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-6"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-0"
+       style="opacity:1;fill:url(#linearGradient4171-3);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-6"
+       transform="translate(50.116283,813.59186)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-2"
+       transform="translate(597.33752,285.39388)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-6"
+       transform="translate(-97.30465,128.63199)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="450.86383"
+       y="1202.916"
+       id="text8015-1"><tspan
+         id="tspan8017-87"
+         x="450.86383"
+         y="1202.916" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1122.2377"
+       y="-124.14887"
+       id="text9295-9"><tspan
+         id="tspan9297-20"
+         x="-1122.2377"
+         y="-124.14887" /></text>
+    <text
+       id="text7408-2-2"
+       class="fil7 fnt4"
+       y="157.73296"
+       x="-1005.0248"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-3"
+       class="fil7 fnt4"
+       y="185.19957"
+       x="-988.65192"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-9-7"
+       y="978.13031"
+       x="87.828003">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-0-5"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-9-9"
+       y="1074.0065"
+       x="111.95798">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-1-2"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7-28"
+       y="1013.4189"
+       x="46.525269">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-7-9"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-1-7"
+       style="opacity:1;fill:url(#linearGradient8503-5);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-7-3"
+       transform="translate(7.34468,812.74545)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-6-6"
+       transform="translate(554.56593,284.54747)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7-1"
+       transform="translate(-140.07625,127.78558)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="408.09222"
+       y="1202.0696"
+       id="text8015-3-2"><tspan
+         id="tspan8017-6-9"
+         x="408.09222"
+         y="1202.0696" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1165.0093"
+       y="-124.99525"
+       id="text9295-5-3"><tspan
+         id="tspan9297-6-1"
+         x="-1165.0093"
+         y="-124.99525" /></text>
+    <text
+       id="text7408-2-3-9"
+       class="fil7 fnt4"
+       y="156.88655"
+       x="-1047.7965"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-9-4"
+       class="fil7 fnt4"
+       y="184.35316"
+       x="-1031.4236"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-7-7"
+       y="986.62103"
+       x="103.39441">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-2-8"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-3-4"
+       y="1082.4972"
+       x="127.52438">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-7-5"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-2-0"
+       y="1021.9097"
+       x="62.091675">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-5-3"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-3-6"
+       style="opacity:1;fill:url(#linearGradient11272-3);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-3-1"
+       transform="translate(22.91108,821.23617)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-64-0"
+       transform="translate(570.13232,293.03819)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-03-6"
+       transform="translate(-124.50985,136.2763)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="423.65863"
+       y="1210.5603"
+       id="text8015-5-3"><tspan
+         id="tspan8017-85-2"
+         x="423.65863"
+         y="1210.5603" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1149.4429"
+       y="-116.50452"
+       id="text9295-0-0"><tspan
+         id="tspan9297-9-6"
+         x="-1149.4429"
+         y="-116.50452" /></text>
+    <text
+       id="text7408-2-9-1"
+       class="fil7 fnt4"
+       y="165.37727"
+       x="-1032.2301"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-8-5"
+       class="fil7 fnt4"
+       y="192.84389"
+       x="-1015.8571"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-2-5"
+       y="984.1521"
+       x="63.152679">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-6-4"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-5-7"
+       y="1080.0282"
+       x="87.282654">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-8-6"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7-2-5"
+       y="1019.4407"
+       x="21.849937">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-9-6"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-6-9"
+       style="opacity:1;fill:url(#linearGradient9134-5);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-4-3"
+       transform="translate(-17.33062,818.76722)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-8-7"
+       transform="translate(529.89062,290.56924)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7-4-4"
+       transform="translate(-164.75156,133.80734)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="383.41693"
+       y="1208.0913"
+       id="text8015-0-5"><tspan
+         id="tspan8017-8-2"
+         x="383.41693"
+         y="1208.0913" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1189.6846"
+       y="-118.97346"
+       id="text9295-6-9-5"><tspan
+         id="tspan9297-2-4"
+         x="-1189.6846"
+         y="-118.97346" /></text>
+    <text
+       id="text7408-2-4-7"
+       class="fil7 fnt4"
+       y="162.90834"
+       x="-1072.4718"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-7-4"
+       class="fil7 fnt4"
+       y="190.37495"
+       x="-1056.0989"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <g
+       id="g8896"
+       transform="matrix(-1,0,0,1,661.96692,13.98052)">
+      <path
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         d="m 349.16871,633.09479 h 6 v 26 h -6 z"
+         id="path8856"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 349.66855,657.09492 h 3"
+         id="path8858"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8860"
+         d="m 349.66855,650.09492 h 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8862"
+         d="m 349.66855,645.09492 h 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8864"
+         d="m 349.66855,639.09492 h 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 349.66855,642.09492 h 3"
+         id="path8866"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 349.66855,635.09492 h 3"
+         id="path8868"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 349.66855,637.09492 h 3"
+         id="path8886"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       aria-label="log"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.80000019px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:start;letter-spacing:0.38999999px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="text8572"
+       transform="translate(4,3)">
+      <path
+         inkscape:connector-curvature="0"
+         d="m 313.1014,659.94999 q -0.5292,-0.01 -0.882,-0.1176 -0.343,-0.1078 -0.5488,-0.3038 -0.2058,-0.2058 -0.294,-0.4998 -0.0784,-0.3038 -0.0784,-0.686 v -5.8996 l 1.1858,-0.196 v 5.8702 q 0,0.2156 0.0294,0.3626 0.0392,0.147 0.1274,0.2548 0.0882,0.098 0.2352,0.1568 0.1568,0.049 0.392,0.0784 z"
+         style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:9.80000019px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:start;letter-spacing:0.38999999px;text-anchor:start"
+         id="path8567" />
+      <path
+         inkscape:connector-curvature="0"
+         d="m 319.25258,657.28439 q 0,0.6076 -0.1764,1.1074 -0.1764,0.4998 -0.4998,0.8526 -0.3234,0.3528 -0.784,0.5488 -0.4508,0.196 -0.9996,0.196 -0.5488,0 -0.9996,-0.196 -0.4508,-0.196 -0.7742,-0.5488 -0.3234,-0.3528 -0.5096,-0.8526 -0.1764,-0.4998 -0.1764,-1.1074 0,-0.6076 0.1764,-1.0976 0.1862,-0.4998 0.5096,-0.8526 0.3332,-0.3528 0.784,-0.539 0.4508,-0.196 0.9898,-0.196 0.539,0 0.9898,0.196 0.4606,0.1862 0.784,0.539 0.3234,0.3528 0.4998,0.8526 0.1862,0.49 0.1862,1.0976 z m -1.2152,0 [...]
+         style="letter-spacing:-0.22px"
+         id="path8569" />
+      <path
+         inkscape:connector-curvature="0"
+         d="m 321.18521,657.15699 q 0,0.7546 0.3234,1.1074 0.3332,0.343 0.8526,0.343 0.2842,0 0.5292,-0.0784 0.2548,-0.0784 0.4116,-0.1862 v -2.6558 q -0.1274,-0.0294 -0.3136,-0.049 -0.1862,-0.0294 -0.4704,-0.0294 -0.6468,0 -0.9898,0.4312 -0.343,0.4214 -0.343,1.1172 z m 3.3026,2.1756 q 0,1.225 -0.6272,1.7934 -0.6174,0.5684 -1.9012,0.5684 -0.4704,0 -0.9212,-0.0784 -0.441,-0.0784 -0.8036,-0.2058 l 0.2156,-1.0094 q 0.3038,0.1274 0.686,0.2058 0.392,0.0784 0.8428,0.0784 0.7154,0 1.0192,-0.294 [...]
+         style="letter-spacing:-0.22px"
+         id="path8571" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mark_outliers-24.svg b/pixmaps/src/gwy_mark_outliers-24.svg
new file mode 100644
index 0000000..b7abdcb
--- /dev/null
+++ b/pixmaps/src/gwy_mark_outliers-24.svg
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="6.3499999mm"
+   height="6.3499999mm"
+   viewBox="0 0 22.499999 22.499999"
+   id="svg8233"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_mark_outliers-24.svg">
+  <defs
+     id="defs8235" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16.856898"
+     inkscape:cx="14.759667"
+     inkscape:cy="15.975021"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8238">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-393.51587,-663.14807)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8276"
+       width="21.5625"
+       height="21.5625"
+       x="393.98462"
+       y="663.61682" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499988;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9051"
+       width="3.7499998"
+       height="3.7499998"
+       x="395.39087"
+       y="665.02307" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499988;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9022"
+       width="1.8749999"
+       height="1.8749999"
+       x="396.32837"
+       y="665.96057" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9051-5"
+       width="3.7499995"
+       height="3.7499995"
+       x="401.95337"
+       y="672.52307" />
+    <rect
+       y="673.46057"
+       x="402.89087"
+       height="1.8749999"
+       width="1.8749999"
+       id="rect9024"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499988;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9051-9"
+       width="3.7499995"
+       height="3.7499995"
+       x="396.32837"
+       y="676.27307" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499988;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9026"
+       width="1.8749999"
+       height="1.8749999"
+       x="397.26587"
+       y="677.21057" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9051-2"
+       width="3.7499995"
+       height="3.7499995"
+       x="410.39087"
+       y="680.96057" />
+    <rect
+       y="681.89807"
+       x="411.32837"
+       height="1.8749999"
+       width="1.8749999"
+       id="rect9028"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499988;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9051-6"
+       width="3.7499995"
+       height="3.7499995"
+       x="406.64087"
+       y="675.33557" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9022-7"
+       width="1.8749998"
+       height="1.8749998"
+       x="407.57837"
+       y="676.27307" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9051-3"
+       width="3.7499995"
+       height="3.7499995"
+       x="405.70337"
+       y="664.08557" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87499976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect9022-5"
+       width="1.8749998"
+       height="1.8749998"
+       x="406.64087"
+       y="665.02307" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mark_scars-24.svg b/pixmaps/src/gwy_mark_scars-24.svg
new file mode 100644
index 0000000..e0b1668
--- /dev/null
+++ b/pixmaps/src/gwy_mark_scars-24.svg
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8323"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_mark_scars-24.svg">
+  <defs
+     id="defs8325" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="28.630464"
+     inkscape:cx="2.4828339"
+     inkscape:cy="16.1998"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8328">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-182.52887,-504.32709)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8276"
+       width="23.000002"
+       height="23.000002"
+       x="183.02887"
+       y="504.82709" />
+    <rect
+       y="505.32709"
+       x="196.52887"
+       height="4.0000062"
+       width="9"
+       id="rect4803"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 197.52888,507.32708 8,0"
+       id="path8537"
+       inkscape:connector-curvature="0" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect4801"
+       width="9"
+       height="3.0000026"
+       x="186.52887"
+       y="507.32709" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8539"
+       d="m 187.52888,508.82708 7,0"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <rect
+       y="523.32709"
+       x="183.52887"
+       height="3.0000026"
+       width="13"
+       id="rect4799"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.0209229;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 184.52888,524.82708 11,0"
+       id="path8545"
+       inkscape:connector-curvature="0" />
+    <rect
+       y="511.32709"
+       x="184.52887"
+       height="4"
+       width="17"
+       id="rect4795"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8351"
+       d="m 185.52888,513.32708 15,0"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect4797"
+       width="10"
+       height="4"
+       x="195.52887"
+       y="520.32709" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8353"
+       d="m 196.52888,522.32708 9,0"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect4793"
+       width="11"
+       height="4"
+       x="183.52887"
+       y="516.32709" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8355"
+       d="m 183.52888,518.32708 10,0"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mark_with-24.svg b/pixmaps/src/gwy_mark_with-24.svg
new file mode 100644
index 0000000..2b8ccc5
--- /dev/null
+++ b/pixmaps/src/gwy_mark_with-24.svg
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_mark_with-24.svg">
+  <defs
+     id="defs8426">
+    <linearGradient
+       id="linearGradient8428"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#4696db;stop-opacity:1;"
+         offset="0"
+         id="stop8430" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.2929687"
+     inkscape:cx="-34.543979"
+     inkscape:cy="15.192038"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#87c74a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.00000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8072"
+       width="13"
+       height="13"
+       x="128.83165"
+       y="604.84668" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:2.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 130.83165,606.84668 h 9 v 5 h -9 z"
+       id="rect11972"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <rect
+       y="609.84668"
+       x="133.83165"
+       height="13"
+       width="13"
+       id="rect8163"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#b7d69a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.00000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8534"
+       d="m 140.83165,620.84668 v -9 h -5 v 9 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000002, 3.00000002;stroke-dashoffset:6.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#e8f0e0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8153"
+       width="13"
+       height="13"
+       x="138.83165"
+       y="614.84668" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000002, 3.00000002;stroke-dashoffset:6.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="M 12.5 12.5 L 12.5 21.5 L 17.5 21.5 L 17.5 17.5 L 22 17.5 L 22 12.5 L 17.5 12.5 L 13 12.5 L 12.5 12.5 z "
+       transform="translate(128.33165,604.34668)"
+       id="path8753" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask-16.svg b/pixmaps/src/gwy_mask-16.svg
new file mode 100644
index 0000000..a36f0f9
--- /dev/null
+++ b/pixmaps/src/gwy_mask-16.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   viewBox="0 0 16 16"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask-16.svg"
+   inkscape:export-filename="gwy_mask-16.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="20.785954"
+     inkscape:cx="-6.8208157"
+     inkscape:cy="12.075331"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-602.34665)">
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000012, 3.00000012;stroke-dashoffset:1.50000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 128.83165,602.84665 h 15 v 15 h -15 z"
+       id="rect11972"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask-24.svg b/pixmaps/src/gwy_mask-24.svg
new file mode 100644
index 0000000..84c98d6
--- /dev/null
+++ b/pixmaps/src/gwy_mask-24.svg
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask-24.svg">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="17.694556"
+     inkscape:cx="-3.2359583"
+     inkscape:cy="11.632522"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 128.83165,604.84668 h 23 v 23 h -23 z"
+       id="rect11972"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_add-24.svg b/pixmaps/src/gwy_mask_add-24.svg
new file mode 100644
index 0000000..a9e18b3
--- /dev/null
+++ b/pixmaps/src/gwy_mask_add-24.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8424"
+     version="1.1"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_mask_add-24.svg">
+    <defs
+         id="defs8426" />
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="20.342831"
+         inkscape:cx="23.015893"
+         inkscape:cy="15.048603"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="false"
+         units="px"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         showguides="false"
+         inkscape:document-rotation="0">
+        <inkscape:grid
+             type="xygrid"
+             id="grid1px"
+             originx="0"
+             originy="0"
+             dotted="false"
+             snapvisiblegridlinesonly="false"
+             spacingx="1.0"
+             spacingy="1.0"
+             enabled="true"
+             visible="true" />
+    </sodipodi:namedview>
+    <metadata
+         id="metadata8429">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title />
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-128.33165,-604.34668)">
+        <path
+             style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:6.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+             d="m 128.83165,604.84668 h 17 v 15 h -17 z"
+             id="rect11972"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc" />
+        <path
+             sodipodi:nodetypes="ccccc"
+             inkscape:connector-curvature="0"
+             id="path4754"
+             d="m 134.83165,612.84668 h 17 v 15 h -17 z"
+             style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:6.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+        <path
+             sodipodi:nodetypes="ccccc"
+             inkscape:connector-curvature="0"
+             id="path4268"
+             d="m 128.83165,604.84668 h 17 v 15 h -17 z"
+             style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:6.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_circle-24.svg b/pixmaps/src/gwy_mask_circle-24.svg
new file mode 100644
index 0000000..a57f72e
--- /dev/null
+++ b/pixmaps/src/gwy_mask_circle-24.svg
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask_circle-24.svg">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="12.549331"
+     inkscape:cx="-7.7970688"
+     inkscape:cy="5.3587823"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000036,3.00000036;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path4750"
+       cx="140.33165"
+       cy="616.34668"
+       r="11.499999" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_circle_exclusive-24.svg b/pixmaps/src/gwy_mask_circle_exclusive-24.svg
new file mode 100644
index 0000000..b503c57
--- /dev/null
+++ b/pixmaps/src/gwy_mask_circle_exclusive-24.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask_circle_exclusive-24.svg">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.7297042"
+     inkscape:cx="-62.716162"
+     inkscape:cy="-0.032325687"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000047, 3.00000047;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8416"
+       width="24"
+       height="24"
+       x="128.33165"
+       y="604.34668" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000037, 3.00000037;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path4750"
+       cx="140.33165"
+       cy="616.34668"
+       r="9.5" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_circle_inclusive-24.svg b/pixmaps/src/gwy_mask_circle_inclusive-24.svg
new file mode 100644
index 0000000..4ad5e74
--- /dev/null
+++ b/pixmaps/src/gwy_mask_circle_inclusive-24.svg
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask_circle_inclusive-24.svg">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="17.317337"
+     inkscape:cx="9.2101068"
+     inkscape:cy="17.256855"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000037, 3.00000036999999997;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path4750"
+       cx="140.33165"
+       cy="616.34668"
+       r="9.5" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_distribute-24.svg b/pixmaps/src/gwy_mask_distribute-24.svg
new file mode 100644
index 0000000..463db64
--- /dev/null
+++ b/pixmaps/src/gwy_mask_distribute-24.svg
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask_distribute-24.svg">
+  <defs
+     id="defs8426">
+    <linearGradient
+       id="linearGradient8428"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#4696db;stop-opacity:1;"
+         offset="0"
+         id="stop8430" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.4150249"
+     inkscape:cx="6.0617045"
+     inkscape:cy="23.45166"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#87c74a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.00000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8072"
+       width="14"
+       height="14"
+       x="128.83165"
+       y="604.84668" />
+    <rect
+       y="613.84668"
+       x="137.83165"
+       height="14"
+       width="14"
+       id="rect8163"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#b7d69a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.00000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000002, 3.00000002;stroke-dashoffset:6.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 130.83165,606.84668 h 7 v 5 h -7 z"
+       id="rect11972"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8534"
+       d="m 139.83165,615.84668 h 7 v 5 h -7 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000002, 3.00000002;stroke-dashoffset:6.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_editor-24.svg b/pixmaps/src/gwy_mask_editor-24.svg
new file mode 100644
index 0000000..5faa6b4
--- /dev/null
+++ b/pixmaps/src/gwy_mask_editor-24.svg
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_mask_editor-24.svg"
+   inkscape:export-filename="gwy_mask_editor-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8426">
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath8424">
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="path8426"
+         d="m 128.33165,612.3467 h 16 v 16 h -16 z"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000028, 3.00000028;stroke-dashoffset:1.50000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    </clipPath>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="13.015596"
+     inkscape:cx="6.525502"
+     inkscape:cy="8.107597"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000018, 3.00000018;stroke-dashoffset:1.50000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 128.83165,612.84668 h 15 v 15 h -15 z"
+       id="rect11972"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 146.3159,604.9015 -7.5,12.99024 -0.26758,4.46484 -0.0684,1.11719 -0.0664,1.11523 0.93359,-0.61523 0.93359,-0.61719 3.73047,-2.46484 7.5,-12.99024 -2.59765,-1.5 z"
+       id="path8420"
+       inkscape:connector-curvature="0"
+       clip-path="url(#clipPath8424)" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffae1c;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 146.3159,604.9015 2.59808,1.5 2.59807,1.50001 -7.5,12.99038 -2.59808,-1.5 -2.59807,-1.5 z"
+       id="rect8442"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:#ffccaa;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 138.8159,617.89189 -0.26795,4.46409 1.73205,1.00001 3.73205,-2.4641 z"
+       id="path8444"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 140.28,623.35599 -1.73205,-1.00001 -0.067,1.11604 -0.067,1.11601 0.93301,-0.61601 z"
+       id="path8446"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="fill:#ffc357;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 148.91398,606.4015 -7.50001,12.99039 -2.59807,-1.5 7.5,-12.99039 z"
+       id="path8421"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_exclude-24.svg b/pixmaps/src/gwy_mask_exclude-24.svg
new file mode 100644
index 0000000..b0932d1
--- /dev/null
+++ b/pixmaps/src/gwy_mask_exclude-24.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask_exclude-24.svg">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.1750028"
+     inkscape:cx="-24.272715"
+     inkscape:cy="28.713321"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000036, 3.00000036;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect4750"
+       width="24"
+       height="24"
+       x="128.33165"
+       y="604.34668" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000018, 3.00000018;stroke-dashoffset:1.50000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 132.33165,609.34668 h 16 v 14 h -16 z"
+       id="rect11972"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_exclude_circle-24.svg b/pixmaps/src/gwy_mask_exclude_circle-24.svg
new file mode 100644
index 0000000..b503c57
--- /dev/null
+++ b/pixmaps/src/gwy_mask_exclude_circle-24.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask_circle_exclusive-24.svg">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.7297042"
+     inkscape:cx="-62.716162"
+     inkscape:cy="-0.032325687"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000047, 3.00000047;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8416"
+       width="24"
+       height="24"
+       x="128.33165"
+       y="604.34668" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000037, 3.00000037;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path4750"
+       cx="140.33165"
+       cy="616.34668"
+       r="9.5" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_extract-24.svg b/pixmaps/src/gwy_mask_extract-24.svg
new file mode 100644
index 0000000..14b57be
--- /dev/null
+++ b/pixmaps/src/gwy_mask_extract-24.svg
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask_extract-24.svg">
+  <defs
+     id="defs8426">
+    <linearGradient
+       osb:paint="solid"
+       id="linearGradient8428">
+      <stop
+         id="stop8430"
+         offset="0"
+         style="stop-color:#4696db;stop-opacity:1;" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.7297041"
+     inkscape:cx="96.283333"
+     inkscape:cy="46.298391"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#87c74a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.00000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8072"
+       width="14"
+       height="14"
+       x="128.83165"
+       y="604.84668" />
+    <rect
+       y="613.84668"
+       x="137.83165"
+       height="14"
+       width="14"
+       id="rect8163"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.00000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000002, 3.00000002;stroke-dashoffset:6.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 130.83165,606.84668 h 7 v 5 h -7 z"
+       id="rect11972-6"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8534"
+       d="m 139.83165,615.84668 h 7 v 5 h -7 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.50000048;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_fill_draw-24.svg b/pixmaps/src/gwy_mask_fill_draw-24.svg
new file mode 100644
index 0000000..a2be0d5
--- /dev/null
+++ b/pixmaps/src/gwy_mask_fill_draw-24.svg
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask_fill_draw-24.svg">
+  <defs
+     id="defs8426">
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8495"
+       x="-0.084521739"
+       width="1.1690435"
+       y="-0.14953846"
+       height="1.2990769">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.405"
+         id="feGaussianBlur8497" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="10.455185"
+     inkscape:cx="12.366477"
+     inkscape:cy="8.6776188"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <g
+       id="g8506"
+       transform="matrix(0.76281022,0,0,0.76236608,18.131701,144.11448)"
+       style="stroke-width:1.31132388">
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="path8422"
+         d="m 156.83165,609.84668 10.5,-5.5 c 3.34282,0.17099 6.69271,5.92396 6,11 l -11.5,6.5 z"
+         style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.31132388px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="ccc"
+         inkscape:connector-curvature="0"
+         id="path8424"
+         d="m 161.33165,622.03345 c -4.43705,-0.17292 -8.37853,-10.24582 -4.99999,-12 4.43705,0.17292 8.37851,10.24583 4.99999,12 z"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.31132388;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="path8453"
+         d="m 159.33165,609.84668 2.5,1.5 8,-4.5 -2,-1.5 z"
+         style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1.31132388px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8495)" />
+    </g>
+    <path
+       style="opacity:1;vector-effect:none;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:3.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
+       d="m 130.1575,627.84668 c -0.18396,-5.29312 -0.21356,-8.3522 7.33443,-6.84762 l 1.47823,-4.36939 h 2.12599 c 0,0 -0.92612,3.79551 -0.54354,4.08245 4.56923,0.71251 16.91486,3.73493 6.62994,7.13456 z"
+       id="path8501"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_fill_erase-24.svg b/pixmaps/src/gwy_mask_fill_erase-24.svg
new file mode 100644
index 0000000..8238070
--- /dev/null
+++ b/pixmaps/src/gwy_mask_fill_erase-24.svg
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask_fill_erase-24.svg">
+  <defs
+     id="defs8426">
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8495"
+       x="-0.084521739"
+       width="1.1690435"
+       y="-0.14953846"
+       height="1.2990769">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.405"
+         id="feGaussianBlur8497" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4.3813168"
+     inkscape:cx="88.827103"
+     inkscape:cy="7.7724334"
+     inkscape:document-units="px"
+     inkscape:current-layer="g8506"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:3.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8422"
+       width="24"
+       height="24"
+       x="128.33165"
+       y="604.34668" />
+    <g
+       id="g8506"
+       transform="matrix(0.76281022,0,0,0.76236608,18.131701,144.11448)"
+       style="stroke-width:1.31132388">
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="path8422"
+         d="m 156.83165,609.84668 10.5,-5.5 c 3.34282,0.17099 6.69271,5.92396 6,11 l -11.5,6.5 z"
+         style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.31132388px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="ccc"
+         inkscape:connector-curvature="0"
+         id="path8424"
+         d="m 161.33165,622.03345 c -4.43705,-0.17292 -8.37853,-10.24582 -4.99999,-12 4.43705,0.17292 8.37851,10.24583 4.99999,12 z"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#f9f9f9;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.31132388;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="path8453"
+         d="m 159.33165,609.84668 2.5,1.5 8,-4.5 -2,-1.5 z"
+         style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1.31132388px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8495)" />
+    </g>
+    <path
+       style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:3.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
+       d="m 130.1575,627.84668 c -0.18396,-5.29312 -0.21356,-8.3522 7.33443,-6.84762 l 1.47823,-4.36939 h 2.12599 c 0,0 -0.92612,3.79551 -0.54354,4.08245 4.56923,0.71251 16.91486,3.73493 6.62994,7.13456 z"
+       id="path8501"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_grow-24.svg b/pixmaps/src/gwy_mask_grow-24.svg
new file mode 100644
index 0000000..ba4f501
--- /dev/null
+++ b/pixmaps/src/gwy_mask_grow-24.svg
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 22.5 22.5"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_mask_grow-24.svg"
+   inkscape:export-filename="gwy_scale-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8095">
+    <linearGradient
+       id="linearGradient8428"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#4696db;stop-opacity:1;"
+         offset="0"
+         id="stop8430" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="15.684516"
+     inkscape:cy="10.484107"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     units="px"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="0.9375"
+                       spacingy="0.9375"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77814,-596.57599)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#e5beb9;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.9375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.93750005, 1.87500010000000006;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect10104"
+       width="21.5625"
+       height="21.5625"
+       x="245.24689"
+       y="597.04474" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:norma [...]
+       d="M 2 2 L 2 8 L 4.2929688 5.7070312 L 8.2929688 9.7070312 L 9.7070312 8.2910156 L 5.7070312 4.2929688 L 5.7070312 4.2910156 L 8 2 L 2 2 z "
+       transform="matrix(0.9375,0,0,0.9375,244.77814,596.57599)"
+       id="path8441" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 249.46564,601.26349 3.75,3.75"
+       id="path8461"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <g
+       transform="matrix(0.9375,0,0,0.9375,78.998442,33.313463)"
+       id="layer1-5"
+       inkscape:label="Layer 1" />
+    <path
+       sodipodi:nodetypes="cccc"
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 252.27814,598.45099 -5.625,5.625 v -5.625 z"
+       id="path8499"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path8451"
+       d="m 246.65314,617.20099 v -5.625 l 2.14966,2.14966 3.75,-3.75 1.32568,1.32751 -3.75,3.74817 v 0.002 l 2.14966,2.14783 z"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:norma [...]
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8429"
+       d="m 249.46564,614.38849 3.75,-3.75"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8431"
+       d="m 252.27814,617.20099 -5.625,-5.625 v 5.625 z"
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cccc" />
+    <path
+       inkscape:connector-curvature="0"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:norma [...]
+       d="m 265.40297,617.20099 h -5.625 l 2.14966,-2.14966 -3.75,-3.75 1.32751,-1.32568 3.74817,3.75 h 0.002 l 2.14783,-2.14966 z"
+       id="path8453" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 262.59064,614.38849 -3.75,-3.75"
+       id="path8433"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cccc"
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 259.77814,617.20099 5.625,-5.625 v 5.625 z"
+       id="path8435"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path8449"
+       d="m 265.40297,598.45099 h -5.625 l 2.14966,2.14966 -3.75,3.75 1.32751,1.32568 3.74817,-3.75 h 0.002 l 2.14783,2.14966 z"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:norma [...]
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8437"
+       d="m 262.59064,601.26349 -3.75,3.75"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8439"
+       d="m 259.77814,598.45099 5.625,5.625 v -5.625 z"
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cccc" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8459"
+       d="m 251.80939,603.60724 h 8.4375 v 8.4375 h -8.4375 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#f8f8f8;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.9375;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.8125,2.8125;stroke-dashoffset:0.46875;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 251.80939,603.60724 h 8.4375 v 8.4375 h -8.4375 z"
+       id="rect10108"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_intersect-24.svg b/pixmaps/src/gwy_mask_intersect-24.svg
new file mode 100644
index 0000000..fb6d0cd
--- /dev/null
+++ b/pixmaps/src/gwy_mask_intersect-24.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask_intersect-24.svg"
+   inkscape:export-filename="gwy_mask_intersect-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="8.524802"
+     inkscape:cx="15.649988"
+     inkscape:cy="17.766127"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8420"
+       d="m 128.83165,604.84668 h 17 v 15 h -17 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:6.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:6.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 134.83165,612.84668 h 17 v 15 h -17 z"
+       id="path8418"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000018, 3.00000018;stroke-dashoffset:1.50000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 134.83165,612.84668 h 11 v 7 h -11 z"
+       id="rect8417"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:6.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 128.83165,604.84668 h 17 v 15 h -17 z"
+       id="rect11972"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path4754"
+       d="m 134.83165,612.84668 h 17 v 15 h -17 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:6.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_invert-24.svg b/pixmaps/src/gwy_mask_invert-24.svg
new file mode 100644
index 0000000..ee70bbd
--- /dev/null
+++ b/pixmaps/src/gwy_mask_invert-24.svg
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask_invert-24.svg"
+   inkscape:export-filename="gwy_mask_invert-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.146772"
+     inkscape:cx="31.943802"
+     inkscape:cy="9.7170395"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <rect
+       y="604.34668"
+       x="128.33165"
+       height="24"
+       width="24"
+       id="rect10108"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.53333336;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 140.33165,628.34668 h -12 v -24 h 12"
+       id="rect8431"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2, 2;stroke-dashoffset:5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
+       d="m 139.83165,604.34668 v 24"
+       id="path8455"
+       inkscape:connector-curvature="0" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000038, 3.00000037999999991;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate;font-variant-east_asian:normal"
+       id="path8747"
+       cx="140.33165"
+       cy="616.34668"
+       r="6.5" />
+    <path
+       id="circle8749"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.53333336;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       sodipodi:type="arc"
+       sodipodi:cx="-616.34668"
+       sodipodi:cy="140.33165"
+       sodipodi:rx="6.5"
+       sodipodi:ry="6.5"
+       sodipodi:start="3.1415927"
+       sodipodi:end="0"
+       d="m -622.84668,140.33165 a 6.5,6.5 0 0 1 6.5,-6.5 6.5,6.5 0 0 1 6.5,6.5 h -6.5 z"
+       transform="rotate(-90)" />
+    <circle
+       r="6.5"
+       cy="616.34668"
+       cx="140.33165"
+       id="circle8751"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.53333336;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <circle
+       r="6.5"
+       cy="616.34668"
+       cx="140.33165"
+       id="circle8453"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000038, 3.00000037999999991;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate;font-variant-east_asian:normal" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_line-24.svg b/pixmaps/src/gwy_mask_line-24.svg
new file mode 100644
index 0000000..2215cbc
--- /dev/null
+++ b/pixmaps/src/gwy_mask_line-24.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask_line-24.svg"
+   inkscape:export-filename="gwy_mask_line-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.146772"
+     inkscape:cx="-17.262622"
+     inkscape:cy="-1.4926886"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 147.15272,607.6114 1.91421,1.91421 -15.55635,15.55635 -1.91421,-1.91421 z"
+       id="rect8417"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_morph-24.svg b/pixmaps/src/gwy_mask_morph-24.svg
new file mode 100644
index 0000000..17cf10f
--- /dev/null
+++ b/pixmaps/src/gwy_mask_morph-24.svg
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_mask_morph-24.svg"
+   inkscape:export-filename="gwy_mask_morph-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.15679"
+     inkscape:cx="-132.62851"
+     inkscape:cy="42.368097"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <g
+       id="layer1-5"
+       inkscape:label="Layer 1">
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="rect11972"
+         d="m 128.83165,604.84668 h 23 v 23 h -23 z"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    </g>
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#daa39c;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.99999982, 2.99999982000000021;stroke-dashoffset:0.49999997;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 142.83165,613.84668 h 5 v 7 h -5 z"
+       id="rect8441"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#daa39c;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.99999982, 2.99999982;stroke-dashoffset:0.49999997;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 131.83165,607.84668 h 7 v 5 h -7 z"
+       id="rect8463"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8467"
+       d="m 132.83165,620.84668 h 5 v 4 h -5 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#daa39c;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.99999982, 2.99999982;stroke-dashoffset:0.49999997;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_paint_draw-24.svg b/pixmaps/src/gwy_mask_paint_draw-24.svg
new file mode 100644
index 0000000..79cb3bd
--- /dev/null
+++ b/pixmaps/src/gwy_mask_paint_draw-24.svg
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_mask_paint_draw-24.svg"
+   inkscape:export-filename="gwy_mask_paint_draw-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.976243"
+     inkscape:cx="32.940015"
+     inkscape:cy="9.5644343"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8424"
+       d="m 130.33165,606.34668 c 26,2 -14,12 8,19"
+       style="fill:none;fill-rule:evenodd;stroke:#c1665a;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:norma [...]
+       d="m 130.44727,605.35156 -0.23047,2.99024 c 3.18768,0.2452 5.32541,0.62465 6.54687,1.03125 0.61073,0.2033 0.98178,0.41475 1.13672,0.53906 0.15494,0.12431 0.0931,0.0997 0.082,0.041 -0.0221,-0.11729 -0.0562,0.28371 -0.63672,0.96485 -0.58053,0.68113 -1.51711,1.53119 -2.52148,2.44141 -2.00874,1.82042 -4.48568,3.76724 -4.85547,6.65624 -0.1849,1.44451 0.44823,3.0273 1.77148,4.20704 1.32325,1.17973 3.27498,2.14218 6.13672,3.05273 l 0.91016,-2.85742 c -2.63826,-0.83945 -4.24903,-1.72075 - [...]
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g8443">
+      <g
+         id="g8436">
+        <path
+           style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffae1c;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+           d="m 146.3159,604.9015 2.59808,1.5 2.59807,1.50001 -7.5,12.99038 -2.59808,-1.5 -2.59807,-1.5 z"
+           id="rect8442"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccccc" />
+        <path
+           style="fill:#ffccaa;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+           d="m 138.8159,617.89189 -0.26795,4.46409 1.73205,1.00001 3.73205,-2.4641 z"
+           id="path8444"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 140.28,623.35599 -1.73205,-1.00001 -0.067,1.11604 -0.067,1.11601 0.93301,-0.61601 z"
+           id="path8446"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccccc" />
+        <path
+           style="fill:#ffc357;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+           d="m 148.91398,606.4015 -7.50001,12.99039 -2.59807,-1.5 7.5,-12.99039 z"
+           id="path8421"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_paint_erase-24.svg b/pixmaps/src/gwy_mask_paint_erase-24.svg
new file mode 100644
index 0000000..be52941
--- /dev/null
+++ b/pixmaps/src/gwy_mask_paint_erase-24.svg
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_mask_paint_erase-24.svg"
+   inkscape:export-filename="gwy_mask_paint_draw-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.0658116"
+     inkscape:cx="-154.8744"
+     inkscape:cy="101.68377"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000018, 3.00000017999999979;stroke-dashoffset:1.50000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8416"
+       width="24"
+       height="24"
+       x="128.33165"
+       y="604.34668" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 146.3159,604.9015 -7.5,12.99024 -0.26758,4.46484 -0.0684,1.11719 -0.0664,1.11523 0.93359,-0.61523 0.93359,-0.61719 3.73047,-2.46484 7.5,-12.99024 -2.59765,-1.5 z"
+       id="path8420"
+       inkscape:connector-curvature="0"
+       clip-path="none" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:norma [...]
+       d="m 130.44727,605.35156 -0.23047,2.99024 c 3.18768,0.2452 5.32541,0.62465 6.54687,1.03125 0.61073,0.2033 0.98178,0.41475 1.13672,0.53906 0.15494,0.12431 0.0931,0.0997 0.082,0.041 -0.0221,-0.11729 -0.0562,0.28371 -0.63672,0.96485 -0.58053,0.68113 -1.51711,1.53119 -2.52148,2.44141 -2.00874,1.82042 -4.48568,3.76724 -4.85547,6.65624 -0.1849,1.44451 0.44823,3.0273 1.77148,4.20704 1.32325,1.17973 3.27498,2.14218 6.13672,3.05273 l 0.91016,-2.85742 c -2.63826,-0.83945 -4.24903,-1.72075 - [...]
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g8443">
+      <g
+         id="g8436">
+        <path
+           style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffae1c;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+           d="m 146.3159,604.9015 2.59808,1.5 2.59807,1.50001 -7.5,12.99038 -2.59808,-1.5 -2.59807,-1.5 z"
+           id="rect8442"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccccc" />
+        <path
+           style="fill:#ffccaa;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+           d="m 138.8159,617.89189 -0.26795,4.46409 1.73205,1.00001 3.73205,-2.4641 z"
+           id="path8444"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 140.28,623.35599 -1.73205,-1.00001 -0.067,1.11604 -0.067,1.11601 0.93301,-0.61601 z"
+           id="path8446"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccccc" />
+        <path
+           style="fill:#ffc357;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+           d="m 148.91398,606.4015 -7.50001,12.99039 -2.59807,-1.5 7.5,-12.99039 z"
+           id="path8421"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_rect_exclusive-24.svg b/pixmaps/src/gwy_mask_rect_exclusive-24.svg
new file mode 100644
index 0000000..bbe2cd1
--- /dev/null
+++ b/pixmaps/src/gwy_mask_rect_exclusive-24.svg
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask_rect_exclusive-24.svg">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.4150248"
+     inkscape:cx="9.3089339"
+     inkscape:cy="19.019888"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000036, 3.00000036;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect4750"
+       width="24"
+       height="24"
+       x="128.33165"
+       y="604.34668" />
+    <g
+       id="layer1-5"
+       inkscape:label="Layer 1"
+       style="fill:#ffffff">
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="rect11972-6"
+         d="m 131.83165,609.84668 h 17 v 13 h -17 z"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_rect_inclusive-24.svg b/pixmaps/src/gwy_mask_rect_inclusive-24.svg
new file mode 100644
index 0000000..c3fd5fd
--- /dev/null
+++ b/pixmaps/src/gwy_mask_rect_inclusive-24.svg
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask_rect_inclusive-24.svg">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="24.417445"
+     inkscape:cx="7.5968388"
+     inkscape:cy="16.582871"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 131.83165,609.84668 h 17 v 13 h -17 z"
+       id="rect11972"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_remove-24.svg b/pixmaps/src/gwy_mask_remove-24.svg
new file mode 100644
index 0000000..5aab62c
--- /dev/null
+++ b/pixmaps/src/gwy_mask_remove-24.svg
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask_remove-24.svg"
+   inkscape:export-filename="gwy_mask_remove-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16.948159"
+     inkscape:cx="6.5366583"
+     inkscape:cy="13.469422"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <g
+       id="layer1-5"
+       inkscape:label="Layer 1"
+       style="opacity:1;vector-effect:none;fill:#daa39c;fill-opacity:1;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000018, 3.00000018;stroke-dashoffset:1.50000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none">
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="rect11972-6"
+         d="m 131.83165,609.84668 h 17 v 13 h -17 z"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#daa39c;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000018, 3.00000018;stroke-dashoffset:1.50000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    </g>
+    <g
+       transform="matrix(0,1.4142136,-1.4142136,0,898.86247,85.887151)"
+       id="g8435"
+       style="stroke:#000000;stroke-width:2.12124991;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path8431"
+         d="m 372.59152,533.86227 5,5"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.12124991;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.12124991;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 377.59152,533.86227 -5,5"
+         id="path8433"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cc" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_shrink-24.svg b/pixmaps/src/gwy_mask_shrink-24.svg
new file mode 100644
index 0000000..cc0dfe4
--- /dev/null
+++ b/pixmaps/src/gwy_mask_shrink-24.svg
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 22.5 22.5"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_mask_shrink-24.svg"
+   inkscape:export-filename="gwy_mask_shrink-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8095">
+    <linearGradient
+       id="linearGradient8428"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#4696db;stop-opacity:1;"
+         offset="0"
+         id="stop8430" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="-262.91371"
+     inkscape:cy="193.31981"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     units="px"
+     showguides="false"
+     inkscape:snap-nodes="true"
+     inkscape:snap-object-midpoints="true"
+     inkscape:snap-grids="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="0.9375"
+                       spacingy="0.9375"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77814,-596.57599)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.9375;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.8125,2.8125;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate;font-variant-east_asian:normal;vector-effect:none"
+       id="rect10104"
+       width="21.5625"
+       height="21.5625"
+       x="245.24689"
+       y="597.04474" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8483"
+       width="6.5625005"
+       height="6.5625"
+       x="252.74689"
+       y="604.54474" />
+    <g
+       transform="matrix(0.9375,0,0,0.9375,78.998442,33.313463)"
+       id="layer1-5"
+       inkscape:label="Layer 1" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8477"
+       d="m 258.83361,610.65875 0.007,5.63598 2.14966,-2.14965 3.75,3.75 1.32569,-1.32568 -3.75,-3.75 2.14966,-2.14966 z"
+       style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+    <path
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 264.46561,610.66973 -5.625,5.625 0.0238,-5.63247 z"
+       id="path8071"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 258.84361,605.03929 0.007,-5.63598 2.14966,2.14965 3.75,-3.75 1.32569,1.32568 -3.75,3.75 2.14966,2.14966 z"
+       id="path8479"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8493"
+       d="m 264.46561,605.04473 -5.625,-5.625 0.003,5.61956 z"
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cccc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8481"
+       d="m 253.22721,605.02502 -0.007,-5.63598 -2.14966,2.14965 -3.75,-3.75 -1.32569,1.32568 3.75,3.75 -2.14966,2.14966 z"
+       style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+    <path
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 247.59061,605.04473 5.625,-5.625 0.0116,5.60529 z"
+       id="path8499"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <rect
+       y="604.54474"
+       x="252.74689"
+       height="6.5625"
+       width="6.5625005"
+       id="rect10108"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#e5beb9;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.9375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.93750003, 1.87500004;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 265.40311,598.48223 -3.75,3.75"
+       id="path8432"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8442"
+       d="m 246.65311,598.48223 3.75,3.75"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="m 265.40311,617.23223 -3.75,-3.75"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.9375;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 253.22663,610.66229 -5.63599,0.007 2.14966,2.14966 -3.75,3.75 1.32568,1.32568 3.75,-3.75 2.14966,2.14966 z"
+       id="path8462"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g8450">
+      <path
+         style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 247.59061,610.66973 5.625,5.625 0.0115,-5.63227 z"
+         id="path8487"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 246.65311,617.23223 3.75,-3.75"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
+    </g>
+    <g
+       id="g8456"
+       transform="translate(-11.249996,-4.6875043)" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_subtract-24.svg b/pixmaps/src/gwy_mask_subtract-24.svg
new file mode 100644
index 0000000..32bf9d0
--- /dev/null
+++ b/pixmaps/src/gwy_mask_subtract-24.svg
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_mask_subtract-24.svg">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="14.427539"
+     inkscape:cx="7.8403613"
+     inkscape:cy="9.3275383"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:6.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 128.83165,604.84668 h 17 v 15 h -17 z"
+       id="rect11972"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000018, 3.00000017999999979;stroke-dashoffset:1.50000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 134.83165,612.84668 h 11 v 7 h -11 z"
+       id="rect8417"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path4754"
+       d="m 134.83165,612.84668 h 17 v 15 h -17 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:6.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8418"
+       d="m 128.83165,604.84668 h 17 v 15 h -17 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:6.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mask_thin-24.svg b/pixmaps/src/gwy_mask_thin-24.svg
new file mode 100644
index 0000000..9af236d
--- /dev/null
+++ b/pixmaps/src/gwy_mask_thin-24.svg
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_mask_thin-24.svg"
+   inkscape:export-filename="gwy_mask_thin-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8426" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="24.417445"
+     inkscape:cx="22.477195"
+     inkscape:cy="34.092874"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <g
+       id="g4834"
+       transform="translate(0.80053855,0.01001727)">
+      <g
+         style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000018, 3.00000018;stroke-dashoffset:1.50000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
+         id="g4808">
+        <path
+           id="path4804"
+           transform="translate(128.33165,604.34668)"
+           d="M 4.1035156,1.3398438 A 3.50035,3.50035 0 0 0 1.4804688,6.9472656 L 4.0664062,10.46875 C 3.7418569,10.862139 3.4261872,11.289923 3.1484375,11.794922 2.4187975,13.121552 1.97543,14.516559 1.5625,15.787109 1.14957,17.057659 0.85351562,18.117188 0.85351562,18.117188 A 3.50035,3.50035 0 1 0 7.59375,20.003906 c 0,0 0.26099,-0.932724 0.625,-2.052734 0.36401,-1.12002 0.9156,-2.51416 1.0625,-2.78125 0.11417,-0.20757 0.3852169,-0.376895 0.6230469,-0.552734 0.6297601,-0.0209 1.584334 [...]
+           style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:n [...]
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         id="g4802">
+        <path
+           style="fill:#7b3633;fill-opacity:0.02278371;fill-rule:evenodd;stroke:#c1665a;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 132.63467,609.22216 4.62176,6.29515"
+           id="path4792"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="fill:#7b3633;fill-opacity:0.02278371;fill-rule:evenodd;stroke:#c1665a;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 146.55333,615.68146 c -3.13775,-0.0664 -7.63847,-0.4054 -9.41324,-0.19921 0,0 -1.71643,0.75223 -2.59297,2.34594 -0.87654,1.59371 -1.99214,5.57799 -1.99214,5.57799"
+           id="path4794"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccsc" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_measure_lattice-24.svg b/pixmaps/src/gwy_measure_lattice-24.svg
new file mode 100644
index 0000000..1b8aff8
--- /dev/null
+++ b/pixmaps/src/gwy_measure_lattice-24.svg
@@ -0,0 +1,310 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8358"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_measure_lattice-24.svg">
+  <defs
+     id="defs8360" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="19.933662"
+     inkscape:cx="15.43423"
+     inkscape:cy="-3.2406089"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-grids="false"
+     inkscape:snap-object-midpoints="true"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8363">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-440.45435,-566.55946)">
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 447.95435,584.05946 6,-3 v -6"
+       id="path8466"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <g
+       id="g4815"
+       transform="translate(5,-3)">
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 442.95435,567.55946 v 3"
+         id="path4811"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4813"
+         d="m 444.45435,569.05946 h -3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <g
+       transform="translate(5,3)"
+       id="g4821">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4817"
+         d="m 442.95435,567.55946 v 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 444.45435,569.05946 h -3"
+         id="path4819"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       transform="translate(5,9)"
+       id="g4827">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4823"
+         d="m 442.95435,567.55946 v 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 444.45435,569.05946 h -3"
+         id="path4825"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       id="g4833"
+       transform="translate(5,15)">
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 442.95435,567.55946 v 3"
+         id="path4829"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4831"
+         d="m 444.45435,569.05946 h -3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <g
+       transform="translate(5,21)"
+       id="g4859">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4855"
+         d="m 442.95435,567.55946 v 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 444.45435,569.05946 h -3"
+         id="path4857"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       id="g4883"
+       transform="translate(11)">
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 442.95435,567.55946 v 3"
+         id="path4879"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4881"
+         d="m 444.45435,569.05946 h -3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <g
+       id="g4889"
+       transform="translate(11,6)">
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 442.95435,567.55946 v 3"
+         id="path4885"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4887"
+         d="m 444.45435,569.05946 h -3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <g
+       transform="translate(11,11.5)"
+       id="g4895">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4891"
+         d="m 442.95435,567.55946 v 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 444.45435,569.05946 h -3"
+         id="path4893"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       id="g4901"
+       transform="translate(11,17)">
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 442.95435,567.55946 v 3"
+         id="path4897"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4899"
+         d="m 444.45435,569.05946 h -3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <g
+       id="g4917"
+       transform="translate(-9)">
+      <rect
+         y="567.05945"
+         x="465.9545"
+         height="22"
+         width="5.9999995"
+         id="rect12874"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path12876"
+         d="m 466.45434,575.05957 h 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path12880"
+         d="m 466.45434,572.05957 h 2.00001"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 466.45434,569.05957 h 3"
+         id="path12882"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path12884"
+         d="m 466.45434,584.05957 h 2.00001"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path12890"
+         d="m 466.45434,578.05957 h 2.00001"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 466.45434,581.05957 h 3"
+         id="path12892"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8091"
+         d="m 466.45434,587.05957 h 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <g
+       id="g4942"
+       transform="translate(-1)">
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 442.95435,567.55946 v 3"
+         id="path4938"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4940"
+         d="m 444.45435,569.05946 h -3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <g
+       transform="translate(-1,6)"
+       id="g4948">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4944"
+         d="m 442.95435,567.55946 v 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 444.45435,569.05946 h -3"
+         id="path4946"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       id="g5025"
+       transform="translate(-1)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4950"
+         d="m 442.95435,579.55946 v 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 444.45435,581.05946 h -3"
+         id="path4952"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       id="g5021"
+       transform="translate(-1)">
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 442.95435,585.55946 v 3"
+         id="path4956"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4958"
+         d="m 444.45435,587.05946 h -3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_merge-24.svg b/pixmaps/src/gwy_merge-24.svg
new file mode 100644
index 0000000..bcbe244
--- /dev/null
+++ b/pixmaps/src/gwy_merge-24.svg
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_merge-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="24.386559"
+     inkscape:cx="10.928843"
+     inkscape:cy="20.559608"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <rect
+       y="472.83789"
+       x="197.86205"
+       height="15"
+       width="15"
+       id="rect4910"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="480.83789"
+       x="205.86205"
+       height="15"
+       width="15"
+       id="rect4912"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#e8f0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="M 0.5 0.5 L 0.5 15.5 L 8.5 15.5 L 8.5 23.5 L 23.5 23.5 L 23.5 8.5 L 15.5 8.5 L 15.5 0.5 L 0.5 0.5 z "
+       id="rect11370"
+       transform="translate(197.36205,472.33789)" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_more-24.svg b/pixmaps/src/gwy_more-24.svg
new file mode 100644
index 0000000..3780f16
--- /dev/null
+++ b/pixmaps/src/gwy_more-24.svg
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_more-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.0630899"
+     inkscape:cx="1.9641561"
+     inkscape:cy="11.987625"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <path
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolation:sRGB;color-interpolation-filters:linearRGB;fill:#4696db;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="M 14.333984 0.50195312 C 12.809464 0.50195312 14.091866 2.5088775 11.166016 2.7734375 C 7.6983256 3.0870375 9.6052044 -0.067941875 6.5214844 1.5488281 C 3.4377844 3.1656481 7.1189719 3.3925463 4.8886719 6.0664062 C 2.6584219 8.7402062 1.7756012 5.1586319 0.73828125 8.4824219 C -0.29901875 11.806212 2.4637537 9.3642713 2.7773438 12.832031 C 3.0909438 16.299741 -0.06595875 14.390839 1.5507812 17.474609 C 3.1675212 20.558379 3.3946094 16.879025 6.0683594 19.109375 C 8.7421594 21.3 [...]
+       transform="translate(197.36205,472.33789)"
+       id="path4236" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8080"
+       d="m 204.36205,484.33789 h 10"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 209.36205,479.33789 v 10"
+       id="path8423"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_mutual_crop-24.svg b/pixmaps/src/gwy_mutual_crop-24.svg
new file mode 100644
index 0000000..1ea62a7
--- /dev/null
+++ b/pixmaps/src/gwy_mutual_crop-24.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8440"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_mutual_crop-24.svg"
+   inkscape:export-filename="gwy_crop-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8442">
+    <clipPath
+       id="clipPath8428-3-56"
+       clipPathUnits="userSpaceOnUse">
+      <rect
+         transform="matrix(0.51658212,0.85623765,0.85623765,-0.51658212,0,0)"
+         y="-55.845753"
+         x="77.848434"
+         height="72.344795"
+         width="92.534042"
+         id="rect8430-6-2"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#eb0000;fill-opacity:0.41158537;fill-rule:evenodd;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    </clipPath>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.9294364"
+     inkscape:cx="142.17879"
+     inkscape:cy="-8.7904467"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8445">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-18.260046,-276.07986)">
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#e1ebd7;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 25.760046,276.57986 v 7 h -7 v 16 h 16 v -7 h 7 v -16 z"
+       id="rect8700"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.5;stroke-opacity:1;marker:none;marker-start:none;marker-end:none;enable-background:accumulate"
+       d="m 25.760046,283.57986 9,-10e-6 v 9.00001 l -9,1e-5 z"
+       id="rect11972-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_neural_apply-24.svg b/pixmaps/src/gwy_neural_apply-24.svg
new file mode 100644
index 0000000..544c545
--- /dev/null
+++ b/pixmaps/src/gwy_neural_apply-24.svg
@@ -0,0 +1,228 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_neural_apply-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045">
+    <filter
+       height="1.2250096"
+       y="-0.11250482"
+       width="1.2571303"
+       x="-0.12856513"
+       id="filter8458"
+       style="color-interpolation-filters:sRGB"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur8460"
+         stdDeviation="0.16275744"
+         inkscape:collect="always" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4.1733689"
+     inkscape:cx="124.50368"
+     inkscape:cy="-24.195489"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="false"
+     inkscape:snap-object-midpoints="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <g
+       transform="translate(-46.42443,-128.76933)"
+       id="layer1-5"
+       inkscape:label="Layer 1">
+      <path
+         sodipodi:nodetypes="ccccccccccc"
+         inkscape:connector-curvature="0"
+         id="path8069"
+         d="m 256.27811,611.60722 -0.009,-2 h 5.99121 v 1.5 l 4.75586,-4 -4.75586,-4.5 v 2 h -5.48242 -5.48242 l -0.009,7 z"
+         style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         transform="rotate(-43.812899,259.65837,596.89525)"
+         style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+         d="m 248.25595,597.40694 7.92078,7.64259 c 0.78644,-0.69253 0.27926,-0.20275 0.86026,-0.71903 0,0 0.41294,0.95999 -0.6066,2.08575 -0.31728,0.41341 -7.72954,-7.84089 -8.35149,-8.62932 -0.34388,-0.43593 -0.0819,-0.56315 0.17705,-0.37999 z"
+         id="path8462"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccsc" />
+      <path
+         sodipodi:nodetypes="cccscc"
+         inkscape:connector-curvature="0"
+         id="path8466"
+         d="m 253.47872,607.61144 1.81198,-1.81975 0.89043,-1.02933 c 0,0 0.0967,0.57698 -0.92284,1.70274 -1.01955,1.12575 -1.31704,1.26648 -1.31704,1.26648 z"
+         style="opacity:0.26000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+         transform="rotate(-43.812899,254.00535,611.52001)" />
+      <path
+         transform="rotate(6.2066356,241.67283,695.82003)"
+         style="opacity:0.26000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+         d="m 253.47872,607.61144 1.81198,-1.81975 0.89043,-1.02933 c 0,0 0.0967,0.57698 -0.92284,1.70274 -1.01955,1.12575 -1.31704,1.26648 -1.31704,1.26648 z"
+         id="path8468"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccscc" />
+    </g>
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path8522"
+       cx="200.36205"
+       cy="475.33789"
+       r="2.5" />
+    <circle
+       r="2.5"
+       cy="483.33789"
+       cx="201.36205"
+       id="circle8540"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <circle
+       r="2.5"
+       cy="493.33789"
+       cx="208.36205"
+       id="circle8546"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 201.05196,480.85722 -0.37983,-3.03866"
+       id="path8566"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8540"
+       inkscape:connection-end="#path8522" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle8544"
+       cx="218.36205"
+       cy="491.83789"
+       r="2.5" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 202.79568,485.38594 4.13273,5.9039"
+       id="path8568"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8540"
+       inkscape:connection-end="#circle8546" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 210.83436,492.96704 5.05537,-0.7583"
+       id="path8570"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8546"
+       inkscape:connection-end="#circle8544" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 205.87497,493.08439 -5.68312,-0.57927"
+       id="path8572"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8546" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 218.36205,491.83789 v 0"
+       id="path8582"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8544"
+       inkscape:connection-end="#circle8544" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 214.22922,488.00026 2.30084,2.1365"
+       id="path8584"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8578"
+       inkscape:connection-end="#circle8544" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle8578"
+       cx="212.36205"
+       cy="486.33789"
+       r="2.5" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle8542"
+       cx="200.36205"
+       cy="492.33789"
+       r="2.5" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 203.77392,483.99567 6.17625,1.68444"
+       id="path8609"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8540"
+       inkscape:connection-end="#circle8578" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 201.08597,485.8226 -0.44785,4.03058"
+       id="path8439"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8540"
+       inkscape:connection-end="#circle8542" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 211.12172,488.50846 -1.51935,2.65886"
+       id="path8441"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8578"
+       inkscape:connection-end="#circle8546" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_neural_train-24.svg b/pixmaps/src/gwy_neural_train-24.svg
new file mode 100644
index 0000000..b222cef
--- /dev/null
+++ b/pixmaps/src/gwy_neural_train-24.svg
@@ -0,0 +1,216 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_neural_train-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045">
+    <filter
+       height="1.2250096"
+       y="-0.11250482"
+       width="1.2571303"
+       x="-0.12856513"
+       id="filter8458"
+       style="color-interpolation-filters:sRGB"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur8460"
+         stdDeviation="0.16275744"
+         inkscape:collect="always" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.2403396"
+     inkscape:cx="112.57724"
+     inkscape:cy="-24.255527"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <path
+       style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 211.86205,478.83833 h 2 l -4.5,4.75586 -4.5,-4.756 2,1.4e-4 v -5.96484 l 5,-0.009 z"
+       id="path8069"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccc" />
+    <path
+       sodipodi:nodetypes="ccsscc"
+       inkscape:connector-curvature="0"
+       id="path8462"
+       d="m 256.17673,605.04953 c 0.8826,0.74463 0.87767,0.64516 0.25366,1.36672 -0.0793,0.10335 -3.50436,3.74088 -3.64706,3.54963 -0.0357,-0.0478 1.21045,0.6568 0.77849,0.76406 -0.31181,0.0774 -2.39046,0.15988 -2.03936,-0.30007 1.5729,-1.77619 2.994,-3.72192 4.65427,-5.38034 z"
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       transform="matrix(-0.72160439,-0.69230565,-0.69230565,0.72160439,812.46536,214.58469)" />
+    <path
+       sodipodi:nodetypes="cccscc"
+       inkscape:connector-curvature="0"
+       id="path8468"
+       d="m 253.47872,607.61144 1.81198,-1.81975 0.89043,-1.02933 c 0,0 0.0967,0.57698 -0.92284,1.70274 -1.01955,1.12575 -1.31704,1.26648 -1.31704,1.26648 z"
+       style="opacity:0.26000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       transform="matrix(0.10811449,0.99413845,0.99413845,-0.10811449,-419.79492,293.46652)" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path8522"
+       cx="200.36205"
+       cy="475.33789"
+       r="2.5" />
+    <circle
+       r="2.5"
+       cy="483.33789"
+       cx="201.36205"
+       id="circle8540"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <circle
+       r="2.5"
+       cy="493.33789"
+       cx="208.36205"
+       id="circle8546"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 201.05196,480.85722 -0.37983,-3.03866"
+       id="path8566"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8540"
+       inkscape:connection-end="#path8522" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle8544"
+       cx="218.36205"
+       cy="491.83789"
+       r="2.5" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 202.79568,485.38594 4.13273,5.9039"
+       id="path8568"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8540"
+       inkscape:connection-end="#circle8546" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 210.83436,492.96704 5.05537,-0.7583"
+       id="path8570"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8546"
+       inkscape:connection-end="#circle8544" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 205.87497,493.08439 -5.68312,-0.57927"
+       id="path8572"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8546" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 218.36205,491.83789 v 0"
+       id="path8582"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8544"
+       inkscape:connection-end="#circle8544" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 214.22922,488.00026 2.30084,2.1365"
+       id="path8584"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8578"
+       inkscape:connection-end="#circle8544" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle8578"
+       cx="212.36205"
+       cy="486.33789"
+       r="2.5" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="circle8542"
+       cx="200.36205"
+       cy="492.33789"
+       r="2.5" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 203.77392,483.99567 6.17625,1.68444"
+       id="path8609"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8540"
+       inkscape:connection-end="#circle8578" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 201.08597,485.8226 -0.44785,4.03058"
+       id="path8437"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8540"
+       inkscape:connection-end="#circle8542" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 211.12172,488.50846 -1.51935,2.65886"
+       id="path8439"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#circle8578"
+       inkscape:connection-end="#circle8546" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_next-24.svg b/pixmaps/src/gwy_next-24.svg
new file mode 100644
index 0000000..1cd9592
--- /dev/null
+++ b/pixmaps/src/gwy_next-24.svg
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_next-24.svg"
+   inkscape:export-filename="gwy_flip_horizontally-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8095">
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8458"
+       x="-0.12856513"
+       width="1.2571303"
+       y="-0.11250482"
+       height="1.2250096">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.16275744"
+         id="feGaussianBlur8460" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="18.852899"
+     inkscape:cx="1.8735526"
+     inkscape:cy="17.657608"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77811,-595.10722)">
+    <path
+       style="fill:#7db846;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;fill-opacity:1"
+       d="m 246.27811,600.10722 9.5,7 -9.5,7 z"
+       id="path4758"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 247.2326,608.08361 0.0455,-5.97639 6.39043,4.47067 c -3.60204,-1.17623 -5.67841,-2.61368 -6.43593,1.506 z"
+       id="path8400"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       sodipodi:nodetypes="cccc"
+       inkscape:connector-curvature="0"
+       id="path4760"
+       d="m 257.27811,600.10722 9.5,7 -9.5,7 z"
+       style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cccc"
+       inkscape:connector-curvature="0"
+       id="path4764"
+       d="m 258.2326,606.58361 0.0455,-4.47639 6.39043,4.47067 c -3.60204,-1.17623 -5.27343,-2.71465 -6.43593,0.006 z"
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_null_offsets-24.svg b/pixmaps/src/gwy_null_offsets-24.svg
new file mode 100644
index 0000000..8c4e2ad
--- /dev/null
+++ b/pixmaps/src/gwy_null_offsets-24.svg
@@ -0,0 +1,703 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_null_offsets-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045">
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4171"
+       xlink:href="#linearGradient4140"
+       gradientTransform="translate(40.432491,952.98205)" />
+    <linearGradient
+       id="linearGradient4140">
+      <stop
+         id="stop4142"
+         offset="0"
+         style="stop-color:#d7e3f4;stop-opacity:1;" />
+      <stop
+         id="stop4144"
+         offset="1"
+         style="stop-color:#f1f5fb;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(-2.339129,952.13564)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient8503"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(13.227281,960.62636)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11272"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient9134"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-27.014439,958.15741)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="20.317098"
+     inkscape:cx="17.239074"
+     inkscape:cy="6.537208"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:lockguides="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 206.86205,481.83789 h 14 v 14 h -14 z"
+       id="rect11370"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385"
+       y="843.05096"
+       x="41.802231">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487"
+       y="938.92712"
+       x="65.932205">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536"
+       y="878.3396"
+       x="0.49949738">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6"
+       style="opacity:1;fill:url(#linearGradient4171);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318"
+       transform="translate(-38.681109,677.66608)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386"
+       transform="translate(508.54013,149.4681)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162"
+       transform="translate(-186.10204,-7.29379)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="362.06644"
+       y="1066.9902"
+       id="text8015"><tspan
+         id="tspan8017"
+         x="362.06644"
+         y="1066.9902" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1211.035"
+       y="-260.07465"
+       id="text9295"><tspan
+         id="tspan9297"
+         x="-1211.035"
+         y="-260.07465" /></text>
+    <text
+       id="text7408-2"
+       class="fil7 fnt4"
+       y="21.807182"
+       x="-1093.8223"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422"
+       class="fil7 fnt4"
+       y="49.273796"
+       x="-1077.4493"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-9"
+       y="842.20453"
+       x="-0.96938998">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-0"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-9"
+       y="938.08069"
+       x="23.160585">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-1"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7"
+       y="877.49316"
+       x="-42.272125">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-7"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-1"
+       style="opacity:1;fill:url(#linearGradient8503);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-7"
+       transform="translate(-81.452712,676.81967)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-6"
+       transform="translate(465.76854,148.62169)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7"
+       transform="translate(-228.87364,-8.1402)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="319.29483"
+       y="1066.1438"
+       id="text8015-3"><tspan
+         id="tspan8017-6"
+         x="319.29483"
+         y="1066.1438" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1253.8066"
+       y="-260.92102"
+       id="text9295-5"><tspan
+         id="tspan9297-6"
+         x="-1253.8066"
+         y="-260.92102" /></text>
+    <text
+       id="text7408-2-3"
+       class="fil7 fnt4"
+       y="20.960777"
+       x="-1136.5939"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-9"
+       class="fil7 fnt4"
+       y="48.427391"
+       x="-1120.2209"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-7"
+       y="850.69525"
+       x="14.597016">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-2"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-3"
+       y="946.57141"
+       x="38.72699">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-7"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-2"
+       y="885.98389"
+       x="-26.705719">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-5"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-3"
+       style="opacity:1;fill:url(#linearGradient11272);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-3"
+       transform="translate(-65.886312,685.31039)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-64"
+       transform="translate(481.33493,157.11241)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-03"
+       transform="translate(-213.30724,0.35052)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="334.86124"
+       y="1074.6345"
+       id="text8015-5"><tspan
+         id="tspan8017-85"
+         x="334.86124"
+         y="1074.6345" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1238.2402"
+       y="-252.4303"
+       id="text9295-0"><tspan
+         id="tspan9297-9"
+         x="-1238.2402"
+         y="-252.4303" /></text>
+    <text
+       id="text7408-2-9"
+       class="fil7 fnt4"
+       y="29.4515"
+       x="-1121.0275"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-8"
+       class="fil7 fnt4"
+       y="56.918114"
+       x="-1104.6545"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-2"
+       y="848.22632"
+       x="-25.644714">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-6"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-5"
+       y="944.10248"
+       x="-1.514739">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-8"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7-2"
+       y="883.51495"
+       x="-66.947456">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-9"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-6"
+       style="opacity:1;fill:url(#linearGradient9134);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-4"
+       transform="translate(-106.12801,682.84144)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-8"
+       transform="translate(441.09323,154.64346)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7-4"
+       transform="translate(-253.54895,-2.11844)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="294.61954"
+       y="1072.1655"
+       id="text8015-0"><tspan
+         id="tspan8017-8"
+         x="294.61954"
+         y="1072.1655" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1278.4819"
+       y="-254.89923"
+       id="text9295-6-9"><tspan
+         id="tspan9297-2"
+         x="-1278.4819"
+         y="-254.89923" /></text>
+    <text
+       id="text7408-2-4"
+       class="fil7 fnt4"
+       y="26.982567"
+       x="-1161.2692"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-7"
+       class="fil7 fnt4"
+       y="54.449181"
+       x="-1144.8962"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 0.5,0.5 v 24 h 4 v -20 h 20 v -4 h -21 -2 z"
+       transform="translate(197.36205,472.33789)"
+       id="rect12874"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect5688"
+       width="1"
+       height="1"
+       x="200.36205"
+       y="476.33789" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect5688-5"
+       width="1"
+       height="1"
+       x="200.36205"
+       y="478.33789" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect5688-0"
+       width="1"
+       height="1"
+       x="200.36205"
+       y="480.33789" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect5688-9"
+       width="1"
+       height="1"
+       x="200.36205"
+       y="482.33789" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect5688-3"
+       width="1"
+       height="1"
+       x="200.36205"
+       y="484.33789" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect5688-8"
+       width="1"
+       height="1"
+       x="200.36205"
+       y="486.33789" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect5688-56"
+       width="1"
+       height="1"
+       x="200.36205"
+       y="488.33789" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect5688-1"
+       width="1"
+       height="1"
+       x="200.36205"
+       y="490.33789" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect5688-15"
+       width="1"
+       height="1"
+       x="200.36205"
+       y="492.33789" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect5688-98"
+       width="1"
+       height="1"
+       x="200.36205"
+       y="494.33789" />
+    <rect
+       y="-220.36208"
+       x="475.33774"
+       height="1"
+       width="1"
+       id="rect5767"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="rotate(90)" />
+    <rect
+       y="-218.36208"
+       x="475.33774"
+       height="1"
+       width="1"
+       id="rect5769"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="rotate(90)" />
+    <rect
+       y="-216.36208"
+       x="475.33774"
+       height="1"
+       width="1"
+       id="rect5771"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="rotate(90)" />
+    <rect
+       y="-214.36208"
+       x="475.33774"
+       height="1"
+       width="1"
+       id="rect5773"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="rotate(90)" />
+    <rect
+       y="-212.36208"
+       x="475.33774"
+       height="1"
+       width="1"
+       id="rect5775"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="rotate(90)" />
+    <rect
+       y="-210.36208"
+       x="475.33774"
+       height="1"
+       width="1"
+       id="rect5777"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="rotate(90)" />
+    <rect
+       y="-208.36208"
+       x="475.33774"
+       height="1"
+       width="1"
+       id="rect5779"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="rotate(90)" />
+    <rect
+       y="-206.36208"
+       x="475.33774"
+       height="1"
+       width="1"
+       id="rect5781"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="rotate(90)" />
+    <rect
+       y="-204.36208"
+       x="475.33774"
+       height="1"
+       width="1"
+       id="rect5783"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="rotate(90)" />
+    <rect
+       y="-202.36208"
+       x="475.33774"
+       height="1"
+       width="1"
+       id="rect5785"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="rotate(90)" />
+    <rect
+       y="-202.36208"
+       x="476.33774"
+       height="1"
+       width="1"
+       id="rect5785-4"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       transform="rotate(90)" />
+    <g
+       id="g5851"
+       transform="rotate(180,210.0811,485.04494)">
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="path8069"
+         d="m 207.83762,484.79856 1.99711,-1.99709 4.99275,4.99275 -1.99709,1.99709 z"
+         style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8071"
+         d="m 210.83328,491.78841 5.99131,-5.9913 v 5.9913 z"
+         style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <rect
+       y="476.33789"
+       x="199.36205"
+       height="1"
+       width="1"
+       id="rect8513"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8515"
+       width="1"
+       height="1"
+       x="201.36205"
+       y="474.33789" />
+    <rect
+       y="474.33789"
+       x="205.36205"
+       height="1"
+       width="1"
+       id="rect8517"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="474.33789"
+       x="209.36205"
+       height="1"
+       width="1"
+       id="rect8517-3"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="474.33789"
+       x="213.36205"
+       height="1"
+       width="1"
+       id="rect8517-6"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="474.33789"
+       x="217.36205"
+       height="1"
+       width="1"
+       id="rect8517-7"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="480.33789"
+       x="199.36205"
+       height="1"
+       width="1"
+       id="rect8517-5"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="484.33789"
+       x="199.36205"
+       height="1"
+       width="1"
+       id="rect8517-35"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="488.33789"
+       x="199.36205"
+       height="1"
+       width="1"
+       id="rect8517-62"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="492.33789"
+       x="199.36205"
+       height="1"
+       width="1"
+       id="rect8517-9"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_palettes-16.svg b/pixmaps/src/gwy_palettes-16.svg
new file mode 100644
index 0000000..e0f5b5f
--- /dev/null
+++ b/pixmaps/src/gwy_palettes-16.svg
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="16"
+     height="16"
+     viewBox="0 0 16 16"
+     id="svg8691"
+     version="1.1"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_palettes-16.svg"
+     inkscape:export-filename="gwy_palettes-16.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <defs
+         id="defs8693">
+        <linearGradient
+             inkscape:collect="always"
+             id="linearGradient8648">
+            <stop
+                 style="stop-color:#000200;stop-opacity:1"
+                 offset="0"
+                 id="stop8650" />
+            <stop
+                 id="stop8714"
+                 offset="0.25"
+                 style="stop-color:#4696db;stop-opacity:1" />
+            <stop
+                 id="stop8710"
+                 offset="0.5"
+                 style="stop-color:#ffbb00;stop-opacity:1" />
+            <stop
+                 style="stop-color:#fd9044;stop-opacity:1"
+                 offset="0.75"
+                 id="stop8712" />
+            <stop
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1"
+                 id="stop8652" />
+        </linearGradient>
+        <linearGradient
+             gradientTransform="translate(-139.12864,-80.867386)"
+             gradientUnits="userSpaceOnUse"
+             y2="549.86182"
+             x2="378.15701"
+             y1="549.86188"
+             x1="363.15701"
+             id="linearGradient8654-6"
+             xlink:href="#linearGradient8648"
+             inkscape:collect="always" />
+        <linearGradient
+             gradientTransform="translate(0,9)"
+             gradientUnits="userSpaceOnUse"
+             y2="452.99442"
+             x2="239.02837"
+             y1="452.99442"
+             x1="224.02837"
+             id="linearGradient8128"
+             xlink:href="#linearGradient8122-6"
+             inkscape:collect="always" />
+        <linearGradient
+             inkscape:collect="always"
+             xlink:href="#linearGradient8122-6"
+             id="linearGradient8128-3"
+             x1="224.02837"
+             y1="452.99442"
+             x2="247.02837"
+             y2="452.99442"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="translate(-224.02837,-448.99442)" />
+        <linearGradient
+             inkscape:collect="always"
+             id="linearGradient8122-6">
+            <stop
+                 style="stop-color:#000000;stop-opacity:1;"
+                 offset="0"
+                 id="stop8124-7" />
+            <stop
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1"
+                 id="stop8126-5" />
+        </linearGradient>
+    </defs>
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="21.764465"
+         inkscape:cx="9.6249927"
+         inkscape:cy="5.1532646"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1379"
+         inkscape:window-height="1023"
+         inkscape:window-x="531"
+         inkscape:window-y="33"
+         inkscape:window-maximized="0"
+         units="px"
+         inkscape:document-rotation="0">
+        <inkscape:grid
+             type="xygrid"
+             id="grid1px"
+             originx="0"
+             originy="0"
+             dotted="false"
+             snapvisiblegridlinesonly="false"
+             spacingx="1.0"
+             spacingy="1.0"
+             enabled="true"
+             visible="true" />
+    </sodipodi:namedview>
+    <metadata
+         id="metadata8696">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title />
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-224.02837,-456.99442)">
+        <path
+             style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8654-6);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+             d="m 224.52837,466.49442 15,0 0,6 -15,0 z"
+             id="rect8646-0"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc" />
+        <path
+             style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8128);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate;vector-effect:none"
+             d="m 224.52837,458.49442 15,0 0,6 -15,0 z"
+             id="rect8118"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_palettes-24.svg b/pixmaps/src/gwy_palettes-24.svg
new file mode 100644
index 0000000..5504c95
--- /dev/null
+++ b/pixmaps/src/gwy_palettes-24.svg
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     sodipodi:docname="gwy_palettes-24.svg"
+     inkscape:version="0.92+devel unknown"
+     version="1.1"
+     id="svg8691"
+     viewBox="0 0 24 24"
+     height="24"
+     width="24"
+     inkscape:export-filename="gwy_palettes-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <defs
+         id="defs8693">
+        <linearGradient
+             id="linearGradient8210"
+             inkscape:collect="always">
+            <stop
+                 id="stop8212"
+                 offset="0"
+                 style="stop-color:#000200;stop-opacity:1" />
+            <stop
+                 style="stop-color:#4e0e57;stop-opacity:1"
+                 offset="0.25"
+                 id="stop8214" />
+            <stop
+                 style="stop-color:#7b78cf;stop-opacity:1"
+                 offset="0.5"
+                 id="stop8216" />
+            <stop
+                 id="stop8218"
+                 offset="0.75"
+                 style="stop-color:#4697e3;stop-opacity:1" />
+            <stop
+                 id="stop8220"
+                 offset="1"
+                 style="stop-color:#ffffff;stop-opacity:1" />
+        </linearGradient>
+        <linearGradient
+             inkscape:collect="always"
+             id="linearGradient8122">
+            <stop
+                 style="stop-color:#000000;stop-opacity:1;"
+                 offset="0"
+                 id="stop8124" />
+            <stop
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1"
+                 id="stop8126" />
+        </linearGradient>
+        <linearGradient
+             inkscape:collect="always"
+             xlink:href="#linearGradient8648"
+             id="linearGradient8654"
+             x1="363.15701"
+             y1="549.86188"
+             x2="386.15701"
+             y2="549.86182"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="translate(-139.12864,-80.867386)" />
+        <linearGradient
+             inkscape:collect="always"
+             id="linearGradient8648">
+            <stop
+                 style="stop-color:#000200;stop-opacity:1"
+                 offset="0"
+                 id="stop8650" />
+            <stop
+                 id="stop8714"
+                 offset="0.25"
+                 style="stop-color:#4696db;stop-opacity:1" />
+            <stop
+                 id="stop8710"
+                 offset="0.5"
+                 style="stop-color:#ffbb00;stop-opacity:1" />
+            <stop
+                 style="stop-color:#fd9044;stop-opacity:1"
+                 offset="0.75"
+                 id="stop8712" />
+            <stop
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1"
+                 id="stop8652" />
+        </linearGradient>
+        <linearGradient
+             inkscape:collect="always"
+             xlink:href="#linearGradient8122"
+             id="linearGradient8128"
+             x1="224.02837"
+             y1="452.99442"
+             x2="247.02837"
+             y2="452.99442"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="translate(0,1)" />
+        <linearGradient
+             inkscape:collect="always"
+             xlink:href="#linearGradient8210"
+             id="linearGradient8134"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="translate(-139.12864,-88.867386)"
+             x1="363.15701"
+             y1="549.86188"
+             x2="386.15701"
+             y2="549.86182" />
+    </defs>
+    <sodipodi:namedview
+         inkscape:window-maximized="1"
+         inkscape:window-y="33"
+         inkscape:window-x="0"
+         inkscape:window-height="1028"
+         inkscape:window-width="1920"
+         showgrid="true"
+         inkscape:current-layer="layer1"
+         inkscape:document-units="px"
+         inkscape:cy="10.96139"
+         inkscape:cx="17.97223"
+         inkscape:zoom="25.429241"
+         inkscape:pageshadow="2"
+         inkscape:pageopacity="0.0"
+         borderopacity="1.0"
+         bordercolor="#666666"
+         pagecolor="#ffffff"
+         id="base"
+         inkscape:document-rotation="0">
+        <inkscape:grid
+             type="xygrid"
+             id="grid1px"
+             originx="0"
+             originy="0"
+             dotted="false"
+             snapvisiblegridlinesonly="false"
+             spacingx="1.0"
+             spacingy="1.0"
+             enabled="true"
+             visible="true" />
+    </sodipodi:namedview>
+    <metadata
+         id="metadata8696">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title />
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-224.02837,-448.99442)">
+        <path
+             style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8654);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+             d="m 224.52837,466.49442 23,0 0,6 -23,0 z"
+             id="rect8646"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc" />
+        <path
+             style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8128);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+             d="m 224.52837,450.49442 23,0 0,6 -23,0 z"
+             id="rect8118"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc" />
+        <path
+             style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient8134);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+             d="m 224.52837,458.49442 23,0 0,6 -23,0 z"
+             id="rect8132"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_path_level-24.svg b/pixmaps/src/gwy_path_level-24.svg
new file mode 100644
index 0000000..5be1d03
--- /dev/null
+++ b/pixmaps/src/gwy_path_level-24.svg
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24.000002"
+   viewBox="0 0 22.500001 24.000002"
+   id="svg8388"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_path_level-24.svg"
+   inkscape:export-filename="gwy_path_level-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8390" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.478087"
+     inkscape:cx="5.7083881"
+     inkscape:cy="9.5733885"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     width="24px" />
+  <metadata
+     id="metadata8393">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-279.24551,-579.54492)">
+    <g
+       id="g8440">
+      <rect
+         y="580.04492"
+         x="278.99551"
+         height="23.000002"
+         width="22.998253"
+         id="rect8276"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8537"
+         d="m 278.49555,583.03445 h 23.99818"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 278.49556,585.04491 h 23.99998"
+         id="path8539"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8541"
+         d="m 278.49555,591.04491 h 23.99818"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 278.49555,594.04491 h 23.99818"
+         id="path8543"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8545"
+         d="m 278.49555,598.86709 h 23.99818"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.0209229;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 278.49555,599.04491 h 23.99818"
+         id="path8547"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8549"
+         d="m 278.49555,596.04491 h 23.99818"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:4.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 282.16874,600.67781 8.15269,-11.82677"
+         id="path8077"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8551"
+         d="m 282.16874,600.67781 8.15269,-11.82677"
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8079"
+         d="m 286.96181,581.51132 11.82587,8.15331"
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:4.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 286.96181,581.51132 11.82587,8.15331"
+         id="path8553"
+         inkscape:connector-curvature="0" />
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect8081"
+         width="23"
+         height="23.000002"
+         x="278.99551"
+         y="580.04492" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_pointer_measure-24.svg b/pixmaps/src/gwy_pointer_measure-24.svg
new file mode 100644
index 0000000..a68e515
--- /dev/null
+++ b/pixmaps/src/gwy_pointer_measure-24.svg
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8358"
+   version="1.1"
+   inkscape:version="0.92+devel unknown"
+   sodipodi:docname="gwy_pointer_measure-24.svg">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="33.109325"
+     inkscape:cx="12.457097"
+     inkscape:cy="12.450512"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1149"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     inkscape:document-rotation="0">
+    <inkscape:grid
+       visible="true"
+       enabled="true"
+       spacingy="0.5"
+       spacingx="0.5"
+       snapvisiblegridlinesonly="false"
+       dotted="false"
+       originy="0"
+       originx="0"
+       id="grid1px"
+       type="xygrid"
+       units="px"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <defs
+     id="defs8360" />
+  <metadata
+     id="metadata8363">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="matrix(1.066667,0,0,1.066667,-469.81797,-605.93009)"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Layer 1">
+    <path
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.93825197;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+       d="m 443.73316,584.46554 -0.14186,-14.51704 10.01885,10.07675 -4.00482,0.53749 2.81607,6.92264 -1.33664,0.60089 -1.33663,0.6009 -2.8902,-6.88929 z"
+       id="path12872"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <rect
+       y="568.52802"
+       x="456.85593"
+       height="20.641552"
+       width="5.6295137"
+       id="rect12874"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93825275;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path12876"
+       d="m 457.32492,576.03418 h 2.81476"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.93825239;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path12880"
+       d="m 457.32492,573.21942 h 1.87651"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.93825239;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.93825239;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 457.32492,570.40467 h 2.81476"
+       id="path12882"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path12884"
+       d="m 457.32492,584.47845 h 1.87651"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.93825239;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path12890"
+       d="m 457.32492,578.84894 h 1.87651"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.93825239;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.93825239;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 457.32492,581.66369 h 2.81476"
+       id="path12892"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8091"
+       d="m 457.32492,587.29321 h 2.81476"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.93825239;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_poly_distort-24.svg b/pixmaps/src/gwy_poly_distort-24.svg
new file mode 100644
index 0000000..2a8c9fc
--- /dev/null
+++ b/pixmaps/src/gwy_poly_distort-24.svg
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   inkscape:export-ydpi="96"
+   inkscape:export-xdpi="96"
+   inkscape:export-filename="gwy_poly_distort-24.png"
+   sodipodi:docname="gwy_poly_distort-24.svg"
+   inkscape:version="0.92.1 r15371"
+   version="1.1"
+   id="svg2"
+   viewBox="0 0 22.5 22.499999"
+   height="24"
+   width="24">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     inkscape:snap-page="true"
+     inkscape:snap-grids="false"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-smooth-nodes="true"
+     units="px"
+     inkscape:window-maximized="1"
+     inkscape:window-y="27"
+     inkscape:window-x="0"
+     inkscape:window-height="1016"
+     inkscape:window-width="1920"
+     showgrid="true"
+     inkscape:current-layer="layer1"
+     inkscape:document-units="px"
+     inkscape:cy="3.4372696"
+     inkscape:cx="-48.995519"
+     inkscape:zoom="3.8804467"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Calque 2"
+     style="display:inline"
+     transform="translate(0,-1029.8622)" />
+  <g
+     inkscape:label="Calque 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="display:inline"
+     transform="translate(0,-1029.8622)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.9375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect10106"
+       width="15.9375"
+       height="15.9375"
+       x="0.46875"
+       y="1030.3309" />
+    <g
+       id="g8808"
+       transform="translate(3.2811935,1.4006995)">
+      <path
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#e8f0e0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93749998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         d="m -1.8745963,1032.5438 5.8943054,1.0649 h 5.4251526 l 5.5194373,-1.0649 0.29305,6.1544 1.293469,6.7086 2.29312,5.2434 -5.519438,-1.0649 H 6.5500914 l -4.5450486,1.0649 -0.292796,-5.2434 -1.29346805,-6.7086 z"
+         id="path8708"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccccccccc" />
+      <path
+         style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.9375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 4.0197091,1033.6087 1.3241395,5.6219 1.293468,5.6438 -0.087225,4.7109"
+         id="path8710"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc" />
+      <path
+         style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.9375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 9.4448617,1033.6087 0.7931353,5.6219 1.293468,5.6438 1.793038,4.7109"
+         id="path8712"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc" />
+      <path
+         style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.9375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 0.41877875,1038.6981 4.92506985,0.5325 h 4.8941454 l 5.019355,-0.5325"
+         id="path8714"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc" />
+      <path
+         style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.9375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 1.7122468,1045.4068 4.9250699,-0.5324 h 4.8941463 l 5.019355,0.5324"
+         id="path8716"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc" />
+    </g>
+    <g
+       id="layer2-6"
+       inkscape:label="Calque 2"
+       style="display:inline"
+       transform="translate(-39.574754,1.3029)" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_polynom-24.svg b/pixmaps/src/gwy_polynom-24.svg
new file mode 100644
index 0000000..73be421
--- /dev/null
+++ b/pixmaps/src/gwy_polynom-24.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   sodipodi:docname="gwy_polynom-24.svg"
+   inkscape:version="0.92.1 r15371"
+   version="1.1"
+   id="svg8237"
+   viewBox="0 0 24 24"
+   height="24"
+   width="24">
+  <sodipodi:namedview
+     inkscape:lockguides="true"
+     inkscape:window-maximized="1"
+     inkscape:window-y="27"
+     inkscape:window-x="0"
+     inkscape:window-height="1016"
+     inkscape:window-width="1920"
+     showgrid="false"
+     inkscape:current-layer="layer1"
+     inkscape:document-units="px"
+     inkscape:cy="27.208387"
+     inkscape:cx="-30.92511"
+     inkscape:zoom="3.8087814"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base" />
+  <defs
+     id="defs8239">
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8458"
+       x="-0.12856513"
+       width="1.2571303"
+       y="-0.11250482"
+       height="1.2250096">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.16275744"
+         id="feGaussianBlur8460" />
+    </filter>
+  </defs>
+  <metadata
+     id="metadata8242">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-287.14218,-445.53613)">
+    <g
+       id="g4873">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4816"
+         d="m 309.69736,446.03622 a 0.95817095,0.95763568 0 0 0 -0.94872,0.7537 c -0.8404,3.60655 -1.68173,8.6657 -3.3383,11.58399 a 0.95817095,0.95763568 0 0 0 -0.002,0 c -0.30908,0.54573 -0.75586,1.10226 -1.21819,1.43257 -0.45859,0.32764 -0.86063,0.44639 -1.35664,0.32168 -0.7784,-0.22656 -1.84149,-1.55881 -2.89294,-3.12884 -1.05514,-1.57554 -2.0981,-3.38587 -3.97451,-3.91432 a 0.95817095,0.95763568 0 0 0 -0.0187,-0.006 c -1.11086,-0.28742 -2.17838,0.0571 -2.96217,0.61717 -0.78379,0.560 [...]
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:nor [...]
+      <path
+         style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+         d="m 243.33968,605.23583 c 5.57893,-0.8151 11.50211,-2.74558 15.02129,-0.48276 -5.29889,-1.23284 -10.53031,0.12015 -14.71362,1.41074 -0.47884,-0.33105 -0.55321,-0.4436 -0.30767,-0.92798 z"
+         id="path8135"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc"
+         transform="matrix(0.38844941,-0.91797626,0.91020273,0.3827058,-357.24681,459.81503)" />
+      <path
+         transform="matrix(-0.38844941,0.91797626,-0.91020273,-0.3827058,955.60982,455.28343)"
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="path4868"
+         d="m 243.33968,605.23583 c 5.57893,-0.8151 6.34564,-1.15156 11.28527,-0.74459 -5.5372,0.30074 -6.8671,0.86416 -11.18356,1.6485 -0.47884,-0.33105 -0.34725,-0.41953 -0.10171,-0.90391 z"
+         style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_polynom_level-24.svg b/pixmaps/src/gwy_polynom_level-24.svg
new file mode 100644
index 0000000..adf4f2d
--- /dev/null
+++ b/pixmaps/src/gwy_polynom_level-24.svg
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8237"
+     version="1.1"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_polynom_level-24.svg">
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="35.193865"
+         inkscape:cx="12.000006"
+         inkscape:cy="11.999998"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:document-rotation="0"
+         showguides="true"
+         inkscape:guide-bbox="true">
+        <inkscape:grid
+             empspacing="2"
+             spacingy="0.49999999"
+             spacingx="0.49999999"
+             units="px"
+             id="grid4296"
+             type="xygrid" />
+    </sodipodi:namedview>
+    <defs
+         id="defs8239" />
+    <metadata
+         id="metadata8242">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title />
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="matrix(1.066667,0,0,1.066667,-306.28499,-476.83854)">
+        <image
+             y="447.50473"
+             x="287.61084"
+             width="21.562504"
+             height="21.562504"
+             preserveAspectRatio="none"
+             xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAACZhJREFU
+aIGNWluS4zquTDxkV3dXna3Mgu6m7nK7SyQwHwBISHafGEWwJMuylAkkHqSK/vN//+90KEgVpAL9
+OKAPhTwEcij4EMjBYBGQEFgYxATi2IMAgECEtbnHH3cHHHB3uPnaw2JvZnHe2vfT4nf93LrfekLu
+CernGU/MMSxuYlNh0yBTYEPAh4GFg4BsAkQJvjNAe2DuPe9/AbvAvyFi7Xovq9TO02gO9e9zE8oL
+B9rNpkOOPFaGC4OEQWxgZoA3gTcc0jDphRdgfgWe5/AG/ALevOAA1McI67WHE4DZH+oONocYw0VA
+6mAmuHjzAsGp3cD3/e5Sgr8Bn9es7xxX8MsD3nAS1MdMAoTOggBYl1xawA1gd0AY5N6kVF64umE9
+8CKpuI97u/cy2FZCu8sL+Pqsdv4BF4E15gJjgwDMza25kpxAknsKTfrfpNRIbGl5I4g329uTPYah
+8/wNlgNgBngCTIARYBM+aanBuDmJwj8MBmCAU/yOaT/gJS1dY+KK5y9A/4dN5/gNHg8Ic5IwgCw9
+YAAT3B02rGk99O4EgDitQYA5iBBeuIH6N4gEgpNfLBvHt2BC+z43tvEHNr4Bs+vwSm91rnL3Ld21
+4NtJwuH/jniBoJZAViiCdlajfc09vgBAbX4jxgCLLPAwAzFftLqKUMsUtEjkA/0KsGP2Knru8Cx+
+vnJ6cwCVGVLC7uH5deZC4IRbDPhjgYdv8Nf0dj23c2d3bz7mZjEq74RoGhyHE/an8khdw0kiz+RP
+goDbgM0Jt7mt/yILj1u/SxjlZuz9tbB1EtvyO3UCtDMtyABwfm+d8HauO9aP1G3CPQi4O6jl7QX3
+pucFKUVKHTmXft/plvZ9ew3ooLHPOSdOK/BlgO35IGATXpXlpYi823aQUYLuFbmOUbLoVd5TBh5k
+VvLxG7lGBJzXW52sHOdQdws3rRL4Hu/aEwGc2bOOkwhxG9QySd86OE/gVP3P7RpDeLS60/SIe3rD
+CbqECP9LQdkB2a27AWdzl212b/BWiiwWWcXDC5nBEjgRRdrOepKlPo5LYpfeJqJCu1xWilq5uQEg
+bPAJnJnBTOC0+p4r/N0DDkpsYUGQbyLECT4fba2eJfgK9KKg9YR6YIvQBr4Br7mA5HFaf4GXf58n
+UKJwz3rggFsSMYdTDrOth/JAHjsjrgVB07QAMQiMCtD7KKkwc5vYMLhmaXncJzq9mnZt9wJInoAr
+sSyZXHLpNTwbCV16pqvFXwl0oH1IO9cIcCNw21ZbXfOAlJFR6p5SJ1RELHhQGwjCCmIQCYhk5fFL
+RinwmiCVQTlYcq/NKy0TvRYz34XLHc5JgnLSVPKBwS4e2BHsywJxWyUW1ADzyuth+ehQ6SIZvpBh
+ZYjKq4T4TR3Iql6TF7JGwhzWADPVJ1qR7J59EhMw45ZKVAQ0wXMb8ZlVwCoQ5VilSNBxThYhunlg
+VeFOoPdVnGkyZcMwODGcPGuWRVx6kCLPuQch2m8ClEUDPGtrA/bSSbc0HwlWBXwwpH9WXnHCTGAi
+SGvQUkCR1t0xa1pJtjMPATbT7k7hCRjMaXekWdiqO1ViRZBIuTTLh/W3tZfFD1mgwyOxZiTCOJig
+RBDOnNai2HwTGO6Y5BjM8BkEjBCA11zPMt3GqGmsU1bv8MAB4qOB30RI0uqHQGqBKwFLniuvPIVx
+cBLgbf1VhH17YHqsP012nOY4yTFnwDYH2MPq5AR2glnNBH0psrKqEh9geWwPpJbBYfkCG0R0Aa9z
+egiewvhI6xcBpvLA7hHLA9Mdg8ILTA6C4xvATNuvjOkeRS7n6VUcV0lwQFkeYNFYJnljfXkz+BHg
+j0PwQwUfQngK4yEMpSJQZSX0W01uWX+k9YOAgYjxJ0mUZCKjOcg68Gt3q6xNPmV9SWs/NthYK937
+4xD8OgQ/hPGxJBQeECoCN/0DmAl+dPDgyP1OML+CLqvvQrvBwwEVeYJEErwALCDmZnG9gdcF/pcK
+fmjI5ymEg3npn4l69lzyKfBnA48GfrrhfNOWr+aypWN3h7I+Uj6yi1aBbavUcazQR4D/OgQ/lfFD
+BU8hPPjqAWoesApeC92f5GDa4B0MBzDdMJ0wUjqrC+4N1ZoARS3R0j6VB0QW2D22dD4T/K9OgGlJ
+SHoG+ov1hTwlVvOq8MBgwrD4vVOz/mXz1UfBPFuJBE7CWyoJXB+S7wsUv5LAZycgnAEcEmJCeOAi
+nxa8zfqe6XJ6AC/5CRFGGn3jT+CO1QSaORQNfFhfllS0eeHjEHw9bgRaAD9W/t8B7Nm8GbDAn2Q5
+HzUYCAbGdMfJBLH0YDWRN8NXD7VImEG7dFgT/PMqoeMRsvnsHtDwwFMZT6aVQjkDuAfvdEATPFGt
+p3J6xjD4av0X0axF4Zwbm8WbnOlQUon2WATyfKd9xdch+Kr9IsBZA0o+mf9v1dfgmBb654m16maw
+JZ2TwnMF/pIpvZPYL13cHDYNuvSvIRl96trLU/Hz0cFr8wDjI4tYZSBpBQxd++QQB9BS5sygldb4
+ccv75cEVsL5BuxlsxtDQf+q9PPAs6Sj+SavfJRQZiPHk8MDWP23rZ9d5UrzhqV5/umN6WL4avzUz
+fEk43fLxLs2GxThneKDko8+m/2eCf+zU2YP45ypgfOl/+ma+Ky7nmqG5YTDjNF8eY+w5e2WtC/C0
+vBX4abAx4dMiBu6Bq0/FjyUdvQCvUS3EI9eC1ry6BR75G/CZLnvA083sVpXWmuWnwYfB5oSNiXlO
++JwhoZJM98BXs/rXIfhsnvipjJ8q0Fyl6OCreQMQ74HdoQAsq6wyQSyA800y3uYL6z1xBm1Z3YZh
+nknIDMqHvEjn10Pwz0Pxz2Prf2Wfo8BLLmy9Wr/A9P3hnlU2W+1be2OIN6MzJzuWqTKCNYEPwzwn
+7BzAnMCc0Mo28jxWBnoHvDLPLxWIxHhH4A7cbL+aWprv/ZnvgDePFtua1b0CdkzYGWNLakK1gCeR
+z6b7S+XV2KvqBXwRuFvfLF+EVzx0zaMVujVLy2pdAZtjpt5jjCSwh0bbEP8foatovabNz2Nb/m/W
+v8unW58oi9y6Zi06Y2S2Os3xXQRGHxPzO4andDBmeaAkpPh8yEU+ve85dFv/TqAHb4HvwPc1O9NE
+++zRYpvjNMO3OcaSTchlngV+ROpcYwBjQHv78HXc24UI2g+9Wr8I3AH2f03ontgEA/rscwNP8NPx
+Jy0/L+DHGhgDPgd85DgHtNqGn3fNNxLvwNe4p84O/F1w92WVYY5zOv5Mx+9p+D3fgx9/RrP8vBD4
+L+GEx5H65TK+AAAAAElFTkSuQmCC
+"
+             id="image4312" />
+        <rect
+             y="447.50473"
+             x="287.61084"
+             height="21.562519"
+             width="21.562502"
+             id="rect4298"
+             style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    </g>
+</svg>
diff --git a/pixmaps/gwy_presentation-24.xcf b/pixmaps/src/gwy_presentation-24.xcf
similarity index 100%
rename from pixmaps/gwy_presentation-24.xcf
rename to pixmaps/src/gwy_presentation-24.xcf
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_attach-24.png b/pixmaps/src/gwy_presentation_attach-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_attach-24.png
rename to pixmaps/src/gwy_presentation_attach-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_edge_canny-24.png b/pixmaps/src/gwy_presentation_edge_canny-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_edge_canny-24.png
rename to pixmaps/src/gwy_presentation_edge_canny-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_edge_harris_corner-24.png b/pixmaps/src/gwy_presentation_edge_harris_corner-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_edge_harris_corner-24.png
rename to pixmaps/src/gwy_presentation_edge_harris_corner-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_edge_hough-24.png b/pixmaps/src/gwy_presentation_edge_hough-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_edge_hough-24.png
rename to pixmaps/src/gwy_presentation_edge_hough-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_edge_inclination-24.png b/pixmaps/src/gwy_presentation_edge_inclination-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_edge_inclination-24.png
rename to pixmaps/src/gwy_presentation_edge_inclination-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_edge_laplace_gauss-24.png b/pixmaps/src/gwy_presentation_edge_laplace_gauss-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_edge_laplace_gauss-24.png
rename to pixmaps/src/gwy_presentation_edge_laplace_gauss-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_edge_local_non_linearity-24.png b/pixmaps/src/gwy_presentation_edge_local_non_linearity-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_edge_local_non_linearity-24.png
rename to pixmaps/src/gwy_presentation_edge_local_non_linearity-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_edge_prewitt-24.png b/pixmaps/src/gwy_presentation_edge_prewitt-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_edge_prewitt-24.png
rename to pixmaps/src/gwy_presentation_edge_prewitt-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_edge_rms-24.png b/pixmaps/src/gwy_presentation_edge_rms-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_edge_rms-24.png
rename to pixmaps/src/gwy_presentation_edge_rms-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_edge_rms_edge-24.png b/pixmaps/src/gwy_presentation_edge_rms_edge-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_edge_rms_edge-24.png
rename to pixmaps/src/gwy_presentation_edge_rms_edge-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_edge_sobel-24.png b/pixmaps/src/gwy_presentation_edge_sobel-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_edge_sobel-24.png
rename to pixmaps/src/gwy_presentation_edge_sobel-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_edge_step-24.png b/pixmaps/src/gwy_presentation_edge_step-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_edge_step-24.png
rename to pixmaps/src/gwy_presentation_edge_step-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_edge_zero_crossing-24.png b/pixmaps/src/gwy_presentation_edge_zero_crossing-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_edge_zero_crossing-24.png
rename to pixmaps/src/gwy_presentation_edge_zero_crossing-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_extract-24.png b/pixmaps/src/gwy_presentation_extract-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_extract-24.png
rename to pixmaps/src/gwy_presentation_extract-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_local_contrast-24.png b/pixmaps/src/gwy_presentation_local_contrast-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_local_contrast-24.png
rename to pixmaps/src/gwy_presentation_local_contrast-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_log-24.png b/pixmaps/src/gwy_presentation_log-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_log-24.png
rename to pixmaps/src/gwy_presentation_log-24.png
diff --git a/pixmaps/gwy_presentation_ops-24.xcf b/pixmaps/src/gwy_presentation_ops-24.xcf
similarity index 100%
rename from pixmaps/gwy_presentation_ops-24.xcf
rename to pixmaps/src/gwy_presentation_ops-24.xcf
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_rank-24.png b/pixmaps/src/gwy_presentation_rank-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_rank-24.png
rename to pixmaps/src/gwy_presentation_rank-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_remove-24.png b/pixmaps/src/gwy_presentation_remove-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_remove-24.png
rename to pixmaps/src/gwy_presentation_remove-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_sem-24.png b/pixmaps/src/gwy_presentation_sem-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_sem-24.png
rename to pixmaps/src/gwy_presentation_sem-24.png
diff --git a/devel-docs/libgwydgets/html/gwy_presentation_shading-24.png b/pixmaps/src/gwy_presentation_shading-24.png
similarity index 100%
rename from devel-docs/libgwydgets/html/gwy_presentation_shading-24.png
rename to pixmaps/src/gwy_presentation_shading-24.png
diff --git a/pixmaps/src/gwy_previous-24.svg b/pixmaps/src/gwy_previous-24.svg
new file mode 100644
index 0000000..ac5e302
--- /dev/null
+++ b/pixmaps/src/gwy_previous-24.svg
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_prev-24.svg"
+   inkscape:export-filename="gwy_flip_horizontally-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8095">
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8458"
+       x="-0.12856513"
+       width="1.2571303"
+       y="-0.11250482"
+       height="1.2250096">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.16275744"
+         id="feGaussianBlur8460" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="18.852899"
+     inkscape:cx="14.249947"
+     inkscape:cy="13.431599"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77811,-595.10722)">
+    <path
+       style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 267.27811,600.10722 -9.5,7 9.5,7 z"
+       id="path4758"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       sodipodi:nodetypes="cccc"
+       inkscape:connector-curvature="0"
+       id="path4760"
+       d="m 256.27811,600.10722 -9.5,7 9.5,7 z"
+       style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0"
+       id="path4764"
+       d="m 258.2781,602.10722 6.89043,4.97067 c -5.19189,-0.85522 -7.0341,-0.30891 -6.89043,-4.97067 z"
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter8458)"
+       transform="matrix(-1,0,0,1,513.55622,0)" />
+    <path
+       transform="matrix(-1,0,0,1,524.55622,0)"
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 258.2781,602.10722 6.89043,4.97067 c -5.14769,-1.69485 -7.0341,-0.30891 -6.89043,-4.97067 z"
+       id="path8437"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_profile-24.svg b/pixmaps/src/gwy_profile-24.svg
new file mode 100644
index 0000000..78ee316
--- /dev/null
+++ b/pixmaps/src/gwy_profile-24.svg
@@ -0,0 +1,486 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8236"
+   version="1.1"
+   inkscape:version="0.92+devel unknown"
+   sodipodi:docname="gwy_profile-24.svg"
+   inkscape:export-filename="gwy_profile-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8238">
+    <linearGradient
+       gradientTransform="translate(260.25538,1122.4537)"
+       xlink:href="#linearGradient4140"
+       id="linearGradient4171"
+       gradientUnits="userSpaceOnUse"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       id="linearGradient4140">
+      <stop
+         style="stop-color:#d7e3f4;stop-opacity:1;"
+         offset="0"
+         id="stop4142" />
+      <stop
+         style="stop-color:#f1f5fb;stop-opacity:1"
+         offset="1"
+         id="stop4144" />
+    </linearGradient>
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(217.48376,1121.6073)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient8503"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(233.05017,1130.098)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient11272"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient9134"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(192.80845,1127.6291)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="40.291226"
+     inkscape:cx="12.000015"
+     inkscape:cy="11.292801"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1149"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     showguides="false"
+     inkscape:object-nodes="true"
+     inkscape:snap-page="true"
+     inkscape:document-rotation="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid1px"
+       originx="0"
+       originy="0"
+       dotted="false"
+       snapvisiblegridlinesonly="false"
+       spacingx="1.0"
+       spacingy="1.0"
+       enabled="true"
+       visible="true"
+       units="px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata8241">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-426.47382,-666.73134)">
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385"
+       y="1012.5226"
+       x="261.62512">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487"
+       y="1108.3988"
+       x="285.7551">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536"
+       y="1047.8113"
+       x="220.32239">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6"
+       style="opacity:1;fill:url(#linearGradient4171);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318"
+       transform="translate(181.14178,847.13776)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386"
+       transform="translate(728.36302,318.93978)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162"
+       transform="translate(33.72085,162.17789)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="581.88934"
+       y="1236.4619"
+       id="text8015"><tspan
+         id="tspan8017"
+         x="581.88934"
+         y="1236.4619" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-991.21216"
+       y="-90.602974"
+       id="text9295"><tspan
+         id="tspan9297"
+         x="-991.21216"
+         y="-90.602974" /></text>
+    <text
+       id="text7408-2"
+       class="fil7 fnt4"
+       y="191.27887"
+       x="-873.99939"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422"
+       class="fil7 fnt4"
+       y="218.74548"
+       x="-857.62646"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-9"
+       y="1011.6762"
+       x="218.8535">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-0"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-9"
+       y="1107.5524"
+       x="242.98347">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-1"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7"
+       y="1046.9648"
+       x="177.55077">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-7"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-1"
+       style="opacity:1;fill:url(#linearGradient8503);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-7"
+       transform="translate(138.37018,846.29135)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-6"
+       transform="translate(685.59143,318.09337)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7"
+       transform="translate(-9.05075,161.33148)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="539.11774"
+       y="1235.6155"
+       id="text8015-3"><tspan
+         id="tspan8017-6"
+         x="539.11774"
+         y="1235.6155" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1033.9838"
+       y="-91.449348"
+       id="text9295-5"><tspan
+         id="tspan9297-6"
+         x="-1033.9838"
+         y="-91.449348" /></text>
+    <text
+       id="text7408-2-3"
+       class="fil7 fnt4"
+       y="190.43246"
+       x="-916.771"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-9"
+       class="fil7 fnt4"
+       y="217.89908"
+       x="-900.39807"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-7"
+       y="1020.1669"
+       x="234.41991">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-2"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-3"
+       y="1116.0431"
+       x="258.5499">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-7"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-2"
+       y="1055.4556"
+       x="193.11717">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-5"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-3"
+       style="opacity:1;fill:url(#linearGradient11272);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-3"
+       transform="translate(153.93658,854.78207)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-64"
+       transform="translate(701.15782,326.58409)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-03"
+       transform="translate(6.51565,169.8222)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="554.68414"
+       y="1244.1062"
+       id="text8015-5"><tspan
+         id="tspan8017-85"
+         x="554.68414"
+         y="1244.1062" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1018.4174"
+       y="-82.958626"
+       id="text9295-0"><tspan
+         id="tspan9297-9"
+         x="-1018.4174"
+         y="-82.958626" /></text>
+    <text
+       id="text7408-2-9"
+       class="fil7 fnt4"
+       y="198.92319"
+       x="-901.20459"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-8"
+       class="fil7 fnt4"
+       y="226.3898"
+       x="-884.83167"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-2"
+       y="1017.698"
+       x="194.17818">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-6"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-5"
+       y="1113.5741"
+       x="218.30815">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-8"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7-2"
+       y="1052.9866"
+       x="152.87544">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-9"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-6"
+       style="opacity:1;fill:url(#linearGradient9134);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-4"
+       transform="translate(113.69488,852.31312)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-8"
+       transform="translate(660.91612,324.11514)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7-4"
+       transform="translate(-33.72606,167.35324)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="514.44244"
+       y="1241.6372"
+       id="text8015-0"><tspan
+         id="tspan8017-8"
+         x="514.44244"
+         y="1241.6372" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1058.6591"
+       y="-85.427559"
+       id="text9295-6-9"><tspan
+         id="tspan9297-2"
+         x="-1058.6591"
+         y="-85.427559" /></text>
+    <text
+       id="text7408-2-4"
+       class="fil7 fnt4"
+       y="196.45425"
+       x="-941.44629"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-7"
+       class="fil7 fnt4"
+       y="223.92087"
+       x="-925.07336"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <path
+       style="opacity:1;fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 427.34882,683.85634 c 0,0 3.375,-1.125 3.875,-1.625 0.5,-0.5 2.5,-3.375 2.5,-3.375 l 0.25,-2.375 v -4.25 l 4,-3 4,1 0.5,4.5 0.875,3.5 5.25,1.875"
+       id="path8210-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cscccccccc" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path9302"
+       d="m 426.47384,687.73133 h 6"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.99999332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.99999332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 429.47383,684.73132 v 6"
+       id="path9308"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.99999332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 444.47383,684.73135 h 6"
+       id="path9232"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path9234"
+       d="m 447.47382,681.73134 v 6"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.99999332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 433.97382,686.98134 4.5,-0.75 4.5,-0.75"
+       id="path9236"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_pygwy-24.svg b/pixmaps/src/gwy_pygwy-24.svg
new file mode 100644
index 0000000..92faffc
--- /dev/null
+++ b/pixmaps/src/gwy_pygwy-24.svg
@@ -0,0 +1,276 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg2"
+     version="1.1"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_pygwy-24.svg"
+     inkscape:export-filename="gwy_tilt-24.png"
+     inkscape:export-xdpi="96"
+     inkscape:export-ydpi="96">
+    <defs
+         id="defs4">
+        <linearGradient
+             id="linearGradient8428"
+             osb:paint="solid">
+            <stop
+                 style="stop-color:#4696db;stop-opacity:1;"
+                 offset="0"
+                 id="stop8430" />
+        </linearGradient>
+        <linearGradient
+             id="linearGradient2795">
+            <stop
+                 id="stop2797"
+                 offset="0"
+                 style="stop-color:#b8b8b8;stop-opacity:0.49803922;" />
+            <stop
+                 id="stop2799"
+                 offset="1"
+                 style="stop-color:#7f7f7f;stop-opacity:0;" />
+        </linearGradient>
+        <linearGradient
+             id="linearGradient2787">
+            <stop
+                 id="stop2789"
+                 offset="0"
+                 style="stop-color:#7f7f7f;stop-opacity:0.5;" />
+            <stop
+                 id="stop2791"
+                 offset="1"
+                 style="stop-color:#7f7f7f;stop-opacity:0;" />
+        </linearGradient>
+        <linearGradient
+             id="linearGradient3676">
+            <stop
+                 id="stop3678"
+                 offset="0"
+                 style="stop-color:#b2b2b2;stop-opacity:0.5;" />
+            <stop
+                 id="stop3680"
+                 offset="1"
+                 style="stop-color:#b3b3b3;stop-opacity:0;" />
+        </linearGradient>
+        <linearGradient
+             id="linearGradient3236">
+            <stop
+                 id="stop3244"
+                 offset="0"
+                 style="stop-color:#f4f4f4;stop-opacity:1" />
+            <stop
+                 id="stop3240"
+                 offset="1"
+                 style="stop-color:white;stop-opacity:1" />
+        </linearGradient>
+        <linearGradient
+             id="linearGradient4671">
+            <stop
+                 id="stop4673"
+                 offset="0"
+                 style="stop-color:#ffd43b;stop-opacity:1;" />
+            <stop
+                 id="stop4675"
+                 offset="1"
+                 style="stop-color:#ffe873;stop-opacity:1" />
+        </linearGradient>
+        <linearGradient
+             id="linearGradient4689">
+            <stop
+                 id="stop4691"
+                 offset="0"
+                 style="stop-color:#5a9fd4;stop-opacity:1;" />
+            <stop
+                 id="stop4693"
+                 offset="1"
+                 style="stop-color:#306998;stop-opacity:1;" />
+        </linearGradient>
+        <linearGradient
+             gradientTransform="translate(100.2702,99.61116)"
+             gradientUnits="userSpaceOnUse"
+             xlink:href="#linearGradient4671"
+             id="linearGradient2987"
+             y2="144.75717"
+             x2="-65.308502"
+             y1="144.75717"
+             x1="224.23996" />
+        <linearGradient
+             gradientTransform="translate(100.2702,99.61116)"
+             gradientUnits="userSpaceOnUse"
+             xlink:href="#linearGradient4689"
+             id="linearGradient2990"
+             y2="76.313133"
+             x2="26.670298"
+             y1="77.475983"
+             x1="172.94208" />
+        <linearGradient
+             y2="144.75717"
+             x2="-65.308502"
+             y1="144.75717"
+             x1="224.23996"
+             gradientTransform="matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)"
+             gradientUnits="userSpaceOnUse"
+             id="linearGradient2255"
+             xlink:href="#linearGradient4671"
+             inkscape:collect="always" />
+        <linearGradient
+             y2="76.313133"
+             x2="26.670298"
+             y1="76.176224"
+             x1="172.94208"
+             gradientTransform="matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)"
+             gradientUnits="userSpaceOnUse"
+             id="linearGradient2258"
+             xlink:href="#linearGradient4689"
+             inkscape:collect="always" />
+        <radialGradient
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1,0,0,0.177966,0,108.7434)"
+             r="29.036913"
+             fy="132.28575"
+             fx="61.518883"
+             cy="132.28575"
+             cx="61.518883"
+             id="radialGradient2801"
+             xlink:href="#linearGradient2795"
+             inkscape:collect="always" />
+        <linearGradient
+             y2="137.27299"
+             x2="112.03144"
+             y1="192.35176"
+             x1="150.96111"
+             gradientTransform="matrix(0.57878139,0,0,0.567972,110.85845,458.83183)"
+             gradientUnits="userSpaceOnUse"
+             id="linearGradient1475"
+             xlink:href="#linearGradient4671"
+             inkscape:collect="always" />
+        <linearGradient
+             y2="114.39767"
+             x2="135.66525"
+             y1="20.603781"
+             x1="26.648937"
+             gradientTransform="matrix(0.57878139,0,0,0.567972,110.85845,458.83183)"
+             gradientUnits="userSpaceOnUse"
+             id="linearGradient1478"
+             xlink:href="#linearGradient4689"
+             inkscape:collect="always" />
+    </defs>
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="32.891769"
+         inkscape:cx="10.996263"
+         inkscape:cy="6.2488068"
+         inkscape:document-units="px"
+         inkscape:current-layer="g8625"
+         showgrid="true"
+         inkscape:object-nodes="true"
+         inkscape:snap-smooth-nodes="true"
+         inkscape:window-width="1773"
+         inkscape:window-height="1023"
+         inkscape:window-x="137"
+         inkscape:window-y="33"
+         inkscape:window-maximized="0"
+         inkscape:snap-global="true"
+         showguides="true"
+         units="px"
+         inkscape:snap-object-midpoints="true"
+         inkscape:object-paths="false"
+         inkscape:snap-grids="true"
+         inkscape:snap-intersection-paths="true"
+         inkscape:document-rotation="0">
+        <inkscape:grid
+             type="xygrid"
+             id="grid1px"
+             originx="0"
+             originy="0"
+             dotted="false"
+             snapvisiblegridlinesonly="false"
+             spacingx="0.5"
+             spacingy="0.5"
+             enabled="true"
+             visible="true"
+             units="px"
+             empspacing="2" />
+    </sodipodi:namedview>
+    <metadata
+         id="metadata7">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-360.04032,-520.36218)">
+        <g
+             id="g8618"
+             transform="matrix(0.97194034,0,0,1,10.715714,0.03393)"
+             style="stroke-width:1.01433218">
+            <g
+                 id="g8625"
+                 transform="translate(-0.58662158)">
+                <g
+                     id="g8814"
+                     transform="matrix(0.17094832,0,0,0.17482069,303.29323,425.48409)"
+                     style="stroke-width:5.86747646;stroke:none" />
+                <g
+                     transform="matrix(1.0288697,0,0,1,117.35601,51.336807)"
+                     id="layer1-9"
+                     inkscape:label="Layer 1" />
+                <g
+                     id="g4484"
+                     transform="matrix(0.16306354,0,0,0.16306354,342.42569,443.9631)">
+                    <path
+                         id="path1948"
+                         d="m 182.78664,470.53512 c -4.71599,0.0213 -9.21964,0.41222 -13.1824,1.09375 -11.67377,2.00451 -13.79328,6.20011 -13.79328,13.9375 v 10.21875 h 27.58657 v 3.40625 h -27.58657 -10.353 c -8.01743,0 -15.03771,4.68372 -17.23357,13.59375 -2.53289,10.21297 -2.64524,16.58603 0,27.25 1.96095,7.93786 6.64397,13.59375 14.66139,13.59375 h 9.4849 v -12.25 c 0,-8.8499 7.8782,-16.65625 17.23356,-16.65625 h 27.55442 c 7.67017,0 13.79329,-6.13816 13.79328,-13.625 v -25.53125 c 0 [...]
+                         style="fill:url(#linearGradient1478);fill-opacity:1;stroke-width:1.02886975"
+                         inkscape:connector-curvature="0" />
+                    <path
+                         id="path1950"
+                         d="m 214.39223,499.19137 v 11.90625 c 0,9.23076 -8.05183,17 -17.23357,17 h -27.55442 c -7.54761,0 -13.79328,6.27849 -13.79328,13.625 v 25.53125 c 0,7.26634 6.501,11.54032 13.79328,13.625 8.73236,2.49561 17.10623,2.94663 27.55442,0 6.94503,-1.95439 13.79329,-5.88761 13.79328,-13.625 v -10.21875 h -27.55441 v -3.40625 h 27.55441 13.79329 c 8.01743,0 11.00505,-5.4354 13.79328,-13.59375 2.88014,-8.39888 2.75759,-16.47577 0,-27.25 -1.98138,-7.75744 -5.76566,-13.59375  [...]
+                         style="fill:url(#linearGradient1475);fill-opacity:1;stroke-width:1.02886975"
+                         inkscape:connector-curvature="0" />
+                </g>
+                <path
+                     style="color:#000000;overflow:visible;vector-effect:none;fill:none;stroke:#000000;stroke-width:1.01433218;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
+                     d="m 362.56831,539.82825 2.05774,2 -2.05774,2"
+                     id="path4617"
+                     inkscape:connector-curvature="0" />
+                <path
+                     inkscape:connector-curvature="0"
+                     id="path4619"
+                     d="m 366.68379,539.82825 2.05774,2 -2.05774,2"
+                     style="color:#000000;overflow:visible;vector-effect:none;fill:none;stroke:#000000;stroke-width:1.01433218;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke" />
+                <path
+                     style="color:#000000;overflow:visible;vector-effect:none;fill:none;stroke:#000000;stroke-width:1.01433218;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
+                     d="m 370.79927,539.82825 2.05774,2 -2.05774,2"
+                     id="path4621"
+                     inkscape:connector-curvature="0" />
+            </g>
+        </g>
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_remove_under_mask-24.svg b/pixmaps/src/gwy_remove_under_mask-24.svg
new file mode 100644
index 0000000..8b7036e
--- /dev/null
+++ b/pixmaps/src/gwy_remove_under_mask-24.svg
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9100"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_remove_under_mask-24.svg">
+  <defs
+     id="defs9102" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="23.653685"
+     inkscape:cx="-23.829314"
+     inkscape:cy="30.153844"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9105">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-442.76529,-683.29364)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect11370-6"
+       width="23.000002"
+       height="23.000002"
+       x="443.26529"
+       y="683.79364" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#daa39c;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.00000018, 3.00000017999999979;stroke-dashoffset:1.50000012;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate;font-variant-east_asian:normal;vector-effect:none"
+       d="M 2.5 2.5 L 2.5 13.5 L 10.5 13.5 L 10.5 21.5 L 21.5 21.5 L 21.5 10.5 L 13.5 10.5 L 13.5 2.5 L 2.5 2.5 z "
+       transform="translate(442.76529,683.29364)"
+       id="rect11972" />
+    <g
+       id="g8437"
+       transform="matrix(1.5,0,0,1.5,-104.3997,-90.510326)"
+       style="stroke:#db2424;stroke-opacity:1">
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 373.44052,524.5011 4.02276,4.02277"
+         id="path8433"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8435"
+         d="m 373.44052,528.52387 4.02276,-4.02277"
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <g
+       style="stroke:#db2424;stroke-opacity:1"
+       transform="matrix(1.5,0,0,1.5,-112.3997,-98.510326)"
+       id="g8083">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8085"
+         d="m 373.44052,524.5011 4.02276,4.02277"
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 373.44052,528.52387 4.02276,-4.02277"
+         id="path8087"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_rotate-24.svg b/pixmaps/src/gwy_rotate-24.svg
new file mode 100644
index 0000000..1e6f998
--- /dev/null
+++ b/pixmaps/src/gwy_rotate-24.svg
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   id="svg2160"
+   sodipodi:version="0.32"
+   inkscape:version="0.92+devel unknown"
+   sodipodi:docname="gwy_rotate-24.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.1"
+   inkscape:export-filename="gwy_rotate-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs2162">
+    <filter
+       height="1.2250096"
+       y="-0.11250482"
+       width="1.2571303"
+       x="-0.12856513"
+       id="filter8458"
+       style="color-interpolation-filters:sRGB"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur8460"
+         stdDeviation="0.16275744"
+         inkscape:collect="always" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="37.935234"
+     inkscape:cx="11.803119"
+     inkscape:cy="11.822799"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1149"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true"
+     inkscape:document-rotation="0"
+     inkscape:snap-object-midpoints="true"
+     inkscape:snap-center="true"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:snap-midpoints="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid1px"
+       originx="0"
+       originy="0"
+       dotted="false"
+       snapvisiblegridlinesonly="false"
+       spacingx="0.5"
+       spacingy="0.5"
+       enabled="true"
+       visible="true"
+       units="px"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2165">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-8)">
+    <path
+       style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000005;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
+       id="path4517"
+       sodipodi:type="arc"
+       sodipodi:cx="0.50000024"
+       sodipodi:cy="31.5"
+       sodipodi:rx="10.07766"
+       sodipodi:ry="10.07766"
+       sodipodi:start="5.0304664"
+       sodipodi:end="6.0593202"
+       sodipodi:open="true"
+       sodipodi:arc-type="arc"
+       d="M 3.6516976,21.927851 A 10.07766,10.07766 0 0 1 10.326189,29.26276" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 23.5,26.5 -23,5 7,-23"
+       id="path4275"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       style="opacity:1;vector-effect:none;fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99998635;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 15.363357,12.029744 -6.9982875,1.009778 1.0097777,6.998288 1.9453818,-2.603101 c 2.769224,2.130373 4.851825,5.027709 5.980112,8.336545 l 3.313344,-1.130057 c -1.355507,-3.975188 -3.862807,-7.455614 -7.19571,-10.008352 z"
+       id="path4293"
+       inkscape:connector-curvature="0"
+       inkscape:transform-center-x="-13.989377"
+       inkscape:transform-center-y="-12.599501" />
+    <path
+       style="opacity:0.75;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99207175px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 8.957468,13.514859 0.7924712,5.104447 0.1195871,-4.145772 3.3999177,-0.678979 0.885703,-1.002243 z"
+       id="path4341"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_rotate_180-24.svg b/pixmaps/src/gwy_rotate_180-24.svg
new file mode 100644
index 0000000..b974038
--- /dev/null
+++ b/pixmaps/src/gwy_rotate_180-24.svg
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   id="svg2160"
+   sodipodi:version="0.32"
+   inkscape:version="0.92+devel unknown"
+   sodipodi:docname="gwy_rotate_180-24.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.1"
+   inkscape:export-filename="gwy_rotate-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs2162">
+    <filter
+       height="1.2250096"
+       y="-0.11250482"
+       width="1.2571303"
+       x="-0.12856513"
+       id="filter8458"
+       style="color-interpolation-filters:sRGB"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur8460"
+         stdDeviation="0.16275744"
+         inkscape:collect="always" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="34.840211"
+     inkscape:cx="11.685488"
+     inkscape:cy="12.618414"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1149"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false"
+     inkscape:document-rotation="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid1px"
+       originx="0"
+       originy="0"
+       dotted="false"
+       snapvisiblegridlinesonly="false"
+       spacingx="1.0"
+       spacingy="1.0"
+       enabled="true"
+       visible="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2165">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-8)">
+    <path
+       inkscape:connector-curvature="0"
+       id="path5078-9-4"
+       d="m 22.322784,19.5872 c 0.241477,6.354861 -4.73023,9.269954 -4.73023,9.269954 l 1.078134,1.616674 -6.985412,0.102427 2.462267,-6.22188 1.131449,1.619935 c 0,0 3.703396,-1.584955 3.710719,-5.828871 0.0073,-4.243915 -4.330941,-6.625638 -4.330941,-6.625638 l 2.002139,-2.841489 c 0,0 5.420317,2.551927 5.661875,8.908888 z"
+       style="fill:#7db846;fill-opacity:1;stroke:none;stroke-width:0.99998635;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       sodipodi:nodetypes="cccccczccz" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path5078-9-4-0"
+       d="M 1.747313,20.412799 C 1.5058354,14.057939 6.4775431,11.142846 6.4775431,11.142846 L 5.3994088,9.5261721 12.384821,9.423745 9.9225541,15.645623 8.7911044,14.025689 c 0,0 -3.7033954,1.584954 -3.7107188,5.82887 -0.00731,4.243917 4.3309414,6.625639 4.3309414,6.625639 l -2.0021389,2.84149 c 0,0 -5.4203175,-2.551927 -5.6618751,-8.908889 z"
+       style="fill:#7db846;fill-opacity:1;stroke:none;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       sodipodi:nodetypes="cccccczccz" />
+    <path
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 247.77811,607.10722 2.04551,-1.97639 c 3.084,-2.18671 7.16485,-2.19754 10.11737,-0.82586 -1.41374,-0.11516 -7.27065,-0.71672 -10.04431,1.95056 -1.09475,1.05276 -1.29524,1.31798 -1.29524,1.31798 z"
+       id="path8400"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccscc"
+       transform="matrix(-0.116798,0.98991494,0.98031758,0.11794146,-559.3106,-305.38616)" />
+    <path
+       transform="matrix(0.116798,-0.98991494,-0.98031758,-0.11794146,582.15756,344.47789)"
+       sodipodi:nodetypes="cccscc"
+       inkscape:connector-curvature="0"
+       id="path8135"
+       d="m 247.77811,607.10722 2.04551,-1.97639 c 3.084,-2.18671 6.53572,-2.30166 9.97068,1.1396 -3.7021,-2.69151 -7.12396,-2.68218 -9.89762,-0.0149 -1.09475,1.05276 -1.29524,1.31798 -1.29524,1.31798 z"
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)" />
+    <path
+       transform="matrix(0.71872527,-0.6834558,-0.6768296,-0.72576163,239.28,620.73618)"
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8137"
+       d="m 248.50329,606.59306 1.32033,-1.46223 2.39304,-1.06565 c -1.38665,1.37707 -2.63431,2.57028 -4.14575,3.81106 z"
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)" />
+    <path
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 248.50329,606.59306 1.32033,-1.46223 2.39304,-1.06565 c -1.38665,1.37707 -2.63431,2.57028 -4.14575,3.81106 z"
+       id="path8139"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc"
+       transform="matrix(-0.35836628,-0.92891791,-0.91991192,0.3618747,660.45559,40.942038)" />
+    <path
+       transform="matrix(-0.63347005,0.76463182,0.75721861,0.63967175,-281.84431,-552.85979)"
+       style="opacity:0.26000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 253.47872,607.61144 1.81198,-1.81975 0.89043,-1.02933 c 0,0 0.0967,0.57698 -0.92284,1.70274 -1.01955,1.12575 -1.31704,1.26648 -1.31704,1.26648 z"
+       id="path8141"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccscc" />
+    <path
+       sodipodi:nodetypes="cccccczccz"
+       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.99998635;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 1.747313,20.412799 C 1.5058354,14.057939 6.4775431,11.142846 6.4775431,11.142846 L 5.3994088,9.5261721 12.384821,9.423745 9.9225541,15.645623 8.7911044,14.025689 c 0,0 -3.7033954,1.584954 -3.7107188,5.82887 -0.00731,4.243917 4.3309414,6.625639 4.3309414,6.625639 l -2.0021389,2.84149 c 0,0 -5.4203175,-2.551927 -5.6618751,-8.908889 z"
+       id="path4283"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:nodetypes="cccccczccz"
+       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.99998635;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 22.322784,19.5872 c 0.241477,6.354861 -4.73023,9.269954 -4.73023,9.269954 l 1.078134,1.616674 -6.985412,0.102427 2.462267,-6.22188 1.131449,1.619935 c 0,0 3.703396,-1.584955 3.710719,-5.828871 0.0073,-4.243915 -4.330941,-6.625638 -4.330941,-6.625638 l 2.002139,-2.841489 c 0,0 5.420317,2.551927 5.661875,8.908888 z"
+       id="path4285"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_rotate_3d-24.svg b/pixmaps/src/gwy_rotate_3d-24.svg
new file mode 100644
index 0000000..35b1170
--- /dev/null
+++ b/pixmaps/src/gwy_rotate_3d-24.svg
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     id="svg2160"
+     sodipodi:version="0.32"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_rotate_3d-24.svg"
+     inkscape:output_extension="org.inkscape.output.svg.inkscape"
+     version="1.1"
+     inkscape:export-filename="gwy_rotate-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <defs
+         id="defs2162">
+        <filter
+             height="1.2250096"
+             y="-0.11250482"
+             width="1.2571303"
+             x="-0.12856513"
+             id="filter8458"
+             style="color-interpolation-filters:sRGB"
+             inkscape:collect="always">
+            <feGaussianBlur
+                 id="feGaussianBlur8460"
+                 stdDeviation="0.16275744"
+                 inkscape:collect="always" />
+        </filter>
+    </defs>
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="47.363944"
+         inkscape:cx="19.277578"
+         inkscape:cy="15.259717"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:grid-bbox="true"
+         inkscape:document-units="px"
+         showguides="true"
+         inkscape:guide-bbox="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:snap-global="false"
+         inkscape:document-rotation="0">
+        <inkscape:grid
+             type="xygrid"
+             id="grid1px"
+             originx="0"
+             originy="0"
+             dotted="false"
+             snapvisiblegridlinesonly="false"
+             spacingx="1.0"
+             spacingy="1.0"
+             enabled="true"
+             visible="true" />
+    </sodipodi:namedview>
+    <metadata
+         id="metadata2165">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title />
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         id="layer1"
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         transform="translate(0,-8)">
+        <path
+             inkscape:connector-curvature="0"
+             id="path5078-9-4"
+             d="M 12.447848,30.287736 C 6.092987,30.529213 3.177894,25.557506 3.177894,25.557506 L 1.56122,26.63564 1.458793,19.650228 l 6.22188,2.462267 -1.619935,1.131449 c 0,0 1.584955,3.703396 5.828871,3.710719 4.243915,0.0073 6.625638,-4.330941 6.625638,-4.330941 l 2.841489,2.002139 c 0,0 -2.551927,5.420317 -8.908888,5.661875 z"
+             style="fill:#7db846;fill-opacity:1;stroke:none;stroke-width:0.99998635;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+             sodipodi:nodetypes="cccccczccz" />
+        <path
+             inkscape:connector-curvature="0"
+             id="path5078-9-4-0"
+             d="m 11.622249,9.712265 c 6.35486,-0.2414776 9.269953,4.73023 9.269953,4.73023 l 1.616674,-1.078134 0.102427,6.985412 -6.221878,-2.462267 1.619934,-1.13145 c 0,0 -1.584954,-3.703395 -5.82887,-3.710718 -4.243917,-0.0073 -6.625639,4.330941 -6.625639,4.330941 L 2.71336,15.37414 c 0,0 2.551927,-5.4203174 8.908889,-5.661875 z"
+             style="fill:#7db846;fill-opacity:1;stroke:none;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+             sodipodi:nodetypes="cccccczccz" />
+        <path
+             style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+             d="m 247.77811,607.10722 2.04551,-1.97639 c 3.72195,-2.30129 6.47029,-2.33894 10.11737,-0.82586 -1.41374,-0.11516 -7.27065,-0.71672 -10.04431,1.95056 -1.09475,1.05276 -1.29524,1.31798 -1.29524,1.31798 z"
+             id="path8400"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="cccscc"
+             transform="matrix(0.98991494,-0.116798,0.11794146,0.98031758,-313.41287,-551.17548)" />
+        <path
+             transform="matrix(-0.98991494,0.116798,-0.11794146,-0.98031758,336.35983,590.1318)"
+             sodipodi:nodetypes="cccscc"
+             inkscape:connector-curvature="0"
+             id="path8135"
+             d="m 247.77811,607.10722 2.04551,-1.97639 c 3.39429,-1.62998 4.14901,-2.07894 8.56625,0.0722 -4.22982,-1.42329 -5.35674,-1.07715 -8.49319,1.0525 -1.25447,0.85178 -1.29524,1.31798 -1.29524,1.31798 z"
+             style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)" />
+        <path
+             style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+             d="m 248.73043,606.36076 1.78592,-1.69521 1.77753,-0.51768 c -1.4472,1.33053 -2.85561,2.58935 -4.307,3.89445 z"
+             id="path8139"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc"
+             transform="matrix(-0.67958389,-0.72765417,-0.71798959,0.67947199,607.19723,-206.93713)" />
+        <path
+             transform="matrix(-0.76463182,-0.63347005,-0.63967175,0.75721861,584.89484,-273.87936)"
+             style="opacity:0.26000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+             d="m 253.47872,607.61144 1.81198,-1.81975 0.89043,-1.02933 c 0,0 0.0967,0.57698 -0.92284,1.70274 -1.01955,1.12575 -1.31704,1.26648 -1.31704,1.26648 z"
+             id="path8141"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="cccscc" />
+        <path
+             sodipodi:nodetypes="cccccczccz"
+             style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.99998635;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+             d="M 12.447848,30.287736 C 6.092987,30.529213 3.177894,25.557506 3.177894,25.557506 L 1.56122,26.63564 1.458793,19.650228 l 6.22188,2.462267 -1.619935,1.131449 c 0,0 1.584955,3.703396 5.828871,3.710719 4.243915,0.0073 6.625638,-4.330941 6.625638,-4.330941 l 2.841489,2.002139 c 0,0 -2.551927,5.420317 -8.908888,5.661875 z"
+             id="path4285"
+             inkscape:connector-curvature="0" />
+        <path
+             style="color:#000000;overflow:visible;opacity:0.75;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99207175px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke;filter:url(#filter8458)"
+             d="m 17.452727,17.820721 1.233912,-0.808572 0.404229,0.439379 -0.658214,0.57998 z"
+             id="path194"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc" />
+        <path
+             style="color:#000000;overflow:visible;opacity:0.75;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99207175px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke;filter:url(#filter8458)"
+             d="m 21.085852,15.103565 1.008974,-0.857874 -0.200522,1.033625 -0.316352,0.281203 z"
+             id="path216"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc" />
+        <path
+             sodipodi:nodetypes="cccccczccz"
+             style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.99998635;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+             d="m 11.622249,9.712265 c 6.35486,-0.2414776 9.269953,4.73023 9.269953,4.73023 l 1.616674,-1.078134 0.102427,6.985412 -6.221878,-2.462267 1.619934,-1.13145 c 0,0 -1.584954,-3.703395 -5.82887,-3.710718 -4.243917,-0.0073 -6.625639,4.330941 -6.625639,4.330941 L 2.71336,15.37414 c 0,0 2.551927,-5.4203174 8.908889,-5.661875 z"
+             id="path4283"
+             inkscape:connector-curvature="0" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_rotate_90_ccw-24.svg b/pixmaps/src/gwy_rotate_90_ccw-24.svg
new file mode 100644
index 0000000..ed1e678
--- /dev/null
+++ b/pixmaps/src/gwy_rotate_90_ccw-24.svg
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   id="svg2160"
+   sodipodi:version="0.32"
+   inkscape:version="0.92+devel unknown"
+   sodipodi:docname="gwy_rotate_90_ccw-24.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.1"
+   inkscape:export-filename="gwy_rotate-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs2162">
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect4896"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <marker
+       inkscape:stockid="TriangleOutS"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleOutS"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path4464"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+         transform="scale(0.2)" />
+    </marker>
+    <marker
+       inkscape:stockid="TriangleOutM"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleOutM"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path4461"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+         transform="scale(0.4)" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect4314"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect4298"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect4294"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <filter
+       height="1.2250096"
+       y="-0.11250482"
+       width="1.2571303"
+       x="-0.12856513"
+       id="filter8458"
+       style="color-interpolation-filters:sRGB"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur8460"
+         stdDeviation="0.16275744"
+         inkscape:collect="always" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="37.375"
+     inkscape:cx="12"
+     inkscape:cy="12"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1149"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true"
+     inkscape:snap-center="true"
+     inkscape:document-rotation="0"
+     inkscape:snap-smooth-nodes="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid1px"
+       originx="0"
+       originy="0"
+       dotted="false"
+       snapvisiblegridlinesonly="false"
+       spacingx="0.5"
+       spacingy="0.5"
+       enabled="true"
+       visible="true"
+       units="px"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2165">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-8)">
+    <g
+       id="g4844">
+      <g
+         style="opacity:1"
+         id="path4846" />
+    </g>
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-col [...]
+       d="m 3.437878,10.5 v 3 h 3 c 1.857969,0 4.841638,0.462732 5.939453,1.560547 1.097815,1.097815 1.560547,4.081484 1.560547,5.939453 v 3 h -3.5 l 5,6 5,-6 h -3.5 v -3 c 0,-2.142031 -0.105392,-5.726486 -2.439453,-8.060547 C 12.164364,10.605392 8.579909,10.5 6.437878,10.5 Z"
+       id="path4990"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccssscccccsssc" />
+    <path
+       style="opacity:0.75;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99207175px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter8458)"
+       d="M 3.937878,11 4,12.934851 4.884839,11.858713 8.7515133,12 l 3.6863647,0.5 -1.5,-1 -2.5,-0.5 z"
+       id="path5079"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccc" />
+    <path
+       style="opacity:0.75;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99207175px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 13.937878,24.5 h -2.5 l 2.5,2.5 -1,-1.5 h 1 l 0.5,-1"
+       id="path5101"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="opacity:0.75;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99207175px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 16.937878,24.5 1,1 h 0.5 l 1,-1 z"
+       id="path5123"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       sodipodi:nodetypes="ccssscccccsssc"
+       inkscape:connector-curvature="0"
+       id="path5134"
+       d="m 3.437878,10.5 v 3 h 3 c 1.857969,0 4.841638,0.462732 5.939453,1.560547 1.097815,1.097815 1.560547,4.081484 1.560547,5.939453 v 3 h -3.5 l 5,6 5,-6 h -3.5 v -3 c 0,-2.142031 -0.105392,-5.726486 -2.439453,-8.060547 C 12.164364,10.605392 8.579909,10.5 6.437878,10.5 Z"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-col [...]
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_rotate_90_cw-24.svg b/pixmaps/src/gwy_rotate_90_cw-24.svg
new file mode 100644
index 0000000..4cd8615
--- /dev/null
+++ b/pixmaps/src/gwy_rotate_90_cw-24.svg
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   id="svg2160"
+   sodipodi:version="0.32"
+   inkscape:version="0.92+devel unknown"
+   sodipodi:docname="gwy_rotate_90_cw-24.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.1"
+   inkscape:export-filename="gwy_rotate-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs2162">
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect4896"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <marker
+       inkscape:stockid="TriangleOutS"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleOutS"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path4464"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+         transform="scale(0.2)" />
+    </marker>
+    <marker
+       inkscape:stockid="TriangleOutM"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleOutM"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path4461"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+         transform="scale(0.4)" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect4314"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect4298"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect4294"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <filter
+       height="1.2250096"
+       y="-0.11250482"
+       width="1.2571303"
+       x="-0.12856513"
+       id="filter8458"
+       style="color-interpolation-filters:sRGB"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur8460"
+         stdDeviation="0.16275744"
+         inkscape:collect="always" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter5373"
+       x="-0.02529144"
+       width="1.0505829"
+       y="-0.045066713"
+       height="1.0901334">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.10393676"
+         id="feGaussianBlur5375" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="37.375"
+     inkscape:cx="12"
+     inkscape:cy="10.935648"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1149"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true"
+     inkscape:snap-center="true"
+     inkscape:document-rotation="0"
+     inkscape:snap-smooth-nodes="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid1px"
+       originx="0"
+       originy="0"
+       dotted="false"
+       snapvisiblegridlinesonly="false"
+       spacingx="0.5"
+       spacingy="0.5"
+       enabled="true"
+       visible="true"
+       units="px"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2165">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-8)">
+    <g
+       id="g4844">
+      <g
+         style="opacity:1"
+         id="path4846" />
+    </g>
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-col [...]
+       d="m 20.5,10.5 v 3 h -3 c -1.857969,0 -4.841638,0.462732 -5.939453,1.560547 C 10.462732,16.158362 10,19.142031 10,21 v 3 h 3.5 l -5,6 -5,-6 H 7 V 21 C 7,18.857969 7.105392,15.273514 9.439453,12.939453 11.773514,10.605392 15.357969,10.5 17.5,10.5 Z"
+       id="path4990"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccssscccccsssc" />
+    <path
+       style="opacity:0.75;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99207175px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter5373)"
+       d="m 6.0248362,11.080268 c 0,0 0.9828568,0.0742 3.2231466,0.630951 1.2902022,0.320637 2.7770432,0.791423 3.9182462,1.626574 1.135384,0.830891 2.721558,3.22621 2.721558,3.22621 0,0 -0.540183,-2.370739 -2.404376,-3.777008 -2.195737,-1.656371 -2.855752,-1.290753 -4.5059496,-1.627467 -1.1605622,-0.236807 -2.9526252,-0.07926 -2.9526252,-0.07926 z"
+       id="path5079"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="csacssc"
+       transform="matrix(-1,0,0,1,23.937878,0)" />
+    <path
+       style="opacity:0.75;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99207175px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 7.064283,24.5 h -2.5 l 2.5,2.5 -1,-1.5 h 1 l 0.5,-1"
+       id="path5101"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="opacity:0.75;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99207175px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 10.064283,24.5 1,1 h 0.5 l 1,-1 z"
+       id="path5123"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       sodipodi:nodetypes="ccssscccccsssc"
+       inkscape:connector-curvature="0"
+       id="path5134"
+       d="m 20.5,10.5 v 3 h -3 c -1.857969,0 -4.841638,0.462732 -5.939453,1.560547 C 10.462732,16.158362 10,19.142031 10,21 v 3 h 3.5 l -5,6 -5,-6 H 7 V 21 C 7,18.857969 7.105392,15.273514 9.439453,12.939453 11.773514,10.605392 15.357969,10.5 17.5,10.5 Z"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-col [...]
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_scale-24.svg b/pixmaps/src/gwy_scale-24.svg
new file mode 100644
index 0000000..4b5752b
--- /dev/null
+++ b/pixmaps/src/gwy_scale-24.svg
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 22.5 22.5"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_scale-24.svg"
+   inkscape:export-filename="gwy_scale-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8095" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="18.684887"
+     inkscape:cx="13.506679"
+     inkscape:cy="15.772663"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     units="px">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="0.9375"
+                       spacingy="0.9375"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77814,-596.57599)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#e8f0e0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.9375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.93750005, 1.8750001;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect10104"
+       width="21.5625"
+       height="21.5625"
+       x="245.24689"
+       y="597.04474" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#b3d296;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.9375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.93749999, 1.87499999;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect10106"
+       width="15.9375"
+       height="15.9375"
+       x="245.24689"
+       y="597.04474" />
+    <rect
+       y="597.04474"
+       x="245.24689"
+       height="10.312499"
+       width="10.3125"
+       id="rect10108"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 250.42689,604.09705 1.87229,-1.87227 4.6807,4.6807 -1.87227,1.87228 z"
+       id="path8069"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 253.23532,610.65004 5.61685,-5.61685 v 5.61685 z"
+       id="path8071"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_scale_horizontally-24.svg b/pixmaps/src/gwy_scale_horizontally-24.svg
new file mode 100644
index 0000000..b4c129b
--- /dev/null
+++ b/pixmaps/src/gwy_scale_horizontally-24.svg
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_scale_horizontally-24.svg"
+   inkscape:export-filename="gwy_flip_vertically-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8095">
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8458"
+       x="-0.12856513"
+       width="1.2571303"
+       y="-0.11250482"
+       height="1.2250096">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.16275744"
+         id="feGaussianBlur8460" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="9.0824264"
+     inkscape:cx="-1.7123216"
+     inkscape:cy="11.893485"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77811,-595.10722)">
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="rect12874-3"
+       d="m 244.27811,597.60723 v 6 h 25 v -6 z"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 249.27811,598.10721 v 2.00001"
+       id="path12880-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path12882-5"
+       d="m 246.27811,598.10722 v 3"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <g
+       id="g8180"
+       transform="matrix(0,1,1,0,-351.33135,351.0794)">
+      <path
+         sodipodi:nodetypes="ccccccccccc"
+         inkscape:connector-curvature="0"
+         id="path8069"
+         d="m 265.52742,603.61601 -4.5,-4.75586 -4,4.75586 1.5,0 0,8.98242 -1.5,0 4.00029,4.75586 4.49971,-4.75586 -2,0 0,-8.96484 z"
+         style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         transform="matrix(0,1,1,0,-346.22145,352.3379)"
+         sodipodi:nodetypes="cccscc"
+         inkscape:connector-curvature="0"
+         id="path8400"
+         d="m 247.77811,607.10722 2.04551,-1.97639 0.82671,-0.67886 c 0,0 0.26589,0.83737 -0.66247,1.73517 -1.09178,1.05585 -1.36362,1.02163 -1.36362,1.02163 z"
+         style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)" />
+      <path
+         sodipodi:nodetypes="cccscc"
+         inkscape:connector-curvature="0"
+         id="path8466"
+         d="m 253.11792,607.26529 1.81198,-1.81975 0.89043,-1.02933 c 0,0 0.0967,0.57698 -0.92284,1.70274 -1.01955,1.12575 -1.31704,1.26648 -1.31704,1.26648 z"
+         style="opacity:0.26000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+         transform="matrix(0.69230564,0.72160439,-0.72160439,0.69230564,521.85974,0.6931212)" />
+      <path
+         transform="matrix(0.10811449,0.99413845,0.99413845,-0.10811449,-368.13411,426.79066)"
+         style="opacity:0.26000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+         d="m 253.47872,607.61144 1.81198,-1.81975 0.89043,-1.02933 c 0,0 0.0967,0.57698 -0.92284,1.70274 -1.01955,1.12575 -1.31704,1.26648 -1.31704,1.26648 z"
+         id="path8468"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccscc" />
+      <path
+         transform="matrix(-0.69230564,0.72160439,0.72160439,0.69230564,0.0190765,9.3917012)"
+         style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+         d="m 250.42076,599.48385 5.75597,5.56568 c 0.78644,-0.69253 0.27926,-0.20275 0.86026,-0.71903 -0.13014,0.0245 0.32045,0.66081 -0.1642,1.68599 0.99919,3.25596 -5.84748,-5.15797 -6.46943,-5.9464 -0.34388,-0.43593 -0.24155,-0.7694 0.0174,-0.58624 z"
+         id="path8462"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccsc" />
+    </g>
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path4771"
+       d="m 255.27811,598.10721 v 2.00001"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 252.27811,598.10722 v 3"
+       id="path4773"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path4775"
+       d="m 261.27811,598.10721 v 2.00001"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 258.27811,598.10722 v 3"
+       id="path4777"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 267.27811,598.10721 v 2.00001"
+       id="path4779"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4781"
+       d="m 264.27811,598.10722 v 3"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_scale_vertically-24.svg b/pixmaps/src/gwy_scale_vertically-24.svg
new file mode 100644
index 0000000..107a33e
--- /dev/null
+++ b/pixmaps/src/gwy_scale_vertically-24.svg
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_scale_vertically-24.svg"
+   inkscape:export-filename="gwy_flip_vertically-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8095">
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8458"
+       x="-0.12856513"
+       width="1.2571303"
+       y="-0.11250482"
+       height="1.2250096">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.16275744"
+         id="feGaussianBlur8460" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="9.2189467"
+     inkscape:cx="10.230606"
+     inkscape:cy="3.1813199"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77811,-595.10722)">
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 247.27811,594.60724 h 6 v 25 h -6 z"
+       id="rect12874-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 247.77794,605.60731 h 3"
+       id="path12876-6"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 247.77794,602.60731 h 2.00001"
+       id="path12880-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path12882-5"
+       d="m 247.77794,599.60731 h 3"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 247.77794,614.60731 h 2.00001"
+       id="path12884-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 247.77794,608.60731 h 2.00001"
+       id="path12890-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path12892-6"
+       d="m 247.77794,611.60731 h 3"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 247.77794,617.60731 h 3"
+       id="path8091-2"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g8180"
+       transform="translate(1,-1)">
+      <path
+         sodipodi:nodetypes="ccccccccccc"
+         inkscape:connector-curvature="0"
+         id="path8069"
+         d="m 265.27782,603.61601 -4.5,-4.75586 -4,4.75586 1.5,0 0,8.98242 -1.5,0 4.00029,4.75586 4.49971,-4.75586 -2,0 0,-8.96484 z"
+         style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         transform="matrix(0,1,1,0,-346.22145,352.3379)"
+         sodipodi:nodetypes="cccscc"
+         inkscape:connector-curvature="0"
+         id="path8400"
+         d="m 247.77811,607.10722 2.04551,-1.97639 0.82671,-0.67886 c 0,0 0.26589,0.6778 -0.75365,1.80356 -1.01955,1.12575 -1.29524,1.31798 -1.29524,1.31798 z"
+         style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)" />
+      <path
+         sodipodi:nodetypes="cccscc"
+         inkscape:connector-curvature="0"
+         id="path8466"
+         d="m 253.11792,607.26529 1.81198,-1.81975 0.89043,-1.02933 c 0,0 0.0967,0.57698 -0.92284,1.70274 -1.01955,1.12575 -1.31704,1.26648 -1.31704,1.26648 z"
+         style="opacity:0.26000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+         transform="matrix(0.69230564,0.72160439,-0.72160439,0.69230564,521.85974,0.6931212)" />
+      <path
+         transform="matrix(0.10811449,0.99413845,0.99413845,-0.10811449,-368.13411,426.79066)"
+         style="opacity:0.26000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+         d="m 253.47872,607.61144 1.81198,-1.81975 0.89043,-1.02933 c 0,0 0.0967,0.57698 -0.92284,1.70274 -1.01955,1.12575 -1.31704,1.26648 -1.31704,1.26648 z"
+         id="path8468"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccscc" />
+      <path
+         transform="matrix(-0.69230564,0.72160439,0.72160439,0.69230564,0.0190765,9.3917012)"
+         style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+         d="m 250.42076,599.48385 5.75597,5.56568 c 0.78644,-0.69253 0.27926,-0.20275 0.86026,-0.71903 -0.13014,0.0245 0.32045,0.66081 -0.1642,1.68599 -0.31728,0.41341 -6.35383,-4.69604 -6.97578,-5.48447 -0.34388,-0.43593 0.2648,-1.23133 0.52375,-1.04817 z"
+         id="path8462"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccsc" />
+    </g>
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path4764"
+       d="m 247.77794,596.60731 h 2.00001"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_scars-24.svg b/pixmaps/src/gwy_scars-24.svg
new file mode 100644
index 0000000..b04e6af
--- /dev/null
+++ b/pixmaps/src/gwy_scars-24.svg
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8323"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="gwy_scars.svg">
+  <defs
+     id="defs8325" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="10.435893"
+     inkscape:cx="29.740004"
+     inkscape:cy="18.815788"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata8328">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-182.52887,-504.32709)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8276"
+       width="23.000002"
+       height="23.000002"
+       x="183.02887"
+       y="504.82709" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 197.52888,507.32708 8,0"
+       id="path8537"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8539"
+       d="m 187.52888,508.82708 7,0"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.0209229;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 184.52888,524.82708 11,0"
+       id="path8545"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8351"
+       d="m 185.52888,513.32708 15,0"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8353"
+       d="m 196.52888,522.32708 9,0"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8355"
+       d="m 183.52888,518.32708 10,0"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_selections-24.svg b/pixmaps/src/gwy_selections-24.svg
new file mode 100644
index 0000000..f906287
--- /dev/null
+++ b/pixmaps/src/gwy_selections-24.svg
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg9115"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_selections-24.svg"
+   inkscape:export-filename="gwy_selections-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs9117">
+    <linearGradient
+       osb:paint="solid"
+       id="linearGradient8428">
+      <stop
+         id="stop8430"
+         offset="0"
+         style="stop-color:#4696db;stop-opacity:1;" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16.830321"
+     inkscape:cx="7.9872632"
+     inkscape:cy="18.627623"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     showguides="false"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata9120">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-318.26682,-688.48108)">
+    <g
+       id="g8110"
+       transform="translate(19.96252,5.87193)" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 341.26682,699.48108 v 11.03844 h -5.96155 v -11.03844 z"
+       id="rect5148"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8161"
+       d="m 325.76683,706.10608 5,-11.25"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <g
+       transform="translate(345.23995,-356.98422)"
+       id="g8186">
+      <path
+         sodipodi:nodetypes="cc"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m -12.97312,1045.4653 v 6"
+         id="path8192"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m -15.97312,1048.4653 h 6.00001"
+         id="path8194"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cc" />
+    </g>
+    <g
+       id="g4769"
+       transform="translate(337.23994,-338.98422)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4765"
+         d="m -12.97312,1045.4653 v 6"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="cc" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path4767"
+         d="m -15.97312,1048.4653 h 6.00001"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <g
+       transform="translate(-29,2)"
+       id="g8496">
+      <path
+         sodipodi:nodetypes="ccccc"
+         style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 348.26682,688.48108 -1,1 5,5 1,-1 z"
+         id="path8427"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="path8425"
+         d="m 347.26682,693.48108 1,1 5,-5 -1,-1 z"
+         style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_shader-24.svg b/pixmaps/src/gwy_shader-24.svg
new file mode 100644
index 0000000..c3de13e
--- /dev/null
+++ b/pixmaps/src/gwy_shader-24.svg
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8447"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="gwy_shader.svg">
+  <defs
+     id="defs8449">
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8467"
+       id="radialGradient8465"
+       cx="344.60681"
+       cy="536.5907"
+       fx="344.60681"
+       fy="536.5907"
+       r="10.106574"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2978589,0,0,1.3584014,-111.3866,-105.79131)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8467">
+      <stop
+         id="stop8473"
+         offset="0"
+         style="stop-color:#c3ddf3;stop-opacity:1" />
+      <stop
+         style="stop-color:#4696db;stop-opacity:1"
+         offset="0.5"
+         id="stop8471" />
+      <stop
+         id="stop8469"
+         offset="1"
+         style="stop-color:#0c1e2d;stop-opacity:1" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="6.5429474"
+     inkscape:cx="51.591312"
+     inkscape:cy="45.715939"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata8452">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-327.49247,-614.41244)">
+    <circle
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#radialGradient8465);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marke [...]
+       id="path8444"
+       cx="339.49246"
+       cy="626.41241"
+       r="11.420064" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_spectrum-24.svg b/pixmaps/src/gwy_spectrum-24.svg
new file mode 100644
index 0000000..bae5474
--- /dev/null
+++ b/pixmaps/src/gwy_spectrum-24.svg
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   sodipodi:docname="gwy_spectrum-24.svg"
+   inkscape:version="0.92.1 r15371"
+   version="1.1"
+   id="svg8223"
+   viewBox="0 0 24 24"
+   height="24"
+   width="24"
+   inkscape:export-filename="gwy_spectrum-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <sodipodi:namedview
+     inkscape:window-maximized="1"
+     inkscape:window-y="27"
+     inkscape:window-x="0"
+     inkscape:window-height="1016"
+     inkscape:window-width="1920"
+     units="px"
+     showgrid="false"
+     inkscape:current-layer="layer1"
+     inkscape:document-units="px"
+     inkscape:cy="141.60119"
+     inkscape:cx="66.358509"
+     inkscape:zoom="1"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     inkscape:snap-smooth-nodes="true"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <defs
+     id="defs8225" />
+  <metadata
+     id="metadata8228">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(-265.77397,-640.45752)"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Layer 1">
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 271.27396,651.95751 h 17 l -2,12.00001 h -20 z"
+       id="rect13909"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <g
+       id="g8464"
+       transform="matrix(1.2553873,0,0,1.2553873,-92.733475,-162.10199)"
+       style="fill:#000000">
+      <g
+         id="g8462"
+         style="fill:#000000;stroke:#db2424;stroke-opacity:1"
+         transform="translate(-105.7592,122.59822)">
+        <g
+           id="g8594"
+           style="fill:#000000">
+          <path
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing [...]
+             d="m 394.12236,532.9472 c 0,0 0.52083,-1.25 0.52083,-1.25 0,0 6.25,0 6.25,0 0,0 -0.52083,1.25 -0.52083,1.25 0,0 -6.25,0 -6.25,0"
+             id="path8458"
+             inkscape:connector-curvature="0" />
+          <path
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing [...]
+             d="m 395.68486,534.1972 c 0,0 1.5625,-3.75 1.5625,-3.75 0,0 2.08333,0 2.08333,0 0,0 -1.5625,3.75 -1.5625,3.75 0,0 -2.08333,0 -2.08333,0"
+             id="path8460"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#fcfcfc;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 268.27498,640.45752 c 0,1.6665 -0.64034,27.78751 4.89852,12.06983 2.7976,-5.89057 9.52869,-7.96489 16.00044,-7.96489"
+       id="path8636"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0"
+       id="path12604"
+       d="m 268.27498,640.45752 c 0,1.6665 -0.64034,27.78751 4.89852,12.06983 2.7976,-5.89057 9.52869,-7.96489 16.00044,-7.96489"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_spot_remove-24.svg b/pixmaps/src/gwy_spot_remove-24.svg
new file mode 100644
index 0000000..f7b57d4
--- /dev/null
+++ b/pixmaps/src/gwy_spot_remove-24.svg
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8759"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="gwy_spot_remove.svg">
+  <defs
+     id="defs8761" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.5615615"
+     inkscape:cx="-69.028728"
+     inkscape:cy="55.309587"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8764">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-347.66226,-653.89819)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect11370"
+       width="23.000002"
+       height="23.000002"
+       x="348.16226"
+       y="654.39819" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:0.74901962;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect11972"
+       width="11.000001"
+       height="11.000001"
+       x="356.16226"
+       y="662.39819" />
+    <g
+       id="g8437"
+       transform="matrix(1.5,0,0,1.5,-201.50273,-121.90577)"
+       style="stroke:#db2424;stroke-opacity:1">
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 373.44052,524.5011 4.02276,4.02277"
+         id="path8433"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8435"
+         d="m 373.44052,528.52387 4.02276,-4.02277"
+         style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_stat_quantities-24.svg b/pixmaps/src/gwy_stat_quantities-24.svg
new file mode 100644
index 0000000..442aea6
--- /dev/null
+++ b/pixmaps/src/gwy_stat_quantities-24.svg
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8950"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_stat_quantities-24.svg"
+   inkscape:export-filename="gwy_stat_quantities-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8952" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="29.749109"
+     inkscape:cx="4.8268226"
+     inkscape:cy="12.08207"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true"
+     inkscape:snap-object-midpoints="true"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8955">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-158.35629,-492.34575)">
+    <g
+       aria-label="µ"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.6508379px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="text8420"
+       transform="translate(8,-1)">
+      <path
+         d="m 164.35629,495.34575 v 4.424 c 0,2.076 3,2.076 3,0.076 v -4.5 h 2 v 6.41776 c 0,0.82855 -1.98355,1.80499 -2.99245,1.80137 -1.00891,-0.004 -1.59804,-0.24245 -2.00755,-0.60537 v 3.38624 h -2.03265 v -11 z"
+         style="font-size:16px;stroke-width:1px"
+         id="path8434"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccccczccccc" />
+    </g>
+    <g
+       id="g8460"
+       transform="translate(4.9999973,0.999986)"
+       style="fill:none">
+      <circle
+         r="3"
+         cy="510.34576"
+         cx="171.35629"
+         id="path8441"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8443"
+         d="m 171.35629,507.34575 h 5"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 158.85629,496.84576 h 6 v 14 h -6 z"
+       id="rect8461"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <g
+       id="g8470"
+       transform="translate(9,-0.5)"
+       style="stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8464"
+         d="m 152.85629,496.84575 v -3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="cc" />
+      <path
+         sodipodi:nodetypes="cc"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 156.35629,493.34575 h -7"
+         id="path8466"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       id="g8476"
+       transform="matrix(1,0,0,-1,9,1009.1915)"
+       style="stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none">
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 152.85629,497.84575 v -4"
+         id="path8472"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8474"
+         d="m 156.35629,494.34575 h -7"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="cc" />
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 161.85629,497.34575 v 13"
+       id="path8478"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8439"
+       width="3"
+       height="3"
+       x="160.35629"
+       y="502.34576" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_straighten_path-24.svg b/pixmaps/src/gwy_straighten_path-24.svg
new file mode 100644
index 0000000..49dbd43
--- /dev/null
+++ b/pixmaps/src/gwy_straighten_path-24.svg
@@ -0,0 +1,631 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8424"
+   version="1.1"
+   inkscape:version="0.92+devel unknown"
+   sodipodi:docname="gwy_straighten_path-24.svg"
+   inkscape:export-filename="gwy_mask_paint_draw-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8426">
+    <inkscape:path-effect
+       effect="ruler"
+       id="path-effect2322"
+       is_visible="true"
+       unit="px"
+       mark_distance="20"
+       mark_length="14"
+       minor_mark_length="7"
+       major_mark_steps="5"
+       shift="0"
+       offset="0"
+       mark_dir="left"
+       border_marks="both" />
+    <inkscape:path-effect
+       only_selected="false"
+       apply_with_weight="true"
+       apply_no_weight="true"
+       helper_size="0"
+       steps="2"
+       weight="33.333333"
+       is_visible="true"
+       id="path-effect2252"
+       effect="bspline" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect2248"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       border_marks="none"
+       mark_dir="both"
+       offset="0"
+       shift="0"
+       major_mark_steps="1"
+       minor_mark_length="0"
+       mark_length="4"
+       mark_distance="6.8"
+       unit="px"
+       is_visible="true"
+       id="path-effect2244"
+       effect="ruler" />
+    <inkscape:path-effect
+       border_marks="both"
+       mark_dir="both"
+       offset="0"
+       shift="0"
+       major_mark_steps="1"
+       minor_mark_length="0"
+       mark_length="4"
+       mark_distance="5.7"
+       unit="px"
+       is_visible="true"
+       id="path-effect2218"
+       effect="ruler" />
+    <inkscape:path-effect
+       only_selected="false"
+       apply_with_weight="true"
+       apply_no_weight="true"
+       helper_size="0"
+       steps="2"
+       weight="33.333333"
+       is_visible="true"
+       id="path-effect2216"
+       effect="bspline" />
+    <inkscape:path-effect
+       effect="ruler"
+       id="path-effect2212"
+       is_visible="true"
+       unit="px"
+       mark_distance="7.2"
+       mark_length="4"
+       minor_mark_length="0"
+       major_mark_steps="1"
+       shift="0"
+       offset="0"
+       mark_dir="both"
+       border_marks="both" />
+    <inkscape:path-effect
+       only_selected="false"
+       apply_with_weight="true"
+       apply_no_weight="true"
+       helper_size="0"
+       steps="2"
+       weight="33.333333"
+       is_visible="true"
+       id="path-effect2166"
+       effect="bspline" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect2162"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect2138"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       border_marks="none"
+       mark_dir="both"
+       offset="0"
+       shift="0"
+       major_mark_steps="1"
+       minor_mark_length="0"
+       mark_length="4"
+       mark_distance="6"
+       unit="px"
+       is_visible="true"
+       id="path-effect1567"
+       effect="ruler" />
+    <inkscape:path-effect
+       only_selected="false"
+       apply_with_weight="true"
+       apply_no_weight="true"
+       helper_size="0"
+       steps="2"
+       weight="33.333333"
+       is_visible="true"
+       id="path-effect1565"
+       effect="bspline" />
+    <inkscape:path-effect
+       effect="ruler"
+       id="path-effect1543"
+       is_visible="true"
+       unit="px"
+       mark_distance="20"
+       mark_length="14"
+       minor_mark_length="7"
+       major_mark_steps="5"
+       shift="0"
+       offset="0"
+       mark_dir="left"
+       border_marks="both" />
+    <inkscape:path-effect
+       effect="ruler"
+       id="path-effect1519"
+       is_visible="true"
+       unit="px"
+       mark_distance="4.8"
+       mark_length="4"
+       minor_mark_length="0"
+       major_mark_steps="1"
+       shift="0"
+       offset="0"
+       mark_dir="both"
+       border_marks="both" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect1499"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       only_selected="false"
+       apply_with_weight="true"
+       apply_no_weight="true"
+       helper_size="0"
+       steps="2"
+       weight="33.333333"
+       is_visible="true"
+       id="path-effect1399"
+       effect="bspline" />
+    <inkscape:path-effect
+       only_selected="false"
+       apply_with_weight="true"
+       apply_no_weight="true"
+       helper_size="0"
+       steps="2"
+       weight="33.333333"
+       is_visible="true"
+       id="path-effect1205"
+       effect="bspline" />
+    <marker
+       inkscape:stockid="StopL"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="marker1127"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path1125"
+         d="M 0.0,5.65 L 0.0,-5.65"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         transform="scale(0.8)" />
+    </marker>
+    <inkscape:path-effect
+       effect="perp_bisector"
+       id="path-effect110"
+       is_visible="true"
+       length-left="200"
+       length-right="200" />
+    <inkscape:path-effect
+       effect="perp_bisector"
+       id="path-effect104"
+       is_visible="true"
+       length-left="200"
+       length-right="200" />
+    <inkscape:path-effect
+       only_selected="false"
+       apply_with_weight="true"
+       apply_no_weight="true"
+       helper_size="0"
+       steps="2"
+       weight="33.333333"
+       is_visible="true"
+       id="path-effect188"
+       effect="bspline" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect184"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker8670"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="StopL">
+      <path
+         transform="scale(0.8)"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         d="M 0.0,5.65 L 0.0,-5.65"
+         id="path8668" />
+    </marker>
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker8618"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="StopL">
+      <path
+         transform="scale(0.8)"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         d="M 0.0,5.65 L 0.0,-5.65"
+         id="path8616" />
+    </marker>
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="StopL-3"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="StopL">
+      <path
+         inkscape:connector-curvature="0"
+         transform="scale(0.8)"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         d="M 0,5.65 V -5.65"
+         id="path8658-5" />
+    </marker>
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker9537"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="StopL">
+      <path
+         inkscape:connector-curvature="0"
+         transform="scale(0.8)"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         d="M 0,5.65 V -5.65"
+         id="path9535" />
+    </marker>
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker9541"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="StopL">
+      <path
+         inkscape:connector-curvature="0"
+         transform="scale(0.8)"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         d="M 0,5.65 V -5.65"
+         id="path9539" />
+    </marker>
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker9673-7"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="StopL">
+      <path
+         transform="scale(0.8)"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         d="M 0.0,5.65 L 0.0,-5.65"
+         id="path9671-5" />
+    </marker>
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker9627-3"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="StopL">
+      <path
+         transform="scale(0.8)"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         d="M 0.0,5.65 L 0.0,-5.65"
+         id="path9625-5" />
+    </marker>
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker9587-6"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="StopL">
+      <path
+         transform="scale(0.8)"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         d="M 0.0,5.65 L 0.0,-5.65"
+         id="path9585-2" />
+    </marker>
+    <marker
+       inkscape:stockid="StopL"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="StopL-3-6"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path8658-5-1"
+         d="M 0,5.65 V -5.65"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.8)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="StopL"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker9537-0"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path9535-6"
+         d="M 0,5.65 V -5.65"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.8)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="StopL"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker9541-3"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path9539-2"
+         d="M 0,5.65 V -5.65"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.8)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect1499-3"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="ruler"
+       id="path-effect1519-6"
+       is_visible="true"
+       unit="px"
+       mark_distance="4.4"
+       mark_length="3"
+       minor_mark_length="0"
+       major_mark_steps="1"
+       shift="0"
+       offset="0"
+       mark_dir="both"
+       border_marks="both" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect1499-5"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="ruler"
+       id="path-effect1519-3"
+       is_visible="true"
+       unit="px"
+       mark_distance="4.4"
+       mark_length="3"
+       minor_mark_length="0"
+       major_mark_steps="1"
+       shift="0"
+       offset="0"
+       mark_dir="both"
+       border_marks="both" />
+    <inkscape:path-effect
+       border_marks="both"
+       mark_dir="both"
+       offset="0"
+       shift="0"
+       major_mark_steps="1"
+       minor_mark_length="0"
+       mark_length="4"
+       mark_distance="5.8"
+       unit="px"
+       is_visible="true"
+       id="path-effect1567-2"
+       effect="ruler" />
+    <inkscape:path-effect
+       border_marks="both"
+       mark_dir="both"
+       offset="0"
+       shift="0"
+       major_mark_steps="1"
+       minor_mark_length="0"
+       mark_length="4"
+       mark_distance="5.8"
+       unit="px"
+       is_visible="true"
+       id="path-effect1567-0"
+       effect="ruler" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect2162-6"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       border_marks="both"
+       mark_dir="both"
+       offset="0"
+       shift="0"
+       major_mark_steps="1"
+       minor_mark_length="0"
+       mark_length="4"
+       mark_distance="7.2"
+       unit="px"
+       is_visible="true"
+       id="path-effect2244-0"
+       effect="ruler" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect2162-8"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       border_marks="both"
+       mark_dir="both"
+       offset="0"
+       shift="0"
+       major_mark_steps="1"
+       minor_mark_length="0"
+       mark_length="4"
+       mark_distance="7.2"
+       unit="px"
+       is_visible="true"
+       id="path-effect2244-7"
+       effect="ruler" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="65.802656"
+     inkscape:cx="5.9587436"
+     inkscape:cy="20.851888"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1149"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     showguides="true"
+     inkscape:snap-global="true"
+     inkscape:document-rotation="0"
+     inkscape:snap-smooth-nodes="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid1px"
+       originx="0"
+       originy="0"
+       dotted="false"
+       snapvisiblegridlinesonly="false"
+       spacingx="0.5"
+       spacingy="0.5"
+       enabled="true"
+       visible="true"
+       units="px"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata8429">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-128.33165,-604.34668)">
+    <rect
+       style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#d0e2f2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect1569"
+       width="8"
+       height="23"
+       x="143.83165"
+       y="604.84668" />
+    <path
+       style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 147.83165,604.84668 v 23 m -2,-23 h 4 m -4,6 h 4 m -4,6 h 4 m -4,6 h 4"
+       id="path1521"
+       inkscape:connector-curvature="0"
+       inkscape:original-d="m 147.83165,604.84668 v 23"
+       inkscape:path-effect="#path-effect1567" />
+    <rect
+       y="604.84668"
+       x="143.83165"
+       height="23"
+       width="8"
+       id="rect2242"
+       style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-col [...]
+       d="m 129.68271,604.94134 c -0.33316,2.16554 -0.95781,5.24212 0.68945,8.40039 0.82378,1.57942 1.85046,2.59397 2.60547,3.45704 0.755,0.86306 1.20305,1.54396 1.28711,1.77734 0.16776,0.4658 -0.27053,1.5592 -0.46485,1.69531 -0.19305,0.13523 -1.92485,0.37572 -4.42578,0.20899 l -0.46484,6.98632 c 2.50093,0.16673 5.76494,0.73954 8.90625,-1.46093 3.14013,-2.19957 4.36761,-6.1032 3.03516,-9.80274 -0.66605,-1.84928 -1.75692,-3.04366 -2.60547,-4.01367 -0.84856,-0.97001 -1.4891,-1.74672 -1.666 [...]
+       id="path2278"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-col [...]
+       d="M 4.2636719 1.5488281 C 3.9598719 3.5536781 3.7046362 5.6396163 4.6914062 7.5664062 L 3.3886719 8.3671875 L 3.9121094 9.2207031 L 5.2890625 8.3730469 C 5.7928025 9.0952869 6.3194838 9.8122356 6.9023438 10.478516 C 7.6189437 11.297686 8.2049156 12.111166 8.5722656 12.941406 L 7.234375 13.353516 L 7.5292969 14.308594 L 8.7597656 13.929688 C 9.0404756 15.625448 8.4655131 17.490926 7.1894531 18.384766 C 7.1863531 18.386936 7.1808444 18.386502 7.1777344 18.388672 L 6.515625 17.08398 [...]
+       transform="translate(128.33165,604.34668)"
+       id="path4486" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path2344"
+       d="m 129.68271,604.94134 c -0.33316,2.16554 -0.95781,5.24212 0.68945,8.40039 0.82378,1.57942 1.85046,2.59397 2.60547,3.45704 0.755,0.86306 1.20305,1.54396 1.28711,1.77734 0.16776,0.4658 -0.27053,1.5592 -0.46485,1.69531 -0.19305,0.13523 -1.92485,0.37572 -4.42578,0.20899 l -0.46484,6.98632 c 2.50093,0.16673 5.76494,0.73954 8.90625,-1.46093 3.14013,-2.19957 4.36761,-6.1032 3.03516,-9.80274 -0.66605,-1.84928 -1.75692,-3.04366 -2.60547,-4.01367 -0.84856,-0.97001 -1.4891,-1.74672 -1.666 [...]
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-col [...]
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_subscript-20.svg b/pixmaps/src/gwy_subscript-20.svg
new file mode 100644
index 0000000..bd7141b
--- /dev/null
+++ b/pixmaps/src/gwy_subscript-20.svg
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="20"
+     height="20"
+     viewBox="0 0 20 20"
+     id="svg8833"
+     version="1.1"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_subscript-20.svg">
+    <defs
+         id="defs8835">
+        <linearGradient
+             gradientTransform="translate(-11.142957,824.89612)"
+             xlink:href="#linearGradient4140"
+             id="linearGradient4171"
+             gradientUnits="userSpaceOnUse"
+             x1="207.50029"
+             y1="247.92804"
+             x2="272.91217"
+             y2="361.22473" />
+        <linearGradient
+             id="linearGradient4140">
+            <stop
+                 style="stop-color:#d7e3f4;stop-opacity:1;"
+                 offset="0"
+                 id="stop4142" />
+            <stop
+                 style="stop-color:#f1f5fb;stop-opacity:1"
+                 offset="1"
+                 id="stop4144" />
+        </linearGradient>
+    </defs>
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="42.35"
+         inkscape:cx="10"
+         inkscape:cy="10"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         units="px"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:document-rotation="0">
+        <inkscape:grid
+             type="xygrid"
+             id="grid1px"
+             originx="0"
+             originy="0"
+             dotted="false"
+             snapvisiblegridlinesonly="false"
+             spacingx="0.5"
+             spacingy="0.5"
+             enabled="true"
+             visible="true"
+             units="px"
+             empspacing="2" />
+    </sodipodi:namedview>
+    <metadata
+         id="metadata8838">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-199.64375,-494.06708)">
+        <text
+             xml:space="preserve"
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24.39240837px;line-height:120.00000477%;font-family:'Linux Libertine O';-inkscape-font-specification:'Linux Libertine O';text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;shape-padding:0;overflow:visible;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89240515;stroke-linecap:round;stroke-linejoin:round;paint-order:fi [...]
+             x="200.12727"
+             y="511.87701"
+             id="text4304"><tspan
+                 sodipodi:role="line"
+                 id="tspan4302"
+                 x="200.12727"
+                 y="511.87701"
+                 style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Linux Libertine O';-inkscape-font-specification:'Linux Libertine O';stroke-width:0.89240515">S</tspan></text>
+        <text
+             id="text4346"
+             y="514.02789"
+             x="210.90309"
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.44700432px;line-height:120.00000477%;font-family:'Linux Libertine O';-inkscape-font-specification:'Linux Libertine O';text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;shape-padding:0;overflow:visible;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.67489052;stroke-linecap:round;stroke-linejoin:round;paint-order:fi [...]
+             xml:space="preserve"><tspan
+                 style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Linux Libertine O';-inkscape-font-specification:'Linux Libertine O';stroke-width:0.67489052"
+                 y="514.02789"
+                 x="210.90309"
+                 id="tspan4344"
+                 sodipodi:role="line">x</tspan></text>
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_superscript-20.svg b/pixmaps/src/gwy_superscript-20.svg
new file mode 100644
index 0000000..487662e
--- /dev/null
+++ b/pixmaps/src/gwy_superscript-20.svg
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="20"
+     height="20"
+     viewBox="0 0 20 20"
+     id="svg8833"
+     version="1.1"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_superscript-20.svg">
+    <defs
+         id="defs8835">
+        <linearGradient
+             gradientTransform="translate(-11.142957,824.89612)"
+             xlink:href="#linearGradient4140"
+             id="linearGradient4171"
+             gradientUnits="userSpaceOnUse"
+             x1="207.50029"
+             y1="247.92804"
+             x2="272.91217"
+             y2="361.22473" />
+        <linearGradient
+             id="linearGradient4140">
+            <stop
+                 style="stop-color:#d7e3f4;stop-opacity:1;"
+                 offset="0"
+                 id="stop4142" />
+            <stop
+                 style="stop-color:#f1f5fb;stop-opacity:1"
+                 offset="1"
+                 id="stop4144" />
+        </linearGradient>
+    </defs>
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="42.35"
+         inkscape:cx="10"
+         inkscape:cy="10"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         units="px"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:document-rotation="0">
+        <inkscape:grid
+             type="xygrid"
+             id="grid1px"
+             originx="0"
+             originy="0"
+             dotted="false"
+             snapvisiblegridlinesonly="false"
+             spacingx="0.5"
+             spacingy="0.5"
+             enabled="true"
+             visible="true"
+             units="px"
+             empspacing="2" />
+    </sodipodi:namedview>
+    <metadata
+         id="metadata8838">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-199.64375,-494.06708)">
+        <text
+             xml:space="preserve"
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24.39240837px;line-height:120.00000477%;font-family:'Linux Libertine O';-inkscape-font-specification:'Linux Libertine O';text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;shape-padding:0;overflow:visible;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89240515;stroke-linecap:round;stroke-linejoin:round;paint-order:fi [...]
+             x="200.12727"
+             y="511.87701"
+             id="text4304"><tspan
+                 sodipodi:role="line"
+                 id="tspan4302"
+                 x="200.12727"
+                 y="511.87701"
+                 style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Linux Libertine O';-inkscape-font-specification:'Linux Libertine O';stroke-width:0.89240515">S</tspan></text>
+        <text
+             id="text4346"
+             y="502.05457"
+             x="210.90309"
+             style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.44700432px;line-height:120.00000477%;font-family:'Linux Libertine O';-inkscape-font-specification:'Linux Libertine O';text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;shape-padding:0;overflow:visible;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.67489052;stroke-linecap:round;stroke-linejoin:round;paint-order:fi [...]
+             xml:space="preserve"><tspan
+                 style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Linux Libertine O';-inkscape-font-specification:'Linux Libertine O';stroke-width:0.67489052"
+                 y="502.05457"
+                 x="210.90309"
+                 id="tspan4344"
+                 sodipodi:role="line">x</tspan></text>
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_synthetic_ballistic_deposition-24.svg b/pixmaps/src/gwy_synthetic_ballistic_deposition-24.svg
new file mode 100644
index 0000000..e539a76
--- /dev/null
+++ b/pixmaps/src/gwy_synthetic_ballistic_deposition-24.svg
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8440"
+     version="1.1"
+     inkscape:version="0.92.1 r"
+     sodipodi:docname="gwy_synthetic_ballistic_deposition-24.svg"
+     inkscape:export-filename="gwy_crop-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="26.569152"
+         inkscape:cx="8.3921436"
+         inkscape:cy="11.749994"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                           </sodipodi:namedview>
+    <defs
+         id="defs8442" />
+    <metadata
+         id="metadata8445">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-18.260046,-276.07986)">
+        <rect
+             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill  [...]
+             id="rect4523"
+             width="23"
+             height="23"
+             x="18.760046"
+             y="276.57986" />
+        <image
+             y="277.07986"
+             x="19.260046"
+             id="image4805"
+             xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAIAAABL1vtsAAAE90lEQVQ4TxWUe1jNdxzHf8+eDalz
+kClOHF1PuodCknTRVSWJ3EblUmyshhFyGZshNo2RSyxtleimkqjo1JHqJHJJpUKFmS0756R6zF49
+T3+cfr/v7/N5f17v9+crpE0YtkGilTdTUhIqy3bSf57s/650yZu8UE1tXE3M5I7UwIY9M+QR1jdC
+TOUrrG7MM5WHWz/8fub7xpPq6k01MQ4XzMXCcr0hu6Xat6PtMu10by2z7O8q7W0+15UW9CIloO2U
+76VJn/+ZM790gazu26mPD7rd+WrSkwT311khzT978jxn+ugif0OBwgWe41BR/oVlR0rAh3dNfe1Z
+6qoNqorIJ4c9Lk0cWbXWXrnRsW7zlKafPG5H2xf5GWqU294WLLi33Yl/y5dbCehEraZ+r0oerqpc
+86G78ePHj49/nPX6ckj/K3lNrMMVV8nbgoU0oM2D71z4Ub1hcqG3lFf3dzpfmWUgqO/Eau7uQRXl
+/y4Ko0Tv07QPqnZV+fL3DxMzrIZnT9W7tdSCj0HQcSHwyWH3Yyai3Bljbi6xABAEBapqlDs6/wjq
+LlnMIM1HPXvuH6AoRNtP+5YtmnBrmcWrzHkNu5xfX56nqYuHIhVBm+OkHzZq8I5x2kKSqQjZFFJV
+rHx63Lv9jN8/1xYxqlqx9tocowd7B5pfDzIBJDgRzx/nGQoQAbqDoCtctBnx7IyfuiqGbzS122h4
+b8f0VHNx3ZaptHr0g+u9+OkNu2f0PDjCsJUrbarWTaREvsdYZqQf0oRTZqLabxxbf/XuSpvbesI7
+w3pEnoskRSZm1JbE2egHHpj7u8o6UwORUORreE4mrlxlc3+X89PjXq8yg4Vc59EwHz/4E+WmKfnu
+Y0lL40G34kDjawFGnKhcZfv4wCzQMiYgqQhdEMQYDIU9kuktdKXPveozns7BIwcnGOko1tgpVtsS
+s8rVtqrKKHm4FTNiHtkjuBjB28sOoy7a6oKj6YhHSaiZQJksRz2GvOotLfSSMlSyTMzp2liHlxeD
+iXbtRkfl5il346bB9d+bSxVRdoyJdqI9UDrKTkCtSh6ZYTkc8XRoS/LhqEoe0XrSBwp9HUX/9XU/
+S/aHC/DxviTEDAlzdAftlGofNxENBFxdtb6nIYHyxL5+uxMuMMvzc/64SPJ6Gg6p78TwmwQ/2u/a
+31mMWLLAx7i231DnoJGOQJBIS29LCmw5RGyIQ33cNMZmuzQ1W5CDUvaAZUHmHqk27A4Y6aDliptB
+oolIYGd6WzNwVFW+glonTEWYQsY40duSWr/NiVctx7x+k4mLA4yJAwcw1V7703SLYWWLzOOl2sL7
+prN9z/PBwRYgoSzMHHLNR2fzDbvM/PBmNbaOHYpNWHbWTOw+7LNfTETZ0/TZYxwQeur3qRXrWIeS
++WbEiSnYfUCCpurLiRUR1hplPG/BIQhCuP4QPqN/uuVwQgQRFAl4VhxkjK84r67e2Jbke14mzrQf
+WbpQFjVaq/rryQz8V/4CzsQaDD1tJmLxMDXPVULSVIro6DFaArcT/YkQmcdX9letiOYJ+a2ItGk8
+5Aa8zt+DHu6buV6ihUCuH6iTCwLC4tFJeJkRzFNOgJ21ATv3Ff5jMzFjL7jy3hYuJGOMuXXcQK55
+wo6QIMCTSYFzXEHd1xfnuYwBHlUw4k3ufE3dLlbjxfk5LGjbSR9I05k7gVBiLV8yIBK4fv4HRP/M
+lXgiVmYAAAAASUVORK5CYII=
+"
+             style="image-rendering:optimizeSpeed"
+             preserveAspectRatio="none"
+             height="22"
+             width="22" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_synthetic_brownian_motion-24.svg b/pixmaps/src/gwy_synthetic_brownian_motion-24.svg
new file mode 100644
index 0000000..ad3e797
--- /dev/null
+++ b/pixmaps/src/gwy_synthetic_brownian_motion-24.svg
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8440"
+     version="1.1"
+     inkscape:version="0.92.1 r"
+     sodipodi:docname="gwy_synthetic_brownian_motion-24.svg"
+     inkscape:export-filename="gwy_crop-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="26.569152"
+         inkscape:cx="8.3921436"
+         inkscape:cy="11.749994"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                           </sodipodi:namedview>
+    <defs
+         id="defs8442" />
+    <metadata
+         id="metadata8445">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-18.260046,-276.07986)">
+        <rect
+             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill  [...]
+             id="rect4523"
+             width="23"
+             height="23"
+             x="18.760046"
+             y="276.57986" />
+        <image
+             y="277.07986"
+             x="19.260046"
+             id="image6241"
+             xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAIAAABL1vtsAAAEm0lEQVQ4yx1UWW8bVRS+29xZPZvH
+ie0kjp3EWVra0gJqHwo0qEIICR5445FHJH4SP4UHhISEkNpSGkqjtkkgaeI4Xsbb7HMvJ8xI8zBz
+zznfdgZ/t6zpBB/GpZDyl0m+rdPzTBgUX2TiPYPVOXEolgjdMtmmRpc3fW/TYxqb/Dvxu9Wrl33d
+N2hXp0dJaRIcCVShmGDc4GSFE5Pizz01FrKlUoLRls4cjTGdcZMbgVndDdYetoq4SCYJXVKIQKjC
+yJ5B32WCYUQxgntRylkpA4V4DEP95oZLVeqsOXrVEIWwmpUkTDBGzQ9XaE0hT+dFg1OVYEDR1lgq
+oAWC+TrFDiMdjWoE86KEmdk8G70eUs4qdQvoiFIWUU7vWWwu5LyUnzgcwCv4mvkNg30TaAxhhSCQ
+5iAqPYw8U2l/1lFtNV9kiOBslmWzdNFf0McuDxi5azEYGxbX4B2GB4VcUQngepdei1pI5AMji5dp
+GR6NF5dzCVcpo0FkBAYD5QB2LxMgfi7RIBeBwtYYPozKcSEoxgDty12fMDo5nZwMokSgO11vfjGv
+NO14FIm8pD9sOUlaAu1/ErHMya7BLjPxV1QWUlqM7Ls8EfL1IJ5NEpjUrBq2EBjj+p16/f06t7jq
+6qwXpqClVogNjQKRv6MCXITJHiMQDatuaUmhjeKKqRCFRpPEqVuQCClRmZXBXg0hxIaFWFbIRlWf
+TtMmx13fOhjEQD4sBJg1OJ91H7YauiKFhBrd0y6eXoQnIbRWTAWk5RWD7Tqq5mhSiEbXT8NEdbX9
+m0tlWpw/70VCur6OKc6jPNgNCCOQBaYyXoF0GZqrabU2Iirb+XonHidlXnod7+y3U7WillkRXS2E
+RPW65XY8MA8gpLM0uorg2Pp+WzF578k5PIvpGa8/oN9/2rJXbdVSrQZg4+k06/95+eu7eccFkKpR
+M+NhTDldXC7AQmCueTrA8Tf9SsOenk1RdkFgQnUngEODVwMYCCYBL1DnKEyvs3g4SKfp1UG/SAun
+5dgrNmwRpIPpSv9FjyhE9RsEivsHfZDHXDIhs0VSAJGtugnb4aw7vx9P+hCBVdtpuTAMggvnwcvr
+SZ7GDWVydMyaHzX7L/rQNV/kQBiwXY3iUS4tiiE/YDDEYXAcwi4EN5eCncDb8iHUIBacB2rehsdA
+JOD87McnK/dXASG0H+byFuwlp4DI5gS6F3HOwT+Tn/x8PLuYUYWKUrhtt7V/g1XvMm9ve/jiVXWn
+aq/Zw8OBv1293V/ogQHK2WsOuAvgg3YtPB7DUoAQ/69ZDqx1X6dWG4OpMgs1X4fAM03pfrUDu6ze
+XwXPp6dTWCdoRMj1/wPeLN1eBqVXHrSxWlucvQ2PQ6I8MzqPCELSWt9b/fgmzGQqbT/a0FwdfgRU
+Y2UuirT843QG0YKv1W4VeqXhAlPVbLbgjRq0RHzJiF7nnW/L8XMkcrsWy2wc3IPcm6OnP83OphCZ
+Dzwtn2faNuyFhDLFULLhm2ScWE0PSkTcY1hxyslLhKlIesRqKatfiOmbcn7ibq2n0wRSNH47gjKg
+QFUGJczfBnKKN5PJFRIptbf/AzDEWpENV5j8AAAAAElFTkSuQmCC
+"
+             style="image-rendering:optimizeSpeed"
+             preserveAspectRatio="none"
+             height="22"
+             width="22" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_synthetic_columnar-24.svg b/pixmaps/src/gwy_synthetic_columnar-24.svg
new file mode 100644
index 0000000..27edf92
--- /dev/null
+++ b/pixmaps/src/gwy_synthetic_columnar-24.svg
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8440"
+     version="1.1"
+     inkscape:version="0.92.1 r"
+     sodipodi:docname="gwy_synthetic_columnar-24.svg"
+     inkscape:export-filename="gwy_crop-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="26.569152"
+         inkscape:cx="8.3921436"
+         inkscape:cy="11.749994"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                           </sodipodi:namedview>
+    <defs
+         id="defs8442" />
+    <metadata
+         id="metadata8445">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-18.260046,-276.07986)">
+        <rect
+             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill  [...]
+             id="rect4523"
+             width="23"
+             height="23"
+             x="18.760046"
+             y="276.57986" />
+        <image
+             y="277.07986"
+             x="19.260046"
+             id="image6326"
+             xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAIAAABL1vtsAAAE5ElEQVQ4TwXBW4ycYxgA4Pd9v+8/
+zz//zM7scbrW9hi669QW1SyREocGNwRFIkLKjYhDJK4khAsS4g6JUwiChvTCRVXakNKiVacW7R5t
+u7sz05mdmX/mP33f63nw4D2b9n238GU9jjRLhAOv7ByZ2sFxNapV025y7K1f6vOrX9TjI+00EFhN
+NQIQIgMDQCAokEjMPB+reqqnAuPPbx8euXaKnEFAwyrk7II9fsPaq/ZsfWDMTzVXU20THn3jxhMf
+3v7IkJMxCITpSImbs/STWjyVN9767E7ZN0FmoHtL3D23On++vdhqza8CodPn7j2+/ETF+/TYJ/76
+S93Rrdfeu/2Je0atb06djhT91Mm25oxBk4Rb0p25dOVw469fVZoFY+XSpvLQ5cOGayBhxaKnDn1A
+bgXJIP9Ckd8kCxc/9PmTAEBzkWorPdXvoFlAZ0CnurTtdukWAFE6rt3nsGZAmPQMUZwEYQJKznpo
++GgVOW1f7Rt0cDWZi3UwVuBkFVgbfevTpYOchSj9pN1Z/nWpOdtc/GHhwVvWqvY0J6vkDgOwjuu6
+tyL8dTeNeEQI5xL18qEFQAGAWfOM8Nd3ax2O6+FKmITJ8f3TT/9+fu7wAll9wErHjXRhn+7MIJnA
+atfHLxMBAsBsrL9+5L20dko4fbozK20JJGsnq/lKvpbpu/stx7eYNasEdIzSQyMAREBx5rMPcMAg
+xTxqCRNhJdW7B+y77pt0is78d3PVf+v7G4lBaCMcD7MDx97WUR2QQCcoXAZN9uCWifvxusA42VWK
+2RMIAOO2+C3MMoaiRAKwCA2EoqSlRLcVvzKeu+vLF9EM0PABxaPb7v6rq3BX0TwRZpHmoiSLcMIT
+i7G+zJMK4HRPeQJP91RbaQBIGGxCifB0xS26xn+d5MOVKBCI23KypbieaoEYSHxx3C9dVEbAcCXs
+1sJXF8KCpGqq24pdwow5Yehp3u4bZxOtmCUiAUA91YhgIsSa86N5YNCZ7p8YsAv24yPuSqq7miVC
+xaLNnmxk2kSYjZUGbik+EymaiZQj8CJHTnoyY4jbiRXYVmBlcSZseS7R51MNAIqhJCllqJiipTjS
+3Mg4kFiQKDd78vF1QaOdfFWPLMLdPy5f8nt9R964IieXU20TFiT9lygE2OgIV6CNMG6LhVgtJ4qZ
+xm2Bf796/drdz4Hhc9JS50+o5p/H3jzy6N5/hgySiD3NJ7vZk2u8nbeu758YKG0qd862D7xw6Pn5
+sJVpg5AZxGvvvwPS47gmS1tRmAA8dDHetrl8wXzzaCPuKm4r2LNlYMOujX0bS91q6Ja9/g2lUz8s
+zMRKMQACkb+O3GFyhrPqYUApCpvJGzXz1vZndmzJSYPwSt9gxaZvsWK76ESNXv/kwCWewQxlgzxB
+Mjz6nDV2C5pFTkPOeqyipSM/k6BUc1vxP71sz5DrDeZYsU6VURy1Kmt0Z76tdMmgWqoBgMg0Oeuq
+1ZOACCrmtDXzzbSZt0obyy+9e0cz44pJfsVHgWZ5A5KErIdmkDEgACL0G0TkruG0Re4IqwidAZEb
+M3OmijJyhs3i4PePXfbsbOedj/5ozjSy5jQgsYpQWB4hAvRJcgUS2mXQSXp2P7ACICDz8j3X2EVH
+hYuc9ZyyqxhOhJlddABAd5c4aZ7Zu+/1xe4Flrg+MEPF/wNBwYUQr2nV5QAAAABJRU5ErkJggg==
+"
+             style="image-rendering:optimizeSpeed"
+             preserveAspectRatio="none"
+             height="22"
+             width="22" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_synthetic_diffusion-24.svg b/pixmaps/src/gwy_synthetic_diffusion-24.svg
new file mode 100644
index 0000000..eedcde6
--- /dev/null
+++ b/pixmaps/src/gwy_synthetic_diffusion-24.svg
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8440"
+     version="1.1"
+     inkscape:version="0.92.1 r"
+     sodipodi:docname="gwy_synthetic_diffusion-24.svg"
+     inkscape:export-filename="gwy_crop-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="26.569152"
+         inkscape:cx="8.3921436"
+         inkscape:cy="11.749994"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                           </sodipodi:namedview>
+    <defs
+         id="defs8442" />
+    <metadata
+         id="metadata8445">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-18.260046,-276.07986)">
+        <rect
+             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill  [...]
+             id="rect4523"
+             width="23"
+             height="23"
+             x="18.760046"
+             y="276.57986" />
+        <image
+             y="277.07986"
+             x="19.260046"
+             id="image6411"
+             xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAIAAABL1vtsAAAECUlEQVQ4y4VUC1BUZRS+77t79+6y
+y8N1YYXdJUl5ZOSkZFAgCSi7YlJIho5ElsZkTE4+ahxn0h6kYupoD3uBbyd1R3FMKStYIFttKoGI
+EMUFHBFzrLvsA4b6lt2YLTBn/t3578z5v3PO933nECxJ4DAksdkoHkkO+2iiSqpbEienczRcjcX0
+7cJJyQrGH3On4/vRhO/M1nCun95wt33cvCHt7JMTfz+1oOdA3v13e++DiOSoY9PGrYwS7Cse8PbU
+SLWLvl4Qd/3z+QXh/ASOCg5lgu5IOfJJCBRhK07YYhQ9l/bVLY5/KkJGEYSRp5Q0Gfw+hqcA6n8m
+p4gKo5gRwgYgIljSUWnu3mNp3phmK068U+XZau7Lx2OBrqBIo4y++kluivIfiDkaDvkHehu7qiwt
+bz4yTWRmhrAahhQpkg+CWB+taH0nfTxLlerkUsOyzt2zcQ9ALB0v79iZ5WmvsqZoL65/uHVTRs/+
+vFwN1/R66pThigA0S83d+qLQc/nQzeoCXFwXy7v3WsoihcIIPoQmicE+u9TwvLf7jPNcmefSniHP
+rco4FYpEXyfSIvUcdcZsdLft9nQcQHXHU3W/vP1olprbZhKvfJAD1qcrGaL3yPwNMQrHp7lvGUSg
+eDutfcefaKvIRF23v1qYKDBAROZX9AJH+ogz8JRfHS1LoZBoniIy1Rw+whgyL5T3Ok6CV3Mo1/Bs
+0l+DLviiviTJ1bTlj7NPvzpBWKMXYmX0aJkJ71XrlQ9z4A5oNnDtG6/jxNEHI6T6peBs4Hpdx67s
+wwnqn9fNuHmyAP/3jaUXIdWXVKdHoT37S1Phy559c9sqZrpbtp8rTUZHkq24/plE60PaQ/HqbA03
+tjvdre+viJRvMym9nUfB1m9bM/FmbiifqmJnqNj27Y/Br1LDc43LpoD/NBXLDT/jh08AwoYkKVp4
+dGescrXep5OrabO/YESHMySYgveGvLelxuXO71f6vYeBQuIAF/ayqT+umY7LVpMo1S0uDOdriyZD
+iOBSi8bJbljzL7+XjZgdscoXdHIYHGLDlpPlNLFKL2yMUZRoZdcOzuuqNMcLtI6jMAXBEDD16TmG
+/guvORtLh9w3XM3v9l9Yi4GyLUk4lRXtmzk4HxC1i+I97ZX5YTwzijAMRf8P69wtO2AWbBBk7T+/
+uibPdDhRg758EP44aA5ITMd/3oO2tXrB+d2LIBsQe+9VwQGfxalO5xrQCAaaKDeI88L4kejRmoFU
+yLlcJwcFno79TvsqJEOzIzYjWsvTsWOYu60mBBycFNJ7LB+uR7N+mwcgoI3u39tpzHOPjO6qMv+6
+KQPLESMHN2IOQPOwwR3VL0cJScL/7UhMNPj+s7bIEsphUgb7zkM7aO8n7m/l/2yqroPmcgAAAABJ
+RU5ErkJggg==
+"
+             style="image-rendering:optimizeSpeed"
+             preserveAspectRatio="none"
+             height="22"
+             width="22" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_synthetic_domains-24.svg b/pixmaps/src/gwy_synthetic_domains-24.svg
new file mode 100644
index 0000000..c2a8bbc
--- /dev/null
+++ b/pixmaps/src/gwy_synthetic_domains-24.svg
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8440"
+     version="1.1"
+     inkscape:version="0.92.1 r"
+     sodipodi:docname="gwy_synthetic_domains-24.svg"
+     inkscape:export-filename="gwy_crop-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="26.569152"
+         inkscape:cx="8.3921436"
+         inkscape:cy="11.749994"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                           </sodipodi:namedview>
+    <defs
+         id="defs8442" />
+    <metadata
+         id="metadata8445">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-18.260046,-276.07986)">
+        <rect
+             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill  [...]
+             id="rect4523"
+             width="23"
+             height="23"
+             x="18.760046"
+             y="276.57986" />
+        <image
+             y="277.07986"
+             x="19.260046"
+             id="image6496"
+             xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAIAAABL1vtsAAAEZUlEQVQ4Tz2Ue1BUZRjGz+7ZG7vc
+AsEIFwQBtQjxGjU6YaGWJiY2xlj+kZWjQzMVmuNglzFrposzjTql/WG3sabbRP+IBaKMMQgNIBZX
+ZUGSuxC7sLvs7tlztt85B2O+OcN+53ue93mf9zmfEHZ3SsO1VRucS6PEHG3dbxeTzcYksyFeNOxO
+ti2OErNsc6+WRIml86xf5cRGJK/suy2N1nFG8Lcd3Z8SlWIxAuYogO+XxAV7v5ZGLkXCvvDU3+OV
+O+JEg86SbROh7ji2Thqpk6dvXj/ycILJIJSn2uEGD3i+2ehvqQAmz/TdXf0UbH1jTZpVrQEFmPaj
+a6XRK60HVyMBaiFDe0cXw99t6/t04/gvJUrIo+KnXf+zyO6unuPrF2kaeVoMQm1JVsPLeZSEVNCb
+3zPf1rA3LxKRleCkMjsWGqwKDVSCVGZHNSIXlnnr9ziMBihSLcZA92cDZzfPUbDFf83lq8BHpBn6
+PJMVg0Lc6T+9Kdj/I0S6qMFvtrJPWbQccTr8195BS65dFOjtwqa0QPcZeaZf9vQEXedWRJs4x2Iu
+tBka+BUVKou7q3JN8gP2ualR49rhh/IcJiHfYap7drHiH5a9t3DhtfvsEOsD1s1DF61RQBr747cn
+06G4x2QAyRBqd2TRhHAw1c7v+hdy5eleJTDxfrqjqsgJfbpVtQqu4xnRin8IFeGJloVWIwVqijNB
+Xq8oaHpledD1rUBLTquR9rRBuGTvgHra3cnMyBilKBsaqlY3J1tXRZvICPusiBJiTAJ/7e+uzbCJ
+mTbx7TQHbRMK8Mj+IjsWfLLZoI5G40Xmm04Hm+DPr08NT7V7G/aVJlkF3TlUwFXhtDMFb/2Ltz5/
+giwRG1EQZjtPAIZCGr+6QAsxLASyZlvmpWeyOSbwmxfY2/OxqooTj8WZtydaocYOb8Ne2TeoR4M4
+r4w2LXeYMAJH0OK0aNH6YWmcNFYf/reNhsN3muaZDCDhRdfTiVbPxV18CxqFalCg8xQBmzy/8/ct
+C3EQdykpMEs1Eerqw3kC1rhvWfdHhfrre81qEO+yzB2TPTcwXgncqX4qYwW50CvoudI8uzl9+TnX
+qQ0XNqbpEzmW7lD8I3NlPN1qSf2p5ej5ZJuqghOEx3tld9jdoc7V00O3pJY+YTm9KCY80Uz2I4rk
+az50IjMGgxmwJt8VkaYFJTjla3p1a4JFbVsfHuYPXySmOMLCOeba8NKDbRUFhXHmZQ4TLo7+tJ1c
+6CYI1N+VZCOFGB6RAwgOT3Xc/nILYFTEiobZjk8ikQhgbCZmPJGGUy0HVqsJ8twQfFfLmC1b3R8W
+8iHRyz9nNxfEmMGTC/WOem8dV06u3cSZ3pNFza+vLEuJ0q+oxv357upSgREcSLWj4vLOHF9j2aEF
+9p/zE/UIUbM4wfrXW49IwzVF8RabQRg6V8xt2PXBoyWJVgpwfdGLQPLID7mEBSRxAIkE6lC2qUz9
+kDiDncSZekzN33wYIeh6PN7i+7P8P9v9oynM2QaQAAAAAElFTkSuQmCC
+"
+             style="image-rendering:optimizeSpeed"
+             preserveAspectRatio="none"
+             height="22"
+             width="22" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_synthetic_fibres-24.svg b/pixmaps/src/gwy_synthetic_fibres-24.svg
new file mode 100644
index 0000000..6fed9bc
--- /dev/null
+++ b/pixmaps/src/gwy_synthetic_fibres-24.svg
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8440"
+     version="1.1"
+     inkscape:version="0.92+devel unknown"
+     sodipodi:docname="gwy_synthetic_fibres-24.svg"
+     inkscape:export-filename="gwy_crop-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="26.569152"
+         inkscape:cx="8.3921436"
+         inkscape:cy="11.749994"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1379"
+         inkscape:window-height="1023"
+         inkscape:window-x="531"
+         inkscape:window-y="33"
+         inkscape:window-maximized="0"
+         inkscape:snap-global="true"
+         inkscape:document-rotation="0">
+        <inkscape:grid
+             visible="true"
+             enabled="true"
+             spacingy="1.0"
+             spacingx="1.0"
+             snapvisiblegridlinesonly="false"
+             dotted="false"
+             originy="0"
+             originx="0"
+             id="grid1px"
+             type="xygrid" />
+    </sodipodi:namedview>
+    <defs
+         id="defs8442" />
+    <metadata
+         id="metadata8445">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title />
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         transform="translate(-18.260046,-276.07986)"
+         id="layer1"
+         inkscape:groupmode="layer"
+         inkscape:label="Layer 1">
+        <rect
+             y="276.57986"
+             x="18.760046"
+             height="23"
+             width="23"
+             id="rect4523"
+             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill  [...]
+        <image
+             y="277.07986"
+             x="19.260046"
+             width="22"
+             height="22"
+             style="image-rendering:optimizeSpeed"
+             preserveAspectRatio="none"
+             id="image3626"
+             xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAIAAABL1vtsAAAEQElEQVQ4y12UfVBUVRjGn3PO/dx7
+d1lBdhGIj0VFndQxEVHRUZIZp9LSGMJJGNHKyWaKcGws/6mxdCo0FWuqqcacbJwUP2q0UrJSQjHN
+/MCUJLFhmBFQGFvavbvLffvjwgK9/53nue9v3nPOcw8A/LY+n4iiHfWZKq/waaGrNQI4MjuFButG
+zQIA19+e7ywPzfBxoNAjj9NE5PYhuDgif39DRPsnj2LAvWOl+yYkyAzBU+VxxJHZKRqD1VZHRC1b
+iwSw0qcBOF0xiYhQ7FWoPxK6WuOX+Uq/Fus6N8WQliSq8X6K9lX6tWmGRETBM8/7ZP7IKGVpkjrV
+kKJ3GogIB6YmEtG+CQkC6Guq6j2xHMCF6rw4wbbuBTTxRoZhtdXlm9JYTZwsGQfgp7JcIiI7hvY9
+i0OXt3gFq05zEdFbmcZoiUVuH4wjQs3bGPBtcUa5T9MYflk9Oc+UCj2y41o3P4d166tNmYbOETxV
+Hmk/liLzqlQX2ZE4oumFaQB2BNwALqyb8eNT4wG01hY77puZBsItn2oc7wVMImp8bsrwk3dqU6Yx
+URcSw86Au+9cdYrMy5LV/mAbEfUeX65zoDrNlSix0JV3bOtuWbI6URfD+2M9zQVuGcAqv0Zkb8s2
+FYZg4xoiIjv6SrorU+UAsDfXQ0Th6x+oDHXTkoYjeo+X6RyFHjnaUX/3aKkzC5FNRMGGSg5U+DQE
+NBHrPu/kQmYINqwaus2O+nxT4kDnwSft0J3S0WqqwkPN24nIjtyv9GsTdOEVDCdLxhFRpP27SS7x
+RNJQHOx/O1b4NK9gbsGinWeaN80FcOLxgON2HS5hQLbKc3WBaNdZImqtLQZwaeOswQHu78pxA5jj
+ked5ZKt171RDyjelaOdZh788Wc1QucJwccNMOC0vpuoZKo/1NjvLE0sCAHaP94zXxZYs8+s5KQCu
+vD7Hca9tnqcymIK9mu4iIhBR+PqHJmc7Am6yY0TUsq1IYVg7Rm/f85gzfJLEqlJdAxsMdS5OVCSG
+HE1YN3cPIA7l+xhw58AyIuprejlV4QVu2frry6ML0r2CrU93JUqs79w6B9G6q1hiMDh+fWm6oyDW
+fX66KS0apRBR+M/PCtxyqsLD13bakd7Vfi3PlAAcfTh9MCZXFnoVAK894IofPLqOlDhPhh3ufiZF
+VxhathYRUaz7fJbKTcGKvUp/X7vz9aWNswDkaCJ84+MhxNoxeprCrba62hw3gO8fzRr4uy5vFoDB
+2a2PFg3ec2R+giwz/L5h5vD4wcXxfo77dMUkAO9mm3Hjh2VjAWwPDCmNz04e2EJ/eARC57i2eZ7O
+8XSyZls9jtrf+8dCr5Khcqv1i4GgdJ7JN6WAJsItn9DIwtIkNUvlDxnScO9wgR+A84I4tX9K4ojs
+DUcUJcg+mf/z84q4FGxc4xHM4Kyh8kFH6axbpjLM9cixuxf/129bPf8Brx8Smm+gevoAAAAASUVO
+RK5CYII=
+" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_synthetic_lattice-24.svg b/pixmaps/src/gwy_synthetic_lattice-24.svg
new file mode 100644
index 0000000..5fce5c5
--- /dev/null
+++ b/pixmaps/src/gwy_synthetic_lattice-24.svg
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8440"
+     version="1.1"
+     inkscape:version="0.92.1 r"
+     sodipodi:docname="gwy_synthetic_lattice-24.svg"
+     inkscape:export-filename="gwy_crop-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="26.569152"
+         inkscape:cx="8.3921436"
+         inkscape:cy="11.749994"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                           </sodipodi:namedview>
+    <defs
+         id="defs8442" />
+    <metadata
+         id="metadata8445">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-18.260046,-276.07986)">
+        <rect
+             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill  [...]
+             id="rect4523"
+             width="23"
+             height="23"
+             x="18.760046"
+             y="276.57986" />
+        <image
+             y="277.07986"
+             x="19.260046"
+             id="image6581"
+             xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAIAAABL1vtsAAAEOElEQVQ4y3VUe1BUVRi/LPtmd8EG
+aVmanXhWEhopohBizgQIpDwEkUxnBOwhVJjThDZaTkONOTROiqZDlqUG+QBWReVhwiywxEtAIByX
+hWXZFwss7vPu3Xv7LpeWhanvjzPnfN85v/N9v+93DkIQhLXvW6fxb+czuTQvYqwiGTwOXSuMtpEL
+ssLI4gCudeAkLKX7XsXROXSsuvIVb8TdcHS2tSBCXp5InnlyEVXdgwlu1epuZl4KE3BpyK3NAU7T
+mH20qiyQZ5IWQFT169sxAsYixNyDdxozQ9rfX2Nu+wDCTvOEqWXvfCLtrQWrA1m04RObYTl7f1ec
+gFG/Pcg598Sha6uN83fLwqYn/jXIqCkr7MpLgsnL20iUycbO4nXmjoMwB9xnzbvhPmNDLiyn63bu
+e569AGEbOm3p/sIkzTM2kTFL73G4n1g0J1RB/JeN/5S8X8jJF3KQj0ScHF/Wm96Mns+jqZhD3WTp
+KoEdA8ffAArI3RXJsg9f6yiK/OvjtZ0H13UfisKme8E/cSkVeEGSVjCD2J6QjuxAJJlw856KUMHu
+lWwRkxbApCl+TAKnvDwBeHXZWh4dsLCpTupKBFjUVKYNlm4C8kgIacEW7wW2PRBkpGwLOJW/pPox
+aO59XONFhytxq86hfoAsq9DcXlj6Is+1FWoBp/ZaBpWpy1JWMGfrd5HoP6cgbftXQ9u01zPM7UV2
++RWK7ZIXuNDOQwHcns/Wg2fmbs5RsZeYtZhIbawQM/RgetnN9X4LrjCOZ+pzzMaMEFR5C85o/kgf
+v5hiHSjDLWqq27ahH0bPJUriRSCwk4E81W/bqMsSfJhLlCpk0Fr2rHJoHrqEYn962SDJsg2XQ3fJ
+DhtH0Ik6VHkbBIabVTP3cuoSxMgyq472QyfrcdvU5NXtD3Nf/i6QF82nfyX2an531fSdnZRqMX3H
+/KQNRmx2cMn5bF8WAEMAJJi7ku0eOhvMt49WAnRDesj0nWzY01uyQXstHRCXQEAVuFUDfaqJEbr7
+obuPDm8gtdt1+IA/R/17GsyHvomP92bUbBQiLp4hW0vPMYg9PZMAbXeHKPTnWLqPUDf7eHooLmwl
+t51+i00dVZzfejdR/ImIC+oi/47BU6eC+MsIgqeM2w12+dUzwXyX3iZceiN5t6itfaV2xXXCiXYU
+vU73WHIeno/hdva8ilLDuaTA+r+MhSV8KKGU3vTVmQBP9dAkzX9PyKH2Ucb39KgK93Go/8RmHks2
+iaCKLF9W16dRFOUNacFQGhLFo38fxGvNj4Bc0LEbQJi+ZgdQ1bI3/NGRjaNnE6ckWfPoeU07QqF+
+s6wYVd13fQXkM6MMioQvz2kcJv7HUKWEwDFqjhm6nWYlqAO3z8BLWYCADxK+L9vwOZDT46/jdDcy
+yVeobVGcT+o7GgMpkEz3n9BUpfcfi4XXgY5LIFMSerz2H59LCzg5KV08AAAAAElFTkSuQmCC
+"
+             style="image-rendering:optimizeSpeed"
+             preserveAspectRatio="none"
+             height="22"
+             width="22" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_synthetic_line_noise-24.svg b/pixmaps/src/gwy_synthetic_line_noise-24.svg
new file mode 100644
index 0000000..7890407
--- /dev/null
+++ b/pixmaps/src/gwy_synthetic_line_noise-24.svg
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8440"
+     version="1.1"
+     inkscape:version="0.92.1 r"
+     sodipodi:docname="gwy_synthetic_line_noise-24.svg"
+     inkscape:export-filename="gwy_crop-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="26.569152"
+         inkscape:cx="1.4103626"
+         inkscape:cy="11.749994"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                           </sodipodi:namedview>
+    <defs
+         id="defs8442" />
+    <metadata
+         id="metadata8445">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title />
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-18.260046,-276.07986)">
+        <rect
+             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill  [...]
+             id="rect4523"
+             width="23"
+             height="23"
+             x="18.760046"
+             y="276.57986" />
+        <image
+             y="277.07986"
+             x="19.260046"
+             id="image5457"
+             xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAIAAABL1vtsAAAA80lEQVQ4y2OYrsxLHkoS54AghlIZ
+LvxosRoffsRwpcEaE73ZFEI8YiBJNU2M+HIkkeH3q2Nko/9gwPD3021i0PdrEyHo29kqNMRwpdEG
+D1quzkcQMawxEAaiIGF2e35W8hADEwNFSIiFkUGenQmCYkQ5IIiBOODIzwpBDHsCVY6l6N7qdSIb
+MZCk+kyhCSZiuFRnBUQnMvUxEVYNWIy4WGOJjI6n6SGjDRbiBBHD6TwjChHDl6OpFCKGxwu8KUQM
+L1YHwtHbLWFkIIZvFxrh6OliXzIQw5djaV+OJGGin/eWE4kYMDMvGvp5dzEm+nFrLhwBAMfW6jnU
+s8CnAAAAAElFTkSuQmCC
+"
+             style="image-rendering:optimizeSpeed"
+             preserveAspectRatio="none"
+             height="22"
+             width="22" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_synthetic_noise-24.svg b/pixmaps/src/gwy_synthetic_noise-24.svg
new file mode 100644
index 0000000..bf42485
--- /dev/null
+++ b/pixmaps/src/gwy_synthetic_noise-24.svg
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8440"
+     version="1.1"
+     inkscape:version="0.92.1 r"
+     sodipodi:docname="gwy_synthetic_noise-24.svg"
+     inkscape:export-filename="gwy_crop-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="26.569152"
+         inkscape:cx="1.4103626"
+         inkscape:cy="11.749994"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                           </sodipodi:namedview>
+    <defs
+         id="defs8442" />
+    <metadata
+         id="metadata8445">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title />
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         transform="translate(-18.260046,-276.07986)"
+         id="layer1"
+         inkscape:groupmode="layer"
+         inkscape:label="Layer 1">
+        <rect
+             y="276.57986"
+             x="18.760046"
+             height="23"
+             width="23"
+             id="rect4523"
+             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill  [...]
+        <image
+             y="277.07986"
+             x="19.260046"
+             id="image6156"
+             xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAIAAABL1vtsAAAFPklEQVQ4TyWUCVRUZRiG/9m3O1dA
+BBkWAVlyTUVDjkKSa4hiApIaZW7nmJqoFKhU5r6TJhbu1HHXJBY19wiNHQdBIFYFXGBQwblz752Z
+O7fXmjNnzsyc+/3/977v833EfG/pCJ289fA01rhVFMUYF9X5oc4nAmmu/jDfejHVS3s7PoirOyT0
+NjzaGnFhmHNbVvRwnbwyJdTBdTk4U/4HXsTafm3zAN1YvUJ405zuT9XtnLDDl5rQR9Hy81S7qXyY
+Vj7DRWkxbhlNydnqfcLrWtvzPytTQ/H80v6a2L4qa8cfZI6rqmZz+Osbc69M9GKKVpwb7JRk0OZF
+eho3hPGNWYcD9E4ySaKbOpxWVH8/fqBaxtVn8i3nfwrQm+8ttlRsQFPkXZ28IX2itf0K33rJfG+J
+/VVN9lj37FA3e1dJZB9Fmrdu0wDdZCdlCCW/FRtg764cqZOv8dSiBbupzNqWv8+PIranN5m/l+Ng
+lEFh5+XYp6dnstV7mdKvylaPHk8rjgbSaLto2YhvvHVCb+OjbRFxrqqHG8dBJq7hm0+T5R4a0c5A
+f0vmNFGwCkw7W5PeRyZhjVscTIfdVGp/WXV3bvAqg8aglP7gT4miQxQ4fEY5K58cn86UrCVwcahW
+ttqgfXk1AaLQbYBaZqlI6/o9zsG+6L09X+ipQ1No/nQwvdBdzZQmM0UrKamEqz04v58a8gkK0K39
+VXV58himZE352jHHAun7i4eZcuM/c1MzxUkOthP172hk5oLERe5qB/8KPb6+PhdZwLUIWkFyww2I
+4LfR/XxV0tKkENuzOxeGu7SdjL6TELTJR7fbj8KFPiopMnaRS9BvgqsKlyOB3jvzn5+bBWsIWIBP
+0IZTET7OAlp8069d2XFXJnmzD3fO6qsqSwqBf/8ZHGLrKkJMgMBSlgosRRtD7n4c3PTjZMTZcWrm
++SFObNWOruxYW+d9eIYgmw5OrkoLK/5iRHtWdE64R3PGlAepofizZOUoGSGZAXqESLrz5igkBMBZ
+jJtF2xuUeSqlB/z17KP9BYmDV3hokLr18eXVnlpz4edgHC3jDY0woufWvJzxHgRoHg3UeyulcASw
+Wyo3Cr1NUkK42gwE5OBfigLPN59FLo0HJvHNZ0RRmOmiUkoIqj51U58Jpgleg7Wy/EjPb310aBWG
+cQ3H+ykk+/31Dq4bvLMPdyGa5xc+2utHgQAvpRRetGZOA51yCbF2XCfFy0eCOcT75FjUOPrt8Ni7
+K2wv/nrrS016mF6BP53lEgyL6LBFuyhFm9lS+R1IN+XEW8rX3U0IJphFNAJXciMMee8bUAPl230p
+cHUjxv/aVJ9rHw6wPNiEZ0w5cdlh7pg3wfz40ihXjZSwVdsgmdRsCd/jR/ENJ4ENWF7moeFbzqGy
+btcEY1oYIixZMbJwwRCu4QRTljKKkkOj0FPvsDx9fCzK2n61cf8k0p0bj5B2+lKYpRQvbaBaBrSA
+LBDMGKhf760FfwWJg7j6I4gfu8NcuGibL9WdP6fn9jyoezsjEHIqmEaonZdmg07oBM7/L5XF/TUV
+yWNuzQ5oPjQFcwgXQCrE48vNmIExfVWgDs8QYKuSEOP6sVlBNLYYfIJILALcXPDJIAzVkv4a5I2w
+8ZNv/MXalgtkare//+xsjGhncR+BmPo9kZCDRHB2sqcWC+bFxdlNGVOsbXmYt7rdkfAY2/RLg6bt
+xHRLWco6Ly1oYopXXZ/hh21AzIUL4QWixixDFC2TgBwswYlOSgwOsjgZRIMUOLfAXQ2l3D9HnhyP
+wk7G6Rjuyq/f+xd9brY4S90M/QAAAABJRU5ErkJggg==
+"
+             style="image-rendering:optimizeSpeed"
+             preserveAspectRatio="none"
+             height="22"
+             width="22" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_synthetic_objects-24.svg b/pixmaps/src/gwy_synthetic_objects-24.svg
new file mode 100644
index 0000000..bc9eab5
--- /dev/null
+++ b/pixmaps/src/gwy_synthetic_objects-24.svg
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8440"
+     version="1.1"
+     inkscape:version="0.92.1 r"
+     sodipodi:docname="gwy_synthetic_objects-24.svg"
+     inkscape:export-filename="gwy_crop-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="26.569152"
+         inkscape:cx="8.3921436"
+         inkscape:cy="11.749994"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                           </sodipodi:namedview>
+    <defs
+         id="defs8442" />
+    <metadata
+         id="metadata8445">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-18.260046,-276.07986)">
+        <rect
+             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill  [...]
+             id="rect4523"
+             width="23"
+             height="23"
+             x="18.760046"
+             y="276.57986" />
+        <image
+             y="277.07986"
+             x="19.260046"
+             id="image6821"
+             xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAIAAABL1vtsAAADDUlEQVQ4T1VUiVbbMBDUiXM4hhQe
+CSm8tr/Zv6UkscMVfMWHru5KNgG/fRvH0szOjg7x92H2K+K3y2nykCzuk+Q+IY5UWQVRZyXkfWf2
+vZ1QWhgLL7vepp2B3DsSHrG54DeLi/gujtchFoxTJhkTITjLSkm1oGRpqKAQRFICL0BXW6QRq5kA
+2HwdzwPFXcwjfqYIL1kJU01vBDUSKZBLMrLrbG6cx3+RIJMVlYt4s/1GIRnggYWlpazINy2dEVh8
+NeCj5Q2b39PoB2FyRrfYhSfigqlGMR4UVSJvgxYZiIJ4yJPrJZv/ZLOfbLrCMkxMofrgCOvLHhsc
+/8r3RqAKryjgZ7eXUJ/N7kMGFT4uImDBXnh7bOT8zAghXmrJKPoCXUAvAziwxL9xraxypqF9zqNX
+WCOYM7maMMnPBgFLVmEj1jjTGRaVrnu3fIrFAX7a2trHaVtnFSzdAspMV4lI0Rog4qMcsKbY5lab
+eG0jq4jtCWZlm0NgOT3nqtGw3zjYBE4zkYjduFjD2otyW1htIWJtJyDeauc0Kqp37duxeW+Sh0ux
+uMMe4z8gECZMrnRfduguZ7i1im1hPIUPM7tFFU6V3fG1ykrd6PajFZMD1McG660u03H7Y67SUhRP
+OQhHvBqI5msF7lT+gPRFN2hcWwE/zSHABnxWvVRKpEW/0vlXCnwxLtSBRqyxRpnAAorgY30Y8G95
+C+dNPHZGObfxpn5SEDoe1uf6zK6MqhVIqFIc+nhv9h2cXSP+tWAF0Y5s9mWwAzKXDKWm1fHtNNqE
+4RtEfPFS7/wlsPcqwD0CQiBvDnWwVk4lzMvfTk+g8SuLsYEigEHC/rMRhStJtHX6FQHRIioP1c7P
+60Cjba23AxYF8CkgOzuwwElN+7ATsJegRR/bZa1CEbgRagOj+H2tc37BD43edaE+jr5qh6v9AvvA
+mgGP4VrrfAULBXNDxyE3g/5HC2A0U6hLhPvvwzjV2oD31pAwFXqJKPmkTjgb1HmW4e4k4wMX4WNr
+lB0KZqNbsIeVtwnytXCfFpgR+B//jR7IbSRGZAAAAABJRU5ErkJggg==
+"
+             style="image-rendering:optimizeSpeed"
+             preserveAspectRatio="none"
+             height="22"
+             width="22" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_synthetic_particles-24.svg b/pixmaps/src/gwy_synthetic_particles-24.svg
new file mode 100644
index 0000000..7a249f0
--- /dev/null
+++ b/pixmaps/src/gwy_synthetic_particles-24.svg
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8440"
+     version="1.1"
+     inkscape:version="0.92.1 r"
+     sodipodi:docname="gwy_synthetic_particles-24.svg"
+     inkscape:export-filename="gwy_crop-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="26.569152"
+         inkscape:cx="8.3921436"
+         inkscape:cy="11.749994"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                           </sodipodi:namedview>
+    <defs
+         id="defs8442" />
+    <metadata
+         id="metadata8445">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-18.260046,-276.07986)">
+        <rect
+             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill  [...]
+             id="rect4523"
+             width="23"
+             height="23"
+             x="18.760046"
+             y="276.57986" />
+        <image
+             y="277.07986"
+             x="19.260046"
+             id="image6906"
+             xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAIAAABL1vtsAAAEnUlEQVQ4y3VUfVAUdRhe0NNGnMzM
+Js3+cGqSgSijkRmmyRKnmppiJFHLwQYzmTEsG2aCdMzBNEBEDTRTQEGRBD0VwSCGDwX5yLvj47jj
+Du6Eu0M5vM/dvc/d29/+3n4rimj1/rFz8948z7Pv87zvUtTD2vhxpG/kMg5YASPAIdFn4Y2lgi4f
+0QMg+EgTcy5sb1dWbsTmMsToMWfH/nFwdk0xUO/HLfIPn0KsEUIs5mnMDlrasoPq/cjdD4KHkGLO
+GZpoBXVmaLyR4CUlkRM9RipiVtgkRXgYpTqzCRw1wKoEexc2lTceS+o6lSRYLonsEPZZCJegO3pm
+z3vieJ2kL3KEWmQGqdO7VxP8JM1LC+d8s/7Ny0UbQ/0/84Zit7bMpjwc7N2F9Eew6XRQe4hT/2Jo
+2MFpcgXbTaKPmEGYuEqZ23Pefu3ZqXFkM8PSPouBiSpEayVlWhswVp7NTvgjby1Ya5BTgRx/86NV
+QXU2Nh4F0+GijJXUHVXJqhVLpihmyWaczkkGVoF5tzQ/T0sYdTav/w15DBBipA6ttXTkx0c98wBj
+6ToSH7NwOkVZ7nrw9hBTARDBEGVekxMyV0lhgRQWeTsinBD3ULjx+OeyGdT0kgaxykXWQDCIHQ6M
+VDcfT7KpCrFnMiy3yGjNHfmxr85/AHh96bzJHySaLYmRx/ckns1bF1Jm4tsnhbELnOGkr3d/a2mK
+tWWHOFYNHhWZEaznL+V98phs2P08SDS0+ndw3gBHm2iqkBesHb60mTeWCdZmbL+BRiv0tekVBzYQ
+p1I/jX5+3mzqiSKhkGiQqx9zDuBdIqPz9BUEtIXI1TfZQYwOzCdWRL8gmxkeHh5G/btIKMQh4hOI
+IeIZcYEfPcebqrHPPNUB99XY6Bep/6u4qAWmjsMiq5eCEHzYO8qojwX0xeQWpjpgLo96+bn/xi9a
+MDt22Xx1dSpvlgPTD+wAWeHOs6l3Grfx5guiuw88GuFu3d3rWZlb3vlqTcwriyMew+9KWd5W+a2i
+br+je19AmdVzcYe+PksYzLV25zM9h4KaPLr7p2untov6AsF0HlxNcO9C25m0yCVzH1GIw0VAK8Bn
+FGm1MFopz/uwtSQFJhowqyfXFbI2M4rd8gMfgbVW9JqAc5AnGr92uSDxEQW4ruOgjZwd5hnk6vX2
+7vVrC8kJgeAHFBB9ZnIRXuVOsqMQ8gCIILDIpeys2j6NgukCcg7kP+RHtCaoPcgZigkSMA9YwIFx
+fuyKV5GFbDfJ90JS4lzI3tle8fU0intyoknCF/1j2NZyu3br3dYfgVbh4AR5O+RSezWFF3NWiyMl
+yKmS5nX3+nUlB7fHzZ0jezpipkRRX5js1pSCuwkcVwZqMuKjFnzxwTLHrQPgboCJP7nhk96evXUl
+6SH1Pl5bMNCYa/hrJ92yrasirb7su/LcdcnvLqWu/LrhVvmGjC/jN695I+b+vZDdS3hr8abE5bVF
+awO6Y4KtA3w68o2BkaNbk6LP7VnJDxUDrSRNYDqCfTkUuQj/UNnB7xOekj25tg0nUoR7bThoJ75K
+T7ojO33VWOsPolNJHCHeSSvravoH5iBuzDbGoQAAAAAASUVORK5CYII=
+"
+             style="image-rendering:optimizeSpeed"
+             preserveAspectRatio="none"
+             height="22"
+             width="22" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_synthetic_pattern-24.svg b/pixmaps/src/gwy_synthetic_pattern-24.svg
new file mode 100644
index 0000000..cf0f0b0
--- /dev/null
+++ b/pixmaps/src/gwy_synthetic_pattern-24.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8440"
+     version="1.1"
+     inkscape:version="0.92.1 r"
+     sodipodi:docname="gwy_synthetic_pattern-24.svg"
+     inkscape:export-filename="gwy_crop-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="26.569152"
+         inkscape:cx="8.3921436"
+         inkscape:cy="11.749994"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                           </sodipodi:namedview>
+    <defs
+         id="defs8442" />
+    <metadata
+         id="metadata8445">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-18.260046,-276.07986)">
+        <rect
+             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill  [...]
+             id="rect4523"
+             width="23"
+             height="23"
+             x="18.760046"
+             y="276.57986" />
+        <image
+             y="277.07986"
+             x="19.260046"
+             id="image6991"
+             xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAIAAABL1vtsAAAB6UlEQVQ4y2NggIFv5+v+w4ApDwsD
+Bvh2rgauwJwXiwKGB7M84Srq5bgxFdyf6QFX0IRNAcP+MDW4iu3ucpgKDsdrwxV83BMFVA+0Feh2
+hIp+JR64ilu9ThBBOXamDAnOtUYi58vMft5b8R8bQBixSlsAWQLo8z+vT/0nAjCcLTZ9tz385+0F
+//98+08WYPhPLrjebg8MdVDc4VH079vzHzemv94QcjLbcJk6X6Mc97czFXDZFAlOaBDAhX6/OPjv
+1wc493KDNWaknCsxhStYocEPFV2pJZAgxiHKyghk7/RUgKsA2oxpxBp9IbiCU7lGWJIGMP7gKoDu
+x1SQhqTgzSYsCkCpAK4CGAqYCqTZkBTcnMmAFcDTAjAssSr4/eoEVMH3l6oczFhUfDtbBbfHgpcV
+TVaKjen71X64gq/Hs4ApECMvTXeHq9jqKCPPzgT0PzAUgXHxfmfEzzuL8CVwIPARYvu0P5rk1Hmm
+0PjdtrAft+f9+/mWTgn876fbcPavpzsLpLgIGAH0PDD+gakImBbjxDhEWBiBQQN37++Xh1ET+MvD
+X0+XPF7o8//vD7hgpiQnZqwBfQ1XIM7KxLBKRzBJnAPEggFg3oerAKZ9TCOAYQdXANSLJWkASxC4
+CmAOwlQAjAG4AqALABGESq8liHXKAAAAAElFTkSuQmCC
+"
+             style="image-rendering:optimizeSpeed"
+             preserveAspectRatio="none"
+             height="22"
+             width="22" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_synthetic_phases-24.svg b/pixmaps/src/gwy_synthetic_phases-24.svg
new file mode 100644
index 0000000..d90a66b
--- /dev/null
+++ b/pixmaps/src/gwy_synthetic_phases-24.svg
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8440"
+     version="1.1"
+     inkscape:version="0.92.1 r"
+     sodipodi:docname="gwy_synthetic_phases-24.svg"
+     inkscape:export-filename="gwy_crop-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="26.569152"
+         inkscape:cx="8.3921436"
+         inkscape:cy="11.749994"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                           </sodipodi:namedview>
+    <defs
+         id="defs8442" />
+    <metadata
+         id="metadata8445">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-18.260046,-276.07986)">
+        <rect
+             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill  [...]
+             id="rect4523"
+             width="23"
+             height="23"
+             x="18.760046"
+             y="276.57986" />
+        <image
+             y="277.07986"
+             x="19.260046"
+             id="image7597"
+             xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAIAAABL1vtsAAAA7UlEQVQ4y5VUOwpCQQwMNoq9pVZ2
+XsIz2Np4DsELeAhvYmdtLVh4CEFsZB2MxrzdfHjTPLJkJ8lk9lH5gH7g8HHe6bBNANaTUeeozeAQ
+XHFCTuElkEbfLgxwxnY6jklFHaN823lV2Rie6Hk9/M8DzTlEg1UCdlEU7N7i+e2cy35Zujiu5un9
+L0Vx4KkrShlaALPhwCv7ut/cRvgDhdPJ5eS0WeiOqJd4fEd3ZBSBiuZQmqimEJOkS3X7Dd6iCCTu
+sh3ovZF405ilpjCd690XvQB4MinbOlX72PWs+a7zv1bqjiq/s/KUAtkBO/bwBhJtx0U0p5PfAAAA
+AElFTkSuQmCC
+"
+             style="image-rendering:optimizeSpeed"
+             preserveAspectRatio="none"
+             height="22"
+             width="22" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_synthetic_spectral-24.svg b/pixmaps/src/gwy_synthetic_spectral-24.svg
new file mode 100644
index 0000000..9142a38
--- /dev/null
+++ b/pixmaps/src/gwy_synthetic_spectral-24.svg
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8440"
+     version="1.1"
+     inkscape:version="0.92.1 r"
+     sodipodi:docname="gwy_synthetic_spectral-24.svg"
+     inkscape:export-filename="gwy_crop-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="26.569152"
+         inkscape:cx="8.3921436"
+         inkscape:cy="11.749994"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                           </sodipodi:namedview>
+    <defs
+         id="defs8442" />
+    <metadata
+         id="metadata8445">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-18.260046,-276.07986)">
+        <rect
+             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill  [...]
+             id="rect4523"
+             width="23"
+             height="23"
+             x="18.760046"
+             y="276.57986" />
+        <image
+             y="277.07986"
+             x="19.260046"
+             id="image8083"
+             xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAIAAABL1vtsAAAEqklEQVQ4TyVUWWsbVxSeu8yu0Wgk
+WYvl2LEdO3FCvDUJoRSah/YfFAJ97x/Kf+hzIVAotIVC6RIS7DR2FS+y40Sx9hmts8/c26NUXMRs
+95xvO5c2nn0lGXKmkpHzFYGz4dnV2fOT44POhzDtxSzhwppCFiUcc2G5oO59t19+/ETAlIdDgciI
+SFHvDW38eKaXM+XdqlELYzdO/Li8W0EYKQftQcLClAeMe4zLGHHOB/V+Gv3KYsYZ1xb07I0sfEl/
+r9uobm+9+GiUdDkr1x4tVfer2Rsmphi9vBYEYXmjkKkaRCJUpfEsOv7+6Lwzg7o1mVRXc9atAlWw
+0PDTUz/BdriXEcvbFaVYki2/vDPDIjFXzLWvN0h2k4XO5PLi9Ie3v1yNnzsh4Lohk1U7vFu36Zal
+MB60IqDNqxIGeNCZJ5FW0m+W9fy9u/LatyS3lQ7/NcJn4SxsRqwTMQkjxgUQC/kJrT2qae+GQEng
+QnYpKxuSP+glfqLmVa1SE0ufk/wuFCWFfWLekTJ/mQRtqnRFwds61TCCWrS0XQbmsMF3/DRKYUXT
+SCtqolXDSpmnAfe7SC1DFaRWzOXcjt5SMQKbbi2oWkGD59TtupggURNjL4Z7UZeMRYNkV5FkMq+d
+jus8GNDqEx67bHySqWZ29iorgJpifUGHxuAObfx0DviTKGUJkzSRyARhzKMRC3qji9aw4WQqrcKd
+v4Ga03DAdbDcWs8H4wDBD6NgFNDTvr/uJ4Af7rO1rGKpgeOHk/fgvG97w3fD3hHqHLYRQWmYguvW
+RsFatbyBB8vtztIooSnn4zARey5YCOYTmUazaNIco0/swlHg9r1+vQ/XeglIykTEXBBAuN5R1zm3
+51oETIClfSKWhOnk4xi6hdMQCXOknAvQ4Dpk2E82vdioZQG5d2Y3/2xetGfXEbMoom+9RMHUXDYL
+t4uDt30gDP2VnDLPeE6VMlLO8QEupADwzqk10OTjZDzw/vclByX6n2YJwqtXMkBvcj0RVRGu9aKW
+XckBkHn19yP4CFMQGnu2B9WXdspqXqMyoZpIvzDF7QXYJGGMgG1u1SIiyW8UStuLtLDPU8jIC/W4
+C2FJwySchMBRK+rFraK1ZhGJYgnTb57eM1ctSRcRwVShokLThEF5rC0hucjdZuzHYL7AOegNclJV
+VCwFtJOzShqnYDa9/fRLeD19fwkuDE4H3cM26AhjquTrpH0KXnRfd3jCzJs5o2YABRB7HoehD45O
+mhPARQUWh06n/fK69ar15nJ05CbrCtHPbEja+GrUqvfthC1lJL2sS7oEACHN81D0XfvMfj0MZymj
+Vz8fzFrT9mH74Hr2chqnXHhoUNlUIO/T1hT2wxOeMrfv9o57sNk+6dujYJjwEy/5bRw7wLr5xweg
+yiKwTCiI+L5G9x8vLdxbgBLBSm45YUmQqAUN/iHsvuOF0wgiYxABzos1hcU+pxBnOPhgfj4TnU3H
+X7xfqj5YVEwFIgSzA/1BMDjglLwKRa2NPJxgILbbc0eXw63D9j+zmAoYgU6Vveriw9ro3QikggVJ
+h2hAc2vdgmGB2QW/Zu0pJDi39Qgba+nwuPPiFbx6cG7/ByixsgwJXiezAAAAAElFTkSuQmCC
+"
+             style="image-rendering:optimizeSpeed"
+             preserveAspectRatio="none"
+             height="22"
+             width="22" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_synthetic_waves-24.svg b/pixmaps/src/gwy_synthetic_waves-24.svg
new file mode 100644
index 0000000..c4af483
--- /dev/null
+++ b/pixmaps/src/gwy_synthetic_waves-24.svg
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+     xmlns:dc="http://purl.org/dc/elements/1.1/"
+     xmlns:cc="http://creativecommons.org/ns#"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+     width="24"
+     height="24"
+     viewBox="0 0 24 24"
+     id="svg8440"
+     version="1.1"
+     inkscape:version="0.92.1 r"
+     sodipodi:docname="gwy_synthetic_waves-24.svg"
+     inkscape:export-filename="gwy_crop-24.png"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <sodipodi:namedview
+         id="base"
+         pagecolor="#ffffff"
+         bordercolor="#666666"
+         borderopacity="1.0"
+         inkscape:pageopacity="0.0"
+         inkscape:pageshadow="2"
+         inkscape:zoom="26.569152"
+         inkscape:cx="8.3921436"
+         inkscape:cy="11.749994"
+         inkscape:document-units="px"
+         inkscape:current-layer="layer1"
+         showgrid="true"
+         inkscape:window-width="1920"
+         inkscape:window-height="1028"
+         inkscape:window-x="0"
+         inkscape:window-y="33"
+         inkscape:window-maximized="1"
+         inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                           </sodipodi:namedview>
+    <defs
+         id="defs8442" />
+    <metadata
+         id="metadata8445">
+        <rdf:RDF>
+            <cc:Work
+                 rdf:about="">
+                <dc:format>image/svg+xml</dc:format>
+                <dc:type
+                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+                <dc:title></dc:title>
+            </cc:Work>
+        </rdf:RDF>
+    </metadata>
+    <g
+         inkscape:label="Layer 1"
+         inkscape:groupmode="layer"
+         id="layer1"
+         transform="translate(-18.260046,-276.07986)">
+        <rect
+             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill  [...]
+             id="rect4523"
+             width="23"
+             height="23"
+             x="18.760046"
+             y="276.57986" />
+        <image
+             y="277.07986"
+             x="19.260046"
+             id="image8168"
+             xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAIAAABL1vtsAAAETElEQVQ4yyWUa2iVZQDHn/Oe+3nP
+OTprzbk7m5szrVC7aWUoTtG0y5eZfQm1xBAhk0SYdkEmFWI4pBQs6TJ1aCYkDlHSIJupszTnbW7O
+sR1bm+5ybu+93/OefRrvnv2f//UR1minne639RHHNhx+LN1O9xmJ0+m/PunZt/jk0orNJZGnVJ/f
+IwIe8VzM/1VV7Pr2udnru+3MAKeN+7+Jvh+WPThRn2pbl7m2U+89bo3ccIykxDKS5uDFzJXGO00L
+jj7z2Jv5wXxghKgKeT8qVds3Pp25+pmdToAiNhZFGsuj31fHT9SVXtowq795Wbq9Qe9rtdP3XaAx
+I3Emee7dP9Y8ubVUrQ57QZkUUD4oilxYP0OiZAYE0KriKfAr0yLepRMCW0rUY7MnXv14TvL3d/Te
+X+zskBSX7Ml07Lrx+ct7qmIzoz7IcB4UuKBI1IS9RQEl7vVIfCHhpka8bxeEWqbl/fPpC+lLm82h
+dsc2HWNUu3u499slB2riOOJxuaAIX8TxecUtj4//oiK6qiA0J+4HXhGCi+D8XmG4dVHZv0fe0HuO
+osixNAT2N78KClxyvuCuwMXUxU0PW5ff2jHv1/pqqNY/GiwLKtwTUcTccf5vJsf5U/bmXlt7QGqg
+wIVjOV9gJGSWRopcjf/Oc27k1ApM3V8df2VCIE+qFlPC3m1l6t8Nz2c7miSKpaEIX3CXjEhamEOX
+rbFuWx91HBvNVvKe1t0yfHL52bdqPyyOVIbkVaVBpaHERbm5VyoyRnGXjEhaunL7y/moTf25Qbvz
+oznc4VhZErBGbhHYtW0vNlXGnlB9ORS4oEj6Im/qIWn6QuvEyoIQxuLoudXTEwdfA162y7FsfVjr
+OtD99cJ9k+M5FBThC/fJjGhM4gyto7tCcW3jkrrxge3l0bMrpmAtNXXMlGNm9Hs/gwKXnCLcJSOS
+ln0xxuguCxAzVF9xQAlK48QjPs/ivEBzTbxz1wKtc78cjpmBC4rwBXe5jKTpC62DCAtgR+LU65WH
+ase9PynybMynKgIoakpNOhpfAgUuKMIX3CUj/kqWtI7uygUYSdYoMDl1fn3X7jo2sq4wXB5EmYA2
+KHCRilx3yYik6QtB010WQEFcR04L6Zz20BhoY11XtszeURGtdTsDFxThS85dkqYvtI4bWAA74jws
+eBmEOXjBzg6Ch0Na53e3d84HpdxtJ77gLhmRNH2hdZSSBbAj1simJbqly17wWMAH56gpKHBBEb7g
+LhmRtOyLbSKZBbAjOLJpSLkyHbG2MPzTrPzuPYu0roOgwAWG+IK7HCVp+kLrYMkCqBZr9LoyOcO+
++CyfMxpG8qBILjg00Ia7ZETS9IXW0V0WwI6wBpt5GZDDKwV9ghc8FtwGClzkp+wg7pIRSdMXikB3
+aSQ7QiabBpF/wQ7eOl5McAW/8QkuKMIX3MV/ZNMXWgc8C5Dfhy7DGea8L7xSrIsXk3eX1/t/AivQ
+LNGW7xcAAAAASUVORK5CYII=
+"
+             style="image-rendering:optimizeSpeed"
+             preserveAspectRatio="none"
+             height="22"
+             width="22" />
+    </g>
+</svg>
diff --git a/pixmaps/src/gwy_tilt-24.svg b/pixmaps/src/gwy_tilt-24.svg
new file mode 100644
index 0000000..41024f4
--- /dev/null
+++ b/pixmaps/src/gwy_tilt-24.svg
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_tilt-24.svg"
+   inkscape:export-filename="gwy_tilt-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient8652"
+       inkscape:collect="always">
+      <stop
+         style="stop-color:#c3ddf3;stop-opacity:1"
+         offset="0"
+         id="stop8650" />
+      <stop
+         id="stop8648"
+         offset="0.5"
+         style="stop-color:#4696db;stop-opacity:1" />
+      <stop
+         style="stop-color:#0c1e2d;stop-opacity:1"
+         offset="1"
+         id="stop8646" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient8428"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#4696db;stop-opacity:1;"
+         offset="0"
+         id="stop8430" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8652"
+       id="linearGradient8889"
+       x1="359.46628"
+       y1="531.59906"
+       x2="391.75754"
+       y2="553.18823"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.61340763,0.20245078,-0.36437531,0.36077836,337.91212,262.04355)" />
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8940"
+       x="-0.069478748"
+       width="1.1389575"
+       y="-0.10543993"
+       height="1.2108799">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.66323168"
+         id="feGaussianBlur8942" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.0868243"
+     inkscape:cx="-0.65198828"
+     inkscape:cy="-5.7166442"
+     inkscape:document-units="px"
+     inkscape:current-layer="g8625"
+     showgrid="false"
+     inkscape:object-nodes="true"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false"
+     showguides="true"
+     units="px"
+     inkscape:snap-object-midpoints="true"
+     inkscape:object-paths="false"
+     inkscape:snap-grids="true"
+     inkscape:snap-intersection-paths="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-360.04032,-520.36218)">
+    <g
+       id="g8618"
+       transform="matrix(0.97194034,0,0,1,10.715714,0.03393)"
+       style="stroke-width:1.01433218">
+      <g
+         id="g8625"
+         transform="translate(-0.58662158)">
+        <path
+           sodipodi:nodetypes="ccccc"
+           inkscape:connector-curvature="0"
+           id="path8955"
+           d="m 370.30181,525.73125 13.49573,5.79373 -7.87094,11.8026 -15.03903,-8.29374 z"
+           style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.5;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.01433229px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate;font-variant-east_asian:normal;filter:url(#filter8940)" />
+        <path
+           style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:url(#linearGradient8889);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.01433229px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+           d="m 370.30181,521.92896 13.49573,5.79373 -3.93547,5.9013 -3.93547,5.9013 -15.03903,-8.29374 4.70712,-4.6513 z"
+           id="rect8881"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccccc" />
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1.01433218px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 365.59469,526.58025 14.26738,7.04374"
+           id="path8447"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:nodetypes="zcccccsccz"
+           style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.01431835;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           d="m 364.39137,538.36852 c -1.65132,-5.53188 2.26601,-8.79871 2.26601,-8.79871 l -1.53197,-1.48265 7.18741,-1.5996 -1.25211,7.18355 -1.58548,-1.35801 c 0,0 -1.59277,1.07809 -1.40297,4.06174 0.18984,2.98439 4.9441,3.4061 4.9441,3.4061 l -1.60886,3.80762 c 0,0 -5.36481,0.31185 -7.01613,-5.22004 z"
+           id="path8620"
+           inkscape:connector-curvature="0" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path5078-9-4-0"
+           d="m 365.01027,537.74065 c -1.25258,-4.94886 2.21879,-8.05527 2.21879,-8.05527 l -1.12801,-1.09169 5.54371,-1.22979 -0.92194,5.28934 -1.17101,-1.08549 c 0,0 -2.68366,1.85356 -1.98136,5.18625 0.70193,3.33278 4.55322,3.48854 4.55322,3.48854 l -1.11969,2.56001 c 0,0 -4.74071,-0.11141 -5.99371,-5.0619 z"
+           style="fill:#7db846;fill-opacity:1;stroke:#000000;stroke-width:1.01431835;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           sodipodi:nodetypes="zccccczccz" />
+        <g
+           id="g8814"
+           transform="matrix(0.17094832,0,0,0.17482069,303.29323,425.48409)"
+           style="stroke-width:5.86747646;stroke:none" />
+        <g
+           transform="matrix(1.0288697,0,0,1,117.35601,51.336807)"
+           id="layer1-9"
+           inkscape:label="Layer 1" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_tip_dilation-24.svg b/pixmaps/src/gwy_tip_dilation-24.svg
new file mode 100644
index 0000000..5f28a4c
--- /dev/null
+++ b/pixmaps/src/gwy_tip_dilation-24.svg
@@ -0,0 +1,1121 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_tip_dilation-24.svg"
+   inkscape:export-filename="gwy_cantilever-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8095">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8423">
+      <stop
+         style="stop-color:#6c7d92;stop-opacity:1"
+         offset="0"
+         id="stop8419" />
+      <stop
+         id="stop8427"
+         offset="0.49999958"
+         style="stop-color:#a3b8d2;stop-opacity:1" />
+      <stop
+         style="stop-color:#446a97;stop-opacity:1"
+         offset="1"
+         id="stop8421" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8458"
+       x="-0.12856513"
+       width="1.2571303"
+       y="-0.11250482"
+       height="1.2250096">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.16275744"
+         id="feGaussianBlur8460" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8423"
+       id="linearGradient8425"
+       x1="263.77811"
+       y1="602.10724"
+       x2="257.77811"
+       y2="602.10724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-5)" />
+    <defs
+       id="defs7146">
+      <circle
+         r="0.5"
+         id="gpDot"
+         cx="0"
+         cy="0"
+         style="stroke-width:0.5" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1"
+         id="gpPt0"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,-1 1,1 M 1,-1 -1,1"
+         id="gpPt1"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1 m -1,-2 2,2 m -2,0 2,-2"
+         id="gpPt2"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt3"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt4"
+         style="fill:currentColor;stroke:currentColor;stroke-width:0.222" />
+      <circle
+         r="1"
+         cy="0"
+         cx="0"
+         id="gpPt5"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt6"
+         xlink:href="#gpPt5"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <path
+         d="m 0,-1.33 -1.33,2 2.66,0 z"
+         id="gpPt7"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt8"
+         xlink:href="#gpPt7"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="scale(-1,-1)"
+         id="gpPt9"
+         xlink:href="#gpPt7"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt10"
+         xlink:href="#gpPt9"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+         id="gpPt11"
+         xlink:href="#gpPt3"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt12"
+         xlink:href="#gpPt11"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+    </defs>
+    <defs
+       id="defs6370">
+      <circle
+         r="0.5"
+         id="gpDot-2"
+         cx="0"
+         cy="0"
+         style="stroke-width:0.5" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1"
+         id="gpPt0-7"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,-1 1,1 M 1,-1 -1,1"
+         id="gpPt1-3"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1 m -1,-2 2,2 m -2,0 2,-2"
+         id="gpPt2-25"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt3-2"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt4-40"
+         style="fill:currentColor;stroke:currentColor;stroke-width:0.222" />
+      <circle
+         r="1"
+         cy="0"
+         cx="0"
+         id="gpPt5-5"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt6-0"
+         xlink:href="#gpPt5-5"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <path
+         d="m 0,-1.33 -1.33,2 2.66,0 z"
+         id="gpPt7-2"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt8-8"
+         xlink:href="#gpPt7-2"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="scale(-1,-1)"
+         id="gpPt9-2"
+         xlink:href="#gpPt7-2"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt10-7"
+         xlink:href="#gpPt9-2"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+         id="gpPt11-1"
+         xlink:href="#gpPt3-2"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt12-2"
+         xlink:href="#gpPt11-1"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+    </defs>
+    <defs
+       id="defs5302">
+      <circle
+         r="0.5"
+         id="gpDot-16"
+         cx="0"
+         cy="0"
+         style="stroke-width:0.5" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1"
+         id="gpPt0-9"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,-1 1,1 M 1,-1 -1,1"
+         id="gpPt1-15"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1 m -1,-2 2,2 m -2,0 2,-2"
+         id="gpPt2-2"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt3-8"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt4-4"
+         style="fill:currentColor;stroke:currentColor;stroke-width:0.222" />
+      <circle
+         r="1"
+         cy="0"
+         cx="0"
+         id="gpPt5-0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt6-93"
+         xlink:href="#gpPt5-0"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <path
+         d="m 0,-1.33 -1.33,2 2.66,0 z"
+         id="gpPt7-4"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt8-6"
+         xlink:href="#gpPt7-4"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="scale(-1,-1)"
+         id="gpPt9-9"
+         xlink:href="#gpPt7-4"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt10-0"
+         xlink:href="#gpPt9-9"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+         id="gpPt11-5"
+         xlink:href="#gpPt3-8"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt12-5"
+         xlink:href="#gpPt11-5"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+    </defs>
+    <style
+       type="text/css"
+       id="style7591"><![CDATA[
+    @font-face { font-family:"Futura Md BT";src:url("#FontID0") format(svg)}
+    .str0 {stroke:#2B2A29;stroke-width:20}
+    .str3 {stroke:#212220;stroke-width:20}
+    .str4 {stroke:#E32029;stroke-width:35.28}
+    .str1 {stroke:#FEFEFE;stroke-width:52.92}
+    .str2 {stroke:#5B5A50;stroke-width:35.28;stroke-dasharray:35.280000 35.280000}
+    .fil0 {fill:none}
+    .fil2 {fill:none;fill-rule:nonzero}
+    .fil1 {fill:#2B2A29}
+    .fil3 {fill:#FEFEFE}
+    .fil11 {fill:#B9A8A0}
+    .fil96 {fill:#284A98;fill-rule:nonzero}
+    .fil100 {fill:url(#id0)}
+    .fil97 {fill:url(#id1)}
+    .fil124 {fill:url(#id2)}
+    .fil95 {fill:url(#id3)}
+    .fil126 {fill:url(#id4)}
+    .fil125 {fill:url(#id5)}
+    .fil128 {fill:url(#id6)}
+    .fil127 {fill:url(#id7)}
+    .fil69 {fill:url(#id8)}
+    .fil73 {fill:url(#id9)}
+    .fil71 {fill:url(#id10)}
+    .fil68 {fill:url(#id11)}
+    .fil70 {fill:url(#id12)}
+    .fil74 {fill:url(#id13)}
+    .fil72 {fill:url(#id14)}
+    .fil41 {fill:url(#id15)}
+    .fil13 {fill:url(#id16)}
+    .fil45 {fill:url(#id17)}
+    .fil17 {fill:url(#id18)}
+    .fil43 {fill:url(#id19)}
+    .fil40 {fill:url(#id20)}
+    .fil15 {fill:url(#id21)}
+    .fil12 {fill:url(#id22)}
+    .fil42 {fill:url(#id23)}
+    .fil46 {fill:url(#id24)}
+    .fil14 {fill:url(#id25)}
+    .fil18 {fill:url(#id26)}
+    .fil44 {fill:url(#id27)}
+    .fil16 {fill:url(#id28)}
+    .fil77 {fill:url(#id29)}
+    .fil76 {fill:url(#id30)}
+    .fil75 {fill:url(#id31)}
+    .fil79 {fill:url(#id32)}
+    .fil78 {fill:url(#id33)}
+    .fil49 {fill:url(#id34)}
+    .fil21 {fill:url(#id35)}
+    .fil48 {fill:url(#id36)}
+    .fil47 {fill:url(#id37)}
+    .fil20 {fill:url(#id38)}
+    .fil19 {fill:url(#id39)}
+    .fil51 {fill:url(#id40)}
+    .fil50 {fill:url(#id41)}
+    .fil23 {fill:url(#id42)}
+    .fil22 {fill:url(#id43)}
+    .fil115 {fill:url(#id44)}
+    .fil113 {fill:url(#id45)}
+    .fil102 {fill:url(#id46)}
+    .fil105 {fill:url(#id47)}
+    .fil106 {fill:url(#id48)}
+    .fil114 {fill:url(#id49)}
+    .fil117 {fill:url(#id50)}
+    .fil112 {fill:url(#id51)}
+    .fil104 {fill:url(#id52)}
+    .fil110 {fill:url(#id53)}
+    .fil108 {fill:url(#id54)}
+    .fil116 {fill:url(#id55)}
+    .fil111 {fill:url(#id56)}
+    .fil101 {fill:url(#id57)}
+    .fil103 {fill:url(#id58)}
+    .fil118 {fill:url(#id59)}
+    .fil107 {fill:url(#id60)}
+    .fil109 {fill:url(#id61)}
+    .fil90 {fill:url(#id62)}
+    .fil67 {fill:url(#id63)}
+    .fil39 {fill:url(#id64)}
+    .fil65 {fill:url(#id65)}
+    .fil64 {fill:url(#id66)}
+    .fil37 {fill:url(#id67)}
+    .fil36 {fill:url(#id68)}
+    .fil66 {fill:url(#id69)}
+    .fil38 {fill:url(#id70)}
+    .fil91 {fill:url(#id71)}
+    .fil83 {fill:url(#id72)}
+    .fil85 {fill:url(#id73)}
+    .fil81 {fill:url(#id74)}
+    .fil80 {fill:url(#id75)}
+    .fil82 {fill:url(#id76)}
+    .fil84 {fill:url(#id77)}
+    .fil4 {fill:url(#id78)}
+    .fil56 {fill:url(#id79)}
+    .fil28 {fill:url(#id80)}
+    .fil58 {fill:url(#id81)}
+    .fil54 {fill:url(#id82)}
+    .fil30 {fill:url(#id83)}
+    .fil26 {fill:url(#id84)}
+    .fil52 {fill:url(#id85)}
+    .fil55 {fill:url(#id86)}
+    .fil24 {fill:url(#id87)}
+    .fil27 {fill:url(#id88)}
+    .fil57 {fill:url(#id89)}
+    .fil29 {fill:url(#id90)}
+    .fil53 {fill:url(#id91)}
+    .fil25 {fill:url(#id92)}
+    .fil88 {fill:url(#id93)}
+    .fil89 {fill:url(#id94)}
+    .fil86 {fill:url(#id95)}
+    .fil87 {fill:url(#id96)}
+    .fil62 {fill:url(#id97)}
+    .fil63 {fill:url(#id98)}
+    .fil34 {fill:url(#id99)}
+    .fil35 {fill:url(#id100)}
+    .fil59 {fill:url(#id101)}
+    .fil60 {fill:url(#id102)}
+    .fil31 {fill:url(#id103)}
+    .fil32 {fill:url(#id104)}
+    .fil61 {fill:url(#id105)}
+    .fil33 {fill:url(#id106)}
+    .fil6 {fill:url(#id107)}
+    .fil5 {fill:url(#id108)}
+    .fil10 {fill:url(#id109)}
+    .fil9 {fill:url(#id110)}
+    .fil94 {fill:url(#id111)}
+    .fil8 {fill:url(#id112)}
+    .fil7 {fill:url(#id113)}
+    .fil99 {fill:url(#id114)}
+    .fil98 {fill:url(#id115)}
+    .fil122 {fill:url(#id116)}
+    .fil121 {fill:url(#id117)}
+    .fil123 {fill:url(#id118)}
+    .fil119 {fill:url(#id119)}
+    .fil120 {fill:url(#id120)}
+    .fil92 {fill:url(#id121)}
+    .fil93 {fill:url(#id122)}
+    .fnt3 {font-weight:normal;font-size:1136.24px;font-family:'Futura Md BT'}
+    .fnt2 {font-weight:normal;font-size:1256.81px;font-family:'Futura Md BT'}
+    .fnt4 {font-weight:normal;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt1 {font-weight:bold;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt0 {font-weight:bold;font-size:2010.9px;font-family:'Futura Md BT'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style9234"><![CDATA[
+    @font-face { font-family:"Futura Md BT";src:url("#FontID0") format(svg)}
+    .str0 {stroke:#C5C6C6;stroke-width:10.58}
+    .str3 {stroke:#C5C6C6;stroke-width:17.64;stroke-linecap:round;stroke-linejoin:round}
+    .str4 {stroke:#E32029;stroke-width:35.28}
+    .str1 {stroke:#FEFEFE;stroke-width:52.92}
+    .str5 {stroke:#FEFEFE;stroke-width:52.92;stroke-linecap:round;stroke-linejoin:round}
+    .str6 {stroke:#054D00;stroke-width:52.92;stroke-linecap:round;stroke-linejoin:round}
+    .str2 {stroke:#5B5A50;stroke-width:35.28;stroke-dasharray:35.280000 35.280000}
+    .fil41 {fill:none}
+    .fil44 {fill:none;fill-rule:nonzero}
+    .fil2 {fill:#2B2A29}
+    .fil1 {fill:#FEFEFE}
+    .fil0 {fill:#054D00}
+    .fil10 {fill:#054D00;fill-rule:nonzero}
+    .fil45 {fill:url(#id0)}
+    .fil6 {fill:url(#id1)}
+    .fil55 {fill:url(#id2)}
+    .fil13 {fill:url(#id3)}
+    .fil38 {fill:url(#id4)}
+    .fil46 {fill:url(#id5)}
+    .fil7 {fill:url(#id6)}
+    .fil56 {fill:url(#id7)}
+    .fil11 {fill:url(#id8)}
+    .fil43 {fill:url(#id9)}
+    .fil39 {fill:url(#id10)}
+    .fil40 {fill:url(#id11)}
+    .fil42 {fill:url(#id12)}
+    .fil49 {fill:url(#id13)}
+    .fil51 {fill:url(#id14)}
+    .fil52 {fill:url(#id15)}
+    .fil29 {fill:url(#id16)}
+    .fil16 {fill:url(#id17)}
+    .fil23 {fill:url(#id18)}
+    .fil28 {fill:url(#id19)}
+    .fil24 {fill:url(#id20)}
+    .fil18 {fill:url(#id21)}
+    .fil31 {fill:url(#id22)}
+    .fil30 {fill:url(#id23)}
+    .fil22 {fill:url(#id24)}
+    .fil21 {fill:url(#id25)}
+    .fil19 {fill:url(#id26)}
+    .fil25 {fill:url(#id27)}
+    .fil26 {fill:url(#id28)}
+    .fil32 {fill:url(#id29)}
+    .fil20 {fill:url(#id30)}
+    .fil15 {fill:url(#id31)}
+    .fil17 {fill:url(#id32)}
+    .fil27 {fill:url(#id33)}
+    .fil3 {fill:url(#id34)}
+    .fil5 {fill:url(#id35)}
+    .fil4 {fill:url(#id36)}
+    .fil14 {fill:url(#id37)}
+    .fil12 {fill:url(#id38)}
+    .fil47 {fill:url(#id39)}
+    .fil8 {fill:url(#id40)}
+    .fil53 {fill:url(#id41)}
+    .fil57 {fill:url(#id42)}
+    .fil36 {fill:url(#id43)}
+    .fil35 {fill:url(#id44)}
+    .fil37 {fill:url(#id45)}
+    .fil33 {fill:url(#id46)}
+    .fil34 {fill:url(#id47)}
+    .fil48 {fill:url(#id48)}
+    .fil9 {fill:url(#id49)}
+    .fil54 {fill:url(#id50)}
+    .fil58 {fill:url(#id51)}
+    .fil50 {fill:url(#id52)}
+    .fnt1 {font-weight:normal;font-size:1382.5px;font-family:'Futura Md BT'}
+    .fnt2 {font-weight:bold;font-size:1382.5px;font-family:'Futura Md BT'}
+    .fnt0 {font-weight:bold;font-size:1759.55px;font-family:'Futura Md BT'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style10533"><![CDATA[
+    @font-face { font-family:"Arial";src:url("#FontID1") format(svg)}
+    @font-face { font-family:"Futura Md BT";src:url("#FontID0") format(svg)}
+    .str2 {stroke-width:5.05}
+    .str1 {stroke:#2B2A29;stroke-width:7.62}
+    .str4 {stroke:#898989;stroke-width:7.62}
+    .str9 {stroke:#C5C6C6;stroke-width:10.58}
+    .str0 {stroke:#212220;stroke-width:20}
+    .str3 {stroke:#62605E;stroke-width:20}
+    .str8 {stroke:#E09079;stroke-width:35.28}
+    .str7 {stroke:#E32029;stroke-width:35.28}
+    .str12 {stroke:#2B2A29;stroke-width:52.92}
+    .str10 {stroke:#FEFEFE;stroke-width:52.92;stroke-linecap:round;stroke-linejoin:round}
+    .str11 {stroke:#054D00;stroke-width:52.92;stroke-linecap:round;stroke-linejoin:round}
+    .str5 {stroke:#5B5A50;stroke-width:35.28;stroke-dasharray:35.280000 35.280000}
+    .str6 {stroke:#9D9C94;stroke-width:35.28;stroke-dasharray:35.280000 35.280000}
+    .fil9 {fill:none}
+    .fil8 {fill:none;fill-rule:nonzero}
+    .fil0 {fill:#2B2A29}
+    .fil2 {fill:#FEFEFE}
+    .fil130 {fill:#054D00}
+    .fil4 {fill:#898989}
+    .fil40 {fill:#B9A8A0}
+    .fil69 {fill:#C9C0BB}
+    .fil3 {fill:#EBECEC}
+    .fil1 {fill:#054D00;fill-rule:nonzero}
+    .fil6 {fill:#6F936D;fill-rule:nonzero}
+    .fil5 {fill:#898989;fill-rule:nonzero}
+    .fil7 {fill:#EBECEC;fill-rule:nonzero}
+    .fil35 {fill:url(#id60)}
+    .fil98 {fill:url(#id61)}
+    .fil39 {fill:url(#id62)}
+    .fil102 {fill:url(#id63)}
+    .fil15 {fill:url(#id64)}
+    .fil22 {fill:url(#id65)}
+    .fil42 {fill:url(#id66)}
+    .fil46 {fill:url(#id67)}
+    .fil44 {fill:url(#id68)}
+    .fil41 {fill:url(#id69)}
+    .fil43 {fill:url(#id70)}
+    .fil47 {fill:url(#id71)}
+    .fil45 {fill:url(#id72)}
+    .fil50 {fill:url(#id73)}
+    .fil49 {fill:url(#id74)}
+    .fil48 {fill:url(#id75)}
+    .fil52 {fill:url(#id76)}
+    .fil51 {fill:url(#id77)}
+    .fil71 {fill:url(#id78)}
+    .fil75 {fill:url(#id79)}
+    .fil73 {fill:url(#id80)}
+    .fil70 {fill:url(#id81)}
+    .fil72 {fill:url(#id82)}
+    .fil76 {fill:url(#id83)}
+    .fil74 {fill:url(#id84)}
+    .fil79 {fill:url(#id85)}
+    .fil78 {fill:url(#id86)}
+    .fil77 {fill:url(#id87)}
+    .fil81 {fill:url(#id88)}
+    .fil80 {fill:url(#id89)}
+    .fil107 {fill:url(#id90)}
+    .fil117 {fill:url(#id91)}
+    .fil120 {fill:url(#id92)}
+    .fil115 {fill:url(#id93)}
+    .fil119 {fill:url(#id94)}
+    .fil118 {fill:url(#id95)}
+    .fil122 {fill:url(#id96)}
+    .fil123 {fill:url(#id97)}
+    .fil113 {fill:url(#id98)}
+    .fil109 {fill:url(#id99)}
+    .fil112 {fill:url(#id100)}
+    .fil110 {fill:url(#id101)}
+    .fil114 {fill:url(#id102)}
+    .fil116 {fill:url(#id103)}
+    .fil121 {fill:url(#id104)}
+    .fil106 {fill:url(#id105)}
+    .fil108 {fill:url(#id106)}
+    .fil111 {fill:url(#id107)}
+    .fil66 {fill:url(#id108)}
+    .fil67 {fill:url(#id109)}
+    .fil95 {fill:url(#id110)}
+    .fil96 {fill:url(#id111)}
+    .fil68 {fill:url(#id112)}
+    .fil97 {fill:url(#id113)}
+    .fil65 {fill:url(#id114)}
+    .fil94 {fill:url(#id115)}
+    .fil57 {fill:url(#id116)}
+    .fil59 {fill:url(#id117)}
+    .fil55 {fill:url(#id118)}
+    .fil53 {fill:url(#id119)}
+    .fil56 {fill:url(#id120)}
+    .fil58 {fill:url(#id121)}
+    .fil54 {fill:url(#id122)}
+    .fil10 {fill:url(#id123)}
+    .fil63 {fill:url(#id124)}
+    .fil64 {fill:url(#id125)}
+    .fil60 {fill:url(#id126)}
+    .fil61 {fill:url(#id127)}
+    .fil62 {fill:url(#id128)}
+    .fil12 {fill:url(#id129)}
+    .fil11 {fill:url(#id130)}
+    .fil86 {fill:url(#id131)}
+    .fil88 {fill:url(#id132)}
+    .fil84 {fill:url(#id133)}
+    .fil82 {fill:url(#id134)}
+    .fil85 {fill:url(#id135)}
+    .fil87 {fill:url(#id136)}
+    .fil83 {fill:url(#id137)}
+    .fil17 {fill:url(#id138)}
+    .fil92 {fill:url(#id139)}
+    .fil93 {fill:url(#id140)}
+    .fil89 {fill:url(#id141)}
+    .fil90 {fill:url(#id142)}
+    .fil91 {fill:url(#id143)}
+    .fil19 {fill:url(#id144)}
+    .fil18 {fill:url(#id145)}
+    .fil101 {fill:url(#id146)}
+    .fil100 {fill:url(#id147)}
+    .fil105 {fill:url(#id148)}
+    .fil104 {fill:url(#id149)}
+    .fil25 {fill:url(#id150)}
+    .fil24 {fill:url(#id151)}
+    .fil29 {fill:url(#id152)}
+    .fil28 {fill:url(#id153)}
+    .fil127 {fill:url(#id154)}
+    .fil126 {fill:url(#id155)}
+    .fil128 {fill:url(#id156)}
+    .fil125 {fill:url(#id157)}
+    .fil99 {fill:url(#id158)}
+    .fil103 {fill:url(#id159)}
+    .fil34 {fill:url(#id160)}
+    .fil32 {fill:url(#id161)}
+    .fil38 {fill:url(#id162)}
+    .fil36 {fill:url(#id163)}
+    .fil27 {fill:url(#id164)}
+    .fil26 {fill:url(#id165)}
+    .fil31 {fill:url(#id166)}
+    .fil30 {fill:url(#id167)}
+    .fil124 {fill:url(#id168)}
+    .fil129 {fill:url(#id169)}
+    .fil33 {fill:url(#id170)}
+    .fil37 {fill:url(#id171)}
+    .fil16 {fill:url(#id172)}
+    .fil23 {fill:url(#id173)}
+    .fil14 {fill:url(#id174)}
+    .fil13 {fill:url(#id175)}
+    .fil21 {fill:url(#id176)}
+    .fil20 {fill:url(#id177)}
+    .fnt7 {font-weight:bold;font-size:423.33px;font-family:'Arial'}
+    .fnt0 {font-weight:bold;font-size:493.89px;font-family:'Futura Md BT'}
+    .fnt1 {font-weight:normal;font-size:1382.5px;font-family:'Futura Md BT'}
+    .fnt5 {font-weight:bold;font-size:1382.5px;font-family:'Futura Md BT'}
+    .fnt2 {font-weight:bold;font-size:1508.17px;font-family:'Futura Md BT'}
+    .fnt6 {font-weight:bold;font-size:1508.2px;font-family:'Arial'}
+    .fnt3 {font-weight:bold;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt4 {font-weight:bold;font-size:1759.55px;font-family:'Futura Md BT'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style25752"><![CDATA[
+    @font-face { font-family:"Futura Md BT";src:url("#FontID0") format(svg)}
+    .str0 {stroke:#FEFEFE;stroke-width:7.62}
+    .str1 {stroke:#FEFEFE;stroke-width:7.62}
+    .fil2 {fill:none}
+    .fil4 {fill:#2B2A29}
+    .fil0 {fill:#FEFEFE}
+    .fil1 {fill:#FEFEFE}
+    .fil3 {fill:#C6D663;fill-rule:nonzero}
+    .fil37 {fill:url(#id51)}
+    .fil38 {fill:url(#id52)}
+    .fil40 {fill:url(#id53)}
+    .fil15 {fill:url(#id54)}
+    .fil74 {fill:url(#id55)}
+    .fil20 {fill:url(#id56)}
+    .fil26 {fill:url(#id57)}
+    .fil25 {fill:url(#id58)}
+    .fil44 {fill:url(#id59)}
+    .fil48 {fill:url(#id60)}
+    .fil34 {fill:url(#id61)}
+    .fil51 {fill:url(#id62)}
+    .fil61 {fill:url(#id63)}
+    .fil56 {fill:url(#id64)}
+    .fil50 {fill:url(#id65)}
+    .fil60 {fill:url(#id66)}
+    .fil53 {fill:url(#id67)}
+    .fil52 {fill:url(#id68)}
+    .fil55 {fill:url(#id69)}
+    .fil58 {fill:url(#id70)}
+    .fil57 {fill:url(#id71)}
+    .fil54 {fill:url(#id72)}
+    .fil62 {fill:url(#id73)}
+    .fil13 {fill:url(#id74)}
+    .fil72 {fill:url(#id75)}
+    .fil9 {fill:url(#id76)}
+    .fil68 {fill:url(#id77)}
+    .fil6 {fill:url(#id78)}
+    .fil65 {fill:url(#id79)}
+    .fil10 {fill:url(#id80)}
+    .fil7 {fill:url(#id81)}
+    .fil69 {fill:url(#id82)}
+    .fil66 {fill:url(#id83)}
+    .fil16 {fill:url(#id84)}
+    .fil75 {fill:url(#id85)}
+    .fil17 {fill:url(#id86)}
+    .fil76 {fill:url(#id87)}
+    .fil11 {fill:url(#id88)}
+    .fil70 {fill:url(#id89)}
+    .fil12 {fill:url(#id90)}
+    .fil8 {fill:url(#id91)}
+    .fil71 {fill:url(#id92)}
+    .fil67 {fill:url(#id93)}
+    .fil14 {fill:url(#id94)}
+    .fil73 {fill:url(#id95)}
+    .fil29 {fill:url(#id96)}
+    .fil33 {fill:url(#id97)}
+    .fil19 {fill:url(#id98)}
+    .fil43 {fill:url(#id99)}
+    .fil45 {fill:url(#id100)}
+    .fil39 {fill:url(#id101)}
+    .fil36 {fill:url(#id102)}
+    .fil46 {fill:url(#id103)}
+    .fil47 {fill:url(#id104)}
+    .fil41 {fill:url(#id105)}
+    .fil35 {fill:url(#id106)}
+    .fil42 {fill:url(#id107)}
+    .fil59 {fill:url(#id108)}
+    .fil49 {fill:url(#id109)}
+    .fil63 {fill:url(#id110)}
+    .fil5 {fill:url(#id111)}
+    .fil18 {fill:url(#id112)}
+    .fil64 {fill:url(#id113)}
+    .fil77 {fill:url(#id114)}
+    .fil28 {fill:url(#id115)}
+    .fil31 {fill:url(#id116)}
+    .fil32 {fill:url(#id117)}
+    .fil21 {fill:url(#id118)}
+    .fil22 {fill:url(#id119)}
+    .fil24 {fill:url(#id120)}
+    .fil23 {fill:url(#id121)}
+    .fil27 {fill:url(#id122)}
+    .fil30 {fill:url(#id123)}
+    .fnt0 {font-weight:bold;font-size:1243.98px;font-family:'Futura Md BT'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style98"><![CDATA[
+    @font-face { font-family:"Symbol";src:url("#FontID1") format(svg)}
+    @font-face { font-family:"Arial";src:url("#FontID0") format(svg)}
+    .str1 {stroke:#FEFEFE;stroke-width:7.62}
+    .str2 {stroke:#FEFEFE;stroke-width:35.28}
+    .str0 {stroke:#FEFEFE;stroke-width:52.92}
+    .str5 {stroke:#212220;stroke-width:52.92}
+    .str6 {stroke:#2B2A29;stroke-width:70.56}
+    .str3 {stroke:#FEFEFE;stroke-width:70.56}
+    .str4 {stroke:#212220;stroke-width:70.56}
+    .fil2 {fill:none}
+    .fil3 {fill:#2B2A29}
+    .fil0 {fill:#FEFEFE}
+    .fil5 {fill:#1C1B17;fill-rule:nonzero}
+    .fil1 {fill:#FEFEFE;fill-rule:nonzero}
+    .fil4 {fill:#212220;fill-rule:nonzero}
+    .fnt1 {font-weight:bold;font-size:423.33px;font-family:'Arial'}
+    .fnt4 {font-weight:bold;font-size:423.33px;font-family:'Arial'}
+    .fnt5 {font-weight:bold;font-size:493.88px;font-family:'Arial'}
+    .fnt2 {font-weight:normal;font-size:1508.2px;font-family:'Symbol'}
+    .fnt0 {font-weight:bold;font-size:1508.2px;font-family:'Arial'}
+    .fnt3 {font-weight:bold;font-size:1508.2px;font-family:'Arial'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style7232"><![CDATA[
+    @font-face { font-family:"Arial";src:url("#FontID0") format(svg)}
+    .str0 {stroke:#FEFEFE;stroke-width:70.56}
+    .fil0 {fill:none}
+    .fil2 {fill:#FEFEFE}
+    .fil1 {fill:#FEFEFE;fill-rule:nonzero}
+    .fnt0 {font-weight:bold;font-size:2533.72px;font-family:'Arial'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style7094"><![CDATA[
+    @font-face { font-family:"Futura Md BT";src:url("#FontID1") format(svg)}
+    @font-face { font-family:"Symbol";src:url("#FontID0") format(svg)}
+    .str2 {stroke:#2B2A29;stroke-width:7.62}
+    .str3 {stroke:#9D9E9E;stroke-width:7.62}
+    .str5 {stroke:#FEFEFE;stroke-width:42.33}
+    .str7 {stroke:#FEFEFE;stroke-width:42.33}
+    .str9 {stroke:#FEFEFE;stroke-width:52.92}
+    .str4 {stroke:#2B2A29;stroke-width:70.56}
+    .str10 {stroke:#727271;stroke-width:70.56}
+    .str8 {stroke:#FEFEFE;stroke-width:70.56}
+    .str6 {stroke:#9D9E9E;stroke-width:70.56}
+    .str0 {stroke:#FEFEFE;stroke-width:42.33;stroke-dasharray:84.660000 42.330000}
+    .str1 {stroke:#FEFEFE;stroke-width:42.33;stroke-dasharray:84.660000 42.330000}
+    .fil0 {fill:none}
+    .fil2 {fill:#2B2A29}
+    .fil7 {fill:#FEFEFE}
+    .fil5 {fill:#9D9E9E}
+    .fil1 {fill:#FEFEFE}
+    .fil3 {fill:#2B2A29;fill-rule:nonzero}
+    .fil6 {fill:#FEFEFE;fill-rule:nonzero}
+    .fil4 {fill:#9D9E9E;fill-rule:nonzero}
+    .fil8 {fill:#FEFEFE;fill-rule:nonzero}
+    .fil94 {fill:url(#id25)}
+    .fil97 {fill:url(#id26)}
+    .fil59 {fill:url(#id27)}
+    .fil26 {fill:url(#id28)}
+    .fil41 {fill:url(#id29)}
+    .fil112 {fill:url(#id30)}
+    .fil61 {fill:url(#id31)}
+    .fil48 {fill:url(#id32)}
+    .fil17 {fill:url(#id33)}
+    .fil105 {fill:url(#id34)}
+    .fil46 {fill:url(#id35)}
+    .fil89 {fill:url(#id36)}
+    .fil91 {fill:url(#id37)}
+    .fil76 {fill:url(#id38)}
+    .fil43 {fill:url(#id39)}
+    .fil62 {fill:url(#id40)}
+    .fil79 {fill:url(#id41)}
+    .fil55 {fill:url(#id42)}
+    .fil64 {fill:url(#id43)}
+    .fil92 {fill:url(#id44)}
+    .fil37 {fill:url(#id45)}
+    .fil90 {fill:url(#id46)}
+    .fil28 {fill:url(#id47)}
+    .fil108 {fill:url(#id48)}
+    .fil100 {fill:url(#id49)}
+    .fil80 {fill:url(#id50)}
+    .fil98 {fill:url(#id51)}
+    .fil111 {fill:url(#id52)}
+    .fil70 {fill:url(#id53)}
+    .fil35 {fill:url(#id54)}
+    .fil103 {fill:url(#id55)}
+    .fil104 {fill:url(#id56)}
+    .fil49 {fill:url(#id57)}
+    .fil65 {fill:url(#id58)}
+    .fil33 {fill:url(#id59)}
+    .fil84 {fill:url(#id60)}
+    .fil102 {fill:url(#id61)}
+    .fil88 {fill:url(#id62)}
+    .fil68 {fill:url(#id63)}
+    .fil51 {fill:url(#id64)}
+    .fil85 {fill:url(#id65)}
+    .fil86 {fill:url(#id66)}
+    .fil47 {fill:url(#id67)}
+    .fil50 {fill:url(#id68)}
+    .fil56 {fill:url(#id69)}
+    .fil54 {fill:url(#id70)}
+    .fil18 {fill:url(#id71)}
+    .fil72 {fill:url(#id72)}
+    .fil38 {fill:url(#id73)}
+    .fil53 {fill:url(#id74)}
+    .fil52 {fill:url(#id75)}
+    .fil15 {fill:url(#id76)}
+    .fil34 {fill:url(#id77)}
+    .fil107 {fill:url(#id78)}
+    .fil83 {fill:url(#id79)}
+    .fil106 {fill:url(#id80)}
+    .fil45 {fill:url(#id81)}
+    .fil99 {fill:url(#id82)}
+    .fil73 {fill:url(#id83)}
+    .fil67 {fill:url(#id84)}
+    .fil81 {fill:url(#id85)}
+    .fil78 {fill:url(#id86)}
+    .fil39 {fill:url(#id87)}
+    .fil93 {fill:url(#id88)}
+    .fil66 {fill:url(#id89)}
+    .fil29 {fill:url(#id90)}
+    .fil44 {fill:url(#id91)}
+    .fil31 {fill:url(#id92)}
+    .fil32 {fill:url(#id93)}
+    .fil42 {fill:url(#id94)}
+    .fil96 {fill:url(#id95)}
+    .fil60 {fill:url(#id96)}
+    .fil21 {fill:url(#id97)}
+    .fil115 {fill:url(#id98)}
+    .fil69 {fill:url(#id99)}
+    .fil109 {fill:url(#id100)}
+    .fil116 {fill:url(#id101)}
+    .fil19 {fill:url(#id102)}
+    .fil110 {fill:url(#id103)}
+    .fil87 {fill:url(#id104)}
+    .fil12 {fill:url(#id105)}
+    .fil9 {fill:url(#id106)}
+    .fil16 {fill:url(#id107)}
+    .fil71 {fill:url(#id108)}
+    .fil30 {fill:url(#id109)}
+    .fil101 {fill:url(#id110)}
+    .fil95 {fill:url(#id111)}
+    .fil10 {fill:url(#id112)}
+    .fil13 {fill:url(#id113)}
+    .fil11 {fill:url(#id114)}
+    .fil63 {fill:url(#id115)}
+    .fil27 {fill:url(#id116)}
+    .fil23 {fill:url(#id117)}
+    .fil113 {fill:url(#id118)}
+    .fil14 {fill:url(#id119)}
+    .fil74 {fill:url(#id120)}
+    .fil36 {fill:url(#id121)}
+    .fil82 {fill:url(#id122)}
+    .fil40 {fill:url(#id123)}
+    .fil24 {fill:url(#id124)}
+    .fil75 {fill:url(#id125)}
+    .fil20 {fill:url(#id126)}
+    .fil25 {fill:url(#id127)}
+    .fil57 {fill:url(#id128)}
+    .fil22 {fill:url(#id129)}
+    .fil77 {fill:url(#id130)}
+    .fil114 {fill:url(#id131)}
+    .fil58 {fill:url(#id132)}
+    .fnt6 {font-weight:bold;font-size:423.33px;font-family:'Futura Md BT'}
+    .fnt0 {font-weight:normal;font-size:1131.15px;font-family:'Symbol'}
+    .fnt1 {font-weight:bold;font-size:1131.15px;font-family:'Futura Md BT'}
+    .fnt8 {font-weight:bold;font-size:1256.81px;font-family:'Futura Md BT'}
+    .fnt5 {font-weight:normal;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt7 {font-weight:bold;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt4 {font-weight:normal;font-size:1900.27px;font-family:'Futura Md BT'}
+    .fnt9 {font-weight:normal;font-size:2111.45px;font-family:'Futura Md BT'}
+    .fnt3 {font-weight:normal;font-size:2533.72px;font-family:'Futura Md BT'}
+    .fnt2 {font-weight:bold;font-size:2533.72px;font-family:'Futura Md BT'}
+   ]]></style>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.8162704"
+     inkscape:cx="137.41999"
+     inkscape:cy="18.739558"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true"
+     inkscape:snap-grids="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77811,-595.10722)">
+    <path
+       sodipodi:nodetypes="cccccccc"
+       id="path8487"
+       d="m 267.77684,618.10722 h -4 v -5 h -5 l -0.0364,5 h -2.8892 -0.0728 -3.3e-4"
+       inkscape:connector-curvature="0"
+       style="color:#ff0000;fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="color:#ff0000;fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       inkscape:connector-curvature="0"
+       d="m 245.77811,618.10722 h 4 v -5 h 5 l 0.0364,5 h 2.8892 0.0728 3.3e-4"
+       id="path7427"
+       sodipodi:nodetypes="cccccccc" />
+    <path
+       style="fill:url(#linearGradient8425);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 246.27811,595.60722 h 21 v 2 l -6.5,10.5 -6,-10.5 h -8.5 z"
+       id="path4763"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 260.56574,601.46532 c -0.0435,-1.8491 2.94024,0.22303 6.9605,0.15554 -2.37934,0.87001 -4.78447,3.12651 -6.54699,4.79868 -0.69731,-2.00112 -0.66057,-4.5027 -0.41351,-4.95422 z"
+       id="path8400"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc"
+       transform="rotate(96.15813,261.98063,600.60609)" />
+    <path
+       style="fill:none;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.8892617"
+       d="m 254.77811,597.60722 h 12"
+       id="path8429"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="ccccccc"
+       inkscape:connector-curvature="0"
+       id="path8431"
+       d="m 246.27811,595.60722 h 21 v 2 l -6.5,10.5 -6,-10.5 h -8.5 z"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318"
+       transform="matrix(1.0666667,0,0,1.0666667,641.03977,883.51086)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386"
+       transform="matrix(1.0666667,0,0,1.0666667,1224.7427,320.09945)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162"
+       transform="matrix(1.0666667,0,0,1.0666667,483.79064,152.88667)" />
+    <path
+       style="color:#ff0000;fill:none;stroke:#e15244;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 245.77811,614.60722 h 0.84827 l 3.15173,-4.9925 2.5055,-0.004 2.5055,0.004 1.57586,2.49625 h 0.83594 l 1.57586,-2.49625 2.5055,-0.004 2.5055,0.004 3.15173,4.9925 h 0.84827"
+       id="path7438"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccc" />
+    <text
+       id="text7408-2"
+       class="fil7 fnt4"
+       y="183.92776"
+       x="-484.44421"
+       style="font-weight:normal;font-size:10.66666698px;font-family:'Futura Md BT';text-align:center;text-anchor:middle;clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;stroke-width:1.06666672;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422"
+       class="fil7 fnt4"
+       y="213.22548"
+       x="-466.97989"
+       style="font-weight:normal;font-size:10.66666698px;font-family:'Futura Md BT';text-align:center;text-anchor:middle;clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;stroke-width:1.06666672;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_tip_erosion-24.svg b/pixmaps/src/gwy_tip_erosion-24.svg
new file mode 100644
index 0000000..905ad14
--- /dev/null
+++ b/pixmaps/src/gwy_tip_erosion-24.svg
@@ -0,0 +1,1121 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_tip_erosion-24.svg"
+   inkscape:export-filename="gwy_cantilever-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8095">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8423">
+      <stop
+         style="stop-color:#6c7d92;stop-opacity:1"
+         offset="0"
+         id="stop8419" />
+      <stop
+         id="stop8427"
+         offset="0.49999958"
+         style="stop-color:#a3b8d2;stop-opacity:1" />
+      <stop
+         style="stop-color:#446a97;stop-opacity:1"
+         offset="1"
+         id="stop8421" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8458"
+       x="-0.12856513"
+       width="1.2571303"
+       y="-0.11250482"
+       height="1.2250096">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.16275744"
+         id="feGaussianBlur8460" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8423"
+       id="linearGradient8425"
+       x1="263.77811"
+       y1="602.10724"
+       x2="257.77811"
+       y2="602.10724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-5)" />
+    <defs
+       id="defs7146">
+      <circle
+         r="0.5"
+         id="gpDot"
+         cx="0"
+         cy="0"
+         style="stroke-width:0.5" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1"
+         id="gpPt0"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,-1 1,1 M 1,-1 -1,1"
+         id="gpPt1"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1 m -1,-2 2,2 m -2,0 2,-2"
+         id="gpPt2"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt3"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt4"
+         style="fill:currentColor;stroke:currentColor;stroke-width:0.222" />
+      <circle
+         r="1"
+         cy="0"
+         cx="0"
+         id="gpPt5"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt6"
+         xlink:href="#gpPt5"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <path
+         d="m 0,-1.33 -1.33,2 2.66,0 z"
+         id="gpPt7"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt8"
+         xlink:href="#gpPt7"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="scale(-1,-1)"
+         id="gpPt9"
+         xlink:href="#gpPt7"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt10"
+         xlink:href="#gpPt9"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+         id="gpPt11"
+         xlink:href="#gpPt3"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt12"
+         xlink:href="#gpPt11"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+    </defs>
+    <defs
+       id="defs6370">
+      <circle
+         r="0.5"
+         id="gpDot-2"
+         cx="0"
+         cy="0"
+         style="stroke-width:0.5" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1"
+         id="gpPt0-7"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,-1 1,1 M 1,-1 -1,1"
+         id="gpPt1-3"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1 m -1,-2 2,2 m -2,0 2,-2"
+         id="gpPt2-25"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt3-2"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt4-40"
+         style="fill:currentColor;stroke:currentColor;stroke-width:0.222" />
+      <circle
+         r="1"
+         cy="0"
+         cx="0"
+         id="gpPt5-5"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt6-0"
+         xlink:href="#gpPt5-5"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <path
+         d="m 0,-1.33 -1.33,2 2.66,0 z"
+         id="gpPt7-2"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt8-8"
+         xlink:href="#gpPt7-2"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="scale(-1,-1)"
+         id="gpPt9-2"
+         xlink:href="#gpPt7-2"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt10-7"
+         xlink:href="#gpPt9-2"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+         id="gpPt11-1"
+         xlink:href="#gpPt3-2"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt12-2"
+         xlink:href="#gpPt11-1"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+    </defs>
+    <defs
+       id="defs5302">
+      <circle
+         r="0.5"
+         id="gpDot-16"
+         cx="0"
+         cy="0"
+         style="stroke-width:0.5" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1"
+         id="gpPt0-9"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,-1 1,1 M 1,-1 -1,1"
+         id="gpPt1-15"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1 m -1,-2 2,2 m -2,0 2,-2"
+         id="gpPt2-2"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt3-8"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt4-4"
+         style="fill:currentColor;stroke:currentColor;stroke-width:0.222" />
+      <circle
+         r="1"
+         cy="0"
+         cx="0"
+         id="gpPt5-0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt6-93"
+         xlink:href="#gpPt5-0"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <path
+         d="m 0,-1.33 -1.33,2 2.66,0 z"
+         id="gpPt7-4"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt8-6"
+         xlink:href="#gpPt7-4"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="scale(-1,-1)"
+         id="gpPt9-9"
+         xlink:href="#gpPt7-4"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt10-0"
+         xlink:href="#gpPt9-9"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+         id="gpPt11-5"
+         xlink:href="#gpPt3-8"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt12-5"
+         xlink:href="#gpPt11-5"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+    </defs>
+    <style
+       type="text/css"
+       id="style7591"><![CDATA[
+    @font-face { font-family:"Futura Md BT";src:url("#FontID0") format(svg)}
+    .str0 {stroke:#2B2A29;stroke-width:20}
+    .str3 {stroke:#212220;stroke-width:20}
+    .str4 {stroke:#E32029;stroke-width:35.28}
+    .str1 {stroke:#FEFEFE;stroke-width:52.92}
+    .str2 {stroke:#5B5A50;stroke-width:35.28;stroke-dasharray:35.280000 35.280000}
+    .fil0 {fill:none}
+    .fil2 {fill:none;fill-rule:nonzero}
+    .fil1 {fill:#2B2A29}
+    .fil3 {fill:#FEFEFE}
+    .fil11 {fill:#B9A8A0}
+    .fil96 {fill:#284A98;fill-rule:nonzero}
+    .fil100 {fill:url(#id0)}
+    .fil97 {fill:url(#id1)}
+    .fil124 {fill:url(#id2)}
+    .fil95 {fill:url(#id3)}
+    .fil126 {fill:url(#id4)}
+    .fil125 {fill:url(#id5)}
+    .fil128 {fill:url(#id6)}
+    .fil127 {fill:url(#id7)}
+    .fil69 {fill:url(#id8)}
+    .fil73 {fill:url(#id9)}
+    .fil71 {fill:url(#id10)}
+    .fil68 {fill:url(#id11)}
+    .fil70 {fill:url(#id12)}
+    .fil74 {fill:url(#id13)}
+    .fil72 {fill:url(#id14)}
+    .fil41 {fill:url(#id15)}
+    .fil13 {fill:url(#id16)}
+    .fil45 {fill:url(#id17)}
+    .fil17 {fill:url(#id18)}
+    .fil43 {fill:url(#id19)}
+    .fil40 {fill:url(#id20)}
+    .fil15 {fill:url(#id21)}
+    .fil12 {fill:url(#id22)}
+    .fil42 {fill:url(#id23)}
+    .fil46 {fill:url(#id24)}
+    .fil14 {fill:url(#id25)}
+    .fil18 {fill:url(#id26)}
+    .fil44 {fill:url(#id27)}
+    .fil16 {fill:url(#id28)}
+    .fil77 {fill:url(#id29)}
+    .fil76 {fill:url(#id30)}
+    .fil75 {fill:url(#id31)}
+    .fil79 {fill:url(#id32)}
+    .fil78 {fill:url(#id33)}
+    .fil49 {fill:url(#id34)}
+    .fil21 {fill:url(#id35)}
+    .fil48 {fill:url(#id36)}
+    .fil47 {fill:url(#id37)}
+    .fil20 {fill:url(#id38)}
+    .fil19 {fill:url(#id39)}
+    .fil51 {fill:url(#id40)}
+    .fil50 {fill:url(#id41)}
+    .fil23 {fill:url(#id42)}
+    .fil22 {fill:url(#id43)}
+    .fil115 {fill:url(#id44)}
+    .fil113 {fill:url(#id45)}
+    .fil102 {fill:url(#id46)}
+    .fil105 {fill:url(#id47)}
+    .fil106 {fill:url(#id48)}
+    .fil114 {fill:url(#id49)}
+    .fil117 {fill:url(#id50)}
+    .fil112 {fill:url(#id51)}
+    .fil104 {fill:url(#id52)}
+    .fil110 {fill:url(#id53)}
+    .fil108 {fill:url(#id54)}
+    .fil116 {fill:url(#id55)}
+    .fil111 {fill:url(#id56)}
+    .fil101 {fill:url(#id57)}
+    .fil103 {fill:url(#id58)}
+    .fil118 {fill:url(#id59)}
+    .fil107 {fill:url(#id60)}
+    .fil109 {fill:url(#id61)}
+    .fil90 {fill:url(#id62)}
+    .fil67 {fill:url(#id63)}
+    .fil39 {fill:url(#id64)}
+    .fil65 {fill:url(#id65)}
+    .fil64 {fill:url(#id66)}
+    .fil37 {fill:url(#id67)}
+    .fil36 {fill:url(#id68)}
+    .fil66 {fill:url(#id69)}
+    .fil38 {fill:url(#id70)}
+    .fil91 {fill:url(#id71)}
+    .fil83 {fill:url(#id72)}
+    .fil85 {fill:url(#id73)}
+    .fil81 {fill:url(#id74)}
+    .fil80 {fill:url(#id75)}
+    .fil82 {fill:url(#id76)}
+    .fil84 {fill:url(#id77)}
+    .fil4 {fill:url(#id78)}
+    .fil56 {fill:url(#id79)}
+    .fil28 {fill:url(#id80)}
+    .fil58 {fill:url(#id81)}
+    .fil54 {fill:url(#id82)}
+    .fil30 {fill:url(#id83)}
+    .fil26 {fill:url(#id84)}
+    .fil52 {fill:url(#id85)}
+    .fil55 {fill:url(#id86)}
+    .fil24 {fill:url(#id87)}
+    .fil27 {fill:url(#id88)}
+    .fil57 {fill:url(#id89)}
+    .fil29 {fill:url(#id90)}
+    .fil53 {fill:url(#id91)}
+    .fil25 {fill:url(#id92)}
+    .fil88 {fill:url(#id93)}
+    .fil89 {fill:url(#id94)}
+    .fil86 {fill:url(#id95)}
+    .fil87 {fill:url(#id96)}
+    .fil62 {fill:url(#id97)}
+    .fil63 {fill:url(#id98)}
+    .fil34 {fill:url(#id99)}
+    .fil35 {fill:url(#id100)}
+    .fil59 {fill:url(#id101)}
+    .fil60 {fill:url(#id102)}
+    .fil31 {fill:url(#id103)}
+    .fil32 {fill:url(#id104)}
+    .fil61 {fill:url(#id105)}
+    .fil33 {fill:url(#id106)}
+    .fil6 {fill:url(#id107)}
+    .fil5 {fill:url(#id108)}
+    .fil10 {fill:url(#id109)}
+    .fil9 {fill:url(#id110)}
+    .fil94 {fill:url(#id111)}
+    .fil8 {fill:url(#id112)}
+    .fil7 {fill:url(#id113)}
+    .fil99 {fill:url(#id114)}
+    .fil98 {fill:url(#id115)}
+    .fil122 {fill:url(#id116)}
+    .fil121 {fill:url(#id117)}
+    .fil123 {fill:url(#id118)}
+    .fil119 {fill:url(#id119)}
+    .fil120 {fill:url(#id120)}
+    .fil92 {fill:url(#id121)}
+    .fil93 {fill:url(#id122)}
+    .fnt3 {font-weight:normal;font-size:1136.24px;font-family:'Futura Md BT'}
+    .fnt2 {font-weight:normal;font-size:1256.81px;font-family:'Futura Md BT'}
+    .fnt4 {font-weight:normal;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt1 {font-weight:bold;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt0 {font-weight:bold;font-size:2010.9px;font-family:'Futura Md BT'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style9234"><![CDATA[
+    @font-face { font-family:"Futura Md BT";src:url("#FontID0") format(svg)}
+    .str0 {stroke:#C5C6C6;stroke-width:10.58}
+    .str3 {stroke:#C5C6C6;stroke-width:17.64;stroke-linecap:round;stroke-linejoin:round}
+    .str4 {stroke:#E32029;stroke-width:35.28}
+    .str1 {stroke:#FEFEFE;stroke-width:52.92}
+    .str5 {stroke:#FEFEFE;stroke-width:52.92;stroke-linecap:round;stroke-linejoin:round}
+    .str6 {stroke:#054D00;stroke-width:52.92;stroke-linecap:round;stroke-linejoin:round}
+    .str2 {stroke:#5B5A50;stroke-width:35.28;stroke-dasharray:35.280000 35.280000}
+    .fil41 {fill:none}
+    .fil44 {fill:none;fill-rule:nonzero}
+    .fil2 {fill:#2B2A29}
+    .fil1 {fill:#FEFEFE}
+    .fil0 {fill:#054D00}
+    .fil10 {fill:#054D00;fill-rule:nonzero}
+    .fil45 {fill:url(#id0)}
+    .fil6 {fill:url(#id1)}
+    .fil55 {fill:url(#id2)}
+    .fil13 {fill:url(#id3)}
+    .fil38 {fill:url(#id4)}
+    .fil46 {fill:url(#id5)}
+    .fil7 {fill:url(#id6)}
+    .fil56 {fill:url(#id7)}
+    .fil11 {fill:url(#id8)}
+    .fil43 {fill:url(#id9)}
+    .fil39 {fill:url(#id10)}
+    .fil40 {fill:url(#id11)}
+    .fil42 {fill:url(#id12)}
+    .fil49 {fill:url(#id13)}
+    .fil51 {fill:url(#id14)}
+    .fil52 {fill:url(#id15)}
+    .fil29 {fill:url(#id16)}
+    .fil16 {fill:url(#id17)}
+    .fil23 {fill:url(#id18)}
+    .fil28 {fill:url(#id19)}
+    .fil24 {fill:url(#id20)}
+    .fil18 {fill:url(#id21)}
+    .fil31 {fill:url(#id22)}
+    .fil30 {fill:url(#id23)}
+    .fil22 {fill:url(#id24)}
+    .fil21 {fill:url(#id25)}
+    .fil19 {fill:url(#id26)}
+    .fil25 {fill:url(#id27)}
+    .fil26 {fill:url(#id28)}
+    .fil32 {fill:url(#id29)}
+    .fil20 {fill:url(#id30)}
+    .fil15 {fill:url(#id31)}
+    .fil17 {fill:url(#id32)}
+    .fil27 {fill:url(#id33)}
+    .fil3 {fill:url(#id34)}
+    .fil5 {fill:url(#id35)}
+    .fil4 {fill:url(#id36)}
+    .fil14 {fill:url(#id37)}
+    .fil12 {fill:url(#id38)}
+    .fil47 {fill:url(#id39)}
+    .fil8 {fill:url(#id40)}
+    .fil53 {fill:url(#id41)}
+    .fil57 {fill:url(#id42)}
+    .fil36 {fill:url(#id43)}
+    .fil35 {fill:url(#id44)}
+    .fil37 {fill:url(#id45)}
+    .fil33 {fill:url(#id46)}
+    .fil34 {fill:url(#id47)}
+    .fil48 {fill:url(#id48)}
+    .fil9 {fill:url(#id49)}
+    .fil54 {fill:url(#id50)}
+    .fil58 {fill:url(#id51)}
+    .fil50 {fill:url(#id52)}
+    .fnt1 {font-weight:normal;font-size:1382.5px;font-family:'Futura Md BT'}
+    .fnt2 {font-weight:bold;font-size:1382.5px;font-family:'Futura Md BT'}
+    .fnt0 {font-weight:bold;font-size:1759.55px;font-family:'Futura Md BT'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style10533"><![CDATA[
+    @font-face { font-family:"Arial";src:url("#FontID1") format(svg)}
+    @font-face { font-family:"Futura Md BT";src:url("#FontID0") format(svg)}
+    .str2 {stroke-width:5.05}
+    .str1 {stroke:#2B2A29;stroke-width:7.62}
+    .str4 {stroke:#898989;stroke-width:7.62}
+    .str9 {stroke:#C5C6C6;stroke-width:10.58}
+    .str0 {stroke:#212220;stroke-width:20}
+    .str3 {stroke:#62605E;stroke-width:20}
+    .str8 {stroke:#E09079;stroke-width:35.28}
+    .str7 {stroke:#E32029;stroke-width:35.28}
+    .str12 {stroke:#2B2A29;stroke-width:52.92}
+    .str10 {stroke:#FEFEFE;stroke-width:52.92;stroke-linecap:round;stroke-linejoin:round}
+    .str11 {stroke:#054D00;stroke-width:52.92;stroke-linecap:round;stroke-linejoin:round}
+    .str5 {stroke:#5B5A50;stroke-width:35.28;stroke-dasharray:35.280000 35.280000}
+    .str6 {stroke:#9D9C94;stroke-width:35.28;stroke-dasharray:35.280000 35.280000}
+    .fil9 {fill:none}
+    .fil8 {fill:none;fill-rule:nonzero}
+    .fil0 {fill:#2B2A29}
+    .fil2 {fill:#FEFEFE}
+    .fil130 {fill:#054D00}
+    .fil4 {fill:#898989}
+    .fil40 {fill:#B9A8A0}
+    .fil69 {fill:#C9C0BB}
+    .fil3 {fill:#EBECEC}
+    .fil1 {fill:#054D00;fill-rule:nonzero}
+    .fil6 {fill:#6F936D;fill-rule:nonzero}
+    .fil5 {fill:#898989;fill-rule:nonzero}
+    .fil7 {fill:#EBECEC;fill-rule:nonzero}
+    .fil35 {fill:url(#id60)}
+    .fil98 {fill:url(#id61)}
+    .fil39 {fill:url(#id62)}
+    .fil102 {fill:url(#id63)}
+    .fil15 {fill:url(#id64)}
+    .fil22 {fill:url(#id65)}
+    .fil42 {fill:url(#id66)}
+    .fil46 {fill:url(#id67)}
+    .fil44 {fill:url(#id68)}
+    .fil41 {fill:url(#id69)}
+    .fil43 {fill:url(#id70)}
+    .fil47 {fill:url(#id71)}
+    .fil45 {fill:url(#id72)}
+    .fil50 {fill:url(#id73)}
+    .fil49 {fill:url(#id74)}
+    .fil48 {fill:url(#id75)}
+    .fil52 {fill:url(#id76)}
+    .fil51 {fill:url(#id77)}
+    .fil71 {fill:url(#id78)}
+    .fil75 {fill:url(#id79)}
+    .fil73 {fill:url(#id80)}
+    .fil70 {fill:url(#id81)}
+    .fil72 {fill:url(#id82)}
+    .fil76 {fill:url(#id83)}
+    .fil74 {fill:url(#id84)}
+    .fil79 {fill:url(#id85)}
+    .fil78 {fill:url(#id86)}
+    .fil77 {fill:url(#id87)}
+    .fil81 {fill:url(#id88)}
+    .fil80 {fill:url(#id89)}
+    .fil107 {fill:url(#id90)}
+    .fil117 {fill:url(#id91)}
+    .fil120 {fill:url(#id92)}
+    .fil115 {fill:url(#id93)}
+    .fil119 {fill:url(#id94)}
+    .fil118 {fill:url(#id95)}
+    .fil122 {fill:url(#id96)}
+    .fil123 {fill:url(#id97)}
+    .fil113 {fill:url(#id98)}
+    .fil109 {fill:url(#id99)}
+    .fil112 {fill:url(#id100)}
+    .fil110 {fill:url(#id101)}
+    .fil114 {fill:url(#id102)}
+    .fil116 {fill:url(#id103)}
+    .fil121 {fill:url(#id104)}
+    .fil106 {fill:url(#id105)}
+    .fil108 {fill:url(#id106)}
+    .fil111 {fill:url(#id107)}
+    .fil66 {fill:url(#id108)}
+    .fil67 {fill:url(#id109)}
+    .fil95 {fill:url(#id110)}
+    .fil96 {fill:url(#id111)}
+    .fil68 {fill:url(#id112)}
+    .fil97 {fill:url(#id113)}
+    .fil65 {fill:url(#id114)}
+    .fil94 {fill:url(#id115)}
+    .fil57 {fill:url(#id116)}
+    .fil59 {fill:url(#id117)}
+    .fil55 {fill:url(#id118)}
+    .fil53 {fill:url(#id119)}
+    .fil56 {fill:url(#id120)}
+    .fil58 {fill:url(#id121)}
+    .fil54 {fill:url(#id122)}
+    .fil10 {fill:url(#id123)}
+    .fil63 {fill:url(#id124)}
+    .fil64 {fill:url(#id125)}
+    .fil60 {fill:url(#id126)}
+    .fil61 {fill:url(#id127)}
+    .fil62 {fill:url(#id128)}
+    .fil12 {fill:url(#id129)}
+    .fil11 {fill:url(#id130)}
+    .fil86 {fill:url(#id131)}
+    .fil88 {fill:url(#id132)}
+    .fil84 {fill:url(#id133)}
+    .fil82 {fill:url(#id134)}
+    .fil85 {fill:url(#id135)}
+    .fil87 {fill:url(#id136)}
+    .fil83 {fill:url(#id137)}
+    .fil17 {fill:url(#id138)}
+    .fil92 {fill:url(#id139)}
+    .fil93 {fill:url(#id140)}
+    .fil89 {fill:url(#id141)}
+    .fil90 {fill:url(#id142)}
+    .fil91 {fill:url(#id143)}
+    .fil19 {fill:url(#id144)}
+    .fil18 {fill:url(#id145)}
+    .fil101 {fill:url(#id146)}
+    .fil100 {fill:url(#id147)}
+    .fil105 {fill:url(#id148)}
+    .fil104 {fill:url(#id149)}
+    .fil25 {fill:url(#id150)}
+    .fil24 {fill:url(#id151)}
+    .fil29 {fill:url(#id152)}
+    .fil28 {fill:url(#id153)}
+    .fil127 {fill:url(#id154)}
+    .fil126 {fill:url(#id155)}
+    .fil128 {fill:url(#id156)}
+    .fil125 {fill:url(#id157)}
+    .fil99 {fill:url(#id158)}
+    .fil103 {fill:url(#id159)}
+    .fil34 {fill:url(#id160)}
+    .fil32 {fill:url(#id161)}
+    .fil38 {fill:url(#id162)}
+    .fil36 {fill:url(#id163)}
+    .fil27 {fill:url(#id164)}
+    .fil26 {fill:url(#id165)}
+    .fil31 {fill:url(#id166)}
+    .fil30 {fill:url(#id167)}
+    .fil124 {fill:url(#id168)}
+    .fil129 {fill:url(#id169)}
+    .fil33 {fill:url(#id170)}
+    .fil37 {fill:url(#id171)}
+    .fil16 {fill:url(#id172)}
+    .fil23 {fill:url(#id173)}
+    .fil14 {fill:url(#id174)}
+    .fil13 {fill:url(#id175)}
+    .fil21 {fill:url(#id176)}
+    .fil20 {fill:url(#id177)}
+    .fnt7 {font-weight:bold;font-size:423.33px;font-family:'Arial'}
+    .fnt0 {font-weight:bold;font-size:493.89px;font-family:'Futura Md BT'}
+    .fnt1 {font-weight:normal;font-size:1382.5px;font-family:'Futura Md BT'}
+    .fnt5 {font-weight:bold;font-size:1382.5px;font-family:'Futura Md BT'}
+    .fnt2 {font-weight:bold;font-size:1508.17px;font-family:'Futura Md BT'}
+    .fnt6 {font-weight:bold;font-size:1508.2px;font-family:'Arial'}
+    .fnt3 {font-weight:bold;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt4 {font-weight:bold;font-size:1759.55px;font-family:'Futura Md BT'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style25752"><![CDATA[
+    @font-face { font-family:"Futura Md BT";src:url("#FontID0") format(svg)}
+    .str0 {stroke:#FEFEFE;stroke-width:7.62}
+    .str1 {stroke:#FEFEFE;stroke-width:7.62}
+    .fil2 {fill:none}
+    .fil4 {fill:#2B2A29}
+    .fil0 {fill:#FEFEFE}
+    .fil1 {fill:#FEFEFE}
+    .fil3 {fill:#C6D663;fill-rule:nonzero}
+    .fil37 {fill:url(#id51)}
+    .fil38 {fill:url(#id52)}
+    .fil40 {fill:url(#id53)}
+    .fil15 {fill:url(#id54)}
+    .fil74 {fill:url(#id55)}
+    .fil20 {fill:url(#id56)}
+    .fil26 {fill:url(#id57)}
+    .fil25 {fill:url(#id58)}
+    .fil44 {fill:url(#id59)}
+    .fil48 {fill:url(#id60)}
+    .fil34 {fill:url(#id61)}
+    .fil51 {fill:url(#id62)}
+    .fil61 {fill:url(#id63)}
+    .fil56 {fill:url(#id64)}
+    .fil50 {fill:url(#id65)}
+    .fil60 {fill:url(#id66)}
+    .fil53 {fill:url(#id67)}
+    .fil52 {fill:url(#id68)}
+    .fil55 {fill:url(#id69)}
+    .fil58 {fill:url(#id70)}
+    .fil57 {fill:url(#id71)}
+    .fil54 {fill:url(#id72)}
+    .fil62 {fill:url(#id73)}
+    .fil13 {fill:url(#id74)}
+    .fil72 {fill:url(#id75)}
+    .fil9 {fill:url(#id76)}
+    .fil68 {fill:url(#id77)}
+    .fil6 {fill:url(#id78)}
+    .fil65 {fill:url(#id79)}
+    .fil10 {fill:url(#id80)}
+    .fil7 {fill:url(#id81)}
+    .fil69 {fill:url(#id82)}
+    .fil66 {fill:url(#id83)}
+    .fil16 {fill:url(#id84)}
+    .fil75 {fill:url(#id85)}
+    .fil17 {fill:url(#id86)}
+    .fil76 {fill:url(#id87)}
+    .fil11 {fill:url(#id88)}
+    .fil70 {fill:url(#id89)}
+    .fil12 {fill:url(#id90)}
+    .fil8 {fill:url(#id91)}
+    .fil71 {fill:url(#id92)}
+    .fil67 {fill:url(#id93)}
+    .fil14 {fill:url(#id94)}
+    .fil73 {fill:url(#id95)}
+    .fil29 {fill:url(#id96)}
+    .fil33 {fill:url(#id97)}
+    .fil19 {fill:url(#id98)}
+    .fil43 {fill:url(#id99)}
+    .fil45 {fill:url(#id100)}
+    .fil39 {fill:url(#id101)}
+    .fil36 {fill:url(#id102)}
+    .fil46 {fill:url(#id103)}
+    .fil47 {fill:url(#id104)}
+    .fil41 {fill:url(#id105)}
+    .fil35 {fill:url(#id106)}
+    .fil42 {fill:url(#id107)}
+    .fil59 {fill:url(#id108)}
+    .fil49 {fill:url(#id109)}
+    .fil63 {fill:url(#id110)}
+    .fil5 {fill:url(#id111)}
+    .fil18 {fill:url(#id112)}
+    .fil64 {fill:url(#id113)}
+    .fil77 {fill:url(#id114)}
+    .fil28 {fill:url(#id115)}
+    .fil31 {fill:url(#id116)}
+    .fil32 {fill:url(#id117)}
+    .fil21 {fill:url(#id118)}
+    .fil22 {fill:url(#id119)}
+    .fil24 {fill:url(#id120)}
+    .fil23 {fill:url(#id121)}
+    .fil27 {fill:url(#id122)}
+    .fil30 {fill:url(#id123)}
+    .fnt0 {font-weight:bold;font-size:1243.98px;font-family:'Futura Md BT'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style98"><![CDATA[
+    @font-face { font-family:"Symbol";src:url("#FontID1") format(svg)}
+    @font-face { font-family:"Arial";src:url("#FontID0") format(svg)}
+    .str1 {stroke:#FEFEFE;stroke-width:7.62}
+    .str2 {stroke:#FEFEFE;stroke-width:35.28}
+    .str0 {stroke:#FEFEFE;stroke-width:52.92}
+    .str5 {stroke:#212220;stroke-width:52.92}
+    .str6 {stroke:#2B2A29;stroke-width:70.56}
+    .str3 {stroke:#FEFEFE;stroke-width:70.56}
+    .str4 {stroke:#212220;stroke-width:70.56}
+    .fil2 {fill:none}
+    .fil3 {fill:#2B2A29}
+    .fil0 {fill:#FEFEFE}
+    .fil5 {fill:#1C1B17;fill-rule:nonzero}
+    .fil1 {fill:#FEFEFE;fill-rule:nonzero}
+    .fil4 {fill:#212220;fill-rule:nonzero}
+    .fnt1 {font-weight:bold;font-size:423.33px;font-family:'Arial'}
+    .fnt4 {font-weight:bold;font-size:423.33px;font-family:'Arial'}
+    .fnt5 {font-weight:bold;font-size:493.88px;font-family:'Arial'}
+    .fnt2 {font-weight:normal;font-size:1508.2px;font-family:'Symbol'}
+    .fnt0 {font-weight:bold;font-size:1508.2px;font-family:'Arial'}
+    .fnt3 {font-weight:bold;font-size:1508.2px;font-family:'Arial'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style7232"><![CDATA[
+    @font-face { font-family:"Arial";src:url("#FontID0") format(svg)}
+    .str0 {stroke:#FEFEFE;stroke-width:70.56}
+    .fil0 {fill:none}
+    .fil2 {fill:#FEFEFE}
+    .fil1 {fill:#FEFEFE;fill-rule:nonzero}
+    .fnt0 {font-weight:bold;font-size:2533.72px;font-family:'Arial'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style7094"><![CDATA[
+    @font-face { font-family:"Futura Md BT";src:url("#FontID1") format(svg)}
+    @font-face { font-family:"Symbol";src:url("#FontID0") format(svg)}
+    .str2 {stroke:#2B2A29;stroke-width:7.62}
+    .str3 {stroke:#9D9E9E;stroke-width:7.62}
+    .str5 {stroke:#FEFEFE;stroke-width:42.33}
+    .str7 {stroke:#FEFEFE;stroke-width:42.33}
+    .str9 {stroke:#FEFEFE;stroke-width:52.92}
+    .str4 {stroke:#2B2A29;stroke-width:70.56}
+    .str10 {stroke:#727271;stroke-width:70.56}
+    .str8 {stroke:#FEFEFE;stroke-width:70.56}
+    .str6 {stroke:#9D9E9E;stroke-width:70.56}
+    .str0 {stroke:#FEFEFE;stroke-width:42.33;stroke-dasharray:84.660000 42.330000}
+    .str1 {stroke:#FEFEFE;stroke-width:42.33;stroke-dasharray:84.660000 42.330000}
+    .fil0 {fill:none}
+    .fil2 {fill:#2B2A29}
+    .fil7 {fill:#FEFEFE}
+    .fil5 {fill:#9D9E9E}
+    .fil1 {fill:#FEFEFE}
+    .fil3 {fill:#2B2A29;fill-rule:nonzero}
+    .fil6 {fill:#FEFEFE;fill-rule:nonzero}
+    .fil4 {fill:#9D9E9E;fill-rule:nonzero}
+    .fil8 {fill:#FEFEFE;fill-rule:nonzero}
+    .fil94 {fill:url(#id25)}
+    .fil97 {fill:url(#id26)}
+    .fil59 {fill:url(#id27)}
+    .fil26 {fill:url(#id28)}
+    .fil41 {fill:url(#id29)}
+    .fil112 {fill:url(#id30)}
+    .fil61 {fill:url(#id31)}
+    .fil48 {fill:url(#id32)}
+    .fil17 {fill:url(#id33)}
+    .fil105 {fill:url(#id34)}
+    .fil46 {fill:url(#id35)}
+    .fil89 {fill:url(#id36)}
+    .fil91 {fill:url(#id37)}
+    .fil76 {fill:url(#id38)}
+    .fil43 {fill:url(#id39)}
+    .fil62 {fill:url(#id40)}
+    .fil79 {fill:url(#id41)}
+    .fil55 {fill:url(#id42)}
+    .fil64 {fill:url(#id43)}
+    .fil92 {fill:url(#id44)}
+    .fil37 {fill:url(#id45)}
+    .fil90 {fill:url(#id46)}
+    .fil28 {fill:url(#id47)}
+    .fil108 {fill:url(#id48)}
+    .fil100 {fill:url(#id49)}
+    .fil80 {fill:url(#id50)}
+    .fil98 {fill:url(#id51)}
+    .fil111 {fill:url(#id52)}
+    .fil70 {fill:url(#id53)}
+    .fil35 {fill:url(#id54)}
+    .fil103 {fill:url(#id55)}
+    .fil104 {fill:url(#id56)}
+    .fil49 {fill:url(#id57)}
+    .fil65 {fill:url(#id58)}
+    .fil33 {fill:url(#id59)}
+    .fil84 {fill:url(#id60)}
+    .fil102 {fill:url(#id61)}
+    .fil88 {fill:url(#id62)}
+    .fil68 {fill:url(#id63)}
+    .fil51 {fill:url(#id64)}
+    .fil85 {fill:url(#id65)}
+    .fil86 {fill:url(#id66)}
+    .fil47 {fill:url(#id67)}
+    .fil50 {fill:url(#id68)}
+    .fil56 {fill:url(#id69)}
+    .fil54 {fill:url(#id70)}
+    .fil18 {fill:url(#id71)}
+    .fil72 {fill:url(#id72)}
+    .fil38 {fill:url(#id73)}
+    .fil53 {fill:url(#id74)}
+    .fil52 {fill:url(#id75)}
+    .fil15 {fill:url(#id76)}
+    .fil34 {fill:url(#id77)}
+    .fil107 {fill:url(#id78)}
+    .fil83 {fill:url(#id79)}
+    .fil106 {fill:url(#id80)}
+    .fil45 {fill:url(#id81)}
+    .fil99 {fill:url(#id82)}
+    .fil73 {fill:url(#id83)}
+    .fil67 {fill:url(#id84)}
+    .fil81 {fill:url(#id85)}
+    .fil78 {fill:url(#id86)}
+    .fil39 {fill:url(#id87)}
+    .fil93 {fill:url(#id88)}
+    .fil66 {fill:url(#id89)}
+    .fil29 {fill:url(#id90)}
+    .fil44 {fill:url(#id91)}
+    .fil31 {fill:url(#id92)}
+    .fil32 {fill:url(#id93)}
+    .fil42 {fill:url(#id94)}
+    .fil96 {fill:url(#id95)}
+    .fil60 {fill:url(#id96)}
+    .fil21 {fill:url(#id97)}
+    .fil115 {fill:url(#id98)}
+    .fil69 {fill:url(#id99)}
+    .fil109 {fill:url(#id100)}
+    .fil116 {fill:url(#id101)}
+    .fil19 {fill:url(#id102)}
+    .fil110 {fill:url(#id103)}
+    .fil87 {fill:url(#id104)}
+    .fil12 {fill:url(#id105)}
+    .fil9 {fill:url(#id106)}
+    .fil16 {fill:url(#id107)}
+    .fil71 {fill:url(#id108)}
+    .fil30 {fill:url(#id109)}
+    .fil101 {fill:url(#id110)}
+    .fil95 {fill:url(#id111)}
+    .fil10 {fill:url(#id112)}
+    .fil13 {fill:url(#id113)}
+    .fil11 {fill:url(#id114)}
+    .fil63 {fill:url(#id115)}
+    .fil27 {fill:url(#id116)}
+    .fil23 {fill:url(#id117)}
+    .fil113 {fill:url(#id118)}
+    .fil14 {fill:url(#id119)}
+    .fil74 {fill:url(#id120)}
+    .fil36 {fill:url(#id121)}
+    .fil82 {fill:url(#id122)}
+    .fil40 {fill:url(#id123)}
+    .fil24 {fill:url(#id124)}
+    .fil75 {fill:url(#id125)}
+    .fil20 {fill:url(#id126)}
+    .fil25 {fill:url(#id127)}
+    .fil57 {fill:url(#id128)}
+    .fil22 {fill:url(#id129)}
+    .fil77 {fill:url(#id130)}
+    .fil114 {fill:url(#id131)}
+    .fil58 {fill:url(#id132)}
+    .fnt6 {font-weight:bold;font-size:423.33px;font-family:'Futura Md BT'}
+    .fnt0 {font-weight:normal;font-size:1131.15px;font-family:'Symbol'}
+    .fnt1 {font-weight:bold;font-size:1131.15px;font-family:'Futura Md BT'}
+    .fnt8 {font-weight:bold;font-size:1256.81px;font-family:'Futura Md BT'}
+    .fnt5 {font-weight:normal;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt7 {font-weight:bold;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt4 {font-weight:normal;font-size:1900.27px;font-family:'Futura Md BT'}
+    .fnt9 {font-weight:normal;font-size:2111.45px;font-family:'Futura Md BT'}
+    .fnt3 {font-weight:normal;font-size:2533.72px;font-family:'Futura Md BT'}
+    .fnt2 {font-weight:bold;font-size:2533.72px;font-family:'Futura Md BT'}
+   ]]></style>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="9.4759014"
+     inkscape:cx="10.744916"
+     inkscape:cy="22.274133"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true"
+     inkscape:snap-grids="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77811,-595.10722)">
+    <path
+       style="fill:url(#linearGradient8425);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 246.27811,595.60722 h 21 v 2 l -6.5,10.5 -6,-10.5 h -8.5 z"
+       id="path4763"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 260.56574,601.46532 c -0.0435,-1.8491 2.94024,0.22303 6.9605,0.15554 -2.37934,0.87001 -4.78447,3.12651 -6.54699,4.79868 -0.69731,-2.00112 -0.66057,-4.5027 -0.41351,-4.95422 z"
+       id="path8400"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc"
+       transform="rotate(96.15813,261.98063,600.60609)" />
+    <path
+       style="fill:none;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.8892617"
+       d="m 254.77811,597.60722 h 12"
+       id="path8429"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="ccccccc"
+       inkscape:connector-curvature="0"
+       id="path8431"
+       d="m 246.27811,595.60722 h 21 v 2 l -6.5,10.5 -6,-10.5 h -8.5 z"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318"
+       transform="matrix(1.0666667,0,0,1.0666667,641.03977,883.51086)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386"
+       transform="matrix(1.0666667,0,0,1.0666667,1224.7427,320.09945)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162"
+       transform="matrix(1.0666667,0,0,1.0666667,483.79064,152.88667)" />
+    <path
+       style="color:#ff0000;fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 245.77811,614.60722 h 0.84827 l 3.15173,-4.9925 2.5055,-0.004 2.5055,0.004 1.57586,2.49625 h 0.83594 l 1.57586,-2.49625 2.5055,-0.004 2.5055,0.004 3.15173,4.9925 h 0.84827"
+       id="path7438"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccc" />
+    <text
+       id="text7408-2"
+       class="fil7 fnt4"
+       y="183.92776"
+       x="-484.44421"
+       style="font-weight:normal;font-size:10.66666698px;font-family:'Futura Md BT';text-align:center;text-anchor:middle;clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;stroke-width:1.06666672;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422"
+       class="fil7 fnt4"
+       y="213.22548"
+       x="-466.97989"
+       style="font-weight:normal;font-size:10.66666698px;font-family:'Futura Md BT';text-align:center;text-anchor:middle;clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;stroke-width:1.06666672;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <path
+       sodipodi:nodetypes="cccccccc"
+       id="path8487"
+       d="m 267.77684,618.10722 h -4 v -5 h -5 l -0.0364,5 h -2.8892 -0.0728 -3.3e-4"
+       inkscape:connector-curvature="0"
+       style="color:#ff0000;fill:none;stroke:#e15244;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="color:#ff0000;fill:none;stroke:#e15244;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       inkscape:connector-curvature="0"
+       d="m 245.77811,618.10722 h 4 v -5 h 5 l 0.0364,5 h 2.8892 0.0728 3.3e-4"
+       id="path7427"
+       sodipodi:nodetypes="cccccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_tip_estimation-24.svg b/pixmaps/src/gwy_tip_estimation-24.svg
new file mode 100644
index 0000000..15f081d
--- /dev/null
+++ b/pixmaps/src/gwy_tip_estimation-24.svg
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_tip_estimation-24.svg"
+   inkscape:export-filename="gwy_flip_horizontally-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8095">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8423">
+      <stop
+         style="stop-color:#6c7d92;stop-opacity:1"
+         offset="0"
+         id="stop8419" />
+      <stop
+         id="stop8427"
+         offset="0.49999958"
+         style="stop-color:#a3b8d2;stop-opacity:1" />
+      <stop
+         style="stop-color:#446a97;stop-opacity:1"
+         offset="1"
+         id="stop8421" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8458"
+       x="-0.12856513"
+       width="1.2571303"
+       y="-0.11250482"
+       height="1.2250096">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.16275744"
+         id="feGaussianBlur8460" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8423"
+       id="linearGradient8425"
+       x1="263.77811"
+       y1="602.10724"
+       x2="257.77811"
+       y2="602.10724"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="6.7254415"
+     inkscape:cx="29.975016"
+     inkscape:cy="30.144551"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77811,-595.10722)">
+    <path
+       style="fill:url(#linearGradient8425);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 246.27811,600.60722 h 21 v 2 l -6.5,10.5 -6,-10.5 h -8.5 z"
+       id="path4763"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 260.56574,601.46532 c -0.0435,-1.8491 2.94024,0.22303 6.9605,0.15554 -2.37934,0.87001 -4.78447,3.12651 -6.54699,4.79868 -0.69731,-2.00112 -0.66057,-4.5027 -0.41351,-4.95422 z"
+       id="path8400"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc"
+       transform="rotate(96.15813,259.73583,603.10609)" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.88926172;fill-opacity:0.49803922"
+       d="m 254.77811,602.60722 h 12"
+       id="path8429"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="ccccccc"
+       inkscape:connector-curvature="0"
+       id="path8431"
+       d="m 246.27811,600.60722 h 21 v 2 l -6.5,10.5 -6,-10.5 h -8.5 z"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:17.87092972px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="250.36726"
+       y="617.08038"
+       id="text8429"><tspan
+         sodipodi:role="line"
+         id="tspan8427"
+         x="250.36726"
+         y="617.08038"
+         style="stroke-width:1px">?</tspan></text>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_tip_indent_analyze-24.svg b/pixmaps/src/gwy_tip_indent_analyze-24.svg
new file mode 100644
index 0000000..5da1ca2
--- /dev/null
+++ b/pixmaps/src/gwy_tip_indent_analyze-24.svg
@@ -0,0 +1,1115 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_tip_indent_analyze-24.svg"
+   inkscape:export-filename="gwy_cantilever-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8095">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8423">
+      <stop
+         style="stop-color:#6c7d92;stop-opacity:1"
+         offset="0"
+         id="stop8419" />
+      <stop
+         id="stop8427"
+         offset="0.49999958"
+         style="stop-color:#a3b8d2;stop-opacity:1" />
+      <stop
+         style="stop-color:#446a97;stop-opacity:1"
+         offset="1"
+         id="stop8421" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8458"
+       x="-0.12856513"
+       width="1.2571303"
+       y="-0.11250482"
+       height="1.2250096">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.16275744"
+         id="feGaussianBlur8460" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8423"
+       id="linearGradient8425"
+       x1="263.77811"
+       y1="602.10724"
+       x2="257.77811"
+       y2="602.10724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-5)" />
+    <defs
+       id="defs7146">
+      <circle
+         r="0.5"
+         id="gpDot"
+         cx="0"
+         cy="0"
+         style="stroke-width:0.5" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1"
+         id="gpPt0"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,-1 1,1 M 1,-1 -1,1"
+         id="gpPt1"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1 m -1,-2 2,2 m -2,0 2,-2"
+         id="gpPt2"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt3"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt4"
+         style="fill:currentColor;stroke:currentColor;stroke-width:0.222" />
+      <circle
+         r="1"
+         cy="0"
+         cx="0"
+         id="gpPt5"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt6"
+         xlink:href="#gpPt5"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <path
+         d="m 0,-1.33 -1.33,2 2.66,0 z"
+         id="gpPt7"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt8"
+         xlink:href="#gpPt7"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="scale(-1,-1)"
+         id="gpPt9"
+         xlink:href="#gpPt7"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt10"
+         xlink:href="#gpPt9"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+         id="gpPt11"
+         xlink:href="#gpPt3"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt12"
+         xlink:href="#gpPt11"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+    </defs>
+    <defs
+       id="defs6370">
+      <circle
+         r="0.5"
+         id="gpDot-2"
+         cx="0"
+         cy="0"
+         style="stroke-width:0.5" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1"
+         id="gpPt0-7"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,-1 1,1 M 1,-1 -1,1"
+         id="gpPt1-3"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1 m -1,-2 2,2 m -2,0 2,-2"
+         id="gpPt2-25"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt3-2"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt4-40"
+         style="fill:currentColor;stroke:currentColor;stroke-width:0.222" />
+      <circle
+         r="1"
+         cy="0"
+         cx="0"
+         id="gpPt5-5"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt6-0"
+         xlink:href="#gpPt5-5"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <path
+         d="m 0,-1.33 -1.33,2 2.66,0 z"
+         id="gpPt7-2"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt8-8"
+         xlink:href="#gpPt7-2"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="scale(-1,-1)"
+         id="gpPt9-2"
+         xlink:href="#gpPt7-2"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt10-7"
+         xlink:href="#gpPt9-2"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+         id="gpPt11-1"
+         xlink:href="#gpPt3-2"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt12-2"
+         xlink:href="#gpPt11-1"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+    </defs>
+    <defs
+       id="defs5302">
+      <circle
+         r="0.5"
+         id="gpDot-16"
+         cx="0"
+         cy="0"
+         style="stroke-width:0.5" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1"
+         id="gpPt0-9"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,-1 1,1 M 1,-1 -1,1"
+         id="gpPt1-15"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1 m -1,-2 2,2 m -2,0 2,-2"
+         id="gpPt2-2"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt3-8"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt4-4"
+         style="fill:currentColor;stroke:currentColor;stroke-width:0.222" />
+      <circle
+         r="1"
+         cy="0"
+         cx="0"
+         id="gpPt5-0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt6-93"
+         xlink:href="#gpPt5-0"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <path
+         d="m 0,-1.33 -1.33,2 2.66,0 z"
+         id="gpPt7-4"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt8-6"
+         xlink:href="#gpPt7-4"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="scale(-1,-1)"
+         id="gpPt9-9"
+         xlink:href="#gpPt7-4"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt10-0"
+         xlink:href="#gpPt9-9"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+         id="gpPt11-5"
+         xlink:href="#gpPt3-8"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt12-5"
+         xlink:href="#gpPt11-5"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+    </defs>
+    <style
+       type="text/css"
+       id="style7591"><![CDATA[
+    @font-face { font-family:"Futura Md BT";src:url("#FontID0") format(svg)}
+    .str0 {stroke:#2B2A29;stroke-width:20}
+    .str3 {stroke:#212220;stroke-width:20}
+    .str4 {stroke:#E32029;stroke-width:35.28}
+    .str1 {stroke:#FEFEFE;stroke-width:52.92}
+    .str2 {stroke:#5B5A50;stroke-width:35.28;stroke-dasharray:35.280000 35.280000}
+    .fil0 {fill:none}
+    .fil2 {fill:none;fill-rule:nonzero}
+    .fil1 {fill:#2B2A29}
+    .fil3 {fill:#FEFEFE}
+    .fil11 {fill:#B9A8A0}
+    .fil96 {fill:#284A98;fill-rule:nonzero}
+    .fil100 {fill:url(#id0)}
+    .fil97 {fill:url(#id1)}
+    .fil124 {fill:url(#id2)}
+    .fil95 {fill:url(#id3)}
+    .fil126 {fill:url(#id4)}
+    .fil125 {fill:url(#id5)}
+    .fil128 {fill:url(#id6)}
+    .fil127 {fill:url(#id7)}
+    .fil69 {fill:url(#id8)}
+    .fil73 {fill:url(#id9)}
+    .fil71 {fill:url(#id10)}
+    .fil68 {fill:url(#id11)}
+    .fil70 {fill:url(#id12)}
+    .fil74 {fill:url(#id13)}
+    .fil72 {fill:url(#id14)}
+    .fil41 {fill:url(#id15)}
+    .fil13 {fill:url(#id16)}
+    .fil45 {fill:url(#id17)}
+    .fil17 {fill:url(#id18)}
+    .fil43 {fill:url(#id19)}
+    .fil40 {fill:url(#id20)}
+    .fil15 {fill:url(#id21)}
+    .fil12 {fill:url(#id22)}
+    .fil42 {fill:url(#id23)}
+    .fil46 {fill:url(#id24)}
+    .fil14 {fill:url(#id25)}
+    .fil18 {fill:url(#id26)}
+    .fil44 {fill:url(#id27)}
+    .fil16 {fill:url(#id28)}
+    .fil77 {fill:url(#id29)}
+    .fil76 {fill:url(#id30)}
+    .fil75 {fill:url(#id31)}
+    .fil79 {fill:url(#id32)}
+    .fil78 {fill:url(#id33)}
+    .fil49 {fill:url(#id34)}
+    .fil21 {fill:url(#id35)}
+    .fil48 {fill:url(#id36)}
+    .fil47 {fill:url(#id37)}
+    .fil20 {fill:url(#id38)}
+    .fil19 {fill:url(#id39)}
+    .fil51 {fill:url(#id40)}
+    .fil50 {fill:url(#id41)}
+    .fil23 {fill:url(#id42)}
+    .fil22 {fill:url(#id43)}
+    .fil115 {fill:url(#id44)}
+    .fil113 {fill:url(#id45)}
+    .fil102 {fill:url(#id46)}
+    .fil105 {fill:url(#id47)}
+    .fil106 {fill:url(#id48)}
+    .fil114 {fill:url(#id49)}
+    .fil117 {fill:url(#id50)}
+    .fil112 {fill:url(#id51)}
+    .fil104 {fill:url(#id52)}
+    .fil110 {fill:url(#id53)}
+    .fil108 {fill:url(#id54)}
+    .fil116 {fill:url(#id55)}
+    .fil111 {fill:url(#id56)}
+    .fil101 {fill:url(#id57)}
+    .fil103 {fill:url(#id58)}
+    .fil118 {fill:url(#id59)}
+    .fil107 {fill:url(#id60)}
+    .fil109 {fill:url(#id61)}
+    .fil90 {fill:url(#id62)}
+    .fil67 {fill:url(#id63)}
+    .fil39 {fill:url(#id64)}
+    .fil65 {fill:url(#id65)}
+    .fil64 {fill:url(#id66)}
+    .fil37 {fill:url(#id67)}
+    .fil36 {fill:url(#id68)}
+    .fil66 {fill:url(#id69)}
+    .fil38 {fill:url(#id70)}
+    .fil91 {fill:url(#id71)}
+    .fil83 {fill:url(#id72)}
+    .fil85 {fill:url(#id73)}
+    .fil81 {fill:url(#id74)}
+    .fil80 {fill:url(#id75)}
+    .fil82 {fill:url(#id76)}
+    .fil84 {fill:url(#id77)}
+    .fil4 {fill:url(#id78)}
+    .fil56 {fill:url(#id79)}
+    .fil28 {fill:url(#id80)}
+    .fil58 {fill:url(#id81)}
+    .fil54 {fill:url(#id82)}
+    .fil30 {fill:url(#id83)}
+    .fil26 {fill:url(#id84)}
+    .fil52 {fill:url(#id85)}
+    .fil55 {fill:url(#id86)}
+    .fil24 {fill:url(#id87)}
+    .fil27 {fill:url(#id88)}
+    .fil57 {fill:url(#id89)}
+    .fil29 {fill:url(#id90)}
+    .fil53 {fill:url(#id91)}
+    .fil25 {fill:url(#id92)}
+    .fil88 {fill:url(#id93)}
+    .fil89 {fill:url(#id94)}
+    .fil86 {fill:url(#id95)}
+    .fil87 {fill:url(#id96)}
+    .fil62 {fill:url(#id97)}
+    .fil63 {fill:url(#id98)}
+    .fil34 {fill:url(#id99)}
+    .fil35 {fill:url(#id100)}
+    .fil59 {fill:url(#id101)}
+    .fil60 {fill:url(#id102)}
+    .fil31 {fill:url(#id103)}
+    .fil32 {fill:url(#id104)}
+    .fil61 {fill:url(#id105)}
+    .fil33 {fill:url(#id106)}
+    .fil6 {fill:url(#id107)}
+    .fil5 {fill:url(#id108)}
+    .fil10 {fill:url(#id109)}
+    .fil9 {fill:url(#id110)}
+    .fil94 {fill:url(#id111)}
+    .fil8 {fill:url(#id112)}
+    .fil7 {fill:url(#id113)}
+    .fil99 {fill:url(#id114)}
+    .fil98 {fill:url(#id115)}
+    .fil122 {fill:url(#id116)}
+    .fil121 {fill:url(#id117)}
+    .fil123 {fill:url(#id118)}
+    .fil119 {fill:url(#id119)}
+    .fil120 {fill:url(#id120)}
+    .fil92 {fill:url(#id121)}
+    .fil93 {fill:url(#id122)}
+    .fnt3 {font-weight:normal;font-size:1136.24px;font-family:'Futura Md BT'}
+    .fnt2 {font-weight:normal;font-size:1256.81px;font-family:'Futura Md BT'}
+    .fnt4 {font-weight:normal;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt1 {font-weight:bold;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt0 {font-weight:bold;font-size:2010.9px;font-family:'Futura Md BT'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style9234"><![CDATA[
+    @font-face { font-family:"Futura Md BT";src:url("#FontID0") format(svg)}
+    .str0 {stroke:#C5C6C6;stroke-width:10.58}
+    .str3 {stroke:#C5C6C6;stroke-width:17.64;stroke-linecap:round;stroke-linejoin:round}
+    .str4 {stroke:#E32029;stroke-width:35.28}
+    .str1 {stroke:#FEFEFE;stroke-width:52.92}
+    .str5 {stroke:#FEFEFE;stroke-width:52.92;stroke-linecap:round;stroke-linejoin:round}
+    .str6 {stroke:#054D00;stroke-width:52.92;stroke-linecap:round;stroke-linejoin:round}
+    .str2 {stroke:#5B5A50;stroke-width:35.28;stroke-dasharray:35.280000 35.280000}
+    .fil41 {fill:none}
+    .fil44 {fill:none;fill-rule:nonzero}
+    .fil2 {fill:#2B2A29}
+    .fil1 {fill:#FEFEFE}
+    .fil0 {fill:#054D00}
+    .fil10 {fill:#054D00;fill-rule:nonzero}
+    .fil45 {fill:url(#id0)}
+    .fil6 {fill:url(#id1)}
+    .fil55 {fill:url(#id2)}
+    .fil13 {fill:url(#id3)}
+    .fil38 {fill:url(#id4)}
+    .fil46 {fill:url(#id5)}
+    .fil7 {fill:url(#id6)}
+    .fil56 {fill:url(#id7)}
+    .fil11 {fill:url(#id8)}
+    .fil43 {fill:url(#id9)}
+    .fil39 {fill:url(#id10)}
+    .fil40 {fill:url(#id11)}
+    .fil42 {fill:url(#id12)}
+    .fil49 {fill:url(#id13)}
+    .fil51 {fill:url(#id14)}
+    .fil52 {fill:url(#id15)}
+    .fil29 {fill:url(#id16)}
+    .fil16 {fill:url(#id17)}
+    .fil23 {fill:url(#id18)}
+    .fil28 {fill:url(#id19)}
+    .fil24 {fill:url(#id20)}
+    .fil18 {fill:url(#id21)}
+    .fil31 {fill:url(#id22)}
+    .fil30 {fill:url(#id23)}
+    .fil22 {fill:url(#id24)}
+    .fil21 {fill:url(#id25)}
+    .fil19 {fill:url(#id26)}
+    .fil25 {fill:url(#id27)}
+    .fil26 {fill:url(#id28)}
+    .fil32 {fill:url(#id29)}
+    .fil20 {fill:url(#id30)}
+    .fil15 {fill:url(#id31)}
+    .fil17 {fill:url(#id32)}
+    .fil27 {fill:url(#id33)}
+    .fil3 {fill:url(#id34)}
+    .fil5 {fill:url(#id35)}
+    .fil4 {fill:url(#id36)}
+    .fil14 {fill:url(#id37)}
+    .fil12 {fill:url(#id38)}
+    .fil47 {fill:url(#id39)}
+    .fil8 {fill:url(#id40)}
+    .fil53 {fill:url(#id41)}
+    .fil57 {fill:url(#id42)}
+    .fil36 {fill:url(#id43)}
+    .fil35 {fill:url(#id44)}
+    .fil37 {fill:url(#id45)}
+    .fil33 {fill:url(#id46)}
+    .fil34 {fill:url(#id47)}
+    .fil48 {fill:url(#id48)}
+    .fil9 {fill:url(#id49)}
+    .fil54 {fill:url(#id50)}
+    .fil58 {fill:url(#id51)}
+    .fil50 {fill:url(#id52)}
+    .fnt1 {font-weight:normal;font-size:1382.5px;font-family:'Futura Md BT'}
+    .fnt2 {font-weight:bold;font-size:1382.5px;font-family:'Futura Md BT'}
+    .fnt0 {font-weight:bold;font-size:1759.55px;font-family:'Futura Md BT'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style10533"><![CDATA[
+    @font-face { font-family:"Arial";src:url("#FontID1") format(svg)}
+    @font-face { font-family:"Futura Md BT";src:url("#FontID0") format(svg)}
+    .str2 {stroke-width:5.05}
+    .str1 {stroke:#2B2A29;stroke-width:7.62}
+    .str4 {stroke:#898989;stroke-width:7.62}
+    .str9 {stroke:#C5C6C6;stroke-width:10.58}
+    .str0 {stroke:#212220;stroke-width:20}
+    .str3 {stroke:#62605E;stroke-width:20}
+    .str8 {stroke:#E09079;stroke-width:35.28}
+    .str7 {stroke:#E32029;stroke-width:35.28}
+    .str12 {stroke:#2B2A29;stroke-width:52.92}
+    .str10 {stroke:#FEFEFE;stroke-width:52.92;stroke-linecap:round;stroke-linejoin:round}
+    .str11 {stroke:#054D00;stroke-width:52.92;stroke-linecap:round;stroke-linejoin:round}
+    .str5 {stroke:#5B5A50;stroke-width:35.28;stroke-dasharray:35.280000 35.280000}
+    .str6 {stroke:#9D9C94;stroke-width:35.28;stroke-dasharray:35.280000 35.280000}
+    .fil9 {fill:none}
+    .fil8 {fill:none;fill-rule:nonzero}
+    .fil0 {fill:#2B2A29}
+    .fil2 {fill:#FEFEFE}
+    .fil130 {fill:#054D00}
+    .fil4 {fill:#898989}
+    .fil40 {fill:#B9A8A0}
+    .fil69 {fill:#C9C0BB}
+    .fil3 {fill:#EBECEC}
+    .fil1 {fill:#054D00;fill-rule:nonzero}
+    .fil6 {fill:#6F936D;fill-rule:nonzero}
+    .fil5 {fill:#898989;fill-rule:nonzero}
+    .fil7 {fill:#EBECEC;fill-rule:nonzero}
+    .fil35 {fill:url(#id60)}
+    .fil98 {fill:url(#id61)}
+    .fil39 {fill:url(#id62)}
+    .fil102 {fill:url(#id63)}
+    .fil15 {fill:url(#id64)}
+    .fil22 {fill:url(#id65)}
+    .fil42 {fill:url(#id66)}
+    .fil46 {fill:url(#id67)}
+    .fil44 {fill:url(#id68)}
+    .fil41 {fill:url(#id69)}
+    .fil43 {fill:url(#id70)}
+    .fil47 {fill:url(#id71)}
+    .fil45 {fill:url(#id72)}
+    .fil50 {fill:url(#id73)}
+    .fil49 {fill:url(#id74)}
+    .fil48 {fill:url(#id75)}
+    .fil52 {fill:url(#id76)}
+    .fil51 {fill:url(#id77)}
+    .fil71 {fill:url(#id78)}
+    .fil75 {fill:url(#id79)}
+    .fil73 {fill:url(#id80)}
+    .fil70 {fill:url(#id81)}
+    .fil72 {fill:url(#id82)}
+    .fil76 {fill:url(#id83)}
+    .fil74 {fill:url(#id84)}
+    .fil79 {fill:url(#id85)}
+    .fil78 {fill:url(#id86)}
+    .fil77 {fill:url(#id87)}
+    .fil81 {fill:url(#id88)}
+    .fil80 {fill:url(#id89)}
+    .fil107 {fill:url(#id90)}
+    .fil117 {fill:url(#id91)}
+    .fil120 {fill:url(#id92)}
+    .fil115 {fill:url(#id93)}
+    .fil119 {fill:url(#id94)}
+    .fil118 {fill:url(#id95)}
+    .fil122 {fill:url(#id96)}
+    .fil123 {fill:url(#id97)}
+    .fil113 {fill:url(#id98)}
+    .fil109 {fill:url(#id99)}
+    .fil112 {fill:url(#id100)}
+    .fil110 {fill:url(#id101)}
+    .fil114 {fill:url(#id102)}
+    .fil116 {fill:url(#id103)}
+    .fil121 {fill:url(#id104)}
+    .fil106 {fill:url(#id105)}
+    .fil108 {fill:url(#id106)}
+    .fil111 {fill:url(#id107)}
+    .fil66 {fill:url(#id108)}
+    .fil67 {fill:url(#id109)}
+    .fil95 {fill:url(#id110)}
+    .fil96 {fill:url(#id111)}
+    .fil68 {fill:url(#id112)}
+    .fil97 {fill:url(#id113)}
+    .fil65 {fill:url(#id114)}
+    .fil94 {fill:url(#id115)}
+    .fil57 {fill:url(#id116)}
+    .fil59 {fill:url(#id117)}
+    .fil55 {fill:url(#id118)}
+    .fil53 {fill:url(#id119)}
+    .fil56 {fill:url(#id120)}
+    .fil58 {fill:url(#id121)}
+    .fil54 {fill:url(#id122)}
+    .fil10 {fill:url(#id123)}
+    .fil63 {fill:url(#id124)}
+    .fil64 {fill:url(#id125)}
+    .fil60 {fill:url(#id126)}
+    .fil61 {fill:url(#id127)}
+    .fil62 {fill:url(#id128)}
+    .fil12 {fill:url(#id129)}
+    .fil11 {fill:url(#id130)}
+    .fil86 {fill:url(#id131)}
+    .fil88 {fill:url(#id132)}
+    .fil84 {fill:url(#id133)}
+    .fil82 {fill:url(#id134)}
+    .fil85 {fill:url(#id135)}
+    .fil87 {fill:url(#id136)}
+    .fil83 {fill:url(#id137)}
+    .fil17 {fill:url(#id138)}
+    .fil92 {fill:url(#id139)}
+    .fil93 {fill:url(#id140)}
+    .fil89 {fill:url(#id141)}
+    .fil90 {fill:url(#id142)}
+    .fil91 {fill:url(#id143)}
+    .fil19 {fill:url(#id144)}
+    .fil18 {fill:url(#id145)}
+    .fil101 {fill:url(#id146)}
+    .fil100 {fill:url(#id147)}
+    .fil105 {fill:url(#id148)}
+    .fil104 {fill:url(#id149)}
+    .fil25 {fill:url(#id150)}
+    .fil24 {fill:url(#id151)}
+    .fil29 {fill:url(#id152)}
+    .fil28 {fill:url(#id153)}
+    .fil127 {fill:url(#id154)}
+    .fil126 {fill:url(#id155)}
+    .fil128 {fill:url(#id156)}
+    .fil125 {fill:url(#id157)}
+    .fil99 {fill:url(#id158)}
+    .fil103 {fill:url(#id159)}
+    .fil34 {fill:url(#id160)}
+    .fil32 {fill:url(#id161)}
+    .fil38 {fill:url(#id162)}
+    .fil36 {fill:url(#id163)}
+    .fil27 {fill:url(#id164)}
+    .fil26 {fill:url(#id165)}
+    .fil31 {fill:url(#id166)}
+    .fil30 {fill:url(#id167)}
+    .fil124 {fill:url(#id168)}
+    .fil129 {fill:url(#id169)}
+    .fil33 {fill:url(#id170)}
+    .fil37 {fill:url(#id171)}
+    .fil16 {fill:url(#id172)}
+    .fil23 {fill:url(#id173)}
+    .fil14 {fill:url(#id174)}
+    .fil13 {fill:url(#id175)}
+    .fil21 {fill:url(#id176)}
+    .fil20 {fill:url(#id177)}
+    .fnt7 {font-weight:bold;font-size:423.33px;font-family:'Arial'}
+    .fnt0 {font-weight:bold;font-size:493.89px;font-family:'Futura Md BT'}
+    .fnt1 {font-weight:normal;font-size:1382.5px;font-family:'Futura Md BT'}
+    .fnt5 {font-weight:bold;font-size:1382.5px;font-family:'Futura Md BT'}
+    .fnt2 {font-weight:bold;font-size:1508.17px;font-family:'Futura Md BT'}
+    .fnt6 {font-weight:bold;font-size:1508.2px;font-family:'Arial'}
+    .fnt3 {font-weight:bold;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt4 {font-weight:bold;font-size:1759.55px;font-family:'Futura Md BT'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style25752"><![CDATA[
+    @font-face { font-family:"Futura Md BT";src:url("#FontID0") format(svg)}
+    .str0 {stroke:#FEFEFE;stroke-width:7.62}
+    .str1 {stroke:#FEFEFE;stroke-width:7.62}
+    .fil2 {fill:none}
+    .fil4 {fill:#2B2A29}
+    .fil0 {fill:#FEFEFE}
+    .fil1 {fill:#FEFEFE}
+    .fil3 {fill:#C6D663;fill-rule:nonzero}
+    .fil37 {fill:url(#id51)}
+    .fil38 {fill:url(#id52)}
+    .fil40 {fill:url(#id53)}
+    .fil15 {fill:url(#id54)}
+    .fil74 {fill:url(#id55)}
+    .fil20 {fill:url(#id56)}
+    .fil26 {fill:url(#id57)}
+    .fil25 {fill:url(#id58)}
+    .fil44 {fill:url(#id59)}
+    .fil48 {fill:url(#id60)}
+    .fil34 {fill:url(#id61)}
+    .fil51 {fill:url(#id62)}
+    .fil61 {fill:url(#id63)}
+    .fil56 {fill:url(#id64)}
+    .fil50 {fill:url(#id65)}
+    .fil60 {fill:url(#id66)}
+    .fil53 {fill:url(#id67)}
+    .fil52 {fill:url(#id68)}
+    .fil55 {fill:url(#id69)}
+    .fil58 {fill:url(#id70)}
+    .fil57 {fill:url(#id71)}
+    .fil54 {fill:url(#id72)}
+    .fil62 {fill:url(#id73)}
+    .fil13 {fill:url(#id74)}
+    .fil72 {fill:url(#id75)}
+    .fil9 {fill:url(#id76)}
+    .fil68 {fill:url(#id77)}
+    .fil6 {fill:url(#id78)}
+    .fil65 {fill:url(#id79)}
+    .fil10 {fill:url(#id80)}
+    .fil7 {fill:url(#id81)}
+    .fil69 {fill:url(#id82)}
+    .fil66 {fill:url(#id83)}
+    .fil16 {fill:url(#id84)}
+    .fil75 {fill:url(#id85)}
+    .fil17 {fill:url(#id86)}
+    .fil76 {fill:url(#id87)}
+    .fil11 {fill:url(#id88)}
+    .fil70 {fill:url(#id89)}
+    .fil12 {fill:url(#id90)}
+    .fil8 {fill:url(#id91)}
+    .fil71 {fill:url(#id92)}
+    .fil67 {fill:url(#id93)}
+    .fil14 {fill:url(#id94)}
+    .fil73 {fill:url(#id95)}
+    .fil29 {fill:url(#id96)}
+    .fil33 {fill:url(#id97)}
+    .fil19 {fill:url(#id98)}
+    .fil43 {fill:url(#id99)}
+    .fil45 {fill:url(#id100)}
+    .fil39 {fill:url(#id101)}
+    .fil36 {fill:url(#id102)}
+    .fil46 {fill:url(#id103)}
+    .fil47 {fill:url(#id104)}
+    .fil41 {fill:url(#id105)}
+    .fil35 {fill:url(#id106)}
+    .fil42 {fill:url(#id107)}
+    .fil59 {fill:url(#id108)}
+    .fil49 {fill:url(#id109)}
+    .fil63 {fill:url(#id110)}
+    .fil5 {fill:url(#id111)}
+    .fil18 {fill:url(#id112)}
+    .fil64 {fill:url(#id113)}
+    .fil77 {fill:url(#id114)}
+    .fil28 {fill:url(#id115)}
+    .fil31 {fill:url(#id116)}
+    .fil32 {fill:url(#id117)}
+    .fil21 {fill:url(#id118)}
+    .fil22 {fill:url(#id119)}
+    .fil24 {fill:url(#id120)}
+    .fil23 {fill:url(#id121)}
+    .fil27 {fill:url(#id122)}
+    .fil30 {fill:url(#id123)}
+    .fnt0 {font-weight:bold;font-size:1243.98px;font-family:'Futura Md BT'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style98"><![CDATA[
+    @font-face { font-family:"Symbol";src:url("#FontID1") format(svg)}
+    @font-face { font-family:"Arial";src:url("#FontID0") format(svg)}
+    .str1 {stroke:#FEFEFE;stroke-width:7.62}
+    .str2 {stroke:#FEFEFE;stroke-width:35.28}
+    .str0 {stroke:#FEFEFE;stroke-width:52.92}
+    .str5 {stroke:#212220;stroke-width:52.92}
+    .str6 {stroke:#2B2A29;stroke-width:70.56}
+    .str3 {stroke:#FEFEFE;stroke-width:70.56}
+    .str4 {stroke:#212220;stroke-width:70.56}
+    .fil2 {fill:none}
+    .fil3 {fill:#2B2A29}
+    .fil0 {fill:#FEFEFE}
+    .fil5 {fill:#1C1B17;fill-rule:nonzero}
+    .fil1 {fill:#FEFEFE;fill-rule:nonzero}
+    .fil4 {fill:#212220;fill-rule:nonzero}
+    .fnt1 {font-weight:bold;font-size:423.33px;font-family:'Arial'}
+    .fnt4 {font-weight:bold;font-size:423.33px;font-family:'Arial'}
+    .fnt5 {font-weight:bold;font-size:493.88px;font-family:'Arial'}
+    .fnt2 {font-weight:normal;font-size:1508.2px;font-family:'Symbol'}
+    .fnt0 {font-weight:bold;font-size:1508.2px;font-family:'Arial'}
+    .fnt3 {font-weight:bold;font-size:1508.2px;font-family:'Arial'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style7232"><![CDATA[
+    @font-face { font-family:"Arial";src:url("#FontID0") format(svg)}
+    .str0 {stroke:#FEFEFE;stroke-width:70.56}
+    .fil0 {fill:none}
+    .fil2 {fill:#FEFEFE}
+    .fil1 {fill:#FEFEFE;fill-rule:nonzero}
+    .fnt0 {font-weight:bold;font-size:2533.72px;font-family:'Arial'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style7094"><![CDATA[
+    @font-face { font-family:"Futura Md BT";src:url("#FontID1") format(svg)}
+    @font-face { font-family:"Symbol";src:url("#FontID0") format(svg)}
+    .str2 {stroke:#2B2A29;stroke-width:7.62}
+    .str3 {stroke:#9D9E9E;stroke-width:7.62}
+    .str5 {stroke:#FEFEFE;stroke-width:42.33}
+    .str7 {stroke:#FEFEFE;stroke-width:42.33}
+    .str9 {stroke:#FEFEFE;stroke-width:52.92}
+    .str4 {stroke:#2B2A29;stroke-width:70.56}
+    .str10 {stroke:#727271;stroke-width:70.56}
+    .str8 {stroke:#FEFEFE;stroke-width:70.56}
+    .str6 {stroke:#9D9E9E;stroke-width:70.56}
+    .str0 {stroke:#FEFEFE;stroke-width:42.33;stroke-dasharray:84.660000 42.330000}
+    .str1 {stroke:#FEFEFE;stroke-width:42.33;stroke-dasharray:84.660000 42.330000}
+    .fil0 {fill:none}
+    .fil2 {fill:#2B2A29}
+    .fil7 {fill:#FEFEFE}
+    .fil5 {fill:#9D9E9E}
+    .fil1 {fill:#FEFEFE}
+    .fil3 {fill:#2B2A29;fill-rule:nonzero}
+    .fil6 {fill:#FEFEFE;fill-rule:nonzero}
+    .fil4 {fill:#9D9E9E;fill-rule:nonzero}
+    .fil8 {fill:#FEFEFE;fill-rule:nonzero}
+    .fil94 {fill:url(#id25)}
+    .fil97 {fill:url(#id26)}
+    .fil59 {fill:url(#id27)}
+    .fil26 {fill:url(#id28)}
+    .fil41 {fill:url(#id29)}
+    .fil112 {fill:url(#id30)}
+    .fil61 {fill:url(#id31)}
+    .fil48 {fill:url(#id32)}
+    .fil17 {fill:url(#id33)}
+    .fil105 {fill:url(#id34)}
+    .fil46 {fill:url(#id35)}
+    .fil89 {fill:url(#id36)}
+    .fil91 {fill:url(#id37)}
+    .fil76 {fill:url(#id38)}
+    .fil43 {fill:url(#id39)}
+    .fil62 {fill:url(#id40)}
+    .fil79 {fill:url(#id41)}
+    .fil55 {fill:url(#id42)}
+    .fil64 {fill:url(#id43)}
+    .fil92 {fill:url(#id44)}
+    .fil37 {fill:url(#id45)}
+    .fil90 {fill:url(#id46)}
+    .fil28 {fill:url(#id47)}
+    .fil108 {fill:url(#id48)}
+    .fil100 {fill:url(#id49)}
+    .fil80 {fill:url(#id50)}
+    .fil98 {fill:url(#id51)}
+    .fil111 {fill:url(#id52)}
+    .fil70 {fill:url(#id53)}
+    .fil35 {fill:url(#id54)}
+    .fil103 {fill:url(#id55)}
+    .fil104 {fill:url(#id56)}
+    .fil49 {fill:url(#id57)}
+    .fil65 {fill:url(#id58)}
+    .fil33 {fill:url(#id59)}
+    .fil84 {fill:url(#id60)}
+    .fil102 {fill:url(#id61)}
+    .fil88 {fill:url(#id62)}
+    .fil68 {fill:url(#id63)}
+    .fil51 {fill:url(#id64)}
+    .fil85 {fill:url(#id65)}
+    .fil86 {fill:url(#id66)}
+    .fil47 {fill:url(#id67)}
+    .fil50 {fill:url(#id68)}
+    .fil56 {fill:url(#id69)}
+    .fil54 {fill:url(#id70)}
+    .fil18 {fill:url(#id71)}
+    .fil72 {fill:url(#id72)}
+    .fil38 {fill:url(#id73)}
+    .fil53 {fill:url(#id74)}
+    .fil52 {fill:url(#id75)}
+    .fil15 {fill:url(#id76)}
+    .fil34 {fill:url(#id77)}
+    .fil107 {fill:url(#id78)}
+    .fil83 {fill:url(#id79)}
+    .fil106 {fill:url(#id80)}
+    .fil45 {fill:url(#id81)}
+    .fil99 {fill:url(#id82)}
+    .fil73 {fill:url(#id83)}
+    .fil67 {fill:url(#id84)}
+    .fil81 {fill:url(#id85)}
+    .fil78 {fill:url(#id86)}
+    .fil39 {fill:url(#id87)}
+    .fil93 {fill:url(#id88)}
+    .fil66 {fill:url(#id89)}
+    .fil29 {fill:url(#id90)}
+    .fil44 {fill:url(#id91)}
+    .fil31 {fill:url(#id92)}
+    .fil32 {fill:url(#id93)}
+    .fil42 {fill:url(#id94)}
+    .fil96 {fill:url(#id95)}
+    .fil60 {fill:url(#id96)}
+    .fil21 {fill:url(#id97)}
+    .fil115 {fill:url(#id98)}
+    .fil69 {fill:url(#id99)}
+    .fil109 {fill:url(#id100)}
+    .fil116 {fill:url(#id101)}
+    .fil19 {fill:url(#id102)}
+    .fil110 {fill:url(#id103)}
+    .fil87 {fill:url(#id104)}
+    .fil12 {fill:url(#id105)}
+    .fil9 {fill:url(#id106)}
+    .fil16 {fill:url(#id107)}
+    .fil71 {fill:url(#id108)}
+    .fil30 {fill:url(#id109)}
+    .fil101 {fill:url(#id110)}
+    .fil95 {fill:url(#id111)}
+    .fil10 {fill:url(#id112)}
+    .fil13 {fill:url(#id113)}
+    .fil11 {fill:url(#id114)}
+    .fil63 {fill:url(#id115)}
+    .fil27 {fill:url(#id116)}
+    .fil23 {fill:url(#id117)}
+    .fil113 {fill:url(#id118)}
+    .fil14 {fill:url(#id119)}
+    .fil74 {fill:url(#id120)}
+    .fil36 {fill:url(#id121)}
+    .fil82 {fill:url(#id122)}
+    .fil40 {fill:url(#id123)}
+    .fil24 {fill:url(#id124)}
+    .fil75 {fill:url(#id125)}
+    .fil20 {fill:url(#id126)}
+    .fil25 {fill:url(#id127)}
+    .fil57 {fill:url(#id128)}
+    .fil22 {fill:url(#id129)}
+    .fil77 {fill:url(#id130)}
+    .fil114 {fill:url(#id131)}
+    .fil58 {fill:url(#id132)}
+    .fnt6 {font-weight:bold;font-size:423.33px;font-family:'Futura Md BT'}
+    .fnt0 {font-weight:normal;font-size:1131.15px;font-family:'Symbol'}
+    .fnt1 {font-weight:bold;font-size:1131.15px;font-family:'Futura Md BT'}
+    .fnt8 {font-weight:bold;font-size:1256.81px;font-family:'Futura Md BT'}
+    .fnt5 {font-weight:normal;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt7 {font-weight:bold;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt4 {font-weight:normal;font-size:1900.27px;font-family:'Futura Md BT'}
+    .fnt9 {font-weight:normal;font-size:2111.45px;font-family:'Futura Md BT'}
+    .fnt3 {font-weight:normal;font-size:2533.72px;font-family:'Futura Md BT'}
+    .fnt2 {font-weight:bold;font-size:2533.72px;font-family:'Futura Md BT'}
+   ]]></style>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4.6647002"
+     inkscape:cx="-78.240275"
+     inkscape:cy="24.849142"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true"
+     inkscape:snap-grids="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77811,-595.10722)">
+    <path
+       style="fill:url(#linearGradient8425);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 246.27811,595.60722 h 21 v 2 l -6.5,10.5 -6,-10.5 h -8.5 z"
+       id="path4763"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 260.56574,601.46532 c -0.0435,-1.8491 2.94024,0.22303 6.9605,0.15554 -2.37934,0.87001 -4.78447,3.12651 -6.54699,4.79868 -0.69731,-2.00112 -0.66057,-4.5027 -0.41351,-4.95422 z"
+       id="path8400"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc"
+       transform="rotate(96.15813,261.98063,600.60609)" />
+    <path
+       style="fill:none;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.8892617"
+       d="m 254.77811,597.60722 h 12"
+       id="path8429"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="ccccccc"
+       inkscape:connector-curvature="0"
+       id="path8431"
+       d="m 246.27811,595.60722 h 21 v 2 l -6.5,10.5 -6,-10.5 h -8.5 z"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318"
+       transform="matrix(1.0666667,0,0,1.0666667,641.03977,883.51086)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386"
+       transform="matrix(1.0666667,0,0,1.0666667,1224.7427,320.09945)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162"
+       transform="matrix(1.0666667,0,0,1.0666667,483.79064,152.88667)" />
+    <path
+       style="color:#ff0000;fill:#446a97;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 268.78227,608.11072 -3.0055,0.004 -4.57586,6.49625 h -0.83594 l -4.57586,-6.49625 -2.5055,-0.004 -8.5055,0.004 v 10.9925 h 24 z"
+       id="path7438-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="color:#ff0000;fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 244.77811,607.61472 8.5055,-0.004 2.5055,0.004 4.57586,6.49625 h 0.83594 l 4.57586,-6.49625 2.5055,-0.004 0.5055,0.004"
+       id="path7438"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccc" />
+    <text
+       id="text7408-2"
+       class="fil7 fnt4"
+       y="183.92776"
+       x="-484.44421"
+       style="font-weight:normal;font-size:10.66666698px;font-family:'Futura Md BT';text-align:center;text-anchor:middle;clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;stroke-width:1.06666672;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422"
+       class="fil7 fnt4"
+       y="213.22548"
+       x="-466.97989"
+       style="font-weight:normal;font-size:10.66666698px;font-family:'Futura Md BT';text-align:center;text-anchor:middle;clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;stroke-width:1.06666672;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_tip_lateral_force-24.svg b/pixmaps/src/gwy_tip_lateral_force-24.svg
new file mode 100644
index 0000000..9462641
--- /dev/null
+++ b/pixmaps/src/gwy_tip_lateral_force-24.svg
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_tip_lateral_force-24.svg"
+   inkscape:export-filename="gwy_cantilever-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8095">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8423">
+      <stop
+         style="stop-color:#6c7d92;stop-opacity:1"
+         offset="0"
+         id="stop8419" />
+      <stop
+         id="stop8427"
+         offset="0.49999958"
+         style="stop-color:#a3b8d2;stop-opacity:1" />
+      <stop
+         style="stop-color:#446a97;stop-opacity:1"
+         offset="1"
+         id="stop8421" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8458"
+       x="-0.12856513"
+       width="1.2571303"
+       y="-0.11250482"
+       height="1.2250096">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.16275744"
+         id="feGaussianBlur8460" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8423"
+       id="linearGradient8425"
+       x1="264.72632"
+       y1="603.01031"
+       x2="259.62939"
+       y2="606.03558"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-6,1)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8423"
+       id="linearGradient8439"
+       x1="257.04321"
+       y1="596.21021"
+       x2="249.13335"
+       y2="600.46936"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8423"
+       id="linearGradient8443"
+       gradientUnits="userSpaceOnUse"
+       x1="255.01131"
+       y1="595.8941"
+       x2="249.13335"
+       y2="600.46936"
+       gradientTransform="translate(0,-1)" />
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8458-3"
+       x="-0.12856513"
+       width="1.2571303"
+       y="-0.11250482"
+       height="1.2250096">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.16275744"
+         id="feGaussianBlur8460-6" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4.6681319"
+     inkscape:cx="27.750793"
+     inkscape:cy="52.194706"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true"
+     inkscape:snap-grids="true"
+     showguides="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77811,-595.10722)">
+    <g
+       id="g8429"
+       transform="translate(1.7320071)">
+      <path
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="path4763"
+         d="m 259.27811,601.10722 0.5,11.5 -9.5,-7.5 z"
+         style="fill:url(#linearGradient8425);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+      <path
+         transform="rotate(96.15813,256.08791,601.63681)"
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="path8400"
+         d="m 258.79012,602.32301 c 0.50175,-0.8506 3.55001,-1.59803 6.07548,-4.43057 l -4.45192,6.75923 z"
+         style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)" />
+    </g>
+    <path
+       style="fill:url(#linearGradient8439);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 250.51012,606.60722 -5.23201,-11 h 12 l 5.73201,5 z"
+       id="path8431"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8441"
+       d="m 250.01012,605.10722 -4.73201,-9.5 h 12.5 l 4.73201,3.5 z"
+       style="fill:url(#linearGradient8443);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+    <g
+       id="g8502"
+       transform="matrix(0.82056452,-4.0128921e-4,3.965189e-4,0.8107963,45.858375,117.23358)"
+       style="stroke-width:1.2259922">
+      <g
+         transform="translate(53.680525,-10.5)"
+         id="g8496"
+         style="stroke-width:1.2259922">
+        <path
+           style="fill:#7db846;fill-opacity:1;stroke:#000000;stroke-width:1.22597539;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           d="m 192.87521,618.18144 0.10352,6.98437 1.50586,-1.00586 c 1.07724,1.57525 3.67082,4.48227 8.30078,4.65821 0.18612,0.007 0.35883,-0.004 0.53906,-0.006 0.18057,0.002 0.35454,0.0129 0.54102,0.006 4.62995,-0.17594 7.22159,-3.08296 8.29883,-4.65821 l 1.50781,1.00586 0.10156,-6.98437 -6.22265,2.46289 1.62109,1.13086 c 0,0 -0.4587,1.02405 -1.49609,1.99805 -1.09067,0.90811 -2.53862,1.70864 -4.35157,1.71093 -1.79395,-0.002 -3.23122,-0.78546 -4.31836,-1.68164 -1.05971,-0.98248 -1.5292 [...]
+           id="path5078-9-4-0"
+           inkscape:connector-curvature="0" />
+        <path
+           style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1.2259922px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458-3)"
+           d="m 250.90429,606.02781 c 3.06172,-3.48728 5.4188,-3.31597 9.0367,-1.72284 -2.60453,-0.36435 -4.99615,-1.53065 -8.55144,2.21131 z"
+           id="path8400-3"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccc"
+           transform="matrix(0.69253078,-0.71692013,-0.70859102,-0.68762746,458.21548,1223.5414)" />
+        <path
+           transform="matrix(0.41138651,-0.90246273,-0.89894469,-0.42038875,652.91909,1100.5553)"
+           sodipodi:nodetypes="ccccc"
+           inkscape:connector-curvature="0"
+           id="path8137"
+           d="m 248.50329,606.59306 1.32033,-1.46223 2.39304,-1.06565 c -1.38665,1.37707 -2.04033,2.15957 -3.55177,3.40035 z"
+           style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1.2259922px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458-3)" />
+      </g>
+    </g>
+    <path
+       style="fill:#5275a0;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;fill-opacity:1"
+       d="m 250.01012,605.10722 0.5,1.5 12.5,-6 -0.5,-1.5 z"
+       id="path8520"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_tip_map-24.svg b/pixmaps/src/gwy_tip_map-24.svg
new file mode 100644
index 0000000..75a6867
--- /dev/null
+++ b/pixmaps/src/gwy_tip_map-24.svg
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_tip_map-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045">
+    <linearGradient
+       id="linearGradient8423"
+       inkscape:collect="always">
+      <stop
+         id="stop8419"
+         offset="0"
+         style="stop-color:#6c7d92;stop-opacity:1" />
+      <stop
+         style="stop-color:#a3b8d2;stop-opacity:1"
+         offset="0.49999958"
+         id="stop8427" />
+      <stop
+         id="stop8421"
+         offset="1"
+         style="stop-color:#446a97;stop-opacity:1" />
+    </linearGradient>
+    <filter
+       height="1.2250096"
+       y="-0.11250482"
+       width="1.2571303"
+       x="-0.12856513"
+       id="filter8458"
+       style="color-interpolation-filters:sRGB"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur8460"
+         stdDeviation="0.16275744"
+         inkscape:collect="always" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8423"
+       id="linearGradient8513"
+       gradientUnits="userSpaceOnUse"
+       x1="263.77811"
+       y1="602.10724"
+       x2="257.77811"
+       y2="602.10724"
+       gradientTransform="translate(-51.91606,-129.26933)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.20539"
+     inkscape:cx="-29.110699"
+     inkscape:cy="22.66709"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <g
+       transform="matrix(0.39130434,0,0,0.39130434,148.44966,249.94138)"
+       id="layer1-6"
+       inkscape:label="Layer 1"
+       style="opacity:1;vector-effect:none;fill:#c1665a;fill-opacity:1;stroke:#000000;stroke-width:2.55555561;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:7.66666682,7.66666682;stroke-dashoffset:3.83333341;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none">
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="rect11972"
+         d="m 128.83165,602.84665 h 23 v 23 h -23 z"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#c1665a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.55555561;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:7.66666682,7.66666682;stroke-dashoffset:3.83333341;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    </g>
+    <path
+       style="fill:url(#linearGradient8513);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 198.86205,472.83789 v 2 h 3.35742 l 4.64258,8 2.89453,-3.56055 3.60547,6.06055 6.5,-10.5 v -2 z"
+       id="path8505"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       transform="rotate(96.15813,291.06382,514.49005)"
+       sodipodi:nodetypes="cccc"
+       inkscape:connector-curvature="0"
+       id="path8507"
+       d="m 261.93542,604.83785 c -0.0435,-1.8491 1.57056,-3.1495 5.59082,-3.21699 -2.37934,0.87001 -3.89751,2.02501 -5.66003,3.69718 -0.69731,-2.00112 -0.17785,-0.0287 0.0692,-0.48019 z"
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)" />
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path8509"
+       d="m 202.86205,474.83789 h 12"
+       style="fill:none;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.8892617" />
+    <path
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 260.56574,601.46532 c -0.0435,-1.8491 2.94024,0.22303 6.9605,0.15554 -2.37934,0.87001 -4.78447,3.12651 -6.54699,4.79868 -0.69731,-2.00112 -0.66057,-4.5027 -0.41351,-4.95422 z"
+       id="path8400"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc"
+       transform="rotate(96.15813,293.39039,517.93379)" />
+    <path
+       style="fill:none;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.8892617"
+       d="m 207.36205,474.83789 h 12"
+       id="path8429"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.5;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path8522"
+       cx="213.36205"
+       cy="486.33789"
+       r="3.5" />
+    <g
+       transform="matrix(1.0666667,0,0,1.0666667,-295.25305,-227.1179)"
+       id="layer1-9"
+       inkscape:label="Layer 1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_tip_model-24.svg b/pixmaps/src/gwy_tip_model-24.svg
new file mode 100644
index 0000000..2fcb363
--- /dev/null
+++ b/pixmaps/src/gwy_tip_model-24.svg
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_tip_model-24.svg"
+   inkscape:export-filename="gwy_flip_horizontally-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8095">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8423">
+      <stop
+         style="stop-color:#6c7d92;stop-opacity:1"
+         offset="0"
+         id="stop8419" />
+      <stop
+         id="stop8427"
+         offset="0.49999958"
+         style="stop-color:#a3b8d2;stop-opacity:1" />
+      <stop
+         style="stop-color:#446a97;stop-opacity:1"
+         offset="1"
+         id="stop8421" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8458"
+       x="-0.12856513"
+       width="1.2571303"
+       y="-0.11250482"
+       height="1.2250096">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.16275744"
+         id="feGaussianBlur8460" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8423"
+       id="linearGradient8425"
+       x1="263.77811"
+       y1="602.10724"
+       x2="257.77811"
+       y2="602.10724"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8423"
+       id="linearGradient8479"
+       gradientUnits="userSpaceOnUse"
+       x1="-261.77811"
+       y1="-593.10724"
+       x2="-253.77811"
+       y2="-593.10724"
+       gradientTransform="translate(-3,-10.5)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="9.2807131"
+     inkscape:cx="-51.499084"
+     inkscape:cy="-2.6637179"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77811,-595.10722)">
+    <path
+       style="fill:url(#linearGradient8425);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 246.27811,600.60722 h 21 v 2 h -12.5 -8.5 z"
+       id="path4763"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:url(#linearGradient8479);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path8428"
+       sodipodi:type="arc"
+       sodipodi:cx="-260.77811"
+       sodipodi:cy="-602.60724"
+       sodipodi:rx="6.5"
+       sodipodi:ry="9.4999809"
+       sodipodi:start="3.1415927"
+       sodipodi:end="0"
+       d="m -267.27811,-602.60724 a 6.5,9.4999809 0 0 1 6.5,-9.49998 6.5,9.4999809 0 0 1 6.5,9.49998 h -6.5 z"
+       transform="scale(-1)" />
+    <path
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 260.95559,600.41746 c -0.0435,-1.8491 3.33008,-0.82484 7.35034,-0.89233 0.4282,3.07047 -4.25428,4.40524 -6.99048,5.34943 -0.69731,-2.00112 -0.60692,-4.00558 -0.35986,-4.4571 z"
+       id="path8400"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc"
+       transform="rotate(96.15813,259.43479,601.93266)" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.88926172;fill-opacity:0.49803922"
+       d="m 254.77811,602.60722 h 12"
+       id="path8429"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cccccc"
+       inkscape:connector-curvature="0"
+       id="path8431"
+       d="m 246.27811,600.60722 h 21 v 2 h -12.5 -8.5 z"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_tip_pid-24.svg b/pixmaps/src/gwy_tip_pid-24.svg
new file mode 100644
index 0000000..2728aff
--- /dev/null
+++ b/pixmaps/src/gwy_tip_pid-24.svg
@@ -0,0 +1,1114 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_tip_pid-24.svg"
+   inkscape:export-filename="gwy_cantilever-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs8095">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8423">
+      <stop
+         style="stop-color:#6c7d92;stop-opacity:1"
+         offset="0"
+         id="stop8419" />
+      <stop
+         id="stop8427"
+         offset="0.49999958"
+         style="stop-color:#a3b8d2;stop-opacity:1" />
+      <stop
+         style="stop-color:#446a97;stop-opacity:1"
+         offset="1"
+         id="stop8421" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter8458"
+       x="-0.12856513"
+       width="1.2571303"
+       y="-0.11250482"
+       height="1.2250096">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.16275744"
+         id="feGaussianBlur8460" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8423"
+       id="linearGradient8425"
+       x1="263.77811"
+       y1="602.10724"
+       x2="257.77811"
+       y2="602.10724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-5)" />
+    <defs
+       id="defs7146">
+      <circle
+         r="0.5"
+         id="gpDot"
+         cx="0"
+         cy="0"
+         style="stroke-width:0.5" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1"
+         id="gpPt0"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,-1 1,1 M 1,-1 -1,1"
+         id="gpPt1"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1 m -1,-2 2,2 m -2,0 2,-2"
+         id="gpPt2"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt3"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt4"
+         style="fill:currentColor;stroke:currentColor;stroke-width:0.222" />
+      <circle
+         r="1"
+         cy="0"
+         cx="0"
+         id="gpPt5"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt6"
+         xlink:href="#gpPt5"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <path
+         d="m 0,-1.33 -1.33,2 2.66,0 z"
+         id="gpPt7"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt8"
+         xlink:href="#gpPt7"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="scale(-1,-1)"
+         id="gpPt9"
+         xlink:href="#gpPt7"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt10"
+         xlink:href="#gpPt9"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+         id="gpPt11"
+         xlink:href="#gpPt3"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt12"
+         xlink:href="#gpPt11"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+    </defs>
+    <defs
+       id="defs6370">
+      <circle
+         r="0.5"
+         id="gpDot-2"
+         cx="0"
+         cy="0"
+         style="stroke-width:0.5" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1"
+         id="gpPt0-7"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,-1 1,1 M 1,-1 -1,1"
+         id="gpPt1-3"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1 m -1,-2 2,2 m -2,0 2,-2"
+         id="gpPt2-25"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt3-2"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt4-40"
+         style="fill:currentColor;stroke:currentColor;stroke-width:0.222" />
+      <circle
+         r="1"
+         cy="0"
+         cx="0"
+         id="gpPt5-5"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt6-0"
+         xlink:href="#gpPt5-5"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <path
+         d="m 0,-1.33 -1.33,2 2.66,0 z"
+         id="gpPt7-2"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt8-8"
+         xlink:href="#gpPt7-2"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="scale(-1,-1)"
+         id="gpPt9-2"
+         xlink:href="#gpPt7-2"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt10-7"
+         xlink:href="#gpPt9-2"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+         id="gpPt11-1"
+         xlink:href="#gpPt3-2"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt12-2"
+         xlink:href="#gpPt11-1"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+    </defs>
+    <defs
+       id="defs5302">
+      <circle
+         r="0.5"
+         id="gpDot-16"
+         cx="0"
+         cy="0"
+         style="stroke-width:0.5" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1"
+         id="gpPt0-9"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,-1 1,1 M 1,-1 -1,1"
+         id="gpPt1-15"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <path
+         d="M -1,0 1,0 M 0,-1 0,1 m -1,-2 2,2 m -2,0 2,-2"
+         id="gpPt2-2"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt3-8"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <rect
+         height="2"
+         width="2"
+         y="-1"
+         x="-1"
+         id="gpPt4-4"
+         style="fill:currentColor;stroke:currentColor;stroke-width:0.222" />
+      <circle
+         r="1"
+         cy="0"
+         cx="0"
+         id="gpPt5-0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt6-93"
+         xlink:href="#gpPt5-0"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <path
+         d="m 0,-1.33 -1.33,2 2.66,0 z"
+         id="gpPt7-4"
+         inkscape:connector-curvature="0"
+         style="stroke:currentColor;stroke-width:0.222" />
+      <use
+         id="gpPt8-6"
+         xlink:href="#gpPt7-4"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="scale(-1,-1)"
+         id="gpPt9-9"
+         xlink:href="#gpPt7-4"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt10-0"
+         xlink:href="#gpPt9-9"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+         id="gpPt11-5"
+         xlink:href="#gpPt3-8"
+         style="stroke:currentColor"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+      <use
+         id="gpPt12-5"
+         xlink:href="#gpPt11-5"
+         style="fill:currentColor;stroke:none"
+         x="0"
+         y="0"
+         width="100%"
+         height="100%" />
+    </defs>
+    <style
+       type="text/css"
+       id="style7591"><![CDATA[
+    @font-face { font-family:"Futura Md BT";src:url("#FontID0") format(svg)}
+    .str0 {stroke:#2B2A29;stroke-width:20}
+    .str3 {stroke:#212220;stroke-width:20}
+    .str4 {stroke:#E32029;stroke-width:35.28}
+    .str1 {stroke:#FEFEFE;stroke-width:52.92}
+    .str2 {stroke:#5B5A50;stroke-width:35.28;stroke-dasharray:35.280000 35.280000}
+    .fil0 {fill:none}
+    .fil2 {fill:none;fill-rule:nonzero}
+    .fil1 {fill:#2B2A29}
+    .fil3 {fill:#FEFEFE}
+    .fil11 {fill:#B9A8A0}
+    .fil96 {fill:#284A98;fill-rule:nonzero}
+    .fil100 {fill:url(#id0)}
+    .fil97 {fill:url(#id1)}
+    .fil124 {fill:url(#id2)}
+    .fil95 {fill:url(#id3)}
+    .fil126 {fill:url(#id4)}
+    .fil125 {fill:url(#id5)}
+    .fil128 {fill:url(#id6)}
+    .fil127 {fill:url(#id7)}
+    .fil69 {fill:url(#id8)}
+    .fil73 {fill:url(#id9)}
+    .fil71 {fill:url(#id10)}
+    .fil68 {fill:url(#id11)}
+    .fil70 {fill:url(#id12)}
+    .fil74 {fill:url(#id13)}
+    .fil72 {fill:url(#id14)}
+    .fil41 {fill:url(#id15)}
+    .fil13 {fill:url(#id16)}
+    .fil45 {fill:url(#id17)}
+    .fil17 {fill:url(#id18)}
+    .fil43 {fill:url(#id19)}
+    .fil40 {fill:url(#id20)}
+    .fil15 {fill:url(#id21)}
+    .fil12 {fill:url(#id22)}
+    .fil42 {fill:url(#id23)}
+    .fil46 {fill:url(#id24)}
+    .fil14 {fill:url(#id25)}
+    .fil18 {fill:url(#id26)}
+    .fil44 {fill:url(#id27)}
+    .fil16 {fill:url(#id28)}
+    .fil77 {fill:url(#id29)}
+    .fil76 {fill:url(#id30)}
+    .fil75 {fill:url(#id31)}
+    .fil79 {fill:url(#id32)}
+    .fil78 {fill:url(#id33)}
+    .fil49 {fill:url(#id34)}
+    .fil21 {fill:url(#id35)}
+    .fil48 {fill:url(#id36)}
+    .fil47 {fill:url(#id37)}
+    .fil20 {fill:url(#id38)}
+    .fil19 {fill:url(#id39)}
+    .fil51 {fill:url(#id40)}
+    .fil50 {fill:url(#id41)}
+    .fil23 {fill:url(#id42)}
+    .fil22 {fill:url(#id43)}
+    .fil115 {fill:url(#id44)}
+    .fil113 {fill:url(#id45)}
+    .fil102 {fill:url(#id46)}
+    .fil105 {fill:url(#id47)}
+    .fil106 {fill:url(#id48)}
+    .fil114 {fill:url(#id49)}
+    .fil117 {fill:url(#id50)}
+    .fil112 {fill:url(#id51)}
+    .fil104 {fill:url(#id52)}
+    .fil110 {fill:url(#id53)}
+    .fil108 {fill:url(#id54)}
+    .fil116 {fill:url(#id55)}
+    .fil111 {fill:url(#id56)}
+    .fil101 {fill:url(#id57)}
+    .fil103 {fill:url(#id58)}
+    .fil118 {fill:url(#id59)}
+    .fil107 {fill:url(#id60)}
+    .fil109 {fill:url(#id61)}
+    .fil90 {fill:url(#id62)}
+    .fil67 {fill:url(#id63)}
+    .fil39 {fill:url(#id64)}
+    .fil65 {fill:url(#id65)}
+    .fil64 {fill:url(#id66)}
+    .fil37 {fill:url(#id67)}
+    .fil36 {fill:url(#id68)}
+    .fil66 {fill:url(#id69)}
+    .fil38 {fill:url(#id70)}
+    .fil91 {fill:url(#id71)}
+    .fil83 {fill:url(#id72)}
+    .fil85 {fill:url(#id73)}
+    .fil81 {fill:url(#id74)}
+    .fil80 {fill:url(#id75)}
+    .fil82 {fill:url(#id76)}
+    .fil84 {fill:url(#id77)}
+    .fil4 {fill:url(#id78)}
+    .fil56 {fill:url(#id79)}
+    .fil28 {fill:url(#id80)}
+    .fil58 {fill:url(#id81)}
+    .fil54 {fill:url(#id82)}
+    .fil30 {fill:url(#id83)}
+    .fil26 {fill:url(#id84)}
+    .fil52 {fill:url(#id85)}
+    .fil55 {fill:url(#id86)}
+    .fil24 {fill:url(#id87)}
+    .fil27 {fill:url(#id88)}
+    .fil57 {fill:url(#id89)}
+    .fil29 {fill:url(#id90)}
+    .fil53 {fill:url(#id91)}
+    .fil25 {fill:url(#id92)}
+    .fil88 {fill:url(#id93)}
+    .fil89 {fill:url(#id94)}
+    .fil86 {fill:url(#id95)}
+    .fil87 {fill:url(#id96)}
+    .fil62 {fill:url(#id97)}
+    .fil63 {fill:url(#id98)}
+    .fil34 {fill:url(#id99)}
+    .fil35 {fill:url(#id100)}
+    .fil59 {fill:url(#id101)}
+    .fil60 {fill:url(#id102)}
+    .fil31 {fill:url(#id103)}
+    .fil32 {fill:url(#id104)}
+    .fil61 {fill:url(#id105)}
+    .fil33 {fill:url(#id106)}
+    .fil6 {fill:url(#id107)}
+    .fil5 {fill:url(#id108)}
+    .fil10 {fill:url(#id109)}
+    .fil9 {fill:url(#id110)}
+    .fil94 {fill:url(#id111)}
+    .fil8 {fill:url(#id112)}
+    .fil7 {fill:url(#id113)}
+    .fil99 {fill:url(#id114)}
+    .fil98 {fill:url(#id115)}
+    .fil122 {fill:url(#id116)}
+    .fil121 {fill:url(#id117)}
+    .fil123 {fill:url(#id118)}
+    .fil119 {fill:url(#id119)}
+    .fil120 {fill:url(#id120)}
+    .fil92 {fill:url(#id121)}
+    .fil93 {fill:url(#id122)}
+    .fnt3 {font-weight:normal;font-size:1136.24px;font-family:'Futura Md BT'}
+    .fnt2 {font-weight:normal;font-size:1256.81px;font-family:'Futura Md BT'}
+    .fnt4 {font-weight:normal;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt1 {font-weight:bold;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt0 {font-weight:bold;font-size:2010.9px;font-family:'Futura Md BT'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style9234"><![CDATA[
+    @font-face { font-family:"Futura Md BT";src:url("#FontID0") format(svg)}
+    .str0 {stroke:#C5C6C6;stroke-width:10.58}
+    .str3 {stroke:#C5C6C6;stroke-width:17.64;stroke-linecap:round;stroke-linejoin:round}
+    .str4 {stroke:#E32029;stroke-width:35.28}
+    .str1 {stroke:#FEFEFE;stroke-width:52.92}
+    .str5 {stroke:#FEFEFE;stroke-width:52.92;stroke-linecap:round;stroke-linejoin:round}
+    .str6 {stroke:#054D00;stroke-width:52.92;stroke-linecap:round;stroke-linejoin:round}
+    .str2 {stroke:#5B5A50;stroke-width:35.28;stroke-dasharray:35.280000 35.280000}
+    .fil41 {fill:none}
+    .fil44 {fill:none;fill-rule:nonzero}
+    .fil2 {fill:#2B2A29}
+    .fil1 {fill:#FEFEFE}
+    .fil0 {fill:#054D00}
+    .fil10 {fill:#054D00;fill-rule:nonzero}
+    .fil45 {fill:url(#id0)}
+    .fil6 {fill:url(#id1)}
+    .fil55 {fill:url(#id2)}
+    .fil13 {fill:url(#id3)}
+    .fil38 {fill:url(#id4)}
+    .fil46 {fill:url(#id5)}
+    .fil7 {fill:url(#id6)}
+    .fil56 {fill:url(#id7)}
+    .fil11 {fill:url(#id8)}
+    .fil43 {fill:url(#id9)}
+    .fil39 {fill:url(#id10)}
+    .fil40 {fill:url(#id11)}
+    .fil42 {fill:url(#id12)}
+    .fil49 {fill:url(#id13)}
+    .fil51 {fill:url(#id14)}
+    .fil52 {fill:url(#id15)}
+    .fil29 {fill:url(#id16)}
+    .fil16 {fill:url(#id17)}
+    .fil23 {fill:url(#id18)}
+    .fil28 {fill:url(#id19)}
+    .fil24 {fill:url(#id20)}
+    .fil18 {fill:url(#id21)}
+    .fil31 {fill:url(#id22)}
+    .fil30 {fill:url(#id23)}
+    .fil22 {fill:url(#id24)}
+    .fil21 {fill:url(#id25)}
+    .fil19 {fill:url(#id26)}
+    .fil25 {fill:url(#id27)}
+    .fil26 {fill:url(#id28)}
+    .fil32 {fill:url(#id29)}
+    .fil20 {fill:url(#id30)}
+    .fil15 {fill:url(#id31)}
+    .fil17 {fill:url(#id32)}
+    .fil27 {fill:url(#id33)}
+    .fil3 {fill:url(#id34)}
+    .fil5 {fill:url(#id35)}
+    .fil4 {fill:url(#id36)}
+    .fil14 {fill:url(#id37)}
+    .fil12 {fill:url(#id38)}
+    .fil47 {fill:url(#id39)}
+    .fil8 {fill:url(#id40)}
+    .fil53 {fill:url(#id41)}
+    .fil57 {fill:url(#id42)}
+    .fil36 {fill:url(#id43)}
+    .fil35 {fill:url(#id44)}
+    .fil37 {fill:url(#id45)}
+    .fil33 {fill:url(#id46)}
+    .fil34 {fill:url(#id47)}
+    .fil48 {fill:url(#id48)}
+    .fil9 {fill:url(#id49)}
+    .fil54 {fill:url(#id50)}
+    .fil58 {fill:url(#id51)}
+    .fil50 {fill:url(#id52)}
+    .fnt1 {font-weight:normal;font-size:1382.5px;font-family:'Futura Md BT'}
+    .fnt2 {font-weight:bold;font-size:1382.5px;font-family:'Futura Md BT'}
+    .fnt0 {font-weight:bold;font-size:1759.55px;font-family:'Futura Md BT'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style10533"><![CDATA[
+    @font-face { font-family:"Arial";src:url("#FontID1") format(svg)}
+    @font-face { font-family:"Futura Md BT";src:url("#FontID0") format(svg)}
+    .str2 {stroke-width:5.05}
+    .str1 {stroke:#2B2A29;stroke-width:7.62}
+    .str4 {stroke:#898989;stroke-width:7.62}
+    .str9 {stroke:#C5C6C6;stroke-width:10.58}
+    .str0 {stroke:#212220;stroke-width:20}
+    .str3 {stroke:#62605E;stroke-width:20}
+    .str8 {stroke:#E09079;stroke-width:35.28}
+    .str7 {stroke:#E32029;stroke-width:35.28}
+    .str12 {stroke:#2B2A29;stroke-width:52.92}
+    .str10 {stroke:#FEFEFE;stroke-width:52.92;stroke-linecap:round;stroke-linejoin:round}
+    .str11 {stroke:#054D00;stroke-width:52.92;stroke-linecap:round;stroke-linejoin:round}
+    .str5 {stroke:#5B5A50;stroke-width:35.28;stroke-dasharray:35.280000 35.280000}
+    .str6 {stroke:#9D9C94;stroke-width:35.28;stroke-dasharray:35.280000 35.280000}
+    .fil9 {fill:none}
+    .fil8 {fill:none;fill-rule:nonzero}
+    .fil0 {fill:#2B2A29}
+    .fil2 {fill:#FEFEFE}
+    .fil130 {fill:#054D00}
+    .fil4 {fill:#898989}
+    .fil40 {fill:#B9A8A0}
+    .fil69 {fill:#C9C0BB}
+    .fil3 {fill:#EBECEC}
+    .fil1 {fill:#054D00;fill-rule:nonzero}
+    .fil6 {fill:#6F936D;fill-rule:nonzero}
+    .fil5 {fill:#898989;fill-rule:nonzero}
+    .fil7 {fill:#EBECEC;fill-rule:nonzero}
+    .fil35 {fill:url(#id60)}
+    .fil98 {fill:url(#id61)}
+    .fil39 {fill:url(#id62)}
+    .fil102 {fill:url(#id63)}
+    .fil15 {fill:url(#id64)}
+    .fil22 {fill:url(#id65)}
+    .fil42 {fill:url(#id66)}
+    .fil46 {fill:url(#id67)}
+    .fil44 {fill:url(#id68)}
+    .fil41 {fill:url(#id69)}
+    .fil43 {fill:url(#id70)}
+    .fil47 {fill:url(#id71)}
+    .fil45 {fill:url(#id72)}
+    .fil50 {fill:url(#id73)}
+    .fil49 {fill:url(#id74)}
+    .fil48 {fill:url(#id75)}
+    .fil52 {fill:url(#id76)}
+    .fil51 {fill:url(#id77)}
+    .fil71 {fill:url(#id78)}
+    .fil75 {fill:url(#id79)}
+    .fil73 {fill:url(#id80)}
+    .fil70 {fill:url(#id81)}
+    .fil72 {fill:url(#id82)}
+    .fil76 {fill:url(#id83)}
+    .fil74 {fill:url(#id84)}
+    .fil79 {fill:url(#id85)}
+    .fil78 {fill:url(#id86)}
+    .fil77 {fill:url(#id87)}
+    .fil81 {fill:url(#id88)}
+    .fil80 {fill:url(#id89)}
+    .fil107 {fill:url(#id90)}
+    .fil117 {fill:url(#id91)}
+    .fil120 {fill:url(#id92)}
+    .fil115 {fill:url(#id93)}
+    .fil119 {fill:url(#id94)}
+    .fil118 {fill:url(#id95)}
+    .fil122 {fill:url(#id96)}
+    .fil123 {fill:url(#id97)}
+    .fil113 {fill:url(#id98)}
+    .fil109 {fill:url(#id99)}
+    .fil112 {fill:url(#id100)}
+    .fil110 {fill:url(#id101)}
+    .fil114 {fill:url(#id102)}
+    .fil116 {fill:url(#id103)}
+    .fil121 {fill:url(#id104)}
+    .fil106 {fill:url(#id105)}
+    .fil108 {fill:url(#id106)}
+    .fil111 {fill:url(#id107)}
+    .fil66 {fill:url(#id108)}
+    .fil67 {fill:url(#id109)}
+    .fil95 {fill:url(#id110)}
+    .fil96 {fill:url(#id111)}
+    .fil68 {fill:url(#id112)}
+    .fil97 {fill:url(#id113)}
+    .fil65 {fill:url(#id114)}
+    .fil94 {fill:url(#id115)}
+    .fil57 {fill:url(#id116)}
+    .fil59 {fill:url(#id117)}
+    .fil55 {fill:url(#id118)}
+    .fil53 {fill:url(#id119)}
+    .fil56 {fill:url(#id120)}
+    .fil58 {fill:url(#id121)}
+    .fil54 {fill:url(#id122)}
+    .fil10 {fill:url(#id123)}
+    .fil63 {fill:url(#id124)}
+    .fil64 {fill:url(#id125)}
+    .fil60 {fill:url(#id126)}
+    .fil61 {fill:url(#id127)}
+    .fil62 {fill:url(#id128)}
+    .fil12 {fill:url(#id129)}
+    .fil11 {fill:url(#id130)}
+    .fil86 {fill:url(#id131)}
+    .fil88 {fill:url(#id132)}
+    .fil84 {fill:url(#id133)}
+    .fil82 {fill:url(#id134)}
+    .fil85 {fill:url(#id135)}
+    .fil87 {fill:url(#id136)}
+    .fil83 {fill:url(#id137)}
+    .fil17 {fill:url(#id138)}
+    .fil92 {fill:url(#id139)}
+    .fil93 {fill:url(#id140)}
+    .fil89 {fill:url(#id141)}
+    .fil90 {fill:url(#id142)}
+    .fil91 {fill:url(#id143)}
+    .fil19 {fill:url(#id144)}
+    .fil18 {fill:url(#id145)}
+    .fil101 {fill:url(#id146)}
+    .fil100 {fill:url(#id147)}
+    .fil105 {fill:url(#id148)}
+    .fil104 {fill:url(#id149)}
+    .fil25 {fill:url(#id150)}
+    .fil24 {fill:url(#id151)}
+    .fil29 {fill:url(#id152)}
+    .fil28 {fill:url(#id153)}
+    .fil127 {fill:url(#id154)}
+    .fil126 {fill:url(#id155)}
+    .fil128 {fill:url(#id156)}
+    .fil125 {fill:url(#id157)}
+    .fil99 {fill:url(#id158)}
+    .fil103 {fill:url(#id159)}
+    .fil34 {fill:url(#id160)}
+    .fil32 {fill:url(#id161)}
+    .fil38 {fill:url(#id162)}
+    .fil36 {fill:url(#id163)}
+    .fil27 {fill:url(#id164)}
+    .fil26 {fill:url(#id165)}
+    .fil31 {fill:url(#id166)}
+    .fil30 {fill:url(#id167)}
+    .fil124 {fill:url(#id168)}
+    .fil129 {fill:url(#id169)}
+    .fil33 {fill:url(#id170)}
+    .fil37 {fill:url(#id171)}
+    .fil16 {fill:url(#id172)}
+    .fil23 {fill:url(#id173)}
+    .fil14 {fill:url(#id174)}
+    .fil13 {fill:url(#id175)}
+    .fil21 {fill:url(#id176)}
+    .fil20 {fill:url(#id177)}
+    .fnt7 {font-weight:bold;font-size:423.33px;font-family:'Arial'}
+    .fnt0 {font-weight:bold;font-size:493.89px;font-family:'Futura Md BT'}
+    .fnt1 {font-weight:normal;font-size:1382.5px;font-family:'Futura Md BT'}
+    .fnt5 {font-weight:bold;font-size:1382.5px;font-family:'Futura Md BT'}
+    .fnt2 {font-weight:bold;font-size:1508.17px;font-family:'Futura Md BT'}
+    .fnt6 {font-weight:bold;font-size:1508.2px;font-family:'Arial'}
+    .fnt3 {font-weight:bold;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt4 {font-weight:bold;font-size:1759.55px;font-family:'Futura Md BT'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style25752"><![CDATA[
+    @font-face { font-family:"Futura Md BT";src:url("#FontID0") format(svg)}
+    .str0 {stroke:#FEFEFE;stroke-width:7.62}
+    .str1 {stroke:#FEFEFE;stroke-width:7.62}
+    .fil2 {fill:none}
+    .fil4 {fill:#2B2A29}
+    .fil0 {fill:#FEFEFE}
+    .fil1 {fill:#FEFEFE}
+    .fil3 {fill:#C6D663;fill-rule:nonzero}
+    .fil37 {fill:url(#id51)}
+    .fil38 {fill:url(#id52)}
+    .fil40 {fill:url(#id53)}
+    .fil15 {fill:url(#id54)}
+    .fil74 {fill:url(#id55)}
+    .fil20 {fill:url(#id56)}
+    .fil26 {fill:url(#id57)}
+    .fil25 {fill:url(#id58)}
+    .fil44 {fill:url(#id59)}
+    .fil48 {fill:url(#id60)}
+    .fil34 {fill:url(#id61)}
+    .fil51 {fill:url(#id62)}
+    .fil61 {fill:url(#id63)}
+    .fil56 {fill:url(#id64)}
+    .fil50 {fill:url(#id65)}
+    .fil60 {fill:url(#id66)}
+    .fil53 {fill:url(#id67)}
+    .fil52 {fill:url(#id68)}
+    .fil55 {fill:url(#id69)}
+    .fil58 {fill:url(#id70)}
+    .fil57 {fill:url(#id71)}
+    .fil54 {fill:url(#id72)}
+    .fil62 {fill:url(#id73)}
+    .fil13 {fill:url(#id74)}
+    .fil72 {fill:url(#id75)}
+    .fil9 {fill:url(#id76)}
+    .fil68 {fill:url(#id77)}
+    .fil6 {fill:url(#id78)}
+    .fil65 {fill:url(#id79)}
+    .fil10 {fill:url(#id80)}
+    .fil7 {fill:url(#id81)}
+    .fil69 {fill:url(#id82)}
+    .fil66 {fill:url(#id83)}
+    .fil16 {fill:url(#id84)}
+    .fil75 {fill:url(#id85)}
+    .fil17 {fill:url(#id86)}
+    .fil76 {fill:url(#id87)}
+    .fil11 {fill:url(#id88)}
+    .fil70 {fill:url(#id89)}
+    .fil12 {fill:url(#id90)}
+    .fil8 {fill:url(#id91)}
+    .fil71 {fill:url(#id92)}
+    .fil67 {fill:url(#id93)}
+    .fil14 {fill:url(#id94)}
+    .fil73 {fill:url(#id95)}
+    .fil29 {fill:url(#id96)}
+    .fil33 {fill:url(#id97)}
+    .fil19 {fill:url(#id98)}
+    .fil43 {fill:url(#id99)}
+    .fil45 {fill:url(#id100)}
+    .fil39 {fill:url(#id101)}
+    .fil36 {fill:url(#id102)}
+    .fil46 {fill:url(#id103)}
+    .fil47 {fill:url(#id104)}
+    .fil41 {fill:url(#id105)}
+    .fil35 {fill:url(#id106)}
+    .fil42 {fill:url(#id107)}
+    .fil59 {fill:url(#id108)}
+    .fil49 {fill:url(#id109)}
+    .fil63 {fill:url(#id110)}
+    .fil5 {fill:url(#id111)}
+    .fil18 {fill:url(#id112)}
+    .fil64 {fill:url(#id113)}
+    .fil77 {fill:url(#id114)}
+    .fil28 {fill:url(#id115)}
+    .fil31 {fill:url(#id116)}
+    .fil32 {fill:url(#id117)}
+    .fil21 {fill:url(#id118)}
+    .fil22 {fill:url(#id119)}
+    .fil24 {fill:url(#id120)}
+    .fil23 {fill:url(#id121)}
+    .fil27 {fill:url(#id122)}
+    .fil30 {fill:url(#id123)}
+    .fnt0 {font-weight:bold;font-size:1243.98px;font-family:'Futura Md BT'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style98"><![CDATA[
+    @font-face { font-family:"Symbol";src:url("#FontID1") format(svg)}
+    @font-face { font-family:"Arial";src:url("#FontID0") format(svg)}
+    .str1 {stroke:#FEFEFE;stroke-width:7.62}
+    .str2 {stroke:#FEFEFE;stroke-width:35.28}
+    .str0 {stroke:#FEFEFE;stroke-width:52.92}
+    .str5 {stroke:#212220;stroke-width:52.92}
+    .str6 {stroke:#2B2A29;stroke-width:70.56}
+    .str3 {stroke:#FEFEFE;stroke-width:70.56}
+    .str4 {stroke:#212220;stroke-width:70.56}
+    .fil2 {fill:none}
+    .fil3 {fill:#2B2A29}
+    .fil0 {fill:#FEFEFE}
+    .fil5 {fill:#1C1B17;fill-rule:nonzero}
+    .fil1 {fill:#FEFEFE;fill-rule:nonzero}
+    .fil4 {fill:#212220;fill-rule:nonzero}
+    .fnt1 {font-weight:bold;font-size:423.33px;font-family:'Arial'}
+    .fnt4 {font-weight:bold;font-size:423.33px;font-family:'Arial'}
+    .fnt5 {font-weight:bold;font-size:493.88px;font-family:'Arial'}
+    .fnt2 {font-weight:normal;font-size:1508.2px;font-family:'Symbol'}
+    .fnt0 {font-weight:bold;font-size:1508.2px;font-family:'Arial'}
+    .fnt3 {font-weight:bold;font-size:1508.2px;font-family:'Arial'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style7232"><![CDATA[
+    @font-face { font-family:"Arial";src:url("#FontID0") format(svg)}
+    .str0 {stroke:#FEFEFE;stroke-width:70.56}
+    .fil0 {fill:none}
+    .fil2 {fill:#FEFEFE}
+    .fil1 {fill:#FEFEFE;fill-rule:nonzero}
+    .fnt0 {font-weight:bold;font-size:2533.72px;font-family:'Arial'}
+   ]]></style>
+    <style
+       type="text/css"
+       id="style7094"><![CDATA[
+    @font-face { font-family:"Futura Md BT";src:url("#FontID1") format(svg)}
+    @font-face { font-family:"Symbol";src:url("#FontID0") format(svg)}
+    .str2 {stroke:#2B2A29;stroke-width:7.62}
+    .str3 {stroke:#9D9E9E;stroke-width:7.62}
+    .str5 {stroke:#FEFEFE;stroke-width:42.33}
+    .str7 {stroke:#FEFEFE;stroke-width:42.33}
+    .str9 {stroke:#FEFEFE;stroke-width:52.92}
+    .str4 {stroke:#2B2A29;stroke-width:70.56}
+    .str10 {stroke:#727271;stroke-width:70.56}
+    .str8 {stroke:#FEFEFE;stroke-width:70.56}
+    .str6 {stroke:#9D9E9E;stroke-width:70.56}
+    .str0 {stroke:#FEFEFE;stroke-width:42.33;stroke-dasharray:84.660000 42.330000}
+    .str1 {stroke:#FEFEFE;stroke-width:42.33;stroke-dasharray:84.660000 42.330000}
+    .fil0 {fill:none}
+    .fil2 {fill:#2B2A29}
+    .fil7 {fill:#FEFEFE}
+    .fil5 {fill:#9D9E9E}
+    .fil1 {fill:#FEFEFE}
+    .fil3 {fill:#2B2A29;fill-rule:nonzero}
+    .fil6 {fill:#FEFEFE;fill-rule:nonzero}
+    .fil4 {fill:#9D9E9E;fill-rule:nonzero}
+    .fil8 {fill:#FEFEFE;fill-rule:nonzero}
+    .fil94 {fill:url(#id25)}
+    .fil97 {fill:url(#id26)}
+    .fil59 {fill:url(#id27)}
+    .fil26 {fill:url(#id28)}
+    .fil41 {fill:url(#id29)}
+    .fil112 {fill:url(#id30)}
+    .fil61 {fill:url(#id31)}
+    .fil48 {fill:url(#id32)}
+    .fil17 {fill:url(#id33)}
+    .fil105 {fill:url(#id34)}
+    .fil46 {fill:url(#id35)}
+    .fil89 {fill:url(#id36)}
+    .fil91 {fill:url(#id37)}
+    .fil76 {fill:url(#id38)}
+    .fil43 {fill:url(#id39)}
+    .fil62 {fill:url(#id40)}
+    .fil79 {fill:url(#id41)}
+    .fil55 {fill:url(#id42)}
+    .fil64 {fill:url(#id43)}
+    .fil92 {fill:url(#id44)}
+    .fil37 {fill:url(#id45)}
+    .fil90 {fill:url(#id46)}
+    .fil28 {fill:url(#id47)}
+    .fil108 {fill:url(#id48)}
+    .fil100 {fill:url(#id49)}
+    .fil80 {fill:url(#id50)}
+    .fil98 {fill:url(#id51)}
+    .fil111 {fill:url(#id52)}
+    .fil70 {fill:url(#id53)}
+    .fil35 {fill:url(#id54)}
+    .fil103 {fill:url(#id55)}
+    .fil104 {fill:url(#id56)}
+    .fil49 {fill:url(#id57)}
+    .fil65 {fill:url(#id58)}
+    .fil33 {fill:url(#id59)}
+    .fil84 {fill:url(#id60)}
+    .fil102 {fill:url(#id61)}
+    .fil88 {fill:url(#id62)}
+    .fil68 {fill:url(#id63)}
+    .fil51 {fill:url(#id64)}
+    .fil85 {fill:url(#id65)}
+    .fil86 {fill:url(#id66)}
+    .fil47 {fill:url(#id67)}
+    .fil50 {fill:url(#id68)}
+    .fil56 {fill:url(#id69)}
+    .fil54 {fill:url(#id70)}
+    .fil18 {fill:url(#id71)}
+    .fil72 {fill:url(#id72)}
+    .fil38 {fill:url(#id73)}
+    .fil53 {fill:url(#id74)}
+    .fil52 {fill:url(#id75)}
+    .fil15 {fill:url(#id76)}
+    .fil34 {fill:url(#id77)}
+    .fil107 {fill:url(#id78)}
+    .fil83 {fill:url(#id79)}
+    .fil106 {fill:url(#id80)}
+    .fil45 {fill:url(#id81)}
+    .fil99 {fill:url(#id82)}
+    .fil73 {fill:url(#id83)}
+    .fil67 {fill:url(#id84)}
+    .fil81 {fill:url(#id85)}
+    .fil78 {fill:url(#id86)}
+    .fil39 {fill:url(#id87)}
+    .fil93 {fill:url(#id88)}
+    .fil66 {fill:url(#id89)}
+    .fil29 {fill:url(#id90)}
+    .fil44 {fill:url(#id91)}
+    .fil31 {fill:url(#id92)}
+    .fil32 {fill:url(#id93)}
+    .fil42 {fill:url(#id94)}
+    .fil96 {fill:url(#id95)}
+    .fil60 {fill:url(#id96)}
+    .fil21 {fill:url(#id97)}
+    .fil115 {fill:url(#id98)}
+    .fil69 {fill:url(#id99)}
+    .fil109 {fill:url(#id100)}
+    .fil116 {fill:url(#id101)}
+    .fil19 {fill:url(#id102)}
+    .fil110 {fill:url(#id103)}
+    .fil87 {fill:url(#id104)}
+    .fil12 {fill:url(#id105)}
+    .fil9 {fill:url(#id106)}
+    .fil16 {fill:url(#id107)}
+    .fil71 {fill:url(#id108)}
+    .fil30 {fill:url(#id109)}
+    .fil101 {fill:url(#id110)}
+    .fil95 {fill:url(#id111)}
+    .fil10 {fill:url(#id112)}
+    .fil13 {fill:url(#id113)}
+    .fil11 {fill:url(#id114)}
+    .fil63 {fill:url(#id115)}
+    .fil27 {fill:url(#id116)}
+    .fil23 {fill:url(#id117)}
+    .fil113 {fill:url(#id118)}
+    .fil14 {fill:url(#id119)}
+    .fil74 {fill:url(#id120)}
+    .fil36 {fill:url(#id121)}
+    .fil82 {fill:url(#id122)}
+    .fil40 {fill:url(#id123)}
+    .fil24 {fill:url(#id124)}
+    .fil75 {fill:url(#id125)}
+    .fil20 {fill:url(#id126)}
+    .fil25 {fill:url(#id127)}
+    .fil57 {fill:url(#id128)}
+    .fil22 {fill:url(#id129)}
+    .fil77 {fill:url(#id130)}
+    .fil114 {fill:url(#id131)}
+    .fil58 {fill:url(#id132)}
+    .fnt6 {font-weight:bold;font-size:423.33px;font-family:'Futura Md BT'}
+    .fnt0 {font-weight:normal;font-size:1131.15px;font-family:'Symbol'}
+    .fnt1 {font-weight:bold;font-size:1131.15px;font-family:'Futura Md BT'}
+    .fnt8 {font-weight:bold;font-size:1256.81px;font-family:'Futura Md BT'}
+    .fnt5 {font-weight:normal;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt7 {font-weight:bold;font-size:1508.2px;font-family:'Futura Md BT'}
+    .fnt4 {font-weight:normal;font-size:1900.27px;font-family:'Futura Md BT'}
+    .fnt9 {font-weight:normal;font-size:2111.45px;font-family:'Futura Md BT'}
+    .fnt3 {font-weight:normal;font-size:2533.72px;font-family:'Futura Md BT'}
+    .fnt2 {font-weight:bold;font-size:2533.72px;font-family:'Futura Md BT'}
+   ]]></style>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.3107319"
+     inkscape:cx="5.3382595"
+     inkscape:cy="56.703481"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77811,-595.10722)">
+    <path
+       style="fill:url(#linearGradient8425);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 246.27811,595.60722 h 21 v 2 l -6.5,10.5 -6,-10.5 h -8.5 z"
+       id="path4763"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="opacity:0.75;fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter8458)"
+       d="m 260.56574,601.46532 c -0.0435,-1.8491 2.94024,0.22303 6.9605,0.15554 -2.37934,0.87001 -4.78447,3.12651 -6.54699,4.79868 -0.69731,-2.00112 -0.66057,-4.5027 -0.41351,-4.95422 z"
+       id="path8400"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc"
+       transform="rotate(96.15813,261.98063,600.60609)" />
+    <path
+       style="fill:none;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.8892617"
+       d="m 254.77811,597.60722 h 12"
+       id="path8429"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="ccccccc"
+       inkscape:connector-curvature="0"
+       id="path8431"
+       d="m 246.27811,595.60722 h 21 v 2 l -6.5,10.5 -6,-10.5 h -8.5 z"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318"
+       transform="matrix(1.0666667,0,0,1.0666667,641.03977,883.51086)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386"
+       transform="matrix(1.0666667,0,0,1.0666667,1224.7427,320.09945)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162"
+       transform="matrix(1.0666667,0,0,1.0666667,483.79064,152.88667)" />
+    <path
+       style="color:#ff0000;fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none"
+       inkscape:connector-curvature="0"
+       d="m 245.77811,618.10722 h 6 v -5 h 10 l 0.0364,5 h 5.8892 0.0728 3.3e-4"
+       id="path7427"
+       sodipodi:nodetypes="cccccccc" />
+    <path
+       style="color:#ff0000;fill:none;stroke:#e15244;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 245.77811,615.10722 h 3.26 c 0.41401,-5.17784 3.74,-4.9925 8.15173,-4.9925 l 6.10827,-0.008 c 0.66269,3.44378 0.48,5.0009 4.47873,5.0009"
+       id="path7438"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <text
+       id="text7408-2"
+       class="fil7 fnt4"
+       y="183.92776"
+       x="-484.44421"
+       style="font-weight:normal;font-size:10.66666698px;font-family:'Futura Md BT';text-align:center;text-anchor:middle;clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;stroke-width:1.06666672;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422"
+       class="fil7 fnt4"
+       y="213.22548"
+       x="-466.97989"
+       style="font-weight:normal;font-size:10.66666698px;font-family:'Futura Md BT';text-align:center;text-anchor:middle;clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;stroke-width:1.06666672;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_transform-24.xcf b/pixmaps/src/gwy_transform-24.xcf
new file mode 100644
index 0000000..8c47453
Binary files /dev/null and b/pixmaps/src/gwy_transform-24.xcf differ
diff --git a/pixmaps/src/gwy_unrotate-24.svg b/pixmaps/src/gwy_unrotate-24.svg
new file mode 100644
index 0000000..edd50d8
--- /dev/null
+++ b/pixmaps/src/gwy_unrotate-24.svg
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   id="svg2160"
+   sodipodi:version="0.32"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_unrotate-24.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.1"
+   inkscape:export-filename="gwy_rotate-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs2162" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.931242"
+     inkscape:cx="-15.27214"
+     inkscape:cy="20.037853"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata2165">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-8)">
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#6a9b3b;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 0,12.5 H 24"
+       id="path8436"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8438"
+       d="M 0,17.5 H 24"
+       style="fill:none;fill-rule:evenodd;stroke:#6a9b3b;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8440"
+       d="M 0,22.5 H 24"
+       style="fill:none;fill-rule:evenodd;stroke:#6a9b3b;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#6a9b3b;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 0,27.5 H 24"
+       id="path8442"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8444"
+       d="M 19.5,8 V 32"
+       style="fill:none;fill-rule:evenodd;stroke:#6a9b3b;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#6a9b3b;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 14.5,8 V 32"
+       id="path8446"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#6a9b3b;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 9.5,8 V 32"
+       id="path8448"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8450"
+       d="M 4.5,8 V 32"
+       style="fill:none;fill-rule:evenodd;stroke:#6a9b3b;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 19.895473,30.856274 1.1437255,27.895472 4.1045276,9.1437255 22.856275,12.104527 Z"
+       id="path8454"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_value_invert-24.svg b/pixmaps/src/gwy_value_invert-24.svg
new file mode 100644
index 0000000..89ca9a8
--- /dev/null
+++ b/pixmaps/src/gwy_value_invert-24.svg
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 22.5 22.5"
+   id="svg8093"
+   version="1.1"
+   inkscape:version="0.92.1 unknown"
+   sodipodi:docname="gwy_value_invert-24.svg"
+   inkscape:export-filename="gwy_scale-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs8095" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.5734899"
+     inkscape:cx="-222.88015"
+     inkscape:cy="-50.426667"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     units="px"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="0.9375"
+                       spacingy="0.9375"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8098">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-244.77814,-596.57599)">
+    <rect
+       y="597.04474"
+       x="245.24689"
+       height="21.5625"
+       width="21.5625"
+       id="rect10108"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#699b3b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#e8f0e0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.9375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.53333336;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 256.02147,618.60719 h -10.77458 v -21.5624 h 10.77458"
+       id="rect8431"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#e8f0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.53333336;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path8747"
+       cx="256.02814"
+       cy="607.82599"
+       r="6.09375" />
+    <path
+       id="circle8749"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#699b3b;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.53333336;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       sodipodi:type="arc"
+       sodipodi:cx="-607.82599"
+       sodipodi:cy="256.02814"
+       sodipodi:rx="6.09375"
+       sodipodi:ry="6.09375"
+       sodipodi:start="3.1415927"
+       sodipodi:end="0"
+       d="m -613.91974,256.02814 a 6.09375,6.09375 0 0 1 6.09375,-6.09375 6.09375,6.09375 0 0 1 6.09375,6.09375 h -6.09375 z"
+       transform="rotate(-90)" />
+    <circle
+       r="6.09375"
+       cy="607.82599"
+       cx="256.02814"
+       id="circle8751"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.53333336;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_volume-24.svg b/pixmaps/src/gwy_volume-24.svg
new file mode 100644
index 0000000..c3f4868
--- /dev/null
+++ b/pixmaps/src/gwy_volume-24.svg
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_volume-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.803221"
+     inkscape:cx="26.849074"
+     inkscape:cy="16.158224"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true"
+     inkscape:snap-smooth-nodes="true"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8625"
+       d="m 199.1133,489.64375 9.47583,-5.63833 10.89338,5.07017 -8.50916,6.76233 z"
+       style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+    <path
+       style="fill:#b3d296;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;fill-opacity:1"
+       d="m 198.66361,482.99919 9.92552,-4.57753 11.40722,3.89159 -8.92024,5.831 z"
+       id="path8602"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#b3d296;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 199.1133,489.64375 -0.44969,-6.64456 -0.44969,-6.64456 12.96496,4.09595 -0.10277,7.69367 -0.10276,7.69367 z"
+       id="path8444"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:#7db846;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 210.97335,495.83792 8.50916,-6.76233 0.51384,-6.76234 0.51383,-6.76233 -9.3313,4.89966 -0.10276,7.69367 z"
+       id="path8446"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 220.51018,475.55092 -11.92105,-2.71303 -10.37521,3.51674 12.96496,4.09595 z"
+       id="path8448"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_volume_calibrate-24.svg b/pixmaps/src/gwy_volume_calibrate-24.svg
new file mode 100644
index 0000000..676fe3c
--- /dev/null
+++ b/pixmaps/src/gwy_volume_calibrate-24.svg
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_volume_calibrate-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045">
+    <marker
+       inkscape:stockid="TriangleOutS"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleOutS"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path8570"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+         transform="scale(0.2)" />
+    </marker>
+    <marker
+       inkscape:stockid="TriangleInS"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleInS"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path8561"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+         transform="scale(-0.2)" />
+    </marker>
+    <marker
+       inkscape:stockid="TriangleOutM"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleOutM"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path8567"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+         transform="scale(0.4)" />
+    </marker>
+    <marker
+       inkscape:stockid="TriangleInM"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleInM"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path8558"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+         transform="scale(-0.4)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.8682797"
+     inkscape:cx="22.285916"
+     inkscape:cy="33.49219"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true"
+     inkscape:snap-smooth-nodes="true"
+     showguides="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <g
+       id="g9110"
+       transform="translate(-0.351871,-0.31427201)"
+       style="stroke:#000000">
+      <path
+         style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.79884571px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+         d="m 198.8072,488.74572 7.31043,-4.35007 8.40404,3.91172 -6.56466,5.21726 z"
+         id="path8625"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc" />
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="path8602"
+         d="m 198.46027,483.61932 7.65736,-3.53165 8.80045,3.00243 -6.88179,4.49872 z"
+         style="fill:#b3d296;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.79884571px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="ccccccc"
+         inkscape:connector-curvature="0"
+         id="path8444"
+         d="m 198.8072,488.74572 -0.34693,-5.1264 -0.34693,-5.12639 10.00224,3.1601 -0.0793,5.93579 -0.0793,5.93581 z"
+         style="fill:#b3d296;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:0.79884571px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="ccccccc"
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 207.95701,493.52463 6.56466,-5.21726 0.39641,-5.21727 0.39642,-5.21724 -7.19892,3.78017 -0.0793,5.93579 z"
+         style="fill:#7db846;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:0.79884571px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8448"
+         d="m 215.3145,477.87286 -9.19687,-2.09316 -8.00429,2.71323 10.00224,3.1601 z"
+         style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.79884571px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 218.32405,479.33789 v 10"
+       id="path8420"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 221.36205,480.33789 h -6 l 3,-4 z"
+       id="path9101"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       sodipodi:nodetypes="cccc"
+       inkscape:connector-curvature="0"
+       id="path9103"
+       d="m 221.36205,489.33789 h -6 l 3,4 z"
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_volume_dimensions-24.svg b/pixmaps/src/gwy_volume_dimensions-24.svg
new file mode 100644
index 0000000..70ab018
--- /dev/null
+++ b/pixmaps/src/gwy_volume_dimensions-24.svg
@@ -0,0 +1,634 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_volume_dimensions-24.svg"
+   inkscape:export-filename="gwy_volume_dimensions-24.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96">
+  <defs
+     id="defs10045">
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4171"
+       xlink:href="#linearGradient4140"
+       gradientTransform="translate(59.29372,916.17626)" />
+    <linearGradient
+       id="linearGradient4140">
+      <stop
+         id="stop4142"
+         offset="0"
+         style="stop-color:#d7e3f4;stop-opacity:1;" />
+      <stop
+         id="stop4144"
+         offset="1"
+         style="stop-color:#f1f5fb;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient8503"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(16.5221,915.32985)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4140"
+       id="linearGradient11272"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(32.08851,923.82057)"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientTransform="translate(-8.15321,921.35162)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient9134"
+       xlink:href="#linearGradient4140"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="translate(-11.142957,824.89612)"
+       xlink:href="#linearGradient4140"
+       id="linearGradient4171-3"
+       gradientUnits="userSpaceOnUse"
+       x1="207.50029"
+       y1="247.92804"
+       x2="272.91217"
+       y2="361.22473" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="15.622585"
+     inkscape:cx="7.2716537"
+     inkscape:cy="20.334967"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true"
+     inkscape:snap-smooth-nodes="true"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385"
+       y="806.24518"
+       x="60.663467">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487"
+       y="902.12134"
+       x="84.793442">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536"
+       y="841.53381"
+       x="19.360735">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6"
+       style="opacity:1;fill:url(#linearGradient4171);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318"
+       transform="translate(-19.81988,640.86029)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386"
+       transform="translate(527.40136,112.66231)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162"
+       transform="translate(-167.24081,-44.09958)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="380.92767"
+       y="1030.1844"
+       id="text8015"><tspan
+         id="tspan8017"
+         x="380.92767"
+         y="1030.1844" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1192.1738"
+       y="-296.88043"
+       id="text9295"><tspan
+         id="tspan9297"
+         x="-1192.1738"
+         y="-296.88043" /></text>
+    <text
+       id="text7408-2"
+       class="fil7 fnt4"
+       y="-14.998607"
+       x="-1074.9611"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422"
+       class="fil7 fnt4"
+       y="12.468007"
+       x="-1058.5881"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-9"
+       y="805.39874"
+       x="17.891848">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-0"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-9"
+       y="901.2749"
+       x="42.02182">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-1"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7"
+       y="840.68738"
+       x="-23.410887">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-7"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-1"
+       style="opacity:1;fill:url(#linearGradient8503);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-7"
+       transform="translate(-62.59148,640.01388)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-6"
+       transform="translate(484.62977,111.8159)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7"
+       transform="translate(-210.01241,-44.94599)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="338.15607"
+       y="1029.338"
+       id="text8015-3"><tspan
+         id="tspan8017-6"
+         x="338.15607"
+         y="1029.338" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1234.9454"
+       y="-297.72681"
+       id="text9295-5"><tspan
+         id="tspan9297-6"
+         x="-1234.9454"
+         y="-297.72681" /></text>
+    <text
+       id="text7408-2-3"
+       class="fil7 fnt4"
+       y="-15.845012"
+       x="-1117.7327"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-9"
+       class="fil7 fnt4"
+       y="11.621602"
+       x="-1101.3597"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-7"
+       y="813.88947"
+       x="33.458252">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-2"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-3"
+       y="909.76562"
+       x="57.588226">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-7"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-2"
+       y="849.1781"
+       x="-7.8444805">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-5"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-3"
+       style="opacity:1;fill:url(#linearGradient11272);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-3"
+       transform="translate(-47.02508,648.5046)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-64"
+       transform="translate(500.19616,120.30662)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-03"
+       transform="translate(-194.44601,-36.45527)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="353.72247"
+       y="1037.8287"
+       id="text8015-5"><tspan
+         id="tspan8017-85"
+         x="353.72247"
+         y="1037.8287" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1219.379"
+       y="-289.23608"
+       id="text9295-0"><tspan
+         id="tspan9297-9"
+         x="-1219.379"
+         y="-289.23608" /></text>
+    <text
+       id="text7408-2-9"
+       class="fil7 fnt4"
+       y="-7.3542891"
+       x="-1102.1663"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-8"
+       class="fil7 fnt4"
+       y="20.112326"
+       x="-1085.7933"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4385-2"
+       y="811.42053"
+       x="-6.7834759">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4387-6"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4487-5"
+       y="907.29669"
+       x="17.346497">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4489-8"
+         font-size="4.0000" />
+    </text>
+    <text
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial"
+       id="text4536-7-2"
+       y="846.70917"
+       x="-48.086227">
+      <tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:Arial;-inkscape-font-specification:Arial;fill:#1b1918"
+         id="tspan4538-9"
+         font-size="4.0000" />
+    </text>
+    <path
+       inkscape:connector-curvature="0"
+       d=""
+       cx="242.94168"
+       cy="308.38486"
+       r="70.205605"
+       id="path4138-6-6"
+       style="opacity:1;fill:url(#linearGradient9134);fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g5318-4"
+       transform="translate(-87.26678,646.03565)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g6386-8"
+       transform="translate(459.95446,117.83767)" />
+    <g
+       style="color:#ffffff;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter"
+       id="g7162-7-4"
+       transform="translate(-234.68772,-38.92423)" />
+    <text
+       xml:space="preserve"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;color-interpolat [...]
+       x="313.48077"
+       y="1035.3597"
+       id="text8015-0"><tspan
+         id="tspan8017-8"
+         x="313.48077"
+         y="1035.3597" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="-1259.6207"
+       y="-291.70502"
+       id="text9295-6-9"><tspan
+         id="tspan9297-2"
+         x="-1259.6207"
+         y="-291.70502" /></text>
+    <text
+       id="text7408-2-4"
+       class="fil7 fnt4"
+       y="-9.8232222"
+       x="-1142.408"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <text
+       id="text7422-7"
+       class="fil7 fnt4"
+       y="17.643393"
+       x="-1126.035"
+       style="font-weight:normal;font-size:11.24956036px;font-family:'Futura Md BT';clip-rule:evenodd;fill:#fefefe;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" />
+    <g
+       id="g8575"
+       style="opacity:1">
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="rect16956-4"
+         d="m 212.86204,496.8379 h 8 v -25.00001 h -8 z"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <path
+         sodipodi:nodetypes="cc"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 213.36204,486.83204 h 5"
+         id="path16962-8"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="cc"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 213.36204,474.83204 h 5"
+         id="path16970-1"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="cc"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 213.36204,478.83204 h 3"
+         id="path8257"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="cc"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 213.36204,490.83204 h 3"
+         id="path8276"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path8356"
+         d="m 213.36204,494.83204 h 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path8358"
+         d="m 213.36204,482.83204 h 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 213.36204,493.83204 h 3"
+         id="path8265"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8267"
+         d="m 213.36204,489.83204 h 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="cc" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path8269"
+         d="m 213.36204,485.83204 h 5"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 213.36204,481.83204 h 3"
+         id="path8271"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cc" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path8273"
+         d="m 213.36204,473.83204 h 5"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8275"
+         d="m 213.36204,477.83204 h 3"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="cc" />
+    </g>
+    <g
+       id="g8587"
+       style="opacity:1"
+       transform="translate(4)">
+      <g
+         transform="matrix(1,0,0,-1,-4.00001,968.67578)"
+         id="g8637"
+         style="">
+        <path
+           style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+           d="m 201.8622,471.83788 h 6 v 25 h -6 z"
+           id="rect12874"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc" />
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 202.36204,479.83801 h 3"
+           id="path12876"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 202.36204,476.83801 h 2.00001"
+           id="path12880"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path12882"
+           d="m 202.36204,473.83801 h 3"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 202.36204,488.83801 h 2.00001"
+           id="path12884"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 202.36204,482.83801 h 2.00001"
+           id="path12890"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path12892"
+           d="m 202.36204,485.83801 h 3"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 202.36204,491.83801 h 3"
+           id="path8091"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path8509"
+           d="m 202.36204,494.83801 h 2.00001"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      </g>
+    </g>
+    <g
+       id="g8425"
+       transform="matrix(0.65166933,0,0,0.6521518,77.16252,172.47612)"
+       style="opacity:1;stroke-width:1.53395295">
+      <path
+         style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.53395295px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+         d="m 199.1133,489.64375 9.47583,-5.63833 10.89338,5.07017 -8.50916,6.76233 z"
+         id="path8625"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc" />
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="path8602"
+         d="m 198.66361,482.99919 9.92552,-4.57753 11.40722,3.89159 -8.92024,5.831 z"
+         style="fill:#b3d296;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.53395295px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="ccccccc"
+         inkscape:connector-curvature="0"
+         id="path8444"
+         d="m 199.1133,489.64375 -0.44969,-6.64456 -0.44969,-6.64456 12.96496,4.09595 -0.10277,7.69367 -0.10276,7.69367 z"
+         style="fill:#b3d296;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1.53395295px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="ccccccc"
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 210.97335,495.83792 8.50916,-6.76233 0.51384,-6.76234 0.51383,-6.76233 -9.3313,4.89966 -0.10276,7.69367 z"
+         style="fill:#7db846;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1.53395295px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8448"
+         d="m 220.51018,475.55092 -11.92105,-2.71303 -10.37521,3.51674 12.96496,4.09595 z"
+         style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.53395295px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_volume_fd-24.svg b/pixmaps/src/gwy_volume_fd-24.svg
new file mode 100644
index 0000000..36229c9
--- /dev/null
+++ b/pixmaps/src/gwy_volume_fd-24.svg
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_volume_fd-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.6563396"
+     inkscape:cx="7.7738282"
+     inkscape:cy="-33.008779"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true"
+     inkscape:snap-smooth-nodes="true"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8625"
+       d="m 199.1133,489.64375 9.47583,-5.63833 10.89338,5.07017 -8.50916,6.76233 z"
+       style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+    <path
+       style="fill:#b3d296;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;fill-opacity:1"
+       d="m 198.66361,482.99919 9.92552,-4.57753 11.40722,3.89159 -8.92024,5.831 z"
+       id="path8602"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#b3d296;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 199.1133,489.64375 -0.44969,-6.64456 -0.44969,-6.64456 12.96496,4.09595 -0.10277,7.69367 -0.10276,7.69367 z"
+       id="path8444"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:#7db846;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 210.97335,495.83792 8.50916,-6.76233 0.51384,-6.76234 0.51383,-6.76233 -9.3313,4.89966 -0.10276,7.69367 z"
+       id="path8446"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 220.51018,475.55092 -11.92105,-2.71303 -10.37521,3.51674 12.96496,4.09595 z"
+       id="path8448"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g8458"
+       transform="translate(0,0.46977756)">
+      <g
+         transform="translate(50.543528,-5.4800825)"
+         id="g8453">
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#fcfcfc;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 149.38036,477.28775 c 0,1.6665 -0.64034,33.28751 4.89852,17.56983 2.7976,-5.89057 9.52869,-7.96489 16.00044,-7.96489"
+           id="path8636"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccc" />
+        <path
+           sodipodi:nodetypes="ccc"
+           inkscape:connector-curvature="0"
+           id="path12604"
+           d="m 149.38036,477.28775 c 0,1.6665 -0.64034,33.28751 4.89852,17.56983 2.7976,-5.89057 9.52869,-7.96489 16.00044,-7.96489"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_volume_invert-24.svg b/pixmaps/src/gwy_volume_invert-24.svg
new file mode 100644
index 0000000..7e6500c
--- /dev/null
+++ b/pixmaps/src/gwy_volume_invert-24.svg
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   inkscape:export-ydpi="90"
+   inkscape:export-xdpi="90"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   sodipodi:docname="gwy_volume_invert-24.svg"
+   inkscape:version="0.92.1 r15371"
+   version="1.1"
+   id="svg10043"
+   viewBox="0 0 24 24"
+   height="24"
+   width="24">
+  <defs
+     id="defs10045" />
+  <sodipodi:namedview
+     showguides="false"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:snap-global="true"
+     inkscape:object-nodes="true"
+     inkscape:window-maximized="1"
+     inkscape:window-y="27"
+     inkscape:window-x="0"
+     inkscape:window-height="1016"
+     inkscape:window-width="1920"
+     units="px"
+     showgrid="false"
+     inkscape:current-layer="layer1"
+     inkscape:document-units="px"
+     inkscape:cy="-92.160525"
+     inkscape:cx="114.9141"
+     inkscape:zoom="1"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <g
+       id="layer1-5"
+       inkscape:label="Layer 1"
+       transform="translate(0,-1.1261181e-5)">
+      <path
+         style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+         d="m 199.1133,489.64375 9.47583,-5.63833 10.89338,5.07017 -8.50916,6.76233 z"
+         id="path8625-6"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc" />
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="path8602-2"
+         d="m 198.66361,482.99919 9.92552,-4.57753 11.40722,3.89159 -8.92024,5.831 z"
+         style="fill:#b3d296;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="ccccccc"
+         inkscape:connector-curvature="0"
+         id="path8444-9"
+         d="m 199.1133,489.64375 -0.44969,-6.64456 -0.44969,-6.64456 12.96496,4.09595 -0.10277,7.69367 -0.10276,7.69367 z"
+         style="fill:#b3d296;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="ccccccc"
+         inkscape:connector-curvature="0"
+         id="path8446-1"
+         d="m 210.97335,495.83792 8.50916,-6.76233 0.51384,-6.76234 0.51383,-6.76233 -9.3313,4.89966 -0.10276,7.69367 z"
+         style="fill:#7db846;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8448-2"
+         d="m 220.51018,475.55092 -11.92105,-2.71303 -10.37521,3.51674 12.96496,4.09595 z"
+         style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+    </g>
+    <g
+       id="g4843">
+      <rect
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#699b3b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="rect10108"
+         width="14.99996"
+         height="14.999966"
+         x="205.86205"
+         y="480.83792" />
+      <path
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="rect8431"
+         d="m 213.35739,495.83785 h -7.49534 v -14.99988 h 7.49534"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#e8f0e0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.53333336;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <ellipse
+         ry="4.2391205"
+         rx="4.2391191"
+         cy="488.33789"
+         cx="213.36201"
+         id="path8747"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#e8f0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.53333336;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <path
+         transform="rotate(-90)"
+         d="m -492.57701,213.36201 a 4.2391205,4.2391191 0 0 1 4.23912,-4.23911 4.2391205,4.2391191 0 0 1 4.23912,4.23911 h -4.23912 z"
+         sodipodi:end="0"
+         sodipodi:start="3.1415927"
+         sodipodi:ry="4.2391191"
+         sodipodi:rx="4.2391205"
+         sodipodi:cy="213.36201"
+         sodipodi:cx="-488.33789"
+         sodipodi:type="arc"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#699b3b;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.53333336;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="circle8749" />
+      <ellipse
+         ry="4.2391205"
+         rx="4.2391191"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.53333336;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+         id="circle8751"
+         cx="213.36201"
+         cy="488.33789" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_volume_kmeans-24.svg b/pixmaps/src/gwy_volume_kmeans-24.svg
new file mode 100644
index 0000000..f938f39
--- /dev/null
+++ b/pixmaps/src/gwy_volume_kmeans-24.svg
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_volume_kmeans-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="56.660862"
+     inkscape:cy="235.62877"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true"
+     inkscape:snap-smooth-nodes="true"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8625"
+       d="m 198.80006,484.29824 6.17555,-3.67717 7.09939,3.30663 -5.54556,4.41022 z"
+       style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+    <path
+       style="fill:#b3d296;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 198.50699,479.96484 6.46862,-2.98535 7.43427,2.53799 -5.81346,3.80283 z"
+       id="path8602"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#b3d296;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 198.80006,484.29824 -0.29307,-4.3334 -0.29307,-4.33341 8.44947,2.67127 -0.067,5.01761 -0.067,5.01761 z"
+       id="path8444"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:#7db846;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 206.52944,488.33792 5.54556,-4.41022 0.33488,-4.41022 0.33487,-4.41021 -6.08136,3.19543 -0.067,5.01761 z"
+       id="path8446"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 212.74475,475.10727 -7.76914,-1.76936 -6.76169,2.29352 8.44947,2.67127 z"
+       id="path8448"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:norma [...]
+       d="m 203.16593,490.00028 -3.33976,2.83761 3.60784,3.5 h 2.85608 l -3.3897,-3.5 3.11328,-2.83761 z"
+       id="path8441"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 200.36205,487.33789 v 9"
+       id="path8443"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8519"
+       width="2"
+       height="2"
+       x="214.36205"
+       y="490.33789" />
+    <rect
+       y="488.33789"
+       x="210.36205"
+       height="2"
+       width="2"
+       id="rect8521"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8523"
+       width="2"
+       height="2"
+       x="211.36205"
+       y="492.33789" />
+    <rect
+       y="487.33789"
+       x="215.36205"
+       height="2"
+       width="2"
+       id="rect8525"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8527"
+       width="2"
+       height="2"
+       x="216.36205"
+       y="491.33789" />
+    <rect
+       y="494.33789"
+       x="218.36205"
+       height="2"
+       width="2"
+       id="rect8529"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8531"
+       width="2"
+       height="2"
+       x="218.36205"
+       y="484.33789" />
+    <rect
+       y="481.33789"
+       x="215.36205"
+       height="2"
+       width="2"
+       id="rect8533"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8535"
+       width="2"
+       height="2"
+       x="207.36205"
+       y="494.33789" />
+    <circle
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="path8578"
+       cx="215.36205"
+       cy="490.33789"
+       r="5" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_volume_kmedians-24.svg b/pixmaps/src/gwy_volume_kmedians-24.svg
new file mode 100644
index 0000000..30e4740
--- /dev/null
+++ b/pixmaps/src/gwy_volume_kmedians-24.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_volume_kmedians-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="6.5467513"
+     inkscape:cx="-20.242981"
+     inkscape:cy="27.233206"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true"
+     inkscape:snap-smooth-nodes="true"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path8625"
+       d="m 198.80006,484.29824 6.17555,-3.67717 7.09939,3.30663 -5.54556,4.41022 z"
+       style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+    <path
+       style="fill:#b3d296;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 198.50699,479.96484 6.46862,-2.98535 7.43427,2.53799 -5.81346,3.80283 z"
+       id="path8602"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#b3d296;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 198.80006,484.29824 -0.29307,-4.3334 -0.29307,-4.33341 8.44947,2.67127 -0.067,5.01761 -0.067,5.01761 z"
+       id="path8444"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:#7db846;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 206.52944,488.33792 5.54556,-4.41022 0.33488,-4.41022 0.33487,-4.41021 -6.08136,3.19543 -0.067,5.01761 z"
+       id="path8446"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       d="m 212.74475,475.10727 -7.76914,-1.76936 -6.76169,2.29352 8.44947,2.67127 z"
+       id="path8448"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:norma [...]
+       d="m 203.16593,490.00028 -3.33976,2.83761 3.60784,3.5 h 2.85608 l -3.3897,-3.5 3.11328,-2.83761 z"
+       id="path8441"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 200.36205,487.33789 v 9"
+       id="path8443"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <rect
+       y="488.33789"
+       x="210.36205"
+       height="2"
+       width="2"
+       id="rect8521"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8523"
+       width="2"
+       height="2"
+       x="211.36205"
+       y="492.33789" />
+    <rect
+       y="487.33789"
+       x="215.36205"
+       height="2"
+       width="2"
+       id="rect8525"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8527"
+       width="2"
+       height="2"
+       x="216.36205"
+       y="491.33789" />
+    <rect
+       y="494.33789"
+       x="218.36205"
+       height="2"
+       width="2"
+       id="rect8529"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8531"
+       width="2"
+       height="2"
+       x="218.36205"
+       y="484.33789" />
+    <rect
+       y="481.33789"
+       x="215.36205"
+       height="2"
+       width="2"
+       id="rect8533"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8535"
+       width="2"
+       height="2"
+       x="207.36205"
+       y="494.33789" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.60000002;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8519"
+       width="3.9999907"
+       height="3.9999907"
+       x="213.36206"
+       y="489.33789" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_volume_slice-24.svg b/pixmaps/src/gwy_volume_slice-24.svg
new file mode 100644
index 0000000..5bb61ea
--- /dev/null
+++ b/pixmaps/src/gwy_volume_slice-24.svg
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_volume_slice-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.3354388"
+     inkscape:cx="-41.066226"
+     inkscape:cy="-7.3167364"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:snap-global="true"
+     inkscape:snap-smooth-nodes="true"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <g
+       id="g8459"
+       transform="matrix(1.1946383,0,0,1.194333,-40.749873,-94.122843)"
+       style="stroke-width:0.83718044">
+      <path
+         style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.83718044px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+         d="m 200.7831,488.78042 7.93196,-4.7209 9.11855,4.24518 -7.12278,5.66201 z"
+         id="path8625"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc" />
+      <path
+         sodipodi:nodetypes="ccccccc"
+         inkscape:connector-curvature="0"
+         id="path8444"
+         d="m 200.7831,488.78042 -0.37642,-5.5634 -0.37643,-5.56341 10.85262,3.42949 -0.086,6.44181 -0.086,6.4418 z"
+         style="fill:#b3d296;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:0.83718044px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="ccccccc"
+         inkscape:connector-curvature="0"
+         id="path8446"
+         d="m 210.71083,493.96671 7.12278,-5.66201 0.43012,-5.66201 0.43012,-5.66201 -7.81098,4.10242 -0.086,6.44181 z"
+         style="fill:#7db846;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:0.83718044px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="path8602"
+         d="m 200.40668,483.21702 8.30838,-3.83271 9.54867,3.25838 -7.46689,4.88222 z"
+         style="fill:#db2424;fill-opacity:1;fill-rule:evenodd;stroke:#db2424;stroke-width:0.83718044px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8448"
+         d="m 218.69385,476.98068 -9.97879,-2.27159 -8.68481,2.94452 10.85262,3.42949 z"
+         style="fill:#7db846;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.83718044px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path8451"
+         d="m 210.88287,481.0831 -0.086,6.94181"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.83718044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_xy_denoise-24.svg b/pixmaps/src/gwy_xy_denoise-24.svg
new file mode 100644
index 0000000..34049d3
--- /dev/null
+++ b/pixmaps/src/gwy_xy_denoise-24.svg
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg10043"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_xy_denoise-24.svg"
+   inkscape:export-filename="gwy_arithmetic-24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs10045" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.6563396"
+     inkscape:cx="37.236181"
+     inkscape:cy="-5.7190499"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:object-nodes="true"
+     inkscape:lockguides="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata10048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-197.36205,-472.33789)">
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#8abce8;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect11370"
+       width="13"
+       height="13"
+       x="197.86205"
+       y="472.83789" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 198.36205,485.83789 h 7"
+       id="path8746"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8740"
+       d="m 198.36205,474.83789 h 12"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 198.36205,476.83789 h 12"
+       id="path8586"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8588"
+       d="m 198.36205,479.83789 h 12"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 198.36205,483.83789 h 12"
+       id="path8590"
+       inkscape:connector-curvature="0" />
+    <rect
+       y="475.83789"
+       x="207.86205"
+       height="13"
+       width="13"
+       id="rect8183"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#cde2f5;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       sodipodi:nodetypes="cc"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 218.86205,476.33789 v 12"
+       id="path8598"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8600"
+       d="m 216.86205,476.33789 v 12"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 213.86205,476.33789 v 12"
+       id="path8602"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8604"
+       d="m 210.86205,476.33789 v 12"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#4696db;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       id="rect8153"
+       width="13"
+       height="13"
+       x="202.86205"
+       y="482.83789" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_zero_mean-24.svg b/pixmaps/src/gwy_zero_mean-24.svg
new file mode 100644
index 0000000..096d4b9
--- /dev/null
+++ b/pixmaps/src/gwy_zero_mean-24.svg
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8833"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_zero_mean-24.svg">
+  <defs
+     id="defs8835">
+    <linearGradient
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4171"
+       xlink:href="#linearGradient4140"
+       gradientTransform="translate(-11.142957,824.89612)" />
+    <linearGradient
+       id="linearGradient4140">
+      <stop
+         id="stop4142"
+         offset="0"
+         style="stop-color:#d7e3f4;stop-opacity:1;" />
+      <stop
+         id="stop4144"
+         offset="1"
+         style="stop-color:#f1f5fb;stop-opacity:1" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="9.5287932"
+     inkscape:cx="19.336481"
+     inkscape:cy="31.739175"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8838">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-199.64375,-490.06708)">
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.50000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 200.64378,494.5671 2,3 c 0,0 0,3 1,3 1,0 2,0 2,0 0,0 1,-3 1,-3 0,0 0,-3 1,-4 1,-1 4,-2 4,-2 l 2,4 2,0"
+       id="path8803"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 1;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 215.64378,510.5671 h -15"
+       id="path8805"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 210.64378,498.06708 v 8"
+       id="path8807"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 206.64375,505.06708 4,4 4,-4 z"
+       id="path8226"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#db2424;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 200.64375,496.56708 h 15"
+       id="path4818"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffbb00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 217.14391,489.56708 h 6 v 23 h -6 z"
+       id="rect12874"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#82d636;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 217.64374,498.56719 h 3"
+       id="path12876"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#82d636;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 217.64374,495.56719 h 2.00001"
+       id="path12880"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path12882"
+       d="m 217.64374,492.56719 h 3"
+       style="fill:#82d636;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:#82d636;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 217.64374,507.56719 h 2.00001"
+       id="path12884"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:#82d636;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 217.64374,501.56719 h 2.00001"
+       id="path12890"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path12892"
+       d="m 217.64374,504.56719 h 3"
+       style="fill:#82d636;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:#82d636;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 217.64374,510.56719 h 3"
+       id="path8091"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_zoom_1_1-24.svg b/pixmaps/src/gwy_zoom_1_1-24.svg
new file mode 100644
index 0000000..7ff1335
--- /dev/null
+++ b/pixmaps/src/gwy_zoom_1_1-24.svg
@@ -0,0 +1,339 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8272"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_zoom_1_1-24.svg">
+  <defs
+     id="defs8274">
+    <linearGradient
+       id="linearGradient4270">
+      <stop
+         style="stop-color:#3c98f4;stop-opacity:0.12156863"
+         offset="0"
+         id="stop4272" />
+      <stop
+         style="stop-color:#f1f5fb;stop-opacity:0.12156863"
+         offset="1"
+         id="stop4274" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4198">
+      <stop
+         id="stop4200-0"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0.39215687" />
+      <stop
+         id="stop4202"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0.3137255" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4782-7-2">
+      <circle
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="circle4784-1-2"
+         cx="276.29214"
+         cy="151.18121"
+         r="19.066629" />
+    </clipPath>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       id="linearGradient4146-6-8"
+       xlink:href="#linearGradient4270" />
+    <filter
+       height="1.1263148"
+       y="-0.063157417"
+       width="1.1142865"
+       x="-0.057143249"
+       id="filter4238-9-3"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4240-4-6"
+         stdDeviation="2.4600469" />
+    </filter>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="312.29819"
+       x2="227.00648"
+       y1="288.19104"
+       x1="214.93521"
+       id="linearGradient4204-9-1"
+       xlink:href="#linearGradient4198" />
+    <filter
+       height="1.025263"
+       y="-0.012631484"
+       width="1.0228573"
+       x="-0.011428649"
+       id="filter4254-1-3"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4256-7-1"
+         stdDeviation="0.49200938" />
+    </filter>
+    <linearGradient
+       gradientTransform="translate(-82.687317,-0.17664853)"
+       inkscape:collect="always"
+       xlink:href="#linearGradient12587"
+       id="linearGradient12593"
+       x1="363.08881"
+       y1="538.68573"
+       x2="365.21747"
+       y2="540.84064"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient12587">
+      <stop
+         style="stop-color:#6daa34;stop-opacity:1"
+         offset="0"
+         id="stop12589" />
+      <stop
+         id="stop13669"
+         offset="0.5"
+         style="stop-color:#87c74a;stop-opacity:1" />
+      <stop
+         style="stop-color:#6daa34;stop-opacity:1"
+         offset="1"
+         id="stop12591" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter18492"
+       x="-0.047411256"
+       width="1.0948225"
+       y="-0.04860355"
+       height="1.0972071">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.42995752"
+         id="feGaussianBlur18494" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="30.908981"
+     inkscape:cx="14.529779"
+     inkscape:cy="19.248958"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     showguides="false"
+     inkscape:snap-grids="true">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8277">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-276.85299,-520.68522)">
+    <g
+       id="g18446"
+       transform="translate(-80.972697,-31.419635)"
+       style="opacity:0.5;filter:url(#filter18492)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path18369"
+         d="m 363.68784,568.4473 -5.08846,5.03989 c -0.0998,0.0989 -0.11276,0.3176 -0.0177,0.42101 l 1.80326,1.96183 c 0.095,0.10341 0.32123,0.11658 0.42097,0.0177 l 5.08846,-5.0399 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.99607843"
+         sodipodi:nodetypes="csssscc" />
+      <circle
+         transform="matrix(-0.16007054,0.98710558,-0.98710558,-0.16007054,0,0)"
+         cx="496.39133"
+         cy="-457.18619"
+         r="8.4484291"
+         id="circle18383"
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path4717-0"
+       d="m 283.52763,535.28367 -5.08846,5.03989 c -0.0998,0.0989 -0.11276,0.3176 -0.0177,0.42102 l 0.90163,0.98091 0.90162,0.98091 c 0.095,0.10341 0.32124,0.11658 0.42098,0.0177 l 5.08846,-5.0399 -1.10326,-1.20027 z"
+       style="fill:url(#linearGradient12593);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:"
+       sodipodi:nodetypes="csscssccc" />
+    <g
+       id="g18291"
+       transform="matrix(0.91094965,0,0,0.91094965,-62.437764,50.321472)">
+      <g
+         id="g4751-3"
+         clip-path="url(#clipPath4782-7-2)"
+         transform="matrix(-0.40789887,0.26719843,-0.26719843,-0.40789887,540.73338,515.16801)">
+        <path
+           id="path4532-9"
+           style="fill:#ffffff;stroke:#868789;stroke-width:1.4453578;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+           d="m 276.3071,132.25651 a 21.406287,18.906167 0 0 1 21.40628,18.90617 21.406287,18.906167 0 1 1 -21.40628,-18.90617 z"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         id="g4449-8"
+         transform="matrix(-0.02114565,0.13039867,-0.13039867,-0.02114565,432.9912,502.16397)">
+        <circle
+           cx="242.94168"
+           cy="308.38486"
+           r="70.205605"
+           id="path4138-5"
+           style="opacity:1;fill:url(#linearGradient4146-6-8);fill-opacity:1;stroke:#505050;stroke-width:12.46485138;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4138-7-0-6"
+           d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+           style="opacity:1;fill:#ffffff;fill-opacity:0.42452829;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4238-9-3)" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4138-7-1"
+           d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+           style="opacity:1;fill:url(#linearGradient4204-9-1);fill-opacity:1;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4254-1-3)" />
+      </g>
+    </g>
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 294.853,526.68549 2,0 0,8 -2,0 z"
+       id="rect8232"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <rect
+       y="528.68549"
+       x="292.853"
+       height="1"
+       width="1"
+       id="rect8236"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 292.85301,528.68549 c 1.42912,-0.89007 1.3673,-1.34418 2,-2 l 1,1 c -0.66667,0.66765 -1.33333,1.42726 -2,2 l -1,-1"
+       id="path8240"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <g
+       id="g8257"
+       transform="translate(-91.187293,-0.6766946)">
+      <path
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0"
+         id="rect8259"
+         d="m 377.04031,527.36218 2,0 0,8 -2,0 z"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <rect
+         y="529.36218"
+         x="375.04031"
+         height="1"
+         width="1"
+         id="rect8261"
+         style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+      <path
+         style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 375.04032,529.36218 c 1.42912,-0.89007 1.3673,-1.34418 2,-2 l 1,1 c -0.66667,0.66765 -1.33333,1.42726 -2,2 l -1,-1"
+         id="path8263"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc" />
+    </g>
+    <rect
+       y="529.68549"
+       x="289.853"
+       height="1"
+       width="1"
+       id="rect8236-5"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="531.68549"
+       x="289.853"
+       height="1"
+       width="1"
+       id="rect8236-6"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="529.68549"
+       x="290.853"
+       height="1"
+       width="1"
+       id="rect8236-5-3"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="528.68549"
+       x="289.853"
+       height="1"
+       width="1"
+       id="rect8236-5-6"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="528.68549"
+       x="290.853"
+       height="1"
+       width="1"
+       id="rect8236-5-7"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="531.68549"
+       x="290.853"
+       height="1"
+       width="1"
+       id="rect8236-5-5"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="532.68549"
+       x="290.853"
+       height="1"
+       width="1"
+       id="rect8236-5-35"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <rect
+       y="532.68549"
+       x="289.853"
+       height="1"
+       width="1"
+       id="rect8236-5-62"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_zoom_fit-24.svg b/pixmaps/src/gwy_zoom_fit-24.svg
new file mode 100644
index 0000000..96af4d0
--- /dev/null
+++ b/pixmaps/src/gwy_zoom_fit-24.svg
@@ -0,0 +1,290 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8272"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_zoom_fit-24.svg">
+  <defs
+     id="defs8274">
+    <linearGradient
+       id="linearGradient4270">
+      <stop
+         style="stop-color:#3c98f4;stop-opacity:0.12156863"
+         offset="0"
+         id="stop4272" />
+      <stop
+         style="stop-color:#f1f5fb;stop-opacity:0.12156863"
+         offset="1"
+         id="stop4274" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4198">
+      <stop
+         id="stop4200-0"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0.39215687" />
+      <stop
+         id="stop4202"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0.3137255" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4782-7-2">
+      <circle
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="circle4784-1-2"
+         cx="276.29214"
+         cy="151.18121"
+         r="19.066629" />
+    </clipPath>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       id="linearGradient4146-6-8"
+       xlink:href="#linearGradient4270" />
+    <filter
+       height="1.1263148"
+       y="-0.063157417"
+       width="1.1142865"
+       x="-0.057143249"
+       id="filter4238-9-3"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4240-4-6"
+         stdDeviation="2.4600469" />
+    </filter>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="312.29819"
+       x2="227.00648"
+       y1="288.19104"
+       x1="214.93521"
+       id="linearGradient4204-9-1"
+       xlink:href="#linearGradient4198" />
+    <filter
+       height="1.025263"
+       y="-0.012631484"
+       width="1.0228573"
+       x="-0.011428649"
+       id="filter4254-1-3"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4256-7-1"
+         stdDeviation="0.49200938" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter18492"
+       x="-0.047411256"
+       width="1.0948225"
+       y="-0.04860355"
+       height="1.0972071">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.42995752"
+         id="feGaussianBlur18494" />
+    </filter>
+    <linearGradient
+       gradientTransform="translate(-82.68732,-0.17665003)"
+       inkscape:collect="always"
+       xlink:href="#linearGradient12587-6"
+       id="linearGradient12593-3"
+       x1="363.08881"
+       y1="538.68573"
+       x2="365.21747"
+       y2="540.84064"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient12587-6">
+      <stop
+         style="stop-color:#6daa34;stop-opacity:1"
+         offset="0"
+         id="stop12589-7" />
+      <stop
+         id="stop13669-5"
+         offset="0.5"
+         style="stop-color:#87c74a;stop-opacity:1" />
+      <stop
+         style="stop-color:#6daa34;stop-opacity:1"
+         offset="1"
+         id="stop12591-3" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="90.56781"
+     inkscape:cx="-3.2355931"
+     inkscape:cy="13.088268"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-grids="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8277">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-276.85299,-520.68522)">
+    <g
+       id="g18446"
+       transform="translate(-80.972697,-31.419635)"
+       style="opacity:0.5;filter:url(#filter18492)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path18369"
+         d="m 363.68784,568.4473 -5.08846,5.03989 c -0.0998,0.0989 -0.11276,0.3176 -0.0177,0.42101 l 1.80326,1.96183 c 0.095,0.10341 0.32123,0.11658 0.42097,0.0177 l 5.08846,-5.0399 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.99607843"
+         sodipodi:nodetypes="csssscc" />
+      <circle
+         transform="matrix(-0.16007054,0.98710558,-0.98710558,-0.16007054,0,0)"
+         cx="496.39133"
+         cy="-457.18619"
+         r="8.4484291"
+         id="circle18383"
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path4717-0-5"
+       d="m 283.52763,535.28367 -5.08846,5.03989 c -0.0998,0.0989 -0.11276,0.3176 -0.0177,0.42102 l 0.90163,0.98091 0.90162,0.98091 c 0.095,0.10341 0.32124,0.11658 0.42098,0.0177 l 5.08846,-5.0399 -1.10326,-1.20027 z"
+       style="fill:url(#linearGradient12593-3);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="csscssccc" />
+    <g
+       id="g18291"
+       transform="matrix(0.91094965,0,0,0.91094965,-62.437764,50.321472)">
+      <g
+         id="g4751-3"
+         clip-path="url(#clipPath4782-7-2)"
+         transform="matrix(-0.40789887,0.26719843,-0.26719843,-0.40789887,540.73338,515.16801)">
+        <path
+           id="path4532-9"
+           style="fill:#ffffff;stroke:#868789;stroke-width:1.4453578;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+           d="m 276.3071,132.25651 a 21.406287,18.906167 0 0 1 21.40628,18.90617 21.406287,18.906167 0 1 1 -21.40628,-18.90617 z"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         id="g4449-8"
+         transform="matrix(-0.02114565,0.13039867,-0.13039867,-0.02114565,432.9912,502.16397)">
+        <circle
+           cx="242.94168"
+           cy="308.38486"
+           r="70.205605"
+           id="path4138-5"
+           style="opacity:1;fill:url(#linearGradient4146-6-8);fill-opacity:1;stroke:#505050;stroke-width:12.46485138;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4138-7-0-6"
+           d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+           style="opacity:1;fill:#ffffff;fill-opacity:0.42452829;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4238-9-3)" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4138-7-1"
+           d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+           style="opacity:1;fill:url(#linearGradient4204-9-1);fill-opacity:1;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4254-1-3)" />
+      </g>
+    </g>
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:1.00000048;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 292.35297,534.18549 2,0 0,-2"
+       id="path8218"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0"
+       id="path8220"
+       d="m 292.35297,535.18549 3,0 0,-3"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0"
+       id="path8224"
+       d="m 292.35297,527.18548 2,0 0,2"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:1.00000048;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 292.35297,526.18548 3,0 0,3"
+       id="path8226"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0"
+       id="path8212"
+       d="m 289.35297,534.18549 -2,0 0,-2"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:1.00000048;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 289.35297,535.18549 -3,0 0,-3"
+       id="path8214"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:1.00000048;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
+       d="m 287.35297,529.18548 0,-2 2,0"
+       id="path8248"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0"
+       id="path8204"
+       d="m 286.35297,529.18548 0,-3 3,0"
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_zoom_in-24.svg b/pixmaps/src/gwy_zoom_in-24.svg
new file mode 100644
index 0000000..5f9562d
--- /dev/null
+++ b/pixmaps/src/gwy_zoom_in-24.svg
@@ -0,0 +1,271 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8272"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_zoom_in-24.svg">
+  <defs
+     id="defs8274">
+    <linearGradient
+       id="linearGradient4270">
+      <stop
+         style="stop-color:#3c98f4;stop-opacity:0.12156863"
+         offset="0"
+         id="stop4272" />
+      <stop
+         style="stop-color:#f1f5fb;stop-opacity:0.12156863"
+         offset="1"
+         id="stop4274" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4198">
+      <stop
+         id="stop4200-0"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0.39215687" />
+      <stop
+         id="stop4202"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0.3137255" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4782-7-2">
+      <circle
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="circle4784-1-2"
+         cx="276.29214"
+         cy="151.18121"
+         r="19.066629" />
+    </clipPath>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       id="linearGradient4146-6-8"
+       xlink:href="#linearGradient4270" />
+    <filter
+       height="1.1263148"
+       y="-0.063157417"
+       width="1.1142865"
+       x="-0.057143249"
+       id="filter4238-9-3"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4240-4-6"
+         stdDeviation="2.4600469" />
+    </filter>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="312.29819"
+       x2="227.00648"
+       y1="288.19104"
+       x1="214.93521"
+       id="linearGradient4204-9-1"
+       xlink:href="#linearGradient4198" />
+    <filter
+       height="1.025263"
+       y="-0.012631484"
+       width="1.0228573"
+       x="-0.011428649"
+       id="filter4254-1-3"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4256-7-1"
+         stdDeviation="0.49200938" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter18492"
+       x="-0.047411256"
+       width="1.0948225"
+       y="-0.04860355"
+       height="1.0972071">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.42995752"
+         id="feGaussianBlur18494" />
+    </filter>
+    <linearGradient
+       gradientTransform="translate(-82.68732,-0.17665003)"
+       inkscape:collect="always"
+       xlink:href="#linearGradient12587-6"
+       id="linearGradient12593-3"
+       x1="363.08881"
+       y1="538.68573"
+       x2="365.21747"
+       y2="540.84064"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient12587-6">
+      <stop
+         style="stop-color:#6daa34;stop-opacity:1"
+         offset="0"
+         id="stop12589-7" />
+      <stop
+         id="stop13669-5"
+         offset="0.5"
+         style="stop-color:#87c74a;stop-opacity:1" />
+      <stop
+         style="stop-color:#6daa34;stop-opacity:1"
+         offset="1"
+         id="stop12591-3" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="64.041113"
+     inkscape:cx="-0.59400989"
+     inkscape:cy="15.694226"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     showguides="false">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8277">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-276.85299,-520.68522)">
+    <g
+       id="g18446"
+       transform="translate(-80.972697,-31.419635)"
+       style="opacity:0.5;filter:url(#filter18492)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path18369"
+         d="m 363.68784,568.4473 -5.08846,5.03989 c -0.0998,0.0989 -0.11276,0.3176 -0.0177,0.42101 l 1.80326,1.96183 c 0.095,0.10341 0.32123,0.11658 0.42097,0.0177 l 5.08846,-5.0399 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.99607843"
+         sodipodi:nodetypes="csssscc" />
+      <circle
+         transform="matrix(-0.16007054,0.98710558,-0.98710558,-0.16007054,0,0)"
+         cx="496.39133"
+         cy="-457.18619"
+         r="8.4484291"
+         id="circle18383"
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path4717-0-5"
+       d="m 283.52763,535.28367 -5.08846,5.03989 c -0.0998,0.0989 -0.11276,0.3176 -0.0177,0.42102 l 0.90163,0.98091 0.90162,0.98091 c 0.095,0.10341 0.32124,0.11658 0.42098,0.0177 l 5.08846,-5.0399 -1.10326,-1.20027 z"
+       style="fill:url(#linearGradient12593-3);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="csscssccc" />
+    <g
+       id="g18291"
+       transform="matrix(0.91094965,0,0,0.91094965,-62.437764,50.321472)">
+      <g
+         id="g4751-3"
+         clip-path="url(#clipPath4782-7-2)"
+         transform="matrix(-0.40789887,0.26719843,-0.26719843,-0.40789887,540.73338,515.16801)">
+        <path
+           id="path4532-9"
+           style="fill:#ffffff;stroke:#868789;stroke-width:1.4453578;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+           d="m 276.3071,132.25651 a 21.406287,18.906167 0 0 1 21.40628,18.90617 21.406287,18.906167 0 1 1 -21.40628,-18.90617 z"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         id="g4449-8"
+         transform="matrix(-0.02114565,0.13039867,-0.13039867,-0.02114565,432.9912,502.16397)">
+        <circle
+           cx="242.94168"
+           cy="308.38486"
+           r="70.205605"
+           id="path4138-5"
+           style="opacity:1;fill:url(#linearGradient4146-6-8);fill-opacity:1;stroke:#505050;stroke-width:12.46485138;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4138-7-0-6"
+           d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+           style="opacity:1;fill:#ffffff;fill-opacity:0.42452829;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4238-9-3)" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4138-7-1"
+           d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+           style="opacity:1;fill:url(#linearGradient4204-9-1);fill-opacity:1;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4254-1-3)" />
+      </g>
+    </g>
+    <g
+       id="g8108">
+      <path
+         sodipodi:nodetypes="cc"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 294.85297,530.18549 -8.00001,0"
+         id="path8234"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path8115"
+         d="m 294.85297,531.18549 -8.00001,0"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <g
+       id="g8112"
+       transform="matrix(0,1,-1,0,821.53845,239.83252)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8114"
+         d="m 294.85297,530.18549 -8.00001,0"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 294.85297,531.18549 -8.00001,0"
+         id="path8116"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cc" />
+    </g>
+  </g>
+</svg>
diff --git a/pixmaps/src/gwy_zoom_out-24.svg b/pixmaps/src/gwy_zoom_out-24.svg
new file mode 100644
index 0000000..423ab93
--- /dev/null
+++ b/pixmaps/src/gwy_zoom_out-24.svg
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg8272"
+   version="1.1"
+   inkscape:version="0.92.1 r15371"
+   sodipodi:docname="gwy_zoom_out-24.svg">
+  <defs
+     id="defs8274">
+    <linearGradient
+       id="linearGradient4270">
+      <stop
+         style="stop-color:#3c98f4;stop-opacity:0.12156863"
+         offset="0"
+         id="stop4272" />
+      <stop
+         style="stop-color:#f1f5fb;stop-opacity:0.12156863"
+         offset="1"
+         id="stop4274" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4198">
+      <stop
+         id="stop4200-0"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0.39215687" />
+      <stop
+         id="stop4202"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0.3137255" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4782-7-2">
+      <circle
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="circle4784-1-2"
+         cx="276.29214"
+         cy="151.18121"
+         r="19.066629" />
+    </clipPath>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="361.22473"
+       x2="272.91217"
+       y1="247.92804"
+       x1="207.50029"
+       id="linearGradient4146-6-8"
+       xlink:href="#linearGradient4270" />
+    <filter
+       height="1.1263148"
+       y="-0.063157417"
+       width="1.1142865"
+       x="-0.057143249"
+       id="filter4238-9-3"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4240-4-6"
+         stdDeviation="2.4600469" />
+    </filter>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="312.29819"
+       x2="227.00648"
+       y1="288.19104"
+       x1="214.93521"
+       id="linearGradient4204-9-1"
+       xlink:href="#linearGradient4198" />
+    <filter
+       height="1.025263"
+       y="-0.012631484"
+       width="1.0228573"
+       x="-0.011428649"
+       id="filter4254-1-3"
+       style="color-interpolation-filters:sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4256-7-1"
+         stdDeviation="0.49200938" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       style="color-interpolation-filters:sRGB"
+       id="filter18492"
+       x="-0.047411256"
+       width="1.0948225"
+       y="-0.04860355"
+       height="1.0972071">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.42995752"
+         id="feGaussianBlur18494" />
+    </filter>
+    <linearGradient
+       gradientTransform="translate(-82.68732,-0.17665003)"
+       inkscape:collect="always"
+       xlink:href="#linearGradient12587-6"
+       id="linearGradient12593-3"
+       x1="363.08881"
+       y1="538.68573"
+       x2="365.21747"
+       y2="540.84064"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient12587-6">
+      <stop
+         style="stop-color:#6daa34;stop-opacity:1"
+         offset="0"
+         id="stop12589-7" />
+      <stop
+         id="stop13669-5"
+         offset="0.5"
+         style="stop-color:#87c74a;stop-opacity:1" />
+      <stop
+         style="stop-color:#6daa34;stop-opacity:1"
+         offset="1"
+         id="stop12591-3" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="93.824886"
+     inkscape:cx="-0.67246337"
+     inkscape:cy="12.327098"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+                        <inkscape:grid
+                       type="xygrid"
+                       id="grid1px"
+                       originx="0"
+                       originy="0"
+                       dotted="false"
+                       snapvisiblegridlinesonly="false"
+                       spacingx="1.0"
+                       spacingy="1.0"
+                       enabled="true"
+                       visible="true" />
+                         </sodipodi:namedview>
+  <metadata
+     id="metadata8277">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-276.85299,-520.68522)">
+    <g
+       id="g18446"
+       transform="translate(-80.972697,-31.419635)"
+       style="opacity:0.5;filter:url(#filter18492)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path18369"
+         d="m 363.68784,568.4473 -5.08846,5.03989 c -0.0998,0.0989 -0.11276,0.3176 -0.0177,0.42101 l 1.80326,1.96183 c 0.095,0.10341 0.32123,0.11658 0.42097,0.0177 l 5.08846,-5.0399 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.99607843"
+         sodipodi:nodetypes="csssscc" />
+      <circle
+         transform="matrix(-0.16007054,0.98710558,-0.98710558,-0.16007054,0,0)"
+         cx="496.39133"
+         cy="-457.18619"
+         r="8.4484291"
+         id="circle18383"
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path4717-0-5"
+       d="m 283.52763,535.28367 -5.08846,5.03989 c -0.0998,0.0989 -0.11276,0.3176 -0.0177,0.42102 l 0.90163,0.98091 0.90162,0.98091 c 0.095,0.10341 0.32124,0.11658 0.42098,0.0177 l 5.08846,-5.0399 -1.10326,-1.20027 z"
+       style="fill:url(#linearGradient12593-3);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="csscssccc" />
+    <g
+       id="g18291"
+       transform="matrix(0.91094965,0,0,0.91094965,-62.437764,50.321472)">
+      <g
+         id="g4751-3"
+         clip-path="url(#clipPath4782-7-2)"
+         transform="matrix(-0.40789887,0.26719843,-0.26719843,-0.40789887,540.73338,515.16801)">
+        <path
+           id="path4532-9"
+           style="fill:#ffffff;stroke:#868789;stroke-width:1.4453578;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+           d="m 276.3071,132.25651 a 21.406287,18.906167 0 0 1 21.40628,18.90617 21.406287,18.906167 0 1 1 -21.40628,-18.90617 z"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         id="g4449-8"
+         transform="matrix(-0.02114565,0.13039867,-0.13039867,-0.02114565,432.9912,502.16397)">
+        <circle
+           cx="242.94168"
+           cy="308.38486"
+           r="70.205605"
+           id="path4138-5"
+           style="opacity:1;fill:url(#linearGradient4146-6-8);fill-opacity:1;stroke:#505050;stroke-width:12.46485138;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4138-7-0-6"
+           d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+           style="opacity:1;fill:#ffffff;fill-opacity:0.42452829;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4238-9-3)" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4138-7-1"
+           d="m 228.98386,281.59914 c -19.82968,23.31175 -33.58074,74.72281 -44.4409,50.95241 -3.08421,-7.44468 -4.78632,-15.60691 -4.78632,-24.16669 0,-34.89614 28.2889,-63.18505 63.18504,-63.18505 13.77337,0 26.51744,4.40699 36.89904,11.88781 15.92115,11.47255 -31.02718,1.19977 -50.85686,24.51152 z"
+           style="opacity:1;fill:url(#linearGradient4204-9-1);fill-opacity:1;stroke:none;stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4254-1-3)" />
+      </g>
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path8234"
+       d="m 294.85297,530.18549 -8.00001,0"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 294.85297,531.18549 -8.00001,0"
+       id="path8115"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>
diff --git a/plugins/Makefile.in b/plugins/Makefile.in
index 344ec9f..ce287ea 100644
--- a/plugins/Makefile.in
+++ b/plugins/Makefile.in
@@ -229,10 +229,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -242,6 +239,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -266,7 +265,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -324,6 +325,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -332,17 +334,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/plugins/file/Makefile.in b/plugins/file/Makefile.in
index 489884f..2cceb85 100644
--- a/plugins/file/Makefile.in
+++ b/plugins/file/Makefile.in
@@ -220,10 +220,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -233,6 +230,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -257,7 +256,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -315,6 +316,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -323,17 +325,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/plugins/process/Makefile.in b/plugins/process/Makefile.in
index 70d7e5c..1561dda 100644
--- a/plugins/process/Makefile.in
+++ b/plugins/process/Makefile.in
@@ -232,10 +232,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -245,6 +242,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -269,7 +268,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -327,6 +328,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -335,17 +337,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/po/LINGUAS b/po/LINGUAS
index 26dc04a..a9bda5c 100644
--- a/po/LINGUAS
+++ b/po/LINGUAS
@@ -1,5 +1,5 @@
 # Set of available languages.
 # The following generated part is updated by running utils/update-langs.py
 # @@@ GENERATED LANG LINGUAS BEGIN @@@
-cs de en_GB fr it ko ru es
+cs de en_GB fr it ko pt_BR ru es
 # @@@ GENERATED LANG LINGUAS END @@@
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 664569c..2a89315 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -91,6 +91,7 @@ modules/file/burleigh_exp.c
 modules/file/codevfile.c
 modules/file/createc.c
 modules/file/csmfile.c
+modules/file/dektakvca.c
 modules/file/dektakxml.c
 modules/file/dimensionfile.c
 modules/file/dm3file.c
@@ -199,6 +200,7 @@ modules/file/wsffile.c
 modules/file/wsxmfile.c
 modules/file/xyzexport.c
 modules/file/zeiss.c
+modules/file/zeisslsm.c
 modules/file/zemax.c
 modules/graph/graph_align.c
 modules/graph/graph_cd.c
@@ -213,6 +215,7 @@ modules/graph/graph_fit.c
 modules/graph/graph_level.c
 modules/graph/graph_logscale.c
 modules/graph/graph_peaks.c
+modules/graph/graph_stats.c
 modules/layer/axis.c
 modules/layer/ellipse.c
 modules/layer/lattice.c
@@ -259,6 +262,7 @@ modules/process/fft_filter_1d.c
 modules/process/fft_filter_2d.c
 modules/process/fft_profile.c
 modules/process/fft_synth.c
+modules/process/fibre_synth.c
 modules/process/fit-shape.c
 modules/process/flatten_base.c
 modules/process/fraccor.c
@@ -289,12 +293,18 @@ modules/process/mark_with.c
 modules/process/mask_distribute.c
 modules/process/mask_edt.c
 modules/process/mask_morph.c
+modules/process/mask_noisify.c
 modules/process/maskcor.c
 modules/process/maskops.c
 modules/process/mcrop.c
 modules/process/measure_lattice.c
 modules/process/median-bg.c
 modules/process/merge.c
+modules/process/mfm_current.c
+modules/process/mfm_field.c
+modules/process/mfm_findshift.c
+modules/process/mfm_parallel.c
+modules/process/mfm_shift.c
 modules/process/nanoindent_adjust.c
 modules/process/neural.c
 modules/process/noise_synth.c
@@ -302,11 +312,15 @@ modules/process/obj_synth.c
 modules/process/otsu_threshold.c
 modules/process/outliers.c
 modules/process/pat_synth.c
+modules/process/phase_synth.c
 modules/process/pid.c
 modules/process/polydistort.c
 modules/process/polylevel.c
 modules/process/presentationops.c
+modules/process/preview.h
 modules/process/psdf_logphi.c
+modules/process/psf-fit.c
+modules/process/psf.c
 modules/process/rank.c
 modules/process/rotate.c
 modules/process/scale.c
@@ -315,6 +329,7 @@ modules/process/semsim.c
 modules/process/shade.c
 modules/process/slope_dist.c
 modules/process/sphere-revolve.c
+modules/process/stitch.c
 modules/process/straighten_path.c
 modules/process/superresolution.c
 modules/process/synth.h
@@ -358,7 +373,9 @@ modules/volume/volume_kmeans.c
 modules/volume/volume_kmedians.c
 modules/volume/volume_linestat.c
 modules/volume/volume_slice.c
+modules/volume/volume_swaxes.c
 modules/volume/volume_zcal.c
+modules/volume/volumeops.c
 modules/xyz/xyz_drift.c
 modules/xyz/xyz_level.c
 modules/xyz/xyz_raster.c
diff --git a/po/cs.gmo b/po/cs.gmo
index 525ca10..a936ac0 100644
Binary files a/po/cs.gmo and b/po/cs.gmo differ
diff --git a/po/cs.po b/po/cs.po
index e3be73d..a163934 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -1,10 +1,10 @@
-# @(#) $Id: cs.po 19260 2016-11-15 08:44:28Z yeti-dn $
+# @(#) $Id: cs.po 20265 2017-08-13 15:11:01Z yeti-dn $
 msgid ""
 msgstr ""
 "Project-Id-Version: Gwyddion\n"
 "Report-Msgid-Bugs-To: yeti at gwyddion.net\n"
-"POT-Creation-Date: 2016-11-18 11:05+0100\n"
-"PO-Revision-Date: 2016-11-15 09:44+0100\n"
+"POT-Creation-Date: 2017-08-15 17:48+0200\n"
+"PO-Revision-Date: 2017-08-13 17:10+0200\n"
 "Last-Translator: Yeti <yeti at gwyddion.net>\n"
 "Language-Team: Czech\n"
 "Language: cs\n"
@@ -124,7 +124,8 @@ msgstr "kontaktní: Hertz (paraboloid)"
 #: app/data-browser-aux.c:1480 app/data-browser.c:2280 app/data-browser.c:2887
 #: app/data-browser.c:3707 app/data-browser.c:3857 app/data-browser.c:4139
 #: app/data-browser.c:4504 app/data-browser.c:4590 app/data-browser.c:5016
-#: app/resource-editor.c:366 modules/process/convolution_filter.c:691
+#: app/resource-editor.c:366 modules/file/xyzexport.c:214
+#: modules/process/convolution_filter.c:691
 msgid "Untitled"
 msgstr "Nepojmenovaný"
 
@@ -132,97 +133,105 @@ msgstr "Nepojmenovaný"
 msgid "Initial residua evaluation..."
 msgstr "Počáteční výpočet residua..."
 
-#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1632
+#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1646
 msgid "Fitting..."
 msgstr "Fitruji..."
 
-#: libgwyddion/gwynlfitpreset.c:1442 libprocess/gwyprocessenums.c:101
-#: libprocess/gwyshapefitpreset.c:347
+#: libgwyddion/gwynlfitpreset.c:1549 libprocess/gwyprocessenums.c:101
+#: libprocess/gwyshapefitpreset.c:347 modules/process/psf-fit.c:157
 msgid "Gaussian"
 msgstr "Gaussovka"
 
-#: libgwyddion/gwynlfitpreset.c:1457
+#: libgwyddion/gwynlfitpreset.c:1564
 msgid "Gaussian (PSDF)"
 msgstr "Gaussovka (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1470
+#: libgwyddion/gwynlfitpreset.c:1577
 msgid "Gaussian (ACF)"
 msgstr "Gaussovka (ACF)"
 
-#: libgwyddion/gwynlfitpreset.c:1483
+#: libgwyddion/gwynlfitpreset.c:1590
 msgid "Gaussian (HHCF)"
 msgstr "Gaussovka (HHCF)"
 
-#: libgwyddion/gwynlfitpreset.c:1496
+#: libgwyddion/gwynlfitpreset.c:1603
 msgid "Gaussian (RPSDF)"
 msgstr "Gaussovka (RPSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1509
+#: libgwyddion/gwynlfitpreset.c:1616
 msgid "Two Gaussians (PSDF)"
 msgstr "Dvě gaussovky (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1524 modules/xyz/xyz_drift.c:841
-#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1819
+#: libgwyddion/gwynlfitpreset.c:1631 modules/xyz/xyz_drift.c:841
+#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1818
 msgid "Exponential"
 msgstr "Exponenciála"
 
-#: libgwyddion/gwynlfitpreset.c:1536
+#: libgwyddion/gwynlfitpreset.c:1643
 msgid "Exponential (PSDF)"
 msgstr "Exponenciála (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1549
+#: libgwyddion/gwynlfitpreset.c:1656
 msgid "Exponential (ACF)"
 msgstr "Exponenciála (ACF)"
 
-#: libgwyddion/gwynlfitpreset.c:1561
+#: libgwyddion/gwynlfitpreset.c:1668
 msgid "Exponential (HHCF)"
 msgstr "Exponenciála (HHCF)"
 
-#: libgwyddion/gwynlfitpreset.c:1574
+#: libgwyddion/gwynlfitpreset.c:1681
 msgid "Exponential (RPSDF)"
 msgstr "Exponenciála (RPSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1588
+#: libgwyddion/gwynlfitpreset.c:1695
+msgid "K-correlated (PSDF)"
+msgstr "K-korelovaná (PSDF)"
+
+#: libgwyddion/gwynlfitpreset.c:1709
 msgid "Polynomial (order 0)"
 msgstr "Polynom (stupeň 0)"
 
-#: libgwyddion/gwynlfitpreset.c:1599 modules/xyz/xyz_drift.c:1805
+#: libgwyddion/gwynlfitpreset.c:1720 modules/xyz/xyz_drift.c:1804
 msgid "Polynomial (order 1)"
 msgstr "Polynom (stupeň 1)"
 
-#: libgwyddion/gwynlfitpreset.c:1610
+#: libgwyddion/gwynlfitpreset.c:1731
 msgid "Polynomial (order 2)"
 msgstr "Polynom (stupeň 2)"
 
-#: libgwyddion/gwynlfitpreset.c:1622
+#: libgwyddion/gwynlfitpreset.c:1743
 msgid "Polynomial (order 3)"
 msgstr "Polynom (stupeň 3)"
 
-#: libgwyddion/gwynlfitpreset.c:1635
+#: libgwyddion/gwynlfitpreset.c:1756
 msgid "Square wave"
 msgstr "Obdélníková vlna"
 
-#: libgwyddion/gwynlfitpreset.c:1651
+#: libgwyddion/gwynlfitpreset.c:1772
 msgid "Parabolic step"
 msgstr "Parabolický schod"
 
-#: libgwyddion/gwynlfitpreset.c:1667
+#: libgwyddion/gwynlfitpreset.c:1788
 msgid "Smooth slanted step"
 msgstr "Hladký šikmý schod"
 
-#: libgwyddion/gwynlfitpreset.c:1684
+#: libgwyddion/gwynlfitpreset.c:1805
 msgid "Smooth bent step"
 msgstr "Hladký ohnutý schod"
 
-#: libgwyddion/gwynlfitpreset.c:1700
+#: libgwyddion/gwynlfitpreset.c:1821
+msgid "Boltzmann bent step"
+msgstr "Ohnutý Boltzmannův schod"
+
+#: libgwyddion/gwynlfitpreset.c:1837
 msgid "Power"
 msgstr "Mocnina"
 
-#: libgwyddion/gwynlfitpreset.c:1712 libprocess/gwyshapefitpreset.c:348
+#: libgwyddion/gwynlfitpreset.c:1849 libprocess/gwyshapefitpreset.c:348
 msgid "Lorentzian"
 msgstr "Lorentzovka"
 
-#: libgwyddion/gwynlfitpreset.c:1726
+#: libgwyddion/gwynlfitpreset.c:1863
 msgid "Sinc"
 msgstr "Sinc"
 
@@ -243,7 +252,7 @@ msgid "Step height (positive)"
 msgstr "Výška schodu (kladného)"
 
 #: libprocess/cdline.c:590 libprocess/cdline.c:599
-#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:170
+#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:163
 msgid "Line"
 msgstr "Čára"
 
@@ -256,7 +265,7 @@ msgid "Circle (down)"
 msgstr "Kružnice (dolní část)"
 
 #: libprocess/cdline.c:608 libprocess/cdline.c:617
-#: libgwydgets/gwygraphareadialog.c:557 modules/process/hough.c:171
+#: libgwydgets/gwygraphareadialog.c:550 modules/process/hough.c:164
 msgid "Circle"
 msgstr "Kružnice"
 
@@ -264,237 +273,237 @@ msgstr "Kružnice"
 msgid "Circle (up)"
 msgstr "Kružnice (horní část)"
 
-#: libprocess/gwygrainvalue.c:64
+#: libprocess/gwygrainvalue.c:62
 msgid "Grain number"
 msgstr "Číslo zrna"
 
-#: libprocess/gwygrainvalue.c:73 modules/process/curvature.c:129
+#: libprocess/gwygrainvalue.c:71 modules/process/curvature.c:128
 msgid "Center x position"
 msgstr "X-ová poloha středu"
 
-#: libprocess/gwygrainvalue.c:82 modules/process/curvature.c:130
+#: libprocess/gwygrainvalue.c:80 modules/process/curvature.c:129
 msgid "Center y position"
 msgstr "Y-ová poloha středu"
 
-#: libprocess/gwygrainvalue.c:91
+#: libprocess/gwygrainvalue.c:89
 msgid "Minimum value"
 msgstr "Nejmenší hodnota"
 
-#: libprocess/gwygrainvalue.c:100
+#: libprocess/gwygrainvalue.c:98
 msgid "Maximum value"
 msgstr "Největší hodnota"
 
-#: libprocess/gwygrainvalue.c:109 modules/process/bdep_synth.c:133
-#: modules/tools/filter.c:237
+#: libprocess/gwygrainvalue.c:107 modules/process/bdep_synth.c:133
+#: modules/tools/filter.c:238
 msgid "Mean value"
 msgstr "Střední hodnota"
 
-#: libprocess/gwygrainvalue.c:118 modules/tools/filter.c:238
+#: libprocess/gwygrainvalue.c:116 modules/tools/filter.c:239
 msgid "Median value"
 msgstr "Medián"
 
-#: libprocess/gwygrainvalue.c:127
+#: libprocess/gwygrainvalue.c:125
 msgid "Minimum value on boundary"
 msgstr "Nejmenší hodnota na hranici"
 
-#: libprocess/gwygrainvalue.c:136
+#: libprocess/gwygrainvalue.c:134
 msgid "Maximum value on boundary"
 msgstr "Největší hodnota na hranici"
 
-#: libprocess/gwygrainvalue.c:145
+#: libprocess/gwygrainvalue.c:143
 msgid "Pixel area"
 msgstr "Plocha v pixelech"
 
-#: libprocess/gwygrainvalue.c:154
+#: libprocess/gwygrainvalue.c:152
 msgid "Projected area"
 msgstr "Projektovaná plocha"
 
-#: libprocess/gwygrainvalue.c:163
+#: libprocess/gwygrainvalue.c:161
 msgid "Surface area"
 msgstr "Plocha povrchu"
 
-#: libprocess/gwygrainvalue.c:172
+#: libprocess/gwygrainvalue.c:170
 msgid "Equivalent square side"
 msgstr "Strana ekvivalentního čtverce"
 
-#: libprocess/gwygrainvalue.c:181
+#: libprocess/gwygrainvalue.c:179
 msgid "Equivalent disc radius"
 msgstr "Poloměr ekvivalentního kruhu"
 
-#: libprocess/gwygrainvalue.c:190
+#: libprocess/gwygrainvalue.c:188
 msgid "Area above half-height"
 msgstr "Plocha nad poloviční výškou"
 
-#: libprocess/gwygrainvalue.c:199
+#: libprocess/gwygrainvalue.c:197
 msgid "Area of convex hull"
 msgstr "Plocha konvexního obalu"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to
 #. * zero.
-#: libprocess/gwygrainvalue.c:210
+#: libprocess/gwygrainvalue.c:208
 msgid "Zero basis volume"
 msgstr "Objem – nulová základna"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * grain minimum.
-#: libprocess/gwygrainvalue.c:221
+#: libprocess/gwygrainvalue.c:219
 msgid "Grain minimum basis volume"
 msgstr "Objem – základna minimum zrna"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * Laplacian background.
-#: libprocess/gwygrainvalue.c:232
+#: libprocess/gwygrainvalue.c:230
 msgid "Laplacian background basis volume"
 msgstr "Objem – základna laplaceovské pozadí"
 
-#: libprocess/gwygrainvalue.c:241
+#: libprocess/gwygrainvalue.c:239
 msgid "Projected boundary length"
 msgstr "Délka projektované hranice"
 
-#: libprocess/gwygrainvalue.c:250
+#: libprocess/gwygrainvalue.c:248
 msgid "Minimum bounding size"
 msgstr "Nejmenší omezující rozměr"
 
-#: libprocess/gwygrainvalue.c:259
+#: libprocess/gwygrainvalue.c:257
 msgid "Minimum bounding direction"
 msgstr "Směr největšího rozměru"
 
-#: libprocess/gwygrainvalue.c:268
+#: libprocess/gwygrainvalue.c:266
 msgid "Maximum bounding size"
 msgstr "Největší omezující rozměr"
 
-#: libprocess/gwygrainvalue.c:277
+#: libprocess/gwygrainvalue.c:275
 msgid "Maximum bounding direction"
 msgstr "Směr nejmenšího rozměru"
 
-#: libprocess/gwygrainvalue.c:286
+#: libprocess/gwygrainvalue.c:284
 msgid "Maximum inscribed disc radius"
 msgstr "Poloměr největšího vepsaného disku"
 
-#: libprocess/gwygrainvalue.c:295
+#: libprocess/gwygrainvalue.c:293
 msgid "Maximum inscribed disc center x position"
 msgstr "X-ová poloha středu největšího vepsaného disku"
 
-#: libprocess/gwygrainvalue.c:304
+#: libprocess/gwygrainvalue.c:302
 msgid "Maximum inscribed disc center y position"
 msgstr "Y-ová poloha středu největšího vepsaného disku"
 
-#: libprocess/gwygrainvalue.c:313
+#: libprocess/gwygrainvalue.c:311
 msgid "Minimum circumcircle radius"
 msgstr "Poloměr nejmenší opsané kružnice"
 
-#: libprocess/gwygrainvalue.c:322
+#: libprocess/gwygrainvalue.c:320
 msgid "Minimum circumcircle center x position"
 msgstr "X-ová poloha středu nejmenší opsané kružnice"
 
-#: libprocess/gwygrainvalue.c:331
+#: libprocess/gwygrainvalue.c:329
 msgid "Minimum circumcircle center y position"
 msgstr "Y-ová poloha středu nejmenší opsané kružnice"
 
-#: libprocess/gwygrainvalue.c:340
+#: libprocess/gwygrainvalue.c:338
 msgid "Mean radius"
 msgstr "Střední poloměr"
 
-#: libprocess/gwygrainvalue.c:349 modules/tools/readvalue.c:319
+#: libprocess/gwygrainvalue.c:347 modules/tools/readvalue.c:322
 msgid "Inclination θ"
 msgstr "θ sklonu"
 
-#: libprocess/gwygrainvalue.c:358 modules/tools/readvalue.c:329
+#: libprocess/gwygrainvalue.c:356 modules/tools/readvalue.c:332
 msgid "Inclination φ"
 msgstr "φ sklonu"
 
-#: libprocess/gwygrainvalue.c:367
+#: libprocess/gwygrainvalue.c:365
 msgid "Curvature center x position"
 msgstr "X-ová poloha středu křivosti"
 
-#: libprocess/gwygrainvalue.c:376
+#: libprocess/gwygrainvalue.c:374
 msgid "Curvature center y position"
 msgstr "Y-ová poloha středu křivosti"
 
-#: libprocess/gwygrainvalue.c:385
+#: libprocess/gwygrainvalue.c:383
 msgid "Curvature center z value"
 msgstr "Hodnota ve středu křivosti"
 
-#: libprocess/gwygrainvalue.c:394 modules/tools/readvalue.c:344
+#: libprocess/gwygrainvalue.c:392 modules/tools/readvalue.c:347
 msgid "Curvature 1"
 msgstr "Křivost 1"
 
-#: libprocess/gwygrainvalue.c:403 modules/tools/readvalue.c:354
+#: libprocess/gwygrainvalue.c:401 modules/tools/readvalue.c:357
 msgid "Curvature 2"
 msgstr "Křivost 2"
 
-#: libprocess/gwygrainvalue.c:412
+#: libprocess/gwygrainvalue.c:410
 msgid "Curvature angle 1"
 msgstr "Směr křivosti 1"
 
-#: libprocess/gwygrainvalue.c:421
+#: libprocess/gwygrainvalue.c:419
 msgid "Curvature angle 2"
 msgstr "Směr křivosti 2"
 
-#: libprocess/gwygrainvalue.c:430
+#: libprocess/gwygrainvalue.c:428
 msgid "Major semiaxis of equivalent ellipse"
 msgstr "Hlavní poloosa ekvivalentní elipsy"
 
-#: libprocess/gwygrainvalue.c:439
+#: libprocess/gwygrainvalue.c:437
 msgid "Minor semiaxis of equivalent ellipse"
 msgstr "Vedlejší poloosa ekvivalentní elipsy"
 
-#: libprocess/gwygrainvalue.c:448
+#: libprocess/gwygrainvalue.c:446
 msgid "Orientation of equivalent ellipse"
 msgstr "Orientace ekvivalentní elipsy"
 
-#: libprocess/gwygrainvalue.c:1120
+#: libprocess/gwygrainvalue.c:1118
 msgid "Id"
 msgstr "Id"
 
-#: libprocess/gwygrainvalue.c:1121 modules/graph/graph_peaks.c:156
-#: modules/process/extract_path.c:391 modules/process/wave_synth.c:482
-#: modules/tools/readvalue.c:251
+#: libprocess/gwygrainvalue.c:1119 modules/graph/graph_peaks.c:154
+#: modules/process/extract_path.c:391 modules/process/wave_synth.c:513
+#: modules/tools/readvalue.c:253
 msgid "Position"
 msgstr "Poloha"
 
-#: libprocess/gwygrainvalue.c:1122 app/meta.c:411 modules/file/imgexport.c:4625
-#: modules/process/curvature.c:762 modules/tools/level3.c:468
-#: modules/tools/readvalue.c:286
+#: libprocess/gwygrainvalue.c:1120 app/meta.c:411 modules/file/imgexport.c:4573
+#: modules/process/curvature.c:759 modules/tools/level3.c:475
+#: modules/tools/readvalue.c:290
 msgid "Value"
 msgstr "Hodnota"
 
-#: libprocess/gwygrainvalue.c:1123
+#: libprocess/gwygrainvalue.c:1121
 msgid "Area"
 msgstr "Plocha"
 
-#: libprocess/gwygrainvalue.c:1124 app/data-browser.c:5624 app/toolbox.c:110
+#: libprocess/gwygrainvalue.c:1122 app/data-browser.c:5624 app/toolbox.c:115
 msgid "Volume"
 msgstr "Objem"
 
-#: libprocess/gwygrainvalue.c:1125
+#: libprocess/gwygrainvalue.c:1123
 msgid "Boundary"
 msgstr "Hranice"
 
-#: libprocess/gwygrainvalue.c:1126 modules/process/pat_synth.c:829
-#: modules/process/pat_synth.c:1131 modules/process/pat_synth.c:1466
-#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:147
+#: libprocess/gwygrainvalue.c:1124 modules/process/pat_synth.c:830
+#: modules/process/pat_synth.c:1132 modules/process/pat_synth.c:1467
+#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:149
 msgid "Slope"
 msgstr "Sklon"
 
-#: libprocess/gwygrainvalue.c:1127 modules/process/curvature.c:213
-#: modules/process/curvature.c:613
+#: libprocess/gwygrainvalue.c:1125 modules/process/curvature.c:212
+#: modules/process/curvature.c:615
 msgid "Curvature"
 msgstr "Křivost"
 
-#: libprocess/gwygrainvalue.c:1128
+#: libprocess/gwygrainvalue.c:1126
 msgid "Moment"
 msgstr "Moment"
 
-#: libprocess/gwygrainvalue.c:1132
+#: libprocess/gwygrainvalue.c:1130
 msgid "User"
 msgstr "Uživatel"
 
-#: libprocess/gwyprocessenums.c:44
+#: libprocess/gwyprocessenums.c:44 modules/process/preview.h:263
 msgid "Union"
 msgstr "Sjednocení"
 
-#: libprocess/gwyprocessenums.c:45
+#: libprocess/gwyprocessenums.c:45 modules/process/preview.h:255
 msgid "Intersection"
 msgstr "Průnik"
 
@@ -573,13 +582,13 @@ msgid "Scale and space adaptive"
 msgstr "Frekvenčně a lokálně adaptabilní"
 
 #. TRANSLATORS: Interpolation type (AKA nearest neighbour)
-#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3791
-#: modules/xyz/xyz_raster.c:640
+#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3756
+#: modules/xyz/xyz_raster.c:609
 msgid "Round"
 msgstr "Zaokrouhlení"
 
-#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3792
-#: modules/xyz/xyz_raster.c:641
+#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3757
+#: modules/xyz/xyz_raster.c:610
 msgid "Linear"
 msgstr "Lineární"
 
@@ -667,27 +676,27 @@ msgstr "Použít pouze oblast pod maskou"
 msgid "Use entire image (ignore mask)"
 msgstr "Ignorovat masku (použít celá data)"
 
-#: libprocess/gwyprocessenums.c:602
+#: libprocess/gwyprocessenums.c:604
 msgid "distance|City-block"
 msgstr "Taxikářská"
 
-#: libprocess/gwyprocessenums.c:603
+#: libprocess/gwyprocessenums.c:605
 msgid "distance|Chess"
 msgstr "Šachovnicová"
 
-#: libprocess/gwyprocessenums.c:604
+#: libprocess/gwyprocessenums.c:606
 msgid "distance|Octagonal 4,8"
 msgstr "Oktagonální 4,8"
 
-#: libprocess/gwyprocessenums.c:605
+#: libprocess/gwyprocessenums.c:607
 msgid "distance|Octagonal 8,4"
 msgstr "Oktagonální 8,4"
 
-#: libprocess/gwyprocessenums.c:606
+#: libprocess/gwyprocessenums.c:608
 msgid "distance|Octagonal"
 msgstr "Oktagonální"
 
-#: libprocess/gwyprocessenums.c:607
+#: libprocess/gwyprocessenums.c:609
 msgid "distance|Euclidean"
 msgstr "Eukleidovská"
 
@@ -723,11 +732,11 @@ msgstr "Parabolický hrbol"
 msgid "Ring"
 msgstr "Prstenec"
 
-#: libprocess/morph_lib.c:169 libprocess/tip.c:1043
+#: libprocess/morph_lib.c:169 libprocess/tip.c:1052
 msgid "Dilation..."
 msgstr "Dilatace..."
 
-#: libprocess/morph_lib.c:235 libprocess/tip.c:1164
+#: libprocess/morph_lib.c:235 libprocess/tip.c:1173
 msgid "Erosion..."
 msgstr "Eroze..."
 
@@ -760,81 +769,81 @@ msgstr[0] "Bylo nalezeno %d lokální maximum"
 msgstr[1] "Byla nalezena %d lokální maxima"
 msgstr[2] "Bylo nalezeno %d lokálních maxim"
 
-#: libprocess/tip.c:422
+#: libprocess/tip.c:431
 msgid "Pyramid"
 msgstr "Pyramida"
 
-#: libprocess/tip.c:423 libprocess/tip.c:429 libprocess/tip.c:435
+#: libprocess/tip.c:432 libprocess/tip.c:438 libprocess/tip.c:444
 msgid "Pyramidal"
 msgstr "Pyramidální"
 
-#: libprocess/tip.c:428
+#: libprocess/tip.c:437
 msgid "Contact"
 msgstr "Kontaktní"
 
-#: libprocess/tip.c:434
+#: libprocess/tip.c:443
 msgid "Noncontact"
 msgstr "Bezkontaktní"
 
-#: libprocess/tip.c:440
+#: libprocess/tip.c:449
 msgid "Delta function"
 msgstr "Delta funkce"
 
-#: libprocess/tip.c:441
+#: libprocess/tip.c:450
 msgid "Analytical"
 msgstr "Analytický"
 
-#: libprocess/tip.c:446
+#: libprocess/tip.c:455 modules/process/fibre_synth.c:259
 msgid "Parabola"
 msgstr "Parabola"
 
-#: libprocess/tip.c:447 libprocess/tip.c:453
+#: libprocess/tip.c:456 libprocess/tip.c:462
 msgid "Symmetric"
 msgstr "Symetrický"
 
-#: libprocess/tip.c:452
+#: libprocess/tip.c:461
 msgid "Cone"
 msgstr "Kužel"
 
-#: libprocess/tip.c:458
+#: libprocess/tip.c:467
 msgid "Elliptical parabola"
 msgstr "Eliptická parabola"
 
-#: libprocess/tip.c:459
+#: libprocess/tip.c:468
 msgid "Asymmetric"
 msgstr "Asymetrický"
 
-#: libprocess/tip.c:1339 libprocess/tip.c:1367 libprocess/tip.c:1416
-#: libprocess/tip.c:1443
+#: libprocess/tip.c:1348 libprocess/tip.c:1376 libprocess/tip.c:1425
+#: libprocess/tip.c:1452
 msgid "Converting fields"
 msgstr "Konvertuji pole"
 
-#: libprocess/tip.c:1349
+#: libprocess/tip.c:1358
 msgid "Starting partial estimation"
 msgstr "Začínám částečný odhad"
 
-#: libprocess/tip.c:1426
+#: libprocess/tip.c:1435
 msgid "Starting full estimation"
 msgstr "Začínám plný odhad"
 
-#: libprocess/triangulation.c:2085 modules/process/calcoefs_view.c:793
+#: libprocess/triangulation.c:2084 modules/process/calcoefs_view.c:793
 #: modules/process/lat_synth.c:1178
 msgid "Triangulating..."
 msgstr "Trianguluji..."
 
-#: libgwydgets/gwy3dwindow.c:570
+#: libgwydgets/gwy3dwindow.c:575
 msgid "Rotate view (R)"
 msgstr "Otáčení pohledu (R)"
 
-#: libgwydgets/gwy3dwindow.c:575
+#: libgwydgets/gwy3dwindow.c:580
 msgid "Scale view as a whole (S)"
 msgstr "Škálování celého pohledu (S)"
 
-#: libgwydgets/gwy3dwindow.c:580
+#: libgwydgets/gwy3dwindow.c:585
 msgid "Scale value range (V)"
 msgstr "Škálování rozsahu hodnot (V)"
 
-#: libgwydgets/gwy3dwindow.c:585
+#: libgwydgets/gwy3dwindow.c:590
 msgid "Move light source (L)"
 msgstr "Posun zdroje světla (L)"
 
@@ -842,227 +851,286 @@ msgstr "Posun zdroje světla (L)"
 msgid "Show full controls"
 msgstr "Zobraz kompletní ovládací prvky"
 
-#: libgwydgets/gwy3dwindow.c:693
+#: libgwydgets/gwy3dwindow.c:691
 msgid "Hide full controls"
 msgstr "Skryj kompletní ovládací prvky"
 
-#: libgwydgets/gwy3dwindow.c:709 modules/file/imgexport.c:4796
-#: modules/process/fit-shape.c:461
+#: libgwydgets/gwy3dwindow.c:707 modules/file/imgexport.c:4745
+#: modules/process/fit-shape.c:462
 msgid "adjective|Basic"
 msgstr "Základní"
 
-#: libgwydgets/gwy3dwindow.c:714
+#: libgwydgets/gwy3dwindow.c:712
 msgid "Light & Material"
 msgstr "Světlo a materiál"
 
-#: libgwydgets/gwy3dwindow.c:719
+#: libgwydgets/gwy3dwindow.c:717
 msgid "Labels"
 msgstr "Popisky"
 
-#: libgwydgets/gwy3dwindow.c:828 modules/process/facet_analysis.c:331
-#: modules/process/facet_analysis.c:347 modules/process/shade.c:245
+#: libgwydgets/gwy3dwindow.c:722
+msgid "Colorbar"
+msgstr "Barevná škála"
+
+#: libgwydgets/gwy3dwindow.c:838 modules/process/facet_analysis.c:335
+#: modules/process/facet_analysis.c:351 modules/process/shade.c:253
 #: modules/process/tilt.c:223
 msgid "φ:"
 msgstr "φ:"
 
-#: libgwydgets/gwy3dwindow.c:828 libgwydgets/gwy3dwindow.c:834
-#: libgwydgets/gwy3dwindow.c:1032 libgwydgets/gwy3dwindow.c:1040
-#: modules/process/facet_analysis.c:375 modules/process/indent_analyze.c:460
-#: modules/process/rotate.c:264 modules/process/shade.c:237
-#: modules/process/shade.c:245 modules/process/tilt.c:211
-#: modules/process/tilt.c:223 modules/process/tip_model.c:234
-#: modules/process/tip_model.c:240 modules/process/unrotate.c:334
+#: libgwydgets/gwy3dwindow.c:838 libgwydgets/gwy3dwindow.c:843
+#: libgwydgets/gwy3dwindow.c:1013 libgwydgets/gwy3dwindow.c:1020
+#: modules/process/correct_affine.c:461 modules/process/facet_analysis.c:238
+#: modules/process/facet_analysis.c:370 modules/process/indent_analyze.c:438
+#: modules/process/measure_lattice.c:381 modules/process/rotate.c:264
+#: modules/process/shade.c:245 modules/process/shade.c:253
+#: modules/process/synth.h:379 modules/process/synth.h:410
+#: modules/process/tilt.c:211 modules/process/tilt.c:223
+#: modules/process/tip_model.c:234 modules/process/tip_model.c:240
+#: modules/process/unrotate.c:334 modules/tools/distance.c:197
+#: modules/tools/readvalue.c:223 modules/tools/stats.c:319
 msgid "deg"
 msgstr "stupňů"
 
-#: libgwydgets/gwy3dwindow.c:834 modules/process/facet_analysis.c:330
-#: modules/process/facet_analysis.c:346 modules/process/shade.c:237
+#: libgwydgets/gwy3dwindow.c:843 modules/process/facet_analysis.c:334
+#: modules/process/facet_analysis.c:350 modules/process/shade.c:245
 #: modules/process/tilt.c:211
 msgid "θ:"
 msgstr "θ:"
 
-#: libgwydgets/gwy3dwindow.c:839 modules/process/cwt.c:151
+#: libgwydgets/gwy3dwindow.c:849 modules/process/cwt.c:151
 msgid "_Scale:"
 msgstr "Š_kála:"
 
-#: libgwydgets/gwy3dwindow.c:846
+#: libgwydgets/gwy3dwindow.c:856
 msgid "_Value scale:"
 msgstr "Škála _hodnot:"
 
-#: libgwydgets/gwy3dwindow.c:851
+#: libgwydgets/gwy3dwindow.c:862
 msgid "Ph_ysical scale:"
 msgstr "Fyzické měřítko:"
 
-#: libgwydgets/gwy3dwindow.c:865
+#: libgwydgets/gwy3dwindow.c:876
 msgid "verb|Set"
 msgstr "Uložit"
 
-#: libgwydgets/gwy3dwindow.c:877
+#: libgwydgets/gwy3dwindow.c:886
 msgid "Line _width:"
 msgstr "Šíř_ka čáry:"
 
-#: libgwydgets/gwy3dwindow.c:881
+#: libgwydgets/gwy3dwindow.c:886 libgwydgets/gwy3dwindow.c:1194
+#: libgwydgets/gwy3dwindow.c:1204 libgwydgets/gwy3dwindow.c:1235
+#: libgwydgets/gwygraphareadialog.c:157 libgwydgets/gwygraphareadialog.c:173
+#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
+#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
+#: modules/process/angle_dist.c:188 modules/process/angle_dist.c:213
+#: modules/process/col_synth.c:486 modules/process/crosscor.c:252
+#: modules/process/crosscor.c:260 modules/process/crosscor.c:276
+#: modules/process/crosscor.c:284 modules/process/crosscor.c:300
+#: modules/process/crosscor.c:308 modules/process/cwt.c:151
+#: modules/process/dimensions.h:88 modules/process/edge.c:672
+#: modules/process/entropy.c:242 modules/process/extend.c:220
+#: modules/process/extend.c:227 modules/process/extend.c:234
+#: modules/process/extend.c:241 modules/process/facet_analysis.c:362
+#: modules/process/fbm_synth.c:383 modules/process/hough.c:203
+#: modules/process/local_contrast.c:146 modules/process/mark_disconn.c:263
+#: modules/process/mask_morph.c:237 modules/process/median-bg.c:209
+#: modules/process/neural.c:623 modules/process/neural.c:631
+#: modules/process/psdf_logphi.c:276 modules/process/rank.c:188
+#: modules/process/scale.c:237 modules/process/scale.c:246
+#: modules/process/scars.c:353 modules/process/scars.c:361
+#: modules/process/semsim.c:227 modules/process/slope_dist.c:365
+#: modules/process/slope_dist.c:393 modules/process/sphere-revolve.c:346
+#: modules/process/straighten_path.c:278 modules/process/synth.h:280
+#: modules/process/synth.h:501 modules/process/tip_blind.c:334
+#: modules/process/tip_blind.c:342 modules/process/volumize_layers.c:240
+#: modules/process/volumize_layers.c:245 modules/process/volumize_layers.c:250
+#: modules/process/wpour_mark.c:320 modules/tools/filter.c:291
+#: modules/tools/level3.c:244 modules/tools/maskedit.c:528
+#: modules/tools/maskedit.c:629 modules/tools/pathlevel.c:256
+#: modules/tools/profile.c:377 modules/tools/profile.c:503
+#: modules/tools/readvalue.c:222 modules/tools/readvalue.c:378
+#: modules/tools/roughness.c:868 modules/volume/volume_slice.c:446
+#: modules/volume/volume_slice.c:469 modules/volume/volume_slice.c:492
+#: modules/xyz/xyz_drift.c:738 modules/xyz/xyz_drift.c:753
+#: modules/xyz/xyz_raster.c:382 modules/xyz/xyz_raster.c:388
+msgid "px"
+msgstr "px"
+
+#: libgwydgets/gwy3dwindow.c:891
 msgid "Show _axes"
 msgstr "Zobrazuj _osy"
 
-#: libgwydgets/gwy3dwindow.c:890
+#: libgwydgets/gwy3dwindow.c:900
 msgid "Show _labels"
 msgstr "Zobrazuj _popisky"
 
-#: libgwydgets/gwy3dwindow.c:899
-msgid "Show false _colorbar"
-msgstr "Zobrazovat _barevnou škálu"
-
-#: libgwydgets/gwy3dwindow.c:908
+#: libgwydgets/gwy3dwindow.c:909
 msgid "_Orthographic projection"
 msgstr "_Ortografická projekce"
 
-#: libgwydgets/gwy3dwindow.c:917
+#: libgwydgets/gwy3dwindow.c:918
 msgid "_Hide masked"
 msgstr "_Skrýt maskovaná"
 
-#: libgwydgets/gwy3dwindow.c:933
+#: libgwydgets/gwy3dwindow.c:934
 msgid "_Lighting"
 msgstr "_Osvětlení"
 
-#: libgwydgets/gwy3dwindow.c:934
+#: libgwydgets/gwy3dwindow.c:935
 msgid "_Gradient"
 msgstr "_Gradient"
 
-#: libgwydgets/gwy3dwindow.c:935
+#: libgwydgets/gwy3dwindow.c:936
 msgid "_Overlay"
 msgstr "_Překrytí"
 
-#: libgwydgets/gwy3dwindow.c:936
+#: libgwydgets/gwy3dwindow.c:937
 msgid "_Overlay - no light"
 msgstr "_Překrytí, bez světla"
 
-#: libgwydgets/gwy3dwindow.c:1009
+#: libgwydgets/gwy3dwindow.c:992
 msgid "_Material:"
 msgstr "_Materiál:"
 
-#: libgwydgets/gwy3dwindow.c:1032
+#: libgwydgets/gwy3dwindow.c:1013
 msgid "_Light φ:"
 msgstr "φ _světla:"
 
-#: libgwydgets/gwy3dwindow.c:1040
+#: libgwydgets/gwy3dwindow.c:1020
 msgid "L_ight θ:"
 msgstr "θ s_větla:"
 
-#: libgwydgets/gwy3dwindow.c:1070 libgwydgets/gwy3dwindow.c:1240
-#: app/toolbox-editor.c:215 modules/file/hdrimage.cc:2213
-#: modules/file/imgexport.c:4760 modules/file/pixmap.c:789
+#: libgwydgets/gwy3dwindow.c:1052 libgwydgets/gwy3dwindow.c:1243
+#: app/toolbox-editor.c:216 modules/file/hdrimage.cc:2213
+#: modules/file/imgexport.c:4708 modules/file/pixmap.c:789
 #: modules/file/rawfile.c:424 modules/process/angle_dist.c:172
 #: modules/process/bdep_synth.c:341 modules/process/calcoefs_new.c:371
-#: modules/process/calibrate.c:391 modules/process/col_synth.c:392
-#: modules/process/correct_affine.c:301 modules/process/curvature.c:615
-#: modules/process/cwt.c:135 modules/process/deposit_synth.c:349
+#: modules/process/calibrate.c:383 modules/process/col_synth.c:392
+#: modules/process/correct_affine.c:346 modules/process/curvature.c:617
+#: modules/process/cwt.c:135 modules/process/deposit_synth.c:350
 #: modules/process/diff_synth.c:411 modules/process/domain_synth.c:354
 #: modules/process/drift.c:245 modules/process/dwt.c:166
 #: modules/process/dwtanisotropy.c:184 modules/process/edge.c:638
 #: modules/process/extend.c:192 modules/process/facet-level.c:193
-#: modules/process/facet_analysis.c:271 modules/process/fbm_synth.c:303
+#: modules/process/facet_analysis.c:275 modules/process/fbm_synth.c:303
 #: modules/process/fft.c:336 modules/process/fft_filter_2d.c:417
-#: modules/process/fft_synth.c:341 modules/process/fractal.c:231
-#: modules/process/grain_edge.c:213 modules/process/grain_mark.c:247
-#: modules/process/grain_wshed.c:167 modules/process/hough.c:179
-#: modules/process/lat_synth.c:567 modules/process/latsim.c:159
-#: modules/process/level.c:245 modules/process/linematch.c:804
-#: modules/process/lno_synth.c:433 modules/process/local_contrast.c:130
-#: modules/process/logistic.c:234 modules/process/mark_disconn.c:208
-#: modules/process/mask_distribute.c:152 modules/process/measure_lattice.c:256
-#: modules/process/median-bg.c:180 modules/process/noise_synth.c:336
-#: modules/process/obj_synth.c:441 modules/process/pat_synth.c:385
-#: modules/process/pid.c:199 modules/process/polydistort.c:210
-#: modules/process/polylevel.c:373 modules/process/psdf_logphi.c:249
-#: modules/process/rank.c:158 modules/process/rotate.c:243
-#: modules/process/scale.c:196 modules/process/scars.c:298
-#: modules/process/semsim.c:211 modules/process/shade.c:208
-#: modules/process/slope_dist.c:276 modules/process/sphere-revolve.c:218
-#: modules/process/straighten_path.c:249 modules/process/tilt.c:161
-#: modules/process/tip_model.c:169 modules/process/unrotate.c:220
-#: modules/process/volumize_layers.c:221 modules/process/wave_synth.c:349
-#: modules/process/wpour_mark.c:278 modules/volume/volume_calibrate.c:370
-#: modules/volume/volume_extract.c:331 modules/volume/volume_kmeans.c:153
-#: modules/volume/volume_kmedians.c:147 modules/volume/volume_linestat.c:292
-#: modules/volume/volume_slice.c:292
+#: modules/process/fft_synth.c:341 modules/process/fibre_synth.c:422
+#: modules/process/fractal.c:228 modules/process/grain_edge.c:212
+#: modules/process/grain_mark.c:246 modules/process/grain_wshed.c:168
+#: modules/process/hough.c:174 modules/process/lat_synth.c:567
+#: modules/process/latsim.c:159 modules/process/level.c:245
+#: modules/process/linematch.c:771 modules/process/lno_synth.c:431
+#: modules/process/local_contrast.c:130 modules/process/logistic.c:234
+#: modules/process/mark_disconn.c:208 modules/process/mask_distribute.c:152
+#: modules/process/measure_lattice.c:246 modules/process/median-bg.c:180
+#: modules/process/mfm_current.c:332 modules/process/mfm_field.c:281
+#: modules/process/mfm_findshift.c:230 modules/process/mfm_parallel.c:333
+#: modules/process/mfm_shift.c:170 modules/process/noise_synth.c:334
+#: modules/process/obj_synth.c:438 modules/process/pat_synth.c:385
+#: modules/process/phase_synth.c:205 modules/process/pid.c:197
+#: modules/process/polydistort.c:210 modules/process/polylevel.c:373
+#: modules/process/psdf_logphi.c:249 modules/process/rank.c:158
+#: modules/process/rotate.c:243 modules/process/scale.c:196
+#: modules/process/scars.c:317 modules/process/semsim.c:211
+#: modules/process/shade.c:210 modules/process/slope_dist.c:275
+#: modules/process/sphere-revolve.c:317 modules/process/straighten_path.c:248
+#: modules/process/tilt.c:161 modules/process/tip_model.c:167
+#: modules/process/unrotate.c:220 modules/process/volumize_layers.c:221
+#: modules/process/wave_synth.c:368 modules/process/wpour_mark.c:278
+#: modules/volume/volume_calibrate.c:370 modules/volume/volume_extract.c:324
+#: modules/volume/volume_kmeans.c:154 modules/volume/volume_kmedians.c:147
+#: modules/volume/volume_linestat.c:297 modules/volume/volume_slice.c:294
 msgid "_Reset"
 msgstr "_Obnovit"
 
-#: libgwydgets/gwy3dwindow.c:1142
+#: libgwydgets/gwy3dwindow.c:1141
 msgid "X-axis"
 msgstr "Osa X"
 
-#: libgwydgets/gwy3dwindow.c:1143
+#: libgwydgets/gwy3dwindow.c:1142
 msgid "Y-axis"
 msgstr "Osa Y"
 
-#: libgwydgets/gwy3dwindow.c:1144
+#: libgwydgets/gwy3dwindow.c:1143
 msgid "Minimum z value"
 msgstr "Nejmenší hodnota z"
 
-#: libgwydgets/gwy3dwindow.c:1145
+#: libgwydgets/gwy3dwindow.c:1144
 msgid "Maximum z value"
 msgstr "Největší hodnota z"
 
-#: libgwydgets/gwy3dwindow.c:1168 modules/file/imgexport.c:3836
+#: libgwydgets/gwy3dwindow.c:1167 modules/file/imgexport.c:3806
 msgid "_Label:"
 msgstr "Pop_isek:"
 
-#: libgwydgets/gwy3dwindow.c:1173
+#: libgwydgets/gwy3dwindow.c:1180
 msgid "_Text:"
 msgstr "_Text:"
 
-#: libgwydgets/gwy3dwindow.c:1193
+#: libgwydgets/gwy3dwindow.c:1185
 msgid "Move label"
 msgstr "Posuň popisek"
 
-#: libgwydgets/gwy3dwindow.c:1202
+#: libgwydgets/gwy3dwindow.c:1194
 msgid "_Horizontally:"
 msgstr "_Vodorovně:"
 
-#: libgwydgets/gwy3dwindow.c:1212
+#: libgwydgets/gwy3dwindow.c:1204
 msgid "_Vertically:"
 msgstr "_Svisle:"
 
-#: libgwydgets/gwy3dwindow.c:1220
+#: libgwydgets/gwy3dwindow.c:1212
+msgid "A_ll labels have the same size"
+msgstr "Všechn_y popisky jsou stejně velké"
+
+#: libgwydgets/gwy3dwindow.c:1223
 msgid "Scale size _automatically"
 msgstr "_Automaticky uprav velikost"
 
-#: libgwydgets/gwy3dwindow.c:1232 modules/tools/filter.c:290
+#: libgwydgets/gwy3dwindow.c:1235 modules/tools/filter.c:291
 msgid "Si_ze:"
 msgstr "Veli_kost:"
 
-#: libgwydgets/gwy3dwindow.c:1232 modules/process/cwt.c:151
-#: modules/process/hough.c:212
-msgid "pixels"
-msgstr "pixelů"
+#: libgwydgets/gwy3dwindow.c:1277
+msgid "Show false _colorbar"
+msgstr "Zobrazovat _barevnou škálu"
+
+#: libgwydgets/gwy3dwindow.c:1286
+msgid "Reserve space for _colorbar"
+msgstr "Ponechat prostor pro _barevnou škálu"
+
+#: libgwydgets/gwy3dwindow.c:1302 modules/process/lat_synth.c:651
+#: modules/process/obj_synth.c:542 modules/process/pat_synth.c:1458
+#: modules/process/phase_synth.c:279
+msgid "_Size:"
+msgstr "_Velikost:"
+
+#: libgwydgets/gwy3dwindow.c:1311
+msgid "_Vertical alignment:"
+msgstr "_Svislé zarování:"
 
-#: libgwydgets/gwy3dwindow.c:1726 libgwydgets/gwy3dwindow.c:1779
+#: libgwydgets/gwy3dwindow.c:1844 libgwydgets/gwy3dwindow.c:1897
 msgid "S_witch to Lighting Mode"
 msgstr "_Přepni na osvětlení"
 
-#: libgwydgets/gwy3dwindow.c:1734 libgwydgets/gwy3dwindow.c:1756
+#: libgwydgets/gwy3dwindow.c:1852 libgwydgets/gwy3dwindow.c:1874
 msgid "S_witch to Overlay Mode"
 msgstr "_Přepni na překrytí"
 
-#: libgwydgets/gwy3dwindow.c:1748 libgwydgets/gwy3dwindow.c:1771
+#: libgwydgets/gwy3dwindow.c:1866 libgwydgets/gwy3dwindow.c:1889
 msgid "S_witch to Color Gradient Mode"
 msgstr "_Přepni na barevný gradient"
 
-#: libgwydgets/gwy3dwindow.c:1787
+#: libgwydgets/gwy3dwindow.c:1905
 msgid "T_oggle light"
 msgstr "Př_epnout světlo"
 
-#: libgwydgets/gwyaxisdialog.c:99
+#: libgwydgets/gwyaxisdialog.c:75
 msgid "Axis Properties"
 msgstr "Vlastnosti osy"
 
-#: libgwydgets/gwyaxisdialog.c:101 libgwydgets/gwygraphlabeldialog.c:63
-msgid "Label Properties"
-msgstr "Vlastnosti popisku"
-
-#: libgwydgets/gwyaxisdialog.c:184
+#: libgwydgets/gwyaxisdialog.c:88
 msgid "Label Text"
 msgstr "Text popisku"
 
@@ -1084,7 +1152,7 @@ msgid "Hidden"
 msgstr "Skrytý"
 
 #: libgwydgets/gwydgetenums.c:47 libgwydgets/gwygraphwindowmeasuredialog.c:572
-#: modules/file/imgexport.c:475 modules/tools/selectionmanager.c:274
+#: modules/file/imgexport.c:474 modules/tools/selectionmanager.c:274
 msgid "Points"
 msgstr "Body"
 
@@ -1092,7 +1160,7 @@ msgstr "Body"
 msgid "Line + points"
 msgstr "Body + čára"
 
-#: libgwydgets/gwydgetutils.c:564
+#: libgwydgets/gwydgetutils.c:848
 msgid "Change Mask Color"
 msgstr "Změna barvy masky"
 
@@ -1101,7 +1169,7 @@ msgid "Quantity"
 msgstr "Veličina"
 
 #: libgwydgets/gwygrainvaluemenu.c:194 libgwydgets/gwygrainvaluemenu.c:207
-#: modules/process/curvature.c:753
+#: modules/process/curvature.c:750
 msgid "Symbol"
 msgstr "Symbol"
 
@@ -1121,137 +1189,141 @@ msgstr "_Předchozí"
 msgid "_Next"
 msgstr "_Následující"
 
-#: libgwydgets/gwygraphareadialog.c:127 modules/file/rawgraph.c:302
+#: libgwydgets/gwygraphareadialog.c:123 modules/file/rawgraph.c:302
 msgid "Plot _style:"
 msgstr "_Typ grafu:"
 
-#: libgwydgets/gwygraphareadialog.c:148
+#: libgwydgets/gwygraphareadialog.c:131
 msgid "Pl_ot color:"
 msgstr "_Barva"
 
-#: libgwydgets/gwygraphareadialog.c:159
+#: libgwydgets/gwygraphareadialog.c:151
 msgid "Point _type:"
 msgstr "T_yp bodu:"
 
-#: libgwydgets/gwygraphareadialog.c:165
+#: libgwydgets/gwygraphareadialog.c:157
 msgid "_Point size:"
 msgstr "_Velikost bodu:"
 
-#: libgwydgets/gwygraphareadialog.c:175
+#: libgwydgets/gwygraphareadialog.c:167
 msgid "_Line type:"
 msgstr "Typ čá_ry:"
 
-#: libgwydgets/gwygraphareadialog.c:181 modules/file/imgexport.c:3150
+#: libgwydgets/gwygraphareadialog.c:173 modules/file/imgexport.c:3154
 msgid "Line t_hickness:"
 msgstr "T_loušťka čáry:"
 
-#: libgwydgets/gwygraphareadialog.c:187
+#: libgwydgets/gwygraphareadialog.c:180
 msgid "<b>Label Te_xt</b>"
 msgstr "<b>Te_xt popisku</b>"
 
-#: libgwydgets/gwygraphareadialog.c:404
+#: libgwydgets/gwygraphareadialog.c:397
 msgid "Set Curve Color"
 msgstr "Nastavení barvy křivky"
 
-#: libgwydgets/gwygraphareadialog.c:556 modules/process/mask_morph.c:179
+#: libgwydgets/gwygraphareadialog.c:549 modules/process/mask_morph.c:178
 msgid "Square"
 msgstr "Čtverec"
 
-#: libgwydgets/gwygraphareadialog.c:558 modules/process/mask_morph.c:180
+#: libgwydgets/gwygraphareadialog.c:551 modules/process/mask_morph.c:179
 msgid "Diamond"
 msgstr "Kosočtverec"
 
-#: libgwydgets/gwygraphareadialog.c:559
+#: libgwydgets/gwygraphareadialog.c:552
 msgid "Cross"
 msgstr "Křížek"
 
-#: libgwydgets/gwygraphareadialog.c:560
+#: libgwydgets/gwygraphareadialog.c:553
 msgid "Diagonal cross"
 msgstr "Diagonální křížek"
 
-#: libgwydgets/gwygraphareadialog.c:561
+#: libgwydgets/gwygraphareadialog.c:554
 msgid "Asterisk"
 msgstr "Hvězdička"
 
-#: libgwydgets/gwygraphareadialog.c:562
+#: libgwydgets/gwygraphareadialog.c:555
 msgid "Star"
 msgstr "Hvězda"
 
-#: libgwydgets/gwygraphareadialog.c:563
+#: libgwydgets/gwygraphareadialog.c:556
 msgid "Triangle up"
 msgstr "Trojúhelník"
 
-#: libgwydgets/gwygraphareadialog.c:564
+#: libgwydgets/gwygraphareadialog.c:557
 msgid "Triangle down"
 msgstr "Otočený trojúhelník"
 
-#: libgwydgets/gwygraphareadialog.c:565
+#: libgwydgets/gwygraphareadialog.c:558
 msgid "Triangle left"
 msgstr "Levý trojúhelník"
 
-#: libgwydgets/gwygraphareadialog.c:566
+#: libgwydgets/gwygraphareadialog.c:559
 msgid "Triangle right"
 msgstr "Pravý trojúhelník"
 
-#: libgwydgets/gwygraphareadialog.c:567
+#: libgwydgets/gwygraphareadialog.c:560
 msgid "Full square"
 msgstr "Plný čtverec"
 
-#: libgwydgets/gwygraphareadialog.c:568 modules/process/mask_morph.c:177
+#: libgwydgets/gwygraphareadialog.c:561 modules/process/mask_morph.c:176
 msgid "Disc"
 msgstr "Kruh"
 
-#: libgwydgets/gwygraphareadialog.c:569
+#: libgwydgets/gwygraphareadialog.c:562
 msgid "Full diamond"
 msgstr "Plný kosočtverec"
 
-#: libgwydgets/gwygraphareadialog.c:570
+#: libgwydgets/gwygraphareadialog.c:563
 msgid "Full triangle up"
 msgstr "Plný trojúhelník"
 
-#: libgwydgets/gwygraphareadialog.c:571
+#: libgwydgets/gwygraphareadialog.c:564
 msgid "Full triangle down"
 msgstr "Plný otočený trojúhelník"
 
-#: libgwydgets/gwygraphareadialog.c:572
+#: libgwydgets/gwygraphareadialog.c:565
 msgid "Full triangle left"
 msgstr "Plný levý trojúhelník"
 
-#: libgwydgets/gwygraphareadialog.c:573
+#: libgwydgets/gwygraphareadialog.c:566
 msgid "Full triangle right"
 msgstr "Plný pravý trojúhelník"
 
-#: libgwydgets/gwygraphareadialog.c:635
+#: libgwydgets/gwygraphareadialog.c:628
 msgid "line-style|Solid"
 msgstr "Plná"
 
-#: libgwydgets/gwygraphareadialog.c:636
+#: libgwydgets/gwygraphareadialog.c:629
 msgid "line-style|Dash"
 msgstr "Přerušovaná"
 
-#: libgwydgets/gwygraphcurves.c:451
+#: libgwydgets/gwygraphcurves.c:448
 msgid "Description"
 msgstr "Popis"
 
-#: libgwydgets/gwygraphcurves.c:463
+#: libgwydgets/gwygraphcurves.c:460
 msgid "Mode"
 msgstr "Mód"
 
-#: libgwydgets/gwygraphcurves.c:481
+#: libgwydgets/gwygraphcurves.c:478
 msgid "Color"
 msgstr "Barva"
 
-#: libgwydgets/gwygraphcurves.c:494
+#: libgwydgets/gwygraphcurves.c:491
 msgid "Point Type"
 msgstr "Typ bodu"
 
-#: libgwydgets/gwygraphcurves.c:516
+#: libgwydgets/gwygraphcurves.c:513
 msgid "Line Style"
 msgstr "Typ čáry"
 
+#: libgwydgets/gwygraphlabeldialog.c:63
+msgid "Label Properties"
+msgstr "Vlastnosti popisku"
+
 #: libgwydgets/gwygraphlabeldialog.c:74
-msgid "Frame thickness:"
-msgstr "Tloušťka rámečku"
+msgid "_Frame thickness:"
+msgstr "_Tloušťka rámečku:"
 
 #: libgwydgets/gwygraphlabeldialog.c:81
 msgid "_Reversed layout"
@@ -1261,12 +1333,12 @@ msgstr "_Obrácené rozmístění"
 msgid "Abscissa"
 msgstr "Vodorovná osa"
 
-#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1002 app/toolbox.c:108
+#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1015 app/toolbox.c:113
 msgid "Graph"
 msgstr "Graf"
 
 #: libgwydgets/gwygraphwindow.c:170 modules/file/hdrimage.cc:472
-#: modules/process/fit-shape.c:656
+#: modules/process/fit-shape.c:666 modules/process/psf.c:229
 msgid "Data"
 msgstr "Data"
 
@@ -1304,15 +1376,15 @@ msgstr "Libovolné body"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:394
 #: libgwydgets/gwygraphwindowmeasuredialog.c:580 modules/tools/linestats.c:170
-#: modules/tools/roughness.c:516 modules/volume/volume_linestat.c:157
+#: modules/tools/roughness.c:517 modules/volume/volume_linestat.c:159
 msgid "Length"
 msgstr "Délka"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:398
 #: libgwydgets/gwygraphwindowmeasuredialog.c:588 app/gwyplaintool.c:1018
-#: modules/process/lat_synth.c:747 modules/process/obj_synth.c:569
-#: modules/process/pat_synth.c:846 modules/process/pat_synth.c:1148
-#: modules/process/pat_synth.c:1483
+#: modules/process/fibre_synth.c:534 modules/process/lat_synth.c:747
+#: modules/process/obj_synth.c:567 modules/process/pat_synth.c:847
+#: modules/process/pat_synth.c:1149 modules/process/pat_synth.c:1484
 msgid "Height"
 msgstr "Výška"
 
@@ -1325,12 +1397,12 @@ msgid "Curve:"
 msgstr "Křivka:"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:553
-#: modules/process/linematch.c:828 modules/process/semsim.c:249
+#: modules/process/linematch.c:795 modules/process/semsim.c:249
 #: modules/xyz/xyz_level.c:254
 msgid "Method:"
 msgstr "Metoda:"
 
-#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:354
+#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:331
 msgid "Angle"
 msgstr "Úhel"
 
@@ -1340,7 +1412,7 @@ msgid "Preferred"
 msgstr "Upřednostňovaný"
 
 #: libgwydgets/gwyoptionmenus.c:470 app/meta.c:410
-#: modules/file/imgexport.c:4160 modules/file/imgexport.c:4607
+#: modules/file/imgexport.c:4110 modules/file/imgexport.c:4555
 #: modules/file/rawfile.c:995 modules/process/convolution_filter.c:538
 #: modules/process/neural.c:418 modules/tools/selectionmanager.c:345
 msgid "Name"
@@ -1379,7 +1451,7 @@ msgid "A_dd symbol"
 msgstr "_Přidat symbol"
 
 #: libgwydgets/gwyscitext.c:274 modules/file/rawfile.c:553
-#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:405
+#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:419
 msgid "Preview"
 msgstr "Náhled"
 
@@ -1397,87 +1469,81 @@ msgstr "Žádný modul nedokáže načíst tento typ souboru."
 msgid "No module can save to this file type."
 msgstr "Žádný modul nedokáže zapsat tento typ souboru."
 
-#: libgwymodule/gwymodulebrowser.c:67
+#: libgwymodule/gwymodulebrowser.c:66
 msgid "Module Browser"
 msgstr "Prohlížeč modulů"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Module"
 msgstr "Modul"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Version"
 msgstr "Verze"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Author"
 msgstr "Autor"
 
-#: libgwymodule/gwymodulebrowser.c:246
+#: libgwymodule/gwymodulebrowser.c:244
 msgid "Name-Version:"
 msgstr "Jméno-verze"
 
-#: libgwymodule/gwymodulebrowser.c:247 libgwymodule/gwymodulebrowser.c:270
+#: libgwymodule/gwymodulebrowser.c:245 libgwymodule/gwymodulebrowser.c:268
 #: modules/process/grain_stat.c:186
 msgid "File:"
 msgstr "Soubor:"
 
-#: libgwymodule/gwymodulebrowser.c:248
+#: libgwymodule/gwymodulebrowser.c:246
 msgid "Registered functions:"
 msgstr "Registrované funkce:"
 
-#: libgwymodule/gwymodulebrowser.c:249
+#: libgwymodule/gwymodulebrowser.c:247
 msgid "Authors:"
 msgstr "Autoři:"
 
-#: libgwymodule/gwymodulebrowser.c:250
+#: libgwymodule/gwymodulebrowser.c:248
 msgid "Copyright:"
 msgstr "Copyright:"
 
-#: libgwymodule/gwymodulebrowser.c:251
+#: libgwymodule/gwymodulebrowser.c:249
 msgid "Date:"
 msgstr "Datum:"
 
-#: libgwymodule/gwymodulebrowser.c:252
+#: libgwymodule/gwymodulebrowser.c:250
 msgid "Description:"
 msgstr "Popis:"
 
-#: libgwymodule/gwymodulebrowser.c:269
+#: libgwymodule/gwymodulebrowser.c:267
 msgid "Name:"
 msgstr "Jméno:"
 
-#: libgwymodule/gwymodulebrowser.c:271
+#: libgwymodule/gwymodulebrowser.c:269
 msgid "Failure:"
 msgstr "Selhání:"
 
-#: app/about.c:57
+#: app/about.c:58
 #, c-format
 msgid "About %s"
 msgstr "O programu %s"
 
-#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
-#: app/about.c:92
-#, c-format
-msgid "Released %s\n"
-msgstr "Vydán %s\n"
-
-#: app/about.c:93
+#: app/about.c:97
 msgid "An SPM data visualization and analysis tool."
 msgstr "Nástroj pro vizualizaci a analýzu SPM dat."
 
-#: app/about.c:101
+#: app/about.c:105
 msgid "Report bugs to:"
 msgstr "Chyby oznamuj:"
 
-#: app/about.c:116
+#: app/about.c:120
 msgid "Credits"
 msgstr "Zásluhy"
 
-#: app/about.c:133
+#: app/about.c:137
 msgid "License"
 msgstr "Licence"
 
-#: app/about.c:138
+#: app/about.c:142
 #, c-format
 msgid ""
 "%s is free software; you can redistribute it and/or modify it under the "
@@ -1492,58 +1558,62 @@ msgstr ""
 "kterékoli pozdější verze. Plné znění licence najdeš v souboru COPYING v "
 "balíku se zdrojovým kódem."
 
-#: app/about.c:160 modules/process/logistic.c:270
+#: app/about.c:164 modules/process/logistic.c:269
 msgid "Features"
 msgstr "Vlastnosti"
 
-#: app/about.c:220
+#: app/about.c:224
 msgid "Developers"
 msgstr "Vývojáři"
 
-#: app/about.c:221
+#: app/about.c:225
 msgid "Translators"
 msgstr "Překladatelé"
 
-#: app/about.c:225
+#: app/about.c:229
 msgid "Development is supported by the Czech Metrology Institute: "
 msgstr "Vývoj programu podporuje Český metrologický institut: "
 
-#: app/about.c:253 app/about.c:256
+#: app/about.c:257 app/about.c:260
 msgid "OpenGL 3D View"
 msgstr "OpenGL trojrozměrné zobrazení"
 
-#: app/about.c:257 app/about.c:271 app/about.c:291
+#: app/about.c:261 app/about.c:266 app/about.c:286
 msgid "not available\n"
 msgstr "není k disposici\n"
 
-#: app/about.c:262 app/about.c:265
-msgid "Fast Fourier Transform"
-msgstr "Rychlá Fourierova transformace"
-
-#: app/about.c:266
-msgid "built-in SimpleFFT\n"
-msgstr "vestavěná SimpleFFT\n"
-
-#: app/about.c:274
+#: app/about.c:269
 msgid "X11 protocol\n"
 msgstr "X11 protokol\n"
 
-#: app/about.c:276
+#: app/about.c:271
 msgid "Win32 protocol\n"
 msgstr "Win32 protokol\n"
 
-#: app/about.c:278
+#: app/about.c:273
 msgid "LibUnique\n"
 msgstr "LibUnique\n"
 
-#: app/about.c:282
+#: app/about.c:277
 msgid "Remote Control"
 msgstr "Dálkové ovládání"
 
-#: app/about.c:286 app/about.c:290
+#: app/about.c:281 app/about.c:285
 msgid "Python Scripting Interface"
 msgstr "Rozhraní pro skriptování v Pythonu"
 
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:311
+#, c-format
+msgid "Development version, built %s"
+msgstr "Vývojová verze, sestavena %s"
+
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:328
+#, c-format
+msgid "Released %s"
+msgstr "Vydán %s"
+
 #: app/app.c:301
 #, c-format
 msgid ""
@@ -1555,116 +1625,124 @@ msgstr ""
 "%s\n"
 "Opravdu skončit?"
 
-#: app/app.c:440
+#: app/app.c:442
 msgid "Mask _Color..."
 msgstr "_Barva masky..."
 
-#: app/app.c:456 app/app.c:1725
+#: app/app.c:458 app/app.c:1754
 msgid "Zoom _1:1"
 msgstr "Zvětšit _1:1"
 
-#: app/app.c:460 app/app.c:1729 app/app.c:1957
+#: app/app.c:462 app/app.c:1758 app/app.c:1988
 msgid "Metadata _Browser..."
 msgstr "Prohlížeč _metadat..."
 
-#: app/app.c:465 app/app.c:1734 app/app.c:1962
+#: app/app.c:467 app/app.c:1763 app/app.c:1993
 msgid "View _Log..."
 msgstr "Zobrazit _Log..."
 
-#: app/app.c:649
+#: app/app.c:651
 msgid "Pi_xelwise Square"
 msgstr "Čtvercové pi_xely"
 
-#: app/app.c:659
+#: app/app.c:661
 msgid "_Physically Square"
 msgstr "_Fyzicky čtvercový"
 
-#: app/app.c:836
+#: app/app.c:842
+msgid "Set as Default"
+msgstr "Nastavit výchozí"
+
+#: app/app.c:844
+msgid "Set the current view setup as the default"
+msgstr "Nastavit současné uspořádání pohledu jako výchozí"
+
+#: app/app.c:854
 msgid "verb|Save"
 msgstr "Uložit"
 
-#: app/app.c:839 app/app.c:843
+#: app/app.c:857 app/app.c:861
 msgid "Save 3D view to an image"
 msgstr "Exportovat trojrozměrný pohled do obrázku"
 
-#: app/app.c:849
-msgid "Set as Default"
-msgstr "Nastavit výchozí"
+#: app/app.c:869
+msgid "_Autocrop"
+msgstr "_Autom. oříznout"
 
-#: app/app.c:851
-msgid "Set the current view setup as the default"
-msgstr "Nastavit současné uspořádání pohledu jako výchozí"
+#: app/app.c:873
+msgid "Remove white borders from exported image"
+msgstr "Odstranit bílé okraje z exportovaného obrázku"
 
-#: app/app.c:940
+#: app/app.c:960
 msgid "_Show mask"
 msgstr "Zobrazuj _masku"
 
-#: app/app.c:1106
+#: app/app.c:1172
 #, c-format
 msgid "Saving of 3D view to `%s' failed"
 msgstr "Uložení 3D pohledu do ‚%s‘ se nezdařilo"
 
-#: app/app.c:1150
+#: app/app.c:1222
 msgid "Export 3D View"
 msgstr "Exportovat trojrozměrný pohled"
 
-#: app/app.c:1457
+#: app/app.c:1478
 msgid "_Change Preview"
 msgstr "_Změnit náhled"
 
-#: app/app.c:1583
+#: app/app.c:1606
 msgid "Change Volume Data Preview"
 msgstr "Změnit náhled objemových dat"
 
-#: app/app.c:1593
+#: app/app.c:1616
 msgid "Preview quantity:"
 msgstr "Veličina zobrazená v náhledu:"
 
-#: app/app.c:1603 modules/process/extend.c:267 modules/tools/linestats.c:165
+#: app/app.c:1626 modules/process/extend.c:267 modules/tools/linestats.c:165
 #: modules/volume/volume_linestat.c:142
 msgid "Mean"
 msgstr "Střední hodnota"
 
-#: app/app.c:1604 modules/process/polydistort.c:255 modules/tools/filter.c:240
+#: app/app.c:1627 modules/process/polydistort.c:258 modules/tools/filter.c:241
 #: modules/tools/icolorange.c:424 modules/tools/linestats.c:167
 #: modules/volume/volume_linestat.c:144
 msgid "Minimum"
 msgstr "Minimum"
 
-#: app/app.c:1605 modules/process/col_synth.c:170 modules/tools/filter.c:241
+#: app/app.c:1628 modules/process/col_synth.c:170 modules/tools/filter.c:242
 #: modules/tools/icolorange.c:435 modules/tools/linestats.c:168
 #: modules/volume/volume_linestat.c:145
 msgid "Maximum"
 msgstr "Maximum"
 
-#: app/app.c:1606
+#: app/app.c:1629 modules/volume/volume_linestat.c:146
 msgid "Min. position"
 msgstr "Min. poloha"
 
-#: app/app.c:1607
+#: app/app.c:1630 modules/volume/volume_linestat.c:147
 msgid "Max. position"
 msgstr "Max. poloha"
 
-#: app/app.c:1608 modules/process/bdep_synth.c:134
-#: modules/process/col_synth.c:171 modules/process/scars.c:346
-#: modules/process/scars.c:353 modules/process/threshold.c:341
+#: app/app.c:1631 modules/process/bdep_synth.c:134
+#: modules/process/col_synth.c:171 modules/process/scars.c:369
+#: modules/process/scars.c:377 modules/process/threshold.c:336
 msgid "RMS"
 msgstr "RMS"
 
-#: app/app.c:1609 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
-#: modules/file/xyzexport.c:233 modules/file/xyzexport.c:302
+#: app/app.c:1632 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
+#: modules/file/xyzexport.c:236 modules/file/xyzexport.c:305
 msgid "Channel:"
 msgstr "Kanál:"
 
-#: app/app.c:1610
+#: app/app.c:1633
 msgid "Section:"
 msgstr "Řez:"
 
-#: app/app.c:1861
+#: app/app.c:1890
 msgid "_Update Preview"
 msgstr "_Aktualizovat náhled"
 
-#: app/app.c:1867
+#: app/app.c:1896
 msgid "_Density Map"
 msgstr "Mapa _hustoty"
 
@@ -1683,12 +1761,12 @@ msgstr "Neznámá objemová data %d"
 msgid "Unknown XYZ %d"
 msgstr "Neznámá XYZ data %d"
 
-#: app/data-browser-aux.c:2795
+#: app/data-browser-aux.c:2839
 #, c-format
 msgid "Z levels: %d, Z unit: %s"
 msgstr "Z úrovně: %d, Z jednotky: %s"
 
-#: app/data-browser-aux.c:2821
+#: app/data-browser-aux.c:2865
 #, c-format
 msgid "Points: %d"
 msgstr "Počet bodů: %d"
@@ -1718,10 +1796,10 @@ msgid "Close file"
 msgstr "Zavřít soubor"
 
 #: app/data-browser.c:5582
-msgid "Channels"
-msgstr "Kanály"
+msgid "Images"
+msgstr "Obrázky"
 
-#: app/data-browser.c:5596 modules/volume/volume_extract.c:444
+#: app/data-browser.c:5596 modules/volume/volume_extract.c:431
 msgid "Graphs"
 msgstr "Grafy"
 
@@ -1776,51 +1854,51 @@ msgstr ""
 "\n"
 "%s"
 
-#: app/file.c:285
+#: app/file.c:292
 #, c-format
 msgid "Opening of `%s' failed"
 msgstr "Načtení ‚%s‘ se nezdařilo"
 
-#: app/file.c:291 app/file.c:526
+#: app/file.c:298 app/file.c:533
 #, c-format
 msgid "Full file path: %s."
 msgstr "Plná cesta souboru: %s."
 
-#: app/file.c:294
+#: app/file.c:301
 #, c-format
 msgid "Loaded using: %s."
 msgstr "Načítán pomocí: %s."
 
-#: app/file.c:380
+#: app/file.c:387
 msgid "Merge File"
 msgstr "Sloučení souboru"
 
-#: app/file.c:382 app/gwyappfilechooser.c:221
+#: app/file.c:389 app/gwyappfilechooser.c:226
 msgid "Open File"
 msgstr "Otevření souboru"
 
-#: app/file.c:520 app/gwymoduleutils.c:192
+#: app/file.c:527 app/gwymoduleutils.c:192
 #, c-format
 msgid "Saving of `%s' failed"
 msgstr "Zapsání ‚%s‘ se nezdařilo"
 
-#: app/file.c:529
+#: app/file.c:536
 #, c-format
 msgid "Saved using: %s."
 msgstr "Ukládán pomocí: %s."
 
-#: app/file.c:689
+#: app/file.c:696
 #, c-format
 msgid "File `%s' already exists.  Replace?"
 msgstr "Soubor ‚%s‘ již existuje. Přepsat?"
 
-#: app/file.c:693
+#: app/file.c:700
 #, c-format
 msgid ""
 "The file already exists in `%s'.  Replacing it will overwrite its contents."
 msgstr "Takový soubor již v ‚%s‘ existuje. Přepsání nahradí jeho obsah."
 
-#: app/file.c:696
+#: app/file.c:703
 msgid "Replace File?"
 msgstr "Přepsat soubor?"
 
@@ -1844,11 +1922,11 @@ msgstr "Zavřít seznam souborů"
 msgid "Open selected file"
 msgstr "Otevřít vybraný soubor"
 
-#: app/filelist.c:566 app/gwyappfilechooser.c:583
+#: app/filelist.c:566 app/gwyappfilechooser.c:592
 msgid "_Filter:"
 msgstr "_Filtr:"
 
-#: app/filelist.c:604 app/gwyappfilechooser.c:619
+#: app/filelist.c:604 app/gwyappfilechooser.c:628
 msgid "Case _sensitive"
 msgstr "Rozlišovat velká/_malá"
 
@@ -1898,97 +1976,97 @@ msgstr "_Křivka"
 msgid "_Snap to control points"
 msgstr "_Přichytávat ke kontrolním bodům"
 
-#: app/gwyappfilechooser.c:226
+#: app/gwyappfilechooser.c:231
 msgid "Save File"
 msgstr "Uložení souboru"
 
-#: app/gwyappfilechooser.c:380
+#: app/gwyappfilechooser.c:389
 #, c-format
 msgid "File _type: %s"
 msgstr "_Typ souboru: %s"
 
-#: app/gwyappfilechooser.c:387
+#: app/gwyappfilechooser.c:396
 msgid "Only loadable shown"
 msgstr "Zobrazeny pouze načtitelné"
 
-#: app/gwyappfilechooser.c:391
+#: app/gwyappfilechooser.c:400
 #, c-format
 msgid "Filter: %s"
 msgstr "Filtr: %s"
 
-#: app/gwyappfilechooser.c:455
+#: app/gwyappfilechooser.c:464
 msgid "Automatic by extension"
 msgstr "Automatický podle koncovky"
 
-#: app/gwyappfilechooser.c:464
+#: app/gwyappfilechooser.c:473
 msgid "Automatically detected"
 msgstr "Automaticky detekovaný"
 
-#: app/gwyappfilechooser.c:561
+#: app/gwyappfilechooser.c:570
 msgid "Show only loadable files"
 msgstr "Zobrazovat pouze soubory, které lze načíst"
 
-#: app/gwyappfilechooser.c:844
+#: app/gwyappfilechooser.c:855
 msgid "Plane-level previewed data"
 msgstr "Vyrovnávat náhledy proložením roviny"
 
-#: app/gwyappfilechooser.c:860
+#: app/gwyappfilechooser.c:871
 msgid "Row-level previewed data"
 msgstr "Vyrovnávat náhledy srovnáním řádků"
 
-#: app/gwyappfilechooser.c:969
+#: app/gwyappfilechooser.c:987
+msgid "File too large for preview"
+msgstr "Soubor je příliš velký pro náhled"
+
+#: app/gwyappfilechooser.c:988
 msgid "…"
 msgstr "…"
 
-#: app/gwyappfilechooser.c:1331
+#: app/gwyappfilechooser.c:1352
 msgid "Cannot preview"
 msgstr "Náhled není možný"
 
-#: app/gwyddion.c:143
+#: app/gwyddion.c:147
 msgid "Loading document history"
 msgstr "Načítám historii dokumentů"
 
-#: app/gwyddion.c:148
+#: app/gwyddion.c:152
 msgid "Registering "
 msgstr "Registruji "
 
-#: app/gwyddion.c:149
+#: app/gwyddion.c:153
 msgid "stock items"
 msgstr "standardní ikony"
 
-#: app/gwyddion.c:153
+#: app/gwyddion.c:157
 msgid "color gradients"
 msgstr "barevné gradienty"
 
-#: app/gwyddion.c:155
+#: app/gwyddion.c:159
 msgid "GL materials"
 msgstr "GL materiály"
 
-#: app/gwyddion.c:157
+#: app/gwyddion.c:161
 msgid "grain quantities"
 msgstr "zrnové veličiny"
 
-#: app/gwyddion.c:159
+#: app/gwyddion.c:163
 msgid "calibrations"
 msgstr "kalibrace"
 
-#: app/gwyddion.c:164
+#: app/gwyddion.c:168
 msgid "Loading settings"
 msgstr "Načítám nastavení"
 
-#: app/gwyddion.c:171
+#: app/gwyddion.c:175
 msgid "Registering modules"
 msgstr "Registruji moduly"
 
-#: app/gwyddion.c:193
-msgid "Initializing GUI"
-msgstr "Inicializuji GUI"
-
-#: app/gwyddion.c:439
+#: app/gwyddion.c:464
 msgid "Could not read settings."
 msgstr "Nezdařilo se přečíst nastavení."
 
-#: app/gwyddion.c:442
+#: app/gwyddion.c:467
 #, c-format
 msgid ""
 "Settings file `%s' cannot be read: %s\n"
@@ -2001,42 +2079,72 @@ msgstr ""
 "Aby se neztratilo uložené nastavení, nebude se do něj zapisovat, dokud "
 "nebude opraven či odstraněn."
 
-#: app/gwymoduleutils-file.c:542
+#: app/gwyddion.c:505
+#, c-format
+msgid "Many modules (%u) failed to register."
+msgstr "Selhala registrace spousty modulů (%u)."
+
+#: app/gwyddion.c:510
+#, c-format
+msgid ""
+"Most likely Gwyddion was not upgraded correctly.  Instead, one installation "
+"was just overwritten with another, and now it is a mess.\n"
+"\n"
+"Please remove completely the module directory\n"
+"\n"
+"%s\n"
+"\n"
+"and reinstall Gwyddion.\n"
+"\n"
+"See Info → Module Browser for specific errors."
+msgstr ""
+"Gwyddion nejspíš nebyl správně upgradován.  Namísto toho byla jedna "
+"instalace prostě přepsána jinou, a teď je v ní zmatek.\n"
+"\n"
+"Odstraň prosím kompletně adresář s moduly\n"
+"\n"
+"%s\n"
+"\n"
+"a přeinstaluj Gwyddion.\n"
+"\n"
+"Viz Info → Prohlížeč modulů pro konkrétní chyby."
+
+#: app/gwymoduleutils-file.c:536
 #, c-format
 msgid "Section %s ended at line %u but it has never started."
 msgstr "Sekce %s skončila na řádku %u, ale nikdy nezačala."
 
-#: app/gwymoduleutils-file.c:550
+#: app/gwymoduleutils-file.c:544
 #, c-format
 msgid "Section %s ended at line %u instead of %s."
 msgstr "Sekce %s skončila na řádku %u namísto %s."
 
-#: app/gwymoduleutils-file.c:587
+#: app/gwymoduleutils-file.c:581
 #, c-format
 msgid "Section %s started at line %u before %s ended."
 msgstr "Sekce %s začala na řádku %u dříve, než %s skončila."
 
-#: app/gwymoduleutils-file.c:593
+#: app/gwymoduleutils-file.c:587
 #, c-format
 msgid "Empty section name at header line %u."
 msgstr "Prázdné jméno sekce v hlavičce na řádku %u."
 
-#: app/gwymoduleutils-file.c:628
+#: app/gwymoduleutils-file.c:622
 #, c-format
 msgid "Header line %u lacks prefix %s."
 msgstr "Na řádku %u hlavičky chybí prefix %s."
 
-#: app/gwymoduleutils-file.c:653
+#: app/gwymoduleutils-file.c:647
 #, c-format
 msgid "Header line %u lacks key-value separator."
 msgstr "Na řádku %u hlavičky schází oddělovač klíče a hodnoty."
 
-#: app/gwymoduleutils-file.c:661
+#: app/gwymoduleutils-file.c:655
 #, c-format
 msgid "Key at header line %u is empty."
 msgstr "Klíč na řádku %u je prázdný."
 
-#: app/gwymoduleutils-file.c:688
+#: app/gwymoduleutils-file.c:682
 #, c-format
 msgid "Header suddenly ended at line %u; end of header marker is missing"
 msgstr ""
@@ -2044,6 +2152,7 @@ msgstr ""
 
 #: app/gwymoduleutils.c:197 app/settings.c:131 app/settings.c:142
 #: app/toolbox-spec.c:536 modules/file/err.h:62
+#: modules/pygwy/pygwy-console.c:528
 #, c-format
 msgid "Cannot write to file: %s."
 msgstr "Do souboru nelze zapisovat: %s."
@@ -2072,8 +2181,9 @@ msgstr "Počátek"
 
 #: app/gwyplaintool.c:1011 modules/file/rawfile.c:997
 #: modules/process/convolution_filter.c:349
-#: modules/process/convolution_filter.c:553 modules/process/neural.c:419
-#: modules/process/obj_synth.c:538 modules/process/pat_synth.c:1449
+#: modules/process/convolution_filter.c:553 modules/process/fibre_synth.c:520
+#: modules/process/neural.c:419 modules/process/obj_synth.c:536
+#: modules/process/pat_synth.c:1450
 msgid "Size"
 msgstr "Velikost"
 
@@ -2130,7 +2240,7 @@ msgstr "Vy_prázdnit"
 msgid "_Close"
 msgstr "_Zavřít"
 
-#: app/log.c:615 modules/file/imgexport.c:4168 modules/file/rawfile.c:996
+#: app/log.c:615 modules/file/imgexport.c:4118 modules/file/rawfile.c:996
 msgid "Type"
 msgstr "Typ"
 
@@ -2138,8 +2248,8 @@ msgstr "Typ"
 msgid "Function"
 msgstr "Funkce"
 
-#: app/log.c:617 modules/file/imgexport.c:3117 modules/process/fit-shape.c:465
-#: modules/process/neural.c:610 modules/tools/stats.c:425
+#: app/log.c:617 modules/file/imgexport.c:3128 modules/process/fit-shape.c:466
+#: modules/process/neural.c:614 modules/tools/stats.c:423
 msgid "Parameters"
 msgstr "Parametry"
 
@@ -2151,39 +2261,39 @@ msgstr "Čas"
 msgid "Export Log"
 msgstr "Exportovat log"
 
-#: app/menu.c:556 app/toolbox.c:581
+#: app/menu.c:555 app/toolbox.c:595
 msgid "_Data Process"
 msgstr "Zpracování _dat"
 
-#: app/menu.c:598 app/toolbox.c:584
+#: app/menu.c:597 app/toolbox.c:598
 msgid "_Graph"
 msgstr "_Graf"
 
-#: app/menu.c:641 app/toolbox.c:587
+#: app/menu.c:640 app/toolbox.c:601
 msgid "_Volume Data"
 msgstr "_Objemová data"
 
-#: app/menu.c:684 app/toolbox.c:590
+#: app/menu.c:683 app/toolbox.c:604
 msgid "_XYZ Data"
 msgstr "_XYZ data"
 
-#: app/menu.c:715
+#: app/menu.c:714
 msgid "Re-show Last"
 msgstr "Ukázat poslední"
 
-#: app/menu.c:730
+#: app/menu.c:729
 msgid "Repeat Last"
 msgstr "Opakovat poslední"
 
-#: app/menu.c:858
+#: app/menu.c:857
 msgid "Repeat"
 msgstr "Opakovat"
 
-#: app/menu.c:864
+#: app/menu.c:863
 msgid "Re-show"
 msgstr "Ukázat znovu"
 
-#: app/menu.c:1186
+#: app/menu.c:1185
 msgid "_Document history"
 msgstr "_Historie dokumentů"
 
@@ -2191,8 +2301,8 @@ msgstr "_Historie dokumentů"
 msgid "_New"
 msgstr "_Nový"
 
-#: app/meta.c:235 modules/file/imgexport.c:4672 modules/file/rawfile.c:1058
-#: modules/process/neural.c:711 modules/tools/selectionmanager.c:405
+#: app/meta.c:235 modules/file/imgexport.c:4620 modules/file/rawfile.c:1058
+#: modules/process/neural.c:718 modules/tools/selectionmanager.c:405
 msgid "_Delete"
 msgstr "_Smazat"
 
@@ -2266,11 +2376,11 @@ msgstr "Nelze vytvořit adresář pro uživatelské rozhraní %s: %s"
 msgid "Cannot create user module directory %s: %s"
 msgstr "Nelze vytvořit adresář pro uživatelské moduly %s: %s"
 
-#: app/splash.c:832
+#: app/splash.c:1260
 msgid "Starting "
 msgstr "Spouštím "
 
-#: app/splash.c:878
+#: app/splash.c:1313
 msgid " is free software released under GNU GPL."
 msgstr " je svobodný software uvolněný pod GNU GPL."
 
@@ -2800,124 +2910,125 @@ msgstr "_Následující tip"
 msgid "_Show tips at startup"
 msgstr "_Zobrazuj tipy při spuštění"
 
-#: app/toolbox-editor.c:212
+#: app/toolbox-editor.c:213
 msgid "Toolbox Editor"
 msgstr "Editor panelu nástrojů"
 
-#: app/toolbox-editor.c:257
+#: app/toolbox-editor.c:258
 msgid "_New Item"
 msgstr "_Nová položka"
 
-#: app/toolbox-editor.c:262
+#: app/toolbox-editor.c:263
 msgid "_New Group"
 msgstr "_Nová skupina"
 
-#: app/toolbox-editor.c:268 app/toolbox.c:577
+#: app/toolbox-editor.c:269 app/toolbox.c:591
 msgid "_Edit"
 msgstr "Úpr_avy"
 
-#: app/toolbox-editor.c:273 modules/process/fft_filter_2d.c:499
-#: modules/tools/maskedit.c:548 modules/volume/volume_zcal.c:173
+#: app/toolbox-editor.c:274 modules/process/fft_filter_2d.c:499
+#: modules/tools/maskedit.c:554 modules/volume/volume_zcal.c:173
 msgid "_Remove"
 msgstr "_Odstranit"
 
-#: app/toolbox-editor.c:278
+#: app/toolbox-editor.c:279
 msgid "Move _Up"
 msgstr "Posunout na_horu"
 
-#: app/toolbox-editor.c:283
+#: app/toolbox-editor.c:284
 msgid "Move _Down"
 msgstr "Posunout _dolů"
 
-#: app/toolbox-editor.c:292 modules/file/hdrimage.cc:2304
-#: modules/file/imgexport.c:3101 modules/file/pixmap.c:872
+#: app/toolbox-editor.c:293 modules/file/hdrimage.cc:2304
+#: modules/file/imgexport.c:3114 modules/file/pixmap.c:872
 #: modules/file/rawfile.c:658 modules/process/crosscor.c:252
-#: modules/process/dimensions.h:473 modules/process/tip_blind.c:333
+#: modules/process/dimensions.h:455 modules/process/fibre_synth.c:526
+#: modules/process/tip_blind.c:334
 msgid "_Width:"
 msgstr "Šířk_a:"
 
-#: app/toolbox-editor.c:774
+#: app/toolbox-editor.c:787
 msgid "Toolbox Group"
 msgstr "Skupina panelu nástrojů"
 
-#: app/toolbox-editor.c:791 modules/file/rawgraph.c:267
+#: app/toolbox-editor.c:804 modules/file/rawgraph.c:267
 msgid "_Title:"
 msgstr "_Název:"
 
-#: app/toolbox-editor.c:805
+#: app/toolbox-editor.c:818
 msgid "_Id:"
 msgstr "_Id:"
 
-#: app/toolbox-editor.c:818
+#: app/toolbox-editor.c:831
 msgid "_Suggest"
 msgstr "Na_vrhnout"
 
-#: app/toolbox-editor.c:824
+#: app/toolbox-editor.c:837
 msgid "Trans_latable title"
 msgstr "Název je _přeložitelný"
 
-#: app/toolbox-editor.c:874
+#: app/toolbox-editor.c:887
 msgid "Group id is not a valid identifier"
 msgstr "Id skupiny není platný identifikátor"
 
-#: app/toolbox-editor.c:882
+#: app/toolbox-editor.c:895
 msgid "Group id is not unique"
 msgstr "Id skupiny není unikátní"
 
-#: app/toolbox-editor.c:971
+#: app/toolbox-editor.c:984
 msgid "Toolbox Item"
 msgstr "Položka panelu nástrojů"
 
-#: app/toolbox-editor.c:992 modules/process/coerce.c:331
+#: app/toolbox-editor.c:1005 modules/process/coerce.c:331
 #: modules/tools/filter.c:284
 msgid "_Type:"
 msgstr "_Typ:"
 
-#: app/toolbox-editor.c:999
+#: app/toolbox-editor.c:1012
 msgid "Placeholder"
 msgstr "Rezervované místo"
 
-#: app/toolbox-editor.c:1000
+#: app/toolbox-editor.c:1013
 msgid "Builtin"
 msgstr "Vestavěná funkce"
 
-#: app/toolbox-editor.c:1001 app/toolbox.c:107
+#: app/toolbox-editor.c:1014 app/toolbox.c:112
 msgid "Data Process"
 msgstr "Zpracování dat"
 
-#: app/toolbox-editor.c:1003
+#: app/toolbox-editor.c:1016
 msgid "Volume Data"
 msgstr "Objemová data"
 
-#: app/toolbox-editor.c:1004
+#: app/toolbox-editor.c:1017
 msgid "XYZ Data"
 msgstr "XYZ data"
 
-#: app/toolbox-editor.c:1005
+#: app/toolbox-editor.c:1018
 msgid "Tool"
 msgstr "Nástroj"
 
-#: app/toolbox-editor.c:1012
+#: app/toolbox-editor.c:1025 modules/tools/profile.c:483
 msgid "_Mode:"
 msgstr "_Mód:"
 
-#: app/toolbox-editor.c:1019 app/toolbox-editor.c:1038
+#: app/toolbox-editor.c:1032 app/toolbox-editor.c:1051
 msgid "Default"
 msgstr "Výchozí"
 
-#: app/toolbox-editor.c:1020
+#: app/toolbox-editor.c:1033
 msgid "Interactive"
 msgstr "Interaktivní"
 
-#: app/toolbox-editor.c:1021
+#: app/toolbox-editor.c:1034
 msgid "Non-interactive"
 msgstr "Neinteraktivní"
 
-#: app/toolbox-editor.c:1029
+#: app/toolbox-editor.c:1042
 msgid "Use _icon from:"
 msgstr "Použít _ikonu z:"
 
-#: app/toolbox-editor.c:1063
+#: app/toolbox-editor.c:1076
 msgid "Functions"
 msgstr "Funkce"
 
@@ -2933,143 +3044,159 @@ msgstr "zbývající nástroje"
 msgid "All tools not placed explicitly go here."
 msgstr "Všechny explicitně neumístěné nástroje přijdou sem."
 
-#: app/toolbox.c:106
+#: app/toolbox.c:111
 msgid "View"
 msgstr "Zobrazení"
 
-#: app/toolbox.c:109
+#: app/toolbox.c:114
 msgid "Tools"
 msgstr "Nástroje"
 
-#: app/toolbox.c:575
+#: app/toolbox.c:589
 msgid "_File"
 msgstr "_Soubor"
 
-#: app/toolbox.c:593
+#: app/toolbox.c:607
 msgid "_Info"
 msgstr "_Info"
 
-#: app/toolbox.c:663
+#: app/toolbox.c:696
 msgid "Display a 3D view of data"
 msgstr "Zobrazit data v trojrozměrném pohledu"
 
-#: app/toolbox.c:667
+#: app/toolbox.c:700
+msgid "Undo"
+msgstr "Zpět"
+
+#: app/toolbox.c:700
+msgid "Undo last action"
+msgstr "Vrátit zpět poslední akci"
+
+#: app/toolbox.c:704
+msgid "Redo"
+msgstr "Znovu"
+
+#: app/toolbox.c:704
+msgid "Redo again last undone action"
+msgstr "Zopakovat znovu poslední vrácenou akci"
+
+#: app/toolbox.c:708
 msgid "Zoom in"
 msgstr "Zvětšit"
 
-#: app/toolbox.c:671
+#: app/toolbox.c:712
 msgid "Zoom out"
 msgstr "Zmenšit"
 
-#: app/toolbox.c:675
+#: app/toolbox.c:716
 msgid "Zoom 1:1"
 msgstr "Velikost 1:1"
 
-#: app/toolbox.c:722
+#: app/toolbox.c:781
 msgid "/Show _Data Browser"
 msgstr "/Ukázat prohlížeč _dat"
 
-#: app/toolbox.c:730
+#: app/toolbox.c:789
 msgid "/Module _Browser"
 msgstr "/_Prohlížeč modulů"
 
-#: app/toolbox.c:738
+#: app/toolbox.c:797
 msgid "/Program _Messages"
 msgstr "/_Zprávy programu"
 
-#: app/toolbox.c:753
+#: app/toolbox.c:812
 msgid "/_User Guide"
 msgstr "/_Uživatelská příručka"
 
-#: app/toolbox.c:761
+#: app/toolbox.c:820
 msgid "/_Tip of the Day"
 msgstr "/_Tip dne"
 
-#: app/toolbox.c:769
+#: app/toolbox.c:828
 msgid "/_About Gwyddion"
 msgstr "/_O Gwyddionu"
 
-#: app/toolbox.c:806
+#: app/toolbox.c:865
 msgid "/_Open..."
 msgstr "/_Otevřít..."
 
-#: app/toolbox.c:814
+#: app/toolbox.c:873
 msgid "/_Merge..."
 msgstr "/_Sloučit..."
 
-#: app/toolbox.c:822
+#: app/toolbox.c:881
 msgid "/Open _Recent"
 msgstr "/Otevřít _nedávný"
 
-#: app/toolbox.c:830
+#: app/toolbox.c:889
 msgid "/_Save"
 msgstr "/_Uložit"
 
-#: app/toolbox.c:838
+#: app/toolbox.c:897
 msgid "/Save _As..."
 msgstr "/Uložit j_ako..."
 
-#: app/toolbox.c:846
+#: app/toolbox.c:905
 msgid "/_Close"
 msgstr "/_Zavřít"
 
-#: app/toolbox.c:854
+#: app/toolbox.c:913
 msgid "/Remo_ve All Logs"
 msgstr "/Od_stranit všechny logy"
 
-#: app/toolbox.c:870
+#: app/toolbox.c:929
 msgid "/_Quit"
 msgstr "/U_končit"
 
-#: app/toolbox.c:910
+#: app/toolbox.c:969
 msgid "/_Undo"
 msgstr "/_Zpět"
 
-#: app/toolbox.c:918
+#: app/toolbox.c:977
 msgid "/_Redo"
 msgstr "/Z_novu"
 
-#: app/toolbox.c:934
+#: app/toolbox.c:993
 msgid "/Default Mask _Color..."
 msgstr "/Výchozí _barva masky..."
 
-#: app/toolbox.c:942
+#: app/toolbox.c:1001
 msgid "/Color _Gradients..."
 msgstr "/Barevné _gradienty..."
 
-#: app/toolbox.c:950
+#: app/toolbox.c:1009
 msgid "/G_L Materials..."
 msgstr "/G_L materiály..."
 
-#: app/toolbox.c:958
+#: app/toolbox.c:1017
 msgid "/_Toolbox..."
 msgstr "/Paleta _nástrojů..."
 
-#: app/toolbox.c:966
+#: app/toolbox.c:1025
 msgid "/_Keyboard Shortcuts"
 msgstr "/_Klávesové zkratky"
 
-#: app/toolbox.c:974
+#: app/toolbox.c:1033
 msgid "/_Logging Enabled"
 msgstr "/_Logování povoleno"
 
-#: app/toolbox.c:1083
+#: app/toolbox.c:1142
 msgid "Program Messages"
 msgstr "Zprávy programu"
 
-#: app/toolbox.c:1320
+#: app/toolbox.c:1379
 msgid "Change Default Mask Color"
 msgstr "Změnit předvolenou barvu masky"
 
-#: app/toolbox.c:1348
+#: app/toolbox.c:1407
 msgid "OpenGL 3D graphics not available"
 msgstr "Trojrozměrné OpenGL zobrazení není přístupno"
 
-#: app/toolbox.c:1353
+#: app/toolbox.c:1412
 msgid "OpenGL was disabled with a command-line option."
 msgstr "OpenGL bylo zakázáno na příkazové řádce."
 
-#: app/toolbox.c:1361
+#: app/toolbox.c:1420
 msgid ""
 "Initialization of OpenGL failed.  Check output of <tt>glxinfo</tt> and "
 "warning messages printed to console during Gwyddion startup."
@@ -3077,7 +3204,7 @@ msgstr ""
 "Inicializace OpenGL selhala. Zkontroluj výstup <tt>glxinfo</tt> a varování "
 "vypsaná do terminálu během spouštění Gwyddionu."
 
-#: app/toolbox.c:1368
+#: app/toolbox.c:1427
 msgid "This version of Gwyddion was built without OpenGL support."
 msgstr "Tato verze Gwyddionu byla sestavena bez podpory OpenGL."
 
@@ -3153,7 +3280,7 @@ msgstr "Objekt má několik referencí"
 msgid "Secondary data item has no primary data"
 msgstr "Sekundární data nemají žádná odpovídající primární data"
 
-#: app/wait.c:106
+#: app/wait.c:114
 msgid "Please wait"
 msgstr "Čekej, prosím"
 
@@ -3170,11 +3297,11 @@ msgstr "Accurex II textové soubory (.txt)"
 msgid "File header cannot be converted from ISO-8859-1 character set: %s"
 msgstr "Hlavičku souboru nelze převést ze znakové sady ISO-8859-1: %s"
 
-#: modules/file/aistfile.c:127
+#: modules/file/aistfile.c:123
 msgid "Imports AIST-NT data files."
 msgstr "Načítá datové soubory AIST-NT."
 
-#: modules/file/aistfile.c:140
+#: modules/file/aistfile.c:136
 msgid "AIST-NT files (.aist)"
 msgstr "AIST-NT soubory (.aist)"
 
@@ -3221,7 +3348,8 @@ msgstr "Hodnota tagu ‚%s‘ v hlavičce není doplněna nulami."
 
 #: modules/file/alicona.c:665 modules/file/gdeffile.c:175
 #: modules/file/gdeffile.c:199 modules/file/gsffile.c:159
-#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1038
+#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1174
+#: modules/file/microprof.c:361 modules/file/microprof.c:375
 #: modules/file/pt3file.c:489 modules/file/pt3file.c:591
 msgid "File header is truncated."
 msgstr "Hlavička souboru je uříznutá."
@@ -3234,11 +3362,11 @@ msgstr "Komentáři schází ukončení CRLF."
 msgid "Comment is not nul-terminated."
 msgstr "Komentář není ukončen nulovým znakem."
 
-#: modules/file/ambfile.c:84
+#: modules/file/ambfile.c:83
 msgid "Imports Ambios AMB data files."
 msgstr "Načítá datové soubory Ambios AMB."
 
-#: modules/file/ambfile.c:97
+#: modules/file/ambfile.c:96
 msgid "Ambios amb files (.amb)"
 msgstr "Ambios AMB soubory (.amb)"
 
@@ -3270,11 +3398,11 @@ msgstr "FileDescEnd nemá odpovídající FileDescBegin"
 msgid "FileDescBegin has no corresponding FileDescEnd."
 msgstr "FileDescBegin nemá odpovídající FileDescEnd"
 
-#: modules/file/apedaxfile.c:259
+#: modules/file/apedaxfile.c:261
 msgid "Imports A.P.E. Research DAX data files."
 msgstr "Načítá datové soubory A.P.E. Research DAX."
 
-#: modules/file/apedaxfile.c:274
+#: modules/file/apedaxfile.c:276
 msgid "A.P.E. Research DAX Files (.dax) and APDT File (.apdt)"
 msgstr "A.P.E. Research DAX soubory (.dax) a APDT soubory (.apdt)"
 
@@ -3302,7 +3430,7 @@ msgstr "Šířka:"
 msgid "Height:"
 msgstr "Výška:"
 
-#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:248
+#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:251
 msgid "Value units:"
 msgstr "Jednotky hodnot:"
 
@@ -3311,30 +3439,30 @@ msgid "Export Text"
 msgstr "Export jako text"
 
 #: modules/file/asciiexport.c:275 modules/file/gxyzffile.c:402
-#: modules/file/imgexport.c:3565 modules/file/imgexport.c:4203
-#: modules/file/rawfile.c:758 modules/file/xyzexport.c:311
-#: modules/process/calibrate.c:607 modules/process/coerce.c:364
-#: modules/process/col_synth.c:516 modules/process/correct_affine.c:470
-#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:261
-#: modules/process/grain_dist.c:306 modules/process/grain_edge.c:255
-#: modules/process/grain_mark.c:338 modules/process/grain_wshed.c:252
-#: modules/process/linematch.c:852 modules/process/mark_disconn.c:279
-#: modules/process/slope_dist.c:367 modules/process/tip_blind.c:357
+#: modules/file/imgexport.c:3532 modules/file/imgexport.c:4151
+#: modules/file/rawfile.c:758 modules/file/xyzexport.c:314
+#: modules/process/calibrate.c:561 modules/process/coerce.c:363
+#: modules/process/col_synth.c:516 modules/process/correct_affine.c:520
+#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:263
+#: modules/process/grain_dist.c:307 modules/process/grain_edge.c:254
+#: modules/process/grain_mark.c:335 modules/process/grain_wshed.c:256
+#: modules/process/linematch.c:819 modules/process/mark_disconn.c:280
+#: modules/process/slope_dist.c:359 modules/process/tip_blind.c:360
 #: modules/process/wpour_mark.c:354 modules/tools/spotremove.c:322
-#: modules/tools/stats.c:402 modules/xyz/xyz_raster.c:628
+#: modules/tools/stats.c:401 modules/xyz/xyz_raster.c:597
 msgid "Options"
 msgstr "Volby"
 
-#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:314
+#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:317
 msgid "Use _dot as decimal separator"
 msgstr "Použít tečku namísto _desetinné čárky"
 
-#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:321
-#: modules/process/grain_dist.c:317
+#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:324
+#: modules/process/grain_dist.c:318
 msgid "Add _informational comment header"
 msgstr "Přidat na začátek _informativní komentář"
 
-#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:330
+#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:333
 msgid "_Precision:"
 msgstr "_Přesnost:"
 
@@ -3354,20 +3482,20 @@ msgstr "Načítá ASC soubory Attocube Systems."
 msgid "Attocube ASCII files (.asc)"
 msgstr "Attocube ASCII soubory (.asc)"
 
-#: modules/file/bcrfile.c:146
+#: modules/file/bcrfile.c:141
 msgid "Imports Image Metrology BCR data files."
 msgstr "Načítá datové soubory BCR Image Metrology."
 
-#: modules/file/bcrfile.c:159
+#: modules/file/bcrfile.c:154
 msgid "BCR files (.bcr, .bcrf)"
 msgstr "BCR soubory (.bcr, .bcrf)"
 
-#: modules/file/bcrfile.c:238
+#: modules/file/bcrfile.c:233
 #, c-format
 msgid "File header is not convertible from UTF-16: %s"
 msgstr "Hlavičku souboru nelze převést z UTF-16: %s"
 
-#: modules/file/bcrfile.c:351
+#: modules/file/bcrfile.c:346
 #, c-format
 msgid "Unknown file type header: `%s'."
 msgstr "Neznámá hlavička souboru: ‚%s‘."
@@ -3402,7 +3530,7 @@ msgid "Burleigh exported data (.txt, .bin)"
 msgstr "Burleigh exportovaná data (.txt, .bin)"
 
 #: modules/file/burleigh_exp.c:226 modules/file/burleigh_exp.c:267
-#: modules/file/nanoscope.c:1605 modules/file/omicron.c:416
+#: modules/file/nanoscope.c:1612 modules/file/omicron.c:416
 #: modules/file/shimadzu.c:468
 msgid "Missing colon in header line."
 msgstr "V řádku hlavičky schází dvojtečka."
@@ -3451,22 +3579,40 @@ msgstr "Načítá datové soubory Benyuan CSM."
 msgid "Benyuan CSM files (.csm)"
 msgstr "Benyuan CSM soubory (.csm)"
 
-#: modules/file/dektakxml.c:138
+#: modules/file/dektakvca.c:197
+msgid "Imports Dektak OPDx data files."
+msgstr "Načítá datové soubory Dektak OPDx."
+
+#: modules/file/dektakvca.c:210
+msgid "Dektak OPDx data files (.OPDx)"
+msgstr "Dektak OPDx soubory (.OPDx)"
+
+#: modules/file/dektakvca.c:655
+#, c-format
+msgid "Item `%s' has unexpected type %u instead of %u."
+msgstr "Položka ‚%s‘ má neočekávaný typ %u namísto %u."
+
+#: modules/file/dektakvca.c:1022
+#, c-format
+msgid "Truncated data inside item %s."
+msgstr "Data v položce %s jsou uříznutá"
+
+#: modules/file/dektakxml.c:118
 msgid "Imports Dektak XML data files."
 msgstr "Načítá datové soubory Dektak XML."
 
-#: modules/file/dektakxml.c:151
+#: modules/file/dektakxml.c:131
 msgid "Dektak XML data files (.xml)"
 msgstr "Dektak XML soubory (.xml)"
 
-#: modules/file/dektakxml.c:228 modules/file/lextfile.c:260
-#: modules/file/nanoscan.c:267 modules/file/ometiff.c:265
+#: modules/file/dektakxml.c:208 modules/file/lextfile.c:260
+#: modules/file/nanoscan.c:270 modules/file/ometiff.c:265
 #, c-format
 msgid "XML parsing failed: %s"
 msgstr "Parsování XML selhalo: %s"
 
-#: modules/file/dektakxml.c:400 modules/file/lextfile.c:163
-#: modules/file/nanoscan.c:672 modules/file/ometiff.c:445
+#: modules/file/dektakxml.c:373 modules/file/lextfile.c:163
+#: modules/file/nanoscan.c:698 modules/file/ometiff.c:445
 #, c-format
 msgid "Top-level element is not ‘%s’."
 msgstr "Kořenový element není ‚%s‘."
@@ -3578,7 +3724,7 @@ msgid "Scan size header field overlaps with data."
 msgstr "Hlavička velikosti skenu se překrývá s daty."
 
 #: modules/file/err.h:48 modules/file/nrrdfile.c:779
-#: modules/file/nrrdfile.c:824
+#: modules/file/nrrdfile.c:824 modules/pygwy/pygwy-console.c:504
 #, c-format
 msgid "Cannot read from file: %s."
 msgstr "Soubor nelze číst: %s."
@@ -3795,32 +3941,32 @@ msgid ""
 "Data deserialization succeeded, but resulted in an unexpected object %s."
 msgstr "Deserializace dat se podařila, ale výsledkem je neočekávaný objekt %s."
 
-#: modules/file/gwytiff.h:332
+#: modules/file/gwytiff.h:335
 #, c-format
 msgid "BigTIFF reserved fields are %u and %u instead of 8 and 0."
 msgstr "Reservovaná pole BigTIFFu jsou %u a %u namísto 8 a 0."
 
-#: modules/file/gwytiff.h:349 modules/file/gwytiff.h:366
+#: modules/file/gwytiff.h:352 modules/file/gwytiff.h:369
 #, c-format
 msgid "TIFF directory %lu ended unexpectedly."
 msgstr "Adresář TIFFu č. %lu neočekávaně skončil."
 
-#: modules/file/gwytiff.h:484
+#: modules/file/gwytiff.h:487
 #, c-format
 msgid "BigTIFF data type %u was found in a classic TIFF."
 msgstr "Datový typ %u BigTIFFu byl nalezen v klasickém TIFFu"
 
-#: modules/file/gwytiff.h:501
+#: modules/file/gwytiff.h:504
 msgid "Invalid tag data positions were found."
 msgstr "Vyskytly se neplatné posice dat tagů."
 
-#: modules/file/gwytiff.h:874 modules/file/gwytiff.h:889
-#: modules/file/gwytiff.h:1012 modules/file/gwytiff.h:1019
+#: modules/file/gwytiff.h:877 modules/file/gwytiff.h:892
+#: modules/file/gwytiff.h:1015 modules/file/gwytiff.h:1022
 #, c-format
 msgid "Required tag %u was not found."
 msgstr "Nebyl nalezen nezbytný tag %u."
 
-#: modules/file/gwytiff.h:942 modules/file/gwytiff.h:986
+#: modules/file/gwytiff.h:945 modules/file/gwytiff.h:989
 #: modules/file/keyence.c:449 modules/file/matfile.c:276
 #: modules/file/matfile.c:298 modules/file/omicronflat.c:1962
 #: modules/file/princetonspe.c:339 modules/file/psia.c:352
@@ -3828,21 +3974,21 @@ msgstr "Nebyl nalezen nezbytný tag %u."
 msgid "File is truncated."
 msgstr "Soubor je uříznutý."
 
-#: modules/file/gwytiff.h:1044
+#: modules/file/gwytiff.h:1047
 msgid "Non-uniform bits per sample are unsupported."
 msgstr "Nestejné počty bitů na vzorek nejsou podporovány."
 
-#: modules/file/gwytiff.h:1071
+#: modules/file/gwytiff.h:1074 modules/file/zeisslsm.c:973
 #, c-format
 msgid "Compression type %u is not supported."
 msgstr "Komprese typu %u není podporována."
 
-#: modules/file/gwytiff.h:1077
+#: modules/file/gwytiff.h:1080
 #, c-format
 msgid "Planar configuration %u is not supported."
 msgstr "Planární konfigurace %u není podporována."
 
-#: modules/file/gwytiff.h:1101
+#: modules/file/gwytiff.h:1104
 msgid "Unsupported sample format"
 msgstr "Nepodporovaný formát vzorku"
 
@@ -3879,7 +4025,7 @@ msgstr "Chyba CRC"
 msgid "Minizip error while reading the zip file: %s (%d)."
 msgstr "Chyba minizipu při načítání zip souboru: %s (%d)."
 
-#: modules/file/gwyzip.h:248
+#: modules/file/gwyzip.h:248 modules/file/jpkscan.c:2776
 #, c-format
 msgid "File %s is missing in the zip file."
 msgstr "V zip souboru schází soubor %s."
@@ -3914,8 +4060,8 @@ msgstr "Velikost dat %lu není násobek velikosti bodu %u."
 msgid "Export GXYZF"
 msgstr "Export jako GXYZF"
 
-#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:238
-#: modules/file/xyzexport.c:304
+#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:241
+#: modules/file/xyzexport.c:307
 msgid "XYZ data:"
 msgstr "XYZ data:"
 
@@ -4004,11 +4150,13 @@ msgstr "Š_kála Z:"
 msgid "Representable"
 msgstr "Representovatelný"
 
-#: modules/file/hdrimage.cc:480 modules/tools/stats.c:203
+#: modules/file/hdrimage.cc:480 modules/graph/graph_stats.c:146
+#: modules/tools/stats.c:203
 msgid "Minimum:"
 msgstr "Minimum:"
 
-#: modules/file/hdrimage.cc:496 modules/tools/stats.c:204
+#: modules/file/hdrimage.cc:496 modules/graph/graph_stats.c:147
+#: modules/tools/stats.c:204
 msgid "Maximum:"
 msgstr "Maximum:"
 
@@ -4027,12 +4175,12 @@ msgid "OpenEXR data type %u is invalid or unsupported."
 msgstr "OpenEXR datový typ %u je neplatný či nepodporovaný."
 
 #: modules/file/hdrimage.cc:1433 modules/file/hdrimage.cc:1442
-#: modules/file/imgexport.c:5249 modules/file/imgexport.c:5260
+#: modules/file/imgexport.c:5198 modules/file/imgexport.c:5209
 #, c-format
 msgid "libpng initialization error (in %s)"
 msgstr "Chyba při inicializaci knihovny libpng (v %s)"
 
-#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5324
+#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5273
 msgid "libpng error occurred"
 msgstr "chyba při použití knihovny libpng"
 
@@ -4050,11 +4198,6 @@ msgstr "Informace o obrázku"
 msgid "Horizontal size:"
 msgstr "Vodorovný rozměr:"
 
-#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
-#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
-msgid "px"
-msgstr "px"
-
 #: modules/file/hdrimage.cc:2252 modules/file/pixmap.c:826
 msgid "Vertical size:"
 msgstr "Svislý rozměr:"
@@ -4067,10 +4210,10 @@ msgstr "Kanály:"
 msgid "Pages:"
 msgstr "Strany:"
 
-#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3043
+#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3059
 #: modules/file/pixmap.c:862 modules/file/rawfile.c:649
-#: modules/process/dimensions.h:467 modules/xyz/xyz_drift.c:774
-#: modules/xyz/xyz_raster.c:566
+#: modules/process/dimensions.h:449 modules/xyz/xyz_drift.c:774
+#: modules/xyz/xyz_raster.c:535
 msgid "Physical Dimensions"
 msgstr "Fyzické rozměry"
 
@@ -4080,16 +4223,16 @@ msgstr "Fyzické rozměry"
 #: modules/process/calcoefs_new.c:408 modules/process/calcoefs_new.c:475
 #: modules/process/calcoefs_simple.c:391 modules/process/calcoefs_simple.c:458
 #: modules/process/calcoefs_view.c:511 modules/process/calcoefs_view.c:549
-#: modules/process/calibrate.c:466 modules/process/calibrate.c:549
-#: modules/process/dimensions.h:161 modules/process/volumize_layers.c:259
-#: modules/volume/volume_calibrate.c:414 modules/volume/volume_calibrate.c:441
-#: modules/volume/volume_calibrate.c:468 modules/volume/volume_calibrate.c:546
+#: modules/process/calibrate.c:459 modules/process/calibrate.c:514
+#: modules/process/dimensions.h:143 modules/process/volumize_layers.c:259
+#: modules/volume/volume_calibrate.c:409 modules/volume/volume_calibrate.c:429
+#: modules/volume/volume_calibrate.c:449 modules/volume/volume_calibrate.c:498
 msgid "verb|Change"
 msgstr "Změnit"
 
 #: modules/file/hdrimage.cc:2345 modules/file/pixmap.c:907
-#: modules/file/rawfile.c:694 modules/process/crosscor.c:263
-#: modules/process/dimensions.h:477
+#: modules/file/rawfile.c:694 modules/process/crosscor.c:260
+#: modules/process/dimensions.h:459
 msgid "H_eight:"
 msgstr "_Výška:"
 
@@ -4106,16 +4249,16 @@ msgstr "_Z-škála (na jednotku):"
 #: modules/file/hdrimage.cc:2557 modules/file/pixmap.c:1176
 #: modules/file/rawfile.c:1386 modules/process/calcoefs_new.c:819
 #: modules/process/calcoefs_simple.c:1197 modules/process/calcoefs_view.c:1380
-#: modules/process/calibrate.c:979 modules/process/dimensions.h:195
-#: modules/process/volumize_layers.c:315 modules/volume/volume_calibrate.c:1017
+#: modules/process/calibrate.c:1013 modules/process/dimensions.h:177
+#: modules/process/volumize_layers.c:314 modules/volume/volume_calibrate.c:957
 msgid "Change Units"
 msgstr "Změnit jednotky"
 
 #: modules/file/hdrimage.cc:2571 modules/file/pixmap.c:1190
 #: modules/file/rawfile.c:1400 modules/process/calcoefs_new.c:832
 #: modules/process/calcoefs_simple.c:1210 modules/process/calcoefs_view.c:1393
-#: modules/process/calibrate.c:993 modules/process/dimensions.h:208
-#: modules/process/volumize_layers.c:329 modules/volume/volume_calibrate.c:1031
+#: modules/process/calibrate.c:1027 modules/process/dimensions.h:190
+#: modules/process/volumize_layers.c:328 modules/volume/volume_calibrate.c:971
 msgid "New _units:"
 msgstr "Nové _jednotky:"
 
@@ -4159,131 +4302,131 @@ msgstr "Nelze načíst obrázek: %s."
 msgid "Field DataSize %ux%u does not match image dimensions %ux%u."
 msgstr "Položka DataSize %ux%u neodpovídá rozměrům obrázku %u×%u."
 
-#: modules/file/igorfile.c:200
+#: modules/file/igorfile.c:210
 msgid "Imports Igor binary waves (.ibw)."
 msgstr "Načítá binární vlny programu Igor (.ibw)"
 
-#: modules/file/igorfile.c:213
+#: modules/file/igorfile.c:223
 msgid "Igor binary waves (.ibw)"
 msgstr "Igor binární vlny (.ibw)"
 
-#: modules/file/igorfile.c:273
+#: modules/file/igorfile.c:283
 #, c-format
 msgid "Format version is %d.  Only version 5 is supported."
 msgstr "Verze formátu souboru je %d.  Pouze verze 5 je podporována."
 
-#: modules/file/igorfile.c:294
+#: modules/file/igorfile.c:305
 msgid "Only two-dimensional data are supported."
 msgstr "Jsou podporována pouze dvourozměrná data."
 
-#: modules/file/igorfile.c:306
+#: modules/file/igorfile.c:317
 #, c-format
 msgid "Number of data points %u does not match resolutions %u×%u×%u."
 msgstr "Počet datových bodů %u neodpovídá rozlišením %u×%u×%u."
 
-#: modules/file/igorfile.c:320
+#: modules/file/igorfile.c:331
 #, c-format
 msgid "Data size %u does not match the number of data points %u×%u."
 msgstr "Velikost dat %u neodpovídá počtu datových bodů %u×%u."
 
-#: modules/file/igorfile.c:358
+#: modules/file/igorfile.c:369
 msgid "Cannot read channel labels."
 msgstr "Nelze přečíst popisky kanálů."
 
-#: modules/file/imgexport.c:392 modules/file/pixmap.c:178
+#: modules/file/imgexport.c:391 modules/file/pixmap.c:178
 msgid "Portable Network Graphics (.png)"
 msgstr "PNG obrázek (.png)"
 
-#: modules/file/imgexport.c:398 modules/file/pixmap.c:182
+#: modules/file/imgexport.c:397 modules/file/pixmap.c:182
 msgid "JPEG (.jpeg,.jpg)"
 msgstr "JPEG obrázek (.jpeg,.jpg)"
 
-#: modules/file/imgexport.c:404 modules/file/pixmap.c:186
+#: modules/file/imgexport.c:403 modules/file/pixmap.c:186
 msgid "TIFF (.tiff,.tif)"
 msgstr "TIFF obrázek (.tiff,.tif)"
 
-#: modules/file/imgexport.c:410 modules/file/pixmap.c:190
+#: modules/file/imgexport.c:409 modules/file/pixmap.c:190
 msgid "Portable Pixmap (.ppm,.pnm)"
 msgstr "Portable Pixmap (.ppm,.pnm)"
 
-#: modules/file/imgexport.c:416 modules/file/pixmap.c:194
+#: modules/file/imgexport.c:415 modules/file/pixmap.c:194
 msgid "Windows or OS2 Bitmap (.bmp)"
 msgstr "Bitmapa Windows či OS2 (.bmp)"
 
-#: modules/file/imgexport.c:422 modules/file/pixmap.c:198
+#: modules/file/imgexport.c:421 modules/file/pixmap.c:198
 msgid "TARGA (.tga,.targa)"
 msgstr "TARGA obrázek (.tga,.targa)"
 
-#: modules/file/imgexport.c:429
+#: modules/file/imgexport.c:428
 msgid "WebP (.webp)"
 msgstr "WebP (.webp)"
 
-#: modules/file/imgexport.c:437
+#: modules/file/imgexport.c:436
 msgid "Portable document format (.pdf)"
 msgstr "Portable document format (.pdf)"
 
-#: modules/file/imgexport.c:445
+#: modules/file/imgexport.c:444
 msgid "Encapsulated PostScript (.eps)"
 msgstr "Encapsulated PostScript (.eps)"
 
-#: modules/file/imgexport.c:453
+#: modules/file/imgexport.c:452
 msgid "Scalable Vector Graphics (.svg)"
 msgstr "Scalable Vector Graphics (.svg)"
 
-#: modules/file/imgexport.c:463 modules/tools/selectionmanager.c:269
+#: modules/file/imgexport.c:462 modules/tools/selectionmanager.c:269
 msgid "Horiz./vert. lines"
 msgstr "Vodorov./svis. čáry"
 
-#: modules/file/imgexport.c:467 modules/tools/selectionmanager.c:270
+#: modules/file/imgexport.c:466 modules/tools/selectionmanager.c:270
 msgid "Ellipses"
 msgstr "Elipsy"
 
-#: modules/file/imgexport.c:471 modules/tools/selectionmanager.c:272
+#: modules/file/imgexport.c:470 modules/tools/selectionmanager.c:272
 msgid "Lines"
 msgstr "Čáry"
 
-#: modules/file/imgexport.c:479 modules/tools/selectionmanager.c:275
+#: modules/file/imgexport.c:478 modules/tools/selectionmanager.c:275
 msgid "Rectangles"
 msgstr "Obdélníky"
 
-#: modules/file/imgexport.c:483 modules/process/lat_synth.c:565
+#: modules/file/imgexport.c:482 modules/process/lat_synth.c:565
 #: modules/process/lat_synth.c:637 modules/tools/selectionmanager.c:271
 msgid "Lattice"
 msgstr "Mřížka"
 
-#: modules/file/imgexport.c:487
+#: modules/file/imgexport.c:486
 msgid "Path"
 msgstr "Cesta"
 
-#: modules/file/imgexport.c:493 modules/file/imgexport.c:499
+#: modules/file/imgexport.c:492 modules/file/imgexport.c:498
 msgid "ruler|_None"
 msgstr "Žád_né"
 
-#: modules/file/imgexport.c:494
+#: modules/file/imgexport.c:493
 msgid "_Rulers"
 msgstr "_Pravítka"
 
-#: modules/file/imgexport.c:495
+#: modules/file/imgexport.c:494
 msgid "_Inset scale bar"
 msgstr "_Vložené měřítko"
 
-#: modules/file/imgexport.c:500
+#: modules/file/imgexport.c:499
 msgid "_False color ruler"
 msgstr "Škála _falešných barev"
 
-#: modules/file/imgexport.c:504
+#: modules/file/imgexport.c:503
 msgid "title|None"
 msgstr "Žádný"
 
-#: modules/file/imgexport.c:505
+#: modules/file/imgexport.c:504
 msgid "At the top"
 msgstr "Nahoře"
 
-#: modules/file/imgexport.c:506
+#: modules/file/imgexport.c:505
 msgid "Along the right edge"
 msgstr "Podél pravé hrany"
 
-#: modules/file/imgexport.c:512
+#: modules/file/imgexport.c:511
 msgid ""
 "Renders data into vector (SVG, PDF, EPS) and pixmap (PNG, JPEG, TIFF, WebP, "
 "PPM, BMP, TARGA) images. Export to some formats relies on GDK and other "
@@ -4293,56 +4436,57 @@ msgstr ""
 "WebP, PPM, TARGA, GIF) obrázků. Export do některých formátů se spoléhá na "
 "GDK a další knihovny, tudíž se může u různých instalací lišit."
 
-#: modules/file/imgexport.c:2931
+#: modules/file/imgexport.c:2933
 msgid "Select Color"
 msgstr "Vybrat barvu"
 
-#: modules/file/imgexport.c:3002
-msgid "Black"
-msgstr "Černá"
-
-#: modules/file/imgexport.c:3010
+#: modules/file/imgexport.c:3005
 msgid "White"
 msgstr "Bílá"
 
-#: modules/file/imgexport.c:3053
+#: modules/file/imgexport.c:3014
+msgid "Black"
+msgstr "Černá"
+
+#: modules/file/imgexport.c:3069
 msgid "Pi_xel size:"
 msgstr "Velikost pi_xelu:"
 
-#: modules/file/imgexport.c:3062
+#: modules/file/imgexport.c:3077
 msgid "Pixels per _inch:"
 msgstr "Pixelů na pa_lec:"
 
-#: modules/file/imgexport.c:3089
+#: modules/file/imgexport.c:3102
 msgid "_Zoom:"
 msgstr "_Zvětšení"
 
-#: modules/file/imgexport.c:3108 modules/process/bdep_synth.c:430
+#: modules/file/imgexport.c:3120 modules/process/bdep_synth.c:430
 #: modules/process/col_synth.c:486 modules/process/diff_synth.c:508
-#: modules/process/domain_synth.c:510 modules/process/grain_mark.c:285
-#: modules/process/lat_synth.c:753 modules/process/obj_synth.c:575
-#: modules/process/pat_synth.c:852 modules/process/pat_synth.c:1154
-#: modules/process/pat_synth.c:1489 modules/process/tip_blind.c:340
+#: modules/process/domain_synth.c:510 modules/process/fibre_synth.c:540
+#: modules/process/grain_mark.c:284 modules/process/lat_synth.c:753
+#: modules/process/obj_synth.c:573 modules/process/pat_synth.c:853
+#: modules/process/pat_synth.c:1155 modules/process/pat_synth.c:1490
+#: modules/process/phase_synth.c:298 modules/process/tip_blind.c:342
 msgid "_Height:"
 msgstr "_Výška:"
 
-#: modules/file/imgexport.c:3121
+#: modules/file/imgexport.c:3136
 msgid "_Font:"
 msgstr "_Písmo:"
 
-#: modules/file/imgexport.c:3140
+#: modules/file/imgexport.c:3145
 msgid "_Font size:"
 msgstr "Ve_likost písma"
 
-#: modules/file/imgexport.c:3160
+#: modules/file/imgexport.c:3163
 msgid "O_utline thickness:"
 msgstr "Tloušťka obr_ysu:"
 
-#: modules/file/imgexport.c:3170
+#: modules/file/imgexport.c:3172
 msgid "_Border width:"
 msgstr "Šířka okra_je:"
 
-#: modules/file/imgexport.c:3180
+#: modules/file/imgexport.c:3181
 msgid "_Tick length:"
 msgstr "_Délka značek:"
 
@@ -4362,219 +4506,220 @@ msgstr "Barvy"
 msgid "_Line and text color:"
 msgstr "Barva čar a te_xtu:"
 
-#: modules/file/imgexport.c:3221
+#: modules/file/imgexport.c:3220
 msgid "_Transparent background"
 msgstr "_Transparentní pozadí"
 
-#: modules/file/imgexport.c:3232
+#: modules/file/imgexport.c:3231
 msgid "_Background color:"
 msgstr "Barva _pozadí:"
 
-#: modules/file/imgexport.c:3474
-msgid "Lateral scale"
-msgstr "Příčná škála"
-
-#: modules/file/imgexport.c:3487 modules/process/lno_synth.c:1053
-msgid "_Length:"
-msgstr "_Délka:"
-
-#: modules/file/imgexport.c:3503
-msgid "_Auto"
-msgstr "_Auto"
-
-#: modules/file/imgexport.c:3511 modules/process/pat_synth.c:469
+#: modules/file/imgexport.c:3433 modules/process/fibre_synth.c:582
+#: modules/process/pat_synth.c:470
 msgid "Placement"
 msgstr "Umístění"
 
-#: modules/file/imgexport.c:3515
+#: modules/file/imgexport.c:3437
 msgid "left"
 msgstr "vlevo"
 
-#: modules/file/imgexport.c:3519
+#: modules/file/imgexport.c:3440
 msgid "center"
 msgstr "uprostřed"
 
-#: modules/file/imgexport.c:3523
+#: modules/file/imgexport.c:3443
 msgid "right"
 msgstr "vpravo"
 
-#: modules/file/imgexport.c:3528
+#: modules/file/imgexport.c:3448
 msgid "top"
 msgstr "nahoře"
 
-#: modules/file/imgexport.c:3540
+#: modules/file/imgexport.c:3456
 msgid "bottom"
 msgstr "dole"
 
-#: modules/file/imgexport.c:3552 modules/file/imgexport.c:3874
+#: modules/file/imgexport.c:3479
+msgid "Lateral scale"
+msgstr "Příčná škála"
+
+#: modules/file/imgexport.c:3496 modules/process/lno_synth.c:1053
+msgid "_Length:"
+msgstr "_Délka:"
+
+#: modules/file/imgexport.c:3502
+msgid "_Auto"
+msgstr "_Auto"
+
+#: modules/file/imgexport.c:3519 modules/file/imgexport.c:3832
 msgid "Hori_zontal gap:"
 msgstr "_Vodorovná mezera:"
 
-#: modules/file/imgexport.c:3558 modules/file/imgexport.c:3854
+#: modules/file/imgexport.c:3526 modules/file/imgexport.c:3812
 msgid "_Vertical gap:"
 msgstr "_Svislá mezera:"
 
-#: modules/file/imgexport.c:3571 modules/file/imgexport.c:4184
+#: modules/file/imgexport.c:3538 modules/file/imgexport.c:4134
 msgid "Colo_r:"
 msgstr "_Barva:"
 
-#: modules/file/imgexport.c:3576 modules/file/imgexport.c:4189
+#: modules/file/imgexport.c:3542 modules/file/imgexport.c:4138
 msgid "Out_line color:"
 msgstr "Barva obr_ysu:"
 
-#: modules/file/imgexport.c:3580 modules/file/imgexport.c:4195
+#: modules/file/imgexport.c:3547 modules/file/imgexport.c:4143
 msgid "O_pacity:"
 msgstr "O_pacita:"
 
-#: modules/file/imgexport.c:3589
+#: modules/file/imgexport.c:3554
 msgid "Draw _ticks"
 msgstr "Kreslit čárk_y"
 
-#: modules/file/imgexport.c:3599
+#: modules/file/imgexport.c:3564
 msgid "Draw _label"
 msgstr "Kreslit _popisek"
 
-#: modules/file/imgexport.c:3609
+#: modules/file/imgexport.c:3574
 msgid "Draw text _above scale bar"
 msgstr "Kreslit text _nad měřítko"
 
-#: modules/file/imgexport.c:3773
+#: modules/file/imgexport.c:3738
 msgid "Image"
 msgstr "Obraz"
 
-#: modules/file/imgexport.c:3777 modules/process/calcoefs_view.c:473
-#: modules/process/correct_affine.c:488 modules/process/drift.c:297
-#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:202
-#: modules/process/fft_filter_1d.c:294 modules/process/fft_profile.c:292
-#: modules/process/fractal.c:253 modules/process/nanoindent_adjust.c:229
-#: modules/process/polydistort.c:247 modules/process/rotate.c:274
-#: modules/process/scale.c:253 modules/process/straighten_path.c:271
+#: modules/file/imgexport.c:3742 modules/process/calcoefs_view.c:473
+#: modules/process/correct_affine.c:538 modules/process/drift.c:298
+#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:203
+#: modules/process/fft_filter_1d.c:296 modules/process/fft_profile.c:293
+#: modules/process/fractal.c:262 modules/process/nanoindent_adjust.c:229
+#: modules/process/polydistort.c:250 modules/process/rotate.c:274
+#: modules/process/scale.c:257 modules/process/straighten_path.c:270
 #: modules/process/unrotate.c:277 modules/tools/linestats.c:400
-#: modules/tools/profile.c:555 modules/tools/roughness.c:864
-#: modules/tools/sfunctions.c:468 modules/xyz/xyz_raster.c:632
+#: modules/tools/profile.c:552 modules/tools/roughness.c:879
+#: modules/tools/sfunctions.c:481 modules/xyz/xyz_raster.c:601
 msgid "_Interpolation type:"
 msgstr "Typ _interpolace:"
 
-#: modules/file/imgexport.c:3807
+#: modules/file/imgexport.c:3772
 msgid "Draw _frame"
 msgstr "Kreslit orá_mování"
 
-#: modules/file/imgexport.c:3816
+#: modules/file/imgexport.c:3781
 msgid "Draw _mask"
 msgstr "Nakreslit _masku"
 
-#: modules/file/imgexport.c:3826
+#: modules/file/imgexport.c:3791
 msgid "Draw mask _legend"
 msgstr "Kreslit _legendu masky"
 
-#: modules/file/imgexport.c:3861
+#: modules/file/imgexport.c:3819
 msgid "Value Scale"
 msgstr "Škála hodnot"
 
-#: modules/file/imgexport.c:3882
+#: modules/file/imgexport.c:3840
 msgid "Fi_xed precision:"
 msgstr "Pe_vná přesnost:"
 
-#: modules/file/imgexport.c:3898
+#: modules/file/imgexport.c:3855
 msgid "Fixed _kilo threshold:"
 msgstr "Pevný práh pro _kilo:"
 
-#: modules/file/imgexport.c:3914 modules/file/imgexport.c:4635
+#: modules/file/imgexport.c:3869 modules/file/imgexport.c:4583
 msgid "Title"
 msgstr "Název"
 
-#: modules/file/imgexport.c:3918
+#: modules/file/imgexport.c:3877
 msgid "Posi_tion:"
 msgstr "Polo_ha:"
 
-#: modules/file/imgexport.c:3934
+#: modules/file/imgexport.c:3884
 msgid "_Gap:"
 msgstr "_Mezera:"
 
-#: modules/file/imgexport.c:3941
+#: modules/file/imgexport.c:3891
 msgid "Put _units to title"
 msgstr "Umístit _jednotky do názvu"
 
-#: modules/file/imgexport.c:4125
+#: modules/file/imgexport.c:4075
 msgid "Draw _selection"
 msgstr "Nakreslit _výběr"
 
-#: modules/file/imgexport.c:4176 modules/tools/selectionmanager.c:361
+#: modules/file/imgexport.c:4126 modules/tools/selectionmanager.c:361
 msgid "Objects"
 msgstr "Objekty"
 
-#: modules/file/imgexport.c:4615
+#: modules/file/imgexport.c:4563
 msgid "Lateral"
 msgstr "Podélné měřítko"
 
-#: modules/file/imgexport.c:4654 modules/file/rawfile.c:1040
-#: modules/process/calcoefs_load.c:230 modules/process/neural.c:693
+#: modules/file/imgexport.c:4602 modules/file/rawfile.c:1040
+#: modules/process/calcoefs_load.c:230 modules/process/neural.c:700
 msgid "verb|_Load"
 msgstr "_Načíst"
 
-#: modules/file/imgexport.c:4660 modules/file/rawfile.c:1046
-#: modules/process/neural.c:699
+#: modules/file/imgexport.c:4608 modules/file/rawfile.c:1046
+#: modules/process/neural.c:706
 msgid "verb|_Store"
 msgstr "_Uložit"
 
-#: modules/file/imgexport.c:4666 modules/file/rawfile.c:1052
-#: modules/process/neural.c:705
+#: modules/file/imgexport.c:4614 modules/file/rawfile.c:1052
+#: modules/process/neural.c:712
 msgid "_Rename"
 msgstr "_Přejmenovat"
 
-#: modules/file/imgexport.c:4686 modules/file/rawfile.c:1071
+#: modules/file/imgexport.c:4634 modules/file/rawfile.c:1071
 msgid "Preset _name:"
 msgstr "_Jméno předvolby:"
 
-#: modules/file/imgexport.c:4757
+#: modules/file/imgexport.c:4705
 #, c-format
 msgid "Export %s"
 msgstr "Export %s"
 
-#: modules/file/imgexport.c:4778
+#: modules/file/imgexport.c:4727
 msgid "Export as 1_6 bit grayscale"
 msgstr "Exportovat s 16bitovou hloubkou"
 
-#: modules/file/imgexport.c:4801
+#: modules/file/imgexport.c:4750
 msgid "Lateral Scale"
 msgstr "Příčná škála"
 
-#: modules/file/imgexport.c:4806
+#: modules/file/imgexport.c:4755
 msgid "Values"
 msgstr "Hodnoty"
 
-#: modules/file/imgexport.c:4811
+#: modules/file/imgexport.c:4760
 msgid "Selection"
 msgstr "Výběr"
 
-#: modules/file/imgexport.c:4816 modules/file/rawfile.c:462
+#: modules/file/imgexport.c:4765 modules/file/rawfile.c:462
 #: modules/process/convolution_filter.c:275
 msgid "Presets"
 msgstr "Předvolby"
 
-#: modules/file/imgexport.c:5576
+#: modules/file/imgexport.c:5525
 #, c-format
 msgid "Cairo error occurred: %s"
 msgstr "Chyba při použití knihovny cairo: %s"
 
-#: modules/file/imgexport.c:5600
+#: modules/file/imgexport.c:5549
 #, c-format
 msgid "Pixbuf save failed: %s."
 msgstr "Uložení pixbufu se nezdařilo: %s."
 
-#: modules/file/imgexport.c:5878
+#: modules/file/imgexport.c:5827
 msgid "Image is too large to be stored as TARGA."
 msgstr "Obrázek je příliš velký, než aby šel uložit jako TARGA."
 
-#: modules/file/imgexport.c:6457 modules/file/imgexport.c:6486
+#: modules/file/imgexport.c:6406 modules/file/imgexport.c:6435
 msgid "Draw _numbers"
 msgstr "Kr_eslit čísla"
 
-#: modules/file/imgexport.c:6469 modules/file/imgexport.c:6517
+#: modules/file/imgexport.c:6418 modules/file/imgexport.c:6466
 msgid "_End marker length:"
 msgstr "Délka koncových _značek:"
 
-#: modules/file/imgexport.c:6498
+#: modules/file/imgexport.c:6447
 msgid "Marker _radius:"
 msgstr "_Poloměr značky:"
 
@@ -4614,47 +4759,58 @@ msgstr "Množina parametrových tagů je neúplná."
 msgid "image depth"
 msgstr "hloubka obrázku"
 
-#: modules/file/iso28600.c:534
+#: modules/file/iso28600.c:543
 msgid "Imports and exports ISO 28600:2011 SPM data transfer format."
 msgstr "Načítá a exportuje soubory ISO 28600:2011 SPM data transfer format."
 
-#: modules/file/iso28600.c:550
+#: modules/file/iso28600.c:559
 msgid "ISO 28600:2011 SPM data transfer files (.spm)"
 msgstr "ISO 28600:2011 SPM data transfer soubory (.spm)"
 
-#: modules/file/iso28600.c:606
+#: modules/file/iso28600.c:658
 #, c-format
-msgid "Only regular mappings are implemented but file has mapping type ‘%s’."
+msgid ""
+"Only regular and irregular mappings are implemented but the file has mapping "
+"type ‘%s’."
 msgstr ""
-"Jsou implementována pouze pravidelná mapování, ale soubor má mapování typu "
-"‚%s‘."
+"Jsou implementována pouze pravidelná a nepravidelná mapování, ale soubor má "
+"mapování typu ‚%s‘."
 
-#: modules/file/iso28600.c:668 modules/file/iso28600.c:677
-#: modules/file/iso28600.c:686
+#: modules/file/iso28600.c:687 modules/file/iso28600.c:696
+#: modules/file/iso28600.c:705
 #, c-format
 msgid "List ‘%s’ has %u items which differs from the number %u given by ‘%s’."
 msgstr "Seznam ‚%s‘ má %u položek, což se liší od počtu %u daného ‚%s‘."
 
-#: modules/file/iso28600.c:755 modules/file/iso28600.c:867
-#: modules/file/sdfile.c:846 modules/file/sdfile.c:863
-#: modules/file/spip-asc.c:239 modules/file/witec-asc.c:223
-#: modules/file/wsffile.c:215
+#: modules/file/iso28600.c:775
+#, c-format
+msgid "End of file reached when reading sample #%u of %u"
+msgstr "Soubor skončil při čtení vzorku č. %u z %u."
+
+#: modules/file/iso28600.c:784 modules/file/iso28600.c:873
+#, c-format
+msgid "Malformed data encountered when reading sample #%u"
+msgstr "Při čtení vzorku č. %u se narazilo na vadná data."
+
+#: modules/file/iso28600.c:797 modules/file/iso28600.c:887
+#: modules/file/iso28600.c:1022
+msgid "Missing end-of-data marker."
+msgstr "Chybí značka konce dat."
+
+#: modules/file/iso28600.c:1003 modules/file/sdfile.c:846
+#: modules/file/sdfile.c:863 modules/file/spip-asc.c:239
+#: modules/file/witec-asc.c:223 modules/file/wsffile.c:215
 #, c-format
 msgid "End of file reached when reading sample #%d of %d"
 msgstr "Soubor skončil při čtení vzorku č. %d z %d."
 
-#: modules/file/iso28600.c:764 modules/file/iso28600.c:876
-#: modules/file/spip-asc.c:246 modules/file/witec-asc.c:230
-#: modules/file/wsffile.c:222
+#: modules/file/iso28600.c:1012 modules/file/spip-asc.c:246
+#: modules/file/witec-asc.c:230 modules/file/wsffile.c:222
 #, c-format
 msgid "Malformed data encountered when reading sample #%d of %d"
 msgstr "Při čtení vzorku č. %d z %d se narazilo na vadná data."
 
-#: modules/file/iso28600.c:774 modules/file/iso28600.c:886
-msgid "Missing end-of-data marker."
-msgstr "Chybí značka konce dat."
-
-#: modules/file/iso28600.c:1048
+#: modules/file/iso28600.c:1184
 #, c-format
 msgid "Line %u does not contain mandatory label ‘%s’."
 msgstr "Řádek %u neobsahuje povinný popisek ‚%s‘."
@@ -4671,42 +4827,60 @@ msgstr "JEOL datové soubory (.tif)"
 msgid "The type of data is unknown.  Please report it to the developers."
 msgstr "Typ dat je neznámý.  Nahlaš ho prosím vývojářům."
 
-#: modules/file/jpkscan.c:229
+#: modules/file/jpkscan.c:292
 msgid "Imports JPK image scans."
 msgstr "Načítá skeny ve formátu JPK."
 
-#: modules/file/jpkscan.c:242
+#: modules/file/jpkscan.c:305
 msgid "JPK image scans (.jpk, .jpk-qi-image)"
 msgstr "JPK obrázkový sken (.jpk, .jpk-qi-image)"
 
-#: modules/file/jpkscan.c:249
+#: modules/file/jpkscan.c:312
 msgid "JPK force curves (.jpk-force, .jpk-force-map, .jpk-qi-data)"
 msgstr "JPK silové křivky (.jpk-force, .jpk-force-map, .jpk-qi-data)"
 
-#: modules/file/jpkscan.c:315
+#: modules/file/jpkscan.c:378
 msgid "File does not contain grid dimensions."
 msgstr "Soubor neobsahuje rozměry mřížky."
 
-#: modules/file/jpkscan.c:660 modules/file/nanoobserver.c:193
+#: modules/file/jpkscan.c:736 modules/file/nanoobserver.c:360
 #: modules/file/nanoscantech.c:205 modules/file/opengps.c:209
 #: modules/file/sensofarx.c:183 modules/file/spmxfile.c:166
 msgid "Minizip cannot open the file as a ZIP file."
 msgstr "Minizip nedokáže otevřít soubor coby soubor ZIP."
 
-#: modules/file/jpkscan.c:739
+#: modules/file/jpkscan.c:758 modules/file/jpkscan.c:2717
+#, c-format
+msgid "Scanning file (%u curves)..."
+msgstr "Prohledávám soubor (%u křivek)..."
+
+#: modules/file/jpkscan.c:798 modules/file/nmmxyz.c:299
+msgid "Reading files..."
+msgstr "Načítám soubory..."
+
+#: modules/file/jpkscan.c:816
+msgid "Creating volume data..."
+msgstr "Vytvářím objemová data..."
+
+#: modules/file/jpkscan.c:968
 msgid "Non-uniform point and/or segment numbering is not supported."
 msgstr "Neuniformní číslování bodů a/nebo segmentů není podporováno."
 
-#: modules/file/jpkscan.c:748
+#: modules/file/jpkscan.c:977
 msgid "Non-uniform channel lists are not supported."
 msgstr "Neuniformní seznamy kanálů nejsou podporovány."
 
-#: modules/file/jpkscan.c:756
+#: modules/file/jpkscan.c:985
 #, c-format
 msgid "Data file %s was found instead of expected %s."
 msgstr "Datový soubor %s byl nalezen namísto očekávaného %s."
 
-#: modules/file/jpkscan.c:1497
+#: modules/file/jpkscan.c:1900
+#, c-format
+msgid "Header properties file for index %u is missing."
+msgstr "Chybí hlavičkový soubor s nastaveními pro index %u."
+
+#: modules/file/jpkscan.c:2519
 msgid "Cannot find any height channel."
 msgstr "Nemohu najít žádný výškový kanál."
 
@@ -4857,19 +5031,19 @@ msgstr "MetroPro soubory (.dat)"
 msgid "File header is larger than file."
 msgstr "Hlavička souboru je větší než soubor."
 
-#: modules/file/microprof.c:117
+#: modules/file/microprof.c:125
 msgid "Imports MicroProf FRT profilometer data files."
 msgstr "Načítá datové soubory profilometru MicroProf FRT."
 
-#: modules/file/microprof.c:130
+#: modules/file/microprof.c:138
 msgid "MicroProf FRT files (.frt)"
 msgstr "MicroProf FRT soubory (.frt)"
 
-#: modules/file/microprof.c:136
+#: modules/file/microprof.c:144
 msgid "MicroProf FRT text files (.txt)"
 msgstr "MicroProf FRT textové soubory (.txt)"
 
-#: modules/file/microprof.c:432
+#: modules/file/microprof.c:519
 msgid "File contains fewer than XSize*YSize data points."
 msgstr "Soubor obsahuje méně než XSize*YSize datových bodů."
 
@@ -4957,8 +5131,8 @@ msgstr "Data obrázku začínají za koncem souboru."
 msgid "Spectra data starts past the end of file."
 msgstr "Data spekter začínají za koncem souboru."
 
-#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:276
-#: modules/file/renishaw.c:1325 modules/file/sensofar.c:256
+#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:287
+#: modules/file/renishaw.c:1334 modules/file/sensofar.c:256
 #: modules/file/witec-asc.c:161
 msgid "File header is truncated"
 msgstr "Hlavička souboru je uříznutá."
@@ -4968,8 +5142,8 @@ msgstr "Hlavička souboru je uříznutá."
 msgid "Parameter header is truncated"
 msgstr "Parametrová hlavička je uříznutá."
 
-#: modules/file/nanoeducator.c:932 modules/process/curvature.c:454
-#: modules/tools/profile.c:1107
+#: modules/file/nanoeducator.c:932 modules/process/curvature.c:456
+#: modules/tools/profile.c:1090
 #, c-format
 msgid "Profile %d"
 msgstr "Profil %d"
@@ -5049,23 +5223,27 @@ msgstr "Řádek DATA_INFO obsahuje méně než %d položek."
 msgid "Missing data start marker \\x1a\\x04."
 msgstr "Schází značka začátku dat \\x1a\\x04."
 
-#: modules/file/nanoobserver.c:113
-msgid "Reads NanoObserver .nao files."
-msgstr "Načítá datové soubory .nao NanoObserveru."
+#: modules/file/nanoobserver.c:201
+msgid "Reads Nano-Solution/NanoObserver .nao files."
+msgstr "Načítá datové soubory .nao Nano-Solution/NanoObserveru."
+
+#: modules/file/nanoobserver.c:214
+msgid "Nano-Solution/NanoObserver data (.nao)"
+msgstr "Nano-Solution/NanoObserver data (.nao)"
 
-#: modules/file/nanoobserver.c:126
-msgid "NanoObserver data (.nao)"
-msgstr "NanoObserver data (.nao)"
+#: modules/file/nanoobserver.c:410 modules/file/renishaw.c:1420
+msgid "Data block is truncated"
+msgstr "Blok dat je předčasně ukončený."
 
-#: modules/file/nanoscan.c:188
+#: modules/file/nanoscan.c:191
 msgid "Imports NanoScan XML files."
 msgstr "Načítá XML datové soubory NanoScan."
 
-#: modules/file/nanoscan.c:201
+#: modules/file/nanoscan.c:204
 msgid "NanoScan XML files (.xml)"
 msgstr "NanoScan XML soubory (.xml)"
 
-#: modules/file/nanoscan.c:910
+#: modules/file/nanoscan.c:937
 msgid "Wrong size of Base64 encoded data."
 msgstr "Chybná velikost Base64-zakódovaných dat."
 
@@ -5085,22 +5263,22 @@ msgstr "Načítá datové soubory Digital Instruments Nanoscope II."
 msgid "Nanoscope II files"
 msgstr "Nanoscope II soubory."
 
-#: modules/file/nanoscope.c:207
+#: modules/file/nanoscope.c:212
 msgid ""
 "Imports Veeco (Digital Instruments) Nanoscope data files, version 3 or newer."
 msgstr ""
 "Načítá datové soubory Veeco (Digital Instruments) Nanoscope, verze 3 a "
 "novější."
 
-#: modules/file/nanoscope.c:221
+#: modules/file/nanoscope.c:226
 msgid "Nanoscope III files"
 msgstr "Nanoscope III soubory"
 
-#: modules/file/nanoscope.c:288
+#: modules/file/nanoscope.c:295
 msgid "File is not a Nanoscope file, or it is a unknown subtype."
 msgstr "Soubor není typu Nanoscope nebo je to neznámý podtyp."
 
-#: modules/file/nanoscope.c:295
+#: modules/file/nanoscope.c:302
 msgid ""
 "File has been damaged by change of line endings, resulting in corruption of "
 "the binary part of the file.\n"
@@ -5118,16 +5296,16 @@ msgstr ""
 "komprimované složky‘ v některých verzích MS Windows, případně jiným přenosem "
 "souboru, který se pokouší ukládat textové soubory nezávisle na systému."
 
-#: modules/file/nanoscope.c:653 modules/file/nanoscope.c:669
+#: modules/file/nanoscope.c:660 modules/file/nanoscope.c:676
 msgid "Cannot parse `Scan size' field."
 msgstr "Nedaří se analyzovat položku ‚Scan size‘."
 
-#: modules/file/nanoscope.c:1539 modules/file/nrrdfile.c:1086
+#: modules/file/nanoscope.c:1546 modules/file/nrrdfile.c:1086
 #, c-format
 msgid "Garbage after data sample #%u."
 msgstr "Po datovém vzorku č. %u následují nesmysly."
 
-#: modules/file/nanoscope.c:1595
+#: modules/file/nanoscope.c:1602
 msgid "Truncated header line."
 msgstr "Předčasně ukončený řádek hlavičky."
 
@@ -5204,11 +5382,8 @@ msgstr "Nano Measuring Machine soubory (*.dsc)"
 msgid "Nano Measuring Machine data import must be run as interactive."
 msgstr "Načítání dat Nano Measuring Machine musí být spuštěno interaktivně."
 
-#: modules/file/nmmxyz.c:299
-msgid "Reading files..."
-msgstr "Načítám soubory..."
-
 #: modules/file/nmmxyz.c:306 modules/process/lat_synth.c:1224
+#: modules/process/wave_synth.c:798
 msgid "Rendering surface..."
 msgstr "Vykresluji povrch..."
 
@@ -5241,20 +5416,20 @@ msgid "Plot point density map"
 msgstr "Vykreslit mapu hustoty bodů"
 
 #: modules/file/nmmxyz.c:534 modules/file/rawfile.c:626
-#: modules/process/dimensions.h:445 modules/xyz/xyz_drift.c:725
-#: modules/xyz/xyz_raster.c:517
+#: modules/process/dimensions.h:427 modules/xyz/xyz_drift.c:725
+#: modules/xyz/xyz_raster.c:376
 msgid "Resolution"
 msgstr "Rozlišení"
 
 #: modules/file/nmmxyz.c:538 modules/file/rawfile.c:631
-#: modules/process/dimensions.h:451 modules/xyz/xyz_drift.c:729
-#: modules/xyz/xyz_raster.c:521
+#: modules/process/dimensions.h:433 modules/xyz/xyz_drift.c:729
+#: modules/xyz/xyz_raster.c:382
 msgid "_Horizontal size:"
 msgstr "_Vodorovný rozměr:"
 
 #: modules/file/nmmxyz.c:554 modules/file/rawfile.c:638
-#: modules/process/dimensions.h:454 modules/xyz/xyz_drift.c:744
-#: modules/xyz/xyz_raster.c:536
+#: modules/process/dimensions.h:436 modules/xyz/xyz_drift.c:744
+#: modules/xyz/xyz_raster.c:388
 msgid "_Vertical size:"
 msgstr "_Svislý rozměr:"
 
@@ -5343,38 +5518,38 @@ msgstr "Položka hlavičky %s pro jednotlivé osy má příliš mnoho částí."
 msgid "Per-axis header field %s contains too few items."
 msgstr "Položka hlavičky %s pro jednotlivé osy má příliš málo částí."
 
-#: modules/file/nt-mdt.c:843
+#: modules/file/nt-mdt.c:850
 msgid "Imports NT-MDT data files."
 msgstr "Načítá datové soubory NT-MDT."
 
-#: modules/file/nt-mdt.c:856
+#: modules/file/nt-mdt.c:863
 msgid "NT-MDT files (.mdt)"
 msgstr "NT-MDT soubory (.mdt)"
 
-#: modules/file/nt-mdt.c:1491 modules/file/nt-mdt.c:1599
+#: modules/file/nt-mdt.c:1498 modules/file/nt-mdt.c:1606
 msgid "Frame is too short for Frame Mode."
 msgstr "Rám je příliš krátký pro daný Frame Mode."
 
-#: modules/file/nt-mdt.c:1506 modules/file/nt-mdt.c:1614
+#: modules/file/nt-mdt.c:1513 modules/file/nt-mdt.c:1621
 msgid "Frame is too short for dots or data."
 msgstr "Rám je příliš krátký pro body či data."
 
-#: modules/file/nt-mdt.c:1869
+#: modules/file/nt-mdt.c:1879
 #, c-format
 msgid "End of file reached in frame header #%u."
 msgstr "Soubor skončil v hlavičce rámu č. %u."
 
-#: modules/file/nt-mdt.c:1877
+#: modules/file/nt-mdt.c:1887
 #, c-format
 msgid "End of file reached in frame data #%u."
 msgstr "Soubor skončil v datech rámu č. %u."
 
-#: modules/file/nt-mdt.c:1910
+#: modules/file/nt-mdt.c:1920
 #, c-format
 msgid "Frame #%u is too short for scanned data header."
 msgstr "Rám č. %u je příliš krátký pro hlavičku dat skenu."
 
-#: modules/file/nt-mdt.c:1927
+#: modules/file/nt-mdt.c:1937
 #, c-format
 msgid "Frame #%u is too short for spectroscopy data header."
 msgstr "Rám č. %u je příliš krátký pro hlavičku spektroskopických dat."
@@ -5488,28 +5663,28 @@ msgstr "Omicron MATRIX (param.mtrx & data.mtrx)"
 msgid "Omicron MATRIX (.mtrx & .mtrx)"
 msgstr "Omicron MATRIX (.mtrx)"
 
-#: modules/file/opdfile.c:188
+#: modules/file/opdfile.c:199
 msgid "Imports Wyko OPD and ASC files."
 msgstr "Načítá Wyko OPD a ASC soubory."
 
-#: modules/file/opdfile.c:201
+#: modules/file/opdfile.c:212
 msgid "Wyko OPD files (.opd)"
 msgstr "Wyko OPD soubory (.opd)"
 
-#: modules/file/opdfile.c:208
+#: modules/file/opdfile.c:219
 msgid "Wyko ASCII export files (.asc)"
 msgstr "Wyko exportované ASCII soubory (.asc)"
 
-#: modules/file/opdfile.c:299
+#: modules/file/opdfile.c:310
 #, c-format
 msgid "Item `%s' is beyond the end of the file."
 msgstr "Položka ‚%s‘ zasahuje za konec souboru."
 
-#: modules/file/opdfile.c:614
+#: modules/file/opdfile.c:636
 msgid "Nested directories found"
 msgstr "Struktura obsahuje vnořené adresáře"
 
-#: modules/file/opdfile.c:805
+#: modules/file/opdfile.c:842
 #, c-format
 msgid "Truncated data in block %s"
 msgstr "Data v bloku %s jsou uříznutá"
@@ -5809,19 +5984,21 @@ msgstr "Formát dat"
 
 #: modules/file/rawfile.c:567 modules/process/arithmetic.c:234
 #: modules/process/calcoefs_view.c:320 modules/process/coerce.c:250
-#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:637
+#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:638
 #: modules/process/drift.c:242 modules/process/edge.c:635
-#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:183
-#: modules/process/grain_edge.c:210 modules/process/grain_filter.c:313
-#: modules/process/grain_mark.c:244 modules/process/grain_wshed.c:164
-#: modules/process/mark_disconn.c:205 modules/process/mark_with.c:195
-#: modules/process/polydistort.c:205 modules/process/scars.c:295
-#: modules/process/slope_dist.c:273 modules/process/straighten_path.c:198
-#: modules/process/synth.h:509 modules/process/tip_model.c:166
+#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:184
+#: modules/process/fractal.c:225 modules/process/grain_edge.c:209
+#: modules/process/grain_filter.c:312 modules/process/grain_mark.c:243
+#: modules/process/grain_wshed.c:165 modules/process/mark_disconn.c:205
+#: modules/process/mark_with.c:196 modules/process/mfm_field.c:278
+#: modules/process/mfm_shift.c:167 modules/process/polydistort.c:205
+#: modules/process/scars.c:314 modules/process/slope_dist.c:272
+#: modules/process/stitch.c:272 modules/process/straighten_path.c:198
+#: modules/process/synth.h:538 modules/process/tip_model.c:164
 #: modules/process/wpour_mark.c:273 modules/tools/linestats.c:454
-#: modules/tools/sfunctions.c:534 modules/tools/stats.c:459
-#: modules/volume/volume_extract.c:328 modules/volume/volume_linestat.c:287
-#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:443
+#: modules/tools/sfunctions.c:531 modules/tools/stats.c:456
+#: modules/volume/volume_extract.c:321 modules/volume/volume_linestat.c:292
+#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:457
 msgid "_Update"
 msgstr "_Aktualizovat"
 
@@ -5968,7 +6145,7 @@ msgstr ""
 "<b>Čtení selhalo</b>\n"
 "Obsah souboru `%s' neodpovídá formátu: %s."
 
-#: modules/file/rawfile.c:1690 modules/process/neural.c:1580
+#: modules/file/rawfile.c:1690 modules/process/neural.c:1587
 #, c-format
 msgid "The name `%s' is invalid."
 msgstr "Jméno ‚%s‘ je neplatné."
@@ -6071,7 +6248,8 @@ msgstr "XYZ data"
 msgid "Import XYZ Data"
 msgstr "Importovat XYZ data"
 
-#: modules/file/rawxyz.c:279
+#: modules/file/rawxyz.c:279 modules/graph/graph_stats.c:305
+#: modules/graph/graph_stats.c:756 modules/graph/graph_stats.c:800
 msgid "Number of points:"
 msgstr "Počet bodů:"
 
@@ -6091,7 +6269,7 @@ msgstr "Z-ový rozsah:"
 msgid "_Lateral units:"
 msgstr "_Jednotky rozměrů:"
 
-#: modules/file/rawxyz.c:386 modules/process/dimensions.h:494
+#: modules/file/rawxyz.c:386 modules/process/dimensions.h:479
 msgid "_Value units:"
 msgstr "Jednotky _hodnot:"
 
@@ -6107,18 +6285,14 @@ msgstr "Renishaw WiRE datové soubory (.wdf)"
 msgid "MapArea block is truncated"
 msgstr "Blok MapArea je předčasně ukončený"
 
-#: modules/file/renishaw.c:787
+#: modules/file/renishaw.c:793
 msgid "Random points order unsupported"
 msgstr "Náhodné pořadí bodů není podporováno."
 
-#: modules/file/renishaw.c:1396
+#: modules/file/renishaw.c:1405
 msgid "Block header is truncated"
 msgstr "Hlavička bloku je předčasně ukončená."
 
-#: modules/file/renishaw.c:1411
-msgid "Data block is truncated"
-msgstr "Blok dat je předčasně ukončený."
-
 #: modules/file/rhk-sm3.c:236
 msgid "Imports RHK Technology SM3 data files."
 msgstr "Načítá datové soubory RHK Technology typu SM3."
@@ -6380,19 +6554,23 @@ msgstr "Načítá datové soubory SPML (Scanning Probe Microscopy Markup Languag
 msgid "SPML files (.xml)"
 msgstr "SPML soubory (.xml)"
 
-#: modules/file/spmlab.c:131
+#: modules/file/spmlab.c:175
 msgid "Imports Thermicroscopes SpmLab R3 to R7 data files."
 msgstr "Načítá datové soubory Thermicroscopes SpmLab R3 až R7."
 
-#: modules/file/spmlab.c:144
+#: modules/file/spmlab.c:188
 msgid "Thermicroscopes SpmLab files"
 msgstr "Thermicroscopes SpmLab soubory"
 
-#: modules/file/spmlab.c:231
+#: modules/file/spmlab.c:259
 #, c-format
 msgid "Unknown format version %c."
 msgstr "Neznámá verze formátu: %c."
 
+#: modules/file/spmlab.c:283
+msgid "Data block is truncated."
+msgstr "Blok dat je předčasně ukončený."
+
 #: modules/file/spmlabf.c:79
 msgid "Imports SPMLab floating-point files."
 msgstr "Načítá datové soubory SPMLab ve formátu s plovoucí čárkou."
@@ -6588,11 +6766,11 @@ msgstr "Načítá datové soubory WinSTM (.stm)."
 msgid "WinSTM files (.stm)"
 msgstr "WinSTM soubory (.stm)"
 
-#: modules/file/wipfile.c:272
+#: modules/file/wipfile.c:281
 msgid "Imports WItec Project data files."
 msgstr "Načítá datové soubory WItec Project."
 
-#: modules/file/wipfile.c:285
+#: modules/file/wipfile.c:294
 msgid "WItec Project files (.wip)"
 msgstr "WItec Project soubory (.wip)"
 
@@ -6653,21 +6831,21 @@ msgstr "Exportuje data jako jednoduchý textový XYZ soubor."
 msgid "XYZ text data (.xyz)"
 msgstr "XYZ textová data (.xyz)"
 
-#: modules/file/xyzexport.c:244
+#: modules/file/xyzexport.c:247
 msgid "Lateral units:"
 msgstr "Jednotky rozměrů:"
 
-#: modules/file/xyzexport.c:290
+#: modules/file/xyzexport.c:293
 msgid "Export XYZ"
 msgstr "Export jako XYZ"
 
-#: modules/file/xyzexport.c:340 modules/process/curvature.c:704
+#: modules/file/xyzexport.c:343 modules/process/curvature.c:700
 #: modules/process/entropy.c:214 modules/process/facet-level.c:207
-#: modules/process/fit-shape.c:743 modules/process/level.c:259
-#: modules/process/linematch.c:906 modules/process/neural.c:593
-#: modules/process/polylevel.c:491 modules/process/slope_dist.c:418
-#: modules/tools/filter.c:300 modules/tools/linestats.c:436
-#: modules/tools/profile.c:591 modules/tools/sfunctions.c:516
+#: modules/process/fit-shape.c:755 modules/process/level.c:259
+#: modules/process/linematch.c:869 modules/process/neural.c:597
+#: modules/process/polylevel.c:494 modules/process/slope_dist.c:411
+#: modules/tools/filter.c:301 modules/tools/linestats.c:436
+#: modules/tools/profile.c:572 modules/tools/sfunctions.c:513
 #: modules/tools/stats.c:389
 msgid "Masking Mode"
 msgstr "Maska"
@@ -6680,6 +6858,14 @@ msgstr "Načítá SEM obrázky Carl Zeiss."
 msgid "Carl Zeiss SEM scans (.tif)"
 msgstr "Carl Zeiss SEM obrázky (.tif)"
 
+#: modules/file/zeisslsm.c:383
+msgid "Imports Carl Zeiss CLSM images."
+msgstr "Načítá CLSM obrázky Carl Zeiss."
+
+#: modules/file/zeisslsm.c:396
+msgid "Carl Zeiss CLSM images (.lsm)"
+msgstr "Carl Zeiss CLSM obrázky (.lsm)"
+
 #: modules/file/zemax.c:72
 msgid "Imports Zemax grid sag data files."
 msgstr "Načítá datové soubory Zemax grid sag."
@@ -6702,15 +6888,15 @@ msgstr "Kód jednotek %d je neplatný či nepodporovaný."
 msgid "The first line contains too many items."
 msgstr "První řádek obsahuje příliš mnoho položek."
 
-#: modules/graph/graph_align.c:57
+#: modules/graph/graph_align.c:60
 msgid "Aligns graph curves."
 msgstr "Zarovnává křivky grafu."
 
-#: modules/graph/graph_align.c:71
+#: modules/graph/graph_align.c:74
 msgid "/_Align"
 msgstr "/_Zarovnat"
 
-#: modules/graph/graph_align.c:74
+#: modules/graph/graph_align.c:77
 msgid "Align curves"
 msgstr "Zarovnání křivek grafu"
 
@@ -6726,48 +6912,50 @@ msgstr "/_Kritická dimenze..."
 msgid "Fit critical dimension"
 msgstr "Proložení kritické dimenze"
 
-#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:267
+#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:270
 msgid "Fit Graph"
 msgstr "Proložení funkce grafem"
 
-#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:251
-#: modules/graph/graph_fit.c:270 modules/process/fit-shape.c:393
+#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:254
+#: modules/graph/graph_fit.c:273 modules/process/fit-shape.c:394
 #: modules/volume/volume_fdfit.c:299
 msgid "verb|_Fit"
 msgstr "_Proložit"
 
-#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:166
-#: modules/graph/graph_fdfit.c:306 modules/graph/graph_fit.c:325
-#: modules/graph/graph_peaks.c:199
+#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:168
+#: modules/graph/graph_fdfit.c:313 modules/graph/graph_fit.c:332
+#: modules/graph/graph_peaks.c:199 modules/graph/graph_stats.c:268
 msgid "_Graph curve:"
 msgstr "_Křivka grafu:"
 
-#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:320
-#: modules/graph/graph_fit.c:339 modules/volume/volume_fdfit.c:405
+#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:327
+#: modules/graph/graph_fit.c:346 modules/volume/volume_fdfit.c:389
 msgid "F_unction:"
 msgstr "_Funkce:"
 
-#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:361
-#: modules/graph/graph_fit.c:375 modules/process/curvature.c:745
-#: modules/process/fit-shape.c:792 modules/volume/volume_fdfit.c:446
+#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:368
+#: modules/graph/graph_fit.c:382 modules/process/curvature.c:742
+#: modules/process/fit-shape.c:804 modules/volume/volume_fdfit.c:422
 msgid "Parameter"
 msgstr "Parametr"
 
-#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:363
-#: modules/graph/graph_fit.c:377 modules/process/fit-shape.c:794
-#: modules/volume/volume_fdfit.c:448
+#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:370
+#: modules/graph/graph_fit.c:384 modules/process/fit-shape.c:806
+#: modules/volume/volume_fdfit.c:424
 msgid "Error"
 msgstr "Chyba"
 
-#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:196
-#: modules/graph/graph_fdfit.c:415 modules/graph/graph_fit.c:433
-#: modules/volume/volume_fdfit.c:500 modules/volume/volume_linestat.c:389
+#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:189
+#: modules/graph/graph_fdfit.c:422 modules/graph/graph_fit.c:440
+#: modules/graph/graph_stats.c:279 modules/graph/graph_stats.c:793
+#: modules/volume/volume_fdfit.c:476 modules/volume/volume_linestat.c:394
 msgid "Range:"
 msgstr "Rozsah:"
 
-#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:207
-#: modules/graph/graph_fdfit.c:426 modules/graph/graph_fit.c:444
-#: modules/volume/volume_fdfit.c:511 modules/volume/volume_linestat.c:400
+#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:200
+#: modules/graph/graph_fdfit.c:433 modules/graph/graph_fit.c:451
+#: modules/graph/graph_stats.c:290 modules/graph/graph_stats.c:796
+#: modules/volume/volume_fdfit.c:487 modules/volume/volume_linestat.c:405
 msgid "range|to"
 msgstr "až"
 
@@ -6775,92 +6963,92 @@ msgstr "až"
 msgid "_Draw whole circle"
 msgstr "Kreslit _celou kružnici"
 
-#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:491
-#: modules/graph/graph_fit.c:531 modules/process/fit-shape.c:522
-#: modules/volume/volume_fdfit.c:573
+#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:498
+#: modules/graph/graph_fit.c:538 modules/process/fit-shape.c:523
+#: modules/volume/volume_fdfit.c:549
 msgid "Save Fit Report"
 msgstr "Uložit výsledky"
 
 #: modules/graph/graph_cd.c:529 modules/graph/graph_cd.c:1107
-#: modules/graph/graph_fdfit.c:709 modules/graph/graph_fit.c:763
-#: modules/volume/volume_fdfit.c:907
+#: modules/graph/graph_fdfit.c:725 modules/graph/graph_fit.c:779
+#: modules/volume/volume_fdfit.c:883
 msgid "Fit"
 msgstr "Proložení"
 
-#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:749
-#: modules/graph/graph_fit.c:803 modules/volume/volume_fdfit.c:978
-#: modules/volume/volume_fdfit.c:1085
+#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:765
+#: modules/graph/graph_fit.c:819 modules/volume/volume_fdfit.c:954
+#: modules/volume/volume_fdfit.c:1061
 msgid "It is necessary to select more data points than free fit parameters"
 msgstr "Je třeba vybrat více datových bodů, než je volných parametrů fitu."
 
-#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:798
-#: modules/graph/graph_fit.c:852 modules/process/entropy.c:554
-#: modules/tools/grainmeasure.c:217 modules/tools/readvalue.c:634
-#: modules/tools/readvalue.c:635 modules/tools/readvalue.c:636
-#: modules/tools/readvalue.c:637 modules/tools/roughness.c:975
-#: modules/tools/stats.c:727 modules/tools/stats.c:740
-#: modules/tools/stats.c:741 modules/volume/volume_fdfit.c:1134
-#: modules/xyz/xyz_drift.c:1099 modules/xyz/xyz_drift.c:1117
-#: modules/xyz/xyz_drift.c:1134
+#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:814
+#: modules/graph/graph_fit.c:868 modules/graph/graph_stats.c:663
+#: modules/process/entropy.c:555 modules/tools/grainmeasure.c:217
+#: modules/tools/readvalue.c:634 modules/tools/readvalue.c:635
+#: modules/tools/readvalue.c:636 modules/tools/readvalue.c:637
+#: modules/tools/roughness.c:984 modules/tools/stats.c:723
+#: modules/tools/stats.c:736 modules/tools/stats.c:737
+#: modules/volume/volume_fdfit.c:1110 modules/xyz/xyz_drift.c:1099
+#: modules/xyz/xyz_drift.c:1117 modules/xyz/xyz_drift.c:1134
 msgid "N.A."
-msgstr "nelze použít"
+msgstr "nemá smysl"
 
-#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1363
-#: modules/graph/graph_fit.c:1500 modules/process/fit-shape.c:2078
-#: modules/volume/volume_fdfit.c:1720
+#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1381
+#: modules/graph/graph_fit.c:1518 modules/process/fit-shape.c:2060
+#: modules/volume/volume_fdfit.c:1696
 msgid "===== Fit Results ====="
 msgstr "===== Výsledek proložení ====="
 
-#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1367
-#: modules/graph/graph_fit.c:1504 modules/process/fit-shape.c:2080
-#: modules/volume/volume_fdfit.c:1724
+#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1385
+#: modules/graph/graph_fit.c:1522 modules/process/fit-shape.c:2062
+#: modules/volume/volume_fdfit.c:1700
 #, c-format
 msgid "Data:             %s\n"
 msgstr "Data:             %s\n"
 
-#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1370
-#: modules/graph/graph_fit.c:1507 modules/process/fit-shape.c:2082
-#: modules/volume/volume_fdfit.c:1727
+#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1388
+#: modules/graph/graph_fit.c:1525 modules/process/fit-shape.c:2064
+#: modules/volume/volume_fdfit.c:1703
 #, c-format
 msgid "Number of points: %d of %d\n"
 msgstr "Počet bodů:       %d z %d\n"
 
-#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1374
-#: modules/graph/graph_fit.c:1511 modules/volume/volume_fdfit.c:1731
+#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1392
+#: modules/graph/graph_fit.c:1529 modules/volume/volume_fdfit.c:1707
 #, c-format
 msgid "X range:          %.*f to %.*f %s\n"
 msgstr "Rozsah x:         %.*f až %.*f %s\n"
 
-#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1380
-#: modules/graph/graph_fit.c:1517 modules/process/fit-shape.c:2084
-#: modules/volume/volume_fdfit.c:1737
+#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1398
+#: modules/graph/graph_fit.c:1535 modules/process/fit-shape.c:2066
+#: modules/volume/volume_fdfit.c:1713
 #, c-format
 msgid "Fitted function:  %s\n"
 msgstr "Proložená funkce: %s\n"
 
-#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1383
-#: modules/graph/graph_fit.c:1520 modules/process/fit-shape.c:2087
-#: modules/volume/volume_fdfit.c:1740
+#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1401
+#: modules/graph/graph_fit.c:1538 modules/process/fit-shape.c:2069
+#: modules/volume/volume_fdfit.c:1716
 msgid "Results\n"
 msgstr "Výsledky\n"
 
-#: modules/graph/graph_cut.c:88
+#: modules/graph/graph_cut.c:87
 msgid "Cut graph"
 msgstr "Oříznutí grafu"
 
-#: modules/graph/graph_cut.c:102
+#: modules/graph/graph_cut.c:101
 msgid "/_Cut..."
 msgstr "/_Oříznout..."
 
-#: modules/graph/graph_cut.c:105
+#: modules/graph/graph_cut.c:104
 msgid "Extract part of graph into new one"
 msgstr "Extrahovat část grafu do nového"
 
-#: modules/graph/graph_cut.c:146
+#: modules/graph/graph_cut.c:145
 msgid "Cut Graph"
 msgstr "Oříznutí grafu"
 
-#: modules/graph/graph_cut.c:180
+#: modules/graph/graph_cut.c:173
 msgid "Cut _all curves"
 msgstr "Oříznout _všechny křivky"
 
@@ -6958,97 +7146,97 @@ msgstr "Export grafu do rastrového obrázku"
 msgid "Export to PNG"
 msgstr "Exportovat do PNG"
 
-#: modules/graph/graph_export_vector.c:35
+#: modules/graph/graph_export_vector.c:36
 msgid "Exports graphs to PostScript"
 msgstr "Exportuje grafy do PostScriptu"
 
-#: modules/graph/graph_export_vector.c:49
+#: modules/graph/graph_export_vector.c:50
 msgid "/Export _PostScript"
 msgstr "/Export do _PostScriptu"
 
-#: modules/graph/graph_export_vector.c:52
+#: modules/graph/graph_export_vector.c:53
 msgid "Export graph to PostScript"
 msgstr "Export grafu do PostScriptu"
 
-#: modules/graph/graph_export_vector.c:65
+#: modules/graph/graph_export_vector.c:66
 msgid "Export to PostScript"
 msgstr "Exportovat do PostScriptu"
 
-#: modules/graph/graph_fdfit.c:168
+#: modules/graph/graph_fdfit.c:169
 msgid "Fit force-distance data"
 msgstr "Proložit FD data"
 
-#: modules/graph/graph_fdfit.c:182
+#: modules/graph/graph_fdfit.c:183
 msgid "/_Fit FD Curve..."
 msgstr "/Proložit _FD křivku..."
 
-#: modules/graph/graph_fdfit.c:185
+#: modules/graph/graph_fdfit.c:186
 msgid "Fit a force-distance curve"
 msgstr "Proložit FD křivku"
 
-#: modules/graph/graph_fdfit.c:248 modules/volume/volume_fdfit.c:296
+#: modules/graph/graph_fdfit.c:251 modules/volume/volume_fdfit.c:296
 msgid "Fit FD Curve"
 msgstr "Proložení FD křivky"
 
-#: modules/graph/graph_fdfit.c:255 modules/graph/graph_fit.c:274
-#: modules/process/fit-shape.c:397 modules/process/measure_lattice.c:257
-#: modules/volume/volume_fdfit.c:303
+#: modules/graph/graph_fdfit.c:258 modules/graph/graph_fit.c:277
+#: modules/process/correct_affine.c:347 modules/process/fit-shape.c:398
+#: modules/process/measure_lattice.c:247 modules/volume/volume_fdfit.c:303
 msgid "verb|_Estimate"
 msgstr "Od_hadnout"
 
-#: modules/graph/graph_fdfit.c:257 modules/graph/graph_fit.c:276
-#: modules/volume/volume_fdfit.c:305
+#: modules/graph/graph_fdfit.c:260 modules/graph/graph_fit.c:279
+#: modules/process/psf.c:239 modules/volume/volume_fdfit.c:305
 msgid "_Plot Inits"
 msgstr "Vy_kreslit odhad"
 
-#: modules/graph/graph_fdfit.c:359 modules/graph/graph_fit.c:373
-#: modules/process/fit-shape.c:790 modules/volume/volume_fdfit.c:444
+#: modules/graph/graph_fdfit.c:366 modules/graph/graph_fit.c:380
+#: modules/process/fit-shape.c:802 modules/volume/volume_fdfit.c:420
 msgid "Fix"
 msgstr "Fix."
 
-#: modules/graph/graph_fdfit.c:365 modules/graph/graph_fit.c:379
-#: modules/volume/volume_fdfit.c:450
+#: modules/graph/graph_fdfit.c:372 modules/graph/graph_fit.c:386
+#: modules/volume/volume_fdfit.c:426
 msgid "Initial"
 msgstr "Poč."
 
-#: modules/graph/graph_fdfit.c:376 modules/graph/graph_fit.c:394
-#: modules/volume/volume_fdfit.c:461
+#: modules/graph/graph_fdfit.c:383 modules/graph/graph_fit.c:401
+#: modules/volume/volume_fdfit.c:437
 msgid "χ<sup>2</sup> result:"
 msgstr "Výsledné χ<sup>2</sup>:"
 
-#: modules/graph/graph_fdfit.c:392 modules/graph/graph_fit.c:410
-#: modules/process/fit-shape.c:469 modules/process/fit-shape.c:2134
-#: modules/volume/volume_fdfit.c:477
+#: modules/graph/graph_fdfit.c:399 modules/graph/graph_fit.c:417
+#: modules/process/fit-shape.c:470 modules/process/fit-shape.c:2116
+#: modules/volume/volume_fdfit.c:453
 msgid "Correlation Matrix"
 msgstr "Korelační matice"
 
-#: modules/graph/graph_fdfit.c:447 modules/graph/graph_fit.c:485
-#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:532
+#: modules/graph/graph_fdfit.c:454 modules/graph/graph_fit.c:492
+#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:508
 msgid "Instant:"
 msgstr "Okamžitě:"
 
-#: modules/graph/graph_fdfit.c:450 modules/graph/graph_fit.c:488
+#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
 msgid "esti_mate"
 msgstr "od_hadovat"
 
-#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
-#: modules/volume/volume_fdfit.c:542
+#: modules/graph/graph_fdfit.c:464 modules/graph/graph_fit.c:502
+#: modules/volume/volume_fdfit.c:518
 msgid "p_lot"
 msgstr "_kreslit"
 
-#: modules/graph/graph_fdfit.c:708 modules/graph/graph_fit.c:762
-#: modules/volume/volume_fdfit.c:906
+#: modules/graph/graph_fdfit.c:724 modules/graph/graph_fit.c:778
+#: modules/volume/volume_fdfit.c:882
 msgid "Estimate"
 msgstr "Odhad"
 
-#: modules/graph/graph_fdfit.c:1410 modules/graph/graph_fit.c:1547
-#: modules/volume/volume_fdfit.c:1768
+#: modules/graph/graph_fdfit.c:1428 modules/graph/graph_fit.c:1565
+#: modules/volume/volume_fdfit.c:1744
 #, c-format
 msgid "Residual sum:   %g\n"
 msgstr "Suma čtverců:   %g\n"
 
-#: modules/graph/graph_fdfit.c:1413 modules/graph/graph_fit.c:1550
-#: modules/volume/volume_fdfit.c:1771
+#: modules/graph/graph_fdfit.c:1431 modules/graph/graph_fit.c:1568
+#: modules/volume/volume_fdfit.c:1747
 msgid "Correlation matrix\n"
 msgstr "Korelační matice\n"
 
@@ -7064,27 +7252,27 @@ msgstr "/_Filtr"
 msgid "Remove noise from graph curves"
 msgstr "Odstranit šum z křivek grafu"
 
-#: modules/graph/graph_fit.c:181
+#: modules/graph/graph_fit.c:182
 msgid "Fit graph with function"
 msgstr "Proložení funkce grafem"
 
-#: modules/graph/graph_fit.c:195
+#: modules/graph/graph_fit.c:196
 msgid "/_Fit Function..."
 msgstr "/Proložit _funkci..."
 
-#: modules/graph/graph_fit.c:198
+#: modules/graph/graph_fit.c:199
 msgid "Fit a function on graph data"
 msgstr "Proložení funkce daty grafu"
 
-#: modules/graph/graph_fit.c:386
+#: modules/graph/graph_fit.c:393
 msgid "Copy all fitted values to estimates"
 msgstr "Zkopírovat všechny nafitované hodnoty do odhadů"
 
-#: modules/graph/graph_fit.c:460
+#: modules/graph/graph_fit.c:467
 msgid "Plot full range"
 msgstr "Kreslit plný rozsah"
 
-#: modules/graph/graph_fit.c:470
+#: modules/graph/graph_fit.c:477
 msgid "Create a difference graph"
 msgstr "Vytvořit graf rozdílu"
 
@@ -7168,52 +7356,135 @@ msgstr "/Najít _píky..."
 msgid "Find graph curve peaks"
 msgstr "Najít píky na křivce"
 
-#: modules/graph/graph_peaks.c:157
+#: modules/graph/graph_peaks.c:155
 msgid "Prominence"
 msgstr "Význačnost"
 
-#: modules/graph/graph_peaks.c:161
+#: modules/graph/graph_peaks.c:159
 msgid "Zero"
 msgstr "Nula"
 
-#: modules/graph/graph_peaks.c:162
+#: modules/graph/graph_peaks.c:160
 msgid "Bilateral minimum"
 msgstr "Dvojstranné minimum"
 
-#: modules/graph/graph_peaks.c:178
+#: modules/graph/graph_peaks.c:176
 msgid "Graph Peaks"
 msgstr "Píky na grafu"
 
-#: modules/graph/graph_peaks.c:212
+#: modules/graph/graph_peaks.c:209
 msgid "_Background type:"
 msgstr "Typ _pozadí:"
 
-#: modules/graph/graph_peaks.c:227
+#: modules/graph/graph_peaks.c:219
 msgid "Order peaks _by:"
 msgstr "Řa_dit píky podle:"
 
-#: modules/graph/graph_peaks.c:242
+#: modules/graph/graph_peaks.c:225
 msgid "Number of _peaks:"
 msgstr "Počet píků:"
 
-#: modules/graph/graph_peaks.c:263 modules/process/curvature.c:773
-#: modules/process/grain_stat.c:360 modules/process/measure_lattice.c:396
-#: modules/process/polylevel.c:607 modules/tools/distance.c:259
-#: modules/tools/roughness.c:818 modules/tools/stats.c:450
+#: modules/graph/graph_peaks.c:245 modules/graph/graph_stats.c:367
+#: modules/process/curvature.c:770 modules/process/grain_stat.c:360
+#: modules/process/measure_lattice.c:390 modules/process/polylevel.c:610
+#: modules/tools/distance.c:259 modules/tools/roughness.c:819
+#: modules/tools/stats.c:447
 msgid "Save table to a file"
 msgstr "Uložit tabulku do souboru"
 
-#: modules/graph/graph_peaks.c:267 modules/process/curvature.c:778
-#: modules/process/grain_stat.c:365 modules/process/measure_lattice.c:400
-#: modules/process/polylevel.c:617 modules/tools/distance.c:264
-#: modules/tools/roughness.c:823 modules/tools/stats.c:455
+#: modules/graph/graph_peaks.c:249 modules/graph/graph_stats.c:371
+#: modules/process/curvature.c:775 modules/process/grain_stat.c:365
+#: modules/process/measure_lattice.c:394 modules/process/polylevel.c:620
+#: modules/tools/distance.c:264 modules/tools/roughness.c:824
+#: modules/tools/stats.c:452
 msgid "Copy table to clipboard"
 msgstr "Zkopírovat tabulku do schránky"
 
-#: modules/graph/graph_peaks.c:654
+#: modules/graph/graph_peaks.c:618
 msgid "Save Peak Parameters"
 msgstr "Uložit parametry píků"
 
+#: modules/graph/graph_stats.c:148 modules/graph/graph_stats.c:161
+#: modules/tools/stats.c:205
+msgid "Average value:"
+msgstr "Střední hodnota:"
+
+#: modules/graph/graph_stats.c:149 modules/tools/stats.c:206
+msgid "Median:"
+msgstr "Medián:"
+
+#: modules/graph/graph_stats.c:150
+msgid "Ra:"
+msgstr "Ra:"
+
+#: modules/graph/graph_stats.c:151
+msgid "Rms (Rq):"
+msgstr "Rms (Rq):"
+
+#: modules/graph/graph_stats.c:152 modules/tools/stats.c:210
+msgid "Skew:"
+msgstr "Šikmost:"
+
+#: modules/graph/graph_stats.c:153 modules/tools/stats.c:211
+msgid "Kurtosis:"
+msgstr "Špičatost:"
+
+#: modules/graph/graph_stats.c:158
+msgid "Projected length:"
+msgstr "Projektovaná délka:"
+
+#: modules/graph/graph_stats.c:159
+msgid "Developed length:"
+msgstr "Rozvinutá délka:"
+
+#: modules/graph/graph_stats.c:160 modules/tools/stats.c:214
+msgid "Variation:"
+msgstr "Variace:"
+
+#: modules/graph/graph_stats.c:162
+msgid "Area under curve:"
+msgstr "Plocha pod křivkou:"
+
+#: modules/graph/graph_stats.c:163
+msgid "Positive area:"
+msgstr "Kladná plocha:"
+
+#: modules/graph/graph_stats.c:164
+msgid "Negative area:"
+msgstr "Záporná plocha:"
+
+#: modules/graph/graph_stats.c:165
+msgid "Root mean square:"
+msgstr "Střední kvadrát:"
+
+#: modules/graph/graph_stats.c:171
+msgid "Calculates simple graph curve statistics."
+msgstr "Počítá jednoduché statistické charakteristiky křivek grafu."
+
+#: modules/graph/graph_stats.c:185
+msgid "/_Statistics..."
+msgstr "/S_tatistika..."
+
+#: modules/graph/graph_stats.c:188
+msgid "Calculate graph curve statistics"
+msgstr "Spočítat statistiky křivek grafu"
+
+#: modules/graph/graph_stats.c:241
+msgid "Graph Statistics"
+msgstr "Statistika grafu"
+
+#: modules/graph/graph_stats.c:320 modules/graph/graph_stats.c:807
+msgid "Simple Parameters"
+msgstr "Jednoduché parametry"
+
+#: modules/graph/graph_stats.c:342 modules/graph/graph_stats.c:826
+msgid "Integrals"
+msgstr "Integrály"
+
+#: modules/graph/graph_stats.c:686
+msgid "Save Curve Statistics"
+msgstr "Uložit statistiku grafu"
+
 #: modules/layer/axis.c:143
 msgid "Layer allowing selection of horizontal or vertical lines."
 msgstr "Vrstva umožňující výběr vodorovných nebo svislých čar."
@@ -7353,25 +7624,25 @@ msgstr "Rozdělení úhlů"
 msgid "Angle Distribution"
 msgstr "Rozdělení úhlů"
 
-#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:373
+#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:365
 msgid "Output _size:"
 msgstr "_Velikost výstupu:"
 
-#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:206
+#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:207
 msgid "_Number of steps:"
 msgstr "Počet _kroků:"
 
-#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:380
+#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:372
 msgid "_Logarithmic value scale"
 msgstr "_Logaritmická škála hodnot"
 
 #: modules/process/angle_dist.c:204 modules/process/entropy.c:231
-#: modules/process/slope_dist.c:390
+#: modules/process/slope_dist.c:382
 msgid "Use local plane _fitting"
 msgstr "Používat lokální _prokládání rovinou"
 
 #: modules/process/angle_dist.c:213 modules/process/entropy.c:242
-#: modules/process/slope_dist.c:401
+#: modules/process/slope_dist.c:393
 msgid "_Plane size:"
 msgstr "Velikost _roviny:"
 
@@ -7387,7 +7658,8 @@ msgstr "/M_ultidata/_Aritmetika..."
 msgid "Arithmetic operations on data"
 msgstr "Aritmetické operace s daty"
 
-#: modules/process/arithmetic.c:202 modules/process/superresolution.c:349
+#: modules/process/arithmetic.c:202 modules/process/stitch.c:234
+#: modules/process/superresolution.c:348
 msgid "Calculated"
 msgstr "Vypočtený"
 
@@ -7403,7 +7675,7 @@ msgstr "_Výraz:"
 msgid "Operands"
 msgstr "Operandy"
 
-#: modules/process/arithmetic.c:300 modules/process/dimensions.h:483
+#: modules/process/arithmetic.c:300 modules/process/dimensions.h:465
 msgid "Units"
 msgstr "Jednotky"
 
@@ -7424,15 +7696,15 @@ msgstr "Zadat jednotky výsledku explicitně"
 msgid "Expression contains unknown identifiers"
 msgstr "Výraz obsahuje neznámé identifikátory"
 
-#: modules/process/arithmetic.c:569 modules/process/superresolution.c:300
+#: modules/process/arithmetic.c:569 modules/process/superresolution.c:299
 msgid "Pixel dimensions differ"
 msgstr "Nekompatibilní rozlišení"
 
-#: modules/process/arithmetic.c:571 modules/process/superresolution.c:302
+#: modules/process/arithmetic.c:571 modules/process/superresolution.c:301
 msgid "Lateral dimensions are different physical quantities"
 msgstr "Příčné rozměry jsou nekompatibilní fyzikální veličiny"
 
-#: modules/process/arithmetic.c:574 modules/process/superresolution.c:305
+#: modules/process/arithmetic.c:574 modules/process/superresolution.c:304
 msgid "Physical dimensions differ"
 msgstr "Nekompatibilní fyzické rozměry"
 
@@ -7537,8 +7809,8 @@ msgid "Generates surfaces by ballistic deposition."
 msgstr "Generuje povrchy pomocí balistické depozice."
 
 #: modules/process/bdep_synth.c:164
-msgid "/S_ynthetic/_Ballistic..."
-msgstr "/S_yntetická/_Balistická depozice..."
+msgid "/S_ynthetic/_Deposition/_Ballistic..."
+msgstr "/S_yntetická/_Depozice/_Balistická..."
 
 #: modules/process/bdep_synth.c:168
 msgid "Generate surface by ballistic deposition"
@@ -7546,20 +7818,23 @@ msgstr "Vytvořit povrch balistickou depozicí"
 
 #: modules/process/bdep_synth.c:239 modules/process/bdep_synth.c:596
 #: modules/process/calcoefs_simple.c:636 modules/process/col_synth.c:282
-#: modules/process/col_synth.c:733 modules/process/crosscor.c:819
-#: modules/process/crosscor.c:882 modules/process/deposit_synth.c:268
-#: modules/process/deposit_synth.c:859 modules/process/diff_synth.c:304
-#: modules/process/diff_synth.c:705 modules/process/domain_synth.c:255
-#: modules/process/domain_synth.c:745 modules/process/grain_wshed.c:429
+#: modules/process/col_synth.c:734 modules/process/crosscor.c:792
+#: modules/process/crosscor.c:855 modules/process/deposit_synth.c:268
+#: modules/process/deposit_synth.c:858 modules/process/diff_synth.c:304
+#: modules/process/diff_synth.c:704 modules/process/domain_synth.c:255
+#: modules/process/domain_synth.c:745 modules/process/fibre_synth.c:357
+#: modules/process/fibre_synth.c:872 modules/process/grain_wshed.c:433
 #: modules/process/lat_synth.c:491 modules/process/mark_disconn.c:148
-#: modules/process/mark_disconn.c:373 modules/process/maskcor.c:330
-#: modules/process/mcrop.c:315 modules/process/merge.c:1072
-#: modules/process/nanoindent_adjust.c:323 modules/process/neural.c:1272
-#: modules/process/pid.c:338 modules/process/superresolution.c:416
-#: modules/process/superresolution.c:505 modules/process/tip_blind.c:781
-#: modules/process/tipops.c:320 modules/process/xydenoise.c:213
-#: modules/volume/volume_kmeans.c:403 modules/volume/volume_kmedians.c:365
-#: modules/xyz/xyz_raster.c:1028 modules/xyz/xyz_raster.c:1044
+#: modules/process/mark_disconn.c:361 modules/process/maskcor.c:334
+#: modules/process/mcrop.c:314 modules/process/merge.c:1072
+#: modules/process/nanoindent_adjust.c:324 modules/process/neural.c:1279
+#: modules/process/pid.c:339 modules/process/sphere-revolve.c:269
+#: modules/process/superresolution.c:415 modules/process/superresolution.c:504
+#: modules/process/tip_blind.c:778 modules/process/tipops.c:320
+#: modules/process/wave_synth.c:305 modules/process/wave_synth.c:747
+#: modules/process/xydenoise.c:214 modules/volume/volume_kmeans.c:397
+#: modules/volume/volume_kmedians.c:363 modules/xyz/xyz_raster.c:997
+#: modules/xyz/xyz_raster.c:1013
 msgid "Initializing..."
 msgstr "Inicializuje se..."
 
@@ -7568,10 +7843,11 @@ msgstr "Inicializuje se..."
 #: modules/process/deposit_synth.c:531 modules/process/deposit_synth.c:544
 #: modules/process/diff_synth.c:342 modules/process/domain_synth.c:319
 #: modules/process/domain_synth.c:327 modules/process/fbm_synth.c:278
-#: modules/process/fft_synth.c:314 modules/process/lat_synth.c:529
-#: modules/process/lno_synth.c:407 modules/process/noise_synth.c:311
-#: modules/process/obj_synth.c:407 modules/process/pat_synth.c:357
-#: modules/process/wave_synth.c:323
+#: modules/process/fft_synth.c:314 modules/process/fibre_synth.c:394
+#: modules/process/lat_synth.c:529 modules/process/lno_synth.c:405
+#: modules/process/noise_synth.c:309 modules/process/obj_synth.c:404
+#: modules/process/pat_synth.c:357 modules/process/phase_synth.c:518
+#: modules/process/wave_synth.c:342
 msgid "Generated"
 msgstr "Generovaný"
 
@@ -7590,50 +7866,56 @@ msgid "Progressive preview"
 msgstr "Postupné náhledy"
 
 #: modules/process/bdep_synth.c:407 modules/process/col_synth.c:458
-#: modules/process/deposit_synth.c:412 modules/process/diff_synth.c:477
+#: modules/process/deposit_synth.c:413 modules/process/diff_synth.c:477
 #: modules/process/domain_synth.c:430 modules/process/fbm_synth.c:360
-#: modules/process/fft_synth.c:398 modules/process/lat_synth.c:626
-#: modules/process/lno_synth.c:490 modules/process/noise_synth.c:394
-#: modules/process/obj_synth.c:498 modules/process/pat_synth.c:442
-#: modules/process/wave_synth.c:407
+#: modules/process/fft_synth.c:398 modules/process/fibre_synth.c:479
+#: modules/process/lat_synth.c:626 modules/process/lno_synth.c:488
+#: modules/process/mfm_current.c:383 modules/process/mfm_parallel.c:384
+#: modules/process/noise_synth.c:392 modules/process/obj_synth.c:495
+#: modules/process/pat_synth.c:442 modules/process/phase_synth.c:263
+#: modules/process/wave_synth.c:426
 msgid "Dimensions"
 msgstr "Rozměry"
 
 #: modules/process/bdep_synth.c:416 modules/process/col_synth.c:467
-#: modules/process/deposit_synth.c:422 modules/process/diff_synth.c:486
+#: modules/process/deposit_synth.c:425 modules/process/diff_synth.c:486
 #: modules/process/domain_synth.c:438 modules/process/fbm_synth.c:371
-#: modules/process/fft_synth.c:409 modules/process/lno_synth.c:501
-#: modules/process/noise_synth.c:405 modules/process/obj_synth.c:509
-#: modules/process/pat_synth.c:454 modules/process/wave_synth.c:418
+#: modules/process/fft_synth.c:409 modules/process/fibre_synth.c:490
+#: modules/process/lno_synth.c:499 modules/process/mfm_current.c:412
+#: modules/process/mfm_parallel.c:411 modules/process/noise_synth.c:403
+#: modules/process/obj_synth.c:506 modules/process/pat_synth.c:454
+#: modules/process/phase_synth.c:274 modules/process/wave_synth.c:437
 msgid "Generator"
 msgstr "Generátor"
 
 #: modules/process/bdep_synth.c:422 modules/process/col_synth.c:473
-#: modules/process/diff_synth.c:492 modules/process/lno_synth.c:1041
-#: modules/process/obj_synth.c:520
+#: modules/process/deposit_synth.c:455 modules/process/diff_synth.c:492
+#: modules/process/fibre_synth.c:502 modules/process/lno_synth.c:1041
+#: modules/process/obj_synth.c:518
 msgid "Co_verage:"
 msgstr "_Pokrytí:"
 
 #: modules/process/bdep_synth.c:434 modules/process/diff_synth.c:512
-#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:412
-#: modules/process/fft_synth.c:418 modules/process/lat_synth.c:758
-#: modules/process/lno_synth.c:537 modules/process/noise_synth.c:437
-#: modules/process/obj_synth.c:579 modules/process/wave_synth.c:453
-msgid "_Like Current Channel"
-msgstr "_Jako aktuální kanál"
-
-#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:541
-#: modules/process/diff_synth.c:562
+#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:411
+#: modules/process/fft_synth.c:418 modules/process/fibre_synth.c:544
+#: modules/process/lat_synth.c:758 modules/process/lno_synth.c:535
+#: modules/process/noise_synth.c:435 modules/process/obj_synth.c:577
+#: modules/process/phase_synth.c:302 modules/process/wave_synth.c:472
+msgid "_Like Current Image"
+msgstr "_Jako současný obrázek"
+
+#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:542
+#: modules/process/diff_synth.c:561
 msgid "Evolution"
 msgstr "Vývoj"
 
-#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:544
-#: modules/process/diff_synth.c:565
+#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:545
+#: modules/process/diff_synth.c:564
 msgid "Plot graphs:"
 msgstr "Vykreslit grafy:"
 
-#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:840
-#: modules/process/diff_synth.c:782
+#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:841
+#: modules/process/diff_synth.c:781
 msgid "Depositing particles..."
 msgstr "Deponuji částice..."
 
@@ -7668,8 +7950,8 @@ msgstr "Nahrát kalibrační data"
 msgid "Calibration name:"
 msgstr "Název kalibrace"
 
-#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:433
-#: modules/volume/volume_extract.c:514
+#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:421
+#: modules/volume/volume_extract.c:501
 msgid "No data loaded"
 msgstr "Nebyla vložena žádná data"
 
@@ -7693,7 +7975,7 @@ msgstr "Přidat"
 msgid "Load calibration data"
 msgstr "Nahrát kalibrační data."
 
-#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1073
+#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1059
 #, c-format
 msgid "Error loading file '%s'"
 msgstr "Chyba při čtení souboru '%s'"
@@ -7787,7 +8069,7 @@ msgstr "Vytváří jednoduchou mapu chyb"
 msgid "Simple Error Map"
 msgstr "Jednoduchá mapa chyb"
 
-#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:146
+#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:142
 #: modules/process/superresolution.c:156
 msgid "Operands:"
 msgstr "O_perandy:"
@@ -7801,14 +8083,14 @@ msgid "Detail"
 msgstr "Detail"
 
 #: modules/process/calcoefs_simple.c:371 modules/process/calcoefs_view.c:491
-#: modules/process/calibrate.c:496 modules/process/crosscor.c:289
-#: modules/volume/volume_calibrate.c:478
+#: modules/process/calibrate.c:481 modules/process/crosscor.c:276
+#: modules/volume/volume_calibrate.c:460
 msgid "_X offset:"
 msgstr "Posun v _X:"
 
 #: modules/process/calcoefs_simple.c:398 modules/process/calcoefs_view.c:517
-#: modules/process/calibrate.c:509 modules/process/crosscor.c:300
-#: modules/volume/volume_calibrate.c:491
+#: modules/process/calibrate.c:488 modules/process/crosscor.c:284
+#: modules/volume/volume_calibrate.c:467
 msgid "_Y offset:"
 msgstr "Posun v _Y:"
 
@@ -7821,7 +8103,7 @@ msgid "Y p_eriod:"
 msgstr "P_erioda v Y:"
 
 #: modules/process/calcoefs_simple.c:438 modules/process/calcoefs_view.c:529
-#: modules/volume/volume_calibrate.c:505
+#: modules/volume/volume_calibrate.c:474
 msgid "_Z offset:"
 msgstr "Posun v _Z:"
 
@@ -7853,25 +8135,25 @@ msgstr[2] "Nalezeno %d objektů"
 msgid "Search canceled"
 msgstr "Hledání zrušeno"
 
-#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:862
-#: modules/process/maskcor.c:332 modules/process/mcrop.c:317
+#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:835
+#: modules/process/maskcor.c:336 modules/process/mcrop.c:316
 #: modules/process/merge.c:1074
 msgid "Correlating..."
 msgstr "Koreluji..."
 
-#: modules/process/calcoefs_stage.c:76
+#: modules/process/calcoefs_stage.c:72
 msgid "Digital AFM data recalibration"
 msgstr "Rekalibrace dat."
 
-#: modules/process/calcoefs_stage.c:90
+#: modules/process/calcoefs_stage.c:86
 msgid "/Cali_bration/_3D Calibration/_Get From Stage map..."
 msgstr "/Kali_brace/_3D Kalibrace/Získat z mapy stolku..."
 
-#: modules/process/calcoefs_stage.c:94
+#: modules/process/calcoefs_stage.c:90
 msgid "Stage error mapping"
 msgstr "Mapování chyby stolku"
 
-#: modules/process/calcoefs_stage.c:131
+#: modules/process/calcoefs_stage.c:127
 msgid "Stage Error Map"
 msgstr "Mapa chyby stolku"
 
@@ -7927,14 +8209,16 @@ msgstr "Z-ová poloha:"
 msgid "Crop to actual data"
 msgstr "Oříznout na skutečná data"
 
-#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:369
-#: modules/process/deposit_synth.c:641 modules/process/edge.c:705
-#: modules/process/fft_filter_1d.c:299 modules/process/grain_edge.c:290
-#: modules/process/grain_filter.c:347 modules/process/grain_mark.c:372
-#: modules/process/mark_with.c:318 modules/process/polydistort.c:316
-#: modules/process/scars.c:386 modules/process/slope_dist.c:407
-#: modules/process/synth.h:513 modules/volume/volume_extract.c:424
-#: modules/volume/volume_extract.c:505 modules/volume/volume_linestat.c:422
+#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:368
+#: modules/process/deposit_synth.c:642 modules/process/edge.c:705
+#: modules/process/fft_filter_1d.c:301 modules/process/grain_edge.c:277
+#: modules/process/grain_filter.c:346 modules/process/grain_mark.c:357
+#: modules/process/mark_with.c:322 modules/process/mfm_field.c:420
+#: modules/process/mfm_shift.c:216 modules/process/polydistort.c:319
+#: modules/process/psf.c:309 modules/process/scars.c:421
+#: modules/process/slope_dist.c:400 modules/process/synth.h:542
+#: modules/volume/volume_extract.c:411 modules/volume/volume_extract.c:491
+#: modules/volume/volume_linestat.c:427
 msgid "I_nstant updates"
 msgstr "Okamžité _aktualizace"
 
@@ -7975,27 +8259,27 @@ msgstr "Chyba: mimo rozsah."
 msgid "Building mesh..."
 msgstr "Vytváření sítě..."
 
-#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1818
+#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1867
 msgid "X correction"
 msgstr "X korekce"
 
-#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1819
+#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1868
 msgid "Y correction"
 msgstr "Y korekce"
 
-#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1820
+#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1869
 msgid "Z correction"
 msgstr "Z korekce"
 
-#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1821
+#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1870
 msgid "X uncertainty"
 msgstr "X nejistota"
 
-#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1822
+#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1871
 msgid "Y uncertainty"
 msgstr "Y nejistota"
 
-#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1823
+#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1872
 msgid "Z uncertainty"
 msgstr "Z nejistota"
 
@@ -8023,78 +8307,78 @@ msgstr "Při_chytit k rovině"
 msgid "Delaunay"
 msgstr "Delaunay"
 
-#: modules/process/calibrate.c:180
+#: modules/process/calibrate.c:172
 msgid "Recalibrates scan lateral dimensions or value range."
 msgstr "Kalibruje podélné rozměry vzorku nebo rozsah hodnot."
 
-#: modules/process/calibrate.c:194
+#: modules/process/calibrate.c:186
 msgid "/_Basic Operations/_Dimensions and Units..."
 msgstr "/_Jednoduché operace/_Rozsah a jednotky..."
 
-#: modules/process/calibrate.c:198 modules/volume/volume_calibrate.c:193
+#: modules/process/calibrate.c:190 modules/volume/volume_calibrate.c:193
 msgid "Change physical dimensions, units or value scale"
 msgstr "Kalibruje podélné rozměry vzorku nebo rozsah hodnot."
 
-#: modules/process/calibrate.c:357 modules/volume/volume_calibrate.c:355
+#: modules/process/calibrate.c:349 modules/volume/volume_calibrate.c:355
 msgid "Recalibrated Data"
 msgstr "Překalibrovaná data"
 
-#: modules/process/calibrate.c:390
+#: modules/process/calibrate.c:382
 msgid "Dimensions and Units"
 msgstr "Rozsah a jednotky"
 
-#: modules/process/calibrate.c:411 modules/volume/volume_calibrate.c:389
+#: modules/process/calibrate.c:405 modules/volume/volume_calibrate.c:391
 msgid "New Real Dimensions"
 msgstr "Nové skutečné rozměry"
 
-#: modules/process/calibrate.c:417
+#: modules/process/calibrate.c:415
 msgid "_Match pixel size:"
 msgstr "_Přizpůsobit velikost pixelu:"
 
-#: modules/process/calibrate.c:444 modules/volume/volume_calibrate.c:394
+#: modules/process/calibrate.c:447 modules/volume/volume_calibrate.c:397
 msgid "_X range:"
 msgstr "_X-ový rozsah:"
 
-#: modules/process/calibrate.c:473 modules/volume/volume_calibrate.c:421
+#: modules/process/calibrate.c:467 modules/volume/volume_calibrate.c:417
 msgid "_Y range:"
 msgstr "_Y-ový rozsah:"
 
-#: modules/process/calibrate.c:489
+#: modules/process/calibrate.c:472
 msgid "_Square samples"
 msgstr "Č_tvercové pixely"
 
-#: modules/process/calibrate.c:524 modules/volume/volume_calibrate.c:521
+#: modules/process/calibrate.c:496 modules/volume/volume_calibrate.c:480
 msgid "Value Range"
 msgstr "Rozsah hodnot"
 
-#: modules/process/calibrate.c:529 modules/volume/volume_calibrate.c:448
+#: modules/process/calibrate.c:502 modules/volume/volume_calibrate.c:437
 msgid "_Z range:"
 msgstr "_Z-ový rozsah:"
 
-#: modules/process/calibrate.c:558
+#: modules/process/calibrate.c:524
 msgid "Z shi_ft:"
 msgstr "Posun v _Z:"
 
-#: modules/process/calibrate.c:573 modules/volume/volume_calibrate.c:570
+#: modules/process/calibrate.c:533 modules/volume/volume_calibrate.c:515
 msgid "Calibration Coefficients"
 msgstr "Kalibrační koeficienty"
 
-#: modules/process/calibrate.c:580 modules/volume/volume_calibrate.c:577
+#: modules/process/calibrate.c:538 modules/volume/volume_calibrate.c:520
 msgid "_X calibration factor:"
 msgstr "Kalibrační faktor v ose _X:"
 
-#: modules/process/calibrate.c:590 modules/volume/volume_calibrate.c:585
+#: modules/process/calibrate.c:545 modules/volume/volume_calibrate.c:527
 msgid "_Y calibration factor:"
 msgstr "Kalibrační faktor v ose _Y:"
 
-#: modules/process/calibrate.c:600 modules/volume/volume_calibrate.c:593
+#: modules/process/calibrate.c:552 modules/volume/volume_calibrate.c:534
 msgid "_Z calibration factor:"
 msgstr "Kalibrační faktor v ose _Z:"
 
-#: modules/process/calibrate.c:613 modules/process/extend.c:293
-#: modules/tools/crop.c:213
-msgid "Create new channel"
-msgstr "Vytvořit nový kanál"
+#: modules/process/calibrate.c:567 modules/process/drift.c:389
+#: modules/process/extend.c:293 modules/tools/crop.c:213
+msgid "Create new image"
+msgstr "Vytvořit nový obrázek"
 
 #: modules/process/coerce.c:159
 msgid "Transforms surfaces to have prescribed statistical properties."
@@ -8113,13 +8397,13 @@ msgid "Coerced"
 msgstr "Vynucený"
 
 #: modules/process/coerce.c:225 modules/process/coerce.c:326
-#: modules/process/fbm_synth.c:475 modules/process/lno_synth.c:256
-#: modules/process/noise_synth.c:183
+#: modules/process/fbm_synth.c:474 modules/process/lno_synth.c:254
+#: modules/process/noise_synth.c:181
 msgid "distribution|Uniform"
 msgstr "Uniformní"
 
-#: modules/process/coerce.c:226 modules/process/fbm_synth.c:476
-#: modules/process/lno_synth.c:246 modules/process/noise_synth.c:173
+#: modules/process/coerce.c:226 modules/process/fbm_synth.c:475
+#: modules/process/lno_synth.c:244 modules/process/noise_synth.c:171
 msgid "distribution|Gaussian"
 msgstr "Gaussovské"
 
@@ -8168,12 +8452,12 @@ msgid "Number of maxima"
 msgstr "Počet maxim"
 
 #: modules/process/col_synth.c:173 modules/tools/linestats.c:178
-#: modules/volume/volume_linestat.c:154
+#: modules/volume/volume_linestat.c:156
 msgid "Skew"
 msgstr "Šikmost"
 
 #: modules/process/col_synth.c:174 modules/tools/linestats.c:179
-#: modules/tools/roughness.c:386 modules/volume/volume_linestat.c:155
+#: modules/tools/roughness.c:387 modules/volume/volume_linestat.c:157
 msgid "Kurtosis"
 msgstr "Špičatost"
 
@@ -8186,8 +8470,8 @@ msgid "Generates columnar surfaces by a simple growth algorithm."
 msgstr "Generuje sloupcovité povrchy pomocí jednoduchého algoritmu růstu"
 
 #: modules/process/col_synth.c:208
-msgid "/S_ynthetic/_Columnar..."
-msgstr "/S_yntetická/_Sloupcový..."
+msgid "/S_ynthetic/_Deposition/_Columnar..."
+msgstr "/S_yntetická/_Depozice/_Sloupcová..."
 
 #: modules/process/col_synth.c:212
 msgid "Generate columnar surface"
@@ -8209,7 +8493,7 @@ msgstr "Dopad"
 msgid "Inclination"
 msgstr "Sklon"
 
-#: modules/process/col_synth.c:509 modules/process/crosscor.c:1063
+#: modules/process/col_synth.c:509 modules/process/crosscor.c:1036
 msgid "Direction"
 msgstr "Směr"
 
@@ -8217,15 +8501,15 @@ msgstr "Směr"
 msgid "Relaxation type:"
 msgstr "Typ relaxace:"
 
-#: modules/process/col_synth.c:528
+#: modules/process/col_synth.c:529
 msgid "_Melting:"
 msgstr "_Tání:"
 
-#: modules/process/col_synth.c:612
+#: modules/process/col_synth.c:613
 msgid "Weak"
 msgstr "Slabá"
 
-#: modules/process/col_synth.c:613
+#: modules/process/col_synth.c:614
 msgid "Strong"
 msgstr "Silná"
 
@@ -8257,8 +8541,8 @@ msgstr "Obecný konvoluční filtr"
 msgid "Convolution Filter"
 msgstr "Konvoluční filtr"
 
-#: modules/process/convolution_filter.c:269 modules/tools/filter.c:170
-#: modules/tools/filter.c:274
+#: modules/process/convolution_filter.c:269 modules/tools/filter.c:171
+#: modules/tools/filter.c:275
 msgid "Filter"
 msgstr "Filtr"
 
@@ -8286,7 +8570,7 @@ msgstr "HSym"
 msgid "VSym"
 msgstr "VSym"
 
-#: modules/process/correct_affine.c:231
+#: modules/process/correct_affine.c:220
 msgid ""
 "Corrects affine distortion of images by matching image Bravais lattice to "
 "the true one."
@@ -8294,101 +8578,109 @@ msgstr ""
 "Opravuje afinní pokřivení obrazů pomocí srovnání Bravaisovy mříže obrazu a "
 "skutečné mříže."
 
-#: modules/process/correct_affine.c:246
+#: modules/process/correct_affine.c:235
 msgid "/_Distortion/_Affine..."
 msgstr "/P_okřivení/_Afinní..."
 
-#: modules/process/correct_affine.c:250
+#: modules/process/correct_affine.c:239
 msgid "Correct affine distortion"
 msgstr "Opravit afinní pokřivení"
 
-#: modules/process/correct_affine.c:298
+#: modules/process/correct_affine.c:309 modules/process/correct_affine.c:634
+msgid "Corrected"
+msgstr "Opravená"
+
+#: modules/process/correct_affine.c:343
 msgid "Affine Correction"
 msgstr "Afinní pokřivení"
 
-#: modules/process/correct_affine.c:351 modules/process/fft_filter_2d.c:530
+#: modules/process/correct_affine.c:349 modules/process/measure_lattice.c:249
+msgid "_Refine"
+msgstr "_Zpřesnit"
+
+#: modules/process/correct_affine.c:399 modules/process/fft_filter_2d.c:530
 msgid "Preview Options"
 msgstr "Volby náhledu"
 
-#: modules/process/correct_affine.c:356 modules/process/fft_filter_2d.c:535
-#: modules/process/measure_lattice.c:321
+#: modules/process/correct_affine.c:404 modules/process/fft_filter_2d.c:535
+#: modules/process/measure_lattice.c:311
 msgid "Display:"
 msgstr "Zobrazovat:"
 
-#: modules/process/correct_affine.c:364 modules/process/measure_lattice.c:329
+#: modules/process/correct_affine.c:412 modules/process/measure_lattice.c:319
 #: modules/tools/grainremover.c:109
 msgid "_Data"
 msgstr "_Data"
 
-#: modules/process/correct_affine.c:365
+#: modules/process/correct_affine.c:413
 msgid "2D _ACF"
 msgstr "2D _ACF"
 
-#: modules/process/correct_affine.c:366 modules/process/drift.c:365
+#: modules/process/correct_affine.c:414 modules/process/drift.c:364
 msgid "Correc_ted data"
 msgstr "Opravená da_ta"
 
-#: modules/process/correct_affine.c:377
+#: modules/process/correct_affine.c:425
 msgid "ACF zoom:"
 msgstr "Zvětšení ACF:"
 
-#: modules/process/correct_affine.c:394 modules/process/measure_lattice.c:372
+#: modules/process/correct_affine.c:442 modules/process/measure_lattice.c:346
+msgid "Interpolate _horizontal ACF"
+msgstr "Interpolovat _vodorovnou ACF"
+
+#: modules/process/correct_affine.c:452 modules/process/measure_lattice.c:372
 msgid "Lattice Vectors"
 msgstr "Vektory mříže"
 
 #. TRANSLATORS: Correct is an adjective here.
-#: modules/process/correct_affine.c:419
+#: modules/process/correct_affine.c:469
 msgid "Correct Lattice"
 msgstr "Správná mřížka"
 
-#: modules/process/correct_affine.c:423
+#: modules/process/correct_affine.c:473
 msgid "_Lattice type:"
 msgstr "Typ _mřížky:"
 
-#: modules/process/correct_affine.c:430
+#: modules/process/correct_affine.c:480
 msgid "User defined"
 msgstr "Zadaná uživatelem"
 
-#: modules/process/correct_affine.c:445
+#: modules/process/correct_affine.c:495
 msgid "_Different lengths"
 msgstr "Ro_zdílné délky"
 
-#: modules/process/correct_affine.c:474
+#: modules/process/correct_affine.c:524
 msgid "Image for _ACF:"
 msgstr "Obrázek pro _ACF:"
 
-#: modules/process/correct_affine.c:501
+#: modules/process/correct_affine.c:551
 msgid "_Scaling:"
 msgstr "Š_kálování:"
 
-#: modules/process/correct_affine.c:508
+#: modules/process/correct_affine.c:558
 msgid "Exactly as specified"
 msgstr "Přesně jak je zadáno"
 
-#: modules/process/correct_affine.c:509
+#: modules/process/correct_affine.c:560
 msgid "Preserve area"
 msgstr "Zachovat plochu"
 
-#: modules/process/correct_affine.c:510
+#: modules/process/correct_affine.c:562
 msgid "Preserve X scale"
 msgstr "Zachovat škálu X"
 
-#: modules/process/correct_affine.c:561
-msgid "Corrected"
-msgstr "Opravená"
+#: modules/process/correct_affine.c:571 modules/process/drift.c:379
+msgid "_Apply to all compatible images"
+msgstr "_Použít na všechny kompatibilní obrázky"
 
-#: modules/process/correct_affine.c:617 modules/process/measure_lattice.c:489
+#: modules/process/correct_affine.c:693 modules/process/measure_lattice.c:482
 msgid "length"
 msgstr "délka"
 
-#: modules/process/correct_affine.c:624 modules/process/measure_lattice.c:496
+#: modules/process/correct_affine.c:700 modules/process/measure_lattice.c:489
 msgid "angle"
 msgstr "úhel"
 
-#: modules/process/correct_affine.c:717
-msgid "Re_fine"
-msgstr "_Zpřesnit"
-
 #: modules/process/crosscor.c:157
 msgid "Calculates cross-correlation of two data fields."
 msgstr "Počítá vzájemnou korelaci dvou datových polí."
@@ -8413,196 +8705,198 @@ msgstr "Ko_relovat s:"
 msgid "Search size"
 msgstr "Velikost hledání"
 
-#: modules/process/crosscor.c:272
-msgid "Global offset of 2nd channel"
-msgstr "Globální posun druhého kanálu"
-
-#: modules/process/crosscor.c:277
+#: modules/process/crosscor.c:267
 msgid "_Guess"
 msgstr "Od_hadnout"
 
-#: modules/process/crosscor.c:311
+#: modules/process/crosscor.c:268
+msgid "Global offset of 2nd channel"
+msgstr "Globální posun druhého kanálu"
+
+#: modules/process/crosscor.c:292
 msgid "Window size"
 msgstr "Velikost okna"
 
-#: modules/process/crosscor.c:319
+#: modules/process/crosscor.c:300
 msgid "W_idth:"
 msgstr "Šíř_ka"
 
-#: modules/process/crosscor.c:329
+#: modules/process/crosscor.c:308
 msgid "Hei_ght:"
 msgstr "_Výška:"
 
-#: modules/process/crosscor.c:342 modules/process/fft.c:405
+#: modules/process/crosscor.c:319 modules/process/fft.c:403
 #: modules/process/psdf_logphi.c:268
 msgid "_Windowing type:"
 msgstr "Typ _okénkové funkce:"
 
-#: modules/process/crosscor.c:350
+#: modules/process/crosscor.c:327
 msgid "All"
 msgstr "Všechno"
 
-#: modules/process/crosscor.c:351
+#: modules/process/crosscor.c:328
 msgid "Absolute"
 msgstr "Absolutní vzdálenost"
 
-#: modules/process/crosscor.c:352
+#: modules/process/crosscor.c:329
 msgid "X Distance"
 msgstr "Vzdálenost v ose X"
 
-#: modules/process/crosscor.c:353
+#: modules/process/crosscor.c:330
 msgid "Y Distance"
 msgstr "Vzdálenost v ose Y"
 
-#: modules/process/crosscor.c:355 modules/process/crosscor.c:1077
+#: modules/process/crosscor.c:332 modules/process/crosscor.c:1050
 msgid "Score"
 msgstr "Skóre"
 
-#: modules/process/crosscor.c:357 modules/process/fft.c:395
-#: modules/process/fit-shape.c:688 modules/process/maskcor.c:176
+#: modules/process/crosscor.c:334 modules/process/fft.c:393
+#: modules/process/fit-shape.c:699 modules/process/maskcor.c:177
+#: modules/process/mfm_current.c:455 modules/process/mfm_field.c:373
+#: modules/process/mfm_parallel.c:466
 msgid "Output _type:"
 msgstr "T_yp výstupu:"
 
-#: modules/process/crosscor.c:363
+#: modules/process/crosscor.c:340
 msgid "Add _low score results mask"
 msgstr "Přidat _masku s nízkým skóre"
 
-#: modules/process/crosscor.c:374 modules/process/grain_wshed.c:223
-#: modules/process/maskcor.c:188
+#: modules/process/crosscor.c:351 modules/process/grain_wshed.c:225
+#: modules/process/maskcor.c:191
 msgid "T_hreshold:"
 msgstr "Prá_h:"
 
-#: modules/process/crosscor.c:381
+#: modules/process/crosscor.c:359
 msgid "Multichannel cross-corelation"
 msgstr "Vícekanálová vzájemná korelace"
 
-#: modules/process/crosscor.c:400
+#: modules/process/crosscor.c:378
 msgid "Second _source data:"
 msgstr "_Druhá zdrojová data:"
 
-#: modules/process/crosscor.c:417
+#: modules/process/crosscor.c:394
 msgid "Correlate with:"
 msgstr "Korelovat s:"
 
-#: modules/process/crosscor.c:424
+#: modules/process/crosscor.c:402
 msgid "Postprocess:"
 msgstr "Postprocess:"
 
-#: modules/process/crosscor.c:431
-msgid "Apply Ga_ussian filter of width: "
+#: modules/process/crosscor.c:411
+msgid "Apply Ga_ussian filter of width:"
 msgstr "Použít ga_ussovský filtr o šířce:"
 
-#: modules/process/crosscor.c:451
+#: modules/process/crosscor.c:424
 msgid "Extend results to borders"
 msgstr "Rozšířit výsledek k okrajům"
 
-#: modules/process/crosscor.c:461
+#: modules/process/crosscor.c:433
 msgid "Create corrected data from 2nd channel"
 msgstr "Vytvořit opravená data z druhého kanálu"
 
-#: modules/process/crosscor.c:860
+#: modules/process/crosscor.c:833
 msgid "Correlating first set..."
 msgstr "Koreluje se první sada..."
 
-#: modules/process/crosscor.c:892
+#: modules/process/crosscor.c:865
 msgid "Correlating second set..."
 msgstr "Koreluje se druhá sada..."
 
-#: modules/process/crosscor.c:999
+#: modules/process/crosscor.c:972
 msgid "Corrected 2nd channel"
 msgstr "Opravený druhý kanál"
 
-#: modules/process/crosscor.c:1023
+#: modules/process/crosscor.c:996
 msgid "X difference"
 msgstr "Rozdíl v X"
 
-#: modules/process/crosscor.c:1037
+#: modules/process/crosscor.c:1010
 msgid "Y difference"
 msgstr "Rozdíl v Y"
 
-#: modules/process/crosscor.c:1050
+#: modules/process/crosscor.c:1023
 msgid "Absolute difference"
 msgstr "Absolutní rozdíl"
 
-#: modules/process/curvature.c:131
+#: modules/process/curvature.c:130
 msgid "Center value"
 msgstr "Hodnota ve středu"
 
-#: modules/process/curvature.c:132
+#: modules/process/curvature.c:131
 msgid "Curvature radius 1"
 msgstr "Poloměr křivosti 1"
 
-#: modules/process/curvature.c:133
+#: modules/process/curvature.c:132
 msgid "Curvature radius 2"
 msgstr "Poloměr křivosti 2"
 
-#: modules/process/curvature.c:134
+#: modules/process/curvature.c:133
 msgid "Direction 1"
 msgstr "Směr 1"
 
-#: modules/process/curvature.c:135
+#: modules/process/curvature.c:134
 msgid "Direction 2"
 msgstr "Směr 2"
 
-#: modules/process/curvature.c:163
+#: modules/process/curvature.c:162
 msgid "Calculates overall curvature."
 msgstr "Počítá celkovou křivost."
 
-#: modules/process/curvature.c:177
+#: modules/process/curvature.c:176
 msgid "/_Level/_Curvature..."
 msgstr "/_Vyrovnání/_Křivost..."
 
-#: modules/process/curvature.c:181
+#: modules/process/curvature.c:180
 msgid "Calculate overall curvature"
 msgstr "Vypočíst celkovou křivost"
 
-#: modules/process/curvature.c:211 modules/process/facet-level.c:118
+#: modules/process/curvature.c:210 modules/process/facet-level.c:118
 #: modules/process/semsim.c:165
 #, c-format
 msgid "%s: Lateral dimensions and value must be the same physical quantity."
 msgstr "%s: Rozměry a hodnota musejí být tatáž fyzikální veličina."
 
-#: modules/process/curvature.c:445
+#: modules/process/curvature.c:447
 msgid "Curvature Sections"
 msgstr "Řezy křivosti"
 
-#: modules/process/curvature.c:653
+#: modules/process/curvature.c:655
 msgid "Output Type"
 msgstr "Typ výstupu"
 
-#: modules/process/curvature.c:660
+#: modules/process/curvature.c:662
 msgid "_Set selection"
 msgstr "Nastavit _výběr"
 
-#: modules/process/curvature.c:670
+#: modules/process/curvature.c:672
 msgid "_Plot graph"
 msgstr "Vykreslit _graf"
 
-#: modules/process/curvature.c:685 modules/process/drift.c:337
-#: modules/process/fft_profile.c:310 modules/process/fractal.c:328
-#: modules/process/grain_cross.c:253 modules/process/linematch.c:885
-#: modules/process/slope_dist.c:349 modules/tools/linestats.c:418
-#: modules/tools/profile.c:573 modules/tools/roughness.c:872
-#: modules/tools/sfunctions.c:486 modules/tools/spectro.c:382
-#: modules/volume/volume_slice.c:398
-msgid "Target _graph:"
-msgstr "Cílový _graf:"
-
-#: modules/process/curvature.c:691 modules/process/drift.c:343
-#: modules/process/fft_profile.c:316 modules/process/fractal.c:334
-#: modules/process/grain_cross.c:259 modules/process/linematch.c:892
-#: modules/process/slope_dist.c:355 modules/tools/linestats.c:424
-#: modules/tools/profile.c:579 modules/tools/roughness.c:878
-#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:388
-#: modules/volume/volume_slice.c:406
+#: modules/process/curvature.c:684 modules/process/drift.c:340
+#: modules/process/fft_profile.c:300 modules/process/fractal.c:308
+#: modules/process/grain_cross.c:260 modules/process/linematch.c:855
+#: modules/process/slope_dist.c:347 modules/tools/linestats.c:424
+#: modules/tools/profile.c:559 modules/tools/roughness.c:886
+#: modules/tools/sfunctions.c:488 modules/tools/spectro.c:391
+#: modules/volume/volume_slice.c:408
 msgid "New graph"
 msgstr "Nový graf"
 
-#: modules/process/curvature.c:951
+#: modules/process/curvature.c:689 modules/process/drift.c:345
+#: modules/process/fft_profile.c:306 modules/process/fractal.c:313
+#: modules/process/grain_cross.c:254 modules/process/linematch.c:860
+#: modules/process/slope_dist.c:352 modules/tools/linestats.c:418
+#: modules/tools/profile.c:563 modules/tools/roughness.c:890
+#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:385
+#: modules/volume/volume_slice.c:400
+msgid "Target _graph:"
+msgstr "Cílový _graf:"
+
+#: modules/process/curvature.c:949
 msgid "Axes are outside the image."
 msgstr "Osy jsou mimo obrázek"
 
-#: modules/process/curvature.c:1018
+#: modules/process/curvature.c:1016
 msgid "Save Curvature"
 msgstr "Uložit křivost"
 
@@ -8626,8 +8920,8 @@ msgstr "CWT"
 msgid "2D CWT"
 msgstr "2D CWT"
 
-#: modules/process/cwt.c:158 modules/process/dwt.c:185
-#: modules/process/dwtanisotropy.c:209
+#: modules/process/cwt.c:159 modules/process/dwt.c:185
+#: modules/process/dwtanisotropy.c:212
 msgid "_Wavelet type:"
 msgstr "Typ _waveletu:"
 
@@ -8636,14 +8930,14 @@ msgid "Generates particles using simple dynamical model"
 msgstr "Generuje částice pomocí jednoduchého dynamického modelu"
 
 #: modules/process/deposit_synth.c:184
-msgid "/S_ynthetic/_Particles..."
-msgstr "/S_yntetická/Část_ice..."
+msgid "/S_ynthetic/_Deposition/_Particles..."
+msgstr "/S_yntetická/_Depozice/Část_ice..."
 
 #: modules/process/deposit_synth.c:188
 msgid "Generate particles using dynamical model"
 msgstr "Generovat částice pomocí dynamického modelu"
 
-#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:867
+#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:866
 #, c-format
 msgid ""
 "Not all the particles could be deposited (%u),\n"
@@ -8652,73 +8946,69 @@ msgstr ""
 "Nebyly deponovány všechny částice (%u),\n"
 "zkus větší počet relaxačních kroků."
 
-#: modules/process/deposit_synth.c:347
+#: modules/process/deposit_synth.c:348
 msgid "Particle Generation"
 msgstr "Generování částic"
 
-#: modules/process/deposit_synth.c:427
+#: modules/process/deposit_synth.c:431
 msgid "Particle r_adius:"
 msgstr "Poloměr čás_tice:"
 
-#: modules/process/deposit_synth.c:438
+#: modules/process/deposit_synth.c:443
 msgid "Distribution _width:"
 msgstr "Šířka _rozdělení:"
 
-#: modules/process/deposit_synth.c:449
-msgid "Surface _coverage:"
-msgstr "_Pokrytí povrchu:"
-
-#: modules/process/deposit_synth.c:458
+#: modules/process/deposit_synth.c:462
 msgid "_Relax steps:"
 msgstr "Rela_xační kroky:"
 
-#: modules/process/deposit_synth.c:659 modules/process/synth.h:548
+#: modules/process/deposit_synth.c:660 modules/process/synth.h:577
 msgid "R_andom seed:"
 msgstr "_Hnízdo náhodných čísel:"
 
-#: modules/process/deposit_synth.c:665 modules/process/synth.h:554
+#: modules/process/deposit_synth.c:666 modules/process/synth.h:583
 msgid "seed|_New"
 msgstr "_Nové"
 
-#: modules/process/deposit_synth.c:676
+#: modules/process/deposit_synth.c:677
 msgid "Randomize"
 msgstr "Znáhodn_it"
 
-#: modules/process/deposit_synth.c:860 modules/process/domain_synth.c:919
+#: modules/process/deposit_synth.c:859 modules/process/domain_synth.c:919
 msgid "Running computation..."
 msgstr "Běží výpočet..."
 
-#: modules/process/deposit_synth.c:865
+#: modules/process/deposit_synth.c:864
 #, c-format
 msgid "%d particles were deposited"
 msgstr "%d částic bylo deponováno"
 
-#: modules/process/deposit_synth.c:1093
+#: modules/process/deposit_synth.c:1092
 msgid "Initial particle set..."
 msgstr "Počáteční množina částic..."
 
-#: modules/process/deposit_synth.c:1252
+#: modules/process/deposit_synth.c:1251
 msgid "Running revise..."
 msgstr "Běží relaxace..."
 
-#: modules/process/deposit_synth.c:1380
+#: modules/process/deposit_synth.c:1379
 msgid "Error: too many particles."
 msgstr "Chyba: příliš mnoho částic."
 
-#: modules/process/deposit_synth.c:1382
+#: modules/process/deposit_synth.c:1381
 msgid "Error: no particles."
 msgstr "Chyba: žádné částice."
 
-#: modules/process/deposit_synth.c:1384
+#: modules/process/deposit_synth.c:1383
 msgid "Error: particles too large."
 msgstr "Chyba: částice jsou příliš velké."
 
-#: modules/process/deposit_synth.c:1386
+#: modules/process/deposit_synth.c:1385
 msgid "Error: particles too small."
 msgstr "Chyba: částice jsou příliš malé."
 
 #: modules/process/diff_synth.c:197 modules/tools/linestats.c:173
-#: modules/volume/volume_linestat.c:149
+#: modules/volume/volume_linestat.c:151
 msgid "Variation"
 msgstr "Variace"
 
@@ -8731,8 +9021,8 @@ msgid "Generates surfaces by diffusion limited aggregation."
 msgstr "Generuje povrchy pomocí agregace omezené difúzí (DLA)."
 
 #: modules/process/diff_synth.c:228
-msgid "/S_ynthetic/_Diffusion..."
-msgstr "/S_yntetická/_Difúze..."
+msgid "/S_ynthetic/_Deposition/_Diffusion..."
+msgstr "/S_yntetická/_Depozice/_Difúze..."
 
 #: modules/process/diff_synth.c:232
 msgid "Generate surface by diffusion limited aggregation"
@@ -8746,45 +9036,45 @@ msgstr "Agregace omezená difúzí"
 msgid "_Flux:"
 msgstr "_Tok:"
 
-#: modules/process/diff_synth.c:522
+#: modules/process/diff_synth.c:521
 msgid "Probabilities"
 msgstr "Pravděpodobnosti"
 
-#: modules/process/diff_synth.c:530
+#: modules/process/diff_synth.c:529
 msgid "_Sticking:"
 msgstr "_Uváznutí:"
 
-#: modules/process/diff_synth.c:539
+#: modules/process/diff_synth.c:538
 msgid "_Activation:"
 msgstr "Aktivace:"
 
-#: modules/process/diff_synth.c:548
+#: modules/process/diff_synth.c:547
 msgid "Passing Sch_woebel:"
 msgstr "Překonání Sch_woebela:"
 
-#: modules/process/dimensions.h:457
+#: modules/process/dimensions.h:439
 msgid "S_quare image"
 msgstr "Č_tvercový obrázek"
 
-#: modules/process/dimensions.h:489
+#: modules/process/dimensions.h:473
 msgid "_Dimension units:"
 msgstr "Jednotky roz_měrů:"
 
-#: modules/process/dimensions.h:502
-msgid "Current Channel"
-msgstr "Aktuální kanál"
+#: modules/process/dimensions.h:488
+msgid "Current Image"
+msgstr "Současný obrázek"
 
-#: modules/process/dimensions.h:506
-msgid "_Take Dimensions from Current Channel"
-msgstr "_Převzít rozměry z aktuálního kanálu"
+#: modules/process/dimensions.h:492
+msgid "_Take Dimensions from Current Image"
+msgstr "_Převzít rozměry ze současného obrázku"
 
-#: modules/process/dimensions.h:514
-msgid "_Replace the current channel"
-msgstr "Nahra_dit aktuální kanál"
+#: modules/process/dimensions.h:501
+msgid "_Replace the current image"
+msgstr "Nahra_dit současný obrázek"
 
-#: modules/process/dimensions.h:523
-msgid "_Start from the current channel"
-msgstr "_Začít z aktuálního kanálu"
+#: modules/process/dimensions.h:510
+msgid "_Start from the current image"
+msgstr "_Začít ze současného obrázku"
 
 #: modules/process/domain_synth.c:158
 msgid "Discrete state"
@@ -8843,13 +9133,13 @@ msgid "_Monte Carlo time step:"
 msgstr "Časový krok _Monte Carlo:"
 
 #: modules/process/domain_synth.c:504 modules/process/fft_filter_2d.c:586
-#: modules/volume/volume_slice.c:364
+#: modules/volume/volume_slice.c:366
 msgid "Output Options"
 msgstr "Možnosti výstupu"
 
 #: modules/process/domain_synth.c:523 modules/process/fft_filter_2d.c:591
-#: modules/process/mask_edt.c:377 modules/process/slope_dist.c:323
-#: modules/volume/volume_linestat.c:432 modules/volume/volume_slice.c:384
+#: modules/process/mask_edt.c:211 modules/process/slope_dist.c:323
+#: modules/volume/volume_linestat.c:437 modules/volume/volume_slice.c:386
 msgid "Output type:"
 msgstr "Typ výstupu:"
 
@@ -8877,57 +9167,49 @@ msgstr "Rozsah _hledání:"
 msgid "rows"
 msgstr "řádků"
 
-#: modules/process/drift.c:304
+#: modules/process/drift.c:305
 msgid "Correct _data"
 msgstr "Opravit _data"
 
-#: modules/process/drift.c:314
+#: modules/process/drift.c:315
 msgid "_Exclude linear skew"
 msgstr "_Vynechat lineární zkosení"
 
-#: modules/process/drift.c:324
+#: modules/process/drift.c:325
 msgid "Plot drift _graph"
 msgstr "Nakreslit _graf driftu"
 
-#: modules/process/drift.c:356 modules/process/fit-shape.c:693
-#: modules/process/neural.c:548 modules/process/polydistort.c:275
+#: modules/process/drift.c:355 modules/process/fit-shape.c:705
+#: modules/process/neural.c:552 modules/process/polydistort.c:278
 msgid "Preview:"
 msgstr "Náhled:"
 
-#: modules/process/drift.c:366
+#: modules/process/drift.c:365
 msgid "Drift _lines"
 msgstr "_Linie driftu"
 
-#: modules/process/drift.c:374 modules/process/facet_analysis.c:407
-#: modules/process/grain_edge.c:285 modules/process/grain_filter.c:357
-#: modules/process/grain_mark.c:367 modules/process/grain_wshed.c:267
-#: modules/process/mark_disconn.c:310 modules/process/scars.c:381
+#: modules/process/drift.c:373 modules/process/facet_analysis.c:390
+#: modules/process/grain_edge.c:272 modules/process/grain_filter.c:356
+#: modules/process/grain_mark.c:341 modules/process/grain_wshed.c:271
+#: modules/process/mark_disconn.c:298 modules/process/scars.c:405
 #: modules/process/wpour_mark.c:369
 msgid "_Mask color:"
 msgstr "Barva _masky"
 
-#: modules/process/drift.c:379
-msgid "Distribute"
-msgstr "Rozkopírovat"
-
-#: modules/process/drift.c:388
-msgid "Replace"
-msgstr "Nahradit"
-
-#: modules/process/drift.c:569
+#: modules/process/drift.c:570
 msgid "Drift-corrected"
 msgstr "Drift opraven"
 
-#: modules/process/drift.c:613
+#: modules/process/drift.c:614
 msgid "Drift"
 msgstr "Drift"
 
-#: modules/process/drift.c:614 modules/xyz/xyz_drift.c:392
+#: modules/process/drift.c:615 modules/xyz/xyz_drift.c:392
 #: modules/xyz/xyz_drift.c:411 modules/xyz/xyz_drift.c:430
 msgid "drift"
 msgstr "drift"
 
-#: modules/process/drift.c:620 modules/xyz/xyz_drift.c:402
+#: modules/process/drift.c:621 modules/xyz/xyz_drift.c:402
 msgid "x-axis drift"
 msgstr "drift podél x"
 
@@ -8985,11 +9267,11 @@ msgstr "DWT anisotropie"
 msgid "2D DWT Anisotropy"
 msgstr "2D DWT detekce anisotropie"
 
-#: modules/process/dwtanisotropy.c:214
+#: modules/process/dwtanisotropy.c:218
 msgid "X/Y ratio threshold:"
 msgstr "práh poměru X/Y:"
 
-#: modules/process/dwtanisotropy.c:222
+#: modules/process/dwtanisotropy.c:226
 msgid "Low level exclude limit:"
 msgstr "Spodní limit rozkladu:"
 
@@ -9118,7 +9400,7 @@ msgstr "Detekce nespojitostí pomocí průsečíků nuly"
 msgid "_Gaussian FWHM:"
 msgstr "FWHM _gausiánu:"
 
-#: modules/process/edge.c:681 modules/process/mark_disconn.c:271
+#: modules/process/edge.c:681 modules/process/mark_disconn.c:272
 msgid "_Threshold:"
 msgstr "_Práh:"
 
@@ -9182,11 +9464,11 @@ msgstr "Entropie:"
 msgid "Entropy deficit:"
 msgstr "Deficit entropie:"
 
-#: modules/process/entropy.c:567
+#: modules/process/entropy.c:568
 msgid "Entropy at scales"
 msgstr "Entropie na škálách"
 
-#: modules/process/entropy.c:586
+#: modules/process/entropy.c:587
 msgid "Best estimate"
 msgstr "Nejlepší odhad"
 
@@ -9234,23 +9516,23 @@ msgstr "Do_prava:"
 msgid "Extend _symetrically"
 msgstr "Rozšířit _symetricky"
 
-#: modules/process/extend.c:268 modules/process/polydistort.c:256
-#: modules/xyz/xyz_raster.c:658
+#: modules/process/extend.c:268 modules/process/polydistort.c:259
+#: modules/xyz/xyz_raster.c:627
 msgid "exterior|Border"
 msgstr "Hranice"
 
-#: modules/process/extend.c:270 modules/process/polydistort.c:258
-#: modules/xyz/xyz_raster.c:660
+#: modules/process/extend.c:270 modules/process/polydistort.c:261
+#: modules/xyz/xyz_raster.c:629
 msgid "exterior|Mirror"
 msgstr "Zrcadlení"
 
-#: modules/process/extend.c:272 modules/process/polydistort.c:260
-#: modules/xyz/xyz_raster.c:662
+#: modules/process/extend.c:272 modules/process/polydistort.c:263
+#: modules/xyz/xyz_raster.c:631
 msgid "exterior|Periodic"
 msgstr "Periodický"
 
-#: modules/process/extend.c:275 modules/process/polydistort.c:263
-#: modules/xyz/xyz_raster.c:650
+#: modules/process/extend.c:275 modules/process/polydistort.c:266
+#: modules/xyz/xyz_raster.c:619
 msgid "_Exterior type:"
 msgstr "_Vnějšek:"
 
@@ -9282,11 +9564,11 @@ msgstr "Počet bodů cesty:"
 msgid "There is no path selection."
 msgstr "Není vybrána žádná cesta."
 
-#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:390
+#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:383
 msgid "X position"
 msgstr "X poloha"
 
-#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:397
+#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:389
 msgid "Y position"
 msgstr "Y poloha"
 
@@ -9299,7 +9581,7 @@ msgid "Y tangent"
 msgstr "_Y-ová složka tečny"
 
 #: modules/process/extract_path.c:392 modules/process/extract_path.c:404
-#: modules/process/pat_synth.c:1432 modules/tools/distance.c:146
+#: modules/process/pat_synth.c:1433 modules/tools/distance.c:146
 msgid "Distance"
 msgstr "Vzdálenosti"
 
@@ -9343,47 +9625,36 @@ msgstr "/_Statistika/Analýza _plošek..."
 msgid "Mark areas by 2D slope"
 msgstr "Označení plošek podle 2D sklonu"
 
-#: modules/process/facet_analysis.c:266
+#: modules/process/facet_analysis.c:270
 msgid "Mark Facets"
 msgstr "Označení plošek"
 
-#: modules/process/facet_analysis.c:269
+#: modules/process/facet_analysis.c:273
 msgid "verb|_Mark"
 msgstr "_Označit"
 
 #. TRANSLATORS: The direction or line orthogonal to something.
-#: modules/process/facet_analysis.c:325
+#: modules/process/facet_analysis.c:329
 msgid "Normal"
 msgstr "Normála"
 
-#: modules/process/facet_analysis.c:333
+#: modules/process/facet_analysis.c:337
 msgid "_Find Maximum"
 msgstr "_Najít maximum"
 
-#: modules/process/facet_analysis.c:341
+#: modules/process/facet_analysis.c:345
 msgid "Mean Normal"
 msgstr "Střední normála"
 
-#: modules/process/facet_analysis.c:350
+#: modules/process/facet_analysis.c:362
 msgid "Facet plane size:"
 msgstr "Velikost plošky:"
 
-#: modules/process/facet_analysis.c:375
+#: modules/process/facet_analysis.c:370
 msgid "_Tolerance:"
 msgstr "_Tolerance:"
 
-#: modules/process/facet_analysis.c:384 modules/process/grain_edge.c:262
-#: modules/process/grain_mark.c:344 modules/process/mark_disconn.c:286
-msgid "Com_bine with existing mask"
-msgstr "Zkom_binovat s existující maskou"
-
-#: modules/process/facet_analysis.c:398 modules/process/grain_edge.c:276
-#: modules/process/grain_mark.c:358 modules/process/mark_disconn.c:301
-#: modules/process/mark_with.c:230 modules/process/mask_morph.c:210
-msgid "Operation:"
-msgstr "Operace:"
-
-#: modules/process/facet_analysis.c:415
+#: modules/process/facet_analysis.c:398
 msgid ""
 "Warning: Lateral and value units differ. Angles are not physically "
 "meaningful."
@@ -9415,8 +9686,8 @@ msgstr "_Hurstův exponent:"
 msgid "_Stationarity scale:"
 msgstr "Škála _stacionarity:"
 
-#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:509
-#: modules/process/noise_synth.c:409
+#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:507
+#: modules/process/noise_synth.c:407
 msgid "_Distribution:"
 msgstr "_Rozdělení:"
 
@@ -9424,17 +9695,17 @@ msgstr "_Rozdělení:"
 msgid "Po_wer:"
 msgstr "M_ocnina"
 
-#: modules/process/fbm_synth.c:408 modules/process/fft_synth.c:414
-#: modules/process/lno_synth.c:533 modules/process/noise_synth.c:433
+#: modules/process/fbm_synth.c:407 modules/process/fft_synth.c:414
+#: modules/process/lno_synth.c:531 modules/process/noise_synth.c:431
 msgid "_RMS:"
 msgstr "_RMS:"
 
-#: modules/process/fbm_synth.c:477 modules/process/lno_synth.c:251
-#: modules/process/noise_synth.c:178
+#: modules/process/fbm_synth.c:476 modules/process/lno_synth.c:249
+#: modules/process/noise_synth.c:176
 msgid "distribution|Exponential"
 msgstr "Exponenciální"
 
-#: modules/process/fbm_synth.c:478
+#: modules/process/fbm_synth.c:477
 msgid "distribution|Power"
 msgstr "Uniformní"
 
@@ -9486,7 +9757,7 @@ msgstr "Imaginární"
 msgid "Modulus"
 msgstr "Modul FFT"
 
-#: modules/process/fft.c:327 modules/process/wave_synth.c:583
+#: modules/process/fft.c:327 modules/process/wave_synth.c:618
 msgid "Phase"
 msgstr "Fáze"
 
@@ -9502,63 +9773,63 @@ msgstr "_Surová transformace"
 msgid "I_maginary part:"
 msgstr "I_maginární část:"
 
-#: modules/process/fft.c:382
+#: modules/process/fft.c:380
 msgid "_Inverse transform"
 msgstr "_Inverzní transformace"
 
-#: modules/process/fft.c:411
+#: modules/process/fft.c:409
 msgid "Subtract mean _value beforehand"
 msgstr "Nejprve odečíst _střední hodnotu"
 
-#: modules/process/fft.c:422
+#: modules/process/fft.c:420
 msgid "_Preserve RMS"
 msgstr "_Zachovat RMS"
 
-#: modules/process/fft_filter_1d.c:117
+#: modules/process/fft_filter_1d.c:118
 msgid "FFT filtering"
 msgstr "Filtrování pomocí FFT"
 
-#: modules/process/fft_filter_1d.c:131
+#: modules/process/fft_filter_1d.c:132
 msgid "/_Correct Data/1D _FFT Filtering..."
 msgstr "/_Korekce dat/1D _FFT filtrování..."
 
-#: modules/process/fft_filter_1d.c:135
+#: modules/process/fft_filter_1d.c:136
 msgid "1D FFT Filtering"
 msgstr "1D FFT filtrování"
 
-#: modules/process/fft_filter_1d.c:165 modules/process/wpour_mark.c:391
+#: modules/process/fft_filter_1d.c:166 modules/process/wpour_mark.c:391
 msgid "Marked"
 msgstr "Označené"
 
-#: modules/process/fft_filter_1d.c:166
+#: modules/process/fft_filter_1d.c:167
 msgid "Unmarked"
 msgstr "Neoznačené"
 
-#: modules/process/fft_filter_1d.c:169
+#: modules/process/fft_filter_1d.c:170
 msgid "Null"
 msgstr "Nulovat"
 
-#: modules/process/fft_filter_1d.c:170
+#: modules/process/fft_filter_1d.c:171
 msgid "Suppress"
 msgstr "Potlačit"
 
-#: modules/process/fft_filter_1d.c:180
+#: modules/process/fft_filter_1d.c:181
 msgid "1D FFT filter"
 msgstr "1D FFT filtr"
 
-#: modules/process/fft_filter_1d.c:269 modules/process/linematch.c:861
+#: modules/process/fft_filter_1d.c:271 modules/process/linematch.c:828
 msgid "_Direction:"
 msgstr "S_měr:"
 
-#: modules/process/fft_filter_1d.c:277
+#: modules/process/fft_filter_1d.c:279
 msgid "_Suppress type:"
 msgstr "Typ _potlačení:"
 
-#: modules/process/fft_filter_1d.c:285
+#: modules/process/fft_filter_1d.c:287
 msgid "_Filter type:"
 msgstr "Typ _filtru:"
 
-#: modules/process/fft_filter_1d.c:513
+#: modules/process/fft_filter_1d.c:515
 msgid "1D FFT Filtered Data"
 msgstr "1D FFT filtrovaná data"
 
@@ -9578,9 +9849,10 @@ msgstr "Dvourozměrné FFT filtrování"
 msgid "Filtered Data"
 msgstr "Filtrovaná data"
 
-#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:594
-#: modules/process/fit-shape.c:643 modules/process/fit-shape.c:658
-#: modules/process/fit-shape.c:662 modules/process/neural.c:560
+#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:604
+#: modules/process/fit-shape.c:653 modules/process/fit-shape.c:668
+#: modules/process/fit-shape.c:672 modules/process/neural.c:564
+#: modules/process/psf.c:232
 msgid "Difference"
 msgstr "Rozdíl"
 
@@ -9636,7 +9908,7 @@ msgstr "Maska filtru"
 msgid "_Undo"
 msgstr "_Zpět"
 
-#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:556
+#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:562
 msgid "_Fill"
 msgstr "_Vyplnění"
 
@@ -9644,7 +9916,7 @@ msgstr "_Vyplnění"
 msgid "_Snap to origin"
 msgstr "Při_chytit k počátku"
 
-#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:339
+#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:329
 msgid "Zoom:"
 msgstr "_Zvětšení:"
 
@@ -9680,37 +9952,37 @@ msgstr "Vyplnit celou masku filtru"
 msgid "Force shapes to center around the origin"
 msgstr "Upevnit středy nových oblastí do počátku"
 
-#: modules/process/fft_profile.c:125
+#: modules/process/fft_profile.c:124
 msgid ""
 "Reads radial sections of two-dimensional power spectrum density function."
 msgstr "Odečítá radiální řezy dvojrozměrné spektrální hustoty."
 
-#: modules/process/fft_profile.c:140
+#: modules/process/fft_profile.c:139
 msgid "/_Statistics/_PSDF Section..."
 msgstr "/_Statistika/Řez _PSDF..."
 
-#: modules/process/fft_profile.c:144
+#: modules/process/fft_profile.c:143
 msgid "Read radial PSDF sections"
 msgstr "Odečítání radiálních řezů PSDF"
 
-#: modules/process/fft_profile.c:190
+#: modules/process/fft_profile.c:189
 msgid "Radial PSDF Section"
 msgstr "Radiální řez PSDF"
 
-#: modules/process/fft_profile.c:237
+#: modules/process/fft_profile.c:236
 msgid "PSDF Section"
 msgstr "PSDF řez"
 
-#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:336
-#: modules/tools/profile.c:517 modules/tools/sfunctions.c:443
-msgid "_Fix res.:"
-msgstr "Ro_zliš.:"
+#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:338
+#: modules/tools/profile.c:514 modules/tools/sfunctions.c:454
+msgid "_Fixed resolution:"
+msgstr "Pevné ro_zlišení:"
 
-#: modules/process/fft_profile.c:279
+#: modules/process/fft_profile.c:278
 msgid "_Separate curves"
 msgstr "_Oddělit křivky"
 
-#: modules/process/fft_profile.c:496
+#: modules/process/fft_profile.c:483
 #, c-format
 msgid "PSDF %.0f°"
 msgstr "PSDF %.0f°"
@@ -9731,11 +10003,15 @@ msgstr "Vytvořit povrch spektrální syntézou"
 msgid "Spectral Synthesis"
 msgstr "Spektrální syntéza"
 
-#: modules/process/fft_synth.c:429
+#: modules/process/fft_synth.c:430
 msgid "M_inimum frequency:"
 msgstr "M_inimální frekvence:"
 
-#: modules/process/fft_synth.c:449
+#: modules/process/fft_synth.c:430 modules/process/fft_synth.c:450
+msgid "px<sup>-1</sup>"
+msgstr "px<sup>-1</sup>"
+
+#: modules/process/fft_synth.c:450
 msgid "Ma_ximum frequency:"
 msgstr "Ma_ximální frekvence:"
 
@@ -9755,85 +10031,154 @@ msgstr "Aplikovat _lorentzovský multiplikátor"
 msgid "Enable _power multiplier"
 msgstr "Aplikovat mocninný multi_plikátor"
 
-#: modules/process/fit-shape.c:270
+#: modules/process/fibre_synth.c:256
+msgid "Semi-circle"
+msgstr "Půlkružnice"
+
+#: modules/process/fibre_synth.c:257
+msgid "Triangle"
+msgstr "Trojúhelník"
+
+#: modules/process/fibre_synth.c:258
+msgid "Rectangle"
+msgstr "Obdélník"
+
+#: modules/process/fibre_synth.c:260
+msgid "Quadratic spline"
+msgstr "Kvadratický spline"
+
+#: modules/process/fibre_synth.c:266
+msgid "Generates surfaces composed from randomly placed fibers."
+msgstr "Vytváří povrch z náhodně umístěných vláken."
+
+#: modules/process/fibre_synth.c:280
+msgid "/S_ynthetic/_Deposition/_Fibers..."
+msgstr "/S_yntetická/_Depozice/_Vlákna..."
+
+#: modules/process/fibre_synth.c:284
+msgid "Generate surface of randomly placed fibers"
+msgstr "Vytvořit povrch z náhodně umístěných vláken"
+
+#: modules/process/fibre_synth.c:420
+msgid "Random Fibers"
+msgstr "Náhodná vlákna"
+
+#: modules/process/fibre_synth.c:494 modules/process/obj_synth.c:510
+msgid "_Shape:"
+msgstr "_Tvar:"
+
+#: modules/process/fibre_synth.c:513 modules/process/obj_synth.c:529
+msgid "obj."
+msgstr "obj."
+
+#: modules/process/fibre_synth.c:553
+msgid "Scales _with width"
+msgstr "Škálova_t s šířkou"
+
+#: modules/process/fibre_synth.c:591 modules/process/synth.h:485
+msgid "Deformation"
+msgstr "Deformace"
+
+#: modules/process/fibre_synth.c:600 modules/process/lno_synth.c:852
+#: modules/process/lno_synth.c:1222 modules/process/mask_noisify.c:177
+msgid "Densi_ty:"
+msgstr "_Hustota:"
+
+#: modules/process/fibre_synth.c:607
+msgid "_Lateral:"
+msgstr "_Příčná:"
+
+#: modules/process/fibre_synth.c:614
+msgid "Le_ngthwise:"
+msgstr "_Délková:"
+
+#: modules/process/fibre_synth.c:819
+msgid "Along fiber:"
+msgstr "Podél vlákna:"
+
+#: modules/process/fibre_synth.c:1180
+msgid "Generating fibers..."
+msgstr "Generuji vlákna..."
+
+#: modules/process/fit-shape.c:264
 msgid "Fits predefined geometrical shapes to data."
 msgstr "Fituje definované geometrické tvary na data."
 
-#: modules/process/fit-shape.c:284
+#: modules/process/fit-shape.c:278
 msgid "/_Level/_Fit Shape..."
 msgstr "/_Vyrovnání/Proložit _tvar..."
 
-#: modules/process/fit-shape.c:288 modules/process/fit-shape.c:295
+#: modules/process/fit-shape.c:282 modules/process/fit-shape.c:289
 msgid "Fit geometrical shapes"
 msgstr "Fitovat geometrické tvary"
 
-#: modules/process/fit-shape.c:291
+#: modules/process/fit-shape.c:285
 msgid "/_Fit Shape..."
 msgstr "/Proložit _tvar..."
 
-#: modules/process/fit-shape.c:390
+#: modules/process/fit-shape.c:389
 msgid "Fit Shape"
 msgstr "Proložení tvaru"
 
-#: modules/process/fit-shape.c:395
+#: modules/process/fit-shape.c:396
 msgid "verb|_Quick Fit"
 msgstr "Proložit _narychlo"
 
-#: modules/process/fit-shape.c:473 modules/process/fit-shape.c:2159
+#: modules/process/fit-shape.c:474 modules/process/fit-shape.c:2141
 msgid "Derived Quantities"
 msgstr "Odvozené veličiny"
 
-#: modules/process/fit-shape.c:478 modules/process/fit-shape.c:2129
+#: modules/process/fit-shape.c:479 modules/process/fit-shape.c:2111
 msgid "Mean square difference:"
 msgstr "Střední kvadratická odchylka:"
 
-#: modules/process/fit-shape.c:580 modules/process/fit-shape.c:626
-#: modules/process/fit-shape.c:657 modules/process/fit-shape.c:661
+#: modules/process/fit-shape.c:590 modules/process/fit-shape.c:636
+#: modules/process/fit-shape.c:667 modules/process/fit-shape.c:671
 msgid "Fitted shape"
 msgstr "Proložený tvar"
 
-#: modules/process/fit-shape.c:663 modules/process/mark_disconn.c:189
-#: modules/process/scars.c:281
+#: modules/process/fit-shape.c:673 modules/process/mark_disconn.c:189
+#: modules/process/scars.c:299
 msgid "Both"
 msgstr "Oba"
 
-#: modules/process/fit-shape.c:680
+#: modules/process/fit-shape.c:690 modules/process/psf-fit.c:308
 msgid "_Function type:"
 msgstr "Typ _funkce:"
 
-#: modules/process/fit-shape.c:708
+#: modules/process/fit-shape.c:720
 msgid "Show differences with _adapted color map"
 msgstr "Zobrazovat rozdíly s přizpůsobenou barevnou mapou"
 
-#: modules/process/fit-shape.c:720
+#: modules/process/fit-shape.c:732
 msgid "Full fit is _geometric"
 msgstr "Plný fit je _geometrický"
 
-#: modules/process/fit-shape.c:757
+#: modules/process/fit-shape.c:769
 msgid "Calculate differences for e_xcluded pixels"
 msgstr "Počítat rozdíly i pro vynechané pixely"
 
-#: modules/process/fit-shape.c:804
+#: modules/process/fit-shape.c:816
 msgid "_Recalculate Image"
 msgstr "_Přepočítat obrázek"
 
-#: modules/process/fit-shape.c:811
+#: modules/process/fit-shape.c:823
 msgid "Revert to _Previous Values"
 msgstr "_Vrátit předchozí hodnoty"
 
-#: modules/process/fit-shape.c:1850
+#: modules/process/fit-shape.c:1864
 msgid "Parameter estimation failed"
 msgstr "Odhad parametrů se nezdařil"
 
-#: modules/process/fit-shape.c:1853
+#: modules/process/fit-shape.c:1867
 msgid "Fit failed"
 msgstr "Prokládání se nezdařilo"
 
-#: modules/process/fit-shape.c:1855
+#: modules/process/fit-shape.c:1869
 msgid "Fit was interruped"
 msgstr "Prokládání bylo přerušeno"
 
-#: modules/process/fit-shape.c:2115
+#: modules/process/fit-shape.c:2097
 msgid "(fixed)"
 msgstr "(pevný)"
 
@@ -9853,35 +10198,35 @@ msgstr "Vyrovnat plochou základu povrchu s vyvýšeninami"
 msgid "Polynomial leveling..."
 msgstr "Polynomiální vyrovnávání..."
 
-#: modules/process/fraccor.c:38
+#: modules/process/fraccor.c:39
 msgid "Removes data under mask using fractal interpolation."
 msgstr "Odstraňuje data pod maskou pomocí fraktální interpolace."
 
-#: modules/process/fraccor.c:52
+#: modules/process/fraccor.c:53
 msgid "/_Correct Data/_Fractal Correction"
 msgstr "/_Korekce dat/_Fraktální korekce"
 
-#: modules/process/fraccor.c:56
+#: modules/process/fraccor.c:57
 msgid "Interpolate data under mask with fractal interpolation"
 msgstr "Interpolovat data pod maskou fraktální interpolací"
 
-#: modules/process/fractal.c:134
+#: modules/process/fractal.c:130
 msgid "Partitioning"
 msgstr "Partitioning"
 
-#: modules/process/fractal.c:135
+#: modules/process/fractal.c:131
 msgid "Cube counting"
 msgstr "Počítání krychlí"
 
-#: modules/process/fractal.c:136
+#: modules/process/fractal.c:132
 msgid "Triangulation"
 msgstr "Triangulace"
 
-#: modules/process/fractal.c:137
+#: modules/process/fractal.c:133
 msgid "Power spectrum"
 msgstr "Spektrální hustota"
 
-#: modules/process/fractal.c:173
+#: modules/process/fractal.c:169
 msgid ""
 "Calculates fractal dimension using several methods (partitioning, box "
 "counting, triangulation, power spectrum)."
@@ -9889,54 +10234,50 @@ msgstr ""
 "Počítá fraktální dimenzi několika metodami (rozdělování, počítání boxů, "
 "triangulace, ze spektrální hustoty)."
 
-#: modules/process/fractal.c:188
+#: modules/process/fractal.c:184
 msgid "/_Statistics/_Fractal Dimension..."
 msgstr "/_Statistika/_Fraktální dimenze..."
 
-#: modules/process/fractal.c:192
+#: modules/process/fractal.c:188
 msgid "Calculate fractal dimension"
 msgstr "Výpočet fraktální dimenze"
 
-#: modules/process/fractal.c:227
+#: modules/process/fractal.c:223
 msgid "Fractal Dimension"
 msgstr "Fraktální dimenze"
 
-#: modules/process/fractal.c:228
-msgid "Reco_mpute"
-msgstr "Pře_počítat"
-
-#: modules/process/fractal.c:269
+#: modules/process/fractal.c:253
 msgid "_Method:"
 msgstr "_Metoda:"
 
-#: modules/process/fractal.c:290
+#: modules/process/fractal.c:269
 msgid "Fit Area"
 msgstr "Oblast prokládání"
 
-#: modules/process/fractal.c:295
-msgid "From:"
-msgstr "Od:"
-
-#: modules/process/fractal.c:295 modules/process/fractal.c:589
-#: modules/process/fractal.c:613
+#: modules/process/fractal.c:273 modules/process/fractal.c:545
+#: modules/process/fractal.c:569
 msgid "minimum"
 msgstr "minimum"
 
-#: modules/process/fractal.c:298
-msgid "To:"
-msgstr "Do:"
+#: modules/process/fractal.c:274
+msgid "From:"
+msgstr "Od:"
 
-#: modules/process/fractal.c:298 modules/process/fractal.c:590
-#: modules/process/fractal.c:614
+#: modules/process/fractal.c:279 modules/process/fractal.c:546
+#: modules/process/fractal.c:570
 msgid "maximum"
 msgstr "maximum"
 
-#: modules/process/fractal.c:308 modules/process/mark_with.c:390
-#: modules/process/neural.c:559
+#: modules/process/fractal.c:280
+msgid "To:"
+msgstr "Do:"
+
+#: modules/process/fractal.c:287 modules/process/mark_with.c:394
+#: modules/process/neural.c:563
 msgid "Result"
 msgstr "Výsledek"
 
-#: modules/process/fractal.c:550
+#: modules/process/fractal.c:506
 msgid "Linear fit"
 msgstr "Proložená přímka"
 
@@ -10008,11 +10349,11 @@ msgstr ""
 msgid "Grain Correlations"
 msgstr "Zrnové Korelace"
 
-#: modules/process/grain_cross.c:240
+#: modules/process/grain_cross.c:241
 msgid "_Abscissa"
 msgstr "_Vodorovná osa"
 
-#: modules/process/grain_cross.c:244
+#: modules/process/grain_cross.c:245
 msgid "O_rdinate"
 msgstr "_Svislá osa"
 
@@ -10040,120 +10381,120 @@ msgstr "Vykreslit _grafy"
 msgid "Grain Distributions"
 msgstr "Rozdělení zrn"
 
-#: modules/process/grain_dist.c:553
+#: modules/process/grain_dist.c:547
 msgid "count"
 msgstr "počet"
 
-#: modules/process/grain_dist.c:617
+#: modules/process/grain_dist.c:611
 msgid "Export Raw Grain Values"
 msgstr "Exportovat surové hodnoty zrn"
 
-#: modules/process/grain_edge.c:100
+#: modules/process/grain_edge.c:99
 msgid "Marks grains by edge detection method."
 msgstr "Označuje zrna pomocí detekce hran."
 
-#: modules/process/grain_edge.c:114
+#: modules/process/grain_edge.c:113
 msgid "/_Grains/Mark by _Edge Detection..."
 msgstr "/_Zrna/Označit _detekcí hran..."
 
-#: modules/process/grain_edge.c:118
+#: modules/process/grain_edge.c:117
 msgid "Mark grains with edge detection mechanism"
 msgstr "Označit zrna pomocí detekce hran"
 
-#: modules/process/grain_edge.c:207
+#: modules/process/grain_edge.c:206
 msgid "Mark Grains by Edge Detection"
 msgstr "Vyznačení zrn detekcí hran"
 
-#: modules/process/grain_edge.c:245
+#: modules/process/grain_edge.c:244
 msgid "Threshold"
 msgstr "Práh"
 
-#: modules/process/grain_edge.c:249
+#: modules/process/grain_edge.c:248
 msgid "_Laplacian:"
 msgstr "_Laplacián:"
 
-#: modules/process/grain_filter.c:195
+#: modules/process/grain_filter.c:194
 msgid ""
 "Filters grains by their properties, using logical expressions and thresholds."
 msgstr ""
 "Filtruje zrna na základě jejich vlastnosti s využitím prahů a logických "
 "výrazů."
 
-#: modules/process/grain_filter.c:210
+#: modules/process/grain_filter.c:209
 msgid "/_Grains/_Filter..."
 msgstr "/_Zrna/_Filtr..."
 
-#: modules/process/grain_filter.c:214
+#: modules/process/grain_filter.c:213
 msgid "Filter grains by their properties"
 msgstr "Filtrovat zrna na základě jejich vlastností"
 
-#: modules/process/grain_filter.c:254
+#: modules/process/grain_filter.c:253
 msgid "There are no grains to filter."
 msgstr "Kanál neobsahuje žádná zrna, která by šlo filtrovat."
 
-#: modules/process/grain_filter.c:310
+#: modules/process/grain_filter.c:309
 msgid "Filter Grains"
 msgstr "Filtrování zrn"
 
-#: modules/process/grain_filter.c:405
+#: modules/process/grain_filter.c:404
 msgid "Set selected as:"
 msgstr "Nastavit vybranou veličinu jako:"
 
-#: modules/process/grain_filter.c:420
+#: modules/process/grain_filter.c:419
 msgid "Keep grains satisfying:"
 msgstr "Ponechat zrna splňující:"
 
-#: modules/process/grain_filter.c:434 modules/process/lat_synth.c:733
+#: modules/process/grain_filter.c:440 modules/process/lat_synth.c:733
 msgid "Lower threshold:"
 msgstr "Spodní práh:"
 
-#: modules/process/grain_filter.c:469 modules/process/lat_synth.c:740
+#: modules/process/grain_filter.c:467 modules/process/lat_synth.c:740
 msgid "Upper threshold:"
 msgstr "Horní práh:"
 
 #. TRANSLATORS: %c is replaced with quantity label A, B or C.
-#: modules/process/grain_filter.c:645
+#: modules/process/grain_filter.c:628
 #, c-format
 msgid "Condition %c: %s"
 msgstr "Podmínka %c: %s"
 
-#: modules/process/grain_mark.c:139
+#: modules/process/grain_mark.c:137
 msgid "Marks grains by thresholding (height, slope, curvature)."
 msgstr "Označuje zrna podle prahu (výšky, sklonu, křivosti)."
 
-#: modules/process/grain_mark.c:153
+#: modules/process/grain_mark.c:151
 msgid "/_Grains/_Mark by Threshold..."
 msgstr "/_Zrna/_Označit zrna..."
 
-#: modules/process/grain_mark.c:157
+#: modules/process/grain_mark.c:155
 msgid "Mark grains by threshold"
 msgstr "Vyznačení zrn podle prahu"
 
-#: modules/process/grain_mark.c:241
+#: modules/process/grain_mark.c:240
 msgid "Mark Grains by Threshold"
 msgstr "Vyznačení zrn podle prahu"
 
-#: modules/process/grain_mark.c:281
+#: modules/process/grain_mark.c:280
 msgid "Threshold by"
 msgstr "Označit podle prahu:"
 
-#: modules/process/grain_mark.c:311
+#: modules/process/grain_mark.c:310
 msgid "_Slope:"
 msgstr "_Sklon:"
 
-#: modules/process/grain_mark.c:315
+#: modules/process/grain_mark.c:314
 msgid "_Curvature:"
 msgstr "_Křivost:"
 
-#: modules/process/grain_mark.c:324
-msgid "Criteria combination:"
-msgstr "Kombinace kritérií:"
-
-#: modules/process/grain_mark.c:328 modules/process/grain_wshed.c:256
+#: modules/process/grain_mark.c:319 modules/process/grain_wshed.c:260
 #: modules/process/wpour_mark.c:358
 msgid "_Invert height"
 msgstr "_Invertovat výšku"
 
+#: modules/process/grain_mark.c:328
+msgid "Criteria combination:"
+msgstr "Kombinace kritérií:"
+
 #: modules/process/grain_stat.c:54
 msgid "Displays overall grain statistics."
 msgstr "Zobrazuje celkové statistiky zrn"
@@ -10230,416 +10571,425 @@ msgstr "Celkový objem zrn (laplacián):"
 msgid "Total projected boundary length:"
 msgstr "Celková délka projektované hranice:"
 
-#: modules/process/grain_wshed.c:101
+#: modules/process/grain_wshed.c:102
 msgid "Marks grains by watershed algorithm."
 msgstr "Označuje zrna metodou stékání."
 
-#: modules/process/grain_wshed.c:115
+#: modules/process/grain_wshed.c:116
 msgid "/_Grains/Mark by _Watershed..."
 msgstr "/_Zrna/Označit metodou _stékání..."
 
-#: modules/process/grain_wshed.c:119
+#: modules/process/grain_wshed.c:120
 msgid "Mark grains by watershed"
 msgstr "Vyznačení zrn stékáním"
 
-#: modules/process/grain_wshed.c:161
+#: modules/process/grain_wshed.c:162
 msgid "Mark Grains by Watershed"
 msgstr "Vyznačení zrn stékáním"
 
-#: modules/process/grain_wshed.c:199
+#: modules/process/grain_wshed.c:200
 msgid "Grain Location"
 msgstr "Hledání pozic zrn"
 
-#: modules/process/grain_wshed.c:214
+#: modules/process/grain_wshed.c:216
 msgid "_Drop size:"
 msgstr "Velikost ka_pky:"
 
-#: modules/process/grain_wshed.c:230
+#: modules/process/grain_wshed.c:233
 msgid "Segmentation"
 msgstr "Segmentace"
 
-#: modules/process/grain_wshed.c:236
+#: modules/process/grain_wshed.c:239
 msgid "Num_ber of steps:"
 msgstr "Počet _kroků:"
 
-#: modules/process/grain_wshed.c:244
+#: modules/process/grain_wshed.c:248
 msgid "Dr_op size:"
 msgstr "Velikost k_apky:"
 
-#: modules/process/grain_wshed.c:435
+#: modules/process/grain_wshed.c:439
 msgid "Finding minima..."
 msgstr "Hledám minima..."
 
-#: modules/process/grain_wshed.c:437
+#: modules/process/grain_wshed.c:441
 msgid "Locating..."
 msgstr "Lokalizuji..."
 
-#: modules/process/grain_wshed.c:439
+#: modules/process/grain_wshed.c:443
 msgid "Simulating watershed..."
 msgstr "Simuluji stékání kapek..."
 
-#: modules/process/grain_wshed.c:441
+#: modules/process/grain_wshed.c:445
 msgid "Marking boundaries..."
 msgstr "Označuji hranice..."
 
-#: modules/process/hough.c:74
+#: modules/process/hough.c:76
 msgid "Hough transform."
 msgstr "Houghova transformace."
 
-#: modules/process/hough.c:88
+#: modules/process/hough.c:90
 msgid "/_Integral Transforms/_Hough..."
 msgstr "/_Integrální transformace/_Hough..."
 
-#: modules/process/hough.c:92
+#: modules/process/hough.c:94
 msgid "Compute Hough transform"
 msgstr "Vypočítat Houghovu transformaci"
 
-#: modules/process/hough.c:178
+#: modules/process/hough.c:137
+msgid "Hough line"
+msgstr "Houghova čára"
+
+#: modules/process/hough.c:141
+#, c-format
+msgid "Hough circle r=%d"
+msgstr "Houghova kružnice r=%d"
+
+#: modules/process/hough.c:173
 msgid "Hough Transform"
 msgstr "Houghova transformace"
 
-#: modules/process/hough.c:201
+#: modules/process/hough.c:195
 msgid "_Transform type:"
 msgstr "_Typ transformace:"
 
-#: modules/process/hough.c:212
+#: modules/process/hough.c:203
 msgid "_Circle size:"
 msgstr "Velikost _kružnice:"
 
-#: modules/process/immerse.c:162
+#: modules/process/immerse.c:163
 msgid "Immerse high resolution detail into overall image."
 msgstr "Zapustí detailní obrázek s vyšším rozlišením do hrubšího obrázku."
 
-#: modules/process/immerse.c:176
+#: modules/process/immerse.c:177
 msgid "/M_ultidata/_Immerse Detail..."
 msgstr "/M_ultidata/_Zapustit detail..."
 
-#: modules/process/immerse.c:180
+#: modules/process/immerse.c:181
 msgid "Immerse a detail into image"
 msgstr "Zapustit detail do obrázku"
 
-#: modules/process/immerse.c:222
+#: modules/process/immerse.c:223
 msgid "Immerse Detail"
 msgstr "Zapustit detail"
 
-#: modules/process/immerse.c:225
+#: modules/process/immerse.c:226
 msgid "_Locate"
 msgstr "Na_lézt"
 
-#: modules/process/immerse.c:227
+#: modules/process/immerse.c:228
 msgid "Locate detail by full image correlation search"
 msgstr "Nalézt detail korelačním prohledáním celého obrázku"
 
-#: modules/process/immerse.c:229
+#: modules/process/immerse.c:230
 msgid "_Improve"
 msgstr "Z_přesnit"
 
-#: modules/process/immerse.c:231
+#: modules/process/immerse.c:232
 msgid "Improve detail position by correlation search in neighborhood"
 msgstr "Zpřesnit polohu detailu korelačním prohledáním okolí"
 
-#: modules/process/immerse.c:290
+#: modules/process/immerse.c:291
 msgid "_Detail image:"
 msgstr "_Detailní obrázek:"
 
-#: modules/process/immerse.c:295
+#: modules/process/immerse.c:296
 msgid "Position:"
 msgstr "Poloha:"
 
-#: modules/process/immerse.c:308
+#: modules/process/immerse.c:314
 msgid "Result Sampling"
 msgstr "Škálování výsledku"
 
-#: modules/process/immerse.c:318
+#: modules/process/immerse.c:324
 msgid "_Upsample large image"
 msgstr "Z_většit velký obrázek"
 
-#: modules/process/immerse.c:320
+#: modules/process/immerse.c:326
 msgid "_Downsample detail"
 msgstr "Z_menšit detail"
 
-#: modules/process/immerse.c:329
+#: modules/process/immerse.c:335
 msgid "Detail Leveling"
 msgstr "Vyrovnání detailu"
 
-#: modules/process/immerse.c:339
+#: modules/process/immerse.c:345
 msgid "levelling|_None"
 msgstr "Žád_né"
 
-#: modules/process/immerse.c:341
+#: modules/process/immerse.c:347
 msgid "_Mean value"
 msgstr "_Střední hodnota"
 
-#: modules/process/immerse.c:349
+#: modules/process/immerse.c:355
 msgid "Show _frame"
 msgstr "_Ukázat rámeček"
 
-#: modules/process/immerse.c:787
+#: modules/process/immerse.c:793
 msgid "Immersed detail"
 msgstr "Zapuštěný detail"
 
-#: modules/process/indent_analyze.c:261
+#: modules/process/indent_analyze.c:246
 msgid "Do nothing"
 msgstr "Nedělat nic"
 
-#: modules/process/indent_analyze.c:262
+#: modules/process/indent_analyze.c:247
 msgid "Plane level"
 msgstr "Vyrovnání rovinou"
 
-#: modules/process/indent_analyze.c:263
+#: modules/process/indent_analyze.c:248
 msgid "Plane rotate"
 msgstr "Vyrovnání rotací"
 
-#: modules/process/indent_analyze.c:267
+#: modules/process/indent_analyze.c:252
 msgid "New"
 msgstr "Nový"
 
-#: modules/process/indent_analyze.c:268
+#: modules/process/indent_analyze.c:253
 msgid "AND"
 msgstr "AND"
 
-#: modules/process/indent_analyze.c:269
+#: modules/process/indent_analyze.c:254
 msgid "OR"
 msgstr "OR"
 
-#: modules/process/indent_analyze.c:270
+#: modules/process/indent_analyze.c:255
 msgid "NOT"
 msgstr "NOT"
 
-#: modules/process/indent_analyze.c:271
+#: modules/process/indent_analyze.c:256
 msgid "XOR"
 msgstr "XOR"
 
-#: modules/process/indent_analyze.c:275
+#: modules/process/indent_analyze.c:260
 msgid "Nothing"
 msgstr "Nic"
 
-#: modules/process/indent_analyze.c:276
+#: modules/process/indent_analyze.c:261
 msgid "Above"
 msgstr "Nad"
 
-#: modules/process/indent_analyze.c:277
+#: modules/process/indent_analyze.c:262
 msgid "Below"
 msgstr "Pod"
 
-#: modules/process/indent_analyze.c:278
+#: modules/process/indent_analyze.c:263
 msgid "Plane"
 msgstr "Rovinu"
 
-#: modules/process/indent_analyze.c:279
+#: modules/process/indent_analyze.c:264
 msgid "Impression"
 msgstr "Vtisk"
 
-#: modules/process/indent_analyze.c:280
+#: modules/process/indent_analyze.c:265
 msgid "Inner Pile-up"
 msgstr "Vnitřní pile-up"
 
-#: modules/process/indent_analyze.c:281
+#: modules/process/indent_analyze.c:266
 msgid "Outer Pile-up"
 msgstr "Vnější pile-up"
 
-#: modules/process/indent_analyze.c:282
+#: modules/process/indent_analyze.c:267
 msgid "Special points"
 msgstr "Význačné body"
 
-#: modules/process/indent_analyze.c:283
+#: modules/process/indent_analyze.c:268
 msgid "Faces border"
 msgstr "Okraje faset"
 
-#: modules/process/indent_analyze.c:287
+#: modules/process/indent_analyze.c:272
 msgid "Vickers"
 msgstr "Vickers"
 
-#: modules/process/indent_analyze.c:288
+#: modules/process/indent_analyze.c:273
 msgid "Berkovich"
 msgstr "Berkovich"
 
-#: modules/process/indent_analyze.c:289
+#: modules/process/indent_analyze.c:274
 msgid "Berkovich (modified)"
 msgstr "Berkovich (modifikovaný)"
 
-#: modules/process/indent_analyze.c:290
+#: modules/process/indent_analyze.c:275
 msgid "Knoop"
 msgstr "Knoop"
 
-#: modules/process/indent_analyze.c:291
+#: modules/process/indent_analyze.c:276
 msgid "Brinell"
 msgstr "Brinell"
 
-#: modules/process/indent_analyze.c:292
+#: modules/process/indent_analyze.c:277
 msgid "Cube corner"
 msgstr "Roh krychle"
 
-#: modules/process/indent_analyze.c:293
+#: modules/process/indent_analyze.c:278
 msgid "Rockwell"
 msgstr "Rockwell"
 
-#: modules/process/indent_analyze.c:303
+#: modules/process/indent_analyze.c:288
 msgid "Analyses nanoindentation structure (volumes, surfaces, ...)."
 msgstr "Analýza struktur vzniklých nanoindentací"
 
-#: modules/process/indent_analyze.c:320
+#: modules/process/indent_analyze.c:302
 msgid "/_Tip and Indentation/_Analyze Imprint..."
 msgstr "/_Hrot a indentace/_Analyzovat vtisk..."
 
-#: modules/process/indent_analyze.c:439
+#: modules/process/indent_analyze.c:410
 msgid "Marked _areas:"
 msgstr "Označené _oblasti:"
 
-#: modules/process/indent_analyze.c:445
+#: modules/process/indent_analyze.c:419
 msgid "_Indentor type:"
 msgstr "Typ _indentoru:"
 
-#: modules/process/indent_analyze.c:451
+#: modules/process/indent_analyze.c:428
 msgid "_Mask creation type:"
 msgstr "Způsob vytvoření masky:"
 
-#: modules/process/indent_analyze.c:456
+#: modules/process/indent_analyze.c:434
 msgid "Ref. plane _tolerance:"
 msgstr "_Tolerance ref. roviny:"
 
-#: modules/process/indent_analyze.c:460
+#: modules/process/indent_analyze.c:438
 msgid "Angle _1 tolerance:"
 msgstr "_Tolerance úhlu 1:"
 
-#: modules/process/indent_analyze.c:485
+#: modules/process/indent_analyze.c:456
 msgid "Indent center at"
 msgstr "Střed vtisku v"
 
-#: modules/process/indent_analyze.c:488
+#: modules/process/indent_analyze.c:460
 msgid "Maximum at"
 msgstr "Maximum v"
 
-#: modules/process/indent_analyze.c:491
+#: modules/process/indent_analyze.c:464
 msgid "Max-min difference"
 msgstr "Rozdíl max-min"
 
-#: modules/process/indent_analyze.c:497
+#: modules/process/indent_analyze.c:472
 msgid "Expected A<sub>d</sub>:"
 msgstr "Očekávané A<sub>d</sub>:"
 
-#: modules/process/indent_analyze.c:505
+#: modules/process/indent_analyze.c:479
 msgid "Expected A<sub>p</sub>:"
 msgstr "Očekávané A<sub>p</sub>:"
 
-#: modules/process/indent_analyze.c:549
+#: modules/process/indent_analyze.c:489
 msgid "Volume above-below"
 msgstr "Rozdíl objemů nad-pod"
 
-#: modules/process/indent_analyze.c:558
+#: modules/process/indent_analyze.c:494
 msgid "Indent. volume"
 msgstr "Objem vtisku"
 
-#: modules/process/indent_analyze.c:564
+#: modules/process/indent_analyze.c:502
 msgid "Indent. A<sub>d</sub>"
 msgstr "Indent. A<sub>d</sub>"
 
-#: modules/process/indent_analyze.c:573
+#: modules/process/indent_analyze.c:509
 msgid "Indent. A<sub>p</sub>"
 msgstr "Indent. A<sub>p</sub>"
 
-#: modules/process/indent_analyze.c:587
+#: modules/process/indent_analyze.c:517
 msgid "Inner Pile-Up A<sub>d</sub>"
 msgstr "Vnitřní pile-up A<sub>d</sub>"
 
-#: modules/process/indent_analyze.c:596
+#: modules/process/indent_analyze.c:525
 msgid "Inner Pile-Up A<sub>p</sub>"
 msgstr "Vnitřní pile-up A<sub>p</sub>"
 
-#: modules/process/indent_analyze.c:605
+#: modules/process/indent_analyze.c:533
 msgid "Outer Pile-Up A<sub>d</sub>"
 msgstr "Vnější pile-up A<sub>d</sub>"
 
-#: modules/process/indent_analyze.c:614
+#: modules/process/indent_analyze.c:541
 msgid "Outer Pile-Up A<sub>p</sub>"
 msgstr "Vnější pile-up A<sub>p</sub>"
 
-#: modules/process/indent_analyze.c:644
+#: modules/process/indent_analyze.c:569
 msgid "Indentation statistics"
 msgstr "Statistika indentace"
 
-#: modules/process/indent_analyze.c:645
+#: modules/process/indent_analyze.c:570
 msgid "_Compute & mark"
 msgstr "_Označit a spočítat"
 
-#: modules/process/indent_analyze.c:646
+#: modules/process/indent_analyze.c:571
 msgid "_Save statistics"
 msgstr "/_Uložit statistiky"
 
-#: modules/process/indent_analyze.c:1569
+#: modules/process/indent_analyze.c:1392
 msgid "No statistics has been computed yet."
 msgstr "Dosud nebylo provedeno vyhodnocení."
 
-#: modules/process/indent_analyze.c:1577
+#: modules/process/indent_analyze.c:1400
 msgid "Save Indentation Statistics"
 msgstr "Uložit statistiku indentace"
 
-#: modules/process/indent_analyze.c:1615
+#: modules/process/indent_analyze.c:1438
 #, c-format
 msgid "Indentor:  %s\n"
 msgstr "Indentor:  %s\n"
 
-#: modules/process/indent_analyze.c:1619
+#: modules/process/indent_analyze.c:1442
 #, c-format
 msgid "Length units: %s\n"
 msgstr "Jednotky délky: %s\n"
 
-#: modules/process/indent_analyze.c:1621
+#: modules/process/indent_analyze.c:1444
 #, c-format
 msgid "Indentation center at [%d, %d] px:      %lf\n"
 msgstr "Střed indentace na [%d, %d] px:         %lf\n"
 
-#: modules/process/indent_analyze.c:1623
+#: modules/process/indent_analyze.c:1446
 #, c-format
 msgid "Maximum at [%d, %d] is:                 %lf\n"
 msgstr "Maximum na [%d, %d] je:                 %lf\n"
 
-#: modules/process/indent_analyze.c:1625
+#: modules/process/indent_analyze.c:1448
 #, c-format
 msgid "Difference max-min:                     %lf\n"
 msgstr "Rozdíl maximum-minimum:                 %lf\n"
 
-#: modules/process/indent_analyze.c:1630
+#: modules/process/indent_analyze.c:1453
 #, c-format
 msgid "Area (projected) above plane:             %g (%.1lf %%)\n"
 msgstr "Plocha nad rovinou (projektovaná)         %g (%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1634
+#: modules/process/indent_analyze.c:1457
 #, c-format
 msgid "Area (projected) below plane:             %g (%.1lf %%)\n"
 msgstr "Plocha pod rovinou (projektovaná)         %g (%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1638
+#: modules/process/indent_analyze.c:1461
 #, c-format
 msgid "Area (projected) of    plane:             %g (%.1lf %%)\n"
 msgstr "Plocha roviny (projektovaná)              %g (%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1643
+#: modules/process/indent_analyze.c:1466
 #, c-format
 msgid "Area (developed) above %g (+%.1f %%)\n"
 msgstr "Plocha nad (rozvinutá) %g (+%.1f %%)\n"
 
-#: modules/process/indent_analyze.c:1646
+#: modules/process/indent_analyze.c:1469
 #, c-format
 msgid "Area (developed) below %g (+%.1lf %%)\n"
 msgstr "Plocha pod (rozvinutá) %g (+%.1f %%)\n"
 
-#: modules/process/indent_analyze.c:1650
+#: modules/process/indent_analyze.c:1473
 #, c-format
 msgid "Volume above:     %g\n"
 msgstr "Objem nad:        %g\n"
 
-#: modules/process/indent_analyze.c:1652
+#: modules/process/indent_analyze.c:1475
 #, c-format
 msgid "Volume below:     %g\n"
 msgstr "Objem pod:        %g\n"
 
-#: modules/process/indent_analyze.c:1654
+#: modules/process/indent_analyze.c:1477
 #, c-format
 msgid "Volume difference %g\n"
 msgstr "Rozdíl objemů:    %g\n"
 
-#: modules/process/indent_analyze.c:1658
+#: modules/process/indent_analyze.c:1481
 msgid ""
 "\n"
 "Indentation\n"
@@ -10647,12 +10997,12 @@ msgstr ""
 "\n"
 "Indentace\n"
 
-#: modules/process/indent_analyze.c:1659
+#: modules/process/indent_analyze.c:1482
 #, c-format
 msgid "Volume      %g\n"
 msgstr "Objem       %g\n"
 
-#: modules/process/indent_analyze.c:1664
+#: modules/process/indent_analyze.c:1487
 msgid ""
 "\n"
 "Indentation - Inner Pile-Up\n"
@@ -10660,7 +11010,7 @@ msgstr ""
 "\n"
 "Indentace - vnitřní pile-up\n"
 
-#: modules/process/indent_analyze.c:1670
+#: modules/process/indent_analyze.c:1493
 msgid "Indentation - Outer Pile-Up\n"
 msgstr "Indentace - vnější pile-up\n"
 
@@ -10769,11 +11119,6 @@ msgstr "Penrosova (středy)"
 msgid "_Lattice:"
 msgstr "_Mřížka:"
 
-#: modules/process/lat_synth.c:651 modules/process/obj_synth.c:544
-#: modules/process/pat_synth.c:1457
-msgid "_Size:"
-msgstr "_Velikost:"
-
 #: modules/process/lat_synth.c:662
 msgid "Lattice rela_xation:"
 msgstr "Rela_xace mřížky:"
@@ -10909,7 +11254,7 @@ msgstr "Vyrovnat jednotlivá zrna s laplaceovskou interpolací mezi nimi"
 
 #: modules/process/level_grains.c:187 modules/process/median-bg.c:167
 #: modules/process/polylevel.c:293 modules/process/polylevel.c:417
-#: modules/process/sphere-revolve.c:200
+#: modules/process/sphere-revolve.c:221 modules/process/sphere-revolve.c:295
 msgid "Background"
 msgstr "Pozadí"
 
@@ -10921,150 +11266,150 @@ msgstr "Vyrovnat zrna"
 msgid "Quantity to level:"
 msgstr "Vyrovnat podle:"
 
-#: modules/process/level_grains.c:231 modules/process/linematch.c:866
-#: modules/process/median-bg.c:217 modules/process/polylevel.c:482
-#: modules/process/sphere-revolve.c:263
+#: modules/process/level_grains.c:231 modules/process/linematch.c:834
+#: modules/process/median-bg.c:217 modules/process/polylevel.c:485
+#: modules/process/sphere-revolve.c:371
 msgid "E_xtract background"
 msgstr "_Extrahovat pozadí"
 
-#: modules/process/linecorrect.c:54
+#: modules/process/linecorrect.c:52
 msgid "Corrects line defects (mostly experimental algorithms)."
 msgstr "Opravuje řádkové defekty (převážně experimentální algoritmy)."
 
-#: modules/process/linecorrect.c:68
+#: modules/process/linecorrect.c:66
 msgid "/_Correct Data/Ste_p Line Correction"
 msgstr "/_Korekce dat/Srovnání s_chodů v řádcích"
 
-#: modules/process/linecorrect.c:72
+#: modules/process/linecorrect.c:70
 msgid "Correct steps in lines"
 msgstr "Opravuje schody v řádcích"
 
-#: modules/process/linematch.c:158 modules/tools/linestats.c:166
+#: modules/process/linematch.c:155 modules/tools/linestats.c:166
 #: modules/volume/volume_linestat.c:143
 msgid "Median"
 msgstr "Medián"
 
-#: modules/process/linematch.c:159
+#: modules/process/linematch.c:156
 msgid "Median of differences"
 msgstr "Medián rozdílů"
 
-#: modules/process/linematch.c:160
+#: modules/process/linematch.c:157
 msgid "Modus"
 msgstr "Modus"
 
-#: modules/process/linematch.c:161
+#: modules/process/linematch.c:158
 msgid "linematch|Matching"
 msgstr "Lícování"
 
-#: modules/process/linematch.c:162
+#: modules/process/linematch.c:159
 msgid "linematch|Polynomial"
 msgstr "Polynom"
 
-#: modules/process/linematch.c:168
+#: modules/process/linematch.c:165
 msgid "Aligns rows by various methods."
 msgstr "Vyrovnává řádky pomocí různých metod."
 
-#: modules/process/linematch.c:182
+#: modules/process/linematch.c:179
 msgid "/_Correct Data/_Align rows..."
 msgstr "/_Korekce dat/_Srovnat řádky..."
 
-#: modules/process/linematch.c:186
+#: modules/process/linematch.c:183
 msgid "Align rows using various methods"
 msgstr "Srovnat řádky pomocí různých metod"
 
-#: modules/process/linematch.c:237 modules/process/linematch.c:265
+#: modules/process/linematch.c:234 modules/process/linematch.c:262
 msgid "Row background"
 msgstr "Řádkové pozadí"
 
-#: modules/process/linematch.c:266
+#: modules/process/linematch.c:263
 msgid "Vertical position"
 msgstr "Svislá poloha"
 
-#: modules/process/linematch.c:267
+#: modules/process/linematch.c:264
 msgid "Corrected offset"
 msgstr "Opravený posun"
 
-#: modules/process/linematch.c:802
+#: modules/process/linematch.c:769
 msgid "Align Rows"
 msgstr "Srovnání řádků"
 
-#: modules/process/linematch.c:844
+#: modules/process/linematch.c:810
 msgid "_Polynomial degree:"
 msgstr "_Stupeň polynomu:"
 
-#: modules/process/linematch.c:876
+#: modules/process/linematch.c:844
 msgid "Plot background _graph"
 msgstr "Nakreslit _graf pozadí"
 
-#: modules/process/lno_synth.c:261 modules/process/noise_synth.c:188
+#: modules/process/lno_synth.c:259 modules/process/noise_synth.c:186
 msgid "distribution|Triangular"
 msgstr "Trojúhelníkové"
 
-#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:213
+#: modules/process/lno_synth.c:265 modules/process/pat_synth.c:213
 msgid "Steps"
 msgstr "Schody"
 
-#: modules/process/lno_synth.c:268
+#: modules/process/lno_synth.c:266
 msgid "Scars"
 msgstr "Šrámy"
 
-#: modules/process/lno_synth.c:269 modules/process/pat_synth.c:214
+#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:214
 msgid "Ridges"
 msgstr "Hřebeny"
 
-#: modules/process/lno_synth.c:275
+#: modules/process/lno_synth.c:273
 msgid "Generates various kinds of line noise."
 msgstr "Generuje různé druhy řádkového šumu"
 
-#: modules/process/lno_synth.c:289
+#: modules/process/lno_synth.c:287
 msgid "/S_ynthetic/_Line Noise..."
 msgstr "/S_yntetická/Řád_kový šum..."
 
-#: modules/process/lno_synth.c:293
+#: modules/process/lno_synth.c:291
 msgid "Generate line noise"
 msgstr "Generovat řádkový šum"
 
-#: modules/process/lno_synth.c:431
+#: modules/process/lno_synth.c:429
 msgid "Line Noise"
 msgstr "Řádkový šum"
 
-#: modules/process/lno_synth.c:504
+#: modules/process/lno_synth.c:502
 msgid "Distribution"
 msgstr "Rozdělení"
 
-#: modules/process/lno_synth.c:514 modules/process/noise_synth.c:414
-msgid "Direction:"
-msgstr "Symetrie:"
+#: modules/process/lno_synth.c:512 modules/process/mask_noisify.c:158
+#: modules/process/noise_synth.c:412
+msgid "Noise type:"
+msgstr "Druh šumu:"
 
-#: modules/process/lno_synth.c:523 modules/process/noise_synth.c:423
+#: modules/process/lno_synth.c:521 modules/process/mask_noisify.c:167
+#: modules/process/noise_synth.c:421
 msgid "S_ymmetrical"
-msgstr "S_ymetrické"
+msgstr "S_ymetrický"
 
-#: modules/process/lno_synth.c:524 modules/process/noise_synth.c:424
+#: modules/process/lno_synth.c:522 modules/process/mask_noisify.c:168
+#: modules/process/noise_synth.c:422
 msgid "One-sided _positive"
-msgstr "Jednostranné _kladné"
+msgstr "Jednostranný _kladný"
 
-#: modules/process/lno_synth.c:525 modules/process/noise_synth.c:425
+#: modules/process/lno_synth.c:523 modules/process/mask_noisify.c:169
+#: modules/process/noise_synth.c:423
 msgid "One-sided _negative"
-msgstr "Jednostranné _záporné"
+msgstr "Jednostranný _záporný"
 
-#: modules/process/lno_synth.c:546
+#: modules/process/lno_synth.c:544
 msgid "Noise Type"
 msgstr "Druh šumu"
 
-#: modules/process/lno_synth.c:551
+#: modules/process/lno_synth.c:549
 msgid "_Noise type:"
 msgstr "_Druh šumu:"
 
-#: modules/process/lno_synth.c:853 modules/process/lno_synth.c:1222
-msgid "Densi_ty:"
-msgstr "_Hustota:"
-
-#: modules/process/lno_synth.c:864 modules/process/lno_synth.c:1233
+#: modules/process/lno_synth.c:863 modules/process/lno_synth.c:1233
 msgid "_Within line:"
 msgstr "_Uvnitř řádku:"
 
-#: modules/process/lno_synth.c:871
+#: modules/process/lno_synth.c:870
 msgid "C_umulative"
 msgstr "Ku_mulativní"
 
@@ -11120,31 +11465,31 @@ msgstr "_Použít natrénovanou regresi"
 msgid "_Train logistic regression"
 msgstr "_Trénovat logistickou regresi"
 
-#: modules/process/logistic.c:275
+#: modules/process/logistic.c:274
 msgid "_Gaussian blur"
 msgstr "_Gaussovské rozmazání"
 
-#: modules/process/logistic.c:288
+#: modules/process/logistic.c:285
 msgid "_Number of Gaussians:"
 msgstr "_Počet gaussiánů:"
 
-#: modules/process/logistic.c:296
+#: modules/process/logistic.c:293
 msgid "_Sobel derivatives"
 msgstr "_Sobelova derivace"
 
-#: modules/process/logistic.c:307
+#: modules/process/logistic.c:303
 msgid "_Laplacian"
 msgstr "_Laplacián"
 
-#: modules/process/logistic.c:318
+#: modules/process/logistic.c:313
 msgid "_Hessian"
 msgstr "Hessián"
 
-#: modules/process/logistic.c:331
+#: modules/process/logistic.c:325
 msgid "_Regularization parameter:"
 msgstr "_Regularizační parametr:"
 
-#: modules/process/logistic.c:623 modules/process/neural.c:1101
+#: modules/process/logistic.c:616 modules/process/neural.c:1108
 msgid "Training..."
 msgstr "Trénování..."
 
@@ -11160,13 +11505,13 @@ msgstr "/_Korekce dat/Maska oddělených hodnot..."
 msgid "Mark data disconnected from other values"
 msgstr "Označit data oddělená od ostatních hodnot"
 
-#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:422
-#: modules/process/scars.c:279
+#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:419
+#: modules/process/scars.c:297
 msgid "Positive"
 msgstr "Positivní"
 
-#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:423
-#: modules/process/scars.c:280
+#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:420
+#: modules/process/scars.c:298
 msgid "Negative"
 msgstr "Negativní"
 
@@ -11182,11 +11527,11 @@ msgstr "Typ defektu:"
 msgid "Defect _radius:"
 msgstr "_Poloměr defektu:"
 
-#: modules/process/mark_disconn.c:563
+#: modules/process/mark_disconn.c:552
 msgid "Filtering..."
 msgstr "Filtruji..."
 
-#: modules/process/mark_disconn.c:590
+#: modules/process/mark_disconn.c:579
 msgid "Marking outliers..."
 msgstr "Označuji vybočující..."
 
@@ -11202,55 +11547,59 @@ msgstr "/_Zrna/Označit _pomocí..."
 msgid "Mask combining and modification"
 msgstr "Kombinování a modifikace masek"
 
-#: modules/process/mark_with.c:192
+#: modules/process/mark_with.c:193
 msgid "Mark With"
 msgstr "Označit Pomocí"
 
-#: modules/process/mark_with.c:238
+#: modules/process/mark_with.c:231 modules/process/mask_morph.c:209
+msgid "Operation:"
+msgstr "Operace:"
+
+#: modules/process/mark_with.c:239
 msgid "Se_t mask"
 msgstr "Nas_tavit masku"
 
-#: modules/process/mark_with.c:239
+#: modules/process/mark_with.c:240
 msgid "_Add mask"
 msgstr "Přid_at masku"
 
-#: modules/process/mark_with.c:240
+#: modules/process/mark_with.c:241
 msgid "_Subtract mask"
 msgstr "Odečí_st masku"
 
-#: modules/process/mark_with.c:241
+#: modules/process/mark_with.c:242
 msgid "_Intersect masks"
 msgstr "Průn_ik masek"
 
-#: modules/process/mark_with.c:247
+#: modules/process/mark_with.c:248
 msgid "Mark with:"
 msgstr "Označit pomocí:"
 
-#: modules/process/mark_with.c:255
+#: modules/process/mark_with.c:256
 msgid "with|_Mask"
 msgstr "_Masky"
 
-#: modules/process/mark_with.c:257
+#: modules/process/mark_with.c:258
 msgid "with|_Data"
 msgstr "_Dat"
 
-#: modules/process/mark_with.c:259
+#: modules/process/mark_with.c:260
 msgid "with|_Presentation"
 msgstr "_Presentace"
 
-#: modules/process/mark_with.c:293
+#: modules/process/mark_with.c:297
 msgid "Marked data range:"
 msgstr "Rozsah označených dat:"
 
-#: modules/process/mark_with.c:301
+#: modules/process/mark_with.c:305
 msgid "_Minimum:"
 msgstr "_Minimum:"
 
-#: modules/process/mark_with.c:310
+#: modules/process/mark_with.c:314
 msgid "M_aximum:"
 msgstr "M_aximum:"
 
-#: modules/process/mark_with.c:378
+#: modules/process/mark_with.c:382
 msgid "Operand"
 msgstr "Operand"
 
@@ -11286,109 +11635,109 @@ msgstr "Rozkopírovat do:"
 msgid "Preserve existing masks"
 msgstr "Zachovat existující masky"
 
-#: modules/process/mask_edt.c:95
+#: modules/process/mask_edt.c:89
 msgid "Performs simple and true Euclidean distance transforms of masks."
 msgstr ""
 "Provádí transformaci masky na jednoduché vzdálenosti a pravou euklidovskou "
 "vzdálenost."
 
-#: modules/process/mask_edt.c:109
+#: modules/process/mask_edt.c:103
 msgid "/_Mask/Distanc_e Transform..."
 msgstr "/_Maska/Transformace na _vzdálenost..."
 
-#: modules/process/mask_edt.c:113
+#: modules/process/mask_edt.c:107
 msgid "Distance transform of mask"
 msgstr "Transformace masky na vzdálenost"
 
-#: modules/process/mask_edt.c:116
+#: modules/process/mask_edt.c:110
 msgid "/_Mask/Thi_n"
 msgstr "/_Maska/Z_tenčit"
 
-#: modules/process/mask_edt.c:120
+#: modules/process/mask_edt.c:114
 msgid "Thin mask"
 msgstr "Ztenčit masku"
 
-#: modules/process/mask_edt.c:330 modules/process/mask_edt.c:352
+#: modules/process/mask_edt.c:164 modules/process/mask_edt.c:186
 msgid "Distance Transform"
 msgstr "Transformace na vzdálenost"
 
-#: modules/process/mask_edt.c:340
+#: modules/process/mask_edt.c:174
 msgid "Interior"
 msgstr "Vnitřek"
 
-#: modules/process/mask_edt.c:341
+#: modules/process/mask_edt.c:175
 msgid "Exterior"
 msgstr "Vnějšek"
 
-#: modules/process/mask_edt.c:342
+#: modules/process/mask_edt.c:176
 msgid "Two-sided"
 msgstr "Oboustranná"
 
-#: modules/process/mask_edt.c:373 modules/tools/maskedit.c:634
+#: modules/process/mask_edt.c:207 modules/tools/maskedit.c:640
 msgid "_Distance type:"
 msgstr "_Typ vzdálenosti:"
 
-#: modules/process/mask_edt.c:394 modules/tools/maskedit.c:640
+#: modules/process/mask_edt.c:228 modules/tools/maskedit.c:646
 msgid "Shrink from _border"
 msgstr "Zužovat i od _krajů"
 
-#: modules/process/mask_morph.c:117
+#: modules/process/mask_morph.c:116
 msgid "Performs basic morphological operations with masks."
 msgstr "Provádí základní morfologické operace s maskami."
 
-#: modules/process/mask_morph.c:131
-msgid "/_Mask/Morphological Operation..."
+#: modules/process/mask_morph.c:130
+msgid "/_Mask/Morpho_logical Operation..."
 msgstr "/_Maska/_Morfologická operace..."
 
-#: modules/process/mask_morph.c:135
+#: modules/process/mask_morph.c:134
 msgid "Morphological operation with mask"
 msgstr "Morfologická operace s maskou"
 
-#: modules/process/mask_morph.c:169
+#: modules/process/mask_morph.c:168
 msgid "Erosion"
 msgstr "Eroze"
 
-#: modules/process/mask_morph.c:170
+#: modules/process/mask_morph.c:169
 msgid "Dilation"
 msgstr "Dilatace"
 
-#: modules/process/mask_morph.c:171 modules/tools/filter.c:242
+#: modules/process/mask_morph.c:170 modules/tools/filter.c:243
 msgid "filter|Opening"
 msgstr "Otevření"
 
-#: modules/process/mask_morph.c:172 modules/tools/filter.c:243
+#: modules/process/mask_morph.c:171 modules/tools/filter.c:244
 msgid "filter|Closing"
 msgstr "Uzavření"
 
-#: modules/process/mask_morph.c:173 modules/tools/filter.c:244
+#: modules/process/mask_morph.c:172 modules/tools/filter.c:245
 msgid "ASF Opening"
 msgstr "ASF otevření"
 
-#: modules/process/mask_morph.c:174 modules/tools/filter.c:245
+#: modules/process/mask_morph.c:173 modules/tools/filter.c:246
 msgid "ASF Closing"
 msgstr "ASF uzavření"
 
-#: modules/process/mask_morph.c:178
+#: modules/process/mask_morph.c:177
 msgid "Octagon"
 msgstr "Osmiúhelník"
 
-#: modules/process/mask_morph.c:181
+#: modules/process/mask_morph.c:180
 msgid "Another mask"
 msgstr "Jiná maska"
 
-#: modules/process/mask_morph.c:192
+#: modules/process/mask_morph.c:191
 msgid "Morphological Operation"
 msgstr "Morfologická operace"
 
-#: modules/process/mask_morph.c:224
+#: modules/process/mask_morph.c:223
 msgid "Structuring element:"
 msgstr "Strukturní element:"
 
-#: modules/process/mask_morph.c:238 modules/tools/maskedit.c:524
+#: modules/process/mask_morph.c:237 modules/tools/maskedit.c:528
 msgid "_Radius:"
 msgstr "_Poloměr:"
 
-#: modules/process/mask_morph.c:249
+#: modules/process/mask_morph.c:248
 msgid "_Mask:"
 msgstr "_Maska:"
 
@@ -11396,39 +11745,59 @@ msgstr "_Maska:"
 msgid "_Trim empty borders"
 msgstr "Oříznout prázdné o_kraje"
 
-#: modules/process/maskcor.c:86
+#: modules/process/mask_noisify.c:83
+msgid "Adds salt and/or pepper noise to mask."
+msgstr "Přidává náhodný šum do masky."
+
+#: modules/process/mask_noisify.c:97
+msgid "/_Mask/_Noisify..."
+msgstr "/_Maska/_Zašumět..."
+
+#: modules/process/mask_noisify.c:101
+msgid "Add noise to mask"
+msgstr "Přidat šum do masky"
+
+#: modules/process/mask_noisify.c:141
+msgid "Noisify Mask"
+msgstr "Zašumět masku"
+
+#: modules/process/mask_noisify.c:184
+msgid "_Alter only boundaries"
+msgstr "_Pozměnit pouze hranice"
+
+#: modules/process/maskcor.c:87
 msgid "Creates mask by correlation with another data."
 msgstr "Vytváří masku z korelace s jinými daty."
 
-#: modules/process/maskcor.c:100
+#: modules/process/maskcor.c:101
 msgid "/M_ultidata/_Mask by Correlation..."
 msgstr "/M_ultidata/_Maska pomocí korelace..."
 
-#: modules/process/maskcor.c:104
+#: modules/process/maskcor.c:105
 msgid "Create mask by correlation with another data"
 msgstr "Vytvořit masku korelací s jinými daty"
 
-#: modules/process/maskcor.c:141
+#: modules/process/maskcor.c:142
 msgid "Mask by Correlation"
 msgstr "Maska pomocí korelace"
 
-#: modules/process/maskcor.c:165
+#: modules/process/maskcor.c:166
 msgid "Correlation _kernel:"
 msgstr "Jádro _korelace:"
 
-#: modules/process/maskcor.c:172
+#: modules/process/maskcor.c:173
 msgid "Objects marked"
 msgstr "Vyznačené objekty"
 
-#: modules/process/maskcor.c:173
+#: modules/process/maskcor.c:174
 msgid "Correlation maxima"
 msgstr "Maxima korelace"
 
-#: modules/process/maskcor.c:174 modules/process/maskcor.c:356
+#: modules/process/maskcor.c:175 modules/process/maskcor.c:360
 msgid "Correlation score"
 msgstr "Výsledek korelace"
 
-#: modules/process/maskcor.c:183
+#: modules/process/maskcor.c:185
 msgid "Correlation _method:"
 msgstr "Korelační _metoda:"
 
@@ -11457,8 +11826,8 @@ msgid "/_Mask/_Extract Mask"
 msgstr "/_Maska/_Extrahovat masku"
 
 #: modules/process/maskops.c:78
-msgid "Extract mask to a new channel"
-msgstr "Extrahovat masku do nového kanálu"
+msgid "Extract mask to a new image"
+msgstr "Extrahovat masku do nového obrázku"
 
 #: modules/process/maskops.c:81
 msgid "/_Grains/_Remove Edge-Touching"
@@ -11484,35 +11853,31 @@ msgstr "Oříznout neprotínající se oblasti dvou obrázků."
 msgid "Mutual Crop"
 msgstr "Vzájemné oříznutí"
 
-#: modules/process/mcrop.c:174
+#: modules/process/mcrop.c:173
 msgid "_Select second argument:"
 msgstr "_Druhý argument:"
 
-#: modules/process/measure_lattice.c:174
+#: modules/process/measure_lattice.c:165
 msgid "Measures parameters of two-dimensional lattices."
 msgstr "Měří parametry dvourozměrných mřížek."
 
-#: modules/process/measure_lattice.c:188
+#: modules/process/measure_lattice.c:179
 msgid "/_Statistics/Measure _Lattice..."
 msgstr "/_Statistika/Analýza _mřížky..."
 
-#: modules/process/measure_lattice.c:192
+#: modules/process/measure_lattice.c:183
 msgid "Measure lattice"
 msgstr "Měření mřížky"
 
-#: modules/process/measure_lattice.c:253
+#: modules/process/measure_lattice.c:243
 msgid "Measure Lattice"
 msgstr "Měření mřížky"
 
-#: modules/process/measure_lattice.c:259
-msgid "_Refine"
-msgstr "_Zpřesnit"
-
-#: modules/process/measure_lattice.c:330
+#: modules/process/measure_lattice.c:320
 msgid "_ACF"
 msgstr "_ACF"
 
-#: modules/process/measure_lattice.c:331
+#: modules/process/measure_lattice.c:321
 msgid "_PSDF"
 msgstr "_PSDF"
 
@@ -11528,30 +11893,30 @@ msgstr "_Mřížka:"
 msgid "_Vectors"
 msgstr "_Vektory:"
 
-#: modules/process/measure_lattice.c:596
+#: modules/process/measure_lattice.c:589
 msgid "Save Lattice Parameters"
 msgstr "Uložit parametry mřížky"
 
-#: modules/process/measure_lattice.c:634
+#: modules/process/measure_lattice.c:627
 #, c-format
 msgid "Vector %d:"
 msgstr "Vektor %d:"
 
-#: modules/process/measure_lattice.c:643
+#: modules/process/measure_lattice.c:636
 #, c-format
 msgid "Length %d:"
 msgstr "Délka %d:"
 
-#: modules/process/measure_lattice.c:650
+#: modules/process/measure_lattice.c:643
 #, c-format
 msgid "Angle %d:"
 msgstr "Úhel %d:"
 
-#: modules/process/measure_lattice.c:665
+#: modules/process/measure_lattice.c:657
 msgid "Angle:"
 msgstr "Úhel:"
 
-#: modules/process/measure_lattice.c:681
+#: modules/process/measure_lattice.c:673
 msgid "Lattice Parameters"
 msgstr "Parametry mřížky"
 
@@ -11575,11 +11940,11 @@ msgstr "Mediánové vyrovnání..."
 msgid "Median Level"
 msgstr "Mediánové vyrovnání"
 
-#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:237
+#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:336
 msgid "Real _radius:"
 msgstr "_Skutečný poloměr:"
 
-#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:247
+#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:346
 msgid "_Pixel radius:"
 msgstr "Poloměr v _pixelech:"
 
@@ -11619,7 +11984,7 @@ msgstr "První operand"
 msgid "Second operand"
 msgstr "Druhý operand"
 
-#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:643
+#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:612
 msgid "Average"
 msgstr "Průměr"
 
@@ -11671,6 +12036,221 @@ msgstr "Přidat _masku pixelů mimo"
 msgid "Merged images"
 msgstr "Sloučené obrázky"
 
+#: modules/process/mfm_current.c:163
+msgid "Simulation of current line magnetic field"
+msgstr "Simulace magnetického pole planárního vodiče"
+
+#: modules/process/mfm_current.c:177
+msgid "/SPM M_odes/_MFM/_Current Line Field..."
+msgstr "/SPM mód_y/_MFM/Pole planárního _vodiče..."
+
+#: modules/process/mfm_current.c:181
+msgid "Simulate stray field above current line"
+msgstr "Simulace rozptylového pole nad planárním vodiče"
+
+#: modules/process/mfm_current.c:280 modules/process/mfm_parallel.c:282
+msgid "Simulated field"
+msgstr "Simulované pole"
+
+#: modules/process/mfm_current.c:322 modules/process/mfm_field.c:266
+#: modules/process/mfm_parallel.c:324
+msgid "Point charge"
+msgstr "Bodový náboj"
+
+#: modules/process/mfm_current.c:323 modules/process/mfm_field.c:267
+#: modules/process/mfm_parallel.c:325
+msgid "Bar"
+msgstr "Tyč"
+
+#: modules/process/mfm_current.c:330
+msgid "Current Line Stray Field"
+msgstr "Rozptylové pole planárního vodiče"
+
+#: modules/process/mfm_current.c:415
+msgid "Output"
+msgstr "Výstup"
+
+#: modules/process/mfm_current.c:420 modules/process/mfm_field.c:320
+#: modules/process/mfm_parallel.c:415
+msgid "_Output plane height:"
+msgstr "_Výška výstupní roviny:"
+
+#: modules/process/mfm_current.c:428
+msgid "_Stripe width:"
+msgstr "Šířka pru_hu:"
+
+#: modules/process/mfm_current.c:436
+msgid "Stripe _current:"
+msgstr "Pro_ud pruhem:"
+
+#: modules/process/mfm_current.c:444
+msgid "_Position:"
+msgstr "_Poloha:"
+
+#: modules/process/mfm_current.c:461
+msgid "Probe"
+msgstr "Sonda"
+
+#: modules/process/mfm_current.c:469
+msgid "P_robe type:"
+msgstr "_Druh sondy:"
+
+#: modules/process/mfm_current.c:475 modules/process/mfm_field.c:389
+#: modules/process/mfm_parallel.c:482
+msgid "Tip _magnetization:"
+msgstr "_Magnetizace hrotu:"
+
+#: modules/process/mfm_current.c:484 modules/process/mfm_field.c:397
+#: modules/process/mfm_parallel.c:491
+msgid "Bar width _x:"
+msgstr "Šířka tyče v _x:"
+
+#: modules/process/mfm_current.c:493 modules/process/mfm_field.c:405
+#: modules/process/mfm_parallel.c:500
+msgid "Bar width _y:"
+msgstr "Šířka tyče v _y:"
+
+#: modules/process/mfm_current.c:502 modules/process/mfm_field.c:413
+#: modules/process/mfm_parallel.c:509
+msgid "Bar length (_z):"
+msgstr "Délka tyče (_z):"
+
+#: modules/process/mfm_field.c:146
+msgid "Simulation of magnetic field above perpendicular media"
+msgstr "Simulace magnetického pole nad médiem s příčnou magnetizací"
+
+#: modules/process/mfm_field.c:160
+msgid "/SPM M_odes/_MFM/_Perpendicular Media Field..."
+msgstr "/SPM mód_y/_MFM/Pole média s _příčnou magnetizací..."
+
+#: modules/process/mfm_field.c:164
+msgid "Compute stray field above perpendicular magnetic medium"
+msgstr "Počítá rozptylové pole nad médiem s příčnou magnetizací"
+
+#: modules/process/mfm_field.c:276
+msgid "Perpendicular Media Stray Field"
+msgstr "Rozptylové pole média s příčnou magnetizací"
+
+#: modules/process/mfm_field.c:328 modules/process/mfm_parallel.c:423
+msgid "_Film thickness:"
+msgstr "Tloušťka _vrstvy:"
+
+#: modules/process/mfm_field.c:336
+msgid "_Magnetic charge:"
+msgstr "_Magnetický náboj:"
+
+#: modules/process/mfm_field.c:344
+msgid "Include domain _walls"
+msgstr "_Zahrnout stěny domén"
+
+#: modules/process/mfm_field.c:354
+msgid "_Exchange constant:"
+msgstr "_Výměnná konstanta:"
+
+#: modules/process/mfm_field.c:362
+msgid "_Uniaxial anisotropy:"
+msgstr "_Jednoosá anizotropie:"
+
+#: modules/process/mfm_field.c:383 modules/process/mfm_parallel.c:476
+msgid "_Probe type:"
+msgstr "_Druh sondy:"
+
+#: modules/process/mfm_findshift.c:88
+msgid "Lift height difference estimation from data blur"
+msgstr "Odhad rozdílu výšek z rozmazání dat"
+
+#: modules/process/mfm_findshift.c:102
+msgid "/SPM M_odes/_MFM/_Estimate Shift in Z..."
+msgstr "/SPM mód_y/_MFM/_Odhad posunu v z..."
+
+#: modules/process/mfm_findshift.c:106
+msgid "Estimate lift height difference in MFM data"
+msgstr "Odhad rozdílu výšek nad povrchem z MFM dat"
+
+#: modules/process/mfm_findshift.c:166 modules/process/psf.c:340
+msgid "Searching..."
+msgstr "Hledám..."
+
+#: modules/process/mfm_findshift.c:196
+msgid "Estimated shift:"
+msgstr "Odhadnutý posun:"
+
+#: modules/process/mfm_findshift.c:211
+msgid "Shifted field difference"
+msgstr "Rozdíl posunutých polí"
+
+#: modules/process/mfm_findshift.c:228
+msgid "Estimate Lift Height Shift"
+msgstr "Odhad rozdílu výšek na povrchem"
+
+#: modules/process/mfm_findshift.c:255
+msgid "Data to compare:"
+msgstr "Porovnat s daty:"
+
+#: modules/process/mfm_findshift.c:261
+msgid "Search _from:"
+msgstr "Hledat o_d:"
+
+#: modules/process/mfm_findshift.c:269
+msgid "Search _to:"
+msgstr "Hledat _po:"
+
+#: modules/process/mfm_parallel.c:165
+msgid "Simulation of parallel magnetic media"
+msgstr "Simulace pole nad médiem s podélnou magnetizací"
+
+#: modules/process/mfm_parallel.c:179
+msgid "/SPM M_odes/_MFM/Para_llel Media Field..."
+msgstr "/SPM mód_y/_MFM/Pole média s po_délnou magnetizací..."
+
+#: modules/process/mfm_parallel.c:183
+msgid "Simulate stray field above parallel magnetic medium"
+msgstr "Simulace rozptylového pole nad médiem s podélnou magnetizací"
+
+#: modules/process/mfm_parallel.c:331
+msgid "Parallel Media Stray Field"
+msgstr "Rozptylové pole média s podélnou magnetizací"
+
+#: modules/process/mfm_parallel.c:431
+msgid "_Remanent magnetization:"
+msgstr "_Zbytková magnetizace:"
+
+#: modules/process/mfm_parallel.c:439
+msgid "Size _A (dir. left):"
+msgstr "Rozměr _A (vlevo):"
+
+#: modules/process/mfm_parallel.c:447
+msgid "Size _B (dir. right):"
+msgstr "Rozměr _B (vpravo):"
+
+#: modules/process/mfm_parallel.c:455
+msgid "_Gap size:"
+msgstr "_Velikost mezery:"
+
+#: modules/process/mfm_shift.c:87
+msgid "Simulation of magnetic field z component change for another level"
+msgstr "Simulace změny Z komponenty magnetického pole pro jinou výšku"
+
+#: modules/process/mfm_shift.c:101
+msgid "/SPM M_odes/_MFM/_Field Shift in Z..."
+msgstr "/SPM mód_y/_MFM/Posun pole v _z..."
+
+#: modules/process/mfm_shift.c:105
+msgid "Compute stray field shift for another z level"
+msgstr "Vypočítat rozptylové pole v jiné úrovni Z"
+
+#: modules/process/mfm_shift.c:146
+msgid "Shifted field"
+msgstr "Posunuté pole"
+
+#: modules/process/mfm_shift.c:164
+msgid "Stray Field Plane Shift"
+msgstr "Posun rozptylového pole v Z"
+
+#: modules/process/mfm_shift.c:209
+msgid "_Z shift by:"
+msgstr "Posun v _Z:"
+
 #: modules/process/nanoindent_adjust.c:89
 msgid "Adjust images of two indentor prints."
 msgstr "Srovnat dva obrázky vtisků indentoru"
@@ -11707,12 +12287,12 @@ msgstr "_Otočit data"
 msgid "E_xtrapolate result data out of measured range"
 msgstr "E_xtrapolovat chybějící data na okrajích"
 
-#: modules/process/nanoindent_adjust.c:295
+#: modules/process/nanoindent_adjust.c:296
 msgid ""
 "Tip has different range/resolution ratio than image. Tip will be resampled."
 msgstr "Hrot má jiný poměr rozlišení ku reálné velikosti. Bude převzorkován."
 
-#: modules/process/nanoindent_adjust.c:334
+#: modules/process/nanoindent_adjust.c:335
 msgid "Immersed detail data"
 msgstr "Zapuštěný detail"
 
@@ -11753,244 +12333,232 @@ msgstr "Chyba při tréninku"
 msgid "error"
 msgstr "Chyba"
 
-#: modules/process/neural.c:503
+#: modules/process/neural.c:504
 msgid "NN training error"
 msgstr "Chyba při tréninku NN"
 
-#: modules/process/neural.c:516
+#: modules/process/neural.c:517
 msgid "Training"
 msgstr "Trénování"
 
-#: modules/process/neural.c:520
+#: modules/process/neural.c:521
 msgid "_Model:"
 msgstr "_Model:"
 
-#: modules/process/neural.c:530
+#: modules/process/neural.c:532
 msgid "_Signal:"
 msgstr "_Signál:"
 
-#: modules/process/neural.c:541
+#: modules/process/neural.c:544
 msgid "Training ste_ps:"
 msgstr "_Kroků tréninku:"
 
-#: modules/process/neural.c:557
+#: modules/process/neural.c:561
 msgid "Model"
 msgstr "Model"
 
-#: modules/process/neural.c:558
+#: modules/process/neural.c:562
 msgid "Signal"
 msgstr "Signál"
 
-#: modules/process/neural.c:575
+#: modules/process/neural.c:579
 msgid "verb|_Train"
 msgstr "_Trénuj"
 
-#: modules/process/neural.c:580
+#: modules/process/neural.c:584
 msgid "Re_initialize"
 msgstr "Re_inicializuj"
 
-#: modules/process/neural.c:613
+#: modules/process/neural.c:617
 msgid "Network"
 msgstr "Síť"
 
-#: modules/process/neural.c:619
+#: modules/process/neural.c:623
 msgid "Window _width:"
 msgstr "Šířka ok_na:"
 
-#: modules/process/neural.c:627
+#: modules/process/neural.c:631
 msgid "Window h_eight:"
 msgstr "_Výška okna:"
 
-#: modules/process/neural.c:635
+#: modules/process/neural.c:639
 msgid "_Hidden nodes:"
 msgstr "Skryté _uzly:"
 
-#: modules/process/neural.c:643
+#: modules/process/neural.c:647
 msgid "Result Units"
 msgstr "Jednotky výsledku"
 
-#: modules/process/neural.c:650
+#: modules/process/neural.c:654
 msgid "Power of source _XY:"
 msgstr "Mocnina zdrojové _XY:"
 
-#: modules/process/neural.c:658
+#: modules/process/neural.c:663
 msgid "Power of source _Z:"
 msgstr "Mocnina zdrojové _Z:"
 
-#: modules/process/neural.c:666
+#: modules/process/neural.c:672
 msgid "_Fixed units:"
 msgstr "_Pevné jednotky:"
 
-#: modules/process/neural.c:676
+#: modules/process/neural.c:683
 msgid "Networks"
 msgstr "Sítě"
 
-#: modules/process/neural.c:723
+#: modules/process/neural.c:730
 msgid "Network _name:"
 msgstr "_Jméno sítě:"
 
-#: modules/process/neural.c:775
+#: modules/process/neural.c:782
 msgid "Apply Neural Network"
 msgstr "Použít neuronovou síť"
 
-#: modules/process/neural.c:798
+#: modules/process/neural.c:805
 msgid "_Scale proportionally to input"
 msgstr "Škálovat _proporcionálně ke vstupu"
 
-#: modules/process/neural.c:929
+#: modules/process/neural.c:936
 msgid "Model and signal are not compatible."
 msgstr "Model a signál nejsou kompatibilní."
 
-#: modules/process/neural.c:937
+#: modules/process/neural.c:944
 msgid "A field dimension is too small for chosen window size."
 msgstr "Rozměr pole je příliš malý pro zvolenou velikost okna."
 
-#: modules/process/neural.c:1183 modules/process/neural.c:1349
+#: modules/process/neural.c:1190 modules/process/neural.c:1356
 msgid "Evaluating..."
 msgstr "Vyhodnocení..."
 
-#: modules/process/neural.c:1309
+#: modules/process/neural.c:1316
 msgid "Training was canceled."
 msgstr "_Signál pro trénink:"
 
-#: modules/process/neural.c:1319
+#: modules/process/neural.c:1326
 #, c-format
 msgid "Mean difference: %.*f %s"
 msgstr "Průměrný rozdíl: %.*f %s"
 
-#: modules/process/neural.c:1371
+#: modules/process/neural.c:1378
 msgid "Evaluated signal"
 msgstr "Vyhodnocený signál"
 
-#: modules/process/noise_synth.c:196
+#: modules/process/noise_synth.c:194
 msgid "Generates uncorrelated random noise."
 msgstr "Generuje nekorelovaný náhodný šum."
 
-#: modules/process/noise_synth.c:210
+#: modules/process/noise_synth.c:208
 msgid "/S_ynthetic/_Noise..."
 msgstr "/S_yntetická/Šu_m..."
 
-#: modules/process/noise_synth.c:214
+#: modules/process/noise_synth.c:212
 msgid "Generate surface of uncorrelated noise"
 msgstr "Vytvořit povrch z nekorelovaného šumu"
 
-#: modules/process/noise_synth.c:334
+#: modules/process/noise_synth.c:332
 msgid "Random Noise"
 msgstr "Náhodný šum"
 
-#: modules/process/obj_synth.c:274
+#: modules/process/obj_synth.c:270
 msgid "Spheres"
 msgstr "Sféry"
 
-#: modules/process/obj_synth.c:275
+#: modules/process/obj_synth.c:271
 msgid "Boxes"
 msgstr "Kvádry"
 
-#: modules/process/obj_synth.c:276
+#: modules/process/obj_synth.c:272
 msgid "Cones"
 msgstr "Kužely"
 
-#: modules/process/obj_synth.c:277
+#: modules/process/obj_synth.c:273
 msgid "Pyramids"
 msgstr "Pyramidy"
 
-#: modules/process/obj_synth.c:278
+#: modules/process/obj_synth.c:274
 msgid "Diamonds"
 msgstr "Diamanty"
 
-#: modules/process/obj_synth.c:279
+#: modules/process/obj_synth.c:275
 msgid "Tetrahedrons"
 msgstr "Čtyřstěny"
 
-#: modules/process/obj_synth.c:280
+#: modules/process/obj_synth.c:276
 msgid "Nuggets"
 msgstr "Valouny"
 
-#: modules/process/obj_synth.c:281
+#: modules/process/obj_synth.c:277
 msgid "Thatches"
 msgstr "Došky"
 
-#: modules/process/obj_synth.c:282
+#: modules/process/obj_synth.c:278
 msgid "Tents"
 msgstr "Stany"
 
-#: modules/process/obj_synth.c:283
+#: modules/process/obj_synth.c:279
 msgid "Gaussians"
 msgstr "Gaussovky"
 
-#: modules/process/obj_synth.c:284
+#: modules/process/obj_synth.c:280
 msgid "Doughnuts"
 msgstr "Prstence"
 
-#: modules/process/obj_synth.c:285
+#: modules/process/obj_synth.c:281
 msgid "Parabolic bumps"
 msgstr "Parabolické hrboly"
 
-#: modules/process/obj_synth.c:291
+#: modules/process/obj_synth.c:287
 msgid "Generates randomly patterned surfaces by placing objects."
 msgstr "Vytváří náhodně vzorovaný povrch umísťováním objektů."
 
-#: modules/process/obj_synth.c:305
-msgid "/S_ynthetic/_Objects..."
-msgstr "/S_yntetická/_Objekty..."
+#: modules/process/obj_synth.c:301
+msgid "/S_ynthetic/_Deposition/_Objects..."
+msgstr "/S_yntetická/_Depozice/_Objekty..."
 
-#: modules/process/obj_synth.c:309
+#: modules/process/obj_synth.c:305
 msgid "Generate surface of randomly placed objects"
 msgstr "Vytvořit povrch z náhodně umístěných objektů"
 
-#: modules/process/obj_synth.c:424
+#: modules/process/obj_synth.c:421
 msgid "Both (random)"
 msgstr "Oba (náhodně)"
 
-#: modules/process/obj_synth.c:439
+#: modules/process/obj_synth.c:436
 msgid "Random Objects"
 msgstr "Náhodné objekty"
 
-#: modules/process/obj_synth.c:513
-msgid "_Shape:"
-msgstr "_Tvar:"
-
-#: modules/process/obj_synth.c:531
-msgid "obj."
-msgstr "obj."
-
-#: modules/process/obj_synth.c:551
+#: modules/process/obj_synth.c:549
 msgid "Aspect Ratio"
 msgstr "Poměr stran"
 
-#: modules/process/obj_synth.c:558
+#: modules/process/obj_synth.c:556
 msgid "_Aspect ratio:"
 msgstr "Poměr _stran:"
 
-#: modules/process/obj_synth.c:588
+#: modules/process/obj_synth.c:586
 msgid "Scales _with size"
 msgstr "Škálova_t s velikostí:"
 
-#: modules/process/obj_synth.c:612
+#: modules/process/obj_synth.c:611
 msgid "_Feature type:"
 msgstr "Typ tvaru:"
 
-#: modules/process/obj_synth.c:807
-msgid "_Truncate:"
-msgstr "_Uříznout:"
-
-#: modules/process/otsu_threshold.c:39 modules/process/otsu_threshold.c:59
+#: modules/process/otsu_threshold.c:40 modules/process/otsu_threshold.c:60
 msgid "Automated threshold using Otsu's method on heights."
 msgstr "Automatický práh pomocí Otsuovy metody pro výšky."
 
-#: modules/process/otsu_threshold.c:55
-msgid "/_Grains/_Mark by Otsu's..."
-msgstr "/_Zrna/Označit Otsuovou metodou..."
+#: modules/process/otsu_threshold.c:56
+msgid "/_Grains/_Mark by Otsu's"
+msgstr "/_Zrna/Označit _Otsuho metodou..."
 
-#: modules/process/outliers.c:40
+#: modules/process/outliers.c:41
 msgid "Creates mask of outliers."
 msgstr "Vytváří masku z vybočujících hodnot."
 
-#: modules/process/outliers.c:54
+#: modules/process/outliers.c:55
 msgid "/_Correct Data/Mask of _Outliers"
 msgstr "/_Korekce dat/Maska v_ybočujících hodnot"
 
-#: modules/process/outliers.c:58
+#: modules/process/outliers.c:59
 msgid "Mark data farther than 3σ from mean value"
 msgstr "Označení dat vzdálenějších než 3σ od střední hodnoty"
 
@@ -12014,80 +12582,100 @@ msgstr "Vzor"
 msgid "_Pattern:"
 msgstr "_Vzor:"
 
-#: modules/process/pat_synth.c:812
+#: modules/process/pat_synth.c:813
 msgid "Flat"
 msgstr "Plochá část"
 
-#: modules/process/pat_synth.c:820
+#: modules/process/pat_synth.c:821
 msgid "_Flat width:"
 msgstr "Šířka _ploché části:"
 
-#: modules/process/pat_synth.c:837 modules/process/pat_synth.c:1139
-#: modules/process/pat_synth.c:1474
+#: modules/process/pat_synth.c:838 modules/process/pat_synth.c:1140
+#: modules/process/pat_synth.c:1475
 msgid "_Slope width:"
 msgstr "Šířka ši_kmé části:"
 
-#: modules/process/pat_synth.c:1099
+#: modules/process/pat_synth.c:1100
 msgid "Top"
 msgstr "Vrchní"
 
-#: modules/process/pat_synth.c:1106
+#: modules/process/pat_synth.c:1107
 msgid "Flat _top width:"
 msgstr "Šířka _vrchní plochy:"
 
-#: modules/process/pat_synth.c:1114
+#: modules/process/pat_synth.c:1115
 msgid "Bottom"
 msgstr "Spodní"
 
-#: modules/process/pat_synth.c:1122
+#: modules/process/pat_synth.c:1123
 msgid "Flat _bottom width:"
 msgstr "Šířka s_podní plochy:"
 
-#: modules/process/pat_synth.c:1440
+#: modules/process/pat_synth.c:1441
 msgid "_Distance:"
 msgstr "_Vzdálenost:"
 
-#: modules/process/pid.c:96
+#: modules/process/phase_synth.c:136
+msgid "Generates phase-separated structures."
+msgstr "Generovat povrch s oddělenými fázemi."
+
+#: modules/process/phase_synth.c:150
+msgid "/S_ynthetic/P_hases..."
+msgstr "/S_yntetická/_Fáze..."
+
+#: modules/process/phase_synth.c:154
+msgid "Generate surface with separated phases"
+msgstr "Vytvořit povrch s oddělenými fázemi"
+
+#: modules/process/phase_synth.c:203
+msgid "Separated Phases"
+msgstr "Oddělené fáze"
+
+#: modules/process/phase_synth.c:287
+msgid "Size s_pread:"
+msgstr "_Rozptyl velikostí:"
+
+#: modules/process/pid.c:95
 msgid "A simple PID simulator"
 msgstr "Simulace PID smyčky"
 
-#: modules/process/pid.c:110
+#: modules/process/pid.c:109
 msgid "/_Tip and Indentation/_PID simulation..."
 msgstr "/_Hrot a indentace/Simulace _PID smyčky..."
 
-#: modules/process/pid.c:114
+#: modules/process/pid.c:113
 msgid "Simulate PID effects on measurement"
 msgstr "Simuluje vliv PID smyčky na měření"
 
-#: modules/process/pid.c:158
+#: modules/process/pid.c:157
 msgid "PID FW result"
 msgstr "Výsledek PID (FW)"
 
-#: modules/process/pid.c:167
+#: modules/process/pid.c:166
 msgid "PID FW max. force"
 msgstr "Max. síla PID (FW)"
 
-#: modules/process/pid.c:176
+#: modules/process/pid.c:175
 msgid "PID REV result"
 msgstr "Výsledek PID (REV)"
 
-#: modules/process/pid.c:185
+#: modules/process/pid.c:184
 msgid "PID REV max. force"
 msgstr "Max. síla ID (REV)"
 
-#: modules/process/pid.c:198
+#: modules/process/pid.c:196
 msgid "PID simulation"
 msgstr "Simulace PID smyčky"
 
-#: modules/process/pid.c:215
+#: modules/process/pid.c:214
 msgid "_Proportional:"
 msgstr "_proporcionální:"
 
-#: modules/process/pid.c:221
+#: modules/process/pid.c:220
 msgid "_Integral:"
 msgstr "_Integrální:"
 
-#: modules/process/pid.c:227
+#: modules/process/pid.c:226
 msgid "_Integration steps:"
 msgstr "Kroků _integrace:"
 
@@ -12095,15 +12683,15 @@ msgstr "Kroků _integrace:"
 msgid "_Derivative:"
 msgstr "_Derivační:"
 
-#: modules/process/pid.c:241
+#: modules/process/pid.c:240
 msgid "PID/scan speed _ratio:"
 msgstr "Pomě_r smyčka/rychlost:"
 
-#: modules/process/pid.c:253
+#: modules/process/pid.c:255
 msgid "Force strength:"
 msgstr "Síla:"
 
-#: modules/process/pid.c:259
+#: modules/process/pid.c:261
 msgid "Force setpoint:"
 msgstr "Pracovní bod síly:"
 
@@ -12111,7 +12699,7 @@ msgstr "Pracovní bod síly:"
 msgid "Scanning..."
 msgstr "Skenuji..."
 
-#: modules/process/pid.c:396
+#: modules/process/pid.c:401
 msgid "Computation diverged, try to change parameters"
 msgstr "Výpočet divergoval, zkus jiné parametry"
 
@@ -12131,23 +12719,23 @@ msgstr "Provede polynomiální deformaci ve vodorovné rovině"
 msgid "Distort by Polynomial"
 msgstr "Polynomiální deformace"
 
-#: modules/process/polydistort.c:282
+#: modules/process/polydistort.c:285
 msgid "Ori_ginal"
 msgstr "Ori_ginál:"
 
-#: modules/process/polydistort.c:283
+#: modules/process/polydistort.c:286
 msgid "_Transformed"
 msgstr "_Transformovaný"
 
-#: modules/process/polydistort.c:289
+#: modules/process/polydistort.c:292
 msgid "X Coefficients"
 msgstr "Koeficienty X"
 
-#: modules/process/polydistort.c:303
+#: modules/process/polydistort.c:306
 msgid "Y Coefficients"
 msgstr "Koeficienty Y"
 
-#: modules/process/polydistort.c:499
+#: modules/process/polydistort.c:502
 msgid "Distorted"
 msgstr "Deformovaný"
 
@@ -12183,23 +12771,23 @@ msgstr "Vyrovnaná data"
 msgid "_Horizontal polynom degree:"
 msgstr "Stupeň _vodorovného polynomu:"
 
-#: modules/process/polylevel.c:450
+#: modules/process/polylevel.c:451
 msgid "_Vertical polynom degree:"
 msgstr "Stupeň _svislého polynomu:"
 
-#: modules/process/polylevel.c:456
+#: modules/process/polylevel.c:458
 msgid "_Same degrees"
 msgstr "S_tejné stupně"
 
-#: modules/process/polylevel.c:474
+#: modules/process/polylevel.c:476
 msgid "_Maximum polynom degree:"
 msgstr "_Maximální stupeň polynomu"
 
-#: modules/process/polylevel.c:561
+#: modules/process/polylevel.c:564
 msgid "Polynomial Coefficients"
 msgstr "Polynomiální koeficienty"
 
-#: modules/process/polylevel.c:934 modules/tools/distance.c:594
+#: modules/process/polylevel.c:937 modules/tools/distance.c:594
 #: modules/tools/selectionmanager.c:720
 msgid "Save Table"
 msgstr "Uložit tabulku"
@@ -12221,8 +12809,8 @@ msgid "/_Presentation/E_xtract Presentation"
 msgstr "/_Presentace/_Extrahovat presentaci"
 
 #: modules/process/presentationops.c:81
-msgid "Extract presentation to a new channel"
-msgstr "Extrahovat presentaci do nového kanálu"
+msgid "Extract presentation to a new image"
+msgstr "Extrahovat presentaci do nového obrázku"
 
 #: modules/process/presentationops.c:84
 msgid "/_Presentation/_Attach Presentation..."
@@ -12248,6 +12836,10 @@ msgstr "Připojit presentaci"
 msgid "_Data to attach:"
 msgstr "Připojit _data:"
 
+#: modules/process/preview.h:245
+msgid "Combine with existing mask:"
+msgstr "Zkombinovat s existující maskou:"
+
 #: modules/process/psdf_logphi.c:76
 msgid ""
 "Two-dimensional FFT (Fast Fourier Transform) transformed to coordinates (log-"
@@ -12268,10 +12860,79 @@ msgstr "Vypočítat PSDF v log-úhel souřadnicích"
 msgid "Log-Phi PSDF"
 msgstr "Log-úhel PSDF"
 
-#: modules/process/psdf_logphi.c:275 modules/process/wpour_mark.c:320
+#: modules/process/psdf_logphi.c:276 modules/process/wpour_mark.c:320
 msgid "Gaussian _smoothing:"
 msgstr "Gaussovské v_yhlazení:"
 
+#: modules/process/psf-fit.c:165
+msgid "Gaussian (asymmetric)"
+msgstr "Gaussovka (asymetrická)"
+
+#: modules/process/psf-fit.c:177
+msgid "Point spread function estimation by fitting explicit function form."
+msgstr "Odhad rozptylové funkce (PSF) fitováním explicitního tvaru."
+
+#: modules/process/psf-fit.c:191
+msgid "/_Statistics/_PSF Fit..."
+msgstr "/_Statistika/Nafitovat _PSF..."
+
+#: modules/process/psf-fit.c:195
+msgid "Fit PSF from known data and image"
+msgstr "Nafitovat PSF ze známých dat a obrazu"
+
+#: modules/process/psf-fit.c:246 modules/process/psf.c:181
+#: modules/process/psf.c:230
+msgid "PSF"
+msgstr "PSF"
+
+#: modules/process/psf-fit.c:254 modules/process/psf.c:195
+msgid "PSF*P"
+msgstr "PSF*P"
+
+#: modules/process/psf-fit.c:271
+msgid "Fit PSF"
+msgstr "Fitovat PSF"
+
+#: modules/process/psf-fit.c:289 modules/process/psf.c:286
+msgid "_Ideal response:"
+msgstr "_Ideální odezva:"
+
+#: modules/process/psf.c:117
+msgid "Point spread function estimation"
+msgstr "Odhad rozptylové funkce (PSF)"
+
+#: modules/process/psf.c:131
+msgid "/_Statistics/_PSF Guess..."
+msgstr "/_Statistika/Odhad _PSF..."
+
+#: modules/process/psf.c:135
+msgid "Estimate PSF from known data and image"
+msgstr "Odhadnout PSF ze známých dat a obrazu"
+
+#: modules/process/psf.c:208
+msgid "PSF*P - I"
+msgstr "PSF*P - I"
+
+#: modules/process/psf.c:231
+msgid "Convolved"
+msgstr "Konvoluce"
+
+#: modules/process/psf.c:237
+msgid "Estimate PSF"
+msgstr "Odhadnutá PSF"
+
+#: modules/process/psf.c:238
+msgid "_Fit"
+msgstr "_Proložit"
+
+#: modules/process/psf.c:295
+msgid "_Display:"
+msgstr "_Zobrazovat:"
+
+#: modules/process/psf.c:301
+msgid "_Sigma init:"
+msgstr "Počáteční _sigma:"
+
 #: modules/process/rank.c:92
 msgid "Enhances local contrast using a rank transform."
 msgstr "Zlepšuje lokální kontrast pomocí řadicí transformace."
@@ -12321,7 +12982,7 @@ msgstr "/_Jednoduché operace/Rot_ace o úhel..."
 msgid "Rotate by arbitrary angle"
 msgstr "Rotace o libovolný úhel"
 
-#: modules/process/rotate.c:192
+#: modules/process/rotate.c:192 modules/volume/volume_swaxes.c:651
 msgid "Rotated Data"
 msgstr "Otočená data"
 
@@ -12377,63 +13038,63 @@ msgstr "Škálovaná data"
 msgid "verb|Scale"
 msgstr "Změnit velikost"
 
-#: modules/process/scale.c:216
+#: modules/process/scale.c:217
 msgid "Scale by _ratio:"
 msgstr "Zvětšit/zmenšit v _poměru:"
 
-#: modules/process/scale.c:224
+#: modules/process/scale.c:225
 msgid "_proportional"
 msgstr "_proporcionální"
 
-#: modules/process/scale.c:235
+#: modules/process/scale.c:237
 msgid "New _width:"
 msgstr "Nová šířk_a:"
 
-#: modules/process/scale.c:243
+#: modules/process/scale.c:246
 msgid "New _height:"
 msgstr "Nová _výška:"
 
-#: modules/process/scars.c:113
+#: modules/process/scars.c:122
 msgid "Marks and/or removes scars (horizontal linear artifacts)."
 msgstr "Označuje a/nebo odstraňuje šrámy (vodorovné lineární defekty)."
 
-#: modules/process/scars.c:127
+#: modules/process/scars.c:136
 msgid "/_Correct Data/M_ark Scars..."
 msgstr "/_Korekce dat/O_značení šrámů..."
 
-#: modules/process/scars.c:131
+#: modules/process/scars.c:140
 msgid "Mark horizontal scars (strokes)"
 msgstr "Označit horizontální šrámy"
 
-#: modules/process/scars.c:134
+#: modules/process/scars.c:143
 msgid "/_Correct Data/Remove _Scars"
 msgstr "/_Korekce dat/_Odstranění šrámů"
 
-#: modules/process/scars.c:138
+#: modules/process/scars.c:147
 msgid "Correct horizontal scars (strokes)"
 msgstr "Opravit horizontální šrámy"
 
-#: modules/process/scars.c:293
+#: modules/process/scars.c:312
 msgid "Mark Scars"
 msgstr "Označení šrámů"
 
-#: modules/process/scars.c:331
+#: modules/process/scars.c:353
 msgid "Maximum _width:"
 msgstr "Maximální šířk_a:"
 
-#: modules/process/scars.c:338
+#: modules/process/scars.c:361
 msgid "Minimum _length:"
 msgstr "Minimální _délka:"
 
-#: modules/process/scars.c:345
+#: modules/process/scars.c:369
 msgid "_Hard threshold:"
 msgstr "_Tvrdý práh:"
 
-#: modules/process/scars.c:353
+#: modules/process/scars.c:377
 msgid "_Soft threshold:"
 msgstr "_Měkký práh:"
 
-#: modules/process/scars.c:361
+#: modules/process/scars.c:385
 msgid "Scars type:"
 msgstr "Typ šrámů:"
 
@@ -12473,27 +13134,27 @@ msgstr "Monte Carlo"
 msgid "_Quality:"
 msgstr "_Kvalita:"
 
-#: modules/process/shade.c:92
+#: modules/process/shade.c:94
 msgid "Creates a shaded presentation of data."
 msgstr "Vytváří vystínovanou presentaci dat."
 
-#: modules/process/shade.c:106
+#: modules/process/shade.c:108
 msgid "/_Presentation/_Shading..."
 msgstr "/_Presentace/_Stínování..."
 
-#: modules/process/shade.c:110
+#: modules/process/shade.c:112
 msgid "Shade data"
 msgstr "Vystínování dat"
 
-#: modules/process/shade.c:207
+#: modules/process/shade.c:209
 msgid "Shading"
 msgstr "Stínování"
 
-#: modules/process/shade.c:253
+#: modules/process/shade.c:260
 msgid "_Mix:"
 msgstr "_Míchat:"
 
-#: modules/process/slope_dist.c:161
+#: modules/process/slope_dist.c:160
 msgid ""
 "Calculates one- or two-dimensional distribution of slopes or graph of their "
 "angular distribution."
@@ -12501,82 +13162,131 @@ msgstr ""
 "Počítá jedno- a dvourozměrné rozdělení sklonů, případně graf jejich úhlového "
 "rozdělení."
 
-#: modules/process/slope_dist.c:176
+#: modules/process/slope_dist.c:175
 msgid "/_Statistics/_Slope Distribution..."
 msgstr "/_Statistika/Rozdělení _sklonu..."
 
-#: modules/process/slope_dist.c:180
+#: modules/process/slope_dist.c:179
 msgid "Calculate angular slope distribution"
 msgstr "Výpočet úhlového rozdělení sklonů"
 
-#: modules/process/slope_dist.c:221
+#: modules/process/slope_dist.c:220
 msgid "Slope distribution"
 msgstr "Rozdělení sklonů"
 
-#: modules/process/slope_dist.c:253
+#: modules/process/slope_dist.c:252
 msgid "_Two-dimensional distribution"
 msgstr "_Dvojrozměrné rozdělení"
 
-#: modules/process/slope_dist.c:254
+#: modules/process/slope_dist.c:253
 msgid "Directional (φ) _graph"
 msgstr "Směrový (φ) _graf"
 
-#: modules/process/slope_dist.c:255
+#: modules/process/slope_dist.c:254
 msgid "_Inclination (θ) graph"
 msgstr "_Sklonový (θ) graf"
 
-#: modules/process/slope_dist.c:256
+#: modules/process/slope_dist.c:255
 msgid "Inclination (gra_dient) graph"
 msgstr "_Sklonový graf (gradient)"
 
-#: modules/process/slope_dist.c:270
+#: modules/process/slope_dist.c:269
 msgid "Slope Distribution"
 msgstr "Rozdělení sklonu"
 
-#: modules/process/slope_dist.c:755
+#: modules/process/slope_dist.c:749
 msgid "Angular Slope Distribution"
 msgstr "Úhlové rozdělení sklonů"
 
-#: modules/process/slope_dist.c:763 modules/process/tilt.c:179
+#: modules/process/slope_dist.c:757 modules/process/tilt.c:179
 msgid "Slopes"
 msgstr "Sklony"
 
-#: modules/process/slope_dist.c:824 modules/process/slope_dist.c:893
+#: modules/process/slope_dist.c:818 modules/process/slope_dist.c:887
 msgid "Inclination Distribution"
 msgstr "Rozdělení sklonů"
 
-#: modules/process/slope_dist.c:832 modules/process/slope_dist.c:901
+#: modules/process/slope_dist.c:826 modules/process/slope_dist.c:895
 msgid "Inclinations"
 msgstr "Sklony"
 
-#: modules/process/sphere-revolve.c:97
+#: modules/process/sphere-revolve.c:111
 msgid "Subtracts background by arc or sphere revolution."
 msgstr "Odečítá pozadí pomocí valení oblouku či sféry."
 
-#: modules/process/sphere-revolve.c:113
+#: modules/process/sphere-revolve.c:125
 msgid "/_Level/Revolve _Arc..."
 msgstr "/_Vyrovnání/Valení _oblouku..."
 
-#: modules/process/sphere-revolve.c:117
+#: modules/process/sphere-revolve.c:129
 msgid "Level data by arc revolution"
 msgstr "Vyrovnat data valením oblouku"
 
-#: modules/process/sphere-revolve.c:208 modules/tools/sfunctions.c:371
+#: modules/process/sphere-revolve.c:132
+msgid "/_Level/Revolve _Sphere..."
+msgstr "/_Vyrovnání/Valení _koule..."
+
+#: modules/process/sphere-revolve.c:136
+msgid "Level data by sphere revolution"
+msgstr "Vyrovnat data valením koule"
+
+#: modules/process/sphere-revolve.c:303 modules/tools/sfunctions.c:381
 msgid "_Horizontal direction"
 msgstr "_Vodorovný směr"
 
-#: modules/process/sphere-revolve.c:209 modules/tools/sfunctions.c:372
+#: modules/process/sphere-revolve.c:304 modules/tools/sfunctions.c:382
 msgid "_Vertical direction"
 msgstr "_Svislý směr"
 
-#: modules/process/sphere-revolve.c:210
+#: modules/process/sphere-revolve.c:305
 msgid "_Both directions"
 msgstr "O_ba směry"
 
-#: modules/process/sphere-revolve.c:217
+#: modules/process/sphere-revolve.c:315
+msgid "Revolve Sphere"
+msgstr "Valení koule"
+
+#: modules/process/sphere-revolve.c:315
 msgid "Revolve Arc"
 msgstr "Valení oblouku"
 
+#: modules/process/sphere-revolve.c:355
+msgid "Direction:"
+msgstr "Směr:"
+
+#: modules/process/sphere-revolve.c:699
+msgid "Revolving sphere..."
+msgstr "Valím kouli..."
+
+#: modules/process/stitch.c:135
+msgid "Stitch multiple images based on offsets of origins."
+msgstr "Sešití více obrázků na základě posunů počátku."
+
+#: modules/process/stitch.c:149
+msgid "/M_ultidata/_Stitch..."
+msgstr "/M_ultidata/_Sešití..."
+
+#: modules/process/stitch.c:153
+msgid "Stitch images using offsets"
+msgstr "Sešít obrázky pomocí posunů počátků"
+
+#: modules/process/stitch.c:269
+msgid "Stitch"
+msgstr "Sešití"
+
+#: modules/process/stitch.c:312
+msgid "Channels"
+msgstr "Kanály"
+
+#: modules/process/stitch.c:435
+msgid "Restore"
+msgstr "Obnovit"
+
+#: modules/process/stitch.c:445 modules/tools/linestats.c:379
+#: modules/tools/sfunctions.c:440 modules/tools/stats.c:406
+msgid "_Instant updates"
+msgstr "Okamžité aktuali_zace"
+
 #: modules/process/straighten_path.c:126
 msgid "Extracts a straightened part of image along a curve."
 msgstr "Extrahuje narovnanou část obrázku vybranou podél zakřivené cesty."
@@ -12593,28 +13303,28 @@ msgstr "Narovnat podél cesty"
 msgid "Straighten Path"
 msgstr "Narovnat podél cesty"
 
-#: modules/process/straighten_path.c:254
+#: modules/process/straighten_path.c:253
 msgid "Res_tore"
 msgstr "Ob_novit"
 
-#: modules/process/straighten_path.c:259
+#: modules/process/straighten_path.c:258
 msgid "Re_verse"
 msgstr "Obrátit _směr"
 
 #: modules/process/straighten_path.c:278 modules/tools/pathlevel.c:256
-#: modules/tools/profile.c:507 modules/tools/roughness.c:854
+#: modules/tools/profile.c:503 modules/tools/roughness.c:868
 msgid "_Thickness:"
 msgstr "_Tloušťka:"
 
-#: modules/process/straighten_path.c:286
+#: modules/process/straighten_path.c:287
 msgid "_Slackness:"
 msgstr "_Průvěs:"
 
-#: modules/process/straighten_path.c:292
+#: modules/process/straighten_path.c:293
 msgid "C_losed curve"
 msgstr "_Uzavřená křivka"
 
-#: modules/process/straighten_path.c:379
+#: modules/process/straighten_path.c:380
 msgid "Straightened"
 msgstr "Narovnaný"
 
@@ -12637,52 +13347,52 @@ msgstr "Superrozlišení z více obrázků téhož útvaru."
 msgid "Supres"
 msgstr "Superrozlišení"
 
-#: modules/process/superresolution.c:421
+#: modules/process/superresolution.c:420
 msgid "Correlating to determine mean shift..."
 msgstr "Koreluji k určení středního posunu..."
 
-#: modules/process/superresolution.c:511
+#: modules/process/superresolution.c:510
 msgid "Cross-correlation..."
 msgstr "Počítám křížovou korelaci..."
 
-#: modules/process/superresolution.c:554 modules/xyz/xyz_raster.c:1079
-#: modules/xyz/xyz_raster.c:1119
+#: modules/process/superresolution.c:553 modules/xyz/xyz_raster.c:1053
+#: modules/xyz/xyz_raster.c:1093
 msgid "Interpolating..."
 msgstr "Interpoluji..."
 
-#: modules/process/synth.h:343
+#: modules/process/synth.h:344
 msgid "Roundness"
 msgstr "Zaoblenost"
 
-#: modules/process/synth.h:351
+#: modules/process/synth.h:352
 msgid "Roundn_ess:"
 msgstr "_Zaoblenost:"
 
-#: modules/process/synth.h:399
+#: modules/process/synth.h:401
 msgid "Orientation"
 msgstr "Orientace"
 
-#: modules/process/synth.h:408
+#: modules/process/synth.h:410
 msgid "Orien_tation:"
 msgstr "Or_ientace:"
 
-#: modules/process/synth.h:432
+#: modules/process/synth.h:436
+msgid "_Truncate:"
+msgstr "_Uříznout:"
+
+#: modules/process/synth.h:460
 msgid "Variance:"
 msgstr "Rozptyl:"
 
-#: modules/process/synth.h:456
-msgid "Deformation"
-msgstr "Deformace"
-
-#: modules/process/synth.h:464
+#: modules/process/synth.h:493
 msgid "_Amplitude:"
 msgstr "_Amplituda:"
 
-#: modules/process/synth.h:472
+#: modules/process/synth.h:501
 msgid "_Lateral scale:"
 msgstr "_Příčná škála:"
 
-#: modules/process/synth.h:566
+#: modules/process/synth.h:595
 msgid "Randomi_ze"
 msgstr "Znáhodn_it"
 
@@ -12698,41 +13408,41 @@ msgstr "/_Jednoduché operace/_Omezit rozsah..."
 msgid "Limit data range"
 msgstr "Omezit rozsah dat"
 
-#: modules/process/threshold.c:246
+#: modules/process/threshold.c:241
 msgid "Limit Range"
 msgstr "Omezit rozsah dat"
 
-#: modules/process/threshold.c:281
+#: modules/process/threshold.c:276
 msgid "Specify _thresholds"
 msgstr "Zadat _rozsah"
 
-#: modules/process/threshold.c:283
+#: modules/process/threshold.c:278
 msgid "Use _display range"
 msgstr "Použít _zobrazovaný rozsah"
 
-#: modules/process/threshold.c:285
+#: modules/process/threshold.c:280
 msgid "Cut off outlier_s"
 msgstr "Odříznout v_ybočující hodnoty"
 
-#: modules/process/threshold.c:294
+#: modules/process/threshold.c:289
 msgid "_Lower:"
 msgstr "_Dolní:"
 
-#: modules/process/threshold.c:300
+#: modules/process/threshold.c:295
 msgid "_Upper:"
 msgstr "_Horní:"
 
-#: modules/process/threshold.c:305
+#: modules/process/threshold.c:300
 msgid "Set to _Full Range"
 msgstr "Plný rozsah"
 
 #. TRANSLATORS: This is a range: 123 to 456.
-#: modules/process/threshold.c:318
+#: modules/process/threshold.c:313
 #, c-format
 msgid "%.*f to %.*f"
 msgstr "%.*f až %.*f"
 
-#: modules/process/threshold.c:341
+#: modules/process/threshold.c:336
 msgid "F_arther than:"
 msgstr "Vzdálenější _než:"
 
@@ -12752,11 +13462,11 @@ msgstr "Naklonit o zadaný úhel"
 msgid "Tilt"
 msgstr "Naklonění"
 
-#: modules/process/tilt.c:185 modules/volume/volume_slice.c:444
+#: modules/process/tilt.c:185 modules/volume/volume_slice.c:446
 msgid "_X:"
 msgstr "_X:"
 
-#: modules/process/tilt.c:194 modules/volume/volume_slice.c:464
+#: modules/process/tilt.c:194 modules/volume/volume_slice.c:469
 msgid "_Y:"
 msgstr "_Y:"
 
@@ -12764,31 +13474,31 @@ msgstr "_Y:"
 msgid "Angles"
 msgstr "Úhly"
 
-#: modules/process/tip_blind.c:178
+#: modules/process/tip_blind.c:177
 msgid "Blind estimation of SPM tip using Villarubia's algorithm."
 msgstr "Slepý odhad tvaru SPM hrotu Villarubiovou metodou."
 
-#: modules/process/tip_blind.c:192
+#: modules/process/tip_blind.c:191
 msgid "/_Tip and Indentation/_Blind Estimation..."
 msgstr "/_Hrot a indentace/_Slepý odhad tvaru hrotu..."
 
-#: modules/process/tip_blind.c:196
+#: modules/process/tip_blind.c:195
 msgid "Blind tip estimation"
 msgstr "Slepý odhad hrotu"
 
-#: modules/process/tip_blind.c:231
+#: modules/process/tip_blind.c:230
 msgid "Blind Tip Estimation"
 msgstr "Slepý odhad tvaru hrotu"
 
-#: modules/process/tip_blind.c:232
+#: modules/process/tip_blind.c:231
 msgid "Run _Partial"
 msgstr "Čás_t. odhad"
 
-#: modules/process/tip_blind.c:233
+#: modules/process/tip_blind.c:232
 msgid "Run _Full"
 msgstr "Pl_ný odhad"
 
-#: modules/process/tip_blind.c:234
+#: modules/process/tip_blind.c:233
 msgid "_Reset Tip"
 msgstr "_Obnovit hrot"
 
@@ -12796,77 +13506,77 @@ msgstr "_Obnovit hrot"
 msgid "Related _data:"
 msgstr "Související data:"
 
-#: modules/process/tip_blind.c:326
+#: modules/process/tip_blind.c:327
 msgid "Estimated Tip Size"
 msgstr "Odhadovaná velikost hrotu"
 
-#: modules/process/tip_blind.c:347
+#: modules/process/tip_blind.c:350
 msgid "_Same resolution"
 msgstr "S_tejná rozlišení"
 
-#: modules/process/tip_blind.c:366
+#: modules/process/tip_blind.c:376
 msgid "Noise suppression t_hreshold:"
 msgstr "Prá_h potlačení šumu:"
 
-#: modules/process/tip_blind.c:386
+#: modules/process/tip_blind.c:384
 msgid "Use _boundaries"
 msgstr "Použít _okraje"
 
-#: modules/process/tip_blind.c:396
+#: modules/process/tip_blind.c:395
 msgid "Stripes"
 msgstr "Pruhy"
 
-#: modules/process/tip_blind.c:402
+#: modules/process/tip_blind.c:401
 msgid "_Split to stripes:"
 msgstr "_Rozdělit na pruhy:"
 
-#: modules/process/tip_blind.c:416
+#: modules/process/tip_blind.c:412
 msgid "_Preview stripe:"
 msgstr "_Náhled pruhu:"
 
-#: modules/process/tip_blind.c:423
+#: modules/process/tip_blind.c:420
 msgid "Plot size _graph"
 msgstr "Nakreslit _graf velikosti"
 
-#: modules/process/tip_blind.c:433
+#: modules/process/tip_blind.c:430
 msgid "Create tip i_mages"
 msgstr "Vytvořit obráz_ky hrotů"
 
 #. TRANSLATORS: Prefix for the progressbar message.
-#: modules/process/tip_blind.c:810
+#: modules/process/tip_blind.c:807
 #, c-format
 msgid "Stripe %u: "
 msgstr "Pruh %u: "
 
-#: modules/process/tip_blind.c:917 modules/process/tip_blind.c:941
+#: modules/process/tip_blind.c:914 modules/process/tip_blind.c:938
 msgid "Estimated tip"
 msgstr "Odhadnutý hrot"
 
-#: modules/process/tip_blind.c:1207 modules/process/tip_blind.c:1216
+#: modules/process/tip_blind.c:1204 modules/process/tip_blind.c:1213
 msgid "Tip radius evolution"
 msgstr "Vývoj poloměru hrotu"
 
-#: modules/process/tip_model.c:114
+#: modules/process/tip_model.c:112
 msgid "Models SPM tip."
 msgstr "Modeluje SPM hrot."
 
-#: modules/process/tip_model.c:129
+#: modules/process/tip_model.c:127
 msgid "/_Tip and Indentation/_Model Tip..."
 msgstr "/_Hrot a indentace/_Modelovat hrot..."
 
-#: modules/process/tip_model.c:133
+#: modules/process/tip_model.c:131
 msgid "Model AFM tip"
 msgstr "Modelování hrotu AFM"
 
-#: modules/process/tip_model.c:164
+#: modules/process/tip_model.c:162
 msgid "Model Tip"
 msgstr "Modelování hrotu"
 
-#: modules/process/tip_model.c:224
+#: modules/process/tip_model.c:222
 msgid "Tip _type:"
 msgstr "Typ hrotu:"
 
-#: modules/process/tip_model.c:229
+#: modules/process/tip_model.c:228
 msgid "_Number of sides:"
 msgstr "_Počet stran:"
 
@@ -12878,19 +13588,19 @@ msgstr "_Sklon hrotu:"
 msgid "Tip _rotation:"
 msgstr "_Rotace hrotu:"
 
-#: modules/process/tip_model.c:250
+#: modules/process/tip_model.c:255
 msgid "Tip _apex radius:"
 msgstr "Poloměr _vrcholku:"
 
-#: modules/process/tip_model.c:269
+#: modules/process/tip_model.c:265
 msgid "Tip _anisotropy:"
 msgstr "_Anisotropie hrotu:"
 
-#: modules/process/tip_model.c:490
+#: modules/process/tip_model.c:484
 msgid "Modeled tip"
 msgstr "Modelovaný hrot"
 
-#: modules/process/tip_model.c:562
+#: modules/process/tip_model.c:556
 #, c-format
 msgid "Tip resolution: %d × %d pixels"
 msgstr "Rozlišení hrotu: %d × %d pixelů"
@@ -12996,8 +13706,8 @@ msgid "Converts datafield to 3D volume data."
 msgstr "Převádí datové pole na trojrozměrná objemová data."
 
 #: modules/process/volumize.c:56
-msgid "/_Basic Operations/Volumize..."
-msgstr "/_Jednoduché operace/Převést na o_bjem..."
+msgid "/_Basic Operations/Volumize"
+msgstr "/_Jednoduché operace/Převést na o_bjemová..."
 
 #: modules/process/volumize.c:60
 msgid "Convert datafield to 3D data"
@@ -13041,73 +13751,77 @@ msgstr "_Z-ové rozlišení:"
 msgid "Z _range:"
 msgstr "Z-ový _rozsah:"
 
-#: modules/process/wave_synth.c:211
+#: modules/process/wave_synth.c:219
 msgid "Generates various kinds of waves."
 msgstr "Generuje různé druhy vln."
 
-#: modules/process/wave_synth.c:225
+#: modules/process/wave_synth.c:233
 msgid "/S_ynthetic/_Waves..."
 msgstr "/S_yntetická/_Vlny..."
 
-#: modules/process/wave_synth.c:229
+#: modules/process/wave_synth.c:237
 msgid "Generate waves"
 msgstr "Generovat vlny"
 
-#: modules/process/wave_synth.c:347
+#: modules/process/wave_synth.c:366
 msgid "Waves"
 msgstr "Vlny"
 
-#: modules/process/wave_synth.c:422 modules/tools/linestats.c:337
-#: modules/tools/sfunctions.c:401 modules/volume/volume_linestat.c:369
+#: modules/process/wave_synth.c:441 modules/tools/linestats.c:337
+#: modules/tools/sfunctions.c:411 modules/volume/volume_linestat.c:374
 msgid "_Quantity:"
 msgstr "_Veličina:"
 
-#: modules/process/wave_synth.c:429
+#: modules/process/wave_synth.c:448
 msgid "_Number of waves:"
 msgstr "_Počet vln:"
 
-#: modules/process/wave_synth.c:436 modules/process/wave_synth.c:582
-#: modules/tools/roughness.c:274
+#: modules/process/wave_synth.c:455 modules/process/wave_synth.c:617
+#: modules/tools/roughness.c:275
 msgid "Amplitude"
 msgstr "Amplituda"
 
-#: modules/process/wave_synth.c:441
+#: modules/process/wave_synth.c:460
 msgid "_Wave form:"
 msgstr "Forma _vlny:"
 
-#: modules/process/wave_synth.c:448
+#: modules/process/wave_synth.c:467
 msgid "Amplitude:"
 msgstr "Amplituda:"
 
-#: modules/process/wave_synth.c:466
+#: modules/process/wave_synth.c:487
+msgid "_Decay:"
+msgstr "Ú_bytek:"
+
+#: modules/process/wave_synth.c:497
 msgid "Frequency"
 msgstr "Frekvence"
 
-#: modules/process/wave_synth.c:472
+#: modules/process/wave_synth.c:503
 msgid "_Spatial frequency:"
 msgstr "Prostorová _frekvence:"
 
-#: modules/process/wave_synth.c:488
+#: modules/process/wave_synth.c:519
 msgid "_X center:"
 msgstr "Střed v _X:"
 
-#: modules/process/wave_synth.c:499
+#: modules/process/wave_synth.c:532
 msgid "_Y center:"
 msgstr "Střed v _Y"
 
-#: modules/process/wave_synth.c:565
+#: modules/process/wave_synth.c:600
 msgid "Cosine"
 msgstr "Kosinus"
 
-#: modules/process/wave_synth.c:566
+#: modules/process/wave_synth.c:601
 msgid "Inverse cosh"
 msgstr "Inverzní cosh"
 
-#: modules/process/wave_synth.c:567
+#: modules/process/wave_synth.c:602
 msgid "Flat top"
 msgstr "Plochý vršek"
 
-#: modules/process/wave_synth.c:581
+#: modules/process/wave_synth.c:616
 msgid "Displacement"
 msgstr "Posunutí"
 
@@ -13191,39 +13905,39 @@ msgstr "Sloučené obrázky"
 msgid "Preprocess and mark"
 msgstr "Předzpracovat a označit"
 
-#: modules/process/xydenoise.c:57
+#: modules/process/xydenoise.c:58
 msgid "Denoises measurement on basis of two orthogonal scans."
 msgstr "Odšumuje měření na základě dvou kolmých skenů."
 
-#: modules/process/xydenoise.c:71
+#: modules/process/xydenoise.c:72
 msgid "/M_ultidata/_XY denoise..."
 msgstr "/M_ultidata/_XY odšumění..."
 
-#: modules/process/xydenoise.c:75
+#: modules/process/xydenoise.c:76
 msgid "Denoises horizontal/vertical measurement."
 msgstr "Odšumí data z horizontálního a vertikálního snímku"
 
-#: modules/process/xydenoise.c:102
+#: modules/process/xydenoise.c:103
 msgid "XY Denoising"
 msgstr "XY odšumění"
 
-#: modules/process/xydenoise.c:124
+#: modules/process/xydenoise.c:125
 msgid "Second direction:"
 msgstr "Druhý směr:"
 
-#: modules/process/xydenoise.c:232
+#: modules/process/xydenoise.c:233
 msgid "Computing forward FFTs..."
 msgstr "Počítám dopředné FFT..."
 
-#: modules/process/xydenoise.c:248
+#: modules/process/xydenoise.c:249
 msgid "Computing image..."
 msgstr "Počítám obrázek..."
 
-#: modules/process/xydenoise.c:260
+#: modules/process/xydenoise.c:261
 msgid "Computing backward FFT..."
 msgstr "Počítám zpětné FFT..."
 
-#: modules/process/xydenoise.c:272
+#: modules/process/xydenoise.c:273
 msgid "Denoised"
 msgstr "Odšuměná data"
 
@@ -13239,63 +13953,67 @@ msgstr "/_Jednoduché operace/Převést na _XYZ..."
 msgid "Convert to XYZ data"
 msgstr "Převést datové pole na XYZ data"
 
-#: modules/pygwy/pygwy-console.c:55
+#: modules/pygwy/pygwy-console.c:99
 msgid "/Pygwy Console"
 msgstr "/Konsola pygwy"
 
-#: modules/pygwy/pygwy-console.c:59
+#: modules/pygwy/pygwy-console.c:103
 msgid "Python wrapper console"
 msgstr "Konzola rozhraní Pythonu"
 
-#: modules/pygwy/pygwy-console.c:142
-msgid ">>> Running the script above\n"
-msgstr ">>> Spouštím skript výše\n"
-
-#: modules/pygwy/pygwy-console.c:194
-msgid "Open Python script"
-msgstr "Otevřít skript v Pythonu"
-
-#: modules/pygwy/pygwy-console.c:275
-msgid "Save Script as"
-msgstr "Uložit skript jako"
-
-#: modules/pygwy/pygwy-console.c:327
+#: modules/pygwy/pygwy-console.c:168 modules/pygwy/pygwy-console.c:481
 msgid "Pygwy Console"
 msgstr "Konsola pygwy"
 
-#: modules/pygwy/pygwy-console.c:340
-msgid "Clear Log"
-msgstr "Vyprázdnit log"
-
-#: modules/pygwy/pygwy-console.c:344
+#: modules/pygwy/pygwy-console.c:187
 msgid "Open script in Python language (Ctrl-O)"
 msgstr "Otevřít skript v jazyce Python (Ctrl-O)"
 
-#: modules/pygwy/pygwy-console.c:346
+#: modules/pygwy/pygwy-console.c:197
 msgid "Save script (Ctrl-S)"
 msgstr "Uložit skript (Ctrl-S)"
 
-#: modules/pygwy/pygwy-console.c:348
+#: modules/pygwy/pygwy-console.c:207
+msgid "Save script as (Ctrl-Shift-S)"
+msgstr "Uložit skript jako (Ctrl-Shift-S)"
+
+#: modules/pygwy/pygwy-console.c:217
 msgid "Execute script (Ctrl-E)"
 msgstr "Spustit skript (Ctrl-E)"
 
-#: modules/pygwy/pygwy-console.c:426
+#: modules/pygwy/pygwy-console.c:227
+msgid "Clear Log"
+msgstr "Vyprázdnit log"
+
+#: modules/pygwy/pygwy-console.c:285
 msgid "Command"
 msgstr "Příkaz"
 
-#: pygwy.c:120
+#: modules/pygwy/pygwy-console.c:371
+msgid ">>> Running the script above\n"
+msgstr ">>> Spouštím skript výše\n"
+
+#: modules/pygwy/pygwy-console.c:425
+msgid "Save Python Script as"
+msgstr "Uložit skript v Pythonu jako"
+
+#: modules/pygwy/pygwy-console.c:429
+msgid "Open Python Script"
+msgstr "Otevřít skript v Pythonu"
+
+#: pygwy.c:130
 msgid "Pygwy, the Gwyddion Python wrapper."
 msgstr "Pygwy, pythoní rozhraní ke Gwyddionu."
 
-#: pygwy.c:258
+#: pygwy.c:269
 msgid "Python Interpreter Errors"
 msgstr "Chyby interptetu Pythonu"
 
-#: pygwy.c:384
+#: pygwy.c:399
 msgid "Python interpreter error occurred."
 msgstr "Došlo k chybě interpretu Pythonu."
 
-#: pygwy.c:459
+#: pygwy.c:499
 msgid "Function written in Python"
 msgstr "Funkce napsaná v Pythonu"
 
@@ -13320,11 +14038,11 @@ msgid "Measure distances and directions between points"
 msgstr "Měření vzdáleností a směrů mezi body"
 
 #. TRANSLATORS: Number is verb here.
-#: modules/tools/distance.c:250 modules/tools/profile.c:532
+#: modules/tools/distance.c:250 modules/tools/profile.c:527
 msgid "_Number lines"
 msgstr "Čís_lovat čáry:"
 
-#: modules/tools/filter.c:128
+#: modules/tools/filter.c:129
 msgid ""
 "Filter tool, processes selected part of data with a filter (conservative "
 "denoise, mean, median. Kuwahara, minimum, maximum)."
@@ -13332,27 +14050,27 @@ msgstr ""
 "Nástroj filtr, zpracovává vybranou část dat filtrem (konzervativní odšumění, "
 "střední hodnota, medián, Kuwahara, minimum, maximum)."
 
-#: modules/tools/filter.c:171
+#: modules/tools/filter.c:172
 msgid "Basic filters: mean, median, denoise, …"
 msgstr "Základní filtry: střední hodnota, medián, odšumování, …"
 
-#: modules/tools/filter.c:239
+#: modules/tools/filter.c:240
 msgid "Conservative denoise"
 msgstr "Konzervativní odšumění"
 
-#: modules/tools/filter.c:246
+#: modules/tools/filter.c:247
 msgid "Kuwahara"
 msgstr "Kuwahara"
 
-#: modules/tools/filter.c:247
+#: modules/tools/filter.c:248
 msgid "Dechecker"
 msgstr "Potlačení šachovnice"
 
-#: modules/tools/filter.c:248
+#: modules/tools/filter.c:249
 msgid "filter|Gaussian"
 msgstr "Gaussovský"
 
-#: modules/tools/filter.c:249
+#: modules/tools/filter.c:250
 msgid "Sharpen"
 msgstr "Zostření"
 
@@ -13447,7 +14165,7 @@ msgid "Height histogram"
 msgstr "Rozdělení výšek"
 
 #: modules/tools/icolorange.c:329 modules/tools/linestats.c:169
-#: modules/tools/sfunctions.c:226 modules/volume/volume_linestat.c:146
+#: modules/tools/sfunctions.c:231 modules/volume/volume_linestat.c:148
 msgid "Range"
 msgstr "Rozsah"
 
@@ -13475,7 +14193,7 @@ msgstr "_Invertovat mapu"
 msgid "range|Full"
 msgstr "Plný"
 
-#: modules/tools/level3.c:106
+#: modules/tools/level3.c:108
 msgid ""
 "Three-point level tool, levels data by subtracting a plane fitted through "
 "three selected points."
@@ -13483,23 +14201,23 @@ msgstr ""
 "Nástroj tříbodové vyrovnání, vyrovnává data odečtením roviny proložené třemi "
 "vybranými body."
 
-#: modules/tools/level3.c:143
+#: modules/tools/level3.c:145
 msgid "Three Point Level"
 msgstr "Tříbodové vyrovnání"
 
-#: modules/tools/level3.c:144
+#: modules/tools/level3.c:146
 msgid "Level data by fitting a plane through three points"
 msgstr "Vyrovnání dat proložením roviny třemi zadanými body"
 
-#: modules/tools/level3.c:239 modules/tools/readvalue.c:375
+#: modules/tools/level3.c:244 modules/tools/readvalue.c:378
 msgid "_Averaging radius:"
 msgstr "_Poloměr oblasti průměrování:"
 
-#: modules/tools/level3.c:246
+#: modules/tools/level3.c:251
 msgid "_Instant apply"
 msgstr "_Aplikovat okamžitě"
 
-#: modules/tools/level3.c:255
+#: modules/tools/level3.c:261
 msgid "Set plane to _zero"
 msgstr "Položit rovinu do nuly"
 
@@ -13511,23 +14229,23 @@ msgstr ""
 "Nástroj řádkových/sloupcových statistických funkcí: počítá střední hodnoty, "
 "mediány, maxima, minima, RMS, ..., řádků čí sloupců."
 
-#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:148
+#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:150
 msgid "tan β<sub>0</sub>"
 msgstr "tg β<sub>0</sub>"
 
-#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:150
+#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:152
 msgid "Ra"
 msgstr "Ra"
 
-#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:151
+#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:153
 msgid "Rq (RMS)"
 msgstr "Rq (RMS)"
 
-#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:152
+#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:154
 msgid "Rz"
 msgstr "Rz"
 
-#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:153
+#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:155
 msgid "Rt"
 msgstr "Rt"
 
@@ -13551,16 +14269,11 @@ msgstr "S_loupce"
 msgid "Average:"
 msgstr "Střední hodnota:"
 
-#: modules/tools/linestats.c:363 modules/tools/profile.c:464
-#: modules/tools/sfunctions.c:414 modules/tools/spectro.c:343
+#: modules/tools/linestats.c:363 modules/tools/profile.c:460
+#: modules/tools/sfunctions.c:424 modules/tools/spectro.c:346
 msgid "<b>Options</b>"
 msgstr "<b>Volby</b>"
 
-#: modules/tools/linestats.c:379 modules/tools/sfunctions.c:430
-#: modules/tools/stats.c:408
-msgid "_Instant updates"
-msgstr "Okamžité aktuali_zace"
-
 #: modules/tools/maskedit.c:170
 msgid "Mask editor tool, allows interactive modification of parts of the mask."
 msgstr ""
@@ -13619,63 +14332,63 @@ msgstr "Vyplnění souvislých prázdných oblastí maskou"
 msgid "Erase continuous parts of mask"
 msgstr "Odstranění souvislých částí masky"
 
-#: modules/tools/maskedit.c:408
+#: modules/tools/maskedit.c:409
 msgid "Editor"
 msgstr "Editor"
 
-#: modules/tools/maskedit.c:413
+#: modules/tools/maskedit.c:414
 msgid "_Shapes"
 msgstr "_Tvary"
 
-#: modules/tools/maskedit.c:423
+#: modules/tools/maskedit.c:428
 msgid "Mode:"
 msgstr "Mód:"
 
-#: modules/tools/maskedit.c:452
+#: modules/tools/maskedit.c:458
 msgid "Shape:"
 msgstr "Tvar:"
 
-#: modules/tools/maskedit.c:483
+#: modules/tools/maskedit.c:486
 msgid "_Drawing Tools"
 msgstr "_Kreslicí nástroje"
 
-#: modules/tools/maskedit.c:493
+#: modules/tools/maskedit.c:500
 msgid "Tool:"
 msgstr "Nástroj:"
 
-#: modules/tools/maskedit.c:532
+#: modules/tools/maskedit.c:538
 msgid "Actions"
 msgstr "Akce"
 
-#: modules/tools/maskedit.c:540
+#: modules/tools/maskedit.c:546
 msgid "_Invert"
 msgstr "_Inverze"
 
-#: modules/tools/maskedit.c:571
+#: modules/tools/maskedit.c:577
 msgid "Fill _Voids"
 msgstr "Vyplnit _Díry"
 
-#: modules/tools/maskedit.c:580
+#: modules/tools/maskedit.c:586
 msgid "Fill non-simple-connected"
 msgstr "Vyplnit nejen jednoduše souvislé"
 
-#: modules/tools/maskedit.c:591
+#: modules/tools/maskedit.c:597
 msgid "Grow/Shrink"
 msgstr "Rozšíření/zúžení"
 
-#: modules/tools/maskedit.c:600
+#: modules/tools/maskedit.c:606
 msgid "_Grow"
 msgstr "Rozšíři_t"
 
-#: modules/tools/maskedit.c:608
+#: modules/tools/maskedit.c:614
 msgid "Shrin_k"
 msgstr "_Zúžit"
 
-#: modules/tools/maskedit.c:623
+#: modules/tools/maskedit.c:629
 msgid "_Amount:"
 msgstr "_Míra:"
 
-#: modules/tools/maskedit.c:651
+#: modules/tools/maskedit.c:657
 msgid "_Prevent grain merging by growing"
 msgstr "_Zabránit spojení zrn při rozšíření"
 
@@ -13692,83 +14405,95 @@ msgstr "Vyrovnání podle čar"
 msgid "Level rows using intersections with given lines"
 msgstr "Vyrovnat řádky podle průsečíků se zvolenými čárami"
 
-#: modules/tools/profile.c:222
+#: modules/tools/profile.c:216
 msgid "Profile tool, creates profile graphs from selected lines."
 msgstr "Nástroj profil, vytváří grafy profilů z vybraných úseček."
 
-#: modules/tools/profile.c:276 modules/tools/profile.c:630
+#: modules/tools/profile.c:270 modules/tools/profile.c:609
 msgid "Profiles"
 msgstr "Profily"
 
-#: modules/tools/profile.c:277
+#: modules/tools/profile.c:271
 msgid "Extract profiles"
 msgstr "Získat profily"
 
-#: modules/tools/profile.c:480
-msgid "_Radial profiles"
-msgstr "_Radiální profily"
-
-#: modules/tools/profile.c:493
-msgid "Symmetrize _All"
-msgstr "Symetrizovat _vše"
+#: modules/tools/profile.c:478
+msgid "Linear profiles"
+msgstr "Lineární profily"
 
-#: modules/tools/profile.c:498
-msgid "S_ymmetrize"
-msgstr "S_ymetrizovat"
+#: modules/tools/profile.c:480
+msgid "Radial profiles"
+msgstr "Radiální profily"
 
-#: modules/tools/profile.c:542
+#: modules/tools/profile.c:537
 msgid "_Separate profiles"
 msgstr "_Oddělit profily"
 
-#: modules/tools/profile.c:607
+#: modules/tools/profile.c:587
 msgid "_Calibration data:"
 msgstr "Kalibrační data:"
 
-#: modules/tools/profile.c:620
+#: modules/tools/profile.c:600
 msgid "_Show profile"
 msgstr "_Zobrazit profil"
 
-#: modules/tools/profile.c:887
+#: modules/tools/profile.c:861
 #, c-format
 msgid "X error %d"
 msgstr "Chyba X %d"
 
-#: modules/tools/profile.c:891
+#: modules/tools/profile.c:865
 #, c-format
 msgid "Y error %d"
 msgstr "Chyba Y %d"
 
-#: modules/tools/profile.c:895
+#: modules/tools/profile.c:869
 #, c-format
 msgid "Z error %d"
 msgstr "Chyba Z %d"
 
-#: modules/tools/profile.c:899
+#: modules/tools/profile.c:873
 #, c-format
 msgid "X uncertainty %d"
 msgstr "Nejistota X %d"
 
-#: modules/tools/profile.c:903
+#: modules/tools/profile.c:877
 #, c-format
 msgid "Y uncertainty %d"
 msgstr "Nejistota Y %d"
 
-#: modules/tools/profile.c:907
+#: modules/tools/profile.c:881
 #, c-format
 msgid "Z uncertainty %d"
 msgstr "Nejistota z %d"
 
-#: modules/tools/profile.c:912
+#: modules/tools/profile.c:886
 #, c-format
 msgid "Zunc up bound %d"
 msgstr "Nejistota z do %d"
 
-#: modules/tools/profile.c:917
+#: modules/tools/profile.c:891
 #, c-format
 msgid "Zunc low bound %d"
 msgstr "Nejistota z od %d"
 
-#: modules/tools/profile.c:1817
+#: modules/tools/profile.c:1637
+msgid "S_ymmetrize"
+msgstr "S_ymetrizovat"
+
+#: modules/tools/profile.c:1639
+msgid "Symmetrize _All"
+msgstr "Symetrizovat _vše"
+
+#: modules/tools/profile.c:1643
+msgid "Improve _Direction"
+msgstr "Zlepšit směr"
+
+#: modules/tools/profile.c:1645
+msgid "Improve _All"
+msgstr "Zlepšit všechny"
+
+#: modules/tools/profile.c:1866
 msgid "calib-data|None"
 msgstr "Žádná"
 
@@ -13784,194 +14509,194 @@ msgstr "Čtení hodnot"
 msgid "Read value under mouse cursor"
 msgstr "Čtení hodnot pod kursorem myši"
 
-#: modules/tools/readvalue.c:304
+#: modules/tools/readvalue.c:307
 msgid "Set _Zero"
 msgstr "Nastavit _nulu"
 
-#: modules/tools/readvalue.c:307
+#: modules/tools/readvalue.c:310
 msgid "Shift plane z=0 to pass through the selected point"
 msgstr "Posunout rovinu z=0, aby procházela vybraným bodem"
 
-#: modules/tools/readvalue.c:315
+#: modules/tools/readvalue.c:318
 msgid "Facet"
 msgstr "Faseta"
 
-#: modules/tools/readvalue.c:340
+#: modules/tools/readvalue.c:343
 msgid "Curvatures"
 msgstr "Křivosti"
 
-#: modules/tools/readvalue.c:382
+#: modules/tools/readvalue.c:386
 msgid "Show _selection"
 msgstr "Zobrazovat _výběr"
 
-#: modules/tools/roughness.c:282
+#: modules/tools/roughness.c:283
 msgid "Roughness average"
 msgstr "Střední drsnost"
 
-#: modules/tools/roughness.c:290
+#: modules/tools/roughness.c:291
 msgid "Root mean square roughness"
 msgstr "Střední kvadratická drsnost"
 
-#: modules/tools/roughness.c:298
+#: modules/tools/roughness.c:299
 msgid "Maximum height of the roughness"
 msgstr "Největší výška drsnosti"
 
-#: modules/tools/roughness.c:306
+#: modules/tools/roughness.c:307
 msgid "Maximum roughness valley depth"
 msgstr "Největší hloubka drsnosti"
 
-#: modules/tools/roughness.c:314
+#: modules/tools/roughness.c:315
 msgid "Maximum roughness peak height"
 msgstr "Největší výchylka drsnosti"
 
-#: modules/tools/roughness.c:322 modules/tools/roughness.c:370
+#: modules/tools/roughness.c:323 modules/tools/roughness.c:371
 msgid "Average maximum height of the roughness"
 msgstr "Střední největší výška drsnosti"
 
-#: modules/tools/roughness.c:330
+#: modules/tools/roughness.c:331
 msgid "Average maximum roughness valley depth"
 msgstr "Střední největší hloubka drsnosti"
 
-#: modules/tools/roughness.c:338
+#: modules/tools/roughness.c:339
 msgid "Average maximum roughness peak height"
 msgstr "Střední největší výchylka drsnosti"
 
-#: modules/tools/roughness.c:346 modules/tools/roughness.c:354
+#: modules/tools/roughness.c:347 modules/tools/roughness.c:355
 msgid "Average third highest peak to third lowest valley height"
 msgstr "Střední výška třetí největší výchylky oproti třetí největší hloubce"
 
-#: modules/tools/roughness.c:362
+#: modules/tools/roughness.c:363
 msgid "Average maximum height of the profile"
 msgstr "Střední největší výška profilu"
 
-#: modules/tools/roughness.c:378
+#: modules/tools/roughness.c:379
 msgid "Skewness"
 msgstr "Šikmost"
 
-#: modules/tools/roughness.c:394
+#: modules/tools/roughness.c:395
 msgid "Waviness average"
 msgstr "Střední zvlněnost"
 
-#: modules/tools/roughness.c:402
+#: modules/tools/roughness.c:403
 msgid "Root mean square waviness"
 msgstr "Střední kvadratická zvlněnost"
 
-#: modules/tools/roughness.c:410
+#: modules/tools/roughness.c:411
 msgid "Waviness maximum height"
 msgstr "Největší výška zvlněnosti"
 
-#: modules/tools/roughness.c:418
+#: modules/tools/roughness.c:419
 msgid "Maximum height of the profile"
 msgstr "Největší výška profilu"
 
-#: modules/tools/roughness.c:426
+#: modules/tools/roughness.c:427
 msgid "Spatial"
 msgstr "Prostorové"
 
-#: modules/tools/roughness.c:476
+#: modules/tools/roughness.c:477
 msgid "Average wavelength of the profile"
 msgstr "Střední vlnová délka profilu"
 
-#: modules/tools/roughness.c:484
+#: modules/tools/roughness.c:485
 msgid "Root mean square (RMS) wavelength of the profile"
 msgstr "Střední kvadratická vlnová délka profilu"
 
-#: modules/tools/roughness.c:492
+#: modules/tools/roughness.c:493
 msgid "Hybrid"
 msgstr "Hybridní"
 
-#: modules/tools/roughness.c:500
+#: modules/tools/roughness.c:501
 msgid "Average absolute slope"
 msgstr "Střední absolutní sklon"
 
-#: modules/tools/roughness.c:508
+#: modules/tools/roughness.c:509
 msgid "Root mean square (RMS) slope"
 msgstr "Střední kvadratický sklon"
 
-#: modules/tools/roughness.c:524
+#: modules/tools/roughness.c:525
 msgid "Developed profile length"
 msgstr "Rozvinutá délka profilu"
 
-#: modules/tools/roughness.c:532
+#: modules/tools/roughness.c:533
 msgid "Profile length ratio"
 msgstr "Délkový poměr profilu"
 
-#: modules/tools/roughness.c:615
+#: modules/tools/roughness.c:616
 msgid "Calculate surface profile parameters."
 msgstr "Počítá parametry drsnosti profilu."
 
-#: modules/tools/roughness.c:648 modules/tools/roughness.c:773
-#: modules/tools/roughness.c:1452
+#: modules/tools/roughness.c:649 modules/tools/roughness.c:774
+#: modules/tools/roughness.c:1479
 msgid "Roughness"
 msgstr "Drsnost"
 
-#: modules/tools/roughness.c:649
+#: modules/tools/roughness.c:650
 msgid "Calculate roughness parameters"
 msgstr "Vypočíst parametry drsnosti"
 
-#: modules/tools/roughness.c:771 modules/tools/roughness.c:1450
+#: modules/tools/roughness.c:772 modules/tools/roughness.c:1477
 msgid "Texture"
 msgstr "Textura"
 
-#: modules/tools/roughness.c:772 modules/tools/roughness.c:1451
+#: modules/tools/roughness.c:773 modules/tools/roughness.c:1478
 msgid "Waviness"
 msgstr "Zvlnění"
 
-#: modules/tools/roughness.c:774
+#: modules/tools/roughness.c:775
 msgid "ADF"
 msgstr "ADF"
 
-#: modules/tools/roughness.c:775
+#: modules/tools/roughness.c:776
 msgid "BRC"
 msgstr "BRC"
 
-#: modules/tools/roughness.c:776 modules/tools/roughness.c:1455
+#: modules/tools/roughness.c:777 modules/tools/roughness.c:1482
 msgid "Peak Count"
 msgstr "Počet peaků"
 
-#: modules/tools/roughness.c:838 modules/xyz/xyz_drift.c:1090
+#: modules/tools/roughness.c:839 modules/xyz/xyz_drift.c:1090
 msgid "_Graph:"
 msgstr "_Graf:"
 
-#: modules/tools/roughness.c:845
+#: modules/tools/roughness.c:847
 msgid "C_ut-off:"
 msgstr "_Uříznutí:"
 
-#: modules/tools/roughness.c:1324
+#: modules/tools/roughness.c:1345
 msgid "No profile selected."
 msgstr "Není vybrán žádný profil."
 
-#: modules/tools/roughness.c:1453
+#: modules/tools/roughness.c:1480
 msgid "Amplitude Distribution Function"
 msgstr "Funkce rozdělení amplitudy"
 
-#: modules/tools/roughness.c:1454
+#: modules/tools/roughness.c:1481
 msgid "The Bearing Ratio Curve"
 msgstr "Materiálová poměrná křivka"
 
-#: modules/tools/roughness.c:1489
+#: modules/tools/roughness.c:1516
 msgid "Surface Profiles"
 msgstr "Profily"
 
-#: modules/tools/roughness.c:1877
+#: modules/tools/roughness.c:1904
 msgid "Save Roughness Parameters"
 msgstr "Uložit parametry drsnosti"
 
-#: modules/tools/roughness.c:1934
+#: modules/tools/roughness.c:1961
 msgid "Roughness Parameters"
 msgstr "Parametry drsnosti"
 
-#: modules/tools/roughness.c:1940
+#: modules/tools/roughness.c:1967
 #, c-format
 msgid "File:              %s\n"
 msgstr "Soubor:              %s\n"
 
-#: modules/tools/roughness.c:1944
+#: modules/tools/roughness.c:1971
 #, c-format
 msgid "Data channel:      %s\n"
 msgstr "Datový kanál:        %s\n"
 
-#: modules/tools/roughness.c:1975
+#: modules/tools/roughness.c:2002
 #, c-format
 msgid ""
 "Selected line:     (%s, %s) to (%s, %s) px\n"
@@ -14008,7 +14733,7 @@ msgstr "do _všech souborů"
 msgid "_Copy"
 msgstr "_Kopírovat"
 
-#: modules/tools/sfunctions.c:181
+#: modules/tools/sfunctions.c:186
 msgid ""
 "Statistical function tool, calculates one-dimensional statistical functions "
 "(height distribution, correlations, PSDF, Minkowski functionals) of selected "
@@ -14018,87 +14743,91 @@ msgstr ""
 "(rozdělení výšek, korelace, spektrální hustotu, Minkowského funkcionály) "
 "vybrané části dat."
 
-#: modules/tools/sfunctions.c:214
+#: modules/tools/sfunctions.c:219
 msgid "Height distribution"
 msgstr "Rozdělení výšek"
 
-#: modules/tools/sfunctions.c:215
+#: modules/tools/sfunctions.c:220
 msgid "Cum. height distribution"
 msgstr "Kumul. rozdělení výšek"
 
-#: modules/tools/sfunctions.c:216
+#: modules/tools/sfunctions.c:221
 msgid "Distribution of angles"
 msgstr "Rozdělení úhlů"
 
-#: modules/tools/sfunctions.c:217
+#: modules/tools/sfunctions.c:222
 msgid "Cum. distribution of angles"
 msgstr "Kumul. rozdělení úhlů"
 
-#: modules/tools/sfunctions.c:218
+#: modules/tools/sfunctions.c:223
 msgid "ACF"
 msgstr "ACF"
 
-#: modules/tools/sfunctions.c:219
+#: modules/tools/sfunctions.c:224
 msgid "HHCF"
 msgstr "HHCF"
 
-#: modules/tools/sfunctions.c:220
+#: modules/tools/sfunctions.c:225
 msgid "PSDF"
 msgstr "PSDF"
 
-#: modules/tools/sfunctions.c:221
+#: modules/tools/sfunctions.c:226
 msgid "Radial PSDF"
 msgstr "Radiální PSDF"
 
-#: modules/tools/sfunctions.c:222
+#: modules/tools/sfunctions.c:227
 msgid "Radial ACF"
 msgstr "Radiální ACF"
 
-#: modules/tools/sfunctions.c:223
+#: modules/tools/sfunctions.c:228
 msgid "Minkowski volume"
 msgstr "Minkovského objem"
 
-#: modules/tools/sfunctions.c:224
+#: modules/tools/sfunctions.c:229
 msgid "Minkowski boundary"
 msgstr "Minkovského hranice"
 
-#: modules/tools/sfunctions.c:225
+#: modules/tools/sfunctions.c:230
 msgid "Minkowski connectivity"
 msgstr "Minkovského spojitost"
 
-#: modules/tools/sfunctions.c:251
+#: modules/tools/sfunctions.c:232
+msgid "Area scale graph"
+msgstr "Graf škálování plochy"
+
+#: modules/tools/sfunctions.c:257
 msgid "Statistical Functions"
 msgstr "Statistické funkce"
 
-#: modules/tools/sfunctions.c:252
+#: modules/tools/sfunctions.c:258
 msgid "Calculate 1D statistical functions"
 msgstr "Výpočet jednorozměrných statistických funkcí"
 
-#: modules/tools/sfunctions.c:504
+#: modules/tools/sfunctions.c:501
 msgid "_Separate uncertainty"
 msgstr "_Oddělit nejistotu"
 
-#: modules/tools/spectro.c:151
+#: modules/tools/spectro.c:154
 msgid "Point Spectrum, extracts point spectra to a graph."
 msgstr "Bodové spektrum, extrahuje bodová spektra do grafu."
 
-#: modules/tools/spectro.c:190
+#: modules/tools/spectro.c:193
 msgid "Point Spectroscopy"
 msgstr "Bodová spektroskopie"
 
-#: modules/tools/spectro.c:191
+#: modules/tools/spectro.c:194
 msgid "Extract and view point spectroscopy data"
 msgstr "Extrahuje a zobrazuje data bodové spektroskopie"
 
-#: modules/tools/spectro.c:359
+#: modules/tools/spectro.c:362
 msgid "_Separate spectra"
 msgstr "_Oddělit spektra"
 
-#: modules/tools/spectro.c:369
+#: modules/tools/spectro.c:372
 msgid "_Average spectra"
 msgstr "_Průměrovat spektra"
 
-#: modules/tools/spectro.c:508
+#: modules/tools/spectro.c:511
 msgid "Spectroscopy"
 msgstr "Spektroskopie"
 
@@ -14138,14 +14867,6 @@ msgstr "Není vybrán žádný bod obrázku."
 msgid "No area in the zoom selected."
 msgstr "Není vybrána žádná oblast ve výřezu."
 
-#: modules/tools/stats.c:205
-msgid "Average value:"
-msgstr "Střední hodnota:"
-
-#: modules/tools/stats.c:206
-msgid "Median:"
-msgstr "Medián:"
-
 #: modules/tools/stats.c:207
 msgid "Ra (Sa):"
 msgstr "Ra (Sa):"
@@ -14158,14 +14879,6 @@ msgstr "Rms (Sq):"
 msgid "Rms (grain-wise):"
 msgstr "Rms (po zrnech):"
 
-#: modules/tools/stats.c:210
-msgid "Skew:"
-msgstr "Šikmost:"
-
-#: modules/tools/stats.c:211
-msgid "Kurtosis:"
-msgstr "Špičatost:"
-
 #: modules/tools/stats.c:212
 msgid "Surface area:"
 msgstr "Plocha povrchu:"
@@ -14174,10 +14887,6 @@ msgstr "Plocha povrchu:"
 msgid "Projected area:"
 msgstr "Projektovaná plocha:"
 
-#: modules/tools/stats.c:214
-msgid "Variation:"
-msgstr "Variace:"
-
 #: modules/tools/stats.c:217
 msgid "Inclination θ:"
 msgstr "θ sklonu:"
@@ -14190,7 +14899,7 @@ msgstr "φ sklonu:"
 msgid "Statistics tool."
 msgstr "Statistický nástroj."
 
-#: modules/tools/stats.c:261 modules/tools/stats.c:1095
+#: modules/tools/stats.c:261 modules/tools/stats.c:1091
 msgid "Statistical Quantities"
 msgstr "Statistické veličiny"
 
@@ -14198,29 +14907,29 @@ msgstr "Statistické veličiny"
 msgid "Statistical quantities"
 msgstr "Statistické veličiny"
 
-#: modules/tools/stats.c:1002
+#: modules/tools/stats.c:998
 msgid "Save Statistical Quantities"
 msgstr "Uložení statistických hodnot"
 
-#: modules/tools/stats.c:1100
+#: modules/tools/stats.c:1096
 #, c-format
 msgid "File:         %s\n"
 msgstr "Soubor:       %s\n"
 
-#: modules/tools/stats.c:1104
+#: modules/tools/stats.c:1100
 #, c-format
 msgid "Data channel: %s\n"
 msgstr "Datový kanál: %s\n"
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "Yes"
 msgstr "Ano"
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "No"
 msgstr "Ne"
 
-#: modules/tools/stats.c:1132
+#: modules/tools/stats.c:1128
 #, c-format
 msgid ""
 "Selected area: %s × %s at (%s, %s) px\n"
@@ -14243,182 +14952,178 @@ msgstr "/_Rozsah a jednotky..."
 msgid "Volume Dimensions and Units"
 msgstr "Objemový rozsah a jednotky"
 
-#: modules/volume/volume_calibrate.c:526
+#: modules/volume/volume_calibrate.c:486
 msgid "_Value range:"
 msgstr "Rozsah _hodnot:"
 
-#: modules/volume/volume_calibrate.c:555
+#: modules/volume/volume_calibrate.c:508
 msgid "Value shi_ft:"
 msgstr "_Posun hodnot:"
 
-#: modules/volume/volume_calibrate.c:601
+#: modules/volume/volume_calibrate.c:542
 msgid "_Value calibration factor:"
 msgstr "_Kalibrační faktor hodnot:"
 
-#: modules/volume/volume_extract.c:223
+#: modules/volume/volume_extract.c:216
 msgid "Shows and/or extracts a section of volume data"
 msgstr "Zobrazuje anebo extrahuje řez objemových dat"
 
-#: modules/volume/volume_extract.c:237
-msgid "/Show and _extract..."
+#: modules/volume/volume_extract.c:230
+msgid "/Show and _Extract..."
 msgstr "/Zobrazit a _extrahovat..."
 
-#: modules/volume/volume_extract.c:241
+#: modules/volume/volume_extract.c:234
 msgid "Show and/or extract a section of volume data"
 msgstr "Zobrazit anebo extrahovat řez objemových dat"
 
-#: modules/volume/volume_extract.c:270
+#: modules/volume/volume_extract.c:263
 msgid "X cross-section"
 msgstr "X řez"
 
-#: modules/volume/volume_extract.c:271
+#: modules/volume/volume_extract.c:264
 msgid "Y cross-section"
 msgstr "Y řez"
 
-#: modules/volume/volume_extract.c:272
+#: modules/volume/volume_extract.c:265
 msgid "Z cross-section"
 msgstr "Z řez"
 
-#: modules/volume/volume_extract.c:273 modules/volume/volume_extract.c:698
+#: modules/volume/volume_extract.c:266 modules/volume/volume_extract.c:684
 msgid "X direction sum"
 msgstr "Součet ve směru X"
 
-#: modules/volume/volume_extract.c:274 modules/volume/volume_extract.c:700
+#: modules/volume/volume_extract.c:267 modules/volume/volume_extract.c:686
 msgid "Y direction sum"
 msgstr "Součet ve směru Y"
 
-#: modules/volume/volume_extract.c:275 modules/volume/volume_extract.c:702
+#: modules/volume/volume_extract.c:268 modules/volume/volume_extract.c:688
 msgid "Z direction sum"
 msgstr "Součet ve směru Z"
 
-#: modules/volume/volume_extract.c:278
+#: modules/volume/volume_extract.c:271
 msgid "X direction"
 msgstr "Směr X"
 
-#: modules/volume/volume_extract.c:279
+#: modules/volume/volume_extract.c:272
 msgid "Y direction"
 msgstr "Směr Y"
 
-#: modules/volume/volume_extract.c:280
+#: modules/volume/volume_extract.c:273
 msgid "Z direction"
 msgstr "Směr Z"
 
-#: modules/volume/volume_extract.c:322
+#: modules/volume/volume_extract.c:315
 msgid "Volume data"
 msgstr "Objemová data"
 
-#: modules/volume/volume_extract.c:324
+#: modules/volume/volume_extract.c:317
 msgid "_Load"
 msgstr "_Načíst"
 
-#: modules/volume/volume_extract.c:336
+#: modules/volume/volume_extract.c:329
 msgid "_Extract projection"
 msgstr "_Extrahovat projekci"
 
-#: modules/volume/volume_extract.c:354
+#: modules/volume/volume_extract.c:347
 msgid "Projections"
 msgstr "Projekce"
 
-#: modules/volume/volume_extract.c:404
+#: modules/volume/volume_extract.c:395
 msgid "Z position"
 msgstr "Z poloha"
 
-#: modules/volume/volume_extract.c:409
+#: modules/volume/volume_extract.c:405
 msgid "Shown cut direction:"
 msgstr "Směr řezu:"
 
-#: modules/volume/volume_extract.c:419 modules/volume/volume_extract.c:500
-msgid "Show mode:"
-msgstr "_Ukázat rámeček"
-
-#: modules/volume/volume_extract.c:490
+#: modules/volume/volume_extract.c:485
 msgid "Graph cut direction:"
 msgstr "Směr řezu grafu:"
 
-#: modules/volume/volume_extract.c:525
+#: modules/volume/volume_extract.c:511
 msgid "3D view"
 msgstr "3D pohled"
 
-#: modules/volume/volume_extract.c:550
+#: modules/volume/volume_extract.c:538
 msgid "Zoom"
 msgstr "Zvětšení"
 
-#: modules/volume/volume_extract.c:558
+#: modules/volume/volume_extract.c:545
 msgid "Wireframe threshold"
 msgstr "_Práh drátového modelu"
 
-#: modules/volume/volume_extract.c:566
+#: modules/volume/volume_extract.c:552
 msgid "Z scale"
 msgstr "Š_kála Z"
 
-#: modules/volume/volume_extract.c:574
+#: modules/volume/volume_extract.c:559
 msgid "Opacity scale"
 msgstr "Škála o_pacity"
 
-#: modules/volume/volume_extract.c:580
-msgid "apply perspective"
-msgstr "perspektivní zobrazení"
+#: modules/volume/volume_extract.c:565
+msgid "Apply perspective"
+msgstr "Perspektivní zobrazení"
 
-#: modules/volume/volume_extract.c:589
-msgid "instant 3D render"
-msgstr "okamžité vykreslení 3D"
+#: modules/volume/volume_extract.c:574
+msgid "Instant 3D render"
+msgstr "Okamžité vykreslení 3D"
 
-#: modules/volume/volume_extract.c:598
+#: modules/volume/volume_extract.c:587
 msgid "X view"
 msgstr "X pohled"
 
-#: modules/volume/volume_extract.c:604
+#: modules/volume/volume_extract.c:592
 msgid "Y view"
 msgstr "Y pohled"
 
-#: modules/volume/volume_extract.c:610
+#: modules/volume/volume_extract.c:597
 msgid "Z view"
 msgstr "Z pohled"
 
-#: modules/volume/volume_extract.c:683
+#: modules/volume/volume_extract.c:669
 #, c-format
 msgid "X cross-section at x: %d"
 msgstr "X-řez v poloze x: %d"
 
-#: modules/volume/volume_extract.c:686
+#: modules/volume/volume_extract.c:672
 #, c-format
 msgid "Y cross-section at y: %d"
 msgstr "Y-řez v poloze y: %d"
 
-#: modules/volume/volume_extract.c:690
+#: modules/volume/volume_extract.c:676
 #, c-format
 msgid "Z cross-section at Z = %g %s (#%d)"
 msgstr "Z-řez v poloze Z = %g %s (#%d)"
 
-#: modules/volume/volume_extract.c:749 modules/volume/volume_slice.c:1264
+#: modules/volume/volume_extract.c:735 modules/volume/volume_slice.c:1278
 #, c-format
 msgid "X graph at y: %d z: %d"
 msgstr "X graf v poloze: y: %d z: %d"
 
-#: modules/volume/volume_extract.c:752 modules/volume/volume_slice.c:1273
+#: modules/volume/volume_extract.c:738 modules/volume/volume_slice.c:1287
 #, c-format
 msgid "Y graph at x: %d z: %d"
 msgstr "Y graf v poloze x: %d z: %d"
 
-#: modules/volume/volume_extract.c:755 modules/volume/volume_slice.c:1255
+#: modules/volume/volume_extract.c:741 modules/volume/volume_slice.c:1269
 #, c-format
 msgid "Z graph at x: %d y: %d"
 msgstr "Z graf v poloze x: %d y: %d"
 
-#: modules/volume/volume_extract.c:776
+#: modules/volume/volume_extract.c:762
 msgid "Brick graph"
 msgstr "Graf z kvádru"
 
-#: modules/volume/volume_extract.c:1056
+#: modules/volume/volume_extract.c:1042
 msgid "Load volume data"
 msgstr "Načíst objemová data"
 
-#: modules/volume/volume_extract.c:1218
+#: modules/volume/volume_extract.c:1204
 #, c-format
 msgid "Shown range %g to %g"
 msgstr "Zobrazený rozsah %g až %g"
 
-#: modules/volume/volume_extract.c:1911
+#: modules/volume/volume_extract.c:1897
 msgid "Building wireframe model..."
 msgstr "Vytváření drátového modelu..."
 
@@ -14427,97 +15132,97 @@ msgid "Evaluate volume force-distance data"
 msgstr "Vyhodnocuje objemová F-D data."
 
 #: modules/volume/volume_fdfit.c:213
-msgid "/_Evaluate FD data..."
+msgid "/_Evaluate FD Data..."
 msgstr "/_Vyhodnotit FD data..."
 
 #: modules/volume/volume_fdfit.c:217
 msgid "Evaluate force-distance volume data"
 msgstr "Vyhodnotit objemová F-D data"
 
-#: modules/volume/volume_fdfit.c:368
+#: modules/volume/volume_fdfit.c:371
 msgid "Curve _X position:"
 msgstr "X-souřadnice křivky"
 
-#: modules/volume/volume_fdfit.c:386
+#: modules/volume/volume_fdfit.c:380
 msgid "Curve _Y position:"
 msgstr "Y-souřadnice křivky"
 
-#: modules/volume/volume_fdfit.c:535
+#: modules/volume/volume_fdfit.c:511
 msgid "e_stimate"
 msgstr "od_hadovat"
 
-#: modules/volume/volume_invert.c:51
+#: modules/volume/volume_invert.c:39 modules/volume/volumeops.c:39
 msgid "Inverts value in volume data"
 msgstr "Převrací hodnoty v objemových datech"
 
-#: modules/volume/volume_invert.c:65
-msgid "/_Invert value"
+#: modules/volume/volume_invert.c:53
+msgid "/_Invert Value"
 msgstr "/_Inverze hodnoty"
 
-#: modules/volume/volume_invert.c:69
+#: modules/volume/volume_invert.c:57
 msgid "Invert value in volume data"
 msgstr "Převrátit hodnoty kolem průměru"
 
-#: modules/volume/volume_kmeans.c:94
+#: modules/volume/volume_kmeans.c:95
 msgid "Calculates K-means clustering on volume data."
 msgstr "Počítá K-means shlukování objemových dat."
 
-#: modules/volume/volume_kmeans.c:108
-msgid "/_K-means clustering..."
+#: modules/volume/volume_kmeans.c:109
+msgid "/_K-Means Clustering..."
 msgstr "/_K-means shlukování..."
 
-#: modules/volume/volume_kmeans.c:112
+#: modules/volume/volume_kmeans.c:113
 msgid "Calculate K-means clustering on volume data"
 msgstr "Vypočítat K-means shlukování objemových dat"
 
-#: modules/volume/volume_kmeans.c:151
+#: modules/volume/volume_kmeans.c:152
 msgid "K-means"
 msgstr "K-means"
 
-#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:164
+#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:163
 msgid "_Number of clusters:"
 msgstr "Počet _shluků:"
 
-#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:171
+#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:170
 msgid "Convergence _precision digits:"
 msgstr "_Přesnost konvergence (číslice):"
 
-#: modules/volume/volume_kmeans.c:184 modules/volume/volume_kmedians.c:178
+#: modules/volume/volume_kmeans.c:183 modules/volume/volume_kmedians.c:176
 msgid "_Max. iterations:"
 msgstr "_Počet iterací:"
 
-#: modules/volume/volume_kmeans.c:189 modules/volume/volume_kmedians.c:183
+#: modules/volume/volume_kmeans.c:187 modules/volume/volume_kmedians.c:181
 msgid "_Normalize"
 msgstr "_Normálizovat"
 
-#: modules/volume/volume_kmeans.c:195
+#: modules/volume/volume_kmeans.c:193
 msgid "_Remove outliers"
 msgstr "O_dstranit vybočující hodnoty"
 
-#: modules/volume/volume_kmeans.c:208
+#: modules/volume/volume_kmeans.c:202
 msgid "Outliers _threshold:"
 msgstr "_Práh pro vybočující hodnoty:"
 
-#: modules/volume/volume_kmeans.c:431
+#: modules/volume/volume_kmeans.c:425
 msgid "K-means iteration..."
 msgstr "K-means iterace..."
 
-#: modules/volume/volume_kmeans.c:651
+#: modules/volume/volume_kmeans.c:645
 #, c-format
 msgid "K-means cluster of %s"
 msgstr "K-means shluk z %s"
 
-#: modules/volume/volume_kmeans.c:660
+#: modules/volume/volume_kmeans.c:654
 #, c-format
 msgid "K-means error of %s"
 msgstr "K-means chyba z %s"
 
-#: modules/volume/volume_kmeans.c:670 modules/volume/volume_kmedians.c:514
+#: modules/volume/volume_kmeans.c:664 modules/volume/volume_kmedians.c:512
 #, c-format
 msgid "Pre-normalized intensity of %s"
 msgstr "Před-normalizovaná intenzita %s"
 
-#: modules/volume/volume_kmeans.c:702
+#: modules/volume/volume_kmeans.c:696
 #, c-format
 msgid "K-means center %d"
 msgstr "K-means střed %d"
@@ -14527,7 +15232,7 @@ msgid "Calculates K-medians clustering on volume data."
 msgstr "Počítá K-mediánové shlukování objemových dat."
 
 #: modules/volume/volume_kmedians.c:102
-msgid "/_K-medians clustering..."
+msgid "/_K-Medians Clustering..."
 msgstr "/_K-mediánové shlukování..."
 
 #: modules/volume/volume_kmedians.c:106
@@ -14538,46 +15243,46 @@ msgstr "Vypočítat K-mediánové shlukování objemových dat"
 msgid "K-Medians"
 msgstr "K-mediány"
 
-#: modules/volume/volume_kmedians.c:392
+#: modules/volume/volume_kmedians.c:390
 msgid "K-medians iteration..."
 msgstr "K-mediánové iterace..."
 
-#: modules/volume/volume_kmedians.c:495
+#: modules/volume/volume_kmedians.c:493
 #, c-format
 msgid "K-medians cluster of %s"
 msgstr "K-means shluk z %s"
 
-#: modules/volume/volume_kmedians.c:504
+#: modules/volume/volume_kmedians.c:502
 #, c-format
 msgid "K-medians error of %s"
 msgstr "K-means chyba z %s"
 
-#: modules/volume/volume_kmedians.c:546
+#: modules/volume/volume_kmedians.c:544
 #, c-format
 msgid "K-medians center %d"
 msgstr "K-means střed %d"
 
-#: modules/volume/volume_linestat.c:171
+#: modules/volume/volume_linestat.c:173
 msgid "Summarizes profiles of volume data to a channel."
 msgstr "Charakterizuje profily objemových dat do kanálu."
 
-#: modules/volume/volume_linestat.c:185
+#: modules/volume/volume_linestat.c:187
 msgid "/Summarize _Profiles..."
 msgstr "/Sumarizovat _profily..."
 
-#: modules/volume/volume_linestat.c:189
+#: modules/volume/volume_linestat.c:191
 msgid "Summarize profiles"
 msgstr "Sumarizovat profily"
 
-#: modules/volume/volume_linestat.c:249
+#: modules/volume/volume_linestat.c:251
 msgid "_Extract image"
 msgstr "Vytvořit o_brázek"
 
-#: modules/volume/volume_linestat.c:250
+#: modules/volume/volume_linestat.c:252
 msgid "Set _preview"
 msgstr "_Nastavit náhled"
 
-#: modules/volume/volume_linestat.c:284
+#: modules/volume/volume_linestat.c:289
 msgid "Summarize Volume Profiles"
 msgstr "Sumarizovat profily objemových dat"
 
@@ -14601,53 +15306,113 @@ msgstr "Obrazový řez"
 msgid "Line graph"
 msgstr "Graf podél osy"
 
-#: modules/volume/volume_slice.c:290
+#: modules/volume/volume_slice.c:292
 msgid "Slice Volume Data"
 msgstr "Řez objemových dat"
 
-#: modules/volume/volume_slice.c:369
+#: modules/volume/volume_slice.c:371
 msgid "_Base plane:"
 msgstr "_Základní rovina:"
 
-#: modules/volume/volume_slice.c:420
+#: modules/volume/volume_slice.c:422
 msgid "Extract _multiple items"
 msgstr "_Získat několik objektů současně"
 
-#: modules/volume/volume_slice.c:437
+#: modules/volume/volume_slice.c:439
 msgid "Positions"
 msgstr "Polohy"
 
-#: modules/volume/volume_slice.c:484
+#: modules/volume/volume_slice.c:492
 msgid "_Z:"
 msgstr "_Z:"
 
-#: modules/volume/volume_slice.c:1156
+#: modules/volume/volume_slice.c:1167
 #, c-format
 msgid "Z slice at %.*f%s%s (#%d)"
 msgstr "Z-řez v %.*f%s%s (#%d)"
 
-#: modules/volume/volume_slice.c:1167
+#: modules/volume/volume_slice.c:1178
 #, c-format
 msgid "Y slice at %.*f%s%s (#%d)"
 msgstr "Y-řez v %.*f%s%s (#%d)"
 
-#: modules/volume/volume_slice.c:1178
+#: modules/volume/volume_slice.c:1189
 #, c-format
 msgid "X slice at %.*f%s%s (#%d)"
 msgstr "X-řez v %.*f%s%s (#%d)"
 
-#: modules/volume/volume_slice.c:1307
+#: modules/volume/volume_slice.c:1325
 msgid "Volume Z graphs"
 msgstr "Z-grafy z objemových dat"
 
-#: modules/volume/volume_slice.c:1314
+#: modules/volume/volume_slice.c:1332
 msgid "Volume X graphs"
 msgstr "X-grafy z objemových dat"
 
-#: modules/volume/volume_slice.c:1321
+#: modules/volume/volume_slice.c:1339
 msgid "Volume Y graphs"
 msgstr "Y-grafy z objemových dat"
 
+#: modules/volume/volume_swaxes.c:104
+msgid "Swaps axes of volume data."
+msgstr "Prohazuje osy v objemových datech"
+
+#: modules/volume/volume_swaxes.c:118
+msgid "/S_wap axes..."
+msgstr "/Změnit _osy..."
+
+#: modules/volume/volume_swaxes.c:122
+msgid "Swap axes"
+msgstr "Změnit osy"
+
+#: modules/volume/volume_swaxes.c:156
+msgid "X"
+msgstr "X"
+
+#: modules/volume/volume_swaxes.c:157
+msgid "X, reversed"
+msgstr "X, obrácená"
+
+#: modules/volume/volume_swaxes.c:158
+msgid "Y"
+msgstr "Y"
+
+#: modules/volume/volume_swaxes.c:159
+msgid "Y, reversed"
+msgstr "Y, obrácená"
+
+#: modules/volume/volume_swaxes.c:160
+msgid "Z"
+msgstr "Z"
+
+#: modules/volume/volume_swaxes.c:161
+msgid "Z, reversed"
+msgstr "Z, obrácená"
+
+#: modules/volume/volume_swaxes.c:175
+msgid "Swap Volume Axes"
+msgstr "Vyměnit osy objemových dat"
+
+#: modules/volume/volume_swaxes.c:196
+msgid "Current _X axis will become:"
+msgstr "Současná osa _X se stane:"
+
+#: modules/volume/volume_swaxes.c:204
+msgid "Current _Y axis will become:"
+msgstr "Současná osa _Y se stane:"
+
+#: modules/volume/volume_swaxes.c:212
+msgid "Current _Z axis will become:"
+msgstr "Současná osa _Z se stane:"
+
+#: modules/volume/volume_swaxes.c:219
+msgid "Create new volume data"
+msgstr "Vytvořit nová objemová data"
+
+#: modules/volume/volume_swaxes.c:286
+msgid "Z axis calibration will be lost."
+msgstr "Kalibrace osy Z bude ztracena."
+
 #: modules/volume/volume_zcal.c:104
 msgid "Attaches, extracts and removes volume data z-axis calibration."
 msgstr "Připojuje, extrahuje a odstraňuje kalibraci osy z objemových dat."
@@ -14717,6 +15482,14 @@ msgstr ""
 "Počet hodnot v souboru %d\n"
 "se liší od počtu rovin %d."
 
+#: modules/volume/volumeops.c:53
+msgid "/Extract _Preview"
+msgstr "/Extrahovat _náhled"
+
+#: modules/volume/volumeops.c:57
+msgid "Extract volume data preview to an image"
+msgstr "Extrahovat náhled objemových dat do obrázku"
+
 #: modules/xyz/xyz_drift.c:267
 msgid "Analyzes drift in XYZ data."
 msgstr "Analyzuje drift v XYZ datech."
@@ -14761,7 +15534,7 @@ msgstr "drift podél z"
 msgid "Analyze XYZ Drift"
 msgstr "Analyzovat XYZ drift"
 
-#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:391
+#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:406
 msgid "Reset Ran_ges"
 msgstr "Resetovat roz_sahy"
 
@@ -14769,11 +15542,11 @@ msgstr "Resetovat roz_sahy"
 msgid "_Guess parameters"
 msgstr "O_dhadnout parametry"
 
-#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:570
+#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:539
 msgid "_X-range:"
 msgstr "_X-ový rozsah:"
 
-#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:592
+#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:561
 msgid "_Y-range:"
 msgstr "_Y-ový rozsah:"
 
@@ -14851,7 +15624,7 @@ msgstr "Nebyli nalezeni žádní sousedé"
 msgid "Fitting in progress..."
 msgstr "Probíhá fitování..."
 
-#: modules/xyz/xyz_drift.c:2269 modules/xyz/xyz_raster.c:1012
+#: modules/xyz/xyz_drift.c:2264 modules/xyz/xyz_raster.c:981
 msgid "Physical dimensions are invalid."
 msgstr "Fyzické rozměry jsou neplatné."
 
@@ -14891,39 +15664,39 @@ msgstr "Vyrovnat _XYZ data"
 msgid "Update X and Y of _all compatible data"
 msgstr "Opravit X a Y _všech kompatibilních dat"
 
-#: modules/xyz/xyz_raster.c:197
+#: modules/xyz/xyz_raster.c:194
 msgid "Rasterizes XYZ data to images."
 msgstr "Rasterizuje XYZ data do obrázků."
 
-#: modules/xyz/xyz_raster.c:211
+#: modules/xyz/xyz_raster.c:208
 msgid "/_Rasterize..."
 msgstr "/_Rasterizovat..."
 
-#: modules/xyz/xyz_raster.c:215
+#: modules/xyz/xyz_raster.c:212
 msgid "Rasterize to image"
 msgstr "Rasterizovat do obrázku"
 
-#: modules/xyz/xyz_raster.c:340
+#: modules/xyz/xyz_raster.c:337
 msgid "Rasterize XYZ Data"
 msgstr "Rasterizovat XYZ data"
 
-#: modules/xyz/xyz_raster.c:354
+#: modules/xyz/xyz_raster.c:351
 msgid "Create Image _Directly"
 msgstr "Vytvořit obrázek přímo"
 
-#: modules/xyz/xyz_raster.c:360
+#: modules/xyz/xyz_raster.c:357
 msgid "XY points form a regular grid so interpolation is not necessary."
 msgstr "XY body tvoří pravidelnou mřížku, takže interpolace není nutná."
 
-#: modules/xyz/xyz_raster.c:381
+#: modules/xyz/xyz_raster.c:392
 msgid "Make Pixels S_quare"
 msgstr "Čtvercové pi_xely"
 
-#: modules/xyz/xyz_raster.c:642
+#: modules/xyz/xyz_raster.c:611
 msgid "Field"
 msgstr "Polní"
 
-#: modules/xyz/xyz_raster.c:956
+#: modules/xyz/xyz_raster.c:925
 #, c-format
 msgid ""
 "Number of points: %u\n"
@@ -14934,25 +15707,18 @@ msgstr ""
 "Sloučených coby příliš blízkých: %u\n"
 "Přidaných u hranic: %u"
 
-#: modules/xyz/xyz_raster.c:1091
+#: modules/xyz/xyz_raster.c:1065
 msgid ""
 "XYZ data regularization failed due to numerical instability or was "
 "interrupted."
 msgstr ""
 "Regularizace XYZ dat selhala kvůli numerické nestabilitě nebo byla přerušena."
 
-#~ msgid "Graph function written in Python"
-#~ msgstr "Grafová funkce napsaná v Pythonu"
-
-#~ msgid ""
-#~ "Pygwy plugin: %s (%s)\n"
-#~ "Export failed."
-#~ msgstr ""
-#~ "Pygwy plugin: %s (%s)\n"
-#~ "Export se nezdařil."
+#~ msgid "Re_fine"
+#~ msgstr "_Zpřesnit"
 
-#~ msgid "Borders extension..."
-#~ msgstr "Rozšiřuji okraje..."
+#~ msgid "Distribute"
+#~ msgstr "Rozkopírovat"
 
-#~ msgid "Laplace interpolation..."
-#~ msgstr "Laplaceovská interpolace..."
+#~ msgid "Replace"
+#~ msgstr "Nahradit"
diff --git a/po/de.gmo b/po/de.gmo
index babea86..a92e9aa 100644
Binary files a/po/de.gmo and b/po/de.gmo differ
diff --git a/po/de.po b/po/de.po
index d890110..88d6bbd 100644
--- a/po/de.po
+++ b/po/de.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gwyddion\n"
 "Report-Msgid-Bugs-To: yeti at gwyddion.net\n"
-"POT-Creation-Date: 2016-11-18 11:05+0100\n"
+"POT-Creation-Date: 2017-08-15 17:48+0200\n"
 "PO-Revision-Date: 2014-09-03 20:32+0100\n"
 "Last-Translator: Lennart Fricke <lennart at die-frickes.eu>\n"
 "Language-Team: deutsch <de at li.org>\n"
@@ -137,7 +137,8 @@ msgstr ""
 #: app/data-browser-aux.c:1480 app/data-browser.c:2280 app/data-browser.c:2887
 #: app/data-browser.c:3707 app/data-browser.c:3857 app/data-browser.c:4139
 #: app/data-browser.c:4504 app/data-browser.c:4590 app/data-browser.c:5016
-#: app/resource-editor.c:366 modules/process/convolution_filter.c:691
+#: app/resource-editor.c:366 modules/file/xyzexport.c:214
+#: modules/process/convolution_filter.c:691
 msgid "Untitled"
 msgstr "Unbenannt"
 
@@ -145,104 +146,112 @@ msgstr "Unbenannt"
 msgid "Initial residua evaluation..."
 msgstr ""
 
-#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1632
+#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1646
 #, fuzzy
 msgid "Fitting..."
 msgstr "FFT-Filterung"
 
-#: libgwyddion/gwynlfitpreset.c:1442 libprocess/gwyprocessenums.c:101
-#: libprocess/gwyshapefitpreset.c:347
+#: libgwyddion/gwynlfitpreset.c:1549 libprocess/gwyprocessenums.c:101
+#: libprocess/gwyshapefitpreset.c:347 modules/process/psf-fit.c:157
 msgid "Gaussian"
 msgstr "Gauß"
 
-#: libgwyddion/gwynlfitpreset.c:1457
+#: libgwyddion/gwynlfitpreset.c:1564
 #, fuzzy
 msgid "Gaussian (PSDF)"
 msgstr "Gauß (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1470
+#: libgwyddion/gwynlfitpreset.c:1577
 #, fuzzy
 msgid "Gaussian (ACF)"
 msgstr "Gauß (ACF)"
 
-#: libgwyddion/gwynlfitpreset.c:1483
+#: libgwyddion/gwynlfitpreset.c:1590
 #, fuzzy
 msgid "Gaussian (HHCF)"
 msgstr "Gauß (HHCF)"
 
-#: libgwyddion/gwynlfitpreset.c:1496
+#: libgwyddion/gwynlfitpreset.c:1603
 #, fuzzy
 msgid "Gaussian (RPSDF)"
 msgstr "Gauß (RPSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1509
+#: libgwyddion/gwynlfitpreset.c:1616
 #, fuzzy
 msgid "Two Gaussians (PSDF)"
 msgstr "Gauß (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1524 modules/xyz/xyz_drift.c:841
-#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1819
+#: libgwyddion/gwynlfitpreset.c:1631 modules/xyz/xyz_drift.c:841
+#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1818
 msgid "Exponential"
 msgstr "Exponentiell"
 
-#: libgwyddion/gwynlfitpreset.c:1536
+#: libgwyddion/gwynlfitpreset.c:1643
 msgid "Exponential (PSDF)"
 msgstr "Exponentiell (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1549
+#: libgwyddion/gwynlfitpreset.c:1656
 msgid "Exponential (ACF)"
 msgstr "Exponentiell (ACF)"
 
-#: libgwyddion/gwynlfitpreset.c:1561
+#: libgwyddion/gwynlfitpreset.c:1668
 msgid "Exponential (HHCF)"
 msgstr "Exponentiell (HHCF)"
 
-#: libgwyddion/gwynlfitpreset.c:1574
+#: libgwyddion/gwynlfitpreset.c:1681
 msgid "Exponential (RPSDF)"
 msgstr "Exponentiell (RPSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1588
+#: libgwyddion/gwynlfitpreset.c:1695
+msgid "K-correlated (PSDF)"
+msgstr ""
+
+#: libgwyddion/gwynlfitpreset.c:1709
 msgid "Polynomial (order 0)"
 msgstr "Polynomiell (0. Ordnung)"
 
-#: libgwyddion/gwynlfitpreset.c:1599 modules/xyz/xyz_drift.c:1805
+#: libgwyddion/gwynlfitpreset.c:1720 modules/xyz/xyz_drift.c:1804
 msgid "Polynomial (order 1)"
 msgstr "Polynomiell (1. Ordnung)"
 
-#: libgwyddion/gwynlfitpreset.c:1610
+#: libgwyddion/gwynlfitpreset.c:1731
 msgid "Polynomial (order 2)"
 msgstr "Polynomiell (2. Ordnung)"
 
-#: libgwyddion/gwynlfitpreset.c:1622
+#: libgwyddion/gwynlfitpreset.c:1743
 msgid "Polynomial (order 3)"
 msgstr "Polynomiell (3. Ordnung)"
 
-#: libgwyddion/gwynlfitpreset.c:1635
+#: libgwyddion/gwynlfitpreset.c:1756
 #, fuzzy
 msgid "Square wave"
 msgstr "Rechtecksignal"
 
-#: libgwyddion/gwynlfitpreset.c:1651
+#: libgwyddion/gwynlfitpreset.c:1772
 msgid "Parabolic step"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1667
+#: libgwyddion/gwynlfitpreset.c:1788
 msgid "Smooth slanted step"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1684
+#: libgwyddion/gwynlfitpreset.c:1805
 msgid "Smooth bent step"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1700
+#: libgwyddion/gwynlfitpreset.c:1821
+msgid "Boltzmann bent step"
+msgstr ""
+
+#: libgwyddion/gwynlfitpreset.c:1837
 msgid "Power"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1712 libprocess/gwyshapefitpreset.c:348
+#: libgwyddion/gwynlfitpreset.c:1849 libprocess/gwyshapefitpreset.c:348
 msgid "Lorentzian"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1726
+#: libgwyddion/gwynlfitpreset.c:1863
 msgid "Sinc"
 msgstr "Sinc"
 
@@ -263,7 +272,7 @@ msgid "Step height (positive)"
 msgstr ""
 
 #: libprocess/cdline.c:590 libprocess/cdline.c:599
-#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:170
+#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:163
 msgid "Line"
 msgstr "Linie"
 
@@ -277,7 +286,7 @@ msgid "Circle (down)"
 msgstr "Kreis (runter)"
 
 #: libprocess/cdline.c:608 libprocess/cdline.c:617
-#: libgwydgets/gwygraphareadialog.c:557 modules/process/hough.c:171
+#: libgwydgets/gwygraphareadialog.c:550 modules/process/hough.c:164
 msgid "Circle"
 msgstr "Kreis"
 
@@ -286,256 +295,256 @@ msgstr "Kreis"
 msgid "Circle (up)"
 msgstr "Kreis (hoch)"
 
-#: libprocess/gwygrainvalue.c:64
+#: libprocess/gwygrainvalue.c:62
 msgid "Grain number"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:73 modules/process/curvature.c:129
+#: libprocess/gwygrainvalue.c:71 modules/process/curvature.c:128
 msgid "Center x position"
 msgstr "Zentrale X-Position"
 
-#: libprocess/gwygrainvalue.c:82 modules/process/curvature.c:130
+#: libprocess/gwygrainvalue.c:80 modules/process/curvature.c:129
 msgid "Center y position"
 msgstr "Zentrale Y-Position"
 
-#: libprocess/gwygrainvalue.c:91
+#: libprocess/gwygrainvalue.c:89
 msgid "Minimum value"
 msgstr "Minimalwert"
 
-#: libprocess/gwygrainvalue.c:100
+#: libprocess/gwygrainvalue.c:98
 msgid "Maximum value"
 msgstr "Maximalwert"
 
-#: libprocess/gwygrainvalue.c:109 modules/process/bdep_synth.c:133
-#: modules/tools/filter.c:237
+#: libprocess/gwygrainvalue.c:107 modules/process/bdep_synth.c:133
+#: modules/tools/filter.c:238
 msgid "Mean value"
 msgstr "Mittelwert"
 
-#: libprocess/gwygrainvalue.c:118 modules/tools/filter.c:238
+#: libprocess/gwygrainvalue.c:116 modules/tools/filter.c:239
 msgid "Median value"
 msgstr "Medianwert"
 
-#: libprocess/gwygrainvalue.c:127
+#: libprocess/gwygrainvalue.c:125
 #, fuzzy
 msgid "Minimum value on boundary"
 msgstr "Minimaler Wert auf dem Rand"
 
-#: libprocess/gwygrainvalue.c:136
+#: libprocess/gwygrainvalue.c:134
 #, fuzzy
 msgid "Maximum value on boundary"
 msgstr "Maximaler Wert auf dem Rand"
 
-#: libprocess/gwygrainvalue.c:145
+#: libprocess/gwygrainvalue.c:143
 #, fuzzy
 msgid "Pixel area"
 msgstr "_Pixel-Radius:"
 
-#: libprocess/gwygrainvalue.c:154
+#: libprocess/gwygrainvalue.c:152
 msgid "Projected area"
 msgstr "Projizierte Fläche"
 
-#: libprocess/gwygrainvalue.c:163
+#: libprocess/gwygrainvalue.c:161
 msgid "Surface area"
 msgstr "Oberflächen-Flächeninhalt"
 
-#: libprocess/gwygrainvalue.c:172
+#: libprocess/gwygrainvalue.c:170
 #, fuzzy
 msgid "Equivalent square side"
 msgstr "Äquivalente Quadrat-Kantenlänge"
 
-#: libprocess/gwygrainvalue.c:181
+#: libprocess/gwygrainvalue.c:179
 #, fuzzy
 msgid "Equivalent disc radius"
 msgstr "Äquivalenter Kreisradius"
 
-#: libprocess/gwygrainvalue.c:190
+#: libprocess/gwygrainvalue.c:188
 msgid "Area above half-height"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:199
+#: libprocess/gwygrainvalue.c:197
 msgid "Area of convex hull"
 msgstr ""
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to
 #. * zero.
-#: libprocess/gwygrainvalue.c:210
+#: libprocess/gwygrainvalue.c:208
 msgid "Zero basis volume"
 msgstr ""
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * grain minimum.
-#: libprocess/gwygrainvalue.c:221
+#: libprocess/gwygrainvalue.c:219
 msgid "Grain minimum basis volume"
 msgstr ""
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * Laplacian background.
-#: libprocess/gwygrainvalue.c:232
+#: libprocess/gwygrainvalue.c:230
 msgid "Laplacian background basis volume"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:241
+#: libprocess/gwygrainvalue.c:239
 #, fuzzy
 msgid "Projected boundary length"
 msgstr "Projizierte Umrandungslänge"
 
-#: libprocess/gwygrainvalue.c:250
+#: libprocess/gwygrainvalue.c:248
 msgid "Minimum bounding size"
 msgstr "Minimale Abmessung"
 
-#: libprocess/gwygrainvalue.c:259
+#: libprocess/gwygrainvalue.c:257
 msgid "Minimum bounding direction"
 msgstr "Richtung der minimalen Abmessung"
 
-#: libprocess/gwygrainvalue.c:268
+#: libprocess/gwygrainvalue.c:266
 msgid "Maximum bounding size"
 msgstr "Maximale Abmessung"
 
-#: libprocess/gwygrainvalue.c:277
+#: libprocess/gwygrainvalue.c:275
 msgid "Maximum bounding direction"
 msgstr "Richtung der maximalen Abmessung"
 
-#: libprocess/gwygrainvalue.c:286
+#: libprocess/gwygrainvalue.c:284
 msgid "Maximum inscribed disc radius"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:295
+#: libprocess/gwygrainvalue.c:293
 #, fuzzy
 msgid "Maximum inscribed disc center x position"
 msgstr "X-Position des Krümmungszentrums"
 
-#: libprocess/gwygrainvalue.c:304
+#: libprocess/gwygrainvalue.c:302
 #, fuzzy
 msgid "Maximum inscribed disc center y position"
 msgstr "Y-Position des Krümmungszentrums"
 
-#: libprocess/gwygrainvalue.c:313
+#: libprocess/gwygrainvalue.c:311
 msgid "Minimum circumcircle radius"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:322
+#: libprocess/gwygrainvalue.c:320
 #, fuzzy
 msgid "Minimum circumcircle center x position"
 msgstr "X-Position des Krümmungszentrums"
 
-#: libprocess/gwygrainvalue.c:331
+#: libprocess/gwygrainvalue.c:329
 #, fuzzy
 msgid "Minimum circumcircle center y position"
 msgstr "Y-Position des Krümmungszentrums"
 
-#: libprocess/gwygrainvalue.c:340
+#: libprocess/gwygrainvalue.c:338
 #, fuzzy
 msgid "Mean radius"
 msgstr "_Realer Radius"
 
-#: libprocess/gwygrainvalue.c:349 modules/tools/readvalue.c:319
+#: libprocess/gwygrainvalue.c:347 modules/tools/readvalue.c:322
 msgid "Inclination θ"
 msgstr "Neigungswinkel θ"
 
-#: libprocess/gwygrainvalue.c:358 modules/tools/readvalue.c:329
+#: libprocess/gwygrainvalue.c:356 modules/tools/readvalue.c:332
 msgid "Inclination φ"
 msgstr "Neigungswinkel φ"
 
-#: libprocess/gwygrainvalue.c:367
+#: libprocess/gwygrainvalue.c:365
 #, fuzzy
 msgid "Curvature center x position"
 msgstr "X-Position des Krümmungszentrums"
 
-#: libprocess/gwygrainvalue.c:376
+#: libprocess/gwygrainvalue.c:374
 #, fuzzy
 msgid "Curvature center y position"
 msgstr "Y-Position des Krümmungszentrums"
 
-#: libprocess/gwygrainvalue.c:385
+#: libprocess/gwygrainvalue.c:383
 #, fuzzy
 msgid "Curvature center z value"
 msgstr "Z-Position des Krümmungszentrums"
 
-#: libprocess/gwygrainvalue.c:394 modules/tools/readvalue.c:344
+#: libprocess/gwygrainvalue.c:392 modules/tools/readvalue.c:347
 #, fuzzy
 msgid "Curvature 1"
 msgstr "Krümmung 1"
 
-#: libprocess/gwygrainvalue.c:403 modules/tools/readvalue.c:354
+#: libprocess/gwygrainvalue.c:401 modules/tools/readvalue.c:357
 #, fuzzy
 msgid "Curvature 2"
 msgstr "Krümmung 2"
 
-#: libprocess/gwygrainvalue.c:412
+#: libprocess/gwygrainvalue.c:410
 #, fuzzy
 msgid "Curvature angle 1"
 msgstr "Krümmungswinkel 1"
 
-#: libprocess/gwygrainvalue.c:421
+#: libprocess/gwygrainvalue.c:419
 #, fuzzy
 msgid "Curvature angle 2"
 msgstr "Krümmungswinkel 2"
 
-#: libprocess/gwygrainvalue.c:430
+#: libprocess/gwygrainvalue.c:428
 msgid "Major semiaxis of equivalent ellipse"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:439
+#: libprocess/gwygrainvalue.c:437
 msgid "Minor semiaxis of equivalent ellipse"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:448
+#: libprocess/gwygrainvalue.c:446
 msgid "Orientation of equivalent ellipse"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:1120
+#: libprocess/gwygrainvalue.c:1118
 msgid "Id"
 msgstr "ID"
 
-#: libprocess/gwygrainvalue.c:1121 modules/graph/graph_peaks.c:156
-#: modules/process/extract_path.c:391 modules/process/wave_synth.c:482
-#: modules/tools/readvalue.c:251
+#: libprocess/gwygrainvalue.c:1119 modules/graph/graph_peaks.c:154
+#: modules/process/extract_path.c:391 modules/process/wave_synth.c:513
+#: modules/tools/readvalue.c:253
 msgid "Position"
 msgstr "Position"
 
-#: libprocess/gwygrainvalue.c:1122 app/meta.c:411 modules/file/imgexport.c:4625
-#: modules/process/curvature.c:762 modules/tools/level3.c:468
-#: modules/tools/readvalue.c:286
+#: libprocess/gwygrainvalue.c:1120 app/meta.c:411 modules/file/imgexport.c:4573
+#: modules/process/curvature.c:759 modules/tools/level3.c:475
+#: modules/tools/readvalue.c:290
 msgid "Value"
 msgstr "Wert"
 
-#: libprocess/gwygrainvalue.c:1123
+#: libprocess/gwygrainvalue.c:1121
 msgid "Area"
 msgstr "Fläche"
 
-#: libprocess/gwygrainvalue.c:1124 app/data-browser.c:5624 app/toolbox.c:110
+#: libprocess/gwygrainvalue.c:1122 app/data-browser.c:5624 app/toolbox.c:115
 msgid "Volume"
 msgstr "Volumen"
 
-#: libprocess/gwygrainvalue.c:1125
+#: libprocess/gwygrainvalue.c:1123
 #, fuzzy
 msgid "Boundary"
 msgstr "Rand"
 
-#: libprocess/gwygrainvalue.c:1126 modules/process/pat_synth.c:829
-#: modules/process/pat_synth.c:1131 modules/process/pat_synth.c:1466
-#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:147
+#: libprocess/gwygrainvalue.c:1124 modules/process/pat_synth.c:830
+#: modules/process/pat_synth.c:1132 modules/process/pat_synth.c:1467
+#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:149
 msgid "Slope"
 msgstr "Neigung"
 
-#: libprocess/gwygrainvalue.c:1127 modules/process/curvature.c:213
-#: modules/process/curvature.c:613
+#: libprocess/gwygrainvalue.c:1125 modules/process/curvature.c:212
+#: modules/process/curvature.c:615
 msgid "Curvature"
 msgstr "Krümmung"
 
-#: libprocess/gwygrainvalue.c:1128
+#: libprocess/gwygrainvalue.c:1126
 msgid "Moment"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:1132
+#: libprocess/gwygrainvalue.c:1130
 msgid "User"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:44
+#: libprocess/gwyprocessenums.c:44 modules/process/preview.h:263
 msgid "Union"
 msgstr "Vereinigungsmenge "
 
-#: libprocess/gwyprocessenums.c:45
+#: libprocess/gwyprocessenums.c:45 modules/process/preview.h:255
 msgid "Intersection"
 msgstr "Schnittmenge"
 
@@ -615,13 +624,13 @@ msgid "Scale and space adaptive"
 msgstr ""
 
 #. TRANSLATORS: Interpolation type (AKA nearest neighbour)
-#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3791
-#: modules/xyz/xyz_raster.c:640
+#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3756
+#: modules/xyz/xyz_raster.c:609
 msgid "Round"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3792
-#: modules/xyz/xyz_raster.c:641
+#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3757
+#: modules/xyz/xyz_raster.c:610
 msgid "Linear"
 msgstr "Linear"
 
@@ -713,28 +722,28 @@ msgstr "Nur maskierten Bereich einbeziehen"
 msgid "Use entire image (ignore mask)"
 msgstr "Gesamtes Bild verwenden (Maske ignorieren)"
 
-#: libprocess/gwyprocessenums.c:602
+#: libprocess/gwyprocessenums.c:604
 msgid "distance|City-block"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:603
+#: libprocess/gwyprocessenums.c:605
 #, fuzzy
 msgid "distance|Chess"
 msgstr "Abstand"
 
-#: libprocess/gwyprocessenums.c:604
+#: libprocess/gwyprocessenums.c:606
 msgid "distance|Octagonal 4,8"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:605
+#: libprocess/gwyprocessenums.c:607
 msgid "distance|Octagonal 8,4"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:606
+#: libprocess/gwyprocessenums.c:608
 msgid "distance|Octagonal"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:607
+#: libprocess/gwyprocessenums.c:609
 msgid "distance|Euclidean"
 msgstr ""
 
@@ -773,12 +782,12 @@ msgstr "Parallel"
 msgid "Ring"
 msgstr ""
 
-#: libprocess/morph_lib.c:169 libprocess/tip.c:1043
+#: libprocess/morph_lib.c:169 libprocess/tip.c:1052
 #, fuzzy
 msgid "Dilation..."
 msgstr "Dilatation"
 
-#: libprocess/morph_lib.c:235 libprocess/tip.c:1164
+#: libprocess/morph_lib.c:235 libprocess/tip.c:1173
 #, fuzzy
 msgid "Erosion..."
 msgstr "Erosion"
@@ -812,89 +821,89 @@ msgid_plural "Found %d internal local maxima"
 msgstr[0] "%d interne lokale Maxima gefunden"
 msgstr[1] "%d interne lokale Maxima gefunden"
 
-#: libprocess/tip.c:422
+#: libprocess/tip.c:431
 #, fuzzy
 msgid "Pyramid"
 msgstr "Pyramide"
 
-#: libprocess/tip.c:423 libprocess/tip.c:429 libprocess/tip.c:435
+#: libprocess/tip.c:432 libprocess/tip.c:438 libprocess/tip.c:444
 msgid "Pyramidal"
 msgstr "Pyramidal"
 
-#: libprocess/tip.c:428
+#: libprocess/tip.c:437
 #, fuzzy
 msgid "Contact"
 msgstr "Kontakt"
 
-#: libprocess/tip.c:434
+#: libprocess/tip.c:443
 #, fuzzy
 msgid "Noncontact"
 msgstr "Nicht-Kontakt"
 
-#: libprocess/tip.c:440
+#: libprocess/tip.c:449
 msgid "Delta function"
 msgstr "Delta-Funktion"
 
-#: libprocess/tip.c:441
+#: libprocess/tip.c:450
 msgid "Analytical"
 msgstr "Analytisch"
 
-#: libprocess/tip.c:446
+#: libprocess/tip.c:455 modules/process/fibre_synth.c:259
 #, fuzzy
 msgid "Parabola"
 msgstr "Parallel"
 
-#: libprocess/tip.c:447 libprocess/tip.c:453
+#: libprocess/tip.c:456 libprocess/tip.c:462
 #, fuzzy
 msgid "Symmetric"
 msgstr "Symmetrie"
 
-#: libprocess/tip.c:452
+#: libprocess/tip.c:461
 #, fuzzy
 msgid "Cone"
 msgstr "Keine"
 
-#: libprocess/tip.c:458
+#: libprocess/tip.c:467
 msgid "Elliptical parabola"
 msgstr ""
 
-#: libprocess/tip.c:459
+#: libprocess/tip.c:468
 #, fuzzy
 msgid "Asymmetric"
 msgstr "Symmetrie"
 
-#: libprocess/tip.c:1339 libprocess/tip.c:1367 libprocess/tip.c:1416
-#: libprocess/tip.c:1443
+#: libprocess/tip.c:1348 libprocess/tip.c:1376 libprocess/tip.c:1425
+#: libprocess/tip.c:1452
 msgid "Converting fields"
 msgstr "Konvertiere Felder"
 
-#: libprocess/tip.c:1349
+#: libprocess/tip.c:1358
 msgid "Starting partial estimation"
 msgstr "Starte partielle Abschätzung"
 
-#: libprocess/tip.c:1426
+#: libprocess/tip.c:1435
 msgid "Starting full estimation"
 msgstr "Starte komplette Abschätzung"
 
-#: libprocess/triangulation.c:2085 modules/process/calcoefs_view.c:793
+#: libprocess/triangulation.c:2084 modules/process/calcoefs_view.c:793
 #: modules/process/lat_synth.c:1178
 #, fuzzy
 msgid "Triangulating..."
 msgstr "Triangulation..."
 
-#: libgwydgets/gwy3dwindow.c:570
+#: libgwydgets/gwy3dwindow.c:575
 msgid "Rotate view (R)"
 msgstr "Ansicht rotieren (R)"
 
-#: libgwydgets/gwy3dwindow.c:575
+#: libgwydgets/gwy3dwindow.c:580
 msgid "Scale view as a whole (S)"
 msgstr "Gesamte Ansicht skalieren (S)"
 
-#: libgwydgets/gwy3dwindow.c:580
+#: libgwydgets/gwy3dwindow.c:585
 msgid "Scale value range (V)"
 msgstr "Wertebereich skalieren (V)"
 
-#: libgwydgets/gwy3dwindow.c:585
+#: libgwydgets/gwy3dwindow.c:590
 msgid "Move light source (L)"
 msgstr "Lichtquelle bewegen (L)"
 
@@ -903,235 +912,297 @@ msgstr "Lichtquelle bewegen (L)"
 msgid "Show full controls"
 msgstr "Alle Kontrollelemente anzeigen"
 
-#: libgwydgets/gwy3dwindow.c:693
+#: libgwydgets/gwy3dwindow.c:691
 #, fuzzy
 msgid "Hide full controls"
 msgstr "Kontrollelemente ausblenden"
 
-#: libgwydgets/gwy3dwindow.c:709 modules/file/imgexport.c:4796
-#: modules/process/fit-shape.c:461
+#: libgwydgets/gwy3dwindow.c:707 modules/file/imgexport.c:4745
+#: modules/process/fit-shape.c:462
 msgid "adjective|Basic"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:714
+#: libgwydgets/gwy3dwindow.c:712
 msgid "Light & Material"
 msgstr "Beleuchtung & Material"
 
-#: libgwydgets/gwy3dwindow.c:719
+#: libgwydgets/gwy3dwindow.c:717
 msgid "Labels"
 msgstr "Beschriftungen"
 
-#: libgwydgets/gwy3dwindow.c:828 modules/process/facet_analysis.c:331
-#: modules/process/facet_analysis.c:347 modules/process/shade.c:245
+#: libgwydgets/gwy3dwindow.c:722
+#, fuzzy
+msgid "Colorbar"
+msgstr "Farbe"
+
+#: libgwydgets/gwy3dwindow.c:838 modules/process/facet_analysis.c:335
+#: modules/process/facet_analysis.c:351 modules/process/shade.c:253
 #: modules/process/tilt.c:223
 msgid "φ:"
 msgstr "φ:"
 
-#: libgwydgets/gwy3dwindow.c:828 libgwydgets/gwy3dwindow.c:834
-#: libgwydgets/gwy3dwindow.c:1032 libgwydgets/gwy3dwindow.c:1040
-#: modules/process/facet_analysis.c:375 modules/process/indent_analyze.c:460
-#: modules/process/rotate.c:264 modules/process/shade.c:237
-#: modules/process/shade.c:245 modules/process/tilt.c:211
-#: modules/process/tilt.c:223 modules/process/tip_model.c:234
-#: modules/process/tip_model.c:240 modules/process/unrotate.c:334
+#: libgwydgets/gwy3dwindow.c:838 libgwydgets/gwy3dwindow.c:843
+#: libgwydgets/gwy3dwindow.c:1013 libgwydgets/gwy3dwindow.c:1020
+#: modules/process/correct_affine.c:461 modules/process/facet_analysis.c:238
+#: modules/process/facet_analysis.c:370 modules/process/indent_analyze.c:438
+#: modules/process/measure_lattice.c:381 modules/process/rotate.c:264
+#: modules/process/shade.c:245 modules/process/shade.c:253
+#: modules/process/synth.h:379 modules/process/synth.h:410
+#: modules/process/tilt.c:211 modules/process/tilt.c:223
+#: modules/process/tip_model.c:234 modules/process/tip_model.c:240
+#: modules/process/unrotate.c:334 modules/tools/distance.c:197
+#: modules/tools/readvalue.c:223 modules/tools/stats.c:319
 msgid "deg"
 msgstr "Grad"
 
-#: libgwydgets/gwy3dwindow.c:834 modules/process/facet_analysis.c:330
-#: modules/process/facet_analysis.c:346 modules/process/shade.c:237
+#: libgwydgets/gwy3dwindow.c:843 modules/process/facet_analysis.c:334
+#: modules/process/facet_analysis.c:350 modules/process/shade.c:245
 #: modules/process/tilt.c:211
 msgid "θ:"
 msgstr "θ:"
 
-#: libgwydgets/gwy3dwindow.c:839 modules/process/cwt.c:151
+#: libgwydgets/gwy3dwindow.c:849 modules/process/cwt.c:151
 msgid "_Scale:"
 msgstr "_Skala:"
 
-#: libgwydgets/gwy3dwindow.c:846
+#: libgwydgets/gwy3dwindow.c:856
 msgid "_Value scale:"
 msgstr "_Werteskala:"
 
-#: libgwydgets/gwy3dwindow.c:851
+#: libgwydgets/gwy3dwindow.c:862
 #, fuzzy
 msgid "Ph_ysical scale:"
 msgstr "_Werteskala:"
 
-#: libgwydgets/gwy3dwindow.c:865
+#: libgwydgets/gwy3dwindow.c:876
 #, fuzzy
 msgid "verb|Set"
 msgstr "Speichern"
 
-#: libgwydgets/gwy3dwindow.c:877
+#: libgwydgets/gwy3dwindow.c:886
 #, fuzzy
 msgid "Line _width:"
 msgstr "Neue _Breite:"
 
-#: libgwydgets/gwy3dwindow.c:881
+#: libgwydgets/gwy3dwindow.c:886 libgwydgets/gwy3dwindow.c:1194
+#: libgwydgets/gwy3dwindow.c:1204 libgwydgets/gwy3dwindow.c:1235
+#: libgwydgets/gwygraphareadialog.c:157 libgwydgets/gwygraphareadialog.c:173
+#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
+#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
+#: modules/process/angle_dist.c:188 modules/process/angle_dist.c:213
+#: modules/process/col_synth.c:486 modules/process/crosscor.c:252
+#: modules/process/crosscor.c:260 modules/process/crosscor.c:276
+#: modules/process/crosscor.c:284 modules/process/crosscor.c:300
+#: modules/process/crosscor.c:308 modules/process/cwt.c:151
+#: modules/process/dimensions.h:88 modules/process/edge.c:672
+#: modules/process/entropy.c:242 modules/process/extend.c:220
+#: modules/process/extend.c:227 modules/process/extend.c:234
+#: modules/process/extend.c:241 modules/process/facet_analysis.c:362
+#: modules/process/fbm_synth.c:383 modules/process/hough.c:203
+#: modules/process/local_contrast.c:146 modules/process/mark_disconn.c:263
+#: modules/process/mask_morph.c:237 modules/process/median-bg.c:209
+#: modules/process/neural.c:623 modules/process/neural.c:631
+#: modules/process/psdf_logphi.c:276 modules/process/rank.c:188
+#: modules/process/scale.c:237 modules/process/scale.c:246
+#: modules/process/scars.c:353 modules/process/scars.c:361
+#: modules/process/semsim.c:227 modules/process/slope_dist.c:365
+#: modules/process/slope_dist.c:393 modules/process/sphere-revolve.c:346
+#: modules/process/straighten_path.c:278 modules/process/synth.h:280
+#: modules/process/synth.h:501 modules/process/tip_blind.c:334
+#: modules/process/tip_blind.c:342 modules/process/volumize_layers.c:240
+#: modules/process/volumize_layers.c:245 modules/process/volumize_layers.c:250
+#: modules/process/wpour_mark.c:320 modules/tools/filter.c:291
+#: modules/tools/level3.c:244 modules/tools/maskedit.c:528
+#: modules/tools/maskedit.c:629 modules/tools/pathlevel.c:256
+#: modules/tools/profile.c:377 modules/tools/profile.c:503
+#: modules/tools/readvalue.c:222 modules/tools/readvalue.c:378
+#: modules/tools/roughness.c:868 modules/volume/volume_slice.c:446
+#: modules/volume/volume_slice.c:469 modules/volume/volume_slice.c:492
+#: modules/xyz/xyz_drift.c:738 modules/xyz/xyz_drift.c:753
+#: modules/xyz/xyz_raster.c:382 modules/xyz/xyz_raster.c:388
+msgid "px"
+msgstr "px"
+
+#: libgwydgets/gwy3dwindow.c:891
 msgid "Show _axes"
 msgstr "_Achsen anzeigen"
 
-#: libgwydgets/gwy3dwindow.c:890
+#: libgwydgets/gwy3dwindow.c:900
 msgid "Show _labels"
 msgstr "_Beschriftungen anzeigen"
 
-#: libgwydgets/gwy3dwindow.c:899
-msgid "Show false _colorbar"
-msgstr "_Farbskala anzeigen"
-
-#: libgwydgets/gwy3dwindow.c:908
+#: libgwydgets/gwy3dwindow.c:909
 #, fuzzy
 msgid "_Orthographic projection"
 msgstr "_Orthographische Projektion"
 
-#: libgwydgets/gwy3dwindow.c:917
+#: libgwydgets/gwy3dwindow.c:918
 #, fuzzy
 msgid "_Hide masked"
 msgstr "Maske _addieren"
 
-#: libgwydgets/gwy3dwindow.c:933
+#: libgwydgets/gwy3dwindow.c:934
 msgid "_Lighting"
 msgstr "Aus_leuchtung"
 
-#: libgwydgets/gwy3dwindow.c:934
+#: libgwydgets/gwy3dwindow.c:935
 msgid "_Gradient"
 msgstr "_Gradient"
 
-#: libgwydgets/gwy3dwindow.c:935
+#: libgwydgets/gwy3dwindow.c:936
 msgid "_Overlay"
 msgstr "_Überlagern"
 
-#: libgwydgets/gwy3dwindow.c:936
+#: libgwydgets/gwy3dwindow.c:937
 msgid "_Overlay - no light"
 msgstr "Ü_berlagern - ohne Beleuchtung"
 
-#: libgwydgets/gwy3dwindow.c:1009
+#: libgwydgets/gwy3dwindow.c:992
 msgid "_Material:"
 msgstr "_Material:"
 
-#: libgwydgets/gwy3dwindow.c:1032
+#: libgwydgets/gwy3dwindow.c:1013
 msgid "_Light φ:"
 msgstr "_Lichtquelle φ:"
 
-#: libgwydgets/gwy3dwindow.c:1040
+#: libgwydgets/gwy3dwindow.c:1020
 msgid "L_ight θ:"
 msgstr "L_ichtquelle θ:"
 
-#: libgwydgets/gwy3dwindow.c:1070 libgwydgets/gwy3dwindow.c:1240
-#: app/toolbox-editor.c:215 modules/file/hdrimage.cc:2213
-#: modules/file/imgexport.c:4760 modules/file/pixmap.c:789
+#: libgwydgets/gwy3dwindow.c:1052 libgwydgets/gwy3dwindow.c:1243
+#: app/toolbox-editor.c:216 modules/file/hdrimage.cc:2213
+#: modules/file/imgexport.c:4708 modules/file/pixmap.c:789
 #: modules/file/rawfile.c:424 modules/process/angle_dist.c:172
 #: modules/process/bdep_synth.c:341 modules/process/calcoefs_new.c:371
-#: modules/process/calibrate.c:391 modules/process/col_synth.c:392
-#: modules/process/correct_affine.c:301 modules/process/curvature.c:615
-#: modules/process/cwt.c:135 modules/process/deposit_synth.c:349
+#: modules/process/calibrate.c:383 modules/process/col_synth.c:392
+#: modules/process/correct_affine.c:346 modules/process/curvature.c:617
+#: modules/process/cwt.c:135 modules/process/deposit_synth.c:350
 #: modules/process/diff_synth.c:411 modules/process/domain_synth.c:354
 #: modules/process/drift.c:245 modules/process/dwt.c:166
 #: modules/process/dwtanisotropy.c:184 modules/process/edge.c:638
 #: modules/process/extend.c:192 modules/process/facet-level.c:193
-#: modules/process/facet_analysis.c:271 modules/process/fbm_synth.c:303
+#: modules/process/facet_analysis.c:275 modules/process/fbm_synth.c:303
 #: modules/process/fft.c:336 modules/process/fft_filter_2d.c:417
-#: modules/process/fft_synth.c:341 modules/process/fractal.c:231
-#: modules/process/grain_edge.c:213 modules/process/grain_mark.c:247
-#: modules/process/grain_wshed.c:167 modules/process/hough.c:179
-#: modules/process/lat_synth.c:567 modules/process/latsim.c:159
-#: modules/process/level.c:245 modules/process/linematch.c:804
-#: modules/process/lno_synth.c:433 modules/process/local_contrast.c:130
-#: modules/process/logistic.c:234 modules/process/mark_disconn.c:208
-#: modules/process/mask_distribute.c:152 modules/process/measure_lattice.c:256
-#: modules/process/median-bg.c:180 modules/process/noise_synth.c:336
-#: modules/process/obj_synth.c:441 modules/process/pat_synth.c:385
-#: modules/process/pid.c:199 modules/process/polydistort.c:210
-#: modules/process/polylevel.c:373 modules/process/psdf_logphi.c:249
-#: modules/process/rank.c:158 modules/process/rotate.c:243
-#: modules/process/scale.c:196 modules/process/scars.c:298
-#: modules/process/semsim.c:211 modules/process/shade.c:208
-#: modules/process/slope_dist.c:276 modules/process/sphere-revolve.c:218
-#: modules/process/straighten_path.c:249 modules/process/tilt.c:161
-#: modules/process/tip_model.c:169 modules/process/unrotate.c:220
-#: modules/process/volumize_layers.c:221 modules/process/wave_synth.c:349
-#: modules/process/wpour_mark.c:278 modules/volume/volume_calibrate.c:370
-#: modules/volume/volume_extract.c:331 modules/volume/volume_kmeans.c:153
-#: modules/volume/volume_kmedians.c:147 modules/volume/volume_linestat.c:292
-#: modules/volume/volume_slice.c:292
+#: modules/process/fft_synth.c:341 modules/process/fibre_synth.c:422
+#: modules/process/fractal.c:228 modules/process/grain_edge.c:212
+#: modules/process/grain_mark.c:246 modules/process/grain_wshed.c:168
+#: modules/process/hough.c:174 modules/process/lat_synth.c:567
+#: modules/process/latsim.c:159 modules/process/level.c:245
+#: modules/process/linematch.c:771 modules/process/lno_synth.c:431
+#: modules/process/local_contrast.c:130 modules/process/logistic.c:234
+#: modules/process/mark_disconn.c:208 modules/process/mask_distribute.c:152
+#: modules/process/measure_lattice.c:246 modules/process/median-bg.c:180
+#: modules/process/mfm_current.c:332 modules/process/mfm_field.c:281
+#: modules/process/mfm_findshift.c:230 modules/process/mfm_parallel.c:333
+#: modules/process/mfm_shift.c:170 modules/process/noise_synth.c:334
+#: modules/process/obj_synth.c:438 modules/process/pat_synth.c:385
+#: modules/process/phase_synth.c:205 modules/process/pid.c:197
+#: modules/process/polydistort.c:210 modules/process/polylevel.c:373
+#: modules/process/psdf_logphi.c:249 modules/process/rank.c:158
+#: modules/process/rotate.c:243 modules/process/scale.c:196
+#: modules/process/scars.c:317 modules/process/semsim.c:211
+#: modules/process/shade.c:210 modules/process/slope_dist.c:275
+#: modules/process/sphere-revolve.c:317 modules/process/straighten_path.c:248
+#: modules/process/tilt.c:161 modules/process/tip_model.c:167
+#: modules/process/unrotate.c:220 modules/process/volumize_layers.c:221
+#: modules/process/wave_synth.c:368 modules/process/wpour_mark.c:278
+#: modules/volume/volume_calibrate.c:370 modules/volume/volume_extract.c:324
+#: modules/volume/volume_kmeans.c:154 modules/volume/volume_kmedians.c:147
+#: modules/volume/volume_linestat.c:297 modules/volume/volume_slice.c:294
 msgid "_Reset"
 msgstr "_Zurücksetzen"
 
-#: libgwydgets/gwy3dwindow.c:1142
+#: libgwydgets/gwy3dwindow.c:1141
 msgid "X-axis"
 msgstr "X-Achse"
 
-#: libgwydgets/gwy3dwindow.c:1143
+#: libgwydgets/gwy3dwindow.c:1142
 msgid "Y-axis"
 msgstr "Y-Achse"
 
-#: libgwydgets/gwy3dwindow.c:1144
+#: libgwydgets/gwy3dwindow.c:1143
 msgid "Minimum z value"
 msgstr "Minimaler z-Wert"
 
-#: libgwydgets/gwy3dwindow.c:1145
+#: libgwydgets/gwy3dwindow.c:1144
 msgid "Maximum z value"
 msgstr "Maximaler z-Wert"
 
-#: libgwydgets/gwy3dwindow.c:1168 modules/file/imgexport.c:3836
+#: libgwydgets/gwy3dwindow.c:1167 modules/file/imgexport.c:3806
 msgid "_Label:"
 msgstr "_Beschriftung:"
 
-#: libgwydgets/gwy3dwindow.c:1173
+#: libgwydgets/gwy3dwindow.c:1180
 msgid "_Text:"
 msgstr "_Text:"
 
-#: libgwydgets/gwy3dwindow.c:1193
+#: libgwydgets/gwy3dwindow.c:1185
 msgid "Move label"
 msgstr "Beschriftung verschieben"
 
-#: libgwydgets/gwy3dwindow.c:1202
+#: libgwydgets/gwy3dwindow.c:1194
 msgid "_Horizontally:"
 msgstr "_Horizontal:"
 
-#: libgwydgets/gwy3dwindow.c:1212
+#: libgwydgets/gwy3dwindow.c:1204
 msgid "_Vertically:"
 msgstr "_Vertikal:"
 
-#: libgwydgets/gwy3dwindow.c:1220
+#: libgwydgets/gwy3dwindow.c:1212
+msgid "A_ll labels have the same size"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:1223
 msgid "Scale size _automatically"
 msgstr "Größe _automatisch skalieren"
 
-#: libgwydgets/gwy3dwindow.c:1232 modules/tools/filter.c:290
+#: libgwydgets/gwy3dwindow.c:1235 modules/tools/filter.c:291
 msgid "Si_ze:"
 msgstr "_Größe:"
 
-#: libgwydgets/gwy3dwindow.c:1232 modules/process/cwt.c:151
-#: modules/process/hough.c:212
-msgid "pixels"
-msgstr "Pixel"
+#: libgwydgets/gwy3dwindow.c:1277
+msgid "Show false _colorbar"
+msgstr "_Farbskala anzeigen"
+
+#: libgwydgets/gwy3dwindow.c:1286
+msgid "Reserve space for _colorbar"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:1302 modules/process/lat_synth.c:651
+#: modules/process/obj_synth.c:542 modules/process/pat_synth.c:1458
+#: modules/process/phase_synth.c:279
+#, fuzzy
+msgid "_Size:"
+msgstr "_Größe:"
 
-#: libgwydgets/gwy3dwindow.c:1726 libgwydgets/gwy3dwindow.c:1779
+#: libgwydgets/gwy3dwindow.c:1311
+#, fuzzy
+msgid "_Vertical alignment:"
+msgstr "_Vertikale Größe:"
+
+#: libgwydgets/gwy3dwindow.c:1844 libgwydgets/gwy3dwindow.c:1897
 msgid "S_witch to Lighting Mode"
 msgstr "In Beleuchtungs-Modus _wechseln"
 
-#: libgwydgets/gwy3dwindow.c:1734 libgwydgets/gwy3dwindow.c:1756
+#: libgwydgets/gwy3dwindow.c:1852 libgwydgets/gwy3dwindow.c:1874
 #, fuzzy
 msgid "S_witch to Overlay Mode"
 msgstr "In Beleuchtungs-Modus _wechseln"
 
-#: libgwydgets/gwy3dwindow.c:1748 libgwydgets/gwy3dwindow.c:1771
+#: libgwydgets/gwy3dwindow.c:1866 libgwydgets/gwy3dwindow.c:1889
 msgid "S_witch to Color Gradient Mode"
 msgstr "In Farb-Gadienten-Modus _wechseln"
 
-#: libgwydgets/gwy3dwindow.c:1787
+#: libgwydgets/gwy3dwindow.c:1905
 #, fuzzy
 msgid "T_oggle light"
 msgstr "Dreieck hoch"
 
-#: libgwydgets/gwyaxisdialog.c:99
+#: libgwydgets/gwyaxisdialog.c:75
 msgid "Axis Properties"
 msgstr "Achsen-Eigenschaften"
 
-#: libgwydgets/gwyaxisdialog.c:101 libgwydgets/gwygraphlabeldialog.c:63
-msgid "Label Properties"
-msgstr "Beschriftungs-Eigenschaften"
-
-#: libgwydgets/gwyaxisdialog.c:184
+#: libgwydgets/gwyaxisdialog.c:88
 msgid "Label Text"
 msgstr "Beschriftungs-Text"
 
@@ -1155,7 +1226,7 @@ msgid "Hidden"
 msgstr "Versteckt"
 
 #: libgwydgets/gwydgetenums.c:47 libgwydgets/gwygraphwindowmeasuredialog.c:572
-#: modules/file/imgexport.c:475 modules/tools/selectionmanager.c:274
+#: modules/file/imgexport.c:474 modules/tools/selectionmanager.c:274
 msgid "Points"
 msgstr "Punkte"
 
@@ -1163,7 +1234,7 @@ msgstr "Punkte"
 msgid "Line + points"
 msgstr "Linie + Punkte"
 
-#: libgwydgets/gwydgetutils.c:564
+#: libgwydgets/gwydgetutils.c:848
 msgid "Change Mask Color"
 msgstr "Maskenfarbe ändern"
 
@@ -1172,7 +1243,7 @@ msgid "Quantity"
 msgstr ""
 
 #: libgwydgets/gwygrainvaluemenu.c:194 libgwydgets/gwygrainvaluemenu.c:207
-#: modules/process/curvature.c:753
+#: modules/process/curvature.c:750
 msgid "Symbol"
 msgstr "Symbol"
 
@@ -1193,151 +1264,156 @@ msgstr ""
 msgid "_Next"
 msgstr "_Nächster Tipp"
 
-#: libgwydgets/gwygraphareadialog.c:127 modules/file/rawgraph.c:302
+#: libgwydgets/gwygraphareadialog.c:123 modules/file/rawgraph.c:302
 msgid "Plot _style:"
 msgstr "Diagramm_stil:"
 
-#: libgwydgets/gwygraphareadialog.c:148
+#: libgwydgets/gwygraphareadialog.c:131
 msgid "Pl_ot color:"
 msgstr "Diagramm_farbe:"
 
-#: libgwydgets/gwygraphareadialog.c:159
+#: libgwydgets/gwygraphareadialog.c:151
 msgid "Point _type:"
 msgstr "Punkt_typ:"
 
-#: libgwydgets/gwygraphareadialog.c:165
+#: libgwydgets/gwygraphareadialog.c:157
 msgid "_Point size:"
 msgstr "_Punktgröße:"
 
-#: libgwydgets/gwygraphareadialog.c:175
+#: libgwydgets/gwygraphareadialog.c:167
 msgid "_Line type:"
 msgstr "_Linientyp:"
 
-#: libgwydgets/gwygraphareadialog.c:181 modules/file/imgexport.c:3150
+#: libgwydgets/gwygraphareadialog.c:173 modules/file/imgexport.c:3154
 msgid "Line t_hickness:"
 msgstr "Linien_dicke:"
 
-#: libgwydgets/gwygraphareadialog.c:187
+#: libgwydgets/gwygraphareadialog.c:180
 #, fuzzy
 msgid "<b>Label Te_xt</b>"
 msgstr "Beschriftungs-Text"
 
-#: libgwydgets/gwygraphareadialog.c:404
+#: libgwydgets/gwygraphareadialog.c:397
 #, fuzzy
 msgid "Set Curve Color"
 msgstr "Kurvenfarbe setzen"
 
-#: libgwydgets/gwygraphareadialog.c:556 modules/process/mask_morph.c:179
+#: libgwydgets/gwygraphareadialog.c:549 modules/process/mask_morph.c:178
 msgid "Square"
 msgstr "Quadrat"
 
-#: libgwydgets/gwygraphareadialog.c:558 modules/process/mask_morph.c:180
+#: libgwydgets/gwygraphareadialog.c:551 modules/process/mask_morph.c:179
 msgid "Diamond"
 msgstr "Diamant"
 
-#: libgwydgets/gwygraphareadialog.c:559
+#: libgwydgets/gwygraphareadialog.c:552
 #, fuzzy
 msgid "Cross"
 msgstr "Kreuz"
 
-#: libgwydgets/gwygraphareadialog.c:560
+#: libgwydgets/gwygraphareadialog.c:553
 msgid "Diagonal cross"
 msgstr "Diagonales Kreuz"
 
-#: libgwydgets/gwygraphareadialog.c:561
+#: libgwydgets/gwygraphareadialog.c:554
 msgid "Asterisk"
 msgstr "Asterisk"
 
-#: libgwydgets/gwygraphareadialog.c:562
+#: libgwydgets/gwygraphareadialog.c:555
 msgid "Star"
 msgstr "Stern"
 
-#: libgwydgets/gwygraphareadialog.c:563
+#: libgwydgets/gwygraphareadialog.c:556
 #, fuzzy
 msgid "Triangle up"
 msgstr "Dreieck hoch"
 
-#: libgwydgets/gwygraphareadialog.c:564
+#: libgwydgets/gwygraphareadialog.c:557
 #, fuzzy
 msgid "Triangle down"
 msgstr "Dreieck runter"
 
-#: libgwydgets/gwygraphareadialog.c:565
+#: libgwydgets/gwygraphareadialog.c:558
 #, fuzzy
 msgid "Triangle left"
 msgstr "Dreieck hoch"
 
-#: libgwydgets/gwygraphareadialog.c:566
+#: libgwydgets/gwygraphareadialog.c:559
 #, fuzzy
 msgid "Triangle right"
 msgstr "Dreieck hoch"
 
-#: libgwydgets/gwygraphareadialog.c:567
+#: libgwydgets/gwygraphareadialog.c:560
 #, fuzzy
 msgid "Full square"
 msgstr "Quadrat, ausgefüllt"
 
-#: libgwydgets/gwygraphareadialog.c:568 modules/process/mask_morph.c:177
+#: libgwydgets/gwygraphareadialog.c:561 modules/process/mask_morph.c:176
 #, fuzzy
 msgid "Disc"
 msgstr "Kreis"
 
-#: libgwydgets/gwygraphareadialog.c:569
+#: libgwydgets/gwygraphareadialog.c:562
 #, fuzzy
 msgid "Full diamond"
 msgstr "Diamant, ausgefüllt"
 
-#: libgwydgets/gwygraphareadialog.c:570
+#: libgwydgets/gwygraphareadialog.c:563
 #, fuzzy
 msgid "Full triangle up"
 msgstr "Dreieck hoch, ausgefüllt"
 
-#: libgwydgets/gwygraphareadialog.c:571
+#: libgwydgets/gwygraphareadialog.c:564
 #, fuzzy
 msgid "Full triangle down"
 msgstr "Dreieck runter, ausgefüllt"
 
-#: libgwydgets/gwygraphareadialog.c:572
+#: libgwydgets/gwygraphareadialog.c:565
 #, fuzzy
 msgid "Full triangle left"
 msgstr "Dreieck links, ausgefüllt"
 
-#: libgwydgets/gwygraphareadialog.c:573
+#: libgwydgets/gwygraphareadialog.c:566
 #, fuzzy
 msgid "Full triangle right"
 msgstr "Dreieck rechts, ausgefüllt"
 
-#: libgwydgets/gwygraphareadialog.c:635
+#: libgwydgets/gwygraphareadialog.c:628
 msgid "line-style|Solid"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:636
+#: libgwydgets/gwygraphareadialog.c:629
 msgid "line-style|Dash"
 msgstr ""
 
-#: libgwydgets/gwygraphcurves.c:451
+#: libgwydgets/gwygraphcurves.c:448
 msgid "Description"
 msgstr "Beschreibung"
 
-#: libgwydgets/gwygraphcurves.c:463
+#: libgwydgets/gwygraphcurves.c:460
 msgid "Mode"
 msgstr "Modus"
 
-#: libgwydgets/gwygraphcurves.c:481
+#: libgwydgets/gwygraphcurves.c:478
 msgid "Color"
 msgstr "Farbe"
 
-#: libgwydgets/gwygraphcurves.c:494
+#: libgwydgets/gwygraphcurves.c:491
 #, fuzzy
 msgid "Point Type"
 msgstr "Punkttyp"
 
-#: libgwydgets/gwygraphcurves.c:516
+#: libgwydgets/gwygraphcurves.c:513
 msgid "Line Style"
 msgstr "Linientyp"
 
+#: libgwydgets/gwygraphlabeldialog.c:63
+msgid "Label Properties"
+msgstr "Beschriftungs-Eigenschaften"
+
 #: libgwydgets/gwygraphlabeldialog.c:74
-msgid "Frame thickness:"
+#, fuzzy
+msgid "_Frame thickness:"
 msgstr "Rahmendicke:"
 
 #: libgwydgets/gwygraphlabeldialog.c:81
@@ -1349,12 +1425,12 @@ msgstr "seiten_verkehrt"
 msgid "Abscissa"
 msgstr ""
 
-#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1002 app/toolbox.c:108
+#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1015 app/toolbox.c:113
 msgid "Graph"
 msgstr "Graph"
 
 #: libgwydgets/gwygraphwindow.c:170 modules/file/hdrimage.cc:472
-#: modules/process/fit-shape.c:656
+#: modules/process/fit-shape.c:666 modules/process/psf.c:229
 msgid "Data"
 msgstr "Daten"
 
@@ -1395,15 +1471,15 @@ msgstr ""
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:394
 #: libgwydgets/gwygraphwindowmeasuredialog.c:580 modules/tools/linestats.c:170
-#: modules/tools/roughness.c:516 modules/volume/volume_linestat.c:157
+#: modules/tools/roughness.c:517 modules/volume/volume_linestat.c:159
 msgid "Length"
 msgstr "Länge"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:398
 #: libgwydgets/gwygraphwindowmeasuredialog.c:588 app/gwyplaintool.c:1018
-#: modules/process/lat_synth.c:747 modules/process/obj_synth.c:569
-#: modules/process/pat_synth.c:846 modules/process/pat_synth.c:1148
-#: modules/process/pat_synth.c:1483
+#: modules/process/fibre_synth.c:534 modules/process/lat_synth.c:747
+#: modules/process/obj_synth.c:567 modules/process/pat_synth.c:847
+#: modules/process/pat_synth.c:1149 modules/process/pat_synth.c:1484
 msgid "Height"
 msgstr "Höhe"
 
@@ -1417,12 +1493,12 @@ msgid "Curve:"
 msgstr "Kurve:"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:553
-#: modules/process/linematch.c:828 modules/process/semsim.c:249
+#: modules/process/linematch.c:795 modules/process/semsim.c:249
 #: modules/xyz/xyz_level.c:254
 msgid "Method:"
 msgstr "Methode:"
 
-#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:354
+#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:331
 msgid "Angle"
 msgstr "Winkel"
 
@@ -1433,7 +1509,7 @@ msgid "Preferred"
 msgstr "Bevorzugt"
 
 #: libgwydgets/gwyoptionmenus.c:470 app/meta.c:410
-#: modules/file/imgexport.c:4160 modules/file/imgexport.c:4607
+#: modules/file/imgexport.c:4110 modules/file/imgexport.c:4555
 #: modules/file/rawfile.c:995 modules/process/convolution_filter.c:538
 #: modules/process/neural.c:418 modules/tools/selectionmanager.c:345
 msgid "Name"
@@ -1472,7 +1548,7 @@ msgid "A_dd symbol"
 msgstr ""
 
 #: libgwydgets/gwyscitext.c:274 modules/file/rawfile.c:553
-#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:405
+#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:419
 msgid "Preview"
 msgstr "Vorschau"
 
@@ -1490,92 +1566,86 @@ msgstr "Das Laden dieses Dateiformats wird von keinem Modul unterstützt."
 msgid "No module can save to this file type."
 msgstr "Speichern in diesem Dateitformat wird von keinem Modul unterstützt."
 
-#: libgwymodule/gwymodulebrowser.c:67
+#: libgwymodule/gwymodulebrowser.c:66
 msgid "Module Browser"
 msgstr "Modul-Browser"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Module"
 msgstr "Modul"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Version"
 msgstr "Version"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Author"
 msgstr "Autor"
 
-#: libgwymodule/gwymodulebrowser.c:246
+#: libgwymodule/gwymodulebrowser.c:244
 #, fuzzy
 msgid "Name-Version:"
 msgstr "Name-Version:"
 
-#: libgwymodule/gwymodulebrowser.c:247 libgwymodule/gwymodulebrowser.c:270
+#: libgwymodule/gwymodulebrowser.c:245 libgwymodule/gwymodulebrowser.c:268
 #: modules/process/grain_stat.c:186
 msgid "File:"
 msgstr "Datei:"
 
-#: libgwymodule/gwymodulebrowser.c:248
+#: libgwymodule/gwymodulebrowser.c:246
 msgid "Registered functions:"
 msgstr "Registrierte Funktionen:"
 
-#: libgwymodule/gwymodulebrowser.c:249
+#: libgwymodule/gwymodulebrowser.c:247
 msgid "Authors:"
 msgstr "Autoren:"
 
-#: libgwymodule/gwymodulebrowser.c:250
+#: libgwymodule/gwymodulebrowser.c:248
 msgid "Copyright:"
 msgstr "Copyright:"
 
-#: libgwymodule/gwymodulebrowser.c:251
+#: libgwymodule/gwymodulebrowser.c:249
 msgid "Date:"
 msgstr "Datum:"
 
-#: libgwymodule/gwymodulebrowser.c:252
+#: libgwymodule/gwymodulebrowser.c:250
 msgid "Description:"
 msgstr "Beschreibung:"
 
-#: libgwymodule/gwymodulebrowser.c:269
+#: libgwymodule/gwymodulebrowser.c:267
 msgid "Name:"
 msgstr "Name:"
 
-#: libgwymodule/gwymodulebrowser.c:271
+#: libgwymodule/gwymodulebrowser.c:269
 msgid "Failure:"
 msgstr "Fehler:"
 
-#: app/about.c:57
+#: app/about.c:58
 #, c-format
 msgid "About %s"
 msgstr "Über %s"
 
-#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
-#: app/about.c:92
-#, c-format
-msgid "Released %s\n"
-msgstr ""
-
-#: app/about.c:93
+#: app/about.c:97
 #, fuzzy
 msgid "An SPM data visualization and analysis tool."
 msgstr "Ein Anzeige- und Analyse-Programm für Rastersondenmikroskopie-Daten."
 
-#: app/about.c:101
+#: app/about.c:105
 #, fuzzy
 msgid "Report bugs to:"
 msgstr ""
 "<i>%s</i>\n"
 "Fehlerberichte an: <i>%s</i>"
 
-#: app/about.c:116
+#: app/about.c:120
 msgid "Credits"
 msgstr "Mitwirkende"
 
-#: app/about.c:133
+#: app/about.c:137
 msgid "License"
 msgstr "Lizenz"
 
-#: app/about.c:138
+#: app/about.c:142
 #, c-format
 msgid ""
 "%s is free software; you can redistribute it and/or modify it under the "
@@ -1591,60 +1661,64 @@ msgstr ""
 "Lizenzformulierung finden Sie in der Datei COPYING, die im Quellpaket "
 "enthalten ist."
 
-#: app/about.c:160 modules/process/logistic.c:270
+#: app/about.c:164 modules/process/logistic.c:269
 msgid "Features"
 msgstr ""
 
-#: app/about.c:220
+#: app/about.c:224
 msgid "Developers"
 msgstr "Entwickler"
 
-#: app/about.c:221
+#: app/about.c:225
 msgid "Translators"
 msgstr "Übersetzer"
 
-#: app/about.c:225
+#: app/about.c:229
 msgid "Development is supported by the Czech Metrology Institute: "
 msgstr ""
 "Die Entwicklung dieser Software wird unterstützt vom Tschechischen "
 "Metrologie-Institut:"
 
-#: app/about.c:253 app/about.c:256
+#: app/about.c:257 app/about.c:260
 msgid "OpenGL 3D View"
 msgstr "OpenGL 3D-Ansicht"
 
-#: app/about.c:257 app/about.c:271 app/about.c:291
+#: app/about.c:261 app/about.c:266 app/about.c:286
 msgid "not available\n"
 msgstr "nicht verfügbar\n"
 
-#: app/about.c:262 app/about.c:265
-msgid "Fast Fourier Transform"
-msgstr "Schnelle Fouriertransformation"
-
-#: app/about.c:266
-msgid "built-in SimpleFFT\n"
-msgstr ""
-
-#: app/about.c:274
+#: app/about.c:269
 msgid "X11 protocol\n"
 msgstr "X11-Protokoll\n"
 
-#: app/about.c:276
+#: app/about.c:271
 msgid "Win32 protocol\n"
 msgstr "Win32-Protokoll\n"
 
-#: app/about.c:278
+#: app/about.c:273
 msgid "LibUnique\n"
 msgstr "LibUnique\n"
 
-#: app/about.c:282
+#: app/about.c:277
 msgid "Remote Control"
 msgstr ""
 
-#: app/about.c:286 app/about.c:290
+#: app/about.c:281 app/about.c:285
 msgid "Python Scripting Interface"
 msgstr "Python Skripting-Schnittstelle"
 
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:311
+#, c-format
+msgid "Development version, built %s"
+msgstr ""
+
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:328
+#, c-format
+msgid "Released %s"
+msgstr ""
+
 #: app/app.c:301
 #, c-format
 msgid ""
@@ -1656,125 +1730,134 @@ msgstr ""
 "%s\n"
 "Möchten Sie das Programm wirklich beenden?"
 
-#: app/app.c:440
+#: app/app.c:442
 msgid "Mask _Color..."
 msgstr "Masken_farbe..."
 
-#: app/app.c:456 app/app.c:1725
+#: app/app.c:458 app/app.c:1754
 msgid "Zoom _1:1"
 msgstr "_Originalgröße"
 
-#: app/app.c:460 app/app.c:1729 app/app.c:1957
+#: app/app.c:462 app/app.c:1758 app/app.c:1988
 #, fuzzy
 msgid "Metadata _Browser..."
 msgstr "/_Metadaten-Browser"
 
-#: app/app.c:465 app/app.c:1734 app/app.c:1962
+#: app/app.c:467 app/app.c:1763 app/app.c:1993
 msgid "View _Log..."
 msgstr ""
 
-#: app/app.c:649
+#: app/app.c:651
 msgid "Pi_xelwise Square"
 msgstr ""
 
-#: app/app.c:659
+#: app/app.c:661
 msgid "_Physically Square"
 msgstr ""
 
-#: app/app.c:836
+#: app/app.c:842
+msgid "Set as Default"
+msgstr "Als Vorgabe setzen"
+
+#: app/app.c:844
+msgid "Set the current view setup as the default"
+msgstr "Momentane Ansicht als Vorgabe setzen"
+
+#: app/app.c:854
 msgid "verb|Save"
 msgstr "Speichern"
 
-#: app/app.c:839 app/app.c:843
+#: app/app.c:857 app/app.c:861
 msgid "Save 3D view to an image"
 msgstr "3D-Ansicht als Bild speichern"
 
-#: app/app.c:849
-msgid "Set as Default"
-msgstr "Als Vorgabe setzen"
+#: app/app.c:869
+#, fuzzy
+msgid "_Autocrop"
+msgstr "_Auto"
 
-#: app/app.c:851
-msgid "Set the current view setup as the default"
-msgstr "Momentane Ansicht als Vorgabe setzen"
+#: app/app.c:873
+msgid "Remove white borders from exported image"
+msgstr ""
 
-#: app/app.c:940
+#: app/app.c:960
 msgid "_Show mask"
 msgstr "_Maske anzeigen"
 
-#: app/app.c:1106
+#: app/app.c:1172
 #, c-format
 msgid "Saving of 3D view to `%s' failed"
 msgstr "Das Speichern der 3D-Ansicht nach `%s' ist fehlgeschlagen"
 
-#: app/app.c:1150
+#: app/app.c:1222
 msgid "Export 3D View"
 msgstr "3D-Ansicht exportieren"
 
-#: app/app.c:1457
+#: app/app.c:1478
 #, fuzzy
 msgid "_Change Preview"
 msgstr "Keine Vorschau möglich"
 
-#: app/app.c:1583
+#: app/app.c:1606
 #, fuzzy
 msgid "Change Volume Data Preview"
 msgstr "Keine Vorschau möglich"
 
-#: app/app.c:1593
+#: app/app.c:1616
 #, fuzzy
 msgid "Preview quantity:"
 msgstr "Vorschautyp:"
 
-#: app/app.c:1603 modules/process/extend.c:267 modules/tools/linestats.c:165
+#: app/app.c:1626 modules/process/extend.c:267 modules/tools/linestats.c:165
 #: modules/volume/volume_linestat.c:142
 msgid "Mean"
 msgstr "Mittelwert"
 
-#: app/app.c:1604 modules/process/polydistort.c:255 modules/tools/filter.c:240
+#: app/app.c:1627 modules/process/polydistort.c:258 modules/tools/filter.c:241
 #: modules/tools/icolorange.c:424 modules/tools/linestats.c:167
 #: modules/volume/volume_linestat.c:144
 msgid "Minimum"
 msgstr "Minimum"
 
-#: app/app.c:1605 modules/process/col_synth.c:170 modules/tools/filter.c:241
+#: app/app.c:1628 modules/process/col_synth.c:170 modules/tools/filter.c:242
 #: modules/tools/icolorange.c:435 modules/tools/linestats.c:168
 #: modules/volume/volume_linestat.c:145
 msgid "Maximum"
 msgstr "Maximum"
 
-#: app/app.c:1606
+#: app/app.c:1629 modules/volume/volume_linestat.c:146
 #, fuzzy
 msgid "Min. position"
 msgstr "Maximaler z-Wert"
 
-#: app/app.c:1607
+#: app/app.c:1630 modules/volume/volume_linestat.c:147
 #, fuzzy
 msgid "Max. position"
 msgstr "Maximaler z-Wert"
 
-#: app/app.c:1608 modules/process/bdep_synth.c:134
-#: modules/process/col_synth.c:171 modules/process/scars.c:346
-#: modules/process/scars.c:353 modules/process/threshold.c:341
+#: app/app.c:1631 modules/process/bdep_synth.c:134
+#: modules/process/col_synth.c:171 modules/process/scars.c:369
+#: modules/process/scars.c:377 modules/process/threshold.c:336
 #, fuzzy
 msgid "RMS"
 msgstr "Quadratmittel"
 
-#: app/app.c:1609 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
-#: modules/file/xyzexport.c:233 modules/file/xyzexport.c:302
+#: app/app.c:1632 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
+#: modules/file/xyzexport.c:236 modules/file/xyzexport.c:305
 msgid "Channel:"
 msgstr "Kanal:"
 
-#: app/app.c:1610
+#: app/app.c:1633
 #, fuzzy
 msgid "Section:"
 msgstr "Richtung:"
 
-#: app/app.c:1861
+#: app/app.c:1890
 #, fuzzy
 msgid "_Update Preview"
 msgstr "Keine Vorschau möglich"
 
-#: app/app.c:1867
+#: app/app.c:1896
 #, fuzzy
 msgid "_Density Map"
 msgstr "Dich_te:"
@@ -1794,12 +1877,12 @@ msgstr "Unbekannte Linie %d"
 msgid "Unknown XYZ %d"
 msgstr "Unbekannte Linie %d"
 
-#: app/data-browser-aux.c:2795
+#: app/data-browser-aux.c:2839
 #, c-format
 msgid "Z levels: %d, Z unit: %s"
 msgstr ""
 
-#: app/data-browser-aux.c:2821
+#: app/data-browser-aux.c:2865
 #, fuzzy, c-format
 msgid "Points: %d"
 msgstr "Punkte"
@@ -1830,10 +1913,11 @@ msgid "Close file"
 msgstr "Datei schließen"
 
 #: app/data-browser.c:5582
-msgid "Channels"
-msgstr "Kanäle"
+#, fuzzy
+msgid "Images"
+msgstr "FFT Imaginärteil"
 
-#: app/data-browser.c:5596 modules/volume/volume_extract.c:444
+#: app/data-browser.c:5596 modules/volume/volume_extract.c:431
 msgid "Graphs"
 msgstr "Graphen"
 
@@ -1879,46 +1963,46 @@ msgid ""
 "%s"
 msgstr ""
 
-#: app/file.c:285
+#: app/file.c:292
 #, c-format
 msgid "Opening of `%s' failed"
 msgstr "Das Öffnen von `%s' ist fehlgeschlagen"
 
-#: app/file.c:291 app/file.c:526
+#: app/file.c:298 app/file.c:533
 #, fuzzy, c-format
 msgid "Full file path: %s."
 msgstr "Datei_typ: %s"
 
-#: app/file.c:294
+#: app/file.c:301
 #, fuzzy, c-format
 msgid "Loaded using: %s."
 msgstr "Lade Einstellungen"
 
-#: app/file.c:380
+#: app/file.c:387
 #, fuzzy
 msgid "Merge File"
 msgstr "Zusammengefügte Bilder"
 
-#: app/file.c:382 app/gwyappfilechooser.c:221
+#: app/file.c:389 app/gwyappfilechooser.c:226
 msgid "Open File"
 msgstr "Datei öffnen"
 
-#: app/file.c:520 app/gwymoduleutils.c:192
+#: app/file.c:527 app/gwymoduleutils.c:192
 #, c-format
 msgid "Saving of `%s' failed"
 msgstr "Das Speichern von `%s' ist fehlgeschlagen"
 
-#: app/file.c:529
+#: app/file.c:536
 #, c-format
 msgid "Saved using: %s."
 msgstr ""
 
-#: app/file.c:689
+#: app/file.c:696
 #, c-format
 msgid "File `%s' already exists.  Replace?"
 msgstr "Die Datei `%s' Existiert bereits.  Soll sie ersetzt werden?"
 
-#: app/file.c:693
+#: app/file.c:700
 #, c-format
 msgid ""
 "The file already exists in `%s'.  Replacing it will overwrite its contents."
@@ -1926,7 +2010,7 @@ msgstr ""
 "Die Datei existiert bereits in `%s'.  Beim Ersetzen wird ihr Inhalt "
 "überschrieben."
 
-#: app/file.c:696
+#: app/file.c:703
 msgid "Replace File?"
 msgstr "Datei ersetzen?"
 
@@ -1950,11 +2034,11 @@ msgstr "Dateiliste schließen"
 msgid "Open selected file"
 msgstr "Ausgewählte Datei öffnen"
 
-#: app/filelist.c:566 app/gwyappfilechooser.c:583
+#: app/filelist.c:566 app/gwyappfilechooser.c:592
 msgid "_Filter:"
 msgstr "_Filter:"
 
-#: app/filelist.c:604 app/gwyappfilechooser.c:619
+#: app/filelist.c:604 app/gwyappfilechooser.c:628
 msgid "Case _sensitive"
 msgstr "Groß-/Kleinschreibung _unterscheiden"
 
@@ -2005,103 +2089,103 @@ msgstr "_Kurve"
 msgid "_Snap to control points"
 msgstr "An Kontrollpunkten ein_rasten"
 
-#: app/gwyappfilechooser.c:226
+#: app/gwyappfilechooser.c:231
 msgid "Save File"
 msgstr "Datei speichern"
 
-#: app/gwyappfilechooser.c:380
+#: app/gwyappfilechooser.c:389
 #, c-format
 msgid "File _type: %s"
 msgstr "Datei_typ: %s"
 
-#: app/gwyappfilechooser.c:387
+#: app/gwyappfilechooser.c:396
 #, fuzzy
 msgid "Only loadable shown"
 msgstr "Nur ladbare Dateien anzeigen"
 
-#: app/gwyappfilechooser.c:391
+#: app/gwyappfilechooser.c:400
 #, fuzzy, c-format
 msgid "Filter: %s"
 msgstr "_Filter:"
 
-#: app/gwyappfilechooser.c:455
+#: app/gwyappfilechooser.c:464
 msgid "Automatic by extension"
 msgstr "Automatisch, nach Dateiendung"
 
-#: app/gwyappfilechooser.c:464
+#: app/gwyappfilechooser.c:473
 msgid "Automatically detected"
 msgstr "Automatisch erkennen"
 
-#: app/gwyappfilechooser.c:561
+#: app/gwyappfilechooser.c:570
 #, fuzzy
 msgid "Show only loadable files"
 msgstr "Nur ladbare Dateien anzeigen"
 
-#: app/gwyappfilechooser.c:844
+#: app/gwyappfilechooser.c:855
 msgid "Plane-level previewed data"
 msgstr ""
 
-#: app/gwyappfilechooser.c:860
+#: app/gwyappfilechooser.c:871
 #, fuzzy
 msgid "Row-level previewed data"
 msgstr "Nivellierte Daten"
 
-#: app/gwyappfilechooser.c:969
+#: app/gwyappfilechooser.c:987
+msgid "File too large for preview"
+msgstr ""
+
+#: app/gwyappfilechooser.c:988
 msgid "…"
 msgstr "..."
 
-#: app/gwyappfilechooser.c:1331
+#: app/gwyappfilechooser.c:1352
 msgid "Cannot preview"
 msgstr "Keine Vorschau möglich"
 
-#: app/gwyddion.c:143
+#: app/gwyddion.c:147
 msgid "Loading document history"
 msgstr "Lade Verlauf"
 
-#: app/gwyddion.c:148
+#: app/gwyddion.c:152
 msgid "Registering "
 msgstr "Registriere"
 
-#: app/gwyddion.c:149
+#: app/gwyddion.c:153
 #, fuzzy
 msgid "stock items"
 msgstr "Lagerbestand"
 
-#: app/gwyddion.c:153
+#: app/gwyddion.c:157
 msgid "color gradients"
 msgstr "Farb-Gradienten"
 
-#: app/gwyddion.c:155
+#: app/gwyddion.c:159
 msgid "GL materials"
 msgstr "GL Materialien"
 
-#: app/gwyddion.c:157
+#: app/gwyddion.c:161
 #, fuzzy
 msgid "grain quantities"
 msgstr "Korn-Statistiken"
 
-#: app/gwyddion.c:159
+#: app/gwyddion.c:163
 #, fuzzy
 msgid "calibrations"
 msgstr "Kalibrierungen"
 
-#: app/gwyddion.c:164
+#: app/gwyddion.c:168
 msgid "Loading settings"
 msgstr "Lade Einstellungen"
 
-#: app/gwyddion.c:171
+#: app/gwyddion.c:175
 msgid "Registering modules"
 msgstr "Registriere Module"
 
-#: app/gwyddion.c:193
-msgid "Initializing GUI"
-msgstr "Initialisiere graphische Benutzeroberfläche"
-
-#: app/gwyddion.c:439
+#: app/gwyddion.c:464
 msgid "Could not read settings."
 msgstr "Einstellungen konnten nicht gelesen werden."
 
-#: app/gwyddion.c:442
+#: app/gwyddion.c:467
 #, c-format
 msgid ""
 "Settings file `%s' cannot be read: %s\n"
@@ -2114,48 +2198,69 @@ msgstr ""
 "Um gespeicherte Einstellungen nicht zu verlieren, wird die Datei nicht "
 "aktualisiert, bis sie repariert oder gelöscht wurde."
 
-#: app/gwymoduleutils-file.c:542
+#: app/gwyddion.c:505
+#, c-format
+msgid "Many modules (%u) failed to register."
+msgstr ""
+
+#: app/gwyddion.c:510
+#, c-format
+msgid ""
+"Most likely Gwyddion was not upgraded correctly.  Instead, one installation "
+"was just overwritten with another, and now it is a mess.\n"
+"\n"
+"Please remove completely the module directory\n"
+"\n"
+"%s\n"
+"\n"
+"and reinstall Gwyddion.\n"
+"\n"
+"See Info → Module Browser for specific errors."
+msgstr ""
+
+#: app/gwymoduleutils-file.c:536
 #, c-format
 msgid "Section %s ended at line %u but it has never started."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:550
+#: app/gwymoduleutils-file.c:544
 #, c-format
 msgid "Section %s ended at line %u instead of %s."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:587
+#: app/gwymoduleutils-file.c:581
 #, c-format
 msgid "Section %s started at line %u before %s ended."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:593
+#: app/gwymoduleutils-file.c:587
 #, c-format
 msgid "Empty section name at header line %u."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:628
+#: app/gwymoduleutils-file.c:622
 #, c-format
 msgid "Header line %u lacks prefix %s."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:653
+#: app/gwymoduleutils-file.c:647
 #, c-format
 msgid "Header line %u lacks key-value separator."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:661
+#: app/gwymoduleutils-file.c:655
 #, c-format
 msgid "Key at header line %u is empty."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:688
+#: app/gwymoduleutils-file.c:682
 #, c-format
 msgid "Header suddenly ended at line %u; end of header marker is missing"
 msgstr ""
 
 #: app/gwymoduleutils.c:197 app/settings.c:131 app/settings.c:142
 #: app/toolbox-spec.c:536 modules/file/err.h:62
+#: modules/pygwy/pygwy-console.c:528
 #, c-format
 msgid "Cannot write to file: %s."
 msgstr "Kann nicht in Datei schreiben: %s."
@@ -2185,8 +2290,9 @@ msgstr "Ursprung"
 
 #: app/gwyplaintool.c:1011 modules/file/rawfile.c:997
 #: modules/process/convolution_filter.c:349
-#: modules/process/convolution_filter.c:553 modules/process/neural.c:419
-#: modules/process/obj_synth.c:538 modules/process/pat_synth.c:1449
+#: modules/process/convolution_filter.c:553 modules/process/fibre_synth.c:520
+#: modules/process/neural.c:419 modules/process/obj_synth.c:536
+#: modules/process/pat_synth.c:1450
 msgid "Size"
 msgstr "Größe"
 
@@ -2240,7 +2346,7 @@ msgstr ""
 msgid "_Close"
 msgstr "_Schließen"
 
-#: app/log.c:615 modules/file/imgexport.c:4168 modules/file/rawfile.c:996
+#: app/log.c:615 modules/file/imgexport.c:4118 modules/file/rawfile.c:996
 msgid "Type"
 msgstr "Typ"
 
@@ -2249,8 +2355,8 @@ msgstr "Typ"
 msgid "Function"
 msgstr "F_unktion:"
 
-#: app/log.c:617 modules/file/imgexport.c:3117 modules/process/fit-shape.c:465
-#: modules/process/neural.c:610 modules/tools/stats.c:425
+#: app/log.c:617 modules/file/imgexport.c:3128 modules/process/fit-shape.c:466
+#: modules/process/neural.c:614 modules/tools/stats.c:423
 msgid "Parameters"
 msgstr "Parameter"
 
@@ -2263,40 +2369,40 @@ msgstr ""
 msgid "Export Log"
 msgstr "Text exportieren"
 
-#: app/menu.c:556 app/toolbox.c:581
+#: app/menu.c:555 app/toolbox.c:595
 msgid "_Data Process"
 msgstr "_Daten aufbereiten"
 
-#: app/menu.c:598 app/toolbox.c:584
+#: app/menu.c:597 app/toolbox.c:598
 msgid "_Graph"
 msgstr "_Graph"
 
-#: app/menu.c:641 app/toolbox.c:587
+#: app/menu.c:640 app/toolbox.c:601
 msgid "_Volume Data"
 msgstr "_Volumen Daten"
 
-#: app/menu.c:684 app/toolbox.c:590
+#: app/menu.c:683 app/toolbox.c:604
 #, fuzzy
 msgid "_XYZ Data"
 msgstr "_Daten"
 
-#: app/menu.c:715
+#: app/menu.c:714
 msgid "Re-show Last"
 msgstr "Letzte Aktion erneut zeigen"
 
-#: app/menu.c:730
+#: app/menu.c:729
 msgid "Repeat Last"
 msgstr "Letzte Aktion wiederholen"
 
-#: app/menu.c:858
+#: app/menu.c:857
 msgid "Repeat"
 msgstr "Wiederholen"
 
-#: app/menu.c:864
+#: app/menu.c:863
 msgid "Re-show"
 msgstr "Erneut zeigen"
 
-#: app/menu.c:1186
+#: app/menu.c:1185
 msgid "_Document history"
 msgstr "_Verlauf"
 
@@ -2304,8 +2410,8 @@ msgstr "_Verlauf"
 msgid "_New"
 msgstr "_Neu"
 
-#: app/meta.c:235 modules/file/imgexport.c:4672 modules/file/rawfile.c:1058
-#: modules/process/neural.c:711 modules/tools/selectionmanager.c:405
+#: app/meta.c:235 modules/file/imgexport.c:4620 modules/file/rawfile.c:1058
+#: modules/process/neural.c:718 modules/tools/selectionmanager.c:405
 msgid "_Delete"
 msgstr "_Löschen"
 
@@ -2379,11 +2485,11 @@ msgstr "Kann Benutzer-Konfigurationsverzeichnis nicht anlegen %s: %s"
 msgid "Cannot create user module directory %s: %s"
 msgstr "Kann Benutzer-Modulverzeichnis nicht anlegen %s: %s"
 
-#: app/splash.c:832
+#: app/splash.c:1260
 msgid "Starting "
 msgstr "Starte"
 
-#: app/splash.c:878
+#: app/splash.c:1313
 msgid " is free software released under GNU GPL."
 msgstr " ist freie Software, veröffentlicht unter der GNU GPL."
 
@@ -2789,135 +2895,136 @@ msgstr "_Nächster Tipp"
 msgid "_Show tips at startup"
 msgstr ""
 
-#: app/toolbox-editor.c:212
+#: app/toolbox-editor.c:213
 #, fuzzy
 msgid "Toolbox Editor"
 msgstr "Editor"
 
-#: app/toolbox-editor.c:257
+#: app/toolbox-editor.c:258
 #, fuzzy
 msgid "_New Item"
 msgstr "Neues Element"
 
-#: app/toolbox-editor.c:262
+#: app/toolbox-editor.c:263
 #, fuzzy
 msgid "_New Group"
 msgstr "Graph"
 
-#: app/toolbox-editor.c:268 app/toolbox.c:577
+#: app/toolbox-editor.c:269 app/toolbox.c:591
 msgid "_Edit"
 msgstr "_Bearbeiten"
 
-#: app/toolbox-editor.c:273 modules/process/fft_filter_2d.c:499
-#: modules/tools/maskedit.c:548 modules/volume/volume_zcal.c:173
+#: app/toolbox-editor.c:274 modules/process/fft_filter_2d.c:499
+#: modules/tools/maskedit.c:554 modules/volume/volume_zcal.c:173
 msgid "_Remove"
 msgstr "_Entfernen"
 
-#: app/toolbox-editor.c:278
+#: app/toolbox-editor.c:279
 msgid "Move _Up"
 msgstr ""
 
-#: app/toolbox-editor.c:283
+#: app/toolbox-editor.c:284
 #, fuzzy
 msgid "Move _Down"
 msgstr "Runter"
 
-#: app/toolbox-editor.c:292 modules/file/hdrimage.cc:2304
-#: modules/file/imgexport.c:3101 modules/file/pixmap.c:872
+#: app/toolbox-editor.c:293 modules/file/hdrimage.cc:2304
+#: modules/file/imgexport.c:3114 modules/file/pixmap.c:872
 #: modules/file/rawfile.c:658 modules/process/crosscor.c:252
-#: modules/process/dimensions.h:473 modules/process/tip_blind.c:333
+#: modules/process/dimensions.h:455 modules/process/fibre_synth.c:526
+#: modules/process/tip_blind.c:334
 msgid "_Width:"
 msgstr "_Breite:"
 
-#: app/toolbox-editor.c:774
+#: app/toolbox-editor.c:787
 msgid "Toolbox Group"
 msgstr ""
 
-#: app/toolbox-editor.c:791 modules/file/rawgraph.c:267
+#: app/toolbox-editor.c:804 modules/file/rawgraph.c:267
 msgid "_Title:"
 msgstr "_Titel:"
 
-#: app/toolbox-editor.c:805
+#: app/toolbox-editor.c:818
 msgid "_Id:"
 msgstr ""
 
-#: app/toolbox-editor.c:818
+#: app/toolbox-editor.c:831
 msgid "_Suggest"
 msgstr ""
 
-#: app/toolbox-editor.c:824
+#: app/toolbox-editor.c:837
 msgid "Trans_latable title"
 msgstr ""
 
-#: app/toolbox-editor.c:874
+#: app/toolbox-editor.c:887
 msgid "Group id is not a valid identifier"
 msgstr ""
 
-#: app/toolbox-editor.c:882
+#: app/toolbox-editor.c:895
 msgid "Group id is not unique"
 msgstr ""
 
-#: app/toolbox-editor.c:971
+#: app/toolbox-editor.c:984
 msgid "Toolbox Item"
 msgstr ""
 
-#: app/toolbox-editor.c:992 modules/process/coerce.c:331
+#: app/toolbox-editor.c:1005 modules/process/coerce.c:331
 #: modules/tools/filter.c:284
 msgid "_Type:"
 msgstr "_Typ:"
 
-#: app/toolbox-editor.c:999
+#: app/toolbox-editor.c:1012
 msgid "Placeholder"
 msgstr ""
 
-#: app/toolbox-editor.c:1000
+#: app/toolbox-editor.c:1013
 msgid "Builtin"
 msgstr ""
 
-#: app/toolbox-editor.c:1001 app/toolbox.c:107
+#: app/toolbox-editor.c:1014 app/toolbox.c:112
 msgid "Data Process"
 msgstr "Daten aufbereiten"
 
-#: app/toolbox-editor.c:1003
+#: app/toolbox-editor.c:1016
 #, fuzzy
 msgid "Volume Data"
 msgstr "_Volumen Daten"
 
-#: app/toolbox-editor.c:1004
+#: app/toolbox-editor.c:1017
 #, fuzzy
 msgid "XYZ Data"
 msgstr "_Daten"
 
-#: app/toolbox-editor.c:1005
+#: app/toolbox-editor.c:1018
 #, fuzzy
 msgid "Tool"
 msgstr "Werkzeuge"
 
-#: app/toolbox-editor.c:1012
+#: app/toolbox-editor.c:1025 modules/tools/profile.c:483
 #, fuzzy
 msgid "_Mode:"
 msgstr "Modus:"
 
-#: app/toolbox-editor.c:1019 app/toolbox-editor.c:1038
+#: app/toolbox-editor.c:1032 app/toolbox-editor.c:1051
 #, fuzzy
 msgid "Default"
 msgstr "_Standard"
 
-#: app/toolbox-editor.c:1020
+#: app/toolbox-editor.c:1033
 #, fuzzy
 msgid "Interactive"
 msgstr "Interpolationstyp:"
 
-#: app/toolbox-editor.c:1021
+#: app/toolbox-editor.c:1034
 #, fuzzy
 msgid "Non-interactive"
 msgstr "Negativ"
 
-#: app/toolbox-editor.c:1029
+#: app/toolbox-editor.c:1042
 msgid "Use _icon from:"
 msgstr ""
 
-#: app/toolbox-editor.c:1063
+#: app/toolbox-editor.c:1076
 #, fuzzy
 msgid "Functions"
 msgstr "F_unktion:"
@@ -2935,145 +3042,164 @@ msgstr "Fit-Modus"
 msgid "All tools not placed explicitly go here."
 msgstr ""
 
-#: app/toolbox.c:106
+#: app/toolbox.c:111
 msgid "View"
 msgstr "Ansicht"
 
-#: app/toolbox.c:109
+#: app/toolbox.c:114
 msgid "Tools"
 msgstr "Werkzeuge"
 
-#: app/toolbox.c:575
+#: app/toolbox.c:589
 msgid "_File"
 msgstr "_Datei"
 
-#: app/toolbox.c:593
+#: app/toolbox.c:607
 #, fuzzy
 msgid "_Info"
 msgstr "Info"
 
-#: app/toolbox.c:663
+#: app/toolbox.c:696
 msgid "Display a 3D view of data"
 msgstr "3D-Ansicht der Daten anzeigen"
 
-#: app/toolbox.c:667
+#: app/toolbox.c:700
+#, fuzzy
+msgid "Undo"
+msgstr "_Rückgängig"
+
+#: app/toolbox.c:700
+#, fuzzy
+msgid "Undo last action"
+msgstr "Ebenen-Fit Modus"
+
+#: app/toolbox.c:704
+#, fuzzy
+msgid "Redo"
+msgstr "/_Wiederholen"
+
+#: app/toolbox.c:704
+msgid "Redo again last undone action"
+msgstr ""
+
+#: app/toolbox.c:708
 msgid "Zoom in"
 msgstr "Hereinzoomen"
 
-#: app/toolbox.c:671
+#: app/toolbox.c:712
 msgid "Zoom out"
 msgstr "Herauszoomen"
 
-#: app/toolbox.c:675
+#: app/toolbox.c:716
 msgid "Zoom 1:1"
 msgstr "Zoom 1:1"
 
-#: app/toolbox.c:722
+#: app/toolbox.c:781
 msgid "/Show _Data Browser"
 msgstr "/_Daten-Browser"
 
-#: app/toolbox.c:730
+#: app/toolbox.c:789
 msgid "/Module _Browser"
 msgstr "/Modul-_Browser"
 
-#: app/toolbox.c:738
+#: app/toolbox.c:797
 msgid "/Program _Messages"
 msgstr ""
 
-#: app/toolbox.c:753
+#: app/toolbox.c:812
 msgid "/_User Guide"
 msgstr ""
 
-#: app/toolbox.c:761
+#: app/toolbox.c:820
 msgid "/_Tip of the Day"
 msgstr "/_Tipp des Tages"
 
-#: app/toolbox.c:769
+#: app/toolbox.c:828
 msgid "/_About Gwyddion"
 msgstr "/_Über Gwyddion"
 
-#: app/toolbox.c:806
+#: app/toolbox.c:865
 msgid "/_Open..."
 msgstr "/_Öffnen..."
 
-#: app/toolbox.c:814
+#: app/toolbox.c:873
 msgid "/_Merge..."
 msgstr "/Zusa_mmenführen..."
 
-#: app/toolbox.c:822
+#: app/toolbox.c:881
 msgid "/Open _Recent"
 msgstr "/_Zuletzt geöffnet"
 
-#: app/toolbox.c:830
+#: app/toolbox.c:889
 msgid "/_Save"
 msgstr "/_Speichern"
 
-#: app/toolbox.c:838
+#: app/toolbox.c:897
 msgid "/Save _As..."
 msgstr "/Speichern _unter..."
 
-#: app/toolbox.c:846
+#: app/toolbox.c:905
 #, fuzzy
 msgid "/_Close"
 msgstr "_Schließen"
 
-#: app/toolbox.c:854
+#: app/toolbox.c:913
 msgid "/Remo_ve All Logs"
 msgstr "/Alle Protokolle _entfernen"
 
-#: app/toolbox.c:870
+#: app/toolbox.c:929
 msgid "/_Quit"
 msgstr "/_Beenden"
 
-#: app/toolbox.c:910
+#: app/toolbox.c:969
 msgid "/_Undo"
 msgstr "/_Rückgängig"
 
-#: app/toolbox.c:918
+#: app/toolbox.c:977
 msgid "/_Redo"
 msgstr "/_Wiederholen"
 
-#: app/toolbox.c:934
+#: app/toolbox.c:993
 msgid "/Default Mask _Color..."
 msgstr "/Standard-Masken_farbe..."
 
-#: app/toolbox.c:942
+#: app/toolbox.c:1001
 msgid "/Color _Gradients..."
 msgstr "/Farb-_Gradienten..."
 
-#: app/toolbox.c:950
+#: app/toolbox.c:1009
 msgid "/G_L Materials..."
 msgstr "/G_L-Materialien..."
 
-#: app/toolbox.c:958
+#: app/toolbox.c:1017
 msgid "/_Toolbox..."
 msgstr ""
 
-#: app/toolbox.c:966
+#: app/toolbox.c:1025
 msgid "/_Keyboard Shortcuts"
 msgstr "/Tasten_kürzel"
 
-#: app/toolbox.c:974
+#: app/toolbox.c:1033
 msgid "/_Logging Enabled"
 msgstr "/_Protokollierung aktiviert"
 
-#: app/toolbox.c:1083
+#: app/toolbox.c:1142
 msgid "Program Messages"
 msgstr ""
 
-#: app/toolbox.c:1320
+#: app/toolbox.c:1379
 msgid "Change Default Mask Color"
 msgstr "Standard-Maskenfarbe ändern"
 
-#: app/toolbox.c:1348
+#: app/toolbox.c:1407
 msgid "OpenGL 3D graphics not available"
 msgstr "OpenGL 3D-Grafiken nicht verfügbar"
 
-#: app/toolbox.c:1353
+#: app/toolbox.c:1412
 msgid "OpenGL was disabled with a command-line option."
 msgstr "OpenGL wurde mit einem Kommandozeilen-Parameter deaktiviert."
 
-#: app/toolbox.c:1361
+#: app/toolbox.c:1420
 msgid ""
 "Initialization of OpenGL failed.  Check output of <tt>glxinfo</tt> and "
 "warning messages printed to console during Gwyddion startup."
@@ -3082,7 +3208,7 @@ msgstr ""
 "<tt>glxinfo</tt> sowie Warnmeldungen auf der Konsole während des "
 "Startvorgangs von Gwyddion."
 
-#: app/toolbox.c:1368
+#: app/toolbox.c:1427
 msgid "This version of Gwyddion was built without OpenGL support."
 msgstr "Diese Version von Gwyddion wurde ohne OpenGL-Unterstützung erstellt."
 
@@ -3159,7 +3285,7 @@ msgstr ""
 msgid "Secondary data item has no primary data"
 msgstr ""
 
-#: app/wait.c:106
+#: app/wait.c:114
 msgid "Please wait"
 msgstr "Bitte warten"
 
@@ -3178,11 +3304,11 @@ msgstr "MicroProf FRT-Textdateien (.txt)."
 msgid "File header cannot be converted from ISO-8859-1 character set: %s"
 msgstr ""
 
-#: modules/file/aistfile.c:127
+#: modules/file/aistfile.c:123
 msgid "Imports AIST-NT data files."
 msgstr "Importiert AIST-NT-Dateien."
 
-#: modules/file/aistfile.c:140
+#: modules/file/aistfile.c:136
 msgid "AIST-NT files (.aist)"
 msgstr "AIST-NT-Dateien (.aist)"
 
@@ -3231,7 +3357,8 @@ msgstr ""
 
 #: modules/file/alicona.c:665 modules/file/gdeffile.c:175
 #: modules/file/gdeffile.c:199 modules/file/gsffile.c:159
-#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1038
+#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1174
+#: modules/file/microprof.c:361 modules/file/microprof.c:375
 #: modules/file/pt3file.c:489 modules/file/pt3file.c:591
 msgid "File header is truncated."
 msgstr ""
@@ -3245,11 +3372,11 @@ msgstr ""
 msgid "Comment is not nul-terminated."
 msgstr "Der T2-Messungs-Modus ist nicht implementiert."
 
-#: modules/file/ambfile.c:84
+#: modules/file/ambfile.c:83
 msgid "Imports Ambios AMB data files."
 msgstr "Importiert Ambios AMB-Dateien."
 
-#: modules/file/ambfile.c:97
+#: modules/file/ambfile.c:96
 msgid "Ambios amb files (.amb)"
 msgstr "Ambios AMB-Dateien (.amb)"
 
@@ -3281,12 +3408,12 @@ msgstr ""
 msgid "FileDescBegin has no corresponding FileDescEnd."
 msgstr ""
 
-#: modules/file/apedaxfile.c:259
+#: modules/file/apedaxfile.c:261
 #, fuzzy
 msgid "Imports A.P.E. Research DAX data files."
 msgstr "Importiert LEXT-Dateien."
 
-#: modules/file/apedaxfile.c:274
+#: modules/file/apedaxfile.c:276
 #, fuzzy
 msgid "A.P.E. Research DAX Files (.dax) and APDT File (.apdt)"
 msgstr "Importiert LEXT-Dateien."
@@ -3315,7 +3442,7 @@ msgstr "Breite:"
 msgid "Height:"
 msgstr "Höhe:"
 
-#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:248
+#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:251
 msgid "Value units:"
 msgstr ""
 
@@ -3324,30 +3451,30 @@ msgid "Export Text"
 msgstr "Text exportieren"
 
 #: modules/file/asciiexport.c:275 modules/file/gxyzffile.c:402
-#: modules/file/imgexport.c:3565 modules/file/imgexport.c:4203
-#: modules/file/rawfile.c:758 modules/file/xyzexport.c:311
-#: modules/process/calibrate.c:607 modules/process/coerce.c:364
-#: modules/process/col_synth.c:516 modules/process/correct_affine.c:470
-#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:261
-#: modules/process/grain_dist.c:306 modules/process/grain_edge.c:255
-#: modules/process/grain_mark.c:338 modules/process/grain_wshed.c:252
-#: modules/process/linematch.c:852 modules/process/mark_disconn.c:279
-#: modules/process/slope_dist.c:367 modules/process/tip_blind.c:357
+#: modules/file/imgexport.c:3532 modules/file/imgexport.c:4151
+#: modules/file/rawfile.c:758 modules/file/xyzexport.c:314
+#: modules/process/calibrate.c:561 modules/process/coerce.c:363
+#: modules/process/col_synth.c:516 modules/process/correct_affine.c:520
+#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:263
+#: modules/process/grain_dist.c:307 modules/process/grain_edge.c:254
+#: modules/process/grain_mark.c:335 modules/process/grain_wshed.c:256
+#: modules/process/linematch.c:819 modules/process/mark_disconn.c:280
+#: modules/process/slope_dist.c:359 modules/process/tip_blind.c:360
 #: modules/process/wpour_mark.c:354 modules/tools/spotremove.c:322
-#: modules/tools/stats.c:402 modules/xyz/xyz_raster.c:628
+#: modules/tools/stats.c:401 modules/xyz/xyz_raster.c:597
 msgid "Options"
 msgstr "Optionen"
 
-#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:314
+#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:317
 msgid "Use _dot as decimal separator"
 msgstr ""
 
-#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:321
-#: modules/process/grain_dist.c:317
+#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:324
+#: modules/process/grain_dist.c:318
 msgid "Add _informational comment header"
 msgstr ""
 
-#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:330
+#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:333
 #, fuzzy
 msgid "_Precision:"
 msgstr "_Genauigkeit:"
@@ -3368,20 +3495,20 @@ msgstr "Importiert Attocube Systems ASC-Dateien."
 msgid "Attocube ASCII files (.asc)"
 msgstr "Attocube ASCII-Dateien (.asc)"
 
-#: modules/file/bcrfile.c:146
+#: modules/file/bcrfile.c:141
 msgid "Imports Image Metrology BCR data files."
 msgstr "Importiert Image Metrology BCR-Dateien."
 
-#: modules/file/bcrfile.c:159
+#: modules/file/bcrfile.c:154
 msgid "BCR files (.bcr, .bcrf)"
 msgstr "BCR-Dateien (.bcr, .bcrf)"
 
-#: modules/file/bcrfile.c:238
+#: modules/file/bcrfile.c:233
 #, c-format
 msgid "File header is not convertible from UTF-16: %s"
 msgstr ""
 
-#: modules/file/bcrfile.c:351
+#: modules/file/bcrfile.c:346
 #, c-format
 msgid "Unknown file type header: `%s'."
 msgstr "Unbekannte Dateityp-Kopfzeile: `%s'."
@@ -3416,7 +3543,7 @@ msgid "Burleigh exported data (.txt, .bin)"
 msgstr ""
 
 #: modules/file/burleigh_exp.c:226 modules/file/burleigh_exp.c:267
-#: modules/file/nanoscope.c:1605 modules/file/omicron.c:416
+#: modules/file/nanoscope.c:1612 modules/file/omicron.c:416
 #: modules/file/shimadzu.c:468
 msgid "Missing colon in header line."
 msgstr ""
@@ -3466,24 +3593,44 @@ msgstr "Importiert Benyuan CSM-Dateien."
 msgid "Benyuan CSM files (.csm)"
 msgstr "Benyuan CSM-Dateien (.csm)"
 
-#: modules/file/dektakxml.c:138
+#: modules/file/dektakvca.c:197
+#, fuzzy
+msgid "Imports Dektak OPDx data files."
+msgstr "Importiert DME MIF-Dateien."
+
+#: modules/file/dektakvca.c:210
+#, fuzzy
+msgid "Dektak OPDx data files (.OPDx)"
+msgstr "NanoScan XML-Dateien (.xml)"
+
+#: modules/file/dektakvca.c:655
+#, c-format
+msgid "Item `%s' has unexpected type %u instead of %u."
+msgstr ""
+
+#: modules/file/dektakvca.c:1022
+#, c-format
+msgid "Truncated data inside item %s."
+msgstr ""
+
+#: modules/file/dektakxml.c:118
 #, fuzzy
 msgid "Imports Dektak XML data files."
 msgstr "Importiert DME MIF-Dateien."
 
-#: modules/file/dektakxml.c:151
+#: modules/file/dektakxml.c:131
 #, fuzzy
 msgid "Dektak XML data files (.xml)"
 msgstr "NanoScan XML-Dateien (.xml)"
 
-#: modules/file/dektakxml.c:228 modules/file/lextfile.c:260
-#: modules/file/nanoscan.c:267 modules/file/ometiff.c:265
+#: modules/file/dektakxml.c:208 modules/file/lextfile.c:260
+#: modules/file/nanoscan.c:270 modules/file/ometiff.c:265
 #, c-format
 msgid "XML parsing failed: %s"
 msgstr ""
 
-#: modules/file/dektakxml.c:400 modules/file/lextfile.c:163
-#: modules/file/nanoscan.c:672 modules/file/ometiff.c:445
+#: modules/file/dektakxml.c:373 modules/file/lextfile.c:163
+#: modules/file/nanoscan.c:698 modules/file/ometiff.c:445
 #, c-format
 msgid "Top-level element is not ‘%s’."
 msgstr ""
@@ -3600,7 +3747,7 @@ msgid "Scan size header field overlaps with data."
 msgstr "Kopfzeilen-Feld der Scangröße überlappt mit Daten."
 
 #: modules/file/err.h:48 modules/file/nrrdfile.c:779
-#: modules/file/nrrdfile.c:824
+#: modules/file/nrrdfile.c:824 modules/pygwy/pygwy-console.c:504
 #, fuzzy, c-format
 msgid "Cannot read from file: %s."
 msgstr "Kann nicht in Datei schreiben: %s."
@@ -3823,32 +3970,32 @@ msgid ""
 "Data deserialization succeeded, but resulted in an unexpected object %s."
 msgstr ""
 
-#: modules/file/gwytiff.h:332
+#: modules/file/gwytiff.h:335
 #, c-format
 msgid "BigTIFF reserved fields are %u and %u instead of 8 and 0."
 msgstr ""
 
-#: modules/file/gwytiff.h:349 modules/file/gwytiff.h:366
+#: modules/file/gwytiff.h:352 modules/file/gwytiff.h:369
 #, c-format
 msgid "TIFF directory %lu ended unexpectedly."
 msgstr ""
 
-#: modules/file/gwytiff.h:484
+#: modules/file/gwytiff.h:487
 #, c-format
 msgid "BigTIFF data type %u was found in a classic TIFF."
 msgstr ""
 
-#: modules/file/gwytiff.h:501
+#: modules/file/gwytiff.h:504
 msgid "Invalid tag data positions were found."
 msgstr ""
 
-#: modules/file/gwytiff.h:874 modules/file/gwytiff.h:889
-#: modules/file/gwytiff.h:1012 modules/file/gwytiff.h:1019
+#: modules/file/gwytiff.h:877 modules/file/gwytiff.h:892
+#: modules/file/gwytiff.h:1015 modules/file/gwytiff.h:1022
 #, c-format
 msgid "Required tag %u was not found."
 msgstr ""
 
-#: modules/file/gwytiff.h:942 modules/file/gwytiff.h:986
+#: modules/file/gwytiff.h:945 modules/file/gwytiff.h:989
 #: modules/file/keyence.c:449 modules/file/matfile.c:276
 #: modules/file/matfile.c:298 modules/file/omicronflat.c:1962
 #: modules/file/princetonspe.c:339 modules/file/psia.c:352
@@ -3856,21 +4003,21 @@ msgstr ""
 msgid "File is truncated."
 msgstr ""
 
-#: modules/file/gwytiff.h:1044
+#: modules/file/gwytiff.h:1047
 msgid "Non-uniform bits per sample are unsupported."
 msgstr ""
 
-#: modules/file/gwytiff.h:1071
+#: modules/file/gwytiff.h:1074 modules/file/zeisslsm.c:973
 #, c-format
 msgid "Compression type %u is not supported."
 msgstr ""
 
-#: modules/file/gwytiff.h:1077
+#: modules/file/gwytiff.h:1080
 #, c-format
 msgid "Planar configuration %u is not supported."
 msgstr ""
 
-#: modules/file/gwytiff.h:1101
+#: modules/file/gwytiff.h:1104
 msgid "Unsupported sample format"
 msgstr ""
 
@@ -3911,7 +4058,7 @@ msgstr "X-Fehler %d"
 msgid "Minizip error while reading the zip file: %s (%d)."
 msgstr ""
 
-#: modules/file/gwyzip.h:248
+#: modules/file/gwyzip.h:248 modules/file/jpkscan.c:2776
 #, c-format
 msgid "File %s is missing in the zip file."
 msgstr ""
@@ -3951,8 +4098,8 @@ msgstr ""
 msgid "Export GXYZF"
 msgstr "Text exportieren"
 
-#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:238
-#: modules/file/xyzexport.c:304
+#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:241
+#: modules/file/xyzexport.c:307
 #, fuzzy
 msgid "XYZ data:"
 msgstr "XYZ-Dateien"
@@ -4045,11 +4192,13 @@ msgstr "_Skala:"
 msgid "Representable"
 msgstr ""
 
-#: modules/file/hdrimage.cc:480 modules/tools/stats.c:203
+#: modules/file/hdrimage.cc:480 modules/graph/graph_stats.c:146
+#: modules/tools/stats.c:203
 msgid "Minimum:"
 msgstr "Minimum:"
 
-#: modules/file/hdrimage.cc:496 modules/tools/stats.c:204
+#: modules/file/hdrimage.cc:496 modules/graph/graph_stats.c:147
+#: modules/tools/stats.c:204
 msgid "Maximum:"
 msgstr "Maximum:"
 
@@ -4068,12 +4217,12 @@ msgid "OpenEXR data type %u is invalid or unsupported."
 msgstr "Der Datentyp %d ist ungültig oder wird nicht unterstützt."
 
 #: modules/file/hdrimage.cc:1433 modules/file/hdrimage.cc:1442
-#: modules/file/imgexport.c:5249 modules/file/imgexport.c:5260
+#: modules/file/imgexport.c:5198 modules/file/imgexport.c:5209
 #, c-format
 msgid "libpng initialization error (in %s)"
 msgstr ""
 
-#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5324
+#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5273
 msgid "libpng error occurred"
 msgstr ""
 
@@ -4091,11 +4240,6 @@ msgstr "Bildinformation"
 msgid "Horizontal size:"
 msgstr "Horizontale Größe:"
 
-#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
-#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
-msgid "px"
-msgstr "px"
-
 #: modules/file/hdrimage.cc:2252 modules/file/pixmap.c:826
 msgid "Vertical size:"
 msgstr "Vertikale Größe:"
@@ -4108,10 +4252,10 @@ msgstr "Kanäle:"
 msgid "Pages:"
 msgstr ""
 
-#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3043
+#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3059
 #: modules/file/pixmap.c:862 modules/file/rawfile.c:649
-#: modules/process/dimensions.h:467 modules/xyz/xyz_drift.c:774
-#: modules/xyz/xyz_raster.c:566
+#: modules/process/dimensions.h:449 modules/xyz/xyz_drift.c:774
+#: modules/xyz/xyz_raster.c:535
 msgid "Physical Dimensions"
 msgstr "Physische Abmessungen"
 
@@ -4121,16 +4265,16 @@ msgstr "Physische Abmessungen"
 #: modules/process/calcoefs_new.c:408 modules/process/calcoefs_new.c:475
 #: modules/process/calcoefs_simple.c:391 modules/process/calcoefs_simple.c:458
 #: modules/process/calcoefs_view.c:511 modules/process/calcoefs_view.c:549
-#: modules/process/calibrate.c:466 modules/process/calibrate.c:549
-#: modules/process/dimensions.h:161 modules/process/volumize_layers.c:259
-#: modules/volume/volume_calibrate.c:414 modules/volume/volume_calibrate.c:441
-#: modules/volume/volume_calibrate.c:468 modules/volume/volume_calibrate.c:546
+#: modules/process/calibrate.c:459 modules/process/calibrate.c:514
+#: modules/process/dimensions.h:143 modules/process/volumize_layers.c:259
+#: modules/volume/volume_calibrate.c:409 modules/volume/volume_calibrate.c:429
+#: modules/volume/volume_calibrate.c:449 modules/volume/volume_calibrate.c:498
 msgid "verb|Change"
 msgstr "Ändern"
 
 #: modules/file/hdrimage.cc:2345 modules/file/pixmap.c:907
-#: modules/file/rawfile.c:694 modules/process/crosscor.c:263
-#: modules/process/dimensions.h:477
+#: modules/file/rawfile.c:694 modules/process/crosscor.c:260
+#: modules/process/dimensions.h:459
 msgid "H_eight:"
 msgstr "H_öhe:"
 
@@ -4147,16 +4291,16 @@ msgstr "_Z-Skalierung (pro Abtast-Einheit):"
 #: modules/file/hdrimage.cc:2557 modules/file/pixmap.c:1176
 #: modules/file/rawfile.c:1386 modules/process/calcoefs_new.c:819
 #: modules/process/calcoefs_simple.c:1197 modules/process/calcoefs_view.c:1380
-#: modules/process/calibrate.c:979 modules/process/dimensions.h:195
-#: modules/process/volumize_layers.c:315 modules/volume/volume_calibrate.c:1017
+#: modules/process/calibrate.c:1013 modules/process/dimensions.h:177
+#: modules/process/volumize_layers.c:314 modules/volume/volume_calibrate.c:957
 msgid "Change Units"
 msgstr "Einheiten ändern"
 
 #: modules/file/hdrimage.cc:2571 modules/file/pixmap.c:1190
 #: modules/file/rawfile.c:1400 modules/process/calcoefs_new.c:832
 #: modules/process/calcoefs_simple.c:1210 modules/process/calcoefs_view.c:1393
-#: modules/process/calibrate.c:993 modules/process/dimensions.h:208
-#: modules/process/volumize_layers.c:329 modules/volume/volume_calibrate.c:1031
+#: modules/process/calibrate.c:1027 modules/process/dimensions.h:190
+#: modules/process/volumize_layers.c:328 modules/volume/volume_calibrate.c:971
 #, fuzzy
 msgid "New _units:"
 msgstr "Neue _Einheiten:"
@@ -4203,199 +4347,200 @@ msgstr "Kann nicht in Datei schreiben: %s."
 msgid "Field DataSize %ux%u does not match image dimensions %ux%u."
 msgstr ""
 
-#: modules/file/igorfile.c:200
+#: modules/file/igorfile.c:210
 msgid "Imports Igor binary waves (.ibw)."
 msgstr "Importiert \"Igor Binary Waves\" (.ibw)"
 
-#: modules/file/igorfile.c:213
+#: modules/file/igorfile.c:223
 msgid "Igor binary waves (.ibw)"
 msgstr "Igor Binary Waves (.ibw)"
 
-#: modules/file/igorfile.c:273
+#: modules/file/igorfile.c:283
 #, fuzzy, c-format
 msgid "Format version is %d.  Only version 5 is supported."
 msgstr "Das Dateiformat der Version %d. Nur Version5 wird unterstützt."
 
-#: modules/file/igorfile.c:294
+#: modules/file/igorfile.c:305
 msgid "Only two-dimensional data are supported."
 msgstr "Nur zweidimensionale Daten werden unterstützt."
 
-#: modules/file/igorfile.c:306
+#: modules/file/igorfile.c:317
 #, c-format
 msgid "Number of data points %u does not match resolutions %u×%u×%u."
 msgstr ""
 
-#: modules/file/igorfile.c:320
+#: modules/file/igorfile.c:331
 #, c-format
 msgid "Data size %u does not match the number of data points %u×%u."
 msgstr ""
 
-#: modules/file/igorfile.c:358
+#: modules/file/igorfile.c:369
 msgid "Cannot read channel labels."
 msgstr ""
 
-#: modules/file/imgexport.c:392 modules/file/pixmap.c:178
+#: modules/file/imgexport.c:391 modules/file/pixmap.c:178
 msgid "Portable Network Graphics (.png)"
 msgstr "Portable Network Graphics (.png)"
 
-#: modules/file/imgexport.c:398 modules/file/pixmap.c:182
+#: modules/file/imgexport.c:397 modules/file/pixmap.c:182
 msgid "JPEG (.jpeg,.jpg)"
 msgstr "JPEG (.jpeg,.jpg)"
 
-#: modules/file/imgexport.c:404 modules/file/pixmap.c:186
+#: modules/file/imgexport.c:403 modules/file/pixmap.c:186
 msgid "TIFF (.tiff,.tif)"
 msgstr "TIFF (.tiff,.tif)"
 
-#: modules/file/imgexport.c:410 modules/file/pixmap.c:190
+#: modules/file/imgexport.c:409 modules/file/pixmap.c:190
 msgid "Portable Pixmap (.ppm,.pnm)"
 msgstr "Portable Pixmap (.ppm,.pnm)"
 
-#: modules/file/imgexport.c:416 modules/file/pixmap.c:194
+#: modules/file/imgexport.c:415 modules/file/pixmap.c:194
 msgid "Windows or OS2 Bitmap (.bmp)"
 msgstr "Windows- oder OS2-Bitmap (.bmp)"
 
-#: modules/file/imgexport.c:422 modules/file/pixmap.c:198
+#: modules/file/imgexport.c:421 modules/file/pixmap.c:198
 msgid "TARGA (.tga,.targa)"
 msgstr "TARGA (.tga,.targa)"
 
-#: modules/file/imgexport.c:429
+#: modules/file/imgexport.c:428
 msgid "WebP (.webp)"
 msgstr ""
 
-#: modules/file/imgexport.c:437
+#: modules/file/imgexport.c:436
 #, fuzzy
 msgid "Portable document format (.pdf)"
 msgstr "Portable Network Graphics (.png)"
 
-#: modules/file/imgexport.c:445
+#: modules/file/imgexport.c:444
 msgid "Encapsulated PostScript (.eps)"
 msgstr ""
 
-#: modules/file/imgexport.c:453
+#: modules/file/imgexport.c:452
 #, fuzzy
 msgid "Scalable Vector Graphics (.svg)"
 msgstr "Portable Network Graphics (.png)"
 
-#: modules/file/imgexport.c:463 modules/tools/selectionmanager.c:269
+#: modules/file/imgexport.c:462 modules/tools/selectionmanager.c:269
 #, fuzzy
 msgid "Horiz./vert. lines"
 msgstr "Drift-_Linien"
 
-#: modules/file/imgexport.c:467 modules/tools/selectionmanager.c:270
+#: modules/file/imgexport.c:466 modules/tools/selectionmanager.c:270
 msgid "Ellipses"
 msgstr "Ellipsen"
 
-#: modules/file/imgexport.c:471 modules/tools/selectionmanager.c:272
+#: modules/file/imgexport.c:470 modules/tools/selectionmanager.c:272
 msgid "Lines"
 msgstr "Linien"
 
-#: modules/file/imgexport.c:479 modules/tools/selectionmanager.c:275
+#: modules/file/imgexport.c:478 modules/tools/selectionmanager.c:275
 msgid "Rectangles"
 msgstr "Rechtecke"
 
-#: modules/file/imgexport.c:483 modules/process/lat_synth.c:565
+#: modules/file/imgexport.c:482 modules/process/lat_synth.c:565
 #: modules/process/lat_synth.c:637 modules/tools/selectionmanager.c:271
 #, fuzzy
 msgid "Lattice"
 msgstr "_Linientyp:"
 
-#: modules/file/imgexport.c:487
+#: modules/file/imgexport.c:486
 msgid "Path"
 msgstr ""
 
-#: modules/file/imgexport.c:493 modules/file/imgexport.c:499
+#: modules/file/imgexport.c:492 modules/file/imgexport.c:498
 #, fuzzy
 msgid "ruler|_None"
 msgstr "_Keine"
 
-#: modules/file/imgexport.c:494
+#: modules/file/imgexport.c:493
 msgid "_Rulers"
 msgstr ""
 
-#: modules/file/imgexport.c:495
+#: modules/file/imgexport.c:494
 msgid "_Inset scale bar"
 msgstr ""
 
-#: modules/file/imgexport.c:500
+#: modules/file/imgexport.c:499
 msgid "_False color ruler"
 msgstr ""
 
-#: modules/file/imgexport.c:504
+#: modules/file/imgexport.c:503
 #, fuzzy
 msgid "title|None"
 msgstr "_Keine"
 
-#: modules/file/imgexport.c:505
+#: modules/file/imgexport.c:504
 msgid "At the top"
 msgstr ""
 
-#: modules/file/imgexport.c:506
+#: modules/file/imgexport.c:505
 msgid "Along the right edge"
 msgstr ""
 
-#: modules/file/imgexport.c:512
+#: modules/file/imgexport.c:511
 msgid ""
 "Renders data into vector (SVG, PDF, EPS) and pixmap (PNG, JPEG, TIFF, WebP, "
 "PPM, BMP, TARGA) images. Export to some formats relies on GDK and other "
 "libraries thus may be installation-dependent."
 msgstr ""
 
-#: modules/file/imgexport.c:2931
+#: modules/file/imgexport.c:2933
 #, fuzzy
 msgid "Select Color"
 msgstr "Kurvenfarbe setzen"
 
-#: modules/file/imgexport.c:3002
+#: modules/file/imgexport.c:3005
+msgid "White"
+msgstr ""
+
+#: modules/file/imgexport.c:3014
 #, fuzzy
 msgid "Black"
 msgstr "Blackman"
 
-#: modules/file/imgexport.c:3010
-msgid "White"
-msgstr ""
-
-#: modules/file/imgexport.c:3053
+#: modules/file/imgexport.c:3069
 #, fuzzy
 msgid "Pi_xel size:"
 msgstr "_Punktgröße:"
 
-#: modules/file/imgexport.c:3062
+#: modules/file/imgexport.c:3077
 msgid "Pixels per _inch:"
 msgstr ""
 
-#: modules/file/imgexport.c:3089
+#: modules/file/imgexport.c:3102
 msgid "_Zoom:"
 msgstr "_Zoom:"
 
-#: modules/file/imgexport.c:3108 modules/process/bdep_synth.c:430
+#: modules/file/imgexport.c:3120 modules/process/bdep_synth.c:430
 #: modules/process/col_synth.c:486 modules/process/diff_synth.c:508
-#: modules/process/domain_synth.c:510 modules/process/grain_mark.c:285
-#: modules/process/lat_synth.c:753 modules/process/obj_synth.c:575
-#: modules/process/pat_synth.c:852 modules/process/pat_synth.c:1154
-#: modules/process/pat_synth.c:1489 modules/process/tip_blind.c:340
+#: modules/process/domain_synth.c:510 modules/process/fibre_synth.c:540
+#: modules/process/grain_mark.c:284 modules/process/lat_synth.c:753
+#: modules/process/obj_synth.c:573 modules/process/pat_synth.c:853
+#: modules/process/pat_synth.c:1155 modules/process/pat_synth.c:1490
+#: modules/process/phase_synth.c:298 modules/process/tip_blind.c:342
 msgid "_Height:"
 msgstr "_Höhe:"
 
-#: modules/file/imgexport.c:3121
+#: modules/file/imgexport.c:3136
 #, fuzzy
 msgid "_Font:"
 msgstr "Schri_ftgröße:"
 
-#: modules/file/imgexport.c:3140
+#: modules/file/imgexport.c:3145
 msgid "_Font size:"
 msgstr "Schri_ftgröße:"
 
-#: modules/file/imgexport.c:3160
+#: modules/file/imgexport.c:3163
 #, fuzzy
 msgid "O_utline thickness:"
 msgstr "Linien_dicke:"
 
-#: modules/file/imgexport.c:3170
+#: modules/file/imgexport.c:3172
 #, fuzzy
 msgid "_Border width:"
 msgstr "S_teigung:"
 
-#: modules/file/imgexport.c:3180
+#: modules/file/imgexport.c:3181
 #, fuzzy
 msgid "_Tick length:"
 msgstr "_Länge:"
@@ -4417,245 +4562,246 @@ msgstr "Farbe"
 msgid "_Line and text color:"
 msgstr ""
 
-#: modules/file/imgexport.c:3221
+#: modules/file/imgexport.c:3220
 #, fuzzy
 msgid "_Transparent background"
 msgstr "Untergrund e_xtrahieren"
 
-#: modules/file/imgexport.c:3232
+#: modules/file/imgexport.c:3231
 #, fuzzy
 msgid "_Background color:"
 msgstr "Untergrund"
 
-#: modules/file/imgexport.c:3474
-#, fuzzy
-msgid "Lateral scale"
-msgstr "_Laterale Skala:"
-
-#: modules/file/imgexport.c:3487 modules/process/lno_synth.c:1053
-msgid "_Length:"
-msgstr "_Länge:"
-
-#: modules/file/imgexport.c:3503
-msgid "_Auto"
-msgstr "_Auto"
-
-#: modules/file/imgexport.c:3511 modules/process/pat_synth.c:469
+#: modules/file/imgexport.c:3433 modules/process/fibre_synth.c:582
+#: modules/process/pat_synth.c:470
 msgid "Placement"
 msgstr ""
 
-#: modules/file/imgexport.c:3515
+#: modules/file/imgexport.c:3437
 #, fuzzy
 msgid "left"
 msgstr "Links"
 
-#: modules/file/imgexport.c:3519
+#: modules/file/imgexport.c:3440
 #, fuzzy
 msgid "center"
 msgstr "Mitte"
 
-#: modules/file/imgexport.c:3523
+#: modules/file/imgexport.c:3443
 #, fuzzy
 msgid "right"
 msgstr "Rechts"
 
-#: modules/file/imgexport.c:3528
+#: modules/file/imgexport.c:3448
 msgid "top"
 msgstr ""
 
-#: modules/file/imgexport.c:3540
+#: modules/file/imgexport.c:3456
 msgid "bottom"
 msgstr ""
 
-#: modules/file/imgexport.c:3552 modules/file/imgexport.c:3874
+#: modules/file/imgexport.c:3479
+#, fuzzy
+msgid "Lateral scale"
+msgstr "_Laterale Skala:"
+
+#: modules/file/imgexport.c:3496 modules/process/lno_synth.c:1053
+msgid "_Length:"
+msgstr "_Länge:"
+
+#: modules/file/imgexport.c:3502
+msgid "_Auto"
+msgstr "_Auto"
+
+#: modules/file/imgexport.c:3519 modules/file/imgexport.c:3832
 #, fuzzy
 msgid "Hori_zontal gap:"
 msgstr "Horizontal"
 
-#: modules/file/imgexport.c:3558 modules/file/imgexport.c:3854
+#: modules/file/imgexport.c:3526 modules/file/imgexport.c:3812
 #, fuzzy
 msgid "_Vertical gap:"
 msgstr "_Vertikal:"
 
-#: modules/file/imgexport.c:3571 modules/file/imgexport.c:4184
+#: modules/file/imgexport.c:3538 modules/file/imgexport.c:4134
 #, fuzzy
 msgid "Colo_r:"
 msgstr "Farbe:"
 
-#: modules/file/imgexport.c:3576 modules/file/imgexport.c:4189
+#: modules/file/imgexport.c:3542 modules/file/imgexport.c:4138
 msgid "Out_line color:"
 msgstr ""
 
-#: modules/file/imgexport.c:3580 modules/file/imgexport.c:4195
+#: modules/file/imgexport.c:3547 modules/file/imgexport.c:4143
 #, fuzzy
 msgid "O_pacity:"
 msgstr "_Skala:"
 
-#: modules/file/imgexport.c:3589
+#: modules/file/imgexport.c:3554
 #, fuzzy
 msgid "Draw _ticks"
 msgstr "_Maske zeichnen"
 
-#: modules/file/imgexport.c:3599
+#: modules/file/imgexport.c:3564
 #, fuzzy
 msgid "Draw _label"
 msgstr "_Beschriftungen anzeigen"
 
-#: modules/file/imgexport.c:3609
+#: modules/file/imgexport.c:3574
 msgid "Draw text _above scale bar"
 msgstr ""
 
-#: modules/file/imgexport.c:3773
+#: modules/file/imgexport.c:3738
 #, fuzzy
 msgid "Image"
 msgstr "FFT Imaginärteil"
 
-#: modules/file/imgexport.c:3777 modules/process/calcoefs_view.c:473
-#: modules/process/correct_affine.c:488 modules/process/drift.c:297
-#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:202
-#: modules/process/fft_filter_1d.c:294 modules/process/fft_profile.c:292
-#: modules/process/fractal.c:253 modules/process/nanoindent_adjust.c:229
-#: modules/process/polydistort.c:247 modules/process/rotate.c:274
-#: modules/process/scale.c:253 modules/process/straighten_path.c:271
+#: modules/file/imgexport.c:3742 modules/process/calcoefs_view.c:473
+#: modules/process/correct_affine.c:538 modules/process/drift.c:298
+#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:203
+#: modules/process/fft_filter_1d.c:296 modules/process/fft_profile.c:293
+#: modules/process/fractal.c:262 modules/process/nanoindent_adjust.c:229
+#: modules/process/polydistort.c:250 modules/process/rotate.c:274
+#: modules/process/scale.c:257 modules/process/straighten_path.c:270
 #: modules/process/unrotate.c:277 modules/tools/linestats.c:400
-#: modules/tools/profile.c:555 modules/tools/roughness.c:864
-#: modules/tools/sfunctions.c:468 modules/xyz/xyz_raster.c:632
+#: modules/tools/profile.c:552 modules/tools/roughness.c:879
+#: modules/tools/sfunctions.c:481 modules/xyz/xyz_raster.c:601
 msgid "_Interpolation type:"
 msgstr "_Interpolationstyp:"
 
-#: modules/file/imgexport.c:3807
+#: modules/file/imgexport.c:3772
 #, fuzzy
 msgid "Draw _frame"
 msgstr "_Rahmen anzeigen"
 
-#: modules/file/imgexport.c:3816
+#: modules/file/imgexport.c:3781
 msgid "Draw _mask"
 msgstr "_Maske zeichnen"
 
-#: modules/file/imgexport.c:3826
+#: modules/file/imgexport.c:3791
 #, fuzzy
 msgid "Draw mask _legend"
 msgstr "_Maske zeichnen"
 
-#: modules/file/imgexport.c:3861
+#: modules/file/imgexport.c:3819
 msgid "Value Scale"
 msgstr "Werteskala"
 
-#: modules/file/imgexport.c:3882
+#: modules/file/imgexport.c:3840
 #, fuzzy
 msgid "Fi_xed precision:"
 msgstr "_Genauigkeit:"
 
-#: modules/file/imgexport.c:3898
+#: modules/file/imgexport.c:3855
 #, fuzzy
 msgid "Fixed _kilo threshold:"
 msgstr "_Weicher Schwellwert:"
 
-#: modules/file/imgexport.c:3914 modules/file/imgexport.c:4635
+#: modules/file/imgexport.c:3869 modules/file/imgexport.c:4583
 #, fuzzy
 msgid "Title"
 msgstr "_Titel:"
 
-#: modules/file/imgexport.c:3918
+#: modules/file/imgexport.c:3877
 #, fuzzy
 msgid "Posi_tion:"
 msgstr "Position:"
 
-#: modules/file/imgexport.c:3934
+#: modules/file/imgexport.c:3884
 msgid "_Gap:"
 msgstr ""
 
-#: modules/file/imgexport.c:3941
+#: modules/file/imgexport.c:3891
 msgid "Put _units to title"
 msgstr ""
 
-#: modules/file/imgexport.c:4125
+#: modules/file/imgexport.c:4075
 msgid "Draw _selection"
 msgstr ""
 
-#: modules/file/imgexport.c:4176 modules/tools/selectionmanager.c:361
+#: modules/file/imgexport.c:4126 modules/tools/selectionmanager.c:361
 msgid "Objects"
 msgstr "Objekte"
 
-#: modules/file/imgexport.c:4615
+#: modules/file/imgexport.c:4563
 #, fuzzy
 msgid "Lateral"
 msgstr "GL-Material"
 
-#: modules/file/imgexport.c:4654 modules/file/rawfile.c:1040
-#: modules/process/calcoefs_load.c:230 modules/process/neural.c:693
+#: modules/file/imgexport.c:4602 modules/file/rawfile.c:1040
+#: modules/process/calcoefs_load.c:230 modules/process/neural.c:700
 #, fuzzy
 msgid "verb|_Load"
 msgstr "_Laden"
 
-#: modules/file/imgexport.c:4660 modules/file/rawfile.c:1046
-#: modules/process/neural.c:699
+#: modules/file/imgexport.c:4608 modules/file/rawfile.c:1046
+#: modules/process/neural.c:706
 msgid "verb|_Store"
 msgstr ""
 
-#: modules/file/imgexport.c:4666 modules/file/rawfile.c:1052
-#: modules/process/neural.c:705
+#: modules/file/imgexport.c:4614 modules/file/rawfile.c:1052
+#: modules/process/neural.c:712
 #, fuzzy
 msgid "_Rename"
 msgstr "_Umbenennen"
 
-#: modules/file/imgexport.c:4686 modules/file/rawfile.c:1071
+#: modules/file/imgexport.c:4634 modules/file/rawfile.c:1071
 msgid "Preset _name:"
 msgstr ""
 
-#: modules/file/imgexport.c:4757
+#: modules/file/imgexport.c:4705
 #, c-format
 msgid "Export %s"
 msgstr ""
 
-#: modules/file/imgexport.c:4778
+#: modules/file/imgexport.c:4727
 msgid "Export as 1_6 bit grayscale"
 msgstr ""
 
-#: modules/file/imgexport.c:4801
+#: modules/file/imgexport.c:4750
 #, fuzzy
 msgid "Lateral Scale"
 msgstr "Laterale Skala"
 
-#: modules/file/imgexport.c:4806
+#: modules/file/imgexport.c:4755
 #, fuzzy
 msgid "Values"
 msgstr "Wert"
 
-#: modules/file/imgexport.c:4811
+#: modules/file/imgexport.c:4760
 #, fuzzy
 msgid "Selection"
 msgstr "Richtung:"
 
-#: modules/file/imgexport.c:4816 modules/file/rawfile.c:462
+#: modules/file/imgexport.c:4765 modules/file/rawfile.c:462
 #: modules/process/convolution_filter.c:275
 msgid "Presets"
 msgstr ""
 
-#: modules/file/imgexport.c:5576
+#: modules/file/imgexport.c:5525
 #, c-format
 msgid "Cairo error occurred: %s"
 msgstr ""
 
-#: modules/file/imgexport.c:5600
+#: modules/file/imgexport.c:5549
 #, c-format
 msgid "Pixbuf save failed: %s."
 msgstr ""
 
-#: modules/file/imgexport.c:5878
+#: modules/file/imgexport.c:5827
 msgid "Image is too large to be stored as TARGA."
 msgstr "Das Bild ist zu groß, um als TARGA gespeichert zu werden."
 
-#: modules/file/imgexport.c:6457 modules/file/imgexport.c:6486
+#: modules/file/imgexport.c:6406 modules/file/imgexport.c:6435
 #, fuzzy
 msgid "Draw _numbers"
 msgstr "_Maske zeichnen"
 
-#: modules/file/imgexport.c:6469 modules/file/imgexport.c:6517
+#: modules/file/imgexport.c:6418 modules/file/imgexport.c:6466
 msgid "_End marker length:"
 msgstr ""
 
-#: modules/file/imgexport.c:6498
+#: modules/file/imgexport.c:6447
 #, fuzzy
 msgid "Marker _radius:"
 msgstr "Fehlerzeilen markieren"
@@ -4695,46 +4841,57 @@ msgstr ""
 msgid "image depth"
 msgstr ""
 
-#: modules/file/iso28600.c:534
+#: modules/file/iso28600.c:543
 msgid "Imports and exports ISO 28600:2011 SPM data transfer format."
 msgstr ""
 
-#: modules/file/iso28600.c:550
+#: modules/file/iso28600.c:559
 msgid "ISO 28600:2011 SPM data transfer files (.spm)"
 msgstr ""
 
-#: modules/file/iso28600.c:606
+#: modules/file/iso28600.c:658
 #, c-format
-msgid "Only regular mappings are implemented but file has mapping type ‘%s’."
+msgid ""
+"Only regular and irregular mappings are implemented but the file has mapping "
+"type ‘%s’."
 msgstr ""
 
-#: modules/file/iso28600.c:668 modules/file/iso28600.c:677
-#: modules/file/iso28600.c:686
+#: modules/file/iso28600.c:687 modules/file/iso28600.c:696
+#: modules/file/iso28600.c:705
 #, c-format
 msgid "List ‘%s’ has %u items which differs from the number %u given by ‘%s’."
 msgstr ""
 
-#: modules/file/iso28600.c:755 modules/file/iso28600.c:867
-#: modules/file/sdfile.c:846 modules/file/sdfile.c:863
-#: modules/file/spip-asc.c:239 modules/file/witec-asc.c:223
-#: modules/file/wsffile.c:215
-#, c-format
-msgid "End of file reached when reading sample #%d of %d"
-msgstr ""
+#: modules/file/iso28600.c:775
+#, fuzzy, c-format
+msgid "End of file reached when reading sample #%u of %u"
+msgstr "Dateiende wurde erreicht, als Datenwert erwartet wurde."
 
-#: modules/file/iso28600.c:764 modules/file/iso28600.c:876
-#: modules/file/spip-asc.c:246 modules/file/witec-asc.c:230
-#: modules/file/wsffile.c:222
+#: modules/file/iso28600.c:784 modules/file/iso28600.c:873
 #, c-format
-msgid "Malformed data encountered when reading sample #%d of %d"
+msgid "Malformed data encountered when reading sample #%u"
 msgstr ""
 
-#: modules/file/iso28600.c:774 modules/file/iso28600.c:886
+#: modules/file/iso28600.c:797 modules/file/iso28600.c:887
+#: modules/file/iso28600.c:1022
 #, fuzzy
 msgid "Missing end-of-data marker."
 msgstr "Markierung des Datenfeld-Endes fehlt."
 
-#: modules/file/iso28600.c:1048
+#: modules/file/iso28600.c:1003 modules/file/sdfile.c:846
+#: modules/file/sdfile.c:863 modules/file/spip-asc.c:239
+#: modules/file/witec-asc.c:223 modules/file/wsffile.c:215
+#, c-format
+msgid "End of file reached when reading sample #%d of %d"
+msgstr ""
+
+#: modules/file/iso28600.c:1012 modules/file/spip-asc.c:246
+#: modules/file/witec-asc.c:230 modules/file/wsffile.c:222
+#, c-format
+msgid "Malformed data encountered when reading sample #%d of %d"
+msgstr ""
+
+#: modules/file/iso28600.c:1184
 #, c-format
 msgid "Line %u does not contain mandatory label ‘%s’."
 msgstr ""
@@ -4751,43 +4908,63 @@ msgstr "JEOL-Dateien (.tif)"
 msgid "The type of data is unknown.  Please report it to the developers."
 msgstr ""
 
-#: modules/file/jpkscan.c:229
+#: modules/file/jpkscan.c:292
 msgid "Imports JPK image scans."
 msgstr ""
 
-#: modules/file/jpkscan.c:242
+#: modules/file/jpkscan.c:305
 msgid "JPK image scans (.jpk, .jpk-qi-image)"
 msgstr ""
 
-#: modules/file/jpkscan.c:249
+#: modules/file/jpkscan.c:312
 msgid "JPK force curves (.jpk-force, .jpk-force-map, .jpk-qi-data)"
 msgstr ""
 
-#: modules/file/jpkscan.c:315
+#: modules/file/jpkscan.c:378
 msgid "File does not contain grid dimensions."
 msgstr ""
 
-#: modules/file/jpkscan.c:660 modules/file/nanoobserver.c:193
+#: modules/file/jpkscan.c:736 modules/file/nanoobserver.c:360
 #: modules/file/nanoscantech.c:205 modules/file/opengps.c:209
 #: modules/file/sensofarx.c:183 modules/file/spmxfile.c:166
 msgid "Minizip cannot open the file as a ZIP file."
 msgstr ""
 
-#: modules/file/jpkscan.c:739
+#: modules/file/jpkscan.c:758 modules/file/jpkscan.c:2717
+#, c-format
+msgid "Scanning file (%u curves)..."
+msgstr ""
+
+#: modules/file/jpkscan.c:798 modules/file/nmmxyz.c:299
+#, fuzzy
+msgid "Reading files..."
+msgstr "Markiere Grenzen"
+
+#: modules/file/jpkscan.c:816
+#, fuzzy
+msgid "Creating volume data..."
+msgstr "Nivellierte Daten"
+
+#: modules/file/jpkscan.c:968
 msgid "Non-uniform point and/or segment numbering is not supported."
 msgstr ""
 
-#: modules/file/jpkscan.c:748
+#: modules/file/jpkscan.c:977
 #, fuzzy
 msgid "Non-uniform channel lists are not supported."
 msgstr "Abstands-Kraft-Kurven werden nicht unterstützt."
 
-#: modules/file/jpkscan.c:756
+#: modules/file/jpkscan.c:985
 #, c-format
 msgid "Data file %s was found instead of expected %s."
 msgstr ""
 
-#: modules/file/jpkscan.c:1497
+#: modules/file/jpkscan.c:1900
+#, fuzzy, c-format
+msgid "Header properties file for index %u is missing."
+msgstr "Kopfzeilen-Feld `%s' fehlt."
+
+#: modules/file/jpkscan.c:2519
 msgid "Cannot find any height channel."
 msgstr ""
 
@@ -4943,19 +5120,19 @@ msgstr "MetroPro-Dateien (.dat)"
 msgid "File header is larger than file."
 msgstr ""
 
-#: modules/file/microprof.c:117
+#: modules/file/microprof.c:125
 msgid "Imports MicroProf FRT profilometer data files."
 msgstr "Importiert MicroProf FRT-Profilometer-Dateien."
 
-#: modules/file/microprof.c:130
+#: modules/file/microprof.c:138
 msgid "MicroProf FRT files (.frt)"
 msgstr "MicroProf FRT-Dateien (.frt)"
 
-#: modules/file/microprof.c:136
+#: modules/file/microprof.c:144
 msgid "MicroProf FRT text files (.txt)"
 msgstr "MicroProf FRT-Textdateien (.txt)."
 
-#: modules/file/microprof.c:432
+#: modules/file/microprof.c:519
 msgid "File contains fewer than XSize*YSize data points."
 msgstr ""
 
@@ -5043,8 +5220,8 @@ msgstr ""
 msgid "Spectra data starts past the end of file."
 msgstr ""
 
-#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:276
-#: modules/file/renishaw.c:1325 modules/file/sensofar.c:256
+#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:287
+#: modules/file/renishaw.c:1334 modules/file/sensofar.c:256
 #: modules/file/witec-asc.c:161
 msgid "File header is truncated"
 msgstr ""
@@ -5054,8 +5231,8 @@ msgstr ""
 msgid "Parameter header is truncated"
 msgstr ""
 
-#: modules/file/nanoeducator.c:932 modules/process/curvature.c:454
-#: modules/tools/profile.c:1107
+#: modules/file/nanoeducator.c:932 modules/process/curvature.c:456
+#: modules/tools/profile.c:1090
 #, c-format
 msgid "Profile %d"
 msgstr ""
@@ -5137,23 +5314,27 @@ msgstr ""
 msgid "Missing data start marker \\x1a\\x04."
 msgstr ""
 
-#: modules/file/nanoobserver.c:113
-msgid "Reads NanoObserver .nao files."
+#: modules/file/nanoobserver.c:201
+msgid "Reads Nano-Solution/NanoObserver .nao files."
+msgstr ""
+
+#: modules/file/nanoobserver.c:214
+msgid "Nano-Solution/NanoObserver data (.nao)"
 msgstr ""
 
-#: modules/file/nanoobserver.c:126
-msgid "NanoObserver data (.nao)"
+#: modules/file/nanoobserver.c:410 modules/file/renishaw.c:1420
+msgid "Data block is truncated"
 msgstr ""
 
-#: modules/file/nanoscan.c:188
+#: modules/file/nanoscan.c:191
 msgid "Imports NanoScan XML files."
 msgstr "Importiert NanoScan XML-Dateien."
 
-#: modules/file/nanoscan.c:201
+#: modules/file/nanoscan.c:204
 msgid "NanoScan XML files (.xml)"
 msgstr "NanoScan XML-Dateien (.xml)"
 
-#: modules/file/nanoscan.c:910
+#: modules/file/nanoscan.c:937
 msgid "Wrong size of Base64 encoded data."
 msgstr ""
 
@@ -5174,22 +5355,22 @@ msgstr "Importiert Digital Instruments Nanoscope-II-Dateien."
 msgid "Nanoscope II files"
 msgstr "Nanoscope-II-Dateien"
 
-#: modules/file/nanoscope.c:207
+#: modules/file/nanoscope.c:212
 msgid ""
 "Imports Veeco (Digital Instruments) Nanoscope data files, version 3 or newer."
 msgstr ""
 "Importiert Veeco (Digital Instruments) Nanoscope-Dateien, Version 3 oder "
 "neuer."
 
-#: modules/file/nanoscope.c:221
+#: modules/file/nanoscope.c:226
 msgid "Nanoscope III files"
 msgstr "Nanoscope-III-Dateien"
 
-#: modules/file/nanoscope.c:288
+#: modules/file/nanoscope.c:295
 msgid "File is not a Nanoscope file, or it is a unknown subtype."
 msgstr ""
 
-#: modules/file/nanoscope.c:295
+#: modules/file/nanoscope.c:302
 msgid ""
 "File has been damaged by change of line endings, resulting in corruption of "
 "the binary part of the file.\n"
@@ -5200,16 +5381,16 @@ msgid ""
 "transfer that attempts to store text platform-independently."
 msgstr ""
 
-#: modules/file/nanoscope.c:653 modules/file/nanoscope.c:669
+#: modules/file/nanoscope.c:660 modules/file/nanoscope.c:676
 msgid "Cannot parse `Scan size' field."
 msgstr ""
 
-#: modules/file/nanoscope.c:1539 modules/file/nrrdfile.c:1086
+#: modules/file/nanoscope.c:1546 modules/file/nrrdfile.c:1086
 #, c-format
 msgid "Garbage after data sample #%u."
 msgstr ""
 
-#: modules/file/nanoscope.c:1595
+#: modules/file/nanoscope.c:1602
 msgid "Truncated header line."
 msgstr ""
 
@@ -5290,12 +5471,8 @@ msgstr "Nanonis SXM-Dateien (.sxm)"
 msgid "Nano Measuring Machine data import must be run as interactive."
 msgstr "Der Import von XYZ-Rohdaten muss interaktiv ausgeführt werden."
 
-#: modules/file/nmmxyz.c:299
-#, fuzzy
-msgid "Reading files..."
-msgstr "Markiere Grenzen"
-
 #: modules/file/nmmxyz.c:306 modules/process/lat_synth.c:1224
+#: modules/process/wave_synth.c:798
 msgid "Rendering surface..."
 msgstr ""
 
@@ -5332,20 +5509,20 @@ msgid "Plot point density map"
 msgstr ""
 
 #: modules/file/nmmxyz.c:534 modules/file/rawfile.c:626
-#: modules/process/dimensions.h:445 modules/xyz/xyz_drift.c:725
-#: modules/xyz/xyz_raster.c:517
+#: modules/process/dimensions.h:427 modules/xyz/xyz_drift.c:725
+#: modules/xyz/xyz_raster.c:376
 msgid "Resolution"
 msgstr "Auflösung"
 
 #: modules/file/nmmxyz.c:538 modules/file/rawfile.c:631
-#: modules/process/dimensions.h:451 modules/xyz/xyz_drift.c:729
-#: modules/xyz/xyz_raster.c:521
+#: modules/process/dimensions.h:433 modules/xyz/xyz_drift.c:729
+#: modules/xyz/xyz_raster.c:382
 msgid "_Horizontal size:"
 msgstr "_Horizontale Größe:"
 
 #: modules/file/nmmxyz.c:554 modules/file/rawfile.c:638
-#: modules/process/dimensions.h:454 modules/xyz/xyz_drift.c:744
-#: modules/xyz/xyz_raster.c:536
+#: modules/process/dimensions.h:436 modules/xyz/xyz_drift.c:744
+#: modules/xyz/xyz_raster.c:388
 msgid "_Vertical size:"
 msgstr "_Vertikale Größe:"
 
@@ -5434,38 +5611,38 @@ msgstr ""
 msgid "Per-axis header field %s contains too few items."
 msgstr ""
 
-#: modules/file/nt-mdt.c:843
+#: modules/file/nt-mdt.c:850
 msgid "Imports NT-MDT data files."
 msgstr "Importiert NT-MDT-Dateien."
 
-#: modules/file/nt-mdt.c:856
+#: modules/file/nt-mdt.c:863
 msgid "NT-MDT files (.mdt)"
 msgstr "NT-MDT-Dateien (.mdt)"
 
-#: modules/file/nt-mdt.c:1491 modules/file/nt-mdt.c:1599
+#: modules/file/nt-mdt.c:1498 modules/file/nt-mdt.c:1606
 msgid "Frame is too short for Frame Mode."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1506 modules/file/nt-mdt.c:1614
+#: modules/file/nt-mdt.c:1513 modules/file/nt-mdt.c:1621
 msgid "Frame is too short for dots or data."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1869
+#: modules/file/nt-mdt.c:1879
 #, c-format
 msgid "End of file reached in frame header #%u."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1877
+#: modules/file/nt-mdt.c:1887
 #, c-format
 msgid "End of file reached in frame data #%u."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1910
+#: modules/file/nt-mdt.c:1920
 #, c-format
 msgid "Frame #%u is too short for scanned data header."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1927
+#: modules/file/nt-mdt.c:1937
 #, c-format
 msgid "Frame #%u is too short for spectroscopy data header."
 msgstr ""
@@ -5583,28 +5760,28 @@ msgstr "Omicron MATRIX (param.mtrx & data.mtrx)"
 msgid "Omicron MATRIX (.mtrx & .mtrx)"
 msgstr "Omicron MATRIX (.mtrx & .mtrx)"
 
-#: modules/file/opdfile.c:188
+#: modules/file/opdfile.c:199
 msgid "Imports Wyko OPD and ASC files."
 msgstr "Importiert Wyko OPD- und ASC-Dateien."
 
-#: modules/file/opdfile.c:201
+#: modules/file/opdfile.c:212
 msgid "Wyko OPD files (.opd)"
 msgstr "Wyko OPD-Dateien (.opd)"
 
-#: modules/file/opdfile.c:208
+#: modules/file/opdfile.c:219
 msgid "Wyko ASCII export files (.asc)"
 msgstr ""
 
-#: modules/file/opdfile.c:299
+#: modules/file/opdfile.c:310
 #, c-format
 msgid "Item `%s' is beyond the end of the file."
 msgstr ""
 
-#: modules/file/opdfile.c:614
+#: modules/file/opdfile.c:636
 msgid "Nested directories found"
 msgstr ""
 
-#: modules/file/opdfile.c:805
+#: modules/file/opdfile.c:842
 #, c-format
 msgid "Truncated data in block %s"
 msgstr ""
@@ -5904,19 +6081,21 @@ msgstr ""
 
 #: modules/file/rawfile.c:567 modules/process/arithmetic.c:234
 #: modules/process/calcoefs_view.c:320 modules/process/coerce.c:250
-#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:637
+#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:638
 #: modules/process/drift.c:242 modules/process/edge.c:635
-#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:183
-#: modules/process/grain_edge.c:210 modules/process/grain_filter.c:313
-#: modules/process/grain_mark.c:244 modules/process/grain_wshed.c:164
-#: modules/process/mark_disconn.c:205 modules/process/mark_with.c:195
-#: modules/process/polydistort.c:205 modules/process/scars.c:295
-#: modules/process/slope_dist.c:273 modules/process/straighten_path.c:198
-#: modules/process/synth.h:509 modules/process/tip_model.c:166
+#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:184
+#: modules/process/fractal.c:225 modules/process/grain_edge.c:209
+#: modules/process/grain_filter.c:312 modules/process/grain_mark.c:243
+#: modules/process/grain_wshed.c:165 modules/process/mark_disconn.c:205
+#: modules/process/mark_with.c:196 modules/process/mfm_field.c:278
+#: modules/process/mfm_shift.c:167 modules/process/polydistort.c:205
+#: modules/process/scars.c:314 modules/process/slope_dist.c:272
+#: modules/process/stitch.c:272 modules/process/straighten_path.c:198
+#: modules/process/synth.h:538 modules/process/tip_model.c:164
 #: modules/process/wpour_mark.c:273 modules/tools/linestats.c:454
-#: modules/tools/sfunctions.c:534 modules/tools/stats.c:459
-#: modules/volume/volume_extract.c:328 modules/volume/volume_linestat.c:287
-#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:443
+#: modules/tools/sfunctions.c:531 modules/tools/stats.c:456
+#: modules/volume/volume_extract.c:321 modules/volume/volume_linestat.c:292
+#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:457
 msgid "_Update"
 msgstr "A_ktualisieren"
 
@@ -6060,7 +6239,7 @@ msgid ""
 "The contents of `%s' does not match format: %s."
 msgstr ""
 
-#: modules/file/rawfile.c:1690 modules/process/neural.c:1580
+#: modules/file/rawfile.c:1690 modules/process/neural.c:1587
 #, c-format
 msgid "The name `%s' is invalid."
 msgstr "Der Name `%s' ist ungültig."
@@ -6159,7 +6338,8 @@ msgstr "XYZ-Dateien"
 msgid "Import XYZ Data"
 msgstr "XYZ-Daten importieren"
 
-#: modules/file/rawxyz.c:279
+#: modules/file/rawxyz.c:279 modules/graph/graph_stats.c:305
+#: modules/graph/graph_stats.c:756 modules/graph/graph_stats.c:800
 #, fuzzy
 msgid "Number of points:"
 msgstr "Anzahl an Körnern"
@@ -6184,7 +6364,7 @@ msgstr "_X-Bereich:"
 msgid "_Lateral units:"
 msgstr "_Laterale Einheiten:"
 
-#: modules/file/rawxyz.c:386 modules/process/dimensions.h:494
+#: modules/file/rawxyz.c:386 modules/process/dimensions.h:479
 #, fuzzy
 msgid "_Value units:"
 msgstr "_Werteskala:"
@@ -6203,19 +6383,15 @@ msgstr "Intematix SDF-Dateien (.sdf)"
 msgid "MapArea block is truncated"
 msgstr ""
 
-#: modules/file/renishaw.c:787
+#: modules/file/renishaw.c:793
 msgid "Random points order unsupported"
 msgstr ""
 
-#: modules/file/renishaw.c:1396
+#: modules/file/renishaw.c:1405
 #, fuzzy
 msgid "Block header is truncated"
 msgstr "X Abstand"
 
-#: modules/file/renishaw.c:1411
-msgid "Data block is truncated"
-msgstr ""
-
 #: modules/file/rhk-sm3.c:236
 msgid "Imports RHK Technology SM3 data files."
 msgstr "Importiert RHK Technology SM3-Dateien."
@@ -6484,19 +6660,24 @@ msgstr "Lädt SPML-Dateien (Scanning Probe Microscopy Markup Language)."
 msgid "SPML files (.xml)"
 msgstr "SPML-Dateien (.xml)"
 
-#: modules/file/spmlab.c:131
+#: modules/file/spmlab.c:175
 msgid "Imports Thermicroscopes SpmLab R3 to R7 data files."
 msgstr "Importiert Thermicroscopes SpmLab-Dateien (R3 bis R7)."
 
-#: modules/file/spmlab.c:144
+#: modules/file/spmlab.c:188
 msgid "Thermicroscopes SpmLab files"
 msgstr "Thermicroscopes SpmLab-Dateien"
 
-#: modules/file/spmlab.c:231
+#: modules/file/spmlab.c:259
 #, c-format
 msgid "Unknown format version %c."
 msgstr "Unbekannte Formatversion %c."
 
+#: modules/file/spmlab.c:283
+#, fuzzy
+msgid "Data block is truncated."
+msgstr "X Abstand"
+
 #: modules/file/spmlabf.c:79
 msgid "Imports SPMLab floating-point files."
 msgstr "Importiert SPMLab Gleitkomma-Dateien."
@@ -6704,11 +6885,11 @@ msgstr "Importiert OLS-Dateien."
 msgid "WinSTM files (.stm)"
 msgstr "WSXM-Dateien (.tom)"
 
-#: modules/file/wipfile.c:272
+#: modules/file/wipfile.c:281
 msgid "Imports WItec Project data files."
 msgstr "Importiert WItec Projektdateien."
 
-#: modules/file/wipfile.c:285
+#: modules/file/wipfile.c:294
 msgid "WItec Project files (.wip)"
 msgstr "WItec Projektdateien (.wip)"
 
@@ -6773,23 +6954,23 @@ msgstr "Exportiert Daten als einfache ASCII-Matrix."
 msgid "XYZ text data (.xyz)"
 msgstr ""
 
-#: modules/file/xyzexport.c:244
+#: modules/file/xyzexport.c:247
 #, fuzzy
 msgid "Lateral units:"
 msgstr "_Laterale Einheiten:"
 
-#: modules/file/xyzexport.c:290
+#: modules/file/xyzexport.c:293
 #, fuzzy
 msgid "Export XYZ"
 msgstr "Text exportieren"
 
-#: modules/file/xyzexport.c:340 modules/process/curvature.c:704
+#: modules/file/xyzexport.c:343 modules/process/curvature.c:700
 #: modules/process/entropy.c:214 modules/process/facet-level.c:207
-#: modules/process/fit-shape.c:743 modules/process/level.c:259
-#: modules/process/linematch.c:906 modules/process/neural.c:593
-#: modules/process/polylevel.c:491 modules/process/slope_dist.c:418
-#: modules/tools/filter.c:300 modules/tools/linestats.c:436
-#: modules/tools/profile.c:591 modules/tools/sfunctions.c:516
+#: modules/process/fit-shape.c:755 modules/process/level.c:259
+#: modules/process/linematch.c:869 modules/process/neural.c:597
+#: modules/process/polylevel.c:494 modules/process/slope_dist.c:411
+#: modules/tools/filter.c:301 modules/tools/linestats.c:436
+#: modules/tools/profile.c:572 modules/tools/sfunctions.c:513
 #: modules/tools/stats.c:389
 msgid "Masking Mode"
 msgstr "Maskier-Modus"
@@ -6803,6 +6984,16 @@ msgstr "Importiert Aarhus MUL-Dateien."
 msgid "Carl Zeiss SEM scans (.tif)"
 msgstr ""
 
+#: modules/file/zeisslsm.c:383
+#, fuzzy
+msgid "Imports Carl Zeiss CLSM images."
+msgstr "Importiert Aarhus MUL-Dateien."
+
+#: modules/file/zeisslsm.c:396
+#, fuzzy
+msgid "Carl Zeiss CLSM images (.lsm)"
+msgstr "Importiert Aarhus MUL-Dateien."
+
 #: modules/file/zemax.c:72
 #, fuzzy
 msgid "Imports Zemax grid sag data files."
@@ -6826,16 +7017,16 @@ msgstr "Der Datentyp %d ist ungültig oder wird nicht unterstützt."
 msgid "The first line contains too many items."
 msgstr ""
 
-#: modules/graph/graph_align.c:57
+#: modules/graph/graph_align.c:60
 #, fuzzy
 msgid "Aligns graph curves."
 msgstr "Diagrammkurven nivellieren"
 
-#: modules/graph/graph_align.c:71
+#: modules/graph/graph_align.c:74
 msgid "/_Align"
 msgstr ""
 
-#: modules/graph/graph_align.c:74
+#: modules/graph/graph_align.c:77
 #, fuzzy
 msgid "Align curves"
 msgstr "Diagrammkurven nivellieren"
@@ -6852,50 +7043,52 @@ msgstr "/_Kritische Dimension..."
 msgid "Fit critical dimension"
 msgstr "Kritische Dimension fitten"
 
-#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:267
+#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:270
 #, fuzzy
 msgid "Fit Graph"
 msgstr "Graph anfitten"
 
-#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:251
-#: modules/graph/graph_fit.c:270 modules/process/fit-shape.c:393
+#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:254
+#: modules/graph/graph_fit.c:273 modules/process/fit-shape.c:394
 #: modules/volume/volume_fdfit.c:299
 msgid "verb|_Fit"
 msgstr ""
 
-#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:166
-#: modules/graph/graph_fdfit.c:306 modules/graph/graph_fit.c:325
-#: modules/graph/graph_peaks.c:199
+#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:168
+#: modules/graph/graph_fdfit.c:313 modules/graph/graph_fit.c:332
+#: modules/graph/graph_peaks.c:199 modules/graph/graph_stats.c:268
 #, fuzzy
 msgid "_Graph curve:"
 msgstr "_Graph"
 
-#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:320
-#: modules/graph/graph_fit.c:339 modules/volume/volume_fdfit.c:405
+#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:327
+#: modules/graph/graph_fit.c:346 modules/volume/volume_fdfit.c:389
 msgid "F_unction:"
 msgstr "F_unktion:"
 
-#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:361
-#: modules/graph/graph_fit.c:375 modules/process/curvature.c:745
-#: modules/process/fit-shape.c:792 modules/volume/volume_fdfit.c:446
+#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:368
+#: modules/graph/graph_fit.c:382 modules/process/curvature.c:742
+#: modules/process/fit-shape.c:804 modules/volume/volume_fdfit.c:422
 msgid "Parameter"
 msgstr "Parameter"
 
-#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:363
-#: modules/graph/graph_fit.c:377 modules/process/fit-shape.c:794
-#: modules/volume/volume_fdfit.c:448
+#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:370
+#: modules/graph/graph_fit.c:384 modules/process/fit-shape.c:806
+#: modules/volume/volume_fdfit.c:424
 msgid "Error"
 msgstr "Fehler"
 
-#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:196
-#: modules/graph/graph_fdfit.c:415 modules/graph/graph_fit.c:433
-#: modules/volume/volume_fdfit.c:500 modules/volume/volume_linestat.c:389
+#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:189
+#: modules/graph/graph_fdfit.c:422 modules/graph/graph_fit.c:440
+#: modules/graph/graph_stats.c:279 modules/graph/graph_stats.c:793
+#: modules/volume/volume_fdfit.c:476 modules/volume/volume_linestat.c:394
 msgid "Range:"
 msgstr ""
 
-#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:207
-#: modules/graph/graph_fdfit.c:426 modules/graph/graph_fit.c:444
-#: modules/volume/volume_fdfit.c:511 modules/volume/volume_linestat.c:400
+#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:200
+#: modules/graph/graph_fdfit.c:433 modules/graph/graph_fit.c:451
+#: modules/graph/graph_stats.c:290 modules/graph/graph_stats.c:796
+#: modules/volume/volume_fdfit.c:487 modules/volume/volume_linestat.c:405
 #, fuzzy
 msgid "range|to"
 msgstr "bis"
@@ -6904,98 +7097,98 @@ msgstr "bis"
 msgid "_Draw whole circle"
 msgstr ""
 
-#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:491
-#: modules/graph/graph_fit.c:531 modules/process/fit-shape.c:522
-#: modules/volume/volume_fdfit.c:573
+#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:498
+#: modules/graph/graph_fit.c:538 modules/process/fit-shape.c:523
+#: modules/volume/volume_fdfit.c:549
 msgid "Save Fit Report"
 msgstr ""
 
 #: modules/graph/graph_cd.c:529 modules/graph/graph_cd.c:1107
-#: modules/graph/graph_fdfit.c:709 modules/graph/graph_fit.c:763
-#: modules/volume/volume_fdfit.c:907
+#: modules/graph/graph_fdfit.c:725 modules/graph/graph_fit.c:779
+#: modules/volume/volume_fdfit.c:883
 #, fuzzy
 msgid "Fit"
 msgstr "Fest"
 
-#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:749
-#: modules/graph/graph_fit.c:803 modules/volume/volume_fdfit.c:978
-#: modules/volume/volume_fdfit.c:1085
+#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:765
+#: modules/graph/graph_fit.c:819 modules/volume/volume_fdfit.c:954
+#: modules/volume/volume_fdfit.c:1061
 msgid "It is necessary to select more data points than free fit parameters"
 msgstr ""
 
-#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:798
-#: modules/graph/graph_fit.c:852 modules/process/entropy.c:554
-#: modules/tools/grainmeasure.c:217 modules/tools/readvalue.c:634
-#: modules/tools/readvalue.c:635 modules/tools/readvalue.c:636
-#: modules/tools/readvalue.c:637 modules/tools/roughness.c:975
-#: modules/tools/stats.c:727 modules/tools/stats.c:740
-#: modules/tools/stats.c:741 modules/volume/volume_fdfit.c:1134
-#: modules/xyz/xyz_drift.c:1099 modules/xyz/xyz_drift.c:1117
-#: modules/xyz/xyz_drift.c:1134
+#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:814
+#: modules/graph/graph_fit.c:868 modules/graph/graph_stats.c:663
+#: modules/process/entropy.c:555 modules/tools/grainmeasure.c:217
+#: modules/tools/readvalue.c:634 modules/tools/readvalue.c:635
+#: modules/tools/readvalue.c:636 modules/tools/readvalue.c:637
+#: modules/tools/roughness.c:984 modules/tools/stats.c:723
+#: modules/tools/stats.c:736 modules/tools/stats.c:737
+#: modules/volume/volume_fdfit.c:1110 modules/xyz/xyz_drift.c:1099
+#: modules/xyz/xyz_drift.c:1117 modules/xyz/xyz_drift.c:1134
 msgid "N.A."
 msgstr "N.V."
 
-#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1363
-#: modules/graph/graph_fit.c:1500 modules/process/fit-shape.c:2078
-#: modules/volume/volume_fdfit.c:1720
+#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1381
+#: modules/graph/graph_fit.c:1518 modules/process/fit-shape.c:2060
+#: modules/volume/volume_fdfit.c:1696
 #, fuzzy
 msgid "===== Fit Results ====="
 msgstr "===== Fit-Ergebnisse===="
 
-#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1367
-#: modules/graph/graph_fit.c:1504 modules/process/fit-shape.c:2080
-#: modules/volume/volume_fdfit.c:1724
+#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1385
+#: modules/graph/graph_fit.c:1522 modules/process/fit-shape.c:2062
+#: modules/volume/volume_fdfit.c:1700
 #, c-format
 msgid "Data:             %s\n"
 msgstr ""
 
-#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1370
-#: modules/graph/graph_fit.c:1507 modules/process/fit-shape.c:2082
-#: modules/volume/volume_fdfit.c:1727
+#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1388
+#: modules/graph/graph_fit.c:1525 modules/process/fit-shape.c:2064
+#: modules/volume/volume_fdfit.c:1703
 #, c-format
 msgid "Number of points: %d of %d\n"
 msgstr ""
 
-#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1374
-#: modules/graph/graph_fit.c:1511 modules/volume/volume_fdfit.c:1731
+#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1392
+#: modules/graph/graph_fit.c:1529 modules/volume/volume_fdfit.c:1707
 #, c-format
 msgid "X range:          %.*f to %.*f %s\n"
 msgstr ""
 
-#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1380
-#: modules/graph/graph_fit.c:1517 modules/process/fit-shape.c:2084
-#: modules/volume/volume_fdfit.c:1737
+#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1398
+#: modules/graph/graph_fit.c:1535 modules/process/fit-shape.c:2066
+#: modules/volume/volume_fdfit.c:1713
 #, c-format
 msgid "Fitted function:  %s\n"
 msgstr ""
 
-#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1383
-#: modules/graph/graph_fit.c:1520 modules/process/fit-shape.c:2087
-#: modules/volume/volume_fdfit.c:1740
+#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1401
+#: modules/graph/graph_fit.c:1538 modules/process/fit-shape.c:2069
+#: modules/volume/volume_fdfit.c:1716
 msgid "Results\n"
 msgstr "Ergebnisse\n"
 
-#: modules/graph/graph_cut.c:88
+#: modules/graph/graph_cut.c:87
 #, fuzzy
 msgid "Cut graph"
 msgstr "Graph"
 
-#: modules/graph/graph_cut.c:102
+#: modules/graph/graph_cut.c:101
 #, fuzzy
 msgid "/_Cut..."
 msgstr "Graph"
 
-#: modules/graph/graph_cut.c:105
+#: modules/graph/graph_cut.c:104
 #, fuzzy
 msgid "Extract part of graph into new one"
 msgstr "Teil des Graphen in einen neuen extrahieren"
 
-#: modules/graph/graph_cut.c:146
+#: modules/graph/graph_cut.c:145
 #, fuzzy
 msgid "Cut Graph"
 msgstr "Graph"
 
-#: modules/graph/graph_cut.c:180
+#: modules/graph/graph_cut.c:173
 msgid "Cut _all curves"
 msgstr ""
 
@@ -7098,108 +7291,108 @@ msgstr "Diagramm als Pixelgrafik exportieren"
 msgid "Export to PNG"
 msgstr "Text exportieren"
 
-#: modules/graph/graph_export_vector.c:35
+#: modules/graph/graph_export_vector.c:36
 #, fuzzy
 msgid "Exports graphs to PostScript"
 msgstr "Diagramm als Postscript exportieren"
 
-#: modules/graph/graph_export_vector.c:49
+#: modules/graph/graph_export_vector.c:50
 msgid "/Export _PostScript"
 msgstr "/Exportieren als _Postscript"
 
-#: modules/graph/graph_export_vector.c:52
+#: modules/graph/graph_export_vector.c:53
 #, fuzzy
 msgid "Export graph to PostScript"
 msgstr "Diagramm als Postscript exportieren"
 
-#: modules/graph/graph_export_vector.c:65
+#: modules/graph/graph_export_vector.c:66
 #, fuzzy
 msgid "Export to PostScript"
 msgstr "/Exportieren als _Postscript"
 
-#: modules/graph/graph_fdfit.c:168
+#: modules/graph/graph_fdfit.c:169
 msgid "Fit force-distance data"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:182
+#: modules/graph/graph_fdfit.c:183
 msgid "/_Fit FD Curve..."
 msgstr "/_FD-Kurve fitten..."
 
-#: modules/graph/graph_fdfit.c:185
+#: modules/graph/graph_fdfit.c:186
 msgid "Fit a force-distance curve"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:248 modules/volume/volume_fdfit.c:296
+#: modules/graph/graph_fdfit.c:251 modules/volume/volume_fdfit.c:296
 #, fuzzy
 msgid "Fit FD Curve"
 msgstr "FD-Kurve fitten"
 
-#: modules/graph/graph_fdfit.c:255 modules/graph/graph_fit.c:274
-#: modules/process/fit-shape.c:397 modules/process/measure_lattice.c:257
-#: modules/volume/volume_fdfit.c:303
+#: modules/graph/graph_fdfit.c:258 modules/graph/graph_fit.c:277
+#: modules/process/correct_affine.c:347 modules/process/fit-shape.c:398
+#: modules/process/measure_lattice.c:247 modules/volume/volume_fdfit.c:303
 #, fuzzy
 msgid "verb|_Estimate"
 msgstr "_Abschätzung"
 
-#: modules/graph/graph_fdfit.c:257 modules/graph/graph_fit.c:276
-#: modules/volume/volume_fdfit.c:305
+#: modules/graph/graph_fdfit.c:260 modules/graph/graph_fit.c:279
+#: modules/process/psf.c:239 modules/volume/volume_fdfit.c:305
 #, fuzzy
 msgid "_Plot Inits"
 msgstr "_Diagramm-Einheiten"
 
-#: modules/graph/graph_fdfit.c:359 modules/graph/graph_fit.c:373
-#: modules/process/fit-shape.c:790 modules/volume/volume_fdfit.c:444
+#: modules/graph/graph_fdfit.c:366 modules/graph/graph_fit.c:380
+#: modules/process/fit-shape.c:802 modules/volume/volume_fdfit.c:420
 #, fuzzy
 msgid "Fix"
 msgstr "Fest"
 
-#: modules/graph/graph_fdfit.c:365 modules/graph/graph_fit.c:379
-#: modules/volume/volume_fdfit.c:450
+#: modules/graph/graph_fdfit.c:372 modules/graph/graph_fit.c:386
+#: modules/volume/volume_fdfit.c:426
 #, fuzzy
 msgid "Initial"
 msgstr "Initialisiere graphische Benutzeroberfläche"
 
-#: modules/graph/graph_fdfit.c:376 modules/graph/graph_fit.c:394
-#: modules/volume/volume_fdfit.c:461
+#: modules/graph/graph_fdfit.c:383 modules/graph/graph_fit.c:401
+#: modules/volume/volume_fdfit.c:437
 msgid "χ<sup>2</sup> result:"
 msgstr "χ<sup>2</sup> Ergebnis:"
 
-#: modules/graph/graph_fdfit.c:392 modules/graph/graph_fit.c:410
-#: modules/process/fit-shape.c:469 modules/process/fit-shape.c:2134
-#: modules/volume/volume_fdfit.c:477
+#: modules/graph/graph_fdfit.c:399 modules/graph/graph_fit.c:417
+#: modules/process/fit-shape.c:470 modules/process/fit-shape.c:2116
+#: modules/volume/volume_fdfit.c:453
 msgid "Correlation Matrix"
 msgstr "Korrelationsmatrix"
 
-#: modules/graph/graph_fdfit.c:447 modules/graph/graph_fit.c:485
-#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:532
+#: modules/graph/graph_fdfit.c:454 modules/graph/graph_fit.c:492
+#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:508
 #, fuzzy
 msgid "Instant:"
 msgstr "Sofort:"
 
-#: modules/graph/graph_fdfit.c:450 modules/graph/graph_fit.c:488
+#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
 #, fuzzy
 msgid "esti_mate"
 msgstr "_Abschätzung"
 
-#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
-#: modules/volume/volume_fdfit.c:542
+#: modules/graph/graph_fdfit.c:464 modules/graph/graph_fit.c:502
+#: modules/volume/volume_fdfit.c:518
 msgid "p_lot"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:708 modules/graph/graph_fit.c:762
-#: modules/volume/volume_fdfit.c:906
+#: modules/graph/graph_fdfit.c:724 modules/graph/graph_fit.c:778
+#: modules/volume/volume_fdfit.c:882
 #, fuzzy
 msgid "Estimate"
 msgstr "_Abschätzung"
 
-#: modules/graph/graph_fdfit.c:1410 modules/graph/graph_fit.c:1547
-#: modules/volume/volume_fdfit.c:1768
+#: modules/graph/graph_fdfit.c:1428 modules/graph/graph_fit.c:1565
+#: modules/volume/volume_fdfit.c:1744
 #, fuzzy, c-format
 msgid "Residual sum:   %g\n"
 msgstr "Restsumme:   %g\n"
 
-#: modules/graph/graph_fdfit.c:1413 modules/graph/graph_fit.c:1550
-#: modules/volume/volume_fdfit.c:1771
+#: modules/graph/graph_fdfit.c:1431 modules/graph/graph_fit.c:1568
+#: modules/volume/volume_fdfit.c:1747
 msgid "Correlation matrix\n"
 msgstr "Korrelationsmatrix\n"
 
@@ -7218,27 +7411,27 @@ msgstr "_Filter:"
 msgid "Remove noise from graph curves"
 msgstr "Diagrammkurven nivellieren"
 
-#: modules/graph/graph_fit.c:181
+#: modules/graph/graph_fit.c:182
 msgid "Fit graph with function"
 msgstr "Graphen mit Funktion fitten"
 
-#: modules/graph/graph_fit.c:195
+#: modules/graph/graph_fit.c:196
 msgid "/_Fit Function..."
 msgstr "/_Funktion fitten..."
 
-#: modules/graph/graph_fit.c:198
+#: modules/graph/graph_fit.c:199
 msgid "Fit a function on graph data"
 msgstr "Funktion an Graphen fitten"
 
-#: modules/graph/graph_fit.c:386
+#: modules/graph/graph_fit.c:393
 msgid "Copy all fitted values to estimates"
 msgstr ""
 
-#: modules/graph/graph_fit.c:460
+#: modules/graph/graph_fit.c:467
 msgid "Plot full range"
 msgstr ""
 
-#: modules/graph/graph_fit.c:470
+#: modules/graph/graph_fit.c:477
 #, fuzzy
 msgid "Create a difference graph"
 msgstr "Richtungsdifferenz"
@@ -7331,57 +7524,153 @@ msgstr ""
 msgid "Find graph curve peaks"
 msgstr "Diagrammkurven nivellieren"
 
-#: modules/graph/graph_peaks.c:157
+#: modules/graph/graph_peaks.c:155
 msgid "Prominence"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:161
+#: modules/graph/graph_peaks.c:159
 #, fuzzy
 msgid "Zero"
 msgstr "Auf _Null setzen"
 
-#: modules/graph/graph_peaks.c:162
+#: modules/graph/graph_peaks.c:160
 msgid "Bilateral minimum"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:178
+#: modules/graph/graph_peaks.c:176
 #, fuzzy
 msgid "Graph Peaks"
 msgstr "Graphen"
 
-#: modules/graph/graph_peaks.c:212
+#: modules/graph/graph_peaks.c:209
 #, fuzzy
 msgid "_Background type:"
 msgstr "Untergrund"
 
-#: modules/graph/graph_peaks.c:227
+#: modules/graph/graph_peaks.c:219
 msgid "Order peaks _by:"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:242
+#: modules/graph/graph_peaks.c:225
 #, fuzzy
 msgid "Number of _peaks:"
 msgstr "A_nzahl an Schritten:"
 
-#: modules/graph/graph_peaks.c:263 modules/process/curvature.c:773
-#: modules/process/grain_stat.c:360 modules/process/measure_lattice.c:396
-#: modules/process/polylevel.c:607 modules/tools/distance.c:259
-#: modules/tools/roughness.c:818 modules/tools/stats.c:450
+#: modules/graph/graph_peaks.c:245 modules/graph/graph_stats.c:367
+#: modules/process/curvature.c:770 modules/process/grain_stat.c:360
+#: modules/process/measure_lattice.c:390 modules/process/polylevel.c:610
+#: modules/tools/distance.c:259 modules/tools/roughness.c:819
+#: modules/tools/stats.c:447
 msgid "Save table to a file"
 msgstr "Tabelle in eine Datei speichern"
 
-#: modules/graph/graph_peaks.c:267 modules/process/curvature.c:778
-#: modules/process/grain_stat.c:365 modules/process/measure_lattice.c:400
-#: modules/process/polylevel.c:617 modules/tools/distance.c:264
-#: modules/tools/roughness.c:823 modules/tools/stats.c:455
+#: modules/graph/graph_peaks.c:249 modules/graph/graph_stats.c:371
+#: modules/process/curvature.c:775 modules/process/grain_stat.c:365
+#: modules/process/measure_lattice.c:394 modules/process/polylevel.c:620
+#: modules/tools/distance.c:264 modules/tools/roughness.c:824
+#: modules/tools/stats.c:452
 msgid "Copy table to clipboard"
 msgstr "Tabelle in die Zwischenablage kopieren"
 
-#: modules/graph/graph_peaks.c:654
+#: modules/graph/graph_peaks.c:618
 #, fuzzy
 msgid "Save Peak Parameters"
 msgstr "Rauigkeits-Parameter speichern"
 
+#: modules/graph/graph_stats.c:148 modules/graph/graph_stats.c:161
+#: modules/tools/stats.c:205
+msgid "Average value:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:149 modules/tools/stats.c:206
+msgid "Median:"
+msgstr "Median:"
+
+#: modules/graph/graph_stats.c:150
+#, fuzzy
+msgid "Ra:"
+msgstr "Realteil"
+
+#: modules/graph/graph_stats.c:151
+msgid "Rms (Rq):"
+msgstr ""
+
+#: modules/graph/graph_stats.c:152 modules/tools/stats.c:210
+msgid "Skew:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:153 modules/tools/stats.c:211
+msgid "Kurtosis:"
+msgstr "Wölbung:"
+
+#: modules/graph/graph_stats.c:158
+#, fuzzy
+msgid "Projected length:"
+msgstr "Projizierte Umrandungslänge"
+
+#: modules/graph/graph_stats.c:159
+msgid "Developed length:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:160 modules/tools/stats.c:214
+#, fuzzy
+msgid "Variation:"
+msgstr "Varianz:"
+
+#: modules/graph/graph_stats.c:162
+#, fuzzy
+msgid "Area under curve:"
+msgstr "_Graph"
+
+#: modules/graph/graph_stats.c:163
+#, fuzzy
+msgid "Positive area:"
+msgstr "Positiv"
+
+#: modules/graph/graph_stats.c:164
+#, fuzzy
+msgid "Negative area:"
+msgstr "Negativ"
+
+#: modules/graph/graph_stats.c:165
+msgid "Root mean square:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:171
+#, fuzzy
+msgid "Calculates simple graph curve statistics."
+msgstr "Einfache Körnungsstatistiken"
+
+#: modules/graph/graph_stats.c:185
+#, fuzzy
+msgid "/_Statistics..."
+msgstr "/_Körnung/_Statistik..."
+
+#: modules/graph/graph_stats.c:188
+#, fuzzy
+msgid "Calculate graph curve statistics"
+msgstr "Statistikfunktionen für Zeile/Spalte berechnen"
+
+#: modules/graph/graph_stats.c:241
+#, fuzzy
+msgid "Graph Statistics"
+msgstr "Korn-Statistiken"
+
+#: modules/graph/graph_stats.c:320 modules/graph/graph_stats.c:807
+#, fuzzy
+msgid "Simple Parameters"
+msgstr "Fit-Parameter"
+
+#: modules/graph/graph_stats.c:342 modules/graph/graph_stats.c:826
+#, fuzzy
+msgid "Integrals"
+msgstr "Interpolationstyp:"
+
+#: modules/graph/graph_stats.c:686
+#, fuzzy
+msgid "Save Curve Statistics"
+msgstr "Korn-Statistiken"
+
 #: modules/layer/axis.c:143
 msgid "Layer allowing selection of horizontal or vertical lines."
 msgstr "Ebene zur Auswahl horizontaler oder vertikaler Linien."
@@ -7527,26 +7816,26 @@ msgstr "Winkelverteilung"
 msgid "Angle Distribution"
 msgstr "Winkelverteilung"
 
-#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:373
+#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:365
 msgid "Output _size:"
 msgstr "Ausgabe_größe:"
 
-#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:206
+#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:207
 msgid "_Number of steps:"
 msgstr "A_nzahl an Schritten:"
 
-#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:380
+#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:372
 msgid "_Logarithmic value scale"
 msgstr "_Logarithmische Skalierung"
 
 #: modules/process/angle_dist.c:204 modules/process/entropy.c:231
-#: modules/process/slope_dist.c:390
+#: modules/process/slope_dist.c:382
 #, fuzzy
 msgid "Use local plane _fitting"
 msgstr "Lokalen Ebenen-_Fit verwenden"
 
 #: modules/process/angle_dist.c:213 modules/process/entropy.c:242
-#: modules/process/slope_dist.c:401
+#: modules/process/slope_dist.c:393
 msgid "_Plane size:"
 msgstr "_Ebenengröße:"
 
@@ -7565,7 +7854,8 @@ msgstr "/M_ultidaten/_Arithmetik..."
 msgid "Arithmetic operations on data"
 msgstr "Arithmetische Operationen"
 
-#: modules/process/arithmetic.c:202 modules/process/superresolution.c:349
+#: modules/process/arithmetic.c:202 modules/process/stitch.c:234
+#: modules/process/superresolution.c:348
 msgid "Calculated"
 msgstr ""
 
@@ -7581,7 +7871,7 @@ msgstr "_Ausdruck:"
 msgid "Operands"
 msgstr "Operanden"
 
-#: modules/process/arithmetic.c:300 modules/process/dimensions.h:483
+#: modules/process/arithmetic.c:300 modules/process/dimensions.h:465
 msgid "Units"
 msgstr "Einheiten"
 
@@ -7603,15 +7893,15 @@ msgstr ""
 msgid "Expression contains unknown identifiers"
 msgstr ""
 
-#: modules/process/arithmetic.c:569 modules/process/superresolution.c:300
+#: modules/process/arithmetic.c:569 modules/process/superresolution.c:299
 msgid "Pixel dimensions differ"
 msgstr "Pixelgrößen unterscheiden sich"
 
-#: modules/process/arithmetic.c:571 modules/process/superresolution.c:302
+#: modules/process/arithmetic.c:571 modules/process/superresolution.c:301
 msgid "Lateral dimensions are different physical quantities"
 msgstr ""
 
-#: modules/process/arithmetic.c:574 modules/process/superresolution.c:305
+#: modules/process/arithmetic.c:574 modules/process/superresolution.c:304
 msgid "Physical dimensions differ"
 msgstr ""
 
@@ -7720,7 +8010,7 @@ msgstr ""
 
 #: modules/process/bdep_synth.c:164
 #, fuzzy
-msgid "/S_ynthetic/_Ballistic..."
+msgid "/S_ynthetic/_Deposition/_Ballistic..."
 msgstr "/S_ynthetisch/_Partikel..."
 
 #: modules/process/bdep_synth.c:168
@@ -7729,20 +8019,23 @@ msgstr ""
 
 #: modules/process/bdep_synth.c:239 modules/process/bdep_synth.c:596
 #: modules/process/calcoefs_simple.c:636 modules/process/col_synth.c:282
-#: modules/process/col_synth.c:733 modules/process/crosscor.c:819
-#: modules/process/crosscor.c:882 modules/process/deposit_synth.c:268
-#: modules/process/deposit_synth.c:859 modules/process/diff_synth.c:304
-#: modules/process/diff_synth.c:705 modules/process/domain_synth.c:255
-#: modules/process/domain_synth.c:745 modules/process/grain_wshed.c:429
+#: modules/process/col_synth.c:734 modules/process/crosscor.c:792
+#: modules/process/crosscor.c:855 modules/process/deposit_synth.c:268
+#: modules/process/deposit_synth.c:858 modules/process/diff_synth.c:304
+#: modules/process/diff_synth.c:704 modules/process/domain_synth.c:255
+#: modules/process/domain_synth.c:745 modules/process/fibre_synth.c:357
+#: modules/process/fibre_synth.c:872 modules/process/grain_wshed.c:433
 #: modules/process/lat_synth.c:491 modules/process/mark_disconn.c:148
-#: modules/process/mark_disconn.c:373 modules/process/maskcor.c:330
-#: modules/process/mcrop.c:315 modules/process/merge.c:1072
-#: modules/process/nanoindent_adjust.c:323 modules/process/neural.c:1272
-#: modules/process/pid.c:338 modules/process/superresolution.c:416
-#: modules/process/superresolution.c:505 modules/process/tip_blind.c:781
-#: modules/process/tipops.c:320 modules/process/xydenoise.c:213
-#: modules/volume/volume_kmeans.c:403 modules/volume/volume_kmedians.c:365
-#: modules/xyz/xyz_raster.c:1028 modules/xyz/xyz_raster.c:1044
+#: modules/process/mark_disconn.c:361 modules/process/maskcor.c:334
+#: modules/process/mcrop.c:314 modules/process/merge.c:1072
+#: modules/process/nanoindent_adjust.c:324 modules/process/neural.c:1279
+#: modules/process/pid.c:339 modules/process/sphere-revolve.c:269
+#: modules/process/superresolution.c:415 modules/process/superresolution.c:504
+#: modules/process/tip_blind.c:778 modules/process/tipops.c:320
+#: modules/process/wave_synth.c:305 modules/process/wave_synth.c:747
+#: modules/process/xydenoise.c:214 modules/volume/volume_kmeans.c:397
+#: modules/volume/volume_kmedians.c:363 modules/xyz/xyz_raster.c:997
+#: modules/xyz/xyz_raster.c:1013
 msgid "Initializing..."
 msgstr "Initialisiere..."
 
@@ -7751,10 +8044,11 @@ msgstr "Initialisiere..."
 #: modules/process/deposit_synth.c:531 modules/process/deposit_synth.c:544
 #: modules/process/diff_synth.c:342 modules/process/domain_synth.c:319
 #: modules/process/domain_synth.c:327 modules/process/fbm_synth.c:278
-#: modules/process/fft_synth.c:314 modules/process/lat_synth.c:529
-#: modules/process/lno_synth.c:407 modules/process/noise_synth.c:311
-#: modules/process/obj_synth.c:407 modules/process/pat_synth.c:357
-#: modules/process/wave_synth.c:323
+#: modules/process/fft_synth.c:314 modules/process/fibre_synth.c:394
+#: modules/process/lat_synth.c:529 modules/process/lno_synth.c:405
+#: modules/process/noise_synth.c:309 modules/process/obj_synth.c:404
+#: modules/process/pat_synth.c:357 modules/process/phase_synth.c:518
+#: modules/process/wave_synth.c:342
 msgid "Generated"
 msgstr ""
 
@@ -7775,54 +8069,61 @@ msgid "Progressive preview"
 msgstr ""
 
 #: modules/process/bdep_synth.c:407 modules/process/col_synth.c:458
-#: modules/process/deposit_synth.c:412 modules/process/diff_synth.c:477
+#: modules/process/deposit_synth.c:413 modules/process/diff_synth.c:477
 #: modules/process/domain_synth.c:430 modules/process/fbm_synth.c:360
-#: modules/process/fft_synth.c:398 modules/process/lat_synth.c:626
-#: modules/process/lno_synth.c:490 modules/process/noise_synth.c:394
-#: modules/process/obj_synth.c:498 modules/process/pat_synth.c:442
-#: modules/process/wave_synth.c:407
+#: modules/process/fft_synth.c:398 modules/process/fibre_synth.c:479
+#: modules/process/lat_synth.c:626 modules/process/lno_synth.c:488
+#: modules/process/mfm_current.c:383 modules/process/mfm_parallel.c:384
+#: modules/process/noise_synth.c:392 modules/process/obj_synth.c:495
+#: modules/process/pat_synth.c:442 modules/process/phase_synth.c:263
+#: modules/process/wave_synth.c:426
 #, fuzzy
 msgid "Dimensions"
 msgstr "Abmessungen"
 
 #: modules/process/bdep_synth.c:416 modules/process/col_synth.c:467
-#: modules/process/deposit_synth.c:422 modules/process/diff_synth.c:486
+#: modules/process/deposit_synth.c:425 modules/process/diff_synth.c:486
 #: modules/process/domain_synth.c:438 modules/process/fbm_synth.c:371
-#: modules/process/fft_synth.c:409 modules/process/lno_synth.c:501
-#: modules/process/noise_synth.c:405 modules/process/obj_synth.c:509
-#: modules/process/pat_synth.c:454 modules/process/wave_synth.c:418
+#: modules/process/fft_synth.c:409 modules/process/fibre_synth.c:490
+#: modules/process/lno_synth.c:499 modules/process/mfm_current.c:412
+#: modules/process/mfm_parallel.c:411 modules/process/noise_synth.c:403
+#: modules/process/obj_synth.c:506 modules/process/pat_synth.c:454
+#: modules/process/phase_synth.c:274 modules/process/wave_synth.c:437
 msgid "Generator"
 msgstr ""
 
 #: modules/process/bdep_synth.c:422 modules/process/col_synth.c:473
-#: modules/process/diff_synth.c:492 modules/process/lno_synth.c:1041
-#: modules/process/obj_synth.c:520
+#: modules/process/deposit_synth.c:455 modules/process/diff_synth.c:492
+#: modules/process/fibre_synth.c:502 modules/process/lno_synth.c:1041
+#: modules/process/obj_synth.c:518
 #, fuzzy
 msgid "Co_verage:"
 msgstr "_Minimalwert"
 
 #: modules/process/bdep_synth.c:434 modules/process/diff_synth.c:512
-#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:412
-#: modules/process/fft_synth.c:418 modules/process/lat_synth.c:758
-#: modules/process/lno_synth.c:537 modules/process/noise_synth.c:437
-#: modules/process/obj_synth.c:579 modules/process/wave_synth.c:453
-msgid "_Like Current Channel"
-msgstr ""
+#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:411
+#: modules/process/fft_synth.c:418 modules/process/fibre_synth.c:544
+#: modules/process/lat_synth.c:758 modules/process/lno_synth.c:535
+#: modules/process/noise_synth.c:435 modules/process/obj_synth.c:577
+#: modules/process/phase_synth.c:302 modules/process/wave_synth.c:472
+#, fuzzy
+msgid "_Like Current Image"
+msgstr "Derzeitiger Kanal"
 
-#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:541
-#: modules/process/diff_synth.c:562
+#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:542
+#: modules/process/diff_synth.c:561
 #, fuzzy
 msgid "Evolution"
 msgstr "Auflösung"
 
-#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:544
-#: modules/process/diff_synth.c:565
+#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:545
+#: modules/process/diff_synth.c:564
 #, fuzzy
 msgid "Plot graphs:"
 msgstr "_Graphen zeichnen"
 
-#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:840
-#: modules/process/diff_synth.c:782
+#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:841
+#: modules/process/diff_synth.c:781
 msgid "Depositing particles..."
 msgstr ""
 
@@ -7859,8 +8160,8 @@ msgstr "Kalibrierdaten laden"
 msgid "Calibration name:"
 msgstr "Kalibrierungs-Name:"
 
-#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:433
-#: modules/volume/volume_extract.c:514
+#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:421
+#: modules/volume/volume_extract.c:501
 msgid "No data loaded"
 msgstr "Keine Daten geladen"
 
@@ -7884,7 +8185,7 @@ msgstr ""
 msgid "Load calibration data"
 msgstr "Kalibrierungsdaten einladen"
 
-#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1073
+#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1059
 #, c-format
 msgid "Error loading file '%s'"
 msgstr ""
@@ -7979,7 +8280,7 @@ msgstr ""
 msgid "Simple Error Map"
 msgstr ""
 
-#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:146
+#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:142
 #: modules/process/superresolution.c:156
 msgid "Operands:"
 msgstr "Operanden:"
@@ -7993,14 +8294,14 @@ msgid "Detail"
 msgstr ""
 
 #: modules/process/calcoefs_simple.c:371 modules/process/calcoefs_view.c:491
-#: modules/process/calibrate.c:496 modules/process/crosscor.c:289
-#: modules/volume/volume_calibrate.c:478
+#: modules/process/calibrate.c:481 modules/process/crosscor.c:276
+#: modules/volume/volume_calibrate.c:460
 msgid "_X offset:"
 msgstr ""
 
 #: modules/process/calcoefs_simple.c:398 modules/process/calcoefs_view.c:517
-#: modules/process/calibrate.c:509 modules/process/crosscor.c:300
-#: modules/volume/volume_calibrate.c:491
+#: modules/process/calibrate.c:488 modules/process/crosscor.c:284
+#: modules/volume/volume_calibrate.c:467
 msgid "_Y offset:"
 msgstr ""
 
@@ -8013,7 +8314,7 @@ msgid "Y p_eriod:"
 msgstr ""
 
 #: modules/process/calcoefs_simple.c:438 modules/process/calcoefs_view.c:529
-#: modules/volume/volume_calibrate.c:505
+#: modules/volume/volume_calibrate.c:474
 msgid "_Z offset:"
 msgstr ""
 
@@ -8045,26 +8346,26 @@ msgstr[1] ""
 msgid "Search canceled"
 msgstr "Suche abgebrochen"
 
-#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:862
-#: modules/process/maskcor.c:332 modules/process/mcrop.c:317
+#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:835
+#: modules/process/maskcor.c:336 modules/process/mcrop.c:316
 #: modules/process/merge.c:1074
 #, fuzzy
 msgid "Correlating..."
 msgstr "Korreliere"
 
-#: modules/process/calcoefs_stage.c:76
+#: modules/process/calcoefs_stage.c:72
 msgid "Digital AFM data recalibration"
 msgstr ""
 
-#: modules/process/calcoefs_stage.c:90
+#: modules/process/calcoefs_stage.c:86
 msgid "/Cali_bration/_3D Calibration/_Get From Stage map..."
 msgstr "/Kali_brierung/_3D-Kalibrierung/_Get From Stage map..."
 
-#: modules/process/calcoefs_stage.c:94
+#: modules/process/calcoefs_stage.c:90
 msgid "Stage error mapping"
 msgstr ""
 
-#: modules/process/calcoefs_stage.c:131
+#: modules/process/calcoefs_stage.c:127
 msgid "Stage Error Map"
 msgstr ""
 
@@ -8126,14 +8427,16 @@ msgstr "Maximaler z-Wert"
 msgid "Crop to actual data"
 msgstr "Daten zuschneiden"
 
-#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:369
-#: modules/process/deposit_synth.c:641 modules/process/edge.c:705
-#: modules/process/fft_filter_1d.c:299 modules/process/grain_edge.c:290
-#: modules/process/grain_filter.c:347 modules/process/grain_mark.c:372
-#: modules/process/mark_with.c:318 modules/process/polydistort.c:316
-#: modules/process/scars.c:386 modules/process/slope_dist.c:407
-#: modules/process/synth.h:513 modules/volume/volume_extract.c:424
-#: modules/volume/volume_extract.c:505 modules/volume/volume_linestat.c:422
+#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:368
+#: modules/process/deposit_synth.c:642 modules/process/edge.c:705
+#: modules/process/fft_filter_1d.c:301 modules/process/grain_edge.c:277
+#: modules/process/grain_filter.c:346 modules/process/grain_mark.c:357
+#: modules/process/mark_with.c:322 modules/process/mfm_field.c:420
+#: modules/process/mfm_shift.c:216 modules/process/polydistort.c:319
+#: modules/process/psf.c:309 modules/process/scars.c:421
+#: modules/process/slope_dist.c:400 modules/process/synth.h:542
+#: modules/volume/volume_extract.c:411 modules/volume/volume_extract.c:491
+#: modules/volume/volume_linestat.c:427
 msgid "I_nstant updates"
 msgstr "_Sofort aktualisieren"
 
@@ -8174,27 +8477,27 @@ msgstr ""
 msgid "Building mesh..."
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1818
+#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1867
 msgid "X correction"
 msgstr "X-Korrektur"
 
-#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1819
+#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1868
 msgid "Y correction"
 msgstr "Y-Korrektur"
 
-#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1820
+#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1869
 msgid "Z correction"
 msgstr "Z-Korrektur"
 
-#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1821
+#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1870
 msgid "X uncertainty"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1822
+#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1871
 msgid "Y uncertainty"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1823
+#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1872
 msgid "Z uncertainty"
 msgstr ""
 
@@ -8223,80 +8526,81 @@ msgstr "Einrasten am _Ursprung"
 msgid "Delaunay"
 msgstr "Delaunay"
 
-#: modules/process/calibrate.c:180
+#: modules/process/calibrate.c:172
 msgid "Recalibrates scan lateral dimensions or value range."
 msgstr ""
 
-#: modules/process/calibrate.c:194
+#: modules/process/calibrate.c:186
 msgid "/_Basic Operations/_Dimensions and Units..."
 msgstr "/_Grundfunktionen/_Abmessungen und Einheiten..."
 
-#: modules/process/calibrate.c:198 modules/volume/volume_calibrate.c:193
+#: modules/process/calibrate.c:190 modules/volume/volume_calibrate.c:193
 msgid "Change physical dimensions, units or value scale"
 msgstr ""
 
-#: modules/process/calibrate.c:357 modules/volume/volume_calibrate.c:355
+#: modules/process/calibrate.c:349 modules/volume/volume_calibrate.c:355
 msgid "Recalibrated Data"
 msgstr ""
 
-#: modules/process/calibrate.c:390
+#: modules/process/calibrate.c:382
 msgid "Dimensions and Units"
 msgstr "Abmessungen und Einheiten"
 
-#: modules/process/calibrate.c:411 modules/volume/volume_calibrate.c:389
+#: modules/process/calibrate.c:405 modules/volume/volume_calibrate.c:391
 msgid "New Real Dimensions"
 msgstr ""
 
-#: modules/process/calibrate.c:417
+#: modules/process/calibrate.c:415
 #, fuzzy
 msgid "_Match pixel size:"
 msgstr "_Punktgröße:"
 
-#: modules/process/calibrate.c:444 modules/volume/volume_calibrate.c:394
+#: modules/process/calibrate.c:447 modules/volume/volume_calibrate.c:397
 msgid "_X range:"
 msgstr ""
 
-#: modules/process/calibrate.c:473 modules/volume/volume_calibrate.c:421
+#: modules/process/calibrate.c:467 modules/volume/volume_calibrate.c:417
 msgid "_Y range:"
 msgstr ""
 
-#: modules/process/calibrate.c:489
+#: modules/process/calibrate.c:472
 msgid "_Square samples"
 msgstr ""
 
-#: modules/process/calibrate.c:524 modules/volume/volume_calibrate.c:521
+#: modules/process/calibrate.c:496 modules/volume/volume_calibrate.c:480
 #, fuzzy
 msgid "Value Range"
 msgstr "Wertebereich"
 
-#: modules/process/calibrate.c:529 modules/volume/volume_calibrate.c:448
+#: modules/process/calibrate.c:502 modules/volume/volume_calibrate.c:437
 msgid "_Z range:"
 msgstr ""
 
-#: modules/process/calibrate.c:558
+#: modules/process/calibrate.c:524
 msgid "Z shi_ft:"
 msgstr ""
 
-#: modules/process/calibrate.c:573 modules/volume/volume_calibrate.c:570
+#: modules/process/calibrate.c:533 modules/volume/volume_calibrate.c:515
 msgid "Calibration Coefficients"
 msgstr "Kalibrierungs-Koeffizienten"
 
-#: modules/process/calibrate.c:580 modules/volume/volume_calibrate.c:577
+#: modules/process/calibrate.c:538 modules/volume/volume_calibrate.c:520
 msgid "_X calibration factor:"
 msgstr "Kalibrierfaktor _X:"
 
-#: modules/process/calibrate.c:590 modules/volume/volume_calibrate.c:585
+#: modules/process/calibrate.c:545 modules/volume/volume_calibrate.c:527
 msgid "_Y calibration factor:"
 msgstr "Kalibrierfaktor _Y:"
 
-#: modules/process/calibrate.c:600 modules/volume/volume_calibrate.c:593
+#: modules/process/calibrate.c:552 modules/volume/volume_calibrate.c:534
 msgid "_Z calibration factor:"
 msgstr "Kalibrierfaktor _Z:"
 
-#: modules/process/calibrate.c:613 modules/process/extend.c:293
-#: modules/tools/crop.c:213
-msgid "Create new channel"
-msgstr "Neuen Kanal erzeugen"
+#: modules/process/calibrate.c:567 modules/process/drift.c:389
+#: modules/process/extend.c:293 modules/tools/crop.c:213
+#, fuzzy
+msgid "Create new image"
+msgstr "Ein neues Element erzeugen"
 
 #: modules/process/coerce.c:159
 msgid "Transforms surfaces to have prescribed statistical properties."
@@ -8316,14 +8620,14 @@ msgid "Coerced"
 msgstr ""
 
 #: modules/process/coerce.c:225 modules/process/coerce.c:326
-#: modules/process/fbm_synth.c:475 modules/process/lno_synth.c:256
-#: modules/process/noise_synth.c:183
+#: modules/process/fbm_synth.c:474 modules/process/lno_synth.c:254
+#: modules/process/noise_synth.c:181
 #, fuzzy
 msgid "distribution|Uniform"
 msgstr "Winkelverteilung"
 
-#: modules/process/coerce.c:226 modules/process/fbm_synth.c:476
-#: modules/process/lno_synth.c:246 modules/process/noise_synth.c:173
+#: modules/process/coerce.c:226 modules/process/fbm_synth.c:475
+#: modules/process/lno_synth.c:244 modules/process/noise_synth.c:171
 msgid "distribution|Gaussian"
 msgstr "Gauß"
 
@@ -8382,12 +8686,12 @@ msgid "Number of maxima"
 msgstr "Anzahl an Körnern"
 
 #: modules/process/col_synth.c:173 modules/tools/linestats.c:178
-#: modules/volume/volume_linestat.c:154
+#: modules/volume/volume_linestat.c:156
 msgid "Skew"
 msgstr ""
 
 #: modules/process/col_synth.c:174 modules/tools/linestats.c:179
-#: modules/tools/roughness.c:386 modules/volume/volume_linestat.c:155
+#: modules/tools/roughness.c:387 modules/volume/volume_linestat.c:157
 msgid "Kurtosis"
 msgstr ""
 
@@ -8402,7 +8706,7 @@ msgstr ""
 
 #: modules/process/col_synth.c:208
 #, fuzzy
-msgid "/S_ynthetic/_Columnar..."
+msgid "/S_ynthetic/_Deposition/_Columnar..."
 msgstr "/S_ynthetisch/_Muster..."
 
 #: modules/process/col_synth.c:212
@@ -8428,7 +8732,7 @@ msgstr ""
 msgid "Inclination"
 msgstr "Kreuzungen"
 
-#: modules/process/col_synth.c:509 modules/process/crosscor.c:1063
+#: modules/process/col_synth.c:509 modules/process/crosscor.c:1036
 #, fuzzy
 msgid "Direction"
 msgstr "Richtung:"
@@ -8438,16 +8742,16 @@ msgstr "Richtung:"
 msgid "Relaxation type:"
 msgstr "_Interpolationstyp:"
 
-#: modules/process/col_synth.c:528
+#: modules/process/col_synth.c:529
 #, fuzzy
 msgid "_Melting:"
 msgstr "_Skala:"
 
-#: modules/process/col_synth.c:612
+#: modules/process/col_synth.c:613
 msgid "Weak"
 msgstr ""
 
-#: modules/process/col_synth.c:613
+#: modules/process/col_synth.c:614
 msgid "Strong"
 msgstr ""
 
@@ -8482,8 +8786,8 @@ msgstr "Genereller Faltungsfilter"
 msgid "Convolution Filter"
 msgstr "Faltungsfilter"
 
-#: modules/process/convolution_filter.c:269 modules/tools/filter.c:170
-#: modules/tools/filter.c:274
+#: modules/process/convolution_filter.c:269 modules/tools/filter.c:171
+#: modules/tools/filter.c:275
 msgid "Filter"
 msgstr "Filter"
 
@@ -8511,119 +8815,128 @@ msgstr "HSym"
 msgid "VSym"
 msgstr "VSym"
 
-#: modules/process/correct_affine.c:231
+#: modules/process/correct_affine.c:220
 msgid ""
 "Corrects affine distortion of images by matching image Bravais lattice to "
 "the true one."
 msgstr ""
 
-#: modules/process/correct_affine.c:246
+#: modules/process/correct_affine.c:235
 #, fuzzy
 msgid "/_Distortion/_Affine..."
 msgstr "/_Präsentation/_Schattierung..."
 
-#: modules/process/correct_affine.c:250
+#: modules/process/correct_affine.c:239
 #, fuzzy
 msgid "Correct affine distortion"
 msgstr "Berechne Winkelverteilung"
 
-#: modules/process/correct_affine.c:298
+#: modules/process/correct_affine.c:309 modules/process/correct_affine.c:634
+#, fuzzy
+msgid "Corrected"
+msgstr "Korrigier_te Daten"
+
+#: modules/process/correct_affine.c:343
 #, fuzzy
 msgid "Affine Correction"
 msgstr "/Ko_rrigieren/_Median Zeilenkorrektur"
 
-#: modules/process/correct_affine.c:351 modules/process/fft_filter_2d.c:530
+#: modules/process/correct_affine.c:349 modules/process/measure_lattice.c:249
+msgid "_Refine"
+msgstr ""
+
+#: modules/process/correct_affine.c:399 modules/process/fft_filter_2d.c:530
 msgid "Preview Options"
 msgstr "Vorschau-Optionen"
 
-#: modules/process/correct_affine.c:356 modules/process/fft_filter_2d.c:535
-#: modules/process/measure_lattice.c:321
+#: modules/process/correct_affine.c:404 modules/process/fft_filter_2d.c:535
+#: modules/process/measure_lattice.c:311
 #, fuzzy
 msgid "Display:"
 msgstr "_Anzeige:"
 
-#: modules/process/correct_affine.c:364 modules/process/measure_lattice.c:329
+#: modules/process/correct_affine.c:412 modules/process/measure_lattice.c:319
 #: modules/tools/grainremover.c:109
 msgid "_Data"
 msgstr "_Daten"
 
-#: modules/process/correct_affine.c:365
+#: modules/process/correct_affine.c:413
 msgid "2D _ACF"
 msgstr ""
 
-#: modules/process/correct_affine.c:366 modules/process/drift.c:365
+#: modules/process/correct_affine.c:414 modules/process/drift.c:364
 msgid "Correc_ted data"
 msgstr "Korrigier_te Daten"
 
-#: modules/process/correct_affine.c:377
+#: modules/process/correct_affine.c:425
 msgid "ACF zoom:"
 msgstr ""
 
-#: modules/process/correct_affine.c:394 modules/process/measure_lattice.c:372
+#: modules/process/correct_affine.c:442 modules/process/measure_lattice.c:346
+#, fuzzy
+msgid "Interpolate _horizontal ACF"
+msgstr "Interpolationstyp:"
+
+#: modules/process/correct_affine.c:452 modules/process/measure_lattice.c:372
 msgid "Lattice Vectors"
 msgstr ""
 
 #. TRANSLATORS: Correct is an adjective here.
-#: modules/process/correct_affine.c:419
+#: modules/process/correct_affine.c:469
 #, fuzzy
 msgid "Correct Lattice"
 msgstr "Daten _korrigieren"
 
-#: modules/process/correct_affine.c:423
+#: modules/process/correct_affine.c:473
 #, fuzzy
 msgid "_Lattice type:"
 msgstr "_Linientyp:"
 
-#: modules/process/correct_affine.c:430
+#: modules/process/correct_affine.c:480
 msgid "User defined"
 msgstr ""
 
-#: modules/process/correct_affine.c:445
+#: modules/process/correct_affine.c:495
 #, fuzzy
 msgid "_Different lengths"
 msgstr "Differenz"
 
-#: modules/process/correct_affine.c:474
+#: modules/process/correct_affine.c:524
 msgid "Image for _ACF:"
 msgstr ""
 
-#: modules/process/correct_affine.c:501
+#: modules/process/correct_affine.c:551
 #, fuzzy
 msgid "_Scaling:"
 msgstr "_Skala:"
 
-#: modules/process/correct_affine.c:508
+#: modules/process/correct_affine.c:558
 msgid "Exactly as specified"
 msgstr ""
 
-#: modules/process/correct_affine.c:509
+#: modules/process/correct_affine.c:560
 #, fuzzy
 msgid "Preserve area"
 msgstr "Projizierte Fläche"
 
-#: modules/process/correct_affine.c:510
+#: modules/process/correct_affine.c:562
 msgid "Preserve X scale"
 msgstr ""
 
-#: modules/process/correct_affine.c:561
-#, fuzzy
-msgid "Corrected"
-msgstr "Korrigier_te Daten"
+#: modules/process/correct_affine.c:571 modules/process/drift.c:379
+msgid "_Apply to all compatible images"
+msgstr ""
 
-#: modules/process/correct_affine.c:617 modules/process/measure_lattice.c:489
+#: modules/process/correct_affine.c:693 modules/process/measure_lattice.c:482
 #, fuzzy
 msgid "length"
 msgstr "Länge"
 
-#: modules/process/correct_affine.c:624 modules/process/measure_lattice.c:496
+#: modules/process/correct_affine.c:700 modules/process/measure_lattice.c:489
 #, fuzzy
 msgid "angle"
 msgstr "Winkel"
 
-#: modules/process/correct_affine.c:717
-msgid "Re_fine"
-msgstr ""
-
 #: modules/process/crosscor.c:157
 msgid "Calculates cross-correlation of two data fields."
 msgstr "Berechnet Kreuzkorrelation zweier Datenfelder."
@@ -8649,217 +8962,219 @@ msgstr "Ko_rrelieren mit:"
 msgid "Search size"
 msgstr "Such-Größe"
 
-#: modules/process/crosscor.c:272
-msgid "Global offset of 2nd channel"
+#: modules/process/crosscor.c:267
+msgid "_Guess"
 msgstr ""
 
-#: modules/process/crosscor.c:277
-msgid "_Guess"
+#: modules/process/crosscor.c:268
+msgid "Global offset of 2nd channel"
 msgstr ""
 
-#: modules/process/crosscor.c:311
+#: modules/process/crosscor.c:292
 msgid "Window size"
 msgstr "Fenstergröße"
 
-#: modules/process/crosscor.c:319
+#: modules/process/crosscor.c:300
 msgid "W_idth:"
 msgstr "_Breite:"
 
-#: modules/process/crosscor.c:329
+#: modules/process/crosscor.c:308
 msgid "Hei_ght:"
 msgstr "_Höhe:"
 
-#: modules/process/crosscor.c:342 modules/process/fft.c:405
+#: modules/process/crosscor.c:319 modules/process/fft.c:403
 #: modules/process/psdf_logphi.c:268
 #, fuzzy
 msgid "_Windowing type:"
 msgstr "_Randausblendungsmethode"
 
-#: modules/process/crosscor.c:350
+#: modules/process/crosscor.c:327
 msgid "All"
 msgstr ""
 
-#: modules/process/crosscor.c:351
+#: modules/process/crosscor.c:328
 #, fuzzy
 msgid "Absolute"
 msgstr "Absolut"
 
-#: modules/process/crosscor.c:352
+#: modules/process/crosscor.c:329
 msgid "X Distance"
 msgstr "X Abstand"
 
-#: modules/process/crosscor.c:353
+#: modules/process/crosscor.c:330
 msgid "Y Distance"
 msgstr "Y Abstand"
 
-#: modules/process/crosscor.c:355 modules/process/crosscor.c:1077
+#: modules/process/crosscor.c:332 modules/process/crosscor.c:1050
 msgid "Score"
 msgstr ""
 
-#: modules/process/crosscor.c:357 modules/process/fft.c:395
-#: modules/process/fit-shape.c:688 modules/process/maskcor.c:176
+#: modules/process/crosscor.c:334 modules/process/fft.c:393
+#: modules/process/fit-shape.c:699 modules/process/maskcor.c:177
+#: modules/process/mfm_current.c:455 modules/process/mfm_field.c:373
+#: modules/process/mfm_parallel.c:466
 msgid "Output _type:"
 msgstr "Ausgabe_art:"
 
-#: modules/process/crosscor.c:363
+#: modules/process/crosscor.c:340
 msgid "Add _low score results mask"
 msgstr ""
 
-#: modules/process/crosscor.c:374 modules/process/grain_wshed.c:223
-#: modules/process/maskcor.c:188
+#: modules/process/crosscor.c:351 modules/process/grain_wshed.c:225
+#: modules/process/maskcor.c:191
 msgid "T_hreshold:"
 msgstr "_Schwellwert:"
 
-#: modules/process/crosscor.c:381
+#: modules/process/crosscor.c:359
 #, fuzzy
 msgid "Multichannel cross-corelation"
 msgstr "/M_ultidaten/_Kreuzkorrelation..."
 
-#: modules/process/crosscor.c:400
+#: modules/process/crosscor.c:378
 #, fuzzy
 msgid "Second _source data:"
 msgstr "Nivellierte Daten"
 
-#: modules/process/crosscor.c:417
+#: modules/process/crosscor.c:394
 #, fuzzy
 msgid "Correlate with:"
 msgstr "Ko_rrelieren mit:"
 
-#: modules/process/crosscor.c:424
+#: modules/process/crosscor.c:402
 #, fuzzy
 msgid "Postprocess:"
 msgstr "Daten aufbereiten"
 
-#: modules/process/crosscor.c:431
-msgid "Apply Ga_ussian filter of width: "
+#: modules/process/crosscor.c:411
+msgid "Apply Ga_ussian filter of width:"
 msgstr ""
 
-#: modules/process/crosscor.c:451
+#: modules/process/crosscor.c:424
 msgid "Extend results to borders"
 msgstr ""
 
-#: modules/process/crosscor.c:461
+#: modules/process/crosscor.c:433
 msgid "Create corrected data from 2nd channel"
 msgstr ""
 
-#: modules/process/crosscor.c:860
+#: modules/process/crosscor.c:833
 #, fuzzy
 msgid "Correlating first set..."
 msgstr "Korreliere..."
 
-#: modules/process/crosscor.c:892
+#: modules/process/crosscor.c:865
 #, fuzzy
 msgid "Correlating second set..."
 msgstr "Korreliere..."
 
-#: modules/process/crosscor.c:999
+#: modules/process/crosscor.c:972
 #, fuzzy
 msgid "Corrected 2nd channel"
 msgstr "Neuen Kanal erzeugen"
 
-#: modules/process/crosscor.c:1023
+#: modules/process/crosscor.c:996
 msgid "X difference"
 msgstr "X Differenz"
 
-#: modules/process/crosscor.c:1037
+#: modules/process/crosscor.c:1010
 msgid "Y difference"
 msgstr "Y Differenz"
 
-#: modules/process/crosscor.c:1050
+#: modules/process/crosscor.c:1023
 msgid "Absolute difference"
 msgstr "Absolute Differenz"
 
-#: modules/process/curvature.c:131
+#: modules/process/curvature.c:130
 #, fuzzy
 msgid "Center value"
 msgstr "Zentraler Wert"
 
-#: modules/process/curvature.c:132
+#: modules/process/curvature.c:131
 #, fuzzy
 msgid "Curvature radius 1"
 msgstr "Krümmungsradius 1"
 
-#: modules/process/curvature.c:133
+#: modules/process/curvature.c:132
 #, fuzzy
 msgid "Curvature radius 2"
 msgstr "Krümmungsradius 2"
 
-#: modules/process/curvature.c:134
+#: modules/process/curvature.c:133
 #, fuzzy
 msgid "Direction 1"
 msgstr "Richtung 1"
 
-#: modules/process/curvature.c:135
+#: modules/process/curvature.c:134
 #, fuzzy
 msgid "Direction 2"
 msgstr "Richtung 2"
 
-#: modules/process/curvature.c:163
+#: modules/process/curvature.c:162
 msgid "Calculates overall curvature."
 msgstr ""
 
-#: modules/process/curvature.c:177
+#: modules/process/curvature.c:176
 #, fuzzy
 msgid "/_Level/_Curvature..."
 msgstr "/_Nivellierung/_Krümmung..."
 
-#: modules/process/curvature.c:181
+#: modules/process/curvature.c:180
 msgid "Calculate overall curvature"
 msgstr ""
 
-#: modules/process/curvature.c:211 modules/process/facet-level.c:118
+#: modules/process/curvature.c:210 modules/process/facet-level.c:118
 #: modules/process/semsim.c:165
 #, c-format
 msgid "%s: Lateral dimensions and value must be the same physical quantity."
 msgstr ""
 
-#: modules/process/curvature.c:445
+#: modules/process/curvature.c:447
 #, fuzzy
 msgid "Curvature Sections"
 msgstr "Krümmungsabschnitte"
 
-#: modules/process/curvature.c:653
+#: modules/process/curvature.c:655
 #, fuzzy
 msgid "Output Type"
 msgstr "Ausgabe_art:"
 
-#: modules/process/curvature.c:660
+#: modules/process/curvature.c:662
 #, fuzzy
 msgid "_Set selection"
 msgstr "_Auswahlmodus:"
 
-#: modules/process/curvature.c:670
+#: modules/process/curvature.c:672
 #, fuzzy
 msgid "_Plot graph"
 msgstr "_Graphen zeichnen"
 
-#: modules/process/curvature.c:685 modules/process/drift.c:337
-#: modules/process/fft_profile.c:310 modules/process/fractal.c:328
-#: modules/process/grain_cross.c:253 modules/process/linematch.c:885
-#: modules/process/slope_dist.c:349 modules/tools/linestats.c:418
-#: modules/tools/profile.c:573 modules/tools/roughness.c:872
-#: modules/tools/sfunctions.c:486 modules/tools/spectro.c:382
-#: modules/volume/volume_slice.c:398
-#, fuzzy
-msgid "Target _graph:"
-msgstr "_Graphen zeichnen"
-
-#: modules/process/curvature.c:691 modules/process/drift.c:343
-#: modules/process/fft_profile.c:316 modules/process/fractal.c:334
-#: modules/process/grain_cross.c:259 modules/process/linematch.c:892
-#: modules/process/slope_dist.c:355 modules/tools/linestats.c:424
-#: modules/tools/profile.c:579 modules/tools/roughness.c:878
-#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:388
-#: modules/volume/volume_slice.c:406
+#: modules/process/curvature.c:684 modules/process/drift.c:340
+#: modules/process/fft_profile.c:300 modules/process/fractal.c:308
+#: modules/process/grain_cross.c:260 modules/process/linematch.c:855
+#: modules/process/slope_dist.c:347 modules/tools/linestats.c:424
+#: modules/tools/profile.c:559 modules/tools/roughness.c:886
+#: modules/tools/sfunctions.c:488 modules/tools/spectro.c:391
+#: modules/volume/volume_slice.c:408
 #, fuzzy
 msgid "New graph"
 msgstr "Graph"
 
-#: modules/process/curvature.c:951
+#: modules/process/curvature.c:689 modules/process/drift.c:345
+#: modules/process/fft_profile.c:306 modules/process/fractal.c:313
+#: modules/process/grain_cross.c:254 modules/process/linematch.c:860
+#: modules/process/slope_dist.c:352 modules/tools/linestats.c:418
+#: modules/tools/profile.c:563 modules/tools/roughness.c:890
+#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:385
+#: modules/volume/volume_slice.c:400
+#, fuzzy
+msgid "Target _graph:"
+msgstr "_Graphen zeichnen"
+
+#: modules/process/curvature.c:949
 msgid "Axes are outside the image."
 msgstr ""
 
-#: modules/process/curvature.c:1018
+#: modules/process/curvature.c:1016
 #, fuzzy
 msgid "Save Curvature"
 msgstr "Krümmung speichern"
@@ -8884,8 +9199,8 @@ msgstr "CWT"
 msgid "2D CWT"
 msgstr "2D-CWT"
 
-#: modules/process/cwt.c:158 modules/process/dwt.c:185
-#: modules/process/dwtanisotropy.c:209
+#: modules/process/cwt.c:159 modules/process/dwt.c:185
+#: modules/process/dwtanisotropy.c:212
 msgid "_Wavelet type:"
 msgstr "_Wavelet-Typ:"
 
@@ -8894,94 +9209,90 @@ msgid "Generates particles using simple dynamical model"
 msgstr ""
 
 #: modules/process/deposit_synth.c:184
-msgid "/S_ynthetic/_Particles..."
+#, fuzzy
+msgid "/S_ynthetic/_Deposition/_Particles..."
 msgstr "/S_ynthetisch/_Partikel..."
 
 #: modules/process/deposit_synth.c:188
 msgid "Generate particles using dynamical model"
 msgstr ""
 
-#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:867
+#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:866
 #, c-format
 msgid ""
 "Not all the particles could be deposited (%u),\n"
 "try more revise steps."
 msgstr ""
 
-#: modules/process/deposit_synth.c:347
+#: modules/process/deposit_synth.c:348
 #, fuzzy
 msgid "Particle Generation"
 msgstr "Partikelerzeugung"
 
-#: modules/process/deposit_synth.c:427
+#: modules/process/deposit_synth.c:431
 #, fuzzy
 msgid "Particle r_adius:"
 msgstr "_Pixel-Radius:"
 
-#: modules/process/deposit_synth.c:438
+#: modules/process/deposit_synth.c:443
 #, fuzzy
 msgid "Distribution _width:"
 msgstr "_Verteilung:"
 
-#: modules/process/deposit_synth.c:449
-#, fuzzy
-msgid "Surface _coverage:"
-msgstr "Oberflächen-Flächeninhalt:"
-
-#: modules/process/deposit_synth.c:458
+#: modules/process/deposit_synth.c:462
 #, fuzzy
 msgid "_Relax steps:"
 msgstr "_Interpolationstyp:"
 
-#: modules/process/deposit_synth.c:659 modules/process/synth.h:548
+#: modules/process/deposit_synth.c:660 modules/process/synth.h:577
 msgid "R_andom seed:"
 msgstr ""
 
-#: modules/process/deposit_synth.c:665 modules/process/synth.h:554
+#: modules/process/deposit_synth.c:666 modules/process/synth.h:583
 #, fuzzy
 msgid "seed|_New"
 msgstr "_Neu"
 
-#: modules/process/deposit_synth.c:676
+#: modules/process/deposit_synth.c:677
 msgid "Randomize"
 msgstr ""
 
-#: modules/process/deposit_synth.c:860 modules/process/domain_synth.c:919
+#: modules/process/deposit_synth.c:859 modules/process/domain_synth.c:919
 #, fuzzy
 msgid "Running computation..."
 msgstr "Triangulation..."
 
-#: modules/process/deposit_synth.c:865
+#: modules/process/deposit_synth.c:864
 #, c-format
 msgid "%d particles were deposited"
 msgstr ""
 
-#: modules/process/deposit_synth.c:1093
+#: modules/process/deposit_synth.c:1092
 msgid "Initial particle set..."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1252
+#: modules/process/deposit_synth.c:1251
 msgid "Running revise..."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1380
+#: modules/process/deposit_synth.c:1379
 msgid "Error: too many particles."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1382
+#: modules/process/deposit_synth.c:1381
 msgid "Error: no particles."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1384
+#: modules/process/deposit_synth.c:1383
 msgid "Error: particles too large."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1386
+#: modules/process/deposit_synth.c:1385
 msgid "Error: particles too small."
 msgstr ""
 
 #: modules/process/diff_synth.c:197 modules/tools/linestats.c:173
-#: modules/volume/volume_linestat.c:149
+#: modules/volume/volume_linestat.c:151
 #, fuzzy
 msgid "Variation"
 msgstr "Dilatation"
@@ -8997,7 +9308,7 @@ msgstr ""
 
 #: modules/process/diff_synth.c:228
 #, fuzzy
-msgid "/S_ynthetic/_Diffusion..."
+msgid "/S_ynthetic/_Deposition/_Diffusion..."
 msgstr "/S_ynthetisch/_Rauschen..."
 
 #: modules/process/diff_synth.c:232
@@ -9012,49 +9323,49 @@ msgstr ""
 msgid "_Flux:"
 msgstr ""
 
-#: modules/process/diff_synth.c:522
+#: modules/process/diff_synth.c:521
 msgid "Probabilities"
 msgstr ""
 
-#: modules/process/diff_synth.c:530
+#: modules/process/diff_synth.c:529
 #, fuzzy
 msgid "_Sticking:"
 msgstr "_Skala:"
 
-#: modules/process/diff_synth.c:539
+#: modules/process/diff_synth.c:538
 #, fuzzy
 msgid "_Activation:"
 msgstr "_Operator:"
 
-#: modules/process/diff_synth.c:548
+#: modules/process/diff_synth.c:547
 msgid "Passing Sch_woebel:"
 msgstr ""
 
-#: modules/process/dimensions.h:457
+#: modules/process/dimensions.h:439
 #, fuzzy
 msgid "S_quare image"
 msgstr "Quadrat"
 
-#: modules/process/dimensions.h:489
+#: modules/process/dimensions.h:473
 #, fuzzy
 msgid "_Dimension units:"
 msgstr "<b>Physische Ausmaße</b>"
 
-#: modules/process/dimensions.h:502
+#: modules/process/dimensions.h:488
 #, fuzzy
-msgid "Current Channel"
+msgid "Current Image"
 msgstr "Derzeitiger Kanal"
 
-#: modules/process/dimensions.h:506
-msgid "_Take Dimensions from Current Channel"
+#: modules/process/dimensions.h:492
+msgid "_Take Dimensions from Current Image"
 msgstr ""
 
-#: modules/process/dimensions.h:514
-msgid "_Replace the current channel"
+#: modules/process/dimensions.h:501
+msgid "_Replace the current image"
 msgstr ""
 
-#: modules/process/dimensions.h:523
-msgid "_Start from the current channel"
+#: modules/process/dimensions.h:510
+msgid "_Start from the current image"
 msgstr ""
 
 #: modules/process/domain_synth.c:158
@@ -9121,13 +9432,13 @@ msgid "_Monte Carlo time step:"
 msgstr "_Interpolationstyp:"
 
 #: modules/process/domain_synth.c:504 modules/process/fft_filter_2d.c:586
-#: modules/volume/volume_slice.c:364
+#: modules/volume/volume_slice.c:366
 msgid "Output Options"
 msgstr "Ausgabe-Optionen"
 
 #: modules/process/domain_synth.c:523 modules/process/fft_filter_2d.c:591
-#: modules/process/mask_edt.c:377 modules/process/slope_dist.c:323
-#: modules/volume/volume_linestat.c:432 modules/volume/volume_slice.c:384
+#: modules/process/mask_edt.c:211 modules/process/slope_dist.c:323
+#: modules/volume/volume_linestat.c:437 modules/volume/volume_slice.c:386
 #, fuzzy
 msgid "Output type:"
 msgstr "Ausgabe_art:"
@@ -9159,61 +9470,51 @@ msgstr "Such-Größe"
 msgid "rows"
 msgstr "Zeilen"
 
-#: modules/process/drift.c:304
+#: modules/process/drift.c:305
 #, fuzzy
 msgid "Correct _data"
 msgstr "Daten _korrigieren"
 
-#: modules/process/drift.c:314
+#: modules/process/drift.c:315
 msgid "_Exclude linear skew"
 msgstr "Linearen _Versatz nicht berücksichtigen"
 
-#: modules/process/drift.c:324
+#: modules/process/drift.c:325
 msgid "Plot drift _graph"
 msgstr "Drift-Graph zeichnen"
 
-#: modules/process/drift.c:356 modules/process/fit-shape.c:693
-#: modules/process/neural.c:548 modules/process/polydistort.c:275
+#: modules/process/drift.c:355 modules/process/fit-shape.c:705
+#: modules/process/neural.c:552 modules/process/polydistort.c:278
 msgid "Preview:"
 msgstr "Vorschau:"
 
-#: modules/process/drift.c:366
+#: modules/process/drift.c:365
 msgid "Drift _lines"
 msgstr "Drift-_Linien"
 
-#: modules/process/drift.c:374 modules/process/facet_analysis.c:407
-#: modules/process/grain_edge.c:285 modules/process/grain_filter.c:357
-#: modules/process/grain_mark.c:367 modules/process/grain_wshed.c:267
-#: modules/process/mark_disconn.c:310 modules/process/scars.c:381
+#: modules/process/drift.c:373 modules/process/facet_analysis.c:390
+#: modules/process/grain_edge.c:272 modules/process/grain_filter.c:356
+#: modules/process/grain_mark.c:341 modules/process/grain_wshed.c:271
+#: modules/process/mark_disconn.c:298 modules/process/scars.c:405
 #: modules/process/wpour_mark.c:369
 msgid "_Mask color:"
 msgstr "_Maskenfarbe:"
 
-#: modules/process/drift.c:379
-#, fuzzy
-msgid "Distribute"
-msgstr "VerzerrtVerteilung"
-
-#: modules/process/drift.c:388
-#, fuzzy
-msgid "Replace"
-msgstr "Datei ersetzen?"
-
-#: modules/process/drift.c:569
+#: modules/process/drift.c:570
 #, fuzzy
 msgid "Drift-corrected"
 msgstr "Korrigierte Daten driften"
 
-#: modules/process/drift.c:613
+#: modules/process/drift.c:614
 msgid "Drift"
 msgstr ""
 
-#: modules/process/drift.c:614 modules/xyz/xyz_drift.c:392
+#: modules/process/drift.c:615 modules/xyz/xyz_drift.c:392
 #: modules/xyz/xyz_drift.c:411 modules/xyz/xyz_drift.c:430
 msgid "drift"
 msgstr ""
 
-#: modules/process/drift.c:620 modules/xyz/xyz_drift.c:402
+#: modules/process/drift.c:621 modules/xyz/xyz_drift.c:402
 #, fuzzy
 msgid "x-axis drift"
 msgstr "Drift in X-Richtung"
@@ -9272,11 +9573,11 @@ msgstr "DWT Anisotropie"
 msgid "2D DWT Anisotropy"
 msgstr "2D DWT Anisotropie"
 
-#: modules/process/dwtanisotropy.c:214
+#: modules/process/dwtanisotropy.c:218
 msgid "X/Y ratio threshold:"
 msgstr "Schwellwert für X/Y Verhältnis:"
 
-#: modules/process/dwtanisotropy.c:222
+#: modules/process/dwtanisotropy.c:226
 #, fuzzy
 msgid "Low level exclude limit:"
 msgstr "Untere Grenze:"
@@ -9424,7 +9725,7 @@ msgstr "Nulldurchgangs-Kantenerkennung"
 msgid "_Gaussian FWHM:"
 msgstr "_Gauss'sche Halbwertsbreite"
 
-#: modules/process/edge.c:681 modules/process/mark_disconn.c:271
+#: modules/process/edge.c:681 modules/process/mark_disconn.c:272
 msgid "_Threshold:"
 msgstr "_Schwellwert:"
 
@@ -9496,12 +9797,12 @@ msgstr ""
 msgid "Entropy deficit:"
 msgstr ""
 
-#: modules/process/entropy.c:567
+#: modules/process/entropy.c:568
 #, fuzzy
 msgid "Entropy at scales"
 msgstr "_Skala:"
 
-#: modules/process/entropy.c:586
+#: modules/process/entropy.c:587
 #, fuzzy
 msgid "Best estimate"
 msgstr "_Abschätzung"
@@ -9556,23 +9857,23 @@ msgstr "Rechts"
 msgid "Extend _symetrically"
 msgstr "Symmetrie"
 
-#: modules/process/extend.c:268 modules/process/polydistort.c:256
-#: modules/xyz/xyz_raster.c:658
+#: modules/process/extend.c:268 modules/process/polydistort.c:259
+#: modules/xyz/xyz_raster.c:627
 msgid "exterior|Border"
 msgstr ""
 
-#: modules/process/extend.c:270 modules/process/polydistort.c:258
-#: modules/xyz/xyz_raster.c:660
+#: modules/process/extend.c:270 modules/process/polydistort.c:261
+#: modules/xyz/xyz_raster.c:629
 msgid "exterior|Mirror"
 msgstr ""
 
-#: modules/process/extend.c:272 modules/process/polydistort.c:260
-#: modules/xyz/xyz_raster.c:662
+#: modules/process/extend.c:272 modules/process/polydistort.c:263
+#: modules/xyz/xyz_raster.c:631
 msgid "exterior|Periodic"
 msgstr "Periodisch"
 
-#: modules/process/extend.c:275 modules/process/polydistort.c:263
-#: modules/xyz/xyz_raster.c:650
+#: modules/process/extend.c:275 modules/process/polydistort.c:266
+#: modules/xyz/xyz_raster.c:619
 msgid "_Exterior type:"
 msgstr ""
 
@@ -9610,12 +9911,12 @@ msgstr "Anzahl an Körnern"
 msgid "There is no path selection."
 msgstr "Auswahl als Maske setzen"
 
-#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:390
+#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:383
 #, fuzzy
 msgid "X position"
 msgstr "Maximaler z-Wert"
 
-#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:397
+#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:389
 #, fuzzy
 msgid "Y position"
 msgstr "Maximaler z-Wert"
@@ -9629,7 +9930,7 @@ msgid "Y tangent"
 msgstr ""
 
 #: modules/process/extract_path.c:392 modules/process/extract_path.c:404
-#: modules/process/pat_synth.c:1432 modules/tools/distance.c:146
+#: modules/process/pat_synth.c:1433 modules/tools/distance.c:146
 msgid "Distance"
 msgstr "Abstand"
 
@@ -9677,51 +9978,39 @@ msgstr "/_Statistik/Facetten-_Analyse"
 msgid "Mark areas by 2D slope"
 msgstr "Gebiete mit 2D Neigung markieren"
 
-#: modules/process/facet_analysis.c:266
+#: modules/process/facet_analysis.c:270
 msgid "Mark Facets"
 msgstr "Facetten markieren"
 
-#: modules/process/facet_analysis.c:269
+#: modules/process/facet_analysis.c:273
 #, fuzzy
 msgid "verb|_Mark"
 msgstr "_Markieren"
 
 #. TRANSLATORS: The direction or line orthogonal to something.
-#: modules/process/facet_analysis.c:325
+#: modules/process/facet_analysis.c:329
 msgid "Normal"
 msgstr "Normal"
 
-#: modules/process/facet_analysis.c:333
+#: modules/process/facet_analysis.c:337
 msgid "_Find Maximum"
 msgstr "Maximum _finden"
 
-#: modules/process/facet_analysis.c:341
+#: modules/process/facet_analysis.c:345
 #, fuzzy
 msgid "Mean Normal"
 msgstr "Normal"
 
-#: modules/process/facet_analysis.c:350
+#: modules/process/facet_analysis.c:362
 #, fuzzy
 msgid "Facet plane size:"
 msgstr "_Punktgröße:"
 
-#: modules/process/facet_analysis.c:375
+#: modules/process/facet_analysis.c:370
 msgid "_Tolerance:"
 msgstr "_Toleranz:"
 
-#: modules/process/facet_analysis.c:384 modules/process/grain_edge.c:262
-#: modules/process/grain_mark.c:344 modules/process/mark_disconn.c:286
-#, fuzzy
-msgid "Com_bine with existing mask"
-msgstr "Projizierte Fläche"
-
-#: modules/process/facet_analysis.c:398 modules/process/grain_edge.c:276
-#: modules/process/grain_mark.c:358 modules/process/mark_disconn.c:301
-#: modules/process/mark_with.c:230 modules/process/mask_morph.c:210
-msgid "Operation:"
-msgstr "Operation:"
-
-#: modules/process/facet_analysis.c:415
+#: modules/process/facet_analysis.c:398
 #, fuzzy
 msgid ""
 "Warning: Lateral and value units differ. Angles are not physically "
@@ -9758,8 +10047,8 @@ msgstr ""
 msgid "_Stationarity scale:"
 msgstr "_Laterale Skala:"
 
-#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:509
-#: modules/process/noise_synth.c:409
+#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:507
+#: modules/process/noise_synth.c:407
 msgid "_Distribution:"
 msgstr "_Verteilung:"
 
@@ -9767,18 +10056,18 @@ msgstr "_Verteilung:"
 msgid "Po_wer:"
 msgstr ""
 
-#: modules/process/fbm_synth.c:408 modules/process/fft_synth.c:414
-#: modules/process/lno_synth.c:533 modules/process/noise_synth.c:433
+#: modules/process/fbm_synth.c:407 modules/process/fft_synth.c:414
+#: modules/process/lno_synth.c:531 modules/process/noise_synth.c:431
 #, fuzzy
 msgid "_RMS:"
 msgstr "_Quadratmittel:"
 
-#: modules/process/fbm_synth.c:477 modules/process/lno_synth.c:251
-#: modules/process/noise_synth.c:178
+#: modules/process/fbm_synth.c:476 modules/process/lno_synth.c:249
+#: modules/process/noise_synth.c:176
 msgid "distribution|Exponential"
 msgstr ""
 
-#: modules/process/fbm_synth.c:478
+#: modules/process/fbm_synth.c:477
 #, fuzzy
 msgid "distribution|Power"
 msgstr "Winkelverteilung"
@@ -9836,7 +10125,7 @@ msgstr "Imaginärteil"
 msgid "Modulus"
 msgstr "FFT Betrag"
 
-#: modules/process/fft.c:327 modules/process/wave_synth.c:583
+#: modules/process/fft.c:327 modules/process/wave_synth.c:618
 msgid "Phase"
 msgstr "Phase"
 
@@ -9854,66 +10143,66 @@ msgstr "_Transformiert"
 msgid "I_maginary part:"
 msgstr "Imaginärteil"
 
-#: modules/process/fft.c:382
+#: modules/process/fft.c:380
 #, fuzzy
 msgid "_Inverse transform"
 msgstr "Hough-Transformation."
 
-#: modules/process/fft.c:411
+#: modules/process/fft.c:409
 msgid "Subtract mean _value beforehand"
 msgstr "_Mittelwert vorher abziehen"
 
-#: modules/process/fft.c:422
+#: modules/process/fft.c:420
 msgid "_Preserve RMS"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:117
+#: modules/process/fft_filter_1d.c:118
 msgid "FFT filtering"
 msgstr "FFT-Filterung"
 
-#: modules/process/fft_filter_1d.c:131
+#: modules/process/fft_filter_1d.c:132
 #, fuzzy
 msgid "/_Correct Data/1D _FFT Filtering..."
 msgstr "/Ko_rrigieren/1D _FFT-Filterung..."
 
-#: modules/process/fft_filter_1d.c:135
+#: modules/process/fft_filter_1d.c:136
 msgid "1D FFT Filtering"
 msgstr "1D FFT-Filterung"
 
-#: modules/process/fft_filter_1d.c:165 modules/process/wpour_mark.c:391
+#: modules/process/fft_filter_1d.c:166 modules/process/wpour_mark.c:391
 msgid "Marked"
 msgstr "Markiert"
 
-#: modules/process/fft_filter_1d.c:166
+#: modules/process/fft_filter_1d.c:167
 msgid "Unmarked"
 msgstr "Unmarkiert"
 
-#: modules/process/fft_filter_1d.c:169
+#: modules/process/fft_filter_1d.c:170
 msgid "Null"
 msgstr "Null"
 
-#: modules/process/fft_filter_1d.c:170
+#: modules/process/fft_filter_1d.c:171
 msgid "Suppress"
 msgstr "Unterdrücken"
 
-#: modules/process/fft_filter_1d.c:180
+#: modules/process/fft_filter_1d.c:181
 msgid "1D FFT filter"
 msgstr "1D FFT-Filter"
 
-#: modules/process/fft_filter_1d.c:269 modules/process/linematch.c:861
+#: modules/process/fft_filter_1d.c:271 modules/process/linematch.c:828
 msgid "_Direction:"
 msgstr "_Richtung:"
 
-#: modules/process/fft_filter_1d.c:277
+#: modules/process/fft_filter_1d.c:279
 #, fuzzy
 msgid "_Suppress type:"
 msgstr "_Linientyp:"
 
-#: modules/process/fft_filter_1d.c:285
+#: modules/process/fft_filter_1d.c:287
 msgid "_Filter type:"
 msgstr "_Filtertyp:"
 
-#: modules/process/fft_filter_1d.c:513
+#: modules/process/fft_filter_1d.c:515
 msgid "1D FFT Filtered Data"
 msgstr "1D FFT-gefilterte Daten"
 
@@ -9934,9 +10223,10 @@ msgstr "Zweidimensionale FFT-Filterung"
 msgid "Filtered Data"
 msgstr "Gefilterte Daten"
 
-#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:594
-#: modules/process/fit-shape.c:643 modules/process/fit-shape.c:658
-#: modules/process/fit-shape.c:662 modules/process/neural.c:560
+#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:604
+#: modules/process/fit-shape.c:653 modules/process/fit-shape.c:668
+#: modules/process/fit-shape.c:672 modules/process/neural.c:564
+#: modules/process/psf.c:232
 msgid "Difference"
 msgstr "Differenz"
 
@@ -9997,7 +10287,7 @@ msgstr "Filtermaske"
 msgid "_Undo"
 msgstr "_Rückgängig"
 
-#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:556
+#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:562
 msgid "_Fill"
 msgstr "_Ausfüllen"
 
@@ -10005,7 +10295,7 @@ msgstr "_Ausfüllen"
 msgid "_Snap to origin"
 msgstr "Einrasten am _Ursprung"
 
-#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:339
+#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:329
 msgid "Zoom:"
 msgstr "Zoom:"
 
@@ -10048,40 +10338,41 @@ msgstr "Entfernt die gesamte Filtermaske"
 msgid "Force shapes to center around the origin"
 msgstr "Erzwingt Zentrierung neuer Masken um den Ursprung"
 
-#: modules/process/fft_profile.c:125
+#: modules/process/fft_profile.c:124
 msgid ""
 "Reads radial sections of two-dimensional power spectrum density function."
 msgstr ""
 
-#: modules/process/fft_profile.c:140
+#: modules/process/fft_profile.c:139
 #, fuzzy
 msgid "/_Statistics/_PSDF Section..."
 msgstr "/_Statistik/_Fraktale Dimension..."
 
-#: modules/process/fft_profile.c:144
+#: modules/process/fft_profile.c:143
 msgid "Read radial PSDF sections"
 msgstr ""
 
-#: modules/process/fft_profile.c:190
+#: modules/process/fft_profile.c:189
 msgid "Radial PSDF Section"
 msgstr ""
 
-#: modules/process/fft_profile.c:237
+#: modules/process/fft_profile.c:236
 #, fuzzy
 msgid "PSDF Section"
 msgstr "_Auswahlmodus:"
 
-#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:336
-#: modules/tools/profile.c:517 modules/tools/sfunctions.c:443
-msgid "_Fix res.:"
-msgstr "_Feste Auflösung:"
+#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:338
+#: modules/tools/profile.c:514 modules/tools/sfunctions.c:454
+#, fuzzy
+msgid "_Fixed resolution:"
+msgstr "Auflösung"
 
-#: modules/process/fft_profile.c:279
+#: modules/process/fft_profile.c:278
 #, fuzzy
 msgid "_Separate curves"
 msgstr "_Graph"
 
-#: modules/process/fft_profile.c:496
+#: modules/process/fft_profile.c:483
 #, c-format
 msgid "PSDF %.0f°"
 msgstr "PSDF %.0f°"
@@ -10102,12 +10393,16 @@ msgstr ""
 msgid "Spectral Synthesis"
 msgstr ""
 
-#: modules/process/fft_synth.c:429
+#: modules/process/fft_synth.c:430
 #, fuzzy
 msgid "M_inimum frequency:"
 msgstr "Minimale _Länge:"
 
-#: modules/process/fft_synth.c:449
+#: modules/process/fft_synth.c:430 modules/process/fft_synth.c:450
+msgid "px<sup>-1</sup>"
+msgstr ""
+
+#: modules/process/fft_synth.c:450
 msgid "Ma_ximum frequency:"
 msgstr ""
 
@@ -10128,92 +10423,171 @@ msgstr ""
 msgid "Enable _power multiplier"
 msgstr ""
 
-#: modules/process/fit-shape.c:270
+#: modules/process/fibre_synth.c:256
+msgid "Semi-circle"
+msgstr ""
+
+#: modules/process/fibre_synth.c:257
+#, fuzzy
+msgid "Triangle"
+msgstr "Dreieck hoch"
+
+#: modules/process/fibre_synth.c:258
+#, fuzzy
+msgid "Rectangle"
+msgstr "Rechtecke"
+
+#: modules/process/fibre_synth.c:260
+msgid "Quadratic spline"
+msgstr ""
+
+#: modules/process/fibre_synth.c:266
+msgid "Generates surfaces composed from randomly placed fibers."
+msgstr ""
+
+#: modules/process/fibre_synth.c:280
+#, fuzzy
+msgid "/S_ynthetic/_Deposition/_Fibers..."
+msgstr "/S_ynthetisch/_Objekte..."
+
+#: modules/process/fibre_synth.c:284
+#, fuzzy
+msgid "Generate surface of randomly placed fibers"
+msgstr "Relative Linien"
+
+#: modules/process/fibre_synth.c:420
+#, fuzzy
+msgid "Random Fibers"
+msgstr "Fenstergröße"
+
+#: modules/process/fibre_synth.c:494 modules/process/obj_synth.c:510
+#, fuzzy
+msgid "_Shape:"
+msgstr "_Skala:"
+
+#: modules/process/fibre_synth.c:513 modules/process/obj_synth.c:529
+msgid "obj."
+msgstr ""
+
+#: modules/process/fibre_synth.c:553
+msgid "Scales _with width"
+msgstr ""
+
+#: modules/process/fibre_synth.c:591 modules/process/synth.h:485
+#, fuzzy
+msgid "Deformation"
+msgstr "_Operator:"
+
+#: modules/process/fibre_synth.c:600 modules/process/lno_synth.c:852
+#: modules/process/lno_synth.c:1222 modules/process/mask_noisify.c:177
+msgid "Densi_ty:"
+msgstr "Dich_te:"
+
+#: modules/process/fibre_synth.c:607
+#, fuzzy
+msgid "_Lateral:"
+msgstr "GL-Material"
+
+#: modules/process/fibre_synth.c:614
+#, fuzzy
+msgid "Le_ngthwise:"
+msgstr "_Länge:"
+
+#: modules/process/fibre_synth.c:819
+msgid "Along fiber:"
+msgstr ""
+
+#: modules/process/fibre_synth.c:1180
+#, fuzzy
+msgid "Generating fibers..."
+msgstr "Markiere Grenzen"
+
+#: modules/process/fit-shape.c:264
 msgid "Fits predefined geometrical shapes to data."
 msgstr ""
 
-#: modules/process/fit-shape.c:284
+#: modules/process/fit-shape.c:278
 #, fuzzy
 msgid "/_Level/_Fit Shape..."
 msgstr "/_Nivellierung/_Sphäre fitten..."
 
-#: modules/process/fit-shape.c:288 modules/process/fit-shape.c:295
+#: modules/process/fit-shape.c:282 modules/process/fit-shape.c:289
 msgid "Fit geometrical shapes"
 msgstr ""
 
-#: modules/process/fit-shape.c:291
+#: modules/process/fit-shape.c:285
 #, fuzzy
 msgid "/_Fit Shape..."
 msgstr "/_Nivellierung/_Sphäre fitten..."
 
-#: modules/process/fit-shape.c:390
+#: modules/process/fit-shape.c:389
 #, fuzzy
 msgid "Fit Shape"
 msgstr "Sphäre fitten"
 
-#: modules/process/fit-shape.c:395
+#: modules/process/fit-shape.c:396
 msgid "verb|_Quick Fit"
 msgstr ""
 
-#: modules/process/fit-shape.c:473 modules/process/fit-shape.c:2159
+#: modules/process/fit-shape.c:474 modules/process/fit-shape.c:2141
 #, fuzzy
 msgid "Derived Quantities"
 msgstr "Korn-Statistiken"
 
-#: modules/process/fit-shape.c:478 modules/process/fit-shape.c:2129
+#: modules/process/fit-shape.c:479 modules/process/fit-shape.c:2111
 #, fuzzy
 msgid "Mean square difference:"
 msgstr "X Differenz"
 
-#: modules/process/fit-shape.c:580 modules/process/fit-shape.c:626
-#: modules/process/fit-shape.c:657 modules/process/fit-shape.c:661
+#: modules/process/fit-shape.c:590 modules/process/fit-shape.c:636
+#: modules/process/fit-shape.c:667 modules/process/fit-shape.c:671
 #, fuzzy
 msgid "Fitted shape"
 msgstr "Gefittete Sphäre"
 
-#: modules/process/fit-shape.c:663 modules/process/mark_disconn.c:189
-#: modules/process/scars.c:281
+#: modules/process/fit-shape.c:673 modules/process/mark_disconn.c:189
+#: modules/process/scars.c:299
 msgid "Both"
 msgstr "Beides"
 
-#: modules/process/fit-shape.c:680
+#: modules/process/fit-shape.c:690 modules/process/psf-fit.c:308
 #, fuzzy
 msgid "_Function type:"
 msgstr "Funktionstyp:"
 
-#: modules/process/fit-shape.c:708
+#: modules/process/fit-shape.c:720
 msgid "Show differences with _adapted color map"
 msgstr ""
 
-#: modules/process/fit-shape.c:720
+#: modules/process/fit-shape.c:732
 msgid "Full fit is _geometric"
 msgstr ""
 
-#: modules/process/fit-shape.c:757
+#: modules/process/fit-shape.c:769
 msgid "Calculate differences for e_xcluded pixels"
 msgstr ""
 
-#: modules/process/fit-shape.c:804
+#: modules/process/fit-shape.c:816
 msgid "_Recalculate Image"
 msgstr ""
 
-#: modules/process/fit-shape.c:811
+#: modules/process/fit-shape.c:823
 msgid "Revert to _Previous Values"
 msgstr ""
 
-#: modules/process/fit-shape.c:1850
+#: modules/process/fit-shape.c:1864
 msgid "Parameter estimation failed"
 msgstr ""
 
-#: modules/process/fit-shape.c:1853
+#: modules/process/fit-shape.c:1867
 msgid "Fit failed"
 msgstr ""
 
-#: modules/process/fit-shape.c:1855
+#: modules/process/fit-shape.c:1869
 msgid "Fit was interruped"
 msgstr ""
 
-#: modules/process/fit-shape.c:2115
+#: modules/process/fit-shape.c:2097
 msgid "(fixed)"
 msgstr ""
 
@@ -10235,38 +10609,38 @@ msgstr ""
 msgid "Polynomial leveling..."
 msgstr "Polynomiell"
 
-#: modules/process/fraccor.c:38
+#: modules/process/fraccor.c:39
 msgid "Removes data under mask using fractal interpolation."
 msgstr "Entfernt Daten unter Maske mittels fraktaler Interpolation."
 
-#: modules/process/fraccor.c:52
+#: modules/process/fraccor.c:53
 #, fuzzy
 msgid "/_Correct Data/_Fractal Correction"
 msgstr "/Ko_rrigieren/Fra_ktale Korrektur"
 
-#: modules/process/fraccor.c:56
+#: modules/process/fraccor.c:57
 msgid "Interpolate data under mask with fractal interpolation"
 msgstr "Interpoliert Daten unter Maske mittels fraktaler Interpolation"
 
-#: modules/process/fractal.c:134
+#: modules/process/fractal.c:130
 #, fuzzy
 msgid "Partitioning"
 msgstr "Partitionierung"
 
-#: modules/process/fractal.c:135
+#: modules/process/fractal.c:131
 #, fuzzy
 msgid "Cube counting"
 msgstr "Kästchenzählung"
 
-#: modules/process/fractal.c:136
+#: modules/process/fractal.c:132
 msgid "Triangulation"
 msgstr "Triangulation"
 
-#: modules/process/fractal.c:137
+#: modules/process/fractal.c:133
 msgid "Power spectrum"
 msgstr "Spektraldichtefunktion"
 
-#: modules/process/fractal.c:173
+#: modules/process/fractal.c:169
 #, fuzzy
 msgid ""
 "Calculates fractal dimension using several methods (partitioning, box "
@@ -10275,54 +10649,50 @@ msgstr ""
 "Berechnet die fraktale Dimension mit unerschiedlichen Methoden "
 "(Partitionierung, Kästchenzählung, Triangulation, Spektraldichtefunktion)"
 
-#: modules/process/fractal.c:188
+#: modules/process/fractal.c:184
 msgid "/_Statistics/_Fractal Dimension..."
 msgstr "/_Statistik/_Fraktale Dimension..."
 
-#: modules/process/fractal.c:192
+#: modules/process/fractal.c:188
 msgid "Calculate fractal dimension"
 msgstr "Fraktale Dimension berechnen"
 
-#: modules/process/fractal.c:227
+#: modules/process/fractal.c:223
 msgid "Fractal Dimension"
 msgstr "Fraktale Dimension"
 
-#: modules/process/fractal.c:228
-msgid "Reco_mpute"
-msgstr "e_rneut berechnen"
-
-#: modules/process/fractal.c:269
+#: modules/process/fractal.c:253
 msgid "_Method:"
 msgstr "_Methode:"
 
-#: modules/process/fractal.c:290
+#: modules/process/fractal.c:269
 msgid "Fit Area"
 msgstr "Bereich fitten"
 
-#: modules/process/fractal.c:295
-msgid "From:"
-msgstr "Von:"
-
-#: modules/process/fractal.c:295 modules/process/fractal.c:589
-#: modules/process/fractal.c:613
+#: modules/process/fractal.c:273 modules/process/fractal.c:545
+#: modules/process/fractal.c:569
 msgid "minimum"
 msgstr "Minimum"
 
-#: modules/process/fractal.c:298
-msgid "To:"
-msgstr "Bis:"
+#: modules/process/fractal.c:274
+msgid "From:"
+msgstr "Von:"
 
-#: modules/process/fractal.c:298 modules/process/fractal.c:590
-#: modules/process/fractal.c:614
+#: modules/process/fractal.c:279 modules/process/fractal.c:546
+#: modules/process/fractal.c:570
 msgid "maximum"
 msgstr "Maximum"
 
-#: modules/process/fractal.c:308 modules/process/mark_with.c:390
-#: modules/process/neural.c:559
+#: modules/process/fractal.c:280
+msgid "To:"
+msgstr "Bis:"
+
+#: modules/process/fractal.c:287 modules/process/mark_with.c:394
+#: modules/process/neural.c:563
 msgid "Result"
 msgstr "Ergebnis"
 
-#: modules/process/fractal.c:550
+#: modules/process/fractal.c:506
 msgid "Linear fit"
 msgstr "Linearer Fit"
 
@@ -10398,11 +10768,11 @@ msgstr ""
 msgid "Grain Correlations"
 msgstr "Korrelation"
 
-#: modules/process/grain_cross.c:240
+#: modules/process/grain_cross.c:241
 msgid "_Abscissa"
 msgstr ""
 
-#: modules/process/grain_cross.c:244
+#: modules/process/grain_cross.c:245
 #, fuzzy
 msgid "O_rdinate"
 msgstr "_Gradient"
@@ -10431,128 +10801,128 @@ msgstr "_Graphen zeichnen"
 msgid "Grain Distributions"
 msgstr "Kornverteilungen"
 
-#: modules/process/grain_dist.c:553
+#: modules/process/grain_dist.c:547
 #, fuzzy
 msgid "count"
 msgstr "Anzahl"
 
-#: modules/process/grain_dist.c:617
+#: modules/process/grain_dist.c:611
 msgid "Export Raw Grain Values"
 msgstr "Korn-Rohdaten exportieren"
 
-#: modules/process/grain_edge.c:100
+#: modules/process/grain_edge.c:99
 #, fuzzy
 msgid "Marks grains by edge detection method."
 msgstr "Körner mittels Schwellwert markieren"
 
-#: modules/process/grain_edge.c:114
+#: modules/process/grain_edge.c:113
 #, fuzzy
 msgid "/_Grains/Mark by _Edge Detection..."
 msgstr "/_Körnung/Markieren mit _Watershed..."
 
-#: modules/process/grain_edge.c:118
+#: modules/process/grain_edge.c:117
 msgid "Mark grains with edge detection mechanism"
 msgstr ""
 
-#: modules/process/grain_edge.c:207
+#: modules/process/grain_edge.c:206
 #, fuzzy
 msgid "Mark Grains by Edge Detection"
 msgstr "Körner mittels Kantenerkennung markieren"
 
-#: modules/process/grain_edge.c:245
+#: modules/process/grain_edge.c:244
 msgid "Threshold"
 msgstr "Schwellwert"
 
-#: modules/process/grain_edge.c:249
+#: modules/process/grain_edge.c:248
 msgid "_Laplacian:"
 msgstr ""
 
-#: modules/process/grain_filter.c:195
+#: modules/process/grain_filter.c:194
 msgid ""
 "Filters grains by their properties, using logical expressions and thresholds."
 msgstr ""
 
-#: modules/process/grain_filter.c:210
+#: modules/process/grain_filter.c:209
 #, fuzzy
 msgid "/_Grains/_Filter..."
 msgstr "/_Körnung/_Statistik..."
 
-#: modules/process/grain_filter.c:214
+#: modules/process/grain_filter.c:213
 msgid "Filter grains by their properties"
 msgstr ""
 
-#: modules/process/grain_filter.c:254
+#: modules/process/grain_filter.c:253
 msgid "There are no grains to filter."
 msgstr ""
 
-#: modules/process/grain_filter.c:310
+#: modules/process/grain_filter.c:309
 #, fuzzy
 msgid "Filter Grains"
 msgstr "Filtermaske"
 
-#: modules/process/grain_filter.c:405
+#: modules/process/grain_filter.c:404
 #, fuzzy
 msgid "Set selected as:"
 msgstr "Ausgewähltes Element als Standard setzen"
 
-#: modules/process/grain_filter.c:420
+#: modules/process/grain_filter.c:419
 #, fuzzy
 msgid "Keep grains satisfying:"
 msgstr "Einfache Körnungsstatistiken"
 
-#: modules/process/grain_filter.c:434 modules/process/lat_synth.c:733
+#: modules/process/grain_filter.c:440 modules/process/lat_synth.c:733
 #, fuzzy
 msgid "Lower threshold:"
 msgstr "_Harter Schwellwert:"
 
-#: modules/process/grain_filter.c:469 modules/process/lat_synth.c:740
+#: modules/process/grain_filter.c:467 modules/process/lat_synth.c:740
 #, fuzzy
 msgid "Upper threshold:"
 msgstr "_Harter Schwellwert:"
 
 #. TRANSLATORS: %c is replaced with quantity label A, B or C.
-#: modules/process/grain_filter.c:645
+#: modules/process/grain_filter.c:628
 #, c-format
 msgid "Condition %c: %s"
 msgstr ""
 
-#: modules/process/grain_mark.c:139
+#: modules/process/grain_mark.c:137
 msgid "Marks grains by thresholding (height, slope, curvature)."
 msgstr "Markiert Körner mittels Schwellwertbildung (Höhe, Steigung, Krümmung)."
 
-#: modules/process/grain_mark.c:153
+#: modules/process/grain_mark.c:151
 msgid "/_Grains/_Mark by Threshold..."
 msgstr "/_Körnung/_Markieren mit Schwellwert..."
 
-#: modules/process/grain_mark.c:157
+#: modules/process/grain_mark.c:155
 msgid "Mark grains by threshold"
 msgstr "Körner mittels Schwellwert markieren"
 
-#: modules/process/grain_mark.c:241
+#: modules/process/grain_mark.c:240
 msgid "Mark Grains by Threshold"
 msgstr "Körner mittels Schwellwert markieren"
 
-#: modules/process/grain_mark.c:281
+#: modules/process/grain_mark.c:280
 msgid "Threshold by"
 msgstr "Schwellwert bezüglich"
 
-#: modules/process/grain_mark.c:311
+#: modules/process/grain_mark.c:310
 msgid "_Slope:"
 msgstr "S_teigung:"
 
-#: modules/process/grain_mark.c:315
+#: modules/process/grain_mark.c:314
 msgid "_Curvature:"
 msgstr "_Krümmung:"
 
-#: modules/process/grain_mark.c:324
-msgid "Criteria combination:"
-msgstr ""
-
-#: modules/process/grain_mark.c:328 modules/process/grain_wshed.c:256
+#: modules/process/grain_mark.c:319 modules/process/grain_wshed.c:260
 #: modules/process/wpour_mark.c:358
 msgid "_Invert height"
 msgstr "Höhe _invertieren"
 
+#: modules/process/grain_mark.c:328
+msgid "Criteria combination:"
+msgstr ""
+
 #: modules/process/grain_stat.c:54
 #, fuzzy
 msgid "Displays overall grain statistics."
@@ -10632,464 +11002,474 @@ msgstr "Gesamtes Kornvolumen (Laplace):"
 msgid "Total projected boundary length:"
 msgstr "Projizierte Umrandungslänge"
 
-#: modules/process/grain_wshed.c:101
+#: modules/process/grain_wshed.c:102
 msgid "Marks grains by watershed algorithm."
 msgstr "Körner mittels Watershed-Algorithmus markieren."
 
-#: modules/process/grain_wshed.c:115
+#: modules/process/grain_wshed.c:116
 msgid "/_Grains/Mark by _Watershed..."
 msgstr "/_Körnung/Markieren mit _Watershed..."
 
-#: modules/process/grain_wshed.c:119
+#: modules/process/grain_wshed.c:120
 msgid "Mark grains by watershed"
 msgstr "Körner mittels Watershed markieren"
 
-#: modules/process/grain_wshed.c:161
+#: modules/process/grain_wshed.c:162
 msgid "Mark Grains by Watershed"
 msgstr "Körner mittels Watershed markieren"
 
-#: modules/process/grain_wshed.c:199
+#: modules/process/grain_wshed.c:200
 msgid "Grain Location"
 msgstr "Korn-Lokalisierung"
 
-#: modules/process/grain_wshed.c:214
+#: modules/process/grain_wshed.c:216
 msgid "_Drop size:"
 msgstr "_Tropfengröße:"
 
-#: modules/process/grain_wshed.c:230
+#: modules/process/grain_wshed.c:233
 msgid "Segmentation"
 msgstr "Segmentierung"
 
-#: modules/process/grain_wshed.c:236
+#: modules/process/grain_wshed.c:239
 msgid "Num_ber of steps:"
 msgstr "Anza_hl an Schritten:"
 
-#: modules/process/grain_wshed.c:244
+#: modules/process/grain_wshed.c:248
 msgid "Dr_op size:"
 msgstr "Tropfen_größe:"
 
-#: modules/process/grain_wshed.c:435
+#: modules/process/grain_wshed.c:439
 #, fuzzy
 msgid "Finding minima..."
 msgstr "Finde Minima"
 
-#: modules/process/grain_wshed.c:437
+#: modules/process/grain_wshed.c:441
 #, fuzzy
 msgid "Locating..."
 msgstr "Lokalisiere"
 
-#: modules/process/grain_wshed.c:439
+#: modules/process/grain_wshed.c:443
 #, fuzzy
 msgid "Simulating watershed..."
 msgstr "Fit-Parameter"
 
-#: modules/process/grain_wshed.c:441
+#: modules/process/grain_wshed.c:445
 #, fuzzy
 msgid "Marking boundaries..."
 msgstr "Markiere Grenzen"
 
-#: modules/process/hough.c:74
+#: modules/process/hough.c:76
 msgid "Hough transform."
 msgstr "Hough-Transformation."
 
-#: modules/process/hough.c:88
+#: modules/process/hough.c:90
 msgid "/_Integral Transforms/_Hough..."
 msgstr "/_Integrale Transformationen/_Hough..."
 
-#: modules/process/hough.c:92
+#: modules/process/hough.c:94
 msgid "Compute Hough transform"
 msgstr "Hough-Transformation berechnen"
 
-#: modules/process/hough.c:178
+#: modules/process/hough.c:137
+#, fuzzy
+msgid "Hough line"
+msgstr "Rauigkeit"
+
+#: modules/process/hough.c:141
+#, c-format
+msgid "Hough circle r=%d"
+msgstr ""
+
+#: modules/process/hough.c:173
 msgid "Hough Transform"
 msgstr "Hough-Transformation"
 
-#: modules/process/hough.c:201
+#: modules/process/hough.c:195
 msgid "_Transform type:"
 msgstr "_Transformationstyp:"
 
-#: modules/process/hough.c:212
+#: modules/process/hough.c:203
 msgid "_Circle size:"
 msgstr "Größe des _Kreises:"
 
-#: modules/process/immerse.c:162
+#: modules/process/immerse.c:163
 msgid "Immerse high resolution detail into overall image."
 msgstr "Hochauflösendes Detailbild in Gesamtbild einfügen"
 
-#: modules/process/immerse.c:176
+#: modules/process/immerse.c:177
 msgid "/M_ultidata/_Immerse Detail..."
 msgstr "/M_ultidaten/_Detailbild einpassen..."
 
-#: modules/process/immerse.c:180
+#: modules/process/immerse.c:181
 msgid "Immerse a detail into image"
 msgstr "Detailbild in Bild einfügen"
 
-#: modules/process/immerse.c:222
+#: modules/process/immerse.c:223
 msgid "Immerse Detail"
 msgstr "Detailbild einfügen"
 
-#: modules/process/immerse.c:225
+#: modules/process/immerse.c:226
 msgid "_Locate"
 msgstr "_Localisieren"
 
-#: modules/process/immerse.c:227
+#: modules/process/immerse.c:228
 msgid "Locate detail by full image correlation search"
 msgstr "Detailbild über Korrelationssuche im Gesamtbild lokalisieren"
 
-#: modules/process/immerse.c:229
+#: modules/process/immerse.c:230
 msgid "_Improve"
 msgstr "Ver_bessern"
 
-#: modules/process/immerse.c:231
+#: modules/process/immerse.c:232
 msgid "Improve detail position by correlation search in neighborhood"
 msgstr ""
 "Position des Detailbildes über Korrelationssuche in der Nachbarschaft "
 "verbessern"
 
-#: modules/process/immerse.c:290
+#: modules/process/immerse.c:291
 msgid "_Detail image:"
 msgstr "_Detailbild:"
 
-#: modules/process/immerse.c:295
+#: modules/process/immerse.c:296
 msgid "Position:"
 msgstr "Position:"
 
-#: modules/process/immerse.c:308
+#: modules/process/immerse.c:314
 #, fuzzy
 msgid "Result Sampling"
 msgstr "Ergebnis-Auflösung:"
 
-#: modules/process/immerse.c:318
+#: modules/process/immerse.c:324
 #, fuzzy
 msgid "_Upsample large image"
 msgstr "Großes Bild _hochrechnen"
 
-#: modules/process/immerse.c:320
+#: modules/process/immerse.c:326
 #, fuzzy
 msgid "_Downsample detail"
 msgstr "Detailbild _runterrechnen"
 
-#: modules/process/immerse.c:329
+#: modules/process/immerse.c:335
 msgid "Detail Leveling"
 msgstr "Detail-Nivellierung"
 
-#: modules/process/immerse.c:339
+#: modules/process/immerse.c:345
 msgid "levelling|_None"
 msgstr ""
 
-#: modules/process/immerse.c:341
+#: modules/process/immerse.c:347
 msgid "_Mean value"
 msgstr "_Minimalwert"
 
-#: modules/process/immerse.c:349
+#: modules/process/immerse.c:355
 #, fuzzy
 msgid "Show _frame"
 msgstr "_Rahmen anzeigen"
 
-#: modules/process/immerse.c:787
+#: modules/process/immerse.c:793
 msgid "Immersed detail"
 msgstr "Eingefügtes Detailbild"
 
-#: modules/process/indent_analyze.c:261
+#: modules/process/indent_analyze.c:246
 #, fuzzy
 msgid "Do nothing"
 msgstr "Tue nichts"
 
-#: modules/process/indent_analyze.c:262
+#: modules/process/indent_analyze.c:247
 #, fuzzy
 msgid "Plane level"
 msgstr "Ebene nivellieren"
 
-#: modules/process/indent_analyze.c:263
+#: modules/process/indent_analyze.c:248
 #, fuzzy
 msgid "Plane rotate"
 msgstr "Ebenen-Fit Modus"
 
-#: modules/process/indent_analyze.c:267
+#: modules/process/indent_analyze.c:252
 msgid "New"
 msgstr "Neu"
 
-#: modules/process/indent_analyze.c:268
+#: modules/process/indent_analyze.c:253
 msgid "AND"
 msgstr "AND"
 
-#: modules/process/indent_analyze.c:269
+#: modules/process/indent_analyze.c:254
 msgid "OR"
 msgstr "OR"
 
-#: modules/process/indent_analyze.c:270
+#: modules/process/indent_analyze.c:255
 msgid "NOT"
 msgstr "NOT"
 
-#: modules/process/indent_analyze.c:271
+#: modules/process/indent_analyze.c:256
 msgid "XOR"
 msgstr "XOR"
 
-#: modules/process/indent_analyze.c:275
+#: modules/process/indent_analyze.c:260
 #, fuzzy
 msgid "Nothing"
 msgstr "Lokalisiere"
 
-#: modules/process/indent_analyze.c:276
+#: modules/process/indent_analyze.c:261
 #, fuzzy
 msgid "Above"
 msgstr "Absolut"
 
-#: modules/process/indent_analyze.c:277
+#: modules/process/indent_analyze.c:262
 msgid "Below"
 msgstr ""
 
-#: modules/process/indent_analyze.c:278
+#: modules/process/indent_analyze.c:263
 #, fuzzy
 msgid "Plane"
 msgstr "Ebene nivellieren"
 
-#: modules/process/indent_analyze.c:279
+#: modules/process/indent_analyze.c:264
 #, fuzzy
 msgid "Impression"
 msgstr "_Ausdruck:"
 
-#: modules/process/indent_analyze.c:280
+#: modules/process/indent_analyze.c:265
 msgid "Inner Pile-up"
 msgstr ""
 
-#: modules/process/indent_analyze.c:281
+#: modules/process/indent_analyze.c:266
 msgid "Outer Pile-up"
 msgstr ""
 
-#: modules/process/indent_analyze.c:282
+#: modules/process/indent_analyze.c:267
 #, fuzzy
 msgid "Special points"
 msgstr "Ausgewählte Punkte"
 
-#: modules/process/indent_analyze.c:283
+#: modules/process/indent_analyze.c:268
 msgid "Faces border"
 msgstr ""
 
-#: modules/process/indent_analyze.c:287
+#: modules/process/indent_analyze.c:272
 msgid "Vickers"
 msgstr "Vickers"
 
-#: modules/process/indent_analyze.c:288
+#: modules/process/indent_analyze.c:273
 msgid "Berkovich"
 msgstr "Berkovich"
 
-#: modules/process/indent_analyze.c:289
+#: modules/process/indent_analyze.c:274
 msgid "Berkovich (modified)"
 msgstr "Berkovich (modifiziert)"
 
-#: modules/process/indent_analyze.c:290
+#: modules/process/indent_analyze.c:275
 msgid "Knoop"
 msgstr "Knoop"
 
-#: modules/process/indent_analyze.c:291
+#: modules/process/indent_analyze.c:276
 msgid "Brinell"
 msgstr "Brinell"
 
-#: modules/process/indent_analyze.c:292
+#: modules/process/indent_analyze.c:277
 #, fuzzy
 msgid "Cube corner"
 msgstr "Kästchenzählung"
 
-#: modules/process/indent_analyze.c:293
+#: modules/process/indent_analyze.c:278
 msgid "Rockwell"
 msgstr "Rockwell"
 
-#: modules/process/indent_analyze.c:303
+#: modules/process/indent_analyze.c:288
 msgid "Analyses nanoindentation structure (volumes, surfaces, ...)."
 msgstr ""
 
-#: modules/process/indent_analyze.c:320
+#: modules/process/indent_analyze.c:302
 #, fuzzy
 msgid "/_Tip and Indentation/_Analyze Imprint..."
 msgstr "/Ein_kerber/ab_gleichen..."
 
-#: modules/process/indent_analyze.c:439
+#: modules/process/indent_analyze.c:410
 #, fuzzy
 msgid "Marked _areas:"
 msgstr "Fehlerzeilen markieren"
 
-#: modules/process/indent_analyze.c:445
+#: modules/process/indent_analyze.c:419
 #, fuzzy
 msgid "_Indentor type:"
 msgstr "_Linientyp:"
 
-#: modules/process/indent_analyze.c:451
+#: modules/process/indent_analyze.c:428
 #, fuzzy
 msgid "_Mask creation type:"
 msgstr "_Interpolationstyp:"
 
-#: modules/process/indent_analyze.c:456
+#: modules/process/indent_analyze.c:434
 #, fuzzy
 msgid "Ref. plane _tolerance:"
 msgstr "_Toleranz:"
 
-#: modules/process/indent_analyze.c:460
+#: modules/process/indent_analyze.c:438
 #, fuzzy
 msgid "Angle _1 tolerance:"
 msgstr "_Toleranz:"
 
-#: modules/process/indent_analyze.c:485
+#: modules/process/indent_analyze.c:456
 msgid "Indent center at"
 msgstr ""
 
-#: modules/process/indent_analyze.c:488
+#: modules/process/indent_analyze.c:460
 #, fuzzy
 msgid "Maximum at"
 msgstr "Maximaler z-Wert"
 
-#: modules/process/indent_analyze.c:491
+#: modules/process/indent_analyze.c:464
 #, fuzzy
 msgid "Max-min difference"
 msgstr "X Differenz"
 
-#: modules/process/indent_analyze.c:497
+#: modules/process/indent_analyze.c:472
 msgid "Expected A<sub>d</sub>:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:505
+#: modules/process/indent_analyze.c:479
 msgid "Expected A<sub>p</sub>:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:549
+#: modules/process/indent_analyze.c:489
 msgid "Volume above-below"
 msgstr ""
 
-#: modules/process/indent_analyze.c:558
+#: modules/process/indent_analyze.c:494
 msgid "Indent. volume"
 msgstr ""
 
-#: modules/process/indent_analyze.c:564
+#: modules/process/indent_analyze.c:502
 msgid "Indent. A<sub>d</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:573
+#: modules/process/indent_analyze.c:509
 msgid "Indent. A<sub>p</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:587
+#: modules/process/indent_analyze.c:517
 msgid "Inner Pile-Up A<sub>d</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:596
+#: modules/process/indent_analyze.c:525
 msgid "Inner Pile-Up A<sub>p</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:605
+#: modules/process/indent_analyze.c:533
 msgid "Outer Pile-Up A<sub>d</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:614
+#: modules/process/indent_analyze.c:541
 msgid "Outer Pile-Up A<sub>p</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:644
+#: modules/process/indent_analyze.c:569
 #, fuzzy
 msgid "Indentation statistics"
 msgstr "Korn-Statistiken"
 
-#: modules/process/indent_analyze.c:645
+#: modules/process/indent_analyze.c:570
 msgid "_Compute & mark"
 msgstr ""
 
-#: modules/process/indent_analyze.c:646
+#: modules/process/indent_analyze.c:571
 #, fuzzy
 msgid "_Save statistics"
 msgstr "/_Diagrammstatistiken"
 
-#: modules/process/indent_analyze.c:1569
+#: modules/process/indent_analyze.c:1392
 msgid "No statistics has been computed yet."
 msgstr ""
 
-#: modules/process/indent_analyze.c:1577
+#: modules/process/indent_analyze.c:1400
 #, fuzzy
 msgid "Save Indentation Statistics"
 msgstr "Korn-Statistiken"
 
-#: modules/process/indent_analyze.c:1615
+#: modules/process/indent_analyze.c:1438
 #, fuzzy, c-format
 msgid "Indentor:  %s\n"
 msgstr "_Linientyp:"
 
-#: modules/process/indent_analyze.c:1619
+#: modules/process/indent_analyze.c:1442
 #, c-format
 msgid "Length units: %s\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1621
+#: modules/process/indent_analyze.c:1444
 #, c-format
 msgid "Indentation center at [%d, %d] px:      %lf\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1623
+#: modules/process/indent_analyze.c:1446
 #, c-format
 msgid "Maximum at [%d, %d] is:                 %lf\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1625
+#: modules/process/indent_analyze.c:1448
 #, c-format
 msgid "Difference max-min:                     %lf\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1630
+#: modules/process/indent_analyze.c:1453
 #, c-format
 msgid "Area (projected) above plane:             %g (%.1lf %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1634
+#: modules/process/indent_analyze.c:1457
 #, c-format
 msgid "Area (projected) below plane:             %g (%.1lf %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1638
+#: modules/process/indent_analyze.c:1461
 #, c-format
 msgid "Area (projected) of    plane:             %g (%.1lf %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1643
+#: modules/process/indent_analyze.c:1466
 #, c-format
 msgid "Area (developed) above %g (+%.1f %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1646
+#: modules/process/indent_analyze.c:1469
 #, c-format
 msgid "Area (developed) below %g (+%.1lf %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1650
+#: modules/process/indent_analyze.c:1473
 #, c-format
 msgid "Volume above:     %g\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1652
+#: modules/process/indent_analyze.c:1475
 #, c-format
 msgid "Volume below:     %g\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1654
+#: modules/process/indent_analyze.c:1477
 #, fuzzy, c-format
 msgid "Volume difference %g\n"
 msgstr "Absolute Differenz"
 
-#: modules/process/indent_analyze.c:1658
+#: modules/process/indent_analyze.c:1481
 #, fuzzy
 msgid ""
 "\n"
 "Indentation\n"
 msgstr "Segmentierung"
 
-#: modules/process/indent_analyze.c:1659
+#: modules/process/indent_analyze.c:1482
 #, c-format
 msgid "Volume      %g\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1664
+#: modules/process/indent_analyze.c:1487
 msgid ""
 "\n"
 "Indentation - Inner Pile-Up\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1670
+#: modules/process/indent_analyze.c:1493
 msgid "Indentation - Outer Pile-Up\n"
 msgstr ""
 
@@ -11217,13 +11597,7 @@ msgstr "Fit-Parameter"
 msgid "_Lattice:"
 msgstr "_Linientyp:"
 
-#: modules/process/lat_synth.c:651 modules/process/obj_synth.c:544
-#: modules/process/pat_synth.c:1457
-#, fuzzy
-msgid "_Size:"
-msgstr "_Größe:"
-
-#: modules/process/lat_synth.c:662
+#: modules/process/lat_synth.c:662
 #, fuzzy
 msgid "Lattice rela_xation:"
 msgstr "Partikelerzeugung"
@@ -11371,7 +11745,7 @@ msgstr ""
 
 #: modules/process/level_grains.c:187 modules/process/median-bg.c:167
 #: modules/process/polylevel.c:293 modules/process/polylevel.c:417
-#: modules/process/sphere-revolve.c:200
+#: modules/process/sphere-revolve.c:221 modules/process/sphere-revolve.c:295
 msgid "Background"
 msgstr "Untergrund"
 
@@ -11385,168 +11759,169 @@ msgstr "Graphen mit Gerade nivellieren."
 msgid "Quantity to level:"
 msgstr "/_Beenden"
 
-#: modules/process/level_grains.c:231 modules/process/linematch.c:866
-#: modules/process/median-bg.c:217 modules/process/polylevel.c:482
-#: modules/process/sphere-revolve.c:263
+#: modules/process/level_grains.c:231 modules/process/linematch.c:834
+#: modules/process/median-bg.c:217 modules/process/polylevel.c:485
+#: modules/process/sphere-revolve.c:371
 msgid "E_xtract background"
 msgstr "Untergrund e_xtrahieren"
 
-#: modules/process/linecorrect.c:54
+#: modules/process/linecorrect.c:52
 msgid "Corrects line defects (mostly experimental algorithms)."
 msgstr "Korrigiert  Zeilendefekte (überwiegend experimentelle Algorithmen)"
 
-#: modules/process/linecorrect.c:68
+#: modules/process/linecorrect.c:66
 msgid "/_Correct Data/Ste_p Line Correction"
 msgstr "/Ko_rrigieren/_Stufen Zeilenkorrektur"
 
-#: modules/process/linecorrect.c:72
+#: modules/process/linecorrect.c:70
 msgid "Correct steps in lines"
 msgstr "Stufen in Zeilen korrigieren"
 
-#: modules/process/linematch.c:158 modules/tools/linestats.c:166
+#: modules/process/linematch.c:155 modules/tools/linestats.c:166
 #: modules/volume/volume_linestat.c:143
 msgid "Median"
 msgstr "Median"
 
-#: modules/process/linematch.c:159
+#: modules/process/linematch.c:156
 #, fuzzy
 msgid "Median of differences"
 msgstr "X Differenz"
 
-#: modules/process/linematch.c:160
+#: modules/process/linematch.c:157
 #, fuzzy
 msgid "Modus"
 msgstr "FFT Betrag"
 
-#: modules/process/linematch.c:161
+#: modules/process/linematch.c:158
 msgid "linematch|Matching"
 msgstr ""
 
-#: modules/process/linematch.c:162
+#: modules/process/linematch.c:159
 #, fuzzy
 msgid "linematch|Polynomial"
 msgstr "Polynomiell"
 
-#: modules/process/linematch.c:168
+#: modules/process/linematch.c:165
 msgid "Aligns rows by various methods."
 msgstr ""
 
-#: modules/process/linematch.c:182
+#: modules/process/linematch.c:179
 #, fuzzy
 msgid "/_Correct Data/_Align rows..."
 msgstr "/Ko_rrigieren/D_rehung korrigieren..."
 
-#: modules/process/linematch.c:186
+#: modules/process/linematch.c:183
 msgid "Align rows using various methods"
 msgstr ""
 
-#: modules/process/linematch.c:237 modules/process/linematch.c:265
+#: modules/process/linematch.c:234 modules/process/linematch.c:262
 #, fuzzy
 msgid "Row background"
 msgstr "Untergrund"
 
-#: modules/process/linematch.c:266
+#: modules/process/linematch.c:263
 #, fuzzy
 msgid "Vertical position"
 msgstr "_Vertikal"
 
-#: modules/process/linematch.c:267
+#: modules/process/linematch.c:264
 #, fuzzy
 msgid "Corrected offset"
 msgstr "Korrigier_te Daten"
 
-#: modules/process/linematch.c:802
+#: modules/process/linematch.c:769
 #, fuzzy
 msgid "Align Rows"
 msgstr "Diagrammkurven nivellieren"
 
-#: modules/process/linematch.c:844
+#: modules/process/linematch.c:810
 #, fuzzy
 msgid "_Polynomial degree:"
 msgstr "Polynomiell (0. Ordnung)"
 
-#: modules/process/linematch.c:876
+#: modules/process/linematch.c:844
 #, fuzzy
 msgid "Plot background _graph"
 msgstr "Drift-Graph zeichnen"
 
-#: modules/process/lno_synth.c:261 modules/process/noise_synth.c:188
+#: modules/process/lno_synth.c:259 modules/process/noise_synth.c:186
 #, fuzzy
 msgid "distribution|Triangular"
 msgstr "Dreieckig"
 
-#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:213
+#: modules/process/lno_synth.c:265 modules/process/pat_synth.c:213
 msgid "Steps"
 msgstr ""
 
-#: modules/process/lno_synth.c:268
+#: modules/process/lno_synth.c:266
 #, fuzzy
 msgid "Scars"
 msgstr "Fehlerzeilen markieren"
 
-#: modules/process/lno_synth.c:269 modules/process/pat_synth.c:214
+#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:214
 msgid "Ridges"
 msgstr ""
 
-#: modules/process/lno_synth.c:275
+#: modules/process/lno_synth.c:273
 msgid "Generates various kinds of line noise."
 msgstr ""
 
-#: modules/process/lno_synth.c:289
+#: modules/process/lno_synth.c:287
 msgid "/S_ynthetic/_Line Noise..."
 msgstr "/S_ynthetisch/_Linien-Rauschen..."
 
-#: modules/process/lno_synth.c:293
+#: modules/process/lno_synth.c:291
 #, fuzzy
 msgid "Generate line noise"
 msgstr "Relative Linien"
 
-#: modules/process/lno_synth.c:431
+#: modules/process/lno_synth.c:429
 #, fuzzy
 msgid "Line Noise"
 msgstr "Linie + Punkte"
 
-#: modules/process/lno_synth.c:504
+#: modules/process/lno_synth.c:502
 msgid "Distribution"
 msgstr "VerzerrtVerteilung"
 
-#: modules/process/lno_synth.c:514 modules/process/noise_synth.c:414
-msgid "Direction:"
-msgstr "Richtung:"
+#: modules/process/lno_synth.c:512 modules/process/mask_noisify.c:158
+#: modules/process/noise_synth.c:412
+#, fuzzy
+msgid "Noise type:"
+msgstr "_Linientyp:"
 
-#: modules/process/lno_synth.c:523 modules/process/noise_synth.c:423
+#: modules/process/lno_synth.c:521 modules/process/mask_noisify.c:167
+#: modules/process/noise_synth.c:421
 #, fuzzy
 msgid "S_ymmetrical"
 msgstr "Symmetrie"
 
-#: modules/process/lno_synth.c:524 modules/process/noise_synth.c:424
+#: modules/process/lno_synth.c:522 modules/process/mask_noisify.c:168
+#: modules/process/noise_synth.c:422
 msgid "One-sided _positive"
 msgstr ""
 
-#: modules/process/lno_synth.c:525 modules/process/noise_synth.c:425
+#: modules/process/lno_synth.c:523 modules/process/mask_noisify.c:169
+#: modules/process/noise_synth.c:423
 msgid "One-sided _negative"
 msgstr ""
 
-#: modules/process/lno_synth.c:546
+#: modules/process/lno_synth.c:544
 #, fuzzy
 msgid "Noise Type"
 msgstr "Punkt_typ:"
 
-#: modules/process/lno_synth.c:551
+#: modules/process/lno_synth.c:549
 #, fuzzy
 msgid "_Noise type:"
 msgstr "_Linientyp:"
 
-#: modules/process/lno_synth.c:853 modules/process/lno_synth.c:1222
-msgid "Densi_ty:"
-msgstr "Dich_te:"
-
-#: modules/process/lno_synth.c:864 modules/process/lno_synth.c:1233
+#: modules/process/lno_synth.c:863 modules/process/lno_synth.c:1233
 #, fuzzy
 msgid "_Within line:"
 msgstr "_Glanz:"
 
-#: modules/process/lno_synth.c:871
+#: modules/process/lno_synth.c:870
 msgid "C_umulative"
 msgstr ""
 
@@ -11607,36 +11982,36 @@ msgstr ""
 msgid "_Train logistic regression"
 msgstr ""
 
-#: modules/process/logistic.c:275
+#: modules/process/logistic.c:274
 #, fuzzy
 msgid "_Gaussian blur"
 msgstr "Gauß"
 
-#: modules/process/logistic.c:288
+#: modules/process/logistic.c:285
 #, fuzzy
 msgid "_Number of Gaussians:"
 msgstr "Anzahl an Körnern"
 
-#: modules/process/logistic.c:296
+#: modules/process/logistic.c:293
 #, fuzzy
 msgid "_Sobel derivatives"
 msgstr "Negativ"
 
-#: modules/process/logistic.c:307
+#: modules/process/logistic.c:303
 msgid "_Laplacian"
 msgstr ""
 
-#: modules/process/logistic.c:318
+#: modules/process/logistic.c:313
 #, fuzzy
 msgid "_Hessian"
 msgstr "Gauß"
 
-#: modules/process/logistic.c:331
+#: modules/process/logistic.c:325
 #, fuzzy
 msgid "_Regularization parameter:"
 msgstr "Fit-Parameter"
 
-#: modules/process/logistic.c:623 modules/process/neural.c:1101
+#: modules/process/logistic.c:616 modules/process/neural.c:1108
 #, fuzzy
 msgid "Training..."
 msgstr "Korreliere..."
@@ -11656,13 +12031,13 @@ msgstr "/Ko_rrigieren/_Ausreißer markieren"
 msgid "Mark data disconnected from other values"
 msgstr "Daten markieren, die weiter als 3σ vom Mittelwert abweichen"
 
-#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:422
-#: modules/process/scars.c:279
+#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:419
+#: modules/process/scars.c:297
 msgid "Positive"
 msgstr "Positiv"
 
-#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:423
-#: modules/process/scars.c:280
+#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:420
+#: modules/process/scars.c:298
 msgid "Negative"
 msgstr "Negativ"
 
@@ -11680,12 +12055,12 @@ msgstr "_Wavelet-Typ:"
 msgid "Defect _radius:"
 msgstr "_Realer Radius"
 
-#: modules/process/mark_disconn.c:563
+#: modules/process/mark_disconn.c:552
 #, fuzzy
 msgid "Filtering..."
 msgstr "FFT-Filterung"
 
-#: modules/process/mark_disconn.c:590
+#: modules/process/mark_disconn.c:579
 #, fuzzy
 msgid "Marking outliers..."
 msgstr "Markiere Grenzen"
@@ -11702,57 +12077,61 @@ msgstr "/_Maske/Markieren m_it..."
 msgid "Mask combining and modification"
 msgstr ""
 
-#: modules/process/mark_with.c:192
+#: modules/process/mark_with.c:193
 msgid "Mark With"
 msgstr "Markieren mit..."
 
-#: modules/process/mark_with.c:238
+#: modules/process/mark_with.c:231 modules/process/mask_morph.c:209
+msgid "Operation:"
+msgstr "Operation:"
+
+#: modules/process/mark_with.c:239
 #, fuzzy
 msgid "Se_t mask"
 msgstr "Maske invertieren"
 
-#: modules/process/mark_with.c:239
+#: modules/process/mark_with.c:240
 msgid "_Add mask"
 msgstr "Maske _addieren"
 
-#: modules/process/mark_with.c:240
+#: modules/process/mark_with.c:241
 msgid "_Subtract mask"
 msgstr "Maske _subtrahieren"
 
-#: modules/process/mark_with.c:241
+#: modules/process/mark_with.c:242
 #, fuzzy
 msgid "_Intersect masks"
 msgstr "Maske invertieren"
 
-#: modules/process/mark_with.c:247
+#: modules/process/mark_with.c:248
 msgid "Mark with:"
 msgstr "Markieren mit:"
 
-#: modules/process/mark_with.c:255
+#: modules/process/mark_with.c:256
 msgid "with|_Mask"
 msgstr ""
 
-#: modules/process/mark_with.c:257
+#: modules/process/mark_with.c:258
 msgid "with|_Data"
 msgstr ""
 
-#: modules/process/mark_with.c:259
+#: modules/process/mark_with.c:260
 msgid "with|_Presentation"
 msgstr ""
 
-#: modules/process/mark_with.c:293
+#: modules/process/mark_with.c:297
 msgid "Marked data range:"
 msgstr "Markierter Datenbereich:"
 
-#: modules/process/mark_with.c:301
+#: modules/process/mark_with.c:305
 msgid "_Minimum:"
 msgstr "_Minimum:"
 
-#: modules/process/mark_with.c:310
+#: modules/process/mark_with.c:314
 msgid "M_aximum:"
 msgstr "Ma_ximum:"
 
-#: modules/process/mark_with.c:378
+#: modules/process/mark_with.c:382
 msgid "Operand"
 msgstr "Operand"
 
@@ -11795,120 +12174,120 @@ msgstr "VerzerrtVerteilung"
 msgid "Preserve existing masks"
 msgstr "Projizierte Fläche"
 
-#: modules/process/mask_edt.c:95
+#: modules/process/mask_edt.c:89
 msgid "Performs simple and true Euclidean distance transforms of masks."
 msgstr ""
 
-#: modules/process/mask_edt.c:109
+#: modules/process/mask_edt.c:103
 #, fuzzy
 msgid "/_Mask/Distanc_e Transform..."
 msgstr "_Transformiert"
 
-#: modules/process/mask_edt.c:113
+#: modules/process/mask_edt.c:107
 #, fuzzy
 msgid "Distance transform of mask"
 msgstr "_Transformiert"
 
-#: modules/process/mask_edt.c:116
+#: modules/process/mask_edt.c:110
 msgid "/_Mask/Thi_n"
 msgstr ""
 
-#: modules/process/mask_edt.c:120
+#: modules/process/mask_edt.c:114
 #, fuzzy
 msgid "Thin mask"
 msgstr "Maske bearbeiten"
 
-#: modules/process/mask_edt.c:330 modules/process/mask_edt.c:352
+#: modules/process/mask_edt.c:164 modules/process/mask_edt.c:186
 #, fuzzy
 msgid "Distance Transform"
 msgstr "_Transformiert"
 
-#: modules/process/mask_edt.c:340
+#: modules/process/mask_edt.c:174
 #, fuzzy
 msgid "Interior"
 msgstr "Schnittmenge"
 
-#: modules/process/mask_edt.c:341
+#: modules/process/mask_edt.c:175
 msgid "Exterior"
 msgstr ""
 
-#: modules/process/mask_edt.c:342
+#: modules/process/mask_edt.c:176
 msgid "Two-sided"
 msgstr ""
 
-#: modules/process/mask_edt.c:373 modules/tools/maskedit.c:634
+#: modules/process/mask_edt.c:207 modules/tools/maskedit.c:640
 #, fuzzy
 msgid "_Distance type:"
 msgstr "X Abstand"
 
-#: modules/process/mask_edt.c:394 modules/tools/maskedit.c:640
+#: modules/process/mask_edt.c:228 modules/tools/maskedit.c:646
 msgid "Shrink from _border"
 msgstr ""
 
-#: modules/process/mask_morph.c:117
+#: modules/process/mask_morph.c:116
 msgid "Performs basic morphological operations with masks."
 msgstr ""
 
-#: modules/process/mask_morph.c:131
+#: modules/process/mask_morph.c:130
 #, fuzzy
-msgid "/_Mask/Morphological Operation..."
+msgid "/_Mask/Morpho_logical Operation..."
 msgstr "/_Grundfunktionen/_Verkippen..."
 
-#: modules/process/mask_morph.c:135
+#: modules/process/mask_morph.c:134
 msgid "Morphological operation with mask"
 msgstr ""
 
-#: modules/process/mask_morph.c:169
+#: modules/process/mask_morph.c:168
 #, fuzzy
 msgid "Erosion"
 msgstr "Erosion"
 
-#: modules/process/mask_morph.c:170
+#: modules/process/mask_morph.c:169
 #, fuzzy
 msgid "Dilation"
 msgstr "Dilatation"
 
-#: modules/process/mask_morph.c:171 modules/tools/filter.c:242
+#: modules/process/mask_morph.c:170 modules/tools/filter.c:243
 #, fuzzy
 msgid "filter|Opening"
 msgstr "FFT-Filterung"
 
-#: modules/process/mask_morph.c:172 modules/tools/filter.c:243
+#: modules/process/mask_morph.c:171 modules/tools/filter.c:244
 #, fuzzy
 msgid "filter|Closing"
 msgstr "Gauß"
 
-#: modules/process/mask_morph.c:173 modules/tools/filter.c:244
+#: modules/process/mask_morph.c:172 modules/tools/filter.c:245
 msgid "ASF Opening"
 msgstr ""
 
-#: modules/process/mask_morph.c:174 modules/tools/filter.c:245
+#: modules/process/mask_morph.c:173 modules/tools/filter.c:246
 msgid "ASF Closing"
 msgstr ""
 
-#: modules/process/mask_morph.c:178
+#: modules/process/mask_morph.c:177
 msgid "Octagon"
 msgstr ""
 
-#: modules/process/mask_morph.c:181
+#: modules/process/mask_morph.c:180
 #, fuzzy
 msgid "Another mask"
 msgstr "Maske invertieren"
 
-#: modules/process/mask_morph.c:192
+#: modules/process/mask_morph.c:191
 msgid "Morphological Operation"
 msgstr ""
 
-#: modules/process/mask_morph.c:224
+#: modules/process/mask_morph.c:223
 #, fuzzy
 msgid "Structuring element:"
 msgstr "Struktur"
 
-#: modules/process/mask_morph.c:238 modules/tools/maskedit.c:524
+#: modules/process/mask_morph.c:237 modules/tools/maskedit.c:528
 msgid "_Radius:"
 msgstr "_Radius:"
 
-#: modules/process/mask_morph.c:249
+#: modules/process/mask_morph.c:248
 #, fuzzy
 msgid "_Mask:"
 msgstr "_Maske"
@@ -11917,40 +12296,63 @@ msgstr "_Maske"
 msgid "_Trim empty borders"
 msgstr ""
 
-#: modules/process/maskcor.c:86
+#: modules/process/mask_noisify.c:83
+msgid "Adds salt and/or pepper noise to mask."
+msgstr ""
+
+#: modules/process/mask_noisify.c:97
+#, fuzzy
+msgid "/_Mask/_Noisify..."
+msgstr "/_Körnung/_Verteilungen..."
+
+#: modules/process/mask_noisify.c:101
+#, fuzzy
+msgid "Add noise to mask"
+msgstr "Auswahl zur Maske hinzufügen"
+
+#: modules/process/mask_noisify.c:141
+msgid "Noisify Mask"
+msgstr ""
+
+#: modules/process/mask_noisify.c:184
+#, fuzzy
+msgid "_Alter only boundaries"
+msgstr "Markiere Grenzen"
+
+#: modules/process/maskcor.c:87
 msgid "Creates mask by correlation with another data."
 msgstr "Erzeugt eine Maske durch Korrelation mit einem anderen Datensatz."
 
-#: modules/process/maskcor.c:100
+#: modules/process/maskcor.c:101
 msgid "/M_ultidata/_Mask by Correlation..."
 msgstr "/M_ultidaten/_Maskieren mittels Korrelation..."
 
-#: modules/process/maskcor.c:104
+#: modules/process/maskcor.c:105
 msgid "Create mask by correlation with another data"
 msgstr ""
 
-#: modules/process/maskcor.c:141
+#: modules/process/maskcor.c:142
 msgid "Mask by Correlation"
 msgstr "Mittels Korrelation maskieren"
 
-#: modules/process/maskcor.c:165
+#: modules/process/maskcor.c:166
 msgid "Correlation _kernel:"
 msgstr ""
 
-#: modules/process/maskcor.c:172
+#: modules/process/maskcor.c:173
 msgid "Objects marked"
 msgstr ""
 
-#: modules/process/maskcor.c:173
+#: modules/process/maskcor.c:174
 msgid "Correlation maxima"
 msgstr ""
 
-#: modules/process/maskcor.c:174 modules/process/maskcor.c:356
+#: modules/process/maskcor.c:175 modules/process/maskcor.c:360
 #, fuzzy
 msgid "Correlation score"
 msgstr "Korrelations-Wert"
 
-#: modules/process/maskcor.c:183
+#: modules/process/maskcor.c:185
 msgid "Correlation _method:"
 msgstr "Korrelations_methode:"
 
@@ -11979,7 +12381,8 @@ msgid "/_Mask/_Extract Mask"
 msgstr "/_Maske/Maske e_xtrahieren"
 
 #: modules/process/maskops.c:78
-msgid "Extract mask to a new channel"
+#, fuzzy
+msgid "Extract mask to a new image"
 msgstr "Maske in neuen Kanal extrahieren"
 
 #: modules/process/maskops.c:81
@@ -12009,40 +12412,36 @@ msgstr ""
 msgid "Mutual Crop"
 msgstr ""
 
-#: modules/process/mcrop.c:174
+#: modules/process/mcrop.c:173
 #, fuzzy
 msgid "_Select second argument:"
 msgstr "_Auswahlmodus:"
 
-#: modules/process/measure_lattice.c:174
+#: modules/process/measure_lattice.c:165
 #, fuzzy
 msgid "Measures parameters of two-dimensional lattices."
 msgstr "Ebene zur Auswahl elliptischer Bereiche."
 
-#: modules/process/measure_lattice.c:188
+#: modules/process/measure_lattice.c:179
 #, fuzzy
 msgid "/_Statistics/Measure _Lattice..."
 msgstr "/_Statistik/Facetten-_Analyse"
 
-#: modules/process/measure_lattice.c:192
+#: modules/process/measure_lattice.c:183
 #, fuzzy
 msgid "Measure lattice"
 msgstr "Abstände messen"
 
-#: modules/process/measure_lattice.c:253
+#: modules/process/measure_lattice.c:243
 #, fuzzy
 msgid "Measure Lattice"
 msgstr "Abstände messen"
 
-#: modules/process/measure_lattice.c:259
-msgid "_Refine"
-msgstr ""
-
-#: modules/process/measure_lattice.c:330
+#: modules/process/measure_lattice.c:320
 msgid "_ACF"
 msgstr ""
 
-#: modules/process/measure_lattice.c:331
+#: modules/process/measure_lattice.c:321
 #, fuzzy
 msgid "_PSDF"
 msgstr "PSDF"
@@ -12061,32 +12460,32 @@ msgstr "_Linientyp:"
 msgid "_Vectors"
 msgstr ""
 
-#: modules/process/measure_lattice.c:596
+#: modules/process/measure_lattice.c:589
 #, fuzzy
 msgid "Save Lattice Parameters"
 msgstr "Rauigkeits-Parameter speichern"
 
-#: modules/process/measure_lattice.c:634
+#: modules/process/measure_lattice.c:627
 #, fuzzy, c-format
 msgid "Vector %d:"
 msgstr "X-Fehler %d"
 
-#: modules/process/measure_lattice.c:643
+#: modules/process/measure_lattice.c:636
 #, fuzzy, c-format
 msgid "Length %d:"
 msgstr "_Länge:"
 
-#: modules/process/measure_lattice.c:650
+#: modules/process/measure_lattice.c:643
 #, fuzzy, c-format
 msgid "Angle %d:"
 msgstr "Winkel"
 
-#: modules/process/measure_lattice.c:665
+#: modules/process/measure_lattice.c:657
 #, fuzzy
 msgid "Angle:"
 msgstr "Winkel"
 
-#: modules/process/measure_lattice.c:681
+#: modules/process/measure_lattice.c:673
 #, fuzzy
 msgid "Lattice Parameters"
 msgstr "Fit-Parameter"
@@ -12112,11 +12511,11 @@ msgstr "Median-Nivellierung"
 msgid "Median Level"
 msgstr "Median Niveau"
 
-#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:237
+#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:336
 msgid "Real _radius:"
 msgstr "_Realer Radius"
 
-#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:247
+#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:346
 msgid "_Pixel radius:"
 msgstr "_Pixel-Radius:"
 
@@ -12156,7 +12555,7 @@ msgstr "Erster Operand"
 msgid "Second operand"
 msgstr "Zweiter Operand"
 
-#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:643
+#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:612
 #, fuzzy
 msgid "Average"
 msgstr "_Minimalwert"
@@ -12210,6 +12609,244 @@ msgstr ""
 msgid "Merged images"
 msgstr "Zusammengefügte Bilder"
 
+#: modules/process/mfm_current.c:163
+msgid "Simulation of current line magnetic field"
+msgstr ""
+
+#: modules/process/mfm_current.c:177
+msgid "/SPM M_odes/_MFM/_Current Line Field..."
+msgstr ""
+
+#: modules/process/mfm_current.c:181
+msgid "Simulate stray field above current line"
+msgstr ""
+
+#: modules/process/mfm_current.c:280 modules/process/mfm_parallel.c:282
+msgid "Simulated field"
+msgstr ""
+
+#: modules/process/mfm_current.c:322 modules/process/mfm_field.c:266
+#: modules/process/mfm_parallel.c:324
+#, fuzzy
+msgid "Point charge"
+msgstr "Punkttyp"
+
+#: modules/process/mfm_current.c:323 modules/process/mfm_field.c:267
+#: modules/process/mfm_parallel.c:325
+#, fuzzy
+msgid "Bar"
+msgstr "Binär"
+
+#: modules/process/mfm_current.c:330
+msgid "Current Line Stray Field"
+msgstr ""
+
+#: modules/process/mfm_current.c:415
+#, fuzzy
+msgid "Output"
+msgstr "Ausgabe_art:"
+
+#: modules/process/mfm_current.c:420 modules/process/mfm_field.c:320
+#: modules/process/mfm_parallel.c:415
+#, fuzzy
+msgid "_Output plane height:"
+msgstr "Ausgabe_art:"
+
+#: modules/process/mfm_current.c:428
+#, fuzzy
+msgid "_Stripe width:"
+msgstr "S_teigung:"
+
+#: modules/process/mfm_current.c:436
+msgid "Stripe _current:"
+msgstr ""
+
+#: modules/process/mfm_current.c:444
+#, fuzzy
+msgid "_Position:"
+msgstr "Position:"
+
+#: modules/process/mfm_current.c:461
+msgid "Probe"
+msgstr ""
+
+#: modules/process/mfm_current.c:469
+#, fuzzy
+msgid "P_robe type:"
+msgstr "_Linientyp:"
+
+#: modules/process/mfm_current.c:475 modules/process/mfm_field.c:389
+#: modules/process/mfm_parallel.c:482
+#, fuzzy
+msgid "Tip _magnetization:"
+msgstr "Spitzen_rotation:"
+
+#: modules/process/mfm_current.c:484 modules/process/mfm_field.c:397
+#: modules/process/mfm_parallel.c:491
+#, fuzzy
+msgid "Bar width _x:"
+msgstr "S_teigung:"
+
+#: modules/process/mfm_current.c:493 modules/process/mfm_field.c:405
+#: modules/process/mfm_parallel.c:500
+#, fuzzy
+msgid "Bar width _y:"
+msgstr "S_teigung:"
+
+#: modules/process/mfm_current.c:502 modules/process/mfm_field.c:413
+#: modules/process/mfm_parallel.c:509
+msgid "Bar length (_z):"
+msgstr ""
+
+#: modules/process/mfm_field.c:146
+msgid "Simulation of magnetic field above perpendicular media"
+msgstr ""
+
+#: modules/process/mfm_field.c:160
+msgid "/SPM M_odes/_MFM/_Perpendicular Media Field..."
+msgstr ""
+
+#: modules/process/mfm_field.c:164
+msgid "Compute stray field above perpendicular magnetic medium"
+msgstr ""
+
+#: modules/process/mfm_field.c:276
+msgid "Perpendicular Media Stray Field"
+msgstr ""
+
+#: modules/process/mfm_field.c:328 modules/process/mfm_parallel.c:423
+#, fuzzy
+msgid "_Film thickness:"
+msgstr "Rahmendicke:"
+
+#: modules/process/mfm_field.c:336
+msgid "_Magnetic charge:"
+msgstr ""
+
+#: modules/process/mfm_field.c:344
+msgid "Include domain _walls"
+msgstr ""
+
+#: modules/process/mfm_field.c:354
+#, fuzzy
+msgid "_Exchange constant:"
+msgstr "Fenstergröße"
+
+#: modules/process/mfm_field.c:362
+#, fuzzy
+msgid "_Uniaxial anisotropy:"
+msgstr "DWT Anisotropie"
+
+#: modules/process/mfm_field.c:383 modules/process/mfm_parallel.c:476
+#, fuzzy
+msgid "_Probe type:"
+msgstr "_Linientyp:"
+
+#: modules/process/mfm_findshift.c:88
+msgid "Lift height difference estimation from data blur"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:102
+msgid "/SPM M_odes/_MFM/_Estimate Shift in Z..."
+msgstr ""
+
+#: modules/process/mfm_findshift.c:106
+msgid "Estimate lift height difference in MFM data"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:166 modules/process/psf.c:340
+#, fuzzy
+msgid "Searching..."
+msgstr "Starte"
+
+#: modules/process/mfm_findshift.c:196
+#, fuzzy
+msgid "Estimated shift:"
+msgstr "_Abschätzung"
+
+#: modules/process/mfm_findshift.c:211
+#, fuzzy
+msgid "Shifted field difference"
+msgstr "X Differenz"
+
+#: modules/process/mfm_findshift.c:228
+msgid "Estimate Lift Height Shift"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:255
+#, fuzzy
+msgid "Data to compare:"
+msgstr "Hinzuzufügender _Datensatz:"
+
+#: modules/process/mfm_findshift.c:261
+#, fuzzy
+msgid "Search _from:"
+msgstr "Such-Größe"
+
+#: modules/process/mfm_findshift.c:269
+#, fuzzy
+msgid "Search _to:"
+msgstr "Such-Größe"
+
+#: modules/process/mfm_parallel.c:165
+#, fuzzy
+msgid "Simulation of parallel magnetic media"
+msgstr "Fit-Parameter"
+
+#: modules/process/mfm_parallel.c:179
+msgid "/SPM M_odes/_MFM/Para_llel Media Field..."
+msgstr ""
+
+#: modules/process/mfm_parallel.c:183
+msgid "Simulate stray field above parallel magnetic medium"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:331
+msgid "Parallel Media Stray Field"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:431
+#, fuzzy
+msgid "_Remanent magnetization:"
+msgstr "Spitzen_rotation:"
+
+#: modules/process/mfm_parallel.c:439
+msgid "Size _A (dir. left):"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:447
+msgid "Size _B (dir. right):"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:455
+#, fuzzy
+msgid "_Gap size:"
+msgstr "_Tropfengröße:"
+
+#: modules/process/mfm_shift.c:87
+msgid "Simulation of magnetic field z component change for another level"
+msgstr ""
+
+#: modules/process/mfm_shift.c:101
+msgid "/SPM M_odes/_MFM/_Field Shift in Z..."
+msgstr ""
+
+#: modules/process/mfm_shift.c:105
+msgid "Compute stray field shift for another z level"
+msgstr ""
+
+#: modules/process/mfm_shift.c:146
+msgid "Shifted field"
+msgstr ""
+
+#: modules/process/mfm_shift.c:164
+msgid "Stray Field Plane Shift"
+msgstr ""
+
+#: modules/process/mfm_shift.c:209
+msgid "_Z shift by:"
+msgstr ""
+
 #: modules/process/nanoindent_adjust.c:89
 #, fuzzy
 msgid "Adjust images of two indentor prints."
@@ -12253,7 +12890,7 @@ msgstr "Daten _rotieren"
 msgid "E_xtrapolate result data out of measured range"
 msgstr "Ergebnis aus Messdaten e_xtrapolieren"
 
-#: modules/process/nanoindent_adjust.c:295
+#: modules/process/nanoindent_adjust.c:296
 #, fuzzy
 msgid ""
 "Tip has different range/resolution ratio than image. Tip will be resampled."
@@ -12261,7 +12898,7 @@ msgstr ""
 "Spitze hat anderes Bereich/Auflösung Verhältnis als das Bild. Spitze wird "
 "resampled."
 
-#: modules/process/nanoindent_adjust.c:334
+#: modules/process/nanoindent_adjust.c:335
 msgid "Immersed detail data"
 msgstr "Eingefügter Detailbild-Datensatz"
 
@@ -12307,274 +12944,262 @@ msgstr ""
 msgid "error"
 msgstr "Fehler"
 
-#: modules/process/neural.c:503
+#: modules/process/neural.c:504
 msgid "NN training error"
 msgstr ""
 
-#: modules/process/neural.c:516
+#: modules/process/neural.c:517
 #, fuzzy
 msgid "Training"
 msgstr "Korreliere..."
 
-#: modules/process/neural.c:520
+#: modules/process/neural.c:521
 #, fuzzy
 msgid "_Model:"
 msgstr "Modus:"
 
-#: modules/process/neural.c:530
+#: modules/process/neural.c:532
 msgid "_Signal:"
 msgstr ""
 
-#: modules/process/neural.c:541
+#: modules/process/neural.c:544
 #, fuzzy
 msgid "Training ste_ps:"
 msgstr "Fit-Modus"
 
-#: modules/process/neural.c:557
+#: modules/process/neural.c:561
 #, fuzzy
 msgid "Model"
 msgstr "Modus"
 
-#: modules/process/neural.c:558
+#: modules/process/neural.c:562
 msgid "Signal"
 msgstr ""
 
-#: modules/process/neural.c:575
+#: modules/process/neural.c:579
 #, fuzzy
 msgid "verb|_Train"
 msgstr "_Laden"
 
-#: modules/process/neural.c:580
+#: modules/process/neural.c:584
 #, fuzzy
 msgid "Re_initialize"
 msgstr "Initialisiere"
 
-#: modules/process/neural.c:613
+#: modules/process/neural.c:617
 msgid "Network"
 msgstr ""
 
-#: modules/process/neural.c:619
+#: modules/process/neural.c:623
 #, fuzzy
 msgid "Window _width:"
 msgstr "Fenstergröße"
 
-#: modules/process/neural.c:627
+#: modules/process/neural.c:631
 #, fuzzy
 msgid "Window h_eight:"
 msgstr "Neue _Höhe:"
 
-#: modules/process/neural.c:635
+#: modules/process/neural.c:639
 #, fuzzy
 msgid "_Hidden nodes:"
 msgstr "Versteckt"
 
-#: modules/process/neural.c:643
+#: modules/process/neural.c:647
 #, fuzzy
 msgid "Result Units"
 msgstr "Ergebnisse\n"
 
-#: modules/process/neural.c:650
+#: modules/process/neural.c:654
 msgid "Power of source _XY:"
 msgstr ""
 
-#: modules/process/neural.c:658
+#: modules/process/neural.c:663
 msgid "Power of source _Z:"
 msgstr ""
 
-#: modules/process/neural.c:666
+#: modules/process/neural.c:672
 #, fuzzy
 msgid "_Fixed units:"
 msgstr "_Werteskala:"
 
-#: modules/process/neural.c:676
+#: modules/process/neural.c:683
 msgid "Networks"
 msgstr ""
 
-#: modules/process/neural.c:723
+#: modules/process/neural.c:730
 msgid "Network _name:"
 msgstr ""
 
-#: modules/process/neural.c:775
+#: modules/process/neural.c:782
 #, fuzzy
 msgid "Apply Neural Network"
 msgstr "/M_ultidaten/Zusa_mmenführen..."
 
-#: modules/process/neural.c:798
+#: modules/process/neural.c:805
 #, fuzzy
 msgid "_Scale proportionally to input"
 msgstr "_proportional"
 
-#: modules/process/neural.c:929
+#: modules/process/neural.c:936
 msgid "Model and signal are not compatible."
 msgstr ""
 
-#: modules/process/neural.c:937
+#: modules/process/neural.c:944
 msgid "A field dimension is too small for chosen window size."
 msgstr ""
 
-#: modules/process/neural.c:1183 modules/process/neural.c:1349
+#: modules/process/neural.c:1190 modules/process/neural.c:1356
 #, fuzzy
 msgid "Evaluating..."
 msgstr "Korreliere..."
 
-#: modules/process/neural.c:1309
+#: modules/process/neural.c:1316
 #, fuzzy
 msgid "Training was canceled."
 msgstr "Finde Minima"
 
-#: modules/process/neural.c:1319
+#: modules/process/neural.c:1326
 #, fuzzy, c-format
 msgid "Mean difference: %.*f %s"
 msgstr "X Differenz"
 
-#: modules/process/neural.c:1371
+#: modules/process/neural.c:1378
 msgid "Evaluated signal"
 msgstr ""
 
-#: modules/process/noise_synth.c:196
+#: modules/process/noise_synth.c:194
 msgid "Generates uncorrelated random noise."
 msgstr ""
 
-#: modules/process/noise_synth.c:210
+#: modules/process/noise_synth.c:208
 msgid "/S_ynthetic/_Noise..."
 msgstr "/S_ynthetisch/_Rauschen..."
 
-#: modules/process/noise_synth.c:214
+#: modules/process/noise_synth.c:212
 msgid "Generate surface of uncorrelated noise"
 msgstr ""
 
-#: modules/process/noise_synth.c:334
+#: modules/process/noise_synth.c:332
 #, fuzzy
 msgid "Random Noise"
 msgstr "Fenstergröße"
 
-#: modules/process/obj_synth.c:274
+#: modules/process/obj_synth.c:270
 #, fuzzy
 msgid "Spheres"
 msgstr "Unterdrücken"
 
-#: modules/process/obj_synth.c:275
+#: modules/process/obj_synth.c:271
 msgid "Boxes"
 msgstr ""
 
-#: modules/process/obj_synth.c:276
+#: modules/process/obj_synth.c:272
 #, fuzzy
 msgid "Cones"
 msgstr "Keine"
 
-#: modules/process/obj_synth.c:277
+#: modules/process/obj_synth.c:273
 msgid "Pyramids"
 msgstr ""
 
-#: modules/process/obj_synth.c:278
+#: modules/process/obj_synth.c:274
 #, fuzzy
 msgid "Diamonds"
 msgstr "Diamant"
 
-#: modules/process/obj_synth.c:279
+#: modules/process/obj_synth.c:275
 msgid "Tetrahedrons"
 msgstr ""
 
-#: modules/process/obj_synth.c:280
+#: modules/process/obj_synth.c:276
 msgid "Nuggets"
 msgstr ""
 
-#: modules/process/obj_synth.c:281
+#: modules/process/obj_synth.c:277
 msgid "Thatches"
 msgstr ""
 
-#: modules/process/obj_synth.c:282
+#: modules/process/obj_synth.c:278
 #, fuzzy
 msgid "Tents"
 msgstr "Punkte"
 
-#: modules/process/obj_synth.c:283
+#: modules/process/obj_synth.c:279
 #, fuzzy
 msgid "Gaussians"
 msgstr "Gauss'sch"
 
-#: modules/process/obj_synth.c:284
+#: modules/process/obj_synth.c:280
 #, fuzzy
 msgid "Doughnuts"
 msgstr "Rauigkeit"
 
-#: modules/process/obj_synth.c:285
+#: modules/process/obj_synth.c:281
 #, fuzzy
 msgid "Parabolic bumps"
 msgstr "Parallel"
 
-#: modules/process/obj_synth.c:291
+#: modules/process/obj_synth.c:287
 msgid "Generates randomly patterned surfaces by placing objects."
 msgstr ""
 
-#: modules/process/obj_synth.c:305
-msgid "/S_ynthetic/_Objects..."
+#: modules/process/obj_synth.c:301
+#, fuzzy
+msgid "/S_ynthetic/_Deposition/_Objects..."
 msgstr "/S_ynthetisch/_Objekte..."
 
-#: modules/process/obj_synth.c:309
+#: modules/process/obj_synth.c:305
 msgid "Generate surface of randomly placed objects"
 msgstr ""
 
-#: modules/process/obj_synth.c:424
+#: modules/process/obj_synth.c:421
 #, fuzzy
 msgid "Both (random)"
 msgstr "Rand"
 
-#: modules/process/obj_synth.c:439
+#: modules/process/obj_synth.c:436
 #, fuzzy
 msgid "Random Objects"
 msgstr "Fenstergröße"
 
-#: modules/process/obj_synth.c:513
-#, fuzzy
-msgid "_Shape:"
-msgstr "_Skala:"
-
-#: modules/process/obj_synth.c:531
-msgid "obj."
-msgstr ""
-
-#: modules/process/obj_synth.c:551
+#: modules/process/obj_synth.c:549
 #, fuzzy
 msgid "Aspect Ratio"
 msgstr "_Operator:"
 
-#: modules/process/obj_synth.c:558
+#: modules/process/obj_synth.c:556
 #, fuzzy
 msgid "_Aspect ratio:"
 msgstr "_Operator:"
 
-#: modules/process/obj_synth.c:588
+#: modules/process/obj_synth.c:586
 msgid "Scales _with size"
 msgstr ""
 
-#: modules/process/obj_synth.c:612
+#: modules/process/obj_synth.c:611
 #, fuzzy
 msgid "_Feature type:"
 msgstr "_Filtertyp:"
 
-#: modules/process/obj_synth.c:807
-msgid "_Truncate:"
-msgstr ""
-
-#: modules/process/otsu_threshold.c:39 modules/process/otsu_threshold.c:59
+#: modules/process/otsu_threshold.c:40 modules/process/otsu_threshold.c:60
 msgid "Automated threshold using Otsu's method on heights."
 msgstr ""
 
-#: modules/process/otsu_threshold.c:55
+#: modules/process/otsu_threshold.c:56
 #, fuzzy
-msgid "/_Grains/_Mark by Otsu's..."
+msgid "/_Grains/_Mark by Otsu's"
 msgstr "/_Körnung/_Markieren mit Schwellwert..."
 
-#: modules/process/outliers.c:40
+#: modules/process/outliers.c:41
 msgid "Creates mask of outliers."
 msgstr "Erzeugt Maske üver Ausreißern"
 
-#: modules/process/outliers.c:54
+#: modules/process/outliers.c:55
 msgid "/_Correct Data/Mask of _Outliers"
 msgstr "/Ko_rrigieren/_Ausreißer markieren"
 
-#: modules/process/outliers.c:58
+#: modules/process/outliers.c:59
 msgid "Mark data farther than 3σ from mean value"
 msgstr "Daten markieren, die weiter als 3σ vom Mittelwert abweichen"
 
@@ -12598,89 +13223,112 @@ msgstr ""
 msgid "_Pattern:"
 msgstr ""
 
-#: modules/process/pat_synth.c:812
+#: modules/process/pat_synth.c:813
 msgid "Flat"
 msgstr ""
 
-#: modules/process/pat_synth.c:820
+#: modules/process/pat_synth.c:821
 #, fuzzy
 msgid "_Flat width:"
 msgstr "Suchbereich _Breite:"
 
-#: modules/process/pat_synth.c:837 modules/process/pat_synth.c:1139
-#: modules/process/pat_synth.c:1474
+#: modules/process/pat_synth.c:838 modules/process/pat_synth.c:1140
+#: modules/process/pat_synth.c:1475
 #, fuzzy
 msgid "_Slope width:"
 msgstr "S_teigung:"
 
-#: modules/process/pat_synth.c:1099
+#: modules/process/pat_synth.c:1100
 #, fuzzy
 msgid "Top"
 msgstr "Bis:"
 
-#: modules/process/pat_synth.c:1106
+#: modules/process/pat_synth.c:1107
 msgid "Flat _top width:"
 msgstr ""
 
-#: modules/process/pat_synth.c:1114
+#: modules/process/pat_synth.c:1115
 msgid "Bottom"
 msgstr ""
 
-#: modules/process/pat_synth.c:1122
+#: modules/process/pat_synth.c:1123
 msgid "Flat _bottom width:"
 msgstr ""
 
-#: modules/process/pat_synth.c:1440
+#: modules/process/pat_synth.c:1441
 #, fuzzy
 msgid "_Distance:"
 msgstr "X Abstand"
 
-#: modules/process/pid.c:96
+#: modules/process/phase_synth.c:136
+msgid "Generates phase-separated structures."
+msgstr ""
+
+#: modules/process/phase_synth.c:150
+#, fuzzy
+msgid "/S_ynthetic/P_hases..."
+msgstr "/S_ynthetisch/_Partikel..."
+
+#: modules/process/phase_synth.c:154
+#, fuzzy
+msgid "Generate surface with separated phases"
+msgstr "Relative Linien"
+
+#: modules/process/phase_synth.c:203
+#, fuzzy
+msgid "Separated Phases"
+msgstr "_Graph"
+
+#: modules/process/phase_synth.c:287
+msgid "Size s_pread:"
+msgstr ""
+
+#: modules/process/pid.c:95
 msgid "A simple PID simulator"
 msgstr ""
 
-#: modules/process/pid.c:110
+#: modules/process/pid.c:109
 #, fuzzy
 msgid "/_Tip and Indentation/_PID simulation..."
 msgstr "/Spi_tze/_Dilatation..."
 
-#: modules/process/pid.c:114
+#: modules/process/pid.c:113
 msgid "Simulate PID effects on measurement"
 msgstr ""
 
-#: modules/process/pid.c:158
+#: modules/process/pid.c:157
 #, fuzzy
 msgid "PID FW result"
 msgstr "Fit-Ergebnis"
 
-#: modules/process/pid.c:167
+#: modules/process/pid.c:166
 msgid "PID FW max. force"
 msgstr ""
 
-#: modules/process/pid.c:176
+#: modules/process/pid.c:175
 #, fuzzy
 msgid "PID REV result"
 msgstr "Ergebnis"
 
-#: modules/process/pid.c:185
+#: modules/process/pid.c:184
 msgid "PID REV max. force"
 msgstr ""
 
-#: modules/process/pid.c:198
+#: modules/process/pid.c:196
 #, fuzzy
 msgid "PID simulation"
 msgstr "Dilatation"
 
-#: modules/process/pid.c:215
+#: modules/process/pid.c:214
 #, fuzzy
 msgid "_Proportional:"
 msgstr "_proportional"
 
-#: modules/process/pid.c:221
+#: modules/process/pid.c:220
 msgid "_Integral:"
 msgstr ""
 
-#: modules/process/pid.c:227
+#: modules/process/pid.c:226
 #, fuzzy
 msgid "_Integration steps:"
 msgstr "_Interpolationstyp:"
@@ -12690,15 +13338,15 @@ msgstr "_Interpolationstyp:"
 msgid "_Derivative:"
 msgstr "Negativ"
 
-#: modules/process/pid.c:241
+#: modules/process/pid.c:240
 msgid "PID/scan speed _ratio:"
 msgstr ""
 
-#: modules/process/pid.c:253
+#: modules/process/pid.c:255
 msgid "Force strength:"
 msgstr ""
 
-#: modules/process/pid.c:259
+#: modules/process/pid.c:261
 msgid "Force setpoint:"
 msgstr ""
 
@@ -12706,7 +13354,7 @@ msgstr ""
 msgid "Scanning..."
 msgstr ""
 
-#: modules/process/pid.c:396
+#: modules/process/pid.c:401
 msgid "Computation diverged, try to change parameters"
 msgstr ""
 
@@ -12729,23 +13377,23 @@ msgstr "Wendet polynomische Verzerrung in der horizontalen Ebene an"
 msgid "Distort by Polynomial"
 msgstr "Polynomisch verzerren"
 
-#: modules/process/polydistort.c:282
+#: modules/process/polydistort.c:285
 msgid "Ori_ginal"
 msgstr "Ori_ginal"
 
-#: modules/process/polydistort.c:283
+#: modules/process/polydistort.c:286
 msgid "_Transformed"
 msgstr "_Transformiert"
 
-#: modules/process/polydistort.c:289
+#: modules/process/polydistort.c:292
 msgid "X Coefficients"
 msgstr "X Koeffizienten"
 
-#: modules/process/polydistort.c:303
+#: modules/process/polydistort.c:306
 msgid "Y Coefficients"
 msgstr "Y Koeffizienten"
 
-#: modules/process/polydistort.c:499
+#: modules/process/polydistort.c:502
 msgid "Distorted"
 msgstr "Verzerrt"
 
@@ -12782,24 +13430,24 @@ msgstr "Nivellierte Daten"
 msgid "_Horizontal polynom degree:"
 msgstr "Grad des Polynoms _horizontal:"
 
-#: modules/process/polylevel.c:450
+#: modules/process/polylevel.c:451
 msgid "_Vertical polynom degree:"
 msgstr "Grad des Polynoms _vertikal:"
 
-#: modules/process/polylevel.c:456
+#: modules/process/polylevel.c:458
 msgid "_Same degrees"
 msgstr "_Gleiche Grade"
 
-#: modules/process/polylevel.c:474
+#: modules/process/polylevel.c:476
 msgid "_Maximum polynom degree:"
 msgstr "_Maximaler Grad des Polynoms:"
 
-#: modules/process/polylevel.c:561
+#: modules/process/polylevel.c:564
 #, fuzzy
 msgid "Polynomial Coefficients"
 msgstr "X Koeffizienten"
 
-#: modules/process/polylevel.c:934 modules/tools/distance.c:594
+#: modules/process/polylevel.c:937 modules/tools/distance.c:594
 #: modules/tools/selectionmanager.c:720
 msgid "Save Table"
 msgstr ""
@@ -12822,7 +13470,8 @@ msgid "/_Presentation/E_xtract Presentation"
 msgstr "/_Präsentation/Präsentation e_xtrahieren"
 
 #: modules/process/presentationops.c:81
-msgid "Extract presentation to a new channel"
+#, fuzzy
+msgid "Extract presentation to a new image"
 msgstr "Präsentation in neuen Kanal extrahieren"
 
 #: modules/process/presentationops.c:84
@@ -12849,6 +13498,11 @@ msgstr "Präsentation hinzufügen"
 msgid "_Data to attach:"
 msgstr "Hinzuzufügender _Datensatz:"
 
+#: modules/process/preview.h:245
+#, fuzzy
+msgid "Combine with existing mask:"
+msgstr "Projizierte Fläche"
+
 #: modules/process/psdf_logphi.c:76
 #, fuzzy
 msgid ""
@@ -12871,10 +13525,88 @@ msgstr ""
 msgid "Log-Phi PSDF"
 msgstr ""
 
-#: modules/process/psdf_logphi.c:275 modules/process/wpour_mark.c:320
+#: modules/process/psdf_logphi.c:276 modules/process/wpour_mark.c:320
+#, fuzzy
+msgid "Gaussian _smoothing:"
+msgstr "Gauss'sch"
+
+#: modules/process/psf-fit.c:165
+#, fuzzy
+msgid "Gaussian (asymmetric)"
+msgstr "Gauss'sch"
+
+#: modules/process/psf-fit.c:177
+msgid "Point spread function estimation by fitting explicit function form."
+msgstr ""
+
+#: modules/process/psf-fit.c:191
+#, fuzzy
+msgid "/_Statistics/_PSF Fit..."
+msgstr "/_Statistik/_Fraktale Dimension..."
+
+#: modules/process/psf-fit.c:195
+msgid "Fit PSF from known data and image"
+msgstr ""
+
+#: modules/process/psf-fit.c:246 modules/process/psf.c:181
+#: modules/process/psf.c:230
+#, fuzzy
+msgid "PSF"
+msgstr "PSDF"
+
+#: modules/process/psf-fit.c:254 modules/process/psf.c:195
+msgid "PSF*P"
+msgstr ""
+
+#: modules/process/psf-fit.c:271
+#, fuzzy
+msgid "Fit PSF"
+msgstr "Sphäre fitten"
+
+#: modules/process/psf-fit.c:289 modules/process/psf.c:286
+msgid "_Ideal response:"
+msgstr ""
+
+#: modules/process/psf.c:117
+#, fuzzy
+msgid "Point spread function estimation"
+msgstr "Präsentation: Canny Kantenerkennung"
+
+#: modules/process/psf.c:131
+#, fuzzy
+msgid "/_Statistics/_PSF Guess..."
+msgstr "/_Statistik/_Fraktale Dimension..."
+
+#: modules/process/psf.c:135
+msgid "Estimate PSF from known data and image"
+msgstr ""
+
+#: modules/process/psf.c:208
+msgid "PSF*P - I"
+msgstr ""
+
+#: modules/process/psf.c:231
+#, fuzzy
+msgid "Convolved"
+msgstr "_Laplace von Gaussglocke gefaltet"
+
+#: modules/process/psf.c:237
+#, fuzzy
+msgid "Estimate PSF"
+msgstr "_Abschätzung"
+
+#: modules/process/psf.c:238
+msgid "_Fit"
+msgstr ""
+
+#: modules/process/psf.c:295
 #, fuzzy
-msgid "Gaussian _smoothing:"
-msgstr "Gauss'sch"
+msgid "_Display:"
+msgstr "_Anzeige:"
+
+#: modules/process/psf.c:301
+msgid "_Sigma init:"
+msgstr ""
 
 #: modules/process/rank.c:92
 msgid "Enhances local contrast using a rank transform."
@@ -12932,7 +13664,7 @@ msgstr "/_Grundfunktionen/Rotieren um _Winkel..."
 msgid "Rotate by arbitrary angle"
 msgstr "Um beliebigen Winkel rotieren"
 
-#: modules/process/rotate.c:192
+#: modules/process/rotate.c:192 modules/volume/volume_swaxes.c:651
 msgid "Rotated Data"
 msgstr "Rotierter Datensatz"
 
@@ -12995,65 +13727,65 @@ msgstr "Skalierter Datensatz"
 msgid "verb|Scale"
 msgstr "Skalieren"
 
-#: modules/process/scale.c:216
+#: modules/process/scale.c:217
 msgid "Scale by _ratio:"
 msgstr "Skaliere im _Verhältnis:"
 
-#: modules/process/scale.c:224
+#: modules/process/scale.c:225
 msgid "_proportional"
 msgstr "_proportional"
 
-#: modules/process/scale.c:235
+#: modules/process/scale.c:237
 msgid "New _width:"
 msgstr "Neue _Breite:"
 
-#: modules/process/scale.c:243
+#: modules/process/scale.c:246
 msgid "New _height:"
 msgstr "Neue _Höhe:"
 
-#: modules/process/scars.c:113
+#: modules/process/scars.c:122
 #, fuzzy
 msgid "Marks and/or removes scars (horizontal linear artifacts)."
 msgstr ""
 "Markiert und/oder entfernt Fehlerzeilen (horizontale Zeilen-Artefakte)."
 
-#: modules/process/scars.c:127
+#: modules/process/scars.c:136
 msgid "/_Correct Data/M_ark Scars..."
 msgstr "/Ko_rrigieren/_Fehlerzeilen markieren..."
 
-#: modules/process/scars.c:131
+#: modules/process/scars.c:140
 msgid "Mark horizontal scars (strokes)"
 msgstr "Horizontale Fehlerzeilen markieren (Striche, Schmisse)"
 
-#: modules/process/scars.c:134
+#: modules/process/scars.c:143
 msgid "/_Correct Data/Remove _Scars"
 msgstr "/Ko_rrigieren/Fehler_zeilen entfernen"
 
-#: modules/process/scars.c:138
+#: modules/process/scars.c:147
 msgid "Correct horizontal scars (strokes)"
 msgstr "Horizontale Fehlerzeilen (Striche, Schmisse) korrigieren"
 
-#: modules/process/scars.c:293
+#: modules/process/scars.c:312
 msgid "Mark Scars"
 msgstr "Fehlerzeilen markieren"
 
-#: modules/process/scars.c:331
+#: modules/process/scars.c:353
 msgid "Maximum _width:"
 msgstr "Maximale _Breite:"
 
-#: modules/process/scars.c:338
+#: modules/process/scars.c:361
 msgid "Minimum _length:"
 msgstr "Minimale _Länge:"
 
-#: modules/process/scars.c:345
+#: modules/process/scars.c:369
 msgid "_Hard threshold:"
 msgstr "_Harter Schwellwert:"
 
-#: modules/process/scars.c:353
+#: modules/process/scars.c:377
 msgid "_Soft threshold:"
 msgstr "_Weicher Schwellwert:"
 
-#: modules/process/scars.c:361
+#: modules/process/scars.c:385
 msgid "Scars type:"
 msgstr "Fehlzeilen-Typ:"
 
@@ -13100,27 +13832,27 @@ msgstr "_Interpolationstyp:"
 msgid "_Quality:"
 msgstr "/_Beenden"
 
-#: modules/process/shade.c:92
+#: modules/process/shade.c:94
 msgid "Creates a shaded presentation of data."
 msgstr ""
 
-#: modules/process/shade.c:106
+#: modules/process/shade.c:108
 msgid "/_Presentation/_Shading..."
 msgstr "/_Präsentation/_Schattierung..."
 
-#: modules/process/shade.c:110
+#: modules/process/shade.c:112
 msgid "Shade data"
 msgstr "Daten schattieren"
 
-#: modules/process/shade.c:207
+#: modules/process/shade.c:209
 msgid "Shading"
 msgstr "Schattierung"
 
-#: modules/process/shade.c:253
+#: modules/process/shade.c:260
 msgid "_Mix:"
 msgstr ""
 
-#: modules/process/slope_dist.c:161
+#: modules/process/slope_dist.c:160
 #, fuzzy
 msgid ""
 "Calculates one- or two-dimensional distribution of slopes or graph of their "
@@ -13129,85 +13861,139 @@ msgstr ""
 "Berechnet die zweidimensionale Winkelverteilung; das sind die Projektionen "
 "aller Steigungen auf alle Richtungen."
 
-#: modules/process/slope_dist.c:176
+#: modules/process/slope_dist.c:175
 msgid "/_Statistics/_Slope Distribution..."
 msgstr "/_Statistik/_Neigungsgrad-Verteilung"
 
-#: modules/process/slope_dist.c:180
+#: modules/process/slope_dist.c:179
 msgid "Calculate angular slope distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:221
+#: modules/process/slope_dist.c:220
 msgid "Slope distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:253
+#: modules/process/slope_dist.c:252
 msgid "_Two-dimensional distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:254
+#: modules/process/slope_dist.c:253
 msgid "Directional (φ) _graph"
 msgstr ""
 
-#: modules/process/slope_dist.c:255
+#: modules/process/slope_dist.c:254
 msgid "_Inclination (θ) graph"
 msgstr ""
 
-#: modules/process/slope_dist.c:256
+#: modules/process/slope_dist.c:255
 msgid "Inclination (gra_dient) graph"
 msgstr ""
 
-#: modules/process/slope_dist.c:270
+#: modules/process/slope_dist.c:269
 msgid "Slope Distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:755
+#: modules/process/slope_dist.c:749
 msgid "Angular Slope Distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:763 modules/process/tilt.c:179
+#: modules/process/slope_dist.c:757 modules/process/tilt.c:179
 msgid "Slopes"
 msgstr ""
 
-#: modules/process/slope_dist.c:824 modules/process/slope_dist.c:893
+#: modules/process/slope_dist.c:818 modules/process/slope_dist.c:887
 #, fuzzy
 msgid "Inclination Distribution"
 msgstr "Kornverteilungen"
 
-#: modules/process/slope_dist.c:832 modules/process/slope_dist.c:901
+#: modules/process/slope_dist.c:826 modules/process/slope_dist.c:895
 #, fuzzy
 msgid "Inclinations"
 msgstr "Kreuzungen"
 
-#: modules/process/sphere-revolve.c:97
+#: modules/process/sphere-revolve.c:111
 msgid "Subtracts background by arc or sphere revolution."
 msgstr ""
 
-#: modules/process/sphere-revolve.c:113
+#: modules/process/sphere-revolve.c:125
 #, fuzzy
 msgid "/_Level/Revolve _Arc..."
 msgstr "/_Nivellierung/Revolve _Arc"
 
-#: modules/process/sphere-revolve.c:117
+#: modules/process/sphere-revolve.c:129
 msgid "Level data by arc revolution"
 msgstr ""
 
-#: modules/process/sphere-revolve.c:208 modules/tools/sfunctions.c:371
+#: modules/process/sphere-revolve.c:132
+#, fuzzy
+msgid "/_Level/Revolve _Sphere..."
+msgstr "/_Nivellierung/Revolve _Arc"
+
+#: modules/process/sphere-revolve.c:136
+#, fuzzy
+msgid "Level data by sphere revolution"
+msgstr "Daten durch Subtraktion der Mittelwertebene nivellieren"
+
+#: modules/process/sphere-revolve.c:303 modules/tools/sfunctions.c:381
 msgid "_Horizontal direction"
 msgstr "_Horizontal"
 
-#: modules/process/sphere-revolve.c:209 modules/tools/sfunctions.c:372
+#: modules/process/sphere-revolve.c:304 modules/tools/sfunctions.c:382
 msgid "_Vertical direction"
 msgstr "_Vertikal"
 
-#: modules/process/sphere-revolve.c:210
+#: modules/process/sphere-revolve.c:305
 msgid "_Both directions"
 msgstr "_Beide Richtungen"
 
-#: modules/process/sphere-revolve.c:217
+#: modules/process/sphere-revolve.c:315
+#, fuzzy
+msgid "Revolve Sphere"
+msgstr "Fehlstellen entfernen"
+
+#: modules/process/sphere-revolve.c:315
 msgid "Revolve Arc"
 msgstr ""
 
+#: modules/process/sphere-revolve.c:355
+msgid "Direction:"
+msgstr "Richtung:"
+
+#: modules/process/sphere-revolve.c:699
+msgid "Revolving sphere..."
+msgstr ""
+
+#: modules/process/stitch.c:135
+msgid "Stitch multiple images based on offsets of origins."
+msgstr ""
+
+#: modules/process/stitch.c:149
+#, fuzzy
+msgid "/M_ultidata/_Stitch..."
+msgstr "/M_ultidaten/_Arithmetik..."
+
+#: modules/process/stitch.c:153
+msgid "Stitch images using offsets"
+msgstr ""
+
+#: modules/process/stitch.c:269
+msgid "Stitch"
+msgstr ""
+
+#: modules/process/stitch.c:312
+msgid "Channels"
+msgstr "Kanäle"
+
+#: modules/process/stitch.c:435
+#, fuzzy
+msgid "Restore"
+msgstr "Ergebnis-Auflösung:"
+
+#: modules/process/stitch.c:445 modules/tools/linestats.c:379
+#: modules/tools/sfunctions.c:440 modules/tools/stats.c:406
+msgid "_Instant updates"
+msgstr "_Sofort aktualisieren"
+
 #: modules/process/straighten_path.c:126
 msgid "Extracts a straightened part of image along a curve."
 msgstr ""
@@ -13224,31 +14010,31 @@ msgstr ""
 msgid "Straighten Path"
 msgstr ""
 
-#: modules/process/straighten_path.c:254
+#: modules/process/straighten_path.c:253
 #, fuzzy
 msgid "Res_tore"
 msgstr "Ergebnis-Auflösung:"
 
-#: modules/process/straighten_path.c:259
+#: modules/process/straighten_path.c:258
 msgid "Re_verse"
 msgstr ""
 
 #: modules/process/straighten_path.c:278 modules/tools/pathlevel.c:256
-#: modules/tools/profile.c:507 modules/tools/roughness.c:854
+#: modules/tools/profile.c:503 modules/tools/roughness.c:868
 msgid "_Thickness:"
 msgstr ""
 
-#: modules/process/straighten_path.c:286
+#: modules/process/straighten_path.c:287
 #, fuzzy
 msgid "_Slackness:"
 msgstr "Linien_dicke:"
 
-#: modules/process/straighten_path.c:292
+#: modules/process/straighten_path.c:293
 #, fuzzy
 msgid "C_losed curve"
 msgstr "Datei schließen"
 
-#: modules/process/straighten_path.c:379
+#: modules/process/straighten_path.c:380
 msgid "Straightened"
 msgstr ""
 
@@ -13270,55 +14056,54 @@ msgstr ""
 msgid "Supres"
 msgstr ""
 
-#: modules/process/superresolution.c:421
+#: modules/process/superresolution.c:420
 msgid "Correlating to determine mean shift..."
 msgstr ""
 
-#: modules/process/superresolution.c:511
+#: modules/process/superresolution.c:510
 msgid "Cross-correlation..."
 msgstr ""
 
-#: modules/process/superresolution.c:554 modules/xyz/xyz_raster.c:1079
-#: modules/xyz/xyz_raster.c:1119
+#: modules/process/superresolution.c:553 modules/xyz/xyz_raster.c:1053
+#: modules/xyz/xyz_raster.c:1093
 msgid "Interpolating..."
 msgstr "Interpoliere..."
 
-#: modules/process/synth.h:343
+#: modules/process/synth.h:344
 #, fuzzy
 msgid "Roundness"
 msgstr "Rund "
 
-#: modules/process/synth.h:351
+#: modules/process/synth.h:352
 #, fuzzy
 msgid "Roundn_ess:"
 msgstr "Rund "
 
-#: modules/process/synth.h:399
+#: modules/process/synth.h:401
 msgid "Orientation"
 msgstr "Orientierung"
 
-#: modules/process/synth.h:408
+#: modules/process/synth.h:410
 msgid "Orien_tation:"
 msgstr "Orien_tierung:"
 
-#: modules/process/synth.h:432
+#: modules/process/synth.h:436
+msgid "_Truncate:"
+msgstr ""
+
+#: modules/process/synth.h:460
 msgid "Variance:"
 msgstr "Varianz:"
 
-#: modules/process/synth.h:456
-#, fuzzy
-msgid "Deformation"
-msgstr "_Operator:"
-
-#: modules/process/synth.h:464
+#: modules/process/synth.h:493
 msgid "_Amplitude:"
 msgstr ""
 
-#: modules/process/synth.h:472
+#: modules/process/synth.h:501
 msgid "_Lateral scale:"
 msgstr "_Laterale Skala:"
 
-#: modules/process/synth.h:566
+#: modules/process/synth.h:595
 #, fuzzy
 msgid "Randomi_ze"
 msgstr "Fenstergröße"
@@ -13336,43 +14121,43 @@ msgstr "/_Grundfunktionen/_Bereich einschränken..."
 msgid "Limit data range"
 msgstr "Fehlerzeilen markieren"
 
-#: modules/process/threshold.c:246
+#: modules/process/threshold.c:241
 msgid "Limit Range"
 msgstr "Bereich einschränken"
 
-#: modules/process/threshold.c:281
+#: modules/process/threshold.c:276
 #, fuzzy
 msgid "Specify _thresholds"
 msgstr "_Weicher Schwellwert:"
 
-#: modules/process/threshold.c:283
+#: modules/process/threshold.c:278
 msgid "Use _display range"
 msgstr ""
 
-#: modules/process/threshold.c:285
+#: modules/process/threshold.c:280
 #, fuzzy
 msgid "Cut off outlier_s"
 msgstr "Erzeugt Maske üver Ausreißern"
 
-#: modules/process/threshold.c:294
+#: modules/process/threshold.c:289
 msgid "_Lower:"
 msgstr ""
 
-#: modules/process/threshold.c:300
+#: modules/process/threshold.c:295
 msgid "_Upper:"
 msgstr ""
 
-#: modules/process/threshold.c:305
+#: modules/process/threshold.c:300
 msgid "Set to _Full Range"
 msgstr ""
 
 #. TRANSLATORS: This is a range: 123 to 456.
-#: modules/process/threshold.c:318
+#: modules/process/threshold.c:313
 #, c-format
 msgid "%.*f to %.*f"
 msgstr ""
 
-#: modules/process/threshold.c:341
+#: modules/process/threshold.c:336
 #, fuzzy
 msgid "F_arther than:"
 msgstr "Kleiner als"
@@ -13394,11 +14179,11 @@ msgstr "Um "
 msgid "Tilt"
 msgstr "Verkippen"
 
-#: modules/process/tilt.c:185 modules/volume/volume_slice.c:444
+#: modules/process/tilt.c:185 modules/volume/volume_slice.c:446
 msgid "_X:"
 msgstr "_X:"
 
-#: modules/process/tilt.c:194 modules/volume/volume_slice.c:464
+#: modules/process/tilt.c:194 modules/volume/volume_slice.c:469
 msgid "_Y:"
 msgstr "_Y:"
 
@@ -13406,32 +14191,32 @@ msgstr "_Y:"
 msgid "Angles"
 msgstr "Winkel"
 
-#: modules/process/tip_blind.c:178
+#: modules/process/tip_blind.c:177
 msgid "Blind estimation of SPM tip using Villarubia's algorithm."
 msgstr ""
 
-#: modules/process/tip_blind.c:192
+#: modules/process/tip_blind.c:191
 #, fuzzy
 msgid "/_Tip and Indentation/_Blind Estimation..."
 msgstr "/Spi_tze/_Blinde Abschätzung..."
 
-#: modules/process/tip_blind.c:196
+#: modules/process/tip_blind.c:195
 msgid "Blind tip estimation"
 msgstr ""
 
-#: modules/process/tip_blind.c:231
+#: modules/process/tip_blind.c:230
 msgid "Blind Tip Estimation"
 msgstr ""
 
-#: modules/process/tip_blind.c:232
+#: modules/process/tip_blind.c:231
 msgid "Run _Partial"
 msgstr ""
 
-#: modules/process/tip_blind.c:233
+#: modules/process/tip_blind.c:232
 msgid "Run _Full"
 msgstr ""
 
-#: modules/process/tip_blind.c:234
+#: modules/process/tip_blind.c:233
 msgid "_Reset Tip"
 msgstr ""
 
@@ -13439,82 +14224,82 @@ msgstr ""
 msgid "Related _data:"
 msgstr ""
 
-#: modules/process/tip_blind.c:326
+#: modules/process/tip_blind.c:327
 msgid "Estimated Tip Size"
 msgstr ""
 
-#: modules/process/tip_blind.c:347
+#: modules/process/tip_blind.c:350
 msgid "_Same resolution"
 msgstr ""
 
-#: modules/process/tip_blind.c:366
+#: modules/process/tip_blind.c:376
 msgid "Noise suppression t_hreshold:"
 msgstr ""
 
-#: modules/process/tip_blind.c:386
+#: modules/process/tip_blind.c:384
 msgid "Use _boundaries"
 msgstr ""
 
-#: modules/process/tip_blind.c:396
+#: modules/process/tip_blind.c:395
 msgid "Stripes"
 msgstr ""
 
-#: modules/process/tip_blind.c:402
+#: modules/process/tip_blind.c:401
 msgid "_Split to stripes:"
 msgstr ""
 
-#: modules/process/tip_blind.c:416
+#: modules/process/tip_blind.c:412
 #, fuzzy
 msgid "_Preview stripe:"
 msgstr "Vorschautyp:"
 
-#: modules/process/tip_blind.c:423
+#: modules/process/tip_blind.c:420
 #, fuzzy
 msgid "Plot size _graph"
 msgstr "Drift-Graph zeichnen"
 
-#: modules/process/tip_blind.c:433
+#: modules/process/tip_blind.c:430
 #, fuzzy
 msgid "Create tip i_mages"
 msgstr "Zwei Bilder zusammenführen"
 
 #. TRANSLATORS: Prefix for the progressbar message.
-#: modules/process/tip_blind.c:810
+#: modules/process/tip_blind.c:807
 #, c-format
 msgid "Stripe %u: "
 msgstr ""
 
-#: modules/process/tip_blind.c:917 modules/process/tip_blind.c:941
+#: modules/process/tip_blind.c:914 modules/process/tip_blind.c:938
 msgid "Estimated tip"
 msgstr ""
 
-#: modules/process/tip_blind.c:1207 modules/process/tip_blind.c:1216
+#: modules/process/tip_blind.c:1204 modules/process/tip_blind.c:1213
 #, fuzzy
 msgid "Tip radius evolution"
 msgstr "Spitzendilatation"
 
-#: modules/process/tip_model.c:114
+#: modules/process/tip_model.c:112
 msgid "Models SPM tip."
 msgstr ""
 
-#: modules/process/tip_model.c:129
+#: modules/process/tip_model.c:127
 #, fuzzy
 msgid "/_Tip and Indentation/_Model Tip..."
 msgstr "/Spi_tze/Spitze _modellieren..."
 
-#: modules/process/tip_model.c:133
+#: modules/process/tip_model.c:131
 msgid "Model AFM tip"
 msgstr ""
 
-#: modules/process/tip_model.c:164
+#: modules/process/tip_model.c:162
 msgid "Model Tip"
 msgstr ""
 
-#: modules/process/tip_model.c:224
+#: modules/process/tip_model.c:222
 msgid "Tip _type:"
 msgstr "Spitzen_typ:"
 
-#: modules/process/tip_model.c:229
+#: modules/process/tip_model.c:228
 msgid "_Number of sides:"
 msgstr ""
 
@@ -13526,21 +14311,21 @@ msgstr "Spitzen_neigung:"
 msgid "Tip _rotation:"
 msgstr "Spitzen_rotation:"
 
-#: modules/process/tip_model.c:250
+#: modules/process/tip_model.c:255
 msgid "Tip _apex radius:"
 msgstr ""
 
-#: modules/process/tip_model.c:269
+#: modules/process/tip_model.c:265
 #, fuzzy
 msgid "Tip _anisotropy:"
 msgstr "DWT Anisotropie"
 
-#: modules/process/tip_model.c:490
+#: modules/process/tip_model.c:484
 #, fuzzy
 msgid "Modeled tip"
 msgstr "Modus"
 
-#: modules/process/tip_model.c:562
+#: modules/process/tip_model.c:556
 #, c-format
 msgid "Tip resolution: %d × %d pixels"
 msgstr "Auflösung der Spitze: %d × %d Pixel"
@@ -13652,7 +14437,7 @@ msgstr ""
 
 #: modules/process/volumize.c:56
 #, fuzzy
-msgid "/_Basic Operations/Volumize..."
+msgid "/_Basic Operations/Volumize"
 msgstr "/_Grundfunktionen/_Skalieren..."
 
 #: modules/process/volumize.c:60
@@ -13701,84 +14486,88 @@ msgstr "Auflösung"
 msgid "Z _range:"
 msgstr "_X-Bereich:"
 
-#: modules/process/wave_synth.c:211
+#: modules/process/wave_synth.c:219
 msgid "Generates various kinds of waves."
 msgstr ""
 
-#: modules/process/wave_synth.c:225
+#: modules/process/wave_synth.c:233
 #, fuzzy
 msgid "/S_ynthetic/_Waves..."
 msgstr "/S_ynthetisch/_Partikel..."
 
-#: modules/process/wave_synth.c:229
+#: modules/process/wave_synth.c:237
 #, fuzzy
 msgid "Generate waves"
 msgstr "Relative Linien"
 
-#: modules/process/wave_synth.c:347
+#: modules/process/wave_synth.c:366
 msgid "Waves"
 msgstr ""
 
-#: modules/process/wave_synth.c:422 modules/tools/linestats.c:337
-#: modules/tools/sfunctions.c:401 modules/volume/volume_linestat.c:369
+#: modules/process/wave_synth.c:441 modules/tools/linestats.c:337
+#: modules/tools/sfunctions.c:411 modules/volume/volume_linestat.c:374
 #, fuzzy
 msgid "_Quantity:"
 msgstr "/_Beenden"
 
-#: modules/process/wave_synth.c:429
+#: modules/process/wave_synth.c:448
 #, fuzzy
 msgid "_Number of waves:"
 msgstr "A_nzahl an Schritten:"
 
-#: modules/process/wave_synth.c:436 modules/process/wave_synth.c:582
-#: modules/tools/roughness.c:274
+#: modules/process/wave_synth.c:455 modules/process/wave_synth.c:617
+#: modules/tools/roughness.c:275
 msgid "Amplitude"
 msgstr "Amplitude"
 
-#: modules/process/wave_synth.c:441
+#: modules/process/wave_synth.c:460
 #, fuzzy
 msgid "_Wave form:"
 msgstr "Hinzuzufügender _Datensatz:"
 
-#: modules/process/wave_synth.c:448
+#: modules/process/wave_synth.c:467
 #, fuzzy
 msgid "Amplitude:"
 msgstr "Amplitude"
 
-#: modules/process/wave_synth.c:466
+#: modules/process/wave_synth.c:487
+msgid "_Decay:"
+msgstr ""
+
+#: modules/process/wave_synth.c:497
 msgid "Frequency"
 msgstr ""
 
-#: modules/process/wave_synth.c:472
+#: modules/process/wave_synth.c:503
 #, fuzzy
 msgid "_Spatial frequency:"
 msgstr "Minimale _Länge:"
 
-#: modules/process/wave_synth.c:488
+#: modules/process/wave_synth.c:519
 #, fuzzy
 msgid "_X center:"
 msgstr "X Zentrum"
 
-#: modules/process/wave_synth.c:499
+#: modules/process/wave_synth.c:532
 #, fuzzy
 msgid "_Y center:"
 msgstr "Y Zentrum"
 
-#: modules/process/wave_synth.c:565
+#: modules/process/wave_synth.c:600
 msgid "Cosine"
 msgstr ""
 
-#: modules/process/wave_synth.c:566
+#: modules/process/wave_synth.c:601
 #, fuzzy
 msgid "Inverse cosh"
 msgstr "Schnittpunkte"
 
-#: modules/process/wave_synth.c:567
+#: modules/process/wave_synth.c:602
 #, fuzzy
 msgid "Flat top"
 msgstr "Suchbereich _Breite:"
 
-#: modules/process/wave_synth.c:581
+#: modules/process/wave_synth.c:616
 #, fuzzy
 msgid "Displacement"
 msgstr "_Anzeige:"
@@ -13877,41 +14666,41 @@ msgstr "Zusammengefügte Bilder"
 msgid "Preprocess and mark"
 msgstr ""
 
-#: modules/process/xydenoise.c:57
+#: modules/process/xydenoise.c:58
 msgid "Denoises measurement on basis of two orthogonal scans."
 msgstr ""
 
-#: modules/process/xydenoise.c:71
+#: modules/process/xydenoise.c:72
 #, fuzzy
 msgid "/M_ultidata/_XY denoise..."
 msgstr "/M_ultidaten/Zusa_mmenführen..."
 
-#: modules/process/xydenoise.c:75
+#: modules/process/xydenoise.c:76
 msgid "Denoises horizontal/vertical measurement."
 msgstr ""
 
-#: modules/process/xydenoise.c:102
+#: modules/process/xydenoise.c:103
 msgid "XY Denoising"
 msgstr ""
 
-#: modules/process/xydenoise.c:124
+#: modules/process/xydenoise.c:125
 #, fuzzy
 msgid "Second direction:"
 msgstr "_Vertikal"
 
-#: modules/process/xydenoise.c:232
+#: modules/process/xydenoise.c:233
 msgid "Computing forward FFTs..."
 msgstr ""
 
-#: modules/process/xydenoise.c:248
+#: modules/process/xydenoise.c:249
 msgid "Computing image..."
 msgstr ""
 
-#: modules/process/xydenoise.c:260
+#: modules/process/xydenoise.c:261
 msgid "Computing backward FFT..."
 msgstr ""
 
-#: modules/process/xydenoise.c:272
+#: modules/process/xydenoise.c:273
 msgid "Denoised"
 msgstr ""
 
@@ -13929,63 +14718,70 @@ msgstr "/_Grundfunktionen/_Verkippen..."
 msgid "Convert to XYZ data"
 msgstr "XYZ-Daten importieren"
 
-#: modules/pygwy/pygwy-console.c:55
+#: modules/pygwy/pygwy-console.c:99
 msgid "/Pygwy Console"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:59
+#: modules/pygwy/pygwy-console.c:103
 msgid "Python wrapper console"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:142
-msgid ">>> Running the script above\n"
-msgstr ""
-
-#: modules/pygwy/pygwy-console.c:194
-msgid "Open Python script"
-msgstr "Python-Skript öffnen"
-
-#: modules/pygwy/pygwy-console.c:275
-msgid "Save Script as"
-msgstr "Skript speichern als"
-
-#: modules/pygwy/pygwy-console.c:327
+#: modules/pygwy/pygwy-console.c:168 modules/pygwy/pygwy-console.c:481
 msgid "Pygwy Console"
 msgstr "Pygwy-Konsole"
 
-#: modules/pygwy/pygwy-console.c:340
-msgid "Clear Log"
-msgstr ""
-
-#: modules/pygwy/pygwy-console.c:344
+#: modules/pygwy/pygwy-console.c:187
 msgid "Open script in Python language (Ctrl-O)"
 msgstr "Python-Skript öffnen (Strg-O)"
 
-#: modules/pygwy/pygwy-console.c:346
+#: modules/pygwy/pygwy-console.c:197
 msgid "Save script (Ctrl-S)"
 msgstr "Skript speichern (Strg-S)"
 
-#: modules/pygwy/pygwy-console.c:348
+#: modules/pygwy/pygwy-console.c:207
+#, fuzzy
+msgid "Save script as (Ctrl-Shift-S)"
+msgstr "Skript speichern (Strg-S)"
+
+#: modules/pygwy/pygwy-console.c:217
 msgid "Execute script (Ctrl-E)"
 msgstr "Skript ausführen (Strg-E)"
 
-#: modules/pygwy/pygwy-console.c:426
+#: modules/pygwy/pygwy-console.c:227
+msgid "Clear Log"
+msgstr ""
+
+#: modules/pygwy/pygwy-console.c:285
 msgid "Command"
 msgstr ""
 
-#: pygwy.c:120
+#: modules/pygwy/pygwy-console.c:371
+msgid ">>> Running the script above\n"
+msgstr ""
+
+#: modules/pygwy/pygwy-console.c:425
+#, fuzzy
+msgid "Save Python Script as"
+msgstr "Skript speichern als"
+
+#: modules/pygwy/pygwy-console.c:429
+#, fuzzy
+msgid "Open Python Script"
+msgstr "Python-Skript öffnen"
+
+#: pygwy.c:130
 msgid "Pygwy, the Gwyddion Python wrapper."
 msgstr ""
 
-#: pygwy.c:258
+#: pygwy.c:269
 msgid "Python Interpreter Errors"
 msgstr ""
 
-#: pygwy.c:384
+#: pygwy.c:399
 msgid "Python interpreter error occurred."
 msgstr ""
 
-#: pygwy.c:459
+#: pygwy.c:499
 msgid "Function written in Python"
 msgstr "In Python geschriebene Funktion"
 
@@ -14010,38 +14806,38 @@ msgid "Measure distances and directions between points"
 msgstr "Abstände und Richtungen zwischen Punkten messen"
 
 #. TRANSLATORS: Number is verb here.
-#: modules/tools/distance.c:250 modules/tools/profile.c:532
+#: modules/tools/distance.c:250 modules/tools/profile.c:527
 #, fuzzy
 msgid "_Number lines"
 msgstr "A_nzahl an Schritten:"
 
-#: modules/tools/filter.c:128
+#: modules/tools/filter.c:129
 msgid ""
 "Filter tool, processes selected part of data with a filter (conservative "
 "denoise, mean, median. Kuwahara, minimum, maximum)."
 msgstr ""
 
-#: modules/tools/filter.c:171
+#: modules/tools/filter.c:172
 msgid "Basic filters: mean, median, denoise, …"
 msgstr "Einfache Filter: Mittelwert, Median, Rauschunterdrückung, ..."
 
-#: modules/tools/filter.c:239
+#: modules/tools/filter.c:240
 msgid "Conservative denoise"
 msgstr "Konservative Rauschunterdrückung"
 
-#: modules/tools/filter.c:246
+#: modules/tools/filter.c:247
 msgid "Kuwahara"
 msgstr "Kuwahara"
 
-#: modules/tools/filter.c:247
+#: modules/tools/filter.c:248
 msgid "Dechecker"
 msgstr ""
 
-#: modules/tools/filter.c:248
+#: modules/tools/filter.c:249
 msgid "filter|Gaussian"
 msgstr "Gauß"
 
-#: modules/tools/filter.c:249
+#: modules/tools/filter.c:250
 msgid "Sharpen"
 msgstr ""
 
@@ -14133,7 +14929,7 @@ msgid "Height histogram"
 msgstr "Höhen-Histogramm"
 
 #: modules/tools/icolorange.c:329 modules/tools/linestats.c:169
-#: modules/tools/sfunctions.c:226 modules/volume/volume_linestat.c:146
+#: modules/tools/sfunctions.c:231 modules/volume/volume_linestat.c:148
 msgid "Range"
 msgstr "Bereich"
 
@@ -14164,29 +14960,29 @@ msgstr "Höhe _invertieren"
 msgid "range|Full"
 msgstr "bis"
 
-#: modules/tools/level3.c:106
+#: modules/tools/level3.c:108
 msgid ""
 "Three-point level tool, levels data by subtracting a plane fitted through "
 "three selected points."
 msgstr ""
 
-#: modules/tools/level3.c:143
+#: modules/tools/level3.c:145
 msgid "Three Point Level"
 msgstr ""
 
-#: modules/tools/level3.c:144
+#: modules/tools/level3.c:146
 msgid "Level data by fitting a plane through three points"
 msgstr "Daten mittels Ebene durch drei Punkte nivellieren"
 
-#: modules/tools/level3.c:239 modules/tools/readvalue.c:375
+#: modules/tools/level3.c:244 modules/tools/readvalue.c:378
 msgid "_Averaging radius:"
 msgstr ""
 
-#: modules/tools/level3.c:246
+#: modules/tools/level3.c:251
 msgid "_Instant apply"
 msgstr ""
 
-#: modules/tools/level3.c:255
+#: modules/tools/level3.c:261
 #, fuzzy
 msgid "Set plane to _zero"
 msgstr "_Punktgröße:"
@@ -14197,24 +14993,24 @@ msgid ""
 "RMS, ..., of rows or columns."
 msgstr ""
 
-#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:148
+#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:150
 msgid "tan β<sub>0</sub>"
 msgstr "tan β<sub>0</sub>"
 
-#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:150
+#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:152
 #, fuzzy
 msgid "Ra"
 msgstr "Realteil"
 
-#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:151
+#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:153
 msgid "Rq (RMS)"
 msgstr "Rq (RMS)"
 
-#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:152
+#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:154
 msgid "Rz"
 msgstr "Rz"
 
-#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:153
+#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:155
 #, fuzzy
 msgid "Rt"
 msgstr "Rect"
@@ -14240,16 +15036,11 @@ msgstr "Spa_lten"
 msgid "Average:"
 msgstr "_Minimalwert"
 
-#: modules/tools/linestats.c:363 modules/tools/profile.c:464
-#: modules/tools/sfunctions.c:414 modules/tools/spectro.c:343
+#: modules/tools/linestats.c:363 modules/tools/profile.c:460
+#: modules/tools/sfunctions.c:424 modules/tools/spectro.c:346
 msgid "<b>Options</b>"
 msgstr "<b>Optionen</b>"
 
-#: modules/tools/linestats.c:379 modules/tools/sfunctions.c:430
-#: modules/tools/stats.c:408
-msgid "_Instant updates"
-msgstr "_Sofort aktualisieren"
-
 #: modules/tools/maskedit.c:170
 msgid "Mask editor tool, allows interactive modification of parts of the mask."
 msgstr ""
@@ -14308,64 +15099,64 @@ msgstr "Bestimmt Kornverteilungen (Zusammenhängende maskierte Bereiche)."
 msgid "Erase continuous parts of mask"
 msgstr "Bestimmt Kornverteilungen (Zusammenhängende maskierte Bereiche)."
 
-#: modules/tools/maskedit.c:408
+#: modules/tools/maskedit.c:409
 msgid "Editor"
 msgstr "Editor"
 
-#: modules/tools/maskedit.c:413
+#: modules/tools/maskedit.c:414
 msgid "_Shapes"
 msgstr "_Formen"
 
-#: modules/tools/maskedit.c:423
+#: modules/tools/maskedit.c:428
 msgid "Mode:"
 msgstr "Modus:"
 
-#: modules/tools/maskedit.c:452
+#: modules/tools/maskedit.c:458
 msgid "Shape:"
 msgstr "Form:"
 
-#: modules/tools/maskedit.c:483
+#: modules/tools/maskedit.c:486
 msgid "_Drawing Tools"
 msgstr ""
 
-#: modules/tools/maskedit.c:493
+#: modules/tools/maskedit.c:500
 msgid "Tool:"
 msgstr "Werkzeug:"
 
-#: modules/tools/maskedit.c:532
+#: modules/tools/maskedit.c:538
 #, fuzzy
 msgid "Actions"
 msgstr "Kreuzungen"
 
-#: modules/tools/maskedit.c:540
+#: modules/tools/maskedit.c:546
 msgid "_Invert"
 msgstr "_Invertieren"
 
-#: modules/tools/maskedit.c:571
+#: modules/tools/maskedit.c:577
 msgid "Fill _Voids"
 msgstr ""
 
-#: modules/tools/maskedit.c:580
+#: modules/tools/maskedit.c:586
 msgid "Fill non-simple-connected"
 msgstr ""
 
-#: modules/tools/maskedit.c:591
+#: modules/tools/maskedit.c:597
 msgid "Grow/Shrink"
 msgstr ""
 
-#: modules/tools/maskedit.c:600
+#: modules/tools/maskedit.c:606
 msgid "_Grow"
 msgstr ""
 
-#: modules/tools/maskedit.c:608
+#: modules/tools/maskedit.c:614
 msgid "Shrin_k"
 msgstr ""
 
-#: modules/tools/maskedit.c:623
+#: modules/tools/maskedit.c:629
 msgid "_Amount:"
 msgstr ""
 
-#: modules/tools/maskedit.c:651
+#: modules/tools/maskedit.c:657
 msgid "_Prevent grain merging by growing"
 msgstr ""
 
@@ -14382,87 +15173,102 @@ msgstr "Ebene nivellieren"
 msgid "Level rows using intersections with given lines"
 msgstr ""
 
-#: modules/tools/profile.c:222
+#: modules/tools/profile.c:216
 msgid "Profile tool, creates profile graphs from selected lines."
 msgstr ""
 
-#: modules/tools/profile.c:276 modules/tools/profile.c:630
+#: modules/tools/profile.c:270 modules/tools/profile.c:609
 msgid "Profiles"
 msgstr "Profile"
 
-#: modules/tools/profile.c:277
+#: modules/tools/profile.c:271
 msgid "Extract profiles"
 msgstr "Profile extrahieren"
 
-#: modules/tools/profile.c:480
-#, fuzzy
-msgid "_Radial profiles"
-msgstr "Profile extrahieren"
-
-#: modules/tools/profile.c:493
+#: modules/tools/profile.c:478
 #, fuzzy
-msgid "Symmetrize _All"
-msgstr "Symmetrie"
+msgid "Linear profiles"
+msgstr "Linearer Fit"
 
-#: modules/tools/profile.c:498
+#: modules/tools/profile.c:480
 #, fuzzy
-msgid "S_ymmetrize"
-msgstr "Symmetrie"
+msgid "Radial profiles"
+msgstr "Profile extrahieren"
 
-#: modules/tools/profile.c:542
+#: modules/tools/profile.c:537
 msgid "_Separate profiles"
 msgstr ""
 
-#: modules/tools/profile.c:607
+#: modules/tools/profile.c:587
 msgid "_Calibration data:"
 msgstr ""
 
-#: modules/tools/profile.c:620
+#: modules/tools/profile.c:600
 #, fuzzy
 msgid "_Show profile"
 msgstr "Profil 1"
 
-#: modules/tools/profile.c:887
+#: modules/tools/profile.c:861
 #, c-format
 msgid "X error %d"
 msgstr "X-Fehler %d"
 
-#: modules/tools/profile.c:891
+#: modules/tools/profile.c:865
 #, c-format
 msgid "Y error %d"
 msgstr "Y-Fehler %d"
 
-#: modules/tools/profile.c:895
+#: modules/tools/profile.c:869
 #, c-format
 msgid "Z error %d"
 msgstr "Z-Fehler %d"
 
-#: modules/tools/profile.c:899
+#: modules/tools/profile.c:873
 #, fuzzy, c-format
 msgid "X uncertainty %d"
 msgstr "Bestimmtheitskarte"
 
-#: modules/tools/profile.c:903
+#: modules/tools/profile.c:877
 #, fuzzy, c-format
 msgid "Y uncertainty %d"
 msgstr "Bestimmtheitskarte"
 
-#: modules/tools/profile.c:907
+#: modules/tools/profile.c:881
 #, fuzzy, c-format
 msgid "Z uncertainty %d"
 msgstr "Bestimmtheitskarte"
 
-#: modules/tools/profile.c:912
+#: modules/tools/profile.c:886
 #, c-format
 msgid "Zunc up bound %d"
 msgstr ""
 
-#: modules/tools/profile.c:917
+#: modules/tools/profile.c:891
 #, c-format
 msgid "Zunc low bound %d"
 msgstr ""
 
-#: modules/tools/profile.c:1817
+#: modules/tools/profile.c:1637
+#, fuzzy
+msgid "S_ymmetrize"
+msgstr "Symmetrie"
+
+#: modules/tools/profile.c:1639
+#, fuzzy
+msgid "Symmetrize _All"
+msgstr "Symmetrie"
+
+#: modules/tools/profile.c:1643
+#, fuzzy
+msgid "Improve _Direction"
+msgstr "_Richtung:"
+
+#: modules/tools/profile.c:1645
+#, fuzzy
+msgid "Improve _All"
+msgstr "Ver_bessern"
+
+#: modules/tools/profile.c:1866
 #, fuzzy
 msgid "calib-data|None"
 msgstr "Kalibrierungen"
@@ -14479,196 +15285,196 @@ msgstr "Wert auslesen"
 msgid "Read value under mouse cursor"
 msgstr "Wert unter dem Mauszeiger auslesen"
 
-#: modules/tools/readvalue.c:304
+#: modules/tools/readvalue.c:307
 msgid "Set _Zero"
 msgstr "Auf _Null setzen"
 
-#: modules/tools/readvalue.c:307
+#: modules/tools/readvalue.c:310
 msgid "Shift plane z=0 to pass through the selected point"
 msgstr ""
 
-#: modules/tools/readvalue.c:315
+#: modules/tools/readvalue.c:318
 msgid "Facet"
 msgstr "Facette"
 
-#: modules/tools/readvalue.c:340
+#: modules/tools/readvalue.c:343
 #, fuzzy
 msgid "Curvatures"
 msgstr "Krümmung"
 
-#: modules/tools/readvalue.c:382
+#: modules/tools/readvalue.c:386
 msgid "Show _selection"
 msgstr "Auswahl zeigen"
 
-#: modules/tools/roughness.c:282
+#: modules/tools/roughness.c:283
 msgid "Roughness average"
 msgstr ""
 
-#: modules/tools/roughness.c:290
+#: modules/tools/roughness.c:291
 msgid "Root mean square roughness"
 msgstr ""
 
-#: modules/tools/roughness.c:298
+#: modules/tools/roughness.c:299
 msgid "Maximum height of the roughness"
 msgstr ""
 
-#: modules/tools/roughness.c:306
+#: modules/tools/roughness.c:307
 msgid "Maximum roughness valley depth"
 msgstr ""
 
-#: modules/tools/roughness.c:314
+#: modules/tools/roughness.c:315
 msgid "Maximum roughness peak height"
 msgstr ""
 
-#: modules/tools/roughness.c:322 modules/tools/roughness.c:370
+#: modules/tools/roughness.c:323 modules/tools/roughness.c:371
 msgid "Average maximum height of the roughness"
 msgstr ""
 
-#: modules/tools/roughness.c:330
+#: modules/tools/roughness.c:331
 msgid "Average maximum roughness valley depth"
 msgstr ""
 
-#: modules/tools/roughness.c:338
+#: modules/tools/roughness.c:339
 msgid "Average maximum roughness peak height"
 msgstr ""
 
-#: modules/tools/roughness.c:346 modules/tools/roughness.c:354
+#: modules/tools/roughness.c:347 modules/tools/roughness.c:355
 msgid "Average third highest peak to third lowest valley height"
 msgstr ""
 
-#: modules/tools/roughness.c:362
+#: modules/tools/roughness.c:363
 msgid "Average maximum height of the profile"
 msgstr ""
 
-#: modules/tools/roughness.c:378
+#: modules/tools/roughness.c:379
 msgid "Skewness"
 msgstr ""
 
-#: modules/tools/roughness.c:394
+#: modules/tools/roughness.c:395
 msgid "Waviness average"
 msgstr ""
 
-#: modules/tools/roughness.c:402
+#: modules/tools/roughness.c:403
 msgid "Root mean square waviness"
 msgstr ""
 
-#: modules/tools/roughness.c:410
+#: modules/tools/roughness.c:411
 msgid "Waviness maximum height"
 msgstr ""
 
-#: modules/tools/roughness.c:418
+#: modules/tools/roughness.c:419
 msgid "Maximum height of the profile"
 msgstr ""
 
-#: modules/tools/roughness.c:426
+#: modules/tools/roughness.c:427
 msgid "Spatial"
 msgstr ""
 
-#: modules/tools/roughness.c:476
+#: modules/tools/roughness.c:477
 msgid "Average wavelength of the profile"
 msgstr ""
 
-#: modules/tools/roughness.c:484
+#: modules/tools/roughness.c:485
 msgid "Root mean square (RMS) wavelength of the profile"
 msgstr ""
 
-#: modules/tools/roughness.c:492
+#: modules/tools/roughness.c:493
 msgid "Hybrid"
 msgstr ""
 
-#: modules/tools/roughness.c:500
+#: modules/tools/roughness.c:501
 msgid "Average absolute slope"
 msgstr ""
 
-#: modules/tools/roughness.c:508
+#: modules/tools/roughness.c:509
 msgid "Root mean square (RMS) slope"
 msgstr ""
 
-#: modules/tools/roughness.c:524
+#: modules/tools/roughness.c:525
 msgid "Developed profile length"
 msgstr ""
 
-#: modules/tools/roughness.c:532
+#: modules/tools/roughness.c:533
 msgid "Profile length ratio"
 msgstr ""
 
-#: modules/tools/roughness.c:615
+#: modules/tools/roughness.c:616
 msgid "Calculate surface profile parameters."
 msgstr ""
 
-#: modules/tools/roughness.c:648 modules/tools/roughness.c:773
-#: modules/tools/roughness.c:1452
+#: modules/tools/roughness.c:649 modules/tools/roughness.c:774
+#: modules/tools/roughness.c:1479
 msgid "Roughness"
 msgstr "Rauigkeit"
 
-#: modules/tools/roughness.c:649
+#: modules/tools/roughness.c:650
 msgid "Calculate roughness parameters"
 msgstr "Rauigkeits-Parameter berechnen"
 
-#: modules/tools/roughness.c:771 modules/tools/roughness.c:1450
+#: modules/tools/roughness.c:772 modules/tools/roughness.c:1477
 msgid "Texture"
 msgstr ""
 
-#: modules/tools/roughness.c:772 modules/tools/roughness.c:1451
+#: modules/tools/roughness.c:773 modules/tools/roughness.c:1478
 msgid "Waviness"
 msgstr ""
 
-#: modules/tools/roughness.c:774
+#: modules/tools/roughness.c:775
 msgid "ADF"
 msgstr "ADF"
 
-#: modules/tools/roughness.c:775
+#: modules/tools/roughness.c:776
 msgid "BRC"
 msgstr "BRC"
 
-#: modules/tools/roughness.c:776 modules/tools/roughness.c:1455
+#: modules/tools/roughness.c:777 modules/tools/roughness.c:1482
 msgid "Peak Count"
 msgstr ""
 
-#: modules/tools/roughness.c:838 modules/xyz/xyz_drift.c:1090
+#: modules/tools/roughness.c:839 modules/xyz/xyz_drift.c:1090
 msgid "_Graph:"
 msgstr "_Graph:"
 
-#: modules/tools/roughness.c:845
+#: modules/tools/roughness.c:847
 msgid "C_ut-off:"
 msgstr ""
 
-#: modules/tools/roughness.c:1324
+#: modules/tools/roughness.c:1345
 msgid "No profile selected."
 msgstr ""
 
-#: modules/tools/roughness.c:1453
+#: modules/tools/roughness.c:1480
 #, fuzzy
 msgid "Amplitude Distribution Function"
 msgstr "Winkelverteilung"
 
-#: modules/tools/roughness.c:1454
+#: modules/tools/roughness.c:1481
 msgid "The Bearing Ratio Curve"
 msgstr ""
 
-#: modules/tools/roughness.c:1489
+#: modules/tools/roughness.c:1516
 msgid "Surface Profiles"
 msgstr ""
 
-#: modules/tools/roughness.c:1877
+#: modules/tools/roughness.c:1904
 msgid "Save Roughness Parameters"
 msgstr "Rauigkeits-Parameter speichern"
 
-#: modules/tools/roughness.c:1934
+#: modules/tools/roughness.c:1961
 msgid "Roughness Parameters"
 msgstr "Rauigkeits-Parameter"
 
-#: modules/tools/roughness.c:1940
+#: modules/tools/roughness.c:1967
 #, c-format
 msgid "File:              %s\n"
 msgstr "Datei:              %s\n"
 
-#: modules/tools/roughness.c:1944
+#: modules/tools/roughness.c:1971
 #, c-format
 msgid "Data channel:      %s\n"
 msgstr ""
 
-#: modules/tools/roughness.c:1975
+#: modules/tools/roughness.c:2002
 #, c-format
 msgid ""
 "Selected line:     (%s, %s) to (%s, %s) px\n"
@@ -14706,94 +15512,98 @@ msgstr ""
 msgid "_Copy"
 msgstr ""
 
-#: modules/tools/sfunctions.c:181
+#: modules/tools/sfunctions.c:186
 msgid ""
 "Statistical function tool, calculates one-dimensional statistical functions "
 "(height distribution, correlations, PSDF, Minkowski functionals) of selected "
 "part of data."
 msgstr ""
 
-#: modules/tools/sfunctions.c:214
+#: modules/tools/sfunctions.c:219
 msgid "Height distribution"
 msgstr "Höhenverteilung"
 
-#: modules/tools/sfunctions.c:215
+#: modules/tools/sfunctions.c:220
 msgid "Cum. height distribution"
 msgstr ""
 
-#: modules/tools/sfunctions.c:216
+#: modules/tools/sfunctions.c:221
 msgid "Distribution of angles"
 msgstr "Winkelverteilung"
 
-#: modules/tools/sfunctions.c:217
+#: modules/tools/sfunctions.c:222
 msgid "Cum. distribution of angles"
 msgstr ""
 
-#: modules/tools/sfunctions.c:218
+#: modules/tools/sfunctions.c:223
 msgid "ACF"
 msgstr "ACF"
 
-#: modules/tools/sfunctions.c:219
+#: modules/tools/sfunctions.c:224
 msgid "HHCF"
 msgstr "HHCF"
 
-#: modules/tools/sfunctions.c:220
+#: modules/tools/sfunctions.c:225
 msgid "PSDF"
 msgstr "PSDF"
 
-#: modules/tools/sfunctions.c:221
+#: modules/tools/sfunctions.c:226
 msgid "Radial PSDF"
 msgstr ""
 
-#: modules/tools/sfunctions.c:222
+#: modules/tools/sfunctions.c:227
 msgid "Radial ACF"
 msgstr ""
 
-#: modules/tools/sfunctions.c:223
+#: modules/tools/sfunctions.c:228
 msgid "Minkowski volume"
 msgstr ""
 
-#: modules/tools/sfunctions.c:224
+#: modules/tools/sfunctions.c:229
 msgid "Minkowski boundary"
 msgstr ""
 
-#: modules/tools/sfunctions.c:225
+#: modules/tools/sfunctions.c:230
 msgid "Minkowski connectivity"
 msgstr ""
 
-#: modules/tools/sfunctions.c:251
+#: modules/tools/sfunctions.c:232
+msgid "Area scale graph"
+msgstr ""
+
+#: modules/tools/sfunctions.c:257
 msgid "Statistical Functions"
 msgstr "Statistik-Funktionen"
 
-#: modules/tools/sfunctions.c:252
+#: modules/tools/sfunctions.c:258
 msgid "Calculate 1D statistical functions"
 msgstr "1D-Statistik-Funktionen berechnen"
 
-#: modules/tools/sfunctions.c:504
+#: modules/tools/sfunctions.c:501
 msgid "_Separate uncertainty"
 msgstr ""
 
-#: modules/tools/spectro.c:151
+#: modules/tools/spectro.c:154
 msgid "Point Spectrum, extracts point spectra to a graph."
 msgstr "Punktspektrum, extrahiert Punktspektren in einen Graphen."
 
-#: modules/tools/spectro.c:190
+#: modules/tools/spectro.c:193
 msgid "Point Spectroscopy"
 msgstr "Punktspektroskopie"
 
-#: modules/tools/spectro.c:191
+#: modules/tools/spectro.c:194
 msgid "Extract and view point spectroscopy data"
 msgstr "Punktspektroskopie-Daten extrahieren und anschauen"
 
-#: modules/tools/spectro.c:359
+#: modules/tools/spectro.c:362
 msgid "_Separate spectra"
 msgstr ""
 
-#: modules/tools/spectro.c:369
+#: modules/tools/spectro.c:372
 msgid "_Average spectra"
 msgstr ""
 
-#: modules/tools/spectro.c:508
+#: modules/tools/spectro.c:511
 msgid "Spectroscopy"
 msgstr "Spektroskopie"
 
@@ -14831,14 +15641,6 @@ msgstr ""
 msgid "No area in the zoom selected."
 msgstr ""
 
-#: modules/tools/stats.c:205
-msgid "Average value:"
-msgstr ""
-
-#: modules/tools/stats.c:206
-msgid "Median:"
-msgstr "Median:"
-
 #: modules/tools/stats.c:207
 msgid "Ra (Sa):"
 msgstr ""
@@ -14851,14 +15653,6 @@ msgstr ""
 msgid "Rms (grain-wise):"
 msgstr ""
 
-#: modules/tools/stats.c:210
-msgid "Skew:"
-msgstr ""
-
-#: modules/tools/stats.c:211
-msgid "Kurtosis:"
-msgstr "Wölbung:"
-
 #: modules/tools/stats.c:212
 msgid "Surface area:"
 msgstr "Oberflächen-Flächeninhalt:"
@@ -14867,11 +15661,6 @@ msgstr "Oberflächen-Flächeninhalt:"
 msgid "Projected area:"
 msgstr "Projizierte Fläche:"
 
-#: modules/tools/stats.c:214
-#, fuzzy
-msgid "Variation:"
-msgstr "Varianz:"
-
 #: modules/tools/stats.c:217
 msgid "Inclination θ:"
 msgstr "Neigungswinkel θ:"
@@ -14884,7 +15673,7 @@ msgstr "Neigungswinkel φ:"
 msgid "Statistics tool."
 msgstr "Statistik-Werkzeug."
 
-#: modules/tools/stats.c:261 modules/tools/stats.c:1095
+#: modules/tools/stats.c:261 modules/tools/stats.c:1091
 msgid "Statistical Quantities"
 msgstr "Statistische Größen"
 
@@ -14892,29 +15681,29 @@ msgstr "Statistische Größen"
 msgid "Statistical quantities"
 msgstr "Statistische Größen"
 
-#: modules/tools/stats.c:1002
+#: modules/tools/stats.c:998
 msgid "Save Statistical Quantities"
 msgstr ""
 
-#: modules/tools/stats.c:1100
+#: modules/tools/stats.c:1096
 #, fuzzy, c-format
 msgid "File:         %s\n"
 msgstr "Datei:              %s\n"
 
-#: modules/tools/stats.c:1104
+#: modules/tools/stats.c:1100
 #, fuzzy, c-format
 msgid "Data channel: %s\n"
 msgstr "Daten: %s\n"
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "Yes"
 msgstr "Ja"
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "No"
 msgstr "Nein"
 
-#: modules/tools/stats.c:1132
+#: modules/tools/stats.c:1128
 #, c-format
 msgid ""
 "Selected area: %s × %s at (%s, %s) px\n"
@@ -14936,211 +15725,207 @@ msgstr "Abmessungen und Einheiten"
 msgid "Volume Dimensions and Units"
 msgstr "Abmessungen und Einheiten"
 
-#: modules/volume/volume_calibrate.c:526
+#: modules/volume/volume_calibrate.c:486
 #, fuzzy
 msgid "_Value range:"
 msgstr "Wertebereich"
 
-#: modules/volume/volume_calibrate.c:555
+#: modules/volume/volume_calibrate.c:508
 #, fuzzy
 msgid "Value shi_ft:"
 msgstr "_Werteskala:"
 
-#: modules/volume/volume_calibrate.c:601
+#: modules/volume/volume_calibrate.c:542
 #, fuzzy
 msgid "_Value calibration factor:"
 msgstr "Kalibrierfaktor _X:"
 
-#: modules/volume/volume_extract.c:223
+#: modules/volume/volume_extract.c:216
 msgid "Shows and/or extracts a section of volume data"
 msgstr ""
 
-#: modules/volume/volume_extract.c:237
-msgid "/Show and _extract..."
+#: modules/volume/volume_extract.c:230
+msgid "/Show and _Extract..."
 msgstr ""
 
-#: modules/volume/volume_extract.c:241
+#: modules/volume/volume_extract.c:234
 msgid "Show and/or extract a section of volume data"
 msgstr ""
 
-#: modules/volume/volume_extract.c:270
+#: modules/volume/volume_extract.c:263
 #, fuzzy
 msgid "X cross-section"
 msgstr "X-Korrektur"
 
-#: modules/volume/volume_extract.c:271
+#: modules/volume/volume_extract.c:264
 #, fuzzy
 msgid "Y cross-section"
 msgstr "Y-Korrektur"
 
-#: modules/volume/volume_extract.c:272
+#: modules/volume/volume_extract.c:265
 #, fuzzy
 msgid "Z cross-section"
 msgstr "Z-Korrektur"
 
-#: modules/volume/volume_extract.c:273 modules/volume/volume_extract.c:698
+#: modules/volume/volume_extract.c:266 modules/volume/volume_extract.c:684
 #, fuzzy
 msgid "X direction sum"
 msgstr "_Beide Richtungen"
 
-#: modules/volume/volume_extract.c:274 modules/volume/volume_extract.c:700
+#: modules/volume/volume_extract.c:267 modules/volume/volume_extract.c:686
 #, fuzzy
 msgid "Y direction sum"
 msgstr "_Beide Richtungen"
 
-#: modules/volume/volume_extract.c:275 modules/volume/volume_extract.c:702
+#: modules/volume/volume_extract.c:268 modules/volume/volume_extract.c:688
 #, fuzzy
 msgid "Z direction sum"
 msgstr "_Beide Richtungen"
 
-#: modules/volume/volume_extract.c:278
+#: modules/volume/volume_extract.c:271
 #, fuzzy
 msgid "X direction"
 msgstr "X-Korrektur"
 
-#: modules/volume/volume_extract.c:279
+#: modules/volume/volume_extract.c:272
 #, fuzzy
 msgid "Y direction"
 msgstr "Y-Korrektur"
 
-#: modules/volume/volume_extract.c:280
+#: modules/volume/volume_extract.c:273
 #, fuzzy
 msgid "Z direction"
 msgstr "Z-Korrektur"
 
-#: modules/volume/volume_extract.c:322
+#: modules/volume/volume_extract.c:315
 #, fuzzy
 msgid "Volume data"
 msgstr "Volumen"
 
-#: modules/volume/volume_extract.c:324
+#: modules/volume/volume_extract.c:317
 #, fuzzy
 msgid "_Load"
 msgstr "_Laden"
 
-#: modules/volume/volume_extract.c:336
+#: modules/volume/volume_extract.c:329
 #, fuzzy
 msgid "_Extract projection"
 msgstr "_Orthographische Projektion"
 
-#: modules/volume/volume_extract.c:354
+#: modules/volume/volume_extract.c:347
 #, fuzzy
 msgid "Projections"
 msgstr "Schnittpunkte"
 
-#: modules/volume/volume_extract.c:404
+#: modules/volume/volume_extract.c:395
 #, fuzzy
 msgid "Z position"
 msgstr "Maximaler z-Wert"
 
-#: modules/volume/volume_extract.c:409
+#: modules/volume/volume_extract.c:405
 #, fuzzy
 msgid "Shown cut direction:"
 msgstr "_Vertikal"
 
-#: modules/volume/volume_extract.c:419 modules/volume/volume_extract.c:500
-#, fuzzy
-msgid "Show mode:"
-msgstr "_Rahmen anzeigen"
-
-#: modules/volume/volume_extract.c:490
+#: modules/volume/volume_extract.c:485
 #, fuzzy
 msgid "Graph cut direction:"
 msgstr "_Graph"
 
-#: modules/volume/volume_extract.c:525
+#: modules/volume/volume_extract.c:511
 msgid "3D view"
 msgstr ""
 
-#: modules/volume/volume_extract.c:550
+#: modules/volume/volume_extract.c:538
 #, fuzzy
 msgid "Zoom"
 msgstr "Zoom:"
 
-#: modules/volume/volume_extract.c:558
+#: modules/volume/volume_extract.c:545
 #, fuzzy
 msgid "Wireframe threshold"
 msgstr "_Weicher Schwellwert:"
 
-#: modules/volume/volume_extract.c:566
+#: modules/volume/volume_extract.c:552
 #, fuzzy
 msgid "Z scale"
 msgstr "_Skala:"
 
-#: modules/volume/volume_extract.c:574
+#: modules/volume/volume_extract.c:559
 #, fuzzy
 msgid "Opacity scale"
 msgstr "_Skala:"
 
-#: modules/volume/volume_extract.c:580
-msgid "apply perspective"
+#: modules/volume/volume_extract.c:565
+msgid "Apply perspective"
 msgstr ""
 
-#: modules/volume/volume_extract.c:589
-msgid "instant 3D render"
-msgstr ""
+#: modules/volume/volume_extract.c:574
+#, fuzzy
+msgid "Instant 3D render"
+msgstr "_Sofort aktualisieren"
 
-#: modules/volume/volume_extract.c:598
+#: modules/volume/volume_extract.c:587
 #, fuzzy
 msgid "X view"
 msgstr "Vorschau"
 
-#: modules/volume/volume_extract.c:604
+#: modules/volume/volume_extract.c:592
 #, fuzzy
 msgid "Y view"
 msgstr "Vorschau"
 
-#: modules/volume/volume_extract.c:610
+#: modules/volume/volume_extract.c:597
 #, fuzzy
 msgid "Z view"
 msgstr "Vorschau"
 
-#: modules/volume/volume_extract.c:683
+#: modules/volume/volume_extract.c:669
 #, c-format
 msgid "X cross-section at x: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:686
+#: modules/volume/volume_extract.c:672
 #, c-format
 msgid "Y cross-section at y: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:690
+#: modules/volume/volume_extract.c:676
 #, fuzzy, c-format
 msgid "Z cross-section at Z = %g %s (#%d)"
 msgstr "Z-Korrektur"
 
-#: modules/volume/volume_extract.c:749 modules/volume/volume_slice.c:1264
+#: modules/volume/volume_extract.c:735 modules/volume/volume_slice.c:1278
 #, c-format
 msgid "X graph at y: %d z: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:752 modules/volume/volume_slice.c:1273
+#: modules/volume/volume_extract.c:738 modules/volume/volume_slice.c:1287
 #, c-format
 msgid "Y graph at x: %d z: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:755 modules/volume/volume_slice.c:1255
+#: modules/volume/volume_extract.c:741 modules/volume/volume_slice.c:1269
 #, c-format
 msgid "Z graph at x: %d y: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:776
+#: modules/volume/volume_extract.c:762
 #, fuzzy
 msgid "Brick graph"
 msgstr "Graph"
 
-#: modules/volume/volume_extract.c:1056
+#: modules/volume/volume_extract.c:1042
 #, fuzzy
 msgid "Load volume data"
 msgstr "Nivellierte Daten"
 
-#: modules/volume/volume_extract.c:1218
+#: modules/volume/volume_extract.c:1204
 #, c-format
 msgid "Shown range %g to %g"
 msgstr ""
 
-#: modules/volume/volume_extract.c:1911
+#: modules/volume/volume_extract.c:1897
 msgid "Building wireframe model..."
 msgstr ""
 
@@ -15149,110 +15934,111 @@ msgid "Evaluate volume force-distance data"
 msgstr ""
 
 #: modules/volume/volume_fdfit.c:213
-msgid "/_Evaluate FD data..."
+msgid "/_Evaluate FD Data..."
 msgstr ""
 
 #: modules/volume/volume_fdfit.c:217
 msgid "Evaluate force-distance volume data"
 msgstr ""
 
-#: modules/volume/volume_fdfit.c:368
+#: modules/volume/volume_fdfit.c:371
 #, fuzzy
 msgid "Curve _X position:"
 msgstr "Maximaler z-Wert"
 
-#: modules/volume/volume_fdfit.c:386
+#: modules/volume/volume_fdfit.c:380
 #, fuzzy
 msgid "Curve _Y position:"
 msgstr "Maximaler z-Wert"
 
-#: modules/volume/volume_fdfit.c:535
+#: modules/volume/volume_fdfit.c:511
 #, fuzzy
 msgid "e_stimate"
 msgstr "_Abschätzung"
 
-#: modules/volume/volume_invert.c:51
+#: modules/volume/volume_invert.c:39 modules/volume/volumeops.c:39
 #, fuzzy
 msgid "Inverts value in volume data"
 msgstr "Invertiert Wert in Volumendaten"
 
-#: modules/volume/volume_invert.c:65
+#: modules/volume/volume_invert.c:53
 #, fuzzy
-msgid "/_Invert value"
+msgid "/_Invert Value"
 msgstr "Zentraler Wert"
 
-#: modules/volume/volume_invert.c:69
+#: modules/volume/volume_invert.c:57
 #, fuzzy
 msgid "Invert value in volume data"
 msgstr "Nivellierte Daten"
 
-#: modules/volume/volume_kmeans.c:94
+#: modules/volume/volume_kmeans.c:95
 msgid "Calculates K-means clustering on volume data."
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:108
-msgid "/_K-means clustering..."
-msgstr ""
+#: modules/volume/volume_kmeans.c:109
+#, fuzzy
+msgid "/_K-Means Clustering..."
+msgstr "Interpoliere..."
 
-#: modules/volume/volume_kmeans.c:112
+#: modules/volume/volume_kmeans.c:113
 msgid "Calculate K-means clustering on volume data"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:151
+#: modules/volume/volume_kmeans.c:152
 msgid "K-means"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:164
+#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:163
 #, fuzzy
 msgid "_Number of clusters:"
 msgstr "A_nzahl an Schritten:"
 
-#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:171
+#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:170
 #, fuzzy
 msgid "Convergence _precision digits:"
 msgstr "_Genauigkeit:"
 
-#: modules/volume/volume_kmeans.c:184 modules/volume/volume_kmedians.c:178
+#: modules/volume/volume_kmeans.c:183 modules/volume/volume_kmedians.c:176
 #, fuzzy
 msgid "_Max. iterations:"
 msgstr "Anzahl an Körnern"
 
-#: modules/volume/volume_kmeans.c:189 modules/volume/volume_kmedians.c:183
+#: modules/volume/volume_kmeans.c:187 modules/volume/volume_kmedians.c:181
 #, fuzzy
 msgid "_Normalize"
 msgstr "Normal"
 
-#: modules/volume/volume_kmeans.c:195
+#: modules/volume/volume_kmeans.c:193
 #, fuzzy
 msgid "_Remove outliers"
 msgstr "Fehlstellen entfernen"
 
-#: modules/volume/volume_kmeans.c:208
+#: modules/volume/volume_kmeans.c:202
 #, fuzzy
 msgid "Outliers _threshold:"
 msgstr "_Harter Schwellwert:"
 
-#: modules/volume/volume_kmeans.c:431
+#: modules/volume/volume_kmeans.c:425
 #, fuzzy
 msgid "K-means iteration..."
 msgstr "Interpoliere..."
 
-#: modules/volume/volume_kmeans.c:651
+#: modules/volume/volume_kmeans.c:645
 #, c-format
 msgid "K-means cluster of %s"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:660
+#: modules/volume/volume_kmeans.c:654
 #, c-format
 msgid "K-means error of %s"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:670 modules/volume/volume_kmedians.c:514
+#: modules/volume/volume_kmeans.c:664 modules/volume/volume_kmedians.c:512
 #, c-format
 msgid "Pre-normalized intensity of %s"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:702
+#: modules/volume/volume_kmeans.c:696
 #, c-format
 msgid "K-means center %d"
 msgstr ""
@@ -15262,8 +16048,9 @@ msgid "Calculates K-medians clustering on volume data."
 msgstr ""
 
 #: modules/volume/volume_kmedians.c:102
-msgid "/_K-medians clustering..."
-msgstr ""
+#, fuzzy
+msgid "/_K-Medians Clustering..."
+msgstr "Interpoliere..."
 
 #: modules/volume/volume_kmedians.c:106
 msgid "Calculate K-medians clustering on volume data"
@@ -15274,50 +16061,50 @@ msgstr ""
 msgid "K-Medians"
 msgstr "Median"
 
-#: modules/volume/volume_kmedians.c:392
+#: modules/volume/volume_kmedians.c:390
 #, fuzzy
 msgid "K-medians iteration..."
 msgstr "Interpoliere..."
 
-#: modules/volume/volume_kmedians.c:495
+#: modules/volume/volume_kmedians.c:493
 #, c-format
 msgid "K-medians cluster of %s"
 msgstr ""
 
-#: modules/volume/volume_kmedians.c:504
+#: modules/volume/volume_kmedians.c:502
 #, c-format
 msgid "K-medians error of %s"
 msgstr ""
 
-#: modules/volume/volume_kmedians.c:546
+#: modules/volume/volume_kmedians.c:544
 #, c-format
 msgid "K-medians center %d"
 msgstr ""
 
-#: modules/volume/volume_linestat.c:171
+#: modules/volume/volume_linestat.c:173
 msgid "Summarizes profiles of volume data to a channel."
 msgstr ""
 
-#: modules/volume/volume_linestat.c:185
+#: modules/volume/volume_linestat.c:187
 msgid "/Summarize _Profiles..."
 msgstr ""
 
-#: modules/volume/volume_linestat.c:189
+#: modules/volume/volume_linestat.c:191
 #, fuzzy
 msgid "Summarize profiles"
 msgstr "Shimadzu-Dateien"
 
-#: modules/volume/volume_linestat.c:249
+#: modules/volume/volume_linestat.c:251
 #, fuzzy
 msgid "_Extract image"
 msgstr "Profile extrahieren"
 
-#: modules/volume/volume_linestat.c:250
+#: modules/volume/volume_linestat.c:252
 #, fuzzy
 msgid "Set _preview"
 msgstr "Keine Vorschau möglich"
 
-#: modules/volume/volume_linestat.c:284
+#: modules/volume/volume_linestat.c:289
 msgid "Summarize Volume Profiles"
 msgstr ""
 
@@ -15343,61 +16130,127 @@ msgstr "_Differenzbild"
 msgid "Line graph"
 msgstr "Graph"
 
-#: modules/volume/volume_slice.c:290
+#: modules/volume/volume_slice.c:292
 #, fuzzy
 msgid "Slice Volume Data"
 msgstr "_Volumen Daten"
 
-#: modules/volume/volume_slice.c:369
+#: modules/volume/volume_slice.c:371
 #, fuzzy
 msgid "_Base plane:"
 msgstr "_Punktgröße:"
 
-#: modules/volume/volume_slice.c:420
+#: modules/volume/volume_slice.c:422
 #, fuzzy
 msgid "Extract _multiple items"
 msgstr "Profile extrahieren"
 
-#: modules/volume/volume_slice.c:437
+#: modules/volume/volume_slice.c:439
 #, fuzzy
 msgid "Positions"
 msgstr "Position"
 
-#: modules/volume/volume_slice.c:484
+#: modules/volume/volume_slice.c:492
 #, fuzzy
 msgid "_Z:"
 msgstr "_X:"
 
-#: modules/volume/volume_slice.c:1156
+#: modules/volume/volume_slice.c:1167
 #, fuzzy, c-format
 msgid "Z slice at %.*f%s%s (#%d)"
 msgstr "Z-Korrektur"
 
-#: modules/volume/volume_slice.c:1167
+#: modules/volume/volume_slice.c:1178
 #, fuzzy, c-format
 msgid "Y slice at %.*f%s%s (#%d)"
 msgstr "Z-Korrektur"
 
-#: modules/volume/volume_slice.c:1178
+#: modules/volume/volume_slice.c:1189
 #, fuzzy, c-format
 msgid "X slice at %.*f%s%s (#%d)"
 msgstr "Z-Korrektur"
 
-#: modules/volume/volume_slice.c:1307
+#: modules/volume/volume_slice.c:1325
 #, fuzzy
 msgid "Volume Z graphs"
 msgstr "Volumen"
 
-#: modules/volume/volume_slice.c:1314
+#: modules/volume/volume_slice.c:1332
 #, fuzzy
 msgid "Volume X graphs"
 msgstr "Volumen"
 
-#: modules/volume/volume_slice.c:1321
+#: modules/volume/volume_slice.c:1339
 #, fuzzy
 msgid "Volume Y graphs"
 msgstr "Volumen"
 
+#: modules/volume/volume_swaxes.c:104
+#, fuzzy
+msgid "Swaps axes of volume data."
+msgstr "Invertiert Wert in Volumendaten"
+
+#: modules/volume/volume_swaxes.c:118
+#, fuzzy
+msgid "/S_wap axes..."
+msgstr "/Speichern _unter..."
+
+#: modules/volume/volume_swaxes.c:122
+#, fuzzy
+msgid "Swap axes"
+msgstr "_Achsen anzeigen"
+
+#: modules/volume/volume_swaxes.c:156
+#, fuzzy
+msgid "X"
+msgstr "_X:"
+
+#: modules/volume/volume_swaxes.c:157
+msgid "X, reversed"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:158
+#, fuzzy
+msgid "Y"
+msgstr "_Y:"
+
+#: modules/volume/volume_swaxes.c:159
+msgid "Y, reversed"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:160
+msgid "Z"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:161
+msgid "Z, reversed"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:175
+msgid "Swap Volume Axes"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:196
+msgid "Current _X axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:204
+msgid "Current _Y axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:212
+msgid "Current _Z axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:219
+#, fuzzy
+msgid "Create new volume data"
+msgstr "Nivellierte Daten"
+
+#: modules/volume/volume_swaxes.c:286
+msgid "Z axis calibration will be lost."
+msgstr ""
+
 #: modules/volume/volume_zcal.c:104
 msgid "Attaches, extracts and removes volume data z-axis calibration."
 msgstr ""
@@ -15470,6 +16323,16 @@ msgid ""
 "differs from the number of planes %d."
 msgstr ""
 
+#: modules/volume/volumeops.c:53
+#, fuzzy
+msgid "/Extract _Preview"
+msgstr "Profile extrahieren"
+
+#: modules/volume/volumeops.c:57
+#, fuzzy
+msgid "Extract volume data preview to an image"
+msgstr "3D-Ansicht als Bild speichern"
+
 #: modules/xyz/xyz_drift.c:267
 msgid "Analyzes drift in XYZ data."
 msgstr ""
@@ -15517,7 +16380,7 @@ msgstr "Drift in X-Richtung"
 msgid "Analyze XYZ Drift"
 msgstr ""
 
-#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:391
+#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:406
 msgid "Reset Ran_ges"
 msgstr ""
 
@@ -15526,12 +16389,12 @@ msgstr ""
 msgid "_Guess parameters"
 msgstr "Rauigkeits-Parameter"
 
-#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:570
+#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:539
 #, fuzzy
 msgid "_X-range:"
 msgstr "_X-Bereich:"
 
-#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:592
+#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:561
 #, fuzzy
 msgid "_Y-range:"
 msgstr "_Y-Bereich:"
@@ -15624,7 +16487,7 @@ msgstr "H_öhe:"
 msgid "Fitting in progress..."
 msgstr ""
 
-#: modules/xyz/xyz_drift.c:2269 modules/xyz/xyz_raster.c:1012
+#: modules/xyz/xyz_drift.c:2264 modules/xyz/xyz_raster.c:981
 #, fuzzy
 msgid "Physical dimensions are invalid."
 msgstr "Physische Abmessungen"
@@ -15672,45 +16535,45 @@ msgstr "_Daten"
 msgid "Update X and Y of _all compatible data"
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:197
+#: modules/xyz/xyz_raster.c:194
 #, fuzzy
 msgid "Rasterizes XYZ data to images."
 msgstr "Fügt zwei Bilder zusammen"
 
-#: modules/xyz/xyz_raster.c:211
+#: modules/xyz/xyz_raster.c:208
 #, fuzzy
 msgid "/_Rasterize..."
 msgstr "/Zusa_mmenführen..."
 
-#: modules/xyz/xyz_raster.c:215
+#: modules/xyz/xyz_raster.c:212
 #, fuzzy
 msgid "Rasterize to image"
 msgstr "Zwei Bilder zusammenführen"
 
-#: modules/xyz/xyz_raster.c:340
+#: modules/xyz/xyz_raster.c:337
 #, fuzzy
 msgid "Rasterize XYZ Data"
 msgstr "XYZ-Daten importieren"
 
-#: modules/xyz/xyz_raster.c:354
+#: modules/xyz/xyz_raster.c:351
 #, fuzzy
 msgid "Create Image _Directly"
 msgstr "Ein neues Element erzeugen"
 
-#: modules/xyz/xyz_raster.c:360
+#: modules/xyz/xyz_raster.c:357
 msgid "XY points form a regular grid so interpolation is not necessary."
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:381
+#: modules/xyz/xyz_raster.c:392
 #, fuzzy
 msgid "Make Pixels S_quare"
 msgstr "_Pixel-Radius:"
 
-#: modules/xyz/xyz_raster.c:642
+#: modules/xyz/xyz_raster.c:611
 msgid "Field"
 msgstr "Feld"
 
-#: modules/xyz/xyz_raster.c:956
+#: modules/xyz/xyz_raster.c:925
 #, c-format
 msgid ""
 "Number of points: %u\n"
@@ -15718,12 +16581,64 @@ msgid ""
 "Added on the boundaries: %u"
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:1091
+#: modules/xyz/xyz_raster.c:1065
 msgid ""
 "XYZ data regularization failed due to numerical instability or was "
 "interrupted."
 msgstr ""
 
+#~ msgid "pixels"
+#~ msgstr "Pixel"
+
+#~ msgid "Fast Fourier Transform"
+#~ msgstr "Schnelle Fouriertransformation"
+
+#, fuzzy
+#~ msgid "Surface _coverage:"
+#~ msgstr "Oberflächen-Flächeninhalt:"
+
+#, fuzzy
+#~ msgid "Distribute"
+#~ msgstr "VerzerrtVerteilung"
+
+#, fuzzy
+#~ msgid "Replace"
+#~ msgstr "Datei ersetzen?"
+
+#~ msgid "_Fix res.:"
+#~ msgstr "_Feste Auflösung:"
+
+#~ msgid "Reco_mpute"
+#~ msgstr "e_rneut berechnen"
+
+#, fuzzy
+#~ msgid "Show mode:"
+#~ msgstr "_Rahmen anzeigen"
+
+#~ msgid "Initializing GUI"
+#~ msgstr "Initialisiere graphische Benutzeroberfläche"
+
+#, fuzzy
+#~ msgid "Slab size _x:"
+#~ msgstr "_Ebenengröße:"
+
+#, fuzzy
+#~ msgid "Slab size _y:"
+#~ msgstr "_Ebenengröße:"
+
+#, fuzzy
+#~ msgid "Stitch operations on data fields."
+#~ msgstr ""
+#~ "Einfache Rechenoperationen mit zwei Datenfeldern (oder einem Datenfeld "
+#~ "und einer skalaren Größe)."
+
+#, fuzzy
+#~ msgid "Stitch operations on data"
+#~ msgstr "Arithmetische Operationen"
+
+#~ msgid "Create new channel"
+#~ msgstr "Neuen Kanal erzeugen"
+
 #, fuzzy
 #~ msgid "Laplace interpolation..."
 #~ msgstr "Interpoliere..."
@@ -15908,10 +16823,6 @@ msgstr ""
 #~ msgstr "Triangulation..."
 
 #, fuzzy
-#~ msgid "Starting..."
-#~ msgstr "Starte"
-
-#, fuzzy
 #~ msgid "Mean height"
 #~ msgstr "Neue _Höhe:"
 
diff --git a/po/en_GB.gmo b/po/en_GB.gmo
index 8b13f07..2b518c8 100644
Binary files a/po/en_GB.gmo and b/po/en_GB.gmo differ
diff --git a/po/en_GB.po b/po/en_GB.po
index 40e6fe1..482bf7d 100644
--- a/po/en_GB.po
+++ b/po/en_GB.po
@@ -3,8 +3,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Gwyddion\n"
 "Report-Msgid-Bugs-To: yeti at gwyddion.net\n"
-"POT-Creation-Date: 2016-11-18 11:05+0100\n"
-"PO-Revision-Date: 2016-11-15 09:45+0100\n"
+"POT-Creation-Date: 2017-08-15 17:48+0200\n"
+"PO-Revision-Date: 2017-08-14 20:33+0200\n"
 "Last-Translator: Yeti <yeti at gwyddion.net>\n"
 "Language-Team: None, I suppose\n"
 "Language: en_GB\n"
@@ -12,7 +12,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.8.8\n"
+"X-Generator: Poedit 1.8.12\n"
 
 #: libgwyddion/gwyexpr.c:765
 msgid "Invalid token"
@@ -124,7 +124,8 @@ msgstr "contact: Hertz (paraboloid)"
 #: app/data-browser-aux.c:1480 app/data-browser.c:2280 app/data-browser.c:2887
 #: app/data-browser.c:3707 app/data-browser.c:3857 app/data-browser.c:4139
 #: app/data-browser.c:4504 app/data-browser.c:4590 app/data-browser.c:5016
-#: app/resource-editor.c:366 modules/process/convolution_filter.c:691
+#: app/resource-editor.c:366 modules/file/xyzexport.c:214
+#: modules/process/convolution_filter.c:691
 msgid "Untitled"
 msgstr "Untitled"
 
@@ -132,97 +133,105 @@ msgstr "Untitled"
 msgid "Initial residua evaluation..."
 msgstr "Initial residua evaluation..."
 
-#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1632
+#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1646
 msgid "Fitting..."
 msgstr "Fitting..."
 
-#: libgwyddion/gwynlfitpreset.c:1442 libprocess/gwyprocessenums.c:101
-#: libprocess/gwyshapefitpreset.c:347
+#: libgwyddion/gwynlfitpreset.c:1549 libprocess/gwyprocessenums.c:101
+#: libprocess/gwyshapefitpreset.c:347 modules/process/psf-fit.c:157
 msgid "Gaussian"
 msgstr "Gaussian"
 
-#: libgwyddion/gwynlfitpreset.c:1457
+#: libgwyddion/gwynlfitpreset.c:1564
 msgid "Gaussian (PSDF)"
 msgstr "Gaussian (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1470
+#: libgwyddion/gwynlfitpreset.c:1577
 msgid "Gaussian (ACF)"
 msgstr "Gaussian (ACF)"
 
-#: libgwyddion/gwynlfitpreset.c:1483
+#: libgwyddion/gwynlfitpreset.c:1590
 msgid "Gaussian (HHCF)"
 msgstr "Gaussian (HHCF)"
 
-#: libgwyddion/gwynlfitpreset.c:1496
+#: libgwyddion/gwynlfitpreset.c:1603
 msgid "Gaussian (RPSDF)"
 msgstr "Gaussian (RPSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1509
+#: libgwyddion/gwynlfitpreset.c:1616
 msgid "Two Gaussians (PSDF)"
 msgstr "Two Gaussians (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1524 modules/xyz/xyz_drift.c:841
-#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1819
+#: libgwyddion/gwynlfitpreset.c:1631 modules/xyz/xyz_drift.c:841
+#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1818
 msgid "Exponential"
 msgstr "Exponential"
 
-#: libgwyddion/gwynlfitpreset.c:1536
+#: libgwyddion/gwynlfitpreset.c:1643
 msgid "Exponential (PSDF)"
 msgstr "Exponential (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1549
+#: libgwyddion/gwynlfitpreset.c:1656
 msgid "Exponential (ACF)"
 msgstr "Exponential (ACF)"
 
-#: libgwyddion/gwynlfitpreset.c:1561
+#: libgwyddion/gwynlfitpreset.c:1668
 msgid "Exponential (HHCF)"
 msgstr "Exponential (HHCF)"
 
-#: libgwyddion/gwynlfitpreset.c:1574
+#: libgwyddion/gwynlfitpreset.c:1681
 msgid "Exponential (RPSDF)"
 msgstr "Exponential (RPSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1588
+#: libgwyddion/gwynlfitpreset.c:1695
+msgid "K-correlated (PSDF)"
+msgstr "K-correlated (PSDF)"
+
+#: libgwyddion/gwynlfitpreset.c:1709
 msgid "Polynomial (order 0)"
 msgstr "Polynomial (order 0)"
 
-#: libgwyddion/gwynlfitpreset.c:1599 modules/xyz/xyz_drift.c:1805
+#: libgwyddion/gwynlfitpreset.c:1720 modules/xyz/xyz_drift.c:1804
 msgid "Polynomial (order 1)"
 msgstr "Polynomial (order 1)"
 
-#: libgwyddion/gwynlfitpreset.c:1610
+#: libgwyddion/gwynlfitpreset.c:1731
 msgid "Polynomial (order 2)"
 msgstr "Polynomial (order 2)"
 
-#: libgwyddion/gwynlfitpreset.c:1622
+#: libgwyddion/gwynlfitpreset.c:1743
 msgid "Polynomial (order 3)"
 msgstr "Polynomial (order 3)"
 
-#: libgwyddion/gwynlfitpreset.c:1635
+#: libgwyddion/gwynlfitpreset.c:1756
 msgid "Square wave"
 msgstr "Square wave"
 
-#: libgwyddion/gwynlfitpreset.c:1651
+#: libgwyddion/gwynlfitpreset.c:1772
 msgid "Parabolic step"
 msgstr "Parabolic step"
 
-#: libgwyddion/gwynlfitpreset.c:1667
+#: libgwyddion/gwynlfitpreset.c:1788
 msgid "Smooth slanted step"
 msgstr "Smooth slanted step"
 
-#: libgwyddion/gwynlfitpreset.c:1684
+#: libgwyddion/gwynlfitpreset.c:1805
 msgid "Smooth bent step"
 msgstr "Smooth bent step"
 
-#: libgwyddion/gwynlfitpreset.c:1700
+#: libgwyddion/gwynlfitpreset.c:1821
+msgid "Boltzmann bent step"
+msgstr "Boltzmann bent step"
+
+#: libgwyddion/gwynlfitpreset.c:1837
 msgid "Power"
 msgstr "Power"
 
-#: libgwyddion/gwynlfitpreset.c:1712 libprocess/gwyshapefitpreset.c:348
+#: libgwyddion/gwynlfitpreset.c:1849 libprocess/gwyshapefitpreset.c:348
 msgid "Lorentzian"
 msgstr "Lorentzian"
 
-#: libgwyddion/gwynlfitpreset.c:1726
+#: libgwyddion/gwynlfitpreset.c:1863
 msgid "Sinc"
 msgstr "Sinc"
 
@@ -243,7 +252,7 @@ msgid "Step height (positive)"
 msgstr "Step height (positive)"
 
 #: libprocess/cdline.c:590 libprocess/cdline.c:599
-#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:170
+#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:163
 msgid "Line"
 msgstr "Line"
 
@@ -256,7 +265,7 @@ msgid "Circle (down)"
 msgstr "Circle (down)"
 
 #: libprocess/cdline.c:608 libprocess/cdline.c:617
-#: libgwydgets/gwygraphareadialog.c:557 modules/process/hough.c:171
+#: libgwydgets/gwygraphareadialog.c:550 modules/process/hough.c:164
 msgid "Circle"
 msgstr "Circle"
 
@@ -264,237 +273,237 @@ msgstr "Circle"
 msgid "Circle (up)"
 msgstr "Circle (up)"
 
-#: libprocess/gwygrainvalue.c:64
+#: libprocess/gwygrainvalue.c:62
 msgid "Grain number"
 msgstr "Grain number"
 
-#: libprocess/gwygrainvalue.c:73 modules/process/curvature.c:129
+#: libprocess/gwygrainvalue.c:71 modules/process/curvature.c:128
 msgid "Center x position"
 msgstr "Centre x position"
 
-#: libprocess/gwygrainvalue.c:82 modules/process/curvature.c:130
+#: libprocess/gwygrainvalue.c:80 modules/process/curvature.c:129
 msgid "Center y position"
 msgstr "Centre y position"
 
-#: libprocess/gwygrainvalue.c:91
+#: libprocess/gwygrainvalue.c:89
 msgid "Minimum value"
 msgstr "Minimum value"
 
-#: libprocess/gwygrainvalue.c:100
+#: libprocess/gwygrainvalue.c:98
 msgid "Maximum value"
 msgstr "Maximum value"
 
-#: libprocess/gwygrainvalue.c:109 modules/process/bdep_synth.c:133
-#: modules/tools/filter.c:237
+#: libprocess/gwygrainvalue.c:107 modules/process/bdep_synth.c:133
+#: modules/tools/filter.c:238
 msgid "Mean value"
 msgstr "Average value"
 
-#: libprocess/gwygrainvalue.c:118 modules/tools/filter.c:238
+#: libprocess/gwygrainvalue.c:116 modules/tools/filter.c:239
 msgid "Median value"
 msgstr "Median value"
 
-#: libprocess/gwygrainvalue.c:127
+#: libprocess/gwygrainvalue.c:125
 msgid "Minimum value on boundary"
 msgstr "Minimum value on boundary"
 
-#: libprocess/gwygrainvalue.c:136
+#: libprocess/gwygrainvalue.c:134
 msgid "Maximum value on boundary"
 msgstr "Maximum value on boundary"
 
-#: libprocess/gwygrainvalue.c:145
+#: libprocess/gwygrainvalue.c:143
 msgid "Pixel area"
 msgstr "Pixel area"
 
-#: libprocess/gwygrainvalue.c:154
+#: libprocess/gwygrainvalue.c:152
 msgid "Projected area"
 msgstr "Projected area"
 
-#: libprocess/gwygrainvalue.c:163
+#: libprocess/gwygrainvalue.c:161
 msgid "Surface area"
 msgstr "Surface area"
 
-#: libprocess/gwygrainvalue.c:172
+#: libprocess/gwygrainvalue.c:170
 msgid "Equivalent square side"
 msgstr "Equivalent square side"
 
-#: libprocess/gwygrainvalue.c:181
+#: libprocess/gwygrainvalue.c:179
 msgid "Equivalent disc radius"
 msgstr "Equivalent disc radius"
 
-#: libprocess/gwygrainvalue.c:190
+#: libprocess/gwygrainvalue.c:188
 msgid "Area above half-height"
 msgstr "Area above half-height"
 
-#: libprocess/gwygrainvalue.c:199
+#: libprocess/gwygrainvalue.c:197
 msgid "Area of convex hull"
 msgstr "Area of convex hull"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to
 #. * zero.
-#: libprocess/gwygrainvalue.c:210
+#: libprocess/gwygrainvalue.c:208
 msgid "Zero basis volume"
 msgstr "Zero-basis volume"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * grain minimum.
-#: libprocess/gwygrainvalue.c:221
+#: libprocess/gwygrainvalue.c:219
 msgid "Grain minimum basis volume"
 msgstr "Grain minimum-basis volume"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * Laplacian background.
-#: libprocess/gwygrainvalue.c:232
+#: libprocess/gwygrainvalue.c:230
 msgid "Laplacian background basis volume"
 msgstr "Laplacian background-basis volume"
 
-#: libprocess/gwygrainvalue.c:241
+#: libprocess/gwygrainvalue.c:239
 msgid "Projected boundary length"
 msgstr "Projected boundary length"
 
-#: libprocess/gwygrainvalue.c:250
+#: libprocess/gwygrainvalue.c:248
 msgid "Minimum bounding size"
 msgstr "Minimum bounding size"
 
-#: libprocess/gwygrainvalue.c:259
+#: libprocess/gwygrainvalue.c:257
 msgid "Minimum bounding direction"
 msgstr "Minimum bounding direction"
 
-#: libprocess/gwygrainvalue.c:268
+#: libprocess/gwygrainvalue.c:266
 msgid "Maximum bounding size"
 msgstr "Maximum bounding size"
 
-#: libprocess/gwygrainvalue.c:277
+#: libprocess/gwygrainvalue.c:275
 msgid "Maximum bounding direction"
 msgstr "Maximum bounding direction"
 
-#: libprocess/gwygrainvalue.c:286
+#: libprocess/gwygrainvalue.c:284
 msgid "Maximum inscribed disc radius"
 msgstr "Maximum inscribed disc radius"
 
-#: libprocess/gwygrainvalue.c:295
+#: libprocess/gwygrainvalue.c:293
 msgid "Maximum inscribed disc center x position"
 msgstr "Maximum inscribed disc centre x-position"
 
-#: libprocess/gwygrainvalue.c:304
+#: libprocess/gwygrainvalue.c:302
 msgid "Maximum inscribed disc center y position"
 msgstr "Maximum inscribed disc centre y-position"
 
-#: libprocess/gwygrainvalue.c:313
+#: libprocess/gwygrainvalue.c:311
 msgid "Minimum circumcircle radius"
 msgstr "Minimum circumcircle radius"
 
-#: libprocess/gwygrainvalue.c:322
+#: libprocess/gwygrainvalue.c:320
 msgid "Minimum circumcircle center x position"
 msgstr "Minimum circumcircle centre x-position"
 
-#: libprocess/gwygrainvalue.c:331
+#: libprocess/gwygrainvalue.c:329
 msgid "Minimum circumcircle center y position"
 msgstr "Minimum circumcircle centre y-position"
 
-#: libprocess/gwygrainvalue.c:340
+#: libprocess/gwygrainvalue.c:338
 msgid "Mean radius"
 msgstr "Average radius"
 
-#: libprocess/gwygrainvalue.c:349 modules/tools/readvalue.c:319
+#: libprocess/gwygrainvalue.c:347 modules/tools/readvalue.c:322
 msgid "Inclination θ"
 msgstr "Inclination θ"
 
-#: libprocess/gwygrainvalue.c:358 modules/tools/readvalue.c:329
+#: libprocess/gwygrainvalue.c:356 modules/tools/readvalue.c:332
 msgid "Inclination φ"
 msgstr "Inclination φ"
 
-#: libprocess/gwygrainvalue.c:367
+#: libprocess/gwygrainvalue.c:365
 msgid "Curvature center x position"
 msgstr "Curvature centre x-position"
 
-#: libprocess/gwygrainvalue.c:376
+#: libprocess/gwygrainvalue.c:374
 msgid "Curvature center y position"
 msgstr "Curvature centre y-position"
 
-#: libprocess/gwygrainvalue.c:385
+#: libprocess/gwygrainvalue.c:383
 msgid "Curvature center z value"
 msgstr "Curvature centre z-value"
 
-#: libprocess/gwygrainvalue.c:394 modules/tools/readvalue.c:344
+#: libprocess/gwygrainvalue.c:392 modules/tools/readvalue.c:347
 msgid "Curvature 1"
 msgstr "Curvature 1"
 
-#: libprocess/gwygrainvalue.c:403 modules/tools/readvalue.c:354
+#: libprocess/gwygrainvalue.c:401 modules/tools/readvalue.c:357
 msgid "Curvature 2"
 msgstr "Curvature 2"
 
-#: libprocess/gwygrainvalue.c:412
+#: libprocess/gwygrainvalue.c:410
 msgid "Curvature angle 1"
 msgstr "Curvature angle 1"
 
-#: libprocess/gwygrainvalue.c:421
+#: libprocess/gwygrainvalue.c:419
 msgid "Curvature angle 2"
 msgstr "Curvature angle 2"
 
-#: libprocess/gwygrainvalue.c:430
+#: libprocess/gwygrainvalue.c:428
 msgid "Major semiaxis of equivalent ellipse"
 msgstr "Major semi-axis of equivalent ellipse"
 
-#: libprocess/gwygrainvalue.c:439
+#: libprocess/gwygrainvalue.c:437
 msgid "Minor semiaxis of equivalent ellipse"
 msgstr "Minor semi-axis of equivalent ellipse"
 
-#: libprocess/gwygrainvalue.c:448
+#: libprocess/gwygrainvalue.c:446
 msgid "Orientation of equivalent ellipse"
 msgstr "Orientation of equivalent ellipse"
 
-#: libprocess/gwygrainvalue.c:1120
+#: libprocess/gwygrainvalue.c:1118
 msgid "Id"
 msgstr "Id"
 
-#: libprocess/gwygrainvalue.c:1121 modules/graph/graph_peaks.c:156
-#: modules/process/extract_path.c:391 modules/process/wave_synth.c:482
-#: modules/tools/readvalue.c:251
+#: libprocess/gwygrainvalue.c:1119 modules/graph/graph_peaks.c:154
+#: modules/process/extract_path.c:391 modules/process/wave_synth.c:513
+#: modules/tools/readvalue.c:253
 msgid "Position"
 msgstr "Position"
 
-#: libprocess/gwygrainvalue.c:1122 app/meta.c:411 modules/file/imgexport.c:4625
-#: modules/process/curvature.c:762 modules/tools/level3.c:468
-#: modules/tools/readvalue.c:286
+#: libprocess/gwygrainvalue.c:1120 app/meta.c:411 modules/file/imgexport.c:4573
+#: modules/process/curvature.c:759 modules/tools/level3.c:475
+#: modules/tools/readvalue.c:290
 msgid "Value"
 msgstr "Value"
 
-#: libprocess/gwygrainvalue.c:1123
+#: libprocess/gwygrainvalue.c:1121
 msgid "Area"
 msgstr "Area"
 
-#: libprocess/gwygrainvalue.c:1124 app/data-browser.c:5624 app/toolbox.c:110
+#: libprocess/gwygrainvalue.c:1122 app/data-browser.c:5624 app/toolbox.c:115
 msgid "Volume"
 msgstr "Volume"
 
-#: libprocess/gwygrainvalue.c:1125
+#: libprocess/gwygrainvalue.c:1123
 msgid "Boundary"
 msgstr "Boundary"
 
-#: libprocess/gwygrainvalue.c:1126 modules/process/pat_synth.c:829
-#: modules/process/pat_synth.c:1131 modules/process/pat_synth.c:1466
-#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:147
+#: libprocess/gwygrainvalue.c:1124 modules/process/pat_synth.c:830
+#: modules/process/pat_synth.c:1132 modules/process/pat_synth.c:1467
+#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:149
 msgid "Slope"
 msgstr "Slope"
 
-#: libprocess/gwygrainvalue.c:1127 modules/process/curvature.c:213
-#: modules/process/curvature.c:613
+#: libprocess/gwygrainvalue.c:1125 modules/process/curvature.c:212
+#: modules/process/curvature.c:615
 msgid "Curvature"
 msgstr "Curvature"
 
-#: libprocess/gwygrainvalue.c:1128
+#: libprocess/gwygrainvalue.c:1126
 msgid "Moment"
 msgstr "Moment"
 
-#: libprocess/gwygrainvalue.c:1132
+#: libprocess/gwygrainvalue.c:1130
 msgid "User"
 msgstr "User"
 
-#: libprocess/gwyprocessenums.c:44
+#: libprocess/gwyprocessenums.c:44 modules/process/preview.h:263
 msgid "Union"
 msgstr "Union"
 
-#: libprocess/gwyprocessenums.c:45
+#: libprocess/gwyprocessenums.c:45 modules/process/preview.h:255
 msgid "Intersection"
 msgstr "Intersection"
 
@@ -573,13 +582,13 @@ msgid "Scale and space adaptive"
 msgstr "Scale and space adaptive"
 
 #. TRANSLATORS: Interpolation type (AKA nearest neighbour)
-#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3791
-#: modules/xyz/xyz_raster.c:640
+#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3756
+#: modules/xyz/xyz_raster.c:609
 msgid "Round"
 msgstr "Round"
 
-#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3792
-#: modules/xyz/xyz_raster.c:641
+#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3757
+#: modules/xyz/xyz_raster.c:610
 msgid "Linear"
 msgstr "Linear"
 
@@ -667,27 +676,27 @@ msgstr "Include only masked region"
 msgid "Use entire image (ignore mask)"
 msgstr "Use entire image (ignore mask)"
 
-#: libprocess/gwyprocessenums.c:602
+#: libprocess/gwyprocessenums.c:604
 msgid "distance|City-block"
 msgstr "City-block"
 
-#: libprocess/gwyprocessenums.c:603
+#: libprocess/gwyprocessenums.c:605
 msgid "distance|Chess"
 msgstr "Chess"
 
-#: libprocess/gwyprocessenums.c:604
+#: libprocess/gwyprocessenums.c:606
 msgid "distance|Octagonal 4,8"
 msgstr "Octagonal 4,8"
 
-#: libprocess/gwyprocessenums.c:605
+#: libprocess/gwyprocessenums.c:607
 msgid "distance|Octagonal 8,4"
 msgstr "Octagonal 8,4"
 
-#: libprocess/gwyprocessenums.c:606
+#: libprocess/gwyprocessenums.c:608
 msgid "distance|Octagonal"
 msgstr "Octagonal"
 
-#: libprocess/gwyprocessenums.c:607
+#: libprocess/gwyprocessenums.c:609
 msgid "distance|Euclidean"
 msgstr "Euclidean"
 
@@ -723,11 +732,11 @@ msgstr "Parabolic bump"
 msgid "Ring"
 msgstr "Ring"
 
-#: libprocess/morph_lib.c:169 libprocess/tip.c:1043
+#: libprocess/morph_lib.c:169 libprocess/tip.c:1052
 msgid "Dilation..."
 msgstr "Dilation..."
 
-#: libprocess/morph_lib.c:235 libprocess/tip.c:1164
+#: libprocess/morph_lib.c:235 libprocess/tip.c:1173
 msgid "Erosion..."
 msgstr "Erosion..."
 
@@ -758,81 +767,81 @@ msgid_plural "Found %d internal local maxima"
 msgstr[0] "Found one internal local maximum"
 msgstr[1] "Found %d internal local maxima"
 
-#: libprocess/tip.c:422
+#: libprocess/tip.c:431
 msgid "Pyramid"
 msgstr "Pyramid"
 
-#: libprocess/tip.c:423 libprocess/tip.c:429 libprocess/tip.c:435
+#: libprocess/tip.c:432 libprocess/tip.c:438 libprocess/tip.c:444
 msgid "Pyramidal"
 msgstr "Pyramidal"
 
-#: libprocess/tip.c:428
+#: libprocess/tip.c:437
 msgid "Contact"
 msgstr "Contact"
 
-#: libprocess/tip.c:434
+#: libprocess/tip.c:443
 msgid "Noncontact"
 msgstr "Non-contact"
 
-#: libprocess/tip.c:440
+#: libprocess/tip.c:449
 msgid "Delta function"
 msgstr "Delta-function"
 
-#: libprocess/tip.c:441
+#: libprocess/tip.c:450
 msgid "Analytical"
 msgstr "Analytical"
 
-#: libprocess/tip.c:446
+#: libprocess/tip.c:455 modules/process/fibre_synth.c:259
 msgid "Parabola"
 msgstr "Parabola"
 
-#: libprocess/tip.c:447 libprocess/tip.c:453
+#: libprocess/tip.c:456 libprocess/tip.c:462
 msgid "Symmetric"
 msgstr "Symmetrical"
 
-#: libprocess/tip.c:452
+#: libprocess/tip.c:461
 msgid "Cone"
 msgstr "Cone"
 
-#: libprocess/tip.c:458
+#: libprocess/tip.c:467
 msgid "Elliptical parabola"
 msgstr "Elliptical parabola"
 
-#: libprocess/tip.c:459
+#: libprocess/tip.c:468
 msgid "Asymmetric"
 msgstr "Asymmetric"
 
-#: libprocess/tip.c:1339 libprocess/tip.c:1367 libprocess/tip.c:1416
-#: libprocess/tip.c:1443
+#: libprocess/tip.c:1348 libprocess/tip.c:1376 libprocess/tip.c:1425
+#: libprocess/tip.c:1452
 msgid "Converting fields"
 msgstr "Converting fields"
 
-#: libprocess/tip.c:1349
+#: libprocess/tip.c:1358
 msgid "Starting partial estimation"
 msgstr "Starting partial estimation"
 
-#: libprocess/tip.c:1426
+#: libprocess/tip.c:1435
 msgid "Starting full estimation"
 msgstr "Starting full estimation"
 
-#: libprocess/triangulation.c:2085 modules/process/calcoefs_view.c:793
+#: libprocess/triangulation.c:2084 modules/process/calcoefs_view.c:793
 #: modules/process/lat_synth.c:1178
 msgid "Triangulating..."
 msgstr "Triangulating..."
 
-#: libgwydgets/gwy3dwindow.c:570
+#: libgwydgets/gwy3dwindow.c:575
 msgid "Rotate view (R)"
 msgstr "Rotate view (R)"
 
-#: libgwydgets/gwy3dwindow.c:575
+#: libgwydgets/gwy3dwindow.c:580
 msgid "Scale view as a whole (S)"
 msgstr "Scale view as a whole (S)"
 
-#: libgwydgets/gwy3dwindow.c:580
+#: libgwydgets/gwy3dwindow.c:585
 msgid "Scale value range (V)"
 msgstr "Scale value range (V)"
 
-#: libgwydgets/gwy3dwindow.c:585
+#: libgwydgets/gwy3dwindow.c:590
 msgid "Move light source (L)"
 msgstr "Move light source (L)"
 
@@ -840,227 +849,286 @@ msgstr "Move light source (L)"
 msgid "Show full controls"
 msgstr "Show full controls"
 
-#: libgwydgets/gwy3dwindow.c:693
+#: libgwydgets/gwy3dwindow.c:691
 msgid "Hide full controls"
 msgstr "Hide full controls"
 
-#: libgwydgets/gwy3dwindow.c:709 modules/file/imgexport.c:4796
-#: modules/process/fit-shape.c:461
+#: libgwydgets/gwy3dwindow.c:707 modules/file/imgexport.c:4745
+#: modules/process/fit-shape.c:462
 msgid "adjective|Basic"
 msgstr "Basic"
 
-#: libgwydgets/gwy3dwindow.c:714
+#: libgwydgets/gwy3dwindow.c:712
 msgid "Light & Material"
 msgstr "Light & Material"
 
-#: libgwydgets/gwy3dwindow.c:719
+#: libgwydgets/gwy3dwindow.c:717
 msgid "Labels"
 msgstr "Labels"
 
-#: libgwydgets/gwy3dwindow.c:828 modules/process/facet_analysis.c:331
-#: modules/process/facet_analysis.c:347 modules/process/shade.c:245
+#: libgwydgets/gwy3dwindow.c:722
+msgid "Colorbar"
+msgstr "Colourbar"
+
+#: libgwydgets/gwy3dwindow.c:838 modules/process/facet_analysis.c:335
+#: modules/process/facet_analysis.c:351 modules/process/shade.c:253
 #: modules/process/tilt.c:223
 msgid "φ:"
 msgstr "φ:"
 
-#: libgwydgets/gwy3dwindow.c:828 libgwydgets/gwy3dwindow.c:834
-#: libgwydgets/gwy3dwindow.c:1032 libgwydgets/gwy3dwindow.c:1040
-#: modules/process/facet_analysis.c:375 modules/process/indent_analyze.c:460
-#: modules/process/rotate.c:264 modules/process/shade.c:237
-#: modules/process/shade.c:245 modules/process/tilt.c:211
-#: modules/process/tilt.c:223 modules/process/tip_model.c:234
-#: modules/process/tip_model.c:240 modules/process/unrotate.c:334
+#: libgwydgets/gwy3dwindow.c:838 libgwydgets/gwy3dwindow.c:843
+#: libgwydgets/gwy3dwindow.c:1013 libgwydgets/gwy3dwindow.c:1020
+#: modules/process/correct_affine.c:461 modules/process/facet_analysis.c:238
+#: modules/process/facet_analysis.c:370 modules/process/indent_analyze.c:438
+#: modules/process/measure_lattice.c:381 modules/process/rotate.c:264
+#: modules/process/shade.c:245 modules/process/shade.c:253
+#: modules/process/synth.h:379 modules/process/synth.h:410
+#: modules/process/tilt.c:211 modules/process/tilt.c:223
+#: modules/process/tip_model.c:234 modules/process/tip_model.c:240
+#: modules/process/unrotate.c:334 modules/tools/distance.c:197
+#: modules/tools/readvalue.c:223 modules/tools/stats.c:319
 msgid "deg"
 msgstr "deg"
 
-#: libgwydgets/gwy3dwindow.c:834 modules/process/facet_analysis.c:330
-#: modules/process/facet_analysis.c:346 modules/process/shade.c:237
+#: libgwydgets/gwy3dwindow.c:843 modules/process/facet_analysis.c:334
+#: modules/process/facet_analysis.c:350 modules/process/shade.c:245
 #: modules/process/tilt.c:211
 msgid "θ:"
 msgstr "θ:"
 
-#: libgwydgets/gwy3dwindow.c:839 modules/process/cwt.c:151
+#: libgwydgets/gwy3dwindow.c:849 modules/process/cwt.c:151
 msgid "_Scale:"
 msgstr "_Scale:"
 
-#: libgwydgets/gwy3dwindow.c:846
+#: libgwydgets/gwy3dwindow.c:856
 msgid "_Value scale:"
 msgstr "_Value scale:"
 
-#: libgwydgets/gwy3dwindow.c:851
+#: libgwydgets/gwy3dwindow.c:862
 msgid "Ph_ysical scale:"
 msgstr "Ph_ysical scale:"
 
-#: libgwydgets/gwy3dwindow.c:865
+#: libgwydgets/gwy3dwindow.c:876
 msgid "verb|Set"
 msgstr "Set"
 
-#: libgwydgets/gwy3dwindow.c:877
+#: libgwydgets/gwy3dwindow.c:886
 msgid "Line _width:"
 msgstr "Line _width:"
 
-#: libgwydgets/gwy3dwindow.c:881
+#: libgwydgets/gwy3dwindow.c:886 libgwydgets/gwy3dwindow.c:1194
+#: libgwydgets/gwy3dwindow.c:1204 libgwydgets/gwy3dwindow.c:1235
+#: libgwydgets/gwygraphareadialog.c:157 libgwydgets/gwygraphareadialog.c:173
+#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
+#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
+#: modules/process/angle_dist.c:188 modules/process/angle_dist.c:213
+#: modules/process/col_synth.c:486 modules/process/crosscor.c:252
+#: modules/process/crosscor.c:260 modules/process/crosscor.c:276
+#: modules/process/crosscor.c:284 modules/process/crosscor.c:300
+#: modules/process/crosscor.c:308 modules/process/cwt.c:151
+#: modules/process/dimensions.h:88 modules/process/edge.c:672
+#: modules/process/entropy.c:242 modules/process/extend.c:220
+#: modules/process/extend.c:227 modules/process/extend.c:234
+#: modules/process/extend.c:241 modules/process/facet_analysis.c:362
+#: modules/process/fbm_synth.c:383 modules/process/hough.c:203
+#: modules/process/local_contrast.c:146 modules/process/mark_disconn.c:263
+#: modules/process/mask_morph.c:237 modules/process/median-bg.c:209
+#: modules/process/neural.c:623 modules/process/neural.c:631
+#: modules/process/psdf_logphi.c:276 modules/process/rank.c:188
+#: modules/process/scale.c:237 modules/process/scale.c:246
+#: modules/process/scars.c:353 modules/process/scars.c:361
+#: modules/process/semsim.c:227 modules/process/slope_dist.c:365
+#: modules/process/slope_dist.c:393 modules/process/sphere-revolve.c:346
+#: modules/process/straighten_path.c:278 modules/process/synth.h:280
+#: modules/process/synth.h:501 modules/process/tip_blind.c:334
+#: modules/process/tip_blind.c:342 modules/process/volumize_layers.c:240
+#: modules/process/volumize_layers.c:245 modules/process/volumize_layers.c:250
+#: modules/process/wpour_mark.c:320 modules/tools/filter.c:291
+#: modules/tools/level3.c:244 modules/tools/maskedit.c:528
+#: modules/tools/maskedit.c:629 modules/tools/pathlevel.c:256
+#: modules/tools/profile.c:377 modules/tools/profile.c:503
+#: modules/tools/readvalue.c:222 modules/tools/readvalue.c:378
+#: modules/tools/roughness.c:868 modules/volume/volume_slice.c:446
+#: modules/volume/volume_slice.c:469 modules/volume/volume_slice.c:492
+#: modules/xyz/xyz_drift.c:738 modules/xyz/xyz_drift.c:753
+#: modules/xyz/xyz_raster.c:382 modules/xyz/xyz_raster.c:388
+msgid "px"
+msgstr "px"
+
+#: libgwydgets/gwy3dwindow.c:891
 msgid "Show _axes"
 msgstr "Show _axes"
 
-#: libgwydgets/gwy3dwindow.c:890
+#: libgwydgets/gwy3dwindow.c:900
 msgid "Show _labels"
 msgstr "Show _labels"
 
-#: libgwydgets/gwy3dwindow.c:899
-msgid "Show false _colorbar"
-msgstr "Show false _colourbar"
-
-#: libgwydgets/gwy3dwindow.c:908
+#: libgwydgets/gwy3dwindow.c:909
 msgid "_Orthographic projection"
 msgstr "_Orthographic projection"
 
-#: libgwydgets/gwy3dwindow.c:917
+#: libgwydgets/gwy3dwindow.c:918
 msgid "_Hide masked"
 msgstr "_Hide masked"
 
-#: libgwydgets/gwy3dwindow.c:933
+#: libgwydgets/gwy3dwindow.c:934
 msgid "_Lighting"
 msgstr "_Lighting"
 
-#: libgwydgets/gwy3dwindow.c:934
+#: libgwydgets/gwy3dwindow.c:935
 msgid "_Gradient"
 msgstr "_Gradient"
 
-#: libgwydgets/gwy3dwindow.c:935
+#: libgwydgets/gwy3dwindow.c:936
 msgid "_Overlay"
 msgstr "_Overlay"
 
-#: libgwydgets/gwy3dwindow.c:936
+#: libgwydgets/gwy3dwindow.c:937
 msgid "_Overlay - no light"
 msgstr "_Overlay – no light"
 
-#: libgwydgets/gwy3dwindow.c:1009
+#: libgwydgets/gwy3dwindow.c:992
 msgid "_Material:"
 msgstr "_Material:"
 
-#: libgwydgets/gwy3dwindow.c:1032
+#: libgwydgets/gwy3dwindow.c:1013
 msgid "_Light φ:"
 msgstr "_Light φ:"
 
-#: libgwydgets/gwy3dwindow.c:1040
+#: libgwydgets/gwy3dwindow.c:1020
 msgid "L_ight θ:"
 msgstr "L_ight θ:"
 
-#: libgwydgets/gwy3dwindow.c:1070 libgwydgets/gwy3dwindow.c:1240
-#: app/toolbox-editor.c:215 modules/file/hdrimage.cc:2213
-#: modules/file/imgexport.c:4760 modules/file/pixmap.c:789
+#: libgwydgets/gwy3dwindow.c:1052 libgwydgets/gwy3dwindow.c:1243
+#: app/toolbox-editor.c:216 modules/file/hdrimage.cc:2213
+#: modules/file/imgexport.c:4708 modules/file/pixmap.c:789
 #: modules/file/rawfile.c:424 modules/process/angle_dist.c:172
 #: modules/process/bdep_synth.c:341 modules/process/calcoefs_new.c:371
-#: modules/process/calibrate.c:391 modules/process/col_synth.c:392
-#: modules/process/correct_affine.c:301 modules/process/curvature.c:615
-#: modules/process/cwt.c:135 modules/process/deposit_synth.c:349
+#: modules/process/calibrate.c:383 modules/process/col_synth.c:392
+#: modules/process/correct_affine.c:346 modules/process/curvature.c:617
+#: modules/process/cwt.c:135 modules/process/deposit_synth.c:350
 #: modules/process/diff_synth.c:411 modules/process/domain_synth.c:354
 #: modules/process/drift.c:245 modules/process/dwt.c:166
 #: modules/process/dwtanisotropy.c:184 modules/process/edge.c:638
 #: modules/process/extend.c:192 modules/process/facet-level.c:193
-#: modules/process/facet_analysis.c:271 modules/process/fbm_synth.c:303
+#: modules/process/facet_analysis.c:275 modules/process/fbm_synth.c:303
 #: modules/process/fft.c:336 modules/process/fft_filter_2d.c:417
-#: modules/process/fft_synth.c:341 modules/process/fractal.c:231
-#: modules/process/grain_edge.c:213 modules/process/grain_mark.c:247
-#: modules/process/grain_wshed.c:167 modules/process/hough.c:179
-#: modules/process/lat_synth.c:567 modules/process/latsim.c:159
-#: modules/process/level.c:245 modules/process/linematch.c:804
-#: modules/process/lno_synth.c:433 modules/process/local_contrast.c:130
-#: modules/process/logistic.c:234 modules/process/mark_disconn.c:208
-#: modules/process/mask_distribute.c:152 modules/process/measure_lattice.c:256
-#: modules/process/median-bg.c:180 modules/process/noise_synth.c:336
-#: modules/process/obj_synth.c:441 modules/process/pat_synth.c:385
-#: modules/process/pid.c:199 modules/process/polydistort.c:210
-#: modules/process/polylevel.c:373 modules/process/psdf_logphi.c:249
-#: modules/process/rank.c:158 modules/process/rotate.c:243
-#: modules/process/scale.c:196 modules/process/scars.c:298
-#: modules/process/semsim.c:211 modules/process/shade.c:208
-#: modules/process/slope_dist.c:276 modules/process/sphere-revolve.c:218
-#: modules/process/straighten_path.c:249 modules/process/tilt.c:161
-#: modules/process/tip_model.c:169 modules/process/unrotate.c:220
-#: modules/process/volumize_layers.c:221 modules/process/wave_synth.c:349
-#: modules/process/wpour_mark.c:278 modules/volume/volume_calibrate.c:370
-#: modules/volume/volume_extract.c:331 modules/volume/volume_kmeans.c:153
-#: modules/volume/volume_kmedians.c:147 modules/volume/volume_linestat.c:292
-#: modules/volume/volume_slice.c:292
+#: modules/process/fft_synth.c:341 modules/process/fibre_synth.c:422
+#: modules/process/fractal.c:228 modules/process/grain_edge.c:212
+#: modules/process/grain_mark.c:246 modules/process/grain_wshed.c:168
+#: modules/process/hough.c:174 modules/process/lat_synth.c:567
+#: modules/process/latsim.c:159 modules/process/level.c:245
+#: modules/process/linematch.c:771 modules/process/lno_synth.c:431
+#: modules/process/local_contrast.c:130 modules/process/logistic.c:234
+#: modules/process/mark_disconn.c:208 modules/process/mask_distribute.c:152
+#: modules/process/measure_lattice.c:246 modules/process/median-bg.c:180
+#: modules/process/mfm_current.c:332 modules/process/mfm_field.c:281
+#: modules/process/mfm_findshift.c:230 modules/process/mfm_parallel.c:333
+#: modules/process/mfm_shift.c:170 modules/process/noise_synth.c:334
+#: modules/process/obj_synth.c:438 modules/process/pat_synth.c:385
+#: modules/process/phase_synth.c:205 modules/process/pid.c:197
+#: modules/process/polydistort.c:210 modules/process/polylevel.c:373
+#: modules/process/psdf_logphi.c:249 modules/process/rank.c:158
+#: modules/process/rotate.c:243 modules/process/scale.c:196
+#: modules/process/scars.c:317 modules/process/semsim.c:211
+#: modules/process/shade.c:210 modules/process/slope_dist.c:275
+#: modules/process/sphere-revolve.c:317 modules/process/straighten_path.c:248
+#: modules/process/tilt.c:161 modules/process/tip_model.c:167
+#: modules/process/unrotate.c:220 modules/process/volumize_layers.c:221
+#: modules/process/wave_synth.c:368 modules/process/wpour_mark.c:278
+#: modules/volume/volume_calibrate.c:370 modules/volume/volume_extract.c:324
+#: modules/volume/volume_kmeans.c:154 modules/volume/volume_kmedians.c:147
+#: modules/volume/volume_linestat.c:297 modules/volume/volume_slice.c:294
 msgid "_Reset"
 msgstr "_Reset"
 
-#: libgwydgets/gwy3dwindow.c:1142
+#: libgwydgets/gwy3dwindow.c:1141
 msgid "X-axis"
 msgstr "X-axis"
 
-#: libgwydgets/gwy3dwindow.c:1143
+#: libgwydgets/gwy3dwindow.c:1142
 msgid "Y-axis"
 msgstr "Y-axis"
 
-#: libgwydgets/gwy3dwindow.c:1144
+#: libgwydgets/gwy3dwindow.c:1143
 msgid "Minimum z value"
 msgstr "Minimum z-value"
 
-#: libgwydgets/gwy3dwindow.c:1145
+#: libgwydgets/gwy3dwindow.c:1144
 msgid "Maximum z value"
 msgstr "Maximum z-value"
 
-#: libgwydgets/gwy3dwindow.c:1168 modules/file/imgexport.c:3836
+#: libgwydgets/gwy3dwindow.c:1167 modules/file/imgexport.c:3806
 msgid "_Label:"
 msgstr "_Label:"
 
-#: libgwydgets/gwy3dwindow.c:1173
+#: libgwydgets/gwy3dwindow.c:1180
 msgid "_Text:"
 msgstr "_Text:"
 
-#: libgwydgets/gwy3dwindow.c:1193
+#: libgwydgets/gwy3dwindow.c:1185
 msgid "Move label"
 msgstr "Move label"
 
-#: libgwydgets/gwy3dwindow.c:1202
+#: libgwydgets/gwy3dwindow.c:1194
 msgid "_Horizontally:"
 msgstr "_Horizontally:"
 
-#: libgwydgets/gwy3dwindow.c:1212
+#: libgwydgets/gwy3dwindow.c:1204
 msgid "_Vertically:"
 msgstr "_Vertically:"
 
-#: libgwydgets/gwy3dwindow.c:1220
+#: libgwydgets/gwy3dwindow.c:1212
+msgid "A_ll labels have the same size"
+msgstr "A_ll labels have the same size"
+
+#: libgwydgets/gwy3dwindow.c:1223
 msgid "Scale size _automatically"
 msgstr "Scale size _automatically"
 
-#: libgwydgets/gwy3dwindow.c:1232 modules/tools/filter.c:290
+#: libgwydgets/gwy3dwindow.c:1235 modules/tools/filter.c:291
 msgid "Si_ze:"
 msgstr "Si_ze:"
 
-#: libgwydgets/gwy3dwindow.c:1232 modules/process/cwt.c:151
-#: modules/process/hough.c:212
-msgid "pixels"
-msgstr "pixels"
+#: libgwydgets/gwy3dwindow.c:1277
+msgid "Show false _colorbar"
+msgstr "Show false _colourbar"
+
+#: libgwydgets/gwy3dwindow.c:1286
+msgid "Reserve space for _colorbar"
+msgstr "Reserve space for _colourbar"
+
+#: libgwydgets/gwy3dwindow.c:1302 modules/process/lat_synth.c:651
+#: modules/process/obj_synth.c:542 modules/process/pat_synth.c:1458
+#: modules/process/phase_synth.c:279
+msgid "_Size:"
+msgstr "_Size:"
+
+#: libgwydgets/gwy3dwindow.c:1311
+msgid "_Vertical alignment:"
+msgstr "_Vertical alignment:"
 
-#: libgwydgets/gwy3dwindow.c:1726 libgwydgets/gwy3dwindow.c:1779
+#: libgwydgets/gwy3dwindow.c:1844 libgwydgets/gwy3dwindow.c:1897
 msgid "S_witch to Lighting Mode"
 msgstr "S_witch to Lighting Mode"
 
-#: libgwydgets/gwy3dwindow.c:1734 libgwydgets/gwy3dwindow.c:1756
+#: libgwydgets/gwy3dwindow.c:1852 libgwydgets/gwy3dwindow.c:1874
 msgid "S_witch to Overlay Mode"
 msgstr "S_witch to Overlay Mode"
 
-#: libgwydgets/gwy3dwindow.c:1748 libgwydgets/gwy3dwindow.c:1771
+#: libgwydgets/gwy3dwindow.c:1866 libgwydgets/gwy3dwindow.c:1889
 msgid "S_witch to Color Gradient Mode"
 msgstr "S_witch to Colour Gradient Mode"
 
-#: libgwydgets/gwy3dwindow.c:1787
+#: libgwydgets/gwy3dwindow.c:1905
 msgid "T_oggle light"
 msgstr "T_oggle light"
 
-#: libgwydgets/gwyaxisdialog.c:99
+#: libgwydgets/gwyaxisdialog.c:75
 msgid "Axis Properties"
 msgstr "Axis Properties"
 
-#: libgwydgets/gwyaxisdialog.c:101 libgwydgets/gwygraphlabeldialog.c:63
-msgid "Label Properties"
-msgstr "Label Properties"
-
-#: libgwydgets/gwyaxisdialog.c:184
+#: libgwydgets/gwyaxisdialog.c:88
 msgid "Label Text"
 msgstr "Label Text"
 
@@ -1082,7 +1150,7 @@ msgid "Hidden"
 msgstr "Hidden"
 
 #: libgwydgets/gwydgetenums.c:47 libgwydgets/gwygraphwindowmeasuredialog.c:572
-#: modules/file/imgexport.c:475 modules/tools/selectionmanager.c:274
+#: modules/file/imgexport.c:474 modules/tools/selectionmanager.c:274
 msgid "Points"
 msgstr "Points"
 
@@ -1090,7 +1158,7 @@ msgstr "Points"
 msgid "Line + points"
 msgstr "Line + points"
 
-#: libgwydgets/gwydgetutils.c:564
+#: libgwydgets/gwydgetutils.c:848
 msgid "Change Mask Color"
 msgstr "Change Mask Colour"
 
@@ -1099,7 +1167,7 @@ msgid "Quantity"
 msgstr "Quantity"
 
 #: libgwydgets/gwygrainvaluemenu.c:194 libgwydgets/gwygrainvaluemenu.c:207
-#: modules/process/curvature.c:753
+#: modules/process/curvature.c:750
 msgid "Symbol"
 msgstr "Symbol"
 
@@ -1119,137 +1187,141 @@ msgstr "Pre_v"
 msgid "_Next"
 msgstr "_Next"
 
-#: libgwydgets/gwygraphareadialog.c:127 modules/file/rawgraph.c:302
+#: libgwydgets/gwygraphareadialog.c:123 modules/file/rawgraph.c:302
 msgid "Plot _style:"
 msgstr "Plot _style:"
 
-#: libgwydgets/gwygraphareadialog.c:148
+#: libgwydgets/gwygraphareadialog.c:131
 msgid "Pl_ot color:"
 msgstr "Pl_ot colour:"
 
-#: libgwydgets/gwygraphareadialog.c:159
+#: libgwydgets/gwygraphareadialog.c:151
 msgid "Point _type:"
 msgstr "Point _type:"
 
-#: libgwydgets/gwygraphareadialog.c:165
+#: libgwydgets/gwygraphareadialog.c:157
 msgid "_Point size:"
 msgstr "_Point size:"
 
-#: libgwydgets/gwygraphareadialog.c:175
+#: libgwydgets/gwygraphareadialog.c:167
 msgid "_Line type:"
 msgstr "_Line type:"
 
-#: libgwydgets/gwygraphareadialog.c:181 modules/file/imgexport.c:3150
+#: libgwydgets/gwygraphareadialog.c:173 modules/file/imgexport.c:3154
 msgid "Line t_hickness:"
 msgstr "Line t_hickness:"
 
-#: libgwydgets/gwygraphareadialog.c:187
+#: libgwydgets/gwygraphareadialog.c:180
 msgid "<b>Label Te_xt</b>"
 msgstr "<b>Label Te_xt</b>"
 
-#: libgwydgets/gwygraphareadialog.c:404
+#: libgwydgets/gwygraphareadialog.c:397
 msgid "Set Curve Color"
 msgstr "Set Curve Colour"
 
-#: libgwydgets/gwygraphareadialog.c:556 modules/process/mask_morph.c:179
+#: libgwydgets/gwygraphareadialog.c:549 modules/process/mask_morph.c:178
 msgid "Square"
 msgstr "Square"
 
-#: libgwydgets/gwygraphareadialog.c:558 modules/process/mask_morph.c:180
+#: libgwydgets/gwygraphareadialog.c:551 modules/process/mask_morph.c:179
 msgid "Diamond"
 msgstr "Diamond"
 
-#: libgwydgets/gwygraphareadialog.c:559
+#: libgwydgets/gwygraphareadialog.c:552
 msgid "Cross"
 msgstr "Cross"
 
-#: libgwydgets/gwygraphareadialog.c:560
+#: libgwydgets/gwygraphareadialog.c:553
 msgid "Diagonal cross"
 msgstr "Diagonal cross"
 
-#: libgwydgets/gwygraphareadialog.c:561
+#: libgwydgets/gwygraphareadialog.c:554
 msgid "Asterisk"
 msgstr "Asterisk"
 
-#: libgwydgets/gwygraphareadialog.c:562
+#: libgwydgets/gwygraphareadialog.c:555
 msgid "Star"
 msgstr "Star"
 
-#: libgwydgets/gwygraphareadialog.c:563
+#: libgwydgets/gwygraphareadialog.c:556
 msgid "Triangle up"
 msgstr "Triangle up"
 
-#: libgwydgets/gwygraphareadialog.c:564
+#: libgwydgets/gwygraphareadialog.c:557
 msgid "Triangle down"
 msgstr "Triangle down"
 
-#: libgwydgets/gwygraphareadialog.c:565
+#: libgwydgets/gwygraphareadialog.c:558
 msgid "Triangle left"
 msgstr "Triangle left"
 
-#: libgwydgets/gwygraphareadialog.c:566
+#: libgwydgets/gwygraphareadialog.c:559
 msgid "Triangle right"
 msgstr "Triangle right"
 
-#: libgwydgets/gwygraphareadialog.c:567
+#: libgwydgets/gwygraphareadialog.c:560
 msgid "Full square"
 msgstr "Full square"
 
-#: libgwydgets/gwygraphareadialog.c:568 modules/process/mask_morph.c:177
+#: libgwydgets/gwygraphareadialog.c:561 modules/process/mask_morph.c:176
 msgid "Disc"
 msgstr "Disc"
 
-#: libgwydgets/gwygraphareadialog.c:569
+#: libgwydgets/gwygraphareadialog.c:562
 msgid "Full diamond"
 msgstr "Full diamond"
 
-#: libgwydgets/gwygraphareadialog.c:570
+#: libgwydgets/gwygraphareadialog.c:563
 msgid "Full triangle up"
 msgstr "Full triangle up"
 
-#: libgwydgets/gwygraphareadialog.c:571
+#: libgwydgets/gwygraphareadialog.c:564
 msgid "Full triangle down"
 msgstr "Full triangle down"
 
-#: libgwydgets/gwygraphareadialog.c:572
+#: libgwydgets/gwygraphareadialog.c:565
 msgid "Full triangle left"
 msgstr "Full triangle left"
 
-#: libgwydgets/gwygraphareadialog.c:573
+#: libgwydgets/gwygraphareadialog.c:566
 msgid "Full triangle right"
 msgstr "Full triangle right"
 
-#: libgwydgets/gwygraphareadialog.c:635
+#: libgwydgets/gwygraphareadialog.c:628
 msgid "line-style|Solid"
 msgstr "Solid"
 
-#: libgwydgets/gwygraphareadialog.c:636
+#: libgwydgets/gwygraphareadialog.c:629
 msgid "line-style|Dash"
 msgstr "Dash"
 
-#: libgwydgets/gwygraphcurves.c:451
+#: libgwydgets/gwygraphcurves.c:448
 msgid "Description"
 msgstr "Description"
 
-#: libgwydgets/gwygraphcurves.c:463
+#: libgwydgets/gwygraphcurves.c:460
 msgid "Mode"
 msgstr "Mode"
 
-#: libgwydgets/gwygraphcurves.c:481
+#: libgwydgets/gwygraphcurves.c:478
 msgid "Color"
 msgstr "Colour"
 
-#: libgwydgets/gwygraphcurves.c:494
+#: libgwydgets/gwygraphcurves.c:491
 msgid "Point Type"
 msgstr "Point Type"
 
-#: libgwydgets/gwygraphcurves.c:516
+#: libgwydgets/gwygraphcurves.c:513
 msgid "Line Style"
 msgstr "Line Style"
 
+#: libgwydgets/gwygraphlabeldialog.c:63
+msgid "Label Properties"
+msgstr "Label Properties"
+
 #: libgwydgets/gwygraphlabeldialog.c:74
-msgid "Frame thickness:"
-msgstr "Frame thickness:"
+msgid "_Frame thickness:"
+msgstr "_Frame thickness:"
 
 #: libgwydgets/gwygraphlabeldialog.c:81
 msgid "_Reversed layout"
@@ -1259,12 +1331,12 @@ msgstr "_Reversed layout"
 msgid "Abscissa"
 msgstr "Abscissa"
 
-#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1002 app/toolbox.c:108
+#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1015 app/toolbox.c:113
 msgid "Graph"
 msgstr "Graph"
 
 #: libgwydgets/gwygraphwindow.c:170 modules/file/hdrimage.cc:472
-#: modules/process/fit-shape.c:656
+#: modules/process/fit-shape.c:666 modules/process/psf.c:229
 msgid "Data"
 msgstr "Data"
 
@@ -1302,15 +1374,15 @@ msgstr "Points anywhere"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:394
 #: libgwydgets/gwygraphwindowmeasuredialog.c:580 modules/tools/linestats.c:170
-#: modules/tools/roughness.c:516 modules/volume/volume_linestat.c:157
+#: modules/tools/roughness.c:517 modules/volume/volume_linestat.c:159
 msgid "Length"
 msgstr "Length"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:398
 #: libgwydgets/gwygraphwindowmeasuredialog.c:588 app/gwyplaintool.c:1018
-#: modules/process/lat_synth.c:747 modules/process/obj_synth.c:569
-#: modules/process/pat_synth.c:846 modules/process/pat_synth.c:1148
-#: modules/process/pat_synth.c:1483
+#: modules/process/fibre_synth.c:534 modules/process/lat_synth.c:747
+#: modules/process/obj_synth.c:567 modules/process/pat_synth.c:847
+#: modules/process/pat_synth.c:1149 modules/process/pat_synth.c:1484
 msgid "Height"
 msgstr "Height"
 
@@ -1323,12 +1395,12 @@ msgid "Curve:"
 msgstr "Curve:"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:553
-#: modules/process/linematch.c:828 modules/process/semsim.c:249
+#: modules/process/linematch.c:795 modules/process/semsim.c:249
 #: modules/xyz/xyz_level.c:254
 msgid "Method:"
 msgstr "Method:"
 
-#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:354
+#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:331
 msgid "Angle"
 msgstr "Angle"
 
@@ -1338,7 +1410,7 @@ msgid "Preferred"
 msgstr "Preferred"
 
 #: libgwydgets/gwyoptionmenus.c:470 app/meta.c:410
-#: modules/file/imgexport.c:4160 modules/file/imgexport.c:4607
+#: modules/file/imgexport.c:4110 modules/file/imgexport.c:4555
 #: modules/file/rawfile.c:995 modules/process/convolution_filter.c:538
 #: modules/process/neural.c:418 modules/tools/selectionmanager.c:345
 msgid "Name"
@@ -1377,7 +1449,7 @@ msgid "A_dd symbol"
 msgstr "A_dd symbol"
 
 #: libgwydgets/gwyscitext.c:274 modules/file/rawfile.c:553
-#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:405
+#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:419
 msgid "Preview"
 msgstr "Preview"
 
@@ -1395,87 +1467,81 @@ msgstr "No module can load this file type."
 msgid "No module can save to this file type."
 msgstr "No module can save to this file type."
 
-#: libgwymodule/gwymodulebrowser.c:67
+#: libgwymodule/gwymodulebrowser.c:66
 msgid "Module Browser"
 msgstr "Module Browser"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Module"
 msgstr "Module"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Version"
 msgstr "Version"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Author"
 msgstr "Author"
 
-#: libgwymodule/gwymodulebrowser.c:246
+#: libgwymodule/gwymodulebrowser.c:244
 msgid "Name-Version:"
 msgstr "Name-Version:"
 
-#: libgwymodule/gwymodulebrowser.c:247 libgwymodule/gwymodulebrowser.c:270
+#: libgwymodule/gwymodulebrowser.c:245 libgwymodule/gwymodulebrowser.c:268
 #: modules/process/grain_stat.c:186
 msgid "File:"
 msgstr "File:"
 
-#: libgwymodule/gwymodulebrowser.c:248
+#: libgwymodule/gwymodulebrowser.c:246
 msgid "Registered functions:"
 msgstr "Registered functions:"
 
-#: libgwymodule/gwymodulebrowser.c:249
+#: libgwymodule/gwymodulebrowser.c:247
 msgid "Authors:"
 msgstr "Authors:"
 
-#: libgwymodule/gwymodulebrowser.c:250
+#: libgwymodule/gwymodulebrowser.c:248
 msgid "Copyright:"
 msgstr "Copyright:"
 
-#: libgwymodule/gwymodulebrowser.c:251
+#: libgwymodule/gwymodulebrowser.c:249
 msgid "Date:"
 msgstr "Date:"
 
-#: libgwymodule/gwymodulebrowser.c:252
+#: libgwymodule/gwymodulebrowser.c:250
 msgid "Description:"
 msgstr "Description:"
 
-#: libgwymodule/gwymodulebrowser.c:269
+#: libgwymodule/gwymodulebrowser.c:267
 msgid "Name:"
 msgstr "Name:"
 
-#: libgwymodule/gwymodulebrowser.c:271
+#: libgwymodule/gwymodulebrowser.c:269
 msgid "Failure:"
 msgstr "Failure:"
 
-#: app/about.c:57
+#: app/about.c:58
 #, c-format
 msgid "About %s"
 msgstr "About %s"
 
-#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
-#: app/about.c:92
-#, c-format
-msgid "Released %s\n"
-msgstr "Released %s\n"
-
-#: app/about.c:93
+#: app/about.c:97
 msgid "An SPM data visualization and analysis tool."
 msgstr "An SPM data visualisation and analysis tool."
 
-#: app/about.c:101
+#: app/about.c:105
 msgid "Report bugs to:"
 msgstr "Report bugs to:"
 
-#: app/about.c:116
+#: app/about.c:120
 msgid "Credits"
 msgstr "Credits"
 
-#: app/about.c:133
+#: app/about.c:137
 msgid "License"
 msgstr "Licence"
 
-#: app/about.c:138
+#: app/about.c:142
 #, c-format
 msgid ""
 "%s is free software; you can redistribute it and/or modify it under the "
@@ -1490,58 +1556,62 @@ msgstr ""
 "version. For full licence text see file COPYING included in the source "
 "tarball."
 
-#: app/about.c:160 modules/process/logistic.c:270
+#: app/about.c:164 modules/process/logistic.c:269
 msgid "Features"
 msgstr "Features"
 
-#: app/about.c:220
+#: app/about.c:224
 msgid "Developers"
 msgstr "Developers"
 
-#: app/about.c:221
+#: app/about.c:225
 msgid "Translators"
 msgstr "Translators"
 
-#: app/about.c:225
+#: app/about.c:229
 msgid "Development is supported by the Czech Metrology Institute: "
 msgstr "Development is supported by the Czech Metrology Institute: "
 
-#: app/about.c:253 app/about.c:256
+#: app/about.c:257 app/about.c:260
 msgid "OpenGL 3D View"
 msgstr "OpenGL 3D View"
 
-#: app/about.c:257 app/about.c:271 app/about.c:291
+#: app/about.c:261 app/about.c:266 app/about.c:286
 msgid "not available\n"
 msgstr "not available\n"
 
-#: app/about.c:262 app/about.c:265
-msgid "Fast Fourier Transform"
-msgstr "Fast Fourier Transform"
-
-#: app/about.c:266
-msgid "built-in SimpleFFT\n"
-msgstr "built-in SimpleFFT\n"
-
-#: app/about.c:274
+#: app/about.c:269
 msgid "X11 protocol\n"
 msgstr "X11 protocol\n"
 
-#: app/about.c:276
+#: app/about.c:271
 msgid "Win32 protocol\n"
 msgstr "Win32 protocol\n"
 
-#: app/about.c:278
+#: app/about.c:273
 msgid "LibUnique\n"
 msgstr "LibUnique\n"
 
-#: app/about.c:282
+#: app/about.c:277
 msgid "Remote Control"
 msgstr "Remote Control"
 
-#: app/about.c:286 app/about.c:290
+#: app/about.c:281 app/about.c:285
 msgid "Python Scripting Interface"
 msgstr "Python Scripting Interface"
 
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:311
+#, c-format
+msgid "Development version, built %s"
+msgstr "Development version, built %s"
+
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:328
+#, c-format
+msgid "Released %s"
+msgstr "Released %s"
+
 #: app/app.c:301
 #, c-format
 msgid ""
@@ -1553,116 +1623,124 @@ msgstr ""
 "%s\n"
 "Really quit?"
 
-#: app/app.c:440
+#: app/app.c:442
 msgid "Mask _Color..."
 msgstr "Mask _Colour..."
 
-#: app/app.c:456 app/app.c:1725
+#: app/app.c:458 app/app.c:1754
 msgid "Zoom _1:1"
 msgstr "Zoom _1:1"
 
-#: app/app.c:460 app/app.c:1729 app/app.c:1957
+#: app/app.c:462 app/app.c:1758 app/app.c:1988
 msgid "Metadata _Browser..."
 msgstr "Metadata _Browser..."
 
-#: app/app.c:465 app/app.c:1734 app/app.c:1962
+#: app/app.c:467 app/app.c:1763 app/app.c:1993
 msgid "View _Log..."
 msgstr "View _Log..."
 
-#: app/app.c:649
+#: app/app.c:651
 msgid "Pi_xelwise Square"
 msgstr "Pi_xel-wise Square"
 
-#: app/app.c:659
+#: app/app.c:661
 msgid "_Physically Square"
 msgstr "_Physically Square"
 
-#: app/app.c:836
+#: app/app.c:842
+msgid "Set as Default"
+msgstr "Set as Default"
+
+#: app/app.c:844
+msgid "Set the current view setup as the default"
+msgstr "Set the current view setup as the default"
+
+#: app/app.c:854
 msgid "verb|Save"
 msgstr "Save"
 
-#: app/app.c:839 app/app.c:843
+#: app/app.c:857 app/app.c:861
 msgid "Save 3D view to an image"
 msgstr "Save 3D view to an image"
 
-#: app/app.c:849
-msgid "Set as Default"
-msgstr "Set as Default"
+#: app/app.c:869
+msgid "_Autocrop"
+msgstr "_Autocrop"
 
-#: app/app.c:851
-msgid "Set the current view setup as the default"
-msgstr "Set the current view setup as the default"
+#: app/app.c:873
+msgid "Remove white borders from exported image"
+msgstr "Remove white borders from exported image"
 
-#: app/app.c:940
+#: app/app.c:960
 msgid "_Show mask"
 msgstr "_Show mask"
 
-#: app/app.c:1106
+#: app/app.c:1172
 #, c-format
 msgid "Saving of 3D view to `%s' failed"
 msgstr "Saving of 3D view to ‘%s’ failed"
 
-#: app/app.c:1150
+#: app/app.c:1222
 msgid "Export 3D View"
 msgstr "Export 3D View"
 
-#: app/app.c:1457
+#: app/app.c:1478
 msgid "_Change Preview"
 msgstr "_Change Preview"
 
-#: app/app.c:1583
+#: app/app.c:1606
 msgid "Change Volume Data Preview"
 msgstr "Change Volume Data Preview"
 
-#: app/app.c:1593
+#: app/app.c:1616
 msgid "Preview quantity:"
 msgstr "Preview quantity:"
 
-#: app/app.c:1603 modules/process/extend.c:267 modules/tools/linestats.c:165
+#: app/app.c:1626 modules/process/extend.c:267 modules/tools/linestats.c:165
 #: modules/volume/volume_linestat.c:142
 msgid "Mean"
 msgstr "Average value"
 
-#: app/app.c:1604 modules/process/polydistort.c:255 modules/tools/filter.c:240
+#: app/app.c:1627 modules/process/polydistort.c:258 modules/tools/filter.c:241
 #: modules/tools/icolorange.c:424 modules/tools/linestats.c:167
 #: modules/volume/volume_linestat.c:144
 msgid "Minimum"
 msgstr "Minimum"
 
-#: app/app.c:1605 modules/process/col_synth.c:170 modules/tools/filter.c:241
+#: app/app.c:1628 modules/process/col_synth.c:170 modules/tools/filter.c:242
 #: modules/tools/icolorange.c:435 modules/tools/linestats.c:168
 #: modules/volume/volume_linestat.c:145
 msgid "Maximum"
 msgstr "Maximum"
 
-#: app/app.c:1606
+#: app/app.c:1629 modules/volume/volume_linestat.c:146
 msgid "Min. position"
 msgstr "Min. position"
 
-#: app/app.c:1607
+#: app/app.c:1630 modules/volume/volume_linestat.c:147
 msgid "Max. position"
 msgstr "Max. position"
 
-#: app/app.c:1608 modules/process/bdep_synth.c:134
-#: modules/process/col_synth.c:171 modules/process/scars.c:346
-#: modules/process/scars.c:353 modules/process/threshold.c:341
+#: app/app.c:1631 modules/process/bdep_synth.c:134
+#: modules/process/col_synth.c:171 modules/process/scars.c:369
+#: modules/process/scars.c:377 modules/process/threshold.c:336
 msgid "RMS"
 msgstr "RMS"
 
-#: app/app.c:1609 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
-#: modules/file/xyzexport.c:233 modules/file/xyzexport.c:302
+#: app/app.c:1632 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
+#: modules/file/xyzexport.c:236 modules/file/xyzexport.c:305
 msgid "Channel:"
 msgstr "Channel:"
 
-#: app/app.c:1610
+#: app/app.c:1633
 msgid "Section:"
 msgstr "Section:"
 
-#: app/app.c:1861
+#: app/app.c:1890
 msgid "_Update Preview"
 msgstr "_Update Preview"
 
-#: app/app.c:1867
+#: app/app.c:1896
 msgid "_Density Map"
 msgstr "_Density Map"
 
@@ -1681,12 +1759,12 @@ msgstr "Unknown volume %d"
 msgid "Unknown XYZ %d"
 msgstr "Unknown XYZ %d"
 
-#: app/data-browser-aux.c:2795
+#: app/data-browser-aux.c:2839
 #, c-format
 msgid "Z levels: %d, Z unit: %s"
 msgstr "Z levels: %d, Z unit: %s"
 
-#: app/data-browser-aux.c:2821
+#: app/data-browser-aux.c:2865
 #, c-format
 msgid "Points: %d"
 msgstr "Points: %d"
@@ -1716,10 +1794,10 @@ msgid "Close file"
 msgstr "Close file"
 
 #: app/data-browser.c:5582
-msgid "Channels"
-msgstr "Channels"
+msgid "Images"
+msgstr "Images"
 
-#: app/data-browser.c:5596 modules/volume/volume_extract.c:444
+#: app/data-browser.c:5596 modules/volume/volume_extract.c:431
 msgid "Graphs"
 msgstr "Graphs"
 
@@ -1775,52 +1853,52 @@ msgstr ""
 "\n"
 "%s"
 
-#: app/file.c:285
+#: app/file.c:292
 #, c-format
 msgid "Opening of `%s' failed"
 msgstr "Opening of ‘%s’ failed"
 
-#: app/file.c:291 app/file.c:526
+#: app/file.c:298 app/file.c:533
 #, c-format
 msgid "Full file path: %s."
 msgstr "Full file path: %s."
 
-#: app/file.c:294
+#: app/file.c:301
 #, c-format
 msgid "Loaded using: %s."
 msgstr "Loaded using: %s."
 
-#: app/file.c:380
+#: app/file.c:387
 msgid "Merge File"
 msgstr "Merge File"
 
-#: app/file.c:382 app/gwyappfilechooser.c:221
+#: app/file.c:389 app/gwyappfilechooser.c:226
 msgid "Open File"
 msgstr "Open File"
 
-#: app/file.c:520 app/gwymoduleutils.c:192
+#: app/file.c:527 app/gwymoduleutils.c:192
 #, c-format
 msgid "Saving of `%s' failed"
 msgstr "Saving of ’%s‘ failed"
 
-#: app/file.c:529
+#: app/file.c:536
 #, c-format
 msgid "Saved using: %s."
 msgstr "Saved using: %s."
 
-#: app/file.c:689
+#: app/file.c:696
 #, c-format
 msgid "File `%s' already exists.  Replace?"
 msgstr "File ‘%s’ already exists.  Replace?"
 
-#: app/file.c:693
+#: app/file.c:700
 #, c-format
 msgid ""
 "The file already exists in `%s'.  Replacing it will overwrite its contents."
 msgstr ""
 "The file already exists in ‘%s’.  Replacing it will overwrite its contents."
 
-#: app/file.c:696
+#: app/file.c:703
 msgid "Replace File?"
 msgstr "Replace File?"
 
@@ -1844,11 +1922,11 @@ msgstr "Close file list"
 msgid "Open selected file"
 msgstr "Open selected file"
 
-#: app/filelist.c:566 app/gwyappfilechooser.c:583
+#: app/filelist.c:566 app/gwyappfilechooser.c:592
 msgid "_Filter:"
 msgstr "_Filter:"
 
-#: app/filelist.c:604 app/gwyappfilechooser.c:619
+#: app/filelist.c:604 app/gwyappfilechooser.c:628
 msgid "Case _sensitive"
 msgstr "Case _sensitive"
 
@@ -1898,97 +1976,97 @@ msgstr "_Curve"
 msgid "_Snap to control points"
 msgstr "_Snap to control points"
 
-#: app/gwyappfilechooser.c:226
+#: app/gwyappfilechooser.c:231
 msgid "Save File"
 msgstr "Save File"
 
-#: app/gwyappfilechooser.c:380
+#: app/gwyappfilechooser.c:389
 #, c-format
 msgid "File _type: %s"
 msgstr "File _type: %s"
 
-#: app/gwyappfilechooser.c:387
+#: app/gwyappfilechooser.c:396
 msgid "Only loadable shown"
 msgstr "Only loadable shown"
 
-#: app/gwyappfilechooser.c:391
+#: app/gwyappfilechooser.c:400
 #, c-format
 msgid "Filter: %s"
 msgstr "Filter: %s"
 
-#: app/gwyappfilechooser.c:455
+#: app/gwyappfilechooser.c:464
 msgid "Automatic by extension"
 msgstr "Automatic by extension"
 
-#: app/gwyappfilechooser.c:464
+#: app/gwyappfilechooser.c:473
 msgid "Automatically detected"
 msgstr "Automatically detected"
 
-#: app/gwyappfilechooser.c:561
+#: app/gwyappfilechooser.c:570
 msgid "Show only loadable files"
 msgstr "Show only loadable files"
 
-#: app/gwyappfilechooser.c:844
+#: app/gwyappfilechooser.c:855
 msgid "Plane-level previewed data"
 msgstr "Plane-level previewed data"
 
-#: app/gwyappfilechooser.c:860
+#: app/gwyappfilechooser.c:871
 msgid "Row-level previewed data"
 msgstr "Row-level previewed data"
 
-#: app/gwyappfilechooser.c:969
+#: app/gwyappfilechooser.c:987
+msgid "File too large for preview"
+msgstr "File is too large for preview"
+
+#: app/gwyappfilechooser.c:988
 msgid "…"
 msgstr "…"
 
-#: app/gwyappfilechooser.c:1331
+#: app/gwyappfilechooser.c:1352
 msgid "Cannot preview"
 msgstr "Cannot preview"
 
-#: app/gwyddion.c:143
+#: app/gwyddion.c:147
 msgid "Loading document history"
 msgstr "Loading document history"
 
-#: app/gwyddion.c:148
+#: app/gwyddion.c:152
 msgid "Registering "
 msgstr "Registering "
 
-#: app/gwyddion.c:149
+#: app/gwyddion.c:153
 msgid "stock items"
 msgstr "stock items"
 
-#: app/gwyddion.c:153
+#: app/gwyddion.c:157
 msgid "color gradients"
 msgstr "colour gradients"
 
-#: app/gwyddion.c:155
+#: app/gwyddion.c:159
 msgid "GL materials"
 msgstr "GL materials"
 
-#: app/gwyddion.c:157
+#: app/gwyddion.c:161
 msgid "grain quantities"
 msgstr "grain quantities"
 
-#: app/gwyddion.c:159
+#: app/gwyddion.c:163
 msgid "calibrations"
 msgstr "calibrations"
 
-#: app/gwyddion.c:164
+#: app/gwyddion.c:168
 msgid "Loading settings"
 msgstr "Loading settings"
 
-#: app/gwyddion.c:171
+#: app/gwyddion.c:175
 msgid "Registering modules"
 msgstr "Registering modules"
 
-#: app/gwyddion.c:193
-msgid "Initializing GUI"
-msgstr "Initialising GUI"
-
-#: app/gwyddion.c:439
+#: app/gwyddion.c:464
 msgid "Could not read settings."
 msgstr "Could not read settings."
 
-#: app/gwyddion.c:442
+#: app/gwyddion.c:467
 #, c-format
 msgid ""
 "Settings file `%s' cannot be read: %s\n"
@@ -2001,48 +2079,79 @@ msgstr ""
 "To prevent loss of saved settings no attempt to update it will be made until "
 "it is repaired or removed."
 
-#: app/gwymoduleutils-file.c:542
+#: app/gwyddion.c:505
+#, c-format
+msgid "Many modules (%u) failed to register."
+msgstr "Many modules (%u) failed to register."
+
+#: app/gwyddion.c:510
+#, c-format
+msgid ""
+"Most likely Gwyddion was not upgraded correctly.  Instead, one installation "
+"was just overwritten with another, and now it is a mess.\n"
+"\n"
+"Please remove completely the module directory\n"
+"\n"
+"%s\n"
+"\n"
+"and reinstall Gwyddion.\n"
+"\n"
+"See Info → Module Browser for specific errors."
+msgstr ""
+"Most likely Gwyddion was not upgraded correctly.  Instead, one installation "
+"was just overwritten with another, and now it is a mess.\n"
+"\n"
+"Please remove completely the module directory\n"
+"\n"
+"%s\n"
+"\n"
+"and reinstall Gwyddion.\n"
+"\n"
+"See Info → Module Browser for specific errors."
+
+#: app/gwymoduleutils-file.c:536
 #, c-format
 msgid "Section %s ended at line %u but it has never started."
 msgstr "Section %s ended at line %u but it has never started."
 
-#: app/gwymoduleutils-file.c:550
+#: app/gwymoduleutils-file.c:544
 #, c-format
 msgid "Section %s ended at line %u instead of %s."
 msgstr "Section %s ended at line %u instead of %s."
 
-#: app/gwymoduleutils-file.c:587
+#: app/gwymoduleutils-file.c:581
 #, c-format
 msgid "Section %s started at line %u before %s ended."
 msgstr "Section %s started at line %u before %s ended."
 
-#: app/gwymoduleutils-file.c:593
+#: app/gwymoduleutils-file.c:587
 #, c-format
 msgid "Empty section name at header line %u."
 msgstr "Empty section name at header line %u."
 
-#: app/gwymoduleutils-file.c:628
+#: app/gwymoduleutils-file.c:622
 #, c-format
 msgid "Header line %u lacks prefix %s."
 msgstr "Header line %u lacks prefix %s."
 
-#: app/gwymoduleutils-file.c:653
+#: app/gwymoduleutils-file.c:647
 #, c-format
 msgid "Header line %u lacks key-value separator."
 msgstr "Header line %u lacks key-value separator."
 
-#: app/gwymoduleutils-file.c:661
+#: app/gwymoduleutils-file.c:655
 #, c-format
 msgid "Key at header line %u is empty."
 msgstr "Key at header line %u is empty."
 
-#: app/gwymoduleutils-file.c:688
+#: app/gwymoduleutils-file.c:682
 #, c-format
 msgid "Header suddenly ended at line %u; end of header marker is missing"
 msgstr "Header has suddenly ended at line %u; end of header marker is missing"
 
 #: app/gwymoduleutils.c:197 app/settings.c:131 app/settings.c:142
 #: app/toolbox-spec.c:536 modules/file/err.h:62
+#: modules/pygwy/pygwy-console.c:528
 #, c-format
 msgid "Cannot write to file: %s."
 msgstr "Cannot write to file: %s."
@@ -2071,8 +2180,9 @@ msgstr "Origin"
 
 #: app/gwyplaintool.c:1011 modules/file/rawfile.c:997
 #: modules/process/convolution_filter.c:349
-#: modules/process/convolution_filter.c:553 modules/process/neural.c:419
-#: modules/process/obj_synth.c:538 modules/process/pat_synth.c:1449
+#: modules/process/convolution_filter.c:553 modules/process/fibre_synth.c:520
+#: modules/process/neural.c:419 modules/process/obj_synth.c:536
+#: modules/process/pat_synth.c:1450
 msgid "Size"
 msgstr "Size"
 
@@ -2129,7 +2239,7 @@ msgstr "Clea_r"
 msgid "_Close"
 msgstr "_Close"
 
-#: app/log.c:615 modules/file/imgexport.c:4168 modules/file/rawfile.c:996
+#: app/log.c:615 modules/file/imgexport.c:4118 modules/file/rawfile.c:996
 msgid "Type"
 msgstr "Type"
 
@@ -2137,8 +2247,8 @@ msgstr "Type"
 msgid "Function"
 msgstr "Function"
 
-#: app/log.c:617 modules/file/imgexport.c:3117 modules/process/fit-shape.c:465
-#: modules/process/neural.c:610 modules/tools/stats.c:425
+#: app/log.c:617 modules/file/imgexport.c:3128 modules/process/fit-shape.c:466
+#: modules/process/neural.c:614 modules/tools/stats.c:423
 msgid "Parameters"
 msgstr "Parameters"
 
@@ -2150,39 +2260,39 @@ msgstr "Time"
 msgid "Export Log"
 msgstr "Export Log"
 
-#: app/menu.c:556 app/toolbox.c:581
+#: app/menu.c:555 app/toolbox.c:595
 msgid "_Data Process"
 msgstr "_Data Process"
 
-#: app/menu.c:598 app/toolbox.c:584
+#: app/menu.c:597 app/toolbox.c:598
 msgid "_Graph"
 msgstr "_Graph"
 
-#: app/menu.c:641 app/toolbox.c:587
+#: app/menu.c:640 app/toolbox.c:601
 msgid "_Volume Data"
 msgstr "_Volume Data"
 
-#: app/menu.c:684 app/toolbox.c:590
+#: app/menu.c:683 app/toolbox.c:604
 msgid "_XYZ Data"
 msgstr "_XYZ Data"
 
-#: app/menu.c:715
+#: app/menu.c:714
 msgid "Re-show Last"
 msgstr "Re-show Last"
 
-#: app/menu.c:730
+#: app/menu.c:729
 msgid "Repeat Last"
 msgstr "Repeat Last"
 
-#: app/menu.c:858
+#: app/menu.c:857
 msgid "Repeat"
 msgstr "Repeat"
 
-#: app/menu.c:864
+#: app/menu.c:863
 msgid "Re-show"
 msgstr "Re-show"
 
-#: app/menu.c:1186
+#: app/menu.c:1185
 msgid "_Document history"
 msgstr "_Document history"
 
@@ -2190,8 +2300,8 @@ msgstr "_Document history"
 msgid "_New"
 msgstr "_New"
 
-#: app/meta.c:235 modules/file/imgexport.c:4672 modules/file/rawfile.c:1058
-#: modules/process/neural.c:711 modules/tools/selectionmanager.c:405
+#: app/meta.c:235 modules/file/imgexport.c:4620 modules/file/rawfile.c:1058
+#: modules/process/neural.c:718 modules/tools/selectionmanager.c:405
 msgid "_Delete"
 msgstr "_Delete"
 
@@ -2265,11 +2375,11 @@ msgstr "Cannot create user ui directory %s: %s"
 msgid "Cannot create user module directory %s: %s"
 msgstr "Cannot create user module directory %s: %s"
 
-#: app/splash.c:832
+#: app/splash.c:1260
 msgid "Starting "
 msgstr "Starting "
 
-#: app/splash.c:878
+#: app/splash.c:1313
 msgid " is free software released under GNU GPL."
 msgstr " is free software released under GNU GPL."
 
@@ -2786,124 +2896,125 @@ msgstr "_Next Tip"
 msgid "_Show tips at startup"
 msgstr "_Show tips at startup"
 
-#: app/toolbox-editor.c:212
+#: app/toolbox-editor.c:213
 msgid "Toolbox Editor"
 msgstr "Toolbox Editor"
 
-#: app/toolbox-editor.c:257
+#: app/toolbox-editor.c:258
 msgid "_New Item"
 msgstr "_New Item"
 
-#: app/toolbox-editor.c:262
+#: app/toolbox-editor.c:263
 msgid "_New Group"
 msgstr "_New Group"
 
-#: app/toolbox-editor.c:268 app/toolbox.c:577
+#: app/toolbox-editor.c:269 app/toolbox.c:591
 msgid "_Edit"
 msgstr "_Edit"
 
-#: app/toolbox-editor.c:273 modules/process/fft_filter_2d.c:499
-#: modules/tools/maskedit.c:548 modules/volume/volume_zcal.c:173
+#: app/toolbox-editor.c:274 modules/process/fft_filter_2d.c:499
+#: modules/tools/maskedit.c:554 modules/volume/volume_zcal.c:173
 msgid "_Remove"
 msgstr "_Remove"
 
-#: app/toolbox-editor.c:278
+#: app/toolbox-editor.c:279
 msgid "Move _Up"
 msgstr "Move _Up"
 
-#: app/toolbox-editor.c:283
+#: app/toolbox-editor.c:284
 msgid "Move _Down"
 msgstr "Move _Down"
 
-#: app/toolbox-editor.c:292 modules/file/hdrimage.cc:2304
-#: modules/file/imgexport.c:3101 modules/file/pixmap.c:872
+#: app/toolbox-editor.c:293 modules/file/hdrimage.cc:2304
+#: modules/file/imgexport.c:3114 modules/file/pixmap.c:872
 #: modules/file/rawfile.c:658 modules/process/crosscor.c:252
-#: modules/process/dimensions.h:473 modules/process/tip_blind.c:333
+#: modules/process/dimensions.h:455 modules/process/fibre_synth.c:526
+#: modules/process/tip_blind.c:334
 msgid "_Width:"
 msgstr "_Width:"
 
-#: app/toolbox-editor.c:774
+#: app/toolbox-editor.c:787
 msgid "Toolbox Group"
 msgstr "Toolbox Group"
 
-#: app/toolbox-editor.c:791 modules/file/rawgraph.c:267
+#: app/toolbox-editor.c:804 modules/file/rawgraph.c:267
 msgid "_Title:"
 msgstr "_Title:"
 
-#: app/toolbox-editor.c:805
+#: app/toolbox-editor.c:818
 msgid "_Id:"
 msgstr "_Id:"
 
-#: app/toolbox-editor.c:818
+#: app/toolbox-editor.c:831
 msgid "_Suggest"
 msgstr "_Suggest"
 
-#: app/toolbox-editor.c:824
+#: app/toolbox-editor.c:837
 msgid "Trans_latable title"
 msgstr "Trans_latable title"
 
-#: app/toolbox-editor.c:874
+#: app/toolbox-editor.c:887
 msgid "Group id is not a valid identifier"
 msgstr "Group id is not a valid identifier"
 
-#: app/toolbox-editor.c:882
+#: app/toolbox-editor.c:895
 msgid "Group id is not unique"
 msgstr "Group id is not unique"
 
-#: app/toolbox-editor.c:971
+#: app/toolbox-editor.c:984
 msgid "Toolbox Item"
 msgstr "Toolbox Item"
 
-#: app/toolbox-editor.c:992 modules/process/coerce.c:331
+#: app/toolbox-editor.c:1005 modules/process/coerce.c:331
 #: modules/tools/filter.c:284
 msgid "_Type:"
 msgstr "_Type:"
 
-#: app/toolbox-editor.c:999
+#: app/toolbox-editor.c:1012
 msgid "Placeholder"
 msgstr "Placeholder"
 
-#: app/toolbox-editor.c:1000
+#: app/toolbox-editor.c:1013
 msgid "Builtin"
 msgstr "Built-in"
 
-#: app/toolbox-editor.c:1001 app/toolbox.c:107
+#: app/toolbox-editor.c:1014 app/toolbox.c:112
 msgid "Data Process"
 msgstr "Data Process"
 
-#: app/toolbox-editor.c:1003
+#: app/toolbox-editor.c:1016
 msgid "Volume Data"
 msgstr "Volume Data"
 
-#: app/toolbox-editor.c:1004
+#: app/toolbox-editor.c:1017
 msgid "XYZ Data"
 msgstr "XYZ Data"
 
-#: app/toolbox-editor.c:1005
+#: app/toolbox-editor.c:1018
 msgid "Tool"
 msgstr "Tool"
 
-#: app/toolbox-editor.c:1012
+#: app/toolbox-editor.c:1025 modules/tools/profile.c:483
 msgid "_Mode:"
 msgstr "_Mode:"
 
-#: app/toolbox-editor.c:1019 app/toolbox-editor.c:1038
+#: app/toolbox-editor.c:1032 app/toolbox-editor.c:1051
 msgid "Default"
 msgstr "Default"
 
-#: app/toolbox-editor.c:1020
+#: app/toolbox-editor.c:1033
 msgid "Interactive"
 msgstr "Interactive"
 
-#: app/toolbox-editor.c:1021
+#: app/toolbox-editor.c:1034
 msgid "Non-interactive"
 msgstr "Non-interactive"
 
-#: app/toolbox-editor.c:1029
+#: app/toolbox-editor.c:1042
 msgid "Use _icon from:"
 msgstr "Use _icon from:"
 
-#: app/toolbox-editor.c:1063
+#: app/toolbox-editor.c:1076
 msgid "Functions"
 msgstr "Functions"
 
@@ -2919,143 +3030,159 @@ msgstr "remaining tools"
 msgid "All tools not placed explicitly go here."
 msgstr "All tools not placed explicitly go here."
 
-#: app/toolbox.c:106
+#: app/toolbox.c:111
 msgid "View"
 msgstr "View"
 
-#: app/toolbox.c:109
+#: app/toolbox.c:114
 msgid "Tools"
 msgstr "Tools"
 
-#: app/toolbox.c:575
+#: app/toolbox.c:589
 msgid "_File"
 msgstr "_File"
 
-#: app/toolbox.c:593
+#: app/toolbox.c:607
 msgid "_Info"
 msgstr "_Info"
 
-#: app/toolbox.c:663
+#: app/toolbox.c:696
 msgid "Display a 3D view of data"
 msgstr "Display a 3D view of data"
 
-#: app/toolbox.c:667
+#: app/toolbox.c:700
+msgid "Undo"
+msgstr "Undo"
+
+#: app/toolbox.c:700
+msgid "Undo last action"
+msgstr "Undo last action"
+
+#: app/toolbox.c:704
+msgid "Redo"
+msgstr "Redo"
+
+#: app/toolbox.c:704
+msgid "Redo again last undone action"
+msgstr "Redo again last undone action"
+
+#: app/toolbox.c:708
 msgid "Zoom in"
 msgstr "Zoom in"
 
-#: app/toolbox.c:671
+#: app/toolbox.c:712
 msgid "Zoom out"
 msgstr "Zoom out"
 
-#: app/toolbox.c:675
+#: app/toolbox.c:716
 msgid "Zoom 1:1"
 msgstr "Zoom 1:1"
 
-#: app/toolbox.c:722
+#: app/toolbox.c:781
 msgid "/Show _Data Browser"
 msgstr "/Show _Data Browser"
 
-#: app/toolbox.c:730
+#: app/toolbox.c:789
 msgid "/Module _Browser"
 msgstr "/Module _Browser"
 
-#: app/toolbox.c:738
+#: app/toolbox.c:797
 msgid "/Program _Messages"
 msgstr "/Programme _Messages"
 
-#: app/toolbox.c:753
+#: app/toolbox.c:812
 msgid "/_User Guide"
 msgstr "/_User Guide"
 
-#: app/toolbox.c:761
+#: app/toolbox.c:820
 msgid "/_Tip of the Day"
 msgstr "/_Tip of the Day"
 
-#: app/toolbox.c:769
+#: app/toolbox.c:828
 msgid "/_About Gwyddion"
 msgstr "/_About Gwyddion"
 
-#: app/toolbox.c:806
+#: app/toolbox.c:865
 msgid "/_Open..."
 msgstr "/_Open..."
 
-#: app/toolbox.c:814
+#: app/toolbox.c:873
 msgid "/_Merge..."
 msgstr "/_Merge..."
 
-#: app/toolbox.c:822
+#: app/toolbox.c:881
 msgid "/Open _Recent"
 msgstr "/Open _Recent"
 
-#: app/toolbox.c:830
+#: app/toolbox.c:889
 msgid "/_Save"
 msgstr "/_Save"
 
-#: app/toolbox.c:838
+#: app/toolbox.c:897
 msgid "/Save _As..."
 msgstr "/Save _As..."
 
-#: app/toolbox.c:846
+#: app/toolbox.c:905
 msgid "/_Close"
 msgstr "/_Close"
 
-#: app/toolbox.c:854
+#: app/toolbox.c:913
 msgid "/Remo_ve All Logs"
 msgstr "/Remo_ve All Logs"
 
-#: app/toolbox.c:870
+#: app/toolbox.c:929
 msgid "/_Quit"
 msgstr "/_Quit"
 
-#: app/toolbox.c:910
+#: app/toolbox.c:969
 msgid "/_Undo"
 msgstr "/_Undo"
 
-#: app/toolbox.c:918
+#: app/toolbox.c:977
 msgid "/_Redo"
 msgstr "/_Redo"
 
-#: app/toolbox.c:934
+#: app/toolbox.c:993
 msgid "/Default Mask _Color..."
 msgstr "/Default Mask _Colour..."
 
-#: app/toolbox.c:942
+#: app/toolbox.c:1001
 msgid "/Color _Gradients..."
 msgstr "/Colour _Gradients..."
 
-#: app/toolbox.c:950
+#: app/toolbox.c:1009
 msgid "/G_L Materials..."
 msgstr "/G_L Materials..."
 
-#: app/toolbox.c:958
+#: app/toolbox.c:1017
 msgid "/_Toolbox..."
 msgstr "/_Toolbox..."
 
-#: app/toolbox.c:966
+#: app/toolbox.c:1025
 msgid "/_Keyboard Shortcuts"
 msgstr "/_Keyboard Shortcuts"
 
-#: app/toolbox.c:974
+#: app/toolbox.c:1033
 msgid "/_Logging Enabled"
 msgstr "/_Logging Enabled"
 
-#: app/toolbox.c:1083
+#: app/toolbox.c:1142
 msgid "Program Messages"
 msgstr "Programme Messages"
 
-#: app/toolbox.c:1320
+#: app/toolbox.c:1379
 msgid "Change Default Mask Color"
 msgstr "Change Default Mask Colour"
 
-#: app/toolbox.c:1348
+#: app/toolbox.c:1407
 msgid "OpenGL 3D graphics not available"
 msgstr "OpenGL 3D graphics not available"
 
-#: app/toolbox.c:1353
+#: app/toolbox.c:1412
 msgid "OpenGL was disabled with a command-line option."
 msgstr "OpenGL was disabled with a command-line option."
 
-#: app/toolbox.c:1361
+#: app/toolbox.c:1420
 msgid ""
 "Initialization of OpenGL failed.  Check output of <tt>glxinfo</tt> and "
 "warning messages printed to console during Gwyddion startup."
@@ -3063,7 +3190,7 @@ msgstr ""
 "Initialisation of OpenGL failed.  Check output of <tt>glxinfo</tt> and "
 "warning messages printed to console during Gwyddion start-up."
 
-#: app/toolbox.c:1368
+#: app/toolbox.c:1427
 msgid "This version of Gwyddion was built without OpenGL support."
 msgstr "This version of Gwyddion was built without OpenGL support."
 
@@ -3139,7 +3266,7 @@ msgstr "Object has several references"
 msgid "Secondary data item has no primary data"
 msgstr "Secondary data item has no primary data"
 
-#: app/wait.c:106
+#: app/wait.c:114
 msgid "Please wait"
 msgstr "Please wait"
 
@@ -3156,11 +3283,11 @@ msgstr "Accurex II text files (.txt)"
 msgid "File header cannot be converted from ISO-8859-1 character set: %s"
 msgstr "File header cannot be converted from ISO-8859-1 character set: %s"
 
-#: modules/file/aistfile.c:127
+#: modules/file/aistfile.c:123
 msgid "Imports AIST-NT data files."
 msgstr "Imports AIST-NT data files."
 
-#: modules/file/aistfile.c:140
+#: modules/file/aistfile.c:136
 msgid "AIST-NT files (.aist)"
 msgstr "AIST-NT files (.aist)"
 
@@ -3207,7 +3334,8 @@ msgstr "Header tag ‘%s’ value is not nul-padded."
 
 #: modules/file/alicona.c:665 modules/file/gdeffile.c:175
 #: modules/file/gdeffile.c:199 modules/file/gsffile.c:159
-#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1038
+#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1174
+#: modules/file/microprof.c:361 modules/file/microprof.c:375
 #: modules/file/pt3file.c:489 modules/file/pt3file.c:591
 msgid "File header is truncated."
 msgstr "File header is truncated."
@@ -3220,11 +3348,11 @@ msgstr "Comment lacks CRLF termination."
 msgid "Comment is not nul-terminated."
 msgstr "Comment is not nul-terminated."
 
-#: modules/file/ambfile.c:84
+#: modules/file/ambfile.c:83
 msgid "Imports Ambios AMB data files."
 msgstr "Imports Ambios AMB data files."
 
-#: modules/file/ambfile.c:97
+#: modules/file/ambfile.c:96
 msgid "Ambios amb files (.amb)"
 msgstr "Ambios amb files (.amb)"
 
@@ -3256,11 +3384,11 @@ msgstr "FileDescEnd has no corresponding FileDescBegin."
 msgid "FileDescBegin has no corresponding FileDescEnd."
 msgstr "FileDescBegin has no corresponding FileDescEnd."
 
-#: modules/file/apedaxfile.c:259
+#: modules/file/apedaxfile.c:261
 msgid "Imports A.P.E. Research DAX data files."
 msgstr "Imports A.P.E. Research DAX data files."
 
-#: modules/file/apedaxfile.c:274
+#: modules/file/apedaxfile.c:276
 msgid "A.P.E. Research DAX Files (.dax) and APDT File (.apdt)"
 msgstr "A.P.E. Research DAX Files (.dax) and APDT File (.apdt)"
 
@@ -3288,7 +3416,7 @@ msgstr "Width:"
 msgid "Height:"
 msgstr "Height:"
 
-#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:248
+#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:251
 msgid "Value units:"
 msgstr "Value units:"
 
@@ -3297,30 +3425,30 @@ msgid "Export Text"
 msgstr "Export Text"
 
 #: modules/file/asciiexport.c:275 modules/file/gxyzffile.c:402
-#: modules/file/imgexport.c:3565 modules/file/imgexport.c:4203
-#: modules/file/rawfile.c:758 modules/file/xyzexport.c:311
-#: modules/process/calibrate.c:607 modules/process/coerce.c:364
-#: modules/process/col_synth.c:516 modules/process/correct_affine.c:470
-#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:261
-#: modules/process/grain_dist.c:306 modules/process/grain_edge.c:255
-#: modules/process/grain_mark.c:338 modules/process/grain_wshed.c:252
-#: modules/process/linematch.c:852 modules/process/mark_disconn.c:279
-#: modules/process/slope_dist.c:367 modules/process/tip_blind.c:357
+#: modules/file/imgexport.c:3532 modules/file/imgexport.c:4151
+#: modules/file/rawfile.c:758 modules/file/xyzexport.c:314
+#: modules/process/calibrate.c:561 modules/process/coerce.c:363
+#: modules/process/col_synth.c:516 modules/process/correct_affine.c:520
+#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:263
+#: modules/process/grain_dist.c:307 modules/process/grain_edge.c:254
+#: modules/process/grain_mark.c:335 modules/process/grain_wshed.c:256
+#: modules/process/linematch.c:819 modules/process/mark_disconn.c:280
+#: modules/process/slope_dist.c:359 modules/process/tip_blind.c:360
 #: modules/process/wpour_mark.c:354 modules/tools/spotremove.c:322
-#: modules/tools/stats.c:402 modules/xyz/xyz_raster.c:628
+#: modules/tools/stats.c:401 modules/xyz/xyz_raster.c:597
 msgid "Options"
 msgstr "Options"
 
-#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:314
+#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:317
 msgid "Use _dot as decimal separator"
 msgstr "Use _dot as decimal separator"
 
-#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:321
-#: modules/process/grain_dist.c:317
+#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:324
+#: modules/process/grain_dist.c:318
 msgid "Add _informational comment header"
 msgstr "Add _informational comment header"
 
-#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:330
+#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:333
 msgid "_Precision:"
 msgstr "_Precision:"
 
@@ -3340,20 +3468,20 @@ msgstr "Imports Attocube Systems ASC files."
 msgid "Attocube ASCII files (.asc)"
 msgstr "Attocube ASCII files (.asc)"
 
-#: modules/file/bcrfile.c:146
+#: modules/file/bcrfile.c:141
 msgid "Imports Image Metrology BCR data files."
 msgstr "Imports Image Metrology BCR data files."
 
-#: modules/file/bcrfile.c:159
+#: modules/file/bcrfile.c:154
 msgid "BCR files (.bcr, .bcrf)"
 msgstr "BCR files (.bcr, .bcrf)"
 
-#: modules/file/bcrfile.c:238
+#: modules/file/bcrfile.c:233
 #, c-format
 msgid "File header is not convertible from UTF-16: %s"
 msgstr "File header is not convertible from UTF-16: %s"
 
-#: modules/file/bcrfile.c:351
+#: modules/file/bcrfile.c:346
 #, c-format
 msgid "Unknown file type header: `%s'."
 msgstr "Unknown file type header: `%s'."
@@ -3388,7 +3516,7 @@ msgid "Burleigh exported data (.txt, .bin)"
 msgstr "Burleigh exported data (.txt, .bin)"
 
 #: modules/file/burleigh_exp.c:226 modules/file/burleigh_exp.c:267
-#: modules/file/nanoscope.c:1605 modules/file/omicron.c:416
+#: modules/file/nanoscope.c:1612 modules/file/omicron.c:416
 #: modules/file/shimadzu.c:468
 msgid "Missing colon in header line."
 msgstr "Missing colon in header line."
@@ -3437,22 +3565,40 @@ msgstr "Imports Benyuan CSM data files."
 msgid "Benyuan CSM files (.csm)"
 msgstr "Benyuan CSM files (.csm)"
 
-#: modules/file/dektakxml.c:138
+#: modules/file/dektakvca.c:197
+msgid "Imports Dektak OPDx data files."
+msgstr "Imports Dektak OPDx data files."
+
+#: modules/file/dektakvca.c:210
+msgid "Dektak OPDx data files (.OPDx)"
+msgstr "Dektak OPDx data files (.OPDx)"
+
+#: modules/file/dektakvca.c:655
+#, c-format
+msgid "Item `%s' has unexpected type %u instead of %u."
+msgstr "Item `%s' has unexpected type %u instead of %u."
+
+#: modules/file/dektakvca.c:1022
+#, c-format
+msgid "Truncated data inside item %s."
+msgstr "Truncated data inside item %s."
+
+#: modules/file/dektakxml.c:118
 msgid "Imports Dektak XML data files."
 msgstr "Imports Dektak XML data files."
 
-#: modules/file/dektakxml.c:151
+#: modules/file/dektakxml.c:131
 msgid "Dektak XML data files (.xml)"
 msgstr "Dektak XML data files (.xml)"
 
-#: modules/file/dektakxml.c:228 modules/file/lextfile.c:260
-#: modules/file/nanoscan.c:267 modules/file/ometiff.c:265
+#: modules/file/dektakxml.c:208 modules/file/lextfile.c:260
+#: modules/file/nanoscan.c:270 modules/file/ometiff.c:265
 #, c-format
 msgid "XML parsing failed: %s"
 msgstr "XML parsing failed: %s"
 
-#: modules/file/dektakxml.c:400 modules/file/lextfile.c:163
-#: modules/file/nanoscan.c:672 modules/file/ometiff.c:445
+#: modules/file/dektakxml.c:373 modules/file/lextfile.c:163
+#: modules/file/nanoscan.c:698 modules/file/ometiff.c:445
 #, c-format
 msgid "Top-level element is not ‘%s’."
 msgstr "Top-level element is not ‘%s’."
@@ -3564,7 +3710,7 @@ msgid "Scan size header field overlaps with data."
 msgstr "Scan size header field overlaps with data."
 
 #: modules/file/err.h:48 modules/file/nrrdfile.c:779
-#: modules/file/nrrdfile.c:824
+#: modules/file/nrrdfile.c:824 modules/pygwy/pygwy-console.c:504
 #, c-format
 msgid "Cannot read from file: %s."
 msgstr "Cannot read from file: %s."
@@ -3782,32 +3928,32 @@ msgid ""
 msgstr ""
 "Data deserialisation succeeded, but resulted in an unexpected object %s."
 
-#: modules/file/gwytiff.h:332
+#: modules/file/gwytiff.h:335
 #, c-format
 msgid "BigTIFF reserved fields are %u and %u instead of 8 and 0."
 msgstr "BigTIFF reserved fields are %u and %u instead of 8 and 0."
 
-#: modules/file/gwytiff.h:349 modules/file/gwytiff.h:366
+#: modules/file/gwytiff.h:352 modules/file/gwytiff.h:369
 #, c-format
 msgid "TIFF directory %lu ended unexpectedly."
 msgstr "TIFF directory %lu ended unexpectedly."
 
-#: modules/file/gwytiff.h:484
+#: modules/file/gwytiff.h:487
 #, c-format
 msgid "BigTIFF data type %u was found in a classic TIFF."
 msgstr "BigTIFF data type %u was found in a classic TIFF."
 
-#: modules/file/gwytiff.h:501
+#: modules/file/gwytiff.h:504
 msgid "Invalid tag data positions were found."
 msgstr "Invalid tag data positions were found."
 
-#: modules/file/gwytiff.h:874 modules/file/gwytiff.h:889
-#: modules/file/gwytiff.h:1012 modules/file/gwytiff.h:1019
+#: modules/file/gwytiff.h:877 modules/file/gwytiff.h:892
+#: modules/file/gwytiff.h:1015 modules/file/gwytiff.h:1022
 #, c-format
 msgid "Required tag %u was not found."
 msgstr "Required tag %u was not found."
 
-#: modules/file/gwytiff.h:942 modules/file/gwytiff.h:986
+#: modules/file/gwytiff.h:945 modules/file/gwytiff.h:989
 #: modules/file/keyence.c:449 modules/file/matfile.c:276
 #: modules/file/matfile.c:298 modules/file/omicronflat.c:1962
 #: modules/file/princetonspe.c:339 modules/file/psia.c:352
@@ -3815,21 +3961,21 @@ msgstr "Required tag %u was not found."
 msgid "File is truncated."
 msgstr "File is truncated."
 
-#: modules/file/gwytiff.h:1044
+#: modules/file/gwytiff.h:1047
 msgid "Non-uniform bits per sample are unsupported."
 msgstr "Non-uniform bits per sample are unsupported."
 
-#: modules/file/gwytiff.h:1071
+#: modules/file/gwytiff.h:1074 modules/file/zeisslsm.c:973
 #, c-format
 msgid "Compression type %u is not supported."
 msgstr "Compression type %u is not supported."
 
-#: modules/file/gwytiff.h:1077
+#: modules/file/gwytiff.h:1080
 #, c-format
 msgid "Planar configuration %u is not supported."
 msgstr "Planar configuration %u is not supported."
 
-#: modules/file/gwytiff.h:1101
+#: modules/file/gwytiff.h:1104
 msgid "Unsupported sample format"
 msgstr "Unsupported sample format"
 
@@ -3866,7 +4012,7 @@ msgstr "CRC error"
 msgid "Minizip error while reading the zip file: %s (%d)."
 msgstr "Minizip error while reading the zip file: %s (%d)."
 
-#: modules/file/gwyzip.h:248
+#: modules/file/gwyzip.h:248 modules/file/jpkscan.c:2776
 #, c-format
 msgid "File %s is missing in the zip file."
 msgstr "File %s is missing in the zip file."
@@ -3901,8 +4047,8 @@ msgstr "Data size %lu is not a multiple of point size %u."
 msgid "Export GXYZF"
 msgstr "Export GXYZF"
 
-#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:238
-#: modules/file/xyzexport.c:304
+#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:241
+#: modules/file/xyzexport.c:307
 msgid "XYZ data:"
 msgstr "XYZ data:"
 
@@ -3991,11 +4137,13 @@ msgstr "_Z scale:"
 msgid "Representable"
 msgstr "Representable"
 
-#: modules/file/hdrimage.cc:480 modules/tools/stats.c:203
+#: modules/file/hdrimage.cc:480 modules/graph/graph_stats.c:146
+#: modules/tools/stats.c:203
 msgid "Minimum:"
 msgstr "Minimum:"
 
-#: modules/file/hdrimage.cc:496 modules/tools/stats.c:204
+#: modules/file/hdrimage.cc:496 modules/graph/graph_stats.c:147
+#: modules/tools/stats.c:204
 msgid "Maximum:"
 msgstr "Maximum:"
 
@@ -4014,12 +4162,12 @@ msgid "OpenEXR data type %u is invalid or unsupported."
 msgstr "OpenEXR data type %u is invalid or unsupported."
 
 #: modules/file/hdrimage.cc:1433 modules/file/hdrimage.cc:1442
-#: modules/file/imgexport.c:5249 modules/file/imgexport.c:5260
+#: modules/file/imgexport.c:5198 modules/file/imgexport.c:5209
 #, c-format
 msgid "libpng initialization error (in %s)"
 msgstr "libpng initialisation error (in %s)"
 
-#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5324
+#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5273
 msgid "libpng error occurred"
 msgstr "libpng error occurred"
 
@@ -4037,11 +4185,6 @@ msgstr "Image Information"
 msgid "Horizontal size:"
 msgstr "Horizontal size:"
 
-#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
-#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
-msgid "px"
-msgstr "px"
-
 #: modules/file/hdrimage.cc:2252 modules/file/pixmap.c:826
 msgid "Vertical size:"
 msgstr "Vertical size:"
@@ -4054,10 +4197,10 @@ msgstr "Channels:"
 msgid "Pages:"
 msgstr "Pages:"
 
-#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3043
+#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3059
 #: modules/file/pixmap.c:862 modules/file/rawfile.c:649
-#: modules/process/dimensions.h:467 modules/xyz/xyz_drift.c:774
-#: modules/xyz/xyz_raster.c:566
+#: modules/process/dimensions.h:449 modules/xyz/xyz_drift.c:774
+#: modules/xyz/xyz_raster.c:535
 msgid "Physical Dimensions"
 msgstr "Physical Dimensions"
 
@@ -4067,16 +4210,16 @@ msgstr "Physical Dimensions"
 #: modules/process/calcoefs_new.c:408 modules/process/calcoefs_new.c:475
 #: modules/process/calcoefs_simple.c:391 modules/process/calcoefs_simple.c:458
 #: modules/process/calcoefs_view.c:511 modules/process/calcoefs_view.c:549
-#: modules/process/calibrate.c:466 modules/process/calibrate.c:549
-#: modules/process/dimensions.h:161 modules/process/volumize_layers.c:259
-#: modules/volume/volume_calibrate.c:414 modules/volume/volume_calibrate.c:441
-#: modules/volume/volume_calibrate.c:468 modules/volume/volume_calibrate.c:546
+#: modules/process/calibrate.c:459 modules/process/calibrate.c:514
+#: modules/process/dimensions.h:143 modules/process/volumize_layers.c:259
+#: modules/volume/volume_calibrate.c:409 modules/volume/volume_calibrate.c:429
+#: modules/volume/volume_calibrate.c:449 modules/volume/volume_calibrate.c:498
 msgid "verb|Change"
 msgstr "Change"
 
 #: modules/file/hdrimage.cc:2345 modules/file/pixmap.c:907
-#: modules/file/rawfile.c:694 modules/process/crosscor.c:263
-#: modules/process/dimensions.h:477
+#: modules/file/rawfile.c:694 modules/process/crosscor.c:260
+#: modules/process/dimensions.h:459
 msgid "H_eight:"
 msgstr "H_eight:"
 
@@ -4093,16 +4236,16 @@ msgstr "_Z-scale (per sample unit):"
 #: modules/file/hdrimage.cc:2557 modules/file/pixmap.c:1176
 #: modules/file/rawfile.c:1386 modules/process/calcoefs_new.c:819
 #: modules/process/calcoefs_simple.c:1197 modules/process/calcoefs_view.c:1380
-#: modules/process/calibrate.c:979 modules/process/dimensions.h:195
-#: modules/process/volumize_layers.c:315 modules/volume/volume_calibrate.c:1017
+#: modules/process/calibrate.c:1013 modules/process/dimensions.h:177
+#: modules/process/volumize_layers.c:314 modules/volume/volume_calibrate.c:957
 msgid "Change Units"
 msgstr "Change Units"
 
 #: modules/file/hdrimage.cc:2571 modules/file/pixmap.c:1190
 #: modules/file/rawfile.c:1400 modules/process/calcoefs_new.c:832
 #: modules/process/calcoefs_simple.c:1210 modules/process/calcoefs_view.c:1393
-#: modules/process/calibrate.c:993 modules/process/dimensions.h:208
-#: modules/process/volumize_layers.c:329 modules/volume/volume_calibrate.c:1031
+#: modules/process/calibrate.c:1027 modules/process/dimensions.h:190
+#: modules/process/volumize_layers.c:328 modules/volume/volume_calibrate.c:971
 msgid "New _units:"
 msgstr "New _units:"
 
@@ -4146,131 +4289,131 @@ msgstr "Cannot load image: %s"
 msgid "Field DataSize %ux%u does not match image dimensions %ux%u."
 msgstr "Field DataSize %ux%u does not match image dimensions %ux%u."
 
-#: modules/file/igorfile.c:200
+#: modules/file/igorfile.c:210
 msgid "Imports Igor binary waves (.ibw)."
 msgstr "Imports Igor binary waves (.ibw)."
 
-#: modules/file/igorfile.c:213
+#: modules/file/igorfile.c:223
 msgid "Igor binary waves (.ibw)"
 msgstr "Igor binary waves (.ibw)"
 
-#: modules/file/igorfile.c:273
+#: modules/file/igorfile.c:283
 #, c-format
 msgid "Format version is %d.  Only version 5 is supported."
 msgstr "Format version is %d.  Only version 5 is supported."
 
-#: modules/file/igorfile.c:294
+#: modules/file/igorfile.c:305
 msgid "Only two-dimensional data are supported."
 msgstr "Only two-dimensional data are supported."
 
-#: modules/file/igorfile.c:306
+#: modules/file/igorfile.c:317
 #, c-format
 msgid "Number of data points %u does not match resolutions %u×%u×%u."
 msgstr "Number of data points %u does not match resolutions %u×%u×%u."
 
-#: modules/file/igorfile.c:320
+#: modules/file/igorfile.c:331
 #, c-format
 msgid "Data size %u does not match the number of data points %u×%u."
 msgstr "Data size %u does not match the number of data points %u×%u."
 
-#: modules/file/igorfile.c:358
+#: modules/file/igorfile.c:369
 msgid "Cannot read channel labels."
 msgstr "Cannot read channel labels."
 
-#: modules/file/imgexport.c:392 modules/file/pixmap.c:178
+#: modules/file/imgexport.c:391 modules/file/pixmap.c:178
 msgid "Portable Network Graphics (.png)"
 msgstr "Portable Network Graphics (.png)"
 
-#: modules/file/imgexport.c:398 modules/file/pixmap.c:182
+#: modules/file/imgexport.c:397 modules/file/pixmap.c:182
 msgid "JPEG (.jpeg,.jpg)"
 msgstr "JPEG (.jpeg,.jpg)"
 
-#: modules/file/imgexport.c:404 modules/file/pixmap.c:186
+#: modules/file/imgexport.c:403 modules/file/pixmap.c:186
 msgid "TIFF (.tiff,.tif)"
 msgstr "TIFF (.tiff,.tif)"
 
-#: modules/file/imgexport.c:410 modules/file/pixmap.c:190
+#: modules/file/imgexport.c:409 modules/file/pixmap.c:190
 msgid "Portable Pixmap (.ppm,.pnm)"
 msgstr "Portable Pixmap (.ppm,.pnm)"
 
-#: modules/file/imgexport.c:416 modules/file/pixmap.c:194
+#: modules/file/imgexport.c:415 modules/file/pixmap.c:194
 msgid "Windows or OS2 Bitmap (.bmp)"
 msgstr "Windows or OS2 Bitmap (.bmp)"
 
-#: modules/file/imgexport.c:422 modules/file/pixmap.c:198
+#: modules/file/imgexport.c:421 modules/file/pixmap.c:198
 msgid "TARGA (.tga,.targa)"
 msgstr "TARGA (.tga,.targa)"
 
-#: modules/file/imgexport.c:429
+#: modules/file/imgexport.c:428
 msgid "WebP (.webp)"
 msgstr "WebP (.webp)"
 
-#: modules/file/imgexport.c:437
+#: modules/file/imgexport.c:436
 msgid "Portable document format (.pdf)"
 msgstr "Portable document format (.pdf)"
 
-#: modules/file/imgexport.c:445
+#: modules/file/imgexport.c:444
 msgid "Encapsulated PostScript (.eps)"
 msgstr "Encapsulated PostScript (.eps)"
 
-#: modules/file/imgexport.c:453
+#: modules/file/imgexport.c:452
 msgid "Scalable Vector Graphics (.svg)"
 msgstr "Scalable Vector Graphics (.svg)"
 
-#: modules/file/imgexport.c:463 modules/tools/selectionmanager.c:269
+#: modules/file/imgexport.c:462 modules/tools/selectionmanager.c:269
 msgid "Horiz./vert. lines"
 msgstr "Horiz./vert. lines"
 
-#: modules/file/imgexport.c:467 modules/tools/selectionmanager.c:270
+#: modules/file/imgexport.c:466 modules/tools/selectionmanager.c:270
 msgid "Ellipses"
 msgstr "Ellipses"
 
-#: modules/file/imgexport.c:471 modules/tools/selectionmanager.c:272
+#: modules/file/imgexport.c:470 modules/tools/selectionmanager.c:272
 msgid "Lines"
 msgstr "Lines"
 
-#: modules/file/imgexport.c:479 modules/tools/selectionmanager.c:275
+#: modules/file/imgexport.c:478 modules/tools/selectionmanager.c:275
 msgid "Rectangles"
 msgstr "Rectangles"
 
-#: modules/file/imgexport.c:483 modules/process/lat_synth.c:565
+#: modules/file/imgexport.c:482 modules/process/lat_synth.c:565
 #: modules/process/lat_synth.c:637 modules/tools/selectionmanager.c:271
 msgid "Lattice"
 msgstr "Lattice"
 
-#: modules/file/imgexport.c:487
+#: modules/file/imgexport.c:486
 msgid "Path"
 msgstr "Path"
 
-#: modules/file/imgexport.c:493 modules/file/imgexport.c:499
+#: modules/file/imgexport.c:492 modules/file/imgexport.c:498
 msgid "ruler|_None"
 msgstr "_None"
 
-#: modules/file/imgexport.c:494
+#: modules/file/imgexport.c:493
 msgid "_Rulers"
 msgstr "_Rulers"
 
-#: modules/file/imgexport.c:495
+#: modules/file/imgexport.c:494
 msgid "_Inset scale bar"
 msgstr "_Inset scale bar"
 
-#: modules/file/imgexport.c:500
+#: modules/file/imgexport.c:499
 msgid "_False color ruler"
 msgstr "_False colour ruler"
 
-#: modules/file/imgexport.c:504
+#: modules/file/imgexport.c:503
 msgid "title|None"
 msgstr "None"
 
-#: modules/file/imgexport.c:505
+#: modules/file/imgexport.c:504
 msgid "At the top"
 msgstr "At the top"
 
-#: modules/file/imgexport.c:506
+#: modules/file/imgexport.c:505
 msgid "Along the right edge"
 msgstr "Along the right edge"
 
-#: modules/file/imgexport.c:512
+#: modules/file/imgexport.c:511
 msgid ""
 "Renders data into vector (SVG, PDF, EPS) and pixmap (PNG, JPEG, TIFF, WebP, "
 "PPM, BMP, TARGA) images. Export to some formats relies on GDK and other "
@@ -4280,56 +4423,57 @@ msgstr ""
 "PPM, BMP, TARGA) images. Export to some formats relies on GDK and other "
 "libraries thus may be installation-dependent."
 
-#: modules/file/imgexport.c:2931
+#: modules/file/imgexport.c:2933
 msgid "Select Color"
 msgstr "Select Colour"
 
-#: modules/file/imgexport.c:3002
-msgid "Black"
-msgstr "Black"
-
-#: modules/file/imgexport.c:3010
+#: modules/file/imgexport.c:3005
 msgid "White"
 msgstr "White"
 
-#: modules/file/imgexport.c:3053
+#: modules/file/imgexport.c:3014
+msgid "Black"
+msgstr "Black"
+
+#: modules/file/imgexport.c:3069
 msgid "Pi_xel size:"
 msgstr "Pi_xel size:"
 
-#: modules/file/imgexport.c:3062
+#: modules/file/imgexport.c:3077
 msgid "Pixels per _inch:"
 msgstr "Pixels per _inch:"
 
-#: modules/file/imgexport.c:3089
+#: modules/file/imgexport.c:3102
 msgid "_Zoom:"
 msgstr "_Zoom:"
 
-#: modules/file/imgexport.c:3108 modules/process/bdep_synth.c:430
+#: modules/file/imgexport.c:3120 modules/process/bdep_synth.c:430
 #: modules/process/col_synth.c:486 modules/process/diff_synth.c:508
-#: modules/process/domain_synth.c:510 modules/process/grain_mark.c:285
-#: modules/process/lat_synth.c:753 modules/process/obj_synth.c:575
-#: modules/process/pat_synth.c:852 modules/process/pat_synth.c:1154
-#: modules/process/pat_synth.c:1489 modules/process/tip_blind.c:340
+#: modules/process/domain_synth.c:510 modules/process/fibre_synth.c:540
+#: modules/process/grain_mark.c:284 modules/process/lat_synth.c:753
+#: modules/process/obj_synth.c:573 modules/process/pat_synth.c:853
+#: modules/process/pat_synth.c:1155 modules/process/pat_synth.c:1490
+#: modules/process/phase_synth.c:298 modules/process/tip_blind.c:342
 msgid "_Height:"
 msgstr "_Height:"
 
-#: modules/file/imgexport.c:3121
+#: modules/file/imgexport.c:3136
 msgid "_Font:"
 msgstr "_Font:"
 
-#: modules/file/imgexport.c:3140
+#: modules/file/imgexport.c:3145
 msgid "_Font size:"
 msgstr "_Font size:"
 
-#: modules/file/imgexport.c:3160
+#: modules/file/imgexport.c:3163
 msgid "O_utline thickness:"
 msgstr "O_utline thickness:"
 
-#: modules/file/imgexport.c:3170
+#: modules/file/imgexport.c:3172
 msgid "_Border width:"
 msgstr "_Border width:"
 
-#: modules/file/imgexport.c:3180
+#: modules/file/imgexport.c:3181
 msgid "_Tick length:"
 msgstr "_Tick length:"
 
@@ -4349,219 +4493,220 @@ msgstr "Colours"
 msgid "_Line and text color:"
 msgstr "_Line and text colour:"
 
-#: modules/file/imgexport.c:3221
+#: modules/file/imgexport.c:3220
 msgid "_Transparent background"
 msgstr "_Transparent background"
 
-#: modules/file/imgexport.c:3232
+#: modules/file/imgexport.c:3231
 msgid "_Background color:"
 msgstr "_Background colour:"
 
-#: modules/file/imgexport.c:3474
-msgid "Lateral scale"
-msgstr "Lateral scale"
-
-#: modules/file/imgexport.c:3487 modules/process/lno_synth.c:1053
-msgid "_Length:"
-msgstr "_Length:"
-
-#: modules/file/imgexport.c:3503
-msgid "_Auto"
-msgstr "_Auto"
-
-#: modules/file/imgexport.c:3511 modules/process/pat_synth.c:469
+#: modules/file/imgexport.c:3433 modules/process/fibre_synth.c:582
+#: modules/process/pat_synth.c:470
 msgid "Placement"
 msgstr "Placement"
 
-#: modules/file/imgexport.c:3515
+#: modules/file/imgexport.c:3437
 msgid "left"
 msgstr "left"
 
-#: modules/file/imgexport.c:3519
+#: modules/file/imgexport.c:3440
 msgid "center"
 msgstr "centre"
 
-#: modules/file/imgexport.c:3523
+#: modules/file/imgexport.c:3443
 msgid "right"
 msgstr "right"
 
-#: modules/file/imgexport.c:3528
+#: modules/file/imgexport.c:3448
 msgid "top"
 msgstr "top"
 
-#: modules/file/imgexport.c:3540
+#: modules/file/imgexport.c:3456
 msgid "bottom"
 msgstr "bottom"
 
-#: modules/file/imgexport.c:3552 modules/file/imgexport.c:3874
+#: modules/file/imgexport.c:3479
+msgid "Lateral scale"
+msgstr "Lateral scale"
+
+#: modules/file/imgexport.c:3496 modules/process/lno_synth.c:1053
+msgid "_Length:"
+msgstr "_Length:"
+
+#: modules/file/imgexport.c:3502
+msgid "_Auto"
+msgstr "_Auto"
+
+#: modules/file/imgexport.c:3519 modules/file/imgexport.c:3832
 msgid "Hori_zontal gap:"
 msgstr "Hori_zontal gap:"
 
-#: modules/file/imgexport.c:3558 modules/file/imgexport.c:3854
+#: modules/file/imgexport.c:3526 modules/file/imgexport.c:3812
 msgid "_Vertical gap:"
 msgstr "_Vertical gap:"
 
-#: modules/file/imgexport.c:3571 modules/file/imgexport.c:4184
+#: modules/file/imgexport.c:3538 modules/file/imgexport.c:4134
 msgid "Colo_r:"
 msgstr "Colou_r:"
 
-#: modules/file/imgexport.c:3576 modules/file/imgexport.c:4189
+#: modules/file/imgexport.c:3542 modules/file/imgexport.c:4138
 msgid "Out_line color:"
 msgstr "Out_line colour:"
 
-#: modules/file/imgexport.c:3580 modules/file/imgexport.c:4195
+#: modules/file/imgexport.c:3547 modules/file/imgexport.c:4143
 msgid "O_pacity:"
 msgstr "O_pacity:"
 
-#: modules/file/imgexport.c:3589
+#: modules/file/imgexport.c:3554
 msgid "Draw _ticks"
 msgstr "Draw _ticks"
 
-#: modules/file/imgexport.c:3599
+#: modules/file/imgexport.c:3564
 msgid "Draw _label"
 msgstr "Draw _label"
 
-#: modules/file/imgexport.c:3609
+#: modules/file/imgexport.c:3574
 msgid "Draw text _above scale bar"
 msgstr "Draw text _above scale bar"
 
-#: modules/file/imgexport.c:3773
+#: modules/file/imgexport.c:3738
 msgid "Image"
 msgstr "Image"
 
-#: modules/file/imgexport.c:3777 modules/process/calcoefs_view.c:473
-#: modules/process/correct_affine.c:488 modules/process/drift.c:297
-#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:202
-#: modules/process/fft_filter_1d.c:294 modules/process/fft_profile.c:292
-#: modules/process/fractal.c:253 modules/process/nanoindent_adjust.c:229
-#: modules/process/polydistort.c:247 modules/process/rotate.c:274
-#: modules/process/scale.c:253 modules/process/straighten_path.c:271
+#: modules/file/imgexport.c:3742 modules/process/calcoefs_view.c:473
+#: modules/process/correct_affine.c:538 modules/process/drift.c:298
+#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:203
+#: modules/process/fft_filter_1d.c:296 modules/process/fft_profile.c:293
+#: modules/process/fractal.c:262 modules/process/nanoindent_adjust.c:229
+#: modules/process/polydistort.c:250 modules/process/rotate.c:274
+#: modules/process/scale.c:257 modules/process/straighten_path.c:270
 #: modules/process/unrotate.c:277 modules/tools/linestats.c:400
-#: modules/tools/profile.c:555 modules/tools/roughness.c:864
-#: modules/tools/sfunctions.c:468 modules/xyz/xyz_raster.c:632
+#: modules/tools/profile.c:552 modules/tools/roughness.c:879
+#: modules/tools/sfunctions.c:481 modules/xyz/xyz_raster.c:601
 msgid "_Interpolation type:"
 msgstr "_Interpolation type:"
 
-#: modules/file/imgexport.c:3807
+#: modules/file/imgexport.c:3772
 msgid "Draw _frame"
 msgstr "Draw _frame"
 
-#: modules/file/imgexport.c:3816
+#: modules/file/imgexport.c:3781
 msgid "Draw _mask"
 msgstr "Draw _mask"
 
-#: modules/file/imgexport.c:3826
+#: modules/file/imgexport.c:3791
 msgid "Draw mask _legend"
 msgstr "Draw mask _legend"
 
-#: modules/file/imgexport.c:3861
+#: modules/file/imgexport.c:3819
 msgid "Value Scale"
 msgstr "Value Scale"
 
-#: modules/file/imgexport.c:3882
+#: modules/file/imgexport.c:3840
 msgid "Fi_xed precision:"
 msgstr "Fi_xed precision:"
 
-#: modules/file/imgexport.c:3898
+#: modules/file/imgexport.c:3855
 msgid "Fixed _kilo threshold:"
 msgstr "Fixed _kilo threshold:"
 
-#: modules/file/imgexport.c:3914 modules/file/imgexport.c:4635
+#: modules/file/imgexport.c:3869 modules/file/imgexport.c:4583
 msgid "Title"
 msgstr "Title"
 
-#: modules/file/imgexport.c:3918
+#: modules/file/imgexport.c:3877
 msgid "Posi_tion:"
 msgstr "Posi_tion:"
 
-#: modules/file/imgexport.c:3934
+#: modules/file/imgexport.c:3884
 msgid "_Gap:"
 msgstr "_Gap:"
 
-#: modules/file/imgexport.c:3941
+#: modules/file/imgexport.c:3891
 msgid "Put _units to title"
 msgstr "Put _units to title"
 
-#: modules/file/imgexport.c:4125
+#: modules/file/imgexport.c:4075
 msgid "Draw _selection"
 msgstr "Draw _selection"
 
-#: modules/file/imgexport.c:4176 modules/tools/selectionmanager.c:361
+#: modules/file/imgexport.c:4126 modules/tools/selectionmanager.c:361
 msgid "Objects"
 msgstr "Objects"
 
-#: modules/file/imgexport.c:4615
+#: modules/file/imgexport.c:4563
 msgid "Lateral"
 msgstr "Lateral"
 
-#: modules/file/imgexport.c:4654 modules/file/rawfile.c:1040
-#: modules/process/calcoefs_load.c:230 modules/process/neural.c:693
+#: modules/file/imgexport.c:4602 modules/file/rawfile.c:1040
+#: modules/process/calcoefs_load.c:230 modules/process/neural.c:700
 msgid "verb|_Load"
 msgstr "_Load"
 
-#: modules/file/imgexport.c:4660 modules/file/rawfile.c:1046
-#: modules/process/neural.c:699
+#: modules/file/imgexport.c:4608 modules/file/rawfile.c:1046
+#: modules/process/neural.c:706
 msgid "verb|_Store"
 msgstr "_Store"
 
-#: modules/file/imgexport.c:4666 modules/file/rawfile.c:1052
-#: modules/process/neural.c:705
+#: modules/file/imgexport.c:4614 modules/file/rawfile.c:1052
+#: modules/process/neural.c:712
 msgid "_Rename"
 msgstr "_Rename"
 
-#: modules/file/imgexport.c:4686 modules/file/rawfile.c:1071
+#: modules/file/imgexport.c:4634 modules/file/rawfile.c:1071
 msgid "Preset _name:"
 msgstr "Preset _name:"
 
-#: modules/file/imgexport.c:4757
+#: modules/file/imgexport.c:4705
 #, c-format
 msgid "Export %s"
 msgstr "Export %s"
 
-#: modules/file/imgexport.c:4778
+#: modules/file/imgexport.c:4727
 msgid "Export as 1_6 bit grayscale"
 msgstr "Export as 1_6 bit grey scale"
 
-#: modules/file/imgexport.c:4801
+#: modules/file/imgexport.c:4750
 msgid "Lateral Scale"
 msgstr "Lateral Scale"
 
-#: modules/file/imgexport.c:4806
+#: modules/file/imgexport.c:4755
 msgid "Values"
 msgstr "Values"
 
-#: modules/file/imgexport.c:4811
+#: modules/file/imgexport.c:4760
 msgid "Selection"
 msgstr "Selection"
 
-#: modules/file/imgexport.c:4816 modules/file/rawfile.c:462
+#: modules/file/imgexport.c:4765 modules/file/rawfile.c:462
 #: modules/process/convolution_filter.c:275
 msgid "Presets"
 msgstr "Presets"
 
-#: modules/file/imgexport.c:5576
+#: modules/file/imgexport.c:5525
 #, c-format
 msgid "Cairo error occurred: %s"
 msgstr "Cairo error occurred: %s"
 
-#: modules/file/imgexport.c:5600
+#: modules/file/imgexport.c:5549
 #, c-format
 msgid "Pixbuf save failed: %s."
 msgstr "Pixbuf save failed: %s."
 
-#: modules/file/imgexport.c:5878
+#: modules/file/imgexport.c:5827
 msgid "Image is too large to be stored as TARGA."
 msgstr "Image is too large to be stored as TARGA."
 
-#: modules/file/imgexport.c:6457 modules/file/imgexport.c:6486
+#: modules/file/imgexport.c:6406 modules/file/imgexport.c:6435
 msgid "Draw _numbers"
 msgstr "Draw _numbers"
 
-#: modules/file/imgexport.c:6469 modules/file/imgexport.c:6517
+#: modules/file/imgexport.c:6418 modules/file/imgexport.c:6466
 msgid "_End marker length:"
 msgstr "_End marker length:"
 
-#: modules/file/imgexport.c:6498
+#: modules/file/imgexport.c:6447
 msgid "Marker _radius:"
 msgstr "Marker _radius:"
 
@@ -4600,45 +4745,58 @@ msgstr "Parameter tag set is incomplete."
 msgid "image depth"
 msgstr "image depth"
 
-#: modules/file/iso28600.c:534
+#: modules/file/iso28600.c:543
 msgid "Imports and exports ISO 28600:2011 SPM data transfer format."
 msgstr "Imports and exports ISO 28600:2011 SPM data transfer format."
 
-#: modules/file/iso28600.c:550
+#: modules/file/iso28600.c:559
 msgid "ISO 28600:2011 SPM data transfer files (.spm)"
 msgstr "ISO 28600:2011 SPM data transfer files (.spm)"
 
-#: modules/file/iso28600.c:606
+#: modules/file/iso28600.c:658
 #, c-format
-msgid "Only regular mappings are implemented but file has mapping type ‘%s’."
-msgstr "Only regular mappings are implemented but file has mapping type ‘%s’."
+msgid ""
+"Only regular and irregular mappings are implemented but the file has mapping "
+"type ‘%s’."
+msgstr ""
+"Only regular and irregular mappings are implemented but the file has mapping "
+"type ‘%s’."
 
-#: modules/file/iso28600.c:668 modules/file/iso28600.c:677
-#: modules/file/iso28600.c:686
+#: modules/file/iso28600.c:687 modules/file/iso28600.c:696
+#: modules/file/iso28600.c:705
 #, c-format
 msgid "List ‘%s’ has %u items which differs from the number %u given by ‘%s’."
 msgstr "List ‘%s’ has %u items which differs from the number %u given by ‘%s’."
 
-#: modules/file/iso28600.c:755 modules/file/iso28600.c:867
-#: modules/file/sdfile.c:846 modules/file/sdfile.c:863
-#: modules/file/spip-asc.c:239 modules/file/witec-asc.c:223
-#: modules/file/wsffile.c:215
+#: modules/file/iso28600.c:775
+#, c-format
+msgid "End of file reached when reading sample #%u of %u"
+msgstr "End of file reached when reading sample #%u of %u"
+
+#: modules/file/iso28600.c:784 modules/file/iso28600.c:873
+#, c-format
+msgid "Malformed data encountered when reading sample #%u"
+msgstr "Malformed data encountered when reading sample #%u"
+
+#: modules/file/iso28600.c:797 modules/file/iso28600.c:887
+#: modules/file/iso28600.c:1022
+msgid "Missing end-of-data marker."
+msgstr "Missing end-of-data marker."
+
+#: modules/file/iso28600.c:1003 modules/file/sdfile.c:846
+#: modules/file/sdfile.c:863 modules/file/spip-asc.c:239
+#: modules/file/witec-asc.c:223 modules/file/wsffile.c:215
 #, c-format
 msgid "End of file reached when reading sample #%d of %d"
 msgstr "End of file was reached when reading sample #%d of %d"
 
-#: modules/file/iso28600.c:764 modules/file/iso28600.c:876
-#: modules/file/spip-asc.c:246 modules/file/witec-asc.c:230
-#: modules/file/wsffile.c:222
+#: modules/file/iso28600.c:1012 modules/file/spip-asc.c:246
+#: modules/file/witec-asc.c:230 modules/file/wsffile.c:222
 #, c-format
 msgid "Malformed data encountered when reading sample #%d of %d"
 msgstr "Malformed data encountered when reading sample #%d of %d"
 
-#: modules/file/iso28600.c:774 modules/file/iso28600.c:886
-msgid "Missing end-of-data marker."
-msgstr "Missing end-of-data marker."
-
-#: modules/file/iso28600.c:1048
+#: modules/file/iso28600.c:1184
 #, c-format
 msgid "Line %u does not contain mandatory label ‘%s’."
 msgstr "Line %u does not contain mandatory label ‘%s’."
@@ -4655,42 +4813,60 @@ msgstr "JEOL data files (.tif)"
 msgid "The type of data is unknown.  Please report it to the developers."
 msgstr "The type of data is unknown.  Please report it to the developers."
 
-#: modules/file/jpkscan.c:229
+#: modules/file/jpkscan.c:292
 msgid "Imports JPK image scans."
 msgstr "Imports JPK image scans."
 
-#: modules/file/jpkscan.c:242
+#: modules/file/jpkscan.c:305
 msgid "JPK image scans (.jpk, .jpk-qi-image)"
 msgstr "JPK image scans (.jpk, .jpk-qi-image)"
 
-#: modules/file/jpkscan.c:249
+#: modules/file/jpkscan.c:312
 msgid "JPK force curves (.jpk-force, .jpk-force-map, .jpk-qi-data)"
 msgstr "JPK force curves (.jpk-force, .jpk-force-map, .jpk-qi-data)"
 
-#: modules/file/jpkscan.c:315
+#: modules/file/jpkscan.c:378
 msgid "File does not contain grid dimensions."
 msgstr "File does not contain grid dimensions."
 
-#: modules/file/jpkscan.c:660 modules/file/nanoobserver.c:193
+#: modules/file/jpkscan.c:736 modules/file/nanoobserver.c:360
 #: modules/file/nanoscantech.c:205 modules/file/opengps.c:209
 #: modules/file/sensofarx.c:183 modules/file/spmxfile.c:166
 msgid "Minizip cannot open the file as a ZIP file."
 msgstr "Minizip cannot open the file as a ZIP file."
 
-#: modules/file/jpkscan.c:739
+#: modules/file/jpkscan.c:758 modules/file/jpkscan.c:2717
+#, c-format
+msgid "Scanning file (%u curves)..."
+msgstr "Scanning file (%u curves)..."
+
+#: modules/file/jpkscan.c:798 modules/file/nmmxyz.c:299
+msgid "Reading files..."
+msgstr "Reading files..."
+
+#: modules/file/jpkscan.c:816
+msgid "Creating volume data..."
+msgstr "Creating volume data..."
+
+#: modules/file/jpkscan.c:968
 msgid "Non-uniform point and/or segment numbering is not supported."
 msgstr "Non-uniform point and/or segment numbering is not supported."
 
-#: modules/file/jpkscan.c:748
+#: modules/file/jpkscan.c:977
 msgid "Non-uniform channel lists are not supported."
 msgstr "Non-uniform channel lists are not supported."
 
-#: modules/file/jpkscan.c:756
+#: modules/file/jpkscan.c:985
 #, c-format
 msgid "Data file %s was found instead of expected %s."
 msgstr "Data file %s was found instead of expected %s."
 
-#: modules/file/jpkscan.c:1497
+#: modules/file/jpkscan.c:1900
+#, c-format
+msgid "Header properties file for index %u is missing."
+msgstr "Header properties file for index %u is missing."
+
+#: modules/file/jpkscan.c:2519
 msgid "Cannot find any height channel."
 msgstr "Cannot find any height channel."
 
@@ -4840,19 +5016,19 @@ msgstr "MetroPro files (.dat)"
 msgid "File header is larger than file."
 msgstr "File header is larger than file."
 
-#: modules/file/microprof.c:117
+#: modules/file/microprof.c:125
 msgid "Imports MicroProf FRT profilometer data files."
 msgstr "Imports MicroProf FRT profilometer data files."
 
-#: modules/file/microprof.c:130
+#: modules/file/microprof.c:138
 msgid "MicroProf FRT files (.frt)"
 msgstr "MicroProf FRT files (.frt)"
 
-#: modules/file/microprof.c:136
+#: modules/file/microprof.c:144
 msgid "MicroProf FRT text files (.txt)"
 msgstr "MicroProf FRT text files (.txt)"
 
-#: modules/file/microprof.c:432
+#: modules/file/microprof.c:519
 msgid "File contains fewer than XSize*YSize data points."
 msgstr "File contains fewer than XSize*YSize data points."
 
@@ -4941,8 +5117,8 @@ msgstr "Image data starts past the end of file."
 msgid "Spectra data starts past the end of file."
 msgstr "Spectra data starts past the end of file."
 
-#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:276
-#: modules/file/renishaw.c:1325 modules/file/sensofar.c:256
+#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:287
+#: modules/file/renishaw.c:1334 modules/file/sensofar.c:256
 #: modules/file/witec-asc.c:161
 msgid "File header is truncated"
 msgstr "File header is truncated"
@@ -4952,8 +5128,8 @@ msgstr "File header is truncated"
 msgid "Parameter header is truncated"
 msgstr "Parameter header is truncated"
 
-#: modules/file/nanoeducator.c:932 modules/process/curvature.c:454
-#: modules/tools/profile.c:1107
+#: modules/file/nanoeducator.c:932 modules/process/curvature.c:456
+#: modules/tools/profile.c:1090
 #, c-format
 msgid "Profile %d"
 msgstr "Profile %d"
@@ -5033,23 +5209,27 @@ msgstr "DATA_INFO line contains fewer than %d fields."
 msgid "Missing data start marker \\x1a\\x04."
 msgstr "Missing data start marker \\x1a\\x04."
 
-#: modules/file/nanoobserver.c:113
-msgid "Reads NanoObserver .nao files."
-msgstr "Reads NanoObserver .nao files."
+#: modules/file/nanoobserver.c:201
+msgid "Reads Nano-Solution/NanoObserver .nao files."
+msgstr "Reads Nano-Solution/NanoObserver .nao files."
 
-#: modules/file/nanoobserver.c:126
-msgid "NanoObserver data (.nao)"
-msgstr "NanoObserver data (.nao)"
+#: modules/file/nanoobserver.c:214
+msgid "Nano-Solution/NanoObserver data (.nao)"
+msgstr "Nano-Solution/NanoObserver data (.nao)"
+
+#: modules/file/nanoobserver.c:410 modules/file/renishaw.c:1420
+msgid "Data block is truncated"
+msgstr "Data block is truncated"
 
-#: modules/file/nanoscan.c:188
+#: modules/file/nanoscan.c:191
 msgid "Imports NanoScan XML files."
 msgstr "Imports NanoScan XML files."
 
-#: modules/file/nanoscan.c:201
+#: modules/file/nanoscan.c:204
 msgid "NanoScan XML files (.xml)"
 msgstr "NanoScan XML files (.xml)"
 
-#: modules/file/nanoscan.c:910
+#: modules/file/nanoscan.c:937
 msgid "Wrong size of Base64 encoded data."
 msgstr "Wrong size of Base64 encoded data."
 
@@ -5069,21 +5249,21 @@ msgstr "Imports Digital Instruments Nanoscope II data files."
 msgid "Nanoscope II files"
 msgstr "Nanoscope II files"
 
-#: modules/file/nanoscope.c:207
+#: modules/file/nanoscope.c:212
 msgid ""
 "Imports Veeco (Digital Instruments) Nanoscope data files, version 3 or newer."
 msgstr ""
 "Imports Veeco (Digital Instruments) Nanoscope data files, version 3 or newer."
 
-#: modules/file/nanoscope.c:221
+#: modules/file/nanoscope.c:226
 msgid "Nanoscope III files"
 msgstr "Nanoscope III files"
 
-#: modules/file/nanoscope.c:288
+#: modules/file/nanoscope.c:295
 msgid "File is not a Nanoscope file, or it is a unknown subtype."
 msgstr "File is not a Nanoscope file, or it is a unknown subtype."
 
-#: modules/file/nanoscope.c:295
+#: modules/file/nanoscope.c:302
 msgid ""
 "File has been damaged by change of line endings, resulting in corruption of "
 "the binary part of the file.\n"
@@ -5101,16 +5281,16 @@ msgstr ""
 "compressed folder’ in some versions of MS Windows, or any other file "
 "transfer that attempts to store text platform-independently."
 
-#: modules/file/nanoscope.c:653 modules/file/nanoscope.c:669
+#: modules/file/nanoscope.c:660 modules/file/nanoscope.c:676
 msgid "Cannot parse `Scan size' field."
 msgstr "Cannot parse ‘Scan size’ field."
 
-#: modules/file/nanoscope.c:1539 modules/file/nrrdfile.c:1086
+#: modules/file/nanoscope.c:1546 modules/file/nrrdfile.c:1086
 #, c-format
 msgid "Garbage after data sample #%u."
 msgstr "Rubbish after data sample #%u."
 
-#: modules/file/nanoscope.c:1595
+#: modules/file/nanoscope.c:1602
 msgid "Truncated header line."
 msgstr "Truncated header line."
 
@@ -5186,11 +5366,8 @@ msgstr "Nano Measuring Machine files (*.dsc)"
 msgid "Nano Measuring Machine data import must be run as interactive."
 msgstr "Nano Measuring Machine data import must be run as interactive."
 
-#: modules/file/nmmxyz.c:299
-msgid "Reading files..."
-msgstr "Reading files..."
-
 #: modules/file/nmmxyz.c:306 modules/process/lat_synth.c:1224
+#: modules/process/wave_synth.c:798
 msgid "Rendering surface..."
 msgstr "Rendering surface..."
 
@@ -5223,20 +5400,20 @@ msgid "Plot point density map"
 msgstr "Plot point density map"
 
 #: modules/file/nmmxyz.c:534 modules/file/rawfile.c:626
-#: modules/process/dimensions.h:445 modules/xyz/xyz_drift.c:725
-#: modules/xyz/xyz_raster.c:517
+#: modules/process/dimensions.h:427 modules/xyz/xyz_drift.c:725
+#: modules/xyz/xyz_raster.c:376
 msgid "Resolution"
 msgstr "Resolution"
 
 #: modules/file/nmmxyz.c:538 modules/file/rawfile.c:631
-#: modules/process/dimensions.h:451 modules/xyz/xyz_drift.c:729
-#: modules/xyz/xyz_raster.c:521
+#: modules/process/dimensions.h:433 modules/xyz/xyz_drift.c:729
+#: modules/xyz/xyz_raster.c:382
 msgid "_Horizontal size:"
 msgstr "_Horizontal size:"
 
 #: modules/file/nmmxyz.c:554 modules/file/rawfile.c:638
-#: modules/process/dimensions.h:454 modules/xyz/xyz_drift.c:744
-#: modules/xyz/xyz_raster.c:536
+#: modules/process/dimensions.h:436 modules/xyz/xyz_drift.c:744
+#: modules/xyz/xyz_raster.c:388
 msgid "_Vertical size:"
 msgstr "_Vertical size:"
 
@@ -5322,38 +5499,38 @@ msgstr "Per-axis header field %s contains too many items."
 msgid "Per-axis header field %s contains too few items."
 msgstr "Per-axis header field %s contains too few items."
 
-#: modules/file/nt-mdt.c:843
+#: modules/file/nt-mdt.c:850
 msgid "Imports NT-MDT data files."
 msgstr "Imports NT-MDT data files."
 
-#: modules/file/nt-mdt.c:856
+#: modules/file/nt-mdt.c:863
 msgid "NT-MDT files (.mdt)"
 msgstr "NT-MDT files (.mdt)"
 
-#: modules/file/nt-mdt.c:1491 modules/file/nt-mdt.c:1599
+#: modules/file/nt-mdt.c:1498 modules/file/nt-mdt.c:1606
 msgid "Frame is too short for Frame Mode."
 msgstr "Frame is too short for Frame Mode."
 
-#: modules/file/nt-mdt.c:1506 modules/file/nt-mdt.c:1614
+#: modules/file/nt-mdt.c:1513 modules/file/nt-mdt.c:1621
 msgid "Frame is too short for dots or data."
 msgstr "Frame is too short for dots or data."
 
-#: modules/file/nt-mdt.c:1869
+#: modules/file/nt-mdt.c:1879
 #, c-format
 msgid "End of file reached in frame header #%u."
 msgstr "End of file reached in frame header #%u."
 
-#: modules/file/nt-mdt.c:1877
+#: modules/file/nt-mdt.c:1887
 #, c-format
 msgid "End of file reached in frame data #%u."
 msgstr "End of file reached in frame data #%u."
 
-#: modules/file/nt-mdt.c:1910
+#: modules/file/nt-mdt.c:1920
 #, c-format
 msgid "Frame #%u is too short for scanned data header."
 msgstr "Frame #%u is too short for scanned data header."
 
-#: modules/file/nt-mdt.c:1927
+#: modules/file/nt-mdt.c:1937
 #, c-format
 msgid "Frame #%u is too short for spectroscopy data header."
 msgstr "Frame #%u is too short for spectroscopy data header."
@@ -5467,28 +5644,28 @@ msgstr "Omicron MATRIX (param.mtrx & data.mtrx)"
 msgid "Omicron MATRIX (.mtrx & .mtrx)"
 msgstr "Omicron MATRIX (.mtrx & .mtrx)"
 
-#: modules/file/opdfile.c:188
+#: modules/file/opdfile.c:199
 msgid "Imports Wyko OPD and ASC files."
 msgstr "Imports Wyko OPD and ASC files."
 
-#: modules/file/opdfile.c:201
+#: modules/file/opdfile.c:212
 msgid "Wyko OPD files (.opd)"
 msgstr "Wyko OPD files (.opd)"
 
-#: modules/file/opdfile.c:208
+#: modules/file/opdfile.c:219
 msgid "Wyko ASCII export files (.asc)"
 msgstr "Wyko ASCII export files (.asc)"
 
-#: modules/file/opdfile.c:299
+#: modules/file/opdfile.c:310
 #, c-format
 msgid "Item `%s' is beyond the end of the file."
 msgstr "Item ‘%s’ is beyond the end of the file."
 
-#: modules/file/opdfile.c:614
+#: modules/file/opdfile.c:636
 msgid "Nested directories found"
 msgstr "Nested directories found"
 
-#: modules/file/opdfile.c:805
+#: modules/file/opdfile.c:842
 #, c-format
 msgid "Truncated data in block %s"
 msgstr "Truncated data in block %s"
@@ -5787,19 +5964,21 @@ msgstr "Data Format"
 
 #: modules/file/rawfile.c:567 modules/process/arithmetic.c:234
 #: modules/process/calcoefs_view.c:320 modules/process/coerce.c:250
-#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:637
+#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:638
 #: modules/process/drift.c:242 modules/process/edge.c:635
-#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:183
-#: modules/process/grain_edge.c:210 modules/process/grain_filter.c:313
-#: modules/process/grain_mark.c:244 modules/process/grain_wshed.c:164
-#: modules/process/mark_disconn.c:205 modules/process/mark_with.c:195
-#: modules/process/polydistort.c:205 modules/process/scars.c:295
-#: modules/process/slope_dist.c:273 modules/process/straighten_path.c:198
-#: modules/process/synth.h:509 modules/process/tip_model.c:166
+#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:184
+#: modules/process/fractal.c:225 modules/process/grain_edge.c:209
+#: modules/process/grain_filter.c:312 modules/process/grain_mark.c:243
+#: modules/process/grain_wshed.c:165 modules/process/mark_disconn.c:205
+#: modules/process/mark_with.c:196 modules/process/mfm_field.c:278
+#: modules/process/mfm_shift.c:167 modules/process/polydistort.c:205
+#: modules/process/scars.c:314 modules/process/slope_dist.c:272
+#: modules/process/stitch.c:272 modules/process/straighten_path.c:198
+#: modules/process/synth.h:538 modules/process/tip_model.c:164
 #: modules/process/wpour_mark.c:273 modules/tools/linestats.c:454
-#: modules/tools/sfunctions.c:534 modules/tools/stats.c:459
-#: modules/volume/volume_extract.c:328 modules/volume/volume_linestat.c:287
-#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:443
+#: modules/tools/sfunctions.c:531 modules/tools/stats.c:456
+#: modules/volume/volume_extract.c:321 modules/volume/volume_linestat.c:292
+#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:457
 msgid "_Update"
 msgstr "_Update"
 
@@ -5946,7 +6125,7 @@ msgstr ""
 "<b>Parsing failed</b>\n"
 "The contents of ‘%s’ does not match format: %s."
 
-#: modules/file/rawfile.c:1690 modules/process/neural.c:1580
+#: modules/file/rawfile.c:1690 modules/process/neural.c:1587
 #, c-format
 msgid "The name `%s' is invalid."
 msgstr "The name ‘%s’ is invalid."
@@ -6039,7 +6218,8 @@ msgstr "XYZ data files"
 msgid "Import XYZ Data"
 msgstr "Import XYZ Data"
 
-#: modules/file/rawxyz.c:279
+#: modules/file/rawxyz.c:279 modules/graph/graph_stats.c:305
+#: modules/graph/graph_stats.c:756 modules/graph/graph_stats.c:800
 msgid "Number of points:"
 msgstr "Number of points:"
 
@@ -6059,7 +6239,7 @@ msgstr "Z-range:"
 msgid "_Lateral units:"
 msgstr "_Lateral units:"
 
-#: modules/file/rawxyz.c:386 modules/process/dimensions.h:494
+#: modules/file/rawxyz.c:386 modules/process/dimensions.h:479
 msgid "_Value units:"
 msgstr "_Value units:"
 
@@ -6075,18 +6255,14 @@ msgstr "Renishaw WiRE data files (.wdf)"
 msgid "MapArea block is truncated"
 msgstr "MapArea block is truncated"
 
-#: modules/file/renishaw.c:787
+#: modules/file/renishaw.c:793
 msgid "Random points order unsupported"
 msgstr "Random points order is unsupported"
 
-#: modules/file/renishaw.c:1396
+#: modules/file/renishaw.c:1405
 msgid "Block header is truncated"
 msgstr "Block header is truncated"
 
-#: modules/file/renishaw.c:1411
-msgid "Data block is truncated"
-msgstr "Data block is truncated"
-
 #: modules/file/rhk-sm3.c:236
 msgid "Imports RHK Technology SM3 data files."
 msgstr "Imports RHK Technology SM3 data files."
@@ -6348,19 +6524,23 @@ msgstr "Loads SPML (Scanning Probe Microscopy Markup Language) data files."
 msgid "SPML files (.xml)"
 msgstr "SPML files (.xml)"
 
-#: modules/file/spmlab.c:131
+#: modules/file/spmlab.c:175
 msgid "Imports Thermicroscopes SpmLab R3 to R7 data files."
 msgstr "Imports Thermicroscopes SpmLab R3 to R7 data files."
 
-#: modules/file/spmlab.c:144
+#: modules/file/spmlab.c:188
 msgid "Thermicroscopes SpmLab files"
 msgstr "Thermicroscopes SpmLab files"
 
-#: modules/file/spmlab.c:231
+#: modules/file/spmlab.c:259
 #, c-format
 msgid "Unknown format version %c."
 msgstr "Unknown format version %c."
 
+#: modules/file/spmlab.c:283
+msgid "Data block is truncated."
+msgstr "Data block is truncated."
+
 #: modules/file/spmlabf.c:79
 msgid "Imports SPMLab floating-point files."
 msgstr "Imports SPMLab floating-point files."
@@ -6557,11 +6737,11 @@ msgstr "Imports WinSTM (.stm) files."
 msgid "WinSTM files (.stm)"
 msgstr "WinSTM files (.stm)"
 
-#: modules/file/wipfile.c:272
+#: modules/file/wipfile.c:281
 msgid "Imports WItec Project data files."
 msgstr "Imports WItec Project data files."
 
-#: modules/file/wipfile.c:285
+#: modules/file/wipfile.c:294
 msgid "WItec Project files (.wip)"
 msgstr "WItec Project files (.wip)"
 
@@ -6622,21 +6802,21 @@ msgstr "Exports data as simple XYZ text file."
 msgid "XYZ text data (.xyz)"
 msgstr "XYZ text data (.xyz)"
 
-#: modules/file/xyzexport.c:244
+#: modules/file/xyzexport.c:247
 msgid "Lateral units:"
 msgstr "Lateral units:"
 
-#: modules/file/xyzexport.c:290
+#: modules/file/xyzexport.c:293
 msgid "Export XYZ"
 msgstr "Export XYZ"
 
-#: modules/file/xyzexport.c:340 modules/process/curvature.c:704
+#: modules/file/xyzexport.c:343 modules/process/curvature.c:700
 #: modules/process/entropy.c:214 modules/process/facet-level.c:207
-#: modules/process/fit-shape.c:743 modules/process/level.c:259
-#: modules/process/linematch.c:906 modules/process/neural.c:593
-#: modules/process/polylevel.c:491 modules/process/slope_dist.c:418
-#: modules/tools/filter.c:300 modules/tools/linestats.c:436
-#: modules/tools/profile.c:591 modules/tools/sfunctions.c:516
+#: modules/process/fit-shape.c:755 modules/process/level.c:259
+#: modules/process/linematch.c:869 modules/process/neural.c:597
+#: modules/process/polylevel.c:494 modules/process/slope_dist.c:411
+#: modules/tools/filter.c:301 modules/tools/linestats.c:436
+#: modules/tools/profile.c:572 modules/tools/sfunctions.c:513
 #: modules/tools/stats.c:389
 msgid "Masking Mode"
 msgstr "Masking Mode"
@@ -6649,6 +6829,14 @@ msgstr "Imports Carl Zeiss SEM images."
 msgid "Carl Zeiss SEM scans (.tif)"
 msgstr "Carl Zeiss SEM scans (.tif)"
 
+#: modules/file/zeisslsm.c:383
+msgid "Imports Carl Zeiss CLSM images."
+msgstr "Imports Carl Zeiss CLSM images."
+
+#: modules/file/zeisslsm.c:396
+msgid "Carl Zeiss CLSM images (.lsm)"
+msgstr "Carl Zeiss CLSM images (.lsm)"
+
 #: modules/file/zemax.c:72
 msgid "Imports Zemax grid sag data files."
 msgstr "Imports Zemax grid sag data files."
@@ -6671,15 +6859,15 @@ msgstr "Unit code %d is invalid or unsupported."
 msgid "The first line contains too many items."
 msgstr "The first line contains too many items."
 
-#: modules/graph/graph_align.c:57
+#: modules/graph/graph_align.c:60
 msgid "Aligns graph curves."
 msgstr "Aligns graph curves."
 
-#: modules/graph/graph_align.c:71
+#: modules/graph/graph_align.c:74
 msgid "/_Align"
 msgstr "/_Align"
 
-#: modules/graph/graph_align.c:74
+#: modules/graph/graph_align.c:77
 msgid "Align curves"
 msgstr "Align curves"
 
@@ -6695,48 +6883,50 @@ msgstr "/_Critical Dimension..."
 msgid "Fit critical dimension"
 msgstr "Fit critical dimension"
 
-#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:267
+#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:270
 msgid "Fit Graph"
 msgstr "Fit Graph"
 
-#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:251
-#: modules/graph/graph_fit.c:270 modules/process/fit-shape.c:393
+#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:254
+#: modules/graph/graph_fit.c:273 modules/process/fit-shape.c:394
 #: modules/volume/volume_fdfit.c:299
 msgid "verb|_Fit"
 msgstr "_Fit"
 
-#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:166
-#: modules/graph/graph_fdfit.c:306 modules/graph/graph_fit.c:325
-#: modules/graph/graph_peaks.c:199
+#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:168
+#: modules/graph/graph_fdfit.c:313 modules/graph/graph_fit.c:332
+#: modules/graph/graph_peaks.c:199 modules/graph/graph_stats.c:268
 msgid "_Graph curve:"
 msgstr "_Graph curve:"
 
-#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:320
-#: modules/graph/graph_fit.c:339 modules/volume/volume_fdfit.c:405
+#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:327
+#: modules/graph/graph_fit.c:346 modules/volume/volume_fdfit.c:389
 msgid "F_unction:"
 msgstr "F_unction:"
 
-#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:361
-#: modules/graph/graph_fit.c:375 modules/process/curvature.c:745
-#: modules/process/fit-shape.c:792 modules/volume/volume_fdfit.c:446
+#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:368
+#: modules/graph/graph_fit.c:382 modules/process/curvature.c:742
+#: modules/process/fit-shape.c:804 modules/volume/volume_fdfit.c:422
 msgid "Parameter"
 msgstr "Parameter"
 
-#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:363
-#: modules/graph/graph_fit.c:377 modules/process/fit-shape.c:794
-#: modules/volume/volume_fdfit.c:448
+#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:370
+#: modules/graph/graph_fit.c:384 modules/process/fit-shape.c:806
+#: modules/volume/volume_fdfit.c:424
 msgid "Error"
 msgstr "Error"
 
-#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:196
-#: modules/graph/graph_fdfit.c:415 modules/graph/graph_fit.c:433
-#: modules/volume/volume_fdfit.c:500 modules/volume/volume_linestat.c:389
+#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:189
+#: modules/graph/graph_fdfit.c:422 modules/graph/graph_fit.c:440
+#: modules/graph/graph_stats.c:279 modules/graph/graph_stats.c:793
+#: modules/volume/volume_fdfit.c:476 modules/volume/volume_linestat.c:394
 msgid "Range:"
 msgstr "Range:"
 
-#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:207
-#: modules/graph/graph_fdfit.c:426 modules/graph/graph_fit.c:444
-#: modules/volume/volume_fdfit.c:511 modules/volume/volume_linestat.c:400
+#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:200
+#: modules/graph/graph_fdfit.c:433 modules/graph/graph_fit.c:451
+#: modules/graph/graph_stats.c:290 modules/graph/graph_stats.c:796
+#: modules/volume/volume_fdfit.c:487 modules/volume/volume_linestat.c:405
 msgid "range|to"
 msgstr "to"
 
@@ -6744,92 +6934,92 @@ msgstr "to"
 msgid "_Draw whole circle"
 msgstr "_Draw whole circle"
 
-#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:491
-#: modules/graph/graph_fit.c:531 modules/process/fit-shape.c:522
-#: modules/volume/volume_fdfit.c:573
+#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:498
+#: modules/graph/graph_fit.c:538 modules/process/fit-shape.c:523
+#: modules/volume/volume_fdfit.c:549
 msgid "Save Fit Report"
 msgstr "Save Fit Report"
 
 #: modules/graph/graph_cd.c:529 modules/graph/graph_cd.c:1107
-#: modules/graph/graph_fdfit.c:709 modules/graph/graph_fit.c:763
-#: modules/volume/volume_fdfit.c:907
+#: modules/graph/graph_fdfit.c:725 modules/graph/graph_fit.c:779
+#: modules/volume/volume_fdfit.c:883
 msgid "Fit"
 msgstr "Fit"
 
-#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:749
-#: modules/graph/graph_fit.c:803 modules/volume/volume_fdfit.c:978
-#: modules/volume/volume_fdfit.c:1085
+#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:765
+#: modules/graph/graph_fit.c:819 modules/volume/volume_fdfit.c:954
+#: modules/volume/volume_fdfit.c:1061
 msgid "It is necessary to select more data points than free fit parameters"
 msgstr "It is necessary to select more data points than free fit parameters"
 
-#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:798
-#: modules/graph/graph_fit.c:852 modules/process/entropy.c:554
-#: modules/tools/grainmeasure.c:217 modules/tools/readvalue.c:634
-#: modules/tools/readvalue.c:635 modules/tools/readvalue.c:636
-#: modules/tools/readvalue.c:637 modules/tools/roughness.c:975
-#: modules/tools/stats.c:727 modules/tools/stats.c:740
-#: modules/tools/stats.c:741 modules/volume/volume_fdfit.c:1134
-#: modules/xyz/xyz_drift.c:1099 modules/xyz/xyz_drift.c:1117
-#: modules/xyz/xyz_drift.c:1134
+#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:814
+#: modules/graph/graph_fit.c:868 modules/graph/graph_stats.c:663
+#: modules/process/entropy.c:555 modules/tools/grainmeasure.c:217
+#: modules/tools/readvalue.c:634 modules/tools/readvalue.c:635
+#: modules/tools/readvalue.c:636 modules/tools/readvalue.c:637
+#: modules/tools/roughness.c:984 modules/tools/stats.c:723
+#: modules/tools/stats.c:736 modules/tools/stats.c:737
+#: modules/volume/volume_fdfit.c:1110 modules/xyz/xyz_drift.c:1099
+#: modules/xyz/xyz_drift.c:1117 modules/xyz/xyz_drift.c:1134
 msgid "N.A."
 msgstr "N.A."
 
-#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1363
-#: modules/graph/graph_fit.c:1500 modules/process/fit-shape.c:2078
-#: modules/volume/volume_fdfit.c:1720
+#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1381
+#: modules/graph/graph_fit.c:1518 modules/process/fit-shape.c:2060
+#: modules/volume/volume_fdfit.c:1696
 msgid "===== Fit Results ====="
 msgstr "===== Fit Results ====="
 
-#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1367
-#: modules/graph/graph_fit.c:1504 modules/process/fit-shape.c:2080
-#: modules/volume/volume_fdfit.c:1724
+#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1385
+#: modules/graph/graph_fit.c:1522 modules/process/fit-shape.c:2062
+#: modules/volume/volume_fdfit.c:1700
 #, c-format
 msgid "Data:             %s\n"
 msgstr "Data:             %s\n"
 
-#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1370
-#: modules/graph/graph_fit.c:1507 modules/process/fit-shape.c:2082
-#: modules/volume/volume_fdfit.c:1727
+#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1388
+#: modules/graph/graph_fit.c:1525 modules/process/fit-shape.c:2064
+#: modules/volume/volume_fdfit.c:1703
 #, c-format
 msgid "Number of points: %d of %d\n"
 msgstr "Number of points: %d of %d\n"
 
-#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1374
-#: modules/graph/graph_fit.c:1511 modules/volume/volume_fdfit.c:1731
+#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1392
+#: modules/graph/graph_fit.c:1529 modules/volume/volume_fdfit.c:1707
 #, c-format
 msgid "X range:          %.*f to %.*f %s\n"
 msgstr "X-range:          %.*f to %.*f %s\n"
 
-#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1380
-#: modules/graph/graph_fit.c:1517 modules/process/fit-shape.c:2084
-#: modules/volume/volume_fdfit.c:1737
+#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1398
+#: modules/graph/graph_fit.c:1535 modules/process/fit-shape.c:2066
+#: modules/volume/volume_fdfit.c:1713
 #, c-format
 msgid "Fitted function:  %s\n"
 msgstr "Fitted function:  %s\n"
 
-#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1383
-#: modules/graph/graph_fit.c:1520 modules/process/fit-shape.c:2087
-#: modules/volume/volume_fdfit.c:1740
+#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1401
+#: modules/graph/graph_fit.c:1538 modules/process/fit-shape.c:2069
+#: modules/volume/volume_fdfit.c:1716
 msgid "Results\n"
 msgstr "Results\n"
 
-#: modules/graph/graph_cut.c:88
+#: modules/graph/graph_cut.c:87
 msgid "Cut graph"
 msgstr "Cut graph"
 
-#: modules/graph/graph_cut.c:102
+#: modules/graph/graph_cut.c:101
 msgid "/_Cut..."
 msgstr "/_Cut..."
 
-#: modules/graph/graph_cut.c:105
+#: modules/graph/graph_cut.c:104
 msgid "Extract part of graph into new one"
 msgstr "Extract part of graph into new one"
 
-#: modules/graph/graph_cut.c:146
+#: modules/graph/graph_cut.c:145
 msgid "Cut Graph"
 msgstr "Cut Graph"
 
-#: modules/graph/graph_cut.c:180
+#: modules/graph/graph_cut.c:173
 msgid "Cut _all curves"
 msgstr "Cut _all curves"
 
@@ -6927,97 +7117,97 @@ msgstr "Export graph to a raster image"
 msgid "Export to PNG"
 msgstr "Export to PNG"
 
-#: modules/graph/graph_export_vector.c:35
+#: modules/graph/graph_export_vector.c:36
 msgid "Exports graphs to PostScript"
 msgstr "Exports graphs to PostScript"
 
-#: modules/graph/graph_export_vector.c:49
+#: modules/graph/graph_export_vector.c:50
 msgid "/Export _PostScript"
 msgstr "/Export _PostScript"
 
-#: modules/graph/graph_export_vector.c:52
+#: modules/graph/graph_export_vector.c:53
 msgid "Export graph to PostScript"
 msgstr "Export graph to PostScript"
 
-#: modules/graph/graph_export_vector.c:65
+#: modules/graph/graph_export_vector.c:66
 msgid "Export to PostScript"
 msgstr "Export to PostScript"
 
-#: modules/graph/graph_fdfit.c:168
+#: modules/graph/graph_fdfit.c:169
 msgid "Fit force-distance data"
 msgstr "Fit force-distance data"
 
-#: modules/graph/graph_fdfit.c:182
+#: modules/graph/graph_fdfit.c:183
 msgid "/_Fit FD Curve..."
 msgstr "/_Fit FD Curve..."
 
-#: modules/graph/graph_fdfit.c:185
+#: modules/graph/graph_fdfit.c:186
 msgid "Fit a force-distance curve"
 msgstr "Fit a force-distance curve"
 
-#: modules/graph/graph_fdfit.c:248 modules/volume/volume_fdfit.c:296
+#: modules/graph/graph_fdfit.c:251 modules/volume/volume_fdfit.c:296
 msgid "Fit FD Curve"
 msgstr "Fit FD Curve"
 
-#: modules/graph/graph_fdfit.c:255 modules/graph/graph_fit.c:274
-#: modules/process/fit-shape.c:397 modules/process/measure_lattice.c:257
-#: modules/volume/volume_fdfit.c:303
+#: modules/graph/graph_fdfit.c:258 modules/graph/graph_fit.c:277
+#: modules/process/correct_affine.c:347 modules/process/fit-shape.c:398
+#: modules/process/measure_lattice.c:247 modules/volume/volume_fdfit.c:303
 msgid "verb|_Estimate"
 msgstr "_Estimate"
 
-#: modules/graph/graph_fdfit.c:257 modules/graph/graph_fit.c:276
-#: modules/volume/volume_fdfit.c:305
+#: modules/graph/graph_fdfit.c:260 modules/graph/graph_fit.c:279
+#: modules/process/psf.c:239 modules/volume/volume_fdfit.c:305
 msgid "_Plot Inits"
 msgstr "_Plot Inits"
 
-#: modules/graph/graph_fdfit.c:359 modules/graph/graph_fit.c:373
-#: modules/process/fit-shape.c:790 modules/volume/volume_fdfit.c:444
+#: modules/graph/graph_fdfit.c:366 modules/graph/graph_fit.c:380
+#: modules/process/fit-shape.c:802 modules/volume/volume_fdfit.c:420
 msgid "Fix"
 msgstr "Fix"
 
-#: modules/graph/graph_fdfit.c:365 modules/graph/graph_fit.c:379
-#: modules/volume/volume_fdfit.c:450
+#: modules/graph/graph_fdfit.c:372 modules/graph/graph_fit.c:386
+#: modules/volume/volume_fdfit.c:426
 msgid "Initial"
 msgstr "Initial"
 
-#: modules/graph/graph_fdfit.c:376 modules/graph/graph_fit.c:394
-#: modules/volume/volume_fdfit.c:461
+#: modules/graph/graph_fdfit.c:383 modules/graph/graph_fit.c:401
+#: modules/volume/volume_fdfit.c:437
 msgid "χ<sup>2</sup> result:"
 msgstr "χ<sup>2</sup> result:"
 
-#: modules/graph/graph_fdfit.c:392 modules/graph/graph_fit.c:410
-#: modules/process/fit-shape.c:469 modules/process/fit-shape.c:2134
-#: modules/volume/volume_fdfit.c:477
+#: modules/graph/graph_fdfit.c:399 modules/graph/graph_fit.c:417
+#: modules/process/fit-shape.c:470 modules/process/fit-shape.c:2116
+#: modules/volume/volume_fdfit.c:453
 msgid "Correlation Matrix"
 msgstr "Correlation Matrix"
 
-#: modules/graph/graph_fdfit.c:447 modules/graph/graph_fit.c:485
-#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:532
+#: modules/graph/graph_fdfit.c:454 modules/graph/graph_fit.c:492
+#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:508
 msgid "Instant:"
 msgstr "Instant:"
 
-#: modules/graph/graph_fdfit.c:450 modules/graph/graph_fit.c:488
+#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
 msgid "esti_mate"
 msgstr "esti_mate"
 
-#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
-#: modules/volume/volume_fdfit.c:542
+#: modules/graph/graph_fdfit.c:464 modules/graph/graph_fit.c:502
+#: modules/volume/volume_fdfit.c:518
 msgid "p_lot"
 msgstr "p_lot"
 
-#: modules/graph/graph_fdfit.c:708 modules/graph/graph_fit.c:762
-#: modules/volume/volume_fdfit.c:906
+#: modules/graph/graph_fdfit.c:724 modules/graph/graph_fit.c:778
+#: modules/volume/volume_fdfit.c:882
 msgid "Estimate"
 msgstr "Estimate"
 
-#: modules/graph/graph_fdfit.c:1410 modules/graph/graph_fit.c:1547
-#: modules/volume/volume_fdfit.c:1768
+#: modules/graph/graph_fdfit.c:1428 modules/graph/graph_fit.c:1565
+#: modules/volume/volume_fdfit.c:1744
 #, c-format
 msgid "Residual sum:   %g\n"
 msgstr "Residual sum:   %g\n"
 
-#: modules/graph/graph_fdfit.c:1413 modules/graph/graph_fit.c:1550
-#: modules/volume/volume_fdfit.c:1771
+#: modules/graph/graph_fdfit.c:1431 modules/graph/graph_fit.c:1568
+#: modules/volume/volume_fdfit.c:1747
 msgid "Correlation matrix\n"
 msgstr "Correlation matrix\n"
 
@@ -7033,27 +7223,27 @@ msgstr "/_Filter"
 msgid "Remove noise from graph curves"
 msgstr "Remove noise from graph curves"
 
-#: modules/graph/graph_fit.c:181
+#: modules/graph/graph_fit.c:182
 msgid "Fit graph with function"
 msgstr "Fit graph with function"
 
-#: modules/graph/graph_fit.c:195
+#: modules/graph/graph_fit.c:196
 msgid "/_Fit Function..."
 msgstr "/_Fit Function..."
 
-#: modules/graph/graph_fit.c:198
+#: modules/graph/graph_fit.c:199
 msgid "Fit a function on graph data"
 msgstr "Fit a function on graph data"
 
-#: modules/graph/graph_fit.c:386
+#: modules/graph/graph_fit.c:393
 msgid "Copy all fitted values to estimates"
 msgstr "Copy all fitted values to estimates"
 
-#: modules/graph/graph_fit.c:460
+#: modules/graph/graph_fit.c:467
 msgid "Plot full range"
 msgstr "Plot full range"
 
-#: modules/graph/graph_fit.c:470
+#: modules/graph/graph_fit.c:477
 msgid "Create a difference graph"
 msgstr "Create a difference graph"
 
@@ -7137,52 +7327,135 @@ msgstr "/Find _Peaks..."
 msgid "Find graph curve peaks"
 msgstr "Find graph curve peaks"
 
-#: modules/graph/graph_peaks.c:157
+#: modules/graph/graph_peaks.c:155
 msgid "Prominence"
 msgstr "Prominence"
 
-#: modules/graph/graph_peaks.c:161
+#: modules/graph/graph_peaks.c:159
 msgid "Zero"
 msgstr "Zero"
 
-#: modules/graph/graph_peaks.c:162
+#: modules/graph/graph_peaks.c:160
 msgid "Bilateral minimum"
 msgstr "Bilateral minimum"
 
-#: modules/graph/graph_peaks.c:178
+#: modules/graph/graph_peaks.c:176
 msgid "Graph Peaks"
 msgstr "Graph Peaks"
 
-#: modules/graph/graph_peaks.c:212
+#: modules/graph/graph_peaks.c:209
 msgid "_Background type:"
 msgstr "_Background type:"
 
-#: modules/graph/graph_peaks.c:227
+#: modules/graph/graph_peaks.c:219
 msgid "Order peaks _by:"
 msgstr "Order peaks _by:"
 
-#: modules/graph/graph_peaks.c:242
+#: modules/graph/graph_peaks.c:225
 msgid "Number of _peaks:"
 msgstr "Number of _peaks:"
 
-#: modules/graph/graph_peaks.c:263 modules/process/curvature.c:773
-#: modules/process/grain_stat.c:360 modules/process/measure_lattice.c:396
-#: modules/process/polylevel.c:607 modules/tools/distance.c:259
-#: modules/tools/roughness.c:818 modules/tools/stats.c:450
+#: modules/graph/graph_peaks.c:245 modules/graph/graph_stats.c:367
+#: modules/process/curvature.c:770 modules/process/grain_stat.c:360
+#: modules/process/measure_lattice.c:390 modules/process/polylevel.c:610
+#: modules/tools/distance.c:259 modules/tools/roughness.c:819
+#: modules/tools/stats.c:447
 msgid "Save table to a file"
 msgstr "Save table to a file"
 
-#: modules/graph/graph_peaks.c:267 modules/process/curvature.c:778
-#: modules/process/grain_stat.c:365 modules/process/measure_lattice.c:400
-#: modules/process/polylevel.c:617 modules/tools/distance.c:264
-#: modules/tools/roughness.c:823 modules/tools/stats.c:455
+#: modules/graph/graph_peaks.c:249 modules/graph/graph_stats.c:371
+#: modules/process/curvature.c:775 modules/process/grain_stat.c:365
+#: modules/process/measure_lattice.c:394 modules/process/polylevel.c:620
+#: modules/tools/distance.c:264 modules/tools/roughness.c:824
+#: modules/tools/stats.c:452
 msgid "Copy table to clipboard"
 msgstr "Copy table to clipboard"
 
-#: modules/graph/graph_peaks.c:654
+#: modules/graph/graph_peaks.c:618
 msgid "Save Peak Parameters"
 msgstr "Save Peak Parameters"
 
+#: modules/graph/graph_stats.c:148 modules/graph/graph_stats.c:161
+#: modules/tools/stats.c:205
+msgid "Average value:"
+msgstr "Average value:"
+
+#: modules/graph/graph_stats.c:149 modules/tools/stats.c:206
+msgid "Median:"
+msgstr "Median:"
+
+#: modules/graph/graph_stats.c:150
+msgid "Ra:"
+msgstr "Ra:"
+
+#: modules/graph/graph_stats.c:151
+msgid "Rms (Rq):"
+msgstr "Rms (Rq):"
+
+#: modules/graph/graph_stats.c:152 modules/tools/stats.c:210
+msgid "Skew:"
+msgstr "Skew:"
+
+#: modules/graph/graph_stats.c:153 modules/tools/stats.c:211
+msgid "Kurtosis:"
+msgstr "Kurtosis:"
+
+#: modules/graph/graph_stats.c:158
+msgid "Projected length:"
+msgstr "Projected length:"
+
+#: modules/graph/graph_stats.c:159
+msgid "Developed length:"
+msgstr "Developed length:"
+
+#: modules/graph/graph_stats.c:160 modules/tools/stats.c:214
+msgid "Variation:"
+msgstr "Variation:"
+
+#: modules/graph/graph_stats.c:162
+msgid "Area under curve:"
+msgstr "Area under curve:"
+
+#: modules/graph/graph_stats.c:163
+msgid "Positive area:"
+msgstr "Positive area:"
+
+#: modules/graph/graph_stats.c:164
+msgid "Negative area:"
+msgstr "Negative area:"
+
+#: modules/graph/graph_stats.c:165
+msgid "Root mean square:"
+msgstr "Root mean square:"
+
+#: modules/graph/graph_stats.c:171
+msgid "Calculates simple graph curve statistics."
+msgstr "Calculates simple graph curve statistics."
+
+#: modules/graph/graph_stats.c:185
+msgid "/_Statistics..."
+msgstr "/_Statistics..."
+
+#: modules/graph/graph_stats.c:188
+msgid "Calculate graph curve statistics"
+msgstr "Calculate graph curve statistics"
+
+#: modules/graph/graph_stats.c:241
+msgid "Graph Statistics"
+msgstr "Graph Statistics"
+
+#: modules/graph/graph_stats.c:320 modules/graph/graph_stats.c:807
+msgid "Simple Parameters"
+msgstr "Simple Parameters"
+
+#: modules/graph/graph_stats.c:342 modules/graph/graph_stats.c:826
+msgid "Integrals"
+msgstr "Integrals"
+
+#: modules/graph/graph_stats.c:686
+msgid "Save Curve Statistics"
+msgstr "Save Curve Statistics"
+
 #: modules/layer/axis.c:143
 msgid "Layer allowing selection of horizontal or vertical lines."
 msgstr "Layer allowing selection of horizontal or vertical lines."
@@ -7322,25 +7595,25 @@ msgstr "Angle distribution"
 msgid "Angle Distribution"
 msgstr "Angle Distribution"
 
-#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:373
+#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:365
 msgid "Output _size:"
 msgstr "Output _size:"
 
-#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:206
+#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:207
 msgid "_Number of steps:"
 msgstr "_Number of steps:"
 
-#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:380
+#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:372
 msgid "_Logarithmic value scale"
 msgstr "_Logarithmic value scale"
 
 #: modules/process/angle_dist.c:204 modules/process/entropy.c:231
-#: modules/process/slope_dist.c:390
+#: modules/process/slope_dist.c:382
 msgid "Use local plane _fitting"
 msgstr "Use local plane _fitting"
 
 #: modules/process/angle_dist.c:213 modules/process/entropy.c:242
-#: modules/process/slope_dist.c:401
+#: modules/process/slope_dist.c:393
 msgid "_Plane size:"
 msgstr "_Plane size:"
 
@@ -7356,7 +7629,8 @@ msgstr "/M_ultidata/_Arithmetic..."
 msgid "Arithmetic operations on data"
 msgstr "Arithmetic operations on data"
 
-#: modules/process/arithmetic.c:202 modules/process/superresolution.c:349
+#: modules/process/arithmetic.c:202 modules/process/stitch.c:234
+#: modules/process/superresolution.c:348
 msgid "Calculated"
 msgstr "Calculated"
 
@@ -7372,7 +7646,7 @@ msgstr "_Expression:"
 msgid "Operands"
 msgstr "Operands"
 
-#: modules/process/arithmetic.c:300 modules/process/dimensions.h:483
+#: modules/process/arithmetic.c:300 modules/process/dimensions.h:465
 msgid "Units"
 msgstr "Units"
 
@@ -7393,15 +7667,15 @@ msgstr "Specify result units explicitly"
 msgid "Expression contains unknown identifiers"
 msgstr "Expression contains unknown identifiers"
 
-#: modules/process/arithmetic.c:569 modules/process/superresolution.c:300
+#: modules/process/arithmetic.c:569 modules/process/superresolution.c:299
 msgid "Pixel dimensions differ"
 msgstr "Pixel dimensions differ"
 
-#: modules/process/arithmetic.c:571 modules/process/superresolution.c:302
+#: modules/process/arithmetic.c:571 modules/process/superresolution.c:301
 msgid "Lateral dimensions are different physical quantities"
 msgstr "Lateral dimensions are different physical quantities"
 
-#: modules/process/arithmetic.c:574 modules/process/superresolution.c:305
+#: modules/process/arithmetic.c:574 modules/process/superresolution.c:304
 msgid "Physical dimensions differ"
 msgstr "Physical dimensions differ"
 
@@ -7506,8 +7780,8 @@ msgid "Generates surfaces by ballistic deposition."
 msgstr "Generates surfaces by ballistic deposition."
 
 #: modules/process/bdep_synth.c:164
-msgid "/S_ynthetic/_Ballistic..."
-msgstr "/S_ynthetic/_Ballistic..."
+msgid "/S_ynthetic/_Deposition/_Ballistic..."
+msgstr "/S_ynthetic/_Deposition/_Ballistic..."
 
 #: modules/process/bdep_synth.c:168
 msgid "Generate surface by ballistic deposition"
@@ -7515,20 +7789,23 @@ msgstr "Generate surface by ballistic deposition"
 
 #: modules/process/bdep_synth.c:239 modules/process/bdep_synth.c:596
 #: modules/process/calcoefs_simple.c:636 modules/process/col_synth.c:282
-#: modules/process/col_synth.c:733 modules/process/crosscor.c:819
-#: modules/process/crosscor.c:882 modules/process/deposit_synth.c:268
-#: modules/process/deposit_synth.c:859 modules/process/diff_synth.c:304
-#: modules/process/diff_synth.c:705 modules/process/domain_synth.c:255
-#: modules/process/domain_synth.c:745 modules/process/grain_wshed.c:429
+#: modules/process/col_synth.c:734 modules/process/crosscor.c:792
+#: modules/process/crosscor.c:855 modules/process/deposit_synth.c:268
+#: modules/process/deposit_synth.c:858 modules/process/diff_synth.c:304
+#: modules/process/diff_synth.c:704 modules/process/domain_synth.c:255
+#: modules/process/domain_synth.c:745 modules/process/fibre_synth.c:357
+#: modules/process/fibre_synth.c:872 modules/process/grain_wshed.c:433
 #: modules/process/lat_synth.c:491 modules/process/mark_disconn.c:148
-#: modules/process/mark_disconn.c:373 modules/process/maskcor.c:330
-#: modules/process/mcrop.c:315 modules/process/merge.c:1072
-#: modules/process/nanoindent_adjust.c:323 modules/process/neural.c:1272
-#: modules/process/pid.c:338 modules/process/superresolution.c:416
-#: modules/process/superresolution.c:505 modules/process/tip_blind.c:781
-#: modules/process/tipops.c:320 modules/process/xydenoise.c:213
-#: modules/volume/volume_kmeans.c:403 modules/volume/volume_kmedians.c:365
-#: modules/xyz/xyz_raster.c:1028 modules/xyz/xyz_raster.c:1044
+#: modules/process/mark_disconn.c:361 modules/process/maskcor.c:334
+#: modules/process/mcrop.c:314 modules/process/merge.c:1072
+#: modules/process/nanoindent_adjust.c:324 modules/process/neural.c:1279
+#: modules/process/pid.c:339 modules/process/sphere-revolve.c:269
+#: modules/process/superresolution.c:415 modules/process/superresolution.c:504
+#: modules/process/tip_blind.c:778 modules/process/tipops.c:320
+#: modules/process/wave_synth.c:305 modules/process/wave_synth.c:747
+#: modules/process/xydenoise.c:214 modules/volume/volume_kmeans.c:397
+#: modules/volume/volume_kmedians.c:363 modules/xyz/xyz_raster.c:997
+#: modules/xyz/xyz_raster.c:1013
 msgid "Initializing..."
 msgstr "Initialising..."
 
@@ -7537,10 +7814,11 @@ msgstr "Initialising..."
 #: modules/process/deposit_synth.c:531 modules/process/deposit_synth.c:544
 #: modules/process/diff_synth.c:342 modules/process/domain_synth.c:319
 #: modules/process/domain_synth.c:327 modules/process/fbm_synth.c:278
-#: modules/process/fft_synth.c:314 modules/process/lat_synth.c:529
-#: modules/process/lno_synth.c:407 modules/process/noise_synth.c:311
-#: modules/process/obj_synth.c:407 modules/process/pat_synth.c:357
-#: modules/process/wave_synth.c:323
+#: modules/process/fft_synth.c:314 modules/process/fibre_synth.c:394
+#: modules/process/lat_synth.c:529 modules/process/lno_synth.c:405
+#: modules/process/noise_synth.c:309 modules/process/obj_synth.c:404
+#: modules/process/pat_synth.c:357 modules/process/phase_synth.c:518
+#: modules/process/wave_synth.c:342
 msgid "Generated"
 msgstr "Generated"
 
@@ -7559,50 +7837,56 @@ msgid "Progressive preview"
 msgstr "Progressive preview"
 
 #: modules/process/bdep_synth.c:407 modules/process/col_synth.c:458
-#: modules/process/deposit_synth.c:412 modules/process/diff_synth.c:477
+#: modules/process/deposit_synth.c:413 modules/process/diff_synth.c:477
 #: modules/process/domain_synth.c:430 modules/process/fbm_synth.c:360
-#: modules/process/fft_synth.c:398 modules/process/lat_synth.c:626
-#: modules/process/lno_synth.c:490 modules/process/noise_synth.c:394
-#: modules/process/obj_synth.c:498 modules/process/pat_synth.c:442
-#: modules/process/wave_synth.c:407
+#: modules/process/fft_synth.c:398 modules/process/fibre_synth.c:479
+#: modules/process/lat_synth.c:626 modules/process/lno_synth.c:488
+#: modules/process/mfm_current.c:383 modules/process/mfm_parallel.c:384
+#: modules/process/noise_synth.c:392 modules/process/obj_synth.c:495
+#: modules/process/pat_synth.c:442 modules/process/phase_synth.c:263
+#: modules/process/wave_synth.c:426
 msgid "Dimensions"
 msgstr "Dimensions"
 
 #: modules/process/bdep_synth.c:416 modules/process/col_synth.c:467
-#: modules/process/deposit_synth.c:422 modules/process/diff_synth.c:486
+#: modules/process/deposit_synth.c:425 modules/process/diff_synth.c:486
 #: modules/process/domain_synth.c:438 modules/process/fbm_synth.c:371
-#: modules/process/fft_synth.c:409 modules/process/lno_synth.c:501
-#: modules/process/noise_synth.c:405 modules/process/obj_synth.c:509
-#: modules/process/pat_synth.c:454 modules/process/wave_synth.c:418
+#: modules/process/fft_synth.c:409 modules/process/fibre_synth.c:490
+#: modules/process/lno_synth.c:499 modules/process/mfm_current.c:412
+#: modules/process/mfm_parallel.c:411 modules/process/noise_synth.c:403
+#: modules/process/obj_synth.c:506 modules/process/pat_synth.c:454
+#: modules/process/phase_synth.c:274 modules/process/wave_synth.c:437
 msgid "Generator"
 msgstr "Generator"
 
 #: modules/process/bdep_synth.c:422 modules/process/col_synth.c:473
-#: modules/process/diff_synth.c:492 modules/process/lno_synth.c:1041
-#: modules/process/obj_synth.c:520
+#: modules/process/deposit_synth.c:455 modules/process/diff_synth.c:492
+#: modules/process/fibre_synth.c:502 modules/process/lno_synth.c:1041
+#: modules/process/obj_synth.c:518
 msgid "Co_verage:"
 msgstr "Co_verage:"
 
 #: modules/process/bdep_synth.c:434 modules/process/diff_synth.c:512
-#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:412
-#: modules/process/fft_synth.c:418 modules/process/lat_synth.c:758
-#: modules/process/lno_synth.c:537 modules/process/noise_synth.c:437
-#: modules/process/obj_synth.c:579 modules/process/wave_synth.c:453
-msgid "_Like Current Channel"
-msgstr "_Like Current Channel"
-
-#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:541
-#: modules/process/diff_synth.c:562
+#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:411
+#: modules/process/fft_synth.c:418 modules/process/fibre_synth.c:544
+#: modules/process/lat_synth.c:758 modules/process/lno_synth.c:535
+#: modules/process/noise_synth.c:435 modules/process/obj_synth.c:577
+#: modules/process/phase_synth.c:302 modules/process/wave_synth.c:472
+msgid "_Like Current Image"
+msgstr "_Like Current Image"
+
+#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:542
+#: modules/process/diff_synth.c:561
 msgid "Evolution"
 msgstr "Evolution"
 
-#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:544
-#: modules/process/diff_synth.c:565
+#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:545
+#: modules/process/diff_synth.c:564
 msgid "Plot graphs:"
 msgstr "Plot graphs:"
 
-#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:840
-#: modules/process/diff_synth.c:782
+#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:841
+#: modules/process/diff_synth.c:781
 msgid "Depositing particles..."
 msgstr "Depositing particles..."
 
@@ -7637,8 +7921,8 @@ msgstr "Load Calibration Data"
 msgid "Calibration name:"
 msgstr "Calibration name:"
 
-#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:433
-#: modules/volume/volume_extract.c:514
+#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:421
+#: modules/volume/volume_extract.c:501
 msgid "No data loaded"
 msgstr "No data loaded"
 
@@ -7662,7 +7946,7 @@ msgstr "Append"
 msgid "Load calibration data"
 msgstr "Load calibration data"
 
-#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1073
+#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1059
 #, c-format
 msgid "Error loading file '%s'"
 msgstr "Error loading file ‘%s’"
@@ -7756,7 +8040,7 @@ msgstr "Simple error mapping"
 msgid "Simple Error Map"
 msgstr "Simple Error Map"
 
-#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:146
+#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:142
 #: modules/process/superresolution.c:156
 msgid "Operands:"
 msgstr "Operands:"
@@ -7770,14 +8054,14 @@ msgid "Detail"
 msgstr "Detail"
 
 #: modules/process/calcoefs_simple.c:371 modules/process/calcoefs_view.c:491
-#: modules/process/calibrate.c:496 modules/process/crosscor.c:289
-#: modules/volume/volume_calibrate.c:478
+#: modules/process/calibrate.c:481 modules/process/crosscor.c:276
+#: modules/volume/volume_calibrate.c:460
 msgid "_X offset:"
 msgstr "_X offset:"
 
 #: modules/process/calcoefs_simple.c:398 modules/process/calcoefs_view.c:517
-#: modules/process/calibrate.c:509 modules/process/crosscor.c:300
-#: modules/volume/volume_calibrate.c:491
+#: modules/process/calibrate.c:488 modules/process/crosscor.c:284
+#: modules/volume/volume_calibrate.c:467
 msgid "_Y offset:"
 msgstr "_Y offset:"
 
@@ -7790,7 +8074,7 @@ msgid "Y p_eriod:"
 msgstr "Y p_eriod:"
 
 #: modules/process/calcoefs_simple.c:438 modules/process/calcoefs_view.c:529
-#: modules/volume/volume_calibrate.c:505
+#: modules/volume/volume_calibrate.c:474
 msgid "_Z offset:"
 msgstr "_Z offset:"
 
@@ -7821,25 +8105,25 @@ msgstr[1] "%d objects found"
 msgid "Search canceled"
 msgstr "Search cancelled"
 
-#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:862
-#: modules/process/maskcor.c:332 modules/process/mcrop.c:317
+#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:835
+#: modules/process/maskcor.c:336 modules/process/mcrop.c:316
 #: modules/process/merge.c:1074
 msgid "Correlating..."
 msgstr "Correlating..."
 
-#: modules/process/calcoefs_stage.c:76
+#: modules/process/calcoefs_stage.c:72
 msgid "Digital AFM data recalibration"
 msgstr "Digital AFM data recalibration"
 
-#: modules/process/calcoefs_stage.c:90
+#: modules/process/calcoefs_stage.c:86
 msgid "/Cali_bration/_3D Calibration/_Get From Stage map..."
 msgstr "/Cali_bration/_3D Calibration/_Get From Stage map..."
 
-#: modules/process/calcoefs_stage.c:94
+#: modules/process/calcoefs_stage.c:90
 msgid "Stage error mapping"
 msgstr "Stage error mapping"
 
-#: modules/process/calcoefs_stage.c:131
+#: modules/process/calcoefs_stage.c:127
 msgid "Stage Error Map"
 msgstr "Stage Error Map"
 
@@ -7895,14 +8179,16 @@ msgstr "Z position:"
 msgid "Crop to actual data"
 msgstr "Crop to actual data"
 
-#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:369
-#: modules/process/deposit_synth.c:641 modules/process/edge.c:705
-#: modules/process/fft_filter_1d.c:299 modules/process/grain_edge.c:290
-#: modules/process/grain_filter.c:347 modules/process/grain_mark.c:372
-#: modules/process/mark_with.c:318 modules/process/polydistort.c:316
-#: modules/process/scars.c:386 modules/process/slope_dist.c:407
-#: modules/process/synth.h:513 modules/volume/volume_extract.c:424
-#: modules/volume/volume_extract.c:505 modules/volume/volume_linestat.c:422
+#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:368
+#: modules/process/deposit_synth.c:642 modules/process/edge.c:705
+#: modules/process/fft_filter_1d.c:301 modules/process/grain_edge.c:277
+#: modules/process/grain_filter.c:346 modules/process/grain_mark.c:357
+#: modules/process/mark_with.c:322 modules/process/mfm_field.c:420
+#: modules/process/mfm_shift.c:216 modules/process/polydistort.c:319
+#: modules/process/psf.c:309 modules/process/scars.c:421
+#: modules/process/slope_dist.c:400 modules/process/synth.h:542
+#: modules/volume/volume_extract.c:411 modules/volume/volume_extract.c:491
+#: modules/volume/volume_linestat.c:427
 msgid "I_nstant updates"
 msgstr "I_nstant updates"
 
@@ -7943,27 +8229,27 @@ msgstr "Error: out of range."
 msgid "Building mesh..."
 msgstr "Building mesh..."
 
-#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1818
+#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1867
 msgid "X correction"
 msgstr "X correction"
 
-#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1819
+#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1868
 msgid "Y correction"
 msgstr "Y correction"
 
-#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1820
+#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1869
 msgid "Z correction"
 msgstr "Z correction"
 
-#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1821
+#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1870
 msgid "X uncertainty"
 msgstr "X uncertainty"
 
-#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1822
+#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1871
 msgid "Y uncertainty"
 msgstr "Y uncertainty"
 
-#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1823
+#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1872
 msgid "Z uncertainty"
 msgstr "Z uncertainty"
 
@@ -7991,78 +8277,78 @@ msgstr "Snap to planes"
 msgid "Delaunay"
 msgstr "Delaunay"
 
-#: modules/process/calibrate.c:180
+#: modules/process/calibrate.c:172
 msgid "Recalibrates scan lateral dimensions or value range."
 msgstr "Recalibrates scan lateral dimensions or value range."
 
-#: modules/process/calibrate.c:194
+#: modules/process/calibrate.c:186
 msgid "/_Basic Operations/_Dimensions and Units..."
 msgstr "/_Basic Operations/_Dimensions and Units..."
 
-#: modules/process/calibrate.c:198 modules/volume/volume_calibrate.c:193
+#: modules/process/calibrate.c:190 modules/volume/volume_calibrate.c:193
 msgid "Change physical dimensions, units or value scale"
 msgstr "Change physical dimensions, units or value scale"
 
-#: modules/process/calibrate.c:357 modules/volume/volume_calibrate.c:355
+#: modules/process/calibrate.c:349 modules/volume/volume_calibrate.c:355
 msgid "Recalibrated Data"
 msgstr "Recalibrated Data"
 
-#: modules/process/calibrate.c:390
+#: modules/process/calibrate.c:382
 msgid "Dimensions and Units"
 msgstr "Dimensions and Units"
 
-#: modules/process/calibrate.c:411 modules/volume/volume_calibrate.c:389
+#: modules/process/calibrate.c:405 modules/volume/volume_calibrate.c:391
 msgid "New Real Dimensions"
 msgstr "New Real Dimensions"
 
-#: modules/process/calibrate.c:417
+#: modules/process/calibrate.c:415
 msgid "_Match pixel size:"
 msgstr "_Match pixel size:"
 
-#: modules/process/calibrate.c:444 modules/volume/volume_calibrate.c:394
+#: modules/process/calibrate.c:447 modules/volume/volume_calibrate.c:397
 msgid "_X range:"
 msgstr "_X range:"
 
-#: modules/process/calibrate.c:473 modules/volume/volume_calibrate.c:421
+#: modules/process/calibrate.c:467 modules/volume/volume_calibrate.c:417
 msgid "_Y range:"
 msgstr "_Y range:"
 
-#: modules/process/calibrate.c:489
+#: modules/process/calibrate.c:472
 msgid "_Square samples"
 msgstr "_Square samples"
 
-#: modules/process/calibrate.c:524 modules/volume/volume_calibrate.c:521
+#: modules/process/calibrate.c:496 modules/volume/volume_calibrate.c:480
 msgid "Value Range"
 msgstr "Value Range"
 
-#: modules/process/calibrate.c:529 modules/volume/volume_calibrate.c:448
+#: modules/process/calibrate.c:502 modules/volume/volume_calibrate.c:437
 msgid "_Z range:"
 msgstr "_Z range:"
 
-#: modules/process/calibrate.c:558
+#: modules/process/calibrate.c:524
 msgid "Z shi_ft:"
 msgstr "Z shi_ft:"
 
-#: modules/process/calibrate.c:573 modules/volume/volume_calibrate.c:570
+#: modules/process/calibrate.c:533 modules/volume/volume_calibrate.c:515
 msgid "Calibration Coefficients"
 msgstr "Calibration Coefficients"
 
-#: modules/process/calibrate.c:580 modules/volume/volume_calibrate.c:577
+#: modules/process/calibrate.c:538 modules/volume/volume_calibrate.c:520
 msgid "_X calibration factor:"
 msgstr "_X calibration factor:"
 
-#: modules/process/calibrate.c:590 modules/volume/volume_calibrate.c:585
+#: modules/process/calibrate.c:545 modules/volume/volume_calibrate.c:527
 msgid "_Y calibration factor:"
 msgstr "_Y calibration factor:"
 
-#: modules/process/calibrate.c:600 modules/volume/volume_calibrate.c:593
+#: modules/process/calibrate.c:552 modules/volume/volume_calibrate.c:534
 msgid "_Z calibration factor:"
 msgstr "_Z calibration factor:"
 
-#: modules/process/calibrate.c:613 modules/process/extend.c:293
-#: modules/tools/crop.c:213
-msgid "Create new channel"
-msgstr "Create new channel"
+#: modules/process/calibrate.c:567 modules/process/drift.c:389
+#: modules/process/extend.c:293 modules/tools/crop.c:213
+msgid "Create new image"
+msgstr "Create new image"
 
 #: modules/process/coerce.c:159
 msgid "Transforms surfaces to have prescribed statistical properties."
@@ -8081,13 +8367,13 @@ msgid "Coerced"
 msgstr "Coerced"
 
 #: modules/process/coerce.c:225 modules/process/coerce.c:326
-#: modules/process/fbm_synth.c:475 modules/process/lno_synth.c:256
-#: modules/process/noise_synth.c:183
+#: modules/process/fbm_synth.c:474 modules/process/lno_synth.c:254
+#: modules/process/noise_synth.c:181
 msgid "distribution|Uniform"
 msgstr "Uniform"
 
-#: modules/process/coerce.c:226 modules/process/fbm_synth.c:476
-#: modules/process/lno_synth.c:246 modules/process/noise_synth.c:173
+#: modules/process/coerce.c:226 modules/process/fbm_synth.c:475
+#: modules/process/lno_synth.c:244 modules/process/noise_synth.c:171
 msgid "distribution|Gaussian"
 msgstr "Gaussian"
 
@@ -8136,12 +8422,12 @@ msgid "Number of maxima"
 msgstr "Number of maxima"
 
 #: modules/process/col_synth.c:173 modules/tools/linestats.c:178
-#: modules/volume/volume_linestat.c:154
+#: modules/volume/volume_linestat.c:156
 msgid "Skew"
 msgstr "Skew"
 
 #: modules/process/col_synth.c:174 modules/tools/linestats.c:179
-#: modules/tools/roughness.c:386 modules/volume/volume_linestat.c:155
+#: modules/tools/roughness.c:387 modules/volume/volume_linestat.c:157
 msgid "Kurtosis"
 msgstr "Kurtosis"
 
@@ -8154,8 +8440,8 @@ msgid "Generates columnar surfaces by a simple growth algorithm."
 msgstr "Generates columnar surfaces by a simple growth algorithm."
 
 #: modules/process/col_synth.c:208
-msgid "/S_ynthetic/_Columnar..."
-msgstr "/S_ynthetic/_Columnar..."
+msgid "/S_ynthetic/_Deposition/_Columnar..."
+msgstr "/S_ynthetic/_Deposition/_Columnar..."
 
 #: modules/process/col_synth.c:212
 msgid "Generate columnar surface"
@@ -8177,7 +8463,7 @@ msgstr "Incidence"
 msgid "Inclination"
 msgstr "Inclination"
 
-#: modules/process/col_synth.c:509 modules/process/crosscor.c:1063
+#: modules/process/col_synth.c:509 modules/process/crosscor.c:1036
 msgid "Direction"
 msgstr "Direction"
 
@@ -8185,15 +8471,15 @@ msgstr "Direction"
 msgid "Relaxation type:"
 msgstr "Relaxation type:"
 
-#: modules/process/col_synth.c:528
+#: modules/process/col_synth.c:529
 msgid "_Melting:"
 msgstr "_Melting:"
 
-#: modules/process/col_synth.c:612
+#: modules/process/col_synth.c:613
 msgid "Weak"
 msgstr "Weak"
 
-#: modules/process/col_synth.c:613
+#: modules/process/col_synth.c:614
 msgid "Strong"
 msgstr "Strong"
 
@@ -8225,8 +8511,8 @@ msgstr "General convolution filter"
 msgid "Convolution Filter"
 msgstr "Convolution Filter"
 
-#: modules/process/convolution_filter.c:269 modules/tools/filter.c:170
-#: modules/tools/filter.c:274
+#: modules/process/convolution_filter.c:269 modules/tools/filter.c:171
+#: modules/tools/filter.c:275
 msgid "Filter"
 msgstr "Filter"
 
@@ -8254,7 +8540,7 @@ msgstr "HSym"
 msgid "VSym"
 msgstr "VSym"
 
-#: modules/process/correct_affine.c:231
+#: modules/process/correct_affine.c:220
 msgid ""
 "Corrects affine distortion of images by matching image Bravais lattice to "
 "the true one."
@@ -8262,101 +8548,109 @@ msgstr ""
 "Corrects affine distortion of images by matching image Bravais lattice to "
 "the true one."
 
-#: modules/process/correct_affine.c:246
+#: modules/process/correct_affine.c:235
 msgid "/_Distortion/_Affine..."
 msgstr "/_Distortion/_Affine..."
 
-#: modules/process/correct_affine.c:250
+#: modules/process/correct_affine.c:239
 msgid "Correct affine distortion"
 msgstr "Correct affine distortion"
 
-#: modules/process/correct_affine.c:298
+#: modules/process/correct_affine.c:309 modules/process/correct_affine.c:634
+msgid "Corrected"
+msgstr "Corrected"
+
+#: modules/process/correct_affine.c:343
 msgid "Affine Correction"
 msgstr "Affine Correction"
 
-#: modules/process/correct_affine.c:351 modules/process/fft_filter_2d.c:530
+#: modules/process/correct_affine.c:349 modules/process/measure_lattice.c:249
+msgid "_Refine"
+msgstr "_Refine"
+
+#: modules/process/correct_affine.c:399 modules/process/fft_filter_2d.c:530
 msgid "Preview Options"
 msgstr "Preview Options"
 
-#: modules/process/correct_affine.c:356 modules/process/fft_filter_2d.c:535
-#: modules/process/measure_lattice.c:321
+#: modules/process/correct_affine.c:404 modules/process/fft_filter_2d.c:535
+#: modules/process/measure_lattice.c:311
 msgid "Display:"
 msgstr "Display:"
 
-#: modules/process/correct_affine.c:364 modules/process/measure_lattice.c:329
+#: modules/process/correct_affine.c:412 modules/process/measure_lattice.c:319
 #: modules/tools/grainremover.c:109
 msgid "_Data"
 msgstr "_Data"
 
-#: modules/process/correct_affine.c:365
+#: modules/process/correct_affine.c:413
 msgid "2D _ACF"
 msgstr "2D _ACF"
 
-#: modules/process/correct_affine.c:366 modules/process/drift.c:365
+#: modules/process/correct_affine.c:414 modules/process/drift.c:364
 msgid "Correc_ted data"
 msgstr "Correc_ted data"
 
-#: modules/process/correct_affine.c:377
+#: modules/process/correct_affine.c:425
 msgid "ACF zoom:"
 msgstr "ACF zoom:"
 
-#: modules/process/correct_affine.c:394 modules/process/measure_lattice.c:372
+#: modules/process/correct_affine.c:442 modules/process/measure_lattice.c:346
+msgid "Interpolate _horizontal ACF"
+msgstr "Interpolate _horizontal ACF"
+
+#: modules/process/correct_affine.c:452 modules/process/measure_lattice.c:372
 msgid "Lattice Vectors"
 msgstr "Lattice Vectors"
 
 #. TRANSLATORS: Correct is an adjective here.
-#: modules/process/correct_affine.c:419
+#: modules/process/correct_affine.c:469
 msgid "Correct Lattice"
 msgstr "Correct Lattice"
 
-#: modules/process/correct_affine.c:423
+#: modules/process/correct_affine.c:473
 msgid "_Lattice type:"
 msgstr "_Lattice type:"
 
-#: modules/process/correct_affine.c:430
+#: modules/process/correct_affine.c:480
 msgid "User defined"
 msgstr "User-defined"
 
-#: modules/process/correct_affine.c:445
+#: modules/process/correct_affine.c:495
 msgid "_Different lengths"
 msgstr "_Different lengths"
 
-#: modules/process/correct_affine.c:474
+#: modules/process/correct_affine.c:524
 msgid "Image for _ACF:"
 msgstr "Image for _ACF:"
 
-#: modules/process/correct_affine.c:501
+#: modules/process/correct_affine.c:551
 msgid "_Scaling:"
 msgstr "_Scaling:"
 
-#: modules/process/correct_affine.c:508
+#: modules/process/correct_affine.c:558
 msgid "Exactly as specified"
 msgstr "Exactly as specified"
 
-#: modules/process/correct_affine.c:509
+#: modules/process/correct_affine.c:560
 msgid "Preserve area"
 msgstr "Preserve area"
 
-#: modules/process/correct_affine.c:510
+#: modules/process/correct_affine.c:562
 msgid "Preserve X scale"
 msgstr "Preserve X-scale"
 
-#: modules/process/correct_affine.c:561
-msgid "Corrected"
-msgstr "Corrected"
+#: modules/process/correct_affine.c:571 modules/process/drift.c:379
+msgid "_Apply to all compatible images"
+msgstr "_Apply to all compatible images"
 
-#: modules/process/correct_affine.c:617 modules/process/measure_lattice.c:489
+#: modules/process/correct_affine.c:693 modules/process/measure_lattice.c:482
 msgid "length"
 msgstr "length"
 
-#: modules/process/correct_affine.c:624 modules/process/measure_lattice.c:496
+#: modules/process/correct_affine.c:700 modules/process/measure_lattice.c:489
 msgid "angle"
 msgstr "angle"
 
-#: modules/process/correct_affine.c:717
-msgid "Re_fine"
-msgstr "Re_fine"
-
 #: modules/process/crosscor.c:157
 msgid "Calculates cross-correlation of two data fields."
 msgstr "Calculates cross-correlation of two data fields."
@@ -8381,196 +8675,198 @@ msgstr "Co_rrelate with:"
 msgid "Search size"
 msgstr "Search size"
 
-#: modules/process/crosscor.c:272
-msgid "Global offset of 2nd channel"
-msgstr "Global offset of 2nd channel"
-
-#: modules/process/crosscor.c:277
+#: modules/process/crosscor.c:267
 msgid "_Guess"
 msgstr "_Guess"
 
-#: modules/process/crosscor.c:311
+#: modules/process/crosscor.c:268
+msgid "Global offset of 2nd channel"
+msgstr "Global offset of 2nd channel"
+
+#: modules/process/crosscor.c:292
 msgid "Window size"
 msgstr "Window size"
 
-#: modules/process/crosscor.c:319
+#: modules/process/crosscor.c:300
 msgid "W_idth:"
 msgstr "W_idth:"
 
-#: modules/process/crosscor.c:329
+#: modules/process/crosscor.c:308
 msgid "Hei_ght:"
 msgstr "Hei_ght:"
 
-#: modules/process/crosscor.c:342 modules/process/fft.c:405
+#: modules/process/crosscor.c:319 modules/process/fft.c:403
 #: modules/process/psdf_logphi.c:268
 msgid "_Windowing type:"
 msgstr "_Windowing type:"
 
-#: modules/process/crosscor.c:350
+#: modules/process/crosscor.c:327
 msgid "All"
 msgstr "All"
 
-#: modules/process/crosscor.c:351
+#: modules/process/crosscor.c:328
 msgid "Absolute"
 msgstr "Absolute"
 
-#: modules/process/crosscor.c:352
+#: modules/process/crosscor.c:329
 msgid "X Distance"
 msgstr "X Distance"
 
-#: modules/process/crosscor.c:353
+#: modules/process/crosscor.c:330
 msgid "Y Distance"
 msgstr "Y Distance"
 
-#: modules/process/crosscor.c:355 modules/process/crosscor.c:1077
+#: modules/process/crosscor.c:332 modules/process/crosscor.c:1050
 msgid "Score"
 msgstr "Score"
 
-#: modules/process/crosscor.c:357 modules/process/fft.c:395
-#: modules/process/fit-shape.c:688 modules/process/maskcor.c:176
+#: modules/process/crosscor.c:334 modules/process/fft.c:393
+#: modules/process/fit-shape.c:699 modules/process/maskcor.c:177
+#: modules/process/mfm_current.c:455 modules/process/mfm_field.c:373
+#: modules/process/mfm_parallel.c:466
 msgid "Output _type:"
 msgstr "Output _type:"
 
-#: modules/process/crosscor.c:363
+#: modules/process/crosscor.c:340
 msgid "Add _low score results mask"
 msgstr "Add _low-score results mask"
 
-#: modules/process/crosscor.c:374 modules/process/grain_wshed.c:223
-#: modules/process/maskcor.c:188
+#: modules/process/crosscor.c:351 modules/process/grain_wshed.c:225
+#: modules/process/maskcor.c:191
 msgid "T_hreshold:"
 msgstr "T_hreshold:"
 
-#: modules/process/crosscor.c:381
+#: modules/process/crosscor.c:359
 msgid "Multichannel cross-corelation"
 msgstr "Multi-channel cross-corelation"
 
-#: modules/process/crosscor.c:400
+#: modules/process/crosscor.c:378
 msgid "Second _source data:"
 msgstr "Second _source data:"
 
-#: modules/process/crosscor.c:417
+#: modules/process/crosscor.c:394
 msgid "Correlate with:"
 msgstr "Correlate with:"
 
-#: modules/process/crosscor.c:424
+#: modules/process/crosscor.c:402
 msgid "Postprocess:"
 msgstr "Post-process:"
 
-#: modules/process/crosscor.c:431
-msgid "Apply Ga_ussian filter of width: "
-msgstr "Apply Ga_ussian filter of width: "
+#: modules/process/crosscor.c:411
+msgid "Apply Ga_ussian filter of width:"
+msgstr "Apply Ga_ussian filter of width:"
 
-#: modules/process/crosscor.c:451
+#: modules/process/crosscor.c:424
 msgid "Extend results to borders"
 msgstr "Extend results to borders"
 
-#: modules/process/crosscor.c:461
+#: modules/process/crosscor.c:433
 msgid "Create corrected data from 2nd channel"
 msgstr "Create corrected data from 2nd channel"
 
-#: modules/process/crosscor.c:860
+#: modules/process/crosscor.c:833
 msgid "Correlating first set..."
 msgstr "Correlating the first set..."
 
-#: modules/process/crosscor.c:892
+#: modules/process/crosscor.c:865
 msgid "Correlating second set..."
 msgstr "Correlating the second set..."
 
-#: modules/process/crosscor.c:999
+#: modules/process/crosscor.c:972
 msgid "Corrected 2nd channel"
 msgstr "Corrected 2nd channel"
 
-#: modules/process/crosscor.c:1023
+#: modules/process/crosscor.c:996
 msgid "X difference"
 msgstr "X difference"
 
-#: modules/process/crosscor.c:1037
+#: modules/process/crosscor.c:1010
 msgid "Y difference"
 msgstr "Y difference"
 
-#: modules/process/crosscor.c:1050
+#: modules/process/crosscor.c:1023
 msgid "Absolute difference"
 msgstr "Absolute difference"
 
-#: modules/process/curvature.c:131
+#: modules/process/curvature.c:130
 msgid "Center value"
 msgstr "Centre value"
 
-#: modules/process/curvature.c:132
+#: modules/process/curvature.c:131
 msgid "Curvature radius 1"
 msgstr "Curvature radius 1"
 
-#: modules/process/curvature.c:133
+#: modules/process/curvature.c:132
 msgid "Curvature radius 2"
 msgstr "Curvature radius 2"
 
-#: modules/process/curvature.c:134
+#: modules/process/curvature.c:133
 msgid "Direction 1"
 msgstr "Direction 1"
 
-#: modules/process/curvature.c:135
+#: modules/process/curvature.c:134
 msgid "Direction 2"
 msgstr "Direction 2"
 
-#: modules/process/curvature.c:163
+#: modules/process/curvature.c:162
 msgid "Calculates overall curvature."
 msgstr "Calculates overall curvature."
 
-#: modules/process/curvature.c:177
+#: modules/process/curvature.c:176
 msgid "/_Level/_Curvature..."
 msgstr "/_Level/_Curvature..."
 
-#: modules/process/curvature.c:181
+#: modules/process/curvature.c:180
 msgid "Calculate overall curvature"
 msgstr "Calculate overall curvature"
 
-#: modules/process/curvature.c:211 modules/process/facet-level.c:118
+#: modules/process/curvature.c:210 modules/process/facet-level.c:118
 #: modules/process/semsim.c:165
 #, c-format
 msgid "%s: Lateral dimensions and value must be the same physical quantity."
 msgstr "%s: Lateral dimensions and value must be the same physical quantity."
 
-#: modules/process/curvature.c:445
+#: modules/process/curvature.c:447
 msgid "Curvature Sections"
 msgstr "Curvature Sections"
 
-#: modules/process/curvature.c:653
+#: modules/process/curvature.c:655
 msgid "Output Type"
 msgstr "Output Type"
 
-#: modules/process/curvature.c:660
+#: modules/process/curvature.c:662
 msgid "_Set selection"
 msgstr "_Set selection"
 
-#: modules/process/curvature.c:670
+#: modules/process/curvature.c:672
 msgid "_Plot graph"
 msgstr "_Plot graph"
 
-#: modules/process/curvature.c:685 modules/process/drift.c:337
-#: modules/process/fft_profile.c:310 modules/process/fractal.c:328
-#: modules/process/grain_cross.c:253 modules/process/linematch.c:885
-#: modules/process/slope_dist.c:349 modules/tools/linestats.c:418
-#: modules/tools/profile.c:573 modules/tools/roughness.c:872
-#: modules/tools/sfunctions.c:486 modules/tools/spectro.c:382
-#: modules/volume/volume_slice.c:398
-msgid "Target _graph:"
-msgstr "Target _graph:"
-
-#: modules/process/curvature.c:691 modules/process/drift.c:343
-#: modules/process/fft_profile.c:316 modules/process/fractal.c:334
-#: modules/process/grain_cross.c:259 modules/process/linematch.c:892
-#: modules/process/slope_dist.c:355 modules/tools/linestats.c:424
-#: modules/tools/profile.c:579 modules/tools/roughness.c:878
-#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:388
-#: modules/volume/volume_slice.c:406
+#: modules/process/curvature.c:684 modules/process/drift.c:340
+#: modules/process/fft_profile.c:300 modules/process/fractal.c:308
+#: modules/process/grain_cross.c:260 modules/process/linematch.c:855
+#: modules/process/slope_dist.c:347 modules/tools/linestats.c:424
+#: modules/tools/profile.c:559 modules/tools/roughness.c:886
+#: modules/tools/sfunctions.c:488 modules/tools/spectro.c:391
+#: modules/volume/volume_slice.c:408
 msgid "New graph"
 msgstr "New graph"
 
-#: modules/process/curvature.c:951
+#: modules/process/curvature.c:689 modules/process/drift.c:345
+#: modules/process/fft_profile.c:306 modules/process/fractal.c:313
+#: modules/process/grain_cross.c:254 modules/process/linematch.c:860
+#: modules/process/slope_dist.c:352 modules/tools/linestats.c:418
+#: modules/tools/profile.c:563 modules/tools/roughness.c:890
+#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:385
+#: modules/volume/volume_slice.c:400
+msgid "Target _graph:"
+msgstr "Target _graph:"
+
+#: modules/process/curvature.c:949
 msgid "Axes are outside the image."
 msgstr "Axes are outside the image."
 
-#: modules/process/curvature.c:1018
+#: modules/process/curvature.c:1016
 msgid "Save Curvature"
 msgstr "Save Curvature"
 
@@ -8594,8 +8890,8 @@ msgstr "CWT"
 msgid "2D CWT"
 msgstr "2D CWT"
 
-#: modules/process/cwt.c:158 modules/process/dwt.c:185
-#: modules/process/dwtanisotropy.c:209
+#: modules/process/cwt.c:159 modules/process/dwt.c:185
+#: modules/process/dwtanisotropy.c:212
 msgid "_Wavelet type:"
 msgstr "_Wavelet type:"
 
@@ -8604,14 +8900,14 @@ msgid "Generates particles using simple dynamical model"
 msgstr "Generates particles using a simple dynamical model"
 
 #: modules/process/deposit_synth.c:184
-msgid "/S_ynthetic/_Particles..."
-msgstr "/S_ynthetic/_Particles..."
+msgid "/S_ynthetic/_Deposition/_Particles..."
+msgstr "/S_ynthetic/_Deposition/_Particles..."
 
 #: modules/process/deposit_synth.c:188
 msgid "Generate particles using dynamical model"
 msgstr "Generate particles using dynamical model"
 
-#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:867
+#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:866
 #, c-format
 msgid ""
 "Not all the particles could be deposited (%u),\n"
@@ -8620,73 +8916,69 @@ msgstr ""
 "Not all the particles could be deposited (%u),\n"
 "try more revise steps."
 
-#: modules/process/deposit_synth.c:347
+#: modules/process/deposit_synth.c:348
 msgid "Particle Generation"
 msgstr "Particle Generation"
 
-#: modules/process/deposit_synth.c:427
+#: modules/process/deposit_synth.c:431
 msgid "Particle r_adius:"
 msgstr "Particle r_adius:"
 
-#: modules/process/deposit_synth.c:438
+#: modules/process/deposit_synth.c:443
 msgid "Distribution _width:"
 msgstr "Distribution _width:"
 
-#: modules/process/deposit_synth.c:449
-msgid "Surface _coverage:"
-msgstr "Surface _coverage:"
-
-#: modules/process/deposit_synth.c:458
+#: modules/process/deposit_synth.c:462
 msgid "_Relax steps:"
 msgstr "_Relaxation steps:"
 
-#: modules/process/deposit_synth.c:659 modules/process/synth.h:548
+#: modules/process/deposit_synth.c:660 modules/process/synth.h:577
 msgid "R_andom seed:"
 msgstr "R_andom seed:"
 
-#: modules/process/deposit_synth.c:665 modules/process/synth.h:554
+#: modules/process/deposit_synth.c:666 modules/process/synth.h:583
 msgid "seed|_New"
 msgstr "_New"
 
-#: modules/process/deposit_synth.c:676
+#: modules/process/deposit_synth.c:677
 msgid "Randomize"
 msgstr "Randomise"
 
-#: modules/process/deposit_synth.c:860 modules/process/domain_synth.c:919
+#: modules/process/deposit_synth.c:859 modules/process/domain_synth.c:919
 msgid "Running computation..."
 msgstr "Running computation..."
 
-#: modules/process/deposit_synth.c:865
+#: modules/process/deposit_synth.c:864
 #, c-format
 msgid "%d particles were deposited"
 msgstr "%d particles were deposited"
 
-#: modules/process/deposit_synth.c:1093
+#: modules/process/deposit_synth.c:1092
 msgid "Initial particle set..."
 msgstr "Initial particle set..."
 
-#: modules/process/deposit_synth.c:1252
+#: modules/process/deposit_synth.c:1251
 msgid "Running revise..."
 msgstr "Running revise..."
 
-#: modules/process/deposit_synth.c:1380
+#: modules/process/deposit_synth.c:1379
 msgid "Error: too many particles."
 msgstr "Error: too many particles."
 
-#: modules/process/deposit_synth.c:1382
+#: modules/process/deposit_synth.c:1381
 msgid "Error: no particles."
 msgstr "Error: no particles."
 
-#: modules/process/deposit_synth.c:1384
+#: modules/process/deposit_synth.c:1383
 msgid "Error: particles too large."
 msgstr "Error: particles are too large."
 
-#: modules/process/deposit_synth.c:1386
+#: modules/process/deposit_synth.c:1385
 msgid "Error: particles too small."
 msgstr "Error: particles are too small."
 
 #: modules/process/diff_synth.c:197 modules/tools/linestats.c:173
-#: modules/volume/volume_linestat.c:149
+#: modules/volume/volume_linestat.c:151
 msgid "Variation"
 msgstr "Variation"
 
@@ -8699,8 +8991,8 @@ msgid "Generates surfaces by diffusion limited aggregation."
 msgstr "Generates surfaces by diffusion-limited aggregation."
 
 #: modules/process/diff_synth.c:228
-msgid "/S_ynthetic/_Diffusion..."
-msgstr "/S_ynthetic/_Diffusion..."
+msgid "/S_ynthetic/_Deposition/_Diffusion..."
+msgstr "/S_ynthetic/_Deposition/_Diffusion..."
 
 #: modules/process/diff_synth.c:232
 msgid "Generate surface by diffusion limited aggregation"
@@ -8714,45 +9006,45 @@ msgstr "Diffusion-Limited Aggregation"
 msgid "_Flux:"
 msgstr "_Flux:"
 
-#: modules/process/diff_synth.c:522
+#: modules/process/diff_synth.c:521
 msgid "Probabilities"
 msgstr "Probabilities"
 
-#: modules/process/diff_synth.c:530
+#: modules/process/diff_synth.c:529
 msgid "_Sticking:"
 msgstr "_Sticking:"
 
-#: modules/process/diff_synth.c:539
+#: modules/process/diff_synth.c:538
 msgid "_Activation:"
 msgstr "_Activation:"
 
-#: modules/process/diff_synth.c:548
+#: modules/process/diff_synth.c:547
 msgid "Passing Sch_woebel:"
 msgstr "Passing Sch_woebel:"
 
-#: modules/process/dimensions.h:457
+#: modules/process/dimensions.h:439
 msgid "S_quare image"
 msgstr "S_quare image"
 
-#: modules/process/dimensions.h:489
+#: modules/process/dimensions.h:473
 msgid "_Dimension units:"
 msgstr "_Dimension units:"
 
-#: modules/process/dimensions.h:502
-msgid "Current Channel"
-msgstr "Current Channel"
+#: modules/process/dimensions.h:488
+msgid "Current Image"
+msgstr "Current Image"
 
-#: modules/process/dimensions.h:506
-msgid "_Take Dimensions from Current Channel"
-msgstr "_Take Dimensions from Current Channel"
+#: modules/process/dimensions.h:492
+msgid "_Take Dimensions from Current Image"
+msgstr "_Take Dimensions from Current Image"
 
-#: modules/process/dimensions.h:514
-msgid "_Replace the current channel"
-msgstr "_Replace the current channel"
+#: modules/process/dimensions.h:501
+msgid "_Replace the current image"
+msgstr "_Replace the current image"
 
-#: modules/process/dimensions.h:523
-msgid "_Start from the current channel"
-msgstr "_Start from the current channel"
+#: modules/process/dimensions.h:510
+msgid "_Start from the current image"
+msgstr "_Start from the current image"
 
 #: modules/process/domain_synth.c:158
 msgid "Discrete state"
@@ -8811,13 +9103,13 @@ msgid "_Monte Carlo time step:"
 msgstr "_Monte Carlo time step:"
 
 #: modules/process/domain_synth.c:504 modules/process/fft_filter_2d.c:586
-#: modules/volume/volume_slice.c:364
+#: modules/volume/volume_slice.c:366
 msgid "Output Options"
 msgstr "Output Options"
 
 #: modules/process/domain_synth.c:523 modules/process/fft_filter_2d.c:591
-#: modules/process/mask_edt.c:377 modules/process/slope_dist.c:323
-#: modules/volume/volume_linestat.c:432 modules/volume/volume_slice.c:384
+#: modules/process/mask_edt.c:211 modules/process/slope_dist.c:323
+#: modules/volume/volume_linestat.c:437 modules/volume/volume_slice.c:386
 msgid "Output type:"
 msgstr "Output type:"
 
@@ -8845,57 +9137,49 @@ msgstr "_Search range:"
 msgid "rows"
 msgstr "rows"
 
-#: modules/process/drift.c:304
+#: modules/process/drift.c:305
 msgid "Correct _data"
 msgstr "Correct _data"
 
-#: modules/process/drift.c:314
+#: modules/process/drift.c:315
 msgid "_Exclude linear skew"
 msgstr "_Exclude linear skew"
 
-#: modules/process/drift.c:324
+#: modules/process/drift.c:325
 msgid "Plot drift _graph"
 msgstr "Plot drift _graph"
 
-#: modules/process/drift.c:356 modules/process/fit-shape.c:693
-#: modules/process/neural.c:548 modules/process/polydistort.c:275
+#: modules/process/drift.c:355 modules/process/fit-shape.c:705
+#: modules/process/neural.c:552 modules/process/polydistort.c:278
 msgid "Preview:"
 msgstr "Preview:"
 
-#: modules/process/drift.c:366
+#: modules/process/drift.c:365
 msgid "Drift _lines"
 msgstr "Drift _lines"
 
-#: modules/process/drift.c:374 modules/process/facet_analysis.c:407
-#: modules/process/grain_edge.c:285 modules/process/grain_filter.c:357
-#: modules/process/grain_mark.c:367 modules/process/grain_wshed.c:267
-#: modules/process/mark_disconn.c:310 modules/process/scars.c:381
+#: modules/process/drift.c:373 modules/process/facet_analysis.c:390
+#: modules/process/grain_edge.c:272 modules/process/grain_filter.c:356
+#: modules/process/grain_mark.c:341 modules/process/grain_wshed.c:271
+#: modules/process/mark_disconn.c:298 modules/process/scars.c:405
 #: modules/process/wpour_mark.c:369
 msgid "_Mask color:"
 msgstr "_Mask colour:"
 
-#: modules/process/drift.c:379
-msgid "Distribute"
-msgstr "Distribute"
-
-#: modules/process/drift.c:388
-msgid "Replace"
-msgstr "Replace"
-
-#: modules/process/drift.c:569
+#: modules/process/drift.c:570
 msgid "Drift-corrected"
 msgstr "Drift-corrected"
 
-#: modules/process/drift.c:613
+#: modules/process/drift.c:614
 msgid "Drift"
 msgstr "Drift"
 
-#: modules/process/drift.c:614 modules/xyz/xyz_drift.c:392
+#: modules/process/drift.c:615 modules/xyz/xyz_drift.c:392
 #: modules/xyz/xyz_drift.c:411 modules/xyz/xyz_drift.c:430
 msgid "drift"
 msgstr "drift"
 
-#: modules/process/drift.c:620 modules/xyz/xyz_drift.c:402
+#: modules/process/drift.c:621 modules/xyz/xyz_drift.c:402
 msgid "x-axis drift"
 msgstr "x-axis drift"
 
@@ -8953,11 +9237,11 @@ msgstr "DWT Anisotropy"
 msgid "2D DWT Anisotropy"
 msgstr "2D DWT Anisotropy"
 
-#: modules/process/dwtanisotropy.c:214
+#: modules/process/dwtanisotropy.c:218
 msgid "X/Y ratio threshold:"
 msgstr "X/Y ratio threshold:"
 
-#: modules/process/dwtanisotropy.c:222
+#: modules/process/dwtanisotropy.c:226
 msgid "Low level exclude limit:"
 msgstr "Low-level exclude limit:"
 
@@ -9085,7 +9369,7 @@ msgstr "Zero Crossing Step Detection"
 msgid "_Gaussian FWHM:"
 msgstr "_Gaussian FWHM:"
 
-#: modules/process/edge.c:681 modules/process/mark_disconn.c:271
+#: modules/process/edge.c:681 modules/process/mark_disconn.c:272
 msgid "_Threshold:"
 msgstr "_Threshold:"
 
@@ -9149,11 +9433,11 @@ msgstr "Entropy:"
 msgid "Entropy deficit:"
 msgstr "Entropy deficit:"
 
-#: modules/process/entropy.c:567
+#: modules/process/entropy.c:568
 msgid "Entropy at scales"
 msgstr "Entropy at scales"
 
-#: modules/process/entropy.c:586
+#: modules/process/entropy.c:587
 msgid "Best estimate"
 msgstr "Best estimate"
 
@@ -9201,23 +9485,23 @@ msgstr "_Right:"
 msgid "Extend _symetrically"
 msgstr "Extend _symetrically"
 
-#: modules/process/extend.c:268 modules/process/polydistort.c:256
-#: modules/xyz/xyz_raster.c:658
+#: modules/process/extend.c:268 modules/process/polydistort.c:259
+#: modules/xyz/xyz_raster.c:627
 msgid "exterior|Border"
 msgstr "Border"
 
-#: modules/process/extend.c:270 modules/process/polydistort.c:258
-#: modules/xyz/xyz_raster.c:660
+#: modules/process/extend.c:270 modules/process/polydistort.c:261
+#: modules/xyz/xyz_raster.c:629
 msgid "exterior|Mirror"
 msgstr "Mirror"
 
-#: modules/process/extend.c:272 modules/process/polydistort.c:260
-#: modules/xyz/xyz_raster.c:662
+#: modules/process/extend.c:272 modules/process/polydistort.c:263
+#: modules/xyz/xyz_raster.c:631
 msgid "exterior|Periodic"
 msgstr "Periodic"
 
-#: modules/process/extend.c:275 modules/process/polydistort.c:263
-#: modules/xyz/xyz_raster.c:650
+#: modules/process/extend.c:275 modules/process/polydistort.c:266
+#: modules/xyz/xyz_raster.c:619
 msgid "_Exterior type:"
 msgstr "_Exterior type:"
 
@@ -9249,11 +9533,11 @@ msgstr "Number of path points:"
 msgid "There is no path selection."
 msgstr "There is no path selection."
 
-#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:390
+#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:383
 msgid "X position"
 msgstr "X position"
 
-#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:397
+#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:389
 msgid "Y position"
 msgstr "Y position"
 
@@ -9266,7 +9550,7 @@ msgid "Y tangent"
 msgstr "Y tangent"
 
 #: modules/process/extract_path.c:392 modules/process/extract_path.c:404
-#: modules/process/pat_synth.c:1432 modules/tools/distance.c:146
+#: modules/process/pat_synth.c:1433 modules/tools/distance.c:146
 msgid "Distance"
 msgstr "Distance"
 
@@ -9310,47 +9594,36 @@ msgstr "/_Statistics/Facet _Analysis..."
 msgid "Mark areas by 2D slope"
 msgstr "Mark areas by 2D slope"
 
-#: modules/process/facet_analysis.c:266
+#: modules/process/facet_analysis.c:270
 msgid "Mark Facets"
 msgstr "Mark Facets"
 
-#: modules/process/facet_analysis.c:269
+#: modules/process/facet_analysis.c:273
 msgid "verb|_Mark"
 msgstr "_Mark"
 
 #. TRANSLATORS: The direction or line orthogonal to something.
-#: modules/process/facet_analysis.c:325
+#: modules/process/facet_analysis.c:329
 msgid "Normal"
 msgstr "Normal"
 
-#: modules/process/facet_analysis.c:333
+#: modules/process/facet_analysis.c:337
 msgid "_Find Maximum"
 msgstr "_Find Maximum"
 
-#: modules/process/facet_analysis.c:341
+#: modules/process/facet_analysis.c:345
 msgid "Mean Normal"
 msgstr "Mean Normal"
 
-#: modules/process/facet_analysis.c:350
+#: modules/process/facet_analysis.c:362
 msgid "Facet plane size:"
 msgstr "Facet plane size:"
 
-#: modules/process/facet_analysis.c:375
+#: modules/process/facet_analysis.c:370
 msgid "_Tolerance:"
 msgstr "_Tolerance:"
 
-#: modules/process/facet_analysis.c:384 modules/process/grain_edge.c:262
-#: modules/process/grain_mark.c:344 modules/process/mark_disconn.c:286
-msgid "Com_bine with existing mask"
-msgstr "Com_bine with existing mask"
-
-#: modules/process/facet_analysis.c:398 modules/process/grain_edge.c:276
-#: modules/process/grain_mark.c:358 modules/process/mark_disconn.c:301
-#: modules/process/mark_with.c:230 modules/process/mask_morph.c:210
-msgid "Operation:"
-msgstr "Operation:"
-
-#: modules/process/facet_analysis.c:415
+#: modules/process/facet_analysis.c:398
 msgid ""
 "Warning: Lateral and value units differ. Angles are not physically "
 "meaningful."
@@ -9382,8 +9655,8 @@ msgstr "_Hurst exponent:"
 msgid "_Stationarity scale:"
 msgstr "_Stationarity scale:"
 
-#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:509
-#: modules/process/noise_synth.c:409
+#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:507
+#: modules/process/noise_synth.c:407
 msgid "_Distribution:"
 msgstr "_Distribution:"
 
@@ -9391,17 +9664,17 @@ msgstr "_Distribution:"
 msgid "Po_wer:"
 msgstr "Po_wer:"
 
-#: modules/process/fbm_synth.c:408 modules/process/fft_synth.c:414
-#: modules/process/lno_synth.c:533 modules/process/noise_synth.c:433
+#: modules/process/fbm_synth.c:407 modules/process/fft_synth.c:414
+#: modules/process/lno_synth.c:531 modules/process/noise_synth.c:431
 msgid "_RMS:"
 msgstr "_RMS:"
 
-#: modules/process/fbm_synth.c:477 modules/process/lno_synth.c:251
-#: modules/process/noise_synth.c:178
+#: modules/process/fbm_synth.c:476 modules/process/lno_synth.c:249
+#: modules/process/noise_synth.c:176
 msgid "distribution|Exponential"
 msgstr "Exponential"
 
-#: modules/process/fbm_synth.c:478
+#: modules/process/fbm_synth.c:477
 msgid "distribution|Power"
 msgstr "Power"
 
@@ -9453,7 +9726,7 @@ msgstr "Imaginary"
 msgid "Modulus"
 msgstr "Modulus"
 
-#: modules/process/fft.c:327 modules/process/wave_synth.c:583
+#: modules/process/fft.c:327 modules/process/wave_synth.c:618
 msgid "Phase"
 msgstr "Phase"
 
@@ -9469,63 +9742,63 @@ msgstr "Ra_w transform"
 msgid "I_maginary part:"
 msgstr "I_maginary part:"
 
-#: modules/process/fft.c:382
+#: modules/process/fft.c:380
 msgid "_Inverse transform"
 msgstr "_Inverse transform"
 
-#: modules/process/fft.c:411
+#: modules/process/fft.c:409
 msgid "Subtract mean _value beforehand"
 msgstr "Subtract mean _value beforehand"
 
-#: modules/process/fft.c:422
+#: modules/process/fft.c:420
 msgid "_Preserve RMS"
 msgstr "_Preserve RMS"
 
-#: modules/process/fft_filter_1d.c:117
+#: modules/process/fft_filter_1d.c:118
 msgid "FFT filtering"
 msgstr "FFT filtering"
 
-#: modules/process/fft_filter_1d.c:131
+#: modules/process/fft_filter_1d.c:132
 msgid "/_Correct Data/1D _FFT Filtering..."
 msgstr "/_Correct Data/1D _FFT Filtering..."
 
-#: modules/process/fft_filter_1d.c:135
+#: modules/process/fft_filter_1d.c:136
 msgid "1D FFT Filtering"
 msgstr "1D FFT Filtering"
 
-#: modules/process/fft_filter_1d.c:165 modules/process/wpour_mark.c:391
+#: modules/process/fft_filter_1d.c:166 modules/process/wpour_mark.c:391
 msgid "Marked"
 msgstr "Marked"
 
-#: modules/process/fft_filter_1d.c:166
+#: modules/process/fft_filter_1d.c:167
 msgid "Unmarked"
 msgstr "Unmarked"
 
-#: modules/process/fft_filter_1d.c:169
+#: modules/process/fft_filter_1d.c:170
 msgid "Null"
 msgstr "Null"
 
-#: modules/process/fft_filter_1d.c:170
+#: modules/process/fft_filter_1d.c:171
 msgid "Suppress"
 msgstr "Suppress"
 
-#: modules/process/fft_filter_1d.c:180
+#: modules/process/fft_filter_1d.c:181
 msgid "1D FFT filter"
 msgstr "1D FFT filter"
 
-#: modules/process/fft_filter_1d.c:269 modules/process/linematch.c:861
+#: modules/process/fft_filter_1d.c:271 modules/process/linematch.c:828
 msgid "_Direction:"
 msgstr "_Direction:"
 
-#: modules/process/fft_filter_1d.c:277
+#: modules/process/fft_filter_1d.c:279
 msgid "_Suppress type:"
 msgstr "_Suppress type:"
 
-#: modules/process/fft_filter_1d.c:285
+#: modules/process/fft_filter_1d.c:287
 msgid "_Filter type:"
 msgstr "_Filter type:"
 
-#: modules/process/fft_filter_1d.c:513
+#: modules/process/fft_filter_1d.c:515
 msgid "1D FFT Filtered Data"
 msgstr "1D FFT Filtered Data"
 
@@ -9545,9 +9818,10 @@ msgstr "Two-dimensional FFT filtering"
 msgid "Filtered Data"
 msgstr "Filtered Data"
 
-#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:594
-#: modules/process/fit-shape.c:643 modules/process/fit-shape.c:658
-#: modules/process/fit-shape.c:662 modules/process/neural.c:560
+#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:604
+#: modules/process/fit-shape.c:653 modules/process/fit-shape.c:668
+#: modules/process/fit-shape.c:672 modules/process/neural.c:564
+#: modules/process/psf.c:232
 msgid "Difference"
 msgstr "Difference"
 
@@ -9603,7 +9877,7 @@ msgstr "Filter Mask"
 msgid "_Undo"
 msgstr "_Undo"
 
-#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:556
+#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:562
 msgid "_Fill"
 msgstr "_Fill"
 
@@ -9611,7 +9885,7 @@ msgstr "_Fill"
 msgid "_Snap to origin"
 msgstr "_Snap to origin"
 
-#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:339
+#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:329
 msgid "Zoom:"
 msgstr "Zoom:"
 
@@ -9647,38 +9921,38 @@ msgstr "Fill the entire filter mask"
 msgid "Force shapes to center around the origin"
 msgstr "Force shapes to centre around the origin"
 
-#: modules/process/fft_profile.c:125
+#: modules/process/fft_profile.c:124
 msgid ""
 "Reads radial sections of two-dimensional power spectrum density function."
 msgstr ""
 "Reads radial sections of two-dimensional power spectrum density function."
 
-#: modules/process/fft_profile.c:140
+#: modules/process/fft_profile.c:139
 msgid "/_Statistics/_PSDF Section..."
 msgstr "/_Statistics/_PSDF Section..."
 
-#: modules/process/fft_profile.c:144
+#: modules/process/fft_profile.c:143
 msgid "Read radial PSDF sections"
 msgstr "Read radial PSDF sections"
 
-#: modules/process/fft_profile.c:190
+#: modules/process/fft_profile.c:189
 msgid "Radial PSDF Section"
 msgstr "Radial PSDF Section"
 
-#: modules/process/fft_profile.c:237
+#: modules/process/fft_profile.c:236
 msgid "PSDF Section"
 msgstr "PSDF Section"
 
-#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:336
-#: modules/tools/profile.c:517 modules/tools/sfunctions.c:443
-msgid "_Fix res.:"
-msgstr "_Fix res.:"
+#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:338
+#: modules/tools/profile.c:514 modules/tools/sfunctions.c:454
+msgid "_Fixed resolution:"
+msgstr "_Fixed resolution:"
 
-#: modules/process/fft_profile.c:279
+#: modules/process/fft_profile.c:278
 msgid "_Separate curves"
 msgstr "_Separate curves"
 
-#: modules/process/fft_profile.c:496
+#: modules/process/fft_profile.c:483
 #, c-format
 msgid "PSDF %.0f°"
 msgstr "PSDF %.0f°"
@@ -9699,11 +9973,15 @@ msgstr "Generate surface using spectral synthesis"
 msgid "Spectral Synthesis"
 msgstr "Spectral Synthesis"
 
-#: modules/process/fft_synth.c:429
+#: modules/process/fft_synth.c:430
 msgid "M_inimum frequency:"
 msgstr "M_inimum frequency:"
 
-#: modules/process/fft_synth.c:449
+#: modules/process/fft_synth.c:430 modules/process/fft_synth.c:450
+msgid "px<sup>-1</sup>"
+msgstr "px<sup>-1</sup>"
+
+#: modules/process/fft_synth.c:450
 msgid "Ma_ximum frequency:"
 msgstr "Ma_ximum frequency:"
 
@@ -9723,85 +10001,154 @@ msgstr "Enable _Lorentz multiplier"
 msgid "Enable _power multiplier"
 msgstr "Enable _power multiplier"
 
-#: modules/process/fit-shape.c:270
+#: modules/process/fibre_synth.c:256
+msgid "Semi-circle"
+msgstr "Semi-circle"
+
+#: modules/process/fibre_synth.c:257
+msgid "Triangle"
+msgstr "Triangle"
+
+#: modules/process/fibre_synth.c:258
+msgid "Rectangle"
+msgstr "Rectangle"
+
+#: modules/process/fibre_synth.c:260
+msgid "Quadratic spline"
+msgstr "Quadratic spline"
+
+#: modules/process/fibre_synth.c:266
+msgid "Generates surfaces composed from randomly placed fibers."
+msgstr "Generates surfaces composed from randomly placed fibres."
+
+#: modules/process/fibre_synth.c:280
+msgid "/S_ynthetic/_Deposition/_Fibers..."
+msgstr "/S_ynthetic/_Deposition/_Fibres..."
+
+#: modules/process/fibre_synth.c:284
+msgid "Generate surface of randomly placed fibers"
+msgstr "Generate surface of randomly placed fibres"
+
+#: modules/process/fibre_synth.c:420
+msgid "Random Fibers"
+msgstr "Random Fibres"
+
+#: modules/process/fibre_synth.c:494 modules/process/obj_synth.c:510
+msgid "_Shape:"
+msgstr "_Shape:"
+
+#: modules/process/fibre_synth.c:513 modules/process/obj_synth.c:529
+msgid "obj."
+msgstr "obj."
+
+#: modules/process/fibre_synth.c:553
+msgid "Scales _with width"
+msgstr "Scales _with width"
+
+#: modules/process/fibre_synth.c:591 modules/process/synth.h:485
+msgid "Deformation"
+msgstr "Deformation"
+
+#: modules/process/fibre_synth.c:600 modules/process/lno_synth.c:852
+#: modules/process/lno_synth.c:1222 modules/process/mask_noisify.c:177
+msgid "Densi_ty:"
+msgstr "Densi_ty:"
+
+#: modules/process/fibre_synth.c:607
+msgid "_Lateral:"
+msgstr "_Lateral:"
+
+#: modules/process/fibre_synth.c:614
+msgid "Le_ngthwise:"
+msgstr "Le_ngthwise:"
+
+#: modules/process/fibre_synth.c:819
+msgid "Along fiber:"
+msgstr "Along fibre:"
+
+#: modules/process/fibre_synth.c:1180
+msgid "Generating fibers..."
+msgstr "Generating fibres..."
+
+#: modules/process/fit-shape.c:264
 msgid "Fits predefined geometrical shapes to data."
 msgstr "Fits predefined geometrical shapes to data."
 
-#: modules/process/fit-shape.c:284
+#: modules/process/fit-shape.c:278
 msgid "/_Level/_Fit Shape..."
 msgstr "/_Level/_Fit Shape..."
 
-#: modules/process/fit-shape.c:288 modules/process/fit-shape.c:295
+#: modules/process/fit-shape.c:282 modules/process/fit-shape.c:289
 msgid "Fit geometrical shapes"
 msgstr "Fit geometrical shapes"
 
-#: modules/process/fit-shape.c:291
+#: modules/process/fit-shape.c:285
 msgid "/_Fit Shape..."
 msgstr "/_Fit Shape..."
 
-#: modules/process/fit-shape.c:390
+#: modules/process/fit-shape.c:389
 msgid "Fit Shape"
 msgstr "Fit Shape"
 
-#: modules/process/fit-shape.c:395
+#: modules/process/fit-shape.c:396
 msgid "verb|_Quick Fit"
 msgstr "_Quick Fit"
 
-#: modules/process/fit-shape.c:473 modules/process/fit-shape.c:2159
+#: modules/process/fit-shape.c:474 modules/process/fit-shape.c:2141
 msgid "Derived Quantities"
 msgstr "Derived Quantities"
 
-#: modules/process/fit-shape.c:478 modules/process/fit-shape.c:2129
+#: modules/process/fit-shape.c:479 modules/process/fit-shape.c:2111
 msgid "Mean square difference:"
 msgstr "Mean square difference:"
 
-#: modules/process/fit-shape.c:580 modules/process/fit-shape.c:626
-#: modules/process/fit-shape.c:657 modules/process/fit-shape.c:661
+#: modules/process/fit-shape.c:590 modules/process/fit-shape.c:636
+#: modules/process/fit-shape.c:667 modules/process/fit-shape.c:671
 msgid "Fitted shape"
 msgstr "Fitted shape"
 
-#: modules/process/fit-shape.c:663 modules/process/mark_disconn.c:189
-#: modules/process/scars.c:281
+#: modules/process/fit-shape.c:673 modules/process/mark_disconn.c:189
+#: modules/process/scars.c:299
 msgid "Both"
 msgstr "Both"
 
-#: modules/process/fit-shape.c:680
+#: modules/process/fit-shape.c:690 modules/process/psf-fit.c:308
 msgid "_Function type:"
 msgstr "_Function type:"
 
-#: modules/process/fit-shape.c:708
+#: modules/process/fit-shape.c:720
 msgid "Show differences with _adapted color map"
 msgstr "Show differences with _adapted colour map"
 
-#: modules/process/fit-shape.c:720
+#: modules/process/fit-shape.c:732
 msgid "Full fit is _geometric"
 msgstr "Full fit is _geometric"
 
-#: modules/process/fit-shape.c:757
+#: modules/process/fit-shape.c:769
 msgid "Calculate differences for e_xcluded pixels"
 msgstr "Calculate differences for e_xcluded pixels"
 
-#: modules/process/fit-shape.c:804
+#: modules/process/fit-shape.c:816
 msgid "_Recalculate Image"
 msgstr "_Recalculate Image"
 
-#: modules/process/fit-shape.c:811
+#: modules/process/fit-shape.c:823
 msgid "Revert to _Previous Values"
 msgstr "Revert to _Previous Values"
 
-#: modules/process/fit-shape.c:1850
+#: modules/process/fit-shape.c:1864
 msgid "Parameter estimation failed"
 msgstr "Parameter estimation failed"
 
-#: modules/process/fit-shape.c:1853
+#: modules/process/fit-shape.c:1867
 msgid "Fit failed"
 msgstr "Fit failed"
 
-#: modules/process/fit-shape.c:1855
+#: modules/process/fit-shape.c:1869
 msgid "Fit was interruped"
 msgstr "Fit was interruped"
 
-#: modules/process/fit-shape.c:2115
+#: modules/process/fit-shape.c:2097
 msgid "(fixed)"
 msgstr "(fixed)"
 
@@ -9821,35 +10168,35 @@ msgstr "Flatten base of surface with positive features"
 msgid "Polynomial leveling..."
 msgstr "Polynomial levelling..."
 
-#: modules/process/fraccor.c:38
+#: modules/process/fraccor.c:39
 msgid "Removes data under mask using fractal interpolation."
 msgstr "Removes data under mask using fractal interpolation."
 
-#: modules/process/fraccor.c:52
+#: modules/process/fraccor.c:53
 msgid "/_Correct Data/_Fractal Correction"
 msgstr "/_Correct Data/_Fractal Correction"
 
-#: modules/process/fraccor.c:56
+#: modules/process/fraccor.c:57
 msgid "Interpolate data under mask with fractal interpolation"
 msgstr "Interpolate data under mask with fractal interpolation"
 
-#: modules/process/fractal.c:134
+#: modules/process/fractal.c:130
 msgid "Partitioning"
 msgstr "Partitioning"
 
-#: modules/process/fractal.c:135
+#: modules/process/fractal.c:131
 msgid "Cube counting"
 msgstr "Cube counting"
 
-#: modules/process/fractal.c:136
+#: modules/process/fractal.c:132
 msgid "Triangulation"
 msgstr "Triangulation"
 
-#: modules/process/fractal.c:137
+#: modules/process/fractal.c:133
 msgid "Power spectrum"
 msgstr "Power spectrum"
 
-#: modules/process/fractal.c:173
+#: modules/process/fractal.c:169
 msgid ""
 "Calculates fractal dimension using several methods (partitioning, box "
 "counting, triangulation, power spectrum)."
@@ -9857,54 +10204,50 @@ msgstr ""
 "Calculates fractal dimension using several methods (partitioning, box "
 "counting, triangulation, power spectrum)."
 
-#: modules/process/fractal.c:188
+#: modules/process/fractal.c:184
 msgid "/_Statistics/_Fractal Dimension..."
 msgstr "/_Statistics/_Fractal Dimension..."
 
-#: modules/process/fractal.c:192
+#: modules/process/fractal.c:188
 msgid "Calculate fractal dimension"
 msgstr "Calculate fractal dimension"
 
-#: modules/process/fractal.c:227
+#: modules/process/fractal.c:223
 msgid "Fractal Dimension"
 msgstr "Fractal Dimension"
 
-#: modules/process/fractal.c:228
-msgid "Reco_mpute"
-msgstr "Reco_mpute"
-
-#: modules/process/fractal.c:269
+#: modules/process/fractal.c:253
 msgid "_Method:"
 msgstr "_Method:"
 
-#: modules/process/fractal.c:290
+#: modules/process/fractal.c:269
 msgid "Fit Area"
 msgstr "Fit Area"
 
-#: modules/process/fractal.c:295
-msgid "From:"
-msgstr "From:"
-
-#: modules/process/fractal.c:295 modules/process/fractal.c:589
-#: modules/process/fractal.c:613
+#: modules/process/fractal.c:273 modules/process/fractal.c:545
+#: modules/process/fractal.c:569
 msgid "minimum"
 msgstr "minimum"
 
-#: modules/process/fractal.c:298
-msgid "To:"
-msgstr "To:"
+#: modules/process/fractal.c:274
+msgid "From:"
+msgstr "From:"
 
-#: modules/process/fractal.c:298 modules/process/fractal.c:590
-#: modules/process/fractal.c:614
+#: modules/process/fractal.c:279 modules/process/fractal.c:546
+#: modules/process/fractal.c:570
 msgid "maximum"
 msgstr "maximum"
 
-#: modules/process/fractal.c:308 modules/process/mark_with.c:390
-#: modules/process/neural.c:559
+#: modules/process/fractal.c:280
+msgid "To:"
+msgstr "To:"
+
+#: modules/process/fractal.c:287 modules/process/mark_with.c:394
+#: modules/process/neural.c:563
 msgid "Result"
 msgstr "Result"
 
-#: modules/process/fractal.c:550
+#: modules/process/fractal.c:506
 msgid "Linear fit"
 msgstr "Linear fit"
 
@@ -9976,11 +10319,11 @@ msgstr ""
 msgid "Grain Correlations"
 msgstr "Grain Correlations"
 
-#: modules/process/grain_cross.c:240
+#: modules/process/grain_cross.c:241
 msgid "_Abscissa"
 msgstr "_Abscissa"
 
-#: modules/process/grain_cross.c:244
+#: modules/process/grain_cross.c:245
 msgid "O_rdinate"
 msgstr "O_rdinate"
 
@@ -10008,119 +10351,119 @@ msgstr "Plot _graphs"
 msgid "Grain Distributions"
 msgstr "Grain Distributions"
 
-#: modules/process/grain_dist.c:553
+#: modules/process/grain_dist.c:547
 msgid "count"
 msgstr "count"
 
-#: modules/process/grain_dist.c:617
+#: modules/process/grain_dist.c:611
 msgid "Export Raw Grain Values"
 msgstr "Export Raw Grain Values"
 
-#: modules/process/grain_edge.c:100
+#: modules/process/grain_edge.c:99
 msgid "Marks grains by edge detection method."
 msgstr "Marks grains by edge detection method."
 
-#: modules/process/grain_edge.c:114
+#: modules/process/grain_edge.c:113
 msgid "/_Grains/Mark by _Edge Detection..."
 msgstr "/_Grains/Mark by _Edge Detection..."
 
-#: modules/process/grain_edge.c:118
+#: modules/process/grain_edge.c:117
 msgid "Mark grains with edge detection mechanism"
 msgstr "Mark grains with edge detection mechanism"
 
-#: modules/process/grain_edge.c:207
+#: modules/process/grain_edge.c:206
 msgid "Mark Grains by Edge Detection"
 msgstr "Mark Grains by Edge Detection"
 
-#: modules/process/grain_edge.c:245
+#: modules/process/grain_edge.c:244
 msgid "Threshold"
 msgstr "Threshold"
 
-#: modules/process/grain_edge.c:249
+#: modules/process/grain_edge.c:248
 msgid "_Laplacian:"
 msgstr "_Laplacian:"
 
-#: modules/process/grain_filter.c:195
+#: modules/process/grain_filter.c:194
 msgid ""
 "Filters grains by their properties, using logical expressions and thresholds."
 msgstr ""
 "Filters grains by their properties, using logical expressions and thresholds."
 
-#: modules/process/grain_filter.c:210
+#: modules/process/grain_filter.c:209
 msgid "/_Grains/_Filter..."
 msgstr "/_Grains/_Filter..."
 
-#: modules/process/grain_filter.c:214
+#: modules/process/grain_filter.c:213
 msgid "Filter grains by their properties"
 msgstr "Filter grains by their properties"
 
-#: modules/process/grain_filter.c:254
+#: modules/process/grain_filter.c:253
 msgid "There are no grains to filter."
 msgstr "There are no grains to filter."
 
-#: modules/process/grain_filter.c:310
+#: modules/process/grain_filter.c:309
 msgid "Filter Grains"
 msgstr "Filter Grains"
 
-#: modules/process/grain_filter.c:405
+#: modules/process/grain_filter.c:404
 msgid "Set selected as:"
 msgstr "Set selected as:"
 
-#: modules/process/grain_filter.c:420
+#: modules/process/grain_filter.c:419
 msgid "Keep grains satisfying:"
 msgstr "Keep grains satisfying:"
 
-#: modules/process/grain_filter.c:434 modules/process/lat_synth.c:733
+#: modules/process/grain_filter.c:440 modules/process/lat_synth.c:733
 msgid "Lower threshold:"
 msgstr "Lower threshold:"
 
-#: modules/process/grain_filter.c:469 modules/process/lat_synth.c:740
+#: modules/process/grain_filter.c:467 modules/process/lat_synth.c:740
 msgid "Upper threshold:"
 msgstr "Upper threshold:"
 
 #. TRANSLATORS: %c is replaced with quantity label A, B or C.
-#: modules/process/grain_filter.c:645
+#: modules/process/grain_filter.c:628
 #, c-format
 msgid "Condition %c: %s"
 msgstr "Condition %c: %s"
 
-#: modules/process/grain_mark.c:139
+#: modules/process/grain_mark.c:137
 msgid "Marks grains by thresholding (height, slope, curvature)."
 msgstr "Marks grains by thresholding (height, slope, curvature)."
 
-#: modules/process/grain_mark.c:153
+#: modules/process/grain_mark.c:151
 msgid "/_Grains/_Mark by Threshold..."
 msgstr "/_Grains/_Mark by Threshold..."
 
-#: modules/process/grain_mark.c:157
+#: modules/process/grain_mark.c:155
 msgid "Mark grains by threshold"
 msgstr "Mark grains by threshold"
 
-#: modules/process/grain_mark.c:241
+#: modules/process/grain_mark.c:240
 msgid "Mark Grains by Threshold"
 msgstr "Mark Grains by Threshold"
 
-#: modules/process/grain_mark.c:281
+#: modules/process/grain_mark.c:280
 msgid "Threshold by"
 msgstr "Threshold by"
 
-#: modules/process/grain_mark.c:311
+#: modules/process/grain_mark.c:310
 msgid "_Slope:"
 msgstr "_Slope:"
 
-#: modules/process/grain_mark.c:315
+#: modules/process/grain_mark.c:314
 msgid "_Curvature:"
 msgstr "_Curvature:"
 
-#: modules/process/grain_mark.c:324
-msgid "Criteria combination:"
-msgstr "Criteria combination:"
-
-#: modules/process/grain_mark.c:328 modules/process/grain_wshed.c:256
+#: modules/process/grain_mark.c:319 modules/process/grain_wshed.c:260
 #: modules/process/wpour_mark.c:358
 msgid "_Invert height"
 msgstr "_Invert height"
 
+#: modules/process/grain_mark.c:328
+msgid "Criteria combination:"
+msgstr "Criteria combination:"
+
 #: modules/process/grain_stat.c:54
 msgid "Displays overall grain statistics."
 msgstr "Displays overall grain statistics."
@@ -10197,416 +10540,425 @@ msgstr "Total grain volume (laplacian):"
 msgid "Total projected boundary length:"
 msgstr "Total projected boundary length:"
 
-#: modules/process/grain_wshed.c:101
+#: modules/process/grain_wshed.c:102
 msgid "Marks grains by watershed algorithm."
 msgstr "Marks grains by watershed algorithm."
 
-#: modules/process/grain_wshed.c:115
+#: modules/process/grain_wshed.c:116
 msgid "/_Grains/Mark by _Watershed..."
 msgstr "/_Grains/Mark by _Watershed..."
 
-#: modules/process/grain_wshed.c:119
+#: modules/process/grain_wshed.c:120
 msgid "Mark grains by watershed"
 msgstr "Mark grains by watershed"
 
-#: modules/process/grain_wshed.c:161
+#: modules/process/grain_wshed.c:162
 msgid "Mark Grains by Watershed"
 msgstr "Mark Grains by Watershed"
 
-#: modules/process/grain_wshed.c:199
+#: modules/process/grain_wshed.c:200
 msgid "Grain Location"
 msgstr "Grain Location"
 
-#: modules/process/grain_wshed.c:214
+#: modules/process/grain_wshed.c:216
 msgid "_Drop size:"
 msgstr "_Drop size:"
 
-#: modules/process/grain_wshed.c:230
+#: modules/process/grain_wshed.c:233
 msgid "Segmentation"
 msgstr "Segmentation"
 
-#: modules/process/grain_wshed.c:236
+#: modules/process/grain_wshed.c:239
 msgid "Num_ber of steps:"
 msgstr "Num_ber of steps:"
 
-#: modules/process/grain_wshed.c:244
+#: modules/process/grain_wshed.c:248
 msgid "Dr_op size:"
 msgstr "Dr_op size:"
 
-#: modules/process/grain_wshed.c:435
+#: modules/process/grain_wshed.c:439
 msgid "Finding minima..."
 msgstr "Finding minima..."
 
-#: modules/process/grain_wshed.c:437
+#: modules/process/grain_wshed.c:441
 msgid "Locating..."
 msgstr "Locating..."
 
-#: modules/process/grain_wshed.c:439
+#: modules/process/grain_wshed.c:443
 msgid "Simulating watershed..."
 msgstr "Simulating watershed..."
 
-#: modules/process/grain_wshed.c:441
+#: modules/process/grain_wshed.c:445
 msgid "Marking boundaries..."
 msgstr "Marking boundaries..."
 
-#: modules/process/hough.c:74
+#: modules/process/hough.c:76
 msgid "Hough transform."
 msgstr "Hough transform."
 
-#: modules/process/hough.c:88
+#: modules/process/hough.c:90
 msgid "/_Integral Transforms/_Hough..."
 msgstr "/_Integral Transforms/_Hough..."
 
-#: modules/process/hough.c:92
+#: modules/process/hough.c:94
 msgid "Compute Hough transform"
 msgstr "Compute Hough transform"
 
-#: modules/process/hough.c:178
+#: modules/process/hough.c:137
+msgid "Hough line"
+msgstr "Hough line"
+
+#: modules/process/hough.c:141
+#, c-format
+msgid "Hough circle r=%d"
+msgstr "Hough circle r=%d"
+
+#: modules/process/hough.c:173
 msgid "Hough Transform"
 msgstr "Hough Transform"
 
-#: modules/process/hough.c:201
+#: modules/process/hough.c:195
 msgid "_Transform type:"
 msgstr "_Transform type:"
 
-#: modules/process/hough.c:212
+#: modules/process/hough.c:203
 msgid "_Circle size:"
 msgstr "_Circle size:"
 
-#: modules/process/immerse.c:162
+#: modules/process/immerse.c:163
 msgid "Immerse high resolution detail into overall image."
 msgstr "Immerse high-resolution detail into overall image."
 
-#: modules/process/immerse.c:176
+#: modules/process/immerse.c:177
 msgid "/M_ultidata/_Immerse Detail..."
 msgstr "/M_ultidata/_Immerse Detail..."
 
-#: modules/process/immerse.c:180
+#: modules/process/immerse.c:181
 msgid "Immerse a detail into image"
 msgstr "Immerse a detail into image"
 
-#: modules/process/immerse.c:222
+#: modules/process/immerse.c:223
 msgid "Immerse Detail"
 msgstr "Immerse Detail"
 
-#: modules/process/immerse.c:225
+#: modules/process/immerse.c:226
 msgid "_Locate"
 msgstr "_Locate"
 
-#: modules/process/immerse.c:227
+#: modules/process/immerse.c:228
 msgid "Locate detail by full image correlation search"
 msgstr "Locate detail by full-image correlation search"
 
-#: modules/process/immerse.c:229
+#: modules/process/immerse.c:230
 msgid "_Improve"
 msgstr "_Improve"
 
-#: modules/process/immerse.c:231
+#: modules/process/immerse.c:232
 msgid "Improve detail position by correlation search in neighborhood"
 msgstr "Improve detail position by correlation search in neighbourhood"
 
-#: modules/process/immerse.c:290
+#: modules/process/immerse.c:291
 msgid "_Detail image:"
 msgstr "_Detail image:"
 
-#: modules/process/immerse.c:295
+#: modules/process/immerse.c:296
 msgid "Position:"
 msgstr "Position:"
 
-#: modules/process/immerse.c:308
+#: modules/process/immerse.c:314
 msgid "Result Sampling"
 msgstr "Result Sampling"
 
-#: modules/process/immerse.c:318
+#: modules/process/immerse.c:324
 msgid "_Upsample large image"
 msgstr "_Upsample large image"
 
-#: modules/process/immerse.c:320
+#: modules/process/immerse.c:326
 msgid "_Downsample detail"
 msgstr "_Downsample detail"
 
-#: modules/process/immerse.c:329
+#: modules/process/immerse.c:335
 msgid "Detail Leveling"
 msgstr "Detail Levelling"
 
-#: modules/process/immerse.c:339
+#: modules/process/immerse.c:345
 msgid "levelling|_None"
 msgstr "_None"
 
-#: modules/process/immerse.c:341
+#: modules/process/immerse.c:347
 msgid "_Mean value"
 msgstr "A_verage value"
 
-#: modules/process/immerse.c:349
+#: modules/process/immerse.c:355
 msgid "Show _frame"
 msgstr "Show _frame"
 
-#: modules/process/immerse.c:787
+#: modules/process/immerse.c:793
 msgid "Immersed detail"
 msgstr "Immersed detail"
 
-#: modules/process/indent_analyze.c:261
+#: modules/process/indent_analyze.c:246
 msgid "Do nothing"
 msgstr "Do nothing"
 
-#: modules/process/indent_analyze.c:262
+#: modules/process/indent_analyze.c:247
 msgid "Plane level"
 msgstr "Plane level"
 
-#: modules/process/indent_analyze.c:263
+#: modules/process/indent_analyze.c:248
 msgid "Plane rotate"
 msgstr "Plane rotate"
 
-#: modules/process/indent_analyze.c:267
+#: modules/process/indent_analyze.c:252
 msgid "New"
 msgstr "New"
 
-#: modules/process/indent_analyze.c:268
+#: modules/process/indent_analyze.c:253
 msgid "AND"
 msgstr "AND"
 
-#: modules/process/indent_analyze.c:269
+#: modules/process/indent_analyze.c:254
 msgid "OR"
 msgstr "OR"
 
-#: modules/process/indent_analyze.c:270
+#: modules/process/indent_analyze.c:255
 msgid "NOT"
 msgstr "NOT"
 
-#: modules/process/indent_analyze.c:271
+#: modules/process/indent_analyze.c:256
 msgid "XOR"
 msgstr "XOR"
 
-#: modules/process/indent_analyze.c:275
+#: modules/process/indent_analyze.c:260
 msgid "Nothing"
 msgstr "Nothing"
 
-#: modules/process/indent_analyze.c:276
+#: modules/process/indent_analyze.c:261
 msgid "Above"
 msgstr "Above"
 
-#: modules/process/indent_analyze.c:277
+#: modules/process/indent_analyze.c:262
 msgid "Below"
 msgstr "Below"
 
-#: modules/process/indent_analyze.c:278
+#: modules/process/indent_analyze.c:263
 msgid "Plane"
 msgstr "Plane"
 
-#: modules/process/indent_analyze.c:279
+#: modules/process/indent_analyze.c:264
 msgid "Impression"
 msgstr "Impression"
 
-#: modules/process/indent_analyze.c:280
+#: modules/process/indent_analyze.c:265
 msgid "Inner Pile-up"
 msgstr "Inner Pile-up"
 
-#: modules/process/indent_analyze.c:281
+#: modules/process/indent_analyze.c:266
 msgid "Outer Pile-up"
 msgstr "Outer Pile-up"
 
-#: modules/process/indent_analyze.c:282
+#: modules/process/indent_analyze.c:267
 msgid "Special points"
 msgstr "Special points"
 
-#: modules/process/indent_analyze.c:283
+#: modules/process/indent_analyze.c:268
 msgid "Faces border"
 msgstr "Faces border"
 
-#: modules/process/indent_analyze.c:287
+#: modules/process/indent_analyze.c:272
 msgid "Vickers"
 msgstr "Vickers"
 
-#: modules/process/indent_analyze.c:288
+#: modules/process/indent_analyze.c:273
 msgid "Berkovich"
 msgstr "Berkovich"
 
-#: modules/process/indent_analyze.c:289
+#: modules/process/indent_analyze.c:274
 msgid "Berkovich (modified)"
 msgstr "Berkovich (modified)"
 
-#: modules/process/indent_analyze.c:290
+#: modules/process/indent_analyze.c:275
 msgid "Knoop"
 msgstr "Knoop"
 
-#: modules/process/indent_analyze.c:291
+#: modules/process/indent_analyze.c:276
 msgid "Brinell"
 msgstr "Brinell"
 
-#: modules/process/indent_analyze.c:292
+#: modules/process/indent_analyze.c:277
 msgid "Cube corner"
 msgstr "Cube corner"
 
-#: modules/process/indent_analyze.c:293
+#: modules/process/indent_analyze.c:278
 msgid "Rockwell"
 msgstr "Rockwell"
 
-#: modules/process/indent_analyze.c:303
+#: modules/process/indent_analyze.c:288
 msgid "Analyses nanoindentation structure (volumes, surfaces, ...)."
 msgstr "Analyses nano-indentation structure (volumes, surfaces, ...)."
 
-#: modules/process/indent_analyze.c:320
+#: modules/process/indent_analyze.c:302
 msgid "/_Tip and Indentation/_Analyze Imprint..."
 msgstr "/_Tip and Indentation/_Analyse Imprint..."
 
-#: modules/process/indent_analyze.c:439
+#: modules/process/indent_analyze.c:410
 msgid "Marked _areas:"
 msgstr "Marked _areas:"
 
-#: modules/process/indent_analyze.c:445
+#: modules/process/indent_analyze.c:419
 msgid "_Indentor type:"
 msgstr "_Indentor type:"
 
-#: modules/process/indent_analyze.c:451
+#: modules/process/indent_analyze.c:428
 msgid "_Mask creation type:"
 msgstr "_Mask creation type:"
 
-#: modules/process/indent_analyze.c:456
+#: modules/process/indent_analyze.c:434
 msgid "Ref. plane _tolerance:"
 msgstr "Ref. plane _tolerance:"
 
-#: modules/process/indent_analyze.c:460
+#: modules/process/indent_analyze.c:438
 msgid "Angle _1 tolerance:"
 msgstr "Angle _1 tolerance:"
 
-#: modules/process/indent_analyze.c:485
+#: modules/process/indent_analyze.c:456
 msgid "Indent center at"
 msgstr "Indent centre at"
 
-#: modules/process/indent_analyze.c:488
+#: modules/process/indent_analyze.c:460
 msgid "Maximum at"
 msgstr "Maximum at"
 
-#: modules/process/indent_analyze.c:491
+#: modules/process/indent_analyze.c:464
 msgid "Max-min difference"
 msgstr "Max-min difference"
 
-#: modules/process/indent_analyze.c:497
+#: modules/process/indent_analyze.c:472
 msgid "Expected A<sub>d</sub>:"
 msgstr "Expected A<sub>d</sub>:"
 
-#: modules/process/indent_analyze.c:505
+#: modules/process/indent_analyze.c:479
 msgid "Expected A<sub>p</sub>:"
 msgstr "Expected A<sub>p</sub>:"
 
-#: modules/process/indent_analyze.c:549
+#: modules/process/indent_analyze.c:489
 msgid "Volume above-below"
 msgstr "Volume above-below"
 
-#: modules/process/indent_analyze.c:558
+#: modules/process/indent_analyze.c:494
 msgid "Indent. volume"
 msgstr "Indent. volume"
 
-#: modules/process/indent_analyze.c:564
+#: modules/process/indent_analyze.c:502
 msgid "Indent. A<sub>d</sub>"
 msgstr "Indent. A<sub>d</sub>"
 
-#: modules/process/indent_analyze.c:573
+#: modules/process/indent_analyze.c:509
 msgid "Indent. A<sub>p</sub>"
 msgstr "Indent. A<sub>p</sub>"
 
-#: modules/process/indent_analyze.c:587
+#: modules/process/indent_analyze.c:517
 msgid "Inner Pile-Up A<sub>d</sub>"
 msgstr "Inner Pile-Up A<sub>d</sub>"
 
-#: modules/process/indent_analyze.c:596
+#: modules/process/indent_analyze.c:525
 msgid "Inner Pile-Up A<sub>p</sub>"
 msgstr "Inner Pile-Up A<sub>p</sub>"
 
-#: modules/process/indent_analyze.c:605
+#: modules/process/indent_analyze.c:533
 msgid "Outer Pile-Up A<sub>d</sub>"
 msgstr "Outer Pile-Up A<sub>d</sub>"
 
-#: modules/process/indent_analyze.c:614
+#: modules/process/indent_analyze.c:541
 msgid "Outer Pile-Up A<sub>p</sub>"
 msgstr "Outer Pile-Up A<sub>p</sub>"
 
-#: modules/process/indent_analyze.c:644
+#: modules/process/indent_analyze.c:569
 msgid "Indentation statistics"
 msgstr "Indentation statistics"
 
-#: modules/process/indent_analyze.c:645
+#: modules/process/indent_analyze.c:570
 msgid "_Compute & mark"
 msgstr "_Compute & mark"
 
-#: modules/process/indent_analyze.c:646
+#: modules/process/indent_analyze.c:571
 msgid "_Save statistics"
 msgstr "_Save statistics"
 
-#: modules/process/indent_analyze.c:1569
+#: modules/process/indent_analyze.c:1392
 msgid "No statistics has been computed yet."
 msgstr "No statistics has been computed yet."
 
-#: modules/process/indent_analyze.c:1577
+#: modules/process/indent_analyze.c:1400
 msgid "Save Indentation Statistics"
 msgstr "Save Indentation Statistics"
 
-#: modules/process/indent_analyze.c:1615
+#: modules/process/indent_analyze.c:1438
 #, c-format
 msgid "Indentor:  %s\n"
 msgstr "Indentor:  %s\n"
 
-#: modules/process/indent_analyze.c:1619
+#: modules/process/indent_analyze.c:1442
 #, c-format
 msgid "Length units: %s\n"
 msgstr "Length units: %s\n"
 
-#: modules/process/indent_analyze.c:1621
+#: modules/process/indent_analyze.c:1444
 #, c-format
 msgid "Indentation center at [%d, %d] px:      %lf\n"
 msgstr "Indentation centre at [%d, %d] px:      %lf\n"
 
-#: modules/process/indent_analyze.c:1623
+#: modules/process/indent_analyze.c:1446
 #, c-format
 msgid "Maximum at [%d, %d] is:                 %lf\n"
 msgstr "Maximum at [%d, %d] is:                 %lf\n"
 
-#: modules/process/indent_analyze.c:1625
+#: modules/process/indent_analyze.c:1448
 #, c-format
 msgid "Difference max-min:                     %lf\n"
 msgstr "Difference max-min:                     %lf\n"
 
-#: modules/process/indent_analyze.c:1630
+#: modules/process/indent_analyze.c:1453
 #, c-format
 msgid "Area (projected) above plane:             %g (%.1lf %%)\n"
 msgstr "Area (projected) above plane:             %g (%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1634
+#: modules/process/indent_analyze.c:1457
 #, c-format
 msgid "Area (projected) below plane:             %g (%.1lf %%)\n"
 msgstr "Area (projected) below plane:             %g (%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1638
+#: modules/process/indent_analyze.c:1461
 #, c-format
 msgid "Area (projected) of    plane:             %g (%.1lf %%)\n"
 msgstr "Area (projected) of    plane:             %g (%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1643
+#: modules/process/indent_analyze.c:1466
 #, c-format
 msgid "Area (developed) above %g (+%.1f %%)\n"
 msgstr "Area (developed) above %g (+%.1f %%)\n"
 
-#: modules/process/indent_analyze.c:1646
+#: modules/process/indent_analyze.c:1469
 #, c-format
 msgid "Area (developed) below %g (+%.1lf %%)\n"
 msgstr "Area (developed) below %g (+%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1650
+#: modules/process/indent_analyze.c:1473
 #, c-format
 msgid "Volume above:     %g\n"
 msgstr "Volume above:     %g\n"
 
-#: modules/process/indent_analyze.c:1652
+#: modules/process/indent_analyze.c:1475
 #, c-format
 msgid "Volume below:     %g\n"
 msgstr "Volume below:     %g\n"
 
-#: modules/process/indent_analyze.c:1654
+#: modules/process/indent_analyze.c:1477
 #, c-format
 msgid "Volume difference %g\n"
 msgstr "Volume difference %g\n"
 
-#: modules/process/indent_analyze.c:1658
+#: modules/process/indent_analyze.c:1481
 msgid ""
 "\n"
 "Indentation\n"
@@ -10614,12 +10966,12 @@ msgstr ""
 "\n"
 "Indentation\n"
 
-#: modules/process/indent_analyze.c:1659
+#: modules/process/indent_analyze.c:1482
 #, c-format
 msgid "Volume      %g\n"
 msgstr "Volume      %g\n"
 
-#: modules/process/indent_analyze.c:1664
+#: modules/process/indent_analyze.c:1487
 msgid ""
 "\n"
 "Indentation - Inner Pile-Up\n"
@@ -10627,7 +10979,7 @@ msgstr ""
 "\n"
 "Indentation - Inner Pile-Up\n"
 
-#: modules/process/indent_analyze.c:1670
+#: modules/process/indent_analyze.c:1493
 msgid "Indentation - Outer Pile-Up\n"
 msgstr "Indentation - Outer Pile-Up\n"
 
@@ -10711,15 +11063,15 @@ msgstr "Triangular"
 
 #: modules/process/lat_synth.c:546
 msgid "lattice|Cairo"
-msgstr "lattice|Cairo"
+msgstr "Cairo"
 
 #: modules/process/lat_synth.c:547
 msgid "lattice|Snub square"
-msgstr "lattice|Snub square"
+msgstr "Snub square"
 
 #: modules/process/lat_synth.c:548
 msgid "lattice|Truncated square"
-msgstr "lattice|Truncated square"
+msgstr "Truncated square"
 
 #: modules/process/lat_synth.c:549
 msgid "Silicon 7x7"
@@ -10727,21 +11079,16 @@ msgstr "Silicon 7x7"
 
 #: modules/process/lat_synth.c:550
 msgid "lattice|Penrose (vertices)"
-msgstr "lattice|Penrose (vertices)"
+msgstr "Penrose (vertices)"
 
 #: modules/process/lat_synth.c:551
 msgid "lattice|Penrose (centers)"
-msgstr "lattice|Penrose (centres)"
+msgstr "Penrose (centres)"
 
 #: modules/process/lat_synth.c:644
 msgid "_Lattice:"
 msgstr "_Lattice:"
 
-#: modules/process/lat_synth.c:651 modules/process/obj_synth.c:544
-#: modules/process/pat_synth.c:1457
-msgid "_Size:"
-msgstr "_Size:"
-
 #: modules/process/lat_synth.c:662
 msgid "Lattice rela_xation:"
 msgstr "Lattice rela_xation:"
@@ -10880,7 +11227,7 @@ msgstr ""
 
 #: modules/process/level_grains.c:187 modules/process/median-bg.c:167
 #: modules/process/polylevel.c:293 modules/process/polylevel.c:417
-#: modules/process/sphere-revolve.c:200
+#: modules/process/sphere-revolve.c:221 modules/process/sphere-revolve.c:295
 msgid "Background"
 msgstr "Background"
 
@@ -10892,150 +11239,150 @@ msgstr "Level Grains"
 msgid "Quantity to level:"
 msgstr "Quantity to level:"
 
-#: modules/process/level_grains.c:231 modules/process/linematch.c:866
-#: modules/process/median-bg.c:217 modules/process/polylevel.c:482
-#: modules/process/sphere-revolve.c:263
+#: modules/process/level_grains.c:231 modules/process/linematch.c:834
+#: modules/process/median-bg.c:217 modules/process/polylevel.c:485
+#: modules/process/sphere-revolve.c:371
 msgid "E_xtract background"
 msgstr "E_xtract background"
 
-#: modules/process/linecorrect.c:54
+#: modules/process/linecorrect.c:52
 msgid "Corrects line defects (mostly experimental algorithms)."
 msgstr "Corrects line defects (mostly experimental algorithms)."
 
-#: modules/process/linecorrect.c:68
+#: modules/process/linecorrect.c:66
 msgid "/_Correct Data/Ste_p Line Correction"
 msgstr "/_Correct Data/Ste_p Line Correction"
 
-#: modules/process/linecorrect.c:72
+#: modules/process/linecorrect.c:70
 msgid "Correct steps in lines"
 msgstr "Correct steps in lines"
 
-#: modules/process/linematch.c:158 modules/tools/linestats.c:166
+#: modules/process/linematch.c:155 modules/tools/linestats.c:166
 #: modules/volume/volume_linestat.c:143
 msgid "Median"
 msgstr "Median"
 
-#: modules/process/linematch.c:159
+#: modules/process/linematch.c:156
 msgid "Median of differences"
 msgstr "Median of differences"
 
-#: modules/process/linematch.c:160
+#: modules/process/linematch.c:157
 msgid "Modus"
 msgstr "Modus"
 
-#: modules/process/linematch.c:161
+#: modules/process/linematch.c:158
 msgid "linematch|Matching"
 msgstr "Matching"
 
-#: modules/process/linematch.c:162
+#: modules/process/linematch.c:159
 msgid "linematch|Polynomial"
 msgstr "Polynomial"
 
-#: modules/process/linematch.c:168
+#: modules/process/linematch.c:165
 msgid "Aligns rows by various methods."
 msgstr "Aligns rows by various methods."
 
-#: modules/process/linematch.c:182
+#: modules/process/linematch.c:179
 msgid "/_Correct Data/_Align rows..."
 msgstr "/_Correct Data/_Align rows..."
 
-#: modules/process/linematch.c:186
+#: modules/process/linematch.c:183
 msgid "Align rows using various methods"
 msgstr "Align rows using various methods"
 
-#: modules/process/linematch.c:237 modules/process/linematch.c:265
+#: modules/process/linematch.c:234 modules/process/linematch.c:262
 msgid "Row background"
 msgstr "Row background"
 
-#: modules/process/linematch.c:266
+#: modules/process/linematch.c:263
 msgid "Vertical position"
 msgstr "Vertical position"
 
-#: modules/process/linematch.c:267
+#: modules/process/linematch.c:264
 msgid "Corrected offset"
 msgstr "Corrected offset"
 
-#: modules/process/linematch.c:802
+#: modules/process/linematch.c:769
 msgid "Align Rows"
 msgstr "Align Rows"
 
-#: modules/process/linematch.c:844
+#: modules/process/linematch.c:810
 msgid "_Polynomial degree:"
 msgstr "_Polynomial degree:"
 
-#: modules/process/linematch.c:876
+#: modules/process/linematch.c:844
 msgid "Plot background _graph"
 msgstr "Plot background _graph"
 
-#: modules/process/lno_synth.c:261 modules/process/noise_synth.c:188
+#: modules/process/lno_synth.c:259 modules/process/noise_synth.c:186
 msgid "distribution|Triangular"
 msgstr "Triangular"
 
-#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:213
+#: modules/process/lno_synth.c:265 modules/process/pat_synth.c:213
 msgid "Steps"
 msgstr "Steps"
 
-#: modules/process/lno_synth.c:268
+#: modules/process/lno_synth.c:266
 msgid "Scars"
 msgstr "Scars"
 
-#: modules/process/lno_synth.c:269 modules/process/pat_synth.c:214
+#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:214
 msgid "Ridges"
 msgstr "Ridges"
 
-#: modules/process/lno_synth.c:275
+#: modules/process/lno_synth.c:273
 msgid "Generates various kinds of line noise."
 msgstr "Generates various kinds of line noise."
 
-#: modules/process/lno_synth.c:289
+#: modules/process/lno_synth.c:287
 msgid "/S_ynthetic/_Line Noise..."
 msgstr "/S_ynthetic/_Line Noise..."
 
-#: modules/process/lno_synth.c:293
+#: modules/process/lno_synth.c:291
 msgid "Generate line noise"
 msgstr "Generate line noise"
 
-#: modules/process/lno_synth.c:431
+#: modules/process/lno_synth.c:429
 msgid "Line Noise"
 msgstr "Line Noise"
 
-#: modules/process/lno_synth.c:504
+#: modules/process/lno_synth.c:502
 msgid "Distribution"
 msgstr "Distribution"
 
-#: modules/process/lno_synth.c:514 modules/process/noise_synth.c:414
-msgid "Direction:"
-msgstr "Direction:"
+#: modules/process/lno_synth.c:512 modules/process/mask_noisify.c:158
+#: modules/process/noise_synth.c:412
+msgid "Noise type:"
+msgstr "Noise type:"
 
-#: modules/process/lno_synth.c:523 modules/process/noise_synth.c:423
+#: modules/process/lno_synth.c:521 modules/process/mask_noisify.c:167
+#: modules/process/noise_synth.c:421
 msgid "S_ymmetrical"
 msgstr "S_ymmetrical"
 
-#: modules/process/lno_synth.c:524 modules/process/noise_synth.c:424
+#: modules/process/lno_synth.c:522 modules/process/mask_noisify.c:168
+#: modules/process/noise_synth.c:422
 msgid "One-sided _positive"
 msgstr "One-sided _positive"
 
-#: modules/process/lno_synth.c:525 modules/process/noise_synth.c:425
+#: modules/process/lno_synth.c:523 modules/process/mask_noisify.c:169
+#: modules/process/noise_synth.c:423
 msgid "One-sided _negative"
 msgstr "One-sided _negative"
 
-#: modules/process/lno_synth.c:546
+#: modules/process/lno_synth.c:544
 msgid "Noise Type"
 msgstr "Noise Type"
 
-#: modules/process/lno_synth.c:551
+#: modules/process/lno_synth.c:549
 msgid "_Noise type:"
 msgstr "_Noise type:"
 
-#: modules/process/lno_synth.c:853 modules/process/lno_synth.c:1222
-msgid "Densi_ty:"
-msgstr "Densi_ty:"
-
-#: modules/process/lno_synth.c:864 modules/process/lno_synth.c:1233
+#: modules/process/lno_synth.c:863 modules/process/lno_synth.c:1233
 msgid "_Within line:"
 msgstr "_Within line:"
 
-#: modules/process/lno_synth.c:871
+#: modules/process/lno_synth.c:870
 msgid "C_umulative"
 msgstr "C_umulative"
 
@@ -11091,31 +11438,31 @@ msgstr "_Use trained regression"
 msgid "_Train logistic regression"
 msgstr "_Train logistic regression"
 
-#: modules/process/logistic.c:275
+#: modules/process/logistic.c:274
 msgid "_Gaussian blur"
 msgstr "_Gaussian blur"
 
-#: modules/process/logistic.c:288
+#: modules/process/logistic.c:285
 msgid "_Number of Gaussians:"
 msgstr "_Number of Gaussians:"
 
-#: modules/process/logistic.c:296
+#: modules/process/logistic.c:293
 msgid "_Sobel derivatives"
 msgstr "_Sobel derivatives"
 
-#: modules/process/logistic.c:307
+#: modules/process/logistic.c:303
 msgid "_Laplacian"
 msgstr "_Laplacian"
 
-#: modules/process/logistic.c:318
+#: modules/process/logistic.c:313
 msgid "_Hessian"
 msgstr "_Hessian"
 
-#: modules/process/logistic.c:331
+#: modules/process/logistic.c:325
 msgid "_Regularization parameter:"
 msgstr "_Regularisation parameter:"
 
-#: modules/process/logistic.c:623 modules/process/neural.c:1101
+#: modules/process/logistic.c:616 modules/process/neural.c:1108
 msgid "Training..."
 msgstr "Training..."
 
@@ -11131,13 +11478,13 @@ msgstr "/_Correct Data/Mask of _Disconnected..."
 msgid "Mark data disconnected from other values"
 msgstr "Mark data disconnected from other values"
 
-#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:422
-#: modules/process/scars.c:279
+#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:419
+#: modules/process/scars.c:297
 msgid "Positive"
 msgstr "Positive"
 
-#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:423
-#: modules/process/scars.c:280
+#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:420
+#: modules/process/scars.c:298
 msgid "Negative"
 msgstr "Negative"
 
@@ -11153,11 +11500,11 @@ msgstr "Defect type:"
 msgid "Defect _radius:"
 msgstr "Defect _radius:"
 
-#: modules/process/mark_disconn.c:563
+#: modules/process/mark_disconn.c:552
 msgid "Filtering..."
 msgstr "Filtering..."
 
-#: modules/process/mark_disconn.c:590
+#: modules/process/mark_disconn.c:579
 msgid "Marking outliers..."
 msgstr "Marking outliers..."
 
@@ -11173,55 +11520,59 @@ msgstr "/_Mask/Mark _With..."
 msgid "Mask combining and modification"
 msgstr "Mask combining and modification"
 
-#: modules/process/mark_with.c:192
+#: modules/process/mark_with.c:193
 msgid "Mark With"
 msgstr "Mark With"
 
-#: modules/process/mark_with.c:238
+#: modules/process/mark_with.c:231 modules/process/mask_morph.c:209
+msgid "Operation:"
+msgstr "Operation:"
+
+#: modules/process/mark_with.c:239
 msgid "Se_t mask"
 msgstr "Se_t mask"
 
-#: modules/process/mark_with.c:239
+#: modules/process/mark_with.c:240
 msgid "_Add mask"
 msgstr "_Add mask"
 
-#: modules/process/mark_with.c:240
+#: modules/process/mark_with.c:241
 msgid "_Subtract mask"
 msgstr "_Subtract mask"
 
-#: modules/process/mark_with.c:241
+#: modules/process/mark_with.c:242
 msgid "_Intersect masks"
 msgstr "_Intersect masks"
 
-#: modules/process/mark_with.c:247
+#: modules/process/mark_with.c:248
 msgid "Mark with:"
 msgstr "Mark with:"
 
-#: modules/process/mark_with.c:255
+#: modules/process/mark_with.c:256
 msgid "with|_Mask"
 msgstr "_Mask"
 
-#: modules/process/mark_with.c:257
+#: modules/process/mark_with.c:258
 msgid "with|_Data"
 msgstr "_Data"
 
-#: modules/process/mark_with.c:259
+#: modules/process/mark_with.c:260
 msgid "with|_Presentation"
 msgstr "_Presentation"
 
-#: modules/process/mark_with.c:293
+#: modules/process/mark_with.c:297
 msgid "Marked data range:"
 msgstr "Marked data range:"
 
-#: modules/process/mark_with.c:301
+#: modules/process/mark_with.c:305
 msgid "_Minimum:"
 msgstr "_Minimum:"
 
-#: modules/process/mark_with.c:310
+#: modules/process/mark_with.c:314
 msgid "M_aximum:"
 msgstr "M_aximum:"
 
-#: modules/process/mark_with.c:378
+#: modules/process/mark_with.c:382
 msgid "Operand"
 msgstr "Operand"
 
@@ -11257,107 +11608,107 @@ msgstr "Distribute to:"
 msgid "Preserve existing masks"
 msgstr "Preserve existing masks"
 
-#: modules/process/mask_edt.c:95
+#: modules/process/mask_edt.c:89
 msgid "Performs simple and true Euclidean distance transforms of masks."
 msgstr "Performs simple and true Euclidean distance transforms of masks."
 
-#: modules/process/mask_edt.c:109
+#: modules/process/mask_edt.c:103
 msgid "/_Mask/Distanc_e Transform..."
 msgstr "/_Mask/Distanc_e Transform..."
 
-#: modules/process/mask_edt.c:113
+#: modules/process/mask_edt.c:107
 msgid "Distance transform of mask"
 msgstr "Distance transform of mask"
 
-#: modules/process/mask_edt.c:116
+#: modules/process/mask_edt.c:110
 msgid "/_Mask/Thi_n"
 msgstr "/_Mask/Thi_n"
 
-#: modules/process/mask_edt.c:120
+#: modules/process/mask_edt.c:114
 msgid "Thin mask"
 msgstr "Thin mask"
 
-#: modules/process/mask_edt.c:330 modules/process/mask_edt.c:352
+#: modules/process/mask_edt.c:164 modules/process/mask_edt.c:186
 msgid "Distance Transform"
 msgstr "Distance Transform"
 
-#: modules/process/mask_edt.c:340
+#: modules/process/mask_edt.c:174
 msgid "Interior"
 msgstr "Interior"
 
-#: modules/process/mask_edt.c:341
+#: modules/process/mask_edt.c:175
 msgid "Exterior"
 msgstr "Exterior"
 
-#: modules/process/mask_edt.c:342
+#: modules/process/mask_edt.c:176
 msgid "Two-sided"
 msgstr "Two-sided"
 
-#: modules/process/mask_edt.c:373 modules/tools/maskedit.c:634
+#: modules/process/mask_edt.c:207 modules/tools/maskedit.c:640
 msgid "_Distance type:"
 msgstr "_Distance type:"
 
-#: modules/process/mask_edt.c:394 modules/tools/maskedit.c:640
+#: modules/process/mask_edt.c:228 modules/tools/maskedit.c:646
 msgid "Shrink from _border"
 msgstr "Shrink from _border"
 
-#: modules/process/mask_morph.c:117
+#: modules/process/mask_morph.c:116
 msgid "Performs basic morphological operations with masks."
 msgstr "Performs basic morphological operations with masks."
 
-#: modules/process/mask_morph.c:131
-msgid "/_Mask/Morphological Operation..."
-msgstr "/_Mask/Morphological Operation..."
+#: modules/process/mask_morph.c:130
+msgid "/_Mask/Morpho_logical Operation..."
+msgstr "/_Mask/Morpho_logical Operation..."
 
-#: modules/process/mask_morph.c:135
+#: modules/process/mask_morph.c:134
 msgid "Morphological operation with mask"
 msgstr "Morphological operation with mask"
 
-#: modules/process/mask_morph.c:169
+#: modules/process/mask_morph.c:168
 msgid "Erosion"
 msgstr "Erosion"
 
-#: modules/process/mask_morph.c:170
+#: modules/process/mask_morph.c:169
 msgid "Dilation"
 msgstr "Dilation"
 
-#: modules/process/mask_morph.c:171 modules/tools/filter.c:242
+#: modules/process/mask_morph.c:170 modules/tools/filter.c:243
 msgid "filter|Opening"
 msgstr "Opening"
 
-#: modules/process/mask_morph.c:172 modules/tools/filter.c:243
+#: modules/process/mask_morph.c:171 modules/tools/filter.c:244
 msgid "filter|Closing"
 msgstr "Closing"
 
-#: modules/process/mask_morph.c:173 modules/tools/filter.c:244
+#: modules/process/mask_morph.c:172 modules/tools/filter.c:245
 msgid "ASF Opening"
 msgstr "ASF Opening"
 
-#: modules/process/mask_morph.c:174 modules/tools/filter.c:245
+#: modules/process/mask_morph.c:173 modules/tools/filter.c:246
 msgid "ASF Closing"
 msgstr "ASF Closing"
 
-#: modules/process/mask_morph.c:178
+#: modules/process/mask_morph.c:177
 msgid "Octagon"
 msgstr "Octagon"
 
-#: modules/process/mask_morph.c:181
+#: modules/process/mask_morph.c:180
 msgid "Another mask"
 msgstr "Another mask"
 
-#: modules/process/mask_morph.c:192
+#: modules/process/mask_morph.c:191
 msgid "Morphological Operation"
 msgstr "Morphological Operation"
 
-#: modules/process/mask_morph.c:224
+#: modules/process/mask_morph.c:223
 msgid "Structuring element:"
 msgstr "Structuring element:"
 
-#: modules/process/mask_morph.c:238 modules/tools/maskedit.c:524
+#: modules/process/mask_morph.c:237 modules/tools/maskedit.c:528
 msgid "_Radius:"
 msgstr "_Radius:"
 
-#: modules/process/mask_morph.c:249
+#: modules/process/mask_morph.c:248
 msgid "_Mask:"
 msgstr "_Mask:"
 
@@ -11365,39 +11716,59 @@ msgstr "_Mask:"
 msgid "_Trim empty borders"
 msgstr "_Trim empty borders"
 
-#: modules/process/maskcor.c:86
+#: modules/process/mask_noisify.c:83
+msgid "Adds salt and/or pepper noise to mask."
+msgstr "Adds salt and/or pepper noise to mask."
+
+#: modules/process/mask_noisify.c:97
+msgid "/_Mask/_Noisify..."
+msgstr "/_Mask/_Noisify..."
+
+#: modules/process/mask_noisify.c:101
+msgid "Add noise to mask"
+msgstr "Add noise to mask"
+
+#: modules/process/mask_noisify.c:141
+msgid "Noisify Mask"
+msgstr "Noisify Mask"
+
+#: modules/process/mask_noisify.c:184
+msgid "_Alter only boundaries"
+msgstr "_Alter only boundaries"
+
+#: modules/process/maskcor.c:87
 msgid "Creates mask by correlation with another data."
 msgstr "Creates mask by correlation with another data."
 
-#: modules/process/maskcor.c:100
+#: modules/process/maskcor.c:101
 msgid "/M_ultidata/_Mask by Correlation..."
 msgstr "/M_ultidata/_Mask by Correlation..."
 
-#: modules/process/maskcor.c:104
+#: modules/process/maskcor.c:105
 msgid "Create mask by correlation with another data"
 msgstr "Create mask by correlation with another data"
 
-#: modules/process/maskcor.c:141
+#: modules/process/maskcor.c:142
 msgid "Mask by Correlation"
 msgstr "Mask by Correlation"
 
-#: modules/process/maskcor.c:165
+#: modules/process/maskcor.c:166
 msgid "Correlation _kernel:"
 msgstr "Correlation _kernel:"
 
-#: modules/process/maskcor.c:172
+#: modules/process/maskcor.c:173
 msgid "Objects marked"
 msgstr "Objects marked"
 
-#: modules/process/maskcor.c:173
+#: modules/process/maskcor.c:174
 msgid "Correlation maxima"
 msgstr "Correlation maxima"
 
-#: modules/process/maskcor.c:174 modules/process/maskcor.c:356
+#: modules/process/maskcor.c:175 modules/process/maskcor.c:360
 msgid "Correlation score"
 msgstr "Correlation score"
 
-#: modules/process/maskcor.c:183
+#: modules/process/maskcor.c:185
 msgid "Correlation _method:"
 msgstr "Correlation _method:"
 
@@ -11426,8 +11797,8 @@ msgid "/_Mask/_Extract Mask"
 msgstr "/_Mask/_Extract Mask"
 
 #: modules/process/maskops.c:78
-msgid "Extract mask to a new channel"
-msgstr "Extract mask to a new channel"
+msgid "Extract mask to a new image"
+msgstr "Extract mask to a new image"
 
 #: modules/process/maskops.c:81
 msgid "/_Grains/_Remove Edge-Touching"
@@ -11453,35 +11824,31 @@ msgstr "Crop non-intersecting regions of two images"
 msgid "Mutual Crop"
 msgstr "Mutual Crop"
 
-#: modules/process/mcrop.c:174
+#: modules/process/mcrop.c:173
 msgid "_Select second argument:"
 msgstr "_Select second argument:"
 
-#: modules/process/measure_lattice.c:174
+#: modules/process/measure_lattice.c:165
 msgid "Measures parameters of two-dimensional lattices."
 msgstr "Measures parameters of two-dimensional lattices."
 
-#: modules/process/measure_lattice.c:188
+#: modules/process/measure_lattice.c:179
 msgid "/_Statistics/Measure _Lattice..."
 msgstr "/_Statistics/Measure _Lattice..."
 
-#: modules/process/measure_lattice.c:192
+#: modules/process/measure_lattice.c:183
 msgid "Measure lattice"
 msgstr "Measure lattice"
 
-#: modules/process/measure_lattice.c:253
+#: modules/process/measure_lattice.c:243
 msgid "Measure Lattice"
 msgstr "Measure Lattice"
 
-#: modules/process/measure_lattice.c:259
-msgid "_Refine"
-msgstr "_Refine"
-
-#: modules/process/measure_lattice.c:330
+#: modules/process/measure_lattice.c:320
 msgid "_ACF"
 msgstr "_ACF"
 
-#: modules/process/measure_lattice.c:331
+#: modules/process/measure_lattice.c:321
 msgid "_PSDF"
 msgstr "_PSDF"
 
@@ -11497,30 +11864,30 @@ msgstr "_Lattice"
 msgid "_Vectors"
 msgstr "_Vectors"
 
-#: modules/process/measure_lattice.c:596
+#: modules/process/measure_lattice.c:589
 msgid "Save Lattice Parameters"
 msgstr "Save Lattice Parameters"
 
-#: modules/process/measure_lattice.c:634
+#: modules/process/measure_lattice.c:627
 #, c-format
 msgid "Vector %d:"
 msgstr "Vector %d:"
 
-#: modules/process/measure_lattice.c:643
+#: modules/process/measure_lattice.c:636
 #, c-format
 msgid "Length %d:"
 msgstr "Length %d:"
 
-#: modules/process/measure_lattice.c:650
+#: modules/process/measure_lattice.c:643
 #, c-format
 msgid "Angle %d:"
 msgstr "Angle %d:"
 
-#: modules/process/measure_lattice.c:665
+#: modules/process/measure_lattice.c:657
 msgid "Angle:"
 msgstr "Angle:"
 
-#: modules/process/measure_lattice.c:681
+#: modules/process/measure_lattice.c:673
 msgid "Lattice Parameters"
 msgstr "Lattice Parameters"
 
@@ -11544,11 +11911,11 @@ msgstr "Median-levelling..."
 msgid "Median Level"
 msgstr "Median Level"
 
-#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:237
+#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:336
 msgid "Real _radius:"
 msgstr "Real _radius:"
 
-#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:247
+#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:346
 msgid "_Pixel radius:"
 msgstr "_Pixel radius:"
 
@@ -11588,7 +11955,7 @@ msgstr "First operand"
 msgid "Second operand"
 msgstr "Second operand"
 
-#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:643
+#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:612
 msgid "Average"
 msgstr "Average"
 
@@ -11640,6 +12007,221 @@ msgstr "Add _mask of outside pixels"
 msgid "Merged images"
 msgstr "Merged images"
 
+#: modules/process/mfm_current.c:163
+msgid "Simulation of current line magnetic field"
+msgstr "Simulation of current line magnetic field"
+
+#: modules/process/mfm_current.c:177
+msgid "/SPM M_odes/_MFM/_Current Line Field..."
+msgstr "/SPM M_odes/_MFM/_Current Line Field..."
+
+#: modules/process/mfm_current.c:181
+msgid "Simulate stray field above current line"
+msgstr "Simulate stray field above current line"
+
+#: modules/process/mfm_current.c:280 modules/process/mfm_parallel.c:282
+msgid "Simulated field"
+msgstr "Simulated field"
+
+#: modules/process/mfm_current.c:322 modules/process/mfm_field.c:266
+#: modules/process/mfm_parallel.c:324
+msgid "Point charge"
+msgstr "Point charge"
+
+#: modules/process/mfm_current.c:323 modules/process/mfm_field.c:267
+#: modules/process/mfm_parallel.c:325
+msgid "Bar"
+msgstr "Bar"
+
+#: modules/process/mfm_current.c:330
+msgid "Current Line Stray Field"
+msgstr "Current Line Stray Field"
+
+#: modules/process/mfm_current.c:415
+msgid "Output"
+msgstr "Output"
+
+#: modules/process/mfm_current.c:420 modules/process/mfm_field.c:320
+#: modules/process/mfm_parallel.c:415
+msgid "_Output plane height:"
+msgstr "_Output plane height:"
+
+#: modules/process/mfm_current.c:428
+msgid "_Stripe width:"
+msgstr "_Stripe width:"
+
+#: modules/process/mfm_current.c:436
+msgid "Stripe _current:"
+msgstr "Stripe _current:"
+
+#: modules/process/mfm_current.c:444
+msgid "_Position:"
+msgstr "_Position:"
+
+#: modules/process/mfm_current.c:461
+msgid "Probe"
+msgstr "Probe"
+
+#: modules/process/mfm_current.c:469
+msgid "P_robe type:"
+msgstr "P_robe type:"
+
+#: modules/process/mfm_current.c:475 modules/process/mfm_field.c:389
+#: modules/process/mfm_parallel.c:482
+msgid "Tip _magnetization:"
+msgstr "Tip _magnetisation:"
+
+#: modules/process/mfm_current.c:484 modules/process/mfm_field.c:397
+#: modules/process/mfm_parallel.c:491
+msgid "Bar width _x:"
+msgstr "Bar width _x:"
+
+#: modules/process/mfm_current.c:493 modules/process/mfm_field.c:405
+#: modules/process/mfm_parallel.c:500
+msgid "Bar width _y:"
+msgstr "Bar width _y:"
+
+#: modules/process/mfm_current.c:502 modules/process/mfm_field.c:413
+#: modules/process/mfm_parallel.c:509
+msgid "Bar length (_z):"
+msgstr "Bar length (_z):"
+
+#: modules/process/mfm_field.c:146
+msgid "Simulation of magnetic field above perpendicular media"
+msgstr "Simulation of magnetic field above perpendicular media"
+
+#: modules/process/mfm_field.c:160
+msgid "/SPM M_odes/_MFM/_Perpendicular Media Field..."
+msgstr "/SPM M_odes/_MFM/_Perpendicular Media Field..."
+
+#: modules/process/mfm_field.c:164
+msgid "Compute stray field above perpendicular magnetic medium"
+msgstr "Compute stray field above perpendicular magnetic medium"
+
+#: modules/process/mfm_field.c:276
+msgid "Perpendicular Media Stray Field"
+msgstr "Perpendicular Media Stray Field"
+
+#: modules/process/mfm_field.c:328 modules/process/mfm_parallel.c:423
+msgid "_Film thickness:"
+msgstr "_Film thickness:"
+
+#: modules/process/mfm_field.c:336
+msgid "_Magnetic charge:"
+msgstr "_Magnetic charge:"
+
+#: modules/process/mfm_field.c:344
+msgid "Include domain _walls"
+msgstr "Include domain _walls"
+
+#: modules/process/mfm_field.c:354
+msgid "_Exchange constant:"
+msgstr "_Exchange constant:"
+
+#: modules/process/mfm_field.c:362
+msgid "_Uniaxial anisotropy:"
+msgstr "_Uniaxial anisotropy:"
+
+#: modules/process/mfm_field.c:383 modules/process/mfm_parallel.c:476
+msgid "_Probe type:"
+msgstr "_Probe type:"
+
+#: modules/process/mfm_findshift.c:88
+msgid "Lift height difference estimation from data blur"
+msgstr "Lift height difference estimation from data blur"
+
+#: modules/process/mfm_findshift.c:102
+msgid "/SPM M_odes/_MFM/_Estimate Shift in Z..."
+msgstr "/SPM M_odes/_MFM/_Estimate Shift in Z..."
+
+#: modules/process/mfm_findshift.c:106
+msgid "Estimate lift height difference in MFM data"
+msgstr "Estimate lift height difference in MFM data"
+
+#: modules/process/mfm_findshift.c:166 modules/process/psf.c:340
+msgid "Searching..."
+msgstr "Searching..."
+
+#: modules/process/mfm_findshift.c:196
+msgid "Estimated shift:"
+msgstr "Estimated shift:"
+
+#: modules/process/mfm_findshift.c:211
+msgid "Shifted field difference"
+msgstr "Shifted field difference"
+
+#: modules/process/mfm_findshift.c:228
+msgid "Estimate Lift Height Shift"
+msgstr "Estimate Lift Height Shift"
+
+#: modules/process/mfm_findshift.c:255
+msgid "Data to compare:"
+msgstr "Data to compare:"
+
+#: modules/process/mfm_findshift.c:261
+msgid "Search _from:"
+msgstr "Search _from:"
+
+#: modules/process/mfm_findshift.c:269
+msgid "Search _to:"
+msgstr "Search _to:"
+
+#: modules/process/mfm_parallel.c:165
+msgid "Simulation of parallel magnetic media"
+msgstr "Simulation of parallel magnetic media"
+
+#: modules/process/mfm_parallel.c:179
+msgid "/SPM M_odes/_MFM/Para_llel Media Field..."
+msgstr "/SPM M_odes/_MFM/Para_llel Media Field..."
+
+#: modules/process/mfm_parallel.c:183
+msgid "Simulate stray field above parallel magnetic medium"
+msgstr "Simulate stray field above parallel magnetic medium"
+
+#: modules/process/mfm_parallel.c:331
+msgid "Parallel Media Stray Field"
+msgstr "Parallel Media Stray Field"
+
+#: modules/process/mfm_parallel.c:431
+msgid "_Remanent magnetization:"
+msgstr "_Remanent magnetisation:"
+
+#: modules/process/mfm_parallel.c:439
+msgid "Size _A (dir. left):"
+msgstr "Size _A (dir. left):"
+
+#: modules/process/mfm_parallel.c:447
+msgid "Size _B (dir. right):"
+msgstr "Size _B (dir. right):"
+
+#: modules/process/mfm_parallel.c:455
+msgid "_Gap size:"
+msgstr "_Gap size:"
+
+#: modules/process/mfm_shift.c:87
+msgid "Simulation of magnetic field z component change for another level"
+msgstr "Simulation of magnetic field z component change for another level"
+
+#: modules/process/mfm_shift.c:101
+msgid "/SPM M_odes/_MFM/_Field Shift in Z..."
+msgstr "/SPM M_odes/_MFM/_Field Shift in Z..."
+
+#: modules/process/mfm_shift.c:105
+msgid "Compute stray field shift for another z level"
+msgstr "Compute stray field shift for another z level"
+
+#: modules/process/mfm_shift.c:146
+msgid "Shifted field"
+msgstr "Shifted field"
+
+#: modules/process/mfm_shift.c:164
+msgid "Stray Field Plane Shift"
+msgstr "Stray Field Plane Shift"
+
+#: modules/process/mfm_shift.c:209
+msgid "_Z shift by:"
+msgstr "_Z shift by:"
+
 #: modules/process/nanoindent_adjust.c:89
 msgid "Adjust images of two indentor prints."
 msgstr "Adjust images of two indentor prints."
@@ -11676,13 +12258,13 @@ msgstr "_Rotate data"
 msgid "E_xtrapolate result data out of measured range"
 msgstr "E_xtrapolate result data out of measured range"
 
-#: modules/process/nanoindent_adjust.c:295
+#: modules/process/nanoindent_adjust.c:296
 msgid ""
 "Tip has different range/resolution ratio than image. Tip will be resampled."
 msgstr ""
 "Tip has different range/resolution ratio than image. Tip will be resampled."
 
-#: modules/process/nanoindent_adjust.c:334
+#: modules/process/nanoindent_adjust.c:335
 msgid "Immersed detail data"
 msgstr "Immersed detail data"
 
@@ -11723,244 +12305,232 @@ msgstr "Training error"
 msgid "error"
 msgstr "error"
 
-#: modules/process/neural.c:503
+#: modules/process/neural.c:504
 msgid "NN training error"
 msgstr "NN training error"
 
-#: modules/process/neural.c:516
+#: modules/process/neural.c:517
 msgid "Training"
 msgstr "Training"
 
-#: modules/process/neural.c:520
+#: modules/process/neural.c:521
 msgid "_Model:"
 msgstr "_Model:"
 
-#: modules/process/neural.c:530
+#: modules/process/neural.c:532
 msgid "_Signal:"
 msgstr "_Signal:"
 
-#: modules/process/neural.c:541
+#: modules/process/neural.c:544
 msgid "Training ste_ps:"
 msgstr "Training ste_ps:"
 
-#: modules/process/neural.c:557
+#: modules/process/neural.c:561
 msgid "Model"
 msgstr "Model"
 
-#: modules/process/neural.c:558
+#: modules/process/neural.c:562
 msgid "Signal"
 msgstr "Signal"
 
-#: modules/process/neural.c:575
+#: modules/process/neural.c:579
 msgid "verb|_Train"
 msgstr "_Train"
 
-#: modules/process/neural.c:580
+#: modules/process/neural.c:584
 msgid "Re_initialize"
 msgstr "Re_initialise"
 
-#: modules/process/neural.c:613
+#: modules/process/neural.c:617
 msgid "Network"
 msgstr "Network"
 
-#: modules/process/neural.c:619
+#: modules/process/neural.c:623
 msgid "Window _width:"
 msgstr "Window _width:"
 
-#: modules/process/neural.c:627
+#: modules/process/neural.c:631
 msgid "Window h_eight:"
 msgstr "Window h_eight:"
 
-#: modules/process/neural.c:635
+#: modules/process/neural.c:639
 msgid "_Hidden nodes:"
 msgstr "_Hidden nodes:"
 
-#: modules/process/neural.c:643
+#: modules/process/neural.c:647
 msgid "Result Units"
 msgstr "Result Units"
 
-#: modules/process/neural.c:650
+#: modules/process/neural.c:654
 msgid "Power of source _XY:"
 msgstr "Power of source _XY:"
 
-#: modules/process/neural.c:658
+#: modules/process/neural.c:663
 msgid "Power of source _Z:"
 msgstr "Power of source _Z:"
 
-#: modules/process/neural.c:666
+#: modules/process/neural.c:672
 msgid "_Fixed units:"
 msgstr "_Fixed units:"
 
-#: modules/process/neural.c:676
+#: modules/process/neural.c:683
 msgid "Networks"
 msgstr "Networks"
 
-#: modules/process/neural.c:723
+#: modules/process/neural.c:730
 msgid "Network _name:"
 msgstr "Network _name:"
 
-#: modules/process/neural.c:775
+#: modules/process/neural.c:782
 msgid "Apply Neural Network"
 msgstr "Apply Neural Network"
 
-#: modules/process/neural.c:798
+#: modules/process/neural.c:805
 msgid "_Scale proportionally to input"
 msgstr "_Scale proportionally to input"
 
-#: modules/process/neural.c:929
+#: modules/process/neural.c:936
 msgid "Model and signal are not compatible."
 msgstr "Model and signal are not compatible."
 
-#: modules/process/neural.c:937
+#: modules/process/neural.c:944
 msgid "A field dimension is too small for chosen window size."
 msgstr "A field dimension is too small for chosen window size."
 
-#: modules/process/neural.c:1183 modules/process/neural.c:1349
+#: modules/process/neural.c:1190 modules/process/neural.c:1356
 msgid "Evaluating..."
 msgstr "Evaluating..."
 
-#: modules/process/neural.c:1309
+#: modules/process/neural.c:1316
 msgid "Training was canceled."
 msgstr "Training was cancelled."
 
-#: modules/process/neural.c:1319
+#: modules/process/neural.c:1326
 #, c-format
 msgid "Mean difference: %.*f %s"
 msgstr "Mean difference: %.*f %s"
 
-#: modules/process/neural.c:1371
+#: modules/process/neural.c:1378
 msgid "Evaluated signal"
 msgstr "Evaluated signal"
 
-#: modules/process/noise_synth.c:196
+#: modules/process/noise_synth.c:194
 msgid "Generates uncorrelated random noise."
 msgstr "Generates uncorrelated random noise."
 
-#: modules/process/noise_synth.c:210
+#: modules/process/noise_synth.c:208
 msgid "/S_ynthetic/_Noise..."
 msgstr "/S_ynthetic/_Noise..."
 
-#: modules/process/noise_synth.c:214
+#: modules/process/noise_synth.c:212
 msgid "Generate surface of uncorrelated noise"
 msgstr "Generate surface of uncorrelated noise"
 
-#: modules/process/noise_synth.c:334
+#: modules/process/noise_synth.c:332
 msgid "Random Noise"
 msgstr "Random Noise"
 
-#: modules/process/obj_synth.c:274
+#: modules/process/obj_synth.c:270
 msgid "Spheres"
 msgstr "Spheres"
 
-#: modules/process/obj_synth.c:275
+#: modules/process/obj_synth.c:271
 msgid "Boxes"
 msgstr "Boxes"
 
-#: modules/process/obj_synth.c:276
+#: modules/process/obj_synth.c:272
 msgid "Cones"
 msgstr "Cones"
 
-#: modules/process/obj_synth.c:277
+#: modules/process/obj_synth.c:273
 msgid "Pyramids"
 msgstr "Pyramids"
 
-#: modules/process/obj_synth.c:278
+#: modules/process/obj_synth.c:274
 msgid "Diamonds"
 msgstr "Diamonds"
 
-#: modules/process/obj_synth.c:279
+#: modules/process/obj_synth.c:275
 msgid "Tetrahedrons"
 msgstr "Tetrahedrons"
 
-#: modules/process/obj_synth.c:280
+#: modules/process/obj_synth.c:276
 msgid "Nuggets"
 msgstr "Nuggets"
 
-#: modules/process/obj_synth.c:281
+#: modules/process/obj_synth.c:277
 msgid "Thatches"
 msgstr "Thatches"
 
-#: modules/process/obj_synth.c:282
+#: modules/process/obj_synth.c:278
 msgid "Tents"
 msgstr "Tents"
 
-#: modules/process/obj_synth.c:283
+#: modules/process/obj_synth.c:279
 msgid "Gaussians"
 msgstr "Gaussians"
 
-#: modules/process/obj_synth.c:284
+#: modules/process/obj_synth.c:280
 msgid "Doughnuts"
 msgstr "Doughnuts"
 
-#: modules/process/obj_synth.c:285
+#: modules/process/obj_synth.c:281
 msgid "Parabolic bumps"
 msgstr "Parabolic bumps"
 
-#: modules/process/obj_synth.c:291
+#: modules/process/obj_synth.c:287
 msgid "Generates randomly patterned surfaces by placing objects."
 msgstr "Generates randomly patterned surfaces by placing objects."
 
-#: modules/process/obj_synth.c:305
-msgid "/S_ynthetic/_Objects..."
-msgstr "/S_ynthetic/_Objects..."
+#: modules/process/obj_synth.c:301
+msgid "/S_ynthetic/_Deposition/_Objects..."
+msgstr "/S_ynthetic/_Deposition/_Objects..."
 
-#: modules/process/obj_synth.c:309
+#: modules/process/obj_synth.c:305
 msgid "Generate surface of randomly placed objects"
 msgstr "Generate surface of randomly placed objects"
 
-#: modules/process/obj_synth.c:424
+#: modules/process/obj_synth.c:421
 msgid "Both (random)"
 msgstr "Both (random)"
 
-#: modules/process/obj_synth.c:439
+#: modules/process/obj_synth.c:436
 msgid "Random Objects"
 msgstr "Random Objects"
 
-#: modules/process/obj_synth.c:513
-msgid "_Shape:"
-msgstr "_Shape:"
-
-#: modules/process/obj_synth.c:531
-msgid "obj."
-msgstr "obj."
-
-#: modules/process/obj_synth.c:551
+#: modules/process/obj_synth.c:549
 msgid "Aspect Ratio"
 msgstr "Aspect Ratio"
 
-#: modules/process/obj_synth.c:558
+#: modules/process/obj_synth.c:556
 msgid "_Aspect ratio:"
 msgstr "_Aspect ratio:"
 
-#: modules/process/obj_synth.c:588
+#: modules/process/obj_synth.c:586
 msgid "Scales _with size"
 msgstr "Scales _with size"
 
-#: modules/process/obj_synth.c:612
+#: modules/process/obj_synth.c:611
 msgid "_Feature type:"
 msgstr "_Feature type:"
 
-#: modules/process/obj_synth.c:807
-msgid "_Truncate:"
-msgstr "_Truncate:"
-
-#: modules/process/otsu_threshold.c:39 modules/process/otsu_threshold.c:59
+#: modules/process/otsu_threshold.c:40 modules/process/otsu_threshold.c:60
 msgid "Automated threshold using Otsu's method on heights."
 msgstr "Automated threshold using Otsu's method on heights."
 
-#: modules/process/otsu_threshold.c:55
-msgid "/_Grains/_Mark by Otsu's..."
-msgstr "/_Grains/_Mark by Otsu's..."
+#: modules/process/otsu_threshold.c:56
+msgid "/_Grains/_Mark by Otsu's"
+msgstr "/_Grains/_Mark by Otsu's"
 
-#: modules/process/outliers.c:40
+#: modules/process/outliers.c:41
 msgid "Creates mask of outliers."
 msgstr "Creates mask of outliers."
 
-#: modules/process/outliers.c:54
+#: modules/process/outliers.c:55
 msgid "/_Correct Data/Mask of _Outliers"
 msgstr "/_Correct Data/Mask of _Outliers"
 
-#: modules/process/outliers.c:58
+#: modules/process/outliers.c:59
 msgid "Mark data farther than 3σ from mean value"
 msgstr "Mark data farther than 3σ from mean value"
 
@@ -11984,80 +12554,100 @@ msgstr "Pattern"
 msgid "_Pattern:"
 msgstr "_Pattern:"
 
-#: modules/process/pat_synth.c:812
+#: modules/process/pat_synth.c:813
 msgid "Flat"
 msgstr "Flat"
 
-#: modules/process/pat_synth.c:820
+#: modules/process/pat_synth.c:821
 msgid "_Flat width:"
 msgstr "_Flat width:"
 
-#: modules/process/pat_synth.c:837 modules/process/pat_synth.c:1139
-#: modules/process/pat_synth.c:1474
+#: modules/process/pat_synth.c:838 modules/process/pat_synth.c:1140
+#: modules/process/pat_synth.c:1475
 msgid "_Slope width:"
 msgstr "_Slope width:"
 
-#: modules/process/pat_synth.c:1099
+#: modules/process/pat_synth.c:1100
 msgid "Top"
 msgstr "Top"
 
-#: modules/process/pat_synth.c:1106
+#: modules/process/pat_synth.c:1107
 msgid "Flat _top width:"
 msgstr "Flat _top width:"
 
-#: modules/process/pat_synth.c:1114
+#: modules/process/pat_synth.c:1115
 msgid "Bottom"
 msgstr "Bottom"
 
-#: modules/process/pat_synth.c:1122
+#: modules/process/pat_synth.c:1123
 msgid "Flat _bottom width:"
 msgstr "Flat _bottom width:"
 
-#: modules/process/pat_synth.c:1440
+#: modules/process/pat_synth.c:1441
 msgid "_Distance:"
 msgstr "_Distance:"
 
-#: modules/process/pid.c:96
+#: modules/process/phase_synth.c:136
+msgid "Generates phase-separated structures."
+msgstr "Generates phase-separated structures."
+
+#: modules/process/phase_synth.c:150
+msgid "/S_ynthetic/P_hases..."
+msgstr "/S_ynthetic/P_hases..."
+
+#: modules/process/phase_synth.c:154
+msgid "Generate surface with separated phases"
+msgstr "Generate surface with separated phases"
+
+#: modules/process/phase_synth.c:203
+msgid "Separated Phases"
+msgstr "Separated Phases"
+
+#: modules/process/phase_synth.c:287
+msgid "Size s_pread:"
+msgstr "Size s_pread:"
+
+#: modules/process/pid.c:95
 msgid "A simple PID simulator"
 msgstr "A simple PID simulator"
 
-#: modules/process/pid.c:110
+#: modules/process/pid.c:109
 msgid "/_Tip and Indentation/_PID simulation..."
 msgstr "/_Tip and Indentation/_PID simulation..."
 
-#: modules/process/pid.c:114
+#: modules/process/pid.c:113
 msgid "Simulate PID effects on measurement"
 msgstr "Simulate PID effects on measurement"
 
-#: modules/process/pid.c:158
+#: modules/process/pid.c:157
 msgid "PID FW result"
 msgstr "PID FW result"
 
-#: modules/process/pid.c:167
+#: modules/process/pid.c:166
 msgid "PID FW max. force"
 msgstr "PID FW max. force"
 
-#: modules/process/pid.c:176
+#: modules/process/pid.c:175
 msgid "PID REV result"
 msgstr "PID REV result"
 
-#: modules/process/pid.c:185
+#: modules/process/pid.c:184
 msgid "PID REV max. force"
 msgstr "PID REV max. force"
 
-#: modules/process/pid.c:198
+#: modules/process/pid.c:196
 msgid "PID simulation"
 msgstr "PID simulation"
 
-#: modules/process/pid.c:215
+#: modules/process/pid.c:214
 msgid "_Proportional:"
 msgstr "_Proportional:"
 
-#: modules/process/pid.c:221
+#: modules/process/pid.c:220
 msgid "_Integral:"
 msgstr "_Integral:"
 
-#: modules/process/pid.c:227
+#: modules/process/pid.c:226
 msgid "_Integration steps:"
 msgstr "_Integration steps:"
 
@@ -12065,15 +12655,15 @@ msgstr "_Integration steps:"
 msgid "_Derivative:"
 msgstr "_Derivative:"
 
-#: modules/process/pid.c:241
+#: modules/process/pid.c:240
 msgid "PID/scan speed _ratio:"
 msgstr "PID/scan speed _ratio:"
 
-#: modules/process/pid.c:253
+#: modules/process/pid.c:255
 msgid "Force strength:"
 msgstr "Force strength:"
 
-#: modules/process/pid.c:259
+#: modules/process/pid.c:261
 msgid "Force setpoint:"
 msgstr "Force setpoint:"
 
@@ -12081,7 +12671,7 @@ msgstr "Force setpoint:"
 msgid "Scanning..."
 msgstr "Scanning..."
 
-#: modules/process/pid.c:396
+#: modules/process/pid.c:401
 msgid "Computation diverged, try to change parameters"
 msgstr "Computation diverged, try to change parameters"
 
@@ -12101,23 +12691,23 @@ msgstr "Applies polynomial distortion in the horizontal plane"
 msgid "Distort by Polynomial"
 msgstr "Distort by Polynomial"
 
-#: modules/process/polydistort.c:282
+#: modules/process/polydistort.c:285
 msgid "Ori_ginal"
 msgstr "Ori_ginal"
 
-#: modules/process/polydistort.c:283
+#: modules/process/polydistort.c:286
 msgid "_Transformed"
 msgstr "_Transformed"
 
-#: modules/process/polydistort.c:289
+#: modules/process/polydistort.c:292
 msgid "X Coefficients"
 msgstr "X Coefficients"
 
-#: modules/process/polydistort.c:303
+#: modules/process/polydistort.c:306
 msgid "Y Coefficients"
 msgstr "Y Coefficients"
 
-#: modules/process/polydistort.c:499
+#: modules/process/polydistort.c:502
 msgid "Distorted"
 msgstr "Distorted"
 
@@ -12153,23 +12743,23 @@ msgstr "Levelled data"
 msgid "_Horizontal polynom degree:"
 msgstr "_Horizontal polynom degree:"
 
-#: modules/process/polylevel.c:450
+#: modules/process/polylevel.c:451
 msgid "_Vertical polynom degree:"
 msgstr "_Vertical polynom degree:"
 
-#: modules/process/polylevel.c:456
+#: modules/process/polylevel.c:458
 msgid "_Same degrees"
 msgstr "_Same degrees"
 
-#: modules/process/polylevel.c:474
+#: modules/process/polylevel.c:476
 msgid "_Maximum polynom degree:"
 msgstr "_Maximum polynom degree:"
 
-#: modules/process/polylevel.c:561
+#: modules/process/polylevel.c:564
 msgid "Polynomial Coefficients"
 msgstr "Polynomial Coefficients"
 
-#: modules/process/polylevel.c:934 modules/tools/distance.c:594
+#: modules/process/polylevel.c:937 modules/tools/distance.c:594
 #: modules/tools/selectionmanager.c:720
 msgid "Save Table"
 msgstr "Save Table"
@@ -12191,8 +12781,8 @@ msgid "/_Presentation/E_xtract Presentation"
 msgstr "/_Presentation/E_xtract Presentation"
 
 #: modules/process/presentationops.c:81
-msgid "Extract presentation to a new channel"
-msgstr "Extract presentation to a new channel"
+msgid "Extract presentation to a new image"
+msgstr "Extract presentation to a new image"
 
 #: modules/process/presentationops.c:84
 msgid "/_Presentation/_Attach Presentation..."
@@ -12218,6 +12808,10 @@ msgstr "Attach Presentation"
 msgid "_Data to attach:"
 msgstr "_Data to attach:"
 
+#: modules/process/preview.h:245
+msgid "Combine with existing mask:"
+msgstr "Combine with existing mask:"
+
 #: modules/process/psdf_logphi.c:76
 msgid ""
 "Two-dimensional FFT (Fast Fourier Transform) transformed to coordinates (log-"
@@ -12238,10 +12832,79 @@ msgstr "Compute PSDF in Log-Phi coordinates"
 msgid "Log-Phi PSDF"
 msgstr "Log-Phi PSDF"
 
-#: modules/process/psdf_logphi.c:275 modules/process/wpour_mark.c:320
+#: modules/process/psdf_logphi.c:276 modules/process/wpour_mark.c:320
 msgid "Gaussian _smoothing:"
 msgstr "Gaussian _smoothing:"
 
+#: modules/process/psf-fit.c:165
+msgid "Gaussian (asymmetric)"
+msgstr "Gaussian (asymmetric)"
+
+#: modules/process/psf-fit.c:177
+msgid "Point spread function estimation by fitting explicit function form."
+msgstr "Point spread function estimation by fitting explicit function form."
+
+#: modules/process/psf-fit.c:191
+msgid "/_Statistics/_PSF Fit..."
+msgstr "/_Statistics/_PSF Fit..."
+
+#: modules/process/psf-fit.c:195
+msgid "Fit PSF from known data and image"
+msgstr "Fit PSF from known data and image"
+
+#: modules/process/psf-fit.c:246 modules/process/psf.c:181
+#: modules/process/psf.c:230
+msgid "PSF"
+msgstr "PSF"
+
+#: modules/process/psf-fit.c:254 modules/process/psf.c:195
+msgid "PSF*P"
+msgstr "PSF*P"
+
+#: modules/process/psf-fit.c:271
+msgid "Fit PSF"
+msgstr "Fit PSF"
+
+#: modules/process/psf-fit.c:289 modules/process/psf.c:286
+msgid "_Ideal response:"
+msgstr "_Ideal response:"
+
+#: modules/process/psf.c:117
+msgid "Point spread function estimation"
+msgstr "Point spread function estimation"
+
+#: modules/process/psf.c:131
+msgid "/_Statistics/_PSF Guess..."
+msgstr "/_Statistics/_PSF Guess..."
+
+#: modules/process/psf.c:135
+msgid "Estimate PSF from known data and image"
+msgstr "Estimate PSF from known data and image"
+
+#: modules/process/psf.c:208
+msgid "PSF*P - I"
+msgstr "PSF*P - I"
+
+#: modules/process/psf.c:231
+msgid "Convolved"
+msgstr "Convolved"
+
+#: modules/process/psf.c:237
+msgid "Estimate PSF"
+msgstr "Estimate PSF"
+
+#: modules/process/psf.c:238
+msgid "_Fit"
+msgstr "_Fit"
+
+#: modules/process/psf.c:295
+msgid "_Display:"
+msgstr "_Display:"
+
+#: modules/process/psf.c:301
+msgid "_Sigma init:"
+msgstr "_Sigma init:"
+
 #: modules/process/rank.c:92
 msgid "Enhances local contrast using a rank transform."
 msgstr "Enhances local contrast using a rank transform."
@@ -12290,7 +12953,7 @@ msgstr "/_Basic Operations/Rotate by _Angle..."
 msgid "Rotate by arbitrary angle"
 msgstr "Rotate by arbitrary angle"
 
-#: modules/process/rotate.c:192
+#: modules/process/rotate.c:192 modules/volume/volume_swaxes.c:651
 msgid "Rotated Data"
 msgstr "Rotated Data"
 
@@ -12346,63 +13009,63 @@ msgstr "Scaled Data"
 msgid "verb|Scale"
 msgstr "Scale"
 
-#: modules/process/scale.c:216
+#: modules/process/scale.c:217
 msgid "Scale by _ratio:"
 msgstr "Scale by _ratio:"
 
-#: modules/process/scale.c:224
+#: modules/process/scale.c:225
 msgid "_proportional"
 msgstr "_proportional"
 
-#: modules/process/scale.c:235
+#: modules/process/scale.c:237
 msgid "New _width:"
 msgstr "New _width:"
 
-#: modules/process/scale.c:243
+#: modules/process/scale.c:246
 msgid "New _height:"
 msgstr "New _height:"
 
-#: modules/process/scars.c:113
+#: modules/process/scars.c:122
 msgid "Marks and/or removes scars (horizontal linear artifacts)."
 msgstr "Marks and/or removes scars (horizontal linear artefacts)."
 
-#: modules/process/scars.c:127
+#: modules/process/scars.c:136
 msgid "/_Correct Data/M_ark Scars..."
 msgstr "/_Correct Data/M_ark Scars..."
 
-#: modules/process/scars.c:131
+#: modules/process/scars.c:140
 msgid "Mark horizontal scars (strokes)"
 msgstr "Mark horizontal scars (strokes)"
 
-#: modules/process/scars.c:134
+#: modules/process/scars.c:143
 msgid "/_Correct Data/Remove _Scars"
 msgstr "/_Correct Data/Remove _Scars"
 
-#: modules/process/scars.c:138
+#: modules/process/scars.c:147
 msgid "Correct horizontal scars (strokes)"
 msgstr "Correct horizontal scars (strokes)"
 
-#: modules/process/scars.c:293
+#: modules/process/scars.c:312
 msgid "Mark Scars"
 msgstr "Mark Scars"
 
-#: modules/process/scars.c:331
+#: modules/process/scars.c:353
 msgid "Maximum _width:"
 msgstr "Maximum _width:"
 
-#: modules/process/scars.c:338
+#: modules/process/scars.c:361
 msgid "Minimum _length:"
 msgstr "Minimum _length:"
 
-#: modules/process/scars.c:345
+#: modules/process/scars.c:369
 msgid "_Hard threshold:"
 msgstr "_Hard threshold:"
 
-#: modules/process/scars.c:353
+#: modules/process/scars.c:377
 msgid "_Soft threshold:"
 msgstr "_Soft threshold:"
 
-#: modules/process/scars.c:361
+#: modules/process/scars.c:385
 msgid "Scars type:"
 msgstr "Scars type:"
 
@@ -12442,27 +13105,27 @@ msgstr "Monte Carlo"
 msgid "_Quality:"
 msgstr "_Quality:"
 
-#: modules/process/shade.c:92
+#: modules/process/shade.c:94
 msgid "Creates a shaded presentation of data."
 msgstr "Creates a shaded presentation of data."
 
-#: modules/process/shade.c:106
+#: modules/process/shade.c:108
 msgid "/_Presentation/_Shading..."
 msgstr "/_Presentation/_Shading..."
 
-#: modules/process/shade.c:110
+#: modules/process/shade.c:112
 msgid "Shade data"
 msgstr "Shade data"
 
-#: modules/process/shade.c:207
+#: modules/process/shade.c:209
 msgid "Shading"
 msgstr "Shading"
 
-#: modules/process/shade.c:253
+#: modules/process/shade.c:260
 msgid "_Mix:"
 msgstr "_Mix:"
 
-#: modules/process/slope_dist.c:161
+#: modules/process/slope_dist.c:160
 msgid ""
 "Calculates one- or two-dimensional distribution of slopes or graph of their "
 "angular distribution."
@@ -12470,82 +13133,131 @@ msgstr ""
 "Calculates one- or two-dimensional distribution of slopes or graph of their "
 "angular distribution."
 
-#: modules/process/slope_dist.c:176
+#: modules/process/slope_dist.c:175
 msgid "/_Statistics/_Slope Distribution..."
 msgstr "/_Statistics/_Slope Distribution..."
 
-#: modules/process/slope_dist.c:180
+#: modules/process/slope_dist.c:179
 msgid "Calculate angular slope distribution"
 msgstr "Calculate angular slope distribution"
 
-#: modules/process/slope_dist.c:221
+#: modules/process/slope_dist.c:220
 msgid "Slope distribution"
 msgstr "Slope distribution"
 
-#: modules/process/slope_dist.c:253
+#: modules/process/slope_dist.c:252
 msgid "_Two-dimensional distribution"
 msgstr "_Two-dimensional distribution"
 
-#: modules/process/slope_dist.c:254
+#: modules/process/slope_dist.c:253
 msgid "Directional (φ) _graph"
 msgstr "Directional (φ) _graph"
 
-#: modules/process/slope_dist.c:255
+#: modules/process/slope_dist.c:254
 msgid "_Inclination (θ) graph"
 msgstr "_Inclination (θ) graph"
 
-#: modules/process/slope_dist.c:256
+#: modules/process/slope_dist.c:255
 msgid "Inclination (gra_dient) graph"
 msgstr "Inclination (gra_dient) graph"
 
-#: modules/process/slope_dist.c:270
+#: modules/process/slope_dist.c:269
 msgid "Slope Distribution"
 msgstr "Slope Distribution"
 
-#: modules/process/slope_dist.c:755
+#: modules/process/slope_dist.c:749
 msgid "Angular Slope Distribution"
 msgstr "Angular Slope Distribution"
 
-#: modules/process/slope_dist.c:763 modules/process/tilt.c:179
+#: modules/process/slope_dist.c:757 modules/process/tilt.c:179
 msgid "Slopes"
 msgstr "Slopes"
 
-#: modules/process/slope_dist.c:824 modules/process/slope_dist.c:893
+#: modules/process/slope_dist.c:818 modules/process/slope_dist.c:887
 msgid "Inclination Distribution"
 msgstr "Inclination Distribution"
 
-#: modules/process/slope_dist.c:832 modules/process/slope_dist.c:901
+#: modules/process/slope_dist.c:826 modules/process/slope_dist.c:895
 msgid "Inclinations"
 msgstr "Inclinations"
 
-#: modules/process/sphere-revolve.c:97
+#: modules/process/sphere-revolve.c:111
 msgid "Subtracts background by arc or sphere revolution."
 msgstr "Subtracts background by arc or sphere revolution."
 
-#: modules/process/sphere-revolve.c:113
+#: modules/process/sphere-revolve.c:125
 msgid "/_Level/Revolve _Arc..."
 msgstr "/_Level/Revolve _Arc..."
 
-#: modules/process/sphere-revolve.c:117
+#: modules/process/sphere-revolve.c:129
 msgid "Level data by arc revolution"
 msgstr "Level data by arc revolution"
 
-#: modules/process/sphere-revolve.c:208 modules/tools/sfunctions.c:371
+#: modules/process/sphere-revolve.c:132
+msgid "/_Level/Revolve _Sphere..."
+msgstr "/_Level/Revolve _Sphere..."
+
+#: modules/process/sphere-revolve.c:136
+msgid "Level data by sphere revolution"
+msgstr "Level data by sphere revolution"
+
+#: modules/process/sphere-revolve.c:303 modules/tools/sfunctions.c:381
 msgid "_Horizontal direction"
 msgstr "_Horizontal direction"
 
-#: modules/process/sphere-revolve.c:209 modules/tools/sfunctions.c:372
+#: modules/process/sphere-revolve.c:304 modules/tools/sfunctions.c:382
 msgid "_Vertical direction"
 msgstr "_Vertical direction"
 
-#: modules/process/sphere-revolve.c:210
+#: modules/process/sphere-revolve.c:305
 msgid "_Both directions"
 msgstr "_Both directions"
 
-#: modules/process/sphere-revolve.c:217
+#: modules/process/sphere-revolve.c:315
+msgid "Revolve Sphere"
+msgstr "Revolve Sphere"
+
+#: modules/process/sphere-revolve.c:315
 msgid "Revolve Arc"
 msgstr "Revolve Arc"
 
+#: modules/process/sphere-revolve.c:355
+msgid "Direction:"
+msgstr "Direction:"
+
+#: modules/process/sphere-revolve.c:699
+msgid "Revolving sphere..."
+msgstr "Revolving sphere..."
+
+#: modules/process/stitch.c:135
+msgid "Stitch multiple images based on offsets of origins."
+msgstr "Stitch multiple images based on offsets of origins."
+
+#: modules/process/stitch.c:149
+msgid "/M_ultidata/_Stitch..."
+msgstr "/M_ultidata/_Stitch..."
+
+#: modules/process/stitch.c:153
+msgid "Stitch images using offsets"
+msgstr "Stitch images using offsets"
+
+#: modules/process/stitch.c:269
+msgid "Stitch"
+msgstr "Stitch"
+
+#: modules/process/stitch.c:312
+msgid "Channels"
+msgstr "Channels"
+
+#: modules/process/stitch.c:435
+msgid "Restore"
+msgstr "Restore"
+
+#: modules/process/stitch.c:445 modules/tools/linestats.c:379
+#: modules/tools/sfunctions.c:440 modules/tools/stats.c:406
+msgid "_Instant updates"
+msgstr "_Instant updates"
+
 #: modules/process/straighten_path.c:126
 msgid "Extracts a straightened part of image along a curve."
 msgstr "Extracts a straightened part of image along a curve."
@@ -12562,28 +13274,28 @@ msgstr "Straighten along a path"
 msgid "Straighten Path"
 msgstr "Straighten Path"
 
-#: modules/process/straighten_path.c:254
+#: modules/process/straighten_path.c:253
 msgid "Res_tore"
 msgstr "Res_tore"
 
-#: modules/process/straighten_path.c:259
+#: modules/process/straighten_path.c:258
 msgid "Re_verse"
 msgstr "Re_verse"
 
 #: modules/process/straighten_path.c:278 modules/tools/pathlevel.c:256
-#: modules/tools/profile.c:507 modules/tools/roughness.c:854
+#: modules/tools/profile.c:503 modules/tools/roughness.c:868
 msgid "_Thickness:"
 msgstr "_Thickness:"
 
-#: modules/process/straighten_path.c:286
+#: modules/process/straighten_path.c:287
 msgid "_Slackness:"
 msgstr "_Slackness:"
 
-#: modules/process/straighten_path.c:292
+#: modules/process/straighten_path.c:293
 msgid "C_losed curve"
 msgstr "C_losed curve"
 
-#: modules/process/straighten_path.c:379
+#: modules/process/straighten_path.c:380
 msgid "Straightened"
 msgstr "Straightened"
 
@@ -12605,52 +13317,52 @@ msgstr "Super resolution of multiple images of same object"
 msgid "Supres"
 msgstr "Supres"
 
-#: modules/process/superresolution.c:421
+#: modules/process/superresolution.c:420
 msgid "Correlating to determine mean shift..."
 msgstr "Correlating to determine mean shift..."
 
-#: modules/process/superresolution.c:511
+#: modules/process/superresolution.c:510
 msgid "Cross-correlation..."
 msgstr "Cross-correlation..."
 
-#: modules/process/superresolution.c:554 modules/xyz/xyz_raster.c:1079
-#: modules/xyz/xyz_raster.c:1119
+#: modules/process/superresolution.c:553 modules/xyz/xyz_raster.c:1053
+#: modules/xyz/xyz_raster.c:1093
 msgid "Interpolating..."
 msgstr "Interpolating..."
 
-#: modules/process/synth.h:343
+#: modules/process/synth.h:344
 msgid "Roundness"
 msgstr "Roundness"
 
-#: modules/process/synth.h:351
+#: modules/process/synth.h:352
 msgid "Roundn_ess:"
 msgstr "Roundn_ess:"
 
-#: modules/process/synth.h:399
+#: modules/process/synth.h:401
 msgid "Orientation"
 msgstr "Orientation"
 
-#: modules/process/synth.h:408
+#: modules/process/synth.h:410
 msgid "Orien_tation:"
 msgstr "Orien_tation:"
 
-#: modules/process/synth.h:432
+#: modules/process/synth.h:436
+msgid "_Truncate:"
+msgstr "_Truncate:"
+
+#: modules/process/synth.h:460
 msgid "Variance:"
 msgstr "Variance:"
 
-#: modules/process/synth.h:456
-msgid "Deformation"
-msgstr "Deformation"
-
-#: modules/process/synth.h:464
+#: modules/process/synth.h:493
 msgid "_Amplitude:"
 msgstr "_Amplitude:"
 
-#: modules/process/synth.h:472
+#: modules/process/synth.h:501
 msgid "_Lateral scale:"
 msgstr "_Lateral scale:"
 
-#: modules/process/synth.h:566
+#: modules/process/synth.h:595
 msgid "Randomi_ze"
 msgstr "Randomi_se"
 
@@ -12666,41 +13378,41 @@ msgstr "/_Basic Operations/Li_mit range..."
 msgid "Limit data range"
 msgstr "Limit data range"
 
-#: modules/process/threshold.c:246
+#: modules/process/threshold.c:241
 msgid "Limit Range"
 msgstr "Limit Range"
 
-#: modules/process/threshold.c:281
+#: modules/process/threshold.c:276
 msgid "Specify _thresholds"
 msgstr "Specify _thresholds"
 
-#: modules/process/threshold.c:283
+#: modules/process/threshold.c:278
 msgid "Use _display range"
 msgstr "Use _display range"
 
-#: modules/process/threshold.c:285
+#: modules/process/threshold.c:280
 msgid "Cut off outlier_s"
 msgstr "Cut off outlier_s"
 
-#: modules/process/threshold.c:294
+#: modules/process/threshold.c:289
 msgid "_Lower:"
 msgstr "_Lower:"
 
-#: modules/process/threshold.c:300
+#: modules/process/threshold.c:295
 msgid "_Upper:"
 msgstr "_Upper:"
 
-#: modules/process/threshold.c:305
+#: modules/process/threshold.c:300
 msgid "Set to _Full Range"
 msgstr "Set to _Full Range"
 
 #. TRANSLATORS: This is a range: 123 to 456.
-#: modules/process/threshold.c:318
+#: modules/process/threshold.c:313
 #, c-format
 msgid "%.*f to %.*f"
 msgstr "%.*f to %.*f"
 
-#: modules/process/threshold.c:341
+#: modules/process/threshold.c:336
 msgid "F_arther than:"
 msgstr "F_arther than:"
 
@@ -12720,11 +13432,11 @@ msgstr "Tilt by specified amount"
 msgid "Tilt"
 msgstr "Tilt"
 
-#: modules/process/tilt.c:185 modules/volume/volume_slice.c:444
+#: modules/process/tilt.c:185 modules/volume/volume_slice.c:446
 msgid "_X:"
 msgstr "_X:"
 
-#: modules/process/tilt.c:194 modules/volume/volume_slice.c:464
+#: modules/process/tilt.c:194 modules/volume/volume_slice.c:469
 msgid "_Y:"
 msgstr "_Y:"
 
@@ -12732,31 +13444,31 @@ msgstr "_Y:"
 msgid "Angles"
 msgstr "Angles"
 
-#: modules/process/tip_blind.c:178
+#: modules/process/tip_blind.c:177
 msgid "Blind estimation of SPM tip using Villarubia's algorithm."
 msgstr "Blind estimation of SPM tip using Villarubia's algorithm."
 
-#: modules/process/tip_blind.c:192
+#: modules/process/tip_blind.c:191
 msgid "/_Tip and Indentation/_Blind Estimation..."
 msgstr "/_Tip and Indentation/_Blind Estimation..."
 
-#: modules/process/tip_blind.c:196
+#: modules/process/tip_blind.c:195
 msgid "Blind tip estimation"
 msgstr "Blind tip estimation"
 
-#: modules/process/tip_blind.c:231
+#: modules/process/tip_blind.c:230
 msgid "Blind Tip Estimation"
 msgstr "Blind Tip Estimation"
 
-#: modules/process/tip_blind.c:232
+#: modules/process/tip_blind.c:231
 msgid "Run _Partial"
 msgstr "Run _Partial"
 
-#: modules/process/tip_blind.c:233
+#: modules/process/tip_blind.c:232
 msgid "Run _Full"
 msgstr "Run _Full"
 
-#: modules/process/tip_blind.c:234
+#: modules/process/tip_blind.c:233
 msgid "_Reset Tip"
 msgstr "_Reset Tip"
 
@@ -12764,77 +13476,77 @@ msgstr "_Reset Tip"
 msgid "Related _data:"
 msgstr "Related _data:"
 
-#: modules/process/tip_blind.c:326
+#: modules/process/tip_blind.c:327
 msgid "Estimated Tip Size"
 msgstr "Estimated Tip Size"
 
-#: modules/process/tip_blind.c:347
+#: modules/process/tip_blind.c:350
 msgid "_Same resolution"
 msgstr "_Same resolution"
 
-#: modules/process/tip_blind.c:366
+#: modules/process/tip_blind.c:376
 msgid "Noise suppression t_hreshold:"
 msgstr "Noise suppression t_hreshold:"
 
-#: modules/process/tip_blind.c:386
+#: modules/process/tip_blind.c:384
 msgid "Use _boundaries"
 msgstr "Use _boundaries"
 
-#: modules/process/tip_blind.c:396
+#: modules/process/tip_blind.c:395
 msgid "Stripes"
 msgstr "Stripes"
 
-#: modules/process/tip_blind.c:402
+#: modules/process/tip_blind.c:401
 msgid "_Split to stripes:"
 msgstr "_Split to stripes:"
 
-#: modules/process/tip_blind.c:416
+#: modules/process/tip_blind.c:412
 msgid "_Preview stripe:"
 msgstr "_Preview stripe:"
 
-#: modules/process/tip_blind.c:423
+#: modules/process/tip_blind.c:420
 msgid "Plot size _graph"
 msgstr "Plot size _graph"
 
-#: modules/process/tip_blind.c:433
+#: modules/process/tip_blind.c:430
 msgid "Create tip i_mages"
 msgstr "Create tip i_mages"
 
 #. TRANSLATORS: Prefix for the progressbar message.
-#: modules/process/tip_blind.c:810
+#: modules/process/tip_blind.c:807
 #, c-format
 msgid "Stripe %u: "
 msgstr "Stripe %u: "
 
-#: modules/process/tip_blind.c:917 modules/process/tip_blind.c:941
+#: modules/process/tip_blind.c:914 modules/process/tip_blind.c:938
 msgid "Estimated tip"
 msgstr "Estimated tip"
 
-#: modules/process/tip_blind.c:1207 modules/process/tip_blind.c:1216
+#: modules/process/tip_blind.c:1204 modules/process/tip_blind.c:1213
 msgid "Tip radius evolution"
 msgstr "Tip radius evolution"
 
-#: modules/process/tip_model.c:114
+#: modules/process/tip_model.c:112
 msgid "Models SPM tip."
 msgstr "Models SPM tip."
 
-#: modules/process/tip_model.c:129
+#: modules/process/tip_model.c:127
 msgid "/_Tip and Indentation/_Model Tip..."
 msgstr "/_Tip and Indentation/_Model Tip..."
 
-#: modules/process/tip_model.c:133
+#: modules/process/tip_model.c:131
 msgid "Model AFM tip"
 msgstr "Model AFM tip"
 
-#: modules/process/tip_model.c:164
+#: modules/process/tip_model.c:162
 msgid "Model Tip"
 msgstr "Model Tip"
 
-#: modules/process/tip_model.c:224
+#: modules/process/tip_model.c:222
 msgid "Tip _type:"
 msgstr "Tip _type:"
 
-#: modules/process/tip_model.c:229
+#: modules/process/tip_model.c:228
 msgid "_Number of sides:"
 msgstr "_Number of sides:"
 
@@ -12846,19 +13558,19 @@ msgstr "Tip _slope:"
 msgid "Tip _rotation:"
 msgstr "Tip _rotation:"
 
-#: modules/process/tip_model.c:250
+#: modules/process/tip_model.c:255
 msgid "Tip _apex radius:"
 msgstr "Tip _apex radius:"
 
-#: modules/process/tip_model.c:269
+#: modules/process/tip_model.c:265
 msgid "Tip _anisotropy:"
 msgstr "Tip _anisotropy:"
 
-#: modules/process/tip_model.c:490
+#: modules/process/tip_model.c:484
 msgid "Modeled tip"
 msgstr "Modelled tip"
 
-#: modules/process/tip_model.c:562
+#: modules/process/tip_model.c:556
 #, c-format
 msgid "Tip resolution: %d × %d pixels"
 msgstr "Tip resolution: %d × %d pixels"
@@ -12967,7 +13679,7 @@ msgid "Converts datafield to 3D volume data."
 msgstr "Converts datafield to 3D volume data."
 
 #: modules/process/volumize.c:56
-msgid "/_Basic Operations/Volumize..."
+msgid "/_Basic Operations/Volumize"
 msgstr "/_Basic Operations/Volumise..."
 
 #: modules/process/volumize.c:60
@@ -13010,73 +13722,77 @@ msgstr "_Z resolution:"
 msgid "Z _range:"
 msgstr "Z _range:"
 
-#: modules/process/wave_synth.c:211
+#: modules/process/wave_synth.c:219
 msgid "Generates various kinds of waves."
 msgstr "Generates various kinds of waves."
 
-#: modules/process/wave_synth.c:225
+#: modules/process/wave_synth.c:233
 msgid "/S_ynthetic/_Waves..."
 msgstr "/S_ynthetic/_Waves..."
 
-#: modules/process/wave_synth.c:229
+#: modules/process/wave_synth.c:237
 msgid "Generate waves"
 msgstr "Generate waves"
 
-#: modules/process/wave_synth.c:347
+#: modules/process/wave_synth.c:366
 msgid "Waves"
 msgstr "Waves"
 
-#: modules/process/wave_synth.c:422 modules/tools/linestats.c:337
-#: modules/tools/sfunctions.c:401 modules/volume/volume_linestat.c:369
+#: modules/process/wave_synth.c:441 modules/tools/linestats.c:337
+#: modules/tools/sfunctions.c:411 modules/volume/volume_linestat.c:374
 msgid "_Quantity:"
 msgstr "_Quantity:"
 
-#: modules/process/wave_synth.c:429
+#: modules/process/wave_synth.c:448
 msgid "_Number of waves:"
 msgstr "_Number of waves:"
 
-#: modules/process/wave_synth.c:436 modules/process/wave_synth.c:582
-#: modules/tools/roughness.c:274
+#: modules/process/wave_synth.c:455 modules/process/wave_synth.c:617
+#: modules/tools/roughness.c:275
 msgid "Amplitude"
 msgstr "Amplitude"
 
-#: modules/process/wave_synth.c:441
+#: modules/process/wave_synth.c:460
 msgid "_Wave form:"
 msgstr "_Wave form:"
 
-#: modules/process/wave_synth.c:448
+#: modules/process/wave_synth.c:467
 msgid "Amplitude:"
 msgstr "Amplitude:"
 
-#: modules/process/wave_synth.c:466
+#: modules/process/wave_synth.c:487
+msgid "_Decay:"
+msgstr "_Decay:"
+
+#: modules/process/wave_synth.c:497
 msgid "Frequency"
 msgstr "Frequency"
 
-#: modules/process/wave_synth.c:472
+#: modules/process/wave_synth.c:503
 msgid "_Spatial frequency:"
 msgstr "_Spatial frequency:"
 
-#: modules/process/wave_synth.c:488
+#: modules/process/wave_synth.c:519
 msgid "_X center:"
 msgstr "_X centre:"
 
-#: modules/process/wave_synth.c:499
+#: modules/process/wave_synth.c:532
 msgid "_Y center:"
 msgstr "_Y centre:"
 
-#: modules/process/wave_synth.c:565
+#: modules/process/wave_synth.c:600
 msgid "Cosine"
 msgstr "Cosine"
 
-#: modules/process/wave_synth.c:566
+#: modules/process/wave_synth.c:601
 msgid "Inverse cosh"
 msgstr "Inverse cosh"
 
-#: modules/process/wave_synth.c:567
+#: modules/process/wave_synth.c:602
 msgid "Flat top"
 msgstr "Flat top"
 
-#: modules/process/wave_synth.c:581
+#: modules/process/wave_synth.c:616
 msgid "Displacement"
 msgstr "Displacement"
 
@@ -13160,39 +13876,39 @@ msgstr "Preprocess image"
 msgid "Preprocess and mark"
 msgstr "Preprocess and mark"
 
-#: modules/process/xydenoise.c:57
+#: modules/process/xydenoise.c:58
 msgid "Denoises measurement on basis of two orthogonal scans."
 msgstr "Denoises measurement on basis of two orthogonal scans."
 
-#: modules/process/xydenoise.c:71
+#: modules/process/xydenoise.c:72
 msgid "/M_ultidata/_XY denoise..."
 msgstr "/M_ultidata/_XY denoise..."
 
-#: modules/process/xydenoise.c:75
+#: modules/process/xydenoise.c:76
 msgid "Denoises horizontal/vertical measurement."
 msgstr "Denoises horizontal/vertical measurement."
 
-#: modules/process/xydenoise.c:102
+#: modules/process/xydenoise.c:103
 msgid "XY Denoising"
 msgstr "XY Denoising"
 
-#: modules/process/xydenoise.c:124
+#: modules/process/xydenoise.c:125
 msgid "Second direction:"
 msgstr "Second direction:"
 
-#: modules/process/xydenoise.c:232
+#: modules/process/xydenoise.c:233
 msgid "Computing forward FFTs..."
 msgstr "Computing forward FFTs..."
 
-#: modules/process/xydenoise.c:248
+#: modules/process/xydenoise.c:249
 msgid "Computing image..."
 msgstr "Computing image..."
 
-#: modules/process/xydenoise.c:260
+#: modules/process/xydenoise.c:261
 msgid "Computing backward FFT..."
 msgstr "Computing backward FFT..."
 
-#: modules/process/xydenoise.c:272
+#: modules/process/xydenoise.c:273
 msgid "Denoised"
 msgstr "Denoised"
 
@@ -13208,63 +13924,67 @@ msgstr "/_Basic Operations/_XYZise..."
 msgid "Convert to XYZ data"
 msgstr "Convert to XYZ data"
 
-#: modules/pygwy/pygwy-console.c:55
+#: modules/pygwy/pygwy-console.c:99
 msgid "/Pygwy Console"
 msgstr "/Pygwy Console"
 
-#: modules/pygwy/pygwy-console.c:59
+#: modules/pygwy/pygwy-console.c:103
 msgid "Python wrapper console"
 msgstr "Python wrapper console"
 
-#: modules/pygwy/pygwy-console.c:142
-msgid ">>> Running the script above\n"
-msgstr ">>> Running the script above\n"
-
-#: modules/pygwy/pygwy-console.c:194
-msgid "Open Python script"
-msgstr "Open Python script"
-
-#: modules/pygwy/pygwy-console.c:275
-msgid "Save Script as"
-msgstr "Save Script as"
-
-#: modules/pygwy/pygwy-console.c:327
+#: modules/pygwy/pygwy-console.c:168 modules/pygwy/pygwy-console.c:481
 msgid "Pygwy Console"
 msgstr "Pygwy Console"
 
-#: modules/pygwy/pygwy-console.c:340
-msgid "Clear Log"
-msgstr "Clear Log"
-
-#: modules/pygwy/pygwy-console.c:344
+#: modules/pygwy/pygwy-console.c:187
 msgid "Open script in Python language (Ctrl-O)"
 msgstr "Open script in Python language (Ctrl-O)"
 
-#: modules/pygwy/pygwy-console.c:346
+#: modules/pygwy/pygwy-console.c:197
 msgid "Save script (Ctrl-S)"
 msgstr "Save script (Ctrl-S)"
 
-#: modules/pygwy/pygwy-console.c:348
+#: modules/pygwy/pygwy-console.c:207
+msgid "Save script as (Ctrl-Shift-S)"
+msgstr "Save script as (Ctrl-Shift-S)"
+
+#: modules/pygwy/pygwy-console.c:217
 msgid "Execute script (Ctrl-E)"
 msgstr "Execute script (Ctrl-E)"
 
-#: modules/pygwy/pygwy-console.c:426
+#: modules/pygwy/pygwy-console.c:227
+msgid "Clear Log"
+msgstr "Clear Log"
+
+#: modules/pygwy/pygwy-console.c:285
 msgid "Command"
 msgstr "Command"
 
-#: pygwy.c:120
+#: modules/pygwy/pygwy-console.c:371
+msgid ">>> Running the script above\n"
+msgstr ">>> Running the script above\n"
+
+#: modules/pygwy/pygwy-console.c:425
+msgid "Save Python Script as"
+msgstr "Save Python Script as"
+
+#: modules/pygwy/pygwy-console.c:429
+msgid "Open Python Script"
+msgstr "Open Python Script"
+
+#: pygwy.c:130
 msgid "Pygwy, the Gwyddion Python wrapper."
 msgstr "Pygwy, the Gwyddion Python wrapper."
 
-#: pygwy.c:258
+#: pygwy.c:269
 msgid "Python Interpreter Errors"
 msgstr "Python Interpreter Errors"
 
-#: pygwy.c:384
+#: pygwy.c:399
 msgid "Python interpreter error occurred."
 msgstr "Python interpreter error occurred."
 
-#: pygwy.c:459
+#: pygwy.c:499
 msgid "Function written in Python"
 msgstr "Function written in Python"
 
@@ -13289,11 +14009,11 @@ msgid "Measure distances and directions between points"
 msgstr "Measure distances and directions between points"
 
 #. TRANSLATORS: Number is verb here.
-#: modules/tools/distance.c:250 modules/tools/profile.c:532
+#: modules/tools/distance.c:250 modules/tools/profile.c:527
 msgid "_Number lines"
 msgstr "_Number lines"
 
-#: modules/tools/filter.c:128
+#: modules/tools/filter.c:129
 msgid ""
 "Filter tool, processes selected part of data with a filter (conservative "
 "denoise, mean, median. Kuwahara, minimum, maximum)."
@@ -13301,27 +14021,27 @@ msgstr ""
 "Filter tool, processes selected part of data with a filter (conservative "
 "denoise, mean, median. Kuwahara, minimum, maximum)."
 
-#: modules/tools/filter.c:171
+#: modules/tools/filter.c:172
 msgid "Basic filters: mean, median, denoise, …"
 msgstr "Basic filters: mean, median, denoise, …"
 
-#: modules/tools/filter.c:239
+#: modules/tools/filter.c:240
 msgid "Conservative denoise"
 msgstr "Conservative denoise"
 
-#: modules/tools/filter.c:246
+#: modules/tools/filter.c:247
 msgid "Kuwahara"
 msgstr "Kuwahara"
 
-#: modules/tools/filter.c:247
+#: modules/tools/filter.c:248
 msgid "Dechecker"
 msgstr "Dechecker"
 
-#: modules/tools/filter.c:248
+#: modules/tools/filter.c:249
 msgid "filter|Gaussian"
 msgstr "Gaussian"
 
-#: modules/tools/filter.c:249
+#: modules/tools/filter.c:250
 msgid "Sharpen"
 msgstr "Sharpen"
 
@@ -13416,7 +14136,7 @@ msgid "Height histogram"
 msgstr "Height histogram"
 
 #: modules/tools/icolorange.c:329 modules/tools/linestats.c:169
-#: modules/tools/sfunctions.c:226 modules/volume/volume_linestat.c:146
+#: modules/tools/sfunctions.c:231 modules/volume/volume_linestat.c:148
 msgid "Range"
 msgstr "Range"
 
@@ -13444,7 +14164,7 @@ msgstr "_Invert Mapping"
 msgid "range|Full"
 msgstr "Full"
 
-#: modules/tools/level3.c:106
+#: modules/tools/level3.c:108
 msgid ""
 "Three-point level tool, levels data by subtracting a plane fitted through "
 "three selected points."
@@ -13452,23 +14172,23 @@ msgstr ""
 "Three-point level tool, levels data by subtracting a plane fitted through "
 "three selected points."
 
-#: modules/tools/level3.c:143
+#: modules/tools/level3.c:145
 msgid "Three Point Level"
 msgstr "Three Point Level"
 
-#: modules/tools/level3.c:144
+#: modules/tools/level3.c:146
 msgid "Level data by fitting a plane through three points"
 msgstr "Level data by fitting a plane through three points"
 
-#: modules/tools/level3.c:239 modules/tools/readvalue.c:375
+#: modules/tools/level3.c:244 modules/tools/readvalue.c:378
 msgid "_Averaging radius:"
 msgstr "_Averaging radius:"
 
-#: modules/tools/level3.c:246
+#: modules/tools/level3.c:251
 msgid "_Instant apply"
 msgstr "_Instant apply"
 
-#: modules/tools/level3.c:255
+#: modules/tools/level3.c:261
 msgid "Set plane to _zero"
 msgstr "Set plane to _zero"
 
@@ -13480,23 +14200,23 @@ msgstr ""
 "Row/column statistical function tool, mean values, medians, maxima, minima, "
 "RMS, ..., of rows or columns."
 
-#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:148
+#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:150
 msgid "tan β<sub>0</sub>"
 msgstr "tan β<sub>0</sub>"
 
-#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:150
+#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:152
 msgid "Ra"
 msgstr "Ra"
 
-#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:151
+#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:153
 msgid "Rq (RMS)"
 msgstr "Rq (RMS)"
 
-#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:152
+#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:154
 msgid "Rz"
 msgstr "Rz"
 
-#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:153
+#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:155
 msgid "Rt"
 msgstr "Rt"
 
@@ -13520,16 +14240,11 @@ msgstr "Co_lumns"
 msgid "Average:"
 msgstr "Average:"
 
-#: modules/tools/linestats.c:363 modules/tools/profile.c:464
-#: modules/tools/sfunctions.c:414 modules/tools/spectro.c:343
+#: modules/tools/linestats.c:363 modules/tools/profile.c:460
+#: modules/tools/sfunctions.c:424 modules/tools/spectro.c:346
 msgid "<b>Options</b>"
 msgstr "<b>Options</b>"
 
-#: modules/tools/linestats.c:379 modules/tools/sfunctions.c:430
-#: modules/tools/stats.c:408
-msgid "_Instant updates"
-msgstr "_Instant updates"
-
 #: modules/tools/maskedit.c:170
 msgid "Mask editor tool, allows interactive modification of parts of the mask."
 msgstr ""
@@ -13587,63 +14302,63 @@ msgstr "Fill continuous empty areas with mask"
 msgid "Erase continuous parts of mask"
 msgstr "Erase continuous parts of mask"
 
-#: modules/tools/maskedit.c:408
+#: modules/tools/maskedit.c:409
 msgid "Editor"
 msgstr "Editor"
 
-#: modules/tools/maskedit.c:413
+#: modules/tools/maskedit.c:414
 msgid "_Shapes"
 msgstr "_Shapes"
 
-#: modules/tools/maskedit.c:423
+#: modules/tools/maskedit.c:428
 msgid "Mode:"
 msgstr "Mode:"
 
-#: modules/tools/maskedit.c:452
+#: modules/tools/maskedit.c:458
 msgid "Shape:"
 msgstr "Shape:"
 
-#: modules/tools/maskedit.c:483
+#: modules/tools/maskedit.c:486
 msgid "_Drawing Tools"
 msgstr "_Drawing Tools"
 
-#: modules/tools/maskedit.c:493
+#: modules/tools/maskedit.c:500
 msgid "Tool:"
 msgstr "Tool:"
 
-#: modules/tools/maskedit.c:532
+#: modules/tools/maskedit.c:538
 msgid "Actions"
 msgstr "Actions"
 
-#: modules/tools/maskedit.c:540
+#: modules/tools/maskedit.c:546
 msgid "_Invert"
 msgstr "_Invert"
 
-#: modules/tools/maskedit.c:571
+#: modules/tools/maskedit.c:577
 msgid "Fill _Voids"
 msgstr "Fill _Voids"
 
-#: modules/tools/maskedit.c:580
+#: modules/tools/maskedit.c:586
 msgid "Fill non-simple-connected"
 msgstr "Fill non-simple-connected"
 
-#: modules/tools/maskedit.c:591
+#: modules/tools/maskedit.c:597
 msgid "Grow/Shrink"
 msgstr "Grow/Shrink"
 
-#: modules/tools/maskedit.c:600
+#: modules/tools/maskedit.c:606
 msgid "_Grow"
 msgstr "_Grow"
 
-#: modules/tools/maskedit.c:608
+#: modules/tools/maskedit.c:614
 msgid "Shrin_k"
 msgstr "Shrin_k"
 
-#: modules/tools/maskedit.c:623
+#: modules/tools/maskedit.c:629
 msgid "_Amount:"
 msgstr "_Amount:"
 
-#: modules/tools/maskedit.c:651
+#: modules/tools/maskedit.c:657
 msgid "_Prevent grain merging by growing"
 msgstr "_Prevent grain merging by growing"
 
@@ -13659,83 +14374,95 @@ msgstr "Path Level"
 msgid "Level rows using intersections with given lines"
 msgstr "Level rows using intersections with given lines"
 
-#: modules/tools/profile.c:222
+#: modules/tools/profile.c:216
 msgid "Profile tool, creates profile graphs from selected lines."
 msgstr "Profile tool, creates profile graphs from selected lines."
 
-#: modules/tools/profile.c:276 modules/tools/profile.c:630
+#: modules/tools/profile.c:270 modules/tools/profile.c:609
 msgid "Profiles"
 msgstr "Profiles"
 
-#: modules/tools/profile.c:277
+#: modules/tools/profile.c:271
 msgid "Extract profiles"
 msgstr "Extract profiles"
 
-#: modules/tools/profile.c:480
-msgid "_Radial profiles"
-msgstr "_Radial profiles"
-
-#: modules/tools/profile.c:493
-msgid "Symmetrize _All"
-msgstr "Symmetrise _All"
+#: modules/tools/profile.c:478
+msgid "Linear profiles"
+msgstr "Linear profiles"
 
-#: modules/tools/profile.c:498
-msgid "S_ymmetrize"
-msgstr "S_ymmetrise"
+#: modules/tools/profile.c:480
+msgid "Radial profiles"
+msgstr "Radial profiles"
 
-#: modules/tools/profile.c:542
+#: modules/tools/profile.c:537
 msgid "_Separate profiles"
 msgstr "_Separate profiles"
 
-#: modules/tools/profile.c:607
+#: modules/tools/profile.c:587
 msgid "_Calibration data:"
 msgstr "_Calibration data:"
 
-#: modules/tools/profile.c:620
+#: modules/tools/profile.c:600
 msgid "_Show profile"
 msgstr "_Show profile"
 
-#: modules/tools/profile.c:887
+#: modules/tools/profile.c:861
 #, c-format
 msgid "X error %d"
 msgstr "X error %d"
 
-#: modules/tools/profile.c:891
+#: modules/tools/profile.c:865
 #, c-format
 msgid "Y error %d"
 msgstr "Y error %d"
 
-#: modules/tools/profile.c:895
+#: modules/tools/profile.c:869
 #, c-format
 msgid "Z error %d"
 msgstr "Z error %d"
 
-#: modules/tools/profile.c:899
+#: modules/tools/profile.c:873
 #, c-format
 msgid "X uncertainty %d"
 msgstr "X uncertainty %d"
 
-#: modules/tools/profile.c:903
+#: modules/tools/profile.c:877
 #, c-format
 msgid "Y uncertainty %d"
 msgstr "Y uncertainty %d"
 
-#: modules/tools/profile.c:907
+#: modules/tools/profile.c:881
 #, c-format
 msgid "Z uncertainty %d"
 msgstr "Z uncertainty %d"
 
-#: modules/tools/profile.c:912
+#: modules/tools/profile.c:886
 #, c-format
 msgid "Zunc up bound %d"
 msgstr "Zunc up bound %d"
 
-#: modules/tools/profile.c:917
+#: modules/tools/profile.c:891
 #, c-format
 msgid "Zunc low bound %d"
 msgstr "Zunc low bound %d"
 
-#: modules/tools/profile.c:1817
+#: modules/tools/profile.c:1637
+msgid "S_ymmetrize"
+msgstr "S_ymmetrise"
+
+#: modules/tools/profile.c:1639
+msgid "Symmetrize _All"
+msgstr "Symmetrise _All"
+
+#: modules/tools/profile.c:1643
+msgid "Improve _Direction"
+msgstr "Improve _Direction"
+
+#: modules/tools/profile.c:1645
+msgid "Improve _All"
+msgstr "Improve _All"
+
+#: modules/tools/profile.c:1866
 msgid "calib-data|None"
 msgstr "None"
 
@@ -13751,194 +14478,194 @@ msgstr "Read Value"
 msgid "Read value under mouse cursor"
 msgstr "Read value under mouse cursor"
 
-#: modules/tools/readvalue.c:304
+#: modules/tools/readvalue.c:307
 msgid "Set _Zero"
 msgstr "Set _Zero"
 
-#: modules/tools/readvalue.c:307
+#: modules/tools/readvalue.c:310
 msgid "Shift plane z=0 to pass through the selected point"
 msgstr "Shift plane z=0 to pass through the selected point"
 
-#: modules/tools/readvalue.c:315
+#: modules/tools/readvalue.c:318
 msgid "Facet"
 msgstr "Facet"
 
-#: modules/tools/readvalue.c:340
+#: modules/tools/readvalue.c:343
 msgid "Curvatures"
 msgstr "Curvatures"
 
-#: modules/tools/readvalue.c:382
+#: modules/tools/readvalue.c:386
 msgid "Show _selection"
 msgstr "Show _selection"
 
-#: modules/tools/roughness.c:282
+#: modules/tools/roughness.c:283
 msgid "Roughness average"
 msgstr "Roughness average"
 
-#: modules/tools/roughness.c:290
+#: modules/tools/roughness.c:291
 msgid "Root mean square roughness"
 msgstr "Root mean square roughness"
 
-#: modules/tools/roughness.c:298
+#: modules/tools/roughness.c:299
 msgid "Maximum height of the roughness"
 msgstr "Maximum height of the roughness"
 
-#: modules/tools/roughness.c:306
+#: modules/tools/roughness.c:307
 msgid "Maximum roughness valley depth"
 msgstr "Maximum roughness valley depth"
 
-#: modules/tools/roughness.c:314
+#: modules/tools/roughness.c:315
 msgid "Maximum roughness peak height"
 msgstr "Maximum roughness peak height"
 
-#: modules/tools/roughness.c:322 modules/tools/roughness.c:370
+#: modules/tools/roughness.c:323 modules/tools/roughness.c:371
 msgid "Average maximum height of the roughness"
 msgstr "Average maximum height of the roughness"
 
-#: modules/tools/roughness.c:330
+#: modules/tools/roughness.c:331
 msgid "Average maximum roughness valley depth"
 msgstr "Average maximum roughness valley depth"
 
-#: modules/tools/roughness.c:338
+#: modules/tools/roughness.c:339
 msgid "Average maximum roughness peak height"
 msgstr "Average maximum roughness peak height"
 
-#: modules/tools/roughness.c:346 modules/tools/roughness.c:354
+#: modules/tools/roughness.c:347 modules/tools/roughness.c:355
 msgid "Average third highest peak to third lowest valley height"
 msgstr "Average third highest peak to third lowest valley height"
 
-#: modules/tools/roughness.c:362
+#: modules/tools/roughness.c:363
 msgid "Average maximum height of the profile"
 msgstr "Average maximum height of the profile"
 
-#: modules/tools/roughness.c:378
+#: modules/tools/roughness.c:379
 msgid "Skewness"
 msgstr "Skewness"
 
-#: modules/tools/roughness.c:394
+#: modules/tools/roughness.c:395
 msgid "Waviness average"
 msgstr "Waviness average"
 
-#: modules/tools/roughness.c:402
+#: modules/tools/roughness.c:403
 msgid "Root mean square waviness"
 msgstr "Root mean square waviness"
 
-#: modules/tools/roughness.c:410
+#: modules/tools/roughness.c:411
 msgid "Waviness maximum height"
 msgstr "Waviness maximum height"
 
-#: modules/tools/roughness.c:418
+#: modules/tools/roughness.c:419
 msgid "Maximum height of the profile"
 msgstr "Maximum height of the profile"
 
-#: modules/tools/roughness.c:426
+#: modules/tools/roughness.c:427
 msgid "Spatial"
 msgstr "Spatial"
 
-#: modules/tools/roughness.c:476
+#: modules/tools/roughness.c:477
 msgid "Average wavelength of the profile"
 msgstr "Average wavelength of the profile"
 
-#: modules/tools/roughness.c:484
+#: modules/tools/roughness.c:485
 msgid "Root mean square (RMS) wavelength of the profile"
 msgstr "Root mean square (RMS) wavelength of the profile"
 
-#: modules/tools/roughness.c:492
+#: modules/tools/roughness.c:493
 msgid "Hybrid"
 msgstr "Hybrid"
 
-#: modules/tools/roughness.c:500
+#: modules/tools/roughness.c:501
 msgid "Average absolute slope"
 msgstr "Average absolute slope"
 
-#: modules/tools/roughness.c:508
+#: modules/tools/roughness.c:509
 msgid "Root mean square (RMS) slope"
 msgstr "Root mean square (RMS) slope"
 
-#: modules/tools/roughness.c:524
+#: modules/tools/roughness.c:525
 msgid "Developed profile length"
 msgstr "Developed profile length"
 
-#: modules/tools/roughness.c:532
+#: modules/tools/roughness.c:533
 msgid "Profile length ratio"
 msgstr "Profile length ratio"
 
-#: modules/tools/roughness.c:615
+#: modules/tools/roughness.c:616
 msgid "Calculate surface profile parameters."
 msgstr "Calculate surface profile parameters."
 
-#: modules/tools/roughness.c:648 modules/tools/roughness.c:773
-#: modules/tools/roughness.c:1452
+#: modules/tools/roughness.c:649 modules/tools/roughness.c:774
+#: modules/tools/roughness.c:1479
 msgid "Roughness"
 msgstr "Roughness"
 
-#: modules/tools/roughness.c:649
+#: modules/tools/roughness.c:650
 msgid "Calculate roughness parameters"
 msgstr "Calculate roughness parameters"
 
-#: modules/tools/roughness.c:771 modules/tools/roughness.c:1450
+#: modules/tools/roughness.c:772 modules/tools/roughness.c:1477
 msgid "Texture"
 msgstr "Texture"
 
-#: modules/tools/roughness.c:772 modules/tools/roughness.c:1451
+#: modules/tools/roughness.c:773 modules/tools/roughness.c:1478
 msgid "Waviness"
 msgstr "Waviness"
 
-#: modules/tools/roughness.c:774
+#: modules/tools/roughness.c:775
 msgid "ADF"
 msgstr "ADF"
 
-#: modules/tools/roughness.c:775
+#: modules/tools/roughness.c:776
 msgid "BRC"
 msgstr "BRC"
 
-#: modules/tools/roughness.c:776 modules/tools/roughness.c:1455
+#: modules/tools/roughness.c:777 modules/tools/roughness.c:1482
 msgid "Peak Count"
 msgstr "Peak Count"
 
-#: modules/tools/roughness.c:838 modules/xyz/xyz_drift.c:1090
+#: modules/tools/roughness.c:839 modules/xyz/xyz_drift.c:1090
 msgid "_Graph:"
 msgstr "_Graph:"
 
-#: modules/tools/roughness.c:845
+#: modules/tools/roughness.c:847
 msgid "C_ut-off:"
 msgstr "C_ut-off:"
 
-#: modules/tools/roughness.c:1324
+#: modules/tools/roughness.c:1345
 msgid "No profile selected."
 msgstr "No profile selected."
 
-#: modules/tools/roughness.c:1453
+#: modules/tools/roughness.c:1480
 msgid "Amplitude Distribution Function"
 msgstr "Amplitude Distribution Function"
 
-#: modules/tools/roughness.c:1454
+#: modules/tools/roughness.c:1481
 msgid "The Bearing Ratio Curve"
 msgstr "The Bearing Ratio Curve"
 
-#: modules/tools/roughness.c:1489
+#: modules/tools/roughness.c:1516
 msgid "Surface Profiles"
 msgstr "Surface Profiles"
 
-#: modules/tools/roughness.c:1877
+#: modules/tools/roughness.c:1904
 msgid "Save Roughness Parameters"
 msgstr "Save Roughness Parameters"
 
-#: modules/tools/roughness.c:1934
+#: modules/tools/roughness.c:1961
 msgid "Roughness Parameters"
 msgstr "Roughness Parameters"
 
-#: modules/tools/roughness.c:1940
+#: modules/tools/roughness.c:1967
 #, c-format
 msgid "File:              %s\n"
 msgstr "File:              %s\n"
 
-#: modules/tools/roughness.c:1944
+#: modules/tools/roughness.c:1971
 #, c-format
 msgid "Data channel:      %s\n"
 msgstr "Data channel:      %s\n"
 
-#: modules/tools/roughness.c:1975
+#: modules/tools/roughness.c:2002
 #, c-format
 msgid ""
 "Selected line:     (%s, %s) to (%s, %s) px\n"
@@ -13975,7 +14702,7 @@ msgstr "to _all files"
 msgid "_Copy"
 msgstr "_Copy"
 
-#: modules/tools/sfunctions.c:181
+#: modules/tools/sfunctions.c:186
 msgid ""
 "Statistical function tool, calculates one-dimensional statistical functions "
 "(height distribution, correlations, PSDF, Minkowski functionals) of selected "
@@ -13985,87 +14712,91 @@ msgstr ""
 "(height distribution, correlations, PSDF, Minkowski functionals) of selected "
 "part of data."
 
-#: modules/tools/sfunctions.c:214
+#: modules/tools/sfunctions.c:219
 msgid "Height distribution"
 msgstr "Height distribution"
 
-#: modules/tools/sfunctions.c:215
+#: modules/tools/sfunctions.c:220
 msgid "Cum. height distribution"
 msgstr "Cum. height distribution"
 
-#: modules/tools/sfunctions.c:216
+#: modules/tools/sfunctions.c:221
 msgid "Distribution of angles"
 msgstr "Distribution of angles"
 
-#: modules/tools/sfunctions.c:217
+#: modules/tools/sfunctions.c:222
 msgid "Cum. distribution of angles"
 msgstr "Cum. distribution of angles"
 
-#: modules/tools/sfunctions.c:218
+#: modules/tools/sfunctions.c:223
 msgid "ACF"
 msgstr "ACF"
 
-#: modules/tools/sfunctions.c:219
+#: modules/tools/sfunctions.c:224
 msgid "HHCF"
 msgstr "HHCF"
 
-#: modules/tools/sfunctions.c:220
+#: modules/tools/sfunctions.c:225
 msgid "PSDF"
 msgstr "PSDF"
 
-#: modules/tools/sfunctions.c:221
+#: modules/tools/sfunctions.c:226
 msgid "Radial PSDF"
 msgstr "Radial PSDF"
 
-#: modules/tools/sfunctions.c:222
+#: modules/tools/sfunctions.c:227
 msgid "Radial ACF"
 msgstr "Radial ACF"
 
-#: modules/tools/sfunctions.c:223
+#: modules/tools/sfunctions.c:228
 msgid "Minkowski volume"
 msgstr "Minkowski volume"
 
-#: modules/tools/sfunctions.c:224
+#: modules/tools/sfunctions.c:229
 msgid "Minkowski boundary"
 msgstr "Minkowski boundary"
 
-#: modules/tools/sfunctions.c:225
+#: modules/tools/sfunctions.c:230
 msgid "Minkowski connectivity"
 msgstr "Minkowski connectivity"
 
-#: modules/tools/sfunctions.c:251
+#: modules/tools/sfunctions.c:232
+msgid "Area scale graph"
+msgstr "Area scale graph"
+
+#: modules/tools/sfunctions.c:257
 msgid "Statistical Functions"
 msgstr "Statistical Functions"
 
-#: modules/tools/sfunctions.c:252
+#: modules/tools/sfunctions.c:258
 msgid "Calculate 1D statistical functions"
 msgstr "Calculate 1D statistical functions"
 
-#: modules/tools/sfunctions.c:504
+#: modules/tools/sfunctions.c:501
 msgid "_Separate uncertainty"
 msgstr "_Separate uncertainty"
 
-#: modules/tools/spectro.c:151
+#: modules/tools/spectro.c:154
 msgid "Point Spectrum, extracts point spectra to a graph."
 msgstr "Point Spectrum, extracts point spectra to a graph."
 
-#: modules/tools/spectro.c:190
+#: modules/tools/spectro.c:193
 msgid "Point Spectroscopy"
 msgstr "Point Spectroscopy"
 
-#: modules/tools/spectro.c:191
+#: modules/tools/spectro.c:194
 msgid "Extract and view point spectroscopy data"
 msgstr "Extract and view point spectroscopy data"
 
-#: modules/tools/spectro.c:359
+#: modules/tools/spectro.c:362
 msgid "_Separate spectra"
 msgstr "_Separate spectra"
 
-#: modules/tools/spectro.c:369
+#: modules/tools/spectro.c:372
 msgid "_Average spectra"
 msgstr "_Average spectra"
 
-#: modules/tools/spectro.c:508
+#: modules/tools/spectro.c:511
 msgid "Spectroscopy"
 msgstr "Spectroscopy"
 
@@ -14105,14 +14836,6 @@ msgstr "No point in the image selected."
 msgid "No area in the zoom selected."
 msgstr "No area in the zoom selected."
 
-#: modules/tools/stats.c:205
-msgid "Average value:"
-msgstr "Average value:"
-
-#: modules/tools/stats.c:206
-msgid "Median:"
-msgstr "Median:"
-
 #: modules/tools/stats.c:207
 msgid "Ra (Sa):"
 msgstr "Ra (Sa):"
@@ -14125,14 +14848,6 @@ msgstr "Rms (Sq):"
 msgid "Rms (grain-wise):"
 msgstr "Rms (grain-wise):"
 
-#: modules/tools/stats.c:210
-msgid "Skew:"
-msgstr "Skew:"
-
-#: modules/tools/stats.c:211
-msgid "Kurtosis:"
-msgstr "Kurtosis:"
-
 #: modules/tools/stats.c:212
 msgid "Surface area:"
 msgstr "Surface area:"
@@ -14141,10 +14856,6 @@ msgstr "Surface area:"
 msgid "Projected area:"
 msgstr "Projected area:"
 
-#: modules/tools/stats.c:214
-msgid "Variation:"
-msgstr "Variation:"
-
 #: modules/tools/stats.c:217
 msgid "Inclination θ:"
 msgstr "Inclination θ:"
@@ -14157,7 +14868,7 @@ msgstr "Inclination φ:"
 msgid "Statistics tool."
 msgstr "Statistics tool."
 
-#: modules/tools/stats.c:261 modules/tools/stats.c:1095
+#: modules/tools/stats.c:261 modules/tools/stats.c:1091
 msgid "Statistical Quantities"
 msgstr "Statistical Quantities"
 
@@ -14165,29 +14876,29 @@ msgstr "Statistical Quantities"
 msgid "Statistical quantities"
 msgstr "Statistical quantities"
 
-#: modules/tools/stats.c:1002
+#: modules/tools/stats.c:998
 msgid "Save Statistical Quantities"
 msgstr "Save Statistical Quantities"
 
-#: modules/tools/stats.c:1100
+#: modules/tools/stats.c:1096
 #, c-format
 msgid "File:         %s\n"
 msgstr "File:         %s\n"
 
-#: modules/tools/stats.c:1104
+#: modules/tools/stats.c:1100
 #, c-format
 msgid "Data channel: %s\n"
 msgstr "Data channel: %s\n"
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "Yes"
 msgstr "Yes"
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "No"
 msgstr "No"
 
-#: modules/tools/stats.c:1132
+#: modules/tools/stats.c:1128
 #, c-format
 msgid ""
 "Selected area: %s × %s at (%s, %s) px\n"
@@ -14210,182 +14921,178 @@ msgstr "/_Dimensions and Units..."
 msgid "Volume Dimensions and Units"
 msgstr "Volume Dimensions and Units"
 
-#: modules/volume/volume_calibrate.c:526
+#: modules/volume/volume_calibrate.c:486
 msgid "_Value range:"
 msgstr "_Value range:"
 
-#: modules/volume/volume_calibrate.c:555
+#: modules/volume/volume_calibrate.c:508
 msgid "Value shi_ft:"
 msgstr "Value shi_ft:"
 
-#: modules/volume/volume_calibrate.c:601
+#: modules/volume/volume_calibrate.c:542
 msgid "_Value calibration factor:"
 msgstr "_Value calibration factor:"
 
-#: modules/volume/volume_extract.c:223
+#: modules/volume/volume_extract.c:216
 msgid "Shows and/or extracts a section of volume data"
 msgstr "Shows and/or extracts a section of volume data"
 
-#: modules/volume/volume_extract.c:237
-msgid "/Show and _extract..."
-msgstr "/Show and _extract..."
+#: modules/volume/volume_extract.c:230
+msgid "/Show and _Extract..."
+msgstr "/Show and _Extract..."
 
-#: modules/volume/volume_extract.c:241
+#: modules/volume/volume_extract.c:234
 msgid "Show and/or extract a section of volume data"
 msgstr "Show and/or extract a section of volume data"
 
-#: modules/volume/volume_extract.c:270
+#: modules/volume/volume_extract.c:263
 msgid "X cross-section"
 msgstr "X cross-section"
 
-#: modules/volume/volume_extract.c:271
+#: modules/volume/volume_extract.c:264
 msgid "Y cross-section"
 msgstr "Y cross-section"
 
-#: modules/volume/volume_extract.c:272
+#: modules/volume/volume_extract.c:265
 msgid "Z cross-section"
 msgstr "Z cross-section"
 
-#: modules/volume/volume_extract.c:273 modules/volume/volume_extract.c:698
+#: modules/volume/volume_extract.c:266 modules/volume/volume_extract.c:684
 msgid "X direction sum"
 msgstr "X direction sum"
 
-#: modules/volume/volume_extract.c:274 modules/volume/volume_extract.c:700
+#: modules/volume/volume_extract.c:267 modules/volume/volume_extract.c:686
 msgid "Y direction sum"
 msgstr "Y direction sum"
 
-#: modules/volume/volume_extract.c:275 modules/volume/volume_extract.c:702
+#: modules/volume/volume_extract.c:268 modules/volume/volume_extract.c:688
 msgid "Z direction sum"
 msgstr "Z direction sum"
 
-#: modules/volume/volume_extract.c:278
+#: modules/volume/volume_extract.c:271
 msgid "X direction"
 msgstr "X direction"
 
-#: modules/volume/volume_extract.c:279
+#: modules/volume/volume_extract.c:272
 msgid "Y direction"
 msgstr "Y direction"
 
-#: modules/volume/volume_extract.c:280
+#: modules/volume/volume_extract.c:273
 msgid "Z direction"
 msgstr "Z direction"
 
-#: modules/volume/volume_extract.c:322
+#: modules/volume/volume_extract.c:315
 msgid "Volume data"
 msgstr "Volume data"
 
-#: modules/volume/volume_extract.c:324
+#: modules/volume/volume_extract.c:317
 msgid "_Load"
 msgstr "_Load"
 
-#: modules/volume/volume_extract.c:336
+#: modules/volume/volume_extract.c:329
 msgid "_Extract projection"
 msgstr "_Extract projection"
 
-#: modules/volume/volume_extract.c:354
+#: modules/volume/volume_extract.c:347
 msgid "Projections"
 msgstr "Projections"
 
-#: modules/volume/volume_extract.c:404
+#: modules/volume/volume_extract.c:395
 msgid "Z position"
 msgstr "Z position"
 
-#: modules/volume/volume_extract.c:409
+#: modules/volume/volume_extract.c:405
 msgid "Shown cut direction:"
 msgstr "Shown cut direction:"
 
-#: modules/volume/volume_extract.c:419 modules/volume/volume_extract.c:500
-msgid "Show mode:"
-msgstr "Show mode:"
-
-#: modules/volume/volume_extract.c:490
+#: modules/volume/volume_extract.c:485
 msgid "Graph cut direction:"
 msgstr "Graph cut direction:"
 
-#: modules/volume/volume_extract.c:525
+#: modules/volume/volume_extract.c:511
 msgid "3D view"
 msgstr "3D view"
 
-#: modules/volume/volume_extract.c:550
+#: modules/volume/volume_extract.c:538
 msgid "Zoom"
 msgstr "Zoom"
 
-#: modules/volume/volume_extract.c:558
+#: modules/volume/volume_extract.c:545
 msgid "Wireframe threshold"
 msgstr "Wireframe threshold"
 
-#: modules/volume/volume_extract.c:566
+#: modules/volume/volume_extract.c:552
 msgid "Z scale"
 msgstr "Z scale"
 
-#: modules/volume/volume_extract.c:574
+#: modules/volume/volume_extract.c:559
 msgid "Opacity scale"
 msgstr "Opacity scale"
 
-#: modules/volume/volume_extract.c:580
-msgid "apply perspective"
-msgstr "apply perspective"
+#: modules/volume/volume_extract.c:565
+msgid "Apply perspective"
+msgstr "Apply perspective"
 
-#: modules/volume/volume_extract.c:589
-msgid "instant 3D render"
-msgstr "instant 3D render"
+#: modules/volume/volume_extract.c:574
+msgid "Instant 3D render"
+msgstr "Instant 3D render"
 
-#: modules/volume/volume_extract.c:598
+#: modules/volume/volume_extract.c:587
 msgid "X view"
 msgstr "X view"
 
-#: modules/volume/volume_extract.c:604
+#: modules/volume/volume_extract.c:592
 msgid "Y view"
 msgstr "Y view"
 
-#: modules/volume/volume_extract.c:610
+#: modules/volume/volume_extract.c:597
 msgid "Z view"
 msgstr "Z view"
 
-#: modules/volume/volume_extract.c:683
+#: modules/volume/volume_extract.c:669
 #, c-format
 msgid "X cross-section at x: %d"
 msgstr "X cross-section at x: %d"
 
-#: modules/volume/volume_extract.c:686
+#: modules/volume/volume_extract.c:672
 #, c-format
 msgid "Y cross-section at y: %d"
 msgstr "Y cross-section at y: %d"
 
-#: modules/volume/volume_extract.c:690
+#: modules/volume/volume_extract.c:676
 #, c-format
 msgid "Z cross-section at Z = %g %s (#%d)"
 msgstr "Z cross-section at Z = %g %s (#%d)"
 
-#: modules/volume/volume_extract.c:749 modules/volume/volume_slice.c:1264
+#: modules/volume/volume_extract.c:735 modules/volume/volume_slice.c:1278
 #, c-format
 msgid "X graph at y: %d z: %d"
 msgstr "X graph at y: %d z: %d"
 
-#: modules/volume/volume_extract.c:752 modules/volume/volume_slice.c:1273
+#: modules/volume/volume_extract.c:738 modules/volume/volume_slice.c:1287
 #, c-format
 msgid "Y graph at x: %d z: %d"
 msgstr "Y graph at x: %d z: %d"
 
-#: modules/volume/volume_extract.c:755 modules/volume/volume_slice.c:1255
+#: modules/volume/volume_extract.c:741 modules/volume/volume_slice.c:1269
 #, c-format
 msgid "Z graph at x: %d y: %d"
 msgstr "Z graph at x: %d y: %d"
 
-#: modules/volume/volume_extract.c:776
+#: modules/volume/volume_extract.c:762
 msgid "Brick graph"
 msgstr "Brick graph"
 
-#: modules/volume/volume_extract.c:1056
+#: modules/volume/volume_extract.c:1042
 msgid "Load volume data"
 msgstr "Load volume data"
 
-#: modules/volume/volume_extract.c:1218
+#: modules/volume/volume_extract.c:1204
 #, c-format
 msgid "Shown range %g to %g"
 msgstr "Shown range %g to %g"
 
-#: modules/volume/volume_extract.c:1911
+#: modules/volume/volume_extract.c:1897
 msgid "Building wireframe model..."
 msgstr "Building wireframe model..."
 
@@ -14394,97 +15101,97 @@ msgid "Evaluate volume force-distance data"
 msgstr "Evaluate volume force-distance data"
 
 #: modules/volume/volume_fdfit.c:213
-msgid "/_Evaluate FD data..."
-msgstr "/_Evaluate FD data..."
+msgid "/_Evaluate FD Data..."
+msgstr "/_Evaluate FD Data..."
 
 #: modules/volume/volume_fdfit.c:217
 msgid "Evaluate force-distance volume data"
 msgstr "Evaluate force-distance volume data"
 
-#: modules/volume/volume_fdfit.c:368
+#: modules/volume/volume_fdfit.c:371
 msgid "Curve _X position:"
 msgstr "Curve _X position:"
 
-#: modules/volume/volume_fdfit.c:386
+#: modules/volume/volume_fdfit.c:380
 msgid "Curve _Y position:"
 msgstr "Curve _Y position:"
 
-#: modules/volume/volume_fdfit.c:535
+#: modules/volume/volume_fdfit.c:511
 msgid "e_stimate"
 msgstr "e_stimate"
 
-#: modules/volume/volume_invert.c:51
+#: modules/volume/volume_invert.c:39 modules/volume/volumeops.c:39
 msgid "Inverts value in volume data"
 msgstr "Inverts value in volume data"
 
-#: modules/volume/volume_invert.c:65
-msgid "/_Invert value"
-msgstr "/_Invert value"
+#: modules/volume/volume_invert.c:53
+msgid "/_Invert Value"
+msgstr "/_Invert Value"
 
-#: modules/volume/volume_invert.c:69
+#: modules/volume/volume_invert.c:57
 msgid "Invert value in volume data"
 msgstr "Invert value in volume data"
 
-#: modules/volume/volume_kmeans.c:94
+#: modules/volume/volume_kmeans.c:95
 msgid "Calculates K-means clustering on volume data."
 msgstr "Calculates K-means clustering on volume data."
 
-#: modules/volume/volume_kmeans.c:108
-msgid "/_K-means clustering..."
-msgstr "/_K-means clustering..."
+#: modules/volume/volume_kmeans.c:109
+msgid "/_K-Means Clustering..."
+msgstr "/_K-Means Clustering..."
 
-#: modules/volume/volume_kmeans.c:112
+#: modules/volume/volume_kmeans.c:113
 msgid "Calculate K-means clustering on volume data"
 msgstr "Calculate K-means clustering on volume data"
 
-#: modules/volume/volume_kmeans.c:151
+#: modules/volume/volume_kmeans.c:152
 msgid "K-means"
 msgstr "K-means"
 
-#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:164
+#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:163
 msgid "_Number of clusters:"
 msgstr "_Number of clusters:"
 
-#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:171
+#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:170
 msgid "Convergence _precision digits:"
 msgstr "Convergence _precision digits:"
 
-#: modules/volume/volume_kmeans.c:184 modules/volume/volume_kmedians.c:178
+#: modules/volume/volume_kmeans.c:183 modules/volume/volume_kmedians.c:176
 msgid "_Max. iterations:"
 msgstr "_Max. iterations:"
 
-#: modules/volume/volume_kmeans.c:189 modules/volume/volume_kmedians.c:183
+#: modules/volume/volume_kmeans.c:187 modules/volume/volume_kmedians.c:181
 msgid "_Normalize"
 msgstr "_Normalise"
 
-#: modules/volume/volume_kmeans.c:195
+#: modules/volume/volume_kmeans.c:193
 msgid "_Remove outliers"
 msgstr "_Remove outliers"
 
-#: modules/volume/volume_kmeans.c:208
+#: modules/volume/volume_kmeans.c:202
 msgid "Outliers _threshold:"
 msgstr "Outliers _threshold:"
 
-#: modules/volume/volume_kmeans.c:431
+#: modules/volume/volume_kmeans.c:425
 msgid "K-means iteration..."
 msgstr "K-means iteration..."
 
-#: modules/volume/volume_kmeans.c:651
+#: modules/volume/volume_kmeans.c:645
 #, c-format
 msgid "K-means cluster of %s"
 msgstr "K-means cluster of %s"
 
-#: modules/volume/volume_kmeans.c:660
+#: modules/volume/volume_kmeans.c:654
 #, c-format
 msgid "K-means error of %s"
 msgstr "K-means error of %s"
 
-#: modules/volume/volume_kmeans.c:670 modules/volume/volume_kmedians.c:514
+#: modules/volume/volume_kmeans.c:664 modules/volume/volume_kmedians.c:512
 #, c-format
 msgid "Pre-normalized intensity of %s"
 msgstr "Pre-normalised intensity of %s"
 
-#: modules/volume/volume_kmeans.c:702
+#: modules/volume/volume_kmeans.c:696
 #, c-format
 msgid "K-means center %d"
 msgstr "K-means centre %d"
@@ -14494,8 +15201,8 @@ msgid "Calculates K-medians clustering on volume data."
 msgstr "Calculates K-medians clustering on volume data."
 
 #: modules/volume/volume_kmedians.c:102
-msgid "/_K-medians clustering..."
-msgstr "/_K-medians clustering..."
+msgid "/_K-Medians Clustering..."
+msgstr "/_K-Medians Clustering..."
 
 #: modules/volume/volume_kmedians.c:106
 msgid "Calculate K-medians clustering on volume data"
@@ -14505,46 +15212,46 @@ msgstr "Calculate K-medians clustering on volume data"
 msgid "K-Medians"
 msgstr "K-Medians"
 
-#: modules/volume/volume_kmedians.c:392
+#: modules/volume/volume_kmedians.c:390
 msgid "K-medians iteration..."
 msgstr "K-medians iteration..."
 
-#: modules/volume/volume_kmedians.c:495
+#: modules/volume/volume_kmedians.c:493
 #, c-format
 msgid "K-medians cluster of %s"
 msgstr "K-medians cluster of %s"
 
-#: modules/volume/volume_kmedians.c:504
+#: modules/volume/volume_kmedians.c:502
 #, c-format
 msgid "K-medians error of %s"
 msgstr "K-medians error of %s"
 
-#: modules/volume/volume_kmedians.c:546
+#: modules/volume/volume_kmedians.c:544
 #, c-format
 msgid "K-medians center %d"
 msgstr "K-medians center %d"
 
-#: modules/volume/volume_linestat.c:171
+#: modules/volume/volume_linestat.c:173
 msgid "Summarizes profiles of volume data to a channel."
 msgstr "Summarises profiles of volume data to a channel."
 
-#: modules/volume/volume_linestat.c:185
+#: modules/volume/volume_linestat.c:187
 msgid "/Summarize _Profiles..."
 msgstr "/Summarise _Profiles..."
 
-#: modules/volume/volume_linestat.c:189
+#: modules/volume/volume_linestat.c:191
 msgid "Summarize profiles"
 msgstr "Summarise profiles"
 
-#: modules/volume/volume_linestat.c:249
+#: modules/volume/volume_linestat.c:251
 msgid "_Extract image"
 msgstr "_Extract image"
 
-#: modules/volume/volume_linestat.c:250
+#: modules/volume/volume_linestat.c:252
 msgid "Set _preview"
 msgstr "Set _preview"
 
-#: modules/volume/volume_linestat.c:284
+#: modules/volume/volume_linestat.c:289
 msgid "Summarize Volume Profiles"
 msgstr "Summarise Volume Profiles"
 
@@ -14568,53 +15275,113 @@ msgstr "Image slice"
 msgid "Line graph"
 msgstr "Line graph"
 
-#: modules/volume/volume_slice.c:290
+#: modules/volume/volume_slice.c:292
 msgid "Slice Volume Data"
 msgstr "Slice Volume Data"
 
-#: modules/volume/volume_slice.c:369
+#: modules/volume/volume_slice.c:371
 msgid "_Base plane:"
 msgstr "_Base plane:"
 
-#: modules/volume/volume_slice.c:420
+#: modules/volume/volume_slice.c:422
 msgid "Extract _multiple items"
 msgstr "Extract _multiple items"
 
-#: modules/volume/volume_slice.c:437
+#: modules/volume/volume_slice.c:439
 msgid "Positions"
 msgstr "Positions"
 
-#: modules/volume/volume_slice.c:484
+#: modules/volume/volume_slice.c:492
 msgid "_Z:"
 msgstr "_Z:"
 
-#: modules/volume/volume_slice.c:1156
+#: modules/volume/volume_slice.c:1167
 #, c-format
 msgid "Z slice at %.*f%s%s (#%d)"
 msgstr "Z slice at %.*f%s%s (#%d)"
 
-#: modules/volume/volume_slice.c:1167
+#: modules/volume/volume_slice.c:1178
 #, c-format
 msgid "Y slice at %.*f%s%s (#%d)"
 msgstr "Y slice at %.*f%s%s (#%d)"
 
-#: modules/volume/volume_slice.c:1178
+#: modules/volume/volume_slice.c:1189
 #, c-format
 msgid "X slice at %.*f%s%s (#%d)"
 msgstr "X slice at %.*f%s%s (#%d)"
 
-#: modules/volume/volume_slice.c:1307
+#: modules/volume/volume_slice.c:1325
 msgid "Volume Z graphs"
 msgstr "Volume Z graphs"
 
-#: modules/volume/volume_slice.c:1314
+#: modules/volume/volume_slice.c:1332
 msgid "Volume X graphs"
 msgstr "Volume X graphs"
 
-#: modules/volume/volume_slice.c:1321
+#: modules/volume/volume_slice.c:1339
 msgid "Volume Y graphs"
 msgstr "Volume Y graphs"
 
+#: modules/volume/volume_swaxes.c:104
+msgid "Swaps axes of volume data."
+msgstr "Swaps axes of volume data."
+
+#: modules/volume/volume_swaxes.c:118
+msgid "/S_wap axes..."
+msgstr "/S_wap axes..."
+
+#: modules/volume/volume_swaxes.c:122
+msgid "Swap axes"
+msgstr "Swap axes"
+
+#: modules/volume/volume_swaxes.c:156
+msgid "X"
+msgstr "X"
+
+#: modules/volume/volume_swaxes.c:157
+msgid "X, reversed"
+msgstr "X, reversed"
+
+#: modules/volume/volume_swaxes.c:158
+msgid "Y"
+msgstr "Y"
+
+#: modules/volume/volume_swaxes.c:159
+msgid "Y, reversed"
+msgstr "Y, reversed"
+
+#: modules/volume/volume_swaxes.c:160
+msgid "Z"
+msgstr "Z"
+
+#: modules/volume/volume_swaxes.c:161
+msgid "Z, reversed"
+msgstr "Z, reversed"
+
+#: modules/volume/volume_swaxes.c:175
+msgid "Swap Volume Axes"
+msgstr "Swap Volume Axes"
+
+#: modules/volume/volume_swaxes.c:196
+msgid "Current _X axis will become:"
+msgstr "Current _X axis will become:"
+
+#: modules/volume/volume_swaxes.c:204
+msgid "Current _Y axis will become:"
+msgstr "Current _Y axis will become:"
+
+#: modules/volume/volume_swaxes.c:212
+msgid "Current _Z axis will become:"
+msgstr "Current _Z axis will become:"
+
+#: modules/volume/volume_swaxes.c:219
+msgid "Create new volume data"
+msgstr "Create new volume data"
+
+#: modules/volume/volume_swaxes.c:286
+msgid "Z axis calibration will be lost."
+msgstr "Z axis calibration will be lost."
+
 #: modules/volume/volume_zcal.c:104
 msgid "Attaches, extracts and removes volume data z-axis calibration."
 msgstr "Attaches, extracts and removes volume data z-axis calibration."
@@ -14684,6 +15451,14 @@ msgstr ""
 "The number of data file values %d\n"
 "differs from the number of planes %d."
 
+#: modules/volume/volumeops.c:53
+msgid "/Extract _Preview"
+msgstr "/Extract _Preview"
+
+#: modules/volume/volumeops.c:57
+msgid "Extract volume data preview to an image"
+msgstr "Extract volume data preview to an image"
+
 #: modules/xyz/xyz_drift.c:267
 msgid "Analyzes drift in XYZ data."
 msgstr "Analyses drift in XYZ data."
@@ -14728,7 +15503,7 @@ msgstr "z-axis drift"
 msgid "Analyze XYZ Drift"
 msgstr "Analyse XYZ Drift"
 
-#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:391
+#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:406
 msgid "Reset Ran_ges"
 msgstr "Reset Ran_ges"
 
@@ -14736,11 +15511,11 @@ msgstr "Reset Ran_ges"
 msgid "_Guess parameters"
 msgstr "_Guess parameters"
 
-#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:570
+#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:539
 msgid "_X-range:"
 msgstr "_X-range:"
 
-#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:592
+#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:561
 msgid "_Y-range:"
 msgstr "_Y-range:"
 
@@ -14818,7 +15593,7 @@ msgstr "No neighbours found"
 msgid "Fitting in progress..."
 msgstr "Fitting in progress..."
 
-#: modules/xyz/xyz_drift.c:2269 modules/xyz/xyz_raster.c:1012
+#: modules/xyz/xyz_drift.c:2264 modules/xyz/xyz_raster.c:981
 msgid "Physical dimensions are invalid."
 msgstr "Physical dimensions are invalid."
 
@@ -14858,39 +15633,39 @@ msgstr "Level XYZ Data"
 msgid "Update X and Y of _all compatible data"
 msgstr "Update X and Y of _all compatible data"
 
-#: modules/xyz/xyz_raster.c:197
+#: modules/xyz/xyz_raster.c:194
 msgid "Rasterizes XYZ data to images."
 msgstr "Rasterises XYZ data to images."
 
-#: modules/xyz/xyz_raster.c:211
+#: modules/xyz/xyz_raster.c:208
 msgid "/_Rasterize..."
 msgstr "/_Rasterise..."
 
-#: modules/xyz/xyz_raster.c:215
+#: modules/xyz/xyz_raster.c:212
 msgid "Rasterize to image"
 msgstr "Rasterise to image"
 
-#: modules/xyz/xyz_raster.c:340
+#: modules/xyz/xyz_raster.c:337
 msgid "Rasterize XYZ Data"
 msgstr "Rasterise XYZ Data"
 
-#: modules/xyz/xyz_raster.c:354
+#: modules/xyz/xyz_raster.c:351
 msgid "Create Image _Directly"
 msgstr "Create Image _Directly"
 
-#: modules/xyz/xyz_raster.c:360
+#: modules/xyz/xyz_raster.c:357
 msgid "XY points form a regular grid so interpolation is not necessary."
 msgstr "XY points form a regular grid so interpolation is not necessary."
 
-#: modules/xyz/xyz_raster.c:381
+#: modules/xyz/xyz_raster.c:392
 msgid "Make Pixels S_quare"
 msgstr "Make Pixels S_quare"
 
-#: modules/xyz/xyz_raster.c:642
+#: modules/xyz/xyz_raster.c:611
 msgid "Field"
 msgstr "Field"
 
-#: modules/xyz/xyz_raster.c:956
+#: modules/xyz/xyz_raster.c:925
 #, c-format
 msgid ""
 "Number of points: %u\n"
@@ -14901,7 +15676,7 @@ msgstr ""
 "Merged as too close: %u\n"
 "Added on the boundaries: %u"
 
-#: modules/xyz/xyz_raster.c:1091
+#: modules/xyz/xyz_raster.c:1065
 msgid ""
 "XYZ data regularization failed due to numerical instability or was "
 "interrupted."
@@ -14909,6 +15684,61 @@ msgstr ""
 "XYZ data regularisation failed due to numerical instability or was "
 "interrupted."
 
+#~ msgid "Re_fine"
+#~ msgstr "Re_fine"
+
+#~ msgid "pixels"
+#~ msgstr "pixels"
+
+#~ msgid "Fast Fourier Transform"
+#~ msgstr "Fast Fourier Transform"
+
+#~ msgid "built-in SimpleFFT\n"
+#~ msgstr "built-in SimpleFFT\n"
+
+#~ msgid "_Like Current Channel"
+#~ msgstr "_Like Current Channel"
+
+#~ msgid "Surface _coverage:"
+#~ msgstr "Surface _coverage:"
+
+#~ msgid "Distribute"
+#~ msgstr "Distribute"
+
+#~ msgid "Replace"
+#~ msgstr "Replace"
+
+#~ msgid "_Fix res.:"
+#~ msgstr "_Fix res.:"
+
+#~ msgid "Reco_mpute"
+#~ msgstr "Reco_mpute"
+
+#~ msgid "Show mode:"
+#~ msgstr "Show mode:"
+
+#, fuzzy
+#~ msgid "Stitch operations on data fields."
+#~ msgstr "Simple arithmetic operations with data fields."
+
+#, fuzzy
+#~ msgid "Stitch operations on data"
+#~ msgstr "Arithmetic operations on data"
+
+#~ msgid "Initializing GUI"
+#~ msgstr "Initialising GUI"
+
+#, fuzzy
+#~ msgid "X offset"
+#~ msgstr "_X offset:"
+
+#, fuzzy
+#~ msgid "Y offset"
+#~ msgstr "_Y offset:"
+
+#~ msgid "Create new channel"
+#~ msgstr "Create new channel"
+
 #~ msgid "Borders extension..."
 #~ msgstr "Borders extension..."
 
diff --git a/po/es.gmo b/po/es.gmo
index a76800e..c96926d 100644
Binary files a/po/es.gmo and b/po/es.gmo differ
diff --git a/po/es.po b/po/es.po
index 2db8791..982276e 100644
--- a/po/es.po
+++ b/po/es.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Gwyddion\n"
 "Report-Msgid-Bugs-To: yeti at gwyddion.net\n"
-"POT-Creation-Date: 2016-11-18 11:05+0100\n"
+"POT-Creation-Date: 2017-08-15 17:48+0200\n"
 "PO-Revision-Date: 2014-09-06 17:28+0200\n"
 "Last-Translator: François RIGUET <francheu at caramail.com>\n"
 "Language-Team: the Gwyddion team <gwyddion.net>\n"
@@ -127,7 +127,8 @@ msgstr ""
 #: app/data-browser-aux.c:1480 app/data-browser.c:2280 app/data-browser.c:2887
 #: app/data-browser.c:3707 app/data-browser.c:3857 app/data-browser.c:4139
 #: app/data-browser.c:4504 app/data-browser.c:4590 app/data-browser.c:5016
-#: app/resource-editor.c:366 modules/process/convolution_filter.c:691
+#: app/resource-editor.c:366 modules/file/xyzexport.c:214
+#: modules/process/convolution_filter.c:691
 msgid "Untitled"
 msgstr "Sin título"
 
@@ -137,99 +138,107 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "anjuta"
-#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1632
+#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1646
 #, fuzzy
 msgid "Fitting..."
 msgstr "Filtro"
 
-#: libgwyddion/gwynlfitpreset.c:1442 libprocess/gwyprocessenums.c:101
-#: libprocess/gwyshapefitpreset.c:347
+#: libgwyddion/gwynlfitpreset.c:1549 libprocess/gwyprocessenums.c:101
+#: libprocess/gwyshapefitpreset.c:347 modules/process/psf-fit.c:157
 msgid "Gaussian"
 msgstr "Gaussiano"
 
-#: libgwyddion/gwynlfitpreset.c:1457
+#: libgwyddion/gwynlfitpreset.c:1564
 msgid "Gaussian (PSDF)"
 msgstr "Gaussiano (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1470
+#: libgwyddion/gwynlfitpreset.c:1577
 msgid "Gaussian (ACF)"
 msgstr "Gaussiano (ACF)"
 
-#: libgwyddion/gwynlfitpreset.c:1483
+#: libgwyddion/gwynlfitpreset.c:1590
 msgid "Gaussian (HHCF)"
 msgstr "Gaussiano (HHCF)"
 
-#: libgwyddion/gwynlfitpreset.c:1496
+#: libgwyddion/gwynlfitpreset.c:1603
 msgid "Gaussian (RPSDF)"
 msgstr "Gaussiano (RPSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1509
+#: libgwyddion/gwynlfitpreset.c:1616
 #, fuzzy
 msgid "Two Gaussians (PSDF)"
 msgstr "Gaussiano (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1524 modules/xyz/xyz_drift.c:841
-#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1819
+#: libgwyddion/gwynlfitpreset.c:1631 modules/xyz/xyz_drift.c:841
+#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1818
 msgid "Exponential"
 msgstr "Exponencial"
 
-#: libgwyddion/gwynlfitpreset.c:1536
+#: libgwyddion/gwynlfitpreset.c:1643
 msgid "Exponential (PSDF)"
 msgstr "Exponencial (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1549
+#: libgwyddion/gwynlfitpreset.c:1656
 msgid "Exponential (ACF)"
 msgstr "Exponencial(ACF)"
 
-#: libgwyddion/gwynlfitpreset.c:1561
+#: libgwyddion/gwynlfitpreset.c:1668
 msgid "Exponential (HHCF)"
 msgstr "Exponencial(HHCF)"
 
-#: libgwyddion/gwynlfitpreset.c:1574
+#: libgwyddion/gwynlfitpreset.c:1681
 msgid "Exponential (RPSDF)"
 msgstr "Exponencial(RPSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1588
+#: libgwyddion/gwynlfitpreset.c:1695
+msgid "K-correlated (PSDF)"
+msgstr ""
+
+#: libgwyddion/gwynlfitpreset.c:1709
 msgid "Polynomial (order 0)"
 msgstr "Polinomial(orden 0)"
 
-#: libgwyddion/gwynlfitpreset.c:1599 modules/xyz/xyz_drift.c:1805
+#: libgwyddion/gwynlfitpreset.c:1720 modules/xyz/xyz_drift.c:1804
 msgid "Polynomial (order 1)"
 msgstr "Polinomial(orden 1)"
 
-#: libgwyddion/gwynlfitpreset.c:1610
+#: libgwyddion/gwynlfitpreset.c:1731
 msgid "Polynomial (order 2)"
 msgstr "Polinomial (orden 2)"
 
-#: libgwyddion/gwynlfitpreset.c:1622
+#: libgwyddion/gwynlfitpreset.c:1743
 msgid "Polynomial (order 3)"
 msgstr "Polinomial(orden 3)"
 
-#: libgwyddion/gwynlfitpreset.c:1635
+#: libgwyddion/gwynlfitpreset.c:1756
 msgid "Square wave"
 msgstr "Onda cuadrada"
 
-#: libgwyddion/gwynlfitpreset.c:1651
+#: libgwyddion/gwynlfitpreset.c:1772
 msgid "Parabolic step"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1667
+#: libgwyddion/gwynlfitpreset.c:1788
 msgid "Smooth slanted step"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1684
+#: libgwyddion/gwynlfitpreset.c:1805
 msgid "Smooth bent step"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1700
+#: libgwyddion/gwynlfitpreset.c:1821
+msgid "Boltzmann bent step"
+msgstr ""
+
+#: libgwyddion/gwynlfitpreset.c:1837
 msgid "Power"
 msgstr "Potenciación"
 
-#: libgwyddion/gwynlfitpreset.c:1712 libprocess/gwyshapefitpreset.c:348
+#: libgwyddion/gwynlfitpreset.c:1849 libprocess/gwyshapefitpreset.c:348
 msgid "Lorentzian"
 msgstr "Lorentziana"
 
-#: libgwyddion/gwynlfitpreset.c:1726
+#: libgwyddion/gwynlfitpreset.c:1863
 msgid "Sinc"
 msgstr "Sinc"
 
@@ -250,7 +259,7 @@ msgid "Step height (positive)"
 msgstr ""
 
 #: libprocess/cdline.c:590 libprocess/cdline.c:599
-#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:170
+#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:163
 msgid "Line"
 msgstr "Línea"
 
@@ -263,7 +272,7 @@ msgid "Circle (down)"
 msgstr ""
 
 #: libprocess/cdline.c:608 libprocess/cdline.c:617
-#: libgwydgets/gwygraphareadialog.c:557 modules/process/hough.c:171
+#: libgwydgets/gwygraphareadialog.c:550 modules/process/hough.c:164
 msgid "Circle"
 msgstr "Círculo"
 
@@ -271,241 +280,241 @@ msgstr "Círculo"
 msgid "Circle (up)"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:64
+#: libprocess/gwygrainvalue.c:62
 msgid "Grain number"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:73 modules/process/curvature.c:129
+#: libprocess/gwygrainvalue.c:71 modules/process/curvature.c:128
 msgid "Center x position"
 msgstr "Centro posición x"
 
-#: libprocess/gwygrainvalue.c:82 modules/process/curvature.c:130
+#: libprocess/gwygrainvalue.c:80 modules/process/curvature.c:129
 msgid "Center y position"
 msgstr "Centro posición y"
 
-#: libprocess/gwygrainvalue.c:91
+#: libprocess/gwygrainvalue.c:89
 msgid "Minimum value"
 msgstr "Valor mínimo"
 
-#: libprocess/gwygrainvalue.c:100
+#: libprocess/gwygrainvalue.c:98
 msgid "Maximum value"
 msgstr "Valor máximo"
 
-#: libprocess/gwygrainvalue.c:109 modules/process/bdep_synth.c:133
-#: modules/tools/filter.c:237
+#: libprocess/gwygrainvalue.c:107 modules/process/bdep_synth.c:133
+#: modules/tools/filter.c:238
 msgid "Mean value"
 msgstr "Valor medio"
 
-#: libprocess/gwygrainvalue.c:118 modules/tools/filter.c:238
+#: libprocess/gwygrainvalue.c:116 modules/tools/filter.c:239
 msgid "Median value"
 msgstr "Valor mediano"
 
-#: libprocess/gwygrainvalue.c:127
+#: libprocess/gwygrainvalue.c:125
 msgid "Minimum value on boundary"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:136
+#: libprocess/gwygrainvalue.c:134
 msgid "Maximum value on boundary"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:145
+#: libprocess/gwygrainvalue.c:143
 msgid "Pixel area"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:154
+#: libprocess/gwygrainvalue.c:152
 msgid "Projected area"
 msgstr "Área proyectada"
 
-#: libprocess/gwygrainvalue.c:163
+#: libprocess/gwygrainvalue.c:161
 msgid "Surface area"
 msgstr "Área de superficie"
 
-#: libprocess/gwygrainvalue.c:172
+#: libprocess/gwygrainvalue.c:170
 msgid "Equivalent square side"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:181
+#: libprocess/gwygrainvalue.c:179
 msgid "Equivalent disc radius"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:190
+#: libprocess/gwygrainvalue.c:188
 msgid "Area above half-height"
 msgstr "Área sobre media-altura"
 
-#: libprocess/gwygrainvalue.c:199
+#: libprocess/gwygrainvalue.c:197
 msgid "Area of convex hull"
 msgstr ""
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to
 #. * zero.
-#: libprocess/gwygrainvalue.c:210
+#: libprocess/gwygrainvalue.c:208
 msgid "Zero basis volume"
 msgstr "Volumen de base cero"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * grain minimum.
-#: libprocess/gwygrainvalue.c:221
+#: libprocess/gwygrainvalue.c:219
 msgid "Grain minimum basis volume"
 msgstr "Volumen base mínimo de grano"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * Laplacian background.
-#: libprocess/gwygrainvalue.c:232
+#: libprocess/gwygrainvalue.c:230
 msgid "Laplacian background basis volume"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:241
+#: libprocess/gwygrainvalue.c:239
 msgid "Projected boundary length"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:250
+#: libprocess/gwygrainvalue.c:248
 msgid "Minimum bounding size"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:259
+#: libprocess/gwygrainvalue.c:257
 msgid "Minimum bounding direction"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:268
+#: libprocess/gwygrainvalue.c:266
 msgid "Maximum bounding size"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:277
+#: libprocess/gwygrainvalue.c:275
 msgid "Maximum bounding direction"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:286
+#: libprocess/gwygrainvalue.c:284
 msgid "Maximum inscribed disc radius"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:295
+#: libprocess/gwygrainvalue.c:293
 msgid "Maximum inscribed disc center x position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:304
+#: libprocess/gwygrainvalue.c:302
 msgid "Maximum inscribed disc center y position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:313
+#: libprocess/gwygrainvalue.c:311
 msgid "Minimum circumcircle radius"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:322
+#: libprocess/gwygrainvalue.c:320
 msgid "Minimum circumcircle center x position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:331
+#: libprocess/gwygrainvalue.c:329
 msgid "Minimum circumcircle center y position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:340
+#: libprocess/gwygrainvalue.c:338
 msgid "Mean radius"
 msgstr "Radio medio"
 
-#: libprocess/gwygrainvalue.c:349 modules/tools/readvalue.c:319
+#: libprocess/gwygrainvalue.c:347 modules/tools/readvalue.c:322
 msgid "Inclination θ"
 msgstr "Inclinación θ"
 
-#: libprocess/gwygrainvalue.c:358 modules/tools/readvalue.c:329
+#: libprocess/gwygrainvalue.c:356 modules/tools/readvalue.c:332
 msgid "Inclination φ"
 msgstr "Inclinación φ"
 
-#: libprocess/gwygrainvalue.c:367
+#: libprocess/gwygrainvalue.c:365
 msgid "Curvature center x position"
 msgstr "Centro de curvatura posición x"
 
-#: libprocess/gwygrainvalue.c:376
+#: libprocess/gwygrainvalue.c:374
 msgid "Curvature center y position"
 msgstr "Centro de curvatura posición y"
 
-#: libprocess/gwygrainvalue.c:385
+#: libprocess/gwygrainvalue.c:383
 msgid "Curvature center z value"
 msgstr "Centro de curvatura valor z"
 
-#: libprocess/gwygrainvalue.c:394 modules/tools/readvalue.c:344
+#: libprocess/gwygrainvalue.c:392 modules/tools/readvalue.c:347
 msgid "Curvature 1"
 msgstr "Curvatura 1"
 
-#: libprocess/gwygrainvalue.c:403 modules/tools/readvalue.c:354
+#: libprocess/gwygrainvalue.c:401 modules/tools/readvalue.c:357
 msgid "Curvature 2"
 msgstr "Curvatura 2"
 
-#: libprocess/gwygrainvalue.c:412
+#: libprocess/gwygrainvalue.c:410
 msgid "Curvature angle 1"
 msgstr "Curvatura ángulo 1"
 
-#: libprocess/gwygrainvalue.c:421
+#: libprocess/gwygrainvalue.c:419
 msgid "Curvature angle 2"
 msgstr "Curvatura ángulo 2"
 
-#: libprocess/gwygrainvalue.c:430
+#: libprocess/gwygrainvalue.c:428
 msgid "Major semiaxis of equivalent ellipse"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:439
+#: libprocess/gwygrainvalue.c:437
 msgid "Minor semiaxis of equivalent ellipse"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:448
+#: libprocess/gwygrainvalue.c:446
 msgid "Orientation of equivalent ellipse"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "advene"
-#: libprocess/gwygrainvalue.c:1120
+#: libprocess/gwygrainvalue.c:1118
 msgid "Id"
 msgstr "Id"
 
-#: libprocess/gwygrainvalue.c:1121 modules/graph/graph_peaks.c:156
-#: modules/process/extract_path.c:391 modules/process/wave_synth.c:482
-#: modules/tools/readvalue.c:251
+#: libprocess/gwygrainvalue.c:1119 modules/graph/graph_peaks.c:154
+#: modules/process/extract_path.c:391 modules/process/wave_synth.c:513
+#: modules/tools/readvalue.c:253
 msgid "Position"
 msgstr "Posición"
 
-#: libprocess/gwygrainvalue.c:1122 app/meta.c:411 modules/file/imgexport.c:4625
-#: modules/process/curvature.c:762 modules/tools/level3.c:468
-#: modules/tools/readvalue.c:286
+#: libprocess/gwygrainvalue.c:1120 app/meta.c:411 modules/file/imgexport.c:4573
+#: modules/process/curvature.c:759 modules/tools/level3.c:475
+#: modules/tools/readvalue.c:290
 msgid "Value"
 msgstr "Valor"
 
-#: libprocess/gwygrainvalue.c:1123
+#: libprocess/gwygrainvalue.c:1121
 msgid "Area"
 msgstr "Área"
 
-#: libprocess/gwygrainvalue.c:1124 app/data-browser.c:5624 app/toolbox.c:110
+#: libprocess/gwygrainvalue.c:1122 app/data-browser.c:5624 app/toolbox.c:115
 msgid "Volume"
 msgstr "Volumen"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "dia"
-#: libprocess/gwygrainvalue.c:1125
+#: libprocess/gwygrainvalue.c:1123
 msgid "Boundary"
 msgstr "Límite"
 
-#: libprocess/gwygrainvalue.c:1126 modules/process/pat_synth.c:829
-#: modules/process/pat_synth.c:1131 modules/process/pat_synth.c:1466
-#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:147
+#: libprocess/gwygrainvalue.c:1124 modules/process/pat_synth.c:830
+#: modules/process/pat_synth.c:1132 modules/process/pat_synth.c:1467
+#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:149
 msgid "Slope"
 msgstr "Rampa"
 
-#: libprocess/gwygrainvalue.c:1127 modules/process/curvature.c:213
-#: modules/process/curvature.c:613
+#: libprocess/gwygrainvalue.c:1125 modules/process/curvature.c:212
+#: modules/process/curvature.c:615
 msgid "Curvature"
 msgstr "Curvatura"
 
-#: libprocess/gwygrainvalue.c:1128
+#: libprocess/gwygrainvalue.c:1126
 msgid "Moment"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:1132
+#: libprocess/gwygrainvalue.c:1130
 msgid "User"
 msgstr "Usuario"
 
-#: libprocess/gwyprocessenums.c:44
+#: libprocess/gwyprocessenums.c:44 modules/process/preview.h:263
 msgid "Union"
 msgstr "Unión"
 
-#: libprocess/gwyprocessenums.c:45
+#: libprocess/gwyprocessenums.c:45 modules/process/preview.h:255
 msgid "Intersection"
 msgstr "Intersección"
 
@@ -584,13 +593,13 @@ msgid "Scale and space adaptive"
 msgstr "Adaptable en en escala y espacio"
 
 #. TRANSLATORS: Interpolation type (AKA nearest neighbour)
-#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3791
-#: modules/xyz/xyz_raster.c:640
+#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3756
+#: modules/xyz/xyz_raster.c:609
 msgid "Round"
 msgstr "Redondo"
 
-#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3792
-#: modules/xyz/xyz_raster.c:641
+#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3757
+#: modules/xyz/xyz_raster.c:610
 msgid "Linear"
 msgstr "Lineal"
 
@@ -678,30 +687,30 @@ msgstr "Incluye solo la región enmascarada"
 msgid "Use entire image (ignore mask)"
 msgstr "Usa la imagen entera (ignora la máscara)"
 
-#: libprocess/gwyprocessenums.c:602
+#: libprocess/gwyprocessenums.c:604
 msgid "distance|City-block"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "celestia"
-#: libprocess/gwyprocessenums.c:603
+#: libprocess/gwyprocessenums.c:605
 #, fuzzy
 msgid "distance|Chess"
 msgstr "Distancia"
 
-#: libprocess/gwyprocessenums.c:604
+#: libprocess/gwyprocessenums.c:606
 msgid "distance|Octagonal 4,8"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:605
+#: libprocess/gwyprocessenums.c:607
 msgid "distance|Octagonal 8,4"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:606
+#: libprocess/gwyprocessenums.c:608
 msgid "distance|Octagonal"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:607
+#: libprocess/gwyprocessenums.c:609
 msgid "distance|Euclidean"
 msgstr ""
 
@@ -742,12 +751,12 @@ msgstr "Paralelo"
 msgid "Ring"
 msgstr ""
 
-#: libprocess/morph_lib.c:169 libprocess/tip.c:1043
+#: libprocess/morph_lib.c:169 libprocess/tip.c:1052
 #, fuzzy
 msgid "Dilation..."
 msgstr "Dilatación"
 
-#: libprocess/morph_lib.c:235 libprocess/tip.c:1164
+#: libprocess/morph_lib.c:235 libprocess/tip.c:1173
 #, fuzzy
 msgid "Erosion..."
 msgstr "Erosión"
@@ -780,90 +789,90 @@ msgid_plural "Found %d internal local maxima"
 msgstr[0] ""
 msgstr[1] ""
 
-#: libprocess/tip.c:422
+#: libprocess/tip.c:431
 #, fuzzy
 msgid "Pyramid"
 msgstr "Pirámide"
 
-#: libprocess/tip.c:423 libprocess/tip.c:429 libprocess/tip.c:435
+#: libprocess/tip.c:432 libprocess/tip.c:438 libprocess/tip.c:444
 msgid "Pyramidal"
 msgstr "Piramidal"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "almanah"
-#: libprocess/tip.c:428
+#: libprocess/tip.c:437
 msgid "Contact"
 msgstr "Contacto"
 
-#: libprocess/tip.c:434
+#: libprocess/tip.c:443
 msgid "Noncontact"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
-#: libprocess/tip.c:440
+#: libprocess/tip.c:449
 msgid "Delta function"
 msgstr "Función Delta"
 
-#: libprocess/tip.c:441
+#: libprocess/tip.c:450
 msgid "Analytical"
 msgstr ""
 
-#: libprocess/tip.c:446
+#: libprocess/tip.c:455 modules/process/fibre_synth.c:259
 #, fuzzy
 msgid "Parabola"
 msgstr "Paralelo"
 
-#: libprocess/tip.c:447 libprocess/tip.c:453
+#: libprocess/tip.c:456 libprocess/tip.c:462
 #, fuzzy
 msgid "Symmetric"
 msgstr "Simétrico"
 
-#: libprocess/tip.c:452
+#: libprocess/tip.c:461
 #, fuzzy
 msgid "Cone"
 msgstr "Conos"
 
-#: libprocess/tip.c:458
+#: libprocess/tip.c:467
 msgid "Elliptical parabola"
 msgstr ""
 
-#: libprocess/tip.c:459
+#: libprocess/tip.c:468
 #, fuzzy
 msgid "Asymmetric"
 msgstr "Simétrico"
 
-#: libprocess/tip.c:1339 libprocess/tip.c:1367 libprocess/tip.c:1416
-#: libprocess/tip.c:1443
+#: libprocess/tip.c:1348 libprocess/tip.c:1376 libprocess/tip.c:1425
+#: libprocess/tip.c:1452
 msgid "Converting fields"
 msgstr ""
 
-#: libprocess/tip.c:1349
+#: libprocess/tip.c:1358
 msgid "Starting partial estimation"
 msgstr ""
 
-#: libprocess/tip.c:1426
+#: libprocess/tip.c:1435
 msgid "Starting full estimation"
 msgstr ""
 
-#: libprocess/triangulation.c:2085 modules/process/calcoefs_view.c:793
+#: libprocess/triangulation.c:2084 modules/process/calcoefs_view.c:793
 #: modules/process/lat_synth.c:1178
 msgid "Triangulating..."
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:570
+#: libgwydgets/gwy3dwindow.c:575
 msgid "Rotate view (R)"
 msgstr "Rotar vista (R)"
 
-#: libgwydgets/gwy3dwindow.c:575
+#: libgwydgets/gwy3dwindow.c:580
 msgid "Scale view as a whole (S)"
 msgstr "Usar escala de la vista al completo (S)"
 
-#: libgwydgets/gwy3dwindow.c:580
+#: libgwydgets/gwy3dwindow.c:585
 msgid "Scale value range (V)"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:585
+#: libgwydgets/gwy3dwindow.c:590
 msgid "Move light source (L)"
 msgstr ""
 
@@ -871,249 +880,312 @@ msgstr ""
 msgid "Show full controls"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:693
+#: libgwydgets/gwy3dwindow.c:691
 msgid "Hide full controls"
 msgstr "Esconder controles completos"
 
-#: libgwydgets/gwy3dwindow.c:709 modules/file/imgexport.c:4796
-#: modules/process/fit-shape.c:461
+#: libgwydgets/gwy3dwindow.c:707 modules/file/imgexport.c:4745
+#: modules/process/fit-shape.c:462
 msgid "adjective|Basic"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:714
+#: libgwydgets/gwy3dwindow.c:712
 msgid "Light & Material"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:719
+#: libgwydgets/gwy3dwindow.c:717
 msgid "Labels"
 msgstr "Etiquetas"
 
-#: libgwydgets/gwy3dwindow.c:828 modules/process/facet_analysis.c:331
-#: modules/process/facet_analysis.c:347 modules/process/shade.c:245
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "abiword"
+#: libgwydgets/gwy3dwindow.c:722
+#, fuzzy
+msgid "Colorbar"
+msgstr "Color"
+
+#: libgwydgets/gwy3dwindow.c:838 modules/process/facet_analysis.c:335
+#: modules/process/facet_analysis.c:351 modules/process/shade.c:253
 #: modules/process/tilt.c:223
 msgid "φ:"
 msgstr "φ:"
 
-#: libgwydgets/gwy3dwindow.c:828 libgwydgets/gwy3dwindow.c:834
-#: libgwydgets/gwy3dwindow.c:1032 libgwydgets/gwy3dwindow.c:1040
-#: modules/process/facet_analysis.c:375 modules/process/indent_analyze.c:460
-#: modules/process/rotate.c:264 modules/process/shade.c:237
-#: modules/process/shade.c:245 modules/process/tilt.c:211
-#: modules/process/tilt.c:223 modules/process/tip_model.c:234
-#: modules/process/tip_model.c:240 modules/process/unrotate.c:334
+#: libgwydgets/gwy3dwindow.c:838 libgwydgets/gwy3dwindow.c:843
+#: libgwydgets/gwy3dwindow.c:1013 libgwydgets/gwy3dwindow.c:1020
+#: modules/process/correct_affine.c:461 modules/process/facet_analysis.c:238
+#: modules/process/facet_analysis.c:370 modules/process/indent_analyze.c:438
+#: modules/process/measure_lattice.c:381 modules/process/rotate.c:264
+#: modules/process/shade.c:245 modules/process/shade.c:253
+#: modules/process/synth.h:379 modules/process/synth.h:410
+#: modules/process/tilt.c:211 modules/process/tilt.c:223
+#: modules/process/tip_model.c:234 modules/process/tip_model.c:240
+#: modules/process/unrotate.c:334 modules/tools/distance.c:197
+#: modules/tools/readvalue.c:223 modules/tools/stats.c:319
 msgid "deg"
 msgstr "grad"
 
-#: libgwydgets/gwy3dwindow.c:834 modules/process/facet_analysis.c:330
-#: modules/process/facet_analysis.c:346 modules/process/shade.c:237
+#: libgwydgets/gwy3dwindow.c:843 modules/process/facet_analysis.c:334
+#: modules/process/facet_analysis.c:350 modules/process/shade.c:245
 #: modules/process/tilt.c:211
 msgid "θ:"
 msgstr "θ:"
 
-#: libgwydgets/gwy3dwindow.c:839 modules/process/cwt.c:151
+#: libgwydgets/gwy3dwindow.c:849 modules/process/cwt.c:151
 msgid "_Scale:"
 msgstr "E_scala:"
 
-#: libgwydgets/gwy3dwindow.c:846
+#: libgwydgets/gwy3dwindow.c:856
 msgid "_Value scale:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:851
+#: libgwydgets/gwy3dwindow.c:862
 msgid "Ph_ysical scale:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:865
+#: libgwydgets/gwy3dwindow.c:876
 msgid "verb|Set"
 msgstr "Ajustar"
 
-#: libgwydgets/gwy3dwindow.c:877
+#: libgwydgets/gwy3dwindow.c:886
 #, fuzzy
 msgid "Line _width:"
 msgstr "Nueva _anchura:"
 
-#: libgwydgets/gwy3dwindow.c:881
+#: libgwydgets/gwy3dwindow.c:886 libgwydgets/gwy3dwindow.c:1194
+#: libgwydgets/gwy3dwindow.c:1204 libgwydgets/gwy3dwindow.c:1235
+#: libgwydgets/gwygraphareadialog.c:157 libgwydgets/gwygraphareadialog.c:173
+#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
+#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
+#: modules/process/angle_dist.c:188 modules/process/angle_dist.c:213
+#: modules/process/col_synth.c:486 modules/process/crosscor.c:252
+#: modules/process/crosscor.c:260 modules/process/crosscor.c:276
+#: modules/process/crosscor.c:284 modules/process/crosscor.c:300
+#: modules/process/crosscor.c:308 modules/process/cwt.c:151
+#: modules/process/dimensions.h:88 modules/process/edge.c:672
+#: modules/process/entropy.c:242 modules/process/extend.c:220
+#: modules/process/extend.c:227 modules/process/extend.c:234
+#: modules/process/extend.c:241 modules/process/facet_analysis.c:362
+#: modules/process/fbm_synth.c:383 modules/process/hough.c:203
+#: modules/process/local_contrast.c:146 modules/process/mark_disconn.c:263
+#: modules/process/mask_morph.c:237 modules/process/median-bg.c:209
+#: modules/process/neural.c:623 modules/process/neural.c:631
+#: modules/process/psdf_logphi.c:276 modules/process/rank.c:188
+#: modules/process/scale.c:237 modules/process/scale.c:246
+#: modules/process/scars.c:353 modules/process/scars.c:361
+#: modules/process/semsim.c:227 modules/process/slope_dist.c:365
+#: modules/process/slope_dist.c:393 modules/process/sphere-revolve.c:346
+#: modules/process/straighten_path.c:278 modules/process/synth.h:280
+#: modules/process/synth.h:501 modules/process/tip_blind.c:334
+#: modules/process/tip_blind.c:342 modules/process/volumize_layers.c:240
+#: modules/process/volumize_layers.c:245 modules/process/volumize_layers.c:250
+#: modules/process/wpour_mark.c:320 modules/tools/filter.c:291
+#: modules/tools/level3.c:244 modules/tools/maskedit.c:528
+#: modules/tools/maskedit.c:629 modules/tools/pathlevel.c:256
+#: modules/tools/profile.c:377 modules/tools/profile.c:503
+#: modules/tools/readvalue.c:222 modules/tools/readvalue.c:378
+#: modules/tools/roughness.c:868 modules/volume/volume_slice.c:446
+#: modules/volume/volume_slice.c:469 modules/volume/volume_slice.c:492
+#: modules/xyz/xyz_drift.c:738 modules/xyz/xyz_drift.c:753
+#: modules/xyz/xyz_raster.c:382 modules/xyz/xyz_raster.c:388
+msgid "px"
+msgstr "px"
+
+#: libgwydgets/gwy3dwindow.c:891
 msgid "Show _axes"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "xfce4-sensors-plugin"
-#: libgwydgets/gwy3dwindow.c:890
+#: libgwydgets/gwy3dwindow.c:900
 msgid "Show _labels"
 msgstr "Mostrar _etiquetas"
 
-#: libgwydgets/gwy3dwindow.c:899
-msgid "Show false _colorbar"
-msgstr ""
-
-#: libgwydgets/gwy3dwindow.c:908
+#: libgwydgets/gwy3dwindow.c:909
 #, fuzzy
 msgid "_Orthographic projection"
 msgstr "Proyección _ortográfica"
 
-#: libgwydgets/gwy3dwindow.c:917
+#: libgwydgets/gwy3dwindow.c:918
 msgid "_Hide masked"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:933
+#: libgwydgets/gwy3dwindow.c:934
 msgid "_Lighting"
 msgstr "_Iluminación:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
-#: libgwydgets/gwy3dwindow.c:934
+#: libgwydgets/gwy3dwindow.c:935
 msgid "_Gradient"
 msgstr "_Degradado"
 
-#: libgwydgets/gwy3dwindow.c:935
+#: libgwydgets/gwy3dwindow.c:936
 msgid "_Overlay"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:936
+#: libgwydgets/gwy3dwindow.c:937
 msgid "_Overlay - no light"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1009
+#: libgwydgets/gwy3dwindow.c:992
 msgid "_Material:"
 msgstr "_Material:"
 
-#: libgwydgets/gwy3dwindow.c:1032
+#: libgwydgets/gwy3dwindow.c:1013
 msgid "_Light φ:"
 msgstr "_Luz φ:"
 
-#: libgwydgets/gwy3dwindow.c:1040
+#: libgwydgets/gwy3dwindow.c:1020
 msgid "L_ight θ:"
 msgstr "L_uz θ:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "aisleriot"
-#: libgwydgets/gwy3dwindow.c:1070 libgwydgets/gwy3dwindow.c:1240
-#: app/toolbox-editor.c:215 modules/file/hdrimage.cc:2213
-#: modules/file/imgexport.c:4760 modules/file/pixmap.c:789
+#: libgwydgets/gwy3dwindow.c:1052 libgwydgets/gwy3dwindow.c:1243
+#: app/toolbox-editor.c:216 modules/file/hdrimage.cc:2213
+#: modules/file/imgexport.c:4708 modules/file/pixmap.c:789
 #: modules/file/rawfile.c:424 modules/process/angle_dist.c:172
 #: modules/process/bdep_synth.c:341 modules/process/calcoefs_new.c:371
-#: modules/process/calibrate.c:391 modules/process/col_synth.c:392
-#: modules/process/correct_affine.c:301 modules/process/curvature.c:615
-#: modules/process/cwt.c:135 modules/process/deposit_synth.c:349
+#: modules/process/calibrate.c:383 modules/process/col_synth.c:392
+#: modules/process/correct_affine.c:346 modules/process/curvature.c:617
+#: modules/process/cwt.c:135 modules/process/deposit_synth.c:350
 #: modules/process/diff_synth.c:411 modules/process/domain_synth.c:354
 #: modules/process/drift.c:245 modules/process/dwt.c:166
 #: modules/process/dwtanisotropy.c:184 modules/process/edge.c:638
 #: modules/process/extend.c:192 modules/process/facet-level.c:193
-#: modules/process/facet_analysis.c:271 modules/process/fbm_synth.c:303
+#: modules/process/facet_analysis.c:275 modules/process/fbm_synth.c:303
 #: modules/process/fft.c:336 modules/process/fft_filter_2d.c:417
-#: modules/process/fft_synth.c:341 modules/process/fractal.c:231
-#: modules/process/grain_edge.c:213 modules/process/grain_mark.c:247
-#: modules/process/grain_wshed.c:167 modules/process/hough.c:179
-#: modules/process/lat_synth.c:567 modules/process/latsim.c:159
-#: modules/process/level.c:245 modules/process/linematch.c:804
-#: modules/process/lno_synth.c:433 modules/process/local_contrast.c:130
-#: modules/process/logistic.c:234 modules/process/mark_disconn.c:208
-#: modules/process/mask_distribute.c:152 modules/process/measure_lattice.c:256
-#: modules/process/median-bg.c:180 modules/process/noise_synth.c:336
-#: modules/process/obj_synth.c:441 modules/process/pat_synth.c:385
-#: modules/process/pid.c:199 modules/process/polydistort.c:210
-#: modules/process/polylevel.c:373 modules/process/psdf_logphi.c:249
-#: modules/process/rank.c:158 modules/process/rotate.c:243
-#: modules/process/scale.c:196 modules/process/scars.c:298
-#: modules/process/semsim.c:211 modules/process/shade.c:208
-#: modules/process/slope_dist.c:276 modules/process/sphere-revolve.c:218
-#: modules/process/straighten_path.c:249 modules/process/tilt.c:161
-#: modules/process/tip_model.c:169 modules/process/unrotate.c:220
-#: modules/process/volumize_layers.c:221 modules/process/wave_synth.c:349
-#: modules/process/wpour_mark.c:278 modules/volume/volume_calibrate.c:370
-#: modules/volume/volume_extract.c:331 modules/volume/volume_kmeans.c:153
-#: modules/volume/volume_kmedians.c:147 modules/volume/volume_linestat.c:292
-#: modules/volume/volume_slice.c:292
+#: modules/process/fft_synth.c:341 modules/process/fibre_synth.c:422
+#: modules/process/fractal.c:228 modules/process/grain_edge.c:212
+#: modules/process/grain_mark.c:246 modules/process/grain_wshed.c:168
+#: modules/process/hough.c:174 modules/process/lat_synth.c:567
+#: modules/process/latsim.c:159 modules/process/level.c:245
+#: modules/process/linematch.c:771 modules/process/lno_synth.c:431
+#: modules/process/local_contrast.c:130 modules/process/logistic.c:234
+#: modules/process/mark_disconn.c:208 modules/process/mask_distribute.c:152
+#: modules/process/measure_lattice.c:246 modules/process/median-bg.c:180
+#: modules/process/mfm_current.c:332 modules/process/mfm_field.c:281
+#: modules/process/mfm_findshift.c:230 modules/process/mfm_parallel.c:333
+#: modules/process/mfm_shift.c:170 modules/process/noise_synth.c:334
+#: modules/process/obj_synth.c:438 modules/process/pat_synth.c:385
+#: modules/process/phase_synth.c:205 modules/process/pid.c:197
+#: modules/process/polydistort.c:210 modules/process/polylevel.c:373
+#: modules/process/psdf_logphi.c:249 modules/process/rank.c:158
+#: modules/process/rotate.c:243 modules/process/scale.c:196
+#: modules/process/scars.c:317 modules/process/semsim.c:211
+#: modules/process/shade.c:210 modules/process/slope_dist.c:275
+#: modules/process/sphere-revolve.c:317 modules/process/straighten_path.c:248
+#: modules/process/tilt.c:161 modules/process/tip_model.c:167
+#: modules/process/unrotate.c:220 modules/process/volumize_layers.c:221
+#: modules/process/wave_synth.c:368 modules/process/wpour_mark.c:278
+#: modules/volume/volume_calibrate.c:370 modules/volume/volume_extract.c:324
+#: modules/volume/volume_kmeans.c:154 modules/volume/volume_kmedians.c:147
+#: modules/volume/volume_linestat.c:297 modules/volume/volume_slice.c:294
 msgid "_Reset"
 msgstr "_Reiniciar"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gretl"
-#: libgwydgets/gwy3dwindow.c:1142
+#: libgwydgets/gwy3dwindow.c:1141
 msgid "X-axis"
 msgstr "eje X"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gretl"
-#: libgwydgets/gwy3dwindow.c:1143
+#: libgwydgets/gwy3dwindow.c:1142
 msgid "Y-axis"
 msgstr "eje Y"
 
-#: libgwydgets/gwy3dwindow.c:1144
+#: libgwydgets/gwy3dwindow.c:1143
 msgid "Minimum z value"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1145
+#: libgwydgets/gwy3dwindow.c:1144
 msgid "Maximum z value"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "plugin_htmlbar"
-#: libgwydgets/gwy3dwindow.c:1168 modules/file/imgexport.c:3836
+#: libgwydgets/gwy3dwindow.c:1167 modules/file/imgexport.c:3806
 msgid "_Label:"
 msgstr "E_tiqueta:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "drivel"
-#: libgwydgets/gwy3dwindow.c:1173
+#: libgwydgets/gwy3dwindow.c:1180
 msgid "_Text:"
 msgstr "_Texto:"
 
-#: libgwydgets/gwy3dwindow.c:1193
+#: libgwydgets/gwy3dwindow.c:1185
 msgid "Move label"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1202
+#: libgwydgets/gwy3dwindow.c:1194
 msgid "_Horizontally:"
 msgstr "_Horizontalmente:"
 
-#: libgwydgets/gwy3dwindow.c:1212
+#: libgwydgets/gwy3dwindow.c:1204
 msgid "_Vertically:"
 msgstr "_Verticalmente:"
 
-#: libgwydgets/gwy3dwindow.c:1220
+#: libgwydgets/gwy3dwindow.c:1212
+msgid "A_ll labels have the same size"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:1223
 msgid "Scale size _automatically"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "plugin_htmlbar"
-#: libgwydgets/gwy3dwindow.c:1232 modules/tools/filter.c:290
+#: libgwydgets/gwy3dwindow.c:1235 modules/tools/filter.c:291
 msgid "Si_ze:"
 msgstr "_Tamaño:"
 
+#: libgwydgets/gwy3dwindow.c:1277
+msgid "Show false _colorbar"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:1286
+msgid "Reserve space for _colorbar"
+msgstr ""
+
 # Translation for this string generated by http://littlesvr.ca/ostd/
-# based on translation from "avant-window-navigator"
-#: libgwydgets/gwy3dwindow.c:1232 modules/process/cwt.c:151
-#: modules/process/hough.c:212
-msgid "pixels"
-msgstr "píxeles"
+# based on translation from "control-center"
+#: libgwydgets/gwy3dwindow.c:1302 modules/process/lat_synth.c:651
+#: modules/process/obj_synth.c:542 modules/process/pat_synth.c:1458
+#: modules/process/phase_synth.c:279
+msgid "_Size:"
+msgstr "_Tamaño:"
+
+#: libgwydgets/gwy3dwindow.c:1311
+#, fuzzy
+msgid "_Vertical alignment:"
+msgstr "_Verticalmente:"
 
-#: libgwydgets/gwy3dwindow.c:1726 libgwydgets/gwy3dwindow.c:1779
+#: libgwydgets/gwy3dwindow.c:1844 libgwydgets/gwy3dwindow.c:1897
 msgid "S_witch to Lighting Mode"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1734 libgwydgets/gwy3dwindow.c:1756
+#: libgwydgets/gwy3dwindow.c:1852 libgwydgets/gwy3dwindow.c:1874
 msgid "S_witch to Overlay Mode"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1748 libgwydgets/gwy3dwindow.c:1771
+#: libgwydgets/gwy3dwindow.c:1866 libgwydgets/gwy3dwindow.c:1889
 msgid "S_witch to Color Gradient Mode"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1787
+#: libgwydgets/gwy3dwindow.c:1905
 msgid "T_oggle light"
 msgstr ""
 
-#: libgwydgets/gwyaxisdialog.c:99
+#: libgwydgets/gwyaxisdialog.c:75
 msgid "Axis Properties"
 msgstr ""
 
-#: libgwydgets/gwyaxisdialog.c:101 libgwydgets/gwygraphlabeldialog.c:63
-msgid "Label Properties"
-msgstr ""
-
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "e17"
-#: libgwydgets/gwyaxisdialog.c:184
+#: libgwydgets/gwyaxisdialog.c:88
 msgid "Label Text"
 msgstr "Etiqueta de texto"
 
@@ -1141,7 +1213,7 @@ msgid "Hidden"
 msgstr "Oculto"
 
 #: libgwydgets/gwydgetenums.c:47 libgwydgets/gwygraphwindowmeasuredialog.c:572
-#: modules/file/imgexport.c:475 modules/tools/selectionmanager.c:274
+#: modules/file/imgexport.c:474 modules/tools/selectionmanager.c:274
 msgid "Points"
 msgstr "Puntos"
 
@@ -1149,7 +1221,7 @@ msgstr "Puntos"
 msgid "Line + points"
 msgstr "Líneas + puntos"
 
-#: libgwydgets/gwydgetutils.c:564
+#: libgwydgets/gwydgetutils.c:848
 msgid "Change Mask Color"
 msgstr ""
 
@@ -1162,7 +1234,7 @@ msgstr "Cantidad"
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
 #: libgwydgets/gwygrainvaluemenu.c:194 libgwydgets/gwygrainvaluemenu.c:207
-#: modules/process/curvature.c:753
+#: modules/process/curvature.c:750
 msgid "Symbol"
 msgstr "Símbolo"
 
@@ -1185,157 +1257,164 @@ msgstr ""
 msgid "_Next"
 msgstr "Consejo _siguiente"
 
-#: libgwydgets/gwygraphareadialog.c:127 modules/file/rawgraph.c:302
+#: libgwydgets/gwygraphareadialog.c:123 modules/file/rawgraph.c:302
 msgid "Plot _style:"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:148
+#: libgwydgets/gwygraphareadialog.c:131
 msgid "Pl_ot color:"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:159
+#: libgwydgets/gwygraphareadialog.c:151
 msgid "Point _type:"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:165
+#: libgwydgets/gwygraphareadialog.c:157
 msgid "_Point size:"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:175
+#: libgwydgets/gwygraphareadialog.c:167
 msgid "_Line type:"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:181 modules/file/imgexport.c:3150
+#: libgwydgets/gwygraphareadialog.c:173 modules/file/imgexport.c:3154
 msgid "Line t_hickness:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "e17"
-#: libgwydgets/gwygraphareadialog.c:187
+#: libgwydgets/gwygraphareadialog.c:180
 #, fuzzy
 msgid "<b>Label Te_xt</b>"
 msgstr "Etiqueta de texto"
 
-#: libgwydgets/gwygraphareadialog.c:404
+#: libgwydgets/gwygraphareadialog.c:397
 msgid "Set Curve Color"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:556 modules/process/mask_morph.c:179
+#: libgwydgets/gwygraphareadialog.c:549 modules/process/mask_morph.c:178
 msgid "Square"
 msgstr "Cuadrado"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "celestia"
-#: libgwydgets/gwygraphareadialog.c:558 modules/process/mask_morph.c:180
+#: libgwydgets/gwygraphareadialog.c:551 modules/process/mask_morph.c:179
 msgid "Diamond"
 msgstr "Diamante"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "dia"
-#: libgwydgets/gwygraphareadialog.c:559
+#: libgwydgets/gwygraphareadialog.c:552
 msgid "Cross"
 msgstr "Cruz"
 
-#: libgwydgets/gwygraphareadialog.c:560
+#: libgwydgets/gwygraphareadialog.c:553
 msgid "Diagonal cross"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gnucash"
-#: libgwydgets/gwygraphareadialog.c:561
+#: libgwydgets/gwygraphareadialog.c:554
 msgid "Asterisk"
 msgstr "Asterisco"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "fontforge"
-#: libgwydgets/gwygraphareadialog.c:562
+#: libgwydgets/gwygraphareadialog.c:555
 msgid "Star"
 msgstr "Estrella"
 
-#: libgwydgets/gwygraphareadialog.c:563
+#: libgwydgets/gwygraphareadialog.c:556
 msgid "Triangle up"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:564
+#: libgwydgets/gwygraphareadialog.c:557
 msgid "Triangle down"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:565
+#: libgwydgets/gwygraphareadialog.c:558
 msgid "Triangle left"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:566
+#: libgwydgets/gwygraphareadialog.c:559
 msgid "Triangle right"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:567
+#: libgwydgets/gwygraphareadialog.c:560
 msgid "Full square"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "ario"
-#: libgwydgets/gwygraphareadialog.c:568 modules/process/mask_morph.c:177
+#: libgwydgets/gwygraphareadialog.c:561 modules/process/mask_morph.c:176
 msgid "Disc"
 msgstr "Disco"
 
-#: libgwydgets/gwygraphareadialog.c:569
+#: libgwydgets/gwygraphareadialog.c:562
 msgid "Full diamond"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:570
+#: libgwydgets/gwygraphareadialog.c:563
 msgid "Full triangle up"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:571
+#: libgwydgets/gwygraphareadialog.c:564
 msgid "Full triangle down"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:572
+#: libgwydgets/gwygraphareadialog.c:565
 msgid "Full triangle left"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:573
+#: libgwydgets/gwygraphareadialog.c:566
 msgid "Full triangle right"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:635
+#: libgwydgets/gwygraphareadialog.c:628
 msgid "line-style|Solid"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:636
+#: libgwydgets/gwygraphareadialog.c:629
 msgid "line-style|Dash"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
-#: libgwydgets/gwygraphcurves.c:451
+#: libgwydgets/gwygraphcurves.c:448
 msgid "Description"
 msgstr "Descripción"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "anjuta"
-#: libgwydgets/gwygraphcurves.c:463
+#: libgwydgets/gwygraphcurves.c:460
 msgid "Mode"
 msgstr "Modo"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
-#: libgwydgets/gwygraphcurves.c:481
+#: libgwydgets/gwygraphcurves.c:478
 msgid "Color"
 msgstr "Color"
 
-#: libgwydgets/gwygraphcurves.c:494
+#: libgwydgets/gwygraphcurves.c:491
 msgid "Point Type"
 msgstr ""
 
-#: libgwydgets/gwygraphcurves.c:516
+#: libgwydgets/gwygraphcurves.c:513
 msgid "Line Style"
 msgstr ""
 
-#: libgwydgets/gwygraphlabeldialog.c:74
-msgid "Frame thickness:"
+#: libgwydgets/gwygraphlabeldialog.c:63
+msgid "Label Properties"
 msgstr ""
 
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "gimp"
+#: libgwydgets/gwygraphlabeldialog.c:74
+#, fuzzy
+msgid "_Frame thickness:"
+msgstr "G_rosor:"
+
 #: libgwydgets/gwygraphlabeldialog.c:81
 msgid "_Reversed layout"
 msgstr ""
@@ -1345,14 +1424,14 @@ msgstr ""
 msgid "Abscissa"
 msgstr "_Abscisa"
 
-#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1002 app/toolbox.c:108
+#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1015 app/toolbox.c:113
 msgid "Graph"
 msgstr "Gráfico"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "advene"
 #: libgwydgets/gwygraphwindow.c:170 modules/file/hdrimage.cc:472
-#: modules/process/fit-shape.c:656
+#: modules/process/fit-shape.c:666 modules/process/psf.c:229
 msgid "Data"
 msgstr "Data"
 
@@ -1392,7 +1471,7 @@ msgstr ""
 # based on translation from "audacious-plugins"
 #: libgwydgets/gwygraphwindowmeasuredialog.c:394
 #: libgwydgets/gwygraphwindowmeasuredialog.c:580 modules/tools/linestats.c:170
-#: modules/tools/roughness.c:516 modules/volume/volume_linestat.c:157
+#: modules/tools/roughness.c:517 modules/volume/volume_linestat.c:159
 msgid "Length"
 msgstr "Longitud"
 
@@ -1400,9 +1479,9 @@ msgstr "Longitud"
 # based on translation from "gtk2_ardour"
 #: libgwydgets/gwygraphwindowmeasuredialog.c:398
 #: libgwydgets/gwygraphwindowmeasuredialog.c:588 app/gwyplaintool.c:1018
-#: modules/process/lat_synth.c:747 modules/process/obj_synth.c:569
-#: modules/process/pat_synth.c:846 modules/process/pat_synth.c:1148
-#: modules/process/pat_synth.c:1483
+#: modules/process/fibre_synth.c:534 modules/process/lat_synth.c:747
+#: modules/process/obj_synth.c:567 modules/process/pat_synth.c:847
+#: modules/process/pat_synth.c:1149 modules/process/pat_synth.c:1484
 msgid "Height"
 msgstr "Altura"
 
@@ -1417,14 +1496,14 @@ msgstr ""
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "audacious-plugins"
 #: libgwydgets/gwygraphwindowmeasuredialog.c:553
-#: modules/process/linematch.c:828 modules/process/semsim.c:249
+#: modules/process/linematch.c:795 modules/process/semsim.c:249
 #: modules/xyz/xyz_level.c:254
 msgid "Method:"
 msgstr "Método:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "cssed"
-#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:354
+#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:331
 msgid "Angle"
 msgstr "Ángulo"
 
@@ -1438,7 +1517,7 @@ msgstr "Preferidos"
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "lang"
 #: libgwydgets/gwyoptionmenus.c:470 app/meta.c:410
-#: modules/file/imgexport.c:4160 modules/file/imgexport.c:4607
+#: modules/file/imgexport.c:4110 modules/file/imgexport.c:4555
 #: modules/file/rawfile.c:995 modules/process/convolution_filter.c:538
 #: modules/process/neural.c:418 modules/tools/selectionmanager.c:345
 msgid "Name"
@@ -1487,7 +1566,7 @@ msgstr ""
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
 #: libgwydgets/gwyscitext.c:274 modules/file/rawfile.c:553
-#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:405
+#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:419
 msgid "Preview"
 msgstr "Vista previa"
 
@@ -1505,109 +1584,103 @@ msgstr "Ningún módulo puede cargar este tipo de archivo"
 msgid "No module can save to this file type."
 msgstr "Ningún módulo puede guardar este tipo de archivo."
 
-#: libgwymodule/gwymodulebrowser.c:67
+#: libgwymodule/gwymodulebrowser.c:66
 msgid "Module Browser"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "anjuta"
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Module"
 msgstr "Módulo"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gmameui"
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Version"
 msgstr "Versión"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "advene"
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Author"
 msgstr "Autor"
 
-#: libgwymodule/gwymodulebrowser.c:246
+#: libgwymodule/gwymodulebrowser.c:244
 msgid "Name-Version:"
 msgstr ""
 
-#: libgwymodule/gwymodulebrowser.c:247 libgwymodule/gwymodulebrowser.c:270
+#: libgwymodule/gwymodulebrowser.c:245 libgwymodule/gwymodulebrowser.c:268
 #: modules/process/grain_stat.c:186
 msgid "File:"
 msgstr "Archivo:"
 
-#: libgwymodule/gwymodulebrowser.c:248
+#: libgwymodule/gwymodulebrowser.c:246
 msgid "Registered functions:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "beast"
-#: libgwymodule/gwymodulebrowser.c:249
+#: libgwymodule/gwymodulebrowser.c:247
 msgid "Authors:"
 msgstr "Autores:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "banshee"
-#: libgwymodule/gwymodulebrowser.c:250
+#: libgwymodule/gwymodulebrowser.c:248
 msgid "Copyright:"
 msgstr "Copyright:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "balsa"
-#: libgwymodule/gwymodulebrowser.c:251
+#: libgwymodule/gwymodulebrowser.c:249
 msgid "Date:"
 msgstr "Fecha:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
-#: libgwymodule/gwymodulebrowser.c:252
+#: libgwymodule/gwymodulebrowser.c:250
 msgid "Description:"
 msgstr "Descripción:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
-#: libgwymodule/gwymodulebrowser.c:269
+#: libgwymodule/gwymodulebrowser.c:267
 msgid "Name:"
 msgstr "Nombre:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "yum"
-#: libgwymodule/gwymodulebrowser.c:271
+#: libgwymodule/gwymodulebrowser.c:269
 msgid "Failure:"
 msgstr "Falla:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
-#: app/about.c:57
+#: app/about.c:58
 #, c-format
 msgid "About %s"
 msgstr "Acerca de %s"
 
-#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
-#: app/about.c:92
-#, c-format
-msgid "Released %s\n"
-msgstr ""
-
-#: app/about.c:93
+#: app/about.c:97
 msgid "An SPM data visualization and analysis tool."
 msgstr ""
 "Una herramienta para la visualización y análisis de datos SPM (microscopio "
 "de sonda de  barrido)."
 
-#: app/about.c:101
+#: app/about.c:105
 msgid "Report bugs to:"
 msgstr ""
 
-#: app/about.c:116
+#: app/about.c:120
 msgid "Credits"
 msgstr "Créditos"
 
-#: app/about.c:133
+#: app/about.c:137
 msgid "License"
 msgstr "Licencia"
 
-#: app/about.c:138
+#: app/about.c:142
 #, c-format
 msgid ""
 "%s is free software; you can redistribute it and/or modify it under the "
@@ -1622,60 +1695,64 @@ msgstr ""
 "elección) cualquiera de las versiones posteriores. Para ver la licencia "
 "completa ve el archivo COPYING incluido en la tarball fuente."
 
-#: app/about.c:160 modules/process/logistic.c:270
+#: app/about.c:164 modules/process/logistic.c:269
 msgid "Features"
 msgstr "Características"
 
-#: app/about.c:220
+#: app/about.c:224
 msgid "Developers"
 msgstr "Desarrolladores"
 
-#: app/about.c:221
+#: app/about.c:225
 msgid "Translators"
 msgstr "Traductores"
 
-#: app/about.c:225
+#: app/about.c:229
 msgid "Development is supported by the Czech Metrology Institute: "
 msgstr ""
 
-#: app/about.c:253 app/about.c:256
+#: app/about.c:257 app/about.c:260
 msgid "OpenGL 3D View"
 msgstr "Vista 3D OpenGL"
 
-#: app/about.c:257 app/about.c:271 app/about.c:291
+#: app/about.c:261 app/about.c:266 app/about.c:286
 msgid "not available\n"
 msgstr ""
 
-#: app/about.c:262 app/about.c:265
-msgid "Fast Fourier Transform"
-msgstr "Transformada rápida de Fourier"
-
-#: app/about.c:266
-msgid "built-in SimpleFFT\n"
-msgstr ""
-
-#: app/about.c:274
+#: app/about.c:269
 msgid "X11 protocol\n"
 msgstr "Protocolo X11\n"
 
-#: app/about.c:276
+#: app/about.c:271
 msgid "Win32 protocol\n"
 msgstr "Protocolo Win32\n"
 
-#: app/about.c:278
+#: app/about.c:273
 msgid "LibUnique\n"
 msgstr "LibUnique\n"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "src"
-#: app/about.c:282
+#: app/about.c:277
 msgid "Remote Control"
 msgstr "Control remoto"
 
-#: app/about.c:286 app/about.c:290
+#: app/about.c:281 app/about.c:285
 msgid "Python Scripting Interface"
 msgstr ""
 
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:311
+#, c-format
+msgid "Development version, built %s"
+msgstr ""
+
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:328
+#, c-format
+msgid "Released %s"
+msgstr ""
+
 #: app/app.c:301
 #, c-format
 msgid ""
@@ -1684,131 +1761,142 @@ msgid ""
 "Really quit?"
 msgstr ""
 
-#: app/app.c:440
+#: app/app.c:442
 msgid "Mask _Color..."
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "geeqie"
-#: app/app.c:456 app/app.c:1725
+#: app/app.c:458 app/app.c:1754
 msgid "Zoom _1:1"
 msgstr "Zoom _1:1"
 
-#: app/app.c:460 app/app.c:1729 app/app.c:1957
+#: app/app.c:462 app/app.c:1758 app/app.c:1988
 msgid "Metadata _Browser..."
 msgstr ""
 
-#: app/app.c:465 app/app.c:1734 app/app.c:1962
+#: app/app.c:467 app/app.c:1763 app/app.c:1993
 msgid "View _Log..."
 msgstr ""
 
-#: app/app.c:649
+#: app/app.c:651
 msgid "Pi_xelwise Square"
 msgstr ""
 
-#: app/app.c:659
+#: app/app.c:661
 msgid "_Physically Square"
 msgstr ""
 
-#: app/app.c:836
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "doc"
+#: app/app.c:842
+msgid "Set as Default"
+msgstr "Establecer como predeterminada"
+
+#: app/app.c:844
+msgid "Set the current view setup as the default"
+msgstr "Usar configuración de vista actual  como el defecto"
+
+#: app/app.c:854
 msgid "verb|Save"
 msgstr "Guardar"
 
-#: app/app.c:839 app/app.c:843
+#: app/app.c:857 app/app.c:861
 msgid "Save 3D view to an image"
 msgstr "Guardar vista 3D a una imagen"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
-# based on translation from "doc"
-#: app/app.c:849
-msgid "Set as Default"
-msgstr "Establecer como predeterminada"
+# based on translation from "gimp"
+#: app/app.c:869
+#, fuzzy
+msgid "_Autocrop"
+msgstr "_Auto"
 
-#: app/app.c:851
-msgid "Set the current view setup as the default"
-msgstr "Usar configuración de vista actual  como el defecto"
+#: app/app.c:873
+msgid "Remove white borders from exported image"
+msgstr ""
 
-#: app/app.c:940
+#: app/app.c:960
 msgid "_Show mask"
 msgstr ""
 
-#: app/app.c:1106
+#: app/app.c:1172
 #, c-format
 msgid "Saving of 3D view to `%s' failed"
 msgstr ""
 
-#: app/app.c:1150
+#: app/app.c:1222
 msgid "Export 3D View"
 msgstr "Exportar la vista 3D"
 
-#: app/app.c:1457
+#: app/app.c:1478
 msgid "_Change Preview"
 msgstr ""
 
-#: app/app.c:1583
+#: app/app.c:1606
 msgid "Change Volume Data Preview"
 msgstr ""
 
-#: app/app.c:1593
+#: app/app.c:1616
 msgid "Preview quantity:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "coccinella"
-#: app/app.c:1603 modules/process/extend.c:267 modules/tools/linestats.c:165
+#: app/app.c:1626 modules/process/extend.c:267 modules/tools/linestats.c:165
 #: modules/volume/volume_linestat.c:142
 msgid "Mean"
 msgstr "Mezquino"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "drupal6-mod-cck"
-#: app/app.c:1604 modules/process/polydistort.c:255 modules/tools/filter.c:240
+#: app/app.c:1627 modules/process/polydistort.c:258 modules/tools/filter.c:241
 #: modules/tools/icolorange.c:424 modules/tools/linestats.c:167
 #: modules/volume/volume_linestat.c:144
 msgid "Minimum"
 msgstr "Mínimo"
 
-#: app/app.c:1605 modules/process/col_synth.c:170 modules/tools/filter.c:241
+#: app/app.c:1628 modules/process/col_synth.c:170 modules/tools/filter.c:242
 #: modules/tools/icolorange.c:435 modules/tools/linestats.c:168
 #: modules/volume/volume_linestat.c:145
 msgid "Maximum"
 msgstr "Máximo"
 
-#: app/app.c:1606
+#: app/app.c:1629 modules/volume/volume_linestat.c:146
 msgid "Min. position"
 msgstr ""
 
-#: app/app.c:1607
+#: app/app.c:1630 modules/volume/volume_linestat.c:147
 msgid "Max. position"
 msgstr ""
 
-#: app/app.c:1608 modules/process/bdep_synth.c:134
-#: modules/process/col_synth.c:171 modules/process/scars.c:346
-#: modules/process/scars.c:353 modules/process/threshold.c:341
+#: app/app.c:1631 modules/process/bdep_synth.c:134
+#: modules/process/col_synth.c:171 modules/process/scars.c:369
+#: modules/process/scars.c:377 modules/process/threshold.c:336
 msgid "RMS"
 msgstr "RMS"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "centerim"
-#: app/app.c:1609 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
-#: modules/file/xyzexport.c:233 modules/file/xyzexport.c:302
+#: app/app.c:1632 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
+#: modules/file/xyzexport.c:236 modules/file/xyzexport.c:305
 msgid "Channel:"
 msgstr "Canal:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "aptitude"
-#: app/app.c:1610
+#: app/app.c:1633
 msgid "Section:"
 msgstr "Sección: "
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
-#: app/app.c:1861
+#: app/app.c:1890
 #, fuzzy
 msgid "_Update Preview"
 msgstr "Vista previa"
 
-#: app/app.c:1867
+#: app/app.c:1896
 #, fuzzy
 msgid "_Density Map"
 msgstr "Densi_dad:"
@@ -1828,12 +1916,12 @@ msgstr ""
 msgid "Unknown XYZ %d"
 msgstr ""
 
-#: app/data-browser-aux.c:2795
+#: app/data-browser-aux.c:2839
 #, c-format
 msgid "Z levels: %d, Z unit: %s"
 msgstr ""
 
-#: app/data-browser-aux.c:2821
+#: app/data-browser-aux.c:2865
 #, fuzzy, c-format
 msgid "Points: %d"
 msgstr "Puntos"
@@ -1868,14 +1956,15 @@ msgid "Close file"
 msgstr "Cierra archivo"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
-# based on translation from "gtk2_ardour"
+# based on translation from "abiword"
 #: app/data-browser.c:5582
-msgid "Channels"
-msgstr "Canales"
+#, fuzzy
+msgid "Images"
+msgstr "Páginas:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "amule"
-#: app/data-browser.c:5596 modules/volume/volume_extract.c:444
+#: app/data-browser.c:5596 modules/volume/volume_extract.c:431
 msgid "Graphs"
 msgstr "Gráficos"
 
@@ -1920,51 +2009,51 @@ msgid ""
 "%s"
 msgstr ""
 
-#: app/file.c:285
+#: app/file.c:292
 #, c-format
 msgid "Opening of `%s' failed"
 msgstr ""
 
-#: app/file.c:291 app/file.c:526
+#: app/file.c:298 app/file.c:533
 #, c-format
 msgid "Full file path: %s."
 msgstr ""
 
-#: app/file.c:294
+#: app/file.c:301
 #, c-format
 msgid "Loaded using: %s."
 msgstr ""
 
-#: app/file.c:380
+#: app/file.c:387
 msgid "Merge File"
 msgstr "Fusionar Archivo"
 
-#: app/file.c:382 app/gwyappfilechooser.c:221
+#: app/file.c:389 app/gwyappfilechooser.c:226
 msgid "Open File"
 msgstr "Abre Archivo"
 
-#: app/file.c:520 app/gwymoduleutils.c:192
+#: app/file.c:527 app/gwymoduleutils.c:192
 #, c-format
 msgid "Saving of `%s' failed"
 msgstr ""
 
-#: app/file.c:529
+#: app/file.c:536
 #, c-format
 msgid "Saved using: %s."
 msgstr ""
 
-#: app/file.c:689
+#: app/file.c:696
 #, c-format
 msgid "File `%s' already exists.  Replace?"
 msgstr "Archivo `%s' ya existe. Sobrescribir? "
 
-#: app/file.c:693
+#: app/file.c:700
 #, c-format
 msgid ""
 "The file already exists in `%s'.  Replacing it will overwrite its contents."
 msgstr ""
 
-#: app/file.c:696
+#: app/file.c:703
 msgid "Replace File?"
 msgstr "¿Sustituir Archivo?"
 
@@ -1995,13 +2084,13 @@ msgstr "Abrir archivo seleccionado"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "audacious"
-#: app/filelist.c:566 app/gwyappfilechooser.c:583
+#: app/filelist.c:566 app/gwyappfilechooser.c:592
 msgid "_Filter:"
 msgstr "_Filtro:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gtkhtml3.14"
-#: app/filelist.c:604 app/gwyappfilechooser.c:619
+#: app/filelist.c:604 app/gwyappfilechooser.c:628
 msgid "Case _sensitive"
 msgstr "_Sensible a capitalización"
 
@@ -2053,104 +2142,104 @@ msgstr "_Curva"
 msgid "_Snap to control points"
 msgstr ""
 
-#: app/gwyappfilechooser.c:226
+#: app/gwyappfilechooser.c:231
 msgid "Save File"
 msgstr "Guardar archivo"
 
-#: app/gwyappfilechooser.c:380
+#: app/gwyappfilechooser.c:389
 #, c-format
 msgid "File _type: %s"
 msgstr ""
 
-#: app/gwyappfilechooser.c:387
+#: app/gwyappfilechooser.c:396
 #, fuzzy
 msgid "Only loadable shown"
 msgstr "Enseñar sólo archivos cargables"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "audacious"
-#: app/gwyappfilechooser.c:391
+#: app/gwyappfilechooser.c:400
 #, fuzzy, c-format
 msgid "Filter: %s"
 msgstr "_Filtro:"
 
-#: app/gwyappfilechooser.c:455
+#: app/gwyappfilechooser.c:464
 msgid "Automatic by extension"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gnumeric"
-#: app/gwyappfilechooser.c:464
+#: app/gwyappfilechooser.c:473
 msgid "Automatically detected"
 msgstr "Automáticamente detectado"
 
-#: app/gwyappfilechooser.c:561
+#: app/gwyappfilechooser.c:570
 msgid "Show only loadable files"
 msgstr "Enseñar sólo archivos cargables"
 
-#: app/gwyappfilechooser.c:844
+#: app/gwyappfilechooser.c:855
 msgid "Plane-level previewed data"
 msgstr ""
 
-#: app/gwyappfilechooser.c:860
+#: app/gwyappfilechooser.c:871
 msgid "Row-level previewed data"
 msgstr ""
 
-#: app/gwyappfilechooser.c:969
+#: app/gwyappfilechooser.c:987
+msgid "File too large for preview"
+msgstr ""
+
+#: app/gwyappfilechooser.c:988
 msgid "…"
 msgstr "..."
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "calibre"
-#: app/gwyappfilechooser.c:1331
+#: app/gwyappfilechooser.c:1352
 msgid "Cannot preview"
 msgstr "No se puede previsualizar"
 
-#: app/gwyddion.c:143
+#: app/gwyddion.c:147
 msgid "Loading document history"
 msgstr ""
 
-#: app/gwyddion.c:148
+#: app/gwyddion.c:152
 msgid "Registering "
 msgstr ""
 
-#: app/gwyddion.c:149
+#: app/gwyddion.c:153
 msgid "stock items"
 msgstr ""
 
-#: app/gwyddion.c:153
+#: app/gwyddion.c:157
 msgid "color gradients"
 msgstr ""
 
-#: app/gwyddion.c:155
+#: app/gwyddion.c:159
 msgid "GL materials"
 msgstr "Materiales GL"
 
-#: app/gwyddion.c:157
+#: app/gwyddion.c:161
 msgid "grain quantities"
 msgstr ""
 
-#: app/gwyddion.c:159
+#: app/gwyddion.c:163
 msgid "calibrations"
 msgstr ""
 
-#: app/gwyddion.c:164
+#: app/gwyddion.c:168
 msgid "Loading settings"
 msgstr ""
 
-#: app/gwyddion.c:171
+#: app/gwyddion.c:175
 msgid "Registering modules"
 msgstr ""
 
-#: app/gwyddion.c:193
-msgid "Initializing GUI"
-msgstr ""
-
-#: app/gwyddion.c:439
+#: app/gwyddion.c:464
 msgid "Could not read settings."
 msgstr ""
 
-#: app/gwyddion.c:442
+#: app/gwyddion.c:467
 #, c-format
 msgid ""
 "Settings file `%s' cannot be read: %s\n"
@@ -2159,48 +2248,69 @@ msgid ""
 "it is repaired or removed."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:542
+#: app/gwyddion.c:505
+#, c-format
+msgid "Many modules (%u) failed to register."
+msgstr ""
+
+#: app/gwyddion.c:510
+#, c-format
+msgid ""
+"Most likely Gwyddion was not upgraded correctly.  Instead, one installation "
+"was just overwritten with another, and now it is a mess.\n"
+"\n"
+"Please remove completely the module directory\n"
+"\n"
+"%s\n"
+"\n"
+"and reinstall Gwyddion.\n"
+"\n"
+"See Info → Module Browser for specific errors."
+msgstr ""
+
+#: app/gwymoduleutils-file.c:536
 #, c-format
 msgid "Section %s ended at line %u but it has never started."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:550
+#: app/gwymoduleutils-file.c:544
 #, c-format
 msgid "Section %s ended at line %u instead of %s."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:587
+#: app/gwymoduleutils-file.c:581
 #, c-format
 msgid "Section %s started at line %u before %s ended."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:593
+#: app/gwymoduleutils-file.c:587
 #, c-format
 msgid "Empty section name at header line %u."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:628
+#: app/gwymoduleutils-file.c:622
 #, c-format
 msgid "Header line %u lacks prefix %s."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:653
+#: app/gwymoduleutils-file.c:647
 #, c-format
 msgid "Header line %u lacks key-value separator."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:661
+#: app/gwymoduleutils-file.c:655
 #, c-format
 msgid "Key at header line %u is empty."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:688
+#: app/gwymoduleutils-file.c:682
 #, c-format
 msgid "Header suddenly ended at line %u; end of header marker is missing"
 msgstr ""
 
 #: app/gwymoduleutils.c:197 app/settings.c:131 app/settings.c:142
 #: app/toolbox-spec.c:536 modules/file/err.h:62
+#: modules/pygwy/pygwy-console.c:528
 #, c-format
 msgid "Cannot write to file: %s."
 msgstr ""
@@ -2231,8 +2341,9 @@ msgstr "Origen"
 # based on translation from "accerciser"
 #: app/gwyplaintool.c:1011 modules/file/rawfile.c:997
 #: modules/process/convolution_filter.c:349
-#: modules/process/convolution_filter.c:553 modules/process/neural.c:419
-#: modules/process/obj_synth.c:538 modules/process/pat_synth.c:1449
+#: modules/process/convolution_filter.c:553 modules/process/fibre_synth.c:520
+#: modules/process/neural.c:419 modules/process/obj_synth.c:536
+#: modules/process/pat_synth.c:1450
 msgid "Size"
 msgstr "Tamaño"
 
@@ -2293,7 +2404,7 @@ msgstr "_Cerrar"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
-#: app/log.c:615 modules/file/imgexport.c:4168 modules/file/rawfile.c:996
+#: app/log.c:615 modules/file/imgexport.c:4118 modules/file/rawfile.c:996
 msgid "Type"
 msgstr "Tipo"
 
@@ -2305,8 +2416,8 @@ msgstr "Función"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "audacity"
-#: app/log.c:617 modules/file/imgexport.c:3117 modules/process/fit-shape.c:465
-#: modules/process/neural.c:610 modules/tools/stats.c:425
+#: app/log.c:617 modules/file/imgexport.c:3128 modules/process/fit-shape.c:466
+#: modules/process/neural.c:614 modules/tools/stats.c:423
 msgid "Parameters"
 msgstr "Parámetros"
 
@@ -2322,44 +2433,44 @@ msgstr "Tiempo"
 msgid "Export Log"
 msgstr "Exportar registro"
 
-#: app/menu.c:556 app/toolbox.c:581
+#: app/menu.c:555 app/toolbox.c:595
 msgid "_Data Process"
 msgstr "_Proceso de Datos"
 
-#: app/menu.c:598 app/toolbox.c:584
+#: app/menu.c:597 app/toolbox.c:598
 msgid "_Graph"
 msgstr "_Gráfico"
 
-#: app/menu.c:641 app/toolbox.c:587
+#: app/menu.c:640 app/toolbox.c:601
 msgid "_Volume Data"
 msgstr ""
 
-#: app/menu.c:684 app/toolbox.c:590
+#: app/menu.c:683 app/toolbox.c:604
 #, fuzzy
 msgid "_XYZ Data"
 msgstr "_Datos"
 
-#: app/menu.c:715
+#: app/menu.c:714
 msgid "Re-show Last"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
-#: app/menu.c:730
+#: app/menu.c:729
 msgid "Repeat Last"
 msgstr "Repetir el último"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "audacious-plugins"
-#: app/menu.c:858
+#: app/menu.c:857
 msgid "Repeat"
 msgstr "Repetir"
 
-#: app/menu.c:864
+#: app/menu.c:863
 msgid "Re-show"
 msgstr ""
 
-#: app/menu.c:1186
+#: app/menu.c:1185
 msgid "_Document history"
 msgstr ""
 
@@ -2367,8 +2478,8 @@ msgstr ""
 msgid "_New"
 msgstr "_Nuevo"
 
-#: app/meta.c:235 modules/file/imgexport.c:4672 modules/file/rawfile.c:1058
-#: modules/process/neural.c:711 modules/tools/selectionmanager.c:405
+#: app/meta.c:235 modules/file/imgexport.c:4620 modules/file/rawfile.c:1058
+#: modules/process/neural.c:718 modules/tools/selectionmanager.c:405
 msgid "_Delete"
 msgstr "_Suprimir"
 
@@ -2446,11 +2557,11 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "e17"
-#: app/splash.c:832
+#: app/splash.c:1260
 msgid "Starting "
 msgstr "Iniciando"
 
-#: app/splash.c:878
+#: app/splash.c:1313
 msgid " is free software released under GNU GPL."
 msgstr ""
 
@@ -2889,156 +3000,157 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "anjuta"
-#: app/toolbox-editor.c:212
+#: app/toolbox-editor.c:213
 #, fuzzy
 msgid "Toolbox Editor"
 msgstr "Editor"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gnucash"
-#: app/toolbox-editor.c:257
+#: app/toolbox-editor.c:258
 #, fuzzy
 msgid "_New Item"
 msgstr "Nuevo elemento"
 
-#: app/toolbox-editor.c:262
+#: app/toolbox-editor.c:263
 #, fuzzy
 msgid "_New Group"
 msgstr "Corta Gráfico"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gnome-video-arcade"
-#: app/toolbox-editor.c:268 app/toolbox.c:577
+#: app/toolbox-editor.c:269 app/toolbox.c:591
 msgid "_Edit"
 msgstr "_Editar"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "anjuta"
-#: app/toolbox-editor.c:273 modules/process/fft_filter_2d.c:499
-#: modules/tools/maskedit.c:548 modules/volume/volume_zcal.c:173
+#: app/toolbox-editor.c:274 modules/process/fft_filter_2d.c:499
+#: modules/tools/maskedit.c:554 modules/volume/volume_zcal.c:173
 msgid "_Remove"
 msgstr "Quita_r"
 
-#: app/toolbox-editor.c:278
+#: app/toolbox-editor.c:279
 msgid "Move _Up"
 msgstr ""
 
-#: app/toolbox-editor.c:283
+#: app/toolbox-editor.c:284
 msgid "Move _Down"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "plugin_htmlbar"
-#: app/toolbox-editor.c:292 modules/file/hdrimage.cc:2304
-#: modules/file/imgexport.c:3101 modules/file/pixmap.c:872
+#: app/toolbox-editor.c:293 modules/file/hdrimage.cc:2304
+#: modules/file/imgexport.c:3114 modules/file/pixmap.c:872
 #: modules/file/rawfile.c:658 modules/process/crosscor.c:252
-#: modules/process/dimensions.h:473 modules/process/tip_blind.c:333
+#: modules/process/dimensions.h:455 modules/process/fibre_synth.c:526
+#: modules/process/tip_blind.c:334
 msgid "_Width:"
 msgstr "A_ncho:"
 
-#: app/toolbox-editor.c:774
+#: app/toolbox-editor.c:787
 msgid "Toolbox Group"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "plugin_htmlbar"
-#: app/toolbox-editor.c:791 modules/file/rawgraph.c:267
+#: app/toolbox-editor.c:804 modules/file/rawgraph.c:267
 msgid "_Title:"
 msgstr "_Título:"
 
-#: app/toolbox-editor.c:805
+#: app/toolbox-editor.c:818
 msgid "_Id:"
 msgstr ""
 
-#: app/toolbox-editor.c:818
+#: app/toolbox-editor.c:831
 #, fuzzy
 msgid "_Suggest"
 msgstr "Pepitas"
 
-#: app/toolbox-editor.c:824
+#: app/toolbox-editor.c:837
 msgid "Trans_latable title"
 msgstr ""
 
-#: app/toolbox-editor.c:874
+#: app/toolbox-editor.c:887
 msgid "Group id is not a valid identifier"
 msgstr ""
 
-#: app/toolbox-editor.c:882
+#: app/toolbox-editor.c:895
 msgid "Group id is not unique"
 msgstr ""
 
-#: app/toolbox-editor.c:971
+#: app/toolbox-editor.c:984
 msgid "Toolbox Item"
 msgstr ""
 
-#: app/toolbox-editor.c:992 modules/process/coerce.c:331
+#: app/toolbox-editor.c:1005 modules/process/coerce.c:331
 #: modules/tools/filter.c:284
 msgid "_Type:"
 msgstr "_Tipo:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
-#: app/toolbox-editor.c:999
+#: app/toolbox-editor.c:1012
 #, fuzzy
 msgid "Placeholder"
 msgstr "Colocación"
 
-#: app/toolbox-editor.c:1000
+#: app/toolbox-editor.c:1013
 msgid "Builtin"
 msgstr ""
 
-#: app/toolbox-editor.c:1001 app/toolbox.c:107
+#: app/toolbox-editor.c:1014 app/toolbox.c:112
 msgid "Data Process"
 msgstr "Proceso de Datos"
 
-#: app/toolbox-editor.c:1003
+#: app/toolbox-editor.c:1016
 #, fuzzy
 msgid "Volume Data"
 msgstr "Volumen"
 
-#: app/toolbox-editor.c:1004
+#: app/toolbox-editor.c:1017
 #, fuzzy
 msgid "XYZ Data"
 msgstr "_Datos"
 
-#: app/toolbox-editor.c:1005
+#: app/toolbox-editor.c:1018
 #, fuzzy
 msgid "Tool"
 msgstr "Herramientas"
 
-#: app/toolbox-editor.c:1012
+#: app/toolbox-editor.c:1025 modules/tools/profile.c:483
 #, fuzzy
 msgid "_Mode:"
 msgstr "_Modelo:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "doc"
-#: app/toolbox-editor.c:1019 app/toolbox-editor.c:1038
+#: app/toolbox-editor.c:1032 app/toolbox-editor.c:1051
 #, fuzzy
 msgid "Default"
 msgstr "Establecer como predeterminada"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "audacity"
-#: app/toolbox-editor.c:1020
+#: app/toolbox-editor.c:1033
 #, fuzzy
 msgid "Interactive"
 msgstr "Interpolación:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "compiz-fusion-plugins-extra"
-#: app/toolbox-editor.c:1021
+#: app/toolbox-editor.c:1034
 #, fuzzy
 msgid "Non-interactive"
 msgstr "Negativo"
 
-#: app/toolbox-editor.c:1029
+#: app/toolbox-editor.c:1042
 msgid "Use _icon from:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "alleyoop"
-#: app/toolbox-editor.c:1063
+#: app/toolbox-editor.c:1076
 #, fuzzy
 msgid "Functions"
 msgstr "Función"
@@ -3058,160 +3170,180 @@ msgstr "Entrenamiento"
 msgid "All tools not placed explicitly go here."
 msgstr ""
 
-#: app/toolbox.c:106
+#: app/toolbox.c:111
 msgid "View"
 msgstr "Vista"
 
-#: app/toolbox.c:109
+#: app/toolbox.c:114
 msgid "Tools"
 msgstr "Herramientas"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gmameui"
-#: app/toolbox.c:575
+#: app/toolbox.c:589
 msgid "_File"
 msgstr "_Archivo"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "anjuta"
-#: app/toolbox.c:593
+#: app/toolbox.c:607
 msgid "_Info"
 msgstr "_Info"
 
-#: app/toolbox.c:663
+#: app/toolbox.c:696
 msgid "Display a 3D view of data"
 msgstr "Muestra una vista 3D de los datos"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "balsa"
+#: app/toolbox.c:700
+#, fuzzy
+msgid "Undo"
+msgstr "_Deshacer"
+
+#: app/toolbox.c:700
+msgid "Undo last action"
+msgstr ""
+
+#: app/toolbox.c:704
+#, fuzzy
+msgid "Redo"
+msgstr "/_Rehacer"
+
+#: app/toolbox.c:704
+msgid "Redo again last undone action"
+msgstr ""
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "claws-mail"
-#: app/toolbox.c:667
+#: app/toolbox.c:708
 msgid "Zoom in"
 msgstr "Aumentar"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "cairo-dock"
-#: app/toolbox.c:671
+#: app/toolbox.c:712
 msgid "Zoom out"
 msgstr "Alejarse"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gedit"
-#: app/toolbox.c:675
+#: app/toolbox.c:716
 msgid "Zoom 1:1"
 msgstr "Ampliación 1:1"
 
-#: app/toolbox.c:722
+#: app/toolbox.c:781
 msgid "/Show _Data Browser"
 msgstr ""
 
-#: app/toolbox.c:730
+#: app/toolbox.c:789
 msgid "/Module _Browser"
 msgstr ""
 
-#: app/toolbox.c:738
+#: app/toolbox.c:797
 msgid "/Program _Messages"
 msgstr ""
 
-#: app/toolbox.c:753
+#: app/toolbox.c:812
 msgid "/_User Guide"
 msgstr ""
 
-#: app/toolbox.c:761
+#: app/toolbox.c:820
 msgid "/_Tip of the Day"
 msgstr "/_Consejo del día "
 
-#: app/toolbox.c:769
+#: app/toolbox.c:828
 msgid "/_About Gwyddion"
 msgstr "/_Acerca de Gwyddion"
 
-#: app/toolbox.c:806
+#: app/toolbox.c:865
 msgid "/_Open..."
 msgstr "/_Abrir..."
 
-#: app/toolbox.c:814
+#: app/toolbox.c:873
 msgid "/_Merge..."
 msgstr "/_Fusionar..."
 
-#: app/toolbox.c:822
+#: app/toolbox.c:881
 msgid "/Open _Recent"
 msgstr "/Abrir_Reciente"
 
-#: app/toolbox.c:830
+#: app/toolbox.c:889
 msgid "/_Save"
 msgstr "/_Guardar"
 
-#: app/toolbox.c:838
+#: app/toolbox.c:897
 msgid "/Save _As..."
 msgstr "/Guardar_Como..."
 
-#: app/toolbox.c:846
+#: app/toolbox.c:905
 #, fuzzy
 msgid "/_Close"
 msgstr "_Cerrar"
 
-#: app/toolbox.c:854
+#: app/toolbox.c:913
 msgid "/Remo_ve All Logs"
 msgstr ""
 
-#: app/toolbox.c:870
+#: app/toolbox.c:929
 msgid "/_Quit"
 msgstr "/_Salir"
 
-#: app/toolbox.c:910
+#: app/toolbox.c:969
 msgid "/_Undo"
 msgstr "/_Deshacer"
 
-#: app/toolbox.c:918
+#: app/toolbox.c:977
 msgid "/_Redo"
 msgstr "/_Rehacer"
 
-#: app/toolbox.c:934
+#: app/toolbox.c:993
 msgid "/Default Mask _Color..."
 msgstr ""
 
-#: app/toolbox.c:942
+#: app/toolbox.c:1001
 msgid "/Color _Gradients..."
 msgstr ""
 
-#: app/toolbox.c:950
+#: app/toolbox.c:1009
 msgid "/G_L Materials..."
 msgstr "/Materiales G_L..."
 
-#: app/toolbox.c:958
+#: app/toolbox.c:1017
 msgid "/_Toolbox..."
 msgstr ""
 
-#: app/toolbox.c:966
+#: app/toolbox.c:1025
 msgid "/_Keyboard Shortcuts"
 msgstr ""
 
-#: app/toolbox.c:974
+#: app/toolbox.c:1033
 msgid "/_Logging Enabled"
 msgstr ""
 
-#: app/toolbox.c:1083
+#: app/toolbox.c:1142
 msgid "Program Messages"
 msgstr ""
 
-#: app/toolbox.c:1320
+#: app/toolbox.c:1379
 msgid "Change Default Mask Color"
 msgstr ""
 
-#: app/toolbox.c:1348
+#: app/toolbox.c:1407
 msgid "OpenGL 3D graphics not available"
 msgstr "Gráficos OpenGL 3D no disponibles"
 
-#: app/toolbox.c:1353
+#: app/toolbox.c:1412
 msgid "OpenGL was disabled with a command-line option."
 msgstr "OpenGL fue deshabilitado con una opción de línea de comandos."
 
-#: app/toolbox.c:1361
+#: app/toolbox.c:1420
 msgid ""
 "Initialization of OpenGL failed.  Check output of <tt>glxinfo</tt> and "
 "warning messages printed to console during Gwyddion startup."
 msgstr ""
 
-#: app/toolbox.c:1368
+#: app/toolbox.c:1427
 msgid "This version of Gwyddion was built without OpenGL support."
 msgstr "Esta versión de Gwyddion fue construida sin el soporte de OpenGL. "
 
@@ -3289,7 +3421,7 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "lang"
-#: app/wait.c:106
+#: app/wait.c:114
 msgid "Please wait"
 msgstr "Por favor, espere"
 
@@ -3306,11 +3438,11 @@ msgstr "Archivos de texto Accurex II (.txt)"
 msgid "File header cannot be converted from ISO-8859-1 character set: %s"
 msgstr ""
 
-#: modules/file/aistfile.c:127
+#: modules/file/aistfile.c:123
 msgid "Imports AIST-NT data files."
 msgstr "Importa AIST-NT archivos de datos."
 
-#: modules/file/aistfile.c:140
+#: modules/file/aistfile.c:136
 msgid "AIST-NT files (.aist)"
 msgstr "Archivos AIST-NT (.aist)"
 
@@ -3357,7 +3489,8 @@ msgstr ""
 
 #: modules/file/alicona.c:665 modules/file/gdeffile.c:175
 #: modules/file/gdeffile.c:199 modules/file/gsffile.c:159
-#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1038
+#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1174
+#: modules/file/microprof.c:361 modules/file/microprof.c:375
 #: modules/file/pt3file.c:489 modules/file/pt3file.c:591
 msgid "File header is truncated."
 msgstr ""
@@ -3370,11 +3503,11 @@ msgstr ""
 msgid "Comment is not nul-terminated."
 msgstr ""
 
-#: modules/file/ambfile.c:84
+#: modules/file/ambfile.c:83
 msgid "Imports Ambios AMB data files."
 msgstr "Importa Ambios AMB archivos de datos."
 
-#: modules/file/ambfile.c:97
+#: modules/file/ambfile.c:96
 msgid "Ambios amb files (.amb)"
 msgstr "Archivos Ambios amb (.amb)"
 
@@ -3406,11 +3539,11 @@ msgstr ""
 msgid "FileDescBegin has no corresponding FileDescEnd."
 msgstr ""
 
-#: modules/file/apedaxfile.c:259
+#: modules/file/apedaxfile.c:261
 msgid "Imports A.P.E. Research DAX data files."
 msgstr "Importa A.P.E. Research DAX archivos de datos."
 
-#: modules/file/apedaxfile.c:274
+#: modules/file/apedaxfile.c:276
 #, fuzzy
 msgid "A.P.E. Research DAX Files (.dax) and APDT File (.apdt)"
 msgstr "Archivos A.P.E. Research DAX (.dax)"
@@ -3443,7 +3576,7 @@ msgstr "Anchura:"
 msgid "Height:"
 msgstr "Altura:"
 
-#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:248
+#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:251
 msgid "Value units:"
 msgstr ""
 
@@ -3454,30 +3587,30 @@ msgid "Export Text"
 msgstr "Exportar Texto"
 
 #: modules/file/asciiexport.c:275 modules/file/gxyzffile.c:402
-#: modules/file/imgexport.c:3565 modules/file/imgexport.c:4203
-#: modules/file/rawfile.c:758 modules/file/xyzexport.c:311
-#: modules/process/calibrate.c:607 modules/process/coerce.c:364
-#: modules/process/col_synth.c:516 modules/process/correct_affine.c:470
-#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:261
-#: modules/process/grain_dist.c:306 modules/process/grain_edge.c:255
-#: modules/process/grain_mark.c:338 modules/process/grain_wshed.c:252
-#: modules/process/linematch.c:852 modules/process/mark_disconn.c:279
-#: modules/process/slope_dist.c:367 modules/process/tip_blind.c:357
+#: modules/file/imgexport.c:3532 modules/file/imgexport.c:4151
+#: modules/file/rawfile.c:758 modules/file/xyzexport.c:314
+#: modules/process/calibrate.c:561 modules/process/coerce.c:363
+#: modules/process/col_synth.c:516 modules/process/correct_affine.c:520
+#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:263
+#: modules/process/grain_dist.c:307 modules/process/grain_edge.c:254
+#: modules/process/grain_mark.c:335 modules/process/grain_wshed.c:256
+#: modules/process/linematch.c:819 modules/process/mark_disconn.c:280
+#: modules/process/slope_dist.c:359 modules/process/tip_blind.c:360
 #: modules/process/wpour_mark.c:354 modules/tools/spotremove.c:322
-#: modules/tools/stats.c:402 modules/xyz/xyz_raster.c:628
+#: modules/tools/stats.c:401 modules/xyz/xyz_raster.c:597
 msgid "Options"
 msgstr "Opciones"
 
-#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:314
+#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:317
 msgid "Use _dot as decimal separator"
 msgstr ""
 
-#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:321
-#: modules/process/grain_dist.c:317
+#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:324
+#: modules/process/grain_dist.c:318
 msgid "Add _informational comment header"
 msgstr ""
 
-#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:330
+#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:333
 msgid "_Precision:"
 msgstr ""
 
@@ -3497,20 +3630,20 @@ msgstr "Importa Attocube Systems ASC archivos."
 msgid "Attocube ASCII files (.asc)"
 msgstr "Archivos Attocube ASCII (.asc)"
 
-#: modules/file/bcrfile.c:146
+#: modules/file/bcrfile.c:141
 msgid "Imports Image Metrology BCR data files."
 msgstr "Importa Image Metrology BCR archivos de datos."
 
-#: modules/file/bcrfile.c:159
+#: modules/file/bcrfile.c:154
 msgid "BCR files (.bcr, .bcrf)"
 msgstr "Archivos BCR (.bcr, .bcrf)"
 
-#: modules/file/bcrfile.c:238
+#: modules/file/bcrfile.c:233
 #, c-format
 msgid "File header is not convertible from UTF-16: %s"
 msgstr ""
 
-#: modules/file/bcrfile.c:351
+#: modules/file/bcrfile.c:346
 #, c-format
 msgid "Unknown file type header: `%s'."
 msgstr ""
@@ -3545,7 +3678,7 @@ msgid "Burleigh exported data (.txt, .bin)"
 msgstr "Burleigh datos exportados (.txt, .bin)"
 
 #: modules/file/burleigh_exp.c:226 modules/file/burleigh_exp.c:267
-#: modules/file/nanoscope.c:1605 modules/file/omicron.c:416
+#: modules/file/nanoscope.c:1612 modules/file/omicron.c:416
 #: modules/file/shimadzu.c:468
 msgid "Missing colon in header line."
 msgstr ""
@@ -3594,24 +3727,44 @@ msgstr "Importa Benyuan CSM archivos de datos."
 msgid "Benyuan CSM files (.csm)"
 msgstr "Archivos Benyuan CSM (.csm)"
 
-#: modules/file/dektakxml.c:138
+#: modules/file/dektakvca.c:197
+#, fuzzy
+msgid "Imports Dektak OPDx data files."
+msgstr "Importa DME MIF archivos de datos."
+
+#: modules/file/dektakvca.c:210
+#, fuzzy
+msgid "Dektak OPDx data files (.OPDx)"
+msgstr "Archivos NanoScan XML (.xml)"
+
+#: modules/file/dektakvca.c:655
+#, c-format
+msgid "Item `%s' has unexpected type %u instead of %u."
+msgstr ""
+
+#: modules/file/dektakvca.c:1022
+#, c-format
+msgid "Truncated data inside item %s."
+msgstr ""
+
+#: modules/file/dektakxml.c:118
 #, fuzzy
 msgid "Imports Dektak XML data files."
 msgstr "Importa DME MIF archivos de datos."
 
-#: modules/file/dektakxml.c:151
+#: modules/file/dektakxml.c:131
 #, fuzzy
 msgid "Dektak XML data files (.xml)"
 msgstr "Archivos NanoScan XML (.xml)"
 
-#: modules/file/dektakxml.c:228 modules/file/lextfile.c:260
-#: modules/file/nanoscan.c:267 modules/file/ometiff.c:265
+#: modules/file/dektakxml.c:208 modules/file/lextfile.c:260
+#: modules/file/nanoscan.c:270 modules/file/ometiff.c:265
 #, c-format
 msgid "XML parsing failed: %s"
 msgstr ""
 
-#: modules/file/dektakxml.c:400 modules/file/lextfile.c:163
-#: modules/file/nanoscan.c:672 modules/file/ometiff.c:445
+#: modules/file/dektakxml.c:373 modules/file/lextfile.c:163
+#: modules/file/nanoscan.c:698 modules/file/ometiff.c:445
 #, c-format
 msgid "Top-level element is not ‘%s’."
 msgstr ""
@@ -3726,7 +3879,7 @@ msgid "Scan size header field overlaps with data."
 msgstr ""
 
 #: modules/file/err.h:48 modules/file/nrrdfile.c:779
-#: modules/file/nrrdfile.c:824
+#: modules/file/nrrdfile.c:824 modules/pygwy/pygwy-console.c:504
 #, c-format
 msgid "Cannot read from file: %s."
 msgstr ""
@@ -3940,32 +4093,32 @@ msgid ""
 "Data deserialization succeeded, but resulted in an unexpected object %s."
 msgstr ""
 
-#: modules/file/gwytiff.h:332
+#: modules/file/gwytiff.h:335
 #, c-format
 msgid "BigTIFF reserved fields are %u and %u instead of 8 and 0."
 msgstr ""
 
-#: modules/file/gwytiff.h:349 modules/file/gwytiff.h:366
+#: modules/file/gwytiff.h:352 modules/file/gwytiff.h:369
 #, c-format
 msgid "TIFF directory %lu ended unexpectedly."
 msgstr ""
 
-#: modules/file/gwytiff.h:484
+#: modules/file/gwytiff.h:487
 #, c-format
 msgid "BigTIFF data type %u was found in a classic TIFF."
 msgstr ""
 
-#: modules/file/gwytiff.h:501
+#: modules/file/gwytiff.h:504
 msgid "Invalid tag data positions were found."
 msgstr ""
 
-#: modules/file/gwytiff.h:874 modules/file/gwytiff.h:889
-#: modules/file/gwytiff.h:1012 modules/file/gwytiff.h:1019
+#: modules/file/gwytiff.h:877 modules/file/gwytiff.h:892
+#: modules/file/gwytiff.h:1015 modules/file/gwytiff.h:1022
 #, c-format
 msgid "Required tag %u was not found."
 msgstr ""
 
-#: modules/file/gwytiff.h:942 modules/file/gwytiff.h:986
+#: modules/file/gwytiff.h:945 modules/file/gwytiff.h:989
 #: modules/file/keyence.c:449 modules/file/matfile.c:276
 #: modules/file/matfile.c:298 modules/file/omicronflat.c:1962
 #: modules/file/princetonspe.c:339 modules/file/psia.c:352
@@ -3973,23 +4126,23 @@ msgstr ""
 msgid "File is truncated."
 msgstr ""
 
-#: modules/file/gwytiff.h:1044
+#: modules/file/gwytiff.h:1047
 msgid "Non-uniform bits per sample are unsupported."
 msgstr ""
 
-#: modules/file/gwytiff.h:1071
+#: modules/file/gwytiff.h:1074 modules/file/zeisslsm.c:973
 #, c-format
 msgid "Compression type %u is not supported."
 msgstr ""
 
-#: modules/file/gwytiff.h:1077
+#: modules/file/gwytiff.h:1080
 #, c-format
 msgid "Planar configuration %u is not supported."
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "spek"
-#: modules/file/gwytiff.h:1101
+#: modules/file/gwytiff.h:1104
 msgid "Unsupported sample format"
 msgstr "Formato de muestra no soportado"
 
@@ -4034,7 +4187,7 @@ msgstr ""
 msgid "Minizip error while reading the zip file: %s (%d)."
 msgstr ""
 
-#: modules/file/gwyzip.h:248
+#: modules/file/gwyzip.h:248 modules/file/jpkscan.c:2776
 #, c-format
 msgid "File %s is missing in the zip file."
 msgstr ""
@@ -4073,8 +4226,8 @@ msgstr ""
 msgid "Export GXYZF"
 msgstr "_Exportar"
 
-#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:238
-#: modules/file/xyzexport.c:304
+#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:241
+#: modules/file/xyzexport.c:307
 #, fuzzy
 msgid "XYZ data:"
 msgstr "Archivos de datos XYZ"
@@ -4162,11 +4315,13 @@ msgstr ""
 msgid "Representable"
 msgstr ""
 
-#: modules/file/hdrimage.cc:480 modules/tools/stats.c:203
+#: modules/file/hdrimage.cc:480 modules/graph/graph_stats.c:146
+#: modules/tools/stats.c:203
 msgid "Minimum:"
 msgstr "Mínimo:"
 
-#: modules/file/hdrimage.cc:496 modules/tools/stats.c:204
+#: modules/file/hdrimage.cc:496 modules/graph/graph_stats.c:147
+#: modules/tools/stats.c:204
 msgid "Maximum:"
 msgstr "Máximo:"
 
@@ -4187,12 +4342,12 @@ msgid "OpenEXR data type %u is invalid or unsupported."
 msgstr ""
 
 #: modules/file/hdrimage.cc:1433 modules/file/hdrimage.cc:1442
-#: modules/file/imgexport.c:5249 modules/file/imgexport.c:5260
+#: modules/file/imgexport.c:5198 modules/file/imgexport.c:5209
 #, c-format
 msgid "libpng initialization error (in %s)"
 msgstr ""
 
-#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5324
+#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5273
 msgid "libpng error occurred"
 msgstr ""
 
@@ -4214,11 +4369,6 @@ msgstr "Información de la imagen"
 msgid "Horizontal size:"
 msgstr ""
 
-#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
-#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
-msgid "px"
-msgstr "px"
-
 #: modules/file/hdrimage.cc:2252 modules/file/pixmap.c:826
 msgid "Vertical size:"
 msgstr ""
@@ -4235,10 +4385,10 @@ msgstr "Canales:"
 msgid "Pages:"
 msgstr "Páginas:"
 
-#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3043
+#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3059
 #: modules/file/pixmap.c:862 modules/file/rawfile.c:649
-#: modules/process/dimensions.h:467 modules/xyz/xyz_drift.c:774
-#: modules/xyz/xyz_raster.c:566
+#: modules/process/dimensions.h:449 modules/xyz/xyz_drift.c:774
+#: modules/xyz/xyz_raster.c:535
 msgid "Physical Dimensions"
 msgstr ""
 
@@ -4248,18 +4398,18 @@ msgstr ""
 #: modules/process/calcoefs_new.c:408 modules/process/calcoefs_new.c:475
 #: modules/process/calcoefs_simple.c:391 modules/process/calcoefs_simple.c:458
 #: modules/process/calcoefs_view.c:511 modules/process/calcoefs_view.c:549
-#: modules/process/calibrate.c:466 modules/process/calibrate.c:549
-#: modules/process/dimensions.h:161 modules/process/volumize_layers.c:259
-#: modules/volume/volume_calibrate.c:414 modules/volume/volume_calibrate.c:441
-#: modules/volume/volume_calibrate.c:468 modules/volume/volume_calibrate.c:546
+#: modules/process/calibrate.c:459 modules/process/calibrate.c:514
+#: modules/process/dimensions.h:143 modules/process/volumize_layers.c:259
+#: modules/volume/volume_calibrate.c:409 modules/volume/volume_calibrate.c:429
+#: modules/volume/volume_calibrate.c:449 modules/volume/volume_calibrate.c:498
 msgid "verb|Change"
 msgstr "Cambiar"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "cairo-clock"
 #: modules/file/hdrimage.cc:2345 modules/file/pixmap.c:907
-#: modules/file/rawfile.c:694 modules/process/crosscor.c:263
-#: modules/process/dimensions.h:477
+#: modules/file/rawfile.c:694 modules/process/crosscor.c:260
+#: modules/process/dimensions.h:459
 msgid "H_eight:"
 msgstr "A_ltura"
 
@@ -4276,16 +4426,16 @@ msgstr ""
 #: modules/file/hdrimage.cc:2557 modules/file/pixmap.c:1176
 #: modules/file/rawfile.c:1386 modules/process/calcoefs_new.c:819
 #: modules/process/calcoefs_simple.c:1197 modules/process/calcoefs_view.c:1380
-#: modules/process/calibrate.c:979 modules/process/dimensions.h:195
-#: modules/process/volumize_layers.c:315 modules/volume/volume_calibrate.c:1017
+#: modules/process/calibrate.c:1013 modules/process/dimensions.h:177
+#: modules/process/volumize_layers.c:314 modules/volume/volume_calibrate.c:957
 msgid "Change Units"
 msgstr ""
 
 #: modules/file/hdrimage.cc:2571 modules/file/pixmap.c:1190
 #: modules/file/rawfile.c:1400 modules/process/calcoefs_new.c:832
 #: modules/process/calcoefs_simple.c:1210 modules/process/calcoefs_view.c:1393
-#: modules/process/calibrate.c:993 modules/process/dimensions.h:208
-#: modules/process/volumize_layers.c:329 modules/volume/volume_calibrate.c:1031
+#: modules/process/calibrate.c:1027 modules/process/dimensions.h:190
+#: modules/process/volumize_layers.c:328 modules/volume/volume_calibrate.c:971
 msgid "New _units:"
 msgstr "Nuevas_unidades"
 
@@ -4329,209 +4479,210 @@ msgstr ""
 msgid "Field DataSize %ux%u does not match image dimensions %ux%u."
 msgstr ""
 
-#: modules/file/igorfile.c:200
+#: modules/file/igorfile.c:210
 msgid "Imports Igor binary waves (.ibw)."
 msgstr "Importa Igor binary waves (.ibw)."
 
-#: modules/file/igorfile.c:213
+#: modules/file/igorfile.c:223
 msgid "Igor binary waves (.ibw)"
 msgstr "Igor binary waves (.ibw)"
 
-#: modules/file/igorfile.c:273
+#: modules/file/igorfile.c:283
 #, c-format
 msgid "Format version is %d.  Only version 5 is supported."
 msgstr ""
 
-#: modules/file/igorfile.c:294
+#: modules/file/igorfile.c:305
 msgid "Only two-dimensional data are supported."
 msgstr ""
 
-#: modules/file/igorfile.c:306
+#: modules/file/igorfile.c:317
 #, c-format
 msgid "Number of data points %u does not match resolutions %u×%u×%u."
 msgstr ""
 
-#: modules/file/igorfile.c:320
+#: modules/file/igorfile.c:331
 #, c-format
 msgid "Data size %u does not match the number of data points %u×%u."
 msgstr ""
 
-#: modules/file/igorfile.c:358
+#: modules/file/igorfile.c:369
 msgid "Cannot read channel labels."
 msgstr ""
 
-#: modules/file/imgexport.c:392 modules/file/pixmap.c:178
+#: modules/file/imgexport.c:391 modules/file/pixmap.c:178
 msgid "Portable Network Graphics (.png)"
 msgstr "Portable Network Graphics (.png)"
 
-#: modules/file/imgexport.c:398 modules/file/pixmap.c:182
+#: modules/file/imgexport.c:397 modules/file/pixmap.c:182
 msgid "JPEG (.jpeg,.jpg)"
 msgstr "JPEG (.jpeg,.jpg)"
 
-#: modules/file/imgexport.c:404 modules/file/pixmap.c:186
+#: modules/file/imgexport.c:403 modules/file/pixmap.c:186
 msgid "TIFF (.tiff,.tif)"
 msgstr "TIFF (.tiff,.tif)"
 
-#: modules/file/imgexport.c:410 modules/file/pixmap.c:190
+#: modules/file/imgexport.c:409 modules/file/pixmap.c:190
 msgid "Portable Pixmap (.ppm,.pnm)"
 msgstr "Portable Pixmap (.ppm,.pnm)"
 
-#: modules/file/imgexport.c:416 modules/file/pixmap.c:194
+#: modules/file/imgexport.c:415 modules/file/pixmap.c:194
 msgid "Windows or OS2 Bitmap (.bmp)"
 msgstr "Windows o OS2 Bitmap (.bmp)"
 
-#: modules/file/imgexport.c:422 modules/file/pixmap.c:198
+#: modules/file/imgexport.c:421 modules/file/pixmap.c:198
 msgid "TARGA (.tga,.targa)"
 msgstr "TARGA (.tga,.targa)"
 
-#: modules/file/imgexport.c:429
+#: modules/file/imgexport.c:428
 msgid "WebP (.webp)"
 msgstr ""
 
-#: modules/file/imgexport.c:437
+#: modules/file/imgexport.c:436
 #, fuzzy
 msgid "Portable document format (.pdf)"
 msgstr "Portable Network Graphics (.png)"
 
-#: modules/file/imgexport.c:445
+#: modules/file/imgexport.c:444
 msgid "Encapsulated PostScript (.eps)"
 msgstr ""
 
-#: modules/file/imgexport.c:453
+#: modules/file/imgexport.c:452
 #, fuzzy
 msgid "Scalable Vector Graphics (.svg)"
 msgstr "Portable Network Graphics (.png)"
 
-#: modules/file/imgexport.c:463 modules/tools/selectionmanager.c:269
+#: modules/file/imgexport.c:462 modules/tools/selectionmanager.c:269
 msgid "Horiz./vert. lines"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "inkscape"
-#: modules/file/imgexport.c:467 modules/tools/selectionmanager.c:270
+#: modules/file/imgexport.c:466 modules/tools/selectionmanager.c:270
 msgid "Ellipses"
 msgstr "Elipses"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "anjuta"
-#: modules/file/imgexport.c:471 modules/tools/selectionmanager.c:272
+#: modules/file/imgexport.c:470 modules/tools/selectionmanager.c:272
 msgid "Lines"
 msgstr "Líneas"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "inkscape"
-#: modules/file/imgexport.c:479 modules/tools/selectionmanager.c:275
+#: modules/file/imgexport.c:478 modules/tools/selectionmanager.c:275
 msgid "Rectangles"
 msgstr "Rectángulos"
 
-#: modules/file/imgexport.c:483 modules/process/lat_synth.c:565
+#: modules/file/imgexport.c:482 modules/process/lat_synth.c:565
 #: modules/process/lat_synth.c:637 modules/tools/selectionmanager.c:271
 msgid "Lattice"
 msgstr ""
 
-#: modules/file/imgexport.c:487
+#: modules/file/imgexport.c:486
 msgid "Path"
 msgstr ""
 
-#: modules/file/imgexport.c:493 modules/file/imgexport.c:499
+#: modules/file/imgexport.c:492 modules/file/imgexport.c:498
 msgid "ruler|_None"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "inkscape"
-#: modules/file/imgexport.c:494
+#: modules/file/imgexport.c:493
 msgid "_Rulers"
 msgstr "_Reglas"
 
-#: modules/file/imgexport.c:495
+#: modules/file/imgexport.c:494
 msgid "_Inset scale bar"
 msgstr ""
 
-#: modules/file/imgexport.c:500
+#: modules/file/imgexport.c:499
 msgid "_False color ruler"
 msgstr ""
 
-#: modules/file/imgexport.c:504
+#: modules/file/imgexport.c:503
 msgid "title|None"
 msgstr ""
 
-#: modules/file/imgexport.c:505
+#: modules/file/imgexport.c:504
 msgid "At the top"
 msgstr ""
 
-#: modules/file/imgexport.c:506
+#: modules/file/imgexport.c:505
 msgid "Along the right edge"
 msgstr ""
 
-#: modules/file/imgexport.c:512
+#: modules/file/imgexport.c:511
 msgid ""
 "Renders data into vector (SVG, PDF, EPS) and pixmap (PNG, JPEG, TIFF, WebP, "
 "PPM, BMP, TARGA) images. Export to some formats relies on GDK and other "
 "libraries thus may be installation-dependent."
 msgstr ""
 
-#: modules/file/imgexport.c:2931
+#: modules/file/imgexport.c:2933
 msgid "Select Color"
 msgstr ""
 
-#: modules/file/imgexport.c:3002
+#: modules/file/imgexport.c:3005
+msgid "White"
+msgstr ""
+
+#: modules/file/imgexport.c:3014
 #, fuzzy
 msgid "Black"
 msgstr "Blackmann"
 
-#: modules/file/imgexport.c:3010
-msgid "White"
-msgstr ""
-
-#: modules/file/imgexport.c:3053
+#: modules/file/imgexport.c:3069
 msgid "Pi_xel size:"
 msgstr ""
 
-#: modules/file/imgexport.c:3062
+#: modules/file/imgexport.c:3077
 msgid "Pixels per _inch:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "docky"
-#: modules/file/imgexport.c:3089
+#: modules/file/imgexport.c:3102
 msgid "_Zoom:"
 msgstr "_Zoom:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "plugin_htmlbar"
-#: modules/file/imgexport.c:3108 modules/process/bdep_synth.c:430
+#: modules/file/imgexport.c:3120 modules/process/bdep_synth.c:430
 #: modules/process/col_synth.c:486 modules/process/diff_synth.c:508
-#: modules/process/domain_synth.c:510 modules/process/grain_mark.c:285
-#: modules/process/lat_synth.c:753 modules/process/obj_synth.c:575
-#: modules/process/pat_synth.c:852 modules/process/pat_synth.c:1154
-#: modules/process/pat_synth.c:1489 modules/process/tip_blind.c:340
+#: modules/process/domain_synth.c:510 modules/process/fibre_synth.c:540
+#: modules/process/grain_mark.c:284 modules/process/lat_synth.c:753
+#: modules/process/obj_synth.c:573 modules/process/pat_synth.c:853
+#: modules/process/pat_synth.c:1155 modules/process/pat_synth.c:1490
+#: modules/process/phase_synth.c:298 modules/process/tip_blind.c:342
 msgid "_Height:"
 msgstr "_Alto:"
 
-#: modules/file/imgexport.c:3121
+#: modules/file/imgexport.c:3136
 #, fuzzy
 msgid "_Font:"
 msgstr "Tipo de letra:"
 
-#: modules/file/imgexport.c:3140
+#: modules/file/imgexport.c:3145
 msgid "_Font size:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
-#: modules/file/imgexport.c:3160
+#: modules/file/imgexport.c:3163
 #, fuzzy
 msgid "O_utline thickness:"
 msgstr "G_rosor:"
 
-#: modules/file/imgexport.c:3170
+#: modules/file/imgexport.c:3172
 #, fuzzy
 msgid "_Border width:"
 msgstr "Nueva _anchura:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "banshee"
-#: modules/file/imgexport.c:3180
+#: modules/file/imgexport.c:3181
 #, fuzzy
 msgid "_Tick length:"
 msgstr "longitud"
@@ -4555,258 +4706,259 @@ msgstr "Color"
 msgid "_Line and text color:"
 msgstr ""
 
-#: modules/file/imgexport.c:3221
+#: modules/file/imgexport.c:3220
 msgid "_Transparent background"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
-#: modules/file/imgexport.c:3232
+#: modules/file/imgexport.c:3231
 #, fuzzy
 msgid "_Background color:"
 msgstr "Fondo"
 
-#: modules/file/imgexport.c:3474
-#, fuzzy
-msgid "Lateral scale"
-msgstr "Material GL"
-
-#: modules/file/imgexport.c:3487 modules/process/lno_synth.c:1053
-msgid "_Length:"
-msgstr ""
-
-# Translation for this string generated by http://littlesvr.ca/ostd/
-# based on translation from "gimp"
-#: modules/file/imgexport.c:3503
-msgid "_Auto"
-msgstr "_Auto"
-
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
-#: modules/file/imgexport.c:3511 modules/process/pat_synth.c:469
+#: modules/file/imgexport.c:3433 modules/process/fibre_synth.c:582
+#: modules/process/pat_synth.c:470
 msgid "Placement"
 msgstr "Colocación"
 
-#: modules/file/imgexport.c:3515
+#: modules/file/imgexport.c:3437
 msgid "left"
 msgstr "izquierda"
 
-#: modules/file/imgexport.c:3519
+#: modules/file/imgexport.c:3440
 msgid "center"
 msgstr "centro"
 
-#: modules/file/imgexport.c:3523
+#: modules/file/imgexport.c:3443
 msgid "right"
 msgstr "derecha"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "bluefish"
-#: modules/file/imgexport.c:3528
+#: modules/file/imgexport.c:3448
 msgid "top"
 msgstr "arriba"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "bluefish"
-#: modules/file/imgexport.c:3540
+#: modules/file/imgexport.c:3456
 msgid "bottom"
 msgstr "abajo"
 
-#: modules/file/imgexport.c:3552 modules/file/imgexport.c:3874
+#: modules/file/imgexport.c:3479
+#, fuzzy
+msgid "Lateral scale"
+msgstr "Material GL"
+
+#: modules/file/imgexport.c:3496 modules/process/lno_synth.c:1053
+msgid "_Length:"
+msgstr ""
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "gimp"
+#: modules/file/imgexport.c:3502
+msgid "_Auto"
+msgstr "_Auto"
+
+#: modules/file/imgexport.c:3519 modules/file/imgexport.c:3832
 #, fuzzy
 msgid "Hori_zontal gap:"
 msgstr "Horizontal"
 
-#: modules/file/imgexport.c:3558 modules/file/imgexport.c:3854
+#: modules/file/imgexport.c:3526 modules/file/imgexport.c:3812
 #, fuzzy
 msgid "_Vertical gap:"
 msgstr "_Verticalmente:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
-#: modules/file/imgexport.c:3571 modules/file/imgexport.c:4184
+#: modules/file/imgexport.c:3538 modules/file/imgexport.c:4134
 #, fuzzy
 msgid "Colo_r:"
 msgstr "Color:"
 
-#: modules/file/imgexport.c:3576 modules/file/imgexport.c:4189
+#: modules/file/imgexport.c:3542 modules/file/imgexport.c:4138
 msgid "Out_line color:"
 msgstr ""
 
-#: modules/file/imgexport.c:3580 modules/file/imgexport.c:4195
+#: modules/file/imgexport.c:3547 modules/file/imgexport.c:4143
 msgid "O_pacity:"
 msgstr ""
 
-#: modules/file/imgexport.c:3589
+#: modules/file/imgexport.c:3554
 msgid "Draw _ticks"
 msgstr ""
 
-#: modules/file/imgexport.c:3599
+#: modules/file/imgexport.c:3564
 msgid "Draw _label"
 msgstr ""
 
-#: modules/file/imgexport.c:3609
+#: modules/file/imgexport.c:3574
 msgid "Draw text _above scale bar"
 msgstr ""
 
-#: modules/file/imgexport.c:3773
+#: modules/file/imgexport.c:3738
 msgid "Image"
 msgstr ""
 
-#: modules/file/imgexport.c:3777 modules/process/calcoefs_view.c:473
-#: modules/process/correct_affine.c:488 modules/process/drift.c:297
-#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:202
-#: modules/process/fft_filter_1d.c:294 modules/process/fft_profile.c:292
-#: modules/process/fractal.c:253 modules/process/nanoindent_adjust.c:229
-#: modules/process/polydistort.c:247 modules/process/rotate.c:274
-#: modules/process/scale.c:253 modules/process/straighten_path.c:271
+#: modules/file/imgexport.c:3742 modules/process/calcoefs_view.c:473
+#: modules/process/correct_affine.c:538 modules/process/drift.c:298
+#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:203
+#: modules/process/fft_filter_1d.c:296 modules/process/fft_profile.c:293
+#: modules/process/fractal.c:262 modules/process/nanoindent_adjust.c:229
+#: modules/process/polydistort.c:250 modules/process/rotate.c:274
+#: modules/process/scale.c:257 modules/process/straighten_path.c:270
 #: modules/process/unrotate.c:277 modules/tools/linestats.c:400
-#: modules/tools/profile.c:555 modules/tools/roughness.c:864
-#: modules/tools/sfunctions.c:468 modules/xyz/xyz_raster.c:632
+#: modules/tools/profile.c:552 modules/tools/roughness.c:879
+#: modules/tools/sfunctions.c:481 modules/xyz/xyz_raster.c:601
 msgid "_Interpolation type:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "orage"
-#: modules/file/imgexport.c:3807
+#: modules/file/imgexport.c:3772
 #, fuzzy
 msgid "Draw _frame"
 msgstr "Mostrar _marco"
 
-#: modules/file/imgexport.c:3816
+#: modules/file/imgexport.c:3781
 msgid "Draw _mask"
 msgstr ""
 
-#: modules/file/imgexport.c:3826
+#: modules/file/imgexport.c:3791
 msgid "Draw mask _legend"
 msgstr ""
 
-#: modules/file/imgexport.c:3861
+#: modules/file/imgexport.c:3819
 msgid "Value Scale"
 msgstr ""
 
-#: modules/file/imgexport.c:3882
+#: modules/file/imgexport.c:3840
 msgid "Fi_xed precision:"
 msgstr ""
 
-#: modules/file/imgexport.c:3898
+#: modules/file/imgexport.c:3855
 #, fuzzy
 msgid "Fixed _kilo threshold:"
 msgstr "_Umbral:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "plugin_htmlbar"
-#: modules/file/imgexport.c:3914 modules/file/imgexport.c:4635
+#: modules/file/imgexport.c:3869 modules/file/imgexport.c:4583
 #, fuzzy
 msgid "Title"
 msgstr "_Título:"
 
-#: modules/file/imgexport.c:3918
+#: modules/file/imgexport.c:3877
 #, fuzzy
 msgid "Posi_tion:"
 msgstr "Posición:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "po"
-#: modules/file/imgexport.c:3934
+#: modules/file/imgexport.c:3884
 #, fuzzy
 msgid "_Gap:"
 msgstr "Intervalo:"
 
-#: modules/file/imgexport.c:3941
+#: modules/file/imgexport.c:3891
 msgid "Put _units to title"
 msgstr ""
 
-#: modules/file/imgexport.c:4125
+#: modules/file/imgexport.c:4075
 msgid "Draw _selection"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "celestia"
-#: modules/file/imgexport.c:4176 modules/tools/selectionmanager.c:361
+#: modules/file/imgexport.c:4126 modules/tools/selectionmanager.c:361
 msgid "Objects"
 msgstr "Objetos"
 
-#: modules/file/imgexport.c:4615
+#: modules/file/imgexport.c:4563
 #, fuzzy
 msgid "Lateral"
 msgstr "Material GL"
 
-#: modules/file/imgexport.c:4654 modules/file/rawfile.c:1040
-#: modules/process/calcoefs_load.c:230 modules/process/neural.c:693
+#: modules/file/imgexport.c:4602 modules/file/rawfile.c:1040
+#: modules/process/calcoefs_load.c:230 modules/process/neural.c:700
 msgid "verb|_Load"
 msgstr "_Cargar"
 
-#: modules/file/imgexport.c:4660 modules/file/rawfile.c:1046
-#: modules/process/neural.c:699
+#: modules/file/imgexport.c:4608 modules/file/rawfile.c:1046
+#: modules/process/neural.c:706
 msgid "verb|_Store"
 msgstr "_Archivar"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "anjuta"
-#: modules/file/imgexport.c:4666 modules/file/rawfile.c:1052
-#: modules/process/neural.c:705
+#: modules/file/imgexport.c:4614 modules/file/rawfile.c:1052
+#: modules/process/neural.c:712
 msgid "_Rename"
 msgstr "_Renombrar"
 
-#: modules/file/imgexport.c:4686 modules/file/rawfile.c:1071
+#: modules/file/imgexport.c:4634 modules/file/rawfile.c:1071
 msgid "Preset _name:"
 msgstr ""
 
-#: modules/file/imgexport.c:4757
+#: modules/file/imgexport.c:4705
 #, c-format
 msgid "Export %s"
 msgstr ""
 
-#: modules/file/imgexport.c:4778
+#: modules/file/imgexport.c:4727
 msgid "Export as 1_6 bit grayscale"
 msgstr ""
 
-#: modules/file/imgexport.c:4801
+#: modules/file/imgexport.c:4750
 msgid "Lateral Scale"
 msgstr ""
 
-#: modules/file/imgexport.c:4806
+#: modules/file/imgexport.c:4755
 #, fuzzy
 msgid "Values"
 msgstr "Valor"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "aptitude"
-#: modules/file/imgexport.c:4811
+#: modules/file/imgexport.c:4760
 #, fuzzy
 msgid "Selection"
 msgstr "Sección: "
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "audacious-plugins"
-#: modules/file/imgexport.c:4816 modules/file/rawfile.c:462
+#: modules/file/imgexport.c:4765 modules/file/rawfile.c:462
 #: modules/process/convolution_filter.c:275
 msgid "Presets"
 msgstr "Predefinidos"
 
-#: modules/file/imgexport.c:5576
+#: modules/file/imgexport.c:5525
 #, c-format
 msgid "Cairo error occurred: %s"
 msgstr ""
 
-#: modules/file/imgexport.c:5600
+#: modules/file/imgexport.c:5549
 #, c-format
 msgid "Pixbuf save failed: %s."
 msgstr ""
 
-#: modules/file/imgexport.c:5878
+#: modules/file/imgexport.c:5827
 msgid "Image is too large to be stored as TARGA."
 msgstr ""
 
-#: modules/file/imgexport.c:6457 modules/file/imgexport.c:6486
+#: modules/file/imgexport.c:6406 modules/file/imgexport.c:6435
 msgid "Draw _numbers"
 msgstr ""
 
-#: modules/file/imgexport.c:6469 modules/file/imgexport.c:6517
+#: modules/file/imgexport.c:6418 modules/file/imgexport.c:6466
 msgid "_End marker length:"
 msgstr ""
 
-#: modules/file/imgexport.c:6498
+#: modules/file/imgexport.c:6447
 #, fuzzy
 msgid "Marker _radius:"
 msgstr "Radio medio"
@@ -4848,45 +5000,56 @@ msgstr ""
 msgid "image depth"
 msgstr ""
 
-#: modules/file/iso28600.c:534
+#: modules/file/iso28600.c:543
 msgid "Imports and exports ISO 28600:2011 SPM data transfer format."
 msgstr ""
 
-#: modules/file/iso28600.c:550
+#: modules/file/iso28600.c:559
 msgid "ISO 28600:2011 SPM data transfer files (.spm)"
 msgstr ""
 
-#: modules/file/iso28600.c:606
+#: modules/file/iso28600.c:658
 #, c-format
-msgid "Only regular mappings are implemented but file has mapping type ‘%s’."
+msgid ""
+"Only regular and irregular mappings are implemented but the file has mapping "
+"type ‘%s’."
 msgstr ""
 
-#: modules/file/iso28600.c:668 modules/file/iso28600.c:677
-#: modules/file/iso28600.c:686
+#: modules/file/iso28600.c:687 modules/file/iso28600.c:696
+#: modules/file/iso28600.c:705
 #, c-format
 msgid "List ‘%s’ has %u items which differs from the number %u given by ‘%s’."
 msgstr ""
 
-#: modules/file/iso28600.c:755 modules/file/iso28600.c:867
-#: modules/file/sdfile.c:846 modules/file/sdfile.c:863
-#: modules/file/spip-asc.c:239 modules/file/witec-asc.c:223
-#: modules/file/wsffile.c:215
+#: modules/file/iso28600.c:775
 #, c-format
-msgid "End of file reached when reading sample #%d of %d"
+msgid "End of file reached when reading sample #%u of %u"
 msgstr ""
 
-#: modules/file/iso28600.c:764 modules/file/iso28600.c:876
-#: modules/file/spip-asc.c:246 modules/file/witec-asc.c:230
-#: modules/file/wsffile.c:222
+#: modules/file/iso28600.c:784 modules/file/iso28600.c:873
 #, c-format
-msgid "Malformed data encountered when reading sample #%d of %d"
+msgid "Malformed data encountered when reading sample #%u"
 msgstr ""
 
-#: modules/file/iso28600.c:774 modules/file/iso28600.c:886
+#: modules/file/iso28600.c:797 modules/file/iso28600.c:887
+#: modules/file/iso28600.c:1022
 msgid "Missing end-of-data marker."
 msgstr ""
 
-#: modules/file/iso28600.c:1048
+#: modules/file/iso28600.c:1003 modules/file/sdfile.c:846
+#: modules/file/sdfile.c:863 modules/file/spip-asc.c:239
+#: modules/file/witec-asc.c:223 modules/file/wsffile.c:215
+#, c-format
+msgid "End of file reached when reading sample #%d of %d"
+msgstr ""
+
+#: modules/file/iso28600.c:1012 modules/file/spip-asc.c:246
+#: modules/file/witec-asc.c:230 modules/file/wsffile.c:222
+#, c-format
+msgid "Malformed data encountered when reading sample #%d of %d"
+msgstr ""
+
+#: modules/file/iso28600.c:1184
 #, c-format
 msgid "Line %u does not contain mandatory label ‘%s’."
 msgstr ""
@@ -4903,44 +5066,62 @@ msgstr "Archivos JEOL data (.tif)"
 msgid "The type of data is unknown.  Please report it to the developers."
 msgstr ""
 
-#: modules/file/jpkscan.c:229
+#: modules/file/jpkscan.c:292
 msgid "Imports JPK image scans."
 msgstr "Importa JPK imágenes."
 
-#: modules/file/jpkscan.c:242
+#: modules/file/jpkscan.c:305
 #, fuzzy
 msgid "JPK image scans (.jpk, .jpk-qi-image)"
 msgstr "Imágenes JPK (.jpk)"
 
-#: modules/file/jpkscan.c:249
+#: modules/file/jpkscan.c:312
 msgid "JPK force curves (.jpk-force, .jpk-force-map, .jpk-qi-data)"
 msgstr ""
 
-#: modules/file/jpkscan.c:315
+#: modules/file/jpkscan.c:378
 msgid "File does not contain grid dimensions."
 msgstr ""
 
-#: modules/file/jpkscan.c:660 modules/file/nanoobserver.c:193
+#: modules/file/jpkscan.c:736 modules/file/nanoobserver.c:360
 #: modules/file/nanoscantech.c:205 modules/file/opengps.c:209
 #: modules/file/sensofarx.c:183 modules/file/spmxfile.c:166
 msgid "Minizip cannot open the file as a ZIP file."
 msgstr ""
 
-#: modules/file/jpkscan.c:739
+#: modules/file/jpkscan.c:758 modules/file/jpkscan.c:2717
+#, c-format
+msgid "Scanning file (%u curves)..."
+msgstr ""
+
+#: modules/file/jpkscan.c:798 modules/file/nmmxyz.c:299
+msgid "Reading files..."
+msgstr ""
+
+#: modules/file/jpkscan.c:816
+msgid "Creating volume data..."
+msgstr ""
+
+#: modules/file/jpkscan.c:968
 msgid "Non-uniform point and/or segment numbering is not supported."
 msgstr ""
 
-#: modules/file/jpkscan.c:748
+#: modules/file/jpkscan.c:977
 msgid "Non-uniform channel lists are not supported."
 msgstr ""
 
-#: modules/file/jpkscan.c:756
+#: modules/file/jpkscan.c:985
 #, c-format
 msgid "Data file %s was found instead of expected %s."
 msgstr ""
 
-#: modules/file/jpkscan.c:1497
-msgid "Cannot find any height channel."
+#: modules/file/jpkscan.c:1900
+#, c-format
+msgid "Header properties file for index %u is missing."
+msgstr ""
+
+#: modules/file/jpkscan.c:2519
+msgid "Cannot find any height channel."
 msgstr ""
 
 #: modules/file/jspmfile.c:188
@@ -5092,19 +5273,19 @@ msgstr "Archivos MetroPro (.dat)"
 msgid "File header is larger than file."
 msgstr ""
 
-#: modules/file/microprof.c:117
+#: modules/file/microprof.c:125
 msgid "Imports MicroProf FRT profilometer data files."
 msgstr "Importa MicroProf FRT profilometer archivos de datos."
 
-#: modules/file/microprof.c:130
+#: modules/file/microprof.c:138
 msgid "MicroProf FRT files (.frt)"
 msgstr "Archivos MicroProf FRT (.frt)"
 
-#: modules/file/microprof.c:136
+#: modules/file/microprof.c:144
 msgid "MicroProf FRT text files (.txt)"
 msgstr "Archivos MicroProf FRT texto (.txt)"
 
-#: modules/file/microprof.c:432
+#: modules/file/microprof.c:519
 msgid "File contains fewer than XSize*YSize data points."
 msgstr ""
 
@@ -5192,8 +5373,8 @@ msgstr ""
 msgid "Spectra data starts past the end of file."
 msgstr ""
 
-#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:276
-#: modules/file/renishaw.c:1325 modules/file/sensofar.c:256
+#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:287
+#: modules/file/renishaw.c:1334 modules/file/sensofar.c:256
 #: modules/file/witec-asc.c:161
 msgid "File header is truncated"
 msgstr ""
@@ -5203,8 +5384,8 @@ msgstr ""
 msgid "Parameter header is truncated"
 msgstr ""
 
-#: modules/file/nanoeducator.c:932 modules/process/curvature.c:454
-#: modules/tools/profile.c:1107
+#: modules/file/nanoeducator.c:932 modules/process/curvature.c:456
+#: modules/tools/profile.c:1090
 #, c-format
 msgid "Profile %d"
 msgstr ""
@@ -5284,23 +5465,29 @@ msgstr ""
 msgid "Missing data start marker \\x1a\\x04."
 msgstr ""
 
-#: modules/file/nanoobserver.c:113
-msgid "Reads NanoObserver .nao files."
+#: modules/file/nanoobserver.c:201
+#, fuzzy
+msgid "Reads Nano-Solution/NanoObserver .nao files."
 msgstr "Importa NanoObserver .nao archivos."
 
-#: modules/file/nanoobserver.c:126
-msgid "NanoObserver data (.nao)"
+#: modules/file/nanoobserver.c:214
+#, fuzzy
+msgid "Nano-Solution/NanoObserver data (.nao)"
 msgstr "Datos NanoObserver (.nao)"
 
-#: modules/file/nanoscan.c:188
+#: modules/file/nanoobserver.c:410 modules/file/renishaw.c:1420
+msgid "Data block is truncated"
+msgstr ""
+
+#: modules/file/nanoscan.c:191
 msgid "Imports NanoScan XML files."
 msgstr "Importa NanoScan XML archivos."
 
-#: modules/file/nanoscan.c:201
+#: modules/file/nanoscan.c:204
 msgid "NanoScan XML files (.xml)"
 msgstr "Archivos NanoScan XML (.xml)"
 
-#: modules/file/nanoscan.c:910
+#: modules/file/nanoscan.c:937
 msgid "Wrong size of Base64 encoded data."
 msgstr ""
 
@@ -5320,22 +5507,22 @@ msgstr "Importa Digital Instruments Nanoscope II archivos de datos."
 msgid "Nanoscope II files"
 msgstr "Nanoscope II archivos"
 
-#: modules/file/nanoscope.c:207
+#: modules/file/nanoscope.c:212
 msgid ""
 "Imports Veeco (Digital Instruments) Nanoscope data files, version 3 or newer."
 msgstr ""
 "Importa Veeco (Digital Instruments) Nanoscope archivos de datos, versión 3 o "
 "más nueva."
 
-#: modules/file/nanoscope.c:221
+#: modules/file/nanoscope.c:226
 msgid "Nanoscope III files"
 msgstr "Nanoscope III archivos"
 
-#: modules/file/nanoscope.c:288
+#: modules/file/nanoscope.c:295
 msgid "File is not a Nanoscope file, or it is a unknown subtype."
 msgstr ""
 
-#: modules/file/nanoscope.c:295
+#: modules/file/nanoscope.c:302
 msgid ""
 "File has been damaged by change of line endings, resulting in corruption of "
 "the binary part of the file.\n"
@@ -5346,16 +5533,16 @@ msgid ""
 "transfer that attempts to store text platform-independently."
 msgstr ""
 
-#: modules/file/nanoscope.c:653 modules/file/nanoscope.c:669
+#: modules/file/nanoscope.c:660 modules/file/nanoscope.c:676
 msgid "Cannot parse `Scan size' field."
 msgstr ""
 
-#: modules/file/nanoscope.c:1539 modules/file/nrrdfile.c:1086
+#: modules/file/nanoscope.c:1546 modules/file/nrrdfile.c:1086
 #, c-format
 msgid "Garbage after data sample #%u."
 msgstr ""
 
-#: modules/file/nanoscope.c:1595
+#: modules/file/nanoscope.c:1602
 msgid "Truncated header line."
 msgstr ""
 
@@ -5434,11 +5621,8 @@ msgstr "Archivos Nanonis SXM (.sxm)"
 msgid "Nano Measuring Machine data import must be run as interactive."
 msgstr "La importación de gráfico ASCII  debe ser ejecutado como interactivo."
 
-#: modules/file/nmmxyz.c:299
-msgid "Reading files..."
-msgstr ""
-
 #: modules/file/nmmxyz.c:306 modules/process/lat_synth.c:1224
+#: modules/process/wave_synth.c:798
 msgid "Rendering surface..."
 msgstr ""
 
@@ -5481,20 +5665,20 @@ msgstr ""
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "data"
 #: modules/file/nmmxyz.c:534 modules/file/rawfile.c:626
-#: modules/process/dimensions.h:445 modules/xyz/xyz_drift.c:725
-#: modules/xyz/xyz_raster.c:517
+#: modules/process/dimensions.h:427 modules/xyz/xyz_drift.c:725
+#: modules/xyz/xyz_raster.c:376
 msgid "Resolution"
 msgstr "Resolución"
 
 #: modules/file/nmmxyz.c:538 modules/file/rawfile.c:631
-#: modules/process/dimensions.h:451 modules/xyz/xyz_drift.c:729
-#: modules/xyz/xyz_raster.c:521
+#: modules/process/dimensions.h:433 modules/xyz/xyz_drift.c:729
+#: modules/xyz/xyz_raster.c:382
 msgid "_Horizontal size:"
 msgstr ""
 
 #: modules/file/nmmxyz.c:554 modules/file/rawfile.c:638
-#: modules/process/dimensions.h:454 modules/xyz/xyz_drift.c:744
-#: modules/xyz/xyz_raster.c:536
+#: modules/process/dimensions.h:436 modules/xyz/xyz_drift.c:744
+#: modules/xyz/xyz_raster.c:388
 msgid "_Vertical size:"
 msgstr ""
 
@@ -5579,38 +5763,38 @@ msgstr ""
 msgid "Per-axis header field %s contains too few items."
 msgstr ""
 
-#: modules/file/nt-mdt.c:843
+#: modules/file/nt-mdt.c:850
 msgid "Imports NT-MDT data files."
 msgstr "Importa NT-MDT archivos de datos."
 
-#: modules/file/nt-mdt.c:856
+#: modules/file/nt-mdt.c:863
 msgid "NT-MDT files (.mdt)"
 msgstr "Archivos NT-MDT (.mdt)"
 
-#: modules/file/nt-mdt.c:1491 modules/file/nt-mdt.c:1599
+#: modules/file/nt-mdt.c:1498 modules/file/nt-mdt.c:1606
 msgid "Frame is too short for Frame Mode."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1506 modules/file/nt-mdt.c:1614
+#: modules/file/nt-mdt.c:1513 modules/file/nt-mdt.c:1621
 msgid "Frame is too short for dots or data."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1869
+#: modules/file/nt-mdt.c:1879
 #, c-format
 msgid "End of file reached in frame header #%u."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1877
+#: modules/file/nt-mdt.c:1887
 #, c-format
 msgid "End of file reached in frame data #%u."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1910
+#: modules/file/nt-mdt.c:1920
 #, c-format
 msgid "Frame #%u is too short for scanned data header."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1927
+#: modules/file/nt-mdt.c:1937
 #, c-format
 msgid "Frame #%u is too short for spectroscopy data header."
 msgstr ""
@@ -5725,28 +5909,28 @@ msgstr "Archivos Omicron MATRIX (param.mtrx & data.mtrx)"
 msgid "Omicron MATRIX (.mtrx & .mtrx)"
 msgstr "Archivos Omicron MATRIX (.mtrx & .mtrx)"
 
-#: modules/file/opdfile.c:188
+#: modules/file/opdfile.c:199
 msgid "Imports Wyko OPD and ASC files."
 msgstr "Importa Wyko OPD y ASC archivos."
 
-#: modules/file/opdfile.c:201
+#: modules/file/opdfile.c:212
 msgid "Wyko OPD files (.opd)"
 msgstr "Archivos Wyko OPD (.opd)"
 
-#: modules/file/opdfile.c:208
+#: modules/file/opdfile.c:219
 msgid "Wyko ASCII export files (.asc)"
 msgstr "Archivos Wyko ASCII (.asc)"
 
-#: modules/file/opdfile.c:299
+#: modules/file/opdfile.c:310
 #, c-format
 msgid "Item `%s' is beyond the end of the file."
 msgstr ""
 
-#: modules/file/opdfile.c:614
+#: modules/file/opdfile.c:636
 msgid "Nested directories found"
 msgstr ""
 
-#: modules/file/opdfile.c:805
+#: modules/file/opdfile.c:842
 #, c-format
 msgid "Truncated data in block %s"
 msgstr ""
@@ -6044,19 +6228,21 @@ msgstr ""
 # based on translation from "anjuta"
 #: modules/file/rawfile.c:567 modules/process/arithmetic.c:234
 #: modules/process/calcoefs_view.c:320 modules/process/coerce.c:250
-#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:637
+#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:638
 #: modules/process/drift.c:242 modules/process/edge.c:635
-#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:183
-#: modules/process/grain_edge.c:210 modules/process/grain_filter.c:313
-#: modules/process/grain_mark.c:244 modules/process/grain_wshed.c:164
-#: modules/process/mark_disconn.c:205 modules/process/mark_with.c:195
-#: modules/process/polydistort.c:205 modules/process/scars.c:295
-#: modules/process/slope_dist.c:273 modules/process/straighten_path.c:198
-#: modules/process/synth.h:509 modules/process/tip_model.c:166
+#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:184
+#: modules/process/fractal.c:225 modules/process/grain_edge.c:209
+#: modules/process/grain_filter.c:312 modules/process/grain_mark.c:243
+#: modules/process/grain_wshed.c:165 modules/process/mark_disconn.c:205
+#: modules/process/mark_with.c:196 modules/process/mfm_field.c:278
+#: modules/process/mfm_shift.c:167 modules/process/polydistort.c:205
+#: modules/process/scars.c:314 modules/process/slope_dist.c:272
+#: modules/process/stitch.c:272 modules/process/straighten_path.c:198
+#: modules/process/synth.h:538 modules/process/tip_model.c:164
 #: modules/process/wpour_mark.c:273 modules/tools/linestats.c:454
-#: modules/tools/sfunctions.c:534 modules/tools/stats.c:459
-#: modules/volume/volume_extract.c:328 modules/volume/volume_linestat.c:287
-#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:443
+#: modules/tools/sfunctions.c:531 modules/tools/stats.c:456
+#: modules/volume/volume_extract.c:321 modules/volume/volume_linestat.c:292
+#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:457
 msgid "_Update"
 msgstr "_Actualizar"
 
@@ -6210,7 +6396,7 @@ msgid ""
 "The contents of `%s' does not match format: %s."
 msgstr ""
 
-#: modules/file/rawfile.c:1690 modules/process/neural.c:1580
+#: modules/file/rawfile.c:1690 modules/process/neural.c:1587
 #, c-format
 msgid "The name `%s' is invalid."
 msgstr ""
@@ -6305,7 +6491,8 @@ msgstr "Archivos de datos XYZ"
 msgid "Import XYZ Data"
 msgstr "Importa datos XYZ"
 
-#: modules/file/rawxyz.c:279
+#: modules/file/rawxyz.c:279 modules/graph/graph_stats.c:305
+#: modules/graph/graph_stats.c:756 modules/graph/graph_stats.c:800
 #, fuzzy
 msgid "Number of points:"
 msgstr "_Número de Lados:"
@@ -6335,7 +6522,7 @@ msgstr "Rango:"
 msgid "_Lateral units:"
 msgstr ""
 
-#: modules/file/rawxyz.c:386 modules/process/dimensions.h:494
+#: modules/file/rawxyz.c:386 modules/process/dimensions.h:479
 msgid "_Value units:"
 msgstr ""
 
@@ -6353,18 +6540,14 @@ msgstr "Archivos Intematix SDF data (.sdf)"
 msgid "MapArea block is truncated"
 msgstr ""
 
-#: modules/file/renishaw.c:787
+#: modules/file/renishaw.c:793
 msgid "Random points order unsupported"
 msgstr ""
 
-#: modules/file/renishaw.c:1396
+#: modules/file/renishaw.c:1405
 msgid "Block header is truncated"
 msgstr ""
 
-#: modules/file/renishaw.c:1411
-msgid "Data block is truncated"
-msgstr ""
-
 #: modules/file/rhk-sm3.c:236
 msgid "Imports RHK Technology SM3 data files."
 msgstr "Importa RHK Technology SM3 archivos de datos."
@@ -6631,19 +6814,23 @@ msgstr ""
 msgid "SPML files (.xml)"
 msgstr "Archivos SPML (.xml)"
 
-#: modules/file/spmlab.c:131
+#: modules/file/spmlab.c:175
 msgid "Imports Thermicroscopes SpmLab R3 to R7 data files."
 msgstr "Importa Thermicroscopes SpmLab desde R3 a R7 archivos de datos."
 
-#: modules/file/spmlab.c:144
+#: modules/file/spmlab.c:188
 msgid "Thermicroscopes SpmLab files"
 msgstr "Archivos Thermicroscopes SpmLab"
 
-#: modules/file/spmlab.c:231
+#: modules/file/spmlab.c:259
 #, c-format
 msgid "Unknown format version %c."
 msgstr ""
 
+#: modules/file/spmlab.c:283
+msgid "Data block is truncated."
+msgstr ""
+
 #: modules/file/spmlabf.c:79
 msgid "Imports SPMLab floating-point files."
 msgstr ""
@@ -6842,11 +7029,11 @@ msgstr "Importa WinSTM (.stm) archivos."
 msgid "WinSTM files (.stm)"
 msgstr "Archivos WinSTM (.stm)"
 
-#: modules/file/wipfile.c:272
+#: modules/file/wipfile.c:281
 msgid "Imports WItec Project data files."
 msgstr "Importa WItec Project archivos de datos."
 
-#: modules/file/wipfile.c:285
+#: modules/file/wipfile.c:294
 msgid "WItec Project files (.wip)"
 msgstr "WItec Project (.wip)"
 
@@ -6909,25 +7096,25 @@ msgstr "Exporta datos de gráfico a archivos de texto. "
 msgid "XYZ text data (.xyz)"
 msgstr ""
 
-#: modules/file/xyzexport.c:244
+#: modules/file/xyzexport.c:247
 #, fuzzy
 msgid "Lateral units:"
 msgstr "Material GL"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "almanah"
-#: modules/file/xyzexport.c:290
+#: modules/file/xyzexport.c:293
 #, fuzzy
 msgid "Export XYZ"
 msgstr "_Exportar"
 
-#: modules/file/xyzexport.c:340 modules/process/curvature.c:704
+#: modules/file/xyzexport.c:343 modules/process/curvature.c:700
 #: modules/process/entropy.c:214 modules/process/facet-level.c:207
-#: modules/process/fit-shape.c:743 modules/process/level.c:259
-#: modules/process/linematch.c:906 modules/process/neural.c:593
-#: modules/process/polylevel.c:491 modules/process/slope_dist.c:418
-#: modules/tools/filter.c:300 modules/tools/linestats.c:436
-#: modules/tools/profile.c:591 modules/tools/sfunctions.c:516
+#: modules/process/fit-shape.c:755 modules/process/level.c:259
+#: modules/process/linematch.c:869 modules/process/neural.c:597
+#: modules/process/polylevel.c:494 modules/process/slope_dist.c:411
+#: modules/tools/filter.c:301 modules/tools/linestats.c:436
+#: modules/tools/profile.c:572 modules/tools/sfunctions.c:513
 #: modules/tools/stats.c:389
 msgid "Masking Mode"
 msgstr ""
@@ -6940,6 +7127,16 @@ msgstr "Importa Carl Zeiss SEM imágenes."
 msgid "Carl Zeiss SEM scans (.tif)"
 msgstr ""
 
+#: modules/file/zeisslsm.c:383
+#, fuzzy
+msgid "Imports Carl Zeiss CLSM images."
+msgstr "Importa Carl Zeiss SEM imágenes."
+
+#: modules/file/zeisslsm.c:396
+#, fuzzy
+msgid "Carl Zeiss CLSM images (.lsm)"
+msgstr "Importa Carl Zeiss SEM imágenes."
+
 #: modules/file/zemax.c:72
 msgid "Imports Zemax grid sag data files."
 msgstr ""
@@ -6962,16 +7159,16 @@ msgstr ""
 msgid "The first line contains too many items."
 msgstr ""
 
-#: modules/graph/graph_align.c:57
+#: modules/graph/graph_align.c:60
 #, fuzzy
 msgid "Aligns graph curves."
 msgstr "Nivela curvas de gráfico"
 
-#: modules/graph/graph_align.c:71
+#: modules/graph/graph_align.c:74
 msgid "/_Align"
 msgstr ""
 
-#: modules/graph/graph_align.c:74
+#: modules/graph/graph_align.c:77
 #, fuzzy
 msgid "Align curves"
 msgstr "Nivela curvas de gráfico"
@@ -6988,54 +7185,56 @@ msgstr ""
 msgid "Fit critical dimension"
 msgstr ""
 
-#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:267
+#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:270
 msgid "Fit Graph"
 msgstr "Aproxima Gráfico"
 
-#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:251
-#: modules/graph/graph_fit.c:270 modules/process/fit-shape.c:393
+#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:254
+#: modules/graph/graph_fit.c:273 modules/process/fit-shape.c:394
 #: modules/volume/volume_fdfit.c:299
 msgid "verb|_Fit"
 msgstr "_Ajustar"
 
-#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:166
-#: modules/graph/graph_fdfit.c:306 modules/graph/graph_fit.c:325
-#: modules/graph/graph_peaks.c:199
+#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:168
+#: modules/graph/graph_fdfit.c:313 modules/graph/graph_fit.c:332
+#: modules/graph/graph_peaks.c:199 modules/graph/graph_stats.c:268
 msgid "_Graph curve:"
 msgstr "_Curva de Gráfico:"
 
-#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:320
-#: modules/graph/graph_fit.c:339 modules/volume/volume_fdfit.c:405
+#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:327
+#: modules/graph/graph_fit.c:346 modules/volume/volume_fdfit.c:389
 msgid "F_unction:"
 msgstr "F_unción:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "beast"
-#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:361
-#: modules/graph/graph_fit.c:375 modules/process/curvature.c:745
-#: modules/process/fit-shape.c:792 modules/volume/volume_fdfit.c:446
+#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:368
+#: modules/graph/graph_fit.c:382 modules/process/curvature.c:742
+#: modules/process/fit-shape.c:804 modules/volume/volume_fdfit.c:422
 msgid "Parameter"
 msgstr "Parámetro"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "advene"
-#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:363
-#: modules/graph/graph_fit.c:377 modules/process/fit-shape.c:794
-#: modules/volume/volume_fdfit.c:448
+#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:370
+#: modules/graph/graph_fit.c:384 modules/process/fit-shape.c:806
+#: modules/volume/volume_fdfit.c:424
 msgid "Error"
 msgstr "Error"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "beast"
-#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:196
-#: modules/graph/graph_fdfit.c:415 modules/graph/graph_fit.c:433
-#: modules/volume/volume_fdfit.c:500 modules/volume/volume_linestat.c:389
+#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:189
+#: modules/graph/graph_fdfit.c:422 modules/graph/graph_fit.c:440
+#: modules/graph/graph_stats.c:279 modules/graph/graph_stats.c:793
+#: modules/volume/volume_fdfit.c:476 modules/volume/volume_linestat.c:394
 msgid "Range:"
 msgstr "Rango:"
 
-#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:207
-#: modules/graph/graph_fdfit.c:426 modules/graph/graph_fit.c:444
-#: modules/volume/volume_fdfit.c:511 modules/volume/volume_linestat.c:400
+#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:200
+#: modules/graph/graph_fdfit.c:433 modules/graph/graph_fit.c:451
+#: modules/graph/graph_stats.c:290 modules/graph/graph_stats.c:796
+#: modules/volume/volume_fdfit.c:487 modules/volume/volume_linestat.c:405
 msgid "range|to"
 msgstr ""
 
@@ -7043,93 +7242,93 @@ msgstr ""
 msgid "_Draw whole circle"
 msgstr ""
 
-#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:491
-#: modules/graph/graph_fit.c:531 modules/process/fit-shape.c:522
-#: modules/volume/volume_fdfit.c:573
+#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:498
+#: modules/graph/graph_fit.c:538 modules/process/fit-shape.c:523
+#: modules/volume/volume_fdfit.c:549
 msgid "Save Fit Report"
 msgstr ""
 
 #: modules/graph/graph_cd.c:529 modules/graph/graph_cd.c:1107
-#: modules/graph/graph_fdfit.c:709 modules/graph/graph_fit.c:763
-#: modules/volume/volume_fdfit.c:907
+#: modules/graph/graph_fdfit.c:725 modules/graph/graph_fit.c:779
+#: modules/volume/volume_fdfit.c:883
 msgid "Fit"
 msgstr ""
 
-#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:749
-#: modules/graph/graph_fit.c:803 modules/volume/volume_fdfit.c:978
-#: modules/volume/volume_fdfit.c:1085
+#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:765
+#: modules/graph/graph_fit.c:819 modules/volume/volume_fdfit.c:954
+#: modules/volume/volume_fdfit.c:1061
 msgid "It is necessary to select more data points than free fit parameters"
 msgstr ""
 
-#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:798
-#: modules/graph/graph_fit.c:852 modules/process/entropy.c:554
-#: modules/tools/grainmeasure.c:217 modules/tools/readvalue.c:634
-#: modules/tools/readvalue.c:635 modules/tools/readvalue.c:636
-#: modules/tools/readvalue.c:637 modules/tools/roughness.c:975
-#: modules/tools/stats.c:727 modules/tools/stats.c:740
-#: modules/tools/stats.c:741 modules/volume/volume_fdfit.c:1134
-#: modules/xyz/xyz_drift.c:1099 modules/xyz/xyz_drift.c:1117
-#: modules/xyz/xyz_drift.c:1134
+#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:814
+#: modules/graph/graph_fit.c:868 modules/graph/graph_stats.c:663
+#: modules/process/entropy.c:555 modules/tools/grainmeasure.c:217
+#: modules/tools/readvalue.c:634 modules/tools/readvalue.c:635
+#: modules/tools/readvalue.c:636 modules/tools/readvalue.c:637
+#: modules/tools/roughness.c:984 modules/tools/stats.c:723
+#: modules/tools/stats.c:736 modules/tools/stats.c:737
+#: modules/volume/volume_fdfit.c:1110 modules/xyz/xyz_drift.c:1099
+#: modules/xyz/xyz_drift.c:1117 modules/xyz/xyz_drift.c:1134
 msgid "N.A."
 msgstr ""
 
-#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1363
-#: modules/graph/graph_fit.c:1500 modules/process/fit-shape.c:2078
-#: modules/volume/volume_fdfit.c:1720
+#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1381
+#: modules/graph/graph_fit.c:1518 modules/process/fit-shape.c:2060
+#: modules/volume/volume_fdfit.c:1696
 msgid "===== Fit Results ====="
 msgstr ""
 
-#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1367
-#: modules/graph/graph_fit.c:1504 modules/process/fit-shape.c:2080
-#: modules/volume/volume_fdfit.c:1724
+#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1385
+#: modules/graph/graph_fit.c:1522 modules/process/fit-shape.c:2062
+#: modules/volume/volume_fdfit.c:1700
 #, c-format
 msgid "Data:             %s\n"
 msgstr ""
 
-#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1370
-#: modules/graph/graph_fit.c:1507 modules/process/fit-shape.c:2082
-#: modules/volume/volume_fdfit.c:1727
+#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1388
+#: modules/graph/graph_fit.c:1525 modules/process/fit-shape.c:2064
+#: modules/volume/volume_fdfit.c:1703
 #, c-format
 msgid "Number of points: %d of %d\n"
 msgstr ""
 
-#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1374
-#: modules/graph/graph_fit.c:1511 modules/volume/volume_fdfit.c:1731
+#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1392
+#: modules/graph/graph_fit.c:1529 modules/volume/volume_fdfit.c:1707
 #, c-format
 msgid "X range:          %.*f to %.*f %s\n"
 msgstr ""
 
-#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1380
-#: modules/graph/graph_fit.c:1517 modules/process/fit-shape.c:2084
-#: modules/volume/volume_fdfit.c:1737
+#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1398
+#: modules/graph/graph_fit.c:1535 modules/process/fit-shape.c:2066
+#: modules/volume/volume_fdfit.c:1713
 #, c-format
 msgid "Fitted function:  %s\n"
 msgstr ""
 
-#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1383
-#: modules/graph/graph_fit.c:1520 modules/process/fit-shape.c:2087
-#: modules/volume/volume_fdfit.c:1740
+#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1401
+#: modules/graph/graph_fit.c:1538 modules/process/fit-shape.c:2069
+#: modules/volume/volume_fdfit.c:1716
 msgid "Results\n"
 msgstr ""
 
-#: modules/graph/graph_cut.c:88
+#: modules/graph/graph_cut.c:87
 msgid "Cut graph"
 msgstr "Corta Gráfico"
 
-#: modules/graph/graph_cut.c:102
+#: modules/graph/graph_cut.c:101
 #, fuzzy
 msgid "/_Cut..."
 msgstr "/_Corta Gráfico..."
 
-#: modules/graph/graph_cut.c:105
+#: modules/graph/graph_cut.c:104
 msgid "Extract part of graph into new one"
 msgstr "Extrae parte del gráfico a uno nuevo"
 
-#: modules/graph/graph_cut.c:146
+#: modules/graph/graph_cut.c:145
 msgid "Cut Graph"
 msgstr "Corta Gráfico"
 
-#: modules/graph/graph_cut.c:180
+#: modules/graph/graph_cut.c:173
 msgid "Cut _all curves"
 msgstr ""
 
@@ -7234,105 +7433,105 @@ msgstr ""
 msgid "Export to PNG"
 msgstr "Exportar PNG"
 
-#: modules/graph/graph_export_vector.c:35
+#: modules/graph/graph_export_vector.c:36
 #, fuzzy
 msgid "Exports graphs to PostScript"
 msgstr "Exporta gráfico a postscript"
 
-#: modules/graph/graph_export_vector.c:49
+#: modules/graph/graph_export_vector.c:50
 msgid "/Export _PostScript"
 msgstr "/Exportar _PostScript"
 
-#: modules/graph/graph_export_vector.c:52
+#: modules/graph/graph_export_vector.c:53
 #, fuzzy
 msgid "Export graph to PostScript"
 msgstr "Exporta gráfico a postscript"
 
-#: modules/graph/graph_export_vector.c:65
+#: modules/graph/graph_export_vector.c:66
 #, fuzzy
 msgid "Export to PostScript"
 msgstr "Exportar Postscript"
 
-#: modules/graph/graph_fdfit.c:168
+#: modules/graph/graph_fdfit.c:169
 msgid "Fit force-distance data"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:182
+#: modules/graph/graph_fdfit.c:183
 msgid "/_Fit FD Curve..."
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:185
+#: modules/graph/graph_fdfit.c:186
 msgid "Fit a force-distance curve"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:248 modules/volume/volume_fdfit.c:296
+#: modules/graph/graph_fdfit.c:251 modules/volume/volume_fdfit.c:296
 msgid "Fit FD Curve"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:255 modules/graph/graph_fit.c:274
-#: modules/process/fit-shape.c:397 modules/process/measure_lattice.c:257
-#: modules/volume/volume_fdfit.c:303
+#: modules/graph/graph_fdfit.c:258 modules/graph/graph_fit.c:277
+#: modules/process/correct_affine.c:347 modules/process/fit-shape.c:398
+#: modules/process/measure_lattice.c:247 modules/volume/volume_fdfit.c:303
 msgid "verb|_Estimate"
 msgstr "_Estimar"
 
-#: modules/graph/graph_fdfit.c:257 modules/graph/graph_fit.c:276
-#: modules/volume/volume_fdfit.c:305
+#: modules/graph/graph_fdfit.c:260 modules/graph/graph_fit.c:279
+#: modules/process/psf.c:239 modules/volume/volume_fdfit.c:305
 msgid "_Plot Inits"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "e2fsprogs"
-#: modules/graph/graph_fdfit.c:359 modules/graph/graph_fit.c:373
-#: modules/process/fit-shape.c:790 modules/volume/volume_fdfit.c:444
+#: modules/graph/graph_fdfit.c:366 modules/graph/graph_fit.c:380
+#: modules/process/fit-shape.c:802 modules/volume/volume_fdfit.c:420
 msgid "Fix"
 msgstr "Arreglar"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "binutils"
-#: modules/graph/graph_fdfit.c:365 modules/graph/graph_fit.c:379
-#: modules/volume/volume_fdfit.c:450
+#: modules/graph/graph_fdfit.c:372 modules/graph/graph_fit.c:386
+#: modules/volume/volume_fdfit.c:426
 msgid "Initial"
 msgstr "Inicial"
 
-#: modules/graph/graph_fdfit.c:376 modules/graph/graph_fit.c:394
-#: modules/volume/volume_fdfit.c:461
+#: modules/graph/graph_fdfit.c:383 modules/graph/graph_fit.c:401
+#: modules/volume/volume_fdfit.c:437
 msgid "χ<sup>2</sup> result:"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:392 modules/graph/graph_fit.c:410
-#: modules/process/fit-shape.c:469 modules/process/fit-shape.c:2134
-#: modules/volume/volume_fdfit.c:477
+#: modules/graph/graph_fdfit.c:399 modules/graph/graph_fit.c:417
+#: modules/process/fit-shape.c:470 modules/process/fit-shape.c:2116
+#: modules/volume/volume_fdfit.c:453
 msgid "Correlation Matrix"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:447 modules/graph/graph_fit.c:485
-#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:532
+#: modules/graph/graph_fdfit.c:454 modules/graph/graph_fit.c:492
+#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:508
 msgid "Instant:"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:450 modules/graph/graph_fit.c:488
+#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
 #, fuzzy
 msgid "esti_mate"
 msgstr "e_stimación"
 
-#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
-#: modules/volume/volume_fdfit.c:542
+#: modules/graph/graph_fdfit.c:464 modules/graph/graph_fit.c:502
+#: modules/volume/volume_fdfit.c:518
 msgid "p_lot"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:708 modules/graph/graph_fit.c:762
-#: modules/volume/volume_fdfit.c:906
+#: modules/graph/graph_fdfit.c:724 modules/graph/graph_fit.c:778
+#: modules/volume/volume_fdfit.c:882
 msgid "Estimate"
 msgstr "Estimar"
 
-#: modules/graph/graph_fdfit.c:1410 modules/graph/graph_fit.c:1547
-#: modules/volume/volume_fdfit.c:1768
+#: modules/graph/graph_fdfit.c:1428 modules/graph/graph_fit.c:1565
+#: modules/volume/volume_fdfit.c:1744
 #, c-format
 msgid "Residual sum:   %g\n"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:1413 modules/graph/graph_fit.c:1550
-#: modules/volume/volume_fdfit.c:1771
+#: modules/graph/graph_fdfit.c:1431 modules/graph/graph_fit.c:1568
+#: modules/volume/volume_fdfit.c:1747
 msgid "Correlation matrix\n"
 msgstr ""
 
@@ -7348,27 +7547,27 @@ msgstr "/_Filtrar"
 msgid "Remove noise from graph curves"
 msgstr ""
 
-#: modules/graph/graph_fit.c:181
+#: modules/graph/graph_fit.c:182
 msgid "Fit graph with function"
 msgstr "Encaja gráfico con función"
 
-#: modules/graph/graph_fit.c:195
+#: modules/graph/graph_fit.c:196
 msgid "/_Fit Function..."
 msgstr ""
 
-#: modules/graph/graph_fit.c:198
+#: modules/graph/graph_fit.c:199
 msgid "Fit a function on graph data"
 msgstr "Encaja una función en los datos de la gráfica"
 
-#: modules/graph/graph_fit.c:386
+#: modules/graph/graph_fit.c:393
 msgid "Copy all fitted values to estimates"
 msgstr ""
 
-#: modules/graph/graph_fit.c:460
+#: modules/graph/graph_fit.c:467
 msgid "Plot full range"
 msgstr ""
 
-#: modules/graph/graph_fit.c:470
+#: modules/graph/graph_fit.c:477
 msgid "Create a difference graph"
 msgstr ""
 
@@ -7460,60 +7659,167 @@ msgstr ""
 msgid "Find graph curve peaks"
 msgstr "Nivela curvas de gráfico"
 
-#: modules/graph/graph_peaks.c:157
+#: modules/graph/graph_peaks.c:155
 msgid "Prominence"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:161
+#: modules/graph/graph_peaks.c:159
 msgid "Zero"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:162
+#: modules/graph/graph_peaks.c:160
 msgid "Bilateral minimum"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "amule"
-#: modules/graph/graph_peaks.c:178
+#: modules/graph/graph_peaks.c:176
 #, fuzzy
 msgid "Graph Peaks"
 msgstr "Gráficos"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
-#: modules/graph/graph_peaks.c:212
+#: modules/graph/graph_peaks.c:209
 #, fuzzy
 msgid "_Background type:"
 msgstr "Fondo"
 
-#: modules/graph/graph_peaks.c:227
+#: modules/graph/graph_peaks.c:219
 msgid "Order peaks _by:"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:242
+#: modules/graph/graph_peaks.c:225
 #, fuzzy
 msgid "Number of _peaks:"
 msgstr "_Número de Lados:"
 
-#: modules/graph/graph_peaks.c:263 modules/process/curvature.c:773
-#: modules/process/grain_stat.c:360 modules/process/measure_lattice.c:396
-#: modules/process/polylevel.c:607 modules/tools/distance.c:259
-#: modules/tools/roughness.c:818 modules/tools/stats.c:450
+#: modules/graph/graph_peaks.c:245 modules/graph/graph_stats.c:367
+#: modules/process/curvature.c:770 modules/process/grain_stat.c:360
+#: modules/process/measure_lattice.c:390 modules/process/polylevel.c:610
+#: modules/tools/distance.c:259 modules/tools/roughness.c:819
+#: modules/tools/stats.c:447
 msgid "Save table to a file"
 msgstr "Guardar tabla a un archivo"
 
-#: modules/graph/graph_peaks.c:267 modules/process/curvature.c:778
-#: modules/process/grain_stat.c:365 modules/process/measure_lattice.c:400
-#: modules/process/polylevel.c:617 modules/tools/distance.c:264
-#: modules/tools/roughness.c:823 modules/tools/stats.c:455
+#: modules/graph/graph_peaks.c:249 modules/graph/graph_stats.c:371
+#: modules/process/curvature.c:775 modules/process/grain_stat.c:365
+#: modules/process/measure_lattice.c:394 modules/process/polylevel.c:620
+#: modules/tools/distance.c:264 modules/tools/roughness.c:824
+#: modules/tools/stats.c:452
 msgid "Copy table to clipboard"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:654
+#: modules/graph/graph_peaks.c:618
 #, fuzzy
 msgid "Save Peak Parameters"
 msgstr "Guardar Parámetros de Rugosidad "
 
+#: modules/graph/graph_stats.c:148 modules/graph/graph_stats.c:161
+#: modules/tools/stats.c:205
+msgid "Average value:"
+msgstr ""
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "gimp"
+#: modules/graph/graph_stats.c:149 modules/tools/stats.c:206
+msgid "Median:"
+msgstr "Mediana:"
+
+#: modules/graph/graph_stats.c:150
+#, fuzzy
+msgid "Ra:"
+msgstr "Ra"
+
+#: modules/graph/graph_stats.c:151
+#, fuzzy
+msgid "Rms (Rq):"
+msgstr "Rms (Sq):"
+
+#: modules/graph/graph_stats.c:152 modules/tools/stats.c:210
+msgid "Skew:"
+msgstr "Asimetría:"
+
+#: modules/graph/graph_stats.c:153 modules/tools/stats.c:211
+msgid "Kurtosis:"
+msgstr "Curtosis:"
+
+#: modules/graph/graph_stats.c:158
+#, fuzzy
+msgid "Projected length:"
+msgstr "Área proyectada"
+
+#: modules/graph/graph_stats.c:159
+msgid "Developed length:"
+msgstr ""
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "lyx"
+#: modules/graph/graph_stats.c:160 modules/tools/stats.c:214
+msgid "Variation:"
+msgstr "Variación:"
+
+#: modules/graph/graph_stats.c:162
+#, fuzzy
+msgid "Area under curve:"
+msgstr "_Curva de Gráfico:"
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "goffice"
+#: modules/graph/graph_stats.c:163
+#, fuzzy
+msgid "Positive area:"
+msgstr "Positivo"
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "compiz-fusion-plugins-extra"
+#: modules/graph/graph_stats.c:164
+#, fuzzy
+msgid "Negative area:"
+msgstr "Negativo"
+
+#: modules/graph/graph_stats.c:165
+msgid "Root mean square:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:171
+msgid "Calculates simple graph curve statistics."
+msgstr ""
+
+#: modules/graph/graph_stats.c:185
+#, fuzzy
+msgid "/_Statistics..."
+msgstr "_Guardar estadísticas"
+
+#: modules/graph/graph_stats.c:188
+#, fuzzy
+msgid "Calculate graph curve statistics"
+msgstr "Guardar estadísticas de grano"
+
+#: modules/graph/graph_stats.c:241
+#, fuzzy
+msgid "Graph Statistics"
+msgstr "Guardar estadísticas de grano"
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "audacity"
+#: modules/graph/graph_stats.c:320 modules/graph/graph_stats.c:807
+#, fuzzy
+msgid "Simple Parameters"
+msgstr "Parámetros"
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "audacity"
+#: modules/graph/graph_stats.c:342 modules/graph/graph_stats.c:826
+#, fuzzy
+msgid "Integrals"
+msgstr "Interpolación:"
+
+#: modules/graph/graph_stats.c:686
+#, fuzzy
+msgid "Save Curve Statistics"
+msgstr "Guardar estadísticas de grano"
+
 #: modules/layer/axis.c:143
 msgid "Layer allowing selection of horizontal or vertical lines."
 msgstr ""
@@ -7646,25 +7952,25 @@ msgstr ""
 msgid "Angle Distribution"
 msgstr ""
 
-#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:373
+#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:365
 msgid "Output _size:"
 msgstr ""
 
-#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:206
+#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:207
 msgid "_Number of steps:"
 msgstr ""
 
-#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:380
+#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:372
 msgid "_Logarithmic value scale"
 msgstr ""
 
 #: modules/process/angle_dist.c:204 modules/process/entropy.c:231
-#: modules/process/slope_dist.c:390
+#: modules/process/slope_dist.c:382
 msgid "Use local plane _fitting"
 msgstr ""
 
 #: modules/process/angle_dist.c:213 modules/process/entropy.c:242
-#: modules/process/slope_dist.c:401
+#: modules/process/slope_dist.c:393
 msgid "_Plane size:"
 msgstr ""
 
@@ -7682,7 +7988,8 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "goffice"
-#: modules/process/arithmetic.c:202 modules/process/superresolution.c:349
+#: modules/process/arithmetic.c:202 modules/process/stitch.c:234
+#: modules/process/superresolution.c:348
 msgid "Calculated"
 msgstr "Calculado"
 
@@ -7702,7 +8009,7 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "freeciv"
-#: modules/process/arithmetic.c:300 modules/process/dimensions.h:483
+#: modules/process/arithmetic.c:300 modules/process/dimensions.h:465
 msgid "Units"
 msgstr "Unidades"
 
@@ -7723,15 +8030,15 @@ msgstr ""
 msgid "Expression contains unknown identifiers"
 msgstr ""
 
-#: modules/process/arithmetic.c:569 modules/process/superresolution.c:300
+#: modules/process/arithmetic.c:569 modules/process/superresolution.c:299
 msgid "Pixel dimensions differ"
 msgstr ""
 
-#: modules/process/arithmetic.c:571 modules/process/superresolution.c:302
+#: modules/process/arithmetic.c:571 modules/process/superresolution.c:301
 msgid "Lateral dimensions are different physical quantities"
 msgstr ""
 
-#: modules/process/arithmetic.c:574 modules/process/superresolution.c:305
+#: modules/process/arithmetic.c:574 modules/process/superresolution.c:304
 msgid "Physical dimensions differ"
 msgstr ""
 
@@ -7834,7 +8141,7 @@ msgid "Generates surfaces by ballistic deposition."
 msgstr ""
 
 #: modules/process/bdep_synth.c:164
-msgid "/S_ynthetic/_Ballistic..."
+msgid "/S_ynthetic/_Deposition/_Ballistic..."
 msgstr ""
 
 #: modules/process/bdep_synth.c:168
@@ -7845,20 +8152,23 @@ msgstr ""
 # based on translation from "avahi"
 #: modules/process/bdep_synth.c:239 modules/process/bdep_synth.c:596
 #: modules/process/calcoefs_simple.c:636 modules/process/col_synth.c:282
-#: modules/process/col_synth.c:733 modules/process/crosscor.c:819
-#: modules/process/crosscor.c:882 modules/process/deposit_synth.c:268
-#: modules/process/deposit_synth.c:859 modules/process/diff_synth.c:304
-#: modules/process/diff_synth.c:705 modules/process/domain_synth.c:255
-#: modules/process/domain_synth.c:745 modules/process/grain_wshed.c:429
+#: modules/process/col_synth.c:734 modules/process/crosscor.c:792
+#: modules/process/crosscor.c:855 modules/process/deposit_synth.c:268
+#: modules/process/deposit_synth.c:858 modules/process/diff_synth.c:304
+#: modules/process/diff_synth.c:704 modules/process/domain_synth.c:255
+#: modules/process/domain_synth.c:745 modules/process/fibre_synth.c:357
+#: modules/process/fibre_synth.c:872 modules/process/grain_wshed.c:433
 #: modules/process/lat_synth.c:491 modules/process/mark_disconn.c:148
-#: modules/process/mark_disconn.c:373 modules/process/maskcor.c:330
-#: modules/process/mcrop.c:315 modules/process/merge.c:1072
-#: modules/process/nanoindent_adjust.c:323 modules/process/neural.c:1272
-#: modules/process/pid.c:338 modules/process/superresolution.c:416
-#: modules/process/superresolution.c:505 modules/process/tip_blind.c:781
-#: modules/process/tipops.c:320 modules/process/xydenoise.c:213
-#: modules/volume/volume_kmeans.c:403 modules/volume/volume_kmedians.c:365
-#: modules/xyz/xyz_raster.c:1028 modules/xyz/xyz_raster.c:1044
+#: modules/process/mark_disconn.c:361 modules/process/maskcor.c:334
+#: modules/process/mcrop.c:314 modules/process/merge.c:1072
+#: modules/process/nanoindent_adjust.c:324 modules/process/neural.c:1279
+#: modules/process/pid.c:339 modules/process/sphere-revolve.c:269
+#: modules/process/superresolution.c:415 modules/process/superresolution.c:504
+#: modules/process/tip_blind.c:778 modules/process/tipops.c:320
+#: modules/process/wave_synth.c:305 modules/process/wave_synth.c:747
+#: modules/process/xydenoise.c:214 modules/volume/volume_kmeans.c:397
+#: modules/volume/volume_kmedians.c:363 modules/xyz/xyz_raster.c:997
+#: modules/xyz/xyz_raster.c:1013
 msgid "Initializing..."
 msgstr "Inicializando…"
 
@@ -7869,10 +8179,11 @@ msgstr "Inicializando…"
 #: modules/process/deposit_synth.c:531 modules/process/deposit_synth.c:544
 #: modules/process/diff_synth.c:342 modules/process/domain_synth.c:319
 #: modules/process/domain_synth.c:327 modules/process/fbm_synth.c:278
-#: modules/process/fft_synth.c:314 modules/process/lat_synth.c:529
-#: modules/process/lno_synth.c:407 modules/process/noise_synth.c:311
-#: modules/process/obj_synth.c:407 modules/process/pat_synth.c:357
-#: modules/process/wave_synth.c:323
+#: modules/process/fft_synth.c:314 modules/process/fibre_synth.c:394
+#: modules/process/lat_synth.c:529 modules/process/lno_synth.c:405
+#: modules/process/noise_synth.c:309 modules/process/obj_synth.c:404
+#: modules/process/pat_synth.c:357 modules/process/phase_synth.c:518
+#: modules/process/wave_synth.c:342
 msgid "Generated"
 msgstr "Generado el"
 
@@ -7894,54 +8205,60 @@ msgstr ""
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "banshee-community-extensions"
 #: modules/process/bdep_synth.c:407 modules/process/col_synth.c:458
-#: modules/process/deposit_synth.c:412 modules/process/diff_synth.c:477
+#: modules/process/deposit_synth.c:413 modules/process/diff_synth.c:477
 #: modules/process/domain_synth.c:430 modules/process/fbm_synth.c:360
-#: modules/process/fft_synth.c:398 modules/process/lat_synth.c:626
-#: modules/process/lno_synth.c:490 modules/process/noise_synth.c:394
-#: modules/process/obj_synth.c:498 modules/process/pat_synth.c:442
-#: modules/process/wave_synth.c:407
+#: modules/process/fft_synth.c:398 modules/process/fibre_synth.c:479
+#: modules/process/lat_synth.c:626 modules/process/lno_synth.c:488
+#: modules/process/mfm_current.c:383 modules/process/mfm_parallel.c:384
+#: modules/process/noise_synth.c:392 modules/process/obj_synth.c:495
+#: modules/process/pat_synth.c:442 modules/process/phase_synth.c:263
+#: modules/process/wave_synth.c:426
 msgid "Dimensions"
 msgstr "Dimensiones"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "audacity"
 #: modules/process/bdep_synth.c:416 modules/process/col_synth.c:467
-#: modules/process/deposit_synth.c:422 modules/process/diff_synth.c:486
+#: modules/process/deposit_synth.c:425 modules/process/diff_synth.c:486
 #: modules/process/domain_synth.c:438 modules/process/fbm_synth.c:371
-#: modules/process/fft_synth.c:409 modules/process/lno_synth.c:501
-#: modules/process/noise_synth.c:405 modules/process/obj_synth.c:509
-#: modules/process/pat_synth.c:454 modules/process/wave_synth.c:418
+#: modules/process/fft_synth.c:409 modules/process/fibre_synth.c:490
+#: modules/process/lno_synth.c:499 modules/process/mfm_current.c:412
+#: modules/process/mfm_parallel.c:411 modules/process/noise_synth.c:403
+#: modules/process/obj_synth.c:506 modules/process/pat_synth.c:454
+#: modules/process/phase_synth.c:274 modules/process/wave_synth.c:437
 msgid "Generator"
 msgstr "Generador"
 
 #: modules/process/bdep_synth.c:422 modules/process/col_synth.c:473
-#: modules/process/diff_synth.c:492 modules/process/lno_synth.c:1041
-#: modules/process/obj_synth.c:520
+#: modules/process/deposit_synth.c:455 modules/process/diff_synth.c:492
+#: modules/process/fibre_synth.c:502 modules/process/lno_synth.c:1041
+#: modules/process/obj_synth.c:518
 msgid "Co_verage:"
 msgstr ""
 
 #: modules/process/bdep_synth.c:434 modules/process/diff_synth.c:512
-#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:412
-#: modules/process/fft_synth.c:418 modules/process/lat_synth.c:758
-#: modules/process/lno_synth.c:537 modules/process/noise_synth.c:437
-#: modules/process/obj_synth.c:579 modules/process/wave_synth.c:453
-msgid "_Like Current Channel"
+#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:411
+#: modules/process/fft_synth.c:418 modules/process/fibre_synth.c:544
+#: modules/process/lat_synth.c:758 modules/process/lno_synth.c:535
+#: modules/process/noise_synth.c:435 modules/process/obj_synth.c:577
+#: modules/process/phase_synth.c:302 modules/process/wave_synth.c:472
+msgid "_Like Current Image"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "awn-extras-applets"
-#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:541
-#: modules/process/diff_synth.c:562
+#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:542
+#: modules/process/diff_synth.c:561
 msgid "Evolution"
 msgstr "Evolution"
 
-#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:544
-#: modules/process/diff_synth.c:565
+#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:545
+#: modules/process/diff_synth.c:564
 msgid "Plot graphs:"
 msgstr ""
 
-#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:840
-#: modules/process/diff_synth.c:782
+#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:841
+#: modules/process/diff_synth.c:781
 msgid "Depositing particles..."
 msgstr ""
 
@@ -7976,8 +8293,8 @@ msgstr ""
 msgid "Calibration name:"
 msgstr ""
 
-#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:433
-#: modules/volume/volume_extract.c:514
+#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:421
+#: modules/volume/volume_extract.c:501
 msgid "No data loaded"
 msgstr ""
 
@@ -8007,7 +8324,7 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "drgeo"
-#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1073
+#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1059
 #, c-format
 msgid "Error loading file '%s'"
 msgstr "Error al cargar el archivo «%s»"
@@ -8101,7 +8418,7 @@ msgstr ""
 msgid "Simple Error Map"
 msgstr ""
 
-#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:146
+#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:142
 #: modules/process/superresolution.c:156
 msgid "Operands:"
 msgstr ""
@@ -8119,16 +8436,16 @@ msgstr "Detalle"
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
 #: modules/process/calcoefs_simple.c:371 modules/process/calcoefs_view.c:491
-#: modules/process/calibrate.c:496 modules/process/crosscor.c:289
-#: modules/volume/volume_calibrate.c:478
+#: modules/process/calibrate.c:481 modules/process/crosscor.c:276
+#: modules/volume/volume_calibrate.c:460
 msgid "_X offset:"
 msgstr "Desplazamiento _X:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
 #: modules/process/calcoefs_simple.c:398 modules/process/calcoefs_view.c:517
-#: modules/process/calibrate.c:509 modules/process/crosscor.c:300
-#: modules/volume/volume_calibrate.c:491
+#: modules/process/calibrate.c:488 modules/process/crosscor.c:284
+#: modules/volume/volume_calibrate.c:467
 msgid "_Y offset:"
 msgstr "Desplazamiento _Y:"
 
@@ -8141,7 +8458,7 @@ msgid "Y p_eriod:"
 msgstr ""
 
 #: modules/process/calcoefs_simple.c:438 modules/process/calcoefs_view.c:529
-#: modules/volume/volume_calibrate.c:505
+#: modules/volume/volume_calibrate.c:474
 msgid "_Z offset:"
 msgstr ""
 
@@ -8176,26 +8493,26 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gnumeric"
-#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:862
-#: modules/process/maskcor.c:332 modules/process/mcrop.c:317
+#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:835
+#: modules/process/maskcor.c:336 modules/process/mcrop.c:316
 #: modules/process/merge.c:1074
 #, fuzzy
 msgid "Correlating..."
 msgstr "Correlación"
 
-#: modules/process/calcoefs_stage.c:76
+#: modules/process/calcoefs_stage.c:72
 msgid "Digital AFM data recalibration"
 msgstr ""
 
-#: modules/process/calcoefs_stage.c:90
+#: modules/process/calcoefs_stage.c:86
 msgid "/Cali_bration/_3D Calibration/_Get From Stage map..."
 msgstr ""
 
-#: modules/process/calcoefs_stage.c:94
+#: modules/process/calcoefs_stage.c:90
 msgid "Stage error mapping"
 msgstr ""
 
-#: modules/process/calcoefs_stage.c:131
+#: modules/process/calcoefs_stage.c:127
 msgid "Stage Error Map"
 msgstr ""
 
@@ -8260,14 +8577,16 @@ msgstr "Posición X"
 msgid "Crop to actual data"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:369
-#: modules/process/deposit_synth.c:641 modules/process/edge.c:705
-#: modules/process/fft_filter_1d.c:299 modules/process/grain_edge.c:290
-#: modules/process/grain_filter.c:347 modules/process/grain_mark.c:372
-#: modules/process/mark_with.c:318 modules/process/polydistort.c:316
-#: modules/process/scars.c:386 modules/process/slope_dist.c:407
-#: modules/process/synth.h:513 modules/volume/volume_extract.c:424
-#: modules/volume/volume_extract.c:505 modules/volume/volume_linestat.c:422
+#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:368
+#: modules/process/deposit_synth.c:642 modules/process/edge.c:705
+#: modules/process/fft_filter_1d.c:301 modules/process/grain_edge.c:277
+#: modules/process/grain_filter.c:346 modules/process/grain_mark.c:357
+#: modules/process/mark_with.c:322 modules/process/mfm_field.c:420
+#: modules/process/mfm_shift.c:216 modules/process/polydistort.c:319
+#: modules/process/psf.c:309 modules/process/scars.c:421
+#: modules/process/slope_dist.c:400 modules/process/synth.h:542
+#: modules/volume/volume_extract.c:411 modules/volume/volume_extract.c:491
+#: modules/volume/volume_linestat.c:427
 msgid "I_nstant updates"
 msgstr ""
 
@@ -8308,27 +8627,27 @@ msgstr ""
 msgid "Building mesh..."
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1818
+#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1867
 msgid "X correction"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1819
+#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1868
 msgid "Y correction"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1820
+#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1869
 msgid "Z correction"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1821
+#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1870
 msgid "X uncertainty"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1822
+#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1871
 msgid "Y uncertainty"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1823
+#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1872
 msgid "Z uncertainty"
 msgstr ""
 
@@ -8356,78 +8675,79 @@ msgstr ""
 msgid "Delaunay"
 msgstr "Delaunay"
 
-#: modules/process/calibrate.c:180
+#: modules/process/calibrate.c:172
 msgid "Recalibrates scan lateral dimensions or value range."
 msgstr ""
 
-#: modules/process/calibrate.c:194
+#: modules/process/calibrate.c:186
 msgid "/_Basic Operations/_Dimensions and Units..."
 msgstr ""
 
-#: modules/process/calibrate.c:198 modules/volume/volume_calibrate.c:193
+#: modules/process/calibrate.c:190 modules/volume/volume_calibrate.c:193
 msgid "Change physical dimensions, units or value scale"
 msgstr ""
 
-#: modules/process/calibrate.c:357 modules/volume/volume_calibrate.c:355
+#: modules/process/calibrate.c:349 modules/volume/volume_calibrate.c:355
 msgid "Recalibrated Data"
 msgstr ""
 
-#: modules/process/calibrate.c:390
+#: modules/process/calibrate.c:382
 msgid "Dimensions and Units"
 msgstr ""
 
-#: modules/process/calibrate.c:411 modules/volume/volume_calibrate.c:389
+#: modules/process/calibrate.c:405 modules/volume/volume_calibrate.c:391
 msgid "New Real Dimensions"
 msgstr "Nuevas Dimensiones Reales"
 
-#: modules/process/calibrate.c:417
+#: modules/process/calibrate.c:415
 msgid "_Match pixel size:"
 msgstr ""
 
-#: modules/process/calibrate.c:444 modules/volume/volume_calibrate.c:394
+#: modules/process/calibrate.c:447 modules/volume/volume_calibrate.c:397
 msgid "_X range:"
 msgstr ""
 
-#: modules/process/calibrate.c:473 modules/volume/volume_calibrate.c:421
+#: modules/process/calibrate.c:467 modules/volume/volume_calibrate.c:417
 msgid "_Y range:"
 msgstr ""
 
-#: modules/process/calibrate.c:489
+#: modules/process/calibrate.c:472
 msgid "_Square samples"
 msgstr ""
 
-#: modules/process/calibrate.c:524 modules/volume/volume_calibrate.c:521
+#: modules/process/calibrate.c:496 modules/volume/volume_calibrate.c:480
 msgid "Value Range"
 msgstr ""
 
-#: modules/process/calibrate.c:529 modules/volume/volume_calibrate.c:448
+#: modules/process/calibrate.c:502 modules/volume/volume_calibrate.c:437
 msgid "_Z range:"
 msgstr ""
 
-#: modules/process/calibrate.c:558
+#: modules/process/calibrate.c:524
 msgid "Z shi_ft:"
 msgstr ""
 
-#: modules/process/calibrate.c:573 modules/volume/volume_calibrate.c:570
+#: modules/process/calibrate.c:533 modules/volume/volume_calibrate.c:515
 msgid "Calibration Coefficients"
 msgstr ""
 
-#: modules/process/calibrate.c:580 modules/volume/volume_calibrate.c:577
+#: modules/process/calibrate.c:538 modules/volume/volume_calibrate.c:520
 msgid "_X calibration factor:"
 msgstr ""
 
-#: modules/process/calibrate.c:590 modules/volume/volume_calibrate.c:585
+#: modules/process/calibrate.c:545 modules/volume/volume_calibrate.c:527
 msgid "_Y calibration factor:"
 msgstr ""
 
-#: modules/process/calibrate.c:600 modules/volume/volume_calibrate.c:593
+#: modules/process/calibrate.c:552 modules/volume/volume_calibrate.c:534
 msgid "_Z calibration factor:"
 msgstr ""
 
-#: modules/process/calibrate.c:613 modules/process/extend.c:293
-#: modules/tools/crop.c:213
-msgid "Create new channel"
-msgstr "Crear un nuevo cannal"
+#: modules/process/calibrate.c:567 modules/process/drift.c:389
+#: modules/process/extend.c:293 modules/tools/crop.c:213
+#, fuzzy
+msgid "Create new image"
+msgstr "Crea un nuevo dato"
 
 #: modules/process/coerce.c:159
 msgid "Transforms surfaces to have prescribed statistical properties."
@@ -8446,13 +8766,13 @@ msgid "Coerced"
 msgstr ""
 
 #: modules/process/coerce.c:225 modules/process/coerce.c:326
-#: modules/process/fbm_synth.c:475 modules/process/lno_synth.c:256
-#: modules/process/noise_synth.c:183
+#: modules/process/fbm_synth.c:474 modules/process/lno_synth.c:254
+#: modules/process/noise_synth.c:181
 msgid "distribution|Uniform"
 msgstr "Uniforme"
 
-#: modules/process/coerce.c:226 modules/process/fbm_synth.c:476
-#: modules/process/lno_synth.c:246 modules/process/noise_synth.c:173
+#: modules/process/coerce.c:226 modules/process/fbm_synth.c:475
+#: modules/process/lno_synth.c:244 modules/process/noise_synth.c:171
 msgid "distribution|Gaussian"
 msgstr "Gaussiana"
 
@@ -8509,12 +8829,12 @@ msgid "Number of maxima"
 msgstr ""
 
 #: modules/process/col_synth.c:173 modules/tools/linestats.c:178
-#: modules/volume/volume_linestat.c:154
+#: modules/volume/volume_linestat.c:156
 msgid "Skew"
 msgstr "Asimetría"
 
 #: modules/process/col_synth.c:174 modules/tools/linestats.c:179
-#: modules/tools/roughness.c:386 modules/volume/volume_linestat.c:155
+#: modules/tools/roughness.c:387 modules/volume/volume_linestat.c:157
 msgid "Kurtosis"
 msgstr "Curtosis"
 
@@ -8530,7 +8850,7 @@ msgid "Generates columnar surfaces by a simple growth algorithm."
 msgstr ""
 
 #: modules/process/col_synth.c:208
-msgid "/S_ynthetic/_Columnar..."
+msgid "/S_ynthetic/_Deposition/_Columnar..."
 msgstr ""
 
 #: modules/process/col_synth.c:212
@@ -8557,7 +8877,7 @@ msgstr "Inclinación"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "beast"
-#: modules/process/col_synth.c:509 modules/process/crosscor.c:1063
+#: modules/process/col_synth.c:509 modules/process/crosscor.c:1036
 msgid "Direction"
 msgstr "Dirección"
 
@@ -8567,20 +8887,20 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "eog"
-#: modules/process/col_synth.c:528
+#: modules/process/col_synth.c:529
 #, fuzzy
 msgid "_Melting:"
 msgstr "E_scalado:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gajim"
-#: modules/process/col_synth.c:612
+#: modules/process/col_synth.c:613
 msgid "Weak"
 msgstr "Débil"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "plugin_htmlbar"
-#: modules/process/col_synth.c:613
+#: modules/process/col_synth.c:614
 msgid "Strong"
 msgstr "Remarcado"
 
@@ -8614,8 +8934,8 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "anjuta"
-#: modules/process/convolution_filter.c:269 modules/tools/filter.c:170
-#: modules/tools/filter.c:274
+#: modules/process/convolution_filter.c:269 modules/tools/filter.c:171
+#: modules/tools/filter.c:275
 msgid "Filter"
 msgstr "Filtro"
 
@@ -8645,122 +8965,133 @@ msgstr ""
 msgid "VSym"
 msgstr ""
 
-#: modules/process/correct_affine.c:231
+#: modules/process/correct_affine.c:220
 msgid ""
 "Corrects affine distortion of images by matching image Bravais lattice to "
 "the true one."
 msgstr ""
 
-#: modules/process/correct_affine.c:246
+#: modules/process/correct_affine.c:235
 msgid "/_Distortion/_Affine..."
 msgstr ""
 
-#: modules/process/correct_affine.c:250
+#: modules/process/correct_affine.c:239
 msgid "Correct affine distortion"
 msgstr ""
 
-#: modules/process/correct_affine.c:298
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "foxtrotgps"
+#: modules/process/correct_affine.c:309 modules/process/correct_affine.c:634
+#, fuzzy
+msgid "Corrected"
+msgstr "Corrección:"
+
+#: modules/process/correct_affine.c:343
 msgid "Affine Correction"
 msgstr ""
 
+#: modules/process/correct_affine.c:349 modules/process/measure_lattice.c:249
+msgid "_Refine"
+msgstr ""
+
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "src"
-#: modules/process/correct_affine.c:351 modules/process/fft_filter_2d.c:530
+#: modules/process/correct_affine.c:399 modules/process/fft_filter_2d.c:530
 msgid "Preview Options"
 msgstr "Opciones de vista previa"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "audacious-plugins"
-#: modules/process/correct_affine.c:356 modules/process/fft_filter_2d.c:535
-#: modules/process/measure_lattice.c:321
+#: modules/process/correct_affine.c:404 modules/process/fft_filter_2d.c:535
+#: modules/process/measure_lattice.c:311
 msgid "Display:"
 msgstr "Mostrar:"
 
-#: modules/process/correct_affine.c:364 modules/process/measure_lattice.c:329
+#: modules/process/correct_affine.c:412 modules/process/measure_lattice.c:319
 #: modules/tools/grainremover.c:109
 msgid "_Data"
 msgstr "_Datos"
 
-#: modules/process/correct_affine.c:365
+#: modules/process/correct_affine.c:413
 msgid "2D _ACF"
 msgstr ""
 
-#: modules/process/correct_affine.c:366 modules/process/drift.c:365
+#: modules/process/correct_affine.c:414 modules/process/drift.c:364
 msgid "Correc_ted data"
 msgstr ""
 
-#: modules/process/correct_affine.c:377
+#: modules/process/correct_affine.c:425
 msgid "ACF zoom:"
 msgstr ""
 
-#: modules/process/correct_affine.c:394 modules/process/measure_lattice.c:372
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "audacity"
+#: modules/process/correct_affine.c:442 modules/process/measure_lattice.c:346
+#, fuzzy
+msgid "Interpolate _horizontal ACF"
+msgstr "Interpolación:"
+
+#: modules/process/correct_affine.c:452 modules/process/measure_lattice.c:372
 msgid "Lattice Vectors"
 msgstr ""
 
 #. TRANSLATORS: Correct is an adjective here.
-#: modules/process/correct_affine.c:419
+#: modules/process/correct_affine.c:469
 msgid "Correct Lattice"
 msgstr ""
 
-#: modules/process/correct_affine.c:423
+#: modules/process/correct_affine.c:473
 msgid "_Lattice type:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "glabels"
-#: modules/process/correct_affine.c:430
+#: modules/process/correct_affine.c:480
 msgid "User defined"
 msgstr "Definido por el usuario"
 
-#: modules/process/correct_affine.c:445
+#: modules/process/correct_affine.c:495
 msgid "_Different lengths"
 msgstr ""
 
-#: modules/process/correct_affine.c:474
+#: modules/process/correct_affine.c:524
 msgid "Image for _ACF:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "eog"
-#: modules/process/correct_affine.c:501
+#: modules/process/correct_affine.c:551
 msgid "_Scaling:"
 msgstr "E_scalado:"
 
-#: modules/process/correct_affine.c:508
+#: modules/process/correct_affine.c:558
 msgid "Exactly as specified"
 msgstr ""
 
-#: modules/process/correct_affine.c:509
+#: modules/process/correct_affine.c:560
 msgid "Preserve area"
 msgstr ""
 
-#: modules/process/correct_affine.c:510
+#: modules/process/correct_affine.c:562
 msgid "Preserve X scale"
 msgstr ""
 
-# Translation for this string generated by http://littlesvr.ca/ostd/
-# based on translation from "foxtrotgps"
-#: modules/process/correct_affine.c:561
-#, fuzzy
-msgid "Corrected"
-msgstr "Corrección:"
+#: modules/process/correct_affine.c:571 modules/process/drift.c:379
+msgid "_Apply to all compatible images"
+msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "banshee"
-#: modules/process/correct_affine.c:617 modules/process/measure_lattice.c:489
+#: modules/process/correct_affine.c:693 modules/process/measure_lattice.c:482
 msgid "length"
 msgstr "longitud"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "darktable"
-#: modules/process/correct_affine.c:624 modules/process/measure_lattice.c:496
+#: modules/process/correct_affine.c:700 modules/process/measure_lattice.c:489
 msgid "angle"
 msgstr "ángulo"
 
-#: modules/process/correct_affine.c:717
-msgid "Re_fine"
-msgstr ""
-
 #: modules/process/crosscor.c:157
 msgid "Calculates cross-correlation of two data fields."
 msgstr ""
@@ -8785,212 +9116,214 @@ msgstr ""
 msgid "Search size"
 msgstr ""
 
-#: modules/process/crosscor.c:272
-msgid "Global offset of 2nd channel"
+#: modules/process/crosscor.c:267
+msgid "_Guess"
 msgstr ""
 
-#: modules/process/crosscor.c:277
-msgid "_Guess"
+#: modules/process/crosscor.c:268
+msgid "Global offset of 2nd channel"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gnomint"
-#: modules/process/crosscor.c:311
+#: modules/process/crosscor.c:292
 msgid "Window size"
 msgstr "Tamaño de ventana"
 
-#: modules/process/crosscor.c:319
+#: modules/process/crosscor.c:300
 msgid "W_idth:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "plugin_htmlbar"
-#: modules/process/crosscor.c:329
+#: modules/process/crosscor.c:308
 msgid "Hei_ght:"
 msgstr "_Altura:"
 
-#: modules/process/crosscor.c:342 modules/process/fft.c:405
+#: modules/process/crosscor.c:319 modules/process/fft.c:403
 #: modules/process/psdf_logphi.c:268
 msgid "_Windowing type:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "lang"
-#: modules/process/crosscor.c:350
+#: modules/process/crosscor.c:327
 msgid "All"
 msgstr "Todo"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "fslint"
-#: modules/process/crosscor.c:351
+#: modules/process/crosscor.c:328
 msgid "Absolute"
 msgstr "Absoluto"
 
-#: modules/process/crosscor.c:352
+#: modules/process/crosscor.c:329
 msgid "X Distance"
 msgstr ""
 
-#: modules/process/crosscor.c:353
+#: modules/process/crosscor.c:330
 msgid "Y Distance"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "help"
-#: modules/process/crosscor.c:355 modules/process/crosscor.c:1077
+#: modules/process/crosscor.c:332 modules/process/crosscor.c:1050
 msgid "Score"
 msgstr "Puntuación"
 
-#: modules/process/crosscor.c:357 modules/process/fft.c:395
-#: modules/process/fit-shape.c:688 modules/process/maskcor.c:176
+#: modules/process/crosscor.c:334 modules/process/fft.c:393
+#: modules/process/fit-shape.c:699 modules/process/maskcor.c:177
+#: modules/process/mfm_current.c:455 modules/process/mfm_field.c:373
+#: modules/process/mfm_parallel.c:466
 msgid "Output _type:"
 msgstr ""
 
-#: modules/process/crosscor.c:363
+#: modules/process/crosscor.c:340
 msgid "Add _low score results mask"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "xfce4-settings"
-#: modules/process/crosscor.c:374 modules/process/grain_wshed.c:223
-#: modules/process/maskcor.c:188
+#: modules/process/crosscor.c:351 modules/process/grain_wshed.c:225
+#: modules/process/maskcor.c:191
 msgid "T_hreshold:"
 msgstr "Um_bral:"
 
-#: modules/process/crosscor.c:381
+#: modules/process/crosscor.c:359
 msgid "Multichannel cross-corelation"
 msgstr ""
 
-#: modules/process/crosscor.c:400
+#: modules/process/crosscor.c:378
 msgid "Second _source data:"
 msgstr ""
 
-#: modules/process/crosscor.c:417
+#: modules/process/crosscor.c:394
 msgid "Correlate with:"
 msgstr ""
 
-#: modules/process/crosscor.c:424
+#: modules/process/crosscor.c:402
 #, fuzzy
 msgid "Postprocess:"
 msgstr "Proceso de Datos"
 
-#: modules/process/crosscor.c:431
-msgid "Apply Ga_ussian filter of width: "
+#: modules/process/crosscor.c:411
+msgid "Apply Ga_ussian filter of width:"
 msgstr ""
 
-#: modules/process/crosscor.c:451
+#: modules/process/crosscor.c:424
 msgid "Extend results to borders"
 msgstr ""
 
-#: modules/process/crosscor.c:461
+#: modules/process/crosscor.c:433
 msgid "Create corrected data from 2nd channel"
 msgstr ""
 
-#: modules/process/crosscor.c:860
+#: modules/process/crosscor.c:833
 msgid "Correlating first set..."
 msgstr ""
 
-#: modules/process/crosscor.c:892
+#: modules/process/crosscor.c:865
 msgid "Correlating second set..."
 msgstr ""
 
-#: modules/process/crosscor.c:999
+#: modules/process/crosscor.c:972
 #, fuzzy
 msgid "Corrected 2nd channel"
 msgstr "Crear un nuevo cannal"
 
-#: modules/process/crosscor.c:1023
+#: modules/process/crosscor.c:996
 msgid "X difference"
 msgstr ""
 
-#: modules/process/crosscor.c:1037
+#: modules/process/crosscor.c:1010
 msgid "Y difference"
 msgstr ""
 
-#: modules/process/crosscor.c:1050
+#: modules/process/crosscor.c:1023
 msgid "Absolute difference"
 msgstr ""
 
-#: modules/process/curvature.c:131
+#: modules/process/curvature.c:130
 msgid "Center value"
 msgstr ""
 
-#: modules/process/curvature.c:132
+#: modules/process/curvature.c:131
 msgid "Curvature radius 1"
 msgstr ""
 
-#: modules/process/curvature.c:133
+#: modules/process/curvature.c:132
 msgid "Curvature radius 2"
 msgstr ""
 
-#: modules/process/curvature.c:134
+#: modules/process/curvature.c:133
 msgid "Direction 1"
 msgstr ""
 
-#: modules/process/curvature.c:135
+#: modules/process/curvature.c:134
 msgid "Direction 2"
 msgstr ""
 
-#: modules/process/curvature.c:163
+#: modules/process/curvature.c:162
 msgid "Calculates overall curvature."
 msgstr ""
 
-#: modules/process/curvature.c:177
+#: modules/process/curvature.c:176
 msgid "/_Level/_Curvature..."
 msgstr ""
 
-#: modules/process/curvature.c:181
+#: modules/process/curvature.c:180
 msgid "Calculate overall curvature"
 msgstr ""
 
-#: modules/process/curvature.c:211 modules/process/facet-level.c:118
+#: modules/process/curvature.c:210 modules/process/facet-level.c:118
 #: modules/process/semsim.c:165
 #, c-format
 msgid "%s: Lateral dimensions and value must be the same physical quantity."
 msgstr ""
 
-#: modules/process/curvature.c:445
+#: modules/process/curvature.c:447
 msgid "Curvature Sections"
 msgstr ""
 
-#: modules/process/curvature.c:653
+#: modules/process/curvature.c:655
 msgid "Output Type"
 msgstr ""
 
-#: modules/process/curvature.c:660
+#: modules/process/curvature.c:662
 msgid "_Set selection"
 msgstr ""
 
-#: modules/process/curvature.c:670
+#: modules/process/curvature.c:672
 msgid "_Plot graph"
 msgstr "_Presenta gráfico"
 
-#: modules/process/curvature.c:685 modules/process/drift.c:337
-#: modules/process/fft_profile.c:310 modules/process/fractal.c:328
-#: modules/process/grain_cross.c:253 modules/process/linematch.c:885
-#: modules/process/slope_dist.c:349 modules/tools/linestats.c:418
-#: modules/tools/profile.c:573 modules/tools/roughness.c:872
-#: modules/tools/sfunctions.c:486 modules/tools/spectro.c:382
-#: modules/volume/volume_slice.c:398
+#: modules/process/curvature.c:684 modules/process/drift.c:340
+#: modules/process/fft_profile.c:300 modules/process/fractal.c:308
+#: modules/process/grain_cross.c:260 modules/process/linematch.c:855
+#: modules/process/slope_dist.c:347 modules/tools/linestats.c:424
+#: modules/tools/profile.c:559 modules/tools/roughness.c:886
+#: modules/tools/sfunctions.c:488 modules/tools/spectro.c:391
+#: modules/volume/volume_slice.c:408
 #, fuzzy
-msgid "Target _graph:"
+msgid "New graph"
 msgstr "Corta Gráfico"
 
-#: modules/process/curvature.c:691 modules/process/drift.c:343
-#: modules/process/fft_profile.c:316 modules/process/fractal.c:334
-#: modules/process/grain_cross.c:259 modules/process/linematch.c:892
-#: modules/process/slope_dist.c:355 modules/tools/linestats.c:424
-#: modules/tools/profile.c:579 modules/tools/roughness.c:878
-#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:388
-#: modules/volume/volume_slice.c:406
+#: modules/process/curvature.c:689 modules/process/drift.c:345
+#: modules/process/fft_profile.c:306 modules/process/fractal.c:313
+#: modules/process/grain_cross.c:254 modules/process/linematch.c:860
+#: modules/process/slope_dist.c:352 modules/tools/linestats.c:418
+#: modules/tools/profile.c:563 modules/tools/roughness.c:890
+#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:385
+#: modules/volume/volume_slice.c:400
 #, fuzzy
-msgid "New graph"
+msgid "Target _graph:"
 msgstr "Corta Gráfico"
 
-#: modules/process/curvature.c:951
+#: modules/process/curvature.c:949
 msgid "Axes are outside the image."
 msgstr ""
 
-#: modules/process/curvature.c:1018
+#: modules/process/curvature.c:1016
 msgid "Save Curvature"
 msgstr "Guardar Curvatura"
 
@@ -9014,8 +9347,8 @@ msgstr ""
 msgid "2D CWT"
 msgstr ""
 
-#: modules/process/cwt.c:158 modules/process/dwt.c:185
-#: modules/process/dwtanisotropy.c:209
+#: modules/process/cwt.c:159 modules/process/dwt.c:185
+#: modules/process/dwtanisotropy.c:212
 msgid "_Wavelet type:"
 msgstr ""
 
@@ -9024,91 +9357,87 @@ msgid "Generates particles using simple dynamical model"
 msgstr ""
 
 #: modules/process/deposit_synth.c:184
-msgid "/S_ynthetic/_Particles..."
+msgid "/S_ynthetic/_Deposition/_Particles..."
 msgstr ""
 
 #: modules/process/deposit_synth.c:188
 msgid "Generate particles using dynamical model"
 msgstr ""
 
-#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:867
+#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:866
 #, c-format
 msgid ""
 "Not all the particles could be deposited (%u),\n"
 "try more revise steps."
 msgstr ""
 
-#: modules/process/deposit_synth.c:347
+#: modules/process/deposit_synth.c:348
 msgid "Particle Generation"
 msgstr ""
 
-#: modules/process/deposit_synth.c:427
+#: modules/process/deposit_synth.c:431
 msgid "Particle r_adius:"
 msgstr ""
 
-#: modules/process/deposit_synth.c:438
+#: modules/process/deposit_synth.c:443
 msgid "Distribution _width:"
 msgstr ""
 
-#: modules/process/deposit_synth.c:449
-msgid "Surface _coverage:"
-msgstr ""
-
-#: modules/process/deposit_synth.c:458
+#: modules/process/deposit_synth.c:462
 msgid "_Relax steps:"
 msgstr ""
 
-#: modules/process/deposit_synth.c:659 modules/process/synth.h:548
+#: modules/process/deposit_synth.c:660 modules/process/synth.h:577
 msgid "R_andom seed:"
 msgstr "S_emilla:"
 
-#: modules/process/deposit_synth.c:665 modules/process/synth.h:554
+#: modules/process/deposit_synth.c:666 modules/process/synth.h:583
 msgid "seed|_New"
 msgstr "_Nueva"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "fontforge"
-#: modules/process/deposit_synth.c:676
+#: modules/process/deposit_synth.c:677
 msgid "Randomize"
 msgstr "Al azar"
 
-#: modules/process/deposit_synth.c:860 modules/process/domain_synth.c:919
+#: modules/process/deposit_synth.c:859 modules/process/domain_synth.c:919
 msgid "Running computation..."
 msgstr ""
 
-#: modules/process/deposit_synth.c:865
+#: modules/process/deposit_synth.c:864
 #, c-format
 msgid "%d particles were deposited"
 msgstr ""
 
-#: modules/process/deposit_synth.c:1093
+#: modules/process/deposit_synth.c:1092
 msgid "Initial particle set..."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1252
+#: modules/process/deposit_synth.c:1251
 msgid "Running revise..."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1380
+#: modules/process/deposit_synth.c:1379
 msgid "Error: too many particles."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1382
+#: modules/process/deposit_synth.c:1381
 msgid "Error: no particles."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1384
+#: modules/process/deposit_synth.c:1383
 msgid "Error: particles too large."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1386
+#: modules/process/deposit_synth.c:1385
 msgid "Error: particles too small."
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "lyx"
 #: modules/process/diff_synth.c:197 modules/tools/linestats.c:173
-#: modules/volume/volume_linestat.c:149
+#: modules/volume/volume_linestat.c:151
 msgid "Variation"
 msgstr "Variación"
 
@@ -9121,7 +9450,7 @@ msgid "Generates surfaces by diffusion limited aggregation."
 msgstr ""
 
 #: modules/process/diff_synth.c:228
-msgid "/S_ynthetic/_Diffusion..."
+msgid "/S_ynthetic/_Deposition/_Diffusion..."
 msgstr ""
 
 #: modules/process/diff_synth.c:232
@@ -9136,44 +9465,44 @@ msgstr ""
 msgid "_Flux:"
 msgstr ""
 
-#: modules/process/diff_synth.c:522
+#: modules/process/diff_synth.c:521
 msgid "Probabilities"
 msgstr ""
 
-#: modules/process/diff_synth.c:530
+#: modules/process/diff_synth.c:529
 msgid "_Sticking:"
 msgstr ""
 
-#: modules/process/diff_synth.c:539
+#: modules/process/diff_synth.c:538
 msgid "_Activation:"
 msgstr ""
 
-#: modules/process/diff_synth.c:548
+#: modules/process/diff_synth.c:547
 msgid "Passing Sch_woebel:"
 msgstr ""
 
-#: modules/process/dimensions.h:457
+#: modules/process/dimensions.h:439
 msgid "S_quare image"
 msgstr ""
 
-#: modules/process/dimensions.h:489
+#: modules/process/dimensions.h:473
 msgid "_Dimension units:"
 msgstr ""
 
-#: modules/process/dimensions.h:502
-msgid "Current Channel"
+#: modules/process/dimensions.h:488
+msgid "Current Image"
 msgstr ""
 
-#: modules/process/dimensions.h:506
-msgid "_Take Dimensions from Current Channel"
+#: modules/process/dimensions.h:492
+msgid "_Take Dimensions from Current Image"
 msgstr ""
 
-#: modules/process/dimensions.h:514
-msgid "_Replace the current channel"
+#: modules/process/dimensions.h:501
+msgid "_Replace the current image"
 msgstr ""
 
-#: modules/process/dimensions.h:523
-msgid "_Start from the current channel"
+#: modules/process/dimensions.h:510
+msgid "_Start from the current image"
 msgstr ""
 
 #: modules/process/domain_synth.c:158
@@ -9237,13 +9566,13 @@ msgstr ""
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "calibre"
 #: modules/process/domain_synth.c:504 modules/process/fft_filter_2d.c:586
-#: modules/volume/volume_slice.c:364
+#: modules/volume/volume_slice.c:366
 msgid "Output Options"
 msgstr "Opciones de salida"
 
 #: modules/process/domain_synth.c:523 modules/process/fft_filter_2d.c:591
-#: modules/process/mask_edt.c:377 modules/process/slope_dist.c:323
-#: modules/volume/volume_linestat.c:432 modules/volume/volume_slice.c:384
+#: modules/process/mask_edt.c:211 modules/process/slope_dist.c:323
+#: modules/volume/volume_linestat.c:437 modules/volume/volume_slice.c:386
 msgid "Output type:"
 msgstr ""
 
@@ -9273,63 +9602,53 @@ msgstr ""
 msgid "rows"
 msgstr "rows"
 
-#: modules/process/drift.c:304
+#: modules/process/drift.c:305
 msgid "Correct _data"
 msgstr ""
 
-#: modules/process/drift.c:314
+#: modules/process/drift.c:315
 msgid "_Exclude linear skew"
 msgstr ""
 
-#: modules/process/drift.c:324
+#: modules/process/drift.c:325
 msgid "Plot drift _graph"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "aptitude"
-#: modules/process/drift.c:356 modules/process/fit-shape.c:693
-#: modules/process/neural.c:548 modules/process/polydistort.c:275
+#: modules/process/drift.c:355 modules/process/fit-shape.c:705
+#: modules/process/neural.c:552 modules/process/polydistort.c:278
 msgid "Preview:"
 msgstr "Previsualizar:"
 
-#: modules/process/drift.c:366
+#: modules/process/drift.c:365
 msgid "Drift _lines"
 msgstr ""
 
-#: modules/process/drift.c:374 modules/process/facet_analysis.c:407
-#: modules/process/grain_edge.c:285 modules/process/grain_filter.c:357
-#: modules/process/grain_mark.c:367 modules/process/grain_wshed.c:267
-#: modules/process/mark_disconn.c:310 modules/process/scars.c:381
+#: modules/process/drift.c:373 modules/process/facet_analysis.c:390
+#: modules/process/grain_edge.c:272 modules/process/grain_filter.c:356
+#: modules/process/grain_mark.c:341 modules/process/grain_wshed.c:271
+#: modules/process/mark_disconn.c:298 modules/process/scars.c:405
 #: modules/process/wpour_mark.c:369
 msgid "_Mask color:"
 msgstr ""
 
-# Translation for this string generated by http://littlesvr.ca/ostd/
-# based on translation from "dia"
-#: modules/process/drift.c:379
-msgid "Distribute"
-msgstr "Distribuir"
-
-#: modules/process/drift.c:388
-msgid "Replace"
-msgstr "Sustituir"
-
-#: modules/process/drift.c:569
+#: modules/process/drift.c:570
 msgid "Drift-corrected"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "xscreensaver"
-#: modules/process/drift.c:613
+#: modules/process/drift.c:614
 msgid "Drift"
 msgstr "Deriva"
 
-#: modules/process/drift.c:614 modules/xyz/xyz_drift.c:392
+#: modules/process/drift.c:615 modules/xyz/xyz_drift.c:392
 #: modules/xyz/xyz_drift.c:411 modules/xyz/xyz_drift.c:430
 msgid "drift"
 msgstr ""
 
-#: modules/process/drift.c:620 modules/xyz/xyz_drift.c:402
+#: modules/process/drift.c:621 modules/xyz/xyz_drift.c:402
 msgid "x-axis drift"
 msgstr ""
 
@@ -9385,11 +9704,11 @@ msgstr ""
 msgid "2D DWT Anisotropy"
 msgstr ""
 
-#: modules/process/dwtanisotropy.c:214
+#: modules/process/dwtanisotropy.c:218
 msgid "X/Y ratio threshold:"
 msgstr ""
 
-#: modules/process/dwtanisotropy.c:222
+#: modules/process/dwtanisotropy.c:226
 msgid "Low level exclude limit:"
 msgstr ""
 
@@ -9515,7 +9834,7 @@ msgstr ""
 msgid "_Gaussian FWHM:"
 msgstr ""
 
-#: modules/process/edge.c:681 modules/process/mark_disconn.c:271
+#: modules/process/edge.c:681 modules/process/mark_disconn.c:272
 msgid "_Threshold:"
 msgstr "_Umbral:"
 
@@ -9585,11 +9904,11 @@ msgstr ""
 msgid "Entropy deficit:"
 msgstr ""
 
-#: modules/process/entropy.c:567
+#: modules/process/entropy.c:568
 msgid "Entropy at scales"
 msgstr ""
 
-#: modules/process/entropy.c:586
+#: modules/process/entropy.c:587
 #, fuzzy
 msgid "Best estimate"
 msgstr "e_stimación"
@@ -9648,23 +9967,23 @@ msgstr "_Derecha:"
 msgid "Extend _symetrically"
 msgstr ""
 
-#: modules/process/extend.c:268 modules/process/polydistort.c:256
-#: modules/xyz/xyz_raster.c:658
+#: modules/process/extend.c:268 modules/process/polydistort.c:259
+#: modules/xyz/xyz_raster.c:627
 msgid "exterior|Border"
 msgstr ""
 
-#: modules/process/extend.c:270 modules/process/polydistort.c:258
-#: modules/xyz/xyz_raster.c:660
+#: modules/process/extend.c:270 modules/process/polydistort.c:261
+#: modules/xyz/xyz_raster.c:629
 msgid "exterior|Mirror"
 msgstr ""
 
-#: modules/process/extend.c:272 modules/process/polydistort.c:260
-#: modules/xyz/xyz_raster.c:662
+#: modules/process/extend.c:272 modules/process/polydistort.c:263
+#: modules/xyz/xyz_raster.c:631
 msgid "exterior|Periodic"
 msgstr ""
 
-#: modules/process/extend.c:275 modules/process/polydistort.c:263
-#: modules/xyz/xyz_raster.c:650
+#: modules/process/extend.c:275 modules/process/polydistort.c:266
+#: modules/xyz/xyz_raster.c:619
 msgid "_Exterior type:"
 msgstr ""
 
@@ -9701,13 +10020,13 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "clawsker"
-#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:390
+#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:383
 msgid "X position"
 msgstr "Posición X"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "clawsker"
-#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:397
+#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:389
 msgid "Y position"
 msgstr "Posición Y"
 
@@ -9722,7 +10041,7 @@ msgstr ""
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "celestia"
 #: modules/process/extract_path.c:392 modules/process/extract_path.c:404
-#: modules/process/pat_synth.c:1432 modules/tools/distance.c:146
+#: modules/process/pat_synth.c:1433 modules/tools/distance.c:146
 msgid "Distance"
 msgstr "Distancia"
 
@@ -9767,49 +10086,38 @@ msgstr ""
 msgid "Mark areas by 2D slope"
 msgstr ""
 
-#: modules/process/facet_analysis.c:266
+#: modules/process/facet_analysis.c:270
 msgid "Mark Facets"
 msgstr ""
 
-#: modules/process/facet_analysis.c:269
+#: modules/process/facet_analysis.c:273
 msgid "verb|_Mark"
 msgstr "_Marcar"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
 #. TRANSLATORS: The direction or line orthogonal to something.
-#: modules/process/facet_analysis.c:325
+#: modules/process/facet_analysis.c:329
 msgid "Normal"
 msgstr "Normal"
 
-#: modules/process/facet_analysis.c:333
+#: modules/process/facet_analysis.c:337
 msgid "_Find Maximum"
 msgstr ""
 
-#: modules/process/facet_analysis.c:341
+#: modules/process/facet_analysis.c:345
 msgid "Mean Normal"
 msgstr ""
 
-#: modules/process/facet_analysis.c:350
+#: modules/process/facet_analysis.c:362
 msgid "Facet plane size:"
 msgstr ""
 
-#: modules/process/facet_analysis.c:375
+#: modules/process/facet_analysis.c:370
 msgid "_Tolerance:"
 msgstr ""
 
-#: modules/process/facet_analysis.c:384 modules/process/grain_edge.c:262
-#: modules/process/grain_mark.c:344 modules/process/mark_disconn.c:286
-msgid "Com_bine with existing mask"
-msgstr ""
-
-#: modules/process/facet_analysis.c:398 modules/process/grain_edge.c:276
-#: modules/process/grain_mark.c:358 modules/process/mark_disconn.c:301
-#: modules/process/mark_with.c:230 modules/process/mask_morph.c:210
-msgid "Operation:"
-msgstr ""
-
-#: modules/process/facet_analysis.c:415
+#: modules/process/facet_analysis.c:398
 msgid ""
 "Warning: Lateral and value units differ. Angles are not physically "
 "meaningful."
@@ -9841,8 +10149,8 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gnumeric"
-#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:509
-#: modules/process/noise_synth.c:409
+#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:507
+#: modules/process/noise_synth.c:407
 msgid "_Distribution:"
 msgstr "_Distribución:"
 
@@ -9850,17 +10158,17 @@ msgstr "_Distribución:"
 msgid "Po_wer:"
 msgstr "Potencia:"
 
-#: modules/process/fbm_synth.c:408 modules/process/fft_synth.c:414
-#: modules/process/lno_synth.c:533 modules/process/noise_synth.c:433
+#: modules/process/fbm_synth.c:407 modules/process/fft_synth.c:414
+#: modules/process/lno_synth.c:531 modules/process/noise_synth.c:431
 msgid "_RMS:"
 msgstr "_RMS:"
 
-#: modules/process/fbm_synth.c:477 modules/process/lno_synth.c:251
-#: modules/process/noise_synth.c:178
+#: modules/process/fbm_synth.c:476 modules/process/lno_synth.c:249
+#: modules/process/noise_synth.c:176
 msgid "distribution|Exponential"
 msgstr "Exponencial"
 
-#: modules/process/fbm_synth.c:478
+#: modules/process/fbm_synth.c:477
 #, fuzzy
 msgid "distribution|Power"
 msgstr "Uniforme"
@@ -9924,7 +10232,7 @@ msgstr "Módulo"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "beast"
-#: modules/process/fft.c:327 modules/process/wave_synth.c:583
+#: modules/process/fft.c:327 modules/process/wave_synth.c:618
 msgid "Phase"
 msgstr "Fase"
 
@@ -9944,71 +10252,71 @@ msgstr "Transformada de Hough"
 msgid "I_maginary part:"
 msgstr "Imaginaria"
 
-#: modules/process/fft.c:382
+#: modules/process/fft.c:380
 msgid "_Inverse transform"
 msgstr ""
 
-#: modules/process/fft.c:411
+#: modules/process/fft.c:409
 msgid "Subtract mean _value beforehand"
 msgstr ""
 
-#: modules/process/fft.c:422
+#: modules/process/fft.c:420
 msgid "_Preserve RMS"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:117
+#: modules/process/fft_filter_1d.c:118
 msgid "FFT filtering"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:131
+#: modules/process/fft_filter_1d.c:132
 msgid "/_Correct Data/1D _FFT Filtering..."
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:135
+#: modules/process/fft_filter_1d.c:136
 msgid "1D FFT Filtering"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "claws-mail"
-#: modules/process/fft_filter_1d.c:165 modules/process/wpour_mark.c:391
+#: modules/process/fft_filter_1d.c:166 modules/process/wpour_mark.c:391
 msgid "Marked"
 msgstr "Marcado"
 
-#: modules/process/fft_filter_1d.c:166
+#: modules/process/fft_filter_1d.c:167
 msgid "Unmarked"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "help"
-#: modules/process/fft_filter_1d.c:169
+#: modules/process/fft_filter_1d.c:170
 msgid "Null"
 msgstr "Nulo"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "alleyoop"
-#: modules/process/fft_filter_1d.c:170
+#: modules/process/fft_filter_1d.c:171
 msgid "Suppress"
 msgstr "Suprimir"
 
-#: modules/process/fft_filter_1d.c:180
+#: modules/process/fft_filter_1d.c:181
 msgid "1D FFT filter"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "goffice"
-#: modules/process/fft_filter_1d.c:269 modules/process/linematch.c:861
+#: modules/process/fft_filter_1d.c:271 modules/process/linematch.c:828
 msgid "_Direction:"
 msgstr "_Dirección:"
 
-#: modules/process/fft_filter_1d.c:277
+#: modules/process/fft_filter_1d.c:279
 msgid "_Suppress type:"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:285
+#: modules/process/fft_filter_1d.c:287
 msgid "_Filter type:"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:513
+#: modules/process/fft_filter_1d.c:515
 msgid "1D FFT Filtered Data"
 msgstr ""
 
@@ -10030,9 +10338,10 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp-gap"
-#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:594
-#: modules/process/fit-shape.c:643 modules/process/fit-shape.c:658
-#: modules/process/fit-shape.c:662 modules/process/neural.c:560
+#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:604
+#: modules/process/fit-shape.c:653 modules/process/fit-shape.c:668
+#: modules/process/fit-shape.c:672 modules/process/neural.c:564
+#: modules/process/psf.c:232
 msgid "Difference"
 msgstr "Diferencia"
 
@@ -10092,7 +10401,7 @@ msgstr "_Deshacer"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "banshee"
-#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:556
+#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:562
 msgid "_Fill"
 msgstr "Relle_nar"
 
@@ -10102,7 +10411,7 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "beast"
-#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:339
+#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:329
 msgid "Zoom:"
 msgstr "Ampliación:"
 
@@ -10138,37 +10447,40 @@ msgstr ""
 msgid "Force shapes to center around the origin"
 msgstr ""
 
-#: modules/process/fft_profile.c:125
+#: modules/process/fft_profile.c:124
 msgid ""
 "Reads radial sections of two-dimensional power spectrum density function."
 msgstr ""
 
-#: modules/process/fft_profile.c:140
+#: modules/process/fft_profile.c:139
 msgid "/_Statistics/_PSDF Section..."
 msgstr ""
 
-#: modules/process/fft_profile.c:144
+#: modules/process/fft_profile.c:143
 msgid "Read radial PSDF sections"
 msgstr ""
 
-#: modules/process/fft_profile.c:190
+#: modules/process/fft_profile.c:189
 msgid "Radial PSDF Section"
 msgstr ""
 
-#: modules/process/fft_profile.c:237
+#: modules/process/fft_profile.c:236
 msgid "PSDF Section"
 msgstr ""
 
-#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:336
-#: modules/tools/profile.c:517 modules/tools/sfunctions.c:443
-msgid "_Fix res.:"
-msgstr ""
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "gimp"
+#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:338
+#: modules/tools/profile.c:514 modules/tools/sfunctions.c:454
+#, fuzzy
+msgid "_Fixed resolution:"
+msgstr "Resolución _X:"
 
-#: modules/process/fft_profile.c:279
+#: modules/process/fft_profile.c:278
 msgid "_Separate curves"
 msgstr ""
 
-#: modules/process/fft_profile.c:496
+#: modules/process/fft_profile.c:483
 #, c-format
 msgid "PSDF %.0f°"
 msgstr ""
@@ -10189,11 +10501,15 @@ msgstr ""
 msgid "Spectral Synthesis"
 msgstr ""
 
-#: modules/process/fft_synth.c:429
+#: modules/process/fft_synth.c:430
 msgid "M_inimum frequency:"
 msgstr ""
 
-#: modules/process/fft_synth.c:449
+#: modules/process/fft_synth.c:430 modules/process/fft_synth.c:450
+msgid "px<sup>-1</sup>"
+msgstr ""
+
+#: modules/process/fft_synth.c:450
 msgid "Ma_ximum frequency:"
 msgstr ""
 
@@ -10213,95 +10529,177 @@ msgstr ""
 msgid "Enable _power multiplier"
 msgstr ""
 
-#: modules/process/fit-shape.c:270
+#: modules/process/fibre_synth.c:256
+msgid "Semi-circle"
+msgstr ""
+
+#: modules/process/fibre_synth.c:257
+#, fuzzy
+msgid "Triangle"
+msgstr "Triangular"
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "inkscape"
+#: modules/process/fibre_synth.c:258
+#, fuzzy
+msgid "Rectangle"
+msgstr "Rectángulos"
+
+#: modules/process/fibre_synth.c:260
+msgid "Quadratic spline"
+msgstr ""
+
+#: modules/process/fibre_synth.c:266
+msgid "Generates surfaces composed from randomly placed fibers."
+msgstr ""
+
+#: modules/process/fibre_synth.c:280
+msgid "/S_ynthetic/_Deposition/_Fibers..."
+msgstr ""
+
+#: modules/process/fibre_synth.c:284
+msgid "Generate surface of randomly placed fibers"
+msgstr ""
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "fontforge"
+#: modules/process/fibre_synth.c:420
+#, fuzzy
+msgid "Random Fibers"
+msgstr "Al azar"
+
+#: modules/process/fibre_synth.c:494 modules/process/obj_synth.c:510
+msgid "_Shape:"
+msgstr ""
+
+#: modules/process/fibre_synth.c:513 modules/process/obj_synth.c:529
+msgid "obj."
+msgstr ""
+
+#: modules/process/fibre_synth.c:553
+msgid "Scales _with width"
+msgstr ""
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "compiz-fusion-plugins-extra"
+#: modules/process/fibre_synth.c:591 modules/process/synth.h:485
+msgid "Deformation"
+msgstr "Deformación"
+
+#: modules/process/fibre_synth.c:600 modules/process/lno_synth.c:852
+#: modules/process/lno_synth.c:1222 modules/process/mask_noisify.c:177
+msgid "Densi_ty:"
+msgstr "Densi_dad:"
+
+#: modules/process/fibre_synth.c:607
+#, fuzzy
+msgid "_Lateral:"
+msgstr "Material GL"
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "audacious-plugins"
+#: modules/process/fibre_synth.c:614
+#, fuzzy
+msgid "Le_ngthwise:"
+msgstr "Longitud"
+
+#: modules/process/fibre_synth.c:819
+msgid "Along fiber:"
+msgstr ""
+
+#: modules/process/fibre_synth.c:1180
+msgid "Generating fibers..."
+msgstr ""
+
+#: modules/process/fit-shape.c:264
 msgid "Fits predefined geometrical shapes to data."
 msgstr ""
 
-#: modules/process/fit-shape.c:284
+#: modules/process/fit-shape.c:278
 msgid "/_Level/_Fit Shape..."
 msgstr ""
 
-#: modules/process/fit-shape.c:288 modules/process/fit-shape.c:295
+#: modules/process/fit-shape.c:282 modules/process/fit-shape.c:289
 msgid "Fit geometrical shapes"
 msgstr ""
 
-#: modules/process/fit-shape.c:291
+#: modules/process/fit-shape.c:285
 msgid "/_Fit Shape..."
 msgstr ""
 
-#: modules/process/fit-shape.c:390
+#: modules/process/fit-shape.c:389
 #, fuzzy
 msgid "Fit Shape"
 msgstr "Aproxima esfera"
 
-#: modules/process/fit-shape.c:395
+#: modules/process/fit-shape.c:396
 #, fuzzy
 msgid "verb|_Quick Fit"
 msgstr "_Ajustar"
 
-#: modules/process/fit-shape.c:473 modules/process/fit-shape.c:2159
+#: modules/process/fit-shape.c:474 modules/process/fit-shape.c:2141
 msgid "Derived Quantities"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp-gap"
-#: modules/process/fit-shape.c:478 modules/process/fit-shape.c:2129
+#: modules/process/fit-shape.c:479 modules/process/fit-shape.c:2111
 #, fuzzy
 msgid "Mean square difference:"
 msgstr "Diferencia"
 
-#: modules/process/fit-shape.c:580 modules/process/fit-shape.c:626
-#: modules/process/fit-shape.c:657 modules/process/fit-shape.c:661
+#: modules/process/fit-shape.c:590 modules/process/fit-shape.c:636
+#: modules/process/fit-shape.c:667 modules/process/fit-shape.c:671
 msgid "Fitted shape"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "awn-extras-applets"
-#: modules/process/fit-shape.c:663 modules/process/mark_disconn.c:189
-#: modules/process/scars.c:281
+#: modules/process/fit-shape.c:673 modules/process/mark_disconn.c:189
+#: modules/process/scars.c:299
 msgid "Both"
 msgstr "Ambos"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
-#: modules/process/fit-shape.c:680
+#: modules/process/fit-shape.c:690 modules/process/psf-fit.c:308
 #, fuzzy
 msgid "_Function type:"
 msgstr "Tipo de función:"
 
-#: modules/process/fit-shape.c:708
+#: modules/process/fit-shape.c:720
 msgid "Show differences with _adapted color map"
 msgstr ""
 
-#: modules/process/fit-shape.c:720
+#: modules/process/fit-shape.c:732
 msgid "Full fit is _geometric"
 msgstr ""
 
-#: modules/process/fit-shape.c:757
+#: modules/process/fit-shape.c:769
 msgid "Calculate differences for e_xcluded pixels"
 msgstr ""
 
-#: modules/process/fit-shape.c:804
+#: modules/process/fit-shape.c:816
 msgid "_Recalculate Image"
 msgstr ""
 
-#: modules/process/fit-shape.c:811
+#: modules/process/fit-shape.c:823
 msgid "Revert to _Previous Values"
 msgstr ""
 
-#: modules/process/fit-shape.c:1850
+#: modules/process/fit-shape.c:1864
 msgid "Parameter estimation failed"
 msgstr ""
 
-#: modules/process/fit-shape.c:1853
+#: modules/process/fit-shape.c:1867
 msgid "Fit failed"
 msgstr ""
 
-#: modules/process/fit-shape.c:1855
+#: modules/process/fit-shape.c:1869
 msgid "Fit was interruped"
 msgstr ""
 
-#: modules/process/fit-shape.c:2115
+#: modules/process/fit-shape.c:2097
 msgid "(fixed)"
 msgstr ""
 
@@ -10324,94 +10722,90 @@ msgstr ""
 msgid "Polynomial leveling..."
 msgstr "Polinómico"
 
-#: modules/process/fraccor.c:38
+#: modules/process/fraccor.c:39
 msgid "Removes data under mask using fractal interpolation."
 msgstr ""
 
-#: modules/process/fraccor.c:52
+#: modules/process/fraccor.c:53
 msgid "/_Correct Data/_Fractal Correction"
 msgstr ""
 
-#: modules/process/fraccor.c:56
+#: modules/process/fraccor.c:57
 msgid "Interpolate data under mask with fractal interpolation"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp-gap"
-#: modules/process/fractal.c:134
+#: modules/process/fractal.c:130
 msgid "Partitioning"
 msgstr "Particionado"
 
-#: modules/process/fractal.c:135
+#: modules/process/fractal.c:131
 msgid "Cube counting"
 msgstr ""
 
-#: modules/process/fractal.c:136
+#: modules/process/fractal.c:132
 msgid "Triangulation"
 msgstr "Triangulación"
 
-#: modules/process/fractal.c:137
+#: modules/process/fractal.c:133
 msgid "Power spectrum"
 msgstr ""
 
-#: modules/process/fractal.c:173
+#: modules/process/fractal.c:169
 msgid ""
 "Calculates fractal dimension using several methods (partitioning, box "
 "counting, triangulation, power spectrum)."
 msgstr ""
 
-#: modules/process/fractal.c:188
+#: modules/process/fractal.c:184
 msgid "/_Statistics/_Fractal Dimension..."
 msgstr ""
 
-#: modules/process/fractal.c:192
+#: modules/process/fractal.c:188
 msgid "Calculate fractal dimension"
 msgstr ""
 
-#: modules/process/fractal.c:227
+#: modules/process/fractal.c:223
 msgid "Fractal Dimension"
 msgstr ""
 
-#: modules/process/fractal.c:228
-msgid "Reco_mpute"
-msgstr ""
-
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gok"
-#: modules/process/fractal.c:269
+#: modules/process/fractal.c:253
 msgid "_Method:"
 msgstr "_Método:"
 
-#: modules/process/fractal.c:290
+#: modules/process/fractal.c:269
 msgid "Fit Area"
 msgstr ""
 
-#: modules/process/fractal.c:295
-msgid "From:"
-msgstr "Desde:"
-
-#: modules/process/fractal.c:295 modules/process/fractal.c:589
-#: modules/process/fractal.c:613
+#: modules/process/fractal.c:273 modules/process/fractal.c:545
+#: modules/process/fractal.c:569
 msgid "minimum"
 msgstr "mínimo"
 
-#: modules/process/fractal.c:298
-msgid "To:"
-msgstr "A:"
+#: modules/process/fractal.c:274
+msgid "From:"
+msgstr "Desde:"
 
-#: modules/process/fractal.c:298 modules/process/fractal.c:590
-#: modules/process/fractal.c:614
+#: modules/process/fractal.c:279 modules/process/fractal.c:546
+#: modules/process/fractal.c:570
 msgid "maximum"
 msgstr "máximo"
 
+#: modules/process/fractal.c:280
+msgid "To:"
+msgstr "A:"
+
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "audacity"
-#: modules/process/fractal.c:308 modules/process/mark_with.c:390
-#: modules/process/neural.c:559
+#: modules/process/fractal.c:287 modules/process/mark_with.c:394
+#: modules/process/neural.c:563
 msgid "Result"
 msgstr "Resultado"
 
-#: modules/process/fractal.c:550
+#: modules/process/fractal.c:506
 msgid "Linear fit"
 msgstr ""
 
@@ -10481,11 +10875,11 @@ msgstr ""
 msgid "Grain Correlations"
 msgstr ""
 
-#: modules/process/grain_cross.c:240
+#: modules/process/grain_cross.c:241
 msgid "_Abscissa"
 msgstr "_Abscisa"
 
-#: modules/process/grain_cross.c:244
+#: modules/process/grain_cross.c:245
 msgid "O_rdinate"
 msgstr "O_rdenada"
 
@@ -10515,118 +10909,118 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "darktable"
-#: modules/process/grain_dist.c:553
+#: modules/process/grain_dist.c:547
 msgid "count"
 msgstr "contar"
 
-#: modules/process/grain_dist.c:617
+#: modules/process/grain_dist.c:611
 msgid "Export Raw Grain Values"
 msgstr ""
 
-#: modules/process/grain_edge.c:100
+#: modules/process/grain_edge.c:99
 msgid "Marks grains by edge detection method."
 msgstr ""
 
-#: modules/process/grain_edge.c:114
+#: modules/process/grain_edge.c:113
 msgid "/_Grains/Mark by _Edge Detection..."
 msgstr ""
 
-#: modules/process/grain_edge.c:118
+#: modules/process/grain_edge.c:117
 msgid "Mark grains with edge detection mechanism"
 msgstr ""
 
-#: modules/process/grain_edge.c:207
+#: modules/process/grain_edge.c:206
 msgid "Mark Grains by Edge Detection"
 msgstr ""
 
-#: modules/process/grain_edge.c:245
+#: modules/process/grain_edge.c:244
 msgid "Threshold"
 msgstr "Umbral"
 
-#: modules/process/grain_edge.c:249
+#: modules/process/grain_edge.c:248
 msgid "_Laplacian:"
 msgstr "_Laplaciano:"
 
-#: modules/process/grain_filter.c:195
+#: modules/process/grain_filter.c:194
 msgid ""
 "Filters grains by their properties, using logical expressions and thresholds."
 msgstr ""
 
-#: modules/process/grain_filter.c:210
+#: modules/process/grain_filter.c:209
 msgid "/_Grains/_Filter..."
 msgstr ""
 
-#: modules/process/grain_filter.c:214
+#: modules/process/grain_filter.c:213
 msgid "Filter grains by their properties"
 msgstr ""
 
-#: modules/process/grain_filter.c:254
+#: modules/process/grain_filter.c:253
 msgid "There are no grains to filter."
 msgstr ""
 
-#: modules/process/grain_filter.c:310
+#: modules/process/grain_filter.c:309
 msgid "Filter Grains"
 msgstr ""
 
-#: modules/process/grain_filter.c:405
+#: modules/process/grain_filter.c:404
 msgid "Set selected as:"
 msgstr ""
 
-#: modules/process/grain_filter.c:420
+#: modules/process/grain_filter.c:419
 msgid "Keep grains satisfying:"
 msgstr ""
 
-#: modules/process/grain_filter.c:434 modules/process/lat_synth.c:733
+#: modules/process/grain_filter.c:440 modules/process/lat_synth.c:733
 msgid "Lower threshold:"
 msgstr ""
 
-#: modules/process/grain_filter.c:469 modules/process/lat_synth.c:740
+#: modules/process/grain_filter.c:467 modules/process/lat_synth.c:740
 msgid "Upper threshold:"
 msgstr ""
 
 #. TRANSLATORS: %c is replaced with quantity label A, B or C.
-#: modules/process/grain_filter.c:645
+#: modules/process/grain_filter.c:628
 #, c-format
 msgid "Condition %c: %s"
 msgstr "Condición %c: %s"
 
-#: modules/process/grain_mark.c:139
+#: modules/process/grain_mark.c:137
 msgid "Marks grains by thresholding (height, slope, curvature)."
 msgstr ""
 
-#: modules/process/grain_mark.c:153
+#: modules/process/grain_mark.c:151
 msgid "/_Grains/_Mark by Threshold..."
 msgstr ""
 
-#: modules/process/grain_mark.c:157
+#: modules/process/grain_mark.c:155
 msgid "Mark grains by threshold"
 msgstr ""
 
-#: modules/process/grain_mark.c:241
+#: modules/process/grain_mark.c:240
 msgid "Mark Grains by Threshold"
 msgstr ""
 
-#: modules/process/grain_mark.c:281
+#: modules/process/grain_mark.c:280
 msgid "Threshold by"
 msgstr ""
 
-#: modules/process/grain_mark.c:311
+#: modules/process/grain_mark.c:310
 msgid "_Slope:"
 msgstr "_Rampa:"
 
-#: modules/process/grain_mark.c:315
+#: modules/process/grain_mark.c:314
 msgid "_Curvature:"
 msgstr "_Curvatura:"
 
-#: modules/process/grain_mark.c:324
-msgid "Criteria combination:"
-msgstr ""
-
-#: modules/process/grain_mark.c:328 modules/process/grain_wshed.c:256
+#: modules/process/grain_mark.c:319 modules/process/grain_wshed.c:260
 #: modules/process/wpour_mark.c:358
 msgid "_Invert height"
 msgstr ""
 
+#: modules/process/grain_mark.c:328
+msgid "Criteria combination:"
+msgstr ""
+
 #: modules/process/grain_stat.c:54
 msgid "Displays overall grain statistics."
 msgstr ""
@@ -10703,448 +11097,460 @@ msgstr ""
 msgid "Total projected boundary length:"
 msgstr ""
 
-#: modules/process/grain_wshed.c:101
+#: modules/process/grain_wshed.c:102
 msgid "Marks grains by watershed algorithm."
 msgstr ""
 
-#: modules/process/grain_wshed.c:115
+#: modules/process/grain_wshed.c:116
 msgid "/_Grains/Mark by _Watershed..."
 msgstr ""
 
-#: modules/process/grain_wshed.c:119
+#: modules/process/grain_wshed.c:120
 msgid "Mark grains by watershed"
 msgstr ""
 
-#: modules/process/grain_wshed.c:161
+#: modules/process/grain_wshed.c:162
 msgid "Mark Grains by Watershed"
 msgstr ""
 
-#: modules/process/grain_wshed.c:199
+#: modules/process/grain_wshed.c:200
 msgid "Grain Location"
 msgstr ""
 
-#: modules/process/grain_wshed.c:214
+#: modules/process/grain_wshed.c:216
 msgid "_Drop size:"
 msgstr ""
 
-#: modules/process/grain_wshed.c:230
+#: modules/process/grain_wshed.c:233
 msgid "Segmentation"
 msgstr "Segmentación"
 
-#: modules/process/grain_wshed.c:236
+#: modules/process/grain_wshed.c:239
 msgid "Num_ber of steps:"
 msgstr ""
 
-#: modules/process/grain_wshed.c:244
+#: modules/process/grain_wshed.c:248
 msgid "Dr_op size:"
 msgstr ""
 
-#: modules/process/grain_wshed.c:435
+#: modules/process/grain_wshed.c:439
 msgid "Finding minima..."
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "src"
-#: modules/process/grain_wshed.c:437
+#: modules/process/grain_wshed.c:441
 #, fuzzy
 msgid "Locating..."
 msgstr "Iniciando..."
 
-#: modules/process/grain_wshed.c:439
+#: modules/process/grain_wshed.c:443
 msgid "Simulating watershed..."
 msgstr ""
 
-#: modules/process/grain_wshed.c:441
+#: modules/process/grain_wshed.c:445
 msgid "Marking boundaries..."
 msgstr ""
 
-#: modules/process/hough.c:74
+#: modules/process/hough.c:76
 msgid "Hough transform."
 msgstr ""
 
-#: modules/process/hough.c:88
+#: modules/process/hough.c:90
 msgid "/_Integral Transforms/_Hough..."
 msgstr ""
 
-#: modules/process/hough.c:92
+#: modules/process/hough.c:94
 msgid "Compute Hough transform"
 msgstr ""
 
-#: modules/process/hough.c:178
-msgid "Hough Transform"
-msgstr "Transformada de Hough"
-
-#: modules/process/hough.c:201
-msgid "_Transform type:"
-msgstr ""
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "gimp"
+#: modules/process/hough.c:137
+#, fuzzy
+msgid "Hough line"
+msgstr "Rugosidad"
+
+#: modules/process/hough.c:141
+#, c-format
+msgid "Hough circle r=%d"
+msgstr ""
+
+#: modules/process/hough.c:173
+msgid "Hough Transform"
+msgstr "Transformada de Hough"
 
-#: modules/process/hough.c:212
+#: modules/process/hough.c:195
+msgid "_Transform type:"
+msgstr ""
+
+#: modules/process/hough.c:203
 msgid "_Circle size:"
 msgstr ""
 
-#: modules/process/immerse.c:162
+#: modules/process/immerse.c:163
 msgid "Immerse high resolution detail into overall image."
 msgstr ""
 
-#: modules/process/immerse.c:176
+#: modules/process/immerse.c:177
 msgid "/M_ultidata/_Immerse Detail..."
 msgstr ""
 
-#: modules/process/immerse.c:180
+#: modules/process/immerse.c:181
 msgid "Immerse a detail into image"
 msgstr ""
 
-#: modules/process/immerse.c:222
+#: modules/process/immerse.c:223
 msgid "Immerse Detail"
 msgstr ""
 
-#: modules/process/immerse.c:225
+#: modules/process/immerse.c:226
 msgid "_Locate"
 msgstr ""
 
-#: modules/process/immerse.c:227
+#: modules/process/immerse.c:228
 msgid "Locate detail by full image correlation search"
 msgstr ""
 
-#: modules/process/immerse.c:229
+#: modules/process/immerse.c:230
 msgid "_Improve"
 msgstr "_Mejorar"
 
-#: modules/process/immerse.c:231
+#: modules/process/immerse.c:232
 msgid "Improve detail position by correlation search in neighborhood"
 msgstr ""
 
-#: modules/process/immerse.c:290
+#: modules/process/immerse.c:291
 msgid "_Detail image:"
 msgstr ""
 
-#: modules/process/immerse.c:295
+#: modules/process/immerse.c:296
 msgid "Position:"
 msgstr "Posición:"
 
-#: modules/process/immerse.c:308
+#: modules/process/immerse.c:314
 msgid "Result Sampling"
 msgstr ""
 
-#: modules/process/immerse.c:318
+#: modules/process/immerse.c:324
 msgid "_Upsample large image"
 msgstr ""
 
-#: modules/process/immerse.c:320
+#: modules/process/immerse.c:326
 msgid "_Downsample detail"
 msgstr ""
 
-#: modules/process/immerse.c:329
+#: modules/process/immerse.c:335
 msgid "Detail Leveling"
 msgstr ""
 
-#: modules/process/immerse.c:339
+#: modules/process/immerse.c:345
 msgid "levelling|_None"
 msgstr ""
 
-#: modules/process/immerse.c:341
+#: modules/process/immerse.c:347
 msgid "_Mean value"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "orage"
-#: modules/process/immerse.c:349
+#: modules/process/immerse.c:355
 msgid "Show _frame"
 msgstr "Mostrar _marco"
 
-#: modules/process/immerse.c:787
+#: modules/process/immerse.c:793
 msgid "Immersed detail"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "ario"
-#: modules/process/indent_analyze.c:261
+#: modules/process/indent_analyze.c:246
 msgid "Do nothing"
 msgstr "No hacer nada"
 
-#: modules/process/indent_analyze.c:262
+#: modules/process/indent_analyze.c:247
 msgid "Plane level"
 msgstr ""
 
-#: modules/process/indent_analyze.c:263
+#: modules/process/indent_analyze.c:248
 msgid "Plane rotate"
 msgstr ""
 
-#: modules/process/indent_analyze.c:267
+#: modules/process/indent_analyze.c:252
 msgid "New"
 msgstr "Nuevo"
 
-#: modules/process/indent_analyze.c:268
+#: modules/process/indent_analyze.c:253
 msgid "AND"
 msgstr "AND"
 
-#: modules/process/indent_analyze.c:269
+#: modules/process/indent_analyze.c:254
 msgid "OR"
 msgstr "OR"
 
-#: modules/process/indent_analyze.c:270
+#: modules/process/indent_analyze.c:255
 msgid "NOT"
 msgstr "NOT"
 
-#: modules/process/indent_analyze.c:271
+#: modules/process/indent_analyze.c:256
 msgid "XOR"
 msgstr "XOR"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "bluefish"
-#: modules/process/indent_analyze.c:275
+#: modules/process/indent_analyze.c:260
 msgid "Nothing"
 msgstr "Nada"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "compiz-fusion-plugins-extra"
-#: modules/process/indent_analyze.c:276
+#: modules/process/indent_analyze.c:261
 msgid "Above"
 msgstr "Arriba"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "compiz-fusion-plugins-extra"
-#: modules/process/indent_analyze.c:277
+#: modules/process/indent_analyze.c:262
 msgid "Below"
 msgstr "Debajo"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
-#: modules/process/indent_analyze.c:278
+#: modules/process/indent_analyze.c:263
 msgid "Plane"
 msgstr "Plano"
 
-#: modules/process/indent_analyze.c:279
+#: modules/process/indent_analyze.c:264
 msgid "Impression"
 msgstr ""
 
-#: modules/process/indent_analyze.c:280
+#: modules/process/indent_analyze.c:265
 msgid "Inner Pile-up"
 msgstr ""
 
-#: modules/process/indent_analyze.c:281
+#: modules/process/indent_analyze.c:266
 msgid "Outer Pile-up"
 msgstr ""
 
-#: modules/process/indent_analyze.c:282
+#: modules/process/indent_analyze.c:267
 msgid "Special points"
 msgstr ""
 
-#: modules/process/indent_analyze.c:283
+#: modules/process/indent_analyze.c:268
 msgid "Faces border"
 msgstr ""
 
-#: modules/process/indent_analyze.c:287
+#: modules/process/indent_analyze.c:272
 msgid "Vickers"
 msgstr "Vickers"
 
-#: modules/process/indent_analyze.c:288
+#: modules/process/indent_analyze.c:273
 msgid "Berkovich"
 msgstr "Berkovich"
 
-#: modules/process/indent_analyze.c:289
+#: modules/process/indent_analyze.c:274
 msgid "Berkovich (modified)"
 msgstr "Berkovich (modificado)"
 
-#: modules/process/indent_analyze.c:290
+#: modules/process/indent_analyze.c:275
 msgid "Knoop"
 msgstr "Knoop"
 
-#: modules/process/indent_analyze.c:291
+#: modules/process/indent_analyze.c:276
 msgid "Brinell"
 msgstr "Brinell"
 
-#: modules/process/indent_analyze.c:292
+#: modules/process/indent_analyze.c:277
 msgid "Cube corner"
 msgstr "esquina de cubo"
 
-#: modules/process/indent_analyze.c:293
+#: modules/process/indent_analyze.c:278
 msgid "Rockwell"
 msgstr "Rockwell"
 
-#: modules/process/indent_analyze.c:303
+#: modules/process/indent_analyze.c:288
 msgid "Analyses nanoindentation structure (volumes, surfaces, ...)."
 msgstr ""
 
-#: modules/process/indent_analyze.c:320
+#: modules/process/indent_analyze.c:302
 msgid "/_Tip and Indentation/_Analyze Imprint..."
 msgstr ""
 
-#: modules/process/indent_analyze.c:439
+#: modules/process/indent_analyze.c:410
 msgid "Marked _areas:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:445
+#: modules/process/indent_analyze.c:419
 msgid "_Indentor type:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:451
+#: modules/process/indent_analyze.c:428
 msgid "_Mask creation type:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:456
+#: modules/process/indent_analyze.c:434
 msgid "Ref. plane _tolerance:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:460
+#: modules/process/indent_analyze.c:438
 msgid "Angle _1 tolerance:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:485
+#: modules/process/indent_analyze.c:456
 msgid "Indent center at"
 msgstr ""
 
-#: modules/process/indent_analyze.c:488
+#: modules/process/indent_analyze.c:460
 msgid "Maximum at"
 msgstr ""
 
-#: modules/process/indent_analyze.c:491
+#: modules/process/indent_analyze.c:464
 msgid "Max-min difference"
 msgstr ""
 
-#: modules/process/indent_analyze.c:497
+#: modules/process/indent_analyze.c:472
 msgid "Expected A<sub>d</sub>:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:505
+#: modules/process/indent_analyze.c:479
 msgid "Expected A<sub>p</sub>:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:549
+#: modules/process/indent_analyze.c:489
 msgid "Volume above-below"
 msgstr ""
 
-#: modules/process/indent_analyze.c:558
+#: modules/process/indent_analyze.c:494
 msgid "Indent. volume"
 msgstr ""
 
-#: modules/process/indent_analyze.c:564
+#: modules/process/indent_analyze.c:502
 msgid "Indent. A<sub>d</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:573
+#: modules/process/indent_analyze.c:509
 msgid "Indent. A<sub>p</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:587
+#: modules/process/indent_analyze.c:517
 msgid "Inner Pile-Up A<sub>d</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:596
+#: modules/process/indent_analyze.c:525
 msgid "Inner Pile-Up A<sub>p</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:605
+#: modules/process/indent_analyze.c:533
 msgid "Outer Pile-Up A<sub>d</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:614
+#: modules/process/indent_analyze.c:541
 msgid "Outer Pile-Up A<sub>p</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:644
+#: modules/process/indent_analyze.c:569
 msgid "Indentation statistics"
 msgstr ""
 
-#: modules/process/indent_analyze.c:645
+#: modules/process/indent_analyze.c:570
 msgid "_Compute & mark"
 msgstr ""
 
-#: modules/process/indent_analyze.c:646
+#: modules/process/indent_analyze.c:571
 msgid "_Save statistics"
 msgstr "_Guardar estadísticas"
 
-#: modules/process/indent_analyze.c:1569
+#: modules/process/indent_analyze.c:1392
 msgid "No statistics has been computed yet."
 msgstr ""
 
-#: modules/process/indent_analyze.c:1577
+#: modules/process/indent_analyze.c:1400
 msgid "Save Indentation Statistics"
 msgstr "Guardar Estadísticas de Indentación"
 
-#: modules/process/indent_analyze.c:1615
+#: modules/process/indent_analyze.c:1438
 #, c-format
 msgid "Indentor:  %s\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1619
+#: modules/process/indent_analyze.c:1442
 #, c-format
 msgid "Length units: %s\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1621
+#: modules/process/indent_analyze.c:1444
 #, c-format
 msgid "Indentation center at [%d, %d] px:      %lf\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1623
+#: modules/process/indent_analyze.c:1446
 #, c-format
 msgid "Maximum at [%d, %d] is:                 %lf\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1625
+#: modules/process/indent_analyze.c:1448
 #, c-format
 msgid "Difference max-min:                     %lf\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1630
+#: modules/process/indent_analyze.c:1453
 #, c-format
 msgid "Area (projected) above plane:             %g (%.1lf %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1634
+#: modules/process/indent_analyze.c:1457
 #, c-format
 msgid "Area (projected) below plane:             %g (%.1lf %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1638
+#: modules/process/indent_analyze.c:1461
 #, c-format
 msgid "Area (projected) of    plane:             %g (%.1lf %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1643
+#: modules/process/indent_analyze.c:1466
 #, c-format
 msgid "Area (developed) above %g (+%.1f %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1646
+#: modules/process/indent_analyze.c:1469
 #, c-format
 msgid "Area (developed) below %g (+%.1lf %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1650
+#: modules/process/indent_analyze.c:1473
 #, c-format
 msgid "Volume above:     %g\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1652
+#: modules/process/indent_analyze.c:1475
 #, c-format
 msgid "Volume below:     %g\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1654
+#: modules/process/indent_analyze.c:1477
 #, c-format
 msgid "Volume difference %g\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1658
+#: modules/process/indent_analyze.c:1481
 msgid ""
 "\n"
 "Indentation\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1659
+#: modules/process/indent_analyze.c:1482
 #, c-format
 msgid "Volume      %g\n"
 msgstr "Volumen      %g\n"
 
-#: modules/process/indent_analyze.c:1664
+#: modules/process/indent_analyze.c:1487
 msgid ""
 "\n"
 "Indentation - Inner Pile-Up\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1670
+#: modules/process/indent_analyze.c:1493
 msgid "Indentation - Outer Pile-Up\n"
 msgstr ""
 
@@ -11256,13 +11662,6 @@ msgstr "Parámetros"
 msgid "_Lattice:"
 msgstr ""
 
-# Translation for this string generated by http://littlesvr.ca/ostd/
-# based on translation from "control-center"
-#: modules/process/lat_synth.c:651 modules/process/obj_synth.c:544
-#: modules/process/pat_synth.c:1457
-msgid "_Size:"
-msgstr "_Tamaño:"
-
 #: modules/process/lat_synth.c:662
 msgid "Lattice rela_xation:"
 msgstr ""
@@ -11400,7 +11799,7 @@ msgstr ""
 # based on translation from "abiword"
 #: modules/process/level_grains.c:187 modules/process/median-bg.c:167
 #: modules/process/polylevel.c:293 modules/process/polylevel.c:417
-#: modules/process/sphere-revolve.c:200
+#: modules/process/sphere-revolve.c:221 modules/process/sphere-revolve.c:295
 msgid "Background"
 msgstr "Fondo"
 
@@ -11412,178 +11811,177 @@ msgstr ""
 msgid "Quantity to level:"
 msgstr ""
 
-#: modules/process/level_grains.c:231 modules/process/linematch.c:866
-#: modules/process/median-bg.c:217 modules/process/polylevel.c:482
-#: modules/process/sphere-revolve.c:263
+#: modules/process/level_grains.c:231 modules/process/linematch.c:834
+#: modules/process/median-bg.c:217 modules/process/polylevel.c:485
+#: modules/process/sphere-revolve.c:371
 msgid "E_xtract background"
 msgstr ""
 
-#: modules/process/linecorrect.c:54
+#: modules/process/linecorrect.c:52
 msgid "Corrects line defects (mostly experimental algorithms)."
 msgstr ""
 
-#: modules/process/linecorrect.c:68
+#: modules/process/linecorrect.c:66
 msgid "/_Correct Data/Ste_p Line Correction"
 msgstr ""
 
-#: modules/process/linecorrect.c:72
+#: modules/process/linecorrect.c:70
 msgid "Correct steps in lines"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "setup"
-#: modules/process/linematch.c:158 modules/tools/linestats.c:166
+#: modules/process/linematch.c:155 modules/tools/linestats.c:166
 #: modules/volume/volume_linestat.c:143
 msgid "Median"
 msgstr "Medo"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp-gap"
-#: modules/process/linematch.c:159
+#: modules/process/linematch.c:156
 #, fuzzy
 msgid "Median of differences"
 msgstr "Diferencia"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gnomint"
-#: modules/process/linematch.c:160
+#: modules/process/linematch.c:157
 #, fuzzy
 msgid "Modus"
 msgstr "Módulo"
 
-#: modules/process/linematch.c:161
+#: modules/process/linematch.c:158
 msgid "linematch|Matching"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "goffice"
-#: modules/process/linematch.c:162
+#: modules/process/linematch.c:159
 #, fuzzy
 msgid "linematch|Polynomial"
 msgstr "Polinómico"
 
-#: modules/process/linematch.c:168
+#: modules/process/linematch.c:165
 msgid "Aligns rows by various methods."
 msgstr ""
 
-#: modules/process/linematch.c:182
+#: modules/process/linematch.c:179
 msgid "/_Correct Data/_Align rows..."
 msgstr ""
 
-#: modules/process/linematch.c:186
+#: modules/process/linematch.c:183
 msgid "Align rows using various methods"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
-#: modules/process/linematch.c:237 modules/process/linematch.c:265
+#: modules/process/linematch.c:234 modules/process/linematch.c:262
 #, fuzzy
 msgid "Row background"
 msgstr "Fondo"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "clawsker"
-#: modules/process/linematch.c:266
+#: modules/process/linematch.c:263
 #, fuzzy
 msgid "Vertical position"
 msgstr "Posición X"
 
-#: modules/process/linematch.c:267
+#: modules/process/linematch.c:264
 msgid "Corrected offset"
 msgstr ""
 
-#: modules/process/linematch.c:802
+#: modules/process/linematch.c:769
 #, fuzzy
 msgid "Align Rows"
 msgstr "Nivela curvas de gráfico"
 
-#: modules/process/linematch.c:844
+#: modules/process/linematch.c:810
 #, fuzzy
 msgid "_Polynomial degree:"
 msgstr "Polinomial(orden 0)"
 
-#: modules/process/linematch.c:876
+#: modules/process/linematch.c:844
 #, fuzzy
 msgid "Plot background _graph"
 msgstr "_Presenta gráfico"
 
-#: modules/process/lno_synth.c:261 modules/process/noise_synth.c:188
+#: modules/process/lno_synth.c:259 modules/process/noise_synth.c:186
 msgid "distribution|Triangular"
 msgstr "Triangular"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "beast"
-#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:213
+#: modules/process/lno_synth.c:265 modules/process/pat_synth.c:213
 msgid "Steps"
 msgstr "Pasos"
 
-#: modules/process/lno_synth.c:268
+#: modules/process/lno_synth.c:266
 msgid "Scars"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "inkscape"
-#: modules/process/lno_synth.c:269 modules/process/pat_synth.c:214
+#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:214
 msgid "Ridges"
 msgstr "Crestas"
 
-#: modules/process/lno_synth.c:275
+#: modules/process/lno_synth.c:273
 msgid "Generates various kinds of line noise."
 msgstr ""
 
-#: modules/process/lno_synth.c:289
+#: modules/process/lno_synth.c:287
 msgid "/S_ynthetic/_Line Noise..."
 msgstr ""
 
-#: modules/process/lno_synth.c:293
+#: modules/process/lno_synth.c:291
 msgid "Generate line noise"
 msgstr ""
 
-#: modules/process/lno_synth.c:431
+#: modules/process/lno_synth.c:429
 msgid "Line Noise"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "help"
-#: modules/process/lno_synth.c:504
+#: modules/process/lno_synth.c:502
 msgid "Distribution"
 msgstr "Distribución"
 
-# Translation for this string generated by http://littlesvr.ca/ostd/
-# based on translation from "dia"
-#: modules/process/lno_synth.c:514 modules/process/noise_synth.c:414
-msgid "Direction:"
-msgstr "Dirección:"
+#: modules/process/lno_synth.c:512 modules/process/mask_noisify.c:158
+#: modules/process/noise_synth.c:412
+#, fuzzy
+msgid "Noise type:"
+msgstr "Características"
 
-#: modules/process/lno_synth.c:523 modules/process/noise_synth.c:423
+#: modules/process/lno_synth.c:521 modules/process/mask_noisify.c:167
+#: modules/process/noise_synth.c:421
 msgid "S_ymmetrical"
 msgstr "Simétrico"
 
-#: modules/process/lno_synth.c:524 modules/process/noise_synth.c:424
+#: modules/process/lno_synth.c:522 modules/process/mask_noisify.c:168
+#: modules/process/noise_synth.c:422
 msgid "One-sided _positive"
 msgstr ""
 
-#: modules/process/lno_synth.c:525 modules/process/noise_synth.c:425
+#: modules/process/lno_synth.c:523 modules/process/mask_noisify.c:169
+#: modules/process/noise_synth.c:423
 msgid "One-sided _negative"
 msgstr ""
 
-#: modules/process/lno_synth.c:546
+#: modules/process/lno_synth.c:544
 msgid "Noise Type"
 msgstr ""
 
-#: modules/process/lno_synth.c:551
+#: modules/process/lno_synth.c:549
 msgid "_Noise type:"
 msgstr ""
 
-#: modules/process/lno_synth.c:853 modules/process/lno_synth.c:1222
-msgid "Densi_ty:"
-msgstr "Densi_dad:"
-
-#: modules/process/lno_synth.c:864 modules/process/lno_synth.c:1233
+#: modules/process/lno_synth.c:863 modules/process/lno_synth.c:1233
 msgid "_Within line:"
 msgstr ""
 
-#: modules/process/lno_synth.c:871
+#: modules/process/lno_synth.c:870
 msgid "C_umulative"
 msgstr ""
 
@@ -11642,36 +12040,36 @@ msgstr ""
 msgid "_Train logistic regression"
 msgstr ""
 
-#: modules/process/logistic.c:275
+#: modules/process/logistic.c:274
 #, fuzzy
 msgid "_Gaussian blur"
 msgstr "Gaussiano"
 
-#: modules/process/logistic.c:288
+#: modules/process/logistic.c:285
 #, fuzzy
 msgid "_Number of Gaussians:"
 msgstr "_Número de Lados:"
 
-#: modules/process/logistic.c:296
+#: modules/process/logistic.c:293
 msgid "_Sobel derivatives"
 msgstr ""
 
-#: modules/process/logistic.c:307
+#: modules/process/logistic.c:303
 #, fuzzy
 msgid "_Laplacian"
 msgstr "_Laplaciano:"
 
-#: modules/process/logistic.c:318
+#: modules/process/logistic.c:313
 #, fuzzy
 msgid "_Hessian"
 msgstr "Gaussiano"
 
-#: modules/process/logistic.c:331
+#: modules/process/logistic.c:325
 #, fuzzy
 msgid "_Regularization parameter:"
 msgstr "Guardar Parámetros de Rugosidad "
 
-#: modules/process/logistic.c:623 modules/process/neural.c:1101
+#: modules/process/logistic.c:616 modules/process/neural.c:1108
 msgid "Training..."
 msgstr "Entrenamiento..."
 
@@ -11689,15 +12087,15 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "goffice"
-#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:422
-#: modules/process/scars.c:279
+#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:419
+#: modules/process/scars.c:297
 msgid "Positive"
 msgstr "Positivo"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "compiz-fusion-plugins-extra"
-#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:423
-#: modules/process/scars.c:280
+#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:420
+#: modules/process/scars.c:298
 msgid "Negative"
 msgstr "Negativo"
 
@@ -11719,12 +12117,12 @@ msgstr "Radio medio"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "anjuta"
-#: modules/process/mark_disconn.c:563
+#: modules/process/mark_disconn.c:552
 #, fuzzy
 msgid "Filtering..."
 msgstr "Filtro"
 
-#: modules/process/mark_disconn.c:590
+#: modules/process/mark_disconn.c:579
 msgid "Marking outliers..."
 msgstr ""
 
@@ -11740,55 +12138,59 @@ msgstr ""
 msgid "Mask combining and modification"
 msgstr ""
 
-#: modules/process/mark_with.c:192
+#: modules/process/mark_with.c:193
 msgid "Mark With"
 msgstr ""
 
-#: modules/process/mark_with.c:238
-msgid "Se_t mask"
+#: modules/process/mark_with.c:231 modules/process/mask_morph.c:209
+msgid "Operation:"
 msgstr ""
 
 #: modules/process/mark_with.c:239
-msgid "_Add mask"
+msgid "Se_t mask"
 msgstr ""
 
 #: modules/process/mark_with.c:240
-msgid "_Subtract mask"
+msgid "_Add mask"
 msgstr ""
 
 #: modules/process/mark_with.c:241
+msgid "_Subtract mask"
+msgstr ""
+
+#: modules/process/mark_with.c:242
 msgid "_Intersect masks"
 msgstr ""
 
-#: modules/process/mark_with.c:247
+#: modules/process/mark_with.c:248
 msgid "Mark with:"
 msgstr ""
 
-#: modules/process/mark_with.c:255
+#: modules/process/mark_with.c:256
 msgid "with|_Mask"
 msgstr ""
 
-#: modules/process/mark_with.c:257
+#: modules/process/mark_with.c:258
 msgid "with|_Data"
 msgstr ""
 
-#: modules/process/mark_with.c:259
+#: modules/process/mark_with.c:260
 msgid "with|_Presentation"
 msgstr ""
 
-#: modules/process/mark_with.c:293
+#: modules/process/mark_with.c:297
 msgid "Marked data range:"
 msgstr ""
 
-#: modules/process/mark_with.c:301
+#: modules/process/mark_with.c:305
 msgid "_Minimum:"
 msgstr "_Mínimo:"
 
-#: modules/process/mark_with.c:310
+#: modules/process/mark_with.c:314
 msgid "M_aximum:"
 msgstr "M_áximo:"
 
-#: modules/process/mark_with.c:378
+#: modules/process/mark_with.c:382
 msgid "Operand"
 msgstr ""
 
@@ -11835,122 +12237,122 @@ msgstr "Distribuir"
 msgid "Preserve existing masks"
 msgstr ""
 
-#: modules/process/mask_edt.c:95
+#: modules/process/mask_edt.c:89
 msgid "Performs simple and true Euclidean distance transforms of masks."
 msgstr ""
 
-#: modules/process/mask_edt.c:109
+#: modules/process/mask_edt.c:103
 msgid "/_Mask/Distanc_e Transform..."
 msgstr ""
 
-#: modules/process/mask_edt.c:113
+#: modules/process/mask_edt.c:107
 msgid "Distance transform of mask"
 msgstr ""
 
-#: modules/process/mask_edt.c:116
+#: modules/process/mask_edt.c:110
 msgid "/_Mask/Thi_n"
 msgstr ""
 
-#: modules/process/mask_edt.c:120
+#: modules/process/mask_edt.c:114
 #, fuzzy
 msgid "Thin mask"
 msgstr "Editar máscara"
 
-#: modules/process/mask_edt.c:330 modules/process/mask_edt.c:352
+#: modules/process/mask_edt.c:164 modules/process/mask_edt.c:186
 msgid "Distance Transform"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "geeqie"
-#: modules/process/mask_edt.c:340
+#: modules/process/mask_edt.c:174
 msgid "Interior"
 msgstr "Interior"
 
-#: modules/process/mask_edt.c:341
+#: modules/process/mask_edt.c:175
 msgid "Exterior"
 msgstr ""
 
-#: modules/process/mask_edt.c:342
+#: modules/process/mask_edt.c:176
 msgid "Two-sided"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "xfce4-settings"
-#: modules/process/mask_edt.c:373 modules/tools/maskedit.c:634
+#: modules/process/mask_edt.c:207 modules/tools/maskedit.c:640
 #, fuzzy
 msgid "_Distance type:"
 msgstr "_Distancia"
 
-#: modules/process/mask_edt.c:394 modules/tools/maskedit.c:640
+#: modules/process/mask_edt.c:228 modules/tools/maskedit.c:646
 msgid "Shrink from _border"
 msgstr ""
 
-#: modules/process/mask_morph.c:117
+#: modules/process/mask_morph.c:116
 msgid "Performs basic morphological operations with masks."
 msgstr ""
 
-#: modules/process/mask_morph.c:131
-msgid "/_Mask/Morphological Operation..."
+#: modules/process/mask_morph.c:130
+msgid "/_Mask/Morpho_logical Operation..."
 msgstr ""
 
-#: modules/process/mask_morph.c:135
+#: modules/process/mask_morph.c:134
 msgid "Morphological operation with mask"
 msgstr ""
 
-#: modules/process/mask_morph.c:169
+#: modules/process/mask_morph.c:168
 #, fuzzy
 msgid "Erosion"
 msgstr "Erosión"
 
-#: modules/process/mask_morph.c:170
+#: modules/process/mask_morph.c:169
 #, fuzzy
 msgid "Dilation"
 msgstr "Dilatación"
 
-#: modules/process/mask_morph.c:171 modules/tools/filter.c:242
+#: modules/process/mask_morph.c:170 modules/tools/filter.c:243
 #, fuzzy
 msgid "filter|Opening"
 msgstr "Gaussiano"
 
-#: modules/process/mask_morph.c:172 modules/tools/filter.c:243
+#: modules/process/mask_morph.c:171 modules/tools/filter.c:244
 #, fuzzy
 msgid "filter|Closing"
 msgstr "Gaussiano"
 
-#: modules/process/mask_morph.c:173 modules/tools/filter.c:244
+#: modules/process/mask_morph.c:172 modules/tools/filter.c:245
 msgid "ASF Opening"
 msgstr ""
 
-#: modules/process/mask_morph.c:174 modules/tools/filter.c:245
+#: modules/process/mask_morph.c:173 modules/tools/filter.c:246
 msgid "ASF Closing"
 msgstr ""
 
-#: modules/process/mask_morph.c:178
+#: modules/process/mask_morph.c:177
 msgid "Octagon"
 msgstr ""
 
-#: modules/process/mask_morph.c:181
+#: modules/process/mask_morph.c:180
 msgid "Another mask"
 msgstr ""
 
-#: modules/process/mask_morph.c:192
+#: modules/process/mask_morph.c:191
 msgid "Morphological Operation"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "bygfoot"
-#: modules/process/mask_morph.c:224
+#: modules/process/mask_morph.c:223
 #, fuzzy
 msgid "Structuring element:"
 msgstr "Formación"
 
-#: modules/process/mask_morph.c:238 modules/tools/maskedit.c:524
+#: modules/process/mask_morph.c:237 modules/tools/maskedit.c:528
 msgid "_Radius:"
 msgstr "_Radio:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
-#: modules/process/mask_morph.c:249
+#: modules/process/mask_morph.c:248
 #, fuzzy
 msgid "_Mask:"
 msgstr "_Máscara"
@@ -11959,39 +12361,63 @@ msgstr "_Máscara"
 msgid "_Trim empty borders"
 msgstr ""
 
-#: modules/process/maskcor.c:86
+#: modules/process/mask_noisify.c:83
+msgid "Adds salt and/or pepper noise to mask."
+msgstr ""
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "dia"
+#: modules/process/mask_noisify.c:97
+#, fuzzy
+msgid "/_Mask/_Noisify..."
+msgstr "Distribuir"
+
+#: modules/process/mask_noisify.c:101
+#, fuzzy
+msgid "Add noise to mask"
+msgstr "Editar máscara"
+
+#: modules/process/mask_noisify.c:141
+msgid "Noisify Mask"
+msgstr ""
+
+#: modules/process/mask_noisify.c:184
+msgid "_Alter only boundaries"
+msgstr ""
+
+#: modules/process/maskcor.c:87
 msgid "Creates mask by correlation with another data."
 msgstr ""
 
-#: modules/process/maskcor.c:100
+#: modules/process/maskcor.c:101
 msgid "/M_ultidata/_Mask by Correlation..."
 msgstr ""
 
-#: modules/process/maskcor.c:104
+#: modules/process/maskcor.c:105
 msgid "Create mask by correlation with another data"
 msgstr ""
 
-#: modules/process/maskcor.c:141
+#: modules/process/maskcor.c:142
 msgid "Mask by Correlation"
 msgstr ""
 
-#: modules/process/maskcor.c:165
+#: modules/process/maskcor.c:166
 msgid "Correlation _kernel:"
 msgstr ""
 
-#: modules/process/maskcor.c:172
+#: modules/process/maskcor.c:173
 msgid "Objects marked"
 msgstr ""
 
-#: modules/process/maskcor.c:173
+#: modules/process/maskcor.c:174
 msgid "Correlation maxima"
 msgstr ""
 
-#: modules/process/maskcor.c:174 modules/process/maskcor.c:356
+#: modules/process/maskcor.c:175 modules/process/maskcor.c:360
 msgid "Correlation score"
 msgstr ""
 
-#: modules/process/maskcor.c:183
+#: modules/process/maskcor.c:185
 msgid "Correlation _method:"
 msgstr ""
 
@@ -12020,7 +12446,8 @@ msgid "/_Mask/_Extract Mask"
 msgstr ""
 
 #: modules/process/maskops.c:78
-msgid "Extract mask to a new channel"
+#, fuzzy
+msgid "Extract mask to a new image"
 msgstr "Extrae máscara a un nuevo canal"
 
 #: modules/process/maskops.c:81
@@ -12047,35 +12474,31 @@ msgstr ""
 msgid "Mutual Crop"
 msgstr ""
 
-#: modules/process/mcrop.c:174
+#: modules/process/mcrop.c:173
 msgid "_Select second argument:"
 msgstr ""
 
-#: modules/process/measure_lattice.c:174
+#: modules/process/measure_lattice.c:165
 msgid "Measures parameters of two-dimensional lattices."
 msgstr ""
 
-#: modules/process/measure_lattice.c:188
+#: modules/process/measure_lattice.c:179
 msgid "/_Statistics/Measure _Lattice..."
 msgstr ""
 
-#: modules/process/measure_lattice.c:192
+#: modules/process/measure_lattice.c:183
 msgid "Measure lattice"
 msgstr ""
 
-#: modules/process/measure_lattice.c:253
+#: modules/process/measure_lattice.c:243
 msgid "Measure Lattice"
 msgstr ""
 
-#: modules/process/measure_lattice.c:259
-msgid "_Refine"
-msgstr ""
-
-#: modules/process/measure_lattice.c:330
+#: modules/process/measure_lattice.c:320
 msgid "_ACF"
 msgstr ""
 
-#: modules/process/measure_lattice.c:331
+#: modules/process/measure_lattice.c:321
 msgid "_PSDF"
 msgstr ""
 
@@ -12094,40 +12517,40 @@ msgstr ""
 msgid "_Vectors"
 msgstr ""
 
-#: modules/process/measure_lattice.c:596
+#: modules/process/measure_lattice.c:589
 #, fuzzy
 msgid "Save Lattice Parameters"
 msgstr "Guardar Parámetros de Rugosidad "
 
-#: modules/process/measure_lattice.c:634
+#: modules/process/measure_lattice.c:627
 #, c-format
 msgid "Vector %d:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "audacious-plugins"
-#: modules/process/measure_lattice.c:643
+#: modules/process/measure_lattice.c:636
 #, fuzzy, c-format
 msgid "Length %d:"
 msgstr "Longitud"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "cssed"
-#: modules/process/measure_lattice.c:650
+#: modules/process/measure_lattice.c:643
 #, fuzzy, c-format
 msgid "Angle %d:"
 msgstr "Ángulo"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "cssed"
-#: modules/process/measure_lattice.c:665
+#: modules/process/measure_lattice.c:657
 #, fuzzy
 msgid "Angle:"
 msgstr "Ángulo"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "audacity"
-#: modules/process/measure_lattice.c:681
+#: modules/process/measure_lattice.c:673
 #, fuzzy
 msgid "Lattice Parameters"
 msgstr "Parámetros"
@@ -12155,11 +12578,11 @@ msgstr "Polinómico"
 msgid "Median Level"
 msgstr ""
 
-#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:237
+#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:336
 msgid "Real _radius:"
 msgstr ""
 
-#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:247
+#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:346
 msgid "_Pixel radius:"
 msgstr ""
 
@@ -12208,7 +12631,7 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "enigma"
-#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:643
+#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:612
 #, fuzzy
 msgid "Average"
 msgstr "Media:"
@@ -12264,6 +12687,250 @@ msgstr ""
 msgid "Merged images"
 msgstr "Imágenes fusionadas"
 
+#: modules/process/mfm_current.c:163
+msgid "Simulation of current line magnetic field"
+msgstr ""
+
+#: modules/process/mfm_current.c:177
+msgid "/SPM M_odes/_MFM/_Current Line Field..."
+msgstr ""
+
+#: modules/process/mfm_current.c:181
+msgid "Simulate stray field above current line"
+msgstr ""
+
+#: modules/process/mfm_current.c:280 modules/process/mfm_parallel.c:282
+msgid "Simulated field"
+msgstr ""
+
+#: modules/process/mfm_current.c:322 modules/process/mfm_field.c:266
+#: modules/process/mfm_parallel.c:324
+msgid "Point charge"
+msgstr ""
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "coccinella"
+#: modules/process/mfm_current.c:323 modules/process/mfm_field.c:267
+#: modules/process/mfm_parallel.c:325
+#, fuzzy
+msgid "Bar"
+msgstr "Binario"
+
+#: modules/process/mfm_current.c:330
+msgid "Current Line Stray Field"
+msgstr ""
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "calibre"
+#: modules/process/mfm_current.c:415
+#, fuzzy
+msgid "Output"
+msgstr "Opciones de salida"
+
+#: modules/process/mfm_current.c:420 modules/process/mfm_field.c:320
+#: modules/process/mfm_parallel.c:415
+msgid "_Output plane height:"
+msgstr ""
+
+#: modules/process/mfm_current.c:428
+#, fuzzy
+msgid "_Stripe width:"
+msgstr "Nueva _anchura:"
+
+#: modules/process/mfm_current.c:436
+msgid "Stripe _current:"
+msgstr ""
+
+#: modules/process/mfm_current.c:444
+#, fuzzy
+msgid "_Position:"
+msgstr "Posición:"
+
+#: modules/process/mfm_current.c:461
+msgid "Probe"
+msgstr ""
+
+#: modules/process/mfm_current.c:469
+#, fuzzy
+msgid "P_robe type:"
+msgstr "Características"
+
+#: modules/process/mfm_current.c:475 modules/process/mfm_field.c:389
+#: modules/process/mfm_parallel.c:482
+#, fuzzy
+msgid "Tip _magnetization:"
+msgstr "Punta _rotación:"
+
+#: modules/process/mfm_current.c:484 modules/process/mfm_field.c:397
+#: modules/process/mfm_parallel.c:491
+#, fuzzy
+msgid "Bar width _x:"
+msgstr "Nueva _anchura:"
+
+#: modules/process/mfm_current.c:493 modules/process/mfm_field.c:405
+#: modules/process/mfm_parallel.c:500
+#, fuzzy
+msgid "Bar width _y:"
+msgstr "Nueva _anchura:"
+
+#: modules/process/mfm_current.c:502 modules/process/mfm_field.c:413
+#: modules/process/mfm_parallel.c:509
+msgid "Bar length (_z):"
+msgstr ""
+
+#: modules/process/mfm_field.c:146
+msgid "Simulation of magnetic field above perpendicular media"
+msgstr ""
+
+#: modules/process/mfm_field.c:160
+msgid "/SPM M_odes/_MFM/_Perpendicular Media Field..."
+msgstr ""
+
+#: modules/process/mfm_field.c:164
+msgid "Compute stray field above perpendicular magnetic medium"
+msgstr ""
+
+#: modules/process/mfm_field.c:276
+msgid "Perpendicular Media Stray Field"
+msgstr ""
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "gimp"
+#: modules/process/mfm_field.c:328 modules/process/mfm_parallel.c:423
+#, fuzzy
+msgid "_Film thickness:"
+msgstr "G_rosor:"
+
+#: modules/process/mfm_field.c:336
+msgid "_Magnetic charge:"
+msgstr ""
+
+#: modules/process/mfm_field.c:344
+msgid "Include domain _walls"
+msgstr ""
+
+#: modules/process/mfm_field.c:354
+msgid "_Exchange constant:"
+msgstr ""
+
+#: modules/process/mfm_field.c:362
+#, fuzzy
+msgid "_Uniaxial anisotropy:"
+msgstr "Punta _pendiente:"
+
+#: modules/process/mfm_field.c:383 modules/process/mfm_parallel.c:476
+#, fuzzy
+msgid "_Probe type:"
+msgstr "Características"
+
+#: modules/process/mfm_findshift.c:88
+msgid "Lift height difference estimation from data blur"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:102
+msgid "/SPM M_odes/_MFM/_Estimate Shift in Z..."
+msgstr ""
+
+#: modules/process/mfm_findshift.c:106
+msgid "Estimate lift height difference in MFM data"
+msgstr ""
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "banshee-community-extensions"
+#: modules/process/mfm_findshift.c:166 modules/process/psf.c:340
+#, fuzzy
+msgid "Searching..."
+msgstr "Escaneando..."
+
+#: modules/process/mfm_findshift.c:196
+#, fuzzy
+msgid "Estimated shift:"
+msgstr "Punta estimada"
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "gimp-gap"
+#: modules/process/mfm_findshift.c:211
+#, fuzzy
+msgid "Shifted field difference"
+msgstr "Diferencia"
+
+#: modules/process/mfm_findshift.c:228
+msgid "Estimate Lift Height Shift"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:255
+msgid "Data to compare:"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:261
+#, fuzzy
+msgid "Search _from:"
+msgstr "Guardar Parámetros de Rugosidad "
+
+#: modules/process/mfm_findshift.c:269
+msgid "Search _to:"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:165
+msgid "Simulation of parallel magnetic media"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:179
+msgid "/SPM M_odes/_MFM/Para_llel Media Field..."
+msgstr ""
+
+#: modules/process/mfm_parallel.c:183
+msgid "Simulate stray field above parallel magnetic medium"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:331
+msgid "Parallel Media Stray Field"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:431
+#, fuzzy
+msgid "_Remanent magnetization:"
+msgstr "Punta _rotación:"
+
+#: modules/process/mfm_parallel.c:439
+msgid "Size _A (dir. left):"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:447
+msgid "Size _B (dir. right):"
+msgstr ""
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "po"
+#: modules/process/mfm_parallel.c:455
+#, fuzzy
+msgid "_Gap size:"
+msgstr "Intervalo:"
+
+#: modules/process/mfm_shift.c:87
+msgid "Simulation of magnetic field z component change for another level"
+msgstr ""
+
+#: modules/process/mfm_shift.c:101
+msgid "/SPM M_odes/_MFM/_Field Shift in Z..."
+msgstr ""
+
+#: modules/process/mfm_shift.c:105
+msgid "Compute stray field shift for another z level"
+msgstr ""
+
+#: modules/process/mfm_shift.c:146
+msgid "Shifted field"
+msgstr ""
+
+#: modules/process/mfm_shift.c:164
+msgid "Stray Field Plane Shift"
+msgstr ""
+
+#: modules/process/mfm_shift.c:209
+msgid "_Z shift by:"
+msgstr ""
+
 #: modules/process/nanoindent_adjust.c:89
 msgid "Adjust images of two indentor prints."
 msgstr ""
@@ -12300,14 +12967,14 @@ msgstr ""
 msgid "E_xtrapolate result data out of measured range"
 msgstr ""
 
-#: modules/process/nanoindent_adjust.c:295
+#: modules/process/nanoindent_adjust.c:296
 msgid ""
 "Tip has different range/resolution ratio than image. Tip will be resampled."
 msgstr ""
 "Punta tiene distinto ratio de  rango/resolución que la imagen. Punta será re-"
 "muestreada."
 
-#: modules/process/nanoindent_adjust.c:334
+#: modules/process/nanoindent_adjust.c:335
 msgid "Immersed detail data"
 msgstr ""
 
@@ -12350,266 +13017,254 @@ msgstr ""
 msgid "error"
 msgstr "error"
 
-#: modules/process/neural.c:503
+#: modules/process/neural.c:504
 msgid "NN training error"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "bygfoot"
-#: modules/process/neural.c:516
+#: modules/process/neural.c:517
 msgid "Training"
 msgstr "Entrenamiento"
 
-#: modules/process/neural.c:520
+#: modules/process/neural.c:521
 msgid "_Model:"
 msgstr "_Modelo:"
 
-#: modules/process/neural.c:530
+#: modules/process/neural.c:532
 msgid "_Signal:"
 msgstr "_Señal:"
 
-#: modules/process/neural.c:541
+#: modules/process/neural.c:544
 msgid "Training ste_ps:"
 msgstr ""
 
-#: modules/process/neural.c:557
+#: modules/process/neural.c:561
 msgid "Model"
 msgstr "Modelo"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "anjuta"
-#: modules/process/neural.c:558
+#: modules/process/neural.c:562
 msgid "Signal"
 msgstr "Señal"
 
-#: modules/process/neural.c:575
+#: modules/process/neural.c:579
 msgid "verb|_Train"
 msgstr "_Entrenar"
 
-#: modules/process/neural.c:580
+#: modules/process/neural.c:584
 msgid "Re_initialize"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "audacious"
-#: modules/process/neural.c:613
+#: modules/process/neural.c:617
 msgid "Network"
 msgstr "Red"
 
-#: modules/process/neural.c:619
+#: modules/process/neural.c:623
 msgid "Window _width:"
 msgstr ""
 
-#: modules/process/neural.c:627
+#: modules/process/neural.c:631
 msgid "Window h_eight:"
 msgstr ""
 
-#: modules/process/neural.c:635
+#: modules/process/neural.c:639
 msgid "_Hidden nodes:"
 msgstr ""
 
-#: modules/process/neural.c:643
+#: modules/process/neural.c:647
 msgid "Result Units"
 msgstr ""
 
-#: modules/process/neural.c:650
+#: modules/process/neural.c:654
 msgid "Power of source _XY:"
 msgstr ""
 
-#: modules/process/neural.c:658
+#: modules/process/neural.c:663
 msgid "Power of source _Z:"
 msgstr ""
 
-#: modules/process/neural.c:666
+#: modules/process/neural.c:672
 msgid "_Fixed units:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "amule"
-#: modules/process/neural.c:676
+#: modules/process/neural.c:683
 msgid "Networks"
 msgstr "Redes"
 
-#: modules/process/neural.c:723
+#: modules/process/neural.c:730
 msgid "Network _name:"
 msgstr ""
 
-#: modules/process/neural.c:775
+#: modules/process/neural.c:782
 msgid "Apply Neural Network"
 msgstr ""
 
-#: modules/process/neural.c:798
+#: modules/process/neural.c:805
 msgid "_Scale proportionally to input"
 msgstr ""
 
-#: modules/process/neural.c:929
+#: modules/process/neural.c:936
 msgid "Model and signal are not compatible."
 msgstr ""
 
-#: modules/process/neural.c:937
+#: modules/process/neural.c:944
 msgid "A field dimension is too small for chosen window size."
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "monodevelop"
-#: modules/process/neural.c:1183 modules/process/neural.c:1349
+#: modules/process/neural.c:1190 modules/process/neural.c:1356
 msgid "Evaluating..."
 msgstr "Evaluando..."
 
-#: modules/process/neural.c:1309
+#: modules/process/neural.c:1316
 msgid "Training was canceled."
 msgstr ""
 
-#: modules/process/neural.c:1319
+#: modules/process/neural.c:1326
 #, c-format
 msgid "Mean difference: %.*f %s"
 msgstr ""
 
-#: modules/process/neural.c:1371
+#: modules/process/neural.c:1378
 msgid "Evaluated signal"
 msgstr ""
 
-#: modules/process/noise_synth.c:196
+#: modules/process/noise_synth.c:194
 msgid "Generates uncorrelated random noise."
 msgstr ""
 
-#: modules/process/noise_synth.c:210
+#: modules/process/noise_synth.c:208
 msgid "/S_ynthetic/_Noise..."
 msgstr ""
 
-#: modules/process/noise_synth.c:214
+#: modules/process/noise_synth.c:212
 msgid "Generate surface of uncorrelated noise"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "pinta"
-#: modules/process/noise_synth.c:334
+#: modules/process/noise_synth.c:332
 msgid "Random Noise"
 msgstr "Ruido aleatorio"
 
-#: modules/process/obj_synth.c:274
+#: modules/process/obj_synth.c:270
 msgid "Spheres"
 msgstr "Esferas"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gbrainy"
-#: modules/process/obj_synth.c:275
+#: modules/process/obj_synth.c:271
 msgid "Boxes"
 msgstr "Cajas"
 
-#: modules/process/obj_synth.c:276
+#: modules/process/obj_synth.c:272
 msgid "Cones"
 msgstr "Conos"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "freeciv"
-#: modules/process/obj_synth.c:277
+#: modules/process/obj_synth.c:273
 msgid "Pyramids"
 msgstr "Las Pirámides"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "help"
-#: modules/process/obj_synth.c:278
+#: modules/process/obj_synth.c:274
 msgid "Diamonds"
 msgstr "Diamantes"
 
-#: modules/process/obj_synth.c:279
+#: modules/process/obj_synth.c:275
 msgid "Tetrahedrons"
 msgstr "Tetraedros"
 
-#: modules/process/obj_synth.c:280
+#: modules/process/obj_synth.c:276
 msgid "Nuggets"
 msgstr "Pepitas"
 
-#: modules/process/obj_synth.c:281
+#: modules/process/obj_synth.c:277
 msgid "Thatches"
 msgstr "Paja"
 
-#: modules/process/obj_synth.c:282
+#: modules/process/obj_synth.c:278
 msgid "Tents"
 msgstr "Tiendas"
 
-#: modules/process/obj_synth.c:283
+#: modules/process/obj_synth.c:279
 msgid "Gaussians"
 msgstr "Gaussianas"
 
-#: modules/process/obj_synth.c:284
+#: modules/process/obj_synth.c:280
 msgid "Doughnuts"
 msgstr "Rosquillas"
 
-#: modules/process/obj_synth.c:285
+#: modules/process/obj_synth.c:281
 #, fuzzy
 msgid "Parabolic bumps"
 msgstr "Paralelo"
 
-#: modules/process/obj_synth.c:291
+#: modules/process/obj_synth.c:287
 msgid "Generates randomly patterned surfaces by placing objects."
 msgstr ""
 
-#: modules/process/obj_synth.c:305
-msgid "/S_ynthetic/_Objects..."
+#: modules/process/obj_synth.c:301
+msgid "/S_ynthetic/_Deposition/_Objects..."
 msgstr ""
 
-#: modules/process/obj_synth.c:309
+#: modules/process/obj_synth.c:305
 msgid "Generate surface of randomly placed objects"
 msgstr ""
 
-#: modules/process/obj_synth.c:424
+#: modules/process/obj_synth.c:421
 msgid "Both (random)"
 msgstr ""
 
-#: modules/process/obj_synth.c:439
+#: modules/process/obj_synth.c:436
 msgid "Random Objects"
 msgstr ""
 
-#: modules/process/obj_synth.c:513
-msgid "_Shape:"
-msgstr ""
-
-#: modules/process/obj_synth.c:531
-msgid "obj."
-msgstr ""
-
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "compiz-fusion-plugins-extra"
-#: modules/process/obj_synth.c:551
+#: modules/process/obj_synth.c:549
 msgid "Aspect Ratio"
 msgstr "Relacion de aspecto"
 
-#: modules/process/obj_synth.c:558
+#: modules/process/obj_synth.c:556
 msgid "_Aspect ratio:"
 msgstr ""
 
-#: modules/process/obj_synth.c:588
+#: modules/process/obj_synth.c:586
 msgid "Scales _with size"
 msgstr ""
 
-#: modules/process/obj_synth.c:612
+#: modules/process/obj_synth.c:611
 #, fuzzy
 msgid "_Feature type:"
 msgstr "Características"
 
-#: modules/process/obj_synth.c:807
-msgid "_Truncate:"
-msgstr ""
-
-#: modules/process/otsu_threshold.c:39 modules/process/otsu_threshold.c:59
+#: modules/process/otsu_threshold.c:40 modules/process/otsu_threshold.c:60
 msgid "Automated threshold using Otsu's method on heights."
 msgstr ""
 
-#: modules/process/otsu_threshold.c:55
-msgid "/_Grains/_Mark by Otsu's..."
+#: modules/process/otsu_threshold.c:56
+msgid "/_Grains/_Mark by Otsu's"
 msgstr ""
 
-#: modules/process/outliers.c:40
+#: modules/process/outliers.c:41
 msgid "Creates mask of outliers."
 msgstr ""
 
-#: modules/process/outliers.c:54
+#: modules/process/outliers.c:55
 msgid "/_Correct Data/Mask of _Outliers"
 msgstr ""
 
-#: modules/process/outliers.c:58
+#: modules/process/outliers.c:59
 msgid "Mark data farther than 3σ from mean value"
 msgstr ""
 
@@ -12639,87 +13294,110 @@ msgstr "Pa_trón:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "amule"
-#: modules/process/pat_synth.c:812
+#: modules/process/pat_synth.c:813
 msgid "Flat"
 msgstr "Plano"
 
-#: modules/process/pat_synth.c:820
+#: modules/process/pat_synth.c:821
 msgid "_Flat width:"
 msgstr ""
 
-#: modules/process/pat_synth.c:837 modules/process/pat_synth.c:1139
-#: modules/process/pat_synth.c:1474
+#: modules/process/pat_synth.c:838 modules/process/pat_synth.c:1140
+#: modules/process/pat_synth.c:1475
 msgid "_Slope width:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
-#: modules/process/pat_synth.c:1099
+#: modules/process/pat_synth.c:1100
 msgid "Top"
 msgstr "Superior"
 
-#: modules/process/pat_synth.c:1106
+#: modules/process/pat_synth.c:1107
 msgid "Flat _top width:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
-#: modules/process/pat_synth.c:1114
+#: modules/process/pat_synth.c:1115
 msgid "Bottom"
 msgstr "Inferior"
 
-#: modules/process/pat_synth.c:1122
+#: modules/process/pat_synth.c:1123
 msgid "Flat _bottom width:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "xfce4-settings"
-#: modules/process/pat_synth.c:1440
+#: modules/process/pat_synth.c:1441
 msgid "_Distance:"
 msgstr "_Distancia"
 
-#: modules/process/pid.c:96
+#: modules/process/phase_synth.c:136
+msgid "Generates phase-separated structures."
+msgstr ""
+
+#: modules/process/phase_synth.c:150
+msgid "/S_ynthetic/P_hases..."
+msgstr ""
+
+#: modules/process/phase_synth.c:154
+msgid "Generate surface with separated phases"
+msgstr ""
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "libgda4"
+#: modules/process/phase_synth.c:203
+#, fuzzy
+msgid "Separated Phases"
+msgstr "Valores separados por comas"
+
+#: modules/process/phase_synth.c:287
+msgid "Size s_pread:"
+msgstr ""
+
+#: modules/process/pid.c:95
 msgid "A simple PID simulator"
 msgstr ""
 
-#: modules/process/pid.c:110
+#: modules/process/pid.c:109
 #, fuzzy
 msgid "/_Tip and Indentation/_PID simulation..."
 msgstr "/_Punta/_Dilatación... "
 
-#: modules/process/pid.c:114
+#: modules/process/pid.c:113
 msgid "Simulate PID effects on measurement"
 msgstr ""
 
-#: modules/process/pid.c:158
+#: modules/process/pid.c:157
 msgid "PID FW result"
 msgstr ""
 
-#: modules/process/pid.c:167
+#: modules/process/pid.c:166
 msgid "PID FW max. force"
 msgstr ""
 
-#: modules/process/pid.c:176
+#: modules/process/pid.c:175
 msgid "PID REV result"
 msgstr ""
 
-#: modules/process/pid.c:185
+#: modules/process/pid.c:184
 msgid "PID REV max. force"
 msgstr ""
 
-#: modules/process/pid.c:198
+#: modules/process/pid.c:196
 msgid "PID simulation"
 msgstr ""
 
-#: modules/process/pid.c:215
+#: modules/process/pid.c:214
 msgid "_Proportional:"
 msgstr ""
 
-#: modules/process/pid.c:221
+#: modules/process/pid.c:220
 msgid "_Integral:"
 msgstr ""
 
-#: modules/process/pid.c:227
+#: modules/process/pid.c:226
 msgid "_Integration steps:"
 msgstr ""
 
@@ -12727,15 +13405,15 @@ msgstr ""
 msgid "_Derivative:"
 msgstr ""
 
-#: modules/process/pid.c:241
+#: modules/process/pid.c:240
 msgid "PID/scan speed _ratio:"
 msgstr ""
 
-#: modules/process/pid.c:253
+#: modules/process/pid.c:255
 msgid "Force strength:"
 msgstr ""
 
-#: modules/process/pid.c:259
+#: modules/process/pid.c:261
 msgid "Force setpoint:"
 msgstr ""
 
@@ -12745,7 +13423,7 @@ msgstr ""
 msgid "Scanning..."
 msgstr "Escaneando..."
 
-#: modules/process/pid.c:396
+#: modules/process/pid.c:401
 msgid "Computation diverged, try to change parameters"
 msgstr ""
 
@@ -12765,23 +13443,23 @@ msgstr ""
 msgid "Distort by Polynomial"
 msgstr ""
 
-#: modules/process/polydistort.c:282
+#: modules/process/polydistort.c:285
 msgid "Ori_ginal"
 msgstr ""
 
-#: modules/process/polydistort.c:283
+#: modules/process/polydistort.c:286
 msgid "_Transformed"
 msgstr ""
 
-#: modules/process/polydistort.c:289
+#: modules/process/polydistort.c:292
 msgid "X Coefficients"
 msgstr ""
 
-#: modules/process/polydistort.c:303
+#: modules/process/polydistort.c:306
 msgid "Y Coefficients"
 msgstr ""
 
-#: modules/process/polydistort.c:499
+#: modules/process/polydistort.c:502
 msgid "Distorted"
 msgstr ""
 
@@ -12817,23 +13495,23 @@ msgstr ""
 msgid "_Horizontal polynom degree:"
 msgstr ""
 
-#: modules/process/polylevel.c:450
+#: modules/process/polylevel.c:451
 msgid "_Vertical polynom degree:"
 msgstr ""
 
-#: modules/process/polylevel.c:456
+#: modules/process/polylevel.c:458
 msgid "_Same degrees"
 msgstr ""
 
-#: modules/process/polylevel.c:474
+#: modules/process/polylevel.c:476
 msgid "_Maximum polynom degree:"
 msgstr ""
 
-#: modules/process/polylevel.c:561
+#: modules/process/polylevel.c:564
 msgid "Polynomial Coefficients"
 msgstr ""
 
-#: modules/process/polylevel.c:934 modules/tools/distance.c:594
+#: modules/process/polylevel.c:937 modules/tools/distance.c:594
 #: modules/tools/selectionmanager.c:720
 msgid "Save Table"
 msgstr "Guardar Tabla"
@@ -12855,7 +13533,8 @@ msgid "/_Presentation/E_xtract Presentation"
 msgstr ""
 
 #: modules/process/presentationops.c:81
-msgid "Extract presentation to a new channel"
+#, fuzzy
+msgid "Extract presentation to a new image"
 msgstr "Extraer presentación a un nuevo canal "
 
 #: modules/process/presentationops.c:84
@@ -12882,6 +13561,10 @@ msgstr ""
 msgid "_Data to attach:"
 msgstr ""
 
+#: modules/process/preview.h:245
+msgid "Combine with existing mask:"
+msgstr ""
+
 #: modules/process/psdf_logphi.c:76
 msgid ""
 "Two-dimensional FFT (Fast Fourier Transform) transformed to coordinates (log-"
@@ -12900,10 +13583,88 @@ msgstr ""
 msgid "Log-Phi PSDF"
 msgstr ""
 
-#: modules/process/psdf_logphi.c:275 modules/process/wpour_mark.c:320
+#: modules/process/psdf_logphi.c:276 modules/process/wpour_mark.c:320
+#, fuzzy
+msgid "Gaussian _smoothing:"
+msgstr "Gaussianas"
+
+#: modules/process/psf-fit.c:165
+#, fuzzy
+msgid "Gaussian (asymmetric)"
+msgstr "Gaussianas"
+
+#: modules/process/psf-fit.c:177
+msgid "Point spread function estimation by fitting explicit function form."
+msgstr ""
+
+#: modules/process/psf-fit.c:191
+msgid "/_Statistics/_PSF Fit..."
+msgstr ""
+
+#: modules/process/psf-fit.c:195
+msgid "Fit PSF from known data and image"
+msgstr ""
+
+#: modules/process/psf-fit.c:246 modules/process/psf.c:181
+#: modules/process/psf.c:230
+msgid "PSF"
+msgstr ""
+
+#: modules/process/psf-fit.c:254 modules/process/psf.c:195
+msgid "PSF*P"
+msgstr ""
+
+#: modules/process/psf-fit.c:271
+#, fuzzy
+msgid "Fit PSF"
+msgstr "Aproxima esfera"
+
+#: modules/process/psf-fit.c:289 modules/process/psf.c:286
+msgid "_Ideal response:"
+msgstr ""
+
+#: modules/process/psf.c:117
+#, fuzzy
+msgid "Point spread function estimation"
+msgstr "Estimación de punta ciega"
+
+#: modules/process/psf.c:131
+msgid "/_Statistics/_PSF Guess..."
+msgstr ""
+
+#: modules/process/psf.c:135
+msgid "Estimate PSF from known data and image"
+msgstr ""
+
+#: modules/process/psf.c:208
+msgid "PSF*P - I"
+msgstr ""
+
+#: modules/process/psf.c:231
+msgid "Convolved"
+msgstr ""
+
+#: modules/process/psf.c:237
+#, fuzzy
+msgid "Estimate PSF"
+msgstr "Estimar"
+
+#: modules/process/psf.c:238
+#, fuzzy
+msgid "_Fit"
+msgstr "_Ajustar"
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "audacious-plugins"
+#: modules/process/psf.c:295
+#, fuzzy
+msgid "_Display:"
+msgstr "Mostrar:"
+
+#: modules/process/psf.c:301
 #, fuzzy
-msgid "Gaussian _smoothing:"
-msgstr "Gaussianas"
+msgid "_Sigma init:"
+msgstr "_Señal:"
 
 #: modules/process/rank.c:92
 msgid "Enhances local contrast using a rank transform."
@@ -12961,7 +13722,7 @@ msgstr ""
 msgid "Rotate by arbitrary angle"
 msgstr ""
 
-#: modules/process/rotate.c:192
+#: modules/process/rotate.c:192 modules/volume/volume_swaxes.c:651
 msgid "Rotated Data"
 msgstr ""
 
@@ -13027,63 +13788,63 @@ msgstr ""
 msgid "verb|Scale"
 msgstr ""
 
-#: modules/process/scale.c:216
+#: modules/process/scale.c:217
 msgid "Scale by _ratio:"
 msgstr ""
 
-#: modules/process/scale.c:224
+#: modules/process/scale.c:225
 msgid "_proportional"
 msgstr ""
 
-#: modules/process/scale.c:235
+#: modules/process/scale.c:237
 msgid "New _width:"
 msgstr "Nueva _anchura:"
 
-#: modules/process/scale.c:243
+#: modules/process/scale.c:246
 msgid "New _height:"
 msgstr "Nueva _altura"
 
-#: modules/process/scars.c:113
+#: modules/process/scars.c:122
 msgid "Marks and/or removes scars (horizontal linear artifacts)."
 msgstr ""
 
-#: modules/process/scars.c:127
+#: modules/process/scars.c:136
 msgid "/_Correct Data/M_ark Scars..."
 msgstr ""
 
-#: modules/process/scars.c:131
+#: modules/process/scars.c:140
 msgid "Mark horizontal scars (strokes)"
 msgstr ""
 
-#: modules/process/scars.c:134
+#: modules/process/scars.c:143
 msgid "/_Correct Data/Remove _Scars"
 msgstr ""
 
-#: modules/process/scars.c:138
+#: modules/process/scars.c:147
 msgid "Correct horizontal scars (strokes)"
 msgstr ""
 
-#: modules/process/scars.c:293
+#: modules/process/scars.c:312
 msgid "Mark Scars"
 msgstr ""
 
-#: modules/process/scars.c:331
+#: modules/process/scars.c:353
 msgid "Maximum _width:"
 msgstr ""
 
-#: modules/process/scars.c:338
+#: modules/process/scars.c:361
 msgid "Minimum _length:"
 msgstr ""
 
-#: modules/process/scars.c:345
+#: modules/process/scars.c:369
 msgid "_Hard threshold:"
 msgstr ""
 
-#: modules/process/scars.c:353
+#: modules/process/scars.c:377
 msgid "_Soft threshold:"
 msgstr ""
 
-#: modules/process/scars.c:361
+#: modules/process/scars.c:385
 msgid "Scars type:"
 msgstr ""
 
@@ -13130,29 +13891,29 @@ msgstr ""
 msgid "_Quality:"
 msgstr ""
 
-#: modules/process/shade.c:92
+#: modules/process/shade.c:94
 msgid "Creates a shaded presentation of data."
 msgstr ""
 
-#: modules/process/shade.c:106
+#: modules/process/shade.c:108
 msgid "/_Presentation/_Shading..."
 msgstr ""
 
-#: modules/process/shade.c:110
+#: modules/process/shade.c:112
 msgid "Shade data"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
-#: modules/process/shade.c:207
+#: modules/process/shade.c:209
 msgid "Shading"
 msgstr "Sombreado"
 
-#: modules/process/shade.c:253
+#: modules/process/shade.c:260
 msgid "_Mix:"
 msgstr ""
 
-#: modules/process/slope_dist.c:161
+#: modules/process/slope_dist.c:160
 msgid ""
 "Calculates one- or two-dimensional distribution of slopes or graph of their "
 "angular distribution."
@@ -13160,82 +13921,138 @@ msgstr ""
 "Calcula una distribución uni y bi dimensional de rampas o gráfico de su "
 "distribución angular"
 
-#: modules/process/slope_dist.c:176
+#: modules/process/slope_dist.c:175
 msgid "/_Statistics/_Slope Distribution..."
 msgstr ""
 
-#: modules/process/slope_dist.c:180
+#: modules/process/slope_dist.c:179
 msgid "Calculate angular slope distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:221
+#: modules/process/slope_dist.c:220
 msgid "Slope distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:253
+#: modules/process/slope_dist.c:252
 msgid "_Two-dimensional distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:254
+#: modules/process/slope_dist.c:253
 msgid "Directional (φ) _graph"
 msgstr "_gráfico  Direccional (φ) "
 
-#: modules/process/slope_dist.c:255
+#: modules/process/slope_dist.c:254
 msgid "_Inclination (θ) graph"
 msgstr ""
 
-#: modules/process/slope_dist.c:256
+#: modules/process/slope_dist.c:255
 msgid "Inclination (gra_dient) graph"
 msgstr ""
 
-#: modules/process/slope_dist.c:270
+#: modules/process/slope_dist.c:269
 msgid "Slope Distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:755
+#: modules/process/slope_dist.c:749
 msgid "Angular Slope Distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:763 modules/process/tilt.c:179
+#: modules/process/slope_dist.c:757 modules/process/tilt.c:179
 msgid "Slopes"
 msgstr ""
 
-#: modules/process/slope_dist.c:824 modules/process/slope_dist.c:893
+#: modules/process/slope_dist.c:818 modules/process/slope_dist.c:887
 msgid "Inclination Distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:832 modules/process/slope_dist.c:901
+#: modules/process/slope_dist.c:826 modules/process/slope_dist.c:895
 msgid "Inclinations"
 msgstr ""
 
-#: modules/process/sphere-revolve.c:97
+#: modules/process/sphere-revolve.c:111
 msgid "Subtracts background by arc or sphere revolution."
 msgstr ""
 
-#: modules/process/sphere-revolve.c:113
+#: modules/process/sphere-revolve.c:125
 msgid "/_Level/Revolve _Arc..."
 msgstr ""
 
-#: modules/process/sphere-revolve.c:117
+#: modules/process/sphere-revolve.c:129
 msgid "Level data by arc revolution"
 msgstr ""
 
-#: modules/process/sphere-revolve.c:208 modules/tools/sfunctions.c:371
+#: modules/process/sphere-revolve.c:132
+msgid "/_Level/Revolve _Sphere..."
+msgstr ""
+
+#: modules/process/sphere-revolve.c:136
+msgid "Level data by sphere revolution"
+msgstr ""
+
+#: modules/process/sphere-revolve.c:303 modules/tools/sfunctions.c:381
 msgid "_Horizontal direction"
 msgstr ""
 
-#: modules/process/sphere-revolve.c:209 modules/tools/sfunctions.c:372
+#: modules/process/sphere-revolve.c:304 modules/tools/sfunctions.c:382
 msgid "_Vertical direction"
 msgstr ""
 
-#: modules/process/sphere-revolve.c:210
+#: modules/process/sphere-revolve.c:305
 msgid "_Both directions"
 msgstr ""
 
-#: modules/process/sphere-revolve.c:217
+#: modules/process/sphere-revolve.c:315
+#, fuzzy
+msgid "Revolve Sphere"
+msgstr "Esferas"
+
+#: modules/process/sphere-revolve.c:315
 msgid "Revolve Arc"
 msgstr ""
 
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "dia"
+#: modules/process/sphere-revolve.c:355
+msgid "Direction:"
+msgstr "Dirección:"
+
+#: modules/process/sphere-revolve.c:699
+msgid "Revolving sphere..."
+msgstr ""
+
+#: modules/process/stitch.c:135
+msgid "Stitch multiple images based on offsets of origins."
+msgstr ""
+
+#: modules/process/stitch.c:149
+#, fuzzy
+msgid "/M_ultidata/_Stitch..."
+msgstr "/M_ultidatos/_Fusionar..."
+
+#: modules/process/stitch.c:153
+msgid "Stitch images using offsets"
+msgstr ""
+
+#: modules/process/stitch.c:269
+msgid "Stitch"
+msgstr ""
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "gtk2_ardour"
+#: modules/process/stitch.c:312
+msgid "Channels"
+msgstr "Canales"
+
+#: modules/process/stitch.c:435
+#, fuzzy
+msgid "Restore"
+msgstr "_Archivar"
+
+#: modules/process/stitch.c:445 modules/tools/linestats.c:379
+#: modules/tools/sfunctions.c:440 modules/tools/stats.c:406
+msgid "_Instant updates"
+msgstr ""
+
 #: modules/process/straighten_path.c:126
 msgid "Extracts a straightened part of image along a curve."
 msgstr ""
@@ -13252,35 +14069,35 @@ msgstr ""
 msgid "Straighten Path"
 msgstr ""
 
-#: modules/process/straighten_path.c:254
+#: modules/process/straighten_path.c:253
 #, fuzzy
 msgid "Res_tore"
 msgstr "_Archivar"
 
-#: modules/process/straighten_path.c:259
+#: modules/process/straighten_path.c:258
 msgid "Re_verse"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
 #: modules/process/straighten_path.c:278 modules/tools/pathlevel.c:256
-#: modules/tools/profile.c:507 modules/tools/roughness.c:854
+#: modules/tools/profile.c:503 modules/tools/roughness.c:868
 msgid "_Thickness:"
 msgstr "G_rosor:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
-#: modules/process/straighten_path.c:286
+#: modules/process/straighten_path.c:287
 #, fuzzy
 msgid "_Slackness:"
 msgstr "G_rosor:"
 
-#: modules/process/straighten_path.c:292
+#: modules/process/straighten_path.c:293
 #, fuzzy
 msgid "C_losed curve"
 msgstr "Cierra archivo"
 
-#: modules/process/straighten_path.c:379
+#: modules/process/straighten_path.c:380
 msgid "Straightened"
 msgstr ""
 
@@ -13301,62 +14118,60 @@ msgstr ""
 msgid "Supres"
 msgstr ""
 
-#: modules/process/superresolution.c:421
+#: modules/process/superresolution.c:420
 msgid "Correlating to determine mean shift..."
 msgstr ""
 
-#: modules/process/superresolution.c:511
+#: modules/process/superresolution.c:510
 msgid "Cross-correlation..."
 msgstr ""
 
-#: modules/process/superresolution.c:554 modules/xyz/xyz_raster.c:1079
-#: modules/xyz/xyz_raster.c:1119
+#: modules/process/superresolution.c:553 modules/xyz/xyz_raster.c:1053
+#: modules/xyz/xyz_raster.c:1093
 msgid "Interpolating..."
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gtk2-engines-murrine"
-#: modules/process/synth.h:343
+#: modules/process/synth.h:344
 msgid "Roundness"
 msgstr "Redondez"
 
-#: modules/process/synth.h:351
+#: modules/process/synth.h:352
 msgid "Roundn_ess:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "data"
-#: modules/process/synth.h:399
+#: modules/process/synth.h:401
 msgid "Orientation"
 msgstr "Orientación"
 
-#: modules/process/synth.h:408
+#: modules/process/synth.h:410
 msgid "Orien_tation:"
 msgstr ""
 
+#: modules/process/synth.h:436
+msgid "_Truncate:"
+msgstr ""
+
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "grisbi"
-#: modules/process/synth.h:432
+#: modules/process/synth.h:460
 msgid "Variance:"
 msgstr "Variación: "
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
-# based on translation from "compiz-fusion-plugins-extra"
-#: modules/process/synth.h:456
-msgid "Deformation"
-msgstr "Deformación"
-
-# Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
-#: modules/process/synth.h:464
+#: modules/process/synth.h:493
 msgid "_Amplitude:"
 msgstr "_Amplitud:"
 
-#: modules/process/synth.h:472
+#: modules/process/synth.h:501
 msgid "_Lateral scale:"
 msgstr ""
 
-#: modules/process/synth.h:566
+#: modules/process/synth.h:595
 msgid "Randomi_ze"
 msgstr ""
 
@@ -13372,41 +14187,41 @@ msgstr ""
 msgid "Limit data range"
 msgstr ""
 
-#: modules/process/threshold.c:246
+#: modules/process/threshold.c:241
 msgid "Limit Range"
 msgstr ""
 
-#: modules/process/threshold.c:281
+#: modules/process/threshold.c:276
 msgid "Specify _thresholds"
 msgstr ""
 
-#: modules/process/threshold.c:283
+#: modules/process/threshold.c:278
 msgid "Use _display range"
 msgstr ""
 
-#: modules/process/threshold.c:285
+#: modules/process/threshold.c:280
 msgid "Cut off outlier_s"
 msgstr ""
 
-#: modules/process/threshold.c:294
+#: modules/process/threshold.c:289
 msgid "_Lower:"
 msgstr ""
 
-#: modules/process/threshold.c:300
+#: modules/process/threshold.c:295
 msgid "_Upper:"
 msgstr ""
 
-#: modules/process/threshold.c:305
+#: modules/process/threshold.c:300
 msgid "Set to _Full Range"
 msgstr ""
 
 #. TRANSLATORS: This is a range: 123 to 456.
-#: modules/process/threshold.c:318
+#: modules/process/threshold.c:313
 #, c-format
 msgid "%.*f to %.*f"
 msgstr ""
 
-#: modules/process/threshold.c:341
+#: modules/process/threshold.c:336
 msgid "F_arther than:"
 msgstr ""
 
@@ -13428,11 +14243,11 @@ msgstr ""
 msgid "Tilt"
 msgstr "Mosaico"
 
-#: modules/process/tilt.c:185 modules/volume/volume_slice.c:444
+#: modules/process/tilt.c:185 modules/volume/volume_slice.c:446
 msgid "_X:"
 msgstr "_X:"
 
-#: modules/process/tilt.c:194 modules/volume/volume_slice.c:464
+#: modules/process/tilt.c:194 modules/volume/volume_slice.c:469
 msgid "_Y:"
 msgstr "_Y:"
 
@@ -13440,32 +14255,32 @@ msgstr "_Y:"
 msgid "Angles"
 msgstr ""
 
-#: modules/process/tip_blind.c:178
+#: modules/process/tip_blind.c:177
 msgid "Blind estimation of SPM tip using Villarubia's algorithm."
 msgstr "Estimación ciega de punta SPM usando el algoritmo de Villarubia. "
 
-#: modules/process/tip_blind.c:192
+#: modules/process/tip_blind.c:191
 #, fuzzy
 msgid "/_Tip and Indentation/_Blind Estimation..."
 msgstr "/_Punta/_Estimación Ciega... "
 
-#: modules/process/tip_blind.c:196
+#: modules/process/tip_blind.c:195
 msgid "Blind tip estimation"
 msgstr "Estimación de punta ciega"
 
-#: modules/process/tip_blind.c:231
+#: modules/process/tip_blind.c:230
 msgid "Blind Tip Estimation"
 msgstr "Estimación ciega de punta"
 
-#: modules/process/tip_blind.c:232
+#: modules/process/tip_blind.c:231
 msgid "Run _Partial"
 msgstr ""
 
-#: modules/process/tip_blind.c:233
+#: modules/process/tip_blind.c:232
 msgid "Run _Full"
 msgstr ""
 
-#: modules/process/tip_blind.c:234
+#: modules/process/tip_blind.c:233
 msgid "_Reset Tip"
 msgstr ""
 
@@ -13473,78 +14288,78 @@ msgstr ""
 msgid "Related _data:"
 msgstr ""
 
-#: modules/process/tip_blind.c:326
+#: modules/process/tip_blind.c:327
 msgid "Estimated Tip Size"
 msgstr "Tamaño estimado de punta"
 
-#: modules/process/tip_blind.c:347
+#: modules/process/tip_blind.c:350
 msgid "_Same resolution"
 msgstr ""
 
-#: modules/process/tip_blind.c:366
+#: modules/process/tip_blind.c:376
 msgid "Noise suppression t_hreshold:"
 msgstr ""
 
-#: modules/process/tip_blind.c:386
+#: modules/process/tip_blind.c:384
 msgid "Use _boundaries"
 msgstr ""
 
-#: modules/process/tip_blind.c:396
+#: modules/process/tip_blind.c:395
 msgid "Stripes"
 msgstr "Rayas"
 
-#: modules/process/tip_blind.c:402
+#: modules/process/tip_blind.c:401
 msgid "_Split to stripes:"
 msgstr ""
 
-#: modules/process/tip_blind.c:416
+#: modules/process/tip_blind.c:412
 msgid "_Preview stripe:"
 msgstr ""
 
-#: modules/process/tip_blind.c:423
+#: modules/process/tip_blind.c:420
 msgid "Plot size _graph"
 msgstr ""
 
-#: modules/process/tip_blind.c:433
+#: modules/process/tip_blind.c:430
 msgid "Create tip i_mages"
 msgstr ""
 
 #. TRANSLATORS: Prefix for the progressbar message.
-#: modules/process/tip_blind.c:810
+#: modules/process/tip_blind.c:807
 #, c-format
 msgid "Stripe %u: "
 msgstr ""
 
-#: modules/process/tip_blind.c:917 modules/process/tip_blind.c:941
+#: modules/process/tip_blind.c:914 modules/process/tip_blind.c:938
 msgid "Estimated tip"
 msgstr "Punta estimada"
 
-#: modules/process/tip_blind.c:1207 modules/process/tip_blind.c:1216
+#: modules/process/tip_blind.c:1204 modules/process/tip_blind.c:1213
 msgid "Tip radius evolution"
 msgstr ""
 
-#: modules/process/tip_model.c:114
+#: modules/process/tip_model.c:112
 msgid "Models SPM tip."
 msgstr "Hace un modelo de una punta SPM"
 
-#: modules/process/tip_model.c:129
+#: modules/process/tip_model.c:127
 #, fuzzy
 msgid "/_Tip and Indentation/_Model Tip..."
 msgstr "/_Punta/_Modelado de Punta..."
 
-#: modules/process/tip_model.c:133
+#: modules/process/tip_model.c:131
 msgid "Model AFM tip"
 msgstr "Modelo de punta AFM"
 
-#: modules/process/tip_model.c:164
+#: modules/process/tip_model.c:162
 msgid "Model Tip"
 msgstr "Modelo de punta"
 
-#: modules/process/tip_model.c:224
+#: modules/process/tip_model.c:222
 msgid "Tip _type:"
 msgstr "Punta _tipo:"
 
-#: modules/process/tip_model.c:229
+#: modules/process/tip_model.c:228
 msgid "_Number of sides:"
 msgstr "_Número de Lados:"
 
@@ -13556,21 +14371,21 @@ msgstr "Punta _pendiente:"
 msgid "Tip _rotation:"
 msgstr "Punta _rotación:"
 
-#: modules/process/tip_model.c:250
+#: modules/process/tip_model.c:255
 msgid "Tip _apex radius:"
 msgstr "Radio del  _ápice de la punta "
 
-#: modules/process/tip_model.c:269
+#: modules/process/tip_model.c:265
 #, fuzzy
 msgid "Tip _anisotropy:"
 msgstr "Punta _pendiente:"
 
-#: modules/process/tip_model.c:490
+#: modules/process/tip_model.c:484
 #, fuzzy
 msgid "Modeled tip"
 msgstr "Punta Modelada "
 
-#: modules/process/tip_model.c:562
+#: modules/process/tip_model.c:556
 #, c-format
 msgid "Tip resolution: %d × %d pixels"
 msgstr ""
@@ -13683,7 +14498,7 @@ msgid "Converts datafield to 3D volume data."
 msgstr ""
 
 #: modules/process/volumize.c:56
-msgid "/_Basic Operations/Volumize..."
+msgid "/_Basic Operations/Volumize"
 msgstr ""
 
 #: modules/process/volumize.c:60
@@ -13730,83 +14545,87 @@ msgstr ""
 msgid "Z _range:"
 msgstr ""
 
-#: modules/process/wave_synth.c:211
+#: modules/process/wave_synth.c:219
 msgid "Generates various kinds of waves."
 msgstr ""
 
-#: modules/process/wave_synth.c:225
+#: modules/process/wave_synth.c:233
 msgid "/S_ynthetic/_Waves..."
 msgstr ""
 
-#: modules/process/wave_synth.c:229
+#: modules/process/wave_synth.c:237
 msgid "Generate waves"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "beast"
-#: modules/process/wave_synth.c:347
+#: modules/process/wave_synth.c:366
 msgid "Waves"
 msgstr "Ondas"
 
-#: modules/process/wave_synth.c:422 modules/tools/linestats.c:337
-#: modules/tools/sfunctions.c:401 modules/volume/volume_linestat.c:369
+#: modules/process/wave_synth.c:441 modules/tools/linestats.c:337
+#: modules/tools/sfunctions.c:411 modules/volume/volume_linestat.c:374
 msgid "_Quantity:"
 msgstr ""
 
-#: modules/process/wave_synth.c:429
+#: modules/process/wave_synth.c:448
 msgid "_Number of waves:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
-#: modules/process/wave_synth.c:436 modules/process/wave_synth.c:582
-#: modules/tools/roughness.c:274
+#: modules/process/wave_synth.c:455 modules/process/wave_synth.c:617
+#: modules/tools/roughness.c:275
 msgid "Amplitude"
 msgstr "Amplitud"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "flumotion"
-#: modules/process/wave_synth.c:441
+#: modules/process/wave_synth.c:460
 msgid "_Wave form:"
 msgstr "_Forma de onda:"
 
-#: modules/process/wave_synth.c:448
+#: modules/process/wave_synth.c:467
 msgid "Amplitude:"
 msgstr ""
 
+#: modules/process/wave_synth.c:487
+msgid "_Decay:"
+msgstr ""
+
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "beast"
-#: modules/process/wave_synth.c:466
+#: modules/process/wave_synth.c:497
 msgid "Frequency"
 msgstr "Frecuencia"
 
-#: modules/process/wave_synth.c:472
+#: modules/process/wave_synth.c:503
 msgid "_Spatial frequency:"
 msgstr ""
 
-#: modules/process/wave_synth.c:488
+#: modules/process/wave_synth.c:519
 msgid "_X center:"
 msgstr ""
 
-#: modules/process/wave_synth.c:499
+#: modules/process/wave_synth.c:532
 msgid "_Y center:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "audacity"
-#: modules/process/wave_synth.c:565
+#: modules/process/wave_synth.c:600
 msgid "Cosine"
 msgstr "Coseno"
 
-#: modules/process/wave_synth.c:566
+#: modules/process/wave_synth.c:601
 msgid "Inverse cosh"
 msgstr ""
 
-#: modules/process/wave_synth.c:567
+#: modules/process/wave_synth.c:602
 msgid "Flat top"
 msgstr ""
 
-#: modules/process/wave_synth.c:581
+#: modules/process/wave_synth.c:616
 msgid "Displacement"
 msgstr ""
 
@@ -13890,39 +14709,39 @@ msgstr ""
 msgid "Preprocess and mark"
 msgstr ""
 
-#: modules/process/xydenoise.c:57
+#: modules/process/xydenoise.c:58
 msgid "Denoises measurement on basis of two orthogonal scans."
 msgstr ""
 
-#: modules/process/xydenoise.c:71
+#: modules/process/xydenoise.c:72
 msgid "/M_ultidata/_XY denoise..."
 msgstr ""
 
-#: modules/process/xydenoise.c:75
+#: modules/process/xydenoise.c:76
 msgid "Denoises horizontal/vertical measurement."
 msgstr ""
 
-#: modules/process/xydenoise.c:102
+#: modules/process/xydenoise.c:103
 msgid "XY Denoising"
 msgstr ""
 
-#: modules/process/xydenoise.c:124
+#: modules/process/xydenoise.c:125
 msgid "Second direction:"
 msgstr ""
 
-#: modules/process/xydenoise.c:232
+#: modules/process/xydenoise.c:233
 msgid "Computing forward FFTs..."
 msgstr ""
 
-#: modules/process/xydenoise.c:248
+#: modules/process/xydenoise.c:249
 msgid "Computing image..."
 msgstr ""
 
-#: modules/process/xydenoise.c:260
+#: modules/process/xydenoise.c:261
 msgid "Computing backward FFT..."
 msgstr ""
 
-#: modules/process/xydenoise.c:272
+#: modules/process/xydenoise.c:273
 msgid "Denoised"
 msgstr ""
 
@@ -13939,65 +14758,71 @@ msgstr ""
 msgid "Convert to XYZ data"
 msgstr "Importa datos XYZ"
 
-#: modules/pygwy/pygwy-console.c:55
+#: modules/pygwy/pygwy-console.c:99
 msgid "/Pygwy Console"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:59
+#: modules/pygwy/pygwy-console.c:103
 msgid "Python wrapper console"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:142
-msgid ">>> Running the script above\n"
+#: modules/pygwy/pygwy-console.c:168 modules/pygwy/pygwy-console.c:481
+msgid "Pygwy Console"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:194
-msgid "Open Python script"
-msgstr "Abrir secuencia de comandos Python"
+#: modules/pygwy/pygwy-console.c:187
+msgid "Open script in Python language (Ctrl-O)"
+msgstr "Abrir secuencia de comandos en el lenguaje Python (Ctrl-O)"
+
+#: modules/pygwy/pygwy-console.c:197
+msgid "Save script (Ctrl-S)"
+msgstr ""
 
-#: modules/pygwy/pygwy-console.c:275
-msgid "Save Script as"
+#: modules/pygwy/pygwy-console.c:207
+msgid "Save script as (Ctrl-Shift-S)"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:327
-msgid "Pygwy Console"
+#: modules/pygwy/pygwy-console.c:217
+msgid "Execute script (Ctrl-E)"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "freeciv"
-#: modules/pygwy/pygwy-console.c:340
+#: modules/pygwy/pygwy-console.c:227
 msgid "Clear Log"
 msgstr "Borrar registro"
 
-#: modules/pygwy/pygwy-console.c:344
-msgid "Open script in Python language (Ctrl-O)"
-msgstr "Abrir secuencia de comandos en el lenguaje Python (Ctrl-O)"
+#: modules/pygwy/pygwy-console.c:285
+msgid "Command"
+msgstr "Comando"
 
-#: modules/pygwy/pygwy-console.c:346
-msgid "Save script (Ctrl-S)"
+#: modules/pygwy/pygwy-console.c:371
+msgid ">>> Running the script above\n"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:348
-msgid "Execute script (Ctrl-E)"
-msgstr ""
+#: modules/pygwy/pygwy-console.c:425
+#, fuzzy
+msgid "Save Python Script as"
+msgstr "Abrir secuencia de comandos Python"
 
-#: modules/pygwy/pygwy-console.c:426
-msgid "Command"
-msgstr "Comando"
+#: modules/pygwy/pygwy-console.c:429
+#, fuzzy
+msgid "Open Python Script"
+msgstr "Abrir secuencia de comandos Python"
 
-#: pygwy.c:120
+#: pygwy.c:130
 msgid "Pygwy, the Gwyddion Python wrapper."
 msgstr ""
 
-#: pygwy.c:258
+#: pygwy.c:269
 msgid "Python Interpreter Errors"
 msgstr ""
 
-#: pygwy.c:384
+#: pygwy.c:399
 msgid "Python interpreter error occurred."
 msgstr ""
 
-#: pygwy.c:459
+#: pygwy.c:499
 msgid "Function written in Python"
 msgstr ""
 
@@ -14024,38 +14849,38 @@ msgid "Measure distances and directions between points"
 msgstr ""
 
 #. TRANSLATORS: Number is verb here.
-#: modules/tools/distance.c:250 modules/tools/profile.c:532
+#: modules/tools/distance.c:250 modules/tools/profile.c:527
 #, fuzzy
 msgid "_Number lines"
 msgstr "_Número de Lados:"
 
-#: modules/tools/filter.c:128
+#: modules/tools/filter.c:129
 msgid ""
 "Filter tool, processes selected part of data with a filter (conservative "
 "denoise, mean, median. Kuwahara, minimum, maximum)."
 msgstr ""
 
-#: modules/tools/filter.c:171
+#: modules/tools/filter.c:172
 msgid "Basic filters: mean, median, denoise, …"
 msgstr ""
 
-#: modules/tools/filter.c:239
+#: modules/tools/filter.c:240
 msgid "Conservative denoise"
 msgstr ""
 
-#: modules/tools/filter.c:246
+#: modules/tools/filter.c:247
 msgid "Kuwahara"
 msgstr "Kuwahara"
 
-#: modules/tools/filter.c:247
+#: modules/tools/filter.c:248
 msgid "Dechecker"
 msgstr ""
 
-#: modules/tools/filter.c:248
+#: modules/tools/filter.c:249
 msgid "filter|Gaussian"
 msgstr "Gaussiano"
 
-#: modules/tools/filter.c:249
+#: modules/tools/filter.c:250
 msgid "Sharpen"
 msgstr ""
 
@@ -14151,7 +14976,7 @@ msgstr ""
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gedit-plugins"
 #: modules/tools/icolorange.c:329 modules/tools/linestats.c:169
-#: modules/tools/sfunctions.c:226 modules/volume/volume_linestat.c:146
+#: modules/tools/sfunctions.c:231 modules/volume/volume_linestat.c:148
 msgid "Range"
 msgstr "Rango"
 
@@ -14182,29 +15007,29 @@ msgstr "_Invertir"
 msgid "range|Full"
 msgstr ""
 
-#: modules/tools/level3.c:106
+#: modules/tools/level3.c:108
 msgid ""
 "Three-point level tool, levels data by subtracting a plane fitted through "
 "three selected points."
 msgstr ""
 
-#: modules/tools/level3.c:143
+#: modules/tools/level3.c:145
 msgid "Three Point Level"
 msgstr ""
 
-#: modules/tools/level3.c:144
+#: modules/tools/level3.c:146
 msgid "Level data by fitting a plane through three points"
 msgstr ""
 
-#: modules/tools/level3.c:239 modules/tools/readvalue.c:375
+#: modules/tools/level3.c:244 modules/tools/readvalue.c:378
 msgid "_Averaging radius:"
 msgstr ""
 
-#: modules/tools/level3.c:246
+#: modules/tools/level3.c:251
 msgid "_Instant apply"
 msgstr ""
 
-#: modules/tools/level3.c:255
+#: modules/tools/level3.c:261
 msgid "Set plane to _zero"
 msgstr ""
 
@@ -14214,23 +15039,23 @@ msgid ""
 "RMS, ..., of rows or columns."
 msgstr ""
 
-#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:148
+#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:150
 msgid "tan β<sub>0</sub>"
 msgstr "tan β<sub>0</sub>"
 
-#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:150
+#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:152
 msgid "Ra"
 msgstr "Ra"
 
-#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:151
+#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:153
 msgid "Rq (RMS)"
 msgstr "Rq (RMS)"
 
-#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:152
+#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:154
 msgid "Rz"
 msgstr "Rz"
 
-#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:153
+#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:155
 msgid "Rt"
 msgstr "Rt"
 
@@ -14256,16 +15081,11 @@ msgstr "Co_lumnas"
 msgid "Average:"
 msgstr "Media:"
 
-#: modules/tools/linestats.c:363 modules/tools/profile.c:464
-#: modules/tools/sfunctions.c:414 modules/tools/spectro.c:343
+#: modules/tools/linestats.c:363 modules/tools/profile.c:460
+#: modules/tools/sfunctions.c:424 modules/tools/spectro.c:346
 msgid "<b>Options</b>"
 msgstr "<b>Opciones</b>"
 
-#: modules/tools/linestats.c:379 modules/tools/sfunctions.c:430
-#: modules/tools/stats.c:408
-msgid "_Instant updates"
-msgstr ""
-
 #: modules/tools/maskedit.c:170
 msgid "Mask editor tool, allows interactive modification of parts of the mask."
 msgstr ""
@@ -14326,75 +15146,75 @@ msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "anjuta"
-#: modules/tools/maskedit.c:408
+#: modules/tools/maskedit.c:409
 msgid "Editor"
 msgstr "Editor"
 
-#: modules/tools/maskedit.c:413
+#: modules/tools/maskedit.c:414
 msgid "_Shapes"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "anjuta"
-#: modules/tools/maskedit.c:423
+#: modules/tools/maskedit.c:428
 msgid "Mode:"
 msgstr "Modo:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
-#: modules/tools/maskedit.c:452
+#: modules/tools/maskedit.c:458
 msgid "Shape:"
 msgstr "Forma:"
 
-#: modules/tools/maskedit.c:483
+#: modules/tools/maskedit.c:486
 msgid "_Drawing Tools"
 msgstr ""
 
-#: modules/tools/maskedit.c:493
+#: modules/tools/maskedit.c:500
 msgid "Tool:"
 msgstr "Herramienta:"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "aptitude"
-#: modules/tools/maskedit.c:532
+#: modules/tools/maskedit.c:538
 msgid "Actions"
 msgstr "Acciones"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
-#: modules/tools/maskedit.c:540
+#: modules/tools/maskedit.c:546
 msgid "_Invert"
 msgstr "_Invertir"
 
-#: modules/tools/maskedit.c:571
+#: modules/tools/maskedit.c:577
 msgid "Fill _Voids"
 msgstr ""
 
-#: modules/tools/maskedit.c:580
+#: modules/tools/maskedit.c:586
 msgid "Fill non-simple-connected"
 msgstr ""
 
-#: modules/tools/maskedit.c:591
+#: modules/tools/maskedit.c:597
 msgid "Grow/Shrink"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
-#: modules/tools/maskedit.c:600
+#: modules/tools/maskedit.c:606
 msgid "_Grow"
 msgstr "C_recer"
 
-#: modules/tools/maskedit.c:608
+#: modules/tools/maskedit.c:614
 msgid "Shrin_k"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gaupol"
-#: modules/tools/maskedit.c:623
+#: modules/tools/maskedit.c:629
 msgid "_Amount:"
 msgstr "C_antidad:"
 
-#: modules/tools/maskedit.c:651
+#: modules/tools/maskedit.c:657
 msgid "_Prevent grain merging by growing"
 msgstr ""
 
@@ -14410,87 +15230,105 @@ msgstr ""
 msgid "Level rows using intersections with given lines"
 msgstr ""
 
-#: modules/tools/profile.c:222
+#: modules/tools/profile.c:216
 msgid "Profile tool, creates profile graphs from selected lines."
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "anjuta"
-#: modules/tools/profile.c:276 modules/tools/profile.c:630
+#: modules/tools/profile.c:270 modules/tools/profile.c:609
 msgid "Profiles"
 msgstr "Perfiles"
 
-#: modules/tools/profile.c:277
+#: modules/tools/profile.c:271
 msgid "Extract profiles"
 msgstr ""
 
-#: modules/tools/profile.c:480
-msgid "_Radial profiles"
-msgstr ""
-
-#: modules/tools/profile.c:493
+#: modules/tools/profile.c:478
 #, fuzzy
-msgid "Symmetrize _All"
-msgstr "Simétrico"
+msgid "Linear profiles"
+msgstr "Archivos Shimadzu"
 
-#: modules/tools/profile.c:498
+#: modules/tools/profile.c:480
 #, fuzzy
-msgid "S_ymmetrize"
-msgstr "Simétrico"
+msgid "Radial profiles"
+msgstr "Archivos Shimadzu"
 
-#: modules/tools/profile.c:542
+#: modules/tools/profile.c:537
 msgid "_Separate profiles"
 msgstr ""
 
-#: modules/tools/profile.c:607
+#: modules/tools/profile.c:587
 msgid "_Calibration data:"
 msgstr ""
 
-#: modules/tools/profile.c:620
+#: modules/tools/profile.c:600
 msgid "_Show profile"
 msgstr ""
 
-#: modules/tools/profile.c:887
+#: modules/tools/profile.c:861
 #, c-format
 msgid "X error %d"
 msgstr ""
 
-#: modules/tools/profile.c:891
+#: modules/tools/profile.c:865
 #, c-format
 msgid "Y error %d"
 msgstr ""
 
-#: modules/tools/profile.c:895
+#: modules/tools/profile.c:869
 #, c-format
 msgid "Z error %d"
 msgstr ""
 
-#: modules/tools/profile.c:899
+#: modules/tools/profile.c:873
 #, c-format
 msgid "X uncertainty %d"
 msgstr ""
 
-#: modules/tools/profile.c:903
+#: modules/tools/profile.c:877
 #, c-format
 msgid "Y uncertainty %d"
 msgstr ""
 
-#: modules/tools/profile.c:907
+#: modules/tools/profile.c:881
 #, c-format
 msgid "Z uncertainty %d"
 msgstr ""
 
-#: modules/tools/profile.c:912
+#: modules/tools/profile.c:886
 #, c-format
 msgid "Zunc up bound %d"
 msgstr ""
 
-#: modules/tools/profile.c:917
+#: modules/tools/profile.c:891
 #, c-format
 msgid "Zunc low bound %d"
 msgstr ""
 
-#: modules/tools/profile.c:1817
+#: modules/tools/profile.c:1637
+#, fuzzy
+msgid "S_ymmetrize"
+msgstr "Simétrico"
+
+#: modules/tools/profile.c:1639
+#, fuzzy
+msgid "Symmetrize _All"
+msgstr "Simétrico"
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "goffice"
+#: modules/tools/profile.c:1643
+#, fuzzy
+msgid "Improve _Direction"
+msgstr "_Dirección:"
+
+#: modules/tools/profile.c:1645
+#, fuzzy
+msgid "Improve _All"
+msgstr "_Mejorar"
+
+#: modules/tools/profile.c:1866
 msgid "calib-data|None"
 msgstr ""
 
@@ -14506,202 +15344,202 @@ msgstr ""
 msgid "Read value under mouse cursor"
 msgstr ""
 
-#: modules/tools/readvalue.c:304
+#: modules/tools/readvalue.c:307
 msgid "Set _Zero"
 msgstr ""
 
-#: modules/tools/readvalue.c:307
+#: modules/tools/readvalue.c:310
 msgid "Shift plane z=0 to pass through the selected point"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "dia"
-#: modules/tools/readvalue.c:315
+#: modules/tools/readvalue.c:318
 msgid "Facet"
 msgstr "Faceta"
 
-#: modules/tools/readvalue.c:340
+#: modules/tools/readvalue.c:343
 msgid "Curvatures"
 msgstr ""
 
-#: modules/tools/readvalue.c:382
+#: modules/tools/readvalue.c:386
 msgid "Show _selection"
 msgstr ""
 
-#: modules/tools/roughness.c:282
+#: modules/tools/roughness.c:283
 msgid "Roughness average"
 msgstr ""
 
-#: modules/tools/roughness.c:290
+#: modules/tools/roughness.c:291
 msgid "Root mean square roughness"
 msgstr ""
 
-#: modules/tools/roughness.c:298
+#: modules/tools/roughness.c:299
 msgid "Maximum height of the roughness"
 msgstr ""
 
-#: modules/tools/roughness.c:306
+#: modules/tools/roughness.c:307
 msgid "Maximum roughness valley depth"
 msgstr ""
 
-#: modules/tools/roughness.c:314
+#: modules/tools/roughness.c:315
 msgid "Maximum roughness peak height"
 msgstr ""
 
-#: modules/tools/roughness.c:322 modules/tools/roughness.c:370
+#: modules/tools/roughness.c:323 modules/tools/roughness.c:371
 msgid "Average maximum height of the roughness"
 msgstr ""
 
-#: modules/tools/roughness.c:330
+#: modules/tools/roughness.c:331
 msgid "Average maximum roughness valley depth"
 msgstr ""
 
-#: modules/tools/roughness.c:338
+#: modules/tools/roughness.c:339
 msgid "Average maximum roughness peak height"
 msgstr ""
 
-#: modules/tools/roughness.c:346 modules/tools/roughness.c:354
+#: modules/tools/roughness.c:347 modules/tools/roughness.c:355
 msgid "Average third highest peak to third lowest valley height"
 msgstr ""
 
-#: modules/tools/roughness.c:362
+#: modules/tools/roughness.c:363
 msgid "Average maximum height of the profile"
 msgstr ""
 
-#: modules/tools/roughness.c:378
+#: modules/tools/roughness.c:379
 msgid "Skewness"
 msgstr "Asimetría"
 
-#: modules/tools/roughness.c:394
+#: modules/tools/roughness.c:395
 msgid "Waviness average"
 msgstr ""
 
-#: modules/tools/roughness.c:402
+#: modules/tools/roughness.c:403
 msgid "Root mean square waviness"
 msgstr ""
 
-#: modules/tools/roughness.c:410
+#: modules/tools/roughness.c:411
 msgid "Waviness maximum height"
 msgstr ""
 
-#: modules/tools/roughness.c:418
+#: modules/tools/roughness.c:419
 msgid "Maximum height of the profile"
 msgstr ""
 
-#: modules/tools/roughness.c:426
+#: modules/tools/roughness.c:427
 msgid "Spatial"
 msgstr ""
 
-#: modules/tools/roughness.c:476
+#: modules/tools/roughness.c:477
 msgid "Average wavelength of the profile"
 msgstr ""
 
-#: modules/tools/roughness.c:484
+#: modules/tools/roughness.c:485
 msgid "Root mean square (RMS) wavelength of the profile"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "hybrid"
-#: modules/tools/roughness.c:492
+#: modules/tools/roughness.c:493
 msgid "Hybrid"
 msgstr "Híbrido"
 
-#: modules/tools/roughness.c:500
+#: modules/tools/roughness.c:501
 msgid "Average absolute slope"
 msgstr ""
 
-#: modules/tools/roughness.c:508
+#: modules/tools/roughness.c:509
 msgid "Root mean square (RMS) slope"
 msgstr ""
 
-#: modules/tools/roughness.c:524
+#: modules/tools/roughness.c:525
 msgid "Developed profile length"
 msgstr ""
 
-#: modules/tools/roughness.c:532
+#: modules/tools/roughness.c:533
 msgid "Profile length ratio"
 msgstr ""
 
-#: modules/tools/roughness.c:615
+#: modules/tools/roughness.c:616
 msgid "Calculate surface profile parameters."
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
-#: modules/tools/roughness.c:648 modules/tools/roughness.c:773
-#: modules/tools/roughness.c:1452
+#: modules/tools/roughness.c:649 modules/tools/roughness.c:774
+#: modules/tools/roughness.c:1479
 msgid "Roughness"
 msgstr "Rugosidad"
 
-#: modules/tools/roughness.c:649
+#: modules/tools/roughness.c:650
 msgid "Calculate roughness parameters"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
-#: modules/tools/roughness.c:771 modules/tools/roughness.c:1450
+#: modules/tools/roughness.c:772 modules/tools/roughness.c:1477
 msgid "Texture"
 msgstr "Textura"
 
-#: modules/tools/roughness.c:772 modules/tools/roughness.c:1451
+#: modules/tools/roughness.c:773 modules/tools/roughness.c:1478
 msgid "Waviness"
 msgstr ""
 
-#: modules/tools/roughness.c:774
+#: modules/tools/roughness.c:775
 msgid "ADF"
 msgstr ""
 
-#: modules/tools/roughness.c:775
+#: modules/tools/roughness.c:776
 msgid "BRC"
 msgstr ""
 
-#: modules/tools/roughness.c:776 modules/tools/roughness.c:1455
+#: modules/tools/roughness.c:777 modules/tools/roughness.c:1482
 msgid "Peak Count"
 msgstr ""
 
-#: modules/tools/roughness.c:838 modules/xyz/xyz_drift.c:1090
+#: modules/tools/roughness.c:839 modules/xyz/xyz_drift.c:1090
 msgid "_Graph:"
 msgstr "_Gráfico:"
 
-#: modules/tools/roughness.c:845
+#: modules/tools/roughness.c:847
 msgid "C_ut-off:"
 msgstr ""
 
-#: modules/tools/roughness.c:1324
+#: modules/tools/roughness.c:1345
 msgid "No profile selected."
 msgstr ""
 
-#: modules/tools/roughness.c:1453
+#: modules/tools/roughness.c:1480
 msgid "Amplitude Distribution Function"
 msgstr ""
 
-#: modules/tools/roughness.c:1454
+#: modules/tools/roughness.c:1481
 msgid "The Bearing Ratio Curve"
 msgstr ""
 
-#: modules/tools/roughness.c:1489
+#: modules/tools/roughness.c:1516
 msgid "Surface Profiles"
 msgstr ""
 
-#: modules/tools/roughness.c:1877
+#: modules/tools/roughness.c:1904
 msgid "Save Roughness Parameters"
 msgstr "Guardar Parámetros de Rugosidad "
 
-#: modules/tools/roughness.c:1934
+#: modules/tools/roughness.c:1961
 msgid "Roughness Parameters"
 msgstr ""
 
-#: modules/tools/roughness.c:1940
+#: modules/tools/roughness.c:1967
 #, c-format
 msgid "File:              %s\n"
 msgstr ""
 
-#: modules/tools/roughness.c:1944
+#: modules/tools/roughness.c:1971
 #, c-format
 msgid "Data channel:      %s\n"
 msgstr ""
 
-#: modules/tools/roughness.c:1975
+#: modules/tools/roughness.c:2002
 #, c-format
 msgid ""
 "Selected line:     (%s, %s) to (%s, %s) px\n"
@@ -14737,96 +15575,100 @@ msgstr ""
 msgid "_Copy"
 msgstr ""
 
-#: modules/tools/sfunctions.c:181
+#: modules/tools/sfunctions.c:186
 msgid ""
 "Statistical function tool, calculates one-dimensional statistical functions "
 "(height distribution, correlations, PSDF, Minkowski functionals) of selected "
 "part of data."
 msgstr ""
 
-#: modules/tools/sfunctions.c:214
+#: modules/tools/sfunctions.c:219
 msgid "Height distribution"
 msgstr ""
 
-#: modules/tools/sfunctions.c:215
+#: modules/tools/sfunctions.c:220
 msgid "Cum. height distribution"
 msgstr ""
 
-#: modules/tools/sfunctions.c:216
+#: modules/tools/sfunctions.c:221
 msgid "Distribution of angles"
 msgstr ""
 
-#: modules/tools/sfunctions.c:217
+#: modules/tools/sfunctions.c:222
 msgid "Cum. distribution of angles"
 msgstr ""
 
-#: modules/tools/sfunctions.c:218
+#: modules/tools/sfunctions.c:223
 msgid "ACF"
 msgstr ""
 
-#: modules/tools/sfunctions.c:219
+#: modules/tools/sfunctions.c:224
 msgid "HHCF"
 msgstr ""
 
-#: modules/tools/sfunctions.c:220
+#: modules/tools/sfunctions.c:225
 msgid "PSDF"
 msgstr ""
 
-#: modules/tools/sfunctions.c:221
+#: modules/tools/sfunctions.c:226
 msgid "Radial PSDF"
 msgstr ""
 
-#: modules/tools/sfunctions.c:222
+#: modules/tools/sfunctions.c:227
 msgid "Radial ACF"
 msgstr ""
 
-#: modules/tools/sfunctions.c:223
+#: modules/tools/sfunctions.c:228
 msgid "Minkowski volume"
 msgstr ""
 
-#: modules/tools/sfunctions.c:224
+#: modules/tools/sfunctions.c:229
 msgid "Minkowski boundary"
 msgstr ""
 
-#: modules/tools/sfunctions.c:225
+#: modules/tools/sfunctions.c:230
 msgid "Minkowski connectivity"
 msgstr ""
 
+#: modules/tools/sfunctions.c:232
+msgid "Area scale graph"
+msgstr ""
+
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gnumeric"
-#: modules/tools/sfunctions.c:251
+#: modules/tools/sfunctions.c:257
 msgid "Statistical Functions"
 msgstr "Funciones estadísticas"
 
-#: modules/tools/sfunctions.c:252
+#: modules/tools/sfunctions.c:258
 msgid "Calculate 1D statistical functions"
 msgstr ""
 
-#: modules/tools/sfunctions.c:504
+#: modules/tools/sfunctions.c:501
 msgid "_Separate uncertainty"
 msgstr ""
 
-#: modules/tools/spectro.c:151
+#: modules/tools/spectro.c:154
 msgid "Point Spectrum, extracts point spectra to a graph."
 msgstr ""
 
-#: modules/tools/spectro.c:190
+#: modules/tools/spectro.c:193
 msgid "Point Spectroscopy"
 msgstr ""
 
-#: modules/tools/spectro.c:191
+#: modules/tools/spectro.c:194
 msgid "Extract and view point spectroscopy data"
 msgstr "Extraer y ver datos de espectroscopia puntual"
 
-#: modules/tools/spectro.c:359
+#: modules/tools/spectro.c:362
 msgid "_Separate spectra"
 msgstr ""
 
-#: modules/tools/spectro.c:369
+#: modules/tools/spectro.c:372
 msgid "_Average spectra"
 msgstr ""
 
-#: modules/tools/spectro.c:508
+#: modules/tools/spectro.c:511
 msgid "Spectroscopy"
 msgstr ""
 
@@ -14864,16 +15706,6 @@ msgstr ""
 msgid "No area in the zoom selected."
 msgstr ""
 
-#: modules/tools/stats.c:205
-msgid "Average value:"
-msgstr ""
-
-# Translation for this string generated by http://littlesvr.ca/ostd/
-# based on translation from "gimp"
-#: modules/tools/stats.c:206
-msgid "Median:"
-msgstr "Mediana:"
-
 #: modules/tools/stats.c:207
 msgid "Ra (Sa):"
 msgstr "Ra (Sa):"
@@ -14886,14 +15718,6 @@ msgstr "Rms (Sq):"
 msgid "Rms (grain-wise):"
 msgstr ""
 
-#: modules/tools/stats.c:210
-msgid "Skew:"
-msgstr "Asimetría:"
-
-#: modules/tools/stats.c:211
-msgid "Kurtosis:"
-msgstr "Curtosis:"
-
 #: modules/tools/stats.c:212
 msgid "Surface area:"
 msgstr ""
@@ -14902,12 +15726,6 @@ msgstr ""
 msgid "Projected area:"
 msgstr ""
 
-# Translation for this string generated by http://littlesvr.ca/ostd/
-# based on translation from "lyx"
-#: modules/tools/stats.c:214
-msgid "Variation:"
-msgstr "Variación:"
-
 #: modules/tools/stats.c:217
 msgid "Inclination θ:"
 msgstr "Inclinación θ"
@@ -14920,7 +15738,7 @@ msgstr "Inclinación φ"
 msgid "Statistics tool."
 msgstr ""
 
-#: modules/tools/stats.c:261 modules/tools/stats.c:1095
+#: modules/tools/stats.c:261 modules/tools/stats.c:1091
 msgid "Statistical Quantities"
 msgstr ""
 
@@ -14928,29 +15746,29 @@ msgstr ""
 msgid "Statistical quantities"
 msgstr ""
 
-#: modules/tools/stats.c:1002
+#: modules/tools/stats.c:998
 msgid "Save Statistical Quantities"
 msgstr ""
 
-#: modules/tools/stats.c:1100
+#: modules/tools/stats.c:1096
 #, fuzzy, c-format
 msgid "File:         %s\n"
 msgstr "Volumen      %g\n"
 
-#: modules/tools/stats.c:1104
+#: modules/tools/stats.c:1100
 #, fuzzy, c-format
 msgid "Data channel: %s\n"
 msgstr "Datos: %s\n"
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "Yes"
 msgstr "Sí"
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "No"
 msgstr "No"
 
-#: modules/tools/stats.c:1132
+#: modules/tools/stats.c:1128
 #, c-format
 msgid ""
 "Selected area: %s × %s at (%s, %s) px\n"
@@ -14970,184 +15788,180 @@ msgstr ""
 msgid "Volume Dimensions and Units"
 msgstr ""
 
-#: modules/volume/volume_calibrate.c:526
+#: modules/volume/volume_calibrate.c:486
 msgid "_Value range:"
 msgstr ""
 
-#: modules/volume/volume_calibrate.c:555
+#: modules/volume/volume_calibrate.c:508
 msgid "Value shi_ft:"
 msgstr ""
 
-#: modules/volume/volume_calibrate.c:601
+#: modules/volume/volume_calibrate.c:542
 msgid "_Value calibration factor:"
 msgstr ""
 
-#: modules/volume/volume_extract.c:223
+#: modules/volume/volume_extract.c:216
 msgid "Shows and/or extracts a section of volume data"
 msgstr ""
 
-#: modules/volume/volume_extract.c:237
-msgid "/Show and _extract..."
+#: modules/volume/volume_extract.c:230
+msgid "/Show and _Extract..."
 msgstr ""
 
-#: modules/volume/volume_extract.c:241
+#: modules/volume/volume_extract.c:234
 msgid "Show and/or extract a section of volume data"
 msgstr ""
 
-#: modules/volume/volume_extract.c:270
+#: modules/volume/volume_extract.c:263
 msgid "X cross-section"
 msgstr ""
 
-#: modules/volume/volume_extract.c:271
+#: modules/volume/volume_extract.c:264
 msgid "Y cross-section"
 msgstr ""
 
-#: modules/volume/volume_extract.c:272
+#: modules/volume/volume_extract.c:265
 msgid "Z cross-section"
 msgstr ""
 
-#: modules/volume/volume_extract.c:273 modules/volume/volume_extract.c:698
+#: modules/volume/volume_extract.c:266 modules/volume/volume_extract.c:684
 msgid "X direction sum"
 msgstr ""
 
-#: modules/volume/volume_extract.c:274 modules/volume/volume_extract.c:700
+#: modules/volume/volume_extract.c:267 modules/volume/volume_extract.c:686
 msgid "Y direction sum"
 msgstr ""
 
-#: modules/volume/volume_extract.c:275 modules/volume/volume_extract.c:702
+#: modules/volume/volume_extract.c:268 modules/volume/volume_extract.c:688
 msgid "Z direction sum"
 msgstr ""
 
-#: modules/volume/volume_extract.c:278
+#: modules/volume/volume_extract.c:271
 msgid "X direction"
 msgstr ""
 
-#: modules/volume/volume_extract.c:279
+#: modules/volume/volume_extract.c:272
 msgid "Y direction"
 msgstr ""
 
-#: modules/volume/volume_extract.c:280
+#: modules/volume/volume_extract.c:273
 msgid "Z direction"
 msgstr ""
 
-#: modules/volume/volume_extract.c:322
+#: modules/volume/volume_extract.c:315
 msgid "Volume data"
 msgstr ""
 
-#: modules/volume/volume_extract.c:324
+#: modules/volume/volume_extract.c:317
 msgid "_Load"
 msgstr "_Cargar"
 
-#: modules/volume/volume_extract.c:336
+#: modules/volume/volume_extract.c:329
 msgid "_Extract projection"
 msgstr ""
 
-#: modules/volume/volume_extract.c:354
+#: modules/volume/volume_extract.c:347
 msgid "Projections"
 msgstr ""
 
-#: modules/volume/volume_extract.c:404
+#: modules/volume/volume_extract.c:395
 msgid "Z position"
 msgstr ""
 
-#: modules/volume/volume_extract.c:409
+#: modules/volume/volume_extract.c:405
 msgid "Shown cut direction:"
 msgstr ""
 
-#: modules/volume/volume_extract.c:419 modules/volume/volume_extract.c:500
-msgid "Show mode:"
-msgstr ""
-
-#: modules/volume/volume_extract.c:490
+#: modules/volume/volume_extract.c:485
 msgid "Graph cut direction:"
 msgstr ""
 
-#: modules/volume/volume_extract.c:525
+#: modules/volume/volume_extract.c:511
 msgid "3D view"
 msgstr "Vista 3D"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "abiword"
-#: modules/volume/volume_extract.c:550
+#: modules/volume/volume_extract.c:538
 msgid "Zoom"
 msgstr "Ampliación"
 
-#: modules/volume/volume_extract.c:558
+#: modules/volume/volume_extract.c:545
 msgid "Wireframe threshold"
 msgstr ""
 
-#: modules/volume/volume_extract.c:566
+#: modules/volume/volume_extract.c:552
 msgid "Z scale"
 msgstr ""
 
-#: modules/volume/volume_extract.c:574
+#: modules/volume/volume_extract.c:559
 msgid "Opacity scale"
 msgstr ""
 
-#: modules/volume/volume_extract.c:580
-msgid "apply perspective"
+#: modules/volume/volume_extract.c:565
+msgid "Apply perspective"
 msgstr ""
 
-#: modules/volume/volume_extract.c:589
-msgid "instant 3D render"
+#: modules/volume/volume_extract.c:574
+msgid "Instant 3D render"
 msgstr ""
 
-#: modules/volume/volume_extract.c:598
+#: modules/volume/volume_extract.c:587
 msgid "X view"
 msgstr ""
 
-#: modules/volume/volume_extract.c:604
+#: modules/volume/volume_extract.c:592
 msgid "Y view"
 msgstr ""
 
-#: modules/volume/volume_extract.c:610
+#: modules/volume/volume_extract.c:597
 msgid "Z view"
 msgstr ""
 
-#: modules/volume/volume_extract.c:683
+#: modules/volume/volume_extract.c:669
 #, c-format
 msgid "X cross-section at x: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:686
+#: modules/volume/volume_extract.c:672
 #, c-format
 msgid "Y cross-section at y: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:690
+#: modules/volume/volume_extract.c:676
 #, c-format
 msgid "Z cross-section at Z = %g %s (#%d)"
 msgstr ""
 
-#: modules/volume/volume_extract.c:749 modules/volume/volume_slice.c:1264
+#: modules/volume/volume_extract.c:735 modules/volume/volume_slice.c:1278
 #, c-format
 msgid "X graph at y: %d z: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:752 modules/volume/volume_slice.c:1273
+#: modules/volume/volume_extract.c:738 modules/volume/volume_slice.c:1287
 #, c-format
 msgid "Y graph at x: %d z: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:755 modules/volume/volume_slice.c:1255
+#: modules/volume/volume_extract.c:741 modules/volume/volume_slice.c:1269
 #, c-format
 msgid "Z graph at x: %d y: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:776
+#: modules/volume/volume_extract.c:762
 msgid "Brick graph"
 msgstr ""
 
-#: modules/volume/volume_extract.c:1056
+#: modules/volume/volume_extract.c:1042
 msgid "Load volume data"
 msgstr ""
 
-#: modules/volume/volume_extract.c:1218
+#: modules/volume/volume_extract.c:1204
 #, c-format
 msgid "Shown range %g to %g"
 msgstr ""
 
-#: modules/volume/volume_extract.c:1911
+#: modules/volume/volume_extract.c:1897
 msgid "Building wireframe model..."
 msgstr ""
 
@@ -15156,104 +15970,108 @@ msgid "Evaluate volume force-distance data"
 msgstr ""
 
 #: modules/volume/volume_fdfit.c:213
-msgid "/_Evaluate FD data..."
+msgid "/_Evaluate FD Data..."
 msgstr ""
 
 #: modules/volume/volume_fdfit.c:217
 msgid "Evaluate force-distance volume data"
 msgstr ""
 
-#: modules/volume/volume_fdfit.c:368
+#: modules/volume/volume_fdfit.c:371
 msgid "Curve _X position:"
 msgstr ""
 
-#: modules/volume/volume_fdfit.c:386
+#: modules/volume/volume_fdfit.c:380
 msgid "Curve _Y position:"
 msgstr ""
 
-#: modules/volume/volume_fdfit.c:535
+#: modules/volume/volume_fdfit.c:511
 msgid "e_stimate"
 msgstr "e_stimación"
 
-#: modules/volume/volume_invert.c:51
+#: modules/volume/volume_invert.c:39 modules/volume/volumeops.c:39
 msgid "Inverts value in volume data"
 msgstr ""
 
-#: modules/volume/volume_invert.c:65
-msgid "/_Invert value"
-msgstr ""
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "gimp"
+#: modules/volume/volume_invert.c:53
+#, fuzzy
+msgid "/_Invert Value"
+msgstr "_Invertir"
 
-#: modules/volume/volume_invert.c:69
+#: modules/volume/volume_invert.c:57
 msgid "Invert value in volume data"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:94
+#: modules/volume/volume_kmeans.c:95
 msgid "Calculates K-means clustering on volume data."
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:108
-msgid "/_K-means clustering..."
-msgstr ""
+#: modules/volume/volume_kmeans.c:109
+#, fuzzy
+msgid "/_K-Means Clustering..."
+msgstr "Dilatación"
 
-#: modules/volume/volume_kmeans.c:112
+#: modules/volume/volume_kmeans.c:113
 msgid "Calculate K-means clustering on volume data"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:151
+#: modules/volume/volume_kmeans.c:152
 msgid "K-means"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:164
+#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:163
 msgid "_Number of clusters:"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:171
+#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:170
 msgid "Convergence _precision digits:"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:184 modules/volume/volume_kmedians.c:178
+#: modules/volume/volume_kmeans.c:183 modules/volume/volume_kmedians.c:176
 msgid "_Max. iterations:"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "gimp"
-#: modules/volume/volume_kmeans.c:189 modules/volume/volume_kmedians.c:183
+#: modules/volume/volume_kmeans.c:187 modules/volume/volume_kmedians.c:181
 msgid "_Normalize"
 msgstr "_Normalizar"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "anjuta"
-#: modules/volume/volume_kmeans.c:195
+#: modules/volume/volume_kmeans.c:193
 #, fuzzy
 msgid "_Remove outliers"
 msgstr "Quita_r"
 
-#: modules/volume/volume_kmeans.c:208
+#: modules/volume/volume_kmeans.c:202
 #, fuzzy
 msgid "Outliers _threshold:"
 msgstr "_Umbral:"
 
-#: modules/volume/volume_kmeans.c:431
+#: modules/volume/volume_kmeans.c:425
 #, fuzzy
 msgid "K-means iteration..."
 msgstr "Dilatación"
 
-#: modules/volume/volume_kmeans.c:651
+#: modules/volume/volume_kmeans.c:645
 #, c-format
 msgid "K-means cluster of %s"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:660
+#: modules/volume/volume_kmeans.c:654
 #, c-format
 msgid "K-means error of %s"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:670 modules/volume/volume_kmedians.c:514
+#: modules/volume/volume_kmeans.c:664 modules/volume/volume_kmedians.c:512
 #, c-format
 msgid "Pre-normalized intensity of %s"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:702
+#: modules/volume/volume_kmeans.c:696
 #, c-format
 msgid "K-means center %d"
 msgstr ""
@@ -15263,8 +16081,9 @@ msgid "Calculates K-medians clustering on volume data."
 msgstr ""
 
 #: modules/volume/volume_kmedians.c:102
-msgid "/_K-medians clustering..."
-msgstr ""
+#, fuzzy
+msgid "/_K-Medians Clustering..."
+msgstr "Dilatación"
 
 #: modules/volume/volume_kmedians.c:106
 msgid "Calculate K-medians clustering on volume data"
@@ -15277,52 +16096,52 @@ msgstr ""
 msgid "K-Medians"
 msgstr "Medo"
 
-#: modules/volume/volume_kmedians.c:392
+#: modules/volume/volume_kmedians.c:390
 #, fuzzy
 msgid "K-medians iteration..."
 msgstr "Dilatación"
 
-#: modules/volume/volume_kmedians.c:495
+#: modules/volume/volume_kmedians.c:493
 #, c-format
 msgid "K-medians cluster of %s"
 msgstr ""
 
-#: modules/volume/volume_kmedians.c:504
+#: modules/volume/volume_kmedians.c:502
 #, c-format
 msgid "K-medians error of %s"
 msgstr ""
 
-#: modules/volume/volume_kmedians.c:546
+#: modules/volume/volume_kmedians.c:544
 #, c-format
 msgid "K-medians center %d"
 msgstr ""
 
-#: modules/volume/volume_linestat.c:171
+#: modules/volume/volume_linestat.c:173
 msgid "Summarizes profiles of volume data to a channel."
 msgstr ""
 
-#: modules/volume/volume_linestat.c:185
+#: modules/volume/volume_linestat.c:187
 msgid "/Summarize _Profiles..."
 msgstr ""
 
-#: modules/volume/volume_linestat.c:189
+#: modules/volume/volume_linestat.c:191
 #, fuzzy
 msgid "Summarize profiles"
 msgstr "Archivos Shimadzu"
 
-#: modules/volume/volume_linestat.c:249
+#: modules/volume/volume_linestat.c:251
 #, fuzzy
 msgid "_Extract image"
 msgstr "Exporta imagen EXR"
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "calibre"
-#: modules/volume/volume_linestat.c:250
+#: modules/volume/volume_linestat.c:252
 #, fuzzy
 msgid "Set _preview"
 msgstr "No se puede previsualizar"
 
-#: modules/volume/volume_linestat.c:284
+#: modules/volume/volume_linestat.c:289
 msgid "Summarize Volume Profiles"
 msgstr ""
 
@@ -15347,58 +16166,122 @@ msgstr ""
 msgid "Line graph"
 msgstr "Corta Gráfico"
 
-#: modules/volume/volume_slice.c:290
+#: modules/volume/volume_slice.c:292
 msgid "Slice Volume Data"
 msgstr ""
 
-#: modules/volume/volume_slice.c:369
+#: modules/volume/volume_slice.c:371
 msgid "_Base plane:"
 msgstr ""
 
-#: modules/volume/volume_slice.c:420
+#: modules/volume/volume_slice.c:422
 msgid "Extract _multiple items"
 msgstr ""
 
-#: modules/volume/volume_slice.c:437
+#: modules/volume/volume_slice.c:439
 #, fuzzy
 msgid "Positions"
 msgstr "Posición"
 
-#: modules/volume/volume_slice.c:484
+#: modules/volume/volume_slice.c:492
 #, fuzzy
 msgid "_Z:"
 msgstr "_X:"
 
-#: modules/volume/volume_slice.c:1156
+#: modules/volume/volume_slice.c:1167
 #, c-format
 msgid "Z slice at %.*f%s%s (#%d)"
 msgstr ""
 
-#: modules/volume/volume_slice.c:1167
+#: modules/volume/volume_slice.c:1178
 #, c-format
 msgid "Y slice at %.*f%s%s (#%d)"
 msgstr ""
 
-#: modules/volume/volume_slice.c:1178
+#: modules/volume/volume_slice.c:1189
 #, c-format
 msgid "X slice at %.*f%s%s (#%d)"
 msgstr ""
 
-#: modules/volume/volume_slice.c:1307
+#: modules/volume/volume_slice.c:1325
 #, fuzzy
 msgid "Volume Z graphs"
 msgstr "Volumen      %g\n"
 
-#: modules/volume/volume_slice.c:1314
+#: modules/volume/volume_slice.c:1332
 #, fuzzy
 msgid "Volume X graphs"
 msgstr "Volumen      %g\n"
 
-#: modules/volume/volume_slice.c:1321
+#: modules/volume/volume_slice.c:1339
 #, fuzzy
 msgid "Volume Y graphs"
 msgstr "Volumen      %g\n"
 
+#: modules/volume/volume_swaxes.c:104
+msgid "Swaps axes of volume data."
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:118
+#, fuzzy
+msgid "/S_wap axes..."
+msgstr "/Guardar_Como..."
+
+#: modules/volume/volume_swaxes.c:122
+msgid "Swap axes"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:156
+#, fuzzy
+msgid "X"
+msgstr "_X:"
+
+#: modules/volume/volume_swaxes.c:157
+msgid "X, reversed"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:158
+#, fuzzy
+msgid "Y"
+msgstr "_Y:"
+
+#: modules/volume/volume_swaxes.c:159
+msgid "Y, reversed"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:160
+msgid "Z"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:161
+msgid "Z, reversed"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:175
+msgid "Swap Volume Axes"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:196
+msgid "Current _X axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:204
+msgid "Current _Y axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:212
+msgid "Current _Z axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:219
+#, fuzzy
+msgid "Create new volume data"
+msgstr "Crea un nuevo dato"
+
+#: modules/volume/volume_swaxes.c:286
+msgid "Z axis calibration will be lost."
+msgstr ""
+
 #: modules/volume/volume_zcal.c:104
 msgid "Attaches, extracts and removes volume data z-axis calibration."
 msgstr ""
@@ -15466,6 +16349,16 @@ msgid ""
 "differs from the number of planes %d."
 msgstr ""
 
+#: modules/volume/volumeops.c:53
+#, fuzzy
+msgid "/Extract _Preview"
+msgstr "Exporta imagen EXR"
+
+#: modules/volume/volumeops.c:57
+#, fuzzy
+msgid "Extract volume data preview to an image"
+msgstr "Guardar vista 3D a una imagen"
+
 #: modules/xyz/xyz_drift.c:267
 msgid "Analyzes drift in XYZ data."
 msgstr ""
@@ -15517,7 +16410,7 @@ msgstr ""
 msgid "Analyze XYZ Drift"
 msgstr ""
 
-#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:391
+#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:406
 msgid "Reset Ran_ges"
 msgstr ""
 
@@ -15526,11 +16419,11 @@ msgstr ""
 msgid "_Guess parameters"
 msgstr "Guardar Parámetros de Rugosidad "
 
-#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:570
+#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:539
 msgid "_X-range:"
 msgstr ""
 
-#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:592
+#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:561
 msgid "_Y-range:"
 msgstr ""
 
@@ -15641,7 +16534,7 @@ msgstr "A_ltura"
 msgid "Fitting in progress..."
 msgstr ""
 
-#: modules/xyz/xyz_drift.c:2269 modules/xyz/xyz_raster.c:1012
+#: modules/xyz/xyz_drift.c:2264 modules/xyz/xyz_raster.c:981
 msgid "Physical dimensions are invalid."
 msgstr ""
 
@@ -15686,46 +16579,46 @@ msgstr "_Datos"
 msgid "Update X and Y of _all compatible data"
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:197
+#: modules/xyz/xyz_raster.c:194
 #, fuzzy
 msgid "Rasterizes XYZ data to images."
 msgstr "Fusiona dos imágenes. "
 
-#: modules/xyz/xyz_raster.c:211
+#: modules/xyz/xyz_raster.c:208
 #, fuzzy
 msgid "/_Rasterize..."
 msgstr "/_Fusionar..."
 
-#: modules/xyz/xyz_raster.c:215
+#: modules/xyz/xyz_raster.c:212
 #, fuzzy
 msgid "Rasterize to image"
 msgstr "Fusiona dos imágenes"
 
-#: modules/xyz/xyz_raster.c:340
+#: modules/xyz/xyz_raster.c:337
 #, fuzzy
 msgid "Rasterize XYZ Data"
 msgstr "Importa datos XYZ"
 
-#: modules/xyz/xyz_raster.c:354
+#: modules/xyz/xyz_raster.c:351
 #, fuzzy
 msgid "Create Image _Directly"
 msgstr "Crea un nuevo dato"
 
-#: modules/xyz/xyz_raster.c:360
+#: modules/xyz/xyz_raster.c:357
 msgid "XY points form a regular grid so interpolation is not necessary."
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:381
+#: modules/xyz/xyz_raster.c:392
 msgid "Make Pixels S_quare"
 msgstr ""
 
 # Translation for this string generated by http://littlesvr.ca/ostd/
 # based on translation from "fusionforge"
-#: modules/xyz/xyz_raster.c:642
+#: modules/xyz/xyz_raster.c:611
 msgid "Field"
 msgstr "Campo"
 
-#: modules/xyz/xyz_raster.c:956
+#: modules/xyz/xyz_raster.c:925
 #, c-format
 msgid ""
 "Number of points: %u\n"
@@ -15733,12 +16626,47 @@ msgid ""
 "Added on the boundaries: %u"
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:1091
+#: modules/xyz/xyz_raster.c:1065
 msgid ""
 "XYZ data regularization failed due to numerical instability or was "
 "interrupted."
 msgstr ""
 
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "avant-window-navigator"
+#~ msgid "pixels"
+#~ msgstr "píxeles"
+
+#~ msgid "Fast Fourier Transform"
+#~ msgstr "Transformada rápida de Fourier"
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "dia"
+#~ msgid "Distribute"
+#~ msgstr "Distribuir"
+
+#~ msgid "Replace"
+#~ msgstr "Sustituir"
+
+#, fuzzy
+#~ msgid "Stitch operations on data"
+#~ msgstr "Encaja una función en los datos de la gráfica"
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "gimp"
+#, fuzzy
+#~ msgid "X offset"
+#~ msgstr "Desplazamiento _X:"
+
+# Translation for this string generated by http://littlesvr.ca/ostd/
+# based on translation from "gimp"
+#, fuzzy
+#~ msgid "Y offset"
+#~ msgstr "Desplazamiento _Y:"
+
+#~ msgid "Create new channel"
+#~ msgstr "Crear un nuevo cannal"
+
 #~ msgid "Graph function written in Python"
 #~ msgstr "Función gráfica escrita en Python"
 
diff --git a/po/fr.gmo b/po/fr.gmo
index f1ee0ea..0ea4064 100644
Binary files a/po/fr.gmo and b/po/fr.gmo differ
diff --git a/po/fr.po b/po/fr.po
index 71d034e..ab77589 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: French localization\n"
 "Report-Msgid-Bugs-To: yeti at gwyddion.net\n"
-"POT-Creation-Date: 2016-11-18 11:05+0100\n"
-"PO-Revision-Date: 2016-11-17 22:47+0100\n"
+"POT-Creation-Date: 2017-08-15 17:48+0200\n"
+"PO-Revision-Date: 2017-08-08 13:43+0100\n"
 "Last-Translator: François Riguet <francheu at caramail.com>\n"
 "Language-Team: François RIGUET <francheu at gwyddion.net>\n"
 "Language: fr_FR\n"
@@ -131,7 +131,8 @@ msgstr "contact : Hertz (paraboloïde)"
 #: app/data-browser-aux.c:1480 app/data-browser.c:2280 app/data-browser.c:2887
 #: app/data-browser.c:3707 app/data-browser.c:3857 app/data-browser.c:4139
 #: app/data-browser.c:4504 app/data-browser.c:4590 app/data-browser.c:5016
-#: app/resource-editor.c:366 modules/process/convolution_filter.c:691
+#: app/resource-editor.c:366 modules/file/xyzexport.c:214
+#: modules/process/convolution_filter.c:691
 msgid "Untitled"
 msgstr "Sans titre"
 
@@ -139,97 +140,105 @@ msgstr "Sans titre"
 msgid "Initial residua evaluation..."
 msgstr "Évaluation initiale des résidus..."
 
-#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1632
+#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1646
 msgid "Fitting..."
 msgstr "Ajustement..."
 
-#: libgwyddion/gwynlfitpreset.c:1442 libprocess/gwyprocessenums.c:101
-#: libprocess/gwyshapefitpreset.c:347
+#: libgwyddion/gwynlfitpreset.c:1549 libprocess/gwyprocessenums.c:101
+#: libprocess/gwyshapefitpreset.c:347 modules/process/psf-fit.c:157
 msgid "Gaussian"
 msgstr "Gaussienne"
 
-#: libgwyddion/gwynlfitpreset.c:1457
+#: libgwyddion/gwynlfitpreset.c:1564
 msgid "Gaussian (PSDF)"
 msgstr "Gaussienne (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1470
+#: libgwyddion/gwynlfitpreset.c:1577
 msgid "Gaussian (ACF)"
 msgstr "Gaussienne (ACF)"
 
-#: libgwyddion/gwynlfitpreset.c:1483
+#: libgwyddion/gwynlfitpreset.c:1590
 msgid "Gaussian (HHCF)"
 msgstr "Gaussienne (HHCF)"
 
-#: libgwyddion/gwynlfitpreset.c:1496
+#: libgwyddion/gwynlfitpreset.c:1603
 msgid "Gaussian (RPSDF)"
 msgstr "Gaussienne (RPSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1509
+#: libgwyddion/gwynlfitpreset.c:1616
 msgid "Two Gaussians (PSDF)"
 msgstr "Gaussienne double (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1524 modules/xyz/xyz_drift.c:841
-#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1819
+#: libgwyddion/gwynlfitpreset.c:1631 modules/xyz/xyz_drift.c:841
+#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1818
 msgid "Exponential"
 msgstr "Exponentielle"
 
-#: libgwyddion/gwynlfitpreset.c:1536
+#: libgwyddion/gwynlfitpreset.c:1643
 msgid "Exponential (PSDF)"
 msgstr "Exponentielle (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1549
+#: libgwyddion/gwynlfitpreset.c:1656
 msgid "Exponential (ACF)"
 msgstr "Exponentielle (ACF)"
 
-#: libgwyddion/gwynlfitpreset.c:1561
+#: libgwyddion/gwynlfitpreset.c:1668
 msgid "Exponential (HHCF)"
 msgstr "Exponentielle (HHCF)"
 
-#: libgwyddion/gwynlfitpreset.c:1574
+#: libgwyddion/gwynlfitpreset.c:1681
 msgid "Exponential (RPSDF)"
 msgstr "Exponentielle (RPSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1588
+#: libgwyddion/gwynlfitpreset.c:1695
+msgid "K-correlated (PSDF)"
+msgstr "K-corrélé (PSDF)"
+
+#: libgwyddion/gwynlfitpreset.c:1709
 msgid "Polynomial (order 0)"
 msgstr "Polynôme (ordre 0)"
 
-#: libgwyddion/gwynlfitpreset.c:1599 modules/xyz/xyz_drift.c:1805
+#: libgwyddion/gwynlfitpreset.c:1720 modules/xyz/xyz_drift.c:1804
 msgid "Polynomial (order 1)"
 msgstr "Polynôme (ordre 1)"
 
-#: libgwyddion/gwynlfitpreset.c:1610
+#: libgwyddion/gwynlfitpreset.c:1731
 msgid "Polynomial (order 2)"
 msgstr "Polynôme (ordre 2)"
 
-#: libgwyddion/gwynlfitpreset.c:1622
+#: libgwyddion/gwynlfitpreset.c:1743
 msgid "Polynomial (order 3)"
 msgstr "Polynôme (ordre 3)"
 
-#: libgwyddion/gwynlfitpreset.c:1635
+#: libgwyddion/gwynlfitpreset.c:1756
 msgid "Square wave"
 msgstr "Onde carrée"
 
-#: libgwyddion/gwynlfitpreset.c:1651
+#: libgwyddion/gwynlfitpreset.c:1772
 msgid "Parabolic step"
 msgstr "Porte parabolique"
 
-#: libgwyddion/gwynlfitpreset.c:1667
+#: libgwyddion/gwynlfitpreset.c:1788
 msgid "Smooth slanted step"
 msgstr "Marche inclinée"
 
-#: libgwyddion/gwynlfitpreset.c:1684
+#: libgwyddion/gwynlfitpreset.c:1805
 msgid "Smooth bent step"
 msgstr "Marche déformée"
 
-#: libgwyddion/gwynlfitpreset.c:1700
+#: libgwyddion/gwynlfitpreset.c:1821
+msgid "Boltzmann bent step"
+msgstr "Marche de Boltzmann déformée"
+
+#: libgwyddion/gwynlfitpreset.c:1837
 msgid "Power"
 msgstr "Puissance"
 
-#: libgwyddion/gwynlfitpreset.c:1712 libprocess/gwyshapefitpreset.c:348
+#: libgwyddion/gwynlfitpreset.c:1849 libprocess/gwyshapefitpreset.c:348
 msgid "Lorentzian"
 msgstr "Lorentzienne"
 
-#: libgwyddion/gwynlfitpreset.c:1726
+#: libgwyddion/gwynlfitpreset.c:1863
 msgid "Sinc"
 msgstr "Sinus cardinal"
 
@@ -250,7 +259,7 @@ msgid "Step height (positive)"
 msgstr "Hauteur de porte (positive)"
 
 #: libprocess/cdline.c:590 libprocess/cdline.c:599
-#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:170
+#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:163
 msgid "Line"
 msgstr "Ligne"
 
@@ -263,7 +272,7 @@ msgid "Circle (down)"
 msgstr "Cercle (bas)"
 
 #: libprocess/cdline.c:608 libprocess/cdline.c:617
-#: libgwydgets/gwygraphareadialog.c:557 modules/process/hough.c:171
+#: libgwydgets/gwygraphareadialog.c:550 modules/process/hough.c:164
 msgid "Circle"
 msgstr "Cercle"
 
@@ -271,237 +280,237 @@ msgstr "Cercle"
 msgid "Circle (up)"
 msgstr "Cercle (haut)"
 
-#: libprocess/gwygrainvalue.c:64
+#: libprocess/gwygrainvalue.c:62
 msgid "Grain number"
 msgstr "Numéro du grain"
 
-#: libprocess/gwygrainvalue.c:73 modules/process/curvature.c:129
+#: libprocess/gwygrainvalue.c:71 modules/process/curvature.c:128
 msgid "Center x position"
 msgstr "Position centrale X"
 
-#: libprocess/gwygrainvalue.c:82 modules/process/curvature.c:130
+#: libprocess/gwygrainvalue.c:80 modules/process/curvature.c:129
 msgid "Center y position"
 msgstr "Position centrale Y"
 
-#: libprocess/gwygrainvalue.c:91
+#: libprocess/gwygrainvalue.c:89
 msgid "Minimum value"
 msgstr "Minimum"
 
-#: libprocess/gwygrainvalue.c:100
+#: libprocess/gwygrainvalue.c:98
 msgid "Maximum value"
 msgstr "Maximum"
 
-#: libprocess/gwygrainvalue.c:109 modules/process/bdep_synth.c:133
-#: modules/tools/filter.c:237
+#: libprocess/gwygrainvalue.c:107 modules/process/bdep_synth.c:133
+#: modules/tools/filter.c:238
 msgid "Mean value"
 msgstr "Moyenne"
 
-#: libprocess/gwygrainvalue.c:118 modules/tools/filter.c:238
+#: libprocess/gwygrainvalue.c:116 modules/tools/filter.c:239
 msgid "Median value"
 msgstr "Médiane"
 
-#: libprocess/gwygrainvalue.c:127
+#: libprocess/gwygrainvalue.c:125
 msgid "Minimum value on boundary"
 msgstr "Minimum du bord"
 
-#: libprocess/gwygrainvalue.c:136
+#: libprocess/gwygrainvalue.c:134
 msgid "Maximum value on boundary"
 msgstr "Maximum du bord"
 
-#: libprocess/gwygrainvalue.c:145
+#: libprocess/gwygrainvalue.c:143
 msgid "Pixel area"
 msgstr "Aire du pixel"
 
-#: libprocess/gwygrainvalue.c:154
+#: libprocess/gwygrainvalue.c:152
 msgid "Projected area"
 msgstr "Surface projetée"
 
-#: libprocess/gwygrainvalue.c:163
+#: libprocess/gwygrainvalue.c:161
 msgid "Surface area"
 msgstr "Surface"
 
-#: libprocess/gwygrainvalue.c:172
+#: libprocess/gwygrainvalue.c:170
 msgid "Equivalent square side"
 msgstr "Côté équivalent"
 
-#: libprocess/gwygrainvalue.c:181
+#: libprocess/gwygrainvalue.c:179
 msgid "Equivalent disc radius"
 msgstr "Rayon équivalent"
 
-#: libprocess/gwygrainvalue.c:190
+#: libprocess/gwygrainvalue.c:188
 msgid "Area above half-height"
 msgstr "Surface au dessus de la mi-hauteur"
 
-#: libprocess/gwygrainvalue.c:199
+#: libprocess/gwygrainvalue.c:197
 msgid "Area of convex hull"
 msgstr "Aire de l'enveloppe convexe"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to
 #. * zero.
-#: libprocess/gwygrainvalue.c:210
+#: libprocess/gwygrainvalue.c:208
 msgid "Zero basis volume"
 msgstr "Volume (base : zéro)"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * grain minimum.
-#: libprocess/gwygrainvalue.c:221
+#: libprocess/gwygrainvalue.c:219
 msgid "Grain minimum basis volume"
 msgstr "Volume (base : minimum de grain)"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * Laplacian background.
-#: libprocess/gwygrainvalue.c:232
+#: libprocess/gwygrainvalue.c:230
 msgid "Laplacian background basis volume"
 msgstr "Volume (base : arrière-plan laplacien)"
 
-#: libprocess/gwygrainvalue.c:241
+#: libprocess/gwygrainvalue.c:239
 msgid "Projected boundary length"
 msgstr "Périmètre projeté"
 
-#: libprocess/gwygrainvalue.c:250
+#: libprocess/gwygrainvalue.c:248
 msgid "Minimum bounding size"
 msgstr "Largeur"
 
-#: libprocess/gwygrainvalue.c:259
+#: libprocess/gwygrainvalue.c:257
 msgid "Minimum bounding direction"
 msgstr "Orientation de la largeur"
 
-#: libprocess/gwygrainvalue.c:268
+#: libprocess/gwygrainvalue.c:266
 msgid "Maximum bounding size"
 msgstr "Longueur"
 
-#: libprocess/gwygrainvalue.c:277
+#: libprocess/gwygrainvalue.c:275
 msgid "Maximum bounding direction"
 msgstr "Orientation de la longueur"
 
-#: libprocess/gwygrainvalue.c:286
+#: libprocess/gwygrainvalue.c:284
 msgid "Maximum inscribed disc radius"
 msgstr "Rayon maximal du disque inscrit"
 
-#: libprocess/gwygrainvalue.c:295
+#: libprocess/gwygrainvalue.c:293
 msgid "Maximum inscribed disc center x position"
 msgstr "Position x du centre du disque inscrit maximal"
 
-#: libprocess/gwygrainvalue.c:304
+#: libprocess/gwygrainvalue.c:302
 msgid "Maximum inscribed disc center y position"
 msgstr "Position y du centre du disque inscrit maximal"
 
-#: libprocess/gwygrainvalue.c:313
+#: libprocess/gwygrainvalue.c:311
 msgid "Minimum circumcircle radius"
 msgstr "Rayon minimal du cercle circonscrit"
 
-#: libprocess/gwygrainvalue.c:322
+#: libprocess/gwygrainvalue.c:320
 msgid "Minimum circumcircle center x position"
 msgstr "Position x du centre du cercle circonscrit minimal"
 
-#: libprocess/gwygrainvalue.c:331
+#: libprocess/gwygrainvalue.c:329
 msgid "Minimum circumcircle center y position"
 msgstr "Position y du centre du cercle circonscrit minimal"
 
-#: libprocess/gwygrainvalue.c:340
+#: libprocess/gwygrainvalue.c:338
 msgid "Mean radius"
 msgstr "Rayon moyen"
 
-#: libprocess/gwygrainvalue.c:349 modules/tools/readvalue.c:319
+#: libprocess/gwygrainvalue.c:347 modules/tools/readvalue.c:322
 msgid "Inclination θ"
 msgstr "Inclinaison θ"
 
-#: libprocess/gwygrainvalue.c:358 modules/tools/readvalue.c:329
+#: libprocess/gwygrainvalue.c:356 modules/tools/readvalue.c:332
 msgid "Inclination φ"
 msgstr "Inclinaison φ"
 
-#: libprocess/gwygrainvalue.c:367
+#: libprocess/gwygrainvalue.c:365
 msgid "Curvature center x position"
 msgstr "Position x du centre de courbure"
 
-#: libprocess/gwygrainvalue.c:376
+#: libprocess/gwygrainvalue.c:374
 msgid "Curvature center y position"
 msgstr "Position y du centre de courbure"
 
-#: libprocess/gwygrainvalue.c:385
+#: libprocess/gwygrainvalue.c:383
 msgid "Curvature center z value"
 msgstr "Valeur z du centre de courbure"
 
-#: libprocess/gwygrainvalue.c:394 modules/tools/readvalue.c:344
+#: libprocess/gwygrainvalue.c:392 modules/tools/readvalue.c:347
 msgid "Curvature 1"
 msgstr "Courbure 1"
 
-#: libprocess/gwygrainvalue.c:403 modules/tools/readvalue.c:354
+#: libprocess/gwygrainvalue.c:401 modules/tools/readvalue.c:357
 msgid "Curvature 2"
 msgstr "Courbure 2"
 
-#: libprocess/gwygrainvalue.c:412
+#: libprocess/gwygrainvalue.c:410
 msgid "Curvature angle 1"
 msgstr "Angle de courbure 1"
 
-#: libprocess/gwygrainvalue.c:421
+#: libprocess/gwygrainvalue.c:419
 msgid "Curvature angle 2"
 msgstr "Angle de courbure 2"
 
-#: libprocess/gwygrainvalue.c:430
+#: libprocess/gwygrainvalue.c:428
 msgid "Major semiaxis of equivalent ellipse"
 msgstr "Demi grand axe de l'ellipse équivalente"
 
-#: libprocess/gwygrainvalue.c:439
+#: libprocess/gwygrainvalue.c:437
 msgid "Minor semiaxis of equivalent ellipse"
 msgstr "Demi petit axe de l'ellipse équivalente"
 
-#: libprocess/gwygrainvalue.c:448
+#: libprocess/gwygrainvalue.c:446
 msgid "Orientation of equivalent ellipse"
 msgstr "Orientation de l'ellipse équivalente"
 
-#: libprocess/gwygrainvalue.c:1120
+#: libprocess/gwygrainvalue.c:1118
 msgid "Id"
 msgstr "Identifiant"
 
-#: libprocess/gwygrainvalue.c:1121 modules/graph/graph_peaks.c:156
-#: modules/process/extract_path.c:391 modules/process/wave_synth.c:482
-#: modules/tools/readvalue.c:251
+#: libprocess/gwygrainvalue.c:1119 modules/graph/graph_peaks.c:154
+#: modules/process/extract_path.c:391 modules/process/wave_synth.c:513
+#: modules/tools/readvalue.c:253
 msgid "Position"
 msgstr "Position"
 
-#: libprocess/gwygrainvalue.c:1122 app/meta.c:411 modules/file/imgexport.c:4625
-#: modules/process/curvature.c:762 modules/tools/level3.c:468
-#: modules/tools/readvalue.c:286
+#: libprocess/gwygrainvalue.c:1120 app/meta.c:411 modules/file/imgexport.c:4573
+#: modules/process/curvature.c:759 modules/tools/level3.c:475
+#: modules/tools/readvalue.c:290
 msgid "Value"
 msgstr "Valeur"
 
-#: libprocess/gwygrainvalue.c:1123
+#: libprocess/gwygrainvalue.c:1121
 msgid "Area"
 msgstr "Surface"
 
-#: libprocess/gwygrainvalue.c:1124 app/data-browser.c:5624 app/toolbox.c:110
+#: libprocess/gwygrainvalue.c:1122 app/data-browser.c:5624 app/toolbox.c:115
 msgid "Volume"
 msgstr "Volume"
 
-#: libprocess/gwygrainvalue.c:1125
+#: libprocess/gwygrainvalue.c:1123
 msgid "Boundary"
 msgstr "Bord"
 
-#: libprocess/gwygrainvalue.c:1126 modules/process/pat_synth.c:829
-#: modules/process/pat_synth.c:1131 modules/process/pat_synth.c:1466
-#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:147
+#: libprocess/gwygrainvalue.c:1124 modules/process/pat_synth.c:830
+#: modules/process/pat_synth.c:1132 modules/process/pat_synth.c:1467
+#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:149
 msgid "Slope"
 msgstr "Pente"
 
-#: libprocess/gwygrainvalue.c:1127 modules/process/curvature.c:213
-#: modules/process/curvature.c:613
+#: libprocess/gwygrainvalue.c:1125 modules/process/curvature.c:212
+#: modules/process/curvature.c:615
 msgid "Curvature"
 msgstr "Courbure"
 
-#: libprocess/gwygrainvalue.c:1128
+#: libprocess/gwygrainvalue.c:1126
 msgid "Moment"
 msgstr "Moment"
 
-#: libprocess/gwygrainvalue.c:1132
+#: libprocess/gwygrainvalue.c:1130
 msgid "User"
 msgstr "Utilisateur"
 
-#: libprocess/gwyprocessenums.c:44
+#: libprocess/gwyprocessenums.c:44 modules/process/preview.h:263
 msgid "Union"
 msgstr "Union"
 
-#: libprocess/gwyprocessenums.c:45
+#: libprocess/gwyprocessenums.c:45 modules/process/preview.h:255
 msgid "Intersection"
 msgstr "Intersection"
 
@@ -580,13 +589,13 @@ msgid "Scale and space adaptive"
 msgstr "Échelle et espace adaptatifs"
 
 #. TRANSLATORS: Interpolation type (AKA nearest neighbour)
-#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3791
-#: modules/xyz/xyz_raster.c:640
+#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3756
+#: modules/xyz/xyz_raster.c:609
 msgid "Round"
 msgstr "Arrondi"
 
-#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3792
-#: modules/xyz/xyz_raster.c:641
+#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3757
+#: modules/xyz/xyz_raster.c:610
 msgid "Linear"
 msgstr "Linéaire"
 
@@ -674,27 +683,27 @@ msgstr "Inclure uniquement la région masquée"
 msgid "Use entire image (ignore mask)"
 msgstr "Utiliser l'image entière (ignorer le masque)"
 
-#: libprocess/gwyprocessenums.c:602
+#: libprocess/gwyprocessenums.c:604
 msgid "distance|City-block"
 msgstr "Manhattan"
 
-#: libprocess/gwyprocessenums.c:603
+#: libprocess/gwyprocessenums.c:605
 msgid "distance|Chess"
 msgstr "Tchebychev"
 
-#: libprocess/gwyprocessenums.c:604
+#: libprocess/gwyprocessenums.c:606
 msgid "distance|Octagonal 4,8"
 msgstr "Octogonale 4,8"
 
-#: libprocess/gwyprocessenums.c:605
+#: libprocess/gwyprocessenums.c:607
 msgid "distance|Octagonal 8,4"
 msgstr "Octogonale 8,4"
 
-#: libprocess/gwyprocessenums.c:606
+#: libprocess/gwyprocessenums.c:608
 msgid "distance|Octagonal"
 msgstr "Octogonale"
 
-#: libprocess/gwyprocessenums.c:607
+#: libprocess/gwyprocessenums.c:609
 msgid "distance|Euclidean"
 msgstr "Euclidienne"
 
@@ -730,11 +739,11 @@ msgstr "Bosse parabolique"
 msgid "Ring"
 msgstr "Anneau"
 
-#: libprocess/morph_lib.c:169 libprocess/tip.c:1043
+#: libprocess/morph_lib.c:169 libprocess/tip.c:1052
 msgid "Dilation..."
 msgstr "Dilatation..."
 
-#: libprocess/morph_lib.c:235 libprocess/tip.c:1164
+#: libprocess/morph_lib.c:235 libprocess/tip.c:1173
 msgid "Erosion..."
 msgstr "Érosion..."
 
@@ -765,81 +774,81 @@ msgid_plural "Found %d internal local maxima"
 msgstr[0] "Un maximum local interne a été trouvé"
 msgstr[1] "%d maxima locaux internes ont été trouvés"
 
-#: libprocess/tip.c:422
+#: libprocess/tip.c:431
 msgid "Pyramid"
 msgstr "Pyramide"
 
-#: libprocess/tip.c:423 libprocess/tip.c:429 libprocess/tip.c:435
+#: libprocess/tip.c:432 libprocess/tip.c:438 libprocess/tip.c:444
 msgid "Pyramidal"
 msgstr "Pyramidal"
 
-#: libprocess/tip.c:428
+#: libprocess/tip.c:437
 msgid "Contact"
 msgstr "Contact"
 
-#: libprocess/tip.c:434
+#: libprocess/tip.c:443
 msgid "Noncontact"
 msgstr "Sans contact"
 
-#: libprocess/tip.c:440
+#: libprocess/tip.c:449
 msgid "Delta function"
 msgstr "Fonction delta"
 
-#: libprocess/tip.c:441
+#: libprocess/tip.c:450
 msgid "Analytical"
 msgstr "Analytique"
 
-#: libprocess/tip.c:446
+#: libprocess/tip.c:455 modules/process/fibre_synth.c:259
 msgid "Parabola"
 msgstr "Parabole"
 
-#: libprocess/tip.c:447 libprocess/tip.c:453
+#: libprocess/tip.c:456 libprocess/tip.c:462
 msgid "Symmetric"
 msgstr "Symétrique"
 
-#: libprocess/tip.c:452
+#: libprocess/tip.c:461
 msgid "Cone"
 msgstr "Cône"
 
-#: libprocess/tip.c:458
+#: libprocess/tip.c:467
 msgid "Elliptical parabola"
 msgstr "Parabole elliptique"
 
-#: libprocess/tip.c:459
+#: libprocess/tip.c:468
 msgid "Asymmetric"
 msgstr "Asymétrique"
 
-#: libprocess/tip.c:1339 libprocess/tip.c:1367 libprocess/tip.c:1416
-#: libprocess/tip.c:1443
+#: libprocess/tip.c:1348 libprocess/tip.c:1376 libprocess/tip.c:1425
+#: libprocess/tip.c:1452
 msgid "Converting fields"
 msgstr "Conversion des champs"
 
-#: libprocess/tip.c:1349
+#: libprocess/tip.c:1358
 msgid "Starting partial estimation"
 msgstr "Démarrage de l'estimation partielle"
 
-#: libprocess/tip.c:1426
+#: libprocess/tip.c:1435
 msgid "Starting full estimation"
 msgstr "Démarrage de l'estimation complète"
 
-#: libprocess/triangulation.c:2085 modules/process/calcoefs_view.c:793
+#: libprocess/triangulation.c:2084 modules/process/calcoefs_view.c:793
 #: modules/process/lat_synth.c:1178
 msgid "Triangulating..."
 msgstr "Triangulation..."
 
-#: libgwydgets/gwy3dwindow.c:570
+#: libgwydgets/gwy3dwindow.c:575
 msgid "Rotate view (R)"
 msgstr "Tourner la vue (R)"
 
-#: libgwydgets/gwy3dwindow.c:575
+#: libgwydgets/gwy3dwindow.c:580
 msgid "Scale view as a whole (S)"
 msgstr "Modifier l'échelle de la vue (S)"
 
-#: libgwydgets/gwy3dwindow.c:580
+#: libgwydgets/gwy3dwindow.c:585
 msgid "Scale value range (V)"
 msgstr "Modifier l'échelle de hauteur (V)"
 
-#: libgwydgets/gwy3dwindow.c:585
+#: libgwydgets/gwy3dwindow.c:590
 msgid "Move light source (L)"
 msgstr "Déplacer la source de lumière (L)"
 
@@ -847,227 +856,286 @@ msgstr "Déplacer la source de lumière (L)"
 msgid "Show full controls"
 msgstr "Montrer tous les contrôles"
 
-#: libgwydgets/gwy3dwindow.c:693
+#: libgwydgets/gwy3dwindow.c:691
 msgid "Hide full controls"
 msgstr "Masquer tous les contrôles"
 
-#: libgwydgets/gwy3dwindow.c:709 modules/file/imgexport.c:4796
-#: modules/process/fit-shape.c:461
+#: libgwydgets/gwy3dwindow.c:707 modules/file/imgexport.c:4745
+#: modules/process/fit-shape.c:462
 msgid "adjective|Basic"
 msgstr "Basique"
 
-#: libgwydgets/gwy3dwindow.c:714
+#: libgwydgets/gwy3dwindow.c:712
 msgid "Light & Material"
 msgstr "Lumière et matériau"
 
-#: libgwydgets/gwy3dwindow.c:719
+#: libgwydgets/gwy3dwindow.c:717
 msgid "Labels"
 msgstr "Légendes"
 
-#: libgwydgets/gwy3dwindow.c:828 modules/process/facet_analysis.c:331
-#: modules/process/facet_analysis.c:347 modules/process/shade.c:245
+#: libgwydgets/gwy3dwindow.c:722
+msgid "Colorbar"
+msgstr "Échelle de couleur"
+
+#: libgwydgets/gwy3dwindow.c:838 modules/process/facet_analysis.c:335
+#: modules/process/facet_analysis.c:351 modules/process/shade.c:253
 #: modules/process/tilt.c:223
 msgid "φ:"
 msgstr "φ :"
 
-#: libgwydgets/gwy3dwindow.c:828 libgwydgets/gwy3dwindow.c:834
-#: libgwydgets/gwy3dwindow.c:1032 libgwydgets/gwy3dwindow.c:1040
-#: modules/process/facet_analysis.c:375 modules/process/indent_analyze.c:460
-#: modules/process/rotate.c:264 modules/process/shade.c:237
-#: modules/process/shade.c:245 modules/process/tilt.c:211
-#: modules/process/tilt.c:223 modules/process/tip_model.c:234
-#: modules/process/tip_model.c:240 modules/process/unrotate.c:334
+#: libgwydgets/gwy3dwindow.c:838 libgwydgets/gwy3dwindow.c:843
+#: libgwydgets/gwy3dwindow.c:1013 libgwydgets/gwy3dwindow.c:1020
+#: modules/process/correct_affine.c:461 modules/process/facet_analysis.c:238
+#: modules/process/facet_analysis.c:370 modules/process/indent_analyze.c:438
+#: modules/process/measure_lattice.c:381 modules/process/rotate.c:264
+#: modules/process/shade.c:245 modules/process/shade.c:253
+#: modules/process/synth.h:379 modules/process/synth.h:410
+#: modules/process/tilt.c:211 modules/process/tilt.c:223
+#: modules/process/tip_model.c:234 modules/process/tip_model.c:240
+#: modules/process/unrotate.c:334 modules/tools/distance.c:197
+#: modules/tools/readvalue.c:223 modules/tools/stats.c:319
 msgid "deg"
 msgstr "deg"
 
-#: libgwydgets/gwy3dwindow.c:834 modules/process/facet_analysis.c:330
-#: modules/process/facet_analysis.c:346 modules/process/shade.c:237
+#: libgwydgets/gwy3dwindow.c:843 modules/process/facet_analysis.c:334
+#: modules/process/facet_analysis.c:350 modules/process/shade.c:245
 #: modules/process/tilt.c:211
 msgid "θ:"
 msgstr "θ :"
 
-#: libgwydgets/gwy3dwindow.c:839 modules/process/cwt.c:151
+#: libgwydgets/gwy3dwindow.c:849 modules/process/cwt.c:151
 msgid "_Scale:"
 msgstr "Échelle :"
 
-#: libgwydgets/gwy3dwindow.c:846
+#: libgwydgets/gwy3dwindow.c:856
 msgid "_Value scale:"
 msgstr "Échelle de hauteur :"
 
-#: libgwydgets/gwy3dwindow.c:851
+#: libgwydgets/gwy3dwindow.c:862
 msgid "Ph_ysical scale:"
 msgstr "Échelle ph_ysique :"
 
-#: libgwydgets/gwy3dwindow.c:865
+#: libgwydgets/gwy3dwindow.c:876
 msgid "verb|Set"
 msgstr "Ajuster"
 
-#: libgwydgets/gwy3dwindow.c:877
+#: libgwydgets/gwy3dwindow.c:886
 msgid "Line _width:"
 msgstr "Largeur de ligne :"
 
-#: libgwydgets/gwy3dwindow.c:881
+#: libgwydgets/gwy3dwindow.c:886 libgwydgets/gwy3dwindow.c:1194
+#: libgwydgets/gwy3dwindow.c:1204 libgwydgets/gwy3dwindow.c:1235
+#: libgwydgets/gwygraphareadialog.c:157 libgwydgets/gwygraphareadialog.c:173
+#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
+#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
+#: modules/process/angle_dist.c:188 modules/process/angle_dist.c:213
+#: modules/process/col_synth.c:486 modules/process/crosscor.c:252
+#: modules/process/crosscor.c:260 modules/process/crosscor.c:276
+#: modules/process/crosscor.c:284 modules/process/crosscor.c:300
+#: modules/process/crosscor.c:308 modules/process/cwt.c:151
+#: modules/process/dimensions.h:88 modules/process/edge.c:672
+#: modules/process/entropy.c:242 modules/process/extend.c:220
+#: modules/process/extend.c:227 modules/process/extend.c:234
+#: modules/process/extend.c:241 modules/process/facet_analysis.c:362
+#: modules/process/fbm_synth.c:383 modules/process/hough.c:203
+#: modules/process/local_contrast.c:146 modules/process/mark_disconn.c:263
+#: modules/process/mask_morph.c:237 modules/process/median-bg.c:209
+#: modules/process/neural.c:623 modules/process/neural.c:631
+#: modules/process/psdf_logphi.c:276 modules/process/rank.c:188
+#: modules/process/scale.c:237 modules/process/scale.c:246
+#: modules/process/scars.c:353 modules/process/scars.c:361
+#: modules/process/semsim.c:227 modules/process/slope_dist.c:365
+#: modules/process/slope_dist.c:393 modules/process/sphere-revolve.c:346
+#: modules/process/straighten_path.c:278 modules/process/synth.h:280
+#: modules/process/synth.h:501 modules/process/tip_blind.c:334
+#: modules/process/tip_blind.c:342 modules/process/volumize_layers.c:240
+#: modules/process/volumize_layers.c:245 modules/process/volumize_layers.c:250
+#: modules/process/wpour_mark.c:320 modules/tools/filter.c:291
+#: modules/tools/level3.c:244 modules/tools/maskedit.c:528
+#: modules/tools/maskedit.c:629 modules/tools/pathlevel.c:256
+#: modules/tools/profile.c:377 modules/tools/profile.c:503
+#: modules/tools/readvalue.c:222 modules/tools/readvalue.c:378
+#: modules/tools/roughness.c:868 modules/volume/volume_slice.c:446
+#: modules/volume/volume_slice.c:469 modules/volume/volume_slice.c:492
+#: modules/xyz/xyz_drift.c:738 modules/xyz/xyz_drift.c:753
+#: modules/xyz/xyz_raster.c:382 modules/xyz/xyz_raster.c:388
+msgid "px"
+msgstr "px"
+
+#: libgwydgets/gwy3dwindow.c:891
 msgid "Show _axes"
 msgstr "Montrer les _axes"
 
-#: libgwydgets/gwy3dwindow.c:890
+#: libgwydgets/gwy3dwindow.c:900
 msgid "Show _labels"
 msgstr "Montrer les _légendes"
 
-#: libgwydgets/gwy3dwindow.c:899
-msgid "Show false _colorbar"
-msgstr "Afficher l'échelle de _couleurs"
-
-#: libgwydgets/gwy3dwindow.c:908
+#: libgwydgets/gwy3dwindow.c:909
 msgid "_Orthographic projection"
 msgstr "Projection _orthographique"
 
-#: libgwydgets/gwy3dwindow.c:917
+#: libgwydgets/gwy3dwindow.c:918
 msgid "_Hide masked"
 msgstr "Rendre les points masqués invisibles"
 
-#: libgwydgets/gwy3dwindow.c:933
+#: libgwydgets/gwy3dwindow.c:934
 msgid "_Lighting"
 msgstr "Éclairage"
 
-#: libgwydgets/gwy3dwindow.c:934
+#: libgwydgets/gwy3dwindow.c:935
 msgid "_Gradient"
 msgstr "_Gradient"
 
-#: libgwydgets/gwy3dwindow.c:935
+#: libgwydgets/gwy3dwindow.c:936
 msgid "_Overlay"
 msgstr "Superp_osition"
 
-#: libgwydgets/gwy3dwindow.c:936
+#: libgwydgets/gwy3dwindow.c:937
 msgid "_Overlay - no light"
 msgstr "Superp_osition - sans éclairage"
 
-#: libgwydgets/gwy3dwindow.c:1009
+#: libgwydgets/gwy3dwindow.c:992
 msgid "_Material:"
 msgstr "_Matériau :"
 
-#: libgwydgets/gwy3dwindow.c:1032
+#: libgwydgets/gwy3dwindow.c:1013
 msgid "_Light φ:"
 msgstr "Angle _lumière φ :"
 
-#: libgwydgets/gwy3dwindow.c:1040
+#: libgwydgets/gwy3dwindow.c:1020
 msgid "L_ight θ:"
 msgstr "Angle lum_ière θ :"
 
-#: libgwydgets/gwy3dwindow.c:1070 libgwydgets/gwy3dwindow.c:1240
-#: app/toolbox-editor.c:215 modules/file/hdrimage.cc:2213
-#: modules/file/imgexport.c:4760 modules/file/pixmap.c:789
+#: libgwydgets/gwy3dwindow.c:1052 libgwydgets/gwy3dwindow.c:1243
+#: app/toolbox-editor.c:216 modules/file/hdrimage.cc:2213
+#: modules/file/imgexport.c:4708 modules/file/pixmap.c:789
 #: modules/file/rawfile.c:424 modules/process/angle_dist.c:172
 #: modules/process/bdep_synth.c:341 modules/process/calcoefs_new.c:371
-#: modules/process/calibrate.c:391 modules/process/col_synth.c:392
-#: modules/process/correct_affine.c:301 modules/process/curvature.c:615
-#: modules/process/cwt.c:135 modules/process/deposit_synth.c:349
+#: modules/process/calibrate.c:383 modules/process/col_synth.c:392
+#: modules/process/correct_affine.c:346 modules/process/curvature.c:617
+#: modules/process/cwt.c:135 modules/process/deposit_synth.c:350
 #: modules/process/diff_synth.c:411 modules/process/domain_synth.c:354
 #: modules/process/drift.c:245 modules/process/dwt.c:166
 #: modules/process/dwtanisotropy.c:184 modules/process/edge.c:638
 #: modules/process/extend.c:192 modules/process/facet-level.c:193
-#: modules/process/facet_analysis.c:271 modules/process/fbm_synth.c:303
+#: modules/process/facet_analysis.c:275 modules/process/fbm_synth.c:303
 #: modules/process/fft.c:336 modules/process/fft_filter_2d.c:417
-#: modules/process/fft_synth.c:341 modules/process/fractal.c:231
-#: modules/process/grain_edge.c:213 modules/process/grain_mark.c:247
-#: modules/process/grain_wshed.c:167 modules/process/hough.c:179
-#: modules/process/lat_synth.c:567 modules/process/latsim.c:159
-#: modules/process/level.c:245 modules/process/linematch.c:804
-#: modules/process/lno_synth.c:433 modules/process/local_contrast.c:130
-#: modules/process/logistic.c:234 modules/process/mark_disconn.c:208
-#: modules/process/mask_distribute.c:152 modules/process/measure_lattice.c:256
-#: modules/process/median-bg.c:180 modules/process/noise_synth.c:336
-#: modules/process/obj_synth.c:441 modules/process/pat_synth.c:385
-#: modules/process/pid.c:199 modules/process/polydistort.c:210
-#: modules/process/polylevel.c:373 modules/process/psdf_logphi.c:249
-#: modules/process/rank.c:158 modules/process/rotate.c:243
-#: modules/process/scale.c:196 modules/process/scars.c:298
-#: modules/process/semsim.c:211 modules/process/shade.c:208
-#: modules/process/slope_dist.c:276 modules/process/sphere-revolve.c:218
-#: modules/process/straighten_path.c:249 modules/process/tilt.c:161
-#: modules/process/tip_model.c:169 modules/process/unrotate.c:220
-#: modules/process/volumize_layers.c:221 modules/process/wave_synth.c:349
-#: modules/process/wpour_mark.c:278 modules/volume/volume_calibrate.c:370
-#: modules/volume/volume_extract.c:331 modules/volume/volume_kmeans.c:153
-#: modules/volume/volume_kmedians.c:147 modules/volume/volume_linestat.c:292
-#: modules/volume/volume_slice.c:292
+#: modules/process/fft_synth.c:341 modules/process/fibre_synth.c:422
+#: modules/process/fractal.c:228 modules/process/grain_edge.c:212
+#: modules/process/grain_mark.c:246 modules/process/grain_wshed.c:168
+#: modules/process/hough.c:174 modules/process/lat_synth.c:567
+#: modules/process/latsim.c:159 modules/process/level.c:245
+#: modules/process/linematch.c:771 modules/process/lno_synth.c:431
+#: modules/process/local_contrast.c:130 modules/process/logistic.c:234
+#: modules/process/mark_disconn.c:208 modules/process/mask_distribute.c:152
+#: modules/process/measure_lattice.c:246 modules/process/median-bg.c:180
+#: modules/process/mfm_current.c:332 modules/process/mfm_field.c:281
+#: modules/process/mfm_findshift.c:230 modules/process/mfm_parallel.c:333
+#: modules/process/mfm_shift.c:170 modules/process/noise_synth.c:334
+#: modules/process/obj_synth.c:438 modules/process/pat_synth.c:385
+#: modules/process/phase_synth.c:205 modules/process/pid.c:197
+#: modules/process/polydistort.c:210 modules/process/polylevel.c:373
+#: modules/process/psdf_logphi.c:249 modules/process/rank.c:158
+#: modules/process/rotate.c:243 modules/process/scale.c:196
+#: modules/process/scars.c:317 modules/process/semsim.c:211
+#: modules/process/shade.c:210 modules/process/slope_dist.c:275
+#: modules/process/sphere-revolve.c:317 modules/process/straighten_path.c:248
+#: modules/process/tilt.c:161 modules/process/tip_model.c:167
+#: modules/process/unrotate.c:220 modules/process/volumize_layers.c:221
+#: modules/process/wave_synth.c:368 modules/process/wpour_mark.c:278
+#: modules/volume/volume_calibrate.c:370 modules/volume/volume_extract.c:324
+#: modules/volume/volume_kmeans.c:154 modules/volume/volume_kmedians.c:147
+#: modules/volume/volume_linestat.c:297 modules/volume/volume_slice.c:294
 msgid "_Reset"
 msgstr "_Remise à zéro"
 
-#: libgwydgets/gwy3dwindow.c:1142
+#: libgwydgets/gwy3dwindow.c:1141
 msgid "X-axis"
 msgstr "Axe X"
 
-#: libgwydgets/gwy3dwindow.c:1143
+#: libgwydgets/gwy3dwindow.c:1142
 msgid "Y-axis"
 msgstr "Axe Y"
 
-#: libgwydgets/gwy3dwindow.c:1144
+#: libgwydgets/gwy3dwindow.c:1143
 msgid "Minimum z value"
 msgstr "Valeur Z minimale"
 
-#: libgwydgets/gwy3dwindow.c:1145
+#: libgwydgets/gwy3dwindow.c:1144
 msgid "Maximum z value"
 msgstr "Valeur Z maximale"
 
-#: libgwydgets/gwy3dwindow.c:1168 modules/file/imgexport.c:3836
+#: libgwydgets/gwy3dwindow.c:1167 modules/file/imgexport.c:3806
 msgid "_Label:"
 msgstr "_Légende :"
 
-#: libgwydgets/gwy3dwindow.c:1173
+#: libgwydgets/gwy3dwindow.c:1180
 msgid "_Text:"
 msgstr "_Texte :"
 
-#: libgwydgets/gwy3dwindow.c:1193
+#: libgwydgets/gwy3dwindow.c:1185
 msgid "Move label"
 msgstr "Déplacer la légende"
 
-#: libgwydgets/gwy3dwindow.c:1202
+#: libgwydgets/gwy3dwindow.c:1194
 msgid "_Horizontally:"
 msgstr "_Horizontalement :"
 
-#: libgwydgets/gwy3dwindow.c:1212
+#: libgwydgets/gwy3dwindow.c:1204
 msgid "_Vertically:"
 msgstr "_Verticalement :"
 
-#: libgwydgets/gwy3dwindow.c:1220
+#: libgwydgets/gwy3dwindow.c:1212
+msgid "A_ll labels have the same size"
+msgstr "Même taille pour toutes les _légendes"
+
+#: libgwydgets/gwy3dwindow.c:1223
 msgid "Scale size _automatically"
 msgstr "Mise à l'échelle _automatique"
 
-#: libgwydgets/gwy3dwindow.c:1232 modules/tools/filter.c:290
+#: libgwydgets/gwy3dwindow.c:1235 modules/tools/filter.c:291
 msgid "Si_ze:"
 msgstr "Taille :"
 
-#: libgwydgets/gwy3dwindow.c:1232 modules/process/cwt.c:151
-#: modules/process/hough.c:212
-msgid "pixels"
-msgstr "pixels"
+#: libgwydgets/gwy3dwindow.c:1277
+msgid "Show false _colorbar"
+msgstr "Afficher l'échelle de _couleurs"
+
+#: libgwydgets/gwy3dwindow.c:1286
+msgid "Reserve space for _colorbar"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:1302 modules/process/lat_synth.c:651
+#: modules/process/obj_synth.c:542 modules/process/pat_synth.c:1458
+#: modules/process/phase_synth.c:279
+msgid "_Size:"
+msgstr "Dimen_sion :"
 
-#: libgwydgets/gwy3dwindow.c:1726 libgwydgets/gwy3dwindow.c:1779
+#: libgwydgets/gwy3dwindow.c:1311
+msgid "_Vertical alignment:"
+msgstr "Alignement _vertical :"
+
+#: libgwydgets/gwy3dwindow.c:1844 libgwydgets/gwy3dwindow.c:1897
 msgid "S_witch to Lighting Mode"
 msgstr "Passer au mode éclairage"
 
-#: libgwydgets/gwy3dwindow.c:1734 libgwydgets/gwy3dwindow.c:1756
+#: libgwydgets/gwy3dwindow.c:1852 libgwydgets/gwy3dwindow.c:1874
 msgid "S_witch to Overlay Mode"
 msgstr "Pa_sser au mode superposition"
 
-#: libgwydgets/gwy3dwindow.c:1748 libgwydgets/gwy3dwindow.c:1771
+#: libgwydgets/gwy3dwindow.c:1866 libgwydgets/gwy3dwindow.c:1889
 msgid "S_witch to Color Gradient Mode"
 msgstr "Passer au mode gradient de couleur"
 
-#: libgwydgets/gwy3dwindow.c:1787
+#: libgwydgets/gwy3dwindow.c:1905
 msgid "T_oggle light"
 msgstr "Basculer l'éclairage"
 
-#: libgwydgets/gwyaxisdialog.c:99
+#: libgwydgets/gwyaxisdialog.c:75
 msgid "Axis Properties"
 msgstr "Propriétés des axes"
 
-#: libgwydgets/gwyaxisdialog.c:101 libgwydgets/gwygraphlabeldialog.c:63
-msgid "Label Properties"
-msgstr "Propriétés des légendes"
-
-#: libgwydgets/gwyaxisdialog.c:184
+#: libgwydgets/gwyaxisdialog.c:88
 msgid "Label Text"
 msgstr "Texte de légende"
 
@@ -1089,7 +1157,7 @@ msgid "Hidden"
 msgstr "Caché"
 
 #: libgwydgets/gwydgetenums.c:47 libgwydgets/gwygraphwindowmeasuredialog.c:572
-#: modules/file/imgexport.c:475 modules/tools/selectionmanager.c:274
+#: modules/file/imgexport.c:474 modules/tools/selectionmanager.c:274
 msgid "Points"
 msgstr "Points"
 
@@ -1097,7 +1165,7 @@ msgstr "Points"
 msgid "Line + points"
 msgstr "Ligne + points"
 
-#: libgwydgets/gwydgetutils.c:564
+#: libgwydgets/gwydgetutils.c:848
 msgid "Change Mask Color"
 msgstr "Changer la couleur du masque"
 
@@ -1106,7 +1174,7 @@ msgid "Quantity"
 msgstr "Quantité"
 
 #: libgwydgets/gwygrainvaluemenu.c:194 libgwydgets/gwygrainvaluemenu.c:207
-#: modules/process/curvature.c:753
+#: modules/process/curvature.c:750
 msgid "Symbol"
 msgstr "Symbole"
 
@@ -1126,137 +1194,141 @@ msgstr "Précédent"
 msgid "_Next"
 msgstr "Suiva_nt"
 
-#: libgwydgets/gwygraphareadialog.c:127 modules/file/rawgraph.c:302
+#: libgwydgets/gwygraphareadialog.c:123 modules/file/rawgraph.c:302
 msgid "Plot _style:"
 msgstr "_Style de graphe :"
 
-#: libgwydgets/gwygraphareadialog.c:148
+#: libgwydgets/gwygraphareadialog.c:131
 msgid "Pl_ot color:"
 msgstr "C_ouleur du graphe"
 
-#: libgwydgets/gwygraphareadialog.c:159
+#: libgwydgets/gwygraphareadialog.c:151
 msgid "Point _type:"
 msgstr "_Type de point :"
 
-#: libgwydgets/gwygraphareadialog.c:165
+#: libgwydgets/gwygraphareadialog.c:157
 msgid "_Point size:"
 msgstr "Taille de _point :"
 
-#: libgwydgets/gwygraphareadialog.c:175
+#: libgwydgets/gwygraphareadialog.c:167
 msgid "_Line type:"
 msgstr "Type de _ligne :"
 
-#: libgwydgets/gwygraphareadialog.c:181 modules/file/imgexport.c:3150
+#: libgwydgets/gwygraphareadialog.c:173 modules/file/imgexport.c:3154
 msgid "Line t_hickness:"
 msgstr "Épaisseur de ligne :"
 
-#: libgwydgets/gwygraphareadialog.c:187
+#: libgwydgets/gwygraphareadialog.c:180
 msgid "<b>Label Te_xt</b>"
 msgstr "<b>Te_xte de légende</b>"
 
-#: libgwydgets/gwygraphareadialog.c:404
+#: libgwydgets/gwygraphareadialog.c:397
 msgid "Set Curve Color"
 msgstr "Régler la couleur de courbe"
 
-#: libgwydgets/gwygraphareadialog.c:556 modules/process/mask_morph.c:179
+#: libgwydgets/gwygraphareadialog.c:549 modules/process/mask_morph.c:178
 msgid "Square"
 msgstr "Carré"
 
-#: libgwydgets/gwygraphareadialog.c:558 modules/process/mask_morph.c:180
+#: libgwydgets/gwygraphareadialog.c:551 modules/process/mask_morph.c:179
 msgid "Diamond"
 msgstr "Losange"
 
-#: libgwydgets/gwygraphareadialog.c:559
+#: libgwydgets/gwygraphareadialog.c:552
 msgid "Cross"
 msgstr "Croix"
 
-#: libgwydgets/gwygraphareadialog.c:560
+#: libgwydgets/gwygraphareadialog.c:553
 msgid "Diagonal cross"
 msgstr "Croix diagonale"
 
-#: libgwydgets/gwygraphareadialog.c:561
+#: libgwydgets/gwygraphareadialog.c:554
 msgid "Asterisk"
 msgstr "Astérisque"
 
-#: libgwydgets/gwygraphareadialog.c:562
+#: libgwydgets/gwygraphareadialog.c:555
 msgid "Star"
 msgstr "Étoile"
 
-#: libgwydgets/gwygraphareadialog.c:563
+#: libgwydgets/gwygraphareadialog.c:556
 msgid "Triangle up"
 msgstr "Triangle haut"
 
-#: libgwydgets/gwygraphareadialog.c:564
+#: libgwydgets/gwygraphareadialog.c:557
 msgid "Triangle down"
 msgstr "Triangle bas"
 
-#: libgwydgets/gwygraphareadialog.c:565
+#: libgwydgets/gwygraphareadialog.c:558
 msgid "Triangle left"
 msgstr "Triangle gauche"
 
-#: libgwydgets/gwygraphareadialog.c:566
+#: libgwydgets/gwygraphareadialog.c:559
 msgid "Triangle right"
 msgstr "Triangle droite"
 
-#: libgwydgets/gwygraphareadialog.c:567
+#: libgwydgets/gwygraphareadialog.c:560
 msgid "Full square"
 msgstr "Carré plein"
 
-#: libgwydgets/gwygraphareadialog.c:568 modules/process/mask_morph.c:177
+#: libgwydgets/gwygraphareadialog.c:561 modules/process/mask_morph.c:176
 msgid "Disc"
 msgstr "Disque"
 
-#: libgwydgets/gwygraphareadialog.c:569
+#: libgwydgets/gwygraphareadialog.c:562
 msgid "Full diamond"
 msgstr "Losange plein"
 
-#: libgwydgets/gwygraphareadialog.c:570
+#: libgwydgets/gwygraphareadialog.c:563
 msgid "Full triangle up"
 msgstr "Triangle haut plein"
 
-#: libgwydgets/gwygraphareadialog.c:571
+#: libgwydgets/gwygraphareadialog.c:564
 msgid "Full triangle down"
 msgstr "Triangle bas plein"
 
-#: libgwydgets/gwygraphareadialog.c:572
+#: libgwydgets/gwygraphareadialog.c:565
 msgid "Full triangle left"
 msgstr "Triangle gauche plein"
 
-#: libgwydgets/gwygraphareadialog.c:573
+#: libgwydgets/gwygraphareadialog.c:566
 msgid "Full triangle right"
 msgstr "Triangle droite plein"
 
-#: libgwydgets/gwygraphareadialog.c:635
+#: libgwydgets/gwygraphareadialog.c:628
 msgid "line-style|Solid"
 msgstr "Solide"
 
-#: libgwydgets/gwygraphareadialog.c:636
+#: libgwydgets/gwygraphareadialog.c:629
 msgid "line-style|Dash"
 msgstr "Pointillé"
 
-#: libgwydgets/gwygraphcurves.c:451
+#: libgwydgets/gwygraphcurves.c:448
 msgid "Description"
 msgstr "Description"
 
-#: libgwydgets/gwygraphcurves.c:463
+#: libgwydgets/gwygraphcurves.c:460
 msgid "Mode"
 msgstr "Mode"
 
-#: libgwydgets/gwygraphcurves.c:481
+#: libgwydgets/gwygraphcurves.c:478
 msgid "Color"
 msgstr "Couleur"
 
-#: libgwydgets/gwygraphcurves.c:494
+#: libgwydgets/gwygraphcurves.c:491
 msgid "Point Type"
 msgstr "Type de point"
 
-#: libgwydgets/gwygraphcurves.c:516
+#: libgwydgets/gwygraphcurves.c:513
 msgid "Line Style"
 msgstr "Style de ligne"
 
+#: libgwydgets/gwygraphlabeldialog.c:63
+msgid "Label Properties"
+msgstr "Propriétés des légendes"
+
 #: libgwydgets/gwygraphlabeldialog.c:74
-msgid "Frame thickness:"
-msgstr "Épaisseur de la grille"
+msgid "_Frame thickness:"
+msgstr "Épaisseur du cadre :"
 
 #: libgwydgets/gwygraphlabeldialog.c:81
 msgid "_Reversed layout"
@@ -1266,12 +1338,12 @@ msgstr "Disposition inve_rsée"
 msgid "Abscissa"
 msgstr "Abscisse"
 
-#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1002 app/toolbox.c:108
+#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1015 app/toolbox.c:113
 msgid "Graph"
 msgstr "Graphe"
 
 #: libgwydgets/gwygraphwindow.c:170 modules/file/hdrimage.cc:472
-#: modules/process/fit-shape.c:656
+#: modules/process/fit-shape.c:666 modules/process/psf.c:229
 msgid "Data"
 msgstr "Données"
 
@@ -1309,15 +1381,15 @@ msgstr "Points quelconques"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:394
 #: libgwydgets/gwygraphwindowmeasuredialog.c:580 modules/tools/linestats.c:170
-#: modules/tools/roughness.c:516 modules/volume/volume_linestat.c:157
+#: modules/tools/roughness.c:517 modules/volume/volume_linestat.c:159
 msgid "Length"
 msgstr "Longueur"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:398
 #: libgwydgets/gwygraphwindowmeasuredialog.c:588 app/gwyplaintool.c:1018
-#: modules/process/lat_synth.c:747 modules/process/obj_synth.c:569
-#: modules/process/pat_synth.c:846 modules/process/pat_synth.c:1148
-#: modules/process/pat_synth.c:1483
+#: modules/process/fibre_synth.c:534 modules/process/lat_synth.c:747
+#: modules/process/obj_synth.c:567 modules/process/pat_synth.c:847
+#: modules/process/pat_synth.c:1149 modules/process/pat_synth.c:1484
 msgid "Height"
 msgstr "Hauteur"
 
@@ -1330,12 +1402,12 @@ msgid "Curve:"
 msgstr "Courbe :"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:553
-#: modules/process/linematch.c:828 modules/process/semsim.c:249
+#: modules/process/linematch.c:795 modules/process/semsim.c:249
 #: modules/xyz/xyz_level.c:254
 msgid "Method:"
 msgstr "Méthode :"
 
-#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:354
+#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:331
 msgid "Angle"
 msgstr "Angle"
 
@@ -1345,7 +1417,7 @@ msgid "Preferred"
 msgstr "Préféré"
 
 #: libgwydgets/gwyoptionmenus.c:470 app/meta.c:410
-#: modules/file/imgexport.c:4160 modules/file/imgexport.c:4607
+#: modules/file/imgexport.c:4110 modules/file/imgexport.c:4555
 #: modules/file/rawfile.c:995 modules/process/convolution_filter.c:538
 #: modules/process/neural.c:418 modules/tools/selectionmanager.c:345
 msgid "Name"
@@ -1384,7 +1456,7 @@ msgid "A_dd symbol"
 msgstr "Ajouter un symbole"
 
 #: libgwydgets/gwyscitext.c:274 modules/file/rawfile.c:553
-#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:405
+#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:419
 msgid "Preview"
 msgstr "Aperçu"
 
@@ -1402,87 +1474,81 @@ msgstr "Aucun module ne permet de charger ce type de fichier."
 msgid "No module can save to this file type."
 msgstr "Aucun module ne permet de sauvegarder sous ce format de fichier."
 
-#: libgwymodule/gwymodulebrowser.c:67
+#: libgwymodule/gwymodulebrowser.c:66
 msgid "Module Browser"
 msgstr "Navigateur de module"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Module"
 msgstr "Module"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Version"
 msgstr "Version"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Author"
 msgstr "Auteur"
 
-#: libgwymodule/gwymodulebrowser.c:246
+#: libgwymodule/gwymodulebrowser.c:244
 msgid "Name-Version:"
 msgstr "Nom-version :"
 
-#: libgwymodule/gwymodulebrowser.c:247 libgwymodule/gwymodulebrowser.c:270
+#: libgwymodule/gwymodulebrowser.c:245 libgwymodule/gwymodulebrowser.c:268
 #: modules/process/grain_stat.c:186
 msgid "File:"
 msgstr "Fichier :"
 
-#: libgwymodule/gwymodulebrowser.c:248
+#: libgwymodule/gwymodulebrowser.c:246
 msgid "Registered functions:"
 msgstr "Fonctions enregistrées :"
 
-#: libgwymodule/gwymodulebrowser.c:249
+#: libgwymodule/gwymodulebrowser.c:247
 msgid "Authors:"
 msgstr "Auteurs :"
 
-#: libgwymodule/gwymodulebrowser.c:250
+#: libgwymodule/gwymodulebrowser.c:248
 msgid "Copyright:"
 msgstr "Copyright :"
 
-#: libgwymodule/gwymodulebrowser.c:251
+#: libgwymodule/gwymodulebrowser.c:249
 msgid "Date:"
 msgstr "Date :"
 
-#: libgwymodule/gwymodulebrowser.c:252
+#: libgwymodule/gwymodulebrowser.c:250
 msgid "Description:"
 msgstr "Description :"
 
-#: libgwymodule/gwymodulebrowser.c:269
+#: libgwymodule/gwymodulebrowser.c:267
 msgid "Name:"
 msgstr "Nom :"
 
-#: libgwymodule/gwymodulebrowser.c:271
+#: libgwymodule/gwymodulebrowser.c:269
 msgid "Failure:"
 msgstr "Échec :"
 
-#: app/about.c:57
+#: app/about.c:58
 #, c-format
 msgid "About %s"
 msgstr "À propos de %s"
 
-#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
-#: app/about.c:92
-#, c-format
-msgid "Released %s\n"
-msgstr "Version %s\n"
-
-#: app/about.c:93
+#: app/about.c:97
 msgid "An SPM data visualization and analysis tool."
 msgstr "Un outil de visualisation et d'analyse de données SPM."
 
-#: app/about.c:101
+#: app/about.c:105
 msgid "Report bugs to:"
 msgstr "Rapporter les erreurs à : "
 
-#: app/about.c:116
+#: app/about.c:120
 msgid "Credits"
 msgstr "Crédits"
 
-#: app/about.c:133
+#: app/about.c:137
 msgid "License"
 msgstr "Licence"
 
-#: app/about.c:138
+#: app/about.c:142
 #, c-format
 msgid ""
 "%s is free software; you can redistribute it and/or modify it under the "
@@ -1497,58 +1563,62 @@ msgstr ""
 "toute version ultérieure. Pour obtenir le texte complet de la licence "
 "reportez vous au fichier COPYING inclus dans le code source."
 
-#: app/about.c:160 modules/process/logistic.c:270
+#: app/about.c:164 modules/process/logistic.c:269
 msgid "Features"
 msgstr "Fonctionnalités"
 
-#: app/about.c:220
+#: app/about.c:224
 msgid "Developers"
 msgstr "Développeurs"
 
-#: app/about.c:221
+#: app/about.c:225
 msgid "Translators"
 msgstr "Traducteurs"
 
-#: app/about.c:225
+#: app/about.c:229
 msgid "Development is supported by the Czech Metrology Institute: "
 msgstr "Le développement est supporté par l'Institut Tchèque de Métrologie : "
 
-#: app/about.c:253 app/about.c:256
+#: app/about.c:257 app/about.c:260
 msgid "OpenGL 3D View"
 msgstr "Vue 3D OpenGL"
 
-#: app/about.c:257 app/about.c:271 app/about.c:291
+#: app/about.c:261 app/about.c:266 app/about.c:286
 msgid "not available\n"
 msgstr "non disponible\n"
 
-#: app/about.c:262 app/about.c:265
-msgid "Fast Fourier Transform"
-msgstr "Transformée de Fourier Rapide (FFT)"
-
-#: app/about.c:266
-msgid "built-in SimpleFFT\n"
-msgstr "Algorithme SimpleFFT interne\n"
-
-#: app/about.c:274
+#: app/about.c:269
 msgid "X11 protocol\n"
 msgstr "Protocole X11\n"
 
-#: app/about.c:276
+#: app/about.c:271
 msgid "Win32 protocol\n"
 msgstr "Protocole Win32\n"
 
-#: app/about.c:278
+#: app/about.c:273
 msgid "LibUnique\n"
 msgstr "LibUnique\n"
 
-#: app/about.c:282
+#: app/about.c:277
 msgid "Remote Control"
 msgstr "Contrôle à distance"
 
-#: app/about.c:286 app/about.c:290
+#: app/about.c:281 app/about.c:285
 msgid "Python Scripting Interface"
 msgstr "Interface de script Python"
 
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:311
+#, c-format
+msgid "Development version, built %s"
+msgstr "Version de développement, compilation %s"
+
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:328
+#, c-format
+msgid "Released %s"
+msgstr "Version publiée le %s"
+
 #: app/app.c:301
 #, c-format
 msgid ""
@@ -1560,116 +1630,124 @@ msgstr ""
 "%s\n"
 "Souhaitez-vous vraiment quitter ?"
 
-#: app/app.c:440
+#: app/app.c:442
 msgid "Mask _Color..."
 msgstr "_Couleur du masque..."
 
-#: app/app.c:456 app/app.c:1725
+#: app/app.c:458 app/app.c:1754
 msgid "Zoom _1:1"
 msgstr "Zoom _1:1"
 
-#: app/app.c:460 app/app.c:1729 app/app.c:1957
+#: app/app.c:462 app/app.c:1758 app/app.c:1988
 msgid "Metadata _Browser..."
 msgstr "Navigateur de méta-données..."
 
-#: app/app.c:465 app/app.c:1734 app/app.c:1962
+#: app/app.c:467 app/app.c:1763 app/app.c:1993
 msgid "View _Log..."
 msgstr "Voir le journa_l..."
 
-#: app/app.c:649
+#: app/app.c:651
 msgid "Pi_xelwise Square"
 msgstr "Pi_xels carrés"
 
-#: app/app.c:659
+#: app/app.c:661
 msgid "_Physically Square"
 msgstr "_Pixels réels"
 
-#: app/app.c:836
+#: app/app.c:842
+msgid "Set as Default"
+msgstr "Enregistrer comme défaut"
+
+#: app/app.c:844
+msgid "Set the current view setup as the default"
+msgstr "Enregistre la configuration comme défaut"
+
+#: app/app.c:854
 msgid "verb|Save"
 msgstr "Enregistrer"
 
-#: app/app.c:839 app/app.c:843
+#: app/app.c:857 app/app.c:861
 msgid "Save 3D view to an image"
 msgstr "Exporter la vue 3D en image"
 
-#: app/app.c:849
-msgid "Set as Default"
-msgstr "Enregistrer comme défaut"
+#: app/app.c:869
+msgid "_Autocrop"
+msgstr "Rognage _automatique"
 
-#: app/app.c:851
-msgid "Set the current view setup as the default"
-msgstr "Enregistre la configuration comme défaut"
+#: app/app.c:873
+msgid "Remove white borders from exported image"
+msgstr "Supprimer les bords blancs dans l'image exportée"
 
-#: app/app.c:940
+#: app/app.c:960
 msgid "_Show mask"
 msgstr "Afficher le ma_sque"
 
-#: app/app.c:1106
+#: app/app.c:1172
 #, c-format
 msgid "Saving of 3D view to `%s' failed"
 msgstr "L'enregistrement de la vue 3D `%s' a échoué"
 
-#: app/app.c:1150
+#: app/app.c:1222
 msgid "Export 3D View"
 msgstr "Exporter la vue 3D"
 
-#: app/app.c:1457
+#: app/app.c:1478
 msgid "_Change Preview"
 msgstr "Modifier l'aperçu"
 
-#: app/app.c:1583
+#: app/app.c:1606
 msgid "Change Volume Data Preview"
 msgstr "Modifier l'aperçu des données volumiques"
 
-#: app/app.c:1593
+#: app/app.c:1616
 msgid "Preview quantity:"
 msgstr "Quantité prévisualisée :"
 
-#: app/app.c:1603 modules/process/extend.c:267 modules/tools/linestats.c:165
+#: app/app.c:1626 modules/process/extend.c:267 modules/tools/linestats.c:165
 #: modules/volume/volume_linestat.c:142
 msgid "Mean"
 msgstr "Moyenne"
 
-#: app/app.c:1604 modules/process/polydistort.c:255 modules/tools/filter.c:240
+#: app/app.c:1627 modules/process/polydistort.c:258 modules/tools/filter.c:241
 #: modules/tools/icolorange.c:424 modules/tools/linestats.c:167
 #: modules/volume/volume_linestat.c:144
 msgid "Minimum"
 msgstr "Minimum"
 
-#: app/app.c:1605 modules/process/col_synth.c:170 modules/tools/filter.c:241
+#: app/app.c:1628 modules/process/col_synth.c:170 modules/tools/filter.c:242
 #: modules/tools/icolorange.c:435 modules/tools/linestats.c:168
 #: modules/volume/volume_linestat.c:145
 msgid "Maximum"
 msgstr "Maximum"
 
-#: app/app.c:1606
+#: app/app.c:1629 modules/volume/volume_linestat.c:146
 msgid "Min. position"
 msgstr "Position min"
 
-#: app/app.c:1607
+#: app/app.c:1630 modules/volume/volume_linestat.c:147
 msgid "Max. position"
 msgstr "Position max"
 
-#: app/app.c:1608 modules/process/bdep_synth.c:134
-#: modules/process/col_synth.c:171 modules/process/scars.c:346
-#: modules/process/scars.c:353 modules/process/threshold.c:341
+#: app/app.c:1631 modules/process/bdep_synth.c:134
+#: modules/process/col_synth.c:171 modules/process/scars.c:369
+#: modules/process/scars.c:377 modules/process/threshold.c:336
 msgid "RMS"
 msgstr "RMS"
 
-#: app/app.c:1609 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
-#: modules/file/xyzexport.c:233 modules/file/xyzexport.c:302
+#: app/app.c:1632 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
+#: modules/file/xyzexport.c:236 modules/file/xyzexport.c:305
 msgid "Channel:"
 msgstr "Canal :"
 
-#: app/app.c:1610
+#: app/app.c:1633
 msgid "Section:"
 msgstr "Section :"
 
-#: app/app.c:1861
+#: app/app.c:1890
 msgid "_Update Preview"
 msgstr "Rafraîchir l'aperç_u"
 
-#: app/app.c:1867
+#: app/app.c:1896
 msgid "_Density Map"
 msgstr "Carte de _densité"
 
@@ -1688,12 +1766,12 @@ msgstr "Volume %d inconnu"
 msgid "Unknown XYZ %d"
 msgstr "Donnée XYZ %d inconnue"
 
-#: app/data-browser-aux.c:2795
+#: app/data-browser-aux.c:2839
 #, c-format
 msgid "Z levels: %d, Z unit: %s"
 msgstr "Niveaux Z : %d, unités Z : %s"
 
-#: app/data-browser-aux.c:2821
+#: app/data-browser-aux.c:2865
 #, c-format
 msgid "Points: %d"
 msgstr "Points : %d"
@@ -1723,10 +1801,10 @@ msgid "Close file"
 msgstr "Fermer le fichier"
 
 #: app/data-browser.c:5582
-msgid "Channels"
-msgstr "Canaux"
+msgid "Images"
+msgstr "Images"
 
-#: app/data-browser.c:5596 modules/volume/volume_extract.c:444
+#: app/data-browser.c:5596 modules/volume/volume_extract.c:431
 msgid "Graphs"
 msgstr "Graphes"
 
@@ -1782,52 +1860,52 @@ msgstr ""
 "\n"
 "%s"
 
-#: app/file.c:285
+#: app/file.c:292
 #, c-format
 msgid "Opening of `%s' failed"
 msgstr "L'ouverture de `%s' a échoué"
 
-#: app/file.c:291 app/file.c:526
+#: app/file.c:298 app/file.c:533
 #, c-format
 msgid "Full file path: %s."
 msgstr "Chemin complet : %s."
 
-#: app/file.c:294
+#: app/file.c:301
 #, c-format
 msgid "Loaded using: %s."
 msgstr "Chargé en utilisant : %s."
 
-#: app/file.c:380
+#: app/file.c:387
 msgid "Merge File"
 msgstr "Fusionner un fichier"
 
-#: app/file.c:382 app/gwyappfilechooser.c:221
+#: app/file.c:389 app/gwyappfilechooser.c:226
 msgid "Open File"
 msgstr "Ouvrir un fichier"
 
-#: app/file.c:520 app/gwymoduleutils.c:192
+#: app/file.c:527 app/gwymoduleutils.c:192
 #, c-format
 msgid "Saving of `%s' failed"
 msgstr "L'enregistrement de `%s' a échoué"
 
-#: app/file.c:529
+#: app/file.c:536
 #, c-format
 msgid "Saved using: %s."
 msgstr "Sauvegardé en utilisant : %s."
 
-#: app/file.c:689
+#: app/file.c:696
 #, c-format
 msgid "File `%s' already exists.  Replace?"
 msgstr "Le fichier `%s' existe déjà.  Remplacer ?"
 
-#: app/file.c:693
+#: app/file.c:700
 #, c-format
 msgid ""
 "The file already exists in `%s'.  Replacing it will overwrite its contents."
 msgstr ""
 "Ce fichier existe déjà dans `%s'.  Le remplacement écrasera son contenu."
 
-#: app/file.c:696
+#: app/file.c:703
 msgid "Replace File?"
 msgstr "Remplacer le fichier ?"
 
@@ -1851,11 +1929,11 @@ msgstr "Fermer la liste des fichiers"
 msgid "Open selected file"
 msgstr "Ouvrir le fichier sélectionné"
 
-#: app/filelist.c:566 app/gwyappfilechooser.c:583
+#: app/filelist.c:566 app/gwyappfilechooser.c:592
 msgid "_Filter:"
 msgstr "_Filtre :"
 
-#: app/filelist.c:604 app/gwyappfilechooser.c:619
+#: app/filelist.c:604 app/gwyappfilechooser.c:628
 msgid "Case _sensitive"
 msgstr "_Sensible à la casse"
 
@@ -1905,97 +1983,97 @@ msgstr "_Courbe"
 msgid "_Snap to control points"
 msgstr "_S'accrocher aux points de contrôle"
 
-#: app/gwyappfilechooser.c:226
+#: app/gwyappfilechooser.c:231
 msgid "Save File"
 msgstr "Enregistrer le fichier"
 
-#: app/gwyappfilechooser.c:380
+#: app/gwyappfilechooser.c:389
 #, c-format
 msgid "File _type: %s"
 msgstr "_Type de fichier : %s"
 
-#: app/gwyappfilechooser.c:387
+#: app/gwyappfilechooser.c:396
 msgid "Only loadable shown"
 msgstr "Ne montrer que les fichiers chargeables"
 
-#: app/gwyappfilechooser.c:391
+#: app/gwyappfilechooser.c:400
 #, c-format
 msgid "Filter: %s"
 msgstr "Filtre : %s"
 
-#: app/gwyappfilechooser.c:455
+#: app/gwyappfilechooser.c:464
 msgid "Automatic by extension"
 msgstr "Automatique par extension"
 
-#: app/gwyappfilechooser.c:464
+#: app/gwyappfilechooser.c:473
 msgid "Automatically detected"
 msgstr "Détection automatique"
 
-#: app/gwyappfilechooser.c:561
+#: app/gwyappfilechooser.c:570
 msgid "Show only loadable files"
 msgstr "Ne montrer que les fichiers chargeables"
 
-#: app/gwyappfilechooser.c:844
+#: app/gwyappfilechooser.c:855
 msgid "Plane-level previewed data"
 msgstr "Aperçu des données avec mise à niveau par plan"
 
-#: app/gwyappfilechooser.c:860
+#: app/gwyappfilechooser.c:871
 msgid "Row-level previewed data"
 msgstr "Aperçu des données avec mise à niveau des lignes"
 
-#: app/gwyappfilechooser.c:969
+#: app/gwyappfilechooser.c:987
+msgid "File too large for preview"
+msgstr "Le fichier est trop grand pour faire un aperçu"
+
+#: app/gwyappfilechooser.c:988
 msgid "…"
 msgstr "…"
 
-#: app/gwyappfilechooser.c:1331
+#: app/gwyappfilechooser.c:1352
 msgid "Cannot preview"
 msgstr "Impossible de prévisualiser"
 
-#: app/gwyddion.c:143
+#: app/gwyddion.c:147
 msgid "Loading document history"
 msgstr "Chargement de l'historique des documents"
 
-#: app/gwyddion.c:148
+#: app/gwyddion.c:152
 msgid "Registering "
 msgstr "Enregistrement "
 
-#: app/gwyddion.c:149
+#: app/gwyddion.c:153
 msgid "stock items"
 msgstr "éléments stockés"
 
-#: app/gwyddion.c:153
+#: app/gwyddion.c:157
 msgid "color gradients"
 msgstr "gradients"
 
-#: app/gwyddion.c:155
+#: app/gwyddion.c:159
 msgid "GL materials"
 msgstr "Matériaux GL"
 
-#: app/gwyddion.c:157
+#: app/gwyddion.c:161
 msgid "grain quantities"
 msgstr "caractéristiques des grains"
 
-#: app/gwyddion.c:159
+#: app/gwyddion.c:163
 msgid "calibrations"
 msgstr "calibrations"
 
-#: app/gwyddion.c:164
+#: app/gwyddion.c:168
 msgid "Loading settings"
 msgstr "Chargement des réglages"
 
-#: app/gwyddion.c:171
+#: app/gwyddion.c:175
 msgid "Registering modules"
 msgstr "Enregistrement des modules"
 
-#: app/gwyddion.c:193
-msgid "Initializing GUI"
-msgstr "Initialisation de l'interface graphique"
-
-#: app/gwyddion.c:439
+#: app/gwyddion.c:464
 msgid "Could not read settings."
 msgstr "Impossible de lire les réglages."
 
-#: app/gwyddion.c:442
+#: app/gwyddion.c:467
 #, c-format
 msgid ""
 "Settings file `%s' cannot be read: %s\n"
@@ -2008,42 +2086,73 @@ msgstr ""
 "Pour éviter la perte des réglages sauvegardés aucune mise à jour ne sera "
 "faite avant que le fichier ne soit réparé ou supprimé."
 
-#: app/gwymoduleutils-file.c:542
+#: app/gwyddion.c:505
+#, c-format
+msgid "Many modules (%u) failed to register."
+msgstr "Plusieurs modules (%u) n'ont pu être chargés."
+
+#: app/gwyddion.c:510
+#, c-format
+msgid ""
+"Most likely Gwyddion was not upgraded correctly.  Instead, one installation "
+"was just overwritten with another, and now it is a mess.\n"
+"\n"
+"Please remove completely the module directory\n"
+"\n"
+"%s\n"
+"\n"
+"and reinstall Gwyddion.\n"
+"\n"
+"See Info → Module Browser for specific errors."
+msgstr ""
+"Il semble que Gwyddion n'ait pas été correctement mis à jour. Visiblement, "
+"une installation a été faite par-dessus une version précédente, aboutissant "
+"à un joyeux bazar. \n"
+"\n"
+"Supprimez complètement le répertoire des modules\n"
+"\n"
+"%s\n"
+"\n"
+"et réinstallez Gwyddion.\n"
+"\n"
+"Voir Info → Navigateur de modules pour les erreurs spécifiques."
+
+#: app/gwymoduleutils-file.c:536
 #, c-format
 msgid "Section %s ended at line %u but it has never started."
 msgstr "La section %s termine à la ligne %u mais elle n'a pas de début."
 
-#: app/gwymoduleutils-file.c:550
+#: app/gwymoduleutils-file.c:544
 #, c-format
 msgid "Section %s ended at line %u instead of %s."
 msgstr "La section %s se termine à la ligne %u au lieu de %s."
 
-#: app/gwymoduleutils-file.c:587
+#: app/gwymoduleutils-file.c:581
 #, c-format
 msgid "Section %s started at line %u before %s ended."
 msgstr "La section %s commence à la ligne %u avant que %s ne soit terminée."
 
-#: app/gwymoduleutils-file.c:593
+#: app/gwymoduleutils-file.c:587
 #, c-format
 msgid "Empty section name at header line %u."
 msgstr "Nom de section vide à la ligne %u de l'en-tête."
 
-#: app/gwymoduleutils-file.c:628
+#: app/gwymoduleutils-file.c:622
 #, c-format
 msgid "Header line %u lacks prefix %s."
 msgstr "Il manque à la ligne %u de l'en-tête le préfixe %s."
 
-#: app/gwymoduleutils-file.c:653
+#: app/gwymoduleutils-file.c:647
 #, c-format
 msgid "Header line %u lacks key-value separator."
 msgstr "Il manque à la ligne %u de l'en-tête le séparateur de valeur clé."
 
-#: app/gwymoduleutils-file.c:661
+#: app/gwymoduleutils-file.c:655
 #, c-format
 msgid "Key at header line %u is empty."
 msgstr "La clé à la ligne %u de l'en-tête est vide."
 
-#: app/gwymoduleutils-file.c:688
+#: app/gwymoduleutils-file.c:682
 #, c-format
 msgid "Header suddenly ended at line %u; end of header marker is missing"
 msgstr ""
@@ -2052,6 +2161,7 @@ msgstr ""
 
 #: app/gwymoduleutils.c:197 app/settings.c:131 app/settings.c:142
 #: app/toolbox-spec.c:536 modules/file/err.h:62
+#: modules/pygwy/pygwy-console.c:528
 #, c-format
 msgid "Cannot write to file: %s."
 msgstr "Impossible d'écrire dans le fichier : %s."
@@ -2080,8 +2190,9 @@ msgstr "Origine"
 
 #: app/gwyplaintool.c:1011 modules/file/rawfile.c:997
 #: modules/process/convolution_filter.c:349
-#: modules/process/convolution_filter.c:553 modules/process/neural.c:419
-#: modules/process/obj_synth.c:538 modules/process/pat_synth.c:1449
+#: modules/process/convolution_filter.c:553 modules/process/fibre_synth.c:520
+#: modules/process/neural.c:419 modules/process/obj_synth.c:536
+#: modules/process/pat_synth.c:1450
 msgid "Size"
 msgstr "Taille"
 
@@ -2138,7 +2249,7 @@ msgstr "Efface_r"
 msgid "_Close"
 msgstr "Fermer"
 
-#: app/log.c:615 modules/file/imgexport.c:4168 modules/file/rawfile.c:996
+#: app/log.c:615 modules/file/imgexport.c:4118 modules/file/rawfile.c:996
 msgid "Type"
 msgstr "Type"
 
@@ -2146,8 +2257,8 @@ msgstr "Type"
 msgid "Function"
 msgstr "Fonction"
 
-#: app/log.c:617 modules/file/imgexport.c:3117 modules/process/fit-shape.c:465
-#: modules/process/neural.c:610 modules/tools/stats.c:425
+#: app/log.c:617 modules/file/imgexport.c:3128 modules/process/fit-shape.c:466
+#: modules/process/neural.c:614 modules/tools/stats.c:423
 msgid "Parameters"
 msgstr "Paramètres"
 
@@ -2159,39 +2270,39 @@ msgstr "Date"
 msgid "Export Log"
 msgstr "Exporter le journal"
 
-#: app/menu.c:556 app/toolbox.c:581
+#: app/menu.c:555 app/toolbox.c:595
 msgid "_Data Process"
 msgstr "Traitement des _données"
 
-#: app/menu.c:598 app/toolbox.c:584
+#: app/menu.c:597 app/toolbox.c:598
 msgid "_Graph"
 msgstr "_Graphe"
 
-#: app/menu.c:641 app/toolbox.c:587
+#: app/menu.c:640 app/toolbox.c:601
 msgid "_Volume Data"
 msgstr "Données _volumiques"
 
-#: app/menu.c:684 app/toolbox.c:590
+#: app/menu.c:683 app/toolbox.c:604
 msgid "_XYZ Data"
 msgstr "Données _XYZ"
 
-#: app/menu.c:715
+#: app/menu.c:714
 msgid "Re-show Last"
 msgstr "Remontrer la dernière commande"
 
-#: app/menu.c:730
+#: app/menu.c:729
 msgid "Repeat Last"
 msgstr "Répéter la dernière commande"
 
-#: app/menu.c:858
+#: app/menu.c:857
 msgid "Repeat"
 msgstr "Répéter"
 
-#: app/menu.c:864
+#: app/menu.c:863
 msgid "Re-show"
 msgstr "Remontrer"
 
-#: app/menu.c:1186
+#: app/menu.c:1185
 msgid "_Document history"
 msgstr "_Historique"
 
@@ -2199,8 +2310,8 @@ msgstr "_Historique"
 msgid "_New"
 msgstr "_Nouveau"
 
-#: app/meta.c:235 modules/file/imgexport.c:4672 modules/file/rawfile.c:1058
-#: modules/process/neural.c:711 modules/tools/selectionmanager.c:405
+#: app/meta.c:235 modules/file/imgexport.c:4620 modules/file/rawfile.c:1058
+#: modules/process/neural.c:718 modules/tools/selectionmanager.c:405
 msgid "_Delete"
 msgstr "Supprimer"
 
@@ -2274,11 +2385,11 @@ msgstr "Impossible de créer le répertoire d'interface utilisateur %s : %s"
 msgid "Cannot create user module directory %s: %s"
 msgstr "Impossible de créer le répertoire de modules utilisateur %s : %s"
 
-#: app/splash.c:832
+#: app/splash.c:1260
 msgid "Starting "
 msgstr "Démarrage"
 
-#: app/splash.c:878
+#: app/splash.c:1313
 msgid " is free software released under GNU GPL."
 msgstr " est un logiciel libre développé sous la licence GNU GPL."
 
@@ -2823,124 +2934,125 @@ msgstr "Astuce suiva_nte"
 msgid "_Show tips at startup"
 msgstr "Afficher les a_stuces au démarrage"
 
-#: app/toolbox-editor.c:212
+#: app/toolbox-editor.c:213
 msgid "Toolbox Editor"
 msgstr "Éditeur de boîte à outils"
 
-#: app/toolbox-editor.c:257
+#: app/toolbox-editor.c:258
 msgid "_New Item"
 msgstr "_Nouvel élément"
 
-#: app/toolbox-editor.c:262
+#: app/toolbox-editor.c:263
 msgid "_New Group"
 msgstr "_Nouveau groupe"
 
-#: app/toolbox-editor.c:268 app/toolbox.c:577
+#: app/toolbox-editor.c:269 app/toolbox.c:591
 msgid "_Edit"
 msgstr "_Éditer"
 
-#: app/toolbox-editor.c:273 modules/process/fft_filter_2d.c:499
-#: modules/tools/maskedit.c:548 modules/volume/volume_zcal.c:173
+#: app/toolbox-editor.c:274 modules/process/fft_filter_2d.c:499
+#: modules/tools/maskedit.c:554 modules/volume/volume_zcal.c:173
 msgid "_Remove"
 msgstr "Supprimer"
 
-#: app/toolbox-editor.c:278
+#: app/toolbox-editor.c:279
 msgid "Move _Up"
 msgstr "Monter"
 
-#: app/toolbox-editor.c:283
+#: app/toolbox-editor.c:284
 msgid "Move _Down"
 msgstr "_Descendre"
 
-#: app/toolbox-editor.c:292 modules/file/hdrimage.cc:2304
-#: modules/file/imgexport.c:3101 modules/file/pixmap.c:872
+#: app/toolbox-editor.c:293 modules/file/hdrimage.cc:2304
+#: modules/file/imgexport.c:3114 modules/file/pixmap.c:872
 #: modules/file/rawfile.c:658 modules/process/crosscor.c:252
-#: modules/process/dimensions.h:473 modules/process/tip_blind.c:333
+#: modules/process/dimensions.h:455 modules/process/fibre_synth.c:526
+#: modules/process/tip_blind.c:334
 msgid "_Width:"
 msgstr "Largeur :"
 
-#: app/toolbox-editor.c:774
+#: app/toolbox-editor.c:787
 msgid "Toolbox Group"
 msgstr "Groupe"
 
-#: app/toolbox-editor.c:791 modules/file/rawgraph.c:267
+#: app/toolbox-editor.c:804 modules/file/rawgraph.c:267
 msgid "_Title:"
 msgstr "_Titre :"
 
-#: app/toolbox-editor.c:805
+#: app/toolbox-editor.c:818
 msgid "_Id:"
 msgstr "_Identifiant :"
 
-#: app/toolbox-editor.c:818
+#: app/toolbox-editor.c:831
 msgid "_Suggest"
 msgstr "_Suggérer"
 
-#: app/toolbox-editor.c:824
+#: app/toolbox-editor.c:837
 msgid "Trans_latable title"
 msgstr "Traduire _le titre"
 
-#: app/toolbox-editor.c:874
+#: app/toolbox-editor.c:887
 msgid "Group id is not a valid identifier"
 msgstr "L'identifiant du groupe n'est pas valide"
 
-#: app/toolbox-editor.c:882
+#: app/toolbox-editor.c:895
 msgid "Group id is not unique"
 msgstr "L'identifiant du groupe n'est pas unique"
 
-#: app/toolbox-editor.c:971
+#: app/toolbox-editor.c:984
 msgid "Toolbox Item"
 msgstr "Élément de la boîte à outils"
 
-#: app/toolbox-editor.c:992 modules/process/coerce.c:331
+#: app/toolbox-editor.c:1005 modules/process/coerce.c:331
 #: modules/tools/filter.c:284
 msgid "_Type:"
 msgstr "_Type :"
 
-#: app/toolbox-editor.c:999
+#: app/toolbox-editor.c:1012
 msgid "Placeholder"
 msgstr "Espace vide"
 
-#: app/toolbox-editor.c:1000
+#: app/toolbox-editor.c:1013
 msgid "Builtin"
 msgstr "Intégré"
 
-#: app/toolbox-editor.c:1001 app/toolbox.c:107
+#: app/toolbox-editor.c:1014 app/toolbox.c:112
 msgid "Data Process"
 msgstr "Traitement des données"
 
-#: app/toolbox-editor.c:1003
+#: app/toolbox-editor.c:1016
 msgid "Volume Data"
 msgstr "Données volumiques"
 
-#: app/toolbox-editor.c:1004
+#: app/toolbox-editor.c:1017
 msgid "XYZ Data"
 msgstr "Données XYZ"
 
-#: app/toolbox-editor.c:1005
+#: app/toolbox-editor.c:1018
 msgid "Tool"
 msgstr "Outil"
 
-#: app/toolbox-editor.c:1012
+#: app/toolbox-editor.c:1025 modules/tools/profile.c:483
 msgid "_Mode:"
 msgstr "_Mode :"
 
-#: app/toolbox-editor.c:1019 app/toolbox-editor.c:1038
+#: app/toolbox-editor.c:1032 app/toolbox-editor.c:1051
 msgid "Default"
 msgstr "Défaut"
 
-#: app/toolbox-editor.c:1020
+#: app/toolbox-editor.c:1033
 msgid "Interactive"
 msgstr "Interactif"
 
-#: app/toolbox-editor.c:1021
+#: app/toolbox-editor.c:1034
 msgid "Non-interactive"
 msgstr "Non interactif"
 
-#: app/toolbox-editor.c:1029
+#: app/toolbox-editor.c:1042
 msgid "Use _icon from:"
 msgstr "Utiliser l'icône à partir de :"
 
-#: app/toolbox-editor.c:1063
+#: app/toolbox-editor.c:1076
 msgid "Functions"
 msgstr "Fonctions"
 
@@ -2956,143 +3068,159 @@ msgstr "Outils restants"
 msgid "All tools not placed explicitly go here."
 msgstr "Tous les outils non placés explicitement se retrouvent ici."
 
-#: app/toolbox.c:106
+#: app/toolbox.c:111
 msgid "View"
 msgstr "Vue"
 
-#: app/toolbox.c:109
+#: app/toolbox.c:114
 msgid "Tools"
 msgstr "Outils"
 
-#: app/toolbox.c:575
+#: app/toolbox.c:589
 msgid "_File"
 msgstr "_Fichier"
 
-#: app/toolbox.c:593
+#: app/toolbox.c:607
 msgid "_Info"
 msgstr "_Info"
 
-#: app/toolbox.c:663
+#: app/toolbox.c:696
 msgid "Display a 3D view of data"
 msgstr "Afficher une vue en 3D des données"
 
-#: app/toolbox.c:667
+#: app/toolbox.c:700
+msgid "Undo"
+msgstr "Annuler"
+
+#: app/toolbox.c:700
+msgid "Undo last action"
+msgstr "Annuler la dernière opération"
+
+#: app/toolbox.c:704
+msgid "Redo"
+msgstr "Rétablir"
+
+#: app/toolbox.c:704
+msgid "Redo again last undone action"
+msgstr "Refaire la dernière action annulée"
+
+#: app/toolbox.c:708
 msgid "Zoom in"
 msgstr "Zoomer"
 
-#: app/toolbox.c:671
+#: app/toolbox.c:712
 msgid "Zoom out"
 msgstr "Dézoomer"
 
-#: app/toolbox.c:675
+#: app/toolbox.c:716
 msgid "Zoom 1:1"
 msgstr "Zoom 1:1"
 
-#: app/toolbox.c:722
+#: app/toolbox.c:781
 msgid "/Show _Data Browser"
 msgstr "/Navigateur de _données"
 
-#: app/toolbox.c:730
+#: app/toolbox.c:789
 msgid "/Module _Browser"
 msgstr "/Navigateur de modules"
 
-#: app/toolbox.c:738
+#: app/toolbox.c:797
 msgid "/Program _Messages"
 msgstr "/_Messages de chargement"
 
-#: app/toolbox.c:753
+#: app/toolbox.c:812
 msgid "/_User Guide"
 msgstr "/_Manuel utilisateur"
 
-#: app/toolbox.c:761
+#: app/toolbox.c:820
 msgid "/_Tip of the Day"
 msgstr "/As_tuce du jour"
 
-#: app/toolbox.c:769
+#: app/toolbox.c:828
 msgid "/_About Gwyddion"
 msgstr "/_À propos de Gwyddion"
 
-#: app/toolbox.c:806
+#: app/toolbox.c:865
 msgid "/_Open..."
 msgstr "/_Ouvrir..."
 
-#: app/toolbox.c:814
+#: app/toolbox.c:873
 msgid "/_Merge..."
 msgstr "/Fusionner..."
 
-#: app/toolbox.c:822
+#: app/toolbox.c:881
 msgid "/Open _Recent"
 msgstr "/Ouv_rir un ficher récent"
 
-#: app/toolbox.c:830
+#: app/toolbox.c:889
 msgid "/_Save"
 msgstr "/_Enregistrer"
 
-#: app/toolbox.c:838
+#: app/toolbox.c:897
 msgid "/Save _As..."
 msgstr "/Enregistrer sous..."
 
-#: app/toolbox.c:846
+#: app/toolbox.c:905
 msgid "/_Close"
 msgstr "/Fermer"
 
-#: app/toolbox.c:854
+#: app/toolbox.c:913
 msgid "/Remo_ve All Logs"
 msgstr "/Supprimer toutes les entrées du journal"
 
-#: app/toolbox.c:870
+#: app/toolbox.c:929
 msgid "/_Quit"
 msgstr "/_Quitter"
 
-#: app/toolbox.c:910
+#: app/toolbox.c:969
 msgid "/_Undo"
 msgstr "/Ann_uler"
 
-#: app/toolbox.c:918
+#: app/toolbox.c:977
 msgid "/_Redo"
 msgstr "/_Rétablir"
 
-#: app/toolbox.c:934
+#: app/toolbox.c:993
 msgid "/Default Mask _Color..."
 msgstr "/_Couleur de masque par défaut..."
 
-#: app/toolbox.c:942
+#: app/toolbox.c:1001
 msgid "/Color _Gradients..."
 msgstr "/_Gradient de couleur..."
 
-#: app/toolbox.c:950
+#: app/toolbox.c:1009
 msgid "/G_L Materials..."
 msgstr "/Matériaux G_L..."
 
-#: app/toolbox.c:958
+#: app/toolbox.c:1017
 msgid "/_Toolbox..."
 msgstr "/Boî_te à outils..."
 
-#: app/toolbox.c:966
+#: app/toolbox.c:1025
 msgid "/_Keyboard Shortcuts"
 msgstr "/Raccourcis clavier"
 
-#: app/toolbox.c:974
+#: app/toolbox.c:1033
 msgid "/_Logging Enabled"
 msgstr "/Journa_l activé"
 
-#: app/toolbox.c:1083
+#: app/toolbox.c:1142
 msgid "Program Messages"
 msgstr "Messages de chargement"
 
-#: app/toolbox.c:1320
+#: app/toolbox.c:1379
 msgid "Change Default Mask Color"
 msgstr "Changer la couleur de masque par défaut"
 
-#: app/toolbox.c:1348
+#: app/toolbox.c:1407
 msgid "OpenGL 3D graphics not available"
 msgstr "Les graphismes OpenGL 3D ne sont pas disponibles"
 
-#: app/toolbox.c:1353
+#: app/toolbox.c:1412
 msgid "OpenGL was disabled with a command-line option."
 msgstr "OpenGL a été désactivé par une option de ligne de commande."
 
-#: app/toolbox.c:1361
+#: app/toolbox.c:1420
 msgid ""
 "Initialization of OpenGL failed.  Check output of <tt>glxinfo</tt> and "
 "warning messages printed to console during Gwyddion startup."
@@ -3101,7 +3229,7 @@ msgstr ""
 "et les messages d'erreur affichés dans la console lors du démarrage de "
 "Gwyddion."
 
-#: app/toolbox.c:1368
+#: app/toolbox.c:1427
 msgid "This version of Gwyddion was built without OpenGL support."
 msgstr "Cette version de Gwyddion a été compilée sans le support OpenGL."
 
@@ -3177,7 +3305,7 @@ msgstr "L'objet a plusieurs références"
 msgid "Secondary data item has no primary data"
 msgstr "L'élément de données secondaires n'a pas de données primaires"
 
-#: app/wait.c:106
+#: app/wait.c:114
 msgid "Please wait"
 msgstr "Patientez s'il vous plaît"
 
@@ -3196,11 +3324,11 @@ msgstr ""
 "L'en-tête de fichier ne peut être converti à partir du jeu de caractères ISO "
 "8859-1 : %s"
 
-#: modules/file/aistfile.c:127
+#: modules/file/aistfile.c:123
 msgid "Imports AIST-NT data files."
 msgstr "Importe les fichiers AIST-NT."
 
-#: modules/file/aistfile.c:140
+#: modules/file/aistfile.c:136
 msgid "AIST-NT files (.aist)"
 msgstr "AIST-NT (.aist)"
 
@@ -3249,7 +3377,8 @@ msgstr ""
 
 #: modules/file/alicona.c:665 modules/file/gdeffile.c:175
 #: modules/file/gdeffile.c:199 modules/file/gsffile.c:159
-#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1038
+#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1174
+#: modules/file/microprof.c:361 modules/file/microprof.c:375
 #: modules/file/pt3file.c:489 modules/file/pt3file.c:591
 msgid "File header is truncated."
 msgstr "L'en-tête de fichier est tronqué."
@@ -3262,11 +3391,11 @@ msgstr "Les commentaires ne terminent pas par CRLF."
 msgid "Comment is not nul-terminated."
 msgstr "Le commentaire ne se termine pas par le caractère nul."
 
-#: modules/file/ambfile.c:84
+#: modules/file/ambfile.c:83
 msgid "Imports Ambios AMB data files."
 msgstr "Importe les fichiers Ambios AMB."
 
-#: modules/file/ambfile.c:97
+#: modules/file/ambfile.c:96
 msgid "Ambios amb files (.amb)"
 msgstr "Ambios amb (.amb)"
 
@@ -3298,11 +3427,11 @@ msgstr "FileDescEnd n'a pas de FileDescBegin correspondant."
 msgid "FileDescBegin has no corresponding FileDescEnd."
 msgstr "FileDescBegin n'a pas de FileDescEnd correspondant."
 
-#: modules/file/apedaxfile.c:259
+#: modules/file/apedaxfile.c:261
 msgid "Imports A.P.E. Research DAX data files."
 msgstr "Importe les fichiers A.P.E. Research DAX."
 
-#: modules/file/apedaxfile.c:274
+#: modules/file/apedaxfile.c:276
 msgid "A.P.E. Research DAX Files (.dax) and APDT File (.apdt)"
 msgstr "A.P.E. Research DAX (.dax) et APDT (.apdt)"
 
@@ -3330,7 +3459,7 @@ msgstr "Largeur :"
 msgid "Height:"
 msgstr "Hauteur :"
 
-#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:248
+#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:251
 msgid "Value units:"
 msgstr "Unités :"
 
@@ -3339,30 +3468,30 @@ msgid "Export Text"
 msgstr "Exporter au format texte"
 
 #: modules/file/asciiexport.c:275 modules/file/gxyzffile.c:402
-#: modules/file/imgexport.c:3565 modules/file/imgexport.c:4203
-#: modules/file/rawfile.c:758 modules/file/xyzexport.c:311
-#: modules/process/calibrate.c:607 modules/process/coerce.c:364
-#: modules/process/col_synth.c:516 modules/process/correct_affine.c:470
-#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:261
-#: modules/process/grain_dist.c:306 modules/process/grain_edge.c:255
-#: modules/process/grain_mark.c:338 modules/process/grain_wshed.c:252
-#: modules/process/linematch.c:852 modules/process/mark_disconn.c:279
-#: modules/process/slope_dist.c:367 modules/process/tip_blind.c:357
+#: modules/file/imgexport.c:3532 modules/file/imgexport.c:4151
+#: modules/file/rawfile.c:758 modules/file/xyzexport.c:314
+#: modules/process/calibrate.c:561 modules/process/coerce.c:363
+#: modules/process/col_synth.c:516 modules/process/correct_affine.c:520
+#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:263
+#: modules/process/grain_dist.c:307 modules/process/grain_edge.c:254
+#: modules/process/grain_mark.c:335 modules/process/grain_wshed.c:256
+#: modules/process/linematch.c:819 modules/process/mark_disconn.c:280
+#: modules/process/slope_dist.c:359 modules/process/tip_blind.c:360
 #: modules/process/wpour_mark.c:354 modules/tools/spotremove.c:322
-#: modules/tools/stats.c:402 modules/xyz/xyz_raster.c:628
+#: modules/tools/stats.c:401 modules/xyz/xyz_raster.c:597
 msgid "Options"
 msgstr "Options"
 
-#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:314
+#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:317
 msgid "Use _dot as decimal separator"
 msgstr "Utiliser le point comme séparateur de décimale"
 
-#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:321
-#: modules/process/grain_dist.c:317
+#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:324
+#: modules/process/grain_dist.c:318
 msgid "Add _informational comment header"
 msgstr "Ajouter un en-tête de commenta_ires"
 
-#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:330
+#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:333
 msgid "_Precision:"
 msgstr "_Précision :"
 
@@ -3382,20 +3511,20 @@ msgstr "Importe les fichiers Attocube Systems ASC."
 msgid "Attocube ASCII files (.asc)"
 msgstr "Attocube ASCII (.asc)"
 
-#: modules/file/bcrfile.c:146
+#: modules/file/bcrfile.c:141
 msgid "Imports Image Metrology BCR data files."
 msgstr "Importe les fichiers Image Metrology BCR"
 
-#: modules/file/bcrfile.c:159
+#: modules/file/bcrfile.c:154
 msgid "BCR files (.bcr, .bcrf)"
 msgstr "BCR (.bcr, .bcrf)"
 
-#: modules/file/bcrfile.c:238
+#: modules/file/bcrfile.c:233
 #, c-format
 msgid "File header is not convertible from UTF-16: %s"
 msgstr "L'en-tête n'est pas convertible depuis UTF-16 : %s"
 
-#: modules/file/bcrfile.c:351
+#: modules/file/bcrfile.c:346
 #, c-format
 msgid "Unknown file type header: `%s'."
 msgstr "Type d'en-tête inconnu : `%s'."
@@ -3430,7 +3559,7 @@ msgid "Burleigh exported data (.txt, .bin)"
 msgstr "Burleigh données exportées (.txt, .bin)"
 
 #: modules/file/burleigh_exp.c:226 modules/file/burleigh_exp.c:267
-#: modules/file/nanoscope.c:1605 modules/file/omicron.c:416
+#: modules/file/nanoscope.c:1612 modules/file/omicron.c:416
 #: modules/file/shimadzu.c:468
 msgid "Missing colon in header line."
 msgstr "Il manque une colonne dans la ligne d'en-tête."
@@ -3482,22 +3611,40 @@ msgstr "Importe les fichiers Benyuan CSM."
 msgid "Benyuan CSM files (.csm)"
 msgstr "Benyuan CSM (.csm)"
 
-#: modules/file/dektakxml.c:138
+#: modules/file/dektakvca.c:197
+msgid "Imports Dektak OPDx data files."
+msgstr "Importe les fichiers Dektak OPDx."
+
+#: modules/file/dektakvca.c:210
+msgid "Dektak OPDx data files (.OPDx)"
+msgstr "Dektak OPDx (.OPDx)"
+
+#: modules/file/dektakvca.c:655
+#, c-format
+msgid "Item `%s' has unexpected type %u instead of %u."
+msgstr "L'élément `%s' est de type non attendu %u au lieu %u."
+
+#: modules/file/dektakvca.c:1022
+#, c-format
+msgid "Truncated data inside item %s."
+msgstr "Données tronquées dans l'élément %s"
+
+#: modules/file/dektakxml.c:118
 msgid "Imports Dektak XML data files."
 msgstr "Importe les fichiers Dektak XML."
 
-#: modules/file/dektakxml.c:151
+#: modules/file/dektakxml.c:131
 msgid "Dektak XML data files (.xml)"
 msgstr "Dektak XML (.xml)"
 
-#: modules/file/dektakxml.c:228 modules/file/lextfile.c:260
-#: modules/file/nanoscan.c:267 modules/file/ometiff.c:265
+#: modules/file/dektakxml.c:208 modules/file/lextfile.c:260
+#: modules/file/nanoscan.c:270 modules/file/ometiff.c:265
 #, c-format
 msgid "XML parsing failed: %s"
 msgstr "L'analyse du fichier XML à échoué : %s"
 
-#: modules/file/dektakxml.c:400 modules/file/lextfile.c:163
-#: modules/file/nanoscan.c:672 modules/file/ometiff.c:445
+#: modules/file/dektakxml.c:373 modules/file/lextfile.c:163
+#: modules/file/nanoscan.c:698 modules/file/ometiff.c:445
 #, c-format
 msgid "Top-level element is not ‘%s’."
 msgstr "L'élément de premier niveau n'est pas ‘%s’."
@@ -3609,7 +3756,7 @@ msgid "Scan size header field overlaps with data."
 msgstr "Le champ d'en-tête de la taille de scan recouvre les données."
 
 #: modules/file/err.h:48 modules/file/nrrdfile.c:779
-#: modules/file/nrrdfile.c:824
+#: modules/file/nrrdfile.c:824 modules/pygwy/pygwy-console.c:504
 #, c-format
 msgid "Cannot read from file: %s."
 msgstr "Impossible de lire à partir du fichier : %s."
@@ -3829,33 +3976,33 @@ msgstr ""
 "La désérialisation des données a fonctionné, mais a abouti à un objet "
 "inattendu %s."
 
-#: modules/file/gwytiff.h:332
+#: modules/file/gwytiff.h:335
 #, c-format
 msgid "BigTIFF reserved fields are %u and %u instead of 8 and 0."
 msgstr "Les champs réservés au BigTIFF sont %u et %u au lieu de 8 et 0."
 
-#: modules/file/gwytiff.h:349 modules/file/gwytiff.h:366
+#: modules/file/gwytiff.h:352 modules/file/gwytiff.h:369
 #, c-format
 msgid "TIFF directory %lu ended unexpectedly."
 msgstr "Le répertoire TIFF %lu se termine de manière inattendue."
 
-#: modules/file/gwytiff.h:484
+#: modules/file/gwytiff.h:487
 #, c-format
 msgid "BigTIFF data type %u was found in a classic TIFF."
 msgstr ""
 "Des données BigTIFF de type %u ont été trouvées dans un TIFF classique."
 
-#: modules/file/gwytiff.h:501
+#: modules/file/gwytiff.h:504
 msgid "Invalid tag data positions were found."
 msgstr "Des positions invalides de balises ont été trouvées."
 
-#: modules/file/gwytiff.h:874 modules/file/gwytiff.h:889
-#: modules/file/gwytiff.h:1012 modules/file/gwytiff.h:1019
+#: modules/file/gwytiff.h:877 modules/file/gwytiff.h:892
+#: modules/file/gwytiff.h:1015 modules/file/gwytiff.h:1022
 #, c-format
 msgid "Required tag %u was not found."
 msgstr "La balise %u n'a pas été trouvée."
 
-#: modules/file/gwytiff.h:942 modules/file/gwytiff.h:986
+#: modules/file/gwytiff.h:945 modules/file/gwytiff.h:989
 #: modules/file/keyence.c:449 modules/file/matfile.c:276
 #: modules/file/matfile.c:298 modules/file/omicronflat.c:1962
 #: modules/file/princetonspe.c:339 modules/file/psia.c:352
@@ -3863,22 +4010,22 @@ msgstr "La balise %u n'a pas été trouvée."
 msgid "File is truncated."
 msgstr "Le fichier est tronqué."
 
-#: modules/file/gwytiff.h:1044
+#: modules/file/gwytiff.h:1047
 msgid "Non-uniform bits per sample are unsupported."
 msgstr ""
 "Les échantillons avec un nombre de bits non uniforme ne sont pas supportés."
 
-#: modules/file/gwytiff.h:1071
+#: modules/file/gwytiff.h:1074 modules/file/zeisslsm.c:973
 #, c-format
 msgid "Compression type %u is not supported."
 msgstr "Le type de compression %u n'est pas supporté."
 
-#: modules/file/gwytiff.h:1077
+#: modules/file/gwytiff.h:1080
 #, c-format
 msgid "Planar configuration %u is not supported."
 msgstr "La configuration plane %u n'est pas supportée."
 
-#: modules/file/gwytiff.h:1101
+#: modules/file/gwytiff.h:1104
 msgid "Unsupported sample format"
 msgstr "Format non supporté"
 
@@ -3915,7 +4062,7 @@ msgstr "Erreur CRC"
 msgid "Minizip error while reading the zip file: %s (%d)."
 msgstr "Erreur de Minizip lors de la lecture du fichier zip : %s (%d)."
 
-#: modules/file/gwyzip.h:248
+#: modules/file/gwyzip.h:248 modules/file/jpkscan.c:2776
 #, c-format
 msgid "File %s is missing in the zip file."
 msgstr "Le fichier %s est absent du fichier zip."
@@ -3951,8 +4098,8 @@ msgstr ""
 msgid "Export GXYZF"
 msgstr "Exporter au format GXYZ"
 
-#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:238
-#: modules/file/xyzexport.c:304
+#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:241
+#: modules/file/xyzexport.c:307
 msgid "XYZ data:"
 msgstr "Données XYZ :"
 
@@ -4041,11 +4188,13 @@ msgstr "Échelle _Z :"
 msgid "Representable"
 msgstr "Représentable"
 
-#: modules/file/hdrimage.cc:480 modules/tools/stats.c:203
+#: modules/file/hdrimage.cc:480 modules/graph/graph_stats.c:146
+#: modules/tools/stats.c:203
 msgid "Minimum:"
 msgstr "Minimum :"
 
-#: modules/file/hdrimage.cc:496 modules/tools/stats.c:204
+#: modules/file/hdrimage.cc:496 modules/graph/graph_stats.c:147
+#: modules/tools/stats.c:204
 msgid "Maximum:"
 msgstr "Maximum :"
 
@@ -4064,12 +4213,12 @@ msgid "OpenEXR data type %u is invalid or unsupported."
 msgstr "Le type de données OpenEXR %u est invalide ou non supportée."
 
 #: modules/file/hdrimage.cc:1433 modules/file/hdrimage.cc:1442
-#: modules/file/imgexport.c:5249 modules/file/imgexport.c:5260
+#: modules/file/imgexport.c:5198 modules/file/imgexport.c:5209
 #, c-format
 msgid "libpng initialization error (in %s)"
 msgstr "Erreur d'initialisation de libpng (dans %s)"
 
-#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5324
+#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5273
 msgid "libpng error occurred"
 msgstr "Une erreur s'est produite dans libpng"
 
@@ -4087,11 +4236,6 @@ msgstr "Information sur l'image"
 msgid "Horizontal size:"
 msgstr "Taille horizontale :"
 
-#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
-#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
-msgid "px"
-msgstr "px"
-
 #: modules/file/hdrimage.cc:2252 modules/file/pixmap.c:826
 msgid "Vertical size:"
 msgstr "Taille verticale :"
@@ -4104,10 +4248,10 @@ msgstr "Canaux :"
 msgid "Pages:"
 msgstr "Pages : "
 
-#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3043
+#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3059
 #: modules/file/pixmap.c:862 modules/file/rawfile.c:649
-#: modules/process/dimensions.h:467 modules/xyz/xyz_drift.c:774
-#: modules/xyz/xyz_raster.c:566
+#: modules/process/dimensions.h:449 modules/xyz/xyz_drift.c:774
+#: modules/xyz/xyz_raster.c:535
 msgid "Physical Dimensions"
 msgstr "Dimensions physiques"
 
@@ -4117,16 +4261,16 @@ msgstr "Dimensions physiques"
 #: modules/process/calcoefs_new.c:408 modules/process/calcoefs_new.c:475
 #: modules/process/calcoefs_simple.c:391 modules/process/calcoefs_simple.c:458
 #: modules/process/calcoefs_view.c:511 modules/process/calcoefs_view.c:549
-#: modules/process/calibrate.c:466 modules/process/calibrate.c:549
-#: modules/process/dimensions.h:161 modules/process/volumize_layers.c:259
-#: modules/volume/volume_calibrate.c:414 modules/volume/volume_calibrate.c:441
-#: modules/volume/volume_calibrate.c:468 modules/volume/volume_calibrate.c:546
+#: modules/process/calibrate.c:459 modules/process/calibrate.c:514
+#: modules/process/dimensions.h:143 modules/process/volumize_layers.c:259
+#: modules/volume/volume_calibrate.c:409 modules/volume/volume_calibrate.c:429
+#: modules/volume/volume_calibrate.c:449 modules/volume/volume_calibrate.c:498
 msgid "verb|Change"
 msgstr "Changer"
 
 #: modules/file/hdrimage.cc:2345 modules/file/pixmap.c:907
-#: modules/file/rawfile.c:694 modules/process/crosscor.c:263
-#: modules/process/dimensions.h:477
+#: modules/file/rawfile.c:694 modules/process/crosscor.c:260
+#: modules/process/dimensions.h:459
 msgid "H_eight:"
 msgstr "Hauteur :"
 
@@ -4143,16 +4287,16 @@ msgstr "Échelle _Z (par unité d'échantillon) :"
 #: modules/file/hdrimage.cc:2557 modules/file/pixmap.c:1176
 #: modules/file/rawfile.c:1386 modules/process/calcoefs_new.c:819
 #: modules/process/calcoefs_simple.c:1197 modules/process/calcoefs_view.c:1380
-#: modules/process/calibrate.c:979 modules/process/dimensions.h:195
-#: modules/process/volumize_layers.c:315 modules/volume/volume_calibrate.c:1017
+#: modules/process/calibrate.c:1013 modules/process/dimensions.h:177
+#: modules/process/volumize_layers.c:314 modules/volume/volume_calibrate.c:957
 msgid "Change Units"
 msgstr "Changer les unités"
 
 #: modules/file/hdrimage.cc:2571 modules/file/pixmap.c:1190
 #: modules/file/rawfile.c:1400 modules/process/calcoefs_new.c:832
 #: modules/process/calcoefs_simple.c:1210 modules/process/calcoefs_view.c:1393
-#: modules/process/calibrate.c:993 modules/process/dimensions.h:208
-#: modules/process/volumize_layers.c:329 modules/volume/volume_calibrate.c:1031
+#: modules/process/calibrate.c:1027 modules/process/dimensions.h:190
+#: modules/process/volumize_layers.c:328 modules/volume/volume_calibrate.c:971
 msgid "New _units:"
 msgstr "Nouvelles _unités :"
 
@@ -4199,134 +4343,134 @@ msgid "Field DataSize %ux%u does not match image dimensions %ux%u."
 msgstr ""
 "Le champ DataSize %ux%u ne correspond pas aux dimensions de l'image %ux%u."
 
-#: modules/file/igorfile.c:200
+#: modules/file/igorfile.c:210
 msgid "Imports Igor binary waves (.ibw)."
 msgstr "Importe les waveforms Igor binaires (.ibw)."
 
-#: modules/file/igorfile.c:213
+#: modules/file/igorfile.c:223
 msgid "Igor binary waves (.ibw)"
 msgstr "Igor waveforms binaires (.ibw)"
 
-#: modules/file/igorfile.c:273
+#: modules/file/igorfile.c:283
 #, c-format
 msgid "Format version is %d.  Only version 5 is supported."
 msgstr "La version de format est %d. Seule la version 5 est supportée."
 
-#: modules/file/igorfile.c:294
+#: modules/file/igorfile.c:305
 msgid "Only two-dimensional data are supported."
 msgstr "Seules les données bi-dimensionnelles sont supportées."
 
-#: modules/file/igorfile.c:306
+#: modules/file/igorfile.c:317
 #, c-format
 msgid "Number of data points %u does not match resolutions %u×%u×%u."
 msgstr ""
 "Le nombre de points de données %u ne correspond pas à la résolution %u×%u×%u."
 
-#: modules/file/igorfile.c:320
+#: modules/file/igorfile.c:331
 #, c-format
 msgid "Data size %u does not match the number of data points %u×%u."
 msgstr ""
 "La taille des données %u ne correspond pas au nombre de points de données %u×"
 "%u."
 
-#: modules/file/igorfile.c:358
+#: modules/file/igorfile.c:369
 msgid "Cannot read channel labels."
 msgstr "Impossible de lire les légendes des canaux."
 
-#: modules/file/imgexport.c:392 modules/file/pixmap.c:178
+#: modules/file/imgexport.c:391 modules/file/pixmap.c:178
 msgid "Portable Network Graphics (.png)"
 msgstr "Image PNG (.png)"
 
-#: modules/file/imgexport.c:398 modules/file/pixmap.c:182
+#: modules/file/imgexport.c:397 modules/file/pixmap.c:182
 msgid "JPEG (.jpeg,.jpg)"
 msgstr "Image JPEG (.jpeg, .jpg)"
 
-#: modules/file/imgexport.c:404 modules/file/pixmap.c:186
+#: modules/file/imgexport.c:403 modules/file/pixmap.c:186
 msgid "TIFF (.tiff,.tif)"
 msgstr "Image TIFF (.tiff, .tif)"
 
-#: modules/file/imgexport.c:410 modules/file/pixmap.c:190
+#: modules/file/imgexport.c:409 modules/file/pixmap.c:190
 msgid "Portable Pixmap (.ppm,.pnm)"
 msgstr "Image PPM (.ppm, .pnm)"
 
-#: modules/file/imgexport.c:416 modules/file/pixmap.c:194
+#: modules/file/imgexport.c:415 modules/file/pixmap.c:194
 msgid "Windows or OS2 Bitmap (.bmp)"
 msgstr "Image BMP (.bmp)"
 
-#: modules/file/imgexport.c:422 modules/file/pixmap.c:198
+#: modules/file/imgexport.c:421 modules/file/pixmap.c:198
 msgid "TARGA (.tga,.targa)"
 msgstr "Image TARGA (.tga, .targa)"
 
-#: modules/file/imgexport.c:429
+#: modules/file/imgexport.c:428
 msgid "WebP (.webp)"
 msgstr "Image WebP (.webp)"
 
-#: modules/file/imgexport.c:437
+#: modules/file/imgexport.c:436
 msgid "Portable document format (.pdf)"
 msgstr "Document PDF (.pdf)"
 
-#: modules/file/imgexport.c:445
+#: modules/file/imgexport.c:444
 msgid "Encapsulated PostScript (.eps)"
 msgstr "Document PostScript encapsulé (.eps)"
 
-#: modules/file/imgexport.c:453
+#: modules/file/imgexport.c:452
 msgid "Scalable Vector Graphics (.svg)"
 msgstr "Image vectorielle SVG (.svg)"
 
-#: modules/file/imgexport.c:463 modules/tools/selectionmanager.c:269
+#: modules/file/imgexport.c:462 modules/tools/selectionmanager.c:269
 msgid "Horiz./vert. lines"
 msgstr "Lignes horiz./vert."
 
-#: modules/file/imgexport.c:467 modules/tools/selectionmanager.c:270
+#: modules/file/imgexport.c:466 modules/tools/selectionmanager.c:270
 msgid "Ellipses"
 msgstr "Ellipses"
 
-#: modules/file/imgexport.c:471 modules/tools/selectionmanager.c:272
+#: modules/file/imgexport.c:470 modules/tools/selectionmanager.c:272
 msgid "Lines"
 msgstr "Lignes"
 
-#: modules/file/imgexport.c:479 modules/tools/selectionmanager.c:275
+#: modules/file/imgexport.c:478 modules/tools/selectionmanager.c:275
 msgid "Rectangles"
 msgstr "Rectangles"
 
-#: modules/file/imgexport.c:483 modules/process/lat_synth.c:565
+#: modules/file/imgexport.c:482 modules/process/lat_synth.c:565
 #: modules/process/lat_synth.c:637 modules/tools/selectionmanager.c:271
 msgid "Lattice"
 msgstr "Maillage"
 
-#: modules/file/imgexport.c:487
+#: modules/file/imgexport.c:486
 msgid "Path"
 msgstr "Chemin"
 
-#: modules/file/imgexport.c:493 modules/file/imgexport.c:499
+#: modules/file/imgexport.c:492 modules/file/imgexport.c:498
 msgid "ruler|_None"
 msgstr "_Aucune"
 
-#: modules/file/imgexport.c:494
+#: modules/file/imgexport.c:493
 msgid "_Rulers"
 msgstr "G_raduations"
 
-#: modules/file/imgexport.c:495
+#: modules/file/imgexport.c:494
 msgid "_Inset scale bar"
 msgstr "Échelle"
 
-#: modules/file/imgexport.c:500
+#: modules/file/imgexport.c:499
 msgid "_False color ruler"
 msgstr "Échelle de couleurs"
 
-#: modules/file/imgexport.c:504
+#: modules/file/imgexport.c:503
 msgid "title|None"
 msgstr "Aucun"
 
-#: modules/file/imgexport.c:505
+#: modules/file/imgexport.c:504
 msgid "At the top"
 msgstr "En haut"
 
-#: modules/file/imgexport.c:506
+#: modules/file/imgexport.c:505
 msgid "Along the right edge"
 msgstr "Le long du bord droit"
 
-#: modules/file/imgexport.c:512
+#: modules/file/imgexport.c:511
 msgid ""
 "Renders data into vector (SVG, PDF, EPS) and pixmap (PNG, JPEG, TIFF, WebP, "
 "PPM, BMP, TARGA) images. Export to some formats relies on GDK and other "
@@ -4336,56 +4480,57 @@ msgstr ""
 "JPEG, TIFF, WebP, PPM, BMP, TARGA). L'export sous certains formats est basé "
 "sur GDK et d'autres librairies, et peut ainsi dépendre de votre installation."
 
-#: modules/file/imgexport.c:2931
+#: modules/file/imgexport.c:2933
 msgid "Select Color"
 msgstr "Couleur des sélections"
 
-#: modules/file/imgexport.c:3002
-msgid "Black"
-msgstr "Noir"
-
-#: modules/file/imgexport.c:3010
+#: modules/file/imgexport.c:3005
 msgid "White"
 msgstr "Blanc"
 
-#: modules/file/imgexport.c:3053
+#: modules/file/imgexport.c:3014
+msgid "Black"
+msgstr "Noir"
+
+#: modules/file/imgexport.c:3069
 msgid "Pi_xel size:"
 msgstr "Taille des pi_xels :"
 
-#: modules/file/imgexport.c:3062
+#: modules/file/imgexport.c:3077
 msgid "Pixels per _inch:"
 msgstr "P_ixels par pouce :"
 
-#: modules/file/imgexport.c:3089
+#: modules/file/imgexport.c:3102
 msgid "_Zoom:"
 msgstr "_Zoom :"
 
-#: modules/file/imgexport.c:3108 modules/process/bdep_synth.c:430
+#: modules/file/imgexport.c:3120 modules/process/bdep_synth.c:430
 #: modules/process/col_synth.c:486 modules/process/diff_synth.c:508
-#: modules/process/domain_synth.c:510 modules/process/grain_mark.c:285
-#: modules/process/lat_synth.c:753 modules/process/obj_synth.c:575
-#: modules/process/pat_synth.c:852 modules/process/pat_synth.c:1154
-#: modules/process/pat_synth.c:1489 modules/process/tip_blind.c:340
+#: modules/process/domain_synth.c:510 modules/process/fibre_synth.c:540
+#: modules/process/grain_mark.c:284 modules/process/lat_synth.c:753
+#: modules/process/obj_synth.c:573 modules/process/pat_synth.c:853
+#: modules/process/pat_synth.c:1155 modules/process/pat_synth.c:1490
+#: modules/process/phase_synth.c:298 modules/process/tip_blind.c:342
 msgid "_Height:"
 msgstr "_Hauteur :"
 
-#: modules/file/imgexport.c:3121
+#: modules/file/imgexport.c:3136
 msgid "_Font:"
 msgstr "Police :"
 
-#: modules/file/imgexport.c:3140
+#: modules/file/imgexport.c:3145
 msgid "_Font size:"
 msgstr "Taille de police :"
 
-#: modules/file/imgexport.c:3160
+#: modules/file/imgexport.c:3163
 msgid "O_utline thickness:"
 msgstr "Épaisse_ur des contours :"
 
-#: modules/file/imgexport.c:3170
+#: modules/file/imgexport.c:3172
 msgid "_Border width:"
 msgstr "Épaisseur des bordures :"
 
-#: modules/file/imgexport.c:3180
+#: modules/file/imgexport.c:3181
 msgid "_Tick length:"
 msgstr "Longueur des gradua_tions :"
 
@@ -4405,219 +4550,220 @@ msgstr "Couleurs"
 msgid "_Line and text color:"
 msgstr "Cou_leur des lignes et du texte :"
 
-#: modules/file/imgexport.c:3221
+#: modules/file/imgexport.c:3220
 msgid "_Transparent background"
 msgstr "Arrière-plan transparent"
 
-#: modules/file/imgexport.c:3232
+#: modules/file/imgexport.c:3231
 msgid "_Background color:"
 msgstr "Couleur d'arrière-plan :"
 
-#: modules/file/imgexport.c:3474
-msgid "Lateral scale"
-msgstr "Échelle latérale"
-
-#: modules/file/imgexport.c:3487 modules/process/lno_synth.c:1053
-msgid "_Length:"
-msgstr "_Longueur :"
-
-#: modules/file/imgexport.c:3503
-msgid "_Auto"
-msgstr "_Auto"
-
-#: modules/file/imgexport.c:3511 modules/process/pat_synth.c:469
+#: modules/file/imgexport.c:3433 modules/process/fibre_synth.c:582
+#: modules/process/pat_synth.c:470
 msgid "Placement"
 msgstr "Positionnement"
 
-#: modules/file/imgexport.c:3515
+#: modules/file/imgexport.c:3437
 msgid "left"
 msgstr "gauche"
 
-#: modules/file/imgexport.c:3519
+#: modules/file/imgexport.c:3440
 msgid "center"
 msgstr "centre"
 
-#: modules/file/imgexport.c:3523
+#: modules/file/imgexport.c:3443
 msgid "right"
 msgstr "droite"
 
-#: modules/file/imgexport.c:3528
+#: modules/file/imgexport.c:3448
 msgid "top"
 msgstr "haut"
 
-#: modules/file/imgexport.c:3540
+#: modules/file/imgexport.c:3456
 msgid "bottom"
 msgstr "bas"
 
-#: modules/file/imgexport.c:3552 modules/file/imgexport.c:3874
+#: modules/file/imgexport.c:3479
+msgid "Lateral scale"
+msgstr "Échelle latérale"
+
+#: modules/file/imgexport.c:3496 modules/process/lno_synth.c:1053
+msgid "_Length:"
+msgstr "_Longueur :"
+
+#: modules/file/imgexport.c:3502
+msgid "_Auto"
+msgstr "_Auto"
+
+#: modules/file/imgexport.c:3519 modules/file/imgexport.c:3832
 msgid "Hori_zontal gap:"
 msgstr "Écart hori_zontal :"
 
-#: modules/file/imgexport.c:3558 modules/file/imgexport.c:3854
+#: modules/file/imgexport.c:3526 modules/file/imgexport.c:3812
 msgid "_Vertical gap:"
 msgstr "Écart vertical :"
 
-#: modules/file/imgexport.c:3571 modules/file/imgexport.c:4184
+#: modules/file/imgexport.c:3538 modules/file/imgexport.c:4134
 msgid "Colo_r:"
 msgstr "Couleu_r :"
 
-#: modules/file/imgexport.c:3576 modules/file/imgexport.c:4189
+#: modules/file/imgexport.c:3542 modules/file/imgexport.c:4138
 msgid "Out_line color:"
 msgstr "Cou_leur des contours :"
 
-#: modules/file/imgexport.c:3580 modules/file/imgexport.c:4195
+#: modules/file/imgexport.c:3547 modules/file/imgexport.c:4143
 msgid "O_pacity:"
 msgstr "O_pacité :"
 
-#: modules/file/imgexport.c:3589
+#: modules/file/imgexport.c:3554
 msgid "Draw _ticks"
 msgstr "Afficher les ex_trémités"
 
-#: modules/file/imgexport.c:3599
+#: modules/file/imgexport.c:3564
 msgid "Draw _label"
 msgstr "Afficher _l'annotation"
 
-#: modules/file/imgexport.c:3609
+#: modules/file/imgexport.c:3574
 msgid "Draw text _above scale bar"
 msgstr "Dessiner le texte _au-dessus de l'échelle"
 
-#: modules/file/imgexport.c:3773
+#: modules/file/imgexport.c:3738
 msgid "Image"
 msgstr "Image"
 
-#: modules/file/imgexport.c:3777 modules/process/calcoefs_view.c:473
-#: modules/process/correct_affine.c:488 modules/process/drift.c:297
-#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:202
-#: modules/process/fft_filter_1d.c:294 modules/process/fft_profile.c:292
-#: modules/process/fractal.c:253 modules/process/nanoindent_adjust.c:229
-#: modules/process/polydistort.c:247 modules/process/rotate.c:274
-#: modules/process/scale.c:253 modules/process/straighten_path.c:271
+#: modules/file/imgexport.c:3742 modules/process/calcoefs_view.c:473
+#: modules/process/correct_affine.c:538 modules/process/drift.c:298
+#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:203
+#: modules/process/fft_filter_1d.c:296 modules/process/fft_profile.c:293
+#: modules/process/fractal.c:262 modules/process/nanoindent_adjust.c:229
+#: modules/process/polydistort.c:250 modules/process/rotate.c:274
+#: modules/process/scale.c:257 modules/process/straighten_path.c:270
 #: modules/process/unrotate.c:277 modules/tools/linestats.c:400
-#: modules/tools/profile.c:555 modules/tools/roughness.c:864
-#: modules/tools/sfunctions.c:468 modules/xyz/xyz_raster.c:632
+#: modules/tools/profile.c:552 modules/tools/roughness.c:879
+#: modules/tools/sfunctions.c:481 modules/xyz/xyz_raster.c:601
 msgid "_Interpolation type:"
 msgstr "Type d'interpolation :"
 
-#: modules/file/imgexport.c:3807
+#: modules/file/imgexport.c:3772
 msgid "Draw _frame"
 msgstr "Dessiner le cadre"
 
-#: modules/file/imgexport.c:3816
+#: modules/file/imgexport.c:3781
 msgid "Draw _mask"
 msgstr "Dessiner le _masque"
 
-#: modules/file/imgexport.c:3826
+#: modules/file/imgexport.c:3791
 msgid "Draw mask _legend"
 msgstr "Afficher la _légende du masque"
 
-#: modules/file/imgexport.c:3861
+#: modules/file/imgexport.c:3819
 msgid "Value Scale"
 msgstr "Échelle de valeurs"
 
-#: modules/file/imgexport.c:3882
+#: modules/file/imgexport.c:3840
 msgid "Fi_xed precision:"
 msgstr "Précision fi_xée :"
 
-#: modules/file/imgexport.c:3898
+#: modules/file/imgexport.c:3855
 msgid "Fixed _kilo threshold:"
 msgstr "Seuil d'unité :"
 
-#: modules/file/imgexport.c:3914 modules/file/imgexport.c:4635
+#: modules/file/imgexport.c:3869 modules/file/imgexport.c:4583
 msgid "Title"
 msgstr "Titre"
 
-#: modules/file/imgexport.c:3918
+#: modules/file/imgexport.c:3877
 msgid "Posi_tion:"
 msgstr "Posi_tion :"
 
-#: modules/file/imgexport.c:3934
+#: modules/file/imgexport.c:3884
 msgid "_Gap:"
 msgstr "Écart :"
 
-#: modules/file/imgexport.c:3941
+#: modules/file/imgexport.c:3891
 msgid "Put _units to title"
 msgstr "Ajouter les _unités dans le titre"
 
-#: modules/file/imgexport.c:4125
+#: modules/file/imgexport.c:4075
 msgid "Draw _selection"
 msgstr "Dessiner les _sélections"
 
-#: modules/file/imgexport.c:4176 modules/tools/selectionmanager.c:361
+#: modules/file/imgexport.c:4126 modules/tools/selectionmanager.c:361
 msgid "Objects"
 msgstr "Objets"
 
-#: modules/file/imgexport.c:4615
+#: modules/file/imgexport.c:4563
 msgid "Lateral"
 msgstr "Latéral"
 
-#: modules/file/imgexport.c:4654 modules/file/rawfile.c:1040
-#: modules/process/calcoefs_load.c:230 modules/process/neural.c:693
+#: modules/file/imgexport.c:4602 modules/file/rawfile.c:1040
+#: modules/process/calcoefs_load.c:230 modules/process/neural.c:700
 msgid "verb|_Load"
 msgstr "Charger"
 
-#: modules/file/imgexport.c:4660 modules/file/rawfile.c:1046
-#: modules/process/neural.c:699
+#: modules/file/imgexport.c:4608 modules/file/rawfile.c:1046
+#: modules/process/neural.c:706
 msgid "verb|_Store"
 msgstr "Enregi_strer"
 
-#: modules/file/imgexport.c:4666 modules/file/rawfile.c:1052
-#: modules/process/neural.c:705
+#: modules/file/imgexport.c:4614 modules/file/rawfile.c:1052
+#: modules/process/neural.c:712
 msgid "_Rename"
 msgstr "_Renommer"
 
-#: modules/file/imgexport.c:4686 modules/file/rawfile.c:1071
+#: modules/file/imgexport.c:4634 modules/file/rawfile.c:1071
 msgid "Preset _name:"
 msgstr "_Nom du préréglage :"
 
-#: modules/file/imgexport.c:4757
+#: modules/file/imgexport.c:4705
 #, c-format
 msgid "Export %s"
 msgstr "Exporter au format %s"
 
-#: modules/file/imgexport.c:4778
+#: modules/file/imgexport.c:4727
 msgid "Export as 1_6 bit grayscale"
 msgstr "Exporter en niveaux de gris 1_6 bits"
 
-#: modules/file/imgexport.c:4801
+#: modules/file/imgexport.c:4750
 msgid "Lateral Scale"
 msgstr "Échelle latérale"
 
-#: modules/file/imgexport.c:4806
+#: modules/file/imgexport.c:4755
 msgid "Values"
 msgstr "Valeurs"
 
-#: modules/file/imgexport.c:4811
+#: modules/file/imgexport.c:4760
 msgid "Selection"
 msgstr "Sélection"
 
-#: modules/file/imgexport.c:4816 modules/file/rawfile.c:462
+#: modules/file/imgexport.c:4765 modules/file/rawfile.c:462
 #: modules/process/convolution_filter.c:275
 msgid "Presets"
 msgstr "Préréglages"
 
-#: modules/file/imgexport.c:5576
+#: modules/file/imgexport.c:5525
 #, c-format
 msgid "Cairo error occurred: %s"
 msgstr "Une erreur s'est produite dans Cairo : %s"
 
-#: modules/file/imgexport.c:5600
+#: modules/file/imgexport.c:5549
 #, c-format
 msgid "Pixbuf save failed: %s."
 msgstr "La sauvegarde de l'image à échoué : %s."
 
-#: modules/file/imgexport.c:5878
+#: modules/file/imgexport.c:5827
 msgid "Image is too large to be stored as TARGA."
 msgstr "L'image est trop grande pour être enregistrée au format TARGA"
 
-#: modules/file/imgexport.c:6457 modules/file/imgexport.c:6486
+#: modules/file/imgexport.c:6406 modules/file/imgexport.c:6435
 msgid "Draw _numbers"
 msgstr "Dessiner les _nombres"
 
-#: modules/file/imgexport.c:6469 modules/file/imgexport.c:6517
+#: modules/file/imgexport.c:6418 modules/file/imgexport.c:6466
 msgid "_End marker length:"
 msgstr "Longu_eur du marqueur de fin :"
 
-#: modules/file/imgexport.c:6498
+#: modules/file/imgexport.c:6447
 msgid "Marker _radius:"
 msgstr "_Rayon du marqueur :"
 
@@ -4657,52 +4803,63 @@ msgstr "L'ensemble des paramètres de balise est incomplet."
 msgid "image depth"
 msgstr "profondeur d'image"
 
-#: modules/file/iso28600.c:534
+#: modules/file/iso28600.c:543
 msgid "Imports and exports ISO 28600:2011 SPM data transfer format."
 msgstr ""
 "Importe et exporte les fichiers de transfert de données SPM au format ISO "
 "28600:2011."
 
-#: modules/file/iso28600.c:550
+#: modules/file/iso28600.c:559
 msgid "ISO 28600:2011 SPM data transfer files (.spm)"
 msgstr "ISO 28600:2011 SPM (.spm)"
 
-#: modules/file/iso28600.c:606
+#: modules/file/iso28600.c:658
 #, c-format
-msgid "Only regular mappings are implemented but file has mapping type ‘%s’."
+msgid ""
+"Only regular and irregular mappings are implemented but the file has mapping "
+"type ‘%s’."
 msgstr ""
-"Seuls les cartographies régulières sont implémentées alors que le fichier a "
-"une cartographie de type ‘%s’."
+"Seuls les maillages réguliers et irréguliers sont implémentés mais le "
+"fichier a le type de maillage ‘%s’."
 
-#: modules/file/iso28600.c:668 modules/file/iso28600.c:677
-#: modules/file/iso28600.c:686
+#: modules/file/iso28600.c:687 modules/file/iso28600.c:696
+#: modules/file/iso28600.c:705
 #, c-format
 msgid "List ‘%s’ has %u items which differs from the number %u given by ‘%s’."
 msgstr ""
 "La liste ‘%s’ contient %u éléments, ce qui est différent du nombre %u donnée "
 "par ‘%s’."
 
-#: modules/file/iso28600.c:755 modules/file/iso28600.c:867
-#: modules/file/sdfile.c:846 modules/file/sdfile.c:863
-#: modules/file/spip-asc.c:239 modules/file/witec-asc.c:223
-#: modules/file/wsffile.c:215
+#: modules/file/iso28600.c:775
+#, c-format
+msgid "End of file reached when reading sample #%u of %u"
+msgstr "Fin du fichier atteinte lors de la lecture de l'échantillon #%u sur %u"
+
+#: modules/file/iso28600.c:784 modules/file/iso28600.c:873
+#, c-format
+msgid "Malformed data encountered when reading sample #%u"
+msgstr "Données mal mises en forme lors de la lecture de l'échantillon #%u"
+
+#: modules/file/iso28600.c:797 modules/file/iso28600.c:887
+#: modules/file/iso28600.c:1022
+msgid "Missing end-of-data marker."
+msgstr "Marqueur de fin de données manquant."
+
+#: modules/file/iso28600.c:1003 modules/file/sdfile.c:846
+#: modules/file/sdfile.c:863 modules/file/spip-asc.c:239
+#: modules/file/witec-asc.c:223 modules/file/wsffile.c:215
 #, c-format
 msgid "End of file reached when reading sample #%d of %d"
 msgstr "Fin du fichier atteinte lors de la lecture de l'échantillon #%d sur %d"
 
-#: modules/file/iso28600.c:764 modules/file/iso28600.c:876
-#: modules/file/spip-asc.c:246 modules/file/witec-asc.c:230
-#: modules/file/wsffile.c:222
+#: modules/file/iso28600.c:1012 modules/file/spip-asc.c:246
+#: modules/file/witec-asc.c:230 modules/file/wsffile.c:222
 #, c-format
 msgid "Malformed data encountered when reading sample #%d of %d"
 msgstr ""
 "Données mal mises en forme lors de la lecture de l'échantillon #%d de %d"
 
-#: modules/file/iso28600.c:774 modules/file/iso28600.c:886
-msgid "Missing end-of-data marker."
-msgstr "Marqueur de fin de données manquant."
-
-#: modules/file/iso28600.c:1048
+#: modules/file/iso28600.c:1184
 #, c-format
 msgid "Line %u does not contain mandatory label ‘%s’."
 msgstr "La ligne %u ne contient le label obligatoire ‘%s’."
@@ -4721,44 +4878,62 @@ msgstr ""
 "Le type de données n'est pas connu. Faites en part aux développeurs s'il "
 "vous plaît."
 
-#: modules/file/jpkscan.c:229
+#: modules/file/jpkscan.c:292
 msgid "Imports JPK image scans."
 msgstr "Importe les images de scan JPK."
 
-#: modules/file/jpkscan.c:242
+#: modules/file/jpkscan.c:305
 msgid "JPK image scans (.jpk, .jpk-qi-image)"
 msgstr "Scan JPK (.jpk)"
 
-#: modules/file/jpkscan.c:249
+#: modules/file/jpkscan.c:312
 msgid "JPK force curves (.jpk-force, .jpk-force-map, .jpk-qi-data)"
 msgstr "Courbes de force JPK (.jpk-force, .jpk-force-map, .jpk-qi-data)"
 
-#: modules/file/jpkscan.c:315
+#: modules/file/jpkscan.c:378
 msgid "File does not contain grid dimensions."
 msgstr "Le fichier ne contient pas les dimensions de la grille."
 
-#: modules/file/jpkscan.c:660 modules/file/nanoobserver.c:193
+#: modules/file/jpkscan.c:736 modules/file/nanoobserver.c:360
 #: modules/file/nanoscantech.c:205 modules/file/opengps.c:209
 #: modules/file/sensofarx.c:183 modules/file/spmxfile.c:166
 msgid "Minizip cannot open the file as a ZIP file."
 msgstr "Minizip n'arrive pas à ouvrir le fichier en tant que fichier ZIP."
 
-#: modules/file/jpkscan.c:739
+#: modules/file/jpkscan.c:758 modules/file/jpkscan.c:2717
+#, c-format
+msgid "Scanning file (%u curves)..."
+msgstr "Scan du fichier (%u des courbes)..."
+
+#: modules/file/jpkscan.c:798 modules/file/nmmxyz.c:299
+msgid "Reading files..."
+msgstr "Lecture des fichiers..."
+
+#: modules/file/jpkscan.c:816
+msgid "Creating volume data..."
+msgstr "Création des données volumiques"
+
+#: modules/file/jpkscan.c:968
 msgid "Non-uniform point and/or segment numbering is not supported."
 msgstr ""
 "La numérotation non uniforme des points et/ou des segments n'est pas "
 "supportée."
 
-#: modules/file/jpkscan.c:748
+#: modules/file/jpkscan.c:977
 msgid "Non-uniform channel lists are not supported."
 msgstr "Les listes non uniformes de canaux ne sont pas supportées."
 
-#: modules/file/jpkscan.c:756
+#: modules/file/jpkscan.c:985
 #, c-format
 msgid "Data file %s was found instead of expected %s."
 msgstr "Le fichier %s a été trouvé alors que %s était attendu."
 
-#: modules/file/jpkscan.c:1497
+#: modules/file/jpkscan.c:1900
+#, c-format
+msgid "Header properties file for index %u is missing."
+msgstr "Il manque le fichier d'en-tête pour l'indice %u."
+
+#: modules/file/jpkscan.c:2519
 msgid "Cannot find any height channel."
 msgstr "Impossible de trouver un canal de hauteurs."
 
@@ -4915,19 +5090,19 @@ msgstr "MetroPro (.dat)"
 msgid "File header is larger than file."
 msgstr "L'en-tête de fichier est plus grand que le fichier."
 
-#: modules/file/microprof.c:117
+#: modules/file/microprof.c:125
 msgid "Imports MicroProf FRT profilometer data files."
 msgstr "Importe les fichiers de profilomètre MicroProf FRT."
 
-#: modules/file/microprof.c:130
+#: modules/file/microprof.c:138
 msgid "MicroProf FRT files (.frt)"
 msgstr "MicroProf FRT (.frt)"
 
-#: modules/file/microprof.c:136
+#: modules/file/microprof.c:144
 msgid "MicroProf FRT text files (.txt)"
 msgstr "MicroProf FRT texte (.txt)"
 
-#: modules/file/microprof.c:432
+#: modules/file/microprof.c:519
 msgid "File contains fewer than XSize*YSize data points."
 msgstr "Le fichier contient moins de XSize*YSize points de données."
 
@@ -5017,8 +5192,8 @@ msgstr "Les données de l'image commencent après la fin du fichier."
 msgid "Spectra data starts past the end of file."
 msgstr "Les données du spectre commencent après la fin du fichier."
 
-#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:276
-#: modules/file/renishaw.c:1325 modules/file/sensofar.c:256
+#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:287
+#: modules/file/renishaw.c:1334 modules/file/sensofar.c:256
 #: modules/file/witec-asc.c:161
 msgid "File header is truncated"
 msgstr "L'en-tête de fichier est tronqué."
@@ -5028,8 +5203,8 @@ msgstr "L'en-tête de fichier est tronqué."
 msgid "Parameter header is truncated"
 msgstr "L'en-tête de paramètre est tronqué."
 
-#: modules/file/nanoeducator.c:932 modules/process/curvature.c:454
-#: modules/tools/profile.c:1107
+#: modules/file/nanoeducator.c:932 modules/process/curvature.c:456
+#: modules/tools/profile.c:1090
 #, c-format
 msgid "Profile %d"
 msgstr "Profil %d"
@@ -5114,23 +5289,27 @@ msgstr "La ligne DATA_INFO contient moins de %d champs."
 msgid "Missing data start marker \\x1a\\x04."
 msgstr "Marqueur de début de données \\x1a\\x04 absent."
 
-#: modules/file/nanoobserver.c:113
-msgid "Reads NanoObserver .nao files."
-msgstr "Importe les fichiers NanoObserver (.nao)"
+#: modules/file/nanoobserver.c:201
+msgid "Reads Nano-Solution/NanoObserver .nao files."
+msgstr "Importe les fichiers Nano-Solution / NanoObserver (.nao)"
 
-#: modules/file/nanoobserver.c:126
-msgid "NanoObserver data (.nao)"
-msgstr "NanoObserver (.nao)"
+#: modules/file/nanoobserver.c:214
+msgid "Nano-Solution/NanoObserver data (.nao)"
+msgstr "Nano-Solution / NanoObserver (.nao)"
+
+#: modules/file/nanoobserver.c:410 modules/file/renishaw.c:1420
+msgid "Data block is truncated"
+msgstr "Le bloc de données est tronqué."
 
-#: modules/file/nanoscan.c:188
+#: modules/file/nanoscan.c:191
 msgid "Imports NanoScan XML files."
 msgstr "Importe les fichiers NanoScan XML."
 
-#: modules/file/nanoscan.c:201
+#: modules/file/nanoscan.c:204
 msgid "NanoScan XML files (.xml)"
 msgstr "NanoScan XML (.xml)"
 
-#: modules/file/nanoscan.c:910
+#: modules/file/nanoscan.c:937
 msgid "Wrong size of Base64 encoded data."
 msgstr "Les données codées en base 64 n'ont pas la bonne dimension."
 
@@ -5150,23 +5329,23 @@ msgstr "Importe les fichiers Digital Instruments Nanoscope II."
 msgid "Nanoscope II files"
 msgstr "Nanoscope II"
 
-#: modules/file/nanoscope.c:207
+#: modules/file/nanoscope.c:212
 msgid ""
 "Imports Veeco (Digital Instruments) Nanoscope data files, version 3 or newer."
 msgstr ""
 "Importe les fichiers Veeco (Digital Instruments) Nanoscope, version 3 ou "
 "plus."
 
-#: modules/file/nanoscope.c:221
+#: modules/file/nanoscope.c:226
 msgid "Nanoscope III files"
 msgstr "Nanoscope III"
 
-#: modules/file/nanoscope.c:288
+#: modules/file/nanoscope.c:295
 msgid "File is not a Nanoscope file, or it is a unknown subtype."
 msgstr ""
 "Le fichier n'est pas un fichier Nanoscope, ou est d'un sous-type inconnu."
 
-#: modules/file/nanoscope.c:295
+#: modules/file/nanoscope.c:302
 msgid ""
 "File has been damaged by change of line endings, resulting in corruption of "
 "the binary part of the file.\n"
@@ -5185,16 +5364,16 @@ msgstr ""
 "dans certaines versions de MS Windows, ou tout autre transfert de fichier "
 "qui essaie d'enregistrer en texte indépendamment de la plateforme."
 
-#: modules/file/nanoscope.c:653 modules/file/nanoscope.c:669
+#: modules/file/nanoscope.c:660 modules/file/nanoscope.c:676
 msgid "Cannot parse `Scan size' field."
 msgstr "Impossible d'analyser le champ `Scan size'."
 
-#: modules/file/nanoscope.c:1539 modules/file/nrrdfile.c:1086
+#: modules/file/nanoscope.c:1546 modules/file/nrrdfile.c:1086
 #, c-format
 msgid "Garbage after data sample #%u."
 msgstr "Données erronées après l'échantillon #%u."
 
-#: modules/file/nanoscope.c:1595
+#: modules/file/nanoscope.c:1602
 msgid "Truncated header line."
 msgstr "Ligne d'en-tête tronquée."
 
@@ -5275,11 +5454,8 @@ msgstr ""
 "L'import des données Nano Measuring Machine doit être fait de manière "
 "interactive."
 
-#: modules/file/nmmxyz.c:299
-msgid "Reading files..."
-msgstr "Lecture des fichiers..."
-
 #: modules/file/nmmxyz.c:306 modules/process/lat_synth.c:1224
+#: modules/process/wave_synth.c:798
 msgid "Rendering surface..."
 msgstr "Calcul de la surface..."
 
@@ -5312,20 +5488,20 @@ msgid "Plot point density map"
 msgstr "Afficher la carte de densité des points"
 
 #: modules/file/nmmxyz.c:534 modules/file/rawfile.c:626
-#: modules/process/dimensions.h:445 modules/xyz/xyz_drift.c:725
-#: modules/xyz/xyz_raster.c:517
+#: modules/process/dimensions.h:427 modules/xyz/xyz_drift.c:725
+#: modules/xyz/xyz_raster.c:376
 msgid "Resolution"
 msgstr "Résolution"
 
 #: modules/file/nmmxyz.c:538 modules/file/rawfile.c:631
-#: modules/process/dimensions.h:451 modules/xyz/xyz_drift.c:729
-#: modules/xyz/xyz_raster.c:521
+#: modules/process/dimensions.h:433 modules/xyz/xyz_drift.c:729
+#: modules/xyz/xyz_raster.c:382
 msgid "_Horizontal size:"
 msgstr "Taille _horizontale :"
 
 #: modules/file/nmmxyz.c:554 modules/file/rawfile.c:638
-#: modules/process/dimensions.h:454 modules/xyz/xyz_drift.c:744
-#: modules/xyz/xyz_raster.c:536
+#: modules/process/dimensions.h:436 modules/xyz/xyz_drift.c:744
+#: modules/xyz/xyz_raster.c:388
 msgid "_Vertical size:"
 msgstr "Taille _verticale :"
 
@@ -5424,38 +5600,38 @@ msgstr "Le champ d'en-tête d'axe %s contient trop d'éléments."
 msgid "Per-axis header field %s contains too few items."
 msgstr "Le champ d'en-tête d'axe %s ne contient pas assez d'éléments."
 
-#: modules/file/nt-mdt.c:843
+#: modules/file/nt-mdt.c:850
 msgid "Imports NT-MDT data files."
 msgstr "Importe les fichiers NT-MDT."
 
-#: modules/file/nt-mdt.c:856
+#: modules/file/nt-mdt.c:863
 msgid "NT-MDT files (.mdt)"
 msgstr "NT-MDT (.mdt)"
 
-#: modules/file/nt-mdt.c:1491 modules/file/nt-mdt.c:1599
+#: modules/file/nt-mdt.c:1498 modules/file/nt-mdt.c:1606
 msgid "Frame is too short for Frame Mode."
 msgstr "la trame est trop courte pour le mode trame."
 
-#: modules/file/nt-mdt.c:1506 modules/file/nt-mdt.c:1614
+#: modules/file/nt-mdt.c:1513 modules/file/nt-mdt.c:1621
 msgid "Frame is too short for dots or data."
 msgstr "la trame est trop courte pour des points ou des données."
 
-#: modules/file/nt-mdt.c:1869
+#: modules/file/nt-mdt.c:1879
 #, c-format
 msgid "End of file reached in frame header #%u."
 msgstr "Fin du fichier atteinte dans l'en-tête #%u."
 
-#: modules/file/nt-mdt.c:1877
+#: modules/file/nt-mdt.c:1887
 #, c-format
 msgid "End of file reached in frame data #%u."
 msgstr "Fin du fichier atteinte dans les données #%u."
 
-#: modules/file/nt-mdt.c:1910
+#: modules/file/nt-mdt.c:1920
 #, c-format
 msgid "Frame #%u is too short for scanned data header."
 msgstr "La trame #%u est trop courte pour l'en-tête des données scannées."
 
-#: modules/file/nt-mdt.c:1927
+#: modules/file/nt-mdt.c:1937
 #, c-format
 msgid "Frame #%u is too short for spectroscopy data header."
 msgstr ""
@@ -5575,28 +5751,28 @@ msgstr "Omicron MATRIX (param.mtrx & data.mtrx)"
 msgid "Omicron MATRIX (.mtrx & .mtrx)"
 msgstr "Omicron MATRIX (.mtrx & .mtrx)"
 
-#: modules/file/opdfile.c:188
+#: modules/file/opdfile.c:199
 msgid "Imports Wyko OPD and ASC files."
 msgstr "Importe les fichiers Wyko OPD et ASC."
 
-#: modules/file/opdfile.c:201
+#: modules/file/opdfile.c:212
 msgid "Wyko OPD files (.opd)"
 msgstr "Wyko OPD (.opd)"
 
-#: modules/file/opdfile.c:208
+#: modules/file/opdfile.c:219
 msgid "Wyko ASCII export files (.asc)"
 msgstr "Wyko ASCII (.asc)"
 
-#: modules/file/opdfile.c:299
+#: modules/file/opdfile.c:310
 #, c-format
 msgid "Item `%s' is beyond the end of the file."
 msgstr "L'élément `%s' est au-delà de la fin du fichier."
 
-#: modules/file/opdfile.c:614
+#: modules/file/opdfile.c:636
 msgid "Nested directories found"
 msgstr "Des dossiers emboîtés ont été trouvés"
 
-#: modules/file/opdfile.c:805
+#: modules/file/opdfile.c:842
 #, c-format
 msgid "Truncated data in block %s"
 msgstr "Données tronquées dans le bloc %s"
@@ -5902,19 +6078,21 @@ msgstr "Format de données"
 
 #: modules/file/rawfile.c:567 modules/process/arithmetic.c:234
 #: modules/process/calcoefs_view.c:320 modules/process/coerce.c:250
-#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:637
+#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:638
 #: modules/process/drift.c:242 modules/process/edge.c:635
-#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:183
-#: modules/process/grain_edge.c:210 modules/process/grain_filter.c:313
-#: modules/process/grain_mark.c:244 modules/process/grain_wshed.c:164
-#: modules/process/mark_disconn.c:205 modules/process/mark_with.c:195
-#: modules/process/polydistort.c:205 modules/process/scars.c:295
-#: modules/process/slope_dist.c:273 modules/process/straighten_path.c:198
-#: modules/process/synth.h:509 modules/process/tip_model.c:166
+#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:184
+#: modules/process/fractal.c:225 modules/process/grain_edge.c:209
+#: modules/process/grain_filter.c:312 modules/process/grain_mark.c:243
+#: modules/process/grain_wshed.c:165 modules/process/mark_disconn.c:205
+#: modules/process/mark_with.c:196 modules/process/mfm_field.c:278
+#: modules/process/mfm_shift.c:167 modules/process/polydistort.c:205
+#: modules/process/scars.c:314 modules/process/slope_dist.c:272
+#: modules/process/stitch.c:272 modules/process/straighten_path.c:198
+#: modules/process/synth.h:538 modules/process/tip_model.c:164
 #: modules/process/wpour_mark.c:273 modules/tools/linestats.c:454
-#: modules/tools/sfunctions.c:534 modules/tools/stats.c:459
-#: modules/volume/volume_extract.c:328 modules/volume/volume_linestat.c:287
-#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:443
+#: modules/tools/sfunctions.c:531 modules/tools/stats.c:456
+#: modules/volume/volume_extract.c:321 modules/volume/volume_linestat.c:292
+#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:457
 msgid "_Update"
 msgstr "Mise à jour"
 
@@ -6063,7 +6241,7 @@ msgstr ""
 "<b>L'analyse du contenu à échoué</b>\n"
 "Le contenu de `%s' ne correspond pas au format : %s."
 
-#: modules/file/rawfile.c:1690 modules/process/neural.c:1580
+#: modules/file/rawfile.c:1690 modules/process/neural.c:1587
 #, c-format
 msgid "The name `%s' is invalid."
 msgstr "Le nom `%s' est invalide."
@@ -6166,7 +6344,8 @@ msgstr "Fichiers de points XYZ"
 msgid "Import XYZ Data"
 msgstr "Importer des données XYZ"
 
-#: modules/file/rawxyz.c:279
+#: modules/file/rawxyz.c:279 modules/graph/graph_stats.c:305
+#: modules/graph/graph_stats.c:756 modules/graph/graph_stats.c:800
 msgid "Number of points:"
 msgstr "Nombre de points :"
 
@@ -6186,7 +6365,7 @@ msgstr "Plage Z :"
 msgid "_Lateral units:"
 msgstr "Unités _latérales :"
 
-#: modules/file/rawxyz.c:386 modules/process/dimensions.h:494
+#: modules/file/rawxyz.c:386 modules/process/dimensions.h:479
 msgid "_Value units:"
 msgstr "Unités de valeur :"
 
@@ -6202,18 +6381,14 @@ msgstr "Renishaw WiRE (.wdf)"
 msgid "MapArea block is truncated"
 msgstr "Le bloc MapArea est tronqué"
 
-#: modules/file/renishaw.c:787
+#: modules/file/renishaw.c:793
 msgid "Random points order unsupported"
 msgstr "Les points donnés dans un ordre aléatoire ne sont pas supportés."
 
-#: modules/file/renishaw.c:1396
+#: modules/file/renishaw.c:1405
 msgid "Block header is truncated"
 msgstr "Le bloc d'en-tête est tronqué."
 
-#: modules/file/renishaw.c:1411
-msgid "Data block is truncated"
-msgstr "Le bloc de données est tronqué."
-
 #: modules/file/rhk-sm3.c:236
 msgid "Imports RHK Technology SM3 data files."
 msgstr "Importe les fichiers RHK Technology SM3."
@@ -6475,19 +6650,23 @@ msgstr "Charge les fichiers SPML (Scanning Probe Microscopy Markup Language)."
 msgid "SPML files (.xml)"
 msgstr "SPML (.xml)"
 
-#: modules/file/spmlab.c:131
+#: modules/file/spmlab.c:175
 msgid "Imports Thermicroscopes SpmLab R3 to R7 data files."
 msgstr "Importe les fichiers Thermicroscopes SpmLab R3 à R7."
 
-#: modules/file/spmlab.c:144
+#: modules/file/spmlab.c:188
 msgid "Thermicroscopes SpmLab files"
 msgstr "Thermicroscopes SpmLab"
 
-#: modules/file/spmlab.c:231
+#: modules/file/spmlab.c:259
 #, c-format
 msgid "Unknown format version %c."
 msgstr "Version de format %c inconnue."
 
+#: modules/file/spmlab.c:283
+msgid "Data block is truncated."
+msgstr "Le bloc de données est tronqué."
+
 #: modules/file/spmlabf.c:79
 msgid "Imports SPMLab floating-point files."
 msgstr "Importe les fichiers SPMLab à virgule flottante."
@@ -6685,11 +6864,11 @@ msgstr "Importe les fichiers WinSTM (.stm)."
 msgid "WinSTM files (.stm)"
 msgstr "WinSTM (.stm)"
 
-#: modules/file/wipfile.c:272
+#: modules/file/wipfile.c:281
 msgid "Imports WItec Project data files."
 msgstr "Importe les fichiers WITec Project."
 
-#: modules/file/wipfile.c:285
+#: modules/file/wipfile.c:294
 msgid "WItec Project files (.wip)"
 msgstr "WITec Project (.wip)"
 
@@ -6750,21 +6929,21 @@ msgstr "Exporte les coordonnées XYZ au format texte."
 msgid "XYZ text data (.xyz)"
 msgstr "Données texte XYZ (.xyz)"
 
-#: modules/file/xyzexport.c:244
+#: modules/file/xyzexport.c:247
 msgid "Lateral units:"
 msgstr "Unités latérales :"
 
-#: modules/file/xyzexport.c:290
+#: modules/file/xyzexport.c:293
 msgid "Export XYZ"
 msgstr "Exporter au format XYZ"
 
-#: modules/file/xyzexport.c:340 modules/process/curvature.c:704
+#: modules/file/xyzexport.c:343 modules/process/curvature.c:700
 #: modules/process/entropy.c:214 modules/process/facet-level.c:207
-#: modules/process/fit-shape.c:743 modules/process/level.c:259
-#: modules/process/linematch.c:906 modules/process/neural.c:593
-#: modules/process/polylevel.c:491 modules/process/slope_dist.c:418
-#: modules/tools/filter.c:300 modules/tools/linestats.c:436
-#: modules/tools/profile.c:591 modules/tools/sfunctions.c:516
+#: modules/process/fit-shape.c:755 modules/process/level.c:259
+#: modules/process/linematch.c:869 modules/process/neural.c:597
+#: modules/process/polylevel.c:494 modules/process/slope_dist.c:411
+#: modules/tools/filter.c:301 modules/tools/linestats.c:436
+#: modules/tools/profile.c:572 modules/tools/sfunctions.c:513
 #: modules/tools/stats.c:389
 msgid "Masking Mode"
 msgstr "Utilisation du masque"
@@ -6775,7 +6954,15 @@ msgstr "Importe les fichiers Carl Zeiss SEM."
 
 #: modules/file/zeiss.c:74
 msgid "Carl Zeiss SEM scans (.tif)"
-msgstr "Scan Carl Zeiss SEM (.tif)"
+msgstr "Carl Zeiss SEM (.tif)"
+
+#: modules/file/zeisslsm.c:383
+msgid "Imports Carl Zeiss CLSM images."
+msgstr "Importe les fichiers Carl Zeiss CLSM."
+
+#: modules/file/zeisslsm.c:396
+msgid "Carl Zeiss CLSM images (.lsm)"
+msgstr "Carl Zeiss CLSM (.lsm)"
 
 #: modules/file/zemax.c:72
 msgid "Imports Zemax grid sag data files."
@@ -6799,15 +6986,15 @@ msgstr "Le code d'unité %d est invalide ou n'est pas supporté."
 msgid "The first line contains too many items."
 msgstr "La première ligne contient trop d'éléments."
 
-#: modules/graph/graph_align.c:57
+#: modules/graph/graph_align.c:60
 msgid "Aligns graph curves."
 msgstr "Aligne les courbes."
 
-#: modules/graph/graph_align.c:71
+#: modules/graph/graph_align.c:74
 msgid "/_Align"
 msgstr "/_Aligner"
 
-#: modules/graph/graph_align.c:74
+#: modules/graph/graph_align.c:77
 msgid "Align curves"
 msgstr "Aligner les courbes"
 
@@ -6823,48 +7010,50 @@ msgstr "/Dimension _critique..."
 msgid "Fit critical dimension"
 msgstr "Ajuster la dimension critique"
 
-#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:267
+#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:270
 msgid "Fit Graph"
 msgstr "Ajuster le graphe"
 
-#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:251
-#: modules/graph/graph_fit.c:270 modules/process/fit-shape.c:393
+#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:254
+#: modules/graph/graph_fit.c:273 modules/process/fit-shape.c:394
 #: modules/volume/volume_fdfit.c:299
 msgid "verb|_Fit"
 msgstr "Ajuster"
 
-#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:166
-#: modules/graph/graph_fdfit.c:306 modules/graph/graph_fit.c:325
-#: modules/graph/graph_peaks.c:199
+#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:168
+#: modules/graph/graph_fdfit.c:313 modules/graph/graph_fit.c:332
+#: modules/graph/graph_peaks.c:199 modules/graph/graph_stats.c:268
 msgid "_Graph curve:"
 msgstr "_Graphe :"
 
-#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:320
-#: modules/graph/graph_fit.c:339 modules/volume/volume_fdfit.c:405
+#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:327
+#: modules/graph/graph_fit.c:346 modules/volume/volume_fdfit.c:389
 msgid "F_unction:"
 msgstr "Fonction :"
 
-#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:361
-#: modules/graph/graph_fit.c:375 modules/process/curvature.c:745
-#: modules/process/fit-shape.c:792 modules/volume/volume_fdfit.c:446
+#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:368
+#: modules/graph/graph_fit.c:382 modules/process/curvature.c:742
+#: modules/process/fit-shape.c:804 modules/volume/volume_fdfit.c:422
 msgid "Parameter"
 msgstr "Paramètre"
 
-#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:363
-#: modules/graph/graph_fit.c:377 modules/process/fit-shape.c:794
-#: modules/volume/volume_fdfit.c:448
+#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:370
+#: modules/graph/graph_fit.c:384 modules/process/fit-shape.c:806
+#: modules/volume/volume_fdfit.c:424
 msgid "Error"
 msgstr "Erreur"
 
-#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:196
-#: modules/graph/graph_fdfit.c:415 modules/graph/graph_fit.c:433
-#: modules/volume/volume_fdfit.c:500 modules/volume/volume_linestat.c:389
+#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:189
+#: modules/graph/graph_fdfit.c:422 modules/graph/graph_fit.c:440
+#: modules/graph/graph_stats.c:279 modules/graph/graph_stats.c:793
+#: modules/volume/volume_fdfit.c:476 modules/volume/volume_linestat.c:394
 msgid "Range:"
 msgstr "Plage :"
 
-#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:207
-#: modules/graph/graph_fdfit.c:426 modules/graph/graph_fit.c:444
-#: modules/volume/volume_fdfit.c:511 modules/volume/volume_linestat.c:400
+#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:200
+#: modules/graph/graph_fdfit.c:433 modules/graph/graph_fit.c:451
+#: modules/graph/graph_stats.c:290 modules/graph/graph_stats.c:796
+#: modules/volume/volume_fdfit.c:487 modules/volume/volume_linestat.c:405
 msgid "range|to"
 msgstr "jusqu'à"
 
@@ -6872,92 +7061,92 @@ msgstr "jusqu'à"
 msgid "_Draw whole circle"
 msgstr "_Dessiner un cercle entier"
 
-#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:491
-#: modules/graph/graph_fit.c:531 modules/process/fit-shape.c:522
-#: modules/volume/volume_fdfit.c:573
+#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:498
+#: modules/graph/graph_fit.c:538 modules/process/fit-shape.c:523
+#: modules/volume/volume_fdfit.c:549
 msgid "Save Fit Report"
-msgstr "Sauver le rapport d'ajustement"
+msgstr "Enregistrer le rapport d'ajustement"
 
 #: modules/graph/graph_cd.c:529 modules/graph/graph_cd.c:1107
-#: modules/graph/graph_fdfit.c:709 modules/graph/graph_fit.c:763
-#: modules/volume/volume_fdfit.c:907
+#: modules/graph/graph_fdfit.c:725 modules/graph/graph_fit.c:779
+#: modules/volume/volume_fdfit.c:883
 msgid "Fit"
 msgstr "Ajustement"
 
-#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:749
-#: modules/graph/graph_fit.c:803 modules/volume/volume_fdfit.c:978
-#: modules/volume/volume_fdfit.c:1085
+#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:765
+#: modules/graph/graph_fit.c:819 modules/volume/volume_fdfit.c:954
+#: modules/volume/volume_fdfit.c:1061
 msgid "It is necessary to select more data points than free fit parameters"
 msgstr "Il faut sélectionner plus de points que de paramètres d'ajustement"
 
-#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:798
-#: modules/graph/graph_fit.c:852 modules/process/entropy.c:554
-#: modules/tools/grainmeasure.c:217 modules/tools/readvalue.c:634
-#: modules/tools/readvalue.c:635 modules/tools/readvalue.c:636
-#: modules/tools/readvalue.c:637 modules/tools/roughness.c:975
-#: modules/tools/stats.c:727 modules/tools/stats.c:740
-#: modules/tools/stats.c:741 modules/volume/volume_fdfit.c:1134
-#: modules/xyz/xyz_drift.c:1099 modules/xyz/xyz_drift.c:1117
-#: modules/xyz/xyz_drift.c:1134
+#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:814
+#: modules/graph/graph_fit.c:868 modules/graph/graph_stats.c:663
+#: modules/process/entropy.c:555 modules/tools/grainmeasure.c:217
+#: modules/tools/readvalue.c:634 modules/tools/readvalue.c:635
+#: modules/tools/readvalue.c:636 modules/tools/readvalue.c:637
+#: modules/tools/roughness.c:984 modules/tools/stats.c:723
+#: modules/tools/stats.c:736 modules/tools/stats.c:737
+#: modules/volume/volume_fdfit.c:1110 modules/xyz/xyz_drift.c:1099
+#: modules/xyz/xyz_drift.c:1117 modules/xyz/xyz_drift.c:1134
 msgid "N.A."
 msgstr "N. A."
 
-#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1363
-#: modules/graph/graph_fit.c:1500 modules/process/fit-shape.c:2078
-#: modules/volume/volume_fdfit.c:1720
+#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1381
+#: modules/graph/graph_fit.c:1518 modules/process/fit-shape.c:2060
+#: modules/volume/volume_fdfit.c:1696
 msgid "===== Fit Results ====="
 msgstr "===== Résultats de l'ajustement ====="
 
-#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1367
-#: modules/graph/graph_fit.c:1504 modules/process/fit-shape.c:2080
-#: modules/volume/volume_fdfit.c:1724
+#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1385
+#: modules/graph/graph_fit.c:1522 modules/process/fit-shape.c:2062
+#: modules/volume/volume_fdfit.c:1700
 #, c-format
 msgid "Data:             %s\n"
 msgstr "Données :             %s\n"
 
-#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1370
-#: modules/graph/graph_fit.c:1507 modules/process/fit-shape.c:2082
-#: modules/volume/volume_fdfit.c:1727
+#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1388
+#: modules/graph/graph_fit.c:1525 modules/process/fit-shape.c:2064
+#: modules/volume/volume_fdfit.c:1703
 #, c-format
 msgid "Number of points: %d of %d\n"
 msgstr "Nombre de points : %d sur %d\n"
 
-#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1374
-#: modules/graph/graph_fit.c:1511 modules/volume/volume_fdfit.c:1731
+#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1392
+#: modules/graph/graph_fit.c:1529 modules/volume/volume_fdfit.c:1707
 #, c-format
 msgid "X range:          %.*f to %.*f %s\n"
 msgstr "Plage X :          %.*f jusqu'à %.*f %s\n"
 
-#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1380
-#: modules/graph/graph_fit.c:1517 modules/process/fit-shape.c:2084
-#: modules/volume/volume_fdfit.c:1737
+#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1398
+#: modules/graph/graph_fit.c:1535 modules/process/fit-shape.c:2066
+#: modules/volume/volume_fdfit.c:1713
 #, c-format
 msgid "Fitted function:  %s\n"
 msgstr "Fonction ajustée :  %s\n"
 
-#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1383
-#: modules/graph/graph_fit.c:1520 modules/process/fit-shape.c:2087
-#: modules/volume/volume_fdfit.c:1740
+#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1401
+#: modules/graph/graph_fit.c:1538 modules/process/fit-shape.c:2069
+#: modules/volume/volume_fdfit.c:1716
 msgid "Results\n"
 msgstr "Résultats\n"
 
-#: modules/graph/graph_cut.c:88
+#: modules/graph/graph_cut.c:87
 msgid "Cut graph"
 msgstr "Couper le graphe"
 
-#: modules/graph/graph_cut.c:102
+#: modules/graph/graph_cut.c:101
 msgid "/_Cut..."
 msgstr "/_Couper..."
 
-#: modules/graph/graph_cut.c:105
+#: modules/graph/graph_cut.c:104
 msgid "Extract part of graph into new one"
 msgstr "Extraire la partie du graphe en nouveau graphe"
 
-#: modules/graph/graph_cut.c:146
+#: modules/graph/graph_cut.c:145
 msgid "Cut Graph"
 msgstr "Couper le graphe"
 
-#: modules/graph/graph_cut.c:180
+#: modules/graph/graph_cut.c:173
 msgid "Cut _all curves"
 msgstr "Couper toute les courbes"
 
@@ -7055,97 +7244,97 @@ msgstr "Exporter le graphe sous forme d' image"
 msgid "Export to PNG"
 msgstr "Exporter en PNG"
 
-#: modules/graph/graph_export_vector.c:35
+#: modules/graph/graph_export_vector.c:36
 msgid "Exports graphs to PostScript"
 msgstr "Exporte les graphes au format PostScript"
 
-#: modules/graph/graph_export_vector.c:49
+#: modules/graph/graph_export_vector.c:50
 msgid "/Export _PostScript"
 msgstr "/Exporter en _PostScript"
 
-#: modules/graph/graph_export_vector.c:52
+#: modules/graph/graph_export_vector.c:53
 msgid "Export graph to PostScript"
 msgstr "Exporter le graphe au format PostScript"
 
-#: modules/graph/graph_export_vector.c:65
+#: modules/graph/graph_export_vector.c:66
 msgid "Export to PostScript"
 msgstr "Exporter en PostScript"
 
-#: modules/graph/graph_fdfit.c:168
+#: modules/graph/graph_fdfit.c:169
 msgid "Fit force-distance data"
 msgstr "Ajuster les données force-distance"
 
-#: modules/graph/graph_fdfit.c:182
+#: modules/graph/graph_fdfit.c:183
 msgid "/_Fit FD Curve..."
 msgstr "/Ajuster la courbe _force-distance..."
 
-#: modules/graph/graph_fdfit.c:185
+#: modules/graph/graph_fdfit.c:186
 msgid "Fit a force-distance curve"
 msgstr "Ajuster une courbe force-distance"
 
-#: modules/graph/graph_fdfit.c:248 modules/volume/volume_fdfit.c:296
+#: modules/graph/graph_fdfit.c:251 modules/volume/volume_fdfit.c:296
 msgid "Fit FD Curve"
 msgstr "Ajuster la courbe FD"
 
-#: modules/graph/graph_fdfit.c:255 modules/graph/graph_fit.c:274
-#: modules/process/fit-shape.c:397 modules/process/measure_lattice.c:257
-#: modules/volume/volume_fdfit.c:303
+#: modules/graph/graph_fdfit.c:258 modules/graph/graph_fit.c:277
+#: modules/process/correct_affine.c:347 modules/process/fit-shape.c:398
+#: modules/process/measure_lattice.c:247 modules/volume/volume_fdfit.c:303
 msgid "verb|_Estimate"
 msgstr "_Estimer"
 
-#: modules/graph/graph_fdfit.c:257 modules/graph/graph_fit.c:276
-#: modules/volume/volume_fdfit.c:305
+#: modules/graph/graph_fdfit.c:260 modules/graph/graph_fit.c:279
+#: modules/process/psf.c:239 modules/volume/volume_fdfit.c:305
 msgid "_Plot Inits"
 msgstr "Initialiser"
 
-#: modules/graph/graph_fdfit.c:359 modules/graph/graph_fit.c:373
-#: modules/process/fit-shape.c:790 modules/volume/volume_fdfit.c:444
+#: modules/graph/graph_fdfit.c:366 modules/graph/graph_fit.c:380
+#: modules/process/fit-shape.c:802 modules/volume/volume_fdfit.c:420
 msgid "Fix"
 msgstr "Fixe"
 
-#: modules/graph/graph_fdfit.c:365 modules/graph/graph_fit.c:379
-#: modules/volume/volume_fdfit.c:450
+#: modules/graph/graph_fdfit.c:372 modules/graph/graph_fit.c:386
+#: modules/volume/volume_fdfit.c:426
 msgid "Initial"
 msgstr "Initial"
 
-#: modules/graph/graph_fdfit.c:376 modules/graph/graph_fit.c:394
-#: modules/volume/volume_fdfit.c:461
+#: modules/graph/graph_fdfit.c:383 modules/graph/graph_fit.c:401
+#: modules/volume/volume_fdfit.c:437
 msgid "χ<sup>2</sup> result:"
 msgstr "Résultat χ<sup>2</sup> :"
 
-#: modules/graph/graph_fdfit.c:392 modules/graph/graph_fit.c:410
-#: modules/process/fit-shape.c:469 modules/process/fit-shape.c:2134
-#: modules/volume/volume_fdfit.c:477
+#: modules/graph/graph_fdfit.c:399 modules/graph/graph_fit.c:417
+#: modules/process/fit-shape.c:470 modules/process/fit-shape.c:2116
+#: modules/volume/volume_fdfit.c:453
 msgid "Correlation Matrix"
 msgstr "Matrice de corrélation"
 
-#: modules/graph/graph_fdfit.c:447 modules/graph/graph_fit.c:485
-#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:532
+#: modules/graph/graph_fdfit.c:454 modules/graph/graph_fit.c:492
+#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:508
 msgid "Instant:"
 msgstr "Affichage immédiat :"
 
-#: modules/graph/graph_fdfit.c:450 modules/graph/graph_fit.c:488
+#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
 msgid "esti_mate"
 msgstr "e_stimer"
 
-#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
-#: modules/volume/volume_fdfit.c:542
+#: modules/graph/graph_fdfit.c:464 modules/graph/graph_fit.c:502
+#: modules/volume/volume_fdfit.c:518
 msgid "p_lot"
 msgstr "graphe"
 
-#: modules/graph/graph_fdfit.c:708 modules/graph/graph_fit.c:762
-#: modules/volume/volume_fdfit.c:906
+#: modules/graph/graph_fdfit.c:724 modules/graph/graph_fit.c:778
+#: modules/volume/volume_fdfit.c:882
 msgid "Estimate"
 msgstr "Estimation"
 
-#: modules/graph/graph_fdfit.c:1410 modules/graph/graph_fit.c:1547
-#: modules/volume/volume_fdfit.c:1768
+#: modules/graph/graph_fdfit.c:1428 modules/graph/graph_fit.c:1565
+#: modules/volume/volume_fdfit.c:1744
 #, c-format
 msgid "Residual sum:   %g\n"
 msgstr "Somme résiduelle :   %g\n"
 
-#: modules/graph/graph_fdfit.c:1413 modules/graph/graph_fit.c:1550
-#: modules/volume/volume_fdfit.c:1771
+#: modules/graph/graph_fdfit.c:1431 modules/graph/graph_fit.c:1568
+#: modules/volume/volume_fdfit.c:1747
 msgid "Correlation matrix\n"
 msgstr "Matrice de corrélation\n"
 
@@ -7161,27 +7350,27 @@ msgstr "/_Filtre"
 msgid "Remove noise from graph curves"
 msgstr "Supprimer le bruit présent dans des courbes"
 
-#: modules/graph/graph_fit.c:181
+#: modules/graph/graph_fit.c:182
 msgid "Fit graph with function"
 msgstr "Ajuster le graphe avec une fonction"
 
-#: modules/graph/graph_fit.c:195
+#: modules/graph/graph_fit.c:196
 msgid "/_Fit Function..."
 msgstr "/_Fonction d'ajustement..."
 
-#: modules/graph/graph_fit.c:198
+#: modules/graph/graph_fit.c:199
 msgid "Fit a function on graph data"
 msgstr "Ajustement d'une fonction sur un graphe"
 
-#: modules/graph/graph_fit.c:386
+#: modules/graph/graph_fit.c:393
 msgid "Copy all fitted values to estimates"
 msgstr "Copier toutes les valeurs ajustées vers les valeurs estimées"
 
-#: modules/graph/graph_fit.c:460
+#: modules/graph/graph_fit.c:467
 msgid "Plot full range"
 msgstr "Afficher la plage complète"
 
-#: modules/graph/graph_fit.c:470
+#: modules/graph/graph_fit.c:477
 msgid "Create a difference graph"
 msgstr "Différence entre l'ajustement et les données"
 
@@ -7266,80 +7455,164 @@ msgstr "/Localisation de _pics..."
 msgid "Find graph curve peaks"
 msgstr "Localisation de pics dans un graphe"
 
-#: modules/graph/graph_peaks.c:157
+#: modules/graph/graph_peaks.c:155
 msgid "Prominence"
 msgstr "Proéminence"
 
-#: modules/graph/graph_peaks.c:161
+#: modules/graph/graph_peaks.c:159
 msgid "Zero"
 msgstr "Zéro"
 
-#: modules/graph/graph_peaks.c:162
+#: modules/graph/graph_peaks.c:160
 msgid "Bilateral minimum"
 msgstr "Minimum bilatéral"
 
-#: modules/graph/graph_peaks.c:178
+#: modules/graph/graph_peaks.c:176
 msgid "Graph Peaks"
 msgstr "Pics du graphe"
 
-#: modules/graph/graph_peaks.c:212
+#: modules/graph/graph_peaks.c:209
 msgid "_Background type:"
 msgstr "Type d'arrière-plan :"
 
-#: modules/graph/graph_peaks.c:227
+#: modules/graph/graph_peaks.c:219
 msgid "Order peaks _by:"
 msgstr "Classer les pics par :"
 
-#: modules/graph/graph_peaks.c:242
+#: modules/graph/graph_peaks.c:225
 msgid "Number of _peaks:"
 msgstr "Nombre de _pics :"
 
-#: modules/graph/graph_peaks.c:263 modules/process/curvature.c:773
-#: modules/process/grain_stat.c:360 modules/process/measure_lattice.c:396
-#: modules/process/polylevel.c:607 modules/tools/distance.c:259
-#: modules/tools/roughness.c:818 modules/tools/stats.c:450
+#: modules/graph/graph_peaks.c:245 modules/graph/graph_stats.c:367
+#: modules/process/curvature.c:770 modules/process/grain_stat.c:360
+#: modules/process/measure_lattice.c:390 modules/process/polylevel.c:610
+#: modules/tools/distance.c:259 modules/tools/roughness.c:819
+#: modules/tools/stats.c:447
 msgid "Save table to a file"
-msgstr "Sauver le tableau"
+msgstr "Enregistrer le tableau"
 
-#: modules/graph/graph_peaks.c:267 modules/process/curvature.c:778
-#: modules/process/grain_stat.c:365 modules/process/measure_lattice.c:400
-#: modules/process/polylevel.c:617 modules/tools/distance.c:264
-#: modules/tools/roughness.c:823 modules/tools/stats.c:455
+#: modules/graph/graph_peaks.c:249 modules/graph/graph_stats.c:371
+#: modules/process/curvature.c:775 modules/process/grain_stat.c:365
+#: modules/process/measure_lattice.c:394 modules/process/polylevel.c:620
+#: modules/tools/distance.c:264 modules/tools/roughness.c:824
+#: modules/tools/stats.c:452
 msgid "Copy table to clipboard"
 msgstr "Copier la table vers le presse-papier"
 
-#: modules/graph/graph_peaks.c:654
+#: modules/graph/graph_peaks.c:618
 msgid "Save Peak Parameters"
 msgstr "Enregistrer les paramètres des pics"
 
-#: modules/layer/axis.c:143
-msgid "Layer allowing selection of horizontal or vertical lines."
-msgstr ""
-"Couche permettant de sélectionner des lignes horizontales ou verticales."
-
-#: modules/layer/ellipse.c:143
-msgid "Layer allowing selection of elliptic areas."
-msgstr "Couche permettant de sélectionner des zones elliptiques."
+#: modules/graph/graph_stats.c:148 modules/graph/graph_stats.c:161
+#: modules/tools/stats.c:205
+msgid "Average value:"
+msgstr "Moyenne :"
 
-#: modules/layer/lattice.c:126
-msgid "Layer allowing selection of a two-dimensional lattice."
-msgstr "Couche permettant de sélectionner un réseau bi-dimensionnel."
+#: modules/graph/graph_stats.c:149 modules/tools/stats.c:206
+msgid "Median:"
+msgstr "Médiane :"
 
-#: modules/layer/line.c:177
-msgid "Layer allowing selection of arbitrary straight lines."
-msgstr "Couche permettant de sélectionner des lignes droites."
+#: modules/graph/graph_stats.c:150
+msgid "Ra:"
+msgstr "Ra :"
 
-#: modules/layer/path.c:171
-msgid "Layer allowing selection of a single long curve."
-msgstr "Couche permettant de sélectionner une courbe unique."
+#: modules/graph/graph_stats.c:151
+msgid "Rms (Rq):"
+msgstr "RMS (Rq) :"
 
-#: modules/layer/point.c:169
-msgid ""
-"Layer allowing selection of several points, displayed as crosses or "
-"invisible."
-msgstr ""
-"Couche permettant de sélectionner plusieurs points, sous forme de croix ou "
-"invisibles."
+#: modules/graph/graph_stats.c:152 modules/tools/stats.c:210
+msgid "Skew:"
+msgstr "Asymétrie :"
+
+#: modules/graph/graph_stats.c:153 modules/tools/stats.c:211
+msgid "Kurtosis:"
+msgstr "Kurtosis :"
+
+#: modules/graph/graph_stats.c:158
+msgid "Projected length:"
+msgstr "Longueur projetée :"
+
+#: modules/graph/graph_stats.c:159
+msgid "Developed length:"
+msgstr "Longueur du profil développé :"
+
+#: modules/graph/graph_stats.c:160 modules/tools/stats.c:214
+msgid "Variation:"
+msgstr "Variation :"
+
+#: modules/graph/graph_stats.c:162
+msgid "Area under curve:"
+msgstr "Aire sous la courbe :"
+
+#: modules/graph/graph_stats.c:163
+msgid "Positive area:"
+msgstr "Aire positive :"
+
+#: modules/graph/graph_stats.c:164
+msgid "Negative area:"
+msgstr "Aire négative :"
+
+#: modules/graph/graph_stats.c:165
+msgid "Root mean square:"
+msgstr "Racine quadratique :"
+
+#: modules/graph/graph_stats.c:171
+msgid "Calculates simple graph curve statistics."
+msgstr "Calcule les statistiques de base de courbes."
+
+#: modules/graph/graph_stats.c:185
+msgid "/_Statistics..."
+msgstr "/_Statistiques..."
+
+#: modules/graph/graph_stats.c:188
+msgid "Calculate graph curve statistics"
+msgstr "Calculer les statistiques de courbes"
+
+#: modules/graph/graph_stats.c:241
+msgid "Graph Statistics"
+msgstr "Statistiques des graphes"
+
+#: modules/graph/graph_stats.c:320 modules/graph/graph_stats.c:807
+msgid "Simple Parameters"
+msgstr "Paramètres simples"
+
+#: modules/graph/graph_stats.c:342 modules/graph/graph_stats.c:826
+#, fuzzy
+msgid "Integrals"
+msgstr "_Intégrale :"
+
+#: modules/graph/graph_stats.c:686
+msgid "Save Curve Statistics"
+msgstr "Enregistrer les statistiques de la courbe"
+
+#: modules/layer/axis.c:143
+msgid "Layer allowing selection of horizontal or vertical lines."
+msgstr ""
+"Couche permettant de sélectionner des lignes horizontales ou verticales."
+
+#: modules/layer/ellipse.c:143
+msgid "Layer allowing selection of elliptic areas."
+msgstr "Couche permettant de sélectionner des zones elliptiques."
+
+#: modules/layer/lattice.c:126
+msgid "Layer allowing selection of a two-dimensional lattice."
+msgstr "Couche permettant de sélectionner un réseau bi-dimensionnel."
+
+#: modules/layer/line.c:177
+msgid "Layer allowing selection of arbitrary straight lines."
+msgstr "Couche permettant de sélectionner des lignes droites."
+
+#: modules/layer/path.c:171
+msgid "Layer allowing selection of a single long curve."
+msgstr "Couche permettant de sélectionner une courbe unique."
+
+#: modules/layer/point.c:169
+msgid ""
+"Layer allowing selection of several points, displayed as crosses or "
+"invisible."
+msgstr ""
+"Couche permettant de sélectionner plusieurs points, sous forme de croix ou "
+"invisibles."
 
 #: modules/layer/rectangle.c:147
 msgid "Layer allowing selection of rectangular areas."
@@ -7452,25 +7725,25 @@ msgstr "Distribution  angulaire"
 msgid "Angle Distribution"
 msgstr "Distribution  angulaire"
 
-#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:373
+#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:365
 msgid "Output _size:"
 msgstr "Taille de _sortie :"
 
-#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:206
+#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:207
 msgid "_Number of steps:"
 msgstr "_Nombre de pas :"
 
-#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:380
+#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:372
 msgid "_Logarithmic value scale"
 msgstr "Échelle _logarithmique"
 
 #: modules/process/angle_dist.c:204 modules/process/entropy.c:231
-#: modules/process/slope_dist.c:390
+#: modules/process/slope_dist.c:382
 msgid "Use local plane _fitting"
 msgstr "Utiliser l'ajustement du plan local"
 
 #: modules/process/angle_dist.c:213 modules/process/entropy.c:242
-#: modules/process/slope_dist.c:401
+#: modules/process/slope_dist.c:393
 msgid "_Plane size:"
 msgstr "Taille du _plan :"
 
@@ -7486,7 +7759,8 @@ msgstr "/M_ultidonnées/_Arithmétique..."
 msgid "Arithmetic operations on data"
 msgstr "Opérations arithmétiques sur les données"
 
-#: modules/process/arithmetic.c:202 modules/process/superresolution.c:349
+#: modules/process/arithmetic.c:202 modules/process/stitch.c:234
+#: modules/process/superresolution.c:348
 msgid "Calculated"
 msgstr "Calculée"
 
@@ -7502,7 +7776,7 @@ msgstr "_Expression :"
 msgid "Operands"
 msgstr "Opérandes"
 
-#: modules/process/arithmetic.c:300 modules/process/dimensions.h:483
+#: modules/process/arithmetic.c:300 modules/process/dimensions.h:465
 msgid "Units"
 msgstr "Unités"
 
@@ -7523,15 +7797,15 @@ msgstr "Spécifier explicitement les unités du résultat"
 msgid "Expression contains unknown identifiers"
 msgstr "L'expression contient des identifiants inconnus"
 
-#: modules/process/arithmetic.c:569 modules/process/superresolution.c:300
+#: modules/process/arithmetic.c:569 modules/process/superresolution.c:299
 msgid "Pixel dimensions differ"
 msgstr "Les dimensions des pixels diffèrent"
 
-#: modules/process/arithmetic.c:571 modules/process/superresolution.c:302
+#: modules/process/arithmetic.c:571 modules/process/superresolution.c:301
 msgid "Lateral dimensions are different physical quantities"
 msgstr "Les dimensions latérales sont des quantités physiques différentes"
 
-#: modules/process/arithmetic.c:574 modules/process/superresolution.c:305
+#: modules/process/arithmetic.c:574 modules/process/superresolution.c:304
 msgid "Physical dimensions differ"
 msgstr "Les dimensions physiques diffèrent"
 
@@ -7640,8 +7914,8 @@ msgid "Generates surfaces by ballistic deposition."
 msgstr "Génère des surfaces par dépôt balistique."
 
 #: modules/process/bdep_synth.c:164
-msgid "/S_ynthetic/_Ballistic..."
-msgstr "/S_ynthèse/Dépôt _balistique..."
+msgid "/S_ynthetic/_Deposition/_Ballistic..."
+msgstr "/S_ynthèse/_Dépôt/ _Balistique..."
 
 #: modules/process/bdep_synth.c:168
 msgid "Generate surface by ballistic deposition"
@@ -7649,20 +7923,23 @@ msgstr "Générer une surface par dépôt balistique"
 
 #: modules/process/bdep_synth.c:239 modules/process/bdep_synth.c:596
 #: modules/process/calcoefs_simple.c:636 modules/process/col_synth.c:282
-#: modules/process/col_synth.c:733 modules/process/crosscor.c:819
-#: modules/process/crosscor.c:882 modules/process/deposit_synth.c:268
-#: modules/process/deposit_synth.c:859 modules/process/diff_synth.c:304
-#: modules/process/diff_synth.c:705 modules/process/domain_synth.c:255
-#: modules/process/domain_synth.c:745 modules/process/grain_wshed.c:429
+#: modules/process/col_synth.c:734 modules/process/crosscor.c:792
+#: modules/process/crosscor.c:855 modules/process/deposit_synth.c:268
+#: modules/process/deposit_synth.c:858 modules/process/diff_synth.c:304
+#: modules/process/diff_synth.c:704 modules/process/domain_synth.c:255
+#: modules/process/domain_synth.c:745 modules/process/fibre_synth.c:357
+#: modules/process/fibre_synth.c:872 modules/process/grain_wshed.c:433
 #: modules/process/lat_synth.c:491 modules/process/mark_disconn.c:148
-#: modules/process/mark_disconn.c:373 modules/process/maskcor.c:330
-#: modules/process/mcrop.c:315 modules/process/merge.c:1072
-#: modules/process/nanoindent_adjust.c:323 modules/process/neural.c:1272
-#: modules/process/pid.c:338 modules/process/superresolution.c:416
-#: modules/process/superresolution.c:505 modules/process/tip_blind.c:781
-#: modules/process/tipops.c:320 modules/process/xydenoise.c:213
-#: modules/volume/volume_kmeans.c:403 modules/volume/volume_kmedians.c:365
-#: modules/xyz/xyz_raster.c:1028 modules/xyz/xyz_raster.c:1044
+#: modules/process/mark_disconn.c:361 modules/process/maskcor.c:334
+#: modules/process/mcrop.c:314 modules/process/merge.c:1072
+#: modules/process/nanoindent_adjust.c:324 modules/process/neural.c:1279
+#: modules/process/pid.c:339 modules/process/sphere-revolve.c:269
+#: modules/process/superresolution.c:415 modules/process/superresolution.c:504
+#: modules/process/tip_blind.c:778 modules/process/tipops.c:320
+#: modules/process/wave_synth.c:305 modules/process/wave_synth.c:747
+#: modules/process/xydenoise.c:214 modules/volume/volume_kmeans.c:397
+#: modules/volume/volume_kmedians.c:363 modules/xyz/xyz_raster.c:997
+#: modules/xyz/xyz_raster.c:1013
 msgid "Initializing..."
 msgstr "Initialisation..."
 
@@ -7671,10 +7948,11 @@ msgstr "Initialisation..."
 #: modules/process/deposit_synth.c:531 modules/process/deposit_synth.c:544
 #: modules/process/diff_synth.c:342 modules/process/domain_synth.c:319
 #: modules/process/domain_synth.c:327 modules/process/fbm_synth.c:278
-#: modules/process/fft_synth.c:314 modules/process/lat_synth.c:529
-#: modules/process/lno_synth.c:407 modules/process/noise_synth.c:311
-#: modules/process/obj_synth.c:407 modules/process/pat_synth.c:357
-#: modules/process/wave_synth.c:323
+#: modules/process/fft_synth.c:314 modules/process/fibre_synth.c:394
+#: modules/process/lat_synth.c:529 modules/process/lno_synth.c:405
+#: modules/process/noise_synth.c:309 modules/process/obj_synth.c:404
+#: modules/process/pat_synth.c:357 modules/process/phase_synth.c:518
+#: modules/process/wave_synth.c:342
 msgid "Generated"
 msgstr "Généré"
 
@@ -7693,50 +7971,56 @@ msgid "Progressive preview"
 msgstr "Aperçu progressif"
 
 #: modules/process/bdep_synth.c:407 modules/process/col_synth.c:458
-#: modules/process/deposit_synth.c:412 modules/process/diff_synth.c:477
+#: modules/process/deposit_synth.c:413 modules/process/diff_synth.c:477
 #: modules/process/domain_synth.c:430 modules/process/fbm_synth.c:360
-#: modules/process/fft_synth.c:398 modules/process/lat_synth.c:626
-#: modules/process/lno_synth.c:490 modules/process/noise_synth.c:394
-#: modules/process/obj_synth.c:498 modules/process/pat_synth.c:442
-#: modules/process/wave_synth.c:407
+#: modules/process/fft_synth.c:398 modules/process/fibre_synth.c:479
+#: modules/process/lat_synth.c:626 modules/process/lno_synth.c:488
+#: modules/process/mfm_current.c:383 modules/process/mfm_parallel.c:384
+#: modules/process/noise_synth.c:392 modules/process/obj_synth.c:495
+#: modules/process/pat_synth.c:442 modules/process/phase_synth.c:263
+#: modules/process/wave_synth.c:426
 msgid "Dimensions"
 msgstr "Dimensions"
 
 #: modules/process/bdep_synth.c:416 modules/process/col_synth.c:467
-#: modules/process/deposit_synth.c:422 modules/process/diff_synth.c:486
+#: modules/process/deposit_synth.c:425 modules/process/diff_synth.c:486
 #: modules/process/domain_synth.c:438 modules/process/fbm_synth.c:371
-#: modules/process/fft_synth.c:409 modules/process/lno_synth.c:501
-#: modules/process/noise_synth.c:405 modules/process/obj_synth.c:509
-#: modules/process/pat_synth.c:454 modules/process/wave_synth.c:418
+#: modules/process/fft_synth.c:409 modules/process/fibre_synth.c:490
+#: modules/process/lno_synth.c:499 modules/process/mfm_current.c:412
+#: modules/process/mfm_parallel.c:411 modules/process/noise_synth.c:403
+#: modules/process/obj_synth.c:506 modules/process/pat_synth.c:454
+#: modules/process/phase_synth.c:274 modules/process/wave_synth.c:437
 msgid "Generator"
 msgstr "Générateur"
 
 #: modules/process/bdep_synth.c:422 modules/process/col_synth.c:473
-#: modules/process/diff_synth.c:492 modules/process/lno_synth.c:1041
-#: modules/process/obj_synth.c:520
+#: modules/process/deposit_synth.c:455 modules/process/diff_synth.c:492
+#: modules/process/fibre_synth.c:502 modules/process/lno_synth.c:1041
+#: modules/process/obj_synth.c:518
 msgid "Co_verage:"
 msgstr "Cou_verture :"
 
 #: modules/process/bdep_synth.c:434 modules/process/diff_synth.c:512
-#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:412
-#: modules/process/fft_synth.c:418 modules/process/lat_synth.c:758
-#: modules/process/lno_synth.c:537 modules/process/noise_synth.c:437
-#: modules/process/obj_synth.c:579 modules/process/wave_synth.c:453
-msgid "_Like Current Channel"
-msgstr "Identique au canal courant"
-
-#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:541
-#: modules/process/diff_synth.c:562
+#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:411
+#: modules/process/fft_synth.c:418 modules/process/fibre_synth.c:544
+#: modules/process/lat_synth.c:758 modules/process/lno_synth.c:535
+#: modules/process/noise_synth.c:435 modules/process/obj_synth.c:577
+#: modules/process/phase_synth.c:302 modules/process/wave_synth.c:472
+msgid "_Like Current Image"
+msgstr "Comme _l'image courante"
+
+#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:542
+#: modules/process/diff_synth.c:561
 msgid "Evolution"
 msgstr "Évolution"
 
-#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:544
-#: modules/process/diff_synth.c:565
+#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:545
+#: modules/process/diff_synth.c:564
 msgid "Plot graphs:"
 msgstr "Afficher les graphes :"
 
-#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:840
-#: modules/process/diff_synth.c:782
+#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:841
+#: modules/process/diff_synth.c:781
 msgid "Depositing particles..."
 msgstr "Dépôt des particules en cours..."
 
@@ -7771,8 +8055,8 @@ msgstr "Charger des données de calibration"
 msgid "Calibration name:"
 msgstr "Nom de la calibration :"
 
-#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:433
-#: modules/volume/volume_extract.c:514
+#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:421
+#: modules/volume/volume_extract.c:501
 msgid "No data loaded"
 msgstr "Aucunes données chargées"
 
@@ -7796,7 +8080,7 @@ msgstr "Ajouter"
 msgid "Load calibration data"
 msgstr "Charger des données de calibration"
 
-#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1073
+#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1059
 #, c-format
 msgid "Error loading file '%s'"
 msgstr "Erreur lors du chargement du fichier '%s'"
@@ -7890,7 +8174,7 @@ msgstr "Cartographie d'erreur basique"
 msgid "Simple Error Map"
 msgstr "Carte d'erreur basique"
 
-#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:146
+#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:142
 #: modules/process/superresolution.c:156
 msgid "Operands:"
 msgstr "Opérandes :"
@@ -7904,14 +8188,14 @@ msgid "Detail"
 msgstr "Détail"
 
 #: modules/process/calcoefs_simple.c:371 modules/process/calcoefs_view.c:491
-#: modules/process/calibrate.c:496 modules/process/crosscor.c:289
-#: modules/volume/volume_calibrate.c:478
+#: modules/process/calibrate.c:481 modules/process/crosscor.c:276
+#: modules/volume/volume_calibrate.c:460
 msgid "_X offset:"
 msgstr "Décalage _X :"
 
 #: modules/process/calcoefs_simple.c:398 modules/process/calcoefs_view.c:517
-#: modules/process/calibrate.c:509 modules/process/crosscor.c:300
-#: modules/volume/volume_calibrate.c:491
+#: modules/process/calibrate.c:488 modules/process/crosscor.c:284
+#: modules/volume/volume_calibrate.c:467
 msgid "_Y offset:"
 msgstr "Décalage _Y :"
 
@@ -7924,7 +8208,7 @@ msgid "Y p_eriod:"
 msgstr "P_ériode Y :"
 
 #: modules/process/calcoefs_simple.c:438 modules/process/calcoefs_view.c:529
-#: modules/volume/volume_calibrate.c:505
+#: modules/volume/volume_calibrate.c:474
 msgid "_Z offset:"
 msgstr "Décalage _Z :"
 
@@ -7955,26 +8239,26 @@ msgstr[1] "%d objets ont été trouvés"
 msgid "Search canceled"
 msgstr "Recherche annulée"
 
-#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:862
-#: modules/process/maskcor.c:332 modules/process/mcrop.c:317
+#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:835
+#: modules/process/maskcor.c:336 modules/process/mcrop.c:316
 #: modules/process/merge.c:1074
 msgid "Correlating..."
 msgstr "Corrélation..."
 
-#: modules/process/calcoefs_stage.c:76
+#: modules/process/calcoefs_stage.c:72
 msgid "Digital AFM data recalibration"
 msgstr "Recalibration numérique des données AFM"
 
-#: modules/process/calcoefs_stage.c:90
+#: modules/process/calcoefs_stage.c:86
 msgid "/Cali_bration/_3D Calibration/_Get From Stage map..."
 msgstr ""
 "/Cali_bration/Calibration _3D/À partir de la carte d'erreur de platine..."
 
-#: modules/process/calcoefs_stage.c:94
+#: modules/process/calcoefs_stage.c:90
 msgid "Stage error mapping"
 msgstr "Cartographie d'erreur de platine"
 
-#: modules/process/calcoefs_stage.c:131
+#: modules/process/calcoefs_stage.c:127
 msgid "Stage Error Map"
 msgstr "Carte d'erreur de platine"
 
@@ -8030,14 +8314,16 @@ msgstr "Position Z :"
 msgid "Crop to actual data"
 msgstr "Rogner aux données réelles"
 
-#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:369
-#: modules/process/deposit_synth.c:641 modules/process/edge.c:705
-#: modules/process/fft_filter_1d.c:299 modules/process/grain_edge.c:290
-#: modules/process/grain_filter.c:347 modules/process/grain_mark.c:372
-#: modules/process/mark_with.c:318 modules/process/polydistort.c:316
-#: modules/process/scars.c:386 modules/process/slope_dist.c:407
-#: modules/process/synth.h:513 modules/volume/volume_extract.c:424
-#: modules/volume/volume_extract.c:505 modules/volume/volume_linestat.c:422
+#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:368
+#: modules/process/deposit_synth.c:642 modules/process/edge.c:705
+#: modules/process/fft_filter_1d.c:301 modules/process/grain_edge.c:277
+#: modules/process/grain_filter.c:346 modules/process/grain_mark.c:357
+#: modules/process/mark_with.c:322 modules/process/mfm_field.c:420
+#: modules/process/mfm_shift.c:216 modules/process/polydistort.c:319
+#: modules/process/psf.c:309 modules/process/scars.c:421
+#: modules/process/slope_dist.c:400 modules/process/synth.h:542
+#: modules/volume/volume_extract.c:411 modules/volume/volume_extract.c:491
+#: modules/volume/volume_linestat.c:427
 msgid "I_nstant updates"
 msgstr "Mise à jour instantanée"
 
@@ -8078,27 +8364,27 @@ msgstr "Erreur : en dehors de la plage"
 msgid "Building mesh..."
 msgstr "Maillage en cours..."
 
-#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1818
+#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1867
 msgid "X correction"
 msgstr "Correction X"
 
-#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1819
+#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1868
 msgid "Y correction"
 msgstr "Correction Y"
 
-#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1820
+#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1869
 msgid "Z correction"
 msgstr "Correction Z"
 
-#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1821
+#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1870
 msgid "X uncertainty"
 msgstr "Incertitude X"
 
-#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1822
+#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1871
 msgid "Y uncertainty"
 msgstr "Incertitude Y"
 
-#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1823
+#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1872
 msgid "Z uncertainty"
 msgstr "Incertitude X"
 
@@ -8126,78 +8412,78 @@ msgstr "S'accrocher aux plans"
 msgid "Delaunay"
 msgstr "Delaunay"
 
-#: modules/process/calibrate.c:180
+#: modules/process/calibrate.c:172
 msgid "Recalibrates scan lateral dimensions or value range."
 msgstr "Recalibre les dimensions latérales ou l'échelle des valeurs."
 
-#: modules/process/calibrate.c:194
+#: modules/process/calibrate.c:186
 msgid "/_Basic Operations/_Dimensions and Units..."
 msgstr "/Opérations _basiques/_Dimensions et unités..."
 
-#: modules/process/calibrate.c:198 modules/volume/volume_calibrate.c:193
+#: modules/process/calibrate.c:190 modules/volume/volume_calibrate.c:193
 msgid "Change physical dimensions, units or value scale"
 msgstr "Modifie les dimensions latérales, les unités ou l'échelle"
 
-#: modules/process/calibrate.c:357 modules/volume/volume_calibrate.c:355
+#: modules/process/calibrate.c:349 modules/volume/volume_calibrate.c:355
 msgid "Recalibrated Data"
 msgstr "Données recalibrées"
 
-#: modules/process/calibrate.c:390
+#: modules/process/calibrate.c:382
 msgid "Dimensions and Units"
 msgstr "Dimensions et unités"
 
-#: modules/process/calibrate.c:411 modules/volume/volume_calibrate.c:389
+#: modules/process/calibrate.c:405 modules/volume/volume_calibrate.c:391
 msgid "New Real Dimensions"
 msgstr "Nouvelles dimensions réelles"
 
-#: modules/process/calibrate.c:417
+#: modules/process/calibrate.c:415
 msgid "_Match pixel size:"
 msgstr "Faire correspondre la taille des pixels :"
 
-#: modules/process/calibrate.c:444 modules/volume/volume_calibrate.c:394
+#: modules/process/calibrate.c:447 modules/volume/volume_calibrate.c:397
 msgid "_X range:"
 msgstr "Largeur _X :"
 
-#: modules/process/calibrate.c:473 modules/volume/volume_calibrate.c:421
+#: modules/process/calibrate.c:467 modules/volume/volume_calibrate.c:417
 msgid "_Y range:"
 msgstr "Hauteur _Y :"
 
-#: modules/process/calibrate.c:489
+#: modules/process/calibrate.c:472
 msgid "_Square samples"
 msgstr "Échantillons carrés"
 
-#: modules/process/calibrate.c:524 modules/volume/volume_calibrate.c:521
+#: modules/process/calibrate.c:496 modules/volume/volume_calibrate.c:480
 msgid "Value Range"
 msgstr "Plage de valeurs"
 
-#: modules/process/calibrate.c:529 modules/volume/volume_calibrate.c:448
+#: modules/process/calibrate.c:502 modules/volume/volume_calibrate.c:437
 msgid "_Z range:"
 msgstr "Plage _Z : "
 
-#: modules/process/calibrate.c:558
+#: modules/process/calibrate.c:524
 msgid "Z shi_ft:"
 msgstr "Décalage Z :"
 
-#: modules/process/calibrate.c:573 modules/volume/volume_calibrate.c:570
+#: modules/process/calibrate.c:533 modules/volume/volume_calibrate.c:515
 msgid "Calibration Coefficients"
 msgstr "Coefficients de calibration"
 
-#: modules/process/calibrate.c:580 modules/volume/volume_calibrate.c:577
+#: modules/process/calibrate.c:538 modules/volume/volume_calibrate.c:520
 msgid "_X calibration factor:"
 msgstr "Facteur de calibration _X :"
 
-#: modules/process/calibrate.c:590 modules/volume/volume_calibrate.c:585
+#: modules/process/calibrate.c:545 modules/volume/volume_calibrate.c:527
 msgid "_Y calibration factor:"
 msgstr "Facteur de calibration _Y :"
 
-#: modules/process/calibrate.c:600 modules/volume/volume_calibrate.c:593
+#: modules/process/calibrate.c:552 modules/volume/volume_calibrate.c:534
 msgid "_Z calibration factor:"
 msgstr "Facteur de calibration _Z :"
 
-#: modules/process/calibrate.c:613 modules/process/extend.c:293
-#: modules/tools/crop.c:213
-msgid "Create new channel"
-msgstr "Créer un nouveau canal"
+#: modules/process/calibrate.c:567 modules/process/drift.c:389
+#: modules/process/extend.c:293 modules/tools/crop.c:213
+msgid "Create new image"
+msgstr "Créer une nouvelle image"
 
 #: modules/process/coerce.c:159
 msgid "Transforms surfaces to have prescribed statistical properties."
@@ -8218,13 +8504,13 @@ msgid "Coerced"
 msgstr "Forcées"
 
 #: modules/process/coerce.c:225 modules/process/coerce.c:326
-#: modules/process/fbm_synth.c:475 modules/process/lno_synth.c:256
-#: modules/process/noise_synth.c:183
+#: modules/process/fbm_synth.c:474 modules/process/lno_synth.c:254
+#: modules/process/noise_synth.c:181
 msgid "distribution|Uniform"
 msgstr "Uniforme"
 
-#: modules/process/coerce.c:226 modules/process/fbm_synth.c:476
-#: modules/process/lno_synth.c:246 modules/process/noise_synth.c:173
+#: modules/process/coerce.c:226 modules/process/fbm_synth.c:475
+#: modules/process/lno_synth.c:244 modules/process/noise_synth.c:171
 msgid "distribution|Gaussian"
 msgstr "Gaussienne"
 
@@ -8273,12 +8559,12 @@ msgid "Number of maxima"
 msgstr "Nombre de maxima :"
 
 #: modules/process/col_synth.c:173 modules/tools/linestats.c:178
-#: modules/volume/volume_linestat.c:154
+#: modules/volume/volume_linestat.c:156
 msgid "Skew"
 msgstr "Asymétrie"
 
 #: modules/process/col_synth.c:174 modules/tools/linestats.c:179
-#: modules/tools/roughness.c:386 modules/volume/volume_linestat.c:155
+#: modules/tools/roughness.c:387 modules/volume/volume_linestat.c:157
 msgid "Kurtosis"
 msgstr "Kurtosis"
 
@@ -8293,8 +8579,8 @@ msgstr ""
 "simple."
 
 #: modules/process/col_synth.c:208
-msgid "/S_ynthetic/_Columnar..."
-msgstr "/S_ynthèse/_Croissance colonnaire..."
+msgid "/S_ynthetic/_Deposition/_Columnar..."
+msgstr "/S_ynthèse/_Dépôt/_Croissance colonnaire..."
 
 #: modules/process/col_synth.c:212
 msgid "Generate columnar surface"
@@ -8316,7 +8602,7 @@ msgstr "Incidence"
 msgid "Inclination"
 msgstr "Inclinaison"
 
-#: modules/process/col_synth.c:509 modules/process/crosscor.c:1063
+#: modules/process/col_synth.c:509 modules/process/crosscor.c:1036
 msgid "Direction"
 msgstr "Direction"
 
@@ -8324,15 +8610,15 @@ msgstr "Direction"
 msgid "Relaxation type:"
 msgstr "Type de relaxation :"
 
-#: modules/process/col_synth.c:528
+#: modules/process/col_synth.c:529
 msgid "_Melting:"
 msgstr "Fusion :"
 
-#: modules/process/col_synth.c:612
+#: modules/process/col_synth.c:613
 msgid "Weak"
 msgstr "Faible"
 
-#: modules/process/col_synth.c:613
+#: modules/process/col_synth.c:614
 msgid "Strong"
 msgstr "Forte"
 
@@ -8364,8 +8650,8 @@ msgstr "Filtre de convolution "
 msgid "Convolution Filter"
 msgstr "Filtre de convolution"
 
-#: modules/process/convolution_filter.c:269 modules/tools/filter.c:170
-#: modules/tools/filter.c:274
+#: modules/process/convolution_filter.c:269 modules/tools/filter.c:171
+#: modules/tools/filter.c:275
 msgid "Filter"
 msgstr "Filtre"
 
@@ -8393,7 +8679,7 @@ msgstr "Symétrie horizontale"
 msgid "VSym"
 msgstr "Symétrie verticale"
 
-#: modules/process/correct_affine.c:231
+#: modules/process/correct_affine.c:220
 msgid ""
 "Corrects affine distortion of images by matching image Bravais lattice to "
 "the true one."
@@ -8401,101 +8687,109 @@ msgstr ""
 "Corrige la distorsion affine des images en ajustant la matrice de Bravais "
 "sur la matrice réelle."
 
-#: modules/process/correct_affine.c:246
+#: modules/process/correct_affine.c:235
 msgid "/_Distortion/_Affine..."
 msgstr "/_Distorsion/_Affine..."
 
-#: modules/process/correct_affine.c:250
+#: modules/process/correct_affine.c:239
 msgid "Correct affine distortion"
 msgstr "Corriger la distorsion affine"
 
-#: modules/process/correct_affine.c:298
+#: modules/process/correct_affine.c:309 modules/process/correct_affine.c:634
+msgid "Corrected"
+msgstr "Corrigé"
+
+#: modules/process/correct_affine.c:343
 msgid "Affine Correction"
 msgstr "Correction affine"
 
-#: modules/process/correct_affine.c:351 modules/process/fft_filter_2d.c:530
+#: modules/process/correct_affine.c:349 modules/process/measure_lattice.c:249
+msgid "_Refine"
+msgstr "Affine_r"
+
+#: modules/process/correct_affine.c:399 modules/process/fft_filter_2d.c:530
 msgid "Preview Options"
 msgstr "Option d'aperçu"
 
-#: modules/process/correct_affine.c:356 modules/process/fft_filter_2d.c:535
-#: modules/process/measure_lattice.c:321
+#: modules/process/correct_affine.c:404 modules/process/fft_filter_2d.c:535
+#: modules/process/measure_lattice.c:311
 msgid "Display:"
 msgstr "Affichage :"
 
-#: modules/process/correct_affine.c:364 modules/process/measure_lattice.c:329
+#: modules/process/correct_affine.c:412 modules/process/measure_lattice.c:319
 #: modules/tools/grainremover.c:109
 msgid "_Data"
 msgstr "_Données"
 
-#: modules/process/correct_affine.c:365
+#: modules/process/correct_affine.c:413
 msgid "2D _ACF"
 msgstr "_ACF 2D"
 
-#: modules/process/correct_affine.c:366 modules/process/drift.c:365
+#: modules/process/correct_affine.c:414 modules/process/drift.c:364
 msgid "Correc_ted data"
 msgstr "Données corrigées"
 
-#: modules/process/correct_affine.c:377
+#: modules/process/correct_affine.c:425
 msgid "ACF zoom:"
 msgstr "Zoom ACF : "
 
-#: modules/process/correct_affine.c:394 modules/process/measure_lattice.c:372
+#: modules/process/correct_affine.c:442 modules/process/measure_lattice.c:346
+msgid "Interpolate _horizontal ACF"
+msgstr "Interpoler l'ACF _horizontale"
+
+#: modules/process/correct_affine.c:452 modules/process/measure_lattice.c:372
 msgid "Lattice Vectors"
 msgstr "Vecteurs de base"
 
 #. TRANSLATORS: Correct is an adjective here.
-#: modules/process/correct_affine.c:419
+#: modules/process/correct_affine.c:469
 msgid "Correct Lattice"
 msgstr "Corriger la matrice"
 
-#: modules/process/correct_affine.c:423
+#: modules/process/correct_affine.c:473
 msgid "_Lattice type:"
 msgstr "Type de matrice :"
 
-#: modules/process/correct_affine.c:430
+#: modules/process/correct_affine.c:480
 msgid "User defined"
 msgstr "Défini par l'utilisateur"
 
-#: modules/process/correct_affine.c:445
+#: modules/process/correct_affine.c:495
 msgid "_Different lengths"
 msgstr "Longueurs _différentes"
 
-#: modules/process/correct_affine.c:474
+#: modules/process/correct_affine.c:524
 msgid "Image for _ACF:"
 msgstr "Image pour l'_ACF : "
 
-#: modules/process/correct_affine.c:501
+#: modules/process/correct_affine.c:551
 msgid "_Scaling:"
 msgstr "Échelle :"
 
-#: modules/process/correct_affine.c:508
+#: modules/process/correct_affine.c:558
 msgid "Exactly as specified"
 msgstr "Tel que spécifié"
 
-#: modules/process/correct_affine.c:509
+#: modules/process/correct_affine.c:560
 msgid "Preserve area"
 msgstr "Conserver l'aire"
 
-#: modules/process/correct_affine.c:510
+#: modules/process/correct_affine.c:562
 msgid "Preserve X scale"
 msgstr "Conserver l'échelle X"
 
-#: modules/process/correct_affine.c:561
-msgid "Corrected"
-msgstr "Corrigé"
+#: modules/process/correct_affine.c:571 modules/process/drift.c:379
+msgid "_Apply to all compatible images"
+msgstr "_Appliquer à toutes les images compatibles"
 
-#: modules/process/correct_affine.c:617 modules/process/measure_lattice.c:489
+#: modules/process/correct_affine.c:693 modules/process/measure_lattice.c:482
 msgid "length"
 msgstr "longueur"
 
-#: modules/process/correct_affine.c:624 modules/process/measure_lattice.c:496
+#: modules/process/correct_affine.c:700 modules/process/measure_lattice.c:489
 msgid "angle"
 msgstr "angle"
 
-#: modules/process/correct_affine.c:717
-msgid "Re_fine"
-msgstr "A_ffiner"
-
 #: modules/process/crosscor.c:157
 msgid "Calculates cross-correlation of two data fields."
 msgstr "Calcule la corrélation croisée de 2 champs de données."
@@ -8520,150 +8814,152 @@ msgstr "Corréler avec :"
 msgid "Search size"
 msgstr "Dimensions de recherche"
 
-#: modules/process/crosscor.c:272
-msgid "Global offset of 2nd channel"
-msgstr "Décalage global du second canal"
-
-#: modules/process/crosscor.c:277
+#: modules/process/crosscor.c:267
 msgid "_Guess"
 msgstr "Deviner"
 
-#: modules/process/crosscor.c:311
+#: modules/process/crosscor.c:268
+msgid "Global offset of 2nd channel"
+msgstr "Décalage global du second canal"
+
+#: modules/process/crosscor.c:292
 msgid "Window size"
 msgstr "Taille de la fenêtre"
 
-#: modules/process/crosscor.c:319
+#: modules/process/crosscor.c:300
 msgid "W_idth:"
 msgstr "Largeur :"
 
-#: modules/process/crosscor.c:329
+#: modules/process/crosscor.c:308
 msgid "Hei_ght:"
 msgstr "Hauteur :"
 
-#: modules/process/crosscor.c:342 modules/process/fft.c:405
+#: modules/process/crosscor.c:319 modules/process/fft.c:403
 #: modules/process/psdf_logphi.c:268
 msgid "_Windowing type:"
 msgstr "Type de fenêtre d'apodisation :"
 
-#: modules/process/crosscor.c:350
+#: modules/process/crosscor.c:327
 msgid "All"
 msgstr "Tout"
 
-#: modules/process/crosscor.c:351
+#: modules/process/crosscor.c:328
 msgid "Absolute"
 msgstr "Absolu"
 
-#: modules/process/crosscor.c:352
+#: modules/process/crosscor.c:329
 msgid "X Distance"
 msgstr "Distance X"
 
-#: modules/process/crosscor.c:353
+#: modules/process/crosscor.c:330
 msgid "Y Distance"
 msgstr "Distance Y"
 
-#: modules/process/crosscor.c:355 modules/process/crosscor.c:1077
+#: modules/process/crosscor.c:332 modules/process/crosscor.c:1050
 msgid "Score"
 msgstr "Score"
 
-#: modules/process/crosscor.c:357 modules/process/fft.c:395
-#: modules/process/fit-shape.c:688 modules/process/maskcor.c:176
+#: modules/process/crosscor.c:334 modules/process/fft.c:393
+#: modules/process/fit-shape.c:699 modules/process/maskcor.c:177
+#: modules/process/mfm_current.c:455 modules/process/mfm_field.c:373
+#: modules/process/mfm_parallel.c:466
 msgid "Output _type:"
 msgstr "_Type de sortie :"
 
-#: modules/process/crosscor.c:363
+#: modules/process/crosscor.c:340
 msgid "Add _low score results mask"
 msgstr "Ajouter un masque de corré_lation basse"
 
-#: modules/process/crosscor.c:374 modules/process/grain_wshed.c:223
-#: modules/process/maskcor.c:188
+#: modules/process/crosscor.c:351 modules/process/grain_wshed.c:225
+#: modules/process/maskcor.c:191
 msgid "T_hreshold:"
 msgstr "Seuil :"
 
-#: modules/process/crosscor.c:381
+#: modules/process/crosscor.c:359
 msgid "Multichannel cross-corelation"
 msgstr "Corrélation croisée multi-canaux"
 
-#: modules/process/crosscor.c:400
+#: modules/process/crosscor.c:378
 msgid "Second _source data:"
 msgstr "Seconde _source de données :"
 
-#: modules/process/crosscor.c:417
+#: modules/process/crosscor.c:394
 msgid "Correlate with:"
 msgstr "Corréler avec :"
 
-#: modules/process/crosscor.c:424
+#: modules/process/crosscor.c:402
 msgid "Postprocess:"
 msgstr "Post-traitement :"
 
-#: modules/process/crosscor.c:431
-msgid "Apply Ga_ussian filter of width: "
-msgstr "Appliquer un filtre gaussien de largeur :"
+#: modules/process/crosscor.c:411
+msgid "Apply Ga_ussian filter of width:"
+msgstr "Appliquer _un filtre gaussien de largeur :"
 
-#: modules/process/crosscor.c:451
+#: modules/process/crosscor.c:424
 msgid "Extend results to borders"
 msgstr "Étendre les résultats vers les bords"
 
-#: modules/process/crosscor.c:461
+#: modules/process/crosscor.c:433
 msgid "Create corrected data from 2nd channel"
 msgstr "Créer des données corrigées à partir du second canal"
 
-#: modules/process/crosscor.c:860
+#: modules/process/crosscor.c:833
 msgid "Correlating first set..."
 msgstr "Corrélation du premier jeu..."
 
-#: modules/process/crosscor.c:892
+#: modules/process/crosscor.c:865
 msgid "Correlating second set..."
 msgstr "Corrélation du second jeu..."
 
-#: modules/process/crosscor.c:999
+#: modules/process/crosscor.c:972
 msgid "Corrected 2nd channel"
 msgstr "Second canal corrigé"
 
-#: modules/process/crosscor.c:1023
+#: modules/process/crosscor.c:996
 msgid "X difference"
 msgstr "Différence X"
 
-#: modules/process/crosscor.c:1037
+#: modules/process/crosscor.c:1010
 msgid "Y difference"
 msgstr "Différence Y"
 
-#: modules/process/crosscor.c:1050
+#: modules/process/crosscor.c:1023
 msgid "Absolute difference"
 msgstr "Différence absolue"
 
-#: modules/process/curvature.c:131
+#: modules/process/curvature.c:130
 msgid "Center value"
 msgstr "Valeur centrale"
 
-#: modules/process/curvature.c:132
+#: modules/process/curvature.c:131
 msgid "Curvature radius 1"
 msgstr "Rayon de courbure 1"
 
-#: modules/process/curvature.c:133
+#: modules/process/curvature.c:132
 msgid "Curvature radius 2"
 msgstr "Rayon de courbure 2"
 
-#: modules/process/curvature.c:134
+#: modules/process/curvature.c:133
 msgid "Direction 1"
 msgstr "Direction 1"
 
-#: modules/process/curvature.c:135
+#: modules/process/curvature.c:134
 msgid "Direction 2"
 msgstr "Direction 2"
 
-#: modules/process/curvature.c:163
+#: modules/process/curvature.c:162
 msgid "Calculates overall curvature."
 msgstr "Calcule la courbure globale."
 
-#: modules/process/curvature.c:177
+#: modules/process/curvature.c:176
 msgid "/_Level/_Curvature..."
 msgstr "/Niveau/_Courbure..."
 
-#: modules/process/curvature.c:181
+#: modules/process/curvature.c:180
 msgid "Calculate overall curvature"
 msgstr "Calculer la courbure globale"
 
-#: modules/process/curvature.c:211 modules/process/facet-level.c:118
+#: modules/process/curvature.c:210 modules/process/facet-level.c:118
 #: modules/process/semsim.c:165
 #, c-format
 msgid "%s: Lateral dimensions and value must be the same physical quantity."
@@ -8671,49 +8967,49 @@ msgstr ""
 "%s : les dimensions latérales et les valeurs doivent être les mêmes "
 "quantités physiques."
 
-#: modules/process/curvature.c:445
+#: modules/process/curvature.c:447
 msgid "Curvature Sections"
 msgstr "Sections de courbure"
 
-#: modules/process/curvature.c:653
+#: modules/process/curvature.c:655
 msgid "Output Type"
 msgstr "Type de sortie"
 
-#: modules/process/curvature.c:660
+#: modules/process/curvature.c:662
 msgid "_Set selection"
 msgstr "Définir la _sélection"
 
-#: modules/process/curvature.c:670
+#: modules/process/curvature.c:672
 msgid "_Plot graph"
 msgstr "Afficher le graphe"
 
-#: modules/process/curvature.c:685 modules/process/drift.c:337
-#: modules/process/fft_profile.c:310 modules/process/fractal.c:328
-#: modules/process/grain_cross.c:253 modules/process/linematch.c:885
-#: modules/process/slope_dist.c:349 modules/tools/linestats.c:418
-#: modules/tools/profile.c:573 modules/tools/roughness.c:872
-#: modules/tools/sfunctions.c:486 modules/tools/spectro.c:382
-#: modules/volume/volume_slice.c:398
-msgid "Target _graph:"
-msgstr "_Graphe cible :"
-
-#: modules/process/curvature.c:691 modules/process/drift.c:343
-#: modules/process/fft_profile.c:316 modules/process/fractal.c:334
-#: modules/process/grain_cross.c:259 modules/process/linematch.c:892
-#: modules/process/slope_dist.c:355 modules/tools/linestats.c:424
-#: modules/tools/profile.c:579 modules/tools/roughness.c:878
-#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:388
-#: modules/volume/volume_slice.c:406
+#: modules/process/curvature.c:684 modules/process/drift.c:340
+#: modules/process/fft_profile.c:300 modules/process/fractal.c:308
+#: modules/process/grain_cross.c:260 modules/process/linematch.c:855
+#: modules/process/slope_dist.c:347 modules/tools/linestats.c:424
+#: modules/tools/profile.c:559 modules/tools/roughness.c:886
+#: modules/tools/sfunctions.c:488 modules/tools/spectro.c:391
+#: modules/volume/volume_slice.c:408
 msgid "New graph"
 msgstr "Nouveau graphe"
 
-#: modules/process/curvature.c:951
+#: modules/process/curvature.c:689 modules/process/drift.c:345
+#: modules/process/fft_profile.c:306 modules/process/fractal.c:313
+#: modules/process/grain_cross.c:254 modules/process/linematch.c:860
+#: modules/process/slope_dist.c:352 modules/tools/linestats.c:418
+#: modules/tools/profile.c:563 modules/tools/roughness.c:890
+#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:385
+#: modules/volume/volume_slice.c:400
+msgid "Target _graph:"
+msgstr "_Graphe cible :"
+
+#: modules/process/curvature.c:949
 msgid "Axes are outside the image."
 msgstr "Les axes sont en-dehors de l'image."
 
-#: modules/process/curvature.c:1018
+#: modules/process/curvature.c:1016
 msgid "Save Curvature"
-msgstr "Sauver la courbure"
+msgstr "Enregistrer la courbure"
 
 #: modules/process/cwt.c:66
 msgid "Two-dimensional CWT (Continuous Wavelet Transform)."
@@ -8735,8 +9031,8 @@ msgstr "Transformée en ondelettes continue (CWT)"
 msgid "2D CWT"
 msgstr "Transformée en ondelettes continue 2D (2D CWT)"
 
-#: modules/process/cwt.c:158 modules/process/dwt.c:185
-#: modules/process/dwtanisotropy.c:209
+#: modules/process/cwt.c:159 modules/process/dwt.c:185
+#: modules/process/dwtanisotropy.c:212
 msgid "_Wavelet type:"
 msgstr "Type d'ondelette :"
 
@@ -8745,14 +9041,14 @@ msgid "Generates particles using simple dynamical model"
 msgstr "Génère des particules à l'aide d'un modèle dynamique simple"
 
 #: modules/process/deposit_synth.c:184
-msgid "/S_ynthetic/_Particles..."
-msgstr "/S_ynthèse/_Particules..."
+msgid "/S_ynthetic/_Deposition/_Particles..."
+msgstr "/S_ynthèse/_Dépôt/_Particules..."
 
 #: modules/process/deposit_synth.c:188
 msgid "Generate particles using dynamical model"
 msgstr "Générer des particules à l'aide d'un modèle dynamique"
 
-#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:867
+#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:866
 #, c-format
 msgid ""
 "Not all the particles could be deposited (%u),\n"
@@ -8761,73 +9057,69 @@ msgstr ""
 "Toutes les particules n'ont pu être déposées (%u), \n"
 " essayez plus d'étapes de révision."
 
-#: modules/process/deposit_synth.c:347
+#: modules/process/deposit_synth.c:348
 msgid "Particle Generation"
 msgstr "Génération de particules"
 
-#: modules/process/deposit_synth.c:427
+#: modules/process/deposit_synth.c:431
 msgid "Particle r_adius:"
 msgstr "_Rayon des particules :"
 
-#: modules/process/deposit_synth.c:438
+#: modules/process/deposit_synth.c:443
 msgid "Distribution _width:"
 msgstr "Largeur de distribution :"
 
-#: modules/process/deposit_synth.c:449
-msgid "Surface _coverage:"
-msgstr "Taux de _couverture :"
-
-#: modules/process/deposit_synth.c:458
+#: modules/process/deposit_synth.c:462
 msgid "_Relax steps:"
 msgstr "Étapes de _relaxation :"
 
-#: modules/process/deposit_synth.c:659 modules/process/synth.h:548
+#: modules/process/deposit_synth.c:660 modules/process/synth.h:577
 msgid "R_andom seed:"
 msgstr "Graine _aléatoire :"
 
-#: modules/process/deposit_synth.c:665 modules/process/synth.h:554
+#: modules/process/deposit_synth.c:666 modules/process/synth.h:583
 msgid "seed|_New"
 msgstr "_Nouvelle"
 
-#: modules/process/deposit_synth.c:676
+#: modules/process/deposit_synth.c:677
 msgid "Randomize"
 msgstr "Randomiser"
 
-#: modules/process/deposit_synth.c:860 modules/process/domain_synth.c:919
+#: modules/process/deposit_synth.c:859 modules/process/domain_synth.c:919
 msgid "Running computation..."
 msgstr "Calcul en cours..."
 
-#: modules/process/deposit_synth.c:865
+#: modules/process/deposit_synth.c:864
 #, c-format
 msgid "%d particles were deposited"
 msgstr "%d particules ont été déposées."
 
-#: modules/process/deposit_synth.c:1093
+#: modules/process/deposit_synth.c:1092
 msgid "Initial particle set..."
 msgstr "Ensemble initial de particules..."
 
-#: modules/process/deposit_synth.c:1252
+#: modules/process/deposit_synth.c:1251
 msgid "Running revise..."
 msgstr "Révision en cours..."
 
-#: modules/process/deposit_synth.c:1380
+#: modules/process/deposit_synth.c:1379
 msgid "Error: too many particles."
 msgstr "Erreur : trop de particules."
 
-#: modules/process/deposit_synth.c:1382
+#: modules/process/deposit_synth.c:1381
 msgid "Error: no particles."
 msgstr "Erreur : aucune particule."
 
-#: modules/process/deposit_synth.c:1384
+#: modules/process/deposit_synth.c:1383
 msgid "Error: particles too large."
 msgstr "Erreur : les particules sont trop grandes."
 
-#: modules/process/deposit_synth.c:1386
+#: modules/process/deposit_synth.c:1385
 msgid "Error: particles too small."
 msgstr "Erreur : les particules sont trop petites."
 
 #: modules/process/diff_synth.c:197 modules/tools/linestats.c:173
-#: modules/volume/volume_linestat.c:149
+#: modules/volume/volume_linestat.c:151
 msgid "Variation"
 msgstr "Variation"
 
@@ -8840,8 +9132,8 @@ msgid "Generates surfaces by diffusion limited aggregation."
 msgstr "Génère des surfaces par agrégation limitée par diffusion."
 
 #: modules/process/diff_synth.c:228
-msgid "/S_ynthetic/_Diffusion..."
-msgstr "/S_ynthèse/_Diffusion..."
+msgid "/S_ynthetic/_Deposition/_Diffusion..."
+msgstr "/S_ynthèse/_Dépôt/_Diffusion..."
 
 #: modules/process/diff_synth.c:232
 msgid "Generate surface by diffusion limited aggregation"
@@ -8855,45 +9147,45 @@ msgstr "Agrégation limitée par diffusion"
 msgid "_Flux:"
 msgstr "_Flux :"
 
-#: modules/process/diff_synth.c:522
+#: modules/process/diff_synth.c:521
 msgid "Probabilities"
 msgstr "Probabilités"
 
-#: modules/process/diff_synth.c:530
+#: modules/process/diff_synth.c:529
 msgid "_Sticking:"
 msgstr "Adhérence :"
 
-#: modules/process/diff_synth.c:539
+#: modules/process/diff_synth.c:538
 msgid "_Activation:"
 msgstr "_Activation :"
 
-#: modules/process/diff_synth.c:548
+#: modules/process/diff_synth.c:547
 msgid "Passing Sch_woebel:"
 msgstr "Barrière de Sch_woebel :"
 
-#: modules/process/dimensions.h:457
+#: modules/process/dimensions.h:439
 msgid "S_quare image"
 msgstr "Image carrée"
 
-#: modules/process/dimensions.h:489
+#: modules/process/dimensions.h:473
 msgid "_Dimension units:"
 msgstr "Unités de _dimensions :"
 
-#: modules/process/dimensions.h:502
-msgid "Current Channel"
-msgstr "Canal courant"
+#: modules/process/dimensions.h:488
+msgid "Current Image"
+msgstr "Image courante"
 
-#: modules/process/dimensions.h:506
-msgid "_Take Dimensions from Current Channel"
-msgstr "Prendre les dimensions à par_tir du canal courant"
+#: modules/process/dimensions.h:492
+msgid "_Take Dimensions from Current Image"
+msgstr "Prendre les dimensions à par_tir de l'image courante"
 
-#: modules/process/dimensions.h:514
-msgid "_Replace the current channel"
-msgstr "_Remplacer le canal courant"
+#: modules/process/dimensions.h:501
+msgid "_Replace the current image"
+msgstr "_Remplacer l'image courante"
 
-#: modules/process/dimensions.h:523
-msgid "_Start from the current channel"
-msgstr "Ajouter à partir du canal courant"
+#: modules/process/dimensions.h:510
+msgid "_Start from the current image"
+msgstr "Ajouter à partir de l'image courante"
 
 #: modules/process/domain_synth.c:158
 msgid "Discrete state"
@@ -8954,13 +9246,13 @@ msgid "_Monte Carlo time step:"
 msgstr "Étape temporelle de Monte-Carlo :"
 
 #: modules/process/domain_synth.c:504 modules/process/fft_filter_2d.c:586
-#: modules/volume/volume_slice.c:364
+#: modules/volume/volume_slice.c:366
 msgid "Output Options"
 msgstr "Options de sortie"
 
 #: modules/process/domain_synth.c:523 modules/process/fft_filter_2d.c:591
-#: modules/process/mask_edt.c:377 modules/process/slope_dist.c:323
-#: modules/volume/volume_linestat.c:432 modules/volume/volume_slice.c:384
+#: modules/process/mask_edt.c:211 modules/process/slope_dist.c:323
+#: modules/volume/volume_linestat.c:437 modules/volume/volume_slice.c:386
 msgid "Output type:"
 msgstr "Type de sortie :"
 
@@ -8988,57 +9280,49 @@ msgstr "Plage de recherche :"
 msgid "rows"
 msgstr "lignes"
 
-#: modules/process/drift.c:304
+#: modules/process/drift.c:305
 msgid "Correct _data"
 msgstr "Corriger les _données"
 
-#: modules/process/drift.c:314
+#: modules/process/drift.c:315
 msgid "_Exclude linear skew"
 msgstr "_Exclure l'asymétrie linéaire"
 
-#: modules/process/drift.c:324
+#: modules/process/drift.c:325
 msgid "Plot drift _graph"
 msgstr "Afficher le graphe de dérive"
 
-#: modules/process/drift.c:356 modules/process/fit-shape.c:693
-#: modules/process/neural.c:548 modules/process/polydistort.c:275
+#: modules/process/drift.c:355 modules/process/fit-shape.c:705
+#: modules/process/neural.c:552 modules/process/polydistort.c:278
 msgid "Preview:"
 msgstr "Aperçu :"
 
-#: modules/process/drift.c:366
+#: modules/process/drift.c:365
 msgid "Drift _lines"
 msgstr "Lignes de dérive"
 
-#: modules/process/drift.c:374 modules/process/facet_analysis.c:407
-#: modules/process/grain_edge.c:285 modules/process/grain_filter.c:357
-#: modules/process/grain_mark.c:367 modules/process/grain_wshed.c:267
-#: modules/process/mark_disconn.c:310 modules/process/scars.c:381
+#: modules/process/drift.c:373 modules/process/facet_analysis.c:390
+#: modules/process/grain_edge.c:272 modules/process/grain_filter.c:356
+#: modules/process/grain_mark.c:341 modules/process/grain_wshed.c:271
+#: modules/process/mark_disconn.c:298 modules/process/scars.c:405
 #: modules/process/wpour_mark.c:369
 msgid "_Mask color:"
 msgstr "Couleur de _masque :"
 
-#: modules/process/drift.c:379
-msgid "Distribute"
-msgstr "Distribuer"
-
-#: modules/process/drift.c:388
-msgid "Replace"
-msgstr "Remplacer"
-
-#: modules/process/drift.c:569
+#: modules/process/drift.c:570
 msgid "Drift-corrected"
 msgstr "Dérive corrigée"
 
-#: modules/process/drift.c:613
+#: modules/process/drift.c:614
 msgid "Drift"
 msgstr "Dérive"
 
-#: modules/process/drift.c:614 modules/xyz/xyz_drift.c:392
+#: modules/process/drift.c:615 modules/xyz/xyz_drift.c:392
 #: modules/xyz/xyz_drift.c:411 modules/xyz/xyz_drift.c:430
 msgid "drift"
 msgstr "dérive"
 
-#: modules/process/drift.c:620 modules/xyz/xyz_drift.c:402
+#: modules/process/drift.c:621 modules/xyz/xyz_drift.c:402
 msgid "x-axis drift"
 msgstr "dérive selon l'axe x"
 
@@ -9096,11 +9380,11 @@ msgstr "Anisotropie DWT"
 msgid "2D DWT Anisotropy"
 msgstr "Anisotropie DWT 2D"
 
-#: modules/process/dwtanisotropy.c:214
+#: modules/process/dwtanisotropy.c:218
 msgid "X/Y ratio threshold:"
 msgstr "Seuil du ratio X/Y :"
 
-#: modules/process/dwtanisotropy.c:222
+#: modules/process/dwtanisotropy.c:226
 msgid "Low level exclude limit:"
 msgstr "Limite basse d'exclusion :"
 
@@ -9228,7 +9512,7 @@ msgstr "Détection de saut par coupure à zéro"
 msgid "_Gaussian FWHM:"
 msgstr "FWHM _gaussienne :"
 
-#: modules/process/edge.c:681 modules/process/mark_disconn.c:271
+#: modules/process/edge.c:681 modules/process/mark_disconn.c:272
 msgid "_Threshold:"
 msgstr "Seuil :"
 
@@ -9294,11 +9578,11 @@ msgstr "Entropie : "
 msgid "Entropy deficit:"
 msgstr "Déficit d'entropie : "
 
-#: modules/process/entropy.c:567
+#: modules/process/entropy.c:568
 msgid "Entropy at scales"
 msgstr "Entropie des échelles"
 
-#: modules/process/entropy.c:586
+#: modules/process/entropy.c:587
 msgid "Best estimate"
 msgstr "Meilleure estimation"
 
@@ -9346,23 +9630,23 @@ msgstr "D_roite :"
 msgid "Extend _symetrically"
 msgstr "Étendre de manière _symétrique"
 
-#: modules/process/extend.c:268 modules/process/polydistort.c:256
-#: modules/xyz/xyz_raster.c:658
+#: modules/process/extend.c:268 modules/process/polydistort.c:259
+#: modules/xyz/xyz_raster.c:627
 msgid "exterior|Border"
 msgstr "Bord"
 
-#: modules/process/extend.c:270 modules/process/polydistort.c:258
-#: modules/xyz/xyz_raster.c:660
+#: modules/process/extend.c:270 modules/process/polydistort.c:261
+#: modules/xyz/xyz_raster.c:629
 msgid "exterior|Mirror"
 msgstr "Miroir"
 
-#: modules/process/extend.c:272 modules/process/polydistort.c:260
-#: modules/xyz/xyz_raster.c:662
+#: modules/process/extend.c:272 modules/process/polydistort.c:263
+#: modules/xyz/xyz_raster.c:631
 msgid "exterior|Periodic"
 msgstr "Périodique"
 
-#: modules/process/extend.c:275 modules/process/polydistort.c:263
-#: modules/xyz/xyz_raster.c:650
+#: modules/process/extend.c:275 modules/process/polydistort.c:266
+#: modules/xyz/xyz_raster.c:619
 msgid "_Exterior type:"
 msgstr "Type d'_extérieur :"
 
@@ -9394,11 +9678,11 @@ msgstr "Nombre de points dans le chemin :"
 msgid "There is no path selection."
 msgstr "Il n'y a aucun chemin."
 
-#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:390
+#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:383
 msgid "X position"
 msgstr "Position X"
 
-#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:397
+#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:389
 msgid "Y position"
 msgstr "Position Y"
 
@@ -9411,7 +9695,7 @@ msgid "Y tangent"
 msgstr "Tangente Y"
 
 #: modules/process/extract_path.c:392 modules/process/extract_path.c:404
-#: modules/process/pat_synth.c:1432 modules/tools/distance.c:146
+#: modules/process/pat_synth.c:1433 modules/tools/distance.c:146
 msgid "Distance"
 msgstr "Distance"
 
@@ -9455,47 +9739,36 @@ msgstr "/_Statistiques/_Analyse des facettes..."
 msgid "Mark areas by 2D slope"
 msgstr "Marquer des zones selon la pente 2D"
 
-#: modules/process/facet_analysis.c:266
+#: modules/process/facet_analysis.c:270
 msgid "Mark Facets"
 msgstr "Marquer les facettes"
 
-#: modules/process/facet_analysis.c:269
+#: modules/process/facet_analysis.c:273
 msgid "verb|_Mark"
 msgstr "_Marquer"
 
 #. TRANSLATORS: The direction or line orthogonal to something.
-#: modules/process/facet_analysis.c:325
+#: modules/process/facet_analysis.c:329
 msgid "Normal"
 msgstr "Normal"
 
-#: modules/process/facet_analysis.c:333
+#: modules/process/facet_analysis.c:337
 msgid "_Find Maximum"
 msgstr "Trouver le maximum"
 
-#: modules/process/facet_analysis.c:341
+#: modules/process/facet_analysis.c:345
 msgid "Mean Normal"
 msgstr "Normale moyenne"
 
-#: modules/process/facet_analysis.c:350
+#: modules/process/facet_analysis.c:362
 msgid "Facet plane size:"
 msgstr "Taille des facettes :"
 
-#: modules/process/facet_analysis.c:375
+#: modules/process/facet_analysis.c:370
 msgid "_Tolerance:"
 msgstr "_Tolérance :"
 
-#: modules/process/facet_analysis.c:384 modules/process/grain_edge.c:262
-#: modules/process/grain_mark.c:344 modules/process/mark_disconn.c:286
-msgid "Com_bine with existing mask"
-msgstr "Com_biner avec le masque existant"
-
-#: modules/process/facet_analysis.c:398 modules/process/grain_edge.c:276
-#: modules/process/grain_mark.c:358 modules/process/mark_disconn.c:301
-#: modules/process/mark_with.c:230 modules/process/mask_morph.c:210
-msgid "Operation:"
-msgstr "Opération :"
-
-#: modules/process/facet_analysis.c:415
+#: modules/process/facet_analysis.c:398
 msgid ""
 "Warning: Lateral and value units differ. Angles are not physically "
 "meaningful."
@@ -9527,8 +9800,8 @@ msgstr "Exposant de _Hurst :"
 msgid "_Stationarity scale:"
 msgstr "Échelle de _stationnarité :"
 
-#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:509
-#: modules/process/noise_synth.c:409
+#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:507
+#: modules/process/noise_synth.c:407
 msgid "_Distribution:"
 msgstr "_Distribution : "
 
@@ -9536,17 +9809,17 @@ msgstr "_Distribution : "
 msgid "Po_wer:"
 msgstr "Puissance :"
 
-#: modules/process/fbm_synth.c:408 modules/process/fft_synth.c:414
-#: modules/process/lno_synth.c:533 modules/process/noise_synth.c:433
+#: modules/process/fbm_synth.c:407 modules/process/fft_synth.c:414
+#: modules/process/lno_synth.c:531 modules/process/noise_synth.c:431
 msgid "_RMS:"
 msgstr "_RMS :"
 
-#: modules/process/fbm_synth.c:477 modules/process/lno_synth.c:251
-#: modules/process/noise_synth.c:178
+#: modules/process/fbm_synth.c:476 modules/process/lno_synth.c:249
+#: modules/process/noise_synth.c:176
 msgid "distribution|Exponential"
 msgstr "Exponentielle"
 
-#: modules/process/fbm_synth.c:478
+#: modules/process/fbm_synth.c:477
 msgid "distribution|Power"
 msgstr "Puissance"
 
@@ -9598,7 +9871,7 @@ msgstr "Imaginaire"
 msgid "Modulus"
 msgstr "Module"
 
-#: modules/process/fft.c:327 modules/process/wave_synth.c:583
+#: modules/process/fft.c:327 modules/process/wave_synth.c:618
 msgid "Phase"
 msgstr "Phase"
 
@@ -9614,63 +9887,63 @@ msgstr "Transformée directe"
 msgid "I_maginary part:"
 msgstr "Partie i_maginaire :"
 
-#: modules/process/fft.c:382
+#: modules/process/fft.c:380
 msgid "_Inverse transform"
 msgstr "Transformée _inverse"
 
-#: modules/process/fft.c:411
+#: modules/process/fft.c:409
 msgid "Subtract mean _value beforehand"
 msgstr "Soustraire d'abord la _valeur moyenne"
 
-#: modules/process/fft.c:422
+#: modules/process/fft.c:420
 msgid "_Preserve RMS"
 msgstr "Conserver le RMS"
 
-#: modules/process/fft_filter_1d.c:117
+#: modules/process/fft_filter_1d.c:118
 msgid "FFT filtering"
 msgstr "Filtrage FFT"
 
-#: modules/process/fft_filter_1d.c:131
+#: modules/process/fft_filter_1d.c:132
 msgid "/_Correct Data/1D _FFT Filtering..."
 msgstr "/_Correction des données/Filtrage _FFT 1D..."
 
-#: modules/process/fft_filter_1d.c:135
+#: modules/process/fft_filter_1d.c:136
 msgid "1D FFT Filtering"
 msgstr "Filtrage FFT 1D"
 
-#: modules/process/fft_filter_1d.c:165 modules/process/wpour_mark.c:391
+#: modules/process/fft_filter_1d.c:166 modules/process/wpour_mark.c:391
 msgid "Marked"
 msgstr "Marqué"
 
-#: modules/process/fft_filter_1d.c:166
+#: modules/process/fft_filter_1d.c:167
 msgid "Unmarked"
 msgstr "Non marqué"
 
-#: modules/process/fft_filter_1d.c:169
+#: modules/process/fft_filter_1d.c:170
 msgid "Null"
 msgstr "Nul"
 
-#: modules/process/fft_filter_1d.c:170
+#: modules/process/fft_filter_1d.c:171
 msgid "Suppress"
 msgstr "Supprimer"
 
-#: modules/process/fft_filter_1d.c:180
+#: modules/process/fft_filter_1d.c:181
 msgid "1D FFT filter"
 msgstr "Filtre FFT 1D"
 
-#: modules/process/fft_filter_1d.c:269 modules/process/linematch.c:861
+#: modules/process/fft_filter_1d.c:271 modules/process/linematch.c:828
 msgid "_Direction:"
 msgstr "_Direction :"
 
-#: modules/process/fft_filter_1d.c:277
+#: modules/process/fft_filter_1d.c:279
 msgid "_Suppress type:"
 msgstr "Type de _suppression :"
 
-#: modules/process/fft_filter_1d.c:285
+#: modules/process/fft_filter_1d.c:287
 msgid "_Filter type:"
 msgstr "Type de _filtre :"
 
-#: modules/process/fft_filter_1d.c:513
+#: modules/process/fft_filter_1d.c:515
 msgid "1D FFT Filtered Data"
 msgstr "Données filtrées après FFT 1D"
 
@@ -9690,9 +9963,10 @@ msgstr "Filtrage FFT bi-dimensionnelle"
 msgid "Filtered Data"
 msgstr "Données filtrées"
 
-#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:594
-#: modules/process/fit-shape.c:643 modules/process/fit-shape.c:658
-#: modules/process/fit-shape.c:662 modules/process/neural.c:560
+#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:604
+#: modules/process/fit-shape.c:653 modules/process/fit-shape.c:668
+#: modules/process/fit-shape.c:672 modules/process/neural.c:564
+#: modules/process/psf.c:232
 msgid "Difference"
 msgstr "Différence"
 
@@ -9748,7 +10022,7 @@ msgstr "Masque de filtre"
 msgid "_Undo"
 msgstr "_Annuler"
 
-#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:556
+#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:562
 msgid "_Fill"
 msgstr "Remplir"
 
@@ -9756,7 +10030,7 @@ msgstr "Remplir"
 msgid "_Snap to origin"
 msgstr "_S'accrocher à l'origine"
 
-#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:339
+#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:329
 msgid "Zoom:"
 msgstr "_Zoom :"
 
@@ -9792,39 +10066,39 @@ msgstr "Remplire complètement le masque filtre"
 msgid "Force shapes to center around the origin"
 msgstr "Forcer les formes à se centrer sur l'origine"
 
-#: modules/process/fft_profile.c:125
+#: modules/process/fft_profile.c:124
 msgid ""
 "Reads radial sections of two-dimensional power spectrum density function."
 msgstr ""
 "Lit des sections radiales de la densité spectrale de puissance bi-"
 "dimensionnelle (PSD)."
 
-#: modules/process/fft_profile.c:140
+#: modules/process/fft_profile.c:139
 msgid "/_Statistics/_PSDF Section..."
 msgstr "/_Statistiques/Section de PSD..."
 
-#: modules/process/fft_profile.c:144
+#: modules/process/fft_profile.c:143
 msgid "Read radial PSDF sections"
 msgstr "Lire des sections radiales de PSD"
 
-#: modules/process/fft_profile.c:190
+#: modules/process/fft_profile.c:189
 msgid "Radial PSDF Section"
 msgstr "Section radiale de PSD"
 
-#: modules/process/fft_profile.c:237
+#: modules/process/fft_profile.c:236
 msgid "PSDF Section"
 msgstr "Section de PSD"
 
-#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:336
-#: modules/tools/profile.c:517 modules/tools/sfunctions.c:443
-msgid "_Fix res.:"
+#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:338
+#: modules/tools/profile.c:514 modules/tools/sfunctions.c:454
+msgid "_Fixed resolution:"
 msgstr "Résolution _fixe :"
 
-#: modules/process/fft_profile.c:279
+#: modules/process/fft_profile.c:278
 msgid "_Separate curves"
 msgstr "Courbes _séparées"
 
-#: modules/process/fft_profile.c:496
+#: modules/process/fft_profile.c:483
 #, c-format
 msgid "PSDF %.0f°"
 msgstr "PSD %.0f°"
@@ -9845,11 +10119,15 @@ msgstr "Générer une surface en utilisant la synthèse spectrale"
 msgid "Spectral Synthesis"
 msgstr "Synthèse spectrale"
 
-#: modules/process/fft_synth.c:429
+#: modules/process/fft_synth.c:430
 msgid "M_inimum frequency:"
 msgstr "Fréquence m_inimum :"
 
-#: modules/process/fft_synth.c:449
+#: modules/process/fft_synth.c:430 modules/process/fft_synth.c:450
+msgid "px<sup>-1</sup>"
+msgstr "px<sup>-1</sup>"
+
+#: modules/process/fft_synth.c:450
 msgid "Ma_ximum frequency:"
 msgstr "Fréquence ma_ximum :"
 
@@ -9869,85 +10147,156 @@ msgstr "Activer le multiplicateur _lorentzien"
 msgid "Enable _power multiplier"
 msgstr "Activer le multiplicateur _puissance"
 
-#: modules/process/fit-shape.c:270
+#: modules/process/fibre_synth.c:256
+msgid "Semi-circle"
+msgstr "Demi-cercle"
+
+#: modules/process/fibre_synth.c:257
+msgid "Triangle"
+msgstr "Triangle"
+
+#: modules/process/fibre_synth.c:258
+msgid "Rectangle"
+msgstr "Rectangle"
+
+#: modules/process/fibre_synth.c:260
+msgid "Quadratic spline"
+msgstr "Spline quadratique"
+
+#: modules/process/fibre_synth.c:266
+msgid "Generates surfaces composed from randomly placed fibers."
+msgstr "Génère une surface composée de fibres disposées aléatoirement"
+
+#: modules/process/fibre_synth.c:280
+msgid "/S_ynthetic/_Deposition/_Fibers..."
+msgstr "/S_ynthèse/_Dépôt/_Fibres..."
+
+#: modules/process/fibre_synth.c:284
+msgid "Generate surface of randomly placed fibers"
+msgstr "Générer une surface composée de fibres disposées aléatoirement"
+
+#: modules/process/fibre_synth.c:420
+msgid "Random Fibers"
+msgstr "Fibres aléatoires"
+
+#: modules/process/fibre_synth.c:494 modules/process/obj_synth.c:510
+msgid "_Shape:"
+msgstr "Forme :"
+
+#: modules/process/fibre_synth.c:513 modules/process/obj_synth.c:529
+msgid "obj."
+msgstr "obj."
+
+#: modules/process/fibre_synth.c:553
+#, fuzzy
+msgid "Scales _with width"
+msgstr "Mettre à l'échelle avec la taille"
+
+#: modules/process/fibre_synth.c:591 modules/process/synth.h:485
+msgid "Deformation"
+msgstr "Déformation"
+
+#: modules/process/fibre_synth.c:600 modules/process/lno_synth.c:852
+#: modules/process/lno_synth.c:1222 modules/process/mask_noisify.c:177
+msgid "Densi_ty:"
+msgstr "Densi_té :"
+
+#: modules/process/fibre_synth.c:607
+msgid "_Lateral:"
+msgstr "_Latéral :"
+
+#: modules/process/fibre_synth.c:614
+#, fuzzy
+msgid "Le_ngthwise:"
+msgstr "_Longueur :"
+
+#: modules/process/fibre_synth.c:819
+msgid "Along fiber:"
+msgstr "Le long de la fibre"
+
+#: modules/process/fibre_synth.c:1180
+msgid "Generating fibers..."
+msgstr "Génération des fibres..."
+
+#: modules/process/fit-shape.c:264
 msgid "Fits predefined geometrical shapes to data."
 msgstr "Ajuste des formes géométriques prédéfinies aux données."
 
-#: modules/process/fit-shape.c:284
+#: modules/process/fit-shape.c:278
 msgid "/_Level/_Fit Shape..."
 msgstr "/Niveau/Ajuster une _forme..."
 
-#: modules/process/fit-shape.c:288 modules/process/fit-shape.c:295
+#: modules/process/fit-shape.c:282 modules/process/fit-shape.c:289
 msgid "Fit geometrical shapes"
 msgstr "Ajuste des formes géométriques"
 
-#: modules/process/fit-shape.c:291
+#: modules/process/fit-shape.c:285
 msgid "/_Fit Shape..."
 msgstr "/Ajuster une _forme..."
 
-#: modules/process/fit-shape.c:390
+#: modules/process/fit-shape.c:389
 msgid "Fit Shape"
 msgstr "Forme ajustée"
 
-#: modules/process/fit-shape.c:395
+#: modules/process/fit-shape.c:396
 msgid "verb|_Quick Fit"
 msgstr "Ajuster rapidement"
 
-#: modules/process/fit-shape.c:473 modules/process/fit-shape.c:2159
+#: modules/process/fit-shape.c:474 modules/process/fit-shape.c:2141
 msgid "Derived Quantities"
 msgstr "Quantités dérivées"
 
-#: modules/process/fit-shape.c:478 modules/process/fit-shape.c:2129
+#: modules/process/fit-shape.c:479 modules/process/fit-shape.c:2111
 msgid "Mean square difference:"
 msgstr "Différence quadratique moyenne"
 
-#: modules/process/fit-shape.c:580 modules/process/fit-shape.c:626
-#: modules/process/fit-shape.c:657 modules/process/fit-shape.c:661
+#: modules/process/fit-shape.c:590 modules/process/fit-shape.c:636
+#: modules/process/fit-shape.c:667 modules/process/fit-shape.c:671
 msgid "Fitted shape"
 msgstr "Forme ajustée"
 
-#: modules/process/fit-shape.c:663 modules/process/mark_disconn.c:189
-#: modules/process/scars.c:281
+#: modules/process/fit-shape.c:673 modules/process/mark_disconn.c:189
+#: modules/process/scars.c:299
 msgid "Both"
 msgstr "Les deux"
 
-#: modules/process/fit-shape.c:680
+#: modules/process/fit-shape.c:690 modules/process/psf-fit.c:308
 msgid "_Function type:"
 msgstr "Type de _fonction :"
 
-#: modules/process/fit-shape.c:708
+#: modules/process/fit-shape.c:720
 msgid "Show differences with _adapted color map"
 msgstr "Afficher l'écart avec une échelle de couleur _adaptée"
 
-#: modules/process/fit-shape.c:720
+#: modules/process/fit-shape.c:732
 msgid "Full fit is _geometric"
 msgstr "L'ajustement complet est _géométrique"
 
-#: modules/process/fit-shape.c:757
+#: modules/process/fit-shape.c:769
 msgid "Calculate differences for e_xcluded pixels"
 msgstr "Calculer la différence pour les pixels exclus"
 
-#: modules/process/fit-shape.c:804
+#: modules/process/fit-shape.c:816
 msgid "_Recalculate Image"
 msgstr "_Recalculer l'image"
 
-#: modules/process/fit-shape.c:811
+#: modules/process/fit-shape.c:823
 msgid "Revert to _Previous Values"
 msgstr "Retourner aux valeurs précédentes"
 
-#: modules/process/fit-shape.c:1850
+#: modules/process/fit-shape.c:1864
 msgid "Parameter estimation failed"
 msgstr "Échec de l'estimation des paramètres"
 
-#: modules/process/fit-shape.c:1853
+#: modules/process/fit-shape.c:1867
 msgid "Fit failed"
 msgstr "Échec de l'ajustement"
 
-#: modules/process/fit-shape.c:1855
+#: modules/process/fit-shape.c:1869
 msgid "Fit was interruped"
 msgstr "Ajustement interrompu"
 
-#: modules/process/fit-shape.c:2115
+#: modules/process/fit-shape.c:2097
 msgid "(fixed)"
 msgstr "(fixé)"
 
@@ -9967,37 +10316,37 @@ msgstr "Aplanir la base d'une surface ayant des éléments en relief"
 msgid "Polynomial leveling..."
 msgstr "Mise à niveau par polynôme..."
 
-#: modules/process/fraccor.c:38
+#: modules/process/fraccor.c:39
 msgid "Removes data under mask using fractal interpolation."
 msgstr ""
 "Supprime les données sous le masque à l'aide d'une interpolation fractale."
 
-#: modules/process/fraccor.c:52
+#: modules/process/fraccor.c:53
 msgid "/_Correct Data/_Fractal Correction"
 msgstr "/_Correction des données/Correction _fractale"
 
-#: modules/process/fraccor.c:56
+#: modules/process/fraccor.c:57
 msgid "Interpolate data under mask with fractal interpolation"
 msgstr ""
 "Interpole les données sous le masque à l'aide d'une interpolation fractale."
 
-#: modules/process/fractal.c:134
+#: modules/process/fractal.c:130
 msgid "Partitioning"
 msgstr "Partitionnement"
 
-#: modules/process/fractal.c:135
+#: modules/process/fractal.c:131
 msgid "Cube counting"
 msgstr "Comptage de cubes"
 
-#: modules/process/fractal.c:136
+#: modules/process/fractal.c:132
 msgid "Triangulation"
 msgstr "Triangulation"
 
-#: modules/process/fractal.c:137
+#: modules/process/fractal.c:133
 msgid "Power spectrum"
 msgstr "Spectre de puissance"
 
-#: modules/process/fractal.c:173
+#: modules/process/fractal.c:169
 msgid ""
 "Calculates fractal dimension using several methods (partitioning, box "
 "counting, triangulation, power spectrum)."
@@ -10005,54 +10354,50 @@ msgstr ""
 "Calcule la dimension fractale suivant différentes méthodes (partition, "
 "comptage de boîtes, triangulation, spectre de puissance)."
 
-#: modules/process/fractal.c:188
+#: modules/process/fractal.c:184
 msgid "/_Statistics/_Fractal Dimension..."
 msgstr "/_Statistiques/Dimension _fractale..."
 
-#: modules/process/fractal.c:192
+#: modules/process/fractal.c:188
 msgid "Calculate fractal dimension"
 msgstr "Calculer la dimension fractale"
 
-#: modules/process/fractal.c:227
+#: modules/process/fractal.c:223
 msgid "Fractal Dimension"
 msgstr "Dimension fractale"
 
-#: modules/process/fractal.c:228
-msgid "Reco_mpute"
-msgstr "Recalculer"
-
-#: modules/process/fractal.c:269
+#: modules/process/fractal.c:253
 msgid "_Method:"
 msgstr "_Méthode :"
 
-#: modules/process/fractal.c:290
+#: modules/process/fractal.c:269
 msgid "Fit Area"
 msgstr "Ajuster la surface"
 
-#: modules/process/fractal.c:295
-msgid "From:"
-msgstr "À partir de :"
-
-#: modules/process/fractal.c:295 modules/process/fractal.c:589
-#: modules/process/fractal.c:613
+#: modules/process/fractal.c:273 modules/process/fractal.c:545
+#: modules/process/fractal.c:569
 msgid "minimum"
 msgstr "minimum"
 
-#: modules/process/fractal.c:298
-msgid "To:"
-msgstr "Jusqu'à"
+#: modules/process/fractal.c:274
+msgid "From:"
+msgstr "À partir de :"
 
-#: modules/process/fractal.c:298 modules/process/fractal.c:590
-#: modules/process/fractal.c:614
+#: modules/process/fractal.c:279 modules/process/fractal.c:546
+#: modules/process/fractal.c:570
 msgid "maximum"
 msgstr "maximum"
 
-#: modules/process/fractal.c:308 modules/process/mark_with.c:390
-#: modules/process/neural.c:559
+#: modules/process/fractal.c:280
+msgid "To:"
+msgstr "Jusqu'à"
+
+#: modules/process/fractal.c:287 modules/process/mark_with.c:394
+#: modules/process/neural.c:563
 msgid "Result"
 msgstr "Résultat"
 
-#: modules/process/fractal.c:550
+#: modules/process/fractal.c:506
 msgid "Linear fit"
 msgstr "Ajustement linéaire"
 
@@ -10125,11 +10470,11 @@ msgstr ""
 msgid "Grain Correlations"
 msgstr "Corrélations des grains"
 
-#: modules/process/grain_cross.c:240
+#: modules/process/grain_cross.c:241
 msgid "_Abscissa"
 msgstr "_Abscisse"
 
-#: modules/process/grain_cross.c:244
+#: modules/process/grain_cross.c:245
 msgid "O_rdinate"
 msgstr "O_rdonnée"
 
@@ -10157,120 +10502,120 @@ msgstr "Dessiner les _graphes"
 msgid "Grain Distributions"
 msgstr "Distribution des grains"
 
-#: modules/process/grain_dist.c:553
+#: modules/process/grain_dist.c:547
 msgid "count"
 msgstr "quantité"
 
-#: modules/process/grain_dist.c:617
+#: modules/process/grain_dist.c:611
 msgid "Export Raw Grain Values"
 msgstr "Exporter les données brutes des grains"
 
-#: modules/process/grain_edge.c:100
+#: modules/process/grain_edge.c:99
 msgid "Marks grains by edge detection method."
 msgstr "Marque les grains par la méthode de détection de bord."
 
-#: modules/process/grain_edge.c:114
+#: modules/process/grain_edge.c:113
 msgid "/_Grains/Mark by _Edge Detection..."
 msgstr "/_Grains/Marqu_er par détection de bord..."
 
-#: modules/process/grain_edge.c:118
+#: modules/process/grain_edge.c:117
 msgid "Mark grains with edge detection mechanism"
 msgstr "Marquer les grains par détection des bords"
 
-#: modules/process/grain_edge.c:207
+#: modules/process/grain_edge.c:206
 msgid "Mark Grains by Edge Detection"
 msgstr "Marquer les grains par détection de bord"
 
-#: modules/process/grain_edge.c:245
+#: modules/process/grain_edge.c:244
 msgid "Threshold"
 msgstr "Seuil"
 
-#: modules/process/grain_edge.c:249
+#: modules/process/grain_edge.c:248
 msgid "_Laplacian:"
 msgstr "_Laplacien :"
 
-#: modules/process/grain_filter.c:195
+#: modules/process/grain_filter.c:194
 msgid ""
 "Filters grains by their properties, using logical expressions and thresholds."
 msgstr ""
 "Filtre les grains en fonction de leurs propriétés, à l'aide d'expressions "
 "logiques et de seuils."
 
-#: modules/process/grain_filter.c:210
+#: modules/process/grain_filter.c:209
 msgid "/_Grains/_Filter..."
 msgstr "/_Grains/_Filtrer..."
 
-#: modules/process/grain_filter.c:214
+#: modules/process/grain_filter.c:213
 msgid "Filter grains by their properties"
 msgstr "Filtrer les grains en fonction de leurs propriétés"
 
-#: modules/process/grain_filter.c:254
+#: modules/process/grain_filter.c:253
 msgid "There are no grains to filter."
 msgstr "Aucun grain à filtrer."
 
-#: modules/process/grain_filter.c:310
+#: modules/process/grain_filter.c:309
 msgid "Filter Grains"
 msgstr "Filtrer les grains"
 
-#: modules/process/grain_filter.c:405
+#: modules/process/grain_filter.c:404
 msgid "Set selected as:"
 msgstr "Assigner à :"
 
-#: modules/process/grain_filter.c:420
+#: modules/process/grain_filter.c:419
 msgid "Keep grains satisfying:"
 msgstr "Conserver les grains satisfaisant :"
 
-#: modules/process/grain_filter.c:434 modules/process/lat_synth.c:733
+#: modules/process/grain_filter.c:440 modules/process/lat_synth.c:733
 msgid "Lower threshold:"
 msgstr "Seuil bas : "
 
-#: modules/process/grain_filter.c:469 modules/process/lat_synth.c:740
+#: modules/process/grain_filter.c:467 modules/process/lat_synth.c:740
 msgid "Upper threshold:"
 msgstr "Seuil haut : "
 
 #. TRANSLATORS: %c is replaced with quantity label A, B or C.
-#: modules/process/grain_filter.c:645
+#: modules/process/grain_filter.c:628
 #, c-format
 msgid "Condition %c: %s"
 msgstr "Condition %c : %s"
 
-#: modules/process/grain_mark.c:139
+#: modules/process/grain_mark.c:137
 msgid "Marks grains by thresholding (height, slope, curvature)."
 msgstr "Marquer les grains par seuillage (hauteur, pente, courbure)."
 
-#: modules/process/grain_mark.c:153
+#: modules/process/grain_mark.c:151
 msgid "/_Grains/_Mark by Threshold..."
 msgstr "/_Grains/_Marquer par seuil..."
 
-#: modules/process/grain_mark.c:157
+#: modules/process/grain_mark.c:155
 msgid "Mark grains by threshold"
 msgstr "Marquer les grains par seuil"
 
-#: modules/process/grain_mark.c:241
+#: modules/process/grain_mark.c:240
 msgid "Mark Grains by Threshold"
 msgstr "Marquer les grains par seuil"
 
-#: modules/process/grain_mark.c:281
+#: modules/process/grain_mark.c:280
 msgid "Threshold by"
 msgstr "Seuillage par"
 
-#: modules/process/grain_mark.c:311
+#: modules/process/grain_mark.c:310
 msgid "_Slope:"
 msgstr "Pente :"
 
-#: modules/process/grain_mark.c:315
+#: modules/process/grain_mark.c:314
 msgid "_Curvature:"
 msgstr "_Courbure :"
 
-#: modules/process/grain_mark.c:324
-msgid "Criteria combination:"
-msgstr "Combinaison de critères :"
-
-#: modules/process/grain_mark.c:328 modules/process/grain_wshed.c:256
+#: modules/process/grain_mark.c:319 modules/process/grain_wshed.c:260
 #: modules/process/wpour_mark.c:358
 msgid "_Invert height"
 msgstr "_Inverser les hauteurs"
 
+#: modules/process/grain_mark.c:328
+msgid "Criteria combination:"
+msgstr "Combinaison de critères :"
+
 #: modules/process/grain_stat.c:54
 msgid "Displays overall grain statistics."
 msgstr "Affiche les statistiques globales des grains."
@@ -10301,7 +10646,7 @@ msgstr "Créer une sélection donnant les cercles circonscrits aux grains"
 
 #: modules/process/grain_stat.c:141
 msgid "Save Grain Statistics"
-msgstr "Sauver les statistiques des grains"
+msgstr "Enregistrer les statistiques des grains"
 
 #: modules/process/grain_stat.c:192
 msgid "Data channel:"
@@ -10347,419 +10692,428 @@ msgstr "Volume de grain total (base laplacienne) :"
 msgid "Total projected boundary length:"
 msgstr "Périmètre projeté : "
 
-#: modules/process/grain_wshed.c:101
+#: modules/process/grain_wshed.c:102
 msgid "Marks grains by watershed algorithm."
 msgstr ""
 "Marque les grains à l'aide d'un algorithme de ligne de partage des eaux "
 "(segmentation)."
 
-#: modules/process/grain_wshed.c:115
+#: modules/process/grain_wshed.c:116
 msgid "/_Grains/Mark by _Watershed..."
 msgstr "/_Grains/Marquer par ligne de partage des eaux..."
 
-#: modules/process/grain_wshed.c:119
+#: modules/process/grain_wshed.c:120
 msgid "Mark grains by watershed"
 msgstr "Marquer les grains par lignes de partage des eaux (segmentation)"
 
-#: modules/process/grain_wshed.c:161
+#: modules/process/grain_wshed.c:162
 msgid "Mark Grains by Watershed"
 msgstr "Marquer les grains par ligne de partage des eaux (segmentation)"
 
-#: modules/process/grain_wshed.c:199
+#: modules/process/grain_wshed.c:200
 msgid "Grain Location"
 msgstr "Localisation des grains"
 
-#: modules/process/grain_wshed.c:214
+#: modules/process/grain_wshed.c:216
 msgid "_Drop size:"
 msgstr "Taille _de goutte :"
 
-#: modules/process/grain_wshed.c:230
+#: modules/process/grain_wshed.c:233
 msgid "Segmentation"
 msgstr "Segmentation"
 
-#: modules/process/grain_wshed.c:236
+#: modules/process/grain_wshed.c:239
 msgid "Num_ber of steps:"
 msgstr "Nom_bre de pas :"
 
-#: modules/process/grain_wshed.c:244
+#: modules/process/grain_wshed.c:248
 msgid "Dr_op size:"
 msgstr "Taille de g_outte :"
 
-#: modules/process/grain_wshed.c:435
+#: modules/process/grain_wshed.c:439
 msgid "Finding minima..."
 msgstr "Recherche des minima..."
 
-#: modules/process/grain_wshed.c:437
+#: modules/process/grain_wshed.c:441
 msgid "Locating..."
 msgstr "Localisation..."
 
-#: modules/process/grain_wshed.c:439
+#: modules/process/grain_wshed.c:443
 msgid "Simulating watershed..."
 msgstr "Segmentation..."
 
-#: modules/process/grain_wshed.c:441
+#: modules/process/grain_wshed.c:445
 msgid "Marking boundaries..."
 msgstr "Marquage des limites..."
 
-#: modules/process/hough.c:74
+#: modules/process/hough.c:76
 msgid "Hough transform."
 msgstr "Transformée de Hough."
 
-#: modules/process/hough.c:88
+#: modules/process/hough.c:90
 msgid "/_Integral Transforms/_Hough..."
 msgstr "/Transformées/_Hough..."
 
-#: modules/process/hough.c:92
+#: modules/process/hough.c:94
 msgid "Compute Hough transform"
 msgstr "Calculer la transformée de Hough"
 
-#: modules/process/hough.c:178
+#: modules/process/hough.c:137
+msgid "Hough line"
+msgstr "Ligne de Hough"
+
+#: modules/process/hough.c:141
+#, c-format
+msgid "Hough circle r=%d"
+msgstr "Cercle de Hough r = %d"
+
+#: modules/process/hough.c:173
 msgid "Hough Transform"
 msgstr "Transformée de Hough"
 
-#: modules/process/hough.c:201
+#: modules/process/hough.c:195
 msgid "_Transform type:"
 msgstr "_Type de transformée :"
 
-#: modules/process/hough.c:212
+#: modules/process/hough.c:203
 msgid "_Circle size:"
 msgstr "Taille du _cercle : "
 
-#: modules/process/immerse.c:162
+#: modules/process/immerse.c:163
 msgid "Immerse high resolution detail into overall image."
 msgstr "Incruste un détail à haute résolution dans une image."
 
-#: modules/process/immerse.c:176
+#: modules/process/immerse.c:177
 msgid "/M_ultidata/_Immerse Detail..."
 msgstr "/M_ultidonnées/_Incruster un détail..."
 
-#: modules/process/immerse.c:180
+#: modules/process/immerse.c:181
 msgid "Immerse a detail into image"
 msgstr "Incruste un détail dans une image"
 
-#: modules/process/immerse.c:222
+#: modules/process/immerse.c:223
 msgid "Immerse Detail"
 msgstr "Incruster un détail"
 
-#: modules/process/immerse.c:225
+#: modules/process/immerse.c:226
 msgid "_Locate"
 msgstr "_Localiser"
 
-#: modules/process/immerse.c:227
+#: modules/process/immerse.c:228
 msgid "Locate detail by full image correlation search"
 msgstr ""
 "Localise le détail grâce à une recherche par corrélation sur l'image entière"
 
-#: modules/process/immerse.c:229
+#: modules/process/immerse.c:230
 msgid "_Improve"
 msgstr "Amél_iorer"
 
-#: modules/process/immerse.c:231
+#: modules/process/immerse.c:232
 msgid "Improve detail position by correlation search in neighborhood"
 msgstr "Améliorer la position d'un détail par corrélation avec le voisinage."
 
-#: modules/process/immerse.c:290
+#: modules/process/immerse.c:291
 msgid "_Detail image:"
 msgstr "Image du _détail :"
 
-#: modules/process/immerse.c:295
+#: modules/process/immerse.c:296
 msgid "Position:"
 msgstr "Position :"
 
-#: modules/process/immerse.c:308
+#: modules/process/immerse.c:314
 msgid "Result Sampling"
 msgstr "Résultat de l'échantillonnage"
 
-#: modules/process/immerse.c:318
+#: modules/process/immerse.c:324
 msgid "_Upsample large image"
 msgstr "S_ur-échantilloner l'image globale"
 
-#: modules/process/immerse.c:320
+#: modules/process/immerse.c:326
 msgid "_Downsample detail"
 msgstr "Sous-échantillonner le détail"
 
-#: modules/process/immerse.c:329
+#: modules/process/immerse.c:335
 msgid "Detail Leveling"
 msgstr "Mise à niveau du détail"
 
-#: modules/process/immerse.c:339
+#: modules/process/immerse.c:345
 msgid "levelling|_None"
 msgstr "Aucu_ne"
 
-#: modules/process/immerse.c:341
+#: modules/process/immerse.c:347
 msgid "_Mean value"
 msgstr "Valeur moyenne"
 
-#: modules/process/immerse.c:349
+#: modules/process/immerse.c:355
 msgid "Show _frame"
 msgstr "Montrer la grille"
 
-#: modules/process/immerse.c:787
+#: modules/process/immerse.c:793
 msgid "Immersed detail"
 msgstr "Détail inséré"
 
-#: modules/process/indent_analyze.c:261
+#: modules/process/indent_analyze.c:246
 msgid "Do nothing"
 msgstr "Ne rien faire"
 
-#: modules/process/indent_analyze.c:262
+#: modules/process/indent_analyze.c:247
 msgid "Plane level"
 msgstr "Niveau plan"
 
-#: modules/process/indent_analyze.c:263
+#: modules/process/indent_analyze.c:248
 msgid "Plane rotate"
 msgstr "Rotation du plan"
 
-#: modules/process/indent_analyze.c:267
+#: modules/process/indent_analyze.c:252
 msgid "New"
 msgstr "Nouveau"
 
-#: modules/process/indent_analyze.c:268
+#: modules/process/indent_analyze.c:253
 msgid "AND"
 msgstr "ET"
 
-#: modules/process/indent_analyze.c:269
+#: modules/process/indent_analyze.c:254
 msgid "OR"
 msgstr "OU"
 
-#: modules/process/indent_analyze.c:270
+#: modules/process/indent_analyze.c:255
 msgid "NOT"
 msgstr "NON"
 
-#: modules/process/indent_analyze.c:271
+#: modules/process/indent_analyze.c:256
 msgid "XOR"
 msgstr "OU exclusif"
 
-#: modules/process/indent_analyze.c:275
+#: modules/process/indent_analyze.c:260
 msgid "Nothing"
 msgstr "Aucune"
 
-#: modules/process/indent_analyze.c:276
+#: modules/process/indent_analyze.c:261
 msgid "Above"
 msgstr "Au-dessus"
 
-#: modules/process/indent_analyze.c:277
+#: modules/process/indent_analyze.c:262
 msgid "Below"
 msgstr "En-dessous"
 
-#: modules/process/indent_analyze.c:278
+#: modules/process/indent_analyze.c:263
 msgid "Plane"
 msgstr "Plan"
 
-#: modules/process/indent_analyze.c:279
+#: modules/process/indent_analyze.c:264
 msgid "Impression"
 msgstr "Impression"
 
-#: modules/process/indent_analyze.c:280
+#: modules/process/indent_analyze.c:265
 msgid "Inner Pile-up"
 msgstr "Enfoncement"
 
-#: modules/process/indent_analyze.c:281
+#: modules/process/indent_analyze.c:266
 msgid "Outer Pile-up"
 msgstr "Débordement"
 
-#: modules/process/indent_analyze.c:282
+#: modules/process/indent_analyze.c:267
 msgid "Special points"
 msgstr "Points spéciaux"
 
-#: modules/process/indent_analyze.c:283
+#: modules/process/indent_analyze.c:268
 msgid "Faces border"
 msgstr "Bord des faces"
 
-#: modules/process/indent_analyze.c:287
+#: modules/process/indent_analyze.c:272
 msgid "Vickers"
 msgstr "Vickers"
 
-#: modules/process/indent_analyze.c:288
+#: modules/process/indent_analyze.c:273
 msgid "Berkovich"
 msgstr "Berkovich"
 
-#: modules/process/indent_analyze.c:289
+#: modules/process/indent_analyze.c:274
 msgid "Berkovich (modified)"
 msgstr "Berkovich (modifié)"
 
-#: modules/process/indent_analyze.c:290
+#: modules/process/indent_analyze.c:275
 msgid "Knoop"
 msgstr "Knoop"
 
-#: modules/process/indent_analyze.c:291
+#: modules/process/indent_analyze.c:276
 msgid "Brinell"
 msgstr "Brinell"
 
-#: modules/process/indent_analyze.c:292
+#: modules/process/indent_analyze.c:277
 msgid "Cube corner"
 msgstr "Coin de cube"
 
-#: modules/process/indent_analyze.c:293
+#: modules/process/indent_analyze.c:278
 msgid "Rockwell"
 msgstr "Rockwell"
 
-#: modules/process/indent_analyze.c:303
+#: modules/process/indent_analyze.c:288
 msgid "Analyses nanoindentation structure (volumes, surfaces, ...)."
 msgstr "Analyse les structures de nano-indentation (volumes, surfaces...)."
 
-#: modules/process/indent_analyze.c:320
+#: modules/process/indent_analyze.c:302
 msgid "/_Tip and Indentation/_Analyze Imprint..."
 msgstr "/Sonde et indentation/_Analyser l'empreinte..."
 
-#: modules/process/indent_analyze.c:439
+#: modules/process/indent_analyze.c:410
 msgid "Marked _areas:"
 msgstr "Zones m_arquées"
 
-#: modules/process/indent_analyze.c:445
+#: modules/process/indent_analyze.c:419
 msgid "_Indentor type:"
 msgstr "Type d'_indenteur :"
 
-#: modules/process/indent_analyze.c:451
+#: modules/process/indent_analyze.c:428
 msgid "_Mask creation type:"
 msgstr "Type de création de _masque : "
 
-#: modules/process/indent_analyze.c:456
+#: modules/process/indent_analyze.c:434
 msgid "Ref. plane _tolerance:"
 msgstr "_Tolérance du plan de référence :"
 
-#: modules/process/indent_analyze.c:460
+#: modules/process/indent_analyze.c:438
 msgid "Angle _1 tolerance:"
 msgstr "Tolérance angle _1 :"
 
-#: modules/process/indent_analyze.c:485
+#: modules/process/indent_analyze.c:456
 msgid "Indent center at"
 msgstr "Centre de la nano-indentation à "
 
-#: modules/process/indent_analyze.c:488
+#: modules/process/indent_analyze.c:460
 msgid "Maximum at"
 msgstr "Maximum à "
 
-#: modules/process/indent_analyze.c:491
+#: modules/process/indent_analyze.c:464
 msgid "Max-min difference"
 msgstr "Différence max-min"
 
-#: modules/process/indent_analyze.c:497
+#: modules/process/indent_analyze.c:472
 msgid "Expected A<sub>d</sub>:"
 msgstr "A<sub>d</sub> attendu :"
 
-#: modules/process/indent_analyze.c:505
+#: modules/process/indent_analyze.c:479
 msgid "Expected A<sub>p</sub>:"
 msgstr "A<sub>p</sub> attendu :"
 
-#: modules/process/indent_analyze.c:549
+#: modules/process/indent_analyze.c:489
 msgid "Volume above-below"
 msgstr "Volume au-dessus / en-dessous"
 
-#: modules/process/indent_analyze.c:558
+#: modules/process/indent_analyze.c:494
 msgid "Indent. volume"
 msgstr "Volume d'indentation"
 
-#: modules/process/indent_analyze.c:564
+#: modules/process/indent_analyze.c:502
 msgid "Indent. A<sub>d</sub>"
 msgstr "Indentation A<sub>d</sub>"
 
-#: modules/process/indent_analyze.c:573
+#: modules/process/indent_analyze.c:509
 msgid "Indent. A<sub>p</sub>"
 msgstr "Indentation A<sub>p</sub>"
 
-#: modules/process/indent_analyze.c:587
+#: modules/process/indent_analyze.c:517
 msgid "Inner Pile-Up A<sub>d</sub>"
 msgstr "Enfoncement A<sub>d</sub>"
 
-#: modules/process/indent_analyze.c:596
+#: modules/process/indent_analyze.c:525
 msgid "Inner Pile-Up A<sub>p</sub>"
 msgstr "Enfoncement A<sub>p</sub>"
 
-#: modules/process/indent_analyze.c:605
+#: modules/process/indent_analyze.c:533
 msgid "Outer Pile-Up A<sub>d</sub>"
 msgstr "Débordement A<sub>d</sub>"
 
-#: modules/process/indent_analyze.c:614
+#: modules/process/indent_analyze.c:541
 msgid "Outer Pile-Up A<sub>p</sub>"
 msgstr "Débordement  A<sub>p</sub>"
 
-#: modules/process/indent_analyze.c:644
+#: modules/process/indent_analyze.c:569
 msgid "Indentation statistics"
 msgstr "Statistiques d'indentation"
 
-#: modules/process/indent_analyze.c:645
+#: modules/process/indent_analyze.c:570
 msgid "_Compute & mark"
 msgstr "_Calculer et marquer"
 
-#: modules/process/indent_analyze.c:646
+#: modules/process/indent_analyze.c:571
 msgid "_Save statistics"
 msgstr "_Sauvegarder les statistiques"
 
-#: modules/process/indent_analyze.c:1569
+#: modules/process/indent_analyze.c:1392
 msgid "No statistics has been computed yet."
 msgstr "Aucune statistique n'a encore été calculée."
 
-#: modules/process/indent_analyze.c:1577
+#: modules/process/indent_analyze.c:1400
 msgid "Save Indentation Statistics"
 msgstr "Sauvegarde les statistiques d'indentation"
 
-#: modules/process/indent_analyze.c:1615
+#: modules/process/indent_analyze.c:1438
 #, c-format
 msgid "Indentor:  %s\n"
 msgstr "Indenteur :  %s\n"
 
-#: modules/process/indent_analyze.c:1619
+#: modules/process/indent_analyze.c:1442
 #, c-format
 msgid "Length units: %s\n"
 msgstr "Unité de longueur : %s\n"
 
-#: modules/process/indent_analyze.c:1621
+#: modules/process/indent_analyze.c:1444
 #, c-format
 msgid "Indentation center at [%d, %d] px:      %lf\n"
 msgstr "Centre de l'indentation à [%d, %d] px :      %lf\n"
 
-#: modules/process/indent_analyze.c:1623
+#: modules/process/indent_analyze.c:1446
 #, c-format
 msgid "Maximum at [%d, %d] is:                 %lf\n"
 msgstr "Le maximum à [%d, %d] est :                 %lf\n"
 
-#: modules/process/indent_analyze.c:1625
+#: modules/process/indent_analyze.c:1448
 #, c-format
 msgid "Difference max-min:                     %lf\n"
 msgstr "Différence max-min :                      %lf\n"
 
-#: modules/process/indent_analyze.c:1630
+#: modules/process/indent_analyze.c:1453
 #, c-format
 msgid "Area (projected) above plane:             %g (%.1lf %%)\n"
 msgstr "Aire (projetée) au-dessus du plan :             %g (%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1634
+#: modules/process/indent_analyze.c:1457
 #, c-format
 msgid "Area (projected) below plane:             %g (%.1lf %%)\n"
 msgstr "Aire (projetée) en-dessous du plan :             %g (%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1638
+#: modules/process/indent_analyze.c:1461
 #, c-format
 msgid "Area (projected) of    plane:             %g (%.1lf %%)\n"
 msgstr "Aire (projetée) du plan :             %g (%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1643
+#: modules/process/indent_analyze.c:1466
 #, c-format
 msgid "Area (developed) above %g (+%.1f %%)\n"
 msgstr "Aire (développée) au-dessus %g (+%.1f %%)\n"
 
-#: modules/process/indent_analyze.c:1646
+#: modules/process/indent_analyze.c:1469
 #, c-format
 msgid "Area (developed) below %g (+%.1lf %%)\n"
 msgstr "Aire (développée) en-dessous %g (+%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1650
+#: modules/process/indent_analyze.c:1473
 #, c-format
 msgid "Volume above:     %g\n"
 msgstr "Volume au-dessus :     %g\n"
 
-#: modules/process/indent_analyze.c:1652
+#: modules/process/indent_analyze.c:1475
 #, c-format
 msgid "Volume below:     %g\n"
 msgstr "Volume en-dessous :     %g\n"
 
-#: modules/process/indent_analyze.c:1654
+#: modules/process/indent_analyze.c:1477
 #, c-format
 msgid "Volume difference %g\n"
 msgstr "Différence de volume  %g\n"
 
-#: modules/process/indent_analyze.c:1658
+#: modules/process/indent_analyze.c:1481
 msgid ""
 "\n"
 "Indentation\n"
@@ -10767,12 +11121,12 @@ msgstr ""
 "\n"
 "Indentation\n"
 
-#: modules/process/indent_analyze.c:1659
+#: modules/process/indent_analyze.c:1482
 #, c-format
 msgid "Volume      %g\n"
 msgstr "Volume :      %g\n"
 
-#: modules/process/indent_analyze.c:1664
+#: modules/process/indent_analyze.c:1487
 msgid ""
 "\n"
 "Indentation - Inner Pile-Up\n"
@@ -10780,7 +11134,7 @@ msgstr ""
 "\n"
 "Indentation - Enfoncement\n"
 
-#: modules/process/indent_analyze.c:1670
+#: modules/process/indent_analyze.c:1493
 msgid "Indentation - Outer Pile-Up\n"
 msgstr "Indentation - Débordement\n"
 
@@ -10890,11 +11244,6 @@ msgstr "Penrose (centres)"
 msgid "_Lattice:"
 msgstr "Mai_lle :"
 
-#: modules/process/lat_synth.c:651 modules/process/obj_synth.c:544
-#: modules/process/pat_synth.c:1457
-msgid "_Size:"
-msgstr "Dimen_sion :"
-
 #: modules/process/lat_synth.c:662
 msgid "Lattice rela_xation:"
 msgstr "Rela_xation du maillage :"
@@ -11034,7 +11383,7 @@ msgstr ""
 
 #: modules/process/level_grains.c:187 modules/process/median-bg.c:167
 #: modules/process/polylevel.c:293 modules/process/polylevel.c:417
-#: modules/process/sphere-revolve.c:200
+#: modules/process/sphere-revolve.c:221 modules/process/sphere-revolve.c:295
 msgid "Background"
 msgstr "Arrière-plan"
 
@@ -11046,150 +11395,150 @@ msgstr "Mise à niveau des grains"
 msgid "Quantity to level:"
 msgstr "Quantité à mettre à niveau :"
 
-#: modules/process/level_grains.c:231 modules/process/linematch.c:866
-#: modules/process/median-bg.c:217 modules/process/polylevel.c:482
-#: modules/process/sphere-revolve.c:263
+#: modules/process/level_grains.c:231 modules/process/linematch.c:834
+#: modules/process/median-bg.c:217 modules/process/polylevel.c:485
+#: modules/process/sphere-revolve.c:371
 msgid "E_xtract background"
 msgstr "E_xtraire l'arrière-plan"
 
-#: modules/process/linecorrect.c:54
+#: modules/process/linecorrect.c:52
 msgid "Corrects line defects (mostly experimental algorithms)."
 msgstr "Corrige les défauts des lignes (algorithmes expérimentaux)."
 
-#: modules/process/linecorrect.c:68
+#: modules/process/linecorrect.c:66
 msgid "/_Correct Data/Ste_p Line Correction"
 msgstr "/_Correction des données/Correction des sauts dans les lignes"
 
-#: modules/process/linecorrect.c:72
+#: modules/process/linecorrect.c:70
 msgid "Correct steps in lines"
 msgstr "Corriger les sauts dans les lignes"
 
-#: modules/process/linematch.c:158 modules/tools/linestats.c:166
+#: modules/process/linematch.c:155 modules/tools/linestats.c:166
 #: modules/volume/volume_linestat.c:143
 msgid "Median"
 msgstr "Médiane"
 
-#: modules/process/linematch.c:159
+#: modules/process/linematch.c:156
 msgid "Median of differences"
 msgstr "Médiane des différences"
 
-#: modules/process/linematch.c:160
+#: modules/process/linematch.c:157
 msgid "Modus"
 msgstr "Valeur dominante"
 
-#: modules/process/linematch.c:161
+#: modules/process/linematch.c:158
 msgid "linematch|Matching"
 msgstr "Correspondance"
 
-#: modules/process/linematch.c:162
+#: modules/process/linematch.c:159
 msgid "linematch|Polynomial"
 msgstr "Polynôme"
 
-#: modules/process/linematch.c:168
+#: modules/process/linematch.c:165
 msgid "Aligns rows by various methods."
 msgstr "Aligne les lignes à l'aide de différentes méthodes."
 
-#: modules/process/linematch.c:182
+#: modules/process/linematch.c:179
 msgid "/_Correct Data/_Align rows..."
 msgstr "/_Correction des données/_Aligner les lignes..."
 
-#: modules/process/linematch.c:186
+#: modules/process/linematch.c:183
 msgid "Align rows using various methods"
 msgstr "Aligne les lignes à l'aide de différentes méthodes"
 
-#: modules/process/linematch.c:237 modules/process/linematch.c:265
+#: modules/process/linematch.c:234 modules/process/linematch.c:262
 msgid "Row background"
 msgstr "Arrière-plan des lignes"
 
-#: modules/process/linematch.c:266
+#: modules/process/linematch.c:263
 msgid "Vertical position"
 msgstr "Position verticale"
 
-#: modules/process/linematch.c:267
+#: modules/process/linematch.c:264
 msgid "Corrected offset"
 msgstr "Décalage corrigé"
 
-#: modules/process/linematch.c:802
+#: modules/process/linematch.c:769
 msgid "Align Rows"
 msgstr "Aligner les lignes"
 
-#: modules/process/linematch.c:844
+#: modules/process/linematch.c:810
 msgid "_Polynomial degree:"
 msgstr "Degré du _polynôme :"
 
-#: modules/process/linematch.c:876
+#: modules/process/linematch.c:844
 msgid "Plot background _graph"
 msgstr "Afficher le graphe de l'arrière-plan"
 
-#: modules/process/lno_synth.c:261 modules/process/noise_synth.c:188
+#: modules/process/lno_synth.c:259 modules/process/noise_synth.c:186
 msgid "distribution|Triangular"
 msgstr "Triangulaire"
 
-#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:213
+#: modules/process/lno_synth.c:265 modules/process/pat_synth.c:213
 msgid "Steps"
 msgstr "Marches"
 
-#: modules/process/lno_synth.c:268
+#: modules/process/lno_synth.c:266
 msgid "Scars"
 msgstr "Défauts linéaires"
 
-#: modules/process/lno_synth.c:269 modules/process/pat_synth.c:214
+#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:214
 msgid "Ridges"
 msgstr "Créneaux"
 
-#: modules/process/lno_synth.c:275
+#: modules/process/lno_synth.c:273
 msgid "Generates various kinds of line noise."
 msgstr "Génère divers types de bruit linéaire."
 
-#: modules/process/lno_synth.c:289
+#: modules/process/lno_synth.c:287
 msgid "/S_ynthetic/_Line Noise..."
 msgstr "/S_ynthèse/Bruit _linéaire..."
 
-#: modules/process/lno_synth.c:293
+#: modules/process/lno_synth.c:291
 msgid "Generate line noise"
 msgstr "Génère un bruit linéaire"
 
-#: modules/process/lno_synth.c:431
+#: modules/process/lno_synth.c:429
 msgid "Line Noise"
 msgstr "Bruit linéaire"
 
-#: modules/process/lno_synth.c:504
+#: modules/process/lno_synth.c:502
 msgid "Distribution"
 msgstr "Distribution"
 
-#: modules/process/lno_synth.c:514 modules/process/noise_synth.c:414
-msgid "Direction:"
-msgstr "Direction :"
+#: modules/process/lno_synth.c:512 modules/process/mask_noisify.c:158
+#: modules/process/noise_synth.c:412
+msgid "Noise type:"
+msgstr "Type de bruit :"
 
-#: modules/process/lno_synth.c:523 modules/process/noise_synth.c:423
+#: modules/process/lno_synth.c:521 modules/process/mask_noisify.c:167
+#: modules/process/noise_synth.c:421
 msgid "S_ymmetrical"
 msgstr "S_ymétrique"
 
-#: modules/process/lno_synth.c:524 modules/process/noise_synth.c:424
+#: modules/process/lno_synth.c:522 modules/process/mask_noisify.c:168
+#: modules/process/noise_synth.c:422
 msgid "One-sided _positive"
 msgstr "Valeurs positives uniquement"
 
-#: modules/process/lno_synth.c:525 modules/process/noise_synth.c:425
+#: modules/process/lno_synth.c:523 modules/process/mask_noisify.c:169
+#: modules/process/noise_synth.c:423
 msgid "One-sided _negative"
 msgstr "Valeurs négatives seulement"
 
-#: modules/process/lno_synth.c:546
+#: modules/process/lno_synth.c:544
 msgid "Noise Type"
 msgstr "Type de bruit"
 
-#: modules/process/lno_synth.c:551
+#: modules/process/lno_synth.c:549
 msgid "_Noise type:"
 msgstr "Type de bruit :"
 
-#: modules/process/lno_synth.c:853 modules/process/lno_synth.c:1222
-msgid "Densi_ty:"
-msgstr "Densi_té :"
-
-#: modules/process/lno_synth.c:864 modules/process/lno_synth.c:1233
+#: modules/process/lno_synth.c:863 modules/process/lno_synth.c:1233
 msgid "_Within line:"
 msgstr "Dans les lignes :"
 
-#: modules/process/lno_synth.c:871
+#: modules/process/lno_synth.c:870
 msgid "C_umulative"
 msgstr "C_umulatif"
 
@@ -11245,31 +11594,31 @@ msgstr "Appliquer une régression"
 msgid "_Train logistic regression"
 msgstr "Apprentissage de la régression logistique"
 
-#: modules/process/logistic.c:275
+#: modules/process/logistic.c:274
 msgid "_Gaussian blur"
 msgstr "Flou _gaussien"
 
-#: modules/process/logistic.c:288
+#: modules/process/logistic.c:285
 msgid "_Number of Gaussians:"
 msgstr "_Nombre de gaussiennes :"
 
-#: modules/process/logistic.c:296
+#: modules/process/logistic.c:293
 msgid "_Sobel derivatives"
 msgstr "Dérivées de _Sobel :"
 
-#: modules/process/logistic.c:307
+#: modules/process/logistic.c:303
 msgid "_Laplacian"
 msgstr "_Laplacien"
 
-#: modules/process/logistic.c:318
+#: modules/process/logistic.c:313
 msgid "_Hessian"
 msgstr "_Hessienne"
 
-#: modules/process/logistic.c:331
+#: modules/process/logistic.c:325
 msgid "_Regularization parameter:"
 msgstr "Paramètre de _régularisation"
 
-#: modules/process/logistic.c:623 modules/process/neural.c:1101
+#: modules/process/logistic.c:616 modules/process/neural.c:1108
 msgid "Training..."
 msgstr "Apprentissage..."
 
@@ -11285,13 +11634,13 @@ msgstr "/_Correction des données/Marquer les points déconnectés..."
 msgid "Mark data disconnected from other values"
 msgstr "Marque les données éloignées des autres valeurs"
 
-#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:422
-#: modules/process/scars.c:279
+#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:419
+#: modules/process/scars.c:297
 msgid "Positive"
 msgstr "Positif"
 
-#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:423
-#: modules/process/scars.c:280
+#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:420
+#: modules/process/scars.c:298
 msgid "Negative"
 msgstr "Négatif"
 
@@ -11307,11 +11656,11 @@ msgstr "Type de défaut :"
 msgid "Defect _radius:"
 msgstr "_Rayon des défauts :"
 
-#: modules/process/mark_disconn.c:563
+#: modules/process/mark_disconn.c:552
 msgid "Filtering..."
 msgstr "Filtrage..."
 
-#: modules/process/mark_disconn.c:590
+#: modules/process/mark_disconn.c:579
 msgid "Marking outliers..."
 msgstr "Marquer les points aberrants..."
 
@@ -11327,55 +11676,59 @@ msgstr "/_Masque/Marquer avec..."
 msgid "Mask combining and modification"
 msgstr "Combinaison et modification de masque"
 
-#: modules/process/mark_with.c:192
+#: modules/process/mark_with.c:193
 msgid "Mark With"
 msgstr "Marquer avec"
 
-#: modules/process/mark_with.c:238
+#: modules/process/mark_with.c:231 modules/process/mask_morph.c:209
+msgid "Operation:"
+msgstr "Opération :"
+
+#: modules/process/mark_with.c:239
 msgid "Se_t mask"
 msgstr "Ajus_ter le masque"
 
-#: modules/process/mark_with.c:239
+#: modules/process/mark_with.c:240
 msgid "_Add mask"
 msgstr "_Ajouter un masque"
 
-#: modules/process/mark_with.c:240
+#: modules/process/mark_with.c:241
 msgid "_Subtract mask"
 msgstr "_Soustraire le masque"
 
-#: modules/process/mark_with.c:241
+#: modules/process/mark_with.c:242
 msgid "_Intersect masks"
 msgstr "_Intersection des masques"
 
-#: modules/process/mark_with.c:247
+#: modules/process/mark_with.c:248
 msgid "Mark with:"
 msgstr "Marquer avec :"
 
-#: modules/process/mark_with.c:255
+#: modules/process/mark_with.c:256
 msgid "with|_Mask"
 msgstr "_Masque"
 
-#: modules/process/mark_with.c:257
+#: modules/process/mark_with.c:258
 msgid "with|_Data"
 msgstr "_Données"
 
-#: modules/process/mark_with.c:259
+#: modules/process/mark_with.c:260
 msgid "with|_Presentation"
 msgstr "_Présentation"
 
-#: modules/process/mark_with.c:293
+#: modules/process/mark_with.c:297
 msgid "Marked data range:"
 msgstr "Plages de données marquée :"
 
-#: modules/process/mark_with.c:301
+#: modules/process/mark_with.c:305
 msgid "_Minimum:"
 msgstr "_Minimum :"
 
-#: modules/process/mark_with.c:310
+#: modules/process/mark_with.c:314
 msgid "M_aximum:"
 msgstr "M_aximum :"
 
-#: modules/process/mark_with.c:378
+#: modules/process/mark_with.c:382
 msgid "Operand"
 msgstr "Opérande"
 
@@ -11411,107 +11764,107 @@ msgstr "Distribuer vers :"
 msgid "Preserve existing masks"
 msgstr "Conserver les masques existants"
 
-#: modules/process/mask_edt.c:95
+#: modules/process/mask_edt.c:89
 msgid "Performs simple and true Euclidean distance transforms of masks."
 msgstr "Applique une transformée de distance aux masques."
 
-#: modules/process/mask_edt.c:109
+#: modules/process/mask_edt.c:103
 msgid "/_Mask/Distanc_e Transform..."
 msgstr "/_Masque/Transformé_e de distance..."
 
-#: modules/process/mask_edt.c:113
+#: modules/process/mask_edt.c:107
 msgid "Distance transform of mask"
 msgstr "Transformée de distance du masque"
 
-#: modules/process/mask_edt.c:116
+#: modules/process/mask_edt.c:110
 msgid "/_Mask/Thi_n"
 msgstr "/_Masque/Affiner"
 
-#: modules/process/mask_edt.c:120
+#: modules/process/mask_edt.c:114
 msgid "Thin mask"
 msgstr "Affiner le masque"
 
-#: modules/process/mask_edt.c:330 modules/process/mask_edt.c:352
+#: modules/process/mask_edt.c:164 modules/process/mask_edt.c:186
 msgid "Distance Transform"
 msgstr "Carte de distances"
 
-#: modules/process/mask_edt.c:340
+#: modules/process/mask_edt.c:174
 msgid "Interior"
 msgstr "Intérieur"
 
-#: modules/process/mask_edt.c:341
+#: modules/process/mask_edt.c:175
 msgid "Exterior"
 msgstr "Exterieur"
 
-#: modules/process/mask_edt.c:342
+#: modules/process/mask_edt.c:176
 msgid "Two-sided"
 msgstr "Les deux côtés"
 
-#: modules/process/mask_edt.c:373 modules/tools/maskedit.c:634
+#: modules/process/mask_edt.c:207 modules/tools/maskedit.c:640
 msgid "_Distance type:"
 msgstr "Type de _distance :"
 
-#: modules/process/mask_edt.c:394 modules/tools/maskedit.c:640
+#: modules/process/mask_edt.c:228 modules/tools/maskedit.c:646
 msgid "Shrink from _border"
 msgstr "Éroder à partir du _bord"
 
-#: modules/process/mask_morph.c:117
+#: modules/process/mask_morph.c:116
 msgid "Performs basic morphological operations with masks."
 msgstr "Applique des opérations morphologiques basiques avec les masques."
 
-#: modules/process/mask_morph.c:131
-msgid "/_Mask/Morphological Operation..."
-msgstr "/_Masque/Opération morphologique..."
+#: modules/process/mask_morph.c:130
+msgid "/_Mask/Morpho_logical Operation..."
+msgstr "/_Masque/Opération morpho_logique..."
 
-#: modules/process/mask_morph.c:135
+#: modules/process/mask_morph.c:134
 msgid "Morphological operation with mask"
 msgstr "Opération morphologique avec un masque"
 
-#: modules/process/mask_morph.c:169
+#: modules/process/mask_morph.c:168
 msgid "Erosion"
 msgstr "Érosion"
 
-#: modules/process/mask_morph.c:170
+#: modules/process/mask_morph.c:169
 msgid "Dilation"
 msgstr "Dilatation"
 
-#: modules/process/mask_morph.c:171 modules/tools/filter.c:242
+#: modules/process/mask_morph.c:170 modules/tools/filter.c:243
 msgid "filter|Opening"
 msgstr "Ouverture"
 
-#: modules/process/mask_morph.c:172 modules/tools/filter.c:243
+#: modules/process/mask_morph.c:171 modules/tools/filter.c:244
 msgid "filter|Closing"
 msgstr "Fermeture"
 
-#: modules/process/mask_morph.c:173 modules/tools/filter.c:244
+#: modules/process/mask_morph.c:172 modules/tools/filter.c:245
 msgid "ASF Opening"
 msgstr "Ouverture ASF"
 
-#: modules/process/mask_morph.c:174 modules/tools/filter.c:245
+#: modules/process/mask_morph.c:173 modules/tools/filter.c:246
 msgid "ASF Closing"
 msgstr "Fermeture ASF"
 
-#: modules/process/mask_morph.c:178
+#: modules/process/mask_morph.c:177
 msgid "Octagon"
 msgstr "Octogone"
 
-#: modules/process/mask_morph.c:181
+#: modules/process/mask_morph.c:180
 msgid "Another mask"
 msgstr "Autre masque"
 
-#: modules/process/mask_morph.c:192
+#: modules/process/mask_morph.c:191
 msgid "Morphological Operation"
 msgstr "Opération morphologique"
 
-#: modules/process/mask_morph.c:224
+#: modules/process/mask_morph.c:223
 msgid "Structuring element:"
 msgstr "Élément structurant : "
 
-#: modules/process/mask_morph.c:238 modules/tools/maskedit.c:524
+#: modules/process/mask_morph.c:237 modules/tools/maskedit.c:528
 msgid "_Radius:"
 msgstr "_Rayon :"
 
-#: modules/process/mask_morph.c:249
+#: modules/process/mask_morph.c:248
 msgid "_Mask:"
 msgstr "_Masque : "
 
@@ -11519,39 +11872,59 @@ msgstr "_Masque : "
 msgid "_Trim empty borders"
 msgstr "_Tronquer les bords vides"
 
-#: modules/process/maskcor.c:86
+#: modules/process/mask_noisify.c:83
+msgid "Adds salt and/or pepper noise to mask."
+msgstr "Ajoute du bruit de type sel et/ou poivre au masque."
+
+#: modules/process/mask_noisify.c:97
+msgid "/_Mask/_Noisify..."
+msgstr "/_Masque/Ajouter du bruit..."
+
+#: modules/process/mask_noisify.c:101
+msgid "Add noise to mask"
+msgstr "Ajouter du bruit au masque"
+
+#: modules/process/mask_noisify.c:141
+msgid "Noisify Mask"
+msgstr "Ajouter du bruit au masque"
+
+#: modules/process/mask_noisify.c:184
+msgid "_Alter only boundaries"
+msgstr "_Altérer seulement les bords"
+
+#: modules/process/maskcor.c:87
 msgid "Creates mask by correlation with another data."
 msgstr "Crée un masque par corrélation avec d'autres données."
 
-#: modules/process/maskcor.c:100
+#: modules/process/maskcor.c:101
 msgid "/M_ultidata/_Mask by Correlation..."
 msgstr "/M_ultidonnées/_Masquer par corrélation..."
 
-#: modules/process/maskcor.c:104
+#: modules/process/maskcor.c:105
 msgid "Create mask by correlation with another data"
 msgstr "Créer un masque par corrélation avec d'autres données."
 
-#: modules/process/maskcor.c:141
+#: modules/process/maskcor.c:142
 msgid "Mask by Correlation"
 msgstr "Masquer par corrélation"
 
-#: modules/process/maskcor.c:165
+#: modules/process/maskcor.c:166
 msgid "Correlation _kernel:"
 msgstr "Noyau de correction :"
 
-#: modules/process/maskcor.c:172
+#: modules/process/maskcor.c:173
 msgid "Objects marked"
 msgstr "Objets marqués"
 
-#: modules/process/maskcor.c:173
+#: modules/process/maskcor.c:174
 msgid "Correlation maxima"
 msgstr "Maximum de corrélation"
 
-#: modules/process/maskcor.c:174 modules/process/maskcor.c:356
+#: modules/process/maskcor.c:175 modules/process/maskcor.c:360
 msgid "Correlation score"
 msgstr "Score de corrélation"
 
-#: modules/process/maskcor.c:183
+#: modules/process/maskcor.c:185
 msgid "Correlation _method:"
 msgstr "_Méthode de corrélation"
 
@@ -11581,8 +11954,8 @@ msgid "/_Mask/_Extract Mask"
 msgstr "/_Masque/Extraire le masque"
 
 #: modules/process/maskops.c:78
-msgid "Extract mask to a new channel"
-msgstr "Extrait le masque vers un nouveau canal"
+msgid "Extract mask to a new image"
+msgstr "Extrait le masque vers une nouvelle image"
 
 #: modules/process/maskops.c:81
 msgid "/_Grains/_Remove Edge-Touching"
@@ -11608,35 +11981,31 @@ msgstr "Rogne les régions non croisées de deux images"
 msgid "Mutual Crop"
 msgstr "Rognage mutuel"
 
-#: modules/process/mcrop.c:174
+#: modules/process/mcrop.c:173
 msgid "_Select second argument:"
 msgstr "_Sélectionner le second opérande :"
 
-#: modules/process/measure_lattice.c:174
+#: modules/process/measure_lattice.c:165
 msgid "Measures parameters of two-dimensional lattices."
 msgstr "Mesure les paramètres de mailles bi-dimensionnelles."
 
-#: modules/process/measure_lattice.c:188
+#: modules/process/measure_lattice.c:179
 msgid "/_Statistics/Measure _Lattice..."
 msgstr "/_Statistiques/Mesure de mai_lle..."
 
-#: modules/process/measure_lattice.c:192
+#: modules/process/measure_lattice.c:183
 msgid "Measure lattice"
 msgstr "Mesure de maille"
 
-#: modules/process/measure_lattice.c:253
+#: modules/process/measure_lattice.c:243
 msgid "Measure Lattice"
 msgstr "Mesure de maille"
 
-#: modules/process/measure_lattice.c:259
-msgid "_Refine"
-msgstr "Affine_r"
-
-#: modules/process/measure_lattice.c:330
+#: modules/process/measure_lattice.c:320
 msgid "_ACF"
 msgstr "_ACF"
 
-#: modules/process/measure_lattice.c:331
+#: modules/process/measure_lattice.c:321
 msgid "_PSDF"
 msgstr "_PSDF"
 
@@ -11652,30 +12021,30 @@ msgstr "Mai_lle"
 msgid "_Vectors"
 msgstr "_Vecteurs"
 
-#: modules/process/measure_lattice.c:596
+#: modules/process/measure_lattice.c:589
 msgid "Save Lattice Parameters"
 msgstr "Enregistrer les paramètres de maille"
 
-#: modules/process/measure_lattice.c:634
+#: modules/process/measure_lattice.c:627
 #, c-format
 msgid "Vector %d:"
 msgstr "Vecteur %d :"
 
-#: modules/process/measure_lattice.c:643
+#: modules/process/measure_lattice.c:636
 #, c-format
 msgid "Length %d:"
 msgstr "Longueur %d :"
 
-#: modules/process/measure_lattice.c:650
+#: modules/process/measure_lattice.c:643
 #, c-format
 msgid "Angle %d:"
 msgstr "Angle %d :"
 
-#: modules/process/measure_lattice.c:665
+#: modules/process/measure_lattice.c:657
 msgid "Angle:"
 msgstr "Angle :"
 
-#: modules/process/measure_lattice.c:681
+#: modules/process/measure_lattice.c:673
 msgid "Lattice Parameters"
 msgstr "Paramètres de maille"
 
@@ -11699,11 +12068,11 @@ msgstr "Nivelage médian..."
 msgid "Median Level"
 msgstr "Niveau médian"
 
-#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:237
+#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:336
 msgid "Real _radius:"
 msgstr "_Rayon réel :"
 
-#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:247
+#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:346
 msgid "_Pixel radius:"
 msgstr "Rayon du _pixel :"
 
@@ -11743,7 +12112,7 @@ msgstr "Premier opérande"
 msgid "Second operand"
 msgstr "Second opérande"
 
-#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:643
+#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:612
 msgid "Average"
 msgstr "Moyenne"
 
@@ -11795,6 +12164,225 @@ msgstr "Ajouter le _masque sur les pixels externes"
 msgid "Merged images"
 msgstr "Images fusionnées"
 
+#: modules/process/mfm_current.c:163
+msgid "Simulation of current line magnetic field"
+msgstr "Simulation du champ magnétique de la ligne de courant"
+
+#: modules/process/mfm_current.c:177
+msgid "/SPM M_odes/_MFM/_Current Line Field..."
+msgstr "/M_odes SPM/_MFM/Champ d'une ligne de courant..."
+
+#: modules/process/mfm_current.c:181
+msgid "Simulate stray field above current line"
+msgstr "Simuler le champ résiduel au-dessus de la ligne de courant"
+
+#: modules/process/mfm_current.c:280 modules/process/mfm_parallel.c:282
+msgid "Simulated field"
+msgstr "Champ simulé"
+
+#: modules/process/mfm_current.c:322 modules/process/mfm_field.c:266
+#: modules/process/mfm_parallel.c:324
+msgid "Point charge"
+msgstr "Charge ponctuelle"
+
+#: modules/process/mfm_current.c:323 modules/process/mfm_field.c:267
+#: modules/process/mfm_parallel.c:325
+msgid "Bar"
+msgstr "Barre"
+
+#: modules/process/mfm_current.c:330
+msgid "Current Line Stray Field"
+msgstr "Champ résiduel de la ligne de courant"
+
+#: modules/process/mfm_current.c:415
+msgid "Output"
+msgstr "Sortie"
+
+#: modules/process/mfm_current.c:420 modules/process/mfm_field.c:320
+#: modules/process/mfm_parallel.c:415
+msgid "_Output plane height:"
+msgstr "Hauteur du plan de sortie :"
+
+#: modules/process/mfm_current.c:428
+msgid "_Stripe width:"
+msgstr "Largeur de bande :"
+
+#: modules/process/mfm_current.c:436
+msgid "Stripe _current:"
+msgstr "Courant dans la bande :"
+
+#: modules/process/mfm_current.c:444
+msgid "_Position:"
+msgstr "_Position :"
+
+#: modules/process/mfm_current.c:461
+msgid "Probe"
+msgstr "Sonde"
+
+#: modules/process/mfm_current.c:469
+msgid "P_robe type:"
+msgstr "Type de sonde :"
+
+#: modules/process/mfm_current.c:475 modules/process/mfm_field.c:389
+#: modules/process/mfm_parallel.c:482
+msgid "Tip _magnetization:"
+msgstr "_Magnétisation de la sonde :"
+
+#: modules/process/mfm_current.c:484 modules/process/mfm_field.c:397
+#: modules/process/mfm_parallel.c:491
+msgid "Bar width _x:"
+msgstr "largeur de la barre _x :"
+
+#: modules/process/mfm_current.c:493 modules/process/mfm_field.c:405
+#: modules/process/mfm_parallel.c:500
+msgid "Bar width _y:"
+msgstr "largeur de la barre _y :"
+
+#: modules/process/mfm_current.c:502 modules/process/mfm_field.c:413
+#: modules/process/mfm_parallel.c:509
+msgid "Bar length (_z):"
+msgstr "Longueur de la barre (_z) :"
+
+#: modules/process/mfm_field.c:146
+msgid "Simulation of magnetic field above perpendicular media"
+msgstr "Simulation de champ magnétique au-dessus d'un milieu perpendiculaire"
+
+#: modules/process/mfm_field.c:160
+msgid "/SPM M_odes/_MFM/_Perpendicular Media Field..."
+msgstr "/M_odes SPM/_MFM/Champ d'un milieu _perpendiculaire..."
+
+#: modules/process/mfm_field.c:164
+msgid "Compute stray field above perpendicular magnetic medium"
+msgstr ""
+"Calculer le champ résiduel au-dessus du milieu magnétique perpendiculaire"
+
+#: modules/process/mfm_field.c:276
+msgid "Perpendicular Media Stray Field"
+msgstr "Champ résiduel du milieu perpendiculaire"
+
+#: modules/process/mfm_field.c:328 modules/process/mfm_parallel.c:423
+msgid "_Film thickness:"
+msgstr "Épaisseur du _film :"
+
+#: modules/process/mfm_field.c:336
+msgid "_Magnetic charge:"
+msgstr "Charge _magnétique :"
+
+#: modules/process/mfm_field.c:344
+msgid "Include domain _walls"
+msgstr "Inclure les murs du domaine"
+
+#: modules/process/mfm_field.c:354
+msgid "_Exchange constant:"
+msgstr "Constante d'échange :"
+
+#: modules/process/mfm_field.c:362
+msgid "_Uniaxial anisotropy:"
+msgstr "Anisotropie _uniaxiale :"
+
+#: modules/process/mfm_field.c:383 modules/process/mfm_parallel.c:476
+msgid "_Probe type:"
+msgstr "Type de sonde :"
+
+#: modules/process/mfm_findshift.c:88
+msgid "Lift height difference estimation from data blur"
+msgstr ""
+"Estimation de la différence de hauteur de levage à partir du flou de l'image"
+
+#: modules/process/mfm_findshift.c:102
+msgid "/SPM M_odes/_MFM/_Estimate Shift in Z..."
+msgstr "/M_odes SPM/_MFM/_Estimer le décalage en z..."
+
+#: modules/process/mfm_findshift.c:106
+msgid "Estimate lift height difference in MFM data"
+msgstr "Estimer la différence de hauteur de levage dans les données MFM"
+
+#: modules/process/mfm_findshift.c:166 modules/process/psf.c:340
+msgid "Searching..."
+msgstr "Recherche..."
+
+#: modules/process/mfm_findshift.c:196
+msgid "Estimated shift:"
+msgstr "Décalage estimé :"
+
+#: modules/process/mfm_findshift.c:211
+msgid "Shifted field difference"
+msgstr "Différence du champ décalé"
+
+#: modules/process/mfm_findshift.c:228
+msgid "Estimate Lift Height Shift"
+msgstr "Estimer le décalage de hauteur de levage"
+
+#: modules/process/mfm_findshift.c:255
+msgid "Data to compare:"
+msgstr "Données à comparer :"
+
+#: modules/process/mfm_findshift.c:261
+msgid "Search _from:"
+msgstr "Rechercher à partir de :"
+
+#: modules/process/mfm_findshift.c:269
+msgid "Search _to:"
+msgstr "Rechercher jusqu'à :"
+
+#: modules/process/mfm_parallel.c:165
+msgid "Simulation of parallel magnetic media"
+msgstr "Simulation d'un milieu magnétique parallèle"
+
+#: modules/process/mfm_parallel.c:179
+msgid "/SPM M_odes/_MFM/Para_llel Media Field..."
+msgstr "/M_odes SPM/_MFM/Champ d'un milieu para_llèle..."
+
+#: modules/process/mfm_parallel.c:183
+msgid "Simulate stray field above parallel magnetic medium"
+msgstr "Simuler le champ résiduel au-dessus d'un milieu magnétique parallèle"
+
+#: modules/process/mfm_parallel.c:331
+msgid "Parallel Media Stray Field"
+msgstr "Champ résiduel d'un milieu parallèle"
+
+#: modules/process/mfm_parallel.c:431
+msgid "_Remanent magnetization:"
+msgstr "Magnétisation _rémanente :"
+
+#: modules/process/mfm_parallel.c:439
+msgid "Size _A (dir. left):"
+msgstr "Taille _A (direction gauche) :"
+
+#: modules/process/mfm_parallel.c:447
+msgid "Size _B (dir. right):"
+msgstr "Taille _B (direction droite) :"
+
+#: modules/process/mfm_parallel.c:455
+msgid "_Gap size:"
+msgstr "Taille de l'interstice : "
+
+#: modules/process/mfm_shift.c:87
+msgid "Simulation of magnetic field z component change for another level"
+msgstr ""
+"Simulation du changement de la composante z du champ magnétique vers un "
+"autre niveau "
+
+#: modules/process/mfm_shift.c:101
+msgid "/SPM M_odes/_MFM/_Field Shift in Z..."
+msgstr "/M_odes SPM/_MFM/Décalage du champ en z..."
+
+#: modules/process/mfm_shift.c:105
+msgid "Compute stray field shift for another z level"
+msgstr "Calculer le décalage du champ résiduel pour un autre plan z"
+
+#: modules/process/mfm_shift.c:146
+msgid "Shifted field"
+msgstr "Champ décalé"
+
+#: modules/process/mfm_shift.c:164
+msgid "Stray Field Plane Shift"
+msgstr "Décalage du plan du champ résiduel"
+
+#: modules/process/mfm_shift.c:209
+msgid "_Z shift by:"
+msgstr "Décalage Z :"
+
 #: modules/process/nanoindent_adjust.c:89
 msgid "Adjust images of two indentor prints."
 msgstr "Ajuster les images de deux empreintes d'indenteurs."
@@ -11831,14 +12419,14 @@ msgstr "Pivote_r les données"
 msgid "E_xtrapolate result data out of measured range"
 msgstr "E_xtrapoler les résultats au-delà de la plage mesurée"
 
-#: modules/process/nanoindent_adjust.c:295
+#: modules/process/nanoindent_adjust.c:296
 msgid ""
 "Tip has different range/resolution ratio than image. Tip will be resampled."
 msgstr ""
 "La sonde a un rapport plage/résolution différent de l'image. La sonde va "
 "être ré-échantillonnée."
 
-#: modules/process/nanoindent_adjust.c:334
+#: modules/process/nanoindent_adjust.c:335
 msgid "Immersed detail data"
 msgstr "Données du détail incrusté"
 
@@ -11880,246 +12468,234 @@ msgid "error"
 msgstr "Erreur"
 
 # Légende du graphe d'erreur, on omet le NN (Neural Network)
-#: modules/process/neural.c:503
+#: modules/process/neural.c:504
 msgid "NN training error"
 msgstr "Erreur d'apprentissage"
 
-#: modules/process/neural.c:516
+#: modules/process/neural.c:517
 msgid "Training"
 msgstr "Apprentissage"
 
-#: modules/process/neural.c:520
+#: modules/process/neural.c:521
 msgid "_Model:"
 msgstr "_Modèle :"
 
-#: modules/process/neural.c:530
+#: modules/process/neural.c:532
 msgid "_Signal:"
 msgstr "_Signal :"
 
-#: modules/process/neural.c:541
+#: modules/process/neural.c:544
 msgid "Training ste_ps:"
 msgstr "Étapes d'a_pprentissage : "
 
-#: modules/process/neural.c:557
+#: modules/process/neural.c:561
 msgid "Model"
 msgstr "Modèle"
 
-#: modules/process/neural.c:558
+#: modules/process/neural.c:562
 msgid "Signal"
 msgstr "Signal"
 
-#: modules/process/neural.c:575
+#: modules/process/neural.c:579
 msgid "verb|_Train"
 msgstr "Lancer l'appren_tissage"
 
-#: modules/process/neural.c:580
+#: modules/process/neural.c:584
 msgid "Re_initialize"
 msgstr "Réinitialiser"
 
-#: modules/process/neural.c:613
+#: modules/process/neural.c:617
 msgid "Network"
 msgstr "Réseau"
 
-#: modules/process/neural.c:619
+#: modules/process/neural.c:623
 msgid "Window _width:"
 msgstr "Largeur de fenêtre :"
 
-#: modules/process/neural.c:627
+#: modules/process/neural.c:631
 msgid "Window h_eight:"
 msgstr "Hauteur de fenêtre :"
 
-#: modules/process/neural.c:635
+#: modules/process/neural.c:639
 msgid "_Hidden nodes:"
 msgstr "Nœuds cac_hés : "
 
-#: modules/process/neural.c:643
+#: modules/process/neural.c:647
 msgid "Result Units"
 msgstr "Unités du résultat"
 
-#: modules/process/neural.c:650
+#: modules/process/neural.c:654
 msgid "Power of source _XY:"
 msgstr "Puissance de la source _XY :"
 
-#: modules/process/neural.c:658
+#: modules/process/neural.c:663
 msgid "Power of source _Z:"
 msgstr "Puissance de la source _Z :"
 
-#: modules/process/neural.c:666
+#: modules/process/neural.c:672
 msgid "_Fixed units:"
 msgstr "Unités _fixées :"
 
-#: modules/process/neural.c:676
+#: modules/process/neural.c:683
 msgid "Networks"
 msgstr "Réseaux"
 
-#: modules/process/neural.c:723
+#: modules/process/neural.c:730
 msgid "Network _name:"
 msgstr "_Nom du réseau :"
 
-#: modules/process/neural.c:775
+#: modules/process/neural.c:782
 msgid "Apply Neural Network"
 msgstr "Appliquer un réseau neuronal"
 
-#: modules/process/neural.c:798
+#: modules/process/neural.c:805
 msgid "_Scale proportionally to input"
 msgstr "Mettre à l'échelle _proportionnellement à l'entrée"
 
-#: modules/process/neural.c:929
+#: modules/process/neural.c:936
 msgid "Model and signal are not compatible."
 msgstr "Le modèle et le signal ne sont pas compatibles."
 
-#: modules/process/neural.c:937
+#: modules/process/neural.c:944
 msgid "A field dimension is too small for chosen window size."
 msgstr ""
 "Une des dimensions de champ est trop petite par rapport à la taille de "
 "fenêtre choisie."
 
-#: modules/process/neural.c:1183 modules/process/neural.c:1349
+#: modules/process/neural.c:1190 modules/process/neural.c:1356
 msgid "Evaluating..."
 msgstr "Évaluation..."
 
-#: modules/process/neural.c:1309
+#: modules/process/neural.c:1316
 msgid "Training was canceled."
 msgstr "L'apprentissage a été annulé."
 
-#: modules/process/neural.c:1319
+#: modules/process/neural.c:1326
 #, c-format
 msgid "Mean difference: %.*f %s"
 msgstr "Différence moyenne : %.*f %s"
 
-#: modules/process/neural.c:1371
+#: modules/process/neural.c:1378
 msgid "Evaluated signal"
 msgstr "Signal évalué"
 
-#: modules/process/noise_synth.c:196
+#: modules/process/noise_synth.c:194
 msgid "Generates uncorrelated random noise."
 msgstr "Génère un bruit aléatoire non corrélé."
 
-#: modules/process/noise_synth.c:210
+#: modules/process/noise_synth.c:208
 msgid "/S_ynthetic/_Noise..."
 msgstr "/S_ynthèse/Bruit..."
 
-#: modules/process/noise_synth.c:214
+#: modules/process/noise_synth.c:212
 msgid "Generate surface of uncorrelated noise"
 msgstr "Générer une surface à partir d'un bruit non corrélé"
 
-#: modules/process/noise_synth.c:334
+#: modules/process/noise_synth.c:332
 msgid "Random Noise"
 msgstr "Bruit aléatoire"
 
-#: modules/process/obj_synth.c:274
+#: modules/process/obj_synth.c:270
 msgid "Spheres"
 msgstr "Sphères"
 
-#: modules/process/obj_synth.c:275
+#: modules/process/obj_synth.c:271
 msgid "Boxes"
 msgstr "Boîtes"
 
-#: modules/process/obj_synth.c:276
+#: modules/process/obj_synth.c:272
 msgid "Cones"
 msgstr "Cônes"
 
-#: modules/process/obj_synth.c:277
+#: modules/process/obj_synth.c:273
 msgid "Pyramids"
 msgstr "Pyramides"
 
-#: modules/process/obj_synth.c:278
+#: modules/process/obj_synth.c:274
 msgid "Diamonds"
 msgstr "Losanges"
 
-#: modules/process/obj_synth.c:279
+#: modules/process/obj_synth.c:275
 msgid "Tetrahedrons"
 msgstr "Tétraèdres"
 
-#: modules/process/obj_synth.c:280
+#: modules/process/obj_synth.c:276
 msgid "Nuggets"
 msgstr "Pépites"
 
-#: modules/process/obj_synth.c:281
+#: modules/process/obj_synth.c:277
 msgid "Thatches"
 msgstr "Chaumes"
 
-#: modules/process/obj_synth.c:282
+#: modules/process/obj_synth.c:278
 msgid "Tents"
 msgstr "Tentes"
 
-#: modules/process/obj_synth.c:283
+#: modules/process/obj_synth.c:279
 msgid "Gaussians"
 msgstr "Gaussiennes"
 
-#: modules/process/obj_synth.c:284
+#: modules/process/obj_synth.c:280
 msgid "Doughnuts"
 msgstr "Beignets"
 
-#: modules/process/obj_synth.c:285
+#: modules/process/obj_synth.c:281
 msgid "Parabolic bumps"
 msgstr "Bosses paraboliques"
 
-#: modules/process/obj_synth.c:291
+#: modules/process/obj_synth.c:287
 msgid "Generates randomly patterned surfaces by placing objects."
 msgstr "Génère des motifs de surface aléatoire en plaçant des objets."
 
-#: modules/process/obj_synth.c:305
-msgid "/S_ynthetic/_Objects..."
-msgstr "/S_ynthèse/_Objets..."
+#: modules/process/obj_synth.c:301
+msgid "/S_ynthetic/_Deposition/_Objects..."
+msgstr "/S_ynthèse/_Dépôt/_Objets..."
 
-#: modules/process/obj_synth.c:309
+#: modules/process/obj_synth.c:305
 msgid "Generate surface of randomly placed objects"
 msgstr "Générer une surface avec des objets placés aléatoirement"
 
-#: modules/process/obj_synth.c:424
+#: modules/process/obj_synth.c:421
 msgid "Both (random)"
 msgstr "Les deux (aléatoire)"
 
-#: modules/process/obj_synth.c:439
+#: modules/process/obj_synth.c:436
 msgid "Random Objects"
 msgstr "Objets aléatoires"
 
-#: modules/process/obj_synth.c:513
-msgid "_Shape:"
-msgstr "Forme :"
-
-#: modules/process/obj_synth.c:531
-msgid "obj."
-msgstr "obj."
-
-#: modules/process/obj_synth.c:551
+#: modules/process/obj_synth.c:549
 msgid "Aspect Ratio"
 msgstr "Rapport d'aspect"
 
-#: modules/process/obj_synth.c:558
+#: modules/process/obj_synth.c:556
 msgid "_Aspect ratio:"
 msgstr "Rapport d'_aspect :"
 
-#: modules/process/obj_synth.c:588
+#: modules/process/obj_synth.c:586
 msgid "Scales _with size"
 msgstr "Mettre à l'échelle avec la taille"
 
-#: modules/process/obj_synth.c:612
+#: modules/process/obj_synth.c:611
 msgid "_Feature type:"
 msgstr "Type d'objet :"
 
-#: modules/process/obj_synth.c:807
-msgid "_Truncate:"
-msgstr "_Tronquer :"
-
-#: modules/process/otsu_threshold.c:39 modules/process/otsu_threshold.c:59
+#: modules/process/otsu_threshold.c:40 modules/process/otsu_threshold.c:60
 msgid "Automated threshold using Otsu's method on heights."
 msgstr "Seuillage basé sur la méthode d'Otsu appliquée aux hauteurs."
 
-#: modules/process/otsu_threshold.c:55
-msgid "/_Grains/_Mark by Otsu's..."
+#: modules/process/otsu_threshold.c:56
+msgid "/_Grains/_Mark by Otsu's"
 msgstr "/_Grains/_Marquer par la méthode d'Otsu..."
 
-#: modules/process/outliers.c:40
+#: modules/process/outliers.c:41
 msgid "Creates mask of outliers."
 msgstr "Crée un masque des points aberrants."
 
-#: modules/process/outliers.c:54
+#: modules/process/outliers.c:55
 msgid "/_Correct Data/Mask of _Outliers"
 msgstr "/_Correction des données/Marquer les p_oints aberrants"
 
-#: modules/process/outliers.c:58
+#: modules/process/outliers.c:59
 msgid "Mark data farther than 3σ from mean value"
 msgstr "Marque les données éloignées de plus de 3σ de la valeur moyenne"
 
@@ -12143,80 +12719,100 @@ msgstr "Motif"
 msgid "_Pattern:"
 msgstr "Motif :"
 
-#: modules/process/pat_synth.c:812
+#: modules/process/pat_synth.c:813
 msgid "Flat"
 msgstr "Plateau"
 
-#: modules/process/pat_synth.c:820
+#: modules/process/pat_synth.c:821
 msgid "_Flat width:"
 msgstr "Largeur :"
 
-#: modules/process/pat_synth.c:837 modules/process/pat_synth.c:1139
-#: modules/process/pat_synth.c:1474
+#: modules/process/pat_synth.c:838 modules/process/pat_synth.c:1140
+#: modules/process/pat_synth.c:1475
 msgid "_Slope width:"
 msgstr "Largeur :"
 
-#: modules/process/pat_synth.c:1099
+#: modules/process/pat_synth.c:1100
 msgid "Top"
 msgstr "Haut"
 
-#: modules/process/pat_synth.c:1106
+#: modules/process/pat_synth.c:1107
 msgid "Flat _top width:"
 msgstr "Largeur :"
 
-#: modules/process/pat_synth.c:1114
+#: modules/process/pat_synth.c:1115
 msgid "Bottom"
 msgstr "Bas"
 
-#: modules/process/pat_synth.c:1122
+#: modules/process/pat_synth.c:1123
 msgid "Flat _bottom width:"
 msgstr "Largeur :"
 
-#: modules/process/pat_synth.c:1440
+#: modules/process/pat_synth.c:1441
 msgid "_Distance:"
 msgstr "_Distance :"
 
-#: modules/process/pid.c:96
+#: modules/process/phase_synth.c:136
+msgid "Generates phase-separated structures."
+msgstr "Génère des structures séparées par des phases"
+
+#: modules/process/phase_synth.c:150
+msgid "/S_ynthetic/P_hases..."
+msgstr "/S_ynthèse/P_hases..."
+
+#: modules/process/phase_synth.c:154
+msgid "Generate surface with separated phases"
+msgstr "Générer une surface constituée de phases séparées."
+
+#: modules/process/phase_synth.c:203
+msgid "Separated Phases"
+msgstr "Phases séparées"
+
+#: modules/process/phase_synth.c:287
+msgid "Size s_pread:"
+msgstr "Taille d'étalement :"
+
+#: modules/process/pid.c:95
 msgid "A simple PID simulator"
 msgstr "Simulateur PID basique"
 
-#: modules/process/pid.c:110
+#: modules/process/pid.c:109
 msgid "/_Tip and Indentation/_PID simulation..."
 msgstr "/Sonde et indentation/Simulation _PID..."
 
-#: modules/process/pid.c:114
+#: modules/process/pid.c:113
 msgid "Simulate PID effects on measurement"
 msgstr "Simuler les effets de la régulation PID sur la mesure"
 
-#: modules/process/pid.c:158
+#: modules/process/pid.c:157
 msgid "PID FW result"
 msgstr "PID résultat aller"
 
-#: modules/process/pid.c:167
+#: modules/process/pid.c:166
 msgid "PID FW max. force"
 msgstr "PID force maximale aller"
 
-#: modules/process/pid.c:176
+#: modules/process/pid.c:175
 msgid "PID REV result"
 msgstr "PID résultat retour"
 
-#: modules/process/pid.c:185
+#: modules/process/pid.c:184
 msgid "PID REV max. force"
 msgstr "PID force maximale retour"
 
-#: modules/process/pid.c:198
+#: modules/process/pid.c:196
 msgid "PID simulation"
 msgstr "Simulation PID"
 
-#: modules/process/pid.c:215
+#: modules/process/pid.c:214
 msgid "_Proportional:"
 msgstr "_Proportionnelle :"
 
-#: modules/process/pid.c:221
+#: modules/process/pid.c:220
 msgid "_Integral:"
 msgstr "_Intégrale :"
 
-#: modules/process/pid.c:227
+#: modules/process/pid.c:226
 msgid "_Integration steps:"
 msgstr "Passes d'_intégration :"
 
@@ -12224,15 +12820,15 @@ msgstr "Passes d'_intégration :"
 msgid "_Derivative:"
 msgstr "_Dérivée :"
 
-#: modules/process/pid.c:241
+#: modules/process/pid.c:240
 msgid "PID/scan speed _ratio:"
 msgstr "Rapport de vitesse PID/scan :"
 
-#: modules/process/pid.c:253
+#: modules/process/pid.c:255
 msgid "Force strength:"
 msgstr "Force de résistance :"
 
-#: modules/process/pid.c:259
+#: modules/process/pid.c:261
 msgid "Force setpoint:"
 msgstr "Force de consigne :"
 
@@ -12240,7 +12836,7 @@ msgstr "Force de consigne :"
 msgid "Scanning..."
 msgstr "Balayage en cours..."
 
-#: modules/process/pid.c:396
+#: modules/process/pid.c:401
 msgid "Computation diverged, try to change parameters"
 msgstr "Le calcul diverge, essayez de modifier les paramètres"
 
@@ -12260,23 +12856,23 @@ msgstr "Applique une distorsion polynomiale dans le plan horizontal"
 msgid "Distort by Polynomial"
 msgstr "Distorsion polynomiale"
 
-#: modules/process/polydistort.c:282
+#: modules/process/polydistort.c:285
 msgid "Ori_ginal"
 msgstr "Ori_ginal"
 
-#: modules/process/polydistort.c:283
+#: modules/process/polydistort.c:286
 msgid "_Transformed"
 msgstr "_Transformé"
 
-#: modules/process/polydistort.c:289
+#: modules/process/polydistort.c:292
 msgid "X Coefficients"
 msgstr "Coefficients X"
 
-#: modules/process/polydistort.c:303
+#: modules/process/polydistort.c:306
 msgid "Y Coefficients"
 msgstr "Coefficients Y"
 
-#: modules/process/polydistort.c:499
+#: modules/process/polydistort.c:502
 msgid "Distorted"
 msgstr "Distordu"
 
@@ -12312,26 +12908,26 @@ msgstr "Données mises à niveau"
 msgid "_Horizontal polynom degree:"
 msgstr "Degré du polynôme _horizontal : "
 
-#: modules/process/polylevel.c:450
+#: modules/process/polylevel.c:451
 msgid "_Vertical polynom degree:"
 msgstr "Degré du polynôme _vertical : "
 
-#: modules/process/polylevel.c:456
+#: modules/process/polylevel.c:458
 msgid "_Same degrees"
 msgstr "Degré_s identiques"
 
-#: modules/process/polylevel.c:474
+#: modules/process/polylevel.c:476
 msgid "_Maximum polynom degree:"
 msgstr "Degré _maximum du polynôme"
 
-#: modules/process/polylevel.c:561
+#: modules/process/polylevel.c:564
 msgid "Polynomial Coefficients"
 msgstr "Coefficients polynomiaux"
 
-#: modules/process/polylevel.c:934 modules/tools/distance.c:594
+#: modules/process/polylevel.c:937 modules/tools/distance.c:594
 #: modules/tools/selectionmanager.c:720
 msgid "Save Table"
-msgstr "Sauver le tableau"
+msgstr "Enregistrer le tableau"
 
 #: modules/process/presentationops.c:56
 msgid "Basic operations with presentation: extraction, removal."
@@ -12350,8 +12946,8 @@ msgid "/_Presentation/E_xtract Presentation"
 msgstr "/_Présentation/E_xtraire la présentation"
 
 #: modules/process/presentationops.c:81
-msgid "Extract presentation to a new channel"
-msgstr "Extraire la présentation vers un nouveau canal"
+msgid "Extract presentation to a new image"
+msgstr "Extraire la présentation vers une nouvelle image"
 
 #: modules/process/presentationops.c:84
 msgid "/_Presentation/_Attach Presentation..."
@@ -12377,6 +12973,10 @@ msgstr "Attacher une présentation"
 msgid "_Data to attach:"
 msgstr "_Données à attacher :"
 
+#: modules/process/preview.h:245
+msgid "Combine with existing mask:"
+msgstr "Combiner avec le masque existant"
+
 #: modules/process/psdf_logphi.c:76
 msgid ""
 "Two-dimensional FFT (Fast Fourier Transform) transformed to coordinates (log-"
@@ -12397,10 +12997,81 @@ msgstr "Calculer la PSDF en coordonnées Log-Phi"
 msgid "Log-Phi PSDF"
 msgstr "PSDF Log-Phi"
 
-#: modules/process/psdf_logphi.c:275 modules/process/wpour_mark.c:320
+#: modules/process/psdf_logphi.c:276 modules/process/wpour_mark.c:320
 msgid "Gaussian _smoothing:"
 msgstr "Floutage gau_ssien :"
 
+#: modules/process/psf-fit.c:165
+msgid "Gaussian (asymmetric)"
+msgstr "Gaussienne (asymétrique)"
+
+#: modules/process/psf-fit.c:177
+msgid "Point spread function estimation by fitting explicit function form."
+msgstr ""
+"Estimation de la réponse impulsionnelle (PSF) par l'ajustement d'une "
+"fonction de forme explicite."
+
+#: modules/process/psf-fit.c:191
+msgid "/_Statistics/_PSF Fit..."
+msgstr "/_Statistiques/Ajustement de la _PSF..."
+
+#: modules/process/psf-fit.c:195
+msgid "Fit PSF from known data and image"
+msgstr "Ajustement de la PSF à partir de données et d'une image"
+
+#: modules/process/psf-fit.c:246 modules/process/psf.c:181
+#: modules/process/psf.c:230
+msgid "PSF"
+msgstr "PSF"
+
+#: modules/process/psf-fit.c:254 modules/process/psf.c:195
+msgid "PSF*P"
+msgstr "PSF*P"
+
+#: modules/process/psf-fit.c:271
+msgid "Fit PSF"
+msgstr "Ajuster la PSF"
+
+#: modules/process/psf-fit.c:289 modules/process/psf.c:286
+msgid "_Ideal response:"
+msgstr "Réponse _idéale :"
+
+#: modules/process/psf.c:117
+msgid "Point spread function estimation"
+msgstr "Estimation de la réponse impulsionnelle (PSF)"
+
+#: modules/process/psf.c:131
+msgid "/_Statistics/_PSF Guess..."
+msgstr "/_Statistiques/Estimation de la _PSF..."
+
+#: modules/process/psf.c:135
+msgid "Estimate PSF from known data and image"
+msgstr "Estimation de la PSF à partir de données et d'une image connues"
+
+#: modules/process/psf.c:208
+msgid "PSF*P - I"
+msgstr "PSF*P - I"
+
+#: modules/process/psf.c:231
+msgid "Convolved"
+msgstr "Convoluée"
+
+#: modules/process/psf.c:237
+msgid "Estimate PSF"
+msgstr "PSF estimée"
+
+#: modules/process/psf.c:238
+msgid "_Fit"
+msgstr "Ajustement"
+
+#: modules/process/psf.c:295
+msgid "_Display:"
+msgstr "Affichage :"
+
+#: modules/process/psf.c:301
+msgid "_Sigma init:"
+msgstr "_Sigma initial :"
+
 #: modules/process/rank.c:92
 msgid "Enhances local contrast using a rank transform."
 msgstr "Améliore le contraste local à l'aide d'une transformée de rang."
@@ -12450,7 +13121,7 @@ msgstr "/Opérations _basiques/Rotation..."
 msgid "Rotate by arbitrary angle"
 msgstr "Rotation par un angle quelconque"
 
-#: modules/process/rotate.c:192
+#: modules/process/rotate.c:192 modules/volume/volume_swaxes.c:651
 msgid "Rotated Data"
 msgstr "Données pivotées"
 
@@ -12506,64 +13177,64 @@ msgstr "Données mises à l'échelle"
 msgid "verb|Scale"
 msgstr "Mettre à l'échelle"
 
-#: modules/process/scale.c:216
+#: modules/process/scale.c:217
 msgid "Scale by _ratio:"
 msgstr "Rapport d'échelle :"
 
-#: modules/process/scale.c:224
+#: modules/process/scale.c:225
 msgid "_proportional"
 msgstr "_proportionnel"
 
-#: modules/process/scale.c:235
+#: modules/process/scale.c:237
 msgid "New _width:"
 msgstr "Nouvelle largeur : "
 
-#: modules/process/scale.c:243
+#: modules/process/scale.c:246
 msgid "New _height:"
 msgstr "Nouvelle _hauteur :"
 
-#: modules/process/scars.c:113
+#: modules/process/scars.c:122
 msgid "Marks and/or removes scars (horizontal linear artifacts)."
 msgstr ""
 "Marque et/ou supprime les défauts linéaires (artefacts linéaires horizontaux)"
 
-#: modules/process/scars.c:127
+#: modules/process/scars.c:136
 msgid "/_Correct Data/M_ark Scars..."
 msgstr "/_Correction des données/M_arquer les défauts linéaires..."
 
-#: modules/process/scars.c:131
+#: modules/process/scars.c:140
 msgid "Mark horizontal scars (strokes)"
 msgstr "Marquer les défauts horizontales (traits)"
 
-#: modules/process/scars.c:134
+#: modules/process/scars.c:143
 msgid "/_Correct Data/Remove _Scars"
 msgstr "/_Correction des données/_Supprimer les défauts linéaires"
 
-#: modules/process/scars.c:138
+#: modules/process/scars.c:147
 msgid "Correct horizontal scars (strokes)"
 msgstr "Corriger les marques horizontales (traits)"
 
-#: modules/process/scars.c:293
+#: modules/process/scars.c:312
 msgid "Mark Scars"
 msgstr "Marquer les défauts linéaires"
 
-#: modules/process/scars.c:331
+#: modules/process/scars.c:353
 msgid "Maximum _width:"
 msgstr "Largeur maximale :"
 
-#: modules/process/scars.c:338
+#: modules/process/scars.c:361
 msgid "Minimum _length:"
 msgstr "Longueur minimale :"
 
-#: modules/process/scars.c:345
+#: modules/process/scars.c:369
 msgid "_Hard threshold:"
 msgstr "Seuil dur : "
 
-#: modules/process/scars.c:353
+#: modules/process/scars.c:377
 msgid "_Soft threshold:"
 msgstr "_Seuil doux :"
 
-#: modules/process/scars.c:361
+#: modules/process/scars.c:385
 msgid "Scars type:"
 msgstr "Type de marques :"
 
@@ -12603,27 +13274,27 @@ msgstr "Monte Carlo"
 msgid "_Quality:"
 msgstr "_Qualité : "
 
-#: modules/process/shade.c:92
+#: modules/process/shade.c:94
 msgid "Creates a shaded presentation of data."
 msgstr "Crée une présentation ombrée des données."
 
-#: modules/process/shade.c:106
+#: modules/process/shade.c:108
 msgid "/_Presentation/_Shading..."
 msgstr "/_Présentation/_Ombre..."
 
-#: modules/process/shade.c:110
+#: modules/process/shade.c:112
 msgid "Shade data"
 msgstr "Ombrer les données"
 
-#: modules/process/shade.c:207
+#: modules/process/shade.c:209
 msgid "Shading"
 msgstr "Ombrage"
 
-#: modules/process/shade.c:253
+#: modules/process/shade.c:260
 msgid "_Mix:"
 msgstr "_Mixage : "
 
-#: modules/process/slope_dist.c:161
+#: modules/process/slope_dist.c:160
 msgid ""
 "Calculates one- or two-dimensional distribution of slopes or graph of their "
 "angular distribution."
@@ -12631,83 +13302,133 @@ msgstr ""
 "Calcule la distribution uni ou bi-dimensionnelle des pentes ou affiche la "
 "distribution angulaire."
 
-#: modules/process/slope_dist.c:176
+#: modules/process/slope_dist.c:175
 msgid "/_Statistics/_Slope Distribution..."
 msgstr "/_Statistiques/Di_stribution des pentes..."
 
-#: modules/process/slope_dist.c:180
+#: modules/process/slope_dist.c:179
 msgid "Calculate angular slope distribution"
 msgstr "Calculer la distribution des pentes"
 
-#: modules/process/slope_dist.c:221
+#: modules/process/slope_dist.c:220
 msgid "Slope distribution"
 msgstr "Distribution des pentes"
 
-#: modules/process/slope_dist.c:253
+#: modules/process/slope_dist.c:252
 msgid "_Two-dimensional distribution"
 msgstr "Dis_tribution bi-dimensionnelle"
 
-#: modules/process/slope_dist.c:254
+#: modules/process/slope_dist.c:253
 msgid "Directional (φ) _graph"
 msgstr "_Graphe directionnel (φ) "
 
-#: modules/process/slope_dist.c:255
+#: modules/process/slope_dist.c:254
 msgid "_Inclination (θ) graph"
 msgstr "Graphe d'_inclinaison (θ)"
 
-#: modules/process/slope_dist.c:256
+#: modules/process/slope_dist.c:255
 msgid "Inclination (gra_dient) graph"
 msgstr "Graphe d'inclinaison (gradient)"
 
-#: modules/process/slope_dist.c:270
+#: modules/process/slope_dist.c:269
 msgid "Slope Distribution"
 msgstr "Distribution des pentes"
 
-#: modules/process/slope_dist.c:755
+#: modules/process/slope_dist.c:749
 msgid "Angular Slope Distribution"
 msgstr "Distribution angulaires des pentes"
 
-#: modules/process/slope_dist.c:763 modules/process/tilt.c:179
+#: modules/process/slope_dist.c:757 modules/process/tilt.c:179
 msgid "Slopes"
 msgstr "Pentes"
 
-#: modules/process/slope_dist.c:824 modules/process/slope_dist.c:893
+#: modules/process/slope_dist.c:818 modules/process/slope_dist.c:887
 msgid "Inclination Distribution"
 msgstr "Distribution des inclinaisons"
 
-#: modules/process/slope_dist.c:832 modules/process/slope_dist.c:901
+#: modules/process/slope_dist.c:826 modules/process/slope_dist.c:895
 msgid "Inclinations"
 msgstr "Inclinaisons"
 
-#: modules/process/sphere-revolve.c:97
+#: modules/process/sphere-revolve.c:111
 msgid "Subtracts background by arc or sphere revolution."
 msgstr ""
 "Soustrait l'arrière plan à l'aide d'un arc de révolution ou d'une sphère."
 
-#: modules/process/sphere-revolve.c:113
+#: modules/process/sphere-revolve.c:125
 msgid "/_Level/Revolve _Arc..."
 msgstr "/Niveau/_Arc de révolution..."
 
-#: modules/process/sphere-revolve.c:117
+#: modules/process/sphere-revolve.c:129
 msgid "Level data by arc revolution"
 msgstr "Mettre à niveau avec un arc de révolution"
 
-#: modules/process/sphere-revolve.c:208 modules/tools/sfunctions.c:371
+#: modules/process/sphere-revolve.c:132
+msgid "/_Level/Revolve _Sphere..."
+msgstr "/Niveau/_Sphère..."
+
+#: modules/process/sphere-revolve.c:136
+msgid "Level data by sphere revolution"
+msgstr "Mettre à niveau avec une sphère"
+
+#: modules/process/sphere-revolve.c:303 modules/tools/sfunctions.c:381
 msgid "_Horizontal direction"
 msgstr "Direction _horizontale"
 
-#: modules/process/sphere-revolve.c:209 modules/tools/sfunctions.c:372
+#: modules/process/sphere-revolve.c:304 modules/tools/sfunctions.c:382
 msgid "_Vertical direction"
 msgstr "Direction _verticale"
 
-#: modules/process/sphere-revolve.c:210
+#: modules/process/sphere-revolve.c:305
 msgid "_Both directions"
 msgstr "Les deux directions"
 
-#: modules/process/sphere-revolve.c:217
+#: modules/process/sphere-revolve.c:315
+msgid "Revolve Sphere"
+msgstr "Sphère"
+
+#: modules/process/sphere-revolve.c:315
 msgid "Revolve Arc"
 msgstr "Arc de révolution"
 
+#: modules/process/sphere-revolve.c:355
+msgid "Direction:"
+msgstr "Direction :"
+
+#: modules/process/sphere-revolve.c:699
+msgid "Revolving sphere..."
+msgstr "Sphère..."
+
+#: modules/process/stitch.c:135
+msgid "Stitch multiple images based on offsets of origins."
+msgstr ""
+"Assemble différentes images en se basant sur les décalages des origines."
+
+#: modules/process/stitch.c:149
+msgid "/M_ultidata/_Stitch..."
+msgstr "/M_ultidonnées/A_ssembler..."
+
+#: modules/process/stitch.c:153
+msgid "Stitch images using offsets"
+msgstr "Assembler des images à partir des décalages"
+
+#: modules/process/stitch.c:269
+msgid "Stitch"
+msgstr "Assemblage"
+
+#: modules/process/stitch.c:312
+msgid "Channels"
+msgstr "Canaux"
+
+#: modules/process/stitch.c:435
+msgid "Restore"
+msgstr "Recharger"
+
+#: modules/process/stitch.c:445 modules/tools/linestats.c:379
+#: modules/tools/sfunctions.c:440 modules/tools/stats.c:406
+msgid "_Instant updates"
+msgstr "Mises à jour instantanées"
+
 #: modules/process/straighten_path.c:126
 msgid "Extracts a straightened part of image along a curve."
 msgstr "Extrait une partie redressée de l'image le long d'un chemin."
@@ -12724,28 +13445,28 @@ msgstr "Redresser le long d'un chemin"
 msgid "Straighten Path"
 msgstr "Redresser un chemin"
 
-#: modules/process/straighten_path.c:254
+#: modules/process/straighten_path.c:253
 msgid "Res_tore"
 msgstr "Recharger"
 
-#: modules/process/straighten_path.c:259
+#: modules/process/straighten_path.c:258
 msgid "Re_verse"
 msgstr "In_verser"
 
 #: modules/process/straighten_path.c:278 modules/tools/pathlevel.c:256
-#: modules/tools/profile.c:507 modules/tools/roughness.c:854
+#: modules/tools/profile.c:503 modules/tools/roughness.c:868
 msgid "_Thickness:"
 msgstr "Épaisseur :"
 
-#: modules/process/straighten_path.c:286
+#: modules/process/straighten_path.c:287
 msgid "_Slackness:"
 msgstr "Relâchement"
 
-#: modules/process/straighten_path.c:292
+#: modules/process/straighten_path.c:293
 msgid "C_losed curve"
 msgstr "Courbe fermée"
 
-#: modules/process/straighten_path.c:379
+#: modules/process/straighten_path.c:380
 msgid "Straightened"
 msgstr "Redressé"
 
@@ -12768,52 +13489,52 @@ msgstr "Super-résolution utilisant plusieurs images d'un même objet"
 msgid "Supres"
 msgstr "Super résolution"
 
-#: modules/process/superresolution.c:421
+#: modules/process/superresolution.c:420
 msgid "Correlating to determine mean shift..."
 msgstr "Corrélation en cours pour déterminer le déplacement moyen..."
 
-#: modules/process/superresolution.c:511
+#: modules/process/superresolution.c:510
 msgid "Cross-correlation..."
 msgstr "Corrélation croisée..."
 
-#: modules/process/superresolution.c:554 modules/xyz/xyz_raster.c:1079
-#: modules/xyz/xyz_raster.c:1119
+#: modules/process/superresolution.c:553 modules/xyz/xyz_raster.c:1053
+#: modules/xyz/xyz_raster.c:1093
 msgid "Interpolating..."
 msgstr "Interpolation..."
 
-#: modules/process/synth.h:343
+#: modules/process/synth.h:344
 msgid "Roundness"
 msgstr "Circularité"
 
-#: modules/process/synth.h:351
+#: modules/process/synth.h:352
 msgid "Roundn_ess:"
 msgstr "Circularité :"
 
-#: modules/process/synth.h:399
+#: modules/process/synth.h:401
 msgid "Orientation"
 msgstr "Orientation"
 
-#: modules/process/synth.h:408
+#: modules/process/synth.h:410
 msgid "Orien_tation:"
 msgstr "Orien_tation :"
 
-#: modules/process/synth.h:432
+#: modules/process/synth.h:436
+msgid "_Truncate:"
+msgstr "_Tronquer :"
+
+#: modules/process/synth.h:460
 msgid "Variance:"
 msgstr "Variance :"
 
-#: modules/process/synth.h:456
-msgid "Deformation"
-msgstr "Déformation"
-
-#: modules/process/synth.h:464
+#: modules/process/synth.h:493
 msgid "_Amplitude:"
 msgstr "_Amplitude :"
 
-#: modules/process/synth.h:472
+#: modules/process/synth.h:501
 msgid "_Lateral scale:"
 msgstr "Échelle _latérale :"
 
-#: modules/process/synth.h:566
+#: modules/process/synth.h:595
 msgid "Randomi_ze"
 msgstr "Randomiser"
 
@@ -12829,41 +13550,41 @@ msgstr "/Opérations _basiques/Li_miter la plage des valeurs..."
 msgid "Limit data range"
 msgstr "Limiter la plage des valeurs des données"
 
-#: modules/process/threshold.c:246
+#: modules/process/threshold.c:241
 msgid "Limit Range"
 msgstr "Limiter la plages des valeurs"
 
-#: modules/process/threshold.c:281
+#: modules/process/threshold.c:276
 msgid "Specify _thresholds"
 msgstr "Spécifier les seuils"
 
-#: modules/process/threshold.c:283
+#: modules/process/threshold.c:278
 msgid "Use _display range"
 msgstr "Utiliser la plage de données affichée"
 
-#: modules/process/threshold.c:285
+#: modules/process/threshold.c:280
 msgid "Cut off outlier_s"
 msgstr "Couper les valeurs aberrantes."
 
-#: modules/process/threshold.c:294
+#: modules/process/threshold.c:289
 msgid "_Lower:"
 msgstr "Bas :"
 
-#: modules/process/threshold.c:300
+#: modules/process/threshold.c:295
 msgid "_Upper:"
 msgstr "Ha_ut :"
 
-#: modules/process/threshold.c:305
+#: modules/process/threshold.c:300
 msgid "Set to _Full Range"
 msgstr "Afficher la plage des données complète"
 
 #. TRANSLATORS: This is a range: 123 to 456.
-#: modules/process/threshold.c:318
+#: modules/process/threshold.c:313
 #, c-format
 msgid "%.*f to %.*f"
 msgstr "%.*f à %.*f"
 
-#: modules/process/threshold.c:341
+#: modules/process/threshold.c:336
 msgid "F_arther than:"
 msgstr "Au-delà de :"
 
@@ -12883,11 +13604,11 @@ msgstr "Tilter l'image"
 msgid "Tilt"
 msgstr "Angle"
 
-#: modules/process/tilt.c:185 modules/volume/volume_slice.c:444
+#: modules/process/tilt.c:185 modules/volume/volume_slice.c:446
 msgid "_X:"
 msgstr "_X :"
 
-#: modules/process/tilt.c:194 modules/volume/volume_slice.c:464
+#: modules/process/tilt.c:194 modules/volume/volume_slice.c:469
 msgid "_Y:"
 msgstr "_Y :"
 
@@ -12895,32 +13616,32 @@ msgstr "_Y :"
 msgid "Angles"
 msgstr "Angles"
 
-#: modules/process/tip_blind.c:178
+#: modules/process/tip_blind.c:177
 msgid "Blind estimation of SPM tip using Villarubia's algorithm."
 msgstr ""
 "Estimation à l'aveugle d'une sonde SPM avec l'algorithme de Villarubia."
 
-#: modules/process/tip_blind.c:192
+#: modules/process/tip_blind.c:191
 msgid "/_Tip and Indentation/_Blind Estimation..."
 msgstr "/Sonde et indentation/Estimation à l'aveugle..."
 
-#: modules/process/tip_blind.c:196
+#: modules/process/tip_blind.c:195
 msgid "Blind tip estimation"
 msgstr "Estimation à l'aveugle de la sonde"
 
-#: modules/process/tip_blind.c:231
+#: modules/process/tip_blind.c:230
 msgid "Blind Tip Estimation"
 msgstr "Estimation à l'aveugle de la sonde"
 
-#: modules/process/tip_blind.c:232
+#: modules/process/tip_blind.c:231
 msgid "Run _Partial"
 msgstr "Estimation _partielle"
 
-#: modules/process/tip_blind.c:233
+#: modules/process/tip_blind.c:232
 msgid "Run _Full"
 msgstr "Estimation complète"
 
-#: modules/process/tip_blind.c:234
+#: modules/process/tip_blind.c:233
 msgid "_Reset Tip"
 msgstr "Initialise_r la sonde"
 
@@ -12928,77 +13649,77 @@ msgstr "Initialise_r la sonde"
 msgid "Related _data:"
 msgstr "_Données reliées :"
 
-#: modules/process/tip_blind.c:326
+#: modules/process/tip_blind.c:327
 msgid "Estimated Tip Size"
 msgstr "Taille estimée de la sonde"
 
-#: modules/process/tip_blind.c:347
+#: modules/process/tip_blind.c:350
 msgid "_Same resolution"
 msgstr "Même ré_solution"
 
-#: modules/process/tip_blind.c:366
+#: modules/process/tip_blind.c:376
 msgid "Noise suppression t_hreshold:"
 msgstr "Seuil de suppression du bruit : "
 
-#: modules/process/tip_blind.c:386
+#: modules/process/tip_blind.c:384
 msgid "Use _boundaries"
 msgstr "Utiliser les bords"
 
-#: modules/process/tip_blind.c:396
+#: modules/process/tip_blind.c:395
 msgid "Stripes"
 msgstr "Bandes"
 
-#: modules/process/tip_blind.c:402
+#: modules/process/tip_blind.c:401
 msgid "_Split to stripes:"
 msgstr "_Séparer en bandes :"
 
-#: modules/process/tip_blind.c:416
+#: modules/process/tip_blind.c:412
 msgid "_Preview stripe:"
 msgstr "Bande d'aperçu :"
 
-#: modules/process/tip_blind.c:423
+#: modules/process/tip_blind.c:420
 msgid "Plot size _graph"
 msgstr "Afficher le graphe de la taille"
 
-#: modules/process/tip_blind.c:433
+#: modules/process/tip_blind.c:430
 msgid "Create tip i_mages"
 msgstr "Créer des i_mages de la sonde"
 
 #. TRANSLATORS: Prefix for the progressbar message.
-#: modules/process/tip_blind.c:810
+#: modules/process/tip_blind.c:807
 #, c-format
 msgid "Stripe %u: "
 msgstr "Bande %u :"
 
-#: modules/process/tip_blind.c:917 modules/process/tip_blind.c:941
+#: modules/process/tip_blind.c:914 modules/process/tip_blind.c:938
 msgid "Estimated tip"
 msgstr "Sonde estimée"
 
-#: modules/process/tip_blind.c:1207 modules/process/tip_blind.c:1216
+#: modules/process/tip_blind.c:1204 modules/process/tip_blind.c:1213
 msgid "Tip radius evolution"
 msgstr "Évolution du rayon de la sonde"
 
-#: modules/process/tip_model.c:114
+#: modules/process/tip_model.c:112
 msgid "Models SPM tip."
 msgstr "Modélise la sonde SPM."
 
-#: modules/process/tip_model.c:129
+#: modules/process/tip_model.c:127
 msgid "/_Tip and Indentation/_Model Tip..."
 msgstr "/Sonde et indentation/Modéliser la sonde..."
 
-#: modules/process/tip_model.c:133
+#: modules/process/tip_model.c:131
 msgid "Model AFM tip"
 msgstr "Modéliser une sonde AFM"
 
-#: modules/process/tip_model.c:164
+#: modules/process/tip_model.c:162
 msgid "Model Tip"
 msgstr "Modélise une sonde"
 
-#: modules/process/tip_model.c:224
+#: modules/process/tip_model.c:222
 msgid "Tip _type:"
 msgstr "_Type de sonde :"
 
-#: modules/process/tip_model.c:229
+#: modules/process/tip_model.c:228
 msgid "_Number of sides:"
 msgstr "_Nombre de côtés"
 
@@ -13010,19 +13731,19 @@ msgstr "Pente de la _sonde :"
 msgid "Tip _rotation:"
 msgstr "_Rotation de la sonde :"
 
-#: modules/process/tip_model.c:250
+#: modules/process/tip_model.c:255
 msgid "Tip _apex radius:"
 msgstr "Rayon de l'_apex de la sonde :"
 
-#: modules/process/tip_model.c:269
+#: modules/process/tip_model.c:265
 msgid "Tip _anisotropy:"
 msgstr "_Anisotropie de la sonde :"
 
-#: modules/process/tip_model.c:490
+#: modules/process/tip_model.c:484
 msgid "Modeled tip"
 msgstr "Sonde modélisée"
 
-#: modules/process/tip_model.c:562
+#: modules/process/tip_model.c:556
 #, c-format
 msgid "Tip resolution: %d × %d pixels"
 msgstr "Résolution de la sonde : %d × %d pixels."
@@ -13132,7 +13853,7 @@ msgid "Converts datafield to 3D volume data."
 msgstr "Convertir un champ de données en données volumiques 3D"
 
 #: modules/process/volumize.c:56
-msgid "/_Basic Operations/Volumize..."
+msgid "/_Basic Operations/Volumize"
 msgstr "/Opérations _basiques/Convertir en données volumiques..."
 
 #: modules/process/volumize.c:60
@@ -13177,73 +13898,77 @@ msgstr "Résolution _Z :"
 msgid "Z _range:"
 msgstr "Plage Z : "
 
-#: modules/process/wave_synth.c:211
+#: modules/process/wave_synth.c:219
 msgid "Generates various kinds of waves."
 msgstr "Génère divers types d'ondes."
 
-#: modules/process/wave_synth.c:225
+#: modules/process/wave_synth.c:233
 msgid "/S_ynthetic/_Waves..."
 msgstr "/S_ynthèse/Ondes..."
 
-#: modules/process/wave_synth.c:229
+#: modules/process/wave_synth.c:237
 msgid "Generate waves"
 msgstr "Générer des ondes"
 
-#: modules/process/wave_synth.c:347
+#: modules/process/wave_synth.c:366
 msgid "Waves"
 msgstr "Ondes"
 
-#: modules/process/wave_synth.c:422 modules/tools/linestats.c:337
-#: modules/tools/sfunctions.c:401 modules/volume/volume_linestat.c:369
+#: modules/process/wave_synth.c:441 modules/tools/linestats.c:337
+#: modules/tools/sfunctions.c:411 modules/volume/volume_linestat.c:374
 msgid "_Quantity:"
 msgstr "Quantité"
 
-#: modules/process/wave_synth.c:429
+#: modules/process/wave_synth.c:448
 msgid "_Number of waves:"
 msgstr "_Nombre d'ondes :"
 
-#: modules/process/wave_synth.c:436 modules/process/wave_synth.c:582
-#: modules/tools/roughness.c:274
+#: modules/process/wave_synth.c:455 modules/process/wave_synth.c:617
+#: modules/tools/roughness.c:275
 msgid "Amplitude"
 msgstr "Amplitude"
 
-#: modules/process/wave_synth.c:441
+#: modules/process/wave_synth.c:460
 msgid "_Wave form:"
 msgstr "Forme d'ondes : "
 
-#: modules/process/wave_synth.c:448
+#: modules/process/wave_synth.c:467
 msgid "Amplitude:"
 msgstr "Amplitude :"
 
-#: modules/process/wave_synth.c:466
+#: modules/process/wave_synth.c:487
+msgid "_Decay:"
+msgstr "_Décroissance :"
+
+#: modules/process/wave_synth.c:497
 msgid "Frequency"
 msgstr "Fréquence"
 
-#: modules/process/wave_synth.c:472
+#: modules/process/wave_synth.c:503
 msgid "_Spatial frequency:"
 msgstr "Fréquence spatiale :"
 
-#: modules/process/wave_synth.c:488
+#: modules/process/wave_synth.c:519
 msgid "_X center:"
 msgstr "Centre _X :"
 
-#: modules/process/wave_synth.c:499
+#: modules/process/wave_synth.c:532
 msgid "_Y center:"
 msgstr "Centre _Y :"
 
-#: modules/process/wave_synth.c:565
+#: modules/process/wave_synth.c:600
 msgid "Cosine"
 msgstr "Sinusoïde"
 
-#: modules/process/wave_synth.c:566
+#: modules/process/wave_synth.c:601
 msgid "Inverse cosh"
 msgstr "Argument cosinus hyperbolique"
 
-#: modules/process/wave_synth.c:567
+#: modules/process/wave_synth.c:602
 msgid "Flat top"
 msgstr "Plateau"
 
-#: modules/process/wave_synth.c:581
+#: modules/process/wave_synth.c:616
 msgid "Displacement"
 msgstr "Déplacement"
 
@@ -13327,39 +14052,39 @@ msgstr "Pré-traiter l'image"
 msgid "Preprocess and mark"
 msgstr "Pré-traiter et marquer"
 
-#: modules/process/xydenoise.c:57
+#: modules/process/xydenoise.c:58
 msgid "Denoises measurement on basis of two orthogonal scans."
 msgstr "Débruitage basé sur deux mesures orthogonales."
 
-#: modules/process/xydenoise.c:71
+#: modules/process/xydenoise.c:72
 msgid "/M_ultidata/_XY denoise..."
 msgstr "/M_ultidonnées/Débruitage _XY..."
 
-#: modules/process/xydenoise.c:75
+#: modules/process/xydenoise.c:76
 msgid "Denoises horizontal/vertical measurement."
 msgstr "Débruitage de mesures horizontales et verticales."
 
-#: modules/process/xydenoise.c:102
+#: modules/process/xydenoise.c:103
 msgid "XY Denoising"
 msgstr "Débruitage XY"
 
-#: modules/process/xydenoise.c:124
+#: modules/process/xydenoise.c:125
 msgid "Second direction:"
 msgstr "Seconde direction :"
 
-#: modules/process/xydenoise.c:232
+#: modules/process/xydenoise.c:233
 msgid "Computing forward FFTs..."
 msgstr "Calcul des TF en cours..."
 
-#: modules/process/xydenoise.c:248
+#: modules/process/xydenoise.c:249
 msgid "Computing image..."
 msgstr "Calcul de l'image en cours..."
 
-#: modules/process/xydenoise.c:260
+#: modules/process/xydenoise.c:261
 msgid "Computing backward FFT..."
 msgstr "Calcul de la TF inverse en cours..."
 
-#: modules/process/xydenoise.c:272
+#: modules/process/xydenoise.c:273
 msgid "Denoised"
 msgstr "Débruité"
 
@@ -13375,63 +14100,67 @@ msgstr "/Opérations _basiques/Convertir en données _XYZ..."
 msgid "Convert to XYZ data"
 msgstr "Convertir en données XYZ"
 
-#: modules/pygwy/pygwy-console.c:55
+#: modules/pygwy/pygwy-console.c:99
 msgid "/Pygwy Console"
 msgstr "/Console Pygwy"
 
-#: modules/pygwy/pygwy-console.c:59
+#: modules/pygwy/pygwy-console.c:103
 msgid "Python wrapper console"
 msgstr "Console Python"
 
-#: modules/pygwy/pygwy-console.c:142
-msgid ">>> Running the script above\n"
-msgstr ">>> Calcul en cours du script\n"
-
-#: modules/pygwy/pygwy-console.c:194
-msgid "Open Python script"
-msgstr "Ouvrir un script Python"
-
-#: modules/pygwy/pygwy-console.c:275
-msgid "Save Script as"
-msgstr "Sauver le script sous"
-
-#: modules/pygwy/pygwy-console.c:327
+#: modules/pygwy/pygwy-console.c:168 modules/pygwy/pygwy-console.c:481
 msgid "Pygwy Console"
 msgstr "Console Pygwy"
 
-#: modules/pygwy/pygwy-console.c:340
-msgid "Clear Log"
-msgstr "Effacer le journal"
-
-#: modules/pygwy/pygwy-console.c:344
+#: modules/pygwy/pygwy-console.c:187
 msgid "Open script in Python language (Ctrl-O)"
 msgstr "Ouvrir un script Python (Ctrl-O)"
 
-#: modules/pygwy/pygwy-console.c:346
+#: modules/pygwy/pygwy-console.c:197
 msgid "Save script (Ctrl-S)"
-msgstr "Sauver le script (Ctrl-S)"
+msgstr "Enregistrer le script (Ctrl-S)"
 
-#: modules/pygwy/pygwy-console.c:348
+#: modules/pygwy/pygwy-console.c:207
+msgid "Save script as (Ctrl-Shift-S)"
+msgstr "Enregistrer le script sous (Ctrl-Maj-S)"
+
+#: modules/pygwy/pygwy-console.c:217
 msgid "Execute script (Ctrl-E)"
 msgstr "Exécuter le script (Ctrl-E)"
 
-#: modules/pygwy/pygwy-console.c:426
+#: modules/pygwy/pygwy-console.c:227
+msgid "Clear Log"
+msgstr "Effacer le journal"
+
+#: modules/pygwy/pygwy-console.c:285
 msgid "Command"
 msgstr "Commande "
 
-#: pygwy.c:120
+#: modules/pygwy/pygwy-console.c:371
+msgid ">>> Running the script above\n"
+msgstr ">>> Calcul en cours du script\n"
+
+#: modules/pygwy/pygwy-console.c:425
+msgid "Save Python Script as"
+msgstr "Enregistrer le script Python sous"
+
+#: modules/pygwy/pygwy-console.c:429
+msgid "Open Python Script"
+msgstr "Ouvrir un script Python"
+
+#: pygwy.c:130
 msgid "Pygwy, the Gwyddion Python wrapper."
 msgstr "Pygwy, l'interface Python pour Gwyddion"
 
-#: pygwy.c:258
+#: pygwy.c:269
 msgid "Python Interpreter Errors"
 msgstr "Erreurs de l'interpréteur Python"
 
-#: pygwy.c:384
+#: pygwy.c:399
 msgid "Python interpreter error occurred."
 msgstr "Une erreur s'est produite dans l'interpréteur Python."
 
-#: pygwy.c:459
+#: pygwy.c:499
 msgid "Function written in Python"
 msgstr "Fonction écrite en Python"
 
@@ -13456,11 +14185,11 @@ msgid "Measure distances and directions between points"
 msgstr "Mesure de distances et de directions entre des points"
 
 #. TRANSLATORS: Number is verb here.
-#: modules/tools/distance.c:250 modules/tools/profile.c:532
+#: modules/tools/distance.c:250 modules/tools/profile.c:527
 msgid "_Number lines"
 msgstr "_Numéroter les lignes"
 
-#: modules/tools/filter.c:128
+#: modules/tools/filter.c:129
 msgid ""
 "Filter tool, processes selected part of data with a filter (conservative "
 "denoise, mean, median. Kuwahara, minimum, maximum)."
@@ -13468,27 +14197,27 @@ msgstr ""
 "Outil filtre, traite une partie sélectionnée avec un filtre (débruitage "
 "conservatif, moyenne, médiane, Kuwahara, minimum, maximum)."
 
-#: modules/tools/filter.c:171
+#: modules/tools/filter.c:172
 msgid "Basic filters: mean, median, denoise, …"
 msgstr "Filtres basiques : moyenne, médiane, débruitage..."
 
-#: modules/tools/filter.c:239
+#: modules/tools/filter.c:240
 msgid "Conservative denoise"
 msgstr "Débruitage conservatif"
 
-#: modules/tools/filter.c:246
+#: modules/tools/filter.c:247
 msgid "Kuwahara"
 msgstr "Kuwahara"
 
-#: modules/tools/filter.c:247
+#: modules/tools/filter.c:248
 msgid "Dechecker"
 msgstr "Décareler"
 
-#: modules/tools/filter.c:248
+#: modules/tools/filter.c:249
 msgid "filter|Gaussian"
 msgstr "Gaussien"
 
-#: modules/tools/filter.c:249
+#: modules/tools/filter.c:250
 msgid "Sharpen"
 msgstr "Accentuer"
 
@@ -13586,7 +14315,7 @@ msgid "Height histogram"
 msgstr "Histogramme des hauteurs"
 
 #: modules/tools/icolorange.c:329 modules/tools/linestats.c:169
-#: modules/tools/sfunctions.c:226 modules/volume/volume_linestat.c:146
+#: modules/tools/sfunctions.c:231 modules/volume/volume_linestat.c:148
 msgid "Range"
 msgstr "Plage"
 
@@ -13614,7 +14343,7 @@ msgstr "_Inverser les couleurs"
 msgid "range|Full"
 msgstr "Complète"
 
-#: modules/tools/level3.c:106
+#: modules/tools/level3.c:108
 msgid ""
 "Three-point level tool, levels data by subtracting a plane fitted through "
 "three selected points."
@@ -13622,23 +14351,23 @@ msgstr ""
 "Outil de mise à niveau avec trois points, met à niveau les données en "
 "soustrayant un plan ajusté sur trois points sélectionnés."
 
-#: modules/tools/level3.c:143
+#: modules/tools/level3.c:145
 msgid "Three Point Level"
 msgstr "Mise à niveau par 3 points"
 
-#: modules/tools/level3.c:144
+#: modules/tools/level3.c:146
 msgid "Level data by fitting a plane through three points"
 msgstr "Met à niveaux les données en ajustant un plan grâce à 3 points"
 
-#: modules/tools/level3.c:239 modules/tools/readvalue.c:375
+#: modules/tools/level3.c:244 modules/tools/readvalue.c:378
 msgid "_Averaging radius:"
 msgstr "R_ayon de moyennage :"
 
-#: modules/tools/level3.c:246
+#: modules/tools/level3.c:251
 msgid "_Instant apply"
 msgstr "Mise à jour _instantanée"
 
-#: modules/tools/level3.c:255
+#: modules/tools/level3.c:261
 msgid "Set plane to _zero"
 msgstr "Mise à zéro du plan"
 
@@ -13650,23 +14379,23 @@ msgstr ""
 "Outil de calcul statistique de ligne/colonne, calcule les valeurs moyenne, "
 "médiane, maximale, minimale, RMS, ..., de lignes ou de colonnes."
 
-#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:148
+#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:150
 msgid "tan β<sub>0</sub>"
 msgstr "tan β<sub>0</sub>"
 
-#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:150
+#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:152
 msgid "Ra"
 msgstr "Ra"
 
-#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:151
+#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:153
 msgid "Rq (RMS)"
 msgstr "Rq (RMS)"
 
-#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:152
+#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:154
 msgid "Rz"
 msgstr "Rz"
 
-#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:153
+#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:155
 msgid "Rt"
 msgstr "Rt"
 
@@ -13690,16 +14419,11 @@ msgstr "Colonnes"
 msgid "Average:"
 msgstr "Moyenne :"
 
-#: modules/tools/linestats.c:363 modules/tools/profile.c:464
-#: modules/tools/sfunctions.c:414 modules/tools/spectro.c:343
+#: modules/tools/linestats.c:363 modules/tools/profile.c:460
+#: modules/tools/sfunctions.c:424 modules/tools/spectro.c:346
 msgid "<b>Options</b>"
 msgstr "<b>Options</b>"
 
-#: modules/tools/linestats.c:379 modules/tools/sfunctions.c:430
-#: modules/tools/stats.c:408
-msgid "_Instant updates"
-msgstr "Mises à jour instantanées"
-
 #: modules/tools/maskedit.c:170
 msgid "Mask editor tool, allows interactive modification of parts of the mask."
 msgstr ""
@@ -13758,63 +14482,63 @@ msgstr "Remplir les parties vides continues avec un masque"
 msgid "Erase continuous parts of mask"
 msgstr "Effacer les parties continues d'un masque"
 
-#: modules/tools/maskedit.c:408
+#: modules/tools/maskedit.c:409
 msgid "Editor"
 msgstr "Éditeur"
 
-#: modules/tools/maskedit.c:413
+#: modules/tools/maskedit.c:414
 msgid "_Shapes"
 msgstr "Forme_s :"
 
-#: modules/tools/maskedit.c:423
+#: modules/tools/maskedit.c:428
 msgid "Mode:"
 msgstr "Mode :"
 
-#: modules/tools/maskedit.c:452
+#: modules/tools/maskedit.c:458
 msgid "Shape:"
 msgstr "Forme :"
 
-#: modules/tools/maskedit.c:483
+#: modules/tools/maskedit.c:486
 msgid "_Drawing Tools"
 msgstr "Outils de _dessin"
 
-#: modules/tools/maskedit.c:493
+#: modules/tools/maskedit.c:500
 msgid "Tool:"
 msgstr "Outil :"
 
-#: modules/tools/maskedit.c:532
+#: modules/tools/maskedit.c:538
 msgid "Actions"
 msgstr "Actions"
 
-#: modules/tools/maskedit.c:540
+#: modules/tools/maskedit.c:546
 msgid "_Invert"
 msgstr "_Inverser"
 
-#: modules/tools/maskedit.c:571
+#: modules/tools/maskedit.c:577
 msgid "Fill _Voids"
 msgstr "Remplir les _vides"
 
-#: modules/tools/maskedit.c:580
+#: modules/tools/maskedit.c:586
 msgid "Fill non-simple-connected"
 msgstr "Remplir les vides à connexions multiples"
 
-#: modules/tools/maskedit.c:591
+#: modules/tools/maskedit.c:597
 msgid "Grow/Shrink"
 msgstr "Dilater / Éroder"
 
-#: modules/tools/maskedit.c:600
+#: modules/tools/maskedit.c:606
 msgid "_Grow"
 msgstr "Dilater"
 
-#: modules/tools/maskedit.c:608
+#: modules/tools/maskedit.c:614
 msgid "Shrin_k"
 msgstr "Éroder"
 
-#: modules/tools/maskedit.c:623
+#: modules/tools/maskedit.c:629
 msgid "_Amount:"
 msgstr "Qu_antité :"
 
-#: modules/tools/maskedit.c:651
+#: modules/tools/maskedit.c:657
 msgid "_Prevent grain merging by growing"
 msgstr "Em_pêcher la fusion de grains lors d'une dilatation"
 
@@ -13834,83 +14558,95 @@ msgstr ""
 "Met à niveau les lignes en utilisant les intersections des lignes définies "
 "par l'utilisateur"
 
-#: modules/tools/profile.c:222
+#: modules/tools/profile.c:216
 msgid "Profile tool, creates profile graphs from selected lines."
 msgstr "Outil profil, crée des profils à partir des lignes sélectionnées."
 
-#: modules/tools/profile.c:276 modules/tools/profile.c:630
+#: modules/tools/profile.c:270 modules/tools/profile.c:609
 msgid "Profiles"
 msgstr "Profils"
 
-#: modules/tools/profile.c:277
+#: modules/tools/profile.c:271
 msgid "Extract profiles"
 msgstr "Extraire les profils"
 
-#: modules/tools/profile.c:480
-msgid "_Radial profiles"
-msgstr "Profils _radiaux"
-
-#: modules/tools/profile.c:493
-msgid "Symmetrize _All"
-msgstr "Tout symétriser"
+#: modules/tools/profile.c:478
+msgid "Linear profiles"
+msgstr "Profils linéaires"
 
-#: modules/tools/profile.c:498
-msgid "S_ymmetrize"
-msgstr "S_ymétriser"
+#: modules/tools/profile.c:480
+msgid "Radial profiles"
+msgstr "Profils radiaux"
 
-#: modules/tools/profile.c:542
+#: modules/tools/profile.c:537
 msgid "_Separate profiles"
 msgstr "Profils _séparés"
 
-#: modules/tools/profile.c:607
+#: modules/tools/profile.c:587
 msgid "_Calibration data:"
 msgstr "Données de _calibration :"
 
-#: modules/tools/profile.c:620
+#: modules/tools/profile.c:600
 msgid "_Show profile"
 msgstr "Montrer le profil"
 
-#: modules/tools/profile.c:887
+#: modules/tools/profile.c:861
 #, c-format
 msgid "X error %d"
 msgstr "Erreur X %d"
 
-#: modules/tools/profile.c:891
+#: modules/tools/profile.c:865
 #, c-format
 msgid "Y error %d"
 msgstr "Erreur Y %d"
 
-#: modules/tools/profile.c:895
+#: modules/tools/profile.c:869
 #, c-format
 msgid "Z error %d"
 msgstr "Erreur Z %d"
 
-#: modules/tools/profile.c:899
+#: modules/tools/profile.c:873
 #, c-format
 msgid "X uncertainty %d"
 msgstr "Incertitude X %d"
 
-#: modules/tools/profile.c:903
+#: modules/tools/profile.c:877
 #, c-format
 msgid "Y uncertainty %d"
 msgstr "Incertitude Y %d"
 
-#: modules/tools/profile.c:907
+#: modules/tools/profile.c:881
 #, c-format
 msgid "Z uncertainty %d"
 msgstr "Incertitude Z %d"
 
-#: modules/tools/profile.c:912
+#: modules/tools/profile.c:886
 #, c-format
 msgid "Zunc up bound %d"
 msgstr "Z inc. limite haute %d"
 
-#: modules/tools/profile.c:917
+#: modules/tools/profile.c:891
 #, c-format
 msgid "Zunc low bound %d"
 msgstr "Z inc. limite basse %d"
 
-#: modules/tools/profile.c:1817
+#: modules/tools/profile.c:1637
+msgid "S_ymmetrize"
+msgstr "S_ymétriser"
+
+#: modules/tools/profile.c:1639
+msgid "Symmetrize _All"
+msgstr "Tout symétriser"
+
+#: modules/tools/profile.c:1643
+msgid "Improve _Direction"
+msgstr "Améliorer la _direction :"
+
+#: modules/tools/profile.c:1645
+msgid "Improve _All"
+msgstr "Tout _améliorer"
+
+#: modules/tools/profile.c:1866
 msgid "calib-data|None"
 msgstr "Aucune"
 
@@ -13926,194 +14662,194 @@ msgstr "Lire la valeur"
 msgid "Read value under mouse cursor"
 msgstr "Lire la valeur sous le curseur"
 
-#: modules/tools/readvalue.c:304
+#: modules/tools/readvalue.c:307
 msgid "Set _Zero"
 msgstr "Mise à zéro"
 
-#: modules/tools/readvalue.c:307
+#: modules/tools/readvalue.c:310
 msgid "Shift plane z=0 to pass through the selected point"
 msgstr "Déplace le plan z=0 de manière à passer par les points sélectionnés"
 
-#: modules/tools/readvalue.c:315
+#: modules/tools/readvalue.c:318
 msgid "Facet"
 msgstr "Facette"
 
-#: modules/tools/readvalue.c:340
+#: modules/tools/readvalue.c:343
 msgid "Curvatures"
 msgstr "Courbures"
 
-#: modules/tools/readvalue.c:382
+#: modules/tools/readvalue.c:386
 msgid "Show _selection"
 msgstr "Montrer la _sélection"
 
-#: modules/tools/roughness.c:282
+#: modules/tools/roughness.c:283
 msgid "Roughness average"
 msgstr "Rugosité moyenne"
 
-#: modules/tools/roughness.c:290
+#: modules/tools/roughness.c:291
 msgid "Root mean square roughness"
 msgstr "Rugosité RMS"
 
-#: modules/tools/roughness.c:298
+#: modules/tools/roughness.c:299
 msgid "Maximum height of the roughness"
 msgstr "Amplitude maximale"
 
-#: modules/tools/roughness.c:306
+#: modules/tools/roughness.c:307
 msgid "Maximum roughness valley depth"
 msgstr "Profondeur minimale des vallées"
 
-#: modules/tools/roughness.c:314
+#: modules/tools/roughness.c:315
 msgid "Maximum roughness peak height"
 msgstr "Hauteur maximale des pics"
 
-#: modules/tools/roughness.c:322 modules/tools/roughness.c:370
+#: modules/tools/roughness.c:323 modules/tools/roughness.c:371
 msgid "Average maximum height of the roughness"
 msgstr "Amplitude moyenne"
 
-#: modules/tools/roughness.c:330
+#: modules/tools/roughness.c:331
 msgid "Average maximum roughness valley depth"
 msgstr "Profondeur moyenne des vallées"
 
-#: modules/tools/roughness.c:338
+#: modules/tools/roughness.c:339
 msgid "Average maximum roughness peak height"
 msgstr "Hauteur moyenne des pics"
 
-#: modules/tools/roughness.c:346 modules/tools/roughness.c:354
+#: modules/tools/roughness.c:347 modules/tools/roughness.c:355
 msgid "Average third highest peak to third lowest valley height"
 msgstr "Profondeur de rugosité"
 
-#: modules/tools/roughness.c:362
+#: modules/tools/roughness.c:363
 msgid "Average maximum height of the profile"
 msgstr "Hauteur maximale moyenne du profil"
 
-#: modules/tools/roughness.c:378
+#: modules/tools/roughness.c:379
 msgid "Skewness"
 msgstr "Asymétrie"
 
-#: modules/tools/roughness.c:394
+#: modules/tools/roughness.c:395
 msgid "Waviness average"
 msgstr "Ondulation moyenne"
 
-#: modules/tools/roughness.c:402
+#: modules/tools/roughness.c:403
 msgid "Root mean square waviness"
 msgstr "Ondulation RMS"
 
-#: modules/tools/roughness.c:410
+#: modules/tools/roughness.c:411
 msgid "Waviness maximum height"
 msgstr "Hauteur maximale de l'ondulation"
 
-#: modules/tools/roughness.c:418
+#: modules/tools/roughness.c:419
 msgid "Maximum height of the profile"
 msgstr "Hauteur maximale du profil"
 
-#: modules/tools/roughness.c:426
+#: modules/tools/roughness.c:427
 msgid "Spatial"
 msgstr "Spatial"
 
-#: modules/tools/roughness.c:476
+#: modules/tools/roughness.c:477
 msgid "Average wavelength of the profile"
 msgstr "Longueur d'onde moyenne du profil"
 
-#: modules/tools/roughness.c:484
+#: modules/tools/roughness.c:485
 msgid "Root mean square (RMS) wavelength of the profile"
 msgstr "Longueur d'onde RMS du profil"
 
-#: modules/tools/roughness.c:492
+#: modules/tools/roughness.c:493
 msgid "Hybrid"
 msgstr "Hybride"
 
-#: modules/tools/roughness.c:500
+#: modules/tools/roughness.c:501
 msgid "Average absolute slope"
 msgstr "Pente absolue moyenne"
 
-#: modules/tools/roughness.c:508
+#: modules/tools/roughness.c:509
 msgid "Root mean square (RMS) slope"
 msgstr "Pente RMS"
 
-#: modules/tools/roughness.c:524
+#: modules/tools/roughness.c:525
 msgid "Developed profile length"
 msgstr "Longueur du profil développé"
 
-#: modules/tools/roughness.c:532
+#: modules/tools/roughness.c:533
 msgid "Profile length ratio"
 msgstr "Rapport de longueur de profil"
 
-#: modules/tools/roughness.c:615
+#: modules/tools/roughness.c:616
 msgid "Calculate surface profile parameters."
 msgstr "Calculer les paramètres du profil de surface."
 
-#: modules/tools/roughness.c:648 modules/tools/roughness.c:773
-#: modules/tools/roughness.c:1452
+#: modules/tools/roughness.c:649 modules/tools/roughness.c:774
+#: modules/tools/roughness.c:1479
 msgid "Roughness"
 msgstr "Rugosité"
 
-#: modules/tools/roughness.c:649
+#: modules/tools/roughness.c:650
 msgid "Calculate roughness parameters"
 msgstr "Calculer les paramètres de rugosité"
 
-#: modules/tools/roughness.c:771 modules/tools/roughness.c:1450
+#: modules/tools/roughness.c:772 modules/tools/roughness.c:1477
 msgid "Texture"
 msgstr "Texture"
 
-#: modules/tools/roughness.c:772 modules/tools/roughness.c:1451
+#: modules/tools/roughness.c:773 modules/tools/roughness.c:1478
 msgid "Waviness"
 msgstr "Ondulation"
 
-#: modules/tools/roughness.c:774
+#: modules/tools/roughness.c:775
 msgid "ADF"
 msgstr "Distribution d'amplitude"
 
-#: modules/tools/roughness.c:775
+#: modules/tools/roughness.c:776
 msgid "BRC"
 msgstr "Distribution d'amplitude cumulée"
 
-#: modules/tools/roughness.c:776 modules/tools/roughness.c:1455
+#: modules/tools/roughness.c:777 modules/tools/roughness.c:1482
 msgid "Peak Count"
 msgstr "Comptage des pics"
 
-#: modules/tools/roughness.c:838 modules/xyz/xyz_drift.c:1090
+#: modules/tools/roughness.c:839 modules/xyz/xyz_drift.c:1090
 msgid "_Graph:"
 msgstr "_Graphe :"
 
-#: modules/tools/roughness.c:845
+#: modules/tools/roughness.c:847
 msgid "C_ut-off:"
 msgstr "Co_upure :"
 
-#: modules/tools/roughness.c:1324
+#: modules/tools/roughness.c:1345
 msgid "No profile selected."
 msgstr "Aucun profil sélectionné."
 
-#: modules/tools/roughness.c:1453
+#: modules/tools/roughness.c:1480
 msgid "Amplitude Distribution Function"
 msgstr "Distribution d'amplitude"
 
-#: modules/tools/roughness.c:1454
+#: modules/tools/roughness.c:1481
 msgid "The Bearing Ratio Curve"
 msgstr "Distribution d'amplitude cumulée"
 
-#: modules/tools/roughness.c:1489
+#: modules/tools/roughness.c:1516
 msgid "Surface Profiles"
 msgstr "Profils de surface"
 
-#: modules/tools/roughness.c:1877
+#: modules/tools/roughness.c:1904
 msgid "Save Roughness Parameters"
 msgstr "Enregistrer les paramètres de rugosité"
 
-#: modules/tools/roughness.c:1934
+#: modules/tools/roughness.c:1961
 msgid "Roughness Parameters"
 msgstr "Paramètres de rugosité"
 
-#: modules/tools/roughness.c:1940
+#: modules/tools/roughness.c:1967
 #, c-format
 msgid "File:              %s\n"
 msgstr "Fichier :              %s\n"
 
-#: modules/tools/roughness.c:1944
+#: modules/tools/roughness.c:1971
 #, c-format
 msgid "Data channel:      %s\n"
 msgstr "Canal de données :      %s\n"
 
-#: modules/tools/roughness.c:1975
+#: modules/tools/roughness.c:2002
 #, c-format
 msgid ""
 "Selected line:     (%s, %s) to (%s, %s) px\n"
@@ -14150,7 +14886,7 @@ msgstr "vers tous les fichiers"
 msgid "_Copy"
 msgstr "_Copier"
 
-#: modules/tools/sfunctions.c:181
+#: modules/tools/sfunctions.c:186
 msgid ""
 "Statistical function tool, calculates one-dimensional statistical functions "
 "(height distribution, correlations, PSDF, Minkowski functionals) of selected "
@@ -14160,87 +14896,91 @@ msgstr ""
 "(distribution de hauteur, correlations, PSDF, fonctions de Minkowski) de la "
 "partie sélectionnée des données."
 
-#: modules/tools/sfunctions.c:214
+#: modules/tools/sfunctions.c:219
 msgid "Height distribution"
 msgstr "Distribution des hauteurs"
 
-#: modules/tools/sfunctions.c:215
+#: modules/tools/sfunctions.c:220
 msgid "Cum. height distribution"
 msgstr "Distribution des hauteurs cumulée"
 
-#: modules/tools/sfunctions.c:216
+#: modules/tools/sfunctions.c:221
 msgid "Distribution of angles"
 msgstr "Distribution angulaire"
 
-#: modules/tools/sfunctions.c:217
+#: modules/tools/sfunctions.c:222
 msgid "Cum. distribution of angles"
 msgstr "Distribution cumulée des angles"
 
-#: modules/tools/sfunctions.c:218
+#: modules/tools/sfunctions.c:223
 msgid "ACF"
 msgstr "ACF"
 
-#: modules/tools/sfunctions.c:219
+#: modules/tools/sfunctions.c:224
 msgid "HHCF"
 msgstr "HHCF"
 
-#: modules/tools/sfunctions.c:220
+#: modules/tools/sfunctions.c:225
 msgid "PSDF"
 msgstr "PSDF"
 
-#: modules/tools/sfunctions.c:221
+#: modules/tools/sfunctions.c:226
 msgid "Radial PSDF"
 msgstr "PSDF radiale"
 
-#: modules/tools/sfunctions.c:222
+#: modules/tools/sfunctions.c:227
 msgid "Radial ACF"
 msgstr "ACF radiale"
 
-#: modules/tools/sfunctions.c:223
+#: modules/tools/sfunctions.c:228
 msgid "Minkowski volume"
 msgstr "Volume de Minkowski"
 
-#: modules/tools/sfunctions.c:224
+#: modules/tools/sfunctions.c:229
 msgid "Minkowski boundary"
 msgstr "Limite de Minkowski"
 
-#: modules/tools/sfunctions.c:225
+#: modules/tools/sfunctions.c:230
 msgid "Minkowski connectivity"
 msgstr "Connectivité de Minkowski"
 
-#: modules/tools/sfunctions.c:251
+#: modules/tools/sfunctions.c:232
+msgid "Area scale graph"
+msgstr ""
+
+#: modules/tools/sfunctions.c:257
 msgid "Statistical Functions"
 msgstr "Fonctions statistiques"
 
-#: modules/tools/sfunctions.c:252
+#: modules/tools/sfunctions.c:258
 msgid "Calculate 1D statistical functions"
 msgstr "Calcule les fonctions statistiques 1D"
 
-#: modules/tools/sfunctions.c:504
+#: modules/tools/sfunctions.c:501
 msgid "_Separate uncertainty"
 msgstr "Incertitudes _séparées"
 
-#: modules/tools/spectro.c:151
+#: modules/tools/spectro.c:154
 msgid "Point Spectrum, extracts point spectra to a graph."
 msgstr "Spectre ponctuel, extrait des spectres ponctuels vers un graphe."
 
-#: modules/tools/spectro.c:190
+#: modules/tools/spectro.c:193
 msgid "Point Spectroscopy"
 msgstr "Spectroscopie ponctuelle"
 
-#: modules/tools/spectro.c:191
+#: modules/tools/spectro.c:194
 msgid "Extract and view point spectroscopy data"
 msgstr "Extrait et visualise les données de spectroscopie ponctuelle"
 
-#: modules/tools/spectro.c:359
+#: modules/tools/spectro.c:362
 msgid "_Separate spectra"
 msgstr "_Spectres séparés"
 
-#: modules/tools/spectro.c:369
+#: modules/tools/spectro.c:372
 msgid "_Average spectra"
 msgstr "Moyenner les spectres"
 
-#: modules/tools/spectro.c:508
+#: modules/tools/spectro.c:511
 msgid "Spectroscopy"
 msgstr "Spectroscopie"
 
@@ -14280,14 +15020,6 @@ msgstr "Aucun point sélectionné dans l'image."
 msgid "No area in the zoom selected."
 msgstr "Aucune zone sélectionnée pour le zoom."
 
-#: modules/tools/stats.c:205
-msgid "Average value:"
-msgstr "Moyenne :"
-
-#: modules/tools/stats.c:206
-msgid "Median:"
-msgstr "Médiane :"
-
 #: modules/tools/stats.c:207
 msgid "Ra (Sa):"
 msgstr "Ra (Sa) :"
@@ -14300,14 +15032,6 @@ msgstr "RMS (Sq) :"
 msgid "Rms (grain-wise):"
 msgstr "RMS (grains) : "
 
-#: modules/tools/stats.c:210
-msgid "Skew:"
-msgstr "Asymétrie :"
-
-#: modules/tools/stats.c:211
-msgid "Kurtosis:"
-msgstr "Kurtosis :"
-
 #: modules/tools/stats.c:212
 msgid "Surface area:"
 msgstr "Surface :"
@@ -14316,10 +15040,6 @@ msgstr "Surface :"
 msgid "Projected area:"
 msgstr "Surface projetée :"
 
-#: modules/tools/stats.c:214
-msgid "Variation:"
-msgstr "Variation :"
-
 #: modules/tools/stats.c:217
 msgid "Inclination θ:"
 msgstr "Inclinaison θ :"
@@ -14332,7 +15052,7 @@ msgstr "Inclinaison φ :"
 msgid "Statistics tool."
 msgstr "Outil statistique."
 
-#: modules/tools/stats.c:261 modules/tools/stats.c:1095
+#: modules/tools/stats.c:261 modules/tools/stats.c:1091
 msgid "Statistical Quantities"
 msgstr "Statistiques"
 
@@ -14340,29 +15060,29 @@ msgstr "Statistiques"
 msgid "Statistical quantities"
 msgstr "Statistiques"
 
-#: modules/tools/stats.c:1002
+#: modules/tools/stats.c:998
 msgid "Save Statistical Quantities"
 msgstr "Enregistrer les statistiques"
 
-#: modules/tools/stats.c:1100
+#: modules/tools/stats.c:1096
 #, c-format
 msgid "File:         %s\n"
 msgstr "Fichier :         %s\n"
 
-#: modules/tools/stats.c:1104
+#: modules/tools/stats.c:1100
 #, c-format
 msgid "Data channel: %s\n"
 msgstr "Canal de données : %s\n"
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "Yes"
 msgstr "Oui"
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "No"
 msgstr "Non"
 
-#: modules/tools/stats.c:1132
+#: modules/tools/stats.c:1128
 #, c-format
 msgid ""
 "Selected area: %s × %s at (%s, %s) px\n"
@@ -14386,182 +15106,178 @@ msgstr "/_Dimensions et unités..."
 msgid "Volume Dimensions and Units"
 msgstr "Dimensions et unités du volume"
 
-#: modules/volume/volume_calibrate.c:526
+#: modules/volume/volume_calibrate.c:486
 msgid "_Value range:"
 msgstr "Plage :"
 
-#: modules/volume/volume_calibrate.c:555
+#: modules/volume/volume_calibrate.c:508
 msgid "Value shi_ft:"
 msgstr "Décalage :"
 
-#: modules/volume/volume_calibrate.c:601
+#: modules/volume/volume_calibrate.c:542
 msgid "_Value calibration factor:"
 msgstr "Facteur de calibration :"
 
-#: modules/volume/volume_extract.c:223
+#: modules/volume/volume_extract.c:216
 msgid "Shows and/or extracts a section of volume data"
 msgstr "Affiche et/ou extrait une section de données volumiques"
 
-#: modules/volume/volume_extract.c:237
-msgid "/Show and _extract..."
+#: modules/volume/volume_extract.c:230
+msgid "/Show and _Extract..."
 msgstr "/Afficher et _extraire..."
 
-#: modules/volume/volume_extract.c:241
+#: modules/volume/volume_extract.c:234
 msgid "Show and/or extract a section of volume data"
 msgstr "Afficher et/ou extraire une section de données volumiques"
 
-#: modules/volume/volume_extract.c:270
+#: modules/volume/volume_extract.c:263
 msgid "X cross-section"
 msgstr "Section X"
 
-#: modules/volume/volume_extract.c:271
+#: modules/volume/volume_extract.c:264
 msgid "Y cross-section"
 msgstr "Section Y"
 
-#: modules/volume/volume_extract.c:272
+#: modules/volume/volume_extract.c:265
 msgid "Z cross-section"
 msgstr "Section Z"
 
-#: modules/volume/volume_extract.c:273 modules/volume/volume_extract.c:698
+#: modules/volume/volume_extract.c:266 modules/volume/volume_extract.c:684
 msgid "X direction sum"
 msgstr "Somme selon X"
 
-#: modules/volume/volume_extract.c:274 modules/volume/volume_extract.c:700
+#: modules/volume/volume_extract.c:267 modules/volume/volume_extract.c:686
 msgid "Y direction sum"
 msgstr "Somme selon Y"
 
-#: modules/volume/volume_extract.c:275 modules/volume/volume_extract.c:702
+#: modules/volume/volume_extract.c:268 modules/volume/volume_extract.c:688
 msgid "Z direction sum"
 msgstr "Somme selon Z"
 
-#: modules/volume/volume_extract.c:278
+#: modules/volume/volume_extract.c:271
 msgid "X direction"
 msgstr "Direction X"
 
-#: modules/volume/volume_extract.c:279
+#: modules/volume/volume_extract.c:272
 msgid "Y direction"
 msgstr "Direction Y"
 
-#: modules/volume/volume_extract.c:280
+#: modules/volume/volume_extract.c:273
 msgid "Z direction"
 msgstr "Direction Z"
 
-#: modules/volume/volume_extract.c:322
+#: modules/volume/volume_extract.c:315
 msgid "Volume data"
 msgstr "Données volumiques"
 
-#: modules/volume/volume_extract.c:324
+#: modules/volume/volume_extract.c:317
 msgid "_Load"
 msgstr "Charger"
 
-#: modules/volume/volume_extract.c:336
+#: modules/volume/volume_extract.c:329
 msgid "_Extract projection"
 msgstr "_Extraire la projection"
 
-#: modules/volume/volume_extract.c:354
+#: modules/volume/volume_extract.c:347
 msgid "Projections"
 msgstr "Intersections"
 
-#: modules/volume/volume_extract.c:404
+#: modules/volume/volume_extract.c:395
 msgid "Z position"
 msgstr "Position Z"
 
-#: modules/volume/volume_extract.c:409
+#: modules/volume/volume_extract.c:405
 msgid "Shown cut direction:"
 msgstr "Direction de coupe affichée :"
 
-#: modules/volume/volume_extract.c:419 modules/volume/volume_extract.c:500
-msgid "Show mode:"
-msgstr "Mode d'affichage : "
-
-#: modules/volume/volume_extract.c:490
+#: modules/volume/volume_extract.c:485
 msgid "Graph cut direction:"
 msgstr "Direction de coupe du graphe :"
 
-#: modules/volume/volume_extract.c:525
+#: modules/volume/volume_extract.c:511
 msgid "3D view"
 msgstr "Vue 3D"
 
-#: modules/volume/volume_extract.c:550
+#: modules/volume/volume_extract.c:538
 msgid "Zoom"
 msgstr "Zoom"
 
-#: modules/volume/volume_extract.c:558
+#: modules/volume/volume_extract.c:545
 msgid "Wireframe threshold"
 msgstr "Seuil du modèle filaire"
 
-#: modules/volume/volume_extract.c:566
+#: modules/volume/volume_extract.c:552
 msgid "Z scale"
 msgstr "Échelle Z"
 
-#: modules/volume/volume_extract.c:574
+#: modules/volume/volume_extract.c:559
 msgid "Opacity scale"
 msgstr "Opacité"
 
-#: modules/volume/volume_extract.c:580
-msgid "apply perspective"
+#: modules/volume/volume_extract.c:565
+msgid "Apply perspective"
 msgstr "Appliquer la perspective"
 
-#: modules/volume/volume_extract.c:589
-msgid "instant 3D render"
+#: modules/volume/volume_extract.c:574
+msgid "Instant 3D render"
 msgstr "Rendu 3D instantané"
 
-#: modules/volume/volume_extract.c:598
+#: modules/volume/volume_extract.c:587
 msgid "X view"
 msgstr "Vue X"
 
-#: modules/volume/volume_extract.c:604
+#: modules/volume/volume_extract.c:592
 msgid "Y view"
 msgstr "Vue Y"
 
-#: modules/volume/volume_extract.c:610
+#: modules/volume/volume_extract.c:597
 msgid "Z view"
 msgstr "Vue Z"
 
-#: modules/volume/volume_extract.c:683
+#: modules/volume/volume_extract.c:669
 #, c-format
 msgid "X cross-section at x: %d"
 msgstr "Section X pour x : %d"
 
-#: modules/volume/volume_extract.c:686
+#: modules/volume/volume_extract.c:672
 #, c-format
 msgid "Y cross-section at y: %d"
 msgstr "Section Y pour y : %d"
 
-#: modules/volume/volume_extract.c:690
+#: modules/volume/volume_extract.c:676
 #, c-format
 msgid "Z cross-section at Z = %g %s (#%d)"
 msgstr "Section Z pour Z = %g %s (#%d)"
 
-#: modules/volume/volume_extract.c:749 modules/volume/volume_slice.c:1264
+#: modules/volume/volume_extract.c:735 modules/volume/volume_slice.c:1278
 #, c-format
 msgid "X graph at y: %d z: %d"
 msgstr "Graphe X pour y : %d z : %d"
 
-#: modules/volume/volume_extract.c:752 modules/volume/volume_slice.c:1273
+#: modules/volume/volume_extract.c:738 modules/volume/volume_slice.c:1287
 #, c-format
 msgid "Y graph at x: %d z: %d"
 msgstr "Graphe Y pour x : %d z : %d"
 
-#: modules/volume/volume_extract.c:755 modules/volume/volume_slice.c:1255
+#: modules/volume/volume_extract.c:741 modules/volume/volume_slice.c:1269
 #, c-format
 msgid "Z graph at x: %d y: %d"
 msgstr "Graphe Z pour x : %d y : %d"
 
-#: modules/volume/volume_extract.c:776
+#: modules/volume/volume_extract.c:762
 msgid "Brick graph"
 msgstr "Graphe d'un cube de données"
 
-#: modules/volume/volume_extract.c:1056
+#: modules/volume/volume_extract.c:1042
 msgid "Load volume data"
 msgstr "Charger des données volumiques"
 
-#: modules/volume/volume_extract.c:1218
+#: modules/volume/volume_extract.c:1204
 #, c-format
 msgid "Shown range %g to %g"
 msgstr "Plage affichée : %g à %g"
 
-#: modules/volume/volume_extract.c:1911
+#: modules/volume/volume_extract.c:1897
 msgid "Building wireframe model..."
 msgstr "Construction du modèle filaire..."
 
@@ -14570,97 +15286,97 @@ msgid "Evaluate volume force-distance data"
 msgstr "Évaluer les données force-distance volumiques"
 
 #: modules/volume/volume_fdfit.c:213
-msgid "/_Evaluate FD data..."
+msgid "/_Evaluate FD Data..."
 msgstr "/_Évaluer les données F-D (force-distance)..."
 
 #: modules/volume/volume_fdfit.c:217
 msgid "Evaluate force-distance volume data"
 msgstr "Évaluer les données force-distance volumiques"
 
-#: modules/volume/volume_fdfit.c:368
+#: modules/volume/volume_fdfit.c:371
 msgid "Curve _X position:"
 msgstr "Position _X de la courbe :"
 
-#: modules/volume/volume_fdfit.c:386
+#: modules/volume/volume_fdfit.c:380
 msgid "Curve _Y position:"
 msgstr "Position _Y de la courbe :"
 
-#: modules/volume/volume_fdfit.c:535
+#: modules/volume/volume_fdfit.c:511
 msgid "e_stimate"
 msgstr "e_stimer"
 
-#: modules/volume/volume_invert.c:51
+#: modules/volume/volume_invert.c:39 modules/volume/volumeops.c:39
 msgid "Inverts value in volume data"
 msgstr "Inverse les valeurs dans les données volumiques"
 
-#: modules/volume/volume_invert.c:65
-msgid "/_Invert value"
+#: modules/volume/volume_invert.c:53
+msgid "/_Invert Value"
 msgstr "/_Inverser les valeurs"
 
-#: modules/volume/volume_invert.c:69
+#: modules/volume/volume_invert.c:57
 msgid "Invert value in volume data"
 msgstr "Inverser les valeurs dans les données volumiques"
 
-#: modules/volume/volume_kmeans.c:94
+#: modules/volume/volume_kmeans.c:95
 msgid "Calculates K-means clustering on volume data."
 msgstr "Calcule le partitionnement par k-moyennes de données volumiques."
 
-#: modules/volume/volume_kmeans.c:108
-msgid "/_K-means clustering..."
+#: modules/volume/volume_kmeans.c:109
+msgid "/_K-Means Clustering..."
 msgstr "/Partitionnement par _k-moyennes..."
 
-#: modules/volume/volume_kmeans.c:112
+#: modules/volume/volume_kmeans.c:113
 msgid "Calculate K-means clustering on volume data"
 msgstr "Calculer le partitionnement par k-moyennes de données volumiques"
 
-#: modules/volume/volume_kmeans.c:151
+#: modules/volume/volume_kmeans.c:152
 msgid "K-means"
 msgstr "k-moyennes"
 
-#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:164
+#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:163
 msgid "_Number of clusters:"
 msgstr "_Nombre de partitions :"
 
-#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:171
+#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:170
 msgid "Convergence _precision digits:"
 msgstr "Décimales de convergence :"
 
-#: modules/volume/volume_kmeans.c:184 modules/volume/volume_kmedians.c:178
+#: modules/volume/volume_kmeans.c:183 modules/volume/volume_kmedians.c:176
 msgid "_Max. iterations:"
 msgstr "Nombre d'itérations _max :"
 
-#: modules/volume/volume_kmeans.c:189 modules/volume/volume_kmedians.c:183
+#: modules/volume/volume_kmeans.c:187 modules/volume/volume_kmedians.c:181
 msgid "_Normalize"
 msgstr "_Normaliser"
 
-#: modules/volume/volume_kmeans.c:195
+#: modules/volume/volume_kmeans.c:193
 msgid "_Remove outliers"
 msgstr "Supp_rimer les points aberrants"
 
-#: modules/volume/volume_kmeans.c:208
+#: modules/volume/volume_kmeans.c:202
 msgid "Outliers _threshold:"
 msgstr "Seuil des poin_ts aberrants : "
 
-#: modules/volume/volume_kmeans.c:431
+#: modules/volume/volume_kmeans.c:425
 msgid "K-means iteration..."
 msgstr "Itération du calcul de k-moyennes..."
 
-#: modules/volume/volume_kmeans.c:651
+#: modules/volume/volume_kmeans.c:645
 #, c-format
 msgid "K-means cluster of %s"
 msgstr "Groupe des k-moyennes de %s"
 
-#: modules/volume/volume_kmeans.c:660
+#: modules/volume/volume_kmeans.c:654
 #, c-format
 msgid "K-means error of %s"
 msgstr "Erreur des k-moyennes de %s"
 
-#: modules/volume/volume_kmeans.c:670 modules/volume/volume_kmedians.c:514
+#: modules/volume/volume_kmeans.c:664 modules/volume/volume_kmedians.c:512
 #, c-format
 msgid "Pre-normalized intensity of %s"
 msgstr "Intensité pré-normalisée de %s"
 
-#: modules/volume/volume_kmeans.c:702
+#: modules/volume/volume_kmeans.c:696
 #, c-format
 msgid "K-means center %d"
 msgstr "Centre %d des k-moyennes"
@@ -14670,7 +15386,7 @@ msgid "Calculates K-medians clustering on volume data."
 msgstr "Calcule le partitionnement par k-médianes de données volumiques."
 
 #: modules/volume/volume_kmedians.c:102
-msgid "/_K-medians clustering..."
+msgid "/_K-Medians Clustering..."
 msgstr "/Partitionnement par _k-médianes..."
 
 #: modules/volume/volume_kmedians.c:106
@@ -14681,46 +15397,46 @@ msgstr "Calculer le partitionnement par k-médianes de données volumiques"
 msgid "K-Medians"
 msgstr "k-médianes"
 
-#: modules/volume/volume_kmedians.c:392
+#: modules/volume/volume_kmedians.c:390
 msgid "K-medians iteration..."
 msgstr "Itération du calcul de k-médianes..."
 
-#: modules/volume/volume_kmedians.c:495
+#: modules/volume/volume_kmedians.c:493
 #, c-format
 msgid "K-medians cluster of %s"
 msgstr "Groupe des k-médianes de %s"
 
-#: modules/volume/volume_kmedians.c:504
+#: modules/volume/volume_kmedians.c:502
 #, c-format
 msgid "K-medians error of %s"
 msgstr "Erreur des k-médianes de %s"
 
-#: modules/volume/volume_kmedians.c:546
+#: modules/volume/volume_kmedians.c:544
 #, c-format
 msgid "K-medians center %d"
 msgstr "Centre %d des k-médianes"
 
-#: modules/volume/volume_linestat.c:171
+#: modules/volume/volume_linestat.c:173
 msgid "Summarizes profiles of volume data to a channel."
 msgstr "Compile dans un canal les profils de données volumiques."
 
-#: modules/volume/volume_linestat.c:185
+#: modules/volume/volume_linestat.c:187
 msgid "/Summarize _Profiles..."
 msgstr "/Compiler les _profils..."
 
-#: modules/volume/volume_linestat.c:189
+#: modules/volume/volume_linestat.c:191
 msgid "Summarize profiles"
 msgstr "Compiler les profils"
 
-#: modules/volume/volume_linestat.c:249
+#: modules/volume/volume_linestat.c:251
 msgid "_Extract image"
 msgstr "_Extraire l'image"
 
-#: modules/volume/volume_linestat.c:250
+#: modules/volume/volume_linestat.c:252
 msgid "Set _preview"
 msgstr "Définir l'a_perçu"
 
-#: modules/volume/volume_linestat.c:284
+#: modules/volume/volume_linestat.c:289
 msgid "Summarize Volume Profiles"
 msgstr "Compiler les profils volumiques"
 
@@ -14745,53 +15461,113 @@ msgstr "Coupe"
 msgid "Line graph"
 msgstr "Profil"
 
-#: modules/volume/volume_slice.c:290
+#: modules/volume/volume_slice.c:292
 msgid "Slice Volume Data"
 msgstr "Coupe de données volumiques"
 
-#: modules/volume/volume_slice.c:369
+#: modules/volume/volume_slice.c:371
 msgid "_Base plane:"
 msgstr "Plan de _base :"
 
-#: modules/volume/volume_slice.c:420
+#: modules/volume/volume_slice.c:422
 msgid "Extract _multiple items"
 msgstr "Extraire plusieurs élé_ments"
 
-#: modules/volume/volume_slice.c:437
+#: modules/volume/volume_slice.c:439
 msgid "Positions"
 msgstr "Positions"
 
-#: modules/volume/volume_slice.c:484
+#: modules/volume/volume_slice.c:492
 msgid "_Z:"
 msgstr "_Z :"
 
-#: modules/volume/volume_slice.c:1156
+#: modules/volume/volume_slice.c:1167
 #, c-format
 msgid "Z slice at %.*f%s%s (#%d)"
 msgstr "Section Z %.*f%s%s (#%d)"
 
-#: modules/volume/volume_slice.c:1167
+#: modules/volume/volume_slice.c:1178
 #, c-format
 msgid "Y slice at %.*f%s%s (#%d)"
 msgstr "Section Y %.*f%s%s (#%d)"
 
-#: modules/volume/volume_slice.c:1178
+#: modules/volume/volume_slice.c:1189
 #, c-format
 msgid "X slice at %.*f%s%s (#%d)"
 msgstr "Section X %.*f%s%s (#%d)"
 
-#: modules/volume/volume_slice.c:1307
+#: modules/volume/volume_slice.c:1325
 msgid "Volume Z graphs"
 msgstr "Graphes volumiques Z"
 
-#: modules/volume/volume_slice.c:1314
+#: modules/volume/volume_slice.c:1332
 msgid "Volume X graphs"
 msgstr "Graphes volumiques X"
 
-#: modules/volume/volume_slice.c:1321
+#: modules/volume/volume_slice.c:1339
 msgid "Volume Y graphs"
 msgstr "Graphes volumiques Y"
 
+#: modules/volume/volume_swaxes.c:104
+msgid "Swaps axes of volume data."
+msgstr "Intervertit les axes des données volumiques"
+
+#: modules/volume/volume_swaxes.c:118
+msgid "/S_wap axes..."
+msgstr "/Intervertir les axes..."
+
+#: modules/volume/volume_swaxes.c:122
+msgid "Swap axes"
+msgstr "Intervertir les axes"
+
+#: modules/volume/volume_swaxes.c:156
+msgid "X"
+msgstr "X"
+
+#: modules/volume/volume_swaxes.c:157
+msgid "X, reversed"
+msgstr "X, inversé"
+
+#: modules/volume/volume_swaxes.c:158
+msgid "Y"
+msgstr "Y"
+
+#: modules/volume/volume_swaxes.c:159
+msgid "Y, reversed"
+msgstr "Y, inversé"
+
+#: modules/volume/volume_swaxes.c:160
+msgid "Z"
+msgstr "Z"
+
+#: modules/volume/volume_swaxes.c:161
+msgid "Z, reversed"
+msgstr "Z, inversé"
+
+#: modules/volume/volume_swaxes.c:175
+msgid "Swap Volume Axes"
+msgstr "Intervertir les axes du volume"
+
+#: modules/volume/volume_swaxes.c:196
+msgid "Current _X axis will become:"
+msgstr "L'axe _X courant deviendra :"
+
+#: modules/volume/volume_swaxes.c:204
+msgid "Current _Y axis will become:"
+msgstr "L'axe _Y courant deviendra :"
+
+#: modules/volume/volume_swaxes.c:212
+msgid "Current _Z axis will become:"
+msgstr "L'axe _Z courant deviendra :"
+
+#: modules/volume/volume_swaxes.c:219
+msgid "Create new volume data"
+msgstr "Créer de nouvelles données volumiques"
+
+#: modules/volume/volume_swaxes.c:286
+msgid "Z axis calibration will be lost."
+msgstr "L'axe de calibration Z sera perdu."
+
 #: modules/volume/volume_zcal.c:104
 msgid "Attaches, extracts and removes volume data z-axis calibration."
 msgstr ""
@@ -14862,6 +15638,14 @@ msgstr ""
 "Le nombre de valeurs du fichier de données %d\n"
 "diffère du nombre de plans %d."
 
+#: modules/volume/volumeops.c:53
+msgid "/Extract _Preview"
+msgstr "/Extraire l'a_perçu"
+
+#: modules/volume/volumeops.c:57
+msgid "Extract volume data preview to an image"
+msgstr "Extraire l'aperçu des données volumiques vers une image"
+
 #: modules/xyz/xyz_drift.c:267
 msgid "Analyzes drift in XYZ data."
 msgstr "Analyse la dérive dans des données XYZ."
@@ -14906,7 +15690,7 @@ msgstr "dérive selon l'axe z"
 msgid "Analyze XYZ Drift"
 msgstr "Analyser la dérive de données XYZ"
 
-#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:391
+#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:406
 msgid "Reset Ran_ges"
 msgstr "Initialiser les pla_ges"
 
@@ -14914,11 +15698,11 @@ msgstr "Initialiser les pla_ges"
 msgid "_Guess parameters"
 msgstr "Estimer les paramètres"
 
-#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:570
+#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:539
 msgid "_X-range:"
 msgstr "Plage _X :"
 
-#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:592
+#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:561
 msgid "_Y-range:"
 msgstr "Plage _Y :"
 
@@ -14996,7 +15780,7 @@ msgstr "Aucun voisin trouvé"
 msgid "Fitting in progress..."
 msgstr "Ajustement en cours"
 
-#: modules/xyz/xyz_drift.c:2269 modules/xyz/xyz_raster.c:1012
+#: modules/xyz/xyz_drift.c:2264 modules/xyz/xyz_raster.c:981
 msgid "Physical dimensions are invalid."
 msgstr "Les dimensions physiques sont invalides."
 
@@ -15036,41 +15820,41 @@ msgstr "Mettre à niveau les données _XYZ"
 msgid "Update X and Y of _all compatible data"
 msgstr "Mettre à jour les valeurs X et Y de toutes les données comp_atibles"
 
-#: modules/xyz/xyz_raster.c:197
+#: modules/xyz/xyz_raster.c:194
 msgid "Rasterizes XYZ data to images."
 msgstr "Rastérise des données XYZ."
 
-#: modules/xyz/xyz_raster.c:211
+#: modules/xyz/xyz_raster.c:208
 msgid "/_Rasterize..."
 msgstr "/_Rastériser..."
 
-#: modules/xyz/xyz_raster.c:215
+#: modules/xyz/xyz_raster.c:212
 msgid "Rasterize to image"
 msgstr "Rastériser des données"
 
-#: modules/xyz/xyz_raster.c:340
+#: modules/xyz/xyz_raster.c:337
 msgid "Rasterize XYZ Data"
 msgstr "Rastériser des données XYZ"
 
-#: modules/xyz/xyz_raster.c:354
+#: modules/xyz/xyz_raster.c:351
 msgid "Create Image _Directly"
 msgstr "Créer _directement l'image"
 
-#: modules/xyz/xyz_raster.c:360
+#: modules/xyz/xyz_raster.c:357
 msgid "XY points form a regular grid so interpolation is not necessary."
 msgstr ""
 "Les points XY forment une grille régulière, aucune interpolation n'est "
 "nécessaire."
 
-#: modules/xyz/xyz_raster.c:381
+#: modules/xyz/xyz_raster.c:392
 msgid "Make Pixels S_quare"
 msgstr "Rendre les pixels carrés"
 
-#: modules/xyz/xyz_raster.c:642
+#: modules/xyz/xyz_raster.c:611
 msgid "Field"
 msgstr "Global"
 
-#: modules/xyz/xyz_raster.c:956
+#: modules/xyz/xyz_raster.c:925
 #, c-format
 msgid ""
 "Number of points: %u\n"
@@ -15081,7 +15865,7 @@ msgstr ""
 "Fusionnés car trop proches : %u\n"
 "Ajoutés sur les bords : %u"
 
-#: modules/xyz/xyz_raster.c:1091
+#: modules/xyz/xyz_raster.c:1065
 msgid ""
 "XYZ data regularization failed due to numerical instability or was "
 "interrupted."
@@ -15089,6 +15873,87 @@ msgstr ""
 "La régularisation des données XYZ a échoué à cause d'une instabilité "
 "numérique ou a été interrompue."
 
+#~ msgid "Re_fine"
+#~ msgstr "A_ffiner"
+
+#~ msgid "pixels"
+#~ msgstr "pixels"
+
+#~ msgid "_Like Current Channel"
+#~ msgstr "Identique au canal courant"
+
+#~ msgid "Surface _coverage:"
+#~ msgstr "Taux de _couverture :"
+
+#~ msgid "Distribute"
+#~ msgstr "Distribuer"
+
+#~ msgid "Replace"
+#~ msgstr "Remplacer"
+
+#~ msgid "_Fix res.:"
+#~ msgstr "Résolution _fixe :"
+
+#~ msgid "Reco_mpute"
+#~ msgstr "Recalculer"
+
+#~ msgid "Show mode:"
+#~ msgstr "Mode d'affichage : "
+
+#~ msgid "Fast Fourier Transform"
+#~ msgstr "Transformée de Fourier Rapide (FFT)"
+
+#~ msgid "built-in SimpleFFT\n"
+#~ msgstr "Algorithme SimpleFFT interne\n"
+
+#~ msgid "Initializing GUI"
+#~ msgstr "Initialisation de l'interface graphique"
+
+#~ msgid "Create new channel"
+#~ msgstr "Créer un nouveau canal"
+
+#~ msgid "Hx"
+#~ msgstr "Hx"
+
+#~ msgid "Hz"
+#~ msgstr "Hz"
+
+#~ msgid "Fz"
+#~ msgstr "Fz"
+
+#~ msgid "dFz/dz"
+#~ msgstr "dFz/dz"
+
+#~ msgid "d²Fz/dz²"
+#~ msgstr "d²Fz/dz²"
+
+#~ msgid "Slab"
+#~ msgstr "Plaque"
+
+#~ msgid "Slab size _x:"
+#~ msgstr "Taille de la plaque selon _x :"
+
+#~ msgid "Slab size _y:"
+#~ msgstr "Taille de la plaque selon _y :"
+
+#~ msgid "Slab size _z (length):"
+#~ msgstr "Dimension _z de la plaque (longueur) : "
+
+#~ msgid "Stitch operations on data fields."
+#~ msgstr "Assemblage de données."
+
+#~ msgid "Stitch operations on data"
+#~ msgstr "Assemblage de données"
+
+#~ msgid "X offset"
+#~ msgstr "Décalage X"
+
+#~ msgid "Y offset"
+#~ msgstr "Décalage Y"
+
+#~ msgid "/S_ynthetic/_Particles..."
+#~ msgstr "/S_ynthèse/_Particules..."
+
 #~ msgid "Graph function written in Python"
 #~ msgstr "Fonction graphique écrite en Python"
 
@@ -15129,9 +15994,6 @@ msgstr ""
 #~ msgid "2D fitting"
 #~ msgstr "Ajustement 2D"
 
-#~ msgid "/_Level/_Fit Sphere..."
-#~ msgstr "/Niveau/Ajuster la sphère..."
-
 #~ msgid "Fit by sphere"
 #~ msgstr "Ajuster par une sphère."
 
@@ -15479,9 +16341,6 @@ msgstr ""
 #~ msgid "Header ended within a Multipass-Config table."
 #~ msgstr "L'en-tête se termine avec une table Multipass-Config."
 
-#~ msgid "Starting..."
-#~ msgstr "Démarrage..."
-
 #~ msgid "Initializing"
 #~ msgstr "Initialisation"
 
@@ -15544,9 +16403,6 @@ msgstr ""
 #~ msgid "_Interpolation:"
 #~ msgstr "_Interpolation :"
 
-#~ msgid "Along gradient"
-#~ msgstr "À côté du gradient"
-
 #~ msgid "Data must be displayed in a window for pixmap export."
 #~ msgstr ""
 #~ "Les données doivent affichées dans une fenêtre pour l'export vers un "
@@ -15791,9 +16647,6 @@ msgstr ""
 #~ msgid "Removes the entire filter mask"
 #~ msgstr "Supprimer complètement le masque filtre"
 
-#~ msgid "Ra:"
-#~ msgstr "Ra :"
-
 #~ msgid "Rms:"
 #~ msgstr "Rms :"
 
@@ -15812,9 +16665,6 @@ msgstr ""
 #~ msgid "Simulate spherical particle deposition."
 #~ msgstr "Simuler un dépôt de particules sphériques."
 
-#~ msgid "/_Synthetic/_Deposit particles..."
-#~ msgstr "/S_ynthèse/Dépôt de particule_s..."
-
 #~ msgid "_Start"
 #~ msgstr "Début"
 
@@ -15842,13 +16692,6 @@ msgstr ""
 #~ msgid "Uniform"
 #~ msgstr "Uniforme"
 
-#~ msgid "Ideal Geometry"
-#~ msgstr "Géométrie idéale"
-
-#, fuzzy
-#~ msgid "Pitch:"
-#~ msgstr "Pas :"
-
 #~ msgid "Constant current tunnel spectroscopy (CITS) is not supported."
 #~ msgstr ""
 #~ "La spectroscopie à courant tunnel constant (CITS) n'est pas supportée."
@@ -15933,9 +16776,6 @@ msgstr ""
 #~ msgid "Attach Mask"
 #~ msgstr "Attacher un masque"
 
-#~ msgid "Output"
-#~ msgstr "Sortie"
-
 #~ msgid "File too small (less than %d bytes). Header is not complete."
 #~ msgstr ""
 #~ "Le fichier est trop petit (moins de %d octets). L'en-tête est imcomplet."
diff --git a/po/gwyddion.pot b/po/gwyddion.pot
index b219238..f06dddf 100644
--- a/po/gwyddion.pot
+++ b/po/gwyddion.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: yeti at gwyddion.net\n"
-"POT-Creation-Date: 2016-11-18 11:05+0100\n"
+"POT-Creation-Date: 2017-08-15 17:48+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -128,7 +128,8 @@ msgstr ""
 #: app/data-browser-aux.c:1480 app/data-browser.c:2280 app/data-browser.c:2887
 #: app/data-browser.c:3707 app/data-browser.c:3857 app/data-browser.c:4139
 #: app/data-browser.c:4504 app/data-browser.c:4590 app/data-browser.c:5016
-#: app/resource-editor.c:366 modules/process/convolution_filter.c:691
+#: app/resource-editor.c:366 modules/file/xyzexport.c:214
+#: modules/process/convolution_filter.c:691
 msgid "Untitled"
 msgstr ""
 
@@ -136,97 +137,105 @@ msgstr ""
 msgid "Initial residua evaluation..."
 msgstr ""
 
-#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1632
+#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1646
 msgid "Fitting..."
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1442 libprocess/gwyprocessenums.c:101
-#: libprocess/gwyshapefitpreset.c:347
+#: libgwyddion/gwynlfitpreset.c:1549 libprocess/gwyprocessenums.c:101
+#: libprocess/gwyshapefitpreset.c:347 modules/process/psf-fit.c:157
 msgid "Gaussian"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1457
+#: libgwyddion/gwynlfitpreset.c:1564
 msgid "Gaussian (PSDF)"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1470
+#: libgwyddion/gwynlfitpreset.c:1577
 msgid "Gaussian (ACF)"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1483
+#: libgwyddion/gwynlfitpreset.c:1590
 msgid "Gaussian (HHCF)"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1496
+#: libgwyddion/gwynlfitpreset.c:1603
 msgid "Gaussian (RPSDF)"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1509
+#: libgwyddion/gwynlfitpreset.c:1616
 msgid "Two Gaussians (PSDF)"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1524 modules/xyz/xyz_drift.c:841
-#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1819
+#: libgwyddion/gwynlfitpreset.c:1631 modules/xyz/xyz_drift.c:841
+#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1818
 msgid "Exponential"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1536
+#: libgwyddion/gwynlfitpreset.c:1643
 msgid "Exponential (PSDF)"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1549
+#: libgwyddion/gwynlfitpreset.c:1656
 msgid "Exponential (ACF)"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1561
+#: libgwyddion/gwynlfitpreset.c:1668
 msgid "Exponential (HHCF)"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1574
+#: libgwyddion/gwynlfitpreset.c:1681
 msgid "Exponential (RPSDF)"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1588
+#: libgwyddion/gwynlfitpreset.c:1695
+msgid "K-correlated (PSDF)"
+msgstr ""
+
+#: libgwyddion/gwynlfitpreset.c:1709
 msgid "Polynomial (order 0)"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1599 modules/xyz/xyz_drift.c:1805
+#: libgwyddion/gwynlfitpreset.c:1720 modules/xyz/xyz_drift.c:1804
 msgid "Polynomial (order 1)"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1610
+#: libgwyddion/gwynlfitpreset.c:1731
 msgid "Polynomial (order 2)"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1622
+#: libgwyddion/gwynlfitpreset.c:1743
 msgid "Polynomial (order 3)"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1635
+#: libgwyddion/gwynlfitpreset.c:1756
 msgid "Square wave"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1651
+#: libgwyddion/gwynlfitpreset.c:1772
 msgid "Parabolic step"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1667
+#: libgwyddion/gwynlfitpreset.c:1788
 msgid "Smooth slanted step"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1684
+#: libgwyddion/gwynlfitpreset.c:1805
 msgid "Smooth bent step"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1700
+#: libgwyddion/gwynlfitpreset.c:1821
+msgid "Boltzmann bent step"
+msgstr ""
+
+#: libgwyddion/gwynlfitpreset.c:1837
 msgid "Power"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1712 libprocess/gwyshapefitpreset.c:348
+#: libgwyddion/gwynlfitpreset.c:1849 libprocess/gwyshapefitpreset.c:348
 msgid "Lorentzian"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1726
+#: libgwyddion/gwynlfitpreset.c:1863
 msgid "Sinc"
 msgstr ""
 
@@ -247,7 +256,7 @@ msgid "Step height (positive)"
 msgstr ""
 
 #: libprocess/cdline.c:590 libprocess/cdline.c:599
-#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:170
+#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:163
 msgid "Line"
 msgstr ""
 
@@ -260,7 +269,7 @@ msgid "Circle (down)"
 msgstr ""
 
 #: libprocess/cdline.c:608 libprocess/cdline.c:617
-#: libgwydgets/gwygraphareadialog.c:557 modules/process/hough.c:171
+#: libgwydgets/gwygraphareadialog.c:550 modules/process/hough.c:164
 msgid "Circle"
 msgstr ""
 
@@ -268,237 +277,237 @@ msgstr ""
 msgid "Circle (up)"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:64
+#: libprocess/gwygrainvalue.c:62
 msgid "Grain number"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:73 modules/process/curvature.c:129
+#: libprocess/gwygrainvalue.c:71 modules/process/curvature.c:128
 msgid "Center x position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:82 modules/process/curvature.c:130
+#: libprocess/gwygrainvalue.c:80 modules/process/curvature.c:129
 msgid "Center y position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:91
+#: libprocess/gwygrainvalue.c:89
 msgid "Minimum value"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:100
+#: libprocess/gwygrainvalue.c:98
 msgid "Maximum value"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:109 modules/process/bdep_synth.c:133
-#: modules/tools/filter.c:237
+#: libprocess/gwygrainvalue.c:107 modules/process/bdep_synth.c:133
+#: modules/tools/filter.c:238
 msgid "Mean value"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:118 modules/tools/filter.c:238
+#: libprocess/gwygrainvalue.c:116 modules/tools/filter.c:239
 msgid "Median value"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:127
+#: libprocess/gwygrainvalue.c:125
 msgid "Minimum value on boundary"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:136
+#: libprocess/gwygrainvalue.c:134
 msgid "Maximum value on boundary"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:145
+#: libprocess/gwygrainvalue.c:143
 msgid "Pixel area"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:154
+#: libprocess/gwygrainvalue.c:152
 msgid "Projected area"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:163
+#: libprocess/gwygrainvalue.c:161
 msgid "Surface area"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:172
+#: libprocess/gwygrainvalue.c:170
 msgid "Equivalent square side"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:181
+#: libprocess/gwygrainvalue.c:179
 msgid "Equivalent disc radius"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:190
+#: libprocess/gwygrainvalue.c:188
 msgid "Area above half-height"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:199
+#: libprocess/gwygrainvalue.c:197
 msgid "Area of convex hull"
 msgstr ""
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to
 #. * zero.
-#: libprocess/gwygrainvalue.c:210
+#: libprocess/gwygrainvalue.c:208
 msgid "Zero basis volume"
 msgstr ""
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * grain minimum.
-#: libprocess/gwygrainvalue.c:221
+#: libprocess/gwygrainvalue.c:219
 msgid "Grain minimum basis volume"
 msgstr ""
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * Laplacian background.
-#: libprocess/gwygrainvalue.c:232
+#: libprocess/gwygrainvalue.c:230
 msgid "Laplacian background basis volume"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:241
+#: libprocess/gwygrainvalue.c:239
 msgid "Projected boundary length"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:250
+#: libprocess/gwygrainvalue.c:248
 msgid "Minimum bounding size"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:259
+#: libprocess/gwygrainvalue.c:257
 msgid "Minimum bounding direction"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:268
+#: libprocess/gwygrainvalue.c:266
 msgid "Maximum bounding size"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:277
+#: libprocess/gwygrainvalue.c:275
 msgid "Maximum bounding direction"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:286
+#: libprocess/gwygrainvalue.c:284
 msgid "Maximum inscribed disc radius"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:295
+#: libprocess/gwygrainvalue.c:293
 msgid "Maximum inscribed disc center x position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:304
+#: libprocess/gwygrainvalue.c:302
 msgid "Maximum inscribed disc center y position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:313
+#: libprocess/gwygrainvalue.c:311
 msgid "Minimum circumcircle radius"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:322
+#: libprocess/gwygrainvalue.c:320
 msgid "Minimum circumcircle center x position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:331
+#: libprocess/gwygrainvalue.c:329
 msgid "Minimum circumcircle center y position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:340
+#: libprocess/gwygrainvalue.c:338
 msgid "Mean radius"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:349 modules/tools/readvalue.c:319
+#: libprocess/gwygrainvalue.c:347 modules/tools/readvalue.c:322
 msgid "Inclination θ"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:358 modules/tools/readvalue.c:329
+#: libprocess/gwygrainvalue.c:356 modules/tools/readvalue.c:332
 msgid "Inclination φ"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:367
+#: libprocess/gwygrainvalue.c:365
 msgid "Curvature center x position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:376
+#: libprocess/gwygrainvalue.c:374
 msgid "Curvature center y position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:385
+#: libprocess/gwygrainvalue.c:383
 msgid "Curvature center z value"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:394 modules/tools/readvalue.c:344
+#: libprocess/gwygrainvalue.c:392 modules/tools/readvalue.c:347
 msgid "Curvature 1"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:403 modules/tools/readvalue.c:354
+#: libprocess/gwygrainvalue.c:401 modules/tools/readvalue.c:357
 msgid "Curvature 2"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:412
+#: libprocess/gwygrainvalue.c:410
 msgid "Curvature angle 1"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:421
+#: libprocess/gwygrainvalue.c:419
 msgid "Curvature angle 2"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:430
+#: libprocess/gwygrainvalue.c:428
 msgid "Major semiaxis of equivalent ellipse"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:439
+#: libprocess/gwygrainvalue.c:437
 msgid "Minor semiaxis of equivalent ellipse"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:448
+#: libprocess/gwygrainvalue.c:446
 msgid "Orientation of equivalent ellipse"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:1120
+#: libprocess/gwygrainvalue.c:1118
 msgid "Id"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:1121 modules/graph/graph_peaks.c:156
-#: modules/process/extract_path.c:391 modules/process/wave_synth.c:482
-#: modules/tools/readvalue.c:251
+#: libprocess/gwygrainvalue.c:1119 modules/graph/graph_peaks.c:154
+#: modules/process/extract_path.c:391 modules/process/wave_synth.c:513
+#: modules/tools/readvalue.c:253
 msgid "Position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:1122 app/meta.c:411 modules/file/imgexport.c:4625
-#: modules/process/curvature.c:762 modules/tools/level3.c:468
-#: modules/tools/readvalue.c:286
+#: libprocess/gwygrainvalue.c:1120 app/meta.c:411 modules/file/imgexport.c:4573
+#: modules/process/curvature.c:759 modules/tools/level3.c:475
+#: modules/tools/readvalue.c:290
 msgid "Value"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:1123
+#: libprocess/gwygrainvalue.c:1121
 msgid "Area"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:1124 app/data-browser.c:5624 app/toolbox.c:110
+#: libprocess/gwygrainvalue.c:1122 app/data-browser.c:5624 app/toolbox.c:115
 msgid "Volume"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:1125
+#: libprocess/gwygrainvalue.c:1123
 msgid "Boundary"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:1126 modules/process/pat_synth.c:829
-#: modules/process/pat_synth.c:1131 modules/process/pat_synth.c:1466
-#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:147
+#: libprocess/gwygrainvalue.c:1124 modules/process/pat_synth.c:830
+#: modules/process/pat_synth.c:1132 modules/process/pat_synth.c:1467
+#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:149
 msgid "Slope"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:1127 modules/process/curvature.c:213
-#: modules/process/curvature.c:613
+#: libprocess/gwygrainvalue.c:1125 modules/process/curvature.c:212
+#: modules/process/curvature.c:615
 msgid "Curvature"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:1128
+#: libprocess/gwygrainvalue.c:1126
 msgid "Moment"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:1132
+#: libprocess/gwygrainvalue.c:1130
 msgid "User"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:44
+#: libprocess/gwyprocessenums.c:44 modules/process/preview.h:263
 msgid "Union"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:45
+#: libprocess/gwyprocessenums.c:45 modules/process/preview.h:255
 msgid "Intersection"
 msgstr ""
 
@@ -577,13 +586,13 @@ msgid "Scale and space adaptive"
 msgstr ""
 
 #. TRANSLATORS: Interpolation type (AKA nearest neighbour)
-#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3791
-#: modules/xyz/xyz_raster.c:640
+#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3756
+#: modules/xyz/xyz_raster.c:609
 msgid "Round"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3792
-#: modules/xyz/xyz_raster.c:641
+#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3757
+#: modules/xyz/xyz_raster.c:610
 msgid "Linear"
 msgstr ""
 
@@ -671,27 +680,27 @@ msgstr ""
 msgid "Use entire image (ignore mask)"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:602
+#: libprocess/gwyprocessenums.c:604
 msgid "distance|City-block"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:603
+#: libprocess/gwyprocessenums.c:605
 msgid "distance|Chess"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:604
+#: libprocess/gwyprocessenums.c:606
 msgid "distance|Octagonal 4,8"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:605
+#: libprocess/gwyprocessenums.c:607
 msgid "distance|Octagonal 8,4"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:606
+#: libprocess/gwyprocessenums.c:608
 msgid "distance|Octagonal"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:607
+#: libprocess/gwyprocessenums.c:609
 msgid "distance|Euclidean"
 msgstr ""
 
@@ -727,11 +736,11 @@ msgstr ""
 msgid "Ring"
 msgstr ""
 
-#: libprocess/morph_lib.c:169 libprocess/tip.c:1043
+#: libprocess/morph_lib.c:169 libprocess/tip.c:1052
 msgid "Dilation..."
 msgstr ""
 
-#: libprocess/morph_lib.c:235 libprocess/tip.c:1164
+#: libprocess/morph_lib.c:235 libprocess/tip.c:1173
 msgid "Erosion..."
 msgstr ""
 
@@ -762,81 +771,81 @@ msgid_plural "Found %d internal local maxima"
 msgstr[0] ""
 msgstr[1] ""
 
-#: libprocess/tip.c:422
+#: libprocess/tip.c:431
 msgid "Pyramid"
 msgstr ""
 
-#: libprocess/tip.c:423 libprocess/tip.c:429 libprocess/tip.c:435
+#: libprocess/tip.c:432 libprocess/tip.c:438 libprocess/tip.c:444
 msgid "Pyramidal"
 msgstr ""
 
-#: libprocess/tip.c:428
+#: libprocess/tip.c:437
 msgid "Contact"
 msgstr ""
 
-#: libprocess/tip.c:434
+#: libprocess/tip.c:443
 msgid "Noncontact"
 msgstr ""
 
-#: libprocess/tip.c:440
+#: libprocess/tip.c:449
 msgid "Delta function"
 msgstr ""
 
-#: libprocess/tip.c:441
+#: libprocess/tip.c:450
 msgid "Analytical"
 msgstr ""
 
-#: libprocess/tip.c:446
+#: libprocess/tip.c:455 modules/process/fibre_synth.c:259
 msgid "Parabola"
 msgstr ""
 
-#: libprocess/tip.c:447 libprocess/tip.c:453
+#: libprocess/tip.c:456 libprocess/tip.c:462
 msgid "Symmetric"
 msgstr ""
 
-#: libprocess/tip.c:452
+#: libprocess/tip.c:461
 msgid "Cone"
 msgstr ""
 
-#: libprocess/tip.c:458
+#: libprocess/tip.c:467
 msgid "Elliptical parabola"
 msgstr ""
 
-#: libprocess/tip.c:459
+#: libprocess/tip.c:468
 msgid "Asymmetric"
 msgstr ""
 
-#: libprocess/tip.c:1339 libprocess/tip.c:1367 libprocess/tip.c:1416
-#: libprocess/tip.c:1443
+#: libprocess/tip.c:1348 libprocess/tip.c:1376 libprocess/tip.c:1425
+#: libprocess/tip.c:1452
 msgid "Converting fields"
 msgstr ""
 
-#: libprocess/tip.c:1349
+#: libprocess/tip.c:1358
 msgid "Starting partial estimation"
 msgstr ""
 
-#: libprocess/tip.c:1426
+#: libprocess/tip.c:1435
 msgid "Starting full estimation"
 msgstr ""
 
-#: libprocess/triangulation.c:2085 modules/process/calcoefs_view.c:793
+#: libprocess/triangulation.c:2084 modules/process/calcoefs_view.c:793
 #: modules/process/lat_synth.c:1178
 msgid "Triangulating..."
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:570
+#: libgwydgets/gwy3dwindow.c:575
 msgid "Rotate view (R)"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:575
+#: libgwydgets/gwy3dwindow.c:580
 msgid "Scale view as a whole (S)"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:580
+#: libgwydgets/gwy3dwindow.c:585
 msgid "Scale value range (V)"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:585
+#: libgwydgets/gwy3dwindow.c:590
 msgid "Move light source (L)"
 msgstr ""
 
@@ -844,227 +853,286 @@ msgstr ""
 msgid "Show full controls"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:693
+#: libgwydgets/gwy3dwindow.c:691
 msgid "Hide full controls"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:709 modules/file/imgexport.c:4796
-#: modules/process/fit-shape.c:461
+#: libgwydgets/gwy3dwindow.c:707 modules/file/imgexport.c:4745
+#: modules/process/fit-shape.c:462
 msgid "adjective|Basic"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:714
+#: libgwydgets/gwy3dwindow.c:712
 msgid "Light & Material"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:719
+#: libgwydgets/gwy3dwindow.c:717
 msgid "Labels"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:828 modules/process/facet_analysis.c:331
-#: modules/process/facet_analysis.c:347 modules/process/shade.c:245
+#: libgwydgets/gwy3dwindow.c:722
+msgid "Colorbar"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:838 modules/process/facet_analysis.c:335
+#: modules/process/facet_analysis.c:351 modules/process/shade.c:253
 #: modules/process/tilt.c:223
 msgid "φ:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:828 libgwydgets/gwy3dwindow.c:834
-#: libgwydgets/gwy3dwindow.c:1032 libgwydgets/gwy3dwindow.c:1040
-#: modules/process/facet_analysis.c:375 modules/process/indent_analyze.c:460
-#: modules/process/rotate.c:264 modules/process/shade.c:237
-#: modules/process/shade.c:245 modules/process/tilt.c:211
-#: modules/process/tilt.c:223 modules/process/tip_model.c:234
-#: modules/process/tip_model.c:240 modules/process/unrotate.c:334
+#: libgwydgets/gwy3dwindow.c:838 libgwydgets/gwy3dwindow.c:843
+#: libgwydgets/gwy3dwindow.c:1013 libgwydgets/gwy3dwindow.c:1020
+#: modules/process/correct_affine.c:461 modules/process/facet_analysis.c:238
+#: modules/process/facet_analysis.c:370 modules/process/indent_analyze.c:438
+#: modules/process/measure_lattice.c:381 modules/process/rotate.c:264
+#: modules/process/shade.c:245 modules/process/shade.c:253
+#: modules/process/synth.h:379 modules/process/synth.h:410
+#: modules/process/tilt.c:211 modules/process/tilt.c:223
+#: modules/process/tip_model.c:234 modules/process/tip_model.c:240
+#: modules/process/unrotate.c:334 modules/tools/distance.c:197
+#: modules/tools/readvalue.c:223 modules/tools/stats.c:319
 msgid "deg"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:834 modules/process/facet_analysis.c:330
-#: modules/process/facet_analysis.c:346 modules/process/shade.c:237
+#: libgwydgets/gwy3dwindow.c:843 modules/process/facet_analysis.c:334
+#: modules/process/facet_analysis.c:350 modules/process/shade.c:245
 #: modules/process/tilt.c:211
 msgid "θ:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:839 modules/process/cwt.c:151
+#: libgwydgets/gwy3dwindow.c:849 modules/process/cwt.c:151
 msgid "_Scale:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:846
+#: libgwydgets/gwy3dwindow.c:856
 msgid "_Value scale:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:851
+#: libgwydgets/gwy3dwindow.c:862
 msgid "Ph_ysical scale:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:865
+#: libgwydgets/gwy3dwindow.c:876
 msgid "verb|Set"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:877
+#: libgwydgets/gwy3dwindow.c:886
 msgid "Line _width:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:881
-msgid "Show _axes"
+#: libgwydgets/gwy3dwindow.c:886 libgwydgets/gwy3dwindow.c:1194
+#: libgwydgets/gwy3dwindow.c:1204 libgwydgets/gwy3dwindow.c:1235
+#: libgwydgets/gwygraphareadialog.c:157 libgwydgets/gwygraphareadialog.c:173
+#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
+#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
+#: modules/process/angle_dist.c:188 modules/process/angle_dist.c:213
+#: modules/process/col_synth.c:486 modules/process/crosscor.c:252
+#: modules/process/crosscor.c:260 modules/process/crosscor.c:276
+#: modules/process/crosscor.c:284 modules/process/crosscor.c:300
+#: modules/process/crosscor.c:308 modules/process/cwt.c:151
+#: modules/process/dimensions.h:88 modules/process/edge.c:672
+#: modules/process/entropy.c:242 modules/process/extend.c:220
+#: modules/process/extend.c:227 modules/process/extend.c:234
+#: modules/process/extend.c:241 modules/process/facet_analysis.c:362
+#: modules/process/fbm_synth.c:383 modules/process/hough.c:203
+#: modules/process/local_contrast.c:146 modules/process/mark_disconn.c:263
+#: modules/process/mask_morph.c:237 modules/process/median-bg.c:209
+#: modules/process/neural.c:623 modules/process/neural.c:631
+#: modules/process/psdf_logphi.c:276 modules/process/rank.c:188
+#: modules/process/scale.c:237 modules/process/scale.c:246
+#: modules/process/scars.c:353 modules/process/scars.c:361
+#: modules/process/semsim.c:227 modules/process/slope_dist.c:365
+#: modules/process/slope_dist.c:393 modules/process/sphere-revolve.c:346
+#: modules/process/straighten_path.c:278 modules/process/synth.h:280
+#: modules/process/synth.h:501 modules/process/tip_blind.c:334
+#: modules/process/tip_blind.c:342 modules/process/volumize_layers.c:240
+#: modules/process/volumize_layers.c:245 modules/process/volumize_layers.c:250
+#: modules/process/wpour_mark.c:320 modules/tools/filter.c:291
+#: modules/tools/level3.c:244 modules/tools/maskedit.c:528
+#: modules/tools/maskedit.c:629 modules/tools/pathlevel.c:256
+#: modules/tools/profile.c:377 modules/tools/profile.c:503
+#: modules/tools/readvalue.c:222 modules/tools/readvalue.c:378
+#: modules/tools/roughness.c:868 modules/volume/volume_slice.c:446
+#: modules/volume/volume_slice.c:469 modules/volume/volume_slice.c:492
+#: modules/xyz/xyz_drift.c:738 modules/xyz/xyz_drift.c:753
+#: modules/xyz/xyz_raster.c:382 modules/xyz/xyz_raster.c:388
+msgid "px"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:890
-msgid "Show _labels"
+#: libgwydgets/gwy3dwindow.c:891
+msgid "Show _axes"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:899
-msgid "Show false _colorbar"
+#: libgwydgets/gwy3dwindow.c:900
+msgid "Show _labels"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:908
+#: libgwydgets/gwy3dwindow.c:909
 msgid "_Orthographic projection"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:917
+#: libgwydgets/gwy3dwindow.c:918
 msgid "_Hide masked"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:933
+#: libgwydgets/gwy3dwindow.c:934
 msgid "_Lighting"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:934
+#: libgwydgets/gwy3dwindow.c:935
 msgid "_Gradient"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:935
+#: libgwydgets/gwy3dwindow.c:936
 msgid "_Overlay"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:936
+#: libgwydgets/gwy3dwindow.c:937
 msgid "_Overlay - no light"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1009
+#: libgwydgets/gwy3dwindow.c:992
 msgid "_Material:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1032
+#: libgwydgets/gwy3dwindow.c:1013
 msgid "_Light φ:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1040
+#: libgwydgets/gwy3dwindow.c:1020
 msgid "L_ight θ:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1070 libgwydgets/gwy3dwindow.c:1240
-#: app/toolbox-editor.c:215 modules/file/hdrimage.cc:2213
-#: modules/file/imgexport.c:4760 modules/file/pixmap.c:789
+#: libgwydgets/gwy3dwindow.c:1052 libgwydgets/gwy3dwindow.c:1243
+#: app/toolbox-editor.c:216 modules/file/hdrimage.cc:2213
+#: modules/file/imgexport.c:4708 modules/file/pixmap.c:789
 #: modules/file/rawfile.c:424 modules/process/angle_dist.c:172
 #: modules/process/bdep_synth.c:341 modules/process/calcoefs_new.c:371
-#: modules/process/calibrate.c:391 modules/process/col_synth.c:392
-#: modules/process/correct_affine.c:301 modules/process/curvature.c:615
-#: modules/process/cwt.c:135 modules/process/deposit_synth.c:349
+#: modules/process/calibrate.c:383 modules/process/col_synth.c:392
+#: modules/process/correct_affine.c:346 modules/process/curvature.c:617
+#: modules/process/cwt.c:135 modules/process/deposit_synth.c:350
 #: modules/process/diff_synth.c:411 modules/process/domain_synth.c:354
 #: modules/process/drift.c:245 modules/process/dwt.c:166
 #: modules/process/dwtanisotropy.c:184 modules/process/edge.c:638
 #: modules/process/extend.c:192 modules/process/facet-level.c:193
-#: modules/process/facet_analysis.c:271 modules/process/fbm_synth.c:303
+#: modules/process/facet_analysis.c:275 modules/process/fbm_synth.c:303
 #: modules/process/fft.c:336 modules/process/fft_filter_2d.c:417
-#: modules/process/fft_synth.c:341 modules/process/fractal.c:231
-#: modules/process/grain_edge.c:213 modules/process/grain_mark.c:247
-#: modules/process/grain_wshed.c:167 modules/process/hough.c:179
-#: modules/process/lat_synth.c:567 modules/process/latsim.c:159
-#: modules/process/level.c:245 modules/process/linematch.c:804
-#: modules/process/lno_synth.c:433 modules/process/local_contrast.c:130
-#: modules/process/logistic.c:234 modules/process/mark_disconn.c:208
-#: modules/process/mask_distribute.c:152 modules/process/measure_lattice.c:256
-#: modules/process/median-bg.c:180 modules/process/noise_synth.c:336
-#: modules/process/obj_synth.c:441 modules/process/pat_synth.c:385
-#: modules/process/pid.c:199 modules/process/polydistort.c:210
-#: modules/process/polylevel.c:373 modules/process/psdf_logphi.c:249
-#: modules/process/rank.c:158 modules/process/rotate.c:243
-#: modules/process/scale.c:196 modules/process/scars.c:298
-#: modules/process/semsim.c:211 modules/process/shade.c:208
-#: modules/process/slope_dist.c:276 modules/process/sphere-revolve.c:218
-#: modules/process/straighten_path.c:249 modules/process/tilt.c:161
-#: modules/process/tip_model.c:169 modules/process/unrotate.c:220
-#: modules/process/volumize_layers.c:221 modules/process/wave_synth.c:349
-#: modules/process/wpour_mark.c:278 modules/volume/volume_calibrate.c:370
-#: modules/volume/volume_extract.c:331 modules/volume/volume_kmeans.c:153
-#: modules/volume/volume_kmedians.c:147 modules/volume/volume_linestat.c:292
-#: modules/volume/volume_slice.c:292
+#: modules/process/fft_synth.c:341 modules/process/fibre_synth.c:422
+#: modules/process/fractal.c:228 modules/process/grain_edge.c:212
+#: modules/process/grain_mark.c:246 modules/process/grain_wshed.c:168
+#: modules/process/hough.c:174 modules/process/lat_synth.c:567
+#: modules/process/latsim.c:159 modules/process/level.c:245
+#: modules/process/linematch.c:771 modules/process/lno_synth.c:431
+#: modules/process/local_contrast.c:130 modules/process/logistic.c:234
+#: modules/process/mark_disconn.c:208 modules/process/mask_distribute.c:152
+#: modules/process/measure_lattice.c:246 modules/process/median-bg.c:180
+#: modules/process/mfm_current.c:332 modules/process/mfm_field.c:281
+#: modules/process/mfm_findshift.c:230 modules/process/mfm_parallel.c:333
+#: modules/process/mfm_shift.c:170 modules/process/noise_synth.c:334
+#: modules/process/obj_synth.c:438 modules/process/pat_synth.c:385
+#: modules/process/phase_synth.c:205 modules/process/pid.c:197
+#: modules/process/polydistort.c:210 modules/process/polylevel.c:373
+#: modules/process/psdf_logphi.c:249 modules/process/rank.c:158
+#: modules/process/rotate.c:243 modules/process/scale.c:196
+#: modules/process/scars.c:317 modules/process/semsim.c:211
+#: modules/process/shade.c:210 modules/process/slope_dist.c:275
+#: modules/process/sphere-revolve.c:317 modules/process/straighten_path.c:248
+#: modules/process/tilt.c:161 modules/process/tip_model.c:167
+#: modules/process/unrotate.c:220 modules/process/volumize_layers.c:221
+#: modules/process/wave_synth.c:368 modules/process/wpour_mark.c:278
+#: modules/volume/volume_calibrate.c:370 modules/volume/volume_extract.c:324
+#: modules/volume/volume_kmeans.c:154 modules/volume/volume_kmedians.c:147
+#: modules/volume/volume_linestat.c:297 modules/volume/volume_slice.c:294
 msgid "_Reset"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1142
+#: libgwydgets/gwy3dwindow.c:1141
 msgid "X-axis"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1143
+#: libgwydgets/gwy3dwindow.c:1142
 msgid "Y-axis"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1144
+#: libgwydgets/gwy3dwindow.c:1143
 msgid "Minimum z value"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1145
+#: libgwydgets/gwy3dwindow.c:1144
 msgid "Maximum z value"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1168 modules/file/imgexport.c:3836
+#: libgwydgets/gwy3dwindow.c:1167 modules/file/imgexport.c:3806
 msgid "_Label:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1173
+#: libgwydgets/gwy3dwindow.c:1180
 msgid "_Text:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1193
+#: libgwydgets/gwy3dwindow.c:1185
 msgid "Move label"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1202
+#: libgwydgets/gwy3dwindow.c:1194
 msgid "_Horizontally:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1212
+#: libgwydgets/gwy3dwindow.c:1204
 msgid "_Vertically:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1220
+#: libgwydgets/gwy3dwindow.c:1212
+msgid "A_ll labels have the same size"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:1223
 msgid "Scale size _automatically"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1232 modules/tools/filter.c:290
+#: libgwydgets/gwy3dwindow.c:1235 modules/tools/filter.c:291
 msgid "Si_ze:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1232 modules/process/cwt.c:151
-#: modules/process/hough.c:212
-msgid "pixels"
+#: libgwydgets/gwy3dwindow.c:1277
+msgid "Show false _colorbar"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:1286
+msgid "Reserve space for _colorbar"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:1302 modules/process/lat_synth.c:651
+#: modules/process/obj_synth.c:542 modules/process/pat_synth.c:1458
+#: modules/process/phase_synth.c:279
+msgid "_Size:"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:1311
+msgid "_Vertical alignment:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1726 libgwydgets/gwy3dwindow.c:1779
+#: libgwydgets/gwy3dwindow.c:1844 libgwydgets/gwy3dwindow.c:1897
 msgid "S_witch to Lighting Mode"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1734 libgwydgets/gwy3dwindow.c:1756
+#: libgwydgets/gwy3dwindow.c:1852 libgwydgets/gwy3dwindow.c:1874
 msgid "S_witch to Overlay Mode"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1748 libgwydgets/gwy3dwindow.c:1771
+#: libgwydgets/gwy3dwindow.c:1866 libgwydgets/gwy3dwindow.c:1889
 msgid "S_witch to Color Gradient Mode"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:1787
+#: libgwydgets/gwy3dwindow.c:1905
 msgid "T_oggle light"
 msgstr ""
 
-#: libgwydgets/gwyaxisdialog.c:99
+#: libgwydgets/gwyaxisdialog.c:75
 msgid "Axis Properties"
 msgstr ""
 
-#: libgwydgets/gwyaxisdialog.c:101 libgwydgets/gwygraphlabeldialog.c:63
-msgid "Label Properties"
-msgstr ""
-
-#: libgwydgets/gwyaxisdialog.c:184
+#: libgwydgets/gwyaxisdialog.c:88
 msgid "Label Text"
 msgstr ""
 
@@ -1086,7 +1154,7 @@ msgid "Hidden"
 msgstr ""
 
 #: libgwydgets/gwydgetenums.c:47 libgwydgets/gwygraphwindowmeasuredialog.c:572
-#: modules/file/imgexport.c:475 modules/tools/selectionmanager.c:274
+#: modules/file/imgexport.c:474 modules/tools/selectionmanager.c:274
 msgid "Points"
 msgstr ""
 
@@ -1094,7 +1162,7 @@ msgstr ""
 msgid "Line + points"
 msgstr ""
 
-#: libgwydgets/gwydgetutils.c:564
+#: libgwydgets/gwydgetutils.c:848
 msgid "Change Mask Color"
 msgstr ""
 
@@ -1103,7 +1171,7 @@ msgid "Quantity"
 msgstr ""
 
 #: libgwydgets/gwygrainvaluemenu.c:194 libgwydgets/gwygrainvaluemenu.c:207
-#: modules/process/curvature.c:753
+#: modules/process/curvature.c:750
 msgid "Symbol"
 msgstr ""
 
@@ -1123,136 +1191,140 @@ msgstr ""
 msgid "_Next"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:127 modules/file/rawgraph.c:302
+#: libgwydgets/gwygraphareadialog.c:123 modules/file/rawgraph.c:302
 msgid "Plot _style:"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:148
+#: libgwydgets/gwygraphareadialog.c:131
 msgid "Pl_ot color:"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:159
+#: libgwydgets/gwygraphareadialog.c:151
 msgid "Point _type:"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:165
+#: libgwydgets/gwygraphareadialog.c:157
 msgid "_Point size:"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:175
+#: libgwydgets/gwygraphareadialog.c:167
 msgid "_Line type:"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:181 modules/file/imgexport.c:3150
+#: libgwydgets/gwygraphareadialog.c:173 modules/file/imgexport.c:3154
 msgid "Line t_hickness:"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:187
+#: libgwydgets/gwygraphareadialog.c:180
 msgid "<b>Label Te_xt</b>"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:404
+#: libgwydgets/gwygraphareadialog.c:397
 msgid "Set Curve Color"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:556 modules/process/mask_morph.c:179
+#: libgwydgets/gwygraphareadialog.c:549 modules/process/mask_morph.c:178
 msgid "Square"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:558 modules/process/mask_morph.c:180
+#: libgwydgets/gwygraphareadialog.c:551 modules/process/mask_morph.c:179
 msgid "Diamond"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:559
+#: libgwydgets/gwygraphareadialog.c:552
 msgid "Cross"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:560
+#: libgwydgets/gwygraphareadialog.c:553
 msgid "Diagonal cross"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:561
+#: libgwydgets/gwygraphareadialog.c:554
 msgid "Asterisk"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:562
+#: libgwydgets/gwygraphareadialog.c:555
 msgid "Star"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:563
+#: libgwydgets/gwygraphareadialog.c:556
 msgid "Triangle up"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:564
+#: libgwydgets/gwygraphareadialog.c:557
 msgid "Triangle down"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:565
+#: libgwydgets/gwygraphareadialog.c:558
 msgid "Triangle left"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:566
+#: libgwydgets/gwygraphareadialog.c:559
 msgid "Triangle right"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:567
+#: libgwydgets/gwygraphareadialog.c:560
 msgid "Full square"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:568 modules/process/mask_morph.c:177
+#: libgwydgets/gwygraphareadialog.c:561 modules/process/mask_morph.c:176
 msgid "Disc"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:569
+#: libgwydgets/gwygraphareadialog.c:562
 msgid "Full diamond"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:570
+#: libgwydgets/gwygraphareadialog.c:563
 msgid "Full triangle up"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:571
+#: libgwydgets/gwygraphareadialog.c:564
 msgid "Full triangle down"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:572
+#: libgwydgets/gwygraphareadialog.c:565
 msgid "Full triangle left"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:573
+#: libgwydgets/gwygraphareadialog.c:566
 msgid "Full triangle right"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:635
+#: libgwydgets/gwygraphareadialog.c:628
 msgid "line-style|Solid"
 msgstr ""
 
-#: libgwydgets/gwygraphareadialog.c:636
+#: libgwydgets/gwygraphareadialog.c:629
 msgid "line-style|Dash"
 msgstr ""
 
-#: libgwydgets/gwygraphcurves.c:451
+#: libgwydgets/gwygraphcurves.c:448
 msgid "Description"
 msgstr ""
 
-#: libgwydgets/gwygraphcurves.c:463
+#: libgwydgets/gwygraphcurves.c:460
 msgid "Mode"
 msgstr ""
 
-#: libgwydgets/gwygraphcurves.c:481
+#: libgwydgets/gwygraphcurves.c:478
 msgid "Color"
 msgstr ""
 
-#: libgwydgets/gwygraphcurves.c:494
+#: libgwydgets/gwygraphcurves.c:491
 msgid "Point Type"
 msgstr ""
 
-#: libgwydgets/gwygraphcurves.c:516
+#: libgwydgets/gwygraphcurves.c:513
 msgid "Line Style"
 msgstr ""
 
+#: libgwydgets/gwygraphlabeldialog.c:63
+msgid "Label Properties"
+msgstr ""
+
 #: libgwydgets/gwygraphlabeldialog.c:74
-msgid "Frame thickness:"
+msgid "_Frame thickness:"
 msgstr ""
 
 #: libgwydgets/gwygraphlabeldialog.c:81
@@ -1263,12 +1335,12 @@ msgstr ""
 msgid "Abscissa"
 msgstr ""
 
-#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1002 app/toolbox.c:108
+#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1015 app/toolbox.c:113
 msgid "Graph"
 msgstr ""
 
 #: libgwydgets/gwygraphwindow.c:170 modules/file/hdrimage.cc:472
-#: modules/process/fit-shape.c:656
+#: modules/process/fit-shape.c:666 modules/process/psf.c:229
 msgid "Data"
 msgstr ""
 
@@ -1306,15 +1378,15 @@ msgstr ""
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:394
 #: libgwydgets/gwygraphwindowmeasuredialog.c:580 modules/tools/linestats.c:170
-#: modules/tools/roughness.c:516 modules/volume/volume_linestat.c:157
+#: modules/tools/roughness.c:517 modules/volume/volume_linestat.c:159
 msgid "Length"
 msgstr ""
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:398
 #: libgwydgets/gwygraphwindowmeasuredialog.c:588 app/gwyplaintool.c:1018
-#: modules/process/lat_synth.c:747 modules/process/obj_synth.c:569
-#: modules/process/pat_synth.c:846 modules/process/pat_synth.c:1148
-#: modules/process/pat_synth.c:1483
+#: modules/process/fibre_synth.c:534 modules/process/lat_synth.c:747
+#: modules/process/obj_synth.c:567 modules/process/pat_synth.c:847
+#: modules/process/pat_synth.c:1149 modules/process/pat_synth.c:1484
 msgid "Height"
 msgstr ""
 
@@ -1327,12 +1399,12 @@ msgid "Curve:"
 msgstr ""
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:553
-#: modules/process/linematch.c:828 modules/process/semsim.c:249
+#: modules/process/linematch.c:795 modules/process/semsim.c:249
 #: modules/xyz/xyz_level.c:254
 msgid "Method:"
 msgstr ""
 
-#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:354
+#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:331
 msgid "Angle"
 msgstr ""
 
@@ -1342,7 +1414,7 @@ msgid "Preferred"
 msgstr ""
 
 #: libgwydgets/gwyoptionmenus.c:470 app/meta.c:410
-#: modules/file/imgexport.c:4160 modules/file/imgexport.c:4607
+#: modules/file/imgexport.c:4110 modules/file/imgexport.c:4555
 #: modules/file/rawfile.c:995 modules/process/convolution_filter.c:538
 #: modules/process/neural.c:418 modules/tools/selectionmanager.c:345
 msgid "Name"
@@ -1381,7 +1453,7 @@ msgid "A_dd symbol"
 msgstr ""
 
 #: libgwydgets/gwyscitext.c:274 modules/file/rawfile.c:553
-#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:405
+#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:419
 msgid "Preview"
 msgstr ""
 
@@ -1399,87 +1471,81 @@ msgstr ""
 msgid "No module can save to this file type."
 msgstr ""
 
-#: libgwymodule/gwymodulebrowser.c:67
+#: libgwymodule/gwymodulebrowser.c:66
 msgid "Module Browser"
 msgstr ""
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Module"
 msgstr ""
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Version"
 msgstr ""
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Author"
 msgstr ""
 
-#: libgwymodule/gwymodulebrowser.c:246
+#: libgwymodule/gwymodulebrowser.c:244
 msgid "Name-Version:"
 msgstr ""
 
-#: libgwymodule/gwymodulebrowser.c:247 libgwymodule/gwymodulebrowser.c:270
+#: libgwymodule/gwymodulebrowser.c:245 libgwymodule/gwymodulebrowser.c:268
 #: modules/process/grain_stat.c:186
 msgid "File:"
 msgstr ""
 
-#: libgwymodule/gwymodulebrowser.c:248
+#: libgwymodule/gwymodulebrowser.c:246
 msgid "Registered functions:"
 msgstr ""
 
-#: libgwymodule/gwymodulebrowser.c:249
+#: libgwymodule/gwymodulebrowser.c:247
 msgid "Authors:"
 msgstr ""
 
-#: libgwymodule/gwymodulebrowser.c:250
+#: libgwymodule/gwymodulebrowser.c:248
 msgid "Copyright:"
 msgstr ""
 
-#: libgwymodule/gwymodulebrowser.c:251
+#: libgwymodule/gwymodulebrowser.c:249
 msgid "Date:"
 msgstr ""
 
-#: libgwymodule/gwymodulebrowser.c:252
+#: libgwymodule/gwymodulebrowser.c:250
 msgid "Description:"
 msgstr ""
 
-#: libgwymodule/gwymodulebrowser.c:269
+#: libgwymodule/gwymodulebrowser.c:267
 msgid "Name:"
 msgstr ""
 
-#: libgwymodule/gwymodulebrowser.c:271
+#: libgwymodule/gwymodulebrowser.c:269
 msgid "Failure:"
 msgstr ""
 
-#: app/about.c:57
+#: app/about.c:58
 #, c-format
 msgid "About %s"
 msgstr ""
 
-#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
-#: app/about.c:92
-#, c-format
-msgid "Released %s\n"
-msgstr ""
-
-#: app/about.c:93
+#: app/about.c:97
 msgid "An SPM data visualization and analysis tool."
 msgstr ""
 
-#: app/about.c:101
+#: app/about.c:105
 msgid "Report bugs to:"
 msgstr ""
 
-#: app/about.c:116
+#: app/about.c:120
 msgid "Credits"
 msgstr ""
 
-#: app/about.c:133
+#: app/about.c:137
 msgid "License"
 msgstr ""
 
-#: app/about.c:138
+#: app/about.c:142
 #, c-format
 msgid ""
 "%s is free software; you can redistribute it and/or modify it under the "
@@ -1489,58 +1555,62 @@ msgid ""
 "tarball."
 msgstr ""
 
-#: app/about.c:160 modules/process/logistic.c:270
+#: app/about.c:164 modules/process/logistic.c:269
 msgid "Features"
 msgstr ""
 
-#: app/about.c:220
+#: app/about.c:224
 msgid "Developers"
 msgstr ""
 
-#: app/about.c:221
+#: app/about.c:225
 msgid "Translators"
 msgstr ""
 
-#: app/about.c:225
+#: app/about.c:229
 msgid "Development is supported by the Czech Metrology Institute: "
 msgstr ""
 
-#: app/about.c:253 app/about.c:256
+#: app/about.c:257 app/about.c:260
 msgid "OpenGL 3D View"
 msgstr ""
 
-#: app/about.c:257 app/about.c:271 app/about.c:291
+#: app/about.c:261 app/about.c:266 app/about.c:286
 msgid "not available\n"
 msgstr ""
 
-#: app/about.c:262 app/about.c:265
-msgid "Fast Fourier Transform"
-msgstr ""
-
-#: app/about.c:266
-msgid "built-in SimpleFFT\n"
-msgstr ""
-
-#: app/about.c:274
+#: app/about.c:269
 msgid "X11 protocol\n"
 msgstr ""
 
-#: app/about.c:276
+#: app/about.c:271
 msgid "Win32 protocol\n"
 msgstr ""
 
-#: app/about.c:278
+#: app/about.c:273
 msgid "LibUnique\n"
 msgstr ""
 
-#: app/about.c:282
+#: app/about.c:277
 msgid "Remote Control"
 msgstr ""
 
-#: app/about.c:286 app/about.c:290
+#: app/about.c:281 app/about.c:285
 msgid "Python Scripting Interface"
 msgstr ""
 
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:311
+#, c-format
+msgid "Development version, built %s"
+msgstr ""
+
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:328
+#, c-format
+msgid "Released %s"
+msgstr ""
+
 #: app/app.c:301
 #, c-format
 msgid ""
@@ -1549,116 +1619,124 @@ msgid ""
 "Really quit?"
 msgstr ""
 
-#: app/app.c:440
+#: app/app.c:442
 msgid "Mask _Color..."
 msgstr ""
 
-#: app/app.c:456 app/app.c:1725
+#: app/app.c:458 app/app.c:1754
 msgid "Zoom _1:1"
 msgstr ""
 
-#: app/app.c:460 app/app.c:1729 app/app.c:1957
+#: app/app.c:462 app/app.c:1758 app/app.c:1988
 msgid "Metadata _Browser..."
 msgstr ""
 
-#: app/app.c:465 app/app.c:1734 app/app.c:1962
+#: app/app.c:467 app/app.c:1763 app/app.c:1993
 msgid "View _Log..."
 msgstr ""
 
-#: app/app.c:649
+#: app/app.c:651
 msgid "Pi_xelwise Square"
 msgstr ""
 
-#: app/app.c:659
+#: app/app.c:661
 msgid "_Physically Square"
 msgstr ""
 
-#: app/app.c:836
+#: app/app.c:842
+msgid "Set as Default"
+msgstr ""
+
+#: app/app.c:844
+msgid "Set the current view setup as the default"
+msgstr ""
+
+#: app/app.c:854
 msgid "verb|Save"
 msgstr ""
 
-#: app/app.c:839 app/app.c:843
+#: app/app.c:857 app/app.c:861
 msgid "Save 3D view to an image"
 msgstr ""
 
-#: app/app.c:849
-msgid "Set as Default"
+#: app/app.c:869
+msgid "_Autocrop"
 msgstr ""
 
-#: app/app.c:851
-msgid "Set the current view setup as the default"
+#: app/app.c:873
+msgid "Remove white borders from exported image"
 msgstr ""
 
-#: app/app.c:940
+#: app/app.c:960
 msgid "_Show mask"
 msgstr ""
 
-#: app/app.c:1106
+#: app/app.c:1172
 #, c-format
 msgid "Saving of 3D view to `%s' failed"
 msgstr ""
 
-#: app/app.c:1150
+#: app/app.c:1222
 msgid "Export 3D View"
 msgstr ""
 
-#: app/app.c:1457
+#: app/app.c:1478
 msgid "_Change Preview"
 msgstr ""
 
-#: app/app.c:1583
+#: app/app.c:1606
 msgid "Change Volume Data Preview"
 msgstr ""
 
-#: app/app.c:1593
+#: app/app.c:1616
 msgid "Preview quantity:"
 msgstr ""
 
-#: app/app.c:1603 modules/process/extend.c:267 modules/tools/linestats.c:165
+#: app/app.c:1626 modules/process/extend.c:267 modules/tools/linestats.c:165
 #: modules/volume/volume_linestat.c:142
 msgid "Mean"
 msgstr ""
 
-#: app/app.c:1604 modules/process/polydistort.c:255 modules/tools/filter.c:240
+#: app/app.c:1627 modules/process/polydistort.c:258 modules/tools/filter.c:241
 #: modules/tools/icolorange.c:424 modules/tools/linestats.c:167
 #: modules/volume/volume_linestat.c:144
 msgid "Minimum"
 msgstr ""
 
-#: app/app.c:1605 modules/process/col_synth.c:170 modules/tools/filter.c:241
+#: app/app.c:1628 modules/process/col_synth.c:170 modules/tools/filter.c:242
 #: modules/tools/icolorange.c:435 modules/tools/linestats.c:168
 #: modules/volume/volume_linestat.c:145
 msgid "Maximum"
 msgstr ""
 
-#: app/app.c:1606
+#: app/app.c:1629 modules/volume/volume_linestat.c:146
 msgid "Min. position"
 msgstr ""
 
-#: app/app.c:1607
+#: app/app.c:1630 modules/volume/volume_linestat.c:147
 msgid "Max. position"
 msgstr ""
 
-#: app/app.c:1608 modules/process/bdep_synth.c:134
-#: modules/process/col_synth.c:171 modules/process/scars.c:346
-#: modules/process/scars.c:353 modules/process/threshold.c:341
+#: app/app.c:1631 modules/process/bdep_synth.c:134
+#: modules/process/col_synth.c:171 modules/process/scars.c:369
+#: modules/process/scars.c:377 modules/process/threshold.c:336
 msgid "RMS"
 msgstr ""
 
-#: app/app.c:1609 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
-#: modules/file/xyzexport.c:233 modules/file/xyzexport.c:302
+#: app/app.c:1632 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
+#: modules/file/xyzexport.c:236 modules/file/xyzexport.c:305
 msgid "Channel:"
 msgstr ""
 
-#: app/app.c:1610
+#: app/app.c:1633
 msgid "Section:"
 msgstr ""
 
-#: app/app.c:1861
+#: app/app.c:1890
 msgid "_Update Preview"
 msgstr ""
 
-#: app/app.c:1867
+#: app/app.c:1896
 msgid "_Density Map"
 msgstr ""
 
@@ -1677,12 +1755,12 @@ msgstr ""
 msgid "Unknown XYZ %d"
 msgstr ""
 
-#: app/data-browser-aux.c:2795
+#: app/data-browser-aux.c:2839
 #, c-format
 msgid "Z levels: %d, Z unit: %s"
 msgstr ""
 
-#: app/data-browser-aux.c:2821
+#: app/data-browser-aux.c:2865
 #, c-format
 msgid "Points: %d"
 msgstr ""
@@ -1712,10 +1790,10 @@ msgid "Close file"
 msgstr ""
 
 #: app/data-browser.c:5582
-msgid "Channels"
+msgid "Images"
 msgstr ""
 
-#: app/data-browser.c:5596 modules/volume/volume_extract.c:444
+#: app/data-browser.c:5596 modules/volume/volume_extract.c:431
 msgid "Graphs"
 msgstr ""
 
@@ -1760,51 +1838,51 @@ msgid ""
 "%s"
 msgstr ""
 
-#: app/file.c:285
+#: app/file.c:292
 #, c-format
 msgid "Opening of `%s' failed"
 msgstr ""
 
-#: app/file.c:291 app/file.c:526
+#: app/file.c:298 app/file.c:533
 #, c-format
 msgid "Full file path: %s."
 msgstr ""
 
-#: app/file.c:294
+#: app/file.c:301
 #, c-format
 msgid "Loaded using: %s."
 msgstr ""
 
-#: app/file.c:380
+#: app/file.c:387
 msgid "Merge File"
 msgstr ""
 
-#: app/file.c:382 app/gwyappfilechooser.c:221
+#: app/file.c:389 app/gwyappfilechooser.c:226
 msgid "Open File"
 msgstr ""
 
-#: app/file.c:520 app/gwymoduleutils.c:192
+#: app/file.c:527 app/gwymoduleutils.c:192
 #, c-format
 msgid "Saving of `%s' failed"
 msgstr ""
 
-#: app/file.c:529
+#: app/file.c:536
 #, c-format
 msgid "Saved using: %s."
 msgstr ""
 
-#: app/file.c:689
+#: app/file.c:696
 #, c-format
 msgid "File `%s' already exists.  Replace?"
 msgstr ""
 
-#: app/file.c:693
+#: app/file.c:700
 #, c-format
 msgid ""
 "The file already exists in `%s'.  Replacing it will overwrite its contents."
 msgstr ""
 
-#: app/file.c:696
+#: app/file.c:703
 msgid "Replace File?"
 msgstr ""
 
@@ -1828,11 +1906,11 @@ msgstr ""
 msgid "Open selected file"
 msgstr ""
 
-#: app/filelist.c:566 app/gwyappfilechooser.c:583
+#: app/filelist.c:566 app/gwyappfilechooser.c:592
 msgid "_Filter:"
 msgstr ""
 
-#: app/filelist.c:604 app/gwyappfilechooser.c:619
+#: app/filelist.c:604 app/gwyappfilechooser.c:628
 msgid "Case _sensitive"
 msgstr ""
 
@@ -1882,97 +1960,97 @@ msgstr ""
 msgid "_Snap to control points"
 msgstr ""
 
-#: app/gwyappfilechooser.c:226
+#: app/gwyappfilechooser.c:231
 msgid "Save File"
 msgstr ""
 
-#: app/gwyappfilechooser.c:380
+#: app/gwyappfilechooser.c:389
 #, c-format
 msgid "File _type: %s"
 msgstr ""
 
-#: app/gwyappfilechooser.c:387
+#: app/gwyappfilechooser.c:396
 msgid "Only loadable shown"
 msgstr ""
 
-#: app/gwyappfilechooser.c:391
+#: app/gwyappfilechooser.c:400
 #, c-format
 msgid "Filter: %s"
 msgstr ""
 
-#: app/gwyappfilechooser.c:455
+#: app/gwyappfilechooser.c:464
 msgid "Automatic by extension"
 msgstr ""
 
-#: app/gwyappfilechooser.c:464
+#: app/gwyappfilechooser.c:473
 msgid "Automatically detected"
 msgstr ""
 
-#: app/gwyappfilechooser.c:561
+#: app/gwyappfilechooser.c:570
 msgid "Show only loadable files"
 msgstr ""
 
-#: app/gwyappfilechooser.c:844
+#: app/gwyappfilechooser.c:855
 msgid "Plane-level previewed data"
 msgstr ""
 
-#: app/gwyappfilechooser.c:860
+#: app/gwyappfilechooser.c:871
 msgid "Row-level previewed data"
 msgstr ""
 
-#: app/gwyappfilechooser.c:969
+#: app/gwyappfilechooser.c:987
+msgid "File too large for preview"
+msgstr ""
+
+#: app/gwyappfilechooser.c:988
 msgid "…"
 msgstr ""
 
-#: app/gwyappfilechooser.c:1331
+#: app/gwyappfilechooser.c:1352
 msgid "Cannot preview"
 msgstr ""
 
-#: app/gwyddion.c:143
+#: app/gwyddion.c:147
 msgid "Loading document history"
 msgstr ""
 
-#: app/gwyddion.c:148
+#: app/gwyddion.c:152
 msgid "Registering "
 msgstr ""
 
-#: app/gwyddion.c:149
+#: app/gwyddion.c:153
 msgid "stock items"
 msgstr ""
 
-#: app/gwyddion.c:153
+#: app/gwyddion.c:157
 msgid "color gradients"
 msgstr ""
 
-#: app/gwyddion.c:155
+#: app/gwyddion.c:159
 msgid "GL materials"
 msgstr ""
 
-#: app/gwyddion.c:157
+#: app/gwyddion.c:161
 msgid "grain quantities"
 msgstr ""
 
-#: app/gwyddion.c:159
+#: app/gwyddion.c:163
 msgid "calibrations"
 msgstr ""
 
-#: app/gwyddion.c:164
+#: app/gwyddion.c:168
 msgid "Loading settings"
 msgstr ""
 
-#: app/gwyddion.c:171
+#: app/gwyddion.c:175
 msgid "Registering modules"
 msgstr ""
 
-#: app/gwyddion.c:193
-msgid "Initializing GUI"
-msgstr ""
-
-#: app/gwyddion.c:439
+#: app/gwyddion.c:464
 msgid "Could not read settings."
 msgstr ""
 
-#: app/gwyddion.c:442
+#: app/gwyddion.c:467
 #, c-format
 msgid ""
 "Settings file `%s' cannot be read: %s\n"
@@ -1981,48 +2059,69 @@ msgid ""
 "it is repaired or removed."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:542
+#: app/gwyddion.c:505
+#, c-format
+msgid "Many modules (%u) failed to register."
+msgstr ""
+
+#: app/gwyddion.c:510
+#, c-format
+msgid ""
+"Most likely Gwyddion was not upgraded correctly.  Instead, one installation "
+"was just overwritten with another, and now it is a mess.\n"
+"\n"
+"Please remove completely the module directory\n"
+"\n"
+"%s\n"
+"\n"
+"and reinstall Gwyddion.\n"
+"\n"
+"See Info → Module Browser for specific errors."
+msgstr ""
+
+#: app/gwymoduleutils-file.c:536
 #, c-format
 msgid "Section %s ended at line %u but it has never started."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:550
+#: app/gwymoduleutils-file.c:544
 #, c-format
 msgid "Section %s ended at line %u instead of %s."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:587
+#: app/gwymoduleutils-file.c:581
 #, c-format
 msgid "Section %s started at line %u before %s ended."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:593
+#: app/gwymoduleutils-file.c:587
 #, c-format
 msgid "Empty section name at header line %u."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:628
+#: app/gwymoduleutils-file.c:622
 #, c-format
 msgid "Header line %u lacks prefix %s."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:653
+#: app/gwymoduleutils-file.c:647
 #, c-format
 msgid "Header line %u lacks key-value separator."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:661
+#: app/gwymoduleutils-file.c:655
 #, c-format
 msgid "Key at header line %u is empty."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:688
+#: app/gwymoduleutils-file.c:682
 #, c-format
 msgid "Header suddenly ended at line %u; end of header marker is missing"
 msgstr ""
 
 #: app/gwymoduleutils.c:197 app/settings.c:131 app/settings.c:142
 #: app/toolbox-spec.c:536 modules/file/err.h:62
+#: modules/pygwy/pygwy-console.c:528
 #, c-format
 msgid "Cannot write to file: %s."
 msgstr ""
@@ -2049,8 +2148,9 @@ msgstr ""
 
 #: app/gwyplaintool.c:1011 modules/file/rawfile.c:997
 #: modules/process/convolution_filter.c:349
-#: modules/process/convolution_filter.c:553 modules/process/neural.c:419
-#: modules/process/obj_synth.c:538 modules/process/pat_synth.c:1449
+#: modules/process/convolution_filter.c:553 modules/process/fibre_synth.c:520
+#: modules/process/neural.c:419 modules/process/obj_synth.c:536
+#: modules/process/pat_synth.c:1450
 msgid "Size"
 msgstr ""
 
@@ -2103,7 +2203,7 @@ msgstr ""
 msgid "_Close"
 msgstr ""
 
-#: app/log.c:615 modules/file/imgexport.c:4168 modules/file/rawfile.c:996
+#: app/log.c:615 modules/file/imgexport.c:4118 modules/file/rawfile.c:996
 msgid "Type"
 msgstr ""
 
@@ -2111,8 +2211,8 @@ msgstr ""
 msgid "Function"
 msgstr ""
 
-#: app/log.c:617 modules/file/imgexport.c:3117 modules/process/fit-shape.c:465
-#: modules/process/neural.c:610 modules/tools/stats.c:425
+#: app/log.c:617 modules/file/imgexport.c:3128 modules/process/fit-shape.c:466
+#: modules/process/neural.c:614 modules/tools/stats.c:423
 msgid "Parameters"
 msgstr ""
 
@@ -2124,39 +2224,39 @@ msgstr ""
 msgid "Export Log"
 msgstr ""
 
-#: app/menu.c:556 app/toolbox.c:581
+#: app/menu.c:555 app/toolbox.c:595
 msgid "_Data Process"
 msgstr ""
 
-#: app/menu.c:598 app/toolbox.c:584
+#: app/menu.c:597 app/toolbox.c:598
 msgid "_Graph"
 msgstr ""
 
-#: app/menu.c:641 app/toolbox.c:587
+#: app/menu.c:640 app/toolbox.c:601
 msgid "_Volume Data"
 msgstr ""
 
-#: app/menu.c:684 app/toolbox.c:590
+#: app/menu.c:683 app/toolbox.c:604
 msgid "_XYZ Data"
 msgstr ""
 
-#: app/menu.c:715
+#: app/menu.c:714
 msgid "Re-show Last"
 msgstr ""
 
-#: app/menu.c:730
+#: app/menu.c:729
 msgid "Repeat Last"
 msgstr ""
 
-#: app/menu.c:858
+#: app/menu.c:857
 msgid "Repeat"
 msgstr ""
 
-#: app/menu.c:864
+#: app/menu.c:863
 msgid "Re-show"
 msgstr ""
 
-#: app/menu.c:1186
+#: app/menu.c:1185
 msgid "_Document history"
 msgstr ""
 
@@ -2164,8 +2264,8 @@ msgstr ""
 msgid "_New"
 msgstr ""
 
-#: app/meta.c:235 modules/file/imgexport.c:4672 modules/file/rawfile.c:1058
-#: modules/process/neural.c:711 modules/tools/selectionmanager.c:405
+#: app/meta.c:235 modules/file/imgexport.c:4620 modules/file/rawfile.c:1058
+#: modules/process/neural.c:718 modules/tools/selectionmanager.c:405
 msgid "_Delete"
 msgstr ""
 
@@ -2239,11 +2339,11 @@ msgstr ""
 msgid "Cannot create user module directory %s: %s"
 msgstr ""
 
-#: app/splash.c:832
+#: app/splash.c:1260
 msgid "Starting "
 msgstr ""
 
-#: app/splash.c:878
+#: app/splash.c:1313
 msgid " is free software released under GNU GPL."
 msgstr ""
 
@@ -2649,124 +2749,125 @@ msgstr ""
 msgid "_Show tips at startup"
 msgstr ""
 
-#: app/toolbox-editor.c:212
+#: app/toolbox-editor.c:213
 msgid "Toolbox Editor"
 msgstr ""
 
-#: app/toolbox-editor.c:257
+#: app/toolbox-editor.c:258
 msgid "_New Item"
 msgstr ""
 
-#: app/toolbox-editor.c:262
+#: app/toolbox-editor.c:263
 msgid "_New Group"
 msgstr ""
 
-#: app/toolbox-editor.c:268 app/toolbox.c:577
+#: app/toolbox-editor.c:269 app/toolbox.c:591
 msgid "_Edit"
 msgstr ""
 
-#: app/toolbox-editor.c:273 modules/process/fft_filter_2d.c:499
-#: modules/tools/maskedit.c:548 modules/volume/volume_zcal.c:173
+#: app/toolbox-editor.c:274 modules/process/fft_filter_2d.c:499
+#: modules/tools/maskedit.c:554 modules/volume/volume_zcal.c:173
 msgid "_Remove"
 msgstr ""
 
-#: app/toolbox-editor.c:278
+#: app/toolbox-editor.c:279
 msgid "Move _Up"
 msgstr ""
 
-#: app/toolbox-editor.c:283
+#: app/toolbox-editor.c:284
 msgid "Move _Down"
 msgstr ""
 
-#: app/toolbox-editor.c:292 modules/file/hdrimage.cc:2304
-#: modules/file/imgexport.c:3101 modules/file/pixmap.c:872
+#: app/toolbox-editor.c:293 modules/file/hdrimage.cc:2304
+#: modules/file/imgexport.c:3114 modules/file/pixmap.c:872
 #: modules/file/rawfile.c:658 modules/process/crosscor.c:252
-#: modules/process/dimensions.h:473 modules/process/tip_blind.c:333
+#: modules/process/dimensions.h:455 modules/process/fibre_synth.c:526
+#: modules/process/tip_blind.c:334
 msgid "_Width:"
 msgstr ""
 
-#: app/toolbox-editor.c:774
+#: app/toolbox-editor.c:787
 msgid "Toolbox Group"
 msgstr ""
 
-#: app/toolbox-editor.c:791 modules/file/rawgraph.c:267
+#: app/toolbox-editor.c:804 modules/file/rawgraph.c:267
 msgid "_Title:"
 msgstr ""
 
-#: app/toolbox-editor.c:805
+#: app/toolbox-editor.c:818
 msgid "_Id:"
 msgstr ""
 
-#: app/toolbox-editor.c:818
+#: app/toolbox-editor.c:831
 msgid "_Suggest"
 msgstr ""
 
-#: app/toolbox-editor.c:824
+#: app/toolbox-editor.c:837
 msgid "Trans_latable title"
 msgstr ""
 
-#: app/toolbox-editor.c:874
+#: app/toolbox-editor.c:887
 msgid "Group id is not a valid identifier"
 msgstr ""
 
-#: app/toolbox-editor.c:882
+#: app/toolbox-editor.c:895
 msgid "Group id is not unique"
 msgstr ""
 
-#: app/toolbox-editor.c:971
+#: app/toolbox-editor.c:984
 msgid "Toolbox Item"
 msgstr ""
 
-#: app/toolbox-editor.c:992 modules/process/coerce.c:331
+#: app/toolbox-editor.c:1005 modules/process/coerce.c:331
 #: modules/tools/filter.c:284
 msgid "_Type:"
 msgstr ""
 
-#: app/toolbox-editor.c:999
+#: app/toolbox-editor.c:1012
 msgid "Placeholder"
 msgstr ""
 
-#: app/toolbox-editor.c:1000
+#: app/toolbox-editor.c:1013
 msgid "Builtin"
 msgstr ""
 
-#: app/toolbox-editor.c:1001 app/toolbox.c:107
+#: app/toolbox-editor.c:1014 app/toolbox.c:112
 msgid "Data Process"
 msgstr ""
 
-#: app/toolbox-editor.c:1003
+#: app/toolbox-editor.c:1016
 msgid "Volume Data"
 msgstr ""
 
-#: app/toolbox-editor.c:1004
+#: app/toolbox-editor.c:1017
 msgid "XYZ Data"
 msgstr ""
 
-#: app/toolbox-editor.c:1005
+#: app/toolbox-editor.c:1018
 msgid "Tool"
 msgstr ""
 
-#: app/toolbox-editor.c:1012
+#: app/toolbox-editor.c:1025 modules/tools/profile.c:483
 msgid "_Mode:"
 msgstr ""
 
-#: app/toolbox-editor.c:1019 app/toolbox-editor.c:1038
+#: app/toolbox-editor.c:1032 app/toolbox-editor.c:1051
 msgid "Default"
 msgstr ""
 
-#: app/toolbox-editor.c:1020
+#: app/toolbox-editor.c:1033
 msgid "Interactive"
 msgstr ""
 
-#: app/toolbox-editor.c:1021
+#: app/toolbox-editor.c:1034
 msgid "Non-interactive"
 msgstr ""
 
-#: app/toolbox-editor.c:1029
+#: app/toolbox-editor.c:1042
 msgid "Use _icon from:"
 msgstr ""
 
-#: app/toolbox-editor.c:1063
+#: app/toolbox-editor.c:1076
 msgid "Functions"
 msgstr ""
 
@@ -2782,149 +2883,165 @@ msgstr ""
 msgid "All tools not placed explicitly go here."
 msgstr ""
 
-#: app/toolbox.c:106
+#: app/toolbox.c:111
 msgid "View"
 msgstr ""
 
-#: app/toolbox.c:109
+#: app/toolbox.c:114
 msgid "Tools"
 msgstr ""
 
-#: app/toolbox.c:575
+#: app/toolbox.c:589
 msgid "_File"
 msgstr ""
 
-#: app/toolbox.c:593
+#: app/toolbox.c:607
 msgid "_Info"
 msgstr ""
 
-#: app/toolbox.c:663
+#: app/toolbox.c:696
 msgid "Display a 3D view of data"
 msgstr ""
 
-#: app/toolbox.c:667
+#: app/toolbox.c:700
+msgid "Undo"
+msgstr ""
+
+#: app/toolbox.c:700
+msgid "Undo last action"
+msgstr ""
+
+#: app/toolbox.c:704
+msgid "Redo"
+msgstr ""
+
+#: app/toolbox.c:704
+msgid "Redo again last undone action"
+msgstr ""
+
+#: app/toolbox.c:708
 msgid "Zoom in"
 msgstr ""
 
-#: app/toolbox.c:671
+#: app/toolbox.c:712
 msgid "Zoom out"
 msgstr ""
 
-#: app/toolbox.c:675
+#: app/toolbox.c:716
 msgid "Zoom 1:1"
 msgstr ""
 
-#: app/toolbox.c:722
+#: app/toolbox.c:781
 msgid "/Show _Data Browser"
 msgstr ""
 
-#: app/toolbox.c:730
+#: app/toolbox.c:789
 msgid "/Module _Browser"
 msgstr ""
 
-#: app/toolbox.c:738
+#: app/toolbox.c:797
 msgid "/Program _Messages"
 msgstr ""
 
-#: app/toolbox.c:753
+#: app/toolbox.c:812
 msgid "/_User Guide"
 msgstr ""
 
-#: app/toolbox.c:761
+#: app/toolbox.c:820
 msgid "/_Tip of the Day"
 msgstr ""
 
-#: app/toolbox.c:769
+#: app/toolbox.c:828
 msgid "/_About Gwyddion"
 msgstr ""
 
-#: app/toolbox.c:806
+#: app/toolbox.c:865
 msgid "/_Open..."
 msgstr ""
 
-#: app/toolbox.c:814
+#: app/toolbox.c:873
 msgid "/_Merge..."
 msgstr ""
 
-#: app/toolbox.c:822
+#: app/toolbox.c:881
 msgid "/Open _Recent"
 msgstr ""
 
-#: app/toolbox.c:830
+#: app/toolbox.c:889
 msgid "/_Save"
 msgstr ""
 
-#: app/toolbox.c:838
+#: app/toolbox.c:897
 msgid "/Save _As..."
 msgstr ""
 
-#: app/toolbox.c:846
+#: app/toolbox.c:905
 msgid "/_Close"
 msgstr ""
 
-#: app/toolbox.c:854
+#: app/toolbox.c:913
 msgid "/Remo_ve All Logs"
 msgstr ""
 
-#: app/toolbox.c:870
+#: app/toolbox.c:929
 msgid "/_Quit"
 msgstr ""
 
-#: app/toolbox.c:910
+#: app/toolbox.c:969
 msgid "/_Undo"
 msgstr ""
 
-#: app/toolbox.c:918
+#: app/toolbox.c:977
 msgid "/_Redo"
 msgstr ""
 
-#: app/toolbox.c:934
+#: app/toolbox.c:993
 msgid "/Default Mask _Color..."
 msgstr ""
 
-#: app/toolbox.c:942
+#: app/toolbox.c:1001
 msgid "/Color _Gradients..."
 msgstr ""
 
-#: app/toolbox.c:950
+#: app/toolbox.c:1009
 msgid "/G_L Materials..."
 msgstr ""
 
-#: app/toolbox.c:958
+#: app/toolbox.c:1017
 msgid "/_Toolbox..."
 msgstr ""
 
-#: app/toolbox.c:966
+#: app/toolbox.c:1025
 msgid "/_Keyboard Shortcuts"
 msgstr ""
 
-#: app/toolbox.c:974
+#: app/toolbox.c:1033
 msgid "/_Logging Enabled"
 msgstr ""
 
-#: app/toolbox.c:1083
+#: app/toolbox.c:1142
 msgid "Program Messages"
 msgstr ""
 
-#: app/toolbox.c:1320
+#: app/toolbox.c:1379
 msgid "Change Default Mask Color"
 msgstr ""
 
-#: app/toolbox.c:1348
+#: app/toolbox.c:1407
 msgid "OpenGL 3D graphics not available"
 msgstr ""
 
-#: app/toolbox.c:1353
+#: app/toolbox.c:1412
 msgid "OpenGL was disabled with a command-line option."
 msgstr ""
 
-#: app/toolbox.c:1361
+#: app/toolbox.c:1420
 msgid ""
 "Initialization of OpenGL failed.  Check output of <tt>glxinfo</tt> and "
 "warning messages printed to console during Gwyddion startup."
 msgstr ""
 
-#: app/toolbox.c:1368
+#: app/toolbox.c:1427
 msgid "This version of Gwyddion was built without OpenGL support."
 msgstr ""
 
@@ -3000,7 +3117,7 @@ msgstr ""
 msgid "Secondary data item has no primary data"
 msgstr ""
 
-#: app/wait.c:106
+#: app/wait.c:114
 msgid "Please wait"
 msgstr ""
 
@@ -3017,11 +3134,11 @@ msgstr ""
 msgid "File header cannot be converted from ISO-8859-1 character set: %s"
 msgstr ""
 
-#: modules/file/aistfile.c:127
+#: modules/file/aistfile.c:123
 msgid "Imports AIST-NT data files."
 msgstr ""
 
-#: modules/file/aistfile.c:140
+#: modules/file/aistfile.c:136
 msgid "AIST-NT files (.aist)"
 msgstr ""
 
@@ -3068,7 +3185,8 @@ msgstr ""
 
 #: modules/file/alicona.c:665 modules/file/gdeffile.c:175
 #: modules/file/gdeffile.c:199 modules/file/gsffile.c:159
-#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1038
+#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1174
+#: modules/file/microprof.c:361 modules/file/microprof.c:375
 #: modules/file/pt3file.c:489 modules/file/pt3file.c:591
 msgid "File header is truncated."
 msgstr ""
@@ -3081,11 +3199,11 @@ msgstr ""
 msgid "Comment is not nul-terminated."
 msgstr ""
 
-#: modules/file/ambfile.c:84
+#: modules/file/ambfile.c:83
 msgid "Imports Ambios AMB data files."
 msgstr ""
 
-#: modules/file/ambfile.c:97
+#: modules/file/ambfile.c:96
 msgid "Ambios amb files (.amb)"
 msgstr ""
 
@@ -3117,11 +3235,11 @@ msgstr ""
 msgid "FileDescBegin has no corresponding FileDescEnd."
 msgstr ""
 
-#: modules/file/apedaxfile.c:259
+#: modules/file/apedaxfile.c:261
 msgid "Imports A.P.E. Research DAX data files."
 msgstr ""
 
-#: modules/file/apedaxfile.c:274
+#: modules/file/apedaxfile.c:276
 msgid "A.P.E. Research DAX Files (.dax) and APDT File (.apdt)"
 msgstr ""
 
@@ -3149,7 +3267,7 @@ msgstr ""
 msgid "Height:"
 msgstr ""
 
-#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:248
+#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:251
 msgid "Value units:"
 msgstr ""
 
@@ -3158,30 +3276,30 @@ msgid "Export Text"
 msgstr ""
 
 #: modules/file/asciiexport.c:275 modules/file/gxyzffile.c:402
-#: modules/file/imgexport.c:3565 modules/file/imgexport.c:4203
-#: modules/file/rawfile.c:758 modules/file/xyzexport.c:311
-#: modules/process/calibrate.c:607 modules/process/coerce.c:364
-#: modules/process/col_synth.c:516 modules/process/correct_affine.c:470
-#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:261
-#: modules/process/grain_dist.c:306 modules/process/grain_edge.c:255
-#: modules/process/grain_mark.c:338 modules/process/grain_wshed.c:252
-#: modules/process/linematch.c:852 modules/process/mark_disconn.c:279
-#: modules/process/slope_dist.c:367 modules/process/tip_blind.c:357
+#: modules/file/imgexport.c:3532 modules/file/imgexport.c:4151
+#: modules/file/rawfile.c:758 modules/file/xyzexport.c:314
+#: modules/process/calibrate.c:561 modules/process/coerce.c:363
+#: modules/process/col_synth.c:516 modules/process/correct_affine.c:520
+#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:263
+#: modules/process/grain_dist.c:307 modules/process/grain_edge.c:254
+#: modules/process/grain_mark.c:335 modules/process/grain_wshed.c:256
+#: modules/process/linematch.c:819 modules/process/mark_disconn.c:280
+#: modules/process/slope_dist.c:359 modules/process/tip_blind.c:360
 #: modules/process/wpour_mark.c:354 modules/tools/spotremove.c:322
-#: modules/tools/stats.c:402 modules/xyz/xyz_raster.c:628
+#: modules/tools/stats.c:401 modules/xyz/xyz_raster.c:597
 msgid "Options"
 msgstr ""
 
-#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:314
+#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:317
 msgid "Use _dot as decimal separator"
 msgstr ""
 
-#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:321
-#: modules/process/grain_dist.c:317
+#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:324
+#: modules/process/grain_dist.c:318
 msgid "Add _informational comment header"
 msgstr ""
 
-#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:330
+#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:333
 msgid "_Precision:"
 msgstr ""
 
@@ -3201,20 +3319,20 @@ msgstr ""
 msgid "Attocube ASCII files (.asc)"
 msgstr ""
 
-#: modules/file/bcrfile.c:146
+#: modules/file/bcrfile.c:141
 msgid "Imports Image Metrology BCR data files."
 msgstr ""
 
-#: modules/file/bcrfile.c:159
+#: modules/file/bcrfile.c:154
 msgid "BCR files (.bcr, .bcrf)"
 msgstr ""
 
-#: modules/file/bcrfile.c:238
+#: modules/file/bcrfile.c:233
 #, c-format
 msgid "File header is not convertible from UTF-16: %s"
 msgstr ""
 
-#: modules/file/bcrfile.c:351
+#: modules/file/bcrfile.c:346
 #, c-format
 msgid "Unknown file type header: `%s'."
 msgstr ""
@@ -3249,7 +3367,7 @@ msgid "Burleigh exported data (.txt, .bin)"
 msgstr ""
 
 #: modules/file/burleigh_exp.c:226 modules/file/burleigh_exp.c:267
-#: modules/file/nanoscope.c:1605 modules/file/omicron.c:416
+#: modules/file/nanoscope.c:1612 modules/file/omicron.c:416
 #: modules/file/shimadzu.c:468
 msgid "Missing colon in header line."
 msgstr ""
@@ -3298,22 +3416,40 @@ msgstr ""
 msgid "Benyuan CSM files (.csm)"
 msgstr ""
 
-#: modules/file/dektakxml.c:138
+#: modules/file/dektakvca.c:197
+msgid "Imports Dektak OPDx data files."
+msgstr ""
+
+#: modules/file/dektakvca.c:210
+msgid "Dektak OPDx data files (.OPDx)"
+msgstr ""
+
+#: modules/file/dektakvca.c:655
+#, c-format
+msgid "Item `%s' has unexpected type %u instead of %u."
+msgstr ""
+
+#: modules/file/dektakvca.c:1022
+#, c-format
+msgid "Truncated data inside item %s."
+msgstr ""
+
+#: modules/file/dektakxml.c:118
 msgid "Imports Dektak XML data files."
 msgstr ""
 
-#: modules/file/dektakxml.c:151
+#: modules/file/dektakxml.c:131
 msgid "Dektak XML data files (.xml)"
 msgstr ""
 
-#: modules/file/dektakxml.c:228 modules/file/lextfile.c:260
-#: modules/file/nanoscan.c:267 modules/file/ometiff.c:265
+#: modules/file/dektakxml.c:208 modules/file/lextfile.c:260
+#: modules/file/nanoscan.c:270 modules/file/ometiff.c:265
 #, c-format
 msgid "XML parsing failed: %s"
 msgstr ""
 
-#: modules/file/dektakxml.c:400 modules/file/lextfile.c:163
-#: modules/file/nanoscan.c:672 modules/file/ometiff.c:445
+#: modules/file/dektakxml.c:373 modules/file/lextfile.c:163
+#: modules/file/nanoscan.c:698 modules/file/ometiff.c:445
 #, c-format
 msgid "Top-level element is not ‘%s’."
 msgstr ""
@@ -3425,7 +3561,7 @@ msgid "Scan size header field overlaps with data."
 msgstr ""
 
 #: modules/file/err.h:48 modules/file/nrrdfile.c:779
-#: modules/file/nrrdfile.c:824
+#: modules/file/nrrdfile.c:824 modules/pygwy/pygwy-console.c:504
 #, c-format
 msgid "Cannot read from file: %s."
 msgstr ""
@@ -3635,32 +3771,32 @@ msgid ""
 "Data deserialization succeeded, but resulted in an unexpected object %s."
 msgstr ""
 
-#: modules/file/gwytiff.h:332
+#: modules/file/gwytiff.h:335
 #, c-format
 msgid "BigTIFF reserved fields are %u and %u instead of 8 and 0."
 msgstr ""
 
-#: modules/file/gwytiff.h:349 modules/file/gwytiff.h:366
+#: modules/file/gwytiff.h:352 modules/file/gwytiff.h:369
 #, c-format
 msgid "TIFF directory %lu ended unexpectedly."
 msgstr ""
 
-#: modules/file/gwytiff.h:484
+#: modules/file/gwytiff.h:487
 #, c-format
 msgid "BigTIFF data type %u was found in a classic TIFF."
 msgstr ""
 
-#: modules/file/gwytiff.h:501
+#: modules/file/gwytiff.h:504
 msgid "Invalid tag data positions were found."
 msgstr ""
 
-#: modules/file/gwytiff.h:874 modules/file/gwytiff.h:889
-#: modules/file/gwytiff.h:1012 modules/file/gwytiff.h:1019
+#: modules/file/gwytiff.h:877 modules/file/gwytiff.h:892
+#: modules/file/gwytiff.h:1015 modules/file/gwytiff.h:1022
 #, c-format
 msgid "Required tag %u was not found."
 msgstr ""
 
-#: modules/file/gwytiff.h:942 modules/file/gwytiff.h:986
+#: modules/file/gwytiff.h:945 modules/file/gwytiff.h:989
 #: modules/file/keyence.c:449 modules/file/matfile.c:276
 #: modules/file/matfile.c:298 modules/file/omicronflat.c:1962
 #: modules/file/princetonspe.c:339 modules/file/psia.c:352
@@ -3668,21 +3804,21 @@ msgstr ""
 msgid "File is truncated."
 msgstr ""
 
-#: modules/file/gwytiff.h:1044
+#: modules/file/gwytiff.h:1047
 msgid "Non-uniform bits per sample are unsupported."
 msgstr ""
 
-#: modules/file/gwytiff.h:1071
+#: modules/file/gwytiff.h:1074 modules/file/zeisslsm.c:973
 #, c-format
 msgid "Compression type %u is not supported."
 msgstr ""
 
-#: modules/file/gwytiff.h:1077
+#: modules/file/gwytiff.h:1080
 #, c-format
 msgid "Planar configuration %u is not supported."
 msgstr ""
 
-#: modules/file/gwytiff.h:1101
+#: modules/file/gwytiff.h:1104
 msgid "Unsupported sample format"
 msgstr ""
 
@@ -3719,7 +3855,7 @@ msgstr ""
 msgid "Minizip error while reading the zip file: %s (%d)."
 msgstr ""
 
-#: modules/file/gwyzip.h:248
+#: modules/file/gwyzip.h:248 modules/file/jpkscan.c:2776
 #, c-format
 msgid "File %s is missing in the zip file."
 msgstr ""
@@ -3754,8 +3890,8 @@ msgstr ""
 msgid "Export GXYZF"
 msgstr ""
 
-#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:238
-#: modules/file/xyzexport.c:304
+#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:241
+#: modules/file/xyzexport.c:307
 msgid "XYZ data:"
 msgstr ""
 
@@ -3842,11 +3978,13 @@ msgstr ""
 msgid "Representable"
 msgstr ""
 
-#: modules/file/hdrimage.cc:480 modules/tools/stats.c:203
+#: modules/file/hdrimage.cc:480 modules/graph/graph_stats.c:146
+#: modules/tools/stats.c:203
 msgid "Minimum:"
 msgstr ""
 
-#: modules/file/hdrimage.cc:496 modules/tools/stats.c:204
+#: modules/file/hdrimage.cc:496 modules/graph/graph_stats.c:147
+#: modules/tools/stats.c:204
 msgid "Maximum:"
 msgstr ""
 
@@ -3865,12 +4003,12 @@ msgid "OpenEXR data type %u is invalid or unsupported."
 msgstr ""
 
 #: modules/file/hdrimage.cc:1433 modules/file/hdrimage.cc:1442
-#: modules/file/imgexport.c:5249 modules/file/imgexport.c:5260
+#: modules/file/imgexport.c:5198 modules/file/imgexport.c:5209
 #, c-format
 msgid "libpng initialization error (in %s)"
 msgstr ""
 
-#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5324
+#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5273
 msgid "libpng error occurred"
 msgstr ""
 
@@ -3888,11 +4026,6 @@ msgstr ""
 msgid "Horizontal size:"
 msgstr ""
 
-#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
-#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
-msgid "px"
-msgstr ""
-
 #: modules/file/hdrimage.cc:2252 modules/file/pixmap.c:826
 msgid "Vertical size:"
 msgstr ""
@@ -3905,10 +4038,10 @@ msgstr ""
 msgid "Pages:"
 msgstr ""
 
-#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3043
+#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3059
 #: modules/file/pixmap.c:862 modules/file/rawfile.c:649
-#: modules/process/dimensions.h:467 modules/xyz/xyz_drift.c:774
-#: modules/xyz/xyz_raster.c:566
+#: modules/process/dimensions.h:449 modules/xyz/xyz_drift.c:774
+#: modules/xyz/xyz_raster.c:535
 msgid "Physical Dimensions"
 msgstr ""
 
@@ -3918,16 +4051,16 @@ msgstr ""
 #: modules/process/calcoefs_new.c:408 modules/process/calcoefs_new.c:475
 #: modules/process/calcoefs_simple.c:391 modules/process/calcoefs_simple.c:458
 #: modules/process/calcoefs_view.c:511 modules/process/calcoefs_view.c:549
-#: modules/process/calibrate.c:466 modules/process/calibrate.c:549
-#: modules/process/dimensions.h:161 modules/process/volumize_layers.c:259
-#: modules/volume/volume_calibrate.c:414 modules/volume/volume_calibrate.c:441
-#: modules/volume/volume_calibrate.c:468 modules/volume/volume_calibrate.c:546
+#: modules/process/calibrate.c:459 modules/process/calibrate.c:514
+#: modules/process/dimensions.h:143 modules/process/volumize_layers.c:259
+#: modules/volume/volume_calibrate.c:409 modules/volume/volume_calibrate.c:429
+#: modules/volume/volume_calibrate.c:449 modules/volume/volume_calibrate.c:498
 msgid "verb|Change"
 msgstr ""
 
 #: modules/file/hdrimage.cc:2345 modules/file/pixmap.c:907
-#: modules/file/rawfile.c:694 modules/process/crosscor.c:263
-#: modules/process/dimensions.h:477
+#: modules/file/rawfile.c:694 modules/process/crosscor.c:260
+#: modules/process/dimensions.h:459
 msgid "H_eight:"
 msgstr ""
 
@@ -3944,16 +4077,16 @@ msgstr ""
 #: modules/file/hdrimage.cc:2557 modules/file/pixmap.c:1176
 #: modules/file/rawfile.c:1386 modules/process/calcoefs_new.c:819
 #: modules/process/calcoefs_simple.c:1197 modules/process/calcoefs_view.c:1380
-#: modules/process/calibrate.c:979 modules/process/dimensions.h:195
-#: modules/process/volumize_layers.c:315 modules/volume/volume_calibrate.c:1017
+#: modules/process/calibrate.c:1013 modules/process/dimensions.h:177
+#: modules/process/volumize_layers.c:314 modules/volume/volume_calibrate.c:957
 msgid "Change Units"
 msgstr ""
 
 #: modules/file/hdrimage.cc:2571 modules/file/pixmap.c:1190
 #: modules/file/rawfile.c:1400 modules/process/calcoefs_new.c:832
 #: modules/process/calcoefs_simple.c:1210 modules/process/calcoefs_view.c:1393
-#: modules/process/calibrate.c:993 modules/process/dimensions.h:208
-#: modules/process/volumize_layers.c:329 modules/volume/volume_calibrate.c:1031
+#: modules/process/calibrate.c:1027 modules/process/dimensions.h:190
+#: modules/process/volumize_layers.c:328 modules/volume/volume_calibrate.c:971
 msgid "New _units:"
 msgstr ""
 
@@ -3997,187 +4130,188 @@ msgstr ""
 msgid "Field DataSize %ux%u does not match image dimensions %ux%u."
 msgstr ""
 
-#: modules/file/igorfile.c:200
+#: modules/file/igorfile.c:210
 msgid "Imports Igor binary waves (.ibw)."
 msgstr ""
 
-#: modules/file/igorfile.c:213
+#: modules/file/igorfile.c:223
 msgid "Igor binary waves (.ibw)"
 msgstr ""
 
-#: modules/file/igorfile.c:273
+#: modules/file/igorfile.c:283
 #, c-format
 msgid "Format version is %d.  Only version 5 is supported."
 msgstr ""
 
-#: modules/file/igorfile.c:294
+#: modules/file/igorfile.c:305
 msgid "Only two-dimensional data are supported."
 msgstr ""
 
-#: modules/file/igorfile.c:306
+#: modules/file/igorfile.c:317
 #, c-format
 msgid "Number of data points %u does not match resolutions %u×%u×%u."
 msgstr ""
 
-#: modules/file/igorfile.c:320
+#: modules/file/igorfile.c:331
 #, c-format
 msgid "Data size %u does not match the number of data points %u×%u."
 msgstr ""
 
-#: modules/file/igorfile.c:358
+#: modules/file/igorfile.c:369
 msgid "Cannot read channel labels."
 msgstr ""
 
-#: modules/file/imgexport.c:392 modules/file/pixmap.c:178
+#: modules/file/imgexport.c:391 modules/file/pixmap.c:178
 msgid "Portable Network Graphics (.png)"
 msgstr ""
 
-#: modules/file/imgexport.c:398 modules/file/pixmap.c:182
+#: modules/file/imgexport.c:397 modules/file/pixmap.c:182
 msgid "JPEG (.jpeg,.jpg)"
 msgstr ""
 
-#: modules/file/imgexport.c:404 modules/file/pixmap.c:186
+#: modules/file/imgexport.c:403 modules/file/pixmap.c:186
 msgid "TIFF (.tiff,.tif)"
 msgstr ""
 
-#: modules/file/imgexport.c:410 modules/file/pixmap.c:190
+#: modules/file/imgexport.c:409 modules/file/pixmap.c:190
 msgid "Portable Pixmap (.ppm,.pnm)"
 msgstr ""
 
-#: modules/file/imgexport.c:416 modules/file/pixmap.c:194
+#: modules/file/imgexport.c:415 modules/file/pixmap.c:194
 msgid "Windows or OS2 Bitmap (.bmp)"
 msgstr ""
 
-#: modules/file/imgexport.c:422 modules/file/pixmap.c:198
+#: modules/file/imgexport.c:421 modules/file/pixmap.c:198
 msgid "TARGA (.tga,.targa)"
 msgstr ""
 
-#: modules/file/imgexport.c:429
+#: modules/file/imgexport.c:428
 msgid "WebP (.webp)"
 msgstr ""
 
-#: modules/file/imgexport.c:437
+#: modules/file/imgexport.c:436
 msgid "Portable document format (.pdf)"
 msgstr ""
 
-#: modules/file/imgexport.c:445
+#: modules/file/imgexport.c:444
 msgid "Encapsulated PostScript (.eps)"
 msgstr ""
 
-#: modules/file/imgexport.c:453
+#: modules/file/imgexport.c:452
 msgid "Scalable Vector Graphics (.svg)"
 msgstr ""
 
-#: modules/file/imgexport.c:463 modules/tools/selectionmanager.c:269
+#: modules/file/imgexport.c:462 modules/tools/selectionmanager.c:269
 msgid "Horiz./vert. lines"
 msgstr ""
 
-#: modules/file/imgexport.c:467 modules/tools/selectionmanager.c:270
+#: modules/file/imgexport.c:466 modules/tools/selectionmanager.c:270
 msgid "Ellipses"
 msgstr ""
 
-#: modules/file/imgexport.c:471 modules/tools/selectionmanager.c:272
+#: modules/file/imgexport.c:470 modules/tools/selectionmanager.c:272
 msgid "Lines"
 msgstr ""
 
-#: modules/file/imgexport.c:479 modules/tools/selectionmanager.c:275
+#: modules/file/imgexport.c:478 modules/tools/selectionmanager.c:275
 msgid "Rectangles"
 msgstr ""
 
-#: modules/file/imgexport.c:483 modules/process/lat_synth.c:565
+#: modules/file/imgexport.c:482 modules/process/lat_synth.c:565
 #: modules/process/lat_synth.c:637 modules/tools/selectionmanager.c:271
 msgid "Lattice"
 msgstr ""
 
-#: modules/file/imgexport.c:487
+#: modules/file/imgexport.c:486
 msgid "Path"
 msgstr ""
 
-#: modules/file/imgexport.c:493 modules/file/imgexport.c:499
+#: modules/file/imgexport.c:492 modules/file/imgexport.c:498
 msgid "ruler|_None"
 msgstr ""
 
-#: modules/file/imgexport.c:494
+#: modules/file/imgexport.c:493
 msgid "_Rulers"
 msgstr ""
 
-#: modules/file/imgexport.c:495
+#: modules/file/imgexport.c:494
 msgid "_Inset scale bar"
 msgstr ""
 
-#: modules/file/imgexport.c:500
+#: modules/file/imgexport.c:499
 msgid "_False color ruler"
 msgstr ""
 
-#: modules/file/imgexport.c:504
+#: modules/file/imgexport.c:503
 msgid "title|None"
 msgstr ""
 
-#: modules/file/imgexport.c:505
+#: modules/file/imgexport.c:504
 msgid "At the top"
 msgstr ""
 
-#: modules/file/imgexport.c:506
+#: modules/file/imgexport.c:505
 msgid "Along the right edge"
 msgstr ""
 
-#: modules/file/imgexport.c:512
+#: modules/file/imgexport.c:511
 msgid ""
 "Renders data into vector (SVG, PDF, EPS) and pixmap (PNG, JPEG, TIFF, WebP, "
 "PPM, BMP, TARGA) images. Export to some formats relies on GDK and other "
 "libraries thus may be installation-dependent."
 msgstr ""
 
-#: modules/file/imgexport.c:2931
+#: modules/file/imgexport.c:2933
 msgid "Select Color"
 msgstr ""
 
-#: modules/file/imgexport.c:3002
-msgid "Black"
+#: modules/file/imgexport.c:3005
+msgid "White"
 msgstr ""
 
-#: modules/file/imgexport.c:3010
-msgid "White"
+#: modules/file/imgexport.c:3014
+msgid "Black"
 msgstr ""
 
-#: modules/file/imgexport.c:3053
+#: modules/file/imgexport.c:3069
 msgid "Pi_xel size:"
 msgstr ""
 
-#: modules/file/imgexport.c:3062
+#: modules/file/imgexport.c:3077
 msgid "Pixels per _inch:"
 msgstr ""
 
-#: modules/file/imgexport.c:3089
+#: modules/file/imgexport.c:3102
 msgid "_Zoom:"
 msgstr ""
 
-#: modules/file/imgexport.c:3108 modules/process/bdep_synth.c:430
+#: modules/file/imgexport.c:3120 modules/process/bdep_synth.c:430
 #: modules/process/col_synth.c:486 modules/process/diff_synth.c:508
-#: modules/process/domain_synth.c:510 modules/process/grain_mark.c:285
-#: modules/process/lat_synth.c:753 modules/process/obj_synth.c:575
-#: modules/process/pat_synth.c:852 modules/process/pat_synth.c:1154
-#: modules/process/pat_synth.c:1489 modules/process/tip_blind.c:340
+#: modules/process/domain_synth.c:510 modules/process/fibre_synth.c:540
+#: modules/process/grain_mark.c:284 modules/process/lat_synth.c:753
+#: modules/process/obj_synth.c:573 modules/process/pat_synth.c:853
+#: modules/process/pat_synth.c:1155 modules/process/pat_synth.c:1490
+#: modules/process/phase_synth.c:298 modules/process/tip_blind.c:342
 msgid "_Height:"
 msgstr ""
 
-#: modules/file/imgexport.c:3121
+#: modules/file/imgexport.c:3136
 msgid "_Font:"
 msgstr ""
 
-#: modules/file/imgexport.c:3140
+#: modules/file/imgexport.c:3145
 msgid "_Font size:"
 msgstr ""
 
-#: modules/file/imgexport.c:3160
+#: modules/file/imgexport.c:3163
 msgid "O_utline thickness:"
 msgstr ""
 
-#: modules/file/imgexport.c:3170
+#: modules/file/imgexport.c:3172
 msgid "_Border width:"
 msgstr ""
 
-#: modules/file/imgexport.c:3180
+#: modules/file/imgexport.c:3181
 msgid "_Tick length:"
 msgstr ""
 
@@ -4197,219 +4331,220 @@ msgstr ""
 msgid "_Line and text color:"
 msgstr ""
 
-#: modules/file/imgexport.c:3221
+#: modules/file/imgexport.c:3220
 msgid "_Transparent background"
 msgstr ""
 
-#: modules/file/imgexport.c:3232
+#: modules/file/imgexport.c:3231
 msgid "_Background color:"
 msgstr ""
 
-#: modules/file/imgexport.c:3474
-msgid "Lateral scale"
-msgstr ""
-
-#: modules/file/imgexport.c:3487 modules/process/lno_synth.c:1053
-msgid "_Length:"
-msgstr ""
-
-#: modules/file/imgexport.c:3503
-msgid "_Auto"
-msgstr ""
-
-#: modules/file/imgexport.c:3511 modules/process/pat_synth.c:469
+#: modules/file/imgexport.c:3433 modules/process/fibre_synth.c:582
+#: modules/process/pat_synth.c:470
 msgid "Placement"
 msgstr ""
 
-#: modules/file/imgexport.c:3515
+#: modules/file/imgexport.c:3437
 msgid "left"
 msgstr ""
 
-#: modules/file/imgexport.c:3519
+#: modules/file/imgexport.c:3440
 msgid "center"
 msgstr ""
 
-#: modules/file/imgexport.c:3523
+#: modules/file/imgexport.c:3443
 msgid "right"
 msgstr ""
 
-#: modules/file/imgexport.c:3528
+#: modules/file/imgexport.c:3448
 msgid "top"
 msgstr ""
 
-#: modules/file/imgexport.c:3540
+#: modules/file/imgexport.c:3456
 msgid "bottom"
 msgstr ""
 
-#: modules/file/imgexport.c:3552 modules/file/imgexport.c:3874
+#: modules/file/imgexport.c:3479
+msgid "Lateral scale"
+msgstr ""
+
+#: modules/file/imgexport.c:3496 modules/process/lno_synth.c:1053
+msgid "_Length:"
+msgstr ""
+
+#: modules/file/imgexport.c:3502
+msgid "_Auto"
+msgstr ""
+
+#: modules/file/imgexport.c:3519 modules/file/imgexport.c:3832
 msgid "Hori_zontal gap:"
 msgstr ""
 
-#: modules/file/imgexport.c:3558 modules/file/imgexport.c:3854
+#: modules/file/imgexport.c:3526 modules/file/imgexport.c:3812
 msgid "_Vertical gap:"
 msgstr ""
 
-#: modules/file/imgexport.c:3571 modules/file/imgexport.c:4184
+#: modules/file/imgexport.c:3538 modules/file/imgexport.c:4134
 msgid "Colo_r:"
 msgstr ""
 
-#: modules/file/imgexport.c:3576 modules/file/imgexport.c:4189
+#: modules/file/imgexport.c:3542 modules/file/imgexport.c:4138
 msgid "Out_line color:"
 msgstr ""
 
-#: modules/file/imgexport.c:3580 modules/file/imgexport.c:4195
+#: modules/file/imgexport.c:3547 modules/file/imgexport.c:4143
 msgid "O_pacity:"
 msgstr ""
 
-#: modules/file/imgexport.c:3589
+#: modules/file/imgexport.c:3554
 msgid "Draw _ticks"
 msgstr ""
 
-#: modules/file/imgexport.c:3599
+#: modules/file/imgexport.c:3564
 msgid "Draw _label"
 msgstr ""
 
-#: modules/file/imgexport.c:3609
+#: modules/file/imgexport.c:3574
 msgid "Draw text _above scale bar"
 msgstr ""
 
-#: modules/file/imgexport.c:3773
+#: modules/file/imgexport.c:3738
 msgid "Image"
 msgstr ""
 
-#: modules/file/imgexport.c:3777 modules/process/calcoefs_view.c:473
-#: modules/process/correct_affine.c:488 modules/process/drift.c:297
-#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:202
-#: modules/process/fft_filter_1d.c:294 modules/process/fft_profile.c:292
-#: modules/process/fractal.c:253 modules/process/nanoindent_adjust.c:229
-#: modules/process/polydistort.c:247 modules/process/rotate.c:274
-#: modules/process/scale.c:253 modules/process/straighten_path.c:271
+#: modules/file/imgexport.c:3742 modules/process/calcoefs_view.c:473
+#: modules/process/correct_affine.c:538 modules/process/drift.c:298
+#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:203
+#: modules/process/fft_filter_1d.c:296 modules/process/fft_profile.c:293
+#: modules/process/fractal.c:262 modules/process/nanoindent_adjust.c:229
+#: modules/process/polydistort.c:250 modules/process/rotate.c:274
+#: modules/process/scale.c:257 modules/process/straighten_path.c:270
 #: modules/process/unrotate.c:277 modules/tools/linestats.c:400
-#: modules/tools/profile.c:555 modules/tools/roughness.c:864
-#: modules/tools/sfunctions.c:468 modules/xyz/xyz_raster.c:632
+#: modules/tools/profile.c:552 modules/tools/roughness.c:879
+#: modules/tools/sfunctions.c:481 modules/xyz/xyz_raster.c:601
 msgid "_Interpolation type:"
 msgstr ""
 
-#: modules/file/imgexport.c:3807
+#: modules/file/imgexport.c:3772
 msgid "Draw _frame"
 msgstr ""
 
-#: modules/file/imgexport.c:3816
+#: modules/file/imgexport.c:3781
 msgid "Draw _mask"
 msgstr ""
 
-#: modules/file/imgexport.c:3826
+#: modules/file/imgexport.c:3791
 msgid "Draw mask _legend"
 msgstr ""
 
-#: modules/file/imgexport.c:3861
+#: modules/file/imgexport.c:3819
 msgid "Value Scale"
 msgstr ""
 
-#: modules/file/imgexport.c:3882
+#: modules/file/imgexport.c:3840
 msgid "Fi_xed precision:"
 msgstr ""
 
-#: modules/file/imgexport.c:3898
+#: modules/file/imgexport.c:3855
 msgid "Fixed _kilo threshold:"
 msgstr ""
 
-#: modules/file/imgexport.c:3914 modules/file/imgexport.c:4635
+#: modules/file/imgexport.c:3869 modules/file/imgexport.c:4583
 msgid "Title"
 msgstr ""
 
-#: modules/file/imgexport.c:3918
+#: modules/file/imgexport.c:3877
 msgid "Posi_tion:"
 msgstr ""
 
-#: modules/file/imgexport.c:3934
+#: modules/file/imgexport.c:3884
 msgid "_Gap:"
 msgstr ""
 
-#: modules/file/imgexport.c:3941
+#: modules/file/imgexport.c:3891
 msgid "Put _units to title"
 msgstr ""
 
-#: modules/file/imgexport.c:4125
+#: modules/file/imgexport.c:4075
 msgid "Draw _selection"
 msgstr ""
 
-#: modules/file/imgexport.c:4176 modules/tools/selectionmanager.c:361
+#: modules/file/imgexport.c:4126 modules/tools/selectionmanager.c:361
 msgid "Objects"
 msgstr ""
 
-#: modules/file/imgexport.c:4615
+#: modules/file/imgexport.c:4563
 msgid "Lateral"
 msgstr ""
 
-#: modules/file/imgexport.c:4654 modules/file/rawfile.c:1040
-#: modules/process/calcoefs_load.c:230 modules/process/neural.c:693
+#: modules/file/imgexport.c:4602 modules/file/rawfile.c:1040
+#: modules/process/calcoefs_load.c:230 modules/process/neural.c:700
 msgid "verb|_Load"
 msgstr ""
 
-#: modules/file/imgexport.c:4660 modules/file/rawfile.c:1046
-#: modules/process/neural.c:699
+#: modules/file/imgexport.c:4608 modules/file/rawfile.c:1046
+#: modules/process/neural.c:706
 msgid "verb|_Store"
 msgstr ""
 
-#: modules/file/imgexport.c:4666 modules/file/rawfile.c:1052
-#: modules/process/neural.c:705
+#: modules/file/imgexport.c:4614 modules/file/rawfile.c:1052
+#: modules/process/neural.c:712
 msgid "_Rename"
 msgstr ""
 
-#: modules/file/imgexport.c:4686 modules/file/rawfile.c:1071
+#: modules/file/imgexport.c:4634 modules/file/rawfile.c:1071
 msgid "Preset _name:"
 msgstr ""
 
-#: modules/file/imgexport.c:4757
+#: modules/file/imgexport.c:4705
 #, c-format
 msgid "Export %s"
 msgstr ""
 
-#: modules/file/imgexport.c:4778
+#: modules/file/imgexport.c:4727
 msgid "Export as 1_6 bit grayscale"
 msgstr ""
 
-#: modules/file/imgexport.c:4801
+#: modules/file/imgexport.c:4750
 msgid "Lateral Scale"
 msgstr ""
 
-#: modules/file/imgexport.c:4806
+#: modules/file/imgexport.c:4755
 msgid "Values"
 msgstr ""
 
-#: modules/file/imgexport.c:4811
+#: modules/file/imgexport.c:4760
 msgid "Selection"
 msgstr ""
 
-#: modules/file/imgexport.c:4816 modules/file/rawfile.c:462
+#: modules/file/imgexport.c:4765 modules/file/rawfile.c:462
 #: modules/process/convolution_filter.c:275
 msgid "Presets"
 msgstr ""
 
-#: modules/file/imgexport.c:5576
+#: modules/file/imgexport.c:5525
 #, c-format
 msgid "Cairo error occurred: %s"
 msgstr ""
 
-#: modules/file/imgexport.c:5600
+#: modules/file/imgexport.c:5549
 #, c-format
 msgid "Pixbuf save failed: %s."
 msgstr ""
 
-#: modules/file/imgexport.c:5878
+#: modules/file/imgexport.c:5827
 msgid "Image is too large to be stored as TARGA."
 msgstr ""
 
-#: modules/file/imgexport.c:6457 modules/file/imgexport.c:6486
+#: modules/file/imgexport.c:6406 modules/file/imgexport.c:6435
 msgid "Draw _numbers"
 msgstr ""
 
-#: modules/file/imgexport.c:6469 modules/file/imgexport.c:6517
+#: modules/file/imgexport.c:6418 modules/file/imgexport.c:6466
 msgid "_End marker length:"
 msgstr ""
 
-#: modules/file/imgexport.c:6498
+#: modules/file/imgexport.c:6447
 msgid "Marker _radius:"
 msgstr ""
 
@@ -4447,45 +4582,56 @@ msgstr ""
 msgid "image depth"
 msgstr ""
 
-#: modules/file/iso28600.c:534
+#: modules/file/iso28600.c:543
 msgid "Imports and exports ISO 28600:2011 SPM data transfer format."
 msgstr ""
 
-#: modules/file/iso28600.c:550
+#: modules/file/iso28600.c:559
 msgid "ISO 28600:2011 SPM data transfer files (.spm)"
 msgstr ""
 
-#: modules/file/iso28600.c:606
+#: modules/file/iso28600.c:658
 #, c-format
-msgid "Only regular mappings are implemented but file has mapping type ‘%s’."
+msgid ""
+"Only regular and irregular mappings are implemented but the file has mapping "
+"type ‘%s’."
 msgstr ""
 
-#: modules/file/iso28600.c:668 modules/file/iso28600.c:677
-#: modules/file/iso28600.c:686
+#: modules/file/iso28600.c:687 modules/file/iso28600.c:696
+#: modules/file/iso28600.c:705
 #, c-format
 msgid "List ‘%s’ has %u items which differs from the number %u given by ‘%s’."
 msgstr ""
 
-#: modules/file/iso28600.c:755 modules/file/iso28600.c:867
-#: modules/file/sdfile.c:846 modules/file/sdfile.c:863
-#: modules/file/spip-asc.c:239 modules/file/witec-asc.c:223
-#: modules/file/wsffile.c:215
+#: modules/file/iso28600.c:775
 #, c-format
-msgid "End of file reached when reading sample #%d of %d"
+msgid "End of file reached when reading sample #%u of %u"
 msgstr ""
 
-#: modules/file/iso28600.c:764 modules/file/iso28600.c:876
-#: modules/file/spip-asc.c:246 modules/file/witec-asc.c:230
-#: modules/file/wsffile.c:222
+#: modules/file/iso28600.c:784 modules/file/iso28600.c:873
 #, c-format
-msgid "Malformed data encountered when reading sample #%d of %d"
+msgid "Malformed data encountered when reading sample #%u"
 msgstr ""
 
-#: modules/file/iso28600.c:774 modules/file/iso28600.c:886
+#: modules/file/iso28600.c:797 modules/file/iso28600.c:887
+#: modules/file/iso28600.c:1022
 msgid "Missing end-of-data marker."
 msgstr ""
 
-#: modules/file/iso28600.c:1048
+#: modules/file/iso28600.c:1003 modules/file/sdfile.c:846
+#: modules/file/sdfile.c:863 modules/file/spip-asc.c:239
+#: modules/file/witec-asc.c:223 modules/file/wsffile.c:215
+#, c-format
+msgid "End of file reached when reading sample #%d of %d"
+msgstr ""
+
+#: modules/file/iso28600.c:1012 modules/file/spip-asc.c:246
+#: modules/file/witec-asc.c:230 modules/file/wsffile.c:222
+#, c-format
+msgid "Malformed data encountered when reading sample #%d of %d"
+msgstr ""
+
+#: modules/file/iso28600.c:1184
 #, c-format
 msgid "Line %u does not contain mandatory label ‘%s’."
 msgstr ""
@@ -4502,42 +4648,60 @@ msgstr ""
 msgid "The type of data is unknown.  Please report it to the developers."
 msgstr ""
 
-#: modules/file/jpkscan.c:229
+#: modules/file/jpkscan.c:292
 msgid "Imports JPK image scans."
 msgstr ""
 
-#: modules/file/jpkscan.c:242
+#: modules/file/jpkscan.c:305
 msgid "JPK image scans (.jpk, .jpk-qi-image)"
 msgstr ""
 
-#: modules/file/jpkscan.c:249
+#: modules/file/jpkscan.c:312
 msgid "JPK force curves (.jpk-force, .jpk-force-map, .jpk-qi-data)"
 msgstr ""
 
-#: modules/file/jpkscan.c:315
+#: modules/file/jpkscan.c:378
 msgid "File does not contain grid dimensions."
 msgstr ""
 
-#: modules/file/jpkscan.c:660 modules/file/nanoobserver.c:193
+#: modules/file/jpkscan.c:736 modules/file/nanoobserver.c:360
 #: modules/file/nanoscantech.c:205 modules/file/opengps.c:209
 #: modules/file/sensofarx.c:183 modules/file/spmxfile.c:166
 msgid "Minizip cannot open the file as a ZIP file."
 msgstr ""
 
-#: modules/file/jpkscan.c:739
+#: modules/file/jpkscan.c:758 modules/file/jpkscan.c:2717
+#, c-format
+msgid "Scanning file (%u curves)..."
+msgstr ""
+
+#: modules/file/jpkscan.c:798 modules/file/nmmxyz.c:299
+msgid "Reading files..."
+msgstr ""
+
+#: modules/file/jpkscan.c:816
+msgid "Creating volume data..."
+msgstr ""
+
+#: modules/file/jpkscan.c:968
 msgid "Non-uniform point and/or segment numbering is not supported."
 msgstr ""
 
-#: modules/file/jpkscan.c:748
+#: modules/file/jpkscan.c:977
 msgid "Non-uniform channel lists are not supported."
 msgstr ""
 
-#: modules/file/jpkscan.c:756
+#: modules/file/jpkscan.c:985
 #, c-format
 msgid "Data file %s was found instead of expected %s."
 msgstr ""
 
-#: modules/file/jpkscan.c:1497
+#: modules/file/jpkscan.c:1900
+#, c-format
+msgid "Header properties file for index %u is missing."
+msgstr ""
+
+#: modules/file/jpkscan.c:2519
 msgid "Cannot find any height channel."
 msgstr ""
 
@@ -4686,19 +4850,19 @@ msgstr ""
 msgid "File header is larger than file."
 msgstr ""
 
-#: modules/file/microprof.c:117
+#: modules/file/microprof.c:125
 msgid "Imports MicroProf FRT profilometer data files."
 msgstr ""
 
-#: modules/file/microprof.c:130
+#: modules/file/microprof.c:138
 msgid "MicroProf FRT files (.frt)"
 msgstr ""
 
-#: modules/file/microprof.c:136
+#: modules/file/microprof.c:144
 msgid "MicroProf FRT text files (.txt)"
 msgstr ""
 
-#: modules/file/microprof.c:432
+#: modules/file/microprof.c:519
 msgid "File contains fewer than XSize*YSize data points."
 msgstr ""
 
@@ -4786,8 +4950,8 @@ msgstr ""
 msgid "Spectra data starts past the end of file."
 msgstr ""
 
-#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:276
-#: modules/file/renishaw.c:1325 modules/file/sensofar.c:256
+#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:287
+#: modules/file/renishaw.c:1334 modules/file/sensofar.c:256
 #: modules/file/witec-asc.c:161
 msgid "File header is truncated"
 msgstr ""
@@ -4797,8 +4961,8 @@ msgstr ""
 msgid "Parameter header is truncated"
 msgstr ""
 
-#: modules/file/nanoeducator.c:932 modules/process/curvature.c:454
-#: modules/tools/profile.c:1107
+#: modules/file/nanoeducator.c:932 modules/process/curvature.c:456
+#: modules/tools/profile.c:1090
 #, c-format
 msgid "Profile %d"
 msgstr ""
@@ -4878,23 +5042,27 @@ msgstr ""
 msgid "Missing data start marker \\x1a\\x04."
 msgstr ""
 
-#: modules/file/nanoobserver.c:113
-msgid "Reads NanoObserver .nao files."
+#: modules/file/nanoobserver.c:201
+msgid "Reads Nano-Solution/NanoObserver .nao files."
+msgstr ""
+
+#: modules/file/nanoobserver.c:214
+msgid "Nano-Solution/NanoObserver data (.nao)"
 msgstr ""
 
-#: modules/file/nanoobserver.c:126
-msgid "NanoObserver data (.nao)"
+#: modules/file/nanoobserver.c:410 modules/file/renishaw.c:1420
+msgid "Data block is truncated"
 msgstr ""
 
-#: modules/file/nanoscan.c:188
+#: modules/file/nanoscan.c:191
 msgid "Imports NanoScan XML files."
 msgstr ""
 
-#: modules/file/nanoscan.c:201
+#: modules/file/nanoscan.c:204
 msgid "NanoScan XML files (.xml)"
 msgstr ""
 
-#: modules/file/nanoscan.c:910
+#: modules/file/nanoscan.c:937
 msgid "Wrong size of Base64 encoded data."
 msgstr ""
 
@@ -4914,20 +5082,20 @@ msgstr ""
 msgid "Nanoscope II files"
 msgstr ""
 
-#: modules/file/nanoscope.c:207
+#: modules/file/nanoscope.c:212
 msgid ""
 "Imports Veeco (Digital Instruments) Nanoscope data files, version 3 or newer."
 msgstr ""
 
-#: modules/file/nanoscope.c:221
+#: modules/file/nanoscope.c:226
 msgid "Nanoscope III files"
 msgstr ""
 
-#: modules/file/nanoscope.c:288
+#: modules/file/nanoscope.c:295
 msgid "File is not a Nanoscope file, or it is a unknown subtype."
 msgstr ""
 
-#: modules/file/nanoscope.c:295
+#: modules/file/nanoscope.c:302
 msgid ""
 "File has been damaged by change of line endings, resulting in corruption of "
 "the binary part of the file.\n"
@@ -4938,16 +5106,16 @@ msgid ""
 "transfer that attempts to store text platform-independently."
 msgstr ""
 
-#: modules/file/nanoscope.c:653 modules/file/nanoscope.c:669
+#: modules/file/nanoscope.c:660 modules/file/nanoscope.c:676
 msgid "Cannot parse `Scan size' field."
 msgstr ""
 
-#: modules/file/nanoscope.c:1539 modules/file/nrrdfile.c:1086
+#: modules/file/nanoscope.c:1546 modules/file/nrrdfile.c:1086
 #, c-format
 msgid "Garbage after data sample #%u."
 msgstr ""
 
-#: modules/file/nanoscope.c:1595
+#: modules/file/nanoscope.c:1602
 msgid "Truncated header line."
 msgstr ""
 
@@ -5023,11 +5191,8 @@ msgstr ""
 msgid "Nano Measuring Machine data import must be run as interactive."
 msgstr ""
 
-#: modules/file/nmmxyz.c:299
-msgid "Reading files..."
-msgstr ""
-
 #: modules/file/nmmxyz.c:306 modules/process/lat_synth.c:1224
+#: modules/process/wave_synth.c:798
 msgid "Rendering surface..."
 msgstr ""
 
@@ -5060,20 +5225,20 @@ msgid "Plot point density map"
 msgstr ""
 
 #: modules/file/nmmxyz.c:534 modules/file/rawfile.c:626
-#: modules/process/dimensions.h:445 modules/xyz/xyz_drift.c:725
-#: modules/xyz/xyz_raster.c:517
+#: modules/process/dimensions.h:427 modules/xyz/xyz_drift.c:725
+#: modules/xyz/xyz_raster.c:376
 msgid "Resolution"
 msgstr ""
 
 #: modules/file/nmmxyz.c:538 modules/file/rawfile.c:631
-#: modules/process/dimensions.h:451 modules/xyz/xyz_drift.c:729
-#: modules/xyz/xyz_raster.c:521
+#: modules/process/dimensions.h:433 modules/xyz/xyz_drift.c:729
+#: modules/xyz/xyz_raster.c:382
 msgid "_Horizontal size:"
 msgstr ""
 
 #: modules/file/nmmxyz.c:554 modules/file/rawfile.c:638
-#: modules/process/dimensions.h:454 modules/xyz/xyz_drift.c:744
-#: modules/xyz/xyz_raster.c:536
+#: modules/process/dimensions.h:436 modules/xyz/xyz_drift.c:744
+#: modules/xyz/xyz_raster.c:388
 msgid "_Vertical size:"
 msgstr ""
 
@@ -5158,38 +5323,38 @@ msgstr ""
 msgid "Per-axis header field %s contains too few items."
 msgstr ""
 
-#: modules/file/nt-mdt.c:843
+#: modules/file/nt-mdt.c:850
 msgid "Imports NT-MDT data files."
 msgstr ""
 
-#: modules/file/nt-mdt.c:856
+#: modules/file/nt-mdt.c:863
 msgid "NT-MDT files (.mdt)"
 msgstr ""
 
-#: modules/file/nt-mdt.c:1491 modules/file/nt-mdt.c:1599
+#: modules/file/nt-mdt.c:1498 modules/file/nt-mdt.c:1606
 msgid "Frame is too short for Frame Mode."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1506 modules/file/nt-mdt.c:1614
+#: modules/file/nt-mdt.c:1513 modules/file/nt-mdt.c:1621
 msgid "Frame is too short for dots or data."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1869
+#: modules/file/nt-mdt.c:1879
 #, c-format
 msgid "End of file reached in frame header #%u."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1877
+#: modules/file/nt-mdt.c:1887
 #, c-format
 msgid "End of file reached in frame data #%u."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1910
+#: modules/file/nt-mdt.c:1920
 #, c-format
 msgid "Frame #%u is too short for scanned data header."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1927
+#: modules/file/nt-mdt.c:1937
 #, c-format
 msgid "Frame #%u is too short for spectroscopy data header."
 msgstr ""
@@ -5301,28 +5466,28 @@ msgstr ""
 msgid "Omicron MATRIX (.mtrx & .mtrx)"
 msgstr ""
 
-#: modules/file/opdfile.c:188
+#: modules/file/opdfile.c:199
 msgid "Imports Wyko OPD and ASC files."
 msgstr ""
 
-#: modules/file/opdfile.c:201
+#: modules/file/opdfile.c:212
 msgid "Wyko OPD files (.opd)"
 msgstr ""
 
-#: modules/file/opdfile.c:208
+#: modules/file/opdfile.c:219
 msgid "Wyko ASCII export files (.asc)"
 msgstr ""
 
-#: modules/file/opdfile.c:299
+#: modules/file/opdfile.c:310
 #, c-format
 msgid "Item `%s' is beyond the end of the file."
 msgstr ""
 
-#: modules/file/opdfile.c:614
+#: modules/file/opdfile.c:636
 msgid "Nested directories found"
 msgstr ""
 
-#: modules/file/opdfile.c:805
+#: modules/file/opdfile.c:842
 #, c-format
 msgid "Truncated data in block %s"
 msgstr ""
@@ -5615,19 +5780,21 @@ msgstr ""
 
 #: modules/file/rawfile.c:567 modules/process/arithmetic.c:234
 #: modules/process/calcoefs_view.c:320 modules/process/coerce.c:250
-#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:637
+#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:638
 #: modules/process/drift.c:242 modules/process/edge.c:635
-#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:183
-#: modules/process/grain_edge.c:210 modules/process/grain_filter.c:313
-#: modules/process/grain_mark.c:244 modules/process/grain_wshed.c:164
-#: modules/process/mark_disconn.c:205 modules/process/mark_with.c:195
-#: modules/process/polydistort.c:205 modules/process/scars.c:295
-#: modules/process/slope_dist.c:273 modules/process/straighten_path.c:198
-#: modules/process/synth.h:509 modules/process/tip_model.c:166
+#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:184
+#: modules/process/fractal.c:225 modules/process/grain_edge.c:209
+#: modules/process/grain_filter.c:312 modules/process/grain_mark.c:243
+#: modules/process/grain_wshed.c:165 modules/process/mark_disconn.c:205
+#: modules/process/mark_with.c:196 modules/process/mfm_field.c:278
+#: modules/process/mfm_shift.c:167 modules/process/polydistort.c:205
+#: modules/process/scars.c:314 modules/process/slope_dist.c:272
+#: modules/process/stitch.c:272 modules/process/straighten_path.c:198
+#: modules/process/synth.h:538 modules/process/tip_model.c:164
 #: modules/process/wpour_mark.c:273 modules/tools/linestats.c:454
-#: modules/tools/sfunctions.c:534 modules/tools/stats.c:459
-#: modules/volume/volume_extract.c:328 modules/volume/volume_linestat.c:287
-#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:443
+#: modules/tools/sfunctions.c:531 modules/tools/stats.c:456
+#: modules/volume/volume_extract.c:321 modules/volume/volume_linestat.c:292
+#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:457
 msgid "_Update"
 msgstr ""
 
@@ -5769,7 +5936,7 @@ msgid ""
 "The contents of `%s' does not match format: %s."
 msgstr ""
 
-#: modules/file/rawfile.c:1690 modules/process/neural.c:1580
+#: modules/file/rawfile.c:1690 modules/process/neural.c:1587
 #, c-format
 msgid "The name `%s' is invalid."
 msgstr ""
@@ -5862,7 +6029,8 @@ msgstr ""
 msgid "Import XYZ Data"
 msgstr ""
 
-#: modules/file/rawxyz.c:279
+#: modules/file/rawxyz.c:279 modules/graph/graph_stats.c:305
+#: modules/graph/graph_stats.c:756 modules/graph/graph_stats.c:800
 msgid "Number of points:"
 msgstr ""
 
@@ -5882,7 +6050,7 @@ msgstr ""
 msgid "_Lateral units:"
 msgstr ""
 
-#: modules/file/rawxyz.c:386 modules/process/dimensions.h:494
+#: modules/file/rawxyz.c:386 modules/process/dimensions.h:479
 msgid "_Value units:"
 msgstr ""
 
@@ -5898,18 +6066,14 @@ msgstr ""
 msgid "MapArea block is truncated"
 msgstr ""
 
-#: modules/file/renishaw.c:787
+#: modules/file/renishaw.c:793
 msgid "Random points order unsupported"
 msgstr ""
 
-#: modules/file/renishaw.c:1396
+#: modules/file/renishaw.c:1405
 msgid "Block header is truncated"
 msgstr ""
 
-#: modules/file/renishaw.c:1411
-msgid "Data block is truncated"
-msgstr ""
-
 #: modules/file/rhk-sm3.c:236
 msgid "Imports RHK Technology SM3 data files."
 msgstr ""
@@ -6171,19 +6335,23 @@ msgstr ""
 msgid "SPML files (.xml)"
 msgstr ""
 
-#: modules/file/spmlab.c:131
+#: modules/file/spmlab.c:175
 msgid "Imports Thermicroscopes SpmLab R3 to R7 data files."
 msgstr ""
 
-#: modules/file/spmlab.c:144
+#: modules/file/spmlab.c:188
 msgid "Thermicroscopes SpmLab files"
 msgstr ""
 
-#: modules/file/spmlab.c:231
+#: modules/file/spmlab.c:259
 #, c-format
 msgid "Unknown format version %c."
 msgstr ""
 
+#: modules/file/spmlab.c:283
+msgid "Data block is truncated."
+msgstr ""
+
 #: modules/file/spmlabf.c:79
 msgid "Imports SPMLab floating-point files."
 msgstr ""
@@ -6378,11 +6546,11 @@ msgstr ""
 msgid "WinSTM files (.stm)"
 msgstr ""
 
-#: modules/file/wipfile.c:272
+#: modules/file/wipfile.c:281
 msgid "Imports WItec Project data files."
 msgstr ""
 
-#: modules/file/wipfile.c:285
+#: modules/file/wipfile.c:294
 msgid "WItec Project files (.wip)"
 msgstr ""
 
@@ -6443,21 +6611,21 @@ msgstr ""
 msgid "XYZ text data (.xyz)"
 msgstr ""
 
-#: modules/file/xyzexport.c:244
+#: modules/file/xyzexport.c:247
 msgid "Lateral units:"
 msgstr ""
 
-#: modules/file/xyzexport.c:290
+#: modules/file/xyzexport.c:293
 msgid "Export XYZ"
 msgstr ""
 
-#: modules/file/xyzexport.c:340 modules/process/curvature.c:704
+#: modules/file/xyzexport.c:343 modules/process/curvature.c:700
 #: modules/process/entropy.c:214 modules/process/facet-level.c:207
-#: modules/process/fit-shape.c:743 modules/process/level.c:259
-#: modules/process/linematch.c:906 modules/process/neural.c:593
-#: modules/process/polylevel.c:491 modules/process/slope_dist.c:418
-#: modules/tools/filter.c:300 modules/tools/linestats.c:436
-#: modules/tools/profile.c:591 modules/tools/sfunctions.c:516
+#: modules/process/fit-shape.c:755 modules/process/level.c:259
+#: modules/process/linematch.c:869 modules/process/neural.c:597
+#: modules/process/polylevel.c:494 modules/process/slope_dist.c:411
+#: modules/tools/filter.c:301 modules/tools/linestats.c:436
+#: modules/tools/profile.c:572 modules/tools/sfunctions.c:513
 #: modules/tools/stats.c:389
 msgid "Masking Mode"
 msgstr ""
@@ -6470,6 +6638,14 @@ msgstr ""
 msgid "Carl Zeiss SEM scans (.tif)"
 msgstr ""
 
+#: modules/file/zeisslsm.c:383
+msgid "Imports Carl Zeiss CLSM images."
+msgstr ""
+
+#: modules/file/zeisslsm.c:396
+msgid "Carl Zeiss CLSM images (.lsm)"
+msgstr ""
+
 #: modules/file/zemax.c:72
 msgid "Imports Zemax grid sag data files."
 msgstr ""
@@ -6492,15 +6668,15 @@ msgstr ""
 msgid "The first line contains too many items."
 msgstr ""
 
-#: modules/graph/graph_align.c:57
+#: modules/graph/graph_align.c:60
 msgid "Aligns graph curves."
 msgstr ""
 
-#: modules/graph/graph_align.c:71
+#: modules/graph/graph_align.c:74
 msgid "/_Align"
 msgstr ""
 
-#: modules/graph/graph_align.c:74
+#: modules/graph/graph_align.c:77
 msgid "Align curves"
 msgstr ""
 
@@ -6516,48 +6692,50 @@ msgstr ""
 msgid "Fit critical dimension"
 msgstr ""
 
-#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:267
+#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:270
 msgid "Fit Graph"
 msgstr ""
 
-#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:251
-#: modules/graph/graph_fit.c:270 modules/process/fit-shape.c:393
+#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:254
+#: modules/graph/graph_fit.c:273 modules/process/fit-shape.c:394
 #: modules/volume/volume_fdfit.c:299
 msgid "verb|_Fit"
 msgstr ""
 
-#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:166
-#: modules/graph/graph_fdfit.c:306 modules/graph/graph_fit.c:325
-#: modules/graph/graph_peaks.c:199
+#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:168
+#: modules/graph/graph_fdfit.c:313 modules/graph/graph_fit.c:332
+#: modules/graph/graph_peaks.c:199 modules/graph/graph_stats.c:268
 msgid "_Graph curve:"
 msgstr ""
 
-#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:320
-#: modules/graph/graph_fit.c:339 modules/volume/volume_fdfit.c:405
+#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:327
+#: modules/graph/graph_fit.c:346 modules/volume/volume_fdfit.c:389
 msgid "F_unction:"
 msgstr ""
 
-#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:361
-#: modules/graph/graph_fit.c:375 modules/process/curvature.c:745
-#: modules/process/fit-shape.c:792 modules/volume/volume_fdfit.c:446
+#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:368
+#: modules/graph/graph_fit.c:382 modules/process/curvature.c:742
+#: modules/process/fit-shape.c:804 modules/volume/volume_fdfit.c:422
 msgid "Parameter"
 msgstr ""
 
-#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:363
-#: modules/graph/graph_fit.c:377 modules/process/fit-shape.c:794
-#: modules/volume/volume_fdfit.c:448
+#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:370
+#: modules/graph/graph_fit.c:384 modules/process/fit-shape.c:806
+#: modules/volume/volume_fdfit.c:424
 msgid "Error"
 msgstr ""
 
-#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:196
-#: modules/graph/graph_fdfit.c:415 modules/graph/graph_fit.c:433
-#: modules/volume/volume_fdfit.c:500 modules/volume/volume_linestat.c:389
+#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:189
+#: modules/graph/graph_fdfit.c:422 modules/graph/graph_fit.c:440
+#: modules/graph/graph_stats.c:279 modules/graph/graph_stats.c:793
+#: modules/volume/volume_fdfit.c:476 modules/volume/volume_linestat.c:394
 msgid "Range:"
 msgstr ""
 
-#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:207
-#: modules/graph/graph_fdfit.c:426 modules/graph/graph_fit.c:444
-#: modules/volume/volume_fdfit.c:511 modules/volume/volume_linestat.c:400
+#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:200
+#: modules/graph/graph_fdfit.c:433 modules/graph/graph_fit.c:451
+#: modules/graph/graph_stats.c:290 modules/graph/graph_stats.c:796
+#: modules/volume/volume_fdfit.c:487 modules/volume/volume_linestat.c:405
 msgid "range|to"
 msgstr ""
 
@@ -6565,92 +6743,92 @@ msgstr ""
 msgid "_Draw whole circle"
 msgstr ""
 
-#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:491
-#: modules/graph/graph_fit.c:531 modules/process/fit-shape.c:522
-#: modules/volume/volume_fdfit.c:573
+#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:498
+#: modules/graph/graph_fit.c:538 modules/process/fit-shape.c:523
+#: modules/volume/volume_fdfit.c:549
 msgid "Save Fit Report"
 msgstr ""
 
 #: modules/graph/graph_cd.c:529 modules/graph/graph_cd.c:1107
-#: modules/graph/graph_fdfit.c:709 modules/graph/graph_fit.c:763
-#: modules/volume/volume_fdfit.c:907
+#: modules/graph/graph_fdfit.c:725 modules/graph/graph_fit.c:779
+#: modules/volume/volume_fdfit.c:883
 msgid "Fit"
 msgstr ""
 
-#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:749
-#: modules/graph/graph_fit.c:803 modules/volume/volume_fdfit.c:978
-#: modules/volume/volume_fdfit.c:1085
+#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:765
+#: modules/graph/graph_fit.c:819 modules/volume/volume_fdfit.c:954
+#: modules/volume/volume_fdfit.c:1061
 msgid "It is necessary to select more data points than free fit parameters"
 msgstr ""
 
-#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:798
-#: modules/graph/graph_fit.c:852 modules/process/entropy.c:554
-#: modules/tools/grainmeasure.c:217 modules/tools/readvalue.c:634
-#: modules/tools/readvalue.c:635 modules/tools/readvalue.c:636
-#: modules/tools/readvalue.c:637 modules/tools/roughness.c:975
-#: modules/tools/stats.c:727 modules/tools/stats.c:740
-#: modules/tools/stats.c:741 modules/volume/volume_fdfit.c:1134
-#: modules/xyz/xyz_drift.c:1099 modules/xyz/xyz_drift.c:1117
-#: modules/xyz/xyz_drift.c:1134
+#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:814
+#: modules/graph/graph_fit.c:868 modules/graph/graph_stats.c:663
+#: modules/process/entropy.c:555 modules/tools/grainmeasure.c:217
+#: modules/tools/readvalue.c:634 modules/tools/readvalue.c:635
+#: modules/tools/readvalue.c:636 modules/tools/readvalue.c:637
+#: modules/tools/roughness.c:984 modules/tools/stats.c:723
+#: modules/tools/stats.c:736 modules/tools/stats.c:737
+#: modules/volume/volume_fdfit.c:1110 modules/xyz/xyz_drift.c:1099
+#: modules/xyz/xyz_drift.c:1117 modules/xyz/xyz_drift.c:1134
 msgid "N.A."
 msgstr ""
 
-#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1363
-#: modules/graph/graph_fit.c:1500 modules/process/fit-shape.c:2078
-#: modules/volume/volume_fdfit.c:1720
+#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1381
+#: modules/graph/graph_fit.c:1518 modules/process/fit-shape.c:2060
+#: modules/volume/volume_fdfit.c:1696
 msgid "===== Fit Results ====="
 msgstr ""
 
-#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1367
-#: modules/graph/graph_fit.c:1504 modules/process/fit-shape.c:2080
-#: modules/volume/volume_fdfit.c:1724
+#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1385
+#: modules/graph/graph_fit.c:1522 modules/process/fit-shape.c:2062
+#: modules/volume/volume_fdfit.c:1700
 #, c-format
 msgid "Data:             %s\n"
 msgstr ""
 
-#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1370
-#: modules/graph/graph_fit.c:1507 modules/process/fit-shape.c:2082
-#: modules/volume/volume_fdfit.c:1727
+#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1388
+#: modules/graph/graph_fit.c:1525 modules/process/fit-shape.c:2064
+#: modules/volume/volume_fdfit.c:1703
 #, c-format
 msgid "Number of points: %d of %d\n"
 msgstr ""
 
-#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1374
-#: modules/graph/graph_fit.c:1511 modules/volume/volume_fdfit.c:1731
+#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1392
+#: modules/graph/graph_fit.c:1529 modules/volume/volume_fdfit.c:1707
 #, c-format
 msgid "X range:          %.*f to %.*f %s\n"
 msgstr ""
 
-#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1380
-#: modules/graph/graph_fit.c:1517 modules/process/fit-shape.c:2084
-#: modules/volume/volume_fdfit.c:1737
+#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1398
+#: modules/graph/graph_fit.c:1535 modules/process/fit-shape.c:2066
+#: modules/volume/volume_fdfit.c:1713
 #, c-format
 msgid "Fitted function:  %s\n"
 msgstr ""
 
-#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1383
-#: modules/graph/graph_fit.c:1520 modules/process/fit-shape.c:2087
-#: modules/volume/volume_fdfit.c:1740
+#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1401
+#: modules/graph/graph_fit.c:1538 modules/process/fit-shape.c:2069
+#: modules/volume/volume_fdfit.c:1716
 msgid "Results\n"
 msgstr ""
 
-#: modules/graph/graph_cut.c:88
+#: modules/graph/graph_cut.c:87
 msgid "Cut graph"
 msgstr ""
 
-#: modules/graph/graph_cut.c:102
+#: modules/graph/graph_cut.c:101
 msgid "/_Cut..."
 msgstr ""
 
-#: modules/graph/graph_cut.c:105
+#: modules/graph/graph_cut.c:104
 msgid "Extract part of graph into new one"
 msgstr ""
 
-#: modules/graph/graph_cut.c:146
+#: modules/graph/graph_cut.c:145
 msgid "Cut Graph"
 msgstr ""
 
-#: modules/graph/graph_cut.c:180
+#: modules/graph/graph_cut.c:173
 msgid "Cut _all curves"
 msgstr ""
 
@@ -6748,97 +6926,97 @@ msgstr ""
 msgid "Export to PNG"
 msgstr ""
 
-#: modules/graph/graph_export_vector.c:35
+#: modules/graph/graph_export_vector.c:36
 msgid "Exports graphs to PostScript"
 msgstr ""
 
-#: modules/graph/graph_export_vector.c:49
+#: modules/graph/graph_export_vector.c:50
 msgid "/Export _PostScript"
 msgstr ""
 
-#: modules/graph/graph_export_vector.c:52
+#: modules/graph/graph_export_vector.c:53
 msgid "Export graph to PostScript"
 msgstr ""
 
-#: modules/graph/graph_export_vector.c:65
+#: modules/graph/graph_export_vector.c:66
 msgid "Export to PostScript"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:168
+#: modules/graph/graph_fdfit.c:169
 msgid "Fit force-distance data"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:182
+#: modules/graph/graph_fdfit.c:183
 msgid "/_Fit FD Curve..."
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:185
+#: modules/graph/graph_fdfit.c:186
 msgid "Fit a force-distance curve"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:248 modules/volume/volume_fdfit.c:296
+#: modules/graph/graph_fdfit.c:251 modules/volume/volume_fdfit.c:296
 msgid "Fit FD Curve"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:255 modules/graph/graph_fit.c:274
-#: modules/process/fit-shape.c:397 modules/process/measure_lattice.c:257
-#: modules/volume/volume_fdfit.c:303
+#: modules/graph/graph_fdfit.c:258 modules/graph/graph_fit.c:277
+#: modules/process/correct_affine.c:347 modules/process/fit-shape.c:398
+#: modules/process/measure_lattice.c:247 modules/volume/volume_fdfit.c:303
 msgid "verb|_Estimate"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:257 modules/graph/graph_fit.c:276
-#: modules/volume/volume_fdfit.c:305
+#: modules/graph/graph_fdfit.c:260 modules/graph/graph_fit.c:279
+#: modules/process/psf.c:239 modules/volume/volume_fdfit.c:305
 msgid "_Plot Inits"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:359 modules/graph/graph_fit.c:373
-#: modules/process/fit-shape.c:790 modules/volume/volume_fdfit.c:444
+#: modules/graph/graph_fdfit.c:366 modules/graph/graph_fit.c:380
+#: modules/process/fit-shape.c:802 modules/volume/volume_fdfit.c:420
 msgid "Fix"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:365 modules/graph/graph_fit.c:379
-#: modules/volume/volume_fdfit.c:450
+#: modules/graph/graph_fdfit.c:372 modules/graph/graph_fit.c:386
+#: modules/volume/volume_fdfit.c:426
 msgid "Initial"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:376 modules/graph/graph_fit.c:394
-#: modules/volume/volume_fdfit.c:461
+#: modules/graph/graph_fdfit.c:383 modules/graph/graph_fit.c:401
+#: modules/volume/volume_fdfit.c:437
 msgid "χ<sup>2</sup> result:"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:392 modules/graph/graph_fit.c:410
-#: modules/process/fit-shape.c:469 modules/process/fit-shape.c:2134
-#: modules/volume/volume_fdfit.c:477
+#: modules/graph/graph_fdfit.c:399 modules/graph/graph_fit.c:417
+#: modules/process/fit-shape.c:470 modules/process/fit-shape.c:2116
+#: modules/volume/volume_fdfit.c:453
 msgid "Correlation Matrix"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:447 modules/graph/graph_fit.c:485
-#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:532
+#: modules/graph/graph_fdfit.c:454 modules/graph/graph_fit.c:492
+#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:508
 msgid "Instant:"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:450 modules/graph/graph_fit.c:488
+#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
 msgid "esti_mate"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
-#: modules/volume/volume_fdfit.c:542
+#: modules/graph/graph_fdfit.c:464 modules/graph/graph_fit.c:502
+#: modules/volume/volume_fdfit.c:518
 msgid "p_lot"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:708 modules/graph/graph_fit.c:762
-#: modules/volume/volume_fdfit.c:906
+#: modules/graph/graph_fdfit.c:724 modules/graph/graph_fit.c:778
+#: modules/volume/volume_fdfit.c:882
 msgid "Estimate"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:1410 modules/graph/graph_fit.c:1547
-#: modules/volume/volume_fdfit.c:1768
+#: modules/graph/graph_fdfit.c:1428 modules/graph/graph_fit.c:1565
+#: modules/volume/volume_fdfit.c:1744
 #, c-format
 msgid "Residual sum:   %g\n"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:1413 modules/graph/graph_fit.c:1550
-#: modules/volume/volume_fdfit.c:1771
+#: modules/graph/graph_fdfit.c:1431 modules/graph/graph_fit.c:1568
+#: modules/volume/volume_fdfit.c:1747
 msgid "Correlation matrix\n"
 msgstr ""
 
@@ -6854,27 +7032,27 @@ msgstr ""
 msgid "Remove noise from graph curves"
 msgstr ""
 
-#: modules/graph/graph_fit.c:181
+#: modules/graph/graph_fit.c:182
 msgid "Fit graph with function"
 msgstr ""
 
-#: modules/graph/graph_fit.c:195
+#: modules/graph/graph_fit.c:196
 msgid "/_Fit Function..."
 msgstr ""
 
-#: modules/graph/graph_fit.c:198
+#: modules/graph/graph_fit.c:199
 msgid "Fit a function on graph data"
 msgstr ""
 
-#: modules/graph/graph_fit.c:386
+#: modules/graph/graph_fit.c:393
 msgid "Copy all fitted values to estimates"
 msgstr ""
 
-#: modules/graph/graph_fit.c:460
+#: modules/graph/graph_fit.c:467
 msgid "Plot full range"
 msgstr ""
 
-#: modules/graph/graph_fit.c:470
+#: modules/graph/graph_fit.c:477
 msgid "Create a difference graph"
 msgstr ""
 
@@ -6958,74 +7136,157 @@ msgstr ""
 msgid "Find graph curve peaks"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:157
+#: modules/graph/graph_peaks.c:155
 msgid "Prominence"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:161
+#: modules/graph/graph_peaks.c:159
 msgid "Zero"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:162
+#: modules/graph/graph_peaks.c:160
 msgid "Bilateral minimum"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:178
+#: modules/graph/graph_peaks.c:176
 msgid "Graph Peaks"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:212
+#: modules/graph/graph_peaks.c:209
 msgid "_Background type:"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:227
+#: modules/graph/graph_peaks.c:219
 msgid "Order peaks _by:"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:242
+#: modules/graph/graph_peaks.c:225
 msgid "Number of _peaks:"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:263 modules/process/curvature.c:773
-#: modules/process/grain_stat.c:360 modules/process/measure_lattice.c:396
-#: modules/process/polylevel.c:607 modules/tools/distance.c:259
-#: modules/tools/roughness.c:818 modules/tools/stats.c:450
+#: modules/graph/graph_peaks.c:245 modules/graph/graph_stats.c:367
+#: modules/process/curvature.c:770 modules/process/grain_stat.c:360
+#: modules/process/measure_lattice.c:390 modules/process/polylevel.c:610
+#: modules/tools/distance.c:259 modules/tools/roughness.c:819
+#: modules/tools/stats.c:447
 msgid "Save table to a file"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:267 modules/process/curvature.c:778
-#: modules/process/grain_stat.c:365 modules/process/measure_lattice.c:400
-#: modules/process/polylevel.c:617 modules/tools/distance.c:264
-#: modules/tools/roughness.c:823 modules/tools/stats.c:455
+#: modules/graph/graph_peaks.c:249 modules/graph/graph_stats.c:371
+#: modules/process/curvature.c:775 modules/process/grain_stat.c:365
+#: modules/process/measure_lattice.c:394 modules/process/polylevel.c:620
+#: modules/tools/distance.c:264 modules/tools/roughness.c:824
+#: modules/tools/stats.c:452
 msgid "Copy table to clipboard"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:654
+#: modules/graph/graph_peaks.c:618
 msgid "Save Peak Parameters"
 msgstr ""
 
-#: modules/layer/axis.c:143
-msgid "Layer allowing selection of horizontal or vertical lines."
+#: modules/graph/graph_stats.c:148 modules/graph/graph_stats.c:161
+#: modules/tools/stats.c:205
+msgid "Average value:"
 msgstr ""
 
-#: modules/layer/ellipse.c:143
-msgid "Layer allowing selection of elliptic areas."
+#: modules/graph/graph_stats.c:149 modules/tools/stats.c:206
+msgid "Median:"
 msgstr ""
 
-#: modules/layer/lattice.c:126
-msgid "Layer allowing selection of a two-dimensional lattice."
+#: modules/graph/graph_stats.c:150
+msgid "Ra:"
 msgstr ""
 
-#: modules/layer/line.c:177
-msgid "Layer allowing selection of arbitrary straight lines."
+#: modules/graph/graph_stats.c:151
+msgid "Rms (Rq):"
 msgstr ""
 
-#: modules/layer/path.c:171
-msgid "Layer allowing selection of a single long curve."
+#: modules/graph/graph_stats.c:152 modules/tools/stats.c:210
+msgid "Skew:"
 msgstr ""
 
-#: modules/layer/point.c:169
-msgid ""
+#: modules/graph/graph_stats.c:153 modules/tools/stats.c:211
+msgid "Kurtosis:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:158
+msgid "Projected length:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:159
+msgid "Developed length:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:160 modules/tools/stats.c:214
+msgid "Variation:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:162
+msgid "Area under curve:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:163
+msgid "Positive area:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:164
+msgid "Negative area:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:165
+msgid "Root mean square:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:171
+msgid "Calculates simple graph curve statistics."
+msgstr ""
+
+#: modules/graph/graph_stats.c:185
+msgid "/_Statistics..."
+msgstr ""
+
+#: modules/graph/graph_stats.c:188
+msgid "Calculate graph curve statistics"
+msgstr ""
+
+#: modules/graph/graph_stats.c:241
+msgid "Graph Statistics"
+msgstr ""
+
+#: modules/graph/graph_stats.c:320 modules/graph/graph_stats.c:807
+msgid "Simple Parameters"
+msgstr ""
+
+#: modules/graph/graph_stats.c:342 modules/graph/graph_stats.c:826
+msgid "Integrals"
+msgstr ""
+
+#: modules/graph/graph_stats.c:686
+msgid "Save Curve Statistics"
+msgstr ""
+
+#: modules/layer/axis.c:143
+msgid "Layer allowing selection of horizontal or vertical lines."
+msgstr ""
+
+#: modules/layer/ellipse.c:143
+msgid "Layer allowing selection of elliptic areas."
+msgstr ""
+
+#: modules/layer/lattice.c:126
+msgid "Layer allowing selection of a two-dimensional lattice."
+msgstr ""
+
+#: modules/layer/line.c:177
+msgid "Layer allowing selection of arbitrary straight lines."
+msgstr ""
+
+#: modules/layer/path.c:171
+msgid "Layer allowing selection of a single long curve."
+msgstr ""
+
+#: modules/layer/point.c:169
+msgid ""
 "Layer allowing selection of several points, displayed as crosses or "
 "invisible."
 msgstr ""
@@ -7136,25 +7397,25 @@ msgstr ""
 msgid "Angle Distribution"
 msgstr ""
 
-#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:373
+#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:365
 msgid "Output _size:"
 msgstr ""
 
-#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:206
+#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:207
 msgid "_Number of steps:"
 msgstr ""
 
-#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:380
+#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:372
 msgid "_Logarithmic value scale"
 msgstr ""
 
 #: modules/process/angle_dist.c:204 modules/process/entropy.c:231
-#: modules/process/slope_dist.c:390
+#: modules/process/slope_dist.c:382
 msgid "Use local plane _fitting"
 msgstr ""
 
 #: modules/process/angle_dist.c:213 modules/process/entropy.c:242
-#: modules/process/slope_dist.c:401
+#: modules/process/slope_dist.c:393
 msgid "_Plane size:"
 msgstr ""
 
@@ -7170,7 +7431,8 @@ msgstr ""
 msgid "Arithmetic operations on data"
 msgstr ""
 
-#: modules/process/arithmetic.c:202 modules/process/superresolution.c:349
+#: modules/process/arithmetic.c:202 modules/process/stitch.c:234
+#: modules/process/superresolution.c:348
 msgid "Calculated"
 msgstr ""
 
@@ -7186,7 +7448,7 @@ msgstr ""
 msgid "Operands"
 msgstr ""
 
-#: modules/process/arithmetic.c:300 modules/process/dimensions.h:483
+#: modules/process/arithmetic.c:300 modules/process/dimensions.h:465
 msgid "Units"
 msgstr ""
 
@@ -7207,15 +7469,15 @@ msgstr ""
 msgid "Expression contains unknown identifiers"
 msgstr ""
 
-#: modules/process/arithmetic.c:569 modules/process/superresolution.c:300
+#: modules/process/arithmetic.c:569 modules/process/superresolution.c:299
 msgid "Pixel dimensions differ"
 msgstr ""
 
-#: modules/process/arithmetic.c:571 modules/process/superresolution.c:302
+#: modules/process/arithmetic.c:571 modules/process/superresolution.c:301
 msgid "Lateral dimensions are different physical quantities"
 msgstr ""
 
-#: modules/process/arithmetic.c:574 modules/process/superresolution.c:305
+#: modules/process/arithmetic.c:574 modules/process/superresolution.c:304
 msgid "Physical dimensions differ"
 msgstr ""
 
@@ -7318,7 +7580,7 @@ msgid "Generates surfaces by ballistic deposition."
 msgstr ""
 
 #: modules/process/bdep_synth.c:164
-msgid "/S_ynthetic/_Ballistic..."
+msgid "/S_ynthetic/_Deposition/_Ballistic..."
 msgstr ""
 
 #: modules/process/bdep_synth.c:168
@@ -7327,20 +7589,23 @@ msgstr ""
 
 #: modules/process/bdep_synth.c:239 modules/process/bdep_synth.c:596
 #: modules/process/calcoefs_simple.c:636 modules/process/col_synth.c:282
-#: modules/process/col_synth.c:733 modules/process/crosscor.c:819
-#: modules/process/crosscor.c:882 modules/process/deposit_synth.c:268
-#: modules/process/deposit_synth.c:859 modules/process/diff_synth.c:304
-#: modules/process/diff_synth.c:705 modules/process/domain_synth.c:255
-#: modules/process/domain_synth.c:745 modules/process/grain_wshed.c:429
+#: modules/process/col_synth.c:734 modules/process/crosscor.c:792
+#: modules/process/crosscor.c:855 modules/process/deposit_synth.c:268
+#: modules/process/deposit_synth.c:858 modules/process/diff_synth.c:304
+#: modules/process/diff_synth.c:704 modules/process/domain_synth.c:255
+#: modules/process/domain_synth.c:745 modules/process/fibre_synth.c:357
+#: modules/process/fibre_synth.c:872 modules/process/grain_wshed.c:433
 #: modules/process/lat_synth.c:491 modules/process/mark_disconn.c:148
-#: modules/process/mark_disconn.c:373 modules/process/maskcor.c:330
-#: modules/process/mcrop.c:315 modules/process/merge.c:1072
-#: modules/process/nanoindent_adjust.c:323 modules/process/neural.c:1272
-#: modules/process/pid.c:338 modules/process/superresolution.c:416
-#: modules/process/superresolution.c:505 modules/process/tip_blind.c:781
-#: modules/process/tipops.c:320 modules/process/xydenoise.c:213
-#: modules/volume/volume_kmeans.c:403 modules/volume/volume_kmedians.c:365
-#: modules/xyz/xyz_raster.c:1028 modules/xyz/xyz_raster.c:1044
+#: modules/process/mark_disconn.c:361 modules/process/maskcor.c:334
+#: modules/process/mcrop.c:314 modules/process/merge.c:1072
+#: modules/process/nanoindent_adjust.c:324 modules/process/neural.c:1279
+#: modules/process/pid.c:339 modules/process/sphere-revolve.c:269
+#: modules/process/superresolution.c:415 modules/process/superresolution.c:504
+#: modules/process/tip_blind.c:778 modules/process/tipops.c:320
+#: modules/process/wave_synth.c:305 modules/process/wave_synth.c:747
+#: modules/process/xydenoise.c:214 modules/volume/volume_kmeans.c:397
+#: modules/volume/volume_kmedians.c:363 modules/xyz/xyz_raster.c:997
+#: modules/xyz/xyz_raster.c:1013
 msgid "Initializing..."
 msgstr ""
 
@@ -7349,10 +7614,11 @@ msgstr ""
 #: modules/process/deposit_synth.c:531 modules/process/deposit_synth.c:544
 #: modules/process/diff_synth.c:342 modules/process/domain_synth.c:319
 #: modules/process/domain_synth.c:327 modules/process/fbm_synth.c:278
-#: modules/process/fft_synth.c:314 modules/process/lat_synth.c:529
-#: modules/process/lno_synth.c:407 modules/process/noise_synth.c:311
-#: modules/process/obj_synth.c:407 modules/process/pat_synth.c:357
-#: modules/process/wave_synth.c:323
+#: modules/process/fft_synth.c:314 modules/process/fibre_synth.c:394
+#: modules/process/lat_synth.c:529 modules/process/lno_synth.c:405
+#: modules/process/noise_synth.c:309 modules/process/obj_synth.c:404
+#: modules/process/pat_synth.c:357 modules/process/phase_synth.c:518
+#: modules/process/wave_synth.c:342
 msgid "Generated"
 msgstr ""
 
@@ -7371,50 +7637,56 @@ msgid "Progressive preview"
 msgstr ""
 
 #: modules/process/bdep_synth.c:407 modules/process/col_synth.c:458
-#: modules/process/deposit_synth.c:412 modules/process/diff_synth.c:477
+#: modules/process/deposit_synth.c:413 modules/process/diff_synth.c:477
 #: modules/process/domain_synth.c:430 modules/process/fbm_synth.c:360
-#: modules/process/fft_synth.c:398 modules/process/lat_synth.c:626
-#: modules/process/lno_synth.c:490 modules/process/noise_synth.c:394
-#: modules/process/obj_synth.c:498 modules/process/pat_synth.c:442
-#: modules/process/wave_synth.c:407
+#: modules/process/fft_synth.c:398 modules/process/fibre_synth.c:479
+#: modules/process/lat_synth.c:626 modules/process/lno_synth.c:488
+#: modules/process/mfm_current.c:383 modules/process/mfm_parallel.c:384
+#: modules/process/noise_synth.c:392 modules/process/obj_synth.c:495
+#: modules/process/pat_synth.c:442 modules/process/phase_synth.c:263
+#: modules/process/wave_synth.c:426
 msgid "Dimensions"
 msgstr ""
 
 #: modules/process/bdep_synth.c:416 modules/process/col_synth.c:467
-#: modules/process/deposit_synth.c:422 modules/process/diff_synth.c:486
+#: modules/process/deposit_synth.c:425 modules/process/diff_synth.c:486
 #: modules/process/domain_synth.c:438 modules/process/fbm_synth.c:371
-#: modules/process/fft_synth.c:409 modules/process/lno_synth.c:501
-#: modules/process/noise_synth.c:405 modules/process/obj_synth.c:509
-#: modules/process/pat_synth.c:454 modules/process/wave_synth.c:418
+#: modules/process/fft_synth.c:409 modules/process/fibre_synth.c:490
+#: modules/process/lno_synth.c:499 modules/process/mfm_current.c:412
+#: modules/process/mfm_parallel.c:411 modules/process/noise_synth.c:403
+#: modules/process/obj_synth.c:506 modules/process/pat_synth.c:454
+#: modules/process/phase_synth.c:274 modules/process/wave_synth.c:437
 msgid "Generator"
 msgstr ""
 
 #: modules/process/bdep_synth.c:422 modules/process/col_synth.c:473
-#: modules/process/diff_synth.c:492 modules/process/lno_synth.c:1041
-#: modules/process/obj_synth.c:520
+#: modules/process/deposit_synth.c:455 modules/process/diff_synth.c:492
+#: modules/process/fibre_synth.c:502 modules/process/lno_synth.c:1041
+#: modules/process/obj_synth.c:518
 msgid "Co_verage:"
 msgstr ""
 
 #: modules/process/bdep_synth.c:434 modules/process/diff_synth.c:512
-#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:412
-#: modules/process/fft_synth.c:418 modules/process/lat_synth.c:758
-#: modules/process/lno_synth.c:537 modules/process/noise_synth.c:437
-#: modules/process/obj_synth.c:579 modules/process/wave_synth.c:453
-msgid "_Like Current Channel"
+#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:411
+#: modules/process/fft_synth.c:418 modules/process/fibre_synth.c:544
+#: modules/process/lat_synth.c:758 modules/process/lno_synth.c:535
+#: modules/process/noise_synth.c:435 modules/process/obj_synth.c:577
+#: modules/process/phase_synth.c:302 modules/process/wave_synth.c:472
+msgid "_Like Current Image"
 msgstr ""
 
-#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:541
-#: modules/process/diff_synth.c:562
+#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:542
+#: modules/process/diff_synth.c:561
 msgid "Evolution"
 msgstr ""
 
-#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:544
-#: modules/process/diff_synth.c:565
+#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:545
+#: modules/process/diff_synth.c:564
 msgid "Plot graphs:"
 msgstr ""
 
-#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:840
-#: modules/process/diff_synth.c:782
+#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:841
+#: modules/process/diff_synth.c:781
 msgid "Depositing particles..."
 msgstr ""
 
@@ -7449,8 +7721,8 @@ msgstr ""
 msgid "Calibration name:"
 msgstr ""
 
-#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:433
-#: modules/volume/volume_extract.c:514
+#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:421
+#: modules/volume/volume_extract.c:501
 msgid "No data loaded"
 msgstr ""
 
@@ -7474,7 +7746,7 @@ msgstr ""
 msgid "Load calibration data"
 msgstr ""
 
-#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1073
+#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1059
 #, c-format
 msgid "Error loading file '%s'"
 msgstr ""
@@ -7568,7 +7840,7 @@ msgstr ""
 msgid "Simple Error Map"
 msgstr ""
 
-#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:146
+#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:142
 #: modules/process/superresolution.c:156
 msgid "Operands:"
 msgstr ""
@@ -7582,14 +7854,14 @@ msgid "Detail"
 msgstr ""
 
 #: modules/process/calcoefs_simple.c:371 modules/process/calcoefs_view.c:491
-#: modules/process/calibrate.c:496 modules/process/crosscor.c:289
-#: modules/volume/volume_calibrate.c:478
+#: modules/process/calibrate.c:481 modules/process/crosscor.c:276
+#: modules/volume/volume_calibrate.c:460
 msgid "_X offset:"
 msgstr ""
 
 #: modules/process/calcoefs_simple.c:398 modules/process/calcoefs_view.c:517
-#: modules/process/calibrate.c:509 modules/process/crosscor.c:300
-#: modules/volume/volume_calibrate.c:491
+#: modules/process/calibrate.c:488 modules/process/crosscor.c:284
+#: modules/volume/volume_calibrate.c:467
 msgid "_Y offset:"
 msgstr ""
 
@@ -7602,7 +7874,7 @@ msgid "Y p_eriod:"
 msgstr ""
 
 #: modules/process/calcoefs_simple.c:438 modules/process/calcoefs_view.c:529
-#: modules/volume/volume_calibrate.c:505
+#: modules/volume/volume_calibrate.c:474
 msgid "_Z offset:"
 msgstr ""
 
@@ -7633,25 +7905,25 @@ msgstr[1] ""
 msgid "Search canceled"
 msgstr ""
 
-#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:862
-#: modules/process/maskcor.c:332 modules/process/mcrop.c:317
+#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:835
+#: modules/process/maskcor.c:336 modules/process/mcrop.c:316
 #: modules/process/merge.c:1074
 msgid "Correlating..."
 msgstr ""
 
-#: modules/process/calcoefs_stage.c:76
+#: modules/process/calcoefs_stage.c:72
 msgid "Digital AFM data recalibration"
 msgstr ""
 
-#: modules/process/calcoefs_stage.c:90
+#: modules/process/calcoefs_stage.c:86
 msgid "/Cali_bration/_3D Calibration/_Get From Stage map..."
 msgstr ""
 
-#: modules/process/calcoefs_stage.c:94
+#: modules/process/calcoefs_stage.c:90
 msgid "Stage error mapping"
 msgstr ""
 
-#: modules/process/calcoefs_stage.c:131
+#: modules/process/calcoefs_stage.c:127
 msgid "Stage Error Map"
 msgstr ""
 
@@ -7707,14 +7979,16 @@ msgstr ""
 msgid "Crop to actual data"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:369
-#: modules/process/deposit_synth.c:641 modules/process/edge.c:705
-#: modules/process/fft_filter_1d.c:299 modules/process/grain_edge.c:290
-#: modules/process/grain_filter.c:347 modules/process/grain_mark.c:372
-#: modules/process/mark_with.c:318 modules/process/polydistort.c:316
-#: modules/process/scars.c:386 modules/process/slope_dist.c:407
-#: modules/process/synth.h:513 modules/volume/volume_extract.c:424
-#: modules/volume/volume_extract.c:505 modules/volume/volume_linestat.c:422
+#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:368
+#: modules/process/deposit_synth.c:642 modules/process/edge.c:705
+#: modules/process/fft_filter_1d.c:301 modules/process/grain_edge.c:277
+#: modules/process/grain_filter.c:346 modules/process/grain_mark.c:357
+#: modules/process/mark_with.c:322 modules/process/mfm_field.c:420
+#: modules/process/mfm_shift.c:216 modules/process/polydistort.c:319
+#: modules/process/psf.c:309 modules/process/scars.c:421
+#: modules/process/slope_dist.c:400 modules/process/synth.h:542
+#: modules/volume/volume_extract.c:411 modules/volume/volume_extract.c:491
+#: modules/volume/volume_linestat.c:427
 msgid "I_nstant updates"
 msgstr ""
 
@@ -7755,27 +8029,27 @@ msgstr ""
 msgid "Building mesh..."
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1818
+#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1867
 msgid "X correction"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1819
+#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1868
 msgid "Y correction"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1820
+#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1869
 msgid "Z correction"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1821
+#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1870
 msgid "X uncertainty"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1822
+#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1871
 msgid "Y uncertainty"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1823
+#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1872
 msgid "Z uncertainty"
 msgstr ""
 
@@ -7803,77 +8077,77 @@ msgstr ""
 msgid "Delaunay"
 msgstr ""
 
-#: modules/process/calibrate.c:180
+#: modules/process/calibrate.c:172
 msgid "Recalibrates scan lateral dimensions or value range."
 msgstr ""
 
-#: modules/process/calibrate.c:194
+#: modules/process/calibrate.c:186
 msgid "/_Basic Operations/_Dimensions and Units..."
 msgstr ""
 
-#: modules/process/calibrate.c:198 modules/volume/volume_calibrate.c:193
+#: modules/process/calibrate.c:190 modules/volume/volume_calibrate.c:193
 msgid "Change physical dimensions, units or value scale"
 msgstr ""
 
-#: modules/process/calibrate.c:357 modules/volume/volume_calibrate.c:355
+#: modules/process/calibrate.c:349 modules/volume/volume_calibrate.c:355
 msgid "Recalibrated Data"
 msgstr ""
 
-#: modules/process/calibrate.c:390
+#: modules/process/calibrate.c:382
 msgid "Dimensions and Units"
 msgstr ""
 
-#: modules/process/calibrate.c:411 modules/volume/volume_calibrate.c:389
+#: modules/process/calibrate.c:405 modules/volume/volume_calibrate.c:391
 msgid "New Real Dimensions"
 msgstr ""
 
-#: modules/process/calibrate.c:417
+#: modules/process/calibrate.c:415
 msgid "_Match pixel size:"
 msgstr ""
 
-#: modules/process/calibrate.c:444 modules/volume/volume_calibrate.c:394
+#: modules/process/calibrate.c:447 modules/volume/volume_calibrate.c:397
 msgid "_X range:"
 msgstr ""
 
-#: modules/process/calibrate.c:473 modules/volume/volume_calibrate.c:421
+#: modules/process/calibrate.c:467 modules/volume/volume_calibrate.c:417
 msgid "_Y range:"
 msgstr ""
 
-#: modules/process/calibrate.c:489
+#: modules/process/calibrate.c:472
 msgid "_Square samples"
 msgstr ""
 
-#: modules/process/calibrate.c:524 modules/volume/volume_calibrate.c:521
+#: modules/process/calibrate.c:496 modules/volume/volume_calibrate.c:480
 msgid "Value Range"
 msgstr ""
 
-#: modules/process/calibrate.c:529 modules/volume/volume_calibrate.c:448
+#: modules/process/calibrate.c:502 modules/volume/volume_calibrate.c:437
 msgid "_Z range:"
 msgstr ""
 
-#: modules/process/calibrate.c:558
+#: modules/process/calibrate.c:524
 msgid "Z shi_ft:"
 msgstr ""
 
-#: modules/process/calibrate.c:573 modules/volume/volume_calibrate.c:570
+#: modules/process/calibrate.c:533 modules/volume/volume_calibrate.c:515
 msgid "Calibration Coefficients"
 msgstr ""
 
-#: modules/process/calibrate.c:580 modules/volume/volume_calibrate.c:577
+#: modules/process/calibrate.c:538 modules/volume/volume_calibrate.c:520
 msgid "_X calibration factor:"
 msgstr ""
 
-#: modules/process/calibrate.c:590 modules/volume/volume_calibrate.c:585
+#: modules/process/calibrate.c:545 modules/volume/volume_calibrate.c:527
 msgid "_Y calibration factor:"
 msgstr ""
 
-#: modules/process/calibrate.c:600 modules/volume/volume_calibrate.c:593
+#: modules/process/calibrate.c:552 modules/volume/volume_calibrate.c:534
 msgid "_Z calibration factor:"
 msgstr ""
 
-#: modules/process/calibrate.c:613 modules/process/extend.c:293
-#: modules/tools/crop.c:213
-msgid "Create new channel"
+#: modules/process/calibrate.c:567 modules/process/drift.c:389
+#: modules/process/extend.c:293 modules/tools/crop.c:213
+msgid "Create new image"
 msgstr ""
 
 #: modules/process/coerce.c:159
@@ -7893,13 +8167,13 @@ msgid "Coerced"
 msgstr ""
 
 #: modules/process/coerce.c:225 modules/process/coerce.c:326
-#: modules/process/fbm_synth.c:475 modules/process/lno_synth.c:256
-#: modules/process/noise_synth.c:183
+#: modules/process/fbm_synth.c:474 modules/process/lno_synth.c:254
+#: modules/process/noise_synth.c:181
 msgid "distribution|Uniform"
 msgstr ""
 
-#: modules/process/coerce.c:226 modules/process/fbm_synth.c:476
-#: modules/process/lno_synth.c:246 modules/process/noise_synth.c:173
+#: modules/process/coerce.c:226 modules/process/fbm_synth.c:475
+#: modules/process/lno_synth.c:244 modules/process/noise_synth.c:171
 msgid "distribution|Gaussian"
 msgstr ""
 
@@ -7948,12 +8222,12 @@ msgid "Number of maxima"
 msgstr ""
 
 #: modules/process/col_synth.c:173 modules/tools/linestats.c:178
-#: modules/volume/volume_linestat.c:154
+#: modules/volume/volume_linestat.c:156
 msgid "Skew"
 msgstr ""
 
 #: modules/process/col_synth.c:174 modules/tools/linestats.c:179
-#: modules/tools/roughness.c:386 modules/volume/volume_linestat.c:155
+#: modules/tools/roughness.c:387 modules/volume/volume_linestat.c:157
 msgid "Kurtosis"
 msgstr ""
 
@@ -7966,7 +8240,7 @@ msgid "Generates columnar surfaces by a simple growth algorithm."
 msgstr ""
 
 #: modules/process/col_synth.c:208
-msgid "/S_ynthetic/_Columnar..."
+msgid "/S_ynthetic/_Deposition/_Columnar..."
 msgstr ""
 
 #: modules/process/col_synth.c:212
@@ -7989,7 +8263,7 @@ msgstr ""
 msgid "Inclination"
 msgstr ""
 
-#: modules/process/col_synth.c:509 modules/process/crosscor.c:1063
+#: modules/process/col_synth.c:509 modules/process/crosscor.c:1036
 msgid "Direction"
 msgstr ""
 
@@ -7997,15 +8271,15 @@ msgstr ""
 msgid "Relaxation type:"
 msgstr ""
 
-#: modules/process/col_synth.c:528
+#: modules/process/col_synth.c:529
 msgid "_Melting:"
 msgstr ""
 
-#: modules/process/col_synth.c:612
+#: modules/process/col_synth.c:613
 msgid "Weak"
 msgstr ""
 
-#: modules/process/col_synth.c:613
+#: modules/process/col_synth.c:614
 msgid "Strong"
 msgstr ""
 
@@ -8037,8 +8311,8 @@ msgstr ""
 msgid "Convolution Filter"
 msgstr ""
 
-#: modules/process/convolution_filter.c:269 modules/tools/filter.c:170
-#: modules/tools/filter.c:274
+#: modules/process/convolution_filter.c:269 modules/tools/filter.c:171
+#: modules/tools/filter.c:275
 msgid "Filter"
 msgstr ""
 
@@ -8066,107 +8340,115 @@ msgstr ""
 msgid "VSym"
 msgstr ""
 
-#: modules/process/correct_affine.c:231
+#: modules/process/correct_affine.c:220
 msgid ""
 "Corrects affine distortion of images by matching image Bravais lattice to "
 "the true one."
 msgstr ""
 
-#: modules/process/correct_affine.c:246
+#: modules/process/correct_affine.c:235
 msgid "/_Distortion/_Affine..."
 msgstr ""
 
-#: modules/process/correct_affine.c:250
+#: modules/process/correct_affine.c:239
 msgid "Correct affine distortion"
 msgstr ""
 
-#: modules/process/correct_affine.c:298
+#: modules/process/correct_affine.c:309 modules/process/correct_affine.c:634
+msgid "Corrected"
+msgstr ""
+
+#: modules/process/correct_affine.c:343
 msgid "Affine Correction"
 msgstr ""
 
-#: modules/process/correct_affine.c:351 modules/process/fft_filter_2d.c:530
+#: modules/process/correct_affine.c:349 modules/process/measure_lattice.c:249
+msgid "_Refine"
+msgstr ""
+
+#: modules/process/correct_affine.c:399 modules/process/fft_filter_2d.c:530
 msgid "Preview Options"
 msgstr ""
 
-#: modules/process/correct_affine.c:356 modules/process/fft_filter_2d.c:535
-#: modules/process/measure_lattice.c:321
+#: modules/process/correct_affine.c:404 modules/process/fft_filter_2d.c:535
+#: modules/process/measure_lattice.c:311
 msgid "Display:"
 msgstr ""
 
-#: modules/process/correct_affine.c:364 modules/process/measure_lattice.c:329
+#: modules/process/correct_affine.c:412 modules/process/measure_lattice.c:319
 #: modules/tools/grainremover.c:109
 msgid "_Data"
 msgstr ""
 
-#: modules/process/correct_affine.c:365
+#: modules/process/correct_affine.c:413
 msgid "2D _ACF"
 msgstr ""
 
-#: modules/process/correct_affine.c:366 modules/process/drift.c:365
+#: modules/process/correct_affine.c:414 modules/process/drift.c:364
 msgid "Correc_ted data"
 msgstr ""
 
-#: modules/process/correct_affine.c:377
+#: modules/process/correct_affine.c:425
 msgid "ACF zoom:"
 msgstr ""
 
-#: modules/process/correct_affine.c:394 modules/process/measure_lattice.c:372
+#: modules/process/correct_affine.c:442 modules/process/measure_lattice.c:346
+msgid "Interpolate _horizontal ACF"
+msgstr ""
+
+#: modules/process/correct_affine.c:452 modules/process/measure_lattice.c:372
 msgid "Lattice Vectors"
 msgstr ""
 
 #. TRANSLATORS: Correct is an adjective here.
-#: modules/process/correct_affine.c:419
+#: modules/process/correct_affine.c:469
 msgid "Correct Lattice"
 msgstr ""
 
-#: modules/process/correct_affine.c:423
+#: modules/process/correct_affine.c:473
 msgid "_Lattice type:"
 msgstr ""
 
-#: modules/process/correct_affine.c:430
+#: modules/process/correct_affine.c:480
 msgid "User defined"
 msgstr ""
 
-#: modules/process/correct_affine.c:445
+#: modules/process/correct_affine.c:495
 msgid "_Different lengths"
 msgstr ""
 
-#: modules/process/correct_affine.c:474
+#: modules/process/correct_affine.c:524
 msgid "Image for _ACF:"
 msgstr ""
 
-#: modules/process/correct_affine.c:501
+#: modules/process/correct_affine.c:551
 msgid "_Scaling:"
 msgstr ""
 
-#: modules/process/correct_affine.c:508
+#: modules/process/correct_affine.c:558
 msgid "Exactly as specified"
 msgstr ""
 
-#: modules/process/correct_affine.c:509
+#: modules/process/correct_affine.c:560
 msgid "Preserve area"
 msgstr ""
 
-#: modules/process/correct_affine.c:510
+#: modules/process/correct_affine.c:562
 msgid "Preserve X scale"
 msgstr ""
 
-#: modules/process/correct_affine.c:561
-msgid "Corrected"
+#: modules/process/correct_affine.c:571 modules/process/drift.c:379
+msgid "_Apply to all compatible images"
 msgstr ""
 
-#: modules/process/correct_affine.c:617 modules/process/measure_lattice.c:489
+#: modules/process/correct_affine.c:693 modules/process/measure_lattice.c:482
 msgid "length"
 msgstr ""
 
-#: modules/process/correct_affine.c:624 modules/process/measure_lattice.c:496
+#: modules/process/correct_affine.c:700 modules/process/measure_lattice.c:489
 msgid "angle"
 msgstr ""
 
-#: modules/process/correct_affine.c:717
-msgid "Re_fine"
-msgstr ""
-
 #: modules/process/crosscor.c:157
 msgid "Calculates cross-correlation of two data fields."
 msgstr ""
@@ -8191,196 +8473,198 @@ msgstr ""
 msgid "Search size"
 msgstr ""
 
-#: modules/process/crosscor.c:272
-msgid "Global offset of 2nd channel"
+#: modules/process/crosscor.c:267
+msgid "_Guess"
 msgstr ""
 
-#: modules/process/crosscor.c:277
-msgid "_Guess"
+#: modules/process/crosscor.c:268
+msgid "Global offset of 2nd channel"
 msgstr ""
 
-#: modules/process/crosscor.c:311
+#: modules/process/crosscor.c:292
 msgid "Window size"
 msgstr ""
 
-#: modules/process/crosscor.c:319
+#: modules/process/crosscor.c:300
 msgid "W_idth:"
 msgstr ""
 
-#: modules/process/crosscor.c:329
+#: modules/process/crosscor.c:308
 msgid "Hei_ght:"
 msgstr ""
 
-#: modules/process/crosscor.c:342 modules/process/fft.c:405
+#: modules/process/crosscor.c:319 modules/process/fft.c:403
 #: modules/process/psdf_logphi.c:268
 msgid "_Windowing type:"
 msgstr ""
 
-#: modules/process/crosscor.c:350
+#: modules/process/crosscor.c:327
 msgid "All"
 msgstr ""
 
-#: modules/process/crosscor.c:351
+#: modules/process/crosscor.c:328
 msgid "Absolute"
 msgstr ""
 
-#: modules/process/crosscor.c:352
+#: modules/process/crosscor.c:329
 msgid "X Distance"
 msgstr ""
 
-#: modules/process/crosscor.c:353
+#: modules/process/crosscor.c:330
 msgid "Y Distance"
 msgstr ""
 
-#: modules/process/crosscor.c:355 modules/process/crosscor.c:1077
+#: modules/process/crosscor.c:332 modules/process/crosscor.c:1050
 msgid "Score"
 msgstr ""
 
-#: modules/process/crosscor.c:357 modules/process/fft.c:395
-#: modules/process/fit-shape.c:688 modules/process/maskcor.c:176
+#: modules/process/crosscor.c:334 modules/process/fft.c:393
+#: modules/process/fit-shape.c:699 modules/process/maskcor.c:177
+#: modules/process/mfm_current.c:455 modules/process/mfm_field.c:373
+#: modules/process/mfm_parallel.c:466
 msgid "Output _type:"
 msgstr ""
 
-#: modules/process/crosscor.c:363
+#: modules/process/crosscor.c:340
 msgid "Add _low score results mask"
 msgstr ""
 
-#: modules/process/crosscor.c:374 modules/process/grain_wshed.c:223
-#: modules/process/maskcor.c:188
+#: modules/process/crosscor.c:351 modules/process/grain_wshed.c:225
+#: modules/process/maskcor.c:191
 msgid "T_hreshold:"
 msgstr ""
 
-#: modules/process/crosscor.c:381
+#: modules/process/crosscor.c:359
 msgid "Multichannel cross-corelation"
 msgstr ""
 
-#: modules/process/crosscor.c:400
+#: modules/process/crosscor.c:378
 msgid "Second _source data:"
 msgstr ""
 
-#: modules/process/crosscor.c:417
+#: modules/process/crosscor.c:394
 msgid "Correlate with:"
 msgstr ""
 
-#: modules/process/crosscor.c:424
+#: modules/process/crosscor.c:402
 msgid "Postprocess:"
 msgstr ""
 
-#: modules/process/crosscor.c:431
-msgid "Apply Ga_ussian filter of width: "
+#: modules/process/crosscor.c:411
+msgid "Apply Ga_ussian filter of width:"
 msgstr ""
 
-#: modules/process/crosscor.c:451
+#: modules/process/crosscor.c:424
 msgid "Extend results to borders"
 msgstr ""
 
-#: modules/process/crosscor.c:461
+#: modules/process/crosscor.c:433
 msgid "Create corrected data from 2nd channel"
 msgstr ""
 
-#: modules/process/crosscor.c:860
+#: modules/process/crosscor.c:833
 msgid "Correlating first set..."
 msgstr ""
 
-#: modules/process/crosscor.c:892
+#: modules/process/crosscor.c:865
 msgid "Correlating second set..."
 msgstr ""
 
-#: modules/process/crosscor.c:999
+#: modules/process/crosscor.c:972
 msgid "Corrected 2nd channel"
 msgstr ""
 
-#: modules/process/crosscor.c:1023
+#: modules/process/crosscor.c:996
 msgid "X difference"
 msgstr ""
 
-#: modules/process/crosscor.c:1037
+#: modules/process/crosscor.c:1010
 msgid "Y difference"
 msgstr ""
 
-#: modules/process/crosscor.c:1050
+#: modules/process/crosscor.c:1023
 msgid "Absolute difference"
 msgstr ""
 
-#: modules/process/curvature.c:131
+#: modules/process/curvature.c:130
 msgid "Center value"
 msgstr ""
 
-#: modules/process/curvature.c:132
+#: modules/process/curvature.c:131
 msgid "Curvature radius 1"
 msgstr ""
 
-#: modules/process/curvature.c:133
+#: modules/process/curvature.c:132
 msgid "Curvature radius 2"
 msgstr ""
 
-#: modules/process/curvature.c:134
+#: modules/process/curvature.c:133
 msgid "Direction 1"
 msgstr ""
 
-#: modules/process/curvature.c:135
+#: modules/process/curvature.c:134
 msgid "Direction 2"
 msgstr ""
 
-#: modules/process/curvature.c:163
+#: modules/process/curvature.c:162
 msgid "Calculates overall curvature."
 msgstr ""
 
-#: modules/process/curvature.c:177
+#: modules/process/curvature.c:176
 msgid "/_Level/_Curvature..."
 msgstr ""
 
-#: modules/process/curvature.c:181
+#: modules/process/curvature.c:180
 msgid "Calculate overall curvature"
 msgstr ""
 
-#: modules/process/curvature.c:211 modules/process/facet-level.c:118
+#: modules/process/curvature.c:210 modules/process/facet-level.c:118
 #: modules/process/semsim.c:165
 #, c-format
 msgid "%s: Lateral dimensions and value must be the same physical quantity."
 msgstr ""
 
-#: modules/process/curvature.c:445
+#: modules/process/curvature.c:447
 msgid "Curvature Sections"
 msgstr ""
 
-#: modules/process/curvature.c:653
+#: modules/process/curvature.c:655
 msgid "Output Type"
 msgstr ""
 
-#: modules/process/curvature.c:660
+#: modules/process/curvature.c:662
 msgid "_Set selection"
 msgstr ""
 
-#: modules/process/curvature.c:670
+#: modules/process/curvature.c:672
 msgid "_Plot graph"
 msgstr ""
 
-#: modules/process/curvature.c:685 modules/process/drift.c:337
-#: modules/process/fft_profile.c:310 modules/process/fractal.c:328
-#: modules/process/grain_cross.c:253 modules/process/linematch.c:885
-#: modules/process/slope_dist.c:349 modules/tools/linestats.c:418
-#: modules/tools/profile.c:573 modules/tools/roughness.c:872
-#: modules/tools/sfunctions.c:486 modules/tools/spectro.c:382
-#: modules/volume/volume_slice.c:398
-msgid "Target _graph:"
+#: modules/process/curvature.c:684 modules/process/drift.c:340
+#: modules/process/fft_profile.c:300 modules/process/fractal.c:308
+#: modules/process/grain_cross.c:260 modules/process/linematch.c:855
+#: modules/process/slope_dist.c:347 modules/tools/linestats.c:424
+#: modules/tools/profile.c:559 modules/tools/roughness.c:886
+#: modules/tools/sfunctions.c:488 modules/tools/spectro.c:391
+#: modules/volume/volume_slice.c:408
+msgid "New graph"
 msgstr ""
 
-#: modules/process/curvature.c:691 modules/process/drift.c:343
-#: modules/process/fft_profile.c:316 modules/process/fractal.c:334
-#: modules/process/grain_cross.c:259 modules/process/linematch.c:892
-#: modules/process/slope_dist.c:355 modules/tools/linestats.c:424
-#: modules/tools/profile.c:579 modules/tools/roughness.c:878
-#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:388
-#: modules/volume/volume_slice.c:406
-msgid "New graph"
+#: modules/process/curvature.c:689 modules/process/drift.c:345
+#: modules/process/fft_profile.c:306 modules/process/fractal.c:313
+#: modules/process/grain_cross.c:254 modules/process/linematch.c:860
+#: modules/process/slope_dist.c:352 modules/tools/linestats.c:418
+#: modules/tools/profile.c:563 modules/tools/roughness.c:890
+#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:385
+#: modules/volume/volume_slice.c:400
+msgid "Target _graph:"
 msgstr ""
 
-#: modules/process/curvature.c:951
+#: modules/process/curvature.c:949
 msgid "Axes are outside the image."
 msgstr ""
 
-#: modules/process/curvature.c:1018
+#: modules/process/curvature.c:1016
 msgid "Save Curvature"
 msgstr ""
 
@@ -8404,8 +8688,8 @@ msgstr ""
 msgid "2D CWT"
 msgstr ""
 
-#: modules/process/cwt.c:158 modules/process/dwt.c:185
-#: modules/process/dwtanisotropy.c:209
+#: modules/process/cwt.c:159 modules/process/dwt.c:185
+#: modules/process/dwtanisotropy.c:212
 msgid "_Wavelet type:"
 msgstr ""
 
@@ -8414,87 +8698,83 @@ msgid "Generates particles using simple dynamical model"
 msgstr ""
 
 #: modules/process/deposit_synth.c:184
-msgid "/S_ynthetic/_Particles..."
+msgid "/S_ynthetic/_Deposition/_Particles..."
 msgstr ""
 
 #: modules/process/deposit_synth.c:188
 msgid "Generate particles using dynamical model"
 msgstr ""
 
-#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:867
+#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:866
 #, c-format
 msgid ""
 "Not all the particles could be deposited (%u),\n"
 "try more revise steps."
 msgstr ""
 
-#: modules/process/deposit_synth.c:347
+#: modules/process/deposit_synth.c:348
 msgid "Particle Generation"
 msgstr ""
 
-#: modules/process/deposit_synth.c:427
+#: modules/process/deposit_synth.c:431
 msgid "Particle r_adius:"
 msgstr ""
 
-#: modules/process/deposit_synth.c:438
+#: modules/process/deposit_synth.c:443
 msgid "Distribution _width:"
 msgstr ""
 
-#: modules/process/deposit_synth.c:449
-msgid "Surface _coverage:"
-msgstr ""
-
-#: modules/process/deposit_synth.c:458
+#: modules/process/deposit_synth.c:462
 msgid "_Relax steps:"
 msgstr ""
 
-#: modules/process/deposit_synth.c:659 modules/process/synth.h:548
+#: modules/process/deposit_synth.c:660 modules/process/synth.h:577
 msgid "R_andom seed:"
 msgstr ""
 
-#: modules/process/deposit_synth.c:665 modules/process/synth.h:554
+#: modules/process/deposit_synth.c:666 modules/process/synth.h:583
 msgid "seed|_New"
 msgstr ""
 
-#: modules/process/deposit_synth.c:676
+#: modules/process/deposit_synth.c:677
 msgid "Randomize"
 msgstr ""
 
-#: modules/process/deposit_synth.c:860 modules/process/domain_synth.c:919
+#: modules/process/deposit_synth.c:859 modules/process/domain_synth.c:919
 msgid "Running computation..."
 msgstr ""
 
-#: modules/process/deposit_synth.c:865
+#: modules/process/deposit_synth.c:864
 #, c-format
 msgid "%d particles were deposited"
 msgstr ""
 
-#: modules/process/deposit_synth.c:1093
+#: modules/process/deposit_synth.c:1092
 msgid "Initial particle set..."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1252
+#: modules/process/deposit_synth.c:1251
 msgid "Running revise..."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1380
+#: modules/process/deposit_synth.c:1379
 msgid "Error: too many particles."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1382
+#: modules/process/deposit_synth.c:1381
 msgid "Error: no particles."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1384
+#: modules/process/deposit_synth.c:1383
 msgid "Error: particles too large."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1386
+#: modules/process/deposit_synth.c:1385
 msgid "Error: particles too small."
 msgstr ""
 
 #: modules/process/diff_synth.c:197 modules/tools/linestats.c:173
-#: modules/volume/volume_linestat.c:149
+#: modules/volume/volume_linestat.c:151
 msgid "Variation"
 msgstr ""
 
@@ -8507,7 +8787,7 @@ msgid "Generates surfaces by diffusion limited aggregation."
 msgstr ""
 
 #: modules/process/diff_synth.c:228
-msgid "/S_ynthetic/_Diffusion..."
+msgid "/S_ynthetic/_Deposition/_Diffusion..."
 msgstr ""
 
 #: modules/process/diff_synth.c:232
@@ -8522,44 +8802,44 @@ msgstr ""
 msgid "_Flux:"
 msgstr ""
 
-#: modules/process/diff_synth.c:522
+#: modules/process/diff_synth.c:521
 msgid "Probabilities"
 msgstr ""
 
-#: modules/process/diff_synth.c:530
+#: modules/process/diff_synth.c:529
 msgid "_Sticking:"
 msgstr ""
 
-#: modules/process/diff_synth.c:539
+#: modules/process/diff_synth.c:538
 msgid "_Activation:"
 msgstr ""
 
-#: modules/process/diff_synth.c:548
+#: modules/process/diff_synth.c:547
 msgid "Passing Sch_woebel:"
 msgstr ""
 
-#: modules/process/dimensions.h:457
+#: modules/process/dimensions.h:439
 msgid "S_quare image"
 msgstr ""
 
-#: modules/process/dimensions.h:489
+#: modules/process/dimensions.h:473
 msgid "_Dimension units:"
 msgstr ""
 
-#: modules/process/dimensions.h:502
-msgid "Current Channel"
+#: modules/process/dimensions.h:488
+msgid "Current Image"
 msgstr ""
 
-#: modules/process/dimensions.h:506
-msgid "_Take Dimensions from Current Channel"
+#: modules/process/dimensions.h:492
+msgid "_Take Dimensions from Current Image"
 msgstr ""
 
-#: modules/process/dimensions.h:514
-msgid "_Replace the current channel"
+#: modules/process/dimensions.h:501
+msgid "_Replace the current image"
 msgstr ""
 
-#: modules/process/dimensions.h:523
-msgid "_Start from the current channel"
+#: modules/process/dimensions.h:510
+msgid "_Start from the current image"
 msgstr ""
 
 #: modules/process/domain_synth.c:158
@@ -8619,13 +8899,13 @@ msgid "_Monte Carlo time step:"
 msgstr ""
 
 #: modules/process/domain_synth.c:504 modules/process/fft_filter_2d.c:586
-#: modules/volume/volume_slice.c:364
+#: modules/volume/volume_slice.c:366
 msgid "Output Options"
 msgstr ""
 
 #: modules/process/domain_synth.c:523 modules/process/fft_filter_2d.c:591
-#: modules/process/mask_edt.c:377 modules/process/slope_dist.c:323
-#: modules/volume/volume_linestat.c:432 modules/volume/volume_slice.c:384
+#: modules/process/mask_edt.c:211 modules/process/slope_dist.c:323
+#: modules/volume/volume_linestat.c:437 modules/volume/volume_slice.c:386
 msgid "Output type:"
 msgstr ""
 
@@ -8653,57 +8933,49 @@ msgstr ""
 msgid "rows"
 msgstr ""
 
-#: modules/process/drift.c:304
+#: modules/process/drift.c:305
 msgid "Correct _data"
 msgstr ""
 
-#: modules/process/drift.c:314
+#: modules/process/drift.c:315
 msgid "_Exclude linear skew"
 msgstr ""
 
-#: modules/process/drift.c:324
+#: modules/process/drift.c:325
 msgid "Plot drift _graph"
 msgstr ""
 
-#: modules/process/drift.c:356 modules/process/fit-shape.c:693
-#: modules/process/neural.c:548 modules/process/polydistort.c:275
+#: modules/process/drift.c:355 modules/process/fit-shape.c:705
+#: modules/process/neural.c:552 modules/process/polydistort.c:278
 msgid "Preview:"
 msgstr ""
 
-#: modules/process/drift.c:366
+#: modules/process/drift.c:365
 msgid "Drift _lines"
 msgstr ""
 
-#: modules/process/drift.c:374 modules/process/facet_analysis.c:407
-#: modules/process/grain_edge.c:285 modules/process/grain_filter.c:357
-#: modules/process/grain_mark.c:367 modules/process/grain_wshed.c:267
-#: modules/process/mark_disconn.c:310 modules/process/scars.c:381
+#: modules/process/drift.c:373 modules/process/facet_analysis.c:390
+#: modules/process/grain_edge.c:272 modules/process/grain_filter.c:356
+#: modules/process/grain_mark.c:341 modules/process/grain_wshed.c:271
+#: modules/process/mark_disconn.c:298 modules/process/scars.c:405
 #: modules/process/wpour_mark.c:369
 msgid "_Mask color:"
 msgstr ""
 
-#: modules/process/drift.c:379
-msgid "Distribute"
-msgstr ""
-
-#: modules/process/drift.c:388
-msgid "Replace"
-msgstr ""
-
-#: modules/process/drift.c:569
+#: modules/process/drift.c:570
 msgid "Drift-corrected"
 msgstr ""
 
-#: modules/process/drift.c:613
+#: modules/process/drift.c:614
 msgid "Drift"
 msgstr ""
 
-#: modules/process/drift.c:614 modules/xyz/xyz_drift.c:392
+#: modules/process/drift.c:615 modules/xyz/xyz_drift.c:392
 #: modules/xyz/xyz_drift.c:411 modules/xyz/xyz_drift.c:430
 msgid "drift"
 msgstr ""
 
-#: modules/process/drift.c:620 modules/xyz/xyz_drift.c:402
+#: modules/process/drift.c:621 modules/xyz/xyz_drift.c:402
 msgid "x-axis drift"
 msgstr ""
 
@@ -8759,11 +9031,11 @@ msgstr ""
 msgid "2D DWT Anisotropy"
 msgstr ""
 
-#: modules/process/dwtanisotropy.c:214
+#: modules/process/dwtanisotropy.c:218
 msgid "X/Y ratio threshold:"
 msgstr ""
 
-#: modules/process/dwtanisotropy.c:222
+#: modules/process/dwtanisotropy.c:226
 msgid "Low level exclude limit:"
 msgstr ""
 
@@ -8889,7 +9161,7 @@ msgstr ""
 msgid "_Gaussian FWHM:"
 msgstr ""
 
-#: modules/process/edge.c:681 modules/process/mark_disconn.c:271
+#: modules/process/edge.c:681 modules/process/mark_disconn.c:272
 msgid "_Threshold:"
 msgstr ""
 
@@ -8953,11 +9225,11 @@ msgstr ""
 msgid "Entropy deficit:"
 msgstr ""
 
-#: modules/process/entropy.c:567
+#: modules/process/entropy.c:568
 msgid "Entropy at scales"
 msgstr ""
 
-#: modules/process/entropy.c:586
+#: modules/process/entropy.c:587
 msgid "Best estimate"
 msgstr ""
 
@@ -9005,23 +9277,23 @@ msgstr ""
 msgid "Extend _symetrically"
 msgstr ""
 
-#: modules/process/extend.c:268 modules/process/polydistort.c:256
-#: modules/xyz/xyz_raster.c:658
+#: modules/process/extend.c:268 modules/process/polydistort.c:259
+#: modules/xyz/xyz_raster.c:627
 msgid "exterior|Border"
 msgstr ""
 
-#: modules/process/extend.c:270 modules/process/polydistort.c:258
-#: modules/xyz/xyz_raster.c:660
+#: modules/process/extend.c:270 modules/process/polydistort.c:261
+#: modules/xyz/xyz_raster.c:629
 msgid "exterior|Mirror"
 msgstr ""
 
-#: modules/process/extend.c:272 modules/process/polydistort.c:260
-#: modules/xyz/xyz_raster.c:662
+#: modules/process/extend.c:272 modules/process/polydistort.c:263
+#: modules/xyz/xyz_raster.c:631
 msgid "exterior|Periodic"
 msgstr ""
 
-#: modules/process/extend.c:275 modules/process/polydistort.c:263
-#: modules/xyz/xyz_raster.c:650
+#: modules/process/extend.c:275 modules/process/polydistort.c:266
+#: modules/xyz/xyz_raster.c:619
 msgid "_Exterior type:"
 msgstr ""
 
@@ -9053,11 +9325,11 @@ msgstr ""
 msgid "There is no path selection."
 msgstr ""
 
-#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:390
+#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:383
 msgid "X position"
 msgstr ""
 
-#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:397
+#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:389
 msgid "Y position"
 msgstr ""
 
@@ -9070,7 +9342,7 @@ msgid "Y tangent"
 msgstr ""
 
 #: modules/process/extract_path.c:392 modules/process/extract_path.c:404
-#: modules/process/pat_synth.c:1432 modules/tools/distance.c:146
+#: modules/process/pat_synth.c:1433 modules/tools/distance.c:146
 msgid "Distance"
 msgstr ""
 
@@ -9112,47 +9384,36 @@ msgstr ""
 msgid "Mark areas by 2D slope"
 msgstr ""
 
-#: modules/process/facet_analysis.c:266
+#: modules/process/facet_analysis.c:270
 msgid "Mark Facets"
 msgstr ""
 
-#: modules/process/facet_analysis.c:269
+#: modules/process/facet_analysis.c:273
 msgid "verb|_Mark"
 msgstr ""
 
 #. TRANSLATORS: The direction or line orthogonal to something.
-#: modules/process/facet_analysis.c:325
+#: modules/process/facet_analysis.c:329
 msgid "Normal"
 msgstr ""
 
-#: modules/process/facet_analysis.c:333
+#: modules/process/facet_analysis.c:337
 msgid "_Find Maximum"
 msgstr ""
 
-#: modules/process/facet_analysis.c:341
+#: modules/process/facet_analysis.c:345
 msgid "Mean Normal"
 msgstr ""
 
-#: modules/process/facet_analysis.c:350
+#: modules/process/facet_analysis.c:362
 msgid "Facet plane size:"
 msgstr ""
 
-#: modules/process/facet_analysis.c:375
+#: modules/process/facet_analysis.c:370
 msgid "_Tolerance:"
 msgstr ""
 
-#: modules/process/facet_analysis.c:384 modules/process/grain_edge.c:262
-#: modules/process/grain_mark.c:344 modules/process/mark_disconn.c:286
-msgid "Com_bine with existing mask"
-msgstr ""
-
-#: modules/process/facet_analysis.c:398 modules/process/grain_edge.c:276
-#: modules/process/grain_mark.c:358 modules/process/mark_disconn.c:301
-#: modules/process/mark_with.c:230 modules/process/mask_morph.c:210
-msgid "Operation:"
-msgstr ""
-
-#: modules/process/facet_analysis.c:415
+#: modules/process/facet_analysis.c:398
 msgid ""
 "Warning: Lateral and value units differ. Angles are not physically "
 "meaningful."
@@ -9182,8 +9443,8 @@ msgstr ""
 msgid "_Stationarity scale:"
 msgstr ""
 
-#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:509
-#: modules/process/noise_synth.c:409
+#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:507
+#: modules/process/noise_synth.c:407
 msgid "_Distribution:"
 msgstr ""
 
@@ -9191,17 +9452,17 @@ msgstr ""
 msgid "Po_wer:"
 msgstr ""
 
-#: modules/process/fbm_synth.c:408 modules/process/fft_synth.c:414
-#: modules/process/lno_synth.c:533 modules/process/noise_synth.c:433
+#: modules/process/fbm_synth.c:407 modules/process/fft_synth.c:414
+#: modules/process/lno_synth.c:531 modules/process/noise_synth.c:431
 msgid "_RMS:"
 msgstr ""
 
-#: modules/process/fbm_synth.c:477 modules/process/lno_synth.c:251
-#: modules/process/noise_synth.c:178
+#: modules/process/fbm_synth.c:476 modules/process/lno_synth.c:249
+#: modules/process/noise_synth.c:176
 msgid "distribution|Exponential"
 msgstr ""
 
-#: modules/process/fbm_synth.c:478
+#: modules/process/fbm_synth.c:477
 msgid "distribution|Power"
 msgstr ""
 
@@ -9253,7 +9514,7 @@ msgstr ""
 msgid "Modulus"
 msgstr ""
 
-#: modules/process/fft.c:327 modules/process/wave_synth.c:583
+#: modules/process/fft.c:327 modules/process/wave_synth.c:618
 msgid "Phase"
 msgstr ""
 
@@ -9269,63 +9530,63 @@ msgstr ""
 msgid "I_maginary part:"
 msgstr ""
 
-#: modules/process/fft.c:382
+#: modules/process/fft.c:380
 msgid "_Inverse transform"
 msgstr ""
 
-#: modules/process/fft.c:411
+#: modules/process/fft.c:409
 msgid "Subtract mean _value beforehand"
 msgstr ""
 
-#: modules/process/fft.c:422
+#: modules/process/fft.c:420
 msgid "_Preserve RMS"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:117
+#: modules/process/fft_filter_1d.c:118
 msgid "FFT filtering"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:131
+#: modules/process/fft_filter_1d.c:132
 msgid "/_Correct Data/1D _FFT Filtering..."
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:135
+#: modules/process/fft_filter_1d.c:136
 msgid "1D FFT Filtering"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:165 modules/process/wpour_mark.c:391
+#: modules/process/fft_filter_1d.c:166 modules/process/wpour_mark.c:391
 msgid "Marked"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:166
+#: modules/process/fft_filter_1d.c:167
 msgid "Unmarked"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:169
+#: modules/process/fft_filter_1d.c:170
 msgid "Null"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:170
+#: modules/process/fft_filter_1d.c:171
 msgid "Suppress"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:180
+#: modules/process/fft_filter_1d.c:181
 msgid "1D FFT filter"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:269 modules/process/linematch.c:861
+#: modules/process/fft_filter_1d.c:271 modules/process/linematch.c:828
 msgid "_Direction:"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:277
+#: modules/process/fft_filter_1d.c:279
 msgid "_Suppress type:"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:285
+#: modules/process/fft_filter_1d.c:287
 msgid "_Filter type:"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:513
+#: modules/process/fft_filter_1d.c:515
 msgid "1D FFT Filtered Data"
 msgstr ""
 
@@ -9345,9 +9606,10 @@ msgstr ""
 msgid "Filtered Data"
 msgstr ""
 
-#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:594
-#: modules/process/fit-shape.c:643 modules/process/fit-shape.c:658
-#: modules/process/fit-shape.c:662 modules/process/neural.c:560
+#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:604
+#: modules/process/fit-shape.c:653 modules/process/fit-shape.c:668
+#: modules/process/fit-shape.c:672 modules/process/neural.c:564
+#: modules/process/psf.c:232
 msgid "Difference"
 msgstr ""
 
@@ -9403,7 +9665,7 @@ msgstr ""
 msgid "_Undo"
 msgstr ""
 
-#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:556
+#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:562
 msgid "_Fill"
 msgstr ""
 
@@ -9411,7 +9673,7 @@ msgstr ""
 msgid "_Snap to origin"
 msgstr ""
 
-#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:339
+#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:329
 msgid "Zoom:"
 msgstr ""
 
@@ -9447,37 +9709,37 @@ msgstr ""
 msgid "Force shapes to center around the origin"
 msgstr ""
 
-#: modules/process/fft_profile.c:125
+#: modules/process/fft_profile.c:124
 msgid ""
 "Reads radial sections of two-dimensional power spectrum density function."
 msgstr ""
 
-#: modules/process/fft_profile.c:140
+#: modules/process/fft_profile.c:139
 msgid "/_Statistics/_PSDF Section..."
 msgstr ""
 
-#: modules/process/fft_profile.c:144
+#: modules/process/fft_profile.c:143
 msgid "Read radial PSDF sections"
 msgstr ""
 
-#: modules/process/fft_profile.c:190
+#: modules/process/fft_profile.c:189
 msgid "Radial PSDF Section"
 msgstr ""
 
-#: modules/process/fft_profile.c:237
+#: modules/process/fft_profile.c:236
 msgid "PSDF Section"
 msgstr ""
 
-#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:336
-#: modules/tools/profile.c:517 modules/tools/sfunctions.c:443
-msgid "_Fix res.:"
+#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:338
+#: modules/tools/profile.c:514 modules/tools/sfunctions.c:454
+msgid "_Fixed resolution:"
 msgstr ""
 
-#: modules/process/fft_profile.c:279
+#: modules/process/fft_profile.c:278
 msgid "_Separate curves"
 msgstr ""
 
-#: modules/process/fft_profile.c:496
+#: modules/process/fft_profile.c:483
 #, c-format
 msgid "PSDF %.0f°"
 msgstr ""
@@ -9498,11 +9760,15 @@ msgstr ""
 msgid "Spectral Synthesis"
 msgstr ""
 
-#: modules/process/fft_synth.c:429
+#: modules/process/fft_synth.c:430
 msgid "M_inimum frequency:"
 msgstr ""
 
-#: modules/process/fft_synth.c:449
+#: modules/process/fft_synth.c:430 modules/process/fft_synth.c:450
+msgid "px<sup>-1</sup>"
+msgstr ""
+
+#: modules/process/fft_synth.c:450
 msgid "Ma_ximum frequency:"
 msgstr ""
 
@@ -9522,85 +9788,154 @@ msgstr ""
 msgid "Enable _power multiplier"
 msgstr ""
 
-#: modules/process/fit-shape.c:270
+#: modules/process/fibre_synth.c:256
+msgid "Semi-circle"
+msgstr ""
+
+#: modules/process/fibre_synth.c:257
+msgid "Triangle"
+msgstr ""
+
+#: modules/process/fibre_synth.c:258
+msgid "Rectangle"
+msgstr ""
+
+#: modules/process/fibre_synth.c:260
+msgid "Quadratic spline"
+msgstr ""
+
+#: modules/process/fibre_synth.c:266
+msgid "Generates surfaces composed from randomly placed fibers."
+msgstr ""
+
+#: modules/process/fibre_synth.c:280
+msgid "/S_ynthetic/_Deposition/_Fibers..."
+msgstr ""
+
+#: modules/process/fibre_synth.c:284
+msgid "Generate surface of randomly placed fibers"
+msgstr ""
+
+#: modules/process/fibre_synth.c:420
+msgid "Random Fibers"
+msgstr ""
+
+#: modules/process/fibre_synth.c:494 modules/process/obj_synth.c:510
+msgid "_Shape:"
+msgstr ""
+
+#: modules/process/fibre_synth.c:513 modules/process/obj_synth.c:529
+msgid "obj."
+msgstr ""
+
+#: modules/process/fibre_synth.c:553
+msgid "Scales _with width"
+msgstr ""
+
+#: modules/process/fibre_synth.c:591 modules/process/synth.h:485
+msgid "Deformation"
+msgstr ""
+
+#: modules/process/fibre_synth.c:600 modules/process/lno_synth.c:852
+#: modules/process/lno_synth.c:1222 modules/process/mask_noisify.c:177
+msgid "Densi_ty:"
+msgstr ""
+
+#: modules/process/fibre_synth.c:607
+msgid "_Lateral:"
+msgstr ""
+
+#: modules/process/fibre_synth.c:614
+msgid "Le_ngthwise:"
+msgstr ""
+
+#: modules/process/fibre_synth.c:819
+msgid "Along fiber:"
+msgstr ""
+
+#: modules/process/fibre_synth.c:1180
+msgid "Generating fibers..."
+msgstr ""
+
+#: modules/process/fit-shape.c:264
 msgid "Fits predefined geometrical shapes to data."
 msgstr ""
 
-#: modules/process/fit-shape.c:284
+#: modules/process/fit-shape.c:278
 msgid "/_Level/_Fit Shape..."
 msgstr ""
 
-#: modules/process/fit-shape.c:288 modules/process/fit-shape.c:295
+#: modules/process/fit-shape.c:282 modules/process/fit-shape.c:289
 msgid "Fit geometrical shapes"
 msgstr ""
 
-#: modules/process/fit-shape.c:291
+#: modules/process/fit-shape.c:285
 msgid "/_Fit Shape..."
 msgstr ""
 
-#: modules/process/fit-shape.c:390
+#: modules/process/fit-shape.c:389
 msgid "Fit Shape"
 msgstr ""
 
-#: modules/process/fit-shape.c:395
+#: modules/process/fit-shape.c:396
 msgid "verb|_Quick Fit"
 msgstr ""
 
-#: modules/process/fit-shape.c:473 modules/process/fit-shape.c:2159
+#: modules/process/fit-shape.c:474 modules/process/fit-shape.c:2141
 msgid "Derived Quantities"
 msgstr ""
 
-#: modules/process/fit-shape.c:478 modules/process/fit-shape.c:2129
+#: modules/process/fit-shape.c:479 modules/process/fit-shape.c:2111
 msgid "Mean square difference:"
 msgstr ""
 
-#: modules/process/fit-shape.c:580 modules/process/fit-shape.c:626
-#: modules/process/fit-shape.c:657 modules/process/fit-shape.c:661
+#: modules/process/fit-shape.c:590 modules/process/fit-shape.c:636
+#: modules/process/fit-shape.c:667 modules/process/fit-shape.c:671
 msgid "Fitted shape"
 msgstr ""
 
-#: modules/process/fit-shape.c:663 modules/process/mark_disconn.c:189
-#: modules/process/scars.c:281
+#: modules/process/fit-shape.c:673 modules/process/mark_disconn.c:189
+#: modules/process/scars.c:299
 msgid "Both"
 msgstr ""
 
-#: modules/process/fit-shape.c:680
+#: modules/process/fit-shape.c:690 modules/process/psf-fit.c:308
 msgid "_Function type:"
 msgstr ""
 
-#: modules/process/fit-shape.c:708
+#: modules/process/fit-shape.c:720
 msgid "Show differences with _adapted color map"
 msgstr ""
 
-#: modules/process/fit-shape.c:720
+#: modules/process/fit-shape.c:732
 msgid "Full fit is _geometric"
 msgstr ""
 
-#: modules/process/fit-shape.c:757
+#: modules/process/fit-shape.c:769
 msgid "Calculate differences for e_xcluded pixels"
 msgstr ""
 
-#: modules/process/fit-shape.c:804
+#: modules/process/fit-shape.c:816
 msgid "_Recalculate Image"
 msgstr ""
 
-#: modules/process/fit-shape.c:811
+#: modules/process/fit-shape.c:823
 msgid "Revert to _Previous Values"
 msgstr ""
 
-#: modules/process/fit-shape.c:1850
+#: modules/process/fit-shape.c:1864
 msgid "Parameter estimation failed"
 msgstr ""
 
-#: modules/process/fit-shape.c:1853
+#: modules/process/fit-shape.c:1867
 msgid "Fit failed"
 msgstr ""
 
-#: modules/process/fit-shape.c:1855
+#: modules/process/fit-shape.c:1869
 msgid "Fit was interruped"
 msgstr ""
 
-#: modules/process/fit-shape.c:2115
+#: modules/process/fit-shape.c:2097
 msgid "(fixed)"
 msgstr ""
 
@@ -9620,88 +9955,84 @@ msgstr ""
 msgid "Polynomial leveling..."
 msgstr ""
 
-#: modules/process/fraccor.c:38
+#: modules/process/fraccor.c:39
 msgid "Removes data under mask using fractal interpolation."
 msgstr ""
 
-#: modules/process/fraccor.c:52
+#: modules/process/fraccor.c:53
 msgid "/_Correct Data/_Fractal Correction"
 msgstr ""
 
-#: modules/process/fraccor.c:56
+#: modules/process/fraccor.c:57
 msgid "Interpolate data under mask with fractal interpolation"
 msgstr ""
 
-#: modules/process/fractal.c:134
+#: modules/process/fractal.c:130
 msgid "Partitioning"
 msgstr ""
 
-#: modules/process/fractal.c:135
+#: modules/process/fractal.c:131
 msgid "Cube counting"
 msgstr ""
 
-#: modules/process/fractal.c:136
+#: modules/process/fractal.c:132
 msgid "Triangulation"
 msgstr ""
 
-#: modules/process/fractal.c:137
+#: modules/process/fractal.c:133
 msgid "Power spectrum"
 msgstr ""
 
-#: modules/process/fractal.c:173
+#: modules/process/fractal.c:169
 msgid ""
 "Calculates fractal dimension using several methods (partitioning, box "
 "counting, triangulation, power spectrum)."
 msgstr ""
 
-#: modules/process/fractal.c:188
+#: modules/process/fractal.c:184
 msgid "/_Statistics/_Fractal Dimension..."
 msgstr ""
 
-#: modules/process/fractal.c:192
+#: modules/process/fractal.c:188
 msgid "Calculate fractal dimension"
 msgstr ""
 
-#: modules/process/fractal.c:227
+#: modules/process/fractal.c:223
 msgid "Fractal Dimension"
 msgstr ""
 
-#: modules/process/fractal.c:228
-msgid "Reco_mpute"
+#: modules/process/fractal.c:253
+msgid "_Method:"
 msgstr ""
 
 #: modules/process/fractal.c:269
-msgid "_Method:"
+msgid "Fit Area"
 msgstr ""
 
-#: modules/process/fractal.c:290
-msgid "Fit Area"
+#: modules/process/fractal.c:273 modules/process/fractal.c:545
+#: modules/process/fractal.c:569
+msgid "minimum"
 msgstr ""
 
-#: modules/process/fractal.c:295
+#: modules/process/fractal.c:274
 msgid "From:"
 msgstr ""
 
-#: modules/process/fractal.c:295 modules/process/fractal.c:589
-#: modules/process/fractal.c:613
-msgid "minimum"
+#: modules/process/fractal.c:279 modules/process/fractal.c:546
+#: modules/process/fractal.c:570
+msgid "maximum"
 msgstr ""
 
-#: modules/process/fractal.c:298
+#: modules/process/fractal.c:280
 msgid "To:"
 msgstr ""
 
-#: modules/process/fractal.c:298 modules/process/fractal.c:590
-#: modules/process/fractal.c:614
-msgid "maximum"
-msgstr ""
-
-#: modules/process/fractal.c:308 modules/process/mark_with.c:390
-#: modules/process/neural.c:559
+#: modules/process/fractal.c:287 modules/process/mark_with.c:394
+#: modules/process/neural.c:563
 msgid "Result"
 msgstr ""
 
-#: modules/process/fractal.c:550
+#: modules/process/fractal.c:506
 msgid "Linear fit"
 msgstr ""
 
@@ -9771,11 +10102,11 @@ msgstr ""
 msgid "Grain Correlations"
 msgstr ""
 
-#: modules/process/grain_cross.c:240
+#: modules/process/grain_cross.c:241
 msgid "_Abscissa"
 msgstr ""
 
-#: modules/process/grain_cross.c:244
+#: modules/process/grain_cross.c:245
 msgid "O_rdinate"
 msgstr ""
 
@@ -9803,118 +10134,118 @@ msgstr ""
 msgid "Grain Distributions"
 msgstr ""
 
-#: modules/process/grain_dist.c:553
+#: modules/process/grain_dist.c:547
 msgid "count"
 msgstr ""
 
-#: modules/process/grain_dist.c:617
+#: modules/process/grain_dist.c:611
 msgid "Export Raw Grain Values"
 msgstr ""
 
-#: modules/process/grain_edge.c:100
+#: modules/process/grain_edge.c:99
 msgid "Marks grains by edge detection method."
 msgstr ""
 
-#: modules/process/grain_edge.c:114
+#: modules/process/grain_edge.c:113
 msgid "/_Grains/Mark by _Edge Detection..."
 msgstr ""
 
-#: modules/process/grain_edge.c:118
+#: modules/process/grain_edge.c:117
 msgid "Mark grains with edge detection mechanism"
 msgstr ""
 
-#: modules/process/grain_edge.c:207
+#: modules/process/grain_edge.c:206
 msgid "Mark Grains by Edge Detection"
 msgstr ""
 
-#: modules/process/grain_edge.c:245
+#: modules/process/grain_edge.c:244
 msgid "Threshold"
 msgstr ""
 
-#: modules/process/grain_edge.c:249
+#: modules/process/grain_edge.c:248
 msgid "_Laplacian:"
 msgstr ""
 
-#: modules/process/grain_filter.c:195
+#: modules/process/grain_filter.c:194
 msgid ""
 "Filters grains by their properties, using logical expressions and thresholds."
 msgstr ""
 
-#: modules/process/grain_filter.c:210
+#: modules/process/grain_filter.c:209
 msgid "/_Grains/_Filter..."
 msgstr ""
 
-#: modules/process/grain_filter.c:214
+#: modules/process/grain_filter.c:213
 msgid "Filter grains by their properties"
 msgstr ""
 
-#: modules/process/grain_filter.c:254
+#: modules/process/grain_filter.c:253
 msgid "There are no grains to filter."
 msgstr ""
 
-#: modules/process/grain_filter.c:310
+#: modules/process/grain_filter.c:309
 msgid "Filter Grains"
 msgstr ""
 
-#: modules/process/grain_filter.c:405
+#: modules/process/grain_filter.c:404
 msgid "Set selected as:"
 msgstr ""
 
-#: modules/process/grain_filter.c:420
+#: modules/process/grain_filter.c:419
 msgid "Keep grains satisfying:"
 msgstr ""
 
-#: modules/process/grain_filter.c:434 modules/process/lat_synth.c:733
+#: modules/process/grain_filter.c:440 modules/process/lat_synth.c:733
 msgid "Lower threshold:"
 msgstr ""
 
-#: modules/process/grain_filter.c:469 modules/process/lat_synth.c:740
+#: modules/process/grain_filter.c:467 modules/process/lat_synth.c:740
 msgid "Upper threshold:"
 msgstr ""
 
 #. TRANSLATORS: %c is replaced with quantity label A, B or C.
-#: modules/process/grain_filter.c:645
+#: modules/process/grain_filter.c:628
 #, c-format
 msgid "Condition %c: %s"
 msgstr ""
 
-#: modules/process/grain_mark.c:139
+#: modules/process/grain_mark.c:137
 msgid "Marks grains by thresholding (height, slope, curvature)."
 msgstr ""
 
-#: modules/process/grain_mark.c:153
+#: modules/process/grain_mark.c:151
 msgid "/_Grains/_Mark by Threshold..."
 msgstr ""
 
-#: modules/process/grain_mark.c:157
+#: modules/process/grain_mark.c:155
 msgid "Mark grains by threshold"
 msgstr ""
 
-#: modules/process/grain_mark.c:241
+#: modules/process/grain_mark.c:240
 msgid "Mark Grains by Threshold"
 msgstr ""
 
-#: modules/process/grain_mark.c:281
+#: modules/process/grain_mark.c:280
 msgid "Threshold by"
 msgstr ""
 
-#: modules/process/grain_mark.c:311
+#: modules/process/grain_mark.c:310
 msgid "_Slope:"
 msgstr ""
 
-#: modules/process/grain_mark.c:315
+#: modules/process/grain_mark.c:314
 msgid "_Curvature:"
 msgstr ""
 
-#: modules/process/grain_mark.c:324
-msgid "Criteria combination:"
-msgstr ""
-
-#: modules/process/grain_mark.c:328 modules/process/grain_wshed.c:256
+#: modules/process/grain_mark.c:319 modules/process/grain_wshed.c:260
 #: modules/process/wpour_mark.c:358
 msgid "_Invert height"
 msgstr ""
 
+#: modules/process/grain_mark.c:328
+msgid "Criteria combination:"
+msgstr ""
+
 #: modules/process/grain_stat.c:54
 msgid "Displays overall grain statistics."
 msgstr ""
@@ -9991,433 +10322,442 @@ msgstr ""
 msgid "Total projected boundary length:"
 msgstr ""
 
-#: modules/process/grain_wshed.c:101
+#: modules/process/grain_wshed.c:102
 msgid "Marks grains by watershed algorithm."
 msgstr ""
 
-#: modules/process/grain_wshed.c:115
+#: modules/process/grain_wshed.c:116
 msgid "/_Grains/Mark by _Watershed..."
 msgstr ""
 
-#: modules/process/grain_wshed.c:119
+#: modules/process/grain_wshed.c:120
 msgid "Mark grains by watershed"
 msgstr ""
 
-#: modules/process/grain_wshed.c:161
+#: modules/process/grain_wshed.c:162
 msgid "Mark Grains by Watershed"
 msgstr ""
 
-#: modules/process/grain_wshed.c:199
+#: modules/process/grain_wshed.c:200
 msgid "Grain Location"
 msgstr ""
 
-#: modules/process/grain_wshed.c:214
+#: modules/process/grain_wshed.c:216
 msgid "_Drop size:"
 msgstr ""
 
-#: modules/process/grain_wshed.c:230
+#: modules/process/grain_wshed.c:233
 msgid "Segmentation"
 msgstr ""
 
-#: modules/process/grain_wshed.c:236
+#: modules/process/grain_wshed.c:239
 msgid "Num_ber of steps:"
 msgstr ""
 
-#: modules/process/grain_wshed.c:244
+#: modules/process/grain_wshed.c:248
 msgid "Dr_op size:"
 msgstr ""
 
-#: modules/process/grain_wshed.c:435
+#: modules/process/grain_wshed.c:439
 msgid "Finding minima..."
 msgstr ""
 
-#: modules/process/grain_wshed.c:437
+#: modules/process/grain_wshed.c:441
 msgid "Locating..."
 msgstr ""
 
-#: modules/process/grain_wshed.c:439
+#: modules/process/grain_wshed.c:443
 msgid "Simulating watershed..."
 msgstr ""
 
-#: modules/process/grain_wshed.c:441
+#: modules/process/grain_wshed.c:445
 msgid "Marking boundaries..."
 msgstr ""
 
-#: modules/process/hough.c:74
+#: modules/process/hough.c:76
 msgid "Hough transform."
 msgstr ""
 
-#: modules/process/hough.c:88
+#: modules/process/hough.c:90
 msgid "/_Integral Transforms/_Hough..."
 msgstr ""
 
-#: modules/process/hough.c:92
+#: modules/process/hough.c:94
 msgid "Compute Hough transform"
 msgstr ""
 
-#: modules/process/hough.c:178
+#: modules/process/hough.c:137
+msgid "Hough line"
+msgstr ""
+
+#: modules/process/hough.c:141
+#, c-format
+msgid "Hough circle r=%d"
+msgstr ""
+
+#: modules/process/hough.c:173
 msgid "Hough Transform"
 msgstr ""
 
-#: modules/process/hough.c:201
+#: modules/process/hough.c:195
 msgid "_Transform type:"
 msgstr ""
 
-#: modules/process/hough.c:212
+#: modules/process/hough.c:203
 msgid "_Circle size:"
 msgstr ""
 
-#: modules/process/immerse.c:162
+#: modules/process/immerse.c:163
 msgid "Immerse high resolution detail into overall image."
 msgstr ""
 
-#: modules/process/immerse.c:176
+#: modules/process/immerse.c:177
 msgid "/M_ultidata/_Immerse Detail..."
 msgstr ""
 
-#: modules/process/immerse.c:180
+#: modules/process/immerse.c:181
 msgid "Immerse a detail into image"
 msgstr ""
 
-#: modules/process/immerse.c:222
+#: modules/process/immerse.c:223
 msgid "Immerse Detail"
 msgstr ""
 
-#: modules/process/immerse.c:225
+#: modules/process/immerse.c:226
 msgid "_Locate"
 msgstr ""
 
-#: modules/process/immerse.c:227
+#: modules/process/immerse.c:228
 msgid "Locate detail by full image correlation search"
 msgstr ""
 
-#: modules/process/immerse.c:229
+#: modules/process/immerse.c:230
 msgid "_Improve"
 msgstr ""
 
-#: modules/process/immerse.c:231
+#: modules/process/immerse.c:232
 msgid "Improve detail position by correlation search in neighborhood"
 msgstr ""
 
-#: modules/process/immerse.c:290
+#: modules/process/immerse.c:291
 msgid "_Detail image:"
 msgstr ""
 
-#: modules/process/immerse.c:295
+#: modules/process/immerse.c:296
 msgid "Position:"
 msgstr ""
 
-#: modules/process/immerse.c:308
+#: modules/process/immerse.c:314
 msgid "Result Sampling"
 msgstr ""
 
-#: modules/process/immerse.c:318
+#: modules/process/immerse.c:324
 msgid "_Upsample large image"
 msgstr ""
 
-#: modules/process/immerse.c:320
+#: modules/process/immerse.c:326
 msgid "_Downsample detail"
 msgstr ""
 
-#: modules/process/immerse.c:329
+#: modules/process/immerse.c:335
 msgid "Detail Leveling"
 msgstr ""
 
-#: modules/process/immerse.c:339
+#: modules/process/immerse.c:345
 msgid "levelling|_None"
 msgstr ""
 
-#: modules/process/immerse.c:341
+#: modules/process/immerse.c:347
 msgid "_Mean value"
 msgstr ""
 
-#: modules/process/immerse.c:349
+#: modules/process/immerse.c:355
 msgid "Show _frame"
 msgstr ""
 
-#: modules/process/immerse.c:787
+#: modules/process/immerse.c:793
 msgid "Immersed detail"
 msgstr ""
 
-#: modules/process/indent_analyze.c:261
+#: modules/process/indent_analyze.c:246
 msgid "Do nothing"
 msgstr ""
 
-#: modules/process/indent_analyze.c:262
+#: modules/process/indent_analyze.c:247
 msgid "Plane level"
 msgstr ""
 
-#: modules/process/indent_analyze.c:263
+#: modules/process/indent_analyze.c:248
 msgid "Plane rotate"
 msgstr ""
 
-#: modules/process/indent_analyze.c:267
+#: modules/process/indent_analyze.c:252
 msgid "New"
 msgstr ""
 
-#: modules/process/indent_analyze.c:268
+#: modules/process/indent_analyze.c:253
 msgid "AND"
 msgstr ""
 
-#: modules/process/indent_analyze.c:269
+#: modules/process/indent_analyze.c:254
 msgid "OR"
 msgstr ""
 
-#: modules/process/indent_analyze.c:270
+#: modules/process/indent_analyze.c:255
 msgid "NOT"
 msgstr ""
 
-#: modules/process/indent_analyze.c:271
+#: modules/process/indent_analyze.c:256
 msgid "XOR"
 msgstr ""
 
-#: modules/process/indent_analyze.c:275
+#: modules/process/indent_analyze.c:260
 msgid "Nothing"
 msgstr ""
 
-#: modules/process/indent_analyze.c:276
+#: modules/process/indent_analyze.c:261
 msgid "Above"
 msgstr ""
 
-#: modules/process/indent_analyze.c:277
+#: modules/process/indent_analyze.c:262
 msgid "Below"
 msgstr ""
 
-#: modules/process/indent_analyze.c:278
+#: modules/process/indent_analyze.c:263
 msgid "Plane"
 msgstr ""
 
-#: modules/process/indent_analyze.c:279
+#: modules/process/indent_analyze.c:264
 msgid "Impression"
 msgstr ""
 
-#: modules/process/indent_analyze.c:280
+#: modules/process/indent_analyze.c:265
 msgid "Inner Pile-up"
 msgstr ""
 
-#: modules/process/indent_analyze.c:281
+#: modules/process/indent_analyze.c:266
 msgid "Outer Pile-up"
 msgstr ""
 
-#: modules/process/indent_analyze.c:282
+#: modules/process/indent_analyze.c:267
 msgid "Special points"
 msgstr ""
 
-#: modules/process/indent_analyze.c:283
+#: modules/process/indent_analyze.c:268
 msgid "Faces border"
 msgstr ""
 
-#: modules/process/indent_analyze.c:287
+#: modules/process/indent_analyze.c:272
 msgid "Vickers"
 msgstr ""
 
-#: modules/process/indent_analyze.c:288
+#: modules/process/indent_analyze.c:273
 msgid "Berkovich"
 msgstr ""
 
-#: modules/process/indent_analyze.c:289
+#: modules/process/indent_analyze.c:274
 msgid "Berkovich (modified)"
 msgstr ""
 
-#: modules/process/indent_analyze.c:290
+#: modules/process/indent_analyze.c:275
 msgid "Knoop"
 msgstr ""
 
-#: modules/process/indent_analyze.c:291
+#: modules/process/indent_analyze.c:276
 msgid "Brinell"
 msgstr ""
 
-#: modules/process/indent_analyze.c:292
+#: modules/process/indent_analyze.c:277
 msgid "Cube corner"
 msgstr ""
 
-#: modules/process/indent_analyze.c:293
+#: modules/process/indent_analyze.c:278
 msgid "Rockwell"
 msgstr ""
 
-#: modules/process/indent_analyze.c:303
+#: modules/process/indent_analyze.c:288
 msgid "Analyses nanoindentation structure (volumes, surfaces, ...)."
 msgstr ""
 
-#: modules/process/indent_analyze.c:320
+#: modules/process/indent_analyze.c:302
 msgid "/_Tip and Indentation/_Analyze Imprint..."
 msgstr ""
 
-#: modules/process/indent_analyze.c:439
+#: modules/process/indent_analyze.c:410
 msgid "Marked _areas:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:445
+#: modules/process/indent_analyze.c:419
 msgid "_Indentor type:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:451
+#: modules/process/indent_analyze.c:428
 msgid "_Mask creation type:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:456
+#: modules/process/indent_analyze.c:434
 msgid "Ref. plane _tolerance:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:460
+#: modules/process/indent_analyze.c:438
 msgid "Angle _1 tolerance:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:485
+#: modules/process/indent_analyze.c:456
 msgid "Indent center at"
 msgstr ""
 
-#: modules/process/indent_analyze.c:488
+#: modules/process/indent_analyze.c:460
 msgid "Maximum at"
 msgstr ""
 
-#: modules/process/indent_analyze.c:491
+#: modules/process/indent_analyze.c:464
 msgid "Max-min difference"
 msgstr ""
 
-#: modules/process/indent_analyze.c:497
+#: modules/process/indent_analyze.c:472
 msgid "Expected A<sub>d</sub>:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:505
+#: modules/process/indent_analyze.c:479
 msgid "Expected A<sub>p</sub>:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:549
+#: modules/process/indent_analyze.c:489
 msgid "Volume above-below"
 msgstr ""
 
-#: modules/process/indent_analyze.c:558
+#: modules/process/indent_analyze.c:494
 msgid "Indent. volume"
 msgstr ""
 
-#: modules/process/indent_analyze.c:564
+#: modules/process/indent_analyze.c:502
 msgid "Indent. A<sub>d</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:573
+#: modules/process/indent_analyze.c:509
 msgid "Indent. A<sub>p</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:587
+#: modules/process/indent_analyze.c:517
 msgid "Inner Pile-Up A<sub>d</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:596
+#: modules/process/indent_analyze.c:525
 msgid "Inner Pile-Up A<sub>p</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:605
+#: modules/process/indent_analyze.c:533
 msgid "Outer Pile-Up A<sub>d</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:614
+#: modules/process/indent_analyze.c:541
 msgid "Outer Pile-Up A<sub>p</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:644
+#: modules/process/indent_analyze.c:569
 msgid "Indentation statistics"
 msgstr ""
 
-#: modules/process/indent_analyze.c:645
+#: modules/process/indent_analyze.c:570
 msgid "_Compute & mark"
 msgstr ""
 
-#: modules/process/indent_analyze.c:646
+#: modules/process/indent_analyze.c:571
 msgid "_Save statistics"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1569
+#: modules/process/indent_analyze.c:1392
 msgid "No statistics has been computed yet."
 msgstr ""
 
-#: modules/process/indent_analyze.c:1577
+#: modules/process/indent_analyze.c:1400
 msgid "Save Indentation Statistics"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1615
+#: modules/process/indent_analyze.c:1438
 #, c-format
 msgid "Indentor:  %s\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1619
+#: modules/process/indent_analyze.c:1442
 #, c-format
 msgid "Length units: %s\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1621
+#: modules/process/indent_analyze.c:1444
 #, c-format
 msgid "Indentation center at [%d, %d] px:      %lf\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1623
+#: modules/process/indent_analyze.c:1446
 #, c-format
 msgid "Maximum at [%d, %d] is:                 %lf\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1625
+#: modules/process/indent_analyze.c:1448
 #, c-format
 msgid "Difference max-min:                     %lf\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1630
+#: modules/process/indent_analyze.c:1453
 #, c-format
 msgid "Area (projected) above plane:             %g (%.1lf %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1634
+#: modules/process/indent_analyze.c:1457
 #, c-format
 msgid "Area (projected) below plane:             %g (%.1lf %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1638
+#: modules/process/indent_analyze.c:1461
 #, c-format
 msgid "Area (projected) of    plane:             %g (%.1lf %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1643
+#: modules/process/indent_analyze.c:1466
 #, c-format
 msgid "Area (developed) above %g (+%.1f %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1646
+#: modules/process/indent_analyze.c:1469
 #, c-format
 msgid "Area (developed) below %g (+%.1lf %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1650
+#: modules/process/indent_analyze.c:1473
 #, c-format
 msgid "Volume above:     %g\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1652
+#: modules/process/indent_analyze.c:1475
 #, c-format
 msgid "Volume below:     %g\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1654
+#: modules/process/indent_analyze.c:1477
 #, c-format
 msgid "Volume difference %g\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1658
+#: modules/process/indent_analyze.c:1481
 msgid ""
 "\n"
 "Indentation\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1659
+#: modules/process/indent_analyze.c:1482
 #, c-format
 msgid "Volume      %g\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1664
+#: modules/process/indent_analyze.c:1487
 msgid ""
 "\n"
 "Indentation - Inner Pile-Up\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1670
+#: modules/process/indent_analyze.c:1493
 msgid "Indentation - Outer Pile-Up\n"
 msgstr ""
 
@@ -10526,11 +10866,6 @@ msgstr ""
 msgid "_Lattice:"
 msgstr ""
 
-#: modules/process/lat_synth.c:651 modules/process/obj_synth.c:544
-#: modules/process/pat_synth.c:1457
-msgid "_Size:"
-msgstr ""
-
 #: modules/process/lat_synth.c:662
 msgid "Lattice rela_xation:"
 msgstr ""
@@ -10663,7 +10998,7 @@ msgstr ""
 
 #: modules/process/level_grains.c:187 modules/process/median-bg.c:167
 #: modules/process/polylevel.c:293 modules/process/polylevel.c:417
-#: modules/process/sphere-revolve.c:200
+#: modules/process/sphere-revolve.c:221 modules/process/sphere-revolve.c:295
 msgid "Background"
 msgstr ""
 
@@ -10675,150 +11010,150 @@ msgstr ""
 msgid "Quantity to level:"
 msgstr ""
 
-#: modules/process/level_grains.c:231 modules/process/linematch.c:866
-#: modules/process/median-bg.c:217 modules/process/polylevel.c:482
-#: modules/process/sphere-revolve.c:263
+#: modules/process/level_grains.c:231 modules/process/linematch.c:834
+#: modules/process/median-bg.c:217 modules/process/polylevel.c:485
+#: modules/process/sphere-revolve.c:371
 msgid "E_xtract background"
 msgstr ""
 
-#: modules/process/linecorrect.c:54
+#: modules/process/linecorrect.c:52
 msgid "Corrects line defects (mostly experimental algorithms)."
 msgstr ""
 
-#: modules/process/linecorrect.c:68
+#: modules/process/linecorrect.c:66
 msgid "/_Correct Data/Ste_p Line Correction"
 msgstr ""
 
-#: modules/process/linecorrect.c:72
+#: modules/process/linecorrect.c:70
 msgid "Correct steps in lines"
 msgstr ""
 
-#: modules/process/linematch.c:158 modules/tools/linestats.c:166
+#: modules/process/linematch.c:155 modules/tools/linestats.c:166
 #: modules/volume/volume_linestat.c:143
 msgid "Median"
 msgstr ""
 
-#: modules/process/linematch.c:159
+#: modules/process/linematch.c:156
 msgid "Median of differences"
 msgstr ""
 
-#: modules/process/linematch.c:160
+#: modules/process/linematch.c:157
 msgid "Modus"
 msgstr ""
 
-#: modules/process/linematch.c:161
+#: modules/process/linematch.c:158
 msgid "linematch|Matching"
 msgstr ""
 
-#: modules/process/linematch.c:162
+#: modules/process/linematch.c:159
 msgid "linematch|Polynomial"
 msgstr ""
 
-#: modules/process/linematch.c:168
+#: modules/process/linematch.c:165
 msgid "Aligns rows by various methods."
 msgstr ""
 
-#: modules/process/linematch.c:182
+#: modules/process/linematch.c:179
 msgid "/_Correct Data/_Align rows..."
 msgstr ""
 
-#: modules/process/linematch.c:186
+#: modules/process/linematch.c:183
 msgid "Align rows using various methods"
 msgstr ""
 
-#: modules/process/linematch.c:237 modules/process/linematch.c:265
+#: modules/process/linematch.c:234 modules/process/linematch.c:262
 msgid "Row background"
 msgstr ""
 
-#: modules/process/linematch.c:266
+#: modules/process/linematch.c:263
 msgid "Vertical position"
 msgstr ""
 
-#: modules/process/linematch.c:267
+#: modules/process/linematch.c:264
 msgid "Corrected offset"
 msgstr ""
 
-#: modules/process/linematch.c:802
+#: modules/process/linematch.c:769
 msgid "Align Rows"
 msgstr ""
 
-#: modules/process/linematch.c:844
+#: modules/process/linematch.c:810
 msgid "_Polynomial degree:"
 msgstr ""
 
-#: modules/process/linematch.c:876
+#: modules/process/linematch.c:844
 msgid "Plot background _graph"
 msgstr ""
 
-#: modules/process/lno_synth.c:261 modules/process/noise_synth.c:188
+#: modules/process/lno_synth.c:259 modules/process/noise_synth.c:186
 msgid "distribution|Triangular"
 msgstr ""
 
-#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:213
+#: modules/process/lno_synth.c:265 modules/process/pat_synth.c:213
 msgid "Steps"
 msgstr ""
 
-#: modules/process/lno_synth.c:268
+#: modules/process/lno_synth.c:266
 msgid "Scars"
 msgstr ""
 
-#: modules/process/lno_synth.c:269 modules/process/pat_synth.c:214
+#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:214
 msgid "Ridges"
 msgstr ""
 
-#: modules/process/lno_synth.c:275
+#: modules/process/lno_synth.c:273
 msgid "Generates various kinds of line noise."
 msgstr ""
 
-#: modules/process/lno_synth.c:289
+#: modules/process/lno_synth.c:287
 msgid "/S_ynthetic/_Line Noise..."
 msgstr ""
 
-#: modules/process/lno_synth.c:293
+#: modules/process/lno_synth.c:291
 msgid "Generate line noise"
 msgstr ""
 
-#: modules/process/lno_synth.c:431
+#: modules/process/lno_synth.c:429
 msgid "Line Noise"
 msgstr ""
 
-#: modules/process/lno_synth.c:504
+#: modules/process/lno_synth.c:502
 msgid "Distribution"
 msgstr ""
 
-#: modules/process/lno_synth.c:514 modules/process/noise_synth.c:414
-msgid "Direction:"
+#: modules/process/lno_synth.c:512 modules/process/mask_noisify.c:158
+#: modules/process/noise_synth.c:412
+msgid "Noise type:"
 msgstr ""
 
-#: modules/process/lno_synth.c:523 modules/process/noise_synth.c:423
+#: modules/process/lno_synth.c:521 modules/process/mask_noisify.c:167
+#: modules/process/noise_synth.c:421
 msgid "S_ymmetrical"
 msgstr ""
 
-#: modules/process/lno_synth.c:524 modules/process/noise_synth.c:424
+#: modules/process/lno_synth.c:522 modules/process/mask_noisify.c:168
+#: modules/process/noise_synth.c:422
 msgid "One-sided _positive"
 msgstr ""
 
-#: modules/process/lno_synth.c:525 modules/process/noise_synth.c:425
+#: modules/process/lno_synth.c:523 modules/process/mask_noisify.c:169
+#: modules/process/noise_synth.c:423
 msgid "One-sided _negative"
 msgstr ""
 
-#: modules/process/lno_synth.c:546
+#: modules/process/lno_synth.c:544
 msgid "Noise Type"
 msgstr ""
 
-#: modules/process/lno_synth.c:551
+#: modules/process/lno_synth.c:549
 msgid "_Noise type:"
 msgstr ""
 
-#: modules/process/lno_synth.c:853 modules/process/lno_synth.c:1222
-msgid "Densi_ty:"
-msgstr ""
-
-#: modules/process/lno_synth.c:864 modules/process/lno_synth.c:1233
+#: modules/process/lno_synth.c:863 modules/process/lno_synth.c:1233
 msgid "_Within line:"
 msgstr ""
 
-#: modules/process/lno_synth.c:871
+#: modules/process/lno_synth.c:870
 msgid "C_umulative"
 msgstr ""
 
@@ -10874,31 +11209,31 @@ msgstr ""
 msgid "_Train logistic regression"
 msgstr ""
 
-#: modules/process/logistic.c:275
+#: modules/process/logistic.c:274
 msgid "_Gaussian blur"
 msgstr ""
 
-#: modules/process/logistic.c:288
+#: modules/process/logistic.c:285
 msgid "_Number of Gaussians:"
 msgstr ""
 
-#: modules/process/logistic.c:296
+#: modules/process/logistic.c:293
 msgid "_Sobel derivatives"
 msgstr ""
 
-#: modules/process/logistic.c:307
+#: modules/process/logistic.c:303
 msgid "_Laplacian"
 msgstr ""
 
-#: modules/process/logistic.c:318
+#: modules/process/logistic.c:313
 msgid "_Hessian"
 msgstr ""
 
-#: modules/process/logistic.c:331
+#: modules/process/logistic.c:325
 msgid "_Regularization parameter:"
 msgstr ""
 
-#: modules/process/logistic.c:623 modules/process/neural.c:1101
+#: modules/process/logistic.c:616 modules/process/neural.c:1108
 msgid "Training..."
 msgstr ""
 
@@ -10914,13 +11249,13 @@ msgstr ""
 msgid "Mark data disconnected from other values"
 msgstr ""
 
-#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:422
-#: modules/process/scars.c:279
+#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:419
+#: modules/process/scars.c:297
 msgid "Positive"
 msgstr ""
 
-#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:423
-#: modules/process/scars.c:280
+#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:420
+#: modules/process/scars.c:298
 msgid "Negative"
 msgstr ""
 
@@ -10936,11 +11271,11 @@ msgstr ""
 msgid "Defect _radius:"
 msgstr ""
 
-#: modules/process/mark_disconn.c:563
+#: modules/process/mark_disconn.c:552
 msgid "Filtering..."
 msgstr ""
 
-#: modules/process/mark_disconn.c:590
+#: modules/process/mark_disconn.c:579
 msgid "Marking outliers..."
 msgstr ""
 
@@ -10956,55 +11291,59 @@ msgstr ""
 msgid "Mask combining and modification"
 msgstr ""
 
-#: modules/process/mark_with.c:192
+#: modules/process/mark_with.c:193
 msgid "Mark With"
 msgstr ""
 
-#: modules/process/mark_with.c:238
-msgid "Se_t mask"
+#: modules/process/mark_with.c:231 modules/process/mask_morph.c:209
+msgid "Operation:"
 msgstr ""
 
 #: modules/process/mark_with.c:239
-msgid "_Add mask"
+msgid "Se_t mask"
 msgstr ""
 
 #: modules/process/mark_with.c:240
-msgid "_Subtract mask"
+msgid "_Add mask"
 msgstr ""
 
 #: modules/process/mark_with.c:241
+msgid "_Subtract mask"
+msgstr ""
+
+#: modules/process/mark_with.c:242
 msgid "_Intersect masks"
 msgstr ""
 
-#: modules/process/mark_with.c:247
+#: modules/process/mark_with.c:248
 msgid "Mark with:"
 msgstr ""
 
-#: modules/process/mark_with.c:255
+#: modules/process/mark_with.c:256
 msgid "with|_Mask"
 msgstr ""
 
-#: modules/process/mark_with.c:257
+#: modules/process/mark_with.c:258
 msgid "with|_Data"
 msgstr ""
 
-#: modules/process/mark_with.c:259
+#: modules/process/mark_with.c:260
 msgid "with|_Presentation"
 msgstr ""
 
-#: modules/process/mark_with.c:293
+#: modules/process/mark_with.c:297
 msgid "Marked data range:"
 msgstr ""
 
-#: modules/process/mark_with.c:301
+#: modules/process/mark_with.c:305
 msgid "_Minimum:"
 msgstr ""
 
-#: modules/process/mark_with.c:310
+#: modules/process/mark_with.c:314
 msgid "M_aximum:"
 msgstr ""
 
-#: modules/process/mark_with.c:378
+#: modules/process/mark_with.c:382
 msgid "Operand"
 msgstr ""
 
@@ -11040,107 +11379,107 @@ msgstr ""
 msgid "Preserve existing masks"
 msgstr ""
 
-#: modules/process/mask_edt.c:95
+#: modules/process/mask_edt.c:89
 msgid "Performs simple and true Euclidean distance transforms of masks."
 msgstr ""
 
-#: modules/process/mask_edt.c:109
+#: modules/process/mask_edt.c:103
 msgid "/_Mask/Distanc_e Transform..."
 msgstr ""
 
-#: modules/process/mask_edt.c:113
+#: modules/process/mask_edt.c:107
 msgid "Distance transform of mask"
 msgstr ""
 
-#: modules/process/mask_edt.c:116
+#: modules/process/mask_edt.c:110
 msgid "/_Mask/Thi_n"
 msgstr ""
 
-#: modules/process/mask_edt.c:120
+#: modules/process/mask_edt.c:114
 msgid "Thin mask"
 msgstr ""
 
-#: modules/process/mask_edt.c:330 modules/process/mask_edt.c:352
+#: modules/process/mask_edt.c:164 modules/process/mask_edt.c:186
 msgid "Distance Transform"
 msgstr ""
 
-#: modules/process/mask_edt.c:340
+#: modules/process/mask_edt.c:174
 msgid "Interior"
 msgstr ""
 
-#: modules/process/mask_edt.c:341
+#: modules/process/mask_edt.c:175
 msgid "Exterior"
 msgstr ""
 
-#: modules/process/mask_edt.c:342
+#: modules/process/mask_edt.c:176
 msgid "Two-sided"
 msgstr ""
 
-#: modules/process/mask_edt.c:373 modules/tools/maskedit.c:634
+#: modules/process/mask_edt.c:207 modules/tools/maskedit.c:640
 msgid "_Distance type:"
 msgstr ""
 
-#: modules/process/mask_edt.c:394 modules/tools/maskedit.c:640
+#: modules/process/mask_edt.c:228 modules/tools/maskedit.c:646
 msgid "Shrink from _border"
 msgstr ""
 
-#: modules/process/mask_morph.c:117
+#: modules/process/mask_morph.c:116
 msgid "Performs basic morphological operations with masks."
 msgstr ""
 
-#: modules/process/mask_morph.c:131
-msgid "/_Mask/Morphological Operation..."
+#: modules/process/mask_morph.c:130
+msgid "/_Mask/Morpho_logical Operation..."
 msgstr ""
 
-#: modules/process/mask_morph.c:135
+#: modules/process/mask_morph.c:134
 msgid "Morphological operation with mask"
 msgstr ""
 
-#: modules/process/mask_morph.c:169
+#: modules/process/mask_morph.c:168
 msgid "Erosion"
 msgstr ""
 
-#: modules/process/mask_morph.c:170
+#: modules/process/mask_morph.c:169
 msgid "Dilation"
 msgstr ""
 
-#: modules/process/mask_morph.c:171 modules/tools/filter.c:242
+#: modules/process/mask_morph.c:170 modules/tools/filter.c:243
 msgid "filter|Opening"
 msgstr ""
 
-#: modules/process/mask_morph.c:172 modules/tools/filter.c:243
+#: modules/process/mask_morph.c:171 modules/tools/filter.c:244
 msgid "filter|Closing"
 msgstr ""
 
-#: modules/process/mask_morph.c:173 modules/tools/filter.c:244
+#: modules/process/mask_morph.c:172 modules/tools/filter.c:245
 msgid "ASF Opening"
 msgstr ""
 
-#: modules/process/mask_morph.c:174 modules/tools/filter.c:245
+#: modules/process/mask_morph.c:173 modules/tools/filter.c:246
 msgid "ASF Closing"
 msgstr ""
 
-#: modules/process/mask_morph.c:178
+#: modules/process/mask_morph.c:177
 msgid "Octagon"
 msgstr ""
 
-#: modules/process/mask_morph.c:181
+#: modules/process/mask_morph.c:180
 msgid "Another mask"
 msgstr ""
 
-#: modules/process/mask_morph.c:192
+#: modules/process/mask_morph.c:191
 msgid "Morphological Operation"
 msgstr ""
 
-#: modules/process/mask_morph.c:224
+#: modules/process/mask_morph.c:223
 msgid "Structuring element:"
 msgstr ""
 
-#: modules/process/mask_morph.c:238 modules/tools/maskedit.c:524
+#: modules/process/mask_morph.c:237 modules/tools/maskedit.c:528
 msgid "_Radius:"
 msgstr ""
 
-#: modules/process/mask_morph.c:249
+#: modules/process/mask_morph.c:248
 msgid "_Mask:"
 msgstr ""
 
@@ -11148,39 +11487,59 @@ msgstr ""
 msgid "_Trim empty borders"
 msgstr ""
 
-#: modules/process/maskcor.c:86
+#: modules/process/mask_noisify.c:83
+msgid "Adds salt and/or pepper noise to mask."
+msgstr ""
+
+#: modules/process/mask_noisify.c:97
+msgid "/_Mask/_Noisify..."
+msgstr ""
+
+#: modules/process/mask_noisify.c:101
+msgid "Add noise to mask"
+msgstr ""
+
+#: modules/process/mask_noisify.c:141
+msgid "Noisify Mask"
+msgstr ""
+
+#: modules/process/mask_noisify.c:184
+msgid "_Alter only boundaries"
+msgstr ""
+
+#: modules/process/maskcor.c:87
 msgid "Creates mask by correlation with another data."
 msgstr ""
 
-#: modules/process/maskcor.c:100
+#: modules/process/maskcor.c:101
 msgid "/M_ultidata/_Mask by Correlation..."
 msgstr ""
 
-#: modules/process/maskcor.c:104
+#: modules/process/maskcor.c:105
 msgid "Create mask by correlation with another data"
 msgstr ""
 
-#: modules/process/maskcor.c:141
+#: modules/process/maskcor.c:142
 msgid "Mask by Correlation"
 msgstr ""
 
-#: modules/process/maskcor.c:165
+#: modules/process/maskcor.c:166
 msgid "Correlation _kernel:"
 msgstr ""
 
-#: modules/process/maskcor.c:172
+#: modules/process/maskcor.c:173
 msgid "Objects marked"
 msgstr ""
 
-#: modules/process/maskcor.c:173
+#: modules/process/maskcor.c:174
 msgid "Correlation maxima"
 msgstr ""
 
-#: modules/process/maskcor.c:174 modules/process/maskcor.c:356
+#: modules/process/maskcor.c:175 modules/process/maskcor.c:360
 msgid "Correlation score"
 msgstr ""
 
-#: modules/process/maskcor.c:183
+#: modules/process/maskcor.c:185
 msgid "Correlation _method:"
 msgstr ""
 
@@ -11209,7 +11568,7 @@ msgid "/_Mask/_Extract Mask"
 msgstr ""
 
 #: modules/process/maskops.c:78
-msgid "Extract mask to a new channel"
+msgid "Extract mask to a new image"
 msgstr ""
 
 #: modules/process/maskops.c:81
@@ -11236,35 +11595,31 @@ msgstr ""
 msgid "Mutual Crop"
 msgstr ""
 
-#: modules/process/mcrop.c:174
+#: modules/process/mcrop.c:173
 msgid "_Select second argument:"
 msgstr ""
 
-#: modules/process/measure_lattice.c:174
+#: modules/process/measure_lattice.c:165
 msgid "Measures parameters of two-dimensional lattices."
 msgstr ""
 
-#: modules/process/measure_lattice.c:188
+#: modules/process/measure_lattice.c:179
 msgid "/_Statistics/Measure _Lattice..."
 msgstr ""
 
-#: modules/process/measure_lattice.c:192
+#: modules/process/measure_lattice.c:183
 msgid "Measure lattice"
 msgstr ""
 
-#: modules/process/measure_lattice.c:253
+#: modules/process/measure_lattice.c:243
 msgid "Measure Lattice"
 msgstr ""
 
-#: modules/process/measure_lattice.c:259
-msgid "_Refine"
-msgstr ""
-
-#: modules/process/measure_lattice.c:330
+#: modules/process/measure_lattice.c:320
 msgid "_ACF"
 msgstr ""
 
-#: modules/process/measure_lattice.c:331
+#: modules/process/measure_lattice.c:321
 msgid "_PSDF"
 msgstr ""
 
@@ -11280,30 +11635,30 @@ msgstr ""
 msgid "_Vectors"
 msgstr ""
 
-#: modules/process/measure_lattice.c:596
+#: modules/process/measure_lattice.c:589
 msgid "Save Lattice Parameters"
 msgstr ""
 
-#: modules/process/measure_lattice.c:634
+#: modules/process/measure_lattice.c:627
 #, c-format
 msgid "Vector %d:"
 msgstr ""
 
-#: modules/process/measure_lattice.c:643
+#: modules/process/measure_lattice.c:636
 #, c-format
 msgid "Length %d:"
 msgstr ""
 
-#: modules/process/measure_lattice.c:650
+#: modules/process/measure_lattice.c:643
 #, c-format
 msgid "Angle %d:"
 msgstr ""
 
-#: modules/process/measure_lattice.c:665
+#: modules/process/measure_lattice.c:657
 msgid "Angle:"
 msgstr ""
 
-#: modules/process/measure_lattice.c:681
+#: modules/process/measure_lattice.c:673
 msgid "Lattice Parameters"
 msgstr ""
 
@@ -11327,11 +11682,11 @@ msgstr ""
 msgid "Median Level"
 msgstr ""
 
-#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:237
+#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:336
 msgid "Real _radius:"
 msgstr ""
 
-#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:247
+#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:346
 msgid "_Pixel radius:"
 msgstr ""
 
@@ -11371,7 +11726,7 @@ msgstr ""
 msgid "Second operand"
 msgstr ""
 
-#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:643
+#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:612
 msgid "Average"
 msgstr ""
 
@@ -11423,48 +11778,263 @@ msgstr ""
 msgid "Merged images"
 msgstr ""
 
-#: modules/process/nanoindent_adjust.c:89
-msgid "Adjust images of two indentor prints."
+#: modules/process/mfm_current.c:163
+msgid "Simulation of current line magnetic field"
 msgstr ""
 
-#: modules/process/nanoindent_adjust.c:103
-msgid "/_Tip and Indentation/Ad_just..."
+#: modules/process/mfm_current.c:177
+msgid "/SPM M_odes/_MFM/_Current Line Field..."
 msgstr ""
 
-#: modules/process/nanoindent_adjust.c:107
-msgid "Adjust two nanoindentation imprints"
+#: modules/process/mfm_current.c:181
+msgid "Simulate stray field above current line"
 msgstr ""
 
-#: modules/process/nanoindent_adjust.c:160
-msgid "Imprints adjustment"
+#: modules/process/mfm_current.c:280 modules/process/mfm_parallel.c:282
+msgid "Simulated field"
 msgstr ""
 
-#: modules/process/nanoindent_adjust.c:175
-msgid "_Indentor model imprint:"
+#: modules/process/mfm_current.c:322 modules/process/mfm_field.c:266
+#: modules/process/mfm_parallel.c:324
+msgid "Point charge"
 msgstr ""
 
-#: modules/process/nanoindent_adjust.c:186
-msgid "Imprint to be _adjusted:"
+#: modules/process/mfm_current.c:323 modules/process/mfm_field.c:267
+#: modules/process/mfm_parallel.c:325
+msgid "Bar"
 msgstr ""
 
-#: modules/process/nanoindent_adjust.c:197
-msgid "_Move data"
+#: modules/process/mfm_current.c:330
+msgid "Current Line Stray Field"
 msgstr ""
 
-#: modules/process/nanoindent_adjust.c:206
-msgid "_Rotate data"
+#: modules/process/mfm_current.c:415
+msgid "Output"
 msgstr ""
 
-#: modules/process/nanoindent_adjust.c:215
-msgid "E_xtrapolate result data out of measured range"
+#: modules/process/mfm_current.c:420 modules/process/mfm_field.c:320
+#: modules/process/mfm_parallel.c:415
+msgid "_Output plane height:"
 msgstr ""
 
-#: modules/process/nanoindent_adjust.c:295
+#: modules/process/mfm_current.c:428
+msgid "_Stripe width:"
+msgstr ""
+
+#: modules/process/mfm_current.c:436
+msgid "Stripe _current:"
+msgstr ""
+
+#: modules/process/mfm_current.c:444
+msgid "_Position:"
+msgstr ""
+
+#: modules/process/mfm_current.c:461
+msgid "Probe"
+msgstr ""
+
+#: modules/process/mfm_current.c:469
+msgid "P_robe type:"
+msgstr ""
+
+#: modules/process/mfm_current.c:475 modules/process/mfm_field.c:389
+#: modules/process/mfm_parallel.c:482
+msgid "Tip _magnetization:"
+msgstr ""
+
+#: modules/process/mfm_current.c:484 modules/process/mfm_field.c:397
+#: modules/process/mfm_parallel.c:491
+msgid "Bar width _x:"
+msgstr ""
+
+#: modules/process/mfm_current.c:493 modules/process/mfm_field.c:405
+#: modules/process/mfm_parallel.c:500
+msgid "Bar width _y:"
+msgstr ""
+
+#: modules/process/mfm_current.c:502 modules/process/mfm_field.c:413
+#: modules/process/mfm_parallel.c:509
+msgid "Bar length (_z):"
+msgstr ""
+
+#: modules/process/mfm_field.c:146
+msgid "Simulation of magnetic field above perpendicular media"
+msgstr ""
+
+#: modules/process/mfm_field.c:160
+msgid "/SPM M_odes/_MFM/_Perpendicular Media Field..."
+msgstr ""
+
+#: modules/process/mfm_field.c:164
+msgid "Compute stray field above perpendicular magnetic medium"
+msgstr ""
+
+#: modules/process/mfm_field.c:276
+msgid "Perpendicular Media Stray Field"
+msgstr ""
+
+#: modules/process/mfm_field.c:328 modules/process/mfm_parallel.c:423
+msgid "_Film thickness:"
+msgstr ""
+
+#: modules/process/mfm_field.c:336
+msgid "_Magnetic charge:"
+msgstr ""
+
+#: modules/process/mfm_field.c:344
+msgid "Include domain _walls"
+msgstr ""
+
+#: modules/process/mfm_field.c:354
+msgid "_Exchange constant:"
+msgstr ""
+
+#: modules/process/mfm_field.c:362
+msgid "_Uniaxial anisotropy:"
+msgstr ""
+
+#: modules/process/mfm_field.c:383 modules/process/mfm_parallel.c:476
+msgid "_Probe type:"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:88
+msgid "Lift height difference estimation from data blur"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:102
+msgid "/SPM M_odes/_MFM/_Estimate Shift in Z..."
+msgstr ""
+
+#: modules/process/mfm_findshift.c:106
+msgid "Estimate lift height difference in MFM data"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:166 modules/process/psf.c:340
+msgid "Searching..."
+msgstr ""
+
+#: modules/process/mfm_findshift.c:196
+msgid "Estimated shift:"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:211
+msgid "Shifted field difference"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:228
+msgid "Estimate Lift Height Shift"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:255
+msgid "Data to compare:"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:261
+msgid "Search _from:"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:269
+msgid "Search _to:"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:165
+msgid "Simulation of parallel magnetic media"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:179
+msgid "/SPM M_odes/_MFM/Para_llel Media Field..."
+msgstr ""
+
+#: modules/process/mfm_parallel.c:183
+msgid "Simulate stray field above parallel magnetic medium"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:331
+msgid "Parallel Media Stray Field"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:431
+msgid "_Remanent magnetization:"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:439
+msgid "Size _A (dir. left):"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:447
+msgid "Size _B (dir. right):"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:455
+msgid "_Gap size:"
+msgstr ""
+
+#: modules/process/mfm_shift.c:87
+msgid "Simulation of magnetic field z component change for another level"
+msgstr ""
+
+#: modules/process/mfm_shift.c:101
+msgid "/SPM M_odes/_MFM/_Field Shift in Z..."
+msgstr ""
+
+#: modules/process/mfm_shift.c:105
+msgid "Compute stray field shift for another z level"
+msgstr ""
+
+#: modules/process/mfm_shift.c:146
+msgid "Shifted field"
+msgstr ""
+
+#: modules/process/mfm_shift.c:164
+msgid "Stray Field Plane Shift"
+msgstr ""
+
+#: modules/process/mfm_shift.c:209
+msgid "_Z shift by:"
+msgstr ""
+
+#: modules/process/nanoindent_adjust.c:89
+msgid "Adjust images of two indentor prints."
+msgstr ""
+
+#: modules/process/nanoindent_adjust.c:103
+msgid "/_Tip and Indentation/Ad_just..."
+msgstr ""
+
+#: modules/process/nanoindent_adjust.c:107
+msgid "Adjust two nanoindentation imprints"
+msgstr ""
+
+#: modules/process/nanoindent_adjust.c:160
+msgid "Imprints adjustment"
+msgstr ""
+
+#: modules/process/nanoindent_adjust.c:175
+msgid "_Indentor model imprint:"
+msgstr ""
+
+#: modules/process/nanoindent_adjust.c:186
+msgid "Imprint to be _adjusted:"
+msgstr ""
+
+#: modules/process/nanoindent_adjust.c:197
+msgid "_Move data"
+msgstr ""
+
+#: modules/process/nanoindent_adjust.c:206
+msgid "_Rotate data"
+msgstr ""
+
+#: modules/process/nanoindent_adjust.c:215
+msgid "E_xtrapolate result data out of measured range"
+msgstr ""
+
+#: modules/process/nanoindent_adjust.c:296
 msgid ""
 "Tip has different range/resolution ratio than image. Tip will be resampled."
 msgstr ""
 
-#: modules/process/nanoindent_adjust.c:334
+#: modules/process/nanoindent_adjust.c:335
 msgid "Immersed detail data"
 msgstr ""
 
@@ -11505,244 +12075,232 @@ msgstr ""
 msgid "error"
 msgstr ""
 
-#: modules/process/neural.c:503
+#: modules/process/neural.c:504
 msgid "NN training error"
 msgstr ""
 
-#: modules/process/neural.c:516
+#: modules/process/neural.c:517
 msgid "Training"
 msgstr ""
 
-#: modules/process/neural.c:520
+#: modules/process/neural.c:521
 msgid "_Model:"
 msgstr ""
 
-#: modules/process/neural.c:530
+#: modules/process/neural.c:532
 msgid "_Signal:"
 msgstr ""
 
-#: modules/process/neural.c:541
+#: modules/process/neural.c:544
 msgid "Training ste_ps:"
 msgstr ""
 
-#: modules/process/neural.c:557
+#: modules/process/neural.c:561
 msgid "Model"
 msgstr ""
 
-#: modules/process/neural.c:558
+#: modules/process/neural.c:562
 msgid "Signal"
 msgstr ""
 
-#: modules/process/neural.c:575
+#: modules/process/neural.c:579
 msgid "verb|_Train"
 msgstr ""
 
-#: modules/process/neural.c:580
+#: modules/process/neural.c:584
 msgid "Re_initialize"
 msgstr ""
 
-#: modules/process/neural.c:613
+#: modules/process/neural.c:617
 msgid "Network"
 msgstr ""
 
-#: modules/process/neural.c:619
+#: modules/process/neural.c:623
 msgid "Window _width:"
 msgstr ""
 
-#: modules/process/neural.c:627
+#: modules/process/neural.c:631
 msgid "Window h_eight:"
 msgstr ""
 
-#: modules/process/neural.c:635
+#: modules/process/neural.c:639
 msgid "_Hidden nodes:"
 msgstr ""
 
-#: modules/process/neural.c:643
+#: modules/process/neural.c:647
 msgid "Result Units"
 msgstr ""
 
-#: modules/process/neural.c:650
+#: modules/process/neural.c:654
 msgid "Power of source _XY:"
 msgstr ""
 
-#: modules/process/neural.c:658
+#: modules/process/neural.c:663
 msgid "Power of source _Z:"
 msgstr ""
 
-#: modules/process/neural.c:666
+#: modules/process/neural.c:672
 msgid "_Fixed units:"
 msgstr ""
 
-#: modules/process/neural.c:676
+#: modules/process/neural.c:683
 msgid "Networks"
 msgstr ""
 
-#: modules/process/neural.c:723
+#: modules/process/neural.c:730
 msgid "Network _name:"
 msgstr ""
 
-#: modules/process/neural.c:775
+#: modules/process/neural.c:782
 msgid "Apply Neural Network"
 msgstr ""
 
-#: modules/process/neural.c:798
+#: modules/process/neural.c:805
 msgid "_Scale proportionally to input"
 msgstr ""
 
-#: modules/process/neural.c:929
+#: modules/process/neural.c:936
 msgid "Model and signal are not compatible."
 msgstr ""
 
-#: modules/process/neural.c:937
+#: modules/process/neural.c:944
 msgid "A field dimension is too small for chosen window size."
 msgstr ""
 
-#: modules/process/neural.c:1183 modules/process/neural.c:1349
+#: modules/process/neural.c:1190 modules/process/neural.c:1356
 msgid "Evaluating..."
 msgstr ""
 
-#: modules/process/neural.c:1309
+#: modules/process/neural.c:1316
 msgid "Training was canceled."
 msgstr ""
 
-#: modules/process/neural.c:1319
+#: modules/process/neural.c:1326
 #, c-format
 msgid "Mean difference: %.*f %s"
 msgstr ""
 
-#: modules/process/neural.c:1371
+#: modules/process/neural.c:1378
 msgid "Evaluated signal"
 msgstr ""
 
-#: modules/process/noise_synth.c:196
+#: modules/process/noise_synth.c:194
 msgid "Generates uncorrelated random noise."
 msgstr ""
 
-#: modules/process/noise_synth.c:210
+#: modules/process/noise_synth.c:208
 msgid "/S_ynthetic/_Noise..."
 msgstr ""
 
-#: modules/process/noise_synth.c:214
+#: modules/process/noise_synth.c:212
 msgid "Generate surface of uncorrelated noise"
 msgstr ""
 
-#: modules/process/noise_synth.c:334
+#: modules/process/noise_synth.c:332
 msgid "Random Noise"
 msgstr ""
 
-#: modules/process/obj_synth.c:274
+#: modules/process/obj_synth.c:270
 msgid "Spheres"
 msgstr ""
 
-#: modules/process/obj_synth.c:275
+#: modules/process/obj_synth.c:271
 msgid "Boxes"
 msgstr ""
 
-#: modules/process/obj_synth.c:276
+#: modules/process/obj_synth.c:272
 msgid "Cones"
 msgstr ""
 
-#: modules/process/obj_synth.c:277
+#: modules/process/obj_synth.c:273
 msgid "Pyramids"
 msgstr ""
 
-#: modules/process/obj_synth.c:278
+#: modules/process/obj_synth.c:274
 msgid "Diamonds"
 msgstr ""
 
-#: modules/process/obj_synth.c:279
+#: modules/process/obj_synth.c:275
 msgid "Tetrahedrons"
 msgstr ""
 
-#: modules/process/obj_synth.c:280
+#: modules/process/obj_synth.c:276
 msgid "Nuggets"
 msgstr ""
 
-#: modules/process/obj_synth.c:281
+#: modules/process/obj_synth.c:277
 msgid "Thatches"
 msgstr ""
 
-#: modules/process/obj_synth.c:282
+#: modules/process/obj_synth.c:278
 msgid "Tents"
 msgstr ""
 
-#: modules/process/obj_synth.c:283
+#: modules/process/obj_synth.c:279
 msgid "Gaussians"
 msgstr ""
 
-#: modules/process/obj_synth.c:284
+#: modules/process/obj_synth.c:280
 msgid "Doughnuts"
 msgstr ""
 
-#: modules/process/obj_synth.c:285
+#: modules/process/obj_synth.c:281
 msgid "Parabolic bumps"
 msgstr ""
 
-#: modules/process/obj_synth.c:291
+#: modules/process/obj_synth.c:287
 msgid "Generates randomly patterned surfaces by placing objects."
 msgstr ""
 
-#: modules/process/obj_synth.c:305
-msgid "/S_ynthetic/_Objects..."
+#: modules/process/obj_synth.c:301
+msgid "/S_ynthetic/_Deposition/_Objects..."
 msgstr ""
 
-#: modules/process/obj_synth.c:309
+#: modules/process/obj_synth.c:305
 msgid "Generate surface of randomly placed objects"
 msgstr ""
 
-#: modules/process/obj_synth.c:424
+#: modules/process/obj_synth.c:421
 msgid "Both (random)"
 msgstr ""
 
-#: modules/process/obj_synth.c:439
+#: modules/process/obj_synth.c:436
 msgid "Random Objects"
 msgstr ""
 
-#: modules/process/obj_synth.c:513
-msgid "_Shape:"
-msgstr ""
-
-#: modules/process/obj_synth.c:531
-msgid "obj."
-msgstr ""
-
-#: modules/process/obj_synth.c:551
+#: modules/process/obj_synth.c:549
 msgid "Aspect Ratio"
 msgstr ""
 
-#: modules/process/obj_synth.c:558
+#: modules/process/obj_synth.c:556
 msgid "_Aspect ratio:"
 msgstr ""
 
-#: modules/process/obj_synth.c:588
+#: modules/process/obj_synth.c:586
 msgid "Scales _with size"
 msgstr ""
 
-#: modules/process/obj_synth.c:612
+#: modules/process/obj_synth.c:611
 msgid "_Feature type:"
 msgstr ""
 
-#: modules/process/obj_synth.c:807
-msgid "_Truncate:"
-msgstr ""
-
-#: modules/process/otsu_threshold.c:39 modules/process/otsu_threshold.c:59
+#: modules/process/otsu_threshold.c:40 modules/process/otsu_threshold.c:60
 msgid "Automated threshold using Otsu's method on heights."
 msgstr ""
 
-#: modules/process/otsu_threshold.c:55
-msgid "/_Grains/_Mark by Otsu's..."
+#: modules/process/otsu_threshold.c:56
+msgid "/_Grains/_Mark by Otsu's"
 msgstr ""
 
-#: modules/process/outliers.c:40
+#: modules/process/outliers.c:41
 msgid "Creates mask of outliers."
 msgstr ""
 
-#: modules/process/outliers.c:54
+#: modules/process/outliers.c:55
 msgid "/_Correct Data/Mask of _Outliers"
 msgstr ""
 
-#: modules/process/outliers.c:58
+#: modules/process/outliers.c:59
 msgid "Mark data farther than 3σ from mean value"
 msgstr ""
 
@@ -11766,80 +12324,100 @@ msgstr ""
 msgid "_Pattern:"
 msgstr ""
 
-#: modules/process/pat_synth.c:812
+#: modules/process/pat_synth.c:813
 msgid "Flat"
 msgstr ""
 
-#: modules/process/pat_synth.c:820
+#: modules/process/pat_synth.c:821
 msgid "_Flat width:"
 msgstr ""
 
-#: modules/process/pat_synth.c:837 modules/process/pat_synth.c:1139
-#: modules/process/pat_synth.c:1474
+#: modules/process/pat_synth.c:838 modules/process/pat_synth.c:1140
+#: modules/process/pat_synth.c:1475
 msgid "_Slope width:"
 msgstr ""
 
-#: modules/process/pat_synth.c:1099
+#: modules/process/pat_synth.c:1100
 msgid "Top"
 msgstr ""
 
-#: modules/process/pat_synth.c:1106
+#: modules/process/pat_synth.c:1107
 msgid "Flat _top width:"
 msgstr ""
 
-#: modules/process/pat_synth.c:1114
+#: modules/process/pat_synth.c:1115
 msgid "Bottom"
 msgstr ""
 
-#: modules/process/pat_synth.c:1122
+#: modules/process/pat_synth.c:1123
 msgid "Flat _bottom width:"
 msgstr ""
 
-#: modules/process/pat_synth.c:1440
+#: modules/process/pat_synth.c:1441
 msgid "_Distance:"
 msgstr ""
 
-#: modules/process/pid.c:96
+#: modules/process/phase_synth.c:136
+msgid "Generates phase-separated structures."
+msgstr ""
+
+#: modules/process/phase_synth.c:150
+msgid "/S_ynthetic/P_hases..."
+msgstr ""
+
+#: modules/process/phase_synth.c:154
+msgid "Generate surface with separated phases"
+msgstr ""
+
+#: modules/process/phase_synth.c:203
+msgid "Separated Phases"
+msgstr ""
+
+#: modules/process/phase_synth.c:287
+msgid "Size s_pread:"
+msgstr ""
+
+#: modules/process/pid.c:95
 msgid "A simple PID simulator"
 msgstr ""
 
-#: modules/process/pid.c:110
+#: modules/process/pid.c:109
 msgid "/_Tip and Indentation/_PID simulation..."
 msgstr ""
 
-#: modules/process/pid.c:114
+#: modules/process/pid.c:113
 msgid "Simulate PID effects on measurement"
 msgstr ""
 
-#: modules/process/pid.c:158
+#: modules/process/pid.c:157
 msgid "PID FW result"
 msgstr ""
 
-#: modules/process/pid.c:167
+#: modules/process/pid.c:166
 msgid "PID FW max. force"
 msgstr ""
 
-#: modules/process/pid.c:176
+#: modules/process/pid.c:175
 msgid "PID REV result"
 msgstr ""
 
-#: modules/process/pid.c:185
+#: modules/process/pid.c:184
 msgid "PID REV max. force"
 msgstr ""
 
-#: modules/process/pid.c:198
+#: modules/process/pid.c:196
 msgid "PID simulation"
 msgstr ""
 
-#: modules/process/pid.c:215
+#: modules/process/pid.c:214
 msgid "_Proportional:"
 msgstr ""
 
-#: modules/process/pid.c:221
+#: modules/process/pid.c:220
 msgid "_Integral:"
 msgstr ""
 
-#: modules/process/pid.c:227
+#: modules/process/pid.c:226
 msgid "_Integration steps:"
 msgstr ""
 
@@ -11847,15 +12425,15 @@ msgstr ""
 msgid "_Derivative:"
 msgstr ""
 
-#: modules/process/pid.c:241
+#: modules/process/pid.c:240
 msgid "PID/scan speed _ratio:"
 msgstr ""
 
-#: modules/process/pid.c:253
+#: modules/process/pid.c:255
 msgid "Force strength:"
 msgstr ""
 
-#: modules/process/pid.c:259
+#: modules/process/pid.c:261
 msgid "Force setpoint:"
 msgstr ""
 
@@ -11863,7 +12441,7 @@ msgstr ""
 msgid "Scanning..."
 msgstr ""
 
-#: modules/process/pid.c:396
+#: modules/process/pid.c:401
 msgid "Computation diverged, try to change parameters"
 msgstr ""
 
@@ -11883,23 +12461,23 @@ msgstr ""
 msgid "Distort by Polynomial"
 msgstr ""
 
-#: modules/process/polydistort.c:282
+#: modules/process/polydistort.c:285
 msgid "Ori_ginal"
 msgstr ""
 
-#: modules/process/polydistort.c:283
+#: modules/process/polydistort.c:286
 msgid "_Transformed"
 msgstr ""
 
-#: modules/process/polydistort.c:289
+#: modules/process/polydistort.c:292
 msgid "X Coefficients"
 msgstr ""
 
-#: modules/process/polydistort.c:303
+#: modules/process/polydistort.c:306
 msgid "Y Coefficients"
 msgstr ""
 
-#: modules/process/polydistort.c:499
+#: modules/process/polydistort.c:502
 msgid "Distorted"
 msgstr ""
 
@@ -11935,23 +12513,23 @@ msgstr ""
 msgid "_Horizontal polynom degree:"
 msgstr ""
 
-#: modules/process/polylevel.c:450
+#: modules/process/polylevel.c:451
 msgid "_Vertical polynom degree:"
 msgstr ""
 
-#: modules/process/polylevel.c:456
+#: modules/process/polylevel.c:458
 msgid "_Same degrees"
 msgstr ""
 
-#: modules/process/polylevel.c:474
+#: modules/process/polylevel.c:476
 msgid "_Maximum polynom degree:"
 msgstr ""
 
-#: modules/process/polylevel.c:561
+#: modules/process/polylevel.c:564
 msgid "Polynomial Coefficients"
 msgstr ""
 
-#: modules/process/polylevel.c:934 modules/tools/distance.c:594
+#: modules/process/polylevel.c:937 modules/tools/distance.c:594
 #: modules/tools/selectionmanager.c:720
 msgid "Save Table"
 msgstr ""
@@ -11973,7 +12551,7 @@ msgid "/_Presentation/E_xtract Presentation"
 msgstr ""
 
 #: modules/process/presentationops.c:81
-msgid "Extract presentation to a new channel"
+msgid "Extract presentation to a new image"
 msgstr ""
 
 #: modules/process/presentationops.c:84
@@ -12000,6 +12578,10 @@ msgstr ""
 msgid "_Data to attach:"
 msgstr ""
 
+#: modules/process/preview.h:245
+msgid "Combine with existing mask:"
+msgstr ""
+
 #: modules/process/psdf_logphi.c:76
 msgid ""
 "Two-dimensional FFT (Fast Fourier Transform) transformed to coordinates (log-"
@@ -12018,10 +12600,79 @@ msgstr ""
 msgid "Log-Phi PSDF"
 msgstr ""
 
-#: modules/process/psdf_logphi.c:275 modules/process/wpour_mark.c:320
+#: modules/process/psdf_logphi.c:276 modules/process/wpour_mark.c:320
 msgid "Gaussian _smoothing:"
 msgstr ""
 
+#: modules/process/psf-fit.c:165
+msgid "Gaussian (asymmetric)"
+msgstr ""
+
+#: modules/process/psf-fit.c:177
+msgid "Point spread function estimation by fitting explicit function form."
+msgstr ""
+
+#: modules/process/psf-fit.c:191
+msgid "/_Statistics/_PSF Fit..."
+msgstr ""
+
+#: modules/process/psf-fit.c:195
+msgid "Fit PSF from known data and image"
+msgstr ""
+
+#: modules/process/psf-fit.c:246 modules/process/psf.c:181
+#: modules/process/psf.c:230
+msgid "PSF"
+msgstr ""
+
+#: modules/process/psf-fit.c:254 modules/process/psf.c:195
+msgid "PSF*P"
+msgstr ""
+
+#: modules/process/psf-fit.c:271
+msgid "Fit PSF"
+msgstr ""
+
+#: modules/process/psf-fit.c:289 modules/process/psf.c:286
+msgid "_Ideal response:"
+msgstr ""
+
+#: modules/process/psf.c:117
+msgid "Point spread function estimation"
+msgstr ""
+
+#: modules/process/psf.c:131
+msgid "/_Statistics/_PSF Guess..."
+msgstr ""
+
+#: modules/process/psf.c:135
+msgid "Estimate PSF from known data and image"
+msgstr ""
+
+#: modules/process/psf.c:208
+msgid "PSF*P - I"
+msgstr ""
+
+#: modules/process/psf.c:231
+msgid "Convolved"
+msgstr ""
+
+#: modules/process/psf.c:237
+msgid "Estimate PSF"
+msgstr ""
+
+#: modules/process/psf.c:238
+msgid "_Fit"
+msgstr ""
+
+#: modules/process/psf.c:295
+msgid "_Display:"
+msgstr ""
+
+#: modules/process/psf.c:301
+msgid "_Sigma init:"
+msgstr ""
+
 #: modules/process/rank.c:92
 msgid "Enhances local contrast using a rank transform."
 msgstr ""
@@ -12070,7 +12721,7 @@ msgstr ""
 msgid "Rotate by arbitrary angle"
 msgstr ""
 
-#: modules/process/rotate.c:192
+#: modules/process/rotate.c:192 modules/volume/volume_swaxes.c:651
 msgid "Rotated Data"
 msgstr ""
 
@@ -12126,63 +12777,63 @@ msgstr ""
 msgid "verb|Scale"
 msgstr ""
 
-#: modules/process/scale.c:216
+#: modules/process/scale.c:217
 msgid "Scale by _ratio:"
 msgstr ""
 
-#: modules/process/scale.c:224
+#: modules/process/scale.c:225
 msgid "_proportional"
 msgstr ""
 
-#: modules/process/scale.c:235
+#: modules/process/scale.c:237
 msgid "New _width:"
 msgstr ""
 
-#: modules/process/scale.c:243
+#: modules/process/scale.c:246
 msgid "New _height:"
 msgstr ""
 
-#: modules/process/scars.c:113
+#: modules/process/scars.c:122
 msgid "Marks and/or removes scars (horizontal linear artifacts)."
 msgstr ""
 
-#: modules/process/scars.c:127
+#: modules/process/scars.c:136
 msgid "/_Correct Data/M_ark Scars..."
 msgstr ""
 
-#: modules/process/scars.c:131
+#: modules/process/scars.c:140
 msgid "Mark horizontal scars (strokes)"
 msgstr ""
 
-#: modules/process/scars.c:134
+#: modules/process/scars.c:143
 msgid "/_Correct Data/Remove _Scars"
 msgstr ""
 
-#: modules/process/scars.c:138
+#: modules/process/scars.c:147
 msgid "Correct horizontal scars (strokes)"
 msgstr ""
 
-#: modules/process/scars.c:293
+#: modules/process/scars.c:312
 msgid "Mark Scars"
 msgstr ""
 
-#: modules/process/scars.c:331
+#: modules/process/scars.c:353
 msgid "Maximum _width:"
 msgstr ""
 
-#: modules/process/scars.c:338
+#: modules/process/scars.c:361
 msgid "Minimum _length:"
 msgstr ""
 
-#: modules/process/scars.c:345
+#: modules/process/scars.c:369
 msgid "_Hard threshold:"
 msgstr ""
 
-#: modules/process/scars.c:353
+#: modules/process/scars.c:377
 msgid "_Soft threshold:"
 msgstr ""
 
-#: modules/process/scars.c:361
+#: modules/process/scars.c:385
 msgid "Scars type:"
 msgstr ""
 
@@ -12222,108 +12873,157 @@ msgstr ""
 msgid "_Quality:"
 msgstr ""
 
-#: modules/process/shade.c:92
+#: modules/process/shade.c:94
 msgid "Creates a shaded presentation of data."
 msgstr ""
 
-#: modules/process/shade.c:106
+#: modules/process/shade.c:108
 msgid "/_Presentation/_Shading..."
 msgstr ""
 
-#: modules/process/shade.c:110
+#: modules/process/shade.c:112
 msgid "Shade data"
 msgstr ""
 
-#: modules/process/shade.c:207
+#: modules/process/shade.c:209
 msgid "Shading"
 msgstr ""
 
-#: modules/process/shade.c:253
+#: modules/process/shade.c:260
 msgid "_Mix:"
 msgstr ""
 
-#: modules/process/slope_dist.c:161
+#: modules/process/slope_dist.c:160
 msgid ""
 "Calculates one- or two-dimensional distribution of slopes or graph of their "
 "angular distribution."
 msgstr ""
 
-#: modules/process/slope_dist.c:176
+#: modules/process/slope_dist.c:175
 msgid "/_Statistics/_Slope Distribution..."
 msgstr ""
 
-#: modules/process/slope_dist.c:180
+#: modules/process/slope_dist.c:179
 msgid "Calculate angular slope distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:221
+#: modules/process/slope_dist.c:220
 msgid "Slope distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:253
+#: modules/process/slope_dist.c:252
 msgid "_Two-dimensional distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:254
+#: modules/process/slope_dist.c:253
 msgid "Directional (φ) _graph"
 msgstr ""
 
-#: modules/process/slope_dist.c:255
+#: modules/process/slope_dist.c:254
 msgid "_Inclination (θ) graph"
 msgstr ""
 
-#: modules/process/slope_dist.c:256
+#: modules/process/slope_dist.c:255
 msgid "Inclination (gra_dient) graph"
 msgstr ""
 
-#: modules/process/slope_dist.c:270
+#: modules/process/slope_dist.c:269
 msgid "Slope Distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:755
+#: modules/process/slope_dist.c:749
 msgid "Angular Slope Distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:763 modules/process/tilt.c:179
+#: modules/process/slope_dist.c:757 modules/process/tilt.c:179
 msgid "Slopes"
 msgstr ""
 
-#: modules/process/slope_dist.c:824 modules/process/slope_dist.c:893
+#: modules/process/slope_dist.c:818 modules/process/slope_dist.c:887
 msgid "Inclination Distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:832 modules/process/slope_dist.c:901
+#: modules/process/slope_dist.c:826 modules/process/slope_dist.c:895
 msgid "Inclinations"
 msgstr ""
 
-#: modules/process/sphere-revolve.c:97
+#: modules/process/sphere-revolve.c:111
 msgid "Subtracts background by arc or sphere revolution."
 msgstr ""
 
-#: modules/process/sphere-revolve.c:113
+#: modules/process/sphere-revolve.c:125
 msgid "/_Level/Revolve _Arc..."
 msgstr ""
 
-#: modules/process/sphere-revolve.c:117
+#: modules/process/sphere-revolve.c:129
 msgid "Level data by arc revolution"
 msgstr ""
 
-#: modules/process/sphere-revolve.c:208 modules/tools/sfunctions.c:371
+#: modules/process/sphere-revolve.c:132
+msgid "/_Level/Revolve _Sphere..."
+msgstr ""
+
+#: modules/process/sphere-revolve.c:136
+msgid "Level data by sphere revolution"
+msgstr ""
+
+#: modules/process/sphere-revolve.c:303 modules/tools/sfunctions.c:381
 msgid "_Horizontal direction"
 msgstr ""
 
-#: modules/process/sphere-revolve.c:209 modules/tools/sfunctions.c:372
+#: modules/process/sphere-revolve.c:304 modules/tools/sfunctions.c:382
 msgid "_Vertical direction"
 msgstr ""
 
-#: modules/process/sphere-revolve.c:210
+#: modules/process/sphere-revolve.c:305
 msgid "_Both directions"
 msgstr ""
 
-#: modules/process/sphere-revolve.c:217
+#: modules/process/sphere-revolve.c:315
+msgid "Revolve Sphere"
+msgstr ""
+
+#: modules/process/sphere-revolve.c:315
 msgid "Revolve Arc"
 msgstr ""
 
+#: modules/process/sphere-revolve.c:355
+msgid "Direction:"
+msgstr ""
+
+#: modules/process/sphere-revolve.c:699
+msgid "Revolving sphere..."
+msgstr ""
+
+#: modules/process/stitch.c:135
+msgid "Stitch multiple images based on offsets of origins."
+msgstr ""
+
+#: modules/process/stitch.c:149
+msgid "/M_ultidata/_Stitch..."
+msgstr ""
+
+#: modules/process/stitch.c:153
+msgid "Stitch images using offsets"
+msgstr ""
+
+#: modules/process/stitch.c:269
+msgid "Stitch"
+msgstr ""
+
+#: modules/process/stitch.c:312
+msgid "Channels"
+msgstr ""
+
+#: modules/process/stitch.c:435
+msgid "Restore"
+msgstr ""
+
+#: modules/process/stitch.c:445 modules/tools/linestats.c:379
+#: modules/tools/sfunctions.c:440 modules/tools/stats.c:406
+msgid "_Instant updates"
+msgstr ""
+
 #: modules/process/straighten_path.c:126
 msgid "Extracts a straightened part of image along a curve."
 msgstr ""
@@ -12340,28 +13040,28 @@ msgstr ""
 msgid "Straighten Path"
 msgstr ""
 
-#: modules/process/straighten_path.c:254
+#: modules/process/straighten_path.c:253
 msgid "Res_tore"
 msgstr ""
 
-#: modules/process/straighten_path.c:259
+#: modules/process/straighten_path.c:258
 msgid "Re_verse"
 msgstr ""
 
 #: modules/process/straighten_path.c:278 modules/tools/pathlevel.c:256
-#: modules/tools/profile.c:507 modules/tools/roughness.c:854
+#: modules/tools/profile.c:503 modules/tools/roughness.c:868
 msgid "_Thickness:"
 msgstr ""
 
-#: modules/process/straighten_path.c:286
+#: modules/process/straighten_path.c:287
 msgid "_Slackness:"
 msgstr ""
 
-#: modules/process/straighten_path.c:292
+#: modules/process/straighten_path.c:293
 msgid "C_losed curve"
 msgstr ""
 
-#: modules/process/straighten_path.c:379
+#: modules/process/straighten_path.c:380
 msgid "Straightened"
 msgstr ""
 
@@ -12382,52 +13082,52 @@ msgstr ""
 msgid "Supres"
 msgstr ""
 
-#: modules/process/superresolution.c:421
+#: modules/process/superresolution.c:420
 msgid "Correlating to determine mean shift..."
 msgstr ""
 
-#: modules/process/superresolution.c:511
+#: modules/process/superresolution.c:510
 msgid "Cross-correlation..."
 msgstr ""
 
-#: modules/process/superresolution.c:554 modules/xyz/xyz_raster.c:1079
-#: modules/xyz/xyz_raster.c:1119
+#: modules/process/superresolution.c:553 modules/xyz/xyz_raster.c:1053
+#: modules/xyz/xyz_raster.c:1093
 msgid "Interpolating..."
 msgstr ""
 
-#: modules/process/synth.h:343
+#: modules/process/synth.h:344
 msgid "Roundness"
 msgstr ""
 
-#: modules/process/synth.h:351
+#: modules/process/synth.h:352
 msgid "Roundn_ess:"
 msgstr ""
 
-#: modules/process/synth.h:399
+#: modules/process/synth.h:401
 msgid "Orientation"
 msgstr ""
 
-#: modules/process/synth.h:408
+#: modules/process/synth.h:410
 msgid "Orien_tation:"
 msgstr ""
 
-#: modules/process/synth.h:432
-msgid "Variance:"
+#: modules/process/synth.h:436
+msgid "_Truncate:"
 msgstr ""
 
-#: modules/process/synth.h:456
-msgid "Deformation"
+#: modules/process/synth.h:460
+msgid "Variance:"
 msgstr ""
 
-#: modules/process/synth.h:464
+#: modules/process/synth.h:493
 msgid "_Amplitude:"
 msgstr ""
 
-#: modules/process/synth.h:472
+#: modules/process/synth.h:501
 msgid "_Lateral scale:"
 msgstr ""
 
-#: modules/process/synth.h:566
+#: modules/process/synth.h:595
 msgid "Randomi_ze"
 msgstr ""
 
@@ -12443,41 +13143,41 @@ msgstr ""
 msgid "Limit data range"
 msgstr ""
 
-#: modules/process/threshold.c:246
+#: modules/process/threshold.c:241
 msgid "Limit Range"
 msgstr ""
 
-#: modules/process/threshold.c:281
+#: modules/process/threshold.c:276
 msgid "Specify _thresholds"
 msgstr ""
 
-#: modules/process/threshold.c:283
+#: modules/process/threshold.c:278
 msgid "Use _display range"
 msgstr ""
 
-#: modules/process/threshold.c:285
+#: modules/process/threshold.c:280
 msgid "Cut off outlier_s"
 msgstr ""
 
-#: modules/process/threshold.c:294
+#: modules/process/threshold.c:289
 msgid "_Lower:"
 msgstr ""
 
-#: modules/process/threshold.c:300
+#: modules/process/threshold.c:295
 msgid "_Upper:"
 msgstr ""
 
-#: modules/process/threshold.c:305
+#: modules/process/threshold.c:300
 msgid "Set to _Full Range"
 msgstr ""
 
 #. TRANSLATORS: This is a range: 123 to 456.
-#: modules/process/threshold.c:318
+#: modules/process/threshold.c:313
 #, c-format
 msgid "%.*f to %.*f"
 msgstr ""
 
-#: modules/process/threshold.c:341
+#: modules/process/threshold.c:336
 msgid "F_arther than:"
 msgstr ""
 
@@ -12497,11 +13197,11 @@ msgstr ""
 msgid "Tilt"
 msgstr ""
 
-#: modules/process/tilt.c:185 modules/volume/volume_slice.c:444
+#: modules/process/tilt.c:185 modules/volume/volume_slice.c:446
 msgid "_X:"
 msgstr ""
 
-#: modules/process/tilt.c:194 modules/volume/volume_slice.c:464
+#: modules/process/tilt.c:194 modules/volume/volume_slice.c:469
 msgid "_Y:"
 msgstr ""
 
@@ -12509,31 +13209,31 @@ msgstr ""
 msgid "Angles"
 msgstr ""
 
-#: modules/process/tip_blind.c:178
+#: modules/process/tip_blind.c:177
 msgid "Blind estimation of SPM tip using Villarubia's algorithm."
 msgstr ""
 
-#: modules/process/tip_blind.c:192
+#: modules/process/tip_blind.c:191
 msgid "/_Tip and Indentation/_Blind Estimation..."
 msgstr ""
 
-#: modules/process/tip_blind.c:196
+#: modules/process/tip_blind.c:195
 msgid "Blind tip estimation"
 msgstr ""
 
-#: modules/process/tip_blind.c:231
+#: modules/process/tip_blind.c:230
 msgid "Blind Tip Estimation"
 msgstr ""
 
-#: modules/process/tip_blind.c:232
+#: modules/process/tip_blind.c:231
 msgid "Run _Partial"
 msgstr ""
 
-#: modules/process/tip_blind.c:233
+#: modules/process/tip_blind.c:232
 msgid "Run _Full"
 msgstr ""
 
-#: modules/process/tip_blind.c:234
+#: modules/process/tip_blind.c:233
 msgid "_Reset Tip"
 msgstr ""
 
@@ -12541,77 +13241,77 @@ msgstr ""
 msgid "Related _data:"
 msgstr ""
 
-#: modules/process/tip_blind.c:326
+#: modules/process/tip_blind.c:327
 msgid "Estimated Tip Size"
 msgstr ""
 
-#: modules/process/tip_blind.c:347
+#: modules/process/tip_blind.c:350
 msgid "_Same resolution"
 msgstr ""
 
-#: modules/process/tip_blind.c:366
+#: modules/process/tip_blind.c:376
 msgid "Noise suppression t_hreshold:"
 msgstr ""
 
-#: modules/process/tip_blind.c:386
+#: modules/process/tip_blind.c:384
 msgid "Use _boundaries"
 msgstr ""
 
-#: modules/process/tip_blind.c:396
+#: modules/process/tip_blind.c:395
 msgid "Stripes"
 msgstr ""
 
-#: modules/process/tip_blind.c:402
+#: modules/process/tip_blind.c:401
 msgid "_Split to stripes:"
 msgstr ""
 
-#: modules/process/tip_blind.c:416
+#: modules/process/tip_blind.c:412
 msgid "_Preview stripe:"
 msgstr ""
 
-#: modules/process/tip_blind.c:423
+#: modules/process/tip_blind.c:420
 msgid "Plot size _graph"
 msgstr ""
 
-#: modules/process/tip_blind.c:433
+#: modules/process/tip_blind.c:430
 msgid "Create tip i_mages"
 msgstr ""
 
 #. TRANSLATORS: Prefix for the progressbar message.
-#: modules/process/tip_blind.c:810
+#: modules/process/tip_blind.c:807
 #, c-format
 msgid "Stripe %u: "
 msgstr ""
 
-#: modules/process/tip_blind.c:917 modules/process/tip_blind.c:941
+#: modules/process/tip_blind.c:914 modules/process/tip_blind.c:938
 msgid "Estimated tip"
 msgstr ""
 
-#: modules/process/tip_blind.c:1207 modules/process/tip_blind.c:1216
+#: modules/process/tip_blind.c:1204 modules/process/tip_blind.c:1213
 msgid "Tip radius evolution"
 msgstr ""
 
-#: modules/process/tip_model.c:114
+#: modules/process/tip_model.c:112
 msgid "Models SPM tip."
 msgstr ""
 
-#: modules/process/tip_model.c:129
+#: modules/process/tip_model.c:127
 msgid "/_Tip and Indentation/_Model Tip..."
 msgstr ""
 
-#: modules/process/tip_model.c:133
+#: modules/process/tip_model.c:131
 msgid "Model AFM tip"
 msgstr ""
 
-#: modules/process/tip_model.c:164
+#: modules/process/tip_model.c:162
 msgid "Model Tip"
 msgstr ""
 
-#: modules/process/tip_model.c:224
+#: modules/process/tip_model.c:222
 msgid "Tip _type:"
 msgstr ""
 
-#: modules/process/tip_model.c:229
+#: modules/process/tip_model.c:228
 msgid "_Number of sides:"
 msgstr ""
 
@@ -12623,19 +13323,19 @@ msgstr ""
 msgid "Tip _rotation:"
 msgstr ""
 
-#: modules/process/tip_model.c:250
+#: modules/process/tip_model.c:255
 msgid "Tip _apex radius:"
 msgstr ""
 
-#: modules/process/tip_model.c:269
+#: modules/process/tip_model.c:265
 msgid "Tip _anisotropy:"
 msgstr ""
 
-#: modules/process/tip_model.c:490
+#: modules/process/tip_model.c:484
 msgid "Modeled tip"
 msgstr ""
 
-#: modules/process/tip_model.c:562
+#: modules/process/tip_model.c:556
 #, c-format
 msgid "Tip resolution: %d × %d pixels"
 msgstr ""
@@ -12739,7 +13439,7 @@ msgid "Converts datafield to 3D volume data."
 msgstr ""
 
 #: modules/process/volumize.c:56
-msgid "/_Basic Operations/Volumize..."
+msgid "/_Basic Operations/Volumize"
 msgstr ""
 
 #: modules/process/volumize.c:60
@@ -12782,73 +13482,77 @@ msgstr ""
 msgid "Z _range:"
 msgstr ""
 
-#: modules/process/wave_synth.c:211
+#: modules/process/wave_synth.c:219
 msgid "Generates various kinds of waves."
 msgstr ""
 
-#: modules/process/wave_synth.c:225
+#: modules/process/wave_synth.c:233
 msgid "/S_ynthetic/_Waves..."
 msgstr ""
 
-#: modules/process/wave_synth.c:229
+#: modules/process/wave_synth.c:237
 msgid "Generate waves"
 msgstr ""
 
-#: modules/process/wave_synth.c:347
+#: modules/process/wave_synth.c:366
 msgid "Waves"
 msgstr ""
 
-#: modules/process/wave_synth.c:422 modules/tools/linestats.c:337
-#: modules/tools/sfunctions.c:401 modules/volume/volume_linestat.c:369
+#: modules/process/wave_synth.c:441 modules/tools/linestats.c:337
+#: modules/tools/sfunctions.c:411 modules/volume/volume_linestat.c:374
 msgid "_Quantity:"
 msgstr ""
 
-#: modules/process/wave_synth.c:429
+#: modules/process/wave_synth.c:448
 msgid "_Number of waves:"
 msgstr ""
 
-#: modules/process/wave_synth.c:436 modules/process/wave_synth.c:582
-#: modules/tools/roughness.c:274
+#: modules/process/wave_synth.c:455 modules/process/wave_synth.c:617
+#: modules/tools/roughness.c:275
 msgid "Amplitude"
 msgstr ""
 
-#: modules/process/wave_synth.c:441
+#: modules/process/wave_synth.c:460
 msgid "_Wave form:"
 msgstr ""
 
-#: modules/process/wave_synth.c:448
+#: modules/process/wave_synth.c:467
 msgid "Amplitude:"
 msgstr ""
 
-#: modules/process/wave_synth.c:466
+#: modules/process/wave_synth.c:487
+msgid "_Decay:"
+msgstr ""
+
+#: modules/process/wave_synth.c:497
 msgid "Frequency"
 msgstr ""
 
-#: modules/process/wave_synth.c:472
+#: modules/process/wave_synth.c:503
 msgid "_Spatial frequency:"
 msgstr ""
 
-#: modules/process/wave_synth.c:488
+#: modules/process/wave_synth.c:519
 msgid "_X center:"
 msgstr ""
 
-#: modules/process/wave_synth.c:499
+#: modules/process/wave_synth.c:532
 msgid "_Y center:"
 msgstr ""
 
-#: modules/process/wave_synth.c:565
+#: modules/process/wave_synth.c:600
 msgid "Cosine"
 msgstr ""
 
-#: modules/process/wave_synth.c:566
+#: modules/process/wave_synth.c:601
 msgid "Inverse cosh"
 msgstr ""
 
-#: modules/process/wave_synth.c:567
+#: modules/process/wave_synth.c:602
 msgid "Flat top"
 msgstr ""
 
-#: modules/process/wave_synth.c:581
+#: modules/process/wave_synth.c:616
 msgid "Displacement"
 msgstr ""
 
@@ -12932,39 +13636,39 @@ msgstr ""
 msgid "Preprocess and mark"
 msgstr ""
 
-#: modules/process/xydenoise.c:57
+#: modules/process/xydenoise.c:58
 msgid "Denoises measurement on basis of two orthogonal scans."
 msgstr ""
 
-#: modules/process/xydenoise.c:71
+#: modules/process/xydenoise.c:72
 msgid "/M_ultidata/_XY denoise..."
 msgstr ""
 
-#: modules/process/xydenoise.c:75
+#: modules/process/xydenoise.c:76
 msgid "Denoises horizontal/vertical measurement."
 msgstr ""
 
-#: modules/process/xydenoise.c:102
+#: modules/process/xydenoise.c:103
 msgid "XY Denoising"
 msgstr ""
 
-#: modules/process/xydenoise.c:124
+#: modules/process/xydenoise.c:125
 msgid "Second direction:"
 msgstr ""
 
-#: modules/process/xydenoise.c:232
+#: modules/process/xydenoise.c:233
 msgid "Computing forward FFTs..."
 msgstr ""
 
-#: modules/process/xydenoise.c:248
+#: modules/process/xydenoise.c:249
 msgid "Computing image..."
 msgstr ""
 
-#: modules/process/xydenoise.c:260
+#: modules/process/xydenoise.c:261
 msgid "Computing backward FFT..."
 msgstr ""
 
-#: modules/process/xydenoise.c:272
+#: modules/process/xydenoise.c:273
 msgid "Denoised"
 msgstr ""
 
@@ -12980,63 +13684,67 @@ msgstr ""
 msgid "Convert to XYZ data"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:55
+#: modules/pygwy/pygwy-console.c:99
 msgid "/Pygwy Console"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:59
+#: modules/pygwy/pygwy-console.c:103
 msgid "Python wrapper console"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:142
-msgid ">>> Running the script above\n"
+#: modules/pygwy/pygwy-console.c:168 modules/pygwy/pygwy-console.c:481
+msgid "Pygwy Console"
+msgstr ""
+
+#: modules/pygwy/pygwy-console.c:187
+msgid "Open script in Python language (Ctrl-O)"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:194
-msgid "Open Python script"
+#: modules/pygwy/pygwy-console.c:197
+msgid "Save script (Ctrl-S)"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:275
-msgid "Save Script as"
+#: modules/pygwy/pygwy-console.c:207
+msgid "Save script as (Ctrl-Shift-S)"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:327
-msgid "Pygwy Console"
+#: modules/pygwy/pygwy-console.c:217
+msgid "Execute script (Ctrl-E)"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:340
+#: modules/pygwy/pygwy-console.c:227
 msgid "Clear Log"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:344
-msgid "Open script in Python language (Ctrl-O)"
+#: modules/pygwy/pygwy-console.c:285
+msgid "Command"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:346
-msgid "Save script (Ctrl-S)"
+#: modules/pygwy/pygwy-console.c:371
+msgid ">>> Running the script above\n"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:348
-msgid "Execute script (Ctrl-E)"
+#: modules/pygwy/pygwy-console.c:425
+msgid "Save Python Script as"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:426
-msgid "Command"
+#: modules/pygwy/pygwy-console.c:429
+msgid "Open Python Script"
 msgstr ""
 
-#: pygwy.c:120
+#: pygwy.c:130
 msgid "Pygwy, the Gwyddion Python wrapper."
 msgstr ""
 
-#: pygwy.c:258
+#: pygwy.c:269
 msgid "Python Interpreter Errors"
 msgstr ""
 
-#: pygwy.c:384
+#: pygwy.c:399
 msgid "Python interpreter error occurred."
 msgstr ""
 
-#: pygwy.c:459
+#: pygwy.c:499
 msgid "Function written in Python"
 msgstr ""
 
@@ -13061,37 +13769,37 @@ msgid "Measure distances and directions between points"
 msgstr ""
 
 #. TRANSLATORS: Number is verb here.
-#: modules/tools/distance.c:250 modules/tools/profile.c:532
+#: modules/tools/distance.c:250 modules/tools/profile.c:527
 msgid "_Number lines"
 msgstr ""
 
-#: modules/tools/filter.c:128
+#: modules/tools/filter.c:129
 msgid ""
 "Filter tool, processes selected part of data with a filter (conservative "
 "denoise, mean, median. Kuwahara, minimum, maximum)."
 msgstr ""
 
-#: modules/tools/filter.c:171
+#: modules/tools/filter.c:172
 msgid "Basic filters: mean, median, denoise, …"
 msgstr ""
 
-#: modules/tools/filter.c:239
+#: modules/tools/filter.c:240
 msgid "Conservative denoise"
 msgstr ""
 
-#: modules/tools/filter.c:246
+#: modules/tools/filter.c:247
 msgid "Kuwahara"
 msgstr ""
 
-#: modules/tools/filter.c:247
+#: modules/tools/filter.c:248
 msgid "Dechecker"
 msgstr ""
 
-#: modules/tools/filter.c:248
+#: modules/tools/filter.c:249
 msgid "filter|Gaussian"
 msgstr ""
 
-#: modules/tools/filter.c:249
+#: modules/tools/filter.c:250
 msgid "Sharpen"
 msgstr ""
 
@@ -13181,7 +13889,7 @@ msgid "Height histogram"
 msgstr ""
 
 #: modules/tools/icolorange.c:329 modules/tools/linestats.c:169
-#: modules/tools/sfunctions.c:226 modules/volume/volume_linestat.c:146
+#: modules/tools/sfunctions.c:231 modules/volume/volume_linestat.c:148
 msgid "Range"
 msgstr ""
 
@@ -13209,29 +13917,29 @@ msgstr ""
 msgid "range|Full"
 msgstr ""
 
-#: modules/tools/level3.c:106
+#: modules/tools/level3.c:108
 msgid ""
 "Three-point level tool, levels data by subtracting a plane fitted through "
 "three selected points."
 msgstr ""
 
-#: modules/tools/level3.c:143
+#: modules/tools/level3.c:145
 msgid "Three Point Level"
 msgstr ""
 
-#: modules/tools/level3.c:144
+#: modules/tools/level3.c:146
 msgid "Level data by fitting a plane through three points"
 msgstr ""
 
-#: modules/tools/level3.c:239 modules/tools/readvalue.c:375
+#: modules/tools/level3.c:244 modules/tools/readvalue.c:378
 msgid "_Averaging radius:"
 msgstr ""
 
-#: modules/tools/level3.c:246
+#: modules/tools/level3.c:251
 msgid "_Instant apply"
 msgstr ""
 
-#: modules/tools/level3.c:255
+#: modules/tools/level3.c:261
 msgid "Set plane to _zero"
 msgstr ""
 
@@ -13241,23 +13949,23 @@ msgid ""
 "RMS, ..., of rows or columns."
 msgstr ""
 
-#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:148
+#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:150
 msgid "tan β<sub>0</sub>"
 msgstr ""
 
-#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:150
+#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:152
 msgid "Ra"
 msgstr ""
 
-#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:151
+#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:153
 msgid "Rq (RMS)"
 msgstr ""
 
-#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:152
+#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:154
 msgid "Rz"
 msgstr ""
 
-#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:153
+#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:155
 msgid "Rt"
 msgstr ""
 
@@ -13281,16 +13989,11 @@ msgstr ""
 msgid "Average:"
 msgstr ""
 
-#: modules/tools/linestats.c:363 modules/tools/profile.c:464
-#: modules/tools/sfunctions.c:414 modules/tools/spectro.c:343
+#: modules/tools/linestats.c:363 modules/tools/profile.c:460
+#: modules/tools/sfunctions.c:424 modules/tools/spectro.c:346
 msgid "<b>Options</b>"
 msgstr ""
 
-#: modules/tools/linestats.c:379 modules/tools/sfunctions.c:430
-#: modules/tools/stats.c:408
-msgid "_Instant updates"
-msgstr ""
-
 #: modules/tools/maskedit.c:170
 msgid "Mask editor tool, allows interactive modification of parts of the mask."
 msgstr ""
@@ -13347,63 +14050,63 @@ msgstr ""
 msgid "Erase continuous parts of mask"
 msgstr ""
 
-#: modules/tools/maskedit.c:408
+#: modules/tools/maskedit.c:409
 msgid "Editor"
 msgstr ""
 
-#: modules/tools/maskedit.c:413
+#: modules/tools/maskedit.c:414
 msgid "_Shapes"
 msgstr ""
 
-#: modules/tools/maskedit.c:423
+#: modules/tools/maskedit.c:428
 msgid "Mode:"
 msgstr ""
 
-#: modules/tools/maskedit.c:452
+#: modules/tools/maskedit.c:458
 msgid "Shape:"
 msgstr ""
 
-#: modules/tools/maskedit.c:483
+#: modules/tools/maskedit.c:486
 msgid "_Drawing Tools"
 msgstr ""
 
-#: modules/tools/maskedit.c:493
+#: modules/tools/maskedit.c:500
 msgid "Tool:"
 msgstr ""
 
-#: modules/tools/maskedit.c:532
+#: modules/tools/maskedit.c:538
 msgid "Actions"
 msgstr ""
 
-#: modules/tools/maskedit.c:540
+#: modules/tools/maskedit.c:546
 msgid "_Invert"
 msgstr ""
 
-#: modules/tools/maskedit.c:571
+#: modules/tools/maskedit.c:577
 msgid "Fill _Voids"
 msgstr ""
 
-#: modules/tools/maskedit.c:580
+#: modules/tools/maskedit.c:586
 msgid "Fill non-simple-connected"
 msgstr ""
 
-#: modules/tools/maskedit.c:591
+#: modules/tools/maskedit.c:597
 msgid "Grow/Shrink"
 msgstr ""
 
-#: modules/tools/maskedit.c:600
+#: modules/tools/maskedit.c:606
 msgid "_Grow"
 msgstr ""
 
-#: modules/tools/maskedit.c:608
+#: modules/tools/maskedit.c:614
 msgid "Shrin_k"
 msgstr ""
 
-#: modules/tools/maskedit.c:623
+#: modules/tools/maskedit.c:629
 msgid "_Amount:"
 msgstr ""
 
-#: modules/tools/maskedit.c:651
+#: modules/tools/maskedit.c:657
 msgid "_Prevent grain merging by growing"
 msgstr ""
 
@@ -13419,83 +14122,95 @@ msgstr ""
 msgid "Level rows using intersections with given lines"
 msgstr ""
 
-#: modules/tools/profile.c:222
+#: modules/tools/profile.c:216
 msgid "Profile tool, creates profile graphs from selected lines."
 msgstr ""
 
-#: modules/tools/profile.c:276 modules/tools/profile.c:630
+#: modules/tools/profile.c:270 modules/tools/profile.c:609
 msgid "Profiles"
 msgstr ""
 
-#: modules/tools/profile.c:277
+#: modules/tools/profile.c:271
 msgid "Extract profiles"
 msgstr ""
 
-#: modules/tools/profile.c:480
-msgid "_Radial profiles"
-msgstr ""
-
-#: modules/tools/profile.c:493
-msgid "Symmetrize _All"
+#: modules/tools/profile.c:478
+msgid "Linear profiles"
 msgstr ""
 
-#: modules/tools/profile.c:498
-msgid "S_ymmetrize"
+#: modules/tools/profile.c:480
+msgid "Radial profiles"
 msgstr ""
 
-#: modules/tools/profile.c:542
+#: modules/tools/profile.c:537
 msgid "_Separate profiles"
 msgstr ""
 
-#: modules/tools/profile.c:607
+#: modules/tools/profile.c:587
 msgid "_Calibration data:"
 msgstr ""
 
-#: modules/tools/profile.c:620
+#: modules/tools/profile.c:600
 msgid "_Show profile"
 msgstr ""
 
-#: modules/tools/profile.c:887
+#: modules/tools/profile.c:861
 #, c-format
 msgid "X error %d"
 msgstr ""
 
-#: modules/tools/profile.c:891
+#: modules/tools/profile.c:865
 #, c-format
 msgid "Y error %d"
 msgstr ""
 
-#: modules/tools/profile.c:895
+#: modules/tools/profile.c:869
 #, c-format
 msgid "Z error %d"
 msgstr ""
 
-#: modules/tools/profile.c:899
+#: modules/tools/profile.c:873
 #, c-format
 msgid "X uncertainty %d"
 msgstr ""
 
-#: modules/tools/profile.c:903
+#: modules/tools/profile.c:877
 #, c-format
 msgid "Y uncertainty %d"
 msgstr ""
 
-#: modules/tools/profile.c:907
+#: modules/tools/profile.c:881
 #, c-format
 msgid "Z uncertainty %d"
 msgstr ""
 
-#: modules/tools/profile.c:912
+#: modules/tools/profile.c:886
 #, c-format
 msgid "Zunc up bound %d"
 msgstr ""
 
-#: modules/tools/profile.c:917
+#: modules/tools/profile.c:891
 #, c-format
 msgid "Zunc low bound %d"
 msgstr ""
 
-#: modules/tools/profile.c:1817
+#: modules/tools/profile.c:1637
+msgid "S_ymmetrize"
+msgstr ""
+
+#: modules/tools/profile.c:1639
+msgid "Symmetrize _All"
+msgstr ""
+
+#: modules/tools/profile.c:1643
+msgid "Improve _Direction"
+msgstr ""
+
+#: modules/tools/profile.c:1645
+msgid "Improve _All"
+msgstr ""
+
+#: modules/tools/profile.c:1866
 msgid "calib-data|None"
 msgstr ""
 
@@ -13511,194 +14226,194 @@ msgstr ""
 msgid "Read value under mouse cursor"
 msgstr ""
 
-#: modules/tools/readvalue.c:304
+#: modules/tools/readvalue.c:307
 msgid "Set _Zero"
 msgstr ""
 
-#: modules/tools/readvalue.c:307
+#: modules/tools/readvalue.c:310
 msgid "Shift plane z=0 to pass through the selected point"
 msgstr ""
 
-#: modules/tools/readvalue.c:315
+#: modules/tools/readvalue.c:318
 msgid "Facet"
 msgstr ""
 
-#: modules/tools/readvalue.c:340
+#: modules/tools/readvalue.c:343
 msgid "Curvatures"
 msgstr ""
 
-#: modules/tools/readvalue.c:382
+#: modules/tools/readvalue.c:386
 msgid "Show _selection"
 msgstr ""
 
-#: modules/tools/roughness.c:282
+#: modules/tools/roughness.c:283
 msgid "Roughness average"
 msgstr ""
 
-#: modules/tools/roughness.c:290
+#: modules/tools/roughness.c:291
 msgid "Root mean square roughness"
 msgstr ""
 
-#: modules/tools/roughness.c:298
+#: modules/tools/roughness.c:299
 msgid "Maximum height of the roughness"
 msgstr ""
 
-#: modules/tools/roughness.c:306
+#: modules/tools/roughness.c:307
 msgid "Maximum roughness valley depth"
 msgstr ""
 
-#: modules/tools/roughness.c:314
+#: modules/tools/roughness.c:315
 msgid "Maximum roughness peak height"
 msgstr ""
 
-#: modules/tools/roughness.c:322 modules/tools/roughness.c:370
+#: modules/tools/roughness.c:323 modules/tools/roughness.c:371
 msgid "Average maximum height of the roughness"
 msgstr ""
 
-#: modules/tools/roughness.c:330
+#: modules/tools/roughness.c:331
 msgid "Average maximum roughness valley depth"
 msgstr ""
 
-#: modules/tools/roughness.c:338
+#: modules/tools/roughness.c:339
 msgid "Average maximum roughness peak height"
 msgstr ""
 
-#: modules/tools/roughness.c:346 modules/tools/roughness.c:354
+#: modules/tools/roughness.c:347 modules/tools/roughness.c:355
 msgid "Average third highest peak to third lowest valley height"
 msgstr ""
 
-#: modules/tools/roughness.c:362
+#: modules/tools/roughness.c:363
 msgid "Average maximum height of the profile"
 msgstr ""
 
-#: modules/tools/roughness.c:378
+#: modules/tools/roughness.c:379
 msgid "Skewness"
 msgstr ""
 
-#: modules/tools/roughness.c:394
+#: modules/tools/roughness.c:395
 msgid "Waviness average"
 msgstr ""
 
-#: modules/tools/roughness.c:402
+#: modules/tools/roughness.c:403
 msgid "Root mean square waviness"
 msgstr ""
 
-#: modules/tools/roughness.c:410
+#: modules/tools/roughness.c:411
 msgid "Waviness maximum height"
 msgstr ""
 
-#: modules/tools/roughness.c:418
+#: modules/tools/roughness.c:419
 msgid "Maximum height of the profile"
 msgstr ""
 
-#: modules/tools/roughness.c:426
+#: modules/tools/roughness.c:427
 msgid "Spatial"
 msgstr ""
 
-#: modules/tools/roughness.c:476
+#: modules/tools/roughness.c:477
 msgid "Average wavelength of the profile"
 msgstr ""
 
-#: modules/tools/roughness.c:484
+#: modules/tools/roughness.c:485
 msgid "Root mean square (RMS) wavelength of the profile"
 msgstr ""
 
-#: modules/tools/roughness.c:492
+#: modules/tools/roughness.c:493
 msgid "Hybrid"
 msgstr ""
 
-#: modules/tools/roughness.c:500
+#: modules/tools/roughness.c:501
 msgid "Average absolute slope"
 msgstr ""
 
-#: modules/tools/roughness.c:508
+#: modules/tools/roughness.c:509
 msgid "Root mean square (RMS) slope"
 msgstr ""
 
-#: modules/tools/roughness.c:524
+#: modules/tools/roughness.c:525
 msgid "Developed profile length"
 msgstr ""
 
-#: modules/tools/roughness.c:532
+#: modules/tools/roughness.c:533
 msgid "Profile length ratio"
 msgstr ""
 
-#: modules/tools/roughness.c:615
+#: modules/tools/roughness.c:616
 msgid "Calculate surface profile parameters."
 msgstr ""
 
-#: modules/tools/roughness.c:648 modules/tools/roughness.c:773
-#: modules/tools/roughness.c:1452
+#: modules/tools/roughness.c:649 modules/tools/roughness.c:774
+#: modules/tools/roughness.c:1479
 msgid "Roughness"
 msgstr ""
 
-#: modules/tools/roughness.c:649
+#: modules/tools/roughness.c:650
 msgid "Calculate roughness parameters"
 msgstr ""
 
-#: modules/tools/roughness.c:771 modules/tools/roughness.c:1450
+#: modules/tools/roughness.c:772 modules/tools/roughness.c:1477
 msgid "Texture"
 msgstr ""
 
-#: modules/tools/roughness.c:772 modules/tools/roughness.c:1451
+#: modules/tools/roughness.c:773 modules/tools/roughness.c:1478
 msgid "Waviness"
 msgstr ""
 
-#: modules/tools/roughness.c:774
+#: modules/tools/roughness.c:775
 msgid "ADF"
 msgstr ""
 
-#: modules/tools/roughness.c:775
+#: modules/tools/roughness.c:776
 msgid "BRC"
 msgstr ""
 
-#: modules/tools/roughness.c:776 modules/tools/roughness.c:1455
+#: modules/tools/roughness.c:777 modules/tools/roughness.c:1482
 msgid "Peak Count"
 msgstr ""
 
-#: modules/tools/roughness.c:838 modules/xyz/xyz_drift.c:1090
+#: modules/tools/roughness.c:839 modules/xyz/xyz_drift.c:1090
 msgid "_Graph:"
 msgstr ""
 
-#: modules/tools/roughness.c:845
+#: modules/tools/roughness.c:847
 msgid "C_ut-off:"
 msgstr ""
 
-#: modules/tools/roughness.c:1324
+#: modules/tools/roughness.c:1345
 msgid "No profile selected."
 msgstr ""
 
-#: modules/tools/roughness.c:1453
+#: modules/tools/roughness.c:1480
 msgid "Amplitude Distribution Function"
 msgstr ""
 
-#: modules/tools/roughness.c:1454
+#: modules/tools/roughness.c:1481
 msgid "The Bearing Ratio Curve"
 msgstr ""
 
-#: modules/tools/roughness.c:1489
+#: modules/tools/roughness.c:1516
 msgid "Surface Profiles"
 msgstr ""
 
-#: modules/tools/roughness.c:1877
+#: modules/tools/roughness.c:1904
 msgid "Save Roughness Parameters"
 msgstr ""
 
-#: modules/tools/roughness.c:1934
+#: modules/tools/roughness.c:1961
 msgid "Roughness Parameters"
 msgstr ""
 
-#: modules/tools/roughness.c:1940
+#: modules/tools/roughness.c:1967
 #, c-format
 msgid "File:              %s\n"
 msgstr ""
 
-#: modules/tools/roughness.c:1944
+#: modules/tools/roughness.c:1971
 #, c-format
 msgid "Data channel:      %s\n"
 msgstr ""
 
-#: modules/tools/roughness.c:1975
+#: modules/tools/roughness.c:2002
 #, c-format
 msgid ""
 "Selected line:     (%s, %s) to (%s, %s) px\n"
@@ -13733,94 +14448,98 @@ msgstr ""
 msgid "_Copy"
 msgstr ""
 
-#: modules/tools/sfunctions.c:181
+#: modules/tools/sfunctions.c:186
 msgid ""
 "Statistical function tool, calculates one-dimensional statistical functions "
 "(height distribution, correlations, PSDF, Minkowski functionals) of selected "
 "part of data."
 msgstr ""
 
-#: modules/tools/sfunctions.c:214
+#: modules/tools/sfunctions.c:219
 msgid "Height distribution"
 msgstr ""
 
-#: modules/tools/sfunctions.c:215
+#: modules/tools/sfunctions.c:220
 msgid "Cum. height distribution"
 msgstr ""
 
-#: modules/tools/sfunctions.c:216
+#: modules/tools/sfunctions.c:221
 msgid "Distribution of angles"
 msgstr ""
 
-#: modules/tools/sfunctions.c:217
+#: modules/tools/sfunctions.c:222
 msgid "Cum. distribution of angles"
 msgstr ""
 
-#: modules/tools/sfunctions.c:218
+#: modules/tools/sfunctions.c:223
 msgid "ACF"
 msgstr ""
 
-#: modules/tools/sfunctions.c:219
+#: modules/tools/sfunctions.c:224
 msgid "HHCF"
 msgstr ""
 
-#: modules/tools/sfunctions.c:220
+#: modules/tools/sfunctions.c:225
 msgid "PSDF"
 msgstr ""
 
-#: modules/tools/sfunctions.c:221
+#: modules/tools/sfunctions.c:226
 msgid "Radial PSDF"
 msgstr ""
 
-#: modules/tools/sfunctions.c:222
+#: modules/tools/sfunctions.c:227
 msgid "Radial ACF"
 msgstr ""
 
-#: modules/tools/sfunctions.c:223
+#: modules/tools/sfunctions.c:228
 msgid "Minkowski volume"
 msgstr ""
 
-#: modules/tools/sfunctions.c:224
+#: modules/tools/sfunctions.c:229
 msgid "Minkowski boundary"
 msgstr ""
 
-#: modules/tools/sfunctions.c:225
+#: modules/tools/sfunctions.c:230
 msgid "Minkowski connectivity"
 msgstr ""
 
-#: modules/tools/sfunctions.c:251
+#: modules/tools/sfunctions.c:232
+msgid "Area scale graph"
+msgstr ""
+
+#: modules/tools/sfunctions.c:257
 msgid "Statistical Functions"
 msgstr ""
 
-#: modules/tools/sfunctions.c:252
+#: modules/tools/sfunctions.c:258
 msgid "Calculate 1D statistical functions"
 msgstr ""
 
-#: modules/tools/sfunctions.c:504
+#: modules/tools/sfunctions.c:501
 msgid "_Separate uncertainty"
 msgstr ""
 
-#: modules/tools/spectro.c:151
+#: modules/tools/spectro.c:154
 msgid "Point Spectrum, extracts point spectra to a graph."
 msgstr ""
 
-#: modules/tools/spectro.c:190
+#: modules/tools/spectro.c:193
 msgid "Point Spectroscopy"
 msgstr ""
 
-#: modules/tools/spectro.c:191
+#: modules/tools/spectro.c:194
 msgid "Extract and view point spectroscopy data"
 msgstr ""
 
-#: modules/tools/spectro.c:359
+#: modules/tools/spectro.c:362
 msgid "_Separate spectra"
 msgstr ""
 
-#: modules/tools/spectro.c:369
+#: modules/tools/spectro.c:372
 msgid "_Average spectra"
 msgstr ""
 
-#: modules/tools/spectro.c:508
+#: modules/tools/spectro.c:511
 msgid "Spectroscopy"
 msgstr ""
 
@@ -13858,14 +14577,6 @@ msgstr ""
 msgid "No area in the zoom selected."
 msgstr ""
 
-#: modules/tools/stats.c:205
-msgid "Average value:"
-msgstr ""
-
-#: modules/tools/stats.c:206
-msgid "Median:"
-msgstr ""
-
 #: modules/tools/stats.c:207
 msgid "Ra (Sa):"
 msgstr ""
@@ -13878,14 +14589,6 @@ msgstr ""
 msgid "Rms (grain-wise):"
 msgstr ""
 
-#: modules/tools/stats.c:210
-msgid "Skew:"
-msgstr ""
-
-#: modules/tools/stats.c:211
-msgid "Kurtosis:"
-msgstr ""
-
 #: modules/tools/stats.c:212
 msgid "Surface area:"
 msgstr ""
@@ -13894,10 +14597,6 @@ msgstr ""
 msgid "Projected area:"
 msgstr ""
 
-#: modules/tools/stats.c:214
-msgid "Variation:"
-msgstr ""
-
 #: modules/tools/stats.c:217
 msgid "Inclination θ:"
 msgstr ""
@@ -13910,7 +14609,7 @@ msgstr ""
 msgid "Statistics tool."
 msgstr ""
 
-#: modules/tools/stats.c:261 modules/tools/stats.c:1095
+#: modules/tools/stats.c:261 modules/tools/stats.c:1091
 msgid "Statistical Quantities"
 msgstr ""
 
@@ -13918,29 +14617,29 @@ msgstr ""
 msgid "Statistical quantities"
 msgstr ""
 
-#: modules/tools/stats.c:1002
+#: modules/tools/stats.c:998
 msgid "Save Statistical Quantities"
 msgstr ""
 
-#: modules/tools/stats.c:1100
+#: modules/tools/stats.c:1096
 #, c-format
 msgid "File:         %s\n"
 msgstr ""
 
-#: modules/tools/stats.c:1104
+#: modules/tools/stats.c:1100
 #, c-format
 msgid "Data channel: %s\n"
 msgstr ""
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "Yes"
 msgstr ""
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "No"
 msgstr ""
 
-#: modules/tools/stats.c:1132
+#: modules/tools/stats.c:1128
 #, c-format
 msgid ""
 "Selected area: %s × %s at (%s, %s) px\n"
@@ -13960,182 +14659,178 @@ msgstr ""
 msgid "Volume Dimensions and Units"
 msgstr ""
 
-#: modules/volume/volume_calibrate.c:526
+#: modules/volume/volume_calibrate.c:486
 msgid "_Value range:"
 msgstr ""
 
-#: modules/volume/volume_calibrate.c:555
+#: modules/volume/volume_calibrate.c:508
 msgid "Value shi_ft:"
 msgstr ""
 
-#: modules/volume/volume_calibrate.c:601
+#: modules/volume/volume_calibrate.c:542
 msgid "_Value calibration factor:"
 msgstr ""
 
-#: modules/volume/volume_extract.c:223
+#: modules/volume/volume_extract.c:216
 msgid "Shows and/or extracts a section of volume data"
 msgstr ""
 
-#: modules/volume/volume_extract.c:237
-msgid "/Show and _extract..."
+#: modules/volume/volume_extract.c:230
+msgid "/Show and _Extract..."
 msgstr ""
 
-#: modules/volume/volume_extract.c:241
+#: modules/volume/volume_extract.c:234
 msgid "Show and/or extract a section of volume data"
 msgstr ""
 
-#: modules/volume/volume_extract.c:270
+#: modules/volume/volume_extract.c:263
 msgid "X cross-section"
 msgstr ""
 
-#: modules/volume/volume_extract.c:271
+#: modules/volume/volume_extract.c:264
 msgid "Y cross-section"
 msgstr ""
 
-#: modules/volume/volume_extract.c:272
+#: modules/volume/volume_extract.c:265
 msgid "Z cross-section"
 msgstr ""
 
-#: modules/volume/volume_extract.c:273 modules/volume/volume_extract.c:698
+#: modules/volume/volume_extract.c:266 modules/volume/volume_extract.c:684
 msgid "X direction sum"
 msgstr ""
 
-#: modules/volume/volume_extract.c:274 modules/volume/volume_extract.c:700
+#: modules/volume/volume_extract.c:267 modules/volume/volume_extract.c:686
 msgid "Y direction sum"
 msgstr ""
 
-#: modules/volume/volume_extract.c:275 modules/volume/volume_extract.c:702
+#: modules/volume/volume_extract.c:268 modules/volume/volume_extract.c:688
 msgid "Z direction sum"
 msgstr ""
 
-#: modules/volume/volume_extract.c:278
+#: modules/volume/volume_extract.c:271
 msgid "X direction"
 msgstr ""
 
-#: modules/volume/volume_extract.c:279
+#: modules/volume/volume_extract.c:272
 msgid "Y direction"
 msgstr ""
 
-#: modules/volume/volume_extract.c:280
+#: modules/volume/volume_extract.c:273
 msgid "Z direction"
 msgstr ""
 
-#: modules/volume/volume_extract.c:322
+#: modules/volume/volume_extract.c:315
 msgid "Volume data"
 msgstr ""
 
-#: modules/volume/volume_extract.c:324
+#: modules/volume/volume_extract.c:317
 msgid "_Load"
 msgstr ""
 
-#: modules/volume/volume_extract.c:336
+#: modules/volume/volume_extract.c:329
 msgid "_Extract projection"
 msgstr ""
 
-#: modules/volume/volume_extract.c:354
+#: modules/volume/volume_extract.c:347
 msgid "Projections"
 msgstr ""
 
-#: modules/volume/volume_extract.c:404
+#: modules/volume/volume_extract.c:395
 msgid "Z position"
 msgstr ""
 
-#: modules/volume/volume_extract.c:409
+#: modules/volume/volume_extract.c:405
 msgid "Shown cut direction:"
 msgstr ""
 
-#: modules/volume/volume_extract.c:419 modules/volume/volume_extract.c:500
-msgid "Show mode:"
-msgstr ""
-
-#: modules/volume/volume_extract.c:490
+#: modules/volume/volume_extract.c:485
 msgid "Graph cut direction:"
 msgstr ""
 
-#: modules/volume/volume_extract.c:525
+#: modules/volume/volume_extract.c:511
 msgid "3D view"
 msgstr ""
 
-#: modules/volume/volume_extract.c:550
+#: modules/volume/volume_extract.c:538
 msgid "Zoom"
 msgstr ""
 
-#: modules/volume/volume_extract.c:558
+#: modules/volume/volume_extract.c:545
 msgid "Wireframe threshold"
 msgstr ""
 
-#: modules/volume/volume_extract.c:566
+#: modules/volume/volume_extract.c:552
 msgid "Z scale"
 msgstr ""
 
-#: modules/volume/volume_extract.c:574
+#: modules/volume/volume_extract.c:559
 msgid "Opacity scale"
 msgstr ""
 
-#: modules/volume/volume_extract.c:580
-msgid "apply perspective"
+#: modules/volume/volume_extract.c:565
+msgid "Apply perspective"
 msgstr ""
 
-#: modules/volume/volume_extract.c:589
-msgid "instant 3D render"
+#: modules/volume/volume_extract.c:574
+msgid "Instant 3D render"
 msgstr ""
 
-#: modules/volume/volume_extract.c:598
+#: modules/volume/volume_extract.c:587
 msgid "X view"
 msgstr ""
 
-#: modules/volume/volume_extract.c:604
+#: modules/volume/volume_extract.c:592
 msgid "Y view"
 msgstr ""
 
-#: modules/volume/volume_extract.c:610
+#: modules/volume/volume_extract.c:597
 msgid "Z view"
 msgstr ""
 
-#: modules/volume/volume_extract.c:683
+#: modules/volume/volume_extract.c:669
 #, c-format
 msgid "X cross-section at x: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:686
+#: modules/volume/volume_extract.c:672
 #, c-format
 msgid "Y cross-section at y: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:690
+#: modules/volume/volume_extract.c:676
 #, c-format
 msgid "Z cross-section at Z = %g %s (#%d)"
 msgstr ""
 
-#: modules/volume/volume_extract.c:749 modules/volume/volume_slice.c:1264
+#: modules/volume/volume_extract.c:735 modules/volume/volume_slice.c:1278
 #, c-format
 msgid "X graph at y: %d z: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:752 modules/volume/volume_slice.c:1273
+#: modules/volume/volume_extract.c:738 modules/volume/volume_slice.c:1287
 #, c-format
 msgid "Y graph at x: %d z: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:755 modules/volume/volume_slice.c:1255
+#: modules/volume/volume_extract.c:741 modules/volume/volume_slice.c:1269
 #, c-format
 msgid "Z graph at x: %d y: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:776
+#: modules/volume/volume_extract.c:762
 msgid "Brick graph"
 msgstr ""
 
-#: modules/volume/volume_extract.c:1056
+#: modules/volume/volume_extract.c:1042
 msgid "Load volume data"
 msgstr ""
 
-#: modules/volume/volume_extract.c:1218
+#: modules/volume/volume_extract.c:1204
 #, c-format
 msgid "Shown range %g to %g"
 msgstr ""
 
-#: modules/volume/volume_extract.c:1911
+#: modules/volume/volume_extract.c:1897
 msgid "Building wireframe model..."
 msgstr ""
 
@@ -14144,97 +14839,97 @@ msgid "Evaluate volume force-distance data"
 msgstr ""
 
 #: modules/volume/volume_fdfit.c:213
-msgid "/_Evaluate FD data..."
+msgid "/_Evaluate FD Data..."
 msgstr ""
 
 #: modules/volume/volume_fdfit.c:217
 msgid "Evaluate force-distance volume data"
 msgstr ""
 
-#: modules/volume/volume_fdfit.c:368
+#: modules/volume/volume_fdfit.c:371
 msgid "Curve _X position:"
 msgstr ""
 
-#: modules/volume/volume_fdfit.c:386
+#: modules/volume/volume_fdfit.c:380
 msgid "Curve _Y position:"
 msgstr ""
 
-#: modules/volume/volume_fdfit.c:535
+#: modules/volume/volume_fdfit.c:511
 msgid "e_stimate"
 msgstr ""
 
-#: modules/volume/volume_invert.c:51
+#: modules/volume/volume_invert.c:39 modules/volume/volumeops.c:39
 msgid "Inverts value in volume data"
 msgstr ""
 
-#: modules/volume/volume_invert.c:65
-msgid "/_Invert value"
+#: modules/volume/volume_invert.c:53
+msgid "/_Invert Value"
 msgstr ""
 
-#: modules/volume/volume_invert.c:69
+#: modules/volume/volume_invert.c:57
 msgid "Invert value in volume data"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:94
+#: modules/volume/volume_kmeans.c:95
 msgid "Calculates K-means clustering on volume data."
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:108
-msgid "/_K-means clustering..."
+#: modules/volume/volume_kmeans.c:109
+msgid "/_K-Means Clustering..."
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:112
+#: modules/volume/volume_kmeans.c:113
 msgid "Calculate K-means clustering on volume data"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:151
+#: modules/volume/volume_kmeans.c:152
 msgid "K-means"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:164
+#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:163
 msgid "_Number of clusters:"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:171
+#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:170
 msgid "Convergence _precision digits:"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:184 modules/volume/volume_kmedians.c:178
+#: modules/volume/volume_kmeans.c:183 modules/volume/volume_kmedians.c:176
 msgid "_Max. iterations:"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:189 modules/volume/volume_kmedians.c:183
+#: modules/volume/volume_kmeans.c:187 modules/volume/volume_kmedians.c:181
 msgid "_Normalize"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:195
+#: modules/volume/volume_kmeans.c:193
 msgid "_Remove outliers"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:208
+#: modules/volume/volume_kmeans.c:202
 msgid "Outliers _threshold:"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:431
+#: modules/volume/volume_kmeans.c:425
 msgid "K-means iteration..."
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:651
+#: modules/volume/volume_kmeans.c:645
 #, c-format
 msgid "K-means cluster of %s"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:660
+#: modules/volume/volume_kmeans.c:654
 #, c-format
 msgid "K-means error of %s"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:670 modules/volume/volume_kmedians.c:514
+#: modules/volume/volume_kmeans.c:664 modules/volume/volume_kmedians.c:512
 #, c-format
 msgid "Pre-normalized intensity of %s"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:702
+#: modules/volume/volume_kmeans.c:696
 #, c-format
 msgid "K-means center %d"
 msgstr ""
@@ -14244,7 +14939,7 @@ msgid "Calculates K-medians clustering on volume data."
 msgstr ""
 
 #: modules/volume/volume_kmedians.c:102
-msgid "/_K-medians clustering..."
+msgid "/_K-Medians Clustering..."
 msgstr ""
 
 #: modules/volume/volume_kmedians.c:106
@@ -14255,46 +14950,46 @@ msgstr ""
 msgid "K-Medians"
 msgstr ""
 
-#: modules/volume/volume_kmedians.c:392
+#: modules/volume/volume_kmedians.c:390
 msgid "K-medians iteration..."
 msgstr ""
 
-#: modules/volume/volume_kmedians.c:495
+#: modules/volume/volume_kmedians.c:493
 #, c-format
 msgid "K-medians cluster of %s"
 msgstr ""
 
-#: modules/volume/volume_kmedians.c:504
+#: modules/volume/volume_kmedians.c:502
 #, c-format
 msgid "K-medians error of %s"
 msgstr ""
 
-#: modules/volume/volume_kmedians.c:546
+#: modules/volume/volume_kmedians.c:544
 #, c-format
 msgid "K-medians center %d"
 msgstr ""
 
-#: modules/volume/volume_linestat.c:171
+#: modules/volume/volume_linestat.c:173
 msgid "Summarizes profiles of volume data to a channel."
 msgstr ""
 
-#: modules/volume/volume_linestat.c:185
+#: modules/volume/volume_linestat.c:187
 msgid "/Summarize _Profiles..."
 msgstr ""
 
-#: modules/volume/volume_linestat.c:189
+#: modules/volume/volume_linestat.c:191
 msgid "Summarize profiles"
 msgstr ""
 
-#: modules/volume/volume_linestat.c:249
+#: modules/volume/volume_linestat.c:251
 msgid "_Extract image"
 msgstr ""
 
-#: modules/volume/volume_linestat.c:250
+#: modules/volume/volume_linestat.c:252
 msgid "Set _preview"
 msgstr ""
 
-#: modules/volume/volume_linestat.c:284
+#: modules/volume/volume_linestat.c:289
 msgid "Summarize Volume Profiles"
 msgstr ""
 
@@ -14318,53 +15013,113 @@ msgstr ""
 msgid "Line graph"
 msgstr ""
 
-#: modules/volume/volume_slice.c:290
+#: modules/volume/volume_slice.c:292
 msgid "Slice Volume Data"
 msgstr ""
 
-#: modules/volume/volume_slice.c:369
+#: modules/volume/volume_slice.c:371
 msgid "_Base plane:"
 msgstr ""
 
-#: modules/volume/volume_slice.c:420
+#: modules/volume/volume_slice.c:422
 msgid "Extract _multiple items"
 msgstr ""
 
-#: modules/volume/volume_slice.c:437
+#: modules/volume/volume_slice.c:439
 msgid "Positions"
 msgstr ""
 
-#: modules/volume/volume_slice.c:484
+#: modules/volume/volume_slice.c:492
 msgid "_Z:"
 msgstr ""
 
-#: modules/volume/volume_slice.c:1156
+#: modules/volume/volume_slice.c:1167
 #, c-format
 msgid "Z slice at %.*f%s%s (#%d)"
 msgstr ""
 
-#: modules/volume/volume_slice.c:1167
+#: modules/volume/volume_slice.c:1178
 #, c-format
 msgid "Y slice at %.*f%s%s (#%d)"
 msgstr ""
 
-#: modules/volume/volume_slice.c:1178
+#: modules/volume/volume_slice.c:1189
 #, c-format
 msgid "X slice at %.*f%s%s (#%d)"
 msgstr ""
 
-#: modules/volume/volume_slice.c:1307
+#: modules/volume/volume_slice.c:1325
 msgid "Volume Z graphs"
 msgstr ""
 
-#: modules/volume/volume_slice.c:1314
+#: modules/volume/volume_slice.c:1332
 msgid "Volume X graphs"
 msgstr ""
 
-#: modules/volume/volume_slice.c:1321
+#: modules/volume/volume_slice.c:1339
 msgid "Volume Y graphs"
 msgstr ""
 
+#: modules/volume/volume_swaxes.c:104
+msgid "Swaps axes of volume data."
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:118
+msgid "/S_wap axes..."
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:122
+msgid "Swap axes"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:156
+msgid "X"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:157
+msgid "X, reversed"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:158
+msgid "Y"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:159
+msgid "Y, reversed"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:160
+msgid "Z"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:161
+msgid "Z, reversed"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:175
+msgid "Swap Volume Axes"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:196
+msgid "Current _X axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:204
+msgid "Current _Y axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:212
+msgid "Current _Z axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:219
+msgid "Create new volume data"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:286
+msgid "Z axis calibration will be lost."
+msgstr ""
+
 #: modules/volume/volume_zcal.c:104
 msgid "Attaches, extracts and removes volume data z-axis calibration."
 msgstr ""
@@ -14428,6 +15183,14 @@ msgid ""
 "differs from the number of planes %d."
 msgstr ""
 
+#: modules/volume/volumeops.c:53
+msgid "/Extract _Preview"
+msgstr ""
+
+#: modules/volume/volumeops.c:57
+msgid "Extract volume data preview to an image"
+msgstr ""
+
 #: modules/xyz/xyz_drift.c:267
 msgid "Analyzes drift in XYZ data."
 msgstr ""
@@ -14470,7 +15233,7 @@ msgstr ""
 msgid "Analyze XYZ Drift"
 msgstr ""
 
-#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:391
+#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:406
 msgid "Reset Ran_ges"
 msgstr ""
 
@@ -14478,11 +15241,11 @@ msgstr ""
 msgid "_Guess parameters"
 msgstr ""
 
-#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:570
+#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:539
 msgid "_X-range:"
 msgstr ""
 
-#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:592
+#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:561
 msgid "_Y-range:"
 msgstr ""
 
@@ -14560,7 +15323,7 @@ msgstr ""
 msgid "Fitting in progress..."
 msgstr ""
 
-#: modules/xyz/xyz_drift.c:2269 modules/xyz/xyz_raster.c:1012
+#: modules/xyz/xyz_drift.c:2264 modules/xyz/xyz_raster.c:981
 msgid "Physical dimensions are invalid."
 msgstr ""
 
@@ -14600,39 +15363,39 @@ msgstr ""
 msgid "Update X and Y of _all compatible data"
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:197
+#: modules/xyz/xyz_raster.c:194
 msgid "Rasterizes XYZ data to images."
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:211
+#: modules/xyz/xyz_raster.c:208
 msgid "/_Rasterize..."
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:215
+#: modules/xyz/xyz_raster.c:212
 msgid "Rasterize to image"
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:340
+#: modules/xyz/xyz_raster.c:337
 msgid "Rasterize XYZ Data"
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:354
+#: modules/xyz/xyz_raster.c:351
 msgid "Create Image _Directly"
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:360
+#: modules/xyz/xyz_raster.c:357
 msgid "XY points form a regular grid so interpolation is not necessary."
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:381
+#: modules/xyz/xyz_raster.c:392
 msgid "Make Pixels S_quare"
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:642
+#: modules/xyz/xyz_raster.c:611
 msgid "Field"
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:956
+#: modules/xyz/xyz_raster.c:925
 #, c-format
 msgid ""
 "Number of points: %u\n"
@@ -14640,7 +15403,7 @@ msgid ""
 "Added on the boundaries: %u"
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:1091
+#: modules/xyz/xyz_raster.c:1065
 msgid ""
 "XYZ data regularization failed due to numerical instability or was "
 "interrupted."
diff --git a/po/it.gmo b/po/it.gmo
index 7c7556a..e025528 100644
Binary files a/po/it.gmo and b/po/it.gmo differ
diff --git a/po/it.po b/po/it.po
index 5ca299e..cd31105 100644
--- a/po/it.po
+++ b/po/it.po
@@ -12,7 +12,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: it\n"
 "Report-Msgid-Bugs-To: yeti at gwyddion.net\n"
-"POT-Creation-Date: 2016-11-18 11:05+0100\n"
+"POT-Creation-Date: 2017-08-15 17:48+0200\n"
 "PO-Revision-Date: 2016-09-30 14:27+0200\n"
 "Last-Translator: Livia Della Seta <livia.dellaseta at enea.it>\n"
 "Language-Team: Italian <kde-i18n-it at kde.org>\n"
@@ -133,7 +133,8 @@ msgstr "contatto_ Hertz (paraboloide)"
 #: app/data-browser-aux.c:1480 app/data-browser.c:2280 app/data-browser.c:2887
 #: app/data-browser.c:3707 app/data-browser.c:3857 app/data-browser.c:4139
 #: app/data-browser.c:4504 app/data-browser.c:4590 app/data-browser.c:5016
-#: app/resource-editor.c:366 modules/process/convolution_filter.c:691
+#: app/resource-editor.c:366 modules/file/xyzexport.c:214
+#: modules/process/convolution_filter.c:691
 msgid "Untitled"
 msgstr "Senza titolo "
 
@@ -141,97 +142,105 @@ msgstr "Senza titolo "
 msgid "Initial residua evaluation..."
 msgstr "Valutazione iniziale residuei"
 
-#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1632
+#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1646
 msgid "Fitting..."
 msgstr "Fitting..."
 
-#: libgwyddion/gwynlfitpreset.c:1442 libprocess/gwyprocessenums.c:101
-#: libprocess/gwyshapefitpreset.c:347
+#: libgwyddion/gwynlfitpreset.c:1549 libprocess/gwyprocessenums.c:101
+#: libprocess/gwyshapefitpreset.c:347 modules/process/psf-fit.c:157
 msgid "Gaussian"
 msgstr "Gaussiana"
 
-#: libgwyddion/gwynlfitpreset.c:1457
+#: libgwyddion/gwynlfitpreset.c:1564
 msgid "Gaussian (PSDF)"
 msgstr "Gaussiana (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1470
+#: libgwyddion/gwynlfitpreset.c:1577
 msgid "Gaussian (ACF)"
 msgstr "Gaussiana (ACF)"
 
-#: libgwyddion/gwynlfitpreset.c:1483
+#: libgwyddion/gwynlfitpreset.c:1590
 msgid "Gaussian (HHCF)"
 msgstr "Gaussiana (HHCF)"
 
-#: libgwyddion/gwynlfitpreset.c:1496
+#: libgwyddion/gwynlfitpreset.c:1603
 msgid "Gaussian (RPSDF)"
 msgstr "Gaussiana (RPSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1509
+#: libgwyddion/gwynlfitpreset.c:1616
 msgid "Two Gaussians (PSDF)"
 msgstr "Due Gaussiane (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1524 modules/xyz/xyz_drift.c:841
-#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1819
+#: libgwyddion/gwynlfitpreset.c:1631 modules/xyz/xyz_drift.c:841
+#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1818
 msgid "Exponential"
 msgstr "Esponenziale"
 
-#: libgwyddion/gwynlfitpreset.c:1536
+#: libgwyddion/gwynlfitpreset.c:1643
 msgid "Exponential (PSDF)"
 msgstr "Esponenziale  (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1549
+#: libgwyddion/gwynlfitpreset.c:1656
 msgid "Exponential (ACF)"
 msgstr "Esponenziale (ACF)"
 
-#: libgwyddion/gwynlfitpreset.c:1561
+#: libgwyddion/gwynlfitpreset.c:1668
 msgid "Exponential (HHCF)"
 msgstr "Esponenziale (HHCF)"
 
-#: libgwyddion/gwynlfitpreset.c:1574
+#: libgwyddion/gwynlfitpreset.c:1681
 msgid "Exponential (RPSDF)"
 msgstr "Esponenziale (RPSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1588
+#: libgwyddion/gwynlfitpreset.c:1695
+msgid "K-correlated (PSDF)"
+msgstr ""
+
+#: libgwyddion/gwynlfitpreset.c:1709
 msgid "Polynomial (order 0)"
 msgstr "Polinomiale (ordine0)"
 
-#: libgwyddion/gwynlfitpreset.c:1599 modules/xyz/xyz_drift.c:1805
+#: libgwyddion/gwynlfitpreset.c:1720 modules/xyz/xyz_drift.c:1804
 msgid "Polynomial (order 1)"
 msgstr "Polinomiale (ordine1)"
 
-#: libgwyddion/gwynlfitpreset.c:1610
+#: libgwyddion/gwynlfitpreset.c:1731
 msgid "Polynomial (order 2)"
 msgstr "Polinomiale (ordine2)"
 
-#: libgwyddion/gwynlfitpreset.c:1622
+#: libgwyddion/gwynlfitpreset.c:1743
 msgid "Polynomial (order 3)"
 msgstr "Polinomiale (ordine3)"
 
-#: libgwyddion/gwynlfitpreset.c:1635
+#: libgwyddion/gwynlfitpreset.c:1756
 msgid "Square wave"
 msgstr "Onda quadra"
 
-#: libgwyddion/gwynlfitpreset.c:1651
+#: libgwyddion/gwynlfitpreset.c:1772
 msgid "Parabolic step"
 msgstr "Passo parabolico"
 
-#: libgwyddion/gwynlfitpreset.c:1667
+#: libgwyddion/gwynlfitpreset.c:1788
 msgid "Smooth slanted step"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1684
+#: libgwyddion/gwynlfitpreset.c:1805
 msgid "Smooth bent step"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1700
+#: libgwyddion/gwynlfitpreset.c:1821
+msgid "Boltzmann bent step"
+msgstr ""
+
+#: libgwyddion/gwynlfitpreset.c:1837
 msgid "Power"
 msgstr "Potenza"
 
-#: libgwyddion/gwynlfitpreset.c:1712 libprocess/gwyshapefitpreset.c:348
+#: libgwyddion/gwynlfitpreset.c:1849 libprocess/gwyshapefitpreset.c:348
 msgid "Lorentzian"
 msgstr "Lorentzian"
 
-#: libgwyddion/gwynlfitpreset.c:1726
+#: libgwyddion/gwynlfitpreset.c:1863
 msgid "Sinc"
 msgstr "Sinc"
 
@@ -252,7 +261,7 @@ msgid "Step height (positive)"
 msgstr "Altezza step (positiva)"
 
 #: libprocess/cdline.c:590 libprocess/cdline.c:599
-#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:170
+#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:163
 msgid "Line"
 msgstr "Linea"
 
@@ -265,7 +274,7 @@ msgid "Circle (down)"
 msgstr "Cerchio (inferiore)"
 
 #: libprocess/cdline.c:608 libprocess/cdline.c:617
-#: libgwydgets/gwygraphareadialog.c:557 modules/process/hough.c:171
+#: libgwydgets/gwygraphareadialog.c:550 modules/process/hough.c:164
 msgid "Circle"
 msgstr "Cerchio "
 
@@ -273,237 +282,237 @@ msgstr "Cerchio "
 msgid "Circle (up)"
 msgstr "Cerchio (superiore)"
 
-#: libprocess/gwygrainvalue.c:64
+#: libprocess/gwygrainvalue.c:62
 msgid "Grain number"
 msgstr "Numero grani"
 
-#: libprocess/gwygrainvalue.c:73 modules/process/curvature.c:129
+#: libprocess/gwygrainvalue.c:71 modules/process/curvature.c:128
 msgid "Center x position"
 msgstr "Centra posizione X "
 
-#: libprocess/gwygrainvalue.c:82 modules/process/curvature.c:130
+#: libprocess/gwygrainvalue.c:80 modules/process/curvature.c:129
 msgid "Center y position"
 msgstr "Centra posizione Y"
 
-#: libprocess/gwygrainvalue.c:91
+#: libprocess/gwygrainvalue.c:89
 msgid "Minimum value"
 msgstr "Valore minimo"
 
-#: libprocess/gwygrainvalue.c:100
+#: libprocess/gwygrainvalue.c:98
 msgid "Maximum value"
 msgstr "Valore massimo"
 
-#: libprocess/gwygrainvalue.c:109 modules/process/bdep_synth.c:133
-#: modules/tools/filter.c:237
+#: libprocess/gwygrainvalue.c:107 modules/process/bdep_synth.c:133
+#: modules/tools/filter.c:238
 msgid "Mean value"
 msgstr "Valore medio"
 
-#: libprocess/gwygrainvalue.c:118 modules/tools/filter.c:238
+#: libprocess/gwygrainvalue.c:116 modules/tools/filter.c:239
 msgid "Median value"
 msgstr "Valore mediano"
 
-#: libprocess/gwygrainvalue.c:127
+#: libprocess/gwygrainvalue.c:125
 msgid "Minimum value on boundary"
 msgstr "Valore minimo sul limite"
 
-#: libprocess/gwygrainvalue.c:136
+#: libprocess/gwygrainvalue.c:134
 msgid "Maximum value on boundary"
 msgstr "Valore massimo sul limite"
 
-#: libprocess/gwygrainvalue.c:145
+#: libprocess/gwygrainvalue.c:143
 msgid "Pixel area"
 msgstr "area Pixel:"
 
-#: libprocess/gwygrainvalue.c:154
+#: libprocess/gwygrainvalue.c:152
 msgid "Projected area"
 msgstr "Area proiettata"
 
-#: libprocess/gwygrainvalue.c:163
+#: libprocess/gwygrainvalue.c:161
 msgid "Surface area"
 msgstr "Area superficie"
 
-#: libprocess/gwygrainvalue.c:172
+#: libprocess/gwygrainvalue.c:170
 msgid "Equivalent square side"
 msgstr "Lato quadrato equivalente"
 
-#: libprocess/gwygrainvalue.c:181
+#: libprocess/gwygrainvalue.c:179
 msgid "Equivalent disc radius"
 msgstr "Raggio cerchio equivalente"
 
-#: libprocess/gwygrainvalue.c:190
+#: libprocess/gwygrainvalue.c:188
 msgid "Area above half-height"
 msgstr "Area superiore mezza altezza"
 
-#: libprocess/gwygrainvalue.c:199
+#: libprocess/gwygrainvalue.c:197
 msgid "Area of convex hull"
 msgstr "Area involucro convesso"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to
 #. * zero.
-#: libprocess/gwygrainvalue.c:210
+#: libprocess/gwygrainvalue.c:208
 msgid "Zero basis volume"
 msgstr "Volume con base zero"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * grain minimum.
-#: libprocess/gwygrainvalue.c:221
+#: libprocess/gwygrainvalue.c:219
 msgid "Grain minimum basis volume"
 msgstr "Volume con base minimo grani"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * Laplacian background.
-#: libprocess/gwygrainvalue.c:232
+#: libprocess/gwygrainvalue.c:230
 msgid "Laplacian background basis volume"
 msgstr "Volume con base sottofondo Laplaciano"
 
-#: libprocess/gwygrainvalue.c:241
+#: libprocess/gwygrainvalue.c:239
 msgid "Projected boundary length"
 msgstr "Lunghezza contorno proiettato"
 
-#: libprocess/gwygrainvalue.c:250
+#: libprocess/gwygrainvalue.c:248
 msgid "Minimum bounding size"
 msgstr "Dimensioni legame minimo"
 
-#: libprocess/gwygrainvalue.c:259
+#: libprocess/gwygrainvalue.c:257
 msgid "Minimum bounding direction"
 msgstr "Direzione legame minimo"
 
-#: libprocess/gwygrainvalue.c:268
+#: libprocess/gwygrainvalue.c:266
 msgid "Maximum bounding size"
 msgstr "Dimensione legame massimo"
 
-#: libprocess/gwygrainvalue.c:277
+#: libprocess/gwygrainvalue.c:275
 msgid "Maximum bounding direction"
 msgstr "Direzione legame massimo"
 
-#: libprocess/gwygrainvalue.c:286
+#: libprocess/gwygrainvalue.c:284
 msgid "Maximum inscribed disc radius"
 msgstr "Raggio disco inscritto massimo "
 
-#: libprocess/gwygrainvalue.c:295
+#: libprocess/gwygrainvalue.c:293
 msgid "Maximum inscribed disc center x position"
 msgstr "Posizione x del centro del disco inscritto massimo"
 
-#: libprocess/gwygrainvalue.c:304
+#: libprocess/gwygrainvalue.c:302
 msgid "Maximum inscribed disc center y position"
 msgstr "Posizione y del centro del disco inscritto massimo"
 
-#: libprocess/gwygrainvalue.c:313
+#: libprocess/gwygrainvalue.c:311
 msgid "Minimum circumcircle radius"
 msgstr "Raggio circumcerchio minimo "
 
-#: libprocess/gwygrainvalue.c:322
+#: libprocess/gwygrainvalue.c:320
 msgid "Minimum circumcircle center x position"
 msgstr "Posizione x centro circumcerchio minimo"
 
-#: libprocess/gwygrainvalue.c:331
+#: libprocess/gwygrainvalue.c:329
 msgid "Minimum circumcircle center y position"
 msgstr "Posizione y centro circumcerchio minimo"
 
-#: libprocess/gwygrainvalue.c:340
+#: libprocess/gwygrainvalue.c:338
 msgid "Mean radius"
 msgstr "Raggio medio"
 
-#: libprocess/gwygrainvalue.c:349 modules/tools/readvalue.c:319
+#: libprocess/gwygrainvalue.c:347 modules/tools/readvalue.c:322
 msgid "Inclination θ"
 msgstr "Inclinazione θ"
 
-#: libprocess/gwygrainvalue.c:358 modules/tools/readvalue.c:329
+#: libprocess/gwygrainvalue.c:356 modules/tools/readvalue.c:332
 msgid "Inclination φ"
 msgstr "Inclinazione φ"
 
-#: libprocess/gwygrainvalue.c:367
+#: libprocess/gwygrainvalue.c:365
 msgid "Curvature center x position"
 msgstr "Posizione x centro curvatura"
 
-#: libprocess/gwygrainvalue.c:376
+#: libprocess/gwygrainvalue.c:374
 msgid "Curvature center y position"
 msgstr "Posizione y centro curvatura"
 
-#: libprocess/gwygrainvalue.c:385
+#: libprocess/gwygrainvalue.c:383
 msgid "Curvature center z value"
 msgstr "Posizione z centro curvatura"
 
-#: libprocess/gwygrainvalue.c:394 modules/tools/readvalue.c:344
+#: libprocess/gwygrainvalue.c:392 modules/tools/readvalue.c:347
 msgid "Curvature 1"
 msgstr "Curvatura 1"
 
-#: libprocess/gwygrainvalue.c:403 modules/tools/readvalue.c:354
+#: libprocess/gwygrainvalue.c:401 modules/tools/readvalue.c:357
 msgid "Curvature 2"
 msgstr "Curvatura 2"
 
-#: libprocess/gwygrainvalue.c:412
+#: libprocess/gwygrainvalue.c:410
 msgid "Curvature angle 1"
 msgstr "Angolo curvatura 1"
 
-#: libprocess/gwygrainvalue.c:421
+#: libprocess/gwygrainvalue.c:419
 msgid "Curvature angle 2"
 msgstr "Angolo curvatura 2"
 
-#: libprocess/gwygrainvalue.c:430
+#: libprocess/gwygrainvalue.c:428
 msgid "Major semiaxis of equivalent ellipse"
 msgstr "Semiasse maggiore di ellisse equivalente"
 
-#: libprocess/gwygrainvalue.c:439
+#: libprocess/gwygrainvalue.c:437
 msgid "Minor semiaxis of equivalent ellipse"
 msgstr "Semiasse minore di ellisse equivalente"
 
-#: libprocess/gwygrainvalue.c:448
+#: libprocess/gwygrainvalue.c:446
 msgid "Orientation of equivalent ellipse"
 msgstr "Orientamento ellisse equivalente"
 
-#: libprocess/gwygrainvalue.c:1120
+#: libprocess/gwygrainvalue.c:1118
 msgid "Id"
 msgstr "Id"
 
-#: libprocess/gwygrainvalue.c:1121 modules/graph/graph_peaks.c:156
-#: modules/process/extract_path.c:391 modules/process/wave_synth.c:482
-#: modules/tools/readvalue.c:251
+#: libprocess/gwygrainvalue.c:1119 modules/graph/graph_peaks.c:154
+#: modules/process/extract_path.c:391 modules/process/wave_synth.c:513
+#: modules/tools/readvalue.c:253
 msgid "Position"
 msgstr "Posizione"
 
-#: libprocess/gwygrainvalue.c:1122 app/meta.c:411 modules/file/imgexport.c:4625
-#: modules/process/curvature.c:762 modules/tools/level3.c:468
-#: modules/tools/readvalue.c:286
+#: libprocess/gwygrainvalue.c:1120 app/meta.c:411 modules/file/imgexport.c:4573
+#: modules/process/curvature.c:759 modules/tools/level3.c:475
+#: modules/tools/readvalue.c:290
 msgid "Value"
 msgstr "Valore"
 
-#: libprocess/gwygrainvalue.c:1123
+#: libprocess/gwygrainvalue.c:1121
 msgid "Area"
 msgstr "Area"
 
-#: libprocess/gwygrainvalue.c:1124 app/data-browser.c:5624 app/toolbox.c:110
+#: libprocess/gwygrainvalue.c:1122 app/data-browser.c:5624 app/toolbox.c:115
 msgid "Volume"
 msgstr "Volume"
 
-#: libprocess/gwygrainvalue.c:1125
+#: libprocess/gwygrainvalue.c:1123
 msgid "Boundary"
 msgstr "Confine"
 
-#: libprocess/gwygrainvalue.c:1126 modules/process/pat_synth.c:829
-#: modules/process/pat_synth.c:1131 modules/process/pat_synth.c:1466
-#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:147
+#: libprocess/gwygrainvalue.c:1124 modules/process/pat_synth.c:830
+#: modules/process/pat_synth.c:1132 modules/process/pat_synth.c:1467
+#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:149
 msgid "Slope"
 msgstr "Pendenza"
 
-#: libprocess/gwygrainvalue.c:1127 modules/process/curvature.c:213
-#: modules/process/curvature.c:613
+#: libprocess/gwygrainvalue.c:1125 modules/process/curvature.c:212
+#: modules/process/curvature.c:615
 msgid "Curvature"
 msgstr "Curvatura"
 
-#: libprocess/gwygrainvalue.c:1128
+#: libprocess/gwygrainvalue.c:1126
 msgid "Moment"
 msgstr "Momento"
 
-#: libprocess/gwygrainvalue.c:1132
+#: libprocess/gwygrainvalue.c:1130
 msgid "User"
 msgstr "Utente"
 
-#: libprocess/gwyprocessenums.c:44
+#: libprocess/gwyprocessenums.c:44 modules/process/preview.h:263
 msgid "Union"
 msgstr "Unione"
 
-#: libprocess/gwyprocessenums.c:45
+#: libprocess/gwyprocessenums.c:45 modules/process/preview.h:255
 msgid "Intersection"
 msgstr "Intersezione"
 
@@ -582,13 +591,13 @@ msgid "Scale and space adaptive"
 msgstr "Scala e spazio adattati"
 
 #. TRANSLATORS: Interpolation type (AKA nearest neighbour)
-#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3791
-#: modules/xyz/xyz_raster.c:640
+#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3756
+#: modules/xyz/xyz_raster.c:609
 msgid "Round"
 msgstr "Esatta"
 
-#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3792
-#: modules/xyz/xyz_raster.c:641
+#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3757
+#: modules/xyz/xyz_raster.c:610
 msgid "Linear"
 msgstr "Lineare"
 
@@ -676,27 +685,27 @@ msgstr "Includi solo area maschera"
 msgid "Use entire image (ignore mask)"
 msgstr "Usa immagine intera (ignora maschera)"
 
-#: libprocess/gwyprocessenums.c:602
+#: libprocess/gwyprocessenums.c:604
 msgid "distance|City-block"
 msgstr "distanza|City-block"
 
-#: libprocess/gwyprocessenums.c:603
+#: libprocess/gwyprocessenums.c:605
 msgid "distance|Chess"
 msgstr "distanza|Scacchi"
 
-#: libprocess/gwyprocessenums.c:604
+#: libprocess/gwyprocessenums.c:606
 msgid "distance|Octagonal 4,8"
 msgstr "distanza|Ottagonale 4,8"
 
-#: libprocess/gwyprocessenums.c:605
+#: libprocess/gwyprocessenums.c:607
 msgid "distance|Octagonal 8,4"
 msgstr "distanza|Ottagonale 8,4"
 
-#: libprocess/gwyprocessenums.c:606
+#: libprocess/gwyprocessenums.c:608
 msgid "distance|Octagonal"
 msgstr "distanza|Ottagonale"
 
-#: libprocess/gwyprocessenums.c:607
+#: libprocess/gwyprocessenums.c:609
 msgid "distance|Euclidean"
 msgstr "distanza!Euclidea"
 
@@ -733,11 +742,11 @@ msgstr "Passo parabolico"
 msgid "Ring"
 msgstr "Anello"
 
-#: libprocess/morph_lib.c:169 libprocess/tip.c:1043
+#: libprocess/morph_lib.c:169 libprocess/tip.c:1052
 msgid "Dilation..."
 msgstr "Espansione..."
 
-#: libprocess/morph_lib.c:235 libprocess/tip.c:1164
+#: libprocess/morph_lib.c:235 libprocess/tip.c:1173
 msgid "Erosion..."
 msgstr "Erosione..."
 
@@ -768,82 +777,82 @@ msgid_plural "Found %d internal local maxima"
 msgstr[0] "Trovato un massimo locale interno"
 msgstr[1] "Trovati %d massimi locali interni"
 
-#: libprocess/tip.c:422
+#: libprocess/tip.c:431
 msgid "Pyramid"
 msgstr "Piramide"
 
-#: libprocess/tip.c:423 libprocess/tip.c:429 libprocess/tip.c:435
+#: libprocess/tip.c:432 libprocess/tip.c:438 libprocess/tip.c:444
 msgid "Pyramidal"
 msgstr "Piramidale"
 
-#: libprocess/tip.c:428
+#: libprocess/tip.c:437
 msgid "Contact"
 msgstr "Contact"
 
-#: libprocess/tip.c:434
+#: libprocess/tip.c:443
 msgid "Noncontact"
 msgstr "Noncontact"
 
-#: libprocess/tip.c:440
+#: libprocess/tip.c:449
 msgid "Delta function"
 msgstr "Funzione Delta"
 
-#: libprocess/tip.c:441
+#: libprocess/tip.c:450
 msgid "Analytical"
 msgstr "Analitico"
 
-#: libprocess/tip.c:446
+#: libprocess/tip.c:455 modules/process/fibre_synth.c:259
 msgid "Parabola"
 msgstr "Parabola"
 
-#: libprocess/tip.c:447 libprocess/tip.c:453
+#: libprocess/tip.c:456 libprocess/tip.c:462
 msgid "Symmetric"
 msgstr "Simmetrico"
 
-#: libprocess/tip.c:452
+#: libprocess/tip.c:461
 msgid "Cone"
 msgstr "Cono"
 
-#: libprocess/tip.c:458
+#: libprocess/tip.c:467
 msgid "Elliptical parabola"
 msgstr ""
 
-#: libprocess/tip.c:459
+#: libprocess/tip.c:468
 #, fuzzy
 msgid "Asymmetric"
 msgstr "Simmetrico"
 
-#: libprocess/tip.c:1339 libprocess/tip.c:1367 libprocess/tip.c:1416
-#: libprocess/tip.c:1443
+#: libprocess/tip.c:1348 libprocess/tip.c:1376 libprocess/tip.c:1425
+#: libprocess/tip.c:1452
 msgid "Converting fields"
 msgstr "Conversione campi"
 
-#: libprocess/tip.c:1349
+#: libprocess/tip.c:1358
 msgid "Starting partial estimation"
 msgstr "Inizio stima parziale"
 
-#: libprocess/tip.c:1426
+#: libprocess/tip.c:1435
 msgid "Starting full estimation"
 msgstr "Inizio stima totale "
 
-#: libprocess/triangulation.c:2085 modules/process/calcoefs_view.c:793
+#: libprocess/triangulation.c:2084 modules/process/calcoefs_view.c:793
 #: modules/process/lat_synth.c:1178
 msgid "Triangulating..."
 msgstr "Triangolazione..."
 
-#: libgwydgets/gwy3dwindow.c:570
+#: libgwydgets/gwy3dwindow.c:575
 msgid "Rotate view (R)"
 msgstr "Ruota vista (R)"
 
-#: libgwydgets/gwy3dwindow.c:575
+#: libgwydgets/gwy3dwindow.c:580
 msgid "Scale view as a whole (S)"
 msgstr "Ridimensiona vista d'insieme (S)"
 
-#: libgwydgets/gwy3dwindow.c:580
+#: libgwydgets/gwy3dwindow.c:585
 msgid "Scale value range (V)"
 msgstr "Ridimensiona intervallo valori (V)"
 
-#: libgwydgets/gwy3dwindow.c:585
+#: libgwydgets/gwy3dwindow.c:590
 msgid "Move light source (L)"
 msgstr "Movimento sorgente luce (L)"
 
@@ -851,227 +860,288 @@ msgstr "Movimento sorgente luce (L)"
 msgid "Show full controls"
 msgstr "Mostra comandi completi"
 
-#: libgwydgets/gwy3dwindow.c:693
+#: libgwydgets/gwy3dwindow.c:691
 msgid "Hide full controls"
 msgstr "Nascondi comandi completi"
 
-#: libgwydgets/gwy3dwindow.c:709 modules/file/imgexport.c:4796
-#: modules/process/fit-shape.c:461
+#: libgwydgets/gwy3dwindow.c:707 modules/file/imgexport.c:4745
+#: modules/process/fit-shape.c:462
 msgid "adjective|Basic"
 msgstr "aggettivo|Basico"
 
-#: libgwydgets/gwy3dwindow.c:714
+#: libgwydgets/gwy3dwindow.c:712
 msgid "Light & Material"
 msgstr "Illuminazione e materiali"
 
-#: libgwydgets/gwy3dwindow.c:719
+#: libgwydgets/gwy3dwindow.c:717
 msgid "Labels"
 msgstr "Etichette"
 
-#: libgwydgets/gwy3dwindow.c:828 modules/process/facet_analysis.c:331
-#: modules/process/facet_analysis.c:347 modules/process/shade.c:245
+#: libgwydgets/gwy3dwindow.c:722
+#, fuzzy
+msgid "Colorbar"
+msgstr "Colore"
+
+#: libgwydgets/gwy3dwindow.c:838 modules/process/facet_analysis.c:335
+#: modules/process/facet_analysis.c:351 modules/process/shade.c:253
 #: modules/process/tilt.c:223
 msgid "φ:"
 msgstr "φ:"
 
-#: libgwydgets/gwy3dwindow.c:828 libgwydgets/gwy3dwindow.c:834
-#: libgwydgets/gwy3dwindow.c:1032 libgwydgets/gwy3dwindow.c:1040
-#: modules/process/facet_analysis.c:375 modules/process/indent_analyze.c:460
-#: modules/process/rotate.c:264 modules/process/shade.c:237
-#: modules/process/shade.c:245 modules/process/tilt.c:211
-#: modules/process/tilt.c:223 modules/process/tip_model.c:234
-#: modules/process/tip_model.c:240 modules/process/unrotate.c:334
+#: libgwydgets/gwy3dwindow.c:838 libgwydgets/gwy3dwindow.c:843
+#: libgwydgets/gwy3dwindow.c:1013 libgwydgets/gwy3dwindow.c:1020
+#: modules/process/correct_affine.c:461 modules/process/facet_analysis.c:238
+#: modules/process/facet_analysis.c:370 modules/process/indent_analyze.c:438
+#: modules/process/measure_lattice.c:381 modules/process/rotate.c:264
+#: modules/process/shade.c:245 modules/process/shade.c:253
+#: modules/process/synth.h:379 modules/process/synth.h:410
+#: modules/process/tilt.c:211 modules/process/tilt.c:223
+#: modules/process/tip_model.c:234 modules/process/tip_model.c:240
+#: modules/process/unrotate.c:334 modules/tools/distance.c:197
+#: modules/tools/readvalue.c:223 modules/tools/stats.c:319
 msgid "deg"
 msgstr "°gra"
 
-#: libgwydgets/gwy3dwindow.c:834 modules/process/facet_analysis.c:330
-#: modules/process/facet_analysis.c:346 modules/process/shade.c:237
+#: libgwydgets/gwy3dwindow.c:843 modules/process/facet_analysis.c:334
+#: modules/process/facet_analysis.c:350 modules/process/shade.c:245
 #: modules/process/tilt.c:211
 msgid "θ:"
 msgstr "θ:"
 
-#: libgwydgets/gwy3dwindow.c:839 modules/process/cwt.c:151
+#: libgwydgets/gwy3dwindow.c:849 modules/process/cwt.c:151
 msgid "_Scale:"
 msgstr "_Scala:"
 
-#: libgwydgets/gwy3dwindow.c:846
+#: libgwydgets/gwy3dwindow.c:856
 msgid "_Value scale:"
 msgstr "_Valore scala:"
 
-#: libgwydgets/gwy3dwindow.c:851
+#: libgwydgets/gwy3dwindow.c:862
 msgid "Ph_ysical scale:"
 msgstr "Scala fisica:"
 
-#: libgwydgets/gwy3dwindow.c:865
+#: libgwydgets/gwy3dwindow.c:876
 msgid "verb|Set"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:877
+#: libgwydgets/gwy3dwindow.c:886
 msgid "Line _width:"
 msgstr "Larghezza linea:"
 
-#: libgwydgets/gwy3dwindow.c:881
+#: libgwydgets/gwy3dwindow.c:886 libgwydgets/gwy3dwindow.c:1194
+#: libgwydgets/gwy3dwindow.c:1204 libgwydgets/gwy3dwindow.c:1235
+#: libgwydgets/gwygraphareadialog.c:157 libgwydgets/gwygraphareadialog.c:173
+#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
+#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
+#: modules/process/angle_dist.c:188 modules/process/angle_dist.c:213
+#: modules/process/col_synth.c:486 modules/process/crosscor.c:252
+#: modules/process/crosscor.c:260 modules/process/crosscor.c:276
+#: modules/process/crosscor.c:284 modules/process/crosscor.c:300
+#: modules/process/crosscor.c:308 modules/process/cwt.c:151
+#: modules/process/dimensions.h:88 modules/process/edge.c:672
+#: modules/process/entropy.c:242 modules/process/extend.c:220
+#: modules/process/extend.c:227 modules/process/extend.c:234
+#: modules/process/extend.c:241 modules/process/facet_analysis.c:362
+#: modules/process/fbm_synth.c:383 modules/process/hough.c:203
+#: modules/process/local_contrast.c:146 modules/process/mark_disconn.c:263
+#: modules/process/mask_morph.c:237 modules/process/median-bg.c:209
+#: modules/process/neural.c:623 modules/process/neural.c:631
+#: modules/process/psdf_logphi.c:276 modules/process/rank.c:188
+#: modules/process/scale.c:237 modules/process/scale.c:246
+#: modules/process/scars.c:353 modules/process/scars.c:361
+#: modules/process/semsim.c:227 modules/process/slope_dist.c:365
+#: modules/process/slope_dist.c:393 modules/process/sphere-revolve.c:346
+#: modules/process/straighten_path.c:278 modules/process/synth.h:280
+#: modules/process/synth.h:501 modules/process/tip_blind.c:334
+#: modules/process/tip_blind.c:342 modules/process/volumize_layers.c:240
+#: modules/process/volumize_layers.c:245 modules/process/volumize_layers.c:250
+#: modules/process/wpour_mark.c:320 modules/tools/filter.c:291
+#: modules/tools/level3.c:244 modules/tools/maskedit.c:528
+#: modules/tools/maskedit.c:629 modules/tools/pathlevel.c:256
+#: modules/tools/profile.c:377 modules/tools/profile.c:503
+#: modules/tools/readvalue.c:222 modules/tools/readvalue.c:378
+#: modules/tools/roughness.c:868 modules/volume/volume_slice.c:446
+#: modules/volume/volume_slice.c:469 modules/volume/volume_slice.c:492
+#: modules/xyz/xyz_drift.c:738 modules/xyz/xyz_drift.c:753
+#: modules/xyz/xyz_raster.c:382 modules/xyz/xyz_raster.c:388
+msgid "px"
+msgstr "px"
+
+#: libgwydgets/gwy3dwindow.c:891
 msgid "Show _axes"
 msgstr "Mostra _assi"
 
-#: libgwydgets/gwy3dwindow.c:890
+#: libgwydgets/gwy3dwindow.c:900
 msgid "Show _labels"
 msgstr "Mostra _etichette"
 
-#: libgwydgets/gwy3dwindow.c:899
-msgid "Show false _colorbar"
-msgstr "Mostra barra falsi _colori"
-
-#: libgwydgets/gwy3dwindow.c:908
+#: libgwydgets/gwy3dwindow.c:909
 msgid "_Orthographic projection"
 msgstr "Proiezione _Ortogonale"
 
-#: libgwydgets/gwy3dwindow.c:917
+#: libgwydgets/gwy3dwindow.c:918
 msgid "_Hide masked"
 msgstr "Nascondi selezione maschera"
 
-#: libgwydgets/gwy3dwindow.c:933
+#: libgwydgets/gwy3dwindow.c:934
 msgid "_Lighting"
 msgstr "Illuminazione"
 
-#: libgwydgets/gwy3dwindow.c:934
+#: libgwydgets/gwy3dwindow.c:935
 msgid "_Gradient"
 msgstr "_Gradient"
 
-#: libgwydgets/gwy3dwindow.c:935
+#: libgwydgets/gwy3dwindow.c:936
 msgid "_Overlay"
 msgstr "Sovrapposizione"
 
-#: libgwydgets/gwy3dwindow.c:936
+#: libgwydgets/gwy3dwindow.c:937
 msgid "_Overlay - no light"
 msgstr "Sovrapposizione - nessuna luce"
 
-#: libgwydgets/gwy3dwindow.c:1009
+#: libgwydgets/gwy3dwindow.c:992
 msgid "_Material:"
 msgstr "_Materiale:"
 
-#: libgwydgets/gwy3dwindow.c:1032
+#: libgwydgets/gwy3dwindow.c:1013
 msgid "_Light φ:"
 msgstr "_Luce φ:"
 
-#: libgwydgets/gwy3dwindow.c:1040
+#: libgwydgets/gwy3dwindow.c:1020
 msgid "L_ight θ:"
 msgstr "L_uce θ:"
 
-#: libgwydgets/gwy3dwindow.c:1070 libgwydgets/gwy3dwindow.c:1240
-#: app/toolbox-editor.c:215 modules/file/hdrimage.cc:2213
-#: modules/file/imgexport.c:4760 modules/file/pixmap.c:789
+#: libgwydgets/gwy3dwindow.c:1052 libgwydgets/gwy3dwindow.c:1243
+#: app/toolbox-editor.c:216 modules/file/hdrimage.cc:2213
+#: modules/file/imgexport.c:4708 modules/file/pixmap.c:789
 #: modules/file/rawfile.c:424 modules/process/angle_dist.c:172
 #: modules/process/bdep_synth.c:341 modules/process/calcoefs_new.c:371
-#: modules/process/calibrate.c:391 modules/process/col_synth.c:392
-#: modules/process/correct_affine.c:301 modules/process/curvature.c:615
-#: modules/process/cwt.c:135 modules/process/deposit_synth.c:349
+#: modules/process/calibrate.c:383 modules/process/col_synth.c:392
+#: modules/process/correct_affine.c:346 modules/process/curvature.c:617
+#: modules/process/cwt.c:135 modules/process/deposit_synth.c:350
 #: modules/process/diff_synth.c:411 modules/process/domain_synth.c:354
 #: modules/process/drift.c:245 modules/process/dwt.c:166
 #: modules/process/dwtanisotropy.c:184 modules/process/edge.c:638
 #: modules/process/extend.c:192 modules/process/facet-level.c:193
-#: modules/process/facet_analysis.c:271 modules/process/fbm_synth.c:303
+#: modules/process/facet_analysis.c:275 modules/process/fbm_synth.c:303
 #: modules/process/fft.c:336 modules/process/fft_filter_2d.c:417
-#: modules/process/fft_synth.c:341 modules/process/fractal.c:231
-#: modules/process/grain_edge.c:213 modules/process/grain_mark.c:247
-#: modules/process/grain_wshed.c:167 modules/process/hough.c:179
-#: modules/process/lat_synth.c:567 modules/process/latsim.c:159
-#: modules/process/level.c:245 modules/process/linematch.c:804
-#: modules/process/lno_synth.c:433 modules/process/local_contrast.c:130
-#: modules/process/logistic.c:234 modules/process/mark_disconn.c:208
-#: modules/process/mask_distribute.c:152 modules/process/measure_lattice.c:256
-#: modules/process/median-bg.c:180 modules/process/noise_synth.c:336
-#: modules/process/obj_synth.c:441 modules/process/pat_synth.c:385
-#: modules/process/pid.c:199 modules/process/polydistort.c:210
-#: modules/process/polylevel.c:373 modules/process/psdf_logphi.c:249
-#: modules/process/rank.c:158 modules/process/rotate.c:243
-#: modules/process/scale.c:196 modules/process/scars.c:298
-#: modules/process/semsim.c:211 modules/process/shade.c:208
-#: modules/process/slope_dist.c:276 modules/process/sphere-revolve.c:218
-#: modules/process/straighten_path.c:249 modules/process/tilt.c:161
-#: modules/process/tip_model.c:169 modules/process/unrotate.c:220
-#: modules/process/volumize_layers.c:221 modules/process/wave_synth.c:349
-#: modules/process/wpour_mark.c:278 modules/volume/volume_calibrate.c:370
-#: modules/volume/volume_extract.c:331 modules/volume/volume_kmeans.c:153
-#: modules/volume/volume_kmedians.c:147 modules/volume/volume_linestat.c:292
-#: modules/volume/volume_slice.c:292
+#: modules/process/fft_synth.c:341 modules/process/fibre_synth.c:422
+#: modules/process/fractal.c:228 modules/process/grain_edge.c:212
+#: modules/process/grain_mark.c:246 modules/process/grain_wshed.c:168
+#: modules/process/hough.c:174 modules/process/lat_synth.c:567
+#: modules/process/latsim.c:159 modules/process/level.c:245
+#: modules/process/linematch.c:771 modules/process/lno_synth.c:431
+#: modules/process/local_contrast.c:130 modules/process/logistic.c:234
+#: modules/process/mark_disconn.c:208 modules/process/mask_distribute.c:152
+#: modules/process/measure_lattice.c:246 modules/process/median-bg.c:180
+#: modules/process/mfm_current.c:332 modules/process/mfm_field.c:281
+#: modules/process/mfm_findshift.c:230 modules/process/mfm_parallel.c:333
+#: modules/process/mfm_shift.c:170 modules/process/noise_synth.c:334
+#: modules/process/obj_synth.c:438 modules/process/pat_synth.c:385
+#: modules/process/phase_synth.c:205 modules/process/pid.c:197
+#: modules/process/polydistort.c:210 modules/process/polylevel.c:373
+#: modules/process/psdf_logphi.c:249 modules/process/rank.c:158
+#: modules/process/rotate.c:243 modules/process/scale.c:196
+#: modules/process/scars.c:317 modules/process/semsim.c:211
+#: modules/process/shade.c:210 modules/process/slope_dist.c:275
+#: modules/process/sphere-revolve.c:317 modules/process/straighten_path.c:248
+#: modules/process/tilt.c:161 modules/process/tip_model.c:167
+#: modules/process/unrotate.c:220 modules/process/volumize_layers.c:221
+#: modules/process/wave_synth.c:368 modules/process/wpour_mark.c:278
+#: modules/volume/volume_calibrate.c:370 modules/volume/volume_extract.c:324
+#: modules/volume/volume_kmeans.c:154 modules/volume/volume_kmedians.c:147
+#: modules/volume/volume_linestat.c:297 modules/volume/volume_slice.c:294
 msgid "_Reset"
 msgstr "_Ripristina"
 
-#: libgwydgets/gwy3dwindow.c:1142
+#: libgwydgets/gwy3dwindow.c:1141
 msgid "X-axis"
 msgstr "asse X"
 
-#: libgwydgets/gwy3dwindow.c:1143
+#: libgwydgets/gwy3dwindow.c:1142
 msgid "Y-axis"
 msgstr "asse Y"
 
-#: libgwydgets/gwy3dwindow.c:1144
+#: libgwydgets/gwy3dwindow.c:1143
 msgid "Minimum z value"
 msgstr "Valore minimo z"
 
-#: libgwydgets/gwy3dwindow.c:1145
+#: libgwydgets/gwy3dwindow.c:1144
 msgid "Maximum z value"
 msgstr "Valore massimo z"
 
-#: libgwydgets/gwy3dwindow.c:1168 modules/file/imgexport.c:3836
+#: libgwydgets/gwy3dwindow.c:1167 modules/file/imgexport.c:3806
 msgid "_Label:"
 msgstr "_Etichetta:"
 
-#: libgwydgets/gwy3dwindow.c:1173
+#: libgwydgets/gwy3dwindow.c:1180
 msgid "_Text:"
 msgstr "_Testo:"
 
-#: libgwydgets/gwy3dwindow.c:1193
+#: libgwydgets/gwy3dwindow.c:1185
 msgid "Move label"
 msgstr "Sposta etichetta"
 
-#: libgwydgets/gwy3dwindow.c:1202
+#: libgwydgets/gwy3dwindow.c:1194
 msgid "_Horizontally:"
 msgstr "_Orizzontale:"
 
-#: libgwydgets/gwy3dwindow.c:1212
+#: libgwydgets/gwy3dwindow.c:1204
 msgid "_Vertically:"
 msgstr "_Verticale:"
 
-#: libgwydgets/gwy3dwindow.c:1220
+#: libgwydgets/gwy3dwindow.c:1212
+msgid "A_ll labels have the same size"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:1223
 msgid "Scale size _automatically"
 msgstr "Ridimensiona _automaticamente"
 
-#: libgwydgets/gwy3dwindow.c:1232 modules/tools/filter.c:290
+#: libgwydgets/gwy3dwindow.c:1235 modules/tools/filter.c:291
 msgid "Si_ze:"
 msgstr "Dimensione:"
 
-#: libgwydgets/gwy3dwindow.c:1232 modules/process/cwt.c:151
-#: modules/process/hough.c:212
-msgid "pixels"
-msgstr "pixel"
+#: libgwydgets/gwy3dwindow.c:1277
+msgid "Show false _colorbar"
+msgstr "Mostra barra falsi _colori"
+
+#: libgwydgets/gwy3dwindow.c:1286
+msgid "Reserve space for _colorbar"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:1302 modules/process/lat_synth.c:651
+#: modules/process/obj_synth.c:542 modules/process/pat_synth.c:1458
+#: modules/process/phase_synth.c:279
+msgid "_Size:"
+msgstr "Dimensione:"
+
+#: libgwydgets/gwy3dwindow.c:1311
+#, fuzzy
+msgid "_Vertical alignment:"
+msgstr "Dimensione verticale:"
 
-#: libgwydgets/gwy3dwindow.c:1726 libgwydgets/gwy3dwindow.c:1779
+#: libgwydgets/gwy3dwindow.c:1844 libgwydgets/gwy3dwindow.c:1897
 msgid "S_witch to Lighting Mode"
 msgstr "Visualizzazione Illuminazione"
 
-#: libgwydgets/gwy3dwindow.c:1734 libgwydgets/gwy3dwindow.c:1756
+#: libgwydgets/gwy3dwindow.c:1852 libgwydgets/gwy3dwindow.c:1874
 msgid "S_witch to Overlay Mode"
 msgstr "S_postamento in modalità Overlay"
 
-#: libgwydgets/gwy3dwindow.c:1748 libgwydgets/gwy3dwindow.c:1771
+#: libgwydgets/gwy3dwindow.c:1866 libgwydgets/gwy3dwindow.c:1889
 msgid "S_witch to Color Gradient Mode"
 msgstr "Visualizzazione Gradiente di Colore"
 
-#: libgwydgets/gwy3dwindow.c:1787
+#: libgwydgets/gwy3dwindow.c:1905
 msgid "T_oggle light"
 msgstr "Attiva luce"
 
-#: libgwydgets/gwyaxisdialog.c:99
+#: libgwydgets/gwyaxisdialog.c:75
 msgid "Axis Properties"
 msgstr "Proprietà asse"
 
-#: libgwydgets/gwyaxisdialog.c:101 libgwydgets/gwygraphlabeldialog.c:63
-msgid "Label Properties"
-msgstr "Proprietà etichetta"
-
-#: libgwydgets/gwyaxisdialog.c:184
+#: libgwydgets/gwyaxisdialog.c:88
 msgid "Label Text"
 msgstr "Testo Etichetta"
 
@@ -1093,7 +1163,7 @@ msgid "Hidden"
 msgstr "Nascosto"
 
 #: libgwydgets/gwydgetenums.c:47 libgwydgets/gwygraphwindowmeasuredialog.c:572
-#: modules/file/imgexport.c:475 modules/tools/selectionmanager.c:274
+#: modules/file/imgexport.c:474 modules/tools/selectionmanager.c:274
 msgid "Points"
 msgstr "Punti"
 
@@ -1101,7 +1171,7 @@ msgstr "Punti"
 msgid "Line + points"
 msgstr "Linea + punti"
 
-#: libgwydgets/gwydgetutils.c:564
+#: libgwydgets/gwydgetutils.c:848
 msgid "Change Mask Color"
 msgstr "Cambia colore maschera"
 
@@ -1110,7 +1180,7 @@ msgid "Quantity"
 msgstr "Quantità"
 
 #: libgwydgets/gwygrainvaluemenu.c:194 libgwydgets/gwygrainvaluemenu.c:207
-#: modules/process/curvature.c:753
+#: modules/process/curvature.c:750
 msgid "Symbol"
 msgstr "Simbolo"
 
@@ -1130,136 +1200,141 @@ msgstr "Pre_v"
 msgid "_Next"
 msgstr "Successivo"
 
-#: libgwydgets/gwygraphareadialog.c:127 modules/file/rawgraph.c:302
+#: libgwydgets/gwygraphareadialog.c:123 modules/file/rawgraph.c:302
 msgid "Plot _style:"
 msgstr "Stile grafico:"
 
-#: libgwydgets/gwygraphareadialog.c:148
+#: libgwydgets/gwygraphareadialog.c:131
 msgid "Pl_ot color:"
 msgstr "Colore grafico:"
 
-#: libgwydgets/gwygraphareadialog.c:159
+#: libgwydgets/gwygraphareadialog.c:151
 msgid "Point _type:"
 msgstr "Tipo punto:"
 
-#: libgwydgets/gwygraphareadialog.c:165
+#: libgwydgets/gwygraphareadialog.c:157
 msgid "_Point size:"
 msgstr "Dimensione punto:"
 
-#: libgwydgets/gwygraphareadialog.c:175
+#: libgwydgets/gwygraphareadialog.c:167
 msgid "_Line type:"
 msgstr "Tipo linea:"
 
-#: libgwydgets/gwygraphareadialog.c:181 modules/file/imgexport.c:3150
+#: libgwydgets/gwygraphareadialog.c:173 modules/file/imgexport.c:3154
 msgid "Line t_hickness:"
 msgstr "Spessore linea:"
 
-#: libgwydgets/gwygraphareadialog.c:187
+#: libgwydgets/gwygraphareadialog.c:180
 msgid "<b>Label Te_xt</b>"
 msgstr "<b>Testo Etichetta</b>"
 
-#: libgwydgets/gwygraphareadialog.c:404
+#: libgwydgets/gwygraphareadialog.c:397
 msgid "Set Curve Color"
 msgstr "Definisci colore curva"
 
-#: libgwydgets/gwygraphareadialog.c:556 modules/process/mask_morph.c:179
+#: libgwydgets/gwygraphareadialog.c:549 modules/process/mask_morph.c:178
 msgid "Square"
 msgstr "Quadrata"
 
-#: libgwydgets/gwygraphareadialog.c:558 modules/process/mask_morph.c:180
+#: libgwydgets/gwygraphareadialog.c:551 modules/process/mask_morph.c:179
 msgid "Diamond"
 msgstr "Rombo"
 
-#: libgwydgets/gwygraphareadialog.c:559
+#: libgwydgets/gwygraphareadialog.c:552
 msgid "Cross"
 msgstr "Croce"
 
-#: libgwydgets/gwygraphareadialog.c:560
+#: libgwydgets/gwygraphareadialog.c:553
 msgid "Diagonal cross"
 msgstr "Croce diagonale"
 
-#: libgwydgets/gwygraphareadialog.c:561
+#: libgwydgets/gwygraphareadialog.c:554
 msgid "Asterisk"
 msgstr "Asterisco"
 
-#: libgwydgets/gwygraphareadialog.c:562
+#: libgwydgets/gwygraphareadialog.c:555
 msgid "Star"
 msgstr "Stella"
 
-#: libgwydgets/gwygraphareadialog.c:563
+#: libgwydgets/gwygraphareadialog.c:556
 msgid "Triangle up"
 msgstr "Triangolo vertice alto"
 
-#: libgwydgets/gwygraphareadialog.c:564
+#: libgwydgets/gwygraphareadialog.c:557
 msgid "Triangle down"
 msgstr "Triangolo vertice basso"
 
-#: libgwydgets/gwygraphareadialog.c:565
+#: libgwydgets/gwygraphareadialog.c:558
 msgid "Triangle left"
 msgstr "Triangolo vertice a sinistra"
 
-#: libgwydgets/gwygraphareadialog.c:566
+#: libgwydgets/gwygraphareadialog.c:559
 msgid "Triangle right"
 msgstr "Triangolo vertice a destra"
 
-#: libgwydgets/gwygraphareadialog.c:567
+#: libgwydgets/gwygraphareadialog.c:560
 msgid "Full square"
 msgstr "Quadrato pieno"
 
-#: libgwydgets/gwygraphareadialog.c:568 modules/process/mask_morph.c:177
+#: libgwydgets/gwygraphareadialog.c:561 modules/process/mask_morph.c:176
 msgid "Disc"
 msgstr "Disco"
 
-#: libgwydgets/gwygraphareadialog.c:569
+#: libgwydgets/gwygraphareadialog.c:562
 msgid "Full diamond"
 msgstr "Rombo pieno"
 
-#: libgwydgets/gwygraphareadialog.c:570
+#: libgwydgets/gwygraphareadialog.c:563
 msgid "Full triangle up"
 msgstr "Triangolo pieno vertice alto"
 
-#: libgwydgets/gwygraphareadialog.c:571
+#: libgwydgets/gwygraphareadialog.c:564
 msgid "Full triangle down"
 msgstr "Triangolo pieno vertice basso"
 
-#: libgwydgets/gwygraphareadialog.c:572
+#: libgwydgets/gwygraphareadialog.c:565
 msgid "Full triangle left"
 msgstr "Triangolo pieno vertice a sinistra"
 
-#: libgwydgets/gwygraphareadialog.c:573
+#: libgwydgets/gwygraphareadialog.c:566
 msgid "Full triangle right"
 msgstr "Triangolo pieno vertice a destra"
 
-#: libgwydgets/gwygraphareadialog.c:635
+#: libgwydgets/gwygraphareadialog.c:628
 msgid "line-style|Solid"
 msgstr "stile-linea|Piena"
 
-#: libgwydgets/gwygraphareadialog.c:636
+#: libgwydgets/gwygraphareadialog.c:629
 msgid "line-style|Dash"
 msgstr "stile-linea|Tratteggiata"
 
-#: libgwydgets/gwygraphcurves.c:451
+#: libgwydgets/gwygraphcurves.c:448
 msgid "Description"
 msgstr "Descrizione"
 
-#: libgwydgets/gwygraphcurves.c:463
+#: libgwydgets/gwygraphcurves.c:460
 msgid "Mode"
 msgstr "Modo "
 
-#: libgwydgets/gwygraphcurves.c:481
+#: libgwydgets/gwygraphcurves.c:478
 msgid "Color"
 msgstr "Colore"
 
-#: libgwydgets/gwygraphcurves.c:494
+#: libgwydgets/gwygraphcurves.c:491
 msgid "Point Type"
 msgstr "Tipo punto"
 
-#: libgwydgets/gwygraphcurves.c:516
+#: libgwydgets/gwygraphcurves.c:513
 msgid "Line Style"
 msgstr "Stile linea"
 
+#: libgwydgets/gwygraphlabeldialog.c:63
+msgid "Label Properties"
+msgstr "Proprietà etichetta"
+
 #: libgwydgets/gwygraphlabeldialog.c:74
-msgid "Frame thickness:"
+#, fuzzy
+msgid "_Frame thickness:"
 msgstr "Spessore cornice:"
 
 #: libgwydgets/gwygraphlabeldialog.c:81
@@ -1270,12 +1345,12 @@ msgstr "Disposizione invertita"
 msgid "Abscissa"
 msgstr "Ascissa"
 
-#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1002 app/toolbox.c:108
+#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1015 app/toolbox.c:113
 msgid "Graph"
 msgstr "Grafico"
 
 #: libgwydgets/gwygraphwindow.c:170 modules/file/hdrimage.cc:472
-#: modules/process/fit-shape.c:656
+#: modules/process/fit-shape.c:666 modules/process/psf.c:229
 msgid "Data"
 msgstr "Dati"
 
@@ -1313,15 +1388,15 @@ msgstr "Punta in una direzione qualunque"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:394
 #: libgwydgets/gwygraphwindowmeasuredialog.c:580 modules/tools/linestats.c:170
-#: modules/tools/roughness.c:516 modules/volume/volume_linestat.c:157
+#: modules/tools/roughness.c:517 modules/volume/volume_linestat.c:159
 msgid "Length"
 msgstr "Lunghezza"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:398
 #: libgwydgets/gwygraphwindowmeasuredialog.c:588 app/gwyplaintool.c:1018
-#: modules/process/lat_synth.c:747 modules/process/obj_synth.c:569
-#: modules/process/pat_synth.c:846 modules/process/pat_synth.c:1148
-#: modules/process/pat_synth.c:1483
+#: modules/process/fibre_synth.c:534 modules/process/lat_synth.c:747
+#: modules/process/obj_synth.c:567 modules/process/pat_synth.c:847
+#: modules/process/pat_synth.c:1149 modules/process/pat_synth.c:1484
 msgid "Height"
 msgstr "Altezza"
 
@@ -1334,12 +1409,12 @@ msgid "Curve:"
 msgstr "Curvatura:"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:553
-#: modules/process/linematch.c:828 modules/process/semsim.c:249
+#: modules/process/linematch.c:795 modules/process/semsim.c:249
 #: modules/xyz/xyz_level.c:254
 msgid "Method:"
 msgstr "Metodo:"
 
-#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:354
+#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:331
 msgid "Angle"
 msgstr "Angolo"
 
@@ -1349,7 +1424,7 @@ msgid "Preferred"
 msgstr "Preferiti"
 
 #: libgwydgets/gwyoptionmenus.c:470 app/meta.c:410
-#: modules/file/imgexport.c:4160 modules/file/imgexport.c:4607
+#: modules/file/imgexport.c:4110 modules/file/imgexport.c:4555
 #: modules/file/rawfile.c:995 modules/process/convolution_filter.c:538
 #: modules/process/neural.c:418 modules/tools/selectionmanager.c:345
 msgid "Name"
@@ -1388,7 +1463,7 @@ msgid "A_dd symbol"
 msgstr "A_ggiungi simbolo"
 
 #: libgwydgets/gwyscitext.c:274 modules/file/rawfile.c:553
-#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:405
+#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:419
 msgid "Preview"
 msgstr "Anteprima"
 
@@ -1406,87 +1481,81 @@ msgstr "Nessun modulo è in grado di caricare questo tipo di file."
 msgid "No module can save to this file type."
 msgstr "Nessun modulo può salvare in questo formato."
 
-#: libgwymodule/gwymodulebrowser.c:67
+#: libgwymodule/gwymodulebrowser.c:66
 msgid "Module Browser"
 msgstr "Navigatore dei Moduli"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Module"
 msgstr "Modulo"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Version"
 msgstr "Versione"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Author"
 msgstr "Autore"
 
-#: libgwymodule/gwymodulebrowser.c:246
+#: libgwymodule/gwymodulebrowser.c:244
 msgid "Name-Version:"
 msgstr "Nome-Versione:"
 
-#: libgwymodule/gwymodulebrowser.c:247 libgwymodule/gwymodulebrowser.c:270
+#: libgwymodule/gwymodulebrowser.c:245 libgwymodule/gwymodulebrowser.c:268
 #: modules/process/grain_stat.c:186
 msgid "File:"
 msgstr "File:"
 
-#: libgwymodule/gwymodulebrowser.c:248
+#: libgwymodule/gwymodulebrowser.c:246
 msgid "Registered functions:"
 msgstr "Funzioni registrate:"
 
-#: libgwymodule/gwymodulebrowser.c:249
+#: libgwymodule/gwymodulebrowser.c:247
 msgid "Authors:"
 msgstr "Autori:"
 
-#: libgwymodule/gwymodulebrowser.c:250
+#: libgwymodule/gwymodulebrowser.c:248
 msgid "Copyright:"
 msgstr "Diritti d'autore:"
 
-#: libgwymodule/gwymodulebrowser.c:251
+#: libgwymodule/gwymodulebrowser.c:249
 msgid "Date:"
 msgstr "Data:"
 
-#: libgwymodule/gwymodulebrowser.c:252
+#: libgwymodule/gwymodulebrowser.c:250
 msgid "Description:"
 msgstr "Descrizione:"
 
-#: libgwymodule/gwymodulebrowser.c:269
+#: libgwymodule/gwymodulebrowser.c:267
 msgid "Name:"
 msgstr "Nome:"
 
-#: libgwymodule/gwymodulebrowser.c:271
+#: libgwymodule/gwymodulebrowser.c:269
 msgid "Failure:"
 msgstr "Fallimento:"
 
-#: app/about.c:57
+#: app/about.c:58
 #, c-format
 msgid "About %s"
 msgstr "Informazioni su %s"
 
-#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
-#: app/about.c:92
-#, c-format
-msgid "Released %s\n"
-msgstr "Rilasciato  %s\n"
-
-#: app/about.c:93
+#: app/about.c:97
 msgid "An SPM data visualization and analysis tool."
 msgstr "Applicazione di analisi e visualizzazione dati SPM."
 
-#: app/about.c:101
+#: app/about.c:105
 msgid "Report bugs to:"
 msgstr "Segnalazione bachi: "
 
-#: app/about.c:116
+#: app/about.c:120
 msgid "Credits"
 msgstr "Credits"
 
-#: app/about.c:133
+#: app/about.c:137
 msgid "License"
 msgstr "Licenza"
 
-#: app/about.c:138
+#: app/about.c:142
 #, c-format
 msgid ""
 "%s is free software; you can redistribute it and/or modify it under the "
@@ -1500,59 +1569,63 @@ msgstr ""
 "versione 2 o (a scelta) ogni versione successiva. Per il testo completo "
 "della licenza vedi il file COPYING incluso nel pacchetto sorgente"
 
-#: app/about.c:160 modules/process/logistic.c:270
+#: app/about.c:164 modules/process/logistic.c:269
 msgid "Features"
 msgstr "Caratteristiche"
 
-#: app/about.c:220
+#: app/about.c:224
 msgid "Developers"
 msgstr "Altri sviluppatori"
 
-#: app/about.c:221
+#: app/about.c:225
 msgid "Translators"
 msgstr "Traduttori"
 
-#: app/about.c:225
+#: app/about.c:229
 msgid "Development is supported by the Czech Metrology Institute: "
 msgstr ""
 "Lo sviluppo del programma e' sostenuto dall'Istituto di Metrologia Ceco:"
 
-#: app/about.c:253 app/about.c:256
+#: app/about.c:257 app/about.c:260
 msgid "OpenGL 3D View"
 msgstr "Vista 3D Open GL"
 
-#: app/about.c:257 app/about.c:271 app/about.c:291
+#: app/about.c:261 app/about.c:266 app/about.c:286
 msgid "not available\n"
 msgstr "non disponibile\n"
 
-#: app/about.c:262 app/about.c:265
-msgid "Fast Fourier Transform"
-msgstr "Trasformata di Fourier"
-
-#: app/about.c:266
-msgid "built-in SimpleFFT\n"
-msgstr "Semplice FFT, incorporata\n"
-
-#: app/about.c:274
+#: app/about.c:269
 msgid "X11 protocol\n"
 msgstr "Protocollo X11\n"
 
-#: app/about.c:276
+#: app/about.c:271
 msgid "Win32 protocol\n"
 msgstr "Protocollo Win32\n"
 
-#: app/about.c:278
+#: app/about.c:273
 msgid "LibUnique\n"
 msgstr "LibUnique\n"
 
-#: app/about.c:282
+#: app/about.c:277
 msgid "Remote Control"
 msgstr "Controllo Remoto"
 
-#: app/about.c:286 app/about.c:290
+#: app/about.c:281 app/about.c:285
 msgid "Python Scripting Interface"
 msgstr "Interfaccia di Scripting Python"
 
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:311
+#, c-format
+msgid "Development version, built %s"
+msgstr ""
+
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:328
+#, fuzzy, c-format
+msgid "Released %s"
+msgstr "Rilasciato  %s\n"
+
 #: app/app.c:301
 #, c-format
 msgid ""
@@ -1564,116 +1637,125 @@ msgstr ""
 "%s\n"
 "Uscire ugualmente?"
 
-#: app/app.c:440
+#: app/app.c:442
 msgid "Mask _Color..."
 msgstr "Colore_Maschera..."
 
-#: app/app.c:456 app/app.c:1725
+#: app/app.c:458 app/app.c:1754
 msgid "Zoom _1:1"
 msgstr "Ingrandimento _1:1"
 
-#: app/app.c:460 app/app.c:1729 app/app.c:1957
+#: app/app.c:462 app/app.c:1758 app/app.c:1988
 msgid "Metadata _Browser..."
 msgstr "Navigatore _Metadata..."
 
-#: app/app.c:465 app/app.c:1734 app/app.c:1962
+#: app/app.c:467 app/app.c:1763 app/app.c:1993
 msgid "View _Log..."
 msgstr "Visualizza registro..."
 
-#: app/app.c:649
+#: app/app.c:651
 msgid "Pi_xelwise Square"
 msgstr "Dimensioni pixel quadrati"
 
-#: app/app.c:659
+#: app/app.c:661
 msgid "_Physically Square"
 msgstr "Dimensioni reali quadrate"
 
-#: app/app.c:836
+#: app/app.c:842
+msgid "Set as Default"
+msgstr "Salva come predefinito"
+
+#: app/app.c:844
+msgid "Set the current view setup as the default"
+msgstr "Salva la vista corrente come predefinita"
+
+#: app/app.c:854
 msgid "verb|Save"
 msgstr "Salva"
 
-#: app/app.c:839 app/app.c:843
+#: app/app.c:857 app/app.c:861
 msgid "Save 3D view to an image"
 msgstr "Salva vista 3D come immagine"
 
-#: app/app.c:849
-msgid "Set as Default"
-msgstr "Salva come predefinito"
+#: app/app.c:869
+#, fuzzy
+msgid "_Autocrop"
+msgstr "_Auto"
 
-#: app/app.c:851
-msgid "Set the current view setup as the default"
-msgstr "Salva la vista corrente come predefinita"
+#: app/app.c:873
+msgid "Remove white borders from exported image"
+msgstr ""
 
-#: app/app.c:940
+#: app/app.c:960
 msgid "_Show mask"
 msgstr "Mostra maschera"
 
-#: app/app.c:1106
+#: app/app.c:1172
 #, c-format
 msgid "Saving of 3D view to `%s' failed"
 msgstr "Salvataggio di vista 3D come `%s' fallito"
 
-#: app/app.c:1150
+#: app/app.c:1222
 msgid "Export 3D View"
 msgstr "Esporta vista 3D"
 
-#: app/app.c:1457
+#: app/app.c:1478
 msgid "_Change Preview"
 msgstr "_Cambia anteprima"
 
-#: app/app.c:1583
+#: app/app.c:1606
 msgid "Change Volume Data Preview"
 msgstr "Cambia Anteprima Dati Volume"
 
-#: app/app.c:1593
+#: app/app.c:1616
 msgid "Preview quantity:"
 msgstr "Anteprima quantità:"
 
-#: app/app.c:1603 modules/process/extend.c:267 modules/tools/linestats.c:165
+#: app/app.c:1626 modules/process/extend.c:267 modules/tools/linestats.c:165
 #: modules/volume/volume_linestat.c:142
 msgid "Mean"
 msgstr "Media"
 
-#: app/app.c:1604 modules/process/polydistort.c:255 modules/tools/filter.c:240
+#: app/app.c:1627 modules/process/polydistort.c:258 modules/tools/filter.c:241
 #: modules/tools/icolorange.c:424 modules/tools/linestats.c:167
 #: modules/volume/volume_linestat.c:144
 msgid "Minimum"
 msgstr "Minimo"
 
-#: app/app.c:1605 modules/process/col_synth.c:170 modules/tools/filter.c:241
+#: app/app.c:1628 modules/process/col_synth.c:170 modules/tools/filter.c:242
 #: modules/tools/icolorange.c:435 modules/tools/linestats.c:168
 #: modules/volume/volume_linestat.c:145
 msgid "Maximum"
 msgstr "Massimo"
 
-#: app/app.c:1606
+#: app/app.c:1629 modules/volume/volume_linestat.c:146
 msgid "Min. position"
 msgstr "Posizione Min."
 
-#: app/app.c:1607
+#: app/app.c:1630 modules/volume/volume_linestat.c:147
 msgid "Max. position"
 msgstr "Posizione Max."
 
-#: app/app.c:1608 modules/process/bdep_synth.c:134
-#: modules/process/col_synth.c:171 modules/process/scars.c:346
-#: modules/process/scars.c:353 modules/process/threshold.c:341
+#: app/app.c:1631 modules/process/bdep_synth.c:134
+#: modules/process/col_synth.c:171 modules/process/scars.c:369
+#: modules/process/scars.c:377 modules/process/threshold.c:336
 msgid "RMS"
 msgstr "RMS"
 
-#: app/app.c:1609 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
-#: modules/file/xyzexport.c:233 modules/file/xyzexport.c:302
+#: app/app.c:1632 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
+#: modules/file/xyzexport.c:236 modules/file/xyzexport.c:305
 msgid "Channel:"
 msgstr "Canale:"
 
-#: app/app.c:1610
+#: app/app.c:1633
 msgid "Section:"
 msgstr "Sezione:"
 
-#: app/app.c:1861
+#: app/app.c:1890
 msgid "_Update Preview"
 msgstr "Aggiorna anteprima"
 
-#: app/app.c:1867
+#: app/app.c:1896
 msgid "_Density Map"
 msgstr "Mappa di _Densità"
 
@@ -1692,12 +1774,12 @@ msgstr "Volume %d sconosciuto"
 msgid "Unknown XYZ %d"
 msgstr "XYZ %d sconosciuto"
 
-#: app/data-browser-aux.c:2795
+#: app/data-browser-aux.c:2839
 #, c-format
 msgid "Z levels: %d, Z unit: %s"
 msgstr ""
 
-#: app/data-browser-aux.c:2821
+#: app/data-browser-aux.c:2865
 #, c-format
 msgid "Points: %d"
 msgstr "Punti: %d"
@@ -1727,10 +1809,11 @@ msgid "Close file"
 msgstr "Chiudi file"
 
 #: app/data-browser.c:5582
-msgid "Channels"
-msgstr "Canali"
+#, fuzzy
+msgid "Images"
+msgstr "Immagine"
 
-#: app/data-browser.c:5596 modules/volume/volume_extract.c:444
+#: app/data-browser.c:5596 modules/volume/volume_extract.c:431
 msgid "Graphs"
 msgstr "Grafici"
 
@@ -1786,45 +1869,45 @@ msgstr ""
 "\n"
 "%s"
 
-#: app/file.c:285
+#: app/file.c:292
 #, c-format
 msgid "Opening of `%s' failed"
 msgstr "Apertura di `%s' fallita"
 
-#: app/file.c:291 app/file.c:526
+#: app/file.c:298 app/file.c:533
 #, c-format
 msgid "Full file path: %s."
 msgstr "Percorso completo file: %s"
 
-#: app/file.c:294
+#: app/file.c:301
 #, c-format
 msgid "Loaded using: %s."
 msgstr "Caricato usando: %s."
 
-#: app/file.c:380
+#: app/file.c:387
 msgid "Merge File"
 msgstr "Fondi file"
 
-#: app/file.c:382 app/gwyappfilechooser.c:221
+#: app/file.c:389 app/gwyappfilechooser.c:226
 msgid "Open File"
 msgstr "Apri File"
 
-#: app/file.c:520 app/gwymoduleutils.c:192
+#: app/file.c:527 app/gwymoduleutils.c:192
 #, c-format
 msgid "Saving of `%s' failed"
 msgstr "Salvataggio di `%s' fallito"
 
-#: app/file.c:529
+#: app/file.c:536
 #, c-format
 msgid "Saved using: %s."
 msgstr "Salvato usando: %s."
 
-#: app/file.c:689
+#: app/file.c:696
 #, c-format
 msgid "File `%s' already exists.  Replace?"
 msgstr "File `%s esistente. Sostituire?"
 
-#: app/file.c:693
+#: app/file.c:700
 #, c-format
 msgid ""
 "The file already exists in `%s'.  Replacing it will overwrite its contents."
@@ -1832,7 +1915,7 @@ msgstr ""
 "Il file già esiste in `%s'. La sua sostituzione ne sovrascriverà il "
 "contenuto."
 
-#: app/file.c:696
+#: app/file.c:703
 msgid "Replace File?"
 msgstr "Sostituire file?"
 
@@ -1856,11 +1939,11 @@ msgstr "Chiudi elenco file"
 msgid "Open selected file"
 msgstr "Apri file selezionato"
 
-#: app/filelist.c:566 app/gwyappfilechooser.c:583
+#: app/filelist.c:566 app/gwyappfilechooser.c:592
 msgid "_Filter:"
 msgstr "_Filtro:"
 
-#: app/filelist.c:604 app/gwyappfilechooser.c:619
+#: app/filelist.c:604 app/gwyappfilechooser.c:628
 msgid "Case _sensitive"
 msgstr "Case _sensitive (discrimina tra minuscole e maiuscole)"
 
@@ -1910,97 +1993,97 @@ msgstr "_Curva"
 msgid "_Snap to control points"
 msgstr ""
 
-#: app/gwyappfilechooser.c:226
+#: app/gwyappfilechooser.c:231
 msgid "Save File"
 msgstr "Salva File"
 
-#: app/gwyappfilechooser.c:380
+#: app/gwyappfilechooser.c:389
 #, c-format
 msgid "File _type: %s"
 msgstr "Tipo _File: %s"
 
-#: app/gwyappfilechooser.c:387
+#: app/gwyappfilechooser.c:396
 msgid "Only loadable shown"
 msgstr "Mostrati solo i caricabili"
 
-#: app/gwyappfilechooser.c:391
+#: app/gwyappfilechooser.c:400
 #, c-format
 msgid "Filter: %s"
 msgstr "Filtro:  %s"
 
-#: app/gwyappfilechooser.c:455
+#: app/gwyappfilechooser.c:464
 msgid "Automatic by extension"
 msgstr "Automatico per estensione"
 
-#: app/gwyappfilechooser.c:464
+#: app/gwyappfilechooser.c:473
 msgid "Automatically detected"
 msgstr "Riconoscimento automatico"
 
-#: app/gwyappfilechooser.c:561
+#: app/gwyappfilechooser.c:570
 msgid "Show only loadable files"
 msgstr "Mostra unicamente i file caricabili"
 
-#: app/gwyappfilechooser.c:844
+#: app/gwyappfilechooser.c:855
 msgid "Plane-level previewed data"
 msgstr "Anteprima dati livello piano"
 
-#: app/gwyappfilechooser.c:860
+#: app/gwyappfilechooser.c:871
 msgid "Row-level previewed data"
 msgstr "Anteprima dati livello riga"
 
-#: app/gwyappfilechooser.c:969
+#: app/gwyappfilechooser.c:987
+msgid "File too large for preview"
+msgstr ""
+
+#: app/gwyappfilechooser.c:988
 msgid "…"
 msgstr "…"
 
-#: app/gwyappfilechooser.c:1331
+#: app/gwyappfilechooser.c:1352
 msgid "Cannot preview"
 msgstr "Impossibile visualizzare anteprima"
 
-#: app/gwyddion.c:143
+#: app/gwyddion.c:147
 msgid "Loading document history"
 msgstr "Carica cronologia"
 
-#: app/gwyddion.c:148
+#: app/gwyddion.c:152
 msgid "Registering "
 msgstr "Registrazione "
 
-#: app/gwyddion.c:149
+#: app/gwyddion.c:153
 msgid "stock items"
 msgstr ""
 
-#: app/gwyddion.c:153
+#: app/gwyddion.c:157
 msgid "color gradients"
 msgstr "Gradienti colore"
 
-#: app/gwyddion.c:155
+#: app/gwyddion.c:159
 msgid "GL materials"
 msgstr "Materiali GL"
 
-#: app/gwyddion.c:157
+#: app/gwyddion.c:161
 msgid "grain quantities"
 msgstr "Quantità Grani"
 
-#: app/gwyddion.c:159
+#: app/gwyddion.c:163
 msgid "calibrations"
 msgstr "calibrazioni"
 
-#: app/gwyddion.c:164
+#: app/gwyddion.c:168
 msgid "Loading settings"
 msgstr "Caricamento preferenze"
 
-#: app/gwyddion.c:171
+#: app/gwyddion.c:175
 msgid "Registering modules"
 msgstr "Registrazione moduli"
 
-#: app/gwyddion.c:193
-msgid "Initializing GUI"
-msgstr "Inizializzazione GUI"
-
-#: app/gwyddion.c:439
+#: app/gwyddion.c:464
 msgid "Could not read settings."
 msgstr "Impossibile leggere le preferenze."
 
-#: app/gwyddion.c:442
+#: app/gwyddion.c:467
 #, c-format
 msgid ""
 "Settings file `%s' cannot be read: %s\n"
@@ -2013,42 +2096,62 @@ msgstr ""
 "Per evitare la perdita di preferenze salvate non verrà fatto alcun tentativo "
 "di aggiornamento fino a che il file non sarà riparato o rimosso."
 
-#: app/gwymoduleutils-file.c:542
+#: app/gwyddion.c:505
+#, c-format
+msgid "Many modules (%u) failed to register."
+msgstr ""
+
+#: app/gwyddion.c:510
+#, c-format
+msgid ""
+"Most likely Gwyddion was not upgraded correctly.  Instead, one installation "
+"was just overwritten with another, and now it is a mess.\n"
+"\n"
+"Please remove completely the module directory\n"
+"\n"
+"%s\n"
+"\n"
+"and reinstall Gwyddion.\n"
+"\n"
+"See Info → Module Browser for specific errors."
+msgstr ""
+
+#: app/gwymoduleutils-file.c:536
 #, c-format
 msgid "Section %s ended at line %u but it has never started."
 msgstr "La sezione %s termina alla linea %u ma non ha inizio."
 
-#: app/gwymoduleutils-file.c:550
+#: app/gwymoduleutils-file.c:544
 #, c-format
 msgid "Section %s ended at line %u instead of %s."
 msgstr "La sezione %s termina alla linea %u invece di %s."
 
-#: app/gwymoduleutils-file.c:587
+#: app/gwymoduleutils-file.c:581
 #, c-format
 msgid "Section %s started at line %u before %s ended."
 msgstr "La sezione %s inizia alla linea %u prima che  %s finisca."
 
-#: app/gwymoduleutils-file.c:593
+#: app/gwymoduleutils-file.c:587
 #, c-format
 msgid "Empty section name at header line %u."
 msgstr "Nome sezione vuoto alla linea %u dell'intestazione"
 
-#: app/gwymoduleutils-file.c:628
+#: app/gwymoduleutils-file.c:622
 #, c-format
 msgid "Header line %u lacks prefix %s."
 msgstr "La linea  %u dell'intestazione manca del prefisso  %s."
 
-#: app/gwymoduleutils-file.c:653
+#: app/gwymoduleutils-file.c:647
 #, c-format
 msgid "Header line %u lacks key-value separator."
 msgstr "La linea di intestazione %u manca di separatore di valore chiave"
 
-#: app/gwymoduleutils-file.c:661
+#: app/gwymoduleutils-file.c:655
 #, c-format
 msgid "Key at header line %u is empty."
 msgstr "La chiave alla linea %u dell'intestazione è vuota."
 
-#: app/gwymoduleutils-file.c:688
+#: app/gwymoduleutils-file.c:682
 #, c-format
 msgid "Header suddenly ended at line %u; end of header marker is missing"
 msgstr ""
@@ -2057,6 +2160,7 @@ msgstr ""
 
 #: app/gwymoduleutils.c:197 app/settings.c:131 app/settings.c:142
 #: app/toolbox-spec.c:536 modules/file/err.h:62
+#: modules/pygwy/pygwy-console.c:528
 #, c-format
 msgid "Cannot write to file: %s."
 msgstr "Impossibile scrivere su file: %s."
@@ -2085,8 +2189,9 @@ msgstr "Origine"
 
 #: app/gwyplaintool.c:1011 modules/file/rawfile.c:997
 #: modules/process/convolution_filter.c:349
-#: modules/process/convolution_filter.c:553 modules/process/neural.c:419
-#: modules/process/obj_synth.c:538 modules/process/pat_synth.c:1449
+#: modules/process/convolution_filter.c:553 modules/process/fibre_synth.c:520
+#: modules/process/neural.c:419 modules/process/obj_synth.c:536
+#: modules/process/pat_synth.c:1450
 msgid "Size"
 msgstr "Dimensioni"
 
@@ -2143,7 +2248,7 @@ msgstr "Pulisci"
 msgid "_Close"
 msgstr "_Esci"
 
-#: app/log.c:615 modules/file/imgexport.c:4168 modules/file/rawfile.c:996
+#: app/log.c:615 modules/file/imgexport.c:4118 modules/file/rawfile.c:996
 msgid "Type"
 msgstr "Tipo"
 
@@ -2151,8 +2256,8 @@ msgstr "Tipo"
 msgid "Function"
 msgstr "Funzione"
 
-#: app/log.c:617 modules/file/imgexport.c:3117 modules/process/fit-shape.c:465
-#: modules/process/neural.c:610 modules/tools/stats.c:425
+#: app/log.c:617 modules/file/imgexport.c:3128 modules/process/fit-shape.c:466
+#: modules/process/neural.c:614 modules/tools/stats.c:423
 msgid "Parameters"
 msgstr "Parametri"
 
@@ -2164,39 +2269,39 @@ msgstr "Tempo"
 msgid "Export Log"
 msgstr "Esporta log"
 
-#: app/menu.c:556 app/toolbox.c:581
+#: app/menu.c:555 app/toolbox.c:595
 msgid "_Data Process"
 msgstr "_Elaborazione Dati"
 
-#: app/menu.c:598 app/toolbox.c:584
+#: app/menu.c:597 app/toolbox.c:598
 msgid "_Graph"
 msgstr "_Grafico"
 
-#: app/menu.c:641 app/toolbox.c:587
+#: app/menu.c:640 app/toolbox.c:601
 msgid "_Volume Data"
 msgstr "Dati _Volume"
 
-#: app/menu.c:684 app/toolbox.c:590
+#: app/menu.c:683 app/toolbox.c:604
 msgid "_XYZ Data"
 msgstr "Dati _XYZ"
 
-#: app/menu.c:715
+#: app/menu.c:714
 msgid "Re-show Last"
 msgstr "Mostra ultimo"
 
-#: app/menu.c:730
+#: app/menu.c:729
 msgid "Repeat Last"
 msgstr "Ripeti ultimo"
 
-#: app/menu.c:858
+#: app/menu.c:857
 msgid "Repeat"
 msgstr "Ripeti"
 
-#: app/menu.c:864
+#: app/menu.c:863
 msgid "Re-show"
 msgstr "Mostra di nuovo"
 
-#: app/menu.c:1186
+#: app/menu.c:1185
 msgid "_Document history"
 msgstr "Cronologia"
 
@@ -2204,8 +2309,8 @@ msgstr "Cronologia"
 msgid "_New"
 msgstr "Nuovo"
 
-#: app/meta.c:235 modules/file/imgexport.c:4672 modules/file/rawfile.c:1058
-#: modules/process/neural.c:711 modules/tools/selectionmanager.c:405
+#: app/meta.c:235 modules/file/imgexport.c:4620 modules/file/rawfile.c:1058
+#: modules/process/neural.c:718 modules/tools/selectionmanager.c:405
 msgid "_Delete"
 msgstr "_Elimina"
 
@@ -2279,11 +2384,11 @@ msgstr "Impossibile creare cartella  utente %s: %s"
 msgid "Cannot create user module directory %s: %s"
 msgstr "Impossibile creare cartella modulo utente %s: %s"
 
-#: app/splash.c:832
+#: app/splash.c:1260
 msgid "Starting "
 msgstr "Inizio"
 
-#: app/splash.c:878
+#: app/splash.c:1313
 msgid " is free software released under GNU GPL."
 msgstr " è un software libero rilasciato sotto GNU GPL."
 
@@ -2825,124 +2930,125 @@ msgstr "_Suggerimento Successivo"
 msgid "_Show tips at startup"
 msgstr "Mostra suggerimenti all'avvio"
 
-#: app/toolbox-editor.c:212
+#: app/toolbox-editor.c:213
 msgid "Toolbox Editor"
 msgstr "Editor degli strumenti"
 
-#: app/toolbox-editor.c:257
+#: app/toolbox-editor.c:258
 msgid "_New Item"
 msgstr "_Nuovo oggetto"
 
-#: app/toolbox-editor.c:262
+#: app/toolbox-editor.c:263
 msgid "_New Group"
 msgstr "_Nuovo gruppo"
 
-#: app/toolbox-editor.c:268 app/toolbox.c:577
+#: app/toolbox-editor.c:269 app/toolbox.c:591
 msgid "_Edit"
 msgstr "_Modifica"
 
-#: app/toolbox-editor.c:273 modules/process/fft_filter_2d.c:499
-#: modules/tools/maskedit.c:548 modules/volume/volume_zcal.c:173
+#: app/toolbox-editor.c:274 modules/process/fft_filter_2d.c:499
+#: modules/tools/maskedit.c:554 modules/volume/volume_zcal.c:173
 msgid "_Remove"
 msgstr "_Rimuovi"
 
-#: app/toolbox-editor.c:278
+#: app/toolbox-editor.c:279
 msgid "Move _Up"
 msgstr "Muovi in alto"
 
-#: app/toolbox-editor.c:283
+#: app/toolbox-editor.c:284
 msgid "Move _Down"
 msgstr "Muovi in basso"
 
-#: app/toolbox-editor.c:292 modules/file/hdrimage.cc:2304
-#: modules/file/imgexport.c:3101 modules/file/pixmap.c:872
+#: app/toolbox-editor.c:293 modules/file/hdrimage.cc:2304
+#: modules/file/imgexport.c:3114 modules/file/pixmap.c:872
 #: modules/file/rawfile.c:658 modules/process/crosscor.c:252
-#: modules/process/dimensions.h:473 modules/process/tip_blind.c:333
+#: modules/process/dimensions.h:455 modules/process/fibre_synth.c:526
+#: modules/process/tip_blind.c:334
 msgid "_Width:"
 msgstr "Larghezza:"
 
-#: app/toolbox-editor.c:774
+#: app/toolbox-editor.c:787
 msgid "Toolbox Group"
 msgstr "Gruppo strumenti"
 
-#: app/toolbox-editor.c:791 modules/file/rawgraph.c:267
+#: app/toolbox-editor.c:804 modules/file/rawgraph.c:267
 msgid "_Title:"
 msgstr "_Titolo:"
 
-#: app/toolbox-editor.c:805
+#: app/toolbox-editor.c:818
 msgid "_Id:"
 msgstr "_Id:"
 
-#: app/toolbox-editor.c:818
+#: app/toolbox-editor.c:831
 msgid "_Suggest"
 msgstr "_Suggerimento"
 
-#: app/toolbox-editor.c:824
+#: app/toolbox-editor.c:837
 msgid "Trans_latable title"
 msgstr ""
 
-#: app/toolbox-editor.c:874
+#: app/toolbox-editor.c:887
 msgid "Group id is not a valid identifier"
 msgstr "Id di gruppo non è un identificativo valido"
 
-#: app/toolbox-editor.c:882
+#: app/toolbox-editor.c:895
 msgid "Group id is not unique"
 msgstr "Id di gruppo non è univoca"
 
-#: app/toolbox-editor.c:971
+#: app/toolbox-editor.c:984
 msgid "Toolbox Item"
 msgstr "elemento strumenti"
 
-#: app/toolbox-editor.c:992 modules/process/coerce.c:331
+#: app/toolbox-editor.c:1005 modules/process/coerce.c:331
 #: modules/tools/filter.c:284
 msgid "_Type:"
 msgstr "_Tipo:"
 
-#: app/toolbox-editor.c:999
+#: app/toolbox-editor.c:1012
 msgid "Placeholder"
 msgstr "Segnaposto"
 
-#: app/toolbox-editor.c:1000
+#: app/toolbox-editor.c:1013
 msgid "Builtin"
 msgstr ""
 
-#: app/toolbox-editor.c:1001 app/toolbox.c:107
+#: app/toolbox-editor.c:1014 app/toolbox.c:112
 msgid "Data Process"
 msgstr "Elaborazione Dati"
 
-#: app/toolbox-editor.c:1003
+#: app/toolbox-editor.c:1016
 msgid "Volume Data"
 msgstr "Dati Volume"
 
-#: app/toolbox-editor.c:1004
+#: app/toolbox-editor.c:1017
 msgid "XYZ Data"
 msgstr "Dati XYZ"
 
-#: app/toolbox-editor.c:1005
+#: app/toolbox-editor.c:1018
 msgid "Tool"
 msgstr "Strumento"
 
-#: app/toolbox-editor.c:1012
+#: app/toolbox-editor.c:1025 modules/tools/profile.c:483
 msgid "_Mode:"
 msgstr "_Modalità:"
 
-#: app/toolbox-editor.c:1019 app/toolbox-editor.c:1038
+#: app/toolbox-editor.c:1032 app/toolbox-editor.c:1051
 msgid "Default"
 msgstr "Predefinito"
 
-#: app/toolbox-editor.c:1020
+#: app/toolbox-editor.c:1033
 msgid "Interactive"
 msgstr "Interattivo"
 
-#: app/toolbox-editor.c:1021
+#: app/toolbox-editor.c:1034
 msgid "Non-interactive"
 msgstr "Non-interattivo"
 
-#: app/toolbox-editor.c:1029
+#: app/toolbox-editor.c:1042
 msgid "Use _icon from:"
 msgstr "Utilizza _icona da:"
 
-#: app/toolbox-editor.c:1063
+#: app/toolbox-editor.c:1076
 msgid "Functions"
 msgstr "Funzioni"
 
@@ -2958,143 +3064,162 @@ msgstr "Ststrumenti rimanenti"
 msgid "All tools not placed explicitly go here."
 msgstr "Tutti gli strumenti non assegnati esplicitamente vanno lì"
 
-#: app/toolbox.c:106
+#: app/toolbox.c:111
 msgid "View"
 msgstr "Vista"
 
-#: app/toolbox.c:109
+#: app/toolbox.c:114
 msgid "Tools"
 msgstr "Strumenti"
 
-#: app/toolbox.c:575
+#: app/toolbox.c:589
 msgid "_File"
 msgstr "_File"
 
-#: app/toolbox.c:593
+#: app/toolbox.c:607
 msgid "_Info"
 msgstr "_Informazioni"
 
-#: app/toolbox.c:663
+#: app/toolbox.c:696
 msgid "Display a 3D view of data"
 msgstr "Vista 3D "
 
-#: app/toolbox.c:667
+#: app/toolbox.c:700
+#, fuzzy
+msgid "Undo"
+msgstr "_Annulla"
+
+#: app/toolbox.c:700
+#, fuzzy
+msgid "Undo last action"
+msgstr "Sottrazione Piano"
+
+#: app/toolbox.c:704
+#, fuzzy
+msgid "Redo"
+msgstr "/_Ripeti"
+
+#: app/toolbox.c:704
+msgid "Redo again last undone action"
+msgstr ""
+
+#: app/toolbox.c:708
 msgid "Zoom in"
 msgstr "Ingrandisci"
 
-#: app/toolbox.c:671
+#: app/toolbox.c:712
 msgid "Zoom out"
 msgstr "Rimpicciolisci"
 
-#: app/toolbox.c:675
+#: app/toolbox.c:716
 msgid "Zoom 1:1"
 msgstr "Ingrandimento 1:1"
 
-#: app/toolbox.c:722
+#: app/toolbox.c:781
 msgid "/Show _Data Browser"
 msgstr "/Mostra _Navigatore dati"
 
-#: app/toolbox.c:730
+#: app/toolbox.c:789
 msgid "/Module _Browser"
 msgstr "/Navigatore Moduli"
 
-#: app/toolbox.c:738
+#: app/toolbox.c:797
 msgid "/Program _Messages"
 msgstr "/_Messaggi del Programma"
 
-#: app/toolbox.c:753
+#: app/toolbox.c:812
 msgid "/_User Guide"
 msgstr "/Guida Utente"
 
-#: app/toolbox.c:761
+#: app/toolbox.c:820
 msgid "/_Tip of the Day"
 msgstr "/_Consiglio del Giorno"
 
-#: app/toolbox.c:769
+#: app/toolbox.c:828
 msgid "/_About Gwyddion"
 msgstr "/Informazioni su Gwyddion"
 
-#: app/toolbox.c:806
+#: app/toolbox.c:865
 msgid "/_Open..."
 msgstr "/_Apri..."
 
-#: app/toolbox.c:814
+#: app/toolbox.c:873
 msgid "/_Merge..."
 msgstr "/_Unisci..."
 
-#: app/toolbox.c:822
+#: app/toolbox.c:881
 msgid "/Open _Recent"
 msgstr "/Apri _Recenti"
 
-#: app/toolbox.c:830
+#: app/toolbox.c:889
 msgid "/_Save"
 msgstr "/_Salva"
 
-#: app/toolbox.c:838
+#: app/toolbox.c:897
 msgid "/Save _As..."
 msgstr "/Salva con nome..."
 
-#: app/toolbox.c:846
+#: app/toolbox.c:905
 msgid "/_Close"
 msgstr "/_Chiudi"
 
-#: app/toolbox.c:854
+#: app/toolbox.c:913
 msgid "/Remo_ve All Logs"
 msgstr "/Rimuo_vi tutti i registri"
 
-#: app/toolbox.c:870
+#: app/toolbox.c:929
 msgid "/_Quit"
 msgstr "/Esci"
 
-#: app/toolbox.c:910
+#: app/toolbox.c:969
 msgid "/_Undo"
 msgstr "/Annulla"
 
-#: app/toolbox.c:918
+#: app/toolbox.c:977
 msgid "/_Redo"
 msgstr "/_Ripeti"
 
-#: app/toolbox.c:934
+#: app/toolbox.c:993
 msgid "/Default Mask _Color..."
 msgstr "/Maschera _Colore Predefinita..."
 
-#: app/toolbox.c:942
+#: app/toolbox.c:1001
 msgid "/Color _Gradients..."
 msgstr "/Gradienti Colore..."
 
-#: app/toolbox.c:950
+#: app/toolbox.c:1009
 msgid "/G_L Materials..."
 msgstr "/Materiali G_L..."
 
-#: app/toolbox.c:958
+#: app/toolbox.c:1017
 msgid "/_Toolbox..."
 msgstr "/Strumenti"
 
-#: app/toolbox.c:966
+#: app/toolbox.c:1025
 msgid "/_Keyboard Shortcuts"
 msgstr "/ Scorciatoie di tastiera"
 
-#: app/toolbox.c:974
+#: app/toolbox.c:1033
 msgid "/_Logging Enabled"
 msgstr "/Registro abilitato"
 
-#: app/toolbox.c:1083
+#: app/toolbox.c:1142
 msgid "Program Messages"
 msgstr "Messaggi del Programma"
 
-#: app/toolbox.c:1320
+#: app/toolbox.c:1379
 msgid "Change Default Mask Color"
 msgstr "Cambia Colore Predefinito Maschera"
 
-#: app/toolbox.c:1348
+#: app/toolbox.c:1407
 msgid "OpenGL 3D graphics not available"
 msgstr "Grafica 3D OpenGL non disponibile"
 
-#: app/toolbox.c:1353
+#: app/toolbox.c:1412
 msgid "OpenGL was disabled with a command-line option."
 msgstr "OpenGL è stato disabilitato con opzione da linea di comando"
 
-#: app/toolbox.c:1361
+#: app/toolbox.c:1420
 msgid ""
 "Initialization of OpenGL failed.  Check output of <tt>glxinfo</tt> and "
 "warning messages printed to console during Gwyddion startup."
@@ -3102,7 +3227,7 @@ msgstr ""
 "Inizializzazione OpenGL fallita. Controllare l'otput di <tt>glxinfo</tt> ed "
 "eventuali messaggi di errore stampati sulla console all'avvio di Gwyddion."
 
-#: app/toolbox.c:1368
+#: app/toolbox.c:1427
 msgid "This version of Gwyddion was built without OpenGL support."
 msgstr "Questa versione di Gwyddion non ha il supporto OpenGL."
 
@@ -3178,7 +3303,7 @@ msgstr "L'oggetto ha più' riferimenti"
 msgid "Secondary data item has no primary data"
 msgstr "L'oggetto dati secondari non ha dati primari"
 
-#: app/wait.c:106
+#: app/wait.c:114
 msgid "Please wait"
 msgstr "Attendere"
 
@@ -3195,11 +3320,11 @@ msgstr "File testo Accurex II (.txt)"
 msgid "File header cannot be converted from ISO-8859-1 character set: %s"
 msgstr "L'intestazione del file non può essere convertita da ISO-8859-1: %s"
 
-#: modules/file/aistfile.c:127
+#: modules/file/aistfile.c:123
 msgid "Imports AIST-NT data files."
 msgstr "Importa file dati AIST-NT"
 
-#: modules/file/aistfile.c:140
+#: modules/file/aistfile.c:136
 msgid "AIST-NT files (.aist)"
 msgstr "file AIST-NT (.aist)"
 
@@ -3246,7 +3371,8 @@ msgstr ""
 
 #: modules/file/alicona.c:665 modules/file/gdeffile.c:175
 #: modules/file/gdeffile.c:199 modules/file/gsffile.c:159
-#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1038
+#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1174
+#: modules/file/microprof.c:361 modules/file/microprof.c:375
 #: modules/file/pt3file.c:489 modules/file/pt3file.c:591
 msgid "File header is truncated."
 msgstr "Intestazione del file tronca"
@@ -3259,11 +3385,11 @@ msgstr "Il commento è mancante della termazione  CRLF "
 msgid "Comment is not nul-terminated."
 msgstr "Il commento non termina con zero"
 
-#: modules/file/ambfile.c:84
+#: modules/file/ambfile.c:83
 msgid "Imports Ambios AMB data files."
 msgstr "Importa file dati Ambios AMB."
 
-#: modules/file/ambfile.c:97
+#: modules/file/ambfile.c:96
 msgid "Ambios amb files (.amb)"
 msgstr "File Ambios amb (.amb)"
 
@@ -3295,11 +3421,11 @@ msgstr "FileDescEnd  manca del FileDescBegin corrispondente."
 msgid "FileDescBegin has no corresponding FileDescEnd."
 msgstr "FileDescBegin manca del FileDescEnd corrispondente."
 
-#: modules/file/apedaxfile.c:259
+#: modules/file/apedaxfile.c:261
 msgid "Imports A.P.E. Research DAX data files."
 msgstr "Importa file dati  A.P.E. Research DAX "
 
-#: modules/file/apedaxfile.c:274
+#: modules/file/apedaxfile.c:276
 msgid "A.P.E. Research DAX Files (.dax) and APDT File (.apdt)"
 msgstr "File A.P.E. Research DAX  (.dax) e APDT File (.apdt)"
 
@@ -3327,7 +3453,7 @@ msgstr "Larghezza:"
 msgid "Height:"
 msgstr "Altezza:"
 
-#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:248
+#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:251
 msgid "Value units:"
 msgstr "unità valore:"
 
@@ -3336,30 +3462,30 @@ msgid "Export Text"
 msgstr "Esporta Testo"
 
 #: modules/file/asciiexport.c:275 modules/file/gxyzffile.c:402
-#: modules/file/imgexport.c:3565 modules/file/imgexport.c:4203
-#: modules/file/rawfile.c:758 modules/file/xyzexport.c:311
-#: modules/process/calibrate.c:607 modules/process/coerce.c:364
-#: modules/process/col_synth.c:516 modules/process/correct_affine.c:470
-#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:261
-#: modules/process/grain_dist.c:306 modules/process/grain_edge.c:255
-#: modules/process/grain_mark.c:338 modules/process/grain_wshed.c:252
-#: modules/process/linematch.c:852 modules/process/mark_disconn.c:279
-#: modules/process/slope_dist.c:367 modules/process/tip_blind.c:357
+#: modules/file/imgexport.c:3532 modules/file/imgexport.c:4151
+#: modules/file/rawfile.c:758 modules/file/xyzexport.c:314
+#: modules/process/calibrate.c:561 modules/process/coerce.c:363
+#: modules/process/col_synth.c:516 modules/process/correct_affine.c:520
+#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:263
+#: modules/process/grain_dist.c:307 modules/process/grain_edge.c:254
+#: modules/process/grain_mark.c:335 modules/process/grain_wshed.c:256
+#: modules/process/linematch.c:819 modules/process/mark_disconn.c:280
+#: modules/process/slope_dist.c:359 modules/process/tip_blind.c:360
 #: modules/process/wpour_mark.c:354 modules/tools/spotremove.c:322
-#: modules/tools/stats.c:402 modules/xyz/xyz_raster.c:628
+#: modules/tools/stats.c:401 modules/xyz/xyz_raster.c:597
 msgid "Options"
 msgstr "Opzioni"
 
-#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:314
+#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:317
 msgid "Use _dot as decimal separator"
 msgstr "Utilizza il punto come separatore _decimale"
 
-#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:321
-#: modules/process/grain_dist.c:317
+#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:324
+#: modules/process/grain_dist.c:318
 msgid "Add _informational comment header"
 msgstr "Aggiungi _intestazione commento"
 
-#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:330
+#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:333
 msgid "_Precision:"
 msgstr "_Precisione:"
 
@@ -3379,20 +3505,20 @@ msgstr "Importa file Attocube Systems ASC"
 msgid "Attocube ASCII files (.asc)"
 msgstr "file ASCII Attocube (.asc) "
 
-#: modules/file/bcrfile.c:146
+#: modules/file/bcrfile.c:141
 msgid "Imports Image Metrology BCR data files."
 msgstr "Importa file dati BCR Image Metrology."
 
-#: modules/file/bcrfile.c:159
+#: modules/file/bcrfile.c:154
 msgid "BCR files (.bcr, .bcrf)"
 msgstr "File BCR (.bcr, .bcrf)"
 
-#: modules/file/bcrfile.c:238
+#: modules/file/bcrfile.c:233
 #, c-format
 msgid "File header is not convertible from UTF-16: %s"
 msgstr "L'intestazione del file non è convertibile da UTF-16: %s"
 
-#: modules/file/bcrfile.c:351
+#: modules/file/bcrfile.c:346
 #, c-format
 msgid "Unknown file type header: `%s'."
 msgstr "Intestazione tipo file sconosciuta: `%s'."
@@ -3427,7 +3553,7 @@ msgid "Burleigh exported data (.txt, .bin)"
 msgstr "Dati esportati Burleigh (.txt, .bin)"
 
 #: modules/file/burleigh_exp.c:226 modules/file/burleigh_exp.c:267
-#: modules/file/nanoscope.c:1605 modules/file/omicron.c:416
+#: modules/file/nanoscope.c:1612 modules/file/omicron.c:416
 #: modules/file/shimadzu.c:468
 msgid "Missing colon in header line."
 msgstr "\":\" mancanti nel file intestazione."
@@ -3478,22 +3604,42 @@ msgstr "Importa file dati Benyuan CSM."
 msgid "Benyuan CSM files (.csm)"
 msgstr "File Benyuan CSM  (.csm)"
 
-#: modules/file/dektakxml.c:138
+#: modules/file/dektakvca.c:197
+#, fuzzy
+msgid "Imports Dektak OPDx data files."
+msgstr "Importa file dati Dektak XML "
+
+#: modules/file/dektakvca.c:210
+#, fuzzy
+msgid "Dektak OPDx data files (.OPDx)"
+msgstr "File dati Dektak XML  (.xml)"
+
+#: modules/file/dektakvca.c:655
+#, fuzzy, c-format
+msgid "Item `%s' has unexpected type %u instead of %u."
+msgstr "La sezione %s termina alla linea %u invece di %s."
+
+#: modules/file/dektakvca.c:1022
+#, fuzzy, c-format
+msgid "Truncated data inside item %s."
+msgstr "Dati troncati nel blocco  %s"
+
+#: modules/file/dektakxml.c:118
 msgid "Imports Dektak XML data files."
 msgstr "Importa file dati Dektak XML "
 
-#: modules/file/dektakxml.c:151
+#: modules/file/dektakxml.c:131
 msgid "Dektak XML data files (.xml)"
 msgstr "File dati Dektak XML  (.xml)"
 
-#: modules/file/dektakxml.c:228 modules/file/lextfile.c:260
-#: modules/file/nanoscan.c:267 modules/file/ometiff.c:265
+#: modules/file/dektakxml.c:208 modules/file/lextfile.c:260
+#: modules/file/nanoscan.c:270 modules/file/ometiff.c:265
 #, c-format
 msgid "XML parsing failed: %s"
 msgstr "Parsing XML fallito: %s"
 
-#: modules/file/dektakxml.c:400 modules/file/lextfile.c:163
-#: modules/file/nanoscan.c:672 modules/file/ometiff.c:445
+#: modules/file/dektakxml.c:373 modules/file/lextfile.c:163
+#: modules/file/nanoscan.c:698 modules/file/ometiff.c:445
 #, c-format
 msgid "Top-level element is not ‘%s’."
 msgstr "Elemento livello superiore non è ‘%s’."
@@ -3607,7 +3753,7 @@ msgstr ""
 "dati"
 
 #: modules/file/err.h:48 modules/file/nrrdfile.c:779
-#: modules/file/nrrdfile.c:824
+#: modules/file/nrrdfile.c:824 modules/pygwy/pygwy-console.c:504
 #, c-format
 msgid "Cannot read from file: %s."
 msgstr "Impossibile leggere dal file: %s."
@@ -3824,32 +3970,32 @@ msgid ""
 "Data deserialization succeeded, but resulted in an unexpected object %s."
 msgstr "Deserializzazione dati riuscita, oggetto risultante %s inaspettato."
 
-#: modules/file/gwytiff.h:332
+#: modules/file/gwytiff.h:335
 #, c-format
 msgid "BigTIFF reserved fields are %u and %u instead of 8 and 0."
 msgstr "I campi riservati per BigTIFF sono %u e %u invece di 8 e 0."
 
-#: modules/file/gwytiff.h:349 modules/file/gwytiff.h:366
+#: modules/file/gwytiff.h:352 modules/file/gwytiff.h:369
 #, c-format
 msgid "TIFF directory %lu ended unexpectedly."
 msgstr "Cartella TIFF %lu terminata inaspettatamente"
 
-#: modules/file/gwytiff.h:484
+#: modules/file/gwytiff.h:487
 #, c-format
 msgid "BigTIFF data type %u was found in a classic TIFF."
 msgstr "Tipo dati %u  BigTIFF è stato trovato in un classico TIFF"
 
-#: modules/file/gwytiff.h:501
+#: modules/file/gwytiff.h:504
 msgid "Invalid tag data positions were found."
 msgstr "Trovate posizioni tag data non valide"
 
-#: modules/file/gwytiff.h:874 modules/file/gwytiff.h:889
-#: modules/file/gwytiff.h:1012 modules/file/gwytiff.h:1019
+#: modules/file/gwytiff.h:877 modules/file/gwytiff.h:892
+#: modules/file/gwytiff.h:1015 modules/file/gwytiff.h:1022
 #, c-format
 msgid "Required tag %u was not found."
 msgstr "Etichetta %u richiesta, non trovata."
 
-#: modules/file/gwytiff.h:942 modules/file/gwytiff.h:986
+#: modules/file/gwytiff.h:945 modules/file/gwytiff.h:989
 #: modules/file/keyence.c:449 modules/file/matfile.c:276
 #: modules/file/matfile.c:298 modules/file/omicronflat.c:1962
 #: modules/file/princetonspe.c:339 modules/file/psia.c:352
@@ -3857,21 +4003,21 @@ msgstr "Etichetta %u richiesta, non trovata."
 msgid "File is truncated."
 msgstr "File troncato"
 
-#: modules/file/gwytiff.h:1044
+#: modules/file/gwytiff.h:1047
 msgid "Non-uniform bits per sample are unsupported."
 msgstr "Bit per campione non uniformi non supportati"
 
-#: modules/file/gwytiff.h:1071
+#: modules/file/gwytiff.h:1074 modules/file/zeisslsm.c:973
 #, c-format
 msgid "Compression type %u is not supported."
 msgstr "Compressione in formato %u non supportata"
 
-#: modules/file/gwytiff.h:1077
+#: modules/file/gwytiff.h:1080
 #, c-format
 msgid "Planar configuration %u is not supported."
 msgstr "Configurazione planare %u non supportata."
 
-#: modules/file/gwytiff.h:1101
+#: modules/file/gwytiff.h:1104
 msgid "Unsupported sample format"
 msgstr "Formato campione non supportato"
 
@@ -3908,7 +4054,7 @@ msgstr "errore CRC"
 msgid "Minizip error while reading the zip file: %s (%d)."
 msgstr "Errore Minizip durante la lettura del file zip: %s (%d)."
 
-#: modules/file/gwyzip.h:248
+#: modules/file/gwyzip.h:248 modules/file/jpkscan.c:2776
 #, c-format
 msgid "File %s is missing in the zip file."
 msgstr "file %s mancante nel file zip."
@@ -3943,8 +4089,8 @@ msgstr "La grandezza dei dati %lu non è multipla della dimensione punto %u"
 msgid "Export GXYZF"
 msgstr "Esporta GXYZF"
 
-#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:238
-#: modules/file/xyzexport.c:304
+#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:241
+#: modules/file/xyzexport.c:307
 msgid "XYZ data:"
 msgstr "File dati XYZ:"
 
@@ -4033,11 +4179,13 @@ msgstr "Scala _Z :"
 msgid "Representable"
 msgstr "Rappresentabile"
 
-#: modules/file/hdrimage.cc:480 modules/tools/stats.c:203
+#: modules/file/hdrimage.cc:480 modules/graph/graph_stats.c:146
+#: modules/tools/stats.c:203
 msgid "Minimum:"
 msgstr "Minimo:"
 
-#: modules/file/hdrimage.cc:496 modules/tools/stats.c:204
+#: modules/file/hdrimage.cc:496 modules/graph/graph_stats.c:147
+#: modules/tools/stats.c:204
 msgid "Maximum:"
 msgstr "Massimo:"
 
@@ -4056,12 +4204,12 @@ msgid "OpenEXR data type %u is invalid or unsupported."
 msgstr "Il tipo dati OpenEXR %u non è valido o non è supportato."
 
 #: modules/file/hdrimage.cc:1433 modules/file/hdrimage.cc:1442
-#: modules/file/imgexport.c:5249 modules/file/imgexport.c:5260
+#: modules/file/imgexport.c:5198 modules/file/imgexport.c:5209
 #, c-format
 msgid "libpng initialization error (in %s)"
 msgstr "errore inizializzazione libpng (in %s)"
 
-#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5324
+#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5273
 #, fuzzy
 msgid "libpng error occurred"
 msgstr "Errore libpng"
@@ -4080,11 +4228,6 @@ msgstr "Informazioni immagine"
 msgid "Horizontal size:"
 msgstr "Dimensione orizzontale:"
 
-#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
-#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
-msgid "px"
-msgstr "px"
-
 #: modules/file/hdrimage.cc:2252 modules/file/pixmap.c:826
 msgid "Vertical size:"
 msgstr "Dimensione verticale:"
@@ -4097,10 +4240,10 @@ msgstr "Canali:"
 msgid "Pages:"
 msgstr "Pagine:"
 
-#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3043
+#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3059
 #: modules/file/pixmap.c:862 modules/file/rawfile.c:649
-#: modules/process/dimensions.h:467 modules/xyz/xyz_drift.c:774
-#: modules/xyz/xyz_raster.c:566
+#: modules/process/dimensions.h:449 modules/xyz/xyz_drift.c:774
+#: modules/xyz/xyz_raster.c:535
 msgid "Physical Dimensions"
 msgstr "Dimensioni fisiche"
 
@@ -4110,16 +4253,16 @@ msgstr "Dimensioni fisiche"
 #: modules/process/calcoefs_new.c:408 modules/process/calcoefs_new.c:475
 #: modules/process/calcoefs_simple.c:391 modules/process/calcoefs_simple.c:458
 #: modules/process/calcoefs_view.c:511 modules/process/calcoefs_view.c:549
-#: modules/process/calibrate.c:466 modules/process/calibrate.c:549
-#: modules/process/dimensions.h:161 modules/process/volumize_layers.c:259
-#: modules/volume/volume_calibrate.c:414 modules/volume/volume_calibrate.c:441
-#: modules/volume/volume_calibrate.c:468 modules/volume/volume_calibrate.c:546
+#: modules/process/calibrate.c:459 modules/process/calibrate.c:514
+#: modules/process/dimensions.h:143 modules/process/volumize_layers.c:259
+#: modules/volume/volume_calibrate.c:409 modules/volume/volume_calibrate.c:429
+#: modules/volume/volume_calibrate.c:449 modules/volume/volume_calibrate.c:498
 msgid "verb|Change"
 msgstr "Cambia"
 
 #: modules/file/hdrimage.cc:2345 modules/file/pixmap.c:907
-#: modules/file/rawfile.c:694 modules/process/crosscor.c:263
-#: modules/process/dimensions.h:477
+#: modules/file/rawfile.c:694 modules/process/crosscor.c:260
+#: modules/process/dimensions.h:459
 msgid "H_eight:"
 msgstr "Altezza:"
 
@@ -4136,16 +4279,16 @@ msgstr "_Scala Z (per unità di campione):"
 #: modules/file/hdrimage.cc:2557 modules/file/pixmap.c:1176
 #: modules/file/rawfile.c:1386 modules/process/calcoefs_new.c:819
 #: modules/process/calcoefs_simple.c:1197 modules/process/calcoefs_view.c:1380
-#: modules/process/calibrate.c:979 modules/process/dimensions.h:195
-#: modules/process/volumize_layers.c:315 modules/volume/volume_calibrate.c:1017
+#: modules/process/calibrate.c:1013 modules/process/dimensions.h:177
+#: modules/process/volumize_layers.c:314 modules/volume/volume_calibrate.c:957
 msgid "Change Units"
 msgstr "Cambia unità"
 
 #: modules/file/hdrimage.cc:2571 modules/file/pixmap.c:1190
 #: modules/file/rawfile.c:1400 modules/process/calcoefs_new.c:832
 #: modules/process/calcoefs_simple.c:1210 modules/process/calcoefs_view.c:1393
-#: modules/process/calibrate.c:993 modules/process/dimensions.h:208
-#: modules/process/volumize_layers.c:329 modules/volume/volume_calibrate.c:1031
+#: modules/process/calibrate.c:1027 modules/process/dimensions.h:190
+#: modules/process/volumize_layers.c:328 modules/volume/volume_calibrate.c:971
 msgid "New _units:"
 msgstr "Nuove unità:"
 
@@ -4191,132 +4334,132 @@ msgstr ""
 "Il campo dimensione datii %ux%u non corrisponde alle dimensioni "
 "dell'immagine (%u×%u)."
 
-#: modules/file/igorfile.c:200
+#: modules/file/igorfile.c:210
 msgid "Imports Igor binary waves (.ibw)."
 msgstr "Importa onde binarie Igor (.ibw)."
 
-#: modules/file/igorfile.c:213
+#: modules/file/igorfile.c:223
 msgid "Igor binary waves (.ibw)"
 msgstr "Onde binarie Igor (.ibw)"
 
-#: modules/file/igorfile.c:273
+#: modules/file/igorfile.c:283
 #, c-format
 msgid "Format version is %d.  Only version 5 is supported."
 msgstr "Formato file versione %d. Solo la versione 5 è supportata"
 
-#: modules/file/igorfile.c:294
+#: modules/file/igorfile.c:305
 msgid "Only two-dimensional data are supported."
 msgstr "Sono supportati solo dati bidimensionali"
 
-#: modules/file/igorfile.c:306
+#: modules/file/igorfile.c:317
 #, c-format
 msgid "Number of data points %u does not match resolutions %u×%u×%u."
 msgstr "Numero di punti dati %u  non corrisponde alla risoluzione %u×%u×%u."
 
-#: modules/file/igorfile.c:320
+#: modules/file/igorfile.c:331
 #, c-format
 msgid "Data size %u does not match the number of data points %u×%u."
 msgstr ""
 "La grandezza dei dati %u non corrisponde al numero di punti dati %u×%u."
 
-#: modules/file/igorfile.c:358
+#: modules/file/igorfile.c:369
 msgid "Cannot read channel labels."
 msgstr "Impossibile leggere le etichette dei canali"
 
-#: modules/file/imgexport.c:392 modules/file/pixmap.c:178
+#: modules/file/imgexport.c:391 modules/file/pixmap.c:178
 msgid "Portable Network Graphics (.png)"
 msgstr "Portable Network Graphics (.png)"
 
-#: modules/file/imgexport.c:398 modules/file/pixmap.c:182
+#: modules/file/imgexport.c:397 modules/file/pixmap.c:182
 msgid "JPEG (.jpeg,.jpg)"
 msgstr "JPEG (.jpeg,.jpg)"
 
-#: modules/file/imgexport.c:404 modules/file/pixmap.c:186
+#: modules/file/imgexport.c:403 modules/file/pixmap.c:186
 msgid "TIFF (.tiff,.tif)"
 msgstr "TIFF (.tiff,.tif)"
 
-#: modules/file/imgexport.c:410 modules/file/pixmap.c:190
+#: modules/file/imgexport.c:409 modules/file/pixmap.c:190
 msgid "Portable Pixmap (.ppm,.pnm)"
 msgstr "Portable Pixmap (.ppm,.pnm)"
 
-#: modules/file/imgexport.c:416 modules/file/pixmap.c:194
+#: modules/file/imgexport.c:415 modules/file/pixmap.c:194
 msgid "Windows or OS2 Bitmap (.bmp)"
 msgstr "Windows or OS2 Bitmap (.bmp)"
 
-#: modules/file/imgexport.c:422 modules/file/pixmap.c:198
+#: modules/file/imgexport.c:421 modules/file/pixmap.c:198
 msgid "TARGA (.tga,.targa)"
 msgstr "TARGA (.tga,.targa)"
 
-#: modules/file/imgexport.c:429
+#: modules/file/imgexport.c:428
 msgid "WebP (.webp)"
 msgstr "WebP (.webp)"
 
-#: modules/file/imgexport.c:437
+#: modules/file/imgexport.c:436
 msgid "Portable document format (.pdf)"
 msgstr "Portable document format (.pdf)"
 
-#: modules/file/imgexport.c:445
+#: modules/file/imgexport.c:444
 msgid "Encapsulated PostScript (.eps)"
 msgstr "Encapsulated PostScript (.eps)"
 
-#: modules/file/imgexport.c:453
+#: modules/file/imgexport.c:452
 msgid "Scalable Vector Graphics (.svg)"
 msgstr "Scalable Vector Graphics (.svg)"
 
-#: modules/file/imgexport.c:463 modules/tools/selectionmanager.c:269
+#: modules/file/imgexport.c:462 modules/tools/selectionmanager.c:269
 msgid "Horiz./vert. lines"
 msgstr "Linee Orizz./Vert"
 
-#: modules/file/imgexport.c:467 modules/tools/selectionmanager.c:270
+#: modules/file/imgexport.c:466 modules/tools/selectionmanager.c:270
 msgid "Ellipses"
 msgstr "Ellissi"
 
-#: modules/file/imgexport.c:471 modules/tools/selectionmanager.c:272
+#: modules/file/imgexport.c:470 modules/tools/selectionmanager.c:272
 msgid "Lines"
 msgstr "Linee"
 
-#: modules/file/imgexport.c:479 modules/tools/selectionmanager.c:275
+#: modules/file/imgexport.c:478 modules/tools/selectionmanager.c:275
 msgid "Rectangles"
 msgstr "Rettangoli"
 
-#: modules/file/imgexport.c:483 modules/process/lat_synth.c:565
+#: modules/file/imgexport.c:482 modules/process/lat_synth.c:565
 #: modules/process/lat_synth.c:637 modules/tools/selectionmanager.c:271
 msgid "Lattice"
 msgstr "Reticolo"
 
-#: modules/file/imgexport.c:487
+#: modules/file/imgexport.c:486
 msgid "Path"
 msgstr "Percorso"
 
-#: modules/file/imgexport.c:493 modules/file/imgexport.c:499
+#: modules/file/imgexport.c:492 modules/file/imgexport.c:498
 msgid "ruler|_None"
 msgstr "righello|_Nessuno"
 
-#: modules/file/imgexport.c:494
+#: modules/file/imgexport.c:493
 msgid "_Rulers"
 msgstr "_Righelli"
 
-#: modules/file/imgexport.c:495
+#: modules/file/imgexport.c:494
 msgid "_Inset scale bar"
 msgstr "barra scala _incorporata"
 
-#: modules/file/imgexport.c:500
+#: modules/file/imgexport.c:499
 msgid "_False color ruler"
 msgstr "Righello _Falsi colori"
 
-#: modules/file/imgexport.c:504
+#: modules/file/imgexport.c:503
 msgid "title|None"
 msgstr "titolo|Nessuno"
 
-#: modules/file/imgexport.c:505
+#: modules/file/imgexport.c:504
 msgid "At the top"
 msgstr ""
 
-#: modules/file/imgexport.c:506
+#: modules/file/imgexport.c:505
 msgid "Along the right edge"
 msgstr "Lungo il lato destro"
 
-#: modules/file/imgexport.c:512
+#: modules/file/imgexport.c:511
 msgid ""
 "Renders data into vector (SVG, PDF, EPS) and pixmap (PNG, JPEG, TIFF, WebP, "
 "PPM, BMP, TARGA) images. Export to some formats relies on GDK and other "
@@ -4327,56 +4470,57 @@ msgstr ""
 "si basa su GDK e altre librerie per cui potrebbe dipendere dal tipo di "
 "installazione."
 
-#: modules/file/imgexport.c:2931
+#: modules/file/imgexport.c:2933
 msgid "Select Color"
 msgstr "Selezione colore"
 
-#: modules/file/imgexport.c:3002
-msgid "Black"
-msgstr "Nero"
-
-#: modules/file/imgexport.c:3010
+#: modules/file/imgexport.c:3005
 msgid "White"
 msgstr "Bianco"
 
-#: modules/file/imgexport.c:3053
+#: modules/file/imgexport.c:3014
+msgid "Black"
+msgstr "Nero"
+
+#: modules/file/imgexport.c:3069
 msgid "Pi_xel size:"
 msgstr "Dimensione Pi_xel:"
 
-#: modules/file/imgexport.c:3062
+#: modules/file/imgexport.c:3077
 msgid "Pixels per _inch:"
 msgstr "Pixels per _inch:"
 
-#: modules/file/imgexport.c:3089
+#: modules/file/imgexport.c:3102
 msgid "_Zoom:"
 msgstr "Ingrandisci:"
 
-#: modules/file/imgexport.c:3108 modules/process/bdep_synth.c:430
+#: modules/file/imgexport.c:3120 modules/process/bdep_synth.c:430
 #: modules/process/col_synth.c:486 modules/process/diff_synth.c:508
-#: modules/process/domain_synth.c:510 modules/process/grain_mark.c:285
-#: modules/process/lat_synth.c:753 modules/process/obj_synth.c:575
-#: modules/process/pat_synth.c:852 modules/process/pat_synth.c:1154
-#: modules/process/pat_synth.c:1489 modules/process/tip_blind.c:340
+#: modules/process/domain_synth.c:510 modules/process/fibre_synth.c:540
+#: modules/process/grain_mark.c:284 modules/process/lat_synth.c:753
+#: modules/process/obj_synth.c:573 modules/process/pat_synth.c:853
+#: modules/process/pat_synth.c:1155 modules/process/pat_synth.c:1490
+#: modules/process/phase_synth.c:298 modules/process/tip_blind.c:342
 msgid "_Height:"
 msgstr "Altezza:"
 
-#: modules/file/imgexport.c:3121
+#: modules/file/imgexport.c:3136
 msgid "_Font:"
 msgstr "Carattere:"
 
-#: modules/file/imgexport.c:3140
+#: modules/file/imgexport.c:3145
 msgid "_Font size:"
 msgstr "_Dimensione carattere:"
 
-#: modules/file/imgexport.c:3160
+#: modules/file/imgexport.c:3163
 msgid "O_utline thickness:"
 msgstr "Spessore contorno:"
 
-#: modules/file/imgexport.c:3170
+#: modules/file/imgexport.c:3172
 msgid "_Border width:"
 msgstr "Larghezza margine:"
 
-#: modules/file/imgexport.c:3180
+#: modules/file/imgexport.c:3181
 msgid "_Tick length:"
 msgstr "Lunghezza _Tacca:"
 
@@ -4396,219 +4540,220 @@ msgstr "Colori"
 msgid "_Line and text color:"
 msgstr "Colore _Linea e testo:"
 
-#: modules/file/imgexport.c:3221
+#: modules/file/imgexport.c:3220
 msgid "_Transparent background"
 msgstr "Sfondo _Trasparente"
 
-#: modules/file/imgexport.c:3232
+#: modules/file/imgexport.c:3231
 msgid "_Background color:"
 msgstr "Colore sfondo:"
 
-#: modules/file/imgexport.c:3474
-msgid "Lateral scale"
-msgstr "Scala Laterale:"
-
-#: modules/file/imgexport.c:3487 modules/process/lno_synth.c:1053
-msgid "_Length:"
-msgstr "_Lunghezza:"
-
-#: modules/file/imgexport.c:3503
-msgid "_Auto"
-msgstr "_Auto"
-
-#: modules/file/imgexport.c:3511 modules/process/pat_synth.c:469
+#: modules/file/imgexport.c:3433 modules/process/fibre_synth.c:582
+#: modules/process/pat_synth.c:470
 msgid "Placement"
 msgstr "Posizionamento"
 
-#: modules/file/imgexport.c:3515
+#: modules/file/imgexport.c:3437
 msgid "left"
 msgstr "Sinistra"
 
-#: modules/file/imgexport.c:3519
+#: modules/file/imgexport.c:3440
 msgid "center"
 msgstr "Centro"
 
-#: modules/file/imgexport.c:3523
+#: modules/file/imgexport.c:3443
 msgid "right"
 msgstr "Destra"
 
-#: modules/file/imgexport.c:3528
+#: modules/file/imgexport.c:3448
 msgid "top"
 msgstr "Sopra"
 
-#: modules/file/imgexport.c:3540
+#: modules/file/imgexport.c:3456
 msgid "bottom"
 msgstr "sotto"
 
-#: modules/file/imgexport.c:3552 modules/file/imgexport.c:3874
+#: modules/file/imgexport.c:3479
+msgid "Lateral scale"
+msgstr "Scala Laterale:"
+
+#: modules/file/imgexport.c:3496 modules/process/lno_synth.c:1053
+msgid "_Length:"
+msgstr "_Lunghezza:"
+
+#: modules/file/imgexport.c:3502
+msgid "_Auto"
+msgstr "_Auto"
+
+#: modules/file/imgexport.c:3519 modules/file/imgexport.c:3832
 msgid "Hori_zontal gap:"
 msgstr "Apertura Ori_zzontale:"
 
-#: modules/file/imgexport.c:3558 modules/file/imgexport.c:3854
+#: modules/file/imgexport.c:3526 modules/file/imgexport.c:3812
 msgid "_Vertical gap:"
 msgstr "Apertura _Verticale:"
 
-#: modules/file/imgexport.c:3571 modules/file/imgexport.c:4184
+#: modules/file/imgexport.c:3538 modules/file/imgexport.c:4134
 msgid "Colo_r:"
 msgstr "Colo_re:"
 
-#: modules/file/imgexport.c:3576 modules/file/imgexport.c:4189
+#: modules/file/imgexport.c:3542 modules/file/imgexport.c:4138
 msgid "Out_line color:"
 msgstr "Colore contorno:"
 
-#: modules/file/imgexport.c:3580 modules/file/imgexport.c:4195
+#: modules/file/imgexport.c:3547 modules/file/imgexport.c:4143
 msgid "O_pacity:"
 msgstr "O_pacità"
 
-#: modules/file/imgexport.c:3589
+#: modules/file/imgexport.c:3554
 msgid "Draw _ticks"
 msgstr "Disegna tacche"
 
-#: modules/file/imgexport.c:3599
+#: modules/file/imgexport.c:3564
 msgid "Draw _label"
 msgstr "Disegna _etichette"
 
-#: modules/file/imgexport.c:3609
+#: modules/file/imgexport.c:3574
 msgid "Draw text _above scale bar"
 msgstr ""
 
-#: modules/file/imgexport.c:3773
+#: modules/file/imgexport.c:3738
 msgid "Image"
 msgstr "Immagine"
 
-#: modules/file/imgexport.c:3777 modules/process/calcoefs_view.c:473
-#: modules/process/correct_affine.c:488 modules/process/drift.c:297
-#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:202
-#: modules/process/fft_filter_1d.c:294 modules/process/fft_profile.c:292
-#: modules/process/fractal.c:253 modules/process/nanoindent_adjust.c:229
-#: modules/process/polydistort.c:247 modules/process/rotate.c:274
-#: modules/process/scale.c:253 modules/process/straighten_path.c:271
+#: modules/file/imgexport.c:3742 modules/process/calcoefs_view.c:473
+#: modules/process/correct_affine.c:538 modules/process/drift.c:298
+#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:203
+#: modules/process/fft_filter_1d.c:296 modules/process/fft_profile.c:293
+#: modules/process/fractal.c:262 modules/process/nanoindent_adjust.c:229
+#: modules/process/polydistort.c:250 modules/process/rotate.c:274
+#: modules/process/scale.c:257 modules/process/straighten_path.c:270
 #: modules/process/unrotate.c:277 modules/tools/linestats.c:400
-#: modules/tools/profile.c:555 modules/tools/roughness.c:864
-#: modules/tools/sfunctions.c:468 modules/xyz/xyz_raster.c:632
+#: modules/tools/profile.c:552 modules/tools/roughness.c:879
+#: modules/tools/sfunctions.c:481 modules/xyz/xyz_raster.c:601
 msgid "_Interpolation type:"
 msgstr "Tipo di interpolazione:"
 
-#: modules/file/imgexport.c:3807
+#: modules/file/imgexport.c:3772
 msgid "Draw _frame"
 msgstr "Disegna cornice"
 
-#: modules/file/imgexport.c:3816
+#: modules/file/imgexport.c:3781
 msgid "Draw _mask"
 msgstr "Disegna _Maschera"
 
-#: modules/file/imgexport.c:3826
+#: modules/file/imgexport.c:3791
 msgid "Draw mask _legend"
 msgstr "Disegna _legenda Maschera"
 
-#: modules/file/imgexport.c:3861
+#: modules/file/imgexport.c:3819
 msgid "Value Scale"
 msgstr "Scala valore"
 
-#: modules/file/imgexport.c:3882
+#: modules/file/imgexport.c:3840
 msgid "Fi_xed precision:"
 msgstr "Precisione fissata:"
 
-#: modules/file/imgexport.c:3898
+#: modules/file/imgexport.c:3855
 msgid "Fixed _kilo threshold:"
 msgstr "Soglia _kilo fissata:"
 
-#: modules/file/imgexport.c:3914 modules/file/imgexport.c:4635
+#: modules/file/imgexport.c:3869 modules/file/imgexport.c:4583
 msgid "Title"
 msgstr "Titolo"
 
-#: modules/file/imgexport.c:3918
+#: modules/file/imgexport.c:3877
 msgid "Posi_tion:"
 msgstr "Posizione:"
 
-#: modules/file/imgexport.c:3934
+#: modules/file/imgexport.c:3884
 msgid "_Gap:"
 msgstr "Apertura:"
 
-#: modules/file/imgexport.c:3941
+#: modules/file/imgexport.c:3891
 msgid "Put _units to title"
 msgstr "Assegna _unità al titolo"
 
-#: modules/file/imgexport.c:4125
+#: modules/file/imgexport.c:4075
 msgid "Draw _selection"
 msgstr "Disegna _selezione"
 
-#: modules/file/imgexport.c:4176 modules/tools/selectionmanager.c:361
+#: modules/file/imgexport.c:4126 modules/tools/selectionmanager.c:361
 msgid "Objects"
 msgstr "Oggetti "
 
-#: modules/file/imgexport.c:4615
+#: modules/file/imgexport.c:4563
 msgid "Lateral"
 msgstr "Laterale"
 
-#: modules/file/imgexport.c:4654 modules/file/rawfile.c:1040
-#: modules/process/calcoefs_load.c:230 modules/process/neural.c:693
+#: modules/file/imgexport.c:4602 modules/file/rawfile.c:1040
+#: modules/process/calcoefs_load.c:230 modules/process/neural.c:700
 msgid "verb|_Load"
 msgstr "Carica"
 
-#: modules/file/imgexport.c:4660 modules/file/rawfile.c:1046
-#: modules/process/neural.c:699
+#: modules/file/imgexport.c:4608 modules/file/rawfile.c:1046
+#: modules/process/neural.c:706
 msgid "verb|_Store"
 msgstr "verbo|_Immagazzina "
 
-#: modules/file/imgexport.c:4666 modules/file/rawfile.c:1052
-#: modules/process/neural.c:705
+#: modules/file/imgexport.c:4614 modules/file/rawfile.c:1052
+#: modules/process/neural.c:712
 msgid "_Rename"
 msgstr "_Rinomina"
 
-#: modules/file/imgexport.c:4686 modules/file/rawfile.c:1071
+#: modules/file/imgexport.c:4634 modules/file/rawfile.c:1071
 msgid "Preset _name:"
 msgstr "Nome predefinito:"
 
-#: modules/file/imgexport.c:4757
+#: modules/file/imgexport.c:4705
 #, c-format
 msgid "Export %s"
 msgstr "Esporta %s"
 
-#: modules/file/imgexport.c:4778
+#: modules/file/imgexport.c:4727
 msgid "Export as 1_6 bit grayscale"
 msgstr "Esporta come 1_6 bit grayscale"
 
-#: modules/file/imgexport.c:4801
+#: modules/file/imgexport.c:4750
 msgid "Lateral Scale"
 msgstr "Scala laterale"
 
-#: modules/file/imgexport.c:4806
+#: modules/file/imgexport.c:4755
 msgid "Values"
 msgstr "Valori"
 
-#: modules/file/imgexport.c:4811
+#: modules/file/imgexport.c:4760
 msgid "Selection"
 msgstr "Selezione"
 
-#: modules/file/imgexport.c:4816 modules/file/rawfile.c:462
+#: modules/file/imgexport.c:4765 modules/file/rawfile.c:462
 #: modules/process/convolution_filter.c:275
 msgid "Presets"
 msgstr "Predefiniti"
 
-#: modules/file/imgexport.c:5576
+#: modules/file/imgexport.c:5525
 #, c-format
 msgid "Cairo error occurred: %s"
 msgstr "Errore Cairo: %s"
 
-#: modules/file/imgexport.c:5600
+#: modules/file/imgexport.c:5549
 #, c-format
 msgid "Pixbuf save failed: %s."
 msgstr "Salvataggio pixbuf fallito: %s."
 
-#: modules/file/imgexport.c:5878
+#: modules/file/imgexport.c:5827
 msgid "Image is too large to be stored as TARGA."
 msgstr "Immagine troppo grande per essere salvata come TARGA."
 
-#: modules/file/imgexport.c:6457 modules/file/imgexport.c:6486
+#: modules/file/imgexport.c:6406 modules/file/imgexport.c:6435
 msgid "Draw _numbers"
 msgstr "Disegna _numeri"
 
-#: modules/file/imgexport.c:6469 modules/file/imgexport.c:6517
+#: modules/file/imgexport.c:6418 modules/file/imgexport.c:6466
 msgid "_End marker length:"
 msgstr "lunghezza segnale fine:"
 
-#: modules/file/imgexport.c:6498
+#: modules/file/imgexport.c:6447
 msgid "Marker _radius:"
 msgstr "Marcatore _raggio:"
 
@@ -4647,46 +4792,57 @@ msgstr "Collezione etichette parametro incompleta"
 msgid "image depth"
 msgstr "Profondità immagine"
 
-#: modules/file/iso28600.c:534
+#: modules/file/iso28600.c:543
 msgid "Imports and exports ISO 28600:2011 SPM data transfer format."
 msgstr "Importa ed esporta il formato trasferimento dati SPM  ISO 28600:2011"
 
-#: modules/file/iso28600.c:550
+#: modules/file/iso28600.c:559
 msgid "ISO 28600:2011 SPM data transfer files (.spm)"
 msgstr "File trasferimento dati SPM ISO 28600:2011 "
 
-#: modules/file/iso28600.c:606
-#, c-format
-msgid "Only regular mappings are implemented but file has mapping type ‘%s’."
+#: modules/file/iso28600.c:658
+#, fuzzy, c-format
+msgid ""
+"Only regular and irregular mappings are implemented but the file has mapping "
+"type ‘%s’."
 msgstr "Solo mappature regolari sono implementate. Il file ha mappatura  ‘%s’."
 
-#: modules/file/iso28600.c:668 modules/file/iso28600.c:677
-#: modules/file/iso28600.c:686
+#: modules/file/iso28600.c:687 modules/file/iso28600.c:696
+#: modules/file/iso28600.c:705
 #, c-format
 msgid "List ‘%s’ has %u items which differs from the number %u given by ‘%s’."
 msgstr ""
 "La lista ‘%s’ ha %u termini che differiscono dal numero %u dato da ‘%s’."
 
-#: modules/file/iso28600.c:755 modules/file/iso28600.c:867
-#: modules/file/sdfile.c:846 modules/file/sdfile.c:863
-#: modules/file/spip-asc.c:239 modules/file/witec-asc.c:223
-#: modules/file/wsffile.c:215
+#: modules/file/iso28600.c:775
+#, fuzzy, c-format
+msgid "End of file reached when reading sample #%u of %u"
+msgstr "Termine file raggiunto durante lettura campione #%d di %d"
+
+#: modules/file/iso28600.c:784 modules/file/iso28600.c:873
+#, fuzzy, c-format
+msgid "Malformed data encountered when reading sample #%u"
+msgstr "Dati corrotti trovati durante lettura campione #%d di %d"
+
+#: modules/file/iso28600.c:797 modules/file/iso28600.c:887
+#: modules/file/iso28600.c:1022
+msgid "Missing end-of-data marker."
+msgstr "Marker termine campo dati mancante."
+
+#: modules/file/iso28600.c:1003 modules/file/sdfile.c:846
+#: modules/file/sdfile.c:863 modules/file/spip-asc.c:239
+#: modules/file/witec-asc.c:223 modules/file/wsffile.c:215
 #, c-format
 msgid "End of file reached when reading sample #%d of %d"
 msgstr "Termine file raggiunto durante lettura campione #%d di %d"
 
-#: modules/file/iso28600.c:764 modules/file/iso28600.c:876
-#: modules/file/spip-asc.c:246 modules/file/witec-asc.c:230
-#: modules/file/wsffile.c:222
+#: modules/file/iso28600.c:1012 modules/file/spip-asc.c:246
+#: modules/file/witec-asc.c:230 modules/file/wsffile.c:222
 #, c-format
 msgid "Malformed data encountered when reading sample #%d of %d"
 msgstr "Dati corrotti trovati durante lettura campione #%d di %d"
 
-#: modules/file/iso28600.c:774 modules/file/iso28600.c:886
-msgid "Missing end-of-data marker."
-msgstr "Marker termine campo dati mancante."
-
-#: modules/file/iso28600.c:1048
+#: modules/file/iso28600.c:1184
 #, c-format
 msgid "Line %u does not contain mandatory label ‘%s’."
 msgstr "La riga %u non contiene l'etichetta richiesta ‘%s’."
@@ -4703,42 +4859,61 @@ msgstr "File dati JEOL (.tif)"
 msgid "The type of data is unknown.  Please report it to the developers."
 msgstr "Tipo di dati sconosciuto. Da segnalare agli sviluppatori."
 
-#: modules/file/jpkscan.c:229
+#: modules/file/jpkscan.c:292
 msgid "Imports JPK image scans."
 msgstr "Importa scansioni immagini JPK "
 
-#: modules/file/jpkscan.c:242
+#: modules/file/jpkscan.c:305
 msgid "JPK image scans (.jpk, .jpk-qi-image)"
 msgstr "Immagini scansione JPK (.jpk, .jpk-qi-image)"
 
-#: modules/file/jpkscan.c:249
+#: modules/file/jpkscan.c:312
 msgid "JPK force curves (.jpk-force, .jpk-force-map, .jpk-qi-data)"
 msgstr "Curve di Forza JPK (.jpk-force, .jpk-force-map, .jpk-qi-data)"
 
-#: modules/file/jpkscan.c:315
+#: modules/file/jpkscan.c:378
 msgid "File does not contain grid dimensions."
 msgstr "Il file non contiene le dimensioni della griglia."
 
-#: modules/file/jpkscan.c:660 modules/file/nanoobserver.c:193
+#: modules/file/jpkscan.c:736 modules/file/nanoobserver.c:360
 #: modules/file/nanoscantech.c:205 modules/file/opengps.c:209
 #: modules/file/sensofarx.c:183 modules/file/spmxfile.c:166
 msgid "Minizip cannot open the file as a ZIP file."
 msgstr "Minizip non può aprire il file."
 
-#: modules/file/jpkscan.c:739
+#: modules/file/jpkscan.c:758 modules/file/jpkscan.c:2717
+#, c-format
+msgid "Scanning file (%u curves)..."
+msgstr ""
+
+#: modules/file/jpkscan.c:798 modules/file/nmmxyz.c:299
+msgid "Reading files..."
+msgstr "Lettura file..."
+
+#: modules/file/jpkscan.c:816
+#, fuzzy
+msgid "Creating volume data..."
+msgstr "Carica dati volume"
+
+#: modules/file/jpkscan.c:968
 msgid "Non-uniform point and/or segment numbering is not supported."
 msgstr "Numerazione di punti e/o segmenti non uniformi non supportata."
 
-#: modules/file/jpkscan.c:748
+#: modules/file/jpkscan.c:977
 msgid "Non-uniform channel lists are not supported."
 msgstr "Liste canali non uniformi non supportate"
 
-#: modules/file/jpkscan.c:756
+#: modules/file/jpkscan.c:985
 #, c-format
 msgid "Data file %s was found instead of expected %s."
 msgstr "Trovato file dati %s al posto di previsto %s."
 
-#: modules/file/jpkscan.c:1497
+#: modules/file/jpkscan.c:1900
+#, fuzzy, c-format
+msgid "Header properties file for index %u is missing."
+msgstr "Il campo intestazione `%s' è mancante."
+
+#: modules/file/jpkscan.c:2519
 msgid "Cannot find any height channel."
 msgstr "Impossibile trovare alcun canale altezza"
 
@@ -4892,19 +5067,19 @@ msgstr "File MetroPro (.dat)"
 msgid "File header is larger than file."
 msgstr "Intestazione del file maggiore del file"
 
-#: modules/file/microprof.c:117
+#: modules/file/microprof.c:125
 msgid "Imports MicroProf FRT profilometer data files."
 msgstr "Importafile dati del profilometro  MicroProf FRT."
 
-#: modules/file/microprof.c:130
+#: modules/file/microprof.c:138
 msgid "MicroProf FRT files (.frt)"
 msgstr "File MicroProf FRT (.frt)"
 
-#: modules/file/microprof.c:136
+#: modules/file/microprof.c:144
 msgid "MicroProf FRT text files (.txt)"
 msgstr "File testo MicroProf FRT (.txt)"
 
-#: modules/file/microprof.c:432
+#: modules/file/microprof.c:519
 msgid "File contains fewer than XSize*YSize data points."
 msgstr ""
 "Il file contiene un numero di punti dati minore di dimensioneX*dimensioneY."
@@ -4995,8 +5170,8 @@ msgstr "dati immagine iniziano oltre la fine del file"
 msgid "Spectra data starts past the end of file."
 msgstr "dati degli spettri iniziano oltre la fine del file"
 
-#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:276
-#: modules/file/renishaw.c:1325 modules/file/sensofar.c:256
+#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:287
+#: modules/file/renishaw.c:1334 modules/file/sensofar.c:256
 #: modules/file/witec-asc.c:161
 msgid "File header is truncated"
 msgstr "Intestazione del file troncata"
@@ -5006,8 +5181,8 @@ msgstr "Intestazione del file troncata"
 msgid "Parameter header is truncated"
 msgstr "Header parametro troncato."
 
-#: modules/file/nanoeducator.c:932 modules/process/curvature.c:454
-#: modules/tools/profile.c:1107
+#: modules/file/nanoeducator.c:932 modules/process/curvature.c:456
+#: modules/tools/profile.c:1090
 #, c-format
 msgid "Profile %d"
 msgstr "Profilo %d"
@@ -5088,23 +5263,29 @@ msgstr "Linea DATA_INFO contenente meno di %d campi. "
 msgid "Missing data start marker \\x1a\\x04."
 msgstr "Indicatore inizio dati \\x1a\\x04 mancante  "
 
-#: modules/file/nanoobserver.c:113
-msgid "Reads NanoObserver .nao files."
+#: modules/file/nanoobserver.c:201
+#, fuzzy
+msgid "Reads Nano-Solution/NanoObserver .nao files."
 msgstr "Legge file .nao NanoObserver "
 
-#: modules/file/nanoobserver.c:126
-msgid "NanoObserver data (.nao)"
+#: modules/file/nanoobserver.c:214
+#, fuzzy
+msgid "Nano-Solution/NanoObserver data (.nao)"
 msgstr "Dati NanoObserver (.nao)"
 
-#: modules/file/nanoscan.c:188
+#: modules/file/nanoobserver.c:410 modules/file/renishaw.c:1420
+msgid "Data block is truncated"
+msgstr "Blocco dati troncato."
+
+#: modules/file/nanoscan.c:191
 msgid "Imports NanoScan XML files."
 msgstr "Importa file dati  NanoScan XML "
 
-#: modules/file/nanoscan.c:201
+#: modules/file/nanoscan.c:204
 msgid "NanoScan XML files (.xml)"
 msgstr "File NanoScan XML (.xml)"
 
-#: modules/file/nanoscan.c:910
+#: modules/file/nanoscan.c:937
 msgid "Wrong size of Base64 encoded data."
 msgstr "Dimensione sbagliata di dati codificati Base64"
 
@@ -5124,22 +5305,22 @@ msgstr "Importa file dati Digital Instruments Nanoscope II "
 msgid "Nanoscope II files"
 msgstr "File Nanoscope II"
 
-#: modules/file/nanoscope.c:207
+#: modules/file/nanoscope.c:212
 msgid ""
 "Imports Veeco (Digital Instruments) Nanoscope data files, version 3 or newer."
 msgstr ""
 "Importa file dati Veeco (Digital Instruments) Nanoscope versione 3 or "
 "successive."
 
-#: modules/file/nanoscope.c:221
+#: modules/file/nanoscope.c:226
 msgid "Nanoscope III files"
 msgstr "File Nanoscope III"
 
-#: modules/file/nanoscope.c:288
+#: modules/file/nanoscope.c:295
 msgid "File is not a Nanoscope file, or it is a unknown subtype."
 msgstr "File non di tipo Nanoscope o di sottotipo sconosciuto."
 
-#: modules/file/nanoscope.c:295
+#: modules/file/nanoscope.c:302
 msgid ""
 "File has been damaged by change of line endings, resulting in corruption of "
 "the binary part of the file.\n"
@@ -5158,16 +5339,16 @@ msgstr ""
 "versioni di MS Windows o ogni altro modo di trasferimento file che cerchi di "
 "salvare il testo indipendentemente dalla piattaforma."
 
-#: modules/file/nanoscope.c:653 modules/file/nanoscope.c:669
+#: modules/file/nanoscope.c:660 modules/file/nanoscope.c:676
 msgid "Cannot parse `Scan size' field."
 msgstr "Parse impossibile delle dimensioni campo scansione."
 
-#: modules/file/nanoscope.c:1539 modules/file/nrrdfile.c:1086
+#: modules/file/nanoscope.c:1546 modules/file/nrrdfile.c:1086
 #, c-format
 msgid "Garbage after data sample #%u."
 msgstr "Dati invalidi dopo dati campione #%u."
 
-#: modules/file/nanoscope.c:1595
+#: modules/file/nanoscope.c:1602
 msgid "Truncated header line."
 msgstr "Linea intestazione troncata."
 
@@ -5245,11 +5426,8 @@ msgid "Nano Measuring Machine data import must be run as interactive."
 msgstr ""
 "I dati Nano Measuring Machine devono essere importati in modo interattivo."
 
-#: modules/file/nmmxyz.c:299
-msgid "Reading files..."
-msgstr "Lettura file..."
-
 #: modules/file/nmmxyz.c:306 modules/process/lat_synth.c:1224
+#: modules/process/wave_synth.c:798
 msgid "Rendering surface..."
 msgstr "Rappresentazione superficie..."
 
@@ -5282,20 +5460,20 @@ msgid "Plot point density map"
 msgstr "Traccia mappa densità punti"
 
 #: modules/file/nmmxyz.c:534 modules/file/rawfile.c:626
-#: modules/process/dimensions.h:445 modules/xyz/xyz_drift.c:725
-#: modules/xyz/xyz_raster.c:517
+#: modules/process/dimensions.h:427 modules/xyz/xyz_drift.c:725
+#: modules/xyz/xyz_raster.c:376
 msgid "Resolution"
 msgstr "Risoluzione"
 
 #: modules/file/nmmxyz.c:538 modules/file/rawfile.c:631
-#: modules/process/dimensions.h:451 modules/xyz/xyz_drift.c:729
-#: modules/xyz/xyz_raster.c:521
+#: modules/process/dimensions.h:433 modules/xyz/xyz_drift.c:729
+#: modules/xyz/xyz_raster.c:382
 msgid "_Horizontal size:"
 msgstr "Dimensione orizzontale:"
 
 #: modules/file/nmmxyz.c:554 modules/file/rawfile.c:638
-#: modules/process/dimensions.h:454 modules/xyz/xyz_drift.c:744
-#: modules/xyz/xyz_raster.c:536
+#: modules/process/dimensions.h:436 modules/xyz/xyz_drift.c:744
+#: modules/xyz/xyz_raster.c:388
 msgid "_Vertical size:"
 msgstr "Dimensione verticale:"
 
@@ -5384,38 +5562,38 @@ msgstr "Il campo intestazione %s per asse contiene troppi elementi"
 msgid "Per-axis header field %s contains too few items."
 msgstr "Il campo intestazione %s per asse contiene troppo pochi elementi"
 
-#: modules/file/nt-mdt.c:843
+#: modules/file/nt-mdt.c:850
 msgid "Imports NT-MDT data files."
 msgstr "Importa file dati NT-MDT."
 
-#: modules/file/nt-mdt.c:856
+#: modules/file/nt-mdt.c:863
 msgid "NT-MDT files (.mdt)"
 msgstr "File NT-MDT (.mdt)"
 
-#: modules/file/nt-mdt.c:1491 modules/file/nt-mdt.c:1599
+#: modules/file/nt-mdt.c:1498 modules/file/nt-mdt.c:1606
 msgid "Frame is too short for Frame Mode."
 msgstr "Frame troppo corta per modalità frame"
 
-#: modules/file/nt-mdt.c:1506 modules/file/nt-mdt.c:1614
+#: modules/file/nt-mdt.c:1513 modules/file/nt-mdt.c:1621
 msgid "Frame is too short for dots or data."
 msgstr "Frame troppo corta per punti o dati."
 
-#: modules/file/nt-mdt.c:1869
+#: modules/file/nt-mdt.c:1879
 #, c-format
 msgid "End of file reached in frame header #%u."
 msgstr "Termine file raggiunto nell'intestazione frame  #%u."
 
-#: modules/file/nt-mdt.c:1877
+#: modules/file/nt-mdt.c:1887
 #, c-format
 msgid "End of file reached in frame data #%u."
 msgstr "Termine file raggiunto in dati frame #%u."
 
-#: modules/file/nt-mdt.c:1910
+#: modules/file/nt-mdt.c:1920
 #, c-format
 msgid "Frame #%u is too short for scanned data header."
 msgstr "Frame #%u troppo corto per intestazione dati scansionati."
 
-#: modules/file/nt-mdt.c:1927
+#: modules/file/nt-mdt.c:1937
 #, c-format
 msgid "Frame #%u is too short for spectroscopy data header."
 msgstr "Frame #%u troppo corto per intestazione dati spettroscopici"
@@ -5530,28 +5708,28 @@ msgstr "File Omicron MATRIX (param.mtrx & data.mtrx) "
 msgid "Omicron MATRIX (.mtrx & .mtrx)"
 msgstr "File Omicron MATRIX (.mtrx & .mtrx) "
 
-#: modules/file/opdfile.c:188
+#: modules/file/opdfile.c:199
 msgid "Imports Wyko OPD and ASC files."
 msgstr "Importa file Wyko OPD e ASC"
 
-#: modules/file/opdfile.c:201
+#: modules/file/opdfile.c:212
 msgid "Wyko OPD files (.opd)"
 msgstr "File OPD (.opd)"
 
-#: modules/file/opdfile.c:208
+#: modules/file/opdfile.c:219
 msgid "Wyko ASCII export files (.asc)"
 msgstr "File esportati Wyko ASCII (.asc)"
 
-#: modules/file/opdfile.c:299
+#: modules/file/opdfile.c:310
 #, c-format
 msgid "Item `%s' is beyond the end of the file."
 msgstr "l'oggetto  `%s' è oltre la fine del file"
 
-#: modules/file/opdfile.c:614
+#: modules/file/opdfile.c:636
 msgid "Nested directories found"
 msgstr "Trovate cartelle annidate"
 
-#: modules/file/opdfile.c:805
+#: modules/file/opdfile.c:842
 #, c-format
 msgid "Truncated data in block %s"
 msgstr "Dati troncati nel blocco  %s"
@@ -5850,19 +6028,21 @@ msgstr "Formato dati"
 
 #: modules/file/rawfile.c:567 modules/process/arithmetic.c:234
 #: modules/process/calcoefs_view.c:320 modules/process/coerce.c:250
-#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:637
+#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:638
 #: modules/process/drift.c:242 modules/process/edge.c:635
-#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:183
-#: modules/process/grain_edge.c:210 modules/process/grain_filter.c:313
-#: modules/process/grain_mark.c:244 modules/process/grain_wshed.c:164
-#: modules/process/mark_disconn.c:205 modules/process/mark_with.c:195
-#: modules/process/polydistort.c:205 modules/process/scars.c:295
-#: modules/process/slope_dist.c:273 modules/process/straighten_path.c:198
-#: modules/process/synth.h:509 modules/process/tip_model.c:166
+#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:184
+#: modules/process/fractal.c:225 modules/process/grain_edge.c:209
+#: modules/process/grain_filter.c:312 modules/process/grain_mark.c:243
+#: modules/process/grain_wshed.c:165 modules/process/mark_disconn.c:205
+#: modules/process/mark_with.c:196 modules/process/mfm_field.c:278
+#: modules/process/mfm_shift.c:167 modules/process/polydistort.c:205
+#: modules/process/scars.c:314 modules/process/slope_dist.c:272
+#: modules/process/stitch.c:272 modules/process/straighten_path.c:198
+#: modules/process/synth.h:538 modules/process/tip_model.c:164
 #: modules/process/wpour_mark.c:273 modules/tools/linestats.c:454
-#: modules/tools/sfunctions.c:534 modules/tools/stats.c:459
-#: modules/volume/volume_extract.c:328 modules/volume/volume_linestat.c:287
-#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:443
+#: modules/tools/sfunctions.c:531 modules/tools/stats.c:456
+#: modules/volume/volume_extract.c:321 modules/volume/volume_linestat.c:292
+#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:457
 msgid "_Update"
 msgstr "_Aggiorna"
 
@@ -6009,7 +6189,7 @@ msgstr ""
 "<b>Parsing fallito</b>\n"
 "Il contenuto di `%s'non corrisponde al formato: %s."
 
-#: modules/file/rawfile.c:1690 modules/process/neural.c:1580
+#: modules/file/rawfile.c:1690 modules/process/neural.c:1587
 #, c-format
 msgid "The name `%s' is invalid."
 msgstr "Nome `%s' non valido"
@@ -6105,7 +6285,8 @@ msgstr "File dati XYZ"
 msgid "Import XYZ Data"
 msgstr "Importa dati XYZ"
 
-#: modules/file/rawxyz.c:279
+#: modules/file/rawxyz.c:279 modules/graph/graph_stats.c:305
+#: modules/graph/graph_stats.c:756 modules/graph/graph_stats.c:800
 msgid "Number of points:"
 msgstr "Numero punti:"
 
@@ -6125,7 +6306,7 @@ msgstr "Intervallo X:"
 msgid "_Lateral units:"
 msgstr "Unità _Laterale:"
 
-#: modules/file/rawxyz.c:386 modules/process/dimensions.h:494
+#: modules/file/rawxyz.c:386 modules/process/dimensions.h:479
 msgid "_Value units:"
 msgstr "unità _Valore:"
 
@@ -6141,18 +6322,14 @@ msgstr "file dati Renishaw WiRE (.wdf)"
 msgid "MapArea block is truncated"
 msgstr "Blocco MapArea troncato."
 
-#: modules/file/renishaw.c:787
+#: modules/file/renishaw.c:793
 msgid "Random points order unsupported"
 msgstr "Ordine punti casuale non supportato"
 
-#: modules/file/renishaw.c:1396
+#: modules/file/renishaw.c:1405
 msgid "Block header is truncated"
 msgstr "Intestazione del blocco troncata"
 
-#: modules/file/renishaw.c:1411
-msgid "Data block is truncated"
-msgstr "Blocco dati troncato."
-
 #: modules/file/rhk-sm3.c:236
 msgid "Imports RHK Technology SM3 data files."
 msgstr "Importa file dati SPM3 RHK Technology"
@@ -6414,19 +6591,24 @@ msgstr "Carica file dati SPML (Scanning Probe Microscopy Markup Language) ."
 msgid "SPML files (.xml)"
 msgstr "File SPML (.xml)"
 
-#: modules/file/spmlab.c:131
+#: modules/file/spmlab.c:175
 msgid "Imports Thermicroscopes SpmLab R3 to R7 data files."
 msgstr "Importa file dati Thermicroscopes SpmLab da R3 a R7"
 
-#: modules/file/spmlab.c:144
+#: modules/file/spmlab.c:188
 msgid "Thermicroscopes SpmLab files"
 msgstr "File Thermicroscopes SpmLab"
 
-#: modules/file/spmlab.c:231
+#: modules/file/spmlab.c:259
 #, c-format
 msgid "Unknown format version %c."
 msgstr "Versione formato  %c sconosciuta."
 
+#: modules/file/spmlab.c:283
+#, fuzzy
+msgid "Data block is truncated."
+msgstr "Blocco dati troncato."
+
 #: modules/file/spmlabf.c:79
 msgid "Imports SPMLab floating-point files."
 msgstr "Importa file a punto mobile SPMLab"
@@ -6623,11 +6805,11 @@ msgstr "Importa file WinSTM  (.stm) "
 msgid "WinSTM files (.stm)"
 msgstr "File WinSTM (.stm)"
 
-#: modules/file/wipfile.c:272
+#: modules/file/wipfile.c:281
 msgid "Imports WItec Project data files."
 msgstr "Importa file dati WITec Project  "
 
-#: modules/file/wipfile.c:285
+#: modules/file/wipfile.c:294
 msgid "WItec Project files (.wip)"
 msgstr "file WITec Project (.wip)"
 
@@ -6688,21 +6870,21 @@ msgstr "Esporta i dati come semplice file di testo XYZ"
 msgid "XYZ text data (.xyz)"
 msgstr "Dati testo XYZ (.xyz)"
 
-#: modules/file/xyzexport.c:244
+#: modules/file/xyzexport.c:247
 msgid "Lateral units:"
 msgstr "Unità laterali:"
 
-#: modules/file/xyzexport.c:290
+#: modules/file/xyzexport.c:293
 msgid "Export XYZ"
 msgstr "Esporta XYZ"
 
-#: modules/file/xyzexport.c:340 modules/process/curvature.c:704
+#: modules/file/xyzexport.c:343 modules/process/curvature.c:700
 #: modules/process/entropy.c:214 modules/process/facet-level.c:207
-#: modules/process/fit-shape.c:743 modules/process/level.c:259
-#: modules/process/linematch.c:906 modules/process/neural.c:593
-#: modules/process/polylevel.c:491 modules/process/slope_dist.c:418
-#: modules/tools/filter.c:300 modules/tools/linestats.c:436
-#: modules/tools/profile.c:591 modules/tools/sfunctions.c:516
+#: modules/process/fit-shape.c:755 modules/process/level.c:259
+#: modules/process/linematch.c:869 modules/process/neural.c:597
+#: modules/process/polylevel.c:494 modules/process/slope_dist.c:411
+#: modules/tools/filter.c:301 modules/tools/linestats.c:436
+#: modules/tools/profile.c:572 modules/tools/sfunctions.c:513
 #: modules/tools/stats.c:389
 msgid "Masking Mode"
 msgstr "Modalità Maschera"
@@ -6715,6 +6897,16 @@ msgstr "Importa immagini SEM Carl Zeiss"
 msgid "Carl Zeiss SEM scans (.tif)"
 msgstr "Scansioni SEM Carl Zeiss  (.tif)"
 
+#: modules/file/zeisslsm.c:383
+#, fuzzy
+msgid "Imports Carl Zeiss CLSM images."
+msgstr "Importa immagini SEM Carl Zeiss"
+
+#: modules/file/zeisslsm.c:396
+#, fuzzy
+msgid "Carl Zeiss CLSM images (.lsm)"
+msgstr "Scansioni SEM Carl Zeiss  (.tif)"
+
 #: modules/file/zemax.c:72
 msgid "Imports Zemax grid sag data files."
 msgstr "Importa file dati  Zemax grid sag"
@@ -6737,15 +6929,15 @@ msgstr "Codice unità %d non valido o non supportato"
 msgid "The first line contains too many items."
 msgstr "La prima linea contiene troppi oggetti"
 
-#: modules/graph/graph_align.c:57
+#: modules/graph/graph_align.c:60
 msgid "Aligns graph curves."
 msgstr "Allineamento curve grafico"
 
-#: modules/graph/graph_align.c:71
+#: modules/graph/graph_align.c:74
 msgid "/_Align"
 msgstr "/_Allinea"
 
-#: modules/graph/graph_align.c:74
+#: modules/graph/graph_align.c:77
 msgid "Align curves"
 msgstr "Allineamento curve"
 
@@ -6761,48 +6953,50 @@ msgstr "/_Dimensioni .Critiche .."
 msgid "Fit critical dimension"
 msgstr "Adatta dimensione critica"
 
-#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:267
+#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:270
 msgid "Fit Graph"
 msgstr "Adatta Grafico"
 
-#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:251
-#: modules/graph/graph_fit.c:270 modules/process/fit-shape.c:393
+#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:254
+#: modules/graph/graph_fit.c:273 modules/process/fit-shape.c:394
 #: modules/volume/volume_fdfit.c:299
 msgid "verb|_Fit"
 msgstr "Adatta"
 
-#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:166
-#: modules/graph/graph_fdfit.c:306 modules/graph/graph_fit.c:325
-#: modules/graph/graph_peaks.c:199
+#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:168
+#: modules/graph/graph_fdfit.c:313 modules/graph/graph_fit.c:332
+#: modules/graph/graph_peaks.c:199 modules/graph/graph_stats.c:268
 msgid "_Graph curve:"
 msgstr "_Curva Grafico"
 
-#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:320
-#: modules/graph/graph_fit.c:339 modules/volume/volume_fdfit.c:405
+#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:327
+#: modules/graph/graph_fit.c:346 modules/volume/volume_fdfit.c:389
 msgid "F_unction:"
 msgstr "F_unzione:"
 
-#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:361
-#: modules/graph/graph_fit.c:375 modules/process/curvature.c:745
-#: modules/process/fit-shape.c:792 modules/volume/volume_fdfit.c:446
+#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:368
+#: modules/graph/graph_fit.c:382 modules/process/curvature.c:742
+#: modules/process/fit-shape.c:804 modules/volume/volume_fdfit.c:422
 msgid "Parameter"
 msgstr "Parametro"
 
-#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:363
-#: modules/graph/graph_fit.c:377 modules/process/fit-shape.c:794
-#: modules/volume/volume_fdfit.c:448
+#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:370
+#: modules/graph/graph_fit.c:384 modules/process/fit-shape.c:806
+#: modules/volume/volume_fdfit.c:424
 msgid "Error"
 msgstr "Errore"
 
-#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:196
-#: modules/graph/graph_fdfit.c:415 modules/graph/graph_fit.c:433
-#: modules/volume/volume_fdfit.c:500 modules/volume/volume_linestat.c:389
+#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:189
+#: modules/graph/graph_fdfit.c:422 modules/graph/graph_fit.c:440
+#: modules/graph/graph_stats.c:279 modules/graph/graph_stats.c:793
+#: modules/volume/volume_fdfit.c:476 modules/volume/volume_linestat.c:394
 msgid "Range:"
 msgstr "Intervallo:"
 
-#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:207
-#: modules/graph/graph_fdfit.c:426 modules/graph/graph_fit.c:444
-#: modules/volume/volume_fdfit.c:511 modules/volume/volume_linestat.c:400
+#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:200
+#: modules/graph/graph_fdfit.c:433 modules/graph/graph_fit.c:451
+#: modules/graph/graph_stats.c:290 modules/graph/graph_stats.c:796
+#: modules/volume/volume_fdfit.c:487 modules/volume/volume_linestat.c:405
 msgid "range|to"
 msgstr "fino a"
 
@@ -6810,94 +7004,94 @@ msgstr "fino a"
 msgid "_Draw whole circle"
 msgstr "_Disegna cerchio"
 
-#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:491
-#: modules/graph/graph_fit.c:531 modules/process/fit-shape.c:522
-#: modules/volume/volume_fdfit.c:573
+#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:498
+#: modules/graph/graph_fit.c:538 modules/process/fit-shape.c:523
+#: modules/volume/volume_fdfit.c:549
 msgid "Save Fit Report"
 msgstr "Salva il Fit Report"
 
 #: modules/graph/graph_cd.c:529 modules/graph/graph_cd.c:1107
-#: modules/graph/graph_fdfit.c:709 modules/graph/graph_fit.c:763
-#: modules/volume/volume_fdfit.c:907
+#: modules/graph/graph_fdfit.c:725 modules/graph/graph_fit.c:779
+#: modules/volume/volume_fdfit.c:883
 msgid "Fit"
 msgstr "Adatta"
 
-#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:749
-#: modules/graph/graph_fit.c:803 modules/volume/volume_fdfit.c:978
-#: modules/volume/volume_fdfit.c:1085
+#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:765
+#: modules/graph/graph_fit.c:819 modules/volume/volume_fdfit.c:954
+#: modules/volume/volume_fdfit.c:1061
 msgid "It is necessary to select more data points than free fit parameters"
 msgstr ""
 "E' necessario selezionare un numero di dati maggiore dei parametri di fit "
 "libero."
 
-#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:798
-#: modules/graph/graph_fit.c:852 modules/process/entropy.c:554
-#: modules/tools/grainmeasure.c:217 modules/tools/readvalue.c:634
-#: modules/tools/readvalue.c:635 modules/tools/readvalue.c:636
-#: modules/tools/readvalue.c:637 modules/tools/roughness.c:975
-#: modules/tools/stats.c:727 modules/tools/stats.c:740
-#: modules/tools/stats.c:741 modules/volume/volume_fdfit.c:1134
-#: modules/xyz/xyz_drift.c:1099 modules/xyz/xyz_drift.c:1117
-#: modules/xyz/xyz_drift.c:1134
+#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:814
+#: modules/graph/graph_fit.c:868 modules/graph/graph_stats.c:663
+#: modules/process/entropy.c:555 modules/tools/grainmeasure.c:217
+#: modules/tools/readvalue.c:634 modules/tools/readvalue.c:635
+#: modules/tools/readvalue.c:636 modules/tools/readvalue.c:637
+#: modules/tools/roughness.c:984 modules/tools/stats.c:723
+#: modules/tools/stats.c:736 modules/tools/stats.c:737
+#: modules/volume/volume_fdfit.c:1110 modules/xyz/xyz_drift.c:1099
+#: modules/xyz/xyz_drift.c:1117 modules/xyz/xyz_drift.c:1134
 msgid "N.A."
 msgstr "N.A."
 
-#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1363
-#: modules/graph/graph_fit.c:1500 modules/process/fit-shape.c:2078
-#: modules/volume/volume_fdfit.c:1720
+#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1381
+#: modules/graph/graph_fit.c:1518 modules/process/fit-shape.c:2060
+#: modules/volume/volume_fdfit.c:1696
 msgid "===== Fit Results ====="
 msgstr "===== Risultati del Fit ====="
 
-#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1367
-#: modules/graph/graph_fit.c:1504 modules/process/fit-shape.c:2080
-#: modules/volume/volume_fdfit.c:1724
+#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1385
+#: modules/graph/graph_fit.c:1522 modules/process/fit-shape.c:2062
+#: modules/volume/volume_fdfit.c:1700
 #, c-format
 msgid "Data:             %s\n"
 msgstr "Dati:             %s\n"
 
-#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1370
-#: modules/graph/graph_fit.c:1507 modules/process/fit-shape.c:2082
-#: modules/volume/volume_fdfit.c:1727
+#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1388
+#: modules/graph/graph_fit.c:1525 modules/process/fit-shape.c:2064
+#: modules/volume/volume_fdfit.c:1703
 #, c-format
 msgid "Number of points: %d of %d\n"
 msgstr "Numero di punti: %d di %d\n"
 
-#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1374
-#: modules/graph/graph_fit.c:1511 modules/volume/volume_fdfit.c:1731
+#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1392
+#: modules/graph/graph_fit.c:1529 modules/volume/volume_fdfit.c:1707
 #, c-format
 msgid "X range:          %.*f to %.*f %s\n"
 msgstr "Intervallo X :          da %.*f a %.*f %s\n"
 
-#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1380
-#: modules/graph/graph_fit.c:1517 modules/process/fit-shape.c:2084
-#: modules/volume/volume_fdfit.c:1737
+#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1398
+#: modules/graph/graph_fit.c:1535 modules/process/fit-shape.c:2066
+#: modules/volume/volume_fdfit.c:1713
 #, c-format
 msgid "Fitted function:  %s\n"
 msgstr "Funzione adattata:  %s\n"
 
-#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1383
-#: modules/graph/graph_fit.c:1520 modules/process/fit-shape.c:2087
-#: modules/volume/volume_fdfit.c:1740
+#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1401
+#: modules/graph/graph_fit.c:1538 modules/process/fit-shape.c:2069
+#: modules/volume/volume_fdfit.c:1716
 msgid "Results\n"
 msgstr "Risultati\n"
 
-#: modules/graph/graph_cut.c:88
+#: modules/graph/graph_cut.c:87
 msgid "Cut graph"
 msgstr "Taglia grafico"
 
-#: modules/graph/graph_cut.c:102
+#: modules/graph/graph_cut.c:101
 msgid "/_Cut..."
 msgstr "/Taglia..."
 
-#: modules/graph/graph_cut.c:105
+#: modules/graph/graph_cut.c:104
 msgid "Extract part of graph into new one"
 msgstr "Estrazione di parte del grafico in nuovo file"
 
-#: modules/graph/graph_cut.c:146
+#: modules/graph/graph_cut.c:145
 msgid "Cut Graph"
 msgstr "Taglia Grafico"
 
-#: modules/graph/graph_cut.c:180
+#: modules/graph/graph_cut.c:173
 msgid "Cut _all curves"
 msgstr "Taglia tutte le curve"
 
@@ -6995,97 +7189,97 @@ msgstr "Esporta grafico come immagine raster"
 msgid "Export to PNG"
 msgstr "Esporta come PNG"
 
-#: modules/graph/graph_export_vector.c:35
+#: modules/graph/graph_export_vector.c:36
 msgid "Exports graphs to PostScript"
 msgstr "Esporta grafico come file postscript"
 
-#: modules/graph/graph_export_vector.c:49
+#: modules/graph/graph_export_vector.c:50
 msgid "/Export _PostScript"
 msgstr "/Esporta _PostScript"
 
-#: modules/graph/graph_export_vector.c:52
+#: modules/graph/graph_export_vector.c:53
 msgid "Export graph to PostScript"
 msgstr "Esporta grafico come file postscript"
 
-#: modules/graph/graph_export_vector.c:65
+#: modules/graph/graph_export_vector.c:66
 msgid "Export to PostScript"
 msgstr "Esporta come PostScript"
 
-#: modules/graph/graph_fdfit.c:168
+#: modules/graph/graph_fdfit.c:169
 msgid "Fit force-distance data"
 msgstr "Adatta dati forza-distanza"
 
-#: modules/graph/graph_fdfit.c:182
+#: modules/graph/graph_fdfit.c:183
 msgid "/_Fit FD Curve..."
 msgstr "/_Fit Curva FD..."
 
-#: modules/graph/graph_fdfit.c:185
+#: modules/graph/graph_fdfit.c:186
 msgid "Fit a force-distance curve"
 msgstr "Adatta una curva forza-distanza"
 
-#: modules/graph/graph_fdfit.c:248 modules/volume/volume_fdfit.c:296
+#: modules/graph/graph_fdfit.c:251 modules/volume/volume_fdfit.c:296
 msgid "Fit FD Curve"
 msgstr "Fit Curva FD..."
 
-#: modules/graph/graph_fdfit.c:255 modules/graph/graph_fit.c:274
-#: modules/process/fit-shape.c:397 modules/process/measure_lattice.c:257
-#: modules/volume/volume_fdfit.c:303
+#: modules/graph/graph_fdfit.c:258 modules/graph/graph_fit.c:277
+#: modules/process/correct_affine.c:347 modules/process/fit-shape.c:398
+#: modules/process/measure_lattice.c:247 modules/volume/volume_fdfit.c:303
 msgid "verb|_Estimate"
 msgstr "Stima"
 
-#: modules/graph/graph_fdfit.c:257 modules/graph/graph_fit.c:276
-#: modules/volume/volume_fdfit.c:305
+#: modules/graph/graph_fdfit.c:260 modules/graph/graph_fit.c:279
+#: modules/process/psf.c:239 modules/volume/volume_fdfit.c:305
 msgid "_Plot Inits"
 msgstr "_Metti in grafico inits"
 
-#: modules/graph/graph_fdfit.c:359 modules/graph/graph_fit.c:373
-#: modules/process/fit-shape.c:790 modules/volume/volume_fdfit.c:444
+#: modules/graph/graph_fdfit.c:366 modules/graph/graph_fit.c:380
+#: modules/process/fit-shape.c:802 modules/volume/volume_fdfit.c:420
 msgid "Fix"
 msgstr "Fissa"
 
-#: modules/graph/graph_fdfit.c:365 modules/graph/graph_fit.c:379
-#: modules/volume/volume_fdfit.c:450
+#: modules/graph/graph_fdfit.c:372 modules/graph/graph_fit.c:386
+#: modules/volume/volume_fdfit.c:426
 msgid "Initial"
 msgstr "Iniziale"
 
-#: modules/graph/graph_fdfit.c:376 modules/graph/graph_fit.c:394
-#: modules/volume/volume_fdfit.c:461
+#: modules/graph/graph_fdfit.c:383 modules/graph/graph_fit.c:401
+#: modules/volume/volume_fdfit.c:437
 msgid "χ<sup>2</sup> result:"
 msgstr "χ<sup>2</sup> risulta:"
 
-#: modules/graph/graph_fdfit.c:392 modules/graph/graph_fit.c:410
-#: modules/process/fit-shape.c:469 modules/process/fit-shape.c:2134
-#: modules/volume/volume_fdfit.c:477
+#: modules/graph/graph_fdfit.c:399 modules/graph/graph_fit.c:417
+#: modules/process/fit-shape.c:470 modules/process/fit-shape.c:2116
+#: modules/volume/volume_fdfit.c:453
 msgid "Correlation Matrix"
 msgstr "Matrice di Correlazione"
 
-#: modules/graph/graph_fdfit.c:447 modules/graph/graph_fit.c:485
-#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:532
+#: modules/graph/graph_fdfit.c:454 modules/graph/graph_fit.c:492
+#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:508
 msgid "Instant:"
 msgstr "Istante:"
 
-#: modules/graph/graph_fdfit.c:450 modules/graph/graph_fit.c:488
+#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
 msgid "esti_mate"
 msgstr "Sti_ma"
 
-#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
-#: modules/volume/volume_fdfit.c:542
+#: modules/graph/graph_fdfit.c:464 modules/graph/graph_fit.c:502
+#: modules/volume/volume_fdfit.c:518
 msgid "p_lot"
 msgstr "grafico"
 
-#: modules/graph/graph_fdfit.c:708 modules/graph/graph_fit.c:762
-#: modules/volume/volume_fdfit.c:906
+#: modules/graph/graph_fdfit.c:724 modules/graph/graph_fit.c:778
+#: modules/volume/volume_fdfit.c:882
 msgid "Estimate"
 msgstr "Stima"
 
-#: modules/graph/graph_fdfit.c:1410 modules/graph/graph_fit.c:1547
-#: modules/volume/volume_fdfit.c:1768
+#: modules/graph/graph_fdfit.c:1428 modules/graph/graph_fit.c:1565
+#: modules/volume/volume_fdfit.c:1744
 #, c-format
 msgid "Residual sum:   %g\n"
 msgstr "Somma residuale:   %g\n"
 
-#: modules/graph/graph_fdfit.c:1413 modules/graph/graph_fit.c:1550
-#: modules/volume/volume_fdfit.c:1771
+#: modules/graph/graph_fdfit.c:1431 modules/graph/graph_fit.c:1568
+#: modules/volume/volume_fdfit.c:1747
 msgid "Correlation matrix\n"
 msgstr "Matrice di correlazione\n"
 
@@ -7101,27 +7295,27 @@ msgstr "/_Filtro"
 msgid "Remove noise from graph curves"
 msgstr "Rimuove rumore dalle curve del grafico"
 
-#: modules/graph/graph_fit.c:181
+#: modules/graph/graph_fit.c:182
 msgid "Fit graph with function"
 msgstr "Adatta il grafico con la funzione"
 
-#: modules/graph/graph_fit.c:195
+#: modules/graph/graph_fit.c:196
 msgid "/_Fit Function..."
 msgstr "/_Fit Funzione..."
 
-#: modules/graph/graph_fit.c:198
+#: modules/graph/graph_fit.c:199
 msgid "Fit a function on graph data"
 msgstr "Adatta una funzione ai dati del grafico"
 
-#: modules/graph/graph_fit.c:386
+#: modules/graph/graph_fit.c:393
 msgid "Copy all fitted values to estimates"
 msgstr ""
 
-#: modules/graph/graph_fit.c:460
+#: modules/graph/graph_fit.c:467
 msgid "Plot full range"
 msgstr "Intervallo totale grafico"
 
-#: modules/graph/graph_fit.c:470
+#: modules/graph/graph_fit.c:477
 msgid "Create a difference graph"
 msgstr "Crea grafico differenza"
 
@@ -7212,52 +7406,149 @@ msgstr "/Trova _Picchi..."
 msgid "Find graph curve peaks"
 msgstr "Trova picchi su curve grafico"
 
-#: modules/graph/graph_peaks.c:157
+#: modules/graph/graph_peaks.c:155
 msgid "Prominence"
 msgstr "Prominenza"
 
-#: modules/graph/graph_peaks.c:161
+#: modules/graph/graph_peaks.c:159
 msgid "Zero"
 msgstr "Zero"
 
-#: modules/graph/graph_peaks.c:162
+#: modules/graph/graph_peaks.c:160
 msgid "Bilateral minimum"
 msgstr "Minimo bilaterale"
 
-#: modules/graph/graph_peaks.c:178
+#: modules/graph/graph_peaks.c:176
 msgid "Graph Peaks"
 msgstr "Grafico Picchi"
 
-#: modules/graph/graph_peaks.c:212
+#: modules/graph/graph_peaks.c:209
 msgid "_Background type:"
 msgstr "Tipo Sfondo:"
 
-#: modules/graph/graph_peaks.c:227
+#: modules/graph/graph_peaks.c:219
 msgid "Order peaks _by:"
 msgstr "Ordina picchi per:"
 
-#: modules/graph/graph_peaks.c:242
+#: modules/graph/graph_peaks.c:225
 msgid "Number of _peaks:"
 msgstr "_Numero picchi:"
 
-#: modules/graph/graph_peaks.c:263 modules/process/curvature.c:773
-#: modules/process/grain_stat.c:360 modules/process/measure_lattice.c:396
-#: modules/process/polylevel.c:607 modules/tools/distance.c:259
-#: modules/tools/roughness.c:818 modules/tools/stats.c:450
+#: modules/graph/graph_peaks.c:245 modules/graph/graph_stats.c:367
+#: modules/process/curvature.c:770 modules/process/grain_stat.c:360
+#: modules/process/measure_lattice.c:390 modules/process/polylevel.c:610
+#: modules/tools/distance.c:259 modules/tools/roughness.c:819
+#: modules/tools/stats.c:447
 msgid "Save table to a file"
 msgstr "Salva tabella in file"
 
-#: modules/graph/graph_peaks.c:267 modules/process/curvature.c:778
-#: modules/process/grain_stat.c:365 modules/process/measure_lattice.c:400
-#: modules/process/polylevel.c:617 modules/tools/distance.c:264
-#: modules/tools/roughness.c:823 modules/tools/stats.c:455
+#: modules/graph/graph_peaks.c:249 modules/graph/graph_stats.c:371
+#: modules/process/curvature.c:775 modules/process/grain_stat.c:365
+#: modules/process/measure_lattice.c:394 modules/process/polylevel.c:620
+#: modules/tools/distance.c:264 modules/tools/roughness.c:824
+#: modules/tools/stats.c:452
 msgid "Copy table to clipboard"
 msgstr "Copia tabella negli appunti"
 
-#: modules/graph/graph_peaks.c:654
+#: modules/graph/graph_peaks.c:618
 msgid "Save Peak Parameters"
 msgstr "Salva Parametri picco"
 
+#: modules/graph/graph_stats.c:148 modules/graph/graph_stats.c:161
+#: modules/tools/stats.c:205
+msgid "Average value:"
+msgstr "Valore medio:"
+
+#: modules/graph/graph_stats.c:149 modules/tools/stats.c:206
+msgid "Median:"
+msgstr "Mediana:"
+
+#: modules/graph/graph_stats.c:150
+msgid "Ra:"
+msgstr "Ra:"
+
+#: modules/graph/graph_stats.c:151
+#, fuzzy
+msgid "Rms (Rq):"
+msgstr "Rms (Sq):"
+
+#: modules/graph/graph_stats.c:152 modules/tools/stats.c:210
+msgid "Skew:"
+msgstr "Skew:"
+
+#: modules/graph/graph_stats.c:153 modules/tools/stats.c:211
+msgid "Kurtosis:"
+msgstr "Curtosi:"
+
+#: modules/graph/graph_stats.c:158
+#, fuzzy
+msgid "Projected length:"
+msgstr "Lunghezza contorno proiettato"
+
+#: modules/graph/graph_stats.c:159
+#, fuzzy
+msgid "Developed length:"
+msgstr "Lunghezza profilo sviluppato"
+
+#: modules/graph/graph_stats.c:160 modules/tools/stats.c:214
+msgid "Variation:"
+msgstr "Variazione:"
+
+#: modules/graph/graph_stats.c:162
+#, fuzzy
+msgid "Area under curve:"
+msgstr "_Curva Grafico"
+
+#: modules/graph/graph_stats.c:163
+#, fuzzy
+msgid "Positive area:"
+msgstr "Positivo"
+
+#: modules/graph/graph_stats.c:164
+#, fuzzy
+msgid "Negative area:"
+msgstr "Negativo"
+
+#: modules/graph/graph_stats.c:165
+#, fuzzy
+msgid "Root mean square:"
+msgstr "Radice quadratica media ondulazione"
+
+#: modules/graph/graph_stats.c:171
+#, fuzzy
+msgid "Calculates simple graph curve statistics."
+msgstr "Calcola curvatura globale"
+
+#: modules/graph/graph_stats.c:185
+#, fuzzy
+msgid "/_Statistics..."
+msgstr "/_Grani/S_tatistiche.."
+
+#: modules/graph/graph_stats.c:188
+#, fuzzy
+msgid "Calculate graph curve statistics"
+msgstr "Calcolo funzioni statistiche riga/colonna"
+
+#: modules/graph/graph_stats.c:241
+#, fuzzy
+msgid "Graph Statistics"
+msgstr "Statistiche Grani"
+
+#: modules/graph/graph_stats.c:320 modules/graph/graph_stats.c:807
+#, fuzzy
+msgid "Simple Parameters"
+msgstr "Parametri Simulazione"
+
+#: modules/graph/graph_stats.c:342 modules/graph/graph_stats.c:826
+#, fuzzy
+msgid "Integrals"
+msgstr "_Integrale:"
+
+#: modules/graph/graph_stats.c:686
+#, fuzzy
+msgid "Save Curve Statistics"
+msgstr "Salva Statistiche Grani"
+
 #: modules/layer/axis.c:143
 msgid "Layer allowing selection of horizontal or vertical lines."
 msgstr "Permette la selezione di linee orizzontali o verticali"
@@ -7395,25 +7686,25 @@ msgstr "Distribuzione angolare"
 msgid "Angle Distribution"
 msgstr "Distribuzione Angolare"
 
-#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:373
+#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:365
 msgid "Output _size:"
 msgstr "Dimensione output:"
 
-#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:206
+#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:207
 msgid "_Number of steps:"
 msgstr "_Numero step:"
 
-#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:380
+#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:372
 msgid "_Logarithmic value scale"
 msgstr "_Scala di valore logaritmica"
 
 #: modules/process/angle_dist.c:204 modules/process/entropy.c:231
-#: modules/process/slope_dist.c:390
+#: modules/process/slope_dist.c:382
 msgid "Use local plane _fitting"
 msgstr "Uso plane _fitting locale"
 
 #: modules/process/angle_dist.c:213 modules/process/entropy.c:242
-#: modules/process/slope_dist.c:401
+#: modules/process/slope_dist.c:393
 msgid "_Plane size:"
 msgstr "Dimensioni piano:"
 
@@ -7429,7 +7720,8 @@ msgstr "/Dati _Multipli/_Aritmetica..."
 msgid "Arithmetic operations on data"
 msgstr "Operazioni aritmetiche sui dati"
 
-#: modules/process/arithmetic.c:202 modules/process/superresolution.c:349
+#: modules/process/arithmetic.c:202 modules/process/stitch.c:234
+#: modules/process/superresolution.c:348
 msgid "Calculated"
 msgstr "Calcolato"
 
@@ -7445,7 +7737,7 @@ msgstr "_Espressione:"
 msgid "Operands"
 msgstr "Operandi"
 
-#: modules/process/arithmetic.c:300 modules/process/dimensions.h:483
+#: modules/process/arithmetic.c:300 modules/process/dimensions.h:465
 msgid "Units"
 msgstr "Unità"
 
@@ -7466,15 +7758,15 @@ msgstr "Specificare esplicitamente unità risultato"
 msgid "Expression contains unknown identifiers"
 msgstr "L'espressione contiene identificatori sconosciuti"
 
-#: modules/process/arithmetic.c:569 modules/process/superresolution.c:300
+#: modules/process/arithmetic.c:569 modules/process/superresolution.c:299
 msgid "Pixel dimensions differ"
 msgstr "Le dimensioni in pixel differiscono"
 
-#: modules/process/arithmetic.c:571 modules/process/superresolution.c:302
+#: modules/process/arithmetic.c:571 modules/process/superresolution.c:301
 msgid "Lateral dimensions are different physical quantities"
 msgstr "Le dimensioni laterali sono quantità fisiche differenti"
 
-#: modules/process/arithmetic.c:574 modules/process/superresolution.c:305
+#: modules/process/arithmetic.c:574 modules/process/superresolution.c:304
 msgid "Physical dimensions differ"
 msgstr "Le dimensioni fisiche differiscono"
 
@@ -7580,7 +7872,8 @@ msgid "Generates surfaces by ballistic deposition."
 msgstr "Generazione superfici per deposizione balistica"
 
 #: modules/process/bdep_synth.c:164
-msgid "/S_ynthetic/_Ballistic..."
+#, fuzzy
+msgid "/S_ynthetic/_Deposition/_Ballistic..."
 msgstr "/Sintetico/_Balistico..."
 
 #: modules/process/bdep_synth.c:168
@@ -7589,20 +7882,23 @@ msgstr "Generazione superficie tramite deposizione balistica"
 
 #: modules/process/bdep_synth.c:239 modules/process/bdep_synth.c:596
 #: modules/process/calcoefs_simple.c:636 modules/process/col_synth.c:282
-#: modules/process/col_synth.c:733 modules/process/crosscor.c:819
-#: modules/process/crosscor.c:882 modules/process/deposit_synth.c:268
-#: modules/process/deposit_synth.c:859 modules/process/diff_synth.c:304
-#: modules/process/diff_synth.c:705 modules/process/domain_synth.c:255
-#: modules/process/domain_synth.c:745 modules/process/grain_wshed.c:429
+#: modules/process/col_synth.c:734 modules/process/crosscor.c:792
+#: modules/process/crosscor.c:855 modules/process/deposit_synth.c:268
+#: modules/process/deposit_synth.c:858 modules/process/diff_synth.c:304
+#: modules/process/diff_synth.c:704 modules/process/domain_synth.c:255
+#: modules/process/domain_synth.c:745 modules/process/fibre_synth.c:357
+#: modules/process/fibre_synth.c:872 modules/process/grain_wshed.c:433
 #: modules/process/lat_synth.c:491 modules/process/mark_disconn.c:148
-#: modules/process/mark_disconn.c:373 modules/process/maskcor.c:330
-#: modules/process/mcrop.c:315 modules/process/merge.c:1072
-#: modules/process/nanoindent_adjust.c:323 modules/process/neural.c:1272
-#: modules/process/pid.c:338 modules/process/superresolution.c:416
-#: modules/process/superresolution.c:505 modules/process/tip_blind.c:781
-#: modules/process/tipops.c:320 modules/process/xydenoise.c:213
-#: modules/volume/volume_kmeans.c:403 modules/volume/volume_kmedians.c:365
-#: modules/xyz/xyz_raster.c:1028 modules/xyz/xyz_raster.c:1044
+#: modules/process/mark_disconn.c:361 modules/process/maskcor.c:334
+#: modules/process/mcrop.c:314 modules/process/merge.c:1072
+#: modules/process/nanoindent_adjust.c:324 modules/process/neural.c:1279
+#: modules/process/pid.c:339 modules/process/sphere-revolve.c:269
+#: modules/process/superresolution.c:415 modules/process/superresolution.c:504
+#: modules/process/tip_blind.c:778 modules/process/tipops.c:320
+#: modules/process/wave_synth.c:305 modules/process/wave_synth.c:747
+#: modules/process/xydenoise.c:214 modules/volume/volume_kmeans.c:397
+#: modules/volume/volume_kmedians.c:363 modules/xyz/xyz_raster.c:997
+#: modules/xyz/xyz_raster.c:1013
 msgid "Initializing..."
 msgstr "Inizializzazione...."
 
@@ -7611,10 +7907,11 @@ msgstr "Inizializzazione...."
 #: modules/process/deposit_synth.c:531 modules/process/deposit_synth.c:544
 #: modules/process/diff_synth.c:342 modules/process/domain_synth.c:319
 #: modules/process/domain_synth.c:327 modules/process/fbm_synth.c:278
-#: modules/process/fft_synth.c:314 modules/process/lat_synth.c:529
-#: modules/process/lno_synth.c:407 modules/process/noise_synth.c:311
-#: modules/process/obj_synth.c:407 modules/process/pat_synth.c:357
-#: modules/process/wave_synth.c:323
+#: modules/process/fft_synth.c:314 modules/process/fibre_synth.c:394
+#: modules/process/lat_synth.c:529 modules/process/lno_synth.c:405
+#: modules/process/noise_synth.c:309 modules/process/obj_synth.c:404
+#: modules/process/pat_synth.c:357 modules/process/phase_synth.c:518
+#: modules/process/wave_synth.c:342
 msgid "Generated"
 msgstr "Generato"
 
@@ -7633,50 +7930,57 @@ msgid "Progressive preview"
 msgstr "Anteprima progressiva"
 
 #: modules/process/bdep_synth.c:407 modules/process/col_synth.c:458
-#: modules/process/deposit_synth.c:412 modules/process/diff_synth.c:477
+#: modules/process/deposit_synth.c:413 modules/process/diff_synth.c:477
 #: modules/process/domain_synth.c:430 modules/process/fbm_synth.c:360
-#: modules/process/fft_synth.c:398 modules/process/lat_synth.c:626
-#: modules/process/lno_synth.c:490 modules/process/noise_synth.c:394
-#: modules/process/obj_synth.c:498 modules/process/pat_synth.c:442
-#: modules/process/wave_synth.c:407
+#: modules/process/fft_synth.c:398 modules/process/fibre_synth.c:479
+#: modules/process/lat_synth.c:626 modules/process/lno_synth.c:488
+#: modules/process/mfm_current.c:383 modules/process/mfm_parallel.c:384
+#: modules/process/noise_synth.c:392 modules/process/obj_synth.c:495
+#: modules/process/pat_synth.c:442 modules/process/phase_synth.c:263
+#: modules/process/wave_synth.c:426
 msgid "Dimensions"
 msgstr "Dimensioni"
 
 #: modules/process/bdep_synth.c:416 modules/process/col_synth.c:467
-#: modules/process/deposit_synth.c:422 modules/process/diff_synth.c:486
+#: modules/process/deposit_synth.c:425 modules/process/diff_synth.c:486
 #: modules/process/domain_synth.c:438 modules/process/fbm_synth.c:371
-#: modules/process/fft_synth.c:409 modules/process/lno_synth.c:501
-#: modules/process/noise_synth.c:405 modules/process/obj_synth.c:509
-#: modules/process/pat_synth.c:454 modules/process/wave_synth.c:418
+#: modules/process/fft_synth.c:409 modules/process/fibre_synth.c:490
+#: modules/process/lno_synth.c:499 modules/process/mfm_current.c:412
+#: modules/process/mfm_parallel.c:411 modules/process/noise_synth.c:403
+#: modules/process/obj_synth.c:506 modules/process/pat_synth.c:454
+#: modules/process/phase_synth.c:274 modules/process/wave_synth.c:437
 msgid "Generator"
 msgstr "Generatore"
 
 #: modules/process/bdep_synth.c:422 modules/process/col_synth.c:473
-#: modules/process/diff_synth.c:492 modules/process/lno_synth.c:1041
-#: modules/process/obj_synth.c:520
+#: modules/process/deposit_synth.c:455 modules/process/diff_synth.c:492
+#: modules/process/fibre_synth.c:502 modules/process/lno_synth.c:1041
+#: modules/process/obj_synth.c:518
 msgid "Co_verage:"
 msgstr "Co_pertura:"
 
 #: modules/process/bdep_synth.c:434 modules/process/diff_synth.c:512
-#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:412
-#: modules/process/fft_synth.c:418 modules/process/lat_synth.c:758
-#: modules/process/lno_synth.c:537 modules/process/noise_synth.c:437
-#: modules/process/obj_synth.c:579 modules/process/wave_synth.c:453
-msgid "_Like Current Channel"
-msgstr ""
+#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:411
+#: modules/process/fft_synth.c:418 modules/process/fibre_synth.c:544
+#: modules/process/lat_synth.c:758 modules/process/lno_synth.c:535
+#: modules/process/noise_synth.c:435 modules/process/obj_synth.c:577
+#: modules/process/phase_synth.c:302 modules/process/wave_synth.c:472
+#, fuzzy
+msgid "_Like Current Image"
+msgstr "Canale Corrente"
 
-#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:541
-#: modules/process/diff_synth.c:562
+#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:542
+#: modules/process/diff_synth.c:561
 msgid "Evolution"
 msgstr "Evoluzione"
 
-#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:544
-#: modules/process/diff_synth.c:565
+#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:545
+#: modules/process/diff_synth.c:564
 msgid "Plot graphs:"
 msgstr "Disegna grafici:"
 
-#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:840
-#: modules/process/diff_synth.c:782
+#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:841
+#: modules/process/diff_synth.c:781
 msgid "Depositing particles..."
 msgstr "Deposizione particelle..."
 
@@ -7711,8 +8015,8 @@ msgstr "Carica Dati Calibrazione"
 msgid "Calibration name:"
 msgstr "Nome Calibrazione:"
 
-#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:433
-#: modules/volume/volume_extract.c:514
+#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:421
+#: modules/volume/volume_extract.c:501
 msgid "No data loaded"
 msgstr "nessun dato caricato"
 
@@ -7736,7 +8040,7 @@ msgstr "Aggiungi"
 msgid "Load calibration data"
 msgstr "Carica dati calibrazione"
 
-#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1073
+#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1059
 #, c-format
 msgid "Error loading file '%s'"
 msgstr "Errore nel caricare il file '%s'"
@@ -7830,7 +8134,7 @@ msgstr "Mappatura errore semplice"
 msgid "Simple Error Map"
 msgstr "Mappa Errore Semplice"
 
-#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:146
+#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:142
 #: modules/process/superresolution.c:156
 msgid "Operands:"
 msgstr "Operandi:"
@@ -7844,14 +8148,14 @@ msgid "Detail"
 msgstr "Dettaglio"
 
 #: modules/process/calcoefs_simple.c:371 modules/process/calcoefs_view.c:491
-#: modules/process/calibrate.c:496 modules/process/crosscor.c:289
-#: modules/volume/volume_calibrate.c:478
+#: modules/process/calibrate.c:481 modules/process/crosscor.c:276
+#: modules/volume/volume_calibrate.c:460
 msgid "_X offset:"
 msgstr "_X offset:"
 
 #: modules/process/calcoefs_simple.c:398 modules/process/calcoefs_view.c:517
-#: modules/process/calibrate.c:509 modules/process/crosscor.c:300
-#: modules/volume/volume_calibrate.c:491
+#: modules/process/calibrate.c:488 modules/process/crosscor.c:284
+#: modules/volume/volume_calibrate.c:467
 msgid "_Y offset:"
 msgstr "_Y offset:"
 
@@ -7864,7 +8168,7 @@ msgid "Y p_eriod:"
 msgstr "p_eriodo Y:"
 
 #: modules/process/calcoefs_simple.c:438 modules/process/calcoefs_view.c:529
-#: modules/volume/volume_calibrate.c:505
+#: modules/volume/volume_calibrate.c:474
 msgid "_Z offset:"
 msgstr "_Z offset:"
 
@@ -7895,25 +8199,25 @@ msgstr[1] "Trovati %d oggetti"
 msgid "Search canceled"
 msgstr "Ricerca cancellat"
 
-#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:862
-#: modules/process/maskcor.c:332 modules/process/mcrop.c:317
+#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:835
+#: modules/process/maskcor.c:336 modules/process/mcrop.c:316
 #: modules/process/merge.c:1074
 msgid "Correlating..."
 msgstr "Correlazione..."
 
-#: modules/process/calcoefs_stage.c:76
+#: modules/process/calcoefs_stage.c:72
 msgid "Digital AFM data recalibration"
 msgstr "Ricalibrazione dati digitali AFM"
 
-#: modules/process/calcoefs_stage.c:90
+#: modules/process/calcoefs_stage.c:86
 msgid "/Cali_bration/_3D Calibration/_Get From Stage map..."
 msgstr "/Cali_brazione/Calibrazione _3D /_Get From Stage map..."
 
-#: modules/process/calcoefs_stage.c:94
+#: modules/process/calcoefs_stage.c:90
 msgid "Stage error mapping"
 msgstr ""
 
-#: modules/process/calcoefs_stage.c:131
+#: modules/process/calcoefs_stage.c:127
 msgid "Stage Error Map"
 msgstr ""
 
@@ -7969,14 +8273,16 @@ msgstr "Posizione Z:"
 msgid "Crop to actual data"
 msgstr "Taglia dati effettivi"
 
-#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:369
-#: modules/process/deposit_synth.c:641 modules/process/edge.c:705
-#: modules/process/fft_filter_1d.c:299 modules/process/grain_edge.c:290
-#: modules/process/grain_filter.c:347 modules/process/grain_mark.c:372
-#: modules/process/mark_with.c:318 modules/process/polydistort.c:316
-#: modules/process/scars.c:386 modules/process/slope_dist.c:407
-#: modules/process/synth.h:513 modules/volume/volume_extract.c:424
-#: modules/volume/volume_extract.c:505 modules/volume/volume_linestat.c:422
+#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:368
+#: modules/process/deposit_synth.c:642 modules/process/edge.c:705
+#: modules/process/fft_filter_1d.c:301 modules/process/grain_edge.c:277
+#: modules/process/grain_filter.c:346 modules/process/grain_mark.c:357
+#: modules/process/mark_with.c:322 modules/process/mfm_field.c:420
+#: modules/process/mfm_shift.c:216 modules/process/polydistort.c:319
+#: modules/process/psf.c:309 modules/process/scars.c:421
+#: modules/process/slope_dist.c:400 modules/process/synth.h:542
+#: modules/volume/volume_extract.c:411 modules/volume/volume_extract.c:491
+#: modules/volume/volume_linestat.c:427
 msgid "I_nstant updates"
 msgstr "_Aggiornamento immediato"
 
@@ -8017,27 +8323,27 @@ msgstr "Errore: fuori intervallo."
 msgid "Building mesh..."
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1818
+#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1867
 msgid "X correction"
 msgstr "correzione X:"
 
-#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1819
+#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1868
 msgid "Y correction"
 msgstr "correzione Y:"
 
-#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1820
+#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1869
 msgid "Z correction"
 msgstr "correzione Z:"
 
-#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1821
+#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1870
 msgid "X uncertainty"
 msgstr "Incertezza X"
 
-#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1822
+#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1871
 msgid "Y uncertainty"
 msgstr "Incertezza Y"
 
-#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1823
+#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1872
 msgid "Z uncertainty"
 msgstr "Incertezza Z"
 
@@ -8065,79 +8371,80 @@ msgstr ""
 msgid "Delaunay"
 msgstr "Delaunay"
 
-#: modules/process/calibrate.c:180
+#: modules/process/calibrate.c:172
 msgid "Recalibrates scan lateral dimensions or value range."
 msgstr ""
 "Ricalibra le dimensioni o l'intervallo di valori delle scansioni laterali."
 
-#: modules/process/calibrate.c:194
+#: modules/process/calibrate.c:186
 msgid "/_Basic Operations/_Dimensions and Units..."
 msgstr "/Operazioni _Base/_Dimensioni e Unità.."
 
-#: modules/process/calibrate.c:198 modules/volume/volume_calibrate.c:193
+#: modules/process/calibrate.c:190 modules/volume/volume_calibrate.c:193
 msgid "Change physical dimensions, units or value scale"
 msgstr "Cambia dimensioni fisiche, unità o scala valore"
 
-#: modules/process/calibrate.c:357 modules/volume/volume_calibrate.c:355
+#: modules/process/calibrate.c:349 modules/volume/volume_calibrate.c:355
 msgid "Recalibrated Data"
 msgstr "Dati Ricalibrati"
 
-#: modules/process/calibrate.c:390
+#: modules/process/calibrate.c:382
 msgid "Dimensions and Units"
 msgstr "Dimensioni e Unità"
 
-#: modules/process/calibrate.c:411 modules/volume/volume_calibrate.c:389
+#: modules/process/calibrate.c:405 modules/volume/volume_calibrate.c:391
 msgid "New Real Dimensions"
 msgstr "Nuove Dimensioni Reali"
 
-#: modules/process/calibrate.c:417
+#: modules/process/calibrate.c:415
 msgid "_Match pixel size:"
 msgstr "Accoppia dimensione pixel:"
 
-#: modules/process/calibrate.c:444 modules/volume/volume_calibrate.c:394
+#: modules/process/calibrate.c:447 modules/volume/volume_calibrate.c:397
 msgid "_X range:"
 msgstr "Intervallo _X:"
 
-#: modules/process/calibrate.c:473 modules/volume/volume_calibrate.c:421
+#: modules/process/calibrate.c:467 modules/volume/volume_calibrate.c:417
 msgid "_Y range:"
 msgstr "Intervallo _Y:"
 
-#: modules/process/calibrate.c:489
+#: modules/process/calibrate.c:472
 msgid "_Square samples"
 msgstr "Campioni quadrati"
 
-#: modules/process/calibrate.c:524 modules/volume/volume_calibrate.c:521
+#: modules/process/calibrate.c:496 modules/volume/volume_calibrate.c:480
 msgid "Value Range"
 msgstr "Intervallo Valore"
 
-#: modules/process/calibrate.c:529 modules/volume/volume_calibrate.c:448
+#: modules/process/calibrate.c:502 modules/volume/volume_calibrate.c:437
 msgid "_Z range:"
 msgstr "Intervallo _Z:"
 
-#: modules/process/calibrate.c:558
+#: modules/process/calibrate.c:524
 msgid "Z shi_ft:"
 msgstr "Z shi_ft:"
 
-#: modules/process/calibrate.c:573 modules/volume/volume_calibrate.c:570
+#: modules/process/calibrate.c:533 modules/volume/volume_calibrate.c:515
 msgid "Calibration Coefficients"
 msgstr "Coefficienti di Calibrazione"
 
-#: modules/process/calibrate.c:580 modules/volume/volume_calibrate.c:577
+#: modules/process/calibrate.c:538 modules/volume/volume_calibrate.c:520
 msgid "_X calibration factor:"
 msgstr "Fattore di calibrazione _X:"
 
-#: modules/process/calibrate.c:590 modules/volume/volume_calibrate.c:585
+#: modules/process/calibrate.c:545 modules/volume/volume_calibrate.c:527
 msgid "_Y calibration factor:"
 msgstr "Fattore di calibrazione _Y:"
 
-#: modules/process/calibrate.c:600 modules/volume/volume_calibrate.c:593
+#: modules/process/calibrate.c:552 modules/volume/volume_calibrate.c:534
 msgid "_Z calibration factor:"
 msgstr "Fattore di calibrazione _Z:"
 
-#: modules/process/calibrate.c:613 modules/process/extend.c:293
-#: modules/tools/crop.c:213
-msgid "Create new channel"
-msgstr "Crea nuovo canale"
+#: modules/process/calibrate.c:567 modules/process/drift.c:389
+#: modules/process/extend.c:293 modules/tools/crop.c:213
+#, fuzzy
+msgid "Create new image"
+msgstr "Crea nuovo oggetto"
 
 #: modules/process/coerce.c:159
 msgid "Transforms surfaces to have prescribed statistical properties."
@@ -8156,13 +8463,13 @@ msgid "Coerced"
 msgstr "Forzata"
 
 #: modules/process/coerce.c:225 modules/process/coerce.c:326
-#: modules/process/fbm_synth.c:475 modules/process/lno_synth.c:256
-#: modules/process/noise_synth.c:183
+#: modules/process/fbm_synth.c:474 modules/process/lno_synth.c:254
+#: modules/process/noise_synth.c:181
 msgid "distribution|Uniform"
 msgstr "distribuzione|Uniforme"
 
-#: modules/process/coerce.c:226 modules/process/fbm_synth.c:476
-#: modules/process/lno_synth.c:246 modules/process/noise_synth.c:173
+#: modules/process/coerce.c:226 modules/process/fbm_synth.c:475
+#: modules/process/lno_synth.c:244 modules/process/noise_synth.c:171
 msgid "distribution|Gaussian"
 msgstr "distribuzione|Gaussiana"
 
@@ -8211,12 +8518,12 @@ msgid "Number of maxima"
 msgstr "Numero massimi"
 
 #: modules/process/col_synth.c:173 modules/tools/linestats.c:178
-#: modules/volume/volume_linestat.c:154
+#: modules/volume/volume_linestat.c:156
 msgid "Skew"
 msgstr "Skew"
 
 #: modules/process/col_synth.c:174 modules/tools/linestats.c:179
-#: modules/tools/roughness.c:386 modules/volume/volume_linestat.c:155
+#: modules/tools/roughness.c:387 modules/volume/volume_linestat.c:157
 msgid "Kurtosis"
 msgstr "curtosi"
 
@@ -8230,7 +8537,8 @@ msgid "Generates columnar surfaces by a simple growth algorithm."
 msgstr "Genera superfici colonnari con un semplice algoritmo di crescita."
 
 #: modules/process/col_synth.c:208
-msgid "/S_ynthetic/_Columnar..."
+#, fuzzy
+msgid "/S_ynthetic/_Deposition/_Columnar..."
 msgstr "/Sintetico/_Colonnare..."
 
 #: modules/process/col_synth.c:212
@@ -8253,7 +8561,7 @@ msgstr "Incidenza"
 msgid "Inclination"
 msgstr "Inclinazione"
 
-#: modules/process/col_synth.c:509 modules/process/crosscor.c:1063
+#: modules/process/col_synth.c:509 modules/process/crosscor.c:1036
 msgid "Direction"
 msgstr "Direzione"
 
@@ -8261,15 +8569,15 @@ msgstr "Direzione"
 msgid "Relaxation type:"
 msgstr "Tipo di rilassamento:"
 
-#: modules/process/col_synth.c:528
+#: modules/process/col_synth.c:529
 msgid "_Melting:"
 msgstr "Fusione:"
 
-#: modules/process/col_synth.c:612
+#: modules/process/col_synth.c:613
 msgid "Weak"
 msgstr "Debole"
 
-#: modules/process/col_synth.c:613
+#: modules/process/col_synth.c:614
 msgid "Strong"
 msgstr "Forte"
 
@@ -8301,8 +8609,8 @@ msgstr "Filtro di convoluzione generale"
 msgid "Convolution Filter"
 msgstr "Filtro di Convoluzione"
 
-#: modules/process/convolution_filter.c:269 modules/tools/filter.c:170
-#: modules/tools/filter.c:274
+#: modules/process/convolution_filter.c:269 modules/tools/filter.c:171
+#: modules/tools/filter.c:275
 msgid "Filter"
 msgstr "Filtro"
 
@@ -8330,7 +8638,7 @@ msgstr "HSym"
 msgid "VSym"
 msgstr "VSym"
 
-#: modules/process/correct_affine.c:231
+#: modules/process/correct_affine.c:220
 msgid ""
 "Corrects affine distortion of images by matching image Bravais lattice to "
 "the true one."
@@ -8338,101 +8646,110 @@ msgstr ""
 "Correzione distorsione affine di immagini per accoppiamento immagine "
 "reticolo di Bravais con quello reale"
 
-#: modules/process/correct_affine.c:246
+#: modules/process/correct_affine.c:235
 msgid "/_Distortion/_Affine..."
 msgstr "/_Distorsione/_Affinaa..."
 
-#: modules/process/correct_affine.c:250
+#: modules/process/correct_affine.c:239
 msgid "Correct affine distortion"
 msgstr "Correzione distorsione affine"
 
-#: modules/process/correct_affine.c:298
+#: modules/process/correct_affine.c:309 modules/process/correct_affine.c:634
+msgid "Corrected"
+msgstr "Corretto"
+
+#: modules/process/correct_affine.c:343
 msgid "Affine Correction"
 msgstr "Correzione affine"
 
-#: modules/process/correct_affine.c:351 modules/process/fft_filter_2d.c:530
+#: modules/process/correct_affine.c:349 modules/process/measure_lattice.c:249
+msgid "_Refine"
+msgstr "_Raffina"
+
+#: modules/process/correct_affine.c:399 modules/process/fft_filter_2d.c:530
 msgid "Preview Options"
 msgstr "Anteprima Opzioni"
 
-#: modules/process/correct_affine.c:356 modules/process/fft_filter_2d.c:535
-#: modules/process/measure_lattice.c:321
+#: modules/process/correct_affine.c:404 modules/process/fft_filter_2d.c:535
+#: modules/process/measure_lattice.c:311
 msgid "Display:"
 msgstr "Mostra:"
 
-#: modules/process/correct_affine.c:364 modules/process/measure_lattice.c:329
+#: modules/process/correct_affine.c:412 modules/process/measure_lattice.c:319
 #: modules/tools/grainremover.c:109
 msgid "_Data"
 msgstr "_Dati"
 
-#: modules/process/correct_affine.c:365
+#: modules/process/correct_affine.c:413
 msgid "2D _ACF"
 msgstr "2D _ACF"
 
-#: modules/process/correct_affine.c:366 modules/process/drift.c:365
+#: modules/process/correct_affine.c:414 modules/process/drift.c:364
 msgid "Correc_ted data"
 msgstr "Dati Corretti"
 
-#: modules/process/correct_affine.c:377
+#: modules/process/correct_affine.c:425
 msgid "ACF zoom:"
 msgstr "ACF zoom:"
 
-#: modules/process/correct_affine.c:394 modules/process/measure_lattice.c:372
+#: modules/process/correct_affine.c:442 modules/process/measure_lattice.c:346
+#, fuzzy
+msgid "Interpolate _horizontal ACF"
+msgstr "Interpolazione"
+
+#: modules/process/correct_affine.c:452 modules/process/measure_lattice.c:372
 msgid "Lattice Vectors"
 msgstr "Vettori del reticolo"
 
 #. TRANSLATORS: Correct is an adjective here.
-#: modules/process/correct_affine.c:419
+#: modules/process/correct_affine.c:469
 msgid "Correct Lattice"
 msgstr "Reticolo corretto"
 
-#: modules/process/correct_affine.c:423
+#: modules/process/correct_affine.c:473
 msgid "_Lattice type:"
 msgstr "Tipo _reticolo:"
 
-#: modules/process/correct_affine.c:430
+#: modules/process/correct_affine.c:480
 msgid "User defined"
 msgstr "Definito dall'utente"
 
-#: modules/process/correct_affine.c:445
+#: modules/process/correct_affine.c:495
 msgid "_Different lengths"
 msgstr "_Differenti lunghezze"
 
-#: modules/process/correct_affine.c:474
+#: modules/process/correct_affine.c:524
 msgid "Image for _ACF:"
 msgstr "Immagine per _ACF:"
 
-#: modules/process/correct_affine.c:501
+#: modules/process/correct_affine.c:551
 msgid "_Scaling:"
 msgstr "Ridimensionamento:"
 
-#: modules/process/correct_affine.c:508
+#: modules/process/correct_affine.c:558
 msgid "Exactly as specified"
 msgstr "Esattamente come specificato"
 
-#: modules/process/correct_affine.c:509
+#: modules/process/correct_affine.c:560
 msgid "Preserve area"
 msgstr "Mantiene area"
 
-#: modules/process/correct_affine.c:510
+#: modules/process/correct_affine.c:562
 msgid "Preserve X scale"
 msgstr "Mantieni scala X"
 
-#: modules/process/correct_affine.c:561
-msgid "Corrected"
-msgstr "Corretto"
+#: modules/process/correct_affine.c:571 modules/process/drift.c:379
+msgid "_Apply to all compatible images"
+msgstr ""
 
-#: modules/process/correct_affine.c:617 modules/process/measure_lattice.c:489
+#: modules/process/correct_affine.c:693 modules/process/measure_lattice.c:482
 msgid "length"
 msgstr "lunghezza"
 
-#: modules/process/correct_affine.c:624 modules/process/measure_lattice.c:496
+#: modules/process/correct_affine.c:700 modules/process/measure_lattice.c:489
 msgid "angle"
 msgstr "angolo"
 
-#: modules/process/correct_affine.c:717
-msgid "Re_fine"
-msgstr "Raf_fina"
-
 #: modules/process/crosscor.c:157
 msgid "Calculates cross-correlation of two data fields."
 msgstr "Calcola correlazione incrociata di due campi dati."
@@ -8457,150 +8774,153 @@ msgstr "Co_rrela con:"
 msgid "Search size"
 msgstr "Ricerca Dimensioni"
 
-#: modules/process/crosscor.c:272
-msgid "Global offset of 2nd channel"
-msgstr "Offset globale del 2° canale"
-
-#: modules/process/crosscor.c:277
+#: modules/process/crosscor.c:267
 msgid "_Guess"
 msgstr ""
 
-#: modules/process/crosscor.c:311
+#: modules/process/crosscor.c:268
+msgid "Global offset of 2nd channel"
+msgstr "Offset globale del 2° canale"
+
+#: modules/process/crosscor.c:292
 msgid "Window size"
 msgstr "Dimensioni finestra"
 
-#: modules/process/crosscor.c:319
+#: modules/process/crosscor.c:300
 msgid "W_idth:"
 msgstr "Larghezza:"
 
-#: modules/process/crosscor.c:329
+#: modules/process/crosscor.c:308
 msgid "Hei_ght:"
 msgstr "Altezza:"
 
-#: modules/process/crosscor.c:342 modules/process/fft.c:405
+#: modules/process/crosscor.c:319 modules/process/fft.c:403
 #: modules/process/psdf_logphi.c:268
 msgid "_Windowing type:"
 msgstr "Tipo finestra:"
 
-#: modules/process/crosscor.c:350
+#: modules/process/crosscor.c:327
 msgid "All"
 msgstr "Tutto"
 
-#: modules/process/crosscor.c:351
+#: modules/process/crosscor.c:328
 msgid "Absolute"
 msgstr "Assoluto"
 
-#: modules/process/crosscor.c:352
+#: modules/process/crosscor.c:329
 msgid "X Distance"
 msgstr "Distanza X"
 
-#: modules/process/crosscor.c:353
+#: modules/process/crosscor.c:330
 msgid "Y Distance"
 msgstr "Distanza Y"
 
-#: modules/process/crosscor.c:355 modules/process/crosscor.c:1077
+#: modules/process/crosscor.c:332 modules/process/crosscor.c:1050
 msgid "Score"
 msgstr "Punteggio"
 
-#: modules/process/crosscor.c:357 modules/process/fft.c:395
-#: modules/process/fit-shape.c:688 modules/process/maskcor.c:176
+#: modules/process/crosscor.c:334 modules/process/fft.c:393
+#: modules/process/fit-shape.c:699 modules/process/maskcor.c:177
+#: modules/process/mfm_current.c:455 modules/process/mfm_field.c:373
+#: modules/process/mfm_parallel.c:466
 msgid "Output _type:"
 msgstr "Tipo Output:"
 
-#: modules/process/crosscor.c:363
+#: modules/process/crosscor.c:340
 msgid "Add _low score results mask"
 msgstr "Aggiungi maschera risultati a bassa incidenza"
 
-#: modules/process/crosscor.c:374 modules/process/grain_wshed.c:223
-#: modules/process/maskcor.c:188
+#: modules/process/crosscor.c:351 modules/process/grain_wshed.c:225
+#: modules/process/maskcor.c:191
 msgid "T_hreshold:"
 msgstr "Soglia:"
 
-#: modules/process/crosscor.c:381
+#: modules/process/crosscor.c:359
 msgid "Multichannel cross-corelation"
 msgstr "Correlazione Incrociata multicanale"
 
-#: modules/process/crosscor.c:400
+#: modules/process/crosscor.c:378
 msgid "Second _source data:"
 msgstr "Dati seconda sorgente"
 
-#: modules/process/crosscor.c:417
+#: modules/process/crosscor.c:394
 msgid "Correlate with:"
 msgstr "Correla con:"
 
-#: modules/process/crosscor.c:424
+#: modules/process/crosscor.c:402
 msgid "Postprocess:"
 msgstr "Post Elaborazione"
 
-#: modules/process/crosscor.c:431
-msgid "Apply Ga_ussian filter of width: "
+#: modules/process/crosscor.c:411
+#, fuzzy
+msgid "Apply Ga_ussian filter of width:"
 msgstr "Applicazione filtro larghezza Ga_ussiano:"
 
-#: modules/process/crosscor.c:451
+#: modules/process/crosscor.c:424
 msgid "Extend results to borders"
 msgstr "Estensione risultati ai margini"
 
-#: modules/process/crosscor.c:461
+#: modules/process/crosscor.c:433
 msgid "Create corrected data from 2nd channel"
 msgstr "Creazione dati corretti dal 2° canale"
 
-#: modules/process/crosscor.c:860
+#: modules/process/crosscor.c:833
 msgid "Correlating first set..."
 msgstr "Correlazione prima serie....."
 
-#: modules/process/crosscor.c:892
+#: modules/process/crosscor.c:865
 msgid "Correlating second set..."
 msgstr "Correlazione seconda serie....."
 
-#: modules/process/crosscor.c:999
+#: modules/process/crosscor.c:972
 msgid "Corrected 2nd channel"
 msgstr "2° canale corretto"
 
-#: modules/process/crosscor.c:1023
+#: modules/process/crosscor.c:996
 msgid "X difference"
 msgstr "Differenza X"
 
-#: modules/process/crosscor.c:1037
+#: modules/process/crosscor.c:1010
 msgid "Y difference"
 msgstr "Differenza Y"
 
-#: modules/process/crosscor.c:1050
+#: modules/process/crosscor.c:1023
 msgid "Absolute difference"
 msgstr "Differenza assoluta"
 
-#: modules/process/curvature.c:131
+#: modules/process/curvature.c:130
 msgid "Center value"
 msgstr "Calore centro"
 
-#: modules/process/curvature.c:132
+#: modules/process/curvature.c:131
 msgid "Curvature radius 1"
 msgstr "Raggio curvatura 1"
 
-#: modules/process/curvature.c:133
+#: modules/process/curvature.c:132
 msgid "Curvature radius 2"
 msgstr "Raggio curvatura 2"
 
-#: modules/process/curvature.c:134
+#: modules/process/curvature.c:133
 msgid "Direction 1"
 msgstr "Direzione 1"
 
-#: modules/process/curvature.c:135
+#: modules/process/curvature.c:134
 msgid "Direction 2"
 msgstr "Direzione 2"
 
-#: modules/process/curvature.c:163
+#: modules/process/curvature.c:162
 msgid "Calculates overall curvature."
 msgstr "Calcola curvatura globale"
 
-#: modules/process/curvature.c:177
+#: modules/process/curvature.c:176
 msgid "/_Level/_Curvature..."
 msgstr "/_Livella/_Curvatura"
 
-#: modules/process/curvature.c:181
+#: modules/process/curvature.c:180
 msgid "Calculate overall curvature"
 msgstr "Calcolo curvatura globale"
 
-#: modules/process/curvature.c:211 modules/process/facet-level.c:118
+#: modules/process/curvature.c:210 modules/process/facet-level.c:118
 #: modules/process/semsim.c:165
 #, c-format
 msgid "%s: Lateral dimensions and value must be the same physical quantity."
@@ -8608,47 +8928,47 @@ msgstr ""
 "%s: Le dimensioni laterali ed il valore devono rappresentare la stessa "
 "quantità fisica"
 
-#: modules/process/curvature.c:445
+#: modules/process/curvature.c:447
 msgid "Curvature Sections"
 msgstr "Sezioni Curvatura"
 
-#: modules/process/curvature.c:653
+#: modules/process/curvature.c:655
 msgid "Output Type"
 msgstr "Tipo Output"
 
-#: modules/process/curvature.c:660
+#: modules/process/curvature.c:662
 msgid "_Set selection"
 msgstr "Regola selezione"
 
-#: modules/process/curvature.c:670
+#: modules/process/curvature.c:672
 msgid "_Plot graph"
 msgstr "_Traccia grafico"
 
-#: modules/process/curvature.c:685 modules/process/drift.c:337
-#: modules/process/fft_profile.c:310 modules/process/fractal.c:328
-#: modules/process/grain_cross.c:253 modules/process/linematch.c:885
-#: modules/process/slope_dist.c:349 modules/tools/linestats.c:418
-#: modules/tools/profile.c:573 modules/tools/roughness.c:872
-#: modules/tools/sfunctions.c:486 modules/tools/spectro.c:382
-#: modules/volume/volume_slice.c:398
-msgid "Target _graph:"
-msgstr ""
-
-#: modules/process/curvature.c:691 modules/process/drift.c:343
-#: modules/process/fft_profile.c:316 modules/process/fractal.c:334
-#: modules/process/grain_cross.c:259 modules/process/linematch.c:892
-#: modules/process/slope_dist.c:355 modules/tools/linestats.c:424
-#: modules/tools/profile.c:579 modules/tools/roughness.c:878
-#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:388
-#: modules/volume/volume_slice.c:406
+#: modules/process/curvature.c:684 modules/process/drift.c:340
+#: modules/process/fft_profile.c:300 modules/process/fractal.c:308
+#: modules/process/grain_cross.c:260 modules/process/linematch.c:855
+#: modules/process/slope_dist.c:347 modules/tools/linestats.c:424
+#: modules/tools/profile.c:559 modules/tools/roughness.c:886
+#: modules/tools/sfunctions.c:488 modules/tools/spectro.c:391
+#: modules/volume/volume_slice.c:408
 msgid "New graph"
 msgstr "Nuovo grafico"
 
-#: modules/process/curvature.c:951
+#: modules/process/curvature.c:689 modules/process/drift.c:345
+#: modules/process/fft_profile.c:306 modules/process/fractal.c:313
+#: modules/process/grain_cross.c:254 modules/process/linematch.c:860
+#: modules/process/slope_dist.c:352 modules/tools/linestats.c:418
+#: modules/tools/profile.c:563 modules/tools/roughness.c:890
+#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:385
+#: modules/volume/volume_slice.c:400
+msgid "Target _graph:"
+msgstr ""
+
+#: modules/process/curvature.c:949
 msgid "Axes are outside the image."
 msgstr "Assi all'esterno dell'immagine"
 
-#: modules/process/curvature.c:1018
+#: modules/process/curvature.c:1016
 msgid "Save Curvature"
 msgstr "Salva Curvatura"
 
@@ -8672,8 +8992,8 @@ msgstr "CWT"
 msgid "2D CWT"
 msgstr "2D CWT"
 
-#: modules/process/cwt.c:158 modules/process/dwt.c:185
-#: modules/process/dwtanisotropy.c:209
+#: modules/process/cwt.c:159 modules/process/dwt.c:185
+#: modules/process/dwtanisotropy.c:212
 msgid "_Wavelet type:"
 msgstr "Tipo _Wavelet:"
 
@@ -8682,14 +9002,15 @@ msgid "Generates particles using simple dynamical model"
 msgstr "Genera particelle usando un semplice modello dinamico"
 
 #: modules/process/deposit_synth.c:184
-msgid "/S_ynthetic/_Particles..."
+#, fuzzy
+msgid "/S_ynthetic/_Deposition/_Particles..."
 msgstr "/Sintetico/_Particelle..."
 
 #: modules/process/deposit_synth.c:188
 msgid "Generate particles using dynamical model"
 msgstr "Generazione particelle usando modello dinamico"
 
-#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:867
+#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:866
 #, c-format
 msgid ""
 "Not all the particles could be deposited (%u),\n"
@@ -8698,73 +9019,69 @@ msgstr ""
 "Non è stato possibile depositare tutte le particelle (%u),\n"
 "prova più stadi"
 
-#: modules/process/deposit_synth.c:347
+#: modules/process/deposit_synth.c:348
 msgid "Particle Generation"
 msgstr "Generazione Particelle"
 
-#: modules/process/deposit_synth.c:427
+#: modules/process/deposit_synth.c:431
 msgid "Particle r_adius:"
 msgstr "Raggio particella:"
 
-#: modules/process/deposit_synth.c:438
+#: modules/process/deposit_synth.c:443
 msgid "Distribution _width:"
 msgstr "Larghezza Distribuzione:"
 
-#: modules/process/deposit_synth.c:449
-msgid "Surface _coverage:"
-msgstr "Superficie _copertura:"
-
-#: modules/process/deposit_synth.c:458
+#: modules/process/deposit_synth.c:462
 msgid "_Relax steps:"
 msgstr ""
 
-#: modules/process/deposit_synth.c:659 modules/process/synth.h:548
+#: modules/process/deposit_synth.c:660 modules/process/synth.h:577
 msgid "R_andom seed:"
 msgstr "Seme casuale:"
 
-#: modules/process/deposit_synth.c:665 modules/process/synth.h:554
+#: modules/process/deposit_synth.c:666 modules/process/synth.h:583
 msgid "seed|_New"
 msgstr "Seme|_Nuovo"
 
-#: modules/process/deposit_synth.c:676
+#: modules/process/deposit_synth.c:677
 msgid "Randomize"
 msgstr "Randomizza"
 
-#: modules/process/deposit_synth.c:860 modules/process/domain_synth.c:919
+#: modules/process/deposit_synth.c:859 modules/process/domain_synth.c:919
 msgid "Running computation..."
 msgstr "computo..."
 
-#: modules/process/deposit_synth.c:865
+#: modules/process/deposit_synth.c:864
 #, c-format
 msgid "%d particles were deposited"
 msgstr "%d particelle depositate"
 
-#: modules/process/deposit_synth.c:1093
+#: modules/process/deposit_synth.c:1092
 msgid "Initial particle set..."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1252
+#: modules/process/deposit_synth.c:1251
 msgid "Running revise..."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1380
+#: modules/process/deposit_synth.c:1379
 msgid "Error: too many particles."
 msgstr "Errore: troppe particelle."
 
-#: modules/process/deposit_synth.c:1382
+#: modules/process/deposit_synth.c:1381
 msgid "Error: no particles."
 msgstr "Errore: nessuna particella"
 
-#: modules/process/deposit_synth.c:1384
+#: modules/process/deposit_synth.c:1383
 msgid "Error: particles too large."
 msgstr "Errore: particelle troppo grandi."
 
-#: modules/process/deposit_synth.c:1386
+#: modules/process/deposit_synth.c:1385
 msgid "Error: particles too small."
 msgstr "Errore: particelle troppo piccole."
 
 #: modules/process/diff_synth.c:197 modules/tools/linestats.c:173
-#: modules/volume/volume_linestat.c:149
+#: modules/volume/volume_linestat.c:151
 msgid "Variation"
 msgstr "Variazione"
 
@@ -8777,7 +9094,8 @@ msgid "Generates surfaces by diffusion limited aggregation."
 msgstr "Generazione superfici mediante aggregazione limitata dalla diffusione"
 
 #: modules/process/diff_synth.c:228
-msgid "/S_ynthetic/_Diffusion..."
+#, fuzzy
+msgid "/S_ynthetic/_Deposition/_Diffusion..."
 msgstr "/Sintetico/_Diffusione..."
 
 #: modules/process/diff_synth.c:232
@@ -8792,44 +9110,48 @@ msgstr "Aggregazione Limitata dalla Diffusione"
 msgid "_Flux:"
 msgstr "_Flusso:"
 
-#: modules/process/diff_synth.c:522
+#: modules/process/diff_synth.c:521
 msgid "Probabilities"
 msgstr "Probabilità"
 
-#: modules/process/diff_synth.c:530
+#: modules/process/diff_synth.c:529
 msgid "_Sticking:"
 msgstr "Adesione:"
 
-#: modules/process/diff_synth.c:539
+#: modules/process/diff_synth.c:538
 msgid "_Activation:"
 msgstr "_Attivazione:"
 
-#: modules/process/diff_synth.c:548
+#: modules/process/diff_synth.c:547
 msgid "Passing Sch_woebel:"
 msgstr ""
 
-#: modules/process/dimensions.h:457
+#: modules/process/dimensions.h:439
 msgid "S_quare image"
 msgstr "Immagine _quadrata"
 
-#: modules/process/dimensions.h:489
+#: modules/process/dimensions.h:473
 msgid "_Dimension units:"
 msgstr "Unità _dimensioni:"
 
-#: modules/process/dimensions.h:502
-msgid "Current Channel"
+#: modules/process/dimensions.h:488
+#, fuzzy
+msgid "Current Image"
 msgstr "Canale Corrente"
 
-#: modules/process/dimensions.h:506
-msgid "_Take Dimensions from Current Channel"
+#: modules/process/dimensions.h:492
+#, fuzzy
+msgid "_Take Dimensions from Current Image"
 msgstr "Prendi dimensioni da Canale Corrente"
 
-#: modules/process/dimensions.h:514
-msgid "_Replace the current channel"
+#: modules/process/dimensions.h:501
+#, fuzzy
+msgid "_Replace the current image"
 msgstr "Sostituisci il canale corrente"
 
-#: modules/process/dimensions.h:523
-msgid "_Start from the current channel"
+#: modules/process/dimensions.h:510
+#, fuzzy
+msgid "_Start from the current image"
 msgstr "Inizia dal canale corrente"
 
 #: modules/process/domain_synth.c:158
@@ -8889,13 +9211,13 @@ msgid "_Monte Carlo time step:"
 msgstr ""
 
 #: modules/process/domain_synth.c:504 modules/process/fft_filter_2d.c:586
-#: modules/volume/volume_slice.c:364
+#: modules/volume/volume_slice.c:366
 msgid "Output Options"
 msgstr "Opzioni Output"
 
 #: modules/process/domain_synth.c:523 modules/process/fft_filter_2d.c:591
-#: modules/process/mask_edt.c:377 modules/process/slope_dist.c:323
-#: modules/volume/volume_linestat.c:432 modules/volume/volume_slice.c:384
+#: modules/process/mask_edt.c:211 modules/process/slope_dist.c:323
+#: modules/volume/volume_linestat.c:437 modules/volume/volume_slice.c:386
 msgid "Output type:"
 msgstr "Tipo Output: "
 
@@ -8923,57 +9245,49 @@ msgstr "Intervallo Ricerca:"
 msgid "rows"
 msgstr "righe"
 
-#: modules/process/drift.c:304
+#: modules/process/drift.c:305
 msgid "Correct _data"
 msgstr "Correzione Dati"
 
-#: modules/process/drift.c:314
+#: modules/process/drift.c:315
 msgid "_Exclude linear skew"
 msgstr "Escludi skew lineari"
 
-#: modules/process/drift.c:324
+#: modules/process/drift.c:325
 msgid "Plot drift _graph"
 msgstr "Grafico rappresentazione deriva"
 
-#: modules/process/drift.c:356 modules/process/fit-shape.c:693
-#: modules/process/neural.c:548 modules/process/polydistort.c:275
+#: modules/process/drift.c:355 modules/process/fit-shape.c:705
+#: modules/process/neural.c:552 modules/process/polydistort.c:278
 msgid "Preview:"
 msgstr "Anteprima"
 
-#: modules/process/drift.c:366
+#: modules/process/drift.c:365
 msgid "Drift _lines"
 msgstr "Linee deriva"
 
-#: modules/process/drift.c:374 modules/process/facet_analysis.c:407
-#: modules/process/grain_edge.c:285 modules/process/grain_filter.c:357
-#: modules/process/grain_mark.c:367 modules/process/grain_wshed.c:267
-#: modules/process/mark_disconn.c:310 modules/process/scars.c:381
+#: modules/process/drift.c:373 modules/process/facet_analysis.c:390
+#: modules/process/grain_edge.c:272 modules/process/grain_filter.c:356
+#: modules/process/grain_mark.c:341 modules/process/grain_wshed.c:271
+#: modules/process/mark_disconn.c:298 modules/process/scars.c:405
 #: modules/process/wpour_mark.c:369
 msgid "_Mask color:"
 msgstr "Colore _Maschera:"
 
-#: modules/process/drift.c:379
-msgid "Distribute"
-msgstr "Distribuisci"
-
-#: modules/process/drift.c:388
-msgid "Replace"
-msgstr "Sostituire"
-
-#: modules/process/drift.c:569
+#: modules/process/drift.c:570
 msgid "Drift-corrected"
 msgstr "Corretti per la deriva"
 
-#: modules/process/drift.c:613
+#: modules/process/drift.c:614
 msgid "Drift"
 msgstr "Deriva"
 
-#: modules/process/drift.c:614 modules/xyz/xyz_drift.c:392
+#: modules/process/drift.c:615 modules/xyz/xyz_drift.c:392
 #: modules/xyz/xyz_drift.c:411 modules/xyz/xyz_drift.c:430
 msgid "drift"
 msgstr "Deriva"
 
-#: modules/process/drift.c:620 modules/xyz/xyz_drift.c:402
+#: modules/process/drift.c:621 modules/xyz/xyz_drift.c:402
 msgid "x-axis drift"
 msgstr "Deriva sull'asse X"
 
@@ -9032,11 +9346,11 @@ msgstr "DWT Anisotropa"
 msgid "2D DWT Anisotropy"
 msgstr "2D DWT Anisotropa"
 
-#: modules/process/dwtanisotropy.c:214
+#: modules/process/dwtanisotropy.c:218
 msgid "X/Y ratio threshold:"
 msgstr "X/Y rapporto soglia:"
 
-#: modules/process/dwtanisotropy.c:222
+#: modules/process/dwtanisotropy.c:226
 msgid "Low level exclude limit:"
 msgstr "Limite di esclusione inferiore:"
 
@@ -9165,7 +9479,7 @@ msgstr "Determinazione Step Zero Crossing"
 msgid "_Gaussian FWHM:"
 msgstr "Gaussian FWHM:"
 
-#: modules/process/edge.c:681 modules/process/mark_disconn.c:271
+#: modules/process/edge.c:681 modules/process/mark_disconn.c:272
 msgid "_Threshold:"
 msgstr "Soglia"
 
@@ -9230,11 +9544,11 @@ msgstr "Entropia:"
 msgid "Entropy deficit:"
 msgstr ""
 
-#: modules/process/entropy.c:567
+#: modules/process/entropy.c:568
 msgid "Entropy at scales"
 msgstr ""
 
-#: modules/process/entropy.c:586
+#: modules/process/entropy.c:587
 msgid "Best estimate"
 msgstr "Miglior stima"
 
@@ -9282,23 +9596,23 @@ msgstr "Destra:"
 msgid "Extend _symetrically"
 msgstr "Estendi in modo simmetrico"
 
-#: modules/process/extend.c:268 modules/process/polydistort.c:256
-#: modules/xyz/xyz_raster.c:658
+#: modules/process/extend.c:268 modules/process/polydistort.c:259
+#: modules/xyz/xyz_raster.c:627
 msgid "exterior|Border"
 msgstr "esterno|Margine"
 
-#: modules/process/extend.c:270 modules/process/polydistort.c:258
-#: modules/xyz/xyz_raster.c:660
+#: modules/process/extend.c:270 modules/process/polydistort.c:261
+#: modules/xyz/xyz_raster.c:629
 msgid "exterior|Mirror"
 msgstr "esterno|Specchio"
 
-#: modules/process/extend.c:272 modules/process/polydistort.c:260
-#: modules/xyz/xyz_raster.c:662
+#: modules/process/extend.c:272 modules/process/polydistort.c:263
+#: modules/xyz/xyz_raster.c:631
 msgid "exterior|Periodic"
 msgstr "esteriore|Periodico"
 
-#: modules/process/extend.c:275 modules/process/polydistort.c:263
-#: modules/xyz/xyz_raster.c:650
+#: modules/process/extend.c:275 modules/process/polydistort.c:266
+#: modules/xyz/xyz_raster.c:619
 msgid "_Exterior type:"
 msgstr "Tipo _Esteriore:"
 
@@ -9330,11 +9644,11 @@ msgstr "Numero punti percorso:"
 msgid "There is no path selection."
 msgstr "Non vi è stata selezione percorso"
 
-#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:390
+#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:383
 msgid "X position"
 msgstr "Posizione X "
 
-#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:397
+#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:389
 msgid "Y position"
 msgstr "Posizione Y"
 
@@ -9347,7 +9661,7 @@ msgid "Y tangent"
 msgstr "tangente Y"
 
 #: modules/process/extract_path.c:392 modules/process/extract_path.c:404
-#: modules/process/pat_synth.c:1432 modules/tools/distance.c:146
+#: modules/process/pat_synth.c:1433 modules/tools/distance.c:146
 msgid "Distance"
 msgstr "Distanza"
 
@@ -9391,47 +9705,36 @@ msgstr "/_Statistica/Facet _Analisi..."
 msgid "Mark areas by 2D slope"
 msgstr "Segna aree per pendenza 2D"
 
-#: modules/process/facet_analysis.c:266
+#: modules/process/facet_analysis.c:270
 msgid "Mark Facets"
 msgstr "Segna Facce"
 
-#: modules/process/facet_analysis.c:269
+#: modules/process/facet_analysis.c:273
 msgid "verb|_Mark"
 msgstr "Segna"
 
 #. TRANSLATORS: The direction or line orthogonal to something.
-#: modules/process/facet_analysis.c:325
+#: modules/process/facet_analysis.c:329
 msgid "Normal"
 msgstr "Normale"
 
-#: modules/process/facet_analysis.c:333
+#: modules/process/facet_analysis.c:337
 msgid "_Find Maximum"
 msgstr "_Trova Massimo"
 
-#: modules/process/facet_analysis.c:341
+#: modules/process/facet_analysis.c:345
 msgid "Mean Normal"
 msgstr "Media Normale"
 
-#: modules/process/facet_analysis.c:350
+#: modules/process/facet_analysis.c:362
 msgid "Facet plane size:"
 msgstr "Dimensioni piano Facet"
 
-#: modules/process/facet_analysis.c:375
+#: modules/process/facet_analysis.c:370
 msgid "_Tolerance:"
 msgstr "_Tolleranza:"
 
-#: modules/process/facet_analysis.c:384 modules/process/grain_edge.c:262
-#: modules/process/grain_mark.c:344 modules/process/mark_disconn.c:286
-msgid "Com_bine with existing mask"
-msgstr "Unisci a maschera esistente"
-
-#: modules/process/facet_analysis.c:398 modules/process/grain_edge.c:276
-#: modules/process/grain_mark.c:358 modules/process/mark_disconn.c:301
-#: modules/process/mark_with.c:230 modules/process/mask_morph.c:210
-msgid "Operation:"
-msgstr "Operazione:"
-
-#: modules/process/facet_analysis.c:415
+#: modules/process/facet_analysis.c:398
 msgid ""
 "Warning: Lateral and value units differ. Angles are not physically "
 "meaningful."
@@ -9463,8 +9766,8 @@ msgstr "_Hurst exponent:"
 msgid "_Stationarity scale:"
 msgstr "Scala di _Stazionarietà:"
 
-#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:509
-#: modules/process/noise_synth.c:409
+#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:507
+#: modules/process/noise_synth.c:407
 msgid "_Distribution:"
 msgstr "_Distribuzione"
 
@@ -9472,17 +9775,17 @@ msgstr "_Distribuzione"
 msgid "Po_wer:"
 msgstr "Po_tenza:"
 
-#: modules/process/fbm_synth.c:408 modules/process/fft_synth.c:414
-#: modules/process/lno_synth.c:533 modules/process/noise_synth.c:433
+#: modules/process/fbm_synth.c:407 modules/process/fft_synth.c:414
+#: modules/process/lno_synth.c:531 modules/process/noise_synth.c:431
 msgid "_RMS:"
 msgstr "_RMS:"
 
-#: modules/process/fbm_synth.c:477 modules/process/lno_synth.c:251
-#: modules/process/noise_synth.c:178
+#: modules/process/fbm_synth.c:476 modules/process/lno_synth.c:249
+#: modules/process/noise_synth.c:176
 msgid "distribution|Exponential"
 msgstr "distribuzione|Esponenziale"
 
-#: modules/process/fbm_synth.c:478
+#: modules/process/fbm_synth.c:477
 msgid "distribution|Power"
 msgstr "distribuzione|Potenza"
 
@@ -9534,7 +9837,7 @@ msgstr "Immaginario"
 msgid "Modulus"
 msgstr "Modulo"
 
-#: modules/process/fft.c:327 modules/process/wave_synth.c:583
+#: modules/process/fft.c:327 modules/process/wave_synth.c:618
 msgid "Phase"
 msgstr "Fase"
 
@@ -9550,63 +9853,63 @@ msgstr "Trasformazione Ra_w"
 msgid "I_maginary part:"
 msgstr "Parte i_mmaginaria:"
 
-#: modules/process/fft.c:382
+#: modules/process/fft.c:380
 msgid "_Inverse transform"
 msgstr "Trasformata _Inversa"
 
-#: modules/process/fft.c:411
+#: modules/process/fft.c:409
 msgid "Subtract mean _value beforehand"
 msgstr "Sottrazione preliminare valore medio "
 
-#: modules/process/fft.c:422
+#: modules/process/fft.c:420
 msgid "_Preserve RMS"
 msgstr "_Preserva RMS"
 
-#: modules/process/fft_filter_1d.c:117
+#: modules/process/fft_filter_1d.c:118
 msgid "FFT filtering"
 msgstr "Filtra con FFT"
 
-#: modules/process/fft_filter_1d.c:131
+#: modules/process/fft_filter_1d.c:132
 msgid "/_Correct Data/1D _FFT Filtering..."
 msgstr "/_Correzione Dati/Filtro 1D _FFT..."
 
-#: modules/process/fft_filter_1d.c:135
+#: modules/process/fft_filter_1d.c:136
 msgid "1D FFT Filtering"
 msgstr "Filtro 1D FFT"
 
-#: modules/process/fft_filter_1d.c:165 modules/process/wpour_mark.c:391
+#: modules/process/fft_filter_1d.c:166 modules/process/wpour_mark.c:391
 msgid "Marked"
 msgstr "Segnato"
 
-#: modules/process/fft_filter_1d.c:166
+#: modules/process/fft_filter_1d.c:167
 msgid "Unmarked"
 msgstr "Non segnato"
 
-#: modules/process/fft_filter_1d.c:169
+#: modules/process/fft_filter_1d.c:170
 msgid "Null"
 msgstr "Nullo"
 
-#: modules/process/fft_filter_1d.c:170
+#: modules/process/fft_filter_1d.c:171
 msgid "Suppress"
 msgstr "Elimina"
 
-#: modules/process/fft_filter_1d.c:180
+#: modules/process/fft_filter_1d.c:181
 msgid "1D FFT filter"
 msgstr "Filtro 1D FFT"
 
-#: modules/process/fft_filter_1d.c:269 modules/process/linematch.c:861
+#: modules/process/fft_filter_1d.c:271 modules/process/linematch.c:828
 msgid "_Direction:"
 msgstr "_Direzione:"
 
-#: modules/process/fft_filter_1d.c:277
+#: modules/process/fft_filter_1d.c:279
 msgid "_Suppress type:"
 msgstr "Tipo eliminazione:"
 
-#: modules/process/fft_filter_1d.c:285
+#: modules/process/fft_filter_1d.c:287
 msgid "_Filter type:"
 msgstr "_Tipo Filtro:"
 
-#: modules/process/fft_filter_1d.c:513
+#: modules/process/fft_filter_1d.c:515
 msgid "1D FFT Filtered Data"
 msgstr "Dati filtrati 1D FFT"
 
@@ -9626,9 +9929,10 @@ msgstr "Filtro FFT bidimensionale"
 msgid "Filtered Data"
 msgstr "Dati filtrati"
 
-#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:594
-#: modules/process/fit-shape.c:643 modules/process/fit-shape.c:658
-#: modules/process/fit-shape.c:662 modules/process/neural.c:560
+#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:604
+#: modules/process/fit-shape.c:653 modules/process/fit-shape.c:668
+#: modules/process/fit-shape.c:672 modules/process/neural.c:564
+#: modules/process/psf.c:232
 msgid "Difference"
 msgstr "Differenza"
 
@@ -9684,7 +9988,7 @@ msgstr "Maschera Filtro"
 msgid "_Undo"
 msgstr "_Annulla"
 
-#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:556
+#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:562
 msgid "_Fill"
 msgstr "_Riempimento"
 
@@ -9692,7 +9996,7 @@ msgstr "_Riempimento"
 msgid "_Snap to origin"
 msgstr ""
 
-#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:339
+#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:329
 msgid "Zoom:"
 msgstr "Ingrandisci:"
 
@@ -9728,39 +10032,40 @@ msgstr "Riempie intera maschera filtro "
 msgid "Force shapes to center around the origin"
 msgstr "Forza le figure a centrarsi attorno all'origine"
 
-#: modules/process/fft_profile.c:125
+#: modules/process/fft_profile.c:124
 msgid ""
 "Reads radial sections of two-dimensional power spectrum density function."
 msgstr ""
 "Legge sezioni radiali della funzione di densità di potenza di spettro "
 "bidimensionale"
 
-#: modules/process/fft_profile.c:140
+#: modules/process/fft_profile.c:139
 msgid "/_Statistics/_PSDF Section..."
 msgstr "/_Statistica/Sezione _PSDF..."
 
-#: modules/process/fft_profile.c:144
+#: modules/process/fft_profile.c:143
 msgid "Read radial PSDF sections"
 msgstr "Lettura sezioni PSDF radiali"
 
-#: modules/process/fft_profile.c:190
+#: modules/process/fft_profile.c:189
 msgid "Radial PSDF Section"
 msgstr "Sezione radiale PSDF"
 
-#: modules/process/fft_profile.c:237
+#: modules/process/fft_profile.c:236
 msgid "PSDF Section"
 msgstr "Sezione PSDF"
 
-#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:336
-#: modules/tools/profile.c:517 modules/tools/sfunctions.c:443
-msgid "_Fix res.:"
-msgstr "_Fix res.:"
+#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:338
+#: modules/tools/profile.c:514 modules/tools/sfunctions.c:454
+#, fuzzy
+msgid "_Fixed resolution:"
+msgstr "risoluzione _X:"
 
-#: modules/process/fft_profile.c:279
+#: modules/process/fft_profile.c:278
 msgid "_Separate curves"
 msgstr "Curve _Separate"
 
-#: modules/process/fft_profile.c:496
+#: modules/process/fft_profile.c:483
 #, c-format
 msgid "PSDF %.0f°"
 msgstr "PSDF %.0f°"
@@ -9781,11 +10086,15 @@ msgstr "Generazione superfici tramite sintesi spettrale"
 msgid "Spectral Synthesis"
 msgstr "Sintesi Spettrale"
 
-#: modules/process/fft_synth.c:429
+#: modules/process/fft_synth.c:430
 msgid "M_inimum frequency:"
 msgstr "Frequenza M_inima:"
 
-#: modules/process/fft_synth.c:449
+#: modules/process/fft_synth.c:430 modules/process/fft_synth.c:450
+msgid "px<sup>-1</sup>"
+msgstr ""
+
+#: modules/process/fft_synth.c:450
 msgid "Ma_ximum frequency:"
 msgstr "Frequenza _Massima:"
 
@@ -9805,85 +10114,164 @@ msgstr "Abilita moltiplicatore di _Lorentz"
 msgid "Enable _power multiplier"
 msgstr "Abilita moltiplicatore di _potenza"
 
-#: modules/process/fit-shape.c:270
+#: modules/process/fibre_synth.c:256
+msgid "Semi-circle"
+msgstr ""
+
+#: modules/process/fibre_synth.c:257
+#, fuzzy
+msgid "Triangle"
+msgstr "Triangolo vertice alto"
+
+#: modules/process/fibre_synth.c:258
+#, fuzzy
+msgid "Rectangle"
+msgstr "Rettangoli"
+
+#: modules/process/fibre_synth.c:260
+msgid "Quadratic spline"
+msgstr ""
+
+#: modules/process/fibre_synth.c:266
+#, fuzzy
+msgid "Generates surfaces composed from randomly placed fibers."
+msgstr "Generazione superficie di oggetti collocati casualmente"
+
+#: modules/process/fibre_synth.c:280
+#, fuzzy
+msgid "/S_ynthetic/_Deposition/_Fibers..."
+msgstr "/Sintetico/_Oggetti..."
+
+#: modules/process/fibre_synth.c:284
+#, fuzzy
+msgid "Generate surface of randomly placed fibers"
+msgstr "Generazione superficie di oggetti collocati casualmente"
+
+#: modules/process/fibre_synth.c:420
+#, fuzzy
+msgid "Random Fibers"
+msgstr "lineare casuale"
+
+#: modules/process/fibre_synth.c:494 modules/process/obj_synth.c:510
+msgid "_Shape:"
+msgstr "Figura:"
+
+#: modules/process/fibre_synth.c:513 modules/process/obj_synth.c:529
+msgid "obj."
+msgstr "obj."
+
+#: modules/process/fibre_synth.c:553
+#, fuzzy
+msgid "Scales _with width"
+msgstr "Scala con dimensioni"
+
+#: modules/process/fibre_synth.c:591 modules/process/synth.h:485
+msgid "Deformation"
+msgstr "Deformazione"
+
+#: modules/process/fibre_synth.c:600 modules/process/lno_synth.c:852
+#: modules/process/lno_synth.c:1222 modules/process/mask_noisify.c:177
+msgid "Densi_ty:"
+msgstr "Densi_tà:"
+
+#: modules/process/fibre_synth.c:607
+#, fuzzy
+msgid "_Lateral:"
+msgstr "Laterale"
+
+#: modules/process/fibre_synth.c:614
+#, fuzzy
+msgid "Le_ngthwise:"
+msgstr "_Lunghezza:"
+
+#: modules/process/fibre_synth.c:819
+msgid "Along fiber:"
+msgstr ""
+
+#: modules/process/fibre_synth.c:1180
+#, fuzzy
+msgid "Generating fibers..."
+msgstr "Lettura file..."
+
+#: modules/process/fit-shape.c:264
 msgid "Fits predefined geometrical shapes to data."
 msgstr "Adatta figure geometriche predefinite ai dati."
 
-#: modules/process/fit-shape.c:284
+#: modules/process/fit-shape.c:278
 msgid "/_Level/_Fit Shape..."
 msgstr "/_Livella/_Adatta Figura.."
 
-#: modules/process/fit-shape.c:288 modules/process/fit-shape.c:295
+#: modules/process/fit-shape.c:282 modules/process/fit-shape.c:289
 msgid "Fit geometrical shapes"
 msgstr "Adatta figure geometriche"
 
-#: modules/process/fit-shape.c:291
+#: modules/process/fit-shape.c:285
 msgid "/_Fit Shape..."
 msgstr "/Adatta Figura.."
 
-#: modules/process/fit-shape.c:390
+#: modules/process/fit-shape.c:389
 msgid "Fit Shape"
 msgstr "Adatta Figura"
 
-#: modules/process/fit-shape.c:395
+#: modules/process/fit-shape.c:396
 msgid "verb|_Quick Fit"
 msgstr "verbo|Adattamento rapido"
 
-#: modules/process/fit-shape.c:473 modules/process/fit-shape.c:2159
+#: modules/process/fit-shape.c:474 modules/process/fit-shape.c:2141
 msgid "Derived Quantities"
 msgstr "Quantità Derivate"
 
-#: modules/process/fit-shape.c:478 modules/process/fit-shape.c:2129
+#: modules/process/fit-shape.c:479 modules/process/fit-shape.c:2111
 msgid "Mean square difference:"
 msgstr "Differenza quadratica media"
 
-#: modules/process/fit-shape.c:580 modules/process/fit-shape.c:626
-#: modules/process/fit-shape.c:657 modules/process/fit-shape.c:661
+#: modules/process/fit-shape.c:590 modules/process/fit-shape.c:636
+#: modules/process/fit-shape.c:667 modules/process/fit-shape.c:671
 msgid "Fitted shape"
 msgstr "Figura adattata"
 
-#: modules/process/fit-shape.c:663 modules/process/mark_disconn.c:189
-#: modules/process/scars.c:281
+#: modules/process/fit-shape.c:673 modules/process/mark_disconn.c:189
+#: modules/process/scars.c:299
 msgid "Both"
 msgstr "Entrambe"
 
-#: modules/process/fit-shape.c:680
+#: modules/process/fit-shape.c:690 modules/process/psf-fit.c:308
 msgid "_Function type:"
 msgstr "Tipo _Funzione:"
 
-#: modules/process/fit-shape.c:708
+#: modules/process/fit-shape.c:720
 msgid "Show differences with _adapted color map"
 msgstr "Mostra differenze con mappa colore _adattata"
 
-#: modules/process/fit-shape.c:720
+#: modules/process/fit-shape.c:732
 msgid "Full fit is _geometric"
 msgstr ""
 
-#: modules/process/fit-shape.c:757
+#: modules/process/fit-shape.c:769
 msgid "Calculate differences for e_xcluded pixels"
 msgstr "Calcola differenze per pi_xels esclusi"
 
-#: modules/process/fit-shape.c:804
+#: modules/process/fit-shape.c:816
 msgid "_Recalculate Image"
 msgstr "_Ricalcola Immagine"
 
-#: modules/process/fit-shape.c:811
+#: modules/process/fit-shape.c:823
 msgid "Revert to _Previous Values"
 msgstr "Ritorna a Valori _Precedenti"
 
-#: modules/process/fit-shape.c:1850
+#: modules/process/fit-shape.c:1864
 msgid "Parameter estimation failed"
 msgstr "Stima parametri fallita."
 
-#: modules/process/fit-shape.c:1853
+#: modules/process/fit-shape.c:1867
 msgid "Fit failed"
 msgstr "Fit fallito"
 
-#: modules/process/fit-shape.c:1855
+#: modules/process/fit-shape.c:1869
 msgid "Fit was interruped"
 msgstr "Fit interrotto"
 
-#: modules/process/fit-shape.c:2115
+#: modules/process/fit-shape.c:2097
 msgid "(fixed)"
 msgstr ""
 
@@ -9903,35 +10291,35 @@ msgstr ""
 msgid "Polynomial leveling..."
 msgstr "Appianamento Polinomiale..."
 
-#: modules/process/fraccor.c:38
+#: modules/process/fraccor.c:39
 msgid "Removes data under mask using fractal interpolation."
 msgstr "Rimuove dati selezionati utilizzando interpolazione frattale"
 
-#: modules/process/fraccor.c:52
+#: modules/process/fraccor.c:53
 msgid "/_Correct Data/_Fractal Correction"
 msgstr "/_Correzione Dati/Correzione _Frattale"
 
-#: modules/process/fraccor.c:56
+#: modules/process/fraccor.c:57
 msgid "Interpolate data under mask with fractal interpolation"
 msgstr "Interpolazione dati maschera con interpolazione frattale"
 
-#: modules/process/fractal.c:134
+#: modules/process/fractal.c:130
 msgid "Partitioning"
 msgstr "Partizionamento"
 
-#: modules/process/fractal.c:135
+#: modules/process/fractal.c:131
 msgid "Cube counting"
 msgstr "Conteggio cubico"
 
-#: modules/process/fractal.c:136
+#: modules/process/fractal.c:132
 msgid "Triangulation"
 msgstr "Triangolazione"
 
-#: modules/process/fractal.c:137
+#: modules/process/fractal.c:133
 msgid "Power spectrum"
 msgstr "Spettro di potenza"
 
-#: modules/process/fractal.c:173
+#: modules/process/fractal.c:169
 msgid ""
 "Calculates fractal dimension using several methods (partitioning, box "
 "counting, triangulation, power spectrum)."
@@ -9939,54 +10327,50 @@ msgstr ""
 "Calcola dimensione frattale usando metodi differenti (partizionamento, box "
 "counting, triangolazione, potere spettrale)"
 
-#: modules/process/fractal.c:188
+#: modules/process/fractal.c:184
 msgid "/_Statistics/_Fractal Dimension..."
 msgstr "/_Statistica/Dimensioni _Frattali..."
 
-#: modules/process/fractal.c:192
+#: modules/process/fractal.c:188
 msgid "Calculate fractal dimension"
 msgstr "Calcola dimensione frattale"
 
-#: modules/process/fractal.c:227
+#: modules/process/fractal.c:223
 msgid "Fractal Dimension"
 msgstr "Dimensioni Frattali"
 
-#: modules/process/fractal.c:228
-msgid "Reco_mpute"
-msgstr "Ricalcola"
-
-#: modules/process/fractal.c:269
+#: modules/process/fractal.c:253
 msgid "_Method:"
 msgstr "_Metodo:"
 
-#: modules/process/fractal.c:290
+#: modules/process/fractal.c:269
 msgid "Fit Area"
 msgstr "Area di Fit"
 
-#: modules/process/fractal.c:295
-msgid "From:"
-msgstr "Da:"
-
-#: modules/process/fractal.c:295 modules/process/fractal.c:589
-#: modules/process/fractal.c:613
+#: modules/process/fractal.c:273 modules/process/fractal.c:545
+#: modules/process/fractal.c:569
 msgid "minimum"
 msgstr "minimo"
 
-#: modules/process/fractal.c:298
-msgid "To:"
-msgstr "A:"
+#: modules/process/fractal.c:274
+msgid "From:"
+msgstr "Da:"
 
-#: modules/process/fractal.c:298 modules/process/fractal.c:590
-#: modules/process/fractal.c:614
+#: modules/process/fractal.c:279 modules/process/fractal.c:546
+#: modules/process/fractal.c:570
 msgid "maximum"
 msgstr "massimo"
 
-#: modules/process/fractal.c:308 modules/process/mark_with.c:390
-#: modules/process/neural.c:559
+#: modules/process/fractal.c:280
+msgid "To:"
+msgstr "A:"
+
+#: modules/process/fractal.c:287 modules/process/mark_with.c:394
+#: modules/process/neural.c:563
 msgid "Result"
 msgstr "Risultati"
 
-#: modules/process/fractal.c:550
+#: modules/process/fractal.c:506
 msgid "Linear fit"
 msgstr "Fit lineare"
 
@@ -10058,11 +10442,11 @@ msgstr ""
 msgid "Grain Correlations"
 msgstr "Correlazione Grani"
 
-#: modules/process/grain_cross.c:240
+#: modules/process/grain_cross.c:241
 msgid "_Abscissa"
 msgstr "_Ascissa"
 
-#: modules/process/grain_cross.c:244
+#: modules/process/grain_cross.c:245
 msgid "O_rdinate"
 msgstr "O_ridinata"
 
@@ -10090,119 +10474,119 @@ msgstr "Disegna grafici"
 msgid "Grain Distributions"
 msgstr "Distribuzioni Grani"
 
-#: modules/process/grain_dist.c:553
+#: modules/process/grain_dist.c:547
 msgid "count"
 msgstr "conta"
 
-#: modules/process/grain_dist.c:617
+#: modules/process/grain_dist.c:611
 msgid "Export Raw Grain Values"
 msgstr "Esporta Valori Raw Grani"
 
-#: modules/process/grain_edge.c:100
+#: modules/process/grain_edge.c:99
 msgid "Marks grains by edge detection method."
 msgstr "Segna grani con metodo rivelazione soglia"
 
-#: modules/process/grain_edge.c:114
+#: modules/process/grain_edge.c:113
 msgid "/_Grains/Mark by _Edge Detection..."
 msgstr "/_Grani/Segna per Riv_elazione Soglia"
 
-#: modules/process/grain_edge.c:118
+#: modules/process/grain_edge.c:117
 msgid "Mark grains with edge detection mechanism"
 msgstr "Segna grani con meccanismo di determinazione bordo"
 
-#: modules/process/grain_edge.c:207
+#: modules/process/grain_edge.c:206
 msgid "Mark Grains by Edge Detection"
 msgstr "Segna Grani per Rivelazione Soglia"
 
-#: modules/process/grain_edge.c:245
+#: modules/process/grain_edge.c:244
 msgid "Threshold"
 msgstr "Soglia"
 
-#: modules/process/grain_edge.c:249
+#: modules/process/grain_edge.c:248
 msgid "_Laplacian:"
 msgstr "_Laplaciano:"
 
-#: modules/process/grain_filter.c:195
+#: modules/process/grain_filter.c:194
 msgid ""
 "Filters grains by their properties, using logical expressions and thresholds."
 msgstr ""
 "Filtra i grani per le loro proprietà usando espressioni logiche e soglie."
 
-#: modules/process/grain_filter.c:210
+#: modules/process/grain_filter.c:209
 msgid "/_Grains/_Filter..."
 msgstr "/_Grani/_Filtro.."
 
-#: modules/process/grain_filter.c:214
+#: modules/process/grain_filter.c:213
 msgid "Filter grains by their properties"
 msgstr "Filtra grani per proprietà"
 
-#: modules/process/grain_filter.c:254
+#: modules/process/grain_filter.c:253
 msgid "There are no grains to filter."
 msgstr "Non ci sono grani da filtrare"
 
-#: modules/process/grain_filter.c:310
+#: modules/process/grain_filter.c:309
 msgid "Filter Grains"
 msgstr "Filtro grani"
 
-#: modules/process/grain_filter.c:405
+#: modules/process/grain_filter.c:404
 msgid "Set selected as:"
 msgstr "Segna selezionati come:"
 
-#: modules/process/grain_filter.c:420
+#: modules/process/grain_filter.c:419
 msgid "Keep grains satisfying:"
 msgstr "Mantieni grani che soddisfano:"
 
-#: modules/process/grain_filter.c:434 modules/process/lat_synth.c:733
+#: modules/process/grain_filter.c:440 modules/process/lat_synth.c:733
 msgid "Lower threshold:"
 msgstr "Soglia inferiore:"
 
-#: modules/process/grain_filter.c:469 modules/process/lat_synth.c:740
+#: modules/process/grain_filter.c:467 modules/process/lat_synth.c:740
 msgid "Upper threshold:"
 msgstr "Soglia superiore:"
 
 #. TRANSLATORS: %c is replaced with quantity label A, B or C.
-#: modules/process/grain_filter.c:645
+#: modules/process/grain_filter.c:628
 #, c-format
 msgid "Condition %c: %s"
 msgstr "Stato %c: %s"
 
-#: modules/process/grain_mark.c:139
+#: modules/process/grain_mark.c:137
 msgid "Marks grains by thresholding (height, slope, curvature)."
 msgstr "Segna grani per soglia (altezza, pendenza, curvatura)"
 
-#: modules/process/grain_mark.c:153
+#: modules/process/grain_mark.c:151
 msgid "/_Grains/_Mark by Threshold..."
 msgstr "/_Grani/Segna per soglia"
 
-#: modules/process/grain_mark.c:157
+#: modules/process/grain_mark.c:155
 msgid "Mark grains by threshold"
 msgstr "Segna grani per soglia"
 
-#: modules/process/grain_mark.c:241
+#: modules/process/grain_mark.c:240
 msgid "Mark Grains by Threshold"
 msgstr "Segna Grani per Soglia"
 
-#: modules/process/grain_mark.c:281
+#: modules/process/grain_mark.c:280
 msgid "Threshold by"
 msgstr "Soglia:"
 
-#: modules/process/grain_mark.c:311
+#: modules/process/grain_mark.c:310
 msgid "_Slope:"
 msgstr "_Pendenza:"
 
-#: modules/process/grain_mark.c:315
+#: modules/process/grain_mark.c:314
 msgid "_Curvature:"
 msgstr "_Curvatura:"
 
-#: modules/process/grain_mark.c:324
-msgid "Criteria combination:"
-msgstr "Combinazione criteri:"
-
-#: modules/process/grain_mark.c:328 modules/process/grain_wshed.c:256
+#: modules/process/grain_mark.c:319 modules/process/grain_wshed.c:260
 #: modules/process/wpour_mark.c:358
 msgid "_Invert height"
 msgstr "_Inverti altezza"
 
+#: modules/process/grain_mark.c:328
+msgid "Criteria combination:"
+msgstr "Combinazione criteri:"
+
 #: modules/process/grain_stat.c:54
 msgid "Displays overall grain statistics."
 msgstr "Mostra statistiche complessive grani "
@@ -10279,417 +10663,427 @@ msgstr "Volume totale grani (laplaciano):"
 msgid "Total projected boundary length:"
 msgstr "Lunghezza contorno proiettato totale:"
 
-#: modules/process/grain_wshed.c:101
+#: modules/process/grain_wshed.c:102
 msgid "Marks grains by watershed algorithm."
 msgstr "Segna grani usando un algoritmo watershed"
 
-#: modules/process/grain_wshed.c:115
+#: modules/process/grain_wshed.c:116
 msgid "/_Grains/Mark by _Watershed..."
 msgstr "/_Grani/Segna per _Watershed..."
 
-#: modules/process/grain_wshed.c:119
+#: modules/process/grain_wshed.c:120
 msgid "Mark grains by watershed"
 msgstr "Segna grani per watershed"
 
-#: modules/process/grain_wshed.c:161
+#: modules/process/grain_wshed.c:162
 msgid "Mark Grains by Watershed"
 msgstr "Segna grani per Watershed"
 
-#: modules/process/grain_wshed.c:199
+#: modules/process/grain_wshed.c:200
 msgid "Grain Location"
 msgstr "Locazione Grani"
 
-#: modules/process/grain_wshed.c:214
+#: modules/process/grain_wshed.c:216
 msgid "_Drop size:"
 msgstr "_Dimensioni Goccia:"
 
-#: modules/process/grain_wshed.c:230
+#: modules/process/grain_wshed.c:233
 msgid "Segmentation"
 msgstr "Segmentazione"
 
-#: modules/process/grain_wshed.c:236
+#: modules/process/grain_wshed.c:239
 msgid "Num_ber of steps:"
 msgstr "Numero di step:"
 
-#: modules/process/grain_wshed.c:244
+#: modules/process/grain_wshed.c:248
 msgid "Dr_op size:"
 msgstr "Dimensioni Goccia:"
 
-#: modules/process/grain_wshed.c:435
+#: modules/process/grain_wshed.c:439
 msgid "Finding minima..."
 msgstr "Ricerca minimi..."
 
-#: modules/process/grain_wshed.c:437
+#: modules/process/grain_wshed.c:441
 msgid "Locating..."
 msgstr "Localizzando..."
 
-#: modules/process/grain_wshed.c:439
+#: modules/process/grain_wshed.c:443
 msgid "Simulating watershed..."
 msgstr "Simulazione linea separazione"
 
-#: modules/process/grain_wshed.c:441
+#: modules/process/grain_wshed.c:445
 msgid "Marking boundaries..."
 msgstr "Marcatura margini..."
 
-#: modules/process/hough.c:74
+#: modules/process/hough.c:76
 msgid "Hough transform."
 msgstr "Trasformata di Hough"
 
-#: modules/process/hough.c:88
+#: modules/process/hough.c:90
 msgid "/_Integral Transforms/_Hough..."
 msgstr "/_Trasformate Integrali/_Hough..."
 
-#: modules/process/hough.c:92
+#: modules/process/hough.c:94
 msgid "Compute Hough transform"
 msgstr "Calcola trasformata di Hough"
 
-#: modules/process/hough.c:178
+#: modules/process/hough.c:137
+#, fuzzy
+msgid "Hough line"
+msgstr "Rugosità"
+
+#: modules/process/hough.c:141
+#, c-format
+msgid "Hough circle r=%d"
+msgstr ""
+
+#: modules/process/hough.c:173
 msgid "Hough Transform"
 msgstr "Trasformata di Hough"
 
-#: modules/process/hough.c:201
+#: modules/process/hough.c:195
 msgid "_Transform type:"
 msgstr "_Tipo Trasformata:"
 
-#: modules/process/hough.c:212
+#: modules/process/hough.c:203
 msgid "_Circle size:"
 msgstr "_Dimensioni cerchio:"
 
-#: modules/process/immerse.c:162
+#: modules/process/immerse.c:163
 msgid "Immerse high resolution detail into overall image."
 msgstr "Fondi dettaglio ad alta risoluzione con l'immagine d'insieme"
 
-#: modules/process/immerse.c:176
+#: modules/process/immerse.c:177
 msgid "/M_ultidata/_Immerse Detail..."
 msgstr "/D_ati Multipli/_Fondi dettaglio..."
 
-#: modules/process/immerse.c:180
+#: modules/process/immerse.c:181
 msgid "Immerse a detail into image"
 msgstr "Fondi dettaglio con immagine"
 
-#: modules/process/immerse.c:222
+#: modules/process/immerse.c:223
 msgid "Immerse Detail"
 msgstr "Fusione dettaglio"
 
-#: modules/process/immerse.c:225
+#: modules/process/immerse.c:226
 msgid "_Locate"
 msgstr "_Localizza"
 
-#: modules/process/immerse.c:227
+#: modules/process/immerse.c:228
 msgid "Locate detail by full image correlation search"
 msgstr "Localizza dettaglio con ricerca di correlazione su intera immagine"
 
-#: modules/process/immerse.c:229
+#: modules/process/immerse.c:230
 msgid "_Improve"
 msgstr "_Migliora"
 
-#: modules/process/immerse.c:231
+#: modules/process/immerse.c:232
 msgid "Improve detail position by correlation search in neighborhood"
 msgstr ""
 "Migliora posizione dettaglio con ricerca di correlazione nelle vicinanze."
 
-#: modules/process/immerse.c:290
+#: modules/process/immerse.c:291
 msgid "_Detail image:"
 msgstr "_Dettaglio immagine:"
 
-#: modules/process/immerse.c:295
+#: modules/process/immerse.c:296
 msgid "Position:"
 msgstr "Posizione:"
 
-#: modules/process/immerse.c:308
+#: modules/process/immerse.c:314
 msgid "Result Sampling"
 msgstr "Campionamento risultante"
 
-#: modules/process/immerse.c:318
+#: modules/process/immerse.c:324
 msgid "_Upsample large image"
 msgstr "_Sovracampionamento immagine grande"
 
-#: modules/process/immerse.c:320
+#: modules/process/immerse.c:326
 msgid "_Downsample detail"
 msgstr "_Sottocampionamento detail"
 
-#: modules/process/immerse.c:329
+#: modules/process/immerse.c:335
 msgid "Detail Leveling"
 msgstr "Livellamento dettaglio"
 
-#: modules/process/immerse.c:339
+#: modules/process/immerse.c:345
 msgid "levelling|_None"
 msgstr "livellamento|nessuno"
 
-#: modules/process/immerse.c:341
+#: modules/process/immerse.c:347
 msgid "_Mean value"
 msgstr "_Valore Medio"
 
-#: modules/process/immerse.c:349
+#: modules/process/immerse.c:355
 msgid "Show _frame"
 msgstr "Mostra cornice"
 
-#: modules/process/immerse.c:787
+#: modules/process/immerse.c:793
 msgid "Immersed detail"
 msgstr "Dettagli immersi"
 
-#: modules/process/indent_analyze.c:261
+#: modules/process/indent_analyze.c:246
 msgid "Do nothing"
 msgstr "Non fare nulla"
 
-#: modules/process/indent_analyze.c:262
+#: modules/process/indent_analyze.c:247
 msgid "Plane level"
 msgstr "Livella Piano"
 
-#: modules/process/indent_analyze.c:263
+#: modules/process/indent_analyze.c:248
 msgid "Plane rotate"
 msgstr "Ruota Piano"
 
-#: modules/process/indent_analyze.c:267
+#: modules/process/indent_analyze.c:252
 msgid "New"
 msgstr "Nuovo"
 
-#: modules/process/indent_analyze.c:268
+#: modules/process/indent_analyze.c:253
 msgid "AND"
 msgstr "AND"
 
-#: modules/process/indent_analyze.c:269
+#: modules/process/indent_analyze.c:254
 msgid "OR"
 msgstr "O"
 
-#: modules/process/indent_analyze.c:270
+#: modules/process/indent_analyze.c:255
 msgid "NOT"
 msgstr "NON"
 
-#: modules/process/indent_analyze.c:271
+#: modules/process/indent_analyze.c:256
 msgid "XOR"
 msgstr "XOR"
 
-#: modules/process/indent_analyze.c:275
+#: modules/process/indent_analyze.c:260
 msgid "Nothing"
 msgstr "Nulla"
 
-#: modules/process/indent_analyze.c:276
+#: modules/process/indent_analyze.c:261
 msgid "Above"
 msgstr "Sopra"
 
-#: modules/process/indent_analyze.c:277
+#: modules/process/indent_analyze.c:262
 msgid "Below"
 msgstr "sotto"
 
-#: modules/process/indent_analyze.c:278
+#: modules/process/indent_analyze.c:263
 msgid "Plane"
 msgstr "Piano"
 
-#: modules/process/indent_analyze.c:279
+#: modules/process/indent_analyze.c:264
 msgid "Impression"
 msgstr "Impressione:"
 
-#: modules/process/indent_analyze.c:280
+#: modules/process/indent_analyze.c:265
 msgid "Inner Pile-up"
 msgstr "Inner Pile-up"
 
-#: modules/process/indent_analyze.c:281
+#: modules/process/indent_analyze.c:266
 msgid "Outer Pile-up"
 msgstr "Outer Pile-up"
 
-#: modules/process/indent_analyze.c:282
+#: modules/process/indent_analyze.c:267
 msgid "Special points"
 msgstr "Punti speciali"
 
-#: modules/process/indent_analyze.c:283
+#: modules/process/indent_analyze.c:268
 msgid "Faces border"
 msgstr "Margine facce"
 
-#: modules/process/indent_analyze.c:287
+#: modules/process/indent_analyze.c:272
 msgid "Vickers"
 msgstr "Vickers"
 
-#: modules/process/indent_analyze.c:288
+#: modules/process/indent_analyze.c:273
 msgid "Berkovich"
 msgstr "Berkovich"
 
-#: modules/process/indent_analyze.c:289
+#: modules/process/indent_analyze.c:274
 msgid "Berkovich (modified)"
 msgstr "Berkovich (modificato)"
 
-#: modules/process/indent_analyze.c:290
+#: modules/process/indent_analyze.c:275
 msgid "Knoop"
 msgstr "Knoop"
 
-#: modules/process/indent_analyze.c:291
+#: modules/process/indent_analyze.c:276
 msgid "Brinell"
 msgstr "Brinell"
 
-#: modules/process/indent_analyze.c:292
+#: modules/process/indent_analyze.c:277
 msgid "Cube corner"
 msgstr "Vertice cubo"
 
-#: modules/process/indent_analyze.c:293
+#: modules/process/indent_analyze.c:278
 msgid "Rockwell"
 msgstr "Rockwell"
 
-#: modules/process/indent_analyze.c:303
+#: modules/process/indent_analyze.c:288
 msgid "Analyses nanoindentation structure (volumes, surfaces, ...)."
 msgstr "Analisi strutture di nanoindentazione (volumi, superfici...)"
 
-#: modules/process/indent_analyze.c:320
+#: modules/process/indent_analyze.c:302
 msgid "/_Tip and Indentation/_Analyze Imprint..."
 msgstr "/Punta e Indentazione/Analizza Impronta..."
 
-#: modules/process/indent_analyze.c:439
+#: modules/process/indent_analyze.c:410
 msgid "Marked _areas:"
 msgstr "_Aree segnate:"
 
-#: modules/process/indent_analyze.c:445
+#: modules/process/indent_analyze.c:419
 msgid "_Indentor type:"
 msgstr "Tipo _Indentore:"
 
-#: modules/process/indent_analyze.c:451
+#: modules/process/indent_analyze.c:428
 msgid "_Mask creation type:"
 msgstr "Creazione _Maschera:"
 
-#: modules/process/indent_analyze.c:456
+#: modules/process/indent_analyze.c:434
 msgid "Ref. plane _tolerance:"
 msgstr "_Tolleranza Rif. Piano:"
 
-#: modules/process/indent_analyze.c:460
+#: modules/process/indent_analyze.c:438
 msgid "Angle _1 tolerance:"
 msgstr "Tolleranza Angolo_1:"
 
-#: modules/process/indent_analyze.c:485
+#: modules/process/indent_analyze.c:456
 msgid "Indent center at"
 msgstr "Centro di indentazione a "
 
-#: modules/process/indent_analyze.c:488
+#: modules/process/indent_analyze.c:460
 msgid "Maximum at"
 msgstr "Massimo "
 
-#: modules/process/indent_analyze.c:491
+#: modules/process/indent_analyze.c:464
 msgid "Max-min difference"
 msgstr "Differenza Max-min "
 
-#: modules/process/indent_analyze.c:497
+#: modules/process/indent_analyze.c:472
 msgid "Expected A<sub>d</sub>:"
 msgstr "A<sub>d</sub> Aspettato:"
 
-#: modules/process/indent_analyze.c:505
+#: modules/process/indent_analyze.c:479
 msgid "Expected A<sub>p</sub>:"
 msgstr " A<sub>p</sub> Aspettato:"
 
-#: modules/process/indent_analyze.c:549
+#: modules/process/indent_analyze.c:489
 msgid "Volume above-below"
 msgstr "Volume sopra-sotto"
 
-#: modules/process/indent_analyze.c:558
+#: modules/process/indent_analyze.c:494
 msgid "Indent. volume"
 msgstr "Volume indent."
 
-#: modules/process/indent_analyze.c:564
+#: modules/process/indent_analyze.c:502
 msgid "Indent. A<sub>d</sub>"
 msgstr "Indent. A<sub>d</sub>"
 
-#: modules/process/indent_analyze.c:573
+#: modules/process/indent_analyze.c:509
 msgid "Indent. A<sub>p</sub>"
 msgstr "Indent. A<sub>p</sub>"
 
-#: modules/process/indent_analyze.c:587
+#: modules/process/indent_analyze.c:517
 msgid "Inner Pile-Up A<sub>d</sub>"
 msgstr "Inner Pile-Up A<sub>d</sub>"
 
-#: modules/process/indent_analyze.c:596
+#: modules/process/indent_analyze.c:525
 msgid "Inner Pile-Up A<sub>p</sub>"
 msgstr "Inner Pile-Up A<sub>p</sub>"
 
-#: modules/process/indent_analyze.c:605
+#: modules/process/indent_analyze.c:533
 msgid "Outer Pile-Up A<sub>d</sub>"
 msgstr "Outer Pile-Up A<sub>d</sub>"
 
-#: modules/process/indent_analyze.c:614
+#: modules/process/indent_analyze.c:541
 msgid "Outer Pile-Up A<sub>p</sub>"
 msgstr "Outer Pile-Up A<sub>p</sub>"
 
-#: modules/process/indent_analyze.c:644
+#: modules/process/indent_analyze.c:569
 msgid "Indentation statistics"
 msgstr "Statistiche Indentazione "
 
-#: modules/process/indent_analyze.c:645
+#: modules/process/indent_analyze.c:570
 msgid "_Compute & mark"
 msgstr "_Calcola & segna "
 
-#: modules/process/indent_analyze.c:646
+#: modules/process/indent_analyze.c:571
 msgid "_Save statistics"
 msgstr "_salva Statistiche"
 
-#: modules/process/indent_analyze.c:1569
+#: modules/process/indent_analyze.c:1392
 msgid "No statistics has been computed yet."
 msgstr "Nessuna statistica è ancora stata calcolata."
 
-#: modules/process/indent_analyze.c:1577
+#: modules/process/indent_analyze.c:1400
 msgid "Save Indentation Statistics"
 msgstr "Salva Statistiche Indentazione"
 
-#: modules/process/indent_analyze.c:1615
+#: modules/process/indent_analyze.c:1438
 #, c-format
 msgid "Indentor:  %s\n"
 msgstr "Indentore:  %s\n"
 
-#: modules/process/indent_analyze.c:1619
+#: modules/process/indent_analyze.c:1442
 #, c-format
 msgid "Length units: %s\n"
 msgstr "Lunghezza : %s\n"
 
-#: modules/process/indent_analyze.c:1621
+#: modules/process/indent_analyze.c:1444
 #, c-format
 msgid "Indentation center at [%d, %d] px:      %lf\n"
 msgstr "Centro di indentazione a [%d, %d] px:      %lf\n"
 
-#: modules/process/indent_analyze.c:1623
+#: modules/process/indent_analyze.c:1446
 #, c-format
 msgid "Maximum at [%d, %d] is:                 %lf\n"
 msgstr "Massimo a [%d, %d] is:                 %lf\n"
 
-#: modules/process/indent_analyze.c:1625
+#: modules/process/indent_analyze.c:1448
 #, c-format
 msgid "Difference max-min:                     %lf\n"
 msgstr "Differenza max-min:                      %lf\n"
 
-#: modules/process/indent_analyze.c:1630
+#: modules/process/indent_analyze.c:1453
 #, c-format
 msgid "Area (projected) above plane:             %g (%.1lf %%)\n"
 msgstr "Area (proiettata) al di sopra del piano:             %g (%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1634
+#: modules/process/indent_analyze.c:1457
 #, c-format
 msgid "Area (projected) below plane:             %g (%.1lf %%)\n"
 msgstr "Area (proiettata) al di sotto del piano:             %g (%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1638
+#: modules/process/indent_analyze.c:1461
 #, c-format
 msgid "Area (projected) of    plane:             %g (%.1lf %%)\n"
 msgstr "Area (proiettata) del piano:             %g (%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1643
+#: modules/process/indent_analyze.c:1466
 #, c-format
 msgid "Area (developed) above %g (+%.1f %%)\n"
 msgstr "Area (sviluppata) al di sopra %g (+%.1f %%)\n"
 
-#: modules/process/indent_analyze.c:1646
+#: modules/process/indent_analyze.c:1469
 #, c-format
 msgid "Area (developed) below %g (+%.1lf %%)\n"
 msgstr "Area (sviluppata) al di sotto %g (+%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1650
+#: modules/process/indent_analyze.c:1473
 #, c-format
 msgid "Volume above:     %g\n"
 msgstr "Volume al di sopra:     %g\n"
 
-#: modules/process/indent_analyze.c:1652
+#: modules/process/indent_analyze.c:1475
 #, c-format
 msgid "Volume below:     %g\n"
 msgstr "Volume di sotto:     %g\n"
 
-#: modules/process/indent_analyze.c:1654
+#: modules/process/indent_analyze.c:1477
 #, c-format
 msgid "Volume difference %g\n"
 msgstr "Differenza volume %g\n"
 
-#: modules/process/indent_analyze.c:1658
+#: modules/process/indent_analyze.c:1481
 msgid ""
 "\n"
 "Indentation\n"
@@ -10697,12 +11091,12 @@ msgstr ""
 "\n"
 "Indentazione\n"
 
-#: modules/process/indent_analyze.c:1659
+#: modules/process/indent_analyze.c:1482
 #, c-format
 msgid "Volume      %g\n"
 msgstr "Volume      %g\n"
 
-#: modules/process/indent_analyze.c:1664
+#: modules/process/indent_analyze.c:1487
 msgid ""
 "\n"
 "Indentation - Inner Pile-Up\n"
@@ -10710,7 +11104,7 @@ msgstr ""
 "\n"
 "Indentazione - Inner Pile-Up\n"
 
-#: modules/process/indent_analyze.c:1670
+#: modules/process/indent_analyze.c:1493
 msgid "Indentation - Outer Pile-Up\n"
 msgstr "Indentazione - Outer Pile-Up\n"
 
@@ -10827,11 +11221,6 @@ msgstr "Parametri reticolo"
 msgid "_Lattice:"
 msgstr "Reticolo:"
 
-#: modules/process/lat_synth.c:651 modules/process/obj_synth.c:544
-#: modules/process/pat_synth.c:1457
-msgid "_Size:"
-msgstr "Dimensione:"
-
 #: modules/process/lat_synth.c:662
 msgid "Lattice rela_xation:"
 msgstr "Rilassamento reticolo:"
@@ -10967,7 +11356,7 @@ msgstr ""
 
 #: modules/process/level_grains.c:187 modules/process/median-bg.c:167
 #: modules/process/polylevel.c:293 modules/process/polylevel.c:417
-#: modules/process/sphere-revolve.c:200
+#: modules/process/sphere-revolve.c:221 modules/process/sphere-revolve.c:295
 msgid "Background"
 msgstr "Sottofondo"
 
@@ -10979,150 +11368,151 @@ msgstr "Livella grani"
 msgid "Quantity to level:"
 msgstr "Quantità da livellare:"
 
-#: modules/process/level_grains.c:231 modules/process/linematch.c:866
-#: modules/process/median-bg.c:217 modules/process/polylevel.c:482
-#: modules/process/sphere-revolve.c:263
+#: modules/process/level_grains.c:231 modules/process/linematch.c:834
+#: modules/process/median-bg.c:217 modules/process/polylevel.c:485
+#: modules/process/sphere-revolve.c:371
 msgid "E_xtract background"
 msgstr "E_strae Sottofondo"
 
-#: modules/process/linecorrect.c:54
+#: modules/process/linecorrect.c:52
 msgid "Corrects line defects (mostly experimental algorithms)."
 msgstr "Corregge i difetti lineari (per lo più algoritmi sperimentali)."
 
-#: modules/process/linecorrect.c:68
+#: modules/process/linecorrect.c:66
 msgid "/_Correct Data/Ste_p Line Correction"
 msgstr "/_Correzione Dati/ Correzione Ste_p Line  "
 
-#: modules/process/linecorrect.c:72
+#: modules/process/linecorrect.c:70
 msgid "Correct steps in lines"
 msgstr "Correzione step nelle linee "
 
-#: modules/process/linematch.c:158 modules/tools/linestats.c:166
+#: modules/process/linematch.c:155 modules/tools/linestats.c:166
 #: modules/volume/volume_linestat.c:143
 msgid "Median"
 msgstr "Mediana"
 
-#: modules/process/linematch.c:159
+#: modules/process/linematch.c:156
 msgid "Median of differences"
 msgstr "Mediana delle differenze"
 
-#: modules/process/linematch.c:160
+#: modules/process/linematch.c:157
 msgid "Modus"
 msgstr "Modo"
 
-#: modules/process/linematch.c:161
+#: modules/process/linematch.c:158
 msgid "linematch|Matching"
 msgstr "linematch|Matching"
 
-#: modules/process/linematch.c:162
+#: modules/process/linematch.c:159
 msgid "linematch|Polynomial"
 msgstr "linematch|Polinomiale"
 
-#: modules/process/linematch.c:168
+#: modules/process/linematch.c:165
 msgid "Aligns rows by various methods."
 msgstr "Allinea righe con vari metodi"
 
-#: modules/process/linematch.c:182
+#: modules/process/linematch.c:179
 msgid "/_Correct Data/_Align rows..."
 msgstr "/_Correzione Dati/_Allineamento righe..."
 
-#: modules/process/linematch.c:186
+#: modules/process/linematch.c:183
 msgid "Align rows using various methods"
 msgstr "Allineamento righe usando vari metodi"
 
-#: modules/process/linematch.c:237 modules/process/linematch.c:265
+#: modules/process/linematch.c:234 modules/process/linematch.c:262
 msgid "Row background"
 msgstr "Sottofondo righa"
 
-#: modules/process/linematch.c:266
+#: modules/process/linematch.c:263
 msgid "Vertical position"
 msgstr "Posizione verticale"
 
-#: modules/process/linematch.c:267
+#: modules/process/linematch.c:264
 msgid "Corrected offset"
 msgstr "Correzione compensazione"
 
-#: modules/process/linematch.c:802
+#: modules/process/linematch.c:769
 msgid "Align Rows"
 msgstr "Allineamento righe"
 
-#: modules/process/linematch.c:844
+#: modules/process/linematch.c:810
 msgid "_Polynomial degree:"
 msgstr "grado _polinomiale:"
 
-#: modules/process/linematch.c:876
+#: modules/process/linematch.c:844
 msgid "Plot background _graph"
 msgstr "Traccia grafico sottofondo"
 
-#: modules/process/lno_synth.c:261 modules/process/noise_synth.c:188
+#: modules/process/lno_synth.c:259 modules/process/noise_synth.c:186
 msgid "distribution|Triangular"
 msgstr "distribuzione|Triangolare"
 
-#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:213
+#: modules/process/lno_synth.c:265 modules/process/pat_synth.c:213
 msgid "Steps"
 msgstr "Steps"
 
-#: modules/process/lno_synth.c:268
+#: modules/process/lno_synth.c:266
 msgid "Scars"
 msgstr "Danni"
 
-#: modules/process/lno_synth.c:269 modules/process/pat_synth.c:214
+#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:214
 msgid "Ridges"
 msgstr "Creste"
 
-#: modules/process/lno_synth.c:275
+#: modules/process/lno_synth.c:273
 msgid "Generates various kinds of line noise."
 msgstr "Generazione di vari tipi di segnale di fondo"
 
-#: modules/process/lno_synth.c:289
+#: modules/process/lno_synth.c:287
 msgid "/S_ynthetic/_Line Noise..."
 msgstr "/Sntetico/segnale di fondo..."
 
-#: modules/process/lno_synth.c:293
+#: modules/process/lno_synth.c:291
 msgid "Generate line noise"
 msgstr "Generazione linea di fondo"
 
-#: modules/process/lno_synth.c:431
+#: modules/process/lno_synth.c:429
 msgid "Line Noise"
 msgstr "Linea di fondo"
 
-#: modules/process/lno_synth.c:504
+#: modules/process/lno_synth.c:502
 msgid "Distribution"
 msgstr "Distribuzione"
 
-#: modules/process/lno_synth.c:514 modules/process/noise_synth.c:414
-msgid "Direction:"
-msgstr "Direzione:"
+#: modules/process/lno_synth.c:512 modules/process/mask_noisify.c:158
+#: modules/process/noise_synth.c:412
+#, fuzzy
+msgid "Noise type:"
+msgstr "Tipo _Noise:"
 
-#: modules/process/lno_synth.c:523 modules/process/noise_synth.c:423
+#: modules/process/lno_synth.c:521 modules/process/mask_noisify.c:167
+#: modules/process/noise_synth.c:421
 msgid "S_ymmetrical"
 msgstr "Simmetrico"
 
-#: modules/process/lno_synth.c:524 modules/process/noise_synth.c:424
+#: modules/process/lno_synth.c:522 modules/process/mask_noisify.c:168
+#: modules/process/noise_synth.c:422
 msgid "One-sided _positive"
 msgstr ""
 
-#: modules/process/lno_synth.c:525 modules/process/noise_synth.c:425
+#: modules/process/lno_synth.c:523 modules/process/mask_noisify.c:169
+#: modules/process/noise_synth.c:423
 msgid "One-sided _negative"
 msgstr ""
 
-#: modules/process/lno_synth.c:546
+#: modules/process/lno_synth.c:544
 msgid "Noise Type"
 msgstr "Tipo Noise"
 
-#: modules/process/lno_synth.c:551
+#: modules/process/lno_synth.c:549
 msgid "_Noise type:"
 msgstr "Tipo _Noise:"
 
-#: modules/process/lno_synth.c:853 modules/process/lno_synth.c:1222
-msgid "Densi_ty:"
-msgstr "Densi_tà:"
-
-#: modules/process/lno_synth.c:864 modules/process/lno_synth.c:1233
+#: modules/process/lno_synth.c:863 modules/process/lno_synth.c:1233
 msgid "_Within line:"
 msgstr "Internamente alla linea:"
 
-#: modules/process/lno_synth.c:871
+#: modules/process/lno_synth.c:870
 msgid "C_umulative"
 msgstr "C_umulativo"
 
@@ -11178,32 +11568,32 @@ msgstr ""
 msgid "_Train logistic regression"
 msgstr ""
 
-#: modules/process/logistic.c:275
+#: modules/process/logistic.c:274
 msgid "_Gaussian blur"
 msgstr ""
 
-#: modules/process/logistic.c:288
+#: modules/process/logistic.c:285
 msgid "_Number of Gaussians:"
 msgstr "_Numero di Gaussiane::"
 
-#: modules/process/logistic.c:296
+#: modules/process/logistic.c:293
 msgid "_Sobel derivatives"
 msgstr "Derivative di _Sobel:"
 
-#: modules/process/logistic.c:307
+#: modules/process/logistic.c:303
 msgid "_Laplacian"
 msgstr "_Laplaciano"
 
-#: modules/process/logistic.c:318
+#: modules/process/logistic.c:313
 msgid "_Hessian"
 msgstr "_Hessiana"
 
-#: modules/process/logistic.c:331
+#: modules/process/logistic.c:325
 #, fuzzy
 msgid "_Regularization parameter:"
 msgstr "Parametri Simulazione"
 
-#: modules/process/logistic.c:623 modules/process/neural.c:1101
+#: modules/process/logistic.c:616 modules/process/neural.c:1108
 msgid "Training..."
 msgstr ""
 
@@ -11219,13 +11609,13 @@ msgstr "/_Correzione Dati/Maschera di valori non connessi"
 msgid "Mark data disconnected from other values"
 msgstr "Segna dati non connessi con altri valori"
 
-#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:422
-#: modules/process/scars.c:279
+#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:419
+#: modules/process/scars.c:297
 msgid "Positive"
 msgstr "Positivo"
 
-#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:423
-#: modules/process/scars.c:280
+#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:420
+#: modules/process/scars.c:298
 msgid "Negative"
 msgstr "Negativo"
 
@@ -11241,11 +11631,11 @@ msgstr "Tipo difetto::"
 msgid "Defect _radius:"
 msgstr "raggio del difetto:"
 
-#: modules/process/mark_disconn.c:563
+#: modules/process/mark_disconn.c:552
 msgid "Filtering..."
 msgstr "Filtrazione..."
 
-#: modules/process/mark_disconn.c:590
+#: modules/process/mark_disconn.c:579
 msgid "Marking outliers..."
 msgstr "Marcatura valori anomali"
 
@@ -11261,55 +11651,59 @@ msgstr "/_Maschera/Segna con"
 msgid "Mask combining and modification"
 msgstr "Combinazione e modifica maschere"
 
-#: modules/process/mark_with.c:192
+#: modules/process/mark_with.c:193
 msgid "Mark With"
 msgstr "Segna con"
 
-#: modules/process/mark_with.c:238
-msgid "Se_t mask"
-msgstr "Assegna maschera"
-
+#: modules/process/mark_with.c:231 modules/process/mask_morph.c:209
+msgid "Operation:"
+msgstr "Operazione:"
+
 #: modules/process/mark_with.c:239
+msgid "Se_t mask"
+msgstr "Assegna maschera"
+
+#: modules/process/mark_with.c:240
 msgid "_Add mask"
 msgstr "_Aggiungi Maschera"
 
-#: modules/process/mark_with.c:240
+#: modules/process/mark_with.c:241
 msgid "_Subtract mask"
 msgstr "_Sottrai maschera"
 
-#: modules/process/mark_with.c:241
+#: modules/process/mark_with.c:242
 msgid "_Intersect masks"
 msgstr "_Interseca maschere"
 
-#: modules/process/mark_with.c:247
+#: modules/process/mark_with.c:248
 msgid "Mark with:"
 msgstr "Segna con:"
 
-#: modules/process/mark_with.c:255
+#: modules/process/mark_with.c:256
 msgid "with|_Mask"
 msgstr "con|_Maschera"
 
-#: modules/process/mark_with.c:257
+#: modules/process/mark_with.c:258
 msgid "with|_Data"
 msgstr "con|_Dati"
 
-#: modules/process/mark_with.c:259
+#: modules/process/mark_with.c:260
 msgid "with|_Presentation"
 msgstr "con|_Presentazione"
 
-#: modules/process/mark_with.c:293
+#: modules/process/mark_with.c:297
 msgid "Marked data range:"
 msgstr "Intervallo dati segnato:"
 
-#: modules/process/mark_with.c:301
+#: modules/process/mark_with.c:305
 msgid "_Minimum:"
 msgstr "_Minimo:"
 
-#: modules/process/mark_with.c:310
+#: modules/process/mark_with.c:314
 msgid "M_aximum:"
 msgstr "M_assimo:"
 
-#: modules/process/mark_with.c:378
+#: modules/process/mark_with.c:382
 msgid "Operand"
 msgstr "Operando"
 
@@ -11345,107 +11739,108 @@ msgstr "Distribuisci a:"
 msgid "Preserve existing masks"
 msgstr "Mantieni maschere esistenti"
 
-#: modules/process/mask_edt.c:95
+#: modules/process/mask_edt.c:89
 msgid "Performs simple and true Euclidean distance transforms of masks."
 msgstr "Esegue una semplice trasformata distanza Euclidea di maschere"
 
-#: modules/process/mask_edt.c:109
+#: modules/process/mask_edt.c:103
 msgid "/_Mask/Distanc_e Transform..."
 msgstr "/_Maschere/_Trasformata Distanza..."
 
-#: modules/process/mask_edt.c:113
+#: modules/process/mask_edt.c:107
 msgid "Distance transform of mask"
 msgstr "Trasformata distanza di maschera"
 
-#: modules/process/mask_edt.c:116
+#: modules/process/mask_edt.c:110
 msgid "/_Mask/Thi_n"
 msgstr "/_Maschera/Sottile"
 
-#: modules/process/mask_edt.c:120
+#: modules/process/mask_edt.c:114
 msgid "Thin mask"
 msgstr "Maschera sottile"
 
-#: modules/process/mask_edt.c:330 modules/process/mask_edt.c:352
+#: modules/process/mask_edt.c:164 modules/process/mask_edt.c:186
 msgid "Distance Transform"
 msgstr "Trasformata Distanza"
 
-#: modules/process/mask_edt.c:340
+#: modules/process/mask_edt.c:174
 msgid "Interior"
 msgstr "Interno"
 
-#: modules/process/mask_edt.c:341
+#: modules/process/mask_edt.c:175
 msgid "Exterior"
 msgstr "Esterno"
 
-#: modules/process/mask_edt.c:342
+#: modules/process/mask_edt.c:176
 msgid "Two-sided"
 msgstr ""
 
-#: modules/process/mask_edt.c:373 modules/tools/maskedit.c:634
+#: modules/process/mask_edt.c:207 modules/tools/maskedit.c:640
 msgid "_Distance type:"
 msgstr "Tipo _Distanza:"
 
-#: modules/process/mask_edt.c:394 modules/tools/maskedit.c:640
+#: modules/process/mask_edt.c:228 modules/tools/maskedit.c:646
 msgid "Shrink from _border"
 msgstr "Rimpicciolisci dal margine"
 
-#: modules/process/mask_morph.c:117
+#: modules/process/mask_morph.c:116
 msgid "Performs basic morphological operations with masks."
 msgstr "Esegue operazioni morfologiche di base con maschere"
 
-#: modules/process/mask_morph.c:131
-msgid "/_Mask/Morphological Operation..."
+#: modules/process/mask_morph.c:130
+#, fuzzy
+msgid "/_Mask/Morpho_logical Operation..."
 msgstr "/_Maschera/Operazione morfologica..."
 
-#: modules/process/mask_morph.c:135
+#: modules/process/mask_morph.c:134
 msgid "Morphological operation with mask"
 msgstr "operazione morfologica con maschera"
 
-#: modules/process/mask_morph.c:169
+#: modules/process/mask_morph.c:168
 msgid "Erosion"
 msgstr "Erosione"
 
-#: modules/process/mask_morph.c:170
+#: modules/process/mask_morph.c:169
 msgid "Dilation"
 msgstr "Dilatazione"
 
-#: modules/process/mask_morph.c:171 modules/tools/filter.c:242
+#: modules/process/mask_morph.c:170 modules/tools/filter.c:243
 msgid "filter|Opening"
 msgstr "filtro|Apertura"
 
-#: modules/process/mask_morph.c:172 modules/tools/filter.c:243
+#: modules/process/mask_morph.c:171 modules/tools/filter.c:244
 msgid "filter|Closing"
 msgstr "filtro|Chiusura"
 
-#: modules/process/mask_morph.c:173 modules/tools/filter.c:244
+#: modules/process/mask_morph.c:172 modules/tools/filter.c:245
 msgid "ASF Opening"
 msgstr "Apertura ASF"
 
-#: modules/process/mask_morph.c:174 modules/tools/filter.c:245
+#: modules/process/mask_morph.c:173 modules/tools/filter.c:246
 msgid "ASF Closing"
 msgstr "Chiusura ASF"
 
-#: modules/process/mask_morph.c:178
+#: modules/process/mask_morph.c:177
 msgid "Octagon"
 msgstr "Ottagono"
 
-#: modules/process/mask_morph.c:181
+#: modules/process/mask_morph.c:180
 msgid "Another mask"
 msgstr "Altra maschera"
 
-#: modules/process/mask_morph.c:192
+#: modules/process/mask_morph.c:191
 msgid "Morphological Operation"
 msgstr "Operazione Morfologica"
 
-#: modules/process/mask_morph.c:224
+#: modules/process/mask_morph.c:223
 msgid "Structuring element:"
 msgstr "Elemento strutturante:"
 
-#: modules/process/mask_morph.c:238 modules/tools/maskedit.c:524
+#: modules/process/mask_morph.c:237 modules/tools/maskedit.c:528
 msgid "_Radius:"
 msgstr "_Raggio:"
 
-#: modules/process/mask_morph.c:249
+#: modules/process/mask_morph.c:248
 msgid "_Mask:"
 msgstr "_Maschera:"
 
@@ -11453,39 +11848,62 @@ msgstr "_Maschera:"
 msgid "_Trim empty borders"
 msgstr "_Taglia margini vuoti"
 
-#: modules/process/maskcor.c:86
+#: modules/process/mask_noisify.c:83
+msgid "Adds salt and/or pepper noise to mask."
+msgstr ""
+
+#: modules/process/mask_noisify.c:97
+#, fuzzy
+msgid "/_Mask/_Noisify..."
+msgstr "/Maschere/_Distribuzione..."
+
+#: modules/process/mask_noisify.c:101
+#, fuzzy
+msgid "Add noise to mask"
+msgstr "Aggiungi selezione alla maschera"
+
+#: modules/process/mask_noisify.c:141
+msgid "Noisify Mask"
+msgstr ""
+
+#: modules/process/mask_noisify.c:184
+#, fuzzy
+msgid "_Alter only boundaries"
+msgstr "Usa confini"
+
+#: modules/process/maskcor.c:87
 msgid "Creates mask by correlation with another data."
 msgstr "Crea una maschera per correlazione con altri dati"
 
-#: modules/process/maskcor.c:100
+#: modules/process/maskcor.c:101
 msgid "/M_ultidata/_Mask by Correlation..."
 msgstr "/Dati _Multipli/_Maschera di Correlazione..."
 
-#: modules/process/maskcor.c:104
+#: modules/process/maskcor.c:105
 msgid "Create mask by correlation with another data"
 msgstr "Crea maschera da correlazione con altri dati"
 
-#: modules/process/maskcor.c:141
+#: modules/process/maskcor.c:142
 msgid "Mask by Correlation"
 msgstr "Maschera di Correlazione"
 
-#: modules/process/maskcor.c:165
+#: modules/process/maskcor.c:166
 msgid "Correlation _kernel:"
 msgstr "Correlazione_Kernel:"
 
-#: modules/process/maskcor.c:172
+#: modules/process/maskcor.c:173
 msgid "Objects marked"
 msgstr "Oggetti segnati"
 
-#: modules/process/maskcor.c:173
+#: modules/process/maskcor.c:174
 msgid "Correlation maxima"
 msgstr "Correlazione massima"
 
-#: modules/process/maskcor.c:174 modules/process/maskcor.c:356
+#: modules/process/maskcor.c:175 modules/process/maskcor.c:360
 msgid "Correlation score"
 msgstr "Percentuale di Correlazione "
 
-#: modules/process/maskcor.c:183
+#: modules/process/maskcor.c:185
 msgid "Correlation _method:"
 msgstr "Metodo Correlazione:"
 
@@ -11514,7 +11932,8 @@ msgid "/_Mask/_Extract Mask"
 msgstr "/_Maschere/_Estrae Maschera"
 
 #: modules/process/maskops.c:78
-msgid "Extract mask to a new channel"
+#, fuzzy
+msgid "Extract mask to a new image"
 msgstr "Estrazione maschera in nuovo canale"
 
 #: modules/process/maskops.c:81
@@ -11541,35 +11960,31 @@ msgstr "Taglio regioni non intersecanti di due immagini"
 msgid "Mutual Crop"
 msgstr "Taglio reciproco"
 
-#: modules/process/mcrop.c:174
+#: modules/process/mcrop.c:173
 msgid "_Select second argument:"
 msgstr "_Seleziona secondo argomento:"
 
-#: modules/process/measure_lattice.c:174
+#: modules/process/measure_lattice.c:165
 msgid "Measures parameters of two-dimensional lattices."
 msgstr "Misurazione parametri di reticoli bidimensionali"
 
-#: modules/process/measure_lattice.c:188
+#: modules/process/measure_lattice.c:179
 msgid "/_Statistics/Measure _Lattice..."
 msgstr "/_Statistica/Misura Reticolo..."
 
-#: modules/process/measure_lattice.c:192
+#: modules/process/measure_lattice.c:183
 msgid "Measure lattice"
 msgstr "Misura  reticolo"
 
-#: modules/process/measure_lattice.c:253
+#: modules/process/measure_lattice.c:243
 msgid "Measure Lattice"
 msgstr "Misura Reticolo"
 
-#: modules/process/measure_lattice.c:259
-msgid "_Refine"
-msgstr "_Raffina"
-
-#: modules/process/measure_lattice.c:330
+#: modules/process/measure_lattice.c:320
 msgid "_ACF"
 msgstr "_ACF"
 
-#: modules/process/measure_lattice.c:331
+#: modules/process/measure_lattice.c:321
 msgid "_PSDF"
 msgstr "_PSDF"
 
@@ -11585,30 +12000,30 @@ msgstr "Reticolo:"
 msgid "_Vectors"
 msgstr "_vettori"
 
-#: modules/process/measure_lattice.c:596
+#: modules/process/measure_lattice.c:589
 msgid "Save Lattice Parameters"
 msgstr "Salva Parametri Reticolo"
 
-#: modules/process/measure_lattice.c:634
+#: modules/process/measure_lattice.c:627
 #, c-format
 msgid "Vector %d:"
 msgstr "Vettore %d:"
 
-#: modules/process/measure_lattice.c:643
+#: modules/process/measure_lattice.c:636
 #, c-format
 msgid "Length %d:"
 msgstr "Lunghezza %d:"
 
-#: modules/process/measure_lattice.c:650
+#: modules/process/measure_lattice.c:643
 #, c-format
 msgid "Angle %d:"
 msgstr "Angolo %d:"
 
-#: modules/process/measure_lattice.c:665
+#: modules/process/measure_lattice.c:657
 msgid "Angle:"
 msgstr "Angolo:"
 
-#: modules/process/measure_lattice.c:681
+#: modules/process/measure_lattice.c:673
 msgid "Lattice Parameters"
 msgstr "Parametri reticolo"
 
@@ -11632,11 +12047,11 @@ msgstr "Livellamento mediano..."
 msgid "Median Level"
 msgstr "Livella Mediano"
 
-#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:237
+#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:336
 msgid "Real _radius:"
 msgstr "Raggio _reale:"
 
-#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:247
+#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:346
 msgid "_Pixel radius:"
 msgstr "_Pixel raggio:"
 
@@ -11676,7 +12091,7 @@ msgstr "Primo operando"
 msgid "Second operand"
 msgstr "Secondo operando"
 
-#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:643
+#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:612
 msgid "Average"
 msgstr "Media"
 
@@ -11728,6 +12143,245 @@ msgstr "Aggiunta maschera di pixel esterni"
 msgid "Merged images"
 msgstr "Immagini unite"
 
+#: modules/process/mfm_current.c:163
+msgid "Simulation of current line magnetic field"
+msgstr ""
+
+#: modules/process/mfm_current.c:177
+msgid "/SPM M_odes/_MFM/_Current Line Field..."
+msgstr ""
+
+#: modules/process/mfm_current.c:181
+msgid "Simulate stray field above current line"
+msgstr ""
+
+#: modules/process/mfm_current.c:280 modules/process/mfm_parallel.c:282
+msgid "Simulated field"
+msgstr ""
+
+#: modules/process/mfm_current.c:322 modules/process/mfm_field.c:266
+#: modules/process/mfm_parallel.c:324
+#, fuzzy
+msgid "Point charge"
+msgstr "Punta in una direzione qualunque"
+
+#: modules/process/mfm_current.c:323 modules/process/mfm_field.c:267
+#: modules/process/mfm_parallel.c:325
+#, fuzzy
+msgid "Bar"
+msgstr "Binari"
+
+#: modules/process/mfm_current.c:330
+msgid "Current Line Stray Field"
+msgstr ""
+
+#: modules/process/mfm_current.c:415
+msgid "Output"
+msgstr "Output"
+
+#: modules/process/mfm_current.c:420 modules/process/mfm_field.c:320
+#: modules/process/mfm_parallel.c:415
+#, fuzzy
+msgid "_Output plane height:"
+msgstr "Tipo Output: "
+
+#: modules/process/mfm_current.c:428
+#, fuzzy
+msgid "_Stripe width:"
+msgstr "Larghezza _Pendenza:"
+
+#: modules/process/mfm_current.c:436
+#, fuzzy
+msgid "Stripe _current:"
+msgstr "Striscia %u: "
+
+#: modules/process/mfm_current.c:444
+#, fuzzy
+msgid "_Position:"
+msgstr "Posizione:"
+
+#: modules/process/mfm_current.c:461
+msgid "Probe"
+msgstr ""
+
+#: modules/process/mfm_current.c:469
+#, fuzzy
+msgid "P_robe type:"
+msgstr "Tipo _Noise:"
+
+#: modules/process/mfm_current.c:475 modules/process/mfm_field.c:389
+#: modules/process/mfm_parallel.c:482
+#, fuzzy
+msgid "Tip _magnetization:"
+msgstr "Rotazione Punta"
+
+#: modules/process/mfm_current.c:484 modules/process/mfm_field.c:397
+#: modules/process/mfm_parallel.c:491
+#, fuzzy
+msgid "Bar width _x:"
+msgstr "Larghezza margine:"
+
+#: modules/process/mfm_current.c:493 modules/process/mfm_field.c:405
+#: modules/process/mfm_parallel.c:500
+#, fuzzy
+msgid "Bar width _y:"
+msgstr "Larghezza margine:"
+
+#: modules/process/mfm_current.c:502 modules/process/mfm_field.c:413
+#: modules/process/mfm_parallel.c:509
+msgid "Bar length (_z):"
+msgstr ""
+
+#: modules/process/mfm_field.c:146
+msgid "Simulation of magnetic field above perpendicular media"
+msgstr ""
+
+#: modules/process/mfm_field.c:160
+msgid "/SPM M_odes/_MFM/_Perpendicular Media Field..."
+msgstr ""
+
+#: modules/process/mfm_field.c:164
+msgid "Compute stray field above perpendicular magnetic medium"
+msgstr ""
+
+#: modules/process/mfm_field.c:276
+msgid "Perpendicular Media Stray Field"
+msgstr ""
+
+#: modules/process/mfm_field.c:328 modules/process/mfm_parallel.c:423
+#, fuzzy
+msgid "_Film thickness:"
+msgstr "Spessore cornice:"
+
+#: modules/process/mfm_field.c:336
+msgid "_Magnetic charge:"
+msgstr ""
+
+#: modules/process/mfm_field.c:344
+msgid "Include domain _walls"
+msgstr ""
+
+#: modules/process/mfm_field.c:354
+#, fuzzy
+msgid "_Exchange constant:"
+msgstr "Costante casuale"
+
+#: modules/process/mfm_field.c:362
+#, fuzzy
+msgid "_Uniaxial anisotropy:"
+msgstr "DWT Anisotropa"
+
+#: modules/process/mfm_field.c:383 modules/process/mfm_parallel.c:476
+#, fuzzy
+msgid "_Probe type:"
+msgstr "Tipo _Noise:"
+
+#: modules/process/mfm_findshift.c:88
+msgid "Lift height difference estimation from data blur"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:102
+msgid "/SPM M_odes/_MFM/_Estimate Shift in Z..."
+msgstr ""
+
+#: modules/process/mfm_findshift.c:106
+msgid "Estimate lift height difference in MFM data"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:166 modules/process/psf.c:340
+#, fuzzy
+msgid "Searching..."
+msgstr "Inizio...."
+
+#: modules/process/mfm_findshift.c:196
+#, fuzzy
+msgid "Estimated shift:"
+msgstr "Punta stimata"
+
+#: modules/process/mfm_findshift.c:211
+#, fuzzy
+msgid "Shifted field difference"
+msgstr "Mediana delle differenze"
+
+#: modules/process/mfm_findshift.c:228
+msgid "Estimate Lift Height Shift"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:255
+#, fuzzy
+msgid "Data to compare:"
+msgstr "Formato dati:"
+
+#: modules/process/mfm_findshift.c:261
+#, fuzzy
+msgid "Search _from:"
+msgstr "Intervallo Ricerca:"
+
+#: modules/process/mfm_findshift.c:269
+#, fuzzy
+msgid "Search _to:"
+msgstr "Intervallo Ricerca:"
+
+#: modules/process/mfm_parallel.c:165
+#, fuzzy
+msgid "Simulation of parallel magnetic media"
+msgstr "Parametri Simulazione"
+
+#: modules/process/mfm_parallel.c:179
+msgid "/SPM M_odes/_MFM/Para_llel Media Field..."
+msgstr ""
+
+#: modules/process/mfm_parallel.c:183
+msgid "Simulate stray field above parallel magnetic medium"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:331
+msgid "Parallel Media Stray Field"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:431
+#, fuzzy
+msgid "_Remanent magnetization:"
+msgstr "Rotazione Punta"
+
+#: modules/process/mfm_parallel.c:439
+msgid "Size _A (dir. left):"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:447
+msgid "Size _B (dir. right):"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:455
+#, fuzzy
+msgid "_Gap size:"
+msgstr "Dimensioni campione:"
+
+#: modules/process/mfm_shift.c:87
+msgid "Simulation of magnetic field z component change for another level"
+msgstr ""
+
+#: modules/process/mfm_shift.c:101
+msgid "/SPM M_odes/_MFM/_Field Shift in Z..."
+msgstr ""
+
+#: modules/process/mfm_shift.c:105
+msgid "Compute stray field shift for another z level"
+msgstr ""
+
+#: modules/process/mfm_shift.c:146
+msgid "Shifted field"
+msgstr ""
+
+#: modules/process/mfm_shift.c:164
+msgid "Stray Field Plane Shift"
+msgstr ""
+
+#: modules/process/mfm_shift.c:209
+#, fuzzy
+msgid "_Z shift by:"
+msgstr "Z shi_ft:"
+
 #: modules/process/nanoindent_adjust.c:89
 msgid "Adjust images of two indentor prints."
 msgstr "Aggiusta le immagini di due impronte di indentazione"
@@ -11764,14 +12418,14 @@ msgstr "_Ruota dati"
 msgid "E_xtrapolate result data out of measured range"
 msgstr "E_strapola i dati risultanti al di fuori dell'intervallo di misura"
 
-#: modules/process/nanoindent_adjust.c:295
+#: modules/process/nanoindent_adjust.c:296
 msgid ""
 "Tip has different range/resolution ratio than image. Tip will be resampled."
 msgstr ""
 "La punta ha un rapporto range/risoluzione differente dall'immagine e verrà "
 "ricampionata"
 
-#: modules/process/nanoindent_adjust.c:334
+#: modules/process/nanoindent_adjust.c:335
 msgid "Immersed detail data"
 msgstr "Dati dettaglio fuso"
 
@@ -11812,245 +12466,235 @@ msgstr "errore di addestramento"
 msgid "error"
 msgstr "errore"
 
-#: modules/process/neural.c:503
+#: modules/process/neural.c:504
 msgid "NN training error"
 msgstr "NN errore di addestramento"
 
-#: modules/process/neural.c:516
+#: modules/process/neural.c:517
 msgid "Training"
 msgstr "Addestramento"
 
-#: modules/process/neural.c:520
+#: modules/process/neural.c:521
 msgid "_Model:"
 msgstr "_Modello:"
 
-#: modules/process/neural.c:530
+#: modules/process/neural.c:532
 msgid "_Signal:"
 msgstr "_Segnale"
 
-#: modules/process/neural.c:541
+#: modules/process/neural.c:544
 msgid "Training ste_ps:"
 msgstr "stadi addestramento:"
 
-#: modules/process/neural.c:557
+#: modules/process/neural.c:561
 msgid "Model"
 msgstr "Modello"
 
-#: modules/process/neural.c:558
+#: modules/process/neural.c:562
 msgid "Signal"
 msgstr "Segnale"
 
-#: modules/process/neural.c:575
+#: modules/process/neural.c:579
 msgid "verb|_Train"
 msgstr ""
 
-#: modules/process/neural.c:580
+#: modules/process/neural.c:584
 msgid "Re_initialize"
 msgstr "Ri_Inizializzazione"
 
-#: modules/process/neural.c:613
+#: modules/process/neural.c:617
 msgid "Network"
 msgstr "Rete"
 
-#: modules/process/neural.c:619
+#: modules/process/neural.c:623
 msgid "Window _width:"
 msgstr "Larghezza finestra:"
 
-#: modules/process/neural.c:627
+#: modules/process/neural.c:631
 msgid "Window h_eight:"
 msgstr "Altezza finestra:"
 
-#: modules/process/neural.c:635
+#: modules/process/neural.c:639
 msgid "_Hidden nodes:"
 msgstr "Nodi nascosti:"
 
-#: modules/process/neural.c:643
+#: modules/process/neural.c:647
 msgid "Result Units"
 msgstr ""
 
-#: modules/process/neural.c:650
+#: modules/process/neural.c:654
 msgid "Power of source _XY:"
 msgstr "Potenza della sorgente _XY:"
 
-#: modules/process/neural.c:658
+#: modules/process/neural.c:663
 msgid "Power of source _Z:"
 msgstr "Potenza sorgente _Z:"
 
-#: modules/process/neural.c:666
+#: modules/process/neural.c:672
 msgid "_Fixed units:"
 msgstr "Unità Fissate_"
 
-#: modules/process/neural.c:676
+#: modules/process/neural.c:683
 msgid "Networks"
 msgstr "Reti"
 
-#: modules/process/neural.c:723
+#: modules/process/neural.c:730
 msgid "Network _name:"
 msgstr "_Nome rete:"
 
-#: modules/process/neural.c:775
+#: modules/process/neural.c:782
 msgid "Apply Neural Network"
 msgstr "Applica Rete Neurale"
 
-#: modules/process/neural.c:798
+#: modules/process/neural.c:805
 msgid "_Scale proportionally to input"
 msgstr "_Scala proporzionalmente al valore in ingresso"
 
-#: modules/process/neural.c:929
+#: modules/process/neural.c:936
 msgid "Model and signal are not compatible."
 msgstr "Modello e segnale non sono compatibili"
 
-#: modules/process/neural.c:937
+#: modules/process/neural.c:944
 msgid "A field dimension is too small for chosen window size."
 msgstr "Una dimensione di campo è troppo piccola per la finestra scelta"
 
-#: modules/process/neural.c:1183 modules/process/neural.c:1349
+#: modules/process/neural.c:1190 modules/process/neural.c:1356
 msgid "Evaluating..."
 msgstr "Valutazione..."
 
-#: modules/process/neural.c:1309
+#: modules/process/neural.c:1316
 msgid "Training was canceled."
 msgstr "Addestramento cancellato"
 
-#: modules/process/neural.c:1319
+#: modules/process/neural.c:1326
 #, c-format
 msgid "Mean difference: %.*f %s"
 msgstr "Differenza media: %.*f %s"
 
-#: modules/process/neural.c:1371
+#: modules/process/neural.c:1378
 msgid "Evaluated signal"
 msgstr "Segnale stimato"
 
-#: modules/process/noise_synth.c:196
+#: modules/process/noise_synth.c:194
 msgid "Generates uncorrelated random noise."
 msgstr "Genera rumore casuale non correlato"
 
-#: modules/process/noise_synth.c:210
+#: modules/process/noise_synth.c:208
 msgid "/S_ynthetic/_Noise..."
 msgstr "/_Sintetico/Rumore..."
 
-#: modules/process/noise_synth.c:214
+#: modules/process/noise_synth.c:212
 msgid "Generate surface of uncorrelated noise"
 msgstr "Generazione superficie di rumore non correlato"
 
-#: modules/process/noise_synth.c:334
+#: modules/process/noise_synth.c:332
 msgid "Random Noise"
 msgstr "Rumore casuale"
 
-#: modules/process/obj_synth.c:274
+#: modules/process/obj_synth.c:270
 msgid "Spheres"
 msgstr "Sfere"
 
-#: modules/process/obj_synth.c:275
+#: modules/process/obj_synth.c:271
 msgid "Boxes"
 msgstr ""
 
-#: modules/process/obj_synth.c:276
+#: modules/process/obj_synth.c:272
 msgid "Cones"
 msgstr "Coni"
 
-#: modules/process/obj_synth.c:277
+#: modules/process/obj_synth.c:273
 msgid "Pyramids"
 msgstr "Piramidi"
 
-#: modules/process/obj_synth.c:278
+#: modules/process/obj_synth.c:274
 msgid "Diamonds"
 msgstr "Rombi"
 
-#: modules/process/obj_synth.c:279
+#: modules/process/obj_synth.c:275
 msgid "Tetrahedrons"
 msgstr "Tetraedri"
 
-#: modules/process/obj_synth.c:280
+#: modules/process/obj_synth.c:276
 msgid "Nuggets"
 msgstr ""
 
-#: modules/process/obj_synth.c:281
+#: modules/process/obj_synth.c:277
 msgid "Thatches"
 msgstr ""
 
-#: modules/process/obj_synth.c:282
+#: modules/process/obj_synth.c:278
 msgid "Tents"
 msgstr ""
 
-#: modules/process/obj_synth.c:283
+#: modules/process/obj_synth.c:279
 msgid "Gaussians"
 msgstr "Gaussiane"
 
-#: modules/process/obj_synth.c:284
+#: modules/process/obj_synth.c:280
 msgid "Doughnuts"
 msgstr ""
 
-#: modules/process/obj_synth.c:285
+#: modules/process/obj_synth.c:281
 #, fuzzy
 msgid "Parabolic bumps"
 msgstr "Passo parabolico"
 
-#: modules/process/obj_synth.c:291
+#: modules/process/obj_synth.c:287
 msgid "Generates randomly patterned surfaces by placing objects."
 msgstr "Generazione casuali superfici dal posizionamento di oggetti"
 
-#: modules/process/obj_synth.c:305
-msgid "/S_ynthetic/_Objects..."
+#: modules/process/obj_synth.c:301
+#, fuzzy
+msgid "/S_ynthetic/_Deposition/_Objects..."
 msgstr "/Sintetico/_Oggetti..."
 
-#: modules/process/obj_synth.c:309
+#: modules/process/obj_synth.c:305
 msgid "Generate surface of randomly placed objects"
 msgstr "Generazione superficie di oggetti collocati casualmente"
 
-#: modules/process/obj_synth.c:424
+#: modules/process/obj_synth.c:421
 msgid "Both (random)"
 msgstr "Entrambi (casuale)"
 
-#: modules/process/obj_synth.c:439
+#: modules/process/obj_synth.c:436
 msgid "Random Objects"
 msgstr "Oggetti casuali"
 
-#: modules/process/obj_synth.c:513
-msgid "_Shape:"
-msgstr "Figura:"
-
-#: modules/process/obj_synth.c:531
-msgid "obj."
-msgstr "obj."
-
-#: modules/process/obj_synth.c:551
+#: modules/process/obj_synth.c:549
 msgid "Aspect Ratio"
 msgstr "Proporzioni"
 
-#: modules/process/obj_synth.c:558
+#: modules/process/obj_synth.c:556
 msgid "_Aspect ratio:"
 msgstr "Proporzioni"
 
-#: modules/process/obj_synth.c:588
+#: modules/process/obj_synth.c:586
 msgid "Scales _with size"
 msgstr "Scala con dimensioni"
 
-#: modules/process/obj_synth.c:612
+#: modules/process/obj_synth.c:611
 msgid "_Feature type:"
 msgstr "_Tipo Caratteristica:"
 
-#: modules/process/obj_synth.c:807
-msgid "_Truncate:"
-msgstr "_Truncato:"
-
-#: modules/process/otsu_threshold.c:39 modules/process/otsu_threshold.c:59
+#: modules/process/otsu_threshold.c:40 modules/process/otsu_threshold.c:60
 msgid "Automated threshold using Otsu's method on heights."
 msgstr "Soglia automatica utilizzando il metodo di Otsu sulle altezze"
 
-#: modules/process/otsu_threshold.c:55
-msgid "/_Grains/_Mark by Otsu's..."
+#: modules/process/otsu_threshold.c:56
+#, fuzzy
+msgid "/_Grains/_Mark by Otsu's"
 msgstr "/_Grani/Segna per Otsu's..."
 
-#: modules/process/outliers.c:40
+#: modules/process/outliers.c:41
 msgid "Creates mask of outliers."
 msgstr "Crea maschera di outliers."
 
-#: modules/process/outliers.c:54
+#: modules/process/outliers.c:55
 msgid "/_Correct Data/Mask of _Outliers"
 msgstr "/_Correzione Dati/Maschera di _Outliers"
 
-#: modules/process/outliers.c:58
+#: modules/process/outliers.c:59
 msgid "Mark data farther than 3σ from mean value"
 msgstr "Segna dati più lontani di 3σ dal valore medio"
 
@@ -12075,80 +12719,104 @@ msgstr "Schema"
 msgid "_Pattern:"
 msgstr "Schema:"
 
-#: modules/process/pat_synth.c:812
+#: modules/process/pat_synth.c:813
 msgid "Flat"
 msgstr "Piatto"
 
-#: modules/process/pat_synth.c:820
+#: modules/process/pat_synth.c:821
 msgid "_Flat width:"
 msgstr ""
 
-#: modules/process/pat_synth.c:837 modules/process/pat_synth.c:1139
-#: modules/process/pat_synth.c:1474
+#: modules/process/pat_synth.c:838 modules/process/pat_synth.c:1140
+#: modules/process/pat_synth.c:1475
 msgid "_Slope width:"
 msgstr "Larghezza _Pendenza:"
 
-#: modules/process/pat_synth.c:1099
+#: modules/process/pat_synth.c:1100
 msgid "Top"
 msgstr "Sopra"
 
-#: modules/process/pat_synth.c:1106
+#: modules/process/pat_synth.c:1107
 msgid "Flat _top width:"
 msgstr ""
 
-#: modules/process/pat_synth.c:1114
+#: modules/process/pat_synth.c:1115
 msgid "Bottom"
 msgstr ""
 
-#: modules/process/pat_synth.c:1122
+#: modules/process/pat_synth.c:1123
 msgid "Flat _bottom width:"
 msgstr ""
 
-#: modules/process/pat_synth.c:1440
+#: modules/process/pat_synth.c:1441
 msgid "_Distance:"
 msgstr "_Distanza:"
 
-#: modules/process/pid.c:96
+#: modules/process/phase_synth.c:136
+#, fuzzy
+msgid "Generates phase-separated structures."
+msgstr "Generazione superficie con schema"
+
+#: modules/process/phase_synth.c:150
+#, fuzzy
+msgid "/S_ynthetic/P_hases..."
+msgstr "/Sintetico/Onde ..."
+
+#: modules/process/phase_synth.c:154
+#, fuzzy
+msgid "Generate surface with separated phases"
+msgstr "Generazione superficie di rumore non correlato"
+
+#: modules/process/phase_synth.c:203
+#, fuzzy
+msgid "Separated Phases"
+msgstr "Curve _Separate"
+
+#: modules/process/phase_synth.c:287
+msgid "Size s_pread:"
+msgstr ""
+
+#: modules/process/pid.c:95
 msgid "A simple PID simulator"
 msgstr "Un semplice simulatore PID"
 
-#: modules/process/pid.c:110
+#: modules/process/pid.c:109
 msgid "/_Tip and Indentation/_PID simulation..."
 msgstr "/Punta e Indentazione/Simulazione PID..."
 
-#: modules/process/pid.c:114
+#: modules/process/pid.c:113
 msgid "Simulate PID effects on measurement"
 msgstr "Simulazione effetti PID sulla misura"
 
-#: modules/process/pid.c:158
+#: modules/process/pid.c:157
 msgid "PID FW result"
 msgstr ""
 
-#: modules/process/pid.c:167
+#: modules/process/pid.c:166
 msgid "PID FW max. force"
 msgstr ""
 
-#: modules/process/pid.c:176
+#: modules/process/pid.c:175
 msgid "PID REV result"
 msgstr ""
 
-#: modules/process/pid.c:185
+#: modules/process/pid.c:184
 msgid "PID REV max. force"
 msgstr ""
 
-#: modules/process/pid.c:198
+#: modules/process/pid.c:196
 msgid "PID simulation"
 msgstr ""
 
-#: modules/process/pid.c:215
+#: modules/process/pid.c:214
 msgid "_Proportional:"
 msgstr "_proporzionale:"
 
-#: modules/process/pid.c:221
+#: modules/process/pid.c:220
 msgid "_Integral:"
 msgstr "_Integrale:"
 
-#: modules/process/pid.c:227
+#: modules/process/pid.c:226
 msgid "_Integration steps:"
 msgstr ""
 
@@ -12156,15 +12824,15 @@ msgstr ""
 msgid "_Derivative:"
 msgstr "_derivativo:"
 
-#: modules/process/pid.c:241
+#: modules/process/pid.c:240
 msgid "PID/scan speed _ratio:"
 msgstr ""
 
-#: modules/process/pid.c:253
+#: modules/process/pid.c:255
 msgid "Force strength:"
 msgstr "Intensità forza:"
 
-#: modules/process/pid.c:259
+#: modules/process/pid.c:261
 msgid "Force setpoint:"
 msgstr ""
 
@@ -12172,7 +12840,7 @@ msgstr ""
 msgid "Scanning..."
 msgstr "Scansione..."
 
-#: modules/process/pid.c:396
+#: modules/process/pid.c:401
 msgid "Computation diverged, try to change parameters"
 msgstr ""
 
@@ -12192,23 +12860,23 @@ msgstr "Applica distorsione polinomiale nel piano orizzontal"
 msgid "Distort by Polynomial"
 msgstr "Distorsione polinomiale"
 
-#: modules/process/polydistort.c:282
+#: modules/process/polydistort.c:285
 msgid "Ori_ginal"
 msgstr "Originale"
 
-#: modules/process/polydistort.c:283
+#: modules/process/polydistort.c:286
 msgid "_Transformed"
 msgstr "_Trasformato"
 
-#: modules/process/polydistort.c:289
+#: modules/process/polydistort.c:292
 msgid "X Coefficients"
 msgstr "Coefficienti X "
 
-#: modules/process/polydistort.c:303
+#: modules/process/polydistort.c:306
 msgid "Y Coefficients"
 msgstr "Coefficienti Y"
 
-#: modules/process/polydistort.c:499
+#: modules/process/polydistort.c:502
 msgid "Distorted"
 msgstr "Distorti"
 
@@ -12244,23 +12912,23 @@ msgstr "Dati livellati"
 msgid "_Horizontal polynom degree:"
 msgstr "Grado polinomio orizzontale:"
 
-#: modules/process/polylevel.c:450
+#: modules/process/polylevel.c:451
 msgid "_Vertical polynom degree:"
 msgstr "Grado polinomio verticale:"
 
-#: modules/process/polylevel.c:456
+#: modules/process/polylevel.c:458
 msgid "_Same degrees"
 msgstr "Gradi uguali"
 
-#: modules/process/polylevel.c:474
+#: modules/process/polylevel.c:476
 msgid "_Maximum polynom degree:"
 msgstr "Grado massimo polinomio:"
 
-#: modules/process/polylevel.c:561
+#: modules/process/polylevel.c:564
 msgid "Polynomial Coefficients"
 msgstr "Coefficienti Polinomiali"
 
-#: modules/process/polylevel.c:934 modules/tools/distance.c:594
+#: modules/process/polylevel.c:937 modules/tools/distance.c:594
 #: modules/tools/selectionmanager.c:720
 msgid "Save Table"
 msgstr "Salva tavola"
@@ -12282,7 +12950,8 @@ msgid "/_Presentation/E_xtract Presentation"
 msgstr "/_Presentazione/E_strazione Presentazione"
 
 #: modules/process/presentationops.c:81
-msgid "Extract presentation to a new channel"
+#, fuzzy
+msgid "Extract presentation to a new image"
 msgstr "Estrae presentazione in un nuovo canale"
 
 #: modules/process/presentationops.c:84
@@ -12309,6 +12978,11 @@ msgstr "Allega Presentazione"
 msgid "_Data to attach:"
 msgstr "_Dati da allegare:"
 
+#: modules/process/preview.h:245
+#, fuzzy
+msgid "Combine with existing mask:"
+msgstr "Unisci a maschera esistente"
+
 #: modules/process/psdf_logphi.c:76
 msgid ""
 "Two-dimensional FFT (Fast Fourier Transform) transformed to coordinates (log-"
@@ -12329,10 +13003,90 @@ msgstr "Calcola PSDF in coordinate Log-Phi"
 msgid "Log-Phi PSDF"
 msgstr "Log-Phi PSDF"
 
-#: modules/process/psdf_logphi.c:275 modules/process/wpour_mark.c:320
+#: modules/process/psdf_logphi.c:276 modules/process/wpour_mark.c:320
 msgid "Gaussian _smoothing:"
 msgstr "Appianamento Gaussiano:"
 
+#: modules/process/psf-fit.c:165
+#, fuzzy
+msgid "Gaussian (asymmetric)"
+msgstr "Appianamento Gaussiano:"
+
+#: modules/process/psf-fit.c:177
+msgid "Point spread function estimation by fitting explicit function form."
+msgstr ""
+
+#: modules/process/psf-fit.c:191
+#, fuzzy
+msgid "/_Statistics/_PSF Fit..."
+msgstr "/_Statistica/Sezione _PSDF..."
+
+#: modules/process/psf-fit.c:195
+msgid "Fit PSF from known data and image"
+msgstr ""
+
+#: modules/process/psf-fit.c:246 modules/process/psf.c:181
+#: modules/process/psf.c:230
+#, fuzzy
+msgid "PSF"
+msgstr "PSDF"
+
+#: modules/process/psf-fit.c:254 modules/process/psf.c:195
+msgid "PSF*P"
+msgstr ""
+
+#: modules/process/psf-fit.c:271
+#, fuzzy
+msgid "Fit PSF"
+msgstr "Adatta Figura"
+
+#: modules/process/psf-fit.c:289 modules/process/psf.c:286
+msgid "_Ideal response:"
+msgstr ""
+
+#: modules/process/psf.c:117
+#, fuzzy
+msgid "Point spread function estimation"
+msgstr "Stima cieca punta"
+
+#: modules/process/psf.c:131
+#, fuzzy
+msgid "/_Statistics/_PSF Guess..."
+msgstr "/_Statistica/Sezione _PSDF..."
+
+#: modules/process/psf.c:135
+msgid "Estimate PSF from known data and image"
+msgstr ""
+
+#: modules/process/psf.c:208
+msgid "PSF*P - I"
+msgstr ""
+
+#: modules/process/psf.c:231
+#, fuzzy
+msgid "Convolved"
+msgstr "_LoG convoluto"
+
+#: modules/process/psf.c:237
+#, fuzzy
+msgid "Estimate PSF"
+msgstr "Stima"
+
+#: modules/process/psf.c:238
+#, fuzzy
+msgid "_Fit"
+msgstr "Adatta"
+
+#: modules/process/psf.c:295
+#, fuzzy
+msgid "_Display:"
+msgstr "Mostra:"
+
+#: modules/process/psf.c:301
+#, fuzzy
+msgid "_Sigma init:"
+msgstr "_Segnale"
+
 #: modules/process/rank.c:92
 msgid "Enhances local contrast using a rank transform."
 msgstr "Accentua contrasto locale utilizzando una trasformazione di ordine"
@@ -12383,7 +13137,7 @@ msgstr "/Operazioni _Base/Ruota di _Angolo..."
 msgid "Rotate by arbitrary angle"
 msgstr "Ruota di angolo arbitrario"
 
-#: modules/process/rotate.c:192
+#: modules/process/rotate.c:192 modules/volume/volume_swaxes.c:651
 msgid "Rotated Data"
 msgstr "Dati ruotati"
 
@@ -12439,63 +13193,63 @@ msgstr "Dati scalati"
 msgid "verb|Scale"
 msgstr "Scala"
 
-#: modules/process/scale.c:216
+#: modules/process/scale.c:217
 msgid "Scale by _ratio:"
 msgstr "Scala di un fattore:"
 
-#: modules/process/scale.c:224
+#: modules/process/scale.c:225
 msgid "_proportional"
 msgstr "_proporzionale"
 
-#: modules/process/scale.c:235
+#: modules/process/scale.c:237
 msgid "New _width:"
 msgstr "Nuova Larghezza:"
 
-#: modules/process/scale.c:243
+#: modules/process/scale.c:246
 msgid "New _height:"
 msgstr "Nuova Altezza:"
 
-#: modules/process/scars.c:113
+#: modules/process/scars.c:122
 msgid "Marks and/or removes scars (horizontal linear artifacts)."
 msgstr "Evidenzia e/o rimuove salti (artefatti lineari orizzontali)."
 
-#: modules/process/scars.c:127
+#: modules/process/scars.c:136
 msgid "/_Correct Data/M_ark Scars..."
 msgstr "/_Correzione Dati/Segna danni"
 
-#: modules/process/scars.c:131
+#: modules/process/scars.c:140
 msgid "Mark horizontal scars (strokes)"
 msgstr "Segna danni orizzontali (strappi)"
 
-#: modules/process/scars.c:134
+#: modules/process/scars.c:143
 msgid "/_Correct Data/Remove _Scars"
 msgstr "/_Correzione Dati/Rimuovi danni"
 
-#: modules/process/scars.c:138
+#: modules/process/scars.c:147
 msgid "Correct horizontal scars (strokes)"
 msgstr "Correzione danni orizzontali (strappi)"
 
-#: modules/process/scars.c:293
+#: modules/process/scars.c:312
 msgid "Mark Scars"
 msgstr "Segna danni"
 
-#: modules/process/scars.c:331
+#: modules/process/scars.c:353
 msgid "Maximum _width:"
 msgstr "Larghezza massima:"
 
-#: modules/process/scars.c:338
+#: modules/process/scars.c:361
 msgid "Minimum _length:"
 msgstr "Lunghezza minima:"
 
-#: modules/process/scars.c:345
+#: modules/process/scars.c:369
 msgid "_Hard threshold:"
 msgstr "Soglia dura:"
 
-#: modules/process/scars.c:353
+#: modules/process/scars.c:377
 msgid "_Soft threshold:"
 msgstr "Soglia morbida:"
 
-#: modules/process/scars.c:361
+#: modules/process/scars.c:385
 msgid "Scars type:"
 msgstr "Tipo danni:"
 
@@ -12535,27 +13289,27 @@ msgstr "Monte Carlo"
 msgid "_Quality:"
 msgstr "_Qualità:"
 
-#: modules/process/shade.c:92
+#: modules/process/shade.c:94
 msgid "Creates a shaded presentation of data."
 msgstr "Crea una presentazione dati ombreggiata"
 
-#: modules/process/shade.c:106
+#: modules/process/shade.c:108
 msgid "/_Presentation/_Shading..."
 msgstr "/_Presentazione/_Ombreggiatura..."
 
-#: modules/process/shade.c:110
+#: modules/process/shade.c:112
 msgid "Shade data"
 msgstr "Ombreggia dati"
 
-#: modules/process/shade.c:207
+#: modules/process/shade.c:209
 msgid "Shading"
 msgstr "Ombreggiatura"
 
-#: modules/process/shade.c:253
+#: modules/process/shade.c:260
 msgid "_Mix:"
 msgstr "_Mescola:"
 
-#: modules/process/slope_dist.c:161
+#: modules/process/slope_dist.c:160
 msgid ""
 "Calculates one- or two-dimensional distribution of slopes or graph of their "
 "angular distribution."
@@ -12563,83 +13317,138 @@ msgstr ""
 "Calcola distribuzione di pendenze in due dimensioni o grafici della loro "
 "distribuzione angolare"
 
-#: modules/process/slope_dist.c:176
+#: modules/process/slope_dist.c:175
 msgid "/_Statistics/_Slope Distribution..."
 msgstr "/_Statistica/Distribuzione pendenza..."
 
-#: modules/process/slope_dist.c:180
+#: modules/process/slope_dist.c:179
 msgid "Calculate angular slope distribution"
 msgstr "Calcola distribuzione pendenza angolare"
 
-#: modules/process/slope_dist.c:221
+#: modules/process/slope_dist.c:220
 msgid "Slope distribution"
 msgstr "Distribuzione pendenza"
 
-#: modules/process/slope_dist.c:253
+#: modules/process/slope_dist.c:252
 msgid "_Two-dimensional distribution"
 msgstr "Distribuzione bi-dimensionale"
 
-#: modules/process/slope_dist.c:254
+#: modules/process/slope_dist.c:253
 msgid "Directional (φ) _graph"
 msgstr "_Grafico direzionale (φ) "
 
-#: modules/process/slope_dist.c:255
+#: modules/process/slope_dist.c:254
 msgid "_Inclination (θ) graph"
 msgstr "Grafico _Inclinazione θ"
 
-#: modules/process/slope_dist.c:256
+#: modules/process/slope_dist.c:255
 msgid "Inclination (gra_dient) graph"
 msgstr "Inclinazione (gra_diente) grafico"
 
-#: modules/process/slope_dist.c:270
+#: modules/process/slope_dist.c:269
 msgid "Slope Distribution"
 msgstr "Distribuzione Pendenza"
 
-#: modules/process/slope_dist.c:755
+#: modules/process/slope_dist.c:749
 msgid "Angular Slope Distribution"
 msgstr "Distribuzione pendenza angolare"
 
-#: modules/process/slope_dist.c:763 modules/process/tilt.c:179
+#: modules/process/slope_dist.c:757 modules/process/tilt.c:179
 msgid "Slopes"
 msgstr "_Pendenza:"
 
-#: modules/process/slope_dist.c:824 modules/process/slope_dist.c:893
+#: modules/process/slope_dist.c:818 modules/process/slope_dist.c:887
 msgid "Inclination Distribution"
 msgstr "Distribuzione inclinazioni"
 
-#: modules/process/slope_dist.c:832 modules/process/slope_dist.c:901
+#: modules/process/slope_dist.c:826 modules/process/slope_dist.c:895
 msgid "Inclinations"
 msgstr "Inclinazioni"
 
-#: modules/process/sphere-revolve.c:97
+#: modules/process/sphere-revolve.c:111
 msgid "Subtracts background by arc or sphere revolution."
 msgstr ""
 "Sottrae sottofondo ottenuto dalla rivoluzione di un arco o di una sfera"
 
-#: modules/process/sphere-revolve.c:113
+#: modules/process/sphere-revolve.c:125
 msgid "/_Level/Revolve _Arc..."
 msgstr "/_Livella/Ruota _Arco..."
 
-#: modules/process/sphere-revolve.c:117
+#: modules/process/sphere-revolve.c:129
 msgid "Level data by arc revolution"
 msgstr "Livella dati per rivoluzione arco"
 
-#: modules/process/sphere-revolve.c:208 modules/tools/sfunctions.c:371
+#: modules/process/sphere-revolve.c:132
+#, fuzzy
+msgid "/_Level/Revolve _Sphere..."
+msgstr "/_Livella/Ruota _Arco..."
+
+#: modules/process/sphere-revolve.c:136
+#, fuzzy
+msgid "Level data by sphere revolution"
+msgstr "Livella dati per rivoluzione arco"
+
+#: modules/process/sphere-revolve.c:303 modules/tools/sfunctions.c:381
 msgid "_Horizontal direction"
 msgstr "Direzione orizzontale"
 
-#: modules/process/sphere-revolve.c:209 modules/tools/sfunctions.c:372
+#: modules/process/sphere-revolve.c:304 modules/tools/sfunctions.c:382
 msgid "_Vertical direction"
 msgstr "Direzione verticale"
 
-#: modules/process/sphere-revolve.c:210
+#: modules/process/sphere-revolve.c:305
 msgid "_Both directions"
 msgstr "Entrambe le direzioni"
 
-#: modules/process/sphere-revolve.c:217
+#: modules/process/sphere-revolve.c:315
+#, fuzzy
+msgid "Revolve Sphere"
+msgstr "Ruota Arco"
+
+#: modules/process/sphere-revolve.c:315
 msgid "Revolve Arc"
 msgstr "Ruota Arco"
 
+#: modules/process/sphere-revolve.c:355
+msgid "Direction:"
+msgstr "Direzione:"
+
+#: modules/process/sphere-revolve.c:699
+#, fuzzy
+msgid "Revolving sphere..."
+msgstr "Altezze rilassamento..."
+
+#: modules/process/stitch.c:135
+msgid "Stitch multiple images based on offsets of origins."
+msgstr ""
+
+#: modules/process/stitch.c:149
+#, fuzzy
+msgid "/M_ultidata/_Stitch..."
+msgstr "/Dati _Multipli/_Aritmetica..."
+
+#: modules/process/stitch.c:153
+msgid "Stitch images using offsets"
+msgstr ""
+
+#: modules/process/stitch.c:269
+msgid "Stitch"
+msgstr ""
+
+#: modules/process/stitch.c:312
+msgid "Channels"
+msgstr "Canali"
+
+#: modules/process/stitch.c:435
+#, fuzzy
+msgid "Restore"
+msgstr "Ripris_tina"
+
+#: modules/process/stitch.c:445 modules/tools/linestats.c:379
+#: modules/tools/sfunctions.c:440 modules/tools/stats.c:406
+msgid "_Instant updates"
+msgstr "_Aggiornamento immediato"
+
 #: modules/process/straighten_path.c:126
 msgid "Extracts a straightened part of image along a curve."
 msgstr ""
@@ -12656,28 +13465,28 @@ msgstr ""
 msgid "Straighten Path"
 msgstr ""
 
-#: modules/process/straighten_path.c:254
+#: modules/process/straighten_path.c:253
 msgid "Res_tore"
 msgstr "Ripris_tina"
 
-#: modules/process/straighten_path.c:259
+#: modules/process/straighten_path.c:258
 msgid "Re_verse"
 msgstr "Inverti"
 
 #: modules/process/straighten_path.c:278 modules/tools/pathlevel.c:256
-#: modules/tools/profile.c:507 modules/tools/roughness.c:854
+#: modules/tools/profile.c:503 modules/tools/roughness.c:868
 msgid "_Thickness:"
 msgstr "_Spessore:"
 
-#: modules/process/straighten_path.c:286
+#: modules/process/straighten_path.c:287
 msgid "_Slackness:"
 msgstr ""
 
-#: modules/process/straighten_path.c:292
+#: modules/process/straighten_path.c:293
 msgid "C_losed curve"
 msgstr ""
 
-#: modules/process/straighten_path.c:379
+#: modules/process/straighten_path.c:380
 msgid "Straightened"
 msgstr ""
 
@@ -12699,52 +13508,52 @@ msgstr "Super-risoluzione di immagini multiple dello stesso oggetto"
 msgid "Supres"
 msgstr ""
 
-#: modules/process/superresolution.c:421
+#: modules/process/superresolution.c:420
 msgid "Correlating to determine mean shift..."
 msgstr "Correlazione per determinare lo scarto medio"
 
-#: modules/process/superresolution.c:511
+#: modules/process/superresolution.c:510
 msgid "Cross-correlation..."
 msgstr "Correlazione incrociata.."
 
-#: modules/process/superresolution.c:554 modules/xyz/xyz_raster.c:1079
-#: modules/xyz/xyz_raster.c:1119
+#: modules/process/superresolution.c:553 modules/xyz/xyz_raster.c:1053
+#: modules/xyz/xyz_raster.c:1093
 msgid "Interpolating..."
 msgstr "Interpolazione..."
 
-#: modules/process/synth.h:343
+#: modules/process/synth.h:344
 msgid "Roundness"
 msgstr ""
 
-#: modules/process/synth.h:351
+#: modules/process/synth.h:352
 msgid "Roundn_ess:"
 msgstr ""
 
-#: modules/process/synth.h:399
+#: modules/process/synth.h:401
 msgid "Orientation"
 msgstr "Orientazione"
 
-#: modules/process/synth.h:408
+#: modules/process/synth.h:410
 msgid "Orien_tation:"
 msgstr "Orien_tazione:"
 
-#: modules/process/synth.h:432
+#: modules/process/synth.h:436
+msgid "_Truncate:"
+msgstr "_Truncato:"
+
+#: modules/process/synth.h:460
 msgid "Variance:"
 msgstr "Varianza:"
 
-#: modules/process/synth.h:456
-msgid "Deformation"
-msgstr "Deformazione"
-
-#: modules/process/synth.h:464
+#: modules/process/synth.h:493
 msgid "_Amplitude:"
 msgstr "_Ampiezza:"
 
-#: modules/process/synth.h:472
+#: modules/process/synth.h:501
 msgid "_Lateral scale:"
 msgstr "Scala _Laterale:"
 
-#: modules/process/synth.h:566
+#: modules/process/synth.h:595
 msgid "Randomi_ze"
 msgstr "Randomi_zza"
 
@@ -12760,41 +13569,41 @@ msgstr "/Operazioni _Base/Intervallo Li_mite..."
 msgid "Limit data range"
 msgstr "Intervallo dati limite"
 
-#: modules/process/threshold.c:246
+#: modules/process/threshold.c:241
 msgid "Limit Range"
 msgstr "Intervallo Limite"
 
-#: modules/process/threshold.c:281
+#: modules/process/threshold.c:276
 msgid "Specify _thresholds"
 msgstr "Specifica soglie"
 
-#: modules/process/threshold.c:283
+#: modules/process/threshold.c:278
 msgid "Use _display range"
 msgstr ""
 
-#: modules/process/threshold.c:285
+#: modules/process/threshold.c:280
 msgid "Cut off outlier_s"
 msgstr ""
 
-#: modules/process/threshold.c:294
+#: modules/process/threshold.c:289
 msgid "_Lower:"
 msgstr "Inferiore:"
 
-#: modules/process/threshold.c:300
+#: modules/process/threshold.c:295
 msgid "_Upper:"
 msgstr "Superiore:"
 
-#: modules/process/threshold.c:305
+#: modules/process/threshold.c:300
 msgid "Set to _Full Range"
 msgstr "Assegna Intervallo totale "
 
 #. TRANSLATORS: This is a range: 123 to 456.
-#: modules/process/threshold.c:318
+#: modules/process/threshold.c:313
 #, c-format
 msgid "%.*f to %.*f"
 msgstr "da %.*f a %.*f"
 
-#: modules/process/threshold.c:341
+#: modules/process/threshold.c:336
 msgid "F_arther than:"
 msgstr ""
 
@@ -12814,11 +13623,11 @@ msgstr "Inclina di quantità data"
 msgid "Tilt"
 msgstr "Inclina"
 
-#: modules/process/tilt.c:185 modules/volume/volume_slice.c:444
+#: modules/process/tilt.c:185 modules/volume/volume_slice.c:446
 msgid "_X:"
 msgstr "_X:"
 
-#: modules/process/tilt.c:194 modules/volume/volume_slice.c:464
+#: modules/process/tilt.c:194 modules/volume/volume_slice.c:469
 msgid "_Y:"
 msgstr "_Y:"
 
@@ -12826,31 +13635,31 @@ msgstr "_Y:"
 msgid "Angles"
 msgstr "Angoli"
 
-#: modules/process/tip_blind.c:178
+#: modules/process/tip_blind.c:177
 msgid "Blind estimation of SPM tip using Villarubia's algorithm."
 msgstr "Stima cieca della punta SPM con l'algoritmo di Villarubia"
 
-#: modules/process/tip_blind.c:192
+#: modules/process/tip_blind.c:191
 msgid "/_Tip and Indentation/_Blind Estimation..."
 msgstr "/Punta e Indentazione/Stima Cieca..."
 
-#: modules/process/tip_blind.c:196
+#: modules/process/tip_blind.c:195
 msgid "Blind tip estimation"
 msgstr "Stima cieca punta"
 
-#: modules/process/tip_blind.c:231
+#: modules/process/tip_blind.c:230
 msgid "Blind Tip Estimation"
 msgstr "Stima Cieca, Punta"
 
-#: modules/process/tip_blind.c:232
+#: modules/process/tip_blind.c:231
 msgid "Run _Partial"
 msgstr "Esegui _Parziale"
 
-#: modules/process/tip_blind.c:233
+#: modules/process/tip_blind.c:232
 msgid "Run _Full"
 msgstr "Esegui Completo"
 
-#: modules/process/tip_blind.c:234
+#: modules/process/tip_blind.c:233
 msgid "_Reset Tip"
 msgstr "Azzera punta"
 
@@ -12858,77 +13667,77 @@ msgstr "Azzera punta"
 msgid "Related _data:"
 msgstr "Dati correlati:"
 
-#: modules/process/tip_blind.c:326
+#: modules/process/tip_blind.c:327
 msgid "Estimated Tip Size"
 msgstr "Dimensioni punta stimate"
 
-#: modules/process/tip_blind.c:347
+#: modules/process/tip_blind.c:350
 msgid "_Same resolution"
 msgstr "Uguale risoluzione"
 
-#: modules/process/tip_blind.c:366
+#: modules/process/tip_blind.c:376
 msgid "Noise suppression t_hreshold:"
 msgstr "Soglia soppressione rumore:"
 
-#: modules/process/tip_blind.c:386
+#: modules/process/tip_blind.c:384
 msgid "Use _boundaries"
 msgstr "Usa confini"
 
-#: modules/process/tip_blind.c:396
+#: modules/process/tip_blind.c:395
 msgid "Stripes"
 msgstr "Strisce"
 
-#: modules/process/tip_blind.c:402
+#: modules/process/tip_blind.c:401
 msgid "_Split to stripes:"
 msgstr "dividi in strisce:"
 
-#: modules/process/tip_blind.c:416
+#: modules/process/tip_blind.c:412
 msgid "_Preview stripe:"
 msgstr "Anteprima strisce:"
 
-#: modules/process/tip_blind.c:423
+#: modules/process/tip_blind.c:420
 msgid "Plot size _graph"
 msgstr ""
 
-#: modules/process/tip_blind.c:433
+#: modules/process/tip_blind.c:430
 msgid "Create tip i_mages"
 msgstr "Crea i_mmagini punta"
 
 #. TRANSLATORS: Prefix for the progressbar message.
-#: modules/process/tip_blind.c:810
+#: modules/process/tip_blind.c:807
 #, c-format
 msgid "Stripe %u: "
 msgstr "Striscia %u: "
 
-#: modules/process/tip_blind.c:917 modules/process/tip_blind.c:941
+#: modules/process/tip_blind.c:914 modules/process/tip_blind.c:938
 msgid "Estimated tip"
 msgstr "Punta stimata"
 
-#: modules/process/tip_blind.c:1207 modules/process/tip_blind.c:1216
+#: modules/process/tip_blind.c:1204 modules/process/tip_blind.c:1213
 msgid "Tip radius evolution"
 msgstr "Evoluzione raggio punta"
 
-#: modules/process/tip_model.c:114
+#: modules/process/tip_model.c:112
 msgid "Models SPM tip."
 msgstr "Modella punte SPM"
 
-#: modules/process/tip_model.c:129
+#: modules/process/tip_model.c:127
 msgid "/_Tip and Indentation/_Model Tip..."
 msgstr "/Punta e Indentazione/_Modello Punta"
 
-#: modules/process/tip_model.c:133
+#: modules/process/tip_model.c:131
 msgid "Model AFM tip"
 msgstr "Modello punta AFM"
 
-#: modules/process/tip_model.c:164
+#: modules/process/tip_model.c:162
 msgid "Model Tip"
 msgstr "Modello punta"
 
-#: modules/process/tip_model.c:224
+#: modules/process/tip_model.c:222
 msgid "Tip _type:"
 msgstr "Tipo Punta"
 
-#: modules/process/tip_model.c:229
+#: modules/process/tip_model.c:228
 msgid "_Number of sides:"
 msgstr "_Numero facce:"
 
@@ -12940,20 +13749,20 @@ msgstr "Pendenza Punta"
 msgid "Tip _rotation:"
 msgstr "Rotazione Punta"
 
-#: modules/process/tip_model.c:250
+#: modules/process/tip_model.c:255
 msgid "Tip _apex radius:"
 msgstr "Raggio apicale punta:"
 
-#: modules/process/tip_model.c:269
+#: modules/process/tip_model.c:265
 #, fuzzy
 msgid "Tip _anisotropy:"
 msgstr "DWT Anisotropa"
 
-#: modules/process/tip_model.c:490
+#: modules/process/tip_model.c:484
 msgid "Modeled tip"
 msgstr "Punta modellata"
 
-#: modules/process/tip_model.c:562
+#: modules/process/tip_model.c:556
 #, c-format
 msgid "Tip resolution: %d × %d pixels"
 msgstr "Risoluzione punta: %d × %d pixels"
@@ -13062,7 +13871,8 @@ msgid "Converts datafield to 3D volume data."
 msgstr "Converte il campo dati in dati volume 3D"
 
 #: modules/process/volumize.c:56
-msgid "/_Basic Operations/Volumize..."
+#, fuzzy
+msgid "/_Basic Operations/Volumize"
 msgstr "/Operazioni _Base/Volumizzazione..."
 
 #: modules/process/volumize.c:60
@@ -13107,73 +13917,77 @@ msgstr "risoluzione _Z :"
 msgid "Z _range:"
 msgstr "Intervallo Z:"
 
-#: modules/process/wave_synth.c:211
+#: modules/process/wave_synth.c:219
 msgid "Generates various kinds of waves."
 msgstr "Generazione di vari tipi di onde"
 
-#: modules/process/wave_synth.c:225
+#: modules/process/wave_synth.c:233
 msgid "/S_ynthetic/_Waves..."
 msgstr "/Sintetico/Onde ..."
 
-#: modules/process/wave_synth.c:229
+#: modules/process/wave_synth.c:237
 msgid "Generate waves"
 msgstr "Generazione onde"
 
-#: modules/process/wave_synth.c:347
+#: modules/process/wave_synth.c:366
 msgid "Waves"
 msgstr "Onde"
 
-#: modules/process/wave_synth.c:422 modules/tools/linestats.c:337
-#: modules/tools/sfunctions.c:401 modules/volume/volume_linestat.c:369
+#: modules/process/wave_synth.c:441 modules/tools/linestats.c:337
+#: modules/tools/sfunctions.c:411 modules/volume/volume_linestat.c:374
 msgid "_Quantity:"
 msgstr "_Quantità:"
 
-#: modules/process/wave_synth.c:429
+#: modules/process/wave_synth.c:448
 msgid "_Number of waves:"
 msgstr "_Numero di onde:"
 
-#: modules/process/wave_synth.c:436 modules/process/wave_synth.c:582
-#: modules/tools/roughness.c:274
+#: modules/process/wave_synth.c:455 modules/process/wave_synth.c:617
+#: modules/tools/roughness.c:275
 msgid "Amplitude"
 msgstr "Ampiezza"
 
-#: modules/process/wave_synth.c:441
+#: modules/process/wave_synth.c:460
 msgid "_Wave form:"
 msgstr "Forma ondai:"
 
-#: modules/process/wave_synth.c:448
+#: modules/process/wave_synth.c:467
 msgid "Amplitude:"
 msgstr "Ampiezza:"
 
-#: modules/process/wave_synth.c:466
+#: modules/process/wave_synth.c:487
+msgid "_Decay:"
+msgstr ""
+
+#: modules/process/wave_synth.c:497
 msgid "Frequency"
 msgstr "Frequenza"
 
-#: modules/process/wave_synth.c:472
+#: modules/process/wave_synth.c:503
 msgid "_Spatial frequency:"
 msgstr "Frequenza _Spaziale:"
 
-#: modules/process/wave_synth.c:488
+#: modules/process/wave_synth.c:519
 msgid "_X center:"
 msgstr ""
 
-#: modules/process/wave_synth.c:499
+#: modules/process/wave_synth.c:532
 msgid "_Y center:"
 msgstr ""
 
-#: modules/process/wave_synth.c:565
+#: modules/process/wave_synth.c:600
 msgid "Cosine"
 msgstr "Coseno"
 
-#: modules/process/wave_synth.c:566
+#: modules/process/wave_synth.c:601
 msgid "Inverse cosh"
 msgstr ""
 
-#: modules/process/wave_synth.c:567
+#: modules/process/wave_synth.c:602
 msgid "Flat top"
 msgstr ""
 
-#: modules/process/wave_synth.c:581
+#: modules/process/wave_synth.c:616
 msgid "Displacement"
 msgstr "Spostamento"
 
@@ -13257,39 +14071,39 @@ msgstr "preprocessa immagine"
 msgid "Preprocess and mark"
 msgstr ""
 
-#: modules/process/xydenoise.c:57
+#: modules/process/xydenoise.c:58
 msgid "Denoises measurement on basis of two orthogonal scans."
 msgstr "Rimuove rumore sulla base di due scansioni ortogonali"
 
-#: modules/process/xydenoise.c:71
+#: modules/process/xydenoise.c:72
 msgid "/M_ultidata/_XY denoise..."
 msgstr "/multidati/Riduzione rumore XY"
 
-#: modules/process/xydenoise.c:75
+#: modules/process/xydenoise.c:76
 msgid "Denoises horizontal/vertical measurement."
 msgstr "Rimuove rumore da misura orizzontale/verticale"
 
-#: modules/process/xydenoise.c:102
+#: modules/process/xydenoise.c:103
 msgid "XY Denoising"
 msgstr "XY Denoising"
 
-#: modules/process/xydenoise.c:124
+#: modules/process/xydenoise.c:125
 msgid "Second direction:"
 msgstr "Seconda direzione:"
 
-#: modules/process/xydenoise.c:232
+#: modules/process/xydenoise.c:233
 msgid "Computing forward FFTs..."
 msgstr "Elaborazione FFT"
 
-#: modules/process/xydenoise.c:248
+#: modules/process/xydenoise.c:249
 msgid "Computing image..."
 msgstr "Elaborazione immagine..."
 
-#: modules/process/xydenoise.c:260
+#: modules/process/xydenoise.c:261
 msgid "Computing backward FFT..."
 msgstr "Elaborazione FFT inversa"
 
-#: modules/process/xydenoise.c:272
+#: modules/process/xydenoise.c:273
 msgid "Denoised"
 msgstr "con rimozione rumore"
 
@@ -13305,64 +14119,71 @@ msgstr "/Operazioni _Base/trasforma in _XYZ..."
 msgid "Convert to XYZ data"
 msgstr "Converte  in dati XYZ"
 
-#: modules/pygwy/pygwy-console.c:55
+#: modules/pygwy/pygwy-console.c:99
 msgid "/Pygwy Console"
 msgstr "/Pygwy Console"
 
-#: modules/pygwy/pygwy-console.c:59
+#: modules/pygwy/pygwy-console.c:103
 msgid "Python wrapper console"
 msgstr "Python wrapper console"
 
-#: modules/pygwy/pygwy-console.c:142
-msgid ">>> Running the script above\n"
-msgstr ">>> Script in esecuzione\n"
-
-#: modules/pygwy/pygwy-console.c:194
-msgid "Open Python script"
-msgstr "Apri script Python "
-
-#: modules/pygwy/pygwy-console.c:275
-msgid "Save Script as"
-msgstr "Salva Script come"
-
-#: modules/pygwy/pygwy-console.c:327
+#: modules/pygwy/pygwy-console.c:168 modules/pygwy/pygwy-console.c:481
 msgid "Pygwy Console"
 msgstr "Pygwy Console"
 
-#: modules/pygwy/pygwy-console.c:340
-msgid "Clear Log"
-msgstr "Pulisci Registro"
-
-#: modules/pygwy/pygwy-console.c:344
+#: modules/pygwy/pygwy-console.c:187
 msgid "Open script in Python language (Ctrl-O)"
 msgstr "Apri script in Python (Ctrl-O)"
 
-#: modules/pygwy/pygwy-console.c:346
+#: modules/pygwy/pygwy-console.c:197
 msgid "Save script (Ctrl-S)"
 msgstr "Salva script (Ctrl-S)"
 
-#: modules/pygwy/pygwy-console.c:348
+#: modules/pygwy/pygwy-console.c:207
+#, fuzzy
+msgid "Save script as (Ctrl-Shift-S)"
+msgstr "Salva script (Ctrl-S)"
+
+#: modules/pygwy/pygwy-console.c:217
 msgid "Execute script (Ctrl-E)"
 msgstr "Esegui script (Ctrl-E)"
 
-#: modules/pygwy/pygwy-console.c:426
+#: modules/pygwy/pygwy-console.c:227
+msgid "Clear Log"
+msgstr "Pulisci Registro"
+
+#: modules/pygwy/pygwy-console.c:285
 msgid "Command"
 msgstr "Comando"
 
-#: pygwy.c:120
+#: modules/pygwy/pygwy-console.c:371
+msgid ">>> Running the script above\n"
+msgstr ">>> Script in esecuzione\n"
+
+#: modules/pygwy/pygwy-console.c:425
+#, fuzzy
+msgid "Save Python Script as"
+msgstr "Salva Script come"
+
+#: modules/pygwy/pygwy-console.c:429
+#, fuzzy
+msgid "Open Python Script"
+msgstr "Apri script Python "
+
+#: pygwy.c:130
 msgid "Pygwy, the Gwyddion Python wrapper."
 msgstr ""
 
-#: pygwy.c:258
+#: pygwy.c:269
 msgid "Python Interpreter Errors"
 msgstr ""
 
-#: pygwy.c:384
+#: pygwy.c:399
 #, fuzzy
 msgid "Python interpreter error occurred."
 msgstr "Errore libpng"
 
-#: pygwy.c:459
+#: pygwy.c:499
 msgid "Function written in Python"
 msgstr "Funzione scritta in Python"
 
@@ -13387,11 +14208,11 @@ msgid "Measure distances and directions between points"
 msgstr "Misura distanze e direzioni tra punti"
 
 #. TRANSLATORS: Number is verb here.
-#: modules/tools/distance.c:250 modules/tools/profile.c:532
+#: modules/tools/distance.c:250 modules/tools/profile.c:527
 msgid "_Number lines"
 msgstr "_Numero linee"
 
-#: modules/tools/filter.c:128
+#: modules/tools/filter.c:129
 msgid ""
 "Filter tool, processes selected part of data with a filter (conservative "
 "denoise, mean, median. Kuwahara, minimum, maximum)."
@@ -13399,27 +14220,27 @@ msgstr ""
 "Strumento filtro, fltra i dati selezionati con differenti criteri "
 "(conservative denoise, mean, median. Kuwahara, minimum, maximum)."
 
-#: modules/tools/filter.c:171
+#: modules/tools/filter.c:172
 msgid "Basic filters: mean, median, denoise, …"
 msgstr "Filtri base: medio, mediano, denoise, ...."
 
-#: modules/tools/filter.c:239
+#: modules/tools/filter.c:240
 msgid "Conservative denoise"
 msgstr "Denoise conservativo"
 
-#: modules/tools/filter.c:246
+#: modules/tools/filter.c:247
 msgid "Kuwahara"
 msgstr "Kuwahara"
 
-#: modules/tools/filter.c:247
+#: modules/tools/filter.c:248
 msgid "Dechecker"
 msgstr "Dechecker"
 
-#: modules/tools/filter.c:248
+#: modules/tools/filter.c:249
 msgid "filter|Gaussian"
 msgstr "filtro|Gaussiana"
 
-#: modules/tools/filter.c:249
+#: modules/tools/filter.c:250
 msgid "Sharpen"
 msgstr ""
 
@@ -13516,7 +14337,7 @@ msgid "Height histogram"
 msgstr "Istogramma altezze"
 
 #: modules/tools/icolorange.c:329 modules/tools/linestats.c:169
-#: modules/tools/sfunctions.c:226 modules/volume/volume_linestat.c:146
+#: modules/tools/sfunctions.c:231 modules/volume/volume_linestat.c:148
 msgid "Range"
 msgstr "Intervallo"
 
@@ -13544,7 +14365,7 @@ msgstr "_Inversione Mappatura"
 msgid "range|Full"
 msgstr "intervallo|Pieno"
 
-#: modules/tools/level3.c:106
+#: modules/tools/level3.c:108
 msgid ""
 "Three-point level tool, levels data by subtracting a plane fitted through "
 "three selected points."
@@ -13552,23 +14373,23 @@ msgstr ""
 "Strumento livella su tre punti, livella i dati sottraendo un piano passante "
 "per tre punti dati."
 
-#: modules/tools/level3.c:143
+#: modules/tools/level3.c:145
 msgid "Three Point Level"
 msgstr "Livella su tre punti"
 
-#: modules/tools/level3.c:144
+#: modules/tools/level3.c:146
 msgid "Level data by fitting a plane through three points"
 msgstr "Livella dati adattando a piano passante per tre punti"
 
-#: modules/tools/level3.c:239 modules/tools/readvalue.c:375
+#: modules/tools/level3.c:244 modules/tools/readvalue.c:378
 msgid "_Averaging radius:"
 msgstr "Media raggio:"
 
-#: modules/tools/level3.c:246
+#: modules/tools/level3.c:251
 msgid "_Instant apply"
 msgstr "Applica _istantaneamente"
 
-#: modules/tools/level3.c:255
+#: modules/tools/level3.c:261
 msgid "Set plane to _zero"
 msgstr "Fissa piano zero"
 
@@ -13580,23 +14401,23 @@ msgstr ""
 "Strumento funzione statistica Riga/Colonna, valori medi, mediani, massimi, "
 "minimi, RMS,..., di righe e colonne"
 
-#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:148
+#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:150
 msgid "tan β<sub>0</sub>"
 msgstr "tg β<sub>0</sub>"
 
-#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:150
+#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:152
 msgid "Ra"
 msgstr "Ra"
 
-#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:151
+#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:153
 msgid "Rq (RMS)"
 msgstr "Rq (RMS)"
 
-#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:152
+#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:154
 msgid "Rz"
 msgstr "Rz"
 
-#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:153
+#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:155
 msgid "Rt"
 msgstr "Rt"
 
@@ -13620,16 +14441,11 @@ msgstr "Colonne"
 msgid "Average:"
 msgstr "Media:"
 
-#: modules/tools/linestats.c:363 modules/tools/profile.c:464
-#: modules/tools/sfunctions.c:414 modules/tools/spectro.c:343
+#: modules/tools/linestats.c:363 modules/tools/profile.c:460
+#: modules/tools/sfunctions.c:424 modules/tools/spectro.c:346
 msgid "<b>Options</b>"
 msgstr "<b>Opzioni</b>"
 
-#: modules/tools/linestats.c:379 modules/tools/sfunctions.c:430
-#: modules/tools/stats.c:408
-msgid "_Instant updates"
-msgstr "_Aggiornamento immediato"
-
 #: modules/tools/maskedit.c:170
 msgid "Mask editor tool, allows interactive modification of parts of the mask."
 msgstr ""
@@ -13688,63 +14504,63 @@ msgstr "Riempi le aree vuote continue con una maschera"
 msgid "Erase continuous parts of mask"
 msgstr "Rimozione parti continue di maschera"
 
-#: modules/tools/maskedit.c:408
+#: modules/tools/maskedit.c:409
 msgid "Editor"
 msgstr "_Modifica"
 
-#: modules/tools/maskedit.c:413
+#: modules/tools/maskedit.c:414
 msgid "_Shapes"
 msgstr "Forme"
 
-#: modules/tools/maskedit.c:423
+#: modules/tools/maskedit.c:428
 msgid "Mode:"
 msgstr "Modo:"
 
-#: modules/tools/maskedit.c:452
+#: modules/tools/maskedit.c:458
 msgid "Shape:"
 msgstr "Forma:"
 
-#: modules/tools/maskedit.c:483
+#: modules/tools/maskedit.c:486
 msgid "_Drawing Tools"
 msgstr "Strumenti _Disegno:"
 
-#: modules/tools/maskedit.c:493
+#: modules/tools/maskedit.c:500
 msgid "Tool:"
 msgstr "Strumenti:"
 
-#: modules/tools/maskedit.c:532
+#: modules/tools/maskedit.c:538
 msgid "Actions"
 msgstr "Azioni"
 
-#: modules/tools/maskedit.c:540
+#: modules/tools/maskedit.c:546
 msgid "_Invert"
 msgstr "_inverti"
 
-#: modules/tools/maskedit.c:571
+#: modules/tools/maskedit.c:577
 msgid "Fill _Voids"
 msgstr "Riempi _Vuoti"
 
-#: modules/tools/maskedit.c:580
+#: modules/tools/maskedit.c:586
 msgid "Fill non-simple-connected"
 msgstr ""
 
-#: modules/tools/maskedit.c:591
+#: modules/tools/maskedit.c:597
 msgid "Grow/Shrink"
 msgstr "Ingrandisci/Rimpicciolisci"
 
-#: modules/tools/maskedit.c:600
+#: modules/tools/maskedit.c:606
 msgid "_Grow"
 msgstr "_Ingrandisci"
 
-#: modules/tools/maskedit.c:608
+#: modules/tools/maskedit.c:614
 msgid "Shrin_k"
 msgstr "Rimpicciolisci"
 
-#: modules/tools/maskedit.c:623
+#: modules/tools/maskedit.c:629
 msgid "_Amount:"
 msgstr "_Quantità:"
 
-#: modules/tools/maskedit.c:651
+#: modules/tools/maskedit.c:657
 msgid "_Prevent grain merging by growing"
 msgstr "Evita il fondersi dei grani per crescita"
 
@@ -13762,83 +14578,99 @@ msgstr "Livella su percorso"
 msgid "Level rows using intersections with given lines"
 msgstr "Livella righe dati usando intersezioni con linee assegnate"
 
-#: modules/tools/profile.c:222
+#: modules/tools/profile.c:216
 msgid "Profile tool, creates profile graphs from selected lines."
 msgstr "Strumento profilo, crea grafico del profilo da linee selezionate."
 
-#: modules/tools/profile.c:276 modules/tools/profile.c:630
+#: modules/tools/profile.c:270 modules/tools/profile.c:609
 msgid "Profiles"
 msgstr "Profili"
 
-#: modules/tools/profile.c:277
+#: modules/tools/profile.c:271
 msgid "Extract profiles"
 msgstr "Estrae profili"
 
+#: modules/tools/profile.c:478
+#, fuzzy
+msgid "Linear profiles"
+msgstr "_Separa Profili"
+
 #: modules/tools/profile.c:480
-msgid "_Radial profiles"
+#, fuzzy
+msgid "Radial profiles"
 msgstr "Profili _Radiali"
 
-#: modules/tools/profile.c:493
-msgid "Symmetrize _All"
-msgstr "Simmetrizza tutto"
-
-#: modules/tools/profile.c:498
-msgid "S_ymmetrize"
-msgstr "Simmetrizzazione"
-
-#: modules/tools/profile.c:542
+#: modules/tools/profile.c:537
 msgid "_Separate profiles"
 msgstr "_Separa Profili"
 
-#: modules/tools/profile.c:607
+#: modules/tools/profile.c:587
 msgid "_Calibration data:"
 msgstr "Dati calibrazione:"
 
-#: modules/tools/profile.c:620
+#: modules/tools/profile.c:600
 msgid "_Show profile"
 msgstr "Mostra Profilo"
 
-#: modules/tools/profile.c:887
+#: modules/tools/profile.c:861
 #, c-format
 msgid "X error %d"
 msgstr "errore X %d"
 
-#: modules/tools/profile.c:891
+#: modules/tools/profile.c:865
 #, c-format
 msgid "Y error %d"
 msgstr "errore Y %d"
 
-#: modules/tools/profile.c:895
+#: modules/tools/profile.c:869
 #, c-format
 msgid "Z error %d"
 msgstr "errore Z %d"
 
-#: modules/tools/profile.c:899
+#: modules/tools/profile.c:873
 #, c-format
 msgid "X uncertainty %d"
 msgstr "Incertezza X %d"
 
-#: modules/tools/profile.c:903
+#: modules/tools/profile.c:877
 #, c-format
 msgid "Y uncertainty %d"
 msgstr "Incertezza Y %d"
 
-#: modules/tools/profile.c:907
+#: modules/tools/profile.c:881
 #, c-format
 msgid "Z uncertainty %d"
 msgstr "Incertezza Z %d"
 
-#: modules/tools/profile.c:912
+#: modules/tools/profile.c:886
 #, c-format
 msgid "Zunc up bound %d"
 msgstr ""
 
-#: modules/tools/profile.c:917
+#: modules/tools/profile.c:891
 #, c-format
 msgid "Zunc low bound %d"
 msgstr ""
 
-#: modules/tools/profile.c:1817
+#: modules/tools/profile.c:1637
+msgid "S_ymmetrize"
+msgstr "Simmetrizzazione"
+
+#: modules/tools/profile.c:1639
+msgid "Symmetrize _All"
+msgstr "Simmetrizza tutto"
+
+#: modules/tools/profile.c:1643
+#, fuzzy
+msgid "Improve _Direction"
+msgstr "_Direzione:"
+
+#: modules/tools/profile.c:1645
+#, fuzzy
+msgid "Improve _All"
+msgstr "_Migliora"
+
+#: modules/tools/profile.c:1866
 msgid "calib-data|None"
 msgstr "calib-dati|Nessuna"
 
@@ -13854,194 +14686,194 @@ msgstr "Leggi Valore"
 msgid "Read value under mouse cursor"
 msgstr "Legge valore sotto il cursore del mouse"
 
-#: modules/tools/readvalue.c:304
+#: modules/tools/readvalue.c:307
 msgid "Set _Zero"
 msgstr "Fissa _Zero"
 
-#: modules/tools/readvalue.c:307
+#: modules/tools/readvalue.c:310
 msgid "Shift plane z=0 to pass through the selected point"
 msgstr "Muovi piano z=0 fino a passare per il punto selezionato"
 
-#: modules/tools/readvalue.c:315
+#: modules/tools/readvalue.c:318
 msgid "Facet"
 msgstr "Facet"
 
-#: modules/tools/readvalue.c:340
+#: modules/tools/readvalue.c:343
 msgid "Curvatures"
 msgstr "Curvature"
 
-#: modules/tools/readvalue.c:382
+#: modules/tools/readvalue.c:386
 msgid "Show _selection"
 msgstr "Mostra selezione"
 
-#: modules/tools/roughness.c:282
+#: modules/tools/roughness.c:283
 msgid "Roughness average"
 msgstr "Rugosità media"
 
-#: modules/tools/roughness.c:290
+#: modules/tools/roughness.c:291
 msgid "Root mean square roughness"
 msgstr "Radice quadratica media rugosità"
 
-#: modules/tools/roughness.c:298
+#: modules/tools/roughness.c:299
 msgid "Maximum height of the roughness"
 msgstr "Altezza massima rugosita'"
 
-#: modules/tools/roughness.c:306
+#: modules/tools/roughness.c:307
 msgid "Maximum roughness valley depth"
 msgstr "Massima profondità di valle rugosita'"
 
-#: modules/tools/roughness.c:314
+#: modules/tools/roughness.c:315
 msgid "Maximum roughness peak height"
 msgstr "Altezza picco massima rugosità"
 
-#: modules/tools/roughness.c:322 modules/tools/roughness.c:370
+#: modules/tools/roughness.c:323 modules/tools/roughness.c:371
 msgid "Average maximum height of the roughness"
 msgstr "Media altezza massima rugosità"
 
-#: modules/tools/roughness.c:330
+#: modules/tools/roughness.c:331
 msgid "Average maximum roughness valley depth"
 msgstr "Media profondità di valle massima della rugosità"
 
-#: modules/tools/roughness.c:338
+#: modules/tools/roughness.c:339
 msgid "Average maximum roughness peak height"
 msgstr "Altezza media picco massima rugosità"
 
-#: modules/tools/roughness.c:346 modules/tools/roughness.c:354
+#: modules/tools/roughness.c:347 modules/tools/roughness.c:355
 msgid "Average third highest peak to third lowest valley height"
 msgstr "altezza media tra il terzo picco più alto e la terza valle più bassa"
 
-#: modules/tools/roughness.c:362
+#: modules/tools/roughness.c:363
 msgid "Average maximum height of the profile"
 msgstr "Altezza massima media profilo"
 
-#: modules/tools/roughness.c:378
+#: modules/tools/roughness.c:379
 msgid "Skewness"
 msgstr "Skewness"
 
-#: modules/tools/roughness.c:394
+#: modules/tools/roughness.c:395
 msgid "Waviness average"
 msgstr "Media ondulazione"
 
-#: modules/tools/roughness.c:402
+#: modules/tools/roughness.c:403
 msgid "Root mean square waviness"
 msgstr "Radice quadratica media ondulazione"
 
-#: modules/tools/roughness.c:410
+#: modules/tools/roughness.c:411
 msgid "Waviness maximum height"
 msgstr "Altezza massima ondulazione"
 
-#: modules/tools/roughness.c:418
+#: modules/tools/roughness.c:419
 msgid "Maximum height of the profile"
 msgstr "Altezza massima profilo"
 
-#: modules/tools/roughness.c:426
+#: modules/tools/roughness.c:427
 msgid "Spatial"
 msgstr "Spaziale"
 
-#: modules/tools/roughness.c:476
+#: modules/tools/roughness.c:477
 msgid "Average wavelength of the profile"
 msgstr "Lunghezza onda media profilo"
 
-#: modules/tools/roughness.c:484
+#: modules/tools/roughness.c:485
 msgid "Root mean square (RMS) wavelength of the profile"
 msgstr "Radice quadratica media lunghezza onda profilo"
 
-#: modules/tools/roughness.c:492
+#: modules/tools/roughness.c:493
 msgid "Hybrid"
 msgstr "Ibrido"
 
-#: modules/tools/roughness.c:500
+#: modules/tools/roughness.c:501
 msgid "Average absolute slope"
 msgstr "Pendenza assoluta media"
 
-#: modules/tools/roughness.c:508
+#: modules/tools/roughness.c:509
 msgid "Root mean square (RMS) slope"
 msgstr "Radice quadratica media pendenza"
 
-#: modules/tools/roughness.c:524
+#: modules/tools/roughness.c:525
 msgid "Developed profile length"
 msgstr "Lunghezza profilo sviluppato"
 
-#: modules/tools/roughness.c:532
+#: modules/tools/roughness.c:533
 msgid "Profile length ratio"
 msgstr "Rapporto lunghezza profilo"
 
-#: modules/tools/roughness.c:615
+#: modules/tools/roughness.c:616
 msgid "Calculate surface profile parameters."
 msgstr "Calcolo parametri profilo superficie."
 
-#: modules/tools/roughness.c:648 modules/tools/roughness.c:773
-#: modules/tools/roughness.c:1452
+#: modules/tools/roughness.c:649 modules/tools/roughness.c:774
+#: modules/tools/roughness.c:1479
 msgid "Roughness"
 msgstr "Rugosità"
 
-#: modules/tools/roughness.c:649
+#: modules/tools/roughness.c:650
 msgid "Calculate roughness parameters"
 msgstr "Calcolo parametri rugosità."
 
-#: modules/tools/roughness.c:771 modules/tools/roughness.c:1450
+#: modules/tools/roughness.c:772 modules/tools/roughness.c:1477
 msgid "Texture"
 msgstr "Struttura"
 
-#: modules/tools/roughness.c:772 modules/tools/roughness.c:1451
+#: modules/tools/roughness.c:773 modules/tools/roughness.c:1478
 msgid "Waviness"
 msgstr "Ondulazione"
 
-#: modules/tools/roughness.c:774
+#: modules/tools/roughness.c:775
 msgid "ADF"
 msgstr "ADF"
 
-#: modules/tools/roughness.c:775
+#: modules/tools/roughness.c:776
 msgid "BRC"
 msgstr "BRC"
 
-#: modules/tools/roughness.c:776 modules/tools/roughness.c:1455
+#: modules/tools/roughness.c:777 modules/tools/roughness.c:1482
 msgid "Peak Count"
 msgstr "Conta picchi"
 
-#: modules/tools/roughness.c:838 modules/xyz/xyz_drift.c:1090
+#: modules/tools/roughness.c:839 modules/xyz/xyz_drift.c:1090
 msgid "_Graph:"
 msgstr "_Grafico:"
 
-#: modules/tools/roughness.c:845
+#: modules/tools/roughness.c:847
 msgid "C_ut-off:"
 msgstr "C_ut-off:"
 
-#: modules/tools/roughness.c:1324
+#: modules/tools/roughness.c:1345
 msgid "No profile selected."
 msgstr "Nessun profilo selezionato"
 
-#: modules/tools/roughness.c:1453
+#: modules/tools/roughness.c:1480
 msgid "Amplitude Distribution Function"
 msgstr "Funzione Distribuzione Ampiezza (ADF)"
 
-#: modules/tools/roughness.c:1454
+#: modules/tools/roughness.c:1481
 msgid "The Bearing Ratio Curve"
 msgstr "Bearing Ratio Curve (BRC)"
 
-#: modules/tools/roughness.c:1489
+#: modules/tools/roughness.c:1516
 msgid "Surface Profiles"
 msgstr "Profili superficie"
 
-#: modules/tools/roughness.c:1877
+#: modules/tools/roughness.c:1904
 msgid "Save Roughness Parameters"
 msgstr "Salva parametri rugosità."
 
-#: modules/tools/roughness.c:1934
+#: modules/tools/roughness.c:1961
 msgid "Roughness Parameters"
 msgstr "Parametri Rugosità"
 
-#: modules/tools/roughness.c:1940
+#: modules/tools/roughness.c:1967
 #, c-format
 msgid "File:              %s\n"
 msgstr "File:              %s\n"
 
-#: modules/tools/roughness.c:1944
+#: modules/tools/roughness.c:1971
 #, c-format
 msgid "Data channel:      %s\n"
 msgstr "Canale dati:      %s\n"
 
-#: modules/tools/roughness.c:1975
+#: modules/tools/roughness.c:2002
 #, c-format
 msgid ""
 "Selected line:     (%s, %s) to (%s, %s) px\n"
@@ -14078,7 +14910,7 @@ msgstr "_a tutti i file"
 msgid "_Copy"
 msgstr "_Copia"
 
-#: modules/tools/sfunctions.c:181
+#: modules/tools/sfunctions.c:186
 msgid ""
 "Statistical function tool, calculates one-dimensional statistical functions "
 "(height distribution, correlations, PSDF, Minkowski functionals) of selected "
@@ -14088,87 +14920,91 @@ msgstr ""
 "unidimensionali (distribuzione delle altezze, correlazioni, PSDF, funzioni "
 "di Minkowski) di una parte selezionata di dati."
 
-#: modules/tools/sfunctions.c:214
+#: modules/tools/sfunctions.c:219
 msgid "Height distribution"
 msgstr "Distribuzione Altezze"
 
-#: modules/tools/sfunctions.c:215
+#: modules/tools/sfunctions.c:220
 msgid "Cum. height distribution"
 msgstr "Distribuzione altezze cum."
 
-#: modules/tools/sfunctions.c:216
+#: modules/tools/sfunctions.c:221
 msgid "Distribution of angles"
 msgstr "Distribuzione angoli"
 
-#: modules/tools/sfunctions.c:217
+#: modules/tools/sfunctions.c:222
 msgid "Cum. distribution of angles"
 msgstr "Distribuzione angoli cum"
 
-#: modules/tools/sfunctions.c:218
+#: modules/tools/sfunctions.c:223
 msgid "ACF"
 msgstr "ACF "
 
-#: modules/tools/sfunctions.c:219
+#: modules/tools/sfunctions.c:224
 msgid "HHCF"
 msgstr "HHCF"
 
-#: modules/tools/sfunctions.c:220
+#: modules/tools/sfunctions.c:225
 msgid "PSDF"
 msgstr "PSDF"
 
-#: modules/tools/sfunctions.c:221
+#: modules/tools/sfunctions.c:226
 msgid "Radial PSDF"
 msgstr "PSDF radiale"
 
-#: modules/tools/sfunctions.c:222
+#: modules/tools/sfunctions.c:227
 msgid "Radial ACF"
 msgstr "ACF radiale"
 
-#: modules/tools/sfunctions.c:223
+#: modules/tools/sfunctions.c:228
 msgid "Minkowski volume"
 msgstr "Volume di Minkowski"
 
-#: modules/tools/sfunctions.c:224
+#: modules/tools/sfunctions.c:229
 msgid "Minkowski boundary"
 msgstr "Confine di Minkowski"
 
-#: modules/tools/sfunctions.c:225
+#: modules/tools/sfunctions.c:230
 msgid "Minkowski connectivity"
 msgstr "Connettività di Minkowski"
 
-#: modules/tools/sfunctions.c:251
+#: modules/tools/sfunctions.c:232
+msgid "Area scale graph"
+msgstr ""
+
+#: modules/tools/sfunctions.c:257
 msgid "Statistical Functions"
 msgstr "Funzioni Statistiche"
 
-#: modules/tools/sfunctions.c:252
+#: modules/tools/sfunctions.c:258
 msgid "Calculate 1D statistical functions"
 msgstr "Calcolo funzioni statistiche1D "
 
-#: modules/tools/sfunctions.c:504
+#: modules/tools/sfunctions.c:501
 msgid "_Separate uncertainty"
 msgstr "_Separa incertezze"
 
-#: modules/tools/spectro.c:151
+#: modules/tools/spectro.c:154
 msgid "Point Spectrum, extracts point spectra to a graph."
 msgstr "Point Spectrum, estrae gli spettri puntuali in un grafico."
 
-#: modules/tools/spectro.c:190
+#: modules/tools/spectro.c:193
 msgid "Point Spectroscopy"
 msgstr "Spettroscopia puntuale"
 
-#: modules/tools/spectro.c:191
+#: modules/tools/spectro.c:194
 msgid "Extract and view point spectroscopy data"
 msgstr "Estrae e visualizza dati spettroscopici"
 
-#: modules/tools/spectro.c:359
+#: modules/tools/spectro.c:362
 msgid "_Separate spectra"
 msgstr "_Separa spettri"
 
-#: modules/tools/spectro.c:369
+#: modules/tools/spectro.c:372
 msgid "_Average spectra"
 msgstr "Medi_a spettri"
 
-#: modules/tools/spectro.c:508
+#: modules/tools/spectro.c:511
 msgid "Spectroscopy"
 msgstr "Spettroscopia"
 
@@ -14208,14 +15044,6 @@ msgstr "Nessun punto nella immagine selezionata"
 msgid "No area in the zoom selected."
 msgstr "Nessuna area nello zoom selezionato"
 
-#: modules/tools/stats.c:205
-msgid "Average value:"
-msgstr "Valore medio:"
-
-#: modules/tools/stats.c:206
-msgid "Median:"
-msgstr "Mediana:"
-
 #: modules/tools/stats.c:207
 msgid "Ra (Sa):"
 msgstr "Ra (Sa):"
@@ -14228,14 +15056,6 @@ msgstr "Rms (Sq):"
 msgid "Rms (grain-wise):"
 msgstr "Rms (grain-wise):"
 
-#: modules/tools/stats.c:210
-msgid "Skew:"
-msgstr "Skew:"
-
-#: modules/tools/stats.c:211
-msgid "Kurtosis:"
-msgstr "Curtosi:"
-
 #: modules/tools/stats.c:212
 msgid "Surface area:"
 msgstr "Area superficie:"
@@ -14244,10 +15064,6 @@ msgstr "Area superficie:"
 msgid "Projected area:"
 msgstr "Proiezione area:"
 
-#: modules/tools/stats.c:214
-msgid "Variation:"
-msgstr "Variazione:"
-
 #: modules/tools/stats.c:217
 msgid "Inclination θ:"
 msgstr "Inclinazione θ:"
@@ -14260,7 +15076,7 @@ msgstr "Inclinazione φ:"
 msgid "Statistics tool."
 msgstr "Strumenti statistici"
 
-#: modules/tools/stats.c:261 modules/tools/stats.c:1095
+#: modules/tools/stats.c:261 modules/tools/stats.c:1091
 msgid "Statistical Quantities"
 msgstr "Quantità statistiche"
 
@@ -14268,29 +15084,29 @@ msgstr "Quantità statistiche"
 msgid "Statistical quantities"
 msgstr "Quantità statistiche."
 
-#: modules/tools/stats.c:1002
+#: modules/tools/stats.c:998
 msgid "Save Statistical Quantities"
 msgstr "Salva Quantità Statistiche"
 
-#: modules/tools/stats.c:1100
+#: modules/tools/stats.c:1096
 #, c-format
 msgid "File:         %s\n"
 msgstr "File:            %s\n"
 
-#: modules/tools/stats.c:1104
+#: modules/tools/stats.c:1100
 #, c-format
 msgid "Data channel: %s\n"
 msgstr "Canale dati: %s\n"
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "Yes"
 msgstr "Si"
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "No"
 msgstr "No"
 
-#: modules/tools/stats.c:1132
+#: modules/tools/stats.c:1128
 #, c-format
 msgid ""
 "Selected area: %s × %s at (%s, %s) px\n"
@@ -14313,182 +15129,181 @@ msgstr "/_Dimensioni e Unità..."
 msgid "Volume Dimensions and Units"
 msgstr "Dimensioni e Unità Volume"
 
-#: modules/volume/volume_calibrate.c:526
+#: modules/volume/volume_calibrate.c:486
 msgid "_Value range:"
 msgstr "Intervallo _Valore"
 
-#: modules/volume/volume_calibrate.c:555
+#: modules/volume/volume_calibrate.c:508
 msgid "Value shi_ft:"
 msgstr "Valore shi_ft:"
 
-#: modules/volume/volume_calibrate.c:601
+#: modules/volume/volume_calibrate.c:542
 msgid "_Value calibration factor:"
 msgstr "Valore fattore di calibrazione :"
 
-#: modules/volume/volume_extract.c:223
+#: modules/volume/volume_extract.c:216
 msgid "Shows and/or extracts a section of volume data"
 msgstr "Mostra e/o estrae una sezione di dati volume"
 
-#: modules/volume/volume_extract.c:237
-msgid "/Show and _extract..."
+#: modules/volume/volume_extract.c:230
+#, fuzzy
+msgid "/Show and _Extract..."
 msgstr "/mostra ed  _estrai..."
 
-#: modules/volume/volume_extract.c:241
+#: modules/volume/volume_extract.c:234
 msgid "Show and/or extract a section of volume data"
 msgstr "Mostra e/o estrae una sezione di dati volume"
 
-#: modules/volume/volume_extract.c:270
+#: modules/volume/volume_extract.c:263
 msgid "X cross-section"
 msgstr "sezione trasversale X"
 
-#: modules/volume/volume_extract.c:271
+#: modules/volume/volume_extract.c:264
 msgid "Y cross-section"
 msgstr "sezione trasversale Y"
 
-#: modules/volume/volume_extract.c:272
+#: modules/volume/volume_extract.c:265
 msgid "Z cross-section"
 msgstr "Sezione trasversale Z"
 
-#: modules/volume/volume_extract.c:273 modules/volume/volume_extract.c:698
+#: modules/volume/volume_extract.c:266 modules/volume/volume_extract.c:684
 msgid "X direction sum"
 msgstr "somma direzione X"
 
-#: modules/volume/volume_extract.c:274 modules/volume/volume_extract.c:700
+#: modules/volume/volume_extract.c:267 modules/volume/volume_extract.c:686
 msgid "Y direction sum"
 msgstr "somma direzione Y"
 
-#: modules/volume/volume_extract.c:275 modules/volume/volume_extract.c:702
+#: modules/volume/volume_extract.c:268 modules/volume/volume_extract.c:688
 msgid "Z direction sum"
 msgstr "somma direzione Z"
 
-#: modules/volume/volume_extract.c:278
+#: modules/volume/volume_extract.c:271
 msgid "X direction"
 msgstr "direzione x"
 
-#: modules/volume/volume_extract.c:279
+#: modules/volume/volume_extract.c:272
 msgid "Y direction"
 msgstr "direzione y"
 
-#: modules/volume/volume_extract.c:280
+#: modules/volume/volume_extract.c:273
 msgid "Z direction"
 msgstr "direzione z"
 
-#: modules/volume/volume_extract.c:322
+#: modules/volume/volume_extract.c:315
 msgid "Volume data"
 msgstr "Dati volume"
 
-#: modules/volume/volume_extract.c:324
+#: modules/volume/volume_extract.c:317
 msgid "_Load"
 msgstr "_Carica"
 
-#: modules/volume/volume_extract.c:336
+#: modules/volume/volume_extract.c:329
 msgid "_Extract projection"
 msgstr "_Estrae proiezione"
 
-#: modules/volume/volume_extract.c:354
+#: modules/volume/volume_extract.c:347
 msgid "Projections"
 msgstr "Proiezioni"
 
-#: modules/volume/volume_extract.c:404
+#: modules/volume/volume_extract.c:395
 msgid "Z position"
 msgstr "Posizione Z"
 
-#: modules/volume/volume_extract.c:409
+#: modules/volume/volume_extract.c:405
 msgid "Shown cut direction:"
 msgstr ""
 
-#: modules/volume/volume_extract.c:419 modules/volume/volume_extract.c:500
-msgid "Show mode:"
-msgstr "Mostra modalità:"
-
-#: modules/volume/volume_extract.c:490
+#: modules/volume/volume_extract.c:485
 msgid "Graph cut direction:"
 msgstr ""
 
-#: modules/volume/volume_extract.c:525
+#: modules/volume/volume_extract.c:511
 msgid "3D view"
 msgstr "Vista 3D"
 
-#: modules/volume/volume_extract.c:550
+#: modules/volume/volume_extract.c:538
 msgid "Zoom"
 msgstr "Ingrandimento"
 
-#: modules/volume/volume_extract.c:558
+#: modules/volume/volume_extract.c:545
 msgid "Wireframe threshold"
 msgstr ""
 
-#: modules/volume/volume_extract.c:566
+#: modules/volume/volume_extract.c:552
 msgid "Z scale"
 msgstr "Scala Z "
 
-#: modules/volume/volume_extract.c:574
+#: modules/volume/volume_extract.c:559
 msgid "Opacity scale"
 msgstr "Scala di opacità"
 
-#: modules/volume/volume_extract.c:580
-msgid "apply perspective"
+#: modules/volume/volume_extract.c:565
+#, fuzzy
+msgid "Apply perspective"
 msgstr "Applica prospettiva"
 
-#: modules/volume/volume_extract.c:589
-msgid "instant 3D render"
+#: modules/volume/volume_extract.c:574
+#, fuzzy
+msgid "Instant 3D render"
 msgstr "Rendering 3D istantaneo"
 
-#: modules/volume/volume_extract.c:598
+#: modules/volume/volume_extract.c:587
 msgid "X view"
 msgstr "Vista X"
 
-#: modules/volume/volume_extract.c:604
+#: modules/volume/volume_extract.c:592
 msgid "Y view"
 msgstr "Vista Y"
 
-#: modules/volume/volume_extract.c:610
+#: modules/volume/volume_extract.c:597
 msgid "Z view"
 msgstr "Vista Z"
 
-#: modules/volume/volume_extract.c:683
+#: modules/volume/volume_extract.c:669
 #, c-format
 msgid "X cross-section at x: %d"
 msgstr "Sezione trasversale X per X = %d"
 
-#: modules/volume/volume_extract.c:686
+#: modules/volume/volume_extract.c:672
 #, c-format
 msgid "Y cross-section at y: %d"
 msgstr "Sezione trasversale Y per Y = %d"
 
-#: modules/volume/volume_extract.c:690
+#: modules/volume/volume_extract.c:676
 #, c-format
 msgid "Z cross-section at Z = %g %s (#%d)"
 msgstr "Sezione trasversale Z per Z = %g %s (#%d)"
 
-#: modules/volume/volume_extract.c:749 modules/volume/volume_slice.c:1264
+#: modules/volume/volume_extract.c:735 modules/volume/volume_slice.c:1278
 #, c-format
 msgid "X graph at y: %d z: %d"
 msgstr "Grafico X a y: %d  z:  %d "
 
-#: modules/volume/volume_extract.c:752 modules/volume/volume_slice.c:1273
+#: modules/volume/volume_extract.c:738 modules/volume/volume_slice.c:1287
 #, c-format
 msgid "Y graph at x: %d z: %d"
 msgstr "Grafico Y a x: %d z: %d"
 
-#: modules/volume/volume_extract.c:755 modules/volume/volume_slice.c:1255
+#: modules/volume/volume_extract.c:741 modules/volume/volume_slice.c:1269
 #, c-format
 msgid "Z graph at x: %d y: %d"
 msgstr "Grafico Z a x: %d y: %d"
 
-#: modules/volume/volume_extract.c:776
+#: modules/volume/volume_extract.c:762
 msgid "Brick graph"
 msgstr ""
 
-#: modules/volume/volume_extract.c:1056
+#: modules/volume/volume_extract.c:1042
 msgid "Load volume data"
 msgstr "Carica dati volume"
 
-#: modules/volume/volume_extract.c:1218
+#: modules/volume/volume_extract.c:1204
 #, c-format
 msgid "Shown range %g to %g"
 msgstr "Intervallo mostrato %g per %g "
 
-#: modules/volume/volume_extract.c:1911
+#: modules/volume/volume_extract.c:1897
 msgid "Building wireframe model..."
 msgstr ""
 
@@ -14497,99 +15312,102 @@ msgid "Evaluate volume force-distance data"
 msgstr "Valutazione dati volume forza-distanza"
 
 #: modules/volume/volume_fdfit.c:213
-msgid "/_Evaluate FD data..."
+#, fuzzy
+msgid "/_Evaluate FD Data..."
 msgstr "/Valutazione dati FD "
 
 #: modules/volume/volume_fdfit.c:217
 msgid "Evaluate force-distance volume data"
 msgstr "Valutazione volume dati Forza-Distanza"
 
-#: modules/volume/volume_fdfit.c:368
+#: modules/volume/volume_fdfit.c:371
 msgid "Curve _X position:"
 msgstr "Posizione curva _X:"
 
-#: modules/volume/volume_fdfit.c:386
+#: modules/volume/volume_fdfit.c:380
 msgid "Curve _Y position:"
 msgstr "Posizione curva _Y:"
 
-#: modules/volume/volume_fdfit.c:535
+#: modules/volume/volume_fdfit.c:511
 msgid "e_stimate"
 msgstr "Stima"
 
-#: modules/volume/volume_invert.c:51
+#: modules/volume/volume_invert.c:39 modules/volume/volumeops.c:39
 msgid "Inverts value in volume data"
 msgstr "Inverte valore in dati volume"
 
-#: modules/volume/volume_invert.c:65
-msgid "/_Invert value"
+#: modules/volume/volume_invert.c:53
+#, fuzzy
+msgid "/_Invert Value"
 msgstr "/_inverti valore"
 
-#: modules/volume/volume_invert.c:69
+#: modules/volume/volume_invert.c:57
 msgid "Invert value in volume data"
 msgstr "Inverti valore nei dati volume"
 
-#: modules/volume/volume_kmeans.c:94
+#: modules/volume/volume_kmeans.c:95
 msgid "Calculates K-means clustering on volume data."
 msgstr "Calcolo K-means clustering su dati volume"
 
-#: modules/volume/volume_kmeans.c:108
-msgid "/_K-means clustering..."
+#: modules/volume/volume_kmeans.c:109
+#, fuzzy
+msgid "/_K-Means Clustering..."
 msgstr "/_K-means clustering..."
 
-#: modules/volume/volume_kmeans.c:112
+#: modules/volume/volume_kmeans.c:113
 msgid "Calculate K-means clustering on volume data"
 msgstr "Calcolo K-means clustering su dati volume"
 
-#: modules/volume/volume_kmeans.c:151
+#: modules/volume/volume_kmeans.c:152
 msgid "K-means"
 msgstr "K-means"
 
-#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:164
+#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:163
 msgid "_Number of clusters:"
 msgstr "_Numero clusters:"
 
-#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:171
+#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:170
 msgid "Convergence _precision digits:"
 msgstr "Cifre _precisione Convergenza"
 
-#: modules/volume/volume_kmeans.c:184 modules/volume/volume_kmedians.c:178
+#: modules/volume/volume_kmeans.c:183 modules/volume/volume_kmedians.c:176
 msgid "_Max. iterations:"
 msgstr "_Max. iterazioni:"
 
-#: modules/volume/volume_kmeans.c:189 modules/volume/volume_kmedians.c:183
+#: modules/volume/volume_kmeans.c:187 modules/volume/volume_kmedians.c:181
 msgid "_Normalize"
 msgstr "_Normalizzazione"
 
-#: modules/volume/volume_kmeans.c:195
+#: modules/volume/volume_kmeans.c:193
 #, fuzzy
 msgid "_Remove outliers"
 msgstr "Rimuovi macchie"
 
-#: modules/volume/volume_kmeans.c:208
+#: modules/volume/volume_kmeans.c:202
 #, fuzzy
 msgid "Outliers _threshold:"
 msgstr "Soglia inferiore:"
 
-#: modules/volume/volume_kmeans.c:431
+#: modules/volume/volume_kmeans.c:425
 msgid "K-means iteration..."
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:651
+#: modules/volume/volume_kmeans.c:645
 #, c-format
 msgid "K-means cluster of %s"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:660
+#: modules/volume/volume_kmeans.c:654
 #, c-format
 msgid "K-means error of %s"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:670 modules/volume/volume_kmedians.c:514
+#: modules/volume/volume_kmeans.c:664 modules/volume/volume_kmedians.c:512
 #, c-format
 msgid "Pre-normalized intensity of %s"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:702
+#: modules/volume/volume_kmeans.c:696
 #, c-format
 msgid "K-means center %d"
 msgstr ""
@@ -14599,7 +15417,8 @@ msgid "Calculates K-medians clustering on volume data."
 msgstr "Calcolo K-medians clustering su dati volume"
 
 #: modules/volume/volume_kmedians.c:102
-msgid "/_K-medians clustering..."
+#, fuzzy
+msgid "/_K-Medians Clustering..."
 msgstr "/_K-medians clustering..."
 
 #: modules/volume/volume_kmedians.c:106
@@ -14610,46 +15429,46 @@ msgstr "Calcolo K-medians clustering su dati volume"
 msgid "K-Medians"
 msgstr "K-Mediane"
 
-#: modules/volume/volume_kmedians.c:392
+#: modules/volume/volume_kmedians.c:390
 msgid "K-medians iteration..."
 msgstr "Iterazione K-mediane ..."
 
-#: modules/volume/volume_kmedians.c:495
+#: modules/volume/volume_kmedians.c:493
 #, c-format
 msgid "K-medians cluster of %s"
 msgstr ""
 
-#: modules/volume/volume_kmedians.c:504
+#: modules/volume/volume_kmedians.c:502
 #, c-format
 msgid "K-medians error of %s"
 msgstr ""
 
-#: modules/volume/volume_kmedians.c:546
+#: modules/volume/volume_kmedians.c:544
 #, c-format
 msgid "K-medians center %d"
 msgstr ""
 
-#: modules/volume/volume_linestat.c:171
+#: modules/volume/volume_linestat.c:173
 msgid "Summarizes profiles of volume data to a channel."
 msgstr "Riassume profili di dati volume in un canale"
 
-#: modules/volume/volume_linestat.c:185
+#: modules/volume/volume_linestat.c:187
 msgid "/Summarize _Profiles..."
 msgstr "/Sommario _Profili..."
 
-#: modules/volume/volume_linestat.c:189
+#: modules/volume/volume_linestat.c:191
 msgid "Summarize profiles"
 msgstr "Sommario Profili"
 
-#: modules/volume/volume_linestat.c:249
+#: modules/volume/volume_linestat.c:251
 msgid "_Extract image"
 msgstr "_Estrazione immagine"
 
-#: modules/volume/volume_linestat.c:250
+#: modules/volume/volume_linestat.c:252
 msgid "Set _preview"
 msgstr "regolazione ante_prima"
 
-#: modules/volume/volume_linestat.c:284
+#: modules/volume/volume_linestat.c:289
 msgid "Summarize Volume Profiles"
 msgstr "Sommario Profili Volume"
 
@@ -14673,53 +15492,122 @@ msgstr "Immagine sezione"
 msgid "Line graph"
 msgstr "grafico lineare"
 
-#: modules/volume/volume_slice.c:290
+#: modules/volume/volume_slice.c:292
 msgid "Slice Volume Data"
 msgstr "Dati sezione Volume"
 
-#: modules/volume/volume_slice.c:369
+#: modules/volume/volume_slice.c:371
 msgid "_Base plane:"
 msgstr "Piano _Base:"
 
-#: modules/volume/volume_slice.c:420
+#: modules/volume/volume_slice.c:422
 msgid "Extract _multiple items"
 msgstr "Estrazione multipla"
 
-#: modules/volume/volume_slice.c:437
+#: modules/volume/volume_slice.c:439
 msgid "Positions"
 msgstr "Posizioni"
 
-#: modules/volume/volume_slice.c:484
+#: modules/volume/volume_slice.c:492
 msgid "_Z:"
 msgstr "_Z:"
 
-#: modules/volume/volume_slice.c:1156
+#: modules/volume/volume_slice.c:1167
 #, c-format
 msgid "Z slice at %.*f%s%s (#%d)"
 msgstr "Sezione trasversale Z a %.*f%s%s (#%d)"
 
-#: modules/volume/volume_slice.c:1167
+#: modules/volume/volume_slice.c:1178
 #, c-format
 msgid "Y slice at %.*f%s%s (#%d)"
 msgstr "Sezione trasversale Y a %.*f%s%s (#%d)"
 
-#: modules/volume/volume_slice.c:1178
+#: modules/volume/volume_slice.c:1189
 #, c-format
 msgid "X slice at %.*f%s%s (#%d)"
 msgstr "Sezione trasversale X a %.*f%s%s (#%d)"
 
-#: modules/volume/volume_slice.c:1307
+#: modules/volume/volume_slice.c:1325
 msgid "Volume Z graphs"
 msgstr "Grafici Volume Z"
 
-#: modules/volume/volume_slice.c:1314
+#: modules/volume/volume_slice.c:1332
 msgid "Volume X graphs"
 msgstr "Grafici Volume X"
 
-#: modules/volume/volume_slice.c:1321
+#: modules/volume/volume_slice.c:1339
 msgid "Volume Y graphs"
 msgstr "Grafici Volume Y"
 
+#: modules/volume/volume_swaxes.c:104
+#, fuzzy
+msgid "Swaps axes of volume data."
+msgstr "Inverte valore in dati volume"
+
+#: modules/volume/volume_swaxes.c:118
+#, fuzzy
+msgid "/S_wap axes..."
+msgstr "/Salva con nome..."
+
+#: modules/volume/volume_swaxes.c:122
+#, fuzzy
+msgid "Swap axes"
+msgstr "Mostra _assi"
+
+#: modules/volume/volume_swaxes.c:156
+#, fuzzy
+msgid "X"
+msgstr "_X:"
+
+#: modules/volume/volume_swaxes.c:157
+#, fuzzy
+msgid "X, reversed"
+msgstr "Inverti"
+
+#: modules/volume/volume_swaxes.c:158
+#, fuzzy
+msgid "Y"
+msgstr "_Y:"
+
+#: modules/volume/volume_swaxes.c:159
+#, fuzzy
+msgid "Y, reversed"
+msgstr "Inverti"
+
+#: modules/volume/volume_swaxes.c:160
+msgid "Z"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:161
+#, fuzzy
+msgid "Z, reversed"
+msgstr "Inverti"
+
+#: modules/volume/volume_swaxes.c:175
+msgid "Swap Volume Axes"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:196
+msgid "Current _X axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:204
+msgid "Current _Y axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:212
+msgid "Current _Z axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:219
+#, fuzzy
+msgid "Create new volume data"
+msgstr "Carica dati volume"
+
+#: modules/volume/volume_swaxes.c:286
+msgid "Z axis calibration will be lost."
+msgstr ""
+
 #: modules/volume/volume_zcal.c:104
 msgid "Attaches, extracts and removes volume data z-axis calibration."
 msgstr "Allega, estrae e rimuove volume dati calibrazione asse Z"
@@ -14789,6 +15677,16 @@ msgstr ""
 "Il numero di valori %d\n"
 " file datidifferisce dal numero dei piani %d."
 
+#: modules/volume/volumeops.c:53
+#, fuzzy
+msgid "/Extract _Preview"
+msgstr "Estrae profili"
+
+#: modules/volume/volumeops.c:57
+#, fuzzy
+msgid "Extract volume data preview to an image"
+msgstr "Salva vista 3D come immagine"
+
 #: modules/xyz/xyz_drift.c:267
 msgid "Analyzes drift in XYZ data."
 msgstr "Analisi deriva in dati XYZ"
@@ -14831,7 +15729,7 @@ msgstr "Deriva asse X"
 msgid "Analyze XYZ Drift"
 msgstr "Analizza deriva XYZ"
 
-#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:391
+#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:406
 msgid "Reset Ran_ges"
 msgstr "Azzera intervalli"
 
@@ -14839,11 +15737,11 @@ msgstr "Azzera intervalli"
 msgid "_Guess parameters"
 msgstr "Parametri _Guess"
 
-#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:570
+#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:539
 msgid "_X-range:"
 msgstr "Intervallo _X:"
 
-#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:592
+#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:561
 msgid "_Y-range:"
 msgstr "Intervallo _Y:"
 
@@ -14921,7 +15819,7 @@ msgstr "Vicini non trovati"
 msgid "Fitting in progress..."
 msgstr "Adattamento in progresso..."
 
-#: modules/xyz/xyz_drift.c:2269 modules/xyz/xyz_raster.c:1012
+#: modules/xyz/xyz_drift.c:2264 modules/xyz/xyz_raster.c:981
 msgid "Physical dimensions are invalid."
 msgstr "Le dimensioni fisiche non sono valide"
 
@@ -14961,40 +15859,40 @@ msgstr "Livella dati XYZ"
 msgid "Update X and Y of _all compatible data"
 msgstr "Aggiorna x e Y di tutti i dati compatibili"
 
-#: modules/xyz/xyz_raster.c:197
+#: modules/xyz/xyz_raster.c:194
 msgid "Rasterizes XYZ data to images."
 msgstr "Rasterizza dati XYZ"
 
-#: modules/xyz/xyz_raster.c:211
+#: modules/xyz/xyz_raster.c:208
 msgid "/_Rasterize..."
 msgstr "/_Rasterizzazione.."
 
-#: modules/xyz/xyz_raster.c:215
+#: modules/xyz/xyz_raster.c:212
 msgid "Rasterize to image"
 msgstr "Rasterizza"
 
-#: modules/xyz/xyz_raster.c:340
+#: modules/xyz/xyz_raster.c:337
 msgid "Rasterize XYZ Data"
 msgstr "Rasterizzazione dati XYZ"
 
-#: modules/xyz/xyz_raster.c:354
+#: modules/xyz/xyz_raster.c:351
 msgid "Create Image _Directly"
 msgstr "Crea immagine direttamente"
 
-#: modules/xyz/xyz_raster.c:360
+#: modules/xyz/xyz_raster.c:357
 msgid "XY points form a regular grid so interpolation is not necessary."
 msgstr ""
 "I punti XY formano una griglia regolare. Interpolazione non necessaria."
 
-#: modules/xyz/xyz_raster.c:381
+#: modules/xyz/xyz_raster.c:392
 msgid "Make Pixels S_quare"
 msgstr "Rendi pixel quadrati"
 
-#: modules/xyz/xyz_raster.c:642
+#: modules/xyz/xyz_raster.c:611
 msgid "Field"
 msgstr "Campo"
 
-#: modules/xyz/xyz_raster.c:956
+#: modules/xyz/xyz_raster.c:925
 #, c-format
 msgid ""
 "Number of points: %u\n"
@@ -15005,7 +15903,7 @@ msgstr ""
 "Uniti in quanto troppo vicini: %u\n"
 "Aggiunti sui bordi: %u"
 
-#: modules/xyz/xyz_raster.c:1091
+#: modules/xyz/xyz_raster.c:1065
 msgid ""
 "XYZ data regularization failed due to numerical instability or was "
 "interrupted."
@@ -15013,6 +15911,66 @@ msgstr ""
 "regolarizzazione dati XYZ fallita a causa di instabilità numerica o è stata "
 "interrotta"
 
+#~ msgid "pixels"
+#~ msgstr "pixel"
+
+#~ msgid "Fast Fourier Transform"
+#~ msgstr "Trasformata di Fourier"
+
+#~ msgid "built-in SimpleFFT\n"
+#~ msgstr "Semplice FFT, incorporata\n"
+
+#~ msgid "Re_fine"
+#~ msgstr "Raf_fina"
+
+#~ msgid "Surface _coverage:"
+#~ msgstr "Superficie _copertura:"
+
+#~ msgid "Distribute"
+#~ msgstr "Distribuisci"
+
+#~ msgid "Replace"
+#~ msgstr "Sostituire"
+
+#~ msgid "_Fix res.:"
+#~ msgstr "_Fix res.:"
+
+#~ msgid "Reco_mpute"
+#~ msgstr "Ricalcola"
+
+#~ msgid "Show mode:"
+#~ msgstr "Mostra modalità:"
+
+#~ msgid "Initializing GUI"
+#~ msgstr "Inizializzazione GUI"
+
+#, fuzzy
+#~ msgid "Slab size _x:"
+#~ msgstr "Dimensioni piano:"
+
+#, fuzzy
+#~ msgid "Slab size _y:"
+#~ msgstr "Dimensioni piano:"
+
+#, fuzzy
+#~ msgid "Stitch operations on data fields."
+#~ msgstr "Semplici operazioni matematiche con campi dati "
+
+#, fuzzy
+#~ msgid "Stitch operations on data"
+#~ msgstr "Operazioni aritmetiche sui dati"
+
+#, fuzzy
+#~ msgid "X offset"
+#~ msgstr "_X offset:"
+
+#, fuzzy
+#~ msgid "Y offset"
+#~ msgstr "_Y offset:"
+
+#~ msgid "Create new channel"
+#~ msgstr "Crea nuovo canale"
+
 #~ msgid "Borders extension..."
 #~ msgstr "Estensione margini...."
 
@@ -15319,9 +16277,6 @@ msgstr ""
 #~ msgid "Triangulation..."
 #~ msgstr "Triangolazione.."
 
-#~ msgid "Starting..."
-#~ msgstr "Inizio...."
-
 #, fuzzy
 #~ msgid "Mean height"
 #~ msgstr "Nuova Altezza:"
@@ -15521,9 +16476,6 @@ msgstr ""
 #~ msgid "Removes the entire filter mask"
 #~ msgstr "Rimuove intera maschera filtro"
 
-#~ msgid "Ra:"
-#~ msgstr "Ra:"
-
 #~ msgid "Rms:"
 #~ msgstr "Rms:"
 
@@ -15614,9 +16566,6 @@ msgstr ""
 #~ msgid "Attach Mask"
 #~ msgstr "Allega maschera"
 
-#~ msgid "Output"
-#~ msgstr "Output"
-
 #~ msgid "Plane Fit Mode"
 #~ msgstr "Adattamento Planare"
 
diff --git a/po/ko.gmo b/po/ko.gmo
index a50202c..ba7c8ae 100644
Binary files a/po/ko.gmo and b/po/ko.gmo differ
diff --git a/po/ko.po b/po/ko.po
index 62401f1..0400673 100644
--- a/po/ko.po
+++ b/po/ko.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gwyddion\n"
 "Report-Msgid-Bugs-To: yeti at gwyddion.net\n"
-"POT-Creation-Date: 2016-11-18 11:05+0100\n"
+"POT-Creation-Date: 2017-08-15 17:48+0200\n"
 "PO-Revision-Date: 2015-04-20 09:48+0200\n"
 "Last-Translator: Jeong Jiseong <stopstar at gist.ac.kr>\n"
 "Language-Team: Korean_gwyddion\n"
@@ -127,7 +127,8 @@ msgstr "Hertz 방식 접촉  ()"
 #: app/data-browser-aux.c:1480 app/data-browser.c:2280 app/data-browser.c:2887
 #: app/data-browser.c:3707 app/data-browser.c:3857 app/data-browser.c:4139
 #: app/data-browser.c:4504 app/data-browser.c:4590 app/data-browser.c:5016
-#: app/resource-editor.c:366 modules/process/convolution_filter.c:691
+#: app/resource-editor.c:366 modules/file/xyzexport.c:214
+#: modules/process/convolution_filter.c:691
 msgid "Untitled"
 msgstr "제목 없음"
 
@@ -135,100 +136,108 @@ msgstr "제목 없음"
 msgid "Initial residua evaluation..."
 msgstr ""
 
-#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1632
+#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1646
 #, fuzzy
 msgid "Fitting..."
 msgstr "FFT 필터링"
 
-#: libgwyddion/gwynlfitpreset.c:1442 libprocess/gwyprocessenums.c:101
-#: libprocess/gwyshapefitpreset.c:347
+#: libgwyddion/gwynlfitpreset.c:1549 libprocess/gwyprocessenums.c:101
+#: libprocess/gwyshapefitpreset.c:347 modules/process/psf-fit.c:157
 msgid "Gaussian"
 msgstr "가우시안 타입"
 
-#: libgwyddion/gwynlfitpreset.c:1457
+#: libgwyddion/gwynlfitpreset.c:1564
 msgid "Gaussian (PSDF)"
 msgstr "가우시안 타입 (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1470
+#: libgwyddion/gwynlfitpreset.c:1577
 msgid "Gaussian (ACF)"
 msgstr "가우시안 타입 (ACF)"
 
-#: libgwyddion/gwynlfitpreset.c:1483
+#: libgwyddion/gwynlfitpreset.c:1590
 msgid "Gaussian (HHCF)"
 msgstr "가우시안 타입 (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1496
+#: libgwyddion/gwynlfitpreset.c:1603
 msgid "Gaussian (RPSDF)"
 msgstr "가우시안 타입 (RPSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1509
+#: libgwyddion/gwynlfitpreset.c:1616
 #, fuzzy
 msgid "Two Gaussians (PSDF)"
 msgstr "가우시안 타입 (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1524 modules/xyz/xyz_drift.c:841
-#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1819
+#: libgwyddion/gwynlfitpreset.c:1631 modules/xyz/xyz_drift.c:841
+#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1818
 msgid "Exponential"
 msgstr "지수타입"
 
-#: libgwyddion/gwynlfitpreset.c:1536
+#: libgwyddion/gwynlfitpreset.c:1643
 msgid "Exponential (PSDF)"
 msgstr "지수타입 (PSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1549
+#: libgwyddion/gwynlfitpreset.c:1656
 msgid "Exponential (ACF)"
 msgstr "지수타입 (ACF)"
 
-#: libgwyddion/gwynlfitpreset.c:1561
+#: libgwyddion/gwynlfitpreset.c:1668
 msgid "Exponential (HHCF)"
 msgstr "지수타입 (HHCF)"
 
-#: libgwyddion/gwynlfitpreset.c:1574
+#: libgwyddion/gwynlfitpreset.c:1681
 msgid "Exponential (RPSDF)"
 msgstr "지수타입 (RPSDF)"
 
-#: libgwyddion/gwynlfitpreset.c:1588
+#: libgwyddion/gwynlfitpreset.c:1695
+msgid "K-correlated (PSDF)"
+msgstr ""
+
+#: libgwyddion/gwynlfitpreset.c:1709
 msgid "Polynomial (order 0)"
 msgstr "다항식 (0차)"
 
-#: libgwyddion/gwynlfitpreset.c:1599 modules/xyz/xyz_drift.c:1805
+#: libgwyddion/gwynlfitpreset.c:1720 modules/xyz/xyz_drift.c:1804
 msgid "Polynomial (order 1)"
 msgstr "다항식 (1차)"
 
-#: libgwyddion/gwynlfitpreset.c:1610
+#: libgwyddion/gwynlfitpreset.c:1731
 msgid "Polynomial (order 2)"
 msgstr "다항식 (2차)"
 
-#: libgwyddion/gwynlfitpreset.c:1622
+#: libgwyddion/gwynlfitpreset.c:1743
 msgid "Polynomial (order 3)"
 msgstr "다항식 (3차)"
 
-#: libgwyddion/gwynlfitpreset.c:1635
+#: libgwyddion/gwynlfitpreset.c:1756
 msgid "Square wave"
 msgstr "사각파형 "
 
-#: libgwyddion/gwynlfitpreset.c:1651
+#: libgwyddion/gwynlfitpreset.c:1772
 msgid "Parabolic step"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1667
+#: libgwyddion/gwynlfitpreset.c:1788
 msgid "Smooth slanted step"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1684
+#: libgwyddion/gwynlfitpreset.c:1805
 msgid "Smooth bent step"
 msgstr ""
 
-#: libgwyddion/gwynlfitpreset.c:1700
+#: libgwyddion/gwynlfitpreset.c:1821
+msgid "Boltzmann bent step"
+msgstr ""
+
+#: libgwyddion/gwynlfitpreset.c:1837
 #, fuzzy
 msgid "Power"
 msgstr "거듭제곱"
 
-#: libgwyddion/gwynlfitpreset.c:1712 libprocess/gwyshapefitpreset.c:348
+#: libgwyddion/gwynlfitpreset.c:1849 libprocess/gwyshapefitpreset.c:348
 msgid "Lorentzian"
 msgstr "로렌츠 "
 
-#: libgwyddion/gwynlfitpreset.c:1726
+#: libgwyddion/gwynlfitpreset.c:1863
 msgid "Sinc"
 msgstr "Sinc"
 
@@ -249,7 +258,7 @@ msgid "Step height (positive)"
 msgstr "단차 높이 (양수)"
 
 #: libprocess/cdline.c:590 libprocess/cdline.c:599
-#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:170
+#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:163
 msgid "Line"
 msgstr "선"
 
@@ -262,7 +271,7 @@ msgid "Circle (down)"
 msgstr "원 (아래)"
 
 #: libprocess/cdline.c:608 libprocess/cdline.c:617
-#: libgwydgets/gwygraphareadialog.c:557 modules/process/hough.c:171
+#: libgwydgets/gwygraphareadialog.c:550 modules/process/hough.c:164
 msgid "Circle"
 msgstr "원"
 
@@ -270,242 +279,242 @@ msgstr "원"
 msgid "Circle (up)"
 msgstr "원 (위)"
 
-#: libprocess/gwygrainvalue.c:64
+#: libprocess/gwygrainvalue.c:62
 #, fuzzy
 msgid "Grain number"
 msgstr "Grain number"
 
-#: libprocess/gwygrainvalue.c:73 modules/process/curvature.c:129
+#: libprocess/gwygrainvalue.c:71 modules/process/curvature.c:128
 msgid "Center x position"
 msgstr "x축 중간점"
 
-#: libprocess/gwygrainvalue.c:82 modules/process/curvature.c:130
+#: libprocess/gwygrainvalue.c:80 modules/process/curvature.c:129
 msgid "Center y position"
 msgstr "y축 중간점"
 
-#: libprocess/gwygrainvalue.c:91
+#: libprocess/gwygrainvalue.c:89
 msgid "Minimum value"
 msgstr "최소 값"
 
-#: libprocess/gwygrainvalue.c:100
+#: libprocess/gwygrainvalue.c:98
 msgid "Maximum value"
 msgstr "최대 값"
 
-#: libprocess/gwygrainvalue.c:109 modules/process/bdep_synth.c:133
-#: modules/tools/filter.c:237
+#: libprocess/gwygrainvalue.c:107 modules/process/bdep_synth.c:133
+#: modules/tools/filter.c:238
 msgid "Mean value"
 msgstr "평균 값"
 
-#: libprocess/gwygrainvalue.c:118 modules/tools/filter.c:238
+#: libprocess/gwygrainvalue.c:116 modules/tools/filter.c:239
 msgid "Median value"
 msgstr "중간 값"
 
-#: libprocess/gwygrainvalue.c:127
+#: libprocess/gwygrainvalue.c:125
 msgid "Minimum value on boundary"
 msgstr "영역 내 최소 값"
 
-#: libprocess/gwygrainvalue.c:136
+#: libprocess/gwygrainvalue.c:134
 msgid "Maximum value on boundary"
 msgstr "영역 내 최대 값"
 
-#: libprocess/gwygrainvalue.c:145
+#: libprocess/gwygrainvalue.c:143
 msgid "Pixel area"
 msgstr "픽셀 면적"
 
-#: libprocess/gwygrainvalue.c:154
+#: libprocess/gwygrainvalue.c:152
 msgid "Projected area"
 msgstr "투영 면적"
 
-#: libprocess/gwygrainvalue.c:163
+#: libprocess/gwygrainvalue.c:161
 msgid "Surface area"
 msgstr "표면 면적"
 
-#: libprocess/gwygrainvalue.c:172
+#: libprocess/gwygrainvalue.c:170
 #, fuzzy
 msgid "Equivalent square side"
 msgstr "등가 사각형 면 "
 
-#: libprocess/gwygrainvalue.c:181
+#: libprocess/gwygrainvalue.c:179
 msgid "Equivalent disc radius"
 msgstr "등가 디스크 반경"
 
-#: libprocess/gwygrainvalue.c:190
+#: libprocess/gwygrainvalue.c:188
 msgid "Area above half-height"
 msgstr "전체 높이의 절반보다 높은 영역의 면적"
 
-#: libprocess/gwygrainvalue.c:199
+#: libprocess/gwygrainvalue.c:197
 msgid "Area of convex hull"
 msgstr "볼록 껍질(convex hull)의 면적"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to
 #. * zero.
-#: libprocess/gwygrainvalue.c:210
+#: libprocess/gwygrainvalue.c:208
 #, fuzzy
 msgid "Zero basis volume"
 msgstr "0점 기준 부피"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * grain minimum.
-#: libprocess/gwygrainvalue.c:221
+#: libprocess/gwygrainvalue.c:219
 #, fuzzy
 msgid "Grain minimum basis volume"
 msgstr "Grain 최소 값 기준 부피"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * Laplacian background.
-#: libprocess/gwygrainvalue.c:232
+#: libprocess/gwygrainvalue.c:230
 #, fuzzy
 msgid "Laplacian background basis volume"
 msgstr "라플라시안 배경 기준 부피"
 
-#: libprocess/gwygrainvalue.c:241
+#: libprocess/gwygrainvalue.c:239
 msgid "Projected boundary length"
 msgstr "투영된 경계의 길이 "
 
-#: libprocess/gwygrainvalue.c:250
+#: libprocess/gwygrainvalue.c:248
 msgid "Minimum bounding size"
 msgstr "최소 경계의 크기"
 
-#: libprocess/gwygrainvalue.c:259
+#: libprocess/gwygrainvalue.c:257
 msgid "Minimum bounding direction"
 msgstr "최소 경계의 방향"
 
-#: libprocess/gwygrainvalue.c:268
+#: libprocess/gwygrainvalue.c:266
 msgid "Maximum bounding size"
 msgstr "최대 경계의 크기"
 
-#: libprocess/gwygrainvalue.c:277
+#: libprocess/gwygrainvalue.c:275
 msgid "Maximum bounding direction"
 msgstr "최대 경계의 방향"
 
-#: libprocess/gwygrainvalue.c:286
+#: libprocess/gwygrainvalue.c:284
 msgid "Maximum inscribed disc radius"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:295
+#: libprocess/gwygrainvalue.c:293
 msgid "Maximum inscribed disc center x position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:304
+#: libprocess/gwygrainvalue.c:302
 msgid "Maximum inscribed disc center y position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:313
+#: libprocess/gwygrainvalue.c:311
 msgid "Minimum circumcircle radius"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:322
+#: libprocess/gwygrainvalue.c:320
 msgid "Minimum circumcircle center x position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:331
+#: libprocess/gwygrainvalue.c:329
 msgid "Minimum circumcircle center y position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:340
+#: libprocess/gwygrainvalue.c:338
 msgid "Mean radius"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:349 modules/tools/readvalue.c:319
+#: libprocess/gwygrainvalue.c:347 modules/tools/readvalue.c:322
 msgid "Inclination θ"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:358 modules/tools/readvalue.c:329
+#: libprocess/gwygrainvalue.c:356 modules/tools/readvalue.c:332
 msgid "Inclination φ"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:367
+#: libprocess/gwygrainvalue.c:365
 msgid "Curvature center x position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:376
+#: libprocess/gwygrainvalue.c:374
 msgid "Curvature center y position"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:385
+#: libprocess/gwygrainvalue.c:383
 msgid "Curvature center z value"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:394 modules/tools/readvalue.c:344
+#: libprocess/gwygrainvalue.c:392 modules/tools/readvalue.c:347
 msgid "Curvature 1"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:403 modules/tools/readvalue.c:354
+#: libprocess/gwygrainvalue.c:401 modules/tools/readvalue.c:357
 msgid "Curvature 2"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:412
+#: libprocess/gwygrainvalue.c:410
 msgid "Curvature angle 1"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:421
+#: libprocess/gwygrainvalue.c:419
 msgid "Curvature angle 2"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:430
+#: libprocess/gwygrainvalue.c:428
 msgid "Major semiaxis of equivalent ellipse"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:439
+#: libprocess/gwygrainvalue.c:437
 msgid "Minor semiaxis of equivalent ellipse"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:448
+#: libprocess/gwygrainvalue.c:446
 msgid "Orientation of equivalent ellipse"
 msgstr ""
 
-#: libprocess/gwygrainvalue.c:1120
+#: libprocess/gwygrainvalue.c:1118
 msgid "Id"
 msgstr "아이디"
 
-#: libprocess/gwygrainvalue.c:1121 modules/graph/graph_peaks.c:156
-#: modules/process/extract_path.c:391 modules/process/wave_synth.c:482
-#: modules/tools/readvalue.c:251
+#: libprocess/gwygrainvalue.c:1119 modules/graph/graph_peaks.c:154
+#: modules/process/extract_path.c:391 modules/process/wave_synth.c:513
+#: modules/tools/readvalue.c:253
 msgid "Position"
 msgstr "위치"
 
-#: libprocess/gwygrainvalue.c:1122 app/meta.c:411 modules/file/imgexport.c:4625
-#: modules/process/curvature.c:762 modules/tools/level3.c:468
-#: modules/tools/readvalue.c:286
+#: libprocess/gwygrainvalue.c:1120 app/meta.c:411 modules/file/imgexport.c:4573
+#: modules/process/curvature.c:759 modules/tools/level3.c:475
+#: modules/tools/readvalue.c:290
 msgid "Value"
 msgstr "값"
 
-#: libprocess/gwygrainvalue.c:1123
+#: libprocess/gwygrainvalue.c:1121
 msgid "Area"
 msgstr "면적"
 
-#: libprocess/gwygrainvalue.c:1124 app/data-browser.c:5624 app/toolbox.c:110
+#: libprocess/gwygrainvalue.c:1122 app/data-browser.c:5624 app/toolbox.c:115
 msgid "Volume"
 msgstr "부피"
 
-#: libprocess/gwygrainvalue.c:1125
+#: libprocess/gwygrainvalue.c:1123
 msgid "Boundary"
 msgstr "경계"
 
-#: libprocess/gwygrainvalue.c:1126 modules/process/pat_synth.c:829
-#: modules/process/pat_synth.c:1131 modules/process/pat_synth.c:1466
-#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:147
+#: libprocess/gwygrainvalue.c:1124 modules/process/pat_synth.c:830
+#: modules/process/pat_synth.c:1132 modules/process/pat_synth.c:1467
+#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:149
 msgid "Slope"
 msgstr "기울기"
 
-#: libprocess/gwygrainvalue.c:1127 modules/process/curvature.c:213
-#: modules/process/curvature.c:613
+#: libprocess/gwygrainvalue.c:1125 modules/process/curvature.c:212
+#: modules/process/curvature.c:615
 msgid "Curvature"
 msgstr "곡률"
 
-#: libprocess/gwygrainvalue.c:1128
+#: libprocess/gwygrainvalue.c:1126
 msgid "Moment"
 msgstr "순간"
 
-#: libprocess/gwygrainvalue.c:1132
+#: libprocess/gwygrainvalue.c:1130
 msgid "User"
 msgstr "사용자"
 
-#: libprocess/gwyprocessenums.c:44
+#: libprocess/gwyprocessenums.c:44 modules/process/preview.h:263
 msgid "Union"
 msgstr "조합"
 
-#: libprocess/gwyprocessenums.c:45
+#: libprocess/gwyprocessenums.c:45 modules/process/preview.h:255
 #, fuzzy
 msgid "Intersection"
 msgstr "교차점"
@@ -585,14 +594,14 @@ msgid "Scale and space adaptive"
 msgstr ""
 
 #. TRANSLATORS: Interpolation type (AKA nearest neighbour)
-#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3791
-#: modules/xyz/xyz_raster.c:640
+#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3756
+#: modules/xyz/xyz_raster.c:609
 #, fuzzy
 msgid "Round"
 msgstr "둥근"
 
-#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3792
-#: modules/xyz/xyz_raster.c:641
+#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3757
+#: modules/xyz/xyz_raster.c:610
 msgid "Linear"
 msgstr "선형적인"
 
@@ -680,27 +689,27 @@ msgstr ""
 msgid "Use entire image (ignore mask)"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:602
+#: libprocess/gwyprocessenums.c:604
 msgid "distance|City-block"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:603
+#: libprocess/gwyprocessenums.c:605
 msgid "distance|Chess"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:604
+#: libprocess/gwyprocessenums.c:606
 msgid "distance|Octagonal 4,8"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:605
+#: libprocess/gwyprocessenums.c:607
 msgid "distance|Octagonal 8,4"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:606
+#: libprocess/gwyprocessenums.c:608
 msgid "distance|Octagonal"
 msgstr ""
 
-#: libprocess/gwyprocessenums.c:607
+#: libprocess/gwyprocessenums.c:609
 msgid "distance|Euclidean"
 msgstr ""
 
@@ -737,11 +746,11 @@ msgstr "평행의"
 msgid "Ring"
 msgstr ""
 
-#: libprocess/morph_lib.c:169 libprocess/tip.c:1043
+#: libprocess/morph_lib.c:169 libprocess/tip.c:1052
 msgid "Dilation..."
 msgstr ""
 
-#: libprocess/morph_lib.c:235 libprocess/tip.c:1164
+#: libprocess/morph_lib.c:235 libprocess/tip.c:1173
 msgid "Erosion..."
 msgstr ""
 
@@ -772,83 +781,83 @@ msgid_plural "Found %d internal local maxima"
 msgstr[0] ""
 msgstr[1] ""
 
-#: libprocess/tip.c:422
+#: libprocess/tip.c:431
 #, fuzzy
 msgid "Pyramid"
 msgstr "vdW: 각뿔(피라미드)"
 
-#: libprocess/tip.c:423 libprocess/tip.c:429 libprocess/tip.c:435
+#: libprocess/tip.c:432 libprocess/tip.c:438 libprocess/tip.c:444
 msgid "Pyramidal"
 msgstr ""
 
-#: libprocess/tip.c:428
+#: libprocess/tip.c:437
 msgid "Contact"
 msgstr ""
 
-#: libprocess/tip.c:434
+#: libprocess/tip.c:443
 msgid "Noncontact"
 msgstr ""
 
-#: libprocess/tip.c:440
+#: libprocess/tip.c:449
 msgid "Delta function"
 msgstr ""
 
-#: libprocess/tip.c:441
+#: libprocess/tip.c:450
 msgid "Analytical"
 msgstr ""
 
-#: libprocess/tip.c:446
+#: libprocess/tip.c:455 modules/process/fibre_synth.c:259
 #, fuzzy
 msgid "Parabola"
 msgstr "평행의"
 
-#: libprocess/tip.c:447 libprocess/tip.c:453
+#: libprocess/tip.c:456 libprocess/tip.c:462
 msgid "Symmetric"
 msgstr ""
 
-#: libprocess/tip.c:452
+#: libprocess/tip.c:461
 msgid "Cone"
 msgstr ""
 
-#: libprocess/tip.c:458
+#: libprocess/tip.c:467
 msgid "Elliptical parabola"
 msgstr ""
 
-#: libprocess/tip.c:459
+#: libprocess/tip.c:468
 msgid "Asymmetric"
 msgstr ""
 
-#: libprocess/tip.c:1339 libprocess/tip.c:1367 libprocess/tip.c:1416
-#: libprocess/tip.c:1443
+#: libprocess/tip.c:1348 libprocess/tip.c:1376 libprocess/tip.c:1425
+#: libprocess/tip.c:1452
 msgid "Converting fields"
 msgstr ""
 
-#: libprocess/tip.c:1349
+#: libprocess/tip.c:1358
 msgid "Starting partial estimation"
 msgstr ""
 
-#: libprocess/tip.c:1426
+#: libprocess/tip.c:1435
 msgid "Starting full estimation"
 msgstr ""
 
-#: libprocess/triangulation.c:2085 modules/process/calcoefs_view.c:793
+#: libprocess/triangulation.c:2084 modules/process/calcoefs_view.c:793
 #: modules/process/lat_synth.c:1178
 msgid "Triangulating..."
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:570
+#: libgwydgets/gwy3dwindow.c:575
 msgid "Rotate view (R)"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:575
+#: libgwydgets/gwy3dwindow.c:580
 msgid "Scale view as a whole (S)"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:580
+#: libgwydgets/gwy3dwindow.c:585
 msgid "Scale value range (V)"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:585
+#: libgwydgets/gwy3dwindow.c:590
 msgid "Move light source (L)"
 msgstr ""
 
@@ -856,229 +865,290 @@ msgstr ""
 msgid "Show full controls"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:693
+#: libgwydgets/gwy3dwindow.c:691
 msgid "Hide full controls"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:709 modules/file/imgexport.c:4796
-#: modules/process/fit-shape.c:461
+#: libgwydgets/gwy3dwindow.c:707 modules/file/imgexport.c:4745
+#: modules/process/fit-shape.c:462
 msgid "adjective|Basic"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:714
+#: libgwydgets/gwy3dwindow.c:712
 msgid "Light & Material"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:719
+#: libgwydgets/gwy3dwindow.c:717
 msgid "Labels"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:828 modules/process/facet_analysis.c:331
-#: modules/process/facet_analysis.c:347 modules/process/shade.c:245
+#: libgwydgets/gwy3dwindow.c:722
+#, fuzzy
+msgid "Colorbar"
+msgstr "색상"
+
+#: libgwydgets/gwy3dwindow.c:838 modules/process/facet_analysis.c:335
+#: modules/process/facet_analysis.c:351 modules/process/shade.c:253
 #: modules/process/tilt.c:223
 msgid "φ:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:828 libgwydgets/gwy3dwindow.c:834
-#: libgwydgets/gwy3dwindow.c:1032 libgwydgets/gwy3dwindow.c:1040
-#: modules/process/facet_analysis.c:375 modules/process/indent_analyze.c:460
-#: modules/process/rotate.c:264 modules/process/shade.c:237
-#: modules/process/shade.c:245 modules/process/tilt.c:211
-#: modules/process/tilt.c:223 modules/process/tip_model.c:234
-#: modules/process/tip_model.c:240 modules/process/unrotate.c:334
+#: libgwydgets/gwy3dwindow.c:838 libgwydgets/gwy3dwindow.c:843
+#: libgwydgets/gwy3dwindow.c:1013 libgwydgets/gwy3dwindow.c:1020
+#: modules/process/correct_affine.c:461 modules/process/facet_analysis.c:238
+#: modules/process/facet_analysis.c:370 modules/process/indent_analyze.c:438
+#: modules/process/measure_lattice.c:381 modules/process/rotate.c:264
+#: modules/process/shade.c:245 modules/process/shade.c:253
+#: modules/process/synth.h:379 modules/process/synth.h:410
+#: modules/process/tilt.c:211 modules/process/tilt.c:223
+#: modules/process/tip_model.c:234 modules/process/tip_model.c:240
+#: modules/process/unrotate.c:334 modules/tools/distance.c:197
+#: modules/tools/readvalue.c:223 modules/tools/stats.c:319
 msgid "deg"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:834 modules/process/facet_analysis.c:330
-#: modules/process/facet_analysis.c:346 modules/process/shade.c:237
+#: libgwydgets/gwy3dwindow.c:843 modules/process/facet_analysis.c:334
+#: modules/process/facet_analysis.c:350 modules/process/shade.c:245
 #: modules/process/tilt.c:211
 msgid "θ:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:839 modules/process/cwt.c:151
+#: libgwydgets/gwy3dwindow.c:849 modules/process/cwt.c:151
 msgid "_Scale:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:846
+#: libgwydgets/gwy3dwindow.c:856
 msgid "_Value scale:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:851
+#: libgwydgets/gwy3dwindow.c:862
 msgid "Ph_ysical scale:"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:865
+#: libgwydgets/gwy3dwindow.c:876
 msgid "verb|Set"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:877
+#: libgwydgets/gwy3dwindow.c:886
 #, fuzzy
 msgid "Line _width:"
 msgstr "새 너비(W):"
 
-#: libgwydgets/gwy3dwindow.c:881
+#: libgwydgets/gwy3dwindow.c:886 libgwydgets/gwy3dwindow.c:1194
+#: libgwydgets/gwy3dwindow.c:1204 libgwydgets/gwy3dwindow.c:1235
+#: libgwydgets/gwygraphareadialog.c:157 libgwydgets/gwygraphareadialog.c:173
+#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
+#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
+#: modules/process/angle_dist.c:188 modules/process/angle_dist.c:213
+#: modules/process/col_synth.c:486 modules/process/crosscor.c:252
+#: modules/process/crosscor.c:260 modules/process/crosscor.c:276
+#: modules/process/crosscor.c:284 modules/process/crosscor.c:300
+#: modules/process/crosscor.c:308 modules/process/cwt.c:151
+#: modules/process/dimensions.h:88 modules/process/edge.c:672
+#: modules/process/entropy.c:242 modules/process/extend.c:220
+#: modules/process/extend.c:227 modules/process/extend.c:234
+#: modules/process/extend.c:241 modules/process/facet_analysis.c:362
+#: modules/process/fbm_synth.c:383 modules/process/hough.c:203
+#: modules/process/local_contrast.c:146 modules/process/mark_disconn.c:263
+#: modules/process/mask_morph.c:237 modules/process/median-bg.c:209
+#: modules/process/neural.c:623 modules/process/neural.c:631
+#: modules/process/psdf_logphi.c:276 modules/process/rank.c:188
+#: modules/process/scale.c:237 modules/process/scale.c:246
+#: modules/process/scars.c:353 modules/process/scars.c:361
+#: modules/process/semsim.c:227 modules/process/slope_dist.c:365
+#: modules/process/slope_dist.c:393 modules/process/sphere-revolve.c:346
+#: modules/process/straighten_path.c:278 modules/process/synth.h:280
+#: modules/process/synth.h:501 modules/process/tip_blind.c:334
+#: modules/process/tip_blind.c:342 modules/process/volumize_layers.c:240
+#: modules/process/volumize_layers.c:245 modules/process/volumize_layers.c:250
+#: modules/process/wpour_mark.c:320 modules/tools/filter.c:291
+#: modules/tools/level3.c:244 modules/tools/maskedit.c:528
+#: modules/tools/maskedit.c:629 modules/tools/pathlevel.c:256
+#: modules/tools/profile.c:377 modules/tools/profile.c:503
+#: modules/tools/readvalue.c:222 modules/tools/readvalue.c:378
+#: modules/tools/roughness.c:868 modules/volume/volume_slice.c:446
+#: modules/volume/volume_slice.c:469 modules/volume/volume_slice.c:492
+#: modules/xyz/xyz_drift.c:738 modules/xyz/xyz_drift.c:753
+#: modules/xyz/xyz_raster.c:382 modules/xyz/xyz_raster.c:388
+msgid "px"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:891
 msgid "Show _axes"
 msgstr "축 보기(A)"
 
-#: libgwydgets/gwy3dwindow.c:890
+#: libgwydgets/gwy3dwindow.c:900
 msgid "Show _labels"
 msgstr "라벨 보기(L)"
 
-#: libgwydgets/gwy3dwindow.c:899
-msgid "Show false _colorbar"
-msgstr "거짓 색생바 보기(C)"
-
-#: libgwydgets/gwy3dwindow.c:908
+#: libgwydgets/gwy3dwindow.c:909
 #, fuzzy
 msgid "_Orthographic projection"
 msgstr "수직 방향(V)"
 
-#: libgwydgets/gwy3dwindow.c:917
+#: libgwydgets/gwy3dwindow.c:918
 msgid "_Hide masked"
 msgstr ""
 
-#: libgwydgets/gwy3dwindow.c:933
+#: libgwydgets/gwy3dwindow.c:934
 msgid "_Lighting"
 msgstr "조명식(L)"
 
-#: libgwydgets/gwy3dwindow.c:934
+#: libgwydgets/gwy3dwindow.c:935
 msgid "_Gradient"
 msgstr "구배식(G)"
 
-#: libgwydgets/gwy3dwindow.c:935
+#: libgwydgets/gwy3dwindow.c:936
 msgid "_Overlay"
 msgstr "중첩 모드(O)"
 
-#: libgwydgets/gwy3dwindow.c:936
+#: libgwydgets/gwy3dwindow.c:937
 msgid "_Overlay - no light"
 msgstr "중첩 모드(O) - 조명 제거"
 
-#: libgwydgets/gwy3dwindow.c:1009
+#: libgwydgets/gwy3dwindow.c:992
 msgid "_Material:"
 msgstr "재료(M):"
 
-#: libgwydgets/gwy3dwindow.c:1032
+#: libgwydgets/gwy3dwindow.c:1013
 msgid "_Light φ:"
 msgstr "조명(L) φ:"
 
-#: libgwydgets/gwy3dwindow.c:1040
+#: libgwydgets/gwy3dwindow.c:1020
 msgid "L_ight θ:"
 msgstr "조명(I) θ:"
 
-#: libgwydgets/gwy3dwindow.c:1070 libgwydgets/gwy3dwindow.c:1240
-#: app/toolbox-editor.c:215 modules/file/hdrimage.cc:2213
-#: modules/file/imgexport.c:4760 modules/file/pixmap.c:789
+#: libgwydgets/gwy3dwindow.c:1052 libgwydgets/gwy3dwindow.c:1243
+#: app/toolbox-editor.c:216 modules/file/hdrimage.cc:2213
+#: modules/file/imgexport.c:4708 modules/file/pixmap.c:789
 #: modules/file/rawfile.c:424 modules/process/angle_dist.c:172
 #: modules/process/bdep_synth.c:341 modules/process/calcoefs_new.c:371
-#: modules/process/calibrate.c:391 modules/process/col_synth.c:392
-#: modules/process/correct_affine.c:301 modules/process/curvature.c:615
-#: modules/process/cwt.c:135 modules/process/deposit_synth.c:349
+#: modules/process/calibrate.c:383 modules/process/col_synth.c:392
+#: modules/process/correct_affine.c:346 modules/process/curvature.c:617
+#: modules/process/cwt.c:135 modules/process/deposit_synth.c:350
 #: modules/process/diff_synth.c:411 modules/process/domain_synth.c:354
 #: modules/process/drift.c:245 modules/process/dwt.c:166
 #: modules/process/dwtanisotropy.c:184 modules/process/edge.c:638
 #: modules/process/extend.c:192 modules/process/facet-level.c:193
-#: modules/process/facet_analysis.c:271 modules/process/fbm_synth.c:303
+#: modules/process/facet_analysis.c:275 modules/process/fbm_synth.c:303
 #: modules/process/fft.c:336 modules/process/fft_filter_2d.c:417
-#: modules/process/fft_synth.c:341 modules/process/fractal.c:231
-#: modules/process/grain_edge.c:213 modules/process/grain_mark.c:247
-#: modules/process/grain_wshed.c:167 modules/process/hough.c:179
-#: modules/process/lat_synth.c:567 modules/process/latsim.c:159
-#: modules/process/level.c:245 modules/process/linematch.c:804
-#: modules/process/lno_synth.c:433 modules/process/local_contrast.c:130
-#: modules/process/logistic.c:234 modules/process/mark_disconn.c:208
-#: modules/process/mask_distribute.c:152 modules/process/measure_lattice.c:256
-#: modules/process/median-bg.c:180 modules/process/noise_synth.c:336
-#: modules/process/obj_synth.c:441 modules/process/pat_synth.c:385
-#: modules/process/pid.c:199 modules/process/polydistort.c:210
-#: modules/process/polylevel.c:373 modules/process/psdf_logphi.c:249
-#: modules/process/rank.c:158 modules/process/rotate.c:243
-#: modules/process/scale.c:196 modules/process/scars.c:298
-#: modules/process/semsim.c:211 modules/process/shade.c:208
-#: modules/process/slope_dist.c:276 modules/process/sphere-revolve.c:218
-#: modules/process/straighten_path.c:249 modules/process/tilt.c:161
-#: modules/process/tip_model.c:169 modules/process/unrotate.c:220
-#: modules/process/volumize_layers.c:221 modules/process/wave_synth.c:349
-#: modules/process/wpour_mark.c:278 modules/volume/volume_calibrate.c:370
-#: modules/volume/volume_extract.c:331 modules/volume/volume_kmeans.c:153
-#: modules/volume/volume_kmedians.c:147 modules/volume/volume_linestat.c:292
-#: modules/volume/volume_slice.c:292
+#: modules/process/fft_synth.c:341 modules/process/fibre_synth.c:422
+#: modules/process/fractal.c:228 modules/process/grain_edge.c:212
+#: modules/process/grain_mark.c:246 modules/process/grain_wshed.c:168
+#: modules/process/hough.c:174 modules/process/lat_synth.c:567
+#: modules/process/latsim.c:159 modules/process/level.c:245
+#: modules/process/linematch.c:771 modules/process/lno_synth.c:431
+#: modules/process/local_contrast.c:130 modules/process/logistic.c:234
+#: modules/process/mark_disconn.c:208 modules/process/mask_distribute.c:152
+#: modules/process/measure_lattice.c:246 modules/process/median-bg.c:180
+#: modules/process/mfm_current.c:332 modules/process/mfm_field.c:281
+#: modules/process/mfm_findshift.c:230 modules/process/mfm_parallel.c:333
+#: modules/process/mfm_shift.c:170 modules/process/noise_synth.c:334
+#: modules/process/obj_synth.c:438 modules/process/pat_synth.c:385
+#: modules/process/phase_synth.c:205 modules/process/pid.c:197
+#: modules/process/polydistort.c:210 modules/process/polylevel.c:373
+#: modules/process/psdf_logphi.c:249 modules/process/rank.c:158
+#: modules/process/rotate.c:243 modules/process/scale.c:196
+#: modules/process/scars.c:317 modules/process/semsim.c:211
+#: modules/process/shade.c:210 modules/process/slope_dist.c:275
+#: modules/process/sphere-revolve.c:317 modules/process/straighten_path.c:248
+#: modules/process/tilt.c:161 modules/process/tip_model.c:167
+#: modules/process/unrotate.c:220 modules/process/volumize_layers.c:221
+#: modules/process/wave_synth.c:368 modules/process/wpour_mark.c:278
+#: modules/volume/volume_calibrate.c:370 modules/volume/volume_extract.c:324
+#: modules/volume/volume_kmeans.c:154 modules/volume/volume_kmedians.c:147
+#: modules/volume/volume_linestat.c:297 modules/volume/volume_slice.c:294
 msgid "_Reset"
 msgstr "초기화(R)"
 
-#: libgwydgets/gwy3dwindow.c:1142
+#: libgwydgets/gwy3dwindow.c:1141
 msgid "X-axis"
 msgstr "X축"
 
-#: libgwydgets/gwy3dwindow.c:1143
+#: libgwydgets/gwy3dwindow.c:1142
 msgid "Y-axis"
 msgstr "Y축"
 
-#: libgwydgets/gwy3dwindow.c:1144
+#: libgwydgets/gwy3dwindow.c:1143
 msgid "Minimum z value"
 msgstr "Z 최소값"
 
-#: libgwydgets/gwy3dwindow.c:1145
+#: libgwydgets/gwy3dwindow.c:1144
 msgid "Maximum z value"
 msgstr "Z 최대값"
 
-#: libgwydgets/gwy3dwindow.c:1168 modules/file/imgexport.c:3836
+#: libgwydgets/gwy3dwindow.c:1167 modules/file/imgexport.c:3806
 msgid "_Label:"
 msgstr "라벨(L):"
 
-#: libgwydgets/gwy3dwindow.c:1173
+#: libgwydgets/gwy3dwindow.c:1180
 msgid "_Text:"
 msgstr "텍스트(T):"
 
-#: libgwydgets/gwy3dwindow.c:1193
+#: libgwydgets/gwy3dwindow.c:1185
 msgid "Move label"
 msgstr "라벨 이동"
 
-#: libgwydgets/gwy3dwindow.c:1202
+#: libgwydgets/gwy3dwindow.c:1194
 msgid "_Horizontally:"
 msgstr "수평방향(H):"
 
-#: libgwydgets/gwy3dwindow.c:1212
+#: libgwydgets/gwy3dwindow.c:1204
 msgid "_Vertically:"
 msgstr "수직방향(V)"
 
-#: libgwydgets/gwy3dwindow.c:1220
+#: libgwydgets/gwy3dwindow.c:1212
+msgid "A_ll labels have the same size"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:1223
 msgid "Scale size _automatically"
 msgstr "크기 자동 조정(A)"
 
-#: libgwydgets/gwy3dwindow.c:1232 modules/tools/filter.c:290
+#: libgwydgets/gwy3dwindow.c:1235 modules/tools/filter.c:291
 msgid "Si_ze:"
 msgstr "크기(Z):"
 
-#: libgwydgets/gwy3dwindow.c:1232 modules/process/cwt.c:151
-#: modules/process/hough.c:212
-msgid "pixels"
-msgstr "픽셀"
+#: libgwydgets/gwy3dwindow.c:1277
+msgid "Show false _colorbar"
+msgstr "거짓 색생바 보기(C)"
+
+#: libgwydgets/gwy3dwindow.c:1286
+msgid "Reserve space for _colorbar"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:1302 modules/process/lat_synth.c:651
+#: modules/process/obj_synth.c:542 modules/process/pat_synth.c:1458
+#: modules/process/phase_synth.c:279
+msgid "_Size:"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:1311
+#, fuzzy
+msgid "_Vertical alignment:"
+msgstr "수직방향(V)"
 
-#: libgwydgets/gwy3dwindow.c:1726 libgwydgets/gwy3dwindow.c:1779
+#: libgwydgets/gwy3dwindow.c:1844 libgwydgets/gwy3dwindow.c:1897
 msgid "S_witch to Lighting Mode"
 msgstr "조명식 모드로 전환(W)"
 
-#: libgwydgets/gwy3dwindow.c:1734 libgwydgets/gwy3dwindow.c:1756
+#: libgwydgets/gwy3dwindow.c:1852 libgwydgets/gwy3dwindow.c:1874
 msgid "S_witch to Overlay Mode"
 msgstr "중첩 모드로 전환"
 
-#: libgwydgets/gwy3dwindow.c:1748 libgwydgets/gwy3dwindow.c:1771
+#: libgwydgets/gwy3dwindow.c:1866 libgwydgets/gwy3dwindow.c:1889
 msgid "S_witch to Color Gradient Mode"
 msgstr "색상 변화표 모드로 전환(W)"
 
-#: libgwydgets/gwy3dwindow.c:1787
+#: libgwydgets/gwy3dwindow.c:1905
 msgid "T_oggle light"
 msgstr "조명 토글 "
 
-#: libgwydgets/gwyaxisdialog.c:99
+#: libgwydgets/gwyaxisdialog.c:75
 msgid "Axis Properties"
 msgstr "축 설정"
 
-#: libgwydgets/gwyaxisdialog.c:101 libgwydgets/gwygraphlabeldialog.c:63
-msgid "Label Properties"
-msgstr "라벨 설정"
-
-#: libgwydgets/gwyaxisdialog.c:184
+#: libgwydgets/gwyaxisdialog.c:88
 msgid "Label Text"
 msgstr "라벨 텍스트"
 
@@ -1102,7 +1172,7 @@ msgid "Hidden"
 msgstr "숨김"
 
 #: libgwydgets/gwydgetenums.c:47 libgwydgets/gwygraphwindowmeasuredialog.c:572
-#: modules/file/imgexport.c:475 modules/tools/selectionmanager.c:274
+#: modules/file/imgexport.c:474 modules/tools/selectionmanager.c:274
 msgid "Points"
 msgstr "점"
 
@@ -1110,7 +1180,7 @@ msgstr "점"
 msgid "Line + points"
 msgstr "선 + 점"
 
-#: libgwydgets/gwydgetutils.c:564
+#: libgwydgets/gwydgetutils.c:848
 msgid "Change Mask Color"
 msgstr "마스크 색상 변경"
 
@@ -1119,7 +1189,7 @@ msgid "Quantity"
 msgstr "수량"
 
 #: libgwydgets/gwygrainvaluemenu.c:194 libgwydgets/gwygrainvaluemenu.c:207
-#: modules/process/curvature.c:753
+#: modules/process/curvature.c:750
 msgid "Symbol"
 msgstr "부호"
 
@@ -1140,137 +1210,142 @@ msgstr ""
 msgid "_Next"
 msgstr "다음 팁(N)"
 
-#: libgwydgets/gwygraphareadialog.c:127 modules/file/rawgraph.c:302
+#: libgwydgets/gwygraphareadialog.c:123 modules/file/rawgraph.c:302
 msgid "Plot _style:"
 msgstr "그리기 스타일(S):"
 
-#: libgwydgets/gwygraphareadialog.c:148
+#: libgwydgets/gwygraphareadialog.c:131
 msgid "Pl_ot color:"
 msgstr "그리기 색상(O):"
 
-#: libgwydgets/gwygraphareadialog.c:159
+#: libgwydgets/gwygraphareadialog.c:151
 msgid "Point _type:"
 msgstr "점 종류(T):"
 
-#: libgwydgets/gwygraphareadialog.c:165
+#: libgwydgets/gwygraphareadialog.c:157
 msgid "_Point size:"
 msgstr "점 크기(P):"
 
-#: libgwydgets/gwygraphareadialog.c:175
+#: libgwydgets/gwygraphareadialog.c:167
 msgid "_Line type:"
 msgstr "선 종류(L):"
 
-#: libgwydgets/gwygraphareadialog.c:181 modules/file/imgexport.c:3150
+#: libgwydgets/gwygraphareadialog.c:173 modules/file/imgexport.c:3154
 msgid "Line t_hickness:"
 msgstr "선 굵기(H):"
 
-#: libgwydgets/gwygraphareadialog.c:187
+#: libgwydgets/gwygraphareadialog.c:180
 #, fuzzy
 msgid "<b>Label Te_xt</b>"
 msgstr "라벨 텍스트"
 
-#: libgwydgets/gwygraphareadialog.c:404
+#: libgwydgets/gwygraphareadialog.c:397
 msgid "Set Curve Color"
 msgstr "곡선 색상 설정"
 
-#: libgwydgets/gwygraphareadialog.c:556 modules/process/mask_morph.c:179
+#: libgwydgets/gwygraphareadialog.c:549 modules/process/mask_morph.c:178
 msgid "Square"
 msgstr "정사각형"
 
-#: libgwydgets/gwygraphareadialog.c:558 modules/process/mask_morph.c:180
+#: libgwydgets/gwygraphareadialog.c:551 modules/process/mask_morph.c:179
 msgid "Diamond"
 msgstr "다이아몬드"
 
-#: libgwydgets/gwygraphareadialog.c:559
+#: libgwydgets/gwygraphareadialog.c:552
 msgid "Cross"
 msgstr "십자가"
 
-#: libgwydgets/gwygraphareadialog.c:560
+#: libgwydgets/gwygraphareadialog.c:553
 msgid "Diagonal cross"
 msgstr "대각 십자가"
 
-#: libgwydgets/gwygraphareadialog.c:561
+#: libgwydgets/gwygraphareadialog.c:554
 msgid "Asterisk"
 msgstr "별표"
 
-#: libgwydgets/gwygraphareadialog.c:562
+#: libgwydgets/gwygraphareadialog.c:555
 msgid "Star"
 msgstr "별"
 
-#: libgwydgets/gwygraphareadialog.c:563
+#: libgwydgets/gwygraphareadialog.c:556
 msgid "Triangle up"
 msgstr "윗쪽 삼각형"
 
-#: libgwydgets/gwygraphareadialog.c:564
+#: libgwydgets/gwygraphareadialog.c:557
 msgid "Triangle down"
 msgstr "아랫쪽 삼각형"
 
-#: libgwydgets/gwygraphareadialog.c:565
+#: libgwydgets/gwygraphareadialog.c:558
 msgid "Triangle left"
 msgstr "왼쪽 삼각형"
 
-#: libgwydgets/gwygraphareadialog.c:566
+#: libgwydgets/gwygraphareadialog.c:559
 msgid "Triangle right"
 msgstr "오른쪽 삼각형"
 
-#: libgwydgets/gwygraphareadialog.c:567
+#: libgwydgets/gwygraphareadialog.c:560
 msgid "Full square"
 msgstr "꽉찬 정사각형"
 
-#: libgwydgets/gwygraphareadialog.c:568 modules/process/mask_morph.c:177
+#: libgwydgets/gwygraphareadialog.c:561 modules/process/mask_morph.c:176
 msgid "Disc"
 msgstr "디스크"
 
-#: libgwydgets/gwygraphareadialog.c:569
+#: libgwydgets/gwygraphareadialog.c:562
 msgid "Full diamond"
 msgstr "꽉찬 다이아몬드"
 
-#: libgwydgets/gwygraphareadialog.c:570
+#: libgwydgets/gwygraphareadialog.c:563
 msgid "Full triangle up"
 msgstr "꽉찬 윗쪽 삼각형"
 
-#: libgwydgets/gwygraphareadialog.c:571
+#: libgwydgets/gwygraphareadialog.c:564
 msgid "Full triangle down"
 msgstr "꽉찬 아래쪽 삼각형"
 
-#: libgwydgets/gwygraphareadialog.c:572
+#: libgwydgets/gwygraphareadialog.c:565
 msgid "Full triangle left"
 msgstr "꽉찬 왼쪽 삼각형"
 
-#: libgwydgets/gwygraphareadialog.c:573
+#: libgwydgets/gwygraphareadialog.c:566
 msgid "Full triangle right"
 msgstr "꽉찬 오른쪽 삼각형"
 
-#: libgwydgets/gwygraphareadialog.c:635
+#: libgwydgets/gwygraphareadialog.c:628
 msgid "line-style|Solid"
 msgstr "선 종류|실선"
 
-#: libgwydgets/gwygraphareadialog.c:636
+#: libgwydgets/gwygraphareadialog.c:629
 msgid "line-style|Dash"
 msgstr "선 종류|점선"
 
-#: libgwydgets/gwygraphcurves.c:451
+#: libgwydgets/gwygraphcurves.c:448
 msgid "Description"
 msgstr "설명"
 
-#: libgwydgets/gwygraphcurves.c:463
+#: libgwydgets/gwygraphcurves.c:460
 msgid "Mode"
 msgstr "모드"
 
-#: libgwydgets/gwygraphcurves.c:481
+#: libgwydgets/gwygraphcurves.c:478
 msgid "Color"
 msgstr "색상"
 
-#: libgwydgets/gwygraphcurves.c:494
+#: libgwydgets/gwygraphcurves.c:491
 msgid "Point Type"
 msgstr "점 종류"
 
-#: libgwydgets/gwygraphcurves.c:516
+#: libgwydgets/gwygraphcurves.c:513
 msgid "Line Style"
 msgstr "선 종류"
 
+#: libgwydgets/gwygraphlabeldialog.c:63
+msgid "Label Properties"
+msgstr "라벨 설정"
+
 #: libgwydgets/gwygraphlabeldialog.c:74
-msgid "Frame thickness:"
+#, fuzzy
+msgid "_Frame thickness:"
 msgstr "외곽선 두께:"
 
 #: libgwydgets/gwygraphlabeldialog.c:81
@@ -1281,12 +1356,12 @@ msgstr "반전된 레이아웃(R)"
 msgid "Abscissa"
 msgstr ""
 
-#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1002 app/toolbox.c:108
+#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1015 app/toolbox.c:113
 msgid "Graph"
 msgstr "그래프"
 
 #: libgwydgets/gwygraphwindow.c:170 modules/file/hdrimage.cc:472
-#: modules/process/fit-shape.c:656
+#: modules/process/fit-shape.c:666 modules/process/psf.c:229
 msgid "Data"
 msgstr "데이터"
 
@@ -1324,15 +1399,15 @@ msgstr "임의의 점"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:394
 #: libgwydgets/gwygraphwindowmeasuredialog.c:580 modules/tools/linestats.c:170
-#: modules/tools/roughness.c:516 modules/volume/volume_linestat.c:157
+#: modules/tools/roughness.c:517 modules/volume/volume_linestat.c:159
 msgid "Length"
 msgstr "길이"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:398
 #: libgwydgets/gwygraphwindowmeasuredialog.c:588 app/gwyplaintool.c:1018
-#: modules/process/lat_synth.c:747 modules/process/obj_synth.c:569
-#: modules/process/pat_synth.c:846 modules/process/pat_synth.c:1148
-#: modules/process/pat_synth.c:1483
+#: modules/process/fibre_synth.c:534 modules/process/lat_synth.c:747
+#: modules/process/obj_synth.c:567 modules/process/pat_synth.c:847
+#: modules/process/pat_synth.c:1149 modules/process/pat_synth.c:1484
 msgid "Height"
 msgstr "높이"
 
@@ -1345,12 +1420,12 @@ msgid "Curve:"
 msgstr "곡선:"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:553
-#: modules/process/linematch.c:828 modules/process/semsim.c:249
+#: modules/process/linematch.c:795 modules/process/semsim.c:249
 #: modules/xyz/xyz_level.c:254
 msgid "Method:"
 msgstr "방법:"
 
-#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:354
+#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:331
 msgid "Angle"
 msgstr "각ㄱ도"
 
@@ -1360,7 +1435,7 @@ msgid "Preferred"
 msgstr "선호 방법"
 
 #: libgwydgets/gwyoptionmenus.c:470 app/meta.c:410
-#: modules/file/imgexport.c:4160 modules/file/imgexport.c:4607
+#: modules/file/imgexport.c:4110 modules/file/imgexport.c:4555
 #: modules/file/rawfile.c:995 modules/process/convolution_filter.c:538
 #: modules/process/neural.c:418 modules/tools/selectionmanager.c:345
 msgid "Name"
@@ -1399,7 +1474,7 @@ msgid "A_dd symbol"
 msgstr "기호 추가(D)"
 
 #: libgwydgets/gwyscitext.c:274 modules/file/rawfile.c:553
-#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:405
+#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:419
 msgid "Preview"
 msgstr "미리보기"
 
@@ -1417,87 +1492,81 @@ msgstr "이 파일 형식을 읽을 수 없습니다. "
 msgid "No module can save to this file type."
 msgstr "이 파일 형식으로 저장 할 수 없습니다. "
 
-#: libgwymodule/gwymodulebrowser.c:67
+#: libgwymodule/gwymodulebrowser.c:66
 msgid "Module Browser"
 msgstr "모듈 탐색기"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Module"
 msgstr "모듈"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Version"
 msgstr "버전"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Author"
 msgstr "저자"
 
-#: libgwymodule/gwymodulebrowser.c:246
+#: libgwymodule/gwymodulebrowser.c:244
 msgid "Name-Version:"
 msgstr "버전 이름:"
 
-#: libgwymodule/gwymodulebrowser.c:247 libgwymodule/gwymodulebrowser.c:270
+#: libgwymodule/gwymodulebrowser.c:245 libgwymodule/gwymodulebrowser.c:268
 #: modules/process/grain_stat.c:186
 msgid "File:"
 msgstr "파일:"
 
-#: libgwymodule/gwymodulebrowser.c:248
+#: libgwymodule/gwymodulebrowser.c:246
 msgid "Registered functions:"
 msgstr "등록된 기능:"
 
-#: libgwymodule/gwymodulebrowser.c:249
+#: libgwymodule/gwymodulebrowser.c:247
 msgid "Authors:"
 msgstr "저자들:"
 
-#: libgwymodule/gwymodulebrowser.c:250
+#: libgwymodule/gwymodulebrowser.c:248
 msgid "Copyright:"
 msgstr "저작권:"
 
-#: libgwymodule/gwymodulebrowser.c:251
+#: libgwymodule/gwymodulebrowser.c:249
 msgid "Date:"
 msgstr "날짜:"
 
-#: libgwymodule/gwymodulebrowser.c:252
+#: libgwymodule/gwymodulebrowser.c:250
 msgid "Description:"
 msgstr "설명:"
 
-#: libgwymodule/gwymodulebrowser.c:269
+#: libgwymodule/gwymodulebrowser.c:267
 msgid "Name:"
 msgstr "이름:"
 
-#: libgwymodule/gwymodulebrowser.c:271
+#: libgwymodule/gwymodulebrowser.c:269
 msgid "Failure:"
 msgstr "실패:"
 
-#: app/about.c:57
+#: app/about.c:58
 #, c-format
 msgid "About %s"
 msgstr "약 %s"
 
-#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
-#: app/about.c:92
-#, c-format
-msgid "Released %s\n"
-msgstr "배포됨 %s\n"
-
-#: app/about.c:93
+#: app/about.c:97
 msgid "An SPM data visualization and analysis tool."
 msgstr ""
 
-#: app/about.c:101
+#: app/about.c:105
 msgid "Report bugs to:"
 msgstr "버그 보내는 곳:"
 
-#: app/about.c:116
+#: app/about.c:120
 msgid "Credits"
 msgstr "참여자"
 
-#: app/about.c:133
+#: app/about.c:137
 msgid "License"
 msgstr "사용 허가"
 
-#: app/about.c:138
+#: app/about.c:142
 #, c-format
 msgid ""
 "%s is free software; you can redistribute it and/or modify it under the "
@@ -1507,58 +1576,62 @@ msgid ""
 "tarball."
 msgstr ""
 
-#: app/about.c:160 modules/process/logistic.c:270
+#: app/about.c:164 modules/process/logistic.c:269
 msgid "Features"
 msgstr "특징"
 
-#: app/about.c:220
+#: app/about.c:224
 msgid "Developers"
 msgstr "개발자"
 
-#: app/about.c:221
+#: app/about.c:225
 msgid "Translators"
 msgstr "번역가"
 
-#: app/about.c:225
+#: app/about.c:229
 msgid "Development is supported by the Czech Metrology Institute: "
 msgstr "본 개발은 Czech Metrology Institute의 지원을 : "
 
-#: app/about.c:253 app/about.c:256
+#: app/about.c:257 app/about.c:260
 msgid "OpenGL 3D View"
 msgstr "OpenGL 3D 뷰"
 
-#: app/about.c:257 app/about.c:271 app/about.c:291
+#: app/about.c:261 app/about.c:266 app/about.c:286
 msgid "not available\n"
 msgstr "이용 불가\n"
 
-#: app/about.c:262 app/about.c:265
-msgid "Fast Fourier Transform"
-msgstr ""
-
-#: app/about.c:266
-msgid "built-in SimpleFFT\n"
-msgstr ""
-
-#: app/about.c:274
+#: app/about.c:269
 msgid "X11 protocol\n"
 msgstr ""
 
-#: app/about.c:276
+#: app/about.c:271
 msgid "Win32 protocol\n"
 msgstr ""
 
-#: app/about.c:278
+#: app/about.c:273
 msgid "LibUnique\n"
 msgstr ""
 
-#: app/about.c:282
+#: app/about.c:277
 msgid "Remote Control"
 msgstr "원격제어"
 
-#: app/about.c:286 app/about.c:290
+#: app/about.c:281 app/about.c:285
 msgid "Python Scripting Interface"
 msgstr ""
 
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:311
+#, c-format
+msgid "Development version, built %s"
+msgstr ""
+
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:328
+#, fuzzy, c-format
+msgid "Released %s"
+msgstr "배포됨 %s\n"
+
 #: app/app.c:301
 #, c-format
 msgid ""
@@ -1570,117 +1643,125 @@ msgstr ""
 "%s\n"
 "정말로 종료하시겠습니까?"
 
-#: app/app.c:440
+#: app/app.c:442
 msgid "Mask _Color..."
 msgstr "마스크 색상(C)..."
 
-#: app/app.c:456 app/app.c:1725
+#: app/app.c:458 app/app.c:1754
 msgid "Zoom _1:1"
 msgstr "1:1 크기로 보기(1)"
 
-#: app/app.c:460 app/app.c:1729 app/app.c:1957
+#: app/app.c:462 app/app.c:1758 app/app.c:1988
 msgid "Metadata _Browser..."
 msgstr "메타데이터 탐색기(B)..."
 
-#: app/app.c:465 app/app.c:1734 app/app.c:1962
+#: app/app.c:467 app/app.c:1763 app/app.c:1993
 msgid "View _Log..."
 msgstr "로그 보기(L)..."
 
-#: app/app.c:649
+#: app/app.c:651
 msgid "Pi_xelwise Square"
 msgstr "픽셀방식의 정사각형"
 
-#: app/app.c:659
+#: app/app.c:661
 msgid "_Physically Square"
 msgstr "물리적 정사각형(P)"
 
-#: app/app.c:836
+#: app/app.c:842
+msgid "Set as Default"
+msgstr "기본값으로 설정"
+
+#: app/app.c:844
+msgid "Set the current view setup as the default"
+msgstr "현재 뷰 설정을 기본값으로 설정"
+
+#: app/app.c:854
 msgid "verb|Save"
 msgstr "동사|저장하기"
 
-#: app/app.c:839 app/app.c:843
+#: app/app.c:857 app/app.c:861
 msgid "Save 3D view to an image"
 msgstr "3D 뷰를 이미지로 저장"
 
-#: app/app.c:849
-msgid "Set as Default"
-msgstr "기본값으로 설정"
+#: app/app.c:869
+msgid "_Autocrop"
+msgstr ""
 
-#: app/app.c:851
-msgid "Set the current view setup as the default"
-msgstr "현재 뷰 설정을 기본값으로 설정"
+#: app/app.c:873
+msgid "Remove white borders from exported image"
+msgstr ""
 
-#: app/app.c:940
+#: app/app.c:960
 msgid "_Show mask"
 msgstr "마스크 보기(S)"
 
-#: app/app.c:1106
+#: app/app.c:1172
 #, c-format
 msgid "Saving of 3D view to `%s' failed"
 msgstr "3D 뷰를 `%s'로 저장하기를 실패하였습니다."
 
-#: app/app.c:1150
+#: app/app.c:1222
 msgid "Export 3D View"
 msgstr "3D 뷰 내보내기"
 
-#: app/app.c:1457
+#: app/app.c:1478
 msgid "_Change Preview"
 msgstr "미리보기 바꾸기(C)"
 
-#: app/app.c:1583
+#: app/app.c:1606
 msgid "Change Volume Data Preview"
 msgstr "볼륨 데이터 미로보기 바꾸기"
 
-#: app/app.c:1593
+#: app/app.c:1616
 msgid "Preview quantity:"
 msgstr "미리보기 개수:"
 
-#: app/app.c:1603 modules/process/extend.c:267 modules/tools/linestats.c:165
+#: app/app.c:1626 modules/process/extend.c:267 modules/tools/linestats.c:165
 #: modules/volume/volume_linestat.c:142
 msgid "Mean"
 msgstr "평균"
 
-#: app/app.c:1604 modules/process/polydistort.c:255 modules/tools/filter.c:240
+#: app/app.c:1627 modules/process/polydistort.c:258 modules/tools/filter.c:241
 #: modules/tools/icolorange.c:424 modules/tools/linestats.c:167
 #: modules/volume/volume_linestat.c:144
 msgid "Minimum"
 msgstr "최소"
 
-#: app/app.c:1605 modules/process/col_synth.c:170 modules/tools/filter.c:241
+#: app/app.c:1628 modules/process/col_synth.c:170 modules/tools/filter.c:242
 #: modules/tools/icolorange.c:435 modules/tools/linestats.c:168
 #: modules/volume/volume_linestat.c:145
 msgid "Maximum"
 msgstr "최대"
 
-#: app/app.c:1606
+#: app/app.c:1629 modules/volume/volume_linestat.c:146
 msgid "Min. position"
 msgstr "최소 위치"
 
-#: app/app.c:1607
+#: app/app.c:1630 modules/volume/volume_linestat.c:147
 msgid "Max. position"
 msgstr "최대 위치"
 
-#: app/app.c:1608 modules/process/bdep_synth.c:134
-#: modules/process/col_synth.c:171 modules/process/scars.c:346
-#: modules/process/scars.c:353 modules/process/threshold.c:341
+#: app/app.c:1631 modules/process/bdep_synth.c:134
+#: modules/process/col_synth.c:171 modules/process/scars.c:369
+#: modules/process/scars.c:377 modules/process/threshold.c:336
 msgid "RMS"
 msgstr ""
 
-#: app/app.c:1609 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
-#: modules/file/xyzexport.c:233 modules/file/xyzexport.c:302
+#: app/app.c:1632 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
+#: modules/file/xyzexport.c:236 modules/file/xyzexport.c:305
 msgid "Channel:"
 msgstr "채널:"
 
-#: app/app.c:1610
+#: app/app.c:1633
 msgid "Section:"
 msgstr "부분:"
 
-#: app/app.c:1861
+#: app/app.c:1890
 #, fuzzy
 msgid "_Update Preview"
 msgstr "미리보기 바꾸기(C)"
 
-#: app/app.c:1867
+#: app/app.c:1896
 #, fuzzy
 msgid "_Density Map"
 msgstr "점 종류(T):"
@@ -1700,12 +1781,12 @@ msgstr "알 수 없는 볼륨 %d"
 msgid "Unknown XYZ %d"
 msgstr "알 수 없는 볼륨 %d"
 
-#: app/data-browser-aux.c:2795
+#: app/data-browser-aux.c:2839
 #, c-format
 msgid "Z levels: %d, Z unit: %s"
 msgstr ""
 
-#: app/data-browser-aux.c:2821
+#: app/data-browser-aux.c:2865
 #, fuzzy, c-format
 msgid "Points: %d"
 msgstr "점"
@@ -1736,10 +1817,11 @@ msgid "Close file"
 msgstr "파일 닫기"
 
 #: app/data-browser.c:5582
-msgid "Channels"
-msgstr "채널"
+#, fuzzy
+msgid "Images"
+msgstr "이미지 차이점"
 
-#: app/data-browser.c:5596 modules/volume/volume_extract.c:444
+#: app/data-browser.c:5596 modules/volume/volume_extract.c:431
 msgid "Graphs"
 msgstr "그래프"
 
@@ -1784,51 +1866,51 @@ msgid ""
 "%s"
 msgstr ""
 
-#: app/file.c:285
+#: app/file.c:292
 #, c-format
 msgid "Opening of `%s' failed"
 msgstr "`%s' 열기를 실패하였습니다."
 
-#: app/file.c:291 app/file.c:526
+#: app/file.c:298 app/file.c:533
 #, c-format
 msgid "Full file path: %s."
 msgstr "전체 파일 경로: %s."
 
-#: app/file.c:294
+#: app/file.c:301
 #, c-format
 msgid "Loaded using: %s."
 msgstr "%s 을 사용해서 불러왔습니다. "
 
-#: app/file.c:380
+#: app/file.c:387
 msgid "Merge File"
 msgstr "파일 병합"
 
-#: app/file.c:382 app/gwyappfilechooser.c:221
+#: app/file.c:389 app/gwyappfilechooser.c:226
 msgid "Open File"
 msgstr "파일 열기"
 
-#: app/file.c:520 app/gwymoduleutils.c:192
+#: app/file.c:527 app/gwymoduleutils.c:192
 #, c-format
 msgid "Saving of `%s' failed"
 msgstr "`%s' 저장을 실패하였습니다. "
 
-#: app/file.c:529
+#: app/file.c:536
 #, c-format
 msgid "Saved using: %s."
 msgstr "%s 을 사용해서 저장되었습니다."
 
-#: app/file.c:689
+#: app/file.c:696
 #, c-format
 msgid "File `%s' already exists.  Replace?"
 msgstr "파일 '%s'는 이미 존재합니다. 대체하시겠습니까?"
 
-#: app/file.c:693
+#: app/file.c:700
 #, c-format
 msgid ""
 "The file already exists in `%s'.  Replacing it will overwrite its contents."
 msgstr "그 파일은 이미 '%s'에 존재합니다. 같은 이름으로 덮어씁니다. "
 
-#: app/file.c:696
+#: app/file.c:703
 msgid "Replace File?"
 msgstr "파일을 대체하시겠습니까? "
 
@@ -1853,11 +1935,11 @@ msgstr "파일 목록 닫기"
 msgid "Open selected file"
 msgstr "선택된 파일 열기"
 
-#: app/filelist.c:566 app/gwyappfilechooser.c:583
+#: app/filelist.c:566 app/gwyappfilechooser.c:592
 msgid "_Filter:"
 msgstr "필터(F):"
 
-#: app/filelist.c:604 app/gwyappfilechooser.c:619
+#: app/filelist.c:604 app/gwyappfilechooser.c:628
 msgid "Case _sensitive"
 msgstr "대소문자 구별"
 
@@ -1907,99 +1989,99 @@ msgstr "곡선(C)"
 msgid "_Snap to control points"
 msgstr "조정 점으로 움직이기"
 
-#: app/gwyappfilechooser.c:226
+#: app/gwyappfilechooser.c:231
 msgid "Save File"
 msgstr "파일 저장"
 
-#: app/gwyappfilechooser.c:380
+#: app/gwyappfilechooser.c:389
 #, c-format
 msgid "File _type: %s"
 msgstr "파일 종류(T): %s"
 
-#: app/gwyappfilechooser.c:387
+#: app/gwyappfilechooser.c:396
 #, fuzzy
 msgid "Only loadable shown"
 msgstr "읽을 수 있는 파일만 보기"
 
-#: app/gwyappfilechooser.c:391
+#: app/gwyappfilechooser.c:400
 #, fuzzy, c-format
 msgid "Filter: %s"
 msgstr "필터(F):"
 
-#: app/gwyappfilechooser.c:455
+#: app/gwyappfilechooser.c:464
 msgid "Automatic by extension"
 msgstr "확대되어 자동의"
 
-#: app/gwyappfilechooser.c:464
+#: app/gwyappfilechooser.c:473
 msgid "Automatically detected"
 msgstr "자동으로 감지된"
 
-#: app/gwyappfilechooser.c:561
+#: app/gwyappfilechooser.c:570
 msgid "Show only loadable files"
 msgstr "읽을 수 있는 파일만 보기"
 
-#: app/gwyappfilechooser.c:844
+#: app/gwyappfilechooser.c:855
 #, fuzzy
 msgid "Plane-level previewed data"
 msgstr "평면으로 평평하게 만들기 적용된 미리보기 데이터"
 
-#: app/gwyappfilechooser.c:860
+#: app/gwyappfilechooser.c:871
 msgid "Row-level previewed data"
 msgstr ""
 
-#: app/gwyappfilechooser.c:969
+#: app/gwyappfilechooser.c:987
+msgid "File too large for preview"
+msgstr ""
+
+#: app/gwyappfilechooser.c:988
 msgid "…"
 msgstr "..."
 
-#: app/gwyappfilechooser.c:1331
+#: app/gwyappfilechooser.c:1352
 msgid "Cannot preview"
 msgstr "미리보기가 불가능합니다. "
 
-#: app/gwyddion.c:143
+#: app/gwyddion.c:147
 msgid "Loading document history"
 msgstr "문서 내역 불러오는중"
 
-#: app/gwyddion.c:148
+#: app/gwyddion.c:152
 msgid "Registering "
 msgstr "등록하기"
 
-#: app/gwyddion.c:149
+#: app/gwyddion.c:153
 msgid "stock items"
 msgstr ""
 
-#: app/gwyddion.c:153
+#: app/gwyddion.c:157
 msgid "color gradients"
 msgstr "색상 변화표"
 
-#: app/gwyddion.c:155
+#: app/gwyddion.c:159
 msgid "GL materials"
 msgstr "GL 재료"
 
-#: app/gwyddion.c:157
+#: app/gwyddion.c:161
 msgid "grain quantities"
 msgstr "그레인 개수"
 
-#: app/gwyddion.c:159
+#: app/gwyddion.c:163
 msgid "calibrations"
 msgstr "켈리브레이션"
 
-#: app/gwyddion.c:164
+#: app/gwyddion.c:168
 msgid "Loading settings"
 msgstr "설정값 불러오기"
 
-#: app/gwyddion.c:171
+#: app/gwyddion.c:175
 msgid "Registering modules"
 msgstr "모듈 등록하기"
 
-#: app/gwyddion.c:193
-msgid "Initializing GUI"
-msgstr "GUI 초기화하기"
-
-#: app/gwyddion.c:439
+#: app/gwyddion.c:464
 msgid "Could not read settings."
 msgstr "설정값을 읽어올 수 없습니다. "
 
-#: app/gwyddion.c:442
+#: app/gwyddion.c:467
 #, c-format
 msgid ""
 "Settings file `%s' cannot be read: %s\n"
@@ -2008,48 +2090,69 @@ msgid ""
 "it is repaired or removed."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:542
+#: app/gwyddion.c:505
+#, c-format
+msgid "Many modules (%u) failed to register."
+msgstr ""
+
+#: app/gwyddion.c:510
+#, c-format
+msgid ""
+"Most likely Gwyddion was not upgraded correctly.  Instead, one installation "
+"was just overwritten with another, and now it is a mess.\n"
+"\n"
+"Please remove completely the module directory\n"
+"\n"
+"%s\n"
+"\n"
+"and reinstall Gwyddion.\n"
+"\n"
+"See Info → Module Browser for specific errors."
+msgstr ""
+
+#: app/gwymoduleutils-file.c:536
 #, c-format
 msgid "Section %s ended at line %u but it has never started."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:550
+#: app/gwymoduleutils-file.c:544
 #, c-format
 msgid "Section %s ended at line %u instead of %s."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:587
+#: app/gwymoduleutils-file.c:581
 #, c-format
 msgid "Section %s started at line %u before %s ended."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:593
+#: app/gwymoduleutils-file.c:587
 #, c-format
 msgid "Empty section name at header line %u."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:628
+#: app/gwymoduleutils-file.c:622
 #, c-format
 msgid "Header line %u lacks prefix %s."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:653
+#: app/gwymoduleutils-file.c:647
 #, c-format
 msgid "Header line %u lacks key-value separator."
 msgstr ""
 
-#: app/gwymoduleutils-file.c:661
+#: app/gwymoduleutils-file.c:655
 #, c-format
 msgid "Key at header line %u is empty."
 msgstr "헤더 파일 %u에 키 값이 비어있습니다. "
 
-#: app/gwymoduleutils-file.c:688
+#: app/gwymoduleutils-file.c:682
 #, c-format
 msgid "Header suddenly ended at line %u; end of header marker is missing"
 msgstr ""
 
 #: app/gwymoduleutils.c:197 app/settings.c:131 app/settings.c:142
 #: app/toolbox-spec.c:536 modules/file/err.h:62
+#: modules/pygwy/pygwy-console.c:528
 #, c-format
 msgid "Cannot write to file: %s."
 msgstr "%s 파일에 작성할 수 없습니다. "
@@ -2078,8 +2181,9 @@ msgstr "원점"
 
 #: app/gwyplaintool.c:1011 modules/file/rawfile.c:997
 #: modules/process/convolution_filter.c:349
-#: modules/process/convolution_filter.c:553 modules/process/neural.c:419
-#: modules/process/obj_synth.c:538 modules/process/pat_synth.c:1449
+#: modules/process/convolution_filter.c:553 modules/process/fibre_synth.c:520
+#: modules/process/neural.c:419 modules/process/obj_synth.c:536
+#: modules/process/pat_synth.c:1450
 msgid "Size"
 msgstr "크기"
 
@@ -2132,7 +2236,7 @@ msgstr "지우기(R)"
 msgid "_Close"
 msgstr "닫기(C)"
 
-#: app/log.c:615 modules/file/imgexport.c:4168 modules/file/rawfile.c:996
+#: app/log.c:615 modules/file/imgexport.c:4118 modules/file/rawfile.c:996
 msgid "Type"
 msgstr "종류"
 
@@ -2140,8 +2244,8 @@ msgstr "종류"
 msgid "Function"
 msgstr "기능"
 
-#: app/log.c:617 modules/file/imgexport.c:3117 modules/process/fit-shape.c:465
-#: modules/process/neural.c:610 modules/tools/stats.c:425
+#: app/log.c:617 modules/file/imgexport.c:3128 modules/process/fit-shape.c:466
+#: modules/process/neural.c:614 modules/tools/stats.c:423
 msgid "Parameters"
 msgstr "변수"
 
@@ -2153,40 +2257,40 @@ msgstr "시간"
 msgid "Export Log"
 msgstr "로그 내보내기"
 
-#: app/menu.c:556 app/toolbox.c:581
+#: app/menu.c:555 app/toolbox.c:595
 msgid "_Data Process"
 msgstr "데이터 프로세스(D)"
 
-#: app/menu.c:598 app/toolbox.c:584
+#: app/menu.c:597 app/toolbox.c:598
 msgid "_Graph"
 msgstr "그래프(G)"
 
-#: app/menu.c:641 app/toolbox.c:587
+#: app/menu.c:640 app/toolbox.c:601
 msgid "_Volume Data"
 msgstr "3차원 데이터(V)"
 
-#: app/menu.c:684 app/toolbox.c:590
+#: app/menu.c:683 app/toolbox.c:604
 #, fuzzy
 msgid "_XYZ Data"
 msgstr "데이터"
 
-#: app/menu.c:715
+#: app/menu.c:714
 msgid "Re-show Last"
 msgstr "최근값 다시 보여주기"
 
-#: app/menu.c:730
+#: app/menu.c:729
 msgid "Repeat Last"
 msgstr "방금한 프로세스 다시실행"
 
-#: app/menu.c:858
+#: app/menu.c:857
 msgid "Repeat"
 msgstr "다시하기"
 
-#: app/menu.c:864
+#: app/menu.c:863
 msgid "Re-show"
 msgstr "다시보기"
 
-#: app/menu.c:1186
+#: app/menu.c:1185
 msgid "_Document history"
 msgstr "문서 작성 내역(D)"
 
@@ -2194,8 +2298,8 @@ msgstr "문서 작성 내역(D)"
 msgid "_New"
 msgstr "새로 만들기(N)"
 
-#: app/meta.c:235 modules/file/imgexport.c:4672 modules/file/rawfile.c:1058
-#: modules/process/neural.c:711 modules/tools/selectionmanager.c:405
+#: app/meta.c:235 modules/file/imgexport.c:4620 modules/file/rawfile.c:1058
+#: modules/process/neural.c:718 modules/tools/selectionmanager.c:405
 msgid "_Delete"
 msgstr "삭제하기(D)"
 
@@ -2269,11 +2373,11 @@ msgstr ""
 msgid "Cannot create user module directory %s: %s"
 msgstr ""
 
-#: app/splash.c:832
+#: app/splash.c:1260
 msgid "Starting "
 msgstr "시작하는 중"
 
-#: app/splash.c:878
+#: app/splash.c:1313
 msgid " is free software released under GNU GPL."
 msgstr "은 GNU GPL기반 무료 프로그랩입니다."
 
@@ -2679,134 +2783,135 @@ msgstr "다음 팁(N)"
 msgid "_Show tips at startup"
 msgstr ""
 
-#: app/toolbox-editor.c:212
+#: app/toolbox-editor.c:213
 #, fuzzy
 msgid "Toolbox Editor"
 msgstr "편집기"
 
-#: app/toolbox-editor.c:257
+#: app/toolbox-editor.c:258
 #, fuzzy
 msgid "_New Item"
 msgstr "새 아이템"
 
-#: app/toolbox-editor.c:262
+#: app/toolbox-editor.c:263
 #, fuzzy
 msgid "_New Group"
 msgstr "그래프 자르기"
 
-#: app/toolbox-editor.c:268 app/toolbox.c:577
+#: app/toolbox-editor.c:269 app/toolbox.c:591
 msgid "_Edit"
 msgstr "편집(E)"
 
-#: app/toolbox-editor.c:273 modules/process/fft_filter_2d.c:499
-#: modules/tools/maskedit.c:548 modules/volume/volume_zcal.c:173
+#: app/toolbox-editor.c:274 modules/process/fft_filter_2d.c:499
+#: modules/tools/maskedit.c:554 modules/volume/volume_zcal.c:173
 msgid "_Remove"
 msgstr "제거(R)"
 
-#: app/toolbox-editor.c:278
+#: app/toolbox-editor.c:279
 msgid "Move _Up"
 msgstr ""
 
-#: app/toolbox-editor.c:283
+#: app/toolbox-editor.c:284
 msgid "Move _Down"
 msgstr ""
 
-#: app/toolbox-editor.c:292 modules/file/hdrimage.cc:2304
-#: modules/file/imgexport.c:3101 modules/file/pixmap.c:872
+#: app/toolbox-editor.c:293 modules/file/hdrimage.cc:2304
+#: modules/file/imgexport.c:3114 modules/file/pixmap.c:872
 #: modules/file/rawfile.c:658 modules/process/crosscor.c:252
-#: modules/process/dimensions.h:473 modules/process/tip_blind.c:333
+#: modules/process/dimensions.h:455 modules/process/fibre_synth.c:526
+#: modules/process/tip_blind.c:334
 msgid "_Width:"
 msgstr ""
 
-#: app/toolbox-editor.c:774
+#: app/toolbox-editor.c:787
 msgid "Toolbox Group"
 msgstr ""
 
-#: app/toolbox-editor.c:791 modules/file/rawgraph.c:267
+#: app/toolbox-editor.c:804 modules/file/rawgraph.c:267
 msgid "_Title:"
 msgstr ""
 
-#: app/toolbox-editor.c:805
+#: app/toolbox-editor.c:818
 msgid "_Id:"
 msgstr ""
 
-#: app/toolbox-editor.c:818
+#: app/toolbox-editor.c:831
 msgid "_Suggest"
 msgstr ""
 
-#: app/toolbox-editor.c:824
+#: app/toolbox-editor.c:837
 msgid "Trans_latable title"
 msgstr ""
 
-#: app/toolbox-editor.c:874
+#: app/toolbox-editor.c:887
 msgid "Group id is not a valid identifier"
 msgstr ""
 
-#: app/toolbox-editor.c:882
+#: app/toolbox-editor.c:895
 msgid "Group id is not unique"
 msgstr ""
 
-#: app/toolbox-editor.c:971
+#: app/toolbox-editor.c:984
 msgid "Toolbox Item"
 msgstr ""
 
-#: app/toolbox-editor.c:992 modules/process/coerce.c:331
+#: app/toolbox-editor.c:1005 modules/process/coerce.c:331
 #: modules/tools/filter.c:284
 msgid "_Type:"
 msgstr ""
 
-#: app/toolbox-editor.c:999
+#: app/toolbox-editor.c:1012
 msgid "Placeholder"
 msgstr ""
 
-#: app/toolbox-editor.c:1000
+#: app/toolbox-editor.c:1013
 msgid "Builtin"
 msgstr ""
 
-#: app/toolbox-editor.c:1001 app/toolbox.c:107
+#: app/toolbox-editor.c:1014 app/toolbox.c:112
 msgid "Data Process"
 msgstr "데이터 프로세스"
 
-#: app/toolbox-editor.c:1003
+#: app/toolbox-editor.c:1016
 #, fuzzy
 msgid "Volume Data"
 msgstr "3차원 데이터(V)"
 
-#: app/toolbox-editor.c:1004
+#: app/toolbox-editor.c:1017
 #, fuzzy
 msgid "XYZ Data"
 msgstr "데이터"
 
-#: app/toolbox-editor.c:1005
+#: app/toolbox-editor.c:1018
 #, fuzzy
 msgid "Tool"
 msgstr "도구"
 
-#: app/toolbox-editor.c:1012
+#: app/toolbox-editor.c:1025 modules/tools/profile.c:483
 #, fuzzy
 msgid "_Mode:"
 msgstr "모드:"
 
-#: app/toolbox-editor.c:1019 app/toolbox-editor.c:1038
+#: app/toolbox-editor.c:1032 app/toolbox-editor.c:1051
 #, fuzzy
 msgid "Default"
 msgstr "기본값으로 설정"
 
-#: app/toolbox-editor.c:1020
+#: app/toolbox-editor.c:1033
 #, fuzzy
 msgid "Interactive"
 msgstr "교차점"
 
-#: app/toolbox-editor.c:1021
+#: app/toolbox-editor.c:1034
 #, fuzzy
 msgid "Non-interactive"
 msgstr "음성의"
 
-#: app/toolbox-editor.c:1029
+#: app/toolbox-editor.c:1042
 msgid "Use _icon from:"
 msgstr ""
 
-#: app/toolbox-editor.c:1063
+#: app/toolbox-editor.c:1076
 #, fuzzy
 msgid "Functions"
 msgstr "기능"
@@ -2824,150 +2929,168 @@ msgstr "그리기 도구(D)"
 msgid "All tools not placed explicitly go here."
 msgstr ""
 
-#: app/toolbox.c:106
+#: app/toolbox.c:111
 msgid "View"
 msgstr "보기"
 
-#: app/toolbox.c:109
+#: app/toolbox.c:114
 msgid "Tools"
 msgstr "도구"
 
-#: app/toolbox.c:575
+#: app/toolbox.c:589
 msgid "_File"
 msgstr "파일(F)"
 
-#: app/toolbox.c:593
+#: app/toolbox.c:607
 msgid "_Info"
 msgstr "정보(I)"
 
-#: app/toolbox.c:663
+#: app/toolbox.c:696
 msgid "Display a 3D view of data"
 msgstr "데이터를 3D 뷰로 보여주기"
 
-#: app/toolbox.c:667
+#: app/toolbox.c:700
+#, fuzzy
+msgid "Undo"
+msgstr "실행 취소(U)"
+
+#: app/toolbox.c:700
+msgid "Undo last action"
+msgstr ""
+
+#: app/toolbox.c:704
+#, fuzzy
+msgid "Redo"
+msgstr "/다시 실행(R)"
+
+#: app/toolbox.c:704
+msgid "Redo again last undone action"
+msgstr ""
+
+#: app/toolbox.c:708
 msgid "Zoom in"
 msgstr "확대"
 
-#: app/toolbox.c:671
+#: app/toolbox.c:712
 msgid "Zoom out"
 msgstr "축소"
 
-#: app/toolbox.c:675
+#: app/toolbox.c:716
 msgid "Zoom 1:1"
 msgstr "1:1 보기"
 
-#: app/toolbox.c:722
+#: app/toolbox.c:781
 msgid "/Show _Data Browser"
 msgstr "/데이터 브라우저 보기(D)"
 
-#: app/toolbox.c:730
+#: app/toolbox.c:789
 msgid "/Module _Browser"
 msgstr "/모듈 브라우저(B)"
 
-#: app/toolbox.c:738
+#: app/toolbox.c:797
 msgid "/Program _Messages"
 msgstr ""
 
-#: app/toolbox.c:753
+#: app/toolbox.c:812
 msgid "/_User Guide"
 msgstr "/사용자 메뉴얼(U)"
 
-#: app/toolbox.c:761
+#: app/toolbox.c:820
 msgid "/_Tip of the Day"
 msgstr "/오늘의 팁(T)"
 
-#: app/toolbox.c:769
+#: app/toolbox.c:828
 msgid "/_About Gwyddion"
 msgstr "/Gwyddion 정보(A)"
 
-#: app/toolbox.c:806
+#: app/toolbox.c:865
 msgid "/_Open..."
 msgstr "/열기(O)..."
 
-#: app/toolbox.c:814
+#: app/toolbox.c:873
 msgid "/_Merge..."
 msgstr "/병합(M)..."
 
-#: app/toolbox.c:822
+#: app/toolbox.c:881
 msgid "/Open _Recent"
 msgstr "/최근 파일 열기(R)"
 
-#: app/toolbox.c:830
+#: app/toolbox.c:889
 msgid "/_Save"
 msgstr "/저장(S)"
 
-#: app/toolbox.c:838
+#: app/toolbox.c:897
 msgid "/Save _As..."
 msgstr "/다른 이름으로 저장(A)..."
 
-#: app/toolbox.c:846
+#: app/toolbox.c:905
 #, fuzzy
 msgid "/_Close"
 msgstr "닫기(C)"
 
-#: app/toolbox.c:854
+#: app/toolbox.c:913
 msgid "/Remo_ve All Logs"
 msgstr "/로그 기록 모두 삭제(V)"
 
-#: app/toolbox.c:870
+#: app/toolbox.c:929
 msgid "/_Quit"
 msgstr "/끝내기(Q)"
 
-#: app/toolbox.c:910
+#: app/toolbox.c:969
 msgid "/_Undo"
 msgstr "/실행 취소(U)"
 
-#: app/toolbox.c:918
+#: app/toolbox.c:977
 msgid "/_Redo"
 msgstr "/다시 실행(R)"
 
-#: app/toolbox.c:934
+#: app/toolbox.c:993
 msgid "/Default Mask _Color..."
 msgstr "/초기 마스크 색상(C) ..."
 
-#: app/toolbox.c:942
+#: app/toolbox.c:1001
 msgid "/Color _Gradients..."
 msgstr "/색상 변화표(G)..."
 
-#: app/toolbox.c:950
+#: app/toolbox.c:1009
 msgid "/G_L Materials..."
 msgstr "/GL 색상표(L)"
 
-#: app/toolbox.c:958
+#: app/toolbox.c:1017
 msgid "/_Toolbox..."
 msgstr ""
 
-#: app/toolbox.c:966
+#: app/toolbox.c:1025
 msgid "/_Keyboard Shortcuts"
 msgstr "/키보드 단축키(K)"
 
-#: app/toolbox.c:974
+#: app/toolbox.c:1033
 msgid "/_Logging Enabled"
 msgstr "/로그 기록 활성화(L)"
 
-#: app/toolbox.c:1083
+#: app/toolbox.c:1142
 msgid "Program Messages"
 msgstr ""
 
-#: app/toolbox.c:1320
+#: app/toolbox.c:1379
 msgid "Change Default Mask Color"
 msgstr "기본 마스크 색상 변경하기"
 
-#: app/toolbox.c:1348
+#: app/toolbox.c:1407
 msgid "OpenGL 3D graphics not available"
 msgstr "OpenGL 3D 그래픽이 사용불가합니다."
 
-#: app/toolbox.c:1353
+#: app/toolbox.c:1412
 msgid "OpenGL was disabled with a command-line option."
 msgstr ""
 
-#: app/toolbox.c:1361
+#: app/toolbox.c:1420
 msgid ""
 "Initialization of OpenGL failed.  Check output of <tt>glxinfo</tt> and "
 "warning messages printed to console during Gwyddion startup."
 msgstr ""
 
-#: app/toolbox.c:1368
+#: app/toolbox.c:1427
 msgid "This version of Gwyddion was built without OpenGL support."
 msgstr ""
 
@@ -3043,7 +3166,7 @@ msgstr ""
 msgid "Secondary data item has no primary data"
 msgstr ""
 
-#: app/wait.c:106
+#: app/wait.c:114
 msgid "Please wait"
 msgstr ""
 
@@ -3060,11 +3183,11 @@ msgstr ""
 msgid "File header cannot be converted from ISO-8859-1 character set: %s"
 msgstr ""
 
-#: modules/file/aistfile.c:127
+#: modules/file/aistfile.c:123
 msgid "Imports AIST-NT data files."
 msgstr ""
 
-#: modules/file/aistfile.c:140
+#: modules/file/aistfile.c:136
 msgid "AIST-NT files (.aist)"
 msgstr ""
 
@@ -3111,7 +3234,8 @@ msgstr ""
 
 #: modules/file/alicona.c:665 modules/file/gdeffile.c:175
 #: modules/file/gdeffile.c:199 modules/file/gsffile.c:159
-#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1038
+#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1174
+#: modules/file/microprof.c:361 modules/file/microprof.c:375
 #: modules/file/pt3file.c:489 modules/file/pt3file.c:591
 msgid "File header is truncated."
 msgstr ""
@@ -3124,11 +3248,11 @@ msgstr ""
 msgid "Comment is not nul-terminated."
 msgstr ""
 
-#: modules/file/ambfile.c:84
+#: modules/file/ambfile.c:83
 msgid "Imports Ambios AMB data files."
 msgstr ""
 
-#: modules/file/ambfile.c:97
+#: modules/file/ambfile.c:96
 msgid "Ambios amb files (.amb)"
 msgstr ""
 
@@ -3160,11 +3284,11 @@ msgstr ""
 msgid "FileDescBegin has no corresponding FileDescEnd."
 msgstr ""
 
-#: modules/file/apedaxfile.c:259
+#: modules/file/apedaxfile.c:261
 msgid "Imports A.P.E. Research DAX data files."
 msgstr ""
 
-#: modules/file/apedaxfile.c:274
+#: modules/file/apedaxfile.c:276
 msgid "A.P.E. Research DAX Files (.dax) and APDT File (.apdt)"
 msgstr ""
 
@@ -3192,7 +3316,7 @@ msgstr "폭:"
 msgid "Height:"
 msgstr "높이:"
 
-#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:248
+#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:251
 msgid "Value units:"
 msgstr "값 단위:"
 
@@ -3201,30 +3325,30 @@ msgid "Export Text"
 msgstr "텍스트 내보내기"
 
 #: modules/file/asciiexport.c:275 modules/file/gxyzffile.c:402
-#: modules/file/imgexport.c:3565 modules/file/imgexport.c:4203
-#: modules/file/rawfile.c:758 modules/file/xyzexport.c:311
-#: modules/process/calibrate.c:607 modules/process/coerce.c:364
-#: modules/process/col_synth.c:516 modules/process/correct_affine.c:470
-#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:261
-#: modules/process/grain_dist.c:306 modules/process/grain_edge.c:255
-#: modules/process/grain_mark.c:338 modules/process/grain_wshed.c:252
-#: modules/process/linematch.c:852 modules/process/mark_disconn.c:279
-#: modules/process/slope_dist.c:367 modules/process/tip_blind.c:357
+#: modules/file/imgexport.c:3532 modules/file/imgexport.c:4151
+#: modules/file/rawfile.c:758 modules/file/xyzexport.c:314
+#: modules/process/calibrate.c:561 modules/process/coerce.c:363
+#: modules/process/col_synth.c:516 modules/process/correct_affine.c:520
+#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:263
+#: modules/process/grain_dist.c:307 modules/process/grain_edge.c:254
+#: modules/process/grain_mark.c:335 modules/process/grain_wshed.c:256
+#: modules/process/linematch.c:819 modules/process/mark_disconn.c:280
+#: modules/process/slope_dist.c:359 modules/process/tip_blind.c:360
 #: modules/process/wpour_mark.c:354 modules/tools/spotremove.c:322
-#: modules/tools/stats.c:402 modules/xyz/xyz_raster.c:628
+#: modules/tools/stats.c:401 modules/xyz/xyz_raster.c:597
 msgid "Options"
 msgstr "옵션"
 
-#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:314
+#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:317
 msgid "Use _dot as decimal separator"
 msgstr "점을 소수점으로 사용하기"
 
-#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:321
-#: modules/process/grain_dist.c:317
+#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:324
+#: modules/process/grain_dist.c:318
 msgid "Add _informational comment header"
 msgstr ""
 
-#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:330
+#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:333
 msgid "_Precision:"
 msgstr "정밀도(P):"
 
@@ -3244,20 +3368,20 @@ msgstr ""
 msgid "Attocube ASCII files (.asc)"
 msgstr ""
 
-#: modules/file/bcrfile.c:146
+#: modules/file/bcrfile.c:141
 msgid "Imports Image Metrology BCR data files."
 msgstr ""
 
-#: modules/file/bcrfile.c:159
+#: modules/file/bcrfile.c:154
 msgid "BCR files (.bcr, .bcrf)"
 msgstr ""
 
-#: modules/file/bcrfile.c:238
+#: modules/file/bcrfile.c:233
 #, c-format
 msgid "File header is not convertible from UTF-16: %s"
 msgstr ""
 
-#: modules/file/bcrfile.c:351
+#: modules/file/bcrfile.c:346
 #, c-format
 msgid "Unknown file type header: `%s'."
 msgstr ""
@@ -3292,7 +3416,7 @@ msgid "Burleigh exported data (.txt, .bin)"
 msgstr ""
 
 #: modules/file/burleigh_exp.c:226 modules/file/burleigh_exp.c:267
-#: modules/file/nanoscope.c:1605 modules/file/omicron.c:416
+#: modules/file/nanoscope.c:1612 modules/file/omicron.c:416
 #: modules/file/shimadzu.c:468
 msgid "Missing colon in header line."
 msgstr ""
@@ -3341,23 +3465,43 @@ msgstr ""
 msgid "Benyuan CSM files (.csm)"
 msgstr ""
 
-#: modules/file/dektakxml.c:138
+#: modules/file/dektakvca.c:197
+#, fuzzy
+msgid "Imports Dektak OPDx data files."
+msgstr "텍스트 파일로 그래프 데이터 내보내기"
+
+#: modules/file/dektakvca.c:210
+#, fuzzy
+msgid "Dektak OPDx data files (.OPDx)"
+msgstr "텍스트 파일로 그래프 데이터 내보내기"
+
+#: modules/file/dektakvca.c:655
+#, c-format
+msgid "Item `%s' has unexpected type %u instead of %u."
+msgstr ""
+
+#: modules/file/dektakvca.c:1022
+#, c-format
+msgid "Truncated data inside item %s."
+msgstr ""
+
+#: modules/file/dektakxml.c:118
 #, fuzzy
 msgid "Imports Dektak XML data files."
 msgstr "텍스트 파일로 그래프 데이터 내보내기"
 
-#: modules/file/dektakxml.c:151
+#: modules/file/dektakxml.c:131
 msgid "Dektak XML data files (.xml)"
 msgstr ""
 
-#: modules/file/dektakxml.c:228 modules/file/lextfile.c:260
-#: modules/file/nanoscan.c:267 modules/file/ometiff.c:265
+#: modules/file/dektakxml.c:208 modules/file/lextfile.c:260
+#: modules/file/nanoscan.c:270 modules/file/ometiff.c:265
 #, c-format
 msgid "XML parsing failed: %s"
 msgstr ""
 
-#: modules/file/dektakxml.c:400 modules/file/lextfile.c:163
-#: modules/file/nanoscan.c:672 modules/file/ometiff.c:445
+#: modules/file/dektakxml.c:373 modules/file/lextfile.c:163
+#: modules/file/nanoscan.c:698 modules/file/ometiff.c:445
 #, c-format
 msgid "Top-level element is not ‘%s’."
 msgstr ""
@@ -3470,7 +3614,7 @@ msgid "Scan size header field overlaps with data."
 msgstr ""
 
 #: modules/file/err.h:48 modules/file/nrrdfile.c:779
-#: modules/file/nrrdfile.c:824
+#: modules/file/nrrdfile.c:824 modules/pygwy/pygwy-console.c:504
 #, c-format
 msgid "Cannot read from file: %s."
 msgstr ""
@@ -3680,32 +3824,32 @@ msgid ""
 "Data deserialization succeeded, but resulted in an unexpected object %s."
 msgstr ""
 
-#: modules/file/gwytiff.h:332
+#: modules/file/gwytiff.h:335
 #, c-format
 msgid "BigTIFF reserved fields are %u and %u instead of 8 and 0."
 msgstr ""
 
-#: modules/file/gwytiff.h:349 modules/file/gwytiff.h:366
+#: modules/file/gwytiff.h:352 modules/file/gwytiff.h:369
 #, c-format
 msgid "TIFF directory %lu ended unexpectedly."
 msgstr ""
 
-#: modules/file/gwytiff.h:484
+#: modules/file/gwytiff.h:487
 #, c-format
 msgid "BigTIFF data type %u was found in a classic TIFF."
 msgstr ""
 
-#: modules/file/gwytiff.h:501
+#: modules/file/gwytiff.h:504
 msgid "Invalid tag data positions were found."
 msgstr ""
 
-#: modules/file/gwytiff.h:874 modules/file/gwytiff.h:889
-#: modules/file/gwytiff.h:1012 modules/file/gwytiff.h:1019
+#: modules/file/gwytiff.h:877 modules/file/gwytiff.h:892
+#: modules/file/gwytiff.h:1015 modules/file/gwytiff.h:1022
 #, c-format
 msgid "Required tag %u was not found."
 msgstr ""
 
-#: modules/file/gwytiff.h:942 modules/file/gwytiff.h:986
+#: modules/file/gwytiff.h:945 modules/file/gwytiff.h:989
 #: modules/file/keyence.c:449 modules/file/matfile.c:276
 #: modules/file/matfile.c:298 modules/file/omicronflat.c:1962
 #: modules/file/princetonspe.c:339 modules/file/psia.c:352
@@ -3713,21 +3857,21 @@ msgstr ""
 msgid "File is truncated."
 msgstr ""
 
-#: modules/file/gwytiff.h:1044
+#: modules/file/gwytiff.h:1047
 msgid "Non-uniform bits per sample are unsupported."
 msgstr ""
 
-#: modules/file/gwytiff.h:1071
+#: modules/file/gwytiff.h:1074 modules/file/zeisslsm.c:973
 #, c-format
 msgid "Compression type %u is not supported."
 msgstr ""
 
-#: modules/file/gwytiff.h:1077
+#: modules/file/gwytiff.h:1080
 #, c-format
 msgid "Planar configuration %u is not supported."
 msgstr ""
 
-#: modules/file/gwytiff.h:1101
+#: modules/file/gwytiff.h:1104
 msgid "Unsupported sample format"
 msgstr ""
 
@@ -3764,7 +3908,7 @@ msgstr ""
 msgid "Minizip error while reading the zip file: %s (%d)."
 msgstr ""
 
-#: modules/file/gwyzip.h:248
+#: modules/file/gwyzip.h:248 modules/file/jpkscan.c:2776
 #, c-format
 msgid "File %s is missing in the zip file."
 msgstr ""
@@ -3802,8 +3946,8 @@ msgstr ""
 msgid "Export GXYZF"
 msgstr "내보내기(E)"
 
-#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:238
-#: modules/file/xyzexport.c:304
+#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:241
+#: modules/file/xyzexport.c:307
 msgid "XYZ data:"
 msgstr ""
 
@@ -3890,11 +4034,13 @@ msgstr ""
 msgid "Representable"
 msgstr ""
 
-#: modules/file/hdrimage.cc:480 modules/tools/stats.c:203
+#: modules/file/hdrimage.cc:480 modules/graph/graph_stats.c:146
+#: modules/tools/stats.c:203
 msgid "Minimum:"
 msgstr ""
 
-#: modules/file/hdrimage.cc:496 modules/tools/stats.c:204
+#: modules/file/hdrimage.cc:496 modules/graph/graph_stats.c:147
+#: modules/tools/stats.c:204
 msgid "Maximum:"
 msgstr ""
 
@@ -3913,12 +4059,12 @@ msgid "OpenEXR data type %u is invalid or unsupported."
 msgstr ""
 
 #: modules/file/hdrimage.cc:1433 modules/file/hdrimage.cc:1442
-#: modules/file/imgexport.c:5249 modules/file/imgexport.c:5260
+#: modules/file/imgexport.c:5198 modules/file/imgexport.c:5209
 #, c-format
 msgid "libpng initialization error (in %s)"
 msgstr ""
 
-#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5324
+#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5273
 msgid "libpng error occurred"
 msgstr ""
 
@@ -3936,11 +4082,6 @@ msgstr ""
 msgid "Horizontal size:"
 msgstr ""
 
-#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
-#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
-msgid "px"
-msgstr ""
-
 #: modules/file/hdrimage.cc:2252 modules/file/pixmap.c:826
 msgid "Vertical size:"
 msgstr ""
@@ -3953,10 +4094,10 @@ msgstr ""
 msgid "Pages:"
 msgstr ""
 
-#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3043
+#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3059
 #: modules/file/pixmap.c:862 modules/file/rawfile.c:649
-#: modules/process/dimensions.h:467 modules/xyz/xyz_drift.c:774
-#: modules/xyz/xyz_raster.c:566
+#: modules/process/dimensions.h:449 modules/xyz/xyz_drift.c:774
+#: modules/xyz/xyz_raster.c:535
 msgid "Physical Dimensions"
 msgstr ""
 
@@ -3966,16 +4107,16 @@ msgstr ""
 #: modules/process/calcoefs_new.c:408 modules/process/calcoefs_new.c:475
 #: modules/process/calcoefs_simple.c:391 modules/process/calcoefs_simple.c:458
 #: modules/process/calcoefs_view.c:511 modules/process/calcoefs_view.c:549
-#: modules/process/calibrate.c:466 modules/process/calibrate.c:549
-#: modules/process/dimensions.h:161 modules/process/volumize_layers.c:259
-#: modules/volume/volume_calibrate.c:414 modules/volume/volume_calibrate.c:441
-#: modules/volume/volume_calibrate.c:468 modules/volume/volume_calibrate.c:546
+#: modules/process/calibrate.c:459 modules/process/calibrate.c:514
+#: modules/process/dimensions.h:143 modules/process/volumize_layers.c:259
+#: modules/volume/volume_calibrate.c:409 modules/volume/volume_calibrate.c:429
+#: modules/volume/volume_calibrate.c:449 modules/volume/volume_calibrate.c:498
 msgid "verb|Change"
 msgstr ""
 
 #: modules/file/hdrimage.cc:2345 modules/file/pixmap.c:907
-#: modules/file/rawfile.c:694 modules/process/crosscor.c:263
-#: modules/process/dimensions.h:477
+#: modules/file/rawfile.c:694 modules/process/crosscor.c:260
+#: modules/process/dimensions.h:459
 msgid "H_eight:"
 msgstr ""
 
@@ -3992,16 +4133,16 @@ msgstr ""
 #: modules/file/hdrimage.cc:2557 modules/file/pixmap.c:1176
 #: modules/file/rawfile.c:1386 modules/process/calcoefs_new.c:819
 #: modules/process/calcoefs_simple.c:1197 modules/process/calcoefs_view.c:1380
-#: modules/process/calibrate.c:979 modules/process/dimensions.h:195
-#: modules/process/volumize_layers.c:315 modules/volume/volume_calibrate.c:1017
+#: modules/process/calibrate.c:1013 modules/process/dimensions.h:177
+#: modules/process/volumize_layers.c:314 modules/volume/volume_calibrate.c:957
 msgid "Change Units"
 msgstr ""
 
 #: modules/file/hdrimage.cc:2571 modules/file/pixmap.c:1190
 #: modules/file/rawfile.c:1400 modules/process/calcoefs_new.c:832
 #: modules/process/calcoefs_simple.c:1210 modules/process/calcoefs_view.c:1393
-#: modules/process/calibrate.c:993 modules/process/dimensions.h:208
-#: modules/process/volumize_layers.c:329 modules/volume/volume_calibrate.c:1031
+#: modules/process/calibrate.c:1027 modules/process/dimensions.h:190
+#: modules/process/volumize_layers.c:328 modules/volume/volume_calibrate.c:971
 msgid "New _units:"
 msgstr ""
 
@@ -4045,191 +4186,192 @@ msgstr ""
 msgid "Field DataSize %ux%u does not match image dimensions %ux%u."
 msgstr ""
 
-#: modules/file/igorfile.c:200
+#: modules/file/igorfile.c:210
 msgid "Imports Igor binary waves (.ibw)."
 msgstr ""
 
-#: modules/file/igorfile.c:213
+#: modules/file/igorfile.c:223
 msgid "Igor binary waves (.ibw)"
 msgstr ""
 
-#: modules/file/igorfile.c:273
+#: modules/file/igorfile.c:283
 #, c-format
 msgid "Format version is %d.  Only version 5 is supported."
 msgstr ""
 
-#: modules/file/igorfile.c:294
+#: modules/file/igorfile.c:305
 msgid "Only two-dimensional data are supported."
 msgstr ""
 
-#: modules/file/igorfile.c:306
+#: modules/file/igorfile.c:317
 #, c-format
 msgid "Number of data points %u does not match resolutions %u×%u×%u."
 msgstr ""
 
-#: modules/file/igorfile.c:320
+#: modules/file/igorfile.c:331
 #, c-format
 msgid "Data size %u does not match the number of data points %u×%u."
 msgstr ""
 
-#: modules/file/igorfile.c:358
+#: modules/file/igorfile.c:369
 msgid "Cannot read channel labels."
 msgstr ""
 
-#: modules/file/imgexport.c:392 modules/file/pixmap.c:178
+#: modules/file/imgexport.c:391 modules/file/pixmap.c:178
 msgid "Portable Network Graphics (.png)"
 msgstr ""
 
-#: modules/file/imgexport.c:398 modules/file/pixmap.c:182
+#: modules/file/imgexport.c:397 modules/file/pixmap.c:182
 msgid "JPEG (.jpeg,.jpg)"
 msgstr ""
 
-#: modules/file/imgexport.c:404 modules/file/pixmap.c:186
+#: modules/file/imgexport.c:403 modules/file/pixmap.c:186
 msgid "TIFF (.tiff,.tif)"
 msgstr ""
 
-#: modules/file/imgexport.c:410 modules/file/pixmap.c:190
+#: modules/file/imgexport.c:409 modules/file/pixmap.c:190
 msgid "Portable Pixmap (.ppm,.pnm)"
 msgstr ""
 
-#: modules/file/imgexport.c:416 modules/file/pixmap.c:194
+#: modules/file/imgexport.c:415 modules/file/pixmap.c:194
 msgid "Windows or OS2 Bitmap (.bmp)"
 msgstr ""
 
-#: modules/file/imgexport.c:422 modules/file/pixmap.c:198
+#: modules/file/imgexport.c:421 modules/file/pixmap.c:198
 msgid "TARGA (.tga,.targa)"
 msgstr ""
 
-#: modules/file/imgexport.c:429
+#: modules/file/imgexport.c:428
 msgid "WebP (.webp)"
 msgstr ""
 
-#: modules/file/imgexport.c:437
+#: modules/file/imgexport.c:436
 msgid "Portable document format (.pdf)"
 msgstr ""
 
-#: modules/file/imgexport.c:445
+#: modules/file/imgexport.c:444
 msgid "Encapsulated PostScript (.eps)"
 msgstr ""
 
-#: modules/file/imgexport.c:453
+#: modules/file/imgexport.c:452
 msgid "Scalable Vector Graphics (.svg)"
 msgstr ""
 
-#: modules/file/imgexport.c:463 modules/tools/selectionmanager.c:269
+#: modules/file/imgexport.c:462 modules/tools/selectionmanager.c:269
 msgid "Horiz./vert. lines"
 msgstr ""
 
-#: modules/file/imgexport.c:467 modules/tools/selectionmanager.c:270
+#: modules/file/imgexport.c:466 modules/tools/selectionmanager.c:270
 msgid "Ellipses"
 msgstr ""
 
-#: modules/file/imgexport.c:471 modules/tools/selectionmanager.c:272
+#: modules/file/imgexport.c:470 modules/tools/selectionmanager.c:272
 msgid "Lines"
 msgstr ""
 
-#: modules/file/imgexport.c:479 modules/tools/selectionmanager.c:275
+#: modules/file/imgexport.c:478 modules/tools/selectionmanager.c:275
 msgid "Rectangles"
 msgstr ""
 
-#: modules/file/imgexport.c:483 modules/process/lat_synth.c:565
+#: modules/file/imgexport.c:482 modules/process/lat_synth.c:565
 #: modules/process/lat_synth.c:637 modules/tools/selectionmanager.c:271
 msgid "Lattice"
 msgstr ""
 
-#: modules/file/imgexport.c:487
+#: modules/file/imgexport.c:486
 msgid "Path"
 msgstr ""
 
-#: modules/file/imgexport.c:493 modules/file/imgexport.c:499
+#: modules/file/imgexport.c:492 modules/file/imgexport.c:498
 msgid "ruler|_None"
 msgstr ""
 
-#: modules/file/imgexport.c:494
+#: modules/file/imgexport.c:493
 msgid "_Rulers"
 msgstr ""
 
-#: modules/file/imgexport.c:495
+#: modules/file/imgexport.c:494
 msgid "_Inset scale bar"
 msgstr ""
 
-#: modules/file/imgexport.c:500
+#: modules/file/imgexport.c:499
 msgid "_False color ruler"
 msgstr ""
 
-#: modules/file/imgexport.c:504
+#: modules/file/imgexport.c:503
 msgid "title|None"
 msgstr ""
 
-#: modules/file/imgexport.c:505
+#: modules/file/imgexport.c:504
 msgid "At the top"
 msgstr ""
 
-#: modules/file/imgexport.c:506
+#: modules/file/imgexport.c:505
 msgid "Along the right edge"
 msgstr ""
 
-#: modules/file/imgexport.c:512
+#: modules/file/imgexport.c:511
 msgid ""
 "Renders data into vector (SVG, PDF, EPS) and pixmap (PNG, JPEG, TIFF, WebP, "
 "PPM, BMP, TARGA) images. Export to some formats relies on GDK and other "
 "libraries thus may be installation-dependent."
 msgstr ""
 
-#: modules/file/imgexport.c:2931
+#: modules/file/imgexport.c:2933
 #, fuzzy
 msgid "Select Color"
 msgstr "곡선 색상 설정"
 
-#: modules/file/imgexport.c:3002
-msgid "Black"
+#: modules/file/imgexport.c:3005
+msgid "White"
 msgstr ""
 
-#: modules/file/imgexport.c:3010
-msgid "White"
+#: modules/file/imgexport.c:3014
+msgid "Black"
 msgstr ""
 
-#: modules/file/imgexport.c:3053
+#: modules/file/imgexport.c:3069
 #, fuzzy
 msgid "Pi_xel size:"
 msgstr "점 크기(P):"
 
-#: modules/file/imgexport.c:3062
+#: modules/file/imgexport.c:3077
 msgid "Pixels per _inch:"
 msgstr ""
 
-#: modules/file/imgexport.c:3089
+#: modules/file/imgexport.c:3102
 msgid "_Zoom:"
 msgstr ""
 
-#: modules/file/imgexport.c:3108 modules/process/bdep_synth.c:430
+#: modules/file/imgexport.c:3120 modules/process/bdep_synth.c:430
 #: modules/process/col_synth.c:486 modules/process/diff_synth.c:508
-#: modules/process/domain_synth.c:510 modules/process/grain_mark.c:285
-#: modules/process/lat_synth.c:753 modules/process/obj_synth.c:575
-#: modules/process/pat_synth.c:852 modules/process/pat_synth.c:1154
-#: modules/process/pat_synth.c:1489 modules/process/tip_blind.c:340
+#: modules/process/domain_synth.c:510 modules/process/fibre_synth.c:540
+#: modules/process/grain_mark.c:284 modules/process/lat_synth.c:753
+#: modules/process/obj_synth.c:573 modules/process/pat_synth.c:853
+#: modules/process/pat_synth.c:1155 modules/process/pat_synth.c:1490
+#: modules/process/phase_synth.c:298 modules/process/tip_blind.c:342
 msgid "_Height:"
 msgstr ""
 
-#: modules/file/imgexport.c:3121
+#: modules/file/imgexport.c:3136
 msgid "_Font:"
 msgstr ""
 
-#: modules/file/imgexport.c:3140
+#: modules/file/imgexport.c:3145
 msgid "_Font size:"
 msgstr ""
 
-#: modules/file/imgexport.c:3160
+#: modules/file/imgexport.c:3163
 #, fuzzy
 msgid "O_utline thickness:"
 msgstr "선 굵기(H):"
 
-#: modules/file/imgexport.c:3170
+#: modules/file/imgexport.c:3172
 #, fuzzy
 msgid "_Border width:"
 msgstr "새 너비(W):"
 
-#: modules/file/imgexport.c:3180
+#: modules/file/imgexport.c:3181
 #, fuzzy
 msgid "_Tick length:"
 msgstr "최소 길이(L)"
@@ -4251,233 +4393,234 @@ msgstr "색상"
 msgid "_Line and text color:"
 msgstr ""
 
-#: modules/file/imgexport.c:3221
+#: modules/file/imgexport.c:3220
 msgid "_Transparent background"
 msgstr ""
 
-#: modules/file/imgexport.c:3232
+#: modules/file/imgexport.c:3231
 #, fuzzy
 msgid "_Background color:"
 msgstr "그리기 색상(O):"
 
-#: modules/file/imgexport.c:3474
-#, fuzzy
-msgid "Lateral scale"
-msgstr "GL 재료"
-
-#: modules/file/imgexport.c:3487 modules/process/lno_synth.c:1053
-msgid "_Length:"
-msgstr ""
-
-#: modules/file/imgexport.c:3503
-msgid "_Auto"
-msgstr ""
-
-#: modules/file/imgexport.c:3511 modules/process/pat_synth.c:469
+#: modules/file/imgexport.c:3433 modules/process/fibre_synth.c:582
+#: modules/process/pat_synth.c:470
 msgid "Placement"
 msgstr ""
 
-#: modules/file/imgexport.c:3515
+#: modules/file/imgexport.c:3437
 msgid "left"
 msgstr ""
 
-#: modules/file/imgexport.c:3519
+#: modules/file/imgexport.c:3440
 msgid "center"
 msgstr ""
 
-#: modules/file/imgexport.c:3523
+#: modules/file/imgexport.c:3443
 msgid "right"
 msgstr ""
 
-#: modules/file/imgexport.c:3528
+#: modules/file/imgexport.c:3448
 msgid "top"
 msgstr ""
 
-#: modules/file/imgexport.c:3540
+#: modules/file/imgexport.c:3456
 msgid "bottom"
 msgstr ""
 
-#: modules/file/imgexport.c:3552 modules/file/imgexport.c:3874
+#: modules/file/imgexport.c:3479
+#, fuzzy
+msgid "Lateral scale"
+msgstr "GL 재료"
+
+#: modules/file/imgexport.c:3496 modules/process/lno_synth.c:1053
+msgid "_Length:"
+msgstr ""
+
+#: modules/file/imgexport.c:3502
+msgid "_Auto"
+msgstr ""
+
+#: modules/file/imgexport.c:3519 modules/file/imgexport.c:3832
 #, fuzzy
 msgid "Hori_zontal gap:"
 msgstr "수평의"
 
-#: modules/file/imgexport.c:3558 modules/file/imgexport.c:3854
+#: modules/file/imgexport.c:3526 modules/file/imgexport.c:3812
 #, fuzzy
 msgid "_Vertical gap:"
 msgstr "수직방향(V)"
 
-#: modules/file/imgexport.c:3571 modules/file/imgexport.c:4184
+#: modules/file/imgexport.c:3538 modules/file/imgexport.c:4134
 #, fuzzy
 msgid "Colo_r:"
 msgstr "색상"
 
-#: modules/file/imgexport.c:3576 modules/file/imgexport.c:4189
+#: modules/file/imgexport.c:3542 modules/file/imgexport.c:4138
 msgid "Out_line color:"
 msgstr ""
 
-#: modules/file/imgexport.c:3580 modules/file/imgexport.c:4195
+#: modules/file/imgexport.c:3547 modules/file/imgexport.c:4143
 msgid "O_pacity:"
 msgstr ""
 
-#: modules/file/imgexport.c:3589
+#: modules/file/imgexport.c:3554
 msgid "Draw _ticks"
 msgstr ""
 
-#: modules/file/imgexport.c:3599
+#: modules/file/imgexport.c:3564
 msgid "Draw _label"
 msgstr ""
 
-#: modules/file/imgexport.c:3609
+#: modules/file/imgexport.c:3574
 msgid "Draw text _above scale bar"
 msgstr ""
 
-#: modules/file/imgexport.c:3773
+#: modules/file/imgexport.c:3738
 msgid "Image"
 msgstr ""
 
-#: modules/file/imgexport.c:3777 modules/process/calcoefs_view.c:473
-#: modules/process/correct_affine.c:488 modules/process/drift.c:297
-#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:202
-#: modules/process/fft_filter_1d.c:294 modules/process/fft_profile.c:292
-#: modules/process/fractal.c:253 modules/process/nanoindent_adjust.c:229
-#: modules/process/polydistort.c:247 modules/process/rotate.c:274
-#: modules/process/scale.c:253 modules/process/straighten_path.c:271
+#: modules/file/imgexport.c:3742 modules/process/calcoefs_view.c:473
+#: modules/process/correct_affine.c:538 modules/process/drift.c:298
+#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:203
+#: modules/process/fft_filter_1d.c:296 modules/process/fft_profile.c:293
+#: modules/process/fractal.c:262 modules/process/nanoindent_adjust.c:229
+#: modules/process/polydistort.c:250 modules/process/rotate.c:274
+#: modules/process/scale.c:257 modules/process/straighten_path.c:270
 #: modules/process/unrotate.c:277 modules/tools/linestats.c:400
-#: modules/tools/profile.c:555 modules/tools/roughness.c:864
-#: modules/tools/sfunctions.c:468 modules/xyz/xyz_raster.c:632
+#: modules/tools/profile.c:552 modules/tools/roughness.c:879
+#: modules/tools/sfunctions.c:481 modules/xyz/xyz_raster.c:601
 msgid "_Interpolation type:"
 msgstr ""
 
-#: modules/file/imgexport.c:3807
+#: modules/file/imgexport.c:3772
 #, fuzzy
 msgid "Draw _frame"
 msgstr "Grain number"
 
-#: modules/file/imgexport.c:3816
+#: modules/file/imgexport.c:3781
 msgid "Draw _mask"
 msgstr ""
 
-#: modules/file/imgexport.c:3826
+#: modules/file/imgexport.c:3791
 msgid "Draw mask _legend"
 msgstr ""
 
-#: modules/file/imgexport.c:3861
+#: modules/file/imgexport.c:3819
 msgid "Value Scale"
 msgstr ""
 
-#: modules/file/imgexport.c:3882
+#: modules/file/imgexport.c:3840
 #, fuzzy
 msgid "Fi_xed precision:"
 msgstr "정밀도(P):"
 
-#: modules/file/imgexport.c:3898
+#: modules/file/imgexport.c:3855
 #, fuzzy
 msgid "Fixed _kilo threshold:"
 msgstr "Soft threshold(S):"
 
-#: modules/file/imgexport.c:3914 modules/file/imgexport.c:4635
+#: modules/file/imgexport.c:3869 modules/file/imgexport.c:4583
 #, fuzzy
 msgid "Title"
 msgstr "제목 없음"
 
-#: modules/file/imgexport.c:3918
+#: modules/file/imgexport.c:3877
 #, fuzzy
 msgid "Posi_tion:"
 msgstr "위치"
 
-#: modules/file/imgexport.c:3934
+#: modules/file/imgexport.c:3884
 msgid "_Gap:"
 msgstr ""
 
-#: modules/file/imgexport.c:3941
+#: modules/file/imgexport.c:3891
 msgid "Put _units to title"
 msgstr ""
 
-#: modules/file/imgexport.c:4125
+#: modules/file/imgexport.c:4075
 msgid "Draw _selection"
 msgstr ""
 
-#: modules/file/imgexport.c:4176 modules/tools/selectionmanager.c:361
+#: modules/file/imgexport.c:4126 modules/tools/selectionmanager.c:361
 msgid "Objects"
 msgstr ""
 
-#: modules/file/imgexport.c:4615
+#: modules/file/imgexport.c:4563
 #, fuzzy
 msgid "Lateral"
 msgstr "GL 재료"
 
-#: modules/file/imgexport.c:4654 modules/file/rawfile.c:1040
-#: modules/process/calcoefs_load.c:230 modules/process/neural.c:693
+#: modules/file/imgexport.c:4602 modules/file/rawfile.c:1040
+#: modules/process/calcoefs_load.c:230 modules/process/neural.c:700
 msgid "verb|_Load"
 msgstr ""
 
-#: modules/file/imgexport.c:4660 modules/file/rawfile.c:1046
-#: modules/process/neural.c:699
+#: modules/file/imgexport.c:4608 modules/file/rawfile.c:1046
+#: modules/process/neural.c:706
 msgid "verb|_Store"
 msgstr ""
 
-#: modules/file/imgexport.c:4666 modules/file/rawfile.c:1052
-#: modules/process/neural.c:705
+#: modules/file/imgexport.c:4614 modules/file/rawfile.c:1052
+#: modules/process/neural.c:712
 msgid "_Rename"
 msgstr ""
 
-#: modules/file/imgexport.c:4686 modules/file/rawfile.c:1071
+#: modules/file/imgexport.c:4634 modules/file/rawfile.c:1071
 msgid "Preset _name:"
 msgstr ""
 
-#: modules/file/imgexport.c:4757
+#: modules/file/imgexport.c:4705
 #, c-format
 msgid "Export %s"
 msgstr ""
 
-#: modules/file/imgexport.c:4778
+#: modules/file/imgexport.c:4727
 msgid "Export as 1_6 bit grayscale"
 msgstr ""
 
-#: modules/file/imgexport.c:4801
+#: modules/file/imgexport.c:4750
 msgid "Lateral Scale"
 msgstr ""
 
-#: modules/file/imgexport.c:4806
+#: modules/file/imgexport.c:4755
 #, fuzzy
 msgid "Values"
 msgstr "값"
 
-#: modules/file/imgexport.c:4811
+#: modules/file/imgexport.c:4760
 #, fuzzy
 msgid "Selection"
 msgstr "부분:"
 
-#: modules/file/imgexport.c:4816 modules/file/rawfile.c:462
+#: modules/file/imgexport.c:4765 modules/file/rawfile.c:462
 #: modules/process/convolution_filter.c:275
 msgid "Presets"
 msgstr ""
 
-#: modules/file/imgexport.c:5576
+#: modules/file/imgexport.c:5525
 #, c-format
 msgid "Cairo error occurred: %s"
 msgstr ""
 
-#: modules/file/imgexport.c:5600
+#: modules/file/imgexport.c:5549
 #, c-format
 msgid "Pixbuf save failed: %s."
 msgstr ""
 
-#: modules/file/imgexport.c:5878
+#: modules/file/imgexport.c:5827
 msgid "Image is too large to be stored as TARGA."
 msgstr ""
 
-#: modules/file/imgexport.c:6457 modules/file/imgexport.c:6486
+#: modules/file/imgexport.c:6406 modules/file/imgexport.c:6435
 #, fuzzy
 msgid "Draw _numbers"
 msgstr "Grain number"
 
-#: modules/file/imgexport.c:6469 modules/file/imgexport.c:6517
+#: modules/file/imgexport.c:6418 modules/file/imgexport.c:6466
 msgid "_End marker length:"
 msgstr ""
 
-#: modules/file/imgexport.c:6498
+#: modules/file/imgexport.c:6447
 #, fuzzy
 msgid "Marker _radius:"
 msgstr "곡률 반경 1"
@@ -4516,45 +4659,56 @@ msgstr ""
 msgid "image depth"
 msgstr ""
 
-#: modules/file/iso28600.c:534
+#: modules/file/iso28600.c:543
 msgid "Imports and exports ISO 28600:2011 SPM data transfer format."
 msgstr ""
 
-#: modules/file/iso28600.c:550
+#: modules/file/iso28600.c:559
 msgid "ISO 28600:2011 SPM data transfer files (.spm)"
 msgstr ""
 
-#: modules/file/iso28600.c:606
+#: modules/file/iso28600.c:658
 #, c-format
-msgid "Only regular mappings are implemented but file has mapping type ‘%s’."
+msgid ""
+"Only regular and irregular mappings are implemented but the file has mapping "
+"type ‘%s’."
 msgstr ""
 
-#: modules/file/iso28600.c:668 modules/file/iso28600.c:677
-#: modules/file/iso28600.c:686
+#: modules/file/iso28600.c:687 modules/file/iso28600.c:696
+#: modules/file/iso28600.c:705
 #, c-format
 msgid "List ‘%s’ has %u items which differs from the number %u given by ‘%s’."
 msgstr ""
 
-#: modules/file/iso28600.c:755 modules/file/iso28600.c:867
-#: modules/file/sdfile.c:846 modules/file/sdfile.c:863
-#: modules/file/spip-asc.c:239 modules/file/witec-asc.c:223
-#: modules/file/wsffile.c:215
+#: modules/file/iso28600.c:775
 #, c-format
-msgid "End of file reached when reading sample #%d of %d"
+msgid "End of file reached when reading sample #%u of %u"
 msgstr ""
 
-#: modules/file/iso28600.c:764 modules/file/iso28600.c:876
-#: modules/file/spip-asc.c:246 modules/file/witec-asc.c:230
-#: modules/file/wsffile.c:222
+#: modules/file/iso28600.c:784 modules/file/iso28600.c:873
 #, c-format
-msgid "Malformed data encountered when reading sample #%d of %d"
+msgid "Malformed data encountered when reading sample #%u"
 msgstr ""
 
-#: modules/file/iso28600.c:774 modules/file/iso28600.c:886
+#: modules/file/iso28600.c:797 modules/file/iso28600.c:887
+#: modules/file/iso28600.c:1022
 msgid "Missing end-of-data marker."
 msgstr ""
 
-#: modules/file/iso28600.c:1048
+#: modules/file/iso28600.c:1003 modules/file/sdfile.c:846
+#: modules/file/sdfile.c:863 modules/file/spip-asc.c:239
+#: modules/file/witec-asc.c:223 modules/file/wsffile.c:215
+#, c-format
+msgid "End of file reached when reading sample #%d of %d"
+msgstr ""
+
+#: modules/file/iso28600.c:1012 modules/file/spip-asc.c:246
+#: modules/file/witec-asc.c:230 modules/file/wsffile.c:222
+#, c-format
+msgid "Malformed data encountered when reading sample #%d of %d"
+msgstr ""
+
+#: modules/file/iso28600.c:1184
 #, c-format
 msgid "Line %u does not contain mandatory label ‘%s’."
 msgstr ""
@@ -4571,42 +4725,62 @@ msgstr ""
 msgid "The type of data is unknown.  Please report it to the developers."
 msgstr ""
 
-#: modules/file/jpkscan.c:229
+#: modules/file/jpkscan.c:292
 msgid "Imports JPK image scans."
 msgstr ""
 
-#: modules/file/jpkscan.c:242
+#: modules/file/jpkscan.c:305
 msgid "JPK image scans (.jpk, .jpk-qi-image)"
 msgstr ""
 
-#: modules/file/jpkscan.c:249
+#: modules/file/jpkscan.c:312
 msgid "JPK force curves (.jpk-force, .jpk-force-map, .jpk-qi-data)"
 msgstr ""
 
-#: modules/file/jpkscan.c:315
+#: modules/file/jpkscan.c:378
 msgid "File does not contain grid dimensions."
 msgstr ""
 
-#: modules/file/jpkscan.c:660 modules/file/nanoobserver.c:193
+#: modules/file/jpkscan.c:736 modules/file/nanoobserver.c:360
 #: modules/file/nanoscantech.c:205 modules/file/opengps.c:209
 #: modules/file/sensofarx.c:183 modules/file/spmxfile.c:166
 msgid "Minizip cannot open the file as a ZIP file."
 msgstr ""
 
-#: modules/file/jpkscan.c:739
+#: modules/file/jpkscan.c:758 modules/file/jpkscan.c:2717
+#, c-format
+msgid "Scanning file (%u curves)..."
+msgstr ""
+
+#: modules/file/jpkscan.c:798 modules/file/nmmxyz.c:299
+#, fuzzy
+msgid "Reading files..."
+msgstr "마스킹 모드"
+
+#: modules/file/jpkscan.c:816
+#, fuzzy
+msgid "Creating volume data..."
+msgstr "3차원 데이터 값 반전"
+
+#: modules/file/jpkscan.c:968
 msgid "Non-uniform point and/or segment numbering is not supported."
 msgstr ""
 
-#: modules/file/jpkscan.c:748
+#: modules/file/jpkscan.c:977
 msgid "Non-uniform channel lists are not supported."
 msgstr ""
 
-#: modules/file/jpkscan.c:756
+#: modules/file/jpkscan.c:985
 #, c-format
 msgid "Data file %s was found instead of expected %s."
 msgstr ""
 
-#: modules/file/jpkscan.c:1497
+#: modules/file/jpkscan.c:1900
+#, c-format
+msgid "Header properties file for index %u is missing."
+msgstr ""
+
+#: modules/file/jpkscan.c:2519
 #, fuzzy
 msgid "Cannot find any height channel."
 msgstr "도움말을 표시할 수 없습니다. "
@@ -4758,19 +4932,19 @@ msgstr ""
 msgid "File header is larger than file."
 msgstr ""
 
-#: modules/file/microprof.c:117
+#: modules/file/microprof.c:125
 msgid "Imports MicroProf FRT profilometer data files."
 msgstr ""
 
-#: modules/file/microprof.c:130
+#: modules/file/microprof.c:138
 msgid "MicroProf FRT files (.frt)"
 msgstr ""
 
-#: modules/file/microprof.c:136
+#: modules/file/microprof.c:144
 msgid "MicroProf FRT text files (.txt)"
 msgstr ""
 
-#: modules/file/microprof.c:432
+#: modules/file/microprof.c:519
 msgid "File contains fewer than XSize*YSize data points."
 msgstr ""
 
@@ -4858,8 +5032,8 @@ msgstr ""
 msgid "Spectra data starts past the end of file."
 msgstr ""
 
-#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:276
-#: modules/file/renishaw.c:1325 modules/file/sensofar.c:256
+#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:287
+#: modules/file/renishaw.c:1334 modules/file/sensofar.c:256
 #: modules/file/witec-asc.c:161
 msgid "File header is truncated"
 msgstr ""
@@ -4869,8 +5043,8 @@ msgstr ""
 msgid "Parameter header is truncated"
 msgstr ""
 
-#: modules/file/nanoeducator.c:932 modules/process/curvature.c:454
-#: modules/tools/profile.c:1107
+#: modules/file/nanoeducator.c:932 modules/process/curvature.c:456
+#: modules/tools/profile.c:1090
 #, c-format
 msgid "Profile %d"
 msgstr ""
@@ -4950,23 +5124,27 @@ msgstr ""
 msgid "Missing data start marker \\x1a\\x04."
 msgstr ""
 
-#: modules/file/nanoobserver.c:113
-msgid "Reads NanoObserver .nao files."
+#: modules/file/nanoobserver.c:201
+msgid "Reads Nano-Solution/NanoObserver .nao files."
+msgstr ""
+
+#: modules/file/nanoobserver.c:214
+msgid "Nano-Solution/NanoObserver data (.nao)"
 msgstr ""
 
-#: modules/file/nanoobserver.c:126
-msgid "NanoObserver data (.nao)"
+#: modules/file/nanoobserver.c:410 modules/file/renishaw.c:1420
+msgid "Data block is truncated"
 msgstr ""
 
-#: modules/file/nanoscan.c:188
+#: modules/file/nanoscan.c:191
 msgid "Imports NanoScan XML files."
 msgstr ""
 
-#: modules/file/nanoscan.c:201
+#: modules/file/nanoscan.c:204
 msgid "NanoScan XML files (.xml)"
 msgstr ""
 
-#: modules/file/nanoscan.c:910
+#: modules/file/nanoscan.c:937
 msgid "Wrong size of Base64 encoded data."
 msgstr ""
 
@@ -4986,20 +5164,20 @@ msgstr ""
 msgid "Nanoscope II files"
 msgstr ""
 
-#: modules/file/nanoscope.c:207
+#: modules/file/nanoscope.c:212
 msgid ""
 "Imports Veeco (Digital Instruments) Nanoscope data files, version 3 or newer."
 msgstr ""
 
-#: modules/file/nanoscope.c:221
+#: modules/file/nanoscope.c:226
 msgid "Nanoscope III files"
 msgstr ""
 
-#: modules/file/nanoscope.c:288
+#: modules/file/nanoscope.c:295
 msgid "File is not a Nanoscope file, or it is a unknown subtype."
 msgstr ""
 
-#: modules/file/nanoscope.c:295
+#: modules/file/nanoscope.c:302
 msgid ""
 "File has been damaged by change of line endings, resulting in corruption of "
 "the binary part of the file.\n"
@@ -5010,16 +5188,16 @@ msgid ""
 "transfer that attempts to store text platform-independently."
 msgstr ""
 
-#: modules/file/nanoscope.c:653 modules/file/nanoscope.c:669
+#: modules/file/nanoscope.c:660 modules/file/nanoscope.c:676
 msgid "Cannot parse `Scan size' field."
 msgstr ""
 
-#: modules/file/nanoscope.c:1539 modules/file/nrrdfile.c:1086
+#: modules/file/nanoscope.c:1546 modules/file/nrrdfile.c:1086
 #, c-format
 msgid "Garbage after data sample #%u."
 msgstr ""
 
-#: modules/file/nanoscope.c:1595
+#: modules/file/nanoscope.c:1602
 msgid "Truncated header line."
 msgstr ""
 
@@ -5095,12 +5273,8 @@ msgstr ""
 msgid "Nano Measuring Machine data import must be run as interactive."
 msgstr ""
 
-#: modules/file/nmmxyz.c:299
-#, fuzzy
-msgid "Reading files..."
-msgstr "마스킹 모드"
-
 #: modules/file/nmmxyz.c:306 modules/process/lat_synth.c:1224
+#: modules/process/wave_synth.c:798
 msgid "Rendering surface..."
 msgstr ""
 
@@ -5135,20 +5309,20 @@ msgid "Plot point density map"
 msgstr ""
 
 #: modules/file/nmmxyz.c:534 modules/file/rawfile.c:626
-#: modules/process/dimensions.h:445 modules/xyz/xyz_drift.c:725
-#: modules/xyz/xyz_raster.c:517
+#: modules/process/dimensions.h:427 modules/xyz/xyz_drift.c:725
+#: modules/xyz/xyz_raster.c:376
 msgid "Resolution"
 msgstr ""
 
 #: modules/file/nmmxyz.c:538 modules/file/rawfile.c:631
-#: modules/process/dimensions.h:451 modules/xyz/xyz_drift.c:729
-#: modules/xyz/xyz_raster.c:521
+#: modules/process/dimensions.h:433 modules/xyz/xyz_drift.c:729
+#: modules/xyz/xyz_raster.c:382
 msgid "_Horizontal size:"
 msgstr ""
 
 #: modules/file/nmmxyz.c:554 modules/file/rawfile.c:638
-#: modules/process/dimensions.h:454 modules/xyz/xyz_drift.c:744
-#: modules/xyz/xyz_raster.c:536
+#: modules/process/dimensions.h:436 modules/xyz/xyz_drift.c:744
+#: modules/xyz/xyz_raster.c:388
 msgid "_Vertical size:"
 msgstr ""
 
@@ -5234,38 +5408,38 @@ msgstr ""
 msgid "Per-axis header field %s contains too few items."
 msgstr ""
 
-#: modules/file/nt-mdt.c:843
+#: modules/file/nt-mdt.c:850
 msgid "Imports NT-MDT data files."
 msgstr ""
 
-#: modules/file/nt-mdt.c:856
+#: modules/file/nt-mdt.c:863
 msgid "NT-MDT files (.mdt)"
 msgstr ""
 
-#: modules/file/nt-mdt.c:1491 modules/file/nt-mdt.c:1599
+#: modules/file/nt-mdt.c:1498 modules/file/nt-mdt.c:1606
 msgid "Frame is too short for Frame Mode."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1506 modules/file/nt-mdt.c:1614
+#: modules/file/nt-mdt.c:1513 modules/file/nt-mdt.c:1621
 msgid "Frame is too short for dots or data."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1869
+#: modules/file/nt-mdt.c:1879
 #, c-format
 msgid "End of file reached in frame header #%u."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1877
+#: modules/file/nt-mdt.c:1887
 #, c-format
 msgid "End of file reached in frame data #%u."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1910
+#: modules/file/nt-mdt.c:1920
 #, c-format
 msgid "Frame #%u is too short for scanned data header."
 msgstr ""
 
-#: modules/file/nt-mdt.c:1927
+#: modules/file/nt-mdt.c:1937
 #, c-format
 msgid "Frame #%u is too short for spectroscopy data header."
 msgstr ""
@@ -5378,28 +5552,28 @@ msgstr ""
 msgid "Omicron MATRIX (.mtrx & .mtrx)"
 msgstr ""
 
-#: modules/file/opdfile.c:188
+#: modules/file/opdfile.c:199
 msgid "Imports Wyko OPD and ASC files."
 msgstr ""
 
-#: modules/file/opdfile.c:201
+#: modules/file/opdfile.c:212
 msgid "Wyko OPD files (.opd)"
 msgstr ""
 
-#: modules/file/opdfile.c:208
+#: modules/file/opdfile.c:219
 msgid "Wyko ASCII export files (.asc)"
 msgstr ""
 
-#: modules/file/opdfile.c:299
+#: modules/file/opdfile.c:310
 #, c-format
 msgid "Item `%s' is beyond the end of the file."
 msgstr ""
 
-#: modules/file/opdfile.c:614
+#: modules/file/opdfile.c:636
 msgid "Nested directories found"
 msgstr ""
 
-#: modules/file/opdfile.c:805
+#: modules/file/opdfile.c:842
 #, c-format
 msgid "Truncated data in block %s"
 msgstr ""
@@ -5692,19 +5866,21 @@ msgstr ""
 
 #: modules/file/rawfile.c:567 modules/process/arithmetic.c:234
 #: modules/process/calcoefs_view.c:320 modules/process/coerce.c:250
-#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:637
+#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:638
 #: modules/process/drift.c:242 modules/process/edge.c:635
-#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:183
-#: modules/process/grain_edge.c:210 modules/process/grain_filter.c:313
-#: modules/process/grain_mark.c:244 modules/process/grain_wshed.c:164
-#: modules/process/mark_disconn.c:205 modules/process/mark_with.c:195
-#: modules/process/polydistort.c:205 modules/process/scars.c:295
-#: modules/process/slope_dist.c:273 modules/process/straighten_path.c:198
-#: modules/process/synth.h:509 modules/process/tip_model.c:166
+#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:184
+#: modules/process/fractal.c:225 modules/process/grain_edge.c:209
+#: modules/process/grain_filter.c:312 modules/process/grain_mark.c:243
+#: modules/process/grain_wshed.c:165 modules/process/mark_disconn.c:205
+#: modules/process/mark_with.c:196 modules/process/mfm_field.c:278
+#: modules/process/mfm_shift.c:167 modules/process/polydistort.c:205
+#: modules/process/scars.c:314 modules/process/slope_dist.c:272
+#: modules/process/stitch.c:272 modules/process/straighten_path.c:198
+#: modules/process/synth.h:538 modules/process/tip_model.c:164
 #: modules/process/wpour_mark.c:273 modules/tools/linestats.c:454
-#: modules/tools/sfunctions.c:534 modules/tools/stats.c:459
-#: modules/volume/volume_extract.c:328 modules/volume/volume_linestat.c:287
-#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:443
+#: modules/tools/sfunctions.c:531 modules/tools/stats.c:456
+#: modules/volume/volume_extract.c:321 modules/volume/volume_linestat.c:292
+#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:457
 msgid "_Update"
 msgstr ""
 
@@ -5846,7 +6022,7 @@ msgid ""
 "The contents of `%s' does not match format: %s."
 msgstr ""
 
-#: modules/file/rawfile.c:1690 modules/process/neural.c:1580
+#: modules/file/rawfile.c:1690 modules/process/neural.c:1587
 #, c-format
 msgid "The name `%s' is invalid."
 msgstr ""
@@ -5939,7 +6115,8 @@ msgstr ""
 msgid "Import XYZ Data"
 msgstr ""
 
-#: modules/file/rawxyz.c:279
+#: modules/file/rawxyz.c:279 modules/graph/graph_stats.c:305
+#: modules/graph/graph_stats.c:756 modules/graph/graph_stats.c:800
 #, fuzzy
 msgid "Number of points:"
 msgstr "클러스터 개수"
@@ -5963,7 +6140,7 @@ msgstr "범위"
 msgid "_Lateral units:"
 msgstr ""
 
-#: modules/file/rawxyz.c:386 modules/process/dimensions.h:494
+#: modules/file/rawxyz.c:386 modules/process/dimensions.h:479
 msgid "_Value units:"
 msgstr ""
 
@@ -5979,18 +6156,14 @@ msgstr ""
 msgid "MapArea block is truncated"
 msgstr ""
 
-#: modules/file/renishaw.c:787
+#: modules/file/renishaw.c:793
 msgid "Random points order unsupported"
 msgstr ""
 
-#: modules/file/renishaw.c:1396
+#: modules/file/renishaw.c:1405
 msgid "Block header is truncated"
 msgstr ""
 
-#: modules/file/renishaw.c:1411
-msgid "Data block is truncated"
-msgstr ""
-
 #: modules/file/rhk-sm3.c:236
 msgid "Imports RHK Technology SM3 data files."
 msgstr ""
@@ -6252,19 +6425,23 @@ msgstr ""
 msgid "SPML files (.xml)"
 msgstr ""
 
-#: modules/file/spmlab.c:131
+#: modules/file/spmlab.c:175
 msgid "Imports Thermicroscopes SpmLab R3 to R7 data files."
 msgstr ""
 
-#: modules/file/spmlab.c:144
+#: modules/file/spmlab.c:188
 msgid "Thermicroscopes SpmLab files"
 msgstr ""
 
-#: modules/file/spmlab.c:231
+#: modules/file/spmlab.c:259
 #, c-format
 msgid "Unknown format version %c."
 msgstr ""
 
+#: modules/file/spmlab.c:283
+msgid "Data block is truncated."
+msgstr ""
+
 #: modules/file/spmlabf.c:79
 msgid "Imports SPMLab floating-point files."
 msgstr ""
@@ -6459,11 +6636,11 @@ msgstr ""
 msgid "WinSTM files (.stm)"
 msgstr ""
 
-#: modules/file/wipfile.c:272
+#: modules/file/wipfile.c:281
 msgid "Imports WItec Project data files."
 msgstr ""
 
-#: modules/file/wipfile.c:285
+#: modules/file/wipfile.c:294
 msgid "WItec Project files (.wip)"
 msgstr ""
 
@@ -6525,23 +6702,23 @@ msgstr "텍스트 파일로 그래프 데이터 내보내기"
 msgid "XYZ text data (.xyz)"
 msgstr ""
 
-#: modules/file/xyzexport.c:244
+#: modules/file/xyzexport.c:247
 #, fuzzy
 msgid "Lateral units:"
 msgstr "값 단위:"
 
-#: modules/file/xyzexport.c:290
+#: modules/file/xyzexport.c:293
 #, fuzzy
 msgid "Export XYZ"
 msgstr "내보내기(E)"
 
-#: modules/file/xyzexport.c:340 modules/process/curvature.c:704
+#: modules/file/xyzexport.c:343 modules/process/curvature.c:700
 #: modules/process/entropy.c:214 modules/process/facet-level.c:207
-#: modules/process/fit-shape.c:743 modules/process/level.c:259
-#: modules/process/linematch.c:906 modules/process/neural.c:593
-#: modules/process/polylevel.c:491 modules/process/slope_dist.c:418
-#: modules/tools/filter.c:300 modules/tools/linestats.c:436
-#: modules/tools/profile.c:591 modules/tools/sfunctions.c:516
+#: modules/process/fit-shape.c:755 modules/process/level.c:259
+#: modules/process/linematch.c:869 modules/process/neural.c:597
+#: modules/process/polylevel.c:494 modules/process/slope_dist.c:411
+#: modules/tools/filter.c:301 modules/tools/linestats.c:436
+#: modules/tools/profile.c:572 modules/tools/sfunctions.c:513
 #: modules/tools/stats.c:389
 msgid "Masking Mode"
 msgstr "마스킹 모드"
@@ -6554,6 +6731,14 @@ msgstr ""
 msgid "Carl Zeiss SEM scans (.tif)"
 msgstr ""
 
+#: modules/file/zeisslsm.c:383
+msgid "Imports Carl Zeiss CLSM images."
+msgstr ""
+
+#: modules/file/zeisslsm.c:396
+msgid "Carl Zeiss CLSM images (.lsm)"
+msgstr ""
+
 #: modules/file/zemax.c:72
 msgid "Imports Zemax grid sag data files."
 msgstr ""
@@ -6576,16 +6761,16 @@ msgstr ""
 msgid "The first line contains too many items."
 msgstr ""
 
-#: modules/graph/graph_align.c:57
+#: modules/graph/graph_align.c:60
 #, fuzzy
 msgid "Aligns graph curves."
 msgstr "그래프 곡선의 높이 레벨 맞추기"
 
-#: modules/graph/graph_align.c:71
+#: modules/graph/graph_align.c:74
 msgid "/_Align"
 msgstr ""
 
-#: modules/graph/graph_align.c:74
+#: modules/graph/graph_align.c:77
 #, fuzzy
 msgid "Align curves"
 msgstr "그래프 곡선의 높이 레벨 맞추기"
@@ -6602,48 +6787,50 @@ msgstr "/Critical 규격(C)..."
 msgid "Fit critical dimension"
 msgstr ""
 
-#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:267
+#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:270
 msgid "Fit Graph"
 msgstr ""
 
-#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:251
-#: modules/graph/graph_fit.c:270 modules/process/fit-shape.c:393
+#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:254
+#: modules/graph/graph_fit.c:273 modules/process/fit-shape.c:394
 #: modules/volume/volume_fdfit.c:299
 msgid "verb|_Fit"
 msgstr ""
 
-#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:166
-#: modules/graph/graph_fdfit.c:306 modules/graph/graph_fit.c:325
-#: modules/graph/graph_peaks.c:199
+#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:168
+#: modules/graph/graph_fdfit.c:313 modules/graph/graph_fit.c:332
+#: modules/graph/graph_peaks.c:199 modules/graph/graph_stats.c:268
 msgid "_Graph curve:"
 msgstr ""
 
-#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:320
-#: modules/graph/graph_fit.c:339 modules/volume/volume_fdfit.c:405
+#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:327
+#: modules/graph/graph_fit.c:346 modules/volume/volume_fdfit.c:389
 msgid "F_unction:"
 msgstr ""
 
-#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:361
-#: modules/graph/graph_fit.c:375 modules/process/curvature.c:745
-#: modules/process/fit-shape.c:792 modules/volume/volume_fdfit.c:446
+#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:368
+#: modules/graph/graph_fit.c:382 modules/process/curvature.c:742
+#: modules/process/fit-shape.c:804 modules/volume/volume_fdfit.c:422
 msgid "Parameter"
 msgstr ""
 
-#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:363
-#: modules/graph/graph_fit.c:377 modules/process/fit-shape.c:794
-#: modules/volume/volume_fdfit.c:448
+#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:370
+#: modules/graph/graph_fit.c:384 modules/process/fit-shape.c:806
+#: modules/volume/volume_fdfit.c:424
 msgid "Error"
 msgstr ""
 
-#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:196
-#: modules/graph/graph_fdfit.c:415 modules/graph/graph_fit.c:433
-#: modules/volume/volume_fdfit.c:500 modules/volume/volume_linestat.c:389
+#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:189
+#: modules/graph/graph_fdfit.c:422 modules/graph/graph_fit.c:440
+#: modules/graph/graph_stats.c:279 modules/graph/graph_stats.c:793
+#: modules/volume/volume_fdfit.c:476 modules/volume/volume_linestat.c:394
 msgid "Range:"
 msgstr ""
 
-#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:207
-#: modules/graph/graph_fdfit.c:426 modules/graph/graph_fit.c:444
-#: modules/volume/volume_fdfit.c:511 modules/volume/volume_linestat.c:400
+#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:200
+#: modules/graph/graph_fdfit.c:433 modules/graph/graph_fit.c:451
+#: modules/graph/graph_stats.c:290 modules/graph/graph_stats.c:796
+#: modules/volume/volume_fdfit.c:487 modules/volume/volume_linestat.c:405
 msgid "range|to"
 msgstr ""
 
@@ -6651,93 +6838,93 @@ msgstr ""
 msgid "_Draw whole circle"
 msgstr ""
 
-#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:491
-#: modules/graph/graph_fit.c:531 modules/process/fit-shape.c:522
-#: modules/volume/volume_fdfit.c:573
+#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:498
+#: modules/graph/graph_fit.c:538 modules/process/fit-shape.c:523
+#: modules/volume/volume_fdfit.c:549
 msgid "Save Fit Report"
 msgstr ""
 
 #: modules/graph/graph_cd.c:529 modules/graph/graph_cd.c:1107
-#: modules/graph/graph_fdfit.c:709 modules/graph/graph_fit.c:763
-#: modules/volume/volume_fdfit.c:907
+#: modules/graph/graph_fdfit.c:725 modules/graph/graph_fit.c:779
+#: modules/volume/volume_fdfit.c:883
 msgid "Fit"
 msgstr ""
 
-#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:749
-#: modules/graph/graph_fit.c:803 modules/volume/volume_fdfit.c:978
-#: modules/volume/volume_fdfit.c:1085
+#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:765
+#: modules/graph/graph_fit.c:819 modules/volume/volume_fdfit.c:954
+#: modules/volume/volume_fdfit.c:1061
 msgid "It is necessary to select more data points than free fit parameters"
 msgstr ""
 
-#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:798
-#: modules/graph/graph_fit.c:852 modules/process/entropy.c:554
-#: modules/tools/grainmeasure.c:217 modules/tools/readvalue.c:634
-#: modules/tools/readvalue.c:635 modules/tools/readvalue.c:636
-#: modules/tools/readvalue.c:637 modules/tools/roughness.c:975
-#: modules/tools/stats.c:727 modules/tools/stats.c:740
-#: modules/tools/stats.c:741 modules/volume/volume_fdfit.c:1134
-#: modules/xyz/xyz_drift.c:1099 modules/xyz/xyz_drift.c:1117
-#: modules/xyz/xyz_drift.c:1134
+#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:814
+#: modules/graph/graph_fit.c:868 modules/graph/graph_stats.c:663
+#: modules/process/entropy.c:555 modules/tools/grainmeasure.c:217
+#: modules/tools/readvalue.c:634 modules/tools/readvalue.c:635
+#: modules/tools/readvalue.c:636 modules/tools/readvalue.c:637
+#: modules/tools/roughness.c:984 modules/tools/stats.c:723
+#: modules/tools/stats.c:736 modules/tools/stats.c:737
+#: modules/volume/volume_fdfit.c:1110 modules/xyz/xyz_drift.c:1099
+#: modules/xyz/xyz_drift.c:1117 modules/xyz/xyz_drift.c:1134
 msgid "N.A."
 msgstr ""
 
-#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1363
-#: modules/graph/graph_fit.c:1500 modules/process/fit-shape.c:2078
-#: modules/volume/volume_fdfit.c:1720
+#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1381
+#: modules/graph/graph_fit.c:1518 modules/process/fit-shape.c:2060
+#: modules/volume/volume_fdfit.c:1696
 msgid "===== Fit Results ====="
 msgstr ""
 
-#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1367
-#: modules/graph/graph_fit.c:1504 modules/process/fit-shape.c:2080
-#: modules/volume/volume_fdfit.c:1724
+#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1385
+#: modules/graph/graph_fit.c:1522 modules/process/fit-shape.c:2062
+#: modules/volume/volume_fdfit.c:1700
 #, c-format
 msgid "Data:             %s\n"
 msgstr ""
 
-#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1370
-#: modules/graph/graph_fit.c:1507 modules/process/fit-shape.c:2082
-#: modules/volume/volume_fdfit.c:1727
+#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1388
+#: modules/graph/graph_fit.c:1525 modules/process/fit-shape.c:2064
+#: modules/volume/volume_fdfit.c:1703
 #, c-format
 msgid "Number of points: %d of %d\n"
 msgstr ""
 
-#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1374
-#: modules/graph/graph_fit.c:1511 modules/volume/volume_fdfit.c:1731
+#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1392
+#: modules/graph/graph_fit.c:1529 modules/volume/volume_fdfit.c:1707
 #, c-format
 msgid "X range:          %.*f to %.*f %s\n"
 msgstr ""
 
-#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1380
-#: modules/graph/graph_fit.c:1517 modules/process/fit-shape.c:2084
-#: modules/volume/volume_fdfit.c:1737
+#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1398
+#: modules/graph/graph_fit.c:1535 modules/process/fit-shape.c:2066
+#: modules/volume/volume_fdfit.c:1713
 #, c-format
 msgid "Fitted function:  %s\n"
 msgstr ""
 
-#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1383
-#: modules/graph/graph_fit.c:1520 modules/process/fit-shape.c:2087
-#: modules/volume/volume_fdfit.c:1740
+#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1401
+#: modules/graph/graph_fit.c:1538 modules/process/fit-shape.c:2069
+#: modules/volume/volume_fdfit.c:1716
 msgid "Results\n"
 msgstr ""
 
-#: modules/graph/graph_cut.c:88
+#: modules/graph/graph_cut.c:87
 msgid "Cut graph"
 msgstr "그래프 자르기"
 
-#: modules/graph/graph_cut.c:102
+#: modules/graph/graph_cut.c:101
 #, fuzzy
 msgid "/_Cut..."
 msgstr "/그래프 자르기(C)..."
 
-#: modules/graph/graph_cut.c:105
+#: modules/graph/graph_cut.c:104
 msgid "Extract part of graph into new one"
 msgstr ""
 
-#: modules/graph/graph_cut.c:146
+#: modules/graph/graph_cut.c:145
 msgid "Cut Graph"
 msgstr "그래프 자르기"
 
-#: modules/graph/graph_cut.c:180
+#: modules/graph/graph_cut.c:173
 msgid "Cut _all curves"
 msgstr ""
 
@@ -6836,101 +7023,101 @@ msgstr "래스터 이미지로 그래프 데이터 내보내기"
 msgid "Export to PNG"
 msgstr "PNG 파일로 내보내기"
 
-#: modules/graph/graph_export_vector.c:35
+#: modules/graph/graph_export_vector.c:36
 #, fuzzy
 msgid "Exports graphs to PostScript"
 msgstr "포스트스크립트(*.ps) 파일로 그래프 데이터 내보내기"
 
-#: modules/graph/graph_export_vector.c:49
+#: modules/graph/graph_export_vector.c:50
 msgid "/Export _PostScript"
 msgstr "/포스트스크립트(*.ps) 파일로 내보내기(P)"
 
-#: modules/graph/graph_export_vector.c:52
+#: modules/graph/graph_export_vector.c:53
 #, fuzzy
 msgid "Export graph to PostScript"
 msgstr "포스트스크립트(*.ps) 파일로 그래프 데이터 내보내기"
 
-#: modules/graph/graph_export_vector.c:65
+#: modules/graph/graph_export_vector.c:66
 #, fuzzy
 msgid "Export to PostScript"
 msgstr "포스트스크립트(*.ps) 파일로 내보내기"
 
-#: modules/graph/graph_fdfit.c:168
+#: modules/graph/graph_fdfit.c:169
 msgid "Fit force-distance data"
 msgstr "힘-거리 데이터 맞춤"
 
-#: modules/graph/graph_fdfit.c:182
+#: modules/graph/graph_fdfit.c:183
 msgid "/_Fit FD Curve..."
 msgstr "/FD 곡선 맞춤(F)"
 
-#: modules/graph/graph_fdfit.c:185
+#: modules/graph/graph_fdfit.c:186
 msgid "Fit a force-distance curve"
 msgstr "힘-거리 곡선 맞추기"
 
-#: modules/graph/graph_fdfit.c:248 modules/volume/volume_fdfit.c:296
+#: modules/graph/graph_fdfit.c:251 modules/volume/volume_fdfit.c:296
 msgid "Fit FD Curve"
 msgstr "FD 곡선 맞춤"
 
-#: modules/graph/graph_fdfit.c:255 modules/graph/graph_fit.c:274
-#: modules/process/fit-shape.c:397 modules/process/measure_lattice.c:257
-#: modules/volume/volume_fdfit.c:303
+#: modules/graph/graph_fdfit.c:258 modules/graph/graph_fit.c:277
+#: modules/process/correct_affine.c:347 modules/process/fit-shape.c:398
+#: modules/process/measure_lattice.c:247 modules/volume/volume_fdfit.c:303
 msgid "verb|_Estimate"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:257 modules/graph/graph_fit.c:276
-#: modules/volume/volume_fdfit.c:305
+#: modules/graph/graph_fdfit.c:260 modules/graph/graph_fit.c:279
+#: modules/process/psf.c:239 modules/volume/volume_fdfit.c:305
 msgid "_Plot Inits"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:359 modules/graph/graph_fit.c:373
-#: modules/process/fit-shape.c:790 modules/volume/volume_fdfit.c:444
+#: modules/graph/graph_fdfit.c:366 modules/graph/graph_fit.c:380
+#: modules/process/fit-shape.c:802 modules/volume/volume_fdfit.c:420
 msgid "Fix"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:365 modules/graph/graph_fit.c:379
-#: modules/volume/volume_fdfit.c:450
+#: modules/graph/graph_fdfit.c:372 modules/graph/graph_fit.c:386
+#: modules/volume/volume_fdfit.c:426
 msgid "Initial"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:376 modules/graph/graph_fit.c:394
-#: modules/volume/volume_fdfit.c:461
+#: modules/graph/graph_fdfit.c:383 modules/graph/graph_fit.c:401
+#: modules/volume/volume_fdfit.c:437
 msgid "χ<sup>2</sup> result:"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:392 modules/graph/graph_fit.c:410
-#: modules/process/fit-shape.c:469 modules/process/fit-shape.c:2134
-#: modules/volume/volume_fdfit.c:477
+#: modules/graph/graph_fdfit.c:399 modules/graph/graph_fit.c:417
+#: modules/process/fit-shape.c:470 modules/process/fit-shape.c:2116
+#: modules/volume/volume_fdfit.c:453
 msgid "Correlation Matrix"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:447 modules/graph/graph_fit.c:485
-#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:532
+#: modules/graph/graph_fdfit.c:454 modules/graph/graph_fit.c:492
+#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:508
 msgid "Instant:"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:450 modules/graph/graph_fit.c:488
+#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
 #, fuzzy
 msgid "esti_mate"
 msgstr "팁 추정 효과 가리기"
 
-#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
-#: modules/volume/volume_fdfit.c:542
+#: modules/graph/graph_fdfit.c:464 modules/graph/graph_fit.c:502
+#: modules/volume/volume_fdfit.c:518
 msgid "p_lot"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:708 modules/graph/graph_fit.c:762
-#: modules/volume/volume_fdfit.c:906
+#: modules/graph/graph_fdfit.c:724 modules/graph/graph_fit.c:778
+#: modules/volume/volume_fdfit.c:882
 msgid "Estimate"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:1410 modules/graph/graph_fit.c:1547
-#: modules/volume/volume_fdfit.c:1768
+#: modules/graph/graph_fdfit.c:1428 modules/graph/graph_fit.c:1565
+#: modules/volume/volume_fdfit.c:1744
 #, c-format
 msgid "Residual sum:   %g\n"
 msgstr ""
 
-#: modules/graph/graph_fdfit.c:1413 modules/graph/graph_fit.c:1550
-#: modules/volume/volume_fdfit.c:1771
+#: modules/graph/graph_fdfit.c:1431 modules/graph/graph_fit.c:1568
+#: modules/volume/volume_fdfit.c:1747
 msgid "Correlation matrix\n"
 msgstr ""
 
@@ -6946,27 +7133,27 @@ msgstr "/필터(F)"
 msgid "Remove noise from graph curves"
 msgstr "그래프 곡선 내 노이즈 제거 "
 
-#: modules/graph/graph_fit.c:181
+#: modules/graph/graph_fit.c:182
 msgid "Fit graph with function"
 msgstr ""
 
-#: modules/graph/graph_fit.c:195
+#: modules/graph/graph_fit.c:196
 msgid "/_Fit Function..."
 msgstr "/함수에 맞추기(F)"
 
-#: modules/graph/graph_fit.c:198
+#: modules/graph/graph_fit.c:199
 msgid "Fit a function on graph data"
 msgstr ""
 
-#: modules/graph/graph_fit.c:386
+#: modules/graph/graph_fit.c:393
 msgid "Copy all fitted values to estimates"
 msgstr ""
 
-#: modules/graph/graph_fit.c:460
+#: modules/graph/graph_fit.c:467
 msgid "Plot full range"
 msgstr ""
 
-#: modules/graph/graph_fit.c:470
+#: modules/graph/graph_fit.c:477
 msgid "Create a difference graph"
 msgstr ""
 
@@ -7054,56 +7241,149 @@ msgstr ""
 msgid "Find graph curve peaks"
 msgstr "그래프 곡선의 높이 레벨 맞추기"
 
-#: modules/graph/graph_peaks.c:157
+#: modules/graph/graph_peaks.c:155
 msgid "Prominence"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:161
+#: modules/graph/graph_peaks.c:159
 #, fuzzy
 msgid "Zero"
 msgstr "0값으로 설정"
 
-#: modules/graph/graph_peaks.c:162
+#: modules/graph/graph_peaks.c:160
 msgid "Bilateral minimum"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:178
+#: modules/graph/graph_peaks.c:176
 #, fuzzy
 msgid "Graph Peaks"
 msgstr "그래프"
 
-#: modules/graph/graph_peaks.c:212
+#: modules/graph/graph_peaks.c:209
 msgid "_Background type:"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:227
+#: modules/graph/graph_peaks.c:219
 msgid "Order peaks _by:"
 msgstr ""
 
-#: modules/graph/graph_peaks.c:242
+#: modules/graph/graph_peaks.c:225
 #, fuzzy
 msgid "Number of _peaks:"
 msgstr "클러스터 개수"
 
-#: modules/graph/graph_peaks.c:263 modules/process/curvature.c:773
-#: modules/process/grain_stat.c:360 modules/process/measure_lattice.c:396
-#: modules/process/polylevel.c:607 modules/tools/distance.c:259
-#: modules/tools/roughness.c:818 modules/tools/stats.c:450
+#: modules/graph/graph_peaks.c:245 modules/graph/graph_stats.c:367
+#: modules/process/curvature.c:770 modules/process/grain_stat.c:360
+#: modules/process/measure_lattice.c:390 modules/process/polylevel.c:610
+#: modules/tools/distance.c:259 modules/tools/roughness.c:819
+#: modules/tools/stats.c:447
 msgid "Save table to a file"
 msgstr "표를 파일로 저장"
 
-#: modules/graph/graph_peaks.c:267 modules/process/curvature.c:778
-#: modules/process/grain_stat.c:365 modules/process/measure_lattice.c:400
-#: modules/process/polylevel.c:617 modules/tools/distance.c:264
-#: modules/tools/roughness.c:823 modules/tools/stats.c:455
+#: modules/graph/graph_peaks.c:249 modules/graph/graph_stats.c:371
+#: modules/process/curvature.c:775 modules/process/grain_stat.c:365
+#: modules/process/measure_lattice.c:394 modules/process/polylevel.c:620
+#: modules/tools/distance.c:264 modules/tools/roughness.c:824
+#: modules/tools/stats.c:452
 msgid "Copy table to clipboard"
 msgstr "표를 클립보드로 복사"
 
-#: modules/graph/graph_peaks.c:654
+#: modules/graph/graph_peaks.c:618
 #, fuzzy
 msgid "Save Peak Parameters"
 msgstr "변수"
 
+#: modules/graph/graph_stats.c:148 modules/graph/graph_stats.c:161
+#: modules/tools/stats.c:205
+msgid "Average value:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:149 modules/tools/stats.c:206
+msgid "Median:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:150
+#, fuzzy
+msgid "Ra:"
+msgstr "Ra"
+
+#: modules/graph/graph_stats.c:151
+msgid "Rms (Rq):"
+msgstr ""
+
+#: modules/graph/graph_stats.c:152 modules/tools/stats.c:210
+msgid "Skew:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:153 modules/tools/stats.c:211
+msgid "Kurtosis:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:158
+#, fuzzy
+msgid "Projected length:"
+msgstr "투영된 경계의 길이 "
+
+#: modules/graph/graph_stats.c:159
+msgid "Developed length:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:160 modules/tools/stats.c:214
+msgid "Variation:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:162
+msgid "Area under curve:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:163
+#, fuzzy
+msgid "Positive area:"
+msgstr "양성의"
+
+#: modules/graph/graph_stats.c:164
+#, fuzzy
+msgid "Negative area:"
+msgstr "음성의"
+
+#: modules/graph/graph_stats.c:165
+msgid "Root mean square:"
+msgstr ""
+
+#: modules/graph/graph_stats.c:171
+#, fuzzy
+msgid "Calculates simple graph curve statistics."
+msgstr "전체 곡률 계산하기."
+
+#: modules/graph/graph_stats.c:185
+#, fuzzy
+msgid "/_Statistics..."
+msgstr "/통계(S)/각도 분포(G)..."
+
+#: modules/graph/graph_stats.c:188
+#, fuzzy
+msgid "Calculate graph curve statistics"
+msgstr "전체 곡률 계산하기"
+
+#: modules/graph/graph_stats.c:241
+msgid "Graph Statistics"
+msgstr ""
+
+#: modules/graph/graph_stats.c:320 modules/graph/graph_stats.c:807
+#, fuzzy
+msgid "Simple Parameters"
+msgstr "변수"
+
+#: modules/graph/graph_stats.c:342 modules/graph/graph_stats.c:826
+#, fuzzy
+msgid "Integrals"
+msgstr "교차점"
+
+#: modules/graph/graph_stats.c:686
+#, fuzzy
+msgid "Save Curve Statistics"
+msgstr "곡률 저장"
+
 #: modules/layer/axis.c:143
 msgid "Layer allowing selection of horizontal or vertical lines."
 msgstr ""
@@ -7237,25 +7517,25 @@ msgstr ""
 msgid "Angle Distribution"
 msgstr ""
 
-#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:373
+#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:365
 msgid "Output _size:"
 msgstr ""
 
-#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:206
+#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:207
 msgid "_Number of steps:"
 msgstr ""
 
-#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:380
+#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:372
 msgid "_Logarithmic value scale"
 msgstr ""
 
 #: modules/process/angle_dist.c:204 modules/process/entropy.c:231
-#: modules/process/slope_dist.c:390
+#: modules/process/slope_dist.c:382
 msgid "Use local plane _fitting"
 msgstr ""
 
 #: modules/process/angle_dist.c:213 modules/process/entropy.c:242
-#: modules/process/slope_dist.c:401
+#: modules/process/slope_dist.c:393
 msgid "_Plane size:"
 msgstr ""
 
@@ -7271,7 +7551,8 @@ msgstr "/멀티데이터(M)/산술 연산(A)..."
 msgid "Arithmetic operations on data"
 msgstr ""
 
-#: modules/process/arithmetic.c:202 modules/process/superresolution.c:349
+#: modules/process/arithmetic.c:202 modules/process/stitch.c:234
+#: modules/process/superresolution.c:348
 msgid "Calculated"
 msgstr ""
 
@@ -7287,7 +7568,7 @@ msgstr ""
 msgid "Operands"
 msgstr ""
 
-#: modules/process/arithmetic.c:300 modules/process/dimensions.h:483
+#: modules/process/arithmetic.c:300 modules/process/dimensions.h:465
 msgid "Units"
 msgstr ""
 
@@ -7308,15 +7589,15 @@ msgstr ""
 msgid "Expression contains unknown identifiers"
 msgstr ""
 
-#: modules/process/arithmetic.c:569 modules/process/superresolution.c:300
+#: modules/process/arithmetic.c:569 modules/process/superresolution.c:299
 msgid "Pixel dimensions differ"
 msgstr ""
 
-#: modules/process/arithmetic.c:571 modules/process/superresolution.c:302
+#: modules/process/arithmetic.c:571 modules/process/superresolution.c:301
 msgid "Lateral dimensions are different physical quantities"
 msgstr ""
 
-#: modules/process/arithmetic.c:574 modules/process/superresolution.c:305
+#: modules/process/arithmetic.c:574 modules/process/superresolution.c:304
 msgid "Physical dimensions differ"
 msgstr ""
 
@@ -7420,7 +7701,7 @@ msgid "Generates surfaces by ballistic deposition."
 msgstr ""
 
 #: modules/process/bdep_synth.c:164
-msgid "/S_ynthetic/_Ballistic..."
+msgid "/S_ynthetic/_Deposition/_Ballistic..."
 msgstr ""
 
 #: modules/process/bdep_synth.c:168
@@ -7429,20 +7710,23 @@ msgstr ""
 
 #: modules/process/bdep_synth.c:239 modules/process/bdep_synth.c:596
 #: modules/process/calcoefs_simple.c:636 modules/process/col_synth.c:282
-#: modules/process/col_synth.c:733 modules/process/crosscor.c:819
-#: modules/process/crosscor.c:882 modules/process/deposit_synth.c:268
-#: modules/process/deposit_synth.c:859 modules/process/diff_synth.c:304
-#: modules/process/diff_synth.c:705 modules/process/domain_synth.c:255
-#: modules/process/domain_synth.c:745 modules/process/grain_wshed.c:429
+#: modules/process/col_synth.c:734 modules/process/crosscor.c:792
+#: modules/process/crosscor.c:855 modules/process/deposit_synth.c:268
+#: modules/process/deposit_synth.c:858 modules/process/diff_synth.c:304
+#: modules/process/diff_synth.c:704 modules/process/domain_synth.c:255
+#: modules/process/domain_synth.c:745 modules/process/fibre_synth.c:357
+#: modules/process/fibre_synth.c:872 modules/process/grain_wshed.c:433
 #: modules/process/lat_synth.c:491 modules/process/mark_disconn.c:148
-#: modules/process/mark_disconn.c:373 modules/process/maskcor.c:330
-#: modules/process/mcrop.c:315 modules/process/merge.c:1072
-#: modules/process/nanoindent_adjust.c:323 modules/process/neural.c:1272
-#: modules/process/pid.c:338 modules/process/superresolution.c:416
-#: modules/process/superresolution.c:505 modules/process/tip_blind.c:781
-#: modules/process/tipops.c:320 modules/process/xydenoise.c:213
-#: modules/volume/volume_kmeans.c:403 modules/volume/volume_kmedians.c:365
-#: modules/xyz/xyz_raster.c:1028 modules/xyz/xyz_raster.c:1044
+#: modules/process/mark_disconn.c:361 modules/process/maskcor.c:334
+#: modules/process/mcrop.c:314 modules/process/merge.c:1072
+#: modules/process/nanoindent_adjust.c:324 modules/process/neural.c:1279
+#: modules/process/pid.c:339 modules/process/sphere-revolve.c:269
+#: modules/process/superresolution.c:415 modules/process/superresolution.c:504
+#: modules/process/tip_blind.c:778 modules/process/tipops.c:320
+#: modules/process/wave_synth.c:305 modules/process/wave_synth.c:747
+#: modules/process/xydenoise.c:214 modules/volume/volume_kmeans.c:397
+#: modules/volume/volume_kmedians.c:363 modules/xyz/xyz_raster.c:997
+#: modules/xyz/xyz_raster.c:1013
 msgid "Initializing..."
 msgstr ""
 
@@ -7451,10 +7735,11 @@ msgstr ""
 #: modules/process/deposit_synth.c:531 modules/process/deposit_synth.c:544
 #: modules/process/diff_synth.c:342 modules/process/domain_synth.c:319
 #: modules/process/domain_synth.c:327 modules/process/fbm_synth.c:278
-#: modules/process/fft_synth.c:314 modules/process/lat_synth.c:529
-#: modules/process/lno_synth.c:407 modules/process/noise_synth.c:311
-#: modules/process/obj_synth.c:407 modules/process/pat_synth.c:357
-#: modules/process/wave_synth.c:323
+#: modules/process/fft_synth.c:314 modules/process/fibre_synth.c:394
+#: modules/process/lat_synth.c:529 modules/process/lno_synth.c:405
+#: modules/process/noise_synth.c:309 modules/process/obj_synth.c:404
+#: modules/process/pat_synth.c:357 modules/process/phase_synth.c:518
+#: modules/process/wave_synth.c:342
 msgid "Generated"
 msgstr ""
 
@@ -7475,50 +7760,56 @@ msgid "Progressive preview"
 msgstr ""
 
 #: modules/process/bdep_synth.c:407 modules/process/col_synth.c:458
-#: modules/process/deposit_synth.c:412 modules/process/diff_synth.c:477
+#: modules/process/deposit_synth.c:413 modules/process/diff_synth.c:477
 #: modules/process/domain_synth.c:430 modules/process/fbm_synth.c:360
-#: modules/process/fft_synth.c:398 modules/process/lat_synth.c:626
-#: modules/process/lno_synth.c:490 modules/process/noise_synth.c:394
-#: modules/process/obj_synth.c:498 modules/process/pat_synth.c:442
-#: modules/process/wave_synth.c:407
+#: modules/process/fft_synth.c:398 modules/process/fibre_synth.c:479
+#: modules/process/lat_synth.c:626 modules/process/lno_synth.c:488
+#: modules/process/mfm_current.c:383 modules/process/mfm_parallel.c:384
+#: modules/process/noise_synth.c:392 modules/process/obj_synth.c:495
+#: modules/process/pat_synth.c:442 modules/process/phase_synth.c:263
+#: modules/process/wave_synth.c:426
 msgid "Dimensions"
 msgstr ""
 
 #: modules/process/bdep_synth.c:416 modules/process/col_synth.c:467
-#: modules/process/deposit_synth.c:422 modules/process/diff_synth.c:486
+#: modules/process/deposit_synth.c:425 modules/process/diff_synth.c:486
 #: modules/process/domain_synth.c:438 modules/process/fbm_synth.c:371
-#: modules/process/fft_synth.c:409 modules/process/lno_synth.c:501
-#: modules/process/noise_synth.c:405 modules/process/obj_synth.c:509
-#: modules/process/pat_synth.c:454 modules/process/wave_synth.c:418
+#: modules/process/fft_synth.c:409 modules/process/fibre_synth.c:490
+#: modules/process/lno_synth.c:499 modules/process/mfm_current.c:412
+#: modules/process/mfm_parallel.c:411 modules/process/noise_synth.c:403
+#: modules/process/obj_synth.c:506 modules/process/pat_synth.c:454
+#: modules/process/phase_synth.c:274 modules/process/wave_synth.c:437
 msgid "Generator"
 msgstr ""
 
 #: modules/process/bdep_synth.c:422 modules/process/col_synth.c:473
-#: modules/process/diff_synth.c:492 modules/process/lno_synth.c:1041
-#: modules/process/obj_synth.c:520
+#: modules/process/deposit_synth.c:455 modules/process/diff_synth.c:492
+#: modules/process/fibre_synth.c:502 modules/process/lno_synth.c:1041
+#: modules/process/obj_synth.c:518
 msgid "Co_verage:"
 msgstr ""
 
 #: modules/process/bdep_synth.c:434 modules/process/diff_synth.c:512
-#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:412
-#: modules/process/fft_synth.c:418 modules/process/lat_synth.c:758
-#: modules/process/lno_synth.c:537 modules/process/noise_synth.c:437
-#: modules/process/obj_synth.c:579 modules/process/wave_synth.c:453
-msgid "_Like Current Channel"
+#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:411
+#: modules/process/fft_synth.c:418 modules/process/fibre_synth.c:544
+#: modules/process/lat_synth.c:758 modules/process/lno_synth.c:535
+#: modules/process/noise_synth.c:435 modules/process/obj_synth.c:577
+#: modules/process/phase_synth.c:302 modules/process/wave_synth.c:472
+msgid "_Like Current Image"
 msgstr ""
 
-#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:541
-#: modules/process/diff_synth.c:562
+#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:542
+#: modules/process/diff_synth.c:561
 msgid "Evolution"
 msgstr ""
 
-#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:544
-#: modules/process/diff_synth.c:565
+#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:545
+#: modules/process/diff_synth.c:564
 msgid "Plot graphs:"
 msgstr "그래프 그리기:"
 
-#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:840
-#: modules/process/diff_synth.c:782
+#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:841
+#: modules/process/diff_synth.c:781
 msgid "Depositing particles..."
 msgstr ""
 
@@ -7553,8 +7844,8 @@ msgstr ""
 msgid "Calibration name:"
 msgstr ""
 
-#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:433
-#: modules/volume/volume_extract.c:514
+#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:421
+#: modules/volume/volume_extract.c:501
 msgid "No data loaded"
 msgstr ""
 
@@ -7578,7 +7869,7 @@ msgstr ""
 msgid "Load calibration data"
 msgstr ""
 
-#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1073
+#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1059
 #, c-format
 msgid "Error loading file '%s'"
 msgstr ""
@@ -7672,7 +7963,7 @@ msgstr ""
 msgid "Simple Error Map"
 msgstr ""
 
-#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:146
+#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:142
 #: modules/process/superresolution.c:156
 msgid "Operands:"
 msgstr ""
@@ -7686,14 +7977,14 @@ msgid "Detail"
 msgstr ""
 
 #: modules/process/calcoefs_simple.c:371 modules/process/calcoefs_view.c:491
-#: modules/process/calibrate.c:496 modules/process/crosscor.c:289
-#: modules/volume/volume_calibrate.c:478
+#: modules/process/calibrate.c:481 modules/process/crosscor.c:276
+#: modules/volume/volume_calibrate.c:460
 msgid "_X offset:"
 msgstr ""
 
 #: modules/process/calcoefs_simple.c:398 modules/process/calcoefs_view.c:517
-#: modules/process/calibrate.c:509 modules/process/crosscor.c:300
-#: modules/volume/volume_calibrate.c:491
+#: modules/process/calibrate.c:488 modules/process/crosscor.c:284
+#: modules/volume/volume_calibrate.c:467
 msgid "_Y offset:"
 msgstr ""
 
@@ -7706,7 +7997,7 @@ msgid "Y p_eriod:"
 msgstr ""
 
 #: modules/process/calcoefs_simple.c:438 modules/process/calcoefs_view.c:529
-#: modules/volume/volume_calibrate.c:505
+#: modules/volume/volume_calibrate.c:474
 msgid "_Z offset:"
 msgstr ""
 
@@ -7736,25 +8027,25 @@ msgstr[0] ""
 msgid "Search canceled"
 msgstr ""
 
-#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:862
-#: modules/process/maskcor.c:332 modules/process/mcrop.c:317
+#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:835
+#: modules/process/maskcor.c:336 modules/process/mcrop.c:316
 #: modules/process/merge.c:1074
 msgid "Correlating..."
 msgstr ""
 
-#: modules/process/calcoefs_stage.c:76
+#: modules/process/calcoefs_stage.c:72
 msgid "Digital AFM data recalibration"
 msgstr ""
 
-#: modules/process/calcoefs_stage.c:90
+#: modules/process/calcoefs_stage.c:86
 msgid "/Cali_bration/_3D Calibration/_Get From Stage map..."
 msgstr "/켈리브레이션(I)/3D 켈리브레이션(3)/Stage map에서 얻기(G)"
 
-#: modules/process/calcoefs_stage.c:94
+#: modules/process/calcoefs_stage.c:90
 msgid "Stage error mapping"
 msgstr ""
 
-#: modules/process/calcoefs_stage.c:131
+#: modules/process/calcoefs_stage.c:127
 msgid "Stage Error Map"
 msgstr ""
 
@@ -7813,14 +8104,16 @@ msgstr "Z 위치"
 msgid "Crop to actual data"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:369
-#: modules/process/deposit_synth.c:641 modules/process/edge.c:705
-#: modules/process/fft_filter_1d.c:299 modules/process/grain_edge.c:290
-#: modules/process/grain_filter.c:347 modules/process/grain_mark.c:372
-#: modules/process/mark_with.c:318 modules/process/polydistort.c:316
-#: modules/process/scars.c:386 modules/process/slope_dist.c:407
-#: modules/process/synth.h:513 modules/volume/volume_extract.c:424
-#: modules/volume/volume_extract.c:505 modules/volume/volume_linestat.c:422
+#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:368
+#: modules/process/deposit_synth.c:642 modules/process/edge.c:705
+#: modules/process/fft_filter_1d.c:301 modules/process/grain_edge.c:277
+#: modules/process/grain_filter.c:346 modules/process/grain_mark.c:357
+#: modules/process/mark_with.c:322 modules/process/mfm_field.c:420
+#: modules/process/mfm_shift.c:216 modules/process/polydistort.c:319
+#: modules/process/psf.c:309 modules/process/scars.c:421
+#: modules/process/slope_dist.c:400 modules/process/synth.h:542
+#: modules/volume/volume_extract.c:411 modules/volume/volume_extract.c:491
+#: modules/volume/volume_linestat.c:427
 msgid "I_nstant updates"
 msgstr ""
 
@@ -7861,27 +8154,27 @@ msgstr ""
 msgid "Building mesh..."
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1818
+#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1867
 msgid "X correction"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1819
+#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1868
 msgid "Y correction"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1820
+#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1869
 msgid "Z correction"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1821
+#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1870
 msgid "X uncertainty"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1822
+#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1871
 msgid "Y uncertainty"
 msgstr ""
 
-#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1823
+#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1872
 msgid "Z uncertainty"
 msgstr ""
 
@@ -7909,78 +8202,79 @@ msgstr ""
 msgid "Delaunay"
 msgstr ""
 
-#: modules/process/calibrate.c:180
+#: modules/process/calibrate.c:172
 msgid "Recalibrates scan lateral dimensions or value range."
 msgstr ""
 
-#: modules/process/calibrate.c:194
+#: modules/process/calibrate.c:186
 msgid "/_Basic Operations/_Dimensions and Units..."
 msgstr "/기본 기능(B)/크기 및 단위(D)..."
 
-#: modules/process/calibrate.c:198 modules/volume/volume_calibrate.c:193
+#: modules/process/calibrate.c:190 modules/volume/volume_calibrate.c:193
 msgid "Change physical dimensions, units or value scale"
 msgstr ""
 
-#: modules/process/calibrate.c:357 modules/volume/volume_calibrate.c:355
+#: modules/process/calibrate.c:349 modules/volume/volume_calibrate.c:355
 msgid "Recalibrated Data"
 msgstr ""
 
-#: modules/process/calibrate.c:390
+#: modules/process/calibrate.c:382
 msgid "Dimensions and Units"
 msgstr "면적 및 단위"
 
-#: modules/process/calibrate.c:411 modules/volume/volume_calibrate.c:389
+#: modules/process/calibrate.c:405 modules/volume/volume_calibrate.c:391
 msgid "New Real Dimensions"
 msgstr ""
 
-#: modules/process/calibrate.c:417
+#: modules/process/calibrate.c:415
 msgid "_Match pixel size:"
 msgstr ""
 
-#: modules/process/calibrate.c:444 modules/volume/volume_calibrate.c:394
+#: modules/process/calibrate.c:447 modules/volume/volume_calibrate.c:397
 msgid "_X range:"
 msgstr ""
 
-#: modules/process/calibrate.c:473 modules/volume/volume_calibrate.c:421
+#: modules/process/calibrate.c:467 modules/volume/volume_calibrate.c:417
 msgid "_Y range:"
 msgstr ""
 
-#: modules/process/calibrate.c:489
+#: modules/process/calibrate.c:472
 msgid "_Square samples"
 msgstr ""
 
-#: modules/process/calibrate.c:524 modules/volume/volume_calibrate.c:521
+#: modules/process/calibrate.c:496 modules/volume/volume_calibrate.c:480
 msgid "Value Range"
 msgstr ""
 
-#: modules/process/calibrate.c:529 modules/volume/volume_calibrate.c:448
+#: modules/process/calibrate.c:502 modules/volume/volume_calibrate.c:437
 msgid "_Z range:"
 msgstr ""
 
-#: modules/process/calibrate.c:558
+#: modules/process/calibrate.c:524
 msgid "Z shi_ft:"
 msgstr ""
 
-#: modules/process/calibrate.c:573 modules/volume/volume_calibrate.c:570
+#: modules/process/calibrate.c:533 modules/volume/volume_calibrate.c:515
 msgid "Calibration Coefficients"
 msgstr ""
 
-#: modules/process/calibrate.c:580 modules/volume/volume_calibrate.c:577
+#: modules/process/calibrate.c:538 modules/volume/volume_calibrate.c:520
 msgid "_X calibration factor:"
 msgstr ""
 
-#: modules/process/calibrate.c:590 modules/volume/volume_calibrate.c:585
+#: modules/process/calibrate.c:545 modules/volume/volume_calibrate.c:527
 msgid "_Y calibration factor:"
 msgstr ""
 
-#: modules/process/calibrate.c:600 modules/volume/volume_calibrate.c:593
+#: modules/process/calibrate.c:552 modules/volume/volume_calibrate.c:534
 msgid "_Z calibration factor:"
 msgstr ""
 
-#: modules/process/calibrate.c:613 modules/process/extend.c:293
-#: modules/tools/crop.c:213
-msgid "Create new channel"
-msgstr ""
+#: modules/process/calibrate.c:567 modules/process/drift.c:389
+#: modules/process/extend.c:293 modules/tools/crop.c:213
+#, fuzzy
+msgid "Create new image"
+msgstr "새 아이템 생성"
 
 #: modules/process/coerce.c:159
 msgid "Transforms surfaces to have prescribed statistical properties."
@@ -7999,13 +8293,13 @@ msgid "Coerced"
 msgstr ""
 
 #: modules/process/coerce.c:225 modules/process/coerce.c:326
-#: modules/process/fbm_synth.c:475 modules/process/lno_synth.c:256
-#: modules/process/noise_synth.c:183
+#: modules/process/fbm_synth.c:474 modules/process/lno_synth.c:254
+#: modules/process/noise_synth.c:181
 msgid "distribution|Uniform"
 msgstr ""
 
-#: modules/process/coerce.c:226 modules/process/fbm_synth.c:476
-#: modules/process/lno_synth.c:246 modules/process/noise_synth.c:173
+#: modules/process/coerce.c:226 modules/process/fbm_synth.c:475
+#: modules/process/lno_synth.c:244 modules/process/noise_synth.c:171
 msgid "distribution|Gaussian"
 msgstr ""
 
@@ -8059,12 +8353,12 @@ msgid "Number of maxima"
 msgstr ""
 
 #: modules/process/col_synth.c:173 modules/tools/linestats.c:178
-#: modules/volume/volume_linestat.c:154
+#: modules/volume/volume_linestat.c:156
 msgid "Skew"
 msgstr ""
 
 #: modules/process/col_synth.c:174 modules/tools/linestats.c:179
-#: modules/tools/roughness.c:386 modules/volume/volume_linestat.c:155
+#: modules/tools/roughness.c:387 modules/volume/volume_linestat.c:157
 msgid "Kurtosis"
 msgstr ""
 
@@ -8077,7 +8371,7 @@ msgid "Generates columnar surfaces by a simple growth algorithm."
 msgstr ""
 
 #: modules/process/col_synth.c:208
-msgid "/S_ynthetic/_Columnar..."
+msgid "/S_ynthetic/_Deposition/_Columnar..."
 msgstr ""
 
 #: modules/process/col_synth.c:212
@@ -8100,7 +8394,7 @@ msgstr ""
 msgid "Inclination"
 msgstr ""
 
-#: modules/process/col_synth.c:509 modules/process/crosscor.c:1063
+#: modules/process/col_synth.c:509 modules/process/crosscor.c:1036
 msgid "Direction"
 msgstr ""
 
@@ -8108,15 +8402,15 @@ msgstr ""
 msgid "Relaxation type:"
 msgstr ""
 
-#: modules/process/col_synth.c:528
+#: modules/process/col_synth.c:529
 msgid "_Melting:"
 msgstr ""
 
-#: modules/process/col_synth.c:612
+#: modules/process/col_synth.c:613
 msgid "Weak"
 msgstr ""
 
-#: modules/process/col_synth.c:613
+#: modules/process/col_synth.c:614
 msgid "Strong"
 msgstr ""
 
@@ -8148,8 +8442,8 @@ msgstr ""
 msgid "Convolution Filter"
 msgstr ""
 
-#: modules/process/convolution_filter.c:269 modules/tools/filter.c:170
-#: modules/tools/filter.c:274
+#: modules/process/convolution_filter.c:269 modules/tools/filter.c:171
+#: modules/tools/filter.c:275
 msgid "Filter"
 msgstr ""
 
@@ -8177,107 +8471,116 @@ msgstr ""
 msgid "VSym"
 msgstr ""
 
-#: modules/process/correct_affine.c:231
+#: modules/process/correct_affine.c:220
 msgid ""
 "Corrects affine distortion of images by matching image Bravais lattice to "
 "the true one."
 msgstr ""
 
-#: modules/process/correct_affine.c:246
+#: modules/process/correct_affine.c:235
 msgid "/_Distortion/_Affine..."
 msgstr ""
 
-#: modules/process/correct_affine.c:250
+#: modules/process/correct_affine.c:239
 msgid "Correct affine distortion"
 msgstr ""
 
-#: modules/process/correct_affine.c:298
+#: modules/process/correct_affine.c:309 modules/process/correct_affine.c:634
+msgid "Corrected"
+msgstr ""
+
+#: modules/process/correct_affine.c:343
 msgid "Affine Correction"
 msgstr ""
 
-#: modules/process/correct_affine.c:351 modules/process/fft_filter_2d.c:530
+#: modules/process/correct_affine.c:349 modules/process/measure_lattice.c:249
+msgid "_Refine"
+msgstr ""
+
+#: modules/process/correct_affine.c:399 modules/process/fft_filter_2d.c:530
 msgid "Preview Options"
 msgstr ""
 
-#: modules/process/correct_affine.c:356 modules/process/fft_filter_2d.c:535
-#: modules/process/measure_lattice.c:321
+#: modules/process/correct_affine.c:404 modules/process/fft_filter_2d.c:535
+#: modules/process/measure_lattice.c:311
 msgid "Display:"
 msgstr ""
 
-#: modules/process/correct_affine.c:364 modules/process/measure_lattice.c:329
+#: modules/process/correct_affine.c:412 modules/process/measure_lattice.c:319
 #: modules/tools/grainremover.c:109
 msgid "_Data"
 msgstr ""
 
-#: modules/process/correct_affine.c:365
+#: modules/process/correct_affine.c:413
 msgid "2D _ACF"
 msgstr ""
 
-#: modules/process/correct_affine.c:366 modules/process/drift.c:365
+#: modules/process/correct_affine.c:414 modules/process/drift.c:364
 msgid "Correc_ted data"
 msgstr ""
 
-#: modules/process/correct_affine.c:377
+#: modules/process/correct_affine.c:425
 msgid "ACF zoom:"
 msgstr ""
 
-#: modules/process/correct_affine.c:394 modules/process/measure_lattice.c:372
+#: modules/process/correct_affine.c:442 modules/process/measure_lattice.c:346
+#, fuzzy
+msgid "Interpolate _horizontal ACF"
+msgstr "교차점"
+
+#: modules/process/correct_affine.c:452 modules/process/measure_lattice.c:372
 msgid "Lattice Vectors"
 msgstr ""
 
 #. TRANSLATORS: Correct is an adjective here.
-#: modules/process/correct_affine.c:419
+#: modules/process/correct_affine.c:469
 msgid "Correct Lattice"
 msgstr ""
 
-#: modules/process/correct_affine.c:423
+#: modules/process/correct_affine.c:473
 msgid "_Lattice type:"
 msgstr ""
 
-#: modules/process/correct_affine.c:430
+#: modules/process/correct_affine.c:480
 msgid "User defined"
 msgstr ""
 
-#: modules/process/correct_affine.c:445
+#: modules/process/correct_affine.c:495
 msgid "_Different lengths"
 msgstr ""
 
-#: modules/process/correct_affine.c:474
+#: modules/process/correct_affine.c:524
 msgid "Image for _ACF:"
 msgstr ""
 
-#: modules/process/correct_affine.c:501
+#: modules/process/correct_affine.c:551
 msgid "_Scaling:"
 msgstr ""
 
-#: modules/process/correct_affine.c:508
+#: modules/process/correct_affine.c:558
 msgid "Exactly as specified"
 msgstr ""
 
-#: modules/process/correct_affine.c:509
+#: modules/process/correct_affine.c:560
 msgid "Preserve area"
 msgstr ""
 
-#: modules/process/correct_affine.c:510
+#: modules/process/correct_affine.c:562
 msgid "Preserve X scale"
 msgstr ""
 
-#: modules/process/correct_affine.c:561
-msgid "Corrected"
+#: modules/process/correct_affine.c:571 modules/process/drift.c:379
+msgid "_Apply to all compatible images"
 msgstr ""
 
-#: modules/process/correct_affine.c:617 modules/process/measure_lattice.c:489
+#: modules/process/correct_affine.c:693 modules/process/measure_lattice.c:482
 msgid "length"
 msgstr ""
 
-#: modules/process/correct_affine.c:624 modules/process/measure_lattice.c:496
+#: modules/process/correct_affine.c:700 modules/process/measure_lattice.c:489
 msgid "angle"
 msgstr ""
 
-#: modules/process/correct_affine.c:717
-msgid "Re_fine"
-msgstr ""
-
 #: modules/process/crosscor.c:157
 msgid "Calculates cross-correlation of two data fields."
 msgstr ""
@@ -8302,200 +8605,202 @@ msgstr ""
 msgid "Search size"
 msgstr ""
 
-#: modules/process/crosscor.c:272
-msgid "Global offset of 2nd channel"
+#: modules/process/crosscor.c:267
+msgid "_Guess"
 msgstr ""
 
-#: modules/process/crosscor.c:277
-msgid "_Guess"
+#: modules/process/crosscor.c:268
+msgid "Global offset of 2nd channel"
 msgstr ""
 
-#: modules/process/crosscor.c:311
+#: modules/process/crosscor.c:292
 msgid "Window size"
 msgstr ""
 
-#: modules/process/crosscor.c:319
+#: modules/process/crosscor.c:300
 msgid "W_idth:"
 msgstr ""
 
-#: modules/process/crosscor.c:329
+#: modules/process/crosscor.c:308
 msgid "Hei_ght:"
 msgstr ""
 
-#: modules/process/crosscor.c:342 modules/process/fft.c:405
+#: modules/process/crosscor.c:319 modules/process/fft.c:403
 #: modules/process/psdf_logphi.c:268
 msgid "_Windowing type:"
 msgstr ""
 
-#: modules/process/crosscor.c:350
+#: modules/process/crosscor.c:327
 msgid "All"
 msgstr ""
 
-#: modules/process/crosscor.c:351
+#: modules/process/crosscor.c:328
 msgid "Absolute"
 msgstr ""
 
-#: modules/process/crosscor.c:352
+#: modules/process/crosscor.c:329
 msgid "X Distance"
 msgstr ""
 
-#: modules/process/crosscor.c:353
+#: modules/process/crosscor.c:330
 msgid "Y Distance"
 msgstr ""
 
-#: modules/process/crosscor.c:355 modules/process/crosscor.c:1077
+#: modules/process/crosscor.c:332 modules/process/crosscor.c:1050
 msgid "Score"
 msgstr ""
 
-#: modules/process/crosscor.c:357 modules/process/fft.c:395
-#: modules/process/fit-shape.c:688 modules/process/maskcor.c:176
+#: modules/process/crosscor.c:334 modules/process/fft.c:393
+#: modules/process/fit-shape.c:699 modules/process/maskcor.c:177
+#: modules/process/mfm_current.c:455 modules/process/mfm_field.c:373
+#: modules/process/mfm_parallel.c:466
 msgid "Output _type:"
 msgstr ""
 
-#: modules/process/crosscor.c:363
+#: modules/process/crosscor.c:340
 msgid "Add _low score results mask"
 msgstr ""
 
-#: modules/process/crosscor.c:374 modules/process/grain_wshed.c:223
-#: modules/process/maskcor.c:188
+#: modules/process/crosscor.c:351 modules/process/grain_wshed.c:225
+#: modules/process/maskcor.c:191
 msgid "T_hreshold:"
 msgstr ""
 
-#: modules/process/crosscor.c:381
+#: modules/process/crosscor.c:359
 msgid "Multichannel cross-corelation"
 msgstr ""
 
-#: modules/process/crosscor.c:400
+#: modules/process/crosscor.c:378
 msgid "Second _source data:"
 msgstr ""
 
-#: modules/process/crosscor.c:417
+#: modules/process/crosscor.c:394
 msgid "Correlate with:"
 msgstr ""
 
-#: modules/process/crosscor.c:424
+#: modules/process/crosscor.c:402
 #, fuzzy
 msgid "Postprocess:"
 msgstr "데이터 프로세스"
 
-#: modules/process/crosscor.c:431
-msgid "Apply Ga_ussian filter of width: "
+#: modules/process/crosscor.c:411
+msgid "Apply Ga_ussian filter of width:"
 msgstr ""
 
-#: modules/process/crosscor.c:451
+#: modules/process/crosscor.c:424
 msgid "Extend results to borders"
 msgstr ""
 
-#: modules/process/crosscor.c:461
+#: modules/process/crosscor.c:433
 msgid "Create corrected data from 2nd channel"
 msgstr ""
 
-#: modules/process/crosscor.c:860
+#: modules/process/crosscor.c:833
 msgid "Correlating first set..."
 msgstr ""
 
-#: modules/process/crosscor.c:892
+#: modules/process/crosscor.c:865
 msgid "Correlating second set..."
 msgstr ""
 
-#: modules/process/crosscor.c:999
+#: modules/process/crosscor.c:972
 #, fuzzy
 msgid "Corrected 2nd channel"
 msgstr "채널"
 
-#: modules/process/crosscor.c:1023
+#: modules/process/crosscor.c:996
 msgid "X difference"
 msgstr ""
 
-#: modules/process/crosscor.c:1037
+#: modules/process/crosscor.c:1010
 msgid "Y difference"
 msgstr ""
 
-#: modules/process/crosscor.c:1050
+#: modules/process/crosscor.c:1023
 msgid "Absolute difference"
 msgstr ""
 
-#: modules/process/curvature.c:131
+#: modules/process/curvature.c:130
 msgid "Center value"
 msgstr "중간 값"
 
-#: modules/process/curvature.c:132
+#: modules/process/curvature.c:131
 msgid "Curvature radius 1"
 msgstr "곡률 반경 1"
 
-#: modules/process/curvature.c:133
+#: modules/process/curvature.c:132
 msgid "Curvature radius 2"
 msgstr "곡률 반경 2"
 
-#: modules/process/curvature.c:134
+#: modules/process/curvature.c:133
 msgid "Direction 1"
 msgstr "방향 1"
 
-#: modules/process/curvature.c:135
+#: modules/process/curvature.c:134
 msgid "Direction 2"
 msgstr "방향 2"
 
-#: modules/process/curvature.c:163
+#: modules/process/curvature.c:162
 msgid "Calculates overall curvature."
 msgstr "전체 곡률 계산하기."
 
-#: modules/process/curvature.c:177
+#: modules/process/curvature.c:176
 msgid "/_Level/_Curvature..."
 msgstr "/평평하게 만들기(L)/굴곡면(C)..."
 
-#: modules/process/curvature.c:181
+#: modules/process/curvature.c:180
 msgid "Calculate overall curvature"
 msgstr "전체 곡률 계산하기"
 
-#: modules/process/curvature.c:211 modules/process/facet-level.c:118
+#: modules/process/curvature.c:210 modules/process/facet-level.c:118
 #: modules/process/semsim.c:165
 #, c-format
 msgid "%s: Lateral dimensions and value must be the same physical quantity."
 msgstr ""
 
-#: modules/process/curvature.c:445
+#: modules/process/curvature.c:447
 msgid "Curvature Sections"
 msgstr ""
 
-#: modules/process/curvature.c:653
+#: modules/process/curvature.c:655
 msgid "Output Type"
 msgstr "출력 종류"
 
-#: modules/process/curvature.c:660
+#: modules/process/curvature.c:662
 msgid "_Set selection"
 msgstr ""
 
-#: modules/process/curvature.c:670
+#: modules/process/curvature.c:672
 msgid "_Plot graph"
 msgstr "그래프 그리기(P)"
 
-#: modules/process/curvature.c:685 modules/process/drift.c:337
-#: modules/process/fft_profile.c:310 modules/process/fractal.c:328
-#: modules/process/grain_cross.c:253 modules/process/linematch.c:885
-#: modules/process/slope_dist.c:349 modules/tools/linestats.c:418
-#: modules/tools/profile.c:573 modules/tools/roughness.c:872
-#: modules/tools/sfunctions.c:486 modules/tools/spectro.c:382
-#: modules/volume/volume_slice.c:398
-#, fuzzy
-msgid "Target _graph:"
-msgstr "그래프 그리기(G)"
-
-#: modules/process/curvature.c:691 modules/process/drift.c:343
-#: modules/process/fft_profile.c:316 modules/process/fractal.c:334
-#: modules/process/grain_cross.c:259 modules/process/linematch.c:892
-#: modules/process/slope_dist.c:355 modules/tools/linestats.c:424
-#: modules/tools/profile.c:579 modules/tools/roughness.c:878
-#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:388
-#: modules/volume/volume_slice.c:406
+#: modules/process/curvature.c:684 modules/process/drift.c:340
+#: modules/process/fft_profile.c:300 modules/process/fractal.c:308
+#: modules/process/grain_cross.c:260 modules/process/linematch.c:855
+#: modules/process/slope_dist.c:347 modules/tools/linestats.c:424
+#: modules/tools/profile.c:559 modules/tools/roughness.c:886
+#: modules/tools/sfunctions.c:488 modules/tools/spectro.c:391
+#: modules/volume/volume_slice.c:408
 #, fuzzy
 msgid "New graph"
 msgstr "그래프 자르기"
 
-#: modules/process/curvature.c:951
+#: modules/process/curvature.c:689 modules/process/drift.c:345
+#: modules/process/fft_profile.c:306 modules/process/fractal.c:313
+#: modules/process/grain_cross.c:254 modules/process/linematch.c:860
+#: modules/process/slope_dist.c:352 modules/tools/linestats.c:418
+#: modules/tools/profile.c:563 modules/tools/roughness.c:890
+#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:385
+#: modules/volume/volume_slice.c:400
+#, fuzzy
+msgid "Target _graph:"
+msgstr "그래프 그리기(G)"
+
+#: modules/process/curvature.c:949
 msgid "Axes are outside the image."
 msgstr ""
 
-#: modules/process/curvature.c:1018
+#: modules/process/curvature.c:1016
 msgid "Save Curvature"
 msgstr "곡률 저장"
 
@@ -8519,8 +8824,8 @@ msgstr ""
 msgid "2D CWT"
 msgstr ""
 
-#: modules/process/cwt.c:158 modules/process/dwt.c:185
-#: modules/process/dwtanisotropy.c:209
+#: modules/process/cwt.c:159 modules/process/dwt.c:185
+#: modules/process/dwtanisotropy.c:212
 msgid "_Wavelet type:"
 msgstr ""
 
@@ -8529,87 +8834,83 @@ msgid "Generates particles using simple dynamical model"
 msgstr ""
 
 #: modules/process/deposit_synth.c:184
-msgid "/S_ynthetic/_Particles..."
+msgid "/S_ynthetic/_Deposition/_Particles..."
 msgstr ""
 
 #: modules/process/deposit_synth.c:188
 msgid "Generate particles using dynamical model"
 msgstr ""
 
-#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:867
+#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:866
 #, c-format
 msgid ""
 "Not all the particles could be deposited (%u),\n"
 "try more revise steps."
 msgstr ""
 
-#: modules/process/deposit_synth.c:347
+#: modules/process/deposit_synth.c:348
 msgid "Particle Generation"
 msgstr ""
 
-#: modules/process/deposit_synth.c:427
+#: modules/process/deposit_synth.c:431
 msgid "Particle r_adius:"
 msgstr ""
 
-#: modules/process/deposit_synth.c:438
+#: modules/process/deposit_synth.c:443
 msgid "Distribution _width:"
 msgstr ""
 
-#: modules/process/deposit_synth.c:449
-msgid "Surface _coverage:"
-msgstr ""
-
-#: modules/process/deposit_synth.c:458
+#: modules/process/deposit_synth.c:462
 msgid "_Relax steps:"
 msgstr ""
 
-#: modules/process/deposit_synth.c:659 modules/process/synth.h:548
+#: modules/process/deposit_synth.c:660 modules/process/synth.h:577
 msgid "R_andom seed:"
 msgstr ""
 
-#: modules/process/deposit_synth.c:665 modules/process/synth.h:554
+#: modules/process/deposit_synth.c:666 modules/process/synth.h:583
 msgid "seed|_New"
 msgstr ""
 
-#: modules/process/deposit_synth.c:676
+#: modules/process/deposit_synth.c:677
 msgid "Randomize"
 msgstr ""
 
-#: modules/process/deposit_synth.c:860 modules/process/domain_synth.c:919
+#: modules/process/deposit_synth.c:859 modules/process/domain_synth.c:919
 msgid "Running computation..."
 msgstr ""
 
-#: modules/process/deposit_synth.c:865
+#: modules/process/deposit_synth.c:864
 #, c-format
 msgid "%d particles were deposited"
 msgstr ""
 
-#: modules/process/deposit_synth.c:1093
+#: modules/process/deposit_synth.c:1092
 msgid "Initial particle set..."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1252
+#: modules/process/deposit_synth.c:1251
 msgid "Running revise..."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1380
+#: modules/process/deposit_synth.c:1379
 msgid "Error: too many particles."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1382
+#: modules/process/deposit_synth.c:1381
 msgid "Error: no particles."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1384
+#: modules/process/deposit_synth.c:1383
 msgid "Error: particles too large."
 msgstr ""
 
-#: modules/process/deposit_synth.c:1386
+#: modules/process/deposit_synth.c:1385
 msgid "Error: particles too small."
 msgstr ""
 
 #: modules/process/diff_synth.c:197 modules/tools/linestats.c:173
-#: modules/volume/volume_linestat.c:149
+#: modules/volume/volume_linestat.c:151
 msgid "Variation"
 msgstr ""
 
@@ -8622,7 +8923,7 @@ msgid "Generates surfaces by diffusion limited aggregation."
 msgstr ""
 
 #: modules/process/diff_synth.c:228
-msgid "/S_ynthetic/_Diffusion..."
+msgid "/S_ynthetic/_Deposition/_Diffusion..."
 msgstr ""
 
 #: modules/process/diff_synth.c:232
@@ -8637,44 +8938,44 @@ msgstr ""
 msgid "_Flux:"
 msgstr ""
 
-#: modules/process/diff_synth.c:522
+#: modules/process/diff_synth.c:521
 msgid "Probabilities"
 msgstr ""
 
-#: modules/process/diff_synth.c:530
+#: modules/process/diff_synth.c:529
 msgid "_Sticking:"
 msgstr ""
 
-#: modules/process/diff_synth.c:539
+#: modules/process/diff_synth.c:538
 msgid "_Activation:"
 msgstr ""
 
-#: modules/process/diff_synth.c:548
+#: modules/process/diff_synth.c:547
 msgid "Passing Sch_woebel:"
 msgstr ""
 
-#: modules/process/dimensions.h:457
+#: modules/process/dimensions.h:439
 msgid "S_quare image"
 msgstr ""
 
-#: modules/process/dimensions.h:489
+#: modules/process/dimensions.h:473
 msgid "_Dimension units:"
 msgstr ""
 
-#: modules/process/dimensions.h:502
-msgid "Current Channel"
+#: modules/process/dimensions.h:488
+msgid "Current Image"
 msgstr ""
 
-#: modules/process/dimensions.h:506
-msgid "_Take Dimensions from Current Channel"
+#: modules/process/dimensions.h:492
+msgid "_Take Dimensions from Current Image"
 msgstr ""
 
-#: modules/process/dimensions.h:514
-msgid "_Replace the current channel"
+#: modules/process/dimensions.h:501
+msgid "_Replace the current image"
 msgstr ""
 
-#: modules/process/dimensions.h:523
-msgid "_Start from the current channel"
+#: modules/process/dimensions.h:510
+msgid "_Start from the current image"
 msgstr ""
 
 #: modules/process/domain_synth.c:158
@@ -8734,13 +9035,13 @@ msgid "_Monte Carlo time step:"
 msgstr ""
 
 #: modules/process/domain_synth.c:504 modules/process/fft_filter_2d.c:586
-#: modules/volume/volume_slice.c:364
+#: modules/volume/volume_slice.c:366
 msgid "Output Options"
 msgstr ""
 
 #: modules/process/domain_synth.c:523 modules/process/fft_filter_2d.c:591
-#: modules/process/mask_edt.c:377 modules/process/slope_dist.c:323
-#: modules/volume/volume_linestat.c:432 modules/volume/volume_slice.c:384
+#: modules/process/mask_edt.c:211 modules/process/slope_dist.c:323
+#: modules/volume/volume_linestat.c:437 modules/volume/volume_slice.c:386
 msgid "Output type:"
 msgstr ""
 
@@ -8769,57 +9070,49 @@ msgstr ""
 msgid "rows"
 msgstr ""
 
-#: modules/process/drift.c:304
+#: modules/process/drift.c:305
 msgid "Correct _data"
 msgstr ""
 
-#: modules/process/drift.c:314
+#: modules/process/drift.c:315
 msgid "_Exclude linear skew"
 msgstr ""
 
-#: modules/process/drift.c:324
+#: modules/process/drift.c:325
 msgid "Plot drift _graph"
 msgstr ""
 
-#: modules/process/drift.c:356 modules/process/fit-shape.c:693
-#: modules/process/neural.c:548 modules/process/polydistort.c:275
+#: modules/process/drift.c:355 modules/process/fit-shape.c:705
+#: modules/process/neural.c:552 modules/process/polydistort.c:278
 msgid "Preview:"
 msgstr ""
 
-#: modules/process/drift.c:366
+#: modules/process/drift.c:365
 msgid "Drift _lines"
 msgstr ""
 
-#: modules/process/drift.c:374 modules/process/facet_analysis.c:407
-#: modules/process/grain_edge.c:285 modules/process/grain_filter.c:357
-#: modules/process/grain_mark.c:367 modules/process/grain_wshed.c:267
-#: modules/process/mark_disconn.c:310 modules/process/scars.c:381
+#: modules/process/drift.c:373 modules/process/facet_analysis.c:390
+#: modules/process/grain_edge.c:272 modules/process/grain_filter.c:356
+#: modules/process/grain_mark.c:341 modules/process/grain_wshed.c:271
+#: modules/process/mark_disconn.c:298 modules/process/scars.c:405
 #: modules/process/wpour_mark.c:369
 msgid "_Mask color:"
 msgstr ""
 
-#: modules/process/drift.c:379
-msgid "Distribute"
-msgstr ""
-
-#: modules/process/drift.c:388
-msgid "Replace"
-msgstr ""
-
-#: modules/process/drift.c:569
+#: modules/process/drift.c:570
 msgid "Drift-corrected"
 msgstr ""
 
-#: modules/process/drift.c:613
+#: modules/process/drift.c:614
 msgid "Drift"
 msgstr ""
 
-#: modules/process/drift.c:614 modules/xyz/xyz_drift.c:392
+#: modules/process/drift.c:615 modules/xyz/xyz_drift.c:392
 #: modules/xyz/xyz_drift.c:411 modules/xyz/xyz_drift.c:430
 msgid "drift"
 msgstr ""
 
-#: modules/process/drift.c:620 modules/xyz/xyz_drift.c:402
+#: modules/process/drift.c:621 modules/xyz/xyz_drift.c:402
 msgid "x-axis drift"
 msgstr ""
 
@@ -8875,11 +9168,11 @@ msgstr ""
 msgid "2D DWT Anisotropy"
 msgstr ""
 
-#: modules/process/dwtanisotropy.c:214
+#: modules/process/dwtanisotropy.c:218
 msgid "X/Y ratio threshold:"
 msgstr ""
 
-#: modules/process/dwtanisotropy.c:222
+#: modules/process/dwtanisotropy.c:226
 msgid "Low level exclude limit:"
 msgstr ""
 
@@ -9005,7 +9298,7 @@ msgstr ""
 msgid "_Gaussian FWHM:"
 msgstr ""
 
-#: modules/process/edge.c:681 modules/process/mark_disconn.c:271
+#: modules/process/edge.c:681 modules/process/mark_disconn.c:272
 msgid "_Threshold:"
 msgstr ""
 
@@ -9073,11 +9366,11 @@ msgstr ""
 msgid "Entropy deficit:"
 msgstr ""
 
-#: modules/process/entropy.c:567
+#: modules/process/entropy.c:568
 msgid "Entropy at scales"
 msgstr ""
 
-#: modules/process/entropy.c:586
+#: modules/process/entropy.c:587
 #, fuzzy
 msgid "Best estimate"
 msgstr "팁 추정 효과 가리기"
@@ -9126,23 +9419,23 @@ msgstr ""
 msgid "Extend _symetrically"
 msgstr ""
 
-#: modules/process/extend.c:268 modules/process/polydistort.c:256
-#: modules/xyz/xyz_raster.c:658
+#: modules/process/extend.c:268 modules/process/polydistort.c:259
+#: modules/xyz/xyz_raster.c:627
 msgid "exterior|Border"
 msgstr ""
 
-#: modules/process/extend.c:270 modules/process/polydistort.c:258
-#: modules/xyz/xyz_raster.c:660
+#: modules/process/extend.c:270 modules/process/polydistort.c:261
+#: modules/xyz/xyz_raster.c:629
 msgid "exterior|Mirror"
 msgstr ""
 
-#: modules/process/extend.c:272 modules/process/polydistort.c:260
-#: modules/xyz/xyz_raster.c:662
+#: modules/process/extend.c:272 modules/process/polydistort.c:263
+#: modules/xyz/xyz_raster.c:631
 msgid "exterior|Periodic"
 msgstr ""
 
-#: modules/process/extend.c:275 modules/process/polydistort.c:263
-#: modules/xyz/xyz_raster.c:650
+#: modules/process/extend.c:275 modules/process/polydistort.c:266
+#: modules/xyz/xyz_raster.c:619
 msgid "_Exterior type:"
 msgstr ""
 
@@ -9176,11 +9469,11 @@ msgstr "클러스터 개수"
 msgid "There is no path selection."
 msgstr ""
 
-#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:390
+#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:383
 msgid "X position"
 msgstr "X 위치"
 
-#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:397
+#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:389
 msgid "Y position"
 msgstr "Y 위치"
 
@@ -9193,7 +9486,7 @@ msgid "Y tangent"
 msgstr ""
 
 #: modules/process/extract_path.c:392 modules/process/extract_path.c:404
-#: modules/process/pat_synth.c:1432 modules/tools/distance.c:146
+#: modules/process/pat_synth.c:1433 modules/tools/distance.c:146
 msgid "Distance"
 msgstr ""
 
@@ -9236,47 +9529,36 @@ msgstr ""
 msgid "Mark areas by 2D slope"
 msgstr "2D 기울기를 이용 영역 표시하기"
 
-#: modules/process/facet_analysis.c:266
+#: modules/process/facet_analysis.c:270
 msgid "Mark Facets"
 msgstr ""
 
-#: modules/process/facet_analysis.c:269
+#: modules/process/facet_analysis.c:273
 msgid "verb|_Mark"
 msgstr ""
 
 #. TRANSLATORS: The direction or line orthogonal to something.
-#: modules/process/facet_analysis.c:325
+#: modules/process/facet_analysis.c:329
 msgid "Normal"
 msgstr ""
 
-#: modules/process/facet_analysis.c:333
+#: modules/process/facet_analysis.c:337
 msgid "_Find Maximum"
 msgstr ""
 
-#: modules/process/facet_analysis.c:341
+#: modules/process/facet_analysis.c:345
 msgid "Mean Normal"
 msgstr ""
 
-#: modules/process/facet_analysis.c:350
+#: modules/process/facet_analysis.c:362
 msgid "Facet plane size:"
 msgstr ""
 
-#: modules/process/facet_analysis.c:375
+#: modules/process/facet_analysis.c:370
 msgid "_Tolerance:"
 msgstr ""
 
-#: modules/process/facet_analysis.c:384 modules/process/grain_edge.c:262
-#: modules/process/grain_mark.c:344 modules/process/mark_disconn.c:286
-msgid "Com_bine with existing mask"
-msgstr ""
-
-#: modules/process/facet_analysis.c:398 modules/process/grain_edge.c:276
-#: modules/process/grain_mark.c:358 modules/process/mark_disconn.c:301
-#: modules/process/mark_with.c:230 modules/process/mask_morph.c:210
-msgid "Operation:"
-msgstr ""
-
-#: modules/process/facet_analysis.c:415
+#: modules/process/facet_analysis.c:398
 msgid ""
 "Warning: Lateral and value units differ. Angles are not physically "
 "meaningful."
@@ -9306,8 +9588,8 @@ msgstr ""
 msgid "_Stationarity scale:"
 msgstr ""
 
-#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:509
-#: modules/process/noise_synth.c:409
+#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:507
+#: modules/process/noise_synth.c:407
 msgid "_Distribution:"
 msgstr ""
 
@@ -9315,17 +9597,17 @@ msgstr ""
 msgid "Po_wer:"
 msgstr ""
 
-#: modules/process/fbm_synth.c:408 modules/process/fft_synth.c:414
-#: modules/process/lno_synth.c:533 modules/process/noise_synth.c:433
+#: modules/process/fbm_synth.c:407 modules/process/fft_synth.c:414
+#: modules/process/lno_synth.c:531 modules/process/noise_synth.c:431
 msgid "_RMS:"
 msgstr ""
 
-#: modules/process/fbm_synth.c:477 modules/process/lno_synth.c:251
-#: modules/process/noise_synth.c:178
+#: modules/process/fbm_synth.c:476 modules/process/lno_synth.c:249
+#: modules/process/noise_synth.c:176
 msgid "distribution|Exponential"
 msgstr ""
 
-#: modules/process/fbm_synth.c:478
+#: modules/process/fbm_synth.c:477
 #, fuzzy
 msgid "distribution|Power"
 msgstr "높이 분포"
@@ -9378,7 +9660,7 @@ msgstr ""
 msgid "Modulus"
 msgstr ""
 
-#: modules/process/fft.c:327 modules/process/wave_synth.c:583
+#: modules/process/fft.c:327 modules/process/wave_synth.c:618
 msgid "Phase"
 msgstr ""
 
@@ -9394,63 +9676,63 @@ msgstr ""
 msgid "I_maginary part:"
 msgstr ""
 
-#: modules/process/fft.c:382
+#: modules/process/fft.c:380
 msgid "_Inverse transform"
 msgstr ""
 
-#: modules/process/fft.c:411
+#: modules/process/fft.c:409
 msgid "Subtract mean _value beforehand"
 msgstr ""
 
-#: modules/process/fft.c:422
+#: modules/process/fft.c:420
 msgid "_Preserve RMS"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:117
+#: modules/process/fft_filter_1d.c:118
 msgid "FFT filtering"
 msgstr "FFT 필터링"
 
-#: modules/process/fft_filter_1d.c:131
+#: modules/process/fft_filter_1d.c:132
 msgid "/_Correct Data/1D _FFT Filtering..."
 msgstr "/데이터 교정(C)/1D FFT 필터링(F)..."
 
-#: modules/process/fft_filter_1d.c:135
+#: modules/process/fft_filter_1d.c:136
 msgid "1D FFT Filtering"
 msgstr "1D FFT 필터링"
 
-#: modules/process/fft_filter_1d.c:165 modules/process/wpour_mark.c:391
+#: modules/process/fft_filter_1d.c:166 modules/process/wpour_mark.c:391
 msgid "Marked"
 msgstr "표시된"
 
-#: modules/process/fft_filter_1d.c:166
+#: modules/process/fft_filter_1d.c:167
 msgid "Unmarked"
 msgstr "표시 안 된"
 
-#: modules/process/fft_filter_1d.c:169
+#: modules/process/fft_filter_1d.c:170
 msgid "Null"
 msgstr "무효"
 
-#: modules/process/fft_filter_1d.c:170
+#: modules/process/fft_filter_1d.c:171
 msgid "Suppress"
 msgstr ""
 
-#: modules/process/fft_filter_1d.c:180
+#: modules/process/fft_filter_1d.c:181
 msgid "1D FFT filter"
 msgstr "1D FFT 필터"
 
-#: modules/process/fft_filter_1d.c:269 modules/process/linematch.c:861
+#: modules/process/fft_filter_1d.c:271 modules/process/linematch.c:828
 msgid "_Direction:"
 msgstr "방향(D):"
 
-#: modules/process/fft_filter_1d.c:277
+#: modules/process/fft_filter_1d.c:279
 msgid "_Suppress type:"
 msgstr "제거 방식(S):"
 
-#: modules/process/fft_filter_1d.c:285
+#: modules/process/fft_filter_1d.c:287
 msgid "_Filter type:"
 msgstr "필터 종류(F):"
 
-#: modules/process/fft_filter_1d.c:513
+#: modules/process/fft_filter_1d.c:515
 msgid "1D FFT Filtered Data"
 msgstr "1D FFT 필터링된 데이터"
 
@@ -9470,9 +9752,10 @@ msgstr "이차원 FFT  필터링"
 msgid "Filtered Data"
 msgstr "필터링된 데이터"
 
-#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:594
-#: modules/process/fit-shape.c:643 modules/process/fit-shape.c:658
-#: modules/process/fit-shape.c:662 modules/process/neural.c:560
+#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:604
+#: modules/process/fit-shape.c:653 modules/process/fit-shape.c:668
+#: modules/process/fit-shape.c:672 modules/process/neural.c:564
+#: modules/process/psf.c:232
 msgid "Difference"
 msgstr "차이"
 
@@ -9529,7 +9812,7 @@ msgstr "필터 마스크"
 msgid "_Undo"
 msgstr "실행 취소(U)"
 
-#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:556
+#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:562
 msgid "_Fill"
 msgstr "채우기(F)"
 
@@ -9537,7 +9820,7 @@ msgstr "채우기(F)"
 msgid "_Snap to origin"
 msgstr "원점에 맞추기(S)"
 
-#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:339
+#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:329
 msgid "Zoom:"
 msgstr "확대:"
 
@@ -9573,37 +9856,38 @@ msgstr ""
 msgid "Force shapes to center around the origin"
 msgstr ""
 
-#: modules/process/fft_profile.c:125
+#: modules/process/fft_profile.c:124
 msgid ""
 "Reads radial sections of two-dimensional power spectrum density function."
 msgstr ""
 
-#: modules/process/fft_profile.c:140
+#: modules/process/fft_profile.c:139
 msgid "/_Statistics/_PSDF Section..."
 msgstr ""
 
-#: modules/process/fft_profile.c:144
+#: modules/process/fft_profile.c:143
 msgid "Read radial PSDF sections"
 msgstr ""
 
-#: modules/process/fft_profile.c:190
+#: modules/process/fft_profile.c:189
 msgid "Radial PSDF Section"
 msgstr ""
 
-#: modules/process/fft_profile.c:237
+#: modules/process/fft_profile.c:236
 msgid "PSDF Section"
 msgstr ""
 
-#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:336
-#: modules/tools/profile.c:517 modules/tools/sfunctions.c:443
-msgid "_Fix res.:"
-msgstr ""
+#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:338
+#: modules/tools/profile.c:514 modules/tools/sfunctions.c:454
+#, fuzzy
+msgid "_Fixed resolution:"
+msgstr "정밀도(P):"
 
-#: modules/process/fft_profile.c:279
+#: modules/process/fft_profile.c:278
 msgid "_Separate curves"
 msgstr ""
 
-#: modules/process/fft_profile.c:496
+#: modules/process/fft_profile.c:483
 #, c-format
 msgid "PSDF %.0f°"
 msgstr ""
@@ -9624,11 +9908,15 @@ msgstr ""
 msgid "Spectral Synthesis"
 msgstr ""
 
-#: modules/process/fft_synth.c:429
+#: modules/process/fft_synth.c:430
 msgid "M_inimum frequency:"
 msgstr ""
 
-#: modules/process/fft_synth.c:449
+#: modules/process/fft_synth.c:430 modules/process/fft_synth.c:450
+msgid "px<sup>-1</sup>"
+msgstr ""
+
+#: modules/process/fft_synth.c:450
 msgid "Ma_ximum frequency:"
 msgstr ""
 
@@ -9648,91 +9936,164 @@ msgstr ""
 msgid "Enable _power multiplier"
 msgstr ""
 
-#: modules/process/fit-shape.c:270
+#: modules/process/fibre_synth.c:256
+msgid "Semi-circle"
+msgstr ""
+
+#: modules/process/fibre_synth.c:257
+#, fuzzy
+msgid "Triangle"
+msgstr "윗쪽 삼각형"
+
+#: modules/process/fibre_synth.c:258
+msgid "Rectangle"
+msgstr ""
+
+#: modules/process/fibre_synth.c:260
+msgid "Quadratic spline"
+msgstr ""
+
+#: modules/process/fibre_synth.c:266
+msgid "Generates surfaces composed from randomly placed fibers."
+msgstr ""
+
+#: modules/process/fibre_synth.c:280
+msgid "/S_ynthetic/_Deposition/_Fibers..."
+msgstr ""
+
+#: modules/process/fibre_synth.c:284
+msgid "Generate surface of randomly placed fibers"
+msgstr ""
+
+#: modules/process/fibre_synth.c:420
+msgid "Random Fibers"
+msgstr ""
+
+#: modules/process/fibre_synth.c:494 modules/process/obj_synth.c:510
+msgid "_Shape:"
+msgstr ""
+
+#: modules/process/fibre_synth.c:513 modules/process/obj_synth.c:529
+msgid "obj."
+msgstr ""
+
+#: modules/process/fibre_synth.c:553
+msgid "Scales _with width"
+msgstr ""
+
+#: modules/process/fibre_synth.c:591 modules/process/synth.h:485
+msgid "Deformation"
+msgstr ""
+
+#: modules/process/fibre_synth.c:600 modules/process/lno_synth.c:852
+#: modules/process/lno_synth.c:1222 modules/process/mask_noisify.c:177
+msgid "Densi_ty:"
+msgstr ""
+
+#: modules/process/fibre_synth.c:607
+#, fuzzy
+msgid "_Lateral:"
+msgstr "GL 재료"
+
+#: modules/process/fibre_synth.c:614
+#, fuzzy
+msgid "Le_ngthwise:"
+msgstr "길이"
+
+#: modules/process/fibre_synth.c:819
+msgid "Along fiber:"
+msgstr ""
+
+#: modules/process/fibre_synth.c:1180
+#, fuzzy
+msgid "Generating fibers..."
+msgstr "마스킹 모드"
+
+#: modules/process/fit-shape.c:264
 msgid "Fits predefined geometrical shapes to data."
 msgstr ""
 
-#: modules/process/fit-shape.c:284
+#: modules/process/fit-shape.c:278
 #, fuzzy
 msgid "/_Level/_Fit Shape..."
 msgstr "/평평하게 만들기(L)/구면 맞추기(F)"
 
-#: modules/process/fit-shape.c:288 modules/process/fit-shape.c:295
+#: modules/process/fit-shape.c:282 modules/process/fit-shape.c:289
 msgid "Fit geometrical shapes"
 msgstr ""
 
-#: modules/process/fit-shape.c:291
+#: modules/process/fit-shape.c:285
 #, fuzzy
 msgid "/_Fit Shape..."
 msgstr "/평평하게 만들기(L)/구면 맞추기(F)"
 
-#: modules/process/fit-shape.c:390
+#: modules/process/fit-shape.c:389
 #, fuzzy
 msgid "Fit Shape"
 msgstr "모양:"
 
-#: modules/process/fit-shape.c:395
+#: modules/process/fit-shape.c:396
 msgid "verb|_Quick Fit"
 msgstr ""
 
-#: modules/process/fit-shape.c:473 modules/process/fit-shape.c:2159
+#: modules/process/fit-shape.c:474 modules/process/fit-shape.c:2141
 #, fuzzy
 msgid "Derived Quantities"
 msgstr "그레인 개수"
 
-#: modules/process/fit-shape.c:478 modules/process/fit-shape.c:2129
+#: modules/process/fit-shape.c:479 modules/process/fit-shape.c:2111
 #, fuzzy
 msgid "Mean square difference:"
 msgstr "이미지 차이점(G)"
 
-#: modules/process/fit-shape.c:580 modules/process/fit-shape.c:626
-#: modules/process/fit-shape.c:657 modules/process/fit-shape.c:661
+#: modules/process/fit-shape.c:590 modules/process/fit-shape.c:636
+#: modules/process/fit-shape.c:667 modules/process/fit-shape.c:671
 msgid "Fitted shape"
 msgstr ""
 
-#: modules/process/fit-shape.c:663 modules/process/mark_disconn.c:189
-#: modules/process/scars.c:281
+#: modules/process/fit-shape.c:673 modules/process/mark_disconn.c:189
+#: modules/process/scars.c:299
 msgid "Both"
 msgstr "모두"
 
-#: modules/process/fit-shape.c:680
+#: modules/process/fit-shape.c:690 modules/process/psf-fit.c:308
 #, fuzzy
 msgid "_Function type:"
 msgstr "기능"
 
-#: modules/process/fit-shape.c:708
+#: modules/process/fit-shape.c:720
 msgid "Show differences with _adapted color map"
 msgstr ""
 
-#: modules/process/fit-shape.c:720
+#: modules/process/fit-shape.c:732
 msgid "Full fit is _geometric"
 msgstr ""
 
-#: modules/process/fit-shape.c:757
+#: modules/process/fit-shape.c:769
 msgid "Calculate differences for e_xcluded pixels"
 msgstr ""
 
-#: modules/process/fit-shape.c:804
+#: modules/process/fit-shape.c:816
 msgid "_Recalculate Image"
 msgstr ""
 
-#: modules/process/fit-shape.c:811
+#: modules/process/fit-shape.c:823
 msgid "Revert to _Previous Values"
 msgstr ""
 
-#: modules/process/fit-shape.c:1850
+#: modules/process/fit-shape.c:1864
 msgid "Parameter estimation failed"
 msgstr ""
 
-#: modules/process/fit-shape.c:1853
+#: modules/process/fit-shape.c:1867
 msgid "Fit failed"
 msgstr ""
 
-#: modules/process/fit-shape.c:1855
+#: modules/process/fit-shape.c:1869
 msgid "Fit was interruped"
 msgstr ""
 
-#: modules/process/fit-shape.c:2115
+#: modules/process/fit-shape.c:2097
 msgid "(fixed)"
 msgstr ""
 
@@ -9754,88 +10115,84 @@ msgstr ""
 msgid "Polynomial leveling..."
 msgstr "다항식 계수"
 
-#: modules/process/fraccor.c:38
+#: modules/process/fraccor.c:39
 msgid "Removes data under mask using fractal interpolation."
 msgstr ""
 
-#: modules/process/fraccor.c:52
+#: modules/process/fraccor.c:53
 msgid "/_Correct Data/_Fractal Correction"
 msgstr ""
 
-#: modules/process/fraccor.c:56
+#: modules/process/fraccor.c:57
 msgid "Interpolate data under mask with fractal interpolation"
 msgstr ""
 
-#: modules/process/fractal.c:134
+#: modules/process/fractal.c:130
 msgid "Partitioning"
 msgstr ""
 
-#: modules/process/fractal.c:135
+#: modules/process/fractal.c:131
 msgid "Cube counting"
 msgstr ""
 
-#: modules/process/fractal.c:136
+#: modules/process/fractal.c:132
 msgid "Triangulation"
 msgstr ""
 
-#: modules/process/fractal.c:137
+#: modules/process/fractal.c:133
 msgid "Power spectrum"
 msgstr ""
 
-#: modules/process/fractal.c:173
+#: modules/process/fractal.c:169
 msgid ""
 "Calculates fractal dimension using several methods (partitioning, box "
 "counting, triangulation, power spectrum)."
 msgstr ""
 
-#: modules/process/fractal.c:188
+#: modules/process/fractal.c:184
 msgid "/_Statistics/_Fractal Dimension..."
 msgstr ""
 
-#: modules/process/fractal.c:192
+#: modules/process/fractal.c:188
 msgid "Calculate fractal dimension"
 msgstr ""
 
-#: modules/process/fractal.c:227
+#: modules/process/fractal.c:223
 msgid "Fractal Dimension"
 msgstr ""
 
-#: modules/process/fractal.c:228
-msgid "Reco_mpute"
+#: modules/process/fractal.c:253
+msgid "_Method:"
 msgstr ""
 
 #: modules/process/fractal.c:269
-msgid "_Method:"
+msgid "Fit Area"
 msgstr ""
 
-#: modules/process/fractal.c:290
-msgid "Fit Area"
+#: modules/process/fractal.c:273 modules/process/fractal.c:545
+#: modules/process/fractal.c:569
+msgid "minimum"
 msgstr ""
 
-#: modules/process/fractal.c:295
+#: modules/process/fractal.c:274
 msgid "From:"
 msgstr ""
 
-#: modules/process/fractal.c:295 modules/process/fractal.c:589
-#: modules/process/fractal.c:613
-msgid "minimum"
+#: modules/process/fractal.c:279 modules/process/fractal.c:546
+#: modules/process/fractal.c:570
+msgid "maximum"
 msgstr ""
 
-#: modules/process/fractal.c:298
+#: modules/process/fractal.c:280
 msgid "To:"
 msgstr ""
 
-#: modules/process/fractal.c:298 modules/process/fractal.c:590
-#: modules/process/fractal.c:614
-msgid "maximum"
-msgstr ""
-
-#: modules/process/fractal.c:308 modules/process/mark_with.c:390
-#: modules/process/neural.c:559
+#: modules/process/fractal.c:287 modules/process/mark_with.c:394
+#: modules/process/neural.c:563
 msgid "Result"
 msgstr ""
 
-#: modules/process/fractal.c:550
+#: modules/process/fractal.c:506
 msgid "Linear fit"
 msgstr ""
 
@@ -9905,11 +10262,11 @@ msgstr ""
 msgid "Grain Correlations"
 msgstr ""
 
-#: modules/process/grain_cross.c:240
+#: modules/process/grain_cross.c:241
 msgid "_Abscissa"
 msgstr ""
 
-#: modules/process/grain_cross.c:244
+#: modules/process/grain_cross.c:245
 msgid "O_rdinate"
 msgstr ""
 
@@ -9937,118 +10294,118 @@ msgstr "그래프 그리기(G)"
 msgid "Grain Distributions"
 msgstr ""
 
-#: modules/process/grain_dist.c:553
+#: modules/process/grain_dist.c:547
 msgid "count"
 msgstr ""
 
-#: modules/process/grain_dist.c:617
+#: modules/process/grain_dist.c:611
 msgid "Export Raw Grain Values"
 msgstr ""
 
-#: modules/process/grain_edge.c:100
+#: modules/process/grain_edge.c:99
 msgid "Marks grains by edge detection method."
 msgstr ""
 
-#: modules/process/grain_edge.c:114
+#: modules/process/grain_edge.c:113
 msgid "/_Grains/Mark by _Edge Detection..."
 msgstr ""
 
-#: modules/process/grain_edge.c:118
+#: modules/process/grain_edge.c:117
 msgid "Mark grains with edge detection mechanism"
 msgstr ""
 
-#: modules/process/grain_edge.c:207
+#: modules/process/grain_edge.c:206
 msgid "Mark Grains by Edge Detection"
 msgstr ""
 
-#: modules/process/grain_edge.c:245
+#: modules/process/grain_edge.c:244
 msgid "Threshold"
 msgstr ""
 
-#: modules/process/grain_edge.c:249
+#: modules/process/grain_edge.c:248
 msgid "_Laplacian:"
 msgstr ""
 
-#: modules/process/grain_filter.c:195
+#: modules/process/grain_filter.c:194
 msgid ""
 "Filters grains by their properties, using logical expressions and thresholds."
 msgstr ""
 
-#: modules/process/grain_filter.c:210
+#: modules/process/grain_filter.c:209
 msgid "/_Grains/_Filter..."
 msgstr ""
 
-#: modules/process/grain_filter.c:214
+#: modules/process/grain_filter.c:213
 msgid "Filter grains by their properties"
 msgstr ""
 
-#: modules/process/grain_filter.c:254
+#: modules/process/grain_filter.c:253
 msgid "There are no grains to filter."
 msgstr ""
 
-#: modules/process/grain_filter.c:310
+#: modules/process/grain_filter.c:309
 msgid "Filter Grains"
 msgstr ""
 
-#: modules/process/grain_filter.c:405
+#: modules/process/grain_filter.c:404
 msgid "Set selected as:"
 msgstr ""
 
-#: modules/process/grain_filter.c:420
+#: modules/process/grain_filter.c:419
 msgid "Keep grains satisfying:"
 msgstr ""
 
-#: modules/process/grain_filter.c:434 modules/process/lat_synth.c:733
+#: modules/process/grain_filter.c:440 modules/process/lat_synth.c:733
 msgid "Lower threshold:"
 msgstr ""
 
-#: modules/process/grain_filter.c:469 modules/process/lat_synth.c:740
+#: modules/process/grain_filter.c:467 modules/process/lat_synth.c:740
 msgid "Upper threshold:"
 msgstr ""
 
 #. TRANSLATORS: %c is replaced with quantity label A, B or C.
-#: modules/process/grain_filter.c:645
+#: modules/process/grain_filter.c:628
 #, c-format
 msgid "Condition %c: %s"
 msgstr ""
 
-#: modules/process/grain_mark.c:139
+#: modules/process/grain_mark.c:137
 msgid "Marks grains by thresholding (height, slope, curvature)."
 msgstr ""
 
-#: modules/process/grain_mark.c:153
+#: modules/process/grain_mark.c:151
 msgid "/_Grains/_Mark by Threshold..."
 msgstr ""
 
-#: modules/process/grain_mark.c:157
+#: modules/process/grain_mark.c:155
 msgid "Mark grains by threshold"
 msgstr ""
 
-#: modules/process/grain_mark.c:241
+#: modules/process/grain_mark.c:240
 msgid "Mark Grains by Threshold"
 msgstr ""
 
-#: modules/process/grain_mark.c:281
+#: modules/process/grain_mark.c:280
 msgid "Threshold by"
 msgstr ""
 
-#: modules/process/grain_mark.c:311
+#: modules/process/grain_mark.c:310
 msgid "_Slope:"
 msgstr ""
 
-#: modules/process/grain_mark.c:315
+#: modules/process/grain_mark.c:314
 msgid "_Curvature:"
 msgstr ""
 
-#: modules/process/grain_mark.c:324
-msgid "Criteria combination:"
-msgstr ""
-
-#: modules/process/grain_mark.c:328 modules/process/grain_wshed.c:256
+#: modules/process/grain_mark.c:319 modules/process/grain_wshed.c:260
 #: modules/process/wpour_mark.c:358
 msgid "_Invert height"
 msgstr ""
 
+#: modules/process/grain_mark.c:328
+msgid "Criteria combination:"
+msgstr ""
+
 #: modules/process/grain_stat.c:54
 msgid "Displays overall grain statistics."
 msgstr ""
@@ -10125,435 +10482,444 @@ msgstr ""
 msgid "Total projected boundary length:"
 msgstr ""
 
-#: modules/process/grain_wshed.c:101
+#: modules/process/grain_wshed.c:102
 msgid "Marks grains by watershed algorithm."
 msgstr ""
 
-#: modules/process/grain_wshed.c:115
+#: modules/process/grain_wshed.c:116
 msgid "/_Grains/Mark by _Watershed..."
 msgstr ""
 
-#: modules/process/grain_wshed.c:119
+#: modules/process/grain_wshed.c:120
 msgid "Mark grains by watershed"
 msgstr ""
 
-#: modules/process/grain_wshed.c:161
+#: modules/process/grain_wshed.c:162
 msgid "Mark Grains by Watershed"
 msgstr ""
 
-#: modules/process/grain_wshed.c:199
+#: modules/process/grain_wshed.c:200
 msgid "Grain Location"
 msgstr ""
 
-#: modules/process/grain_wshed.c:214
+#: modules/process/grain_wshed.c:216
 msgid "_Drop size:"
 msgstr ""
 
-#: modules/process/grain_wshed.c:230
+#: modules/process/grain_wshed.c:233
 msgid "Segmentation"
 msgstr ""
 
-#: modules/process/grain_wshed.c:236
+#: modules/process/grain_wshed.c:239
 msgid "Num_ber of steps:"
 msgstr ""
 
-#: modules/process/grain_wshed.c:244
+#: modules/process/grain_wshed.c:248
 msgid "Dr_op size:"
 msgstr ""
 
-#: modules/process/grain_wshed.c:435
+#: modules/process/grain_wshed.c:439
 msgid "Finding minima..."
 msgstr ""
 
-#: modules/process/grain_wshed.c:437
+#: modules/process/grain_wshed.c:441
 msgid "Locating..."
 msgstr ""
 
-#: modules/process/grain_wshed.c:439
+#: modules/process/grain_wshed.c:443
 msgid "Simulating watershed..."
 msgstr ""
 
-#: modules/process/grain_wshed.c:441
+#: modules/process/grain_wshed.c:445
 #, fuzzy
 msgid "Marking boundaries..."
 msgstr "마스킹 모드"
 
-#: modules/process/hough.c:74
+#: modules/process/hough.c:76
 msgid "Hough transform."
 msgstr ""
 
-#: modules/process/hough.c:88
+#: modules/process/hough.c:90
 msgid "/_Integral Transforms/_Hough..."
 msgstr ""
 
-#: modules/process/hough.c:92
+#: modules/process/hough.c:94
 msgid "Compute Hough transform"
 msgstr ""
 
-#: modules/process/hough.c:178
+#: modules/process/hough.c:137
+msgid "Hough line"
+msgstr ""
+
+#: modules/process/hough.c:141
+#, c-format
+msgid "Hough circle r=%d"
+msgstr ""
+
+#: modules/process/hough.c:173
 msgid "Hough Transform"
 msgstr ""
 
-#: modules/process/hough.c:201
+#: modules/process/hough.c:195
 msgid "_Transform type:"
 msgstr ""
 
-#: modules/process/hough.c:212
+#: modules/process/hough.c:203
 msgid "_Circle size:"
 msgstr ""
 
-#: modules/process/immerse.c:162
+#: modules/process/immerse.c:163
 msgid "Immerse high resolution detail into overall image."
 msgstr ""
 
-#: modules/process/immerse.c:176
+#: modules/process/immerse.c:177
 msgid "/M_ultidata/_Immerse Detail..."
 msgstr ""
 
-#: modules/process/immerse.c:180
+#: modules/process/immerse.c:181
 msgid "Immerse a detail into image"
 msgstr ""
 
-#: modules/process/immerse.c:222
+#: modules/process/immerse.c:223
 msgid "Immerse Detail"
 msgstr ""
 
-#: modules/process/immerse.c:225
+#: modules/process/immerse.c:226
 msgid "_Locate"
 msgstr ""
 
-#: modules/process/immerse.c:227
+#: modules/process/immerse.c:228
 msgid "Locate detail by full image correlation search"
 msgstr ""
 
-#: modules/process/immerse.c:229
+#: modules/process/immerse.c:230
 msgid "_Improve"
 msgstr ""
 
-#: modules/process/immerse.c:231
+#: modules/process/immerse.c:232
 msgid "Improve detail position by correlation search in neighborhood"
 msgstr ""
 
-#: modules/process/immerse.c:290
+#: modules/process/immerse.c:291
 msgid "_Detail image:"
 msgstr ""
 
-#: modules/process/immerse.c:295
+#: modules/process/immerse.c:296
 msgid "Position:"
 msgstr ""
 
-#: modules/process/immerse.c:308
+#: modules/process/immerse.c:314
 msgid "Result Sampling"
 msgstr ""
 
-#: modules/process/immerse.c:318
+#: modules/process/immerse.c:324
 msgid "_Upsample large image"
 msgstr ""
 
-#: modules/process/immerse.c:320
+#: modules/process/immerse.c:326
 msgid "_Downsample detail"
 msgstr ""
 
-#: modules/process/immerse.c:329
+#: modules/process/immerse.c:335
 msgid "Detail Leveling"
 msgstr ""
 
-#: modules/process/immerse.c:339
+#: modules/process/immerse.c:345
 msgid "levelling|_None"
 msgstr ""
 
-#: modules/process/immerse.c:341
+#: modules/process/immerse.c:347
 msgid "_Mean value"
 msgstr ""
 
-#: modules/process/immerse.c:349
+#: modules/process/immerse.c:355
 msgid "Show _frame"
 msgstr ""
 
-#: modules/process/immerse.c:787
+#: modules/process/immerse.c:793
 msgid "Immersed detail"
 msgstr ""
 
-#: modules/process/indent_analyze.c:261
+#: modules/process/indent_analyze.c:246
 msgid "Do nothing"
 msgstr ""
 
-#: modules/process/indent_analyze.c:262
+#: modules/process/indent_analyze.c:247
 msgid "Plane level"
 msgstr ""
 
-#: modules/process/indent_analyze.c:263
+#: modules/process/indent_analyze.c:248
 msgid "Plane rotate"
 msgstr ""
 
-#: modules/process/indent_analyze.c:267
+#: modules/process/indent_analyze.c:252
 msgid "New"
 msgstr ""
 
-#: modules/process/indent_analyze.c:268
+#: modules/process/indent_analyze.c:253
 msgid "AND"
 msgstr ""
 
-#: modules/process/indent_analyze.c:269
+#: modules/process/indent_analyze.c:254
 msgid "OR"
 msgstr ""
 
-#: modules/process/indent_analyze.c:270
+#: modules/process/indent_analyze.c:255
 msgid "NOT"
 msgstr ""
 
-#: modules/process/indent_analyze.c:271
+#: modules/process/indent_analyze.c:256
 msgid "XOR"
 msgstr ""
 
-#: modules/process/indent_analyze.c:275
+#: modules/process/indent_analyze.c:260
 msgid "Nothing"
 msgstr ""
 
-#: modules/process/indent_analyze.c:276
+#: modules/process/indent_analyze.c:261
 msgid "Above"
 msgstr ""
 
-#: modules/process/indent_analyze.c:277
+#: modules/process/indent_analyze.c:262
 msgid "Below"
 msgstr ""
 
-#: modules/process/indent_analyze.c:278
+#: modules/process/indent_analyze.c:263
 msgid "Plane"
 msgstr ""
 
-#: modules/process/indent_analyze.c:279
+#: modules/process/indent_analyze.c:264
 msgid "Impression"
 msgstr ""
 
-#: modules/process/indent_analyze.c:280
+#: modules/process/indent_analyze.c:265
 msgid "Inner Pile-up"
 msgstr ""
 
-#: modules/process/indent_analyze.c:281
+#: modules/process/indent_analyze.c:266
 msgid "Outer Pile-up"
 msgstr ""
 
-#: modules/process/indent_analyze.c:282
+#: modules/process/indent_analyze.c:267
 msgid "Special points"
 msgstr ""
 
-#: modules/process/indent_analyze.c:283
+#: modules/process/indent_analyze.c:268
 msgid "Faces border"
 msgstr ""
 
-#: modules/process/indent_analyze.c:287
+#: modules/process/indent_analyze.c:272
 msgid "Vickers"
 msgstr ""
 
-#: modules/process/indent_analyze.c:288
+#: modules/process/indent_analyze.c:273
 msgid "Berkovich"
 msgstr ""
 
-#: modules/process/indent_analyze.c:289
+#: modules/process/indent_analyze.c:274
 msgid "Berkovich (modified)"
 msgstr ""
 
-#: modules/process/indent_analyze.c:290
+#: modules/process/indent_analyze.c:275
 msgid "Knoop"
 msgstr ""
 
-#: modules/process/indent_analyze.c:291
+#: modules/process/indent_analyze.c:276
 msgid "Brinell"
 msgstr ""
 
-#: modules/process/indent_analyze.c:292
+#: modules/process/indent_analyze.c:277
 msgid "Cube corner"
 msgstr ""
 
-#: modules/process/indent_analyze.c:293
+#: modules/process/indent_analyze.c:278
 msgid "Rockwell"
 msgstr ""
 
-#: modules/process/indent_analyze.c:303
+#: modules/process/indent_analyze.c:288
 msgid "Analyses nanoindentation structure (volumes, surfaces, ...)."
 msgstr ""
 
-#: modules/process/indent_analyze.c:320
+#: modules/process/indent_analyze.c:302
 msgid "/_Tip and Indentation/_Analyze Imprint..."
 msgstr ""
 
-#: modules/process/indent_analyze.c:439
+#: modules/process/indent_analyze.c:410
 msgid "Marked _areas:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:445
+#: modules/process/indent_analyze.c:419
 msgid "_Indentor type:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:451
+#: modules/process/indent_analyze.c:428
 msgid "_Mask creation type:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:456
+#: modules/process/indent_analyze.c:434
 msgid "Ref. plane _tolerance:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:460
+#: modules/process/indent_analyze.c:438
 msgid "Angle _1 tolerance:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:485
+#: modules/process/indent_analyze.c:456
 #, fuzzy
 msgid "Indent center at"
 msgstr "K-평균 중심 %d"
 
-#: modules/process/indent_analyze.c:488
+#: modules/process/indent_analyze.c:460
 msgid "Maximum at"
 msgstr ""
 
-#: modules/process/indent_analyze.c:491
+#: modules/process/indent_analyze.c:464
 msgid "Max-min difference"
 msgstr ""
 
-#: modules/process/indent_analyze.c:497
+#: modules/process/indent_analyze.c:472
 msgid "Expected A<sub>d</sub>:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:505
+#: modules/process/indent_analyze.c:479
 msgid "Expected A<sub>p</sub>:"
 msgstr ""
 
-#: modules/process/indent_analyze.c:549
+#: modules/process/indent_analyze.c:489
 msgid "Volume above-below"
 msgstr ""
 
-#: modules/process/indent_analyze.c:558
+#: modules/process/indent_analyze.c:494
 msgid "Indent. volume"
 msgstr ""
 
-#: modules/process/indent_analyze.c:564
+#: modules/process/indent_analyze.c:502
 msgid "Indent. A<sub>d</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:573
+#: modules/process/indent_analyze.c:509
 msgid "Indent. A<sub>p</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:587
+#: modules/process/indent_analyze.c:517
 msgid "Inner Pile-Up A<sub>d</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:596
+#: modules/process/indent_analyze.c:525
 msgid "Inner Pile-Up A<sub>p</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:605
+#: modules/process/indent_analyze.c:533
 msgid "Outer Pile-Up A<sub>d</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:614
+#: modules/process/indent_analyze.c:541
 msgid "Outer Pile-Up A<sub>p</sub>"
 msgstr ""
 
-#: modules/process/indent_analyze.c:644
+#: modules/process/indent_analyze.c:569
 msgid "Indentation statistics"
 msgstr ""
 
-#: modules/process/indent_analyze.c:645
+#: modules/process/indent_analyze.c:570
 msgid "_Compute & mark"
 msgstr ""
 
-#: modules/process/indent_analyze.c:646
+#: modules/process/indent_analyze.c:571
 msgid "_Save statistics"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1569
+#: modules/process/indent_analyze.c:1392
 msgid "No statistics has been computed yet."
 msgstr ""
 
-#: modules/process/indent_analyze.c:1577
+#: modules/process/indent_analyze.c:1400
 msgid "Save Indentation Statistics"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1615
+#: modules/process/indent_analyze.c:1438
 #, c-format
 msgid "Indentor:  %s\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1619
+#: modules/process/indent_analyze.c:1442
 #, c-format
 msgid "Length units: %s\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1621
+#: modules/process/indent_analyze.c:1444
 #, c-format
 msgid "Indentation center at [%d, %d] px:      %lf\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1623
+#: modules/process/indent_analyze.c:1446
 #, c-format
 msgid "Maximum at [%d, %d] is:                 %lf\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1625
+#: modules/process/indent_analyze.c:1448
 #, c-format
 msgid "Difference max-min:                     %lf\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1630
+#: modules/process/indent_analyze.c:1453
 #, c-format
 msgid "Area (projected) above plane:             %g (%.1lf %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1634
+#: modules/process/indent_analyze.c:1457
 #, c-format
 msgid "Area (projected) below plane:             %g (%.1lf %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1638
+#: modules/process/indent_analyze.c:1461
 #, c-format
 msgid "Area (projected) of    plane:             %g (%.1lf %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1643
+#: modules/process/indent_analyze.c:1466
 #, c-format
 msgid "Area (developed) above %g (+%.1f %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1646
+#: modules/process/indent_analyze.c:1469
 #, c-format
 msgid "Area (developed) below %g (+%.1lf %%)\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1650
+#: modules/process/indent_analyze.c:1473
 #, c-format
 msgid "Volume above:     %g\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1652
+#: modules/process/indent_analyze.c:1475
 #, c-format
 msgid "Volume below:     %g\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1654
+#: modules/process/indent_analyze.c:1477
 #, c-format
 msgid "Volume difference %g\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1658
+#: modules/process/indent_analyze.c:1481
 msgid ""
 "\n"
 "Indentation\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1659
+#: modules/process/indent_analyze.c:1482
 #, c-format
 msgid "Volume      %g\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1664
+#: modules/process/indent_analyze.c:1487
 msgid ""
 "\n"
 "Indentation - Inner Pile-Up\n"
 msgstr ""
 
-#: modules/process/indent_analyze.c:1670
+#: modules/process/indent_analyze.c:1493
 msgid "Indentation - Outer Pile-Up\n"
 msgstr ""
 
@@ -10663,11 +11029,6 @@ msgstr "변수"
 msgid "_Lattice:"
 msgstr ""
 
-#: modules/process/lat_synth.c:651 modules/process/obj_synth.c:544
-#: modules/process/pat_synth.c:1457
-msgid "_Size:"
-msgstr ""
-
 #: modules/process/lat_synth.c:662
 msgid "Lattice rela_xation:"
 msgstr ""
@@ -10801,7 +11162,7 @@ msgstr ""
 
 #: modules/process/level_grains.c:187 modules/process/median-bg.c:167
 #: modules/process/polylevel.c:293 modules/process/polylevel.c:417
-#: modules/process/sphere-revolve.c:200
+#: modules/process/sphere-revolve.c:221 modules/process/sphere-revolve.c:295
 msgid "Background"
 msgstr ""
 
@@ -10813,158 +11174,159 @@ msgstr ""
 msgid "Quantity to level:"
 msgstr ""
 
-#: modules/process/level_grains.c:231 modules/process/linematch.c:866
-#: modules/process/median-bg.c:217 modules/process/polylevel.c:482
-#: modules/process/sphere-revolve.c:263
+#: modules/process/level_grains.c:231 modules/process/linematch.c:834
+#: modules/process/median-bg.c:217 modules/process/polylevel.c:485
+#: modules/process/sphere-revolve.c:371
 msgid "E_xtract background"
 msgstr ""
 
-#: modules/process/linecorrect.c:54
+#: modules/process/linecorrect.c:52
 msgid "Corrects line defects (mostly experimental algorithms)."
 msgstr ""
 
-#: modules/process/linecorrect.c:68
+#: modules/process/linecorrect.c:66
 msgid "/_Correct Data/Ste_p Line Correction"
 msgstr ""
 
-#: modules/process/linecorrect.c:72
+#: modules/process/linecorrect.c:70
 msgid "Correct steps in lines"
 msgstr ""
 
-#: modules/process/linematch.c:158 modules/tools/linestats.c:166
+#: modules/process/linematch.c:155 modules/tools/linestats.c:166
 #: modules/volume/volume_linestat.c:143
 msgid "Median"
 msgstr ""
 
-#: modules/process/linematch.c:159
+#: modules/process/linematch.c:156
 #, fuzzy
 msgid "Median of differences"
 msgstr "이미지 차이점(G)"
 
-#: modules/process/linematch.c:160
+#: modules/process/linematch.c:157
 #, fuzzy
 msgid "Modus"
 msgstr "모듈"
 
-#: modules/process/linematch.c:161
+#: modules/process/linematch.c:158
 msgid "linematch|Matching"
 msgstr ""
 
-#: modules/process/linematch.c:162
+#: modules/process/linematch.c:159
 msgid "linematch|Polynomial"
 msgstr ""
 
-#: modules/process/linematch.c:168
+#: modules/process/linematch.c:165
 msgid "Aligns rows by various methods."
 msgstr ""
 
-#: modules/process/linematch.c:182
+#: modules/process/linematch.c:179
 #, fuzzy
 msgid "/_Correct Data/_Align rows..."
 msgstr "/데이터 교정(C)/Correlation averaging(C)..."
 
-#: modules/process/linematch.c:186
+#: modules/process/linematch.c:183
 msgid "Align rows using various methods"
 msgstr ""
 
-#: modules/process/linematch.c:237 modules/process/linematch.c:265
+#: modules/process/linematch.c:234 modules/process/linematch.c:262
 #, fuzzy
 msgid "Row background"
 msgstr "다항식 배경값 제거하기"
 
-#: modules/process/linematch.c:266
+#: modules/process/linematch.c:263
 #, fuzzy
 msgid "Vertical position"
 msgstr "수직 방향(V)"
 
-#: modules/process/linematch.c:267
+#: modules/process/linematch.c:264
 msgid "Corrected offset"
 msgstr ""
 
-#: modules/process/linematch.c:802
+#: modules/process/linematch.c:769
 #, fuzzy
 msgid "Align Rows"
 msgstr "그래프 곡선의 높이 레벨 맞추기"
 
-#: modules/process/linematch.c:844
+#: modules/process/linematch.c:810
 #, fuzzy
 msgid "_Polynomial degree:"
 msgstr "다항식 (0차)"
 
-#: modules/process/linematch.c:876
+#: modules/process/linematch.c:844
 #, fuzzy
 msgid "Plot background _graph"
 msgstr "그래프 그리기(G)"
 
-#: modules/process/lno_synth.c:261 modules/process/noise_synth.c:188
+#: modules/process/lno_synth.c:259 modules/process/noise_synth.c:186
 msgid "distribution|Triangular"
 msgstr ""
 
-#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:213
+#: modules/process/lno_synth.c:265 modules/process/pat_synth.c:213
 msgid "Steps"
 msgstr ""
 
-#: modules/process/lno_synth.c:268
+#: modules/process/lno_synth.c:266
 msgid "Scars"
 msgstr ""
 
-#: modules/process/lno_synth.c:269 modules/process/pat_synth.c:214
+#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:214
 msgid "Ridges"
 msgstr ""
 
-#: modules/process/lno_synth.c:275
+#: modules/process/lno_synth.c:273
 msgid "Generates various kinds of line noise."
 msgstr ""
 
-#: modules/process/lno_synth.c:289
+#: modules/process/lno_synth.c:287
 msgid "/S_ynthetic/_Line Noise..."
 msgstr ""
 
-#: modules/process/lno_synth.c:293
+#: modules/process/lno_synth.c:291
 msgid "Generate line noise"
 msgstr ""
 
-#: modules/process/lno_synth.c:431
+#: modules/process/lno_synth.c:429
 msgid "Line Noise"
 msgstr ""
 
-#: modules/process/lno_synth.c:504
+#: modules/process/lno_synth.c:502
 msgid "Distribution"
 msgstr ""
 
-#: modules/process/lno_synth.c:514 modules/process/noise_synth.c:414
-msgid "Direction:"
-msgstr ""
+#: modules/process/lno_synth.c:512 modules/process/mask_noisify.c:158
+#: modules/process/noise_synth.c:412
+#, fuzzy
+msgid "Noise type:"
+msgstr "선 종류(L):"
 
-#: modules/process/lno_synth.c:523 modules/process/noise_synth.c:423
+#: modules/process/lno_synth.c:521 modules/process/mask_noisify.c:167
+#: modules/process/noise_synth.c:421
 msgid "S_ymmetrical"
 msgstr ""
 
-#: modules/process/lno_synth.c:524 modules/process/noise_synth.c:424
+#: modules/process/lno_synth.c:522 modules/process/mask_noisify.c:168
+#: modules/process/noise_synth.c:422
 msgid "One-sided _positive"
 msgstr ""
 
-#: modules/process/lno_synth.c:525 modules/process/noise_synth.c:425
+#: modules/process/lno_synth.c:523 modules/process/mask_noisify.c:169
+#: modules/process/noise_synth.c:423
 msgid "One-sided _negative"
 msgstr ""
 
-#: modules/process/lno_synth.c:546
+#: modules/process/lno_synth.c:544
 msgid "Noise Type"
 msgstr ""
 
-#: modules/process/lno_synth.c:551
+#: modules/process/lno_synth.c:549
 msgid "_Noise type:"
 msgstr ""
 
-#: modules/process/lno_synth.c:853 modules/process/lno_synth.c:1222
-msgid "Densi_ty:"
-msgstr ""
-
-#: modules/process/lno_synth.c:864 modules/process/lno_synth.c:1233
+#: modules/process/lno_synth.c:863 modules/process/lno_synth.c:1233
 msgid "_Within line:"
 msgstr ""
 
-#: modules/process/lno_synth.c:871
+#: modules/process/lno_synth.c:870
 msgid "C_umulative"
 msgstr ""
 
@@ -11021,36 +11383,36 @@ msgstr ""
 msgid "_Train logistic regression"
 msgstr ""
 
-#: modules/process/logistic.c:275
+#: modules/process/logistic.c:274
 #, fuzzy
 msgid "_Gaussian blur"
 msgstr "가우시안 타입"
 
-#: modules/process/logistic.c:288
+#: modules/process/logistic.c:285
 #, fuzzy
 msgid "_Number of Gaussians:"
 msgstr "클러스터 개수"
 
-#: modules/process/logistic.c:296
+#: modules/process/logistic.c:293
 #, fuzzy
 msgid "_Sobel derivatives"
 msgstr "높이 분포"
 
-#: modules/process/logistic.c:307
+#: modules/process/logistic.c:303
 msgid "_Laplacian"
 msgstr ""
 
-#: modules/process/logistic.c:318
+#: modules/process/logistic.c:313
 #, fuzzy
 msgid "_Hessian"
 msgstr "가우시안 타입"
 
-#: modules/process/logistic.c:331
+#: modules/process/logistic.c:325
 #, fuzzy
 msgid "_Regularization parameter:"
 msgstr "변수"
 
-#: modules/process/logistic.c:623 modules/process/neural.c:1101
+#: modules/process/logistic.c:616 modules/process/neural.c:1108
 msgid "Training..."
 msgstr ""
 
@@ -11067,13 +11429,13 @@ msgstr "/데이터 교정(C)/드리프트 보정(D)..."
 msgid "Mark data disconnected from other values"
 msgstr ""
 
-#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:422
-#: modules/process/scars.c:279
+#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:419
+#: modules/process/scars.c:297
 msgid "Positive"
 msgstr "양성의"
 
-#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:423
-#: modules/process/scars.c:280
+#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:420
+#: modules/process/scars.c:298
 msgid "Negative"
 msgstr "음성의"
 
@@ -11091,12 +11453,12 @@ msgstr "선 종류(L):"
 msgid "Defect _radius:"
 msgstr "곡률 반경 1"
 
-#: modules/process/mark_disconn.c:563
+#: modules/process/mark_disconn.c:552
 #, fuzzy
 msgid "Filtering..."
 msgstr "FFT 필터링"
 
-#: modules/process/mark_disconn.c:590
+#: modules/process/mark_disconn.c:579
 #, fuzzy
 msgid "Marking outliers..."
 msgstr "마스킹 모드"
@@ -11113,55 +11475,59 @@ msgstr ""
 msgid "Mask combining and modification"
 msgstr ""
 
-#: modules/process/mark_with.c:192
+#: modules/process/mark_with.c:193
 msgid "Mark With"
 msgstr ""
 
-#: modules/process/mark_with.c:238
-msgid "Se_t mask"
+#: modules/process/mark_with.c:231 modules/process/mask_morph.c:209
+msgid "Operation:"
 msgstr ""
 
 #: modules/process/mark_with.c:239
-msgid "_Add mask"
+msgid "Se_t mask"
 msgstr ""
 
 #: modules/process/mark_with.c:240
-msgid "_Subtract mask"
+msgid "_Add mask"
 msgstr ""
 
 #: modules/process/mark_with.c:241
+msgid "_Subtract mask"
+msgstr ""
+
+#: modules/process/mark_with.c:242
 msgid "_Intersect masks"
 msgstr ""
 
-#: modules/process/mark_with.c:247
+#: modules/process/mark_with.c:248
 msgid "Mark with:"
 msgstr ""
 
-#: modules/process/mark_with.c:255
+#: modules/process/mark_with.c:256
 msgid "with|_Mask"
 msgstr ""
 
-#: modules/process/mark_with.c:257
+#: modules/process/mark_with.c:258
 msgid "with|_Data"
 msgstr ""
 
-#: modules/process/mark_with.c:259
+#: modules/process/mark_with.c:260
 msgid "with|_Presentation"
 msgstr ""
 
-#: modules/process/mark_with.c:293
+#: modules/process/mark_with.c:297
 msgid "Marked data range:"
 msgstr ""
 
-#: modules/process/mark_with.c:301
+#: modules/process/mark_with.c:305
 msgid "_Minimum:"
 msgstr ""
 
-#: modules/process/mark_with.c:310
+#: modules/process/mark_with.c:314
 msgid "M_aximum:"
 msgstr ""
 
-#: modules/process/mark_with.c:378
+#: modules/process/mark_with.c:382
 msgid "Operand"
 msgstr ""
 
@@ -11200,114 +11566,114 @@ msgstr ""
 msgid "Preserve existing masks"
 msgstr ""
 
-#: modules/process/mask_edt.c:95
+#: modules/process/mask_edt.c:89
 msgid "Performs simple and true Euclidean distance transforms of masks."
 msgstr ""
 
-#: modules/process/mask_edt.c:109
+#: modules/process/mask_edt.c:103
 msgid "/_Mask/Distanc_e Transform..."
 msgstr ""
 
-#: modules/process/mask_edt.c:113
+#: modules/process/mask_edt.c:107
 msgid "Distance transform of mask"
 msgstr ""
 
-#: modules/process/mask_edt.c:116
+#: modules/process/mask_edt.c:110
 msgid "/_Mask/Thi_n"
 msgstr ""
 
-#: modules/process/mask_edt.c:120
+#: modules/process/mask_edt.c:114
 #, fuzzy
 msgid "Thin mask"
 msgstr "마스크 보기(S)"
 
-#: modules/process/mask_edt.c:330 modules/process/mask_edt.c:352
+#: modules/process/mask_edt.c:164 modules/process/mask_edt.c:186
 msgid "Distance Transform"
 msgstr ""
 
-#: modules/process/mask_edt.c:340
+#: modules/process/mask_edt.c:174
 msgid "Interior"
 msgstr ""
 
-#: modules/process/mask_edt.c:341
+#: modules/process/mask_edt.c:175
 msgid "Exterior"
 msgstr ""
 
-#: modules/process/mask_edt.c:342
+#: modules/process/mask_edt.c:176
 msgid "Two-sided"
 msgstr ""
 
-#: modules/process/mask_edt.c:373 modules/tools/maskedit.c:634
+#: modules/process/mask_edt.c:207 modules/tools/maskedit.c:640
 #, fuzzy
 msgid "_Distance type:"
 msgstr "선 종류(L):"
 
-#: modules/process/mask_edt.c:394 modules/tools/maskedit.c:640
+#: modules/process/mask_edt.c:228 modules/tools/maskedit.c:646
 msgid "Shrink from _border"
 msgstr ""
 
-#: modules/process/mask_morph.c:117
+#: modules/process/mask_morph.c:116
 msgid "Performs basic morphological operations with masks."
 msgstr ""
 
-#: modules/process/mask_morph.c:131
+#: modules/process/mask_morph.c:130
 #, fuzzy
-msgid "/_Mask/Morphological Operation..."
+msgid "/_Mask/Morpho_logical Operation..."
 msgstr "/기본 기능(B)/기울이기(T)..."
 
-#: modules/process/mask_morph.c:135
+#: modules/process/mask_morph.c:134
 msgid "Morphological operation with mask"
 msgstr ""
 
-#: modules/process/mask_morph.c:169
+#: modules/process/mask_morph.c:168
 #, fuzzy
 msgid "Erosion"
 msgstr "버전"
 
-#: modules/process/mask_morph.c:170
+#: modules/process/mask_morph.c:169
 #, fuzzy
 msgid "Dilation"
 msgstr "설명"
 
-#: modules/process/mask_morph.c:171 modules/tools/filter.c:242
+#: modules/process/mask_morph.c:170 modules/tools/filter.c:243
 #, fuzzy
 msgid "filter|Opening"
 msgstr "FFT 필터링"
 
-#: modules/process/mask_morph.c:172 modules/tools/filter.c:243
+#: modules/process/mask_morph.c:171 modules/tools/filter.c:244
 #, fuzzy
 msgid "filter|Closing"
 msgstr "FFT 필터링"
 
-#: modules/process/mask_morph.c:173 modules/tools/filter.c:244
+#: modules/process/mask_morph.c:172 modules/tools/filter.c:245
 msgid "ASF Opening"
 msgstr ""
 
-#: modules/process/mask_morph.c:174 modules/tools/filter.c:245
+#: modules/process/mask_morph.c:173 modules/tools/filter.c:246
 msgid "ASF Closing"
 msgstr ""
 
-#: modules/process/mask_morph.c:178
+#: modules/process/mask_morph.c:177
 msgid "Octagon"
 msgstr ""
 
-#: modules/process/mask_morph.c:181
+#: modules/process/mask_morph.c:180
 msgid "Another mask"
 msgstr ""
 
-#: modules/process/mask_morph.c:192
+#: modules/process/mask_morph.c:191
 msgid "Morphological Operation"
 msgstr ""
 
-#: modules/process/mask_morph.c:224
+#: modules/process/mask_morph.c:223
 msgid "Structuring element:"
 msgstr ""
 
-#: modules/process/mask_morph.c:238 modules/tools/maskedit.c:524
+#: modules/process/mask_morph.c:237 modules/tools/maskedit.c:528
 msgid "_Radius:"
 msgstr ""
 
-#: modules/process/mask_morph.c:249
+#: modules/process/mask_morph.c:248
 #, fuzzy
 msgid "_Mask:"
 msgstr "마스크(M)"
@@ -11316,39 +11682,62 @@ msgstr "마스크(M)"
 msgid "_Trim empty borders"
 msgstr ""
 
-#: modules/process/maskcor.c:86
+#: modules/process/mask_noisify.c:83
+msgid "Adds salt and/or pepper noise to mask."
+msgstr ""
+
+#: modules/process/mask_noisify.c:97
+#, fuzzy
+msgid "/_Mask/_Noisify..."
+msgstr "/통계(S)/각도 분포(G)..."
+
+#: modules/process/mask_noisify.c:101
+#, fuzzy
+msgid "Add noise to mask"
+msgstr "FFT 마스크에 ellipse추가 "
+
+#: modules/process/mask_noisify.c:141
+msgid "Noisify Mask"
+msgstr ""
+
+#: modules/process/mask_noisify.c:184
+#, fuzzy
+msgid "_Alter only boundaries"
+msgstr "마스킹 모드"
+
+#: modules/process/maskcor.c:87
 msgid "Creates mask by correlation with another data."
 msgstr ""
 
-#: modules/process/maskcor.c:100
+#: modules/process/maskcor.c:101
 msgid "/M_ultidata/_Mask by Correlation..."
 msgstr ""
 
-#: modules/process/maskcor.c:104
+#: modules/process/maskcor.c:105
 msgid "Create mask by correlation with another data"
 msgstr ""
 
-#: modules/process/maskcor.c:141
+#: modules/process/maskcor.c:142
 msgid "Mask by Correlation"
 msgstr ""
 
-#: modules/process/maskcor.c:165
+#: modules/process/maskcor.c:166
 msgid "Correlation _kernel:"
 msgstr ""
 
-#: modules/process/maskcor.c:172
+#: modules/process/maskcor.c:173
 msgid "Objects marked"
 msgstr ""
 
-#: modules/process/maskcor.c:173
+#: modules/process/maskcor.c:174
 msgid "Correlation maxima"
 msgstr ""
 
-#: modules/process/maskcor.c:174 modules/process/maskcor.c:356
+#: modules/process/maskcor.c:175 modules/process/maskcor.c:360
 msgid "Correlation score"
 msgstr ""
 
-#: modules/process/maskcor.c:183
+#: modules/process/maskcor.c:185
 msgid "Correlation _method:"
 msgstr ""
 
@@ -11377,8 +11766,9 @@ msgid "/_Mask/_Extract Mask"
 msgstr ""
 
 #: modules/process/maskops.c:78
-msgid "Extract mask to a new channel"
-msgstr ""
+#, fuzzy
+msgid "Extract mask to a new image"
+msgstr "새 파일로 확장"
 
 #: modules/process/maskops.c:81
 msgid "/_Grains/_Remove Edge-Touching"
@@ -11404,38 +11794,34 @@ msgstr ""
 msgid "Mutual Crop"
 msgstr ""
 
-#: modules/process/mcrop.c:174
+#: modules/process/mcrop.c:173
 msgid "_Select second argument:"
 msgstr ""
 
-#: modules/process/measure_lattice.c:174
+#: modules/process/measure_lattice.c:165
 msgid "Measures parameters of two-dimensional lattices."
 msgstr ""
 
-#: modules/process/measure_lattice.c:188
+#: modules/process/measure_lattice.c:179
 #, fuzzy
 msgid "/_Statistics/Measure _Lattice..."
 msgstr "/통계(S)/각도 분포(G)..."
 
-#: modules/process/measure_lattice.c:192
+#: modules/process/measure_lattice.c:183
 #, fuzzy
 msgid "Measure lattice"
 msgstr "거리 측정"
 
-#: modules/process/measure_lattice.c:253
+#: modules/process/measure_lattice.c:243
 #, fuzzy
 msgid "Measure Lattice"
 msgstr "거리 측정"
 
-#: modules/process/measure_lattice.c:259
-msgid "_Refine"
-msgstr ""
-
-#: modules/process/measure_lattice.c:330
+#: modules/process/measure_lattice.c:320
 msgid "_ACF"
 msgstr ""
 
-#: modules/process/measure_lattice.c:331
+#: modules/process/measure_lattice.c:321
 #, fuzzy
 msgid "_PSDF"
 msgstr "PSDF"
@@ -11453,32 +11839,32 @@ msgstr ""
 msgid "_Vectors"
 msgstr ""
 
-#: modules/process/measure_lattice.c:596
+#: modules/process/measure_lattice.c:589
 #, fuzzy
 msgid "Save Lattice Parameters"
 msgstr "변수"
 
-#: modules/process/measure_lattice.c:634
+#: modules/process/measure_lattice.c:627
 #, fuzzy, c-format
 msgid "Vector %d:"
 msgstr "X 에러 %d"
 
-#: modules/process/measure_lattice.c:643
+#: modules/process/measure_lattice.c:636
 #, fuzzy, c-format
 msgid "Length %d:"
 msgstr "길이"
 
-#: modules/process/measure_lattice.c:650
+#: modules/process/measure_lattice.c:643
 #, fuzzy, c-format
 msgid "Angle %d:"
 msgstr "각ㄱ도"
 
-#: modules/process/measure_lattice.c:665
+#: modules/process/measure_lattice.c:657
 #, fuzzy
 msgid "Angle:"
 msgstr "각ㄱ도"
 
-#: modules/process/measure_lattice.c:681
+#: modules/process/measure_lattice.c:673
 #, fuzzy
 msgid "Lattice Parameters"
 msgstr "변수"
@@ -11504,11 +11890,11 @@ msgstr "다항식 계수"
 msgid "Median Level"
 msgstr ""
 
-#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:237
+#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:336
 msgid "Real _radius:"
 msgstr ""
 
-#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:247
+#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:346
 msgid "_Pixel radius:"
 msgstr ""
 
@@ -11548,7 +11934,7 @@ msgstr ""
 msgid "Second operand"
 msgstr ""
 
-#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:643
+#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:612
 #, fuzzy
 msgid "Average"
 msgstr "평균:"
@@ -11602,6 +11988,235 @@ msgstr ""
 msgid "Merged images"
 msgstr ""
 
+#: modules/process/mfm_current.c:163
+msgid "Simulation of current line magnetic field"
+msgstr ""
+
+#: modules/process/mfm_current.c:177
+msgid "/SPM M_odes/_MFM/_Current Line Field..."
+msgstr ""
+
+#: modules/process/mfm_current.c:181
+msgid "Simulate stray field above current line"
+msgstr ""
+
+#: modules/process/mfm_current.c:280 modules/process/mfm_parallel.c:282
+msgid "Simulated field"
+msgstr ""
+
+#: modules/process/mfm_current.c:322 modules/process/mfm_field.c:266
+#: modules/process/mfm_parallel.c:324
+#, fuzzy
+msgid "Point charge"
+msgstr "임의의 점"
+
+#: modules/process/mfm_current.c:323 modules/process/mfm_field.c:267
+#: modules/process/mfm_parallel.c:325
+msgid "Bar"
+msgstr ""
+
+#: modules/process/mfm_current.c:330
+msgid "Current Line Stray Field"
+msgstr ""
+
+#: modules/process/mfm_current.c:415
+#, fuzzy
+msgid "Output"
+msgstr "출력 종류"
+
+#: modules/process/mfm_current.c:420 modules/process/mfm_field.c:320
+#: modules/process/mfm_parallel.c:415
+msgid "_Output plane height:"
+msgstr ""
+
+#: modules/process/mfm_current.c:428
+#, fuzzy
+msgid "_Stripe width:"
+msgstr "새 너비(W):"
+
+#: modules/process/mfm_current.c:436
+msgid "Stripe _current:"
+msgstr ""
+
+#: modules/process/mfm_current.c:444
+#, fuzzy
+msgid "_Position:"
+msgstr "위치"
+
+#: modules/process/mfm_current.c:461
+msgid "Probe"
+msgstr ""
+
+#: modules/process/mfm_current.c:469
+#, fuzzy
+msgid "P_robe type:"
+msgstr "선 종류(L):"
+
+#: modules/process/mfm_current.c:475 modules/process/mfm_field.c:389
+#: modules/process/mfm_parallel.c:482
+msgid "Tip _magnetization:"
+msgstr ""
+
+#: modules/process/mfm_current.c:484 modules/process/mfm_field.c:397
+#: modules/process/mfm_parallel.c:491
+#, fuzzy
+msgid "Bar width _x:"
+msgstr "새 너비(W):"
+
+#: modules/process/mfm_current.c:493 modules/process/mfm_field.c:405
+#: modules/process/mfm_parallel.c:500
+#, fuzzy
+msgid "Bar width _y:"
+msgstr "새 너비(W):"
+
+#: modules/process/mfm_current.c:502 modules/process/mfm_field.c:413
+#: modules/process/mfm_parallel.c:509
+msgid "Bar length (_z):"
+msgstr ""
+
+#: modules/process/mfm_field.c:146
+msgid "Simulation of magnetic field above perpendicular media"
+msgstr ""
+
+#: modules/process/mfm_field.c:160
+msgid "/SPM M_odes/_MFM/_Perpendicular Media Field..."
+msgstr ""
+
+#: modules/process/mfm_field.c:164
+msgid "Compute stray field above perpendicular magnetic medium"
+msgstr ""
+
+#: modules/process/mfm_field.c:276
+msgid "Perpendicular Media Stray Field"
+msgstr ""
+
+#: modules/process/mfm_field.c:328 modules/process/mfm_parallel.c:423
+#, fuzzy
+msgid "_Film thickness:"
+msgstr "외곽선 두께:"
+
+#: modules/process/mfm_field.c:336
+msgid "_Magnetic charge:"
+msgstr ""
+
+#: modules/process/mfm_field.c:344
+msgid "Include domain _walls"
+msgstr ""
+
+#: modules/process/mfm_field.c:354
+msgid "_Exchange constant:"
+msgstr ""
+
+#: modules/process/mfm_field.c:362
+msgid "_Uniaxial anisotropy:"
+msgstr ""
+
+#: modules/process/mfm_field.c:383 modules/process/mfm_parallel.c:476
+#, fuzzy
+msgid "_Probe type:"
+msgstr "선 종류(L):"
+
+#: modules/process/mfm_findshift.c:88
+msgid "Lift height difference estimation from data blur"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:102
+msgid "/SPM M_odes/_MFM/_Estimate Shift in Z..."
+msgstr ""
+
+#: modules/process/mfm_findshift.c:106
+msgid "Estimate lift height difference in MFM data"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:166 modules/process/psf.c:340
+#, fuzzy
+msgid "Searching..."
+msgstr "FFT 필터링"
+
+#: modules/process/mfm_findshift.c:196
+#, fuzzy
+msgid "Estimated shift:"
+msgstr "추정된 팁"
+
+#: modules/process/mfm_findshift.c:211
+#, fuzzy
+msgid "Shifted field difference"
+msgstr "이미지 차이점(G)"
+
+#: modules/process/mfm_findshift.c:228
+msgid "Estimate Lift Height Shift"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:255
+msgid "Data to compare:"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:261
+#, fuzzy
+msgid "Search _from:"
+msgstr "변수"
+
+#: modules/process/mfm_findshift.c:269
+msgid "Search _to:"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:165
+msgid "Simulation of parallel magnetic media"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:179
+msgid "/SPM M_odes/_MFM/Para_llel Media Field..."
+msgstr ""
+
+#: modules/process/mfm_parallel.c:183
+msgid "Simulate stray field above parallel magnetic medium"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:331
+msgid "Parallel Media Stray Field"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:431
+msgid "_Remanent magnetization:"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:439
+msgid "Size _A (dir. left):"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:447
+msgid "Size _B (dir. right):"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:455
+#, fuzzy
+msgid "_Gap size:"
+msgstr "점 크기(P):"
+
+#: modules/process/mfm_shift.c:87
+msgid "Simulation of magnetic field z component change for another level"
+msgstr ""
+
+#: modules/process/mfm_shift.c:101
+msgid "/SPM M_odes/_MFM/_Field Shift in Z..."
+msgstr ""
+
+#: modules/process/mfm_shift.c:105
+msgid "Compute stray field shift for another z level"
+msgstr ""
+
+#: modules/process/mfm_shift.c:146
+msgid "Shifted field"
+msgstr ""
+
+#: modules/process/mfm_shift.c:164
+msgid "Stray Field Plane Shift"
+msgstr ""
+
+#: modules/process/mfm_shift.c:209
+msgid "_Z shift by:"
+msgstr ""
+
 #: modules/process/nanoindent_adjust.c:89
 msgid "Adjust images of two indentor prints."
 msgstr ""
@@ -11638,12 +12253,12 @@ msgstr ""
 msgid "E_xtrapolate result data out of measured range"
 msgstr ""
 
-#: modules/process/nanoindent_adjust.c:295
+#: modules/process/nanoindent_adjust.c:296
 msgid ""
 "Tip has different range/resolution ratio than image. Tip will be resampled."
 msgstr ""
 
-#: modules/process/nanoindent_adjust.c:334
+#: modules/process/nanoindent_adjust.c:335
 msgid "Immersed detail data"
 msgstr ""
 
@@ -11684,246 +12299,234 @@ msgstr ""
 msgid "error"
 msgstr ""
 
-#: modules/process/neural.c:503
+#: modules/process/neural.c:504
 msgid "NN training error"
 msgstr ""
 
-#: modules/process/neural.c:516
+#: modules/process/neural.c:517
 msgid "Training"
 msgstr ""
 
-#: modules/process/neural.c:520
+#: modules/process/neural.c:521
 msgid "_Model:"
 msgstr ""
 
-#: modules/process/neural.c:530
+#: modules/process/neural.c:532
 msgid "_Signal:"
 msgstr ""
 
-#: modules/process/neural.c:541
+#: modules/process/neural.c:544
 msgid "Training ste_ps:"
 msgstr ""
 
-#: modules/process/neural.c:557
+#: modules/process/neural.c:561
 msgid "Model"
 msgstr ""
 
-#: modules/process/neural.c:558
+#: modules/process/neural.c:562
 msgid "Signal"
 msgstr ""
 
-#: modules/process/neural.c:575
+#: modules/process/neural.c:579
 msgid "verb|_Train"
 msgstr ""
 
-#: modules/process/neural.c:580
+#: modules/process/neural.c:584
 msgid "Re_initialize"
 msgstr ""
 
-#: modules/process/neural.c:613
+#: modules/process/neural.c:617
 msgid "Network"
 msgstr ""
 
-#: modules/process/neural.c:619
+#: modules/process/neural.c:623
 msgid "Window _width:"
 msgstr ""
 
-#: modules/process/neural.c:627
+#: modules/process/neural.c:631
 msgid "Window h_eight:"
 msgstr ""
 
-#: modules/process/neural.c:635
+#: modules/process/neural.c:639
 msgid "_Hidden nodes:"
 msgstr ""
 
-#: modules/process/neural.c:643
+#: modules/process/neural.c:647
 msgid "Result Units"
 msgstr ""
 
-#: modules/process/neural.c:650
+#: modules/process/neural.c:654
 msgid "Power of source _XY:"
 msgstr ""
 
-#: modules/process/neural.c:658
+#: modules/process/neural.c:663
 msgid "Power of source _Z:"
 msgstr ""
 
-#: modules/process/neural.c:666
+#: modules/process/neural.c:672
 msgid "_Fixed units:"
 msgstr ""
 
-#: modules/process/neural.c:676
+#: modules/process/neural.c:683
 msgid "Networks"
 msgstr ""
 
-#: modules/process/neural.c:723
+#: modules/process/neural.c:730
 msgid "Network _name:"
 msgstr ""
 
-#: modules/process/neural.c:775
+#: modules/process/neural.c:782
 msgid "Apply Neural Network"
 msgstr ""
 
-#: modules/process/neural.c:798
+#: modules/process/neural.c:805
 msgid "_Scale proportionally to input"
 msgstr ""
 
-#: modules/process/neural.c:929
+#: modules/process/neural.c:936
 msgid "Model and signal are not compatible."
 msgstr ""
 
-#: modules/process/neural.c:937
+#: modules/process/neural.c:944
 msgid "A field dimension is too small for chosen window size."
 msgstr ""
 
-#: modules/process/neural.c:1183 modules/process/neural.c:1349
+#: modules/process/neural.c:1190 modules/process/neural.c:1356
 msgid "Evaluating..."
 msgstr ""
 
-#: modules/process/neural.c:1309
+#: modules/process/neural.c:1316
 msgid "Training was canceled."
 msgstr ""
 
-#: modules/process/neural.c:1319
+#: modules/process/neural.c:1326
 #, c-format
 msgid "Mean difference: %.*f %s"
 msgstr ""
 
-#: modules/process/neural.c:1371
+#: modules/process/neural.c:1378
 msgid "Evaluated signal"
 msgstr ""
 
-#: modules/process/noise_synth.c:196
+#: modules/process/noise_synth.c:194
 msgid "Generates uncorrelated random noise."
 msgstr ""
 
-#: modules/process/noise_synth.c:210
+#: modules/process/noise_synth.c:208
 msgid "/S_ynthetic/_Noise..."
 msgstr ""
 
-#: modules/process/noise_synth.c:214
+#: modules/process/noise_synth.c:212
 msgid "Generate surface of uncorrelated noise"
 msgstr ""
 
-#: modules/process/noise_synth.c:334
+#: modules/process/noise_synth.c:332
 msgid "Random Noise"
 msgstr ""
 
-#: modules/process/obj_synth.c:274
+#: modules/process/obj_synth.c:270
 msgid "Spheres"
 msgstr ""
 
-#: modules/process/obj_synth.c:275
+#: modules/process/obj_synth.c:271
 msgid "Boxes"
 msgstr ""
 
-#: modules/process/obj_synth.c:276
+#: modules/process/obj_synth.c:272
 msgid "Cones"
 msgstr ""
 
-#: modules/process/obj_synth.c:277
+#: modules/process/obj_synth.c:273
 msgid "Pyramids"
 msgstr ""
 
-#: modules/process/obj_synth.c:278
+#: modules/process/obj_synth.c:274
 msgid "Diamonds"
 msgstr ""
 
-#: modules/process/obj_synth.c:279
+#: modules/process/obj_synth.c:275
 msgid "Tetrahedrons"
 msgstr ""
 
-#: modules/process/obj_synth.c:280
+#: modules/process/obj_synth.c:276
 msgid "Nuggets"
 msgstr ""
 
-#: modules/process/obj_synth.c:281
+#: modules/process/obj_synth.c:277
 msgid "Thatches"
 msgstr ""
 
-#: modules/process/obj_synth.c:282
+#: modules/process/obj_synth.c:278
 msgid "Tents"
 msgstr ""
 
-#: modules/process/obj_synth.c:283
+#: modules/process/obj_synth.c:279
 msgid "Gaussians"
 msgstr ""
 
-#: modules/process/obj_synth.c:284
+#: modules/process/obj_synth.c:280
 msgid "Doughnuts"
 msgstr ""
 
-#: modules/process/obj_synth.c:285
+#: modules/process/obj_synth.c:281
 #, fuzzy
 msgid "Parabolic bumps"
 msgstr "평행의"
 
-#: modules/process/obj_synth.c:291
+#: modules/process/obj_synth.c:287
 msgid "Generates randomly patterned surfaces by placing objects."
 msgstr ""
 
-#: modules/process/obj_synth.c:305
-msgid "/S_ynthetic/_Objects..."
+#: modules/process/obj_synth.c:301
+msgid "/S_ynthetic/_Deposition/_Objects..."
 msgstr ""
 
-#: modules/process/obj_synth.c:309
+#: modules/process/obj_synth.c:305
 msgid "Generate surface of randomly placed objects"
 msgstr ""
 
-#: modules/process/obj_synth.c:424
+#: modules/process/obj_synth.c:421
 msgid "Both (random)"
 msgstr ""
 
-#: modules/process/obj_synth.c:439
+#: modules/process/obj_synth.c:436
 msgid "Random Objects"
 msgstr ""
 
-#: modules/process/obj_synth.c:513
-msgid "_Shape:"
-msgstr ""
-
-#: modules/process/obj_synth.c:531
-msgid "obj."
-msgstr ""
-
-#: modules/process/obj_synth.c:551
+#: modules/process/obj_synth.c:549
 msgid "Aspect Ratio"
 msgstr ""
 
-#: modules/process/obj_synth.c:558
+#: modules/process/obj_synth.c:556
 msgid "_Aspect ratio:"
 msgstr ""
 
-#: modules/process/obj_synth.c:588
+#: modules/process/obj_synth.c:586
 msgid "Scales _with size"
 msgstr ""
 
-#: modules/process/obj_synth.c:612
+#: modules/process/obj_synth.c:611
 #, fuzzy
 msgid "_Feature type:"
 msgstr "필터 종류(F):"
 
-#: modules/process/obj_synth.c:807
-msgid "_Truncate:"
-msgstr ""
-
-#: modules/process/otsu_threshold.c:39 modules/process/otsu_threshold.c:59
+#: modules/process/otsu_threshold.c:40 modules/process/otsu_threshold.c:60
 msgid "Automated threshold using Otsu's method on heights."
 msgstr ""
 
-#: modules/process/otsu_threshold.c:55
-msgid "/_Grains/_Mark by Otsu's..."
+#: modules/process/otsu_threshold.c:56
+msgid "/_Grains/_Mark by Otsu's"
 msgstr ""
 
-#: modules/process/outliers.c:40
+#: modules/process/outliers.c:41
 msgid "Creates mask of outliers."
 msgstr ""
 
-#: modules/process/outliers.c:54
+#: modules/process/outliers.c:55
 msgid "/_Correct Data/Mask of _Outliers"
 msgstr ""
 
-#: modules/process/outliers.c:58
+#: modules/process/outliers.c:59
 msgid "Mark data farther than 3σ from mean value"
 msgstr ""
 
@@ -11947,80 +12550,101 @@ msgstr ""
 msgid "_Pattern:"
 msgstr ""
 
-#: modules/process/pat_synth.c:812
+#: modules/process/pat_synth.c:813
 msgid "Flat"
 msgstr ""
 
-#: modules/process/pat_synth.c:820
+#: modules/process/pat_synth.c:821
 msgid "_Flat width:"
 msgstr ""
 
-#: modules/process/pat_synth.c:837 modules/process/pat_synth.c:1139
-#: modules/process/pat_synth.c:1474
+#: modules/process/pat_synth.c:838 modules/process/pat_synth.c:1140
+#: modules/process/pat_synth.c:1475
 msgid "_Slope width:"
 msgstr ""
 
-#: modules/process/pat_synth.c:1099
+#: modules/process/pat_synth.c:1100
 msgid "Top"
 msgstr ""
 
-#: modules/process/pat_synth.c:1106
+#: modules/process/pat_synth.c:1107
 msgid "Flat _top width:"
 msgstr ""
 
-#: modules/process/pat_synth.c:1114
+#: modules/process/pat_synth.c:1115
 msgid "Bottom"
 msgstr ""
 
-#: modules/process/pat_synth.c:1122
+#: modules/process/pat_synth.c:1123
 msgid "Flat _bottom width:"
 msgstr ""
 
-#: modules/process/pat_synth.c:1440
+#: modules/process/pat_synth.c:1441
 msgid "_Distance:"
 msgstr ""
 
-#: modules/process/pid.c:96
+#: modules/process/phase_synth.c:136
+msgid "Generates phase-separated structures."
+msgstr ""
+
+#: modules/process/phase_synth.c:150
+msgid "/S_ynthetic/P_hases..."
+msgstr ""
+
+#: modules/process/phase_synth.c:154
+msgid "Generate surface with separated phases"
+msgstr ""
+
+#: modules/process/phase_synth.c:203
+#, fuzzy
+msgid "Separated Phases"
+msgstr "채널"
+
+#: modules/process/phase_synth.c:287
+msgid "Size s_pread:"
+msgstr ""
+
+#: modules/process/pid.c:95
 msgid "A simple PID simulator"
 msgstr ""
 
-#: modules/process/pid.c:110
+#: modules/process/pid.c:109
 msgid "/_Tip and Indentation/_PID simulation..."
 msgstr ""
 
-#: modules/process/pid.c:114
+#: modules/process/pid.c:113
 msgid "Simulate PID effects on measurement"
 msgstr ""
 
-#: modules/process/pid.c:158
+#: modules/process/pid.c:157
 msgid "PID FW result"
 msgstr ""
 
-#: modules/process/pid.c:167
+#: modules/process/pid.c:166
 msgid "PID FW max. force"
 msgstr ""
 
-#: modules/process/pid.c:176
+#: modules/process/pid.c:175
 msgid "PID REV result"
 msgstr ""
 
-#: modules/process/pid.c:185
+#: modules/process/pid.c:184
 msgid "PID REV max. force"
 msgstr ""
 
-#: modules/process/pid.c:198
+#: modules/process/pid.c:196
 msgid "PID simulation"
 msgstr ""
 
-#: modules/process/pid.c:215
+#: modules/process/pid.c:214
 msgid "_Proportional:"
 msgstr ""
 
-#: modules/process/pid.c:221
+#: modules/process/pid.c:220
 msgid "_Integral:"
 msgstr ""
 
-#: modules/process/pid.c:227
+#: modules/process/pid.c:226
 msgid "_Integration steps:"
 msgstr ""
 
@@ -12028,15 +12652,15 @@ msgstr ""
 msgid "_Derivative:"
 msgstr ""
 
-#: modules/process/pid.c:241
+#: modules/process/pid.c:240
 msgid "PID/scan speed _ratio:"
 msgstr ""
 
-#: modules/process/pid.c:253
+#: modules/process/pid.c:255
 msgid "Force strength:"
 msgstr ""
 
-#: modules/process/pid.c:259
+#: modules/process/pid.c:261
 msgid "Force setpoint:"
 msgstr ""
 
@@ -12044,7 +12668,7 @@ msgstr ""
 msgid "Scanning..."
 msgstr ""
 
-#: modules/process/pid.c:396
+#: modules/process/pid.c:401
 msgid "Computation diverged, try to change parameters"
 msgstr ""
 
@@ -12064,23 +12688,23 @@ msgstr ""
 msgid "Distort by Polynomial"
 msgstr ""
 
-#: modules/process/polydistort.c:282
+#: modules/process/polydistort.c:285
 msgid "Ori_ginal"
 msgstr ""
 
-#: modules/process/polydistort.c:283
+#: modules/process/polydistort.c:286
 msgid "_Transformed"
 msgstr ""
 
-#: modules/process/polydistort.c:289
+#: modules/process/polydistort.c:292
 msgid "X Coefficients"
 msgstr ""
 
-#: modules/process/polydistort.c:303
+#: modules/process/polydistort.c:306
 msgid "Y Coefficients"
 msgstr ""
 
-#: modules/process/polydistort.c:499
+#: modules/process/polydistort.c:502
 msgid "Distorted"
 msgstr ""
 
@@ -12116,23 +12740,23 @@ msgstr "평평하게 맞춰진 데이터"
 msgid "_Horizontal polynom degree:"
 msgstr "수평 다항식 차수(H):"
 
-#: modules/process/polylevel.c:450
+#: modules/process/polylevel.c:451
 msgid "_Vertical polynom degree:"
 msgstr "수직 다항식 차수(V):"
 
-#: modules/process/polylevel.c:456
+#: modules/process/polylevel.c:458
 msgid "_Same degrees"
 msgstr "같은 차수(S)"
 
-#: modules/process/polylevel.c:474
+#: modules/process/polylevel.c:476
 msgid "_Maximum polynom degree:"
 msgstr "최대 다항식 차수(M):"
 
-#: modules/process/polylevel.c:561
+#: modules/process/polylevel.c:564
 msgid "Polynomial Coefficients"
 msgstr "다항식 계수"
 
-#: modules/process/polylevel.c:934 modules/tools/distance.c:594
+#: modules/process/polylevel.c:937 modules/tools/distance.c:594
 #: modules/tools/selectionmanager.c:720
 msgid "Save Table"
 msgstr "표 저장하기"
@@ -12154,8 +12778,9 @@ msgid "/_Presentation/E_xtract Presentation"
 msgstr ""
 
 #: modules/process/presentationops.c:81
-msgid "Extract presentation to a new channel"
-msgstr ""
+#, fuzzy
+msgid "Extract presentation to a new image"
+msgstr "새 파일로 확장"
 
 #: modules/process/presentationops.c:84
 msgid "/_Presentation/_Attach Presentation..."
@@ -12181,6 +12806,10 @@ msgstr ""
 msgid "_Data to attach:"
 msgstr ""
 
+#: modules/process/preview.h:245
+msgid "Combine with existing mask:"
+msgstr ""
+
 #: modules/process/psdf_logphi.c:76
 msgid ""
 "Two-dimensional FFT (Fast Fourier Transform) transformed to coordinates (log-"
@@ -12200,10 +12829,86 @@ msgstr ""
 msgid "Log-Phi PSDF"
 msgstr ""
 
-#: modules/process/psdf_logphi.c:275 modules/process/wpour_mark.c:320
+#: modules/process/psdf_logphi.c:276 modules/process/wpour_mark.c:320
 msgid "Gaussian _smoothing:"
 msgstr ""
 
+#: modules/process/psf-fit.c:165
+#, fuzzy
+msgid "Gaussian (asymmetric)"
+msgstr "가우시안 타입 (ACF)"
+
+#: modules/process/psf-fit.c:177
+msgid "Point spread function estimation by fitting explicit function form."
+msgstr ""
+
+#: modules/process/psf-fit.c:191
+#, fuzzy
+msgid "/_Statistics/_PSF Fit..."
+msgstr "/통계(S)/각도 분포(G)..."
+
+#: modules/process/psf-fit.c:195
+msgid "Fit PSF from known data and image"
+msgstr ""
+
+#: modules/process/psf-fit.c:246 modules/process/psf.c:181
+#: modules/process/psf.c:230
+#, fuzzy
+msgid "PSF"
+msgstr "PSDF"
+
+#: modules/process/psf-fit.c:254 modules/process/psf.c:195
+msgid "PSF*P"
+msgstr ""
+
+#: modules/process/psf-fit.c:271
+#, fuzzy
+msgid "Fit PSF"
+msgstr "모양:"
+
+#: modules/process/psf-fit.c:289 modules/process/psf.c:286
+msgid "_Ideal response:"
+msgstr ""
+
+#: modules/process/psf.c:117
+#, fuzzy
+msgid "Point spread function estimation"
+msgstr "팁 추정 효과 가리기"
+
+#: modules/process/psf.c:131
+#, fuzzy
+msgid "/_Statistics/_PSF Guess..."
+msgstr "/통계(S)/각도 분포(G)..."
+
+#: modules/process/psf.c:135
+msgid "Estimate PSF from known data and image"
+msgstr ""
+
+#: modules/process/psf.c:208
+msgid "PSF*P - I"
+msgstr ""
+
+#: modules/process/psf.c:231
+msgid "Convolved"
+msgstr ""
+
+#: modules/process/psf.c:237
+#, fuzzy
+msgid "Estimate PSF"
+msgstr "추정된 팁"
+
+#: modules/process/psf.c:238
+msgid "_Fit"
+msgstr ""
+
+#: modules/process/psf.c:295
+msgid "_Display:"
+msgstr ""
+
+#: modules/process/psf.c:301
+msgid "_Sigma init:"
+msgstr ""
+
 #: modules/process/rank.c:92
 msgid "Enhances local contrast using a rank transform."
 msgstr ""
@@ -12254,7 +12959,7 @@ msgstr "/기본 기능(B)/각도로 회전시키기(A)"
 msgid "Rotate by arbitrary angle"
 msgstr "임의 각도로 회전시키기"
 
-#: modules/process/rotate.c:192
+#: modules/process/rotate.c:192 modules/volume/volume_swaxes.c:651
 msgid "Rotated Data"
 msgstr "데이터 회전시키기"
 
@@ -12315,66 +13020,66 @@ msgstr "크기변경된 데이터"
 msgid "verb|Scale"
 msgstr "동사|크기변경"
 
-#: modules/process/scale.c:216
+#: modules/process/scale.c:217
 msgid "Scale by _ratio:"
 msgstr "비율로 크기변경(R)"
 
-#: modules/process/scale.c:224
+#: modules/process/scale.c:225
 msgid "_proportional"
 msgstr "비례적으로(P)"
 
-#: modules/process/scale.c:235
+#: modules/process/scale.c:237
 msgid "New _width:"
 msgstr "새 너비(W):"
 
-#: modules/process/scale.c:243
+#: modules/process/scale.c:246
 msgid "New _height:"
 msgstr "새 높이(H)"
 
-#: modules/process/scars.c:113
+#: modules/process/scars.c:122
 #, fuzzy
 msgid "Marks and/or removes scars (horizontal linear artifacts)."
 msgstr "상처 표시 또는 제거 (horizontal linear artefacts)."
 
-#: modules/process/scars.c:127
+#: modules/process/scars.c:136
 msgid "/_Correct Data/M_ark Scars..."
 msgstr ""
 
-#: modules/process/scars.c:131
+#: modules/process/scars.c:140
 msgid "Mark horizontal scars (strokes)"
 msgstr ""
 
-#: modules/process/scars.c:134
+#: modules/process/scars.c:143
 msgid "/_Correct Data/Remove _Scars"
 msgstr ""
 
-#: modules/process/scars.c:138
+#: modules/process/scars.c:147
 msgid "Correct horizontal scars (strokes)"
 msgstr ""
 
-#: modules/process/scars.c:293
+#: modules/process/scars.c:312
 msgid "Mark Scars"
 msgstr "튄 자국 표시"
 
-#: modules/process/scars.c:331
+#: modules/process/scars.c:353
 msgid "Maximum _width:"
 msgstr "최대 너비(W)"
 
-#: modules/process/scars.c:338
+#: modules/process/scars.c:361
 msgid "Minimum _length:"
 msgstr "최소 길이(L)"
 
-#: modules/process/scars.c:345
+#: modules/process/scars.c:369
 #, fuzzy
 msgid "_Hard threshold:"
 msgstr "Hard threshold(H):"
 
-#: modules/process/scars.c:353
+#: modules/process/scars.c:377
 #, fuzzy
 msgid "_Soft threshold:"
 msgstr "Soft threshold(S):"
 
-#: modules/process/scars.c:361
+#: modules/process/scars.c:385
 msgid "Scars type:"
 msgstr ""
 
@@ -12417,108 +13122,160 @@ msgstr ""
 msgid "_Quality:"
 msgstr ""
 
-#: modules/process/shade.c:92
+#: modules/process/shade.c:94
 msgid "Creates a shaded presentation of data."
 msgstr ""
 
-#: modules/process/shade.c:106
+#: modules/process/shade.c:108
 msgid "/_Presentation/_Shading..."
 msgstr ""
 
-#: modules/process/shade.c:110
+#: modules/process/shade.c:112
 msgid "Shade data"
 msgstr ""
 
-#: modules/process/shade.c:207
+#: modules/process/shade.c:209
 msgid "Shading"
 msgstr ""
 
-#: modules/process/shade.c:253
+#: modules/process/shade.c:260
 msgid "_Mix:"
 msgstr ""
 
-#: modules/process/slope_dist.c:161
+#: modules/process/slope_dist.c:160
 msgid ""
 "Calculates one- or two-dimensional distribution of slopes or graph of their "
 "angular distribution."
 msgstr ""
 
-#: modules/process/slope_dist.c:176
+#: modules/process/slope_dist.c:175
 msgid "/_Statistics/_Slope Distribution..."
 msgstr ""
 
-#: modules/process/slope_dist.c:180
+#: modules/process/slope_dist.c:179
 msgid "Calculate angular slope distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:221
+#: modules/process/slope_dist.c:220
 msgid "Slope distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:253
+#: modules/process/slope_dist.c:252
 msgid "_Two-dimensional distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:254
+#: modules/process/slope_dist.c:253
 msgid "Directional (φ) _graph"
 msgstr ""
 
-#: modules/process/slope_dist.c:255
+#: modules/process/slope_dist.c:254
 msgid "_Inclination (θ) graph"
 msgstr ""
 
-#: modules/process/slope_dist.c:256
+#: modules/process/slope_dist.c:255
 msgid "Inclination (gra_dient) graph"
 msgstr ""
 
-#: modules/process/slope_dist.c:270
+#: modules/process/slope_dist.c:269
 msgid "Slope Distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:755
+#: modules/process/slope_dist.c:749
 msgid "Angular Slope Distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:763 modules/process/tilt.c:179
+#: modules/process/slope_dist.c:757 modules/process/tilt.c:179
 msgid "Slopes"
 msgstr ""
 
-#: modules/process/slope_dist.c:824 modules/process/slope_dist.c:893
+#: modules/process/slope_dist.c:818 modules/process/slope_dist.c:887
 msgid "Inclination Distribution"
 msgstr ""
 
-#: modules/process/slope_dist.c:832 modules/process/slope_dist.c:901
+#: modules/process/slope_dist.c:826 modules/process/slope_dist.c:895
 msgid "Inclinations"
 msgstr ""
 
-#: modules/process/sphere-revolve.c:97
+#: modules/process/sphere-revolve.c:111
 msgid "Subtracts background by arc or sphere revolution."
 msgstr ""
 
-#: modules/process/sphere-revolve.c:113
+#: modules/process/sphere-revolve.c:125
 msgid "/_Level/Revolve _Arc..."
 msgstr "/평평하게 만들기/호 회전시키기(A)..."
 
-#: modules/process/sphere-revolve.c:117
+#: modules/process/sphere-revolve.c:129
 msgid "Level data by arc revolution"
 msgstr ""
 
-#: modules/process/sphere-revolve.c:208 modules/tools/sfunctions.c:371
+#: modules/process/sphere-revolve.c:132
+#, fuzzy
+msgid "/_Level/Revolve _Sphere..."
+msgstr "/평평하게 만들기/호 회전시키기(A)..."
+
+#: modules/process/sphere-revolve.c:136
+msgid "Level data by sphere revolution"
+msgstr ""
+
+#: modules/process/sphere-revolve.c:303 modules/tools/sfunctions.c:381
 msgid "_Horizontal direction"
 msgstr "수평 방향(H)"
 
-#: modules/process/sphere-revolve.c:209 modules/tools/sfunctions.c:372
+#: modules/process/sphere-revolve.c:304 modules/tools/sfunctions.c:382
 msgid "_Vertical direction"
 msgstr "수직 방향(V)"
 
-#: modules/process/sphere-revolve.c:210
+#: modules/process/sphere-revolve.c:305
 msgid "_Both directions"
 msgstr "양쪽 방향(B)"
 
-#: modules/process/sphere-revolve.c:217
+#: modules/process/sphere-revolve.c:315
+#, fuzzy
+msgid "Revolve Sphere"
+msgstr "호 회전시키기"
+
+#: modules/process/sphere-revolve.c:315
 msgid "Revolve Arc"
 msgstr "호 회전시키기"
 
+#: modules/process/sphere-revolve.c:355
+msgid "Direction:"
+msgstr ""
+
+#: modules/process/sphere-revolve.c:699
+msgid "Revolving sphere..."
+msgstr ""
+
+#: modules/process/stitch.c:135
+msgid "Stitch multiple images based on offsets of origins."
+msgstr ""
+
+#: modules/process/stitch.c:149
+#, fuzzy
+msgid "/M_ultidata/_Stitch..."
+msgstr "/멀티데이터(M)/산술 연산(A)..."
+
+#: modules/process/stitch.c:153
+msgid "Stitch images using offsets"
+msgstr ""
+
+#: modules/process/stitch.c:269
+msgid "Stitch"
+msgstr ""
+
+#: modules/process/stitch.c:312
+msgid "Channels"
+msgstr "채널"
+
+#: modules/process/stitch.c:435
+msgid "Restore"
+msgstr ""
+
+#: modules/process/stitch.c:445 modules/tools/linestats.c:379
+#: modules/tools/sfunctions.c:440 modules/tools/stats.c:406
+msgid "_Instant updates"
+msgstr ""
+
 #: modules/process/straighten_path.c:126
 msgid "Extracts a straightened part of image along a curve."
 msgstr ""
@@ -12535,30 +13292,30 @@ msgstr ""
 msgid "Straighten Path"
 msgstr ""
 
-#: modules/process/straighten_path.c:254
+#: modules/process/straighten_path.c:253
 msgid "Res_tore"
 msgstr ""
 
-#: modules/process/straighten_path.c:259
+#: modules/process/straighten_path.c:258
 msgid "Re_verse"
 msgstr ""
 
 #: modules/process/straighten_path.c:278 modules/tools/pathlevel.c:256
-#: modules/tools/profile.c:507 modules/tools/roughness.c:854
+#: modules/tools/profile.c:503 modules/tools/roughness.c:868
 msgid "_Thickness:"
 msgstr ""
 
-#: modules/process/straighten_path.c:286
+#: modules/process/straighten_path.c:287
 #, fuzzy
 msgid "_Slackness:"
 msgstr "선 굵기(H):"
 
-#: modules/process/straighten_path.c:292
+#: modules/process/straighten_path.c:293
 #, fuzzy
 msgid "C_losed curve"
 msgstr "파일 닫기"
 
-#: modules/process/straighten_path.c:379
+#: modules/process/straighten_path.c:380
 msgid "Straightened"
 msgstr ""
 
@@ -12579,52 +13336,52 @@ msgstr ""
 msgid "Supres"
 msgstr ""
 
-#: modules/process/superresolution.c:421
+#: modules/process/superresolution.c:420
 msgid "Correlating to determine mean shift..."
 msgstr ""
 
-#: modules/process/superresolution.c:511
+#: modules/process/superresolution.c:510
 msgid "Cross-correlation..."
 msgstr ""
 
-#: modules/process/superresolution.c:554 modules/xyz/xyz_raster.c:1079
-#: modules/xyz/xyz_raster.c:1119
+#: modules/process/superresolution.c:553 modules/xyz/xyz_raster.c:1053
+#: modules/xyz/xyz_raster.c:1093
 msgid "Interpolating..."
 msgstr ""
 
-#: modules/process/synth.h:343
+#: modules/process/synth.h:344
 msgid "Roundness"
 msgstr ""
 
-#: modules/process/synth.h:351
+#: modules/process/synth.h:352
 msgid "Roundn_ess:"
 msgstr ""
 
-#: modules/process/synth.h:399
+#: modules/process/synth.h:401
 msgid "Orientation"
 msgstr ""
 
-#: modules/process/synth.h:408
+#: modules/process/synth.h:410
 msgid "Orien_tation:"
 msgstr ""
 
-#: modules/process/synth.h:432
-msgid "Variance:"
+#: modules/process/synth.h:436
+msgid "_Truncate:"
 msgstr ""
 
-#: modules/process/synth.h:456
-msgid "Deformation"
+#: modules/process/synth.h:460
+msgid "Variance:"
 msgstr ""
 
-#: modules/process/synth.h:464
+#: modules/process/synth.h:493
 msgid "_Amplitude:"
 msgstr ""
 
-#: modules/process/synth.h:472
+#: modules/process/synth.h:501
 msgid "_Lateral scale:"
 msgstr ""
 
-#: modules/process/synth.h:566
+#: modules/process/synth.h:595
 msgid "Randomi_ze"
 msgstr ""
 
@@ -12640,42 +13397,42 @@ msgstr "/기본 기능(B)/범위 제한(M)..."
 msgid "Limit data range"
 msgstr "데이터 범위 제한"
 
-#: modules/process/threshold.c:246
+#: modules/process/threshold.c:241
 msgid "Limit Range"
 msgstr "범위제한"
 
-#: modules/process/threshold.c:281
+#: modules/process/threshold.c:276
 msgid "Specify _thresholds"
 msgstr "역치값 설정(T)"
 
-#: modules/process/threshold.c:283
+#: modules/process/threshold.c:278
 msgid "Use _display range"
 msgstr "디스플레이 범위 사용"
 
-#: modules/process/threshold.c:285
+#: modules/process/threshold.c:280
 #, fuzzy
 msgid "Cut off outlier_s"
 msgstr "잘라내기 기준점(S)"
 
-#: modules/process/threshold.c:294
+#: modules/process/threshold.c:289
 msgid "_Lower:"
 msgstr "이하(L):"
 
-#: modules/process/threshold.c:300
+#: modules/process/threshold.c:295
 msgid "_Upper:"
 msgstr "이상(U):"
 
-#: modules/process/threshold.c:305
+#: modules/process/threshold.c:300
 msgid "Set to _Full Range"
 msgstr "전체 범위로 설정(F)"
 
 #. TRANSLATORS: This is a range: 123 to 456.
-#: modules/process/threshold.c:318
+#: modules/process/threshold.c:313
 #, c-format
 msgid "%.*f to %.*f"
 msgstr "%.*f 부터 %.*f 까지"
 
-#: modules/process/threshold.c:341
+#: modules/process/threshold.c:336
 msgid "F_arther than:"
 msgstr "최소 값(A):"
 
@@ -12695,11 +13452,11 @@ msgstr "특정 값만큼 기울이기"
 msgid "Tilt"
 msgstr "기울이기"
 
-#: modules/process/tilt.c:185 modules/volume/volume_slice.c:444
+#: modules/process/tilt.c:185 modules/volume/volume_slice.c:446
 msgid "_X:"
 msgstr "X(X):"
 
-#: modules/process/tilt.c:194 modules/volume/volume_slice.c:464
+#: modules/process/tilt.c:194 modules/volume/volume_slice.c:469
 msgid "_Y:"
 msgstr "Y(Y):"
 
@@ -12707,32 +13464,32 @@ msgstr "Y(Y):"
 msgid "Angles"
 msgstr "각도"
 
-#: modules/process/tip_blind.c:178
+#: modules/process/tip_blind.c:177
 msgid "Blind estimation of SPM tip using Villarubia's algorithm."
 msgstr "Villarubia 알고리즘을 이용한 SPM 팁 추정 효과 가리기"
 
-#: modules/process/tip_blind.c:192
+#: modules/process/tip_blind.c:191
 #, fuzzy
 msgid "/_Tip and Indentation/_Blind Estimation..."
 msgstr "/팁(T)/추정효과 가리기(B)..."
 
-#: modules/process/tip_blind.c:196
+#: modules/process/tip_blind.c:195
 msgid "Blind tip estimation"
 msgstr "팁 추정 효과 가리기"
 
-#: modules/process/tip_blind.c:231
+#: modules/process/tip_blind.c:230
 msgid "Blind Tip Estimation"
 msgstr "팁 추정 효과 가리기"
 
-#: modules/process/tip_blind.c:232
+#: modules/process/tip_blind.c:231
 msgid "Run _Partial"
 msgstr ""
 
-#: modules/process/tip_blind.c:233
+#: modules/process/tip_blind.c:232
 msgid "Run _Full"
 msgstr ""
 
-#: modules/process/tip_blind.c:234
+#: modules/process/tip_blind.c:233
 msgid "_Reset Tip"
 msgstr ""
 
@@ -12740,77 +13497,77 @@ msgstr ""
 msgid "Related _data:"
 msgstr ""
 
-#: modules/process/tip_blind.c:326
+#: modules/process/tip_blind.c:327
 msgid "Estimated Tip Size"
 msgstr ""
 
-#: modules/process/tip_blind.c:347
+#: modules/process/tip_blind.c:350
 msgid "_Same resolution"
 msgstr ""
 
-#: modules/process/tip_blind.c:366
+#: modules/process/tip_blind.c:376
 msgid "Noise suppression t_hreshold:"
 msgstr ""
 
-#: modules/process/tip_blind.c:386
+#: modules/process/tip_blind.c:384
 msgid "Use _boundaries"
 msgstr ""
 
-#: modules/process/tip_blind.c:396
+#: modules/process/tip_blind.c:395
 msgid "Stripes"
 msgstr ""
 
-#: modules/process/tip_blind.c:402
+#: modules/process/tip_blind.c:401
 msgid "_Split to stripes:"
 msgstr ""
 
-#: modules/process/tip_blind.c:416
+#: modules/process/tip_blind.c:412
 msgid "_Preview stripe:"
 msgstr ""
 
-#: modules/process/tip_blind.c:423
+#: modules/process/tip_blind.c:420
 msgid "Plot size _graph"
 msgstr ""
 
-#: modules/process/tip_blind.c:433
+#: modules/process/tip_blind.c:430
 msgid "Create tip i_mages"
 msgstr ""
 
 #. TRANSLATORS: Prefix for the progressbar message.
-#: modules/process/tip_blind.c:810
+#: modules/process/tip_blind.c:807
 #, c-format
 msgid "Stripe %u: "
 msgstr ""
 
-#: modules/process/tip_blind.c:917 modules/process/tip_blind.c:941
+#: modules/process/tip_blind.c:914 modules/process/tip_blind.c:938
 msgid "Estimated tip"
 msgstr "추정된 팁"
 
-#: modules/process/tip_blind.c:1207 modules/process/tip_blind.c:1216
+#: modules/process/tip_blind.c:1204 modules/process/tip_blind.c:1213
 msgid "Tip radius evolution"
 msgstr ""
 
-#: modules/process/tip_model.c:114
+#: modules/process/tip_model.c:112
 msgid "Models SPM tip."
 msgstr ""
 
-#: modules/process/tip_model.c:129
+#: modules/process/tip_model.c:127
 msgid "/_Tip and Indentation/_Model Tip..."
 msgstr ""
 
-#: modules/process/tip_model.c:133
+#: modules/process/tip_model.c:131
 msgid "Model AFM tip"
 msgstr ""
 
-#: modules/process/tip_model.c:164
+#: modules/process/tip_model.c:162
 msgid "Model Tip"
 msgstr ""
 
-#: modules/process/tip_model.c:224
+#: modules/process/tip_model.c:222
 msgid "Tip _type:"
 msgstr ""
 
-#: modules/process/tip_model.c:229
+#: modules/process/tip_model.c:228
 msgid "_Number of sides:"
 msgstr ""
 
@@ -12822,19 +13579,19 @@ msgstr ""
 msgid "Tip _rotation:"
 msgstr ""
 
-#: modules/process/tip_model.c:250
+#: modules/process/tip_model.c:255
 msgid "Tip _apex radius:"
 msgstr ""
 
-#: modules/process/tip_model.c:269
+#: modules/process/tip_model.c:265
 msgid "Tip _anisotropy:"
 msgstr ""
 
-#: modules/process/tip_model.c:490
+#: modules/process/tip_model.c:484
 msgid "Modeled tip"
 msgstr ""
 
-#: modules/process/tip_model.c:562
+#: modules/process/tip_model.c:556
 #, c-format
 msgid "Tip resolution: %d × %d pixels"
 msgstr ""
@@ -12939,7 +13696,8 @@ msgid "Converts datafield to 3D volume data."
 msgstr ""
 
 #: modules/process/volumize.c:56
-msgid "/_Basic Operations/Volumize..."
+#, fuzzy
+msgid "/_Basic Operations/Volumize"
 msgstr "/기본 기능(B)/Volumize..."
 
 #: modules/process/volumize.c:60
@@ -12982,73 +13740,77 @@ msgstr ""
 msgid "Z _range:"
 msgstr ""
 
-#: modules/process/wave_synth.c:211
+#: modules/process/wave_synth.c:219
 msgid "Generates various kinds of waves."
 msgstr ""
 
-#: modules/process/wave_synth.c:225
+#: modules/process/wave_synth.c:233
 msgid "/S_ynthetic/_Waves..."
 msgstr ""
 
-#: modules/process/wave_synth.c:229
+#: modules/process/wave_synth.c:237
 msgid "Generate waves"
 msgstr ""
 
-#: modules/process/wave_synth.c:347
+#: modules/process/wave_synth.c:366
 msgid "Waves"
 msgstr ""
 
-#: modules/process/wave_synth.c:422 modules/tools/linestats.c:337
-#: modules/tools/sfunctions.c:401 modules/volume/volume_linestat.c:369
+#: modules/process/wave_synth.c:441 modules/tools/linestats.c:337
+#: modules/tools/sfunctions.c:411 modules/volume/volume_linestat.c:374
 msgid "_Quantity:"
 msgstr ""
 
-#: modules/process/wave_synth.c:429
+#: modules/process/wave_synth.c:448
 msgid "_Number of waves:"
 msgstr ""
 
-#: modules/process/wave_synth.c:436 modules/process/wave_synth.c:582
-#: modules/tools/roughness.c:274
+#: modules/process/wave_synth.c:455 modules/process/wave_synth.c:617
+#: modules/tools/roughness.c:275
 msgid "Amplitude"
 msgstr "크기"
 
-#: modules/process/wave_synth.c:441
+#: modules/process/wave_synth.c:460
 msgid "_Wave form:"
 msgstr ""
 
-#: modules/process/wave_synth.c:448
+#: modules/process/wave_synth.c:467
 msgid "Amplitude:"
 msgstr "크기:"
 
-#: modules/process/wave_synth.c:466
+#: modules/process/wave_synth.c:487
+msgid "_Decay:"
+msgstr ""
+
+#: modules/process/wave_synth.c:497
 msgid "Frequency"
 msgstr "주파수"
 
-#: modules/process/wave_synth.c:472
+#: modules/process/wave_synth.c:503
 msgid "_Spatial frequency:"
 msgstr ""
 
-#: modules/process/wave_synth.c:488
+#: modules/process/wave_synth.c:519
 msgid "_X center:"
 msgstr ""
 
-#: modules/process/wave_synth.c:499
+#: modules/process/wave_synth.c:532
 msgid "_Y center:"
 msgstr ""
 
-#: modules/process/wave_synth.c:565
+#: modules/process/wave_synth.c:600
 msgid "Cosine"
 msgstr ""
 
-#: modules/process/wave_synth.c:566
+#: modules/process/wave_synth.c:601
 msgid "Inverse cosh"
 msgstr ""
 
-#: modules/process/wave_synth.c:567
+#: modules/process/wave_synth.c:602
 msgid "Flat top"
 msgstr ""
 
-#: modules/process/wave_synth.c:581
+#: modules/process/wave_synth.c:616
 msgid "Displacement"
 msgstr ""
 
@@ -13132,39 +13894,39 @@ msgstr ""
 msgid "Preprocess and mark"
 msgstr ""
 
-#: modules/process/xydenoise.c:57
+#: modules/process/xydenoise.c:58
 msgid "Denoises measurement on basis of two orthogonal scans."
 msgstr ""
 
-#: modules/process/xydenoise.c:71
+#: modules/process/xydenoise.c:72
 msgid "/M_ultidata/_XY denoise..."
 msgstr ""
 
-#: modules/process/xydenoise.c:75
+#: modules/process/xydenoise.c:76
 msgid "Denoises horizontal/vertical measurement."
 msgstr ""
 
-#: modules/process/xydenoise.c:102
+#: modules/process/xydenoise.c:103
 msgid "XY Denoising"
 msgstr ""
 
-#: modules/process/xydenoise.c:124
+#: modules/process/xydenoise.c:125
 msgid "Second direction:"
 msgstr ""
 
-#: modules/process/xydenoise.c:232
+#: modules/process/xydenoise.c:233
 msgid "Computing forward FFTs..."
 msgstr ""
 
-#: modules/process/xydenoise.c:248
+#: modules/process/xydenoise.c:249
 msgid "Computing image..."
 msgstr ""
 
-#: modules/process/xydenoise.c:260
+#: modules/process/xydenoise.c:261
 msgid "Computing backward FFT..."
 msgstr ""
 
-#: modules/process/xydenoise.c:272
+#: modules/process/xydenoise.c:273
 msgid "Denoised"
 msgstr ""
 
@@ -13181,63 +13943,67 @@ msgstr "/기본 기능(B)/기울이기(T)..."
 msgid "Convert to XYZ data"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:55
+#: modules/pygwy/pygwy-console.c:99
 msgid "/Pygwy Console"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:59
+#: modules/pygwy/pygwy-console.c:103
 msgid "Python wrapper console"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:142
-msgid ">>> Running the script above\n"
+#: modules/pygwy/pygwy-console.c:168 modules/pygwy/pygwy-console.c:481
+msgid "Pygwy Console"
+msgstr ""
+
+#: modules/pygwy/pygwy-console.c:187
+msgid "Open script in Python language (Ctrl-O)"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:194
-msgid "Open Python script"
+#: modules/pygwy/pygwy-console.c:197
+msgid "Save script (Ctrl-S)"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:275
-msgid "Save Script as"
+#: modules/pygwy/pygwy-console.c:207
+msgid "Save script as (Ctrl-Shift-S)"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:327
-msgid "Pygwy Console"
+#: modules/pygwy/pygwy-console.c:217
+msgid "Execute script (Ctrl-E)"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:340
+#: modules/pygwy/pygwy-console.c:227
 msgid "Clear Log"
 msgstr "로그 지우기"
 
-#: modules/pygwy/pygwy-console.c:344
-msgid "Open script in Python language (Ctrl-O)"
-msgstr ""
+#: modules/pygwy/pygwy-console.c:285
+msgid "Command"
+msgstr "명령어"
 
-#: modules/pygwy/pygwy-console.c:346
-msgid "Save script (Ctrl-S)"
+#: modules/pygwy/pygwy-console.c:371
+msgid ">>> Running the script above\n"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:348
-msgid "Execute script (Ctrl-E)"
+#: modules/pygwy/pygwy-console.c:425
+msgid "Save Python Script as"
 msgstr ""
 
-#: modules/pygwy/pygwy-console.c:426
-msgid "Command"
-msgstr "명령어"
+#: modules/pygwy/pygwy-console.c:429
+msgid "Open Python Script"
+msgstr ""
 
-#: pygwy.c:120
+#: pygwy.c:130
 msgid "Pygwy, the Gwyddion Python wrapper."
 msgstr ""
 
-#: pygwy.c:258
+#: pygwy.c:269
 msgid "Python Interpreter Errors"
 msgstr ""
 
-#: pygwy.c:384
+#: pygwy.c:399
 msgid "Python interpreter error occurred."
 msgstr ""
 
-#: pygwy.c:459
+#: pygwy.c:499
 msgid "Function written in Python"
 msgstr ""
 
@@ -13262,38 +14028,38 @@ msgid "Measure distances and directions between points"
 msgstr ""
 
 #. TRANSLATORS: Number is verb here.
-#: modules/tools/distance.c:250 modules/tools/profile.c:532
+#: modules/tools/distance.c:250 modules/tools/profile.c:527
 #, fuzzy
 msgid "_Number lines"
 msgstr "클러스터 개수"
 
-#: modules/tools/filter.c:128
+#: modules/tools/filter.c:129
 msgid ""
 "Filter tool, processes selected part of data with a filter (conservative "
 "denoise, mean, median. Kuwahara, minimum, maximum)."
 msgstr ""
 
-#: modules/tools/filter.c:171
+#: modules/tools/filter.c:172
 msgid "Basic filters: mean, median, denoise, …"
 msgstr ""
 
-#: modules/tools/filter.c:239
+#: modules/tools/filter.c:240
 msgid "Conservative denoise"
 msgstr ""
 
-#: modules/tools/filter.c:246
+#: modules/tools/filter.c:247
 msgid "Kuwahara"
 msgstr ""
 
-#: modules/tools/filter.c:247
+#: modules/tools/filter.c:248
 msgid "Dechecker"
 msgstr ""
 
-#: modules/tools/filter.c:248
+#: modules/tools/filter.c:249
 msgid "filter|Gaussian"
 msgstr ""
 
-#: modules/tools/filter.c:249
+#: modules/tools/filter.c:250
 msgid "Sharpen"
 msgstr ""
 
@@ -13383,7 +14149,7 @@ msgid "Height histogram"
 msgstr "높이 히스토그램"
 
 #: modules/tools/icolorange.c:329 modules/tools/linestats.c:169
-#: modules/tools/sfunctions.c:226 modules/volume/volume_linestat.c:146
+#: modules/tools/sfunctions.c:231 modules/volume/volume_linestat.c:148
 msgid "Range"
 msgstr "범위"
 
@@ -13412,29 +14178,29 @@ msgstr "/값 반전(I)"
 msgid "range|Full"
 msgstr ""
 
-#: modules/tools/level3.c:106
+#: modules/tools/level3.c:108
 msgid ""
 "Three-point level tool, levels data by subtracting a plane fitted through "
 "three selected points."
 msgstr ""
 
-#: modules/tools/level3.c:143
+#: modules/tools/level3.c:145
 msgid "Three Point Level"
 msgstr ""
 
-#: modules/tools/level3.c:144
+#: modules/tools/level3.c:146
 msgid "Level data by fitting a plane through three points"
 msgstr ""
 
-#: modules/tools/level3.c:239 modules/tools/readvalue.c:375
+#: modules/tools/level3.c:244 modules/tools/readvalue.c:378
 msgid "_Averaging radius:"
 msgstr ""
 
-#: modules/tools/level3.c:246
+#: modules/tools/level3.c:251
 msgid "_Instant apply"
 msgstr ""
 
-#: modules/tools/level3.c:255
+#: modules/tools/level3.c:261
 msgid "Set plane to _zero"
 msgstr "평면을 0으로 설정"
 
@@ -13444,23 +14210,23 @@ msgid ""
 "RMS, ..., of rows or columns."
 msgstr ""
 
-#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:148
+#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:150
 msgid "tan β<sub>0</sub>"
 msgstr ""
 
-#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:150
+#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:152
 msgid "Ra"
 msgstr "Ra"
 
-#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:151
+#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:153
 msgid "Rq (RMS)"
 msgstr "Rq (RMS)"
 
-#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:152
+#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:154
 msgid "Rz"
 msgstr "Rz"
 
-#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:153
+#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:155
 msgid "Rt"
 msgstr "Rt"
 
@@ -13484,16 +14250,11 @@ msgstr ""
 msgid "Average:"
 msgstr "평균:"
 
-#: modules/tools/linestats.c:363 modules/tools/profile.c:464
-#: modules/tools/sfunctions.c:414 modules/tools/spectro.c:343
+#: modules/tools/linestats.c:363 modules/tools/profile.c:460
+#: modules/tools/sfunctions.c:424 modules/tools/spectro.c:346
 msgid "<b>Options</b>"
 msgstr ""
 
-#: modules/tools/linestats.c:379 modules/tools/sfunctions.c:430
-#: modules/tools/stats.c:408
-msgid "_Instant updates"
-msgstr ""
-
 #: modules/tools/maskedit.c:170
 msgid "Mask editor tool, allows interactive modification of parts of the mask."
 msgstr ""
@@ -13550,63 +14311,63 @@ msgstr ""
 msgid "Erase continuous parts of mask"
 msgstr ""
 
-#: modules/tools/maskedit.c:408
+#: modules/tools/maskedit.c:409
 msgid "Editor"
 msgstr "편집기"
 
-#: modules/tools/maskedit.c:413
+#: modules/tools/maskedit.c:414
 msgid "_Shapes"
 msgstr ""
 
-#: modules/tools/maskedit.c:423
+#: modules/tools/maskedit.c:428
 msgid "Mode:"
 msgstr "모드:"
 
-#: modules/tools/maskedit.c:452
+#: modules/tools/maskedit.c:458
 msgid "Shape:"
 msgstr "모양:"
 
-#: modules/tools/maskedit.c:483
+#: modules/tools/maskedit.c:486
 msgid "_Drawing Tools"
 msgstr "그리기 도구(D)"
 
-#: modules/tools/maskedit.c:493
+#: modules/tools/maskedit.c:500
 msgid "Tool:"
 msgstr "도구:"
 
-#: modules/tools/maskedit.c:532
+#: modules/tools/maskedit.c:538
 msgid "Actions"
 msgstr ""
 
-#: modules/tools/maskedit.c:540
+#: modules/tools/maskedit.c:546
 msgid "_Invert"
 msgstr ""
 
-#: modules/tools/maskedit.c:571
+#: modules/tools/maskedit.c:577
 msgid "Fill _Voids"
 msgstr ""
 
-#: modules/tools/maskedit.c:580
+#: modules/tools/maskedit.c:586
 msgid "Fill non-simple-connected"
 msgstr ""
 
-#: modules/tools/maskedit.c:591
+#: modules/tools/maskedit.c:597
 msgid "Grow/Shrink"
 msgstr ""
 
-#: modules/tools/maskedit.c:600
+#: modules/tools/maskedit.c:606
 msgid "_Grow"
 msgstr ""
 
-#: modules/tools/maskedit.c:608
+#: modules/tools/maskedit.c:614
 msgid "Shrin_k"
 msgstr ""
 
-#: modules/tools/maskedit.c:623
+#: modules/tools/maskedit.c:629
 msgid "_Amount:"
 msgstr ""
 
-#: modules/tools/maskedit.c:651
+#: modules/tools/maskedit.c:657
 msgid "_Prevent grain merging by growing"
 msgstr ""
 
@@ -13622,83 +14383,98 @@ msgstr ""
 msgid "Level rows using intersections with given lines"
 msgstr ""
 
-#: modules/tools/profile.c:222
+#: modules/tools/profile.c:216
 msgid "Profile tool, creates profile graphs from selected lines."
 msgstr ""
 
-#: modules/tools/profile.c:276 modules/tools/profile.c:630
+#: modules/tools/profile.c:270 modules/tools/profile.c:609
 msgid "Profiles"
 msgstr ""
 
-#: modules/tools/profile.c:277
+#: modules/tools/profile.c:271
 msgid "Extract profiles"
 msgstr ""
 
-#: modules/tools/profile.c:480
-msgid "_Radial profiles"
-msgstr ""
-
-#: modules/tools/profile.c:493
-msgid "Symmetrize _All"
-msgstr ""
+#: modules/tools/profile.c:478
+#, fuzzy
+msgid "Linear profiles"
+msgstr "선 + 점"
 
-#: modules/tools/profile.c:498
-msgid "S_ymmetrize"
-msgstr ""
+#: modules/tools/profile.c:480
+#, fuzzy
+msgid "Radial profiles"
+msgstr "마스킹 모드"
 
-#: modules/tools/profile.c:542
+#: modules/tools/profile.c:537
 msgid "_Separate profiles"
 msgstr ""
 
-#: modules/tools/profile.c:607
+#: modules/tools/profile.c:587
 msgid "_Calibration data:"
 msgstr ""
 
-#: modules/tools/profile.c:620
+#: modules/tools/profile.c:600
 msgid "_Show profile"
 msgstr ""
 
-#: modules/tools/profile.c:887
+#: modules/tools/profile.c:861
 #, c-format
 msgid "X error %d"
 msgstr "X 에러 %d"
 
-#: modules/tools/profile.c:891
+#: modules/tools/profile.c:865
 #, c-format
 msgid "Y error %d"
 msgstr "Y 에러  %d"
 
-#: modules/tools/profile.c:895
+#: modules/tools/profile.c:869
 #, c-format
 msgid "Z error %d"
 msgstr "Z 에러 %d"
 
-#: modules/tools/profile.c:899
+#: modules/tools/profile.c:873
 #, c-format
 msgid "X uncertainty %d"
 msgstr ""
 
-#: modules/tools/profile.c:903
+#: modules/tools/profile.c:877
 #, c-format
 msgid "Y uncertainty %d"
 msgstr ""
 
-#: modules/tools/profile.c:907
+#: modules/tools/profile.c:881
 #, c-format
 msgid "Z uncertainty %d"
 msgstr ""
 
-#: modules/tools/profile.c:912
+#: modules/tools/profile.c:886
 #, c-format
 msgid "Zunc up bound %d"
 msgstr ""
 
-#: modules/tools/profile.c:917
+#: modules/tools/profile.c:891
 #, c-format
 msgid "Zunc low bound %d"
 msgstr ""
 
-#: modules/tools/profile.c:1817
+#: modules/tools/profile.c:1637
+msgid "S_ymmetrize"
+msgstr ""
+
+#: modules/tools/profile.c:1639
+msgid "Symmetrize _All"
+msgstr ""
+
+#: modules/tools/profile.c:1643
+#, fuzzy
+msgid "Improve _Direction"
+msgstr "방향(D):"
+
+#: modules/tools/profile.c:1645
+msgid "Improve _All"
+msgstr ""
+
+#: modules/tools/profile.c:1866
 msgid "calib-data|None"
 msgstr ""
 
@@ -13714,194 +14490,194 @@ msgstr "값 읽기"
 msgid "Read value under mouse cursor"
 msgstr "마우스 커서 아래 값 읽기"
 
-#: modules/tools/readvalue.c:304
+#: modules/tools/readvalue.c:307
 msgid "Set _Zero"
 msgstr "0값으로 설정"
 
-#: modules/tools/readvalue.c:307
+#: modules/tools/readvalue.c:310
 msgid "Shift plane z=0 to pass through the selected point"
 msgstr ""
 
-#: modules/tools/readvalue.c:315
+#: modules/tools/readvalue.c:318
 msgid "Facet"
 msgstr ""
 
-#: modules/tools/readvalue.c:340
+#: modules/tools/readvalue.c:343
 msgid "Curvatures"
 msgstr ""
 
-#: modules/tools/readvalue.c:382
+#: modules/tools/readvalue.c:386
 msgid "Show _selection"
 msgstr ""
 
-#: modules/tools/roughness.c:282
+#: modules/tools/roughness.c:283
 msgid "Roughness average"
 msgstr ""
 
-#: modules/tools/roughness.c:290
+#: modules/tools/roughness.c:291
 msgid "Root mean square roughness"
 msgstr ""
 
-#: modules/tools/roughness.c:298
+#: modules/tools/roughness.c:299
 msgid "Maximum height of the roughness"
 msgstr ""
 
-#: modules/tools/roughness.c:306
+#: modules/tools/roughness.c:307
 msgid "Maximum roughness valley depth"
 msgstr ""
 
-#: modules/tools/roughness.c:314
+#: modules/tools/roughness.c:315
 msgid "Maximum roughness peak height"
 msgstr ""
 
-#: modules/tools/roughness.c:322 modules/tools/roughness.c:370
+#: modules/tools/roughness.c:323 modules/tools/roughness.c:371
 msgid "Average maximum height of the roughness"
 msgstr ""
 
-#: modules/tools/roughness.c:330
+#: modules/tools/roughness.c:331
 msgid "Average maximum roughness valley depth"
 msgstr ""
 
-#: modules/tools/roughness.c:338
+#: modules/tools/roughness.c:339
 msgid "Average maximum roughness peak height"
 msgstr ""
 
-#: modules/tools/roughness.c:346 modules/tools/roughness.c:354
+#: modules/tools/roughness.c:347 modules/tools/roughness.c:355
 msgid "Average third highest peak to third lowest valley height"
 msgstr ""
 
-#: modules/tools/roughness.c:362
+#: modules/tools/roughness.c:363
 msgid "Average maximum height of the profile"
 msgstr ""
 
-#: modules/tools/roughness.c:378
+#: modules/tools/roughness.c:379
 msgid "Skewness"
 msgstr ""
 
-#: modules/tools/roughness.c:394
+#: modules/tools/roughness.c:395
 msgid "Waviness average"
 msgstr ""
 
-#: modules/tools/roughness.c:402
+#: modules/tools/roughness.c:403
 msgid "Root mean square waviness"
 msgstr ""
 
-#: modules/tools/roughness.c:410
+#: modules/tools/roughness.c:411
 msgid "Waviness maximum height"
 msgstr ""
 
-#: modules/tools/roughness.c:418
+#: modules/tools/roughness.c:419
 msgid "Maximum height of the profile"
 msgstr ""
 
-#: modules/tools/roughness.c:426
+#: modules/tools/roughness.c:427
 msgid "Spatial"
 msgstr ""
 
-#: modules/tools/roughness.c:476
+#: modules/tools/roughness.c:477
 msgid "Average wavelength of the profile"
 msgstr ""
 
-#: modules/tools/roughness.c:484
+#: modules/tools/roughness.c:485
 msgid "Root mean square (RMS) wavelength of the profile"
 msgstr ""
 
-#: modules/tools/roughness.c:492
+#: modules/tools/roughness.c:493
 msgid "Hybrid"
 msgstr ""
 
-#: modules/tools/roughness.c:500
+#: modules/tools/roughness.c:501
 msgid "Average absolute slope"
 msgstr ""
 
-#: modules/tools/roughness.c:508
+#: modules/tools/roughness.c:509
 msgid "Root mean square (RMS) slope"
 msgstr ""
 
-#: modules/tools/roughness.c:524
+#: modules/tools/roughness.c:525
 msgid "Developed profile length"
 msgstr ""
 
-#: modules/tools/roughness.c:532
+#: modules/tools/roughness.c:533
 msgid "Profile length ratio"
 msgstr ""
 
-#: modules/tools/roughness.c:615
+#: modules/tools/roughness.c:616
 msgid "Calculate surface profile parameters."
 msgstr ""
 
-#: modules/tools/roughness.c:648 modules/tools/roughness.c:773
-#: modules/tools/roughness.c:1452
+#: modules/tools/roughness.c:649 modules/tools/roughness.c:774
+#: modules/tools/roughness.c:1479
 msgid "Roughness"
 msgstr ""
 
-#: modules/tools/roughness.c:649
+#: modules/tools/roughness.c:650
 msgid "Calculate roughness parameters"
 msgstr ""
 
-#: modules/tools/roughness.c:771 modules/tools/roughness.c:1450
+#: modules/tools/roughness.c:772 modules/tools/roughness.c:1477
 msgid "Texture"
 msgstr ""
 
-#: modules/tools/roughness.c:772 modules/tools/roughness.c:1451
+#: modules/tools/roughness.c:773 modules/tools/roughness.c:1478
 msgid "Waviness"
 msgstr ""
 
-#: modules/tools/roughness.c:774
+#: modules/tools/roughness.c:775
 msgid "ADF"
 msgstr ""
 
-#: modules/tools/roughness.c:775
+#: modules/tools/roughness.c:776
 msgid "BRC"
 msgstr ""
 
-#: modules/tools/roughness.c:776 modules/tools/roughness.c:1455
+#: modules/tools/roughness.c:777 modules/tools/roughness.c:1482
 msgid "Peak Count"
 msgstr ""
 
-#: modules/tools/roughness.c:838 modules/xyz/xyz_drift.c:1090
+#: modules/tools/roughness.c:839 modules/xyz/xyz_drift.c:1090
 msgid "_Graph:"
 msgstr ""
 
-#: modules/tools/roughness.c:845
+#: modules/tools/roughness.c:847
 msgid "C_ut-off:"
 msgstr ""
 
-#: modules/tools/roughness.c:1324
+#: modules/tools/roughness.c:1345
 msgid "No profile selected."
 msgstr ""
 
-#: modules/tools/roughness.c:1453
+#: modules/tools/roughness.c:1480
 msgid "Amplitude Distribution Function"
 msgstr ""
 
-#: modules/tools/roughness.c:1454
+#: modules/tools/roughness.c:1481
 msgid "The Bearing Ratio Curve"
 msgstr ""
 
-#: modules/tools/roughness.c:1489
+#: modules/tools/roughness.c:1516
 msgid "Surface Profiles"
 msgstr ""
 
-#: modules/tools/roughness.c:1877
+#: modules/tools/roughness.c:1904
 msgid "Save Roughness Parameters"
 msgstr ""
 
-#: modules/tools/roughness.c:1934
+#: modules/tools/roughness.c:1961
 msgid "Roughness Parameters"
 msgstr ""
 
-#: modules/tools/roughness.c:1940
+#: modules/tools/roughness.c:1967
 #, c-format
 msgid "File:              %s\n"
 msgstr ""
 
-#: modules/tools/roughness.c:1944
+#: modules/tools/roughness.c:1971
 #, c-format
 msgid "Data channel:      %s\n"
 msgstr ""
 
-#: modules/tools/roughness.c:1975
+#: modules/tools/roughness.c:2002
 #, c-format
 msgid ""
 "Selected line:     (%s, %s) to (%s, %s) px\n"
@@ -13937,94 +14713,98 @@ msgstr ""
 msgid "_Copy"
 msgstr ""
 
-#: modules/tools/sfunctions.c:181
+#: modules/tools/sfunctions.c:186
 msgid ""
 "Statistical function tool, calculates one-dimensional statistical functions "
 "(height distribution, correlations, PSDF, Minkowski functionals) of selected "
 "part of data."
 msgstr ""
 
-#: modules/tools/sfunctions.c:214
+#: modules/tools/sfunctions.c:219
 msgid "Height distribution"
 msgstr "높이 분포"
 
-#: modules/tools/sfunctions.c:215
+#: modules/tools/sfunctions.c:220
 msgid "Cum. height distribution"
 msgstr ""
 
-#: modules/tools/sfunctions.c:216
+#: modules/tools/sfunctions.c:221
 msgid "Distribution of angles"
 msgstr ""
 
-#: modules/tools/sfunctions.c:217
+#: modules/tools/sfunctions.c:222
 msgid "Cum. distribution of angles"
 msgstr ""
 
-#: modules/tools/sfunctions.c:218
+#: modules/tools/sfunctions.c:223
 msgid "ACF"
 msgstr "ACF"
 
-#: modules/tools/sfunctions.c:219
+#: modules/tools/sfunctions.c:224
 msgid "HHCF"
 msgstr "HHCF"
 
-#: modules/tools/sfunctions.c:220
+#: modules/tools/sfunctions.c:225
 msgid "PSDF"
 msgstr "PSDF"
 
-#: modules/tools/sfunctions.c:221
+#: modules/tools/sfunctions.c:226
 msgid "Radial PSDF"
 msgstr ""
 
-#: modules/tools/sfunctions.c:222
+#: modules/tools/sfunctions.c:227
 msgid "Radial ACF"
 msgstr ""
 
-#: modules/tools/sfunctions.c:223
+#: modules/tools/sfunctions.c:228
 msgid "Minkowski volume"
 msgstr ""
 
-#: modules/tools/sfunctions.c:224
+#: modules/tools/sfunctions.c:229
 msgid "Minkowski boundary"
 msgstr ""
 
-#: modules/tools/sfunctions.c:225
+#: modules/tools/sfunctions.c:230
 msgid "Minkowski connectivity"
 msgstr ""
 
-#: modules/tools/sfunctions.c:251
+#: modules/tools/sfunctions.c:232
+msgid "Area scale graph"
+msgstr ""
+
+#: modules/tools/sfunctions.c:257
 msgid "Statistical Functions"
 msgstr ""
 
-#: modules/tools/sfunctions.c:252
+#: modules/tools/sfunctions.c:258
 msgid "Calculate 1D statistical functions"
 msgstr ""
 
-#: modules/tools/sfunctions.c:504
+#: modules/tools/sfunctions.c:501
 msgid "_Separate uncertainty"
 msgstr ""
 
-#: modules/tools/spectro.c:151
+#: modules/tools/spectro.c:154
 msgid "Point Spectrum, extracts point spectra to a graph."
 msgstr ""
 
-#: modules/tools/spectro.c:190
+#: modules/tools/spectro.c:193
 msgid "Point Spectroscopy"
 msgstr ""
 
-#: modules/tools/spectro.c:191
+#: modules/tools/spectro.c:194
 msgid "Extract and view point spectroscopy data"
 msgstr ""
 
-#: modules/tools/spectro.c:359
+#: modules/tools/spectro.c:362
 msgid "_Separate spectra"
 msgstr ""
 
-#: modules/tools/spectro.c:369
+#: modules/tools/spectro.c:372
 msgid "_Average spectra"
 msgstr ""
 
-#: modules/tools/spectro.c:508
+#: modules/tools/spectro.c:511
 msgid "Spectroscopy"
 msgstr "분광학"
 
@@ -14062,14 +14842,6 @@ msgstr ""
 msgid "No area in the zoom selected."
 msgstr ""
 
-#: modules/tools/stats.c:205
-msgid "Average value:"
-msgstr ""
-
-#: modules/tools/stats.c:206
-msgid "Median:"
-msgstr ""
-
 #: modules/tools/stats.c:207
 msgid "Ra (Sa):"
 msgstr ""
@@ -14082,14 +14854,6 @@ msgstr ""
 msgid "Rms (grain-wise):"
 msgstr ""
 
-#: modules/tools/stats.c:210
-msgid "Skew:"
-msgstr ""
-
-#: modules/tools/stats.c:211
-msgid "Kurtosis:"
-msgstr ""
-
 #: modules/tools/stats.c:212
 msgid "Surface area:"
 msgstr ""
@@ -14098,10 +14862,6 @@ msgstr ""
 msgid "Projected area:"
 msgstr ""
 
-#: modules/tools/stats.c:214
-msgid "Variation:"
-msgstr ""
-
 #: modules/tools/stats.c:217
 msgid "Inclination θ:"
 msgstr ""
@@ -14114,7 +14874,7 @@ msgstr ""
 msgid "Statistics tool."
 msgstr ""
 
-#: modules/tools/stats.c:261 modules/tools/stats.c:1095
+#: modules/tools/stats.c:261 modules/tools/stats.c:1091
 msgid "Statistical Quantities"
 msgstr ""
 
@@ -14122,29 +14882,29 @@ msgstr ""
 msgid "Statistical quantities"
 msgstr ""
 
-#: modules/tools/stats.c:1002
+#: modules/tools/stats.c:998
 msgid "Save Statistical Quantities"
 msgstr ""
 
-#: modules/tools/stats.c:1100
+#: modules/tools/stats.c:1096
 #, c-format
 msgid "File:         %s\n"
 msgstr ""
 
-#: modules/tools/stats.c:1104
+#: modules/tools/stats.c:1100
 #, c-format
 msgid "Data channel: %s\n"
 msgstr ""
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "Yes"
 msgstr "네"
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "No"
 msgstr "아니오"
 
-#: modules/tools/stats.c:1132
+#: modules/tools/stats.c:1128
 #, c-format
 msgid ""
 "Selected area: %s × %s at (%s, %s) px\n"
@@ -14164,182 +14924,179 @@ msgstr "/면적 및 단위(D)..."
 msgid "Volume Dimensions and Units"
 msgstr "3차원 크기 및 단위"
 
-#: modules/volume/volume_calibrate.c:526
+#: modules/volume/volume_calibrate.c:486
 msgid "_Value range:"
 msgstr ""
 
-#: modules/volume/volume_calibrate.c:555
+#: modules/volume/volume_calibrate.c:508
 msgid "Value shi_ft:"
 msgstr ""
 
-#: modules/volume/volume_calibrate.c:601
+#: modules/volume/volume_calibrate.c:542
 msgid "_Value calibration factor:"
 msgstr ""
 
-#: modules/volume/volume_extract.c:223
+#: modules/volume/volume_extract.c:216
 msgid "Shows and/or extracts a section of volume data"
 msgstr ""
 
-#: modules/volume/volume_extract.c:237
-msgid "/Show and _extract..."
+#: modules/volume/volume_extract.c:230
+#, fuzzy
+msgid "/Show and _Extract..."
 msgstr "/보기 또는 추출하기(E)..."
 
-#: modules/volume/volume_extract.c:241
+#: modules/volume/volume_extract.c:234
 msgid "Show and/or extract a section of volume data"
 msgstr "3D데이터에서 한 부분을 보기 또는 추출하기 "
 
-#: modules/volume/volume_extract.c:270
+#: modules/volume/volume_extract.c:263
 msgid "X cross-section"
 msgstr "X축 단면"
 
-#: modules/volume/volume_extract.c:271
+#: modules/volume/volume_extract.c:264
 msgid "Y cross-section"
 msgstr "Y축 단면"
 
-#: modules/volume/volume_extract.c:272
+#: modules/volume/volume_extract.c:265
 msgid "Z cross-section"
 msgstr "Z축 단면"
 
-#: modules/volume/volume_extract.c:273 modules/volume/volume_extract.c:698
+#: modules/volume/volume_extract.c:266 modules/volume/volume_extract.c:684
 msgid "X direction sum"
 msgstr "X축 합"
 
-#: modules/volume/volume_extract.c:274 modules/volume/volume_extract.c:700
+#: modules/volume/volume_extract.c:267 modules/volume/volume_extract.c:686
 msgid "Y direction sum"
 msgstr "Y축 합"
 
-#: modules/volume/volume_extract.c:275 modules/volume/volume_extract.c:702
+#: modules/volume/volume_extract.c:268 modules/volume/volume_extract.c:688
 msgid "Z direction sum"
 msgstr "Z축 합"
 
-#: modules/volume/volume_extract.c:278
+#: modules/volume/volume_extract.c:271
 msgid "X direction"
 msgstr "X축 방향"
 
-#: modules/volume/volume_extract.c:279
+#: modules/volume/volume_extract.c:272
 msgid "Y direction"
 msgstr "Y축 방향"
 
-#: modules/volume/volume_extract.c:280
+#: modules/volume/volume_extract.c:273
 msgid "Z direction"
 msgstr "Z축 방향"
 
-#: modules/volume/volume_extract.c:322
+#: modules/volume/volume_extract.c:315
 msgid "Volume data"
 msgstr "3차원 데이터"
 
-#: modules/volume/volume_extract.c:324
+#: modules/volume/volume_extract.c:317
 msgid "_Load"
 msgstr "불러오기(L)"
 
-#: modules/volume/volume_extract.c:336
+#: modules/volume/volume_extract.c:329
 msgid "_Extract projection"
 msgstr ""
 
-#: modules/volume/volume_extract.c:354
+#: modules/volume/volume_extract.c:347
 msgid "Projections"
 msgstr ""
 
-#: modules/volume/volume_extract.c:404
+#: modules/volume/volume_extract.c:395
 msgid "Z position"
 msgstr "Z 위치"
 
-#: modules/volume/volume_extract.c:409
+#: modules/volume/volume_extract.c:405
 msgid "Shown cut direction:"
 msgstr ""
 
-#: modules/volume/volume_extract.c:419 modules/volume/volume_extract.c:500
-msgid "Show mode:"
-msgstr "모드 보기:"
-
-#: modules/volume/volume_extract.c:490
+#: modules/volume/volume_extract.c:485
 msgid "Graph cut direction:"
 msgstr ""
 
-#: modules/volume/volume_extract.c:525
+#: modules/volume/volume_extract.c:511
 msgid "3D view"
 msgstr "3D 뷰"
 
-#: modules/volume/volume_extract.c:550
+#: modules/volume/volume_extract.c:538
 msgid "Zoom"
 msgstr "확대 보기"
 
-#: modules/volume/volume_extract.c:558
+#: modules/volume/volume_extract.c:545
 msgid "Wireframe threshold"
 msgstr ""
 
-#: modules/volume/volume_extract.c:566
+#: modules/volume/volume_extract.c:552
 msgid "Z scale"
 msgstr "Z축 크기"
 
-#: modules/volume/volume_extract.c:574
+#: modules/volume/volume_extract.c:559
 msgid "Opacity scale"
 msgstr ""
 
-#: modules/volume/volume_extract.c:580
-msgid "apply perspective"
+#: modules/volume/volume_extract.c:565
+msgid "Apply perspective"
 msgstr ""
 
-#: modules/volume/volume_extract.c:589
-msgid "instant 3D render"
+#: modules/volume/volume_extract.c:574
+msgid "Instant 3D render"
 msgstr ""
 
-#: modules/volume/volume_extract.c:598
+#: modules/volume/volume_extract.c:587
 msgid "X view"
 msgstr "X축 시점 보기"
 
-#: modules/volume/volume_extract.c:604
+#: modules/volume/volume_extract.c:592
 msgid "Y view"
 msgstr "Y축 시점 보기"
 
-#: modules/volume/volume_extract.c:610
+#: modules/volume/volume_extract.c:597
 msgid "Z view"
 msgstr "Z축 시점 보기"
 
-#: modules/volume/volume_extract.c:683
+#: modules/volume/volume_extract.c:669
 #, c-format
 msgid "X cross-section at x: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:686
+#: modules/volume/volume_extract.c:672
 #, c-format
 msgid "Y cross-section at y: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:690
+#: modules/volume/volume_extract.c:676
 #, c-format
 msgid "Z cross-section at Z = %g %s (#%d)"
 msgstr ""
 
-#: modules/volume/volume_extract.c:749 modules/volume/volume_slice.c:1264
+#: modules/volume/volume_extract.c:735 modules/volume/volume_slice.c:1278
 #, c-format
 msgid "X graph at y: %d z: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:752 modules/volume/volume_slice.c:1273
+#: modules/volume/volume_extract.c:738 modules/volume/volume_slice.c:1287
 #, c-format
 msgid "Y graph at x: %d z: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:755 modules/volume/volume_slice.c:1255
+#: modules/volume/volume_extract.c:741 modules/volume/volume_slice.c:1269
 #, c-format
 msgid "Z graph at x: %d y: %d"
 msgstr ""
 
-#: modules/volume/volume_extract.c:776
+#: modules/volume/volume_extract.c:762
 msgid "Brick graph"
 msgstr ""
 
-#: modules/volume/volume_extract.c:1056
+#: modules/volume/volume_extract.c:1042
 msgid "Load volume data"
 msgstr ""
 
-#: modules/volume/volume_extract.c:1218
+#: modules/volume/volume_extract.c:1204
 #, c-format
 msgid "Shown range %g to %g"
 msgstr ""
 
-#: modules/volume/volume_extract.c:1911
+#: modules/volume/volume_extract.c:1897
 msgid "Building wireframe model..."
 msgstr ""
 
@@ -14348,100 +15105,103 @@ msgid "Evaluate volume force-distance data"
 msgstr "Volume force-distance 데이터 평가"
 
 #: modules/volume/volume_fdfit.c:213
-msgid "/_Evaluate FD data..."
+#, fuzzy
+msgid "/_Evaluate FD Data..."
 msgstr "/FD 데이터 평가(E)..."
 
 #: modules/volume/volume_fdfit.c:217
 msgid "Evaluate force-distance volume data"
 msgstr "Force-distance volume 데이터 평가"
 
-#: modules/volume/volume_fdfit.c:368
+#: modules/volume/volume_fdfit.c:371
 msgid "Curve _X position:"
 msgstr ""
 
-#: modules/volume/volume_fdfit.c:386
+#: modules/volume/volume_fdfit.c:380
 msgid "Curve _Y position:"
 msgstr ""
 
-#: modules/volume/volume_fdfit.c:535
+#: modules/volume/volume_fdfit.c:511
 msgid "e_stimate"
 msgstr ""
 
-#: modules/volume/volume_invert.c:51
+#: modules/volume/volume_invert.c:39 modules/volume/volumeops.c:39
 msgid "Inverts value in volume data"
 msgstr "3차원 데이터 값 반전"
 
-#: modules/volume/volume_invert.c:65
-msgid "/_Invert value"
+#: modules/volume/volume_invert.c:53
+#, fuzzy
+msgid "/_Invert Value"
 msgstr "/값 반전(I)"
 
-#: modules/volume/volume_invert.c:69
+#: modules/volume/volume_invert.c:57
 msgid "Invert value in volume data"
 msgstr "3차원 데이터 값 반전"
 
-#: modules/volume/volume_kmeans.c:94
+#: modules/volume/volume_kmeans.c:95
 msgid "Calculates K-means clustering on volume data."
 msgstr "3차원 데이터 K-평균 클러스터링 계산"
 
-#: modules/volume/volume_kmeans.c:108
-msgid "/_K-means clustering..."
+#: modules/volume/volume_kmeans.c:109
+#, fuzzy
+msgid "/_K-Means Clustering..."
 msgstr "/K-평균 클러스터링(K)..."
 
-#: modules/volume/volume_kmeans.c:112
+#: modules/volume/volume_kmeans.c:113
 msgid "Calculate K-means clustering on volume data"
 msgstr "3차원 데이터 K-평균 클러스터링 계산"
 
-#: modules/volume/volume_kmeans.c:151
+#: modules/volume/volume_kmeans.c:152
 msgid "K-means"
 msgstr "K-평균"
 
-#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:164
+#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:163
 msgid "_Number of clusters:"
 msgstr "클러스터 개수"
 
-#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:171
+#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:170
 msgid "Convergence _precision digits:"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:184 modules/volume/volume_kmedians.c:178
+#: modules/volume/volume_kmeans.c:183 modules/volume/volume_kmedians.c:176
 msgid "_Max. iterations:"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:189 modules/volume/volume_kmedians.c:183
+#: modules/volume/volume_kmeans.c:187 modules/volume/volume_kmedians.c:181
 msgid "_Normalize"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:195
+#: modules/volume/volume_kmeans.c:193
 #, fuzzy
 msgid "_Remove outliers"
 msgstr "점 제거하기"
 
-#: modules/volume/volume_kmeans.c:208
+#: modules/volume/volume_kmeans.c:202
 #, fuzzy
 msgid "Outliers _threshold:"
 msgstr "Hard threshold(H):"
 
-#: modules/volume/volume_kmeans.c:431
+#: modules/volume/volume_kmeans.c:425
 #, fuzzy
 msgid "K-means iteration..."
 msgstr "/K-평균 클러스터링(K)..."
 
-#: modules/volume/volume_kmeans.c:651
+#: modules/volume/volume_kmeans.c:645
 #, fuzzy, c-format
 msgid "K-means cluster of %s"
 msgstr "%s의 K-평균 "
 
-#: modules/volume/volume_kmeans.c:660
+#: modules/volume/volume_kmeans.c:654
 #, c-format
 msgid "K-means error of %s"
 msgstr "%s의 K-평균 "
 
-#: modules/volume/volume_kmeans.c:670 modules/volume/volume_kmedians.c:514
+#: modules/volume/volume_kmeans.c:664 modules/volume/volume_kmedians.c:512
 #, c-format
 msgid "Pre-normalized intensity of %s"
 msgstr ""
 
-#: modules/volume/volume_kmeans.c:702
+#: modules/volume/volume_kmeans.c:696
 #, c-format
 msgid "K-means center %d"
 msgstr "K-평균 중심 %d"
@@ -14453,7 +15213,7 @@ msgstr "3차원 데이터 K-평균 클러스터링 계산"
 
 #: modules/volume/volume_kmedians.c:102
 #, fuzzy
-msgid "/_K-medians clustering..."
+msgid "/_K-Medians Clustering..."
 msgstr "/K-평균 클러스터링(K)..."
 
 #: modules/volume/volume_kmedians.c:106
@@ -14466,49 +15226,49 @@ msgstr "3차원 데이터 K-평균 클러스터링 계산"
 msgid "K-Medians"
 msgstr "K-평균"
 
-#: modules/volume/volume_kmedians.c:392
+#: modules/volume/volume_kmedians.c:390
 #, fuzzy
 msgid "K-medians iteration..."
 msgstr "/K-평균 클러스터링(K)..."
 
-#: modules/volume/volume_kmedians.c:495
+#: modules/volume/volume_kmedians.c:493
 #, fuzzy, c-format
 msgid "K-medians cluster of %s"
 msgstr "%s의 K-평균 "
 
-#: modules/volume/volume_kmedians.c:504
+#: modules/volume/volume_kmedians.c:502
 #, fuzzy, c-format
 msgid "K-medians error of %s"
 msgstr "%s의 K-평균 "
 
-#: modules/volume/volume_kmedians.c:546
+#: modules/volume/volume_kmedians.c:544
 #, fuzzy, c-format
 msgid "K-medians center %d"
 msgstr "K-평균 중심 %d"
 
-#: modules/volume/volume_linestat.c:171
+#: modules/volume/volume_linestat.c:173
 msgid "Summarizes profiles of volume data to a channel."
 msgstr ""
 
-#: modules/volume/volume_linestat.c:185
+#: modules/volume/volume_linestat.c:187
 msgid "/Summarize _Profiles..."
 msgstr ""
 
-#: modules/volume/volume_linestat.c:189
+#: modules/volume/volume_linestat.c:191
 msgid "Summarize profiles"
 msgstr ""
 
-#: modules/volume/volume_linestat.c:249
+#: modules/volume/volume_linestat.c:251
 #, fuzzy
 msgid "_Extract image"
 msgstr "필터링된 이미지(l)"
 
-#: modules/volume/volume_linestat.c:250
+#: modules/volume/volume_linestat.c:252
 #, fuzzy
 msgid "Set _preview"
 msgstr "미리보기가 불가능합니다. "
 
-#: modules/volume/volume_linestat.c:284
+#: modules/volume/volume_linestat.c:289
 msgid "Summarize Volume Profiles"
 msgstr ""
 
@@ -14535,59 +15295,125 @@ msgstr "이미지 차이점"
 msgid "Line graph"
 msgstr "그래프 자르기"
 
-#: modules/volume/volume_slice.c:290
+#: modules/volume/volume_slice.c:292
 #, fuzzy
 msgid "Slice Volume Data"
 msgstr "3차원 데이터(V)"
 
-#: modules/volume/volume_slice.c:369
+#: modules/volume/volume_slice.c:371
 msgid "_Base plane:"
 msgstr ""
 
-#: modules/volume/volume_slice.c:420
+#: modules/volume/volume_slice.c:422
 msgid "Extract _multiple items"
 msgstr ""
 
-#: modules/volume/volume_slice.c:437
+#: modules/volume/volume_slice.c:439
 #, fuzzy
 msgid "Positions"
 msgstr "위치"
 
-#: modules/volume/volume_slice.c:484
+#: modules/volume/volume_slice.c:492
 #, fuzzy
 msgid "_Z:"
 msgstr "X(X):"
 
-#: modules/volume/volume_slice.c:1156
+#: modules/volume/volume_slice.c:1167
 #, c-format
 msgid "Z slice at %.*f%s%s (#%d)"
 msgstr ""
 
-#: modules/volume/volume_slice.c:1167
+#: modules/volume/volume_slice.c:1178
 #, c-format
 msgid "Y slice at %.*f%s%s (#%d)"
 msgstr ""
 
-#: modules/volume/volume_slice.c:1178
+#: modules/volume/volume_slice.c:1189
 #, c-format
 msgid "X slice at %.*f%s%s (#%d)"
 msgstr ""
 
-#: modules/volume/volume_slice.c:1307
+#: modules/volume/volume_slice.c:1325
 #, fuzzy
 msgid "Volume Z graphs"
 msgstr "3차원 데이터"
 
-#: modules/volume/volume_slice.c:1314
+#: modules/volume/volume_slice.c:1332
 #, fuzzy
 msgid "Volume X graphs"
 msgstr "3차원 데이터"
 
-#: modules/volume/volume_slice.c:1321
+#: modules/volume/volume_slice.c:1339
 #, fuzzy
 msgid "Volume Y graphs"
 msgstr "3차원 데이터"
 
+#: modules/volume/volume_swaxes.c:104
+#, fuzzy
+msgid "Swaps axes of volume data."
+msgstr "3차원 데이터 값 반전"
+
+#: modules/volume/volume_swaxes.c:118
+#, fuzzy
+msgid "/S_wap axes..."
+msgstr "/다른 이름으로 저장(A)..."
+
+#: modules/volume/volume_swaxes.c:122
+#, fuzzy
+msgid "Swap axes"
+msgstr "축 보기(A)"
+
+#: modules/volume/volume_swaxes.c:156
+#, fuzzy
+msgid "X"
+msgstr "X(X):"
+
+#: modules/volume/volume_swaxes.c:157
+msgid "X, reversed"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:158
+#, fuzzy
+msgid "Y"
+msgstr "Y(Y):"
+
+#: modules/volume/volume_swaxes.c:159
+msgid "Y, reversed"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:160
+msgid "Z"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:161
+msgid "Z, reversed"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:175
+msgid "Swap Volume Axes"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:196
+msgid "Current _X axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:204
+msgid "Current _Y axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:212
+msgid "Current _Z axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:219
+#, fuzzy
+msgid "Create new volume data"
+msgstr "3차원 데이터 값 반전"
+
+#: modules/volume/volume_swaxes.c:286
+msgid "Z axis calibration will be lost."
+msgstr ""
+
 #: modules/volume/volume_zcal.c:104
 msgid "Attaches, extracts and removes volume data z-axis calibration."
 msgstr ""
@@ -14658,6 +15484,16 @@ msgid ""
 "differs from the number of planes %d."
 msgstr ""
 
+#: modules/volume/volumeops.c:53
+#, fuzzy
+msgid "/Extract _Preview"
+msgstr "필터링된 이미지(l)"
+
+#: modules/volume/volumeops.c:57
+#, fuzzy
+msgid "Extract volume data preview to an image"
+msgstr "3D 뷰를 이미지로 저장"
+
 #: modules/xyz/xyz_drift.c:267
 msgid "Analyzes drift in XYZ data."
 msgstr ""
@@ -14700,7 +15536,7 @@ msgstr ""
 msgid "Analyze XYZ Drift"
 msgstr ""
 
-#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:391
+#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:406
 msgid "Reset Ran_ges"
 msgstr ""
 
@@ -14709,11 +15545,11 @@ msgstr ""
 msgid "_Guess parameters"
 msgstr "변수"
 
-#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:570
+#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:539
 msgid "_X-range:"
 msgstr ""
 
-#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:592
+#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:561
 msgid "_Y-range:"
 msgstr ""
 
@@ -14797,7 +15633,7 @@ msgstr ""
 msgid "Fitting in progress..."
 msgstr ""
 
-#: modules/xyz/xyz_drift.c:2269 modules/xyz/xyz_raster.c:1012
+#: modules/xyz/xyz_drift.c:2264 modules/xyz/xyz_raster.c:981
 msgid "Physical dimensions are invalid."
 msgstr ""
 
@@ -14842,44 +15678,44 @@ msgstr "데이터"
 msgid "Update X and Y of _all compatible data"
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:197
+#: modules/xyz/xyz_raster.c:194
 msgid "Rasterizes XYZ data to images."
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:211
+#: modules/xyz/xyz_raster.c:208
 #, fuzzy
 msgid "/_Rasterize..."
 msgstr "/병합(M)..."
 
-#: modules/xyz/xyz_raster.c:215
+#: modules/xyz/xyz_raster.c:212
 #, fuzzy
 msgid "Rasterize to image"
 msgstr "3D 뷰를 이미지로 저장"
 
-#: modules/xyz/xyz_raster.c:340
+#: modules/xyz/xyz_raster.c:337
 #, fuzzy
 msgid "Rasterize XYZ Data"
 msgstr "데이터 회전시키기"
 
-#: modules/xyz/xyz_raster.c:354
+#: modules/xyz/xyz_raster.c:351
 #, fuzzy
 msgid "Create Image _Directly"
 msgstr "새 아이템 생성"
 
-#: modules/xyz/xyz_raster.c:360
+#: modules/xyz/xyz_raster.c:357
 msgid "XY points form a regular grid so interpolation is not necessary."
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:381
+#: modules/xyz/xyz_raster.c:392
 #, fuzzy
 msgid "Make Pixels S_quare"
 msgstr "픽셀방식의 정사각형"
 
-#: modules/xyz/xyz_raster.c:642
+#: modules/xyz/xyz_raster.c:611
 msgid "Field"
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:956
+#: modules/xyz/xyz_raster.c:925
 #, c-format
 msgid ""
 "Number of points: %u\n"
@@ -14887,12 +15723,21 @@ msgid ""
 "Added on the boundaries: %u"
 msgstr ""
 
-#: modules/xyz/xyz_raster.c:1091
+#: modules/xyz/xyz_raster.c:1065
 msgid ""
 "XYZ data regularization failed due to numerical instability or was "
 "interrupted."
 msgstr ""
 
+#~ msgid "pixels"
+#~ msgstr "픽셀"
+
+#~ msgid "Show mode:"
+#~ msgstr "모드 보기:"
+
+#~ msgid "Initializing GUI"
+#~ msgstr "GUI 초기화하기"
+
 #~ msgid "_Prune"
 #~ msgstr "제거하다(P)"
 
diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo
new file mode 100644
index 0000000..24bf190
Binary files /dev/null and b/po/pt_BR.gmo differ
diff --git a/po/pt_BR.po b/po/pt_BR.po
new file mode 100644
index 0000000..d04ce36
--- /dev/null
+++ b/po/pt_BR.po
@@ -0,0 +1,16060 @@
+# Brazilian Portuguese translation for Gwyddion
+# This file is distributed under the same license as the Gwyddion package.
+#
+# Fellype do Nascimento <fellypao at yahoo.com.br>, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: Gwyddion 2.46\n"
+"Report-Msgid-Bugs-To: yeti at gwyddion.net\n"
+"POT-Creation-Date: 2017-08-15 17:48+0200\n"
+"PO-Revision-Date: 2016-11-30 12:11-0200\n"
+"Last-Translator: Fellype do Nascimento <fellypao at yahoo.com.br>\n"
+"Language-Team: Brazilian Portuguese <kde-i18n-pt_BR at kde.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Lokalize 1.5\n"
+"X-Language: pt_BR\n"
+"X-Source-Language: C\n"
+
+#: libgwyddion/gwyexpr.c:765
+msgid "Invalid token"
+msgstr "Símbolo inválido"
+
+#: libgwyddion/gwyexpr.c:774
+msgid "Empty expression"
+msgstr "Expressão vazia"
+
+#. TRANSLATORS: %c is replaced with +, -, *, /, etc.
+#: libgwyddion/gwyexpr.c:1017
+#, c-format
+msgid "Missing operator %c argument"
+msgstr "Falta o operador com o argumento %c"
+
+#. TRANSLATORS: %c is replaced with +, -, *, /, etc.
+#: libgwyddion/gwyexpr.c:1024
+#, c-format
+msgid "Invalid operator %c argument"
+msgstr "Operador com argumento %c inválido"
+
+#. TRANSLATORS: %s is replaced with sin, cos, sqrt, etc.
+#: libgwyddion/gwyexpr.c:1074
+#, c-format
+msgid "Missing argument of %s"
+msgstr "Está faltando o argumento de %s"
+
+#. TRANSLATORS: %s is replaced with sin, cos, sqrt, etc.
+#: libgwyddion/gwyexpr.c:1082
+#, c-format
+msgid "Invalid argument of %s"
+msgstr "O argumento de %s é inválido"
+
+#: libgwyddion/gwyexpr.c:1140
+msgid "Missing opening parenthesis"
+msgstr "Está faltando o parenteses de abertura"
+
+#: libgwyddion/gwyexpr.c:1182
+msgid "Missing closing parenthesis"
+msgstr "Está faltando o parenteses de fechamento"
+
+#: libgwyddion/gwyexpr.c:1187
+msgid "Empty parentheses"
+msgstr "Parenteses vazio"
+
+#: libgwyddion/gwyexpr.c:1196
+msgid "Stray comma"
+msgstr "Vírgula perdida"
+
+#: libgwyddion/gwyexpr.c:1235
+#, c-format
+msgid "Stray symbol %d"
+msgstr "Símbolo %d perdido"
+
+#: libgwyddion/gwyexpr.c:1287
+msgid "Trailing garbage"
+msgstr "Lixo perdido"
+
+#: libgwyddion/gwyexpr.c:1307
+msgid "Stack is not executable"
+msgstr "A pilha não é executável"
+
+#: libgwyddion/gwyexpr.c:1412
+msgid "Unresolved identifiers"
+msgstr "Identificadores não resolvidos"
+
+#: libgwyddion/gwyfdcurvepreset.c:787
+msgid "vdW: semisphere"
+msgstr "vdW: semiesfera"
+
+#: libgwyddion/gwyfdcurvepreset.c:801
+msgid "vdW: pyramide"
+msgstr "vdW: pirâmide"
+
+#: libgwyddion/gwyfdcurvepreset.c:813
+msgid "vdW: truncated pyramid"
+msgstr "vdW: pirâmide truncada"
+
+#: libgwyddion/gwyfdcurvepreset.c:825
+msgid "vdW: sphere"
+msgstr "vdW: esfera"
+
+#: libgwyddion/gwyfdcurvepreset.c:837
+msgid "vdW: offset sphere"
+msgstr "vdW: esfera afastada"
+
+#: libgwyddion/gwyfdcurvepreset.c:849
+msgid "vdW: two spheres"
+msgstr "vdW: duas esferas"
+
+#: libgwyddion/gwyfdcurvepreset.c:861
+msgid "vdW: cone"
+msgstr "vdW: cone"
+
+#: libgwyddion/gwyfdcurvepreset.c:873
+msgid "vdW: cylinder"
+msgstr "vdW: cilíndro"
+
+#: libgwyddion/gwyfdcurvepreset.c:885
+msgid "vdW: paraboloid"
+msgstr "vdW: paraboloide"
+
+#: libgwyddion/gwyfdcurvepreset.c:897
+msgid "contact: Hertz (paraboloid)"
+msgstr "contact: Hertz (paraboloide)"
+
+#: libgwyddion/gwyinventory.c:1311 libgwydgets/gwygraphwindow.c:730
+#: app/data-browser-aux.c:1336 app/data-browser-aux.c:1416
+#: app/data-browser-aux.c:1480 app/data-browser.c:2280 app/data-browser.c:2887
+#: app/data-browser.c:3707 app/data-browser.c:3857 app/data-browser.c:4139
+#: app/data-browser.c:4504 app/data-browser.c:4590 app/data-browser.c:5016
+#: app/resource-editor.c:366 modules/file/xyzexport.c:214
+#: modules/process/convolution_filter.c:691
+msgid "Untitled"
+msgstr "Sem título"
+
+#: libgwyddion/gwynlfit.c:426
+msgid "Initial residua evaluation..."
+msgstr "Avaliação de resíduo inicial..."
+
+#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1646
+msgid "Fitting..."
+msgstr "Ajustando..."
+
+#: libgwyddion/gwynlfitpreset.c:1549 libprocess/gwyprocessenums.c:101
+#: libprocess/gwyshapefitpreset.c:347 modules/process/psf-fit.c:157
+msgid "Gaussian"
+msgstr "Gaussiana"
+
+#: libgwyddion/gwynlfitpreset.c:1564
+msgid "Gaussian (PSDF)"
+msgstr "Gaussiana (PSDF)"
+
+#: libgwyddion/gwynlfitpreset.c:1577
+msgid "Gaussian (ACF)"
+msgstr "Gaussiana (ACF)"
+
+#: libgwyddion/gwynlfitpreset.c:1590
+msgid "Gaussian (HHCF)"
+msgstr "Gaussiana (HHCF)"
+
+#: libgwyddion/gwynlfitpreset.c:1603
+msgid "Gaussian (RPSDF)"
+msgstr "Gaussiana (RPSDF)"
+
+#: libgwyddion/gwynlfitpreset.c:1616
+msgid "Two Gaussians (PSDF)"
+msgstr "Duas Gaussianas (PSDF)"
+
+#: libgwyddion/gwynlfitpreset.c:1631 modules/xyz/xyz_drift.c:841
+#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1818
+msgid "Exponential"
+msgstr "Exponencial"
+
+#: libgwyddion/gwynlfitpreset.c:1643
+msgid "Exponential (PSDF)"
+msgstr "Exponencial (PSDF)"
+
+#: libgwyddion/gwynlfitpreset.c:1656
+msgid "Exponential (ACF)"
+msgstr "Exponencial (ACF)"
+
+#: libgwyddion/gwynlfitpreset.c:1668
+msgid "Exponential (HHCF)"
+msgstr "Exponencial (HHCF)"
+
+#: libgwyddion/gwynlfitpreset.c:1681
+msgid "Exponential (RPSDF)"
+msgstr "Exponencial (RPSDF)"
+
+#: libgwyddion/gwynlfitpreset.c:1695
+msgid "K-correlated (PSDF)"
+msgstr ""
+
+#: libgwyddion/gwynlfitpreset.c:1709
+msgid "Polynomial (order 0)"
+msgstr "Polinomial (ordem 0)"
+
+#: libgwyddion/gwynlfitpreset.c:1720 modules/xyz/xyz_drift.c:1804
+msgid "Polynomial (order 1)"
+msgstr "Polinomial (ordem 1)"
+
+#: libgwyddion/gwynlfitpreset.c:1731
+msgid "Polynomial (order 2)"
+msgstr "Polinomial (ordem 2)"
+
+#: libgwyddion/gwynlfitpreset.c:1743
+msgid "Polynomial (order 3)"
+msgstr "Polinomial (ordem 3)"
+
+#: libgwyddion/gwynlfitpreset.c:1756
+msgid "Square wave"
+msgstr "Onda quadrada"
+
+#: libgwyddion/gwynlfitpreset.c:1772
+msgid "Parabolic step"
+msgstr "Passo parabólico"
+
+#: libgwyddion/gwynlfitpreset.c:1788
+msgid "Smooth slanted step"
+msgstr "Passo inclinado suave"
+
+#: libgwyddion/gwynlfitpreset.c:1805
+msgid "Smooth bent step"
+msgstr "Passo encurvado suave"
+
+#: libgwyddion/gwynlfitpreset.c:1821
+#, fuzzy
+msgid "Boltzmann bent step"
+msgstr "Passo encurvado suave"
+
+#: libgwyddion/gwynlfitpreset.c:1837
+msgid "Power"
+msgstr "Potência"
+
+#: libgwyddion/gwynlfitpreset.c:1849 libprocess/gwyshapefitpreset.c:348
+msgid "Lorentzian"
+msgstr "Lorentziana"
+
+#: libgwyddion/gwynlfitpreset.c:1863
+msgid "Sinc"
+msgstr "Sinc"
+
+#: libprocess/cdline.c:571
+msgid "Edge height (right)"
+msgstr "Altura da borda (direita)"
+
+#: libprocess/cdline.c:572 libprocess/cdline.c:581
+msgid "Edge"
+msgstr "Borda"
+
+#: libprocess/cdline.c:580
+msgid "Edge height (left)"
+msgstr "Altura da borda (esquerda)"
+
+#: libprocess/cdline.c:589
+msgid "Step height (positive)"
+msgstr "Altura do passo (positivo)"
+
+#: libprocess/cdline.c:590 libprocess/cdline.c:599
+#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:163
+msgid "Line"
+msgstr "Linha"
+
+#: libprocess/cdline.c:598
+msgid "Step height (negative)"
+msgstr "Altura do passo (negativo)"
+
+#: libprocess/cdline.c:607
+msgid "Circle (down)"
+msgstr "Círculo (abaixo)"
+
+#: libprocess/cdline.c:608 libprocess/cdline.c:617
+#: libgwydgets/gwygraphareadialog.c:550 modules/process/hough.c:164
+msgid "Circle"
+msgstr "Círculo"
+
+#: libprocess/cdline.c:616
+msgid "Circle (up)"
+msgstr "Círculo (acima)"
+
+#: libprocess/gwygrainvalue.c:62
+msgid "Grain number"
+msgstr "Número do grão"
+
+#: libprocess/gwygrainvalue.c:71 modules/process/curvature.c:128
+msgid "Center x position"
+msgstr "Posição do centro x"
+
+#: libprocess/gwygrainvalue.c:80 modules/process/curvature.c:129
+msgid "Center y position"
+msgstr "Posição do centro y"
+
+#: libprocess/gwygrainvalue.c:89
+msgid "Minimum value"
+msgstr "Valor mínimo"
+
+#: libprocess/gwygrainvalue.c:98
+msgid "Maximum value"
+msgstr "Valor máximo"
+
+#: libprocess/gwygrainvalue.c:107 modules/process/bdep_synth.c:133
+#: modules/tools/filter.c:238
+msgid "Mean value"
+msgstr "Valor médio"
+
+#: libprocess/gwygrainvalue.c:116 modules/tools/filter.c:239
+msgid "Median value"
+msgstr "Valor mediano"
+
+#: libprocess/gwygrainvalue.c:125
+msgid "Minimum value on boundary"
+msgstr "Valor mínimo na fronteira"
+
+#: libprocess/gwygrainvalue.c:134
+msgid "Maximum value on boundary"
+msgstr "Valor máximo na fronteira"
+
+#: libprocess/gwygrainvalue.c:143
+msgid "Pixel area"
+msgstr "Área do pixel"
+
+#: libprocess/gwygrainvalue.c:152
+msgid "Projected area"
+msgstr "Área projetada"
+
+#: libprocess/gwygrainvalue.c:161
+msgid "Surface area"
+msgstr "Área da superfície"
+
+#: libprocess/gwygrainvalue.c:170
+msgid "Equivalent square side"
+msgstr "Lado equivalente do quadrado"
+
+#: libprocess/gwygrainvalue.c:179
+msgid "Equivalent disc radius"
+msgstr "Raio equivalente do disco"
+
+#: libprocess/gwygrainvalue.c:188
+msgid "Area above half-height"
+msgstr "Área sobre a meia altura"
+
+#: libprocess/gwygrainvalue.c:197
+msgid "Area of convex hull"
+msgstr "Área da casca convexa"
+
+#. TRANSLATORS: Grain volume calculated using basis (foot) set to
+#. * zero.
+#: libprocess/gwygrainvalue.c:208
+msgid "Zero basis volume"
+msgstr "Volume da base zero"
+
+#. TRANSLATORS: Grain volume calculated using basis (foot) set to the
+#. * grain minimum.
+#: libprocess/gwygrainvalue.c:219
+msgid "Grain minimum basis volume"
+msgstr "Volume base mínimo do grão"
+
+#. TRANSLATORS: Grain volume calculated using basis (foot) set to the
+#. * Laplacian background.
+#: libprocess/gwygrainvalue.c:230
+msgid "Laplacian background basis volume"
+msgstr "Volume base do fundo Laplaciano"
+
+#: libprocess/gwygrainvalue.c:239
+msgid "Projected boundary length"
+msgstr "Comprimento da fronteira projetada"
+
+#: libprocess/gwygrainvalue.c:248
+msgid "Minimum bounding size"
+msgstr "Tamanho mínimo comprometido"
+
+#: libprocess/gwygrainvalue.c:257
+msgid "Minimum bounding direction"
+msgstr "Direção mínima comprometida"
+
+#: libprocess/gwygrainvalue.c:266
+msgid "Maximum bounding size"
+msgstr "Tamanho máximo comprometido"
+
+#: libprocess/gwygrainvalue.c:275
+msgid "Maximum bounding direction"
+msgstr "Direção máxima comprometida"
+
+#: libprocess/gwygrainvalue.c:284
+msgid "Maximum inscribed disc radius"
+msgstr "Máximo raio do disco inscrito"
+
+#: libprocess/gwygrainvalue.c:293
+msgid "Maximum inscribed disc center x position"
+msgstr "Posição x máxima do centro do disco inscrito"
+
+#: libprocess/gwygrainvalue.c:302
+msgid "Maximum inscribed disc center y position"
+msgstr "Posição y máxima do centro do disco inscrito"
+
+#: libprocess/gwygrainvalue.c:311
+msgid "Minimum circumcircle radius"
+msgstr "Raio mínimo da circunferência"
+
+#: libprocess/gwygrainvalue.c:320
+msgid "Minimum circumcircle center x position"
+msgstr "Posição x mínima do centro da circunferência"
+
+#: libprocess/gwygrainvalue.c:329
+msgid "Minimum circumcircle center y position"
+msgstr "Posição y mínima do centro da circunferência"
+
+#: libprocess/gwygrainvalue.c:338
+msgid "Mean radius"
+msgstr "Raio médio"
+
+#: libprocess/gwygrainvalue.c:347 modules/tools/readvalue.c:322
+msgid "Inclination θ"
+msgstr "Inclinação θ"
+
+#: libprocess/gwygrainvalue.c:356 modules/tools/readvalue.c:332
+msgid "Inclination φ"
+msgstr "Inclinação φ"
+
+#: libprocess/gwygrainvalue.c:365
+msgid "Curvature center x position"
+msgstr "Posição x do centro da curvatura"
+
+#: libprocess/gwygrainvalue.c:374
+msgid "Curvature center y position"
+msgstr "Posição y do centro da curvatura"
+
+#: libprocess/gwygrainvalue.c:383
+msgid "Curvature center z value"
+msgstr "Valor z do centro da curvatura"
+
+#: libprocess/gwygrainvalue.c:392 modules/tools/readvalue.c:347
+msgid "Curvature 1"
+msgstr "Curvatura 1"
+
+#: libprocess/gwygrainvalue.c:401 modules/tools/readvalue.c:357
+msgid "Curvature 2"
+msgstr "Curvatura 2"
+
+#: libprocess/gwygrainvalue.c:410
+msgid "Curvature angle 1"
+msgstr "Ângulo da curvatura  1"
+
+#: libprocess/gwygrainvalue.c:419
+msgid "Curvature angle 2"
+msgstr "Ângulo da curvatura  2"
+
+#: libprocess/gwygrainvalue.c:428
+msgid "Major semiaxis of equivalent ellipse"
+msgstr "Semi eixo principal da elipse equivalente"
+
+#: libprocess/gwygrainvalue.c:437
+msgid "Minor semiaxis of equivalent ellipse"
+msgstr "Semi eixo secundário da elipse equivalente"
+
+#: libprocess/gwygrainvalue.c:446
+msgid "Orientation of equivalent ellipse"
+msgstr "Orientação da elipse equivalente"
+
+#: libprocess/gwygrainvalue.c:1118
+msgid "Id"
+msgstr "Id"
+
+#: libprocess/gwygrainvalue.c:1119 modules/graph/graph_peaks.c:154
+#: modules/process/extract_path.c:391 modules/process/wave_synth.c:513
+#: modules/tools/readvalue.c:253
+msgid "Position"
+msgstr "Posição"
+
+#: libprocess/gwygrainvalue.c:1120 app/meta.c:411 modules/file/imgexport.c:4573
+#: modules/process/curvature.c:759 modules/tools/level3.c:475
+#: modules/tools/readvalue.c:290
+msgid "Value"
+msgstr "Valor"
+
+#: libprocess/gwygrainvalue.c:1121
+msgid "Area"
+msgstr "Área"
+
+#: libprocess/gwygrainvalue.c:1122 app/data-browser.c:5624 app/toolbox.c:115
+msgid "Volume"
+msgstr "Volume"
+
+#: libprocess/gwygrainvalue.c:1123
+msgid "Boundary"
+msgstr "Fronteira"
+
+#: libprocess/gwygrainvalue.c:1124 modules/process/pat_synth.c:830
+#: modules/process/pat_synth.c:1132 modules/process/pat_synth.c:1467
+#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:149
+msgid "Slope"
+msgstr "Inclinação"
+
+#: libprocess/gwygrainvalue.c:1125 modules/process/curvature.c:212
+#: modules/process/curvature.c:615
+msgid "Curvature"
+msgstr "Curvatura"
+
+#: libprocess/gwygrainvalue.c:1126
+msgid "Moment"
+msgstr "Momento"
+
+#: libprocess/gwygrainvalue.c:1130
+msgid "User"
+msgstr "Usuário"
+
+#: libprocess/gwyprocessenums.c:44 modules/process/preview.h:263
+msgid "Union"
+msgstr "União"
+
+#: libprocess/gwyprocessenums.c:45 modules/process/preview.h:255
+msgid "Intersection"
+msgstr "Intersecção"
+
+#: libprocess/gwyprocessenums.c:79
+msgid "Detected"
+msgstr "Detectado"
+
+#: libprocess/gwyprocessenums.c:80
+msgid "Parallel"
+msgstr "Paralelo"
+
+#: libprocess/gwyprocessenums.c:81
+msgid "Triangular"
+msgstr "Triangular"
+
+#: libprocess/gwyprocessenums.c:82
+msgid "symmetry|Square"
+msgstr "simetria|Quadrada"
+
+#: libprocess/gwyprocessenums.c:83
+msgid "Rhombic"
+msgstr "Rômbico"
+
+#: libprocess/gwyprocessenums.c:84
+msgid "Hexagonal"
+msgstr "Hexagonal"
+
+#: libprocess/gwyprocessenums.c:102
+msgid "Hat"
+msgstr "Chapéu"
+
+#: libprocess/gwyprocessenums.c:126
+#: libgwydgets/gwygraphwindowmeasuredialog.c:52
+#: modules/process/convolution_filter.c:412
+msgid "Horizontal"
+msgstr "Horizontal"
+
+#: libprocess/gwyprocessenums.c:127 modules/process/convolution_filter.c:428
+msgid "Vertical"
+msgstr "Vertical"
+
+#: libprocess/gwyprocessenums.c:144
+msgid "Haar"
+msgstr "A sua"
+
+#: libprocess/gwyprocessenums.c:145
+msgid "Daubechies 4"
+msgstr "Daubechies 4"
+
+#: libprocess/gwyprocessenums.c:146
+msgid "Daubechies 6"
+msgstr "Daubechies 6"
+
+#: libprocess/gwyprocessenums.c:147
+msgid "Daubechies 8"
+msgstr "Daubechies 8"
+
+#: libprocess/gwyprocessenums.c:148
+msgid "Daubechies 12"
+msgstr "Daubechies 12"
+
+#: libprocess/gwyprocessenums.c:149
+msgid "Daubechies 20"
+msgstr "Daubechies 20"
+
+#: libprocess/gwyprocessenums.c:166
+msgid "Universal"
+msgstr "Universal"
+
+#: libprocess/gwyprocessenums.c:167
+msgid "Scale adaptive"
+msgstr "Escala adaptável"
+
+#: libprocess/gwyprocessenums.c:168
+msgid "Scale and space adaptive"
+msgstr "Escala e espaço adaptáveis"
+
+#. TRANSLATORS: Interpolation type (AKA nearest neighbour)
+#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3756
+#: modules/xyz/xyz_raster.c:609
+msgid "Round"
+msgstr "Arredondar"
+
+#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3757
+#: modules/xyz/xyz_raster.c:610
+msgid "Linear"
+msgstr "Linear"
+
+#: libprocess/gwyprocessenums.c:209
+msgid "Key"
+msgstr "Chave"
+
+#: libprocess/gwyprocessenums.c:210
+msgid "BSpline"
+msgstr "BSpline"
+
+#: libprocess/gwyprocessenums.c:211
+msgid "OMOMS"
+msgstr "OMOMS"
+
+#: libprocess/gwyprocessenums.c:212
+msgid "NNA"
+msgstr "NNA"
+
+#: libprocess/gwyprocessenums.c:213
+msgid "Schaum"
+msgstr "Schaum"
+
+#: libprocess/gwyprocessenums.c:245
+msgid "windowing|None"
+msgstr "janela|Nenhuma"
+
+#: libprocess/gwyprocessenums.c:246
+msgid "Hann"
+msgstr "Hann"
+
+#: libprocess/gwyprocessenums.c:247
+msgid "Hamming"
+msgstr "Hamming"
+
+#: libprocess/gwyprocessenums.c:248
+msgid "Blackmann"
+msgstr "Blackmann"
+
+#: libprocess/gwyprocessenums.c:249
+msgid "Lanczos"
+msgstr "Lanczos"
+
+#: libprocess/gwyprocessenums.c:250
+msgid "Welch"
+msgstr "Welch"
+
+#: libprocess/gwyprocessenums.c:251
+msgid "Rect"
+msgstr "Rect"
+
+#: libprocess/gwyprocessenums.c:252
+msgid "Nuttall"
+msgstr "Nuttall"
+
+#: libprocess/gwyprocessenums.c:253
+msgid "Flat-top"
+msgstr "Topo-plano"
+
+#: libprocess/gwyprocessenums.c:254
+msgid "Kaiser 2.5"
+msgstr "Kaiser 2.5"
+
+#: libprocess/gwyprocessenums.c:271
+msgid "correlation|Normal"
+msgstr "correlação|Normal"
+
+#: libprocess/gwyprocessenums.c:272
+msgid "FFT"
+msgstr "FFT"
+
+#: libprocess/gwyprocessenums.c:273
+msgid "Phase only"
+msgstr "Apenas fase"
+
+#: libprocess/gwyprocessenums.c:306
+msgid "Exclude masked region"
+msgstr "Excluir região mascarada"
+
+#: libprocess/gwyprocessenums.c:307
+msgid "Include only masked region"
+msgstr "Incluir somente região mascarada"
+
+#: libprocess/gwyprocessenums.c:308
+msgid "Use entire image (ignore mask)"
+msgstr "Usar imagem inteira (ignorar máscara)"
+
+#: libprocess/gwyprocessenums.c:604
+msgid "distance|City-block"
+msgstr "distância|Bloco-cidade"
+
+#: libprocess/gwyprocessenums.c:605
+msgid "distance|Chess"
+msgstr "distância|Xadrêz"
+
+#: libprocess/gwyprocessenums.c:606
+msgid "distance|Octagonal 4,8"
+msgstr "distância|Octagonal 4,8"
+
+#: libprocess/gwyprocessenums.c:607
+msgid "distance|Octagonal 8,4"
+msgstr "distância|Octagonal 8,4"
+
+#: libprocess/gwyprocessenums.c:608
+msgid "distance|Octagonal"
+msgstr "distância|Octagonal"
+
+#: libprocess/gwyprocessenums.c:609
+msgid "distance|Euclidean"
+msgstr "distância|Euclidiana"
+
+#: libprocess/gwyshapefitpreset.c:342
+msgid "Grating (simple)"
+msgstr "Gradeamento (simples)"
+
+#: libprocess/gwyshapefitpreset.c:343
+msgid "Grating (3-level)"
+msgstr "Gradeamento (3 níveis)"
+
+#: libprocess/gwyshapefitpreset.c:344 modules/process/pat_synth.c:215
+msgid "Holes"
+msgstr "Buracos"
+
+#: libprocess/gwyshapefitpreset.c:345
+msgid "Sphere"
+msgstr "Esfera"
+
+#: libprocess/gwyshapefitpreset.c:346
+msgid "Cylinder (lying)"
+msgstr "Cilindro (deitado)"
+
+#: libprocess/gwyshapefitpreset.c:349
+msgid "Pyramid (diamond)"
+msgstr "Pirâmide (diamante)"
+
+#: libprocess/gwyshapefitpreset.c:350
+#, fuzzy
+msgid "Parabolic bump"
+msgstr "Passo parabólico"
+
+#: libprocess/gwyshapefitpreset.c:351
+msgid "Ring"
+msgstr "Anel"
+
+#: libprocess/morph_lib.c:169 libprocess/tip.c:1052
+msgid "Dilation..."
+msgstr "Dilatação..."
+
+#: libprocess/morph_lib.c:235 libprocess/tip.c:1173
+msgid "Erosion..."
+msgstr "Erosão..."
+
+#: libprocess/morph_lib.c:305
+msgid "Certainty map..."
+msgstr "Mapa de certeza..."
+
+#: libprocess/morph_lib.c:406 libprocess/morph_lib.c:553
+#, c-format
+msgid "Iterating estimate (iteration %d)..."
+msgstr "Estimando interação (interação %d)..."
+
+#: libprocess/morph_lib.c:415 libprocess/morph_lib.c:574
+#, c-format
+msgid "One image location produced refinement"
+msgid_plural "%d image locations produced refinement"
+msgstr[0] "Um refinamento local de imagem produzido"
+msgstr[1] "%d refinamentos locais de imagem produzidos"
+
+#: libprocess/morph_lib.c:514
+msgid "Searching for local maxima..."
+msgstr "Procurando por máximo local..."
+
+#: libprocess/morph_lib.c:536
+#, c-format
+msgid "Found one internal local maximum"
+msgid_plural "Found %d internal local maxima"
+msgstr[0] "Um máximo local interno encontrado"
+msgstr[1] "%d máximos locais internos encontrados"
+
+#: libprocess/tip.c:431
+msgid "Pyramid"
+msgstr "Pirâmide"
+
+#: libprocess/tip.c:432 libprocess/tip.c:438 libprocess/tip.c:444
+msgid "Pyramidal"
+msgstr "Piramidal"
+
+#: libprocess/tip.c:437
+msgid "Contact"
+msgstr "Contato"
+
+#: libprocess/tip.c:443
+msgid "Noncontact"
+msgstr "Sem contato"
+
+#: libprocess/tip.c:449
+msgid "Delta function"
+msgstr "Função delta"
+
+#: libprocess/tip.c:450
+msgid "Analytical"
+msgstr "Analítico"
+
+#: libprocess/tip.c:455 modules/process/fibre_synth.c:259
+msgid "Parabola"
+msgstr "Parábola"
+
+#: libprocess/tip.c:456 libprocess/tip.c:462
+msgid "Symmetric"
+msgstr "Simétrico"
+
+#: libprocess/tip.c:461
+msgid "Cone"
+msgstr "Cone"
+
+#: libprocess/tip.c:467
+msgid "Elliptical parabola"
+msgstr ""
+
+#: libprocess/tip.c:468
+#, fuzzy
+msgid "Asymmetric"
+msgstr "Simétrico"
+
+#: libprocess/tip.c:1348 libprocess/tip.c:1376 libprocess/tip.c:1425
+#: libprocess/tip.c:1452
+msgid "Converting fields"
+msgstr "Convertendo campos"
+
+#: libprocess/tip.c:1358
+msgid "Starting partial estimation"
+msgstr "Iniciando estimativa parcial"
+
+#: libprocess/tip.c:1435
+msgid "Starting full estimation"
+msgstr "Iniciando estimativa completa"
+
+#: libprocess/triangulation.c:2084 modules/process/calcoefs_view.c:793
+#: modules/process/lat_synth.c:1178
+msgid "Triangulating..."
+msgstr "Triangulando..."
+
+#: libgwydgets/gwy3dwindow.c:575
+msgid "Rotate view (R)"
+msgstr "Girar visão (R)"
+
+#: libgwydgets/gwy3dwindow.c:580
+msgid "Scale view as a whole (S)"
+msgstr "Visualizar escala como um todo (S)"
+
+#: libgwydgets/gwy3dwindow.c:585
+msgid "Scale value range (V)"
+msgstr "Intervalo de valor da escala (V)"
+
+#: libgwydgets/gwy3dwindow.c:590
+msgid "Move light source (L)"
+msgstr "Mover fonte de luz (L)"
+
+#: libgwydgets/gwy3dwindow.c:666
+msgid "Show full controls"
+msgstr "Mostrar todos os controles"
+
+#: libgwydgets/gwy3dwindow.c:691
+msgid "Hide full controls"
+msgstr "Esconder todos os controles"
+
+#: libgwydgets/gwy3dwindow.c:707 modules/file/imgexport.c:4745
+#: modules/process/fit-shape.c:462
+msgid "adjective|Basic"
+msgstr "adjetivo|Básico"
+
+#: libgwydgets/gwy3dwindow.c:712
+msgid "Light & Material"
+msgstr "Luz & Material"
+
+#: libgwydgets/gwy3dwindow.c:717
+msgid "Labels"
+msgstr "Rótulos"
+
+#: libgwydgets/gwy3dwindow.c:722
+#, fuzzy
+msgid "Colorbar"
+msgstr "Cor"
+
+#: libgwydgets/gwy3dwindow.c:838 modules/process/facet_analysis.c:335
+#: modules/process/facet_analysis.c:351 modules/process/shade.c:253
+#: modules/process/tilt.c:223
+msgid "φ:"
+msgstr "φ:"
+
+#: libgwydgets/gwy3dwindow.c:838 libgwydgets/gwy3dwindow.c:843
+#: libgwydgets/gwy3dwindow.c:1013 libgwydgets/gwy3dwindow.c:1020
+#: modules/process/correct_affine.c:461 modules/process/facet_analysis.c:238
+#: modules/process/facet_analysis.c:370 modules/process/indent_analyze.c:438
+#: modules/process/measure_lattice.c:381 modules/process/rotate.c:264
+#: modules/process/shade.c:245 modules/process/shade.c:253
+#: modules/process/synth.h:379 modules/process/synth.h:410
+#: modules/process/tilt.c:211 modules/process/tilt.c:223
+#: modules/process/tip_model.c:234 modules/process/tip_model.c:240
+#: modules/process/unrotate.c:334 modules/tools/distance.c:197
+#: modules/tools/readvalue.c:223 modules/tools/stats.c:319
+msgid "deg"
+msgstr "grau"
+
+#: libgwydgets/gwy3dwindow.c:843 modules/process/facet_analysis.c:334
+#: modules/process/facet_analysis.c:350 modules/process/shade.c:245
+#: modules/process/tilt.c:211
+msgid "θ:"
+msgstr "θ:"
+
+#: libgwydgets/gwy3dwindow.c:849 modules/process/cwt.c:151
+msgid "_Scale:"
+msgstr "_Escala:"
+
+#: libgwydgets/gwy3dwindow.c:856
+msgid "_Value scale:"
+msgstr "Escala de _valor:"
+
+#: libgwydgets/gwy3dwindow.c:862
+msgid "Ph_ysical scale:"
+msgstr "Escala fís_ica:"
+
+#: libgwydgets/gwy3dwindow.c:876
+msgid "verb|Set"
+msgstr "Definir"
+
+#: libgwydgets/gwy3dwindow.c:886
+msgid "Line _width:"
+msgstr "Larg_ura da linha:"
+
+#: libgwydgets/gwy3dwindow.c:886 libgwydgets/gwy3dwindow.c:1194
+#: libgwydgets/gwy3dwindow.c:1204 libgwydgets/gwy3dwindow.c:1235
+#: libgwydgets/gwygraphareadialog.c:157 libgwydgets/gwygraphareadialog.c:173
+#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
+#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
+#: modules/process/angle_dist.c:188 modules/process/angle_dist.c:213
+#: modules/process/col_synth.c:486 modules/process/crosscor.c:252
+#: modules/process/crosscor.c:260 modules/process/crosscor.c:276
+#: modules/process/crosscor.c:284 modules/process/crosscor.c:300
+#: modules/process/crosscor.c:308 modules/process/cwt.c:151
+#: modules/process/dimensions.h:88 modules/process/edge.c:672
+#: modules/process/entropy.c:242 modules/process/extend.c:220
+#: modules/process/extend.c:227 modules/process/extend.c:234
+#: modules/process/extend.c:241 modules/process/facet_analysis.c:362
+#: modules/process/fbm_synth.c:383 modules/process/hough.c:203
+#: modules/process/local_contrast.c:146 modules/process/mark_disconn.c:263
+#: modules/process/mask_morph.c:237 modules/process/median-bg.c:209
+#: modules/process/neural.c:623 modules/process/neural.c:631
+#: modules/process/psdf_logphi.c:276 modules/process/rank.c:188
+#: modules/process/scale.c:237 modules/process/scale.c:246
+#: modules/process/scars.c:353 modules/process/scars.c:361
+#: modules/process/semsim.c:227 modules/process/slope_dist.c:365
+#: modules/process/slope_dist.c:393 modules/process/sphere-revolve.c:346
+#: modules/process/straighten_path.c:278 modules/process/synth.h:280
+#: modules/process/synth.h:501 modules/process/tip_blind.c:334
+#: modules/process/tip_blind.c:342 modules/process/volumize_layers.c:240
+#: modules/process/volumize_layers.c:245 modules/process/volumize_layers.c:250
+#: modules/process/wpour_mark.c:320 modules/tools/filter.c:291
+#: modules/tools/level3.c:244 modules/tools/maskedit.c:528
+#: modules/tools/maskedit.c:629 modules/tools/pathlevel.c:256
+#: modules/tools/profile.c:377 modules/tools/profile.c:503
+#: modules/tools/readvalue.c:222 modules/tools/readvalue.c:378
+#: modules/tools/roughness.c:868 modules/volume/volume_slice.c:446
+#: modules/volume/volume_slice.c:469 modules/volume/volume_slice.c:492
+#: modules/xyz/xyz_drift.c:738 modules/xyz/xyz_drift.c:753
+#: modules/xyz/xyz_raster.c:382 modules/xyz/xyz_raster.c:388
+msgid "px"
+msgstr "px"
+
+#: libgwydgets/gwy3dwindow.c:891
+msgid "Show _axes"
+msgstr "Mostrar ei_xos"
+
+#: libgwydgets/gwy3dwindow.c:900
+msgid "Show _labels"
+msgstr "Mostrar _rótulos"
+
+#: libgwydgets/gwy3dwindow.c:909
+msgid "_Orthographic projection"
+msgstr "Projeção _ortográfica"
+
+#: libgwydgets/gwy3dwindow.c:918
+msgid "_Hide masked"
+msgstr "Esconder _máscarado"
+
+#: libgwydgets/gwy3dwindow.c:934
+msgid "_Lighting"
+msgstr "I_luminação"
+
+#: libgwydgets/gwy3dwindow.c:935
+msgid "_Gradient"
+msgstr "_Gradiente"
+
+#: libgwydgets/gwy3dwindow.c:936
+msgid "_Overlay"
+msgstr "Revestiment_o"
+
+#: libgwydgets/gwy3dwindow.c:937
+msgid "_Overlay - no light"
+msgstr "Revestiment_o - sem luz"
+
+#: libgwydgets/gwy3dwindow.c:992
+msgid "_Material:"
+msgstr "_Material:"
+
+#: libgwydgets/gwy3dwindow.c:1013
+msgid "_Light φ:"
+msgstr "_Luz φ:"
+
+#: libgwydgets/gwy3dwindow.c:1020
+msgid "L_ight θ:"
+msgstr "L_uz θ:"
+
+#: libgwydgets/gwy3dwindow.c:1052 libgwydgets/gwy3dwindow.c:1243
+#: app/toolbox-editor.c:216 modules/file/hdrimage.cc:2213
+#: modules/file/imgexport.c:4708 modules/file/pixmap.c:789
+#: modules/file/rawfile.c:424 modules/process/angle_dist.c:172
+#: modules/process/bdep_synth.c:341 modules/process/calcoefs_new.c:371
+#: modules/process/calibrate.c:383 modules/process/col_synth.c:392
+#: modules/process/correct_affine.c:346 modules/process/curvature.c:617
+#: modules/process/cwt.c:135 modules/process/deposit_synth.c:350
+#: modules/process/diff_synth.c:411 modules/process/domain_synth.c:354
+#: modules/process/drift.c:245 modules/process/dwt.c:166
+#: modules/process/dwtanisotropy.c:184 modules/process/edge.c:638
+#: modules/process/extend.c:192 modules/process/facet-level.c:193
+#: modules/process/facet_analysis.c:275 modules/process/fbm_synth.c:303
+#: modules/process/fft.c:336 modules/process/fft_filter_2d.c:417
+#: modules/process/fft_synth.c:341 modules/process/fibre_synth.c:422
+#: modules/process/fractal.c:228 modules/process/grain_edge.c:212
+#: modules/process/grain_mark.c:246 modules/process/grain_wshed.c:168
+#: modules/process/hough.c:174 modules/process/lat_synth.c:567
+#: modules/process/latsim.c:159 modules/process/level.c:245
+#: modules/process/linematch.c:771 modules/process/lno_synth.c:431
+#: modules/process/local_contrast.c:130 modules/process/logistic.c:234
+#: modules/process/mark_disconn.c:208 modules/process/mask_distribute.c:152
+#: modules/process/measure_lattice.c:246 modules/process/median-bg.c:180
+#: modules/process/mfm_current.c:332 modules/process/mfm_field.c:281
+#: modules/process/mfm_findshift.c:230 modules/process/mfm_parallel.c:333
+#: modules/process/mfm_shift.c:170 modules/process/noise_synth.c:334
+#: modules/process/obj_synth.c:438 modules/process/pat_synth.c:385
+#: modules/process/phase_synth.c:205 modules/process/pid.c:197
+#: modules/process/polydistort.c:210 modules/process/polylevel.c:373
+#: modules/process/psdf_logphi.c:249 modules/process/rank.c:158
+#: modules/process/rotate.c:243 modules/process/scale.c:196
+#: modules/process/scars.c:317 modules/process/semsim.c:211
+#: modules/process/shade.c:210 modules/process/slope_dist.c:275
+#: modules/process/sphere-revolve.c:317 modules/process/straighten_path.c:248
+#: modules/process/tilt.c:161 modules/process/tip_model.c:167
+#: modules/process/unrotate.c:220 modules/process/volumize_layers.c:221
+#: modules/process/wave_synth.c:368 modules/process/wpour_mark.c:278
+#: modules/volume/volume_calibrate.c:370 modules/volume/volume_extract.c:324
+#: modules/volume/volume_kmeans.c:154 modules/volume/volume_kmedians.c:147
+#: modules/volume/volume_linestat.c:297 modules/volume/volume_slice.c:294
+msgid "_Reset"
+msgstr "_Reiniciar"
+
+#: libgwydgets/gwy3dwindow.c:1141
+msgid "X-axis"
+msgstr "Eixo x"
+
+#: libgwydgets/gwy3dwindow.c:1142
+msgid "Y-axis"
+msgstr "Eixo y"
+
+#: libgwydgets/gwy3dwindow.c:1143
+msgid "Minimum z value"
+msgstr "Valor mínimo de z"
+
+#: libgwydgets/gwy3dwindow.c:1144
+msgid "Maximum z value"
+msgstr "Valor máximo de z"
+
+#: libgwydgets/gwy3dwindow.c:1167 modules/file/imgexport.c:3806
+msgid "_Label:"
+msgstr "Rótu_lo:"
+
+#: libgwydgets/gwy3dwindow.c:1180
+msgid "_Text:"
+msgstr "_Texto:"
+
+#: libgwydgets/gwy3dwindow.c:1185
+msgid "Move label"
+msgstr "Mover rótulo"
+
+#: libgwydgets/gwy3dwindow.c:1194
+msgid "_Horizontally:"
+msgstr "_Horizontalmente:"
+
+#: libgwydgets/gwy3dwindow.c:1204
+msgid "_Vertically:"
+msgstr "_Verticalmente:"
+
+#: libgwydgets/gwy3dwindow.c:1212
+msgid "A_ll labels have the same size"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:1223
+msgid "Scale size _automatically"
+msgstr "Ajustar tamanho _automaticamente"
+
+#: libgwydgets/gwy3dwindow.c:1235 modules/tools/filter.c:291
+msgid "Si_ze:"
+msgstr "Tamanh_o:"
+
+#: libgwydgets/gwy3dwindow.c:1277
+msgid "Show false _colorbar"
+msgstr "Mostrar falsa barra de _cores"
+
+#: libgwydgets/gwy3dwindow.c:1286
+msgid "Reserve space for _colorbar"
+msgstr ""
+
+#: libgwydgets/gwy3dwindow.c:1302 modules/process/lat_synth.c:651
+#: modules/process/obj_synth.c:542 modules/process/pat_synth.c:1458
+#: modules/process/phase_synth.c:279
+msgid "_Size:"
+msgstr "Tamanho:"
+
+#: libgwydgets/gwy3dwindow.c:1311
+#, fuzzy
+msgid "_Vertical alignment:"
+msgstr "Tamanho _vertical:"
+
+#: libgwydgets/gwy3dwindow.c:1844 libgwydgets/gwy3dwindow.c:1897
+msgid "S_witch to Lighting Mode"
+msgstr "_Alternar para Modo de Iluminação"
+
+#: libgwydgets/gwy3dwindow.c:1852 libgwydgets/gwy3dwindow.c:1874
+msgid "S_witch to Overlay Mode"
+msgstr "_Alternar para Modo de Revestimento"
+
+#: libgwydgets/gwy3dwindow.c:1866 libgwydgets/gwy3dwindow.c:1889
+msgid "S_witch to Color Gradient Mode"
+msgstr "_Alternar para Modo de Gradiente de Cores"
+
+#: libgwydgets/gwy3dwindow.c:1905
+msgid "T_oggle light"
+msgstr "C_omutar luz"
+
+#: libgwydgets/gwyaxisdialog.c:75
+msgid "Axis Properties"
+msgstr "Propriedades do eixo"
+
+#: libgwydgets/gwyaxisdialog.c:88
+msgid "Label Text"
+msgstr "Texto do rótulo"
+
+#: libgwydgets/gwydatawindow.c:891
+msgid "_Unset Color Gradient"
+msgstr "_Desativar gradiente de cores"
+
+#. TRANSLATORS: Countable (more false colour gradients).
+#: libgwydgets/gwydatawindow.c:899
+msgid "_More..."
+msgstr "_Mais..."
+
+#: libgwydgets/gwydatawindow.c:928 libgwydgets/gwyoptionmenus.c:828
+msgid "Choose Color Gradient"
+msgstr "Escolher gradiente de cores"
+
+#: libgwydgets/gwydgetenums.c:46 modules/process/neural.c:420
+msgid "Hidden"
+msgstr "Escondido"
+
+#: libgwydgets/gwydgetenums.c:47 libgwydgets/gwygraphwindowmeasuredialog.c:572
+#: modules/file/imgexport.c:474 modules/tools/selectionmanager.c:274
+msgid "Points"
+msgstr "Pontos"
+
+#: libgwydgets/gwydgetenums.c:49
+msgid "Line + points"
+msgstr "Linha + pontos"
+
+#: libgwydgets/gwydgetutils.c:848
+msgid "Change Mask Color"
+msgstr "Mudar máscara de cores"
+
+#: libgwydgets/gwygrainvaluemenu.c:184
+msgid "Quantity"
+msgstr "Quantidade"
+
+#: libgwydgets/gwygrainvaluemenu.c:194 libgwydgets/gwygrainvaluemenu.c:207
+#: modules/process/curvature.c:750
+msgid "Symbol"
+msgstr "Símbolo"
+
+#: libgwydgets/gwygrainvaluemenu.c:217
+msgid "Enabled"
+msgstr "Habilitado"
+
+#: libgwydgets/gwygraphareadialog.c:100
+msgid "Curve Properties"
+msgstr "Propriedades da curva"
+
+#: libgwydgets/gwygraphareadialog.c:101
+msgid "Pre_v"
+msgstr "Pre_v"
+
+#: libgwydgets/gwygraphareadialog.c:104
+msgid "_Next"
+msgstr "_Próximo"
+
+#: libgwydgets/gwygraphareadialog.c:123 modules/file/rawgraph.c:302
+msgid "Plot _style:"
+msgstr "E_stilo do gráfico:"
+
+#: libgwydgets/gwygraphareadialog.c:131
+msgid "Pl_ot color:"
+msgstr "C_or do gráfico:"
+
+#: libgwydgets/gwygraphareadialog.c:151
+msgid "Point _type:"
+msgstr "_Tipo de ponto:"
+
+#: libgwydgets/gwygraphareadialog.c:157
+msgid "_Point size:"
+msgstr "Tamanho do _ponto:"
+
+#: libgwydgets/gwygraphareadialog.c:167
+msgid "_Line type:"
+msgstr "Tipo da _linha:"
+
+#: libgwydgets/gwygraphareadialog.c:173 modules/file/imgexport.c:3154
+msgid "Line t_hickness:"
+msgstr "Espessura da lin_ha:"
+
+#: libgwydgets/gwygraphareadialog.c:180
+msgid "<b>Label Te_xt</b>"
+msgstr "<b>Te_xto do rótulo</b>"
+
+#: libgwydgets/gwygraphareadialog.c:397
+msgid "Set Curve Color"
+msgstr "Definir cor da curva"
+
+#: libgwydgets/gwygraphareadialog.c:549 modules/process/mask_morph.c:178
+msgid "Square"
+msgstr "Quadrado"
+
+#: libgwydgets/gwygraphareadialog.c:551 modules/process/mask_morph.c:179
+msgid "Diamond"
+msgstr "Diamante"
+
+#: libgwydgets/gwygraphareadialog.c:552
+msgid "Cross"
+msgstr "Cruz"
+
+#: libgwydgets/gwygraphareadialog.c:553
+msgid "Diagonal cross"
+msgstr "Cruz diagonal"
+
+#: libgwydgets/gwygraphareadialog.c:554
+msgid "Asterisk"
+msgstr "Asterisco"
+
+#: libgwydgets/gwygraphareadialog.c:555
+msgid "Star"
+msgstr "Estrela"
+
+#: libgwydgets/gwygraphareadialog.c:556
+msgid "Triangle up"
+msgstr "Triângulo para cima"
+
+#: libgwydgets/gwygraphareadialog.c:557
+msgid "Triangle down"
+msgstr "Triângulo para baixo"
+
+#: libgwydgets/gwygraphareadialog.c:558
+msgid "Triangle left"
+msgstr "Tiângulo para a esquerda"
+
+#: libgwydgets/gwygraphareadialog.c:559
+msgid "Triangle right"
+msgstr "Tiângulo para a direita"
+
+#: libgwydgets/gwygraphareadialog.c:560
+msgid "Full square"
+msgstr "Quadrado preenchido"
+
+#: libgwydgets/gwygraphareadialog.c:561 modules/process/mask_morph.c:176
+msgid "Disc"
+msgstr "Disco"
+
+#: libgwydgets/gwygraphareadialog.c:562
+msgid "Full diamond"
+msgstr "Diamante preenchido"
+
+#: libgwydgets/gwygraphareadialog.c:563
+msgid "Full triangle up"
+msgstr "Triângulo preenchido para cima"
+
+#: libgwydgets/gwygraphareadialog.c:564
+msgid "Full triangle down"
+msgstr "Triângulo preenchido para baixo"
+
+#: libgwydgets/gwygraphareadialog.c:565
+msgid "Full triangle left"
+msgstr "Triângulo preenchido para a esquerda"
+
+#: libgwydgets/gwygraphareadialog.c:566
+msgid "Full triangle right"
+msgstr "Triângulo preenchido para a direita"
+
+#: libgwydgets/gwygraphareadialog.c:628
+msgid "line-style|Solid"
+msgstr "estilo-de-linha|Sólido"
+
+#: libgwydgets/gwygraphareadialog.c:629
+msgid "line-style|Dash"
+msgstr "estilo-de-linha|Tracejado"
+
+#: libgwydgets/gwygraphcurves.c:448
+msgid "Description"
+msgstr "Descrição"
+
+#: libgwydgets/gwygraphcurves.c:460
+msgid "Mode"
+msgstr "Modo"
+
+#: libgwydgets/gwygraphcurves.c:478
+msgid "Color"
+msgstr "Cor"
+
+#: libgwydgets/gwygraphcurves.c:491
+msgid "Point Type"
+msgstr "Tipo de ponto"
+
+#: libgwydgets/gwygraphcurves.c:513
+msgid "Line Style"
+msgstr "Estilo de linha"
+
+#: libgwydgets/gwygraphlabeldialog.c:63
+msgid "Label Properties"
+msgstr "Propriedades do rótulo"
+
+#: libgwydgets/gwygraphlabeldialog.c:74
+#, fuzzy
+msgid "_Frame thickness:"
+msgstr "Espessura da moldura"
+
+#: libgwydgets/gwygraphlabeldialog.c:81
+msgid "_Reversed layout"
+msgstr "Layout _reverso"
+
+#: libgwydgets/gwygraphmodel.c:2180
+msgid "Abscissa"
+msgstr "Abscissa"
+
+#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1015 app/toolbox.c:113
+msgid "Graph"
+msgstr "Gráfico"
+
+#: libgwydgets/gwygraphwindow.c:170 modules/file/hdrimage.cc:472
+#: modules/process/fit-shape.c:666 modules/process/psf.c:229
+msgid "Data"
+msgstr "Dados"
+
+#: libgwydgets/gwygraphwindow.c:183
+msgid "Curves"
+msgstr "Curvas"
+
+#: libgwydgets/gwygraphwindow.c:197
+msgid "Measure distances in graph"
+msgstr "Medir distâncias no gráfico"
+
+#: libgwydgets/gwygraphwindow.c:209
+msgid "Zoom in by mouse selection"
+msgstr "Aumentar zoom por seleção do mouse"
+
+#: libgwydgets/gwygraphwindow.c:221
+msgid "Zoom out to full curve"
+msgstr "Diminuir zoom para curva completa"
+
+#: libgwydgets/gwygraphwindow.c:233
+msgid "Toggle logarithmic x axis"
+msgstr "Alternar para eixo x logarítmico"
+
+#: libgwydgets/gwygraphwindow.c:245
+msgid "Toggle logarithmic y axis"
+msgstr "Alternar para eixo y logarítmico"
+
+#: libgwydgets/gwygraphwindowmeasuredialog.c:51
+msgid "Intersections"
+msgstr "Intersecções"
+
+#: libgwydgets/gwygraphwindowmeasuredialog.c:53
+msgid "Points anywhere"
+msgstr "Pontos em qualquer lugar"
+
+#: libgwydgets/gwygraphwindowmeasuredialog.c:394
+#: libgwydgets/gwygraphwindowmeasuredialog.c:580 modules/tools/linestats.c:170
+#: modules/tools/roughness.c:517 modules/volume/volume_linestat.c:159
+msgid "Length"
+msgstr "Comprimento"
+
+#: libgwydgets/gwygraphwindowmeasuredialog.c:398
+#: libgwydgets/gwygraphwindowmeasuredialog.c:588 app/gwyplaintool.c:1018
+#: modules/process/fibre_synth.c:534 modules/process/lat_synth.c:747
+#: modules/process/obj_synth.c:567 modules/process/pat_synth.c:847
+#: modules/process/pat_synth.c:1149 modules/process/pat_synth.c:1484
+msgid "Height"
+msgstr "Altura"
+
+#: libgwydgets/gwygraphwindowmeasuredialog.c:526
+msgid "Measure Distances"
+msgstr "Medir distâncias"
+
+#: libgwydgets/gwygraphwindowmeasuredialog.c:548
+msgid "Curve:"
+msgstr "Curva:"
+
+#: libgwydgets/gwygraphwindowmeasuredialog.c:553
+#: modules/process/linematch.c:795 modules/process/semsim.c:249
+#: modules/xyz/xyz_level.c:254
+msgid "Method:"
+msgstr "Método:"
+
+#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:331
+msgid "Angle"
+msgstr "Ângulo"
+
+#. TRANSLATORS: Preferred resource.
+#: libgwydgets/gwyoptionmenus.c:456
+msgid "Preferred"
+msgstr "Preferido"
+
+#: libgwydgets/gwyoptionmenus.c:470 app/meta.c:410
+#: modules/file/imgexport.c:4110 modules/file/imgexport.c:4555
+#: modules/file/rawfile.c:995 modules/process/convolution_filter.c:538
+#: modules/process/neural.c:418 modules/tools/selectionmanager.c:345
+msgid "Name"
+msgstr "Nome"
+
+#: libgwydgets/gwyoptionmenus.c:827
+msgid "Color Gradient"
+msgstr "Gradiente de cores"
+
+#: libgwydgets/gwyoptionmenus.c:842
+msgid "GL Material"
+msgstr "Material GL"
+
+#: libgwydgets/gwyoptionmenus.c:843
+msgid "Choose GL Material"
+msgstr "Escolher material GL"
+
+#: libgwydgets/gwyscitext.c:80
+msgid "_Bold"
+msgstr "_Negrito"
+
+#: libgwydgets/gwyscitext.c:86
+msgid "_Italic"
+msgstr "_Itálico"
+
+#: libgwydgets/gwyscitext.c:92
+msgid "_Subscript"
+msgstr "_Subscrito"
+
+#: libgwydgets/gwyscitext.c:98
+msgid "Su_perscript"
+msgstr "S_obrescrito"
+
+#: libgwydgets/gwyscitext.c:251
+msgid "A_dd symbol"
+msgstr "A_dicionar símbolo"
+
+#: libgwydgets/gwyscitext.c:274 modules/file/rawfile.c:553
+#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:419
+msgid "Preview"
+msgstr "Pré-visualizar"
+
+#: libgwymodule/gwymodule-file.c:549 modules/file/err.h:41
+#: modules/file/pixmap.c:497
+#, c-format
+msgid "Cannot open file for reading: %s."
+msgstr "Não foi possível abrir o arquivo para leitura: %s."
+
+#: libgwymodule/gwymodule-file.c:558
+msgid "No module can load this file type."
+msgstr "Nenhum módulo pode carregar este tipo de arquivo."
+
+#: libgwymodule/gwymodule-file.c:665
+msgid "No module can save to this file type."
+msgstr "Nenhum módulo pode salvar para este tipo de arquivo."
+
+#: libgwymodule/gwymodulebrowser.c:66
+msgid "Module Browser"
+msgstr "Navegador de módulos"
+
+#: libgwymodule/gwymodulebrowser.c:189
+msgid "Module"
+msgstr "Módulo"
+
+#: libgwymodule/gwymodulebrowser.c:189
+msgid "Version"
+msgstr "Versão"
+
+#: libgwymodule/gwymodulebrowser.c:189
+msgid "Author"
+msgstr "Autor"
+
+#: libgwymodule/gwymodulebrowser.c:244
+msgid "Name-Version:"
+msgstr "Nome-Versão:"
+
+#: libgwymodule/gwymodulebrowser.c:245 libgwymodule/gwymodulebrowser.c:268
+#: modules/process/grain_stat.c:186
+msgid "File:"
+msgstr "Arquivo:"
+
+#: libgwymodule/gwymodulebrowser.c:246
+msgid "Registered functions:"
+msgstr "Funções registradas:"
+
+#: libgwymodule/gwymodulebrowser.c:247
+msgid "Authors:"
+msgstr "Autores:"
+
+#: libgwymodule/gwymodulebrowser.c:248
+msgid "Copyright:"
+msgstr "Direitos autorais:"
+
+#: libgwymodule/gwymodulebrowser.c:249
+msgid "Date:"
+msgstr "Data:"
+
+#: libgwymodule/gwymodulebrowser.c:250
+msgid "Description:"
+msgstr "Descrição:"
+
+#: libgwymodule/gwymodulebrowser.c:267
+msgid "Name:"
+msgstr "Nome:"
+
+#: libgwymodule/gwymodulebrowser.c:269
+msgid "Failure:"
+msgstr "Falha:"
+
+#: app/about.c:58
+#, c-format
+msgid "About %s"
+msgstr "Sobre %s"
+
+#: app/about.c:97
+msgid "An SPM data visualization and analysis tool."
+msgstr "Uma ferramenta de visualização e análise de dados SPM."
+
+#: app/about.c:105
+msgid "Report bugs to:"
+msgstr "Reportar erros para:"
+
+#: app/about.c:120
+msgid "Credits"
+msgstr "Créditos"
+
+#: app/about.c:137
+msgid "License"
+msgstr "Licença"
+
+#: app/about.c:142
+#, c-format
+msgid ""
+"%s is free software; you can redistribute it and/or modify it under the "
+"terms of the GNU General Public License as published by the Free Software "
+"Foundation; either version 2 of the License, or (at your option) any later "
+"version. For full license text see file COPYING included in the source "
+"tarball."
+msgstr ""
+"%s é um software livre; você pode redistribuí-lo e/ou modificá-lo sob os "
+"termos da Licença <it>GNU General Public License</it> como publicada pela "
+"<it>Free Software Foundation</it>: tanto a versão 2 da Licença, ou (por sua "
+"opção) qualquer versão posterior. Para o texto completo da Licença, veja o "
+"arquivo COPYING incluído no pacote do código fonte."
+
+#: app/about.c:164 modules/process/logistic.c:269
+msgid "Features"
+msgstr "Características"
+
+#: app/about.c:224
+msgid "Developers"
+msgstr "Desenvolvedores"
+
+#: app/about.c:225
+msgid "Translators"
+msgstr "Tradutores"
+
+#: app/about.c:229
+msgid "Development is supported by the Czech Metrology Institute: "
+msgstr "O desenvolvimento é apoiado pelo Instituto Checo de Metrologia:"
+
+#: app/about.c:257 app/about.c:260
+msgid "OpenGL 3D View"
+msgstr "Visão OpenGL 3D"
+
+#: app/about.c:261 app/about.c:266 app/about.c:286
+msgid "not available\n"
+msgstr "Não disponível\n"
+
+#: app/about.c:269
+msgid "X11 protocol\n"
+msgstr "Protocolo X11\n"
+
+#: app/about.c:271
+msgid "Win32 protocol\n"
+msgstr "Protocolo Win32\n"
+
+#: app/about.c:273
+msgid "LibUnique\n"
+msgstr "LibUnique\n"
+
+#: app/about.c:277
+msgid "Remote Control"
+msgstr "Controle remoto"
+
+#: app/about.c:281 app/about.c:285
+msgid "Python Scripting Interface"
+msgstr "Interface de programação Python"
+
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:311
+#, c-format
+msgid "Development version, built %s"
+msgstr ""
+
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:328
+#, fuzzy, c-format
+msgid "Released %s"
+msgstr "Atualizado %s\n"
+
+#: app/app.c:301
+#, c-format
+msgid ""
+"Some data are unsaved:\n"
+"%s\n"
+"Really quit?"
+msgstr ""
+"Alguns dados não estão salvos:\n"
+"%s\n"
+"Deseja realmente sair?"
+
+#: app/app.c:442
+msgid "Mask _Color..."
+msgstr "Máscara de _cores..."
+
+#: app/app.c:458 app/app.c:1754
+msgid "Zoom _1:1"
+msgstr "Zoom _1:1"
+
+#: app/app.c:462 app/app.c:1758 app/app.c:1988
+msgid "Metadata _Browser..."
+msgstr "_Navegador de metadados..."
+
+#: app/app.c:467 app/app.c:1763 app/app.c:1993
+msgid "View _Log..."
+msgstr "Visualizar _registro..."
+
+# Needs a better translation...
+# Precisa de uma tradução melhor...
+#: app/app.c:651
+msgid "Pi_xelwise Square"
+msgstr "Ponto a ponto quadrado"
+
+#: app/app.c:661
+msgid "_Physically Square"
+msgstr "_Fisicamente quadrado"
+
+#: app/app.c:842
+msgid "Set as Default"
+msgstr "Definir como padrão"
+
+#: app/app.c:844
+msgid "Set the current view setup as the default"
+msgstr "Definir a configuração de visão atual como padrão"
+
+#: app/app.c:854
+msgid "verb|Save"
+msgstr "Salvar"
+
+#: app/app.c:857 app/app.c:861
+msgid "Save 3D view to an image"
+msgstr "Salvar visão 3D para uma imagem"
+
+#: app/app.c:869
+#, fuzzy
+msgid "_Autocrop"
+msgstr "_Automático"
+
+#: app/app.c:873
+msgid "Remove white borders from exported image"
+msgstr ""
+
+#: app/app.c:960
+msgid "_Show mask"
+msgstr "_Mostrar máscara"
+
+#: app/app.c:1172
+#, c-format
+msgid "Saving of 3D view to `%s' failed"
+msgstr "O salvamento da visão 3D para `%s' falhou"
+
+#: app/app.c:1222
+msgid "Export 3D View"
+msgstr "Exportar visão 3D"
+
+#: app/app.c:1478
+msgid "_Change Preview"
+msgstr "_Modificar pré-visualização"
+
+#: app/app.c:1606
+msgid "Change Volume Data Preview"
+msgstr "Modificar pré-visualização do volume de dados"
+
+#: app/app.c:1616
+msgid "Preview quantity:"
+msgstr "Quantidade de pré-visualização:"
+
+#: app/app.c:1626 modules/process/extend.c:267 modules/tools/linestats.c:165
+#: modules/volume/volume_linestat.c:142
+msgid "Mean"
+msgstr "Média"
+
+#: app/app.c:1627 modules/process/polydistort.c:258 modules/tools/filter.c:241
+#: modules/tools/icolorange.c:424 modules/tools/linestats.c:167
+#: modules/volume/volume_linestat.c:144
+msgid "Minimum"
+msgstr "Mínimo"
+
+#: app/app.c:1628 modules/process/col_synth.c:170 modules/tools/filter.c:242
+#: modules/tools/icolorange.c:435 modules/tools/linestats.c:168
+#: modules/volume/volume_linestat.c:145
+msgid "Maximum"
+msgstr "Máximo"
+
+#: app/app.c:1629 modules/volume/volume_linestat.c:146
+msgid "Min. position"
+msgstr "Posição min."
+
+#: app/app.c:1630 modules/volume/volume_linestat.c:147
+msgid "Max. position"
+msgstr "Posição máx."
+
+#: app/app.c:1631 modules/process/bdep_synth.c:134
+#: modules/process/col_synth.c:171 modules/process/scars.c:369
+#: modules/process/scars.c:377 modules/process/threshold.c:336
+msgid "RMS"
+msgstr "RMS"
+
+#: app/app.c:1632 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
+#: modules/file/xyzexport.c:236 modules/file/xyzexport.c:305
+msgid "Channel:"
+msgstr "Canal:"
+
+#: app/app.c:1633
+msgid "Section:"
+msgstr "seção:"
+
+#: app/app.c:1890
+msgid "_Update Preview"
+msgstr "_Atualizar pré-visualização"
+
+#: app/app.c:1896
+msgid "_Density Map"
+msgstr "Mapa de _densidade"
+
+#: app/data-browser-aux.c:1373
+#, c-format
+msgid "Unknown channel %d"
+msgstr "Canal %d desconhecido"
+
+#: app/data-browser-aux.c:1456
+#, c-format
+msgid "Unknown volume %d"
+msgstr "Volume %d desconhecido"
+
+#: app/data-browser-aux.c:1520
+#, c-format
+msgid "Unknown XYZ %d"
+msgstr "%d XYZ desconhecido"
+
+#: app/data-browser-aux.c:2839
+#, c-format
+msgid "Z levels: %d, Z unit: %s"
+msgstr "Níveis Z: %d, unidade Z: %s"
+
+#: app/data-browser-aux.c:2865
+#, c-format
+msgid "Points: %d"
+msgstr "Pontos: %d"
+
+#: app/data-browser.c:5459
+msgid "Extract to a new file"
+msgstr "Extrair para um novo arquivo"
+
+#: app/data-browser.c:5466
+msgid "Duplicate"
+msgstr "Duplicar"
+
+#: app/data-browser.c:5473
+msgid "Delete"
+msgstr "Apagar"
+
+#: app/data-browser.c:5532
+msgid "Data Browser"
+msgstr "Navegador de dados"
+
+#: app/data-browser.c:5557
+msgid "Show file messages"
+msgstr "Mostrar mensagens do arquivo"
+
+#: app/data-browser.c:5569
+msgid "Close file"
+msgstr "Fechar arquivo"
+
+#: app/data-browser.c:5582
+#, fuzzy
+msgid "Images"
+msgstr "Imagem"
+
+#: app/data-browser.c:5596 modules/volume/volume_extract.c:431
+msgid "Graphs"
+msgstr "Gráficos"
+
+#: app/data-browser.c:5610
+msgid "Spectra"
+msgstr "Espectros"
+
+#: app/data-browser.c:5638
+msgid "XYZ"
+msgstr "XYZ"
+
+#: app/data-browser.c:6619
+#, c-format
+msgid "Messages for %s"
+msgstr "Mensagens para %s"
+
+#: app/data-browser.c:6623
+msgid "Messages for Untitled"
+msgstr "Mensagens para Sem título"
+
+#: app/datachooser.c:285 app/datachooser.c:596
+msgid "channel|None"
+msgstr "canal|Nenhum"
+
+#: app/file.c:210
+msgid "Imported data are likely incorrect."
+msgstr "Dados importados provavelmente estão incorretos."
+
+#: app/file.c:214
+#, c-format
+msgid ""
+"Import support for files of type\n"
+"\n"
+"%s\n"
+"\n"
+"is incomplete due to the lack of documentation, testing files and/or people "
+"willing to help with the testing.\n"
+"\n"
+"If you can help to improve the import please contact the author of module %s-"
+"%s:\n"
+"\n"
+"%s"
+msgstr ""
+"Suporte para importação de arquivos do tipo\n"
+"\n"
+"%s\n"
+"\n"
+"está incompleto devido à falta de documentação, arquivos de teste e/ou "
+"pessoas dispostas a ajudar a testar.\n"
+"\n"
+"Se você puder ajudar a aprimorar a importação, por favor, entre em contato "
+"com o autor do módulo %s-%s:\n"
+"\n"
+"%s"
+
+#: app/file.c:292
+#, c-format
+msgid "Opening of `%s' failed"
+msgstr "A abertura de `%s' falhou"
+
+#: app/file.c:298 app/file.c:533
+#, c-format
+msgid "Full file path: %s."
+msgstr "Caminho completo do arquivo: %s."
+
+#: app/file.c:301
+#, c-format
+msgid "Loaded using: %s."
+msgstr "Carregado utilizando: %s."
+
+#: app/file.c:387
+msgid "Merge File"
+msgstr "Mesclar arquivo"
+
+#: app/file.c:389 app/gwyappfilechooser.c:226
+msgid "Open File"
+msgstr "Abrir arquivo"
+
+#: app/file.c:527 app/gwymoduleutils.c:192
+#, c-format
+msgid "Saving of `%s' failed"
+msgstr "O salvamento de `%s'  falhou"
+
+#: app/file.c:536
+#, c-format
+msgid "Saved using: %s."
+msgstr "Salvo usando: %s."
+
+#: app/file.c:696
+#, c-format
+msgid "File `%s' already exists.  Replace?"
+msgstr "O arquivo `%s' já existe. Substituir?"
+
+#: app/file.c:700
+#, c-format
+msgid ""
+"The file already exists in `%s'.  Replacing it will overwrite its contents."
+msgstr ""
+"O arquivo já existe em `%s'. A substituição do mesmo irá sobrescrever seu "
+"conteúdo."
+
+#: app/file.c:703
+msgid "Replace File?"
+msgstr "Substituir arquivo?"
+
+#: app/filelist.c:230
+msgid "Document History"
+msgstr "Histórico do documento"
+
+#: app/filelist.c:260
+msgid "Clean U_p"
+msgstr "Lim_par"
+
+#: app/filelist.c:264
+msgid "Remove entries of files that no longer exist"
+msgstr "Remover entradas de aquivos que não existem mais"
+
+#: app/filelist.c:273
+msgid "Close file list"
+msgstr "Fechar lista de arquivos"
+
+#: app/filelist.c:280
+msgid "Open selected file"
+msgstr "Abrir arquivo selecionado"
+
+#: app/filelist.c:566 app/gwyappfilechooser.c:592
+msgid "_Filter:"
+msgstr "_Filtro:"
+
+#: app/filelist.c:604 app/gwyappfilechooser.c:628
+msgid "Case _sensitive"
+msgstr "Diferenciar _maiúsculas/minúsculas"
+
+#: app/glmaterial-editor.c:92
+msgid "GL Material Editor"
+msgstr "Editor de material GL"
+
+#: app/glmaterial-editor.c:93
+#, c-format
+msgid "GL Material  `%s'"
+msgstr "`%s' material GL"
+
+#: app/glmaterial-editor.c:143
+msgid "_Ambient"
+msgstr "_Ambiente"
+
+#: app/glmaterial-editor.c:144
+msgid "_Diffuse"
+msgstr "_Difuso"
+
+#: app/glmaterial-editor.c:145
+msgid "Spe_cular"
+msgstr "Especular"
+
+# It may have another meaning.
+# Isto pode ter outro significado.
+#: app/glmaterial-editor.c:194
+msgid "Sh_ininess:"
+msgstr "Br_ilho:"
+
+#: app/gradient-editor.c:126
+msgid "Color Gradient Editor"
+msgstr "Editor do gradiente de cores"
+
+#: app/gradient-editor.c:127
+#, c-format
+msgid "Color Gradient `%s'"
+msgstr "Gradiente de cores `%s'"
+
+#: app/gradient-editor.c:228
+msgid "_Points"
+msgstr "_Pontos"
+
+#: app/gradient-editor.c:229
+msgid "_Curve"
+msgstr "_Curva"
+
+#: app/gradient-editor.c:267
+msgid "_Snap to control points"
+msgstr "_Bater para controlar pontos"
+
+#: app/gwyappfilechooser.c:231
+msgid "Save File"
+msgstr "Salvar arquivo"
+
+#: app/gwyappfilechooser.c:389
+#, c-format
+msgid "File _type: %s"
+msgstr "Arquivo do _tipo: %s"
+
+#: app/gwyappfilechooser.c:396
+msgid "Only loadable shown"
+msgstr "Mostrando apenas carregáveis"
+
+#: app/gwyappfilechooser.c:400
+#, c-format
+msgid "Filter: %s"
+msgstr "Filtro: %s"
+
+#: app/gwyappfilechooser.c:464
+msgid "Automatic by extension"
+msgstr "Automático por extensão"
+
+#: app/gwyappfilechooser.c:473
+msgid "Automatically detected"
+msgstr "Detectado automaticamente"
+
+#: app/gwyappfilechooser.c:570
+msgid "Show only loadable files"
+msgstr "Mostrar apenas arquivos carregáveis"
+
+#: app/gwyappfilechooser.c:855
+msgid "Plane-level previewed data"
+msgstr "Dados nível-plano pré-visualizados"
+
+#: app/gwyappfilechooser.c:871
+msgid "Row-level previewed data"
+msgstr "Dados nível-linha pré-visualizados"
+
+#: app/gwyappfilechooser.c:987
+msgid "File too large for preview"
+msgstr ""
+
+#: app/gwyappfilechooser.c:988
+msgid "…"
+msgstr "..."
+
+#: app/gwyappfilechooser.c:1352
+msgid "Cannot preview"
+msgstr "Impossível pré-visualizar"
+
+#: app/gwyddion.c:147
+msgid "Loading document history"
+msgstr "Carregando histórico do documento"
+
+#: app/gwyddion.c:152
+msgid "Registering "
+msgstr "Registrando "
+
+#: app/gwyddion.c:153
+msgid "stock items"
+msgstr "itens de ação"
+
+#: app/gwyddion.c:157
+msgid "color gradients"
+msgstr "gradiente de cores"
+
+#: app/gwyddion.c:159
+msgid "GL materials"
+msgstr "Materiais GL"
+
+#: app/gwyddion.c:161
+msgid "grain quantities"
+msgstr "quantidades de grãos"
+
+#: app/gwyddion.c:163
+msgid "calibrations"
+msgstr "calibrações"
+
+#: app/gwyddion.c:168
+msgid "Loading settings"
+msgstr "Carregando configurações"
+
+#: app/gwyddion.c:175
+msgid "Registering modules"
+msgstr "Registrando módulos"
+
+#: app/gwyddion.c:464
+msgid "Could not read settings."
+msgstr "Não foi possível ler configurações."
+
+#: app/gwyddion.c:467
+#, c-format
+msgid ""
+"Settings file `%s' cannot be read: %s\n"
+"\n"
+"To prevent loss of saved settings no attempt to update it will be made until "
+"it is repaired or removed."
+msgstr ""
+"O arquivo de configurações `%s'  não pode ser lido: %s\n"
+"\n"
+"Para prevenir perda das configurações salvas não serão feitas tentativas de "
+"atualizá-lo até que ele seja reparado ou removido."
+
+#: app/gwyddion.c:505
+#, c-format
+msgid "Many modules (%u) failed to register."
+msgstr ""
+
+#: app/gwyddion.c:510
+#, c-format
+msgid ""
+"Most likely Gwyddion was not upgraded correctly.  Instead, one installation "
+"was just overwritten with another, and now it is a mess.\n"
+"\n"
+"Please remove completely the module directory\n"
+"\n"
+"%s\n"
+"\n"
+"and reinstall Gwyddion.\n"
+"\n"
+"See Info → Module Browser for specific errors."
+msgstr ""
+
+#: app/gwymoduleutils-file.c:536
+#, c-format
+msgid "Section %s ended at line %u but it has never started."
+msgstr "A sessão %s terminou na linha %u, mas ela nunca foi iniciada."
+
+#: app/gwymoduleutils-file.c:544
+#, c-format
+msgid "Section %s ended at line %u instead of %s."
+msgstr "A sessão %s terminou na linha %u ao invés de %s."
+
+#: app/gwymoduleutils-file.c:581
+#, c-format
+msgid "Section %s started at line %u before %s ended."
+msgstr "A sessão %s começou na linha %u antes de %s terminar."
+
+#: app/gwymoduleutils-file.c:587
+#, c-format
+msgid "Empty section name at header line %u."
+msgstr "Nome de seção vazia na linha %u do cabeçalho."
+
+#: app/gwymoduleutils-file.c:622
+#, c-format
+msgid "Header line %u lacks prefix %s."
+msgstr "Cabeçalho da linha %u não tem o prefixo %s."
+
+#: app/gwymoduleutils-file.c:647
+#, c-format
+msgid "Header line %u lacks key-value separator."
+msgstr "Falta o valor-chave separador na linha %u do cabeçalho."
+
+#: app/gwymoduleutils-file.c:655
+#, c-format
+msgid "Key at header line %u is empty."
+msgstr "Chave na linha %u do cabeçalho está vazia."
+
+#: app/gwymoduleutils-file.c:682
+#, c-format
+msgid "Header suddenly ended at line %u; end of header marker is missing"
+msgstr ""
+"O cabeçalho terminou repentinamente na linha %u; o fim da marca do cabeçalho "
+"está faltando"
+
+#: app/gwymoduleutils.c:197 app/settings.c:131 app/settings.c:142
+#: app/toolbox-spec.c:536 modules/file/err.h:62
+#: modules/pygwy/pygwy-console.c:528
+#, c-format
+msgid "Cannot write to file: %s."
+msgstr "Não foi possível escrever para o arquivo: %s."
+
+#: app/gwyplaintool.c:566
+msgid "<big><b>Missing layer module.</b></big>"
+msgstr "<big><b>Faltando camada do módulo.</b></big>"
+
+#: app/gwyplaintool.c:572
+#, c-format
+msgid ""
+"This tool requires layer of type %s to work, which does not seem to be "
+"installed.  Please check your installation."
+msgstr ""
+"Esta ferramenta requer uma camada do tipo %s para funcionar, mas ela não "
+"parece estar instalada. Por favor, verifique sua instalação."
+
+#: app/gwyplaintool.c:788
+msgid "Clear selected objects"
+msgstr "Limpar objetos selecionados"
+
+#. TRANSLATORS: Origin of the selected rectangle.
+#: app/gwyplaintool.c:1000
+msgid "Origin"
+msgstr "Origem"
+
+#: app/gwyplaintool.c:1011 modules/file/rawfile.c:997
+#: modules/process/convolution_filter.c:349
+#: modules/process/convolution_filter.c:553 modules/process/fibre_synth.c:520
+#: modules/process/neural.c:419 modules/process/obj_synth.c:536
+#: modules/process/pat_synth.c:1450
+msgid "Size"
+msgstr "Tamanho"
+
+#: app/gwyplaintool.c:1014
+msgid "Width"
+msgstr "Largura"
+
+#: app/gwytool.c:294
+msgid "verb|Hide"
+msgstr "Esconder"
+
+#: app/gwytool.c:296
+msgid "Hide tool dialog (Esc)"
+msgstr "Esconder diálogo de ferramentas (Esc)"
+
+#: app/help.c:257
+msgid "Cannot display the help."
+msgstr "Não foi possível mostrar a ajuda."
+
+#. TRANSLATORS: %s will be replaced with an URL.
+#: app/help.c:260
+#, c-format
+msgid ""
+"No working method to show\n"
+"%s\n"
+"in a web browser was found. Details about the attempts can be found in the "
+"console or gwyddion.log."
+msgstr ""
+"nenhum método funcionando para mostrar\n"
+"%s\n"
+"em um navegador foi encontrado. Detalhes sobre as tentativas podem ser "
+"encontrados no console ou gwyddion.log."
+
+#. TRANSLATORS: For user guide location.  Translate this to fr, ru, cs,
+#. de, ...  even if the corresponding guide does not exist.
+#: app/help.c:363
+msgid "current-language-code|en"
+msgstr "código-de-linguagem-atual|pt_BR"
+
+#: app/log.c:536
+#, c-format
+msgid "Log of %s (%s)"
+msgstr "Registro de %s (%s)"
+
+#: app/log.c:588 app/meta.c:224 modules/tools/selectionmanager.c:399
+msgid "_Export"
+msgstr "_Exportar"
+
+#: app/log.c:594
+msgid "Clea_r"
+msgstr "Limpa_r"
+
+#: app/log.c:599 app/meta.c:240
+msgid "_Close"
+msgstr "_Fechar"
+
+#: app/log.c:615 modules/file/imgexport.c:4118 modules/file/rawfile.c:996
+msgid "Type"
+msgstr "Tipo"
+
+#: app/log.c:616
+msgid "Function"
+msgstr "Função"
+
+#: app/log.c:617 modules/file/imgexport.c:3128 modules/process/fit-shape.c:466
+#: modules/process/neural.c:614 modules/tools/stats.c:423
+msgid "Parameters"
+msgstr "Parâmetros"
+
+#: app/log.c:618
+msgid "Time"
+msgstr "Tempo"
+
+#: app/log.c:730
+msgid "Export Log"
+msgstr "Exportar registro"
+
+#: app/menu.c:555 app/toolbox.c:595
+msgid "_Data Process"
+msgstr "Processamento de _dados"
+
+#: app/menu.c:597 app/toolbox.c:598
+msgid "_Graph"
+msgstr "_Gráfico"
+
+#: app/menu.c:640 app/toolbox.c:601
+msgid "_Volume Data"
+msgstr "Dados de _volume"
+
+#: app/menu.c:683 app/toolbox.c:604
+msgid "_XYZ Data"
+msgstr "Dados _XYZ"
+
+#: app/menu.c:714
+msgid "Re-show Last"
+msgstr "Mostrar último novamente"
+
+#: app/menu.c:729
+msgid "Repeat Last"
+msgstr "Repetir último"
+
+#: app/menu.c:857
+msgid "Repeat"
+msgstr "Repetir"
+
+#: app/menu.c:863
+msgid "Re-show"
+msgstr "Mostrar novamente"
+
+#: app/menu.c:1185
+msgid "_Document history"
+msgstr "Histórico do _documento"
+
+#: app/meta.c:230
+msgid "_New"
+msgstr "_Novo"
+
+#: app/meta.c:235 modules/file/imgexport.c:4620 modules/file/rawfile.c:1058
+#: modules/process/neural.c:718 modules/tools/selectionmanager.c:405
+msgid "_Delete"
+msgstr "_Apagar"
+
+#: app/meta.c:294
+#, c-format
+msgid "Metadata of %s (%s)"
+msgstr "Metadados de %s (%s)"
+
+#: app/meta.c:619
+msgid "New item"
+msgstr "Novo item"
+
+#: app/meta.c:737
+msgid "Save Metadata"
+msgstr "Salvar metadados"
+
+#: app/resource-editor.c:134
+msgid "Edit selected item"
+msgstr "Editar item selecionado"
+
+#: app/resource-editor.c:140 modules/process/convolution_filter.c:503
+msgid "Create a new item"
+msgstr "Criar um novo item"
+
+#: app/resource-editor.c:146 modules/process/convolution_filter.c:508
+msgid "Create a new item based on selected one"
+msgstr "Criar um novo item baseado no selecionado"
+
+#: app/resource-editor.c:152 modules/process/convolution_filter.c:513
+msgid "Delete selected item"
+msgstr "Apagar item selecionado"
+
+#: app/resource-editor.c:158
+msgid "Set selected item as default"
+msgstr "Definir item selecionado como padrão"
+
+#: app/settings.c:124 app/toolbox-spec.c:528 modules/file/err.h:55
+#, c-format
+msgid "Cannot open file for writing: %s."
+msgstr "Não foi possível abrir o arquivo para escrita: %s."
+
+#: app/settings.c:181 modules/file/err.h:33
+#, c-format
+msgid "Cannot read file contents: %s"
+msgstr "Não foi possível ler o conteúdo do arquivo: %s"
+
+#: app/settings.c:189
+msgid "File is empty."
+msgstr "O arquivo está vazio."
+
+#: app/settings.c:199
+msgid "File is corrupted, magic header does not match."
+msgstr "O arquivo está corrompido, os cabeçalho mágico não corresponde."
+
+#: app/settings.c:210
+msgid "File is corrupted, deserialization failed."
+msgstr "O arquivo está corrompido, a deserialização falhou."
+
+#: app/settings.c:264
+#, c-format
+msgid "Cannot create user config directory %s: %s"
+msgstr "Não foi possível criar o diretório de configuração do usuário %s: %s"
+
+#: app/settings.c:277
+#, c-format
+msgid "Cannot create user ui directory %s: %s"
+msgstr "Não foi possível criar o diretório ui do usuário %s: %s"
+
+#: app/settings.c:294
+#, c-format
+msgid "Cannot create user module directory %s: %s"
+msgstr "Não foi possível criar o diretório de módulos do usuário %s: %s"
+
+#: app/splash.c:1260
+msgid "Starting "
+msgstr "Iniciando "
+
+#: app/splash.c:1313
+msgid " is free software released under GNU GPL."
+msgstr " é software atualizado sob a licença GNU GPL."
+
+#: app/tips.c:54
+msgid ""
+"Holding Shift restricts directions of selected lines to multiples of 15°."
+msgstr ""
+"Segurar Shift restringe direções das linhas selecionadas em múltiplos de 15°."
+
+#: app/tips.c:59
+msgid ""
+"Holding Shift restricts shapes of selected rectangles to perfect squares."
+msgstr ""
+"Segurar Shift restringe formas dos retângulos selecionados a quadrados "
+"perfeitos."
+
+#: app/tips.c:64
+msgid "Holding Shift restricts shapes of selected ellipses to perfect circles."
+msgstr ""
+"Segurar Shift restringe formas das elipses selecionadas a círculos perfeitos."
+
+#: app/tips.c:69
+msgid ""
+"If multiple regions are selected on a graph, e.g. in 1D FFT Filtering, "
+"individual regions can be deleted by clicking on them with the right mouse "
+"button."
+msgstr ""
+"Se múltiplas regiões são selecionadas em um gráfico, ex.: em filtro FFT 1D, "
+"regiões individuais podem ser apagadas clicando nelas com o botão direito do "
+"mouse."
+
+#: app/tips.c:75
+msgid ""
+"Data presentations created by functions in Data Process → Presentation do "
+"not change the underlying data.  All subsequent operations still apply to "
+"the underlying data."
+msgstr ""
+"Apresentações de dados criados por funções em Processamento de Dados → "
+"Apresentação não modificam os dados subjacentes."
+
+#: app/tips.c:88
+msgid ""
+"Pressing Ctrl-F runs the last used data processing function with with the "
+"same parameters on the current data."
+msgstr ""
+"Pressionando Ctrl-F é executada a última função de processamento de dados "
+"utilizada, com os mesmos parâmetros, nos dados atuais."
+
+#: app/tips.c:93
+msgid ""
+"Pressing Ctrl-Shift-F re-shows the parameter dialog of the last used data "
+"processing function (or executes it immediately if it has no parameters)."
+msgstr ""
+"Pressionando Ctrl-Shift-F é mostrado novamente o diálogo de parâmetros da "
+"última função de processamento de dados utilizada (ou a executa "
+"imediatamente se ela não tiver nenhum parâmetro)."
+
+#: app/tips.c:100
+msgid ""
+"When Gwyddion is run with a directory argument it opens a file open dialog "
+"showing this directory."
+msgstr ""
+"Quando o Gwyddion é executado com um diretório como argumento ele abre o "
+"diálogo de abertura de arquivos mostrando este diretório."
+
+#: app/tips.c:105
+msgid ""
+"File → Open Recent → Document History opens a browser of recently loaded "
+"files with the possibility to search them by name."
+msgstr ""
+"Arquivo → Abrir recente → Histórico de documentos abre um navegador dos "
+"arquivos carregados recentemente com a possibilidade de procurá-los por nome."
+
+#: app/tips.c:111
+msgid ""
+"Automatic import of unrecognized files as raw data can be enabled/disabled "
+"in the Raw file import dialog."
+msgstr ""
+"A importação automática de arquivos desconhecidos como dados brutos  pode "
+"ser habilitado/desabilitado no diálogo de importação de dados brutos."
+
+#: app/tips.c:116
+msgid ""
+"To export the image of a channel to a pixmap graphic format (PNG, TIFF, "
+"JPEG, ...) just save it as this format with File → Save As."
+msgstr ""
+"Para exportar a imagem de um canal para um formato gráfico do tipo mapa de "
+"pixeis (To export the image of a channel to a pixmap graphic format (PNG, "
+"TIFF, JPEG, ...) apenas salve-a neste formato com Arquivo → Salvar como."
+
+#: app/tips.c:122
+msgid "File → Merge imports all data from selected file to the current file."
+msgstr ""
+"Arquivo → Mesclar importa todos os dados do arquivo selecionado no arquivo "
+"atual."
+
+#: app/tips.c:127
+msgid ""
+"Previews in the file open dialog can be shown with plane and/or line "
+"leveling applied.  Use the switches at the bottom of the preview list."
+msgstr ""
+"Pré-visualizações no diálogo de abertura de arquivos podem ser mostradas com "
+"nivelamento de plano e/ou linha aplicado(s). Use os botões de mudança na "
+"base da lista de pré-visualização."
+
+#: app/tips.c:134
+msgid ""
+"Your favorite false color gradient can be set as default in the gradient "
+"editor: Edit → Color Gradients.  The default gradient is shown in bold face."
+msgstr ""
+"Seu gradiente de cores falsas favorito pode ser definido como padrão no "
+"editor de gradientes: Editar → Gradiente de cores. O gradiente de cores "
+"padrão é mostrado na face negrita."
+
+#: app/tips.c:140
+msgid ""
+"Your favorite GL material can be set as default in the material editor: Edit "
+"→ GL Materials.  The default material is shown in bold face."
+msgstr ""
+"Seu material GL favorito pode ser definido como padrão no editor de "
+"materiais: Editar → Materiais GL. O material padrão é mostrado na face "
+"negrita."
+
+#: app/tips.c:146
+msgid ""
+"Edit → Default Mask Color sets the default mask color.  This color is used "
+"when a mask is created on data that have not had a mask before."
+msgstr ""
+"Editar → Máscara de cores padrão define a máscara de cores padrão. Esta cor "
+"é utilizada quando a máscara é criada em dados que não tenham tido uma "
+"máscara anteriormente."
+
+#: app/tips.c:152
+msgid ""
+"Each channel has its own metadata.  Display them by clicking with the right "
+"mouse button and choosing Metadata Browser."
+msgstr ""
+"Cada canal tem seu próprio metadado. Exiba-os clicando com o botão direito "
+"do mouse e escolhendo Navegador de metadados."
+
+#: app/tips.c:158
+msgid ""
+"Each volume data have their own metadata.  Display them by clicking with the "
+"right mouse button and choosing Metadata Browser."
+msgstr ""
+"Cada volume tem seu próprio metadado. Exiba-os clicando com o botão direito "
+"do mouse e escolhendo Navegador de metadados."
+
+#: app/tips.c:164
+msgid ""
+"A record of applied data processing operations can be browsed using View Log "
+"in the channel or volume data right-click menu."
+msgstr ""
+"A gravação das operações de processamento de dados aplicada pode ser "
+"navegada usando Ver registro nos dados de canal ou volume no menu de clique "
+"do botão direito."
+
+#: app/tips.c:170
+msgid ""
+"Curves can be copied to other (compatible) graphs by dragging them from "
+"Curves tab to the graph window."
+msgstr ""
+"Curvas podem ser copiadas para outros gráficos (compatíveis) arrastando-os "
+"da 'Aba de curvas' para a janela do gráfico."
+
+#: app/tips.c:175
+msgid "Graph curve properties can be edited by clicking on the curve."
+msgstr "Propriedades da curva no gráfico podem ser editadas clicando na curva."
+
+#: app/tips.c:179
+msgid "Graph axis labels can be edited after by clicking on the label."
+msgstr "Rótulos dos eixos no gráfico podem ser editados clicando no rótulo."
+
+#: app/tips.c:183
+msgid ""
+"Graph key (legend) properties can be edited by double-clicking on the legend."
+msgstr ""
+"Propriedades da chave do gráfico (legenda) podem ser editadas com um duplo "
+"clique na legenda."
+
+#: app/tips.c:188
+msgid ""
+"Curves can be deleted from graphs by selecting the curve in Curves tab and "
+"pressing Delete."
+msgstr ""
+"Curvas podem ser apagadas dos gráficos selecionando a curva na 'Aba de "
+"curvas' e pressionando Delete."
+
+#: app/tips.c:194
+msgid "Key ‛+’ or ‛=’ zooms in a data window."
+msgstr "As teclas ‛+’ ou ‛=’ aproximam o zoom na janela de dados."
+
+#: app/tips.c:198
+msgid "Key ‛-’ (minus) zooms out a data window."
+msgstr "A tecla ‛-’ (menos) diminui o zoom na janela de dados."
+
+#: app/tips.c:202
+msgid "Key ‛Z’ resets data window zoom to 1:1."
+msgstr "A tecla ‛Z’ reinicia o zoom da janela de dados para 1:1."
+
+#: app/tips.c:206
+msgid ""
+"Data with different <i>x</i> and <i>y</i> measures can be displayed either "
+"with pixel-wise or realistic aspect ratio.  The menu in data window top left "
+"corner enables switching between these two modes."
+msgstr ""
+"Dados com medidas diferentes de <i>x</i> e <i>y</i> podem ser exibidos tanto "
+"com razão de aspecto ponto a ponto ou realista. O menu na janela de dados no "
+"canto superior esquerdo habilita a mudança entre estes dois modos."
+
+#: app/tips.c:213
+msgid ""
+"Clicking on a false color scale with the right mouse button brings a false "
+"color gradient selector."
+msgstr ""
+"Clicando na escala de cores falsa com o botão direito do mouse traz um "
+"seletor de gradiente de cores falsas."
+
+#: app/tips.c:218
+msgid ""
+"Mask color can be changed by right-clicking on a data view and selecting "
+"Mask Color from the menu."
+msgstr ""
+"A máscara de cores pode ser modificada clicando com o botão direito em uma "
+"visão de dados e selecionando 'Máscara de cores' a partir do menu."
+
+#: app/tips.c:224
+msgid ""
+"Clicking on a 3D view with the right mouse button brings a GL material or "
+"false color gradient selector."
+msgstr ""
+"Clicando em uma visão 3D com o botão direito do mouse traz um seletor de "
+"materiais GL ou gradiente de cores falsas."
+
+#: app/tips.c:229
+msgid ""
+"3D view transformation modes can be selected with keys: R (rotate), S "
+"(scale), V (value scale) and L (light source)."
+msgstr ""
+"Modos de transformação de visão 3D podem ser selecionados com as teclas: R "
+"(girar), S (escala), V (escala de valores) e L (fonte de luz)."
+
+#: app/tips.c:234
+msgid ""
+"You can make a specific 3D view setup the default using the Set as Default "
+"button."
+msgstr ""
+"Você pode tornar uma configuração 3D específica como padrão usando o botão "
+"'Definir como padrão'."
+
+#: app/tips.c:240
+msgid ""
+"Pressing Ctrl-C copies the image of a channel, graph or 3D view to the "
+"clipboard."
+msgstr ""
+"Pressionar Ctrl-C copia a imagem de um canal, gráfico ou visão 3D para a "
+"área de transferência."
+
+#: app/tips.c:245
+msgid ""
+"Dragging channels or graphs from Data Browser to a window copies them to the "
+"corresponding file."
+msgstr ""
+"Arrastando canais ou gráficos a partir do 'Navegador de dados' para uma "
+"janela faz uma cópia dos mesmos para o arquivo correspondente."
+
+#: app/tips.c:250
+msgid "Info → Show Data Browser brings back a closed Data Browser."
+msgstr ""
+"'Info → Mostrar navegador de dados' traz de volta um 'Navegador de dados' "
+"fechado."
+
+#: app/tips.c:254
+msgid ""
+"Channels and graphs can be renamed by double-clicking on their name in Data "
+"Browser."
+msgstr ""
+"Canais e gráficos podem ser renomeados com um duplo clique em seu nome no "
+"'Navegador de dados'."
+
+#: app/tips.c:260
+msgid ""
+"Facet Level offers to use/exclude the masked area if a mask is present on "
+"the data."
+msgstr ""
+"'Nível faceta' oferece para usar/excluir a área mascarada se uma máscara "
+"estiver presente nos dados."
+
+#: app/tips.c:265
+msgid ""
+"Plane Level offers to use/exclude the masked area if a mask is present on "
+"the data."
+msgstr ""
+"'Nível plano' oferece para usar/excluir a área mascarada se uma máscara "
+"estiver presente nos dados."
+
+#: app/tips.c:270
+msgid ""
+"Align Rows offers to use/exclude the masked area if a mask is present on the "
+"data."
+msgstr ""
+"'Alinhar linhas' oferece para usar/excluir a área mascarada se uma máscara "
+"estiver presente nos dados."
+
+#: app/tips.c:275
+msgid ""
+"Data Arithmetic works as a scientific calculator: just type an arithmetic "
+"expression."
+msgstr ""
+"'Aritmética de dados' funciona como uma calculadora científica: apenas "
+"digite uma expressão aritmética."
+
+#: app/tips.c:280
+msgid ""
+"Data Arithmetic expressions can include values (d), mask values (m), "
+"derivatives (bx, by) and coordinates (x, y)."
+msgstr ""
+"Expressões aritméticas de dados podem incluir valores (d), máscara de "
+"valores (m), derivadas (bx, by) e coordenadas (x, y)."
+
+#: app/tips.c:285
+msgid ""
+"Facet Level can often level data with large features that make impossible to "
+"use standard plane leveling.  It levels the surface by making normals of "
+"flat areas point upwards."
+msgstr ""
+"'Nivelamento faceta' pode, frequentemente, nivelar dados com grandes "
+"características que fazem com que seja impossível usar nivelamento plano "
+"padrão. Ele nivela a superfície fazendo as normais das áreas achatadas "
+"apontarem para cima."
+
+#: app/tips.c:291
+msgid ""
+"Flatten Base performs automated leveling of base flat surface with positive "
+"features."
+msgstr ""
+"'Achatar base' realiza nivelamento automático da superfície chata base com "
+"características positivas."
+
+#: app/tips.c:296
+msgid ""
+"Too small grains can be filtered out with Data Process → Grains → Filter."
+msgstr ""
+"Grãos muito pequenos podem ser filtrados com 'Processamento de dados → Grãos "
+"→ Filtrar'."
+
+#: app/tips.c:301
+msgid ""
+"Data Process → Presentation → Edge Detection → Step is a fine step detector "
+"with a good dynamic range"
+msgstr ""
+"'Processamento de dados → Apresentação → Detecção de borda → Passo' é um "
+"detector fino de passo com uma boa faixa dinâmica."
+
+#: app/tips.c:306
+msgid ""
+"Data Process → Basic Operations → Dimensions and Units changes scales, "
+"offsets and even lateral and value units."
+msgstr ""
+"'Processamento de dados → Operações básicas → Dimensões e unidades' mudam "
+"escalas, afastamentos e unidades de valor e lateral."
+
+#: app/tips.c:311
+msgid ""
+"Grains or other areas of interest are marked with masks.  Many functions "
+"then can do something interesting with the masked areas."
+msgstr ""
+"Grãos ou outras áreas de interesse são marcadas com máscaras. Muitas podem "
+"então fazer alguma coisa interessante com as áreas mascaradas."
+
+#: app/tips.c:317
+msgid ""
+"Remove Scars in the toolbox runs with the settings last used in Mark Scars."
+msgstr ""
+"'Remover cicatriz' na caixa de ferramentas é executado com as últimas "
+"configurações utilizadas em 'Marcar cicatrizes'."
+
+#: app/tips.c:322
+msgid "Data synthesis modules can be also used to modify existing images."
+msgstr ""
+"Módulos de síntese de dados também podem ser usados para modificar imagens "
+"existentes."
+
+#: app/tips.c:327
+msgid ""
+"Data Process → Mask → Mark With can set the image mask based on another "
+"data, mask or presentation."
+msgstr ""
+"'Processamento de dados → Máscara → Marcar com' pode definir a máscara da "
+"imagem com base em outros dados, máscara ou apresentação."
+
+#: app/tips.c:333
+msgid "Graph → Critical Dimension measures steps on extracted profile graphs."
+msgstr ""
+"'Gráfico → Dimensão crítica' mede passos no perfil extraído dos gráficos."
+
+#: app/tips.c:338
+msgid "All Graph functions are available also in the graph right-click menu."
+msgstr ""
+"As funções 'Todos os gráficos' também estão disponíveis no menu de clique do "
+"botão direito no gráfico."
+
+#: app/tips.c:344
+msgid "Pressing Esc hides tool windows."
+msgstr "Pressionando Esc as janelas de ferramentas são escondidas."
+
+#: app/tips.c:348
+msgid "Read Value tool displays also the local facet normal."
+msgstr "A ferramenta 'Ler valor' exibe também a faceta normal local."
+
+#: app/tips.c:352
+msgid ""
+"Read Value tool can shift data to make <i>z</i>=0 plane pass through the "
+"selected point."
+msgstr ""
+"A ferramenta 'Ler valor' deslocar dados para fazer o plano <i>z</i>=0 passar "
+"através de um ponto selecionado."
+
+#: app/tips.c:357
+msgid ""
+"Individual lines can be deleted in Distance tool by selecting them in the "
+"list and pressing Delete."
+msgstr ""
+"Linhas individuais podem ser deletadas em 'Ferramenta de distância' "
+"selecionando-as na lista e pressionando Delete."
+
+#: app/tips.c:362
+msgid ""
+"Individual lines can be deleted in Profiles tool by selecting them in the "
+"list and pressing Delete."
+msgstr ""
+"Linhas individuais podem ser deletadas em 'Ferramenta de perfis' "
+"selecionando-as na lista e pressionando Delete."
+
+#: app/tips.c:367
+msgid ""
+"Spectroscopy tool displays point spectroscopy data and extracts them to "
+"standalone graphs that can be subsequently analysed for instance with Graph "
+"→ Fit FD Curve."
+msgstr ""
+"A ferramenta 'Espectroscopia' exibe dados de espectroscopia de ponto e os "
+"extrai para gráficos independentes que podem ser analisados subsequentemente "
+"por ocasião com 'Gráfico → Ajustar curva FD'."
+
+#: app/tips.c:373
+msgid ""
+"Statistical Quantities tool allows limiting the area of interest by a mask, "
+"rectangular selection or the intersection of both."
+msgstr ""
+"A ferramenta 'Quantidades estatísticas' permite limitar a área de interesse "
+"com uma máscara, seleção retangular ou a intersecção de ambos."
+
+#: app/tips.c:378
+msgid ""
+"Beside height and angle distributions, Statistical Functions tool calculates "
+"also correlation functions, power spectrum density (PSDF) and some more "
+"exotic functions."
+msgstr ""
+"Junto das distribuições de altura e ângulo, a ferramenta 'Funções "
+"estatísticas' calcula também funções de correlação, densidade do espectro de "
+"potência (PSDF) e algumas outras funções exóticas."
+
+# The meaning of the word 'features' must be clarified.
+# O significado da palavra 'características' precisa ser esclarecido.
+#: app/tips.c:384
+msgid ""
+"Path Level tool levels misaligned rows by lining them up along manually "
+"selected lines.  If there are no large features automatic Align Rows usually "
+"works well."
+msgstr ""
+"A ferramenta 'Nivelar caminho' nivela linhas mau alinhadas revestindo-as "
+"manualmente ao longo das linhas selecionadas. Se não existirem grandes "
+"características, 'Alinhar linhas automaticamente' geralmente funciona bem."
+
+#: app/tips.c:390
+msgid ""
+"Grain Measure tool is great for examining individual grains.  Overall grain "
+"statistics are available in Data Processing → Grains."
+msgstr ""
+"A ferramenta 'Medição de grãos' é ótima para examinar grãos individuais. No "
+"geral, estatísticas de grãos estão disponíveis em 'Processamento de dados → "
+"Grãos'."
+
+#: app/tips.c:396
+msgid "Mask Editor tool can create, edit, invert, grow and shrink masks."
+msgstr ""
+"A ferramenta 'Editor de máscaras' pode criar, editar, inverter, aumentar e "
+"encolher máscaras."
+
+#: app/tips.c:400
+msgid ""
+"Color Range tool offers several false color scale mapping modes and can make "
+"any of them the default mode."
+msgstr ""
+"A ferramenta 'Faixa de cores' oferece vários modos de mapeamento de escala "
+"de cores falsas e pode fazer de qualquer uma delas o modo padrão."
+
+#: app/tips.c:405
+msgid ""
+"Dragging selections from Selections Manager tool to a data window copies the "
+"selection to the target data."
+msgstr ""
+"Arrastar seleções da ferramenta 'Gerenciador de seleções' para uma janela de "
+"dados copia a seleção para os dados alvo."
+
+#: app/tips.c:411
+msgid ""
+"Pressing F1 or the Help buttons in most windows shows a relevant part of the "
+"user guide in a web browser."
+msgstr ""
+"Pressionar F1 ou os botões de 'Ajuda' mostra, na maioria das janelas, uma "
+"parte relevante do guia do usuário em um navegador."
+
+#: app/tips.c:416
+msgid ""
+"Gwyddion User Guide explains in detail many of the methods and algorithms "
+"implemented in Gwyddion."
+msgstr ""
+"O guia do usuário do Gwyddion explica com detalhes muitos dos métodos e "
+"algorítimos implementados no Gwyddion."
+
+# Can't understand this phrase...
+# Não consegui entender esta frase...
+#: app/tips.c:421
+msgid "Gwyddion is a son of Math."
+msgstr "Gwyddion é um filho do 'Math'."
+
+#: app/tips.c:483
+msgid "Gwyddion Tip of the Day"
+msgstr "Dica do dia do Gwyddion"
+
+#: app/tips.c:496
+msgid "_Previous Tip"
+msgstr "_Dica anterior"
+
+#: app/tips.c:502
+msgid "_Next Tip"
+msgstr "_Próxima dica"
+
+#: app/tips.c:532
+msgid "_Show tips at startup"
+msgstr "_Mostrar dicas no início"
+
+#: app/toolbox-editor.c:213
+msgid "Toolbox Editor"
+msgstr "Editor da 'Caixa de ferramentas'"
+
+#: app/toolbox-editor.c:258
+msgid "_New Item"
+msgstr "_Novo item"
+
+#: app/toolbox-editor.c:263
+msgid "_New Group"
+msgstr "_Novo grupo"
+
+#: app/toolbox-editor.c:269 app/toolbox.c:591
+msgid "_Edit"
+msgstr "_Editar"
+
+#: app/toolbox-editor.c:274 modules/process/fft_filter_2d.c:499
+#: modules/tools/maskedit.c:554 modules/volume/volume_zcal.c:173
+msgid "_Remove"
+msgstr "_Remover"
+
+#: app/toolbox-editor.c:279
+msgid "Move _Up"
+msgstr "S_ubir"
+
+#: app/toolbox-editor.c:284
+msgid "Move _Down"
+msgstr "_Descer"
+
+#: app/toolbox-editor.c:293 modules/file/hdrimage.cc:2304
+#: modules/file/imgexport.c:3114 modules/file/pixmap.c:872
+#: modules/file/rawfile.c:658 modules/process/crosscor.c:252
+#: modules/process/dimensions.h:455 modules/process/fibre_synth.c:526
+#: modules/process/tip_blind.c:334
+msgid "_Width:"
+msgstr "_Largura:"
+
+#: app/toolbox-editor.c:787
+msgid "Toolbox Group"
+msgstr "Grupo da 'Caixa de ferramentas'"
+
+#: app/toolbox-editor.c:804 modules/file/rawgraph.c:267
+msgid "_Title:"
+msgstr "_Título"
+
+#: app/toolbox-editor.c:818
+msgid "_Id:"
+msgstr "_Id:"
+
+#: app/toolbox-editor.c:831
+msgid "_Suggest"
+msgstr "_Sugerir"
+
+#: app/toolbox-editor.c:837
+msgid "Trans_latable title"
+msgstr "Títu_lo traduzível"
+
+#: app/toolbox-editor.c:887
+msgid "Group id is not a valid identifier"
+msgstr "Id do grupo não é um identificador válido"
+
+#: app/toolbox-editor.c:895
+msgid "Group id is not unique"
+msgstr "Id do grupo não é único"
+
+#: app/toolbox-editor.c:984
+msgid "Toolbox Item"
+msgstr "Item da 'Caixa de ferramentas'"
+
+#: app/toolbox-editor.c:1005 modules/process/coerce.c:331
+#: modules/tools/filter.c:284
+msgid "_Type:"
+msgstr "_Tipo:"
+
+#: app/toolbox-editor.c:1012
+msgid "Placeholder"
+msgstr "Espaço reservado"
+
+#: app/toolbox-editor.c:1013
+msgid "Builtin"
+msgstr "Embutido"
+
+#: app/toolbox-editor.c:1014 app/toolbox.c:112
+msgid "Data Process"
+msgstr "Processamento de dados"
+
+#: app/toolbox-editor.c:1016
+msgid "Volume Data"
+msgstr "Dados de volume"
+
+#: app/toolbox-editor.c:1017
+msgid "XYZ Data"
+msgstr "Dados XYZ"
+
+#: app/toolbox-editor.c:1018
+msgid "Tool"
+msgstr "Ferramenta"
+
+#: app/toolbox-editor.c:1025 modules/tools/profile.c:483
+msgid "_Mode:"
+msgstr "_Modo:"
+
+#: app/toolbox-editor.c:1032 app/toolbox-editor.c:1051
+msgid "Default"
+msgstr "Padrão"
+
+#: app/toolbox-editor.c:1033
+msgid "Interactive"
+msgstr "Interativo"
+
+#: app/toolbox-editor.c:1034
+msgid "Non-interactive"
+msgstr "Não-interativo"
+
+#: app/toolbox-editor.c:1042
+msgid "Use _icon from:"
+msgstr "Usar ícone de:"
+
+#: app/toolbox-editor.c:1076
+msgid "Functions"
+msgstr "Funções"
+
+#: app/toolbox-spec.c:618
+msgid "placeholder"
+msgstr "espaço reservado"
+
+#: app/toolbox-spec.c:626
+msgid "remaining tools"
+msgstr "Ferramentas restantes"
+
+#: app/toolbox-spec.c:710
+msgid "All tools not placed explicitly go here."
+msgstr "Todas as ferramentas não posicionadas explicitamente vão aqui."
+
+#: app/toolbox.c:111
+msgid "View"
+msgstr "Visualizar"
+
+#: app/toolbox.c:114
+msgid "Tools"
+msgstr "Ferramentas"
+
+#: app/toolbox.c:589
+msgid "_File"
+msgstr "_Arquivo"
+
+#: app/toolbox.c:607
+msgid "_Info"
+msgstr "_Info"
+
+#: app/toolbox.c:696
+msgid "Display a 3D view of data"
+msgstr "Exibir visualização 3D dos dados"
+
+#: app/toolbox.c:700
+#, fuzzy
+msgid "Undo"
+msgstr "_Desfazer"
+
+#: app/toolbox.c:700
+#, fuzzy
+msgid "Undo last action"
+msgstr "Subtração de plano"
+
+#: app/toolbox.c:704
+#, fuzzy
+msgid "Redo"
+msgstr "/_Refazer"
+
+#: app/toolbox.c:704
+msgid "Redo again last undone action"
+msgstr ""
+
+#: app/toolbox.c:708
+msgid "Zoom in"
+msgstr "Aumentar zoom"
+
+#: app/toolbox.c:712
+msgid "Zoom out"
+msgstr "Diminuir zoom"
+
+#: app/toolbox.c:716
+msgid "Zoom 1:1"
+msgstr "Zoom 1:1"
+
+#: app/toolbox.c:781
+msgid "/Show _Data Browser"
+msgstr "/Mostrar 'Navegador de _dados'"
+
+#: app/toolbox.c:789
+msgid "/Module _Browser"
+msgstr "/Navegador de módulos"
+
+#: app/toolbox.c:797
+msgid "/Program _Messages"
+msgstr "/_Mensagens do programa"
+
+#: app/toolbox.c:812
+msgid "/_User Guide"
+msgstr "/Guia do _usuário"
+
+#: app/toolbox.c:820
+msgid "/_Tip of the Day"
+msgstr "/_Dica do dia"
+
+#: app/toolbox.c:828
+msgid "/_About Gwyddion"
+msgstr "/_Sobre o Gwyddion"
+
+#: app/toolbox.c:865
+msgid "/_Open..."
+msgstr "/_Abrir"
+
+#: app/toolbox.c:873
+msgid "/_Merge..."
+msgstr "/_Mesclar"
+
+#: app/toolbox.c:881
+msgid "/Open _Recent"
+msgstr "/Abrir _recente"
+
+#: app/toolbox.c:889
+msgid "/_Save"
+msgstr "/_Salvar"
+
+#: app/toolbox.c:897
+msgid "/Save _As..."
+msgstr "/Salvar _como"
+
+#: app/toolbox.c:905
+msgid "/_Close"
+msgstr "/_Fechar"
+
+#: app/toolbox.c:913
+msgid "/Remo_ve All Logs"
+msgstr "/Remo_ver todos os registros"
+
+#: app/toolbox.c:929
+msgid "/_Quit"
+msgstr "/_Sair"
+
+#: app/toolbox.c:969
+msgid "/_Undo"
+msgstr "/_Desfazer"
+
+#: app/toolbox.c:977
+msgid "/_Redo"
+msgstr "/_Refazer"
+
+#: app/toolbox.c:993
+msgid "/Default Mask _Color..."
+msgstr "/Máscara de _cores padrão"
+
+#: app/toolbox.c:1001
+msgid "/Color _Gradients..."
+msgstr "/_Gradientes de cor..."
+
+#: app/toolbox.c:1009
+msgid "/G_L Materials..."
+msgstr "/Materiais G_L..."
+
+#: app/toolbox.c:1017
+msgid "/_Toolbox..."
+msgstr "/Caixa de ferramen_tas"
+
+#: app/toolbox.c:1025
+msgid "/_Keyboard Shortcuts"
+msgstr "/Atalhos de _teclado"
+
+#: app/toolbox.c:1033
+msgid "/_Logging Enabled"
+msgstr "/_Registro habilitado"
+
+#: app/toolbox.c:1142
+msgid "Program Messages"
+msgstr "Mensagens do programa"
+
+#: app/toolbox.c:1379
+msgid "Change Default Mask Color"
+msgstr "Mudar máscara de cores padrão"
+
+#: app/toolbox.c:1407
+msgid "OpenGL 3D graphics not available"
+msgstr "Gráficos OpenGL 3D não disponíveis"
+
+#: app/toolbox.c:1412
+msgid "OpenGL was disabled with a command-line option."
+msgstr "O OpenGL foi desabilitado com uma opção de linha de comando."
+
+#: app/toolbox.c:1420
+msgid ""
+"Initialization of OpenGL failed.  Check output of <tt>glxinfo</tt> and "
+"warning messages printed to console during Gwyddion startup."
+msgstr ""
+"A inicialização do OpenGL falhou. Verifique a saída do <tt>glxinfo</tt> e "
+"mensagens de alerta exibidas no console durante a inicialização do Gwyddion."
+
+#: app/toolbox.c:1427
+msgid "This version of Gwyddion was built without OpenGL support."
+msgstr "Esta versão do Gwyddion foi compilada sem suporte a OpenGL."
+
+#: app/validate.c:114 app/validate.c:135
+#, c-format
+msgid "byte at position %d"
+msgstr "byte na posição %d"
+
+#: app/validate.c:161 app/validate.c:174
+#, c-format
+msgid "%s instead of %s"
+msgstr "%s ao invés de %s"
+
+#: app/validate.c:389
+#, c-format
+msgid "no channel %d exists for %s"
+msgstr "não existe o canal %d para %s"
+
+#: app/validate.c:401
+#, c-format
+msgid "no graph %d exists for %s"
+msgstr "não existe o gráfico %d para %s"
+
+#: app/validate.c:411
+#, c-format
+msgid "no spectra %d exists for %s"
+msgstr "não existe o espectro %d para %s"
+
+#: app/validate.c:427
+#, c-format
+msgid "no brick %d exists for %s"
+msgstr "não existe tijolo %d para %s"
+
+#: app/validate.c:443
+#, c-format
+msgid "no surface %d exists for %s"
+msgstr "não existe a superfície %d para %s"
+
+#: app/validate.c:498
+#, c-format
+msgid "ref_count is %d for %s"
+msgstr "ref_cont é %d para %s"
+
+#: app/validate.c:681
+msgid "Invalid item key format"
+msgstr "Formato de item chave inválido"
+
+#: app/validate.c:682
+msgid "Item key contains invalid characters"
+msgstr "Item chave contém caracteres inválidos"
+
+#: app/validate.c:683
+msgid "Item key does not belong to any known data"
+msgstr "O item chave não pertence a nenhum dado conhecido"
+
+#: app/validate.c:684
+msgid "Wrong data item id"
+msgstr "Id do item de dados errado"
+
+#: app/validate.c:685
+msgid "Unexpected data item type"
+msgstr "Tipo de item de dados inesperado"
+
+#: app/validate.c:686
+msgid "String value is not valid UTF-8"
+msgstr "Valor da string não é um UTF-8 válido"
+
+#: app/validate.c:687
+msgid "Object has several references"
+msgstr "O objeto tem várias referências"
+
+#: app/validate.c:688
+msgid "Secondary data item has no primary data"
+msgstr "Os dados secundários não possuem dados primários"
+
+#: app/wait.c:114
+msgid "Please wait"
+msgstr "Por favor, aguarde"
+
+#: modules/file/accurexii-txt.c:73
+msgid "Imports Accurex II text files."
+msgstr "Importa arquivos de texto Accurex II"
+
+#: modules/file/accurexii-txt.c:86
+msgid "Accurex II text files (.txt)"
+msgstr "Arquivos de texto Accurex II (.txt)"
+
+#: modules/file/accurexii-txt.c:153
+#, c-format
+msgid "File header cannot be converted from ISO-8859-1 character set: %s"
+msgstr ""
+"Cabeçalho do arquivo não pode ser convertido do conjunto de caracteres "
+"ISO-8859-1: %s"
+
+#: modules/file/aistfile.c:123
+msgid "Imports AIST-NT data files."
+msgstr "Importa arquivos de dados AIST-NT."
+
+#: modules/file/aistfile.c:136
+msgid "AIST-NT files (.aist)"
+msgstr "Arquivos AIST-NT (.aist)"
+
+#: modules/file/alicona.c:147
+msgid "Imports Alicona Imaging AL3D files."
+msgstr "Importa arquivos Alicona Imaging AL3D."
+
+#: modules/file/alicona.c:160
+msgid "Alicona Imaging AL3D files (.al3d)"
+msgstr "Arquivos Alicona Imaging AL3D (.al3d)"
+
+#: modules/file/alicona.c:492
+#, c-format
+msgid "Invalid plane number %u in tag ‘%s’."
+msgstr "Número de plano %u inválido na tag ‘%s’."
+
+#: modules/file/alicona.c:579
+msgid "Header tag key is not nul-terminated."
+msgstr "Tag-chave do cabeçalho não tem final nula."
+
+#: modules/file/alicona.c:584
+msgid "Header tag key is empty."
+msgstr "Tag-chave do cabeçalho está vazia."
+
+# What means nul-padded?
+# O que significa 'nul-padded'?
+#: modules/file/alicona.c:591
+#, c-format
+msgid "Header tag ‘%s’ key is not nul-padded."
+msgstr "Tag-chave ‘%s’ do cabeçalho não tem preenchimento nulo."
+
+#: modules/file/alicona.c:598
+#, c-format
+msgid "Header tag ‘%s’ lacks CRLF terminator."
+msgstr "Falta terminador CRLF na tag ‘%s’ do cabeçalho."
+
+#: modules/file/alicona.c:604
+#, c-format
+msgid "Header tag ‘%s’ value is not nul-terminated."
+msgstr "O valor da tag ‘%s’ do cabeçalho não tem final nulo."
+
+#: modules/file/alicona.c:614
+#, c-format
+msgid "Header tag ‘%s’ value is not nul-padded."
+msgstr "O valor da tag ‘%s’ do cabeçalho não tem preenchimento nulo."
+
+#: modules/file/alicona.c:665 modules/file/gdeffile.c:175
+#: modules/file/gdeffile.c:199 modules/file/gsffile.c:159
+#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1174
+#: modules/file/microprof.c:361 modules/file/microprof.c:375
+#: modules/file/pt3file.c:489 modules/file/pt3file.c:591
+msgid "File header is truncated."
+msgstr "O cabeçalho do arquivo está truncado."
+
+#: modules/file/alicona.c:680
+msgid "Comment lacks CRLF termination."
+msgstr "Falta o terminador CRLF no comentário."
+
+#: modules/file/alicona.c:685
+msgid "Comment is not nul-terminated."
+msgstr "O comentário não tem final nulo."
+
+#: modules/file/ambfile.c:83
+msgid "Imports Ambios AMB data files."
+msgstr "Importa arquivos de dados Ambios AMB."
+
+#: modules/file/ambfile.c:96
+msgid "Ambios amb files (.amb)"
+msgstr "Arquivos Ambios AMB (.amb)"
+
+#: modules/file/anfatec.c:87
+msgid "Imports Anfatec data files (two-part .txt + .int)."
+msgstr "Importa arquivos Anfatec (duas partes .txt + .int)."
+
+#: modules/file/anfatec.c:100
+msgid "Anfatec files (.par + .int)"
+msgstr "Arquivos Anfatec (.par + .int)"
+
+#: modules/file/anfatec.c:232
+msgid "The parameter file cannot be loaded."
+msgstr "O arquivo de parâmetros não pôde ser carregado."
+
+#: modules/file/anfatec.c:238
+msgid "Cannot find the corresponding parameter file."
+msgstr "Não foi possível encontrar o arquivo de parâmetros correspondente."
+
+#: modules/file/anfatec.c:255
+msgid "FileDescBegin cannot be inside another FileDesc."
+msgstr ""
+"Inicio da descrição do arquivo (FileDescBegin) não pode estar dentro de "
+"outra descrição de arquivo (FileDesc)."
+
+#: modules/file/anfatec.c:267
+msgid "FileDescEnd has no corresponding FileDescBegin."
+msgstr ""
+"Final da descrição do arquivo (FileDescEnd) não tem o inicio da descrição do "
+"arquivo (FileDescBegin) correspondente."
+
+#: modules/file/anfatec.c:294
+msgid "FileDescBegin has no corresponding FileDescEnd."
+msgstr ""
+"Inicio da descrição do arquivo (FileDescBegin) não tem o final da descrição "
+"do arquivo (FileDescEnd) correspondente."
+
+#: modules/file/apedaxfile.c:261
+msgid "Imports A.P.E. Research DAX data files."
+msgstr "Importa arquivos de dados A.P.E. Research DAX."
+
+#: modules/file/apedaxfile.c:276
+msgid "A.P.E. Research DAX Files (.dax) and APDT File (.apdt)"
+msgstr "Arquivos A.P.E. Research DAX (.dax) e arquivo APDT (.apdt)"
+
+#: modules/file/apefile.c:196
+msgid "Imports APE (Applied Physics and Engineering) data files."
+msgstr "Importa arquivos de dados APE (Applied Physics and Engineering)."
+
+#: modules/file/apefile.c:209
+msgid "APE files (.dat)"
+msgstr "Arquivos APE (.dat)"
+
+#: modules/file/asciiexport.c:75
+msgid "Exports data as simple ASCII matrix."
+msgstr "Exporta dados como matriz ASCII simples."
+
+#: modules/file/asciiexport.c:88
+msgid "ASCII data matrix (.txt)"
+msgstr "Matriz de dados ASCII (.txt)"
+
+#: modules/file/asciiexport.c:193 modules/file/asciiexport.c:208
+msgid "Width:"
+msgstr "Largura:"
+
+#: modules/file/asciiexport.c:200 modules/file/asciiexport.c:212
+msgid "Height:"
+msgstr "Altura:"
+
+#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:251
+msgid "Value units:"
+msgstr "Unidades de valor:"
+
+#: modules/file/asciiexport.c:264 modules/graph/graph_export_ascii.c:111
+msgid "Export Text"
+msgstr "Exportar texto"
+
+#: modules/file/asciiexport.c:275 modules/file/gxyzffile.c:402
+#: modules/file/imgexport.c:3532 modules/file/imgexport.c:4151
+#: modules/file/rawfile.c:758 modules/file/xyzexport.c:314
+#: modules/process/calibrate.c:561 modules/process/coerce.c:363
+#: modules/process/col_synth.c:516 modules/process/correct_affine.c:520
+#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:263
+#: modules/process/grain_dist.c:307 modules/process/grain_edge.c:254
+#: modules/process/grain_mark.c:335 modules/process/grain_wshed.c:256
+#: modules/process/linematch.c:819 modules/process/mark_disconn.c:280
+#: modules/process/slope_dist.c:359 modules/process/tip_blind.c:360
+#: modules/process/wpour_mark.c:354 modules/tools/spotremove.c:322
+#: modules/tools/stats.c:401 modules/xyz/xyz_raster.c:597
+msgid "Options"
+msgstr "Opções"
+
+#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:317
+msgid "Use _dot as decimal separator"
+msgstr "Use _ponto como separador decimal"
+
+#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:324
+#: modules/process/grain_dist.c:318
+msgid "Add _informational comment header"
+msgstr "Adiciona cabeçalho de comentário informal"
+
+#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:333
+msgid "_Precision:"
+msgstr "_Precisão:"
+
+#: modules/file/assing-afm.c:72
+msgid "Imports Assing AFM data files."
+msgstr "Importa arquivos de dados Assing AFM."
+
+#: modules/file/assing-afm.c:85
+msgid "Assing AFM files (.afm)"
+msgstr "Arquivos Assing AFM (.afm)"
+
+#: modules/file/attocube.c:84
+msgid "Imports Attocube Systems ASC files."
+msgstr "Importa arquivos Attocube Systems ASC."
+
+#: modules/file/attocube.c:97
+msgid "Attocube ASCII files (.asc)"
+msgstr "Arquivos Attocube ASCII (.asc)"
+
+#: modules/file/bcrfile.c:141
+msgid "Imports Image Metrology BCR data files."
+msgstr "Importa arquivos de dados Image Metrology BCR."
+
+#: modules/file/bcrfile.c:154
+msgid "BCR files (.bcr, .bcrf)"
+msgstr "Arquivos BCR (.bcr, .bcrf)"
+
+#: modules/file/bcrfile.c:233
+#, c-format
+msgid "File header is not convertible from UTF-16: %s"
+msgstr "Cabeçalho do arquivo não é conversível de UTF-16: %s"
+
+#: modules/file/bcrfile.c:346
+#, c-format
+msgid "Unknown file type header: `%s'."
+msgstr "Cabeçalho de tipo de arquivo desconhecido: `%s'."
+
+#: modules/file/burleigh.c:127
+msgid "Imports Burleigh IMG data files version 2.1."
+msgstr "Importa arquivos de dados Burleigh IMG versão 2.1."
+
+#: modules/file/burleigh.c:140
+msgid "Burleigh 2.1 files (.img)"
+msgstr "Arquivos Burleigh 2.1 (.img)"
+
+#: modules/file/burleigh.c:223
+#, c-format
+msgid "File format version %.1f is not supported."
+msgstr "Versão do formato de arquivo %.1f não é suportada."
+
+#: modules/file/burleigh_bii.c:75
+msgid "Imports Burleigh BII binary data files."
+msgstr "Importa arquivos de dados binários Burleigh BII."
+
+#: modules/file/burleigh_bii.c:88
+msgid "Burleigh Image Studio files (.bii)"
+msgstr "Arquivos Burleigh Image Studio (.bii)"
+
+#: modules/file/burleigh_exp.c:88
+msgid "Imports Burleigh text/bin exported images."
+msgstr "Importa imagens exportadas Burleigh text/bin."
+
+#: modules/file/burleigh_exp.c:101
+msgid "Burleigh exported data (.txt, .bin)"
+msgstr "Dados exportados Burleigh (.txt, .bin)"
+
+#: modules/file/burleigh_exp.c:226 modules/file/burleigh_exp.c:267
+#: modules/file/nanoscope.c:1612 modules/file/omicron.c:416
+#: modules/file/shimadzu.c:468
+msgid "Missing colon in header line."
+msgstr "Faltando dois pontos (:) na linha do cabeçalho."
+
+#: modules/file/codevfile.c:71
+msgid "Imports Code V interferogram files."
+msgstr "Importa arquivos de interferograma Code V."
+
+#: modules/file/codevfile.c:84
+msgid "Code V interferogram files (.int)"
+msgstr "Arquivos de interferograma Code V (.int)"
+
+#: modules/file/createc.c:133
+msgid "Imports Createc data files."
+msgstr "Importa arquivos de dados Createc."
+
+#: modules/file/createc.c:146
+msgid "Createc files (.dat)"
+msgstr "Arquivos Createc (.dat)"
+
+#: modules/file/createc.c:185
+#, c-format
+msgid "Neither `%s' nor `%s' header field found."
+msgstr "Nem o `%s' ou o `%s' campo do cabeçalho foi encontrado."
+
+#: modules/file/createc.c:771 modules/file/matfile.c:600
+#: modules/file/rhk-sm4.c:1470
+#, c-format
+msgid "zlib initialization failed with error %d, cannot decompress data."
+msgstr ""
+"Inicialização de zlib falhou com erro %d, não é possível descompactar dados."
+
+#: modules/file/createc.c:785 modules/file/rhk-sm4.c:1484
+#, c-format
+msgid "Decompression of compressed data failed with error %d."
+msgstr "Descompactação dos dados comprimidos falhou com erro %d."
+
+#: modules/file/createc.c:830 modules/file/rhk-sm4.c:1527
+msgid "Cannot decompress compressed data.  Zlib support was not built in."
+msgstr ""
+"Não foi possível descompactar os dados compactados. O suporte à zlib não "
+"está embutido."
+
+#: modules/file/csmfile.c:83
+msgid "Imports Benyuan CSM data files."
+msgstr "Importa arquivos de dados Benyuan CSM."
+
+#: modules/file/csmfile.c:96
+msgid "Benyuan CSM files (.csm)"
+msgstr "Arquivos Benyuan CSM (.csm)"
+
+#: modules/file/dektakvca.c:197
+#, fuzzy
+msgid "Imports Dektak OPDx data files."
+msgstr "Importa arquivos de dados Dektak XML."
+
+#: modules/file/dektakvca.c:210
+#, fuzzy
+msgid "Dektak OPDx data files (.OPDx)"
+msgstr "Arquivos de dados Dektak XML (.xml)"
+
+#: modules/file/dektakvca.c:655
+#, fuzzy, c-format
+msgid "Item `%s' has unexpected type %u instead of %u."
+msgstr "A sessão %s terminou na linha %u ao invés de %s."
+
+#: modules/file/dektakvca.c:1022
+#, fuzzy, c-format
+msgid "Truncated data inside item %s."
+msgstr "Dados truncados no bloco %s"
+
+#: modules/file/dektakxml.c:118
+msgid "Imports Dektak XML data files."
+msgstr "Importa arquivos de dados Dektak XML."
+
+#: modules/file/dektakxml.c:131
+msgid "Dektak XML data files (.xml)"
+msgstr "Arquivos de dados Dektak XML (.xml)"
+
+#: modules/file/dektakxml.c:208 modules/file/lextfile.c:260
+#: modules/file/nanoscan.c:270 modules/file/ometiff.c:265
+#, c-format
+msgid "XML parsing failed: %s"
+msgstr "Análise de XML falhou: %s"
+
+#: modules/file/dektakxml.c:373 modules/file/lextfile.c:163
+#: modules/file/nanoscan.c:698 modules/file/ometiff.c:445
+#, c-format
+msgid "Top-level element is not ‘%s’."
+msgstr "Elemento de nível-máximo não é ‘%s’."
+
+#: modules/file/dimensionfile.c:71
+msgid "Imports old Veeco Dimension 3100D files."
+msgstr "Importa arquivos antigos Veeco Dimension 3100D."
+
+#: modules/file/dimensionfile.c:84
+msgid "Dimension 3100D files (.001, .002, ...)"
+msgstr "Arquivos Dimension 3100D (.001, .002, ...)"
+
+#: modules/file/dm3file.c:274
+msgid "Reads Digital Micrograph DM3 and DM4 files."
+msgstr "Lê arquivos Digital Micrograph DM3 e DM4."
+
+#: modules/file/dm3file.c:287
+msgid "Digital Micrograph DM3 TEM data (.dm3)"
+msgstr "Dados Digital Micrograph DM3 TEM (.dm3)"
+
+#: modules/file/dm3file.c:293
+msgid "Digital Micrograph DM4 TEM data (.dm4)"
+msgstr "Dados Digital Micrograph DM4 TEM (.dm4)"
+
+#: modules/file/dm3file.c:1014
+#, c-format
+msgid "Invalid tag type definition in entry ‘%s’."
+msgstr "Definição de tipo de tag inválido na entrada ‘%s’."
+
+#: modules/file/dm3file.c:1026
+#, c-format
+msgid "File is truncated in entry ‘%s’."
+msgstr "Arquivo está truncado na entrada ‘%s’."
+
+#: modules/file/dm3file.c:1119 modules/file/dm3file.c:1179
+msgid "Tag entry type is neither group nor data."
+msgstr "Tipo de entrada da tag não é nem grupo nem dados."
+
+#: modules/file/dm3file.c:1239 modules/file/dm3file.c:1304
+#, c-format
+msgid "Tag type does not start with marker ‘%s’."
+msgstr "Tipo de tag não começa com marcador ‘%s’."
+
+#: modules/file/dm3file.c:1457
+#, c-format
+msgid "Invalid or unsupported tag type %u."
+msgstr "Tipo de tag %u inválida ou não suportada."
+
+#: modules/file/dmefile.c:131
+msgid "Imports Danish Micro Engineering (DME) data files."
+msgstr "Importa arquivos de dados Danish Micro Engineering (DME)."
+
+#: modules/file/dmefile.c:144
+msgid "DME files (.img)"
+msgstr "Arquivos DME (.img)"
+
+#: modules/file/dmefile.c:198
+#, c-format
+msgid "Header is too short (only %d bytes)."
+msgstr "Cabeçalho é muito curto (somente %d bytes)."
+
+#: modules/file/dmefile.c:212
+#, c-format
+msgid "Data size %u does not match data dimensions (%u×%u)."
+msgstr "Tamanho dos dados %u não corresponde às dimensões dos dados (%u×%u)."
+
+# I think this translation must be improved.
+# Acredito que esta tradução precise ser melhorada.
+#: modules/file/dumbfile.c:70
+msgid "Reads and exports Gwyddion dumb dump files."
+msgstr "Lê e exporta arquivos absurdos e abandonados do Gwyddion."
+
+#: modules/file/dumbfile.c:83
+msgid "Gwyddion dumb dump files (.dump)"
+msgstr "Arquivos absurdos e abandonados do Gwyddion (.dump)"
+
+#: modules/file/dumbfile.c:161 modules/plugin-proxy.c:1255
+msgid "End of file reached when value was expected."
+msgstr "Fim de arquivo alcançado quando um valor era esperado."
+
+#: modules/file/dumbfile.c:193 modules/plugin-proxy.c:1284
+msgid "Missing data field width."
+msgstr "Faltando largura do campo de dados."
+
+#: modules/file/dumbfile.c:206 modules/plugin-proxy.c:1297
+msgid "Missing data field height."
+msgstr "Faltando altura do campo de dados."
+
+#: modules/file/dumbfile.c:236 modules/plugin-proxy.c:1327
+msgid "Data field dimensions are not positive numbers."
+msgstr "Dimensões do campo de dados não são números positivos."
+
+#: modules/file/dumbfile.c:277 modules/plugin-proxy.c:1368
+msgid "End of file reached inside a data field."
+msgstr "Final do arquivo alcançado dentro de um campo de dados."
+
+#: modules/file/dumbfile.c:298 modules/plugin-proxy.c:1389
+msgid "Missing end of data field marker."
+msgstr "Faltando final do marcador do campo de dados."
+
+#: modules/file/ecsfile.c:84
+msgid "Imports ECS IMG files."
+msgstr "Importa arquivos ECS IMG."
+
+#: modules/file/ecsfile.c:97
+msgid "ECS files (.img)"
+msgstr "Arquivos ECS (.img)"
+
+#: modules/file/ecsfile.c:174
+msgid "Scan size header field overlaps with data."
+msgstr "Varredura do tamanho de um campo de cabeçalho sobrepõe com dados."
+
+#: modules/file/err.h:48 modules/file/nrrdfile.c:779
+#: modules/file/nrrdfile.c:824 modules/pygwy/pygwy-console.c:504
+#, c-format
+msgid "Cannot read from file: %s."
+msgstr "Não foi possível ler do arquivo: %s."
+
+#: modules/file/err.h:70
+#, c-format
+msgid "No data file corresponding to `%s' was found."
+msgstr "Nenhum arquivo de dados correspondendo a `%s' foi encontrado."
+
+#: modules/file/err.h:78
+msgid "File is too short to be of the assumed file type."
+msgstr "O arquivo é muito curto para ser do tipo de arquivo assumido."
+
+#: modules/file/err.h:85
+#, c-format
+msgid ""
+"File is not a %s file, it is seriously damaged, or it is of an unknown "
+"format version."
+msgstr ""
+"O arquivo não é um arquivo %s, ele está seriamente danificado, ou é de um "
+"formato de versão desconhecida."
+
+#: modules/file/err.h:96
+#, c-format
+msgid ""
+"Expected data size calculated from file headers is %u bytes, but the real "
+"size is %u bytes."
+msgstr ""
+"O tamanho dos dados esperados calculados a partir dos cabeçalhos dos arquivo "
+"é de %u bytes, mas o tamanho real é de %u bytes."
+
+#: modules/file/err.h:109 modules/file/rhk-sm4.c:765
+#, c-format
+msgid "Invalid field dimension: %d."
+msgstr "Dimensão do campo inválida: %d."
+
+#: modules/file/err.h:117
+#, c-format
+msgid ""
+"The number of bits per sample %d is invalid or unsupported for this file "
+"type."
+msgstr ""
+"O número de %d bits por amostra é inválido ou não suportado por este tipo de "
+"arquivo."
+
+#: modules/file/err.h:127
+#, c-format
+msgid "Data type %d is invalid or unsupported."
+msgstr "O tipo de dados %d é inválido ou não suportado."
+
+#: modules/file/err.h:134
+#, c-format
+msgid "Header field `%s' is missing."
+msgstr "O campo do cabeçalho `%s' está faltando."
+
+#: modules/file/err.h:142
+#, c-format
+msgid "The value of parameter `%s' is invalid or unsupported."
+msgstr "O valor do parâmetro `%s' é inválido ou não suportado."
+
+#: modules/file/err.h:150
+#, c-format
+msgid "Parameter `%s' is missing or invalid."
+msgstr "O Parâmetro `%s' está faltando ou é inválido."
+
+#: modules/file/err.h:158
+msgid "File contains no (importable) data."
+msgstr "O arquivo não contém dados (importáveis)."
+
+#: modules/file/err.h:165
+msgid "File contains no exportable channel."
+msgstr "O arquivo não contém canais exportáveis."
+
+#: modules/file/err.h:173
+msgid "File import was canceled by user."
+msgstr "A importação do arquivo foi cancelada pelo usuário."
+
+#: modules/file/err.h:187
+msgid "Missing header."
+msgstr "Faltando cabeçalho."
+
+#: modules/file/ezdfile.c:135
+msgid "Imports Nanosurf EZD and NID data files."
+msgstr "Importa arquivos de dados Nanosurf EZD e NID."
+
+#: modules/file/ezdfile.c:148
+msgid "Nanosurf files (.ezd, .nid)"
+msgstr "Arquivos Nanosurf (.ezd, .nid)"
+
+#: modules/file/ezdfile.c:321
+msgid "Garbage before first header section."
+msgstr "Lixo antes da primeira sessão do cabeçalho."
+
+#: modules/file/ezdfile.c:332 modules/file/nanoscope-ii.c:259
+msgid "Malformed header line (missing =)."
+msgstr "Linha do cabeçalho mal formatada (faltando =)."
+
+#: modules/file/ezdfile.c:431
+msgid "First section isn't DataSet"
+msgstr "Primeira sessão não é conjunto de dados (DataSet)."
+
+#: modules/file/ezdfile.c:437
+msgid "GroupCount in [DataSet]"
+msgstr "Contagem de grupo (GroupCount) em [DataSet]"
+
+#: modules/file/femtoscan-txt.c:77
+msgid "Imports FemtoScan TXT files."
+msgstr "Importa arquivos FemtoScan TXT."
+
+#: modules/file/femtoscan-txt.c:90
+msgid "FemtoScan text files (.txt)"
+msgstr "Arquivos de texto FemtoScan (.txt)."
+
+#: modules/file/femtoscan-txt.c:189
+msgid "Data line does not start with a Y abscissa."
+msgstr "Linha de dados não começa com uma abcissa Y."
+
+#: modules/file/femtoscan-txt.c:197
+#, c-format
+msgid ""
+"Data line length %u does not correspond to the number of X abscissas %u."
+msgstr ""
+"Tamanho da linha de dados %u não corresponde ao número de %u abcissas X."
+
+#: modules/file/femtoscan.c:81
+msgid "Imports FemtoScan SPM data files."
+msgstr "Importa arquivos de dados FemtoScan SPM."
+
+#: modules/file/femtoscan.c:94
+msgid "FemtoScan SPM files"
+msgstr "Arquivos FemtoScan SPM"
+
+#: modules/file/femtoscan.c:285 modules/file/miffile.c:690
+#: modules/file/mulfile.c:304
+msgid "Image data are outside the file."
+msgstr "Dados da imagem estão fora do arquivo."
+
+#: modules/file/fitsfile.c:76
+msgid "Reads Flexible Image Transport System (FITS) files."
+msgstr "Lê arquivos Flexible Image Transport System (FITS)."
+
+#: modules/file/fitsfile.c:89
+msgid "Flexible Image Transport System FITS (.fits)"
+msgstr "Flexible Image Transport System FITS (.fits)"
+
+#: modules/file/fitsfile.c:128
+#, c-format
+msgid "CFITSIO error while reading the FITS file: %s."
+msgstr "Erro CFITSIO ao ler o arquivo FITS: %s."
+
+#: modules/file/fitsfile.c:160 modules/file/fitsfile.c:172
+#: modules/file/fitsfile.c:183 modules/file/spmxfile.c:385
+msgid "Only two-dimensional images are supported."
+msgstr "Apenas imagens bidimensionais são suportadas."
+
+#: modules/file/gdeffile.c:129
+msgid "Imports DME GDEF data files."
+msgstr "Importa arquivos de dados DME GDEF."
+
+#: modules/file/gdeffile.c:142
+msgid "DME GDEF files (.gdf)"
+msgstr "Arquivos DME GDEF (.gdf)"
+
+#: modules/file/gdeffile.c:187
+#, c-format
+msgid "File version %u.%u is not supported."
+msgstr "Arquivo versão %u. %u não é suportada."
+
+#: modules/file/gdeffile.c:218
+msgid "Control block is truncated."
+msgstr "O bloco de controle está truncado."
+
+#: modules/file/gdeffile.c:225
+msgid "Control block mark is not CB, file is damaged."
+msgstr "Marca do bloco de controle não é CB, o arquivo está danificado."
+
+#: modules/file/gdeffile.c:247
+msgid "Variable record is truncated."
+msgstr "A gravação variável está truncada."
+
+#: modules/file/gdeffile.c:258
+#, c-format
+msgid "Unknown variable type %u."
+msgstr "Tipo de variável %u é desconhecida."
+
+#: modules/file/gdeffile.c:303
+#, c-format
+msgid "Data of variable %s is truncated."
+msgstr "Dado da variável %s está truncado."
+
+#: modules/file/gsffile.c:91
+msgid "Reads and exports Gwyddion Simple Field files."
+msgstr "Lê e exporta arquivo Gwyddion Simple Field."
+
+#: modules/file/gsffile.c:104
+msgid "Gwyddion Simple Field (.gsf)"
+msgstr "Gwyddion Simple Field (.gsf)"
+
+#: modules/file/gwyfile.c:104
+msgid "Loads and saves Gwyddion native data files (serialized objects)."
+msgstr ""
+"Carrega e salva arquivos de dados nativos do Gwyddion (objetos serializados)."
+
+#: modules/file/gwyfile.c:117
+msgid "Gwyddion native format (.gwy)"
+msgstr "Formato nativo do Gwyddion (.gwy)"
+
+#: modules/file/gwyfile.c:179
+msgid "Data deserialization failed."
+msgstr "Deserialização de dados falhou."
+
+#: modules/file/gwyfile.c:184
+#, c-format
+msgid ""
+"Data deserialization succeeded, but resulted in an unexpected object %s."
+msgstr ""
+"Deserialização de dados funcionou, mas resultou em um objeto inesperado %s."
+
+#: modules/file/gwytiff.h:335
+#, c-format
+msgid "BigTIFF reserved fields are %u and %u instead of 8 and 0."
+msgstr "Campos reservados BigTIFF são %u e %u ao invés de 8 e 0."
+
+#: modules/file/gwytiff.h:352 modules/file/gwytiff.h:369
+#, c-format
+msgid "TIFF directory %lu ended unexpectedly."
+msgstr "O diretório %lu TIFF terminou inesperadamente."
+
+#: modules/file/gwytiff.h:487
+#, c-format
+msgid "BigTIFF data type %u was found in a classic TIFF."
+msgstr "Tipo de dados %u BigTIFF foi encontrado em um TIFF clássico."
+
+#: modules/file/gwytiff.h:504
+msgid "Invalid tag data positions were found."
+msgstr "Posições de dados de tag inválidos foram encontrados."
+
+#: modules/file/gwytiff.h:877 modules/file/gwytiff.h:892
+#: modules/file/gwytiff.h:1015 modules/file/gwytiff.h:1022
+#, c-format
+msgid "Required tag %u was not found."
+msgstr "Tag %u requerida não foi encontrada."
+
+#: modules/file/gwytiff.h:945 modules/file/gwytiff.h:989
+#: modules/file/keyence.c:449 modules/file/matfile.c:276
+#: modules/file/matfile.c:298 modules/file/omicronflat.c:1962
+#: modules/file/princetonspe.c:339 modules/file/psia.c:352
+#: modules/file/zemax.c:168
+msgid "File is truncated."
+msgstr "O arquivo está truncado."
+
+#: modules/file/gwytiff.h:1047
+msgid "Non-uniform bits per sample are unsupported."
+msgstr "Bits por amostra não uniformes não são suportados."
+
+#: modules/file/gwytiff.h:1074 modules/file/zeisslsm.c:973
+#, c-format
+msgid "Compression type %u is not supported."
+msgstr "Tipo %u de compressão não pe suportada."
+
+#: modules/file/gwytiff.h:1080
+#, c-format
+msgid "Planar configuration %u is not supported."
+msgstr "Configuração %u planar não é suportada."
+
+#: modules/file/gwytiff.h:1104
+msgid "Unsupported sample format"
+msgstr "Formato de amostra não suportada"
+
+#: modules/file/gwyzip.h:159
+msgid "Unknown error"
+msgstr "Erro desconhecido"
+
+#: modules/file/gwyzip.h:164
+msgid "End of file"
+msgstr "Final do arquivo"
+
+#: modules/file/gwyzip.h:166 modules/file/gwyzip.h:355
+msgid "End of list of files"
+msgstr "Final da lista de arquivos"
+
+#: modules/file/gwyzip.h:168
+msgid "Parameter error"
+msgstr "Erro de parâmetro"
+
+#: modules/file/gwyzip.h:170
+msgid "Bad zip file"
+msgstr "Arquivo zip ruim"
+
+#: modules/file/gwyzip.h:172
+msgid "Internal error"
+msgstr "Erro interno"
+
+#: modules/file/gwyzip.h:174
+msgid "CRC error"
+msgstr "Erro CRC"
+
+#: modules/file/gwyzip.h:177
+#, c-format
+msgid "Minizip error while reading the zip file: %s (%d)."
+msgstr "Erro do minizip ao ler o arquivo zip: %s (%d)."
+
+#: modules/file/gwyzip.h:248 modules/file/jpkscan.c:2776
+#, c-format
+msgid "File %s is missing in the zip file."
+msgstr "O arquivo %s está faltando no arquivo zip."
+
+#: modules/file/gwyzip.h:354 modules/file/gwyzip.h:366
+#, c-format
+msgid "Libzip error while reading the zip file: %s."
+msgstr "Erro do libzip ao ler o arquivo zip: %s."
+
+#: modules/file/gwyzip.h:450
+msgid "Cannot obtain the uncompressed file size."
+msgstr "Não foi possível obter o tamanho do arquivo descompactado."
+
+#: modules/file/gwyzip.h:464
+msgid "Cannot read file contents."
+msgstr "Não foi possível ler o conteúdo do arquivo."
+
+#: modules/file/gxyzffile.c:118
+msgid "Imports Gwyddion XYZ field files."
+msgstr "Importa arquivos de campo Gwyddion XYZ."
+
+#: modules/file/gxyzffile.c:131
+msgid "GwyXYZ data files"
+msgstr "Arquivos de dados GwyXYZ"
+
+#: modules/file/gxyzffile.c:226
+#, c-format
+msgid "Data size %lu is not a multiple of point size %u."
+msgstr "O tamanho %lu dos dados não é um múltiplo do tamanho %u do ponto."
+
+#: modules/file/gxyzffile.c:381
+msgid "Export GXYZF"
+msgstr "Exportar GXYZF"
+
+#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:241
+#: modules/file/xyzexport.c:307
+msgid "XYZ data:"
+msgstr "Dados XYZ:"
+
+#: modules/file/gxyzffile.c:405
+msgid "Multi-channel file with all compatible data"
+msgstr "Arquivo multicanal com todos os dados compatíveis"
+
+#: modules/file/hdf4file.c:339
+msgid "Imports Hierarchical Data Format (HDF) files, version 4."
+msgstr "Importa arquivos Hierarchical Data Format (HDF), versão 4."
+
+#: modules/file/hdf4file.c:360
+msgid "Psi HDF4 files (.hdf)"
+msgstr "Arquivos Psi HDF4 (.hdf)"
+
+#: modules/file/hdf4file.c:541
+msgid "PSI binary header is too short."
+msgstr "Cabeçalho do PSI binário é muito curto."
+
+#: modules/file/hdf4file.c:654
+msgid "Data descriptor header is truncated."
+msgstr "Cabeçalho do descritor de dados está truncado."
+
+#: modules/file/hdf4file.c:664
+msgid "Data descriptor block is truncated."
+msgstr "O bloco do descritor de dados está truncado."
+
+#: modules/file/hdf4file.c:698
+msgid "HDF data with `native' type is not supported."
+msgstr "Dados HDF com tipo 'nativo' não é suportado."
+
+#: modules/file/hdrimage.cc:274
+msgid ""
+"Imports 16bit grayscale PPM, PNG and TIFF images, imports and exports "
+"OpenEXR images (if available)."
+msgstr ""
+"Importa imagens em escala de cinza de 16bits PPM, PNG e TIFF, importa e "
+"exporta imagens OpenEXR (se disponível)."
+
+#: modules/file/hdrimage.cc:289
+msgid "OpenEXR images (.exr)"
+msgstr "Imagens OpenEXR (.exr)"
+
+#: modules/file/hdrimage.cc:297
+msgid "PNG images with 16bit depth (.png)"
+msgstr "Imagens PNG com 16bits de profundidade (.png)"
+
+#: modules/file/hdrimage.cc:304
+msgid "PGM images with 16bit depth (.pgm)"
+msgstr "Imagens PGM com 16bits de profundidade (.pgm)"
+
+#: modules/file/hdrimage.cc:310
+msgid "TIFF and BigTIFF images with high depth (.tiff)"
+msgstr "Imagens TIFF e BigTIFF com grande profundidade (.tiff)"
+
+#: modules/file/hdrimage.cc:391
+#, c-format
+msgid "EXR image writing failed with libImf error: %s"
+msgstr "Falha ao escrever imagem EXR com erro libImf: %s"
+
+#: modules/file/hdrimage.cc:414
+msgid "Export EXR Image"
+msgstr "Exporta imagem EXR"
+
+#: modules/file/hdrimage.cc:430
+msgid "Data format:"
+msgstr "Formato dos dados:"
+
+#: modules/file/hdrimage.cc:439
+msgid "Half (16bit float)"
+msgstr "Metade (ponto flutuante 16bits)"
+
+#: modules/file/hdrimage.cc:440
+msgid "Float (32bit)"
+msgstr "Ponto flutuante (32bits)"
+
+#: modules/file/hdrimage.cc:441
+msgid "Integer (32bit)"
+msgstr "Inteiro (32bits)"
+
+#: modules/file/hdrimage.cc:446
+msgid "_Z scale:"
+msgstr "Escala _Z:"
+
+#: modules/file/hdrimage.cc:475
+msgid "Representable"
+msgstr "Representável"
+
+#: modules/file/hdrimage.cc:480 modules/graph/graph_stats.c:146
+#: modules/tools/stats.c:203
+msgid "Minimum:"
+msgstr "Mínimo:"
+
+#: modules/file/hdrimage.cc:496 modules/graph/graph_stats.c:147
+#: modules/tools/stats.c:204
+msgid "Maximum:"
+msgstr "Máximo:"
+
+#: modules/file/hdrimage.cc:527
+msgid "_Use"
+msgstr "_Usar"
+
+#: modules/file/hdrimage.cc:825
+#, c-format
+msgid "EXR image loading failed with libImf error: %s"
+msgstr "Carregamento de imagem EXR falhou com erro libImf: %s"
+
+#: modules/file/hdrimage.cc:974
+#, c-format
+msgid "OpenEXR data type %u is invalid or unsupported."
+msgstr "O tipo de dados %u OpenEXR é inválido ou não suportado."
+
+#: modules/file/hdrimage.cc:1433 modules/file/hdrimage.cc:1442
+#: modules/file/imgexport.c:5198 modules/file/imgexport.c:5209
+#, c-format
+msgid "libpng initialization error (in %s)"
+msgstr "Erro na inicialização de libpng (em %s)"
+
+#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5273
+#, fuzzy
+msgid "libpng error occurred"
+msgstr "Um erro libpng ocorreu"
+
+#. TRANSLATORS: Dialog title; %s is PNG, TIFF, ...
+#: modules/file/hdrimage.cc:2210 modules/file/pixmap.c:786
+#, c-format
+msgid "Import %s"
+msgstr "Importar %s"
+
+#: modules/file/hdrimage.cc:2237 modules/file/pixmap.c:813
+msgid "Image Information"
+msgstr "Informação da imagem"
+
+#: modules/file/hdrimage.cc:2246 modules/file/pixmap.c:820
+msgid "Horizontal size:"
+msgstr "Tamanho horizontal:"
+
+#: modules/file/hdrimage.cc:2252 modules/file/pixmap.c:826
+msgid "Vertical size:"
+msgstr "Tamanho vertical:"
+
+#: modules/file/hdrimage.cc:2257 modules/file/pixmap.c:831
+msgid "Channels:"
+msgstr "Canais:"
+
+#: modules/file/hdrimage.cc:2263
+msgid "Pages:"
+msgstr "Páginas:"
+
+#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3059
+#: modules/file/pixmap.c:862 modules/file/rawfile.c:649
+#: modules/process/dimensions.h:449 modules/xyz/xyz_drift.c:774
+#: modules/xyz/xyz_raster.c:535
+msgid "Physical Dimensions"
+msgstr "Dimensões físicas "
+
+#: modules/file/hdrimage.cc:2330 modules/file/hdrimage.cc:2395
+#: modules/file/pixmap.c:894 modules/file/pixmap.c:949
+#: modules/file/rawfile.c:681 modules/file/rawfile.c:737
+#: modules/process/calcoefs_new.c:408 modules/process/calcoefs_new.c:475
+#: modules/process/calcoefs_simple.c:391 modules/process/calcoefs_simple.c:458
+#: modules/process/calcoefs_view.c:511 modules/process/calcoefs_view.c:549
+#: modules/process/calibrate.c:459 modules/process/calibrate.c:514
+#: modules/process/dimensions.h:143 modules/process/volumize_layers.c:259
+#: modules/volume/volume_calibrate.c:409 modules/volume/volume_calibrate.c:429
+#: modules/volume/volume_calibrate.c:449 modules/volume/volume_calibrate.c:498
+msgid "verb|Change"
+msgstr "Mudar"
+
+#: modules/file/hdrimage.cc:2345 modules/file/pixmap.c:907
+#: modules/file/rawfile.c:694 modules/process/crosscor.c:260
+#: modules/process/dimensions.h:459
+msgid "H_eight:"
+msgstr "_Altura:"
+
+#: modules/file/hdrimage.cc:2354 modules/file/nmmxyz.c:570
+#: modules/file/pixmap.c:914 modules/file/rawfile.c:701
+msgid "Identical _measures"
+msgstr "_Medidas idênticas"
+
+#: modules/file/hdrimage.cc:2368 modules/file/pixmap.c:926
+#: modules/file/rawfile.c:713
+msgid "_Z-scale (per sample unit):"
+msgstr "Escala _Z (por unidade de amostra):"
+
+#: modules/file/hdrimage.cc:2557 modules/file/pixmap.c:1176
+#: modules/file/rawfile.c:1386 modules/process/calcoefs_new.c:819
+#: modules/process/calcoefs_simple.c:1197 modules/process/calcoefs_view.c:1380
+#: modules/process/calibrate.c:1013 modules/process/dimensions.h:177
+#: modules/process/volumize_layers.c:314 modules/volume/volume_calibrate.c:957
+msgid "Change Units"
+msgstr "Modificar unidades"
+
+#: modules/file/hdrimage.cc:2571 modules/file/pixmap.c:1190
+#: modules/file/rawfile.c:1400 modules/process/calcoefs_new.c:832
+#: modules/process/calcoefs_simple.c:1210 modules/process/calcoefs_view.c:1393
+#: modules/process/calibrate.c:1027 modules/process/dimensions.h:190
+#: modules/process/volumize_layers.c:328 modules/volume/volume_calibrate.c:971
+msgid "New _units:"
+msgstr "Novas _unidades:"
+
+#: modules/file/hitachi-afm.c:107
+msgid "Imports Hitachi AFM files."
+msgstr "Importa arquivos Hitachi AFM."
+
+#: modules/file/hitachi-afm.c:122
+msgid "Hitachi AFM files (.afm)"
+msgstr "Arquivos Hitachi AFM (.afm)"
+
+#: modules/file/hitachi-afm.c:128
+msgid "Hitachi AFM files, old (.afm)"
+msgstr "Arquivos Hitachi AFM, antigos (.afm)"
+
+#: modules/file/hitachi-afm.c:205
+#, c-format
+msgid "Hitachi-AFM has not registered file type `%s'."
+msgstr "Hitachi-AFM não tem tipo de arquivo `%s' registrado."
+
+#: modules/file/hitachi-sem.c:84
+msgid "Imports Hitachi S-3700 and S-4800 SEM files."
+msgstr "Importa arquivos SEM Hitachi S-3700 e S-4800."
+
+#: modules/file/hitachi-sem.c:97
+msgid "Hitachi SEM files (.txt + image)"
+msgstr "Arquivos SEM Hitachi (.txt + imagem)"
+
+#: modules/file/hitachi-sem.c:167 modules/file/oldmda.c:246
+#: modules/file/unisoku.c:235
+msgid "No corresponding data file was found for header file."
+msgstr ""
+"Nenhum arquivo de dados correspondente foi encontrado para o cabeçalho do "
+"arquivo."
+
+#: modules/file/hitachi-sem.c:173
+#, c-format
+msgid "Cannot load image: %s"
+msgstr "Não foi possível carregar imagem: %s"
+
+#: modules/file/hitachi-sem.c:189
+#, c-format
+msgid "Field DataSize %ux%u does not match image dimensions %ux%u."
+msgstr ""
+"O campo tamanho do arquivo (DataSize) %ux%u não corresponde às dimensões da "
+"imagem %ux%u."
+
+#: modules/file/igorfile.c:210
+msgid "Imports Igor binary waves (.ibw)."
+msgstr "Importa ondas binárias Igor (.ibw)."
+
+#: modules/file/igorfile.c:223
+msgid "Igor binary waves (.ibw)"
+msgstr "Ondas binárias Igor (.ibw)"
+
+#: modules/file/igorfile.c:283
+#, c-format
+msgid "Format version is %d.  Only version 5 is supported."
+msgstr "A versão do formato é %d. Apenas a versão 5 é suportada."
+
+#: modules/file/igorfile.c:305
+msgid "Only two-dimensional data are supported."
+msgstr "Apenas dados bidimensionais são suportados."
+
+#: modules/file/igorfile.c:317
+#, c-format
+msgid "Number of data points %u does not match resolutions %u×%u×%u."
+msgstr "O número de pontos dos dados %u não corresponde à resolução %u×%u×%u."
+
+#: modules/file/igorfile.c:331
+#, c-format
+msgid "Data size %u does not match the number of data points %u×%u."
+msgstr ""
+"Tamanho dos dados %u não corresponde ao número de pontos dos dados %u×%u."
+
+#: modules/file/igorfile.c:369
+msgid "Cannot read channel labels."
+msgstr "Não foi possível ler os rótulos dos canais."
+
+#: modules/file/imgexport.c:391 modules/file/pixmap.c:178
+msgid "Portable Network Graphics (.png)"
+msgstr "Portable Network Graphics (.png)"
+
+#: modules/file/imgexport.c:397 modules/file/pixmap.c:182
+msgid "JPEG (.jpeg,.jpg)"
+msgstr "JPEG (.jpeg,.jpg)"
+
+#: modules/file/imgexport.c:403 modules/file/pixmap.c:186
+msgid "TIFF (.tiff,.tif)"
+msgstr "TIFF (.tiff,.tif)"
+
+#: modules/file/imgexport.c:409 modules/file/pixmap.c:190
+msgid "Portable Pixmap (.ppm,.pnm)"
+msgstr "Portable Pixmap (.ppm,.pnm)"
+
+#: modules/file/imgexport.c:415 modules/file/pixmap.c:194
+msgid "Windows or OS2 Bitmap (.bmp)"
+msgstr "Windows ou OS2 Bitmap (.bmp)"
+
+#: modules/file/imgexport.c:421 modules/file/pixmap.c:198
+msgid "TARGA (.tga,.targa)"
+msgstr "TARGA (.tga,.targa)"
+
+#: modules/file/imgexport.c:428
+msgid "WebP (.webp)"
+msgstr "WebP (.webp)"
+
+#: modules/file/imgexport.c:436
+msgid "Portable document format (.pdf)"
+msgstr "Portable document format (.pdf)"
+
+#: modules/file/imgexport.c:444
+msgid "Encapsulated PostScript (.eps)"
+msgstr "Encapsulated PostScript (.eps)"
+
+#: modules/file/imgexport.c:452
+msgid "Scalable Vector Graphics (.svg)"
+msgstr "Scalable Vector Graphics (.svg)"
+
+#: modules/file/imgexport.c:462 modules/tools/selectionmanager.c:269
+msgid "Horiz./vert. lines"
+msgstr "Linhas horiz./vert."
+
+#: modules/file/imgexport.c:466 modules/tools/selectionmanager.c:270
+msgid "Ellipses"
+msgstr "Elipses"
+
+#: modules/file/imgexport.c:470 modules/tools/selectionmanager.c:272
+msgid "Lines"
+msgstr "Linhas"
+
+#: modules/file/imgexport.c:478 modules/tools/selectionmanager.c:275
+msgid "Rectangles"
+msgstr "Retângulos"
+
+#: modules/file/imgexport.c:482 modules/process/lat_synth.c:565
+#: modules/process/lat_synth.c:637 modules/tools/selectionmanager.c:271
+msgid "Lattice"
+msgstr "Rede"
+
+#: modules/file/imgexport.c:486
+msgid "Path"
+msgstr "Caminho"
+
+#: modules/file/imgexport.c:492 modules/file/imgexport.c:498
+msgid "ruler|_None"
+msgstr "régua|_Nenhuma"
+
+#: modules/file/imgexport.c:493
+msgid "_Rulers"
+msgstr "_Réguas"
+
+#: modules/file/imgexport.c:494
+msgid "_Inset scale bar"
+msgstr "_Inserir barra de escala"
+
+#: modules/file/imgexport.c:499
+msgid "_False color ruler"
+msgstr "Régua de cores _falsa"
+
+#: modules/file/imgexport.c:503
+msgid "title|None"
+msgstr "título|Nenhum"
+
+#: modules/file/imgexport.c:504
+msgid "At the top"
+msgstr "No topo"
+
+#: modules/file/imgexport.c:505
+msgid "Along the right edge"
+msgstr "Ao longo da borda direita"
+
+#: modules/file/imgexport.c:511
+msgid ""
+"Renders data into vector (SVG, PDF, EPS) and pixmap (PNG, JPEG, TIFF, WebP, "
+"PPM, BMP, TARGA) images. Export to some formats relies on GDK and other "
+"libraries thus may be installation-dependent."
+msgstr ""
+"Renderiza dados em vetores (SVG, PDF, EPS) e imagens pixmap (PNG, JPEG, "
+"TIFF, WebP, PPM, BMP, TARGA). Exportação para alguns formatos invoca GDK e "
+"outrasbibliotecas, deste modo, pode depender da instalação."
+
+#: modules/file/imgexport.c:2933
+msgid "Select Color"
+msgstr "Selecionar cor"
+
+#: modules/file/imgexport.c:3005
+msgid "White"
+msgstr "Branco "
+
+#: modules/file/imgexport.c:3014
+msgid "Black"
+msgstr "Preto"
+
+#: modules/file/imgexport.c:3069
+msgid "Pi_xel size:"
+msgstr "Tamanho do pi_xel:"
+
+#: modules/file/imgexport.c:3077
+msgid "Pixels per _inch:"
+msgstr "Pixeis por polegada:"
+
+#: modules/file/imgexport.c:3102
+msgid "_Zoom:"
+msgstr "_Zoom:"
+
+#: modules/file/imgexport.c:3120 modules/process/bdep_synth.c:430
+#: modules/process/col_synth.c:486 modules/process/diff_synth.c:508
+#: modules/process/domain_synth.c:510 modules/process/fibre_synth.c:540
+#: modules/process/grain_mark.c:284 modules/process/lat_synth.c:753
+#: modules/process/obj_synth.c:573 modules/process/pat_synth.c:853
+#: modules/process/pat_synth.c:1155 modules/process/pat_synth.c:1490
+#: modules/process/phase_synth.c:298 modules/process/tip_blind.c:342
+msgid "_Height:"
+msgstr "_Altura:"
+
+#: modules/file/imgexport.c:3136
+msgid "_Font:"
+msgstr "_Fonte:"
+
+#: modules/file/imgexport.c:3145
+msgid "_Font size:"
+msgstr "Tamanho da _fonte:"
+
+#: modules/file/imgexport.c:3163
+msgid "O_utline thickness:"
+msgstr "Espessura do esboço:"
+
+#: modules/file/imgexport.c:3172
+msgid "_Border width:"
+msgstr "Largura da _borda:"
+
+#: modules/file/imgexport.c:3181
+msgid "_Tick length:"
+msgstr "Comprimento do _traço:"
+
+#: modules/file/imgexport.c:3188
+msgid "Tie sizes to _data pixels"
+msgstr "Associar tamanhos aos pixeis dos _dados"
+
+#: modules/file/imgexport.c:3198 modules/file/rawfile.c:843
+msgid "_Decimal separator is comma"
+msgstr "O separador _decimal é vírgula"
+
+#: modules/file/imgexport.c:3210
+msgid "Colors"
+msgstr "Cores"
+
+#: modules/file/imgexport.c:3215
+msgid "_Line and text color:"
+msgstr "Cor da _linha e texto:"
+
+#: modules/file/imgexport.c:3220
+msgid "_Transparent background"
+msgstr "Fundo _transparente"
+
+#: modules/file/imgexport.c:3231
+msgid "_Background color:"
+msgstr "Cor do fundo:"
+
+#: modules/file/imgexport.c:3433 modules/process/fibre_synth.c:582
+#: modules/process/pat_synth.c:470
+msgid "Placement"
+msgstr "Posicionamento"
+
+#: modules/file/imgexport.c:3437
+msgid "left"
+msgstr "esquerda"
+
+#: modules/file/imgexport.c:3440
+msgid "center"
+msgstr "centro"
+
+#: modules/file/imgexport.c:3443
+msgid "right"
+msgstr "direita"
+
+#: modules/file/imgexport.c:3448
+msgid "top"
+msgstr "topo"
+
+#: modules/file/imgexport.c:3456
+msgid "bottom"
+msgstr "base"
+
+#: modules/file/imgexport.c:3479
+msgid "Lateral scale"
+msgstr "Escala lateral"
+
+#: modules/file/imgexport.c:3496 modules/process/lno_synth.c:1053
+msgid "_Length:"
+msgstr "_Comprimento:"
+
+#: modules/file/imgexport.c:3502
+msgid "_Auto"
+msgstr "_Automático"
+
+#: modules/file/imgexport.c:3519 modules/file/imgexport.c:3832
+msgid "Hori_zontal gap:"
+msgstr "Espaço hori_zontal"
+
+#: modules/file/imgexport.c:3526 modules/file/imgexport.c:3812
+msgid "_Vertical gap:"
+msgstr "Espaço _vertical"
+
+#: modules/file/imgexport.c:3538 modules/file/imgexport.c:4134
+msgid "Colo_r:"
+msgstr "Co_r:"
+
+#: modules/file/imgexport.c:3542 modules/file/imgexport.c:4138
+msgid "Out_line color:"
+msgstr "Cor do esboço:"
+
+#: modules/file/imgexport.c:3547 modules/file/imgexport.c:4143
+msgid "O_pacity:"
+msgstr "O_pacidade:"
+
+#: modules/file/imgexport.c:3554
+msgid "Draw _ticks"
+msgstr "Desenhar _traços"
+
+#: modules/file/imgexport.c:3564
+msgid "Draw _label"
+msgstr "Desenhar rótu_lo"
+
+#: modules/file/imgexport.c:3574
+msgid "Draw text _above scale bar"
+msgstr ""
+
+#: modules/file/imgexport.c:3738
+msgid "Image"
+msgstr "Imagem"
+
+#: modules/file/imgexport.c:3742 modules/process/calcoefs_view.c:473
+#: modules/process/correct_affine.c:538 modules/process/drift.c:298
+#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:203
+#: modules/process/fft_filter_1d.c:296 modules/process/fft_profile.c:293
+#: modules/process/fractal.c:262 modules/process/nanoindent_adjust.c:229
+#: modules/process/polydistort.c:250 modules/process/rotate.c:274
+#: modules/process/scale.c:257 modules/process/straighten_path.c:270
+#: modules/process/unrotate.c:277 modules/tools/linestats.c:400
+#: modules/tools/profile.c:552 modules/tools/roughness.c:879
+#: modules/tools/sfunctions.c:481 modules/xyz/xyz_raster.c:601
+msgid "_Interpolation type:"
+msgstr "Tipo de _interpolação:"
+
+#: modules/file/imgexport.c:3772
+msgid "Draw _frame"
+msgstr "Desenhar quadro"
+
+#: modules/file/imgexport.c:3781
+msgid "Draw _mask"
+msgstr "Desenhar _máscara"
+
+#: modules/file/imgexport.c:3791
+msgid "Draw mask _legend"
+msgstr "Desenhar _legenda da máscara"
+
+#: modules/file/imgexport.c:3819
+msgid "Value Scale"
+msgstr "Escala de valor"
+
+#: modules/file/imgexport.c:3840
+msgid "Fi_xed precision:"
+msgstr "Precisão fi_xa:"
+
+# Is 'kilo threshold' an expression?
+# 'kilo threshold' é uma expressão?
+#: modules/file/imgexport.c:3855
+msgid "Fixed _kilo threshold:"
+msgstr "Limite fixo:"
+
+#: modules/file/imgexport.c:3869 modules/file/imgexport.c:4583
+msgid "Title"
+msgstr "Título"
+
+#: modules/file/imgexport.c:3877
+msgid "Posi_tion:"
+msgstr "Posição:"
+
+#: modules/file/imgexport.c:3884
+msgid "_Gap:"
+msgstr "_Espaço:"
+
+#: modules/file/imgexport.c:3891
+msgid "Put _units to title"
+msgstr "Colocar _unidades para títu_lo"
+
+#: modules/file/imgexport.c:4075
+msgid "Draw _selection"
+msgstr "Desenhar _seleção"
+
+#: modules/file/imgexport.c:4126 modules/tools/selectionmanager.c:361
+msgid "Objects"
+msgstr "Objetos"
+
+#: modules/file/imgexport.c:4563
+msgid "Lateral"
+msgstr "Lateral"
+
+#: modules/file/imgexport.c:4602 modules/file/rawfile.c:1040
+#: modules/process/calcoefs_load.c:230 modules/process/neural.c:700
+msgid "verb|_Load"
+msgstr "Carregar"
+
+#: modules/file/imgexport.c:4608 modules/file/rawfile.c:1046
+#: modules/process/neural.c:706
+msgid "verb|_Store"
+msgstr "Armazenar"
+
+#: modules/file/imgexport.c:4614 modules/file/rawfile.c:1052
+#: modules/process/neural.c:712
+msgid "_Rename"
+msgstr "_Renomear"
+
+#: modules/file/imgexport.c:4634 modules/file/rawfile.c:1071
+msgid "Preset _name:"
+msgstr "Pré ajustar _nome:"
+
+#: modules/file/imgexport.c:4705
+#, c-format
+msgid "Export %s"
+msgstr "Exportar %s"
+
+#: modules/file/imgexport.c:4727
+msgid "Export as 1_6 bit grayscale"
+msgstr "Exportar como escala de cinza de 1_6 bits"
+
+#: modules/file/imgexport.c:4750
+msgid "Lateral Scale"
+msgstr "Escala lateral"
+
+#: modules/file/imgexport.c:4755
+msgid "Values"
+msgstr "Valores"
+
+#: modules/file/imgexport.c:4760
+msgid "Selection"
+msgstr "Seleção"
+
+#: modules/file/imgexport.c:4765 modules/file/rawfile.c:462
+#: modules/process/convolution_filter.c:275
+msgid "Presets"
+msgstr "Pré ajustes"
+
+#: modules/file/imgexport.c:5525
+#, c-format
+msgid "Cairo error occurred: %s"
+msgstr "Ocorreu um erro Cairo: %s"
+
+#: modules/file/imgexport.c:5549
+#, c-format
+msgid "Pixbuf save failed: %s."
+msgstr "Falha ao salvar Pixbuf: %s."
+
+#: modules/file/imgexport.c:5827
+msgid "Image is too large to be stored as TARGA."
+msgstr "A imagem é muito grande para ser armazenada como TARGA."
+
+#: modules/file/imgexport.c:6406 modules/file/imgexport.c:6435
+msgid "Draw _numbers"
+msgstr "Desenhar _números"
+
+#: modules/file/imgexport.c:6418 modules/file/imgexport.c:6466
+msgid "_End marker length:"
+msgstr "Comprimento do marcador de fim:"
+
+#: modules/file/imgexport.c:6447
+msgid "Marker _radius:"
+msgstr "_Raio do marcador:"
+
+#: modules/file/imgexportpreset.h:170 modules/process/maskops.c:150
+msgid "Mask"
+msgstr "Máscara"
+
+#: modules/file/intelliwave.c:231
+msgid "Imports IntelliWave interferometric ESD data."
+msgstr "Importa dados IntelliWave interferometric ESD."
+
+#: modules/file/intelliwave.c:244
+msgid "IntelliWave interferometric data (.esd)"
+msgstr "Dados IntelliWave interferometric (.esd)"
+
+#: modules/file/intelliwave.c:306
+#, c-format
+msgid ""
+"Invalid data address 0x%0x found.  File is in some unknown format version."
+msgstr ""
+"Foi encontrado um endereço de dados inválido 0x%0x. O arquivo está em algum "
+"formato de versão desconhecida."
+
+#: modules/file/intematix.c:125
+msgid "Imports Intematix SDF data files."
+msgstr "Importa arquivos de dados Intematix SDF."
+
+#: modules/file/intematix.c:138
+msgid "Intematix SDF data files (.sdf)"
+msgstr "Arquivos de dados Intematix SDF (.sdf)"
+
+#: modules/file/intematix.c:306
+msgid "Parameter tag set is incomplete."
+msgstr "Conjunto de tags do parâmetro está incompleto."
+
+#: modules/file/intematix.c:311
+msgid "image depth"
+msgstr "Profundidade da imagem."
+
+#: modules/file/iso28600.c:543
+msgid "Imports and exports ISO 28600:2011 SPM data transfer format."
+msgstr ""
+"Importar e exportar formato de transferência de dados ISO 28600:2011 SPM."
+
+#: modules/file/iso28600.c:559
+msgid "ISO 28600:2011 SPM data transfer files (.spm)"
+msgstr "Arquivos de transferência de dados ISO 28600:2011 SPM (.spm)"
+
+#: modules/file/iso28600.c:658
+#, fuzzy, c-format
+msgid ""
+"Only regular and irregular mappings are implemented but the file has mapping "
+"type ‘%s’."
+msgstr ""
+"Apenas mapeamentos regulares estão implementados, mas o arquivo tem um "
+"mapeamento do tipo ‘%s’."
+
+#: modules/file/iso28600.c:687 modules/file/iso28600.c:696
+#: modules/file/iso28600.c:705
+#, c-format
+msgid "List ‘%s’ has %u items which differs from the number %u given by ‘%s’."
+msgstr "A lista ‘%s’ possui %u itens que diferem do número %u dado por ‘%s’."
+
+#: modules/file/iso28600.c:775
+#, fuzzy, c-format
+msgid "End of file reached when reading sample #%u of %u"
+msgstr "Fim de arquivo alcançado ao ler amostra #%d de %d"
+
+#: modules/file/iso28600.c:784 modules/file/iso28600.c:873
+#, fuzzy, c-format
+msgid "Malformed data encountered when reading sample #%u"
+msgstr "Dados mal formados foram encontrados ao ler amostra #%d de %d"
+
+#: modules/file/iso28600.c:797 modules/file/iso28600.c:887
+#: modules/file/iso28600.c:1022
+msgid "Missing end-of-data marker."
+msgstr "Está faltando o marcador de fim de dados."
+
+#: modules/file/iso28600.c:1003 modules/file/sdfile.c:846
+#: modules/file/sdfile.c:863 modules/file/spip-asc.c:239
+#: modules/file/witec-asc.c:223 modules/file/wsffile.c:215
+#, c-format
+msgid "End of file reached when reading sample #%d of %d"
+msgstr "Fim de arquivo alcançado ao ler amostra #%d de %d"
+
+#: modules/file/iso28600.c:1012 modules/file/spip-asc.c:246
+#: modules/file/witec-asc.c:230 modules/file/wsffile.c:222
+#, c-format
+msgid "Malformed data encountered when reading sample #%d of %d"
+msgstr "Dados mal formados foram encontrados ao ler amostra #%d de %d"
+
+#: modules/file/iso28600.c:1184
+#, c-format
+msgid "Line %u does not contain mandatory label ‘%s’."
+msgstr "A linha %u não contém o rótulo obrigatório ‘%s’."
+
+#: modules/file/jeol.c:537
+msgid "Imports JEOL data files."
+msgstr "Importa arquivos de dados JEOL."
+
+#: modules/file/jeol.c:550
+msgid "JEOL data files (.tif)"
+msgstr "Arquivos de dados JEOL (.tif)"
+
+#: modules/file/jeol.c:678
+msgid "The type of data is unknown.  Please report it to the developers."
+msgstr ""
+"O tipo de dados é desconhecido. Por favor, reporte isto aos desenvolvedores."
+
+#: modules/file/jpkscan.c:292
+msgid "Imports JPK image scans."
+msgstr "Importa imagem escaneada JPK."
+
+#: modules/file/jpkscan.c:305
+msgid "JPK image scans (.jpk, .jpk-qi-image)"
+msgstr "Imagem escaneada JPK (.jpk, .jpk-qi-image)"
+
+#: modules/file/jpkscan.c:312
+msgid "JPK force curves (.jpk-force, .jpk-force-map, .jpk-qi-data)"
+msgstr "Curvas de força JPK (.jpk-force, .jpk-force-map, .jpk-qi-data)"
+
+#: modules/file/jpkscan.c:378
+msgid "File does not contain grid dimensions."
+msgstr "O arquivo não contém dimensões da grade."
+
+#: modules/file/jpkscan.c:736 modules/file/nanoobserver.c:360
+#: modules/file/nanoscantech.c:205 modules/file/opengps.c:209
+#: modules/file/sensofarx.c:183 modules/file/spmxfile.c:166
+msgid "Minizip cannot open the file as a ZIP file."
+msgstr "O Minizip não pode abrir o arquivo como um arquivo ZIP."
+
+#: modules/file/jpkscan.c:758 modules/file/jpkscan.c:2717
+#, c-format
+msgid "Scanning file (%u curves)..."
+msgstr ""
+
+#: modules/file/jpkscan.c:798 modules/file/nmmxyz.c:299
+msgid "Reading files..."
+msgstr "Lendo arquivos..."
+
+#: modules/file/jpkscan.c:816
+#, fuzzy
+msgid "Creating volume data..."
+msgstr "Carregar dados de volume"
+
+#: modules/file/jpkscan.c:968
+msgid "Non-uniform point and/or segment numbering is not supported."
+msgstr "Numeração não uniforme de ponto e/ou segmento não é suportada."
+
+#: modules/file/jpkscan.c:977
+msgid "Non-uniform channel lists are not supported."
+msgstr "Listas de canais não uniformes não são suportadas."
+
+#: modules/file/jpkscan.c:985
+#, c-format
+msgid "Data file %s was found instead of expected %s."
+msgstr "O arquivo de dados %s foi encontrado ao invés do esperados %s."
+
+#: modules/file/jpkscan.c:1900
+#, fuzzy, c-format
+msgid "Header properties file for index %u is missing."
+msgstr "O campo do cabeçalho `%s' está faltando."
+
+#: modules/file/jpkscan.c:2519
+msgid "Cannot find any height channel."
+msgstr "Não foi possível encontrar nenhum canal de altura."
+
+#: modules/file/jspmfile.c:188
+msgid "Imports JEOL JSPM data files."
+msgstr "Importa arquivos de dados JEOL JSPM."
+
+#: modules/file/jspmfile.c:201
+msgid "JEOL JSPM data files (.tif)"
+msgstr "Arquivos de dados JEOL JSPM (.tif)"
+
+#: modules/file/jspmfile.c:280
+#, c-format
+msgid "Header block %u has invalid position or size."
+msgstr "Bloco %u do cabeçalho tem posição ou tamanho inválido."
+
+#: modules/file/jspmfile.c:362 modules/file/jspmfile.c:369
+#: modules/file/jspmfile.c:431 modules/file/jspmfile.c:438
+msgid "Cannot find image header block."
+msgstr "Não foi possível encontrar bloco do cabeçalho da imagem."
+
+#: modules/file/jspmfile.c:483
+msgid "Cannot find piezo header block."
+msgstr "Não foi possível encontrar bloco do cabeçalho de piezo."
+
+#: modules/file/keyence.c:315
+msgid "Imports Keyence VK4 files."
+msgstr "Importa arquivos Keyence VK4."
+
+#: modules/file/keyence.c:328
+msgid "Keyence VK4 data files (.vk4)"
+msgstr "Arquivos de dados Keyence VK4 (.vk4)"
+
+#: modules/file/keyence.c:903 modules/file/omicronflat.c:2528
+#, c-format
+msgid "Cannot convert string from UTF-16: %s"
+msgstr "Não foi possível converter string de UTF-16: %s"
+
+#: modules/file/leica.c:176
+msgid "Imports Leica CLSM image files (LIF)."
+msgstr "Importa arquivos de imagem Leica CLSM (LIF)."
+
+#: modules/file/leica.c:189
+msgid "Leica LIF image files (.lif)"
+msgstr "Arquivos de imagem Leica LIF (.lif)"
+
+#: modules/file/lextfile.c:80
+msgid "Imports LEXT data files."
+msgstr "Importa arquivos de dados LEXT."
+
+#: modules/file/lextfile.c:93
+msgid "Olympus LEXT OLS4000 (.lext)"
+msgstr "Olympus LEXT OLS4000 (.lext)"
+
+#: modules/file/magellan.c:61
+msgid "Imports FEI Magellan SEM images."
+msgstr "Importa imagens FEI Magellan SEM."
+
+#: modules/file/magellan.c:74
+msgid "FEI Magellan SEM image (.tif)"
+msgstr "Imagem FEI Magellan SEM (.tif)"
+
+#: modules/file/mapvue.c:467
+msgid "Imports MapVue data files (.map)."
+msgstr "Importa arquivos de dados MapVue (.map)."
+
+#: modules/file/mapvue.c:480
+msgid "MapVue files (.map)"
+msgstr "Arquivos MapVue (.map)"
+
+#: modules/file/mapvue.c:556 modules/file/mapvue.c:586
+#, c-format
+msgid "Required tag %u or %u was not found."
+msgstr "A tag requerida %u ou %u não foi encontrada."
+
+#: modules/file/mapvue.c:798
+msgid "File end was reached while scanning tags."
+msgstr "O final do arquivo foi alcançado enquanto escaneava tags."
+
+#: modules/file/mapvue.c:810
+#, c-format
+msgid "Expected tag %u size is %u bytes, but the actual size is %u bytes."
+msgstr ""
+"O tamanho esperado %u da tag é de %u bytes, mas o tamanho atual é de %u "
+"bytes."
+
+#: modules/file/mapvue.c:824
+#, c-format
+msgid "Tag %u size is %u bytes, which is not enough to hold the tag marker."
+msgstr ""
+"O tamanho %u da tag é de %u bytes, o qual não é suficiente para sustentar o "
+"marcador de tags."
+
+#: modules/file/mapvue.c:835 modules/file/mapvue.c:848
+#, c-format
+msgid ""
+"Tag %u size is %u bytes, which is not enough to hold the tag marker and size."
+msgstr ""
+"O tamanho %u da tag é de %u bytes, o qual não é suficiente para sustentar o "
+"tamanho e marcador de tags."
+
+#: modules/file/mapvue.c:859
+#, c-format
+msgid "Tag marker is missing on an unknown tag %u."
+msgstr "O marcador de tags está faltando ou a tag %u é desconhecida."
+
+#: modules/file/mapvue.c:878 modules/file/mapvue.c:888
+msgid "Character array does not fit into the file."
+msgstr "O arranjo de caracteres não cabe no arquivo."
+
+#: modules/file/mapvue.c:905 modules/file/mapvue.c:916
+#: modules/file/mapvue.c:926
+msgid "Fiducial record does not fit into the file."
+msgstr "A gravação fiducial não cabe no arquivo."
+
+#: modules/file/mapvue.c:1150
+#, c-format
+msgid "Tag %u size is %u which is not sufficient to hold its content."
+msgstr ""
+"O tamanho %u da tag é %u, o qual não é suficiente para sustentar seu "
+"conteúdo."
+
+#: modules/file/matfile.c:223
+msgid "Imports Matlab MAT files v5."
+msgstr "Importa arquivos Matlab MAT v5."
+
+#: modules/file/matfile.c:236
+msgid "Matlab MAT 5 files (.mat)"
+msgstr "Arquivos Matlab MAT 5 (.mat)"
+
+#: modules/file/matfile.c:308
+msgid "Compressed data inside compressed data found."
+msgstr "Foram encontrados dados compactados dentro de dados compactados."
+
+#: modules/file/matfile.c:346
+#, c-format
+msgid "Invalid short tag of type %u claims to consists of %u bytes."
+msgstr "Tag curta do tipo %u inválida alega consistir de %u bytes."
+
+#: modules/file/matfile.c:614
+#, c-format
+msgid "Decompression of compressed variable failed with error %d."
+msgstr "Descompactação das variáveis comprimidas falhou com erro %d."
+
+#: modules/file/metropro.c:340
+msgid "Imports binary MetroPro (Zygo) data files."
+msgstr "Importa arquivos de dados binários MetroPro (Zygo)."
+
+#: modules/file/metropro.c:353
+msgid "MetroPro files (.dat)"
+msgstr "Arquivos MetroPro (.dat)"
+
+#: modules/file/metropro.c:534
+msgid "File header is larger than file."
+msgstr "Cabeçalho do arquivo é maior do que o arquivo."
+
+#: modules/file/microprof.c:125
+msgid "Imports MicroProf FRT profilometer data files."
+msgstr "Importa arquivos de dados de profilômetro MicroProf FRT."
+
+#: modules/file/microprof.c:138
+msgid "MicroProf FRT files (.frt)"
+msgstr "Arquivos MicroProf FRT (.frt)"
+
+#: modules/file/microprof.c:144
+msgid "MicroProf FRT text files (.txt)"
+msgstr "Arquivos de texto MicroProf FRT (.txt)"
+
+#: modules/file/microprof.c:519
+msgid "File contains fewer than XSize*YSize data points."
+msgstr "O arquivo contém menos que XSize*YSize pontos de dados."
+
+#: modules/file/miffile.c:200
+msgid "Imports DME MIF data files."
+msgstr "Importa arquivos de dados DME MIF."
+
+#: modules/file/miffile.c:213
+msgid "DME MIF files (.mif)"
+msgstr "Arquivos DME MIF (.mif)"
+
+#: modules/file/miffile.c:240
+msgid "Image header record is too short."
+msgstr "Gravação do cabeçalho da imagem é muito curto."
+
+#: modules/file/miffile.c:248
+msgid "Axis display info record is too short."
+msgstr "Gravação da informação de exibição do eixo é muito curta."
+
+#: modules/file/miffile.c:282
+#, c-format
+msgid "Loading of file version %u.%u is not implemented."
+msgstr "Carregamento de arquivo de versão %u. %u não está implementado."
+
+#: modules/file/miffile.c:300
+msgid "File information block is outside the file."
+msgstr "O bloco de informação do arquivo está fora do arquivo."
+
+#: modules/file/miffile.c:334
+msgid "File information block size is invalid."
+msgstr "O tamanho do bloco de informação do arquivo está é inválido."
+
+#: modules/file/miffile.c:398
+msgid "Unique id record is too short."
+msgstr "Gravação de id único é muito curta."
+
+#: modules/file/mifile.c:177
+msgid "Imports Molecular Imaging MI data files."
+msgstr "Importa arquivos de dados Molecular Imaging MI."
+
+#: modules/file/mifile.c:190
+msgid "PicoView Data Files (.mi)"
+msgstr "Arquivos de dados PicoView (.mi)"
+
+#: modules/file/mifile.c:366 modules/file/mifile.c:453
+msgid "Spectroscopy Graph"
+msgstr "Gráfico de espectroscopia"
+
+#: modules/file/mulfile.c:160
+msgid "Imports Aarhus MUL files."
+msgstr "Importa arquivos Aarhus MUL."
+
+#: modules/file/mulfile.c:173
+msgid "Aarhus MUL files (.mul)"
+msgstr "Arquivos Aarhus MUL (.mul)"
+
+#: modules/file/mulfile.c:295
+#, c-format
+msgid "Image number in the label %u does not match the number %u in the index."
+msgstr "Número da imagem no rótulo %u não corresponde ao número %u no índice."
+
+#: modules/file/mulfile.c:354 modules/file/mulfile.c:363
+#, c-format
+msgid "Label string length %u is larger than 20."
+msgstr "Comprimento %u da string do rótulo é maior que 20."
+
+#: modules/file/nanoeducator.c:290
+msgid "Imports Nanoeducator data files."
+msgstr "Importa arquivos de dados Nanoeducator."
+
+#: modules/file/nanoeducator.c:303
+msgid "Nanoeducator files (.mspm, .spm, .stm)"
+msgstr "Arquivos Nanoeducator (.mspm, .spm, .stm)"
+
+#: modules/file/nanoeducator.c:361 modules/file/unisoku.c:301
+msgid "format version"
+msgstr "versão do formato"
+
+#: modules/file/nanoeducator.c:389 modules/file/nanoeducator.c:432
+#: modules/file/nanoeducator.c:537
+msgid "Image data starts past the end of file."
+msgstr "Os dados de imagem começam após o final do arquivo."
+
+#: modules/file/nanoeducator.c:474
+msgid "Spectra data starts past the end of file."
+msgstr "Os dados de espectro começam após o final do arquivo."
+
+#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:287
+#: modules/file/renishaw.c:1334 modules/file/sensofar.c:256
+#: modules/file/witec-asc.c:161
+msgid "File header is truncated"
+msgstr "O cabeçalho do arquivo está truncado"
+
+#: modules/file/nanoeducator.c:707 modules/file/tescan.c:308
+#: modules/file/tescan.c:319
+msgid "Parameter header is truncated"
+msgstr "O cabeçalho dos parâmetros está truncado"
+
+#: modules/file/nanoeducator.c:932 modules/process/curvature.c:456
+#: modules/tools/profile.c:1090
+#, c-format
+msgid "Profile %d"
+msgstr "Perfil %d"
+
+#: modules/file/nanoeducator.c:1045
+msgid "F-D spectra"
+msgstr "Espectro F-D"
+
+#: modules/file/nanoeducator.c:1138
+msgid "I-V spectra"
+msgstr "Espectro I-V"
+
+#: modules/file/nanoeducator.c:1223
+msgid "I-Z spectra"
+msgstr "Espectro I-Z"
+
+#: modules/file/nanomagnetics.c:402
+msgid "Imports Nanomagnetics' NMI file format version 3 and 5"
+msgstr "Importa arquivos no formato Nanomagnetics' NMI versões 3 e 5"
+
+#: modules/file/nanomagnetics.c:415
+msgid "Nanomagnetics File (.nmi)"
+msgstr "Arquivo Nanomagnetics (.nmi)"
+
+#: modules/file/nanonics.c:104
+msgid "Imports Nanonics NAN data files."
+msgstr "Importa arquivos de dados Nanonics NAN."
+
+#: modules/file/nanonics.c:117
+msgid "Nanonics files (.nan)"
+msgstr "Arquivos Nanonics (.nan)"
+
+#: modules/file/nanonics.c:177 modules/file/nanonics.c:446
+#: modules/file/wsxmfile.c:226
+#, c-format
+msgid "Expected header end marker ‘%s’ was not found."
+msgstr "Marcador esperado ‘%s’ de fim de cabeçalho não foi encontrado."
+
+#: modules/file/nanonics.c:214
+#, c-format
+msgid "HeaderLength %u differs from actual header length %u"
+msgstr ""
+"Comprimento do cabeçalho (HeaderLength) %u difere do comprimento do "
+"cabeçalho verdadeiro %u"
+
+#: modules/file/nanonics.c:371 modules/file/witec-asc.c:167
+#, c-format
+msgid "Expected header start marker ‘%s’ but found ‘%s’."
+msgstr ""
+"Marcador esperado de início de cabeçalho é ‘%s’ mas foi encontrado ‘%s’."
+
+#: modules/file/nanonis.c:111
+msgid "Imports Nanonis SXM data files."
+msgstr "Importa arquivos de dados Nanonis SXM."
+
+#: modules/file/nanonis.c:131
+msgid "Nanonis SXM files (.sxm)"
+msgstr "Arquivos Nanonis SXM (.sxm)"
+
+#: modules/file/nanonis.c:230 modules/file/omicron.c:520
+#: modules/file/unisoku.c:278
+msgid "File header ended unexpectedly."
+msgstr "Cabeçalho do arquivo terminou inesperadamente."
+
+#: modules/file/nanonis.c:251
+msgid "Garbage was found in place of tag header line."
+msgstr "Foi encontrado lixo no lugar da tag da linha de cabeçalho."
+
+#: modules/file/nanonis.c:317
+#, c-format
+msgid "DATA_INFO does not contain the expected columns: %s."
+msgstr "A informação de dados (DATA_INFO) não contém as colunas esperadas: %s."
+
+#: modules/file/nanonis.c:339
+#, c-format
+msgid "DATA_INFO line contains fewer than %d fields."
+msgstr "A linha de informação de dados (DATA_INFO) contém menos que %d campos."
+
+#: modules/file/nanonis.c:524
+msgid "Missing data start marker \\x1a\\x04."
+msgstr "Está faltando o marcador de início de dados \\x1a\\x04."
+
+#: modules/file/nanoobserver.c:201
+#, fuzzy
+msgid "Reads Nano-Solution/NanoObserver .nao files."
+msgstr "Lê arquivos NanoObserver .nao."
+
+#: modules/file/nanoobserver.c:214
+#, fuzzy
+msgid "Nano-Solution/NanoObserver data (.nao)"
+msgstr "Dados NanoObserver (.nao)"
+
+#: modules/file/nanoobserver.c:410 modules/file/renishaw.c:1420
+msgid "Data block is truncated"
+msgstr "O bloco de dados está truncado"
+
+#: modules/file/nanoscan.c:191
+msgid "Imports NanoScan XML files."
+msgstr "Importa arquivos NanoScan XML."
+
+#: modules/file/nanoscan.c:204
+msgid "NanoScan XML files (.xml)"
+msgstr "Arquivos NanoScan XML (.xml)"
+
+#: modules/file/nanoscan.c:937
+msgid "Wrong size of Base64 encoded data."
+msgstr "Tamanho errado de dados Base64 codificados."
+
+#: modules/file/nanoscantech.c:129
+msgid "Imports NanoScanTech .nstdat files."
+msgstr "Importa arquivos NanoScanTech .nstdat."
+
+#: modules/file/nanoscantech.c:142
+msgid "NanoScanTech data (.nstdat)"
+msgstr "Dados NanoScanTech (.nstdat)"
+
+#: modules/file/nanoscope-ii.c:86
+msgid "Imports Digital Instruments Nanoscope II data files."
+msgstr "Importa arquivos de dados Digital Instruments Nanoscope II."
+
+#: modules/file/nanoscope-ii.c:99
+msgid "Nanoscope II files"
+msgstr "Arquivos Nanoscope II"
+
+#: modules/file/nanoscope.c:212
+msgid ""
+"Imports Veeco (Digital Instruments) Nanoscope data files, version 3 or newer."
+msgstr ""
+"Importa arquivos de dados Veeco (Digital Instruments) Nanoscope, versão 3 ou "
+"mais nova."
+
+#: modules/file/nanoscope.c:226
+msgid "Nanoscope III files"
+msgstr "Arquivos Nanoscope III"
+
+#: modules/file/nanoscope.c:295
+msgid "File is not a Nanoscope file, or it is a unknown subtype."
+msgstr ""
+"O arquivo não é um arquivo Nanoscope, ou ele é um subtipo desconhecido."
+
+#: modules/file/nanoscope.c:302
+msgid ""
+"File has been damaged by change of line endings, resulting in corruption of "
+"the binary part of the file.\n"
+"\n"
+"Typically, this occurs if the file is treated as text when sent by e-mail "
+"uncompressed, sent by FTP in ascii mode (use binary), compressed by ‘Send to "
+"compressed folder’ in some versions of MS Windows, or any other file "
+"transfer that attempts to store text platform-independently."
+msgstr ""
+"Arquivo foi danificado por mudança de fim de linha, resultando em "
+"corrupçãoda parte binária do arquivo.\n"
+"\n"
+"Tipicamente, isso ocorre se o arquivo é tratado como texto quando enviado "
+"descompactado por e-mail, enviado por FTP em modo ascii (uso binário), "
+"comprimido por 'Enviar para pasta compactada' em algumas versões do MS "
+"Windows, ou qualquer outra transferência de arquivos que tenta armazenar "
+"texto de modo independente da plataforma."
+
+#: modules/file/nanoscope.c:660 modules/file/nanoscope.c:676
+msgid "Cannot parse `Scan size' field."
+msgstr "Não foi possível analisar o campo 'escanear tamanho'."
+
+#: modules/file/nanoscope.c:1546 modules/file/nrrdfile.c:1086
+#, c-format
+msgid "Garbage after data sample #%u."
+msgstr "Lixo após amostra de dados #%u."
+
+#: modules/file/nanoscope.c:1602
+msgid "Truncated header line."
+msgstr "Linha de cabeçalho truncada."
+
+#: modules/file/nanotop.c:107
+msgid "Imports NANOTOP AFM files"
+msgstr "Importa arquivos NANOTOP AFM"
+
+#: modules/file/nanotop.c:120
+msgid "Nanotop files (.spm)"
+msgstr "Arquivos Nanotop (.spm)"
+
+#: modules/file/netcdf.c:189
+msgid "Imports network Common Data Form (netCDF) files created by GXSM."
+msgstr "Importa arquivos network Common Data Form (netCDF) criados por GXSM."
+
+#: modules/file/netcdf.c:202
+msgid "GSXM netCDF files (.nc)"
+msgstr "Arquivos GSXM netCDF (.nc)"
+
+#: modules/file/netcdf.c:248
+#, c-format
+msgid "Variable `%s' refers to invalid or nonexistent data."
+msgstr "A variável `%s' se refere a dados inválidos ou inexistentes."
+
+#: modules/file/netcdf.c:368
+msgid "NetCDF records are not supported."
+msgstr "Gravações NetCDF não são suportadas."
+
+#: modules/file/netcdf.c:419
+msgid "Value series values must be of type FLOAT."
+msgstr "Valores da série valor deve ser do tipo FLOAT."
+
+#: modules/file/netcdf.c:441
+msgid "Time values must be of type DOUBLE."
+msgstr "Valores de tempo devem ser do tipo DOUBLE."
+
+#: modules/file/netcdf.c:462
+msgid "Reading of fast scan files is not implemented - yet."
+msgstr ""
+"A leitura de arquivos de escaneamento rápido não está implementada - ainda."
+
+#: modules/file/netcdf.c:553
+msgid "Time series order is wrong."
+msgstr "Ordem das séries de tempo está errada."
+
+#: modules/file/netcdf.c:1249
+#, c-format
+msgid "File ended unexpectedly inside `%s'."
+msgstr "O arquivo terminou inesperadamente dentro de `%s'."
+
+#: modules/file/netcdf.c:1258
+#, c-format
+msgid "Expected `%s' array or `ABSENT'."
+msgstr "Esperado arranjo `%s' ou `ABSENT'."
+
+#: modules/file/netcdf.c:1266
+#, c-format
+msgid "Array `%s' has non-zero number of elements in spite of being absent."
+msgstr ""
+"O arranjo `%s'  tem um número de elementos diferente de zero ao invés de ser "
+"ausente."
+
+#: modules/file/netcdf.c:1325
+msgid "More than one record dimension found."
+msgstr "Mais de uma dimensão gravada foi encontrada."
+
+#: modules/file/nmmxyz.c:202
+msgid "Imports Nano Measuring Machine profile files."
+msgstr "Importa arquivos de perfil Nano Measuring Machine."
+
+#: modules/file/nmmxyz.c:215
+msgid "Nano Measuring Machine files (*.dsc)"
+msgstr "Arquivos Nano Measuring Machine (*.dsc)"
+
+#: modules/file/nmmxyz.c:259
+msgid "Nano Measuring Machine data import must be run as interactive."
+msgstr ""
+"A importação de dados Nano Measuring Machine deve ser executada como "
+"interativa."
+
+#: modules/file/nmmxyz.c:306 modules/process/lat_synth.c:1224
+#: modules/process/wave_synth.c:798
+msgid "Rendering surface..."
+msgstr "Renderizando superfície..."
+
+#: modules/file/nmmxyz.c:385
+msgid "Import NMM Profile Set"
+msgstr "Importar conjunto de perfis NMM"
+
+#: modules/file/nmmxyz.c:401 modules/file/rawfile.c:450
+msgid "Information"
+msgstr "Informação"
+
+#: modules/file/nmmxyz.c:407
+msgid "Number of data files:"
+msgstr "Número de arquivos de dados:"
+
+#: modules/file/nmmxyz.c:409
+msgid "Total number of points:"
+msgstr "Número total de pontos:"
+
+#: modules/file/nmmxyz.c:411
+msgid "Points per profile:"
+msgstr "Pontos por perfil:"
+
+#: modules/file/nmmxyz.c:416
+msgid "Imported Channels"
+msgstr "Canais importados"
+
+#: modules/file/nmmxyz.c:438
+msgid "Plot point density map"
+msgstr "Plotar mapa de densidade de pontos"
+
+#: modules/file/nmmxyz.c:534 modules/file/rawfile.c:626
+#: modules/process/dimensions.h:427 modules/xyz/xyz_drift.c:725
+#: modules/xyz/xyz_raster.c:376
+msgid "Resolution"
+msgstr "Resolução"
+
+#: modules/file/nmmxyz.c:538 modules/file/rawfile.c:631
+#: modules/process/dimensions.h:433 modules/xyz/xyz_drift.c:729
+#: modules/xyz/xyz_raster.c:382
+msgid "_Horizontal size:"
+msgstr "Tamanho _horizontal:"
+
+#: modules/file/nmmxyz.c:554 modules/file/rawfile.c:638
+#: modules/process/dimensions.h:436 modules/xyz/xyz_drift.c:744
+#: modules/xyz/xyz_raster.c:388
+msgid "_Vertical size:"
+msgstr "Tamanho _vertical:"
+
+#: modules/file/nmmxyz.c:795
+msgid "Point density map"
+msgstr "Mapa de densidade de pontos"
+
+#: modules/file/nmmxyz.c:871
+msgid "Something is changing the data files on disk."
+msgstr "Alguma coisa está carregando os arquivos de dados no disco."
+
+#: modules/file/nrrdfile.c:179
+msgid "Imports and exports nearly raw raster data (NRRD) files."
+msgstr "Importa e exporta arquivos nearly raw raster data (NRRD)."
+
+#: modules/file/nrrdfile.c:192
+msgid "Nearly raw raster data (NRRD) files (.nrrd)"
+msgstr "Arquivos Nearly raw raster data (NRRD) (.nrrd)"
+
+#: modules/file/nrrdfile.c:334
+msgid "Detached header does not refer to any data file."
+msgstr "O cabeçalho destacado não faz referência a nenhum arquivo de dados."
+
+#: modules/file/nrrdfile.c:362
+msgid "Only two- and three-dimensional data are supported."
+msgstr "Apenas dados bi- e tri-dimensionais são suportados."
+
+#: modules/file/nrrdfile.c:382
+msgid "Non-zero lineskip is supported only for uncompressed files."
+msgstr ""
+"O campo 'Desconsiderar linhas' diferente de zero é suportado apenas para "
+"dados não compactados."
+
+#: modules/file/nrrdfile.c:421
+msgid "Compression is supported only for detached files."
+msgstr "Compressão é suportada apenas para arquivos destacados."
+
+#: modules/file/nrrdfile.c:745
+msgid "Split detached data files are not supported."
+msgstr "Divisões de arquivos de dados destacados não são suportadas."
+
+#: modules/file/nrrdfile.c:791
+msgid "Cannot decompress gzip-encoded data.  Zlib support was not built in."
+msgstr ""
+"Não foi possível descompactar os dados codificados com gzip. O suporte à "
+"zlib não está embutido."
+
+#: modules/file/nrrdfile.c:836
+msgid "Cannot decompress bzip2-encoded data.  Bzip2 support was not built in."
+msgstr ""
+"Não foi possível descompactar os dados codificados com bzip2. O suporte a "
+"bzip2 não está embutido."
+
+#: modules/file/nrrdfile.c:968
+#, c-format
+msgid "Hex data contain fewer values (%u) than corresponds to the sizes (%u)."
+msgstr ""
+"Os dados hexadecimais contém poucos valores (%u) que correspondem aos "
+"tamanhos (%u)."
+
+#: modules/file/nrrdfile.c:1081
+#, c-format
+msgid "Text data contain fewer values (%u) than corresponds to the sizes (%u)."
+msgstr ""
+"Os dados de texto contém poucos valores (%u) que correspondem aos tamanhos "
+"(%u)."
+
+#: modules/file/nrrdfile.c:1135
+msgid "Field byteskip cannot be -1 for text encodings."
+msgstr ""
+"O campo 'desconsiderar byte' não pode ser -1 para codificações de texto."
+
+#: modules/file/nrrdfile.c:1146
+msgid "Field lineskip specifies more lines than there are in the file."
+msgstr ""
+"O campo 'desconsiderar linhas' especifica mais linhas do que existem no "
+"arquivo."
+
+#: modules/file/nrrdfile.c:1189
+msgid "Field byteskip specifies more bytes than there are in the file."
+msgstr ""
+"O campo 'desconsiderar linhas' especifica mais bytes do que existem no "
+"arquivo."
+
+#: modules/file/nrrdfile.c:1594
+#, c-format
+msgid "Items of per-axis header field %s are not quoted."
+msgstr "Itens do campo do cabeçalho por-eixo %s são quotados."
+
+#: modules/file/nrrdfile.c:1605
+#, c-format
+msgid "Per-axis header field %s contains too many items."
+msgstr "O campo %s do cabeçalho por-eixo contém itens demais."
+
+#: modules/file/nrrdfile.c:1614
+#, c-format
+msgid "Per-axis header field %s contains too few items."
+msgstr "O campo %s do cabeçalho por-eixo contém muito poucos itens."
+
+#: modules/file/nt-mdt.c:850
+msgid "Imports NT-MDT data files."
+msgstr "Importa arquivos de dados NT-MDT."
+
+#: modules/file/nt-mdt.c:863
+msgid "NT-MDT files (.mdt)"
+msgstr "Arquivos NT-MDT (.mdt)"
+
+#: modules/file/nt-mdt.c:1498 modules/file/nt-mdt.c:1606
+msgid "Frame is too short for Frame Mode."
+msgstr "O quadro é muito curto para o Modo Quadro."
+
+#: modules/file/nt-mdt.c:1513 modules/file/nt-mdt.c:1621
+msgid "Frame is too short for dots or data."
+msgstr "O quadro é muito curto para pontos ou dados."
+
+#: modules/file/nt-mdt.c:1879
+#, c-format
+msgid "End of file reached in frame header #%u."
+msgstr "Final do arquivo alcançado no cabeçalho do quadro #%u."
+
+#: modules/file/nt-mdt.c:1887
+#, c-format
+msgid "End of file reached in frame data #%u."
+msgstr "Final do arquivo alcançado nos dados do quadro #%u."
+
+#: modules/file/nt-mdt.c:1920
+#, c-format
+msgid "Frame #%u is too short for scanned data header."
+msgstr "O quadro #%u é muito curto para o cabeçalho de dados escaneado."
+
+#: modules/file/nt-mdt.c:1937
+#, c-format
+msgid "Frame #%u is too short for spectroscopy data header."
+msgstr ""
+"O quadro #%u é muito curto para o cabeçalho de dados de espectroscopia."
+
+#: modules/file/nxiifile.c:116
+msgid "Imports EM4SYS data files."
+msgstr "Importa arquivos de dados EM4SYS."
+
+#: modules/file/nxiifile.c:129
+msgid "EM4SYS NX II files (.bmp)"
+msgstr "Arquivos EM4SYS NX II (.bmp)"
+
+#: modules/file/oldmda.c:151
+msgid "Imports old NTMDT MDA Spectra files."
+msgstr "Importa arquivos antigos NTMDT MDA Spectra."
+
+#: modules/file/oldmda.c:164
+msgid "NTMDT old MDA Spectra data (.sxml .dat)"
+msgstr "Dados NTMDT, antigo MDA Spectra, (.sxml .dat)"
+
+#: modules/file/oldmda.c:237
+msgid "Incorrect number of axes in parameter file."
+msgstr "Número de eixos incorreto no arquivo de parâmetros."
+
+#: modules/file/oldmda.c:252
+#, c-format
+msgid "Cannot load data file: %s"
+msgstr "Não foi possível arquivo de dados: %s"
+
+#: modules/file/oldmda.c:260
+msgid "Data file is too short."
+msgstr "O arquivo de dados é muito curto."
+
+#: modules/file/ols.c:65
+msgid "Imports OLS data files."
+msgstr "Importa arquivos de dados OLS."
+
+#: modules/file/ols.c:78
+msgid "Olympus LEXT OLS3000 (.ols)"
+msgstr "Olympus LEXT OLS3000 (.ols)"
+
+#: modules/file/ometiff.c:154
+msgid "Imports OME-TIFF data files."
+msgstr "Importa arquivos de dados OME-TIFF."
+
+#: modules/file/ometiff.c:167
+msgid "Open Microscopy OME-TIFF (.ome.tiff)"
+msgstr "Open Microscopy OME-TIFF (.ome.tiff)"
+
+#: modules/file/ometiff.c:650
+#, c-format
+msgid "ZTC coordinates (%u,%u,%u) fall outside the given ranges."
+msgstr "Coordenadas ZTC (%u,%u,%u) caem fora dos intervalos especificados."
+
+#: modules/file/ometiff.c:658
+msgid ""
+"The OME TIFF header specifies more TIFF directories than there are in the "
+"file."
+msgstr ""
+"O cabeçalho OME TIFF especifica mais diretórios TIFF do que os que existem "
+"no arquivo."
+
+#: modules/file/ometiff.c:669
+#, c-format
+msgid "TIFF directory %u is assigned to multiple conflicting ZTC coordinates."
+msgstr "O diretório TIFF %u é atribuído a várias coordenadas ZTC conflitantes."
+
+#: modules/file/omicron.c:164
+msgid "Imports Omicron data files (two-part .par + .tf*, .tb*, .sf*, .sb*)."
+msgstr ""
+"Importa arquivos de dados Omicron (duas partes .par + .tf*, .tb*, .sf*, ."
+"sb*).."
+
+#: modules/file/omicron.c:177
+msgid "Omicron files (.par + data)"
+msgstr "Arquivos Omicron (.par + dados)"
+
+#: modules/file/omicron.c:422
+msgid "Header line starts with a colon."
+msgstr "Linha do cabeçalho começa com dois pontos (:)."
+
+#: modules/file/omicron.c:529
+msgid "Channel information ended unexpectedly."
+msgstr "A informação do canal terminou inesperadamente."
+
+#: modules/file/omicronflat.c:358
+msgid "Imports Omicron flat files."
+msgstr "Importa arquivos Omicron achatados."
+
+#: modules/file/omicronflat.c:371
+msgid "Omicron flat files (*.*_flat)"
+msgstr "Arquivos Omicron achatados (*.*_flat)"
+
+#: modules/file/omicronflat.c:1727
+msgid "File name does not have the expected form for Omicron Flat files."
+msgstr ""
+"O nome do arquivo não tem a forma esperada para um arquivo Omicron Flat."
+
+#: modules/file/omicronflat.c:2146
+msgid "Cannot understand the axis hierarchy."
+msgstr "Não foi possível entender a hierarquia dos eixos."
+
+#. TRANSLATORS: %s is replaced with an expression of the data shape.
+#: modules/file/omicronflat.c:2564
+#, c-format
+msgid "Cannot figure out how to load data in the following form: %s."
+msgstr ""
+"Não foi possível descobrir como carregar dados no seguinte formato: %s."
+
+#: modules/file/omicronmatrix.c:196
+msgid "Omicron MATRIX (param.mtrx & data.mtrx)"
+msgstr "Omicron MATRIX (param.mtrx & data.mtrx)"
+
+#: modules/file/omicronmatrix.c:212
+msgid "Omicron MATRIX (.mtrx & .mtrx)"
+msgstr "Omicron MATRIX (.mtrx & .mtrx)"
+
+#: modules/file/opdfile.c:199
+msgid "Imports Wyko OPD and ASC files."
+msgstr "Importa arquivos Wyko OPD e ASC."
+
+#: modules/file/opdfile.c:212
+msgid "Wyko OPD files (.opd)"
+msgstr "Arquivos Wyko OPD (.opd)"
+
+#: modules/file/opdfile.c:219
+msgid "Wyko ASCII export files (.asc)"
+msgstr "Arquivos de exportação Wyko ASCII (.asc)"
+
+#: modules/file/opdfile.c:310
+#, c-format
+msgid "Item `%s' is beyond the end of the file."
+msgstr "O item `%s' está além do final do arquivo."
+
+#: modules/file/opdfile.c:636
+msgid "Nested directories found"
+msgstr "Diretórios aninhados encontrados"
+
+#: modules/file/opdfile.c:842
+#, c-format
+msgid "Truncated data in block %s"
+msgstr "Dados truncados no bloco %s"
+
+#: modules/file/opengps.c:134
+msgid "Reads ISO 5436-2 OpenGPS .x3p files."
+msgstr "Lê arquivos ISO 5436-2 OpenGPS .x3p."
+
+#: modules/file/opengps.c:147
+msgid "ISO 5436-2 OpenGPS data (.x3p)"
+msgstr "Dados ISO 5436-2 OpenGPS (.x3p)"
+
+#: modules/file/opengps.c:421 modules/file/opengps.c:454
+msgid "Too many DataList items for given matrix dimensions."
+msgstr ""
+"Há muitos itens da lista de dados (DataList) para as dimensões da matriz "
+"fornecida."
+
+#: modules/file/opengps.c:542
+msgid "File main.xml contains multiple data elements."
+msgstr "O arquivo main.xml contém múltiplos elementos de dados."
+
+#. TRANSLATORS: type and axis are symbols such as I, CX, ...
+#: modules/file/opengps.c:575 modules/file/opengps.c:583
+#: modules/file/opengps.c:591
+#, c-format
+msgid "Only type %s is supported for axis %s."
+msgstr "Apenas o tipo %s é suportado para o eixo %s."
+
+#: modules/file/pixmap.c:161
+msgid "All channels"
+msgstr "Todos os canais"
+
+#: modules/file/pixmap.c:162
+msgid "Red"
+msgstr "Vermelho"
+
+#: modules/file/pixmap.c:163
+msgid "Green"
+msgstr "Verde"
+
+#: modules/file/pixmap.c:164
+msgid "Blue"
+msgstr "Azul"
+
+#: modules/file/pixmap.c:165
+msgid "Value (max)"
+msgstr "Valor (máx)"
+
+#: modules/file/pixmap.c:166
+msgid "RGB sum"
+msgstr "Soma RGB"
+
+#: modules/file/pixmap.c:167
+msgid "Luma"
+msgstr "Luma"
+
+#: modules/file/pixmap.c:168
+msgid "Alpha"
+msgstr "Alfa"
+
+#: modules/file/pixmap.c:202
+msgid "Graphics Interchange Format GIF (.gif)"
+msgstr "Graphics Interchange Format GIF (.gif)"
+
+#: modules/file/pixmap.c:206
+msgid "JPEG 2000 (.jpx)"
+msgstr "JPEG 2000 (.jpx)"
+
+#: modules/file/pixmap.c:210
+msgid "PCX (.pcx)"
+msgstr "PCX (.pcx)"
+
+#: modules/file/pixmap.c:214
+msgid "X Pixmap (.xpm)"
+msgstr "X Pixmap (.xpm)"
+
+#: modules/file/pixmap.c:218
+msgid "Sun raster image (.ras)"
+msgstr "Imagem Sun raster (.ras)"
+
+#: modules/file/pixmap.c:222
+msgid "Apple icon (.icns)"
+msgstr "Ícone Apple (.icns)"
+
+#: modules/file/pixmap.c:236
+msgid ""
+"Imports data from low-depth pixmap images (PNG, TIFF, JPEG, ...).  The set "
+"of available formats depends on available GDK pixbuf loaders."
+msgstr ""
+"Importa dados a partir de imagens pixmap de baixa profundidade (PNG, TIFF, "
+"JPEG, ...).  O conjunto de formatos disponíveis depende dos carregadores GDK "
+"pixbuf disponíveis."
+
+#: modules/file/pixmap.c:491
+#, c-format
+msgid "Pixmap has not registered file type `%s'."
+msgstr "O pixmap não tem o tipo de arquivo `%s' registrado."
+
+#: modules/file/pixmap.c:506
+#, c-format
+msgid "Cannot get pixbuf loader: %s."
+msgstr "Não foi possível obter o carregador de pixbuf: %s."
+
+#: modules/file/pixmap.c:519 modules/file/pixmap.c:532
+#: modules/file/renishaw.c:568 modules/file/renishaw.c:578
+#, c-format
+msgid "Pixbuf loader refused data: %s."
+msgstr "O carregador de pixbuf recusou os dados: %s."
+
+#: modules/file/pixmap.c:959
+msgid ""
+"Warning: Colorful images cannot be reliably mapped to meaningful values."
+msgstr ""
+"Alerta: Imagens coloridas não podem ser mapeadas com segurança para valores "
+"significativos."
+
+#: modules/file/pixmap.c:978
+msgid "verb|Use"
+msgstr "Usar"
+
+#: modules/file/pixmap.c:978
+msgid "as data"
+msgstr "como dados"
+
+#: modules/file/pltfile.c:79
+msgid "Imports Nanosurf PLT files."
+msgstr "Importa arquivos Nanosurf PLT."
+
+#: modules/file/pltfile.c:92
+msgid "Nanosurf PLT files (.plt)"
+msgstr "Arquivos Nanosurf PLT (.plt)"
+
+#: modules/file/pnifile.c:121
+msgid "Imports Pacific Nanotechnology PNI data files."
+msgstr "Importa arquivos de dados Pacific Nanotechnology PNI."
+
+#: modules/file/pnifile.c:134
+msgid "PNI files (.pni)"
+msgstr "Arquivos PNI (.pni)"
+
+#: modules/file/princetonspe.c:110
+msgid "Princeton Instruments camera SPE files."
+msgstr "Arquivos SPE de câmera Princeton Instruments."
+
+#: modules/file/princetonspe.c:123
+msgid "Princeton Instruments SPE files"
+msgstr "Arquivos SPE Princeton Instruments"
+
+#: modules/file/princetonspe.c:333
+msgid "XML footer overlaps with data."
+msgstr "O rodapé do XML está sobreposto com dados."
+
+#: modules/file/psia.c:241
+msgid "Imports Park Systems data files."
+msgstr "Importa arquivos de dados Park Systems."
+
+#: modules/file/psia.c:254
+msgid "Park Systems data files (.tiff, .tif)"
+msgstr "Arquivos de dados Park Systems (.tiff, .tif)"
+
+#: modules/file/psia.c:342
+msgid "Data tag is missing."
+msgstr "Está faltando tag dos dados."
+
+#: modules/file/psia.c:513
+#, c-format
+msgid "Header is too short (only %lu bytes)."
+msgstr "Cabeçalho é muito curto (somente %lu bytes)."
+
+#: modules/file/psia.c:630
+#, c-format
+msgid "Spectroscopy header is too short (only %lu bytes)."
+msgstr "Cabeçalho de espectroscopia é muito curto (somente %lu bytes)."
+
+#: modules/file/pt3file.c:296
+msgid "Imports SymPhoTime data files, version 2.0."
+msgstr "Importa arquivos de dados SymPhoTime, versão 2.0."
+
+#: modules/file/pt3file.c:309
+msgid "PicoHarp files (.pt3)"
+msgstr "Arquivos PicoHarp (.pt3)"
+
+#: modules/file/pt3file.c:395
+msgid "T2 measurement mode is not implemented."
+msgstr "O modo de medidas T2 não está implementado."
+
+#: modules/file/pt3file.c:401
+msgid "Only PI E710 and KDT180-100-Im imaging formats are implemented."
+msgstr ""
+"Apenas os formatos de imagem PI E710 e KDT180-100-Im estão implementados."
+
+#: modules/file/pt3file.c:541
+#, c-format
+msgid "Measurement mode must be 2 or 3; %u is invalid."
+msgstr "O modo de medida deve ser 2 ou 3; %u é inválido."
+
+#: modules/file/pt3file.c:547 modules/file/pt3file.c:559
+msgid "Only area imaging files are supported."
+msgstr "Apenas arquivos de obtenção de imagem de área são suportados."
+
+#: modules/file/pt3file.c:578
+#, c-format
+msgid "Unknown instrument number %u."
+msgstr "Instrumento número %u é desconhecido."
+
+#: modules/file/pt3file.c:585
+#, c-format
+msgid "Wrong imaging header size: %u instead of %u."
+msgstr "Tamanho errado do cabeçalho de obtenção de imagem: %u ao invés de %u."
+
+#: modules/file/pt3file.c:735
+#, c-format
+msgid "Number of line triggers %u is smaller than the number of scan lines %u."
+msgstr ""
+"O número de gatilhos de linhas %u é menor que o número de linhas escaneadas "
+"%u."
+
+#: modules/file/quesant.c:68
+msgid "Imports Quesant file format."
+msgstr "Importa arquivo no formato Quesant."
+
+#: modules/file/quesant.c:81
+msgid "Quesant files (.afm)"
+msgstr "Arquivos Quesant (.afm)"
+
+#: modules/file/rawfile.c:245
+msgid ""
+"Imports raw data files, both ASCII and binary, according to user-specified "
+"format."
+msgstr ""
+"Importa arquivos de dados raw, tanto ASCII quanto binário, de acordo com o "
+"formato especificado pelo usuário."
+
+#: modules/file/rawfile.c:266
+msgid "User-specified"
+msgstr "Especificado pelo usuário"
+
+#: modules/file/rawfile.c:267
+msgid "Signed byte"
+msgstr "Byte assinado"
+
+#: modules/file/rawfile.c:268
+msgid "Unsigned byte"
+msgstr "Byte não assinado"
+
+#: modules/file/rawfile.c:269
+msgid "Signed 16bit word"
+msgstr "Palavra assinada de 16bits"
+
+#: modules/file/rawfile.c:270
+msgid "Unsigned 16bit word"
+msgstr "Palavra não assinada de 16bits"
+
+#: modules/file/rawfile.c:271
+msgid "Signed 32bit word"
+msgstr "Palavra assinada de 32bits"
+
+#: modules/file/rawfile.c:272
+msgid "Unsigned 32bit word"
+msgstr "Palavra não assinada de 32bits"
+
+#: modules/file/rawfile.c:273
+msgid "Signed 64bit word"
+msgstr "Palavra assinada de 64bits"
+
+#: modules/file/rawfile.c:274
+msgid "Unsigned 64bit word"
+msgstr "Palavra não assinada de 64bits"
+
+#: modules/file/rawfile.c:275
+msgid "IEEE single"
+msgstr "IEEE simples"
+
+#: modules/file/rawfile.c:276
+msgid "IEEE double"
+msgstr "IEEE duplo (double)"
+
+#: modules/file/rawfile.c:277
+msgid "IEEE half"
+msgstr "Meio IEEE"
+
+#: modules/file/rawfile.c:278
+msgid "Pascal real"
+msgstr "Pascal real"
+
+#: modules/file/rawfile.c:333
+msgid "Raw data files"
+msgstr "Arquivos de dados raw"
+
+#: modules/file/rawfile.c:375
+msgid "Raw data import must be run as interactive."
+msgstr "A importação de dados raw deve ser executada como interativa."
+
+#: modules/file/rawfile.c:423
+msgid "Read Raw File"
+msgstr "Lê arquivo raw"
+
+#: modules/file/rawfile.c:455
+msgid "Data Format"
+msgstr "Formato dos dados"
+
+#: modules/file/rawfile.c:567 modules/process/arithmetic.c:234
+#: modules/process/calcoefs_view.c:320 modules/process/coerce.c:250
+#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:638
+#: modules/process/drift.c:242 modules/process/edge.c:635
+#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:184
+#: modules/process/fractal.c:225 modules/process/grain_edge.c:209
+#: modules/process/grain_filter.c:312 modules/process/grain_mark.c:243
+#: modules/process/grain_wshed.c:165 modules/process/mark_disconn.c:205
+#: modules/process/mark_with.c:196 modules/process/mfm_field.c:278
+#: modules/process/mfm_shift.c:167 modules/process/polydistort.c:205
+#: modules/process/scars.c:314 modules/process/slope_dist.c:272
+#: modules/process/stitch.c:272 modules/process/straighten_path.c:198
+#: modules/process/synth.h:538 modules/process/tip_model.c:164
+#: modules/process/wpour_mark.c:273 modules/tools/linestats.c:454
+#: modules/tools/sfunctions.c:531 modules/tools/stats.c:456
+#: modules/volume/volume_extract.c:321 modules/volume/volume_linestat.c:292
+#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:457
+msgid "_Update"
+msgstr "_Atualizar"
+
+#: modules/file/rawfile.c:602
+msgid "<b>File</b>"
+msgstr "<b>Arquivo</b>"
+
+#: modules/file/rawfile.c:643
+msgid "S_quare sample"
+msgstr "Amostra _quadrada"
+
+#: modules/file/rawfile.c:745
+msgid "Missin_g value substitute:"
+msgstr "Está faltando valor substituto:"
+
+#: modules/file/rawfile.c:761
+msgid "_Automatically offer raw data import of unknown files"
+msgstr ""
+"Oferecer _automaticamente importação de dados raw para arquivos desconhecidos"
+
+#: modules/file/rawfile.c:790
+msgid "_Text data"
+msgstr "Dados de _texto"
+
+#: modules/file/rawfile.c:791
+msgid "_Binary data"
+msgstr "Dados _binários"
+
+#: modules/file/rawfile.c:800
+msgid "Start from _line:"
+msgstr "Começar da _linha:"
+
+#: modules/file/rawfile.c:807
+msgid "E_ach row skip:"
+msgstr "_A cada linha pular:"
+
+#: modules/file/rawfile.c:808
+msgid "fields"
+msgstr "campos"
+
+#: modules/file/rawfile.c:812
+msgid "_Field delimiter:"
+msgstr "Delimitador de campos:"
+
+#: modules/file/rawfile.c:820
+msgid "Any whitespace"
+msgstr "Nenhum espaço em branco"
+
+#: modules/file/rawfile.c:821
+msgid "TAB character"
+msgstr "Caractere TAB"
+
+#: modules/file/rawfile.c:822
+msgid "Other character"
+msgstr "Outro caractere"
+
+#: modules/file/rawfile.c:830
+msgid "_Other delimiter:"
+msgstr "_Outro delimitador:"
+
+#: modules/file/rawfile.c:861
+msgid "Byte s_wap pattern:"
+msgstr "Padrão de troca de byte:"
+
+#: modules/file/rawfile.c:876
+msgid "Start at _offset:"
+msgstr "Iniciar no afastamento:"
+
+#: modules/file/rawfile.c:877
+msgid "bytes"
+msgstr "bytes"
+
+#: modules/file/rawfile.c:883
+msgid "_Sample size:"
+msgstr "Tamanho da amo_stra:"
+
+#: modules/file/rawfile.c:884 modules/file/rawfile.c:892
+#: modules/file/rawfile.c:900
+msgid "bits"
+msgstr "bits"
+
+#: modules/file/rawfile.c:891
+msgid "After each sample s_kip:"
+msgstr "Após cada amostra pular:"
+
+#: modules/file/rawfile.c:899
+msgid "After each _row skip:"
+msgstr "Após cada linha pular:"
+
+#: modules/file/rawfile.c:905
+msgid "_Reverse bits in bytes"
+msgstr "_Reverter bits em bytes"
+
+#: modules/file/rawfile.c:910
+msgid "Reverse bi_ts in samples"
+msgstr "Reverter bits em amostras"
+
+#: modules/file/rawfile.c:915
+msgid "Samples are si_gned"
+msgstr "Amostras estão assinadas"
+
+#: modules/file/rawfile.c:945
+msgid "Binary"
+msgstr "Binário"
+
+#: modules/file/rawfile.c:945
+msgid "Text"
+msgstr "Text"
+
+#: modules/file/rawfile.c:967
+msgid "Delimiter: whitespace"
+msgstr "Delimitador: espaço em branco"
+
+#: modules/file/rawfile.c:970
+#, c-format
+msgid "Delimiter: 0x%02x"
+msgstr "Delimitador: 0x%02x"
+
+#: modules/file/rawfile.c:972
+#, c-format
+msgid "Delimiter: %s"
+msgstr "Delimitador: %s"
+
+#: modules/file/rawfile.c:998
+msgid "Info"
+msgstr "Info"
+
+#: modules/file/rawfile.c:1182
+#, c-format
+msgid ""
+"<b>Too short file</b>\n"
+"The format would require %u bytes long file (at least), but the length of `"
+"%s' is only %u bytes."
+msgstr ""
+"<b>Arquivo muito curto</b>\n"
+"O formato exigiria arquivo com (pelo menos) %u bytes de tamanho, mas o "
+"tamanho de `%s' é de apenas %u bytes."
+
+#: modules/file/rawfile.c:1198
+#, c-format
+msgid ""
+"<b>Parsing failed</b>\n"
+"The contents of `%s' does not match format: %s."
+msgstr ""
+"<b>Análise falhou</b>\n"
+"O conteúdo de `%s' não confere com o formato: %s."
+
+#: modules/file/rawfile.c:1690 modules/process/neural.c:1587
+#, c-format
+msgid "The name `%s' is invalid."
+msgstr "O nome `%s' é inválido."
+
+#: modules/file/rawfile.c:2302
+#, c-format
+msgid "Not enough lines (%d) for offset (%d)"
+msgstr "Não há linhas suficientes (%d) para o afastamento (%d)"
+
+#: modules/file/rawfile.c:2327
+#, c-format
+msgid "Expected whitespace to skip more fields in row %u, got `%.16s'"
+msgstr ""
+"Espaço em branco esperado para pular mais campos na linha %u, `%.16s' foi "
+"obtido"
+
+#: modules/file/rawfile.c:2341
+#, c-format
+msgid "Expected `%c' to skip more fields in row %u, got `%.16s'"
+msgstr ""
+"`%c' era esperado para pular mais campos na linha %u, `%.16s' foi obtido"
+
+#: modules/file/rawfile.c:2355
+#, c-format
+msgid "Expected `%s' to skip more fields in row %u, got `%.16s'"
+msgstr ""
+"`%s' era esperado para pular mais campos na linha %u, `%.16s' foi obtido"
+
+#: modules/file/rawfile.c:2372 modules/file/rawfile.c:2386
+#: modules/file/rawfile.c:2412
+#, c-format
+msgid "Garbage `%.16s' in row %u, column %u"
+msgstr "Lixo `%.16s' na linha %u, coluna %u"
+
+#: modules/file/rawfile.c:2398
+#, c-format
+msgid "Expected delimiter `%c' after data in row %u, column %u, got `%c'"
+msgstr ""
+"Delimitador `%c' era esperado após os dados na linha %u, coluna %u, `%c' foi "
+"obtido"
+
+#: modules/file/rawfile.c:2424
+#, c-format
+msgid "Expected delimiter `%s' after data in row %u, column %u, got `%.16s'"
+msgstr ""
+"Delimitador `%s' era esperado após os dados na linha %u, coluna %u, `%.16s' "
+"foi obtido"
+
+#: modules/file/rawgraph.c:107
+msgid "Imports simple text files as graph curves."
+msgstr "Importa arquivos de texto simples como curvas de gráficos."
+
+#: modules/file/rawgraph.c:120
+msgid "ASCII graph curve files"
+msgstr "Arquivos ASCII de curvas de gráficos"
+
+#: modules/file/rawgraph.c:188
+msgid "ASCII graph import must be run as interactive."
+msgstr "A importação de gráficos ASCII deve ser executada como interativa."
+
+#: modules/file/rawgraph.c:242
+msgid "Import Graph Data"
+msgstr "Importa dados gráficos"
+
+#: modules/file/rawgraph.c:274
+msgid "_X label:"
+msgstr "Rótulo _X:"
+
+#: modules/file/rawgraph.c:279
+msgid "_Y label:"
+msgstr "Rótulo _Y:"
+
+#: modules/file/rawgraph.c:284
+msgid "X _units:"
+msgstr "_Unidades X:"
+
+#: modules/file/rawgraph.c:290
+msgid "Y un_its:"
+msgstr "Un_idades Y:"
+
+#: modules/file/rawgraph.c:460
+msgid "Only files with two columns can be imported."
+msgstr "Apenas arquivos com duas colunas podem ser importados."
+
+#: modules/file/rawgraph.c:579
+msgid "Curve"
+msgstr "Curva"
+
+#: modules/file/rawxyz.c:100
+msgid "Imports raw XYZ data files."
+msgstr "Importa arquivos de dados raw XYZ."
+
+#: modules/file/rawxyz.c:113
+msgid "XYZ data files"
+msgstr "Arquivos de dados XYZ"
+
+#: modules/file/rawxyz.c:263
+msgid "Import XYZ Data"
+msgstr "Importa dados XYZ"
+
+#: modules/file/rawxyz.c:279 modules/graph/graph_stats.c:305
+#: modules/graph/graph_stats.c:756 modules/graph/graph_stats.c:800
+msgid "Number of points:"
+msgstr "Número de pontos:"
+
+#: modules/file/rawxyz.c:290
+msgid "X-range:"
+msgstr "Intervalo X:"
+
+#: modules/file/rawxyz.c:292
+msgid "Y-range:"
+msgstr "Intervalo Y:"
+
+#: modules/file/rawxyz.c:294
+msgid "Z-range:"
+msgstr "Intervalo Z:"
+
+#: modules/file/rawxyz.c:374
+msgid "_Lateral units:"
+msgstr "Unidades _laterais:"
+
+#: modules/file/rawxyz.c:386 modules/process/dimensions.h:479
+msgid "_Value units:"
+msgstr "Unidades de _valor:"
+
+#: modules/file/renishaw.c:368
+msgid "Imports Renishaw WiRE data files (WDF)."
+msgstr "Importa arquivos de dados Renishaw WiRE (WDF)."
+
+#: modules/file/renishaw.c:381
+msgid "Renishaw WiRE data files (.wdf)"
+msgstr "Arquivos de dados Renishaw WiRE (.wdf)"
+
+#: modules/file/renishaw.c:556
+msgid "MapArea block is truncated"
+msgstr "Bloco 'MapArea' está truncado"
+
+#: modules/file/renishaw.c:793
+msgid "Random points order unsupported"
+msgstr "Ordem de pontos aleatória não é suportada"
+
+#: modules/file/renishaw.c:1405
+msgid "Block header is truncated"
+msgstr "O cabeçalho do bloco está truncado"
+
+#: modules/file/rhk-sm3.c:236
+msgid "Imports RHK Technology SM3 data files."
+msgstr "Importa arquivos de dados RHK Technology SM3."
+
+#: modules/file/rhk-sm3.c:256
+msgid "RHK SM3 files (.sm3)"
+msgstr "Arquivos RHK SM3 (.sm3)"
+
+#: modules/file/rhk-sm3.c:336 modules/file/rhk-sm3.c:349
+msgid "End of file reached in page header."
+msgstr "Final do arquivo alcançado no cabeçalho da página."
+
+#: modules/file/rhk-sm3.c:340
+msgid "magic page header"
+msgstr "cabeçalho mágico da página"
+
+#: modules/file/rhk-sm3.c:421
+#, c-format
+msgid "End of file reached in string #%u."
+msgstr "Final do arquivo alcançado na string #%u."
+
+#: modules/file/rhk-sm3.c:442
+msgid "End of file reached in color data header."
+msgstr "Final do arquivo alcançado no cabeçalho dos dados de cores."
+
+#: modules/file/rhk-sm3.c:451
+msgid "End of file reached in color data."
+msgstr "Final do arquivo alcançado nos dados de cores."
+
+#: modules/file/rhk-sm3.c:720
+#, c-format
+msgid "Unknown line %d"
+msgstr "Linha %d desconhecida"
+
+#: modules/file/rhk-sm4.c:397
+msgid "Imports RHK Technology SM4 data files."
+msgstr "Importa arquivos de dados RHK Technology SM4."
+
+#: modules/file/rhk-sm4.c:417
+msgid "RHK SM4 files (.sm4)"
+msgstr "Arquivos RHK SM4 (.sm4)"
+
+#: modules/file/rhk-sm4.c:653
+#, c-format
+msgid "Object %s is truncated."
+msgstr "O objeto %s está truncado."
+
+#: modules/file/rhk-sm4.c:946
+#, c-format
+msgid "Object list in %s is truncated."
+msgstr "A lista de objetos %s está truncada."
+
+#: modules/file/rhk-sm4.c:963
+#, c-format
+msgid "Object of type %s is truncated."
+msgstr "O objeto do tipo %s está truncado."
+
+#: modules/file/rhk-sm4.c:988
+#, c-format
+msgid "Cannot find object %s in %s."
+msgstr "Não foi possível encontrar o objeto %s em %s."
+
+#: modules/file/rhk-spm32.c:176
+msgid "Imports RHK Technology SPM32 data files."
+msgstr "Importa arquivos de dados RHK Technology SPM32."
+
+#: modules/file/rhk-spm32.c:196
+msgid "RHK SPM32 files (.sm2)"
+msgstr "Arquivos RHK SPM32 (.sm2)"
+
+#: modules/file/rhk-spm32.c:379
+msgid "Invalid file header."
+msgstr "Cabeçalho de arquivo inválido."
+
+#: modules/file/rhk-spm32.c:392
+msgid "Only image and line files are supported."
+msgstr "Apenas arquivos de linha e imagem são suportados."
+
+#: modules/file/rhk-spm32.c:398
+#, c-format
+msgid "Invalid data type %d for image data."
+msgstr "Tipo de dados %d inválidos para dados de imagem."
+
+#: modules/file/rhk-spm32.c:406
+#, c-format
+msgid "Invalid data type %d for line data."
+msgstr "Tipo de dados %d inválidos para dados de linha."
+
+#: modules/file/rhk-spm32.c:425
+msgid "data ranges"
+msgstr "Intervalos de dados"
+
+#: modules/file/rhk-spm32.c:490
+msgid "data offset"
+msgstr "afastamento de dados"
+
+#: modules/file/robotics.c:81
+msgid "Imports Automation & Robotics Dual Lensmapper data files"
+msgstr "Importa arquivos de dados Automation & Robotics Dual Lensmapper"
+
+#: modules/file/robotics.c:94
+msgid "Dual Lensmapper files"
+msgstr "Arquivos Dual Lensmapper"
+
+#: modules/file/s94file.c:96
+msgid "Imports S94 STM data files."
+msgstr "Importa arquivos de dados S94 STM."
+
+#: modules/file/s94file.c:109
+msgid "S94 STM files (.s94)"
+msgstr "Arquivos S94 STM (.s94)"
+
+#: modules/file/sdfile.c:155
+msgid "Imports Surfstand group SDF (Surface Data File) files."
+msgstr "Importa arquivos SDF (Surface Data File) do grupo Surfstand."
+
+#: modules/file/sdfile.c:170
+msgid "Surfstand SDF files, binary (.sdf)"
+msgstr "Arquivos Surfstand SDF, binário (.sdf)"
+
+#: modules/file/sdfile.c:176
+msgid "Surfstand SDF files, text (.sdf)"
+msgstr "Arquivos Surfstand SDF, texto (.sdf)"
+
+#: modules/file/sdfile.c:182
+msgid "Micromap SDF files (.sdfa)"
+msgstr "Arquivos Micromap SDF (.sdfa)"
+
+#: modules/file/sdfile.c:620
+#, c-format
+msgid "Invalid `%s' value: %d."
+msgstr "O valor `%s' é inválido: %d."
+
+#: modules/file/sdfile.c:629
+#, c-format
+msgid "Invalid `%s' value: %g."
+msgstr "O valor `%s' é inválido: %g."
+
+#: modules/file/sdfile.c:687
+msgid "Missing data start marker (*)."
+msgstr "Está faltando o marcador de início de dados (*)."
+
+#: modules/file/sdfile.c:711
+#, c-format
+msgid "End of file reached when looking for `%s' field."
+msgstr "Final do arquivo alcançado ao olhar para o campo `%s'."
+
+#: modules/file/sdfile.c:719
+#, c-format
+msgid "Invalid line found when looking for `%s' field."
+msgstr "Encontrada uma linha inválida ao olhar para o campo `%s'."
+
+#: modules/file/seiko.c:118
+msgid "Imports Seiko XQB, XQD, XQT and XQP files."
+msgstr "Importa arquivos Seiko XQB, XQD, XQT e XQP."
+
+#: modules/file/seiko.c:131
+msgid "Seiko files (.xqb, .xqd, .xqt, .xqp)"
+msgstr "Arquivos Seiko (.xqb, .xqd, .xqt, .xqp)"
+
+#: modules/file/sensofar.c:200
+msgid "Imports Sensofar PLu file format, version 2000 or newer."
+msgstr "Importa arquivo no formato Sensofar PLu, versão 2000 ou mais nova."
+
+#: modules/file/sensofar.c:214
+msgid "Sensofar PLu files (.plu)"
+msgstr "Arquivos Sensofar PLu (.plu)"
+
+#: modules/file/sensofar.c:489 modules/file/sensofar.c:503
+msgid "Profile"
+msgstr "Perfil"
+
+#: modules/file/sensofarx.c:90
+msgid "Reads Sensofar PLUx files."
+msgstr "Lê arquivos Sensofar PLUx."
+
+#: modules/file/sensofarx.c:103
+msgid "Sensofar PLUx files (.plux)"
+msgstr "Arquivos Sensofar PLUx (.plux)"
+
+#: modules/file/sensolytics.c:111
+msgid "Imports Sensolytics text files."
+msgstr "Importar arquivos de texto Sensolytics."
+
+#: modules/file/sensolytics.c:124
+msgid "Sensolytics text files (.dat)"
+msgstr "Arquivos de texto Sensolytics (.dat)"
+
+#: modules/file/shimadzu.c:133
+msgid "Imports Shimadzu SPM data files."
+msgstr "Importa arquivos de dados Shimadzu SPM."
+
+#: modules/file/shimadzu.c:146
+msgid "Shimadzu files"
+msgstr "Arquivos Shimadzu"
+
+#: modules/file/shimadzu.c:372
+#, c-format
+msgid "Cannot parse data values after %d of %d."
+msgstr "Não foi possível analisar os valores de dados após %d de %d."
+
+#: modules/file/sicmfile.c:195
+msgid "Imports IonScope SICM data files."
+msgstr "Importa arquivos de dados IonScope SICM."
+
+#: modules/file/sicmfile.c:209
+msgid "IonScope SICM files (.img)"
+msgstr "Arquivos IonScope SICM (.img)"
+
+#: modules/file/sis.c:464
+msgid "Imports SIS (Surface Imaging Systems) data files."
+msgstr "Importa arquivos de dados SIS (Surface Imaging Systems)."
+
+#: modules/file/sis.c:477
+msgid "SIS files (.sis)"
+msgstr "Arquivos SIS (.sis)"
+
+#: modules/file/sis.c:814
+msgid "Block not a document block."
+msgstr "O bloco não é um bloco de documento."
+
+#: modules/file/sis.c:823
+msgid "Too short document info."
+msgstr "Informação do documento é muito curta."
+
+#: modules/file/sis.c:844
+msgid "Too short parameter info."
+msgstr "Informação do parâmetro é muito curta."
+
+#: modules/file/sis.c:946
+msgid "Unexpected image block."
+msgstr "Bloco de imagem inesperado."
+
+#: modules/file/sis.c:984 modules/file/sis.c:1015
+msgid "End of file reached in image block."
+msgstr "Final do arquivo alcançado no bloco de imagem."
+
+#: modules/file/sis.c:1029
+msgid "End of file reached in channel block."
+msgstr "Final do arquivo alcançado no bloco do canal."
+
+#: modules/file/sis.c:1053
+msgid "End of file reached when another channel was expected."
+msgstr "Fim de arquivo alcançado quando um outro canal era esperado."
+
+#: modules/file/spip-asc.c:91
+msgid "Imports SPIP ASC files."
+msgstr "Importa arquivos SPIP ASC."
+
+#: modules/file/spip-asc.c:104
+msgid "SPIP ASCII files (.asc)"
+msgstr "Arquivos SPIP ASCII (.asc)"
+
+#: modules/file/spml.c:108
+msgid "Loads SPML (Scanning Probe Microscopy Markup Language) data files."
+msgstr ""
+"Carrega arquivos de dados SPML (Scanning Probe Microscopy Markup Language)."
+
+#: modules/file/spml.c:122
+msgid "SPML files (.xml)"
+msgstr "Arquivos SPML (.xml)"
+
+#: modules/file/spmlab.c:175
+msgid "Imports Thermicroscopes SpmLab R3 to R7 data files."
+msgstr "Importa arquivos de dados Thermicroscopes SpmLab R3 a R7."
+
+#: modules/file/spmlab.c:188
+msgid "Thermicroscopes SpmLab files"
+msgstr "Arquivos Thermicroscopes SpmLab"
+
+#: modules/file/spmlab.c:259
+#, c-format
+msgid "Unknown format version %c."
+msgstr "Versão %c do formato desconhecida."
+
+#: modules/file/spmlab.c:283
+#, fuzzy
+msgid "Data block is truncated."
+msgstr "O bloco de dados está truncado"
+
+#: modules/file/spmlabf.c:79
+msgid "Imports SPMLab floating-point files."
+msgstr "Importa arquivos SPMLab de ponto flutuante."
+
+#: modules/file/spmlabf.c:92
+msgid "SPMLab floating-point files (.flt)"
+msgstr "Arquivos SPMLab de ponto flutuante (.flt)"
+
+#: modules/file/spmlabf.c:153
+msgid "Missing data start marker [Data]."
+msgstr "Está faltando o marcador de início de dados [Data]."
+
+#: modules/file/spmxfile.c:91
+msgid "Reads ATC SPMxFormat files."
+msgstr "Lê arquivos ATC SPMxFormat."
+
+#: modules/file/spmxfile.c:104
+msgid "ATC SPMxFormat data (.spm)"
+msgstr "Dados ATC SPMxFormat (.spm)"
+
+#: modules/file/stmprg.c:232
+msgid "Imports Omicron STMPRG data files (tp ta)."
+msgstr "Importa arquivos de dados Omicron STMPRG (tp ta)."
+
+#: modules/file/stmprg.c:245
+msgid "Omicron STMPRG files (tp ta)"
+msgstr "Arquivos Omicron STMPRG (tp ta)"
+
+#: modules/file/stmprg.c:284
+msgid "Parameter file is too short."
+msgstr "O arquivo de parâmetros é muito curto."
+
+#: modules/file/stmprg.c:539
+msgid "First channel is switched off."
+msgstr "O primeiro canal está desligado."
+
+#: modules/file/stpfile.c:117
+msgid "Topography"
+msgstr "Topografia"
+
+#: modules/file/stpfile.c:118
+msgid "Current or Deflection or Amplitude"
+msgstr "Corrente ou deflexão ou amplitude"
+
+#: modules/file/stpfile.c:119
+msgid "Electrochemical Voltage (Vec)"
+msgstr "Voltagem eletroquímica (Vec)"
+
+#: modules/file/stpfile.c:120
+msgid "Topography and SPS"
+msgstr "Topografia e SPS"
+
+#: modules/file/stpfile.c:121
+msgid "Topography and SPS (scripted)"
+msgstr "Topografia e SPS (programada)"
+
+#: modules/file/stpfile.c:122
+msgid "Electrochemical Current (Iec)"
+msgstr "Corrente eletroquímica (Iec)"
+
+#: modules/file/stpfile.c:123
+msgid "Friction or Phase"
+msgstr "Fricção ou fase"
+
+#: modules/file/stpfile.c:124
+msgid "AUX in BNC"
+msgstr "AUX em BNC"
+
+#: modules/file/stpfile.c:125
+msgid "AUX in 3 (Sum)"
+msgstr "AUX em 3 (Soma)"
+
+#: modules/file/stpfile.c:126
+msgid "AUX in 4 (Raw Deflection)"
+msgstr "AUX em 4 (Deflexão Raw)"
+
+#: modules/file/stpfile.c:127
+msgid "AUX in 5 (PicoPlus Aux BNC)"
+msgstr "AUX em 5 (PicoPlus Aux BNC)"
+
+#: modules/file/stpfile.c:128
+msgid "AUX in 6 (Surface Potential)"
+msgstr "AUX em 6 (Potencial de Superfície)"
+
+#: modules/file/stpfile.c:129
+msgid "AUX in 7"
+msgstr "AUX em 7"
+
+#: modules/file/stpfile.c:130
+msgid "AUX in 8"
+msgstr "AUX em 8"
+
+#: modules/file/stpfile.c:131
+msgid "AUX in 9"
+msgstr "AUX em 9"
+
+#: modules/file/stpfile.c:132
+msgid "AUX in 10"
+msgstr "AUX em 10"
+
+#: modules/file/stpfile.c:133
+msgid "Topography and Flexgrid"
+msgstr "Topografia e Flexgrid"
+
+#: modules/file/stpfile.c:134
+msgid "External"
+msgstr "Externo"
+
+#: modules/file/stpfile.c:140
+msgid "Imports Molecular Imaging STP data files."
+msgstr "Importa arquivos de dados Molecular Imaging STP."
+
+#: modules/file/stpfile.c:153
+msgid "STP files (.stp)"
+msgstr "Arquivos STP (.stp)"
+
+#: modules/file/surffile.c:292
+msgid "Imports Surf data files."
+msgstr "Importa arquivos de dados Surf."
+
+#: modules/file/surffile.c:305
+msgid "Surf files (.sur)"
+msgstr "Arquivos Surf (.sur)"
+
+#: modules/file/tescan.c:94
+msgid "Imports Tescan SEM images."
+msgstr "Importa imagens SEM Tescan."
+
+#: modules/file/tescan.c:107
+msgid "Tescan MIRA SEM image (.tif)"
+msgstr "Imagem SEM Tescan MIRA (.tif)"
+
+#: modules/file/tiaser.c:179
+msgid "Imports FEI Tecnai imaging and analysis (former Emispec) files."
+msgstr "Importa arquivos FEI Tecnai imaging and analysis (antigo Emispec)"
+
+#: modules/file/tiaser.c:192
+msgid "FEI TIA (Emispec) data"
+msgstr "Dados FEI TIA (Emispec)"
+
+#: modules/file/unisoku.c:145
+msgid "Imports Unisoku data files (two-part .hdr + .dat)."
+msgstr "Importa arquivos Unisoku (duas partes .hdr + .dat)."
+
+#: modules/file/unisoku.c:160
+msgid "Unisoku files (.hdr + .dat)"
+msgstr "Arquivos Unisoku (.hdr + .dat)"
+
+#: modules/file/unisoku.c:316
+msgid "format flags"
+msgstr "Marcas de formato"
+
+#: modules/file/unisoku.c:323
+msgid "resolution"
+msgstr "resolução"
+
+# Is this sentence correct?
+# Esta sentença está correta?
+#: modules/file/unisoku.c:334
+msgid ""
+"Missing or invalid some integers heaven knows what they mean but that should "
+"be here."
+msgstr ""
+"Ausentes ou inválidos, alguns paraísos inteiros sabem o que eles significam, "
+"mas que deveriam estar aqui."
+
+#: modules/file/unisoku.c:348
+msgid "x scale parameters"
+msgstr "parâmetros da escala x"
+
+#: modules/file/unisoku.c:359
+msgid "y scale parameters"
+msgstr "parâmetros da escala y"
+
+#: modules/file/unisoku.c:383
+msgid "z scale parameters"
+msgstr "parâmetros da escala z"
+
+#: modules/file/unisoku.c:391
+msgid "data type parameters"
+msgstr "parâmetros de tipo de dados"
+
+#: modules/file/vtkfile.c:54
+msgid "Exports data as VTK structured grids."
+msgstr "Exporta dados como grades estruturadas VTK."
+
+#: modules/file/vtkfile.c:67
+msgid "VTK structured grid (.vtk)"
+msgstr "Grades estruturadas VTK (.vtk)"
+
+#: modules/file/win_stm.c:81
+msgid "Imports WinSTM (.stm) files."
+msgstr "Importa arquivos WinSTM (.stm)."
+
+#: modules/file/win_stm.c:94
+msgid "WinSTM files (.stm)"
+msgstr "Arquivos WinSTM (.stm)"
+
+#: modules/file/wipfile.c:281
+msgid "Imports WItec Project data files."
+msgstr "Importa arquivos de dados WItec Project."
+
+#: modules/file/wipfile.c:294
+msgid "WItec Project files (.wip)"
+msgstr "Arquivos WItec Project (.wip)"
+
+#: modules/file/witec-asc.c:74
+msgid "Imports WITec ASCII export files."
+msgstr "Arquivos de exportação WITec ASCII."
+
+#: modules/file/witec-asc.c:87
+msgid "WITec ASCII files (.dat)"
+msgstr "Arquivos WITec ASCII (.dat)"
+
+#: modules/file/witfile.c:211
+msgid "Imports WITec WIT data files."
+msgstr "Importa arquivos de dados WITec WIT."
+
+#: modules/file/witfile.c:224
+msgid "WITec files (.wit)"
+msgstr "Arquivos WITec (.wit)"
+
+#: modules/file/wsffile.c:84
+msgid "Imports WSF ASCII files."
+msgstr "Importa arquivos WSF ASCII."
+
+#: modules/file/wsffile.c:97
+msgid "WSF ASCII files (.wsf)"
+msgstr "Arquivos WSF ASCII (.wsf)"
+
+#: modules/file/wsffile.c:154
+msgid "File header does not end with an empty line."
+msgstr "O cabeçalho do arquivo não termina com uma linha vazia."
+
+#: modules/file/wsxmfile.c:98
+msgid "Imports Nanotec WSxM data files."
+msgstr "Importa arquivos de dados Nanotec WSxM."
+
+#: modules/file/wsxmfile.c:111
+msgid "WSxM files (.tom, .stp)"
+msgstr "Arquivos WSxM (.tom, .stp)"
+
+#: modules/file/wsxmfile.c:252
+msgid "number of columns"
+msgstr "número de colunas"
+
+#: modules/file/wsxmfile.c:259
+msgid "number of rows"
+msgstr "número de linhas"
+
+#: modules/file/wsxmfile.c:272
+#, c-format
+msgid "Unknown data type `%s'."
+msgstr "Tipo de dados desconhecido `%s'."
+
+#: modules/file/xyzexport.c:89
+msgid "Exports data as simple XYZ text file."
+msgstr "Exporta dados como arquivo de texto XYZ simples."
+
+#: modules/file/xyzexport.c:102
+msgid "XYZ text data (.xyz)"
+msgstr "Dados de texto XYZ (.xyz)"
+
+#: modules/file/xyzexport.c:247
+msgid "Lateral units:"
+msgstr "Unidades de laterais:"
+
+#: modules/file/xyzexport.c:293
+msgid "Export XYZ"
+msgstr "Exporta XYZ"
+
+#: modules/file/xyzexport.c:343 modules/process/curvature.c:700
+#: modules/process/entropy.c:214 modules/process/facet-level.c:207
+#: modules/process/fit-shape.c:755 modules/process/level.c:259
+#: modules/process/linematch.c:869 modules/process/neural.c:597
+#: modules/process/polylevel.c:494 modules/process/slope_dist.c:411
+#: modules/tools/filter.c:301 modules/tools/linestats.c:436
+#: modules/tools/profile.c:572 modules/tools/sfunctions.c:513
+#: modules/tools/stats.c:389
+msgid "Masking Mode"
+msgstr "Modo de mascaramento"
+
+#: modules/file/zeiss.c:61
+msgid "Imports Carl Zeiss SEM images."
+msgstr "Importa imagens SEM Carl Zeiss."
+
+#: modules/file/zeiss.c:74
+msgid "Carl Zeiss SEM scans (.tif)"
+msgstr "Escaneamentos SEM Carl Zeiss (.tif)"
+
+#: modules/file/zeisslsm.c:383
+#, fuzzy
+msgid "Imports Carl Zeiss CLSM images."
+msgstr "Importa imagens SEM Carl Zeiss."
+
+#: modules/file/zeisslsm.c:396
+#, fuzzy
+msgid "Carl Zeiss CLSM images (.lsm)"
+msgstr "Escaneamentos SEM Carl Zeiss (.tif)"
+
+#: modules/file/zemax.c:72
+msgid "Imports Zemax grid sag data files."
+msgstr "Importa arquivos de dados Zemax grid sag."
+
+#: modules/file/zemax.c:85
+msgid "Zemax grid sag data (.dat)"
+msgstr "Dados Zemax grid sag (.dat)"
+
+#: modules/file/zemax.c:178
+#, c-format
+msgid "Data line %u does not contain four items."
+msgstr "Linha de dados %u não contém quatro itens."
+
+#: modules/file/zemax.c:327
+#, c-format
+msgid "Unit code %d is invalid or unsupported."
+msgstr "O código de unidade %d é inválido ou não suportado."
+
+#: modules/file/zemax.c:351
+msgid "The first line contains too many items."
+msgstr "A primeira linha contém itens demais."
+
+#: modules/graph/graph_align.c:60
+msgid "Aligns graph curves."
+msgstr "Alinhar curvas de gráfico."
+
+#: modules/graph/graph_align.c:74
+msgid "/_Align"
+msgstr "/_Alinhar"
+
+#: modules/graph/graph_align.c:77
+msgid "Align curves"
+msgstr "Alinhar curvas"
+
+#: modules/graph/graph_cd.c:136
+msgid "Critical dimension measurements"
+msgstr "Medidas de dimensão crítica"
+
+#: modules/graph/graph_cd.c:150
+msgid "/_Critical Dimension..."
+msgstr "/Dimensão _crítica..."
+
+#: modules/graph/graph_cd.c:153
+msgid "Fit critical dimension"
+msgstr "Ajustar dimensão crítica"
+
+#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:270
+msgid "Fit Graph"
+msgstr "Ajustar gráfico"
+
+#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:254
+#: modules/graph/graph_fit.c:273 modules/process/fit-shape.c:394
+#: modules/volume/volume_fdfit.c:299
+msgid "verb|_Fit"
+msgstr "Ajustar"
+
+#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:168
+#: modules/graph/graph_fdfit.c:313 modules/graph/graph_fit.c:332
+#: modules/graph/graph_peaks.c:199 modules/graph/graph_stats.c:268
+msgid "_Graph curve:"
+msgstr "Curva do _gráfico:"
+
+#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:327
+#: modules/graph/graph_fit.c:346 modules/volume/volume_fdfit.c:389
+msgid "F_unction:"
+msgstr "F_unção:"
+
+#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:368
+#: modules/graph/graph_fit.c:382 modules/process/curvature.c:742
+#: modules/process/fit-shape.c:804 modules/volume/volume_fdfit.c:422
+msgid "Parameter"
+msgstr "Parâmetro"
+
+#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:370
+#: modules/graph/graph_fit.c:384 modules/process/fit-shape.c:806
+#: modules/volume/volume_fdfit.c:424
+msgid "Error"
+msgstr "Erro"
+
+#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:189
+#: modules/graph/graph_fdfit.c:422 modules/graph/graph_fit.c:440
+#: modules/graph/graph_stats.c:279 modules/graph/graph_stats.c:793
+#: modules/volume/volume_fdfit.c:476 modules/volume/volume_linestat.c:394
+msgid "Range:"
+msgstr "Intervalo:"
+
+#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:200
+#: modules/graph/graph_fdfit.c:433 modules/graph/graph_fit.c:451
+#: modules/graph/graph_stats.c:290 modules/graph/graph_stats.c:796
+#: modules/volume/volume_fdfit.c:487 modules/volume/volume_linestat.c:405
+msgid "range|to"
+msgstr "intervalo|até"
+
+#: modules/graph/graph_cd.c:347
+msgid "_Draw whole circle"
+msgstr "_Desenhar círculo completo"
+
+#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:498
+#: modules/graph/graph_fit.c:538 modules/process/fit-shape.c:523
+#: modules/volume/volume_fdfit.c:549
+msgid "Save Fit Report"
+msgstr "Salvar reporte de ajuste"
+
+#: modules/graph/graph_cd.c:529 modules/graph/graph_cd.c:1107
+#: modules/graph/graph_fdfit.c:725 modules/graph/graph_fit.c:779
+#: modules/volume/volume_fdfit.c:883
+msgid "Fit"
+msgstr "Ajustar"
+
+#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:765
+#: modules/graph/graph_fit.c:819 modules/volume/volume_fdfit.c:954
+#: modules/volume/volume_fdfit.c:1061
+msgid "It is necessary to select more data points than free fit parameters"
+msgstr ""
+"É necessário selecionar mais pontos de dados do que o número de parâmetros "
+"livres do ajuste"
+
+#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:814
+#: modules/graph/graph_fit.c:868 modules/graph/graph_stats.c:663
+#: modules/process/entropy.c:555 modules/tools/grainmeasure.c:217
+#: modules/tools/readvalue.c:634 modules/tools/readvalue.c:635
+#: modules/tools/readvalue.c:636 modules/tools/readvalue.c:637
+#: modules/tools/roughness.c:984 modules/tools/stats.c:723
+#: modules/tools/stats.c:736 modules/tools/stats.c:737
+#: modules/volume/volume_fdfit.c:1110 modules/xyz/xyz_drift.c:1099
+#: modules/xyz/xyz_drift.c:1117 modules/xyz/xyz_drift.c:1134
+msgid "N.A."
+msgstr "N.A."
+
+#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1381
+#: modules/graph/graph_fit.c:1518 modules/process/fit-shape.c:2060
+#: modules/volume/volume_fdfit.c:1696
+msgid "===== Fit Results ====="
+msgstr "===== Resultados do ajuste ====="
+
+#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1385
+#: modules/graph/graph_fit.c:1522 modules/process/fit-shape.c:2062
+#: modules/volume/volume_fdfit.c:1700
+#, c-format
+msgid "Data:             %s\n"
+msgstr "Dados:             %s\n"
+
+#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1388
+#: modules/graph/graph_fit.c:1525 modules/process/fit-shape.c:2064
+#: modules/volume/volume_fdfit.c:1703
+#, c-format
+msgid "Number of points: %d of %d\n"
+msgstr "Número de pontos: %d de %d\n"
+
+#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1392
+#: modules/graph/graph_fit.c:1529 modules/volume/volume_fdfit.c:1707
+#, c-format
+msgid "X range:          %.*f to %.*f %s\n"
+msgstr "Intervalo X:          %.*f até %.*f %s\n"
+
+#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1398
+#: modules/graph/graph_fit.c:1535 modules/process/fit-shape.c:2066
+#: modules/volume/volume_fdfit.c:1713
+#, c-format
+msgid "Fitted function:  %s\n"
+msgstr "Função ajustada:  %s\n"
+
+#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1401
+#: modules/graph/graph_fit.c:1538 modules/process/fit-shape.c:2069
+#: modules/volume/volume_fdfit.c:1716
+msgid "Results\n"
+msgstr "Resultados\n"
+
+#: modules/graph/graph_cut.c:87
+msgid "Cut graph"
+msgstr "Cortar gráfico"
+
+#: modules/graph/graph_cut.c:101
+msgid "/_Cut..."
+msgstr "/_Cortar..."
+
+#: modules/graph/graph_cut.c:104
+msgid "Extract part of graph into new one"
+msgstr "Extrair parte do gráfico para um novo"
+
+#: modules/graph/graph_cut.c:145
+msgid "Cut Graph"
+msgstr "Cortar gráfico"
+
+#: modules/graph/graph_cut.c:173
+msgid "Cut _all curves"
+msgstr "Cortar tod_as as curvas"
+
+#: modules/graph/graph_dos_spectrum.c:42
+msgid "DOS Spectrum"
+msgstr "Espectro DOS"
+
+#: modules/graph/graph_dos_spectrum.c:56
+msgid "/_DOS Spectrum"
+msgstr "/Espectro _DOS"
+
+#: modules/graph/graph_dos_spectrum.c:59
+msgid "Calculate DOS spectrum from I-V tunneling spectroscopy"
+msgstr "Calcula espectro DOS a partir de espectroscopia de tunelamento I-V"
+
+#: modules/graph/graph_dos_spectrum.c:95
+#, c-format
+msgid "%s: Graph should be I-V spectroscopy."
+msgstr "%s: O gráfico deve ser espectroscopia I-V."
+
+#: modules/graph/graph_dos_spectrum.c:115
+#, c-format
+msgid "DOS Spectrum for \"%s\""
+msgstr "Espectro DOS para \"%s\""
+
+#: modules/graph/graph_export_ascii.c:63
+msgid "Exports graph data to text files."
+msgstr "Exporta dados de gráfico para arquivos de texto."
+
+#: modules/graph/graph_export_ascii.c:77
+msgid "/Export _Text..."
+msgstr "/Exportar _texto..."
+
+#: modules/graph/graph_export_ascii.c:80
+msgid "Export graph data to a text file"
+msgstr "Exportar dados de gráfico para um arquivo de texto"
+
+#: modules/graph/graph_export_ascii.c:101
+msgid "Plain text"
+msgstr "Texto plano"
+
+#: modules/graph/graph_export_ascii.c:102
+msgid "Gnuplot friendly"
+msgstr "Compatível com Gnuplot"
+
+#: modules/graph/graph_export_ascii.c:103
+msgid "Comma separated values"
+msgstr "Dados separados por vírgula"
+
+#: modules/graph/graph_export_ascii.c:104
+msgid "Origin friendly"
+msgstr "Compatível com Origin"
+
+#: modules/graph/graph_export_ascii.c:105
+msgid "Igor Pro text wave"
+msgstr "Onda de texto Igor Pro"
+
+#: modules/graph/graph_export_ascii.c:127
+msgid "POSIX _number format"
+msgstr "Formato _numérico POSIX"
+
+#: modules/graph/graph_export_ascii.c:133
+msgid "Single _merged abscissa"
+msgstr "Abcissa simples _mesclada"
+
+#: modules/graph/graph_export_ascii.c:139
+msgid "Export _labels"
+msgstr "Exportar rótu_los"
+
+#: modules/graph/graph_export_ascii.c:145
+msgid "Export _units"
+msgstr "Exportar _unidades"
+
+#: modules/graph/graph_export_ascii.c:151
+msgid "Export _metadata"
+msgstr "Exportar _metadados"
+
+#: modules/graph/graph_export_ascii.c:194
+msgid "Export to Text File"
+msgstr "Exportar para arquivo de texto"
+
+#: modules/graph/graph_export_bitmap.c:36
+msgid "Export graph into bitmap"
+msgstr "Exportar gráfico em bitmap"
+
+#: modules/graph/graph_export_bitmap.c:50
+msgid "/Export _Bitmap"
+msgstr "/Exportar _bitmap"
+
+#: modules/graph/graph_export_bitmap.c:53
+msgid "Export graph to a raster image"
+msgstr "Exportar gráfico para uma imagem raster"
+
+#: modules/graph/graph_export_bitmap.c:65
+msgid "Export to PNG"
+msgstr "Exportar para PNG"
+
+#: modules/graph/graph_export_vector.c:36
+msgid "Exports graphs to PostScript"
+msgstr "Exporta gráficos para PostScript"
+
+#: modules/graph/graph_export_vector.c:50
+msgid "/Export _PostScript"
+msgstr "/Exportar _PostScript"
+
+#: modules/graph/graph_export_vector.c:53
+msgid "Export graph to PostScript"
+msgstr "Exportar gráfico para PostScript"
+
+#: modules/graph/graph_export_vector.c:66
+msgid "Export to PostScript"
+msgstr "Exportar para PostScript"
+
+#: modules/graph/graph_fdfit.c:169
+msgid "Fit force-distance data"
+msgstr "Ajustar dados força-distância"
+
+#: modules/graph/graph_fdfit.c:183
+msgid "/_Fit FD Curve..."
+msgstr "/Ajustar curva _FD..."
+
+#: modules/graph/graph_fdfit.c:186
+msgid "Fit a force-distance curve"
+msgstr "Ajustar curva força-distância"
+
+#: modules/graph/graph_fdfit.c:251 modules/volume/volume_fdfit.c:296
+msgid "Fit FD Curve"
+msgstr "Ajustar curva FD"
+
+#: modules/graph/graph_fdfit.c:258 modules/graph/graph_fit.c:277
+#: modules/process/correct_affine.c:347 modules/process/fit-shape.c:398
+#: modules/process/measure_lattice.c:247 modules/volume/volume_fdfit.c:303
+msgid "verb|_Estimate"
+msgstr "_Estimar"
+
+#: modules/graph/graph_fdfit.c:260 modules/graph/graph_fit.c:279
+#: modules/process/psf.c:239 modules/volume/volume_fdfit.c:305
+msgid "_Plot Inits"
+msgstr "_Plotar Inits"
+
+#: modules/graph/graph_fdfit.c:366 modules/graph/graph_fit.c:380
+#: modules/process/fit-shape.c:802 modules/volume/volume_fdfit.c:420
+msgid "Fix"
+msgstr "Fixar"
+
+#: modules/graph/graph_fdfit.c:372 modules/graph/graph_fit.c:386
+#: modules/volume/volume_fdfit.c:426
+msgid "Initial"
+msgstr "Inicial"
+
+#: modules/graph/graph_fdfit.c:383 modules/graph/graph_fit.c:401
+#: modules/volume/volume_fdfit.c:437
+msgid "χ<sup>2</sup> result:"
+msgstr "Resultado de χ<sup>2</sup>:"
+
+#: modules/graph/graph_fdfit.c:399 modules/graph/graph_fit.c:417
+#: modules/process/fit-shape.c:470 modules/process/fit-shape.c:2116
+#: modules/volume/volume_fdfit.c:453
+msgid "Correlation Matrix"
+msgstr "Matriz de correlação"
+
+#: modules/graph/graph_fdfit.c:454 modules/graph/graph_fit.c:492
+#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:508
+msgid "Instant:"
+msgstr "Instante:"
+
+#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
+msgid "esti_mate"
+msgstr "esti_mar"
+
+#: modules/graph/graph_fdfit.c:464 modules/graph/graph_fit.c:502
+#: modules/volume/volume_fdfit.c:518
+msgid "p_lot"
+msgstr "p_lotar"
+
+#: modules/graph/graph_fdfit.c:724 modules/graph/graph_fit.c:778
+#: modules/volume/volume_fdfit.c:882
+msgid "Estimate"
+msgstr "Estimar"
+
+#: modules/graph/graph_fdfit.c:1428 modules/graph/graph_fit.c:1565
+#: modules/volume/volume_fdfit.c:1744
+#, c-format
+msgid "Residual sum:   %g\n"
+msgstr "Soma residual:   %g\n"
+
+#: modules/graph/graph_fdfit.c:1431 modules/graph/graph_fit.c:1568
+#: modules/volume/volume_fdfit.c:1747
+msgid "Correlation matrix\n"
+msgstr "Matriz de correlação\n"
+
+#: modules/graph/graph_filter.c:40
+msgid "Remove graph noise by filtering."
+msgstr "Remover ruído de gráfico filtrando."
+
+#: modules/graph/graph_filter.c:54
+msgid "/_Filter"
+msgstr "/_Filtrar"
+
+#: modules/graph/graph_filter.c:57
+msgid "Remove noise from graph curves"
+msgstr "Remover ruído de curvas do gráfico"
+
+#: modules/graph/graph_fit.c:182
+msgid "Fit graph with function"
+msgstr "Ajustar gráfico com função"
+
+#: modules/graph/graph_fit.c:196
+msgid "/_Fit Function..."
+msgstr "/Ajustar _função..."
+
+#: modules/graph/graph_fit.c:199
+msgid "Fit a function on graph data"
+msgstr "Ajustar uma função nos dados do gráfico"
+
+#: modules/graph/graph_fit.c:393
+msgid "Copy all fitted values to estimates"
+msgstr "Copiar todos os valores ajustados para estimativas"
+
+#: modules/graph/graph_fit.c:467
+msgid "Plot full range"
+msgstr "Plotar intervalo completo"
+
+#: modules/graph/graph_fit.c:477
+msgid "Create a difference graph"
+msgstr "Criar um gráfico da diferença"
+
+#: modules/graph/graph_level.c:39
+msgid "Level graph by line."
+msgstr "Nivelar gráfico por linha."
+
+#: modules/graph/graph_level.c:53
+msgid "/_Level"
+msgstr "/Nive_lar"
+
+#: modules/graph/graph_level.c:56
+msgid "Level graph curves"
+msgstr "Nivelar curvas do gráfico"
+
+#: modules/graph/graph_logscale.c:79
+msgid "Physically transforms graph data to logarithmic scale."
+msgstr ""
+
+#: modules/graph/graph_logscale.c:93
+#, fuzzy
+msgid "/_Logscale transform..."
+msgstr "Transformada de classificação..."
+
+#: modules/graph/graph_logscale.c:96
+#, fuzzy
+msgid "Transform graph axes to logarithmic scale"
+msgstr "Cria apresentação com escala de cores logarítmica"
+
+#: modules/graph/graph_logscale.c:229
+#, fuzzy
+msgid "Logscale Transform"
+msgstr "Transformada de Hough"
+
+#: modules/graph/graph_logscale.c:245
+#, fuzzy
+msgid "Axes to transform:"
+msgstr "Transformada _inversa"
+
+#: modules/graph/graph_logscale.c:253
+#, fuzzy
+msgid "_X"
+msgstr "_X:"
+
+#: modules/graph/graph_logscale.c:254
+#, fuzzy
+msgid "_Y"
+msgstr "_Y:"
+
+#: modules/graph/graph_logscale.c:255 modules/tools/grainremover.c:110
+msgid "_Both"
+msgstr "Am_bos"
+
+#: modules/graph/graph_logscale.c:260
+msgid "Negative value handling:"
+msgstr ""
+
+#: modules/graph/graph_logscale.c:268
+msgid "O_mit"
+msgstr ""
+
+#: modules/graph/graph_logscale.c:269
+#, fuzzy
+msgid "_Take absolute value"
+msgstr "Inclinação média absoluta"
+
+#: modules/graph/graph_logscale.c:275
+msgid "Base:"
+msgstr ""
+
+#: modules/graph/graph_logscale.c:283
+msgid "Natural (e)"
+msgstr ""
+
+#: modules/graph/graph_logscale.c:284
+msgid "10"
+msgstr ""
+
+#: modules/graph/graph_peaks.c:118
+msgid "Finds peaks on graph curves."
+msgstr "Encontrar picos nas curvas do gráfico."
+
+#: modules/graph/graph_peaks.c:132
+msgid "/Find _Peaks..."
+msgstr "/Encontrar _picos..."
+
+#: modules/graph/graph_peaks.c:135
+msgid "Find graph curve peaks"
+msgstr "Encontrar picos na curva do gráfico."
+
+#: modules/graph/graph_peaks.c:155
+msgid "Prominence"
+msgstr "Proeminência"
+
+#: modules/graph/graph_peaks.c:159
+msgid "Zero"
+msgstr "Zero"
+
+#: modules/graph/graph_peaks.c:160
+msgid "Bilateral minimum"
+msgstr "Mínimo bilateral"
+
+#: modules/graph/graph_peaks.c:176
+msgid "Graph Peaks"
+msgstr "Picos do gráfico"
+
+#: modules/graph/graph_peaks.c:209
+msgid "_Background type:"
+msgstr "Fundo tipo:"
+
+#: modules/graph/graph_peaks.c:219
+msgid "Order peaks _by:"
+msgstr "Ordenar picos por:"
+
+#: modules/graph/graph_peaks.c:225
+msgid "Number of _peaks:"
+msgstr "Número de _picos:"
+
+#: modules/graph/graph_peaks.c:245 modules/graph/graph_stats.c:367
+#: modules/process/curvature.c:770 modules/process/grain_stat.c:360
+#: modules/process/measure_lattice.c:390 modules/process/polylevel.c:610
+#: modules/tools/distance.c:259 modules/tools/roughness.c:819
+#: modules/tools/stats.c:447
+msgid "Save table to a file"
+msgstr "Salvar tabela para um arquivo"
+
+#: modules/graph/graph_peaks.c:249 modules/graph/graph_stats.c:371
+#: modules/process/curvature.c:775 modules/process/grain_stat.c:365
+#: modules/process/measure_lattice.c:394 modules/process/polylevel.c:620
+#: modules/tools/distance.c:264 modules/tools/roughness.c:824
+#: modules/tools/stats.c:452
+msgid "Copy table to clipboard"
+msgstr "Copiar tabela para área de transferência"
+
+#: modules/graph/graph_peaks.c:618
+msgid "Save Peak Parameters"
+msgstr "Salvar parâmetros do pico"
+
+#: modules/graph/graph_stats.c:148 modules/graph/graph_stats.c:161
+#: modules/tools/stats.c:205
+msgid "Average value:"
+msgstr "Valor médio:"
+
+#: modules/graph/graph_stats.c:149 modules/tools/stats.c:206
+msgid "Median:"
+msgstr "Mediana:"
+
+#: modules/graph/graph_stats.c:150
+#, fuzzy
+msgid "Ra:"
+msgstr "Ra"
+
+#: modules/graph/graph_stats.c:151
+#, fuzzy
+msgid "Rms (Rq):"
+msgstr "Rms (Sq):"
+
+#: modules/graph/graph_stats.c:152 modules/tools/stats.c:210
+msgid "Skew:"
+msgstr "Assimetria:"
+
+#: modules/graph/graph_stats.c:153 modules/tools/stats.c:211
+msgid "Kurtosis:"
+msgstr "Kurtosis:"
+
+#: modules/graph/graph_stats.c:158
+#, fuzzy
+msgid "Projected length:"
+msgstr "Comprimento da fronteira projetada"
+
+#: modules/graph/graph_stats.c:159
+#, fuzzy
+msgid "Developed length:"
+msgstr "Comprimento do perfil desenvolvido"
+
+#: modules/graph/graph_stats.c:160 modules/tools/stats.c:214
+msgid "Variation:"
+msgstr "Variação:"
+
+#: modules/graph/graph_stats.c:162
+#, fuzzy
+msgid "Area under curve:"
+msgstr "Curva do _gráfico:"
+
+#: modules/graph/graph_stats.c:163
+#, fuzzy
+msgid "Positive area:"
+msgstr "Positivo"
+
+#: modules/graph/graph_stats.c:164
+#, fuzzy
+msgid "Negative area:"
+msgstr "Negativo"
+
+#: modules/graph/graph_stats.c:165
+#, fuzzy
+msgid "Root mean square:"
+msgstr "Raiz quadrática média da ondulação"
+
+#: modules/graph/graph_stats.c:171
+#, fuzzy
+msgid "Calculates simple graph curve statistics."
+msgstr "Calcula curvatura total."
+
+#: modules/graph/graph_stats.c:185
+#, fuzzy
+msgid "/_Statistics..."
+msgstr "/_Grãos/Es_tatísticas..."
+
+#: modules/graph/graph_stats.c:188
+#, fuzzy
+msgid "Calculate graph curve statistics"
+msgstr "Calcular funções estatísticas de linha/coluna"
+
+#: modules/graph/graph_stats.c:241
+#, fuzzy
+msgid "Graph Statistics"
+msgstr "Estatísticas de grãos"
+
+#: modules/graph/graph_stats.c:320 modules/graph/graph_stats.c:807
+#, fuzzy
+msgid "Simple Parameters"
+msgstr "Parâmetros de simulação"
+
+#: modules/graph/graph_stats.c:342 modules/graph/graph_stats.c:826
+#, fuzzy
+msgid "Integrals"
+msgstr "_Integral:"
+
+#: modules/graph/graph_stats.c:686
+#, fuzzy
+msgid "Save Curve Statistics"
+msgstr "Salvar estatísticas de grãos"
+
+#: modules/layer/axis.c:143
+msgid "Layer allowing selection of horizontal or vertical lines."
+msgstr "Camada permitindo seleção de linhas horizontal ou vertical."
+
+#: modules/layer/ellipse.c:143
+msgid "Layer allowing selection of elliptic areas."
+msgstr "Camada permitindo seleção de áreas elípticas."
+
+#: modules/layer/lattice.c:126
+msgid "Layer allowing selection of a two-dimensional lattice."
+msgstr "Camada permitindo seleção de uma rede bidimensional."
+
+#: modules/layer/line.c:177
+msgid "Layer allowing selection of arbitrary straight lines."
+msgstr "Camada permitindo seleção de linhas retas arbitrárias."
+
+#: modules/layer/path.c:171
+msgid "Layer allowing selection of a single long curve."
+msgstr "Camada permitindo seleção de uma curva longa simples."
+
+#: modules/layer/point.c:169
+msgid ""
+"Layer allowing selection of several points, displayed as crosses or "
+"invisible."
+msgstr ""
+"Camada permitindo seleção de diversos pontos, exibidos como cruzes ou "
+"invisíveis."
+
+#: modules/layer/rectangle.c:147
+msgid "Layer allowing selection of rectangular areas."
+msgstr "Camada permitindo seleção de áreas retangulares."
+
+#: modules/plugin-proxy.c:145
+msgid ""
+"Plug-in proxy is a module capable of querying, registering, and running "
+"external programs (plug-ins) on data pretending they are data processing or "
+"file loading/saving modules."
+msgstr ""
+"Plug-in proxy é um módulo capaz de consultar, registrar e executar programas "
+"externos (plug-ins) sobre dados fazendo de conta que eles são processamento "
+"de dados ou módulos de carregamento/salvamento de arquivo."
+
+#: modules/plugin-proxy.c:463
+msgid "/_Plug-Ins"
+msgstr "/_Plug-Ins"
+
+#: modules/plugin-proxy.c:464
+#, c-format
+msgid "Run plug-in %s"
+msgstr "Executar plug-in %s"
+
+#: modules/plugin-proxy.c:737 modules/plugin-proxy.c:838
+msgid "Plugin-proxy must be run as interactive."
+msgstr "Plugin-proxy deve ser executado como interativo."
+
+#: modules/plugin-proxy.c:743
+#, c-format
+msgid "Plug-in `%s' does not implement file loading."
+msgstr "O plug-in `%s' não implementa o carregamento de arquivo."
+
+#: modules/plugin-proxy.c:761
+#, c-format
+msgid "Cannot read temporary file: %s."
+msgstr "Não foi possível ler o arquivo temporário: %s."
+
+#: modules/plugin-proxy.c:768 modules/plugin-proxy.c:863
+#, c-format
+msgid "Cannot execute plug-in `%s': %s."
+msgstr "Não foi possível executar o plug-in `%s': %s."
+
+#: modules/plugin-proxy.c:777 modules/plugin-proxy.c:872
+#, c-format
+msgid "Plug-in `%s' returned non-zero exit status: %d."
+msgstr "O plug-in `%s' retornou status de saída diferente de zero: %d."
+
+#: modules/plugin-proxy.c:790
+#, c-format
+msgid "Plug-in `%s' did not return any meaningful data."
+msgstr "O plug-in `%s' não retornou nenhum dado com significado."
+
+#: modules/plugin-proxy.c:844
+#, c-format
+msgid "Plug-in `%s' does not implement file saving."
+msgstr "O plug-in `%s' não implementa o salvamento de arquivo."
+
+#: modules/plugin-proxy.c:1204 modules/plugin-proxy.c:1213
+#, c-format
+msgid "Cannot create a temporary file: %s."
+msgstr "Não foi possível criar um arquivo temporário: %s."
+
+#: modules/plugin-proxy.c:1221
+#, c-format
+msgid "Cannot fdopen() already open file: %s."
+msgstr "Não é possível abrir um arquivo que já esteja aberto: %s."
+
+#: modules/process/acf2d.c:37
+msgid "Calculates two-dimensional autocorrelation function."
+msgstr "Calcula função de autocorrelação bidimensional."
+
+#: modules/process/acf2d.c:51
+msgid "/_Statistics/2D Auto_correlation"
+msgstr "/E_statísticas/Auto_correlação 2D"
+
+#: modules/process/acf2d.c:55
+msgid "Calculate 2D autocorrelation function"
+msgstr "Calcula função de autocorrelação 2D"
+
+#: modules/process/acf2d.c:76
+msgid "2D ACF"
+msgstr "2D ACF"
+
+#: modules/process/angle_dist.c:102
+msgid ""
+"Calculates two-dimensional distribution of angles, that is projections of "
+"slopes to all directions."
+msgstr ""
+"Calcula distribuição bidimensional de ângulos, que é a projeção de "
+"inclinações para todas as direções."
+
+#: modules/process/angle_dist.c:117
+msgid "/_Statistics/An_gle Distribution..."
+msgstr "/E_statísticas/Distribuição de ân_gulos..."
+
+#: modules/process/angle_dist.c:121
+msgid "Calculate two-dimensional angle distribution"
+msgstr "Calcular distribuição de ângulos bidimensional"
+
+#: modules/process/angle_dist.c:149
+msgid "Computing angle distribution..."
+msgstr "Computando a distribuição de ângulos..."
+
+#: modules/process/angle_dist.c:160
+msgid "Angle distribution"
+msgstr "Distribuição de ângulos"
+
+#: modules/process/angle_dist.c:171
+msgid "Angle Distribution"
+msgstr "Distribuição de ângulos"
+
+#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:365
+msgid "Output _size:"
+msgstr "Tamanho da saída:"
+
+#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:207
+msgid "_Number of steps:"
+msgstr "_Número de passos:"
+
+#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:372
+msgid "_Logarithmic value scale"
+msgstr "Escala _logarítmica de valores"
+
+#: modules/process/angle_dist.c:204 modules/process/entropy.c:231
+#: modules/process/slope_dist.c:382
+msgid "Use local plane _fitting"
+msgstr "Usar ajuste de plano local"
+
+#: modules/process/angle_dist.c:213 modules/process/entropy.c:242
+#: modules/process/slope_dist.c:393
+msgid "_Plane size:"
+msgstr "Tamanho do _plano:"
+
+#: modules/process/arithmetic.c:140
+msgid "Simple arithmetic operations with data fields."
+msgstr "Operações aritméticas simples com campos de dados."
+
+#: modules/process/arithmetic.c:160
+msgid "/M_ultidata/_Arithmetic..."
+msgstr "/M_ulti-dados/_Aritmética..."
+
+#: modules/process/arithmetic.c:164
+msgid "Arithmetic operations on data"
+msgstr "Operações aritméticas em dados"
+
+#: modules/process/arithmetic.c:202 modules/process/stitch.c:234
+#: modules/process/superresolution.c:348
+msgid "Calculated"
+msgstr "Calculado"
+
+#: modules/process/arithmetic.c:231
+msgid "Arithmetic"
+msgstr "Aritmética"
+
+#: modules/process/arithmetic.c:270
+msgid "_Expression:"
+msgstr "_Expressão:"
+
+#: modules/process/arithmetic.c:295
+msgid "Operands"
+msgstr "Operandos"
+
+#: modules/process/arithmetic.c:300 modules/process/dimensions.h:465
+msgid "Units"
+msgstr "Unidades"
+
+#: modules/process/arithmetic.c:335
+#, c-format
+msgid "Take result units from data d%d"
+msgstr "Obter unidades do resultado a partir dos dados d%d"
+
+#: modules/process/arithmetic.c:353
+msgid "Specify un_its:"
+msgstr "Especificar un_idades:"
+
+#: modules/process/arithmetic.c:372
+msgid "Specify result units explicitly"
+msgstr "Especificar unidades do resultado explicitamente"
+
+#: modules/process/arithmetic.c:455
+msgid "Expression contains unknown identifiers"
+msgstr "Expressão contém identificadores desconhecidos"
+
+#: modules/process/arithmetic.c:569 modules/process/superresolution.c:299
+msgid "Pixel dimensions differ"
+msgstr "Dimensões dos pixeis diferem"
+
+#: modules/process/arithmetic.c:571 modules/process/superresolution.c:301
+msgid "Lateral dimensions are different physical quantities"
+msgstr "Dimensões laterais são diferentes das quantidades físicas"
+
+#: modules/process/arithmetic.c:574 modules/process/superresolution.c:304
+msgid "Physical dimensions differ"
+msgstr "Dimensões físicas diferem"
+
+#: modules/process/averaging.c:53
+msgid "Similar structures averaging using autocorrelation"
+msgstr "Cálculo de média de estruturas similares usando autocorrelação"
+
+#: modules/process/averaging.c:67
+msgid "/_Correct Data/_Correlation Averaging..."
+msgstr "/_Corrigir dados/_Calcular médias com correlação..."
+
+#: modules/process/averaging.c:71
+msgid "Averaging of similar structures"
+msgstr "Cálculo de média de estruturas similares"
+
+#: modules/process/averaging.c:105
+msgid "Averaged"
+msgstr "Média calculada"
+
+#: modules/process/averaging.c:123
+msgid "Averaging of Similar Structures"
+msgstr "Cálculo de média de estruturas similares"
+
+#: modules/process/averaging.c:141
+msgid "Select the sample area below"
+msgstr "Selecione a área da amostra abaixo"
+
+#: modules/process/basicops.c:53
+msgid ""
+"Basic operations like flipping, value inversion, and rotation by multiples "
+"of 90 degrees."
+msgstr ""
+"Operações básicas como espelhamento, inversão de valores e rotação por "
+"múltiplos de 90 graus."
+
+#: modules/process/basicops.c:68
+msgid "/_Basic Operations/_Invert Value"
+msgstr "/Operações _básicas/_Inverter valor"
+
+#: modules/process/basicops.c:72
+msgid "Invert values about mean"
+msgstr "Inverter valores em torno da média"
+
+#: modules/process/basicops.c:75
+msgid "/_Basic Operations/Flip _Horizontally"
+msgstr "/Operações _básicas/Espelhar _horizontalmente"
+
+#: modules/process/basicops.c:79
+msgid "Flip data horizontally"
+msgstr "Espelhar dados horizontalmente"
+
+#: modules/process/basicops.c:82
+msgid "/_Basic Operations/Flip _Vertically"
+msgstr "/Operações _básicas/Espelhar _verticalmente"
+
+#: modules/process/basicops.c:86
+msgid "Flip data vertically"
+msgstr "Espelhar dados verticalmente"
+
+#: modules/process/basicops.c:89
+msgid "/_Basic Operations/Flip _Both"
+msgstr "/Operações _básicas/Espelhar am_bos"
+
+#: modules/process/basicops.c:93
+msgid "Flip data both horizontally and vertically"
+msgstr "Espelhar dados horizontalmente e verticalmente"
+
+#: modules/process/basicops.c:96
+msgid "/_Basic Operations/Rotate C_lockwise"
+msgstr "/Operações _básicas/Girar em sentido horário"
+
+#: modules/process/basicops.c:100
+msgid "Rotate data 90 degrees clockwise"
+msgstr "Girar dados 90 graus no sentido horário"
+
+#: modules/process/basicops.c:103
+msgid "/_Basic Operations/Rotate _Counterclockwise"
+msgstr "/Operações _básicas/Girar em sentido anti-horário"
+
+#: modules/process/basicops.c:107
+msgid "Rotate data 90 degrees counterclockwise"
+msgstr "Girar dados 90 graus no sentido anti-horário"
+
+#: modules/process/basicops.c:110
+msgid "/_Basic Operations/S_quare Samples"
+msgstr "/Operações _básicas/En_quadrar amostras"
+
+#: modules/process/basicops.c:114
+msgid "Resample data with non-1:1 aspect ratio to square samples"
+msgstr ""
+"Re-amostrar dados com razão de aspecto diferente de 1:1 para amostras  "
+"quadradas"
+
+#: modules/process/basicops.c:118
+msgid "/_Basic Operations/_Null Offsets"
+msgstr "/Operações _básicas/Afastamentos _nulos"
+
+#: modules/process/basicops.c:122
+msgid "Null horizontal offsets, moving the origin to the upper left corner"
+msgstr ""
+"Afastamentos horizontais nulos, movendo a origem para o canto superior "
+"esquerdo"
+
+#: modules/process/bdep_synth.c:150
+msgid "Generates surfaces by ballistic deposition."
+msgstr "Gera superfícies por deposição balística."
+
+#: modules/process/bdep_synth.c:164
+#, fuzzy
+msgid "/S_ynthetic/_Deposition/_Ballistic..."
+msgstr "/Sintético/_Balístico..."
+
+#: modules/process/bdep_synth.c:168
+msgid "Generate surface by ballistic deposition"
+msgstr "Gera superfície por deposição balística"
+
+#: modules/process/bdep_synth.c:239 modules/process/bdep_synth.c:596
+#: modules/process/calcoefs_simple.c:636 modules/process/col_synth.c:282
+#: modules/process/col_synth.c:734 modules/process/crosscor.c:792
+#: modules/process/crosscor.c:855 modules/process/deposit_synth.c:268
+#: modules/process/deposit_synth.c:858 modules/process/diff_synth.c:304
+#: modules/process/diff_synth.c:704 modules/process/domain_synth.c:255
+#: modules/process/domain_synth.c:745 modules/process/fibre_synth.c:357
+#: modules/process/fibre_synth.c:872 modules/process/grain_wshed.c:433
+#: modules/process/lat_synth.c:491 modules/process/mark_disconn.c:148
+#: modules/process/mark_disconn.c:361 modules/process/maskcor.c:334
+#: modules/process/mcrop.c:314 modules/process/merge.c:1072
+#: modules/process/nanoindent_adjust.c:324 modules/process/neural.c:1279
+#: modules/process/pid.c:339 modules/process/sphere-revolve.c:269
+#: modules/process/superresolution.c:415 modules/process/superresolution.c:504
+#: modules/process/tip_blind.c:778 modules/process/tipops.c:320
+#: modules/process/wave_synth.c:305 modules/process/wave_synth.c:747
+#: modules/process/xydenoise.c:214 modules/volume/volume_kmeans.c:397
+#: modules/volume/volume_kmedians.c:363 modules/xyz/xyz_raster.c:997
+#: modules/xyz/xyz_raster.c:1013
+msgid "Initializing..."
+msgstr "Inicializando ..."
+
+#: modules/process/bdep_synth.c:275 modules/process/col_synth.c:320
+#: modules/process/deposit_synth.c:306 modules/process/deposit_synth.c:318
+#: modules/process/deposit_synth.c:531 modules/process/deposit_synth.c:544
+#: modules/process/diff_synth.c:342 modules/process/domain_synth.c:319
+#: modules/process/domain_synth.c:327 modules/process/fbm_synth.c:278
+#: modules/process/fft_synth.c:314 modules/process/fibre_synth.c:394
+#: modules/process/lat_synth.c:529 modules/process/lno_synth.c:405
+#: modules/process/noise_synth.c:309 modules/process/obj_synth.c:404
+#: modules/process/pat_synth.c:357 modules/process/phase_synth.c:518
+#: modules/process/wave_synth.c:342
+msgid "Generated"
+msgstr "Gerado"
+
+#: modules/process/bdep_synth.c:299 modules/process/col_synth.c:345
+#: modules/process/diff_synth.c:366
+msgid "Mean deposited thickness"
+msgstr "Espessura média depositada"
+
+#: modules/process/bdep_synth.c:339
+msgid "Ballistic Deposition"
+msgstr "Deposição balística"
+
+#: modules/process/bdep_synth.c:384 modules/process/col_synth.c:435
+#: modules/process/diff_synth.c:454 modules/process/domain_synth.c:407
+msgid "Progressive preview"
+msgstr "Pré-visualização progressiva"
+
+#: modules/process/bdep_synth.c:407 modules/process/col_synth.c:458
+#: modules/process/deposit_synth.c:413 modules/process/diff_synth.c:477
+#: modules/process/domain_synth.c:430 modules/process/fbm_synth.c:360
+#: modules/process/fft_synth.c:398 modules/process/fibre_synth.c:479
+#: modules/process/lat_synth.c:626 modules/process/lno_synth.c:488
+#: modules/process/mfm_current.c:383 modules/process/mfm_parallel.c:384
+#: modules/process/noise_synth.c:392 modules/process/obj_synth.c:495
+#: modules/process/pat_synth.c:442 modules/process/phase_synth.c:263
+#: modules/process/wave_synth.c:426
+msgid "Dimensions"
+msgstr "Dimensões"
+
+#: modules/process/bdep_synth.c:416 modules/process/col_synth.c:467
+#: modules/process/deposit_synth.c:425 modules/process/diff_synth.c:486
+#: modules/process/domain_synth.c:438 modules/process/fbm_synth.c:371
+#: modules/process/fft_synth.c:409 modules/process/fibre_synth.c:490
+#: modules/process/lno_synth.c:499 modules/process/mfm_current.c:412
+#: modules/process/mfm_parallel.c:411 modules/process/noise_synth.c:403
+#: modules/process/obj_synth.c:506 modules/process/pat_synth.c:454
+#: modules/process/phase_synth.c:274 modules/process/wave_synth.c:437
+msgid "Generator"
+msgstr "Gerador"
+
+#: modules/process/bdep_synth.c:422 modules/process/col_synth.c:473
+#: modules/process/deposit_synth.c:455 modules/process/diff_synth.c:492
+#: modules/process/fibre_synth.c:502 modules/process/lno_synth.c:1041
+#: modules/process/obj_synth.c:518
+msgid "Co_verage:"
+msgstr "Cobertura:"
+
+#: modules/process/bdep_synth.c:434 modules/process/diff_synth.c:512
+#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:411
+#: modules/process/fft_synth.c:418 modules/process/fibre_synth.c:544
+#: modules/process/lat_synth.c:758 modules/process/lno_synth.c:535
+#: modules/process/noise_synth.c:435 modules/process/obj_synth.c:577
+#: modules/process/phase_synth.c:302 modules/process/wave_synth.c:472
+#, fuzzy
+msgid "_Like Current Image"
+msgstr "Canal atual"
+
+#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:542
+#: modules/process/diff_synth.c:561
+msgid "Evolution"
+msgstr "Evolução"
+
+#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:545
+#: modules/process/diff_synth.c:564
+msgid "Plot graphs:"
+msgstr "Plotar gráficos:"
+
+#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:841
+#: modules/process/diff_synth.c:781
+msgid "Depositing particles..."
+msgstr "Depositando partículas..."
+
+#: modules/process/calcoefs_load.c:85
+msgid "Load calibration data from text file"
+msgstr "Carregar dados de calibração a partir de um arquivo de texto"
+
+#: modules/process/calcoefs_load.c:99
+msgid "/Cali_bration/_Load From Text File..."
+msgstr "/Ca_libração/Carregar a partir de um arquivo de texto..."
+
+#: modules/process/calcoefs_load.c:103
+msgid "Load calibration data from text file."
+msgstr "Carregar dados de calibração a partir de um arquivo de texto."
+
+#: modules/process/calcoefs_load.c:159
+#, c-format
+msgid "Error loading file: %s\n"
+msgstr "Erro ao carregar arquivo: %s\n"
+
+#: modules/process/calcoefs_load.c:191 modules/process/calcoefs_new.c:336
+#, c-format
+msgid "Cannot save preset: %s"
+msgstr "Não foi possível salvar pré-definição: %s"
+
+#: modules/process/calcoefs_load.c:223
+msgid "Load Calibration Data"
+msgstr "Carregar dados de calibração"
+
+#: modules/process/calcoefs_load.c:243 modules/process/calcoefs_new.c:590
+#: modules/process/calcoefs_simple.c:475
+msgid "Calibration name:"
+msgstr "Nome da calibração:"
+
+#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:421
+#: modules/volume/volume_extract.c:501
+msgid "No data loaded"
+msgstr "Nenhum dado carregado"
+
+#: modules/process/calcoefs_load.c:307 modules/process/calcoefs_new.c:685
+#: modules/process/calcoefs_simple.c:539
+#, c-format
+msgid "Calibration '%s' already exists"
+msgstr "A calibração '%s' já existe"
+
+#: modules/process/calcoefs_load.c:310 modules/process/calcoefs_new.c:688
+#: modules/process/calcoefs_simple.c:541
+msgid "Overwrite"
+msgstr "Sobrescrever"
+
+#: modules/process/calcoefs_load.c:312 modules/process/calcoefs_new.c:690
+#: modules/process/calcoefs_simple.c:542
+msgid "Append"
+msgstr "Anexar"
+
+#: modules/process/calcoefs_load.c:349
+msgid "Load calibration data"
+msgstr "Carregar dados de calibração"
+
+#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1059
+#, c-format
+msgid "Error loading file '%s'"
+msgstr "Erro ao carregar arquivo '%s'"
+
+#: modules/process/calcoefs_load.c:423
+msgid "Error: not enough points."
+msgstr "Erro: sem pontos suficientes."
+
+#: modules/process/calcoefs_load.c:450
+#, c-format
+msgid "Loaded %d data points"
+msgstr "Carregados %d pontos de dados"
+
+#: modules/process/calcoefs_new.c:173
+msgid "Create simple calibration data"
+msgstr "Criar dados de calibração simples"
+
+#: modules/process/calcoefs_new.c:187
+msgid "/Cali_bration/_Create..."
+msgstr "/Ca_libração/_Criar..."
+
+#: modules/process/calcoefs_new.c:191
+msgid "Specify simple calibration data."
+msgstr "Especificar dados de calibração simples."
+
+#: modules/process/calcoefs_new.c:370
+msgid "Simple Calibration Data"
+msgstr "Dados de calibração simples"
+
+#: modules/process/calcoefs_new.c:388
+msgid "_X from:"
+msgstr "De _X:"
+
+#: modules/process/calcoefs_new.c:415
+msgid "_X to:"
+msgstr "Até _X:"
+
+#: modules/process/calcoefs_new.c:428
+msgid "_Y from:"
+msgstr "De _Y:"
+
+#: modules/process/calcoefs_new.c:441
+msgid "_Y to:"
+msgstr "Até _Y:"
+
+#: modules/process/calcoefs_new.c:455
+msgid "_Z from:"
+msgstr "De _Z:"
+
+#: modules/process/calcoefs_new.c:482
+msgid "_Z to:"
+msgstr "Até _Z:"
+
+#: modules/process/calcoefs_new.c:495
+msgid "_X uncertainty:"
+msgstr "Incerteza em _X:"
+
+#: modules/process/calcoefs_new.c:516
+msgid "_Y uncertainty:"
+msgstr "Incerteza em _Y:"
+
+#: modules/process/calcoefs_new.c:531
+msgid "_Z uncertainty:"
+msgstr "Incerteza em _Z:"
+
+#: modules/process/calcoefs_new.c:553
+msgid "_X correction factor:"
+msgstr "Fator de correlação _X:"
+
+#: modules/process/calcoefs_new.c:565
+msgid "_Y correction factor:"
+msgstr "Fator de correlação _Y:"
+
+#: modules/process/calcoefs_new.c:577
+msgid "_Z correction factor:"
+msgstr "Fator de correlação _Z:"
+
+#: modules/process/calcoefs_simple.c:169
+msgid "Simple error map based on grating measurements"
+msgstr "Mapa de erros simples baseado em medições de grade"
+
+#: modules/process/calcoefs_simple.c:183
+msgid "/Cali_bration/_Get Simple Errop Map..."
+msgstr "/Ca_libração/Obter mapa de erros simples..."
+
+#: modules/process/calcoefs_simple.c:187
+msgid "Simple error mapping"
+msgstr "Mapeamento de erros simples"
+
+#: modules/process/calcoefs_simple.c:326
+msgid "Simple Error Map"
+msgstr "Mapa de erros simples"
+
+#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:142
+#: modules/process/superresolution.c:156
+msgid "Operands:"
+msgstr "Operandos:"
+
+#: modules/process/calcoefs_simple.c:349
+msgid "Grating image"
+msgstr "Imagem da grade"
+
+#: modules/process/calcoefs_simple.c:350 modules/tools/crop.c:390
+msgid "Detail"
+msgstr "Detalhe"
+
+#: modules/process/calcoefs_simple.c:371 modules/process/calcoefs_view.c:491
+#: modules/process/calibrate.c:481 modules/process/crosscor.c:276
+#: modules/volume/volume_calibrate.c:460
+msgid "_X offset:"
+msgstr "Afastamento _X:"
+
+#: modules/process/calcoefs_simple.c:398 modules/process/calcoefs_view.c:517
+#: modules/process/calibrate.c:488 modules/process/crosscor.c:284
+#: modules/volume/volume_calibrate.c:467
+msgid "_Y offset:"
+msgstr "Afastamento _Y:"
+
+#: modules/process/calcoefs_simple.c:411
+msgid "X _period:"
+msgstr "_Período X:"
+
+#: modules/process/calcoefs_simple.c:424
+msgid "Y p_eriod:"
+msgstr "P_eríodo Y:"
+
+#: modules/process/calcoefs_simple.c:438 modules/process/calcoefs_view.c:529
+#: modules/volume/volume_calibrate.c:474
+msgid "_Z offset:"
+msgstr "Afastamento _Z:"
+
+#: modules/process/calcoefs_simple.c:466
+msgid "_Threshold"
+msgstr "Limiar"
+
+#: modules/process/calcoefs_simple.c:487
+msgid "No suggestion\n"
+msgstr "Sem sugestão\n"
+
+#: modules/process/calcoefs_simple.c:589
+msgid "Data same as detail?"
+msgstr "Mesmos dados como detalhes?"
+
+#: modules/process/calcoefs_simple.c:595
+msgid "Data larger than detail?"
+msgstr "Dados maiores que os detalhes?"
+
+#: modules/process/calcoefs_simple.c:609
+#, c-format
+msgid "one object found"
+msgid_plural "%d objects found"
+msgstr[0] "um objeto encontrado"
+msgstr[1] "%d objetos encontrados"
+
+#: modules/process/calcoefs_simple.c:614
+msgid "Search canceled"
+msgstr "Busca cancelada"
+
+#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:835
+#: modules/process/maskcor.c:336 modules/process/mcrop.c:316
+#: modules/process/merge.c:1074
+msgid "Correlating..."
+msgstr "Correlacionando..."
+
+#: modules/process/calcoefs_stage.c:72
+msgid "Digital AFM data recalibration"
+msgstr "Recalibração digital de dados AFM"
+
+#: modules/process/calcoefs_stage.c:86
+msgid "/Cali_bration/_3D Calibration/_Get From Stage map..."
+msgstr "/Ca_libração/Calibração _3D/Obter do mapa de estágio..."
+
+#: modules/process/calcoefs_stage.c:90
+msgid "Stage error mapping"
+msgstr "Estágio de mapeamento de erro"
+
+#: modules/process/calcoefs_stage.c:127
+msgid "Stage Error Map"
+msgstr "Estágio do mapa de erro"
+
+#: modules/process/calcoefs_view.c:236
+msgid "3D calibration/uncertainty"
+msgstr "Calibração 3D/incerteza"
+
+#: modules/process/calcoefs_view.c:250
+msgid "/Cali_bration/_Apply to Data..."
+msgstr "/Cali_bração/_Aplicar nos dados..."
+
+#: modules/process/calcoefs_view.c:254
+msgid "3D calibration and uncertainty"
+msgstr "Calibração 3D e incerteza"
+
+#: modules/process/calcoefs_view.c:318
+msgid "3D Calibration"
+msgstr "Calibração 3D"
+
+#: modules/process/calcoefs_view.c:377
+msgid "No data used."
+msgstr "Nenhum dado usado."
+
+#: modules/process/calcoefs_view.c:397
+msgid "Used calibration data:"
+msgstr "Dados de calibração usado:"
+
+#: modules/process/calcoefs_view.c:414
+msgid "Shown planes:"
+msgstr "Planos mostrados:"
+
+#: modules/process/calcoefs_view.c:420
+msgid "View:"
+msgstr "Visualizar:"
+
+#: modules/process/calcoefs_view.c:435
+msgid "Plane:"
+msgstr "Plano:"
+
+#: modules/process/calcoefs_view.c:454
+msgid "X position:"
+msgstr "Posição X:"
+
+#: modules/process/calcoefs_view.c:461
+msgid "Y position:"
+msgstr "Posição Y:"
+
+#: modules/process/calcoefs_view.c:468
+msgid "Z position:"
+msgstr "Posição Z:"
+
+#: modules/process/calcoefs_view.c:557
+msgid "Crop to actual data"
+msgstr "Cortar para dados reais"
+
+#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:368
+#: modules/process/deposit_synth.c:642 modules/process/edge.c:705
+#: modules/process/fft_filter_1d.c:301 modules/process/grain_edge.c:277
+#: modules/process/grain_filter.c:346 modules/process/grain_mark.c:357
+#: modules/process/mark_with.c:322 modules/process/mfm_field.c:420
+#: modules/process/mfm_shift.c:216 modules/process/polydistort.c:319
+#: modules/process/psf.c:309 modules/process/scars.c:421
+#: modules/process/slope_dist.c:400 modules/process/synth.h:542
+#: modules/volume/volume_extract.c:411 modules/volume/volume_extract.c:491
+#: modules/volume/volume_linestat.c:427
+msgid "I_nstant updates"
+msgstr "Atualizações i_nstantâneas"
+
+#: modules/process/calcoefs_view.c:682
+msgid "Shown part has zero range."
+msgstr "Parte mostrada tem intervalo zero."
+
+#: modules/process/calcoefs_view.c:690
+#, c-format
+msgid "Shown range (%.*f - %.*f) %s"
+msgstr "Intervalo mostrado (%.*f - %.*f) %s"
+
+#: modules/process/calcoefs_view.c:738
+#, c-format
+msgid "%d calibration data"
+msgstr "Dados de calibração %d"
+
+#: modules/process/calcoefs_view.c:742
+#, c-format
+msgid "X span: (%.*f - %.*f) %s"
+msgstr "Espaço X: (%.*f - %.*f) %s"
+
+#: modules/process/calcoefs_view.c:748
+#, c-format
+msgid "Y span: (%.*f - %.*f) %s"
+msgstr "Espaço Y: (%.*f - %.*f) %s"
+
+#: modules/process/calcoefs_view.c:754
+#, c-format
+msgid "Z span: (%.*f - %.*f) %s"
+msgstr "Espaço Z: (%.*f - %.*f) %s"
+
+#: modules/process/calcoefs_view.c:778
+msgid "Error: out of range."
+msgstr "Erro: fora do intervalo."
+
+#: modules/process/calcoefs_view.c:787
+msgid "Building mesh..."
+msgstr "Construindo encaixe..."
+
+#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1867
+msgid "X correction"
+msgstr "Correção X"
+
+#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1868
+msgid "Y correction"
+msgstr "Correção Y"
+
+#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1869
+msgid "Z correction"
+msgstr "Correção Z"
+
+#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1870
+msgid "X uncertainty"
+msgstr "Incerteza em X"
+
+#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1871
+msgid "Y uncertainty"
+msgstr "Incerteza em Y"
+
+#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1872
+msgid "Z uncertainty"
+msgstr "Incerteza em Z"
+
+#: modules/process/calcoefs_view.c:1137
+msgid "Constant X"
+msgstr "X constante"
+
+#: modules/process/calcoefs_view.c:1138
+msgid "Constant Y"
+msgstr "Y constante"
+
+#: modules/process/calcoefs_view.c:1139
+msgid "Constant Z"
+msgstr "Z constante"
+
+#: modules/process/calcoefs_view.c:1150
+msgid "NNA 3D"
+msgstr "NNA 3D"
+
+# Is the word 'planes' the plural form of 'plane' or did you mean 'plans'?
+#
+#: modules/process/calcoefs_view.c:1151
+msgid "Snap to planes"
+msgstr "Atenção aos planos"
+
+#: modules/process/calcoefs_view.c:1152
+msgid "Delaunay"
+msgstr "Delaunay"
+
+#: modules/process/calibrate.c:172
+msgid "Recalibrates scan lateral dimensions or value range."
+msgstr "Recalibra dimensões laterais de escaneamento ou intervalo de valor."
+
+#: modules/process/calibrate.c:186
+msgid "/_Basic Operations/_Dimensions and Units..."
+msgstr "/Operações _básicas/_Dimensões e unidades..."
+
+#: modules/process/calibrate.c:190 modules/volume/volume_calibrate.c:193
+msgid "Change physical dimensions, units or value scale"
+msgstr "Modificar dimensões físicas, unidades ou escala de valor"
+
+#: modules/process/calibrate.c:349 modules/volume/volume_calibrate.c:355
+msgid "Recalibrated Data"
+msgstr "Dados recalibrados"
+
+#: modules/process/calibrate.c:382
+msgid "Dimensions and Units"
+msgstr "Dimensões e unidades"
+
+#: modules/process/calibrate.c:405 modules/volume/volume_calibrate.c:391
+msgid "New Real Dimensions"
+msgstr "Novas dimensões reais"
+
+#: modules/process/calibrate.c:415
+msgid "_Match pixel size:"
+msgstr "Combinar tamanho do pixel:"
+
+#: modules/process/calibrate.c:447 modules/volume/volume_calibrate.c:397
+msgid "_X range:"
+msgstr "Intervalo _X:"
+
+#: modules/process/calibrate.c:467 modules/volume/volume_calibrate.c:417
+msgid "_Y range:"
+msgstr "Intervalo _Y:"
+
+#: modules/process/calibrate.c:472
+msgid "_Square samples"
+msgstr "Amostras quadradas"
+
+#: modules/process/calibrate.c:496 modules/volume/volume_calibrate.c:480
+msgid "Value Range"
+msgstr "Intervalo de valor"
+
+#: modules/process/calibrate.c:502 modules/volume/volume_calibrate.c:437
+msgid "_Z range:"
+msgstr "Intervalo _Z:"
+
+#: modules/process/calibrate.c:524
+msgid "Z shi_ft:"
+msgstr "Deslocamento _Z:"
+
+#: modules/process/calibrate.c:533 modules/volume/volume_calibrate.c:515
+msgid "Calibration Coefficients"
+msgstr "Coeficientes de calibração"
+
+#: modules/process/calibrate.c:538 modules/volume/volume_calibrate.c:520
+msgid "_X calibration factor:"
+msgstr "Fator de calibração _X:"
+
+#: modules/process/calibrate.c:545 modules/volume/volume_calibrate.c:527
+msgid "_Y calibration factor:"
+msgstr "Fator de calibração _Y:"
+
+#: modules/process/calibrate.c:552 modules/volume/volume_calibrate.c:534
+msgid "_Z calibration factor:"
+msgstr "Fator de calibração _Z:"
+
+#: modules/process/calibrate.c:567 modules/process/drift.c:389
+#: modules/process/extend.c:293 modules/tools/crop.c:213
+#, fuzzy
+msgid "Create new image"
+msgstr "Criar um novo item"
+
+#: modules/process/coerce.c:159
+msgid "Transforms surfaces to have prescribed statistical properties."
+msgstr ""
+"Transforma superfícies para ter propriedades estatísticas pré-descritas."
+
+#: modules/process/coerce.c:173
+msgid "/S_ynthetic/Co_erce..."
+msgstr "/Sintético/Forçar..."
+
+#: modules/process/coerce.c:177
+msgid "Enforce prescribed statistical properties"
+msgstr "Impor propriedades estatísticas prescritas"
+
+#: modules/process/coerce.c:214
+msgid "Coerced"
+msgstr "Forçado"
+
+#: modules/process/coerce.c:225 modules/process/coerce.c:326
+#: modules/process/fbm_synth.c:474 modules/process/lno_synth.c:254
+#: modules/process/noise_synth.c:181
+msgid "distribution|Uniform"
+msgstr "distribuição|Uniforme"
+
+#: modules/process/coerce.c:226 modules/process/fbm_synth.c:475
+#: modules/process/lno_synth.c:244 modules/process/noise_synth.c:171
+msgid "distribution|Gaussian"
+msgstr "distribuição|Gaussiana"
+
+#: modules/process/coerce.c:227
+msgid "As another data"
+msgstr "Como outros dados"
+
+#: modules/process/coerce.c:228
+msgid "Discrete levels"
+msgstr "Níveis discretos"
+
+#: modules/process/coerce.c:232
+msgid "Entire image"
+msgstr "Imagem inteira"
+
+#: modules/process/coerce.c:233
+msgid "By row (identically)"
+msgstr "Por linha (identicamente)"
+
+#: modules/process/coerce.c:247
+msgid "Coerce Statistics"
+msgstr "Forçar estatísticas"
+
+#: modules/process/coerce.c:289
+msgid "Coerce value distribution to:"
+msgstr "Forçar distribuição de valores para:"
+
+#: modules/process/coerce.c:315
+msgid "_Template:"
+msgstr "Modelo:"
+
+#: modules/process/coerce.c:328
+msgid "Same area"
+msgstr "Mesma área"
+
+#: modules/process/coerce.c:339
+msgid "Number of _levels:"
+msgstr "Número de níveis:"
+
+#: modules/process/coerce.c:349
+msgid "Data processing:"
+msgstr "Processamento de dados:"
+
+#: modules/process/col_synth.c:172
+msgid "Number of maxima"
+msgstr "Número de máximos"
+
+#: modules/process/col_synth.c:173 modules/tools/linestats.c:178
+#: modules/volume/volume_linestat.c:156
+msgid "Skew"
+msgstr "Assimetria"
+
+#: modules/process/col_synth.c:174 modules/tools/linestats.c:179
+#: modules/tools/roughness.c:387 modules/volume/volume_linestat.c:157
+msgid "Kurtosis"
+msgstr "Curtose"
+
+#: modules/process/col_synth.c:175
+#, fuzzy
+msgid "Autocorrelation length"
+msgstr "Comprimento de _autocorrelação:"
+
+#: modules/process/col_synth.c:194
+msgid "Generates columnar surfaces by a simple growth algorithm."
+msgstr "Gera superfícies colunares por um algorítimo de crescimento simples."
+
+#: modules/process/col_synth.c:208
+#, fuzzy
+msgid "/S_ynthetic/_Deposition/_Columnar..."
+msgstr "/Sintético/_Colunar..."
+
+#: modules/process/col_synth.c:212
+msgid "Generate columnar surface"
+msgstr "Gerar superfície colunar"
+
+#: modules/process/col_synth.c:390
+msgid "Grow Columnar Surface"
+msgstr "Crescer superfície colunar"
+
+#: modules/process/col_synth.c:480
+msgid "Particle Size"
+msgstr "Tamanho da partícula"
+
+#: modules/process/col_synth.c:498
+msgid "Incidence"
+msgstr "Incidência"
+
+#: modules/process/col_synth.c:503
+msgid "Inclination"
+msgstr "Inclinação"
+
+#: modules/process/col_synth.c:509 modules/process/crosscor.c:1036
+msgid "Direction"
+msgstr "Direção"
+
+#: modules/process/col_synth.c:521
+msgid "Relaxation type:"
+msgstr "Tipo de relaxação:"
+
+#: modules/process/col_synth.c:529
+msgid "_Melting:"
+msgstr "Derretido:"
+
+#: modules/process/col_synth.c:613
+msgid "Weak"
+msgstr "Fraco"
+
+#: modules/process/col_synth.c:614
+msgid "Strong"
+msgstr "Forte"
+
+#: modules/process/convolution_filter.c:124
+msgid "symmetry|None"
+msgstr "simetria|Nenhuma"
+
+#: modules/process/convolution_filter.c:125
+msgid "symmetry|Even"
+msgstr "simetria|Par"
+
+#: modules/process/convolution_filter.c:126
+msgid "symmetry|Odd"
+msgstr "simetria|Ímpar"
+
+#: modules/process/convolution_filter.c:132
+msgid "Generic convolution filter with a user-defined matrix."
+msgstr "Filtro de convolução genérico com uma matriz definida pelo usuário."
+
+#: modules/process/convolution_filter.c:157
+msgid "/_Integral Transforms/Con_volution Filter..."
+msgstr "/Transformadas _integrais/Filtro de con_volução..."
+
+#: modules/process/convolution_filter.c:161
+msgid "General convolution filter"
+msgstr "Filtro de convolução geral"
+
+#: modules/process/convolution_filter.c:233
+msgid "Convolution Filter"
+msgstr "Filtro de convolução"
+
+#: modules/process/convolution_filter.c:269 modules/tools/filter.c:171
+#: modules/tools/filter.c:275
+msgid "Filter"
+msgstr "Filtro"
+
+#: modules/process/convolution_filter.c:366
+msgid "Coefficient Matrix"
+msgstr "Matriz de coeficientes"
+
+#: modules/process/convolution_filter.c:386
+msgid "_Divisor:"
+msgstr "_Divisor:"
+
+#: modules/process/convolution_filter.c:391
+msgid "_automatic"
+msgstr "_automático"
+
+#: modules/process/convolution_filter.c:401
+msgid "Symmetry"
+msgstr "Simetria"
+
+#: modules/process/convolution_filter.c:561
+msgid "HSym"
+msgstr "HSym"
+
+#: modules/process/convolution_filter.c:571
+msgid "VSym"
+msgstr "VSym"
+
+#: modules/process/correct_affine.c:220
+msgid ""
+"Corrects affine distortion of images by matching image Bravais lattice to "
+"the true one."
+msgstr ""
+"Corrige distorções afins de imagens combinando imagens da rede de Bravais "
+"para as verdadeiras."
+
+#: modules/process/correct_affine.c:235
+msgid "/_Distortion/_Affine..."
+msgstr "/_Distorção/_Afim..."
+
+#: modules/process/correct_affine.c:239
+msgid "Correct affine distortion"
+msgstr "Corrigir distorções afins"
+
+#: modules/process/correct_affine.c:309 modules/process/correct_affine.c:634
+msgid "Corrected"
+msgstr "Corrigido"
+
+#: modules/process/correct_affine.c:343
+msgid "Affine Correction"
+msgstr "Correção afim"
+
+#: modules/process/correct_affine.c:349 modules/process/measure_lattice.c:249
+msgid "_Refine"
+msgstr "_Refinar"
+
+#: modules/process/correct_affine.c:399 modules/process/fft_filter_2d.c:530
+msgid "Preview Options"
+msgstr "Pré-visualizar opções"
+
+#: modules/process/correct_affine.c:404 modules/process/fft_filter_2d.c:535
+#: modules/process/measure_lattice.c:311
+msgid "Display:"
+msgstr "Exibir:"
+
+#: modules/process/correct_affine.c:412 modules/process/measure_lattice.c:319
+#: modules/tools/grainremover.c:109
+msgid "_Data"
+msgstr "_Dados"
+
+#: modules/process/correct_affine.c:413
+msgid "2D _ACF"
+msgstr "_ACF 2D"
+
+#: modules/process/correct_affine.c:414 modules/process/drift.c:364
+msgid "Correc_ted data"
+msgstr "Dados corrigidos"
+
+#: modules/process/correct_affine.c:425
+msgid "ACF zoom:"
+msgstr "Zoom ACF:"
+
+#: modules/process/correct_affine.c:442 modules/process/measure_lattice.c:346
+#, fuzzy
+msgid "Interpolate _horizontal ACF"
+msgstr "Interpolação"
+
+#: modules/process/correct_affine.c:452 modules/process/measure_lattice.c:372
+msgid "Lattice Vectors"
+msgstr "Vetores da rede"
+
+#. TRANSLATORS: Correct is an adjective here.
+#: modules/process/correct_affine.c:469
+msgid "Correct Lattice"
+msgstr "Corrigir rede"
+
+#: modules/process/correct_affine.c:473
+msgid "_Lattice type:"
+msgstr "Tipo de rede:"
+
+#: modules/process/correct_affine.c:480
+msgid "User defined"
+msgstr "Definido pelo usuário"
+
+#: modules/process/correct_affine.c:495
+msgid "_Different lengths"
+msgstr "Comprimentos _diferentes"
+
+#: modules/process/correct_affine.c:524
+msgid "Image for _ACF:"
+msgstr "Imagem para _ACF:"
+
+#: modules/process/correct_affine.c:551
+msgid "_Scaling:"
+msgstr "E_scalando:"
+
+#: modules/process/correct_affine.c:558
+msgid "Exactly as specified"
+msgstr "Exatamente como especificado"
+
+#: modules/process/correct_affine.c:560
+msgid "Preserve area"
+msgstr "Preservar área"
+
+#: modules/process/correct_affine.c:562
+msgid "Preserve X scale"
+msgstr "Preservar escala X"
+
+#: modules/process/correct_affine.c:571 modules/process/drift.c:379
+msgid "_Apply to all compatible images"
+msgstr ""
+
+#: modules/process/correct_affine.c:693 modules/process/measure_lattice.c:482
+msgid "length"
+msgstr "comprimento"
+
+#: modules/process/correct_affine.c:700 modules/process/measure_lattice.c:489
+msgid "angle"
+msgstr "ângulo"
+
+#: modules/process/crosscor.c:157
+msgid "Calculates cross-correlation of two data fields."
+msgstr "Calcula correlação cruzada de dois campos de dados."
+
+#: modules/process/crosscor.c:171
+msgid "/M_ultidata/_Cross-Correlation..."
+msgstr "/M_ultidados/_Correlação cruzada..."
+
+#: modules/process/crosscor.c:175
+msgid "Cross-correlate two data fields"
+msgstr "Fazer correlação cruzada de dois campos de dados."
+
+#: modules/process/crosscor.c:214
+msgid "Cross-Correlation"
+msgstr "Correlação cruzada"
+
+#: modules/process/crosscor.c:238
+msgid "Co_rrelate with:"
+msgstr "Co_rrelacionar com:"
+
+#: modules/process/crosscor.c:244
+msgid "Search size"
+msgstr "Procurar tamanho"
+
+#: modules/process/crosscor.c:267
+msgid "_Guess"
+msgstr "Tentar"
+
+#: modules/process/crosscor.c:268
+msgid "Global offset of 2nd channel"
+msgstr "Afastamento global do 2° canal"
+
+#: modules/process/crosscor.c:292
+msgid "Window size"
+msgstr "Tamanho da janela"
+
+#: modules/process/crosscor.c:300
+msgid "W_idth:"
+msgstr "Largura:"
+
+#: modules/process/crosscor.c:308
+msgid "Hei_ght:"
+msgstr "Altura:"
+
+#: modules/process/crosscor.c:319 modules/process/fft.c:403
+#: modules/process/psdf_logphi.c:268
+msgid "_Windowing type:"
+msgstr "Tipo de janelamento:"
+
+#: modules/process/crosscor.c:327
+msgid "All"
+msgstr "Todos"
+
+#: modules/process/crosscor.c:328
+msgid "Absolute"
+msgstr "Absoluto"
+
+#: modules/process/crosscor.c:329
+msgid "X Distance"
+msgstr "Distância X"
+
+#: modules/process/crosscor.c:330
+msgid "Y Distance"
+msgstr "Distância Y"
+
+#: modules/process/crosscor.c:332 modules/process/crosscor.c:1050
+msgid "Score"
+msgstr "Pontuação"
+
+#: modules/process/crosscor.c:334 modules/process/fft.c:393
+#: modules/process/fit-shape.c:699 modules/process/maskcor.c:177
+#: modules/process/mfm_current.c:455 modules/process/mfm_field.c:373
+#: modules/process/mfm_parallel.c:466
+msgid "Output _type:"
+msgstr "_Tipo de saída:"
+
+#: modules/process/crosscor.c:340
+msgid "Add _low score results mask"
+msgstr "Adicionar máscara de resultados de baixa pontuação"
+
+#: modules/process/crosscor.c:351 modules/process/grain_wshed.c:225
+#: modules/process/maskcor.c:191
+msgid "T_hreshold:"
+msgstr "Limiar:"
+
+#: modules/process/crosscor.c:359
+msgid "Multichannel cross-corelation"
+msgstr "Correlação cruzada de multicanal"
+
+#: modules/process/crosscor.c:378
+msgid "Second _source data:"
+msgstr "Segunda fonte de dados:"
+
+#: modules/process/crosscor.c:394
+msgid "Correlate with:"
+msgstr "Correlacionar com:"
+
+#: modules/process/crosscor.c:402
+msgid "Postprocess:"
+msgstr "Pós-processamento:"
+
+#: modules/process/crosscor.c:411
+#, fuzzy
+msgid "Apply Ga_ussian filter of width:"
+msgstr "Aplicar filtro ga_ussiano de largura:"
+
+#: modules/process/crosscor.c:424
+msgid "Extend results to borders"
+msgstr "Estender resultados para bordas"
+
+#: modules/process/crosscor.c:433
+msgid "Create corrected data from 2nd channel"
+msgstr "Criar dados corrigidos a partir do 2° canal"
+
+#: modules/process/crosscor.c:833
+msgid "Correlating first set..."
+msgstr "Correlacionando primeiro conjunto..."
+
+#: modules/process/crosscor.c:865
+msgid "Correlating second set..."
+msgstr "Correlacionando segundo conjunto..."
+
+#: modules/process/crosscor.c:972
+msgid "Corrected 2nd channel"
+msgstr "2° canal corrigido"
+
+#: modules/process/crosscor.c:996
+msgid "X difference"
+msgstr "Diferença X"
+
+#: modules/process/crosscor.c:1010
+msgid "Y difference"
+msgstr "Diferença Y"
+
+#: modules/process/crosscor.c:1023
+msgid "Absolute difference"
+msgstr "Diferença absoluta"
+
+#: modules/process/curvature.c:130
+msgid "Center value"
+msgstr "Valor central"
+
+#: modules/process/curvature.c:131
+msgid "Curvature radius 1"
+msgstr "Raio de curvatura 1"
+
+#: modules/process/curvature.c:132
+msgid "Curvature radius 2"
+msgstr "Raio de curvatura 2"
+
+#: modules/process/curvature.c:133
+msgid "Direction 1"
+msgstr "Direção 1"
+
+#: modules/process/curvature.c:134
+msgid "Direction 2"
+msgstr "Direção 2"
+
+#: modules/process/curvature.c:162
+msgid "Calculates overall curvature."
+msgstr "Calcula curvatura total."
+
+#: modules/process/curvature.c:176
+msgid "/_Level/_Curvature..."
+msgstr "/Nive_lar/_Curvatura..."
+
+#: modules/process/curvature.c:180
+msgid "Calculate overall curvature"
+msgstr "Calcular curvatura total"
+
+#: modules/process/curvature.c:210 modules/process/facet-level.c:118
+#: modules/process/semsim.c:165
+#, c-format
+msgid "%s: Lateral dimensions and value must be the same physical quantity."
+msgstr ""
+"%s: Dimensões laterais e valores devem ser as mesmas quantidades físicas."
+
+#: modules/process/curvature.c:447
+msgid "Curvature Sections"
+msgstr "Secções de curvatura"
+
+#: modules/process/curvature.c:655
+msgid "Output Type"
+msgstr "Tipo de saída"
+
+#: modules/process/curvature.c:662
+msgid "_Set selection"
+msgstr "Definir _seleção"
+
+#: modules/process/curvature.c:672
+msgid "_Plot graph"
+msgstr "_Plotar gráfico"
+
+#: modules/process/curvature.c:684 modules/process/drift.c:340
+#: modules/process/fft_profile.c:300 modules/process/fractal.c:308
+#: modules/process/grain_cross.c:260 modules/process/linematch.c:855
+#: modules/process/slope_dist.c:347 modules/tools/linestats.c:424
+#: modules/tools/profile.c:559 modules/tools/roughness.c:886
+#: modules/tools/sfunctions.c:488 modules/tools/spectro.c:391
+#: modules/volume/volume_slice.c:408
+msgid "New graph"
+msgstr "Novo gráfico"
+
+#: modules/process/curvature.c:689 modules/process/drift.c:345
+#: modules/process/fft_profile.c:306 modules/process/fractal.c:313
+#: modules/process/grain_cross.c:254 modules/process/linematch.c:860
+#: modules/process/slope_dist.c:352 modules/tools/linestats.c:418
+#: modules/tools/profile.c:563 modules/tools/roughness.c:890
+#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:385
+#: modules/volume/volume_slice.c:400
+msgid "Target _graph:"
+msgstr "_Gráfico alvo:"
+
+#: modules/process/curvature.c:949
+msgid "Axes are outside the image."
+msgstr "Eixos estão fora da imagem."
+
+#: modules/process/curvature.c:1016
+msgid "Save Curvature"
+msgstr "Salvar curvatura"
+
+#: modules/process/cwt.c:66
+msgid "Two-dimensional CWT (Continuous Wavelet Transform)."
+msgstr "CWT (Continuous Wavelet Transform) bidimensional."
+
+#: modules/process/cwt.c:80
+msgid "/_Integral Transforms/2D _CWT..."
+msgstr "/Transformadas _integrais/ _CWT 2D..."
+
+#: modules/process/cwt.c:84
+msgid "Compute continuous wavelet transform"
+msgstr "Calcular transformada de ondulação (wavelet) contínua"
+
+#: modules/process/cwt.c:123
+msgid "CWT"
+msgstr "CWT"
+
+#: modules/process/cwt.c:134
+msgid "2D CWT"
+msgstr "CWT 2D"
+
+#: modules/process/cwt.c:159 modules/process/dwt.c:185
+#: modules/process/dwtanisotropy.c:212
+msgid "_Wavelet type:"
+msgstr "Tipo de ondulação (_wavelet):"
+
+#: modules/process/deposit_synth.c:170
+msgid "Generates particles using simple dynamical model"
+msgstr "Gera partículas usando modelo dinâmico simples"
+
+#: modules/process/deposit_synth.c:184
+#, fuzzy
+msgid "/S_ynthetic/_Deposition/_Particles..."
+msgstr "/Sintético/_Partículas..."
+
+#: modules/process/deposit_synth.c:188
+msgid "Generate particles using dynamical model"
+msgstr "Gera partículas usando modelo dinâmico"
+
+#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:866
+#, c-format
+msgid ""
+"Not all the particles could be deposited (%u),\n"
+"try more revise steps."
+msgstr ""
+"Nem todas as partículas puderam ser depositadas (%u),\n"
+"tentar mais passos revisados."
+
+#: modules/process/deposit_synth.c:348
+msgid "Particle Generation"
+msgstr "Geração de partícula"
+
+#: modules/process/deposit_synth.c:431
+msgid "Particle r_adius:"
+msgstr "R_aio da partícula"
+
+#: modules/process/deposit_synth.c:443
+msgid "Distribution _width:"
+msgstr "Largura da distribuição:"
+
+#: modules/process/deposit_synth.c:462
+msgid "_Relax steps:"
+msgstr "_Relaxar passos:"
+
+#: modules/process/deposit_synth.c:660 modules/process/synth.h:577
+msgid "R_andom seed:"
+msgstr "Semente _aleatória:"
+
+#: modules/process/deposit_synth.c:666 modules/process/synth.h:583
+msgid "seed|_New"
+msgstr "semente|_Nova"
+
+#: modules/process/deposit_synth.c:677
+msgid "Randomize"
+msgstr "Embaralhar"
+
+#: modules/process/deposit_synth.c:859 modules/process/domain_synth.c:919
+msgid "Running computation..."
+msgstr "Executando cálculos..."
+
+#: modules/process/deposit_synth.c:864
+#, c-format
+msgid "%d particles were deposited"
+msgstr "%d partículas foram depositadas"
+
+#: modules/process/deposit_synth.c:1092
+msgid "Initial particle set..."
+msgstr "Conjunto inicial de partículas..."
+
+#: modules/process/deposit_synth.c:1251
+msgid "Running revise..."
+msgstr "Executando revisão..."
+
+#: modules/process/deposit_synth.c:1379
+msgid "Error: too many particles."
+msgstr "Erro: partículas demais."
+
+#: modules/process/deposit_synth.c:1381
+msgid "Error: no particles."
+msgstr "Erro: nenhuma partícula."
+
+#: modules/process/deposit_synth.c:1383
+msgid "Error: particles too large."
+msgstr "Erro: partículas muito grandes."
+
+#: modules/process/deposit_synth.c:1385
+msgid "Error: particles too small."
+msgstr "Erro: partículas muito pequenas."
+
+#: modules/process/diff_synth.c:197 modules/tools/linestats.c:173
+#: modules/volume/volume_linestat.c:151
+msgid "Variation"
+msgstr "Variação"
+
+#: modules/process/diff_synth.c:198
+msgid "Number of islands"
+msgstr "Número de ilhas"
+
+#: modules/process/diff_synth.c:214
+msgid "Generates surfaces by diffusion limited aggregation."
+msgstr "Gera superfícies por agregação limitada de difusão."
+
+#: modules/process/diff_synth.c:228
+#, fuzzy
+msgid "/S_ynthetic/_Deposition/_Diffusion..."
+msgstr "/Sintético/_Difusão..."
+
+#: modules/process/diff_synth.c:232
+msgid "Generate surface by diffusion limited aggregation"
+msgstr "Gera superfície por agregação limitada de difusão"
+
+#: modules/process/diff_synth.c:409
+msgid "Diffusion Limited Aggregation"
+msgstr "Agregação limitada de difusão"
+
+#: modules/process/diff_synth.c:500
+msgid "_Flux:"
+msgstr "_Fluxo:"
+
+#: modules/process/diff_synth.c:521
+msgid "Probabilities"
+msgstr "Probabilidades"
+
+#: modules/process/diff_synth.c:529
+msgid "_Sticking:"
+msgstr "Colando:"
+
+#: modules/process/diff_synth.c:538
+msgid "_Activation:"
+msgstr "_Ativação:"
+
+#: modules/process/diff_synth.c:547
+msgid "Passing Sch_woebel:"
+msgstr "Passando Sch_woebel:"
+
+#: modules/process/dimensions.h:439
+msgid "S_quare image"
+msgstr "Imagem _quadrada"
+
+#: modules/process/dimensions.h:473
+msgid "_Dimension units:"
+msgstr "Unidades de _dimensão:"
+
+#: modules/process/dimensions.h:488
+#, fuzzy
+msgid "Current Image"
+msgstr "Canal atual"
+
+#: modules/process/dimensions.h:492
+#, fuzzy
+msgid "_Take Dimensions from Current Image"
+msgstr "Ob_ter dimensões a partir do canal atual"
+
+#: modules/process/dimensions.h:501
+#, fuzzy
+msgid "_Replace the current image"
+msgstr "Substituir o canal atual"
+
+#: modules/process/dimensions.h:510
+#, fuzzy
+msgid "_Start from the current image"
+msgstr "Iniciar a partir do canal atual"
+
+#: modules/process/domain_synth.c:158
+msgid "Discrete state"
+msgstr "Estado discreto"
+
+#: modules/process/domain_synth.c:159
+msgid "Continuous inhibitor"
+msgstr "Inibidor contínuo"
+
+#: modules/process/domain_synth.c:165
+msgid "Generates domain images using a hybrid Ising model."
+msgstr "Gera imagens de domínio usando um modelo Ising híbrido."
+
+#: modules/process/domain_synth.c:179
+msgid "/S_ynthetic/_Domains..."
+msgstr "/Sintético/_Domínios..."
+
+#: modules/process/domain_synth.c:183
+msgid "Generate image with domains"
+msgstr "Gerar imagem com domínios"
+
+#: modules/process/domain_synth.c:352
+msgid "Domains"
+msgstr "Domínios"
+
+#: modules/process/domain_synth.c:442
+msgid "_Preview quantity:"
+msgstr "_Pré-visualizar quantidade:"
+
+#: modules/process/domain_synth.c:449
+msgid "Simulation Parameters"
+msgstr "Parâmetros de simulação"
+
+#: modules/process/domain_synth.c:455
+msgid "_Number of iterations:"
+msgstr "_Número de interações:"
+
+#: modules/process/domain_synth.c:463
+msgid "_Temperature:"
+msgstr "_Temperatura:"
+
+#: modules/process/domain_synth.c:471
+msgid "_Inhibitor strength:"
+msgstr "Força do _inibidor:"
+
+#: modules/process/domain_synth.c:479
+msgid "In_hibitor coupling:"
+msgstr "Acoplamento do inibidor:"
+
+#: modules/process/domain_synth.c:487
+msgid "_Bias:"
+msgstr "_Bias:"
+
+#: modules/process/domain_synth.c:495
+msgid "_Monte Carlo time step:"
+msgstr "Passo de tempo _Monte Carlo:"
+
+#: modules/process/domain_synth.c:504 modules/process/fft_filter_2d.c:586
+#: modules/volume/volume_slice.c:366
+msgid "Output Options"
+msgstr "Opções de saída"
+
+#: modules/process/domain_synth.c:523 modules/process/fft_filter_2d.c:591
+#: modules/process/mask_edt.c:211 modules/process/slope_dist.c:323
+#: modules/volume/volume_linestat.c:437 modules/volume/volume_slice.c:386
+msgid "Output type:"
+msgstr "Tipo de saída:"
+
+#: modules/process/drift.c:175
+msgid "Evaluates and/or correct thermal drift in fast scan axis."
+msgstr "Calcula e/ou corrige deriva térmica em escaneamento rápido de eixo."
+
+#: modules/process/drift.c:189
+msgid "/_Distortion/Compensate _Drift..."
+msgstr "/_Distorção/Compensar _deriva..."
+
+#: modules/process/drift.c:193
+msgid "Evaluate/correct thermal drift in fast scan axis"
+msgstr "Calcula/corrige deriva térmica em escaneamento rápido de eixo"
+
+#: modules/process/drift.c:240
+msgid "Compensate Drift"
+msgstr "Compensar deriva"
+
+#: modules/process/drift.c:287
+msgid "_Search range:"
+msgstr "Intervalo de busca:"
+
+#: modules/process/drift.c:287
+msgid "rows"
+msgstr "linhas"
+
+#: modules/process/drift.c:305
+msgid "Correct _data"
+msgstr "Corrigir _dados"
+
+#: modules/process/drift.c:315
+msgid "_Exclude linear skew"
+msgstr "_Excluir assimetria linear"
+
+#: modules/process/drift.c:325
+msgid "Plot drift _graph"
+msgstr "Plotar _gráfico de deriva"
+
+#: modules/process/drift.c:355 modules/process/fit-shape.c:705
+#: modules/process/neural.c:552 modules/process/polydistort.c:278
+msgid "Preview:"
+msgstr "Pré-visualizar:"
+
+#: modules/process/drift.c:365
+msgid "Drift _lines"
+msgstr "_Linhas de deriva"
+
+#: modules/process/drift.c:373 modules/process/facet_analysis.c:390
+#: modules/process/grain_edge.c:272 modules/process/grain_filter.c:356
+#: modules/process/grain_mark.c:341 modules/process/grain_wshed.c:271
+#: modules/process/mark_disconn.c:298 modules/process/scars.c:405
+#: modules/process/wpour_mark.c:369
+msgid "_Mask color:"
+msgstr "Cor da _máscara:"
+
+#: modules/process/drift.c:570
+msgid "Drift-corrected"
+msgstr "Com correção de deriva"
+
+#: modules/process/drift.c:614
+msgid "Drift"
+msgstr "Deriva"
+
+#: modules/process/drift.c:615 modules/xyz/xyz_drift.c:392
+#: modules/xyz/xyz_drift.c:411 modules/xyz/xyz_drift.c:430
+msgid "drift"
+msgstr "deriva"
+
+#: modules/process/drift.c:621 modules/xyz/xyz_drift.c:402
+msgid "x-axis drift"
+msgstr "Deriva do eixo x"
+
+#: modules/process/dwt.c:73
+msgid "Two-dimensional DWT (Discrete Wavelet Transform)."
+msgstr "DWT (Discrete Wavelet Transform) bidimensional."
+
+#: modules/process/dwt.c:87
+msgid "/_Integral Transforms/2D _DWT..."
+msgstr "/Transformadas _integrais/_DWT 2D..."
+
+#: modules/process/dwt.c:91
+msgid "Compute Discrete Wavelet Transform"
+msgstr "Calcular transformada  de ondulação (wavelet) discreta"
+
+#: modules/process/dwt.c:120 modules/process/dwtanisotropy.c:132
+#, c-format
+msgid "%s: Data must be square."
+msgstr "%s: Dados devem ser quadrados."
+
+#: modules/process/dwt.c:147
+msgid "DWT"
+msgstr "DWT"
+
+#: modules/process/dwt.c:165
+msgid "2D DWT"
+msgstr "DWT 2D"
+
+#: modules/process/dwt.c:191
+#, c-format
+msgid ""
+"Size %d is not a power of 2,\n"
+"data will be resampled to %d×%d for DWT."
+msgstr ""
+"O tamanho %d não é uma potência de 2,\n"
+"dados serão re-amostrados para %d×%d para DWT."
+
+#: modules/process/dwtanisotropy.c:80
+msgid "2D DWT anisotropy detection based on X/Y components ratio."
+msgstr "Detecção de anisotropia DWT 2D com base em razão de componentes X/Y."
+
+#: modules/process/dwtanisotropy.c:94
+msgid "/_Integral Transforms/DWT _Anisotropy..."
+msgstr "/Transformadas _integrais/_Anisotropia DWT..."
+
+#: modules/process/dwtanisotropy.c:98
+msgid "DWT anisotropy detection"
+msgstr "Detecção de anisotropia DWT"
+
+#: modules/process/dwtanisotropy.c:132
+msgid "DWT Anisotropy"
+msgstr "Anisotropia DWT"
+
+#: modules/process/dwtanisotropy.c:183
+msgid "2D DWT Anisotropy"
+msgstr "Anisotropia DWT 2D"
+
+#: modules/process/dwtanisotropy.c:218
+msgid "X/Y ratio threshold:"
+msgstr "Limiar da razão X/Y:"
+
+#: modules/process/dwtanisotropy.c:226
+msgid "Low level exclude limit:"
+msgstr "Limite de exclusão de baixo nível:"
+
+#: modules/process/edge.c:143
+msgid ""
+"Several edge detection methods (Laplacian of Gaussian, Canny, and some "
+"experimental), creates presentation."
+msgstr ""
+"Vários métodos de detecção de borda (Laplaciano de Gaussiana, Canny, e algum "
+"experimental), cria apresentação."
+
+#: modules/process/edge.c:158
+msgid "/_Presentation/_Edge Detection/_Laplacian of Gaussian"
+msgstr "/A_presentação/Detecção de borda/_Laplaciano de Gaussiana"
+
+#: modules/process/edge.c:162
+msgid "Laplacian of Gaussian step detection presentation"
+msgstr "Apresentação de detecção de etapa Laplaciano de Gaussiana"
+
+#: modules/process/edge.c:166
+msgid "/_Presentation/_Edge Detection/_Canny"
+msgstr "/A_presentação/Detecção de borda/_Canny"
+
+#: modules/process/edge.c:170
+msgid "Canny edge detection presentation"
+msgstr "Apresentação de detecção de detecção de borda Canny"
+
+#: modules/process/edge.c:173
+msgid "/_Presentation/_Edge Detection/_RMS"
+msgstr "/A_presentação/Detecção de borda/_RMS"
+
+#: modules/process/edge.c:177
+msgid "Local RMS value based step detection presentation"
+msgstr "Apresentação de detecção de etapa baseada em valor RMS local"
+
+#: modules/process/edge.c:181
+msgid "/_Presentation/_Edge Detection/RMS _Edge"
+msgstr "/A_presentação/Detecção de borda/Borda RMS"
+
+#: modules/process/edge.c:185
+msgid "Local RMS value based step detection with postprocessing"
+msgstr "Detecção de etapa baseada em valor RMS local com pós-processamento"
+
+#: modules/process/edge.c:189
+msgid "/_Presentation/_Edge Detection/Local _Nonlinearity"
+msgstr "/A_presentação/Detecção de borda/_Não-linearidade local"
+
+#: modules/process/edge.c:193
+msgid "Local nonlinearity based edge detection presentation"
+msgstr "Apresentação de detecção de etapa baseada em não-linearidade local"
+
+#: modules/process/edge.c:197
+msgid "/_Presentation/_Edge Detection/_Hough Lines"
+msgstr "/A_presentação/Detecção de borda/Linhas jarretadas"
+
+#: modules/process/edge.c:202
+msgid "Hough lines presentation"
+msgstr "Apresentação de linhas jarretadas"
+
+#: modules/process/edge.c:205
+msgid "/_Presentation/_Edge Detection/_Harris Corner"
+msgstr "/A_presentação/Detecção de borda/Canto _Harris"
+
+#: modules/process/edge.c:210
+msgid "Harris corner presentation"
+msgstr "Apresentação de canto Harris"
+
+#: modules/process/edge.c:213
+msgid "/_Presentation/_Edge Detection/_Inclination"
+msgstr "/A_presentação/Detecção de borda/_Inclinação"
+
+#: modules/process/edge.c:217
+msgid "Local inclination visualization presentation"
+msgstr "Apresentação de visualização de inclinação local"
+
+#: modules/process/edge.c:221
+msgid "/_Presentation/_Edge Detection/_Step"
+msgstr "/A_presentação/Detecção de borda/Pa_sso"
+
+#: modules/process/edge.c:225
+msgid "Fine step detection presentation"
+msgstr "Apresentação de detecção de passo preciso"
+
+#: modules/process/edge.c:228
+msgid "/_Presentation/_Edge Detection/_Sobel"
+msgstr "/A_presentação/Detecção de borda/_Sobel"
+
+#: modules/process/edge.c:232
+msgid "Sobel edge presentation"
+msgstr "Apresentação de borda Sobel"
+
+#: modules/process/edge.c:235
+msgid "/_Presentation/_Edge Detection/_Prewitt"
+msgstr "/A_presentação/Detecção de borda/_Prewitt"
+
+#: modules/process/edge.c:239
+msgid "Prewitt edge presentation"
+msgstr "Apresentação de borda Prewitt"
+
+#: modules/process/edge.c:242
+msgid "/_Presentation/_Edge Detection/_Zero Crossing..."
+msgstr "/A_presentação/Detecção de borda/Cruzamento _zero..."
+
+#: modules/process/edge.c:246
+msgid "Zero crossing step detection presentation"
+msgstr "Apresentação de detecção de passo de cruzamento zero"
+
+#: modules/process/edge.c:249
+msgid "/_Integral Transforms/Local Slope"
+msgstr "/Transformadas _integrais/Inclinação local"
+
+#: modules/process/edge.c:253
+msgid "First derivative slope transformation"
+msgstr "Transformação de inclinação de primeira derivada"
+
+#: modules/process/edge.c:584
+msgid "Slope map"
+msgstr "Mapa de inclinação"
+
+#: modules/process/edge.c:632
+msgid "Zero Crossing Step Detection"
+msgstr "Detecção de passo de cruzamento zero"
+
+#: modules/process/edge.c:672
+msgid "_Gaussian FWHM:"
+msgstr "FWHM  (largura à meia altura) _gaussiana:"
+
+#: modules/process/edge.c:681 modules/process/mark_disconn.c:272
+msgid "_Threshold:"
+msgstr "Limiar:"
+
+#: modules/process/edge.c:681
+msgid "NRMS"
+msgstr "NRMS"
+
+#: modules/process/edge.c:688
+msgid "verb|Display"
+msgstr "Exibir"
+
+#: modules/process/edge.c:697 modules/process/fft_filter_2d.c:372
+msgid "Original _image"
+msgstr "_Imagem original"
+
+#: modules/process/edge.c:698
+msgid "_LoG convolved"
+msgstr "Convoluído _LoG"
+
+#: modules/process/edge.c:699
+msgid "Detected st_ep"
+msgstr "Passo detectado"
+
+#: modules/process/entropy.c:112
+msgid "Visualizes entropy calculation for value and slope distribution."
+msgstr "Visualiza cálculo de entropia para distribuição de valor e inclinação."
+
+#: modules/process/entropy.c:126
+msgid "/_Statistics/_Entropy..."
+msgstr "/E_statísticas/_Entropia..."
+
+#: modules/process/entropy.c:130
+msgid "Calculate entropy of value and slope distributions"
+msgstr "Calcular entropia de distribuição de valor e inclinação"
+
+#: modules/process/entropy.c:175
+msgid "Entropy"
+msgstr "Entropia"
+
+#: modules/process/entropy.c:203
+msgid "Value distribution"
+msgstr "Distribuição de valores"
+
+#: modules/process/entropy.c:205
+msgid "Slope derivative distribution"
+msgstr "Distribuição de derivadas de inclinação"
+
+#: modules/process/entropy.c:207
+msgid "Slope angle distribution"
+msgstr "Distribuição de ângulos de inclinação"
+
+#: modules/process/entropy.c:250
+msgid "_Zoom graph around estimate"
+msgstr "Aproximar _zoom em torno da estimativa"
+
+#: modules/process/entropy.c:259 modules/tools/stats.c:215
+msgid "Entropy:"
+msgstr "Entropia:"
+
+#: modules/process/entropy.c:270 modules/tools/stats.c:216
+msgid "Entropy deficit:"
+msgstr "Déficit de entropia:"
+
+#: modules/process/entropy.c:568
+msgid "Entropy at scales"
+msgstr "Entropia em escalas"
+
+#: modules/process/entropy.c:587
+msgid "Best estimate"
+msgstr "Melhor estimativa"
+
+#: modules/process/extend.c:107
+msgid "Extends image by adding borders."
+msgstr "Estender imagem adicionando bordas."
+
+#: modules/process/extend.c:121
+msgid "/_Basic Operations/E_xtend..."
+msgstr "/Operações _básicas/Extender..."
+
+#: modules/process/extend.c:125
+msgid "Extend by adding borders"
+msgstr "Estender adicionando bordas"
+
+#: modules/process/extend.c:178
+msgid "Extended"
+msgstr "Estendido"
+
+#: modules/process/extend.c:191
+msgid "Extend"
+msgstr "Estender"
+
+#: modules/process/extend.c:214
+msgid "Borders"
+msgstr "Bordas"
+
+#: modules/process/extend.c:220
+msgid "_Up:"
+msgstr "Cima:"
+
+#: modules/process/extend.c:227
+msgid "_Down:"
+msgstr "Baixo:"
+
+#: modules/process/extend.c:234
+msgid "_Left:"
+msgstr "Esquerda:"
+
+#: modules/process/extend.c:241
+msgid "_Right:"
+msgstr "Direita:"
+
+#: modules/process/extend.c:248
+msgid "Extend _symetrically"
+msgstr "Estender _simetricamente"
+
+#: modules/process/extend.c:268 modules/process/polydistort.c:259
+#: modules/xyz/xyz_raster.c:627
+msgid "exterior|Border"
+msgstr "exterior|Borda"
+
+#: modules/process/extend.c:270 modules/process/polydistort.c:261
+#: modules/xyz/xyz_raster.c:629
+msgid "exterior|Mirror"
+msgstr "exterior|Espelho"
+
+#: modules/process/extend.c:272 modules/process/polydistort.c:263
+#: modules/xyz/xyz_raster.c:631
+msgid "exterior|Periodic"
+msgstr "exterior|Periódico"
+
+#: modules/process/extend.c:275 modules/process/polydistort.c:266
+#: modules/xyz/xyz_raster.c:619
+msgid "_Exterior type:"
+msgstr "Tipo de _exterior:"
+
+#: modules/process/extend.c:283 modules/tools/crop.c:202
+msgid "Keep lateral offsets"
+msgstr "Manter afastamentos laterais"
+
+#: modules/process/extract_path.c:87
+msgid "Extracts coordinates and tangents along a path selection."
+msgstr "Extrai coordenadas e tangentes ao longo do caminho selecionado."
+
+#: modules/process/extract_path.c:101
+msgid "/_Distortion/Extract _Path Selection..."
+msgstr "/_Distorção/Extrair do caminho selecionado..."
+
+#: modules/process/extract_path.c:105
+msgid "Extract path selection data"
+msgstr "Extrair dados do caminho selecionado"
+
+#: modules/process/extract_path.c:159
+msgid "Extract Path Selection"
+msgstr "Extrair do caminho selecionado"
+
+#: modules/process/extract_path.c:176
+msgid "Number of path points:"
+msgstr "Número de pontos do caminho:"
+
+#: modules/process/extract_path.c:183
+msgid "There is no path selection."
+msgstr "Não existe caminho selecionado."
+
+#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:383
+msgid "X position"
+msgstr "Posição X"
+
+#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:389
+msgid "Y position"
+msgstr "Posição Y"
+
+#: modules/process/extract_path.c:197
+msgid "X tangent"
+msgstr "Tangente X"
+
+#: modules/process/extract_path.c:201
+msgid "Y tangent"
+msgstr "Tangente Y"
+
+#: modules/process/extract_path.c:392 modules/process/extract_path.c:404
+#: modules/process/pat_synth.c:1433 modules/tools/distance.c:146
+msgid "Distance"
+msgstr "Distância"
+
+#: modules/process/extract_path.c:403
+msgid "Tangent"
+msgstr "Tangente"
+
+#: modules/process/facet-level.c:65
+msgid ""
+"Automatic facet-orientation based leveling. Levels data to make facets point "
+"up."
+msgstr ""
+"Nivelamento automático baseado em orientação de faceta. Nivela dados para "
+"fazer facetas apontarem para cima."
+
+#: modules/process/facet-level.c:80
+msgid "/_Level/_Facet Level"
+msgstr "/Nive_lar/Nivelar _faceta"
+
+#: modules/process/facet-level.c:84
+msgid "Level data to make facets point upward"
+msgstr "Nivelar dados para fazer facetas apontarem para cima"
+
+#: modules/process/facet-level.c:120 modules/process/facet-level.c:131
+msgid "Facet Level"
+msgstr "Nivelar faceta"
+
+#: modules/process/facet-level.c:144 modules/process/flatten_base.c:251
+msgid "Facet-leveling..."
+msgstr "Nivelamento de faceta..."
+
+#: modules/process/facet_analysis.c:164
+msgid "Visualizes, marks and measures facet orientation."
+msgstr "Visualiza, marca e mede orientação de faceta."
+
+#: modules/process/facet_analysis.c:178
+msgid "/_Statistics/Facet _Analysis..."
+msgstr "/E_statísticas/_Análise de faceta..."
+
+#: modules/process/facet_analysis.c:182
+msgid "Mark areas by 2D slope"
+msgstr "Marcar áreas por inclinação 2D"
+
+#: modules/process/facet_analysis.c:270
+msgid "Mark Facets"
+msgstr "Marca de facetas"
+
+#: modules/process/facet_analysis.c:273
+msgid "verb|_Mark"
+msgstr "_Marcar"
+
+#. TRANSLATORS: The direction or line orthogonal to something.
+#: modules/process/facet_analysis.c:329
+msgid "Normal"
+msgstr "Normal"
+
+#: modules/process/facet_analysis.c:337
+msgid "_Find Maximum"
+msgstr "Encontrar máximo"
+
+#: modules/process/facet_analysis.c:345
+msgid "Mean Normal"
+msgstr "Média normal"
+
+#: modules/process/facet_analysis.c:362
+msgid "Facet plane size:"
+msgstr "Tamanho do plano da faceta:"
+
+#: modules/process/facet_analysis.c:370
+msgid "_Tolerance:"
+msgstr "_Tolerância:"
+
+#: modules/process/facet_analysis.c:398
+msgid ""
+"Warning: Lateral and value units differ. Angles are not physically "
+"meaningful."
+msgstr ""
+"Alerta: Lateral e unidades de valor diferem. Ângulos não tem significado "
+"físico."
+
+#: modules/process/fbm_synth.c:162
+msgid "Generates random surfaces similar to fractional Brownian motion."
+msgstr ""
+"Gera superfícies aleatórias similares a movimento browniano fracionário."
+
+#: modules/process/fbm_synth.c:176
+msgid "/S_ynthetic/_Brownian..."
+msgstr "/Sintético/_Browniano..."
+
+#: modules/process/fbm_synth.c:180
+msgid "Generate fractional Brownian motion-like surface"
+msgstr "Gera superfície parecida com movimento browniano fracionário"
+
+#: modules/process/fbm_synth.c:301
+msgid "Fractional Brownian Motion"
+msgstr "Movimento browniano fracionário"
+
+#: modules/process/fbm_synth.c:375
+msgid "_Hurst exponent:"
+msgstr "Expoente de _Hurst:"
+
+#: modules/process/fbm_synth.c:383
+msgid "_Stationarity scale:"
+msgstr "Escala estacionária:"
+
+#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:507
+#: modules/process/noise_synth.c:407
+msgid "_Distribution:"
+msgstr "_Distribuição:"
+
+#: modules/process/fbm_synth.c:396 modules/process/fft_synth.c:526
+msgid "Po_wer:"
+msgstr "Potência:"
+
+#: modules/process/fbm_synth.c:407 modules/process/fft_synth.c:414
+#: modules/process/lno_synth.c:531 modules/process/noise_synth.c:431
+msgid "_RMS:"
+msgstr "_RMS:"
+
+#: modules/process/fbm_synth.c:476 modules/process/lno_synth.c:249
+#: modules/process/noise_synth.c:176
+msgid "distribution|Exponential"
+msgstr "distribuição|Exponencial"
+
+#: modules/process/fbm_synth.c:477
+msgid "distribution|Power"
+msgstr "distribuição|Potência"
+
+#: modules/process/fft.c:125
+msgid "Two-dimensional FFT (Fast Fourier Transform)."
+msgstr "FFT (Fast Fourier Transform) bidimensional."
+
+#: modules/process/fft.c:139
+msgid "/_Integral Transforms/2D _FFT..."
+msgstr "/Transformadas _integrais/_FFT 2D..."
+
+#: modules/process/fft.c:143
+msgid "Compute Fast Fourier Transform"
+msgstr "Calcula transformada de Fourier rápida"
+
+#: modules/process/fft.c:231
+msgid "FFT Real"
+msgstr "FFT real"
+
+#: modules/process/fft.c:235
+msgid "FFT Imaginary"
+msgstr "FFT imaginária"
+
+#: modules/process/fft.c:240
+msgid "FFT Modulus"
+msgstr "FFT módulo"
+
+#: modules/process/fft.c:246
+msgid "FFT Phase"
+msgstr "FFT fase"
+
+#: modules/process/fft.c:322
+msgid "Real + Imaginary"
+msgstr "Real + imaginária"
+
+#: modules/process/fft.c:323
+msgid "Modulus + Phase"
+msgstr "Módulo + fase"
+
+#: modules/process/fft.c:324
+msgid "Real"
+msgstr "Real"
+
+#: modules/process/fft.c:325
+msgid "Imaginary"
+msgstr "Imaginária"
+
+#: modules/process/fft.c:326
+msgid "Modulus"
+msgstr "Módulo"
+
+#: modules/process/fft.c:327 modules/process/wave_synth.c:618
+msgid "Phase"
+msgstr "Fase"
+
+#: modules/process/fft.c:335
+msgid "2D FFT"
+msgstr "FFT 2D"
+
+#: modules/process/fft.c:352
+msgid "Ra_w transform"
+msgstr "Transformada ra_w"
+
+#: modules/process/fft.c:366
+msgid "I_maginary part:"
+msgstr "Parte i_maginária:"
+
+#: modules/process/fft.c:380
+msgid "_Inverse transform"
+msgstr "Transformada _inversa"
+
+#: modules/process/fft.c:409
+msgid "Subtract mean _value beforehand"
+msgstr "Subtrair _valor médio antecipadamente"
+
+#: modules/process/fft.c:420
+msgid "_Preserve RMS"
+msgstr "Preservar RMS"
+
+#: modules/process/fft_filter_1d.c:118
+msgid "FFT filtering"
+msgstr "Filtro FFT"
+
+#: modules/process/fft_filter_1d.c:132
+msgid "/_Correct Data/1D _FFT Filtering..."
+msgstr "/_Corrigir dados/_Filtro FFT 1D..."
+
+#: modules/process/fft_filter_1d.c:136
+msgid "1D FFT Filtering"
+msgstr "Filtro FFT 1D"
+
+#: modules/process/fft_filter_1d.c:166 modules/process/wpour_mark.c:391
+msgid "Marked"
+msgstr "Marcado"
+
+#: modules/process/fft_filter_1d.c:167
+msgid "Unmarked"
+msgstr "Não-marcado"
+
+#: modules/process/fft_filter_1d.c:170
+msgid "Null"
+msgstr "Nulo"
+
+#: modules/process/fft_filter_1d.c:171
+msgid "Suppress"
+msgstr "Suprimir"
+
+#: modules/process/fft_filter_1d.c:181
+msgid "1D FFT filter"
+msgstr "Filtro FFT 1D"
+
+#: modules/process/fft_filter_1d.c:271 modules/process/linematch.c:828
+msgid "_Direction:"
+msgstr "_Direção:"
+
+#: modules/process/fft_filter_1d.c:279
+msgid "_Suppress type:"
+msgstr "Tipo de _supressão:"
+
+#: modules/process/fft_filter_1d.c:287
+msgid "_Filter type:"
+msgstr "Tipo de _filtro:"
+
+#: modules/process/fft_filter_1d.c:515
+msgid "1D FFT Filtered Data"
+msgstr "Dados FFT 1D filtrados"
+
+#: modules/process/fft_filter_2d.c:158 modules/process/fft_filter_2d.c:416
+msgid "2D FFT Filtering"
+msgstr "Filtro FFT 2D"
+
+#: modules/process/fft_filter_2d.c:172
+msgid "/_Correct Data/_2D FFT Filtering..."
+msgstr "/_Corrigir dados/Filtro FFT _2D..."
+
+#: modules/process/fft_filter_2d.c:176
+msgid "Two-dimensional FFT filtering"
+msgstr "Filtro FFT bidimensional"
+
+#: modules/process/fft_filter_2d.c:290
+msgid "Filtered Data"
+msgstr "Dados filtrados"
+
+#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:604
+#: modules/process/fit-shape.c:653 modules/process/fit-shape.c:668
+#: modules/process/fit-shape.c:672 modules/process/neural.c:564
+#: modules/process/psf.c:232
+msgid "Difference"
+msgstr "Diferença"
+
+#: modules/process/fft_filter_2d.c:318
+msgid "Filtered FFT"
+msgstr "Filtrado por FFT"
+
+#: modules/process/fft_filter_2d.c:342
+msgid "Add an ellipse to the FFT mask"
+msgstr "Adicionar uma elipse à máscara FFT"
+
+#: modules/process/fft_filter_2d.c:347
+msgid "Add a rectangle to the FFT mask"
+msgstr "Adicionar um retângulo à máscara FFT"
+
+#: modules/process/fft_filter_2d.c:352
+msgid "Subtract an ellipse from the FFT mask"
+msgstr "Subtrair uma elipse da máscara FFT"
+
+#: modules/process/fft_filter_2d.c:357
+msgid "Subtract a rectangle from the FFT mask"
+msgstr "Subtrair um retângulo da máscara FFT"
+
+#: modules/process/fft_filter_2d.c:368
+msgid "_FFT mask editor"
+msgstr "Editor de máscara _FFT"
+
+#: modules/process/fft_filter_2d.c:376
+msgid "Fi_ltered image"
+msgstr "Imagem filtrada"
+
+#: modules/process/fft_filter_2d.c:380
+msgid "Image _difference"
+msgstr "_Diferença na imagem"
+
+#: modules/process/fft_filter_2d.c:391
+msgid "Filtered i_mage"
+msgstr "I_magem filtrada"
+
+#: modules/process/fft_filter_2d.c:395
+msgid "Ima_ge difference"
+msgstr "Diferença na ima_gem"
+
+#: modules/process/fft_filter_2d.c:399
+msgid "Filtered FFT mo_dulus"
+msgstr "Mó_dulo FFT filtrado"
+
+#: modules/process/fft_filter_2d.c:455
+msgid "Filter Mask"
+msgstr "Filtro de máscara"
+
+#: modules/process/fft_filter_2d.c:490
+msgid "_Undo"
+msgstr "_Desfazer"
+
+#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:562
+msgid "_Fill"
+msgstr "Preencher"
+
+#: modules/process/fft_filter_2d.c:517
+msgid "_Snap to origin"
+msgstr "Rebater para origem"
+
+#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:329
+msgid "Zoom:"
+msgstr "Zoom:"
+
+#: modules/process/fft_filter_2d.c:1241
+msgid "Draw ellipses on the mask"
+msgstr "Desenhar elipses na máscara"
+
+#: modules/process/fft_filter_2d.c:1243
+msgid "Draw rectangles on the mask"
+msgstr "Desenhar retângulos na máscara"
+
+#: modules/process/fft_filter_2d.c:1245
+msgid "Undraw ellipses on the mask"
+msgstr "Remover elipses desenhadas na máscara"
+
+#: modules/process/fft_filter_2d.c:1247
+msgid "Undraw rectangles on the mask"
+msgstr "Remover retângulos desenhados na máscara"
+
+#: modules/process/fft_filter_2d.c:1249
+msgid "Undo the last change to the filter mask"
+msgstr "Desfazer a última modificação na máscara de filtro"
+
+#: modules/process/fft_filter_2d.c:1251
+msgid "Clear the entire filter mask"
+msgstr "Limpar a máscara de filtro inteira"
+
+#: modules/process/fft_filter_2d.c:1253
+msgid "Fill the entire filter mask"
+msgstr "Preencher a máscara de filtro inteira"
+
+#: modules/process/fft_filter_2d.c:1255
+msgid "Force shapes to center around the origin"
+msgstr "Forçar formas a centralizar em torno da origem"
+
+#: modules/process/fft_profile.c:124
+msgid ""
+"Reads radial sections of two-dimensional power spectrum density function."
+msgstr ""
+"Lê secções radiais de função de densidade de espectro de potência "
+"bidimensional (PSDF)."
+
+#: modules/process/fft_profile.c:139
+msgid "/_Statistics/_PSDF Section..."
+msgstr "/E_statísticas/Secção _PSDF..."
+
+#: modules/process/fft_profile.c:143
+msgid "Read radial PSDF sections"
+msgstr "Lê secções radiais de PSDF"
+
+#: modules/process/fft_profile.c:189
+msgid "Radial PSDF Section"
+msgstr "Secção radial de PSDF"
+
+#: modules/process/fft_profile.c:236
+msgid "PSDF Section"
+msgstr "Secção de PSDF"
+
+#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:338
+#: modules/tools/profile.c:514 modules/tools/sfunctions.c:454
+#, fuzzy
+msgid "_Fixed resolution:"
+msgstr "Resolução _X:"
+
+#: modules/process/fft_profile.c:278
+msgid "_Separate curves"
+msgstr "_Separar curvas"
+
+#: modules/process/fft_profile.c:483
+#, c-format
+msgid "PSDF %.0f°"
+msgstr "PSDF %.0f°"
+
+#: modules/process/fft_synth.c:179
+msgid "Generates random surfaces using spectral synthesis."
+msgstr "Gera superfícies aleatórias usando síntese espectral."
+
+#: modules/process/fft_synth.c:193
+msgid "/S_ynthetic/_Spectral..."
+msgstr "/Sintético/E_spectral..."
+
+#: modules/process/fft_synth.c:197
+msgid "Generate surface using spectral synthesis"
+msgstr "Gera superfície usando síntese espectral"
+
+#: modules/process/fft_synth.c:339
+msgid "Spectral Synthesis"
+msgstr "Síntese espectral"
+
+#: modules/process/fft_synth.c:430
+msgid "M_inimum frequency:"
+msgstr "Frequência mín_ima:"
+
+#: modules/process/fft_synth.c:430 modules/process/fft_synth.c:450
+msgid "px<sup>-1</sup>"
+msgstr ""
+
+#: modules/process/fft_synth.c:450
+msgid "Ma_ximum frequency:"
+msgstr "Frequência má_xima:"
+
+#: modules/process/fft_synth.c:469
+msgid "Enable _Gaussian multiplier"
+msgstr "Habilitar multiplicador _gaussiano"
+
+#: modules/process/fft_synth.c:482 modules/process/fft_synth.c:505
+msgid "_Autocorrelation length:"
+msgstr "Comprimento de _autocorrelação:"
+
+#: modules/process/fft_synth.c:492
+msgid "Enable _Lorentz multiplier"
+msgstr "Habilitar multiplicador _lorentziano"
+
+#: modules/process/fft_synth.c:515
+msgid "Enable _power multiplier"
+msgstr "Habilitar multiplicador de _potência"
+
+#: modules/process/fibre_synth.c:256
+msgid "Semi-circle"
+msgstr ""
+
+#: modules/process/fibre_synth.c:257
+#, fuzzy
+msgid "Triangle"
+msgstr "Triângulo para cima"
+
+#: modules/process/fibre_synth.c:258
+#, fuzzy
+msgid "Rectangle"
+msgstr "Retângulos"
+
+#: modules/process/fibre_synth.c:260
+msgid "Quadratic spline"
+msgstr ""
+
+#: modules/process/fibre_synth.c:266
+#, fuzzy
+msgid "Generates surfaces composed from randomly placed fibers."
+msgstr "Gerar superfície de objetos posicionados aleatoriamente"
+
+#: modules/process/fibre_synth.c:280
+#, fuzzy
+msgid "/S_ynthetic/_Deposition/_Fibers..."
+msgstr "/Sintético/_Objetos..."
+
+#: modules/process/fibre_synth.c:284
+#, fuzzy
+msgid "Generate surface of randomly placed fibers"
+msgstr "Gerar superfície de objetos posicionados aleatoriamente"
+
+#: modules/process/fibre_synth.c:420
+#, fuzzy
+msgid "Random Fibers"
+msgstr "Aleatório linear"
+
+#: modules/process/fibre_synth.c:494 modules/process/obj_synth.c:510
+msgid "_Shape:"
+msgstr "Forma:"
+
+#: modules/process/fibre_synth.c:513 modules/process/obj_synth.c:529
+msgid "obj."
+msgstr "obj."
+
+#: modules/process/fibre_synth.c:553
+#, fuzzy
+msgid "Scales _with width"
+msgstr "Dimensiona escala com tamanho"
+
+#: modules/process/fibre_synth.c:591 modules/process/synth.h:485
+msgid "Deformation"
+msgstr "Deformação"
+
+#: modules/process/fibre_synth.c:600 modules/process/lno_synth.c:852
+#: modules/process/lno_synth.c:1222 modules/process/mask_noisify.c:177
+msgid "Densi_ty:"
+msgstr "Densidade:"
+
+#: modules/process/fibre_synth.c:607
+#, fuzzy
+msgid "_Lateral:"
+msgstr "Lateral"
+
+#: modules/process/fibre_synth.c:614
+#, fuzzy
+msgid "Le_ngthwise:"
+msgstr "_Comprimento:"
+
+#: modules/process/fibre_synth.c:819
+msgid "Along fiber:"
+msgstr ""
+
+#: modules/process/fibre_synth.c:1180
+#, fuzzy
+msgid "Generating fibers..."
+msgstr "Lendo arquivos..."
+
+#: modules/process/fit-shape.c:264
+msgid "Fits predefined geometrical shapes to data."
+msgstr "Ajustar formas geométricas pré-definidas aos dados."
+
+#: modules/process/fit-shape.c:278
+msgid "/_Level/_Fit Shape..."
+msgstr "/Nive_lar/Ajustar forma..."
+
+#: modules/process/fit-shape.c:282 modules/process/fit-shape.c:289
+msgid "Fit geometrical shapes"
+msgstr "Ajustar formas geométricas"
+
+#: modules/process/fit-shape.c:285
+msgid "/_Fit Shape..."
+msgstr "/Ajustar forma..."
+
+#: modules/process/fit-shape.c:389
+msgid "Fit Shape"
+msgstr "Ajustar forma"
+
+#: modules/process/fit-shape.c:396
+msgid "verb|_Quick Fit"
+msgstr "Ajuste rápido"
+
+#: modules/process/fit-shape.c:474 modules/process/fit-shape.c:2141
+msgid "Derived Quantities"
+msgstr "Quantidades derivadas"
+
+#: modules/process/fit-shape.c:479 modules/process/fit-shape.c:2111
+msgid "Mean square difference:"
+msgstr "Diferença quadrática média:"
+
+#: modules/process/fit-shape.c:590 modules/process/fit-shape.c:636
+#: modules/process/fit-shape.c:667 modules/process/fit-shape.c:671
+msgid "Fitted shape"
+msgstr "Forma ajustada"
+
+#: modules/process/fit-shape.c:673 modules/process/mark_disconn.c:189
+#: modules/process/scars.c:299
+msgid "Both"
+msgstr "Ambos"
+
+#: modules/process/fit-shape.c:690 modules/process/psf-fit.c:308
+msgid "_Function type:"
+msgstr "Tipo de _função:"
+
+#: modules/process/fit-shape.c:720
+msgid "Show differences with _adapted color map"
+msgstr "Mostrar diferenças com mapa de cores _adaptado"
+
+#: modules/process/fit-shape.c:732
+msgid "Full fit is _geometric"
+msgstr ""
+
+#: modules/process/fit-shape.c:769
+msgid "Calculate differences for e_xcluded pixels"
+msgstr "Calcular diferenças para pixeis e_xcluídos"
+
+#: modules/process/fit-shape.c:816
+msgid "_Recalculate Image"
+msgstr "_Recalcular imagem"
+
+#: modules/process/fit-shape.c:823
+msgid "Revert to _Previous Values"
+msgstr "Reverter para valores anteriores"
+
+#: modules/process/fit-shape.c:1864
+msgid "Parameter estimation failed"
+msgstr "Estimativa do parâmetro falhou"
+
+#: modules/process/fit-shape.c:1867
+msgid "Fit failed"
+msgstr "O ajuste falhou"
+
+#: modules/process/fit-shape.c:1869
+msgid "Fit was interruped"
+msgstr "O ajuste foi interrompido"
+
+#: modules/process/fit-shape.c:2097
+msgid "(fixed)"
+msgstr "(fixo)"
+
+#: modules/process/flatten_base.c:44
+msgid "Levels the flat base of a surface with positive features."
+msgstr ""
+"Nivela a base achatada de uma superfície com características positivas."
+
+#: modules/process/flatten_base.c:58
+msgid "/_Level/Flatten _Base"
+msgstr "/Nive_lar/_Base achatada"
+
+#: modules/process/flatten_base.c:62
+msgid "Flatten base of surface with positive features"
+msgstr "Base achatada de uma superfície com características positivas."
+
+#: modules/process/flatten_base.c:276
+msgid "Polynomial leveling..."
+msgstr "Nivelamento de polinomial..."
+
+#: modules/process/fraccor.c:39
+msgid "Removes data under mask using fractal interpolation."
+msgstr "Remover dados sob máscara usando interpolação fractal."
+
+#: modules/process/fraccor.c:53
+msgid "/_Correct Data/_Fractal Correction"
+msgstr "/_Corrigir dados/Correção _fractal"
+
+#: modules/process/fraccor.c:57
+msgid "Interpolate data under mask with fractal interpolation"
+msgstr "Interpola dados sob máscara com interpolação fractal"
+
+#: modules/process/fractal.c:130
+msgid "Partitioning"
+msgstr "Particionamento"
+
+#: modules/process/fractal.c:131
+msgid "Cube counting"
+msgstr "Contagem de cubo"
+
+#: modules/process/fractal.c:132
+msgid "Triangulation"
+msgstr "Triangulação"
+
+#: modules/process/fractal.c:133
+msgid "Power spectrum"
+msgstr "Espectro de potência"
+
+#: modules/process/fractal.c:169
+msgid ""
+"Calculates fractal dimension using several methods (partitioning, box "
+"counting, triangulation, power spectrum)."
+msgstr ""
+"Calcula dimensão fractal usando diferentes métodos (particionamento, "
+"contagem de caixa, triangulação, espectro de potência)."
+
+#: modules/process/fractal.c:184
+msgid "/_Statistics/_Fractal Dimension..."
+msgstr "/E_statísticas/Dimensão _fractal..."
+
+#: modules/process/fractal.c:188
+msgid "Calculate fractal dimension"
+msgstr "Calcula dimensão fractal"
+
+#: modules/process/fractal.c:223
+msgid "Fractal Dimension"
+msgstr "Dimensão fractal"
+
+#: modules/process/fractal.c:253
+msgid "_Method:"
+msgstr "_Método:"
+
+#: modules/process/fractal.c:269
+msgid "Fit Area"
+msgstr "Ajustar área"
+
+#: modules/process/fractal.c:273 modules/process/fractal.c:545
+#: modules/process/fractal.c:569
+msgid "minimum"
+msgstr "mínimo"
+
+#: modules/process/fractal.c:274
+msgid "From:"
+msgstr "De:"
+
+#: modules/process/fractal.c:279 modules/process/fractal.c:546
+#: modules/process/fractal.c:570
+msgid "maximum"
+msgstr "máximo"
+
+#: modules/process/fractal.c:280
+msgid "To:"
+msgstr "Até:"
+
+#: modules/process/fractal.c:287 modules/process/mark_with.c:394
+#: modules/process/neural.c:563
+msgid "Result"
+msgstr "Resultado"
+
+#: modules/process/fractal.c:506
+msgid "Linear fit"
+msgstr "Ajuste linear"
+
+#: modules/process/gradient.c:43
+msgid "Creates presentations with various gradients (Sobel, Prewitt)."
+msgstr "Cria apresentações com vários gradientes (Sobel, Prewitt)."
+
+#: modules/process/gradient.c:58
+msgid "/_Presentation/_Gradient/_Sobel (horizontal)"
+msgstr "/A_presentação/_Gradiente/_Sobel (horizontal)"
+
+#: modules/process/gradient.c:62
+msgid "Horizontal Sobel gradient presentation"
+msgstr "Apresentação de gradiente Sobel horizontal"
+
+#: modules/process/gradient.c:65
+msgid "/_Presentation/_Gradient/_Sobel (vertical)"
+msgstr "/A_presentação/_Gradiente/_Sobel (vertical)"
+
+#: modules/process/gradient.c:69
+msgid "Vertical Sobel gradient presentation"
+msgstr "Apresentação de gradiente Sobel vertical"
+
+#: modules/process/gradient.c:72
+msgid "/_Presentation/_Gradient/_Prewitt (horizontal)"
+msgstr "/A_presentação/_Gradiente/_Prewitt (horizontal)"
+
+#: modules/process/gradient.c:76
+msgid "Horizontal Prewitt gradient presentation"
+msgstr "Apresentação de gradiente Prewitt horizontal"
+
+#: modules/process/gradient.c:79
+msgid "/_Presentation/_Gradient/_Prewitt (vertical)"
+msgstr "/A_presentação/_Gradiente/_Prewitt (vertical)"
+
+#: modules/process/gradient.c:83
+msgid "Vertical Prewitt gradient presentation"
+msgstr "Apresentação de gradiente Prewitt vertical"
+
+#: modules/process/gradient.c:86
+msgid "/_Presentation/_Gradient/_Azimuth"
+msgstr "/A_presentação/_Gradiente/_Azimute"
+
+#: modules/process/gradient.c:90
+msgid "Local slope azimuth presentation"
+msgstr "Apresentação de azimute de inclinação local"
+
+#: modules/process/grain_cross.c:101
+msgid "Plots one grain quantity as a function of another."
+msgstr "Plota uma quantidade de grãos em função de outra."
+
+#: modules/process/grain_cross.c:115
+msgid "/_Grains/_Correlate..."
+msgstr "/_Grãos/_Correlacionar..."
+
+#: modules/process/grain_cross.c:119
+msgid "Correlate grain characteristics"
+msgstr "Correlacionar características de grãos"
+
+#: modules/process/grain_cross.c:193
+msgid ""
+"Grain correlation: Lateral dimensions and value must be the same physical "
+"quantity for the selected grain properties."
+msgstr ""
+"Correlação de grãos: dimensões laterais e valores devem ser as mesmas "
+"quantidades físicas para as propriedades de grãos selecionadas."
+
+#: modules/process/grain_cross.c:217
+msgid "Grain Correlations"
+msgstr "Correlações de grãos"
+
+#: modules/process/grain_cross.c:241
+msgid "_Abscissa"
+msgstr "_Abcissa"
+
+#: modules/process/grain_cross.c:245
+msgid "O_rdinate"
+msgstr "O_rdenada"
+
+#: modules/process/grain_dist.c:153
+msgid "Evaluates distribution of grains (continuous parts of mask)."
+msgstr "Calcula distribuição de grãos (partes contínuas da máscara)."
+
+#: modules/process/grain_dist.c:175
+msgid "/_Grains/_Distributions..."
+msgstr "/_Grãos/_Distribuições..."
+
+#: modules/process/grain_dist.c:179
+msgid "Distributions of various grain characteristics"
+msgstr "Distribuições de várias características de grãos"
+
+#: modules/process/grain_dist.c:223
+msgid "_Export raw data"
+msgstr "_Exportar dados raw"
+
+#: modules/process/grain_dist.c:224
+msgid "Plot _graphs"
+msgstr "Plotar _gráficos"
+
+#: modules/process/grain_dist.c:241
+msgid "Grain Distributions"
+msgstr "Distribuições de grãos"
+
+#: modules/process/grain_dist.c:547
+msgid "count"
+msgstr "contagem"
+
+#: modules/process/grain_dist.c:611
+msgid "Export Raw Grain Values"
+msgstr "Exportar valores raw de grãos"
+
+#: modules/process/grain_edge.c:99
+msgid "Marks grains by edge detection method."
+msgstr "Marca grãos pelo método de detecção de borda."
+
+#: modules/process/grain_edge.c:113
+msgid "/_Grains/Mark by _Edge Detection..."
+msgstr "/_Grãos/Marcar por detecção de borda..."
+
+#: modules/process/grain_edge.c:117
+msgid "Mark grains with edge detection mechanism"
+msgstr "Marca grãos com mecanismo de detecção de borda"
+
+#: modules/process/grain_edge.c:206
+msgid "Mark Grains by Edge Detection"
+msgstr "Marca grãos por detecção de borda"
+
+#: modules/process/grain_edge.c:244
+msgid "Threshold"
+msgstr "Limiar"
+
+#: modules/process/grain_edge.c:248
+msgid "_Laplacian:"
+msgstr "_Laplaciano:"
+
+#: modules/process/grain_filter.c:194
+msgid ""
+"Filters grains by their properties, using logical expressions and thresholds."
+msgstr ""
+"Filtra grãos por suas propriedades, usando expressões lógicas e limiares."
+
+#: modules/process/grain_filter.c:209
+msgid "/_Grains/_Filter..."
+msgstr "/_Grãos/_Filtrar..."
+
+#: modules/process/grain_filter.c:213
+msgid "Filter grains by their properties"
+msgstr "Filtrar grãos por suas propriedades"
+
+#: modules/process/grain_filter.c:253
+msgid "There are no grains to filter."
+msgstr "Não existem grãos para filtrar."
+
+#: modules/process/grain_filter.c:309
+msgid "Filter Grains"
+msgstr "Filtrar grãos"
+
+#: modules/process/grain_filter.c:404
+msgid "Set selected as:"
+msgstr "Definir seleção como:"
+
+#: modules/process/grain_filter.c:419
+msgid "Keep grains satisfying:"
+msgstr "Manter grãos satisfazendo:"
+
+#: modules/process/grain_filter.c:440 modules/process/lat_synth.c:733
+msgid "Lower threshold:"
+msgstr "Limite inferior:"
+
+#: modules/process/grain_filter.c:467 modules/process/lat_synth.c:740
+msgid "Upper threshold:"
+msgstr "Limite superior:"
+
+#. TRANSLATORS: %c is replaced with quantity label A, B or C.
+#: modules/process/grain_filter.c:628
+#, c-format
+msgid "Condition %c: %s"
+msgstr "Condição %c: %s"
+
+#: modules/process/grain_mark.c:137
+msgid "Marks grains by thresholding (height, slope, curvature)."
+msgstr "Marcar grãos por limites (altura, inclinação, curvatura)."
+
+#: modules/process/grain_mark.c:151
+msgid "/_Grains/_Mark by Threshold..."
+msgstr "/_Grãos/_Marcar por limite..."
+
+#: modules/process/grain_mark.c:155
+msgid "Mark grains by threshold"
+msgstr "Marcar grãos por limite"
+
+#: modules/process/grain_mark.c:240
+msgid "Mark Grains by Threshold"
+msgstr "Marcar grãos por limite"
+
+#: modules/process/grain_mark.c:280
+msgid "Threshold by"
+msgstr "Limite por"
+
+#: modules/process/grain_mark.c:310
+msgid "_Slope:"
+msgstr "Inclinação:"
+
+#: modules/process/grain_mark.c:314
+msgid "_Curvature:"
+msgstr "_Curvatura:"
+
+#: modules/process/grain_mark.c:319 modules/process/grain_wshed.c:260
+#: modules/process/wpour_mark.c:358
+msgid "_Invert height"
+msgstr "_Inverter altura"
+
+#: modules/process/grain_mark.c:328
+msgid "Criteria combination:"
+msgstr "Critério de combinação:"
+
+#: modules/process/grain_stat.c:54
+msgid "Displays overall grain statistics."
+msgstr "Exibir estatísticas gerais de grãos."
+
+#: modules/process/grain_stat.c:69
+msgid "/_Grains/S_tatistics..."
+msgstr "/_Grãos/Es_tatísticas..."
+
+#: modules/process/grain_stat.c:73
+msgid "Simple grain statistics"
+msgstr "Estatísticas simples de grãos"
+
+#: modules/process/grain_stat.c:76
+msgid "/_Grains/Select _Inscribed Discs"
+msgstr "/_Grãos/Selecionar discos inscritos"
+
+#: modules/process/grain_stat.c:80
+msgid "Create a selection visualizing discs inscribed into grains"
+msgstr "Criar uma seleção visualizando discos inscritos em grãos"
+
+#: modules/process/grain_stat.c:84
+msgid "/_Grains/Select _Circumscribed Circles"
+msgstr "/_Grãos/Selecionar _círculos circunscritos"
+
+#: modules/process/grain_stat.c:88
+msgid "Create a selection visualizing grain circumcircles"
+msgstr "Criar uma seleção visualizando grãos em círculos circunscritos"
+
+#: modules/process/grain_stat.c:141
+msgid "Save Grain Statistics"
+msgstr "Salvar estatísticas de grãos"
+
+#: modules/process/grain_stat.c:192
+msgid "Data channel:"
+msgstr "Canal de dados:"
+
+#: modules/process/grain_stat.c:223 modules/process/grain_stat.c:339
+msgid "Grain Statistics"
+msgstr "Estatísticas de grãos"
+
+#: modules/process/grain_stat.c:236
+msgid "Number of grains:"
+msgstr "Número de grãos:"
+
+#: modules/process/grain_stat.c:251
+msgid "Total projected area (abs.):"
+msgstr "Área projetada total (abs.):"
+
+#: modules/process/grain_stat.c:255
+msgid "Total projected area (rel.):"
+msgstr "Área projetada relativa (rel.):"
+
+#: modules/process/grain_stat.c:266
+msgid "Mean grain area:"
+msgstr "Área média de grãos:"
+
+#: modules/process/grain_stat.c:277
+msgid "Mean grain size:"
+msgstr "Tamanho médio de grãos:"
+
+#: modules/process/grain_stat.c:291
+msgid "Total grain volume (zero):"
+msgstr "Volume total de grãos (zero):"
+
+#: modules/process/grain_stat.c:302
+msgid "Total grain volume (minimum):"
+msgstr "Volume total de grãos (mínimo):"
+
+#: modules/process/grain_stat.c:313
+msgid "Total grain volume (laplacian):"
+msgstr "Volume total de grãos (laplaciano):"
+
+#: modules/process/grain_stat.c:324
+msgid "Total projected boundary length:"
+msgstr "Comprimento total da fronteira projetada:"
+
+#: modules/process/grain_wshed.c:102
+msgid "Marks grains by watershed algorithm."
+msgstr "Marca grãos pelo algorítimo linha divisória de águashed."
+
+#: modules/process/grain_wshed.c:116
+msgid "/_Grains/Mark by _Watershed..."
+msgstr "/_Grãos/Marcar por Wlinha divisória de águas.."
+
+#: modules/process/grain_wshed.c:120
+msgid "Mark grains by watershed"
+msgstr "Marca grãos por linha divisória de águas"
+
+#: modules/process/grain_wshed.c:162
+msgid "Mark Grains by Watershed"
+msgstr "Marca grãos por linha divisória de águas"
+
+#: modules/process/grain_wshed.c:200
+msgid "Grain Location"
+msgstr "Localização de grão"
+
+#: modules/process/grain_wshed.c:216
+msgid "_Drop size:"
+msgstr "Tamanho da gota:"
+
+#: modules/process/grain_wshed.c:233
+msgid "Segmentation"
+msgstr "Segmentação"
+
+#: modules/process/grain_wshed.c:239
+msgid "Num_ber of steps:"
+msgstr "Número de passos:"
+
+#: modules/process/grain_wshed.c:248
+msgid "Dr_op size:"
+msgstr "Tamanho da g_ota:"
+
+#: modules/process/grain_wshed.c:439
+msgid "Finding minima..."
+msgstr "Encontrando mínimo..."
+
+#: modules/process/grain_wshed.c:441
+msgid "Locating..."
+msgstr "Localizando..."
+
+#: modules/process/grain_wshed.c:443
+msgid "Simulating watershed..."
+msgstr "Simulando linha divisória de águas..."
+
+#: modules/process/grain_wshed.c:445
+msgid "Marking boundaries..."
+msgstr "Marcando fronteiras..."
+
+#: modules/process/hough.c:76
+msgid "Hough transform."
+msgstr "Transformada de Hough."
+
+#: modules/process/hough.c:90
+msgid "/_Integral Transforms/_Hough..."
+msgstr "/Transformadas _integrais/_Hough..."
+
+#: modules/process/hough.c:94
+msgid "Compute Hough transform"
+msgstr "Calcula transformada de Hough"
+
+#: modules/process/hough.c:137
+#, fuzzy
+msgid "Hough line"
+msgstr "Rugosidade"
+
+#: modules/process/hough.c:141
+#, c-format
+msgid "Hough circle r=%d"
+msgstr ""
+
+#: modules/process/hough.c:173
+msgid "Hough Transform"
+msgstr "Transformada de Hough"
+
+#: modules/process/hough.c:195
+msgid "_Transform type:"
+msgstr "Tipo de _transformação:"
+
+#: modules/process/hough.c:203
+msgid "_Circle size:"
+msgstr "Tamanho do círculo:"
+
+#: modules/process/immerse.c:163
+msgid "Immerse high resolution detail into overall image."
+msgstr "Imergir detalhes de alta resolução na imagem toda."
+
+#: modules/process/immerse.c:177
+msgid "/M_ultidata/_Immerse Detail..."
+msgstr "/M_ulti-dados/_Imergir detalhes..."
+
+#: modules/process/immerse.c:181
+msgid "Immerse a detail into image"
+msgstr "Imergir um detalhe na imagem"
+
+#: modules/process/immerse.c:223
+msgid "Immerse Detail"
+msgstr "Imergir um detalhe"
+
+#: modules/process/immerse.c:226
+msgid "_Locate"
+msgstr "_Localizar"
+
+#: modules/process/immerse.c:228
+msgid "Locate detail by full image correlation search"
+msgstr "Localizar detalhe por busca de correlação de imagem completa"
+
+#: modules/process/immerse.c:230
+msgid "_Improve"
+msgstr "Melhorar"
+
+#: modules/process/immerse.c:232
+msgid "Improve detail position by correlation search in neighborhood"
+msgstr "Melhorar posição do detalhe por busca de correlação na vizinhança"
+
+#: modules/process/immerse.c:291
+msgid "_Detail image:"
+msgstr "_Detalhar imagem:"
+
+#: modules/process/immerse.c:296
+msgid "Position:"
+msgstr "Posição:"
+
+#: modules/process/immerse.c:314
+msgid "Result Sampling"
+msgstr "Resultado de amostragem"
+
+#: modules/process/immerse.c:324
+msgid "_Upsample large image"
+msgstr "Incrementar frequência (upsample) de imagem grande"
+
+#: modules/process/immerse.c:326
+msgid "_Downsample detail"
+msgstr "Reduzir frequência (downsample) de detalhe"
+
+#: modules/process/immerse.c:335
+msgid "Detail Leveling"
+msgstr "Nivelamento de detalhe"
+
+#: modules/process/immerse.c:345
+msgid "levelling|_None"
+msgstr "nivelamento|_Nenhum"
+
+#: modules/process/immerse.c:347
+msgid "_Mean value"
+msgstr "Valor _médio"
+
+#: modules/process/immerse.c:355
+msgid "Show _frame"
+msgstr "Mostrar quadro"
+
+#: modules/process/immerse.c:793
+msgid "Immersed detail"
+msgstr "Detalhe imerso"
+
+#: modules/process/indent_analyze.c:246
+msgid "Do nothing"
+msgstr "Não fazer nada"
+
+#: modules/process/indent_analyze.c:247
+msgid "Plane level"
+msgstr "Nível plano"
+
+#: modules/process/indent_analyze.c:248
+msgid "Plane rotate"
+msgstr "Girar plano"
+
+#: modules/process/indent_analyze.c:252
+msgid "New"
+msgstr "Novo"
+
+#: modules/process/indent_analyze.c:253
+msgid "AND"
+msgstr "AND"
+
+#: modules/process/indent_analyze.c:254
+msgid "OR"
+msgstr "OR"
+
+#: modules/process/indent_analyze.c:255
+msgid "NOT"
+msgstr "NOT"
+
+#: modules/process/indent_analyze.c:256
+msgid "XOR"
+msgstr "XOR"
+
+#: modules/process/indent_analyze.c:260
+msgid "Nothing"
+msgstr "Nada"
+
+#: modules/process/indent_analyze.c:261
+msgid "Above"
+msgstr "Acima"
+
+#: modules/process/indent_analyze.c:262
+msgid "Below"
+msgstr "Abaixo"
+
+#: modules/process/indent_analyze.c:263
+msgid "Plane"
+msgstr "Plano"
+
+#: modules/process/indent_analyze.c:264
+msgid "Impression"
+msgstr "Impressão"
+
+#: modules/process/indent_analyze.c:265
+msgid "Inner Pile-up"
+msgstr "Empilhamento interno"
+
+#: modules/process/indent_analyze.c:266
+msgid "Outer Pile-up"
+msgstr "Empilhamento externo"
+
+#: modules/process/indent_analyze.c:267
+msgid "Special points"
+msgstr "Pontos especiais"
+
+#: modules/process/indent_analyze.c:268
+msgid "Faces border"
+msgstr "Faceia borda"
+
+#: modules/process/indent_analyze.c:272
+msgid "Vickers"
+msgstr "Vickers"
+
+#: modules/process/indent_analyze.c:273
+msgid "Berkovich"
+msgstr "Berkovich"
+
+#: modules/process/indent_analyze.c:274
+msgid "Berkovich (modified)"
+msgstr "Berkovich (modificado)"
+
+#: modules/process/indent_analyze.c:275
+msgid "Knoop"
+msgstr "Knoop"
+
+#: modules/process/indent_analyze.c:276
+msgid "Brinell"
+msgstr "Brinell"
+
+#: modules/process/indent_analyze.c:277
+msgid "Cube corner"
+msgstr "Canto do cubo"
+
+#: modules/process/indent_analyze.c:278
+msgid "Rockwell"
+msgstr "Rockwell"
+
+#: modules/process/indent_analyze.c:288
+msgid "Analyses nanoindentation structure (volumes, surfaces, ...)."
+msgstr "Analisa estrutura de nano-indentação (volumes, superfícies, ...)."
+
+#: modules/process/indent_analyze.c:302
+msgid "/_Tip and Indentation/_Analyze Imprint..."
+msgstr "/Indicação e indentação/_Analisar impressão..."
+
+#: modules/process/indent_analyze.c:410
+msgid "Marked _areas:"
+msgstr "Áreas marcadas:"
+
+#: modules/process/indent_analyze.c:419
+msgid "_Indentor type:"
+msgstr "Tipo de indentador:"
+
+#: modules/process/indent_analyze.c:428
+msgid "_Mask creation type:"
+msgstr "Tipo de criação de _máscara:"
+
+#: modules/process/indent_analyze.c:434
+msgid "Ref. plane _tolerance:"
+msgstr "_Tolerância do plano de referência:"
+
+#: modules/process/indent_analyze.c:438
+msgid "Angle _1 tolerance:"
+msgstr "Tolerância de ângulo _1:"
+
+#: modules/process/indent_analyze.c:456
+msgid "Indent center at"
+msgstr "Indentar centro em"
+
+#: modules/process/indent_analyze.c:460
+msgid "Maximum at"
+msgstr "Máximo em"
+
+#: modules/process/indent_analyze.c:464
+msgid "Max-min difference"
+msgstr "Diferença máx-mín"
+
+#: modules/process/indent_analyze.c:472
+msgid "Expected A<sub>d</sub>:"
+msgstr "Esperado A<sub>d</sub>:"
+
+#: modules/process/indent_analyze.c:479
+msgid "Expected A<sub>p</sub>:"
+msgstr "Esperado A<sub>p</sub>:"
+
+#: modules/process/indent_analyze.c:489
+msgid "Volume above-below"
+msgstr "Volume acima-abaixo"
+
+#: modules/process/indent_analyze.c:494
+msgid "Indent. volume"
+msgstr "Indentar volume"
+
+#: modules/process/indent_analyze.c:502
+msgid "Indent. A<sub>d</sub>"
+msgstr "Indentar A<sub>d</sub>"
+
+#: modules/process/indent_analyze.c:509
+msgid "Indent. A<sub>p</sub>"
+msgstr "Indentar A<sub>p</sub>"
+
+#: modules/process/indent_analyze.c:517
+msgid "Inner Pile-Up A<sub>d</sub>"
+msgstr "Empilhamento interno A<sub>d</sub>"
+
+#: modules/process/indent_analyze.c:525
+msgid "Inner Pile-Up A<sub>p</sub>"
+msgstr "Empilhamento interno A<sub>p</sub>"
+
+#: modules/process/indent_analyze.c:533
+msgid "Outer Pile-Up A<sub>d</sub>"
+msgstr "Empilhamento externo  A<sub>d</sub>"
+
+#: modules/process/indent_analyze.c:541
+msgid "Outer Pile-Up A<sub>p</sub>"
+msgstr "Empilhamento externo  A<sub>p</sub>"
+
+#: modules/process/indent_analyze.c:569
+msgid "Indentation statistics"
+msgstr "Estatísticas de indentação"
+
+#: modules/process/indent_analyze.c:570
+msgid "_Compute & mark"
+msgstr "_Calcular & marcar"
+
+#: modules/process/indent_analyze.c:571
+msgid "_Save statistics"
+msgstr "_Salvar estatísticas"
+
+#: modules/process/indent_analyze.c:1392
+msgid "No statistics has been computed yet."
+msgstr "Nenhuma estatística foi calculada ainda."
+
+#: modules/process/indent_analyze.c:1400
+msgid "Save Indentation Statistics"
+msgstr "Salvar estatísticas de indentação"
+
+#: modules/process/indent_analyze.c:1438
+#, c-format
+msgid "Indentor:  %s\n"
+msgstr "Indentador:  %s\n"
+
+#: modules/process/indent_analyze.c:1442
+#, c-format
+msgid "Length units: %s\n"
+msgstr "Unidades de comprimento:  %s\n"
+
+#: modules/process/indent_analyze.c:1444
+#, c-format
+msgid "Indentation center at [%d, %d] px:      %lf\n"
+msgstr "Centro de indentação em [%d, %d] px:      %lf\n"
+
+#: modules/process/indent_analyze.c:1446
+#, c-format
+msgid "Maximum at [%d, %d] is:                 %lf\n"
+msgstr "Máximo em [%d, %d] is:                 %lf\n"
+
+#: modules/process/indent_analyze.c:1448
+#, c-format
+msgid "Difference max-min:                     %lf\n"
+msgstr "Diferença máx-mín:                     %lf\n"
+
+#: modules/process/indent_analyze.c:1453
+#, c-format
+msgid "Area (projected) above plane:             %g (%.1lf %%)\n"
+msgstr "Área (projetada) sobre o plano:             %g (%.1lf %%)\n"
+
+#: modules/process/indent_analyze.c:1457
+#, c-format
+msgid "Area (projected) below plane:             %g (%.1lf %%)\n"
+msgstr "Área (projetada) abaixo do plano:             %g (%.1lf %%)\n"
+
+#: modules/process/indent_analyze.c:1461
+#, c-format
+msgid "Area (projected) of    plane:             %g (%.1lf %%)\n"
+msgstr "Área (projetada) do plano:             %g (%.1lf %%)\n"
+
+#: modules/process/indent_analyze.c:1466
+#, c-format
+msgid "Area (developed) above %g (+%.1f %%)\n"
+msgstr "Área (desenvolvida) acima %g (+%.1f %%)\n"
+
+#: modules/process/indent_analyze.c:1469
+#, c-format
+msgid "Area (developed) below %g (+%.1lf %%)\n"
+msgstr "Área (desenvolvida) abaixo %g (+%.1lf %%)\n"
+
+#: modules/process/indent_analyze.c:1473
+#, c-format
+msgid "Volume above:     %g\n"
+msgstr "Volume acima:     %g\n"
+
+#: modules/process/indent_analyze.c:1475
+#, c-format
+msgid "Volume below:     %g\n"
+msgstr "Volume abaixo:     %g\n"
+
+#: modules/process/indent_analyze.c:1477
+#, c-format
+msgid "Volume difference %g\n"
+msgstr "Diferença de volume %g\n"
+
+#: modules/process/indent_analyze.c:1481
+msgid ""
+"\n"
+"Indentation\n"
+msgstr ""
+"\n"
+"Indentação\n"
+
+#: modules/process/indent_analyze.c:1482
+#, c-format
+msgid "Volume      %g\n"
+msgstr "Volume      %g\n"
+
+#: modules/process/indent_analyze.c:1487
+msgid ""
+"\n"
+"Indentation - Inner Pile-Up\n"
+msgstr ""
+"\n"
+"Indentação - Empilhamento interno\n"
+
+#: modules/process/indent_analyze.c:1493
+msgid "Indentation - Outer Pile-Up\n"
+msgstr "Indentação - Empilhamento externo\n"
+
+#: modules/process/laplace.c:41
+msgid ""
+"Removes data under mask, interpolating them with Laplace equation solution."
+msgstr ""
+"Remove dados sob máscara, interpolando-os com a solução da equação de "
+"Laplace."
+
+#: modules/process/laplace.c:56
+msgid "/_Correct Data/_Remove Data Under Mask"
+msgstr "/_Corrigir dados/_Remover dados sob máscara"
+
+#: modules/process/laplace.c:60
+msgid "Interpolate data under mask by solution of Laplace equation"
+msgstr "Interpola dados sob máscara por solução da equação de Laplace"
+
+#: modules/process/lat_synth.c:373
+msgid "Random constant"
+msgstr "Aleatório constante"
+
+#: modules/process/lat_synth.c:374
+msgid "Random linear"
+msgstr "Aleatório linear"
+
+#: modules/process/lat_synth.c:375
+msgid "Random bumpy"
+msgstr "Aleatório inconstante"
+
+#: modules/process/lat_synth.c:376
+msgid "Radial distance"
+msgstr "Distância radial"
+
+#: modules/process/lat_synth.c:377
+msgid "Segmented distance"
+msgstr "Distância do segmentado"
+
+#: modules/process/lat_synth.c:378
+msgid "Segmented random"
+msgstr "Segmentado aleatório"
+
+#: modules/process/lat_synth.c:379
+msgid "Border distance"
+msgstr "Distância da borda"
+
+#: modules/process/lat_synth.c:380
+msgid "Border random"
+msgstr "Borda aleatória"
+
+#: modules/process/lat_synth.c:381
+msgid "Second nearest distance"
+msgstr "Segunda distância mais próxima"
+
+#: modules/process/lat_synth.c:405
+msgid "Generates surfaces based on regular or random lattices."
+msgstr "Gera superfícies baseadas em redes regulares ou aleatórias."
+
+#: modules/process/lat_synth.c:419
+msgid "/S_ynthetic/_Lattice..."
+msgstr "/Sintético/Rede..."
+
+#: modules/process/lat_synth.c:423
+msgid "Generate lattice based surface"
+msgstr "Gerar superfície baseada em rede"
+
+#: modules/process/lat_synth.c:542
+msgid "lattice|Random"
+msgstr "rede|Aleatória"
+
+#: modules/process/lat_synth.c:543
+msgid "lattice|Square"
+msgstr "rede|Quadrada"
+
+#: modules/process/lat_synth.c:544
+msgid "lattice|Hexagonal"
+msgstr "rede|Hexagonal"
+
+#: modules/process/lat_synth.c:545
+msgid "lattice|Triangular"
+msgstr "rede|Triangular"
+
+#: modules/process/lat_synth.c:546
+#, fuzzy
+msgid "lattice|Cairo"
+msgstr "rede|Aleatória"
+
+#: modules/process/lat_synth.c:547
+#, fuzzy
+msgid "lattice|Snub square"
+msgstr "rede|Quadrada"
+
+#: modules/process/lat_synth.c:548
+#, fuzzy
+msgid "lattice|Truncated square"
+msgstr "rede|Quadrada"
+
+#: modules/process/lat_synth.c:549
+msgid "Silicon 7x7"
+msgstr ""
+
+#: modules/process/lat_synth.c:550
+msgid "lattice|Penrose (vertices)"
+msgstr ""
+
+#: modules/process/lat_synth.c:551
+#, fuzzy
+msgid "lattice|Penrose (centers)"
+msgstr "Parâmetros de rede"
+
+#: modules/process/lat_synth.c:644
+msgid "_Lattice:"
+msgstr "Rede:"
+
+#: modules/process/lat_synth.c:662
+msgid "Lattice rela_xation:"
+msgstr "Relaxação da rede:"
+
+#: modules/process/lat_synth.c:674
+msgid "_Height relaxation:"
+msgstr "Relaxação da altura:"
+
+#: modules/process/lat_synth.c:705
+msgid "Surface"
+msgstr "Superfície"
+
+#: modules/process/lat_synth.c:726 modules/process/local_contrast.c:154
+msgid "_Weight:"
+msgstr "Peso:"
+
+#: modules/process/lat_synth.c:1167
+msgid "Constructing lattice..."
+msgstr "Construindo rede..."
+
+#: modules/process/lat_synth.c:1194
+msgid "Relaxing lattice..."
+msgstr "Relaxando rede..."
+
+#: modules/process/lat_synth.c:1209
+msgid "Relaxing heights..."
+msgstr "Relaxando alturas..."
+
+#: modules/process/latsim.c:76
+msgid "Lateral force simulator"
+msgstr "Simulador de força lateral"
+
+#: modules/process/latsim.c:90
+msgid "/_Tip and Indentation/_Lateral force..."
+msgstr "/Indicação e indentação/Força _lateral..."
+
+#: modules/process/latsim.c:94
+msgid "Simulate topography artifacts in lateral force channels"
+msgstr "Simular artefatos de topografia em canais de força lateral"
+
+#: modules/process/latsim.c:136
+msgid "Fw lateral force "
+msgstr "Força lateral para frente"
+
+#: modules/process/latsim.c:145
+msgid "Rev lateral force"
+msgstr "Força lateral para trás"
+
+#: modules/process/latsim.c:158
+msgid "Lateral force simulation"
+msgstr "Simulação de força lateral"
+
+#: modules/process/latsim.c:175
+msgid "_Friction coef.:"
+msgstr "Coef. de _fricção:"
+
+#: modules/process/latsim.c:181
+msgid "_Normal force:"
+msgstr "Força _normal:"
+
+#: modules/process/latsim.c:187
+msgid "_Adhesion force:"
+msgstr "Força de _adesão:"
+
+#: modules/process/level.c:73
+msgid ""
+"Levels data by simple plane subtraction or by rotation, and fixes minimal or "
+"mean value to zero."
+msgstr ""
+"Nivela dados por subtração ou rotação de plano simples, e fixa valor mínimo "
+"ou máximo em zero."
+
+#: modules/process/level.c:88
+msgid "/_Level/Plane _Level"
+msgstr "/Nive_lar/Nivelamento plano"
+
+#: modules/process/level.c:92
+msgid "Level data by mean plane subtraction"
+msgstr "Nivelar dados por subtração de plano médio"
+
+#: modules/process/level.c:95
+msgid "/_Level/Level _Rotate"
+msgstr "/Nive_lar/Nivelar por _rotação"
+
+#: modules/process/level.c:99
+msgid "Automatically level data by plane rotation"
+msgstr "Nivelar dados automaticamente por rotação de plano"
+
+#: modules/process/level.c:102
+msgid "/_Level/Fix _Zero"
+msgstr "/Nive_lar/Fixar _zero"
+
+#: modules/process/level.c:106 modules/xyz/xyz_level.c:111
+msgid "Shift minimum data value to zero"
+msgstr "Deslocar valor mínimo dos dados para zero"
+
+#: modules/process/level.c:109
+msgid "/_Level/Zero _Mean Value"
+msgstr "/Nive_lar/Zerar valor _médio"
+
+#: modules/process/level.c:113 modules/xyz/xyz_level.c:118
+msgid "Shift mean data value to zero"
+msgstr "Deslocar valor médio dos dados para zero"
+
+#: modules/process/level.c:145
+msgid "Plane Level"
+msgstr "Nivelar plano"
+
+#: modules/process/level.c:147
+msgid "Level Rotate"
+msgstr "Nivelar rotação"
+
+#: modules/process/level.c:149
+msgid "Zero Mean Value"
+msgstr "Zerar valor médio"
+
+#: modules/process/level_grains.c:84
+msgid ""
+"Levels individual grains, interpolating the shifts between using Laplacian "
+"interpolation."
+msgstr ""
+"Nivela grãos individuais, interpolando os deslocamentos com interpolação "
+"Laplaciana."
+
+#: modules/process/level_grains.c:99
+msgid "/_Grains/_Level Grains..."
+msgstr "/_Grãos/Nive_lar grãos..."
+
+#: modules/process/level_grains.c:103
+msgid ""
+"Level individual grains, interpolating the shifts between using Laplacian "
+"interpolation"
+msgstr ""
+"Nivelar grãos individuais, interpolando os deslocamentos com interpolação "
+"Laplaciana"
+
+#: modules/process/level_grains.c:187 modules/process/median-bg.c:167
+#: modules/process/polylevel.c:293 modules/process/polylevel.c:417
+#: modules/process/sphere-revolve.c:221 modules/process/sphere-revolve.c:295
+msgid "Background"
+msgstr "Fundo"
+
+#: modules/process/level_grains.c:203
+msgid "Level Grains"
+msgstr "Nivelar grãos"
+
+#: modules/process/level_grains.c:218
+msgid "Quantity to level:"
+msgstr "Quantidade para nivelar:"
+
+#: modules/process/level_grains.c:231 modules/process/linematch.c:834
+#: modules/process/median-bg.c:217 modules/process/polylevel.c:485
+#: modules/process/sphere-revolve.c:371
+msgid "E_xtract background"
+msgstr "E_xtrair fundo"
+
+#: modules/process/linecorrect.c:52
+msgid "Corrects line defects (mostly experimental algorithms)."
+msgstr "Corrige defeitos de linha (algorítimos experimentais em sua maioria)."
+
+#: modules/process/linecorrect.c:66
+msgid "/_Correct Data/Ste_p Line Correction"
+msgstr "/_Corrigir dados/Correção de _passo de linha"
+
+#: modules/process/linecorrect.c:70
+msgid "Correct steps in lines"
+msgstr "Corrigir passos em linhas"
+
+#: modules/process/linematch.c:155 modules/tools/linestats.c:166
+#: modules/volume/volume_linestat.c:143
+msgid "Median"
+msgstr "Mediana"
+
+#: modules/process/linematch.c:156
+msgid "Median of differences"
+msgstr "Mediana das diferenças"
+
+#: modules/process/linematch.c:157
+msgid "Modus"
+msgstr "Modo"
+
+#: modules/process/linematch.c:158
+msgid "linematch|Matching"
+msgstr "linematch|Correspondendo"
+
+#: modules/process/linematch.c:159
+msgid "linematch|Polynomial"
+msgstr "linematch|Polinomial"
+
+#: modules/process/linematch.c:165
+msgid "Aligns rows by various methods."
+msgstr "Alinha linhas por vários métodos."
+
+#: modules/process/linematch.c:179
+msgid "/_Correct Data/_Align rows..."
+msgstr "/_Corrigir dados/_Alinhar linhas..."
+
+#: modules/process/linematch.c:183
+msgid "Align rows using various methods"
+msgstr "Alinha linhas usando vários métodos"
+
+#: modules/process/linematch.c:234 modules/process/linematch.c:262
+msgid "Row background"
+msgstr "Linha de fundo"
+
+#: modules/process/linematch.c:263
+msgid "Vertical position"
+msgstr "Posição vertical"
+
+#: modules/process/linematch.c:264
+msgid "Corrected offset"
+msgstr "Afastamento corrigido"
+
+#: modules/process/linematch.c:769
+msgid "Align Rows"
+msgstr "Alinhar linhas"
+
+#: modules/process/linematch.c:810
+msgid "_Polynomial degree:"
+msgstr "Grau _polinomial:"
+
+#: modules/process/linematch.c:844
+msgid "Plot background _graph"
+msgstr "Plotar _gráfico de fundo"
+
+#: modules/process/lno_synth.c:259 modules/process/noise_synth.c:186
+msgid "distribution|Triangular"
+msgstr "distribuição|Triangular"
+
+#: modules/process/lno_synth.c:265 modules/process/pat_synth.c:213
+msgid "Steps"
+msgstr "Passos"
+
+#: modules/process/lno_synth.c:266
+msgid "Scars"
+msgstr "Ranhuras"
+
+#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:214
+msgid "Ridges"
+msgstr "Cumes"
+
+#: modules/process/lno_synth.c:273
+msgid "Generates various kinds of line noise."
+msgstr "Gera vários tipos de ruído de linha."
+
+#: modules/process/lno_synth.c:287
+msgid "/S_ynthetic/_Line Noise..."
+msgstr "/Sintético/Ruído de _linha..."
+
+#: modules/process/lno_synth.c:291
+msgid "Generate line noise"
+msgstr "Gerar ruídos de linha"
+
+#: modules/process/lno_synth.c:429
+msgid "Line Noise"
+msgstr "Ruídos de linha"
+
+#: modules/process/lno_synth.c:502
+msgid "Distribution"
+msgstr "Distribuição"
+
+#: modules/process/lno_synth.c:512 modules/process/mask_noisify.c:158
+#: modules/process/noise_synth.c:412
+#, fuzzy
+msgid "Noise type:"
+msgstr "Tipo de ruído:"
+
+#: modules/process/lno_synth.c:521 modules/process/mask_noisify.c:167
+#: modules/process/noise_synth.c:421
+msgid "S_ymmetrical"
+msgstr "Simétrico"
+
+#: modules/process/lno_synth.c:522 modules/process/mask_noisify.c:168
+#: modules/process/noise_synth.c:422
+msgid "One-sided _positive"
+msgstr "De apenas um lado _positivo"
+
+#: modules/process/lno_synth.c:523 modules/process/mask_noisify.c:169
+#: modules/process/noise_synth.c:423
+msgid "One-sided _negative"
+msgstr "De apenas um lado _negativo"
+
+#: modules/process/lno_synth.c:544
+msgid "Noise Type"
+msgstr "Tipo de ruído"
+
+#: modules/process/lno_synth.c:549
+msgid "_Noise type:"
+msgstr "Tipo de ruído:"
+
+#: modules/process/lno_synth.c:863 modules/process/lno_synth.c:1233
+msgid "_Within line:"
+msgstr "Dentro da linha:"
+
+#: modules/process/lno_synth.c:870
+msgid "C_umulative"
+msgstr "C_umulativo"
+
+#: modules/process/lno_synth.c:1243
+msgid "Wi_dth:"
+msgstr "Largura:"
+
+#: modules/process/local_contrast.c:77
+msgid "Maximizes local contrast."
+msgstr "Maximiza contraste local."
+
+#: modules/process/local_contrast.c:91
+msgid "/_Presentation/Local _Contrast..."
+msgstr "/A_presentação/_Contraste local..."
+
+#: modules/process/local_contrast.c:95
+msgid "Presentation with maximized local contrast"
+msgstr "Apresentação com contraste local maximizado"
+
+#: modules/process/local_contrast.c:128
+msgid "Increase Local Contrast"
+msgstr "Aumentar contraste local"
+
+#: modules/process/local_contrast.c:146 modules/process/rank.c:188
+msgid "Kernel _size:"
+msgstr "Tamanho do núcleo:"
+
+#: modules/process/local_contrast.c:150
+msgid "Blending _depth:"
+msgstr "Profundidade da combinação:"
+
+#: modules/process/logistic.c:122
+msgid "Trains logistic regression to mark grains."
+msgstr "Ensina regressão logística para marcar grãos."
+
+#: modules/process/logistic.c:136
+msgid "/_Grains/Logistic _Regression..."
+msgstr "/_Grãos/_Regressão logística..."
+
+#: modules/process/logistic.c:140
+msgid "Mark grains with logistic regression"
+msgstr "Marcar grãos com regressão logística"
+
+#: modules/process/logistic.c:231
+msgid "Logistic Regression"
+msgstr "Regressão logística"
+
+#: modules/process/logistic.c:254
+msgid "_Use trained regression"
+msgstr "_Usar regressão ensinada"
+
+#: modules/process/logistic.c:256
+msgid "_Train logistic regression"
+msgstr "Ensinar regressão logística"
+
+#: modules/process/logistic.c:274
+msgid "_Gaussian blur"
+msgstr "Borrão _Gaussiano"
+
+#: modules/process/logistic.c:285
+msgid "_Number of Gaussians:"
+msgstr "_Número de Gaussianas:"
+
+#: modules/process/logistic.c:293
+msgid "_Sobel derivatives"
+msgstr "Derivadas de _Sobel"
+
+#: modules/process/logistic.c:303
+msgid "_Laplacian"
+msgstr "_Laplaciano"
+
+#: modules/process/logistic.c:313
+msgid "_Hessian"
+msgstr "_Hessiano"
+
+#: modules/process/logistic.c:325
+msgid "_Regularization parameter:"
+msgstr "Parâmetro de _regularização:"
+
+#: modules/process/logistic.c:616 modules/process/neural.c:1108
+msgid "Training..."
+msgstr "Treinando..."
+
+#: modules/process/mark_disconn.c:104
+msgid "Creates mask of values disconnected to the rest."
+msgstr "Cria máscara de valores desconectados do restante."
+
+#: modules/process/mark_disconn.c:118
+msgid "/_Correct Data/Mask of _Disconnected..."
+msgstr "/_Corrigir dados/Máscara de _desconectados..."
+
+#: modules/process/mark_disconn.c:122
+msgid "Mark data disconnected from other values"
+msgstr "Marcar dados desconectados de outros valores"
+
+#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:419
+#: modules/process/scars.c:297
+msgid "Positive"
+msgstr "Positivo"
+
+#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:420
+#: modules/process/scars.c:298
+msgid "Negative"
+msgstr "Negativo"
+
+#: modules/process/mark_disconn.c:201
+msgid "Mark Disconnected"
+msgstr "Marcar desconectados"
+
+#: modules/process/mark_disconn.c:249
+msgid "Defect type:"
+msgstr "Tipo de defeito:"
+
+#: modules/process/mark_disconn.c:263
+msgid "Defect _radius:"
+msgstr "_Raio do defeito:"
+
+#: modules/process/mark_disconn.c:552
+msgid "Filtering..."
+msgstr "Filtrando..."
+
+#: modules/process/mark_disconn.c:579
+msgid "Marking outliers..."
+msgstr "Marcando isolados..."
+
+#: modules/process/mark_with.c:139
+msgid "Creates or modifies a mask using other channels."
+msgstr "Cria ou modifica uma máscara usando outros canais."
+
+#: modules/process/mark_with.c:153
+msgid "/_Mask/Mark _With..."
+msgstr "/_Máscara/Marcar com..."
+
+#: modules/process/mark_with.c:157
+msgid "Mask combining and modification"
+msgstr "Combinação e modificação de máscara"
+
+#: modules/process/mark_with.c:193
+msgid "Mark With"
+msgstr "Marcar com"
+
+#: modules/process/mark_with.c:231 modules/process/mask_morph.c:209
+msgid "Operation:"
+msgstr "Operação:"
+
+#: modules/process/mark_with.c:239
+msgid "Se_t mask"
+msgstr "Definir máscara"
+
+#: modules/process/mark_with.c:240
+msgid "_Add mask"
+msgstr "_Adicionar máscara"
+
+#: modules/process/mark_with.c:241
+msgid "_Subtract mask"
+msgstr "_Subtrair máscara"
+
+#: modules/process/mark_with.c:242
+msgid "_Intersect masks"
+msgstr "Cruzar máscaras"
+
+#: modules/process/mark_with.c:248
+msgid "Mark with:"
+msgstr "Marcar com:"
+
+#: modules/process/mark_with.c:256
+msgid "with|_Mask"
+msgstr "com|Máscara"
+
+#: modules/process/mark_with.c:258
+msgid "with|_Data"
+msgstr "com|_Dados"
+
+#: modules/process/mark_with.c:260
+msgid "with|_Presentation"
+msgstr "com|A_presentação"
+
+#: modules/process/mark_with.c:297
+msgid "Marked data range:"
+msgstr "Intervalo de dados marcados:"
+
+#: modules/process/mark_with.c:305
+msgid "_Minimum:"
+msgstr "_Mínimo:"
+
+#: modules/process/mark_with.c:314
+msgid "M_aximum:"
+msgstr "Máximo:"
+
+#: modules/process/mark_with.c:382
+msgid "Operand"
+msgstr "Operando"
+
+#: modules/process/mask_distribute.c:87
+msgid "Distributes masks to other channels."
+msgstr "Distribui máscaras para outros canais."
+
+#: modules/process/mask_distribute.c:101
+msgid "/_Mask/_Distribute..."
+msgstr "/_Máscara/_Distribuir..."
+
+#: modules/process/mask_distribute.c:105
+msgid "Distribute mask to other channels"
+msgstr "Distribui máscara para outros canais"
+
+#: modules/process/mask_distribute.c:141
+msgid "Channels within the file"
+msgstr "Canais com o arquivo"
+
+#: modules/process/mask_distribute.c:142
+msgid "Channels in all files"
+msgstr "Canais em todos os arquivos"
+
+#: modules/process/mask_distribute.c:151
+msgid "Distribute Mask"
+msgstr "Distribuir máscara"
+
+#: modules/process/mask_distribute.c:166
+msgid "Distribute to:"
+msgstr "Distribuir para:"
+
+#: modules/process/mask_distribute.c:179
+msgid "Preserve existing masks"
+msgstr "Preservar máscaras existentes"
+
+#: modules/process/mask_edt.c:89
+msgid "Performs simple and true Euclidean distance transforms of masks."
+msgstr ""
+"Realiza transformadas de distâncias Euclidianas simples e verdadeira de "
+"máscaras."
+
+#: modules/process/mask_edt.c:103
+msgid "/_Mask/Distanc_e Transform..."
+msgstr "/_Máscara/Transformada de distância..."
+
+#: modules/process/mask_edt.c:107
+msgid "Distance transform of mask"
+msgstr "Transformada de distância de máscara"
+
+#: modules/process/mask_edt.c:110
+msgid "/_Mask/Thi_n"
+msgstr "/_Máscara/Fi_na"
+
+#: modules/process/mask_edt.c:114
+msgid "Thin mask"
+msgstr "Máscara fina"
+
+#: modules/process/mask_edt.c:164 modules/process/mask_edt.c:186
+msgid "Distance Transform"
+msgstr "Transformada de distância"
+
+#: modules/process/mask_edt.c:174
+msgid "Interior"
+msgstr "Interior"
+
+#: modules/process/mask_edt.c:175
+msgid "Exterior"
+msgstr "Exterior"
+
+#: modules/process/mask_edt.c:176
+msgid "Two-sided"
+msgstr "Em dois lados"
+
+#: modules/process/mask_edt.c:207 modules/tools/maskedit.c:640
+msgid "_Distance type:"
+msgstr "Tipo de _distância:"
+
+#: modules/process/mask_edt.c:228 modules/tools/maskedit.c:646
+msgid "Shrink from _border"
+msgstr "Reduzir a partir da _borda"
+
+#: modules/process/mask_morph.c:116
+msgid "Performs basic morphological operations with masks."
+msgstr "Realiza operações morfológicas básicas com máscaras."
+
+#: modules/process/mask_morph.c:130
+#, fuzzy
+msgid "/_Mask/Morpho_logical Operation..."
+msgstr "/_Máscara/Operação morfológica..."
+
+#: modules/process/mask_morph.c:134
+msgid "Morphological operation with mask"
+msgstr "Operações morfológicas com máscara"
+
+#: modules/process/mask_morph.c:168
+msgid "Erosion"
+msgstr "Erosão"
+
+#: modules/process/mask_morph.c:169
+msgid "Dilation"
+msgstr "Dilatação"
+
+#: modules/process/mask_morph.c:170 modules/tools/filter.c:243
+msgid "filter|Opening"
+msgstr "filtrar|Abertura"
+
+#: modules/process/mask_morph.c:171 modules/tools/filter.c:244
+msgid "filter|Closing"
+msgstr "filtrar|Fechamento"
+
+#: modules/process/mask_morph.c:172 modules/tools/filter.c:245
+msgid "ASF Opening"
+msgstr "Abertura ASF"
+
+#: modules/process/mask_morph.c:173 modules/tools/filter.c:246
+msgid "ASF Closing"
+msgstr "Fechamento ASF"
+
+#: modules/process/mask_morph.c:177
+msgid "Octagon"
+msgstr "Octágono"
+
+#: modules/process/mask_morph.c:180
+msgid "Another mask"
+msgstr "Outra máscara"
+
+#: modules/process/mask_morph.c:191
+msgid "Morphological Operation"
+msgstr "Operação morfológica"
+
+#: modules/process/mask_morph.c:223
+msgid "Structuring element:"
+msgstr "Elemento estruturante:"
+
+#: modules/process/mask_morph.c:237 modules/tools/maskedit.c:528
+msgid "_Radius:"
+msgstr "_Raio:"
+
+#: modules/process/mask_morph.c:248
+msgid "_Mask:"
+msgstr "_Máscara:"
+
+#: modules/process/mask_morph.c:258
+msgid "_Trim empty borders"
+msgstr "Aparar bordas vazias"
+
+#: modules/process/mask_noisify.c:83
+msgid "Adds salt and/or pepper noise to mask."
+msgstr ""
+
+#: modules/process/mask_noisify.c:97
+#, fuzzy
+msgid "/_Mask/_Noisify..."
+msgstr "/_Máscara/_Distribuir..."
+
+#: modules/process/mask_noisify.c:101
+#, fuzzy
+msgid "Add noise to mask"
+msgstr "Adicionar seleção para máscara"
+
+#: modules/process/mask_noisify.c:141
+msgid "Noisify Mask"
+msgstr ""
+
+#: modules/process/mask_noisify.c:184
+#, fuzzy
+msgid "_Alter only boundaries"
+msgstr "Usar fronteiras"
+
+#: modules/process/maskcor.c:87
+msgid "Creates mask by correlation with another data."
+msgstr "Cria máscara por correlação com outros dados."
+
+#: modules/process/maskcor.c:101
+msgid "/M_ultidata/_Mask by Correlation..."
+msgstr "/M_ultidados/_Máscara por correlação..."
+
+#: modules/process/maskcor.c:105
+msgid "Create mask by correlation with another data"
+msgstr "Criar máscara por correlação com outros dados"
+
+#: modules/process/maskcor.c:142
+msgid "Mask by Correlation"
+msgstr "Máscara por correlação"
+
+#: modules/process/maskcor.c:166
+msgid "Correlation _kernel:"
+msgstr "Núcleo da correlação:"
+
+#: modules/process/maskcor.c:173
+msgid "Objects marked"
+msgstr "Objetos marcados"
+
+#: modules/process/maskcor.c:174
+msgid "Correlation maxima"
+msgstr "Máximo da correlação"
+
+#: modules/process/maskcor.c:175 modules/process/maskcor.c:360
+msgid "Correlation score"
+msgstr "Resultado da correlação"
+
+#: modules/process/maskcor.c:185
+msgid "Correlation _method:"
+msgstr "_Método da correlação:"
+
+#: modules/process/maskops.c:46
+msgid "Basic operations with mask: inversion, removal, extraction."
+msgstr "Operações básicas com: inversão, remoção, extração."
+
+#: modules/process/maskops.c:60
+msgid "/_Mask/_Remove Mask"
+msgstr "/_Máscara/_Remover máscara"
+
+#: modules/process/maskops.c:64
+msgid "Remove mask from data"
+msgstr "Remover máscara a partir dos dados"
+
+#: modules/process/maskops.c:67
+msgid "/_Mask/_Invert Mask"
+msgstr "/_Máscara/_Inverter máscara"
+
+#: modules/process/maskops.c:71
+msgid "Invert mask"
+msgstr "Inverter máscara"
+
+#: modules/process/maskops.c:74
+msgid "/_Mask/_Extract Mask"
+msgstr "/_Máscara/_Extrair máscara"
+
+#: modules/process/maskops.c:78
+#, fuzzy
+msgid "Extract mask to a new image"
+msgstr "Extrair máscara para um novo canal"
+
+#: modules/process/maskops.c:81
+msgid "/_Grains/_Remove Edge-Touching"
+msgstr "/_Grãos/_Remover os que tocam na borda"
+
+#: modules/process/maskops.c:85
+msgid "Remove grains touching image edges"
+msgstr "Remover grãos tocando bordas da imagem"
+
+#: modules/process/mcrop.c:60
+msgid "Crops non-intersecting regions of two images."
+msgstr "Apara regiões sem intersecção de duas imagens."
+
+#: modules/process/mcrop.c:74
+msgid "/M_ultidata/Mutual C_rop..."
+msgstr "/M_ulti-dados/Aparamento mútuo..."
+
+#: modules/process/mcrop.c:78
+msgid "Crop non-intersecting regions of two images"
+msgstr "Aparar regiões sem intersecção de duas imagens"
+
+#: modules/process/mcrop.c:153
+msgid "Mutual Crop"
+msgstr "Aparamento mútuo"
+
+#: modules/process/mcrop.c:173
+msgid "_Select second argument:"
+msgstr "_Selecionar segundo argumento:"
+
+#: modules/process/measure_lattice.c:165
+msgid "Measures parameters of two-dimensional lattices."
+msgstr "Mede parâmetros de redes bidimensionais."
+
+#: modules/process/measure_lattice.c:179
+msgid "/_Statistics/Measure _Lattice..."
+msgstr "/E_statísticas/Medir rede..."
+
+#: modules/process/measure_lattice.c:183
+msgid "Measure lattice"
+msgstr "Medir rede"
+
+#: modules/process/measure_lattice.c:243
+msgid "Measure Lattice"
+msgstr "Medir rede"
+
+#: modules/process/measure_lattice.c:320
+msgid "_ACF"
+msgstr "_ACF"
+
+#: modules/process/measure_lattice.c:321
+msgid "_PSDF"
+msgstr "_PSDF"
+
+#: modules/process/measure_lattice.c:356
+msgid "Show lattice as:"
+msgstr "Exibir rede como:"
+
+#: modules/process/measure_lattice.c:365
+msgid "_Lattice"
+msgstr "Rede"
+
+#: modules/process/measure_lattice.c:366
+msgid "_Vectors"
+msgstr "Vetores"
+
+#: modules/process/measure_lattice.c:589
+msgid "Save Lattice Parameters"
+msgstr "Salvar parâmetros de rede"
+
+#: modules/process/measure_lattice.c:627
+#, c-format
+msgid "Vector %d:"
+msgstr "Vetor %d:"
+
+#: modules/process/measure_lattice.c:636
+#, c-format
+msgid "Length %d:"
+msgstr "Comprimento %d:"
+
+#: modules/process/measure_lattice.c:643
+#, c-format
+msgid "Angle %d:"
+msgstr "Ângulo %d:"
+
+#: modules/process/measure_lattice.c:657
+msgid "Angle:"
+msgstr "Ângulo:"
+
+#: modules/process/measure_lattice.c:673
+msgid "Lattice Parameters"
+msgstr "Parâmetros de rede"
+
+#: modules/process/median-bg.c:83
+msgid "Subtracts background using a rank-based algorithm."
+msgstr "Subtrai fundo usando um algorítimo baseado em classificação."
+
+#: modules/process/median-bg.c:97
+msgid "/_Level/_Median Level..."
+msgstr "/Nive_lar/Nivelamento _mediano..."
+
+#: modules/process/median-bg.c:101
+msgid "Level data by local median subtraction"
+msgstr "Nivelar dados por subtração de mediano local"
+
+#: modules/process/median-bg.c:146
+msgid "Median-leveling..."
+msgstr "Nivelamento mediano..."
+
+#: modules/process/median-bg.c:179
+msgid "Median Level"
+msgstr "Nivelamento mediano"
+
+#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:336
+msgid "Real _radius:"
+msgstr "_Raio real:"
+
+#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:346
+msgid "_Pixel radius:"
+msgstr "Raio do _pixel:"
+
+#: modules/process/merge.c:182
+msgid "Up"
+msgstr "Acima"
+
+#: modules/process/merge.c:183
+msgid "Down"
+msgstr "Abaixo"
+
+#: modules/process/merge.c:184
+msgid "adverb|Right"
+msgstr "Direita"
+
+#: modules/process/merge.c:185
+msgid "adverb|Left"
+msgstr "Esquerda"
+
+#: modules/process/merge.c:189
+msgid "Correlation"
+msgstr "Correlação"
+
+#: modules/process/merge.c:190
+msgid "merge-mode|Join"
+msgstr "Unir"
+
+#: modules/process/merge.c:191
+msgid "merge-mode|None"
+msgstr "Nenhum"
+
+#: modules/process/merge.c:195
+msgid "First operand"
+msgstr "Primeiro operando"
+
+#: modules/process/merge.c:196
+msgid "Second operand"
+msgstr "Segundo operando"
+
+#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:612
+msgid "Average"
+msgstr "Média"
+
+#: modules/process/merge.c:198
+msgid "Interpolation"
+msgstr "Interpolação"
+
+#: modules/process/merge.c:215
+msgid "Merges two images."
+msgstr "Juntar duas imagens."
+
+#: modules/process/merge.c:229
+msgid "/M_ultidata/_Merge..."
+msgstr "/M_ulti-dados/Juntar..."
+
+#: modules/process/merge.c:233
+msgid "Merge two images"
+msgstr "Juntar duas imagens"
+
+#: modules/process/merge.c:277
+msgid "Merge Data"
+msgstr "Mesclar dados"
+
+#: modules/process/merge.c:302
+msgid "_Merge with:"
+msgstr "_Mesclar com:"
+
+#: modules/process/merge.c:311
+msgid "_Put second operand:"
+msgstr "Colocar segundo operando:"
+
+#: modules/process/merge.c:318
+msgid "_Align second operand:"
+msgstr "_Alinhar segundo operando:"
+
+#: modules/process/merge.c:327
+msgid "_Boundary treatment:"
+msgstr "Limite de tratamento:"
+
+#: modules/process/merge.c:331
+msgid "Crop result to _avoid outside pixels"
+msgstr "Cortar resultados para evitar pixeis de fora"
+
+#: modules/process/merge.c:342
+msgid "Add _mask of outside pixels"
+msgstr "Adicionar máscara de pixeis de fora"
+
+#: modules/process/merge.c:821
+msgid "Merged images"
+msgstr "Imagens mescladas"
+
+#: modules/process/mfm_current.c:163
+msgid "Simulation of current line magnetic field"
+msgstr ""
+
+#: modules/process/mfm_current.c:177
+msgid "/SPM M_odes/_MFM/_Current Line Field..."
+msgstr ""
+
+#: modules/process/mfm_current.c:181
+msgid "Simulate stray field above current line"
+msgstr ""
+
+#: modules/process/mfm_current.c:280 modules/process/mfm_parallel.c:282
+msgid "Simulated field"
+msgstr ""
+
+#: modules/process/mfm_current.c:322 modules/process/mfm_field.c:266
+#: modules/process/mfm_parallel.c:324
+#, fuzzy
+msgid "Point charge"
+msgstr "Pontos em qualquer lugar"
+
+#: modules/process/mfm_current.c:323 modules/process/mfm_field.c:267
+#: modules/process/mfm_parallel.c:325
+#, fuzzy
+msgid "Bar"
+msgstr "Binário"
+
+#: modules/process/mfm_current.c:330
+msgid "Current Line Stray Field"
+msgstr ""
+
+#: modules/process/mfm_current.c:415
+#, fuzzy
+msgid "Output"
+msgstr "Tipo de saída"
+
+#: modules/process/mfm_current.c:420 modules/process/mfm_field.c:320
+#: modules/process/mfm_parallel.c:415
+#, fuzzy
+msgid "_Output plane height:"
+msgstr "Tipo de saída:"
+
+#: modules/process/mfm_current.c:428
+#, fuzzy
+msgid "_Stripe width:"
+msgstr "Largura da inclinação:"
+
+#: modules/process/mfm_current.c:436
+#, fuzzy
+msgid "Stripe _current:"
+msgstr "Listra %u: "
+
+#: modules/process/mfm_current.c:444
+#, fuzzy
+msgid "_Position:"
+msgstr "Posição:"
+
+#: modules/process/mfm_current.c:461
+msgid "Probe"
+msgstr ""
+
+#: modules/process/mfm_current.c:469
+#, fuzzy
+msgid "P_robe type:"
+msgstr "Tipo de ruído:"
+
+#: modules/process/mfm_current.c:475 modules/process/mfm_field.c:389
+#: modules/process/mfm_parallel.c:482
+#, fuzzy
+msgid "Tip _magnetization:"
+msgstr "_Rotação da ponta:"
+
+#: modules/process/mfm_current.c:484 modules/process/mfm_field.c:397
+#: modules/process/mfm_parallel.c:491
+#, fuzzy
+msgid "Bar width _x:"
+msgstr "Largura da _borda:"
+
+#: modules/process/mfm_current.c:493 modules/process/mfm_field.c:405
+#: modules/process/mfm_parallel.c:500
+#, fuzzy
+msgid "Bar width _y:"
+msgstr "Largura da _borda:"
+
+#: modules/process/mfm_current.c:502 modules/process/mfm_field.c:413
+#: modules/process/mfm_parallel.c:509
+msgid "Bar length (_z):"
+msgstr ""
+
+#: modules/process/mfm_field.c:146
+msgid "Simulation of magnetic field above perpendicular media"
+msgstr ""
+
+#: modules/process/mfm_field.c:160
+msgid "/SPM M_odes/_MFM/_Perpendicular Media Field..."
+msgstr ""
+
+#: modules/process/mfm_field.c:164
+msgid "Compute stray field above perpendicular magnetic medium"
+msgstr ""
+
+#: modules/process/mfm_field.c:276
+msgid "Perpendicular Media Stray Field"
+msgstr ""
+
+#: modules/process/mfm_field.c:328 modules/process/mfm_parallel.c:423
+#, fuzzy
+msgid "_Film thickness:"
+msgstr "Espessura da moldura"
+
+#: modules/process/mfm_field.c:336
+msgid "_Magnetic charge:"
+msgstr ""
+
+#: modules/process/mfm_field.c:344
+msgid "Include domain _walls"
+msgstr ""
+
+#: modules/process/mfm_field.c:354
+#, fuzzy
+msgid "_Exchange constant:"
+msgstr "Aleatório constante"
+
+#: modules/process/mfm_field.c:362
+msgid "_Uniaxial anisotropy:"
+msgstr ""
+
+#: modules/process/mfm_field.c:383 modules/process/mfm_parallel.c:476
+#, fuzzy
+msgid "_Probe type:"
+msgstr "Tipo de ruído:"
+
+#: modules/process/mfm_findshift.c:88
+msgid "Lift height difference estimation from data blur"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:102
+msgid "/SPM M_odes/_MFM/_Estimate Shift in Z..."
+msgstr ""
+
+#: modules/process/mfm_findshift.c:106
+msgid "Estimate lift height difference in MFM data"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:166 modules/process/psf.c:340
+#, fuzzy
+msgid "Searching..."
+msgstr "Escaneando..."
+
+#: modules/process/mfm_findshift.c:196
+#, fuzzy
+msgid "Estimated shift:"
+msgstr "Ponta estimada"
+
+#: modules/process/mfm_findshift.c:211
+#, fuzzy
+msgid "Shifted field difference"
+msgstr "Mediana das diferenças"
+
+#: modules/process/mfm_findshift.c:228
+msgid "Estimate Lift Height Shift"
+msgstr ""
+
+#: modules/process/mfm_findshift.c:255
+#, fuzzy
+msgid "Data to compare:"
+msgstr "Formato dos dados:"
+
+#: modules/process/mfm_findshift.c:261
+#, fuzzy
+msgid "Search _from:"
+msgstr "Intervalo de busca:"
+
+#: modules/process/mfm_findshift.c:269
+#, fuzzy
+msgid "Search _to:"
+msgstr "Intervalo de busca:"
+
+#: modules/process/mfm_parallel.c:165
+#, fuzzy
+msgid "Simulation of parallel magnetic media"
+msgstr "Parâmetros de simulação"
+
+#: modules/process/mfm_parallel.c:179
+msgid "/SPM M_odes/_MFM/Para_llel Media Field..."
+msgstr ""
+
+#: modules/process/mfm_parallel.c:183
+msgid "Simulate stray field above parallel magnetic medium"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:331
+msgid "Parallel Media Stray Field"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:431
+#, fuzzy
+msgid "_Remanent magnetization:"
+msgstr "_Rotação da ponta:"
+
+#: modules/process/mfm_parallel.c:439
+msgid "Size _A (dir. left):"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:447
+msgid "Size _B (dir. right):"
+msgstr ""
+
+#: modules/process/mfm_parallel.c:455
+#, fuzzy
+msgid "_Gap size:"
+msgstr "Tamanho da amo_stra:"
+
+#: modules/process/mfm_shift.c:87
+msgid "Simulation of magnetic field z component change for another level"
+msgstr ""
+
+#: modules/process/mfm_shift.c:101
+msgid "/SPM M_odes/_MFM/_Field Shift in Z..."
+msgstr ""
+
+#: modules/process/mfm_shift.c:105
+msgid "Compute stray field shift for another z level"
+msgstr ""
+
+#: modules/process/mfm_shift.c:146
+msgid "Shifted field"
+msgstr ""
+
+#: modules/process/mfm_shift.c:164
+msgid "Stray Field Plane Shift"
+msgstr ""
+
+#: modules/process/mfm_shift.c:209
+#, fuzzy
+msgid "_Z shift by:"
+msgstr "Deslocamento _Z:"
+
+#: modules/process/nanoindent_adjust.c:89
+msgid "Adjust images of two indentor prints."
+msgstr "Ajustar imagens de duas impressões de indentadores."
+
+#: modules/process/nanoindent_adjust.c:103
+msgid "/_Tip and Indentation/Ad_just..."
+msgstr "/Indicação e indentação/Ajustar..."
+
+#: modules/process/nanoindent_adjust.c:107
+msgid "Adjust two nanoindentation imprints"
+msgstr "Ajustar duas impressões de nano indentação."
+
+#: modules/process/nanoindent_adjust.c:160
+msgid "Imprints adjustment"
+msgstr "Ajuste de impressão"
+
+#: modules/process/nanoindent_adjust.c:175
+msgid "_Indentor model imprint:"
+msgstr "Impressão de modelo de _indentador:"
+
+#: modules/process/nanoindent_adjust.c:186
+msgid "Imprint to be _adjusted:"
+msgstr "Impressão a ser ajustada:"
+
+#: modules/process/nanoindent_adjust.c:197
+msgid "_Move data"
+msgstr "_Mover dados"
+
+#: modules/process/nanoindent_adjust.c:206
+msgid "_Rotate data"
+msgstr "Gi_rar dados"
+
+#: modules/process/nanoindent_adjust.c:215
+msgid "E_xtrapolate result data out of measured range"
+msgstr "Extrapolar dados de resultados para fora do intervalo medido"
+
+#: modules/process/nanoindent_adjust.c:296
+msgid ""
+"Tip has different range/resolution ratio than image. Tip will be resampled."
+msgstr ""
+"Extremidade possui razão intervalo/resolução diferente da imagem. "
+"Extremidade será re-amostrada."
+
+#: modules/process/nanoindent_adjust.c:335
+msgid "Immersed detail data"
+msgstr "Dados imersos do detalhe"
+
+#: modules/process/neural.c:204
+msgid "Neural network SPM data processing"
+msgstr "Processamento de dados de rede neural SPM"
+
+#: modules/process/neural.c:230
+msgid "/M_ultidata/Neural Network _Training..."
+msgstr "/M_ulti-dados/Treinamento de rede neural..."
+
+#: modules/process/neural.c:234
+msgid "Train a neural network for image processing"
+msgstr "Treinar uma rede neural para processamento de imagem"
+
+#: modules/process/neural.c:238
+msgid "/M_ultidata/Apply _Neural Network..."
+msgstr "/M_ulti-dados/Aplicar rede _neural..."
+
+#: modules/process/neural.c:242
+msgid "Process data using a trained neural network"
+msgstr "Processar dados usando uma rede neural treinada"
+
+#. TRANSLATORS: Unnamed neural network that is/was in training.
+#: modules/process/neural.c:391
+msgid "In training"
+msgstr "Em treinamento"
+
+#: modules/process/neural.c:475
+msgid "Neural Network Training"
+msgstr "Treinamento de rede neural"
+
+#: modules/process/neural.c:494
+msgid "Training error"
+msgstr "Erro no treinamento"
+
+#: modules/process/neural.c:495
+msgid "error"
+msgstr "erro"
+
+#: modules/process/neural.c:504
+msgid "NN training error"
+msgstr "Erro no treinamento RN"
+
+#: modules/process/neural.c:517
+msgid "Training"
+msgstr "Treinando"
+
+#: modules/process/neural.c:521
+msgid "_Model:"
+msgstr "_Modelo:"
+
+#: modules/process/neural.c:532
+msgid "_Signal:"
+msgstr "_Sinal:"
+
+#: modules/process/neural.c:544
+msgid "Training ste_ps:"
+msgstr "Passos do treinamento:"
+
+#: modules/process/neural.c:561
+msgid "Model"
+msgstr "Modelo"
+
+#: modules/process/neural.c:562
+msgid "Signal"
+msgstr "Sinal"
+
+#: modules/process/neural.c:579
+msgid "verb|_Train"
+msgstr "Treinar"
+
+#: modules/process/neural.c:584
+msgid "Re_initialize"
+msgstr "Re_inicializar"
+
+#: modules/process/neural.c:617
+msgid "Network"
+msgstr "Rede"
+
+#: modules/process/neural.c:623
+msgid "Window _width:"
+msgstr "Largura da janela:"
+
+#: modules/process/neural.c:631
+msgid "Window h_eight:"
+msgstr "Altura da janela:"
+
+#: modules/process/neural.c:639
+msgid "_Hidden nodes:"
+msgstr "Nodos escondidos:"
+
+#: modules/process/neural.c:647
+msgid "Result Units"
+msgstr "Unidades do resultado"
+
+#: modules/process/neural.c:654
+msgid "Power of source _XY:"
+msgstr "Potência da fonte _XY:"
+
+#: modules/process/neural.c:663
+msgid "Power of source _Z:"
+msgstr "Potência da fonte _Z:"
+
+#: modules/process/neural.c:672
+msgid "_Fixed units:"
+msgstr "Unidades fixas:"
+
+#: modules/process/neural.c:683
+msgid "Networks"
+msgstr "Redes"
+
+#: modules/process/neural.c:730
+msgid "Network _name:"
+msgstr "_Nome da rede:"
+
+#: modules/process/neural.c:782
+msgid "Apply Neural Network"
+msgstr "Aplicar rede neural"
+
+#: modules/process/neural.c:805
+msgid "_Scale proportionally to input"
+msgstr "Dimensionar escala proporcionalmente à entrada"
+
+#: modules/process/neural.c:936
+msgid "Model and signal are not compatible."
+msgstr "Modelo e sinal não são compatíveis."
+
+#: modules/process/neural.c:944
+msgid "A field dimension is too small for chosen window size."
+msgstr ""
+"Uma dimensão de campo é muito pequena para o tamanho da janela escolhida."
+
+#: modules/process/neural.c:1190 modules/process/neural.c:1356
+msgid "Evaluating..."
+msgstr "Avaliando..."
+
+#: modules/process/neural.c:1316
+msgid "Training was canceled."
+msgstr "O treinamento foi cancelado."
+
+#: modules/process/neural.c:1326
+#, c-format
+msgid "Mean difference: %.*f %s"
+msgstr "Diferença média: %.*f %s"
+
+#: modules/process/neural.c:1378
+msgid "Evaluated signal"
+msgstr "Sinal avaliado"
+
+#: modules/process/noise_synth.c:194
+msgid "Generates uncorrelated random noise."
+msgstr "Gera ruídos aleatórios não correlacionados."
+
+#: modules/process/noise_synth.c:208
+msgid "/S_ynthetic/_Noise..."
+msgstr "/Sintético/Ruído..."
+
+#: modules/process/noise_synth.c:212
+msgid "Generate surface of uncorrelated noise"
+msgstr "Gera superfície de ruídos não correlacionados"
+
+#: modules/process/noise_synth.c:332
+msgid "Random Noise"
+msgstr "Ruído aleatório"
+
+#: modules/process/obj_synth.c:270
+msgid "Spheres"
+msgstr "Esferas"
+
+#: modules/process/obj_synth.c:271
+msgid "Boxes"
+msgstr "Caixas"
+
+#: modules/process/obj_synth.c:272
+msgid "Cones"
+msgstr "Cones"
+
+#: modules/process/obj_synth.c:273
+msgid "Pyramids"
+msgstr "Pirâmides"
+
+#: modules/process/obj_synth.c:274
+msgid "Diamonds"
+msgstr "Diamantes"
+
+#: modules/process/obj_synth.c:275
+msgid "Tetrahedrons"
+msgstr "Tetraedros"
+
+#: modules/process/obj_synth.c:276
+msgid "Nuggets"
+msgstr "Pepitas"
+
+#: modules/process/obj_synth.c:277
+msgid "Thatches"
+msgstr "Porcas"
+
+#: modules/process/obj_synth.c:278
+msgid "Tents"
+msgstr "Tendas"
+
+#: modules/process/obj_synth.c:279
+msgid "Gaussians"
+msgstr "Gaussianas"
+
+#: modules/process/obj_synth.c:280
+msgid "Doughnuts"
+msgstr "Roscas"
+
+#: modules/process/obj_synth.c:281
+#, fuzzy
+msgid "Parabolic bumps"
+msgstr "Passo parabólico"
+
+#: modules/process/obj_synth.c:287
+msgid "Generates randomly patterned surfaces by placing objects."
+msgstr "Gera superfícies padronizadas aleatórias colocando objetos."
+
+#: modules/process/obj_synth.c:301
+#, fuzzy
+msgid "/S_ynthetic/_Deposition/_Objects..."
+msgstr "/Sintético/_Objetos..."
+
+#: modules/process/obj_synth.c:305
+msgid "Generate surface of randomly placed objects"
+msgstr "Gerar superfície de objetos posicionados aleatoriamente"
+
+#: modules/process/obj_synth.c:421
+msgid "Both (random)"
+msgstr "Ambos (aleatório)"
+
+#: modules/process/obj_synth.c:436
+msgid "Random Objects"
+msgstr "Objetos aleatórios"
+
+#: modules/process/obj_synth.c:549
+msgid "Aspect Ratio"
+msgstr "Razão de aspecto"
+
+#: modules/process/obj_synth.c:556
+msgid "_Aspect ratio:"
+msgstr "Razão de _aspecto:"
+
+#: modules/process/obj_synth.c:586
+msgid "Scales _with size"
+msgstr "Dimensiona escala com tamanho"
+
+#: modules/process/obj_synth.c:611
+msgid "_Feature type:"
+msgstr "Tipo de característica:"
+
+#: modules/process/otsu_threshold.c:40 modules/process/otsu_threshold.c:60
+msgid "Automated threshold using Otsu's method on heights."
+msgstr "Limiar automático usando o método de Otsu nas alturas."
+
+#: modules/process/otsu_threshold.c:56
+#, fuzzy
+msgid "/_Grains/_Mark by Otsu's"
+msgstr "/_Grãos/_Marcar por Otsu..."
+
+#: modules/process/outliers.c:41
+msgid "Creates mask of outliers."
+msgstr "Cria máscara de isolados."
+
+#: modules/process/outliers.c:55
+msgid "/_Correct Data/Mask of _Outliers"
+msgstr "/_Corrigir dados/Máscara de isolados"
+
+#: modules/process/outliers.c:59
+msgid "Mark data farther than 3σ from mean value"
+msgstr "Marcar dados mais distantes do que 3σ do valor médio"
+
+#: modules/process/pat_synth.c:221
+msgid "Generates surfaces representing simple patterns (steps, ridges, ...)."
+msgstr "Gera superfícies representando padrões simples (passos, cumes, ...)."
+
+#: modules/process/pat_synth.c:236
+msgid "/S_ynthetic/_Pattern..."
+msgstr "/Sintético/_Padrão..."
+
+#: modules/process/pat_synth.c:240
+msgid "Generate patterned surface"
+msgstr "Gerar superfície padronizada"
+
+#: modules/process/pat_synth.c:383
+msgid "Pattern"
+msgstr "Padrão"
+
+#: modules/process/pat_synth.c:458
+msgid "_Pattern:"
+msgstr "_Padrão:"
+
+#: modules/process/pat_synth.c:813
+msgid "Flat"
+msgstr "Achatado"
+
+#: modules/process/pat_synth.c:821
+msgid "_Flat width:"
+msgstr "Largura do achatamento:"
+
+#: modules/process/pat_synth.c:838 modules/process/pat_synth.c:1140
+#: modules/process/pat_synth.c:1475
+msgid "_Slope width:"
+msgstr "Largura da inclinação:"
+
+#: modules/process/pat_synth.c:1100
+msgid "Top"
+msgstr "Topo"
+
+#: modules/process/pat_synth.c:1107
+msgid "Flat _top width:"
+msgstr "Largura do _topo achatado:"
+
+#: modules/process/pat_synth.c:1115
+msgid "Bottom"
+msgstr "Base"
+
+#: modules/process/pat_synth.c:1123
+msgid "Flat _bottom width:"
+msgstr "Largura da _base achatada:"
+
+#: modules/process/pat_synth.c:1441
+msgid "_Distance:"
+msgstr "_Distância:"
+
+#: modules/process/phase_synth.c:136
+#, fuzzy
+msgid "Generates phase-separated structures."
+msgstr "Gerar superfície padronizada"
+
+#: modules/process/phase_synth.c:150
+#, fuzzy
+msgid "/S_ynthetic/P_hases..."
+msgstr "/Sintético/Ondas..."
+
+#: modules/process/phase_synth.c:154
+#, fuzzy
+msgid "Generate surface with separated phases"
+msgstr "Gera superfície de ruídos não correlacionados"
+
+#: modules/process/phase_synth.c:203
+#, fuzzy
+msgid "Separated Phases"
+msgstr "_Separar curvas"
+
+#: modules/process/phase_synth.c:287
+msgid "Size s_pread:"
+msgstr ""
+
+#: modules/process/pid.c:95
+msgid "A simple PID simulator"
+msgstr "Um similador PID simples"
+
+#: modules/process/pid.c:109
+msgid "/_Tip and Indentation/_PID simulation..."
+msgstr "/Indicação e indentação/Simulação _PID..."
+
+#: modules/process/pid.c:113
+msgid "Simulate PID effects on measurement"
+msgstr "Simular efeitos PID na medida"
+
+#: modules/process/pid.c:157
+msgid "PID FW result"
+msgstr "Resultado PID direto"
+
+#: modules/process/pid.c:166
+msgid "PID FW max. force"
+msgstr "Força máxima do PID direto"
+
+#: modules/process/pid.c:175
+msgid "PID REV result"
+msgstr "Resultado PID reverso"
+
+#: modules/process/pid.c:184
+msgid "PID REV max. force"
+msgstr "Força máxima do PID reverso"
+
+#: modules/process/pid.c:196
+msgid "PID simulation"
+msgstr "Simulação PID"
+
+#: modules/process/pid.c:214
+msgid "_Proportional:"
+msgstr "_Proporcional:"
+
+#: modules/process/pid.c:220
+msgid "_Integral:"
+msgstr "_Integral:"
+
+#: modules/process/pid.c:226
+msgid "_Integration steps:"
+msgstr "Passos da _integração:"
+
+#: modules/process/pid.c:234
+msgid "_Derivative:"
+msgstr "_Derivada:"
+
+#: modules/process/pid.c:240
+msgid "PID/scan speed _ratio:"
+msgstr "_Razão de velocidade PID/escaneamento:"
+
+#: modules/process/pid.c:255
+msgid "Force strength:"
+msgstr "Forçar resistência:"
+
+#: modules/process/pid.c:261
+msgid "Force setpoint:"
+msgstr "Forçar definição de ponto:"
+
+#: modules/process/pid.c:362
+msgid "Scanning..."
+msgstr "Escaneando..."
+
+#: modules/process/pid.c:401
+msgid "Computation diverged, try to change parameters"
+msgstr "O cálculo divergiu, tente modificar os parâmetros"
+
+#: modules/process/polydistort.c:134
+msgid "Applies polynomial distortion in the horizontal plane."
+msgstr "Aplica distorção polinomial no plano horizontal."
+
+#: modules/process/polydistort.c:148
+msgid "/_Distortion/Pol_ynomial..."
+msgstr "/_Distorção/Polinomial..."
+
+#: modules/process/polydistort.c:152
+msgid "Applies polynomial distortion in the horizontal plane"
+msgstr "Aplica distorção polinomial no plano horizontal"
+
+#: modules/process/polydistort.c:202
+msgid "Distort by Polynomial"
+msgstr "Distorcer por polinomial"
+
+#: modules/process/polydistort.c:285
+msgid "Ori_ginal"
+msgstr "Ori_ginal"
+
+#: modules/process/polydistort.c:286
+msgid "_Transformed"
+msgstr "_Transformado"
+
+#: modules/process/polydistort.c:292
+msgid "X Coefficients"
+msgstr "Coeficientes X"
+
+#: modules/process/polydistort.c:306
+msgid "Y Coefficients"
+msgstr "Coeficientes Y"
+
+#: modules/process/polydistort.c:502
+msgid "Distorted"
+msgstr "Distorcido"
+
+#: modules/process/polylevel.c:143
+msgid "Subtracts polynomial background."
+msgstr "Subtrai fundo polinomial."
+
+#: modules/process/polylevel.c:157
+msgid "/_Level/_Polynomial Background..."
+msgstr "/Nive_lar/Fundo _polinomial..."
+
+#: modules/process/polylevel.c:161
+msgid "Remove polynomial background"
+msgstr "Remove fundo polinomial"
+
+#: modules/process/polylevel.c:358
+msgid "Independent degrees"
+msgstr "Graus independentes"
+
+#: modules/process/polylevel.c:359
+msgid "Limited total degree"
+msgstr "Grau total limitado"
+
+#: modules/process/polylevel.c:371
+msgid "Remove Polynomial Background"
+msgstr "Remove fundo polinomial"
+
+#: modules/process/polylevel.c:412
+msgid "Leveled data"
+msgstr "Dados nivelados"
+
+#: modules/process/polylevel.c:442
+msgid "_Horizontal polynom degree:"
+msgstr "Grau do polinômio _horizontal:"
+
+#: modules/process/polylevel.c:451
+msgid "_Vertical polynom degree:"
+msgstr "Grau do polinômio _vertical:"
+
+#: modules/process/polylevel.c:458
+msgid "_Same degrees"
+msgstr "Mesmos graus"
+
+#: modules/process/polylevel.c:476
+msgid "_Maximum polynom degree:"
+msgstr "Grau _máximo do polinômio:"
+
+#: modules/process/polylevel.c:564
+msgid "Polynomial Coefficients"
+msgstr "Coeficientes polinomiais"
+
+#: modules/process/polylevel.c:937 modules/tools/distance.c:594
+#: modules/tools/selectionmanager.c:720
+msgid "Save Table"
+msgstr "Salvar tabela"
+
+#: modules/process/presentationops.c:56
+msgid "Basic operations with presentation: extraction, removal."
+msgstr "Operações básicas com apresentação: extração, remoção."
+
+#: modules/process/presentationops.c:70
+msgid "/_Presentation/_Remove Presentation"
+msgstr "/A_presentação/_Remover apresentação"
+
+#: modules/process/presentationops.c:74
+msgid "Remove presentation from data"
+msgstr "Remover apresentação a partir dos dados"
+
+#: modules/process/presentationops.c:77
+msgid "/_Presentation/E_xtract Presentation"
+msgstr "/A_presentação/E_xtrair apresentação"
+
+#: modules/process/presentationops.c:81
+#, fuzzy
+msgid "Extract presentation to a new image"
+msgstr "Extrair apresentação para um novo canal"
+
+#: modules/process/presentationops.c:84
+msgid "/_Presentation/_Attach Presentation..."
+msgstr "/A_presentação/_Anexar apresentação..."
+
+#: modules/process/presentationops.c:88
+msgid "Attach another data field as presentation"
+msgstr "Anexar outro campo de dados como apresentação"
+
+#: modules/process/presentationops.c:91
+msgid "/_Presentation/_Logscale"
+msgstr "/A_presentação/Escala _logarítmica"
+
+#: modules/process/presentationops.c:95
+msgid "Creates a presentation with logarithmic color scale"
+msgstr "Cria apresentação com escala de cores logarítmica"
+
+#: modules/process/presentationops.c:216
+msgid "Attach Presentation"
+msgstr "Anexar apresentação"
+
+#: modules/process/presentationops.c:230
+msgid "_Data to attach:"
+msgstr "_Dados para anexar:"
+
+#: modules/process/preview.h:245
+#, fuzzy
+msgid "Combine with existing mask:"
+msgstr "Com_binar com máscara existente"
+
+#: modules/process/psdf_logphi.c:76
+msgid ""
+"Two-dimensional FFT (Fast Fourier Transform) transformed to coordinates (log-"
+"frequency, angle)."
+msgstr ""
+"FFT (transformada de Fourier rápida) bidimensional transformada para "
+"coordenadas (log-frequência, ângulo)."
+
+#: modules/process/psdf_logphi.c:91
+msgid "/_Statistics/_Log-Phi PSDF..."
+msgstr "/E_statísticas/PSDF _Log-Phi..."
+
+#: modules/process/psdf_logphi.c:95
+msgid "Compute PSDF in Log-Phi coordinates"
+msgstr "Calcular PSDF em coordenadas Log-Phi."
+
+#: modules/process/psdf_logphi.c:248
+msgid "Log-Phi PSDF"
+msgstr "PSDF Log-Phi"
+
+#: modules/process/psdf_logphi.c:276 modules/process/wpour_mark.c:320
+msgid "Gaussian _smoothing:"
+msgstr "_Suavização gaussiana:"
+
+#: modules/process/psf-fit.c:165
+#, fuzzy
+msgid "Gaussian (asymmetric)"
+msgstr "_Suavização gaussiana:"
+
+#: modules/process/psf-fit.c:177
+msgid "Point spread function estimation by fitting explicit function form."
+msgstr ""
+
+#: modules/process/psf-fit.c:191
+#, fuzzy
+msgid "/_Statistics/_PSF Fit..."
+msgstr "/E_statísticas/Secção _PSDF..."
+
+#: modules/process/psf-fit.c:195
+msgid "Fit PSF from known data and image"
+msgstr ""
+
+#: modules/process/psf-fit.c:246 modules/process/psf.c:181
+#: modules/process/psf.c:230
+#, fuzzy
+msgid "PSF"
+msgstr "PSDF"
+
+#: modules/process/psf-fit.c:254 modules/process/psf.c:195
+msgid "PSF*P"
+msgstr ""
+
+#: modules/process/psf-fit.c:271
+#, fuzzy
+msgid "Fit PSF"
+msgstr "Ajustar forma"
+
+#: modules/process/psf-fit.c:289 modules/process/psf.c:286
+msgid "_Ideal response:"
+msgstr ""
+
+#: modules/process/psf.c:117
+#, fuzzy
+msgid "Point spread function estimation"
+msgstr "Estimativa cega da ponta."
+
+#: modules/process/psf.c:131
+#, fuzzy
+msgid "/_Statistics/_PSF Guess..."
+msgstr "/E_statísticas/Secção _PSDF..."
+
+#: modules/process/psf.c:135
+msgid "Estimate PSF from known data and image"
+msgstr ""
+
+#: modules/process/psf.c:208
+msgid "PSF*P - I"
+msgstr ""
+
+#: modules/process/psf.c:231
+#, fuzzy
+msgid "Convolved"
+msgstr "Convoluído _LoG"
+
+#: modules/process/psf.c:237
+#, fuzzy
+msgid "Estimate PSF"
+msgstr "Estimar"
+
+#: modules/process/psf.c:238
+#, fuzzy
+msgid "_Fit"
+msgstr "Ajustar"
+
+#: modules/process/psf.c:295
+#, fuzzy
+msgid "_Display:"
+msgstr "Exibir:"
+
+#: modules/process/psf.c:301
+#, fuzzy
+msgid "_Sigma init:"
+msgstr "_Sinal:"
+
+#: modules/process/rank.c:92
+msgid "Enhances local contrast using a rank transform."
+msgstr "Melhorar contraste local usando uma transformada de classificação."
+
+#: modules/process/rank.c:106
+msgid "/_Presentation/_Rank..."
+msgstr "/A_presentação/Classificação..."
+
+#: modules/process/rank.c:110
+msgid "Presentation with local contrast ehnanced using a rank transform"
+msgstr ""
+"Apresentação com contraste local melhorado usando uma transformada de "
+"classificação."
+
+#: modules/process/rank.c:144
+msgid "Rank transform"
+msgstr "Transformada de classificação"
+
+#: modules/process/rank.c:145
+msgid "Local normalization"
+msgstr "Normalização local"
+
+#: modules/process/rank.c:146
+msgid "Value range"
+msgstr "Intervalo de valor"
+
+#: modules/process/rank.c:156
+msgid "Rank Transform"
+msgstr "Transformada de classificação"
+
+#: modules/process/rank.c:173
+msgid "Filter type:"
+msgstr "Tipo de filtro:"
+
+#: modules/process/rank.c:269
+msgid "Rank transform..."
+msgstr "Transformada de classificação..."
+
+#: modules/process/rotate.c:96
+msgid "Rotates data by arbitrary angle."
+msgstr "Gira dados por um ângulo arbitrário."
+
+#: modules/process/rotate.c:110
+msgid "/_Basic Operations/Rotate by _Angle..."
+msgstr "/Operações _básicas/Girar por ângulo..."
+
+#: modules/process/rotate.c:114
+msgid "Rotate by arbitrary angle"
+msgstr "Girar por um ângulo arbitrário"
+
+#: modules/process/rotate.c:192 modules/volume/volume_swaxes.c:651
+msgid "Rotated Data"
+msgstr "Dados girados"
+
+#: modules/process/rotate.c:242
+msgid "Rotate"
+msgstr "Girar"
+
+#: modules/process/rotate.c:264
+msgid "Rotate by _angle:"
+msgstr "Girar por ângulo:"
+
+#: modules/process/rotate.c:280
+msgid "Show _grid"
+msgstr "Mostrar _grade"
+
+#: modules/process/rotate.c:290
+msgid "Create _mask over exterior"
+msgstr "Criar máscara sobre exterior"
+
+#: modules/process/rotate.c:300
+msgid "Result size:"
+msgstr "Tamanho do resultado:"
+
+#: modules/process/rotate.c:309
+msgid "_Same as original"
+msgstr "Me_smo que o original"
+
+#: modules/process/rotate.c:311
+msgid "_Expanded to complete data"
+msgstr "_Expandido para completar dados"
+
+#: modules/process/rotate.c:313
+msgid "C_ut to valid data"
+msgstr "Cortar para dados válidos"
+
+#: modules/process/scale.c:93
+msgid "Scales data by arbitrary factor."
+msgstr "Escala dados em um fator arbitrário."
+
+#: modules/process/scale.c:107
+msgid "/_Basic Operations/_Scale..."
+msgstr "/Operações _básicas/Escalar..."
+
+#: modules/process/scale.c:111
+msgid "Scale data"
+msgstr "Escalar dados"
+
+#: modules/process/scale.c:183
+msgid "Scaled Data"
+msgstr "Dados escalados"
+
+#: modules/process/scale.c:195
+msgid "verb|Scale"
+msgstr "Escalar"
+
+#: modules/process/scale.c:217
+msgid "Scale by _ratio:"
+msgstr "Escalar por _razão:"
+
+#: modules/process/scale.c:225
+msgid "_proportional"
+msgstr "_Proporcional"
+
+#: modules/process/scale.c:237
+msgid "New _width:"
+msgstr "Nova largura:"
+
+#: modules/process/scale.c:246
+msgid "New _height:"
+msgstr "Nova altura:"
+
+#: modules/process/scars.c:122
+msgid "Marks and/or removes scars (horizontal linear artifacts)."
+msgstr "Marca e/ou remove ranhuras (artefatos lineares horizontais)."
+
+#: modules/process/scars.c:136
+msgid "/_Correct Data/M_ark Scars..."
+msgstr "/_Corrigir dados/M_arcar ranhuras..."
+
+#: modules/process/scars.c:140
+msgid "Mark horizontal scars (strokes)"
+msgstr "Marcar ranhuras horizontais (golpes)"
+
+#: modules/process/scars.c:143
+msgid "/_Correct Data/Remove _Scars"
+msgstr "/_Corrigir dados/Remover ranhuras"
+
+#: modules/process/scars.c:147
+msgid "Correct horizontal scars (strokes)"
+msgstr "Corrigir ranhuras horizontais (golpes)"
+
+#: modules/process/scars.c:312
+msgid "Mark Scars"
+msgstr "Marcar ranhuras"
+
+#: modules/process/scars.c:353
+msgid "Maximum _width:"
+msgstr "Largura máxima:"
+
+#: modules/process/scars.c:361
+msgid "Minimum _length:"
+msgstr "Comprimento mínimo:"
+
+#: modules/process/scars.c:369
+msgid "_Hard threshold:"
+msgstr "Limiar rígido:"
+
+#: modules/process/scars.c:377
+msgid "_Soft threshold:"
+msgstr "Limiar suave:"
+
+#: modules/process/scars.c:385
+msgid "Scars type:"
+msgstr "Tipo de ranhuras:"
+
+#: modules/process/semsim.c:118
+msgid "Simple SEM image simulation from topography."
+msgstr "Simulação de imagem SEM simples a partir de topografia."
+
+#: modules/process/semsim.c:132
+msgid "/_Presentation/_SEM Image..."
+msgstr "/A_presentação/Imagem _SEM..."
+
+#: modules/process/semsim.c:136
+msgid "Simple SEM simulation from topography"
+msgstr "Simulação SEM simples a partir de topografia"
+
+#: modules/process/semsim.c:167 modules/process/semsim.c:209
+msgid "SEM Image"
+msgstr "Imagem SEM"
+
+#: modules/process/semsim.c:186
+msgid "SEM image simulation..."
+msgstr "Simulação de imagem SEM..."
+
+#: modules/process/semsim.c:227
+msgid "_Integration radius:"
+msgstr "Raio de _integração:"
+
+#: modules/process/semsim.c:258
+msgid "Integration"
+msgstr "Integração"
+
+#: modules/process/semsim.c:260
+msgid "Monte Carlo"
+msgstr "Monte Carlo"
+
+#: modules/process/semsim.c:267
+msgid "_Quality:"
+msgstr "_Qualidade:"
+
+#: modules/process/shade.c:94
+msgid "Creates a shaded presentation of data."
+msgstr "Cria uma apresentação sombreada de dados."
+
+#: modules/process/shade.c:108
+msgid "/_Presentation/_Shading..."
+msgstr "/A_presentação/_Sombreamento..."
+
+#: modules/process/shade.c:112
+msgid "Shade data"
+msgstr "Dados sombreados"
+
+#: modules/process/shade.c:209
+msgid "Shading"
+msgstr "Sombreando"
+
+#: modules/process/shade.c:260
+msgid "_Mix:"
+msgstr "_Mistura:"
+
+#: modules/process/slope_dist.c:160
+msgid ""
+"Calculates one- or two-dimensional distribution of slopes or graph of their "
+"angular distribution."
+msgstr ""
+"Calcula distribuição uni- ou bidimensional de inclinações ou gráfico de suas "
+"distribuições angulares."
+
+#: modules/process/slope_dist.c:175
+msgid "/_Statistics/_Slope Distribution..."
+msgstr "/E_statísticas/Distribuição de inclinação..."
+
+#: modules/process/slope_dist.c:179
+msgid "Calculate angular slope distribution"
+msgstr "Calcular distribuição de inclinação angular"
+
+#: modules/process/slope_dist.c:220
+msgid "Slope distribution"
+msgstr "Distribuição de inclinações"
+
+#: modules/process/slope_dist.c:252
+msgid "_Two-dimensional distribution"
+msgstr "Distribuição bidimensional"
+
+#: modules/process/slope_dist.c:253
+msgid "Directional (φ) _graph"
+msgstr "_Gráfico direcional (φ)"
+
+#: modules/process/slope_dist.c:254
+msgid "_Inclination (θ) graph"
+msgstr "Gráfico de _inclinação (θ)"
+
+#: modules/process/slope_dist.c:255
+msgid "Inclination (gra_dient) graph"
+msgstr "Gráfico de inclinação (gra_diente)"
+
+#: modules/process/slope_dist.c:269
+msgid "Slope Distribution"
+msgstr "Distribuição de inclinações"
+
+#: modules/process/slope_dist.c:749
+msgid "Angular Slope Distribution"
+msgstr "Distribuição de inclinação angular"
+
+#: modules/process/slope_dist.c:757 modules/process/tilt.c:179
+msgid "Slopes"
+msgstr "Inclinações"
+
+#: modules/process/slope_dist.c:818 modules/process/slope_dist.c:887
+msgid "Inclination Distribution"
+msgstr "Distribuição de inclinações"
+
+#: modules/process/slope_dist.c:826 modules/process/slope_dist.c:895
+msgid "Inclinations"
+msgstr "Inclinações"
+
+#: modules/process/sphere-revolve.c:111
+msgid "Subtracts background by arc or sphere revolution."
+msgstr "Subtrai fundo por revolução de arco ou esfera."
+
+#: modules/process/sphere-revolve.c:125
+msgid "/_Level/Revolve _Arc..."
+msgstr "/Nive_lar/Revolver _arco..."
+
+#: modules/process/sphere-revolve.c:129
+msgid "Level data by arc revolution"
+msgstr "Nivelar dados por revolução de arco"
+
+#: modules/process/sphere-revolve.c:132
+#, fuzzy
+msgid "/_Level/Revolve _Sphere..."
+msgstr "/Nive_lar/Revolver _arco..."
+
+#: modules/process/sphere-revolve.c:136
+#, fuzzy
+msgid "Level data by sphere revolution"
+msgstr "Nivelar dados por revolução de arco"
+
+#: modules/process/sphere-revolve.c:303 modules/tools/sfunctions.c:381
+msgid "_Horizontal direction"
+msgstr "Direção _horizontal"
+
+#: modules/process/sphere-revolve.c:304 modules/tools/sfunctions.c:382
+msgid "_Vertical direction"
+msgstr "Direção _vertical"
+
+#: modules/process/sphere-revolve.c:305
+msgid "_Both directions"
+msgstr "Ambas direções"
+
+#: modules/process/sphere-revolve.c:315
+#, fuzzy
+msgid "Revolve Sphere"
+msgstr "Revolver arco"
+
+#: modules/process/sphere-revolve.c:315
+msgid "Revolve Arc"
+msgstr "Revolver arco"
+
+#: modules/process/sphere-revolve.c:355
+msgid "Direction:"
+msgstr "Direção:"
+
+#: modules/process/sphere-revolve.c:699
+#, fuzzy
+msgid "Revolving sphere..."
+msgstr "Relaxando alturas..."
+
+#: modules/process/stitch.c:135
+msgid "Stitch multiple images based on offsets of origins."
+msgstr ""
+
+#: modules/process/stitch.c:149
+#, fuzzy
+msgid "/M_ultidata/_Stitch..."
+msgstr "/M_ulti-dados/_Aritmética..."
+
+#: modules/process/stitch.c:153
+msgid "Stitch images using offsets"
+msgstr ""
+
+#: modules/process/stitch.c:269
+msgid "Stitch"
+msgstr ""
+
+#: modules/process/stitch.c:312
+msgid "Channels"
+msgstr "Canais"
+
+#: modules/process/stitch.c:435
+#, fuzzy
+msgid "Restore"
+msgstr "Res_taurar"
+
+#: modules/process/stitch.c:445 modules/tools/linestats.c:379
+#: modules/tools/sfunctions.c:440 modules/tools/stats.c:406
+msgid "_Instant updates"
+msgstr "Atualizações _instantâneas"
+
+#: modules/process/straighten_path.c:126
+msgid "Extracts a straightened part of image along a curve."
+msgstr "Extrai uma parte corrigida de imagem ao longo de uma curva."
+
+#: modules/process/straighten_path.c:140
+msgid "/_Distortion/Straighten _Path..."
+msgstr "/_Distorção/Corrigir caminho..."
+
+#: modules/process/straighten_path.c:144
+msgid "Straighten along a path"
+msgstr "Corrigir ao longo de um caminho"
+
+#: modules/process/straighten_path.c:194
+msgid "Straighten Path"
+msgstr "Corrigir caminho"
+
+#: modules/process/straighten_path.c:253
+msgid "Res_tore"
+msgstr "Res_taurar"
+
+#: modules/process/straighten_path.c:258
+msgid "Re_verse"
+msgstr "Re_verter"
+
+#: modules/process/straighten_path.c:278 modules/tools/pathlevel.c:256
+#: modules/tools/profile.c:503 modules/tools/roughness.c:868
+msgid "_Thickness:"
+msgstr "Espessura:"
+
+#: modules/process/straighten_path.c:287
+msgid "_Slackness:"
+msgstr "Frouxidão:"
+
+#: modules/process/straighten_path.c:293
+msgid "C_losed curve"
+msgstr "Curva fechada"
+
+#: modules/process/straighten_path.c:380
+msgid "Straightened"
+msgstr "Corrigido"
+
+#: modules/process/superresolution.c:83
+msgid ""
+"Simple supres operations with two data fields (or a data field and a scalar)."
+msgstr ""
+"Operações de supressão simples com dois campos de dados (ou um campo de "
+"dados e um escalar)."
+
+#: modules/process/superresolution.c:98
+msgid "/M_ultidata/_Super-resolution..."
+msgstr "/M_ulti-dados/_Super resolução..."
+
+#: modules/process/superresolution.c:102
+msgid "Super resolution of multiple images of same object"
+msgstr "Super resolução de imagens múltiplas do mesmo objeto"
+
+#: modules/process/superresolution.c:141
+msgid "Supres"
+msgstr "Suprimir"
+
+#: modules/process/superresolution.c:420
+msgid "Correlating to determine mean shift..."
+msgstr "Correlacionando para determinar o deslocamento médio..."
+
+#: modules/process/superresolution.c:510
+msgid "Cross-correlation..."
+msgstr "Correlação cruzada..."
+
+#: modules/process/superresolution.c:553 modules/xyz/xyz_raster.c:1053
+#: modules/xyz/xyz_raster.c:1093
+msgid "Interpolating..."
+msgstr "Interpolando..."
+
+#: modules/process/synth.h:344
+msgid "Roundness"
+msgstr "Arredondamento"
+
+#: modules/process/synth.h:352
+msgid "Roundn_ess:"
+msgstr "Arr_edondamento:"
+
+#: modules/process/synth.h:401
+msgid "Orientation"
+msgstr "Orientação"
+
+#: modules/process/synth.h:410
+msgid "Orien_tation:"
+msgstr "Orien_tação:"
+
+#: modules/process/synth.h:436
+msgid "_Truncate:"
+msgstr "_Truncar:"
+
+#: modules/process/synth.h:460
+msgid "Variance:"
+msgstr "Variância:"
+
+#: modules/process/synth.h:493
+msgid "_Amplitude:"
+msgstr "_Amplitude:"
+
+#: modules/process/synth.h:501
+msgid "_Lateral scale:"
+msgstr "Escala _lateral:"
+
+#: modules/process/synth.h:595
+msgid "Randomi_ze"
+msgstr "Tornar aleatório"
+
+#: modules/process/threshold.c:118
+msgid "Limit the data range using a lower/upper threshold."
+msgstr "Limitar o intervalo de dados usando um limite inferior/superior."
+
+#: modules/process/threshold.c:132
+msgid "/_Basic Operations/Li_mit range..."
+msgstr "/Operações _básicas/Li_mitar intervalo..."
+
+#: modules/process/threshold.c:136
+msgid "Limit data range"
+msgstr "Limitar o intervalo de dados"
+
+#: modules/process/threshold.c:241
+msgid "Limit Range"
+msgstr "Limitar intervalo"
+
+#: modules/process/threshold.c:276
+msgid "Specify _thresholds"
+msgstr "Especificar limites"
+
+#: modules/process/threshold.c:278
+msgid "Use _display range"
+msgstr "Usar intervalo mostrado"
+
+#: modules/process/threshold.c:280
+msgid "Cut off outlier_s"
+msgstr "Cortar isolados"
+
+#: modules/process/threshold.c:289
+msgid "_Lower:"
+msgstr "Inferior:"
+
+#: modules/process/threshold.c:295
+msgid "_Upper:"
+msgstr "Superior:"
+
+#: modules/process/threshold.c:300
+msgid "Set to _Full Range"
+msgstr "Definir para escala completa"
+
+#. TRANSLATORS: This is a range: 123 to 456.
+#: modules/process/threshold.c:313
+#, c-format
+msgid "%.*f to %.*f"
+msgstr "%.*f para %.*f"
+
+#: modules/process/threshold.c:336
+msgid "F_arther than:"
+msgstr "Mais longe que:"
+
+#: modules/process/tilt.c:76
+msgid "Tilts image by specified amount."
+msgstr "Inclinar imagem por uma quantidade especificada."
+
+#: modules/process/tilt.c:90
+msgid "/_Basic Operations/_Tilt..."
+msgstr "/Operações _básicas/Inclinar..."
+
+#: modules/process/tilt.c:94
+msgid "Tilt by specified amount"
+msgstr "Inclinar imagem por uma quantidade especificada"
+
+#: modules/process/tilt.c:160
+msgid "Tilt"
+msgstr "Inclinar"
+
+#: modules/process/tilt.c:185 modules/volume/volume_slice.c:446
+msgid "_X:"
+msgstr "_X:"
+
+#: modules/process/tilt.c:194 modules/volume/volume_slice.c:469
+msgid "_Y:"
+msgstr "_Y:"
+
+#: modules/process/tilt.c:204
+msgid "Angles"
+msgstr "Ângulos"
+
+#: modules/process/tip_blind.c:177
+msgid "Blind estimation of SPM tip using Villarubia's algorithm."
+msgstr "Estimativa cega da ponta do SPM usando o algorítimo de Villarubia."
+
+#: modules/process/tip_blind.c:191
+msgid "/_Tip and Indentation/_Blind Estimation..."
+msgstr "/Indicação e indentação/Estimativa cega..."
+
+#: modules/process/tip_blind.c:195
+msgid "Blind tip estimation"
+msgstr "Estimativa cega da ponta."
+
+#: modules/process/tip_blind.c:230
+msgid "Blind Tip Estimation"
+msgstr "Estimativa cega da ponta."
+
+#: modules/process/tip_blind.c:231
+msgid "Run _Partial"
+msgstr "Execução _parcial"
+
+#: modules/process/tip_blind.c:232
+msgid "Run _Full"
+msgstr "Execução completa"
+
+#: modules/process/tip_blind.c:233
+msgid "_Reset Tip"
+msgstr "_Reiniciar ponta"
+
+#: modules/process/tip_blind.c:321
+msgid "Related _data:"
+msgstr "_Dados relacionados:"
+
+#: modules/process/tip_blind.c:327
+msgid "Estimated Tip Size"
+msgstr "Tamanho estimado da ponta"
+
+#: modules/process/tip_blind.c:350
+msgid "_Same resolution"
+msgstr "Me_sma resolução"
+
+#: modules/process/tip_blind.c:376
+msgid "Noise suppression t_hreshold:"
+msgstr "Limiar de supressão de ruído:"
+
+#: modules/process/tip_blind.c:384
+msgid "Use _boundaries"
+msgstr "Usar fronteiras"
+
+#: modules/process/tip_blind.c:395
+msgid "Stripes"
+msgstr "Listras"
+
+#: modules/process/tip_blind.c:401
+msgid "_Split to stripes:"
+msgstr "Dividir em listras:"
+
+#: modules/process/tip_blind.c:412
+msgid "_Preview stripe:"
+msgstr "_Pré-visualizar listra:"
+
+#: modules/process/tip_blind.c:420
+msgid "Plot size _graph"
+msgstr "Plotar tamanho do _gráfico"
+
+#: modules/process/tip_blind.c:430
+msgid "Create tip i_mages"
+msgstr "Criar imagens da ponta"
+
+#. TRANSLATORS: Prefix for the progressbar message.
+#: modules/process/tip_blind.c:807
+#, c-format
+msgid "Stripe %u: "
+msgstr "Listra %u: "
+
+#: modules/process/tip_blind.c:914 modules/process/tip_blind.c:938
+msgid "Estimated tip"
+msgstr "Ponta estimada"
+
+#: modules/process/tip_blind.c:1204 modules/process/tip_blind.c:1213
+msgid "Tip radius evolution"
+msgstr "Evolução do raio da ponta"
+
+#: modules/process/tip_model.c:112
+msgid "Models SPM tip."
+msgstr "Modela ponta SPM."
+
+#: modules/process/tip_model.c:127
+msgid "/_Tip and Indentation/_Model Tip..."
+msgstr "/Indicação e indentação/_Modelar ponta..."
+
+#: modules/process/tip_model.c:131
+msgid "Model AFM tip"
+msgstr "Modelar ponta AFM"
+
+#: modules/process/tip_model.c:162
+msgid "Model Tip"
+msgstr "Modelar ponta"
+
+#: modules/process/tip_model.c:222
+msgid "Tip _type:"
+msgstr "_Tipo de ponta:"
+
+#: modules/process/tip_model.c:228
+msgid "_Number of sides:"
+msgstr "_Número de lados:"
+
+#: modules/process/tip_model.c:234
+msgid "Tip _slope:"
+msgstr "Inclinação da ponta:"
+
+#: modules/process/tip_model.c:240
+msgid "Tip _rotation:"
+msgstr "_Rotação da ponta:"
+
+#: modules/process/tip_model.c:255
+msgid "Tip _apex radius:"
+msgstr "Raio do ápice da ponta:"
+
+#: modules/process/tip_model.c:265
+#, fuzzy
+msgid "Tip _anisotropy:"
+msgstr "Anisotropia DWT"
+
+#: modules/process/tip_model.c:484
+msgid "Modeled tip"
+msgstr "Ponta modelada"
+
+#: modules/process/tip_model.c:556
+#, c-format
+msgid "Tip resolution: %d × %d pixels"
+msgstr "Resolução da ponta: %d × %d pixeis"
+
+#: modules/process/tipops.c:66
+msgid ""
+"Tip operations: dilation (convolution), erosion (reconstruction) and "
+"certainty map."
+msgstr ""
+"Operações com pontas: dilatação (convolução), erosão (reconstrução) e mapa "
+"de certeza."
+
+#: modules/process/tipops.c:81
+msgid "/_Tip and Indentation/_Dilation..."
+msgstr "/Indicação e indentação/_Dilatação..."
+
+#: modules/process/tipops.c:85
+msgid "Surface dilation by defined tip"
+msgstr "Dilatação da superfície pela ponta definida"
+
+#: modules/process/tipops.c:88
+msgid "/_Tip and Indentation/_Surface Reconstruction..."
+msgstr "/Indicação e indentação/Reconstrução da _superfície..."
+
+#: modules/process/tipops.c:92
+msgid "Surface reconstruction by defined tip"
+msgstr "Reconstrução da superfície pela ponta definida"
+
+#: modules/process/tipops.c:95
+msgid "/_Tip and Indentation/_Certainty Map..."
+msgstr "/Indicação e indentação/Mapa de _certeza..."
+
+#: modules/process/tipops.c:99
+msgid "Tip certainty map"
+msgstr "Mapa de certeza da ponta"
+
+#: modules/process/tipops.c:140
+msgid "Tip Dilation"
+msgstr "Dilatação da ponta"
+
+#: modules/process/tipops.c:141
+msgid "Surface Reconstruction"
+msgstr "Reconstrução da superfície"
+
+#: modules/process/tipops.c:142
+msgid "Certainty Map Analysis"
+msgstr "Análise de mapa de certeza"
+
+#: modules/process/tipops.c:163
+msgid "_Tip morphology:"
+msgstr "Morfologia da ponta:"
+
+#: modules/process/tipops.c:257
+#, c-format
+msgid ""
+"Tip measure does not match data.\n"
+"It will be resampled from %d×%d to %d×%d."
+msgstr ""
+"Medida da ponta não corresponde aos dados.\n"
+"Ela será re-amostrada de %d×%d to %d×%d."
+
+#: modules/process/tipops.c:297
+msgid "Dilated data"
+msgstr "Dados dilatados"
+
+#: modules/process/tipops.c:298
+msgid "Surface reconstruction"
+msgstr "Reconstrução da superfície"
+
+#: modules/process/unrotate.c:83
+msgid ""
+"Rotates data to make characteristic directions parallel with x or y axis."
+msgstr ""
+"Gira dados para fazer direções características paralelas com o eixo x ou y."
+
+#: modules/process/unrotate.c:98
+msgid "/_Correct Data/_Unrotate..."
+msgstr "/_Corrigir dados/Desfazer rotação..."
+
+#: modules/process/unrotate.c:102
+msgid "Automatically correct rotation in horizontal plane"
+msgstr "Corrigir rotação automaticamente em plano horizontal"
+
+#: modules/process/unrotate.c:219
+msgid "Correct Rotation"
+msgstr "Corrigir rotação"
+
+#: modules/process/unrotate.c:239
+msgid "Structure"
+msgstr "Estrutura"
+
+#: modules/process/unrotate.c:243
+msgid "Detected:"
+msgstr "Detectado:"
+
+#: modules/process/unrotate.c:259
+msgid "_Assume:"
+msgstr "_Assumir:"
+
+#: modules/process/unrotate.c:262
+msgid "Correction:"
+msgstr "Correção:"
+
+#: modules/process/volumize.c:42
+msgid "Converts datafield to 3D volume data."
+msgstr "Converte campo de dados para volume de dados 3D."
+
+#: modules/process/volumize.c:56
+#, fuzzy
+msgid "/_Basic Operations/Volumize"
+msgstr "/Operações _básicas/Volumar..."
+
+#: modules/process/volumize.c:60
+msgid "Convert datafield to 3D data"
+msgstr "Converte campo de dados para dados 3D"
+
+#: modules/process/volumize_layers.c:86
+msgid "Converts all datafields to 3D volume data."
+msgstr "Converte todos os campos de dados para volume de dados 3D."
+
+#: modules/process/volumize_layers.c:100
+msgid "/_Basic Operations/Volumize Layers..."
+msgstr "/Operações _básicas/Volumar camadas..."
+
+#: modules/process/volumize_layers.c:104
+msgid "Convert all datafields to 3D data"
+msgstr "Converte todos os campos de dados para dados 3D"
+
+#: modules/process/volumize_layers.c:153
+msgid "All datafields must have same resolution to make a volume from them."
+msgstr ""
+"Todos os campos de dados devem ter a mesma resolução para gerar um volume a "
+"partir deles."
+
+#: modules/process/volumize_layers.c:220
+msgid "Volumize layers"
+msgstr "Volumar camadas"
+
+#: modules/process/volumize_layers.c:240
+msgid "_X resolution:"
+msgstr "Resolução _X:"
+
+#: modules/process/volumize_layers.c:245
+msgid "_Y resolution:"
+msgstr "Resolução _Y:"
+
+#: modules/process/volumize_layers.c:250
+msgid "_Z resolution:"
+msgstr "Resolução _Z:"
+
+#: modules/process/volumize_layers.c:256
+msgid "Z _range:"
+msgstr "Intervalo Z:"
+
+#: modules/process/wave_synth.c:219
+msgid "Generates various kinds of waves."
+msgstr "Gera vários tipos de ondas."
+
+#: modules/process/wave_synth.c:233
+msgid "/S_ynthetic/_Waves..."
+msgstr "/Sintético/Ondas..."
+
+#: modules/process/wave_synth.c:237
+msgid "Generate waves"
+msgstr "Gerar ondas"
+
+#: modules/process/wave_synth.c:366
+msgid "Waves"
+msgstr "Ondas"
+
+#: modules/process/wave_synth.c:441 modules/tools/linestats.c:337
+#: modules/tools/sfunctions.c:411 modules/volume/volume_linestat.c:374
+msgid "_Quantity:"
+msgstr "_Quantidade:"
+
+#: modules/process/wave_synth.c:448
+msgid "_Number of waves:"
+msgstr "_Número de ondas:"
+
+#: modules/process/wave_synth.c:455 modules/process/wave_synth.c:617
+#: modules/tools/roughness.c:275
+msgid "Amplitude"
+msgstr "Amplitude"
+
+#: modules/process/wave_synth.c:460
+msgid "_Wave form:"
+msgstr "Forma da onda:"
+
+#: modules/process/wave_synth.c:467
+msgid "Amplitude:"
+msgstr "Amplitude:"
+
+#: modules/process/wave_synth.c:487
+msgid "_Decay:"
+msgstr ""
+
+#: modules/process/wave_synth.c:497
+msgid "Frequency"
+msgstr "Frequência"
+
+#: modules/process/wave_synth.c:503
+msgid "_Spatial frequency:"
+msgstr "Frequência espacial:"
+
+#: modules/process/wave_synth.c:519
+msgid "_X center:"
+msgstr "Centro _X:"
+
+#: modules/process/wave_synth.c:532
+msgid "_Y center:"
+msgstr "Centro _Y:"
+
+#: modules/process/wave_synth.c:600
+msgid "Cosine"
+msgstr "Cosseno"
+
+#: modules/process/wave_synth.c:601
+msgid "Inverse cosh"
+msgstr "Cosseno hiperbólico invertido"
+
+#: modules/process/wave_synth.c:602
+msgid "Flat top"
+msgstr "Topo achatado"
+
+#: modules/process/wave_synth.c:616
+msgid "Displacement"
+msgstr "Deslocamento"
+
+#: modules/process/wpour_mark.c:189
+msgid "Segments image using watershed with pre- and postprocessing."
+msgstr ""
+"Segmenta imagem usando linha divisória de águas com pré- e pós-processamento."
+
+#: modules/process/wpour_mark.c:203
+msgid "/_Grains/_Mark by Segmentation..."
+msgstr "/_Grãos/_Marcar por segmentação..."
+
+#: modules/process/wpour_mark.c:207
+msgid "Segment using watershed "
+msgstr "Segmentar usando linha divisória de águas"
+
+#: modules/process/wpour_mark.c:270
+msgid "Segment by Watershed"
+msgstr "Segmentar por linha divisória de águas"
+
+#: modules/process/wpour_mark.c:312
+msgid "Preprocessing"
+msgstr "Pré-processamento"
+
+#: modules/process/wpour_mark.c:327
+msgid "Add _gradient:"
+msgstr "Adicionar _gradiente:"
+
+#: modules/process/wpour_mark.c:331
+msgid "Add _curvature:"
+msgstr "Adicionar _curvatura:"
+
+#: modules/process/wpour_mark.c:335
+msgid "_Barrier level:"
+msgstr "Nível de _barreira:"
+
+#: modules/process/wpour_mark.c:339
+msgid "Prefill _level:"
+msgstr "Pré-preencher níve_l:"
+
+#: modules/process/wpour_mark.c:343
+msgid "Pre_fill from minima:"
+msgstr "Pré-preencher a partir do mínimo:"
+
+#: modules/process/wpour_mark.c:348
+msgid "Postprocessing"
+msgstr "Pós-processamento"
+
+#: modules/process/wpour_mark.c:377
+msgid "Original image"
+msgstr "Imagem original"
+
+#: modules/process/wpour_mark.c:379
+msgid "Preprocessed image"
+msgstr "Imagem pré-processada"
+
+#: modules/process/wpour_mark.c:382
+msgid "_Image preview:"
+msgstr "Pré-visualização de imagem:"
+
+#: modules/process/wpour_mark.c:389
+msgid "No mask"
+msgstr "Sem máscara"
+
+#: modules/process/wpour_mark.c:393
+msgid "Postprocessed"
+msgstr "Pós-processado"
+
+#: modules/process/wpour_mark.c:396
+msgid "_Mask preview:"
+msgstr "Pré-visualização de máscara:"
+
+#: modules/process/wpour_mark.c:403
+msgid "No updates"
+msgstr "Sem atualizações"
+
+#: modules/process/wpour_mark.c:405
+msgid "Preprocess image"
+msgstr "Pré-processar imagem"
+
+#: modules/process/wpour_mark.c:407
+msgid "Preprocess and mark"
+msgstr "Pré-processar e marcar"
+
+#: modules/process/xydenoise.c:58
+msgid "Denoises measurement on basis of two orthogonal scans."
+msgstr "Remove ruído de medidas com base em dois escaneamentos ortogonais."
+
+#: modules/process/xydenoise.c:72
+msgid "/M_ultidata/_XY denoise..."
+msgstr "/M_ulti-dados/Remoção de ruídos _XY..."
+
+#: modules/process/xydenoise.c:76
+msgid "Denoises horizontal/vertical measurement."
+msgstr "Remove ruído de medida horizontal/vertical."
+
+#: modules/process/xydenoise.c:103
+msgid "XY Denoising"
+msgstr "Remoção de ruídos XY"
+
+#: modules/process/xydenoise.c:125
+msgid "Second direction:"
+msgstr "Segunda direção:"
+
+#: modules/process/xydenoise.c:233
+msgid "Computing forward FFTs..."
+msgstr "Calcula FFTS diretas..."
+
+#: modules/process/xydenoise.c:249
+msgid "Computing image..."
+msgstr "Calculando imagem..."
+
+#: modules/process/xydenoise.c:261
+msgid "Computing backward FFT..."
+msgstr "Calculando FFT reversa..."
+
+#: modules/process/xydenoise.c:273
+msgid "Denoised"
+msgstr "Ruídos removidos"
+
+#: modules/process/xyzize.c:41
+msgid "Converts data fields to XYZ data."
+msgstr "Converte campo de dados para dados XYZ."
+
+#: modules/process/xyzize.c:55
+msgid "/_Basic Operations/_XYZize..."
+msgstr "/Operações _básicas/Converter para _XYZ..."
+
+#: modules/process/xyzize.c:59
+msgid "Convert to XYZ data"
+msgstr "Converter para dados XYZ"
+
+#: modules/pygwy/pygwy-console.c:99
+msgid "/Pygwy Console"
+msgstr "/Console Pygwy"
+
+#: modules/pygwy/pygwy-console.c:103
+msgid "Python wrapper console"
+msgstr "Console Python"
+
+#: modules/pygwy/pygwy-console.c:168 modules/pygwy/pygwy-console.c:481
+msgid "Pygwy Console"
+msgstr "Console Pygwy"
+
+#: modules/pygwy/pygwy-console.c:187
+msgid "Open script in Python language (Ctrl-O)"
+msgstr "Abrir script na linguagem Python (Ctrl-O)"
+
+#: modules/pygwy/pygwy-console.c:197
+msgid "Save script (Ctrl-S)"
+msgstr "Salvar script (Ctrl-S)"
+
+#: modules/pygwy/pygwy-console.c:207
+#, fuzzy
+msgid "Save script as (Ctrl-Shift-S)"
+msgstr "Salvar script (Ctrl-S)"
+
+#: modules/pygwy/pygwy-console.c:217
+msgid "Execute script (Ctrl-E)"
+msgstr "Executar script (Ctrl-E)"
+
+#: modules/pygwy/pygwy-console.c:227
+msgid "Clear Log"
+msgstr "Limpar registro"
+
+#: modules/pygwy/pygwy-console.c:285
+msgid "Command"
+msgstr "Comando"
+
+#: modules/pygwy/pygwy-console.c:371
+msgid ">>> Running the script above\n"
+msgstr ">>> Executando o script acima\n"
+
+#: modules/pygwy/pygwy-console.c:425
+#, fuzzy
+msgid "Save Python Script as"
+msgstr "Salvar script como"
+
+#: modules/pygwy/pygwy-console.c:429
+#, fuzzy
+msgid "Open Python Script"
+msgstr "Abrir script em Python"
+
+#: pygwy.c:130
+msgid "Pygwy, the Gwyddion Python wrapper."
+msgstr "Pygwy, o ambiente Python do Gwyddion."
+
+#: pygwy.c:269
+msgid "Python Interpreter Errors"
+msgstr ""
+
+#: pygwy.c:399
+msgid "Python interpreter error occurred."
+msgstr ""
+
+#: pygwy.c:499
+msgid "Function written in Python"
+msgstr "Função escrita em Python"
+
+#: modules/tools/crop.c:84
+msgid "Crop tool, crops data to smaller size."
+msgstr "Ferramenta de corte, corta dados para um tamanho menor."
+
+#: modules/tools/crop.c:121
+msgid "Crop"
+msgstr "Cortar"
+
+#: modules/tools/crop.c:122
+msgid "Crop data"
+msgstr "Cortar dados"
+
+#: modules/tools/distance.c:111
+msgid "Distance measurement tool, measures distances and angles."
+msgstr "Ferramenta de medir distâncias, mede distâncias e ângulos."
+
+#: modules/tools/distance.c:147
+msgid "Measure distances and directions between points"
+msgstr "Medir distâncias e direções entre pontos"
+
+#. TRANSLATORS: Number is verb here.
+#: modules/tools/distance.c:250 modules/tools/profile.c:527
+msgid "_Number lines"
+msgstr "Enumerar linhas"
+
+#: modules/tools/filter.c:129
+msgid ""
+"Filter tool, processes selected part of data with a filter (conservative "
+"denoise, mean, median. Kuwahara, minimum, maximum)."
+msgstr ""
+"Ferramenta de filtragem, processa a parte selecionada dos dados com um "
+"filtro ( removedor de ruído conservativo, média, mediana, Kuwahara, mínimo, "
+"máximo)."
+
+#: modules/tools/filter.c:172
+msgid "Basic filters: mean, median, denoise, …"
+msgstr "Filtros básicos: média, mediana, remover ruído, ..."
+
+#: modules/tools/filter.c:240
+msgid "Conservative denoise"
+msgstr "Removedor de ruído conservativo"
+
+#: modules/tools/filter.c:247
+msgid "Kuwahara"
+msgstr "Kuwahara"
+
+#: modules/tools/filter.c:248
+msgid "Dechecker"
+msgstr "Dechecker"
+
+#: modules/tools/filter.c:249
+msgid "filter|Gaussian"
+msgstr "Gaussiano"
+
+#: modules/tools/filter.c:250
+msgid "Sharpen"
+msgstr "Afiar"
+
+#: modules/tools/grainmeasure.c:92
+msgid ""
+"Grain measurement tool, calculates characteristics of selected continuous "
+"parts of mask."
+msgstr ""
+"Ferramenta de medida de grãos, calcula as características das partes "
+"contínuas selecionadas da máscara."
+
+#: modules/tools/grainmeasure.c:124
+msgid "Grain Measure"
+msgstr "Medida de grão"
+
+#: modules/tools/grainmeasure.c:125
+msgid "Measure individual grains (continuous parts of mask)"
+msgstr "Medir grãos individuais (partes contínuas da máscara)."
+
+#: modules/tools/grainremover.c:99 modules/tools/selectionmanager.c:128
+msgid ""
+"Grain removal tool, removes continuous parts of mask and/or underlying data."
+msgstr ""
+"Ferramenta de remoção de grãos, remove partes contínuas da máscara e/ou "
+"dados subjacentes."
+
+#: modules/tools/grainremover.c:108
+msgid "_Mask"
+msgstr "_Máscara"
+
+#: modules/tools/grainremover.c:114 modules/tools/spotremove.c:271
+msgid "Laplace solver"
+msgstr "Solucionador de Laplace"
+
+#: modules/tools/grainremover.c:115
+msgid "Fractal correction"
+msgstr "Correção fractal"
+
+#: modules/tools/grainremover.c:145
+msgid "Grain Remove"
+msgstr "Remoção de grão"
+
+#: modules/tools/grainremover.c:146
+msgid "Remove individual grains (continuous parts of mask)"
+msgstr "Remover grãos individuais (partes contínuas da máscara)."
+
+#: modules/tools/grainremover.c:203
+msgid "Remove:"
+msgstr "Remover:"
+
+#: modules/tools/grainremover.c:216 modules/tools/spotremove.c:326
+msgid "_Interpolation method:"
+msgstr "Método de _interpolação:"
+
+#: modules/tools/icolorange.c:128
+msgid ""
+"Interactive color range tool, allows selecting the data range false color "
+"scale should map to, either on data or on height distribution histogram."
+msgstr ""
+"Ferramenta interativa de intervalo de cores, permite selecionar o intervalo "
+"de dados que a escala de cores falsas deve mapear, seja nos dados ou no "
+"histograma de distribuição de alturas."
+
+#: modules/tools/icolorange.c:159
+msgid "Color Range"
+msgstr "Intervalo de cores"
+
+#: modules/tools/icolorange.c:160
+msgid "Stretch color range to part of data"
+msgstr "Estender o intervalo de cores para parte dos dados"
+
+#: modules/tools/icolorange.c:228
+msgid "Full color range from minimum to maximum"
+msgstr "Intervalo de cores completo do mínimo ao máximo"
+
+#: modules/tools/icolorange.c:233
+msgid "Explicitly set fixed color range"
+msgstr "Definir explicitamente um intervalo de cores fixo"
+
+#: modules/tools/icolorange.c:238
+msgid "Automatic color range with tails cut off"
+msgstr "Intervalo de cores automático com extremidades cortadas"
+
+#: modules/tools/icolorange.c:243
+msgid "Adaptive nonlinear color mapping"
+msgstr "Mapeamento de cores não-linear adaptativo"
+
+#: modules/tools/icolorange.c:284
+msgid "_default"
+msgstr "pa_drão"
+
+#: modules/tools/icolorange.c:293
+msgid "Height histogram"
+msgstr "Histograma de alturas"
+
+#: modules/tools/icolorange.c:329 modules/tools/linestats.c:169
+#: modules/tools/sfunctions.c:231 modules/volume/volume_linestat.c:148
+msgid "Range"
+msgstr "Intervalo"
+
+#: modules/tools/icolorange.c:334
+msgid "_Minimum"
+msgstr "_Mínimo"
+
+#: modules/tools/icolorange.c:359
+msgid "M_aximum"
+msgstr "Máximo"
+
+#: modules/tools/icolorange.c:390
+msgid "Set to _Unmasked"
+msgstr "Definir para não-mascarado"
+
+#: modules/tools/icolorange.c:397
+msgid "Set to _Masked"
+msgstr "Definir para mascarado"
+
+#: modules/tools/icolorange.c:409
+msgid "_Invert Mapping"
+msgstr "_Inverter mapeamento"
+
+#: modules/tools/icolorange.c:419
+msgid "range|Full"
+msgstr "Completo"
+
+#: modules/tools/level3.c:108
+msgid ""
+"Three-point level tool, levels data by subtracting a plane fitted through "
+"three selected points."
+msgstr ""
+"Ferramenta de nível de três pontos, nivela os dados subtraindo um plano "
+"ajustado através de três pontos selecionados."
+
+#: modules/tools/level3.c:145
+msgid "Three Point Level"
+msgstr "Nivelamento de três pontos"
+
+#: modules/tools/level3.c:146
+msgid "Level data by fitting a plane through three points"
+msgstr "Nivelar dados por ajuste de um plano através de três pontos"
+
+#: modules/tools/level3.c:244 modules/tools/readvalue.c:378
+msgid "_Averaging radius:"
+msgstr "Calculando raio médio:"
+
+#: modules/tools/level3.c:251
+msgid "_Instant apply"
+msgstr "Aplicação _instantânea"
+
+#: modules/tools/level3.c:261
+msgid "Set plane to _zero"
+msgstr "Definir plano para _zero"
+
+#: modules/tools/linestats.c:139
+msgid ""
+"Row/column statistical function tool, mean values, medians, maxima, minima, "
+"RMS, ..., of rows or columns."
+msgstr ""
+"Ferramenta de função estatística de linha/coluna, valores médios, medianas, "
+"máximos, mínimos, RMS, ..., de linhas ou colunas."
+
+#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:150
+msgid "tan β<sub>0</sub>"
+msgstr "tan β<sub>0</sub>"
+
+#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:152
+msgid "Ra"
+msgstr "Ra"
+
+#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:153
+msgid "Rq (RMS)"
+msgstr "Rq (RMS)"
+
+#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:154
+msgid "Rz"
+msgstr "Rz"
+
+#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:155
+msgid "Rt"
+msgstr "Rt"
+
+#: modules/tools/linestats.c:204
+msgid "Row/Column Statistics"
+msgstr "Estatísticas de linha/coluna"
+
+#: modules/tools/linestats.c:205
+msgid "Calculate row/column statistical functions"
+msgstr "Calcular funções estatísticas de linha/coluna"
+
+#: modules/tools/linestats.c:307
+msgid "Ro_ws"
+msgstr "Linhas"
+
+#: modules/tools/linestats.c:308
+msgid "Co_lumns"
+msgstr "Colunas"
+
+#: modules/tools/linestats.c:354
+msgid "Average:"
+msgstr "Média:"
+
+#: modules/tools/linestats.c:363 modules/tools/profile.c:460
+#: modules/tools/sfunctions.c:424 modules/tools/spectro.c:346
+msgid "<b>Options</b>"
+msgstr "<b>Opções</b>"
+
+#: modules/tools/maskedit.c:170
+msgid "Mask editor tool, allows interactive modification of parts of the mask."
+msgstr ""
+"Ferramenta de edição de máscara, permite a modificação interativa de partes "
+"da máscara."
+
+#: modules/tools/maskedit.c:228
+msgid "Mask Editor"
+msgstr "Editor de máscara"
+
+#: modules/tools/maskedit.c:229
+msgid "Edit mask"
+msgstr "Editar máscara"
+
+#: modules/tools/maskedit.c:326
+msgid "Set mask to selection"
+msgstr "Definir máscara para seleção"
+
+#: modules/tools/maskedit.c:331
+msgid "Add selection to mask"
+msgstr "Adicionar seleção para máscara"
+
+#: modules/tools/maskedit.c:336
+msgid "Subtract selection from mask"
+msgstr "Subtrair seleção da máscara"
+
+#: modules/tools/maskedit.c:341
+msgid "Intersect selection with mask"
+msgstr "Cruzar seleção com máscara"
+
+#: modules/tools/maskedit.c:348
+msgid "Rectangular shapes"
+msgstr "Formas retangulares"
+
+#: modules/tools/maskedit.c:353
+msgid "Elliptic shapes"
+msgstr "Formas elípticas"
+
+#: modules/tools/maskedit.c:358
+msgid "Thin lines"
+msgstr "Linhas finas"
+
+#: modules/tools/maskedit.c:365
+msgid "Freehand mask drawing"
+msgstr "Desenhar máscara à mão"
+
+#: modules/tools/maskedit.c:370
+msgid "Freehand mask erasing"
+msgstr "Apagar máscara à mão"
+
+#: modules/tools/maskedit.c:375
+msgid "Fill continuous empty areas with mask"
+msgstr "Preencher áreas contínuas vazias com máscara"
+
+#: modules/tools/maskedit.c:380
+msgid "Erase continuous parts of mask"
+msgstr "Apagar partes contínuas da máscara"
+
+#: modules/tools/maskedit.c:409
+msgid "Editor"
+msgstr "Editor"
+
+#: modules/tools/maskedit.c:414
+msgid "_Shapes"
+msgstr "Forma_s"
+
+#: modules/tools/maskedit.c:428
+msgid "Mode:"
+msgstr "Modo:"
+
+#: modules/tools/maskedit.c:458
+msgid "Shape:"
+msgstr "Forma:"
+
+#: modules/tools/maskedit.c:486
+msgid "_Drawing Tools"
+msgstr "Ferramentas de _desenho"
+
+#: modules/tools/maskedit.c:500
+msgid "Tool:"
+msgstr "Ferramenta:"
+
+#: modules/tools/maskedit.c:538
+msgid "Actions"
+msgstr "Ações"
+
+#: modules/tools/maskedit.c:546
+msgid "_Invert"
+msgstr "_Inverter"
+
+#: modules/tools/maskedit.c:577
+msgid "Fill _Voids"
+msgstr "Preencher _vazios"
+
+#: modules/tools/maskedit.c:586
+msgid "Fill non-simple-connected"
+msgstr "Preencher conectado não-simples"
+
+#: modules/tools/maskedit.c:597
+msgid "Grow/Shrink"
+msgstr "Crescer/encolher"
+
+#: modules/tools/maskedit.c:606
+msgid "_Grow"
+msgstr "Crescer"
+
+#: modules/tools/maskedit.c:614
+msgid "Shrin_k"
+msgstr "Encolher"
+
+#: modules/tools/maskedit.c:629
+msgid "_Amount:"
+msgstr "Quantidade:"
+
+#: modules/tools/maskedit.c:657
+msgid "_Prevent grain merging by growing"
+msgstr "Evitar a fusão de grãos durante o crescimento"
+
+#: modules/tools/pathlevel.c:111
+msgid "Path level tool, performs row leveling along on user-set lines."
+msgstr ""
+"Ferramenta de nivelamento de caminho, executa o nivelamento de linhas em "
+"linhas definidas pelo usuário."
+
+#: modules/tools/pathlevel.c:144
+msgid "Path Level"
+msgstr "Nivelar caminho"
+
+#: modules/tools/pathlevel.c:145
+msgid "Level rows using intersections with given lines"
+msgstr "Nivelar linhas usando intersecções com linhas fornecidas"
+
+#: modules/tools/profile.c:216
+msgid "Profile tool, creates profile graphs from selected lines."
+msgstr "Ferramenta de perfil, cria gráficos de perfis de linhas selecionadas."
+
+#: modules/tools/profile.c:270 modules/tools/profile.c:609
+msgid "Profiles"
+msgstr "Perfis"
+
+#: modules/tools/profile.c:271
+msgid "Extract profiles"
+msgstr "Extrair perfis"
+
+#: modules/tools/profile.c:478
+#, fuzzy
+msgid "Linear profiles"
+msgstr "_Separar perfis"
+
+#: modules/tools/profile.c:480
+#, fuzzy
+msgid "Radial profiles"
+msgstr "Perfis _radiais"
+
+#: modules/tools/profile.c:537
+msgid "_Separate profiles"
+msgstr "_Separar perfis"
+
+#: modules/tools/profile.c:587
+msgid "_Calibration data:"
+msgstr "Dados de _calibração:"
+
+#: modules/tools/profile.c:600
+msgid "_Show profile"
+msgstr "Mostrar perfil"
+
+#: modules/tools/profile.c:861
+#, c-format
+msgid "X error %d"
+msgstr "Erro em X %d"
+
+#: modules/tools/profile.c:865
+#, c-format
+msgid "Y error %d"
+msgstr "Erro em Y %d"
+
+#: modules/tools/profile.c:869
+#, c-format
+msgid "Z error %d"
+msgstr "Erro em Z %d"
+
+#: modules/tools/profile.c:873
+#, c-format
+msgid "X uncertainty %d"
+msgstr "Incerteza em X %d"
+
+#: modules/tools/profile.c:877
+#, c-format
+msgid "Y uncertainty %d"
+msgstr "Incerteza em Y %d"
+
+#: modules/tools/profile.c:881
+#, c-format
+msgid "Z uncertainty %d"
+msgstr "Incerteza em Z %d"
+
+#: modules/tools/profile.c:886
+#, c-format
+msgid "Zunc up bound %d"
+msgstr "Limite superior de inc. Z %d"
+
+#: modules/tools/profile.c:891
+#, c-format
+msgid "Zunc low bound %d"
+msgstr "Limite inferior de inc. Z %d"
+
+#: modules/tools/profile.c:1637
+msgid "S_ymmetrize"
+msgstr "Simetrizar"
+
+#: modules/tools/profile.c:1639
+msgid "Symmetrize _All"
+msgstr "Simetrizar todos"
+
+#: modules/tools/profile.c:1643
+#, fuzzy
+msgid "Improve _Direction"
+msgstr "_Direção:"
+
+#: modules/tools/profile.c:1645
+#, fuzzy
+msgid "Improve _All"
+msgstr "Melhorar"
+
+#: modules/tools/profile.c:1866
+msgid "calib-data|None"
+msgstr "Nenhum"
+
+#: modules/tools/readvalue.c:137
+msgid "Pointer tool, reads value under pointer."
+msgstr "Ferramenta indicadora, lê o valor sob o ponteiro do mouse."
+
+#: modules/tools/readvalue.c:170
+msgid "Read Value"
+msgstr "Ler valor"
+
+#: modules/tools/readvalue.c:171
+msgid "Read value under mouse cursor"
+msgstr "Lê o valor sob o cursor do mouse"
+
+#: modules/tools/readvalue.c:307
+msgid "Set _Zero"
+msgstr "Definir _zero"
+
+#: modules/tools/readvalue.c:310
+msgid "Shift plane z=0 to pass through the selected point"
+msgstr "Deslocar plano z=0 para passar através do ponto selecionado"
+
+#: modules/tools/readvalue.c:318
+msgid "Facet"
+msgstr "Faceta"
+
+#: modules/tools/readvalue.c:343
+msgid "Curvatures"
+msgstr "Curvaturas"
+
+#: modules/tools/readvalue.c:386
+msgid "Show _selection"
+msgstr "Mostrar _seleção"
+
+#: modules/tools/roughness.c:283
+msgid "Roughness average"
+msgstr "Rugosidade média"
+
+#: modules/tools/roughness.c:291
+msgid "Root mean square roughness"
+msgstr "Raiz quadrática média da rugosidade"
+
+#: modules/tools/roughness.c:299
+msgid "Maximum height of the roughness"
+msgstr "Altura máxima da rugosidade"
+
+#: modules/tools/roughness.c:307
+msgid "Maximum roughness valley depth"
+msgstr "Profundidade máxima do vale da rugosidade"
+
+#: modules/tools/roughness.c:315
+msgid "Maximum roughness peak height"
+msgstr "Altura máxima do pico da rugosidade"
+
+#: modules/tools/roughness.c:323 modules/tools/roughness.c:371
+msgid "Average maximum height of the roughness"
+msgstr "Média máxima das alturas da rugosidade"
+
+#: modules/tools/roughness.c:331
+msgid "Average maximum roughness valley depth"
+msgstr "Média máxima das profundidades dos vales da rugosidade"
+
+#: modules/tools/roughness.c:339
+msgid "Average maximum roughness peak height"
+msgstr "Média máxima das alturas dos picos da rugosidade"
+
+#: modules/tools/roughness.c:347 modules/tools/roughness.c:355
+msgid "Average third highest peak to third lowest valley height"
+msgstr ""
+"Média da altura do terceiro pico mais alto para o terceiro vale mais baixo"
+
+#: modules/tools/roughness.c:363
+msgid "Average maximum height of the profile"
+msgstr "Média máxima das alturas do perfil"
+
+#: modules/tools/roughness.c:379
+msgid "Skewness"
+msgstr "Assimetria"
+
+#: modules/tools/roughness.c:395
+msgid "Waviness average"
+msgstr "Ondulação média"
+
+#: modules/tools/roughness.c:403
+msgid "Root mean square waviness"
+msgstr "Raiz quadrática média da ondulação"
+
+#: modules/tools/roughness.c:411
+msgid "Waviness maximum height"
+msgstr "Altura máxima da ondulação"
+
+#: modules/tools/roughness.c:419
+msgid "Maximum height of the profile"
+msgstr "Altura máxima do perfil"
+
+#: modules/tools/roughness.c:427
+msgid "Spatial"
+msgstr "Espacial"
+
+#: modules/tools/roughness.c:477
+msgid "Average wavelength of the profile"
+msgstr "Comprimento de onda médio do perfil"
+
+#: modules/tools/roughness.c:485
+msgid "Root mean square (RMS) wavelength of the profile"
+msgstr "Raiz quadrática média (RMS) do comprimento de onda do perfil"
+
+#: modules/tools/roughness.c:493
+msgid "Hybrid"
+msgstr "Híbrido"
+
+#: modules/tools/roughness.c:501
+msgid "Average absolute slope"
+msgstr "Inclinação média absoluta"
+
+#: modules/tools/roughness.c:509
+msgid "Root mean square (RMS) slope"
+msgstr "Raiz quadrática média (RMS) da inclinação"
+
+#: modules/tools/roughness.c:525
+msgid "Developed profile length"
+msgstr "Comprimento do perfil desenvolvido"
+
+#: modules/tools/roughness.c:533
+msgid "Profile length ratio"
+msgstr "Razão do comprimento do perfil"
+
+#: modules/tools/roughness.c:616
+msgid "Calculate surface profile parameters."
+msgstr "Calcular parâmetros do perfil da superfície."
+
+#: modules/tools/roughness.c:649 modules/tools/roughness.c:774
+#: modules/tools/roughness.c:1479
+msgid "Roughness"
+msgstr "Rugosidade"
+
+#: modules/tools/roughness.c:650
+msgid "Calculate roughness parameters"
+msgstr "Calcular parâmetros de rugosidade"
+
+#: modules/tools/roughness.c:772 modules/tools/roughness.c:1477
+msgid "Texture"
+msgstr "Textura"
+
+#: modules/tools/roughness.c:773 modules/tools/roughness.c:1478
+msgid "Waviness"
+msgstr "Ondulação"
+
+#: modules/tools/roughness.c:775
+msgid "ADF"
+msgstr "Função de distribuição de amplitude"
+
+#: modules/tools/roughness.c:776
+msgid "BRC"
+msgstr "Curva da razão de comportamento (Bearing Ratio Curve)"
+
+#: modules/tools/roughness.c:777 modules/tools/roughness.c:1482
+msgid "Peak Count"
+msgstr "Contagem de picos"
+
+#: modules/tools/roughness.c:839 modules/xyz/xyz_drift.c:1090
+msgid "_Graph:"
+msgstr "_Gráfico:"
+
+#: modules/tools/roughness.c:847
+msgid "C_ut-off:"
+msgstr "Cortar:"
+
+#: modules/tools/roughness.c:1345
+msgid "No profile selected."
+msgstr "Nenhum perfil selecionado."
+
+#: modules/tools/roughness.c:1480
+msgid "Amplitude Distribution Function"
+msgstr "Função de distribuição de amplitude"
+
+#: modules/tools/roughness.c:1481
+msgid "The Bearing Ratio Curve"
+msgstr "A curva da razão de comportamento"
+
+#: modules/tools/roughness.c:1516
+msgid "Surface Profiles"
+msgstr "Perfis de superfície"
+
+#: modules/tools/roughness.c:1904
+msgid "Save Roughness Parameters"
+msgstr "Salvar parâmetros de rugosidade"
+
+#: modules/tools/roughness.c:1961
+msgid "Roughness Parameters"
+msgstr "Parâmetros de rugosidade"
+
+#: modules/tools/roughness.c:1967
+#, c-format
+msgid "File:              %s\n"
+msgstr "Arquivo:              %s\n"
+
+#: modules/tools/roughness.c:1971
+#, c-format
+msgid "Data channel:      %s\n"
+msgstr "Canal de dados:      %s\n"
+
+#: modules/tools/roughness.c:2002
+#, c-format
+msgid ""
+"Selected line:     (%s, %s) to (%s, %s) px\n"
+"                   (%s, %s) to (%s, %s) %s\n"
+msgstr ""
+"Linha selecionada:     (%s, %s) to (%s, %s) px\n"
+"                   (%s, %s) to (%s, %s) %s\n"
+
+#: modules/tools/selectionmanager.c:174
+msgid "Selection Manager"
+msgstr "Gerenciador de seleção"
+
+#: modules/tools/selectionmanager.c:175
+msgid "Display, copy and export selections"
+msgstr "Exibir, copiar e exportar seleções"
+
+#: modules/tools/selectionmanager.c:273
+msgid "Spline path"
+msgstr "Caminho da interpolação"
+
+#: modules/tools/selectionmanager.c:368
+msgid "Manage chosen selection"
+msgstr "Gerenciar seleção escolhida"
+
+#: modules/tools/selectionmanager.c:376
+msgid "_Distribute"
+msgstr "_Distribuir"
+
+#: modules/tools/selectionmanager.c:382
+msgid "to _all files"
+msgstr "para todos os arquivos"
+
+#: modules/tools/selectionmanager.c:393
+msgid "_Copy"
+msgstr "_Copiar"
+
+#: modules/tools/sfunctions.c:186
+msgid ""
+"Statistical function tool, calculates one-dimensional statistical functions "
+"(height distribution, correlations, PSDF, Minkowski functionals) of selected "
+"part of data."
+msgstr ""
+"Ferramenta de função estatística, calcula funções estatísticas "
+"unidimensionais (distribuição de altura, correlações, PSDF, funcionais de "
+"Minkowski) da parte selecionada dos dados."
+
+#: modules/tools/sfunctions.c:219
+msgid "Height distribution"
+msgstr "Distribuição de alturas"
+
+#: modules/tools/sfunctions.c:220
+msgid "Cum. height distribution"
+msgstr "Distribuição de alturas cumulativa"
+
+#: modules/tools/sfunctions.c:221
+msgid "Distribution of angles"
+msgstr "Distribuição de ângulos"
+
+#: modules/tools/sfunctions.c:222
+msgid "Cum. distribution of angles"
+msgstr "Distribuição de ângulos cumulativa"
+
+#: modules/tools/sfunctions.c:223
+msgid "ACF"
+msgstr "ACF"
+
+#: modules/tools/sfunctions.c:224
+msgid "HHCF"
+msgstr "HHCF"
+
+#: modules/tools/sfunctions.c:225
+msgid "PSDF"
+msgstr "PSDF"
+
+#: modules/tools/sfunctions.c:226
+msgid "Radial PSDF"
+msgstr "PSDF radial"
+
+#: modules/tools/sfunctions.c:227
+msgid "Radial ACF"
+msgstr "ACF radial"
+
+#: modules/tools/sfunctions.c:228
+msgid "Minkowski volume"
+msgstr "Volume de Minkowski"
+
+#: modules/tools/sfunctions.c:229
+msgid "Minkowski boundary"
+msgstr "Fronteira de Minkowski"
+
+#: modules/tools/sfunctions.c:230
+msgid "Minkowski connectivity"
+msgstr "Conectividade de Minkowski"
+
+#: modules/tools/sfunctions.c:232
+msgid "Area scale graph"
+msgstr ""
+
+#: modules/tools/sfunctions.c:257
+msgid "Statistical Functions"
+msgstr "Funções estatísticas"
+
+#: modules/tools/sfunctions.c:258
+msgid "Calculate 1D statistical functions"
+msgstr "Calcular funções estatísticas 1D"
+
+#: modules/tools/sfunctions.c:501
+msgid "_Separate uncertainty"
+msgstr "_Separar incerteza"
+
+#: modules/tools/spectro.c:154
+msgid "Point Spectrum, extracts point spectra to a graph."
+msgstr "Espectro pontual, extrai pontos de espectros para um gráfico."
+
+#: modules/tools/spectro.c:193
+msgid "Point Spectroscopy"
+msgstr "Espectroscopia de ponto"
+
+#: modules/tools/spectro.c:194
+msgid "Extract and view point spectroscopy data"
+msgstr "Extrair e ver dados de espectroscopia de ponto"
+
+#: modules/tools/spectro.c:362
+msgid "_Separate spectra"
+msgstr "_Separar espectro"
+
+#: modules/tools/spectro.c:372
+msgid "_Average spectra"
+msgstr "Média dos espectros"
+
+#: modules/tools/spectro.c:511
+msgid "Spectroscopy"
+msgstr "Espectroscopia"
+
+#: modules/tools/spotremove.c:158
+msgid ""
+"Spot removal tool, interpolates small parts of data (displayed on a zoomed "
+"view) using selected algorithm."
+msgstr ""
+"Ferramenta de remoção de pontos, interpola pequenas partes dos dados "
+"(exibidas em uma visão ampliada) usando o algoritmo selecionado."
+
+#: modules/tools/spotremove.c:201
+msgid "Remove Spots"
+msgstr "Remover pontos"
+
+#: modules/tools/spotremove.c:202
+msgid "Interpolate small defects, manually selected"
+msgstr "Interpolar pequenos defeitos, selecionado manualmente"
+
+#: modules/tools/spotremove.c:269
+msgid "Hyperbolic flatten"
+msgstr "Achatamento hiperbólico"
+
+#: modules/tools/spotremove.c:270
+msgid "Pseudo-Laplace"
+msgstr "Pseudo-Laplace"
+
+#: modules/tools/spotremove.c:272
+msgid "Fractal interpolation"
+msgstr "Interpolação fractal"
+
+#: modules/tools/spotremove.c:577
+msgid "No point in the image selected."
+msgstr "Nenhum ponto na imagem selecionada."
+
+#: modules/tools/spotremove.c:579
+msgid "No area in the zoom selected."
+msgstr "Sem área na seleção amplificada."
+
+#: modules/tools/stats.c:207
+msgid "Ra (Sa):"
+msgstr "Ra (Sa):"
+
+#: modules/tools/stats.c:208
+msgid "Rms (Sq):"
+msgstr "Rms (Sq):"
+
+#: modules/tools/stats.c:209
+msgid "Rms (grain-wise):"
+msgstr "Rms (grãos):"
+
+#: modules/tools/stats.c:212
+msgid "Surface area:"
+msgstr "Área da superfície:"
+
+#: modules/tools/stats.c:213
+msgid "Projected area:"
+msgstr "Área projetada:"
+
+#: modules/tools/stats.c:217
+msgid "Inclination θ:"
+msgstr "Inclinação θ:"
+
+#: modules/tools/stats.c:218
+msgid "Inclination φ:"
+msgstr "Inclinação φ:"
+
+#: modules/tools/stats.c:224
+msgid "Statistics tool."
+msgstr "Ferramenta de estatísticas."
+
+#: modules/tools/stats.c:261 modules/tools/stats.c:1091
+msgid "Statistical Quantities"
+msgstr "Quantidades estatísticas"
+
+#: modules/tools/stats.c:262
+msgid "Statistical quantities"
+msgstr "Quantidades estatísticas"
+
+#: modules/tools/stats.c:998
+msgid "Save Statistical Quantities"
+msgstr "Salvar quantidades estatísticas"
+
+#: modules/tools/stats.c:1096
+#, c-format
+msgid "File:         %s\n"
+msgstr "Arquivo:         %s\n"
+
+#: modules/tools/stats.c:1100
+#, c-format
+msgid "Data channel: %s\n"
+msgstr "Canal de dados: %s\n"
+
+#: modules/tools/stats.c:1118
+msgid "Yes"
+msgstr "Sim"
+
+#: modules/tools/stats.c:1118
+msgid "No"
+msgstr "Não"
+
+#: modules/tools/stats.c:1128
+#, c-format
+msgid ""
+"Selected area: %s × %s at (%s, %s) px\n"
+"               %s × %s at (%s, %s) %s\n"
+"Mask in use:   %s\n"
+msgstr ""
+"Área selecionada: %s × %s em (%s, %s) px\n"
+"               %s × %s em (%s, %s) %s\n"
+"Máscara em uso:   %s\n"
+
+#: modules/volume/volume_calibrate.c:175
+msgid "Recalibrate volume data dimensions or value range."
+msgstr "Recalibrar dimensões do volume de dados ou intervalo de valor."
+
+#: modules/volume/volume_calibrate.c:189
+msgid "/_Dimensions and Units..."
+msgstr "/_Dimensões e unidades..."
+
+#: modules/volume/volume_calibrate.c:369
+msgid "Volume Dimensions and Units"
+msgstr "Dimensões de volume e unidades"
+
+#: modules/volume/volume_calibrate.c:486
+msgid "_Value range:"
+msgstr "Intervalo de _valores:"
+
+#: modules/volume/volume_calibrate.c:508
+msgid "Value shi_ft:"
+msgstr "Deslocamento de valores:"
+
+#: modules/volume/volume_calibrate.c:542
+msgid "_Value calibration factor:"
+msgstr "Fator de calibração de _valores:"
+
+#: modules/volume/volume_extract.c:216
+msgid "Shows and/or extracts a section of volume data"
+msgstr "Mostra e/ou extrai uma seção de volume de dados"
+
+#: modules/volume/volume_extract.c:230
+#, fuzzy
+msgid "/Show and _Extract..."
+msgstr "/Mostrar e _extrair..."
+
+#: modules/volume/volume_extract.c:234
+msgid "Show and/or extract a section of volume data"
+msgstr "Mostrar e/ou extrair uma seção de volume de dados"
+
+#: modules/volume/volume_extract.c:263
+msgid "X cross-section"
+msgstr "Secção transversal X"
+
+#: modules/volume/volume_extract.c:264
+msgid "Y cross-section"
+msgstr "Secção transversal Y"
+
+#: modules/volume/volume_extract.c:265
+msgid "Z cross-section"
+msgstr "Secção transversal Z"
+
+#: modules/volume/volume_extract.c:266 modules/volume/volume_extract.c:684
+msgid "X direction sum"
+msgstr "Soma na direção X"
+
+#: modules/volume/volume_extract.c:267 modules/volume/volume_extract.c:686
+msgid "Y direction sum"
+msgstr "Soma na direção Y"
+
+#: modules/volume/volume_extract.c:268 modules/volume/volume_extract.c:688
+msgid "Z direction sum"
+msgstr "Soma na direção Z"
+
+#: modules/volume/volume_extract.c:271
+msgid "X direction"
+msgstr "Direção X"
+
+#: modules/volume/volume_extract.c:272
+msgid "Y direction"
+msgstr "Direção Y"
+
+#: modules/volume/volume_extract.c:273
+msgid "Z direction"
+msgstr "Direção Z"
+
+#: modules/volume/volume_extract.c:315
+msgid "Volume data"
+msgstr "Dados de volume"
+
+#: modules/volume/volume_extract.c:317
+msgid "_Load"
+msgstr "Carregar"
+
+#: modules/volume/volume_extract.c:329
+msgid "_Extract projection"
+msgstr "Extrair projeção"
+
+#: modules/volume/volume_extract.c:347
+msgid "Projections"
+msgstr "Projeções"
+
+#: modules/volume/volume_extract.c:395
+msgid "Z position"
+msgstr "Posição Z"
+
+#: modules/volume/volume_extract.c:405
+msgid "Shown cut direction:"
+msgstr "Direção do corte exibida:"
+
+#: modules/volume/volume_extract.c:485
+msgid "Graph cut direction:"
+msgstr "Direção de corte do gráfico:"
+
+#: modules/volume/volume_extract.c:511
+msgid "3D view"
+msgstr "Visão 3D"
+
+#: modules/volume/volume_extract.c:538
+msgid "Zoom"
+msgstr "Zoom"
+
+#: modules/volume/volume_extract.c:545
+msgid "Wireframe threshold"
+msgstr "Limiar da estrutura tipo arame"
+
+#: modules/volume/volume_extract.c:552
+msgid "Z scale"
+msgstr "Escala Z"
+
+#: modules/volume/volume_extract.c:559
+msgid "Opacity scale"
+msgstr "Escala de opacidade"
+
+#: modules/volume/volume_extract.c:565
+#, fuzzy
+msgid "Apply perspective"
+msgstr "Aplicar perspectiva"
+
+#: modules/volume/volume_extract.c:574
+#, fuzzy
+msgid "Instant 3D render"
+msgstr "Renderização 3D instantânea"
+
+#: modules/volume/volume_extract.c:587
+msgid "X view"
+msgstr "Visão X"
+
+#: modules/volume/volume_extract.c:592
+msgid "Y view"
+msgstr "Visão Y"
+
+#: modules/volume/volume_extract.c:597
+msgid "Z view"
+msgstr "Visão Z"
+
+#: modules/volume/volume_extract.c:669
+#, c-format
+msgid "X cross-section at x: %d"
+msgstr "Secção transversal X em x: %d"
+
+#: modules/volume/volume_extract.c:672
+#, c-format
+msgid "Y cross-section at y: %d"
+msgstr "Secção transversal Y em y: %d"
+
+#: modules/volume/volume_extract.c:676
+#, c-format
+msgid "Z cross-section at Z = %g %s (#%d)"
+msgstr "Secção transversal Z em Z = %g %s (#%d)"
+
+#: modules/volume/volume_extract.c:735 modules/volume/volume_slice.c:1278
+#, c-format
+msgid "X graph at y: %d z: %d"
+msgstr "Gráfico X em y: %d z: %d"
+
+#: modules/volume/volume_extract.c:738 modules/volume/volume_slice.c:1287
+#, c-format
+msgid "Y graph at x: %d z: %d"
+msgstr "Gráfico Y em x: %d z: %d"
+
+#: modules/volume/volume_extract.c:741 modules/volume/volume_slice.c:1269
+#, c-format
+msgid "Z graph at x: %d y: %d"
+msgstr "Gráfico Z em x: %d y: %d"
+
+#: modules/volume/volume_extract.c:762
+msgid "Brick graph"
+msgstr "Gráfico de tijolos"
+
+#: modules/volume/volume_extract.c:1042
+msgid "Load volume data"
+msgstr "Carregar dados de volume"
+
+#: modules/volume/volume_extract.c:1204
+#, c-format
+msgid "Shown range %g to %g"
+msgstr "Mostrar intervalo %g para %g"
+
+#: modules/volume/volume_extract.c:1897
+msgid "Building wireframe model..."
+msgstr "Construindo modelo de estrutura tipo arame..."
+
+#: modules/volume/volume_fdfit.c:199
+msgid "Evaluate volume force-distance data"
+msgstr "Avaliar volume de dados força-distância"
+
+#: modules/volume/volume_fdfit.c:213
+#, fuzzy
+msgid "/_Evaluate FD Data..."
+msgstr "/Avaliar dados F-D..."
+
+#: modules/volume/volume_fdfit.c:217
+msgid "Evaluate force-distance volume data"
+msgstr "Avaliar volume de dados força-distância"
+
+#: modules/volume/volume_fdfit.c:371
+msgid "Curve _X position:"
+msgstr "Posição _X da curva:"
+
+#: modules/volume/volume_fdfit.c:380
+msgid "Curve _Y position:"
+msgstr "Posição _Y da curva:"
+
+#: modules/volume/volume_fdfit.c:511
+msgid "e_stimate"
+msgstr "E_stimar"
+
+#: modules/volume/volume_invert.c:39 modules/volume/volumeops.c:39
+msgid "Inverts value in volume data"
+msgstr "Inverte valor em volume de dados"
+
+#: modules/volume/volume_invert.c:53
+#, fuzzy
+msgid "/_Invert Value"
+msgstr "/_Inverter valor"
+
+#: modules/volume/volume_invert.c:57
+msgid "Invert value in volume data"
+msgstr "Inverter valor em volume de dados"
+
+#: modules/volume/volume_kmeans.c:95
+msgid "Calculates K-means clustering on volume data."
+msgstr "Calcula particionamento K-médios em dados de volume."
+
+#: modules/volume/volume_kmeans.c:109
+#, fuzzy
+msgid "/_K-Means Clustering..."
+msgstr "/Particionamento K-médios..."
+
+#: modules/volume/volume_kmeans.c:113
+msgid "Calculate K-means clustering on volume data"
+msgstr "Calcular particionamento K-médios em dados de volume"
+
+#: modules/volume/volume_kmeans.c:152
+msgid "K-means"
+msgstr "K-médios"
+
+#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:163
+msgid "_Number of clusters:"
+msgstr "_Número de particionamentos:"
+
+#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:170
+msgid "Convergence _precision digits:"
+msgstr "Precisão dos dígitos de convergência:"
+
+#: modules/volume/volume_kmeans.c:183 modules/volume/volume_kmedians.c:176
+msgid "_Max. iterations:"
+msgstr "Interações _máx.:"
+
+#: modules/volume/volume_kmeans.c:187 modules/volume/volume_kmedians.c:181
+msgid "_Normalize"
+msgstr "_Normalizar"
+
+#: modules/volume/volume_kmeans.c:193
+msgid "_Remove outliers"
+msgstr "_Remover isolados"
+
+#: modules/volume/volume_kmeans.c:202
+msgid "Outliers _threshold:"
+msgstr "Limite dos isolados:"
+
+#: modules/volume/volume_kmeans.c:425
+msgid "K-means iteration..."
+msgstr "Interação K-médios..."
+
+#: modules/volume/volume_kmeans.c:645
+#, c-format
+msgid "K-means cluster of %s"
+msgstr "Particionamento K-médios de %s"
+
+#: modules/volume/volume_kmeans.c:654
+#, c-format
+msgid "K-means error of %s"
+msgstr "Erro K-médios de %s"
+
+#: modules/volume/volume_kmeans.c:664 modules/volume/volume_kmedians.c:512
+#, c-format
+msgid "Pre-normalized intensity of %s"
+msgstr "Intensidade pré-normalizada de %s"
+
+#: modules/volume/volume_kmeans.c:696
+#, c-format
+msgid "K-means center %d"
+msgstr "Centro de K-médios %d"
+
+#: modules/volume/volume_kmedians.c:88
+msgid "Calculates K-medians clustering on volume data."
+msgstr "Calcula particionamento K-medianos em dados de volume."
+
+#: modules/volume/volume_kmedians.c:102
+#, fuzzy
+msgid "/_K-Medians Clustering..."
+msgstr "/Particionamento K-medianos..."
+
+#: modules/volume/volume_kmedians.c:106
+msgid "Calculate K-medians clustering on volume data"
+msgstr "Calcular particionamento K-medianos em dados de volume"
+
+#: modules/volume/volume_kmedians.c:145
+msgid "K-Medians"
+msgstr "K-medianos"
+
+#: modules/volume/volume_kmedians.c:390
+msgid "K-medians iteration..."
+msgstr "Interação K-medianos..."
+
+#: modules/volume/volume_kmedians.c:493
+#, c-format
+msgid "K-medians cluster of %s"
+msgstr "Particionamento K-medianos de %s"
+
+#: modules/volume/volume_kmedians.c:502
+#, c-format
+msgid "K-medians error of %s"
+msgstr "Erro K-medianos de %s"
+
+#: modules/volume/volume_kmedians.c:544
+#, c-format
+msgid "K-medians center %d"
+msgstr "Centro de K-medianos %d"
+
+#: modules/volume/volume_linestat.c:173
+msgid "Summarizes profiles of volume data to a channel."
+msgstr "Compila perfis de volume de dados para um canal."
+
+#: modules/volume/volume_linestat.c:187
+msgid "/Summarize _Profiles..."
+msgstr "/Compilar _perfis..."
+
+#: modules/volume/volume_linestat.c:191
+msgid "Summarize profiles"
+msgstr "Compilar perfis"
+
+#: modules/volume/volume_linestat.c:251
+msgid "_Extract image"
+msgstr "_Extrair imagem"
+
+#: modules/volume/volume_linestat.c:252
+msgid "Set _preview"
+msgstr "Definir _previsão"
+
+#: modules/volume/volume_linestat.c:289
+msgid "Summarize Volume Profiles"
+msgstr "Compilar perfis de volume"
+
+#: modules/volume/volume_slice.c:196
+msgid "Extracts image planes and line graphs from volume data."
+msgstr ""
+"Extrai planos de imagem e gráficos de linhas a partir de dados de volume."
+
+#: modules/volume/volume_slice.c:210
+msgid "/Cut and _Slice..."
+msgstr "/Cortar e fatiar..."
+
+#: modules/volume/volume_slice.c:214
+msgid "Extract image planes and line graphs"
+msgstr "Extrai planos de imagem e gráficos de linhas"
+
+#: modules/volume/volume_slice.c:266
+msgid "Image slice"
+msgstr "Fatia da imagem"
+
+#: modules/volume/volume_slice.c:267
+msgid "Line graph"
+msgstr "Linha de gráfico"
+
+#: modules/volume/volume_slice.c:292
+msgid "Slice Volume Data"
+msgstr "Fatiar dados de volume"
+
+#: modules/volume/volume_slice.c:371
+msgid "_Base plane:"
+msgstr "Plano _base:"
+
+#: modules/volume/volume_slice.c:422
+msgid "Extract _multiple items"
+msgstr "Extrair _múltiplos itens"
+
+#: modules/volume/volume_slice.c:439
+msgid "Positions"
+msgstr "Posições"
+
+#: modules/volume/volume_slice.c:492
+msgid "_Z:"
+msgstr "_Z:"
+
+#: modules/volume/volume_slice.c:1167
+#, c-format
+msgid "Z slice at %.*f%s%s (#%d)"
+msgstr "Fatia Z em %.*f%s%s (#%d)"
+
+#: modules/volume/volume_slice.c:1178
+#, c-format
+msgid "Y slice at %.*f%s%s (#%d)"
+msgstr "Fatia Y em %.*f%s%s (#%d)"
+
+#: modules/volume/volume_slice.c:1189
+#, c-format
+msgid "X slice at %.*f%s%s (#%d)"
+msgstr "Fatia X em %.*f%s%s (#%d)"
+
+#: modules/volume/volume_slice.c:1325
+msgid "Volume Z graphs"
+msgstr "Gráficos de volume Z"
+
+#: modules/volume/volume_slice.c:1332
+msgid "Volume X graphs"
+msgstr "Gráficos de volume X"
+
+#: modules/volume/volume_slice.c:1339
+msgid "Volume Y graphs"
+msgstr "Gráficos de volume Y"
+
+#: modules/volume/volume_swaxes.c:104
+#, fuzzy
+msgid "Swaps axes of volume data."
+msgstr "Inverte valor em volume de dados"
+
+#: modules/volume/volume_swaxes.c:118
+#, fuzzy
+msgid "/S_wap axes..."
+msgstr "/Salvar _como"
+
+#: modules/volume/volume_swaxes.c:122
+#, fuzzy
+msgid "Swap axes"
+msgstr "Mostrar ei_xos"
+
+#: modules/volume/volume_swaxes.c:156
+#, fuzzy
+msgid "X"
+msgstr "_X:"
+
+#: modules/volume/volume_swaxes.c:157
+#, fuzzy
+msgid "X, reversed"
+msgstr "Re_verter"
+
+#: modules/volume/volume_swaxes.c:158
+#, fuzzy
+msgid "Y"
+msgstr "_Y:"
+
+#: modules/volume/volume_swaxes.c:159
+#, fuzzy
+msgid "Y, reversed"
+msgstr "Re_verter"
+
+#: modules/volume/volume_swaxes.c:160
+msgid "Z"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:161
+#, fuzzy
+msgid "Z, reversed"
+msgstr "Re_verter"
+
+#: modules/volume/volume_swaxes.c:175
+msgid "Swap Volume Axes"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:196
+msgid "Current _X axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:204
+msgid "Current _Y axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:212
+msgid "Current _Z axis will become:"
+msgstr ""
+
+#: modules/volume/volume_swaxes.c:219
+#, fuzzy
+msgid "Create new volume data"
+msgstr "Carregar dados de volume"
+
+#: modules/volume/volume_swaxes.c:286
+msgid "Z axis calibration will be lost."
+msgstr ""
+
+#: modules/volume/volume_zcal.c:104
+msgid "Attaches, extracts and removes volume data z-axis calibration."
+msgstr "Anexa, extrai e remove calibração do eixo z do volume de dados ."
+
+#: modules/volume/volume_zcal.c:118
+msgid "/_Z-Calibration..."
+msgstr "/Calibração _Z..."
+
+#: modules/volume/volume_zcal.c:122
+msgid "Manage z-axis calibration"
+msgstr "Gerencia calibração do eixo z"
+
+#: modules/volume/volume_zcal.c:172
+msgid "_Extract to a graph"
+msgstr "_Extrair para um gráfico"
+
+#: modules/volume/volume_zcal.c:174
+msgid "_Attach from file"
+msgstr "_Anexar de um arquivo"
+
+#: modules/volume/volume_zcal.c:186 modules/volume/volume_zcal.c:225
+msgid "Volume Z Calibration"
+msgstr "Calibração de volume Z"
+
+#: modules/volume/volume_zcal.c:205
+msgid "Z-calibration action:"
+msgstr "Ação de calibração Z:"
+
+#: modules/volume/volume_zcal.c:357
+msgid "Calibration from file"
+msgstr "Calibração a partir de um arquivo"
+
+#: modules/volume/volume_zcal.c:359 modules/volume/volume_zcal.c:440
+msgid "Z-calibration curve"
+msgstr "Curva de calibração Z"
+
+#: modules/volume/volume_zcal.c:404
+msgid "Index"
+msgstr "Índice"
+
+#: modules/volume/volume_zcal.c:405
+msgid "Z axis value"
+msgstr "Valor do eixo Z"
+
+#: modules/volume/volume_zcal.c:490
+msgid ""
+"Calibration data file must have\n"
+"exactly one column."
+msgstr ""
+"Arquivo de dados de calibração deve conter\n"
+"exatamente uma coluna."
+
+#: modules/volume/volume_zcal.c:508
+msgid ""
+"File does not contain any\n"
+"readable data."
+msgstr ""
+"O arquivo não contém nenhum\n"
+"dado legível."
+
+#: modules/volume/volume_zcal.c:516
+#, c-format
+msgid ""
+"The number of data file values %d\n"
+"differs from the number of planes %d."
+msgstr ""
+"O número de valores do arquivo de dados %d\n"
+"é diferente do número de planos %d."
+
+#: modules/volume/volumeops.c:53
+#, fuzzy
+msgid "/Extract _Preview"
+msgstr "Extrair perfis"
+
+#: modules/volume/volumeops.c:57
+#, fuzzy
+msgid "Extract volume data preview to an image"
+msgstr "Salvar visão 3D para uma imagem"
+
+#: modules/xyz/xyz_drift.c:267
+msgid "Analyzes drift in XYZ data."
+msgstr "Analisa deriva em dados XYZ."
+
+#: modules/xyz/xyz_drift.c:281
+msgid "/Analyze _Drift..."
+msgstr "/Analisar _deriva..."
+
+#: modules/xyz/xyz_drift.c:285
+msgid "Analyze and/or remove drift"
+msgstr "Analisar e/ou remover deriva"
+
+#: modules/xyz/xyz_drift.c:362
+msgid ""
+"No timestamp channel found, either called 'Timestamp' or having units in "
+"seconds."
+msgstr ""
+"Nenhum canal com marca de data/hora encontrado, seja com o nome de "
+"'Timestamp' ou tendo unidades em segundos."
+
+#: modules/xyz/xyz_drift.c:391 modules/xyz/xyz_drift.c:849
+msgid "X drift"
+msgstr "Deriva X"
+
+#: modules/xyz/xyz_drift.c:410 modules/xyz/xyz_drift.c:850
+msgid "Y drift"
+msgstr "Deriva Y"
+
+#: modules/xyz/xyz_drift.c:421
+msgid "y-axis drift"
+msgstr "Deriva do eixo y"
+
+#: modules/xyz/xyz_drift.c:429 modules/xyz/xyz_drift.c:851
+msgid "Z drift"
+msgstr "Deriva Z"
+
+#: modules/xyz/xyz_drift.c:440
+msgid "z-axis drift"
+msgstr "Deriva do eixo z"
+
+#: modules/xyz/xyz_drift.c:541
+msgid "Analyze XYZ Drift"
+msgstr "Analisar deriva XYZ"
+
+#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:406
+msgid "Reset Ran_ges"
+msgstr "Reiniciar intervalos"
+
+#: modules/xyz/xyz_drift.c:615
+msgid "_Guess parameters"
+msgstr "Adivinhar parâmetros"
+
+#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:539
+msgid "_X-range:"
+msgstr "Intervalo _X:"
+
+#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:561
+msgid "_Y-range:"
+msgstr "Intervalo _Y:"
+
+#: modules/xyz/xyz_drift.c:840 modules/xyz/xyz_drift.c:845
+msgid "2nd order polynom"
+msgstr "Polinômio de ordem 2"
+
+#: modules/xyz/xyz_drift.c:860
+msgid "Initial values"
+msgstr "Valores iniciais"
+
+#: modules/xyz/xyz_drift.c:868
+msgid "_X drift:"
+msgstr "Deriva _X:"
+
+#: modules/xyz/xyz_drift.c:896 modules/xyz/xyz_drift.c:939
+#: modules/xyz/xyz_drift.c:984
+msgid "_fit"
+msgstr "ajustar"
+
+#: modules/xyz/xyz_drift.c:908
+msgid "_Y drift:"
+msgstr "Deriva _Y:"
+
+#: modules/xyz/xyz_drift.c:953
+msgid "Z fit _type:"
+msgstr "Tipo de ajuste _Z:"
+
+#: modules/xyz/xyz_drift.c:1009
+msgid "Search parameters"
+msgstr "Procurar parâmetros"
+
+#: modules/xyz/xyz_drift.c:1014
+msgid "_Neighbors used:"
+msgstr "Vizinhos usados:"
+
+#: modules/xyz/xyz_drift.c:1031
+msgid "_Length threshold:"
+msgstr "Limiar de comprimento:"
+
+#: modules/xyz/xyz_drift.c:1050
+msgid "_Time threshold:"
+msgstr "Limiar de _tempo:"
+
+#: modules/xyz/xyz_drift.c:1068
+msgid "_Max iterations:"
+msgstr "Máx. de interações:"
+
+#: modules/xyz/xyz_drift.c:1081
+msgid "Results"
+msgstr "Resultados"
+
+#: modules/xyz/xyz_drift.c:1095
+msgid "X drift:"
+msgstr "Deriva X:"
+
+#: modules/xyz/xyz_drift.c:1103 modules/xyz/xyz_drift.c:1121
+#: modules/xyz/xyz_drift.c:1138
+msgid "to inits"
+msgstr "inicializar"
+
+#: modules/xyz/xyz_drift.c:1113
+msgid "Y drift:"
+msgstr "Deriva Y:"
+
+#: modules/xyz/xyz_drift.c:1130
+msgid "Z drift:"
+msgstr "Deriva Z:"
+
+#: modules/xyz/xyz_drift.c:1745
+msgid "No neighbors found"
+msgstr "Nenhum vizinho encontrado"
+
+#: modules/xyz/xyz_drift.c:1919
+msgid "Fitting in progress..."
+msgstr "Ajuste em progresso..."
+
+#: modules/xyz/xyz_drift.c:2264 modules/xyz/xyz_raster.c:981
+msgid "Physical dimensions are invalid."
+msgstr "Dimensões físicas são inválidas."
+
+#: modules/xyz/xyz_level.c:93
+msgid "Simple XYZ data leveling."
+msgstr "Nivelamento simples de dados XYZ."
+
+#: modules/xyz/xyz_level.c:107
+msgid "/Fix _Zero"
+msgstr "/Fixar _zero"
+
+#: modules/xyz/xyz_level.c:114
+msgid "/Zero _Mean Value"
+msgstr "/Zerar valor _médio"
+
+#: modules/xyz/xyz_level.c:121
+msgid "/Plane _Level..."
+msgstr "/Nivelamento plano..."
+
+#: modules/xyz/xyz_level.c:125
+msgid "Level data by mean plane correction"
+msgstr "Nivelar dados por correção de plano médio"
+
+#: modules/xyz/xyz_level.c:224
+msgid "Plane subtraction"
+msgstr "Subtração de plano"
+
+#: modules/xyz/xyz_level.c:225
+msgid "Rotation"
+msgstr "Rotação"
+
+#: modules/xyz/xyz_level.c:236
+msgid "Level XYZ Data"
+msgstr "Nivelar dados XYZ"
+
+#: modules/xyz/xyz_level.c:272
+msgid "Update X and Y of _all compatible data"
+msgstr "Atualizar X e Y para todos os dados compatíveis"
+
+#: modules/xyz/xyz_raster.c:194
+msgid "Rasterizes XYZ data to images."
+msgstr "Rasteriza dados XYZ para imagens."
+
+#: modules/xyz/xyz_raster.c:208
+msgid "/_Rasterize..."
+msgstr "/_Rasterizar..."
+
+#: modules/xyz/xyz_raster.c:212
+msgid "Rasterize to image"
+msgstr "Rasterizar para imagem"
+
+#: modules/xyz/xyz_raster.c:337
+msgid "Rasterize XYZ Data"
+msgstr "Rasterizar dados XYZ"
+
+#: modules/xyz/xyz_raster.c:351
+msgid "Create Image _Directly"
+msgstr "Criar imagem _diretamente"
+
+#: modules/xyz/xyz_raster.c:357
+msgid "XY points form a regular grid so interpolation is not necessary."
+msgstr ""
+"Pontos XY formam uma grade regular, logo a interpolação não é necessária."
+
+#: modules/xyz/xyz_raster.c:392
+msgid "Make Pixels S_quare"
+msgstr "Tornar pixeis _quadrados"
+
+#: modules/xyz/xyz_raster.c:611
+msgid "Field"
+msgstr "Campo"
+
+#: modules/xyz/xyz_raster.c:925
+#, c-format
+msgid ""
+"Number of points: %u\n"
+"Merged as too close: %u\n"
+"Added on the boundaries: %u"
+msgstr ""
+"Número de pontos: %u\n"
+"Mesclado como muito próximo: %u\n"
+"Adicionado nas fronteiras: %u"
+
+#: modules/xyz/xyz_raster.c:1065
+msgid ""
+"XYZ data regularization failed due to numerical instability or was "
+"interrupted."
+msgstr ""
+"A regularização de dados XYZ falhou devido a instabilidade numérica ou foi "
+"interrompida."
+
+#~ msgid "pixels"
+#~ msgstr "pixels "
+
+#~ msgid "Fast Fourier Transform"
+#~ msgstr "Transformada de Fourier rápida"
+
+#~ msgid "built-in SimpleFFT\n"
+#~ msgstr "SimpleFFT embutida\n"
+
+#~ msgid "_Like Current Channel"
+#~ msgstr "Como o canal atual"
+
+#~ msgid "Re_fine"
+#~ msgstr "Re_finar"
+
+#~ msgid "Surface _coverage:"
+#~ msgstr "_Cobertura da superfície:"
+
+#~ msgid "Distribute"
+#~ msgstr "Distribuir"
+
+#~ msgid "Replace"
+#~ msgstr "Substituir"
+
+#~ msgid "_Fix res.:"
+#~ msgstr "_Fix res.:"
+
+#~ msgid "Reco_mpute"
+#~ msgstr "Recalcular"
+
+#~ msgid "Show mode:"
+#~ msgstr "Mostrar modo:"
+
+#~ msgid "Initializing GUI"
+#~ msgstr "Inicializando GUI"
+
+#, fuzzy
+#~ msgid "Slab size _x:"
+#~ msgstr "Tamanho do _plano:"
+
+#, fuzzy
+#~ msgid "Slab size _y:"
+#~ msgstr "Tamanho do _plano:"
+
+#, fuzzy
+#~ msgid "Stitch operations on data fields."
+#~ msgstr "Operações aritméticas simples com campos de dados."
+
+#, fuzzy
+#~ msgid "Stitch operations on data"
+#~ msgstr "Operações aritméticas em dados"
+
+#, fuzzy
+#~ msgid "X offset"
+#~ msgstr "Afastamento _X:"
+
+#, fuzzy
+#~ msgid "Y offset"
+#~ msgstr "Afastamento _Y:"
+
+#~ msgid "Create new channel"
+#~ msgstr "Criar um novo canal"
+
+#~ msgid "Borders extension..."
+#~ msgstr "Extensão para as bordas..."
+
+#~ msgid "Laplace interpolation..."
+#~ msgstr "Interpolação de Laplace..."
+
+#~ msgid "Graph function written in Python"
+#~ msgstr "Criar gráfico da função escrita em Python"
+
+#~ msgid ""
+#~ "Pygwy plugin: %s (%s)\n"
+#~ "Export failed."
+#~ msgstr ""
+#~ "Plugin Pygwy: %s (%s)\n"
+#~ "Exportação falhou."
diff --git a/po/ru.gmo b/po/ru.gmo
index a97263f..268e3f2 100644
Binary files a/po/ru.gmo and b/po/ru.gmo differ
diff --git a/po/ru.po b/po/ru.po
index 7e1bcfd..3df670e 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gwyddion\n"
 "Report-Msgid-Bugs-To: yeti at gwyddion.net\n"
-"POT-Creation-Date: 2016-11-18 11:05+0100\n"
-"PO-Revision-Date: 2016-11-15 23:19+0300\n"
+"POT-Creation-Date: 2017-08-15 17:48+0200\n"
+"PO-Revision-Date: 2017-08-13 21:08+0400\n"
 "Last-Translator: Daniil Bratashov <dn2010 at gmail.com>\n"
 "Language-Team: russian <ru at li.org>\n"
 "Language: ru_RU\n"
@@ -19,7 +19,7 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 "X-Poedit-Basepath: .\n"
-"X-Generator: Poedit 1.8.11\n"
+"X-Generator: Poedit 1.8.12\n"
 "X-Poedit-SearchPath-0: /home/dan/.poedit\n"
 
 #: libgwyddion/gwyexpr.c:765
@@ -132,7 +132,8 @@ msgstr "контакт: Герц (параболоид)"
 #: app/data-browser-aux.c:1480 app/data-browser.c:2280 app/data-browser.c:2887
 #: app/data-browser.c:3707 app/data-browser.c:3857 app/data-browser.c:4139
 #: app/data-browser.c:4504 app/data-browser.c:4590 app/data-browser.c:5016
-#: app/resource-editor.c:366 modules/process/convolution_filter.c:691
+#: app/resource-editor.c:366 modules/file/xyzexport.c:214
+#: modules/process/convolution_filter.c:691
 msgid "Untitled"
 msgstr "Безымянный"
 
@@ -140,97 +141,105 @@ msgstr "Безымянный"
 msgid "Initial residua evaluation..."
 msgstr "Оценка начальной невязки..."
 
-#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1632
+#: libgwyddion/gwynlfit.c:479 modules/process/fit-shape.c:1646
 msgid "Fitting..."
 msgstr "Аппроксимация..."
 
-#: libgwyddion/gwynlfitpreset.c:1442 libprocess/gwyprocessenums.c:101
-#: libprocess/gwyshapefitpreset.c:347
+#: libgwyddion/gwynlfitpreset.c:1549 libprocess/gwyprocessenums.c:101
+#: libprocess/gwyshapefitpreset.c:347 modules/process/psf-fit.c:157
 msgid "Gaussian"
 msgstr "Гауссиана"
 
-#: libgwyddion/gwynlfitpreset.c:1457
+#: libgwyddion/gwynlfitpreset.c:1564
 msgid "Gaussian (PSDF)"
 msgstr "Гауссиана (ФСПМ)"
 
-#: libgwyddion/gwynlfitpreset.c:1470
+#: libgwyddion/gwynlfitpreset.c:1577
 msgid "Gaussian (ACF)"
 msgstr "Гауссиана (АКФ)"
 
-#: libgwyddion/gwynlfitpreset.c:1483
+#: libgwyddion/gwynlfitpreset.c:1590
 msgid "Gaussian (HHCF)"
 msgstr "Гауссиана (ФКВВ)"
 
-#: libgwyddion/gwynlfitpreset.c:1496
+#: libgwyddion/gwynlfitpreset.c:1603
 msgid "Gaussian (RPSDF)"
 msgstr "Гауссиана (РФСПМ)"
 
-#: libgwyddion/gwynlfitpreset.c:1509
+#: libgwyddion/gwynlfitpreset.c:1616
 msgid "Two Gaussians (PSDF)"
 msgstr "Две гауссианы (ФСПМ)"
 
-#: libgwyddion/gwynlfitpreset.c:1524 modules/xyz/xyz_drift.c:841
-#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1819
+#: libgwyddion/gwynlfitpreset.c:1631 modules/xyz/xyz_drift.c:841
+#: modules/xyz/xyz_drift.c:846 modules/xyz/xyz_drift.c:1818
 msgid "Exponential"
 msgstr "Экспоненциальная"
 
-#: libgwyddion/gwynlfitpreset.c:1536
+#: libgwyddion/gwynlfitpreset.c:1643
 msgid "Exponential (PSDF)"
 msgstr "Экспоненциальная (ФСПМ)"
 
-#: libgwyddion/gwynlfitpreset.c:1549
+#: libgwyddion/gwynlfitpreset.c:1656
 msgid "Exponential (ACF)"
 msgstr "Экспоненциальная (АКФ)"
 
-#: libgwyddion/gwynlfitpreset.c:1561
+#: libgwyddion/gwynlfitpreset.c:1668
 msgid "Exponential (HHCF)"
 msgstr "Экспоненциальная (ФКВВ)"
 
-#: libgwyddion/gwynlfitpreset.c:1574
+#: libgwyddion/gwynlfitpreset.c:1681
 msgid "Exponential (RPSDF)"
 msgstr "Экспоненциальная (РФСПМ)"
 
-#: libgwyddion/gwynlfitpreset.c:1588
+#: libgwyddion/gwynlfitpreset.c:1695
+msgid "K-correlated (PSDF)"
+msgstr "K-коррелированная (ФСПМ)"
+
+#: libgwyddion/gwynlfitpreset.c:1709
 msgid "Polynomial (order 0)"
 msgstr "Полиномиальная (порядка 0)"
 
-#: libgwyddion/gwynlfitpreset.c:1599 modules/xyz/xyz_drift.c:1805
+#: libgwyddion/gwynlfitpreset.c:1720 modules/xyz/xyz_drift.c:1804
 msgid "Polynomial (order 1)"
 msgstr "Полиномиальная (порядка 1)"
 
-#: libgwyddion/gwynlfitpreset.c:1610
+#: libgwyddion/gwynlfitpreset.c:1731
 msgid "Polynomial (order 2)"
 msgstr "Полиномиальная (порядка 2)"
 
-#: libgwyddion/gwynlfitpreset.c:1622
+#: libgwyddion/gwynlfitpreset.c:1743
 msgid "Polynomial (order 3)"
 msgstr "Полиномиальная (порядка 3)"
 
-#: libgwyddion/gwynlfitpreset.c:1635
+#: libgwyddion/gwynlfitpreset.c:1756
 msgid "Square wave"
 msgstr "Прямоугольные импульсы"
 
-#: libgwyddion/gwynlfitpreset.c:1651
+#: libgwyddion/gwynlfitpreset.c:1772
 msgid "Parabolic step"
 msgstr "Параболическая ступень"
 
-#: libgwyddion/gwynlfitpreset.c:1667
+#: libgwyddion/gwynlfitpreset.c:1788
 msgid "Smooth slanted step"
 msgstr "Гладкая наклонная ступень"
 
-#: libgwyddion/gwynlfitpreset.c:1684
+#: libgwyddion/gwynlfitpreset.c:1805
 msgid "Smooth bent step"
 msgstr "Гладкая ступень с изгибом"
 
-#: libgwyddion/gwynlfitpreset.c:1700
+#: libgwyddion/gwynlfitpreset.c:1821
+msgid "Boltzmann bent step"
+msgstr "Ступень с изгибом по Больцману"
+
+#: libgwyddion/gwynlfitpreset.c:1837
 msgid "Power"
 msgstr "Степенная"
 
-#: libgwyddion/gwynlfitpreset.c:1712 libprocess/gwyshapefitpreset.c:348
+#: libgwyddion/gwynlfitpreset.c:1849 libprocess/gwyshapefitpreset.c:348
 msgid "Lorentzian"
 msgstr "Лоренцева"
 
-#: libgwyddion/gwynlfitpreset.c:1726
+#: libgwyddion/gwynlfitpreset.c:1863
 msgid "Sinc"
 msgstr "Sinc"
 
@@ -251,7 +260,7 @@ msgid "Step height (positive)"
 msgstr "Высота ступеньки (выступа)"
 
 #: libprocess/cdline.c:590 libprocess/cdline.c:599
-#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:170
+#: libgwydgets/gwydgetenums.c:48 modules/process/hough.c:163
 msgid "Line"
 msgstr "Линия"
 
@@ -264,7 +273,7 @@ msgid "Circle (down)"
 msgstr "Сфера (вниз)"
 
 #: libprocess/cdline.c:608 libprocess/cdline.c:617
-#: libgwydgets/gwygraphareadialog.c:557 modules/process/hough.c:171
+#: libgwydgets/gwygraphareadialog.c:550 modules/process/hough.c:164
 msgid "Circle"
 msgstr "Круг"
 
@@ -272,237 +281,237 @@ msgstr "Круг"
 msgid "Circle (up)"
 msgstr "Сфера (вверх)"
 
-#: libprocess/gwygrainvalue.c:64
+#: libprocess/gwygrainvalue.c:62
 msgid "Grain number"
 msgstr "Номер зерна"
 
-#: libprocess/gwygrainvalue.c:73 modules/process/curvature.c:129
+#: libprocess/gwygrainvalue.c:71 modules/process/curvature.c:128
 msgid "Center x position"
 msgstr "Положение центра по x"
 
-#: libprocess/gwygrainvalue.c:82 modules/process/curvature.c:130
+#: libprocess/gwygrainvalue.c:80 modules/process/curvature.c:129
 msgid "Center y position"
 msgstr "Положение центра по y"
 
-#: libprocess/gwygrainvalue.c:91
+#: libprocess/gwygrainvalue.c:89
 msgid "Minimum value"
 msgstr "Минимальное значение"
 
-#: libprocess/gwygrainvalue.c:100
+#: libprocess/gwygrainvalue.c:98
 msgid "Maximum value"
 msgstr "Максимальное значение"
 
-#: libprocess/gwygrainvalue.c:109 modules/process/bdep_synth.c:133
-#: modules/tools/filter.c:237
+#: libprocess/gwygrainvalue.c:107 modules/process/bdep_synth.c:133
+#: modules/tools/filter.c:238
 msgid "Mean value"
 msgstr "Среднее значение"
 
-#: libprocess/gwygrainvalue.c:118 modules/tools/filter.c:238
+#: libprocess/gwygrainvalue.c:116 modules/tools/filter.c:239
 msgid "Median value"
 msgstr "Срединное значение"
 
-#: libprocess/gwygrainvalue.c:127
+#: libprocess/gwygrainvalue.c:125
 msgid "Minimum value on boundary"
 msgstr "Минимальное значение на границе"
 
-#: libprocess/gwygrainvalue.c:136
+#: libprocess/gwygrainvalue.c:134
 msgid "Maximum value on boundary"
 msgstr "Максимальное значение на границе"
 
-#: libprocess/gwygrainvalue.c:145
+#: libprocess/gwygrainvalue.c:143
 msgid "Pixel area"
 msgstr "Площадь в пикселях"
 
-#: libprocess/gwygrainvalue.c:154
+#: libprocess/gwygrainvalue.c:152
 msgid "Projected area"
 msgstr "Площадь проекции"
 
-#: libprocess/gwygrainvalue.c:163
+#: libprocess/gwygrainvalue.c:161
 msgid "Surface area"
 msgstr "Площадь поверхности"
 
-#: libprocess/gwygrainvalue.c:172
+#: libprocess/gwygrainvalue.c:170
 msgid "Equivalent square side"
 msgstr "Сторона эквивалентного квадрата"
 
-#: libprocess/gwygrainvalue.c:181
+#: libprocess/gwygrainvalue.c:179
 msgid "Equivalent disc radius"
 msgstr "Радиус эквивалентного диска"
 
-#: libprocess/gwygrainvalue.c:190
+#: libprocess/gwygrainvalue.c:188
 msgid "Area above half-height"
 msgstr "Площадь выше половинной высоты"
 
-#: libprocess/gwygrainvalue.c:199
+#: libprocess/gwygrainvalue.c:197
 msgid "Area of convex hull"
 msgstr "Площадь выпуклой оболочки"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to
 #. * zero.
-#: libprocess/gwygrainvalue.c:210
+#: libprocess/gwygrainvalue.c:208
 msgid "Zero basis volume"
 msgstr "Объём между нулевой плоскостью и поверхностью"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * grain minimum.
-#: libprocess/gwygrainvalue.c:221
+#: libprocess/gwygrainvalue.c:219
 msgid "Grain minimum basis volume"
 msgstr "Объём между поверхностью и плоскостью, проходящей через минимум зерна"
 
 #. TRANSLATORS: Grain volume calculated using basis (foot) set to the
 #. * Laplacian background.
-#: libprocess/gwygrainvalue.c:232
+#: libprocess/gwygrainvalue.c:230
 msgid "Laplacian background basis volume"
 msgstr "Объём между поверхностью и фоном, вычисленным по Лапласу"
 
-#: libprocess/gwygrainvalue.c:241
+#: libprocess/gwygrainvalue.c:239
 msgid "Projected boundary length"
 msgstr "Длина границы проекции"
 
-#: libprocess/gwygrainvalue.c:250
+#: libprocess/gwygrainvalue.c:248
 msgid "Minimum bounding size"
 msgstr "Минимальный ограничивающий размер"
 
-#: libprocess/gwygrainvalue.c:259
+#: libprocess/gwygrainvalue.c:257
 msgid "Minimum bounding direction"
 msgstr "Направление минимального ограничивающего размера"
 
-#: libprocess/gwygrainvalue.c:268
+#: libprocess/gwygrainvalue.c:266
 msgid "Maximum bounding size"
 msgstr "Максимальный ограничивающий размер"
 
-#: libprocess/gwygrainvalue.c:277
+#: libprocess/gwygrainvalue.c:275
 msgid "Maximum bounding direction"
 msgstr "Направление максимального ограничивающего размера"
 
-#: libprocess/gwygrainvalue.c:286
+#: libprocess/gwygrainvalue.c:284
 msgid "Maximum inscribed disc radius"
 msgstr "Максимальный радиус вписанного диска"
 
-#: libprocess/gwygrainvalue.c:295
+#: libprocess/gwygrainvalue.c:293
 msgid "Maximum inscribed disc center x position"
 msgstr "Положение центра по x максимального вписанного диска"
 
-#: libprocess/gwygrainvalue.c:304
+#: libprocess/gwygrainvalue.c:302
 msgid "Maximum inscribed disc center y position"
 msgstr "Положение центра по y максимального вписанного диска"
 
-#: libprocess/gwygrainvalue.c:313
+#: libprocess/gwygrainvalue.c:311
 msgid "Minimum circumcircle radius"
 msgstr "Минимальный радиус описанной окружности"
 
-#: libprocess/gwygrainvalue.c:322
+#: libprocess/gwygrainvalue.c:320
 msgid "Minimum circumcircle center x position"
 msgstr "Положение центра по x минимальной описанной окружности"
 
-#: libprocess/gwygrainvalue.c:331
+#: libprocess/gwygrainvalue.c:329
 msgid "Minimum circumcircle center y position"
 msgstr "Положение центра по y минимальной описанной окружности"
 
-#: libprocess/gwygrainvalue.c:340
+#: libprocess/gwygrainvalue.c:338
 msgid "Mean radius"
 msgstr "Средний радиус"
 
-#: libprocess/gwygrainvalue.c:349 modules/tools/readvalue.c:319
+#: libprocess/gwygrainvalue.c:347 modules/tools/readvalue.c:322
 msgid "Inclination θ"
 msgstr "Наклон θ"
 
-#: libprocess/gwygrainvalue.c:358 modules/tools/readvalue.c:329
+#: libprocess/gwygrainvalue.c:356 modules/tools/readvalue.c:332
 msgid "Inclination φ"
 msgstr "Наклон φ"
 
-#: libprocess/gwygrainvalue.c:367
+#: libprocess/gwygrainvalue.c:365
 msgid "Curvature center x position"
 msgstr "Положение центра кривизны по x"
 
-#: libprocess/gwygrainvalue.c:376
+#: libprocess/gwygrainvalue.c:374
 msgid "Curvature center y position"
 msgstr "Положение центра кривизны по y"
 
-#: libprocess/gwygrainvalue.c:385
+#: libprocess/gwygrainvalue.c:383
 msgid "Curvature center z value"
 msgstr "Значение центра кривизны по z"
 
-#: libprocess/gwygrainvalue.c:394 modules/tools/readvalue.c:344
+#: libprocess/gwygrainvalue.c:392 modules/tools/readvalue.c:347
 msgid "Curvature 1"
 msgstr "Кривизна 1"
 
-#: libprocess/gwygrainvalue.c:403 modules/tools/readvalue.c:354
+#: libprocess/gwygrainvalue.c:401 modules/tools/readvalue.c:357
 msgid "Curvature 2"
 msgstr "Кривизна 2"
 
-#: libprocess/gwygrainvalue.c:412
+#: libprocess/gwygrainvalue.c:410
 msgid "Curvature angle 1"
 msgstr "Угол кривизны 1"
 
-#: libprocess/gwygrainvalue.c:421
+#: libprocess/gwygrainvalue.c:419
 msgid "Curvature angle 2"
 msgstr "Угол кривизны 2"
 
-#: libprocess/gwygrainvalue.c:430
+#: libprocess/gwygrainvalue.c:428
 msgid "Major semiaxis of equivalent ellipse"
 msgstr "Большая полуось эквивалентного эллипса"
 
-#: libprocess/gwygrainvalue.c:439
+#: libprocess/gwygrainvalue.c:437
 msgid "Minor semiaxis of equivalent ellipse"
 msgstr "Малая полуось эквивалентного эллипса"
 
-#: libprocess/gwygrainvalue.c:448
+#: libprocess/gwygrainvalue.c:446
 msgid "Orientation of equivalent ellipse"
 msgstr "Ориентация эквивалентного эллипса"
 
-#: libprocess/gwygrainvalue.c:1120
+#: libprocess/gwygrainvalue.c:1118
 msgid "Id"
 msgstr "Идентификатор"
 
-#: libprocess/gwygrainvalue.c:1121 modules/graph/graph_peaks.c:156
-#: modules/process/extract_path.c:391 modules/process/wave_synth.c:482
-#: modules/tools/readvalue.c:251
+#: libprocess/gwygrainvalue.c:1119 modules/graph/graph_peaks.c:154
+#: modules/process/extract_path.c:391 modules/process/wave_synth.c:513
+#: modules/tools/readvalue.c:253
 msgid "Position"
 msgstr "Позиция"
 
-#: libprocess/gwygrainvalue.c:1122 app/meta.c:411 modules/file/imgexport.c:4625
-#: modules/process/curvature.c:762 modules/tools/level3.c:468
-#: modules/tools/readvalue.c:286
+#: libprocess/gwygrainvalue.c:1120 app/meta.c:411 modules/file/imgexport.c:4573
+#: modules/process/curvature.c:759 modules/tools/level3.c:475
+#: modules/tools/readvalue.c:290
 msgid "Value"
 msgstr "Значение"
 
-#: libprocess/gwygrainvalue.c:1123
+#: libprocess/gwygrainvalue.c:1121
 msgid "Area"
 msgstr "Площадь"
 
-#: libprocess/gwygrainvalue.c:1124 app/data-browser.c:5624 app/toolbox.c:110
+#: libprocess/gwygrainvalue.c:1122 app/data-browser.c:5624 app/toolbox.c:115
 msgid "Volume"
 msgstr "Объём"
 
-#: libprocess/gwygrainvalue.c:1125
+#: libprocess/gwygrainvalue.c:1123
 msgid "Boundary"
 msgstr "Граница"
 
-#: libprocess/gwygrainvalue.c:1126 modules/process/pat_synth.c:829
-#: modules/process/pat_synth.c:1131 modules/process/pat_synth.c:1466
-#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:147
+#: libprocess/gwygrainvalue.c:1124 modules/process/pat_synth.c:830
+#: modules/process/pat_synth.c:1132 modules/process/pat_synth.c:1467
+#: modules/tools/linestats.c:171 modules/volume/volume_linestat.c:149
 msgid "Slope"
 msgstr "Уклон"
 
-#: libprocess/gwygrainvalue.c:1127 modules/process/curvature.c:213
-#: modules/process/curvature.c:613
+#: libprocess/gwygrainvalue.c:1125 modules/process/curvature.c:212
+#: modules/process/curvature.c:615
 msgid "Curvature"
 msgstr "Кривизна"
 
-#: libprocess/gwygrainvalue.c:1128
+#: libprocess/gwygrainvalue.c:1126
 msgid "Moment"
 msgstr "Момент"
 
-#: libprocess/gwygrainvalue.c:1132
+#: libprocess/gwygrainvalue.c:1130
 msgid "User"
 msgstr "Пользовательские"
 
-#: libprocess/gwyprocessenums.c:44
+#: libprocess/gwyprocessenums.c:44 modules/process/preview.h:263
 msgid "Union"
 msgstr "Объединение"
 
-#: libprocess/gwyprocessenums.c:45
+#: libprocess/gwyprocessenums.c:45 modules/process/preview.h:255
 msgid "Intersection"
 msgstr "Пересечение"
 
@@ -581,13 +590,13 @@ msgid "Scale and space adaptive"
 msgstr "Адаптивный по масштабу и пространству"
 
 #. TRANSLATORS: Interpolation type (AKA nearest neighbour)
-#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3791
-#: modules/xyz/xyz_raster.c:640
+#: libprocess/gwyprocessenums.c:207 modules/file/imgexport.c:3756
+#: modules/xyz/xyz_raster.c:609
 msgid "Round"
-msgstr "Округление"
+msgstr "Округлением"
 
-#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3792
-#: modules/xyz/xyz_raster.c:641
+#: libprocess/gwyprocessenums.c:208 modules/file/imgexport.c:3757
+#: modules/xyz/xyz_raster.c:610
 msgid "Linear"
 msgstr "Линейная"
 
@@ -597,7 +606,7 @@ msgstr "Кубическая"
 
 #: libprocess/gwyprocessenums.c:210
 msgid "BSpline"
-msgstr "Бета-сплайн"
+msgstr "Бета-сплайном"
 
 #: libprocess/gwyprocessenums.c:211
 msgid "OMOMS"
@@ -605,11 +614,11 @@ msgstr "OMOMS"
 
 #: libprocess/gwyprocessenums.c:212
 msgid "NNA"
-msgstr "АБС"
+msgstr "Ближайшим соседом"
 
 #: libprocess/gwyprocessenums.c:213
 msgid "Schaum"
-msgstr "Шаум"
+msgstr "по Шауму"
 
 #: libprocess/gwyprocessenums.c:245
 msgid "windowing|None"
@@ -675,27 +684,27 @@ msgstr "Включить только область под маской"
 msgid "Use entire image (ignore mask)"
 msgstr "Использовать всё изображение (игнорировать маску)"
 
-#: libprocess/gwyprocessenums.c:602
+#: libprocess/gwyprocessenums.c:604
 msgid "distance|City-block"
 msgstr "Кварталы"
 
-#: libprocess/gwyprocessenums.c:603
+#: libprocess/gwyprocessenums.c:605
 msgid "distance|Chess"
 msgstr "Шахматное"
 
-#: libprocess/gwyprocessenums.c:604
+#: libprocess/gwyprocessenums.c:606
 msgid "distance|Octagonal 4,8"
 msgstr "Октагональное 4,8"
 
-#: libprocess/gwyprocessenums.c:605
+#: libprocess/gwyprocessenums.c:607
 msgid "distance|Octagonal 8,4"
 msgstr "Октагональное 8,4"
 
-#: libprocess/gwyprocessenums.c:606
+#: libprocess/gwyprocessenums.c:608
 msgid "distance|Octagonal"
 msgstr "Октагональное"
 
-#: libprocess/gwyprocessenums.c:607
+#: libprocess/gwyprocessenums.c:609
 msgid "distance|Euclidean"
 msgstr "Евклидово"
 
@@ -731,11 +740,11 @@ msgstr "Параболическая ступень"
 msgid "Ring"
 msgstr "Кольцо"
 
-#: libprocess/morph_lib.c:169 libprocess/tip.c:1043
+#: libprocess/morph_lib.c:169 libprocess/tip.c:1052
 msgid "Dilation..."
 msgstr "Расширение..."
 
-#: libprocess/morph_lib.c:235 libprocess/tip.c:1164
+#: libprocess/morph_lib.c:235 libprocess/tip.c:1173
 msgid "Erosion..."
 msgstr "Эрозия..."
 
@@ -768,81 +777,81 @@ msgstr[0] "Найден %d внутренний локальный максим
 msgstr[1] "Найдено %d внутренних локальных максимума"
 msgstr[2] "Найдено %d внутренних локальных максимумов"
 
-#: libprocess/tip.c:422
+#: libprocess/tip.c:431
 msgid "Pyramid"
 msgstr "Пирамида"
 
-#: libprocess/tip.c:423 libprocess/tip.c:429 libprocess/tip.c:435
+#: libprocess/tip.c:432 libprocess/tip.c:438 libprocess/tip.c:444
 msgid "Pyramidal"
 msgstr "Пирамидальный"
 
-#: libprocess/tip.c:428
+#: libprocess/tip.c:437
 msgid "Contact"
 msgstr "Контактный"
 
-#: libprocess/tip.c:434
+#: libprocess/tip.c:443
 msgid "Noncontact"
 msgstr "Бесконтактный"
 
-#: libprocess/tip.c:440
+#: libprocess/tip.c:449
 msgid "Delta function"
 msgstr "Дельта-функция"
 
-#: libprocess/tip.c:441
+#: libprocess/tip.c:450
 msgid "Analytical"
 msgstr "Аналитический"
 
-#: libprocess/tip.c:446
+#: libprocess/tip.c:455 modules/process/fibre_synth.c:259
 msgid "Parabola"
 msgstr "Парабола"
 
-#: libprocess/tip.c:447 libprocess/tip.c:453
+#: libprocess/tip.c:456 libprocess/tip.c:462
 msgid "Symmetric"
 msgstr "Симметричный"
 
-#: libprocess/tip.c:452
+#: libprocess/tip.c:461
 msgid "Cone"
 msgstr "Конический"
 
-#: libprocess/tip.c:458
+#: libprocess/tip.c:467
 msgid "Elliptical parabola"
 msgstr "Эллиптическая парабола"
 
-#: libprocess/tip.c:459
+#: libprocess/tip.c:468
 msgid "Asymmetric"
 msgstr "Асимметричный"
 
-#: libprocess/tip.c:1339 libprocess/tip.c:1367 libprocess/tip.c:1416
-#: libprocess/tip.c:1443
+#: libprocess/tip.c:1348 libprocess/tip.c:1376 libprocess/tip.c:1425
+#: libprocess/tip.c:1452
 msgid "Converting fields"
 msgstr "Преобразуются поля"
 
-#: libprocess/tip.c:1349
+#: libprocess/tip.c:1358
 msgid "Starting partial estimation"
 msgstr "Запускается частичная оценка"
 
-#: libprocess/tip.c:1426
+#: libprocess/tip.c:1435
 msgid "Starting full estimation"
 msgstr "Запускается полная оценка"
 
-#: libprocess/triangulation.c:2085 modules/process/calcoefs_view.c:793
+#: libprocess/triangulation.c:2084 modules/process/calcoefs_view.c:793
 #: modules/process/lat_synth.c:1178
 msgid "Triangulating..."
 msgstr "Производится триангуляция..."
 
-#: libgwydgets/gwy3dwindow.c:570
+#: libgwydgets/gwy3dwindow.c:575
 msgid "Rotate view (R)"
 msgstr "Повернуть вид (R)"
 
-#: libgwydgets/gwy3dwindow.c:575
+#: libgwydgets/gwy3dwindow.c:580
 msgid "Scale view as a whole (S)"
 msgstr "Масштабировать вид как целое (S)"
 
-#: libgwydgets/gwy3dwindow.c:580
+#: libgwydgets/gwy3dwindow.c:585
 msgid "Scale value range (V)"
 msgstr "Масштабировать диапазон значений (V)"
 
-#: libgwydgets/gwy3dwindow.c:585
+#: libgwydgets/gwy3dwindow.c:590
 msgid "Move light source (L)"
 msgstr "Переместить источник света (L)"
 
@@ -850,227 +859,286 @@ msgstr "Переместить источник света (L)"
 msgid "Show full controls"
 msgstr "Показать все элементы управления"
 
-#: libgwydgets/gwy3dwindow.c:693
+#: libgwydgets/gwy3dwindow.c:691
 msgid "Hide full controls"
 msgstr "Скрыть все элементы управления"
 
-#: libgwydgets/gwy3dwindow.c:709 modules/file/imgexport.c:4796
-#: modules/process/fit-shape.c:461
+#: libgwydgets/gwy3dwindow.c:707 modules/file/imgexport.c:4745
+#: modules/process/fit-shape.c:462
 msgid "adjective|Basic"
 msgstr "Основные"
 
-#: libgwydgets/gwy3dwindow.c:714
+#: libgwydgets/gwy3dwindow.c:712
 msgid "Light & Material"
 msgstr "Свет и материал"
 
-#: libgwydgets/gwy3dwindow.c:719
+#: libgwydgets/gwy3dwindow.c:717
 msgid "Labels"
 msgstr "Метки"
 
-#: libgwydgets/gwy3dwindow.c:828 modules/process/facet_analysis.c:331
-#: modules/process/facet_analysis.c:347 modules/process/shade.c:245
+#: libgwydgets/gwy3dwindow.c:722
+msgid "Colorbar"
+msgstr "Линейка псевдоцвета"
+
+#: libgwydgets/gwy3dwindow.c:838 modules/process/facet_analysis.c:335
+#: modules/process/facet_analysis.c:351 modules/process/shade.c:253
 #: modules/process/tilt.c:223
 msgid "φ:"
 msgstr "φ:"
 
-#: libgwydgets/gwy3dwindow.c:828 libgwydgets/gwy3dwindow.c:834
-#: libgwydgets/gwy3dwindow.c:1032 libgwydgets/gwy3dwindow.c:1040
-#: modules/process/facet_analysis.c:375 modules/process/indent_analyze.c:460
-#: modules/process/rotate.c:264 modules/process/shade.c:237
-#: modules/process/shade.c:245 modules/process/tilt.c:211
-#: modules/process/tilt.c:223 modules/process/tip_model.c:234
-#: modules/process/tip_model.c:240 modules/process/unrotate.c:334
+#: libgwydgets/gwy3dwindow.c:838 libgwydgets/gwy3dwindow.c:843
+#: libgwydgets/gwy3dwindow.c:1013 libgwydgets/gwy3dwindow.c:1020
+#: modules/process/correct_affine.c:461 modules/process/facet_analysis.c:238
+#: modules/process/facet_analysis.c:370 modules/process/indent_analyze.c:438
+#: modules/process/measure_lattice.c:381 modules/process/rotate.c:264
+#: modules/process/shade.c:245 modules/process/shade.c:253
+#: modules/process/synth.h:379 modules/process/synth.h:410
+#: modules/process/tilt.c:211 modules/process/tilt.c:223
+#: modules/process/tip_model.c:234 modules/process/tip_model.c:240
+#: modules/process/unrotate.c:334 modules/tools/distance.c:197
+#: modules/tools/readvalue.c:223 modules/tools/stats.c:319
 msgid "deg"
 msgstr "°"
 
-#: libgwydgets/gwy3dwindow.c:834 modules/process/facet_analysis.c:330
-#: modules/process/facet_analysis.c:346 modules/process/shade.c:237
+#: libgwydgets/gwy3dwindow.c:843 modules/process/facet_analysis.c:334
+#: modules/process/facet_analysis.c:350 modules/process/shade.c:245
 #: modules/process/tilt.c:211
 msgid "θ:"
 msgstr "θ:"
 
-#: libgwydgets/gwy3dwindow.c:839 modules/process/cwt.c:151
+#: libgwydgets/gwy3dwindow.c:849 modules/process/cwt.c:151
 msgid "_Scale:"
 msgstr "_Масштаб:"
 
-#: libgwydgets/gwy3dwindow.c:846
+#: libgwydgets/gwy3dwindow.c:856
 msgid "_Value scale:"
 msgstr "Масштаб _значений:"
 
-#: libgwydgets/gwy3dwindow.c:851
+#: libgwydgets/gwy3dwindow.c:862
 msgid "Ph_ysical scale:"
 msgstr "_Физический масштаб:"
 
-#: libgwydgets/gwy3dwindow.c:865
+#: libgwydgets/gwy3dwindow.c:876
 msgid "verb|Set"
 msgstr "Установить"
 
-#: libgwydgets/gwy3dwindow.c:877
+#: libgwydgets/gwy3dwindow.c:886
 msgid "Line _width:"
 msgstr "_Ширина линии:"
 
-#: libgwydgets/gwy3dwindow.c:881
+#: libgwydgets/gwy3dwindow.c:886 libgwydgets/gwy3dwindow.c:1194
+#: libgwydgets/gwy3dwindow.c:1204 libgwydgets/gwy3dwindow.c:1235
+#: libgwydgets/gwygraphareadialog.c:157 libgwydgets/gwygraphareadialog.c:173
+#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
+#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
+#: modules/process/angle_dist.c:188 modules/process/angle_dist.c:213
+#: modules/process/col_synth.c:486 modules/process/crosscor.c:252
+#: modules/process/crosscor.c:260 modules/process/crosscor.c:276
+#: modules/process/crosscor.c:284 modules/process/crosscor.c:300
+#: modules/process/crosscor.c:308 modules/process/cwt.c:151
+#: modules/process/dimensions.h:88 modules/process/edge.c:672
+#: modules/process/entropy.c:242 modules/process/extend.c:220
+#: modules/process/extend.c:227 modules/process/extend.c:234
+#: modules/process/extend.c:241 modules/process/facet_analysis.c:362
+#: modules/process/fbm_synth.c:383 modules/process/hough.c:203
+#: modules/process/local_contrast.c:146 modules/process/mark_disconn.c:263
+#: modules/process/mask_morph.c:237 modules/process/median-bg.c:209
+#: modules/process/neural.c:623 modules/process/neural.c:631
+#: modules/process/psdf_logphi.c:276 modules/process/rank.c:188
+#: modules/process/scale.c:237 modules/process/scale.c:246
+#: modules/process/scars.c:353 modules/process/scars.c:361
+#: modules/process/semsim.c:227 modules/process/slope_dist.c:365
+#: modules/process/slope_dist.c:393 modules/process/sphere-revolve.c:346
+#: modules/process/straighten_path.c:278 modules/process/synth.h:280
+#: modules/process/synth.h:501 modules/process/tip_blind.c:334
+#: modules/process/tip_blind.c:342 modules/process/volumize_layers.c:240
+#: modules/process/volumize_layers.c:245 modules/process/volumize_layers.c:250
+#: modules/process/wpour_mark.c:320 modules/tools/filter.c:291
+#: modules/tools/level3.c:244 modules/tools/maskedit.c:528
+#: modules/tools/maskedit.c:629 modules/tools/pathlevel.c:256
+#: modules/tools/profile.c:377 modules/tools/profile.c:503
+#: modules/tools/readvalue.c:222 modules/tools/readvalue.c:378
+#: modules/tools/roughness.c:868 modules/volume/volume_slice.c:446
+#: modules/volume/volume_slice.c:469 modules/volume/volume_slice.c:492
+#: modules/xyz/xyz_drift.c:738 modules/xyz/xyz_drift.c:753
+#: modules/xyz/xyz_raster.c:382 modules/xyz/xyz_raster.c:388
+msgid "px"
+msgstr "пикс."
+
+#: libgwydgets/gwy3dwindow.c:891
 msgid "Show _axes"
 msgstr "Показывать _оси"
 
-#: libgwydgets/gwy3dwindow.c:890
+#: libgwydgets/gwy3dwindow.c:900
 msgid "Show _labels"
 msgstr "Показывать м_етки"
 
-#: libgwydgets/gwy3dwindow.c:899
-msgid "Show false _colorbar"
-msgstr "Показывать линейку псевдо_цвета"
-
-#: libgwydgets/gwy3dwindow.c:908
+#: libgwydgets/gwy3dwindow.c:909
 msgid "_Orthographic projection"
 msgstr "_Ортографическая проекция"
 
-#: libgwydgets/gwy3dwindow.c:917
+#: libgwydgets/gwy3dwindow.c:918
 msgid "_Hide masked"
 msgstr "Скр_ыть под маской"
 
-#: libgwydgets/gwy3dwindow.c:933
+#: libgwydgets/gwy3dwindow.c:934
 msgid "_Lighting"
 msgstr "О_свещение"
 
-#: libgwydgets/gwy3dwindow.c:934
+#: libgwydgets/gwy3dwindow.c:935
 msgid "_Gradient"
 msgstr "_Градиент"
 
-#: libgwydgets/gwy3dwindow.c:935
+#: libgwydgets/gwy3dwindow.c:936
 msgid "_Overlay"
 msgstr "_Наложение"
 
-#: libgwydgets/gwy3dwindow.c:936
+#: libgwydgets/gwy3dwindow.c:937
 msgid "_Overlay - no light"
 msgstr "Наложение - _без света"
 
-#: libgwydgets/gwy3dwindow.c:1009
+#: libgwydgets/gwy3dwindow.c:992
 msgid "_Material:"
 msgstr "_Материал:"
 
-#: libgwydgets/gwy3dwindow.c:1032
+#: libgwydgets/gwy3dwindow.c:1013
 msgid "_Light φ:"
 msgstr "_Угол φ света:"
 
-#: libgwydgets/gwy3dwindow.c:1040
+#: libgwydgets/gwy3dwindow.c:1020
 msgid "L_ight θ:"
 msgstr "Уг_ол θ света:"
 
-#: libgwydgets/gwy3dwindow.c:1070 libgwydgets/gwy3dwindow.c:1240
-#: app/toolbox-editor.c:215 modules/file/hdrimage.cc:2213
-#: modules/file/imgexport.c:4760 modules/file/pixmap.c:789
+#: libgwydgets/gwy3dwindow.c:1052 libgwydgets/gwy3dwindow.c:1243
+#: app/toolbox-editor.c:216 modules/file/hdrimage.cc:2213
+#: modules/file/imgexport.c:4708 modules/file/pixmap.c:789
 #: modules/file/rawfile.c:424 modules/process/angle_dist.c:172
 #: modules/process/bdep_synth.c:341 modules/process/calcoefs_new.c:371
-#: modules/process/calibrate.c:391 modules/process/col_synth.c:392
-#: modules/process/correct_affine.c:301 modules/process/curvature.c:615
-#: modules/process/cwt.c:135 modules/process/deposit_synth.c:349
+#: modules/process/calibrate.c:383 modules/process/col_synth.c:392
+#: modules/process/correct_affine.c:346 modules/process/curvature.c:617
+#: modules/process/cwt.c:135 modules/process/deposit_synth.c:350
 #: modules/process/diff_synth.c:411 modules/process/domain_synth.c:354
 #: modules/process/drift.c:245 modules/process/dwt.c:166
 #: modules/process/dwtanisotropy.c:184 modules/process/edge.c:638
 #: modules/process/extend.c:192 modules/process/facet-level.c:193
-#: modules/process/facet_analysis.c:271 modules/process/fbm_synth.c:303
+#: modules/process/facet_analysis.c:275 modules/process/fbm_synth.c:303
 #: modules/process/fft.c:336 modules/process/fft_filter_2d.c:417
-#: modules/process/fft_synth.c:341 modules/process/fractal.c:231
-#: modules/process/grain_edge.c:213 modules/process/grain_mark.c:247
-#: modules/process/grain_wshed.c:167 modules/process/hough.c:179
-#: modules/process/lat_synth.c:567 modules/process/latsim.c:159
-#: modules/process/level.c:245 modules/process/linematch.c:804
-#: modules/process/lno_synth.c:433 modules/process/local_contrast.c:130
-#: modules/process/logistic.c:234 modules/process/mark_disconn.c:208
-#: modules/process/mask_distribute.c:152 modules/process/measure_lattice.c:256
-#: modules/process/median-bg.c:180 modules/process/noise_synth.c:336
-#: modules/process/obj_synth.c:441 modules/process/pat_synth.c:385
-#: modules/process/pid.c:199 modules/process/polydistort.c:210
-#: modules/process/polylevel.c:373 modules/process/psdf_logphi.c:249
-#: modules/process/rank.c:158 modules/process/rotate.c:243
-#: modules/process/scale.c:196 modules/process/scars.c:298
-#: modules/process/semsim.c:211 modules/process/shade.c:208
-#: modules/process/slope_dist.c:276 modules/process/sphere-revolve.c:218
-#: modules/process/straighten_path.c:249 modules/process/tilt.c:161
-#: modules/process/tip_model.c:169 modules/process/unrotate.c:220
-#: modules/process/volumize_layers.c:221 modules/process/wave_synth.c:349
-#: modules/process/wpour_mark.c:278 modules/volume/volume_calibrate.c:370
-#: modules/volume/volume_extract.c:331 modules/volume/volume_kmeans.c:153
-#: modules/volume/volume_kmedians.c:147 modules/volume/volume_linestat.c:292
-#: modules/volume/volume_slice.c:292
+#: modules/process/fft_synth.c:341 modules/process/fibre_synth.c:422
+#: modules/process/fractal.c:228 modules/process/grain_edge.c:212
+#: modules/process/grain_mark.c:246 modules/process/grain_wshed.c:168
+#: modules/process/hough.c:174 modules/process/lat_synth.c:567
+#: modules/process/latsim.c:159 modules/process/level.c:245
+#: modules/process/linematch.c:771 modules/process/lno_synth.c:431
+#: modules/process/local_contrast.c:130 modules/process/logistic.c:234
+#: modules/process/mark_disconn.c:208 modules/process/mask_distribute.c:152
+#: modules/process/measure_lattice.c:246 modules/process/median-bg.c:180
+#: modules/process/mfm_current.c:332 modules/process/mfm_field.c:281
+#: modules/process/mfm_findshift.c:230 modules/process/mfm_parallel.c:333
+#: modules/process/mfm_shift.c:170 modules/process/noise_synth.c:334
+#: modules/process/obj_synth.c:438 modules/process/pat_synth.c:385
+#: modules/process/phase_synth.c:205 modules/process/pid.c:197
+#: modules/process/polydistort.c:210 modules/process/polylevel.c:373
+#: modules/process/psdf_logphi.c:249 modules/process/rank.c:158
+#: modules/process/rotate.c:243 modules/process/scale.c:196
+#: modules/process/scars.c:317 modules/process/semsim.c:211
+#: modules/process/shade.c:210 modules/process/slope_dist.c:275
+#: modules/process/sphere-revolve.c:317 modules/process/straighten_path.c:248
+#: modules/process/tilt.c:161 modules/process/tip_model.c:167
+#: modules/process/unrotate.c:220 modules/process/volumize_layers.c:221
+#: modules/process/wave_synth.c:368 modules/process/wpour_mark.c:278
+#: modules/volume/volume_calibrate.c:370 modules/volume/volume_extract.c:324
+#: modules/volume/volume_kmeans.c:154 modules/volume/volume_kmedians.c:147
+#: modules/volume/volume_linestat.c:297 modules/volume/volume_slice.c:294
 msgid "_Reset"
 msgstr "_Сброс"
 
-#: libgwydgets/gwy3dwindow.c:1142
+#: libgwydgets/gwy3dwindow.c:1141
 msgid "X-axis"
 msgstr "Ось X"
 
-#: libgwydgets/gwy3dwindow.c:1143
+#: libgwydgets/gwy3dwindow.c:1142
 msgid "Y-axis"
 msgstr "Ось Y"
 
-#: libgwydgets/gwy3dwindow.c:1144
+#: libgwydgets/gwy3dwindow.c:1143
 msgid "Minimum z value"
 msgstr "Минимальное значение z"
 
-#: libgwydgets/gwy3dwindow.c:1145
+#: libgwydgets/gwy3dwindow.c:1144
 msgid "Maximum z value"
 msgstr "Максимальное значение z"
 
-#: libgwydgets/gwy3dwindow.c:1168 modules/file/imgexport.c:3836
+#: libgwydgets/gwy3dwindow.c:1167 modules/file/imgexport.c:3806
 msgid "_Label:"
 msgstr "_Метка:"
 
-#: libgwydgets/gwy3dwindow.c:1173
+#: libgwydgets/gwy3dwindow.c:1180
 msgid "_Text:"
 msgstr "_Текст:"
 
-#: libgwydgets/gwy3dwindow.c:1193
+#: libgwydgets/gwy3dwindow.c:1185
 msgid "Move label"
 msgstr "Переместить метку"
 
-#: libgwydgets/gwy3dwindow.c:1202
+#: libgwydgets/gwy3dwindow.c:1194
 msgid "_Horizontally:"
 msgstr "_Горизонтально:"
 
-#: libgwydgets/gwy3dwindow.c:1212
+#: libgwydgets/gwy3dwindow.c:1204
 msgid "_Vertically:"
 msgstr "_Вертикально:"
 
-#: libgwydgets/gwy3dwindow.c:1220
+#: libgwydgets/gwy3dwindow.c:1212
+msgid "A_ll labels have the same size"
+msgstr "Вс_е метки одного размера"
+
+#: libgwydgets/gwy3dwindow.c:1223
 msgid "Scale size _automatically"
 msgstr "Масштабировать размер _автоматически"
 
-#: libgwydgets/gwy3dwindow.c:1232 modules/tools/filter.c:290
+#: libgwydgets/gwy3dwindow.c:1235 modules/tools/filter.c:291
 msgid "Si_ze:"
 msgstr "_Размер:"
 
-#: libgwydgets/gwy3dwindow.c:1232 modules/process/cwt.c:151
-#: modules/process/hough.c:212
-msgid "pixels"
-msgstr "точек"
+#: libgwydgets/gwy3dwindow.c:1277
+msgid "Show false _colorbar"
+msgstr "Показывать линейку псевдо_цвета"
+
+#: libgwydgets/gwy3dwindow.c:1286
+msgid "Reserve space for _colorbar"
+msgstr "Резервировать место для _шкалы псевдоцвета"
+
+#: libgwydgets/gwy3dwindow.c:1302 modules/process/lat_synth.c:651
+#: modules/process/obj_synth.c:542 modules/process/pat_synth.c:1458
+#: modules/process/phase_synth.c:279
+msgid "_Size:"
+msgstr "Р_азмер:"
+
+#: libgwydgets/gwy3dwindow.c:1311
+msgid "_Vertical alignment:"
+msgstr "_Вертикальное выравнивание:"
 
-#: libgwydgets/gwy3dwindow.c:1726 libgwydgets/gwy3dwindow.c:1779
+#: libgwydgets/gwy3dwindow.c:1844 libgwydgets/gwy3dwindow.c:1897
 msgid "S_witch to Lighting Mode"
 msgstr "_Переключиться на режим освещения"
 
-#: libgwydgets/gwy3dwindow.c:1734 libgwydgets/gwy3dwindow.c:1756
+#: libgwydgets/gwy3dwindow.c:1852 libgwydgets/gwy3dwindow.c:1874
 msgid "S_witch to Overlay Mode"
 msgstr "П_ереключиться на режим наложенного изображения"
 
-#: libgwydgets/gwy3dwindow.c:1748 libgwydgets/gwy3dwindow.c:1771
+#: libgwydgets/gwy3dwindow.c:1866 libgwydgets/gwy3dwindow.c:1889
 msgid "S_witch to Color Gradient Mode"
 msgstr "Пе_реключиться на режим цветового градиента"
 
-#: libgwydgets/gwy3dwindow.c:1787
+#: libgwydgets/gwy3dwindow.c:1905
 msgid "T_oggle light"
 msgstr "Включить _освещение"
 
-#: libgwydgets/gwyaxisdialog.c:99
+#: libgwydgets/gwyaxisdialog.c:75
 msgid "Axis Properties"
 msgstr "Свойства оси"
 
-#: libgwydgets/gwyaxisdialog.c:101 libgwydgets/gwygraphlabeldialog.c:63
-msgid "Label Properties"
-msgstr "Свойства метки"
-
-#: libgwydgets/gwyaxisdialog.c:184
+#: libgwydgets/gwyaxisdialog.c:88
 msgid "Label Text"
 msgstr "Текст надписи"
 
@@ -1092,7 +1160,7 @@ msgid "Hidden"
 msgstr "Скрытый"
 
 #: libgwydgets/gwydgetenums.c:47 libgwydgets/gwygraphwindowmeasuredialog.c:572
-#: modules/file/imgexport.c:475 modules/tools/selectionmanager.c:274
+#: modules/file/imgexport.c:474 modules/tools/selectionmanager.c:274
 msgid "Points"
 msgstr "Точки"
 
@@ -1100,7 +1168,7 @@ msgstr "Точки"
 msgid "Line + points"
 msgstr "Линия + точки"
 
-#: libgwydgets/gwydgetutils.c:564
+#: libgwydgets/gwydgetutils.c:848
 msgid "Change Mask Color"
 msgstr "Изменить цвет маски"
 
@@ -1109,7 +1177,7 @@ msgid "Quantity"
 msgstr "Количество"
 
 #: libgwydgets/gwygrainvaluemenu.c:194 libgwydgets/gwygrainvaluemenu.c:207
-#: modules/process/curvature.c:753
+#: modules/process/curvature.c:750
 msgid "Symbol"
 msgstr "Символ"
 
@@ -1129,137 +1197,141 @@ msgstr "Пре_д."
 msgid "_Next"
 msgstr "С_лед."
 
-#: libgwydgets/gwygraphareadialog.c:127 modules/file/rawgraph.c:302
+#: libgwydgets/gwygraphareadialog.c:123 modules/file/rawgraph.c:302
 msgid "Plot _style:"
 msgstr "_Стиль графика:"
 
-#: libgwydgets/gwygraphareadialog.c:148
+#: libgwydgets/gwygraphareadialog.c:131
 msgid "Pl_ot color:"
 msgstr "_Цвет графика:"
 
-#: libgwydgets/gwygraphareadialog.c:159
+#: libgwydgets/gwygraphareadialog.c:151
 msgid "Point _type:"
 msgstr "_Тип точки:"
 
-#: libgwydgets/gwygraphareadialog.c:165
+#: libgwydgets/gwygraphareadialog.c:157
 msgid "_Point size:"
 msgstr "Размер то_чки:"
 
-#: libgwydgets/gwygraphareadialog.c:175
+#: libgwydgets/gwygraphareadialog.c:167
 msgid "_Line type:"
 msgstr "Тип _линии:"
 
-#: libgwydgets/gwygraphareadialog.c:181 modules/file/imgexport.c:3150
+#: libgwydgets/gwygraphareadialog.c:173 modules/file/imgexport.c:3154
 msgid "Line t_hickness:"
 msgstr "Тол_щина линии:"
 
-#: libgwydgets/gwygraphareadialog.c:187
+#: libgwydgets/gwygraphareadialog.c:180
 msgid "<b>Label Te_xt</b>"
 msgstr "<b>Те_кст метки</b>"
 
-#: libgwydgets/gwygraphareadialog.c:404
+#: libgwydgets/gwygraphareadialog.c:397
 msgid "Set Curve Color"
 msgstr "Установить цвет кривой"
 
-#: libgwydgets/gwygraphareadialog.c:556 modules/process/mask_morph.c:179
+#: libgwydgets/gwygraphareadialog.c:549 modules/process/mask_morph.c:178
 msgid "Square"
-msgstr "Квадратная"
+msgstr "Квадрат"
 
-#: libgwydgets/gwygraphareadialog.c:558 modules/process/mask_morph.c:180
+#: libgwydgets/gwygraphareadialog.c:551 modules/process/mask_morph.c:179
 msgid "Diamond"
 msgstr "Ромб"
 
-#: libgwydgets/gwygraphareadialog.c:559
+#: libgwydgets/gwygraphareadialog.c:552
 msgid "Cross"
 msgstr "Крест"
 
-#: libgwydgets/gwygraphareadialog.c:560
+#: libgwydgets/gwygraphareadialog.c:553
 msgid "Diagonal cross"
 msgstr "Диагональный крест"
 
-#: libgwydgets/gwygraphareadialog.c:561
+#: libgwydgets/gwygraphareadialog.c:554
 msgid "Asterisk"
 msgstr "Шестилучевая звезда"
 
-#: libgwydgets/gwygraphareadialog.c:562
+#: libgwydgets/gwygraphareadialog.c:555
 msgid "Star"
 msgstr "Восьмилучевая звезда"
 
-#: libgwydgets/gwygraphareadialog.c:563
+#: libgwydgets/gwygraphareadialog.c:556
 msgid "Triangle up"
 msgstr "Треугольник вверх"
 
-#: libgwydgets/gwygraphareadialog.c:564
+#: libgwydgets/gwygraphareadialog.c:557
 msgid "Triangle down"
 msgstr "Треугольник вниз"
 
-#: libgwydgets/gwygraphareadialog.c:565
+#: libgwydgets/gwygraphareadialog.c:558
 msgid "Triangle left"
 msgstr "Треугольник налево"
 
-#: libgwydgets/gwygraphareadialog.c:566
+#: libgwydgets/gwygraphareadialog.c:559
 msgid "Triangle right"
 msgstr "Треугольник направо"
 
-#: libgwydgets/gwygraphareadialog.c:567
+#: libgwydgets/gwygraphareadialog.c:560
 msgid "Full square"
 msgstr "Заполненный квадрат"
 
-#: libgwydgets/gwygraphareadialog.c:568 modules/process/mask_morph.c:177
+#: libgwydgets/gwygraphareadialog.c:561 modules/process/mask_morph.c:176
 msgid "Disc"
 msgstr "Диск"
 
-#: libgwydgets/gwygraphareadialog.c:569
+#: libgwydgets/gwygraphareadialog.c:562
 msgid "Full diamond"
 msgstr "Заполненный ромб"
 
-#: libgwydgets/gwygraphareadialog.c:570
+#: libgwydgets/gwygraphareadialog.c:563
 msgid "Full triangle up"
 msgstr "Заполненный треугольник вверх"
 
-#: libgwydgets/gwygraphareadialog.c:571
+#: libgwydgets/gwygraphareadialog.c:564
 msgid "Full triangle down"
 msgstr "Заполненный треугольник вниз"
 
-#: libgwydgets/gwygraphareadialog.c:572
+#: libgwydgets/gwygraphareadialog.c:565
 msgid "Full triangle left"
 msgstr "Заполненный треугольник влево"
 
-#: libgwydgets/gwygraphareadialog.c:573
+#: libgwydgets/gwygraphareadialog.c:566
 msgid "Full triangle right"
 msgstr "Заполненный треугольник вправо"
 
-#: libgwydgets/gwygraphareadialog.c:635
+#: libgwydgets/gwygraphareadialog.c:628
 msgid "line-style|Solid"
 msgstr "Сплошная"
 
-#: libgwydgets/gwygraphareadialog.c:636
+#: libgwydgets/gwygraphareadialog.c:629
 msgid "line-style|Dash"
 msgstr "Штриховая"
 
-#: libgwydgets/gwygraphcurves.c:451
+#: libgwydgets/gwygraphcurves.c:448
 msgid "Description"
 msgstr "Описание"
 
-#: libgwydgets/gwygraphcurves.c:463
+#: libgwydgets/gwygraphcurves.c:460
 msgid "Mode"
 msgstr "Режим"
 
-#: libgwydgets/gwygraphcurves.c:481
+#: libgwydgets/gwygraphcurves.c:478
 msgid "Color"
 msgstr "Цвет"
 
-#: libgwydgets/gwygraphcurves.c:494
+#: libgwydgets/gwygraphcurves.c:491
 msgid "Point Type"
 msgstr "Тип точки"
 
-#: libgwydgets/gwygraphcurves.c:516
+#: libgwydgets/gwygraphcurves.c:513
 msgid "Line Style"
 msgstr "Стиль линии"
 
+#: libgwydgets/gwygraphlabeldialog.c:63
+msgid "Label Properties"
+msgstr "Свойства метки"
+
 #: libgwydgets/gwygraphlabeldialog.c:74
-msgid "Frame thickness:"
-msgstr "Толщина рамки:"
+msgid "_Frame thickness:"
+msgstr "_Толщина рамки:"
 
 #: libgwydgets/gwygraphlabeldialog.c:81
 msgid "_Reversed layout"
@@ -1269,12 +1341,12 @@ msgstr "_Обратное расположение"
 msgid "Abscissa"
 msgstr "Абсцисса"
 
-#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1002 app/toolbox.c:108
+#: libgwydgets/gwygraphwindow.c:163 app/toolbox-editor.c:1015 app/toolbox.c:113
 msgid "Graph"
 msgstr "График"
 
 #: libgwydgets/gwygraphwindow.c:170 modules/file/hdrimage.cc:472
-#: modules/process/fit-shape.c:656
+#: modules/process/fit-shape.c:666 modules/process/psf.c:229
 msgid "Data"
 msgstr "Данные"
 
@@ -1312,15 +1384,15 @@ msgstr "Точки в любом  месте"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:394
 #: libgwydgets/gwygraphwindowmeasuredialog.c:580 modules/tools/linestats.c:170
-#: modules/tools/roughness.c:516 modules/volume/volume_linestat.c:157
+#: modules/tools/roughness.c:517 modules/volume/volume_linestat.c:159
 msgid "Length"
 msgstr "Длина"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:398
 #: libgwydgets/gwygraphwindowmeasuredialog.c:588 app/gwyplaintool.c:1018
-#: modules/process/lat_synth.c:747 modules/process/obj_synth.c:569
-#: modules/process/pat_synth.c:846 modules/process/pat_synth.c:1148
-#: modules/process/pat_synth.c:1483
+#: modules/process/fibre_synth.c:534 modules/process/lat_synth.c:747
+#: modules/process/obj_synth.c:567 modules/process/pat_synth.c:847
+#: modules/process/pat_synth.c:1149 modules/process/pat_synth.c:1484
 msgid "Height"
 msgstr "Высота"
 
@@ -1333,12 +1405,12 @@ msgid "Curve:"
 msgstr "Кривая:"
 
 #: libgwydgets/gwygraphwindowmeasuredialog.c:553
-#: modules/process/linematch.c:828 modules/process/semsim.c:249
+#: modules/process/linematch.c:795 modules/process/semsim.c:249
 #: modules/xyz/xyz_level.c:254
 msgid "Method:"
 msgstr "Способ:"
 
-#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:354
+#: libgwydgets/gwygraphwindowmeasuredialog.c:592 modules/process/crosscor.c:331
 msgid "Angle"
 msgstr "Угол"
 
@@ -1348,7 +1420,7 @@ msgid "Preferred"
 msgstr "Предпочтительное"
 
 #: libgwydgets/gwyoptionmenus.c:470 app/meta.c:410
-#: modules/file/imgexport.c:4160 modules/file/imgexport.c:4607
+#: modules/file/imgexport.c:4110 modules/file/imgexport.c:4555
 #: modules/file/rawfile.c:995 modules/process/convolution_filter.c:538
 #: modules/process/neural.c:418 modules/tools/selectionmanager.c:345
 msgid "Name"
@@ -1387,7 +1459,7 @@ msgid "A_dd symbol"
 msgstr "_Добавить символ"
 
 #: libgwydgets/gwyscitext.c:274 modules/file/rawfile.c:553
-#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:405
+#: modules/xyz/xyz_drift.c:580 modules/xyz/xyz_raster.c:419
 msgid "Preview"
 msgstr "Предпросмотр"
 
@@ -1399,93 +1471,87 @@ msgstr "Невозможно открыть файл для чтения: %s."
 
 #: libgwymodule/gwymodule-file.c:558
 msgid "No module can load this file type."
-msgstr "Ни один из модулей не может открыть этот тип файла"
+msgstr "Ни один из модулей не может открыть этот тип файла."
 
 #: libgwymodule/gwymodule-file.c:665
 msgid "No module can save to this file type."
-msgstr "Ни один из модулей не может сохранить этот тип файла"
+msgstr "Ни один из модулей не может сохранить этот тип файла."
 
-#: libgwymodule/gwymodulebrowser.c:67
+#: libgwymodule/gwymodulebrowser.c:66
 msgid "Module Browser"
 msgstr "Просмотр модулей"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Module"
 msgstr "Модуль"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Version"
 msgstr "Версия"
 
-#: libgwymodule/gwymodulebrowser.c:190
+#: libgwymodule/gwymodulebrowser.c:189
 msgid "Author"
 msgstr "Автор"
 
-#: libgwymodule/gwymodulebrowser.c:246
+#: libgwymodule/gwymodulebrowser.c:244
 msgid "Name-Version:"
 msgstr "Название и версия:"
 
-#: libgwymodule/gwymodulebrowser.c:247 libgwymodule/gwymodulebrowser.c:270
+#: libgwymodule/gwymodulebrowser.c:245 libgwymodule/gwymodulebrowser.c:268
 #: modules/process/grain_stat.c:186
 msgid "File:"
 msgstr "Файл:"
 
-#: libgwymodule/gwymodulebrowser.c:248
+#: libgwymodule/gwymodulebrowser.c:246
 msgid "Registered functions:"
 msgstr "Зарегистрированные функции:"
 
-#: libgwymodule/gwymodulebrowser.c:249
+#: libgwymodule/gwymodulebrowser.c:247
 msgid "Authors:"
 msgstr "Авторы:"
 
-#: libgwymodule/gwymodulebrowser.c:250
+#: libgwymodule/gwymodulebrowser.c:248
 msgid "Copyright:"
-msgstr "Авторское право:"
+msgstr "Copyright:"
 
-#: libgwymodule/gwymodulebrowser.c:251
+#: libgwymodule/gwymodulebrowser.c:249
 msgid "Date:"
 msgstr "Дата:"
 
-#: libgwymodule/gwymodulebrowser.c:252
+#: libgwymodule/gwymodulebrowser.c:250
 msgid "Description:"
 msgstr "Описание:"
 
-#: libgwymodule/gwymodulebrowser.c:269
+#: libgwymodule/gwymodulebrowser.c:267
 msgid "Name:"
 msgstr "Имя:"
 
-#: libgwymodule/gwymodulebrowser.c:271
+#: libgwymodule/gwymodulebrowser.c:269
 msgid "Failure:"
 msgstr "Ошибка:"
 
-#: app/about.c:57
+#: app/about.c:58
 #, c-format
 msgid "About %s"
 msgstr "О программе %s"
 
-#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
-#: app/about.c:92
-#, c-format
-msgid "Released %s\n"
-msgstr "Выпущен %s\n"
-
-#: app/about.c:93
+#: app/about.c:97
 msgid "An SPM data visualization and analysis tool."
 msgstr "Инструмент визуализации и анализа данных СЗМ."
 
-#: app/about.c:101
+#: app/about.c:105
 msgid "Report bugs to:"
 msgstr "Отчёты об ошибках направлять:"
 
-#: app/about.c:116
+#: app/about.c:120
 msgid "Credits"
 msgstr "Благодарности"
 
-#: app/about.c:133
+#: app/about.c:137
 msgid "License"
 msgstr "Лицензия"
 
-#: app/about.c:138
+#: app/about.c:142
 #, c-format
 msgid ""
 "%s is free software; you can redistribute it and/or modify it under the "
@@ -1496,63 +1562,67 @@ msgid ""
 msgstr ""
 "%s является свободным программным обеспечением; вы можете распространять и/"
 "или изменять его согласно условиям Стандартной Общественной Лицензии GNU "
-"(GNU GPL), опубликованной Фондом свободного программного обеспечения (FSF), "
+"(GNU GPL), опубликованной Фондом свободного программного обеспечения (FSF); "
 "либо Лицензии версии 2, либо (на ваше усмотрение) любой более поздней "
-"версии. Для получения полного текста лицензии смотрите файл COPYING в архиве "
-"исходного кода программы."
+"версии. Полный текст лицензии доступен в файле COPYING в архиве исходного "
+"кода программы."
 
-#: app/about.c:160 modules/process/logistic.c:270
+#: app/about.c:164 modules/process/logistic.c:269
 msgid "Features"
 msgstr "Возможности"
 
-#: app/about.c:220
+#: app/about.c:224
 msgid "Developers"
 msgstr "Разработчики"
 
-#: app/about.c:221
+#: app/about.c:225
 msgid "Translators"
 msgstr "Переводчики"
 
-#: app/about.c:225
+#: app/about.c:229
 msgid "Development is supported by the Czech Metrology Institute: "
-msgstr "Разработка поддерживается Институтом метрологии Чехии: "
+msgstr "Разработка поддерживается Чешским институтом метрологии : "
 
-#: app/about.c:253 app/about.c:256
+#: app/about.c:257 app/about.c:260
 msgid "OpenGL 3D View"
 msgstr "Трёхмерный вид OpenGL"
 
-#: app/about.c:257 app/about.c:271 app/about.c:291
+#: app/about.c:261 app/about.c:266 app/about.c:286
 msgid "not available\n"
 msgstr "недоступен\n"
 
-#: app/about.c:262 app/about.c:265
-msgid "Fast Fourier Transform"
-msgstr "Быстрое преобразование Фурье"
-
-#: app/about.c:266
-msgid "built-in SimpleFFT\n"
-msgstr "встроенное SimpleFFT\n"
-
-#: app/about.c:274
+#: app/about.c:269
 msgid "X11 protocol\n"
 msgstr "протокол X11\n"
 
-#: app/about.c:276
+#: app/about.c:271
 msgid "Win32 protocol\n"
 msgstr "протокол Win32\n"
 
-#: app/about.c:278
+#: app/about.c:273
 msgid "LibUnique\n"
 msgstr "LibUnique\n"
 
-#: app/about.c:282
+#: app/about.c:277
 msgid "Remote Control"
 msgstr "Дистанционное управление"
 
-#: app/about.c:286 app/about.c:290
+#: app/about.c:281 app/about.c:285
 msgid "Python Scripting Interface"
 msgstr "Скриптовый интерфейс Python"
 
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:311
+#, c-format
+msgid "Development version, built %s"
+msgstr "Версия в разработке, собрана %s"
+
+#. TRANSLATORS: %s is replaced with date in ISO format YYYY-MM-DD.
+#: app/about.c:328
+#, c-format
+msgid "Released %s"
+msgstr "Выпущена %s"
+
 #: app/app.c:301
 #, c-format
 msgid ""
@@ -1564,116 +1634,124 @@ msgstr ""
 "%s\n"
 "Действительно выйти?"
 
-#: app/app.c:440
+#: app/app.c:442
 msgid "Mask _Color..."
 msgstr "_Цвет маски..."
 
-#: app/app.c:456 app/app.c:1725
+#: app/app.c:458 app/app.c:1754
 msgid "Zoom _1:1"
 msgstr "Масштаб _1:1"
 
-#: app/app.c:460 app/app.c:1729 app/app.c:1957
+#: app/app.c:462 app/app.c:1758 app/app.c:1988
 msgid "Metadata _Browser..."
 msgstr "Просмотр _метаданных"
 
-#: app/app.c:465 app/app.c:1734 app/app.c:1962
+#: app/app.c:467 app/app.c:1763 app/app.c:1993
 msgid "View _Log..."
 msgstr "Просмотр _журнала..."
 
-#: app/app.c:649
+#: app/app.c:651
 msgid "Pi_xelwise Square"
 msgstr "Квадратные _пиксели"
 
-#: app/app.c:659
+#: app/app.c:661
 msgid "_Physically Square"
 msgstr "Равные _масштабы осей"
 
-#: app/app.c:836
+#: app/app.c:842
+msgid "Set as Default"
+msgstr "Использовать по умолчанию"
+
+#: app/app.c:844
+msgid "Set the current view setup as the default"
+msgstr "Установить текущие настройки вида как настройки по умолчанию"
+
+#: app/app.c:854
 msgid "verb|Save"
 msgstr "Сохранить"
 
-#: app/app.c:839 app/app.c:843
+#: app/app.c:857 app/app.c:861
 msgid "Save 3D view to an image"
 msgstr "Сохранить трёхмерный вид в изображение"
 
-#: app/app.c:849
-msgid "Set as Default"
-msgstr "Использовать по умолчанию"
+#: app/app.c:869
+msgid "_Autocrop"
+msgstr "Обрезать _автоматически"
 
-#: app/app.c:851
-msgid "Set the current view setup as the default"
-msgstr "Установить текущие настройки вида как настройки по умолчанию"
+#: app/app.c:873
+msgid "Remove white borders from exported image"
+msgstr "Удалить белые границы с экспортируемого изображения"
 
-#: app/app.c:940
+#: app/app.c:960
 msgid "_Show mask"
 msgstr "Показывать _маску"
 
-#: app/app.c:1106
+#: app/app.c:1172
 #, c-format
 msgid "Saving of 3D view to `%s' failed"
 msgstr "Не удалось сохранить трёхмерный вид в `%s'"
 
-#: app/app.c:1150
+#: app/app.c:1222
 msgid "Export 3D View"
 msgstr "Экспортировать трёхмерный вид"
 
-#: app/app.c:1457
+#: app/app.c:1478
 msgid "_Change Preview"
 msgstr "_Изменить изображение предпросмотра"
 
-#: app/app.c:1583
+#: app/app.c:1606
 msgid "Change Volume Data Preview"
 msgstr "Изменить изображение предпросмотра для объёмных данных"
 
-#: app/app.c:1593
+#: app/app.c:1616
 msgid "Preview quantity:"
 msgstr "Величина для предпросмотра:"
 
-#: app/app.c:1603 modules/process/extend.c:267 modules/tools/linestats.c:165
+#: app/app.c:1626 modules/process/extend.c:267 modules/tools/linestats.c:165
 #: modules/volume/volume_linestat.c:142
 msgid "Mean"
 msgstr "Среднее"
 
-#: app/app.c:1604 modules/process/polydistort.c:255 modules/tools/filter.c:240
+#: app/app.c:1627 modules/process/polydistort.c:258 modules/tools/filter.c:241
 #: modules/tools/icolorange.c:424 modules/tools/linestats.c:167
 #: modules/volume/volume_linestat.c:144
 msgid "Minimum"
 msgstr "Минимум"
 
-#: app/app.c:1605 modules/process/col_synth.c:170 modules/tools/filter.c:241
+#: app/app.c:1628 modules/process/col_synth.c:170 modules/tools/filter.c:242
 #: modules/tools/icolorange.c:435 modules/tools/linestats.c:168
 #: modules/volume/volume_linestat.c:145
 msgid "Maximum"
 msgstr "Максимум"
 
-#: app/app.c:1606
+#: app/app.c:1629 modules/volume/volume_linestat.c:146
 msgid "Min. position"
 msgstr "Положение минимума"
 
-#: app/app.c:1607
+#: app/app.c:1630 modules/volume/volume_linestat.c:147
 msgid "Max. position"
 msgstr "Положение максимума"
 
-#: app/app.c:1608 modules/process/bdep_synth.c:134
-#: modules/process/col_synth.c:171 modules/process/scars.c:346
-#: modules/process/scars.c:353 modules/process/threshold.c:341
+#: app/app.c:1631 modules/process/bdep_synth.c:134
+#: modules/process/col_synth.c:171 modules/process/scars.c:369
+#: modules/process/scars.c:377 modules/process/threshold.c:336
 msgid "RMS"
 msgstr "Ср. квадр."
 
-#: app/app.c:1609 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
-#: modules/file/xyzexport.c:233 modules/file/xyzexport.c:302
+#: app/app.c:1632 modules/file/asciiexport.c:187 modules/file/gxyzffile.c:393
+#: modules/file/xyzexport.c:236 modules/file/xyzexport.c:305
 msgid "Channel:"
 msgstr "Канал:"
 
-#: app/app.c:1610
+#: app/app.c:1633
 msgid "Section:"
 msgstr "Сечение:"
 
-#: app/app.c:1861
+#: app/app.c:1890
 msgid "_Update Preview"
 msgstr "Обновить _предпросмотр"
 
-#: app/app.c:1867
+#: app/app.c:1896
 msgid "_Density Map"
 msgstr "_Карта плотности"
 
@@ -1692,12 +1770,12 @@ msgstr "Неизвестный объём %d"
 msgid "Unknown XYZ %d"
 msgstr "Неизвестное XYZ %d"
 
-#: app/data-browser-aux.c:2795
+#: app/data-browser-aux.c:2839
 #, c-format
 msgid "Z levels: %d, Z unit: %s"
 msgstr "Уровней Z: %d, единицы измерения Z: %s"
 
-#: app/data-browser-aux.c:2821
+#: app/data-browser-aux.c:2865
 #, c-format
 msgid "Points: %d"
 msgstr "Точек: %d"
@@ -1727,10 +1805,10 @@ msgid "Close file"
 msgstr "Закрыть файл"
 
 #: app/data-browser.c:5582
-msgid "Channels"
-msgstr "Каналы"
+msgid "Images"
+msgstr "Изображения"
 
-#: app/data-browser.c:5596 modules/volume/volume_extract.c:444
+#: app/data-browser.c:5596 modules/volume/volume_extract.c:431
 msgid "Graphs"
 msgstr "Графики"
 
@@ -1786,45 +1864,45 @@ msgstr ""
 "\n"
 "%s"
 
-#: app/file.c:285
+#: app/file.c:292
 #, c-format
 msgid "Opening of `%s' failed"
 msgstr "Не удалось открыть '%s'"
 
-#: app/file.c:291 app/file.c:526
+#: app/file.c:298 app/file.c:533
 #, c-format
 msgid "Full file path: %s."
 msgstr "Полный путь к файлу: %s."
 
-#: app/file.c:294
+#: app/file.c:301
 #, c-format
 msgid "Loaded using: %s."
 msgstr "Загружено используя: %s."
 
-#: app/file.c:380
+#: app/file.c:387
 msgid "Merge File"
 msgstr "Объединить файлы"
 
-#: app/file.c:382 app/gwyappfilechooser.c:221
+#: app/file.c:389 app/gwyappfilechooser.c:226
 msgid "Open File"
 msgstr "Открыть файл"
 
-#: app/file.c:520 app/gwymoduleutils.c:192
+#: app/file.c:527 app/gwymoduleutils.c:192
 #, c-format
 msgid "Saving of `%s' failed"
 msgstr "Сохранение `%s' не выполнено"
 
-#: app/file.c:529
+#: app/file.c:536
 #, c-format
 msgid "Saved using: %s."
 msgstr "Сохранено используя: %s."
 
-#: app/file.c:689
+#: app/file.c:696
 #, c-format
 msgid "File `%s' already exists.  Replace?"
 msgstr "Файл `%s' уже существует. Заменить?"
 
-#: app/file.c:693
+#: app/file.c:700
 #, c-format
 msgid ""
 "The file already exists in `%s'.  Replacing it will overwrite its contents."
@@ -1832,7 +1910,7 @@ msgstr ""
 "Файл уже существует в `%s'. Если его заменить, то его содержимое будет "
 "перезаписано."
 
-#: app/file.c:696
+#: app/file.c:703
 msgid "Replace File?"
 msgstr "Заменить существующий файл?"
 
@@ -1856,11 +1934,11 @@ msgstr "закрыть список файлов"
 msgid "Open selected file"
 msgstr "Открыть выбранный файл"
 
-#: app/filelist.c:566 app/gwyappfilechooser.c:583
+#: app/filelist.c:566 app/gwyappfilechooser.c:592
 msgid "_Filter:"
 msgstr "_Фильтр:"
 
-#: app/filelist.c:604 app/gwyappfilechooser.c:619
+#: app/filelist.c:604 app/gwyappfilechooser.c:628
 msgid "Case _sensitive"
 msgstr "С учётом _регистра"
 
@@ -1910,97 +1988,97 @@ msgstr "_Кривая"
 msgid "_Snap to control points"
 msgstr "_Притягиваться к контрольным точкам"
 
-#: app/gwyappfilechooser.c:226
+#: app/gwyappfilechooser.c:231
 msgid "Save File"
 msgstr "Сохранить файл"
 
-#: app/gwyappfilechooser.c:380
+#: app/gwyappfilechooser.c:389
 #, c-format
 msgid "File _type: %s"
 msgstr "_Тип файла: %s"
 
-#: app/gwyappfilechooser.c:387
+#: app/gwyappfilechooser.c:396
 msgid "Only loadable shown"
 msgstr "Показаны только загружаемые"
 
-#: app/gwyappfilechooser.c:391
+#: app/gwyappfilechooser.c:400
 #, c-format
 msgid "Filter: %s"
 msgstr "Фильтр: %s"
 
-#: app/gwyappfilechooser.c:455
+#: app/gwyappfilechooser.c:464
 msgid "Automatic by extension"
 msgstr "Определять по расширению"
 
-#: app/gwyappfilechooser.c:464
+#: app/gwyappfilechooser.c:473
 msgid "Automatically detected"
 msgstr "Автоматически определённый"
 
-#: app/gwyappfilechooser.c:561
+#: app/gwyappfilechooser.c:570
 msgid "Show only loadable files"
 msgstr "Показать только загружаемые файлы"
 
-#: app/gwyappfilechooser.c:844
+#: app/gwyappfilechooser.c:855
 msgid "Plane-level previewed data"
 msgstr "Выровнять плоскость у данных предпросмотра"
 
-#: app/gwyappfilechooser.c:860
+#: app/gwyappfilechooser.c:871
 msgid "Row-level previewed data"
 msgstr "Выровнять строки у данных предпросмотра"
 
-#: app/gwyappfilechooser.c:969
+#: app/gwyappfilechooser.c:987
+msgid "File too large for preview"
+msgstr "Файл слишком большой для предпросмотра"
+
+#: app/gwyappfilechooser.c:988
 msgid "…"
 msgstr "…"
 
-#: app/gwyappfilechooser.c:1331
+#: app/gwyappfilechooser.c:1352
 msgid "Cannot preview"
 msgstr "Нельзя просмотреть."
 
-#: app/gwyddion.c:143
+#: app/gwyddion.c:147
 msgid "Loading document history"
 msgstr "Загружается список предыдущих документов"
 
-#: app/gwyddion.c:148
+#: app/gwyddion.c:152
 msgid "Registering "
 msgstr "Регистрация"
 
-#: app/gwyddion.c:149
+#: app/gwyddion.c:153
 msgid "stock items"
 msgstr "основных элементов"
 
-#: app/gwyddion.c:153
+#: app/gwyddion.c:157
 msgid "color gradients"
 msgstr "цветовых градиентов"
 
-#: app/gwyddion.c:155
+#: app/gwyddion.c:159
 msgid "GL materials"
 msgstr "материалов GL"
 
-#: app/gwyddion.c:157
+#: app/gwyddion.c:161
 msgid "grain quantities"
 msgstr "величин зёрен"
 
-#: app/gwyddion.c:159
+#: app/gwyddion.c:163
 msgid "calibrations"
 msgstr "калибровок"
 
-#: app/gwyddion.c:164
+#: app/gwyddion.c:168
 msgid "Loading settings"
 msgstr "Загрузка настроек"
 
-#: app/gwyddion.c:171
+#: app/gwyddion.c:175
 msgid "Registering modules"
 msgstr "Регистрация модулей"
 
-#: app/gwyddion.c:193
-msgid "Initializing GUI"
-msgstr "Инициализация графического интерфейса"
-
-#: app/gwyddion.c:439
+#: app/gwyddion.c:464
 msgid "Could not read settings."
 msgstr "Не удается считать настройки."
 
-#: app/gwyddion.c:442
+#: app/gwyddion.c:467
 #, c-format
 msgid ""
 "Settings file `%s' cannot be read: %s\n"
@@ -2013,42 +2091,72 @@ msgstr ""
 "Чтобы избежать потери сохранённых настроек попыток обновить его делаться не "
 "будет до тех пор, пока он не будет исправлен или удалён."
 
-#: app/gwymoduleutils-file.c:542
+#: app/gwyddion.c:505
+#, c-format
+msgid "Many modules (%u) failed to register."
+msgstr "Большое количество модулей (%u) не смогло зарегистрироваться."
+
+#: app/gwyddion.c:510
+#, c-format
+msgid ""
+"Most likely Gwyddion was not upgraded correctly.  Instead, one installation "
+"was just overwritten with another, and now it is a mess.\n"
+"\n"
+"Please remove completely the module directory\n"
+"\n"
+"%s\n"
+"\n"
+"and reinstall Gwyddion.\n"
+"\n"
+"See Info → Module Browser for specific errors."
+msgstr ""
+"Наиболее вероятно Gwyddion не был правильно обновлён. Вместо этого одна "
+"установка была просто переписана поверх другой и теперь там каша.\n"
+"\n"
+"Необходимо полностью удалить каталог с модулями\n"
+"\n"
+"%s\n"
+"\n"
+"и переустановить Gwyddion.\n"
+"\n"
+"Больше информации об ошибках доступно в меню Информация → Браузер модулей."
+
+#: app/gwymoduleutils-file.c:536
 #, c-format
 msgid "Section %s ended at line %u but it has never started."
 msgstr "Секция %s закончилась в строке %u, но никогда не начиналась."
 
-#: app/gwymoduleutils-file.c:550
+#: app/gwymoduleutils-file.c:544
 #, c-format
 msgid "Section %s ended at line %u instead of %s."
 msgstr "Секция %s закончилась в строке %u вместо %s."
 
-#: app/gwymoduleutils-file.c:587
+#: app/gwymoduleutils-file.c:581
 #, c-format
 msgid "Section %s started at line %u before %s ended."
 msgstr "Секция %s закончилась в строке %u до того, как %s закончилась."
 
-#: app/gwymoduleutils-file.c:593
+#: app/gwymoduleutils-file.c:587
 #, c-format
 msgid "Empty section name at header line %u."
 msgstr "Пустое название секции в строке заголовка %u."
 
-#: app/gwymoduleutils-file.c:628
+#: app/gwymoduleutils-file.c:622
 #, c-format
 msgid "Header line %u lacks prefix %s."
 msgstr "В строке заголовка %u отсутствует префикс %s."
 
-#: app/gwymoduleutils-file.c:653
+#: app/gwymoduleutils-file.c:647
 #, c-format
 msgid "Header line %u lacks key-value separator."
 msgstr "В строке заголовка %u отсутствует разделитель ключ-значение."
 
-#: app/gwymoduleutils-file.c:661
+#: app/gwymoduleutils-file.c:655
 #, c-format
 msgid "Key at header line %u is empty."
 msgstr "Ключ в строке заголовка %u пустой."
 
-#: app/gwymoduleutils-file.c:688
+#: app/gwymoduleutils-file.c:682
 #, c-format
 msgid "Header suddenly ended at line %u; end of header marker is missing"
 msgstr ""
@@ -2057,6 +2165,7 @@ msgstr ""
 
 #: app/gwymoduleutils.c:197 app/settings.c:131 app/settings.c:142
 #: app/toolbox-spec.c:536 modules/file/err.h:62
+#: modules/pygwy/pygwy-console.c:528
 #, c-format
 msgid "Cannot write to file: %s."
 msgstr "Невозможно записать в файл: %s."
@@ -2085,8 +2194,9 @@ msgstr "Начальная точка"
 
 #: app/gwyplaintool.c:1011 modules/file/rawfile.c:997
 #: modules/process/convolution_filter.c:349
-#: modules/process/convolution_filter.c:553 modules/process/neural.c:419
-#: modules/process/obj_synth.c:538 modules/process/pat_synth.c:1449
+#: modules/process/convolution_filter.c:553 modules/process/fibre_synth.c:520
+#: modules/process/neural.c:419 modules/process/obj_synth.c:536
+#: modules/process/pat_synth.c:1450
 msgid "Size"
 msgstr "Размер"
 
@@ -2129,7 +2239,7 @@ msgstr "ru"
 #: app/log.c:536
 #, c-format
 msgid "Log of %s (%s)"
-msgstr "Журнал %s (%s)"
+msgstr "Журнал для %s (%s)"
 
 #: app/log.c:588 app/meta.c:224 modules/tools/selectionmanager.c:399
 msgid "_Export"
@@ -2143,7 +2253,7 @@ msgstr "О_чистить"
 msgid "_Close"
 msgstr "_Закрыть"
 
-#: app/log.c:615 modules/file/imgexport.c:4168 modules/file/rawfile.c:996
+#: app/log.c:615 modules/file/imgexport.c:4118 modules/file/rawfile.c:996
 msgid "Type"
 msgstr "Тип"
 
@@ -2151,8 +2261,8 @@ msgstr "Тип"
 msgid "Function"
 msgstr "Функция"
 
-#: app/log.c:617 modules/file/imgexport.c:3117 modules/process/fit-shape.c:465
-#: modules/process/neural.c:610 modules/tools/stats.c:425
+#: app/log.c:617 modules/file/imgexport.c:3128 modules/process/fit-shape.c:466
+#: modules/process/neural.c:614 modules/tools/stats.c:423
 msgid "Parameters"
 msgstr "Параметры"
 
@@ -2164,39 +2274,39 @@ msgstr "Время"
 msgid "Export Log"
 msgstr "Экспортировать журнал"
 
-#: app/menu.c:556 app/toolbox.c:581
+#: app/menu.c:555 app/toolbox.c:595
 msgid "_Data Process"
 msgstr "_Обработка данных"
 
-#: app/menu.c:598 app/toolbox.c:584
+#: app/menu.c:597 app/toolbox.c:598
 msgid "_Graph"
 msgstr "_График"
 
-#: app/menu.c:641 app/toolbox.c:587
+#: app/menu.c:640 app/toolbox.c:601
 msgid "_Volume Data"
 msgstr "_Объёмные данные"
 
-#: app/menu.c:684 app/toolbox.c:590
+#: app/menu.c:683 app/toolbox.c:604
 msgid "_XYZ Data"
 msgstr "_Данные XYZ"
 
-#: app/menu.c:715
+#: app/menu.c:714
 msgid "Re-show Last"
 msgstr "Повторить с настройкой последний"
 
-#: app/menu.c:730
+#: app/menu.c:729
 msgid "Repeat Last"
 msgstr "Повторить последний"
 
-#: app/menu.c:858
+#: app/menu.c:857
 msgid "Repeat"
 msgstr "Повторить"
 
-#: app/menu.c:864
+#: app/menu.c:863
 msgid "Re-show"
 msgstr "Перепоказать"
 
-#: app/menu.c:1186
+#: app/menu.c:1185
 msgid "_Document history"
 msgstr "_Предыдущие документы"
 
@@ -2204,8 +2314,8 @@ msgstr "_Предыдущие документы"
 msgid "_New"
 msgstr "Новый _элемент"
 
-#: app/meta.c:235 modules/file/imgexport.c:4672 modules/file/rawfile.c:1058
-#: modules/process/neural.c:711 modules/tools/selectionmanager.c:405
+#: app/meta.c:235 modules/file/imgexport.c:4620 modules/file/rawfile.c:1058
+#: modules/process/neural.c:718 modules/tools/selectionmanager.c:405
 msgid "_Delete"
 msgstr "_Удалить"
 
@@ -2279,11 +2389,11 @@ msgstr "Не удаётся создать каталог интерфейса 
 msgid "Cannot create user module directory %s: %s"
 msgstr "Не удаётся создать каталог модулей пользователя %s: %s"
 
-#: app/splash.c:832
+#: app/splash.c:1260
 msgid "Starting "
 msgstr "Запускается"
 
-#: app/splash.c:878
+#: app/splash.c:1313
 msgid " is free software released under GNU GPL."
 msgstr " – свободное ПО под лицензией GNU GPL."
 
@@ -2831,124 +2941,125 @@ msgstr "_Следующий совет"
 msgid "_Show tips at startup"
 msgstr "_Показывать подсказки при старте"
 
-#: app/toolbox-editor.c:212
+#: app/toolbox-editor.c:213
 msgid "Toolbox Editor"
 msgstr "Редактор панели инструментов"
 
-#: app/toolbox-editor.c:257
+#: app/toolbox-editor.c:258
 msgid "_New Item"
 msgstr "_Новый элемент"
 
-#: app/toolbox-editor.c:262
+#: app/toolbox-editor.c:263
 msgid "_New Group"
 msgstr "Новая _группа"
 
-#: app/toolbox-editor.c:268 app/toolbox.c:577
+#: app/toolbox-editor.c:269 app/toolbox.c:591
 msgid "_Edit"
 msgstr "_Правка"
 
-#: app/toolbox-editor.c:273 modules/process/fft_filter_2d.c:499
-#: modules/tools/maskedit.c:548 modules/volume/volume_zcal.c:173
+#: app/toolbox-editor.c:274 modules/process/fft_filter_2d.c:499
+#: modules/tools/maskedit.c:554 modules/volume/volume_zcal.c:173
 msgid "_Remove"
 msgstr "_Удалить"
 
-#: app/toolbox-editor.c:278
+#: app/toolbox-editor.c:279
 msgid "Move _Up"
 msgstr "Переместить _вверх"
 
-#: app/toolbox-editor.c:283
+#: app/toolbox-editor.c:284
 msgid "Move _Down"
 msgstr "Переместить в_низ"
 
-#: app/toolbox-editor.c:292 modules/file/hdrimage.cc:2304
-#: modules/file/imgexport.c:3101 modules/file/pixmap.c:872
+#: app/toolbox-editor.c:293 modules/file/hdrimage.cc:2304
+#: modules/file/imgexport.c:3114 modules/file/pixmap.c:872
 #: modules/file/rawfile.c:658 modules/process/crosscor.c:252
-#: modules/process/dimensions.h:473 modules/process/tip_blind.c:333
+#: modules/process/dimensions.h:455 modules/process/fibre_synth.c:526
+#: modules/process/tip_blind.c:334
 msgid "_Width:"
 msgstr "_Ширина:"
 
-#: app/toolbox-editor.c:774
+#: app/toolbox-editor.c:787
 msgid "Toolbox Group"
 msgstr "Группа инструментов"
 
-#: app/toolbox-editor.c:791 modules/file/rawgraph.c:267
+#: app/toolbox-editor.c:804 modules/file/rawgraph.c:267
 msgid "_Title:"
 msgstr "_Заголовок:"
 
-#: app/toolbox-editor.c:805
+#: app/toolbox-editor.c:818
 msgid "_Id:"
 msgstr "_Индентификатор"
 
-#: app/toolbox-editor.c:818
+#: app/toolbox-editor.c:831
 msgid "_Suggest"
 msgstr "_Предложить"
 
-#: app/toolbox-editor.c:824
+#: app/toolbox-editor.c:837
 msgid "Trans_latable title"
 msgstr "П_ереводимое название"
 
-#: app/toolbox-editor.c:874
+#: app/toolbox-editor.c:887
 msgid "Group id is not a valid identifier"
 msgstr "Идентификатор группы не является правильным идентификатором"
 
-#: app/toolbox-editor.c:882
+#: app/toolbox-editor.c:895
 msgid "Group id is not unique"
 msgstr "Идентификатор группы не уникален"
 
-#: app/toolbox-editor.c:971
+#: app/toolbox-editor.c:984
 msgid "Toolbox Item"
 msgstr "Элемент панели инструментов"
 
-#: app/toolbox-editor.c:992 modules/process/coerce.c:331
+#: app/toolbox-editor.c:1005 modules/process/coerce.c:331
 #: modules/tools/filter.c:284
 msgid "_Type:"
 msgstr "_Тип:"
 
-#: app/toolbox-editor.c:999
+#: app/toolbox-editor.c:1012
 msgid "Placeholder"
 msgstr "Заполнитель"
 
-#: app/toolbox-editor.c:1000
+#: app/toolbox-editor.c:1013
 msgid "Builtin"
 msgstr "Встроенные"
 
-#: app/toolbox-editor.c:1001 app/toolbox.c:107
+#: app/toolbox-editor.c:1014 app/toolbox.c:112
 msgid "Data Process"
 msgstr "Обработка данных"
 
-#: app/toolbox-editor.c:1003
+#: app/toolbox-editor.c:1016
 msgid "Volume Data"
 msgstr "Объёмные данные"
 
-#: app/toolbox-editor.c:1004
+#: app/toolbox-editor.c:1017
 msgid "XYZ Data"
 msgstr "Данные XYZ"
 
-#: app/toolbox-editor.c:1005
+#: app/toolbox-editor.c:1018
 msgid "Tool"
 msgstr "Инструмент"
 
-#: app/toolbox-editor.c:1012
+#: app/toolbox-editor.c:1025 modules/tools/profile.c:483
 msgid "_Mode:"
 msgstr "_Режим"
 
-#: app/toolbox-editor.c:1019 app/toolbox-editor.c:1038
+#: app/toolbox-editor.c:1032 app/toolbox-editor.c:1051
 msgid "Default"
 msgstr "По умолчанию"
 
-#: app/toolbox-editor.c:1020
+#: app/toolbox-editor.c:1033
 msgid "Interactive"
 msgstr "Интерактивно"
 
-#: app/toolbox-editor.c:1021
+#: app/toolbox-editor.c:1034
 msgid "Non-interactive"
 msgstr "Неинтерактивно"
 
-#: app/toolbox-editor.c:1029
+#: app/toolbox-editor.c:1042
 msgid "Use _icon from:"
 msgstr "Использовать _иконку из:"
 
-#: app/toolbox-editor.c:1063
+#: app/toolbox-editor.c:1076
 msgid "Functions"
 msgstr "Функции"
 
@@ -2964,143 +3075,159 @@ msgstr "остальные инструменты"
 msgid "All tools not placed explicitly go here."
 msgstr "Все инструменты, чьё положение явно не задано, попадут сюда."
 
-#: app/toolbox.c:106
+#: app/toolbox.c:111
 msgid "View"
 msgstr "Вид"
 
-#: app/toolbox.c:109
+#: app/toolbox.c:114
 msgid "Tools"
 msgstr "Инструменты"
 
-#: app/toolbox.c:575
+#: app/toolbox.c:589
 msgid "_File"
 msgstr "_Файл"
 
-#: app/toolbox.c:593
+#: app/toolbox.c:607
 msgid "_Info"
 msgstr "_Информация"
 
-#: app/toolbox.c:663
+#: app/toolbox.c:696
 msgid "Display a 3D view of data"
 msgstr "Показать трехмерный вид данных"
 
-#: app/toolbox.c:667
+#: app/toolbox.c:700
+msgid "Undo"
+msgstr "Отменить"
+
+#: app/toolbox.c:700
+msgid "Undo last action"
+msgstr "Отменить последнее действие"
+
+#: app/toolbox.c:704
+msgid "Redo"
+msgstr "Повторить"
+
+#: app/toolbox.c:704
+msgid "Redo again last undone action"
+msgstr "Повторить снова последнее незаконченное действие"
+
+#: app/toolbox.c:708
 msgid "Zoom in"
 msgstr "Приблизить"
 
-#: app/toolbox.c:671
+#: app/toolbox.c:712
 msgid "Zoom out"
 msgstr "Отдалить"
 
-#: app/toolbox.c:675
+#: app/toolbox.c:716
 msgid "Zoom 1:1"
 msgstr "Масштаб 1:1"
 
-#: app/toolbox.c:722
+#: app/toolbox.c:781
 msgid "/Show _Data Browser"
 msgstr "/Показать браузер _данных"
 
-#: app/toolbox.c:730
+#: app/toolbox.c:789
 msgid "/Module _Browser"
 msgstr "/_Просмотр модулей"
 
-#: app/toolbox.c:738
+#: app/toolbox.c:797
 msgid "/Program _Messages"
 msgstr "/_Сообщения программы"
 
-#: app/toolbox.c:753
+#: app/toolbox.c:812
 msgid "/_User Guide"
 msgstr "/_Руководство пользователя"
 
-#: app/toolbox.c:761
+#: app/toolbox.c:820
 msgid "/_Tip of the Day"
 msgstr "/_Совет дня"
 
-#: app/toolbox.c:769
+#: app/toolbox.c:828
 msgid "/_About Gwyddion"
 msgstr "О программе Gwyddion"
 
-#: app/toolbox.c:806
+#: app/toolbox.c:865
 msgid "/_Open..."
 msgstr "/_Открыть..."
 
-#: app/toolbox.c:814
+#: app/toolbox.c:873
 msgid "/_Merge..."
 msgstr "/Объ_единить..."
 
-#: app/toolbox.c:822
+#: app/toolbox.c:881
 msgid "/Open _Recent"
 msgstr "/_Последние файлы"
 
-#: app/toolbox.c:830
+#: app/toolbox.c:889
 msgid "/_Save"
 msgstr "/_Сохранить"
 
-#: app/toolbox.c:838
+#: app/toolbox.c:897
 msgid "/Save _As..."
 msgstr "/Сохранить _как..."
 
-#: app/toolbox.c:846
+#: app/toolbox.c:905
 msgid "/_Close"
 msgstr "/_Закрыть"
 
-#: app/toolbox.c:854
+#: app/toolbox.c:913
 msgid "/Remo_ve All Logs"
 msgstr "/_Удалить все журналы"
 
-#: app/toolbox.c:870
+#: app/toolbox.c:929
 msgid "/_Quit"
 msgstr "/_Выйти"
 
-#: app/toolbox.c:910
+#: app/toolbox.c:969
 msgid "/_Undo"
 msgstr "/_Отменить"
 
-#: app/toolbox.c:918
+#: app/toolbox.c:977
 msgid "/_Redo"
 msgstr "/_Повторить"
 
-#: app/toolbox.c:934
+#: app/toolbox.c:993
 msgid "/Default Mask _Color..."
 msgstr "/_Цвет маски по умолчанию..."
 
-#: app/toolbox.c:942
+#: app/toolbox.c:1001
 msgid "/Color _Gradients..."
 msgstr "/Цветовые _градиенты..."
 
-#: app/toolbox.c:950
+#: app/toolbox.c:1009
 msgid "/G_L Materials..."
 msgstr "/_Материалы OpenGL..."
 
-#: app/toolbox.c:958
+#: app/toolbox.c:1017
 msgid "/_Toolbox..."
 msgstr "/Панель _инструментов..."
 
-#: app/toolbox.c:966
+#: app/toolbox.c:1025
 msgid "/_Keyboard Shortcuts"
 msgstr "/_Комбинации клавиш"
 
-#: app/toolbox.c:974
+#: app/toolbox.c:1033
 msgid "/_Logging Enabled"
 msgstr "/Включить _журналирование"
 
-#: app/toolbox.c:1083
+#: app/toolbox.c:1142
 msgid "Program Messages"
 msgstr "Сообщения программы"
 
-#: app/toolbox.c:1320
+#: app/toolbox.c:1379
 msgid "Change Default Mask Color"
 msgstr "Изменить цвет маски по умолчанию"
 
-#: app/toolbox.c:1348
+#: app/toolbox.c:1407
 msgid "OpenGL 3D graphics not available"
 msgstr "Трёхмерная графика OpenGL не доступна"
 
-#: app/toolbox.c:1353
+#: app/toolbox.c:1412
 msgid "OpenGL was disabled with a command-line option."
 msgstr "OpenGL был отключен опцией командной строки."
 
-#: app/toolbox.c:1361
+#: app/toolbox.c:1420
 msgid ""
 "Initialization of OpenGL failed.  Check output of <tt>glxinfo</tt> and "
 "warning messages printed to console during Gwyddion startup."
@@ -3108,7 +3235,7 @@ msgstr ""
 "Инициализация OpenGL не удалась. Проверьте вывод <tt>glxinfo</tt> и "
 "предупреждения, которые выводились на консоль при старте Gwyddion."
 
-#: app/toolbox.c:1368
+#: app/toolbox.c:1427
 msgid "This version of Gwyddion was built without OpenGL support."
 msgstr "Эта версия Gwyddion была собрана без поддержки OpenGL"
 
@@ -3184,7 +3311,7 @@ msgstr "Несколько ссылок на объект"
 msgid "Secondary data item has no primary data"
 msgstr "Вторичный элемент данных не имеет первичных данных"
 
-#: app/wait.c:106
+#: app/wait.c:114
 msgid "Please wait"
 msgstr "Подождите, пожалуйста "
 
@@ -3203,11 +3330,11 @@ msgstr ""
 "Заголовок файла не может быть сконвертирован из набора символов ISO-8859-1: "
 "%s"
 
-#: modules/file/aistfile.c:127
+#: modules/file/aistfile.c:123
 msgid "Imports AIST-NT data files."
 msgstr "Импорт файлов данных AIST-NT"
 
-#: modules/file/aistfile.c:140
+#: modules/file/aistfile.c:136
 msgid "AIST-NT files (.aist)"
 msgstr "Файлы AIST-NT (.aist)"
 
@@ -3254,7 +3381,8 @@ msgstr "Значение тега заголовка ‘%s’ не выровн
 
 #: modules/file/alicona.c:665 modules/file/gdeffile.c:175
 #: modules/file/gdeffile.c:199 modules/file/gsffile.c:159
-#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1038
+#: modules/file/gxyzffile.c:199 modules/file/iso28600.c:1174
+#: modules/file/microprof.c:361 modules/file/microprof.c:375
 #: modules/file/pt3file.c:489 modules/file/pt3file.c:591
 msgid "File header is truncated."
 msgstr "Заголовок файла усечён."
@@ -3267,11 +3395,11 @@ msgstr "В комментарии отсутствуют завершающие
 msgid "Comment is not nul-terminated."
 msgstr "Комментарий не завершается нулём."
 
-#: modules/file/ambfile.c:84
+#: modules/file/ambfile.c:83
 msgid "Imports Ambios AMB data files."
 msgstr "Импортирует файлы данных Ambios AMB."
 
-#: modules/file/ambfile.c:97
+#: modules/file/ambfile.c:96
 msgid "Ambios amb files (.amb)"
 msgstr "Файлы Ambios amb (.amb)"
 
@@ -3303,11 +3431,11 @@ msgstr "Для FileDescEnd не найден соответствующий File
 msgid "FileDescBegin has no corresponding FileDescEnd."
 msgstr "Для FileDescBegin не найден соответствующий FileDescEnd."
 
-#: modules/file/apedaxfile.c:259
+#: modules/file/apedaxfile.c:261
 msgid "Imports A.P.E. Research DAX data files."
 msgstr "Импортирует файлы данных A.P.E. Research DAX."
 
-#: modules/file/apedaxfile.c:274
+#: modules/file/apedaxfile.c:276
 msgid "A.P.E. Research DAX Files (.dax) and APDT File (.apdt)"
 msgstr "Файлы A.P.E. Research DAX (.dax) и APDT (.apdt)"
 
@@ -3335,7 +3463,7 @@ msgstr "Ширина:"
 msgid "Height:"
 msgstr "Высота:"
 
-#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:248
+#: modules/file/asciiexport.c:220 modules/file/xyzexport.c:251
 msgid "Value units:"
 msgstr "Единицы измерения:"
 
@@ -3344,30 +3472,30 @@ msgid "Export Text"
 msgstr "Экспортировать текст"
 
 #: modules/file/asciiexport.c:275 modules/file/gxyzffile.c:402
-#: modules/file/imgexport.c:3565 modules/file/imgexport.c:4203
-#: modules/file/rawfile.c:758 modules/file/xyzexport.c:311
-#: modules/process/calibrate.c:607 modules/process/coerce.c:364
-#: modules/process/col_synth.c:516 modules/process/correct_affine.c:470
-#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:261
-#: modules/process/grain_dist.c:306 modules/process/grain_edge.c:255
-#: modules/process/grain_mark.c:338 modules/process/grain_wshed.c:252
-#: modules/process/linematch.c:852 modules/process/mark_disconn.c:279
-#: modules/process/slope_dist.c:367 modules/process/tip_blind.c:357
+#: modules/file/imgexport.c:3532 modules/file/imgexport.c:4151
+#: modules/file/rawfile.c:758 modules/file/xyzexport.c:314
+#: modules/process/calibrate.c:561 modules/process/coerce.c:363
+#: modules/process/col_synth.c:516 modules/process/correct_affine.c:520
+#: modules/process/extend.c:259 modules/process/fft_filter_1d.c:263
+#: modules/process/grain_dist.c:307 modules/process/grain_edge.c:254
+#: modules/process/grain_mark.c:335 modules/process/grain_wshed.c:256
+#: modules/process/linematch.c:819 modules/process/mark_disconn.c:280
+#: modules/process/slope_dist.c:359 modules/process/tip_blind.c:360
 #: modules/process/wpour_mark.c:354 modules/tools/spotremove.c:322
-#: modules/tools/stats.c:402 modules/xyz/xyz_raster.c:628
+#: modules/tools/stats.c:401 modules/xyz/xyz_raster.c:597
 msgid "Options"
 msgstr "Параметры"
 
-#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:314
+#: modules/file/asciiexport.c:278 modules/file/xyzexport.c:317
 msgid "Use _dot as decimal separator"
 msgstr "Использовать точку как _десятичный разделитель"
 
-#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:321
-#: modules/process/grain_dist.c:317
+#: modules/file/asciiexport.c:285 modules/file/xyzexport.c:324
+#: modules/process/grain_dist.c:318
 msgid "Add _informational comment header"
 msgstr "Добавить _информационный заголовок-комментарий"
 
-#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:330
+#: modules/file/asciiexport.c:294 modules/file/xyzexport.c:333
 msgid "_Precision:"
 msgstr "_Точность:"
 
@@ -3387,20 +3515,20 @@ msgstr "Импортирует файлы Attocube Systems ASC."
 msgid "Attocube ASCII files (.asc)"
 msgstr "ASCII файлы Attocube (.asc)"
 
-#: modules/file/bcrfile.c:146
+#: modules/file/bcrfile.c:141
 msgid "Imports Image Metrology BCR data files."
 msgstr "Импортирует файлы данных Image Metrology BCR."
 
-#: modules/file/bcrfile.c:159
+#: modules/file/bcrfile.c:154
 msgid "BCR files (.bcr, .bcrf)"
 msgstr "Файлы BCR (.bcr, .bcrf)"
 
-#: modules/file/bcrfile.c:238
+#: modules/file/bcrfile.c:233
 #, c-format
 msgid "File header is not convertible from UTF-16: %s"
 msgstr "Заголовок файла не может быть сконвертирован из UTF-16: %s"
 
-#: modules/file/bcrfile.c:351
+#: modules/file/bcrfile.c:346
 #, c-format
 msgid "Unknown file type header: `%s'."
 msgstr "Неизвестный заголовок типа файла: `%s'."
@@ -3435,7 +3563,7 @@ msgid "Burleigh exported data (.txt, .bin)"
 msgstr "Экспортированные данные Burleigh (.txt, .bin)"
 
 #: modules/file/burleigh_exp.c:226 modules/file/burleigh_exp.c:267
-#: modules/file/nanoscope.c:1605 modules/file/omicron.c:416
+#: modules/file/nanoscope.c:1612 modules/file/omicron.c:416
 #: modules/file/shimadzu.c:468
 msgid "Missing colon in header line."
 msgstr "Пропущено двоеточие в строке заголовка."
@@ -3485,22 +3613,40 @@ msgstr "Импортирует файлы данных Benyuan CSM."
 msgid "Benyuan CSM files (.csm)"
 msgstr "Файлы Benyuan CSM (.csm)"
 
-#: modules/file/dektakxml.c:138
+#: modules/file/dektakvca.c:197
+msgid "Imports Dektak OPDx data files."
+msgstr "Импортирует файлы данных Dektak OPDx."
+
+#: modules/file/dektakvca.c:210
+msgid "Dektak OPDx data files (.OPDx)"
+msgstr "Файлы данных Dektak OPDx (.OPDx)"
+
+#: modules/file/dektakvca.c:655
+#, c-format
+msgid "Item `%s' has unexpected type %u instead of %u."
+msgstr "Элемент `%s' имеет неожиданный тип %u вместо %u."
+
+#: modules/file/dektakvca.c:1022
+#, c-format
+msgid "Truncated data inside item %s."
+msgstr "Неполные данные внутри элемента %s."
+
+#: modules/file/dektakxml.c:118
 msgid "Imports Dektak XML data files."
 msgstr "Импортирует файлы данных Dektak XML."
 
-#: modules/file/dektakxml.c:151
+#: modules/file/dektakxml.c:131
 msgid "Dektak XML data files (.xml)"
 msgstr "Файлы данных Dektak XML (.xml)"
 
-#: modules/file/dektakxml.c:228 modules/file/lextfile.c:260
-#: modules/file/nanoscan.c:267 modules/file/ometiff.c:265
+#: modules/file/dektakxml.c:208 modules/file/lextfile.c:260
+#: modules/file/nanoscan.c:270 modules/file/ometiff.c:265
 #, c-format
 msgid "XML parsing failed: %s"
 msgstr "Разбор XML окончился неудачно: %s"
 
-#: modules/file/dektakxml.c:400 modules/file/lextfile.c:163
-#: modules/file/nanoscan.c:672 modules/file/ometiff.c:445
+#: modules/file/dektakxml.c:373 modules/file/lextfile.c:163
+#: modules/file/nanoscan.c:698 modules/file/ometiff.c:445
 #, c-format
 msgid "Top-level element is not ‘%s’."
 msgstr "Элемент верхнего уровня не ‘%s’."
@@ -3612,7 +3758,7 @@ msgid "Scan size header field overlaps with data."
 msgstr "Поле заголовка \"размер сканирования\" пересекается с данными."
 
 #: modules/file/err.h:48 modules/file/nrrdfile.c:779
-#: modules/file/nrrdfile.c:824
+#: modules/file/nrrdfile.c:824 modules/pygwy/pygwy-console.c:504
 #, c-format
 msgid "Cannot read from file: %s."
 msgstr "Невозможно прочесть из файла: %s."
@@ -3831,32 +3977,32 @@ msgstr ""
 "Разбор данных завершился успешно, но в результате был получен неожиданный "
 "объект %s."
 
-#: modules/file/gwytiff.h:332
+#: modules/file/gwytiff.h:335
 #, c-format
 msgid "BigTIFF reserved fields are %u and %u instead of 8 and 0."
 msgstr "В BigTIFF зарезервированы поля %u и %u вместо 8 и 0."
 
-#: modules/file/gwytiff.h:349 modules/file/gwytiff.h:366
+#: modules/file/gwytiff.h:352 modules/file/gwytiff.h:369
 #, c-format
 msgid "TIFF directory %lu ended unexpectedly."
 msgstr "Каталог TIFF %lu неожиданно завершился."
 
-#: modules/file/gwytiff.h:484
+#: modules/file/gwytiff.h:487
 #, c-format
 msgid "BigTIFF data type %u was found in a classic TIFF."
 msgstr "Тип данных BigTIFF %u был обнаружен в классическом TIFF."
 
-#: modules/file/gwytiff.h:501
+#: modules/file/gwytiff.h:504
 msgid "Invalid tag data positions were found."
 msgstr "Были найдены некорректные позиции тегов данных."
 
-#: modules/file/gwytiff.h:874 modules/file/gwytiff.h:889
-#: modules/file/gwytiff.h:1012 modules/file/gwytiff.h:1019
+#: modules/file/gwytiff.h:877 modules/file/gwytiff.h:892
+#: modules/file/gwytiff.h:1015 modules/file/gwytiff.h:1022
 #, c-format
 msgid "Required tag %u was not found."
 msgstr "Требуемый тег %u не был найден."
 
-#: modules/file/gwytiff.h:942 modules/file/gwytiff.h:986
+#: modules/file/gwytiff.h:945 modules/file/gwytiff.h:989
 #: modules/file/keyence.c:449 modules/file/matfile.c:276
 #: modules/file/matfile.c:298 modules/file/omicronflat.c:1962
 #: modules/file/princetonspe.c:339 modules/file/psia.c:352
@@ -3864,21 +4010,21 @@ msgstr "Требуемый тег %u не был найден."
 msgid "File is truncated."
 msgstr "Файл усечен."
 
-#: modules/file/gwytiff.h:1044
+#: modules/file/gwytiff.h:1047
 msgid "Non-uniform bits per sample are unsupported."
 msgstr "Неодинаковое число бит на сэмпл не поддерживается"
 
-#: modules/file/gwytiff.h:1071
+#: modules/file/gwytiff.h:1074 modules/file/zeisslsm.c:973
 #, c-format
 msgid "Compression type %u is not supported."
 msgstr "Тип сжатия %u не поддерживается."
 
-#: modules/file/gwytiff.h:1077
+#: modules/file/gwytiff.h:1080
 #, c-format
 msgid "Planar configuration %u is not supported."
-msgstr "Двумерная конфигурация %u не поддерживается."
+msgstr "Конфигурация плоскостей %u не поддерживается."
 
-#: modules/file/gwytiff.h:1101
+#: modules/file/gwytiff.h:1104
 msgid "Unsupported sample format"
 msgstr "Неподдерживаемый формат сэмпла"
 
@@ -3915,7 +4061,7 @@ msgstr "Ошибка контрольной суммы"
 msgid "Minizip error while reading the zip file: %s (%d)."
 msgstr "Ошибка minizip в процессе чтения zip-файла: %s (%d)."
 
-#: modules/file/gwyzip.h:248
+#: modules/file/gwyzip.h:248 modules/file/jpkscan.c:2776
 #, c-format
 msgid "File %s is missing in the zip file."
 msgstr "Файл %s отсутствует в zip-архиве."
@@ -3950,8 +4096,8 @@ msgstr "Размер данных %lu не является кратным ра
 msgid "Export GXYZF"
 msgstr "Экспорт GXYZF"
 
-#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:238
-#: modules/file/xyzexport.c:304
+#: modules/file/gxyzffile.c:395 modules/file/xyzexport.c:241
+#: modules/file/xyzexport.c:307
 msgid "XYZ data:"
 msgstr "Данные XYZ:"
 
@@ -4040,11 +4186,13 @@ msgstr "Масштаб _Z:"
 msgid "Representable"
 msgstr "Представление"
 
-#: modules/file/hdrimage.cc:480 modules/tools/stats.c:203
+#: modules/file/hdrimage.cc:480 modules/graph/graph_stats.c:146
+#: modules/tools/stats.c:203
 msgid "Minimum:"
 msgstr "Минимум:"
 
-#: modules/file/hdrimage.cc:496 modules/tools/stats.c:204
+#: modules/file/hdrimage.cc:496 modules/graph/graph_stats.c:147
+#: modules/tools/stats.c:204
 msgid "Maximum:"
 msgstr "Максимум:"
 
@@ -4063,12 +4211,12 @@ msgid "OpenEXR data type %u is invalid or unsupported."
 msgstr "Тип данных OpenEXR %u неправилен или не поддерживается."
 
 #: modules/file/hdrimage.cc:1433 modules/file/hdrimage.cc:1442
-#: modules/file/imgexport.c:5249 modules/file/imgexport.c:5260
+#: modules/file/imgexport.c:5198 modules/file/imgexport.c:5209
 #, c-format
 msgid "libpng initialization error (in %s)"
 msgstr "ошибка инициализации libpng (в %s)"
 
-#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5324
+#: modules/file/hdrimage.cc:1451 modules/file/imgexport.c:5273
 msgid "libpng error occurred"
 msgstr "Произошла ошибка в libpng"
 
@@ -4086,11 +4234,6 @@ msgstr "Информация о изображении"
 msgid "Horizontal size:"
 msgstr "Горизонтальный размер:"
 
-#: modules/file/hdrimage.cc:2246 modules/file/hdrimage.cc:2252
-#: modules/file/pixmap.c:820 modules/file/pixmap.c:826
-msgid "px"
-msgstr "пикс."
-
 #: modules/file/hdrimage.cc:2252 modules/file/pixmap.c:826
 msgid "Vertical size:"
 msgstr "Вертикальный размер:"
@@ -4103,10 +4246,10 @@ msgstr "Каналы:"
 msgid "Pages:"
 msgstr "Страницы:"
 
-#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3043
+#: modules/file/hdrimage.cc:2290 modules/file/imgexport.c:3059
 #: modules/file/pixmap.c:862 modules/file/rawfile.c:649
-#: modules/process/dimensions.h:467 modules/xyz/xyz_drift.c:774
-#: modules/xyz/xyz_raster.c:566
+#: modules/process/dimensions.h:449 modules/xyz/xyz_drift.c:774
+#: modules/xyz/xyz_raster.c:535
 msgid "Physical Dimensions"
 msgstr "Физические размеры"
 
@@ -4116,16 +4259,16 @@ msgstr "Физические размеры"
 #: modules/process/calcoefs_new.c:408 modules/process/calcoefs_new.c:475
 #: modules/process/calcoefs_simple.c:391 modules/process/calcoefs_simple.c:458
 #: modules/process/calcoefs_view.c:511 modules/process/calcoefs_view.c:549
-#: modules/process/calibrate.c:466 modules/process/calibrate.c:549
-#: modules/process/dimensions.h:161 modules/process/volumize_layers.c:259
-#: modules/volume/volume_calibrate.c:414 modules/volume/volume_calibrate.c:441
-#: modules/volume/volume_calibrate.c:468 modules/volume/volume_calibrate.c:546
+#: modules/process/calibrate.c:459 modules/process/calibrate.c:514
+#: modules/process/dimensions.h:143 modules/process/volumize_layers.c:259
+#: modules/volume/volume_calibrate.c:409 modules/volume/volume_calibrate.c:429
+#: modules/volume/volume_calibrate.c:449 modules/volume/volume_calibrate.c:498
 msgid "verb|Change"
 msgstr "Изменить"
 
 #: modules/file/hdrimage.cc:2345 modules/file/pixmap.c:907
-#: modules/file/rawfile.c:694 modules/process/crosscor.c:263
-#: modules/process/dimensions.h:477
+#: modules/file/rawfile.c:694 modules/process/crosscor.c:260
+#: modules/process/dimensions.h:459
 msgid "H_eight:"
 msgstr "_Высота:"
 
@@ -4142,16 +4285,16 @@ msgstr "Масштаб _Z (на единицу дискретизации):"
 #: modules/file/hdrimage.cc:2557 modules/file/pixmap.c:1176
 #: modules/file/rawfile.c:1386 modules/process/calcoefs_new.c:819
 #: modules/process/calcoefs_simple.c:1197 modules/process/calcoefs_view.c:1380
-#: modules/process/calibrate.c:979 modules/process/dimensions.h:195
-#: modules/process/volumize_layers.c:315 modules/volume/volume_calibrate.c:1017
+#: modules/process/calibrate.c:1013 modules/process/dimensions.h:177
+#: modules/process/volumize_layers.c:314 modules/volume/volume_calibrate.c:957
 msgid "Change Units"
 msgstr "Изменить единицы измерения"
 
 #: modules/file/hdrimage.cc:2571 modules/file/pixmap.c:1190
 #: modules/file/rawfile.c:1400 modules/process/calcoefs_new.c:832
 #: modules/process/calcoefs_simple.c:1210 modules/process/calcoefs_view.c:1393
-#: modules/process/calibrate.c:993 modules/process/dimensions.h:208
-#: modules/process/volumize_layers.c:329 modules/volume/volume_calibrate.c:1031
+#: modules/process/calibrate.c:1027 modules/process/dimensions.h:190
+#: modules/process/volumize_layers.c:328 modules/volume/volume_calibrate.c:971
 msgid "New _units:"
 msgstr "Новые _единицы:"
 
@@ -4195,131 +4338,131 @@ msgstr "Невозможно загрузить изображение: %s."
 msgid "Field DataSize %ux%u does not match image dimensions %ux%u."
 msgstr "Размер поля данных %u×%u не соответствует размерам изображения %u×%u."
 
-#: modules/file/igorfile.c:200
+#: modules/file/igorfile.c:210
 msgid "Imports Igor binary waves (.ibw)."
 msgstr "Импортирует Igor binary waves (.ibw)."
 
-#: modules/file/igorfile.c:213
+#: modules/file/igorfile.c:223
 msgid "Igor binary waves (.ibw)"
 msgstr "Двоичные волны Igor (.ibw)"
 
-#: modules/file/igorfile.c:273
+#: modules/file/igorfile.c:283
 #, c-format
 msgid "Format version is %d.  Only version 5 is supported."
 msgstr "Версия формата %d.  Поддерживается только версия 5."
 
-#: modules/file/igorfile.c:294
+#: modules/file/igorfile.c:305
 msgid "Only two-dimensional data are supported."
 msgstr "Поддерживаются только двумерные данные."
 
-#: modules/file/igorfile.c:306
+#: modules/file/igorfile.c:317
 #, c-format
 msgid "Number of data points %u does not match resolutions %u×%u×%u."
 msgstr "Число точек данных %u не соответствует разрешению %u×%u×%u."
 
-#: modules/file/igorfile.c:320
+#: modules/file/igorfile.c:331
 #, c-format
 msgid "Data size %u does not match the number of data points %u×%u."
 msgstr "Размер данных %u не соответствует числу точек данных %u×%u."
 
-#: modules/file/igorfile.c:358
+#: modules/file/igorfile.c:369
 msgid "Cannot read channel labels."
 msgstr "Не удаётся прочесть метки каналов."
 
-#: modules/file/imgexport.c:392 modules/file/pixmap.c:178
+#: modules/file/imgexport.c:391 modules/file/pixmap.c:178
 msgid "Portable Network Graphics (.png)"
 msgstr "Portable Network Graphics (.png)"
 
-#: modules/file/imgexport.c:398 modules/file/pixmap.c:182
+#: modules/file/imgexport.c:397 modules/file/pixmap.c:182
 msgid "JPEG (.jpeg,.jpg)"
 msgstr "JPEG (.jpeg,.jpg)"
 
-#: modules/file/imgexport.c:404 modules/file/pixmap.c:186
+#: modules/file/imgexport.c:403 modules/file/pixmap.c:186
 msgid "TIFF (.tiff,.tif)"
 msgstr "TIFF (.tiff,.tif)"
 
-#: modules/file/imgexport.c:410 modules/file/pixmap.c:190
+#: modules/file/imgexport.c:409 modules/file/pixmap.c:190
 msgid "Portable Pixmap (.ppm,.pnm)"
 msgstr "Portable Pixmap (.ppm,.pnm)"
 
-#: modules/file/imgexport.c:416 modules/file/pixmap.c:194
+#: modules/file/imgexport.c:415 modules/file/pixmap.c:194
 msgid "Windows or OS2 Bitmap (.bmp)"
 msgstr "Bitmap из Windows или OS2 (.bmp)"
 
-#: modules/file/imgexport.c:422 modules/file/pixmap.c:198
+#: modules/file/imgexport.c:421 modules/file/pixmap.c:198
 msgid "TARGA (.tga,.targa)"
 msgstr "TARGA (.tga,.targa)"
 
-#: modules/file/imgexport.c:429
+#: modules/file/imgexport.c:428
 msgid "WebP (.webp)"
 msgstr "WebP (.webp)"
 
-#: modules/file/imgexport.c:437
+#: modules/file/imgexport.c:436
 msgid "Portable document format (.pdf)"
 msgstr "Portable document format (.pdf)"
 
-#: modules/file/imgexport.c:445
+#: modules/file/imgexport.c:444
 msgid "Encapsulated PostScript (.eps)"
 msgstr "Encapsulated PostScript (.eps)"
 
-#: modules/file/imgexport.c:453
+#: modules/file/imgexport.c:452
 msgid "Scalable Vector Graphics (.svg)"
 msgstr "Scalable Vector Graphics (.svg)"
 
-#: modules/file/imgexport.c:463 modules/tools/selectionmanager.c:269
+#: modules/file/imgexport.c:462 modules/tools/selectionmanager.c:269
 msgid "Horiz./vert. lines"
 msgstr "Гориз./Верт. линии"
 
-#: modules/file/imgexport.c:467 modules/tools/selectionmanager.c:270
+#: modules/file/imgexport.c:466 modules/tools/selectionmanager.c:270
 msgid "Ellipses"
 msgstr "Эллипсы"
 
-#: modules/file/imgexport.c:471 modules/tools/selectionmanager.c:272
+#: modules/file/imgexport.c:470 modules/tools/selectionmanager.c:272
 msgid "Lines"
 msgstr "Линии"
 
-#: modules/file/imgexport.c:479 modules/tools/selectionmanager.c:275
+#: modules/file/imgexport.c:478 modules/tools/selectionmanager.c:275
 msgid "Rectangles"
 msgstr "Прямоугольники"
 
-#: modules/file/imgexport.c:483 modules/process/lat_synth.c:565
+#: modules/file/imgexport.c:482 modules/process/lat_synth.c:565
 #: modules/process/lat_synth.c:637 modules/tools/selectionmanager.c:271
 msgid "Lattice"
 msgstr "Решетка"
 
-#: modules/file/imgexport.c:487
+#: modules/file/imgexport.c:486
 msgid "Path"
 msgstr "Путь"
 
-#: modules/file/imgexport.c:493 modules/file/imgexport.c:499
+#: modules/file/imgexport.c:492 modules/file/imgexport.c:498
 msgid "ruler|_None"
 msgstr "_Нет"
 
-#: modules/file/imgexport.c:494
+#: modules/file/imgexport.c:493
 msgid "_Rulers"
 msgstr "Направл_яющие"
 
-#: modules/file/imgexport.c:495
+#: modules/file/imgexport.c:494
 msgid "_Inset scale bar"
 msgstr "В_ложенный масштабный отрезок"
 
-#: modules/file/imgexport.c:500
+#: modules/file/imgexport.c:499
 msgid "_False color ruler"
 msgstr "_Линейка псевдоцвета"
 
-#: modules/file/imgexport.c:504
+#: modules/file/imgexport.c:503
 msgid "title|None"
 msgstr "Нет"
 
-#: modules/file/imgexport.c:505
+#: modules/file/imgexport.c:504
 msgid "At the top"
 msgstr "Сверху"
 
-#: modules/file/imgexport.c:506
+#: modules/file/imgexport.c:505
 msgid "Along the right edge"
 msgstr "Вдоль правой стороны"
 
-#: modules/file/imgexport.c:512
+#: modules/file/imgexport.c:511
 msgid ""
 "Renders data into vector (SVG, PDF, EPS) and pixmap (PNG, JPEG, TIFF, WebP, "
 "PPM, BMP, TARGA) images. Export to some formats relies on GDK and other "
@@ -4330,56 +4473,57 @@ msgstr ""
 "основан на GDK и других библиотеках, и, вследствие этого, может зависеть от "
 "варианта установки."
 
-#: modules/file/imgexport.c:2931
+#: modules/file/imgexport.c:2933
 msgid "Select Color"
 msgstr "Выбрать цвет"
 
-#: modules/file/imgexport.c:3002
-msgid "Black"
-msgstr "Чёрный"
-
-#: modules/file/imgexport.c:3010
+#: modules/file/imgexport.c:3005
 msgid "White"
 msgstr "Белый"
 
-#: modules/file/imgexport.c:3053
+#: modules/file/imgexport.c:3014
+msgid "Black"
+msgstr "Чёрный"
+
+#: modules/file/imgexport.c:3069
 msgid "Pi_xel size:"
 msgstr "Размер пи_кселя:"
 
-#: modules/file/imgexport.c:3062
+#: modules/file/imgexport.c:3077
 msgid "Pixels per _inch:"
 msgstr "Пикселей на _дюйм:"
 
-#: modules/file/imgexport.c:3089
+#: modules/file/imgexport.c:3102
 msgid "_Zoom:"
 msgstr "_Увеличение:"
 
-#: modules/file/imgexport.c:3108 modules/process/bdep_synth.c:430
+#: modules/file/imgexport.c:3120 modules/process/bdep_synth.c:430
 #: modules/process/col_synth.c:486 modules/process/diff_synth.c:508
-#: modules/process/domain_synth.c:510 modules/process/grain_mark.c:285
-#: modules/process/lat_synth.c:753 modules/process/obj_synth.c:575
-#: modules/process/pat_synth.c:852 modules/process/pat_synth.c:1154
-#: modules/process/pat_synth.c:1489 modules/process/tip_blind.c:340
+#: modules/process/domain_synth.c:510 modules/process/fibre_synth.c:540
+#: modules/process/grain_mark.c:284 modules/process/lat_synth.c:753
+#: modules/process/obj_synth.c:573 modules/process/pat_synth.c:853
+#: modules/process/pat_synth.c:1155 modules/process/pat_synth.c:1490
+#: modules/process/phase_synth.c:298 modules/process/tip_blind.c:342
 msgid "_Height:"
 msgstr "_Высота:"
 
-#: modules/file/imgexport.c:3121
+#: modules/file/imgexport.c:3136
 msgid "_Font:"
 msgstr "_Шрифт:"
 
-#: modules/file/imgexport.c:3140
+#: modules/file/imgexport.c:3145
 msgid "_Font size:"
 msgstr "_Размер шрифта:"
 
-#: modules/file/imgexport.c:3160
+#: modules/file/imgexport.c:3163
 msgid "O_utline thickness:"
 msgstr "То_лщина контура:"
 
-#: modules/file/imgexport.c:3170
+#: modules/file/imgexport.c:3172
 msgid "_Border width:"
 msgstr "Ширина _границы:"
 
-#: modules/file/imgexport.c:3180
+#: modules/file/imgexport.c:3181
 msgid "_Tick length:"
 msgstr "Длина _засечек:"
 
@@ -4399,219 +4543,220 @@ msgstr "Цвета"
 msgid "_Line and text color:"
 msgstr "Цвет _линий и текста:"
 
-#: modules/file/imgexport.c:3221
+#: modules/file/imgexport.c:3220
 msgid "_Transparent background"
 msgstr "_Прозрачный фон"
 
-#: modules/file/imgexport.c:3232
+#: modules/file/imgexport.c:3231
 msgid "_Background color:"
 msgstr "Цвет _фона:"
 
-#: modules/file/imgexport.c:3474
-msgid "Lateral scale"
-msgstr "Пространственный масштаб"
-
-#: modules/file/imgexport.c:3487 modules/process/lno_synth.c:1053
-msgid "_Length:"
-msgstr "_Длина:"
-
-#: modules/file/imgexport.c:3503
-msgid "_Auto"
-msgstr "_Авто"
-
-#: modules/file/imgexport.c:3511 modules/process/pat_synth.c:469
+#: modules/file/imgexport.c:3433 modules/process/fibre_synth.c:582
+#: modules/process/pat_synth.c:470
 msgid "Placement"
 msgstr "Положение"
 
-#: modules/file/imgexport.c:3515
+#: modules/file/imgexport.c:3437
 msgid "left"
 msgstr "слева"
 
-#: modules/file/imgexport.c:3519
+#: modules/file/imgexport.c:3440
 msgid "center"
 msgstr "по центру"
 
-#: modules/file/imgexport.c:3523
+#: modules/file/imgexport.c:3443
 msgid "right"
 msgstr "справа"
 
-#: modules/file/imgexport.c:3528
+#: modules/file/imgexport.c:3448
 msgid "top"
 msgstr "верх"
 
-#: modules/file/imgexport.c:3540
+#: modules/file/imgexport.c:3456
 msgid "bottom"
 msgstr "низ"
 
-#: modules/file/imgexport.c:3552 modules/file/imgexport.c:3874
+#: modules/file/imgexport.c:3479
+msgid "Lateral scale"
+msgstr "Пространственный масштаб"
+
+#: modules/file/imgexport.c:3496 modules/process/lno_synth.c:1053
+msgid "_Length:"
+msgstr "_Длина:"
+
+#: modules/file/imgexport.c:3502
+msgid "_Auto"
+msgstr "_Авто"
+
+#: modules/file/imgexport.c:3519 modules/file/imgexport.c:3832
 msgid "Hori_zontal gap:"
 msgstr "_Горизонтальный зазор:"
 
-#: modules/file/imgexport.c:3558 modules/file/imgexport.c:3854
+#: modules/file/imgexport.c:3526 modules/file/imgexport.c:3812
 msgid "_Vertical gap:"
 msgstr "В_ертикальный зазор:"
 
-#: modules/file/imgexport.c:3571 modules/file/imgexport.c:4184
+#: modules/file/imgexport.c:3538 modules/file/imgexport.c:4134
 msgid "Colo_r:"
 msgstr "Цве_т:"
 
-#: modules/file/imgexport.c:3576 modules/file/imgexport.c:4189
+#: modules/file/imgexport.c:3542 modules/file/imgexport.c:4138
 msgid "Out_line color:"
 msgstr "_Цвет контура:"
 
-#: modules/file/imgexport.c:3580 modules/file/imgexport.c:4195
+#: modules/file/imgexport.c:3547 modules/file/imgexport.c:4143
 msgid "O_pacity:"
 msgstr "_Непрозрачность:"
 
-#: modules/file/imgexport.c:3589
+#: modules/file/imgexport.c:3554
 msgid "Draw _ticks"
 msgstr "Рисовать засе_чки"
 
-#: modules/file/imgexport.c:3599
+#: modules/file/imgexport.c:3564
 msgid "Draw _label"
 msgstr "Рисовать подпис_ь"
 
-#: modules/file/imgexport.c:3609
+#: modules/file/imgexport.c:3574
 msgid "Draw text _above scale bar"
 msgstr "Рисовать текст с_верху отрезка"
 
-#: modules/file/imgexport.c:3773
+#: modules/file/imgexport.c:3738
 msgid "Image"
 msgstr "Изображение"
 
-#: modules/file/imgexport.c:3777 modules/process/calcoefs_view.c:473
-#: modules/process/correct_affine.c:488 modules/process/drift.c:297
-#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:202
-#: modules/process/fft_filter_1d.c:294 modules/process/fft_profile.c:292
-#: modules/process/fractal.c:253 modules/process/nanoindent_adjust.c:229
-#: modules/process/polydistort.c:247 modules/process/rotate.c:274
-#: modules/process/scale.c:253 modules/process/straighten_path.c:271
+#: modules/file/imgexport.c:3742 modules/process/calcoefs_view.c:473
+#: modules/process/correct_affine.c:538 modules/process/drift.c:298
+#: modules/process/dwt.c:206 modules/process/dwtanisotropy.c:203
+#: modules/process/fft_filter_1d.c:296 modules/process/fft_profile.c:293
+#: modules/process/fractal.c:262 modules/process/nanoindent_adjust.c:229
+#: modules/process/polydistort.c:250 modules/process/rotate.c:274
+#: modules/process/scale.c:257 modules/process/straighten_path.c:270
 #: modules/process/unrotate.c:277 modules/tools/linestats.c:400
-#: modules/tools/profile.c:555 modules/tools/roughness.c:864
-#: modules/tools/sfunctions.c:468 modules/xyz/xyz_raster.c:632
+#: modules/tools/profile.c:552 modules/tools/roughness.c:879
+#: modules/tools/sfunctions.c:481 modules/xyz/xyz_raster.c:601
 msgid "_Interpolation type:"
 msgstr "Тип _интерполяции:"
 
-#: modules/file/imgexport.c:3807
+#: modules/file/imgexport.c:3772
 msgid "Draw _frame"
 msgstr "Показывать _рамку"
 
-#: modules/file/imgexport.c:3816
+#: modules/file/imgexport.c:3781
 msgid "Draw _mask"
 msgstr "Рисовать _маску"
 
-#: modules/file/imgexport.c:3826
+#: modules/file/imgexport.c:3791
 msgid "Draw mask _legend"
 msgstr "Рисовать _легенду для маски"
 
-#: modules/file/imgexport.c:3861
+#: modules/file/imgexport.c:3819
 msgid "Value Scale"
 msgstr "Масштаб значений"
 
-#: modules/file/imgexport.c:3882
+#: modules/file/imgexport.c:3840
 msgid "Fi_xed precision:"
 msgstr "Фи_ксированная точность:"
 
-#: modules/file/imgexport.c:3898
+#: modules/file/imgexport.c:3855
 msgid "Fixed _kilo threshold:"
 msgstr "Фиксированный порог п_рефиксов:"
 
-#: modules/file/imgexport.c:3914 modules/file/imgexport.c:4635
+#: modules/file/imgexport.c:3869 modules/file/imgexport.c:4583
 msgid "Title"
 msgstr "Заголовок"
 
-#: modules/file/imgexport.c:3918
+#: modules/file/imgexport.c:3877
 msgid "Posi_tion:"
 msgstr "Располо_жение:"
 
-#: modules/file/imgexport.c:3934
+#: modules/file/imgexport.c:3884
 msgid "_Gap:"
 msgstr "_Зазор:"
 
-#: modules/file/imgexport.c:3941
+#: modules/file/imgexport.c:3891
 msgid "Put _units to title"
 msgstr "Поместить единицы измерения в _заголовок"
 
-#: modules/file/imgexport.c:4125
+#: modules/file/imgexport.c:4075
 msgid "Draw _selection"
 msgstr "Рисовать в_ыделенные элементы"
 
-#: modules/file/imgexport.c:4176 modules/tools/selectionmanager.c:361
+#: modules/file/imgexport.c:4126 modules/tools/selectionmanager.c:361
 msgid "Objects"
 msgstr "Объекты"
 
-#: modules/file/imgexport.c:4615
+#: modules/file/imgexport.c:4563
 msgid "Lateral"
 msgstr "Горизонтальные"
 
-#: modules/file/imgexport.c:4654 modules/file/rawfile.c:1040
-#: modules/process/calcoefs_load.c:230 modules/process/neural.c:693
+#: modules/file/imgexport.c:4602 modules/file/rawfile.c:1040
+#: modules/process/calcoefs_load.c:230 modules/process/neural.c:700
 msgid "verb|_Load"
 msgstr "_Загрузить"
 
-#: modules/file/imgexport.c:4660 modules/file/rawfile.c:1046
-#: modules/process/neural.c:699
+#: modules/file/imgexport.c:4608 modules/file/rawfile.c:1046
+#: modules/process/neural.c:706
 msgid "verb|_Store"
 msgstr "Со_хранить"
 
-#: modules/file/imgexport.c:4666 modules/file/rawfile.c:1052
-#: modules/process/neural.c:705
+#: modules/file/imgexport.c:4614 modules/file/rawfile.c:1052
+#: modules/process/neural.c:712
 msgid "_Rename"
 msgstr "_Переименовать"
 
-#: modules/file/imgexport.c:4686 modules/file/rawfile.c:1071
+#: modules/file/imgexport.c:4634 modules/file/rawfile.c:1071
 msgid "Preset _name:"
 msgstr "_Название набора настроек:"
 
-#: modules/file/imgexport.c:4757
+#: modules/file/imgexport.c:4705
 #, c-format
 msgid "Export %s"
 msgstr "Экспорт %s"
 
-#: modules/file/imgexport.c:4778
+#: modules/file/imgexport.c:4727
 msgid "Export as 1_6 bit grayscale"
 msgstr "Экспортировать как 1_6битное серое"
 
-#: modules/file/imgexport.c:4801
+#: modules/file/imgexport.c:4750
 msgid "Lateral Scale"
 msgstr "Горизонтальный масштаб"
 
-#: modules/file/imgexport.c:4806
+#: modules/file/imgexport.c:4755
 msgid "Values"
 msgstr "Значения"
 
-#: modules/file/imgexport.c:4811
+#: modules/file/imgexport.c:4760
 msgid "Selection"
 msgstr "Выделение"
 
-#: modules/file/imgexport.c:4816 modules/file/rawfile.c:462
+#: modules/file/imgexport.c:4765 modules/file/rawfile.c:462
 #: modules/process/convolution_filter.c:275
 msgid "Presets"
 msgstr "Предустановки"
 
-#: modules/file/imgexport.c:5576
+#: modules/file/imgexport.c:5525
 #, c-format
 msgid "Cairo error occurred: %s"
 msgstr "Произошла ошибка cairo: %s"
 
-#: modules/file/imgexport.c:5600
+#: modules/file/imgexport.c:5549
 #, c-format
 msgid "Pixbuf save failed: %s."
 msgstr "Сохранение pixbuf закончилось неудачно: %s."
 
-#: modules/file/imgexport.c:5878
+#: modules/file/imgexport.c:5827
 msgid "Image is too large to be stored as TARGA."
 msgstr "Изображение слишком велико чтобы сохранить его в формате TARGA."
 
-#: modules/file/imgexport.c:6457 modules/file/imgexport.c:6486
+#: modules/file/imgexport.c:6406 modules/file/imgexport.c:6435
 msgid "Draw _numbers"
 msgstr "Рисовать _номера"
 
-#: modules/file/imgexport.c:6469 modules/file/imgexport.c:6517
+#: modules/file/imgexport.c:6418 modules/file/imgexport.c:6466
 msgid "_End marker length:"
 msgstr "Длина _засечек:"
 
-#: modules/file/imgexport.c:6498
+#: modules/file/imgexport.c:6447
 msgid "Marker _radius:"
 msgstr "_Радиус маркера:"
 
@@ -4651,48 +4796,59 @@ msgstr "Набор тегов параметров неполон."
 msgid "image depth"
 msgstr "глубина изображения"
 
-#: modules/file/iso28600.c:534
+#: modules/file/iso28600.c:543
 msgid "Imports and exports ISO 28600:2011 SPM data transfer format."
 msgstr "Импортирует и экспортирует формат передачи данных СЗМ ISO 28600:2011"
 
-#: modules/file/iso28600.c:550
+#: modules/file/iso28600.c:559
 msgid "ISO 28600:2011 SPM data transfer files (.spm)"
 msgstr "Файлы передачи данных СЗМ ISO 28600:2011 (.spm)"
 
-#: modules/file/iso28600.c:606
+#: modules/file/iso28600.c:658
 #, c-format
-msgid "Only regular mappings are implemented but file has mapping type ‘%s’."
+msgid ""
+"Only regular and irregular mappings are implemented but the file has mapping "
+"type ‘%s’."
 msgstr ""
-"Реализованы только правильные отображения, а этот файл содержит тип "
-"отображения ‘%s’."
+"Реализованы только правильные и неправильные отображения, а этот файл "
+"содержит тип отображения ‘%s’."
 
-#: modules/file/iso28600.c:668 modules/file/iso28600.c:677
-#: modules/file/iso28600.c:686
+#: modules/file/iso28600.c:687 modules/file/iso28600.c:696
+#: modules/file/iso28600.c:705
 #, c-format
 msgid "List ‘%s’ has %u items which differs from the number %u given by ‘%s’."
 msgstr ""
 "Список ‘%s’ содержит %u элементов, что отличается от числа %u заданного ‘%s’."
 
-#: modules/file/iso28600.c:755 modules/file/iso28600.c:867
-#: modules/file/sdfile.c:846 modules/file/sdfile.c:863
-#: modules/file/spip-asc.c:239 modules/file/witec-asc.c:223
-#: modules/file/wsffile.c:215
+#: modules/file/iso28600.c:775
+#, c-format
+msgid "End of file reached when reading sample #%u of %u"
+msgstr "Достигнут конец файла при чтении замера #%u из %u"
+
+#: modules/file/iso28600.c:784 modules/file/iso28600.c:873
+#, c-format
+msgid "Malformed data encountered when reading sample #%u"
+msgstr "При чтении замера #%u получены искаженные данные"
+
+#: modules/file/iso28600.c:797 modules/file/iso28600.c:887
+#: modules/file/iso28600.c:1022
+msgid "Missing end-of-data marker."
+msgstr "Отсутствует маркер конца данных end-of-data."
+
+#: modules/file/iso28600.c:1003 modules/file/sdfile.c:846
+#: modules/file/sdfile.c:863 modules/file/spip-asc.c:239
+#: modules/file/witec-asc.c:223 modules/file/wsffile.c:215
 #, c-format
 msgid "End of file reached when reading sample #%d of %d"
 msgstr "Достигнут конец файла при чтении значения #%d из %d"
 
-#: modules/file/iso28600.c:764 modules/file/iso28600.c:876
-#: modules/file/spip-asc.c:246 modules/file/witec-asc.c:230
-#: modules/file/wsffile.c:222
+#: modules/file/iso28600.c:1012 modules/file/spip-asc.c:246
+#: modules/file/witec-asc.c:230 modules/file/wsffile.c:222
 #, c-format
 msgid "Malformed data encountered when reading sample #%d of %d"
 msgstr "При чтении значения #%d из %d получены искаженные данные"
 
-#: modules/file/iso28600.c:774 modules/file/iso28600.c:886
-msgid "Missing end-of-data marker."
-msgstr "Отсутствует маркер конца данных end-of-data."
-
-#: modules/file/iso28600.c:1048
+#: modules/file/iso28600.c:1184
 #, c-format
 msgid "Line %u does not contain mandatory label ‘%s’."
 msgstr "Строка %u не содержит обязательной метки ‘%s’."
@@ -4709,42 +4865,60 @@ msgstr "Файлы данных JEOL (.tif)"
 msgid "The type of data is unknown.  Please report it to the developers."
 msgstr "Тип данных неизвестен. Пожалуйста сообщите о нём разработчикам."
 
-#: modules/file/jpkscan.c:229
+#: modules/file/jpkscan.c:292
 msgid "Imports JPK image scans."
 msgstr "Импортирует изображения сканирований JPK."
 
-#: modules/file/jpkscan.c:242
+#: modules/file/jpkscan.c:305
 msgid "JPK image scans (.jpk, .jpk-qi-image)"
 msgstr "Сканы изображений JPK (.jpk, .jpk-qi-image)"
 
-#: modules/file/jpkscan.c:249
+#: modules/file/jpkscan.c:312
 msgid "JPK force curves (.jpk-force, .jpk-force-map, .jpk-qi-data)"
 msgstr "Силовые кривые JPK (.jpk-force, .jpk-force-map, .jpk-qi-data)"
 
-#: modules/file/jpkscan.c:315
+#: modules/file/jpkscan.c:378
 msgid "File does not contain grid dimensions."
 msgstr "Файл не содержит размеров сетки"
 
-#: modules/file/jpkscan.c:660 modules/file/nanoobserver.c:193
+#: modules/file/jpkscan.c:736 modules/file/nanoobserver.c:360
 #: modules/file/nanoscantech.c:205 modules/file/opengps.c:209
 #: modules/file/sensofarx.c:183 modules/file/spmxfile.c:166
 msgid "Minizip cannot open the file as a ZIP file."
 msgstr "Minizip не может открыть файл как архив ZIP."
 
-#: modules/file/jpkscan.c:739
+#: modules/file/jpkscan.c:758 modules/file/jpkscan.c:2717
+#, c-format
+msgid "Scanning file (%u curves)..."
+msgstr "Сканируем файл (%u кривых)..."
+
+#: modules/file/jpkscan.c:798 modules/file/nmmxyz.c:299
+msgid "Reading files..."
+msgstr "Считываются файлы..."
+
+#: modules/file/jpkscan.c:816
+msgid "Creating volume data..."
+msgstr "Создаём объёмные данные..."
+
+#: modules/file/jpkscan.c:968
 msgid "Non-uniform point and/or segment numbering is not supported."
 msgstr "Неупорядоченная нумерация точек и/или сегментов не поддерживается."
 
-#: modules/file/jpkscan.c:748
+#: modules/file/jpkscan.c:977
 msgid "Non-uniform channel lists are not supported."
 msgstr "Неупорядоченные списки каналов не поддерживаются."
 
-#: modules/file/jpkscan.c:756
+#: modules/file/jpkscan.c:985
 #, c-format
 msgid "Data file %s was found instead of expected %s."
 msgstr "Файл данных %s был найден вместо ожидаемого %s."
 
-#: modules/file/jpkscan.c:1497
+#: modules/file/jpkscan.c:1900
+#, c-format
+msgid "Header properties file for index %u is missing."
+msgstr "Заголовочный файл свойств для индекса %u отсутствует."
+
+#: modules/file/jpkscan.c:2519
 msgid "Cannot find any height channel."
 msgstr "Не получается найти ни одного канала высот."
 
@@ -4897,19 +5071,19 @@ msgstr "Файлы MetroPro (.dat)"
 msgid "File header is larger than file."
 msgstr "Заголовок файла больше, чем сам файл."
 
-#: modules/file/microprof.c:117
+#: modules/file/microprof.c:125
 msgid "Imports MicroProf FRT profilometer data files."
 msgstr "Импортирует файлы данных профилометра MicroProf FRT."
 
-#: modules/file/microprof.c:130
+#: modules/file/microprof.c:138
 msgid "MicroProf FRT files (.frt)"
 msgstr "Файлы MicroProf FRT (.frt)"
 
-#: modules/file/microprof.c:136
+#: modules/file/microprof.c:144
 msgid "MicroProf FRT text files (.txt)"
 msgstr "Текстовые файлы MicroProf FRT (.txt)"
 
-#: modules/file/microprof.c:432
+#: modules/file/microprof.c:519
 msgid "File contains fewer than XSize*YSize data points."
 msgstr "Файл содержит меньше, чем XSize*YSize точек данных"
 
@@ -4998,8 +5172,8 @@ msgstr "Данные изображения начинаются после ко
 msgid "Spectra data starts past the end of file."
 msgstr "Данные спектроскопии начинаются после конца файла."
 
-#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:276
-#: modules/file/renishaw.c:1325 modules/file/sensofar.c:256
+#: modules/file/nanoeducator.c:648 modules/file/opdfile.c:287
+#: modules/file/renishaw.c:1334 modules/file/sensofar.c:256
 #: modules/file/witec-asc.c:161
 msgid "File header is truncated"
 msgstr "Заголовок файла усечён"
@@ -5009,8 +5183,8 @@ msgstr "Заголовок файла усечён"
 msgid "Parameter header is truncated"
 msgstr "Заголовок параметров усечён"
 
-#: modules/file/nanoeducator.c:932 modules/process/curvature.c:454
-#: modules/tools/profile.c:1107
+#: modules/file/nanoeducator.c:932 modules/process/curvature.c:456
+#: modules/tools/profile.c:1090
 #, c-format
 msgid "Profile %d"
 msgstr "Профиль %d"
@@ -5090,23 +5264,27 @@ msgstr "Строка DATA_INFO содержит менее, чем %d полей
 msgid "Missing data start marker \\x1a\\x04."
 msgstr "Отсутствует маркер начала данных \\x1a\\x04."
 
-#: modules/file/nanoobserver.c:113
-msgid "Reads NanoObserver .nao files."
-msgstr "Читает файлы NanoObserver .nao."
+#: modules/file/nanoobserver.c:201
+msgid "Reads Nano-Solution/NanoObserver .nao files."
+msgstr "Читает файлы Nano-Solution/NanoObserver .nao."
+
+#: modules/file/nanoobserver.c:214
+msgid "Nano-Solution/NanoObserver data (.nao)"
+msgstr "Данные Nano-Solution/NanoObserver (.nao)"
 
-#: modules/file/nanoobserver.c:126
-msgid "NanoObserver data (.nao)"
-msgstr "Данные NanoObserver (.nao)"
+#: modules/file/nanoobserver.c:410 modules/file/renishaw.c:1420
+msgid "Data block is truncated"
+msgstr "Блок данных неполон."
 
-#: modules/file/nanoscan.c:188
+#: modules/file/nanoscan.c:191
 msgid "Imports NanoScan XML files."
 msgstr "Импортирует файлы данных NanoScan XML."
 
-#: modules/file/nanoscan.c:201
+#: modules/file/nanoscan.c:204
 msgid "NanoScan XML files (.xml)"
 msgstr "Файлы NanoScan XML (.xml)"
 
-#: modules/file/nanoscan.c:910
+#: modules/file/nanoscan.c:937
 msgid "Wrong size of Base64 encoded data."
 msgstr "Неправильный размер данных, кодированных Base64."
 
@@ -5126,22 +5304,22 @@ msgstr "Импортирует файлы данных Digital Instruments Nanos
 msgid "Nanoscope II files"
 msgstr "Файлы Nanoscope II"
 
-#: modules/file/nanoscope.c:207
+#: modules/file/nanoscope.c:212
 msgid ""
 "Imports Veeco (Digital Instruments) Nanoscope data files, version 3 or newer."
 msgstr ""
 "Импортирует файлы данных Veeco (Digital Instruments) Nanoscope версии 3 или "
 "более новой."
 
-#: modules/file/nanoscope.c:221
+#: modules/file/nanoscope.c:226
 msgid "Nanoscope III files"
 msgstr "Файлы Nanoscope III"
 
-#: modules/file/nanoscope.c:288
+#: modules/file/nanoscope.c:295
 msgid "File is not a Nanoscope file, or it is a unknown subtype."
 msgstr "Файл не является файлом Nanoscope или неизвестного подтипа."
 
-#: modules/file/nanoscope.c:295
+#: modules/file/nanoscope.c:302
 msgid ""
 "File has been damaged by change of line endings, resulting in corruption of "
 "the binary part of the file.\n"
@@ -5160,16 +5338,16 @@ msgstr ""
 "MS Windows, или при других способах передачи файла, которые используют "
 "платформо-независимое сохранение текста."
 
-#: modules/file/nanoscope.c:653 modules/file/nanoscope.c:669
+#: modules/file/nanoscope.c:660 modules/file/nanoscope.c:676
 msgid "Cannot parse `Scan size' field."
 msgstr "Не удаётся распознать поле `Scan size'."
 
-#: modules/file/nanoscope.c:1539 modules/file/nrrdfile.c:1086
+#: modules/file/nanoscope.c:1546 modules/file/nrrdfile.c:1086
 #, c-format
 msgid "Garbage after data sample #%u."
 msgstr "Мусор после элемента данных #%u."
 
-#: modules/file/nanoscope.c:1595
+#: modules/file/nanoscope.c:1602
 msgid "Truncated header line."
 msgstr "Обрезанная строка заголовка."
 
@@ -5249,11 +5427,8 @@ msgstr ""
 "Модуль импорта данных Nano Measuring Machine должен быть запущен в "
 "интерактивном режиме."
 
-#: modules/file/nmmxyz.c:299
-msgid "Reading files..."
-msgstr "Считываются файлы..."
-
 #: modules/file/nmmxyz.c:306 modules/process/lat_synth.c:1224
+#: modules/process/wave_synth.c:798
 msgid "Rendering surface..."
 msgstr "Строится поверхность..."
 
@@ -5286,20 +5461,20 @@ msgid "Plot point density map"
 msgstr "Строить карту плотности точек"
 
 #: modules/file/nmmxyz.c:534 modules/file/rawfile.c:626
-#: modules/process/dimensions.h:445 modules/xyz/xyz_drift.c:725
-#: modules/xyz/xyz_raster.c:517
+#: modules/process/dimensions.h:427 modules/xyz/xyz_drift.c:725
+#: modules/xyz/xyz_raster.c:376
 msgid "Resolution"
 msgstr "Разрешение"
 
 #: modules/file/nmmxyz.c:538 modules/file/rawfile.c:631
-#: modules/process/dimensions.h:451 modules/xyz/xyz_drift.c:729
-#: modules/xyz/xyz_raster.c:521
+#: modules/process/dimensions.h:433 modules/xyz/xyz_drift.c:729
+#: modules/xyz/xyz_raster.c:382
 msgid "_Horizontal size:"
 msgstr "_Горизонтальный размер:"
 
 #: modules/file/nmmxyz.c:554 modules/file/rawfile.c:638
-#: modules/process/dimensions.h:454 modules/xyz/xyz_drift.c:744
-#: modules/xyz/xyz_raster.c:536
+#: modules/process/dimensions.h:436 modules/xyz/xyz_drift.c:744
+#: modules/xyz/xyz_raster.c:388
 msgid "_Vertical size:"
 msgstr "Вертика_льный размер:"
 
@@ -5394,38 +5569,38 @@ msgstr "Поле %s заголовка оси содержит слишком м
 msgid "Per-axis header field %s contains too few items."
 msgstr "Поле %s заголовка оси содержит слишком мало элементов."
 
-#: modules/file/nt-mdt.c:843
+#: modules/file/nt-mdt.c:850
 msgid "Imports NT-MDT data files."
 msgstr "Импорт файлов данных NT-MDT"
 
-#: modules/file/nt-mdt.c:856
+#: modules/file/nt-mdt.c:863
 msgid "NT-MDT files (.mdt)"
 msgstr "Файлы NT-MDT (.mdt)"
 
-#: modules/file/nt-mdt.c:1491 modules/file/nt-mdt.c:1599
+#: modules/file/nt-mdt.c:1498 modules/file/nt-mdt.c:1606
 msgid "Frame is too short for Frame Mode."
 msgstr "Фрейм слишком короткий для режима фреймов."
 
-#: modules/file/nt-mdt.c:1506 modules/file/nt-mdt.c:1614
+#: modules/file/nt-mdt.c:1513 modules/file/nt-mdt.c:1621
 msgid "Frame is too short for dots or data."
 msgstr "Фрейм слишком короткий для точек или данных."
 
-#: modules/file/nt-mdt.c:1869
+#: modules/file/nt-mdt.c:1879
 #, c-format
 msgid "End of file reached in frame header #%u."
 msgstr "Достигнут конец файла в заголовке фрейма #%u."
 
-#: modules/file/nt-mdt.c:1877
+#: modules/file/nt-mdt.c:1887
 #, c-format
 msgid "End of file reached in frame data #%u."
 msgstr "Достигнут конец файла в данных фрейма #%u."
 
-#: modules/file/nt-mdt.c:1910
+#: modules/file/nt-mdt.c:1920
 #, c-format
 msgid "Frame #%u is too short for scanned data header."
 msgstr "Фрейм #%u слишком короткий чтобы быть заголовком сканированных данных."
 
-#: modules/file/nt-mdt.c:1927
+#: modules/file/nt-mdt.c:1937
 #, c-format
 msgid "Frame #%u is too short for spectroscopy data header."
 msgstr "Фрейм #%u слишком короткий чтобы быть заголовком данных спектроскопии."
@@ -5539,28 +5714,28 @@ msgstr "Omicron MATRIX (param.mtrx & data.mtrx)"
 msgid "Omicron MATRIX (.mtrx & .mtrx)"
 msgstr "Omicron MATRIX (.mtrx & .mtrx)"
 
-#: modules/file/opdfile.c:188
+#: modules/file/opdfile.c:199
 msgid "Imports Wyko OPD and ASC files."
 msgstr "Импортирует файлы Wyko OPD и ASC."
 
-#: modules/file/opdfile.c:201
+#: modules/file/opdfile.c:212
 msgid "Wyko OPD files (.opd)"
 msgstr "Файлы Wyko OPD (.opd)"
 
-#: modules/file/opdfile.c:208
+#: modules/file/opdfile.c:219
 msgid "Wyko ASCII export files (.asc)"
 msgstr "Файлы экспорта в ASCII Wyko (.asc)"
 
-#: modules/file/opdfile.c:299
+#: modules/file/opdfile.c:310
 #, c-format
 msgid "Item `%s' is beyond the end of the file."
 msgstr "Элемент `%s' находится за концом файла."
 
-#: modules/file/opdfile.c:614
+#: modules/file/opdfile.c:636
 msgid "Nested directories found"
 msgstr "Найдены вложенные каталоги"
 
-#: modules/file/opdfile.c:805
+#: modules/file/opdfile.c:842
 #, c-format
 msgid "Truncated data in block %s"
 msgstr "Неполные данные в блоке %s"
@@ -5861,19 +6036,21 @@ msgstr "Формат данных"
 
 #: modules/file/rawfile.c:567 modules/process/arithmetic.c:234
 #: modules/process/calcoefs_view.c:320 modules/process/coerce.c:250
-#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:637
+#: modules/process/convolution_filter.c:236 modules/process/deposit_synth.c:638
 #: modules/process/drift.c:242 modules/process/edge.c:635
-#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:183
-#: modules/process/grain_edge.c:210 modules/process/grain_filter.c:313
-#: modules/process/grain_mark.c:244 modules/process/grain_wshed.c:164
-#: modules/process/mark_disconn.c:205 modules/process/mark_with.c:195
-#: modules/process/polydistort.c:205 modules/process/scars.c:295
-#: modules/process/slope_dist.c:273 modules/process/straighten_path.c:198
-#: modules/process/synth.h:509 modules/process/tip_model.c:166
+#: modules/process/entropy.c:178 modules/process/fft_filter_1d.c:184
+#: modules/process/fractal.c:225 modules/process/grain_edge.c:209
+#: modules/process/grain_filter.c:312 modules/process/grain_mark.c:243
+#: modules/process/grain_wshed.c:165 modules/process/mark_disconn.c:205
+#: modules/process/mark_with.c:196 modules/process/mfm_field.c:278
+#: modules/process/mfm_shift.c:167 modules/process/polydistort.c:205
+#: modules/process/scars.c:314 modules/process/slope_dist.c:272
+#: modules/process/stitch.c:272 modules/process/straighten_path.c:198
+#: modules/process/synth.h:538 modules/process/tip_model.c:164
 #: modules/process/wpour_mark.c:273 modules/tools/linestats.c:454
-#: modules/tools/sfunctions.c:534 modules/tools/stats.c:459
-#: modules/volume/volume_extract.c:328 modules/volume/volume_linestat.c:287
-#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:443
+#: modules/tools/sfunctions.c:531 modules/tools/stats.c:456
+#: modules/volume/volume_extract.c:321 modules/volume/volume_linestat.c:292
+#: modules/xyz/xyz_drift.c:618 modules/xyz/xyz_raster.c:457
 msgid "_Update"
 msgstr "О_бновить"
 
@@ -6022,7 +6199,7 @@ msgstr ""
 "<b>Разбор закончился неудачно</b>\n"
 "Содержимое `%s' не соответствует формату: %s."
 
-#: modules/file/rawfile.c:1690 modules/process/neural.c:1580
+#: modules/file/rawfile.c:1690 modules/process/neural.c:1587
 #, c-format
 msgid "The name `%s' is invalid."
 msgstr "Имя `%s' неверно."
@@ -6124,7 +6301,8 @@ msgstr "Импорт файлов данных XYZ"
 msgid "Import XYZ Data"
 msgstr "Импорт данных XYZ"
 
-#: modules/file/rawxyz.c:279
+#: modules/file/rawxyz.c:279 modules/graph/graph_stats.c:305
+#: modules/graph/graph_stats.c:756 modules/graph/graph_stats.c:800
 msgid "Number of points:"
 msgstr "Число точек:"
 
@@ -6144,7 +6322,7 @@ msgstr "Диапазон Z:"
 msgid "_Lateral units:"
 msgstr "Единицы _размера:"
 
-#: modules/file/rawxyz.c:386 modules/process/dimensions.h:494
+#: modules/file/rawxyz.c:386 modules/process/dimensions.h:479
 msgid "_Value units:"
 msgstr "Единицы измерения _значения:"
 
@@ -6160,18 +6338,14 @@ msgstr "Файлы данных Renishaw WiRE (.wdf)"
 msgid "MapArea block is truncated"
 msgstr "Блок MapArea неполон."
 
-#: modules/file/renishaw.c:787
+#: modules/file/renishaw.c:793
 msgid "Random points order unsupported"
 msgstr "Случайный порядок точек не поддерживается"
 
-#: modules/file/renishaw.c:1396
+#: modules/file/renishaw.c:1405
 msgid "Block header is truncated"
 msgstr "Заголовок блока усечён"
 
-#: modules/file/renishaw.c:1411
-msgid "Data block is truncated"
-msgstr "Блок данных неполон."
-
 #: modules/file/rhk-sm3.c:236
 msgid "Imports RHK Technology SM3 data files."
 msgstr "Импортирует файлы данных RHK Technology SM3."
@@ -6434,19 +6608,23 @@ msgstr ""
 msgid "SPML files (.xml)"
 msgstr "Файлы SPML (.xml)"
 
-#: modules/file/spmlab.c:131
+#: modules/file/spmlab.c:175
 msgid "Imports Thermicroscopes SpmLab R3 to R7 data files."
 msgstr "Импортирует файлы данных Thermicroscopes SpmLab от R3 до R7."
 
-#: modules/file/spmlab.c:144
+#: modules/file/spmlab.c:188
 msgid "Thermicroscopes SpmLab files"
 msgstr "Файлы Thermicroscopes SpmLab"
 
-#: modules/file/spmlab.c:231
+#: modules/file/spmlab.c:259
 #, c-format
 msgid "Unknown format version %c."
 msgstr "Неизвестная версия формата %c."
 
+#: modules/file/spmlab.c:283
+msgid "Data block is truncated."
+msgstr "Блок данных обрезан."
+
 #: modules/file/spmlabf.c:79
 msgid "Imports SPMLab floating-point files."
 msgstr "Импортирует файлы с плавающей точкой SPMLab."
@@ -6643,11 +6821,11 @@ msgstr "Импортирует файлы WinSTM (.stm)."
 msgid "WinSTM files (.stm)"
 msgstr "Файлы WinSTM (.stm)"
 
-#: modules/file/wipfile.c:272
+#: modules/file/wipfile.c:281
 msgid "Imports WItec Project data files."
 msgstr "Импортирует файлы данных WItec Project."
 
-#: modules/file/wipfile.c:285
+#: modules/file/wipfile.c:294
 msgid "WItec Project files (.wip)"
 msgstr "Файлы WItec Project (.wip)"
 
@@ -6708,21 +6886,21 @@ msgstr "Экспортирует данные как простой тексто
 msgid "XYZ text data (.xyz)"
 msgstr "Текстовые данные XYZ (.xyz)"
 
-#: modules/file/xyzexport.c:244
+#: modules/file/xyzexport.c:247
 msgid "Lateral units:"
 msgstr "Единицы горизонтальных размеров:"
 
-#: modules/file/xyzexport.c:290
+#: modules/file/xyzexport.c:293
 msgid "Export XYZ"
 msgstr "Экспорт XYZ"
 
-#: modules/file/xyzexport.c:340 modules/process/curvature.c:704
+#: modules/file/xyzexport.c:343 modules/process/curvature.c:700
 #: modules/process/entropy.c:214 modules/process/facet-level.c:207
-#: modules/process/fit-shape.c:743 modules/process/level.c:259
-#: modules/process/linematch.c:906 modules/process/neural.c:593
-#: modules/process/polylevel.c:491 modules/process/slope_dist.c:418
-#: modules/tools/filter.c:300 modules/tools/linestats.c:436
-#: modules/tools/profile.c:591 modules/tools/sfunctions.c:516
+#: modules/process/fit-shape.c:755 modules/process/level.c:259
+#: modules/process/linematch.c:869 modules/process/neural.c:597
+#: modules/process/polylevel.c:494 modules/process/slope_dist.c:411
+#: modules/tools/filter.c:301 modules/tools/linestats.c:436
+#: modules/tools/profile.c:572 modules/tools/sfunctions.c:513
 #: modules/tools/stats.c:389
 msgid "Masking Mode"
 msgstr "Режим использования маски"
@@ -6735,6 +6913,14 @@ msgstr "Импортирует изображения Carl Zeiss SEM."
 msgid "Carl Zeiss SEM scans (.tif)"
 msgstr "Сканы Carl Zeiss SEM (.tif)"
 
+#: modules/file/zeisslsm.c:383
+msgid "Imports Carl Zeiss CLSM images."
+msgstr "Импортирует конфокальные изображения Carl Zeiss."
+
+#: modules/file/zeisslsm.c:396
+msgid "Carl Zeiss CLSM images (.lsm)"
+msgstr "Конфокальные изображения Carl Zeiss (.lsm)"
+
 #: modules/file/zemax.c:72
 msgid "Imports Zemax grid sag data files."
 msgstr "Импортирует файлы данных искривления сетки из Zemax."
@@ -6757,15 +6943,15 @@ msgstr "Код единиц измерения %d неправилен или н
 msgid "The first line contains too many items."
 msgstr "Первая строка содержит слишком много элементов."
 
-#: modules/graph/graph_align.c:57
+#: modules/graph/graph_align.c:60
 msgid "Aligns graph curves."
 msgstr "Выравнивает кривые графиков"
 
-#: modules/graph/graph_align.c:71
+#: modules/graph/graph_align.c:74
 msgid "/_Align"
 msgstr "/_Подровнять"
 
-#: modules/graph/graph_align.c:74
+#: modules/graph/graph_align.c:77
 msgid "Align curves"
 msgstr "Выровнять кривые"
 
@@ -6781,48 +6967,50 @@ msgstr "/_Габаритный размер..."
 msgid "Fit critical dimension"
 msgstr "Измерить габаритный размер"
 
-#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:267
+#: modules/graph/graph_cd.c:209 modules/graph/graph_fit.c:270
 msgid "Fit Graph"
 msgstr "Аппроксимировать график"
 
-#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:251
-#: modules/graph/graph_fit.c:270 modules/process/fit-shape.c:393
+#: modules/graph/graph_cd.c:212 modules/graph/graph_fdfit.c:254
+#: modules/graph/graph_fit.c:273 modules/process/fit-shape.c:394
 #: modules/volume/volume_fdfit.c:299
 msgid "verb|_Fit"
 msgstr "_Аппрокс."
 
-#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:166
-#: modules/graph/graph_fdfit.c:306 modules/graph/graph_fit.c:325
-#: modules/graph/graph_peaks.c:199
+#: modules/graph/graph_cd.c:262 modules/graph/graph_cut.c:168
+#: modules/graph/graph_fdfit.c:313 modules/graph/graph_fit.c:332
+#: modules/graph/graph_peaks.c:199 modules/graph/graph_stats.c:268
 msgid "_Graph curve:"
 msgstr "График:"
 
-#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:320
-#: modules/graph/graph_fit.c:339 modules/volume/volume_fdfit.c:405
+#: modules/graph/graph_cd.c:276 modules/graph/graph_fdfit.c:327
+#: modules/graph/graph_fit.c:346 modules/volume/volume_fdfit.c:389
 msgid "F_unction:"
 msgstr "_Функция:"
 
-#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:361
-#: modules/graph/graph_fit.c:375 modules/process/curvature.c:745
-#: modules/process/fit-shape.c:792 modules/volume/volume_fdfit.c:446
+#: modules/graph/graph_cd.c:305 modules/graph/graph_fdfit.c:368
+#: modules/graph/graph_fit.c:382 modules/process/curvature.c:742
+#: modules/process/fit-shape.c:804 modules/volume/volume_fdfit.c:422
 msgid "Parameter"
 msgstr "Параметр"
 
-#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:363
-#: modules/graph/graph_fit.c:377 modules/process/fit-shape.c:794
-#: modules/volume/volume_fdfit.c:448
+#: modules/graph/graph_cd.c:307 modules/graph/graph_fdfit.c:370
+#: modules/graph/graph_fit.c:384 modules/process/fit-shape.c:806
+#: modules/volume/volume_fdfit.c:424
 msgid "Error"
 msgstr "Ошибка"
 
-#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:196
-#: modules/graph/graph_fdfit.c:415 modules/graph/graph_fit.c:433
-#: modules/volume/volume_fdfit.c:500 modules/volume/volume_linestat.c:389
+#: modules/graph/graph_cd.c:319 modules/graph/graph_cut.c:189
+#: modules/graph/graph_fdfit.c:422 modules/graph/graph_fit.c:440
+#: modules/graph/graph_stats.c:279 modules/graph/graph_stats.c:793
+#: modules/volume/volume_fdfit.c:476 modules/volume/volume_linestat.c:394
 msgid "Range:"
 msgstr "Диапазон:"
 
-#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:207
-#: modules/graph/graph_fdfit.c:426 modules/graph/graph_fit.c:444
-#: modules/volume/volume_fdfit.c:511 modules/volume/volume_linestat.c:400
+#: modules/graph/graph_cd.c:330 modules/graph/graph_cut.c:200
+#: modules/graph/graph_fdfit.c:433 modules/graph/graph_fit.c:451
+#: modules/graph/graph_stats.c:290 modules/graph/graph_stats.c:796
+#: modules/volume/volume_fdfit.c:487 modules/volume/volume_linestat.c:405
 msgid "range|to"
 msgstr "–"
 
@@ -6830,94 +7018,94 @@ msgstr "–"
 msgid "_Draw whole circle"
 msgstr "_Рисовать полный круг"
 
-#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:491
-#: modules/graph/graph_fit.c:531 modules/process/fit-shape.c:522
-#: modules/volume/volume_fdfit.c:573
+#: modules/graph/graph_cd.c:382 modules/graph/graph_fdfit.c:498
+#: modules/graph/graph_fit.c:538 modules/process/fit-shape.c:523
+#: modules/volume/volume_fdfit.c:549
 msgid "Save Fit Report"
 msgstr "Сохранить отчёт аппроксимации"
 
 #: modules/graph/graph_cd.c:529 modules/graph/graph_cd.c:1107
-#: modules/graph/graph_fdfit.c:709 modules/graph/graph_fit.c:763
-#: modules/volume/volume_fdfit.c:907
+#: modules/graph/graph_fdfit.c:725 modules/graph/graph_fit.c:779
+#: modules/volume/volume_fdfit.c:883
 msgid "Fit"
 msgstr "Аппроксимация"
 
-#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:749
-#: modules/graph/graph_fit.c:803 modules/volume/volume_fdfit.c:978
-#: modules/volume/volume_fdfit.c:1085
+#: modules/graph/graph_cd.c:555 modules/graph/graph_fdfit.c:765
+#: modules/graph/graph_fit.c:819 modules/volume/volume_fdfit.c:954
+#: modules/volume/volume_fdfit.c:1061
 msgid "It is necessary to select more data points than free fit parameters"
 msgstr ""
 "Необходимо выбрать больше точек данных, чем возможных параметров "
 "аппроксимации"
 
-#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:798
-#: modules/graph/graph_fit.c:852 modules/process/entropy.c:554
-#: modules/tools/grainmeasure.c:217 modules/tools/readvalue.c:634
-#: modules/tools/readvalue.c:635 modules/tools/readvalue.c:636
-#: modules/tools/readvalue.c:637 modules/tools/roughness.c:975
-#: modules/tools/stats.c:727 modules/tools/stats.c:740
-#: modules/tools/stats.c:741 modules/volume/volume_fdfit.c:1134
-#: modules/xyz/xyz_drift.c:1099 modules/xyz/xyz_drift.c:1117
-#: modules/xyz/xyz_drift.c:1134
+#: modules/graph/graph_cd.c:710 modules/graph/graph_fdfit.c:814
+#: modules/graph/graph_fit.c:868 modules/graph/graph_stats.c:663
+#: modules/process/entropy.c:555 modules/tools/grainmeasure.c:217
+#: modules/tools/readvalue.c:634 modules/tools/readvalue.c:635
+#: modules/tools/readvalue.c:636 modules/tools/readvalue.c:637
+#: modules/tools/roughness.c:984 modules/tools/stats.c:723
+#: modules/tools/stats.c:736 modules/tools/stats.c:737
+#: modules/volume/volume_fdfit.c:1110 modules/xyz/xyz_drift.c:1099
+#: modules/xyz/xyz_drift.c:1117 modules/xyz/xyz_drift.c:1134
 msgid "N.A."
 msgstr "недоступно"
 
-#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1363
-#: modules/graph/graph_fit.c:1500 modules/process/fit-shape.c:2078
-#: modules/volume/volume_fdfit.c:1720
+#: modules/graph/graph_cd.c:993 modules/graph/graph_fdfit.c:1381
+#: modules/graph/graph_fit.c:1518 modules/process/fit-shape.c:2060
+#: modules/volume/volume_fdfit.c:1696
 msgid "===== Fit Results ====="
 msgstr "===== Результаты аппроксимации ====="
 
-#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1367
-#: modules/graph/graph_fit.c:1504 modules/process/fit-shape.c:2080
-#: modules/volume/volume_fdfit.c:1724
+#: modules/graph/graph_cd.c:997 modules/graph/graph_fdfit.c:1385
+#: modules/graph/graph_fit.c:1522 modules/process/fit-shape.c:2062
+#: modules/volume/volume_fdfit.c:1700
 #, c-format
 msgid "Data:             %s\n"
 msgstr "Данные:            %s\n"
 
-#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1370
-#: modules/graph/graph_fit.c:1507 modules/process/fit-shape.c:2082
-#: modules/volume/volume_fdfit.c:1727
+#: modules/graph/graph_cd.c:1000 modules/graph/graph_fdfit.c:1388
+#: modules/graph/graph_fit.c:1525 modules/process/fit-shape.c:2064
+#: modules/volume/volume_fdfit.c:1703
 #, c-format
 msgid "Number of points: %d of %d\n"
 msgstr "Число точек: %d из %d\n"
 
-#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1374
-#: modules/graph/graph_fit.c:1511 modules/volume/volume_fdfit.c:1731
+#: modules/graph/graph_cd.c:1004 modules/graph/graph_fdfit.c:1392
+#: modules/graph/graph_fit.c:1529 modules/volume/volume_fdfit.c:1707
 #, c-format
 msgid "X range:          %.*f to %.*f %s\n"
 msgstr "Диапазон X:          от %.*f до %.*f %s\n"
 
-#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1380
-#: modules/graph/graph_fit.c:1517 modules/process/fit-shape.c:2084
-#: modules/volume/volume_fdfit.c:1737
+#: modules/graph/graph_cd.c:1010 modules/graph/graph_fdfit.c:1398
+#: modules/graph/graph_fit.c:1535 modules/process/fit-shape.c:2066
+#: modules/volume/volume_fdfit.c:1713
 #, c-format
 msgid "Fitted function:  %s\n"
 msgstr "Аппроксимирующая функция:  %s\n"
 
-#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1383
-#: modules/graph/graph_fit.c:1520 modules/process/fit-shape.c:2087
-#: modules/volume/volume_fdfit.c:1740
+#: modules/graph/graph_cd.c:1013 modules/graph/graph_fdfit.c:1401
+#: modules/graph/graph_fit.c:1538 modules/process/fit-shape.c:2069
+#: modules/volume/volume_fdfit.c:1716
 msgid "Results\n"
 msgstr "Результаты\n"
 
-#: modules/graph/graph_cut.c:88
+#: modules/graph/graph_cut.c:87
 msgid "Cut graph"
 msgstr "Обрезает график"
 
-#: modules/graph/graph_cut.c:102
+#: modules/graph/graph_cut.c:101
 msgid "/_Cut..."
 msgstr "/_Обрезать..."
 
-#: modules/graph/graph_cut.c:105
+#: modules/graph/graph_cut.c:104
 msgid "Extract part of graph into new one"
 msgstr "Извлечь часть старого графика в новый"
 
-#: modules/graph/graph_cut.c:146
+#: modules/graph/graph_cut.c:145
 msgid "Cut Graph"
 msgstr "Обрезать график"
 
-#: modules/graph/graph_cut.c:180
+#: modules/graph/graph_cut.c:173
 msgid "Cut _all curves"
 msgstr "Обрезать _все кривые"
 
@@ -7015,97 +7203,97 @@ msgstr "Экспортировать график в растровое изоб
 msgid "Export to PNG"
 msgstr "Экспортировать в PNG"
 
-#: modules/graph/graph_export_vector.c:35
+#: modules/graph/graph_export_vector.c:36
 msgid "Exports graphs to PostScript"
 msgstr "Экспортирует графики в PostScript"
 
-#: modules/graph/graph_export_vector.c:49
+#: modules/graph/graph_export_vector.c:50
 msgid "/Export _PostScript"
 msgstr "/Экспортировать _PostScript"
 
-#: modules/graph/graph_export_vector.c:52
+#: modules/graph/graph_export_vector.c:53
 msgid "Export graph to PostScript"
 msgstr "Экспортировать график в PostScript"
 
-#: modules/graph/graph_export_vector.c:65
+#: modules/graph/graph_export_vector.c:66
 msgid "Export to PostScript"
 msgstr "Экспортировать в PostScript"
 
-#: modules/graph/graph_fdfit.c:168
+#: modules/graph/graph_fdfit.c:169
 msgid "Fit force-distance data"
 msgstr "Аппроксимирует данные сила-расстояние"
 
-#: modules/graph/graph_fdfit.c:182
+#: modules/graph/graph_fdfit.c:183
 msgid "/_Fit FD Curve..."
 msgstr "/Аппроксимировать _кривую сила-расстояние..."
 
-#: modules/graph/graph_fdfit.c:185
+#: modules/graph/graph_fdfit.c:186
 msgid "Fit a force-distance curve"
 msgstr "Аппроксимировать кривую сила-расстояние"
 
-#: modules/graph/graph_fdfit.c:248 modules/volume/volume_fdfit.c:296
+#: modules/graph/graph_fdfit.c:251 modules/volume/volume_fdfit.c:296
 msgid "Fit FD Curve"
 msgstr "Аппроксимировать кривую сила-расстояние"
 
-#: modules/graph/graph_fdfit.c:255 modules/graph/graph_fit.c:274
-#: modules/process/fit-shape.c:397 modules/process/measure_lattice.c:257
-#: modules/volume/volume_fdfit.c:303
+#: modules/graph/graph_fdfit.c:258 modules/graph/graph_fit.c:277
+#: modules/process/correct_affine.c:347 modules/process/fit-shape.c:398
+#: modules/process/measure_lattice.c:247 modules/volume/volume_fdfit.c:303
 msgid "verb|_Estimate"
 msgstr "О_ценить"
 
-#: modules/graph/graph_fdfit.c:257 modules/graph/graph_fit.c:276
-#: modules/volume/volume_fdfit.c:305
+#: modules/graph/graph_fdfit.c:260 modules/graph/graph_fit.c:279
+#: modules/process/psf.c:239 modules/volume/volume_fdfit.c:305
 msgid "_Plot Inits"
 msgstr "_Исходный"
 
-#: modules/graph/graph_fdfit.c:359 modules/graph/graph_fit.c:373
-#: modules/process/fit-shape.c:790 modules/volume/volume_fdfit.c:444
+#: modules/graph/graph_fdfit.c:366 modules/graph/graph_fit.c:380
+#: modules/process/fit-shape.c:802 modules/volume/volume_fdfit.c:420
 msgid "Fix"
-msgstr "Править"
+msgstr "Фиксировать"
 
-#: modules/graph/graph_fdfit.c:365 modules/graph/graph_fit.c:379
-#: modules/volume/volume_fdfit.c:450
+#: modules/graph/graph_fdfit.c:372 modules/graph/graph_fit.c:386
+#: modules/volume/volume_fdfit.c:426
 msgid "Initial"
 msgstr "Исходное"
 
-#: modules/graph/graph_fdfit.c:376 modules/graph/graph_fit.c:394
-#: modules/volume/volume_fdfit.c:461
+#: modules/graph/graph_fdfit.c:383 modules/graph/graph_fit.c:401
+#: modules/volume/volume_fdfit.c:437
 msgid "χ<sup>2</sup> result:"
 msgstr "Результирующее χ<sup>2</sup>:"
 
-#: modules/graph/graph_fdfit.c:392 modules/graph/graph_fit.c:410
-#: modules/process/fit-shape.c:469 modules/process/fit-shape.c:2134
-#: modules/volume/volume_fdfit.c:477
+#: modules/graph/graph_fdfit.c:399 modules/graph/graph_fit.c:417
+#: modules/process/fit-shape.c:470 modules/process/fit-shape.c:2116
+#: modules/volume/volume_fdfit.c:453
 msgid "Correlation Matrix"
 msgstr "Матрица корреляции"
 
-#: modules/graph/graph_fdfit.c:447 modules/graph/graph_fit.c:485
-#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:532
+#: modules/graph/graph_fdfit.c:454 modules/graph/graph_fit.c:492
+#: modules/process/wpour_mark.c:410 modules/volume/volume_fdfit.c:508
 msgid "Instant:"
 msgstr "Сразу:"
 
-#: modules/graph/graph_fdfit.c:450 modules/graph/graph_fit.c:488
+#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
 msgid "esti_mate"
 msgstr "о_ценить"
 
-#: modules/graph/graph_fdfit.c:457 modules/graph/graph_fit.c:495
-#: modules/volume/volume_fdfit.c:542
+#: modules/graph/graph_fdfit.c:464 modules/graph/graph_fit.c:502
+#: modules/volume/volume_fdfit.c:518
 msgid "p_lot"
 msgstr "ст_роить"
 
-#: modules/graph/graph_fdfit.c:708 modules/graph/graph_fit.c:762
-#: modules/volume/volume_fdfit.c:906
+#: modules/graph/graph_fdfit.c:724 modules/graph/graph_fit.c:778
+#: modules/volume/volume_fdfit.c:882
 msgid "Estimate"
 msgstr "Оценка"
 
-#: modules/graph/graph_fdfit.c:1410 modules/graph/graph_fit.c:1547
-#: modules/volume/volume_fdfit.c:1768
+#: modules/graph/graph_fdfit.c:1428 modules/graph/graph_fit.c:1565
+#: modules/volume/volume_fdfit.c:1744
 #, c-format
 msgid "Residual sum:   %g\n"
 msgstr "Остаточная сумма:   %g\n"
 
-#: modules/graph/graph_fdfit.c:1413 modules/graph/graph_fit.c:1550
-#: modules/volume/volume_fdfit.c:1771
+#: modules/graph/graph_fdfit.c:1431 modules/graph/graph_fit.c:1568
+#: modules/volume/volume_fdfit.c:1747
 msgid "Correlation matrix\n"
 msgstr "Матрица корреляции\n"
 
@@ -7121,27 +7309,27 @@ msgstr "/_Фильтр"
 msgid "Remove noise from graph curves"
 msgstr "Удалить шум с графиков кривых "
 
-#: modules/graph/graph_fit.c:181
+#: modules/graph/graph_fit.c:182
 msgid "Fit graph with function"
 msgstr "Аппроксимирует график функцией"
 
-#: modules/graph/graph_fit.c:195
+#: modules/graph/graph_fit.c:196
 msgid "/_Fit Function..."
 msgstr "/_Аппроксимировать функцией..."
 
-#: modules/graph/graph_fit.c:198
+#: modules/graph/graph_fit.c:199
 msgid "Fit a function on graph data"
 msgstr "Аппроксимировать данные графика функцией"
 
-#: modules/graph/graph_fit.c:386
+#: modules/graph/graph_fit.c:393
 msgid "Copy all fitted values to estimates"
 msgstr "Копировать все аппроксимирующие значения в оценки"
 
-#: modules/graph/graph_fit.c:460
+#: modules/graph/graph_fit.c:467
 msgid "Plot full range"
 msgstr "Строить весь диапазон"
 
-#: modules/graph/graph_fit.c:470
+#: modules/graph/graph_fit.c:477
 msgid "Create a difference graph"
 msgstr "Создать график разности"
 
@@ -7225,52 +7413,135 @@ msgstr "/Найти _пики..."
 msgid "Find graph curve peaks"
 msgstr "Найти пики графиков кривых"
 
-#: modules/graph/graph_peaks.c:157
+#: modules/graph/graph_peaks.c:155
 msgid "Prominence"
 msgstr "Выдающесть"
 
-#: modules/graph/graph_peaks.c:161
+#: modules/graph/graph_peaks.c:159
 msgid "Zero"
 msgstr "Нуль"
 
-#: modules/graph/graph_peaks.c:162
+#: modules/graph/graph_peaks.c:160
 msgid "Bilateral minimum"
 msgstr "Двусторонний минимум"
 
-#: modules/graph/graph_peaks.c:178
+#: modules/graph/graph_peaks.c:176
 msgid "Graph Peaks"
 msgstr "Пики графика"
 
-#: modules/graph/graph_peaks.c:212
+#: modules/graph/graph_peaks.c:209
 msgid "_Background type:"
 msgstr "Тип _фона:"
 
-#: modules/graph/graph_peaks.c:227
+#: modules/graph/graph_peaks.c:219
 msgid "Order peaks _by:"
 msgstr "Упорядочить пики _по:"
 
-#: modules/graph/graph_peaks.c:242
+#: modules/graph/graph_peaks.c:225
 msgid "Number of _peaks:"
 msgstr "_Количество пиков:"
 
-#: modules/graph/graph_peaks.c:263 modules/process/curvature.c:773
-#: modules/process/grain_stat.c:360 modules/process/measure_lattice.c:396
-#: modules/process/polylevel.c:607 modules/tools/distance.c:259
-#: modules/tools/roughness.c:818 modules/tools/stats.c:450
+#: modules/graph/graph_peaks.c:245 modules/graph/graph_stats.c:367
+#: modules/process/curvature.c:770 modules/process/grain_stat.c:360
+#: modules/process/measure_lattice.c:390 modules/process/polylevel.c:610
+#: modules/tools/distance.c:259 modules/tools/roughness.c:819
+#: modules/tools/stats.c:447
 msgid "Save table to a file"
 msgstr "Сохранить таблицу в файл"
 
-#: modules/graph/graph_peaks.c:267 modules/process/curvature.c:778
-#: modules/process/grain_stat.c:365 modules/process/measure_lattice.c:400
-#: modules/process/polylevel.c:617 modules/tools/distance.c:264
-#: modules/tools/roughness.c:823 modules/tools/stats.c:455
+#: modules/graph/graph_peaks.c:249 modules/graph/graph_stats.c:371
+#: modules/process/curvature.c:775 modules/process/grain_stat.c:365
+#: modules/process/measure_lattice.c:394 modules/process/polylevel.c:620
+#: modules/tools/distance.c:264 modules/tools/roughness.c:824
+#: modules/tools/stats.c:452
 msgid "Copy table to clipboard"
 msgstr "Скопировать таблицу в буфер обмена"
 
-#: modules/graph/graph_peaks.c:654
+#: modules/graph/graph_peaks.c:618
 msgid "Save Peak Parameters"
 msgstr "Сохранить параметры пиков"
 
+#: modules/graph/graph_stats.c:148 modules/graph/graph_stats.c:161
+#: modules/tools/stats.c:205
+msgid "Average value:"
+msgstr "Среднее значение:"
+
+#: modules/graph/graph_stats.c:149 modules/tools/stats.c:206
+msgid "Median:"
+msgstr "Срединное значение:"
+
+#: modules/graph/graph_stats.c:150
+msgid "Ra:"
+msgstr "Ra:"
+
+#: modules/graph/graph_stats.c:151
+msgid "Rms (Rq):"
+msgstr "Rms (Rq):"
+
+#: modules/graph/graph_stats.c:152 modules/tools/stats.c:210
+msgid "Skew:"
+msgstr "Асимметрия:"
+
+#: modules/graph/graph_stats.c:153 modules/tools/stats.c:211
+msgid "Kurtosis:"
+msgstr "Эксцесс:"
+
+#: modules/graph/graph_stats.c:158
+msgid "Projected length:"
+msgstr "Длина проекции:"
+
+#: modules/graph/graph_stats.c:159
+msgid "Developed length:"
+msgstr "Длина полного профиля:"
+
+#: modules/graph/graph_stats.c:160 modules/tools/stats.c:214
+msgid "Variation:"
+msgstr "Вариация:"
+
+#: modules/graph/graph_stats.c:162
+msgid "Area under curve:"
+msgstr "Площадь под кривой:"
+
+#: modules/graph/graph_stats.c:163
+msgid "Positive area:"
+msgstr "Положительная площадь:"
+
+#: modules/graph/graph_stats.c:164
+msgid "Negative area:"
+msgstr "Отрицательная площадь:"
+
+#: modules/graph/graph_stats.c:165
+msgid "Root mean square:"
+msgstr "Среднеквадратичное:"
+
+#: modules/graph/graph_stats.c:171
+msgid "Calculates simple graph curve statistics."
+msgstr "Рассчитывает простую статистику для кривых графиков"
+
+#: modules/graph/graph_stats.c:185
+msgid "/_Statistics..."
+msgstr "/Статистика..."
+
+#: modules/graph/graph_stats.c:188
+msgid "Calculate graph curve statistics"
+msgstr "Рассчитать статистику для кривых графиков"
+
+#: modules/graph/graph_stats.c:241
+msgid "Graph Statistics"
+msgstr "Статистика графика"
+
+#: modules/graph/graph_stats.c:320 modules/graph/graph_stats.c:807
+msgid "Simple Parameters"
+msgstr "Простые параметры"
+
+#: modules/graph/graph_stats.c:342 modules/graph/graph_stats.c:826
+msgid "Integrals"
+msgstr "Интегралы"
+
+#: modules/graph/graph_stats.c:686
+msgid "Save Curve Statistics"
+msgstr "Сохранить статистику кривой"
+
 #: modules/layer/axis.c:143
 msgid "Layer allowing selection of horizontal or vertical lines."
 msgstr "Слой, позволяющий выбирать горизонтальные или вертикальные линии."
@@ -7410,25 +7681,25 @@ msgstr "Распределение углов"
 msgid "Angle Distribution"
 msgstr "Распределение углов"
 
-#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:373
+#: modules/process/angle_dist.c:188 modules/process/slope_dist.c:365
 msgid "Output _size:"
 msgstr "_Размер результата:"
 
-#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:206
+#: modules/process/angle_dist.c:193 modules/process/grain_wshed.c:207
 msgid "_Number of steps:"
 msgstr "_Число шагов:"
 
-#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:380
+#: modules/process/angle_dist.c:198 modules/process/slope_dist.c:372
 msgid "_Logarithmic value scale"
 msgstr "_Логарифмическая шкала"
 
 #: modules/process/angle_dist.c:204 modules/process/entropy.c:231
-#: modules/process/slope_dist.c:390
+#: modules/process/slope_dist.c:382
 msgid "Use local plane _fitting"
 msgstr "Использовать _аппроксимацию локальной плоскостью"
 
 #: modules/process/angle_dist.c:213 modules/process/entropy.c:242
-#: modules/process/slope_dist.c:401
+#: modules/process/slope_dist.c:393
 msgid "_Plane size:"
 msgstr "Размер _плоскости:"
 
@@ -7444,7 +7715,8 @@ msgstr "/М_ножественные данные/_Арифметика..."
 msgid "Arithmetic operations on data"
 msgstr "Арифметические операции над данными"
 
-#: modules/process/arithmetic.c:202 modules/process/superresolution.c:349
+#: modules/process/arithmetic.c:202 modules/process/stitch.c:234
+#: modules/process/superresolution.c:348
 msgid "Calculated"
 msgstr "Посчитанное"
 
@@ -7460,7 +7732,7 @@ msgstr "_Выражение:"
 msgid "Operands"
 msgstr "Операнды"
 
-#: modules/process/arithmetic.c:300 modules/process/dimensions.h:483
+#: modules/process/arithmetic.c:300 modules/process/dimensions.h:465
 msgid "Units"
 msgstr "Единицы измерения"
 
@@ -7481,15 +7753,15 @@ msgstr "Непосредственно указать единицы измер
 msgid "Expression contains unknown identifiers"
 msgstr "Выражение содержит неизвестные идентификаторы"
 
-#: modules/process/arithmetic.c:569 modules/process/superresolution.c:300
+#: modules/process/arithmetic.c:569 modules/process/superresolution.c:299
 msgid "Pixel dimensions differ"
 msgstr "Размеры в пикселях отличаются"
 
-#: modules/process/arithmetic.c:571 modules/process/superresolution.c:302
+#: modules/process/arithmetic.c:571 modules/process/superresolution.c:301
 msgid "Lateral dimensions are different physical quantities"
 msgstr "Горизонтальные размеры являются разными физическими величинами"
 
-#: modules/process/arithmetic.c:574 modules/process/superresolution.c:305
+#: modules/process/arithmetic.c:574 modules/process/superresolution.c:304
 msgid "Physical dimensions differ"
 msgstr "Физические размеры отличаются"
 
@@ -7596,8 +7868,8 @@ msgid "Generates surfaces by ballistic deposition."
 msgstr "Создаёт поверхность с помощью баллистического осаждения."
 
 #: modules/process/bdep_synth.c:164
-msgid "/S_ynthetic/_Ballistic..."
-msgstr "/Син_тез/_Баллистический..."
+msgid "/S_ynthetic/_Deposition/_Ballistic..."
+msgstr "/Син_тез/_Осаждение/_Балистическое..."
 
 #: modules/process/bdep_synth.c:168
 msgid "Generate surface by ballistic deposition"
@@ -7605,20 +7877,23 @@ msgstr "Создать поверхность используя баллист
 
 #: modules/process/bdep_synth.c:239 modules/process/bdep_synth.c:596
 #: modules/process/calcoefs_simple.c:636 modules/process/col_synth.c:282
-#: modules/process/col_synth.c:733 modules/process/crosscor.c:819
-#: modules/process/crosscor.c:882 modules/process/deposit_synth.c:268
-#: modules/process/deposit_synth.c:859 modules/process/diff_synth.c:304
-#: modules/process/diff_synth.c:705 modules/process/domain_synth.c:255
-#: modules/process/domain_synth.c:745 modules/process/grain_wshed.c:429
+#: modules/process/col_synth.c:734 modules/process/crosscor.c:792
+#: modules/process/crosscor.c:855 modules/process/deposit_synth.c:268
+#: modules/process/deposit_synth.c:858 modules/process/diff_synth.c:304
+#: modules/process/diff_synth.c:704 modules/process/domain_synth.c:255
+#: modules/process/domain_synth.c:745 modules/process/fibre_synth.c:357
+#: modules/process/fibre_synth.c:872 modules/process/grain_wshed.c:433
 #: modules/process/lat_synth.c:491 modules/process/mark_disconn.c:148
-#: modules/process/mark_disconn.c:373 modules/process/maskcor.c:330
-#: modules/process/mcrop.c:315 modules/process/merge.c:1072
-#: modules/process/nanoindent_adjust.c:323 modules/process/neural.c:1272
-#: modules/process/pid.c:338 modules/process/superresolution.c:416
-#: modules/process/superresolution.c:505 modules/process/tip_blind.c:781
-#: modules/process/tipops.c:320 modules/process/xydenoise.c:213
-#: modules/volume/volume_kmeans.c:403 modules/volume/volume_kmedians.c:365
-#: modules/xyz/xyz_raster.c:1028 modules/xyz/xyz_raster.c:1044
+#: modules/process/mark_disconn.c:361 modules/process/maskcor.c:334
+#: modules/process/mcrop.c:314 modules/process/merge.c:1072
+#: modules/process/nanoindent_adjust.c:324 modules/process/neural.c:1279
+#: modules/process/pid.c:339 modules/process/sphere-revolve.c:269
+#: modules/process/superresolution.c:415 modules/process/superresolution.c:504
+#: modules/process/tip_blind.c:778 modules/process/tipops.c:320
+#: modules/process/wave_synth.c:305 modules/process/wave_synth.c:747
+#: modules/process/xydenoise.c:214 modules/volume/volume_kmeans.c:397
+#: modules/volume/volume_kmedians.c:363 modules/xyz/xyz_raster.c:997
+#: modules/xyz/xyz_raster.c:1013
 msgid "Initializing..."
 msgstr "Инициализация..."
 
@@ -7627,10 +7902,11 @@ msgstr "Инициализация..."
 #: modules/process/deposit_synth.c:531 modules/process/deposit_synth.c:544
 #: modules/process/diff_synth.c:342 modules/process/domain_synth.c:319
 #: modules/process/domain_synth.c:327 modules/process/fbm_synth.c:278
-#: modules/process/fft_synth.c:314 modules/process/lat_synth.c:529
-#: modules/process/lno_synth.c:407 modules/process/noise_synth.c:311
-#: modules/process/obj_synth.c:407 modules/process/pat_synth.c:357
-#: modules/process/wave_synth.c:323
+#: modules/process/fft_synth.c:314 modules/process/fibre_synth.c:394
+#: modules/process/lat_synth.c:529 modules/process/lno_synth.c:405
+#: modules/process/noise_synth.c:309 modules/process/obj_synth.c:404
+#: modules/process/pat_synth.c:357 modules/process/phase_synth.c:518
+#: modules/process/wave_synth.c:342
 msgid "Generated"
 msgstr "Сгенерированное"
 
@@ -7649,50 +7925,56 @@ msgid "Progressive preview"
 msgstr "Прогрессивное обновление"
 
 #: modules/process/bdep_synth.c:407 modules/process/col_synth.c:458
-#: modules/process/deposit_synth.c:412 modules/process/diff_synth.c:477
+#: modules/process/deposit_synth.c:413 modules/process/diff_synth.c:477
 #: modules/process/domain_synth.c:430 modules/process/fbm_synth.c:360
-#: modules/process/fft_synth.c:398 modules/process/lat_synth.c:626
-#: modules/process/lno_synth.c:490 modules/process/noise_synth.c:394
-#: modules/process/obj_synth.c:498 modules/process/pat_synth.c:442
-#: modules/process/wave_synth.c:407
+#: modules/process/fft_synth.c:398 modules/process/fibre_synth.c:479
+#: modules/process/lat_synth.c:626 modules/process/lno_synth.c:488
+#: modules/process/mfm_current.c:383 modules/process/mfm_parallel.c:384
+#: modules/process/noise_synth.c:392 modules/process/obj_synth.c:495
+#: modules/process/pat_synth.c:442 modules/process/phase_synth.c:263
+#: modules/process/wave_synth.c:426
 msgid "Dimensions"
 msgstr "Размеры"
 
 #: modules/process/bdep_synth.c:416 modules/process/col_synth.c:467
-#: modules/process/deposit_synth.c:422 modules/process/diff_synth.c:486
+#: modules/process/deposit_synth.c:425 modules/process/diff_synth.c:486
 #: modules/process/domain_synth.c:438 modules/process/fbm_synth.c:371
-#: modules/process/fft_synth.c:409 modules/process/lno_synth.c:501
-#: modules/process/noise_synth.c:405 modules/process/obj_synth.c:509
-#: modules/process/pat_synth.c:454 modules/process/wave_synth.c:418
+#: modules/process/fft_synth.c:409 modules/process/fibre_synth.c:490
+#: modules/process/lno_synth.c:499 modules/process/mfm_current.c:412
+#: modules/process/mfm_parallel.c:411 modules/process/noise_synth.c:403
+#: modules/process/obj_synth.c:506 modules/process/pat_synth.c:454
+#: modules/process/phase_synth.c:274 modules/process/wave_synth.c:437
 msgid "Generator"
 msgstr "Генератор"
 
 #: modules/process/bdep_synth.c:422 modules/process/col_synth.c:473
-#: modules/process/diff_synth.c:492 modules/process/lno_synth.c:1041
-#: modules/process/obj_synth.c:520
+#: modules/process/deposit_synth.c:455 modules/process/diff_synth.c:492
+#: modules/process/fibre_synth.c:502 modules/process/lno_synth.c:1041
+#: modules/process/obj_synth.c:518
 msgid "Co_verage:"
 msgstr "По_крытие:"
 
 #: modules/process/bdep_synth.c:434 modules/process/diff_synth.c:512
-#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:412
-#: modules/process/fft_synth.c:418 modules/process/lat_synth.c:758
-#: modules/process/lno_synth.c:537 modules/process/noise_synth.c:437
-#: modules/process/obj_synth.c:579 modules/process/wave_synth.c:453
-msgid "_Like Current Channel"
-msgstr "Как _у текущего канала"
-
-#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:541
-#: modules/process/diff_synth.c:562
+#: modules/process/domain_synth.c:514 modules/process/fbm_synth.c:411
+#: modules/process/fft_synth.c:418 modules/process/fibre_synth.c:544
+#: modules/process/lat_synth.c:758 modules/process/lno_synth.c:535
+#: modules/process/noise_synth.c:435 modules/process/obj_synth.c:577
+#: modules/process/phase_synth.c:302 modules/process/wave_synth.c:472
+msgid "_Like Current Image"
+msgstr "_Как у текущего изображения"
+
+#: modules/process/bdep_synth.c:453 modules/process/col_synth.c:542
+#: modules/process/diff_synth.c:561
 msgid "Evolution"
 msgstr "Эволюция"
 
-#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:544
-#: modules/process/diff_synth.c:565
+#: modules/process/bdep_synth.c:456 modules/process/col_synth.c:545
+#: modules/process/diff_synth.c:564
 msgid "Plot graphs:"
 msgstr "Строить графики:"
 
-#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:840
-#: modules/process/diff_synth.c:782
+#: modules/process/bdep_synth.c:654 modules/process/col_synth.c:841
+#: modules/process/diff_synth.c:781
 msgid "Depositing particles..."
 msgstr "Осаждаются частицы..."
 
@@ -7727,8 +8009,8 @@ msgstr "Загрузить данные калибровки"
 msgid "Calibration name:"
 msgstr "Имя калибровки:"
 
-#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:433
-#: modules/volume/volume_extract.c:514
+#: modules/process/calcoefs_load.c:254 modules/volume/volume_extract.c:421
+#: modules/volume/volume_extract.c:501
 msgid "No data loaded"
 msgstr "Данные не загружены"
 
@@ -7752,7 +8034,7 @@ msgstr "Добавить"
 msgid "Load calibration data"
 msgstr "Загрузить данные калибровки"
 
-#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1073
+#: modules/process/calcoefs_load.c:364 modules/volume/volume_extract.c:1059
 #, c-format
 msgid "Error loading file '%s'"
 msgstr "Ошибка загрузки файла '%s'"
@@ -7846,7 +8128,7 @@ msgstr "Простое картирование ошибок"
 msgid "Simple Error Map"
 msgstr "Простая карта ошибок"
 
-#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:146
+#: modules/process/calcoefs_simple.c:343 modules/process/calcoefs_stage.c:142
 #: modules/process/superresolution.c:156
 msgid "Operands:"
 msgstr "Операнды:"
@@ -7860,14 +8142,14 @@ msgid "Detail"
 msgstr "Часть"
 
 #: modules/process/calcoefs_simple.c:371 modules/process/calcoefs_view.c:491
-#: modules/process/calibrate.c:496 modules/process/crosscor.c:289
-#: modules/volume/volume_calibrate.c:478
+#: modules/process/calibrate.c:481 modules/process/crosscor.c:276
+#: modules/volume/volume_calibrate.c:460
 msgid "_X offset:"
 msgstr "Смещение по _X:"
 
 #: modules/process/calcoefs_simple.c:398 modules/process/calcoefs_view.c:517
-#: modules/process/calibrate.c:509 modules/process/crosscor.c:300
-#: modules/volume/volume_calibrate.c:491
+#: modules/process/calibrate.c:488 modules/process/crosscor.c:284
+#: modules/volume/volume_calibrate.c:467
 msgid "_Y offset:"
 msgstr "Смещение по _Y:"
 
@@ -7880,7 +8162,7 @@ msgid "Y p_eriod:"
 msgstr "Пе_риод Y:"
 
 #: modules/process/calcoefs_simple.c:438 modules/process/calcoefs_view.c:529
-#: modules/volume/volume_calibrate.c:505
+#: modules/volume/volume_calibrate.c:474
 msgid "_Z offset:"
 msgstr "Смещение по _Z:"
 
@@ -7912,25 +8194,25 @@ msgstr[2] "найдено %d объектов"
 msgid "Search canceled"
 msgstr "Поиск отменён"
 
-#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:862
-#: modules/process/maskcor.c:332 modules/process/mcrop.c:317
+#: modules/process/calcoefs_simple.c:638 modules/process/crosscor.c:835
+#: modules/process/maskcor.c:336 modules/process/mcrop.c:316
 #: modules/process/merge.c:1074
 msgid "Correlating..."
 msgstr "Поиск корреляции..."
 
-#: modules/process/calcoefs_stage.c:76
+#: modules/process/calcoefs_stage.c:72
 msgid "Digital AFM data recalibration"
 msgstr "Перекалибровка данных цифровой АСМ"
 
-#: modules/process/calcoefs_stage.c:90
+#: modules/process/calcoefs_stage.c:86
 msgid "/Cali_bration/_3D Calibration/_Get From Stage map..."
 msgstr "/_Калибровка/_Трёхмерная/_Получить из карты сканера..."
 
-#: modules/process/calcoefs_stage.c:94
+#: modules/process/calcoefs_stage.c:90
 msgid "Stage error mapping"
 msgstr "Картирование ошибок основания"
 
-#: modules/process/calcoefs_stage.c:131
+#: modules/process/calcoefs_stage.c:127
 msgid "Stage Error Map"
 msgstr "Карта ошибок основания"
 
@@ -7986,14 +8268,16 @@ msgstr "Положение по Z:"
 msgid "Crop to actual data"
 msgstr "Обрезать до действительных данных"
 
-#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:369
-#: modules/process/deposit_synth.c:641 modules/process/edge.c:705
-#: modules/process/fft_filter_1d.c:299 modules/process/grain_edge.c:290
-#: modules/process/grain_filter.c:347 modules/process/grain_mark.c:372
-#: modules/process/mark_with.c:318 modules/process/polydistort.c:316
-#: modules/process/scars.c:386 modules/process/slope_dist.c:407
-#: modules/process/synth.h:513 modules/volume/volume_extract.c:424
-#: modules/volume/volume_extract.c:505 modules/volume/volume_linestat.c:422
+#: modules/process/calcoefs_view.c:567 modules/process/coerce.c:368
+#: modules/process/deposit_synth.c:642 modules/process/edge.c:705
+#: modules/process/fft_filter_1d.c:301 modules/process/grain_edge.c:277
+#: modules/process/grain_filter.c:346 modules/process/grain_mark.c:357
+#: modules/process/mark_with.c:322 modules/process/mfm_field.c:420
+#: modules/process/mfm_shift.c:216 modules/process/polydistort.c:319
+#: modules/process/psf.c:309 modules/process/scars.c:421
+#: modules/process/slope_dist.c:400 modules/process/synth.h:542
+#: modules/volume/volume_extract.c:411 modules/volume/volume_extract.c:491
+#: modules/volume/volume_linestat.c:427
 msgid "I_nstant updates"
 msgstr "Мгновенное об_новление"
 
@@ -8034,27 +8318,27 @@ msgstr "Ошибка: вне диапазона."
 msgid "Building mesh..."
 msgstr "Строится сетка..."
 
-#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1818
+#: modules/process/calcoefs_view.c:1120 modules/tools/profile.c:1867
 msgid "X correction"
 msgstr "Поправка по X"
 
-#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1819
+#: modules/process/calcoefs_view.c:1121 modules/tools/profile.c:1868
 msgid "Y correction"
 msgstr "Поправка по Y"
 
-#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1820
+#: modules/process/calcoefs_view.c:1122 modules/tools/profile.c:1869
 msgid "Z correction"
 msgstr "Поправка по Z"
 
-#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1821
+#: modules/process/calcoefs_view.c:1123 modules/tools/profile.c:1870
 msgid "X uncertainty"
 msgstr "Погрешность X"
 
-#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1822
+#: modules/process/calcoefs_view.c:1124 modules/tools/profile.c:1871
 msgid "Y uncertainty"
 msgstr "Погрешность Y"
 
-#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1823
+#: modules/process/calcoefs_view.c:1125 modules/tools/profile.c:1872
 msgid "Z uncertainty"
 msgstr "Погрешность Z"
 
@@ -8082,80 +8366,80 @@ msgstr "Привязать к плоскостям"
 msgid "Delaunay"
 msgstr "Делоне"
 
-#: modules/process/calibrate.c:180
+#: modules/process/calibrate.c:172
 msgid "Recalibrates scan lateral dimensions or value range."
 msgstr ""
 "Перекалибровывает горизонтальное разрешение скана или диапазон значений."
 
-#: modules/process/calibrate.c:194
+#: modules/process/calibrate.c:186
 msgid "/_Basic Operations/_Dimensions and Units..."
 msgstr "/_Базовые действия/Размеры и _единицы измерения..."
 
-#: modules/process/calibrate.c:198 modules/volume/volume_calibrate.c:193
+#: modules/process/calibrate.c:190 modules/volume/volume_calibrate.c:193
 msgid "Change physical dimensions, units or value scale"
 msgstr ""
 "Изменить горизонтальное разрешение, единицы измерения или диапазон значений"
 
-#: modules/process/calibrate.c:357 modules/volume/volume_calibrate.c:355
+#: modules/process/calibrate.c:349 modules/volume/volume_calibrate.c:355
 msgid "Recalibrated Data"
 msgstr "Перекалиброванные данные"
 
-#: modules/process/calibrate.c:390
+#: modules/process/calibrate.c:382
 msgid "Dimensions and Units"
 msgstr "Размеры и единицы измерения"
 
-#: modules/process/calibrate.c:411 modules/volume/volume_calibrate.c:389
+#: modules/process/calibrate.c:405 modules/volume/volume_calibrate.c:391
 msgid "New Real Dimensions"
 msgstr "Новые реальные размеры"
 
-#: modules/process/calibrate.c:417
+#: modules/process/calibrate.c:415
 msgid "_Match pixel size:"
 msgstr "_Выровнять размер пикселя:"
 
-#: modules/process/calibrate.c:444 modules/volume/volume_calibrate.c:394
+#: modules/process/calibrate.c:447 modules/volume/volume_calibrate.c:397
 msgid "_X range:"
 msgstr "Диапазон _X:"
 
-#: modules/process/calibrate.c:473 modules/volume/volume_calibrate.c:421
+#: modules/process/calibrate.c:467 modules/volume/volume_calibrate.c:417
 msgid "_Y range:"
 msgstr "Диапазон _Y:"
 
-#: modules/process/calibrate.c:489
+#: modules/process/calibrate.c:472
 msgid "_Square samples"
 msgstr "_Квадратный образец"
 
-#: modules/process/calibrate.c:524 modules/volume/volume_calibrate.c:521
+#: modules/process/calibrate.c:496 modules/volume/volume_calibrate.c:480
 msgid "Value Range"
 msgstr "Диапазон значений"
 
-#: modules/process/calibrate.c:529 modules/volume/volume_calibrate.c:448
+#: modules/process/calibrate.c:502 modules/volume/volume_calibrate.c:437
 msgid "_Z range:"
 msgstr "Диапазон _Z:"
 
-#: modules/process/calibrate.c:558
+#: modules/process/calibrate.c:524
 msgid "Z shi_ft:"
 msgstr "С_двиг Z:"
 
-#: modules/process/calibrate.c:573 modules/volume/volume_calibrate.c:570
+#: modules/process/calibrate.c:533 modules/volume/volume_calibrate.c:515
 msgid "Calibration Coefficients"
 msgstr "Коэффициенты калибровки"
 
-#: modules/process/calibrate.c:580 modules/volume/volume_calibrate.c:577
+#: modules/process/calibrate.c:538 modules/volume/volume_calibrate.c:520
 msgid "_X calibration factor:"
 msgstr "Множитель калибровки по _X:"
 
-#: modules/process/calibrate.c:590 modules/volume/volume_calibrate.c:585
+#: modules/process/calibrate.c:545 modules/volume/volume_calibrate.c:527
 msgid "_Y calibration factor:"
 msgstr "Множитель калибровки по _Y:"
 
-#: modules/process/calibrate.c:600 modules/volume/volume_calibrate.c:593
+#: modules/process/calibrate.c:552 modules/volume/volume_calibrate.c:534
 msgid "_Z calibration factor:"
 msgstr "Множитель калибровки по _Z:"
 
-#: modules/process/calibrate.c:613 modules/process/extend.c:293
-#: modules/tools/crop.c:213
-msgid "Create new channel"
-msgstr "Создать новый канал"
+#: modules/process/calibrate.c:567 modules/process/drift.c:389
+#: modules/process/extend.c:293 modules/tools/crop.c:213
+msgid "Create new image"
+msgstr "Создать новое изображение"
 
 #: modules/process/coerce.c:159
 msgid "Transforms surfaces to have prescribed statistical properties."
@@ -8175,13 +8459,13 @@ msgid "Coerced"
 msgstr "Заданное"
 
 #: modules/process/coerce.c:225 modules/process/coerce.c:326
-#: modules/process/fbm_synth.c:475 modules/process/lno_synth.c:256
-#: modules/process/noise_synth.c:183
+#: modules/process/fbm_synth.c:474 modules/process/lno_synth.c:254
+#: modules/process/noise_synth.c:181
 msgid "distribution|Uniform"
 msgstr "Равномерное"
 
-#: modules/process/coerce.c:226 modules/process/fbm_synth.c:476
-#: modules/process/lno_synth.c:246 modules/process/noise_synth.c:173
+#: modules/process/coerce.c:226 modules/process/fbm_synth.c:475
+#: modules/process/lno_synth.c:244 modules/process/noise_synth.c:171
 msgid "distribution|Gaussian"
 msgstr "Гауссово"
 
@@ -8230,12 +8514,12 @@ msgid "Number of maxima"
 msgstr "Число максимумов"
 
 #: modules/process/col_synth.c:173 modules/tools/linestats.c:178
-#: modules/volume/volume_linestat.c:154
+#: modules/volume/volume_linestat.c:156
 msgid "Skew"
 msgstr "Асимметрия"
 
 #: modules/process/col_synth.c:174 modules/tools/linestats.c:179
-#: modules/tools/roughness.c:386 modules/volume/volume_linestat.c:155
+#: modules/tools/roughness.c:387 modules/volume/volume_linestat.c:157
 msgid "Kurtosis"
 msgstr "Эксцесс"
 
@@ -8248,8 +8532,8 @@ msgid "Generates columnar surfaces by a simple growth algorithm."
 msgstr "Создаёт столбчатые поверхности простым алгоритмом роста. "
 
 #: modules/process/col_synth.c:208
-msgid "/S_ynthetic/_Columnar..."
-msgstr "/Син_тез/С_толбчатая..."
+msgid "/S_ynthetic/_Deposition/_Columnar..."
+msgstr "/Син_тез/_Осаждение/С_толбчатое..."
 
 #: modules/process/col_synth.c:212
 msgid "Generate columnar surface"
@@ -8271,7 +8555,7 @@ msgstr "Угол падения"
 msgid "Inclination"
 msgstr "Наклон"
 
-#: modules/process/col_synth.c:509 modules/process/crosscor.c:1063
+#: modules/process/col_synth.c:509 modules/process/crosscor.c:1036
 msgid "Direction"
 msgstr "Направление"
 
@@ -8279,15 +8563,15 @@ msgstr "Направление"
 msgid "Relaxation type:"
 msgstr "Тип релаксации:"
 
-#: modules/process/col_synth.c:528
+#: modules/process/col_synth.c:529
 msgid "_Melting:"
 msgstr "_Плавление:"
 
-#: modules/process/col_synth.c:612
+#: modules/process/col_synth.c:613
 msgid "Weak"
 msgstr "Слабая"
 
-#: modules/process/col_synth.c:613
+#: modules/process/col_synth.c:614
 msgid "Strong"
 msgstr "Сильная"
 
@@ -8319,8 +8603,8 @@ msgstr "Общий фильтр свёртки"
 msgid "Convolution Filter"
 msgstr "Фильтр свёртки"
 
-#: modules/process/convolution_filter.c:269 modules/tools/filter.c:170
-#: modules/tools/filter.c:274
+#: modules/process/convolution_filter.c:269 modules/tools/filter.c:171
+#: modules/tools/filter.c:275
 msgid "Filter"
 msgstr "Фильтр"
 
@@ -8348,7 +8632,7 @@ msgstr "ГСим"
 msgid "VSym"
 msgstr "ВСим"
 
-#: modules/process/correct_affine.c:231
+#: modules/process/correct_affine.c:220
 msgid ""
 "Corrects affine distortion of images by matching image Bravais lattice to "
 "the true one."
@@ -8356,101 +8640,109 @@ msgstr ""
 "Исправляет аффинные искажения изображений путём сравнения решетки Браве "
 "изображения с реальной."
 
-#: modules/process/correct_affine.c:246
+#: modules/process/correct_affine.c:235
 msgid "/_Distortion/_Affine..."
 msgstr "/_Искажение/_Аффинное..."
 
-#: modules/process/correct_affine.c:250
+#: modules/process/correct_affine.c:239
 msgid "Correct affine distortion"
 msgstr "Исправить аффинное искажение"
 
-#: modules/process/correct_affine.c:298
+#: modules/process/correct_affine.c:309 modules/process/correct_affine.c:634
+msgid "Corrected"
+msgstr "Исправленное"
+
+#: modules/process/correct_affine.c:343
 msgid "Affine Correction"
 msgstr "Аффинная коррекция"
 
-#: modules/process/correct_affine.c:351 modules/process/fft_filter_2d.c:530
+#: modules/process/correct_affine.c:349 modules/process/measure_lattice.c:249
+msgid "_Refine"
+msgstr "_Уточнить"
+
+#: modules/process/correct_affine.c:399 modules/process/fft_filter_2d.c:530
 msgid "Preview Options"
 msgstr "Параметры предпросмотра"
 
-#: modules/process/correct_affine.c:356 modules/process/fft_filter_2d.c:535
-#: modules/process/measure_lattice.c:321
+#: modules/process/correct_affine.c:404 modules/process/fft_filter_2d.c:535
+#: modules/process/measure_lattice.c:311
 msgid "Display:"
 msgstr "Показать:"
 
-#: modules/process/correct_affine.c:364 modules/process/measure_lattice.c:329
+#: modules/process/correct_affine.c:412 modules/process/measure_lattice.c:319
 #: modules/tools/grainremover.c:109
 msgid "_Data"
 msgstr "Да_нные"
 
-#: modules/process/correct_affine.c:365
+#: modules/process/correct_affine.c:413
 msgid "2D _ACF"
 msgstr "2D _ACF"
 
-#: modules/process/correct_affine.c:366 modules/process/drift.c:365
+#: modules/process/correct_affine.c:414 modules/process/drift.c:364
 msgid "Correc_ted data"
 msgstr "Ис_правленные данные"
 
-#: modules/process/correct_affine.c:377
+#: modules/process/correct_affine.c:425
 msgid "ACF zoom:"
 msgstr "Увеличение АКФ:"
 
-#: modules/process/correct_affine.c:394 modules/process/measure_lattice.c:372
+#: modules/process/correct_affine.c:442 modules/process/measure_lattice.c:346
+msgid "Interpolate _horizontal ACF"
+msgstr "Интерполировать _горизонтальную АКФ"
+
+#: modules/process/correct_affine.c:452 modules/process/measure_lattice.c:372
 msgid "Lattice Vectors"
 msgstr "Векторы решетки"
 
 #. TRANSLATORS: Correct is an adjective here.
-#: modules/process/correct_affine.c:419
+#: modules/process/correct_affine.c:469
 msgid "Correct Lattice"
 msgstr "Исправить решетку"
 
-#: modules/process/correct_affine.c:423
+#: modules/process/correct_affine.c:473
 msgid "_Lattice type:"
 msgstr "Тип _решетки:"
 
-#: modules/process/correct_affine.c:430
+#: modules/process/correct_affine.c:480
 msgid "User defined"
 msgstr "Пользовательская"
 
-#: modules/process/correct_affine.c:445
+#: modules/process/correct_affine.c:495
 msgid "_Different lengths"
 msgstr "_Различные длины"
 
-#: modules/process/correct_affine.c:474
+#: modules/process/correct_affine.c:524
 msgid "Image for _ACF:"
 msgstr "Изображение для _АКФ:"
 
-#: modules/process/correct_affine.c:501
+#: modules/process/correct_affine.c:551
 msgid "_Scaling:"
 msgstr "_Масштаб:"
 
-#: modules/process/correct_affine.c:508
+#: modules/process/correct_affine.c:558
 msgid "Exactly as specified"
 msgstr "Точно как задано"
 
-#: modules/process/correct_affine.c:509
+#: modules/process/correct_affine.c:560
 msgid "Preserve area"
 msgstr "Сохранять площадь"
 
-#: modules/process/correct_affine.c:510
+#: modules/process/correct_affine.c:562
 msgid "Preserve X scale"
 msgstr "Сохранять масштаб X"
 
-#: modules/process/correct_affine.c:561
-msgid "Corrected"
-msgstr "Исправленное"
+#: modules/process/correct_affine.c:571 modules/process/drift.c:379
+msgid "_Apply to all compatible images"
+msgstr "Применить для _всех совместимых изображений"
 
-#: modules/process/correct_affine.c:617 modules/process/measure_lattice.c:489
+#: modules/process/correct_affine.c:693 modules/process/measure_lattice.c:482
 msgid "length"
 msgstr "длина"
 
-#: modules/process/correct_affine.c:624 modules/process/measure_lattice.c:496
+#: modules/process/correct_affine.c:700 modules/process/measure_lattice.c:489
 msgid "angle"
 msgstr "угол"
 
-#: modules/process/correct_affine.c:717
-msgid "Re_fine"
-msgstr "_Уточнить"
-
 #: modules/process/crosscor.c:157
 msgid "Calculates cross-correlation of two data fields."
 msgstr "Вычисляет взаимную корреляцию двух полей данных."
@@ -8475,150 +8767,152 @@ msgstr "Ко_ррелировать с:"
 msgid "Search size"
 msgstr "Размер поиска"
 
-#: modules/process/crosscor.c:272
-msgid "Global offset of 2nd channel"
-msgstr "Общее смещение второго канала"
-
-#: modules/process/crosscor.c:277
+#: modules/process/crosscor.c:267
 msgid "_Guess"
 msgstr "_Угадать"
 
-#: modules/process/crosscor.c:311
+#: modules/process/crosscor.c:268
+msgid "Global offset of 2nd channel"
+msgstr "Общее смещение второго канала"
+
+#: modules/process/crosscor.c:292
 msgid "Window size"
 msgstr "Размер окна"
 
-#: modules/process/crosscor.c:319
+#: modules/process/crosscor.c:300
 msgid "W_idth:"
 msgstr "Ш_ирина:"
 
-#: modules/process/crosscor.c:329
+#: modules/process/crosscor.c:308
 msgid "Hei_ght:"
 msgstr "В_ысота:"
 
-#: modules/process/crosscor.c:342 modules/process/fft.c:405
+#: modules/process/crosscor.c:319 modules/process/fft.c:403
 #: modules/process/psdf_logphi.c:268
 msgid "_Windowing type:"
 msgstr "Тип о_кна:"
 
-#: modules/process/crosscor.c:350
+#: modules/process/crosscor.c:327
 msgid "All"
 msgstr "Всё"
 
-#: modules/process/crosscor.c:351
+#: modules/process/crosscor.c:328
 msgid "Absolute"
 msgstr "Модуль"
 
-#: modules/process/crosscor.c:352
+#: modules/process/crosscor.c:329
 msgid "X Distance"
 msgstr "Расстояние по X"
 
-#: modules/process/crosscor.c:353
+#: modules/process/crosscor.c:330
 msgid "Y Distance"
 msgstr "Расстояние по Y"
 
-#: modules/process/crosscor.c:355 modules/process/crosscor.c:1077
+#: modules/process/crosscor.c:332 modules/process/crosscor.c:1050
 msgid "Score"
 msgstr "Степень"
 
-#: modules/process/crosscor.c:357 modules/process/fft.c:395
-#: modules/process/fit-shape.c:688 modules/process/maskcor.c:176
+#: modules/process/crosscor.c:334 modules/process/fft.c:393
+#: modules/process/fit-shape.c:699 modules/process/maskcor.c:177
+#: modules/process/mfm_current.c:455 modules/process/mfm_field.c:373
+#: modules/process/mfm_parallel.c:466
 msgid "Output _type:"
 msgstr "Тип в_ывода:"
 
-#: modules/process/crosscor.c:363
+#: modules/process/crosscor.c:340
 msgid "Add _low score results mask"
 msgstr "Добавить маску результатов с _низким весом"
 
-#: modules/process/crosscor.c:374 modules/process/grain_wshed.c:223
-#: modules/process/maskcor.c:188
+#: modules/process/crosscor.c:351 modules/process/grain_wshed.c:225
+#: modules/process/maskcor.c:191
 msgid "T_hreshold:"
 msgstr "_Порог:"
 
-#: modules/process/crosscor.c:381
+#: modules/process/crosscor.c:359
 msgid "Multichannel cross-corelation"
 msgstr "Взаимная корреляция нескольких каналов"
 
-#: modules/process/crosscor.c:400
+#: modules/process/crosscor.c:378
 msgid "Second _source data:"
 msgstr "Данные второго _источника:"
 
-#: modules/process/crosscor.c:417
+#: modules/process/crosscor.c:394
 msgid "Correlate with:"
 msgstr "Коррелировать с:"
 
-#: modules/process/crosscor.c:424
+#: modules/process/crosscor.c:402
 msgid "Postprocess:"
 msgstr "Постобработка:"
 
-#: modules/process/crosscor.c:431
-msgid "Apply Ga_ussian filter of width: "
-msgstr "Применить г-ауссов фильтр шириной:"
+#: modules/process/crosscor.c:411
+msgid "Apply Ga_ussian filter of width:"
+msgstr "Применить га_уссов фильтр шириной:"
 
-#: modules/process/crosscor.c:451
+#: modules/process/crosscor.c:424
 msgid "Extend results to borders"
 msgstr "Расширить результат до границ"
 
-#: modules/process/crosscor.c:461
+#: modules/process/crosscor.c:433
 msgid "Create corrected data from 2nd channel"
 msgstr "Создать исправленные данные из второго канала"
 
-#: modules/process/crosscor.c:860
+#: modules/process/crosscor.c:833
 msgid "Correlating first set..."
 msgstr "Корреляция первого множества..."
 
-#: modules/process/crosscor.c:892
+#: modules/process/crosscor.c:865
 msgid "Correlating second set..."
 msgstr "Корреляция второго множества..."
 
-#: modules/process/crosscor.c:999
+#: modules/process/crosscor.c:972
 msgid "Corrected 2nd channel"
 msgstr "Исправленный второй канал"
 
-#: modules/process/crosscor.c:1023
+#: modules/process/crosscor.c:996
 msgid "X difference"
 msgstr "Различие X"
 
-#: modules/process/crosscor.c:1037
+#: modules/process/crosscor.c:1010
 msgid "Y difference"
 msgstr "Различие Y"
 
-#: modules/process/crosscor.c:1050
+#: modules/process/crosscor.c:1023
 msgid "Absolute difference"
 msgstr "Разница по модулю"
 
-#: modules/process/curvature.c:131
+#: modules/process/curvature.c:130
 msgid "Center value"
 msgstr "Значение центра"
 
-#: modules/process/curvature.c:132
+#: modules/process/curvature.c:131
 msgid "Curvature radius 1"
 msgstr "Радиус кривизны 1"
 
-#: modules/process/curvature.c:133
+#: modules/process/curvature.c:132
 msgid "Curvature radius 2"
 msgstr "Радиус кривизны 2"
 
-#: modules/process/curvature.c:134
+#: modules/process/curvature.c:133
 msgid "Direction 1"
 msgstr "Направление 1"
 
-#: modules/process/curvature.c:135
+#: modules/process/curvature.c:134
 msgid "Direction 2"
 msgstr "Направление 2"
 
-#: modules/process/curvature.c:163
+#: modules/process/curvature.c:162
 msgid "Calculates overall curvature."
 msgstr "Рассчитывает общую кривизну."
 
-#: modules/process/curvature.c:177
+#: modules/process/curvature.c:176
 msgid "/_Level/_Curvature..."
 msgstr "/_Выравнивание/_Кривизна..."
 
-#: modules/process/curvature.c:181
+#: modules/process/curvature.c:180
 msgid "Calculate overall curvature"
 msgstr "Рассчитать общую кривизну"
 
-#: modules/process/curvature.c:211 modules/process/facet-level.c:118
+#: modules/process/curvature.c:210 modules/process/facet-level.c:118
 #: modules/process/semsim.c:165
 #, c-format
 msgid "%s: Lateral dimensions and value must be the same physical quantity."
@@ -8626,47 +8920,47 @@ msgstr ""
 "%s: горизонтальные размеры и значения данных должны быть одной физической "
 "величиной."
 
-#: modules/process/curvature.c:445
+#: modules/process/curvature.c:447
 msgid "Curvature Sections"
 msgstr "Сечения кривизны"
 
-#: modules/process/curvature.c:653
+#: modules/process/curvature.c:655
 msgid "Output Type"
 msgstr "Тип вывода"
 
-#: modules/process/curvature.c:660
+#: modules/process/curvature.c:662
 msgid "_Set selection"
 msgstr "_Установить выделение"
 
-#: modules/process/curvature.c:670
+#: modules/process/curvature.c:672
 msgid "_Plot graph"
 msgstr "Строить _график"
 
-#: modules/process/curvature.c:685 modules/process/drift.c:337
-#: modules/process/fft_profile.c:310 modules/process/fractal.c:328
-#: modules/process/grain_cross.c:253 modules/process/linematch.c:885
-#: modules/process/slope_dist.c:349 modules/tools/linestats.c:418
-#: modules/tools/profile.c:573 modules/tools/roughness.c:872
-#: modules/tools/sfunctions.c:486 modules/tools/spectro.c:382
-#: modules/volume/volume_slice.c:398
-msgid "Target _graph:"
-msgstr "Добавить к _графику:"
-
-#: modules/process/curvature.c:691 modules/process/drift.c:343
-#: modules/process/fft_profile.c:316 modules/process/fractal.c:334
-#: modules/process/grain_cross.c:259 modules/process/linematch.c:892
-#: modules/process/slope_dist.c:355 modules/tools/linestats.c:424
-#: modules/tools/profile.c:579 modules/tools/roughness.c:878
-#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:388
-#: modules/volume/volume_slice.c:406
+#: modules/process/curvature.c:684 modules/process/drift.c:340
+#: modules/process/fft_profile.c:300 modules/process/fractal.c:308
+#: modules/process/grain_cross.c:260 modules/process/linematch.c:855
+#: modules/process/slope_dist.c:347 modules/tools/linestats.c:424
+#: modules/tools/profile.c:559 modules/tools/roughness.c:886
+#: modules/tools/sfunctions.c:488 modules/tools/spectro.c:391
+#: modules/volume/volume_slice.c:408
 msgid "New graph"
 msgstr "Новый график"
 
-#: modules/process/curvature.c:951
+#: modules/process/curvature.c:689 modules/process/drift.c:345
+#: modules/process/fft_profile.c:306 modules/process/fractal.c:313
+#: modules/process/grain_cross.c:254 modules/process/linematch.c:860
+#: modules/process/slope_dist.c:352 modules/tools/linestats.c:418
+#: modules/tools/profile.c:563 modules/tools/roughness.c:890
+#: modules/tools/sfunctions.c:492 modules/tools/spectro.c:385
+#: modules/volume/volume_slice.c:400
+msgid "Target _graph:"
+msgstr "Добавить к _графику:"
+
+#: modules/process/curvature.c:949
 msgid "Axes are outside the image."
 msgstr "Оси снаружи изображения."
 
-#: modules/process/curvature.c:1018
+#: modules/process/curvature.c:1016
 msgid "Save Curvature"
 msgstr "Сохранить кривизну"
 
@@ -8690,8 +8984,8 @@ msgstr "CWT"
 msgid "2D CWT"
 msgstr "2D CWT"
 
-#: modules/process/cwt.c:158 modules/process/dwt.c:185
-#: modules/process/dwtanisotropy.c:209
+#: modules/process/cwt.c:159 modules/process/dwt.c:185
+#: modules/process/dwtanisotropy.c:212
 msgid "_Wavelet type:"
 msgstr "Тип _вейвлета:"
 
@@ -8700,14 +8994,14 @@ msgid "Generates particles using simple dynamical model"
 msgstr "Создаёт частицы используя простую динамическую модель"
 
 #: modules/process/deposit_synth.c:184
-msgid "/S_ynthetic/_Particles..."
-msgstr "/Син_тез/_Частицы..."
+msgid "/S_ynthetic/_Deposition/_Particles..."
+msgstr "/Син_тез/_Осаждение/_Частиц..."
 
 #: modules/process/deposit_synth.c:188
 msgid "Generate particles using dynamical model"
 msgstr "Создать частицы используя динамическую модель"
 
-#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:867
+#: modules/process/deposit_synth.c:288 modules/process/deposit_synth.c:866
 #, c-format
 msgid ""
 "Not all the particles could be deposited (%u),\n"
@@ -8716,73 +9010,69 @@ msgstr ""
 "Не все частицы могут быть осаждены (%u),\n"
 "попробуйте добавить шагов уточнения"
 
-#: modules/process/deposit_synth.c:347
+#: modules/process/deposit_synth.c:348
 msgid "Particle Generation"
 msgstr "Генерация частиц"
 
-#: modules/process/deposit_synth.c:427
+#: modules/process/deposit_synth.c:431
 msgid "Particle r_adius:"
 msgstr "Радиус _частицы:"
 
-#: modules/process/deposit_synth.c:438
+#: modules/process/deposit_synth.c:443
 msgid "Distribution _width:"
 msgstr "Ширина _распределения:"
 
-#: modules/process/deposit_synth.c:449
-msgid "Surface _coverage:"
-msgstr "По_крытие поверхности:"
-
-#: modules/process/deposit_synth.c:458
+#: modules/process/deposit_synth.c:462
 msgid "_Relax steps:"
 msgstr "Шагов р_елаксации:"
 
-#: modules/process/deposit_synth.c:659 modules/process/synth.h:548
+#: modules/process/deposit_synth.c:660 modules/process/synth.h:577
 msgid "R_andom seed:"
 msgstr "На_чальное число:"
 
-#: modules/process/deposit_synth.c:665 modules/process/synth.h:554
+#: modules/process/deposit_synth.c:666 modules/process/synth.h:583
 msgid "seed|_New"
 msgstr "Ново_е"
 
-#: modules/process/deposit_synth.c:676
+#: modules/process/deposit_synth.c:677
 msgid "Randomize"
 msgstr "Сделать случайным"
 
-#: modules/process/deposit_synth.c:860 modules/process/domain_synth.c:919
+#: modules/process/deposit_synth.c:859 modules/process/domain_synth.c:919
 msgid "Running computation..."
 msgstr "Проведение вычислений..."
 
-#: modules/process/deposit_synth.c:865
+#: modules/process/deposit_synth.c:864
 #, c-format
 msgid "%d particles were deposited"
 msgstr "было осаждено %d частиц"
 
-#: modules/process/deposit_synth.c:1093
+#: modules/process/deposit_synth.c:1092
 msgid "Initial particle set..."
 msgstr "Начальная расстановка частиц..."
 
-#: modules/process/deposit_synth.c:1252
+#: modules/process/deposit_synth.c:1251
 msgid "Running revise..."
 msgstr "Проводится уточнение..."
 
-#: modules/process/deposit_synth.c:1380
+#: modules/process/deposit_synth.c:1379
 msgid "Error: too many particles."
 msgstr "Ошибка: слишком много частиц."
 
-#: modules/process/deposit_synth.c:1382
+#: modules/process/deposit_synth.c:1381
 msgid "Error: no particles."
 msgstr "Ошибка: нет частиц."
 
-#: modules/process/deposit_synth.c:1384
+#: modules/process/deposit_synth.c:1383
 msgid "Error: particles too large."
 msgstr "Ошибка: частицы слишком большие."
 
-#: modules/process/deposit_synth.c:1386
+#: modules/process/deposit_synth.c:1385
 msgid "Error: particles too small."
 msgstr "Ошибка: частицы слишком маленькие."
 
 #: modules/process/diff_synth.c:197 modules/tools/linestats.c:173
-#: modules/volume/volume_linestat.c:149
+#: modules/volume/volume_linestat.c:151
 msgid "Variation"
 msgstr "Вариация"
 
@@ -8795,8 +9085,8 @@ msgid "Generates surfaces by diffusion limited aggregation."
 msgstr "Создаёт поверхность с помощью агрегации, ограниченной диффузией"
 
 #: modules/process/diff_synth.c:228
-msgid "/S_ynthetic/_Diffusion..."
-msgstr "/Син_тез/Ди_ффузия..."
+msgid "/S_ynthetic/_Deposition/_Diffusion..."
+msgstr "/Син_тез/_Осаждение/Ди_ффузия..."
 
 #: modules/process/diff_synth.c:232
 msgid "Generate surface by diffusion limited aggregation"
@@ -8810,45 +9100,45 @@ msgstr "Агрегация, ограниченная диффузией"
 msgid "_Flux:"
 msgstr "_Поток:"
 
-#: modules/process/diff_synth.c:522
+#: modules/process/diff_synth.c:521
 msgid "Probabilities"
 msgstr "Вероятности"
 
-#: modules/process/diff_synth.c:530
+#: modules/process/diff_synth.c:529
 msgid "_Sticking:"
 msgstr "_Прилипания:"
 
-#: modules/process/diff_synth.c:539
+#: modules/process/diff_synth.c:538
 msgid "_Activation:"
 msgstr "_Активации:"
 
-#: modules/process/diff_synth.c:548
+#: modules/process/diff_synth.c:547
 msgid "Passing Sch_woebel:"
 msgstr "Прохождения _Швёбеля:"
 
-#: modules/process/dimensions.h:457
+#: modules/process/dimensions.h:439
 msgid "S_quare image"
 msgstr "_Квадратное изображение"
 
-#: modules/process/dimensions.h:489
+#: modules/process/dimensions.h:473
 msgid "_Dimension units:"
 msgstr "Единицы измерения _размера:"
 
-#: modules/process/dimensions.h:502
-msgid "Current Channel"
-msgstr "Текущий канал"
+#: modules/process/dimensions.h:488
+msgid "Current Image"
+msgstr "Текущее изображение"
 
-#: modules/process/dimensions.h:506
-msgid "_Take Dimensions from Current Channel"
-msgstr "Взять _размеры текущего канала"
+#: modules/process/dimensions.h:492
+msgid "_Take Dimensions from Current Image"
+msgstr "Взять _размеры текущего изображения"
 
-#: modules/process/dimensions.h:514
-msgid "_Replace the current channel"
-msgstr "За_менить текущий канал"
+#: modules/process/dimensions.h:501
+msgid "_Replace the current image"
+msgstr "За_менить текущее изображение"
 
-#: modules/process/dimensions.h:523
-msgid "_Start from the current channel"
-msgstr "Н_ачать с текущего канала"
+#: modules/process/dimensions.h:510
+msgid "_Start from the current image"
+msgstr "Н_ачать с текущего изображения"
 
 #: modules/process/domain_synth.c:158
 msgid "Discrete state"
@@ -8907,13 +9197,13 @@ msgid "_Monte Carlo time step:"
 msgstr "Временной шаг метода _Монте-Карло:"
 
 #: modules/process/domain_synth.c:504 modules/process/fft_filter_2d.c:586
-#: modules/volume/volume_slice.c:364
+#: modules/volume/volume_slice.c:366
 msgid "Output Options"
 msgstr "Параметры вывода"
 
 #: modules/process/domain_synth.c:523 modules/process/fft_filter_2d.c:591
-#: modules/process/mask_edt.c:377 modules/process/slope_dist.c:323
-#: modules/volume/volume_linestat.c:432 modules/volume/volume_slice.c:384
+#: modules/process/mask_edt.c:211 modules/process/slope_dist.c:323
+#: modules/volume/volume_linestat.c:437 modules/volume/volume_slice.c:386
 msgid "Output type:"
 msgstr "Тип вывода:"
 
@@ -8943,57 +9233,49 @@ msgstr "Ди_апазон поиска:"
 msgid "rows"
 msgstr "строк(и)"
 
-#: modules/process/drift.c:304
+#: modules/process/drift.c:305
 msgid "Correct _data"
 msgstr "Исправить _данные"
 
-#: modules/process/drift.c:314
+#: modules/process/drift.c:315
 msgid "_Exclude linear skew"
 msgstr "_Исключить линейный уклон"
 
-#: modules/process/drift.c:324
+#: modules/process/drift.c:325
 msgid "Plot drift _graph"
 msgstr "Строить _график дрейфа"
 
-#: modules/process/drift.c:356 modules/process/fit-shape.c:693
-#: modules/process/neural.c:548 modules/process/polydistort.c:275
+#: modules/process/drift.c:355 modules/process/fit-shape.c:705
+#: modules/process/neural.c:552 modules/process/polydistort.c:278
 msgid "Preview:"
 msgstr "Предпросмотр:"
 
-#: modules/process/drift.c:366
+#: modules/process/drift.c:365
 msgid "Drift _lines"
 msgstr "_Линии дрейфа"
 
-#: modules/process/drift.c:374 modules/process/facet_analysis.c:407
-#: modules/process/grain_edge.c:285 modules/process/grain_filter.c:357
-#: modules/process/grain_mark.c:367 modules/process/grain_wshed.c:267
-#: modules/process/mark_disconn.c:310 modules/process/scars.c:381
+#: modules/process/drift.c:373 modules/process/facet_analysis.c:390
+#: modules/process/grain_edge.c:272 modules/process/grain_filter.c:356
+#: modules/process/grain_mark.c:341 modules/process/grain_wshed.c:271
+#: modules/process/mark_disconn.c:298 modules/process/scars.c:405
 #: modules/process/wpour_mark.c:369
 msgid "_Mask color:"
 msgstr "_Цвет маски:"
 
-#: modules/process/drift.c:379
-msgid "Distribute"
-msgstr "Распространить"
-
-#: modules/process/drift.c:388
-msgid "Replace"
-msgstr "Заменить"
-
-#: modules/process/drift.c:569
+#: modules/process/drift.c:570
 msgid "Drift-corrected"
 msgstr "С исправленным дрейфом"
 
-#: modules/process/drift.c:613
+#: modules/process/drift.c:614
 msgid "Drift"
 msgstr "Дрейф"
 
-#: modules/process/drift.c:614 modules/xyz/xyz_drift.c:392
+#: modules/process/drift.c:615 modules/xyz/xyz_drift.c:392
 #: modules/xyz/xyz_drift.c:411 modules/xyz/xyz_drift.c:430
 msgid "drift"
 msgstr "дрейф"
 
-#: modules/process/drift.c:620 modules/xyz/xyz_drift.c:402
+#: modules/process/drift.c:621 modules/xyz/xyz_drift.c:402
 msgid "x-axis drift"
 msgstr "дрейф оси x"
 
@@ -9051,11 +9333,11 @@ msgstr "Анизотропия DWT"
 msgid "2D DWT Anisotropy"
 msgstr "Анизотропия 2D DWT"
 
-#: modules/process/dwtanisotropy.c:214
+#: modules/process/dwtanisotropy.c:218
 msgid "X/Y ratio threshold:"
 msgstr "Порог отношения X/Y:"
 
-#: modules/process/dwtanisotropy.c:222
+#: modules/process/dwtanisotropy.c:226
 msgid "Low level exclude limit:"
 msgstr "Предел исключения низкого уровня:"
 
@@ -9187,7 +9469,7 @@ msgstr "Обнаружение ступени по пересечению нул
 msgid "_Gaussian FWHM:"
 msgstr "Ширина на половине высоты _гауссиан:"
 
-#: modules/process/edge.c:681 modules/process/mark_disconn.c:271
+#: modules/process/edge.c:681 modules/process/mark_disconn.c:272
 msgid "_Threshold:"
 msgstr "_Пороговое значение:"
 
@@ -9252,11 +9534,11 @@ msgstr "Энтропия:"
 msgid "Entropy deficit:"
 msgstr "Дефицит энтропии:"
 
-#: modules/process/entropy.c:567
+#: modules/process/entropy.c:568
 msgid "Entropy at scales"
 msgstr "Энтропия при разных масштабах"
 
-#: modules/process/entropy.c:586
+#: modules/process/entropy.c:587
 msgid "Best estimate"
 msgstr "Лучшая оценка"
 
@@ -9304,23 +9586,23 @@ msgstr "С_права:"
 msgid "Extend _symetrically"
 msgstr "Расширить си_мметрично"
 
-#: modules/process/extend.c:268 modules/process/polydistort.c:256
-#: modules/xyz/xyz_raster.c:658
+#: modules/process/extend.c:268 modules/process/polydistort.c:259
+#: modules/xyz/xyz_raster.c:627
 msgid "exterior|Border"
 msgstr "Граница"
 
-#: modules/process/extend.c:270 modules/process/polydistort.c:258
-#: modules/xyz/xyz_raster.c:660
+#: modules/process/extend.c:270 modules/process/polydistort.c:261
+#: modules/xyz/xyz_raster.c:629
 msgid "exterior|Mirror"
 msgstr "Зеркальная"
 
-#: modules/process/extend.c:272 modules/process/polydistort.c:260
-#: modules/xyz/xyz_raster.c:662
+#: modules/process/extend.c:272 modules/process/polydistort.c:263
+#: modules/xyz/xyz_raster.c:631
 msgid "exterior|Periodic"
 msgstr "Периодический"
 
-#: modules/process/extend.c:275 modules/process/polydistort.c:263
-#: modules/xyz/xyz_raster.c:650
+#: modules/process/extend.c:275 modules/process/polydistort.c:266
+#: modules/xyz/xyz_raster.c:619
 msgid "_Exterior type:"
 msgstr "Тип _внешней части:"
 
@@ -9352,11 +9634,11 @@ msgstr "Количество точек пути:"
 msgid "There is no path selection."
 msgstr "Выбранный путь отсутствует."
 
-#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:390
+#: modules/process/extract_path.c:189 modules/volume/volume_extract.c:383
 msgid "X position"
 msgstr "Положение по X"
 
-#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:397
+#: modules/process/extract_path.c:193 modules/volume/volume_extract.c:389
 msgid "Y position"
 msgstr "Положение по Y"
 
@@ -9369,7 +9651,7 @@ msgid "Y tangent"
 msgstr "Касательная по Y"
 
 #: modules/process/extract_path.c:392 modules/process/extract_path.c:404
-#: modules/process/pat_synth.c:1432 modules/tools/distance.c:146
+#: modules/process/pat_synth.c:1433 modules/tools/distance.c:146
 msgid "Distance"
 msgstr "Расстояние"
 
@@ -9413,47 +9695,36 @@ msgstr "/_Статистика/Анализ _граней..."
 msgid "Mark areas by 2D slope"
 msgstr "Пометить области по двумерному наклону"
 
-#: modules/process/facet_analysis.c:266
+#: modules/process/facet_analysis.c:270
 msgid "Mark Facets"
 msgstr "Пометить грани"
 
-#: modules/process/facet_analysis.c:269
+#: modules/process/facet_analysis.c:273
 msgid "verb|_Mark"
 msgstr "_Пометить"
 
 #. TRANSLATORS: The direction or line orthogonal to something.
-#: modules/process/facet_analysis.c:325
+#: modules/process/facet_analysis.c:329
 msgid "Normal"
 msgstr "Нормаль"
 
-#: modules/process/facet_analysis.c:333
+#: modules/process/facet_analysis.c:337
 msgid "_Find Maximum"
 msgstr "_Найти максимум"
 
-#: modules/process/facet_analysis.c:341
+#: modules/process/facet_analysis.c:345
 msgid "Mean Normal"
 msgstr "Средняя нормаль"
 
-#: modules/process/facet_analysis.c:350
+#: modules/process/facet_analysis.c:362
 msgid "Facet plane size:"
 msgstr "Площадь поверхности грани:"
 
-#: modules/process/facet_analysis.c:375
+#: modules/process/facet_analysis.c:370
 msgid "_Tolerance:"
 msgstr "_Допуск"
 
-#: modules/process/facet_analysis.c:384 modules/process/grain_edge.c:262
-#: modules/process/grain_mark.c:344 modules/process/mark_disconn.c:286
-msgid "Com_bine with existing mask"
-msgstr "О_бъединить с имеющейся маской"
-
-#: modules/process/facet_analysis.c:398 modules/process/grain_edge.c:276
-#: modules/process/grain_mark.c:358 modules/process/mark_disconn.c:301
-#: modules/process/mark_with.c:230 modules/process/mask_morph.c:210
-msgid "Operation:"
-msgstr "Операция:"
-
-#: modules/process/facet_analysis.c:415
+#: modules/process/facet_analysis.c:398
 msgid ""
 "Warning: Lateral and value units differ. Angles are not physically "
 "meaningful."
@@ -9486,8 +9757,8 @@ msgstr "Экспонента _Хёрста:"
 msgid "_Stationarity scale:"
 msgstr "Масштаб _стационарности:"
 
-#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:509
-#: modules/process/noise_synth.c:409
+#: modules/process/fbm_synth.c:390 modules/process/lno_synth.c:507
+#: modules/process/noise_synth.c:407
 msgid "_Distribution:"
 msgstr "_Распределение:"
 
@@ -9495,17 +9766,17 @@ msgstr "_Распределение:"
 msgid "Po_wer:"
 msgstr "С_тепень:"
 
-#: modules/process/fbm_synth.c:408 modules/process/fft_synth.c:414
-#: modules/process/lno_synth.c:533 modules/process/noise_synth.c:433
+#: modules/process/fbm_synth.c:407 modules/process/fft_synth.c:414
+#: modules/process/lno_synth.c:531 modules/process/noise_synth.c:431
 msgid "_RMS:"
 msgstr "Ср. _квадр.:"
 
-#: modules/process/fbm_synth.c:477 modules/process/lno_synth.c:251
-#: modules/process/noise_synth.c:178
+#: modules/process/fbm_synth.c:476 modules/process/lno_synth.c:249
+#: modules/process/noise_synth.c:176
 msgid "distribution|Exponential"
 msgstr "Экспоненциальное"
 
-#: modules/process/fbm_synth.c:478
+#: modules/process/fbm_synth.c:477
 msgid "distribution|Power"
 msgstr "Степенное"
 
@@ -9557,7 +9828,7 @@ msgstr "Мнимое"
 msgid "Modulus"
 msgstr "Абсолютная величина: "
 
-#: modules/process/fft.c:327 modules/process/wave_synth.c:583
+#: modules/process/fft.c:327 modules/process/wave_synth.c:618
 msgid "Phase"
 msgstr "Фаза"
 
@@ -9573,63 +9844,63 @@ msgstr "Необработанное преобразование "
 msgid "I_maginary part:"
 msgstr "_Мнимая часть:"
 
-#: modules/process/fft.c:382
+#: modules/process/fft.c:380
 msgid "_Inverse transform"
 msgstr "_Обратное преобразование"
 
-#: modules/process/fft.c:411
+#: modules/process/fft.c:409
 msgid "Subtract mean _value beforehand"
 msgstr "Сначала вычесть среднее _значение"
 
-#: modules/process/fft.c:422
+#: modules/process/fft.c:420
 msgid "_Preserve RMS"
 msgstr "Со_хранять среднеквадратичное отклонение"
 
-#: modules/process/fft_filter_1d.c:117
+#: modules/process/fft_filter_1d.c:118
 msgid "FFT filtering"
 msgstr "Фильтрация БПФ"
 
-#: modules/process/fft_filter_1d.c:131
+#: modules/process/fft_filter_1d.c:132
 msgid "/_Correct Data/1D _FFT Filtering..."
 msgstr "/Исправить _данные/Одномерная фильтрация Б_ПФ..."
 
-#: modules/process/fft_filter_1d.c:135
+#: modules/process/fft_filter_1d.c:136
 msgid "1D FFT Filtering"
 msgstr "Одномерная фильтрация БПФ"
 
-#: modules/process/fft_filter_1d.c:165 modules/process/wpour_mark.c:391
+#: modules/process/fft_filter_1d.c:166 modules/process/wpour_mark.c:391
 msgid "Marked"
 msgstr "Помечено"
 
-#: modules/process/fft_filter_1d.c:166
+#: modules/process/fft_filter_1d.c:167
 msgid "Unmarked"
 msgstr "Не помечено"
 
-#: modules/process/fft_filter_1d.c:169
+#: modules/process/fft_filter_1d.c:170
 msgid "Null"
 msgstr "Убрать"
 
-#: modules/process/fft_filter_1d.c:170
+#: modules/process/fft_filter_1d.c:171
 msgid "Suppress"
 msgstr "Выровнять"
 
-#: modules/process/fft_filter_1d.c:180
+#: modules/process/fft_filter_1d.c:181
 msgid "1D FFT filter"
 msgstr "одномерный фильтр БПФ"
 
-#: modules/process/fft_filter_1d.c:269 modules/process/linematch.c:861
+#: modules/process/fft_filter_1d.c:271 modules/process/linematch.c:828
 msgid "_Direction:"
 msgstr "Н_аправление:"
 
-#: modules/process/fft_filter_1d.c:277
+#: modules/process/fft_filter_1d.c:279
 msgid "_Suppress type:"
 msgstr "Тип _подавления:"
 
-#: modules/process/fft_filter_1d.c:285
+#: modules/process/fft_filter_1d.c:287
 msgid "_Filter type:"
 msgstr "Тип _фильтра:"
 
-#: modules/process/fft_filter_1d.c:513
+#: modules/process/fft_filter_1d.c:515
 msgid "1D FFT Filtered Data"
 msgstr "Отфильтрованные данные одномерного БПФ"
 
@@ -9649,9 +9920,10 @@ msgstr "Двумерная фильтрация БПФ"
 msgid "Filtered Data"
 msgstr "Отфильтрованные данные"
 
-#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:594
-#: modules/process/fit-shape.c:643 modules/process/fit-shape.c:658
-#: modules/process/fit-shape.c:662 modules/process/neural.c:560
+#: modules/process/fft_filter_2d.c:305 modules/process/fit-shape.c:604
+#: modules/process/fit-shape.c:653 modules/process/fit-shape.c:668
+#: modules/process/fit-shape.c:672 modules/process/neural.c:564
+#: modules/process/psf.c:232
 msgid "Difference"
 msgstr "Разница"
 
@@ -9707,7 +9979,7 @@ msgstr "Маска фильтра"
 msgid "_Undo"
 msgstr "_Отменить"
 
-#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:556
+#: modules/process/fft_filter_2d.c:507 modules/tools/maskedit.c:562
 msgid "_Fill"
 msgstr "_Заполнить"
 
@@ -9715,7 +9987,7 @@ msgstr "_Заполнить"
 msgid "_Snap to origin"
 msgstr "_Прикрепить к началу координат"
 
-#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:339
+#: modules/process/fft_filter_2d.c:565 modules/process/measure_lattice.c:329
 msgid "Zoom:"
 msgstr "Масштаб:"
 
@@ -9751,38 +10023,38 @@ msgstr "Заполнить всю маску фильтра"
 msgid "Force shapes to center around the origin"
 msgstr "Центрирует фигуры относительно начала координат"
 
-#: modules/process/fft_profile.c:125
+#: modules/process/fft_profile.c:124
 msgid ""
 "Reads radial sections of two-dimensional power spectrum density function."
 msgstr ""
 "Читает радиальные сечения функции спектральной плотности мощности (ФСПМ)."
 
-#: modules/process/fft_profile.c:140
+#: modules/process/fft_profile.c:139
 msgid "/_Statistics/_PSDF Section..."
 msgstr "/_Статистика/Сечение _ФСПМ..."
 
-#: modules/process/fft_profile.c:144
+#: modules/process/fft_profile.c:143
 msgid "Read radial PSDF sections"
 msgstr "Считать радиальные сечения ФСПМ"
 
-#: modules/process/fft_profile.c:190
+#: modules/process/fft_profile.c:189
 msgid "Radial PSDF Section"
 msgstr "Радиальное сечение ФСПМ"
 
-#: modules/process/fft_profile.c:237
+#: modules/process/fft_profile.c:236
 msgid "PSDF Section"
 msgstr "Сечение ФСПМ"
 
-#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:336
-#: modules/tools/profile.c:517 modules/tools/sfunctions.c:443
-msgid "_Fix res.:"
-msgstr "_Фикс. разр.:"
+#: modules/process/fft_profile.c:266 modules/process/grain_dist.c:338
+#: modules/tools/profile.c:514 modules/tools/sfunctions.c:454
+msgid "_Fixed resolution:"
+msgstr "_Фиксированное разрешение:"
 
-#: modules/process/fft_profile.c:279
+#: modules/process/fft_profile.c:278
 msgid "_Separate curves"
 msgstr "_Разделить кривые"
 
-#: modules/process/fft_profile.c:496
+#: modules/process/fft_profile.c:483
 #, c-format
 msgid "PSDF %.0f°"
 msgstr "ФСПМ %.0f°"
@@ -9803,11 +10075,15 @@ msgstr "Создать поверхность используя спектра
 msgid "Spectral Synthesis"
 msgstr "Спектральный синтез"
 
-#: modules/process/fft_synth.c:429
+#: modules/process/fft_synth.c:430
 msgid "M_inimum frequency:"
 msgstr "М_инимальная частота:"
 
-#: modules/process/fft_synth.c:449
+#: modules/process/fft_synth.c:430 modules/process/fft_synth.c:450
+msgid "px<sup>-1</sup>"
+msgstr "px<sup>-1</sup>"
+
+#: modules/process/fft_synth.c:450
 msgid "Ma_ximum frequency:"
 msgstr "М_аксимальная частота:"
 
@@ -9827,85 +10103,154 @@ msgstr "Разрешить _лоренцев множитель"
 msgid "Enable _power multiplier"
 msgstr "Разрешить сте_пенной множитель"
 
-#: modules/process/fit-shape.c:270
+#: modules/process/fibre_synth.c:256
+msgid "Semi-circle"
+msgstr "Полукруг"
+
+#: modules/process/fibre_synth.c:257
+msgid "Triangle"
+msgstr "Треугольник"
+
+#: modules/process/fibre_synth.c:258
+msgid "Rectangle"
+msgstr "Прямоугольник"
+
+#: modules/process/fibre_synth.c:260
+msgid "Quadratic spline"
+msgstr "Квадратичный сплайн"
+
+#: modules/process/fibre_synth.c:266
+msgid "Generates surfaces composed from randomly placed fibers."
+msgstr "Генерирует поверхности, состоящие из случайно расположенных волокон."
+
+#: modules/process/fibre_synth.c:280
+msgid "/S_ynthetic/_Deposition/_Fibers..."
+msgstr "/Син_тез/_Осаждение/_Волокна..."
+
+#: modules/process/fibre_synth.c:284
+msgid "Generate surface of randomly placed fibers"
+msgstr "Сгенерировать поверхность из случайно расположенных волокон"
+
+#: modules/process/fibre_synth.c:420
+msgid "Random Fibers"
+msgstr "Случайные волокна"
+
+#: modules/process/fibre_synth.c:494 modules/process/obj_synth.c:510
+msgid "_Shape:"
+msgstr "_Форма:"
+
+#: modules/process/fibre_synth.c:513 modules/process/obj_synth.c:529
+msgid "obj."
+msgstr "объект."
+
+#: modules/process/fibre_synth.c:553
+msgid "Scales _with width"
+msgstr "Мас_штабируется с длиной"
+
+#: modules/process/fibre_synth.c:591 modules/process/synth.h:485
+msgid "Deformation"
+msgstr "Деформация"
+
+#: modules/process/fibre_synth.c:600 modules/process/lno_synth.c:852
+#: modules/process/lno_synth.c:1222 modules/process/mask_noisify.c:177
+msgid "Densi_ty:"
+msgstr "П_лотность:"
+
+#: modules/process/fibre_synth.c:607
+msgid "_Lateral:"
+msgstr "_Горизонтальный масштаб:"
+
+#: modules/process/fibre_synth.c:614
+msgid "Le_ngthwise:"
+msgstr "По _длине:"
+
+#: modules/process/fibre_synth.c:819
+msgid "Along fiber:"
+msgstr "Вдоль волокна:"
+
+#: modules/process/fibre_synth.c:1180
+msgid "Generating fibers..."
+msgstr "Генерация волокон..."
+
+#: modules/process/fit-shape.c:264
 msgid "Fits predefined geometrical shapes to data."
 msgstr "Аппроксимирует данные заданными геометрическими формами."
 
-#: modules/process/fit-shape.c:284
+#: modules/process/fit-shape.c:278
 msgid "/_Level/_Fit Shape..."
 msgstr "/_Выравнивание/Аппроксимировать _фигуру..."
 
-#: modules/process/fit-shape.c:288 modules/process/fit-shape.c:295
+#: modules/process/fit-shape.c:282 modules/process/fit-shape.c:289
 msgid "Fit geometrical shapes"
 msgstr "Аппрокисимровать геометрическими формами"
 
-#: modules/process/fit-shape.c:291
+#: modules/process/fit-shape.c:285
 msgid "/_Fit Shape..."
 msgstr "/_Аппроксимировать форму..."
 
-#: modules/process/fit-shape.c:390
+#: modules/process/fit-shape.c:389
 msgid "Fit Shape"
 msgstr "Аппроксимировать форму"
 
-#: modules/process/fit-shape.c:395
+#: modules/process/fit-shape.c:396
 msgid "verb|_Quick Fit"
 msgstr "_Быстро аппрокс."
 
-#: modules/process/fit-shape.c:473 modules/process/fit-shape.c:2159
+#: modules/process/fit-shape.c:474 modules/process/fit-shape.c:2141
 msgid "Derived Quantities"
 msgstr "Производные величины"
 
-#: modules/process/fit-shape.c:478 modules/process/fit-shape.c:2129
+#: modules/process/fit-shape.c:479 modules/process/fit-shape.c:2111
 msgid "Mean square difference:"
-msgstr "азница:"
+msgstr "Среднеквадратичная разница:"
 
-#: modules/process/fit-shape.c:580 modules/process/fit-shape.c:626
-#: modules/process/fit-shape.c:657 modules/process/fit-shape.c:661
+#: modules/process/fit-shape.c:590 modules/process/fit-shape.c:636
+#: modules/process/fit-shape.c:667 modules/process/fit-shape.c:671
 msgid "Fitted shape"
 msgstr "Аппроксимирующая фигура"
 
-#: modules/process/fit-shape.c:663 modules/process/mark_disconn.c:189
-#: modules/process/scars.c:281
+#: modules/process/fit-shape.c:673 modules/process/mark_disconn.c:189
+#: modules/process/scars.c:299
 msgid "Both"
 msgstr "Оба"
 
-#: modules/process/fit-shape.c:680
+#: modules/process/fit-shape.c:690 modules/process/psf-fit.c:308
 msgid "_Function type:"
 msgstr "Тип _функции:"
 
-#: modules/process/fit-shape.c:708
+#: modules/process/fit-shape.c:720
 msgid "Show differences with _adapted color map"
 msgstr "Показывать различия с _адаптированной шкалой цвета"
 
-#: modules/process/fit-shape.c:720
+#: modules/process/fit-shape.c:732
 msgid "Full fit is _geometric"
 msgstr "_Геометрическая полная аппроксимация"
 
-#: modules/process/fit-shape.c:757
+#: modules/process/fit-shape.c:769
 msgid "Calculate differences for e_xcluded pixels"
 msgstr "Рассчитать различия для _исключенных пикселей"
 
-#: modules/process/fit-shape.c:804
+#: modules/process/fit-shape.c:816
 msgid "_Recalculate Image"
 msgstr "Пе_ресчитать изображение"
 
-#: modules/process/fit-shape.c:811
+#: modules/process/fit-shape.c:823
 msgid "Revert to _Previous Values"
 msgstr "Вернуться к _предыдущим значениям"
 
-#: modules/process/fit-shape.c:1850
+#: modules/process/fit-shape.c:1864
 msgid "Parameter estimation failed"
 msgstr "Оценка параметров закончилась ошибкой"
 
-#: modules/process/fit-shape.c:1853
+#: modules/process/fit-shape.c:1867
 msgid "Fit failed"
 msgstr "Аппроксимация закончилась ошибкой"
 
-#: modules/process/fit-shape.c:1855
+#: modules/process/fit-shape.c:1869
 msgid "Fit was interruped"
 msgstr "Аппроксимация была прервана"
 
-#: modules/process/fit-shape.c:2115
+#: modules/process/fit-shape.c:2097
 msgid "(fixed)"
 msgstr "(фикс.)"
 
@@ -9926,35 +10271,35 @@ msgstr "Выравнивает основание поверхности с вы
 msgid "Polynomial leveling..."
 msgstr "Полиноминальное выравнивание..."
 
-#: modules/process/fraccor.c:38
+#: modules/process/fraccor.c:39
 msgid "Removes data under mask using fractal interpolation."
 msgstr "Убирает данные под маской используя фрактальную интерполяцию."
 
-#: modules/process/fraccor.c:52
+#: modules/process/fraccor.c:53
 msgid "/_Correct Data/_Fractal Correction"
 msgstr "/Исправить _данные/_Фрактальная коррекция"
 
-#: modules/process/fraccor.c:56
+#: modules/process/fraccor.c:57
 msgid "Interpolate data under mask with fractal interpolation"
 msgstr "Интерполировать данные под маской фрактальной интерполяцией"
 
-#: modules/process/fractal.c:134
+#: modules/process/fractal.c:130
 msgid "Partitioning"
 msgstr "Декомпозиция"
 
-#: modules/process/fractal.c:135
+#: modules/process/fractal.c:131
 msgid "Cube counting"
 msgstr "Подсчёт кубов"
 
-#: modules/process/fractal.c:136
+#: modules/process/fractal.c:132
 msgid "Triangulation"
 msgstr "Триангуляция"
 
-#: modules/process/fractal.c:137
+#: modules/process/fractal.c:133
 msgid "Power spectrum"
 msgstr "Спектр мощности"
 
-#: modules/process/fractal.c:173
+#: modules/process/fractal.c:169
 msgid ""
 "Calculates fractal dimension using several methods (partitioning, box "
 "counting, triangulation, power spectrum)."
@@ -9962,54 +10307,50 @@ msgstr ""
 "Рассчитывает фрактальную размерность используя несколько методов (деления на "
 "части, подсчёт ящиков, триангуляция, спектр мощности)."
 
-#: modules/process/fractal.c:188
+#: modules/process/fractal.c:184
 msgid "/_Statistics/_Fractal Dimension..."
 msgstr "/_Статистика/_Фрактальная размерность..."
 
-#: modules/process/fractal.c:192
+#: modules/process/fractal.c:188
 msgid "Calculate fractal dimension"
 msgstr "Рассчитать фрактальную размерность"
 
-#: modules/process/fractal.c:227
+#: modules/process/fractal.c:223
 msgid "Fractal Dimension"
 msgstr "Фрактальная размерность"
 
-#: modules/process/fractal.c:228
-msgid "Reco_mpute"
-msgstr "_Пересчитать"
-
-#: modules/process/fractal.c:269
+#: modules/process/fractal.c:253
 msgid "_Method:"
 msgstr "_Метод:"
 
-#: modules/process/fractal.c:290
+#: modules/process/fractal.c:269
 msgid "Fit Area"
 msgstr "Область аппроксимации"
 
-#: modules/process/fractal.c:295
-msgid "From:"
-msgstr "От:"
-
-#: modules/process/fractal.c:295 modules/process/fractal.c:589
-#: modules/process/fractal.c:613
+#: modules/process/fractal.c:273 modules/process/fractal.c:545
+#: modules/process/fractal.c:569
 msgid "minimum"
 msgstr "минимум"
 
-#: modules/process/fractal.c:298
-msgid "To:"
-msgstr "До:"
+#: modules/process/fractal.c:274
+msgid "From:"
+msgstr "От:"
 
-#: modules/process/fractal.c:298 modules/process/fractal.c:590
-#: modules/process/fractal.c:614
+#: modules/process/fractal.c:279 modules/process/fractal.c:546
+#: modules/process/fractal.c:570
 msgid "maximum"
 msgstr "максимум"
 
-#: modules/process/fractal.c:308 modules/process/mark_with.c:390
-#: modules/process/neural.c:559
+#: modules/process/fractal.c:280
+msgid "To:"
+msgstr "До:"
+
+#: modules/process/fractal.c:287 modules/process/mark_with.c:394
+#: modules/process/neural.c:563
 msgid "Result"
 msgstr "Результат"
 
-#: modules/process/fractal.c:550
+#: modules/process/fractal.c:506
 msgid "Linear fit"
 msgstr "Линейная аппроксимация"
 
@@ -10081,11 +10422,11 @@ msgstr ""
 msgid "Grain Correlations"
 msgstr "Корреляции зёрен"
 
-#: modules/process/grain_cross.c:240
+#: modules/process/grain_cross.c:241
 msgid "_Abscissa"
 msgstr "_Абсцисса"
 
-#: modules/process/grain_cross.c:244
+#: modules/process/grain_cross.c:245
 msgid "O_rdinate"
 msgstr "О_рдината"
 
@@ -10113,119 +10454,119 @@ msgstr "Строить _графики"
 msgid "Grain Distributions"
 msgstr "Распределения зёрен"
 
-#: modules/process/grain_dist.c:553
+#: modules/process/grain_dist.c:547
 msgid "count"
 msgstr "число"
 
-#: modules/process/grain_dist.c:617
+#: modules/process/grain_dist.c:611
 msgid "Export Raw Grain Values"
 msgstr "Экспортировать необработанные значения зёрен"
 
-#: modules/process/grain_edge.c:100
+#: modules/process/grain_edge.c:99
 msgid "Marks grains by edge detection method."
 msgstr "Помечает зёрна алгоритмом нахождения краёв."
 
-#: modules/process/grain_edge.c:114
+#: modules/process/grain_edge.c:113
 msgid "/_Grains/Mark by _Edge Detection..."
 msgstr "/Зёрн_а/Пометить по кра_ю..."
 
-#: modules/process/grain_edge.c:118
+#: modules/process/grain_edge.c:117
 msgid "Mark grains with edge detection mechanism"
 msgstr "Пометить зёрна с помощью поиска края"
 
-#: modules/process/grain_edge.c:207
+#: modules/process/grain_edge.c:206
 msgid "Mark Grains by Edge Detection"
 msgstr "Пометить зёрна по краю"
 
-#: modules/process/grain_edge.c:245
+#: modules/process/grain_edge.c:244
 msgid "Threshold"
 msgstr "Порог"
 
-#: modules/process/grain_edge.c:249
+#: modules/process/grain_edge.c:248
 msgid "_Laplacian:"
 msgstr "_Лапласиан:"
 
-#: modules/process/grain_filter.c:195
+#: modules/process/grain_filter.c:194
 msgid ""
 "Filters grains by their properties, using logical expressions and thresholds."
 msgstr ""
 "Фильтрует зёрна по их свойствам, используя логические выражения и пороги"
 
-#: modules/process/grain_filter.c:210
+#: modules/process/grain_filter.c:209
 msgid "/_Grains/_Filter..."
 msgstr "/Зёрн_а/_Фильтр..."
 
-#: modules/process/grain_filter.c:214
+#: modules/process/grain_filter.c:213
 msgid "Filter grains by their properties"
 msgstr "Фильтровать зёрна по свойствам"
 
-#: modules/process/grain_filter.c:254
+#: modules/process/grain_filter.c:253
 msgid "There are no grains to filter."
 msgstr "Нет зёрен, которые можно отфильтровать"
 
-#: modules/process/grain_filter.c:310
+#: modules/process/grain_filter.c:309
 msgid "Filter Grains"
 msgstr "Фильтровать зёрна"
 
-#: modules/process/grain_filter.c:405
+#: modules/process/grain_filter.c:404
 msgid "Set selected as:"
 msgstr "Установить выбранное как:"
 
-#: modules/process/grain_filter.c:420
+#: modules/process/grain_filter.c:419
 msgid "Keep grains satisfying:"
 msgstr "Оставлять зёрна, удовлетворяющие:"
 
-#: modules/process/grain_filter.c:434 modules/process/lat_synth.c:733
+#: modules/process/grain_filter.c:440 modules/process/lat_synth.c:733
 msgid "Lower threshold:"
 msgstr "Нижний порог:"
 
-#: modules/process/grain_filter.c:469 modules/process/lat_synth.c:740
+#: modules/process/grain_filter.c:467 modules/process/lat_synth.c:740
 msgid "Upper threshold:"
 msgstr "Верхний порог:"
 
 #. TRANSLATORS: %c is replaced with quantity label A, B or C.
-#: modules/process/grain_filter.c:645
+#: modules/process/grain_filter.c:628
 #, c-format
 msgid "Condition %c: %s"
 msgstr "Условие %c: %s"
 
-#: modules/process/grain_mark.c:139
+#: modules/process/grain_mark.c:137
 msgid "Marks grains by thresholding (height, slope, curvature)."
 msgstr "Помечает зёрна по порогу (высоты, размера)."
 
-#: modules/process/grain_mark.c:153
+#: modules/process/grain_mark.c:151
 msgid "/_Grains/_Mark by Threshold..."
 msgstr "/Зёрн_а/Пометить по _порогу..."
 
-#: modules/process/grain_mark.c:157
+#: modules/process/grain_mark.c:155
 msgid "Mark grains by threshold"
 msgstr "Пометить зёрна по пороговому значению"
 
-#: modules/process/grain_mark.c:241
+#: modules/process/grain_mark.c:240
 msgid "Mark Grains by Threshold"
 msgstr "Пометить зёрна по пороговому значению"
 
-#: modules/process/grain_mark.c:281
+#: modules/process/grain_mark.c:280
 msgid "Threshold by"
 msgstr "Пороговое значение"
 
-#: modules/process/grain_mark.c:311
+#: modules/process/grain_mark.c:310
 msgid "_Slope:"
 msgstr "_Уклон:"
 
-#: modules/process/grain_mark.c:315
+#: modules/process/grain_mark.c:314
 msgid "_Curvature:"
 msgstr "_Кривизна:"
 
-#: modules/process/grain_mark.c:324
-msgid "Criteria combination:"
-msgstr "Критерии объединения:"
-
-#: modules/process/grain_mark.c:328 modules/process/grain_wshed.c:256
+#: modules/process/grain_mark.c:319 modules/process/grain_wshed.c:260
 #: modules/process/wpour_mark.c:358
 msgid "_Invert height"
 msgstr "_Инвертировать высоту"
 
+#: modules/process/grain_mark.c:328
+msgid "Criteria combination:"
+msgstr "Критерии объединения:"
+
 #: modules/process/grain_stat.c:54
 msgid "Displays overall grain statistics."
 msgstr "Показывает общую статистику зёрен."
@@ -10302,418 +10643,427 @@ msgstr "Общий объём зерна (по Лапласу):"
 msgid "Total projected boundary length:"
 msgstr "Общая длина проекции границы:"
 
-#: modules/process/grain_wshed.c:101
+#: modules/process/grain_wshed.c:102
 msgid "Marks grains by watershed algorithm."
 msgstr "Помечает зёрна по алгоритму водораздела."
 
-#: modules/process/grain_wshed.c:115
+#: modules/process/grain_wshed.c:116
 msgid "/_Grains/Mark by _Watershed..."
 msgstr "/Зёрн_а/Пометить по _водоразделу..."
 
-#: modules/process/grain_wshed.c:119
+#: modules/process/grain_wshed.c:120
 msgid "Mark grains by watershed"
 msgstr "Пометить зёрна по водоразделу"
 
-#: modules/process/grain_wshed.c:161
+#: modules/process/grain_wshed.c:162
 msgid "Mark Grains by Watershed"
 msgstr "Пометить зёрна по водоразделу"
 
-#: modules/process/grain_wshed.c:199
+#: modules/process/grain_wshed.c:200
 msgid "Grain Location"
 msgstr "Поиск зёрен"
 
-#: modules/process/grain_wshed.c:214
+#: modules/process/grain_wshed.c:216
 msgid "_Drop size:"
 msgstr "_Размер капли:"
 
-#: modules/process/grain_wshed.c:230
+#: modules/process/grain_wshed.c:233
 msgid "Segmentation"
 msgstr "Сегментация"
 
-#: modules/process/grain_wshed.c:236
+#: modules/process/grain_wshed.c:239
 msgid "Num_ber of steps:"
 msgstr "Число _шагов:"
 
-#: modules/process/grain_wshed.c:244
+#: modules/process/grain_wshed.c:248
 msgid "Dr_op size:"
 msgstr "Размер _капли:"
 
-#: modules/process/grain_wshed.c:435
+#: modules/process/grain_wshed.c:439
 msgid "Finding minima..."
 msgstr "Поиск минимумов..."
 
-#: modules/process/grain_wshed.c:437
+#: modules/process/grain_wshed.c:441
 msgid "Locating..."
 msgstr "Поиск..."
 
-#: modules/process/grain_wshed.c:439
+#: modules/process/grain_wshed.c:443
 msgid "Simulating watershed..."
 msgstr "Моделируется водораздел..."
 
-#: modules/process/grain_wshed.c:441
+#: modules/process/grain_wshed.c:445
 msgid "Marking boundaries..."
 msgstr "Помечаются границы..."
 
-#: modules/process/hough.c:74
+#: modules/process/hough.c:76
 msgid "Hough transform."
 msgstr "Преобразование Хафа."
 
-#: modules/process/hough.c:88
+#: modules/process/hough.c:90
 msgid "/_Integral Transforms/_Hough..."
 msgstr "/_Интегральные преобразования/преобразование _Хафа"
 
-#: modules/process/hough.c:92
+#: modules/process/hough.c:94
 msgid "Compute Hough transform"
 msgstr "Рассчитать преобразование Хафа."
 
-#: modules/process/hough.c:178
+#: modules/process/hough.c:137
+msgid "Hough line"
+msgstr "Линия Хафа"
+
+#: modules/process/hough.c:141
+#, c-format
+msgid "Hough circle r=%d"
+msgstr "Окружность Хафа r=%d"
+
+#: modules/process/hough.c:173
 msgid "Hough Transform"
 msgstr "Преобразование Хафа"
 
-#: modules/process/hough.c:201
+#: modules/process/hough.c:195
 msgid "_Transform type:"
 msgstr "_Тип преобразования:"
 
-#: modules/process/hough.c:212
+#: modules/process/hough.c:203
 msgid "_Circle size:"
 msgstr "Размер _круга:"
 
-#: modules/process/immerse.c:162
+#: modules/process/immerse.c:163
 msgid "Immerse high resolution detail into overall image."
 msgstr "Встраивает фрагмент с высоким разрешением в общее изображение."
 
-#: modules/process/immerse.c:176
+#: modules/process/immerse.c:177
 msgid "/M_ultidata/_Immerse Detail..."
 msgstr "/М_ножественные данные/Встроить _фрагмент..."
 
-#: modules/process/immerse.c:180
+#: modules/process/immerse.c:181
 msgid "Immerse a detail into image"
 msgstr "Встраивает более подробный фрагмент в изображение"
 
-#: modules/process/immerse.c:222
+#: modules/process/immerse.c:223
 msgid "Immerse Detail"
 msgstr "Встроить фрагмент"
 
-#: modules/process/immerse.c:225
+#: modules/process/immerse.c:226
 msgid "_Locate"
 msgstr "Н_айти"
 
-#: modules/process/immerse.c:227
+#: modules/process/immerse.c:228
 msgid "Locate detail by full image correlation search"
 msgstr "Найти фрагмент корреляционным поиском по всему изображению"
 
-#: modules/process/immerse.c:229
+#: modules/process/immerse.c:230
 msgid "_Improve"
 msgstr "У_точнить"
 
-#: modules/process/immerse.c:231
+#: modules/process/immerse.c:232
 msgid "Improve detail position by correlation search in neighborhood"
 msgstr "Уточнить положение фрагмента корреляционным поиском в окрестности"
 
-#: modules/process/immerse.c:290
+#: modules/process/immerse.c:291
 msgid "_Detail image:"
 msgstr "Изображение _фрагмента:"
 
-#: modules/process/immerse.c:295
+#: modules/process/immerse.c:296
 msgid "Position:"
 msgstr "Расположение:"
 
-#: modules/process/immerse.c:308
+#: modules/process/immerse.c:314
 msgid "Result Sampling"
 msgstr "Разрешение результата"
 
-#: modules/process/immerse.c:318
+#: modules/process/immerse.c:324
 msgid "_Upsample large image"
 msgstr "_Увеличить разрешение большого изображения"
 
-#: modules/process/immerse.c:320
+#: modules/process/immerse.c:326
 msgid "_Downsample detail"
 msgstr "Сн_изить разрешение фрагмента"
 
-#: modules/process/immerse.c:329
+#: modules/process/immerse.c:335
 msgid "Detail Leveling"
 msgstr "Выравнивание фрагмента"
 
-#: modules/process/immerse.c:339
+#: modules/process/immerse.c:345
 msgid "levelling|_None"
 msgstr "_Нет"
 
-#: modules/process/immerse.c:341
+#: modules/process/immerse.c:347
 msgid "_Mean value"
 msgstr "_Среднее значение"
 
-#: modules/process/immerse.c:349
+#: modules/process/immerse.c:355
 msgid "Show _frame"
 msgstr "Показывать _рамку"
 
-#: modules/process/immerse.c:787
+#: modules/process/immerse.c:793
 msgid "Immersed detail"
 msgstr "Встроенный фрагмент"
 
-#: modules/process/indent_analyze.c:261
+#: modules/process/indent_analyze.c:246
 msgid "Do nothing"
 msgstr "Ничего не делать"
 
-#: modules/process/indent_analyze.c:262
+#: modules/process/indent_analyze.c:247
 msgid "Plane level"
 msgstr "Выравнивание плоскости"
 
-#: modules/process/indent_analyze.c:263
+#: modules/process/indent_analyze.c:248
 msgid "Plane rotate"
 msgstr "Поворот плоскости"
 
-#: modules/process/indent_analyze.c:267
+#: modules/process/indent_analyze.c:252
 msgid "New"
 msgstr "Новая"
 
-#: modules/process/indent_analyze.c:268
+#: modules/process/indent_analyze.c:253
 msgid "AND"
 msgstr "И"
 
-#: modules/process/indent_analyze.c:269
+#: modules/process/indent_analyze.c:254
 msgid "OR"
 msgstr "ИЛИ"
 
-#: modules/process/indent_analyze.c:270
+#: modules/process/indent_analyze.c:255
 msgid "NOT"
 msgstr "НЕ"
 
-#: modules/process/indent_analyze.c:271
+#: modules/process/indent_analyze.c:256
 msgid "XOR"
 msgstr "Исключающее ИЛИ"
 
-#: modules/process/indent_analyze.c:275
+#: modules/process/indent_analyze.c:260
 msgid "Nothing"
 msgstr "Ничего"
 
-#: modules/process/indent_analyze.c:276
+#: modules/process/indent_analyze.c:261
 msgid "Above"
 msgstr "Выше"
 
-#: modules/process/indent_analyze.c:277
+#: modules/process/indent_analyze.c:262
 msgid "Below"
 msgstr "Снизу"
 
-#: modules/process/indent_analyze.c:278
+#: modules/process/indent_analyze.c:263
 msgid "Plane"
 msgstr "Плоскость"
 
-#: modules/process/indent_analyze.c:279
+#: modules/process/indent_analyze.c:264
 msgid "Impression"
 msgstr "Отпечаток"
 
-#: modules/process/indent_analyze.c:280
+#: modules/process/indent_analyze.c:265
 msgid "Inner Pile-up"
 msgstr "Внутреннее выдавливание"
 
-#: modules/process/indent_analyze.c:281
+#: modules/process/indent_analyze.c:266
 msgid "Outer Pile-up"
 msgstr "Внешнее выдавливание"
 
-#: modules/process/indent_analyze.c:282
+#: modules/process/indent_analyze.c:267
 msgid "Special points"
 msgstr "Особые точки"
 
-#: modules/process/indent_analyze.c:283
+#: modules/process/indent_analyze.c:268
 msgid "Faces border"
 msgstr "Границы граней"
 
-#: modules/process/indent_analyze.c:287
+#: modules/process/indent_analyze.c:272
 msgid "Vickers"
 msgstr "Виккерса"
 
-#: modules/process/indent_analyze.c:288
+#: modules/process/indent_analyze.c:273
 msgid "Berkovich"
 msgstr "Берковича"
 
-#: modules/process/indent_analyze.c:289
+#: modules/process/indent_analyze.c:274
 msgid "Berkovich (modified)"
 msgstr "Берковича (изменённый)"
 
-#: modules/process/indent_analyze.c:290
+#: modules/process/indent_analyze.c:275
 msgid "Knoop"
 msgstr "Кнупа"
 
-#: modules/process/indent_analyze.c:291
+#: modules/process/indent_analyze.c:276
 msgid "Brinell"
 msgstr "Бринеля"
 
-#: modules/process/indent_analyze.c:292
+#: modules/process/indent_analyze.c:277
 msgid "Cube corner"
 msgstr "Угол куба"
 
-#: modules/process/indent_analyze.c:293
+#: modules/process/indent_analyze.c:278
 msgid "Rockwell"
 msgstr "Роквелла"
 
-#: modules/process/indent_analyze.c:303
+#: modules/process/indent_analyze.c:288
 msgid "Analyses nanoindentation structure (volumes, surfaces, ...)."
 msgstr ""
 "Анализирует структуру отпечатка при исследовании твёрдости (объёмы, "
 "поверхности, ...)."
 
-#: modules/process/indent_analyze.c:320
+#: modules/process/indent_analyze.c:302
 msgid "/_Tip and Indentation/_Analyze Imprint..."
 msgstr "/_Зонд и индентация/_Анализировать отпечаток..."
 
-#: modules/process/indent_analyze.c:439
+#: modules/process/indent_analyze.c:410
 msgid "Marked _areas:"
 msgstr "Помеченные обл_асти:"
 
-#: modules/process/indent_analyze.c:445
+#: modules/process/indent_analyze.c:419
 msgid "_Indentor type:"
 msgstr "Тип _индентора:"
 
-#: modules/process/indent_analyze.c:451
+#: modules/process/indent_analyze.c:428
 msgid "_Mask creation type:"
 msgstr "Тип создания _маски:"
 
-#: modules/process/indent_analyze.c:456
+#: modules/process/indent_analyze.c:434
 msgid "Ref. plane _tolerance:"
 msgstr "_Допуск базовой плоскости:"
 
-#: modules/process/indent_analyze.c:460
+#: modules/process/indent_analyze.c:438
 msgid "Angle _1 tolerance:"
 msgstr "Допуск угла _1:"
 
-#: modules/process/indent_analyze.c:485
+#: modules/process/indent_analyze.c:456
 msgid "Indent center at"
 msgstr "Центр отпечатка:"
 
-#: modules/process/indent_analyze.c:488
+#: modules/process/indent_analyze.c:460
 msgid "Maximum at"
 msgstr "Максимум в"
 
-#: modules/process/indent_analyze.c:491
+#: modules/process/indent_analyze.c:464
 msgid "Max-min difference"
 msgstr "Разница max-min"
 
-#: modules/process/indent_analyze.c:497
+#: modules/process/indent_analyze.c:472
 msgid "Expected A<sub>d</sub>:"
 msgstr "Ожидаемое A<sub>d</sub>:"
 
-#: modules/process/indent_analyze.c:505
+#: modules/process/indent_analyze.c:479
 msgid "Expected A<sub>p</sub>:"
 msgstr "Ожидаемое A<sub>p</sub>:"
 
-#: modules/process/indent_analyze.c:549
+#: modules/process/indent_analyze.c:489
 msgid "Volume above-below"
 msgstr "Объём выше-ниже"
 
-#: modules/process/indent_analyze.c:558
+#: modules/process/indent_analyze.c:494
 msgid "Indent. volume"
 msgstr "Объём отпечатка"
 
-#: modules/process/indent_analyze.c:564
+#: modules/process/indent_analyze.c:502
 msgid "Indent. A<sub>d</sub>"
 msgstr "A<sub>d</sub> индент."
 
-#: modules/process/indent_analyze.c:573
+#: modules/process/indent_analyze.c:509
 msgid "Indent. A<sub>p</sub>"
 msgstr "A<sub>p</sub> индент."
 
-#: modules/process/indent_analyze.c:587
+#: modules/process/indent_analyze.c:517
 msgid "Inner Pile-Up A<sub>d</sub>"
 msgstr "A<sub>d</sub> внутр. выдавливания"
 
-#: modules/process/indent_analyze.c:596
+#: modules/process/indent_analyze.c:525
 msgid "Inner Pile-Up A<sub>p</sub>"
 msgstr "A<sub>p</sub> внутр. выдавливания"
 
-#: modules/process/indent_analyze.c:605
+#: modules/process/indent_analyze.c:533
 msgid "Outer Pile-Up A<sub>d</sub>"
 msgstr "A<sub>d</sub> внешнего выдавливания"
 
-#: modules/process/indent_analyze.c:614
+#: modules/process/indent_analyze.c:541
 msgid "Outer Pile-Up A<sub>p</sub>"
 msgstr "A<sub>p</sub> внешнего выдавливания"
 
-#: modules/process/indent_analyze.c:644
+#: modules/process/indent_analyze.c:569
 msgid "Indentation statistics"
 msgstr "Статистика индентации"
 
-#: modules/process/indent_analyze.c:645
+#: modules/process/indent_analyze.c:570
 msgid "_Compute & mark"
 msgstr "_Рассчитать и пометить"
 
-#: modules/process/indent_analyze.c:646
+#: modules/process/indent_analyze.c:571
 msgid "_Save statistics"
 msgstr "_Сохранить статистику"
 
-#: modules/process/indent_analyze.c:1569
+#: modules/process/indent_analyze.c:1392
 msgid "No statistics has been computed yet."
 msgstr "Статистика ещё не рассчитывалась."
 
-#: modules/process/indent_analyze.c:1577
+#: modules/process/indent_analyze.c:1400
 msgid "Save Indentation Statistics"
 msgstr "Сохранить статистику индентации"
 
-#: modules/process/indent_analyze.c:1615
+#: modules/process/indent_analyze.c:1438
 #, c-format
 msgid "Indentor:  %s\n"
 msgstr "Индентор:  %s\n"
 
-#: modules/process/indent_analyze.c:1619
+#: modules/process/indent_analyze.c:1442
 #, c-format
 msgid "Length units: %s\n"
 msgstr "Единицы длины: %s\n"
 
-#: modules/process/indent_analyze.c:1621
+#: modules/process/indent_analyze.c:1444
 #, c-format
 msgid "Indentation center at [%d, %d] px:      %lf\n"
 msgstr "Центр индентации в [%d, %d] пикс.:      %lf\n"
 
-#: modules/process/indent_analyze.c:1623
+#: modules/process/indent_analyze.c:1446
 #, c-format
 msgid "Maximum at [%d, %d] is:                 %lf\n"
 msgstr "Максимум в [%d, %d] равен:                 %lf\n"
 
-#: modules/process/indent_analyze.c:1625
+#: modules/process/indent_analyze.c:1448
 #, c-format
 msgid "Difference max-min:                     %lf\n"
 msgstr "Разница max-min:                      %lf\n"
 
-#: modules/process/indent_analyze.c:1630
+#: modules/process/indent_analyze.c:1453
 #, c-format
 msgid "Area (projected) above plane:             %g (%.1lf %%)\n"
 msgstr "Площадь (проекции) выше плоскости:             %g (%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1634
+#: modules/process/indent_analyze.c:1457
 #, c-format
 msgid "Area (projected) below plane:             %g (%.1lf %%)\n"
 msgstr "Площадь (проекции) ниже плоскости:             %g (%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1638
+#: modules/process/indent_analyze.c:1461
 #, c-format
 msgid "Area (projected) of    plane:             %g (%.1lf %%)\n"
 msgstr "Площадь (проекции) плоскости:             %g (%.1lf %%)\n"
 
-#: modules/process/indent_analyze.c:1643
+#: modules/process/indent_analyze.c:1466
 #, c-format
 msgid "Area (developed) above %g (+%.1f %%)\n"
 msgstr "Площадь (развернутая) выше %g (+%.1f %%)\n"
 
-#: modules/process/indent_analyze.c:1646
+#: modules/process/indent_analyze.c:1469
 #, c-format
 msgid "Area (developed) below %g (+%.1lf %%)\n"
 msgstr "Площадь (развернутая) ниже %g (+%.1f %%)\n"
 
-#: modules/process/indent_analyze.c:1650
+#: modules/process/indent_analyze.c:1473
 #, c-format
 msgid "Volume above:     %g\n"
 msgstr "Объём выше:     %g\n"
 
-#: modules/process/indent_analyze.c:1652
+#: modules/process/indent_analyze.c:1475
 #, c-format
 msgid "Volume below:     %g\n"
 msgstr "Объём ниже:     %g\n"
 
-#: modules/process/indent_analyze.c:1654
+#: modules/process/indent_analyze.c:1477
 #, c-format
 msgid "Volume difference %g\n"
 msgstr "Разница объёмов %g\n"
 
-#: modules/process/indent_analyze.c:1658
+#: modules/process/indent_analyze.c:1481
 msgid ""
 "\n"
 "Indentation\n"
@@ -10721,12 +11071,12 @@ msgstr ""
 "\n"
 "Индентация\n"
 
-#: modules/process/indent_analyze.c:1659
+#: modules/process/indent_analyze.c:1482
 #, c-format
 msgid "Volume      %g\n"
 msgstr "Объём      %g\n"
 
-#: modules/process/indent_analyze.c:1664
+#: modules/process/indent_analyze.c:1487
 msgid ""
 "\n"
 "Indentation - Inner Pile-Up\n"
@@ -10734,7 +11084,7 @@ msgstr ""
 "\n"
 "Индентация - внутреннее выдавливание\n"
 
-#: modules/process/indent_analyze.c:1670
+#: modules/process/indent_analyze.c:1493
 msgid "Indentation - Outer Pile-Up\n"
 msgstr "Индентация - внешнее выдавливание\n"
 
@@ -10843,11 +11193,6 @@ msgstr "Пенроуза (центры)"
 msgid "_Lattice:"
 msgstr "_Решетка:"
 
-#: modules/process/lat_synth.c:651 modules/process/obj_synth.c:544
-#: modules/process/pat_synth.c:1457
-msgid "_Size:"
-msgstr "Р_азмер:"
-
 #: modules/process/lat_synth.c:662
 msgid "Lattice rela_xation:"
 msgstr "Рела_ксация решетки:"
@@ -10986,7 +11331,7 @@ msgstr ""
 
 #: modules/process/level_grains.c:187 modules/process/median-bg.c:167
 #: modules/process/polylevel.c:293 modules/process/polylevel.c:417
-#: modules/process/sphere-revolve.c:200
+#: modules/process/sphere-revolve.c:221 modules/process/sphere-revolve.c:295
 msgid "Background"
 msgstr "Фон"
 
@@ -10998,150 +11343,150 @@ msgstr "Выровнять зёрна"
 msgid "Quantity to level:"
 msgstr "Величина:"
 
-#: modules/process/level_grains.c:231 modules/process/linematch.c:866
-#: modules/process/median-bg.c:217 modules/process/polylevel.c:482
-#: modules/process/sphere-revolve.c:263
+#: modules/process/level_grains.c:231 modules/process/linematch.c:834
+#: modules/process/median-bg.c:217 modules/process/polylevel.c:485
+#: modules/process/sphere-revolve.c:371
 msgid "E_xtract background"
 msgstr "_Извлечь фон"
 
-#: modules/process/linecorrect.c:54
+#: modules/process/linecorrect.c:52
 msgid "Corrects line defects (mostly experimental algorithms)."
 msgstr "Исправление дефектов линий (большая часть алгоритмов экспериментальна)"
 
-#: modules/process/linecorrect.c:68
+#: modules/process/linecorrect.c:66
 msgid "/_Correct Data/Ste_p Line Correction"
 msgstr "/Исправить _данные/Линейная коррекция _ступенек"
 
-#: modules/process/linecorrect.c:72
+#: modules/process/linecorrect.c:70
 msgid "Correct steps in lines"
 msgstr "Исправить ступеньки в линиях"
 
-#: modules/process/linematch.c:158 modules/tools/linestats.c:166
+#: modules/process/linematch.c:155 modules/tools/linestats.c:166
 #: modules/volume/volume_linestat.c:143
 msgid "Median"
 msgstr "Срединное"
 
-#: modules/process/linematch.c:159
+#: modules/process/linematch.c:156
 msgid "Median of differences"
 msgstr "Срединное разностей"
 
-#: modules/process/linematch.c:160
+#: modules/process/linematch.c:157
 msgid "Modus"
 msgstr "Мода высоты"
 
-#: modules/process/linematch.c:161
+#: modules/process/linematch.c:158
 msgid "linematch|Matching"
 msgstr "Соответствие"
 
-#: modules/process/linematch.c:162
+#: modules/process/linematch.c:159
 msgid "linematch|Polynomial"
 msgstr "Полиномиальное"
 
-#: modules/process/linematch.c:168
+#: modules/process/linematch.c:165
 msgid "Aligns rows by various methods."
 msgstr "Выравнивает строки различными методами"
 
-#: modules/process/linematch.c:182
+#: modules/process/linematch.c:179
 msgid "/_Correct Data/_Align rows..."
 msgstr "/Исправить _данные/Выровнять _строки..."
 
-#: modules/process/linematch.c:186
+#: modules/process/linematch.c:183
 msgid "Align rows using various methods"
 msgstr "Выровнять строки используя различные методы"
 
-#: modules/process/linematch.c:237 modules/process/linematch.c:265
+#: modules/process/linematch.c:234 modules/process/linematch.c:262
 msgid "Row background"
 msgstr "Фон строчек"
 
-#: modules/process/linematch.c:266
+#: modules/process/linematch.c:263
 msgid "Vertical position"
 msgstr "Положение по вертикали"
 
-#: modules/process/linematch.c:267
+#: modules/process/linematch.c:264
 msgid "Corrected offset"
 msgstr "Исправленное смещение"
 
-#: modules/process/linematch.c:802
+#: modules/process/linematch.c:769
 msgid "Align Rows"
 msgstr "Выровнять строки"
 
-#: modules/process/linematch.c:844
+#: modules/process/linematch.c:810
 msgid "_Polynomial degree:"
 msgstr "Степень _полинома:"
 
-#: modules/process/linematch.c:876
+#: modules/process/linematch.c:844
 msgid "Plot background _graph"
 msgstr "Строить график _фона"
 
-#: modules/process/lno_synth.c:261 modules/process/noise_synth.c:188
+#: modules/process/lno_synth.c:259 modules/process/noise_synth.c:186
 msgid "distribution|Triangular"
 msgstr "Треугольное"
 
-#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:213
+#: modules/process/lno_synth.c:265 modules/process/pat_synth.c:213
 msgid "Steps"
 msgstr "Ступеньки"
 
-#: modules/process/lno_synth.c:268
+#: modules/process/lno_synth.c:266
 msgid "Scars"
 msgstr "Царапины"
 
-#: modules/process/lno_synth.c:269 modules/process/pat_synth.c:214
+#: modules/process/lno_synth.c:267 modules/process/pat_synth.c:214
 msgid "Ridges"
 msgstr "Борозды"
 
-#: modules/process/lno_synth.c:275
+#: modules/process/lno_synth.c:273
 msgid "Generates various kinds of line noise."
 msgstr "Генерирует различные виды линейного шума."
 
-#: modules/process/lno_synth.c:289
+#: modules/process/lno_synth.c:287
 msgid "/S_ynthetic/_Line Noise..."
 msgstr "/Син_тез/_Линейный Шум..."
 
-#: modules/process/lno_synth.c:293
+#: modules/process/lno_synth.c:291
 msgid "Generate line noise"
 msgstr "Генерация линейного шума"
 
-#: modules/process/lno_synth.c:431
+#: modules/process/lno_synth.c:429
 msgid "Line Noise"
 msgstr "Линейный шум"
 
-#: modules/process/lno_synth.c:504
+#: modules/process/lno_synth.c:502
 msgid "Distribution"
 msgstr "Распределение"
 
-#: modules/process/lno_synth.c:514 modules/process/noise_synth.c:414
-msgid "Direction:"
-msgstr "Направление:"
+#: modules/process/lno_synth.c:512 modules/process/mask_noisify.c:158
+#: modules/process/noise_synth.c:412
+msgid "Noise type:"
+msgstr "Тип шума:"
 
-#: modules/process/lno_synth.c:523 modules/process/noise_synth.c:423
+#: modules/process/lno_synth.c:521 modules/process/mask_noisify.c:167
+#: modules/process/noise_synth.c:421
 msgid "S_ymmetrical"
 msgstr "Си_мметрично"
 
-#: modules/process/lno_synth.c:524 modules/process/noise_synth.c:424
+#: modules/process/lno_synth.c:522 modules/process/mask_noisify.c:168
+#: modules/process/noise_synth.c:422
 msgid "One-sided _positive"
 msgstr "В одну _положительную сторону"
 
-#: modules/process/lno_synth.c:525 modules/process/noise_synth.c:425
+#: modules/process/lno_synth.c:523 modules/process/mask_noisify.c:169
+#: modules/process/noise_synth.c:423
 msgid "One-sided _negative"
 msgstr "В одну отр_ицательною сторону"
 
-#: modules/process/lno_synth.c:546
+#: modules/process/lno_synth.c:544
 msgid "Noise Type"
 msgstr "Тип шума"
 
-#: modules/process/lno_synth.c:551
+#: modules/process/lno_synth.c:549
 msgid "_Noise type:"
 msgstr "Тип _шума:"
 
-#: modules/process/lno_synth.c:853 modules/process/lno_synth.c:1222
-msgid "Densi_ty:"
-msgstr "П_лотность:"
-
-#: modules/process/lno_synth.c:864 modules/process/lno_synth.c:1233
+#: modules/process/lno_synth.c:863 modules/process/lno_synth.c:1233
 msgid "_Within line:"
 msgstr "_В пределах линии:"
 
-#: modules/process/lno_synth.c:871
+#: modules/process/lno_synth.c:870
 msgid "C_umulative"
 msgstr "К_умулятивный"
 
@@ -11197,31 +11542,31 @@ msgstr "_Использовать регрессию"
 msgid "_Train logistic regression"
 msgstr "_Обучить регрессию"
 
-#: modules/process/logistic.c:275
+#: modules/process/logistic.c:274
 msgid "_Gaussian blur"
 msgstr "_Гауссово размытие"
 
-#: modules/process/logistic.c:288
+#: modules/process/logistic.c:285
 msgid "_Number of Gaussians:"
 msgstr "_Число гауссиан:"
 
-#: modules/process/logistic.c:296
+#: modules/process/logistic.c:293
 msgid "_Sobel derivatives"
 msgstr "Производные _Собеля"
 
-#: modules/process/logistic.c:307
+#: modules/process/logistic.c:303
 msgid "_Laplacian"
 msgstr "_Лапласиан"
 
-#: modules/process/logistic.c:318
+#: modules/process/logistic.c:313
 msgid "_Hessian"
 msgstr "_Гессиан"
 
-#: modules/process/logistic.c:331
+#: modules/process/logistic.c:325
 msgid "_Regularization parameter:"
 msgstr "Параметр _регуляризации:"
 
-#: modules/process/logistic.c:623 modules/process/neural.c:1101
+#: modules/process/logistic.c:616 modules/process/neural.c:1108
 msgid "Training..."
 msgstr "Обучение..."
 
@@ -11237,13 +11582,13 @@ msgstr "/_Исправить данные/Маска _несвязанного..
 msgid "Mark data disconnected from other values"
 msgstr "Пометить данные, не связанные с другими значениями"
 
-#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:422
-#: modules/process/scars.c:279
+#: modules/process/mark_disconn.c:187 modules/process/obj_synth.c:419
+#: modules/process/scars.c:297
 msgid "Positive"
 msgstr "Положительные"
 
-#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:423
-#: modules/process/scars.c:280
+#: modules/process/mark_disconn.c:188 modules/process/obj_synth.c:420
+#: modules/process/scars.c:298
 msgid "Negative"
 msgstr "Отрицательные"
 
@@ -11259,11 +11604,11 @@ msgstr "Тип дефекта:"
 msgid "Defect _radius:"
 msgstr "_Радиус дефекта:"
 
-#: modules/process/mark_disconn.c:563
+#: modules/process/mark_disconn.c:552
 msgid "Filtering..."
 msgstr "Фильтрация..."
 
-#: modules/process/mark_disconn.c:590
+#: modules/process/mark_disconn.c:579
 msgid "Marking outliers..."
 msgstr "Помечаются выпадающие области..."
 
@@ -11279,55 +11624,59 @@ msgstr "/_Маска/_Пометить с помощью..."
 msgid "Mask combining and modification"
 msgstr "Изменение и комбинирование масок"
 
-#: modules/process/mark_with.c:192
+#: modules/process/mark_with.c:193
 msgid "Mark With"
 msgstr "Пометить с помощью"
 
-#: modules/process/mark_with.c:238
+#: modules/process/mark_with.c:231 modules/process/mask_morph.c:209
+msgid "Operation:"
+msgstr "Операция:"
+
+#: modules/process/mark_with.c:239
 msgid "Se_t mask"
 msgstr "_Установить маску"
 
-#: modules/process/mark_with.c:239
+#: modules/process/mark_with.c:240
 msgid "_Add mask"
 msgstr "_Добавить маску"
 
-#: modules/process/mark_with.c:240
+#: modules/process/mark_with.c:241
 msgid "_Subtract mask"
 msgstr "_Вычесть маску"
 
-#: modules/process/mark_with.c:241
+#: modules/process/mark_with.c:242
 msgid "_Intersect masks"
 msgstr "_Пересечение масок"
 
-#: modules/process/mark_with.c:247
+#: modules/process/mark_with.c:248
 msgid "Mark with:"
 msgstr "Пометить с помощью:"
 
-#: modules/process/mark_with.c:255
+#: modules/process/mark_with.c:256
 msgid "with|_Mask"
 msgstr "_Маски"
 
-#: modules/process/mark_with.c:257
+#: modules/process/mark_with.c:258
 msgid "with|_Data"
 msgstr "Данн_ых"
 
-#: modules/process/mark_with.c:259
+#: modules/process/mark_with.c:260
 msgid "with|_Presentation"
 msgstr "П_резентации"
 
-#: modules/process/mark_with.c:293
+#: modules/process/mark_with.c:297
 msgid "Marked data range:"
 msgstr "Помеченный диапазон данных:"
 
-#: modules/process/mark_with.c:301
+#: modules/process/mark_with.c:305
 msgid "_Minimum:"
 msgstr "М_инимум:"
 
-#: modules/process/mark_with.c:310
+#: modules/process/mark_with.c:314
 msgid "M_aximum:"
 msgstr "М_аксимум:"
 
-#: modules/process/mark_with.c:378
+#: modules/process/mark_with.c:382
 msgid "Operand"
 msgstr "Операнд"
 
@@ -11363,107 +11712,107 @@ msgstr "Распространить на:"
 msgid "Preserve existing masks"
 msgstr "Сохранить существующие маски"
 
-#: modules/process/mask_edt.c:95
+#: modules/process/mask_edt.c:89
 msgid "Performs simple and true Euclidean distance transforms of masks."
 msgstr "Преобразует маски в расстояние простых видов и эвклидово."
 
-#: modules/process/mask_edt.c:109
+#: modules/process/mask_edt.c:103
 msgid "/_Mask/Distanc_e Transform..."
 msgstr "/_Маска/Преобразование в расстояни_е..."
 
-#: modules/process/mask_edt.c:113
+#: modules/process/mask_edt.c:107
 msgid "Distance transform of mask"
 msgstr "Преобразование маски в расстояние"
 
-#: modules/process/mask_edt.c:116
+#: modules/process/mask_edt.c:110
 msgid "/_Mask/Thi_n"
 msgstr "/_Маска/_Тоньше"
 
-#: modules/process/mask_edt.c:120
+#: modules/process/mask_edt.c:114
 msgid "Thin mask"
 msgstr "Сделать маску тоньше"
 
-#: modules/process/mask_edt.c:330 modules/process/mask_edt.c:352
+#: modules/process/mask_edt.c:164 modules/process/mask_edt.c:186
 msgid "Distance Transform"
 msgstr "Преобразование расстояния"
 
-#: modules/process/mask_edt.c:340
+#: modules/process/mask_edt.c:174
 msgid "Interior"
 msgstr "Внутреннее"
 
-#: modules/process/mask_edt.c:341
+#: modules/process/mask_edt.c:175
 msgid "Exterior"
 msgstr "Внешнее"
 
-#: modules/process/mask_edt.c:342
+#: modules/process/mask_edt.c:176
 msgid "Two-sided"
 msgstr "Двустороннее"
 
-#: modules/process/mask_edt.c:373 modules/tools/maskedit.c:634
+#: modules/process/mask_edt.c:207 modules/tools/maskedit.c:640
 msgid "_Distance type:"
 msgstr "Тип _расстояния:"
 
-#: modules/process/mask_edt.c:394 modules/tools/maskedit.c:640
+#: modules/process/mask_edt.c:228 modules/tools/maskedit.c:646
 msgid "Shrink from _border"
 msgstr "Ужать от _границы"
 
-#: modules/process/mask_morph.c:117
+#: modules/process/mask_morph.c:116
 msgid "Performs basic morphological operations with masks."
 msgstr "Производит основные морфологические операции над масками."
 
-#: modules/process/mask_morph.c:131
-msgid "/_Mask/Morphological Operation..."
-msgstr "/_Маска/Морфологическая операция..."
+#: modules/process/mask_morph.c:130
+msgid "/_Mask/Morpho_logical Operation..."
+msgstr "/_Маска/Морфо_логическая операция..."
 
-#: modules/process/mask_morph.c:135
+#: modules/process/mask_morph.c:134
 msgid "Morphological operation with mask"
 msgstr "Морфологическая операция над маской"
 
-#: modules/process/mask_morph.c:169
+#: modules/process/mask_morph.c:168
 msgid "Erosion"
 msgstr "Эрозия"
 
-#: modules/process/mask_morph.c:170
+#: modules/process/mask_morph.c:169
 msgid "Dilation"
 msgstr "Расширение"
 
-#: modules/process/mask_morph.c:171 modules/tools/filter.c:242
+#: modules/process/mask_morph.c:170 modules/tools/filter.c:243
 msgid "filter|Opening"
 msgstr "Размыкание"
 
-#: modules/process/mask_morph.c:172 modules/tools/filter.c:243
+#: modules/process/mask_morph.c:171 modules/tools/filter.c:244
 msgid "filter|Closing"
 msgstr "Замыкание"
 
-#: modules/process/mask_morph.c:173 modules/tools/filter.c:244
+#: modules/process/mask_morph.c:172 modules/tools/filter.c:245
 msgid "ASF Opening"
 msgstr "Размыкание ASF"
 
-#: modules/process/mask_morph.c:174 modules/tools/filter.c:245
+#: modules/process/mask_morph.c:173 modules/tools/filter.c:246
 msgid "ASF Closing"
 msgstr "Замыкание ASF"
 
-#: modules/process/mask_morph.c:178
+#: modules/process/mask_morph.c:177
 msgid "Octagon"
 msgstr "Восьмиугольник"
 
-#: modules/process/mask_morph.c:181
+#: modules/process/mask_morph.c:180
 msgid "Another mask"
 msgstr "Другая маска"
 
-#: modules/process/mask_morph.c:192
+#: modules/process/mask_morph.c:191
 msgid "Morphological Operation"
 msgstr "Морфологическая операция"
 
-#: modules/process/mask_morph.c:224
+#: modules/process/mask_morph.c:223
 msgid "Structuring element:"
 msgstr "Структурирующий элемент:"
 
-#: modules/process/mask_morph.c:238 modules/tools/maskedit.c:524
+#: modules/process/mask_morph.c:237 modules/tools/maskedit.c:528
 msgid "_Radius:"
 msgstr "Ра_диус:"
 
-#: modules/process/mask_morph.c:249
+#: modules/process/mask_morph.c:248
 msgid "_Mask:"
 msgstr "_Маска:"
 
@@ -11471,39 +11820,59 @@ msgstr "_Маска:"
 msgid "_Trim empty borders"
 msgstr "_Подрезать пустые границы"
 
-#: modules/process/maskcor.c:86
+#: modules/process/mask_noisify.c:83
+msgid "Adds salt and/or pepper noise to mask."
+msgstr "Добавляет шум типа соль и/или перец к маске."
+
+#: modules/process/mask_noisify.c:97
+msgid "/_Mask/_Noisify..."
+msgstr "/_Маска/_Зашумление..."
+
+#: modules/process/mask_noisify.c:101
+msgid "Add noise to mask"
+msgstr "Добавить шум к маске"
+
+#: modules/process/mask_noisify.c:141
+msgid "Noisify Mask"
+msgstr "Зашумление маски"
+
+#: modules/process/mask_noisify.c:184
+msgid "_Alter only boundaries"
+msgstr "_Менять только границы"
+
+#: modules/process/maskcor.c:87
 msgid "Creates mask by correlation with another data."
 msgstr "Создаёт маску путём корреляции с другими данными."
 
-#: modules/process/maskcor.c:100
+#: modules/process/maskcor.c:101
 msgid "/M_ultidata/_Mask by Correlation..."
 msgstr "/М_ножественные данные/_Маска по корреляции..."
 
-#: modules/process/maskcor.c:104
+#: modules/process/maskcor.c:105
 msgid "Create mask by correlation with another data"
 msgstr "Создать маску путём корреляции с другими данными"
 
-#: modules/process/maskcor.c:141
+#: modules/process/maskcor.c:142
 msgid "Mask by Correlation"
 msgstr "Пометить корреляцией"
 
-#: modules/process/maskcor.c:165
+#: modules/process/maskcor.c:166
 msgid "Correlation _kernel:"
 msgstr "_Ядро корреляции:"
 
-#: modules/process/maskcor.c:172
+#: modules/process/maskcor.c:173
 msgid "Objects marked"
 msgstr "Помеченные объекты"
 
-#: modules/process/maskcor.c:173
+#: modules/process/maskcor.c:174
 msgid "Correlation maxima"
 msgstr "Максимумы корреляции"
 
-#: modules/process/maskcor.c:174 modules/process/maskcor.c:356
+#: modules/process/maskcor.c:175 modules/process/maskcor.c:360
 msgid "Correlation score"
 msgstr "Степень корреляции"
 
-#: modules/process/maskcor.c:183
+#: modules/process/maskcor.c:185
 msgid "Correlation _method:"
 msgstr "_Метод корреляции:"
 
@@ -11532,8 +11901,8 @@ msgid "/_Mask/_Extract Mask"
 msgstr "/_Маска/И_звлечь маску"
 
 #: modules/process/maskops.c:78
-msgid "Extract mask to a new channel"
-msgstr "Извлечь маску в новый канал"
+msgid "Extract mask to a new image"
+msgstr "Извлечь маску в новое изображение"
 
 #: modules/process/maskops.c:81
 msgid "/_Grains/_Remove Edge-Touching"
@@ -11559,35 +11928,31 @@ msgstr "Обрезать непересекающиеся области дву
 msgid "Mutual Crop"
 msgstr "Взаимно кадрировать"
 
-#: modules/process/mcrop.c:174
+#: modules/process/mcrop.c:173
 msgid "_Select second argument:"
 msgstr "_Второй аргумент:"
 
-#: modules/process/measure_lattice.c:174
+#: modules/process/measure_lattice.c:165
 msgid "Measures parameters of two-dimensional lattices."
 msgstr "Измеряет параметры двумерных решеток."
 
-#: modules/process/measure_lattice.c:188
+#: modules/process/measure_lattice.c:179
 msgid "/_Statistics/Measure _Lattice..."
 msgstr "/_Статистика/Измерить _решетку..."
 
-#: modules/process/measure_lattice.c:192
+#: modules/process/measure_lattice.c:183
 msgid "Measure lattice"
 msgstr "Измерить решетку"
 
-#: modules/process/measure_lattice.c:253
+#: modules/process/measure_lattice.c:243
 msgid "Measure Lattice"
 msgstr "Измерить решетку"
 
-#: modules/process/measure_lattice.c:259
-msgid "_Refine"
-msgstr "_Уточнить"
-
-#: modules/process/measure_lattice.c:330
+#: modules/process/measure_lattice.c:320
 msgid "_ACF"
 msgstr "_ФАК"
 
-#: modules/process/measure_lattice.c:331
+#: modules/process/measure_lattice.c:321
 msgid "_PSDF"
 msgstr "_ФСПМ"
 
@@ -11603,30 +11968,30 @@ msgstr "_Решетку"
 msgid "_Vectors"
 msgstr "_Векторы"
 
-#: modules/process/measure_lattice.c:596
+#: modules/process/measure_lattice.c:589
 msgid "Save Lattice Parameters"
 msgstr "Сохранить параметры решетки"
 
-#: modules/process/measure_lattice.c:634
+#: modules/process/measure_lattice.c:627
 #, c-format
 msgid "Vector %d:"
 msgstr "Вектор %d:"
 
-#: modules/process/measure_lattice.c:643
+#: modules/process/measure_lattice.c:636
 #, c-format
 msgid "Length %d:"
 msgstr "Длина %d:"
 
-#: modules/process/measure_lattice.c:650
+#: modules/process/measure_lattice.c:643
 #, c-format
 msgid "Angle %d:"
 msgstr "Угол %d:"
 
-#: modules/process/measure_lattice.c:665
+#: modules/process/measure_lattice.c:657
 msgid "Angle:"
 msgstr "Угол:"
 
-#: modules/process/measure_lattice.c:681
+#: modules/process/measure_lattice.c:673
 msgid "Lattice Parameters"
 msgstr "Параметры решетки"
 
@@ -11650,11 +12015,11 @@ msgstr "Выравнивание по срединному..."
 msgid "Median Level"
 msgstr "Выровнять по срединному"
 
-#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:237
+#: modules/process/median-bg.c:199 modules/process/sphere-revolve.c:336
 msgid "Real _radius:"
 msgstr "Реальный _радиус:"
 
-#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:247
+#: modules/process/median-bg.c:209 modules/process/sphere-revolve.c:346
 msgid "_Pixel radius:"
 msgstr "Радиус в _пикселях:"
 
@@ -11694,7 +12059,7 @@ msgstr "Первый операнд"
 msgid "Second operand"
 msgstr "Второй операнд."
 
-#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:643
+#: modules/process/merge.c:197 modules/xyz/xyz_raster.c:612
 msgid "Average"
 msgstr "Среднее"
 
@@ -11746,6 +12111,224 @@ msgstr "Добавить _маску внешних пикселей"
 msgid "Merged images"
 msgstr "Объединённые изображения"
 
+#: modules/process/mfm_current.c:163
+msgid "Simulation of current line magnetic field"
+msgstr "Модель магнитного поля линии тока"
+
+#: modules/process/mfm_current.c:177
+msgid "/SPM M_odes/_MFM/_Current Line Field..."
+msgstr "/_Режимы СЗМ/_МСМ/Поле линии _тока..."
+
+#: modules/process/mfm_current.c:181
+msgid "Simulate stray field above current line"
+msgstr "Моделирует поле рассеяния над линией тока"
+
+#: modules/process/mfm_current.c:280 modules/process/mfm_parallel.c:282
+msgid "Simulated field"
+msgstr "Рассчитанное поле"
+
+#: modules/process/mfm_current.c:322 modules/process/mfm_field.c:266
+#: modules/process/mfm_parallel.c:324
+msgid "Point charge"
+msgstr "Точечный заряд"
+
+#: modules/process/mfm_current.c:323 modules/process/mfm_field.c:267
+#: modules/process/mfm_parallel.c:325
+msgid "Bar"
+msgstr "Брус"
+
+#: modules/process/mfm_current.c:330
+msgid "Current Line Stray Field"
+msgstr "Поле рассеяния линии тока"
+
+#: modules/process/mfm_current.c:415
+msgid "Output"
+msgstr "Вывод"
+
+#: modules/process/mfm_current.c:420 modules/process/mfm_field.c:320
+#: modules/process/mfm_parallel.c:415
+msgid "_Output plane height:"
+msgstr "Высота _выводимой плоскости:"
+
+#: modules/process/mfm_current.c:428
+msgid "_Stripe width:"
+msgstr "Ширина _полосы:"
+
+#: modules/process/mfm_current.c:436
+msgid "Stripe _current:"
+msgstr "_Ток полосы:"
+
+#: modules/process/mfm_current.c:444
+msgid "_Position:"
+msgstr "_Расположение:"
+
+#: modules/process/mfm_current.c:461
+msgid "Probe"
+msgstr "Зонд"
+
+#: modules/process/mfm_current.c:469
+msgid "P_robe type:"
+msgstr "Тип _зонда:"
+
+#: modules/process/mfm_current.c:475 modules/process/mfm_field.c:389
+#: modules/process/mfm_parallel.c:482
+msgid "Tip _magnetization:"
+msgstr "_Намагниченность зонда:"
+
+#: modules/process/mfm_current.c:484 modules/process/mfm_field.c:397
+#: modules/process/mfm_parallel.c:491
+msgid "Bar width _x:"
+msgstr "Ширина _полосы по x:"
+
+#: modules/process/mfm_current.c:493 modules/process/mfm_field.c:405
+#: modules/process/mfm_parallel.c:500
+msgid "Bar width _y:"
+msgstr "ширина полос_ы по y:"
+
+#: modules/process/mfm_current.c:502 modules/process/mfm_field.c:413
+#: modules/process/mfm_parallel.c:509
+msgid "Bar length (_z):"
+msgstr "_Длина полосы (z):"
+
+#: modules/process/mfm_field.c:146
+msgid "Simulation of magnetic field above perpendicular media"
+msgstr "Модель магнитного поля над поперечной средой"
+
+#: modules/process/mfm_field.c:160
+msgid "/SPM M_odes/_MFM/_Perpendicular Media Field..."
+msgstr "/_Режимы СЗМ/_МСМ/Поле _перпендикулярной среды..."
+
+#: modules/process/mfm_field.c:164
+msgid "Compute stray field above perpendicular magnetic medium"
+msgstr ""
+"Рассчитывает поле рассеяния над магнитной средой для перпендикулярной записи"
+
+#: modules/process/mfm_field.c:276
+msgid "Perpendicular Media Stray Field"
+msgstr "Поле рассеяния перпендикулярной среды"
+
+#: modules/process/mfm_field.c:328 modules/process/mfm_parallel.c:423
+msgid "_Film thickness:"
+msgstr "_Толщина плёнки:"
+
+#: modules/process/mfm_field.c:336
+msgid "_Magnetic charge:"
+msgstr "_Магнитный заряд:"
+
+#: modules/process/mfm_field.c:344
+msgid "Include domain _walls"
+msgstr "Включить _границы доменов"
+
+#: modules/process/mfm_field.c:354
+msgid "_Exchange constant:"
+msgstr "Постоянная о_бменного взаимодейстивия:"
+
+#: modules/process/mfm_field.c:362
+msgid "_Uniaxial anisotropy:"
+msgstr "Одноосевая _анизотропия:"
+
+#: modules/process/mfm_field.c:383 modules/process/mfm_parallel.c:476
+msgid "_Probe type:"
+msgstr "Тип _зонда:"
+
+#: modules/process/mfm_findshift.c:88
+msgid "Lift height difference estimation from data blur"
+msgstr "Оценка разницы высоты подъёма из размытия данных"
+
+#: modules/process/mfm_findshift.c:102
+msgid "/SPM M_odes/_MFM/_Estimate Shift in Z..."
+msgstr "/_Режимы СЗМ/_МСМ/О_ценка сдвига по Z..."
+
+#: modules/process/mfm_findshift.c:106
+msgid "Estimate lift height difference in MFM data"
+msgstr "Оценить разницу высоты подъёма в данных МСМ"
+
+#: modules/process/mfm_findshift.c:166 modules/process/psf.c:340
+msgid "Searching..."
+msgstr "Поиск..."
+
+#: modules/process/mfm_findshift.c:196
+msgid "Estimated shift:"
+msgstr "Оценка сдвига:"
+
+#: modules/process/mfm_findshift.c:211
+msgid "Shifted field difference"
+msgstr "Сдвинутое различие поля"
+
+#: modules/process/mfm_findshift.c:228
+msgid "Estimate Lift Height Shift"
+msgstr "Оценить сдвиг высоты подъёма"
+
+#: modules/process/mfm_findshift.c:255
+msgid "Data to compare:"
+msgstr "Данные для сравнения:"
+
+#: modules/process/mfm_findshift.c:261
+msgid "Search _from:"
+msgstr "_Искать от:"
+
+#: modules/process/mfm_findshift.c:269
+msgid "Search _to:"
+msgstr "Искать _до:"
+
+#: modules/process/mfm_parallel.c:165
+msgid "Simulation of parallel magnetic media"
+msgstr "Моделирование магнитной среды с параллельной записью"
+
+#: modules/process/mfm_parallel.c:179
+msgid "/SPM M_odes/_MFM/Para_llel Media Field..."
+msgstr "/_Режимы СЗМ/_МСМ/Поле п_араллельной среды..."
+
+#: modules/process/mfm_parallel.c:183
+msgid "Simulate stray field above parallel magnetic medium"
+msgstr ""
+"Рассчитывает поле рассеяния над магнитной средой для параллельной записи"
+
+#: modules/process/mfm_parallel.c:331
+msgid "Parallel Media Stray Field"
+msgstr "Поле рассеяния параллельной среды"
+
+#: modules/process/mfm_parallel.c:431
+msgid "_Remanent magnetization:"
+msgstr "Остато_чная намагниченность:"
+
+#: modules/process/mfm_parallel.c:439
+msgid "Size _A (dir. left):"
+msgstr "Разм_ер A (напр. налево):"
+
+#: modules/process/mfm_parallel.c:447
+msgid "Size _B (dir. right):"
+msgstr "Разме_р B (напр. направо):"
+
+#: modules/process/mfm_parallel.c:455
+msgid "_Gap size:"
+msgstr "Размер _зазора:"
+
+#: modules/process/mfm_shift.c:87
+msgid "Simulation of magnetic field z component change for another level"
+msgstr ""
+"Моделирование изменения Z-компоненты магнитного поля для другого уровня"
+
+#: modules/process/mfm_shift.c:101
+msgid "/SPM M_odes/_MFM/_Field Shift in Z..."
+msgstr "/_Режимы СЗМ/_МСМ/_Сдвиг поля по Z..."
+
+#: modules/process/mfm_shift.c:105
+msgid "Compute stray field shift for another z level"
+msgstr "Рассчитывает сдвиг поля рассеяния для другого уровня z."
+
+#: modules/process/mfm_shift.c:146
+msgid "Shifted field"
+msgstr "Сдвинутое поле"
+
+#: modules/process/mfm_shift.c:164
+msgid "Stray Field Plane Shift"
+msgstr "Смещение поля рассеяния в плоскости"
+
+#: modules/process/mfm_shift.c:209
+msgid "_Z shift by:"
+msgstr "Сме_щение по Z до:"
+
 #: modules/process/nanoindent_adjust.c:89
 msgid "Adjust images of two indentor prints."
 msgstr "Подгоняет друг к другу изображения двух отпечатков индентора."
@@ -11782,14 +12365,14 @@ msgstr "В_ращать данные"
 msgid "E_xtrapolate result data out of measured range"
 msgstr "_Экстраполировать полученные данные вне измеренного диапазона"
 
-#: modules/process/nanoindent_adjust.c:295
+#: modules/process/nanoindent_adjust.c:296
 msgid ""
 "Tip has different range/resolution ratio than image. Tip will be resampled."
 msgstr ""
 "Зонд имеет другое отношение диапазон/разрешение чем изображение. Размер "
 "изображения зонда будет изменён."
 
-#: modules/process/nanoindent_adjust.c:334
+#: modules/process/nanoindent_adjust.c:335
 msgid "Immersed detail data"
 msgstr "Данные встроенного изображения с лучшим разрешением"
 
@@ -11830,244 +12413,232 @@ msgstr "Ошибка обучения"
 msgid "error"
 msgstr "ошибка"
 
-#: modules/process/neural.c:503
+#: modules/process/neural.c:504
 msgid "NN training error"
 msgstr "Ошибка обучения нейросети"
 
-#: modules/process/neural.c:516
+#: modules/process/neural.c:517
 msgid "Training"
 msgstr "Обучение"
 
-#: modules/process/neural.c:520
+#: modules/process/neural.c:521
 msgid "_Model:"
 msgstr "_Модель:"
 
-#: modules/process/neural.c:530
+#: modules/process/neural.c:532
 msgid "_Signal:"
 msgstr "_Сигнал:"
 
-#: modules/process/neural.c:541
+#: modules/process/neural.c:544
 msgid "Training ste_ps:"
 msgstr "Шагов об_учения:"
 
-#: modules/process/neural.c:557
+#: modules/process/neural.c:561
 msgid "Model"
 msgstr "Модель"
 
-#: modules/process/neural.c:558
+#: modules/process/neural.c:562
 msgid "Signal"
 msgstr "Сигнал"
 
-#: modules/process/neural.c:575
+#: modules/process/neural.c:579
 msgid "verb|_Train"
 msgstr "О_бучение"
 
-#: modules/process/neural.c:580
+#: modules/process/neural.c:584
 msgid "Re_initialize"
 msgstr "Пере_инициализация"
 
-#: modules/process/neural.c:613
+#: modules/process/neural.c:617
 msgid "Network"
 msgstr "Сеть"
 
-#: modules/process/neural.c:619
+#: modules/process/neural.c:623
 msgid "Window _width:"
 msgstr "_Ширина окна:"
 
-#: modules/process/neural.c:627
+#: modules/process/neural.c:631
 msgid "Window h_eight:"
 msgstr "_Высота окна:"
 
-#: modules/process/neural.c:635
+#: modules/process/neural.c:639
 msgid "_Hidden nodes:"
 msgstr "Скр_ытые узлы:"
 
-#: modules/process/neural.c:643
+#: modules/process/neural.c:647
 msgid "Result Units"
 msgstr "Единицы результата"
 
-#: modules/process/neural.c:650
+#: modules/process/neural.c:654
 msgid "Power of source _XY:"
 msgstr "Степень _XY источника:"
 
-#: modules/process/neural.c:658
+#: modules/process/neural.c:663
 msgid "Power of source _Z:"
 msgstr "Степень _Z источника:"
 
-#: modules/process/neural.c:666
+#: modules/process/neural.c:672
 msgid "_Fixed units:"
 msgstr "_Заданные единицы:"
 
-#: modules/process/neural.c:676
+#: modules/process/neural.c:683
 msgid "Networks"
 msgstr "Сети"
 
-#: modules/process/neural.c:723
+#: modules/process/neural.c:730
 msgid "Network _name:"
 msgstr "_Название нейросети:"
 
-#: modules/process/neural.c:775
+#: modules/process/neural.c:782
 msgid "Apply Neural Network"
 msgstr "Применить нейросеть"
 
-#: modules/process/neural.c:798
+#: modules/process/neural.c:805
 msgid "_Scale proportionally to input"
 msgstr "_Масштабировать пропорционально входным данным"
 
-#: modules/process/neural.c:929
+#: modules/process/neural.c:936
 msgid "Model and signal are not compatible."
 msgstr "Модель и сигнал несовместимы."
 
-#: modules/process/neural.c:937
+#: modules/process/neural.c:944
 msgid "A field dimension is too small for chosen window size."
 msgstr "Размер поля слишком мал для выбранного размера окна."
 
-#: modules/process/neural.c:1183 modules/process/neural.c:1349
+#: modules/process/neural.c:1190 modules/process/neural.c:1356
 msgid "Evaluating..."
 msgstr "Расчёт..."
 
-#: modules/process/neural.c:1309
+#: modules/process/neural.c:1316
 msgid "Training was canceled."
 msgstr "Обучение было отменено."
 
-#: modules/process/neural.c:1319
+#: modules/process/neural.c:1326
 #, c-format
 msgid "Mean difference: %.*f %s"
 msgstr "Среднее различие: %.*f %s"
 
-#: modules/process/neural.c:1371
+#: modules/process/neural.c:1378
 msgid "Evaluated signal"
 msgstr "Рассчитанный сигнал"
 
-#: modules/process/noise_synth.c:196
+#: modules/process/noise_synth.c:194
 msgid "Generates uncorrelated random noise."
 msgstr "Создаёт некоррелированный случайный шум."
 
-#: modules/process/noise_synth.c:210
+#: modules/process/noise_synth.c:208
 msgid "/S_ynthetic/_Noise..."
 msgstr "/Син_тез/_Шум..."
 
-#: modules/process/noise_synth.c:214
+#: modules/process/noise_synth.c:212
 msgid "Generate surface of uncorrelated noise"
 msgstr "Создать поверхность из некоррелированного шума"
 
-#: modules/process/noise_synth.c:334
+#: modules/process/noise_synth.c:332
 msgid "Random Noise"
 msgstr "Случайный шум"
 
-#: modules/process/obj_synth.c:274
+#: modules/process/obj_synth.c:270
 msgid "Spheres"
 msgstr "Сферы"
 
-#: modules/process/obj_synth.c:275
+#: modules/process/obj_synth.c:271
 msgid "Boxes"
 msgstr "Параллелепипеды"
 
-#: modules/process/obj_synth.c:276
+#: modules/process/obj_synth.c:272
 msgid "Cones"
 msgstr "Конусы"
 
-#: modules/process/obj_synth.c:277
+#: modules/process/obj_synth.c:273
 msgid "Pyramids"
 msgstr "Пирамиды"
 
-#: modules/process/obj_synth.c:278
+#: modules/process/obj_synth.c:274
 msgid "Diamonds"
 msgstr "Бриллианты"
 
-#: modules/process/obj_synth.c:279
+#: modules/process/obj_synth.c:275
 msgid "Tetrahedrons"
 msgstr "Тетраэдры"
 
-#: modules/process/obj_synth.c:280
+#: modules/process/obj_synth.c:276
 msgid "Nuggets"
 msgstr "Частицы"
 
-#: modules/process/obj_synth.c:281
+#: modules/process/obj_synth.c:277
 msgid "Thatches"
 msgstr "Листья камыша"
 
-#: modules/process/obj_synth.c:282
+#: modules/process/obj_synth.c:278
 msgid "Tents"
 msgstr "Палатки"
 
-#: modules/process/obj_synth.c:283
+#: modules/process/obj_synth.c:279
 msgid "Gaussians"
 msgstr "Гауссианы"
 
-#: modules/process/obj_synth.c:284
+#: modules/process/obj_synth.c:280
 msgid "Doughnuts"
 msgstr "Бублики"
 
-#: modules/process/obj_synth.c:285
+#: modules/process/obj_synth.c:281
 msgid "Parabolic bumps"
 msgstr "Параболические выступы"
 
-#: modules/process/obj_synth.c:291
+#: modules/process/obj_synth.c:287
 msgid "Generates randomly patterned surfaces by placing objects."
 msgstr "Создаёт поверхности со случайным узором расставляя объекты."
 
-#: modules/process/obj_synth.c:305
-msgid "/S_ynthetic/_Objects..."
-msgstr "/Син_тез/_Объекты..."
+#: modules/process/obj_synth.c:301
+msgid "/S_ynthetic/_Deposition/_Objects..."
+msgstr "/Син_тез/_Осаждение/_Объекты..."
 
-#: modules/process/obj_synth.c:309
+#: modules/process/obj_synth.c:305
 msgid "Generate surface of randomly placed objects"
 msgstr "Создать поверхность из случайно расположенных объектов"
 
-#: modules/process/obj_synth.c:424
+#: modules/process/obj_synth.c:421
 msgid "Both (random)"
 msgstr "Обе (случайно)"
 
-#: modules/process/obj_synth.c:439
+#: modules/process/obj_synth.c:436
 msgid "Random Objects"
 msgstr "Случайные объекты"
 
-#: modules/process/obj_synth.c:513
-msgid "_Shape:"
-msgstr "_Форма:"
-
-#: modules/process/obj_synth.c:531
-msgid "obj."
-msgstr "объект."
-
-#: modules/process/obj_synth.c:551
+#: modules/process/obj_synth.c:549
 msgid "Aspect Ratio"
 msgstr "Пропорции"
 
-#: modules/process/obj_synth.c:558
+#: modules/process/obj_synth.c:556
 msgid "_Aspect ratio:"
 msgstr "_Пропорции:"
 
-#: modules/process/obj_synth.c:588
+#: modules/process/obj_synth.c:586
 msgid "Scales _with size"
 msgstr "_Масштабируется с размером"
 
-#: modules/process/obj_synth.c:612
+#: modules/process/obj_synth.c:611
 msgid "_Feature type:"
 msgstr "Тип осо_бенности:"
 
-#: modules/process/obj_synth.c:807
-msgid "_Truncate:"
-msgstr "_Усечение:"
-
-#: modules/process/otsu_threshold.c:39 modules/process/otsu_threshold.c:59
+#: modules/process/otsu_threshold.c:40 modules/process/otsu_threshold.c:60
 msgid "Automated threshold using Otsu's method on heights."
 msgstr "Автоматический порог, применяющий метод Оцу к высотам."
 
-#: modules/process/otsu_threshold.c:55
-msgid "/_Grains/_Mark by Otsu's..."
+#: modules/process/otsu_threshold.c:56
+msgid "/_Grains/_Mark by Otsu's"
 msgstr "/Зёрн_а/Пометить по методу _Оцу..."
 
-#: modules/process/outliers.c:40
+#: modules/process/outliers.c:41
 msgid "Creates mask of outliers."
 msgstr "Создаёт маску выпадающих деталей."
 
-#: modules/process/outliers.c:54
+#: modules/process/outliers.c:55
 msgid "/_Correct Data/Mask of _Outliers"
 msgstr "/Исправить _данные/Маска в_ыпадающего"
 
-#: modules/process/outliers.c:58
+#: modules/process/outliers.c:59
 msgid "Mark data farther than 3σ from mean value"
 msgstr "Пометить данные которые находятся дальше, чем 3σ от среднего значения"
 
@@ -12093,80 +12664,100 @@ msgstr "Структура"
 msgid "_Pattern:"
 msgstr "С_труктура:"
 
-#: modules/process/pat_synth.c:812
+#: modules/process/pat_synth.c:813
 msgid "Flat"
 msgstr "Плоскость"
 
-#: modules/process/pat_synth.c:820
+#: modules/process/pat_synth.c:821
 msgid "_Flat width:"
 msgstr "_Ширина плоскости:"
 
-#: modules/process/pat_synth.c:837 modules/process/pat_synth.c:1139
-#: modules/process/pat_synth.c:1474
+#: modules/process/pat_synth.c:838 modules/process/pat_synth.c:1140
+#: modules/process/pat_synth.c:1475
 msgid "_Slope width:"
 msgstr "Ширина _уклона:"
 
-#: modules/process/pat_synth.c:1099
+#: modules/process/pat_synth.c:1100
 msgid "Top"
 msgstr "Вершина"
 
-#: modules/process/pat_synth.c:1106
+#: modules/process/pat_synth.c:1107
 msgid "Flat _top width:"
 msgstr "Ширина плоской _вершины:"
 
-#: modules/process/pat_synth.c:1114
+#: modules/process/pat_synth.c:1115
 msgid "Bottom"
 msgstr "Дно"
 
-#: modules/process/pat_synth.c:1122
+#: modules/process/pat_synth.c:1123
 msgid "Flat _bottom width:"
 msgstr "Ширина плоского _дна:"
 
-#: modules/process/pat_synth.c:1440
+#: modules/process/pat_synth.c:1441
 msgid "_Distance:"
 msgstr "Р_асстояние:"
 
-#: modules/process/pid.c:96
-msgid "A simple PID simulator"
-msgstr "Простой симулятор ПИД"
+#: modules/process/phase_synth.c:136
+msgid "Generates phase-separated structures."
+msgstr "Генерирует структуры с разделением фаз."
 
-#: modules/process/pid.c:110
-msgid "/_Tip and Indentation/_PID simulation..."
+#: modules/process/phase_synth.c:150
+msgid "/S_ynthetic/P_hases..."
+msgstr "/Син_тез/_Фазы..."
+
+#: modules/process/phase_synth.c:154
+msgid "Generate surface with separated phases"
+msgstr "Генерировать поверхность с раздельными фазами."
+
+#: modules/process/phase_synth.c:203
+msgid "Separated Phases"
+msgstr "Раздельные фазы"
+
+#: modules/process/phase_synth.c:287
+msgid "Size s_pread:"
+msgstr "Р_азброс размеров:"
+
+#: modules/process/pid.c:95
+msgid "A simple PID simulator"
+msgstr "Простой симулятор ПИД"
+
+#: modules/process/pid.c:109
+msgid "/_Tip and Indentation/_PID simulation..."
 msgstr "/_Зонд и индентация/Модель _ПИД..."
 
-#: modules/process/pid.c:114
+#: modules/process/pid.c:113
 msgid "Simulate PID effects on measurement"
 msgstr "Симулировать влияние ПИД на измерения"
 
-#: modules/process/pid.c:158
+#: modules/process/pid.c:157
 msgid "PID FW result"
 msgstr "Прямой результат ПИД"
 
-#: modules/process/pid.c:167
+#: modules/process/pid.c:166
 msgid "PID FW max. force"
 msgstr "Макс. прямая сила ПИД"
 
-#: modules/process/pid.c:176
+#: modules/process/pid.c:175
 msgid "PID REV result"
 msgstr "Обр. результат ПИД"
 
-#: modules/process/pid.c:185
+#: modules/process/pid.c:184
 msgid "PID REV max. force"
 msgstr "Макс. обр. сила ПИД"
 
-#: modules/process/pid.c:198
+#: modules/process/pid.c:196
 msgid "PID simulation"
 msgstr "Симуляция ПИД"
 
-#: modules/process/pid.c:215
+#: modules/process/pid.c:214
 msgid "_Proportional:"
 msgstr "_Пропорциональный:"
 
-#: modules/process/pid.c:221
+#: modules/process/pid.c:220
 msgid "_Integral:"
 msgstr "_Интеграл:"
 
-#: modules/process/pid.c:227
+#: modules/process/pid.c:226
 msgid "_Integration steps:"
 msgstr "Шагов _интегрирования:"
 
@@ -12174,15 +12765,15 @@ msgstr "Шагов _интегрирования:"
 msgid "_Derivative:"
 msgstr "_Производная:"
 
-#: modules/process/pid.c:241
+#: modules/process/pid.c:240
 msgid "PID/scan speed _ratio:"
 msgstr "_Отн. ПИД/скорость сканирования:"
 
-#: modules/process/pid.c:253
+#: modules/process/pid.c:255
 msgid "Force strength:"
 msgstr "Величина силы:"
 
-#: modules/process/pid.c:259
+#: modules/process/pid.c:261
 msgid "Force setpoint:"
 msgstr "заданное значение силы:"
 
@@ -12190,7 +12781,7 @@ msgstr "заданное значение силы:"
 msgid "Scanning..."
 msgstr "Сканирование..."
 
-#: modules/process/pid.c:396
+#: modules/process/pid.c:401
 msgid "Computation diverged, try to change parameters"
 msgstr "Расчёт расходится, попробуйте изменить параметры"
 
@@ -12210,23 +12801,23 @@ msgstr "Накладывает полиномиальное искривлени
 msgid "Distort by Polynomial"
 msgstr "Полиномиально искривить"
 
-#: modules/process/polydistort.c:282
+#: modules/process/polydistort.c:285
 msgid "Ori_ginal"
 msgstr "Ис_ходный"
 
-#: modules/process/polydistort.c:283
+#: modules/process/polydistort.c:286
 msgid "_Transformed"
 msgstr "_Преобразованный"
 
-#: modules/process/polydistort.c:289
+#: modules/process/polydistort.c:292
 msgid "X Coefficients"
 msgstr "Коэффициенты X"
 
-#: modules/process/polydistort.c:303
+#: modules/process/polydistort.c:306
 msgid "Y Coefficients"
 msgstr "Коэффициенты Y"
 
-#: modules/process/polydistort.c:499
+#: modules/process/polydistort.c:502
 msgid "Distorted"
 msgstr "Искривлённый"
 
@@ -12262,23 +12853,23 @@ msgstr "Выровненные данные"
 msgid "_Horizontal polynom degree:"
 msgstr "_Горизонтальная степень полинома:"
 
-#: modules/process/polylevel.c:450
+#: modules/process/polylevel.c:451
 msgid "_Vertical polynom degree:"
 msgstr "_Вертикальная степень полинома:"
 
-#: modules/process/polylevel.c:456
+#: modules/process/polylevel.c:458
 msgid "_Same degrees"
 msgstr "_Одинаковые степени"
 
-#: modules/process/polylevel.c:474
+#: modules/process/polylevel.c:476
 msgid "_Maximum polynom degree:"
 msgstr "_Максимальная степень полинома:"
 
-#: modules/process/polylevel.c:561
+#: modules/process/polylevel.c:564
 msgid "Polynomial Coefficients"
 msgstr "Полиномиальные коэффициенты"
 
-#: modules/process/polylevel.c:934 modules/tools/distance.c:594
+#: modules/process/polylevel.c:937 modules/tools/distance.c:594
 #: modules/tools/selectionmanager.c:720
 msgid "Save Table"
 msgstr "Сохранение таблицы"
@@ -12300,8 +12891,8 @@ msgid "/_Presentation/E_xtract Presentation"
 msgstr "/_Презентация/_Извлечь презентацию"
 
 #: modules/process/presentationops.c:81
-msgid "Extract presentation to a new channel"
-msgstr "Извлекает презентацию в отдельный канал"
+msgid "Extract presentation to a new image"
+msgstr "Извлекает презентацию в отдельное изображение"
 
 #: modules/process/presentationops.c:84
 msgid "/_Presentation/_Attach Presentation..."
@@ -12327,6 +12918,10 @@ msgstr "Присоединить презентацию"
 msgid "_Data to attach:"
 msgstr "Присоединяемые _данные:"
 
+#: modules/process/preview.h:245
+msgid "Combine with existing mask:"
+msgstr "Объединить с имеющейся маской:"
+
 #: modules/process/psdf_logphi.c:76
 msgid ""
 "Two-dimensional FFT (Fast Fourier Transform) transformed to coordinates (log-"
@@ -12347,10 +12942,79 @@ msgstr "Рассчитать ФСПМ в координатах Log-Phi"
 msgid "Log-Phi PSDF"
 msgstr "Log-Phi ФСПМ"
 
-#: modules/process/psdf_logphi.c:275 modules/process/wpour_mark.c:320
+#: modules/process/psdf_logphi.c:276 modules/process/wpour_mark.c:320
 msgid "Gaussian _smoothing:"
 msgstr "Гауссово _сглаживание"
 
+#: modules/process/psf-fit.c:165
+msgid "Gaussian (asymmetric)"
+msgstr "Гауссиана (асимметричная)"
+
+#: modules/process/psf-fit.c:177
+msgid "Point spread function estimation by fitting explicit function form."
+msgstr "Оценка функции рассеяния точки аппроксимацией явно заданной функцией."
+
+#: modules/process/psf-fit.c:191
+msgid "/_Statistics/_PSF Fit..."
+msgstr "/_Статистика/_Аппроксимация PSF..."
+
+#: modules/process/psf-fit.c:195
+msgid "Fit PSF from known data and image"
+msgstr "Оценить PSF из известных данных и изображения"
+
+#: modules/process/psf-fit.c:246 modules/process/psf.c:181
+#: modules/process/psf.c:230
+msgid "PSF"
+msgstr "PSF"
+
+#: modules/process/psf-fit.c:254 modules/process/psf.c:195
+msgid "PSF*P"
+msgstr "PSF*P"
+
+#: modules/process/psf-fit.c:271
+msgid "Fit PSF"
+msgstr "Аппроксимация PSF"
+
+#: modules/process/psf-fit.c:289 modules/process/psf.c:286
+msgid "_Ideal response:"
+msgstr "Идеальный отклик:"
+
+#: modules/process/psf.c:117
+msgid "Point spread function estimation"
+msgstr "Оценка функции рассеяния точки (PSF)"
+
+#: modules/process/psf.c:131
+msgid "/_Statistics/_PSF Guess..."
+msgstr "/_Статистика/О_ценка PSF..."
+
+#: modules/process/psf.c:135
+msgid "Estimate PSF from known data and image"
+msgstr "Оценить PSF из известных данных и изображения"
+
+#: modules/process/psf.c:208
+msgid "PSF*P - I"
+msgstr "PSF*P - I"
+
+#: modules/process/psf.c:231
+msgid "Convolved"
+msgstr "После свёртки"
+
+#: modules/process/psf.c:237
+msgid "Estimate PSF"
+msgstr "Оценить PSF"
+
+#: modules/process/psf.c:238
+msgid "_Fit"
+msgstr "_Аппрокс."
+
+#: modules/process/psf.c:295
+msgid "_Display:"
+msgstr "_Показать:"
+
+#: modules/process/psf.c:301
+msgid "_Sigma init:"
+msgstr "Начальная _Sigma:"
+
 #: modules/process/rank.c:92
 msgid "Enhances local contrast using a rank transform."
 msgstr "Улучшает локальный контраст с помощью преобразования ранжирования"
@@ -12401,7 +13065,7 @@ msgstr "/_Базовые действия/Повернуть на _угол..."
 msgid "Rotate by arbitrary angle"
 msgstr "Вращение на заданный угол"
 
-#: modules/process/rotate.c:192
+#: modules/process/rotate.c:192 modules/volume/volume_swaxes.c:651
 msgid "Rotated Data"
 msgstr "Повёрнутые данные"
 
@@ -12457,63 +13121,63 @@ msgstr "Масштабированные данные"
 msgid "verb|Scale"
 msgstr "Масштабировать"
 
-#: modules/process/scale.c:216
+#: modules/process/scale.c:217
 msgid "Scale by _ratio:"
 msgstr "Масштабировать на _коэффициент:"
 
-#: modules/process/scale.c:224
+#: modules/process/scale.c:225
 msgid "_proportional"
 msgstr "_пропорционально"
 
-#: modules/process/scale.c:235
+#: modules/process/scale.c:237
 msgid "New _width:"
 msgstr "Новая _ширина:"
 
-#: modules/process/scale.c:243
+#: modules/process/scale.c:246
 msgid "New _height:"
 msgstr "Новая _высота:"
 
-#: modules/process/scars.c:113
+#: modules/process/scars.c:122
 msgid "Marks and/or removes scars (horizontal linear artifacts)."
 msgstr "Помечает и/или удаляет царапины (горизонтальные линейные артефакты)."
 
-#: modules/process/scars.c:127
+#: modules/process/scars.c:136
 msgid "/_Correct Data/M_ark Scars..."
 msgstr "/Исправить _данные/Пометить _царапины..."
 
-#: modules/process/scars.c:131
+#: modules/process/scars.c:140
 msgid "Mark horizontal scars (strokes)"
 msgstr "Помечает горизонтальные царапины (штрихи)"
 
-#: modules/process/scars.c:134
+#: modules/process/scars.c:143
 msgid "/_Correct Data/Remove _Scars"
 msgstr "/Исправить _данные/_Убрать царапины"
 
-#: modules/process/scars.c:138
+#: modules/process/scars.c:147
 msgid "Correct horizontal scars (strokes)"
 msgstr "Убрать горизонтальные царапины"
 
-#: modules/process/scars.c:293
+#: modules/process/scars.c:312
 msgid "Mark Scars"
 msgstr "Пометить царапины"
 
-#: modules/process/scars.c:331
+#: modules/process/scars.c:353
 msgid "Maximum _width:"
 msgstr "Максимальная _ширина:"
 
-#: modules/process/scars.c:338
+#: modules/process/scars.c:361
 msgid "Minimum _length:"
 msgstr "Минимальная _длина:"
 
-#: modules/process/scars.c:345
+#: modules/process/scars.c:369
 msgid "_Hard threshold:"
 msgstr "_Жёсткий порог:"
 
-#: modules/process/scars.c:353
+#: modules/process/scars.c:377
 msgid "_Soft threshold:"
 msgstr "_Мягкий порог:"
 
-#: modules/process/scars.c:361
+#: modules/process/scars.c:385
 msgid "Scars type:"
 msgstr "Тип царапин:"
 
@@ -12553,27 +13217,27 @@ msgstr "Монте-Карло"
 msgid "_Quality:"
 msgstr "_Качество:"
 
-#: modules/process/shade.c:92
+#: modules/process/shade.c:94
 msgid "Creates a shaded presentation of data."
 msgstr "Создаёт презентацию данных с тенями."
 
-#: modules/process/shade.c:106
+#: modules/process/shade.c:108
 msgid "/_Presentation/_Shading..."
 msgstr "/_Презентация/_Затенение..."
 
-#: modules/process/shade.c:110
+#: modules/process/shade.c:112
 msgid "Shade data"
 msgstr "Затенить данные"
 
-#: modules/process/shade.c:207
+#: modules/process/shade.c:209
 msgid "Shading"
 msgstr "Затенение"
 
-#: modules/process/shade.c:253
+#: modules/process/shade.c:260
 msgid "_Mix:"
 msgstr "C_мешать:"
 
-#: modules/process/slope_dist.c:161
+#: modules/process/slope_dist.c:160
 msgid ""
 "Calculates one- or two-dimensional distribution of slopes or graph of their "
 "angular distribution."
@@ -12581,82 +13245,133 @@ msgstr ""
 "Рассчитывает одно- или двумерное распределение наклонов или график их "
 "углового распределения."
 
-#: modules/process/slope_dist.c:176
+#: modules/process/slope_dist.c:175
 msgid "/_Statistics/_Slope Distribution..."
 msgstr "/_Статистика/Распределение _наклонов..."
 
-#: modules/process/slope_dist.c:180
+#: modules/process/slope_dist.c:179
 msgid "Calculate angular slope distribution"
 msgstr "Рассчитать угловое распределение наклонов"
 
-#: modules/process/slope_dist.c:221
+#: modules/process/slope_dist.c:220
 msgid "Slope distribution"
 msgstr "Распределение наклона"
 
-#: modules/process/slope_dist.c:253
+#: modules/process/slope_dist.c:252
 msgid "_Two-dimensional distribution"
 msgstr "_Двумерное распределение"
 
-#: modules/process/slope_dist.c:254
+#: modules/process/slope_dist.c:253
 msgid "Directional (φ) _graph"
 msgstr "_График направлений (φ) "
 
-#: modules/process/slope_dist.c:255
+#: modules/process/slope_dist.c:254
 msgid "_Inclination (θ) graph"
 msgstr "График _наклонов (θ)"
 
-#: modules/process/slope_dist.c:256
+#: modules/process/slope_dist.c:255
 msgid "Inclination (gra_dient) graph"
 msgstr "График наклонов (гра_диент)"
 
-#: modules/process/slope_dist.c:270
+#: modules/process/slope_dist.c:269
 msgid "Slope Distribution"
 msgstr "Распределение наклонов"
 
-#: modules/process/slope_dist.c:755
+#: modules/process/slope_dist.c:749
 msgid "Angular Slope Distribution"
 msgstr "Распределение наклонов по углам"
 
-#: modules/process/slope_dist.c:763 modules/process/tilt.c:179
+#: modules/process/slope_dist.c:757 modules/process/tilt.c:179
 msgid "Slopes"
 msgstr "Наклоны"
 
-#: modules/process/slope_dist.c:824 modules/process/slope_dist.c:893
+#: modules/process/slope_dist.c:818 modules/process/slope_dist.c:887
 msgid "Inclination Distribution"
 msgstr "Распределение наклона"
 
-#: modules/process/slope_dist.c:832 modules/process/slope_dist.c:901
+#: modules/process/slope_dist.c:826 modules/process/slope_dist.c:895
 msgid "Inclinations"
 msgstr "Наклоны"
 
-#: modules/process/sphere-revolve.c:97
+#: modules/process/sphere-revolve.c:111
 msgid "Subtracts background by arc or sphere revolution."
 msgstr "Вычитает фон вращением дуги или сферы."
 
-#: modules/process/sphere-revolve.c:113
+#: modules/process/sphere-revolve.c:125
 msgid "/_Level/Revolve _Arc..."
 msgstr "/_Выравнивание/Вращение _дуги..."
 
-#: modules/process/sphere-revolve.c:117
+#: modules/process/sphere-revolve.c:129
 msgid "Level data by arc revolution"
 msgstr "Выровнять данные вращением дуги"
 
-#: modules/process/sphere-revolve.c:208 modules/tools/sfunctions.c:371
+#: modules/process/sphere-revolve.c:132
+msgid "/_Level/Revolve _Sphere..."
+msgstr "/_Выравнивание/Вращение с_феры..."
+
+#: modules/process/sphere-revolve.c:136
+msgid "Level data by sphere revolution"
+msgstr "Выровнять данные вращением сферы"
+
+#: modules/process/sphere-revolve.c:303 modules/tools/sfunctions.c:381
 msgid "_Horizontal direction"
 msgstr "_Горизонтальное направление"
 
-#: modules/process/sphere-revolve.c:209 modules/tools/sfunctions.c:372
+#: modules/process/sphere-revolve.c:304 modules/tools/sfunctions.c:382
 msgid "_Vertical direction"
 msgstr "_Вертикальное направление"
 
-#: modules/process/sphere-revolve.c:210
+#: modules/process/sphere-revolve.c:305
 msgid "_Both directions"
 msgstr "О_ба направления"
 
-#: modules/process/sphere-revolve.c:217
+#: modules/process/sphere-revolve.c:315
+msgid "Revolve Sphere"
+msgstr "Вращение сферы"
+
+#: modules/process/sphere-revolve.c:315
 msgid "Revolve Arc"
 msgstr "Вращение дуги"
 
+#: modules/process/sphere-revolve.c:355
+msgid "Direction:"
+msgstr "Направление:"
+
+#: modules/process/sphere-revolve.c:699
+msgid "Revolving sphere..."
+msgstr "Вращающаяся сфера..."
+
+#: modules/process/stitch.c:135
+msgid "Stitch multiple images based on offsets of origins."
+msgstr ""
+"Склеивает несколько изображений вместе основываясь на смещениях начала "
+"координат."
+
+#: modules/process/stitch.c:149
+msgid "/M_ultidata/_Stitch..."
+msgstr "/М_ножественные данные/С_шивание..."
+
+#: modules/process/stitch.c:153
+msgid "Stitch images using offsets"
+msgstr "Склеивает изображения используя смещения"
+
+#: modules/process/stitch.c:269
+msgid "Stitch"
+msgstr "Сшивание"
+
+#: modules/process/stitch.c:312
+msgid "Channels"
+msgstr "Каналы"
+
+#: modules/process/stitch.c:435
+msgid "Restore"
+msgstr "Восстановить"
+
+#: modules/process/stitch.c:445 modules/tools/linestats.c:379
+#: modules/tools/sfunctions.c:440 modules/tools/stats.c:406
+msgid "_Instant updates"
+msgstr "_Обновлять сразу"
+
 #: modules/process/straighten_path.c:126
 msgid "Extracts a straightened part of image along a curve."
 msgstr "Извлекает выпрямленную часть изображения вдоль кривой"
@@ -12673,28 +13388,28 @@ msgstr "Выпрямить вдоль пути"
 msgid "Straighten Path"
 msgstr "Выпрямить путь"
 
-#: modules/process/straighten_path.c:254
+#: modules/process/straighten_path.c:253
 msgid "Res_tore"
 msgstr "_Восстановить"
 
-#: modules/process/straighten_path.c:259
+#: modules/process/straighten_path.c:258
 msgid "Re_verse"
 msgstr "_Обратный порядок"
 
 #: modules/process/straighten_path.c:278 modules/tools/pathlevel.c:256
-#: modules/tools/profile.c:507 modules/tools/roughness.c:854
+#: modules/tools/profile.c:503 modules/tools/roughness.c:868
 msgid "_Thickness:"
 msgstr "_Толщина:"
 
-#: modules/process/straighten_path.c:286
+#: modules/process/straighten_path.c:287
 msgid "_Slackness:"
 msgstr "_Неточность:"
 
-#: modules/process/straighten_path.c:292
+#: modules/process/straighten_path.c:293
 msgid "C_losed curve"
 msgstr "_Замкнутая кривая"
 
-#: modules/process/straighten_path.c:379
+#: modules/process/straighten_path.c:380
 msgid "Straightened"
 msgstr "Выпрямленное"
 
@@ -12717,52 +13432,52 @@ msgstr "Взаимное наложение нескольких изображ
 msgid "Supres"
 msgstr "Сверхразр."
 
-#: modules/process/superresolution.c:421
+#: modules/process/superresolution.c:420
 msgid "Correlating to determine mean shift..."
 msgstr "Поиск макс. корреляции чтобы определить среднее смещение..."
 
-#: modules/process/superresolution.c:511
+#: modules/process/superresolution.c:510
 msgid "Cross-correlation..."
 msgstr "Взаимная корреляция..."
 
-#: modules/process/superresolution.c:554 modules/xyz/xyz_raster.c:1079
-#: modules/xyz/xyz_raster.c:1119
+#: modules/process/superresolution.c:553 modules/xyz/xyz_raster.c:1053
+#: modules/xyz/xyz_raster.c:1093
 msgid "Interpolating..."
 msgstr "Интерполяция..."
 
-#: modules/process/synth.h:343
+#: modules/process/synth.h:344
 msgid "Roundness"
 msgstr "Округлость"
 
-#: modules/process/synth.h:351
+#: modules/process/synth.h:352
 msgid "Roundn_ess:"
 msgstr "О_круглость:"
 
-#: modules/process/synth.h:399
+#: modules/process/synth.h:401
 msgid "Orientation"
 msgstr "Ориентация"
 
-#: modules/process/synth.h:408
+#: modules/process/synth.h:410
 msgid "Orien_tation:"
 msgstr "Ор_иентация:"
 
-#: modules/process/synth.h:432
+#: modules/process/synth.h:436
+msgid "_Truncate:"
+msgstr "_Усечение:"
+
+#: modules/process/synth.h:460
 msgid "Variance:"
 msgstr "Разброс:"
 
-#: modules/process/synth.h:456
-msgid "Deformation"
-msgstr "Деформация"
-
-#: modules/process/synth.h:464
+#: modules/process/synth.h:493
 msgid "_Amplitude:"
 msgstr "_Амплитуда:"
 
-#: modules/process/synth.h:472
+#: modules/process/synth.h:501
 msgid "_Lateral scale:"
 msgstr "_Горизонтальный масштаб:"
 
-#: modules/process/synth.h:566
+#: modules/process/synth.h:595
 msgid "Randomi_ze"
 msgstr "Сделать случа_йным"
 
@@ -12778,41 +13493,41 @@ msgstr "/_Базовые действия/Ограничить _диапазон
 msgid "Limit data range"
 msgstr "Ограничить диапазон данных"
 
-#: modules/process/threshold.c:246
+#: modules/process/threshold.c:241
 msgid "Limit Range"
 msgstr "Ограничить диапазон данных"
 
-#: modules/process/threshold.c:281
+#: modules/process/threshold.c:276
 msgid "Specify _thresholds"
 msgstr "Задать _пороги"
 
-#: modules/process/threshold.c:283
+#: modules/process/threshold.c:278
 msgid "Use _display range"
 msgstr "Использовать отображаемый _диапазон"
 
-#: modules/process/threshold.c:285
+#: modules/process/threshold.c:280
 msgid "Cut off outlier_s"
 msgstr "Обрезать _выпадающие детали."
 
-#: modules/process/threshold.c:294
+#: modules/process/threshold.c:289
 msgid "_Lower:"
 msgstr "С_низу:"
 
-#: modules/process/threshold.c:300
+#: modules/process/threshold.c:295
 msgid "_Upper:"
 msgstr "С_верху:"
 
-#: modules/process/threshold.c:305
+#: modules/process/threshold.c:300
 msgid "Set to _Full Range"
 msgstr "_Полный диапазон"
 
 #. TRANSLATORS: This is a range: 123 to 456.
-#: modules/process/threshold.c:318
+#: modules/process/threshold.c:313
 #, c-format
 msgid "%.*f to %.*f"
 msgstr "от %.*f до %.*f"
 
-#: modules/process/threshold.c:341
+#: modules/process/threshold.c:336
 msgid "F_arther than:"
 msgstr "Д_альше, чем:"
 
@@ -12832,11 +13547,11 @@ msgstr "Наклонить на заданную величину"
 msgid "Tilt"
 msgstr "Н_аклон"
 
-#: modules/process/tilt.c:185 modules/volume/volume_slice.c:444
+#: modules/process/tilt.c:185 modules/volume/volume_slice.c:446
 msgid "_X:"
 msgstr "_X:"
 
-#: modules/process/tilt.c:194 modules/volume/volume_slice.c:464
+#: modules/process/tilt.c:194 modules/volume/volume_slice.c:469
 msgid "_Y:"
 msgstr "_Y:"
 
@@ -12844,31 +13559,31 @@ msgstr "_Y:"
 msgid "Angles"
 msgstr "Углы"
 
-#: modules/process/tip_blind.c:178
+#: modules/process/tip_blind.c:177
 msgid "Blind estimation of SPM tip using Villarubia's algorithm."
 msgstr "Слепая оценка зонда СЗМ используя алгоритм Вильярубия."
 
-#: modules/process/tip_blind.c:192
+#: modules/process/tip_blind.c:191
 msgid "/_Tip and Indentation/_Blind Estimation..."
 msgstr "/_Зонд и индентация/_Слепая оценка..."
 
-#: modules/process/tip_blind.c:196
+#: modules/process/tip_blind.c:195
 msgid "Blind tip estimation"
 msgstr "Слепая оценка зонда"
 
-#: modules/process/tip_blind.c:231
+#: modules/process/tip_blind.c:230
 msgid "Blind Tip Estimation"
 msgstr "Слепая оценка зонда"
 
-#: modules/process/tip_blind.c:232
+#: modules/process/tip_blind.c:231
 msgid "Run _Partial"
 msgstr "Выполнить _частично"
 
-#: modules/process/tip_blind.c:233
+#: modules/process/tip_blind.c:232
 msgid "Run _Full"
 msgstr "Выполнить п_олностью"
 
-#: modules/process/tip_blind.c:234
+#: modules/process/tip_blind.c:233
 msgid "_Reset Tip"
 msgstr "_Сброс зонда"
 
@@ -12876,77 +13591,77 @@ msgstr "_Сброс зонда"
 msgid "Related _data:"
 msgstr "Соответствующие _данные:"
 
-#: modules/process/tip_blind.c:326
+#: modules/process/tip_blind.c:327
 msgid "Estimated Tip Size"
 msgstr "Оценочный размер зонда"
 
-#: modules/process/tip_blind.c:347
+#: modules/process/tip_blind.c:350
 msgid "_Same resolution"
 msgstr "Одинаковое _разрешение"
 
-#: modules/process/tip_blind.c:366
+#: modules/process/tip_blind.c:376
 msgid "Noise suppression t_hreshold:"
 msgstr "_Порог подавления шума:"
 
-#: modules/process/tip_blind.c:386
+#: modules/process/tip_blind.c:384
 msgid "Use _boundaries"
 msgstr "Использовать _границы"
 
-#: modules/process/tip_blind.c:396
+#: modules/process/tip_blind.c:395
 msgid "Stripes"
 msgstr "Полосы"
 
-#: modules/process/tip_blind.c:402
+#: modules/process/tip_blind.c:401
 msgid "_Split to stripes:"
 msgstr "_Разбить на полосы:"
 
-#: modules/process/tip_blind.c:416
+#: modules/process/tip_blind.c:412
 msgid "_Preview stripe:"
 msgstr "_Предпросмотр полосы:"
 
-#: modules/process/tip_blind.c:423
+#: modules/process/tip_blind.c:420
 msgid "Plot size _graph"
 msgstr "Строить _график размера"
 
-#: modules/process/tip_blind.c:433
+#: modules/process/tip_blind.c:430
 msgid "Create tip i_mages"
 msgstr "Создавать _изображения зонда"
 
 #. TRANSLATORS: Prefix for the progressbar message.
-#: modules/process/tip_blind.c:810
+#: modules/process/tip_blind.c:807
 #, c-format
 msgid "Stripe %u: "
 msgstr "Полоска %u: "
 
-#: modules/process/tip_blind.c:917 modules/process/tip_blind.c:941
+#: modules/process/tip_blind.c:914 modules/process/tip_blind.c:938
 msgid "Estimated tip"
 msgstr "Предполагаемый зонд"
 
-#: modules/process/tip_blind.c:1207 modules/process/tip_blind.c:1216
+#: modules/process/tip_blind.c:1204 modules/process/tip_blind.c:1213
 msgid "Tip radius evolution"
 msgstr "Изменение радиуса зонда"
 
-#: modules/process/tip_model.c:114
+#: modules/process/tip_model.c:112
 msgid "Models SPM tip."
 msgstr "Моделирует зонд СЗМ."
 
-#: modules/process/tip_model.c:129
+#: modules/process/tip_model.c:127
 msgid "/_Tip and Indentation/_Model Tip..."
 msgstr "/_Зонд и индентация/_Модель зонда..."
 
-#: modules/process/tip_model.c:133
+#: modules/process/tip_model.c:131
 msgid "Model AFM tip"
 msgstr "Модель зонда АСМ"
 
-#: modules/process/tip_model.c:164
+#: modules/process/tip_model.c:162
 msgid "Model Tip"
 msgstr "Модель зонда"
 
-#: modules/process/tip_model.c:224
+#: modules/process/tip_model.c:222
 msgid "Tip _type:"
 msgstr "Тип _зонда:"
 
-#: modules/process/tip_model.c:229
+#: modules/process/tip_model.c:228
 msgid "_Number of sides:"
 msgstr "_Число сторон"
 
@@ -12958,19 +13673,19 @@ msgstr "_Угол зонда:"
 msgid "Tip _rotation:"
 msgstr "_Поворот зонда:"
 
-#: modules/process/tip_model.c:250
+#: modules/process/tip_model.c:255
 msgid "Tip _apex radius:"
 msgstr "_Радиус острия зонда:"
 
-#: modules/process/tip_model.c:269
+#: modules/process/tip_model.c:265
 msgid "Tip _anisotropy:"
 msgstr "_Анизотропия зонда:"
 
-#: modules/process/tip_model.c:490
+#: modules/process/tip_model.c:484
 msgid "Modeled tip"
 msgstr "Модель зонда"
 
-#: modules/process/tip_model.c:562
+#: modules/process/tip_model.c:556
 #, c-format
 msgid "Tip resolution: %d × %d pixels"
 msgstr "Разрешение зонда: %d × %d пикселей"
@@ -13080,8 +13795,8 @@ msgid "Converts datafield to 3D volume data."
 msgstr "Конвертирует поле данных в трёхмерные объёмные данные."
 
 #: modules/process/volumize.c:56
-msgid "/_Basic Operations/Volumize..."
-msgstr "/_Базовые действия/_Придать объём..."
+msgid "/_Basic Operations/Volumize"
+msgstr "/_Базовые действия/_Превратить в объёмные..."
 
 #: modules/process/volumize.c:60
 msgid "Convert datafield to 3D data"
@@ -13125,73 +13840,77 @@ msgstr "Разрешение по _Z:"
 msgid "Z _range:"
 msgstr "Диапа_зон Z"
 
-#: modules/process/wave_synth.c:211
+#: modules/process/wave_synth.c:219
 msgid "Generates various kinds of waves."
 msgstr "Генерирует различные виды волн."
 
-#: modules/process/wave_synth.c:225
+#: modules/process/wave_synth.c:233
 msgid "/S_ynthetic/_Waves..."
 msgstr "/Син_тез/_Волны..."
 
-#: modules/process/wave_synth.c:229
+#: modules/process/wave_synth.c:237
 msgid "Generate waves"
 msgstr "Генерировать волны"
 
-#: modules/process/wave_synth.c:347
+#: modules/process/wave_synth.c:366
 msgid "Waves"
 msgstr "Волны"
 
-#: modules/process/wave_synth.c:422 modules/tools/linestats.c:337
-#: modules/tools/sfunctions.c:401 modules/volume/volume_linestat.c:369
+#: modules/process/wave_synth.c:441 modules/tools/linestats.c:337
+#: modules/tools/sfunctions.c:411 modules/volume/volume_linestat.c:374
 msgid "_Quantity:"
 msgstr "_Величина:"
 
-#: modules/process/wave_synth.c:429
+#: modules/process/wave_synth.c:448
 msgid "_Number of waves:"
 msgstr "_Число волн:"
 
-#: modules/process/wave_synth.c:436 modules/process/wave_synth.c:582
-#: modules/tools/roughness.c:274
+#: modules/process/wave_synth.c:455 modules/process/wave_synth.c:617
+#: modules/tools/roughness.c:275
 msgid "Amplitude"
 msgstr "Амплитуда"
 
-#: modules/process/wave_synth.c:441
+#: modules/process/wave_synth.c:460
 msgid "_Wave form:"
 msgstr "_Форма волны:"
 
-#: modules/process/wave_synth.c:448
+#: modules/process/wave_synth.c:467
 msgid "Amplitude:"
 msgstr "Амплитуда:"
 
-#: modules/process/wave_synth.c:466
+#: modules/process/wave_synth.c:487
+msgid "_Decay:"
+msgstr "_Затухание:"
+
+#: modules/process/wave_synth.c:497
 msgid "Frequency"
 msgstr "Частота"
 
-#: modules/process/wave_synth.c:472
+#: modules/process/wave_synth.c:503
 msgid "_Spatial frequency:"
 msgstr "_Пространственная частота:"
 
-#: modules/process/wave_synth.c:488
+#: modules/process/wave_synth.c:519
 msgid "_X center:"
 msgstr "_X центра:"
 
-#: modules/process/wave_synth.c:499
+#: modules/process/wave_synth.c:532
 msgid "_Y center:"
 msgstr "_Y центра:"
 
-#: modules/process/wave_synth.c:565
+#: modules/process/wave_synth.c:600
 msgid "Cosine"
 msgstr "Косинус"
 
-#: modules/process/wave_synth.c:566
+#: modules/process/wave_synth.c:601
 msgid "Inverse cosh"
 msgstr "Обратный cosh"
 
-#: modules/process/wave_synth.c:567
+#: modules/process/wave_synth.c:602
 msgid "Flat top"
 msgstr "Плоская вершина"
 
-#: modules/process/wave_synth.c:581
+#: modules/process/wave_synth.c:616
 msgid "Displacement"
 msgstr "Смещение"
 
@@ -13277,40 +13996,40 @@ msgstr "Предобработать изображение"
 msgid "Preprocess and mark"
 msgstr "Предобработать и пометить"
 
-#: modules/process/xydenoise.c:57
+#: modules/process/xydenoise.c:58
 msgid "Denoises measurement on basis of two orthogonal scans."
 msgstr ""
 "Удаляет шум измерения на основе двух сканов в перпендикулярных направлениях."
 
-#: modules/process/xydenoise.c:71
+#: modules/process/xydenoise.c:72
 msgid "/M_ultidata/_XY denoise..."
 msgstr "/М_ножественные данные/_Удаление шума XY..."
 
-#: modules/process/xydenoise.c:75
+#: modules/process/xydenoise.c:76
 msgid "Denoises horizontal/vertical measurement."
 msgstr "Удаляет шум горизонтального/вертикального измерения."
 
-#: modules/process/xydenoise.c:102
+#: modules/process/xydenoise.c:103
 msgid "XY Denoising"
 msgstr "Удаление шума XY"
 
-#: modules/process/xydenoise.c:124
+#: modules/process/xydenoise.c:125
 msgid "Second direction:"
 msgstr "Второе направление:"
 
-#: modules/process/xydenoise.c:232
+#: modules/process/xydenoise.c:233
 msgid "Computing forward FFTs..."
 msgstr "Расчёт прямого БПФ..."
 
-#: modules/process/xydenoise.c:248
+#: modules/process/xydenoise.c:249
 msgid "Computing image..."
 msgstr "Рассчитывается изображение..."
 
-#: modules/process/xydenoise.c:260
+#: modules/process/xydenoise.c:261
 msgid "Computing backward FFT..."
 msgstr "Расчёт обратного БПФ..."
 
-#: modules/process/xydenoise.c:272
+#: modules/process/xydenoise.c:273
 msgid "Denoised"
 msgstr "Без шума"
 
@@ -13326,65 +14045,69 @@ msgstr "/_Базовые действия/Преобразовать в _XYZ"
 msgid "Convert to XYZ data"
 msgstr "Преобразовать в данные XYZ"
 
-#: modules/pygwy/pygwy-console.c:55
+#: modules/pygwy/pygwy-console.c:99
 msgid "/Pygwy Console"
 msgstr "/Консоль Pygwy"
 
-#: modules/pygwy/pygwy-console.c:59
+#: modules/pygwy/pygwy-console.c:103
 msgid "Python wrapper console"
 msgstr "Командная строка оболочки Python"
 
-#: modules/pygwy/pygwy-console.c:142
-msgid ">>> Running the script above\n"
-msgstr ">>> Запускается вышеприведённый скрипт\n"
-
-#: modules/pygwy/pygwy-console.c:194
-msgid "Open Python script"
-msgstr "Открыть скрипт Python"
-
-#: modules/pygwy/pygwy-console.c:275
-msgid "Save Script as"
-msgstr "Сохранить скрипт как"
-
-#: modules/pygwy/pygwy-console.c:327
+#: modules/pygwy/pygwy-console.c:168 modules/pygwy/pygwy-console.c:481
 msgid "Pygwy Console"
 msgstr "Консоль Pygwy"
 
-#: modules/pygwy/pygwy-console.c:340
-msgid "Clear Log"
-msgstr "Очистить лог"
-
-#: modules/pygwy/pygwy-console.c:344
+#: modules/pygwy/pygwy-console.c:187
 msgid "Open script in Python language (Ctrl-O)"
 msgstr "Открыть скрипт на языке Python (Ctrl-O)"
 
-#: modules/pygwy/pygwy-console.c:346
+#: modules/pygwy/pygwy-console.c:197
 msgid "Save script (Ctrl-S)"
-msgstr "Сохранить сценарий (Ctrl-S)"
+msgstr "Сохранить скрипт (Ctrl-S)"
+
+#: modules/pygwy/pygwy-console.c:207
+msgid "Save script as (Ctrl-Shift-S)"
+msgstr "Сохранить скрипт как (Ctrl-Shift-S)"
 
-#: modules/pygwy/pygwy-console.c:348
+#: modules/pygwy/pygwy-console.c:217
 msgid "Execute script (Ctrl-E)"
-msgstr "Выполнить сценарий (Ctrl-E)"
+msgstr "Выполнить скрипт (Ctrl-E)"
 
-#: modules/pygwy/pygwy-console.c:426
+#: modules/pygwy/pygwy-console.c:227
+msgid "Clear Log"
+msgstr "Очистить лог"
+
+#: modules/pygwy/pygwy-console.c:285
 msgid "Command"
 msgstr "Команда"
 
-#: pygwy.c:120
+#: modules/pygwy/pygwy-console.c:371
+msgid ">>> Running the script above\n"
+msgstr ">>> Запускается вышеприведённый скрипт\n"
+
+#: modules/pygwy/pygwy-console.c:425
+msgid "Save Python Script as"
+msgstr "Сохранить скрипт Python как"
+
+#: modules/pygwy/pygwy-console.c:429
+msgid "Open Python Script"
+msgstr "Открыть скрипт Python"
+
+#: pygwy.c:130
 msgid "Pygwy, the Gwyddion Python wrapper."
 msgstr "Pygwy, оболочка Python в Gwyddion."
 
-#: pygwy.c:258
+#: pygwy.c:269
 msgid "Python Interpreter Errors"
 msgstr "Ошибки интерпретатора Python"
 
-#: pygwy.c:384
+#: pygwy.c:399
 msgid "Python interpreter error occurred."
 msgstr "Произошла ошибка интерпретатора Python."
 
-#: pygwy.c:459
+#: pygwy.c:499
 msgid "Function written in Python"
-msgstr "Функция на языке Python"
+msgstr "Функция написанная на Python"
 
 #: modules/tools/crop.c:84
 msgid "Crop tool, crops data to smaller size."
@@ -13407,11 +14130,11 @@ msgid "Measure distances and directions between points"
 msgstr "Измерить расстояния и углы между точками"
 
 #. TRANSLATORS: Number is verb here.
-#: modules/tools/distance.c:250 modules/tools/profile.c:532
+#: modules/tools/distance.c:250 modules/tools/profile.c:527
 msgid "_Number lines"
 msgstr "_Нумеровать линии"
 
-#: modules/tools/filter.c:128
+#: modules/tools/filter.c:129
 msgid ""
 "Filter tool, processes selected part of data with a filter (conservative "
 "denoise, mean, median. Kuwahara, minimum, maximum)."
@@ -13419,27 +14142,27 @@ msgstr ""
 "Инструмент-фильтр, обрабатывает выбранную часть данных фильтром (выборочной "
 "уборки шума, среднего, срединного. Кувахара, минимум. максимум)."
 
-#: modules/tools/filter.c:171
+#: modules/tools/filter.c:172
 msgid "Basic filters: mean, median, denoise, …"
 msgstr "Основные фильтры: среднее, срединное, убрать шум, …"
 
-#: modules/tools/filter.c:239
+#: modules/tools/filter.c:240
 msgid "Conservative denoise"
 msgstr "Выборочная уборка шума"
 
-#: modules/tools/filter.c:246
+#: modules/tools/filter.c:247
 msgid "Kuwahara"
 msgstr "Кувахара"
 
-#: modules/tools/filter.c:247
+#: modules/tools/filter.c:248
 msgid "Dechecker"
 msgstr "Убрать \"шахматную доску\""
 
-#: modules/tools/filter.c:248
+#: modules/tools/filter.c:249
 msgid "filter|Gaussian"
 msgstr "Гауссов"
 
-#: modules/tools/filter.c:249
+#: modules/tools/filter.c:250
 msgid "Sharpen"
 msgstr "Сделать резким"
 
@@ -13536,7 +14259,7 @@ msgid "Height histogram"
 msgstr "Гистограмма высот"
 
 #: modules/tools/icolorange.c:329 modules/tools/linestats.c:169
-#: modules/tools/sfunctions.c:226 modules/volume/volume_linestat.c:146
+#: modules/tools/sfunctions.c:231 modules/volume/volume_linestat.c:148
 msgid "Range"
 msgstr "Диапазон"
 
@@ -13564,7 +14287,7 @@ msgstr "_Инвертировать шкалу"
 msgid "range|Full"
 msgstr "Полный"
 
-#: modules/tools/level3.c:106
+#: modules/tools/level3.c:108
 msgid ""
 "Three-point level tool, levels data by subtracting a plane fitted through "
 "three selected points."
@@ -13572,23 +14295,23 @@ msgstr ""
 "Инструмент выравнивания по трём точкам, выравнивает данные вычитанием "
 "плоскости, проходящей через три выбранные точки."
 
-#: modules/tools/level3.c:143
+#: modules/tools/level3.c:145
 msgid "Three Point Level"
 msgstr "Выравнивание по трём точкам"
 
-#: modules/tools/level3.c:144
+#: modules/tools/level3.c:146
 msgid "Level data by fitting a plane through three points"
 msgstr "Выровнять данные построив плоскость по трём точкам"
 
-#: modules/tools/level3.c:239 modules/tools/readvalue.c:375
+#: modules/tools/level3.c:244 modules/tools/readvalue.c:378
 msgid "_Averaging radius:"
 msgstr "Радиус _усреднения:"
 
-#: modules/tools/level3.c:246
+#: modules/tools/level3.c:251
 msgid "_Instant apply"
 msgstr "Применять _сразу"
 
-#: modules/tools/level3.c:255
+#: modules/tools/level3.c:261
 msgid "Set plane to _zero"
 msgstr "Установить плоскость в _нуль"
 
@@ -13600,23 +14323,23 @@ msgstr ""
 "Функция статистики по строке/столбцу, средние, срединные, максимумы, "
 "минимумы. среднеквадратичные, и т.п., строк и столбцов."
 
-#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:148
+#: modules/tools/linestats.c:172 modules/volume/volume_linestat.c:150
 msgid "tan β<sub>0</sub>"
 msgstr "tan β<sub>0</sub>"
 
-#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:150
+#: modules/tools/linestats.c:174 modules/volume/volume_linestat.c:152
 msgid "Ra"
 msgstr "Ra"
 
-#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:151
+#: modules/tools/linestats.c:175 modules/volume/volume_linestat.c:153
 msgid "Rq (RMS)"
 msgstr "Rq (Ср. квадр.)"
 
-#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:152
+#: modules/tools/linestats.c:176 modules/volume/volume_linestat.c:154
 msgid "Rz"
 msgstr "Rz"
 
-#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:153
+#: modules/tools/linestats.c:177 modules/volume/volume_linestat.c:155
 msgid "Rt"
 msgstr "Rt"
 
@@ -13640,16 +14363,11 @@ msgstr "С_толбцы"
 msgid "Average:"
 msgstr "Среднее:"
 
-#: modules/tools/linestats.c:363 modules/tools/profile.c:464
-#: modules/tools/sfunctions.c:414 modules/tools/spectro.c:343
+#: modules/tools/linestats.c:363 modules/tools/profile.c:460
+#: modules/tools/sfunctions.c:424 modules/tools/spectro.c:346
 msgid "<b>Options</b>"
 msgstr "<b>Параметры</b>"
 
-#: modules/tools/linestats.c:379 modules/tools/sfunctions.c:430
-#: modules/tools/stats.c:408
-msgid "_Instant updates"
-msgstr "_Обновлять сразу"
-
 #: modules/tools/maskedit.c:170
 msgid "Mask editor tool, allows interactive modification of parts of the mask."
 msgstr "Редактор маски, позволяет интерактивно изменять части маски."
@@ -13706,63 +14424,63 @@ msgstr "Заполнение непрерывных пустых областе
 msgid "Erase continuous parts of mask"
 msgstr "Удаление непрерывных частей маски"
 
-#: modules/tools/maskedit.c:408
+#: modules/tools/maskedit.c:409
 msgid "Editor"
 msgstr "Редактор"
 
-#: modules/tools/maskedit.c:413
+#: modules/tools/maskedit.c:414
 msgid "_Shapes"
 msgstr "_Фигуры"
 
-#: modules/tools/maskedit.c:423
+#: modules/tools/maskedit.c:428
 msgid "Mode:"
 msgstr "Режим:"
 
-#: modules/tools/maskedit.c:452
+#: modules/tools/maskedit.c:458
 msgid "Shape:"
 msgstr "Форма:"
 
-#: modules/tools/maskedit.c:483
+#: modules/tools/maskedit.c:486
 msgid "_Drawing Tools"
 msgstr "И_нструменты рисования"
 
-#: modules/tools/maskedit.c:493
+#: modules/tools/maskedit.c:500
 msgid "Tool:"
 msgstr "Инструмент:"
 
-#: modules/tools/maskedit.c:532
+#: modules/tools/maskedit.c:538
 msgid "Actions"
 msgstr "Действия"
 
-#: modules/tools/maskedit.c:540
+#: modules/tools/maskedit.c:546
 msgid "_Invert"
 msgstr "_Инвертировать"
 
-#: modules/tools/maskedit.c:571
+#: modules/tools/maskedit.c:577
 msgid "Fill _Voids"
 msgstr "З_аполнить Пустоты"
 
-#: modules/tools/maskedit.c:580
+#: modules/tools/maskedit.c:586
 msgid "Fill non-simple-connected"
 msgstr "Заполнять неодносвязные"
 
-#: modules/tools/maskedit.c:591
+#: modules/tools/maskedit.c:597
 msgid "Grow/Shrink"
 msgstr "Растянуть/Ужать"
 
-#: modules/tools/maskedit.c:600
+#: modules/tools/maskedit.c:606
 msgid "_Grow"
 msgstr "_Растянуть"
 
-#: modules/tools/maskedit.c:608
+#: modules/tools/maskedit.c:614
 msgid "Shrin_k"
 msgstr "_Ужать"
 
-#: modules/tools/maskedit.c:623
+#: modules/tools/maskedit.c:629
 msgid "_Amount:"
 msgstr "_Количество:"
 
-#: modules/tools/maskedit.c:651
+#: modules/tools/maskedit.c:657
 msgid "_Prevent grain merging by growing"
 msgstr "_Предотвращать слияние зёрен при растяжении"
 
@@ -13780,83 +14498,95 @@ msgstr "Выровнять вдоль линии"
 msgid "Level rows using intersections with given lines"
 msgstr "Выровнять строки используя пересечения с заданными линиями"
 
-#: modules/tools/profile.c:222
+#: modules/tools/profile.c:216
 msgid "Profile tool, creates profile graphs from selected lines."
 msgstr "Инструмент профиля, создает графики профилей вдоль выбранных линий."
 
-#: modules/tools/profile.c:276 modules/tools/profile.c:630
+#: modules/tools/profile.c:270 modules/tools/profile.c:609
 msgid "Profiles"
 msgstr "Профили"
 
-#: modules/tools/profile.c:277
+#: modules/tools/profile.c:271
 msgid "Extract profiles"
 msgstr "Извлечь профили"
 
-#: modules/tools/profile.c:480
-msgid "_Radial profiles"
-msgstr "_Радиальные профили"
+#: modules/tools/profile.c:478
+msgid "Linear profiles"
+msgstr "Линейные профили"
 
-#: modules/tools/profile.c:493
-msgid "Symmetrize _All"
-msgstr "Сделать симметричным вс_е"
-
-#: modules/tools/profile.c:498
-msgid "S_ymmetrize"
-msgstr "Сделать с_имметричным"
+#: modules/tools/profile.c:480
+msgid "Radial profiles"
+msgstr "Радиальные профили"
 
-#: modules/tools/profile.c:542
+#: modules/tools/profile.c:537
 msgid "_Separate profiles"
 msgstr "_Разделить профили"
 
-#: modules/tools/profile.c:607
+#: modules/tools/profile.c:587
 msgid "_Calibration data:"
 msgstr "Данные _калибровки:"
 
-#: modules/tools/profile.c:620
+#: modules/tools/profile.c:600
 msgid "_Show profile"
 msgstr "_Показать профиль"
 
-#: modules/tools/profile.c:887
+#: modules/tools/profile.c:861
 #, c-format
 msgid "X error %d"
 msgstr "Ошибка по X %d"
 
-#: modules/tools/profile.c:891
+#: modules/tools/profile.c:865
 #, c-format
 msgid "Y error %d"
 msgstr "Ошибка по Y %d"
 
-#: modules/tools/profile.c:895
+#: modules/tools/profile.c:869
 #, c-format
 msgid "Z error %d"
 msgstr "Ошибка по Z %d"
 
-#: modules/tools/profile.c:899
+#: modules/tools/profile.c:873
 #, c-format
 msgid "X uncertainty %d"
 msgstr "Погрешность по X %d"
 
-#: modules/tools/profile.c:903
+#: modules/tools/profile.c:877
 #, c-format
 msgid "Y uncertainty %d"
 msgstr "Погрешность по Y %d"
 
-#: modules/tools/profile.c:907
+#: modules/tools/profile.c:881
 #, c-format
 msgid "Z uncertainty %d"
 msgstr "Погрешность по Z %d"
 
-#: modules/tools/profile.c:912
+#: modules/tools/profile.c:886
 #, c-format
 msgid "Zunc up bound %d"
 msgstr "Верхняя граница погрешности Z %d"
 
-#: modules/tools/profile.c:917
+#: modules/tools/profile.c:891
 #, c-format
 msgid "Zunc low bound %d"
 msgstr "Нижняя граница погрешности Z %d"
 
-#: modules/tools/profile.c:1817
+#: modules/tools/profile.c:1637
+msgid "S_ymmetrize"
+msgstr "Сделать с_имметричным"
+
+#: modules/tools/profile.c:1639
+msgid "Symmetrize _All"
+msgstr "Сделать симметричным вс_е"
+
+#: modules/tools/profile.c:1643
+msgid "Improve _Direction"
+msgstr "Улучшить _направление"
+
+#: modules/tools/profile.c:1645
+msgid "Improve _All"
+msgstr "Улушить _всё"
+
+#: modules/tools/profile.c:1866
 msgid "calib-data|None"
 msgstr "Нет"
 
@@ -13872,196 +14602,196 @@ msgstr "Считать значение"
 msgid "Read value under mouse cursor"
 msgstr "Считать значение под курсором мыши."
 
-#: modules/tools/readvalue.c:304
+#: modules/tools/readvalue.c:307
 msgid "Set _Zero"
 msgstr "Установить _нуль"
 
-#: modules/tools/readvalue.c:307
+#: modules/tools/readvalue.c:310
 msgid "Shift plane z=0 to pass through the selected point"
 msgstr "Сдвигает плоскость z=0 так, чтобы она проходила через выбранную точку"
 
-#: modules/tools/readvalue.c:315
+#: modules/tools/readvalue.c:318
 msgid "Facet"
 msgstr "Грань"
 
-#: modules/tools/readvalue.c:340
+#: modules/tools/readvalue.c:343
 msgid "Curvatures"
 msgstr "Кривизна"
 
-#: modules/tools/readvalue.c:382
+#: modules/tools/readvalue.c:386
 msgid "Show _selection"
 msgstr "Показать _выбор"
 
-#: modules/tools/roughness.c:282
+#: modules/tools/roughness.c:283
 msgid "Roughness average"
 msgstr "Средняя шероховатость"
 
-#: modules/tools/roughness.c:290
+#: modules/tools/roughness.c:291
 msgid "Root mean square roughness"
 msgstr "Среднеквадратичная шероховатость"
 
-#: modules/tools/roughness.c:298
+#: modules/tools/roughness.c:299
 msgid "Maximum height of the roughness"
 msgstr "Максимальная высота шероховатости"
 
-#: modules/tools/roughness.c:306
+#: modules/tools/roughness.c:307
 msgid "Maximum roughness valley depth"
 msgstr "Максимальная глубина впадины шероховатости"
 
-#: modules/tools/roughness.c:314
+#: modules/tools/roughness.c:315
 msgid "Maximum roughness peak height"
 msgstr "Максимальная высота пика шероховатости"
 
-#: modules/tools/roughness.c:322 modules/tools/roughness.c:370
+#: modules/tools/roughness.c:323 modules/tools/roughness.c:371
 msgid "Average maximum height of the roughness"
 msgstr "Средняя максимальная высота шероховатости"
 
-#: modules/tools/roughness.c:330
+#: modules/tools/roughness.c:331
 msgid "Average maximum roughness valley depth"
 msgstr "Средняя максимальная глубина долины шероховатости"
 
-#: modules/tools/roughness.c:338
+#: modules/tools/roughness.c:339
 msgid "Average maximum roughness peak height"
 msgstr "Средняя максимальная высота пика шероховатости"
 
-#: modules/tools/roughness.c:346 modules/tools/roughness.c:354
+#: modules/tools/roughness.c:347 modules/tools/roughness.c:355
 msgid "Average third highest peak to third lowest valley height"
 msgstr ""
 "Среднее отношение высоты третьего по высоте пика к глубине третьей по "
 "глубине впадины"
 
-#: modules/tools/roughness.c:362
+#: modules/tools/roughness.c:363
 msgid "Average maximum height of the profile"
 msgstr "Средняя максимальная высота профиля"
 
-#: modules/tools/roughness.c:378
+#: modules/tools/roughness.c:379
 msgid "Skewness"
 msgstr "Коэффициент асимметрии"
 
-#: modules/tools/roughness.c:394
+#: modules/tools/roughness.c:395
 msgid "Waviness average"
 msgstr "Средняя волнистость"
 
-#: modules/tools/roughness.c:402
+#: modules/tools/roughness.c:403
 msgid "Root mean square waviness"
 msgstr "Среднеквадратичная волнистость"
 
-#: modules/tools/roughness.c:410
+#: modules/tools/roughness.c:411
 msgid "Waviness maximum height"
 msgstr "Максимальная высота волнистости"
 
-#: modules/tools/roughness.c:418
+#: modules/tools/roughness.c:419
 msgid "Maximum height of the profile"
 msgstr "Максимальная высота профиля"
 
-#: modules/tools/roughness.c:426
+#: modules/tools/roughness.c:427
 msgid "Spatial"
 msgstr "Пространственные"
 
-#: modules/tools/roughness.c:476
+#: modules/tools/roughness.c:477
 msgid "Average wavelength of the profile"
 msgstr "Средняя длина волны профиля"
 
-#: modules/tools/roughness.c:484
+#: modules/tools/roughness.c:485
 msgid "Root mean square (RMS) wavelength of the profile"
 msgstr "Среднеквадратичная длина волны профиля"
 
-#: modules/tools/roughness.c:492
+#: modules/tools/roughness.c:493
 msgid "Hybrid"
 msgstr "Гибридные"
 
-#: modules/tools/roughness.c:500
+#: modules/tools/roughness.c:501
 msgid "Average absolute slope"
 msgstr "Средний по модулю наклон"
 
-#: modules/tools/roughness.c:508
+#: modules/tools/roughness.c:509
 msgid "Root mean square (RMS) slope"
 msgstr "Среднеквадратичный наклон"
 
-#: modules/tools/roughness.c:524
+#: modules/tools/roughness.c:525
 msgid "Developed profile length"
 msgstr "Длина растянутого профиля"
 
-#: modules/tools/roughness.c:532
+#: modules/tools/roughness.c:533
 msgid "Profile length ratio"
 msgstr "Относительная длина профиля"
 
-#: modules/tools/roughness.c:615
+#: modules/tools/roughness.c:616
 msgid "Calculate surface profile parameters."
 msgstr "Рассчитывает параметры профиля поверхности."
 
-#: modules/tools/roughness.c:648 modules/tools/roughness.c:773
-#: modules/tools/roughness.c:1452
+#: modules/tools/roughness.c:649 modules/tools/roughness.c:774
+#: modules/tools/roughness.c:1479
 msgid "Roughness"
 msgstr "Шероховатость"
 
-#: modules/tools/roughness.c:649
+#: modules/tools/roughness.c:650
 msgid "Calculate roughness parameters"
 msgstr "Рассчитать параметры шероховатости"
 
-#: modules/tools/roughness.c:771 modules/tools/roughness.c:1450
+#: modules/tools/roughness.c:772 modules/tools/roughness.c:1477
 msgid "Texture"
 msgstr "Текстура"
 
-#: modules/tools/roughness.c:772 modules/tools/roughness.c:1451
+#: modules/tools/roughness.c:773 modules/tools/roughness.c:1478
 msgid "Waviness"
 msgstr "Волнистость"
 
-#: modules/tools/roughness.c:774
+#: modules/tools/roughness.c:775
 msgid "ADF"
 msgstr "ФРА"
 
-#: modules/tools/roughness.c:775
+#: modules/tools/roughness.c:776
 msgid "BRC"
 msgstr "ООК"
 
-#: modules/tools/roughness.c:776 modules/tools/roughness.c:1455
+#: modules/tools/roughness.c:777 modules/tools/roughness.c:1482
 msgid "Peak Count"
 msgstr "Число пиков"
 
-#: modules/tools/roughness.c:838 modules/xyz/xyz_drift.c:1090
+#: modules/tools/roughness.c:839 modules/xyz/xyz_drift.c:1090
 msgid "_Graph:"
 msgstr "_График:"
 
-#: modules/tools/roughness.c:845
+#: modules/tools/roughness.c:847
 msgid "C_ut-off:"
 msgstr "_Порог:"
 
-#: modules/tools/roughness.c:1324
+#: modules/tools/roughness.c:1345
 msgid "No profile selected."
 msgstr "Профилей не выбрано."
 
-#: modules/tools/roughness.c:1453
+#: modules/tools/roughness.c:1480
 msgid "Amplitude Distribution Function"
 msgstr "Функция распределения амплитуды"
 
-#: modules/tools/roughness.c:1454
+#: modules/tools/roughness.c:1481
 msgid "The Bearing Ratio Curve"
 msgstr "Относительная опорная кривая"
 
-#: modules/tools/roughness.c:1489
+#: modules/tools/roughness.c:1516
 msgid "Surface Profiles"
 msgstr "Профили поверхности"
 
-#: modules/tools/roughness.c:1877
+#: modules/tools/roughness.c:1904
 msgid "Save Roughness Parameters"
 msgstr "Сохранить параметры шероховатости"
 
-#: modules/tools/roughness.c:1934
+#: modules/tools/roughness.c:1961
 msgid "Roughness Parameters"
 msgstr "Параметры шероховатости"
 
-#: modules/tools/roughness.c:1940
+#: modules/tools/roughness.c:1967
 #, c-format
 msgid "File:              %s\n"
 msgstr "Файл:              %s\n"
 
-#: modules/tools/roughness.c:1944
+#: modules/tools/roughness.c:1971
 #, c-format
 msgid "Data channel:      %s\n"
 msgstr "Канал данных:      %s\n"
 
-#: modules/tools/roughness.c:1975
+#: modules/tools/roughness.c:2002
 #, c-format
 msgid ""
 "Selected line:     (%s, %s) to (%s, %s) px\n"
@@ -14098,7 +14828,7 @@ msgstr "на _все файлы"
 msgid "_Copy"
 msgstr "_Копировать"
 
-#: modules/tools/sfunctions.c:181
+#: modules/tools/sfunctions.c:186
 msgid ""
 "Statistical function tool, calculates one-dimensional statistical functions "
 "(height distribution, correlations, PSDF, Minkowski functionals) of selected "
@@ -14108,87 +14838,91 @@ msgstr ""
 "(распределение высоты, корреляции, функция спектральной плотности мощности "
 "(ФСПМ, PSDF), функционалы Минковского) выбранной части данных."
 
-#: modules/tools/sfunctions.c:214
+#: modules/tools/sfunctions.c:219
 msgid "Height distribution"
 msgstr "Распределение высоты"
 
-#: modules/tools/sfunctions.c:215
+#: modules/tools/sfunctions.c:220
 msgid "Cum. height distribution"
 msgstr "Интегр. распределение высоты"
 
-#: modules/tools/sfunctions.c:216
+#: modules/tools/sfunctions.c:221
 msgid "Distribution of angles"
 msgstr "Распределение углов"
 
-#: modules/tools/sfunctions.c:217
+#: modules/tools/sfunctions.c:222
 msgid "Cum. distribution of angles"
 msgstr "Интегр. распределение углов"
 
-#: modules/tools/sfunctions.c:218
+#: modules/tools/sfunctions.c:223
 msgid "ACF"
 msgstr "АКФ"
 
-#: modules/tools/sfunctions.c:219
+#: modules/tools/sfunctions.c:224
 msgid "HHCF"
 msgstr "ФКВВ"
 
-#: modules/tools/sfunctions.c:220
+#: modules/tools/sfunctions.c:225
 msgid "PSDF"
 msgstr "ФСПМ"
 
-#: modules/tools/sfunctions.c:221
+#: modules/tools/sfunctions.c:226
 msgid "Radial PSDF"
 msgstr "Радиальная ФСПМ"
 
-#: modules/tools/sfunctions.c:222
+#: modules/tools/sfunctions.c:227
 msgid "Radial ACF"
 msgstr "Радиальная АКФ"
 
-#: modules/tools/sfunctions.c:223
+#: modules/tools/sfunctions.c:228
 msgid "Minkowski volume"
 msgstr "Объём Минковского"
 
-#: modules/tools/sfunctions.c:224
+#: modules/tools/sfunctions.c:229
 msgid "Minkowski boundary"
 msgstr "Граница Минковского"
 
-#: modules/tools/sfunctions.c:225
+#: modules/tools/sfunctions.c:230
 msgid "Minkowski connectivity"
 msgstr "Связность Минковского"
 
-#: modules/tools/sfunctions.c:251
+#: modules/tools/sfunctions.c:232
+msgid "Area scale graph"
+msgstr "График функции относительной площади"
+
+#: modules/tools/sfunctions.c:257
 msgid "Statistical Functions"
 msgstr "Статистические функции"
 
-#: modules/tools/sfunctions.c:252
+#: modules/tools/sfunctions.c:258
 msgid "Calculate 1D statistical functions"
 msgstr "Рассчитать одномерные статистические функции"
 
-#: modules/tools/sfunctions.c:504
+#: modules/tools/sfunctions.c:501
 msgid "_Separate uncertainty"
-msgstr "_Разделить погрешности"
+msgstr "_Разделить погрешность"
 
-#: modules/tools/spectro.c:151
+#: modules/tools/spectro.c:154
 msgid "Point Spectrum, extracts point spectra to a graph."
 msgstr "Спектр в точке, извлечь спектры в точке в график."
 
-#: modules/tools/spectro.c:190
+#: modules/tools/spectro.c:193
 msgid "Point Spectroscopy"
 msgstr "Спектроскопия в точке"
 
-#: modules/tools/spectro.c:191
+#: modules/tools/spectro.c:194
 msgid "Extract and view point spectroscopy data"
 msgstr "Извлечь и посмотреть данные спектроскопии в точке"
 
-#: modules/tools/spectro.c:359
+#: modules/tools/spectro.c:362
 msgid "_Separate spectra"
 msgstr "Разделить _спектры"
 
-#: modules/tools/spectro.c:369
+#: modules/tools/spectro.c:372
 msgid "_Average spectra"
 msgstr "_Усреднить спектры"
 
-#: modules/tools/spectro.c:508
+#: modules/tools/spectro.c:511
 msgid "Spectroscopy"
 msgstr "Спектроскопия"
 
@@ -14228,14 +14962,6 @@ msgstr "Не выбраны точки на изображении."
 msgid "No area in the zoom selected."
 msgstr "Не выбрана область на увеличенном изображении."
 
-#: modules/tools/stats.c:205
-msgid "Average value:"
-msgstr "Среднее значение:"
-
-#: modules/tools/stats.c:206
-msgid "Median:"
-msgstr "Срединное значение:"
-
 #: modules/tools/stats.c:207
 msgid "Ra (Sa):"
 msgstr "Ra (Sa):"
@@ -14248,14 +14974,6 @@ msgstr "Rms (Sq):"
 msgid "Rms (grain-wise):"
 msgstr "Ср. квадр. зёрен:"
 
-#: modules/tools/stats.c:210
-msgid "Skew:"
-msgstr "Асимметрия:"
-
-#: modules/tools/stats.c:211
-msgid "Kurtosis:"
-msgstr "Эксцесс:"
-
 #: modules/tools/stats.c:212
 msgid "Surface area:"
 msgstr "Площадь поверхности:"
@@ -14264,10 +14982,6 @@ msgstr "Площадь поверхности:"
 msgid "Projected area:"
 msgstr "Площадь проекции:"
 
-#: modules/tools/stats.c:214
-msgid "Variation:"
-msgstr "Вариация:"
-
 #: modules/tools/stats.c:217
 msgid "Inclination θ:"
 msgstr "Наклон θ:"
@@ -14280,7 +14994,7 @@ msgstr "Наклон φ:"
 msgid "Statistics tool."
 msgstr "Инструмент статистики."
 
-#: modules/tools/stats.c:261 modules/tools/stats.c:1095
+#: modules/tools/stats.c:261 modules/tools/stats.c:1091
 msgid "Statistical Quantities"
 msgstr "Статистические величины"
 
@@ -14288,29 +15002,29 @@ msgstr "Статистические величины"
 msgid "Statistical quantities"
 msgstr "Статистические величины"
 
-#: modules/tools/stats.c:1002
+#: modules/tools/stats.c:998
 msgid "Save Statistical Quantities"
 msgstr "Сохранять статистические величины"
 
-#: modules/tools/stats.c:1100
+#: modules/tools/stats.c:1096
 #, c-format
 msgid "File:         %s\n"
 msgstr "Файл:         %s\n"
 
-#: modules/tools/stats.c:1104
+#: modules/tools/stats.c:1100
 #, c-format
 msgid "Data channel: %s\n"
 msgstr "Канал данных: %s\n"
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "Yes"
 msgstr "Да"
 
-#: modules/tools/stats.c:1122
+#: modules/tools/stats.c:1118
 msgid "No"
 msgstr "Нет"
 
-#: modules/tools/stats.c:1132
+#: modules/tools/stats.c:1128
 #, c-format
 msgid ""
 "Selected area: %s × %s at (%s, %s) px\n"
@@ -14334,182 +15048,178 @@ msgstr "/_Размеры и единицы измерения..."
 msgid "Volume Dimensions and Units"
 msgstr "Размеры и единицы измерения объёмных данных"
 
-#: modules/volume/volume_calibrate.c:526
+#: modules/volume/volume_calibrate.c:486
 msgid "_Value range:"
 msgstr "Диапазон з_начений:"
 
-#: modules/volume/volume_calibrate.c:555
+#: modules/volume/volume_calibrate.c:508
 msgid "Value shi_ft:"
 msgstr "С_двиг значений:"
 
-#: modules/volume/volume_calibrate.c:601
+#: modules/volume/volume_calibrate.c:542
 msgid "_Value calibration factor:"
 msgstr "Множитель калибровки зн_ачений:"
 
-#: modules/volume/volume_extract.c:223
+#: modules/volume/volume_extract.c:216
 msgid "Shows and/or extracts a section of volume data"
 msgstr "Показывает и/или извлекает сечение объёмных данных"
 
-#: modules/volume/volume_extract.c:237
-msgid "/Show and _extract..."
+#: modules/volume/volume_extract.c:230
+msgid "/Show and _Extract..."
 msgstr "/Показать и _извлечь..."
 
-#: modules/volume/volume_extract.c:241
+#: modules/volume/volume_extract.c:234
 msgid "Show and/or extract a section of volume data"
 msgstr "Показать и/или извлечь сечение из объёмных данных"
 
-#: modules/volume/volume_extract.c:270
+#: modules/volume/volume_extract.c:263
 msgid "X cross-section"
 msgstr "Сечение по X"
 
-#: modules/volume/volume_extract.c:271
+#: modules/volume/volume_extract.c:264
 msgid "Y cross-section"
 msgstr "Сечение по Y"
 
-#: modules/volume/volume_extract.c:272
+#: modules/volume/volume_extract.c:265
 msgid "Z cross-section"
 msgstr "Сечение по Z"
 
-#: modules/volume/volume_extract.c:273 modules/volume/volume_extract.c:698
+#: modules/volume/volume_extract.c:266 modules/volume/volume_extract.c:684
 msgid "X direction sum"
 msgstr "Сумма по направлению X"
 
-#: modules/volume/volume_extract.c:274 modules/volume/volume_extract.c:700
+#: modules/volume/volume_extract.c:267 modules/volume/volume_extract.c:686
 msgid "Y direction sum"
 msgstr "Сумма по направлению Y"
 
-#: modules/volume/volume_extract.c:275 modules/volume/volume_extract.c:702
+#: modules/volume/volume_extract.c:268 modules/volume/volume_extract.c:688
 msgid "Z direction sum"
 msgstr "Сумма по направлению Z"
 
-#: modules/volume/volume_extract.c:278
+#: modules/volume/volume_extract.c:271
 msgid "X direction"
 msgstr "Направление X"
 
-#: modules/volume/volume_extract.c:279
+#: modules/volume/volume_extract.c:272
 msgid "Y direction"
 msgstr "Направление Y"
 
-#: modules/volume/volume_extract.c:280
+#: modules/volume/volume_extract.c:273
 msgid "Z direction"
 msgstr "Направление Z"
 
-#: modules/volume/volume_extract.c:322
+#: modules/volume/volume_extract.c:315
 msgid "Volume data"
 msgstr "Объёмные данные"
 
-#: modules/volume/volume_extract.c:324
+#: modules/volume/volume_extract.c:317
 msgid "_Load"
 msgstr "_Загрузить"
 
-#: modules/volume/volume_extract.c:336
+#: modules/volume/volume_extract.c:329
 msgid "_Extract projection"
 msgstr "_Извлечь проекцию"
 
-#: modules/volume/volume_extract.c:354
+#: modules/volume/volume_extract.c:347
 msgid "Projections"
 msgstr "Проекции"
 
-#: modules/volume/volume_extract.c:404
+#: modules/volume/volume_extract.c:395
 msgid "Z position"
 msgstr "Положение по Z"
 
-#: modules/volume/volume_extract.c:409
+#: modules/volume/volume_extract.c:405
 msgid "Shown cut direction:"
 msgstr "Показано направление разреза:"
 
-#: modules/volume/volume_extract.c:419 modules/volume/volume_extract.c:500
-msgid "Show mode:"
-msgstr "Режим отображения:"
-
-#: modules/volume/volume_extract.c:490
+#: modules/volume/volume_extract.c:485
 msgid "Graph cut direction:"
 msgstr "Режим сечения графика:"
 
-#: modules/volume/volume_extract.c:525
+#: modules/volume/volume_extract.c:511
 msgid "3D view"
 msgstr "Просмотр 3D"
 
-#: modules/volume/volume_extract.c:550
+#: modules/volume/volume_extract.c:538
 msgid "Zoom"
 msgstr "Увеличение"
 
-#: modules/volume/volume_extract.c:558
+#: modules/volume/volume_extract.c:545
 msgid "Wireframe threshold"
 msgstr "Порог сетки"
 
-#: modules/volume/volume_extract.c:566
+#: modules/volume/volume_extract.c:552
 msgid "Z scale"
 msgstr "Масштаб по Z"
 
-#: modules/volume/volume_extract.c:574
+#: modules/volume/volume_extract.c:559
 msgid "Opacity scale"
 msgstr "Значение прозрачности"
 
-#: modules/volume/volume_extract.c:580
-msgid "apply perspective"
-msgstr "добавить перспективу"
+#: modules/volume/volume_extract.c:565
+msgid "Apply perspective"
+msgstr "Применить перспективу"
 
-#: modules/volume/volume_extract.c:589
-msgid "instant 3D render"
-msgstr "мгновенный 3D рендер"
+#: modules/volume/volume_extract.c:574
+msgid "Instant 3D render"
+msgstr "Мгновенная отрисовка 3D"
 
-#: modules/volume/volume_extract.c:598
+#: modules/volume/volume_extract.c:587
 msgid "X view"
 msgstr "Вид X"
 
-#: modules/volume/volume_extract.c:604
+#: modules/volume/volume_extract.c:592
 msgid "Y view"
 msgstr "Вид Y"
 
-#: modules/volume/volume_extract.c:610
+#: modules/volume/volume_extract.c:597
 msgid "Z view"
 msgstr "Вид Z"
 
-#: modules/volume/volume_extract.c:683
+#: modules/volume/volume_extract.c:669
 #, c-format
 msgid "X cross-section at x: %d"
 msgstr "Сечение по X при x: %d"
 
-#: modules/volume/volume_extract.c:686
+#: modules/volume/volume_extract.c:672
 #, c-format
 msgid "Y cross-section at y: %d"
 msgstr "Сечение по Y при y: %d"
 
-#: modules/volume/volume_extract.c:690
+#: modules/volume/volume_extract.c:676
 #, c-format
 msgid "Z cross-section at Z = %g %s (#%d)"
 msgstr "Сечение Z на величине Z = %g %s (#%d)"
 
-#: modules/volume/volume_extract.c:749 modules/volume/volume_slice.c:1264
+#: modules/volume/volume_extract.c:735 modules/volume/volume_slice.c:1278
 #, c-format
 msgid "X graph at y: %d z: %d"
 msgstr "График X при y: %d z: %d"
 
-#: modules/volume/volume_extract.c:752 modules/volume/volume_slice.c:1273
+#: modules/volume/volume_extract.c:738 modules/volume/volume_slice.c:1287
 #, c-format
 msgid "Y graph at x: %d z: %d"
 msgstr "График Y при x: %d z: %d"
 
-#: modules/volume/volume_extract.c:755 modules/volume/volume_slice.c:1255
+#: modules/volume/volume_extract.c:741 modules/volume/volume_slice.c:1269
 #, c-format
 msgid "Z graph at x: %d y: %d"
 msgstr "График Z при x: %d y: %d"
 
-#: modules/volume/volume_extract.c:776
+#: modules/volume/volume_extract.c:762
 msgid "Brick graph"
 msgstr "График сечения блока"
 
-#: modules/volume/volume_extract.c:1056
+#: modules/volume/volume_extract.c:1042
 msgid "Load volume data"
 msgstr "Загрузить объёмные данные"
 
-#: modules/volume/volume_extract.c:1218
+#: modules/volume/volume_extract.c:1204
 #, c-format
 msgid "Shown range %g to %g"
 msgstr "Показан диапазон от %g до %g"
 
-#: modules/volume/volume_extract.c:1911
+#: modules/volume/volume_extract.c:1897
 msgid "Building wireframe model..."
 msgstr "Строится каркасная модель..."
 
@@ -14518,97 +15228,97 @@ msgid "Evaluate volume force-distance data"
 msgstr "Рассчитать объёмные данные сила-расстояние"
 
 #: modules/volume/volume_fdfit.c:213
-msgid "/_Evaluate FD data..."
+msgid "/_Evaluate FD Data..."
 msgstr "/_Рассчитать данные сила-расстояние..."
 
 #: modules/volume/volume_fdfit.c:217
 msgid "Evaluate force-distance volume data"
 msgstr "Рассчитывает объёмные данные сила-расстояние"
 
-#: modules/volume/volume_fdfit.c:368
+#: modules/volume/volume_fdfit.c:371
 msgid "Curve _X position:"
 msgstr "Положение _X кривой:"
 
-#: modules/volume/volume_fdfit.c:386
+#: modules/volume/volume_fdfit.c:380
 msgid "Curve _Y position:"
 msgstr "Положение _Y кривой:"
 
-#: modules/volume/volume_fdfit.c:535
+#: modules/volume/volume_fdfit.c:511
 msgid "e_stimate"
 msgstr "о_ценивать"
 
-#: modules/volume/volume_invert.c:51
+#: modules/volume/volume_invert.c:39 modules/volume/volumeops.c:39
 msgid "Inverts value in volume data"
 msgstr "Инвертирует значения в объёмных данных"
 
-#: modules/volume/volume_invert.c:65
-msgid "/_Invert value"
+#: modules/volume/volume_invert.c:53
+msgid "/_Invert Value"
 msgstr "/_Инвертировать значение"
 
-#: modules/volume/volume_invert.c:69
+#: modules/volume/volume_invert.c:57
 msgid "Invert value in volume data"
 msgstr "Инвертирует значения в объёмных данных"
 
-#: modules/volume/volume_kmeans.c:94
+#: modules/volume/volume_kmeans.c:95
 msgid "Calculates K-means clustering on volume data."
 msgstr "Рассчитывает кластеризацию K-средних для объёмных данных."
 
-#: modules/volume/volume_kmeans.c:108
-msgid "/_K-means clustering..."
+#: modules/volume/volume_kmeans.c:109
+msgid "/_K-Means Clustering..."
 msgstr "/_Кластеризация K-средних..."
 
-#: modules/volume/volume_kmeans.c:112
+#: modules/volume/volume_kmeans.c:113
 msgid "Calculate K-means clustering on volume data"
 msgstr "Рассчитать кластеризацию K-средних для объёмных данных"
 
-#: modules/volume/volume_kmeans.c:151
+#: modules/volume/volume_kmeans.c:152
 msgid "K-means"
 msgstr "K-средних"
 
-#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:164
+#: modules/volume/volume_kmeans.c:170 modules/volume/volume_kmedians.c:163
 msgid "_Number of clusters:"
 msgstr "_Количество кластеров:"
 
-#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:171
+#: modules/volume/volume_kmeans.c:177 modules/volume/volume_kmedians.c:170
 msgid "Convergence _precision digits:"
 msgstr "Знаков _точности сходимости:"
 
-#: modules/volume/volume_kmeans.c:184 modules/volume/volume_kmedians.c:178
+#: modules/volume/volume_kmeans.c:183 modules/volume/volume_kmedians.c:176
 msgid "_Max. iterations:"
 msgstr "_Макс. число шагов:"
 
-#: modules/volume/volume_kmeans.c:189 modules/volume/volume_kmedians.c:183
+#: modules/volume/volume_kmeans.c:187 modules/volume/volume_kmedians.c:181
 msgid "_Normalize"
 msgstr "_Нормализовать"
 
-#: modules/volume/volume_kmeans.c:195
+#: modules/volume/volume_kmeans.c:193
 msgid "_Remove outliers"
 msgstr "_Удалить выпадающие"
 
-#: modules/volume/volume_kmeans.c:208
+#: modules/volume/volume_kmeans.c:202
 msgid "Outliers _threshold:"
 msgstr "_Порог выпадающего:"
 
-#: modules/volume/volume_kmeans.c:431
+#: modules/volume/volume_kmeans.c:425
 msgid "K-means iteration..."
 msgstr "Итерация K-средних..."
 
-#: modules/volume/volume_kmeans.c:651
+#: modules/volume/volume_kmeans.c:645
 #, c-format
 msgid "K-means cluster of %s"
 msgstr "Кластер К-средних %s"
 
-#: modules/volume/volume_kmeans.c:660
+#: modules/volume/volume_kmeans.c:654
 #, c-format
 msgid "K-means error of %s"
 msgstr "Ошибка K-средних для %s"
 
-#: modules/volume/volume_kmeans.c:670 modules/volume/volume_kmedians.c:514
+#: modules/volume/volume_kmeans.c:664 modules/volume/volume_kmedians.c:512
 #, c-format
 msgid "Pre-normalized intensity of %s"
 msgstr "Интенсивность до нормализации %s"
 
-#: modules/volume/volume_kmeans.c:702
+#: modules/volume/volume_kmeans.c:696
 #, c-format
 msgid "K-means center %d"
 msgstr "Центр кластера %d"
@@ -14618,7 +15328,7 @@ msgid "Calculates K-medians clustering on volume data."
 msgstr "Рассчитывает кластеризацию K-срединных для объёмных данных."
 
 #: modules/volume/volume_kmedians.c:102
-msgid "/_K-medians clustering..."
+msgid "/_K-Medians Clustering..."
 msgstr "/_Кластеризация K-срединных..."
 
 #: modules/volume/volume_kmedians.c:106
@@ -14629,48 +15339,48 @@ msgstr "Рассчитать кластеризацию K-срединных д
 msgid "K-Medians"
 msgstr "K-срединных"
 
-#: modules/volume/volume_kmedians.c:392
+#: modules/volume/volume_kmedians.c:390
 msgid "K-medians iteration..."
 msgstr "Итерация K-срединных..."
 
-#: modules/volume/volume_kmedians.c:495
+#: modules/volume/volume_kmedians.c:493
 #, c-format
 msgid "K-medians cluster of %s"
 msgstr "Кластер K-срединных %s"
 
-#: modules/volume/volume_kmedians.c:504
+#: modules/volume/volume_kmedians.c:502
 #, c-format
 msgid "K-medians error of %s"
 msgstr "Ошибка K-срединных для %s"
 
-#: modules/volume/volume_kmedians.c:546
+#: modules/volume/volume_kmedians.c:544
 #, c-format
 msgid "K-medians center %d"
 msgstr "Центр кластера %d"
 
-#: modules/volume/volume_linestat.c:171
+#: modules/volume/volume_linestat.c:173
 msgid "Summarizes profiles of volume data to a channel."
 msgstr ""
 "Строит сводку каждого профиля (характеризует) и выводит как значения в "
 "канале."
 
-#: modules/volume/volume_linestat.c:185
+#: modules/volume/volume_linestat.c:187
 msgid "/Summarize _Profiles..."
 msgstr "/Характеризовать _профили..."
 
-#: modules/volume/volume_linestat.c:189
+#: modules/volume/volume_linestat.c:191
 msgid "Summarize profiles"
 msgstr "Характеризовать профили"
 
-#: modules/volume/volume_linestat.c:249
+#: modules/volume/volume_linestat.c:251
 msgid "_Extract image"
 msgstr "_Извлечь изображение"
 
-#: modules/volume/volume_linestat.c:250
+#: modules/volume/volume_linestat.c:252
 msgid "Set _preview"
 msgstr "Установить изображение _предпросмотра"
 
-#: modules/volume/volume_linestat.c:284
+#: modules/volume/volume_linestat.c:289
 msgid "Summarize Volume Profiles"
 msgstr "Характеризовать профили объёмных данных"
 
@@ -14694,53 +15404,113 @@ msgstr "Плоскость как изображение"
 msgid "Line graph"
 msgstr "Линию как график"
 
-#: modules/volume/volume_slice.c:290
+#: modules/volume/volume_slice.c:292
 msgid "Slice Volume Data"
 msgstr "Вырезать из объёмных данных"
 
-#: modules/volume/volume_slice.c:369
+#: modules/volume/volume_slice.c:371
 msgid "_Base plane:"
 msgstr "_Основная плоскость:"
 
-#: modules/volume/volume_slice.c:420
+#: modules/volume/volume_slice.c:422
 msgid "Extract _multiple items"
 msgstr "Извлечь _несколько элементов"
 
-#: modules/volume/volume_slice.c:437
+#: modules/volume/volume_slice.c:439
 msgid "Positions"
 msgstr "Положения"
 
-#: modules/volume/volume_slice.c:484
+#: modules/volume/volume_slice.c:492
 msgid "_Z:"
 msgstr "_Z:"
 
-#: modules/volume/volume_slice.c:1156
+#: modules/volume/volume_slice.c:1167
 #, c-format
 msgid "Z slice at %.*f%s%s (#%d)"
 msgstr "Срез Z на %.*f%s%s (#%d)"
 
-#: modules/volume/volume_slice.c:1167
+#: modules/volume/volume_slice.c:1178
 #, c-format
 msgid "Y slice at %.*f%s%s (#%d)"
 msgstr "Срез Y на %.*f%s%s (#%d)"
 
-#: modules/volume/volume_slice.c:1178
+#: modules/volume/volume_slice.c:1189
 #, c-format
 msgid "X slice at %.*f%s%s (#%d)"
 msgstr "Срез X на %.*f%s%s (#%d)"
 
-#: modules/volume/volume_slice.c:1307
+#: modules/volume/volume_slice.c:1325
 msgid "Volume Z graphs"
 msgstr "Графики Z объёма"
 
-#: modules/volume/volume_slice.c:1314
+#: modules/volume/volume_slice.c:1332
 msgid "Volume X graphs"
 msgstr "Графики X объёма"
 
-#: modules/volume/volume_slice.c:1321
+#: modules/volume/volume_slice.c:1339
 msgid "Volume Y graphs"
 msgstr "Графики Y объёма"
 
+#: modules/volume/volume_swaxes.c:104
+msgid "Swaps axes of volume data."
+msgstr "Меняет местами оси объёмных данных."
+
+#: modules/volume/volume_swaxes.c:118
+msgid "/S_wap axes..."
+msgstr "/По_менять местами оси..."
+
+#: modules/volume/volume_swaxes.c:122
+msgid "Swap axes"
+msgstr "Поменять местами оси"
+
+#: modules/volume/volume_swaxes.c:156
+msgid "X"
+msgstr "X"
+
+#: modules/volume/volume_swaxes.c:157
+msgid "X, reversed"
+msgstr "X, в обратном порядке"
+
+#: modules/volume/volume_swaxes.c:158
+msgid "Y"
+msgstr "Y"
+
+#: modules/volume/volume_swaxes.c:159
+msgid "Y, reversed"
+msgstr "Y, в обратном порядке"
+
+#: modules/volume/volume_swaxes.c:160
+msgid "Z"
+msgstr "Z"
+
+#: modules/volume/volume_swaxes.c:161
+msgid "Z, reversed"
+msgstr "Z, в обратном порядке"
+
+#: modules/volume/volume_swaxes.c:175
+msgid "Swap Volume Axes"
+msgstr "Поменять местами оси"
+
+#: modules/volume/volume_swaxes.c:196
+msgid "Current _X axis will become:"
+msgstr "Текущая ось _X станет:"
+
+#: modules/volume/volume_swaxes.c:204
+msgid "Current _Y axis will become:"
+msgstr "Текущая ось _Y станет:"
+
+#: modules/volume/volume_swaxes.c:212
+msgid "Current _Z axis will become:"
+msgstr "Текущая ось _Z станет:"
+
+#: modules/volume/volume_swaxes.c:219
+msgid "Create new volume data"
+msgstr "Создать новый блок объёмных данных"
+
+#: modules/volume/volume_swaxes.c:286
+msgid "Z axis calibration will be lost."
+msgstr "Калибровка оси Z будет утеряна."
+
 #: modules/volume/volume_zcal.c:104
 msgid "Attaches, extracts and removes volume data z-axis calibration."
 msgstr ""
@@ -14811,6 +15581,14 @@ msgstr ""
 "Количество значений в файле данных %d\n"
 "отличается от числа плоскостей %d."
 
+#: modules/volume/volumeops.c:53
+msgid "/Extract _Preview"
+msgstr "/Извлечь изображение _предпросмотра"
+
+#: modules/volume/volumeops.c:57
+msgid "Extract volume data preview to an image"
+msgstr "Извлечь изображение предпросмотра из объёмных данных"
+
 #: modules/xyz/xyz_drift.c:267
 msgid "Analyzes drift in XYZ data."
 msgstr "Анализирует дрейф в данных XYZ."
@@ -14855,7 +15633,7 @@ msgstr "дрейф оси z"
 msgid "Analyze XYZ Drift"
 msgstr "Анализировать дрейф в данных XYZ"
 
-#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:391
+#: modules/xyz/xyz_drift.c:566 modules/xyz/xyz_raster.c:406
 msgid "Reset Ran_ges"
 msgstr "Сбросить _диапазоны"
 
@@ -14863,11 +15641,11 @@ msgstr "Сбросить _диапазоны"
 msgid "_Guess parameters"
 msgstr "О_ценка параметров"
 
-#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:570
+#: modules/xyz/xyz_drift.c:778 modules/xyz/xyz_raster.c:539
 msgid "_X-range:"
 msgstr "Диапазон _X:"
 
-#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:592
+#: modules/xyz/xyz_drift.c:800 modules/xyz/xyz_raster.c:561
 msgid "_Y-range:"
 msgstr "Диапазон _Y:"
 
@@ -14945,7 +15723,7 @@ msgstr "Не найдено соседей"
 msgid "Fitting in progress..."
 msgstr "Идёт аппроксимация..."
 
-#: modules/xyz/xyz_drift.c:2269 modules/xyz/xyz_raster.c:1012
+#: modules/xyz/xyz_drift.c:2264 modules/xyz/xyz_raster.c:981
 msgid "Physical dimensions are invalid."
 msgstr "Физические размеры неверны."
 
@@ -14985,39 +15763,39 @@ msgstr "Выравнивание данных XYZ"
 msgid "Update X and Y of _all compatible data"
 msgstr "Обновить X и Y _всех совместимых данных"
 
-#: modules/xyz/xyz_raster.c:197
+#: modules/xyz/xyz_raster.c:194
 msgid "Rasterizes XYZ data to images."
 msgstr "Растеризует данные XYZ в изображения."
 
-#: modules/xyz/xyz_raster.c:211
+#: modules/xyz/xyz_raster.c:208
 msgid "/_Rasterize..."
 msgstr "/_Растеризовать..."
 
-#: modules/xyz/xyz_raster.c:215
+#: modules/xyz/xyz_raster.c:212
 msgid "Rasterize to image"
 msgstr "Растеризовать в изображение"
 
-#: modules/xyz/xyz_raster.c:340
+#: modules/xyz/xyz_raster.c:337
 msgid "Rasterize XYZ Data"
 msgstr "Растеризовать данные XYZ"
 
-#: modules/xyz/xyz_raster.c:354
+#: modules/xyz/xyz_raster.c:351
 msgid "Create Image _Directly"
 msgstr "Создать изображение _сразу"
 
-#: modules/xyz/xyz_raster.c:360
+#: modules/xyz/xyz_raster.c:357
 msgid "XY points form a regular grid so interpolation is not necessary."
 msgstr "Точки XY формируют правильную сетку, поэтому интерполяция не нужна."
 
-#: modules/xyz/xyz_raster.c:381
+#: modules/xyz/xyz_raster.c:392
 msgid "Make Pixels S_quare"
 msgstr "Сделать пиксели _квадратными"
 
-#: modules/xyz/xyz_raster.c:642
+#: modules/xyz/xyz_raster.c:611
 msgid "Field"
 msgstr "Поле"
 
-#: modules/xyz/xyz_raster.c:956
+#: modules/xyz/xyz_raster.c:925
 #, c-format
 msgid ""
 "Number of points: %u\n"
@@ -15028,7 +15806,7 @@ msgstr ""
 "Объединено слишком близких: %u\n"
 "Добавлено на границах: %u"
 
-#: modules/xyz/xyz_raster.c:1091
+#: modules/xyz/xyz_raster.c:1065
 msgid ""
 "XYZ data regularization failed due to numerical instability or was "
 "interrupted."
@@ -15036,6 +15814,274 @@ msgstr ""
 "Регуляризация данных XYZ завершилась неудачно вследствие численной "
 "нестабильности или была прервана."
 
+#~ msgid "Generates surfaces composed from randomly placed fibres."
+#~ msgstr ""
+#~ "Рассчитывает поверхности, состоящие из случайно расположенных волокон."
+
+#~ msgid "/S_ynthetic/_Deposition/_Fibres..."
+#~ msgstr "/Син_тез/_Осаждение/_Волокна..."
+
+#~ msgid "Generate surface of randomly placed fibres"
+#~ msgstr "Создать поверхность из случайно расположенных волокон"
+
+#~ msgid "Random Fibres"
+#~ msgstr "Случайные волокна"
+
+#~ msgid "Along fibre:"
+#~ msgstr "Вдоль волокна:"
+
+#~ msgid "Generating fibres..."
+#~ msgstr "Генерация волокон..."
+
+#~ msgid "Re_fine"
+#~ msgstr "_Уточнить"
+
+#~ msgid "Distribute"
+#~ msgstr "Распространить"
+
+#~ msgid "Replace"
+#~ msgstr "Заменить"
+
+#~ msgid "/_Mask/Morphological Operation..."
+#~ msgstr "/_Маска/Морфологическая операция..."
+
+#~ msgid "_Fix res.:"
+#~ msgstr "_Фикс. разр.:"
+
+#~ msgid "_Radial profiles"
+#~ msgstr "_Радиальные профили"
+
+#~ msgid "Released %s\n"
+#~ msgstr "Выпущен %s\n"
+
+#~ msgid "/Show and _extract..."
+#~ msgstr "/Показать и _извлечь..."
+
+#~ msgid "/_Evaluate FD data..."
+#~ msgstr "/_Рассчитать данные сила-расстояние..."
+
+#~ msgid "/_Invert value"
+#~ msgstr "/_Инвертировать значение"
+
+#~ msgid "/_K-means clustering..."
+#~ msgstr "/_Кластеризация K-средних..."
+
+#~ msgid "/_K-medians clustering..."
+#~ msgstr "/_Кластеризация K-срединных..."
+
+#~ msgid "pixels"
+#~ msgstr "точек"
+
+#~ msgid "Frame thickness:"
+#~ msgstr "Толщина рамки:"
+
+#~ msgid "Show mode:"
+#~ msgstr "Режим отображения:"
+
+#~ msgid "apply perspective"
+#~ msgstr "добавить перспективу"
+
+#~ msgid "instant 3D render"
+#~ msgstr "мгновенный 3D рендер"
+
+#~ msgid "_Like Current Channel"
+#~ msgstr "Как _у текущего канала"
+
+#~ msgid "Surface _coverage:"
+#~ msgstr "По_крытие поверхности:"
+
+#~ msgid "Apply Ga_ussian filter of width: "
+#~ msgstr "Применить г-ауссов фильтр шириной:"
+
+#~ msgid "Com_bine with existing mask"
+#~ msgstr "О_бъединить с имеющейся маской"
+
+#~ msgid "Reco_mpute"
+#~ msgstr "_Пересчитать"
+
+#~ msgid "/_Grains/_Mark by Otsu's..."
+#~ msgstr "/Зёрн_а/Пометить по методу _Оцу..."
+
+#~ msgid "/_Basic Operations/Volumize..."
+#~ msgstr "/_Базовые действия/_Придать объём..."
+
+#~ msgid "Fast Fourier Transform"
+#~ msgstr "Быстрое преобразование Фурье"
+
+#~ msgid "built-in SimpleFFT\n"
+#~ msgstr "встроенное SimpleFFT\n"
+
+#~ msgid "Initializing GUI"
+#~ msgstr "Инициализация графического интерфейса"
+
+#~ msgid "Estimate light height difference in MFM data"
+#~ msgstr "Оценить небольшие различия высоты в данных МСМ"
+
+#~ msgid "_Remanent magnetisation:"
+#~ msgstr "Остато_чная магнетизация:"
+
+#~ msgid "Stitch operations on data fields."
+#~ msgstr "Операции сшивания с полями данных."
+
+#~ msgid "Stitch operations on data"
+#~ msgstr "Операции сшивания над данными"
+
+#~ msgid "X offset"
+#~ msgstr "Смещение по X"
+
+#~ msgid "Y offset"
+#~ msgstr "Смещение по Y"
+
+#~ msgid "Create new channel"
+#~ msgstr "Создать новый канал"
+
+#~ msgid "Current Channel"
+#~ msgstr "Текущий канал"
+
+#~ msgid "_Take Dimensions from Current Channel"
+#~ msgstr "Взять _размеры текущего канала"
+
+#~ msgid "_Replace the current channel"
+#~ msgstr "За_менить текущий канал"
+
+#~ msgid "_Start from the current channel"
+#~ msgstr "Н_ачать с текущего канала"
+
+#~ msgid "Extract mask to a new channel"
+#~ msgstr "Извлечь маску в новый канал"
+
+#~ msgid "Hx"
+#~ msgstr "Hx"
+
+#~ msgid "Hz"
+#~ msgstr "Hz"
+
+#~ msgid "Fz"
+#~ msgstr "Fz"
+
+#~ msgid "dFz/dz"
+#~ msgstr "dFz/dz"
+
+#~ msgid "d²Fz/dz²"
+#~ msgstr "d²Fz/dz²"
+
+#~ msgid "Slab"
+#~ msgstr "Блок"
+
+#~ msgid "Slab size _x:"
+#~ msgstr "Размер _блока по X:"
+
+#~ msgid "Slab size _y:"
+#~ msgstr "Размер б_лока по Y:"
+
+#~ msgid "Slab size _z (length):"
+#~ msgstr "Размер бло_ка по Z (длина):"
+
+#~ msgid "Generate surface with separated phases."
+#~ msgstr "Генерировать поверхность с раздельными фазами."
+
+#~ msgid "Extract presentation to a new channel"
+#~ msgstr "Извлекает презентацию в отдельный канал"
+
+#~ msgid "/S_ynthetic/_Ballistic..."
+#~ msgstr "/Син_тез/_Баллистический..."
+
+#~ msgid "/S_ynthetic/_Columnar..."
+#~ msgstr "/Син_тез/С_толбчатая..."
+
+#~ msgid "/S_ynthetic/_Particles..."
+#~ msgstr "/Син_тез/_Частицы..."
+
+#~ msgid "/S_ynthetic/_Diffusion..."
+#~ msgstr "/Син_тез/Ди_ффузия..."
+
+#~ msgid "/SPM M_odes/_MFM/_Current line field..."
+#~ msgstr "/_Режимы СЗМ/_МСМ/Поле линии _тока..."
+
+#~ msgid "Current line stray field"
+#~ msgstr "Поле рассеяния линии тока"
+
+#~ msgid "_Stripe current:"
+#~ msgstr "_Ток полосы:"
+
+#~ msgid "_Tip magnetization:"
+#~ msgstr "_Намагниченность зонда:"
+
+#~ msgid "_Slab size x:"
+#~ msgstr "Размер _блока по X:"
+
+#~ msgid "_Slab size y:"
+#~ msgstr "Размер б_лока по Y:"
+
+#~ msgid "_Slab size z (length):"
+#~ msgstr "Размер бло_ка по _Z (длина):"
+
+#~ msgid "/SPM M_odes/_MFM/_Perpendicular media field..."
+#~ msgstr "/_Режимы СЗМ/_МСМ/Поле _перпендикулярной среды..."
+
+#~ msgid "Perpendicular media stray field"
+#~ msgstr "Поле рассеяния перпендикулярной среды"
+
+#~ msgid "Include domain walls"
+#~ msgstr "Включить границы доменов"
+
+#~ msgid "/SPM M_odes/_MFM/_Estimate shift in z..."
+#~ msgstr "/_Режимы СЗМ/_МСМ/О_ценка сдвига по z..."
+
+#~ msgid "Estimate lift height shift"
+#~ msgstr "Оценить сдвиг высоты подъёма"
+
+#~ msgid "_Search from:"
+#~ msgstr "_Искать от:"
+
+#~ msgid "/SPM M_odes/_MFM/Para_llel media field..."
+#~ msgstr "/_Режимы СЗМ/_МСМ/Поле п_араллельной среды..."
+
+#~ msgid "Parallel media stray field"
+#~ msgstr "Поле рассеяния параллельной среды"
+
+#~ msgid "Gap size:"
+#~ msgstr "Зазор:"
+
+#~ msgid "/SPM M_odes/_MFM/_Field shift in z..."
+#~ msgstr "/_Режимы СЗМ/_МСМ/_Сдвиг поля по z..."
+
+#~ msgid "Stray field plane shift"
+#~ msgstr "Смещение поля рассеяния в плоскости"
+
+#~ msgid "/S_ynthetic/_Objects..."
+#~ msgstr "/Син_тез/_Объекты..."
+
+#~ msgid "/_Statistics/_PSF guess..."
+#~ msgstr "/_Статистика/О_ценка PSF..."
+
+#~ msgid "(PSF*P)"
+#~ msgstr "(PSF*P)"
+
+#~ msgid "(PSF*P) - I"
+#~ msgstr "(PSF*P) - I"
+
+#~ msgid "Ideal response:"
+#~ msgstr "Идеальный отклик:"
+
+#, fuzzy
+#~ msgid "Extracts ROI average graphs from volume data."
+#~ msgstr "Извлекает плоскости с изображениями и графики из объёмных данных."
+
+#, fuzzy
+#~ msgid "/ROI Average..."
+#~ msgstr "/Объ_единить..."
+
+#, fuzzy
+#~ msgid "Extract ROI average line graphs"
+#~ msgstr "Извлечь плоскости изображения и линии графиков"
+
+#~ msgid "Open Python script"
+#~ msgstr "Открыть скрипт Python"
+
+#~ msgid "Save Script as"
+#~ msgstr "Сохранить скрипт как"
+
 #~ msgid "Ellptical parabola"
 #~ msgstr "Эллиптическая парабола"
 
diff --git a/python/Makefile.in b/python/Makefile.in
index 4aff1b5..1d8b46d 100644
--- a/python/Makefile.in
+++ b/python/Makefile.in
@@ -203,10 +203,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -216,6 +213,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -240,7 +239,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -298,6 +299,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -306,17 +308,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/ruby/Makefile.in b/ruby/Makefile.in
index bae1160..c060890 100644
--- a/ruby/Makefile.in
+++ b/ruby/Makefile.in
@@ -199,10 +199,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -212,6 +209,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -236,7 +235,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -294,6 +295,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -302,17 +304,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/thumbnailer/Makefile.in b/thumbnailer/Makefile.in
index 5898f84..19fbe08 100644
--- a/thumbnailer/Makefile.in
+++ b/thumbnailer/Makefile.in
@@ -282,10 +282,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -295,6 +292,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -319,7 +318,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -377,6 +378,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -385,17 +387,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
diff --git a/utils/Makefile.am b/utils/Makefile.am
index f829b10..085d4d0 100644
--- a/utils/Makefile.am
+++ b/utils/Makefile.am
@@ -1,4 +1,4 @@
-# @(#) $Id: Makefile.am 17857 2015-12-16 15:52:24Z yeti-dn $
+# @(#) $Id: Makefile.am 20077 2017-07-23 19:30:49Z yeti-dn $
 
 libgwyddion = $(top_builddir)/libgwyddion/libgwyddion2.la
 libgwymodule = $(top_builddir)/libgwymodule/libgwymodule2.la
@@ -28,6 +28,7 @@ EXTRA_DIST = \
 	gwyddion.nsi.template \
 	generate-gwyddion-nsi.py \
 	gen-gwyddion-msvc-sln.py \
+	gen-module-bundle.sh \
 	update-api-indices.py \
 	bundler.in \
 	mkosxlauncher.in
diff --git a/utils/Makefile.in b/utils/Makefile.in
index 45899ca..04c848d 100644
--- a/utils/Makefile.in
+++ b/utils/Makefile.in
@@ -14,7 +14,7 @@
 
 @SET_MAKE@
 
-# @(#) $Id: Makefile.am 17857 2015-12-16 15:52:24Z yeti-dn $
+# @(#) $Id: Makefile.am 20077 2017-07-23 19:30:49Z yeti-dn $
 
 
 
@@ -253,10 +253,7 @@ EPYDOC = @EPYDOC@
 EXEEXT = @EXEEXT@
 EXR_CFLAGS = @EXR_CFLAGS@
 EXR_LIBS = @EXR_LIBS@
-FFTW3_1_CFLAGS = @FFTW3_1_CFLAGS@
-FFTW3_1_LIBS = @FFTW3_1_LIBS@
 FFTW3_CFLAGS = @FFTW3_CFLAGS@
-FFTW3_DEPENDENCY = @FFTW3_DEPENDENCY@
 FFTW3_LIBS = @FFTW3_LIBS@
 FGREP = @FGREP@
 GCONFTOOL = @GCONFTOOL@
@@ -266,6 +263,8 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
 GLIBC21 = @GLIBC21@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_MKENUMS = @GLIB_MKENUMS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
@@ -290,7 +289,9 @@ GTK_MAC_LIBS = @GTK_MAC_LIBS@
 GWY_VERSION_MAJOR = @GWY_VERSION_MAJOR@
 GWY_VERSION_MINOR = @GWY_VERSION_MINOR@
 GWY_VERSION_STRING = @GWY_VERSION_STRING@
+HDRIMAGE_EXTRA_CFLAGS = @HDRIMAGE_EXTRA_CFLAGS@
 HTML_DIR = @HTML_DIR@
+INKSCAPE = @INKSCAPE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -348,6 +349,7 @@ PASCAL = @PASCAL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
+PNGCRUSH = @PNGCRUSH@
 PNG_CFLAGS = @PNG_CFLAGS@
 PNG_LIBS = @PNG_LIBS@
 POD2MAN = @POD2MAN@
@@ -356,17 +358,13 @@ PYGTK_CFLAGS = @PYGTK_CFLAGS@
 PYGTK_CODEGENDIR = @PYGTK_CODEGENDIR@
 PYGTK_LIBS = @PYGTK_LIBS@
 PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
 PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
 PYTHON_EXTRA_CFLAGS = @PYTHON_EXTRA_CFLAGS@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
-PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_SYSCFG_BASECFLAGS = @PYTHON_SYSCFG_BASECFLAGS@
-PYTHON_SYSCFG_CCSHARED = @PYTHON_SYSCFG_CCSHARED@
-PYTHON_SYSCFG_LDFLAGS = @PYTHON_SYSCFG_LDFLAGS@
-PYTHON_SYSCFG_LIBDIR = @PYTHON_SYSCFG_LIBDIR@
-PYTHON_SYSCFG_LINKFORSHARED = @PYTHON_SYSCFG_LINKFORSHARED@
 PYTHON_VERSION = @PYTHON_VERSION@
 RANLIB = @RANLIB@
 RUBY = @RUBY@
@@ -476,6 +474,7 @@ EXTRA_DIST = \
 	gwyddion.nsi.template \
 	generate-gwyddion-nsi.py \
 	gen-gwyddion-msvc-sln.py \
+	gen-module-bundle.sh \
 	update-api-indices.py \
 	bundler.in \
 	mkosxlauncher.in
diff --git a/utils/gen-gwyddion-msvc-sln.py b/utils/gen-gwyddion-msvc-sln.py
index 0f69407..b645dfc 100755
--- a/utils/gen-gwyddion-msvc-sln.py
+++ b/utils/gen-gwyddion-msvc-sln.py
@@ -60,7 +60,8 @@ libs_x64 = ['cairo.lib', 'cfitsio.lib', 'gdk-win32-2.0.lib', 'gdk_pixbuf-2.0.lib
 'pangoft2-1.0.lib', 'python27.lib', 'zlibwapi.lib', '%(AdditionalDependencies)']
 
 generated_files_by_autotools = [
-'app//gwyapptypes.h', 'app//gwyapptypes.c', 'app//authors.h', 
+'app//gwyapptypes.h', 'app//gwyapptypes.c', 'app//authors.h',
+'libdraw//gwydrawtypes.h', 'libdraw//gwydrawtypes.c', 
 'libgwyddion//gwyddiontypes.h', 'libgwyddion//gwyddiontypes.c', 'libgwyddion//gwyversion.h', 
 'libgwydgets//gwydgettypes.h', 'libgwydgets//gwydgettypes.c', 
 'libgwydgets//gwydgetmarshals.h', 'libgwydgets//gwydgetmarshals.c', 
@@ -970,6 +971,8 @@ def create_vcxproj(path, name, sources, headers, definitions, configuration_type
     ClCompile = SubElement(ItemDefinitionGroup, "ClCompile")
     PreprocessorDefinitions = SubElement(ClCompile, "PreprocessorDefinitions")
     PreprocessorDefinitions.text = "_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)"
+    WarningLevel = SubElement(ClCompile, "WarningLevel")
+    WarningLevel.text = "Level4"
     Link = SubElement(ItemDefinitionGroup, "Link")
     AdditionalDependencies = SubElement(Link, "AdditionalDependencies")
     #AdditionalDependencies.text = "libgwyapp2-0.lib;libgwyddion2-0.lib;libgwydgets2-0.lib;libgwydraw2-0.lib;libgwymodule2-0.lib;libgwyprocess2-0.lib;cairo.lib;glib-2.0.lib;gtk-win32-2.0.lib;gdk-win32-2.0.lib;gdk_pixbuf-2.0.lib;gio-2.0.lib;gmodule-2.0.lib;gobject-2.0.lib;intl.lib;libgtkglext-win32-1.0.lib;libgdkglext-win32-1.0.lib;libpng.lib;libxml2.lib;OpenGL32.Lib;pango-1.0.lib;pangocairo-1.0.lib;pangoft2-1.0.lib;python27.lib;Qt5Gui.lib;zlib.lib;%(AdditionalDependencies)"
@@ -1000,6 +1003,8 @@ def create_vcxproj(path, name, sources, headers, definitions, configuration_type
     ClCompile = SubElement(ItemDefinitionGroup, "ClCompile")
     PreprocessorDefinitions = SubElement(ClCompile, "PreprocessorDefinitions")
     PreprocessorDefinitions.text = "_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)"
+    WarningLevel = SubElement(ClCompile, "WarningLevel")
+    WarningLevel.text = "Level4"
     Link = SubElement(ItemDefinitionGroup, "Link")
     AdditionalDependencies = SubElement(Link, "AdditionalDependencies")
     AdditionalDependencies.text = get_project_dependency_libs_x64(name)
@@ -1024,6 +1029,8 @@ def create_vcxproj(path, name, sources, headers, definitions, configuration_type
     ClCompile = SubElement(ItemDefinitionGroup, "ClCompile")
     PreprocessorDefinitions = SubElement(ClCompile, "PreprocessorDefinitions")
     PreprocessorDefinitions.text = "_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)"
+    WarningLevel = SubElement(ClCompile, "WarningLevel")
+    WarningLevel.text = "Level4"
     Link = SubElement(ItemDefinitionGroup, "Link")
     AdditionalDependencies = SubElement(Link, "AdditionalDependencies")
     AdditionalDependencies.text = get_project_dependency_libs_win32(name)
@@ -1048,6 +1055,8 @@ def create_vcxproj(path, name, sources, headers, definitions, configuration_type
     ClCompile = SubElement(ItemDefinitionGroup, "ClCompile")
     PreprocessorDefinitions = SubElement(ClCompile, "PreprocessorDefinitions")
     PreprocessorDefinitions.text = "_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)"
+    WarningLevel = SubElement(ClCompile, "WarningLevel")
+    WarningLevel.text = "Level4"
     Link = SubElement(ItemDefinitionGroup, "Link")
     AdditionalDependencies = SubElement(Link, "AdditionalDependencies")
     AdditionalDependencies.text = get_project_dependency_libs_x64(name)
diff --git a/utils/gen-module-bundle.sh b/utils/gen-module-bundle.sh
new file mode 100755
index 0000000..49246f6
--- /dev/null
+++ b/utils/gen-module-bundle.sh
@@ -0,0 +1,55 @@
+#!/bin/sh
+
+out="$1"
+shift
+
+echo '/* This is a 'GENERATED' file. */' >"$out.tmp"
+
+cat >>"$out.tmp" <<'EOF'
+#include <glib.h>
+#include <libgwymodule/gwymodule.h>
+
+static const GwyModuleRecord* register_bundle(void);
+
+static GwyModuleInfo module_info = {
+    GWY_MODULE_ABI_VERSION | GWY_MODULE_BUNDLE_FLAG,
+    (GwyModuleRegisterFunc)&register_bundle,
+    NULL, NULL, NULL, NULL, NULL,
+};
+
+GWY_MODULE_QUERY(module_info)
+
+EOF
+
+modnames=$(echo "$@" | sed -e 's/\.la  */ /g' -e 's/\.la$//')
+for modname in $modnames; do
+    echo $modname
+done | sed -e 'y/-/_/' \
+           -e 's/.*/GwyModuleInfo* _gwy_module_query__\0(void);/' \
+           >>"$out.tmp"
+
+cat >>"$out.tmp" <<'EOF'
+
+static const GwyModuleRecord modules[] = {
+EOF
+
+# FIXME: How to do this in portable shell & sed without calling sed on every
+# single modname?
+for modname in $modnames; do
+    cname=$(echo "$modname" | sed -e 'y/-/_/')
+    echo "  { _gwy_module_query__$cname, \"$modname\", },"
+done >>"$out.tmp"
+
+cat >>"$out.tmp" <<'EOF'
+  { NULL, NULL, },
+};
+
+static const GwyModuleRecord*
+register_bundle(void)
+{
+    return modules;
+}
+EOF
+
+cat "$out.tmp" >"$out"
+rm -f "$out.tmp"
diff --git a/utils/genmarshal.mk b/utils/genmarshal.mk
index 53c9096..6347e84 100644
--- a/utils/genmarshal.mk
+++ b/utils/genmarshal.mk
@@ -1,5 +1,5 @@
 # Generic glib-genmarshal rules.
-# @(#) $Id: genmarshal.mk 11705 2011-01-03 08:32:55Z yeti-dn $
+# @(#) $Id: genmarshal.mk 20080 2017-07-24 16:05:52Z yeti-dn $
 #
 # Parameters:
 # GENMARSHAL_NAME -- output base name
@@ -11,9 +11,6 @@
 # EXTRA_DIST
 # MAINTAINERCLEANFILES
 
-# TODO: Detect
-GLIB_GENMARSHAL = glib-genmarshal
-
 genmarshal_built_sources = \
 	$(GENMARSHAL_NAME).h \
 	$(GENMARSHAL_NAME).c
diff --git a/utils/mkenum.mk b/utils/mkenum.mk
index a8dbe44..bbf0412 100644
--- a/utils/mkenum.mk
+++ b/utils/mkenum.mk
@@ -1,5 +1,5 @@
 # Generic glib-mkenum rules.
-# @(#) $Id: mkenum.mk 11705 2011-01-03 08:32:55Z yeti-dn $
+# @(#) $Id: mkenum.mk 20080 2017-07-24 16:05:52Z yeti-dn $
 #
 # Parameters:
 # MKENUM_NAME -- output base name
@@ -12,9 +12,6 @@
 # EXTRA_DIST
 # MAINTAINERCLEANFILES
 
-# TODO: Detect
-GLIB_MKENUMS = glib-mkenums
-
 mkenum_built_sources = $(MKENUM_NAME).h $(MKENUM_NAME).c
 EXTRA_DIST += $(mkenum_built_sources)
 CLEANFILES += $(MKENUM_NAME).c.xgen $(MKENUM_NAME).h.xgen
diff --git a/utils/update-api-indices.py b/utils/update-api-indices.py
index 4bae1b5..bcfb61a 100755
--- a/utils/update-api-indices.py
+++ b/utils/update-api-indices.py
@@ -58,6 +58,9 @@ for subdir in subdirs:
             xmlid = re.sub(r'[^0-9a-z]+', '-', ind)
             name = 'new symbols in %s' % ind
             role = ' role="%s"' % ind
+        # XXX: In Fedora's gtk-doc 1.25-2 the index is not generated when
+        # there is any role set.  So do not use roles.
+        role = ''
         out.append(template % (xmlid, role, name, ind))
 
     text = file(docsfile).read()
diff --git a/utils/update-langs.py b/utils/update-langs.py
index d9a24d1..7b3b337 100755
--- a/utils/update-langs.py
+++ b/utils/update-langs.py
@@ -24,15 +24,16 @@ class Language:
 
 # The default language (English) must come first as it is treated specially
 languages = (
-    Language('en', 'en_US.UTF-8', 'English (US)'),
-    Language('cs', 'cs_CZ.UTF-8', 'Czech'),
-    Language('de', 'de_DE.UTF-8', 'German'),
+    Language('en',    'en_US.UTF-8', 'English (US)'),
+    Language('cs',    'cs_CZ.UTF-8', 'Czech'),
+    Language('de',    'de_DE.UTF-8', 'German'),
     Language('en_GB', 'en_GB.UTF-8', 'English (UK)'),
-    Language('fr', 'fr_FR.UTF-8', 'French'),
-    Language('it', 'it_IT.UTF-8', 'Italian'),
-    Language('ko', 'ko_KR.UTF-8', 'Korean'),
-    Language('ru', 'ru_RU.UTF-8', 'Russian'),
-    Language('es', 'es_ES.UTF-8', 'Spanish'),
+    Language('fr',    'fr_FR.UTF-8', 'French'),
+    Language('it',    'it_IT.UTF-8', 'Italian'),
+    Language('ko',    'ko_KR.UTF-8', 'Korean'),
+    Language('pt_BR', 'pt_BR.UTF-8', 'Portuguese (Brazilian)'),
+    Language('ru',    'ru_RU.UTF-8', 'Russian'),
+    Language('es',    'es_ES.UTF-8', 'Spanish'),
 )
 
 class Template:
diff --git a/utils/user-guide-modules b/utils/user-guide-modules
index 9a91454..4aa8656 100644
--- a/utils/user-guide-modules
+++ b/utils/user-guide-modules
@@ -35,6 +35,7 @@ crosscor	multidata	cross-correlation
 csmfile	managing-files
 curvature	leveling-and-background	curvature
 cwt	wavelet-transform	cwt
+dektakvca	managing-files
 dektakxml	managing-files
 deposit_synth	synthetic
 diff_synth	synthetic	diffusion-synthesis
@@ -64,6 +65,7 @@ fft_filter_2d	edit-extended	fft-filter-2d
 fft	fourier-transform
 fft_profile	fourier-transform
 fft_synth	synthetic	spectral-synthesis
+fibre_synth	synthetic	fibre-synthesis
 filter	filters	basic-filters
 fitsfile	managing-files
 fit-shape	xyz-data-processing	fit-shape
@@ -83,17 +85,18 @@ grain_stat	grain-analysis
 grain_wshed	grain-analysis	grain-watershed
 graph_align	graph-processing	graph-align
 graph_cd	graph-processing	graph-critical-dimension
-graph_cut	graph-processing
+graph_cut	graph-processing	graph-cut
 graph_dos_spectrum	graph-processing	graph-dos-spectrum
-graph_export_ascii	graph-processing
-graph_export_bitmap	graph-processing
-graph_export_vector	graph-processing
+graph_export_ascii	graph-processing	graph-export
+graph_export_bitmap	graph-processing	graph-export
+graph_export_vector	graph-processing	graph-export
 graph_fdfit	graph-processing
 graph_filter	graph-processing
 graph_fit	graph-processing	graph-fit
 graph_level	graph-processing	graph-level
 graph_logscale	graph-processing	graph-logscale
 graph_peaks	graph-processing	graph-peaks
+graph_stats	graph-processing	graph-stats
 gsffile	gsf
 gwyfile	managing-files
 gxyzffile	managing-files
@@ -136,6 +139,7 @@ mask_distribute	masks	mask-distribute
 maskedit	masks	mask-editor
 mask_edt	masks	mask-edt
 mask_morph	masks	maskmorph
+mask_noisify	masks	mask-noisify
 maskops	masks	maskops
 matfile	managing-files
 mcrop	multidata	mutual-crop
@@ -143,6 +147,11 @@ measure_lattice	statistical-analysis	measure-lattice
 median-bg	leveling-and-background	median-level
 merge	multidata	merge
 metropro	managing-files
+mfm_current	mfm	mfm-field-simulation
+mfm_field	mfm	mfm-field-simulation
+mfm_findshift	mfm	mfm-field-simulation
+mfm_parallel	mfm	mfm-field-simulation
+mfm_shift	mfm	mfm-field-simulation
 microprof	managing-files
 miffile	managing-files
 mifile	managing-files
@@ -178,6 +187,7 @@ outliers	editing-correction	mask-of-outliers
 pathlevel	editing-correction	path-level
 path	selections
 pat_synth	synthetic	pattern-synthesis
+phase_synth	synthetic	phases-synthesis
 pixmap	specific-data-import	pixmap-file-import
 pltfile	managing-files
 plugin-proxy	plugins
@@ -189,6 +199,8 @@ presentationops	presentations	presentationops
 princetonspe	managing-files
 profile	basic-operations	profile
 psdf_logphi	fourier-transform	psdf-log-phi
+psf-fit	mfm	mfm-resolution-transfer
+psf	mfm	mfm-resolution-transfer
 psia	managing-files
 pt3file	managing-files
 pygwy	pygwy
@@ -231,6 +243,7 @@ spml	managing-files
 spmxfile	managing-files
 spotremove	editing-correction	remove-spots
 stats	statistical-analysis	stat-quantities
+stitch	multidata	stitch
 stmprg	managing-files
 stpfile	managing-files
 straighten_path	edit-extended	straighten-path
@@ -251,7 +264,9 @@ volume_invert	volume-data-processing	volume-invert
 volume_kmeans	volume-data-processing	volume-clustering
 volume_kmedians	volume-data-processing	volume-clustering
 volume_linestat	volume-data-processing	volume-linestat
+volumeops	volume-data-processing	basic-volume-operations
 volume_slice	volume-data-processing	volume-slice
+volume_swaxes	volume-data-processing	volume-swap-axes
 volume_zcal	volume-data-processing	volume-zcalibration
 volumize	basic-operations	volumize
 volumize_layers	basic-operations	volumize-layers
@@ -269,5 +284,6 @@ xyzexport	managing-files
 xyzize	basic-operations	xyzize
 xyz_level	xyz-data-processing	xyz-level
 xyz_raster	xyz-data-processing	xyz-rasterize
+zeisslsm	managing-files
 zeiss	managing-files
 zemax	managing-files

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/gwyddion.git



More information about the debian-med-commit mailing list